From 2962d0143297445cc7f56145f1c52591ed109d76 Mon Sep 17 00:00:00 2001 From: Attila Date: Wed, 20 Feb 2019 13:37:46 +0100 Subject: [PATCH 001/534] New type of change in pull request template: small change I sometimes correct typos and misspellings. I thought this type could would fit for this. This type could represent changes not in the actual codebase, rather changes in the comments, printed text, documentation, etc. --- PULL_REQUEST_TEMPLATE.md | 1 + 1 file changed, 1 insertion(+) diff --git a/PULL_REQUEST_TEMPLATE.md b/PULL_REQUEST_TEMPLATE.md index 8e4d37045..abe0645b8 100644 --- a/PULL_REQUEST_TEMPLATE.md +++ b/PULL_REQUEST_TEMPLATE.md @@ -6,6 +6,7 @@ Fixes #\[issue] ## Type of change +* [ ] Small/tiny change (typo, spelling, comment, etc.) * [ ] Bug fix (change which fixes an issue) * [ ] New feature (change which adds functionality) * [ ] New Server (new server added) From 22d97c4b4122ddbacc45c56e5b3cd24ca8a3c0ba Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Fri, 1 Mar 2019 22:21:44 +0000 Subject: [PATCH 002/534] re-word the type of change --- PULL_REQUEST_TEMPLATE.md | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/PULL_REQUEST_TEMPLATE.md b/PULL_REQUEST_TEMPLATE.md index abe0645b8..d04485f45 100644 --- a/PULL_REQUEST_TEMPLATE.md +++ b/PULL_REQUEST_TEMPLATE.md @@ -6,12 +6,11 @@ Fixes #\[issue] ## Type of change -* [ ] Small/tiny change (typo, spelling, comment, etc.) * [ ] Bug fix (change which fixes an issue) * [ ] New feature (change which adds functionality) * [ ] New Server (new server added) * [ ] Refactor (restructures existing code) -* [ ] This change requires a documentation update +* [ ] Comment update (typo, spelling, etc) ## Checklist From f275d3a67ee38603e8feb7c577d04ac4f5f4a9d6 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Sun, 3 Mar 2019 16:06:17 +0000 Subject: [PATCH 003/534] fix(kfserver): add missing dir variables (#2219) --- lgsm/config-default/config-lgsm/kfserver/_default.cfg | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/lgsm/config-default/config-lgsm/kfserver/_default.cfg b/lgsm/config-default/config-lgsm/kfserver/_default.cfg index 3d9a1cf76..25b828a1b 100644 --- a/lgsm/config-default/config-lgsm/kfserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/kfserver/_default.cfg @@ -13,8 +13,8 @@ steamuser="username" steampass='password' ## Server Start Settings | https://docs.linuxgsm.com/configuration/start-parameters -defaultmap="KF-BioticsLab.rom" ip="0.0.0.0" +defaultmap="KF-BioticsLab.rom" ## Server Start Command | https://docs.linuxgsm.com/configuration/start-parameters#additional-parameters fn_parms(){ @@ -108,6 +108,7 @@ engine="unreal2" # Edit with care ## Server Specific Directories +serverfiles="${rootdir}/serverfiles" systemdir="${serverfiles}/System" executabledir="${systemdir}" executable="./ucc-bin" @@ -134,3 +135,4 @@ postdetailslog="${lgsmlogdir}/${servicename}-postdetails.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" From 3f31260bf86cc9ffa892168425ef3c1be07a74d1 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Fri, 8 Mar 2019 23:00:36 +0000 Subject: [PATCH 004/534] full stop --- lgsm/functions/command_monitor.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lgsm/functions/command_monitor.sh b/lgsm/functions/command_monitor.sh index 334ef73f9..c5a2b31c8 100644 --- a/lgsm/functions/command_monitor.sh +++ b/lgsm/functions/command_monitor.sh @@ -186,7 +186,7 @@ info_parms.sh fn_monitor_check_lockfile fn_monitor_check_update fn_monitor_check_session -# Query has to be enabled in Starbound config +# Query has to be enabled in Starbound config. if [ "${shortname}" == "sb" ]; then if [ "${queryenabled}" == "true" ]; then fn_monitor_query From cfe0bd83c85a385f0cb4a5b1f29082812da01cca Mon Sep 17 00:00:00 2001 From: Kenny Lindelof Date: Fri, 22 Mar 2019 08:10:28 -0400 Subject: [PATCH 005/534] corrected the documentation link --- 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 36e15391c..19fc1b464 100644 --- a/lgsm/functions/command_fastdl.sh +++ b/lgsm/functions/command_fastdl.sh @@ -31,7 +31,7 @@ fi # Header fn_print_header -echo "More info: https://git.io/vyk9a" +echo "More info: https://docs.linuxgsm.com/commands/fastdl" echo "" # Prompts user for FastDL creation settings From 80fbf5af8d726a7c3b93e90eb87cab847093fd36 Mon Sep 17 00:00:00 2001 From: Frisasky Date: Sun, 31 Mar 2019 14:40:22 +0800 Subject: [PATCH 006/534] fix cod2 --- lgsm/config-default/config-lgsm/cod2server/_default.cfg | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lgsm/config-default/config-lgsm/cod2server/_default.cfg b/lgsm/config-default/config-lgsm/cod2server/_default.cfg index c6a7c27f7..61b0a56e8 100644 --- a/lgsm/config-default/config-lgsm/cod2server/_default.cfg +++ b/lgsm/config-default/config-lgsm/cod2server/_default.cfg @@ -16,7 +16,7 @@ maxplayers="20" ## Server Start Command | https://docs.linuxgsm.com/configuration/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 ${maxplayers} +exec ${servercfg} +map ${defaultmap}" +parms="+set sv_punkbuster 0 +set fs_basepath ${serverfiles} +set dedicated 2 +set net_ip ${ip} +set net_port ${port} +set sv_maxclients ${maxplayers} +exec ${servercfg} +map ${defaultmap}" } #### LinuxGSM Settings #### From 5831bd3e0a160fa330d37482dd249ce327af900c Mon Sep 17 00:00:00 2001 From: Frisasky Date: Sun, 31 Mar 2019 14:40:46 +0800 Subject: [PATCH 007/534] fix cod4 --- lgsm/config-default/config-lgsm/cod4server/_default.cfg | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lgsm/config-default/config-lgsm/cod4server/_default.cfg b/lgsm/config-default/config-lgsm/cod4server/_default.cfg index b87a8ef76..a46248950 100644 --- a/lgsm/config-default/config-lgsm/cod4server/_default.cfg +++ b/lgsm/config-default/config-lgsm/cod4server/_default.cfg @@ -16,7 +16,7 @@ maxplayers="32" ## Server Start Command | https://docs.linuxgsm.com/configuration/start-parameters#additional-parameters fn_parms(){ -parms="+set sv_punkbuster 0 +set fs_basepath ${serverfiles} +set fs_homepath ${serverfiles} +set sv_authorizemode "-1" +set dedicated 1 +set net_ip ${ip} +set net_port ${port} +set sv_maxclients ${maxplayers} +exec ${servercfg} +map ${defaultmap}" +parms="+set sv_punkbuster 0 +set fs_basepath ${serverfiles} +set fs_homepath ${serverfiles} +set sv_authorizemode "-1" +set dedicated 2 +set net_ip ${ip} +set net_port ${port} +set sv_maxclients ${maxplayers} +exec ${servercfg} +map ${defaultmap}" } #### LinuxGSM Settings #### From 6a509e1a32b48bedea45481d0a788fc770c5d3d8 Mon Sep 17 00:00:00 2001 From: Frisasky Date: Sun, 31 Mar 2019 14:40:57 +0800 Subject: [PATCH 008/534] fix cod --- lgsm/config-default/config-lgsm/codserver/_default.cfg | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lgsm/config-default/config-lgsm/codserver/_default.cfg b/lgsm/config-default/config-lgsm/codserver/_default.cfg index 5f1d480c2..67c6dc918 100644 --- a/lgsm/config-default/config-lgsm/codserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/codserver/_default.cfg @@ -16,7 +16,7 @@ maxplayers="20" ## Server Start Command | https://docs.linuxgsm.com/configuration/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 ${maxplayers} +exec ${servercfg} +map ${defaultmap}" +parms="+set sv_punkbuster 0 +set fs_basepath ${serverfiles} +set dedicated 2 +set net_ip ${ip} +set net_port ${port} +set sv_maxclients ${maxplayers} +exec ${servercfg} +map ${defaultmap}" } #### LinuxGSM Settings #### From 2dd606e0a221817ca266fd0c25619201178c3989 Mon Sep 17 00:00:00 2001 From: Frisasky Date: Sun, 31 Mar 2019 14:41:14 +0800 Subject: [PATCH 009/534] fix coduo --- lgsm/config-default/config-lgsm/coduoserver/_default.cfg | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lgsm/config-default/config-lgsm/coduoserver/_default.cfg b/lgsm/config-default/config-lgsm/coduoserver/_default.cfg index 9ed50228e..c61d3f96b 100644 --- a/lgsm/config-default/config-lgsm/coduoserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/coduoserver/_default.cfg @@ -16,7 +16,7 @@ maxplayers="20" ## Server Start Command | https://docs.linuxgsm.com/configuration/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 ${maxplayers} +exec ${servercfg} +map ${defaultmap}" +parms="+set sv_punkbuster 0 +set fs_basepath ${serverfiles} +set dedicated 2 +set net_ip ${ip} +set net_port ${port} +set sv_maxclients ${maxplayers} +exec ${servercfg} +map ${defaultmap}" } #### LinuxGSM Settings #### From fff52d90b918128a0169e4296a5a16be44b6a904 Mon Sep 17 00:00:00 2001 From: Frisasky Date: Sun, 31 Mar 2019 14:41:26 +0800 Subject: [PATCH 010/534] fix codwaw --- lgsm/config-default/config-lgsm/codwawserver/_default.cfg | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lgsm/config-default/config-lgsm/codwawserver/_default.cfg b/lgsm/config-default/config-lgsm/codwawserver/_default.cfg index 39d21e37e..4296b4b7c 100644 --- a/lgsm/config-default/config-lgsm/codwawserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/codwawserver/_default.cfg @@ -16,7 +16,7 @@ maxplayers="20" ## Server Start Command | https://docs.linuxgsm.com/configuration/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 ${maxplayers} +exec ${servercfg} +map ${defaultmap}" +parms="+set sv_punkbuster 0 +set fs_basepath ${serverfiles} +set dedicated 2 +set net_ip ${ip} +set net_port ${port} +set sv_maxclients ${maxplayers} +exec ${servercfg} +map ${defaultmap}" } #### LinuxGSM Settings #### From a79feaf34cbccfe515466aee29b18e5fe8509231 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Sun, 31 Mar 2019 23:39:00 +0100 Subject: [PATCH 011/534] feat(update): Update command refactor * Update update_factorio.sh * feat(core): add error eol message * fix(alert): resolve typo with script messages * fix(check): add debug to executable check * fix(general): correct commandname * fix(general): change to lowercase * fix(general): remove not required exitcodes * fix(general): remove not required exitcodes fix(general): remove not required exitcodes * fix(check): a minor refactor * feat(linuxgsm): Clear tmp directory added script log * feat(update: Factorio update now checks current build from executable * feat(update: Factorio update now checks current build from executable sqush * moved executable dir * feat(update): refactor of fctrserver updater * changed to directory squash * corrected build details in log file * corrected build details in log file * more changes to logging * altered log messages * Re-worded current>local latest>remote * Re-worded current>local latest>remote * corrected logging * corrected fn_script_log_fatal * altered message to error from fatal * improves messages * minor tidy * correct script log message * code tidy * feat(mumble): refactor mumble updater * feat(mtaserver): refactor mtaserver updater * feat(mcserver): refactor mcserver updater * feat(fctrserver): refactor fctrserver updater * tidy up script wording * corrected function name * bug fixes for mcserver updater * add sleep to allow mcserver time to generate log file * increase timer to 30 seconds * increased to 60 seconds * changed back to red * add check for log file delay to allow time to generate * further refactor improvements * mtaserver: curl now uses to get info from version.h * minor tidy * refactor ts3 updater * corrected server arch * refactor * refactor updaters * refactor updaters * removed app_info_print --- lgsm/functions/alert.sh | 18 +- lgsm/functions/check.sh | 2 +- lgsm/functions/check_executable.sh | 9 +- lgsm/functions/check_permissions.sh | 2 +- lgsm/functions/check_tmuxception.sh | 3 +- lgsm/functions/command_dev_query_raw.sh | 2 +- lgsm/functions/command_mods_remove.sh | 2 +- lgsm/functions/command_monitor.sh | 1 - lgsm/functions/command_postdetails.sh | 2 +- lgsm/functions/command_update_linuxgsm.sh | 2 +- lgsm/functions/command_wipe.sh | 2 +- lgsm/functions/core_dl.sh | 67 ++++-- lgsm/functions/core_exit.sh | 1 - lgsm/functions/core_messages.sh | 5 + lgsm/functions/fix.sh | 1 - lgsm/functions/fix_dst.sh | 2 +- lgsm/functions/fix_tf2.sh | 2 +- lgsm/functions/info_distro.sh | 2 +- lgsm/functions/info_messages.sh | 2 +- lgsm/functions/install_server_files.sh | 10 +- lgsm/functions/logs.sh | 2 +- lgsm/functions/mods_core.sh | 3 +- lgsm/functions/update_factorio.sh | 186 +++++++------- lgsm/functions/update_minecraft.sh | 231 +++++++++++------- lgsm/functions/update_mta.sh | 211 ++++++++++------ lgsm/functions/update_mumble.sh | 191 +++++++-------- lgsm/functions/update_steamcmd.sh | 281 ++++++++++------------ lgsm/functions/update_ts3.sh | 249 +++++++++++-------- linuxgsm.sh | 2 +- tests/tests_fctrserver.sh | 2 +- tests/tests_jc2server.sh | 2 +- tests/tests_ts3server.sh | 2 +- 32 files changed, 816 insertions(+), 683 deletions(-) diff --git a/lgsm/functions/alert.sh b/lgsm/functions/alert.sh index ceeed0304..508c704a6 100644 --- a/lgsm/functions/alert.sh +++ b/lgsm/functions/alert.sh @@ -106,10 +106,10 @@ elif [ "${postalert}" != "on" ]&&[ "${function_selfname}" == "command_test_alert fn_script_log_warn "More Info alerts not enabled" elif [ -z "${posttarget}" ]&&[ "${function_selfname}" == "command_test_alert.sh" ]; then fn_print_error_nl "posttarget not set" - fn_script_error_warn "posttarget not set" + fn_script_error "posttarget not set" elif [ -z "${postdays}" ]&&[ "${function_selfname}" == "command_test_alert.sh" ]; then fn_print_error_nl "postdays not set" - fn_script_error_warn "postdays not set" + fn_script_error "postdays not set" fi if [ "${discordalert}" == "on" ]&&[ -n "${discordalert}" ]; then @@ -120,7 +120,7 @@ elif [ "${discordalert}" != "on" ]&&[ "${function_selfname}" == "command_test_al elif [ -z "${discordtoken}" ]&&[ "${function_selfname}" == "command_test_alert.sh" ]; then fn_print_error_nl "Discord token not set" echo " * https://docs.linuxgsm.com/alerts/discord" - fn_script_error_warn "Discord token not set" + fn_script_error "Discord token not set" fi if [ "${emailalert}" == "on" ]&&[ -n "${email}" ]; then @@ -141,7 +141,7 @@ elif [ "${iftttalert}" != "on" ]&&[ "${function_selfname}" == "command_test_aler elif [ -z "${ifttttoken}" ]&&[ "${function_selfname}" == "command_test_alert.sh" ]; then fn_print_error_nl "IFTTT token not set" echo " * https://docs.linuxgsm.com/alerts/ifttt" - fn_script_error_warn "IFTTT token not set" + fn_script_error "IFTTT token not set" fi if [ "${mailgunalert}" == "on" ]&&[ -n "${mailgunalert}" ]; then @@ -152,7 +152,7 @@ elif [ "${mailgunalert}" != "on" ]&&[ "${function_selfname}" == "command_test_al elif [ -z "${mailguntoken}" ]&&[ "${function_selfname}" == "command_test_alert.sh" ]; then fn_print_error_nl "Mailgun token not set" echo " * https://docs.linuxgsm.com/alerts/mailgun" - fn_script_error_warn "Mailgun token not set" + fn_script_error "Mailgun token not set" fi if [ "${pushbulletalert}" == "on" ]&&[ -n "${pushbullettoken}" ]; then @@ -163,7 +163,7 @@ elif [ "${pushbulletalert}" != "on" ]&&[ "${function_selfname}" == "command_test elif [ -z "${pushbullettoken}" ]&&[ "${function_selfname}" == "command_test_alert.sh" ]; then fn_print_error_nl "Pushbullet token not set" echo " * https://docs.linuxgsm.com/alerts/pushbullet" - fn_script_error_warn "Pushbullet token not set" + fn_script_error "Pushbullet token not set" fi if [ "${pushoveralert}" == "on" ]&&[ -n "${pushoveralert}" ]; then @@ -174,7 +174,7 @@ elif [ "${pushoveralert}" != "on" ]&&[ "${function_selfname}" == "command_test_a elif [ -z "${pushovertoken}" ]&&[ "${function_selfname}" == "command_test_alert.sh" ]; then fn_print_error_nl "Pushover token not set" echo " * https://docs.linuxgsm.com/alerts/pushover" - fn_script_error_warn "Pushover token not set" + fn_script_error "Pushover token not set" fi if [ "${telegramalert}" == "on" ]&&[ -n "${telegramtoken}" ]; then @@ -185,9 +185,9 @@ elif [ "${telegramalert}" != "on" ]&&[ "${function_selfname}" == "command_test_a elif [ -z "${telegramtoken}" ]&&[ "${function_selfname}" == "command_test_alert.sh" ]; then fn_print_error_nl "Telegram token not set." echo " * https://docs.linuxgsm.com/alerts/telegram" - fn_script_error_warn "Telegram token not set." + fn_script_error "Telegram token not set." elif [ -z "${telegramchatid}" ]&&[ "${function_selfname}" == "command_test_alert.sh" ]; then fn_print_error_nl "Telegram chat id not set." echo " * https://docs.linuxgsm.com/alerts/telegram" - fn_script_error_warn "Telegram chat id not set." + fn_script_error "Telegram chat id not set." fi \ No newline at end of file diff --git a/lgsm/functions/check.sh b/lgsm/functions/check.sh index 99c8890e5..0a1768884 100644 --- a/lgsm/functions/check.sh +++ b/lgsm/functions/check.sh @@ -26,7 +26,7 @@ if [ "${function_selfname}" != "command_install.sh" ]&&[ "${function_selfname}" check_system_dir.sh fi -local allowed_commands_array=( command_start.sh ) +local allowed_commands_array=( command_start.sh command_debug.sh ) for allowed_command in "${allowed_commands_array[@]}" do if [ "${allowed_command}" == "${function_selfname}" ]; then diff --git a/lgsm/functions/check_executable.sh b/lgsm/functions/check_executable.sh index db9ca411a..7aedced1e 100644 --- a/lgsm/functions/check_executable.sh +++ b/lgsm/functions/check_executable.sh @@ -2,18 +2,17 @@ # LinuxGSM check_executable.sh function # Author: Daniel Gibbs # Website: https://linuxgsm.com -# Description: Checks if executable exists. +# Description: Checks if server executable exists. 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 "Executable was not found: ${executabledir}/${execname}" + fn_print_fatal_nl "executable was not found:" + echo " * ${executabledir}/${execname}" if [ -d "${lgsmlogdir}" ]; then - fn_print_fail_nl "Executable was not found:" - echo " * ${executabledir}/${execname}" + fn_script_log_fatal "Executable was not found: ${executabledir}/${execname}" fi - exitcode="1" core_exit.sh fi diff --git a/lgsm/functions/check_permissions.sh b/lgsm/functions/check_permissions.sh index 7185f070b..f1bca798d 100644 --- a/lgsm/functions/check_permissions.sh +++ b/lgsm/functions/check_permissions.sh @@ -78,7 +78,7 @@ fn_check_permissions(){ # Grab the first and second digit for user and group permission userrootdirperm="${rootdirperm:0:1}" grouprootdirperm="${rootdirperm:1:1}" - if [ "${userrootdirperm}" != "7" ] && [ "${grouprootdirperm}" != "7" ]; then + if [ "${userrootdirperm}" != "7" ]&&[ "${grouprootdirperm}" != "7" ]; then fn_print_fail_nl "Permissions issues found" fn_script_log_fatal "Permissions issues found" fn_print_information_nl "The following directory does not have the correct permissions:" diff --git a/lgsm/functions/check_tmuxception.sh b/lgsm/functions/check_tmuxception.sh index 345083712..1a13bef9c 100644 --- a/lgsm/functions/check_tmuxception.sh +++ b/lgsm/functions/check_tmuxception.sh @@ -5,7 +5,7 @@ # Website: https://linuxgsm.com # Description: Checks if run from tmux or screen -local commandname="check" +local commandname="CHECK" fn_check_is_in_tmux(){ if [ -n "${TMUX}" ]; then @@ -17,6 +17,7 @@ fn_check_is_in_tmux(){ core_exit.sh fi } + 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." diff --git a/lgsm/functions/command_dev_query_raw.sh b/lgsm/functions/command_dev_query_raw.sh index 30db99ea5..2b9267501 100644 --- a/lgsm/functions/command_dev_query_raw.sh +++ b/lgsm/functions/command_dev_query_raw.sh @@ -5,7 +5,7 @@ # Description: Raw gamedig output of the server. local commandname="QUERY-RAW" -local commandaction="QUERY-RAW" +local commandaction="Query Raw" local function_selfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" echo "=================================" diff --git a/lgsm/functions/command_mods_remove.sh b/lgsm/functions/command_mods_remove.sh index 4ecdacfed..7a0eb7dd2 100644 --- a/lgsm/functions/command_mods_remove.sh +++ b/lgsm/functions/command_mods_remove.sh @@ -6,7 +6,7 @@ # Description: Uninstall mods along with mods_list.sh and mods_core.sh. local commandname="MODS" -local commandaction="addons/mods" +local commandaction="Mods Remove" local function_selfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" check.sh diff --git a/lgsm/functions/command_monitor.sh b/lgsm/functions/command_monitor.sh index c5a2b31c8..3b36b3376 100644 --- a/lgsm/functions/command_monitor.sh +++ b/lgsm/functions/command_monitor.sh @@ -38,7 +38,6 @@ for queryattempt in {1..5}; do fn_print_ok "Querying port: ${querymethod}: ${ip}:${queryport} : ${totalseconds}/${queryattempt}: " fn_print_ok_eol_nl fn_script_log_pass "Querying port: ${querymethod}: ${ip}:${queryport} : ${queryattempt}: OK" - exitcode=0 monitorpass=1 core_exit.sh else diff --git a/lgsm/functions/command_postdetails.sh b/lgsm/functions/command_postdetails.sh index a4a0b96c4..660bb326f 100644 --- a/lgsm/functions/command_postdetails.sh +++ b/lgsm/functions/command_postdetails.sh @@ -5,7 +5,7 @@ # Website: https://linuxgsm.com # Description: Strips sensitive information out of Details output -local commandname="postdetails" +local commandname="POSTDETAILS" local commandaction="Postdetails" local function_selfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" diff --git a/lgsm/functions/command_update_linuxgsm.sh b/lgsm/functions/command_update_linuxgsm.sh index 25b028ef7..c4c49aee5 100644 --- a/lgsm/functions/command_update_linuxgsm.sh +++ b/lgsm/functions/command_update_linuxgsm.sh @@ -4,7 +4,7 @@ # Website: https://linuxgsm.com # Description: Deletes the functions dir to allow re-downloading of functions from GitHub. -local commandname="UPDATE LinuxGSM" +local commandname="UPDATE LINUXGSM" local commandaction="Update LinuxGSM" local function_selfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" diff --git a/lgsm/functions/command_wipe.sh b/lgsm/functions/command_wipe.sh index b476f4da3..fdcbe424d 100644 --- a/lgsm/functions/command_wipe.sh +++ b/lgsm/functions/command_wipe.sh @@ -6,7 +6,7 @@ # Description: Wipes server data, useful after updates for some games like Rust local commandname="WIPE" -local commandaction="data wipe" +local commandaction="Wipe" local function_selfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" check.sh diff --git a/lgsm/functions/core_dl.sh b/lgsm/functions/core_dl.sh index ad5de35ee..838867f0f 100644 --- a/lgsm/functions/core_dl.sh +++ b/lgsm/functions/core_dl.sh @@ -21,8 +21,24 @@ local commandname="DOWNLOAD" local commandaction="Download" local function_selfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" +# Emptys contents of the LinuxGSM tmpdir. +fn_clear_tmp(){ + echo -en "clearing LinuxGSM tmp directory..." + if [ -d "${tmpdir}" ]; then + rm -rf "${tmpdir}/"* + local exitcode=$? + if [ ${exitcode} -eq 0 ]; then + fn_print_ok_eol_nl + fn_script_log_pass "clearing LinuxGSM tmp directory" + else + fn_print_error_eol_nl + fn_script_log_error "clearing LinuxGSM tmp directory" + fi + fi +} + fn_dl_md5(){ - # Runs MD5 Check if available + # Runs MD5 Check if available. if [ "${md5}" != "0" ]&&[ "${md5}" != "nomd5" ]; then echo -en "verifying ${local_filename} with MD5..." sleep 0.5 @@ -31,20 +47,20 @@ fn_dl_md5(){ fn_print_fail_eol_nl echo "${local_filename} returned MD5 checksum: ${md5sumcmd}" echo "expected MD5 checksum: ${md5}" - fn_script_log_fatal "Verifying ${local_filename} with MD5: FAIL" + fn_script_log_fatal "Verifying ${local_filename} with MD5" 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 ${local_filename} with MD5: OK" + fn_script_log_pass "Verifying ${local_filename} with MD5" fn_script_log_info "${local_filename} returned MD5 checksum: ${md5sumcmd}" fn_script_log_info "Expected MD5 checksum: ${md5}" fi fi } -# Extracts bzip2, gzip or zip files +# Extracts bzip2, gzip or zip files. # Extracts can be defined in code like so: # fn_dl_extract "${local_filedir}" "${local_filename}" "${extractdir}" # fn_dl_extract "/home/gameserver/lgsm/tmp" "file.tar.bz2" "/home/gamserver/serverfiles" @@ -52,7 +68,7 @@ fn_dl_extract(){ local_filedir="${1}" local_filename="${2}" extractdir="${3}" - # extracts archives + # Extracts archives. echo -en "extracting ${local_filename}..." mime=$(file -b --mime-type "${local_filedir}/${local_filename}") if [ ! -d "${extractdir}" ]; then @@ -70,7 +86,7 @@ fn_dl_extract(){ local exitcode=$? if [ ${exitcode} -ne 0 ]; then fn_print_fail_eol_nl - fn_script_log_fatal "Extracting download: FAIL" + fn_script_log_fatal "Extracting download" if [ -f "${lgsmlog}" ]; then echo "${extractcmd}" >> "${lgsmlog}" fi @@ -78,11 +94,11 @@ fn_dl_extract(){ core_exit.sh else fn_print_ok_eol_nl - fn_script_log_pass "Extracting download: OK" + fn_script_log_pass "Extracting download" fi } -# Trap to remove file download if canceled before completed +# Trap to remove file download if canceled before completed. fn_fetch_trap(){ echo "" echo -en "downloading ${local_filename}..." @@ -105,19 +121,20 @@ fn_fetch_file(){ forcedl="${6:-0}" md5="${7:-0}" - # Download file if missing or download forced + # Download file if missing or download forced. if [ ! -f "${local_filedir}/${local_filename}" ]||[ "${forcedl}" == "forcedl" ]; then if [ ! -d "${local_filedir}" ]; then mkdir -p "${local_filedir}" fi - # Trap will remove part downloaded files if canceled + # Trap will remove part downloaded files if canceled. trap fn_fetch_trap INT - # larger files show a progress bar + # Larger files show a progress bar. if [ "${local_filename##*.}" == "bz2" ]||[ "${local_filename##*.}" == "gz" ]||[ "${local_filename##*.}" == "zip" ]||[ "${local_filename##*.}" == "jar" ]||[ "${local_filename##*.}" == "xz" ]; then echo -en "downloading ${local_filename}..." sleep 0.5 - echo -en "downloading ${local_filename}..." + echo -en "\033[1K" curlcmd=$(${curlpath} --progress-bar --fail -L -o "${local_filedir}/${local_filename}" "${remote_fileurl}") + echo -en "downloading ${local_filename}..." else echo -en " fetching ${local_filename}...\c" curlcmd=$(${curlpath} -s --fail -L -o "${local_filedir}/${local_filename}" "${remote_fileurl}" 2>&1) @@ -126,7 +143,7 @@ fn_fetch_file(){ if [ ${exitcode} -ne 0 ]; then fn_print_fail_eol_nl if [ -f "${lgsmlog}" ]; then - fn_script_log_fatal "Downloading ${local_filename}: FAIL" + fn_script_log_fatal "Downloading ${local_filename}" echo -e "${remote_fileurl}" >> "${lgsmlog}" echo "${curlcmd}" >> "${lgsmlog}" fi @@ -136,12 +153,12 @@ fn_fetch_file(){ else fn_print_ok_eol_nl if [ -f "${lgsmlog}" ]; then - fn_script_log_pass "Downloading ${local_filename}: OK" + fn_script_log_pass "Downloading ${local_filename}" fi fi - # Remove trap + # Remove trap. trap - INT - # Make file executable if chmodx is set + # Make file executable if chmodx is set. if [ "${chmodx}" == "chmodx" ]; then chmod +x "${local_filedir}/${local_filename}" fi @@ -149,15 +166,15 @@ fn_fetch_file(){ if [ -f "${local_filedir}/${local_filename}" ]; then fn_dl_md5 - # Execute file if run is set + # Execute file if run is set. if [ "${run}" == "run" ]; then source "${local_filedir}/${local_filename}" fi fi } -# GitHub file download functions -# Used to simplify downloading specific files from GitHub +# GitHub file download functions. +# Used to simplify downloading specific files from GitHub. # 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 @@ -171,7 +188,7 @@ fn_fetch_file(){ # forcedl: Optional, force re-download of file even if exists # md5: Optional, set an md5 sum and will compare it against the file. -# Fetches any 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}" @@ -184,7 +201,7 @@ fn_fetch_file_github(){ run="${5:-0}" forcedl="${6:-0}" md5="${7:-0}" - # Passes vars to the file download function + # Passes vars to the file download function. fn_fetch_file "${remote_fileurl}" "${local_filedir}" "${local_filename}" "${chmodx}" "${run}" "${forcedl}" "${md5}" } @@ -200,11 +217,11 @@ fn_fetch_config(){ run="norun" forcedl="noforce" md5="nomd5" - # Passes vars to the file download function + # Passes vars to the file download function. fn_fetch_file "${remote_fileurl}" "${local_filedir}" "${local_filename}" "${chmodx}" "${run}" "${forcedl}" "${md5}" } -# Fetches functions +# Fetches functions. fn_fetch_function(){ github_file_url_dir="lgsm/functions" github_file_url_name="${functionfile}" @@ -217,7 +234,7 @@ fn_fetch_function(){ run="run" forcedl="noforce" md5="nomd5" - # Passes vars to the file download function + # Passes vars to the file download function. fn_fetch_file "${remote_fileurl}" "${local_filedir}" "${local_filename}" "${chmodx}" "${run}" "${forcedl}" "${md5}" } @@ -237,7 +254,7 @@ fn_update_function(){ fn_fetch_file "${remote_fileurl}" "${local_filedir}" "${local_filename}" "${chmodx}" "${run}" "${forcedl}" "${md5}" } -# Defines curl path +# Defines curl path. curlpath=$(command -v curl 2>/dev/null) if [ "$(basename "${curlpath}")" != "curl" ]; then diff --git a/lgsm/functions/core_exit.sh b/lgsm/functions/core_exit.sh index 91142aaa8..f92d3b129 100644 --- a/lgsm/functions/core_exit.sh +++ b/lgsm/functions/core_exit.sh @@ -37,7 +37,6 @@ elif [ -n "${exitcode}" ]&&[ "${exitcode}" != "0" ]; then trap - INT exit "${exitcode}" else - exitcode=0 fn_script_log_pass "${function_selfname} exiting with code: ${exitcode}" fn_exit_dev_debug # remove trap. diff --git a/lgsm/functions/core_messages.sh b/lgsm/functions/core_messages.sh index 075721999..74ae8cf5d 100644 --- a/lgsm/functions/core_messages.sh +++ b/lgsm/functions/core_messages.sh @@ -318,6 +318,11 @@ fn_print_fail_eol_nl(){ echo -e "${red}FAIL${default}" } +# ERROR +fn_print_error_eol(){ + echo -en "${red}ERROR${default}" +} + # WARN fn_print_warn_eol(){ echo -en "${red}WARN${default}" diff --git a/lgsm/functions/fix.sh b/lgsm/functions/fix.sh index c58e1e2d0..6785306f3 100644 --- a/lgsm/functions/fix.sh +++ b/lgsm/functions/fix.sh @@ -29,7 +29,6 @@ fn_fix_msg_end(){ if [ $? -ne 0 ]; then fn_print_error_nl "Applying ${fixname} fix: ${gamename}" fn_script_log_error "Applying ${fixname} fix: ${gamename}" - exitcode=2 else fn_print_ok_nl "Applying ${fixname} fix: ${gamename}" fn_script_log_pass "Applying ${fixname} fix: ${gamename}" diff --git a/lgsm/functions/fix_dst.sh b/lgsm/functions/fix_dst.sh index 80c397442..24debfc9e 100644 --- a/lgsm/functions/fix_dst.sh +++ b/lgsm/functions/fix_dst.sh @@ -10,7 +10,7 @@ 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 "${serverfiles}/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" "${serverfiles}/bin/lib32/libcurl-gnutls.so.4" diff --git a/lgsm/functions/fix_tf2.sh b/lgsm/functions/fix_tf2.sh index 766fc8bfa..df161a1b5 100644 --- a/lgsm/functions/fix_tf2.sh +++ b/lgsm/functions/fix_tf2.sh @@ -9,7 +9,7 @@ local commandaction="Fix" local function_selfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" # Fixes: Team Fortress 2 Segmentation fault for Red-Hat Distros #2062. -if [ -f "/etc/redhat-release" ] && [ ! -f "${serverfiles}/bin/libcurl-gnutls.so.4" ]; then +if [ -f "/etc/redhat-release" ]&&[ ! -f "${serverfiles}/bin/libcurl-gnutls.so.4" ]; then fixname="libcurl-gnutls.so.4 missing" fn_fix_msg_start ln -s "/usr/lib/libcurl.so.4" "${serverfiles}/bin/libcurl-gnutls.so.4" diff --git a/lgsm/functions/info_distro.sh b/lgsm/functions/info_distro.sh index 60795d56c..11ab3149d 100644 --- a/lgsm/functions/info_distro.sh +++ b/lgsm/functions/info_distro.sh @@ -224,7 +224,7 @@ fi # Steam Master Server - checks if detected by master server if [ ! "$(command -v jq 2>/dev/null)" ]; then - if [ "${ip}" ] && [ "${port}" ]; then + if [ "${ip}" ]&&[ "${port}" ]; then if [ "${engine}" == "source" ]||[ "${engine}" == "goldsource" ]||[ "${shortname}" == "jc2" ]||[ "${shortname}" == "ql" ]; then masterserver=$(${curlpath} -s 'https://api.steampowered.com/ISteamApps/GetServersAtAddress/v0001?addr='${ip}':'${port}'&format=json' | jq '.response.servers[]|.addr' | wc -l) if [ "${steammaster}" == "1" ]; then diff --git a/lgsm/functions/info_messages.sh b/lgsm/functions/info_messages.sh index f9371cf65..5080334dc 100644 --- a/lgsm/functions/info_messages.sh +++ b/lgsm/functions/info_messages.sh @@ -1059,7 +1059,7 @@ fn_info_message_unreal(){ if [ "${engine}" == "unreal" ]; then echo -e "< UdpLink Port (random)\tOUTBOUND\t${udplinkport}+\tudp" fi - if [ "${engine}" != "unreal" ] && [ "${appid}" != "223250" ]; then + if [ "${engine}" != "unreal" ]&&[ "${appid}" != "223250" ]; then echo -e "> GameSpy query\tINBOUND\t${gsqueryport}\tudp\tOldQueryPortNumber=${gsqueryport}" fi if [ "${appid}" == "215360" ]; then diff --git a/lgsm/functions/install_server_files.sh b/lgsm/functions/install_server_files.sh index f4f2d5760..95e8f0c5f 100644 --- a/lgsm/functions/install_server_files.sh +++ b/lgsm/functions/install_server_files.sh @@ -90,7 +90,7 @@ fn_install_server_files_steamcmd(){ if [ "${counter}" -le "4" ]; then if [ "${appid}" == "90" ]; then - ${unbuffer} ./steamcmd.sh +login "${steamuser}" "${steampass}" +force_install_dir "${serverfiles}" +app_info_print 70 +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 "${serverfiles}" +app_update "${appid}" ${branch} +quit @@ -98,7 +98,7 @@ 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_info_print 70 +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 @@ -119,7 +119,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 "${serverfiles}" +app_info_print 70 +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 @@ -144,8 +144,8 @@ elif [ "${shortname}" == "mumble" ]; then elif [ "${shortname}" == "mta" ]; then update_mta.sh elif [ "${shortname}" == "fctr" ]; then - update_factorio.sh - install_factorio_save.sh + update_factorio.sh + install_factorio_save.sh elif [ -z "${appid}" ]||[ "${shortname}" == "ges" ]||[ "${shortname}" == "bd" ]||[ "${shortname}" == "bb" ]||[ "${shortname}" == "ns" ]||[ "${shortname}" == "vs" ]; then if [ "${shortname}" == "ut" ]; then install_unreal_tournament_eula.sh diff --git a/lgsm/functions/logs.sh b/lgsm/functions/logs.sh index 4f8aaf015..69dbc7deb 100644 --- a/lgsm/functions/logs.sh +++ b/lgsm/functions/logs.sh @@ -17,7 +17,7 @@ fi # For games not displaying a console, and having logs into their game directory check_status.sh -if [ "${status}" != "0" ] && [ "${function_selfname}" == "command_start.sh" ] && [ -n "${gamelogfile}" ]; then +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}" diff --git a/lgsm/functions/mods_core.sh b/lgsm/functions/mods_core.sh index 8690b3b19..cf2178b3c 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="addons/mods" +local commandaction="Mods" local function_selfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" # Files and Directories @@ -179,7 +179,6 @@ fn_mod_get_info(){ 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 } diff --git a/lgsm/functions/update_factorio.sh b/lgsm/functions/update_factorio.sh index a1aa9653d..d01013224 100644 --- a/lgsm/functions/update_factorio.sh +++ b/lgsm/functions/update_factorio.sh @@ -1,7 +1,6 @@ #!/bin/bash # LinuxGSM update_factorio.sh function # Author: Daniel Gibbs -# Contributor: Kristian Polso # Website: https://linuxgsm.com # Description: Handles updating of Factorio servers. @@ -10,121 +9,115 @@ local commandaction="Update" local function_selfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" fn_update_factorio_dl(){ - fn_fetch_file "https://factorio.com/get-download/${downloadbranch}/headless/${factorioarch}" "${tmpdir}" "factorio_headless_${factorioarch}-${availablebuild}.tar.xz" - fn_dl_extract "${tmpdir}" "factorio_headless_${factorioarch}-${availablebuild}.tar.xz" "${tmpdir}" + fn_fetch_file "https://factorio.com/get-download/${downloadbranch}/headless/${factorioarch}" "${tmpdir}" "factorio_headless_${factorioarch}-${remotebuild}.tar.xz" + fn_dl_extract "${tmpdir}" "factorio_headless_${factorioarch}-${remotebuild}.tar.xz" "${tmpdir}" 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 + fn_script_log_pass "Copying to ${serverfiles}" + fn_clear_tmp else fn_print_fail_eol_nl + fn_script_log_fatal "Copying to ${serverfiles}" + core_exit.sh fi } -fn_update_factorio_currentbuild(){ - # Get current build info. - # If log file is missing, the server will restart to generate logs. - - if [ -f "${serverfiles}/factorio-current.log" ]; then - currentbuild=$(grep "Loading mod base" "${serverfiles}/factorio-current.log" 2> /dev/null | awk '{print $5}' | tail -1) +fn_update_factorio_localbuild(){ + # Gets local build info. + fn_print_dots "Checking for update: ${remotelocation}: checking local build" + sleep 0.5 + # Uses executable to find local build. + cd "${executabledir}" || exit + if [ -f "${executable}" ]; then + localbuild=$(${executable} --version | grep "Version:" | awk '{print $2}') + fn_print_ok "Checking for update: ${remotelocation}: checking local build" + fn_script_log_pass "Checking local build" + else + localbuild="0" + fn_print_error "Checking for update: ${remotelocation}: checking local build" + fn_script_log_error "Checking local build" fi + sleep 0.5 +} - if [ -z "${currentbuild}" ]; then - fn_print_error "Checking for update: factorio.com" - sleep 0.5 - if [ ! -f "${serverfiles}/factorio-current.log" ]; then - 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" - elif [ -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" - fi - sleep 0.5 - 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_update_factorio_remotebuild(){ + # Gets remote build info. + remotebuild=$(${curlpath} -s "https://factorio.com/get-download/${downloadbranch}/headless/${factorioarch}" | grep -o '[0-9]\.[0-9]\{1,\}\.[0-9]\{1,\}' | head -1) + if [ "${installer}" != "1" ]; then + fn_print_dots "Checking for update: ${remotelocation}: checking remote build" sleep 0.5 - exitbypass=1 - command_stop.sh - exitbypass=1 - command_start.sh - sleep 0.5 - - # Check again and exit if failure. - if [ -f "${serverfiles}/factorio-current.log" ]; then - currentbuild=$(grep "Loading mod base" "${serverfiles}/factorio-current.log" 2> /dev/null | awk '{print $5}' | tail -1) - fi - - if [ ! -f "${serverfiles}/factorio-current.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 - elif [ -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" + # Checks if remotebuild variable has been set. + if [ -z "${remotebuild}" ]||[ "${remotebuild}" == "null" ]; then + fn_print_fail "Checking for update: ${remotelocation}: checking remote build" + fn_script_log_fatal "Checking remote build" core_exit.sh + else + fn_print_ok "Checking for update: ${remotelocation}: checking remote build" + fn_script_log_pass "Checking remote build" + sleep 0.5 fi - fi -} - -fn_update_factorio_availablebuild(){ - # Gets latest build info. - availablebuild=$(${curlpath} -s https://factorio.com/get-download/${downloadbranch}/headless/${factorioarch} | grep -o '[0-9]\.[0-9]\{1,\}\.[0-9]\{1,\}' | head -1) - - # Checks if availablebuild variable has been set. - if [ -v "${availablebuild}" ]; then - fn_print_fail "Checking for update: factorio.com" - sleep 0.5 - 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" - sleep 0.5 - fi + # Checks if remotebuild variable has been set. + if [ -z "${remotebuild}" ]||[ "${remotebuild}" == "null" ]; then + fn_print_failure "Unable to get remote build" + fn_script_log_fatal "Unable to get remote build" + core_exit.sh + fi + fi } fn_update_factorio_compare(){ + fn_print_dots "Checking for update: ${remotelocation}" + sleep 0.5 # Removes dots so if statement 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:" + localbuilddigit=$(echo "${localbuild}" | tr -cd '[:digit:]') + remotebuilddigit=$(echo "${remotebuild}" | tr -cd '[:digit:]') + if [ "${localbuilddigit}" -ne "${remotebuilddigit}" ]||[ "${forceupdate}" == "1" ]; then + fn_print_ok_nl "Checking for update: ${remotelocation}" sleep 0.5 - echo -e " Current build: ${red}${currentbuild} ${factorioarch} ${branch} ${default}" - echo -e " Available build: ${green}${availablebuild} ${factorioarch} ${branch}${default}" - echo -e "" + echo -en "\n" + echo -e "Update available" + echo -e "* Local build: ${red}${localbuild} ${factorioarch}${default}" + echo -e "* Remote build: ${green}${remotebuild} ${factorioarch}${default}" + if [ -v "${branch}" ]; then + echo -e "* Branch: ${branch}" + fi + fn_script_log_info "Update available" + fn_script_log_info "Local build: ${localbuild} ${factorioarch}" + fn_script_log_info "Remote build: ${remotebuild} ${factorioarch}" + if [ -v "${branch}" ]; then + fn_script_log_info "Branch: ${branch}" + fi + fn_script_log_info "${localbuild} > ${remotebuild}" sleep 0.5 - echo -en "Applying update.\r" + echo -en "\n" + echo -en "applying update.\r" sleep 1 - echo -en "Applying update..\r" + echo -en "applying update..\r" sleep 1 - echo -en "Applying update...\r" + echo -en "applying update...\r" sleep 1 echo -en "\n" - fn_script_log "Update available" - fn_script_log "Current build: ${currentbuild} ${factorioarch}${branch}" - fn_script_log "Available build: ${availablebuild} ${factorioarch}${branch}" - fn_script_log "${currentbuild} > ${availablebuild}" unset updateonstart check_status.sh + # If server stopped. if [ "${status}" == "0" ]; then + exitbypass=1 fn_update_factorio_dl exitbypass=1 command_start.sh exitbypass=1 command_stop.sh + # If server started. else exitbypass=1 command_stop.sh + exitbypass=1 fn_update_factorio_dl exitbypass=1 command_start.sh @@ -132,18 +125,28 @@ fn_update_factorio_compare(){ alert="update" alert.sh else - echo -e "\n" - echo -e "No update available:" - echo -e " Current build: ${green}${currentbuild} ${factorioarch} ${branch}${default}" - echo -e " Available build: ${green}${availablebuild} ${factorioarch} ${branch}${default}" - echo -e "" - fn_print_ok_nl "No update available" - fn_script_log_info "Current build: ${currentbuild} ${factorioarch} ${branch}" - fn_script_log_info "Available build: ${availablebuild} ${factorioarch} ${branch}" + fn_print_ok_nl "Checking for update: ${remotelocation}" + sleep 0.5 + echo -en "\n" + echo -e "No update available" + echo -e "* Local build: ${green}${localbuild} ${factorioarch}${default}" + echo -e "* Remote build: ${green}${remotebuild} ${factorioarch}${default}" + if [ -v "${branch}" ]; then + echo -e "* Branch: ${branch}" + fi + fn_script_log_info "No update available" + fn_script_log_info "Local build: ${localbuild} ${factorioarch}" + fn_script_log_info "Remote build: ${remotebuild} ${factorioarch}" + if [ -v "${branch}" ]; then + fn_script_log_info "Branch: ${branch}" + fi fi } -# Factorio is linux64 only for now. +# The location where the builds are checked and downloaded. +remotelocation="mojang.com" + +# Game server architecture. factorioarch="linux64" if [ "${branch}" == "stable" ]; then @@ -153,14 +156,13 @@ elif [ "${branch}" == "experimental" ]; then fi if [ "${installer}" == "1" ]; then - fn_update_factorio_availablebuild + fn_update_factorio_remotebuild fn_update_factorio_dl else - # Checks for server update from factorio.com - fn_print_dots "Checking for update: factorio.com" - fn_script_log_info "Checking for update: factorio.com" + fn_print_dots "Checking for update: ${remotelocation}" + fn_script_log_info "Checking for update: ${remotelocation}" sleep 0.5 - fn_update_factorio_currentbuild - fn_update_factorio_availablebuild + fn_update_factorio_localbuild + fn_update_factorio_remotebuild fn_update_factorio_compare fi diff --git a/lgsm/functions/update_minecraft.sh b/lgsm/functions/update_minecraft.sh index 31c1f0a20..795d3fbfc 100644 --- a/lgsm/functions/update_minecraft.sh +++ b/lgsm/functions/update_minecraft.sh @@ -8,151 +8,200 @@ local commandname="UPDATE" local commandaction="Update" local function_selfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" -fn_update_dl(){ +fn_update_minecraft_dl(){ latestmcreleaselink=$(${curlpath} -s "https://launchermeta.mojang.com/mc/game/version_manifest.json" | jq -r '.latest.release as $latest | .versions[] | select(.id == $latest) | .url') latestmcbuildurl=$(${curlpath} -s "${latestmcreleaselink}" | jq -r '.downloads.server.url') - fn_fetch_file "${latestmcbuildurl}" "${tmpdir}" "minecraft_server.${availablebuild}.jar" + fn_fetch_file "${latestmcbuildurl}" "${tmpdir}" "minecraft_server.${remotebuild}.jar" echo -e "copying to ${serverfiles}...\c" - fn_script_log "Copying to ${serverfiles}" - cp "${tmpdir}/minecraft_server.${availablebuild}.jar" "${serverfiles}/minecraft_server.jar" + cp "${tmpdir}/minecraft_server.${remotebuild}.jar" "${serverfiles}/minecraft_server.jar" local exitcode=$? - chmod u+x "${serverfiles}/minecraft_server.jar" - if [ ${exitcode} -eq 0 ]; then + if [ "${exitcode}" == "0" ]; then fn_print_ok_eol_nl + fn_script_log_pass "Copying to ${serverfiles}" + chmod u+x "${serverfiles}/minecraft_server.jar" + fn_clear_tmp else fn_print_fail_eol_nl + fn_script_log_fatal "Copying to ${serverfiles}" + core_exit.sh fi } -fn_update_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: mojang.com" +fn_update_minecraft_localbuild(){ + # Gets local build info. + fn_print_dots "Checking for update: ${remotelocation}: checking local build" + sleep 0.5 + # Uses log file to gather info. + # Gives time for log file to generate. + if [ ! -f "${serverfiles}/logs/latest.log" ]; then + fn_print_error "Checking for update: ${remotelocation}: checking local build" sleep 0.5 - fn_print_error_nl "Checking for update: mojang.com: No logs with server version found" - fn_script_log_error "Checking for update: mojang.com: No logs with server version found" + fn_print_error_nl "Checking for update: ${remotelocation}: checking local build: no log files" + fn_script_log_error "No log file found" sleep 0.5 - fn_print_info_nl "Checking for update: mojang.com: Forcing server restart" - fn_script_log_info "Checking for update: mojang.com: Forcing server restart" + fn_print_info_nl "Checking for update: ${remotelocation}: checking local build: forcing server restart" + fn_script_log_info "Forcing server restart" sleep 0.5 exitbypass=1 command_stop.sh exitbypass=1 command_start.sh - sleep 0.5 - # Check again and exit on failure. - if [ ! -f "${consolelogdir}/${servicename}-console.log" ]; then - fn_print_fail_nl "Checking for update: mojang.com: Still No logs with server version found" - fn_script_log_fatal "Checking for update: mojang.com: Still No logs with server version found" - core_exit.sh - fi + totalseconds=0 + # Check again, allow time to generate logs. + while [ ! -f "${serverfiles}/logs/latest.log" ]; do + sleep 1 + fn_print_info "Checking for update: ${remotelocation}: checking local build: waiting for log file: ${totalseconds}" + if [ -v "${loopignore}" ]; then + loopignore=1 + fn_script_log_info "Waiting for log file to generate" + fi + + if [ "${totalseconds}" -gt "120" ]; then + localbuild="0" + fn_print_error "Checking for update: ${remotelocation}: waiting for log file: missing log file" + fn_script_log_error "Missing log file" + fn_script_log_error "Set localbuild to 0" + sleep 0.5 + fi + + totalseconds=$((totalseconds + 1)) + done fi - # Get current build from logs - currentbuild=$(cat "${serverfiles}/logs/latest.log" 2> /dev/null | grep version | grep -Eo '((\.)?[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" - sleep 0.5 - fn_print_info_nl "Checking for update: mojang.com: Forcing server restart" - fn_script_log_info "Checking for update: mojang.com: Forcing server restart" - exitbypass=1 - command_stop.sh - exitbypass=1 - command_start.sh - currentbuild=$(cat "${serverfiles}/logs/latest.log" 2> /dev/null | grep version | grep -Eo '((\.)?[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" - core_exit.sh - fi + if [ -z "${localbuild}" ]; then + localbuild=$(cat "${serverfiles}/logs/latest.log" 2> /dev/null | grep version | grep -Eo '((\.)?[0-9]{1,3}){1,3}\.[0-9]{1,3}') fi -} -fn_update_availablebuild(){ - # Gets latest build info. - availablebuild=$(${curlpath} -s "https://launchermeta.mojang.com/mc/game/version_manifest.json" | jq -r '.latest.release') - # Checks if availablebuild variable has been set - if [ -z "${availablebuild}" ]; then - fn_print_fail "Checking for update: mojang.com" - sleep 0.5 - 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 - : + if [ -z "${localbuild}" ]; then + # Gives time for var to generate. + end=$((SECONDS+120)) + totalseconds=0 + while [ "${SECONDS}" -lt "${end}" ]; do + fn_print_info "Checking for update: ${remotelocation}: checking local build: waiting for local build: ${totalseconds}" + if [ -z "${loopignore}" ]; then + loopignore=1 + fn_script_log_info "Waiting for local build to generate" + fi + localbuild=$(cat "${serverfiles}/logs/latest.log" 2> /dev/null | grep version | grep -Eo '((\.)?[0-9]{1,3}){1,3}\.[0-9]{1,3}') grep -Eo "TeamSpeak 3 Server ((\.)?[0-9]{1,3}){1,3}\.[0-9]{1,3}" | grep -Eo "((\.)?[0-9]{1,3}){1,3}\.[0-9]{1,3}") + if [ "${localbuild}" ]; then + break + fi + sleep 1 + totalseconds=$((totalseconds + 1)) + done + fi + + if [ -z "${localbuild}" ]; then + localbuild="0" + fn_print_error "Checking for update: ${remotelocation}: waiting for local build: missing local build info" + fn_script_log_error "Missing local build info" + fn_script_log_error "Set localbuild to 0" else - fn_print_ok_nl "Checking for update: mojang.com" - fn_script_log_pass "Checking for update: mojang.com" - sleep 0.5 + fn_print_ok "Checking for update: ${remotelocation}: checking local build" + fn_script_log_pass "Checking local build" fi + sleep 0.5 } -fn_update_compare(){ - # Removes dots so if can compare version numbers - currentbuilddigit=$(echo "${currentbuild}" | tr -cd '[:digit:]') - availablebuilddigit=$(echo "${availablebuild}" | tr -cd '[:digit:]') +fn_update_minecraft_remotebuild(){ + # Gets remote build info. + remotebuild=$(${curlpath} -s "https://launchermeta.${remotelocation}/mc/game/version_manifest.json" | jq -r '.latest.release') + if [ "${installer}" != "1" ]; then + fn_print_dots "Checking for update: ${remotelocation}: checking remote build" + sleep 0.5 + # Checks if remotebuild variable has been set. + if [ -z "${remotebuild}" ]||[ "${remotebuild}" == "null" ]; then + fn_print_fail "Checking for update: ${remotelocation}: checking remote build" + fn_script_log_fatal "Checking remote build" + core_exit.sh + else + fn_print_ok "Checking for update: ${remotelocation}: checking remote build" + fn_script_log_pass "Checking remote build" + sleep 0.5 + fi + else + # Checks if remotebuild variable has been set. + if [ -z "${remotebuild}" ]||[ "${remotebuild}" == "null" ]; then + fn_print_failure "Unable to get remote build" + fn_script_log_fatal "Unable to get remote build" + core_exit.sh + fi + fi +} - if [ "${currentbuilddigit}" -ne "${availablebuilddigit}" ]; then - echo -e "\n" - echo -e "Update available:" +fn_update_minecraft_compare(){ + # Removes dots so if statement can compare version numbers. + fn_print_dots "Checking for update: ${remotelocation}" + sleep 0.5 + localbuilddigit=$(echo "${localbuild}" | tr -cd '[:digit:]') + remotebuilddigit=$(echo "${remotebuild}" | tr -cd '[:digit:]') + if [ "${localbuilddigit}" -ne "${remotebuilddigit}" ]||[ "${forceupdate}" == "1" ]; then + fn_print_ok_nl "Checking for update: ${remotelocation}" sleep 0.5 - echo -e " Current build: ${red}${currentbuild}${default}" - echo -e " Available build: ${green}${availablebuild}${default}" - echo -e "" + echo -en "\n" + echo -e "Update available" + echo -e "* Local build: ${red}${localbuild}${default}" + echo -e "* Remote build: ${green}${remotebuild}${default}" + fn_script_log_info "Update available" + fn_script_log_info "Local build: ${localbuild}" + fn_script_log_info "Remote build: ${remotebuild}" + fn_script_log_info "${localbuild} > ${remotebuild}" sleep 0.5 - echo -en "Applying update.\r" + echo -en "\n" + echo -en "applying update.\r" sleep 1 - echo -en "Applying update..\r" + echo -en "applying update..\r" sleep 1 - echo -en "Applying update...\r" + 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 server stopped. if [ "${status}" == "0" ]; then - fn_update_dl + exitbypass=1 + fn_update_minecraft_dl exitbypass=1 command_start.sh exitbypass=1 command_stop.sh + # If server started. else exitbypass=1 command_stop.sh - fn_update_dl + exitbypass=1 + fn_update_minecraft_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}" + fn_print_ok_nl "Checking for update: ${remotelocation}" + sleep 0.5 + echo -en "\n" + echo -e "No update available" + echo -e "* Local build: ${green}${localbuild}${default}" + echo -e "* Remote build: ${green}${remotebuild}${default}" + fn_script_log_info "No update available" + fn_script_log_info "Local build: ${localbuild}" + fn_script_log_info "Remote build: ${remotebuild}" fi } +# The location where the builds are checked and downloaded. +remotelocation="mojang.com" + if [ "${installer}" == "1" ]; then - fn_update_availablebuild - fn_update_dl + fn_update_minecraft_remotebuild + fn_update_minecraft_dl else - # Checks for server update from mojang.com - fn_print_dots "Checking for update: mojang.com" - fn_script_log_info "Checking for update: mojang.com" + fn_print_dots "Checking for update: ${remotelocation}" + fn_script_log_info "Checking for update: ${remotelocation}" sleep 0.5 - fn_update_currentbuild - fn_update_availablebuild - fn_update_compare + fn_update_minecraft_localbuild + fn_update_minecraft_remotebuild + fn_update_minecraft_compare fi diff --git a/lgsm/functions/update_mta.sh b/lgsm/functions/update_mta.sh index 85c7b1053..dc04df5b0 100644 --- a/lgsm/functions/update_mta.sh +++ b/lgsm/functions/update_mta.sh @@ -13,113 +13,174 @@ fn_update_mta_dl(){ 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 ${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 + fn_script_log_pass "Copying to ${serverfiles}" + chmod u+x "${serverfiles}/minecraft_server.jar" + fn_clear_tmp else fn_print_fail_eol_nl + fn_script_log_fatal "Copying to ${serverfiles}" + core_exit.sh 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 "${gamelogdir}"/server.log ]; then - fn_print_error "Checking for update: linux.mtasa.com" +fn_update_mta_localbuild(){ + # Gets local build info. + fn_print_dots "Checking for update: ${remotelocation}: checking local build" + sleep 0.5 + # Uses log file to gather info. + # Gives time for log file to generate. + if [ ! -f "${serverfiles}/mods/deathmatch/logs/server.log" ]; then + fn_print_error "Checking for update: ${remotelocation}: checking local build" sleep 0.5 - 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" + fn_print_error_nl "Checking for update: ${remotelocation}: checking local build: no log files" + fn_script_log_error "No log file found" sleep 0.5 - 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" + fn_print_info_nl "Checking for update: ${remotelocation}: checking local build: forcing server restart" + fn_script_log_info "Forcing server restart" sleep 0.5 exitbypass=1 command_stop.sh exitbypass=1 command_start.sh - sleep 0.5 - # Check again and exit on failure. - if [ ! -f "${gamelogdir}"/server.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 + totalseconds=0 + # Check again, allow time to generate logs. + while [ ! -f "${serverfiles}/mods/deathmatch/logs/server.log" ]; do + sleep 1 + fn_print_info "Checking for update: ${remotelocation}: checking local build: waiting for log file: ${totalseconds}" + if [ -v "${loopignore}" ]; then + loopignore=1 + fn_script_log_info "Waiting for log file to generate" + fi + + if [ "${totalseconds}" -gt "120" ]; then + localbuild="0" + fn_print_error "Checking for update: ${remotelocation}: waiting for log file: missing log file" + fn_script_log_error "Missing log file" + fn_script_log_error "Set localbuild to 0" + sleep 0.5 + fi + + totalseconds=$((totalseconds + 1)) + done fi - # Get current build from logs - currentbuild=$(grep "= Multi Theft Auto: San Andreas v" "${gamelogdir}/server.log" | awk '{ print $7 }' | sed -r 's/^.{1}//' | tail -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 0.5 - 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=$(grep "= Multi Theft Auto: San Andreas v" "${gamelogdir}/server.log" | awk '{ print $7 }' | sed -r 's/^.{1}//' | tail -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 + if [ -z "${localbuild}" ]; then + localbuild=$(grep "= Multi Theft Auto: San Andreas v" "${serverfiles}/mods/deathmatch/logs/server.log" | awk '{ print $7 }' | sed -r 's/^.{1}//' | tail -1) + fi + + if [ -z "${localbuild}" ]; then + # Gives time for var to generate. + end=$((SECONDS+120)) + totalseconds=0 + while [ "${SECONDS}" -lt "${end}" ]; do + fn_print_info "Checking for update: ${remotelocation}: checking local build: waiting for local build: ${totalseconds}" + if [ -z "${loopignore}" ]; then + loopignore=1 + fn_script_log_info "Waiting for local build to generate" + fi + localbuild=$(grep "= Multi Theft Auto: San Andreas v" "${serverfiles}/mods/deathmatch/logs/server.log" | awk '{ print $7 }' | sed -r 's/^.{1}//' | tail -1) + if [ "${localbuild}" ]; then + break + fi + sleep 1 + totalseconds=$((totalseconds + 1)) + done + fi + + if [ -z "${localbuild}" ]; then + localbuild="0" + fn_print_error "Checking for update: ${remotelocation}: waiting for local build: missing local build info" + fn_script_log_error "Missing local build info" + fn_script_log_error "Set localbuild to 0" + else + fn_print_ok "Checking for update: ${remotelocation}: checking local build" + fn_script_log_pass "Checking local build" fi + sleep 0.5 } -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 majorversion="$(grep "#define MTASA_VERSION_MAJOR" "${tmpdir}/version.h" | awk '{ print $3 }' | sed 's/\r//g')" - local minorversion="$(grep "#define MTASA_VERSION_MINOR" "${tmpdir}/version.h" | awk '{ print $3 }' | sed 's/\r//g')" - local maintenanceversion="$(grep "#define MTASA_VERSION_MAINTENANCE" "${tmpdir}/version.h" | awk '{ print $3 }' | sed 's/\r//g')" - numversion="${majorversion}${minorversion}${maintenanceversion}" - fullversion="${majorversion}.${minorversion}.${maintenanceversion}" - rm -f "${tmpdir}/version.h" +fn_update_mta_remotebuild(){ + # Gets remote build info. + local majorversion="$(curl -s https://raw.githubusercontent.com/multitheftauto/mtasa-blue/master/Server/version.h | grep "#define MTASA_VERSION_MAJOR" | awk '{ print $3 }' | sed 's/\r//g')" + local minorversion="$(curl -s https://raw.githubusercontent.com/multitheftauto/mtasa-blue/master/Server/version.h | grep "#define MTASA_VERSION_MINOR" | awk '{ print $3 }' | sed 's/\r//g')" + local maintenanceversion="$(curl -s https://raw.githubusercontent.com/multitheftauto/mtasa-blue/master/Server/version.h | grep "#define MTASA_VERSION_MAINTENANCE" | awk '{ print $3 }' | sed 's/\r//g')" + remotebuild="${majorversion}.${minorversion}.${maintenanceversion}" + if [ "${installer}" != "1" ]; then + fn_print_dots "Checking for update: ${remotelocation}: checking remote build" + sleep 0.5 + # Checks if remotebuild variable has been set. + if [ -z "${remotebuild}" ]||[ "${remotebuild}" == "null" ]; then + fn_print_fail "Checking for update: ${remotelocation}: checking remote build" + fn_script_log_fatal "Checking remote build" + core_exit.sh + else + fn_print_ok "Checking for update: ${remotelocation}: checking remote build" + fn_script_log_pass "Checking remote build" + sleep 0.5 + fi + else + # Checks if remotebuild variable has been set. + if [ -z "${remotebuild}" ]||[ "${remotebuild}" == "null" ]; then + fn_print_failure "Unable to get remote build" + fn_script_log_fatal "Unable to get remote build" + core_exit.sh + fi + fi } fn_update_mta_compare(){ - # Removes dots so if can compare version numbers - currentbuilddigit=$(echo "${currentbuild}" | tr -cd '[:digit:]') - if [ "${currentbuilddigit}" -ne "${numversion}" ]||[ "${forceupdate}" == "1" ]; then + # Removes dots so if statement can compare version numbers. + fn_print_dots "Checking for update: ${remotelocation}" + sleep 0.5 + localbuilddigit=$(echo "${localbuild}" | tr -cd '[:digit:]') + remotebuilddigit=$(echo "${remotebuild}" | tr -cd '[:digit:]') + if [ "${localbuilddigit}" -ne "${remotebuilddigit}" ]||[ "${forceupdate}" == "1" ]; then + fn_print_ok_nl "Checking for update: ${remotelocation}" if [ "${forceupdate}" == "1" ]; then # forceupdate bypasses checks, useful for small build changes - mta_update_string="forced" + mtaupdatestatus="forced" else - mta_update_string="available" + mtaupdatestatus="available" fi - echo -e "\n" - echo -e "Update ${mta_update_string}:" sleep 0.5 - echo -e " Current build: ${red}${currentbuild} ${default}" - echo -e " Available build: ${green}${fullversion} ${default}" - echo -e "" + echo -en "\n" + echo -e "Update ${mtaupdatestatus}:" + echo -e "* Local build: ${red}${localbuild}${default}" + echo -e "* Remote build: ${green}${remotebuild}${default}" + fn_script_log_info "Update available" + fn_script_log_info "Local build: ${localbuild}" + fn_script_log_info "Remote build: ${remotebuild}" + fn_script_log_info "${localbuild} > ${remotebuild}" sleep 0.5 - echo -en "Applying update.\r" + echo -en "\n" + echo -en "applying update.\r" sleep 1 - echo -en "Applying update..\r" + echo -en "applying update..\r" sleep 1 - echo -en "Applying update...\r" + echo -en "applying update...\r" sleep 1 echo -en "\n" - fn_script_log "Update ${mta_update_string}" - fn_script_log "Current build: ${currentbuild}" - fn_script_log "Available build: ${fullversion}" - fn_script_log "${currentbuild} > ${fullversion}" unset updateonstart check_status.sh + # If server stopped. if [ "${status}" == "0" ]; then + exitbypass=1 fn_update_mta_dl exitbypass=1 command_start.sh exitbypass=1 command_stop.sh + # If server started. else exitbypass=1 command_stop.sh + exitbypass=1 fn_update_mta_dl exitbypass=1 command_start.sh @@ -127,27 +188,29 @@ fn_update_mta_compare(){ 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}${fullversion}${default}" - echo -e "" - fn_print_ok_nl "No update available" - fn_script_log_info "Current build: ${currentbuild}" - fn_script_log_info "Available build: ${fullversion}" + fn_print_ok_nl "Checking for update: ${remotelocation}" + sleep 0.5 + echo -en "\n" + echo -e "No update available" + echo -e "* Local build: ${green}${localbuild}${default}" + echo -e "* Remote build: ${green}${remotebuild}${default}" + fn_script_log_info "No update available" + fn_script_log_info "Local build: ${localbuild}" + fn_script_log_info "Remote build: ${remotebuild}" fi } +# The location where the builds are checked and downloaded. +remotelocation="linux.mtasa.com" if [ "${installer}" == "1" ]; then - fn_mta_get_availablebuild + fn_update_mta_remotebuild 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" + fn_print_dots "Checking for update: ${remotelocation}" + fn_script_log_info "Checking for update: ${remotelocation}" sleep 0.5 - fn_update_mta_currentbuild - fn_mta_get_availablebuild + fn_update_mta_localbuild + fn_update_mta_remotebuild fn_update_mta_compare fi diff --git a/lgsm/functions/update_mumble.sh b/lgsm/functions/update_mumble.sh index 6988fc317..ba98449e2 100644 --- a/lgsm/functions/update_mumble.sh +++ b/lgsm/functions/update_mumble.sh @@ -1,137 +1,117 @@ #!/bin/bash # LinuxGSM update_mumble.sh function # Author: Daniel Gibbs -# Contributor: UltimateByte # Website: https://linuxgsm.com -# Description: Handles updating of mumble servers. +# Description: Handles updating of Mumble servers. local commandname="UPDATE" local commandaction="Update" 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}" + fn_fetch_file "https://github.com/mumble-voip/mumble/releases/download/${remotebuild}/murmur-static_${mumblearch}-${remotebuild}.tar.bz2" "${tmpdir}" "murmur-static_${mumblearch}-${remotebuild}.tar.bz2" + fn_dl_extract "${tmpdir}" "murmur-static_${mumblearch}-${remotebuild}.tar.bz2" "${tmpdir}" echo -e "copying to ${serverfiles}...\c" - fn_script_log "Copying to ${serverfiles}" - cp -R "${tmpdir}/murmur-static_${mumblearch}-${availablebuild}/"* "${serverfiles}" + cp -R "${tmpdir}/murmur-static_${mumblearch}-${remotebuild}/"* "${serverfiles}" local exitcode=$? - if [ ${exitcode} -eq 0 ]; then + if [ "${exitcode}" == "0" ]; then fn_print_ok_eol_nl + fn_script_log_pass "Copying to ${serverfiles}" + fn_clear_tmp else fn_print_fail_eol_nl + fn_script_log_fatal "Copying to ${serverfiles}" + core_exit.sh fi } -fn_update_mumble_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: GitHub" - sleep 0.5 - fn_print_error_nl "Checking for update: GitHub: No logs with server version found" - fn_script_log_error "Checking for update: GitHub: No logs with server version found" - sleep 0.5 - fn_print_info_nl "Checking for update: GitHub: Forcing server restart" - fn_script_log_info "Checking for update: GitHub: Forcing server restart" - sleep 0.5 - exitbypass=1 - command_stop.sh - exitbypass=1 - command_start.sh - sleep 0.5 - # Check again and exit on failure. - if [ ! -f "${consolelogdir}/${servicename}-console.log" ]; then - fn_print_fail_nl "Checking for update: GitHub: Still No logs with server version found" - fn_script_log_fatal "Checking for update: GitHub: Still No logs with server version found" - core_exit.sh - fi +fn_update_mumble_localbuild(){ + # Gets local build info. + fn_print_dots "Checking for update: ${remotelocation}: checking local build" + sleep 0.5 + # Uses executable to find local build. + cd "${executabledir}" || exit + if [ -f "${executable}" ]; then + localbuild=$(${executable} -version 2>&1 >/dev/null | awk '{print $5}') + fn_print_ok "Checking for update: ${remotelocation}: checking local build" + fn_script_log_pass "Checking local build" + else + localbuild="0" + fn_print_error "Checking for update: ${remotelocation}: checking local build" + fn_script_log_error "Checking local build" fi + sleep 0.5 +} - # Get current build from logs - currentbuild=$(cat "${consolelogdir}"/"${servicename}"-console.log 2> /dev/null | sort | grep -E 'Murmur ((\.)?[0-9]{1,3}){1,3}\.[0-9]{1,3}' | awk '{print $4}') - if [ -z "${currentbuild}" ]; then - fn_print_error_nl "Checking for update: GitHub: Current build version not found" - fn_script_log_error "Checking for update: GitHub: Current build version not found" +fn_update_mumble_remotebuild(){ + # Gets remote build info. + remotebuild=$(${curlpath} -s "https://api.github.com/repos/mumble-voip/mumble/releases/latest" | grep 'murmur-static_x86.*\.bz2"' | tail -1 | awk -F"/" '{ print $8 }') + if [ "${installer}" != "1" ]; then + fn_print_dots "Checking for update: ${remotelocation}: checking remote build" sleep 0.5 - fn_print_info_nl "Checking for update: GitHub: Forcing server restart" - fn_script_log_info "Checking for update: GitHub: Forcing server restart" - exitbypass=1 - command_stop.sh - exitbypass=1 - command_start.sh - currentbuild=$(cat "${consolelogdir}"/"${servicename}"-console.log 2> /dev/null | sort | grep -E 'Murmur ((\.)?[0-9]{1,3}){1,3}\.[0-9]{1,3}' | awk '{print $4}') - if [ -z "${currentbuild}" ]; then - fn_print_fail_nl "Checking for update: GitHub: Current build version still not found" - fn_script_log_fatal "Checking for update: GitHub: Current build version still not found" + # Checks if remotebuild variable has been set. + if [ -z "${remotebuild}" ]||[ "${remotebuild}" == "null" ]; then + fn_print_fail "Checking for update: ${remotelocation}: checking remote build" + fn_script_log_fatal "Checking remote build" core_exit.sh + else + fn_print_ok "Checking for update: ${remotelocation}: checking remote build" + fn_script_log_pass "Checking remote build" + sleep 0.5 fi - fi -} - -fn_update_mumble_arch(){ - # Mumble is x86 only for now - mumblearch="x86" -} - -fn_update_mumble_availablebuild(){ - # Gets latest build info. - 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 0.5 - - # Checks if availablebuild variable has been set - if [ -z "${availablebuild}" ]; then - fn_print_fail "Checking for update: GitHub" - sleep 0.5 - 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" - sleep 0.5 - fi + # Checks if remotebuild variable has been set. + if [ -z "${remotebuild}" ]||[ "${remotebuild}" == "null" ]; then + fn_print_failure "Unable to get remote build" + fn_script_log_fatal "Unable to get remote build" + core_exit.sh + fi + fi } fn_update_mumble_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:" + # Removes dots so if statement can compare version numbers. + fn_print_dots "Checking for update: ${remotelocation}" + sleep 0.5 + localbuilddigit=$(echo "${localbuild}" | tr -cd '[:digit:]') + remotebuilddigit=$(echo "${remotebuild}" | tr -cd '[:digit:]') + if [ "${localbuilddigit}" -ne "${remotebuilddigit}" ]||[ "${forceupdate}" == "1" ]; then + fn_print_ok_nl "Checking for update: ${remotelocation}" sleep 0.5 - echo -e " Current build: ${red}${currentbuild} ${mumblearch}${default}" - echo -e " Available build: ${green}${availablebuild} ${mumblearch}${default}" - echo -e "" + echo -en "\n" + echo -e "Update available" + echo -e "* Local build: ${red}${localbuild} ${mumblearch}${default}" + echo -e "* Remote build: ${green}${remotebuild} ${mumblearch}${default}" + fn_script_log_info "Update available" + fn_script_log_info "Local build: ${localbuild} ${mumblearch}" + fn_script_log_info "Remote build: ${remotebuild} ${mumblearch}" + fn_script_log_info "${localbuild} > ${remotebuild}" sleep 0.5 - echo -en "Applying update.\r" + echo -en "\n" + echo -en "applying update.\r" sleep 1 - echo -en "Applying update..\r" + echo -en "applying update..\r" sleep 1 - echo -en "Applying update...\r" + 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 server stopped. if [ "${status}" == "0" ]; then + exitbypass=1 fn_update_mumble_dl exitbypass=1 command_start.sh exitbypass=1 command_stop.sh + # If server started. else exitbypass=1 command_stop.sh + exitbypass=1 fn_update_mumble_dl exitbypass=1 command_start.sh @@ -139,27 +119,32 @@ fn_update_mumble_compare(){ 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}" + fn_print_ok_nl "Checking for update: ${remotelocation}" + sleep 0.5 + echo -en "\n" + echo -e "No update available" + echo -e "* Local build: ${green}${localbuild} ${mumblearch}${default}" + echo -e "* Remote build: ${green}${remotebuild} ${mumblearch}${default}" + fn_script_log_info "No update available" + fn_script_log_info "Local build: ${localbuild} ${mumblearch}" + fn_script_log_info "Remote build: ${remotebuild} ${mumblearch}" fi } -fn_update_mumble_arch +# The location where the builds are checked and downloaded. +remotelocation="mumble.info" + +# Game server architecture. +mumblearch="x86" + if [ "${installer}" == "1" ]; then - fn_update_mumble_availablebuild + fn_update_mumble_remotebuild fn_update_mumble_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" + fn_print_dots "Checking for update: ${remotelocation}" + fn_script_log_info "Checking for update: ${remotelocation}" sleep 0.5 - fn_update_mumble_currentbuild - fn_update_mumble_availablebuild + fn_update_mumble_localbuild + fn_update_mumble_remotebuild fn_update_mumble_compare fi diff --git a/lgsm/functions/update_steamcmd.sh b/lgsm/functions/update_steamcmd.sh index 480624f7b..0a38699e5 100644 --- a/lgsm/functions/update_steamcmd.sh +++ b/lgsm/functions/update_steamcmd.sh @@ -8,16 +8,8 @@ local commandname="UPDATE" local commandaction="Update" local function_selfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" -check.sh - fn_update_steamcmd_dl(){ info_config.sh - fn_print_dots "SteamCMD" - sleep 0.5 - fn_print_ok_nl "SteamCMD" - fn_script_log_info "Starting SteamCMD" - - cd "${steamcmddir}" || exit # Detects if unbuffer command is available for 32 bit distributions only. info_distro.sh @@ -27,17 +19,131 @@ fn_update_steamcmd_dl(){ cd "${steamcmddir}" || exit if [ "${appid}" == "90" ]; then - ${unbuffer} ./steamcmd.sh +login "${steamuser}" "${steampass}" +force_install_dir "${serverfiles}" +app_info_print 70 +app_set_config 90 mod "${appidmod}" +app_update "${appid}" ${branch} +quit | tee -a "${lgsmlog}" + ${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 "${lgsmlog}" - if [ "${gamename}" == "Classic Offensive" ]; then - ${unbuffer} ./steamcmd.sh +login "${steamuser}" "${steampass}" +force_install_dir "${serverfiles}" +app_update "${appid_co}" ${branch} +quit | tee -a "${lgsmlog}" - fi fi - fix.sh } +fn_update_steamcmd_localbuild(){ + # Gets local build info. + fn_print_dots "Checking for update: ${remotelocation}: checking local build" + sleep 0.5 + fn_appmanifest_check + # Uses appmanifest to find local build. + localbuild=$(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. + if [ -f "${HOME}/Steam/appcache/appinfo.vdf" ]; then + rm -f "${HOME}/Steam/appcache/appinfo.vdf" + fi + + # Set branch for updateinfo. + IFS=' ' read -ra branchsplits <<< "${branch}" + if [ "${#branchsplits[@]}" -gt 1 ]; then + branchname="${branchsplits[1]}" + else + branchname="public" + fi + sleep 0.5 +} + +fn_update_steamcmd_remotebuild(){ + # Gets remote build info. + cd "${steamcmddir}" || exit + remotebuild=$(./steamcmd.sh +login "${steamuser}" "${steampass}" +app_info_update 1 +app_info_print "${appid}" +quit | sed '1,/branches/d' | sed "1,/${branchname}/d" | grep -m 1 buildid | tr -cd '[:digit:]') + if [ "${installer}" != "1" ]; then + fn_print_dots "Checking for update: ${remotelocation}: checking remote build" + sleep 0.5 + # Checks if remotebuild variable has been set. + if [ -z "${remotebuild}" ]||[ "${remotebuild}" == "null" ]; then + fn_print_fail "Checking for update: ${remotelocation}: checking remote build" + fn_script_log_fatal "Checking remote build" + core_exit.sh + else + fn_print_ok "Checking for update: ${remotelocation}: checking remote build" + fn_script_log_pass "Checking remote build" + sleep 0.5 + fi + else + # Checks if remotebuild variable has been set. + if [ -z "${remotebuild}" ]||[ "${remotebuild}" == "null" ]; then + fn_print_failure "Unable to get remote build" + fn_script_log_fatal "Unable to get remote build" + core_exit.sh + fi + fi +} + +fn_update_steamcmd_compare(){ + fn_print_dots "Checking for update: ${remotelocation}" + sleep 0.5 + if [ "${localbuild}" != "${remotebuild}" ]; then + fn_print_ok_nl "Checking for update: ${remotelocation}" + sleep 0.5 + echo -en "\n" + echo -e "Update available" + echo -e "* Local build: ${red}${localbuild}${default}" + echo -e "* Remote build: ${green}${remotebuild}${default}" + if [ -v "${branch}" ]; then + echo -e "* Branch: ${branch}" + fi + echo -e "https://steamdb.info/app/${appid}/" + fn_script_log_info "Update available" + fn_script_log_info "Local build: ${localbuild}" + fn_script_log_info "Remote build: ${remotebuild}" + if [ -v "${branch}" ]; then + fn_script_log_info "Branch: ${branch}" + fi + fn_script_log_info "${localbuild} > ${remotebuild}" + sleep 0.5 + echo -en "\n" + echo -en "applying update.\r" + sleep 1 + echo -en "applying update..\r" + sleep 1 + echo -en "applying update...\r" + sleep 1 + echo -en "\n" + + unset updateonstart + + check_status.sh + # If server stopped. + if [ "${status}" == "0" ]; then + fn_update_steamcmd_dl + # If server started. + else + exitbypass=1 + command_stop.sh + exitbypass=1 + fn_update_steamcmd_dl + exitbypass=1 + command_start.sh + fi + alert="update" + alert.sh + else + fn_print_ok_nl "Checking for update: ${remotelocation}" + sleep 0.5 + echo -en "\n" + echo -e "No update available" + echo -e "* Local build: ${green}${localbuild}${default}" + echo -e "* Remote build: ${green}${remotebuild}${default}" + if [ -v "${branch}" ]; then + echo -e "* Branch: ${branch}" + fi + echo -e "https://steamdb.info/app/${appid}/" + fn_script_log_info "No update available" + fn_script_log_info "Local build: ${localbuild}" + fn_script_log_info "Remote build: ${remotebuild}" + if [ -v "${branch}" ]; then + fn_script_log_info "Branch: ${branch}" + fi + fi +} + fn_appmanifest_info(){ appmanifestfile=$(find "${serverfiles}" -type f -name "appmanifest_${appid}.acf") appmanifestfilewc=$(find "${serverfiles}" -type f -name "appmanifest_${appid}.acf" | wc -l) @@ -77,7 +183,6 @@ fn_appmanifest_check(){ fn_script_log_info "Forcing update to correct issue" sleep 0.5 fn_update_steamcmd_dl - fn_update_request_log fi elif [ "${appmanifestfilewc}" -eq "0" ]; then fn_print_error_nl "No appmanifest_${appid}.acf found" @@ -87,7 +192,6 @@ fn_appmanifest_check(){ fn_script_log_info "Forcing update to correct issue" sleep 0.5 fn_update_steamcmd_dl - fn_update_request_log fn_appmanifest_info if [ "${appmanifestfilewc}" -eq "0" ]; then fn_print_fail_nl "Still no appmanifest_${appid}.acf found" @@ -97,141 +201,13 @@ fn_appmanifest_check(){ fi } -fn_update_request_log(){ - # Checks for server update requests from server logs. - fn_print_dots "Checking for update: Server logs" - fn_script_log_info "Checking for update: Server logs" - sleep 0.5 - 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" - sleep 0.5 - echo -e "" - echo -en "Applying update.\r" - sleep 1 - echo -en "Applying update..\r" - sleep 1 - echo -en "Applying update...\r" - sleep 1 - echo -en "\n" - - unset updateonstart - check_status.sh - if [ "${status}" != "0" ]; then - exitbypass=1 - command_stop.sh - fn_update_steamcmd_dl - exitbypass=1 - command_start.sh - else - fn_update_steamcmd_dl - fi - alert="update" - alert.sh - else - fn_print_ok "Checking for update: Server logs: No update requested" - sleep 0.5 - fi -} - -fn_update_steamcmd_check(){ - appid="${1}" - fn_appmanifest_check - # Checks for server update from SteamCMD - fn_print_dots "Checking for update: SteamCMD" - fn_script_log_info "Checking for update: SteamCMD" - sleep 0.5 - - # Gets currentbuild - currentbuild=$(grep buildid "${appmanifestfile}" | tr '[:blank:]"' ' ' | tr -s ' ' | cut -d\ -f3) - - # Removes appinfo.vdf as a fix for not always getting up to date version info from SteamCMD - - if [ -f "${HOME}/Steam/appcache/appinfo.vdf" ]; then - rm -f "${HOME}/Steam/appcache/appinfo.vdf" - fi - - # Set branch for updateinfo - IFS=' ' read -ra branchsplits <<< "${branch}" - if [ "${#branchsplits[@]}" -gt 1 ]; then - branchname="${branchsplits[1]}" - else - branchname="public" - fi - - # Gets availablebuild info - cd "${steamcmddir}" || exit - availablebuild=$(./steamcmd.sh +login "${steamuser}" "${steampass}" +app_info_update 1 +app_info_print "${appid}" +quit | sed '1,/branches/d' | sed "1,/${branchname}/d" | grep -m 1 buildid | tr -cd '[:digit:]') - if [ -z "${availablebuild}" ]; then - fn_print_fail "Checking for update: SteamCMD" - sleep 0.5 - fn_print_fail_nl "Checking for update: SteamCMD: Not returning version info" - fn_script_log_fatal "Checking for update: SteamCMD: Not returning version info" - core_exit.sh - else - fn_print_ok "Checking for update: SteamCMD" - fn_script_log_pass "Checking for update: SteamCMD" - sleep 0.5 - fi - - if [ "${currentbuild}" != "${availablebuild}" ]; then - fn_print_ok "Checking for update: SteamCMD: Update available" - fn_script_log_pass "Checking for update: SteamCMD: Update available" - echo -e "\n" - echo -e "Update available:" - sleep 0.5 - echo -e " Current build: ${red}${currentbuild}${default}" - echo -e " Available build: ${green}${availablebuild}${default}" - echo -e " https://steamdb.info/app/${appid}/" - sleep 0.5 - 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_info "Update available" - fn_script_log_info "Current build: ${currentbuild}" - fn_script_log_info "Available build: ${availablebuild}" - fn_script_log_info "${currentbuild} > ${availablebuild}" +# The location where the builds are checked and downloaded. +remotelocation="SteamCMD" - unset updateonstart - check_status.sh - if [ "${status}" != "0" ]; then - exitbypass=1 - command_stop.sh - fn_update_steamcmd_dl - exitbypass=1 - command_start.sh - else - fn_update_steamcmd_dl - fi - alert="update" - alert.sh - else - fn_print_ok "Checking for update: SteamCMD: No update available" - fn_script_log_pass "Checking for update: SteamCMD: No update available" - echo -e "\n" - echo -e "No update available:" - echo -e " Current version: ${green}${currentbuild}${default}" - echo -e " Available version: ${green}${availablebuild}${default}" - echo -e " https://steamdb.info/app/${appid}/" - echo -e "" - fn_script_log_info "Current build: ${currentbuild}" - fn_script_log_info "Available build: ${availablebuild}" - fi -} +check.sh -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 +if [ "${forceupdate}" == "1" ]; then + # forceupdate bypasses update checks. check_status.sh if [ "${status}" != "0" ]; then exitbypass=1 @@ -243,10 +219,7 @@ if [ "${engine}" == "goldsource" ]||[ "${forceupdate}" == "1" ]; then fn_update_steamcmd_dl fi 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 + fn_update_steamcmd_localbuild + fn_update_steamcmd_remotebuild + fn_update_steamcmd_compare fi diff --git a/lgsm/functions/update_ts3.sh b/lgsm/functions/update_ts3.sh index 5a98a87a7..2defd8abd 100644 --- a/lgsm/functions/update_ts3.sh +++ b/lgsm/functions/update_ts3.sh @@ -2,154 +2,183 @@ # LinuxGSM command_ts3.sh function # Author: Daniel Gibbs # Website: https://linuxgsm.com -# Description: Handles updating of teamspeak 3 servers. +# Description: Handles updating of Teamspeak 3 servers. local commandname="UPDATE" local commandaction="Update" local function_selfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" fn_update_ts3_dl(){ - info_distro.sh if [ "${ts3arch}" == "amd64" ]; then - latestts3releaselink=$(${curlpath} -s 'https://www.teamspeak.com/versions/server.json' | jq -r '.linux.x86_64.mirrors."teamspeak.com"') + local remotebuildurl=$(${curlpath} -s 'https://www.teamspeak.com/versions/server.json' | jq -r '.linux.x86_64.mirrors."teamspeak.com"') elif [ "${ts3arch}" == "x86" ]; then - latestts3releaselink=$(${curlpath} -s 'https://www.teamspeak.com/versions/server.json' | jq -r '.linux.x86.mirrors."teamspeak.com"') + local remotebuildurl=$(${curlpath} -s 'https://www.teamspeak.com/versions/server.json' | jq -r '.linux.x86.mirrors."teamspeak.com"') fi - fn_fetch_file "${latestts3releaselink}" "${tmpdir}" "teamspeak3-server_linux_${ts3arch}-${ts3_version_number}.tar.bz2" - fn_dl_extract "${tmpdir}" "teamspeak3-server_linux_${ts3arch}-${ts3_version_number}.tar.bz2" "${tmpdir}" + fn_fetch_file "${remotebuildurl}" "${tmpdir}" "teamspeak3-server_linux_${ts3arch}-${remotebuild}.tar.bz2" + fn_dl_extract "${tmpdir}" "teamspeak3-server_linux_${ts3arch}-${remotebuild}.tar.bz2" "${tmpdir}" 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 + fn_script_log_pass "Copying to ${serverfiles}" + fn_clear_tmp else fn_print_fail_eol_nl + fn_script_log_fatal "Copying to ${serverfiles}" + core_exit.sh fi } -fn_update_ts3_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. +fn_update_ts3_localbuild(){ + # Gets local build info. + fn_print_dots "Checking for update: ${remotelocation}: checking local build" + sleep 0.5 + # Uses log file to gather info. + # Gives time for log file to generate. if [ ! -d "${serverfiles}/logs" ]||[ -z "$(find "${serverfiles}/logs/"* -name 'ts3server*_0.log' 2> /dev/null)" ]; then - fn_print_error "Checking for update: teamspeak.com" + fn_print_error "Checking for update: ${remotelocation}: checking local build" sleep 0.5 - fn_print_error_nl "Checking for update: teamspeak.com: No logs with server version found" - fn_script_log_error "Checking for update: teamspeak.com: No logs with server version found" + fn_print_error_nl "Checking for update: ${remotelocation}: checking local build: no log files" + fn_script_log_error "No log file found" sleep 0.5 - fn_print_info_nl "Checking for update: teamspeak.com: Forcing server restart" - fn_script_log_info "Checking for update: teamspeak.com: Forcing server restart" + fn_print_info_nl "Checking for update: ${remotelocation}: checking local build: forcing server restart" + fn_script_log_info "Forcing server restart" sleep 0.5 exitbypass=1 command_stop.sh exitbypass=1 command_start.sh - sleep 0.5 - # Check again and exit on failure. - if [ ! -d "${serverfiles}/logs" ]||[ -z "$(find "${serverfiles}/logs/"* -name 'ts3server*_0.log')" ]; then - fn_print_fail_nl "Checking for update: teamspeak.com: Still No logs with server version found" - fn_script_log_fatal "Checking for update: teamspeak.com: Still No logs with server version found" - core_exit.sh - fi + totalseconds=0 + # Check again, allow time to generate logs. + while [ ! -d "${serverfiles}/logs" ]||[ -z "$(find "${serverfiles}/logs/"* -name 'ts3server*_0.log' 2> /dev/null)" ]; do + sleep 1 + fn_print_info "Checking for update: ${remotelocation}: checking local build: waiting for log file: ${totalseconds}" + if [ -v "${loopignore}" ]; then + loopignore=1 + fn_script_log_info "Waiting for log file to generate" + fi + + if [ "${totalseconds}" -gt "120" ]; then + localbuild="0" + fn_print_error "Checking for update: ${remotelocation}: waiting for log file: missing log file" + fn_script_log_error "Missing log file" + fn_script_log_error "Set localbuild to 0" + sleep 0.5 + fi + + totalseconds=$((totalseconds + 1)) + done fi - # Get current build from logs - currentbuild="$(cat "$(find "${serverfiles}/logs/"* -name "ts3server*_0.log" 2> /dev/null | sort | tail -1)" | grep -Eo "TeamSpeak 3 Server ((\.)?[0-9]{1,3}){1,3}\.[0-9]{1,3}" | grep -Eo "((\.)?[0-9]{1,3}){1,3}\.[0-9]{1,3}" | sort -V)" - if [ -z "${currentbuild}" ]; then - fn_print_error_nl "Checking for update: teamspeak.com: Current build version not found" - fn_script_log_error "Checking for update: teamspeak.com: Current build version not found" - sleep 0.5 - fn_print_info_nl "Checking for update: teamspeak.com: Forcing server restart" - fn_script_log_info "Checking for update: teamspeak.com: Forcing server restart" - exitbypass=1 - command_stop.sh - exitbypass=1 - command_start.sh - currentbuild="$(cat "$(find "${serverfiles}/logs/"* -name "ts3server*_0.log" 2> /dev/null | sort | tail -1)" | grep -Eo "TeamSpeak 3 Server ((\.)?[0-9]{1,3}){1,3}\.[0-9]{1,3}" | grep -Eo "((\.)?[0-9]{1,3}){1,3}\.[0-9]{1,3}" | sort -V)" - if [ -z "${currentbuild}" ]; then - fn_print_fail_nl "Checking for update: teamspeak.com: Current build version still not found" - fn_script_log_fatal "Checking for update: teamspeak.com: Current build version still not found" - core_exit.sh - fi + if [ -z "${localbuild}" ]; then + localbuild=$(cat $(find ./* -name "ts3server*_0.log" 2> /dev/null | sort | tail -1) | grep -Eo "TeamSpeak 3 Server ((\.)?[0-9]{1,3}){1,3}\.[0-9]{1,3}" | grep -Eo "((\.)?[0-9]{1,3}){1,3}\.[0-9]{1,3}") fi -} -fn_update_ts3_arch(){ -# Gets the teamspeak server architecture. -info_distro.sh -if [ "${arch}" == "x86_64" ]; then - ts3arch="amd64" -elif [ "${arch}" == "i386" ]||[ "${arch}" == "i686" ]; then - ts3arch="x86" -else - echo "" - fn_print_failure "Unknown or unsupported architecture: ${arch}" - fn_script_log_fatal "Unknown or unsupported architecture: ${arch}" - core_exit.sh -fi + if [ -z "${localbuild}" ]; then + # Gives time for var to generate. + end=$((SECONDS+120)) + totalseconds=0 + while [ "${SECONDS}" -lt "${end}" ]; do + fn_print_info "Checking for update: ${remotelocation}: checking local build: waiting for local build: ${totalseconds}" + if [ -z "${loopignore}" ]; then + loopignore=1 + fn_script_log_info "Waiting for local build to generate" + fi + localbuild=$(cat $(find ./* -name "ts3server*_0.log" 2> /dev/null | sort | tail -1) | grep -Eo "TeamSpeak 3 Server ((\.)?[0-9]{1,3}){1,3}\.[0-9]{1,3}" | grep -Eo "((\.)?[0-9]{1,3}){1,3}\.[0-9]{1,3}") + if [ "${localbuild}" ]; then + break + fi + sleep 1 + totalseconds=$((totalseconds + 1)) + done + fi + + if [ -z "${localbuild}" ]; then + localbuild="0" + fn_print_error "Checking for update: ${remotelocation}: waiting for local build: missing local build info" + fn_script_log_error "Missing local build info" + fn_script_log_error "Set localbuild to 0" + else + fn_print_ok "Checking for update: ${remotelocation}: checking local build" + fn_script_log_pass "Checking local build" + fi + sleep 0.5 } -fn_update_ts3_availablebuild(){ - # Gets latest build info. +fn_update_ts3_remotebuild(){ + # Gets remote build info. if [ "${arch}" == "x86_64" ]; then - availablebuild="$(${curlpath} -s 'https://www.teamspeak.com/versions/server.json' | jq -r '.linux.x86_64.version')" + remotebuild="$(${curlpath} -s "https://www.teamspeak.com/versions/server.json" | jq -r '.linux.x86_64.version')" elif [ "${arch}" == "x86" ]; then - availablebuild="$(${curlpath} -s 'https://www.teamspeak.com/versions/server.json' | jq -r '.linux.x86.version')" + remotebuild="$(${curlpath} -s "https://www.teamspeak.com/versions/server.json" | jq -r '.linux.x86.version')" fi - ts3_version_number="${availablebuild}" - # Checks if availablebuild variable has been set - if [ -v "${availablebuild}" ]||[ "${availablebuild}" == "null" ]; then - fn_print_fail "Checking for update: teamspeak.com" + if [ "${installer}" != "1" ]; then + fn_print_dots "Checking for update: ${remotelocation}: checking remote build" sleep 0.5 - fn_print_fail "Checking for update: teamspeak.com: Not returning version info" - fn_script_log_fatal "Checking for update: teamspeak.com: Not returning version info" - core_exit.sh - elif [ "${installer}" == "1" ]; then - : + # Checks if remotebuild variable has been set. + if [ -z "${remotebuild}" ]||[ "${remotebuild}" == "null" ]; then + fn_print_fail "Checking for update: ${remotelocation}: checking remote build" + fn_script_log_fatal "Checking remote build" + core_exit.sh + else + fn_print_ok "Checking for update: ${remotelocation}: checking remote build" + fn_script_log_pass "Checking remote build" + sleep 0.5 + fi else - fn_print_ok_nl "Checking for update: teamspeak.com" - fn_script_log_pass "Checking for update: teamspeak.com" - sleep 0.5 - fi + # Checks if remotebuild variable has been set. + if [ -z "${remotebuild}" ]||[ "${remotebuild}" == "null" ]; then + fn_print_failure "Unable to get remote build" + fn_script_log_fatal "Unable to get remote build" + core_exit.sh + fi + fi } fn_update_ts3_compare(){ - # Removes dots so if can compare version numbers - currentbuilddigit=$(echo "${currentbuild}" | tr -cd '[:digit:]') - availablebuilddigit=$(echo "${availablebuild}" | tr -cd '[:digit:]') - - if [ "${currentbuilddigit}" -lt "${availablebuilddigit}" ]; then - echo -e "\n" - echo -e "Update available:" + # Removes dots so if statement can compare version numbers. + fn_print_dots "Checking for update: ${remotelocation}" + sleep 0.5 + localbuilddigit=$(echo "${localbuild}" | tr -cd '[:digit:]') + remotebuilddigit=$(echo "${remotebuild}" | tr -cd '[:digit:]') + if [ "${localbuilddigit}" -ne "${remotebuilddigit}" ]||[ "${forceupdate}" == "1" ]; then + fn_print_ok_nl "Checking for update: ${remotelocation}" sleep 0.5 - echo -e " Current build: ${red}${currentbuild} ${ts3arch}${default}" - echo -e " Available build: ${green}${availablebuild} ${ts3arch}${default}" - echo -e "" + echo -en "\n" + echo -e "Update available" + echo -e "* Local build: ${red}${localbuild}${default}" + echo -e "* Remote build: ${green}${remotebuild}${default}" + fn_script_log_info "Update available" + fn_script_log_info "Local build: ${localbuild}" + fn_script_log_info "Remote build: ${remotebuild}" + fn_script_log_info "${localbuild} > ${remotebuild}" sleep 0.5 - echo -en "Applying update.\r" + echo -en "\n" + echo -en "applying update.\r" sleep 1 - echo -en "Applying update..\r" + echo -en "applying update..\r" sleep 1 - echo -en "Applying update...\r" + 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 server stopped. if [ "${status}" == "0" ]; then + exitbypass=1 fn_update_ts3_dl exitbypass=1 command_start.sh exitbypass=1 command_stop.sh + # If server started. else exitbypass=1 command_stop.sh + exitbypass=1 fn_update_ts3_dl exitbypass=1 command_start.sh @@ -157,27 +186,41 @@ fn_update_ts3_compare(){ 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}" + fn_print_ok_nl "Checking for update: ${remotelocation}" + sleep 0.5 + echo -en "\n" + echo -e "No update available" + echo -e "* Local build: ${green}${localbuild}${default}" + echo -e "* Remote build: ${green}${remotebuild}${default}" + fn_script_log_info "No update available" + fn_script_log_info "Local build: ${localbuild}" + fn_script_log_info "Remote build: ${remotebuild}" fi } -fn_update_ts3_arch +# Game server architecture. +info_distro.sh +if [ "${arch}" == "x86_64" ]; then + ts3arch="amd64" +elif [ "${arch}" == "i386" ]||[ "${arch}" == "i686" ]; then + ts3arch="x86" +else + fn_print_failure "Unknown or unsupported architecture: ${arch}" + fn_script_log_fatal "Unknown or unsupported architecture: ${arch}" + core_exit.sh +fi + +# The location where the builds are checked and downloaded. +remotelocation="teamspeak.com" + if [ "${installer}" == "1" ]; then - fn_update_ts3_availablebuild + fn_update_ts3_remotebuild fn_update_ts3_dl else - # Checks for server update from teamspeak.com using a mirror dl.4players.de. - fn_print_dots "Checking for update: teamspeak.com" - fn_script_log_info "Checking for update: teamspeak.com" + fn_print_dots "Checking for update: ${remotelocation}" + fn_script_log_info "Checking for update: ${remotelocation}" sleep 0.5 - fn_update_ts3_currentbuild - fn_update_ts3_availablebuild + fn_update_ts3_localbuild + fn_update_ts3_remotebuild fn_update_ts3_compare fi diff --git a/linuxgsm.sh b/linuxgsm.sh index 31b1ccd37..aee1af858 100755 --- a/linuxgsm.sh +++ b/linuxgsm.sh @@ -153,7 +153,7 @@ fn_install_menu_bash() { done < ${options} menu_options+=( "Cancel" ) select option in "${menu_options[@]}"; do - if [ -n "${option}" ] && [ "${option}" != "Cancel" ]; then + if [ -n "${option}" ]&&[ "${option}" != "Cancel" ]; then eval "$resultvar=\"${option/%\ */}\"" fi break diff --git a/tests/tests_fctrserver.sh b/tests/tests_fctrserver.sh index 7237f7d37..dc0d0b056 100644 --- a/tests/tests_fctrserver.sh +++ b/tests/tests_fctrserver.sh @@ -146,7 +146,7 @@ fn_install_menu_bash() { done < ${options} menu_options+=( "Cancel" ) select option in "${menu_options[@]}"; do - if [ -n "${option}" ] && [ "${option}" != "Cancel" ]; then + if [ -n "${option}" ]&&[ "${option}" != "Cancel" ]; then eval "$resultvar=\"${option/%\ */}\"" fi break diff --git a/tests/tests_jc2server.sh b/tests/tests_jc2server.sh index 7d2df1e49..573b2dd0e 100644 --- a/tests/tests_jc2server.sh +++ b/tests/tests_jc2server.sh @@ -146,7 +146,7 @@ fn_install_menu_bash() { done < ${options} menu_options+=( "Cancel" ) select option in "${menu_options[@]}"; do - if [ -n "${option}" ] && [ "${option}" != "Cancel" ]; then + if [ -n "${option}" ]&&[ "${option}" != "Cancel" ]; then eval "$resultvar=\"${option/%\ */}\"" fi break diff --git a/tests/tests_ts3server.sh b/tests/tests_ts3server.sh index 235ed0fe0..425ae193e 100644 --- a/tests/tests_ts3server.sh +++ b/tests/tests_ts3server.sh @@ -146,7 +146,7 @@ fn_install_menu_bash() { done < ${options} menu_options+=( "Cancel" ) select option in "${menu_options[@]}"; do - if [ -n "${option}" ] && [ "${option}" != "Cancel" ]; then + if [ -n "${option}" ]&&[ "${option}" != "Cancel" ]; then eval "$resultvar=\"${option/%\ */}\"" fi break From 208c342bcccd893754674e67e03c67ccca4c6654 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Mon, 1 Apr 2019 14:49:04 +0100 Subject: [PATCH 012/534] corrected message --- 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 7aedced1e..c4e7947ef 100644 --- a/lgsm/functions/check_executable.sh +++ b/lgsm/functions/check_executable.sh @@ -9,7 +9,7 @@ local function_selfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" # Check if executable exists if [ ! -f "${executabledir}/${execname}" ]; then - fn_print_fatal_nl "executable was not found:" + fn_print_fail_nl "executable was not found:" echo " * ${executabledir}/${execname}" if [ -d "${lgsmlogdir}" ]; then fn_script_log_fatal "Executable was not found: ${executabledir}/${execname}" From 98e07016431614d65432f10e03da970a7726dd31 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Mon, 1 Apr 2019 22:45:35 +0100 Subject: [PATCH 013/534] update linuxgsm version --- linuxgsm.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/linuxgsm.sh b/linuxgsm.sh index aee1af858..d7a274693 100755 --- a/linuxgsm.sh +++ b/linuxgsm.sh @@ -20,7 +20,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="190217" +version="190301" shortname="core" gameservername="core" rootdir="$(dirname "$(readlink -f "${BASH_SOURCE[0]}")")" From b6f37a912e7eaf7e33f12da553a3193dcaaf266e Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Mon, 1 Apr 2019 22:56:56 +0100 Subject: [PATCH 014/534] Removed waffle button --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 7466cc0f9..84743e049 100644 --- a/README.md +++ b/README.md @@ -3,7 +3,7 @@ LinuxGSM - [![LinuxGSM](https://img.shields.io/badge/-LinuxGSM-2b2b2b.svg?logo=data%3Aimage%2Fpng%3Bbase64%2CiVBORw0KGgoAAAANSUhEUgAAACsAAABACAYAAACDbo5ZAAAGD0lEQVR4AcWYa2wUVRvHz75c2vJ2disXoUBEVIioRAx%2BMIFA1IRwUS6KCCiIKBrvhEYiiGm5iBgk8QOGEgUUDYTttmVZWFr2UmwURS6iYAoCtmisElSsdHdbkT7%2BTzoNy%2BGc2dm54C%2F5Rdkz85x%2FZ86ZOXOYXYhIg3Phx%2FA4PAcv6f%2Btg5vhHJjP3EcZsgsshufJHH%2FAJbDztQ7aG35J1vgCXn%2BtgvrgEbLHYei9FmE3kDOUuh10OGwjZ7gEh7kZ9gNyllK3gnrg7%2BQs56DHjbCDyB0GuRF2ArnDeDfCziF3mO1G2FfJHRa4EXYpuUOxG2GXkzuUuBH2TXKH5W6ELSV3eM%2BNsOUk5yQcAY8p2uvgSPitor3MjbB1UOQXOFBvHwpbhPYWOExvL4SNUOQ7p4P2JTlzhOPmCu0vCu1PQpE2WOhk2MdJjk9y7HNwP1wEPUJbAcmZ6WTYrYolnifbxZBiibnFySHQCkUaLdY7C0V4%2FT5OhF1JcuIW6%2B0lOcvsBi2Ezao3j8Ov7Quwj52w60jNKIs1R5GatVaDDoEXSU4D7GSxbidYT3IuwjusFK0mNUVMwaZNNbl%2B%2F87hoVCom0HthaQmnG3QB0lNPcxlCvz%2B0GtlZTuorCxYYlA%2FDzbY%2FnrAgV3hCVLzCDMgEAi9wMMi9IIM%2FUwnNXWwi5mwRaSmmmXA798xq%2F3Khp420VeE1LyS6eQeBhttSXgzywCCToIUCOyYZvKLOWWwkdfd6ORVpGYJM0F5efDe9mEQHGty2BWTmhVGO4PNBmOoKzMBxmo%2FhD25dWvljSbD5hjMkb9gT9lJq63Mzi1bKkbjloc7xBWtwiRrDASCVRi%2FRxA8if%2BvrawMTzYI%2FACpeUv2KFFtDcUyTKilCHcis8G1Ga7wHpLzG8wVFs1K7jaeUKHZfIxmkj9%2FM4S9x9RGiMEudo0QbCVu9Xqn5PWEwLUk5%2FP0iaXac53I0kAH9Sau4m54lo%2FdTMfyekLYKQZ7ub34AbMMlmw5irC2VYTN0fuVMYMf8JHxJ7L7YYXAlSRnI2%2F8RtH4siTsDMz%2BZ5yS15OEXUxyDjGD1%2BvEq8MG16CDzY6JepKwT6geYbzxb0XjGMl7vwGSgzZIwo4nOa1M8Yr9Afb%2Fj8L21%2FsXaeaNZ2A6KTiEASph%2F0vF80cn4tokqu79fzfCUk2vfF4%2FFdFGEjGPHvg2yWrsDG%2F4%2BqpZB8jPOiXjWk0y5iXdM3XhKUvxBTA9UvHuvNPh%2Bzb%2BWj10z6nwuHWBbQFMvNCjKnn7qd1jS%2Fnx9VX3b6jC%2BbwOr5eMe3%2B83IcW4%2F3qgT%2BUTbA9srGaiHsn8AKiF6Ld%2FxF%2FOx6eeAJXabvK78MTTornNMd6XJTVR7%2Fj9bBjhFxV%2FMc1kJOAy2AeA%2FgrV4mFVDZFCqm8rEJ6qysCAWqK9iaztRJRbWXa4moFTELOav7jY%2FqAvoXp0Gc9NX7bIZl17%2FZl0rC1wRLeno0NvP%2B0CTcYNnS8wW6CtzNANaxzKqo9hRNOQ8rGo7tmSsMe2zWdt2frqVRcm5s2fofCgawDNHRNxnyfqgsYez4y4ADCjRM9H73hsNWafILTQdaFiSTj%2BQ%2FxA6yH7d%2BCmR8XbYr0a7VTF2N4siSsb5qdos3R6%2FjGxpULFfw7EfORnbrI9TAToX0sD40%2F2ylcGdh2Rdhg%2BSf2gka9jRTqK9%2BGwgHz7RTfVbHxirDhivdthYUvMRX8aYAD9lstvi%2B0aDL2DUZ0eCBUNNVG0IP65FLTWqPdiqdC0koHTVXe7iyNRG23QotBEy1RbTAzQyrmnYUT2rLsoA13JpcB4eVC2daBM1g2JGLekmwf5On7EJfngfZTNnVSce8bFjaTmQdvs%2FXmO%2FJVpoXdx3RSUe9O00Fj3nUdy0RLgRHiHXOPGW1h2uKZ07c9rG%2Bxyefp23pQeyBIEQoavYlakrG8fnrY5yHn2fbxXzAgw7m8bT5zkkSk4C7cpmOK21esB%2FXAQ5DzFfTo43%2BF%2FDzf0eZ4wZ3MDSjMcvD6nIeOahGgia%2FyU3HforTPkWkwnakdn0cI9jqfbPjD%2FuQLJr6644snlgX%2FApOMoyd1R5%2FxAAAAAElFTkSuQmCC)](https://linuxgsm.com) [![Under Development](https://badge.waffle.io/GameServerManagers/LinuxGSM.svg?label=status:%20in%20progress&title=In%20Progress)](http://waffle.io/GameServerManagers/LinuxGSM) [![Build Status](https://travis-ci.com/GameServerManagers/LinuxGSM.svg?branch=master)](https://travis-ci.com/GameServerManagers/LinuxGSM) [![Codacy Badge](https://api.codacy.com/project/badge/Grade/3e98be27840043a090c3ab6e35db44b0)](https://app.codacy.com/app/GameServerManagers/LinuxGSM?utm_source=github.com&utm_medium=referral&utm_content=GameServerManagers/LinuxGSM&utm_campaign=Badge_Grade_Dashboard) [![Discord](https://discordapp.com/api/guilds/127498813903601664/widget.png?style=shield)](https://linuxgsm.com/discord) [![MIT Licence](https://badges.frapsoft.com/os/mit/mit.svg?v=103)](https://github.com/GameServerManagers/LinuxGSM/blob/master/LICENSE) [![made-with-bash](https://img.shields.io/badge/-Made%20with%20Bash-1f425f.svg?logo=image%2Fpng%3Bbase64%2CiVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyZpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw%2FeHBhY2tldCBiZWdpbj0i77u%2FIiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8%2BIDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNi1jMTExIDc5LjE1ODMyNSwgMjAxNS8wOS8xMC0wMToxMDoyMCAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENDIDIwMTUgKFdpbmRvd3MpIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOkE3MDg2QTAyQUZCMzExRTVBMkQxRDMzMkJDMUQ4RDk3IiB4bXBNTTpEb2N1bWVudElEPSJ4bXAuZGlkOkE3MDg2QTAzQUZCMzExRTVBMkQxRDMzMkJDMUQ4RDk3Ij4gPHhtcE1NOkRlcml2ZWRGcm9tIHN0UmVmOmluc3RhbmNlSUQ9InhtcC5paWQ6QTcwODZBMDBBRkIzMTFFNUEyRDFEMzMyQkMxRDhEOTciIHN0UmVmOmRvY3VtZW50SUQ9InhtcC5kaWQ6QTcwODZBMDFBRkIzMTFFNUEyRDFEMzMyQkMxRDhEOTciLz4gPC9yZGY6RGVzY3JpcHRpb24%2BIDwvcmRmOlJERj4gPC94OnhtcG1ldGE%2BIDw%2FeHBhY2tldCBlbmQ9InIiPz6lm45hAAADkklEQVR42qyVa0yTVxzGn7d9Wy03MS2ii8s%2BeokYNQSVhCzOjXZOFNF4jx%2BMRmPUMEUEqVG36jo2thizLSQSMd4N8ZoQ8RKjJtooaCpK6ZoCtRXKpRempbTv5ey83bhkAUphz8fznvP8znn%2B%2F3NeEEJgNBoRRSmz0ub%2FfuxEacBg%2FDmYtiCjgo5NG2mBXq%2BH5I1ogMRk9Zbd%2BQU2e1ML6VPLOyf5tvBQ8yT1lG10imxsABm7SLs898GTpyYynEzP60hO3trHDKvMigUwdeaceacqzp7nOI4n0SSIIjl36ao4Z356OV07fSQAk6xJ3XGg%2BLCr1d1OYlVHp4eUHPnerU79ZA%2F1kuv1JQMAg%2BE4O2P23EumF3VkvHprsZKMzKwbRUXFEyTvSIEmTVbrysp%2BWr8wfQHGK6WChVa3bKUmdWou%2BjpArdGkzZ41c1zG%2Fu5uGH4swzd561F%2BuhIT4%2BLnSuPsv9%2BJKIpjNr9dXYOyk7%2FBZrcjIT4eCnoKgedJP4BEqhG77E3NKP31FO7cfQA5K0dSYuLgz2TwCWJSOBzG6crzKK%2BohNfni%2Bx6OMUMMNe%2Fgf7ocbw0v0acKg6J8Ql0q%2BT%2FAXR5PNi5dz9c71upuQqCKFAD%2BYhrZLEAmpodaHO3Qy6TI3NhBpbrshGtOWKOSMYwYGQM8nJzoFJNxP2HjyIQho4PewK6hBktoDcUwtIln4PjOWzflQ%2Be5yl0yCCYgYikTclGlxadio%2BBQCSiW1UXoVGrKYwH4RgMrjU1HAB4vR6LzWYfFUCKxfS8Ftk5qxHoCUQAUkRJaSEokkV6Y%2F%2BJUOC4hn6A39NVXVBYeNP8piH6HeA4fPbpdBQV5KOx0QaL1YppX3Jgk0TwH2Vg6S3u%2BdB91%2B%2FpuNYPYFl5uP5V7ZqvsrX7jxqMXR6ff3gCQSTzFI0a1TX3wIs8ul%2Bq4HuWAAiM39vhOuR1O1fQ2gT%2F26Z8Z5vrl2OHi9OXZn995nLV9aFfS6UC9JeJPfuK0NBohWpCHMSAAsFe74WWP%2BvT25wtP9Bpob6uGqqyDnOtaeumjRu%2ByFu36VntK%2FPA5umTJeUtPWZSU9BCgud661odVp3DZtkc7AnYR33RRC708PrVi1larW7XwZIjLnd7R6SgSqWSNjU1B3F72pz5TZbXmX5vV81Yb7Lg7XT%2FUXriu8XLVqw6c6XqWnBKiiYU%2BMt3wWF7u7i91XlSEITwSAZ%2FCzAAHsJVbwXYFFEAAAAASUVORK5CYII%3D)](https://www.gnu.org/software/bash/) + [![LinuxGSM](https://img.shields.io/badge/-LinuxGSM-2b2b2b.svg?logo=data%3Aimage%2Fpng%3Bbase64%2CiVBORw0KGgoAAAANSUhEUgAAACsAAABACAYAAACDbo5ZAAAGD0lEQVR4AcWYa2wUVRvHz75c2vJ2disXoUBEVIioRAx%2BMIFA1IRwUS6KCCiIKBrvhEYiiGm5iBgk8QOGEgUUDYTttmVZWFr2UmwURS6iYAoCtmisElSsdHdbkT7%2BTzoNy%2BGc2dm54C%2F5Rdkz85x%2FZ86ZOXOYXYhIg3Phx%2FA4PAcv6f%2Btg5vhHJjP3EcZsgsshufJHH%2FAJbDztQ7aG35J1vgCXn%2BtgvrgEbLHYei9FmE3kDOUuh10OGwjZ7gEh7kZ9gNyllK3gnrg7%2BQs56DHjbCDyB0GuRF2ArnDeDfCziF3mO1G2FfJHRa4EXYpuUOxG2GXkzuUuBH2TXKH5W6ELSV3eM%2BNsOUk5yQcAY8p2uvgSPitor3MjbB1UOQXOFBvHwpbhPYWOExvL4SNUOQ7p4P2JTlzhOPmCu0vCu1PQpE2WOhk2MdJjk9y7HNwP1wEPUJbAcmZ6WTYrYolnifbxZBiibnFySHQCkUaLdY7C0V4%2FT5OhF1JcuIW6%2B0lOcvsBi2Ezao3j8Ov7Quwj52w60jNKIs1R5GatVaDDoEXSU4D7GSxbidYT3IuwjusFK0mNUVMwaZNNbl%2B%2F87hoVCom0HthaQmnG3QB0lNPcxlCvz%2B0GtlZTuorCxYYlA%2FDzbY%2FnrAgV3hCVLzCDMgEAi9wMMi9IIM%2FUwnNXWwi5mwRaSmmmXA798xq%2F3Khp420VeE1LyS6eQeBhttSXgzywCCToIUCOyYZvKLOWWwkdfd6ORVpGYJM0F5efDe9mEQHGty2BWTmhVGO4PNBmOoKzMBxmo%2FhD25dWvljSbD5hjMkb9gT9lJq63Mzi1bKkbjloc7xBWtwiRrDASCVRi%2FRxA8if%2BvrawMTzYI%2FACpeUv2KFFtDcUyTKilCHcis8G1Ga7wHpLzG8wVFs1K7jaeUKHZfIxmkj9%2FM4S9x9RGiMEudo0QbCVu9Xqn5PWEwLUk5%2FP0iaXac53I0kAH9Sau4m54lo%2FdTMfyekLYKQZ7ub34AbMMlmw5irC2VYTN0fuVMYMf8JHxJ7L7YYXAlSRnI2%2F8RtH4siTsDMz%2BZ5yS15OEXUxyDjGD1%2BvEq8MG16CDzY6JepKwT6geYbzxb0XjGMl7vwGSgzZIwo4nOa1M8Yr9Afb%2Fj8L21%2FsXaeaNZ2A6KTiEASph%2F0vF80cn4tokqu79fzfCUk2vfF4%2FFdFGEjGPHvg2yWrsDG%2F4%2BqpZB8jPOiXjWk0y5iXdM3XhKUvxBTA9UvHuvNPh%2Bzb%2BWj10z6nwuHWBbQFMvNCjKnn7qd1jS%2Fnx9VX3b6jC%2BbwOr5eMe3%2B83IcW4%2F3qgT%2BUTbA9srGaiHsn8AKiF6Ld%2FxF%2FOx6eeAJXabvK78MTTornNMd6XJTVR7%2Fj9bBjhFxV%2FMc1kJOAy2AeA%2FgrV4mFVDZFCqm8rEJ6qysCAWqK9iaztRJRbWXa4moFTELOav7jY%2FqAvoXp0Gc9NX7bIZl17%2FZl0rC1wRLeno0NvP%2B0CTcYNnS8wW6CtzNANaxzKqo9hRNOQ8rGo7tmSsMe2zWdt2frqVRcm5s2fofCgawDNHRNxnyfqgsYez4y4ADCjRM9H73hsNWafILTQdaFiSTj%2BQ%2FxA6yH7d%2BCmR8XbYr0a7VTF2N4siSsb5qdos3R6%2FjGxpULFfw7EfORnbrI9TAToX0sD40%2F2ylcGdh2Rdhg%2BSf2gka9jRTqK9%2BGwgHz7RTfVbHxirDhivdthYUvMRX8aYAD9lstvi%2B0aDL2DUZ0eCBUNNVG0IP65FLTWqPdiqdC0koHTVXe7iyNRG23QotBEy1RbTAzQyrmnYUT2rLsoA13JpcB4eVC2daBM1g2JGLekmwf5On7EJfngfZTNnVSce8bFjaTmQdvs%2FXmO%2FJVpoXdx3RSUe9O00Fj3nUdy0RLgRHiHXOPGW1h2uKZ07c9rG%2Bxyefp23pQeyBIEQoavYlakrG8fnrY5yHn2fbxXzAgw7m8bT5zkkSk4C7cpmOK21esB%2FXAQ5DzFfTo43%2BF%2FDzf0eZ4wZ3MDSjMcvD6nIeOahGgia%2FyU3HforTPkWkwnakdn0cI9jqfbPjD%2FuQLJr6644snlgX%2FApOMoyd1R5%2FxAAAAAElFTkSuQmCC)](https://linuxgsm.com) [![Build Status](https://travis-ci.com/GameServerManagers/LinuxGSM.svg?branch=master)](https://travis-ci.com/GameServerManagers/LinuxGSM) [![Codacy Badge](https://api.codacy.com/project/badge/Grade/3e98be27840043a090c3ab6e35db44b0)](https://app.codacy.com/app/GameServerManagers/LinuxGSM?utm_source=github.com&utm_medium=referral&utm_content=GameServerManagers/LinuxGSM&utm_campaign=Badge_Grade_Dashboard) [![Discord](https://discordapp.com/api/guilds/127498813903601664/widget.png?style=shield)](https://linuxgsm.com/discord) [![MIT Licence](https://badges.frapsoft.com/os/mit/mit.svg?v=103)](https://github.com/GameServerManagers/LinuxGSM/blob/master/LICENSE) [![made-with-bash](https://img.shields.io/badge/-Made%20with%20Bash-1f425f.svg?logo=image%2Fpng%3Bbase64%2CiVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyZpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw%2FeHBhY2tldCBiZWdpbj0i77u%2FIiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8%2BIDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNi1jMTExIDc5LjE1ODMyNSwgMjAxNS8wOS8xMC0wMToxMDoyMCAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENDIDIwMTUgKFdpbmRvd3MpIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOkE3MDg2QTAyQUZCMzExRTVBMkQxRDMzMkJDMUQ4RDk3IiB4bXBNTTpEb2N1bWVudElEPSJ4bXAuZGlkOkE3MDg2QTAzQUZCMzExRTVBMkQxRDMzMkJDMUQ4RDk3Ij4gPHhtcE1NOkRlcml2ZWRGcm9tIHN0UmVmOmluc3RhbmNlSUQ9InhtcC5paWQ6QTcwODZBMDBBRkIzMTFFNUEyRDFEMzMyQkMxRDhEOTciIHN0UmVmOmRvY3VtZW50SUQ9InhtcC5kaWQ6QTcwODZBMDFBRkIzMTFFNUEyRDFEMzMyQkMxRDhEOTciLz4gPC9yZGY6RGVzY3JpcHRpb24%2BIDwvcmRmOlJERj4gPC94OnhtcG1ldGE%2BIDw%2FeHBhY2tldCBlbmQ9InIiPz6lm45hAAADkklEQVR42qyVa0yTVxzGn7d9Wy03MS2ii8s%2BeokYNQSVhCzOjXZOFNF4jx%2BMRmPUMEUEqVG36jo2thizLSQSMd4N8ZoQ8RKjJtooaCpK6ZoCtRXKpRempbTv5ey83bhkAUphz8fznvP8znn%2B%2F3NeEEJgNBoRRSmz0ub%2FfuxEacBg%2FDmYtiCjgo5NG2mBXq%2BH5I1ogMRk9Zbd%2BQU2e1ML6VPLOyf5tvBQ8yT1lG10imxsABm7SLs898GTpyYynEzP60hO3trHDKvMigUwdeaceacqzp7nOI4n0SSIIjl36ao4Z356OV07fSQAk6xJ3XGg%2BLCr1d1OYlVHp4eUHPnerU79ZA%2F1kuv1JQMAg%2BE4O2P23EumF3VkvHprsZKMzKwbRUXFEyTvSIEmTVbrysp%2BWr8wfQHGK6WChVa3bKUmdWou%2BjpArdGkzZ41c1zG%2Fu5uGH4swzd561F%2BuhIT4%2BLnSuPsv9%2BJKIpjNr9dXYOyk7%2FBZrcjIT4eCnoKgedJP4BEqhG77E3NKP31FO7cfQA5K0dSYuLgz2TwCWJSOBzG6crzKK%2BohNfni%2Bx6OMUMMNe%2Fgf7ocbw0v0acKg6J8Ql0q%2BT%2FAXR5PNi5dz9c71upuQqCKFAD%2BYhrZLEAmpodaHO3Qy6TI3NhBpbrshGtOWKOSMYwYGQM8nJzoFJNxP2HjyIQho4PewK6hBktoDcUwtIln4PjOWzflQ%2Be5yl0yCCYgYikTclGlxadio%2BBQCSiW1UXoVGrKYwH4RgMrjU1HAB4vR6LzWYfFUCKxfS8Ftk5qxHoCUQAUkRJaSEokkV6Y%2F%2BJUOC4hn6A39NVXVBYeNP8piH6HeA4fPbpdBQV5KOx0QaL1YppX3Jgk0TwH2Vg6S3u%2BdB91%2B%2FpuNYPYFl5uP5V7ZqvsrX7jxqMXR6ff3gCQSTzFI0a1TX3wIs8ul%2Bq4HuWAAiM39vhOuR1O1fQ2gT%2F26Z8Z5vrl2OHi9OXZn995nLV9aFfS6UC9JeJPfuK0NBohWpCHMSAAsFe74WWP%2BvT25wtP9Bpob6uGqqyDnOtaeumjRu%2ByFu36VntK%2FPA5umTJeUtPWZSU9BCgud661odVp3DZtkc7AnYR33RRC708PrVi1larW7XwZIjLnd7R6SgSqWSNjU1B3F72pz5TZbXmX5vV81Yb7Lg7XT%2FUXriu8XLVqw6c6XqWnBKiiYU%2BMt3wWF7u7i91XlSEITwSAZ%2FCzAAHsJVbwXYFFEAAAAASUVORK5CYII%3D)](https://www.gnu.org/software/bash/) [LinuxGSM](https://linuxgsm.com) is the command line tool for quick, simple deployment and management of dedicated game servers. From 6ee091b5a7b549b0ef7eee900ab663c479fc53e1 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Mon, 1 Apr 2019 23:11:55 +0100 Subject: [PATCH 015/534] codacy: Use "${var:?}" to ensure this never expands to /* . --- 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 838867f0f..3018dcf13 100644 --- a/lgsm/functions/core_dl.sh +++ b/lgsm/functions/core_dl.sh @@ -25,7 +25,7 @@ local function_selfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" fn_clear_tmp(){ echo -en "clearing LinuxGSM tmp directory..." if [ -d "${tmpdir}" ]; then - rm -rf "${tmpdir}/"* + rm -rf "${tmpdir:?}/"* local exitcode=$? if [ ${exitcode} -eq 0 ]; then fn_print_ok_eol_nl From 4e81d81c31c378647366edfab01c3236d91c3407 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Mon, 1 Apr 2019 23:15:21 +0100 Subject: [PATCH 016/534] codacy: Declare and assign separately to avoid masking return values. --- lgsm/functions/update_mta.sh | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/lgsm/functions/update_mta.sh b/lgsm/functions/update_mta.sh index dc04df5b0..cdd834322 100644 --- a/lgsm/functions/update_mta.sh +++ b/lgsm/functions/update_mta.sh @@ -105,9 +105,9 @@ fn_update_mta_localbuild(){ fn_update_mta_remotebuild(){ # Gets remote build info. - local majorversion="$(curl -s https://raw.githubusercontent.com/multitheftauto/mtasa-blue/master/Server/version.h | grep "#define MTASA_VERSION_MAJOR" | awk '{ print $3 }' | sed 's/\r//g')" - local minorversion="$(curl -s https://raw.githubusercontent.com/multitheftauto/mtasa-blue/master/Server/version.h | grep "#define MTASA_VERSION_MINOR" | awk '{ print $3 }' | sed 's/\r//g')" - local maintenanceversion="$(curl -s https://raw.githubusercontent.com/multitheftauto/mtasa-blue/master/Server/version.h | grep "#define MTASA_VERSION_MAINTENANCE" | awk '{ print $3 }' | sed 's/\r//g')" + majorversion="$(curl -s https://raw.githubusercontent.com/multitheftauto/mtasa-blue/master/Server/version.h | grep "#define MTASA_VERSION_MAJOR" | awk '{ print $3 }' | sed 's/\r//g')" + minorversion="$(curl -s https://raw.githubusercontent.com/multitheftauto/mtasa-blue/master/Server/version.h | grep "#define MTASA_VERSION_MINOR" | awk '{ print $3 }' | sed 's/\r//g')" + maintenanceversion="$(curl -s https://raw.githubusercontent.com/multitheftauto/mtasa-blue/master/Server/version.h | grep "#define MTASA_VERSION_MAINTENANCE" | awk '{ print $3 }' | sed 's/\r//g')" remotebuild="${majorversion}.${minorversion}.${maintenanceversion}" if [ "${installer}" != "1" ]; then fn_print_dots "Checking for update: ${remotelocation}: checking remote build" From 6ea05a3d85ef99088b00781a13412ab4d4100996 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Mon, 1 Apr 2019 23:16:09 +0100 Subject: [PATCH 017/534] codacy: Declare and assign separately to avoid masking return values. --- lgsm/functions/update_ts3.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lgsm/functions/update_ts3.sh b/lgsm/functions/update_ts3.sh index 2defd8abd..e64bd8f3a 100644 --- a/lgsm/functions/update_ts3.sh +++ b/lgsm/functions/update_ts3.sh @@ -10,9 +10,9 @@ local function_selfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" fn_update_ts3_dl(){ if [ "${ts3arch}" == "amd64" ]; then - local remotebuildurl=$(${curlpath} -s 'https://www.teamspeak.com/versions/server.json' | jq -r '.linux.x86_64.mirrors."teamspeak.com"') + remotebuildurl=$(${curlpath} -s 'https://www.teamspeak.com/versions/server.json' | jq -r '.linux.x86_64.mirrors."teamspeak.com"') elif [ "${ts3arch}" == "x86" ]; then - local remotebuildurl=$(${curlpath} -s 'https://www.teamspeak.com/versions/server.json' | jq -r '.linux.x86.mirrors."teamspeak.com"') + remotebuildurl=$(${curlpath} -s 'https://www.teamspeak.com/versions/server.json' | jq -r '.linux.x86.mirrors."teamspeak.com"') fi fn_fetch_file "${remotebuildurl}" "${tmpdir}" "teamspeak3-server_linux_${ts3arch}-${remotebuild}.tar.bz2" fn_dl_extract "${tmpdir}" "teamspeak3-server_linux_${ts3arch}-${remotebuild}.tar.bz2" "${tmpdir}" From 5c1741a5f9a62f07a9770becee77837063aa28a7 Mon Sep 17 00:00:00 2001 From: BogdanWDK Date: Tue, 2 Apr 2019 13:15:40 +0100 Subject: [PATCH 018/534] Update update_factorio.sh Specify which version to be downloaded in branch Issue: https://github.com/GameServerManagers/LinuxGSM/issues/2252 --- lgsm/functions/update_factorio.sh | 2 ++ 1 file changed, 2 insertions(+) diff --git a/lgsm/functions/update_factorio.sh b/lgsm/functions/update_factorio.sh index d01013224..cde4b35e6 100644 --- a/lgsm/functions/update_factorio.sh +++ b/lgsm/functions/update_factorio.sh @@ -153,6 +153,8 @@ if [ "${branch}" == "stable" ]; then downloadbranch="stable" elif [ "${branch}" == "experimental" ]; then downloadbranch="latest" +else + downloadbranch="${branch}" fi if [ "${installer}" == "1" ]; then From 4f2df835506fd9f82b4b1b93ff3c481ab388ba11 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Tue, 2 Apr 2019 15:47:14 +0100 Subject: [PATCH 019/534] fix(travis): fixed trusty being used instead of xential --- .travis.yml | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/.travis.yml b/.travis.yml index ad13083c9..0074089ee 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,8 +1,7 @@ -language: bash node_js + +language: node_js dist: xenial -sudo: required -node_js: - - 10 + before_script: - curl -L "https://storage.googleapis.com/google-code-archive-downloads/v2/code.google.com/shunit2/shunit2-2.1.6.tgz" | tar zx install: @@ -42,4 +41,4 @@ jobs: - # stage name not required script: bash tests/tests_ts3server.sh - # stage name not required - script: bash tests/tests_shellcheck.sh \ No newline at end of file + script: bash tests/tests_shellcheck.sh From c1535481f0a5bb450ef5e2f687d5da3c4027c9e6 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Tue, 2 Apr 2019 15:52:33 +0100 Subject: [PATCH 020/534] re-added node 10 --- .travis.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.travis.yml b/.travis.yml index 0074089ee..0a90bd779 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,6 +1,8 @@ language: node_js dist: xenial +node_js: + - 10 before_script: - curl -L "https://storage.googleapis.com/google-code-archive-downloads/v2/code.google.com/shunit2/shunit2-2.1.6.tgz" | tar zx From 7edca8a44fe636b289e23286222269444a9f520f Mon Sep 17 00:00:00 2001 From: frisasky1 <49201678+frisasky1@users.noreply.github.com> Date: Tue, 2 Apr 2019 22:58:01 +0800 Subject: [PATCH 021/534] fix mta download url --- lgsm/functions/update_mta.sh | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/lgsm/functions/update_mta.sh b/lgsm/functions/update_mta.sh index cdd834322..a2536f0b7 100644 --- a/lgsm/functions/update_mta.sh +++ b/lgsm/functions/update_mta.sh @@ -9,11 +9,11 @@ local commandaction="Update" 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_fetch_file "http://linux.mtasa.com/dl/multitheftauto_linux_x64.tar.gz" "${tmpdir}" "multitheftauto_linux_x64.tar.gz" + mkdir "${tmpdir}/multitheftauto_linux_x64" + fn_dl_extract "${tmpdir}" "multitheftauto_linux_x64.tar.gz" "${tmpdir}/multitheftauto_linux_x64" echo -e "copying to ${serverfiles}...\c" - cp -R "${tmpdir}/multitheftauto_linux_x64-${fullversion}/multitheftauto_linux_x64-${fullversion}/"* "${serverfiles}" + cp -R "${tmpdir}/multitheftauto_linux_x64/multitheftauto_linux_x64/"* "${serverfiles}" local exitcode=$? if [ "${exitcode}" == "0" ]; then fn_print_ok_eol_nl From 3f446358d07270af3f68eaa0f086f65089a7835f Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Tue, 2 Apr 2019 22:39:49 +0100 Subject: [PATCH 022/534] tidy --- .travis.yml | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/.travis.yml b/.travis.yml index 0a90bd779..39bef46e4 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,5 +1,4 @@ - -language: node_js +language: bash node_js dist: xenial node_js: - 10 From 0a26d8a41a2d394c61dfa20558e4d13fe3178359 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Thu, 4 Apr 2019 19:38:40 +0100 Subject: [PATCH 023/534] fix(mcserver): fix syntax error with localbuild #2257 --- lgsm/functions/update_minecraft.sh | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/lgsm/functions/update_minecraft.sh b/lgsm/functions/update_minecraft.sh index 795d3fbfc..02b2b8c12 100644 --- a/lgsm/functions/update_minecraft.sh +++ b/lgsm/functions/update_minecraft.sh @@ -63,7 +63,7 @@ fn_update_minecraft_localbuild(){ fn_script_log_error "Set localbuild to 0" sleep 0.5 fi - + totalseconds=$((totalseconds + 1)) done fi @@ -74,15 +74,15 @@ fn_update_minecraft_localbuild(){ if [ -z "${localbuild}" ]; then # Gives time for var to generate. - end=$((SECONDS+120)) + end="$(SECONDS+120)" totalseconds=0 while [ "${SECONDS}" -lt "${end}" ]; do fn_print_info "Checking for update: ${remotelocation}: checking local build: waiting for local build: ${totalseconds}" if [ -z "${loopignore}" ]; then loopignore=1 fn_script_log_info "Waiting for local build to generate" - fi - localbuild=$(cat "${serverfiles}/logs/latest.log" 2> /dev/null | grep version | grep -Eo '((\.)?[0-9]{1,3}){1,3}\.[0-9]{1,3}') grep -Eo "TeamSpeak 3 Server ((\.)?[0-9]{1,3}){1,3}\.[0-9]{1,3}" | grep -Eo "((\.)?[0-9]{1,3}){1,3}\.[0-9]{1,3}") + fi + localbuild=$(cat "${serverfiles}/logs/latest.log" 2> /dev/null | grep version | grep -Eo '((\.)?[0-9]{1,3}){1,3}\.[0-9]{1,3}' | grep -Eo "TeamSpeak 3 Server ((\.)?[0-9]{1,3}){1,3}\.[0-9]{1,3}" | grep -Eo "((\.)?[0-9]{1,3}){1,3}\.[0-9]{1,3}") if [ "${localbuild}" ]; then break fi @@ -90,7 +90,7 @@ fn_update_minecraft_localbuild(){ totalseconds=$((totalseconds + 1)) done fi - + if [ -z "${localbuild}" ]; then localbuild="0" fn_print_error "Checking for update: ${remotelocation}: waiting for local build: missing local build info" @@ -126,7 +126,7 @@ fn_update_minecraft_remotebuild(){ fn_script_log_fatal "Unable to get remote build" core_exit.sh fi - fi + fi } fn_update_minecraft_compare(){ From 70edcb2a3d820f08d17c5e053443255f3cc656a1 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Sun, 7 Apr 2019 17:49:53 +0100 Subject: [PATCH 024/534] feat(docs): PR will now request GitHub email for co-author --- PULL_REQUEST_TEMPLATE.md | 43 ++++++++++++++++++++++++++++------------ 1 file changed, 30 insertions(+), 13 deletions(-) diff --git a/PULL_REQUEST_TEMPLATE.md b/PULL_REQUEST_TEMPLATE.md index d04485f45..f139c2cc0 100644 --- a/PULL_REQUEST_TEMPLATE.md +++ b/PULL_REQUEST_TEMPLATE.md @@ -2,22 +2,39 @@ Please include a summary of the change and which issue is fixed. -Fixes #\[issue] +Fixes #[issue] ## Type of change -* [ ] Bug fix (change which fixes an issue) -* [ ] New feature (change which adds functionality) -* [ ] New Server (new server added) -* [ ] Refactor (restructures existing code) -* [ ] Comment update (typo, spelling, etc) +* [ ] Bug fix (change which fixes an issue). +* [ ] New feature (change which adds functionality). +* [ ] New Server (new server added). +* [ ] Refactor (restructures existing code). +* [ ] Comment update (typo, spelling, etc). +* [ ] This change requires a documentation update. ## Checklist -* [ ] My code follows the style guidelines of this project -* [ ] This pull request links to an issue -* [ ] This pull request uses the `develop` branch as its base -* [ ] I have performed a self-review of my own code -* [ ] I have squashed commits -* [ ] I have commented my code, particularly in hard to understand areas -* [ ] I have made corresponding changes to the documentation if required +* [ ] This code follows the style guidelines of this project. +* [ ] This pull request links to an issue. +* [ ] This pull request uses the `develop` branch as its base. +* [ ] I have provided Co-author details below. +* [ ] I have performed a self-review of my own code. +* [ ] I have squashed commits. +* [ ] I have commented my code, particularly in hard to understand areas. +* [ ] I have made corresponding changes to the documentation if required. + +## Provide Github Email + +Fill out below info or tick box below: +``` +Co-authored-by: John Doe +``` + +- [ ] I do not wish to provide an email. I am aware this will hide me as the author of this commit. + + +All pull requests will now be squashed to create a tidy commit history and simplify changelog creation. You can provide either your own email or a GitHub-provided no-reply email. + +When a PR is squashed the author becomes the person who squashed the PR. This removes you as the author of your own PR. +The only workaround for this is to add your details as a co-author. More info about co-authors can be found [here](https://help.github.com/en/articles/creating-a-commit-with-multiple-authors). From 87b8ed40f703b2b8b995cbae1bc707159d8d64a4 Mon Sep 17 00:00:00 2001 From: visdmin Date: Mon, 8 Apr 2019 00:10:17 +0300 Subject: [PATCH 025/534] fix(install): Teamspeak3 server installation with MariaDB fixed. (#2261) Co-authored-by: visdmin vili@kiho.fi fix(ts3server): can now add socket info to mariadb.ini feat(ts3server): copy libmariadb.so.2 if not found in serverfiles feat(install): EULA agreement now handled by install_eula.sh --- lgsm/functions/command_start.sh | 6 +- lgsm/functions/core_functions.sh | 15 ++--- lgsm/functions/install_complete.sh | 3 +- lgsm/functions/install_eula.sh | 45 +++++++++++++++ lgsm/functions/install_minecraft_eula.sh | 28 ---------- lgsm/functions/install_server_files.sh | 4 +- lgsm/functions/install_ts3db.sh | 55 ++++++++++--------- .../install_unreal_tournament_eula.sh | 28 ---------- 8 files changed, 83 insertions(+), 101 deletions(-) create mode 100644 lgsm/functions/install_eula.sh delete mode 100644 lgsm/functions/install_minecraft_eula.sh delete mode 100644 lgsm/functions/install_unreal_tournament_eula.sh diff --git a/lgsm/functions/command_start.sh b/lgsm/functions/command_start.sh index 447102e31..d61907ee0 100644 --- a/lgsm/functions/command_start.sh +++ b/lgsm/functions/command_start.sh @@ -32,11 +32,7 @@ fn_start_teamspeak3(){ date > "${rootdir}/${lockselfname}" # Accept license if [ ! -f "${executabledir}/.ts3server_license_accepted" ]; then - fn_script_log "Accepting ts3server license: ${executabledir}/LICENSE" - fn_print_info_nl "Accepting TeamSpeak license:" - echo " * ${executabledir}/LICENSE" - sleep 3 - touch "${executabledir}/.ts3server_license_accepted" + install_eula.sh fi cd "${executabledir}" if [ "${ts3serverpass}" == "1" ]; then diff --git a/lgsm/functions/core_functions.sh b/lgsm/functions/core_functions.sh index bde5e1f31..d28fb2ffb 100644 --- a/lgsm/functions/core_functions.sh +++ b/lgsm/functions/core_functions.sh @@ -565,32 +565,27 @@ functionfile="${FUNCNAME}" fn_fetch_function } -install_gsquery.sh(){ -functionfile="${FUNCNAME}" -fn_fetch_function -} - -install_gslt.sh(){ +install_eula.sh(){ functionfile="${FUNCNAME}" fn_fetch_function } -install_header.sh(){ +install_gsquery.sh(){ functionfile="${FUNCNAME}" fn_fetch_function } -install_logs.sh(){ +install_gslt.sh(){ functionfile="${FUNCNAME}" fn_fetch_function } -install_minecraft_eula.sh(){ +install_header.sh(){ functionfile="${FUNCNAME}" fn_fetch_function } -install_unreal_tournament_eula.sh(){ +install_logs.sh(){ functionfile="${FUNCNAME}" fn_fetch_function } diff --git a/lgsm/functions/install_complete.sh b/lgsm/functions/install_complete.sh index 9712a6bc8..18cfc16e5 100644 --- a/lgsm/functions/install_complete.sh +++ b/lgsm/functions/install_complete.sh @@ -8,6 +8,7 @@ local commandname="INSTALL" local commandaction="Install" local function_selfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" +echo "" echo "=================================" echo "Install Complete!" fn_script_log_info "Install Complete!" @@ -15,4 +16,4 @@ echo "" echo "To start server type:" echo "./${selfname} start" echo "" -core_exit.sh \ No newline at end of file +core_exit.sh diff --git a/lgsm/functions/install_eula.sh b/lgsm/functions/install_eula.sh new file mode 100644 index 000000000..c2554792f --- /dev/null +++ b/lgsm/functions/install_eula.sh @@ -0,0 +1,45 @@ +#!/bin/bash +# LinuxGSM install_eula.sh function +# Author: Daniel Gibbs +# Website: https://linuxgsm.com +# Description: Gets user to accept the EULA. + +if [ "${shortname}" == "ts3" ]; then + eulaurl="https://www.teamspeak.com/en/privacy-and-terms" +elif [ "${shortname}" == "mc" ]; then + eulaurl="https://account.mojang.com/documents/minecraft_eula" +elif [ "${shortname}" == "ut" ]; then + eulaurl="https://www.epicgames.com/unrealtournament/unreal-tournament-pre-alpha-test-development-build-eula" +fi + +echo "" +echo "Accept ${gamename} EULA" +echo "=================================" +sleep 0.5 +echo "You are required to accept the EULA:" +echo "${eulaurl}" +echo "" +if [ -z "${autoinstall}" ]; then + echo "By continuing you are indicating your agreement to the EULA." + echo "" + if ! fn_prompt_yn "Continue?" Y; then + core_exit.sh + fi +elif [ "${function_selfname}" == "command_start.sh" ]; then + fn_print_info "By continuing you are indicating your agreement to the EULA." + echo "" + sleep 5 +else + echo "By using auto-install you are indicating your agreement to the EULA." + echo "" + sleep 5 +fi + +if [ "${shortname}" == "ts3" ]; then + touch "${executabledir}/.ts3server_license_accepted" +elif [ "${shortname}" == "mc" ]; then + touch "${serverfiles}/eula.txt" + sed -i "s/eula=false/eula=true/g" "${serverfiles}/eula.txt" +elif [ "${shortname}" == "ut" ]; then + : +fi diff --git a/lgsm/functions/install_minecraft_eula.sh b/lgsm/functions/install_minecraft_eula.sh deleted file mode 100644 index 01999967f..000000000 --- a/lgsm/functions/install_minecraft_eula.sh +++ /dev/null @@ -1,28 +0,0 @@ -#!/bin/bash -# LinuxGSM install_minecraft_eula.sh function -# Author: Daniel Gibbs -# Website: https://linuxgsm.com -# Description: Gets user to accept the EULA. - -echo "" -echo "Accept ${gamename} EULA" -echo "=================================" -sleep 0.5 -echo "You are required to accept the EULA:" -echo "https://account.mojang.com/documents/minecraft_eula" - -echo "eula=false" > "${serverfiles}/eula.txt" - -if [ -z "${autoinstall}" ]; then -echo "By continuing you are indicating your agreement to the EULA." -echo "" - 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" "${serverfiles}/eula.txt" diff --git a/lgsm/functions/install_server_files.sh b/lgsm/functions/install_server_files.sh index 95e8f0c5f..ddaf33202 100644 --- a/lgsm/functions/install_server_files.sh +++ b/lgsm/functions/install_server_files.sh @@ -137,7 +137,7 @@ fi if [ "${shortname}" == "ts3" ]; then update_ts3.sh elif [ "${shortname}" == "mc" ]; then - install_minecraft_eula.sh + install_eula.sh update_minecraft.sh elif [ "${shortname}" == "mumble" ]; then update_mumble.sh @@ -148,7 +148,7 @@ elif [ "${shortname}" == "fctr" ]; then install_factorio_save.sh elif [ -z "${appid}" ]||[ "${shortname}" == "ges" ]||[ "${shortname}" == "bd" ]||[ "${shortname}" == "bb" ]||[ "${shortname}" == "ns" ]||[ "${shortname}" == "vs" ]; then if [ "${shortname}" == "ut" ]; then - install_unreal_tournament_eula.sh + install_eula.sh fi fn_install_server_files fi diff --git a/lgsm/functions/install_ts3db.sh b/lgsm/functions/install_ts3db.sh index ebb23c052..77dea1bae 100644 --- a/lgsm/functions/install_ts3db.sh +++ b/lgsm/functions/install_ts3db.sh @@ -10,20 +10,22 @@ local commandaction="Install" local function_selfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" fn_install_ts3db_mariadb(){ - echo "" - echo "checking if libmariadb2 is installed" - echo "=================================" - sleep 0.5 - - if ldd "${serverfiles}/libts3db_mariadb.so" | grep "libmariadb.so.2 => not found"; then - echo "libmariadb2 not installed. Please install it first." - echo "exiting..." - exit - else - echo "libmariadb2 installed." + if [ ! -f "${serverfiles}/libts3db_mariadb.so" ]; then + echo -e "copying libmariadb.so.2...\c" + cp "${serverfiles}/redist/libmariadb.so.2" "${serverfiles}" + local exitcode=$? + if [ "${exitcode}" == "0" ]; then + fn_print_ok_eol_nl + fn_script_log_pass "copying libmariadb.so.2" + else + fn_print_fail_eol_nl + fn_script_log_fatal "copying libmariadb.so.2" + core_exit.sh + fi fi + echo "" - echo "Configuring ${gamename} Server for MariaDB/MySQL" + echo "Configure ${gamename} Server for MariaDB" echo "=================================" sleep 0.5 read -rp "Enter MariaDB hostname: " mariahostname @@ -31,47 +33,46 @@ fn_install_ts3db_mariadb(){ read -rp "Enter MariaDB username: " mariausername read -rp "Enter MariaDB password: " mariapassword read -rp "Enter MariaDB database name: " mariadbname + read -rp "Enter MariaDB socket path: " mariadbsocket + { - echo "updating config." echo "[config]" echo "host='${mariahostname}'" echo "port='${mariaport}'" echo "username='${mariausername}'" echo "password='${mariapassword}'" echo "database='${mariadbname}'" - echo "socket=" + echo "socket='${mariadbsocket}'" } >> "${servercfgdir}/ts3db_mariadb.ini" sed -i "s/dbplugin=ts3db_sqlite3/dbplugin=ts3db_mariadb/g" "${servercfgfullpath}" sed -i "s/dbpluginparameter=/dbpluginparameter=ts3db_mariadb.ini/g" "${servercfgfullpath}" sed -i "s/dbsqlcreatepath=create_sqlite\//dbsqlcreatepath=create_mariadb\//g" "${servercfgfullpath}" - echo "=================================" + echo "updating ts3db_mariadb.ini." sleep 0.5 } +echo "" +echo "Select Database" +echo "=================================" +sleep 0.5 if [ -z "${autoinstall}" ]; then - echo "" - if fn_prompt_yn "Do you want to use MariaDB/MySQL instead of sqlite? (DB must be pre-configured)" N; then + if fn_prompt_yn "Do you want to use MariaDB instead of sqlite? (MariaDB must be pre-configured)" N; then fn_install_ts3db_mariadb fi else -fn_print_warning_nl "./${selfname} auto-install is uses sqlite. For MariaDB/MySQL use ./${selfname} install" +fn_print_information_nl "./${selfname} auto-install is uses sqlite. For MariaDB use ./${selfname} install" fi -## License -fn_script_log "Accepting ts3server license: ${executabledir}/LICENSE" -fn_print_information_nl "Accepting TeamSpeak license:" -echo " * ${executabledir}/LICENSE" -sleep 0.5 -touch "${executabledir}/.ts3server_license_accepted" +install_eula.sh ## Get privilege key echo "" echo "Getting privilege key" echo "=================================" sleep 0.5 -echo "IMPORANT! Save these details for later." +fn_print_information_nl "Save these details for later." sleep 0.5 cd "${executabledir}" || exit -./ts3server_startscript.sh start inifile=ts3-server.ini +${executable} start inifile=ts3-server.ini sleep 5 -./ts3server_startscript.sh stop +${executable} stop diff --git a/lgsm/functions/install_unreal_tournament_eula.sh b/lgsm/functions/install_unreal_tournament_eula.sh deleted file mode 100644 index 56fb8fbe4..000000000 --- a/lgsm/functions/install_unreal_tournament_eula.sh +++ /dev/null @@ -1,28 +0,0 @@ -#!/bin/bash -# LinuxGSM install_unreal_tournament_eula.sh function -# Author: Daniel Gibbs -# Website: https://linuxgsm.com -# Description: Gets user to accept the EULA. - -echo "" -echo "Accept ${gamename} EULA" -echo "=================================" -sleep 0.5 -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" > "${serverfiles}/eula.txt" - -if [ -z "${autoinstall}" ]; then -echo "By continuing you are indicating your agreement to the EULA." -echo "" - 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" "${serverfiles}/eula.txt" From 50fe60e0fe4a42f50913e2e077d802b5bf41bb57 Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" Date: Sun, 7 Apr 2019 22:53:21 +0100 Subject: [PATCH 026/534] docs: add UltimateByte as a contributor (#2262) * docs: update README.md * docs: create .all-contributorsrc --- .all-contributorsrc | 28 ++++++++++++++++++++++++++++ README.md | 15 ++++++++++++++- 2 files changed, 42 insertions(+), 1 deletion(-) create mode 100644 .all-contributorsrc diff --git a/.all-contributorsrc b/.all-contributorsrc new file mode 100644 index 000000000..a3a575bed --- /dev/null +++ b/.all-contributorsrc @@ -0,0 +1,28 @@ +{ + "files": [ + "README.md" + ], + "imageSize": 100, + "commit": false, + "contributors": [ + { + "login": "UltimateByte", + "name": "UltimateByte", + "avatar_url": "https://avatars3.githubusercontent.com/u/8805941?v=4", + "profile": "https://www.terageek.org | https://www.haisoft.fr", + "contributions": [ + "bug", + "code", + "doc", + "ideas", + "review", + "question" + ] + } + ], + "contributorsPerLine": 7, + "projectName": "LinuxGSM", + "projectOwner": "GameServerManagers", + "repoType": "github", + "repoHost": "https://github.com" +} diff --git a/README.md b/README.md index 84743e049..75bfdff9d 100644 --- a/README.md +++ b/README.md @@ -1,9 +1,10 @@

+
LinuxGSM

- [![LinuxGSM](https://img.shields.io/badge/-LinuxGSM-2b2b2b.svg?logo=data%3Aimage%2Fpng%3Bbase64%2CiVBORw0KGgoAAAANSUhEUgAAACsAAABACAYAAACDbo5ZAAAGD0lEQVR4AcWYa2wUVRvHz75c2vJ2disXoUBEVIioRAx%2BMIFA1IRwUS6KCCiIKBrvhEYiiGm5iBgk8QOGEgUUDYTttmVZWFr2UmwURS6iYAoCtmisElSsdHdbkT7%2BTzoNy%2BGc2dm54C%2F5Rdkz85x%2FZ86ZOXOYXYhIg3Phx%2FA4PAcv6f%2Btg5vhHJjP3EcZsgsshufJHH%2FAJbDztQ7aG35J1vgCXn%2BtgvrgEbLHYei9FmE3kDOUuh10OGwjZ7gEh7kZ9gNyllK3gnrg7%2BQs56DHjbCDyB0GuRF2ArnDeDfCziF3mO1G2FfJHRa4EXYpuUOxG2GXkzuUuBH2TXKH5W6ELSV3eM%2BNsOUk5yQcAY8p2uvgSPitor3MjbB1UOQXOFBvHwpbhPYWOExvL4SNUOQ7p4P2JTlzhOPmCu0vCu1PQpE2WOhk2MdJjk9y7HNwP1wEPUJbAcmZ6WTYrYolnifbxZBiibnFySHQCkUaLdY7C0V4%2FT5OhF1JcuIW6%2B0lOcvsBi2Ezao3j8Ov7Quwj52w60jNKIs1R5GatVaDDoEXSU4D7GSxbidYT3IuwjusFK0mNUVMwaZNNbl%2B%2F87hoVCom0HthaQmnG3QB0lNPcxlCvz%2B0GtlZTuorCxYYlA%2FDzbY%2FnrAgV3hCVLzCDMgEAi9wMMi9IIM%2FUwnNXWwi5mwRaSmmmXA798xq%2F3Khp420VeE1LyS6eQeBhttSXgzywCCToIUCOyYZvKLOWWwkdfd6ORVpGYJM0F5efDe9mEQHGty2BWTmhVGO4PNBmOoKzMBxmo%2FhD25dWvljSbD5hjMkb9gT9lJq63Mzi1bKkbjloc7xBWtwiRrDASCVRi%2FRxA8if%2BvrawMTzYI%2FACpeUv2KFFtDcUyTKilCHcis8G1Ga7wHpLzG8wVFs1K7jaeUKHZfIxmkj9%2FM4S9x9RGiMEudo0QbCVu9Xqn5PWEwLUk5%2FP0iaXac53I0kAH9Sau4m54lo%2FdTMfyekLYKQZ7ub34AbMMlmw5irC2VYTN0fuVMYMf8JHxJ7L7YYXAlSRnI2%2F8RtH4siTsDMz%2BZ5yS15OEXUxyDjGD1%2BvEq8MG16CDzY6JepKwT6geYbzxb0XjGMl7vwGSgzZIwo4nOa1M8Yr9Afb%2Fj8L21%2FsXaeaNZ2A6KTiEASph%2F0vF80cn4tokqu79fzfCUk2vfF4%2FFdFGEjGPHvg2yWrsDG%2F4%2BqpZB8jPOiXjWk0y5iXdM3XhKUvxBTA9UvHuvNPh%2Bzb%2BWj10z6nwuHWBbQFMvNCjKnn7qd1jS%2Fnx9VX3b6jC%2BbwOr5eMe3%2B83IcW4%2F3qgT%2BUTbA9srGaiHsn8AKiF6Ld%2FxF%2FOx6eeAJXabvK78MTTornNMd6XJTVR7%2Fj9bBjhFxV%2FMc1kJOAy2AeA%2FgrV4mFVDZFCqm8rEJ6qysCAWqK9iaztRJRbWXa4moFTELOav7jY%2FqAvoXp0Gc9NX7bIZl17%2FZl0rC1wRLeno0NvP%2B0CTcYNnS8wW6CtzNANaxzKqo9hRNOQ8rGo7tmSsMe2zWdt2frqVRcm5s2fofCgawDNHRNxnyfqgsYez4y4ADCjRM9H73hsNWafILTQdaFiSTj%2BQ%2FxA6yH7d%2BCmR8XbYr0a7VTF2N4siSsb5qdos3R6%2FjGxpULFfw7EfORnbrI9TAToX0sD40%2F2ylcGdh2Rdhg%2BSf2gka9jRTqK9%2BGwgHz7RTfVbHxirDhivdthYUvMRX8aYAD9lstvi%2B0aDL2DUZ0eCBUNNVG0IP65FLTWqPdiqdC0koHTVXe7iyNRG23QotBEy1RbTAzQyrmnYUT2rLsoA13JpcB4eVC2daBM1g2JGLekmwf5On7EJfngfZTNnVSce8bFjaTmQdvs%2FXmO%2FJVpoXdx3RSUe9O00Fj3nUdy0RLgRHiHXOPGW1h2uKZ07c9rG%2Bxyefp23pQeyBIEQoavYlakrG8fnrY5yHn2fbxXzAgw7m8bT5zkkSk4C7cpmOK21esB%2FXAQ5DzFfTo43%2BF%2FDzf0eZ4wZ3MDSjMcvD6nIeOahGgia%2FyU3HforTPkWkwnakdn0cI9jqfbPjD%2FuQLJr6644snlgX%2FApOMoyd1R5%2FxAAAAAElFTkSuQmCC)](https://linuxgsm.com) [![Build Status](https://travis-ci.com/GameServerManagers/LinuxGSM.svg?branch=master)](https://travis-ci.com/GameServerManagers/LinuxGSM) [![Codacy Badge](https://api.codacy.com/project/badge/Grade/3e98be27840043a090c3ab6e35db44b0)](https://app.codacy.com/app/GameServerManagers/LinuxGSM?utm_source=github.com&utm_medium=referral&utm_content=GameServerManagers/LinuxGSM&utm_campaign=Badge_Grade_Dashboard) [![Discord](https://discordapp.com/api/guilds/127498813903601664/widget.png?style=shield)](https://linuxgsm.com/discord) [![MIT Licence](https://badges.frapsoft.com/os/mit/mit.svg?v=103)](https://github.com/GameServerManagers/LinuxGSM/blob/master/LICENSE) [![made-with-bash](https://img.shields.io/badge/-Made%20with%20Bash-1f425f.svg?logo=image%2Fpng%3Bbase64%2CiVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyZpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw%2FeHBhY2tldCBiZWdpbj0i77u%2FIiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8%2BIDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNi1jMTExIDc5LjE1ODMyNSwgMjAxNS8wOS8xMC0wMToxMDoyMCAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENDIDIwMTUgKFdpbmRvd3MpIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOkE3MDg2QTAyQUZCMzExRTVBMkQxRDMzMkJDMUQ4RDk3IiB4bXBNTTpEb2N1bWVudElEPSJ4bXAuZGlkOkE3MDg2QTAzQUZCMzExRTVBMkQxRDMzMkJDMUQ4RDk3Ij4gPHhtcE1NOkRlcml2ZWRGcm9tIHN0UmVmOmluc3RhbmNlSUQ9InhtcC5paWQ6QTcwODZBMDBBRkIzMTFFNUEyRDFEMzMyQkMxRDhEOTciIHN0UmVmOmRvY3VtZW50SUQ9InhtcC5kaWQ6QTcwODZBMDFBRkIzMTFFNUEyRDFEMzMyQkMxRDhEOTciLz4gPC9yZGY6RGVzY3JpcHRpb24%2BIDwvcmRmOlJERj4gPC94OnhtcG1ldGE%2BIDw%2FeHBhY2tldCBlbmQ9InIiPz6lm45hAAADkklEQVR42qyVa0yTVxzGn7d9Wy03MS2ii8s%2BeokYNQSVhCzOjXZOFNF4jx%2BMRmPUMEUEqVG36jo2thizLSQSMd4N8ZoQ8RKjJtooaCpK6ZoCtRXKpRempbTv5ey83bhkAUphz8fznvP8znn%2B%2F3NeEEJgNBoRRSmz0ub%2FfuxEacBg%2FDmYtiCjgo5NG2mBXq%2BH5I1ogMRk9Zbd%2BQU2e1ML6VPLOyf5tvBQ8yT1lG10imxsABm7SLs898GTpyYynEzP60hO3trHDKvMigUwdeaceacqzp7nOI4n0SSIIjl36ao4Z356OV07fSQAk6xJ3XGg%2BLCr1d1OYlVHp4eUHPnerU79ZA%2F1kuv1JQMAg%2BE4O2P23EumF3VkvHprsZKMzKwbRUXFEyTvSIEmTVbrysp%2BWr8wfQHGK6WChVa3bKUmdWou%2BjpArdGkzZ41c1zG%2Fu5uGH4swzd561F%2BuhIT4%2BLnSuPsv9%2BJKIpjNr9dXYOyk7%2FBZrcjIT4eCnoKgedJP4BEqhG77E3NKP31FO7cfQA5K0dSYuLgz2TwCWJSOBzG6crzKK%2BohNfni%2Bx6OMUMMNe%2Fgf7ocbw0v0acKg6J8Ql0q%2BT%2FAXR5PNi5dz9c71upuQqCKFAD%2BYhrZLEAmpodaHO3Qy6TI3NhBpbrshGtOWKOSMYwYGQM8nJzoFJNxP2HjyIQho4PewK6hBktoDcUwtIln4PjOWzflQ%2Be5yl0yCCYgYikTclGlxadio%2BBQCSiW1UXoVGrKYwH4RgMrjU1HAB4vR6LzWYfFUCKxfS8Ftk5qxHoCUQAUkRJaSEokkV6Y%2F%2BJUOC4hn6A39NVXVBYeNP8piH6HeA4fPbpdBQV5KOx0QaL1YppX3Jgk0TwH2Vg6S3u%2BdB91%2B%2FpuNYPYFl5uP5V7ZqvsrX7jxqMXR6ff3gCQSTzFI0a1TX3wIs8ul%2Bq4HuWAAiM39vhOuR1O1fQ2gT%2F26Z8Z5vrl2OHi9OXZn995nLV9aFfS6UC9JeJPfuK0NBohWpCHMSAAsFe74WWP%2BvT25wtP9Bpob6uGqqyDnOtaeumjRu%2ByFu36VntK%2FPA5umTJeUtPWZSU9BCgud661odVp3DZtkc7AnYR33RRC708PrVi1larW7XwZIjLnd7R6SgSqWSNjU1B3F72pz5TZbXmX5vV81Yb7Lg7XT%2FUXriu8XLVqw6c6XqWnBKiiYU%2BMt3wWF7u7i91XlSEITwSAZ%2FCzAAHsJVbwXYFFEAAAAASUVORK5CYII%3D)](https://www.gnu.org/software/bash/) + [![LinuxGSM](https://img.shields.io/badge/-LinuxGSM-2b2b2b.svg?logo=data%3Aimage%2Fpng%3Bbase64%2CiVBORw0KGgoAAAANSUhEUgAAACsAAABACAYAAACDbo5ZAAAGD0lEQVR4AcWYa2wUVRvHz75c2vJ2disXoUBEVIioRAx%2BMIFA1IRwUS6KCCiIKBrvhEYiiGm5iBgk8QOGEgUUDYTttmVZWFr2UmwURS6iYAoCtmisElSsdHdbkT7%2BTzoNy%2BGc2dm54C%2F5Rdkz85x%2FZ86ZOXOYXYhIg3Phx%2FA4PAcv6f%2Btg5vhHJjP3EcZsgsshufJHH%2FAJbDztQ7aG35J1vgCXn%2BtgvrgEbLHYei9FmE3kDOUuh10OGwjZ7gEh7kZ9gNyllK3gnrg7%2BQs56DHjbCDyB0GuRF2ArnDeDfCziF3mO1G2FfJHRa4EXYpuUOxG2GXkzuUuBH2TXKH5W6ELSV3eM%2BNsOUk5yQcAY8p2uvgSPitor3MjbB1UOQXOFBvHwpbhPYWOExvL4SNUOQ7p4P2JTlzhOPmCu0vCu1PQpE2WOhk2MdJjk9y7HNwP1wEPUJbAcmZ6WTYrYolnifbxZBiibnFySHQCkUaLdY7C0V4%2FT5OhF1JcuIW6%2B0lOcvsBi2Ezao3j8Ov7Quwj52w60jNKIs1R5GatVaDDoEXSU4D7GSxbidYT3IuwjusFK0mNUVMwaZNNbl%2B%2F87hoVCom0HthaQmnG3QB0lNPcxlCvz%2B0GtlZTuorCxYYlA%2FDzbY%2FnrAgV3hCVLzCDMgEAi9wMMi9IIM%2FUwnNXWwi5mwRaSmmmXA798xq%2F3Khp420VeE1LyS6eQeBhttSXgzywCCToIUCOyYZvKLOWWwkdfd6ORVpGYJM0F5efDe9mEQHGty2BWTmhVGO4PNBmOoKzMBxmo%2FhD25dWvljSbD5hjMkb9gT9lJq63Mzi1bKkbjloc7xBWtwiRrDASCVRi%2FRxA8if%2BvrawMTzYI%2FACpeUv2KFFtDcUyTKilCHcis8G1Ga7wHpLzG8wVFs1K7jaeUKHZfIxmkj9%2FM4S9x9RGiMEudo0QbCVu9Xqn5PWEwLUk5%2FP0iaXac53I0kAH9Sau4m54lo%2FdTMfyekLYKQZ7ub34AbMMlmw5irC2VYTN0fuVMYMf8JHxJ7L7YYXAlSRnI2%2F8RtH4siTsDMz%2BZ5yS15OEXUxyDjGD1%2BvEq8MG16CDzY6JepKwT6geYbzxb0XjGMl7vwGSgzZIwo4nOa1M8Yr9Afb%2Fj8L21%2FsXaeaNZ2A6KTiEASph%2F0vF80cn4tokqu79fzfCUk2vfF4%2FFdFGEjGPHvg2yWrsDG%2F4%2BqpZB8jPOiXjWk0y5iXdM3XhKUvxBTA9UvHuvNPh%2Bzb%2BWj10z6nwuHWBbQFMvNCjKnn7qd1jS%2Fnx9VX3b6jC%2BbwOr5eMe3%2B83IcW4%2F3qgT%2BUTbA9srGaiHsn8AKiF6Ld%2FxF%2FOx6eeAJXabvK78MTTornNMd6XJTVR7%2Fj9bBjhFxV%2FMc1kJOAy2AeA%2FgrV4mFVDZFCqm8rEJ6qysCAWqK9iaztRJRbWXa4moFTELOav7jY%2FqAvoXp0Gc9NX7bIZl17%2FZl0rC1wRLeno0NvP%2B0CTcYNnS8wW6CtzNANaxzKqo9hRNOQ8rGo7tmSsMe2zWdt2frqVRcm5s2fofCgawDNHRNxnyfqgsYez4y4ADCjRM9H73hsNWafILTQdaFiSTj%2BQ%2FxA6yH7d%2BCmR8XbYr0a7VTF2N4siSsb5qdos3R6%2FjGxpULFfw7EfORnbrI9TAToX0sD40%2F2ylcGdh2Rdhg%2BSf2gka9jRTqK9%2BGwgHz7RTfVbHxirDhivdthYUvMRX8aYAD9lstvi%2B0aDL2DUZ0eCBUNNVG0IP65FLTWqPdiqdC0koHTVXe7iyNRG23QotBEy1RbTAzQyrmnYUT2rLsoA13JpcB4eVC2daBM1g2JGLekmwf5On7EJfngfZTNnVSce8bFjaTmQdvs%2FXmO%2FJVpoXdx3RSUe9O00Fj3nUdy0RLgRHiHXOPGW1h2uKZ07c9rG%2Bxyefp23pQeyBIEQoavYlakrG8fnrY5yHn2fbxXzAgw7m8bT5zkkSk4C7cpmOK21esB%2FXAQ5DzFfTo43%2BF%2FDzf0eZ4wZ3MDSjMcvD6nIeOahGgia%2FyU3HforTPkWkwnakdn0cI9jqfbPjD%2FuQLJr6644snlgX%2FApOMoyd1R5%2FxAAAAAElFTkSuQmCC)](https://linuxgsm.com) [![Build Status](https://travis-ci.com/GameServerManagers/LinuxGSM.svg?branch=master)](https://travis-ci.com/GameServerManagers/LinuxGSM) [![Codacy Badge](https://api.codacy.com/project/badge/Grade/3e98be27840043a090c3ab6e35db44b0)](https://app.codacy.com/app/GameServerManagers/LinuxGSM?utm_source=github.com&utm_medium=referral&utm_content=GameServerManagers/LinuxGSM&utm_campaign=Badge_Grade_Dashboard) [![Discord](https://discordapp.com/api/guilds/127498813903601664/widget.png?style=shield)](https://linuxgsm.com/discord) [![MIT Licence](https://badges.frapsoft.com/os/mit/mit.svg?v=103)](https://github.com/GameServerManagers/LinuxGSM/blob/master/LICENSE) [![made-with-bash](https://img.shields.io/badge/-Made%20with%20Bash-1f425f.svg?logo=image%2Fpng%3Bbase64%2CiVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyZpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw%2FeHBhY2tldCBiZWdpbj0i77u%2FIiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8%2BIDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNi1jMTExIDc5LjE1ODMyNSwgMjAxNS8wOS8xMC0wMToxMDoyMCAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENDIDIwMTUgKFdpbmRvd3MpIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOkE3MDg2QTAyQUZCMzExRTVBMkQxRDMzMkJDMUQ4RDk3IiB4bXBNTTpEb2N1bWVudElEPSJ4bXAuZGlkOkE3MDg2QTAzQUZCMzExRTVBMkQxRDMzMkJDMUQ4RDk3Ij4gPHhtcE1NOkRlcml2ZWRGcm9tIHN0UmVmOmluc3RhbmNlSUQ9InhtcC5paWQ6QTcwODZBMDBBRkIzMTFFNUEyRDFEMzMyQkMxRDhEOTciIHN0UmVmOmRvY3VtZW50SUQ9InhtcC5kaWQ6QTcwODZBMDFBRkIzMTFFNUEyRDFEMzMyQkMxRDhEOTciLz4gPC9yZGY6RGVzY3JpcHRpb24%2BIDwvcmRmOlJERj4gPC94OnhtcG1ldGE%2BIDw%2FeHBhY2tldCBlbmQ9InIiPz6lm45hAAADkklEQVR42qyVa0yTVxzGn7d9Wy03MS2ii8s%2BeokYNQSVhCzOjXZOFNF4jx%2BMRmPUMEUEqVG36jo2thizLSQSMd4N8ZoQ8RKjJtooaCpK6ZoCtRXKpRempbTv5ey83bhkAUphz8fznvP8znn%2B%2F3NeEEJgNBoRRSmz0ub%2FfuxEacBg%2FDmYtiCjgo5NG2mBXq%2BH5I1ogMRk9Zbd%2BQU2e1ML6VPLOyf5tvBQ8yT1lG10imxsABm7SLs898GTpyYynEzP60hO3trHDKvMigUwdeaceacqzp7nOI4n0SSIIjl36ao4Z356OV07fSQAk6xJ3XGg%2BLCr1d1OYlVHp4eUHPnerU79ZA%2F1kuv1JQMAg%2BE4O2P23EumF3VkvHprsZKMzKwbRUXFEyTvSIEmTVbrysp%2BWr8wfQHGK6WChVa3bKUmdWou%2BjpArdGkzZ41c1zG%2Fu5uGH4swzd561F%2BuhIT4%2BLnSuPsv9%2BJKIpjNr9dXYOyk7%2FBZrcjIT4eCnoKgedJP4BEqhG77E3NKP31FO7cfQA5K0dSYuLgz2TwCWJSOBzG6crzKK%2BohNfni%2Bx6OMUMMNe%2Fgf7ocbw0v0acKg6J8Ql0q%2BT%2FAXR5PNi5dz9c71upuQqCKFAD%2BYhrZLEAmpodaHO3Qy6TI3NhBpbrshGtOWKOSMYwYGQM8nJzoFJNxP2HjyIQho4PewK6hBktoDcUwtIln4PjOWzflQ%2Be5yl0yCCYgYikTclGlxadio%2BBQCSiW1UXoVGrKYwH4RgMrjU1HAB4vR6LzWYfFUCKxfS8Ftk5qxHoCUQAUkRJaSEokkV6Y%2F%2BJUOC4hn6A39NVXVBYeNP8piH6HeA4fPbpdBQV5KOx0QaL1YppX3Jgk0TwH2Vg6S3u%2BdB91%2B%2FpuNYPYFl5uP5V7ZqvsrX7jxqMXR6ff3gCQSTzFI0a1TX3wIs8ul%2Bq4HuWAAiM39vhOuR1O1fQ2gT%2F26Z8Z5vrl2OHi9OXZn995nLV9aFfS6UC9JeJPfuK0NBohWpCHMSAAsFe74WWP%2BvT25wtP9Bpob6uGqqyDnOtaeumjRu%2ByFu36VntK%2FPA5umTJeUtPWZSU9BCgud661odVp3DZtkc7AnYR33RRC708PrVi1larW7XwZIjLnd7R6SgSqWSNjU1B3F72pz5TZbXmX5vV81Yb7Lg7XT%2FUXriu8XLVqw6c6XqWnBKiiYU%2BMt3wWF7u7i91XlSEITwSAZ%2FCzAAHsJVbwXYFFEAAAAASUVORK5CYII%3D)](https://www.gnu.org/software/bash/) [![All Contributors](https://img.shields.io/badge/all_contributors-1-orange.svg?style=flat-square)](#contributors) [LinuxGSM](https://linuxgsm.com) is the command line tool for quick, simple deployment and management of dedicated game servers. @@ -50,3 +51,15 @@ There are a various ways to get support, check out the [support](https://linuxgs ## :heart: Donate If you would like to [donate](https://linuxgsm.com/donate) to the project there are several ways you can, via [PayPal](https://www.paypal.me/dgibbs64), [Patreon](https://www.patreon.com/dgibbs) and [Flattr](https://flattr.com/@dgibbs). I would like to thank everyone who has previously sent a donation. LinuxGSM has been going since 2012 and I have spent 1000s of hours developing and improving the project and continue to regularly add support for new servers. + +## Contributors + +Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/docs/en/emoji-key)): + + + +
UltimateByte
UltimateByte

🐛 💻 📖 🤔 👀 💬
+ + + +This project follows the [all-contributors](https://github.com/all-contributors/all-contributors) specification. Contributions of any kind welcome! From dcce9673b169cd85c33ccdf037b95139254c8e17 Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" Date: Sun, 7 Apr 2019 23:00:26 +0100 Subject: [PATCH 027/534] docs: add Bourne-ID as a contributor (#2263) * docs: update README.md * Update .all-contributorsrc --- .all-contributorsrc | 13 +++++++++++++ README.md | 3 +-- 2 files changed, 14 insertions(+), 2 deletions(-) diff --git a/.all-contributorsrc b/.all-contributorsrc index a3a575bed..10996e72d 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -6,6 +6,19 @@ "commit": false, "contributors": [ { + "login": "Bourne-ID", + "name": "Bourne-ID", + "avatar_url": "https://avatars1.githubusercontent.com/u/7073616?v=4", + "profile": "https://github.com/Bourne-ID", + "contributions": [ + "bug", + "code", + "ideas", + "question", + "review" + ] + }, + { "login": "UltimateByte", "name": "UltimateByte", "avatar_url": "https://avatars3.githubusercontent.com/u/8805941?v=4", diff --git a/README.md b/README.md index 75bfdff9d..72e1915df 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,4 @@

-
LinuxGSM

@@ -58,7 +57,7 @@ Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/d -
UltimateByte
UltimateByte

🐛 💻 📖 🤔 👀 💬
+
UltimateByte
UltimateByte

🐛 💻 📖 🤔 👀 💬
Bourne-ID
Bourne-ID

🐛 💻 🤔 💬 👀
From 1655dbb1e273ddbb7059a41151aeae568e85bd3e Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" Date: Sun, 7 Apr 2019 23:09:57 +0100 Subject: [PATCH 028/534] docs: add cedarlug as a contributor (#2264) * docs: update README.md * Update .all-contributorsrc --- .all-contributorsrc | 13 +++++++++++++ README.md | 4 +++- 2 files changed, 16 insertions(+), 1 deletion(-) diff --git a/.all-contributorsrc b/.all-contributorsrc index 10996e72d..6edec1960 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -17,6 +17,19 @@ "question", "review" ] + }, + { + "login": "cedarlug", + "name": "CedarLUG", + "avatar_url": "https://avatars2.githubusercontent.com/u/19336442?v=4", + "profile": "http://cedarlug.org", + "contributions": [ + "bug", + "code", + "ideas", + "question", + "review" + ] }, { "login": "UltimateByte", diff --git a/README.md b/README.md index 72e1915df..7d3b23b67 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,5 @@

+[![All Contributors](https://img.shields.io/badge/all_contributors-1-orange.svg?style=flat-square)](#contributors)
LinuxGSM

@@ -57,7 +58,8 @@ Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/d -
UltimateByte
UltimateByte

🐛 💻 📖 🤔 👀 💬
Bourne-ID
Bourne-ID

🐛 💻 🤔 💬 👀
+ +
UltimateByte
UltimateByte

🐛 💻 📖 🤔 👀 💬
Bourne-ID
Bourne-ID

🐛 💻 🤔 💬 👀
CedarLUG
CedarLUG

🐛 💻 🤔 💬 👀
From aa3260feb4d05fcf8152e68f2c3547a96e06d69e Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" Date: Sun, 7 Apr 2019 23:14:06 +0100 Subject: [PATCH 029/534] docs: add marvinlehmann as a contributor (#2265) * docs: update README.md * docs: create .all-contributorsrc * Update README.md --- .all-contributorsrc | 10 ++++++++++ README.md | 2 +- 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/.all-contributorsrc b/.all-contributorsrc index 6edec1960..04389398c 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -5,6 +5,16 @@ "imageSize": 100, "commit": false, "contributors": [ + { + "login": "marvinlehmann", + "name": "Marvin Lehmann", + "avatar_url": "https://avatars2.githubusercontent.com/u/4151266?v=4", + "profile": "https://github.com/marvinlehmann", + "contributions": [ + "bug", + "code" + ] + }, { "login": "Bourne-ID", "name": "Bourne-ID", diff --git a/README.md b/README.md index 7d3b23b67..089b9518e 100644 --- a/README.md +++ b/README.md @@ -59,7 +59,7 @@ Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/d -
UltimateByte
UltimateByte

🐛 💻 📖 🤔 👀 💬
Bourne-ID
Bourne-ID

🐛 💻 🤔 💬 👀
CedarLUG
CedarLUG

🐛 💻 🤔 💬 👀
+
UltimateByte
UltimateByte

🐛 💻 📖 🤔 👀 💬
Bourne-ID
Bourne-ID

🐛 💻 🤔 💬 👀
CedarLUG
CedarLUG

🐛 💻 🤔 💬 👀
Marvin Lehmann
Marvin Lehmann

🐛 💻
From 0a7c9f0ca83454e1e9eaedad2dcdc682ae08c8fa Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" Date: Sun, 7 Apr 2019 23:19:15 +0100 Subject: [PATCH 030/534] docs: add Scarsz as a contributor (#2266) * docs: update README.md * docs: create .all-contributorsrc --- .all-contributorsrc | 10 ++++++++++ README.md | 2 +- 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/.all-contributorsrc b/.all-contributorsrc index 04389398c..e681f5f70 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -5,6 +5,16 @@ "imageSize": 100, "commit": false, "contributors": [ + { + "login": "Scarsz", + "name": "Austin Shapiro", + "avatar_url": "https://avatars1.githubusercontent.com/u/7691988?v=4", + "profile": "https://scarsz.me", + "contributions": [ + "bug", + "code" + ] + }, { "login": "marvinlehmann", "name": "Marvin Lehmann", diff --git a/README.md b/README.md index 089b9518e..893d3d6b7 100644 --- a/README.md +++ b/README.md @@ -59,7 +59,7 @@ Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/d -
UltimateByte
UltimateByte

🐛 💻 📖 🤔 👀 💬
Bourne-ID
Bourne-ID

🐛 💻 🤔 💬 👀
CedarLUG
CedarLUG

🐛 💻 🤔 💬 👀
Marvin Lehmann
Marvin Lehmann

🐛 💻
+
UltimateByte
UltimateByte

🐛 💻 📖 🤔 👀 💬
Bourne-ID
Bourne-ID

🐛 💻 🤔 💬 👀
CedarLUG
CedarLUG

🐛 💻 🤔 💬 👀
Marvin Lehmann
Marvin Lehmann

🐛 💻
Austin Shapiro
Austin Shapiro

🐛 💻
From da5dee4b054d12cfa39aa9366e6fc4b11f55111a Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" Date: Sun, 7 Apr 2019 23:21:57 +0100 Subject: [PATCH 031/534] docs: add kennyLtv as a contributor (#2267) * docs: update README.md * docs: create .all-contributorsrc --- .all-contributorsrc | 10 +++++++++- README.md | 2 +- 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/.all-contributorsrc b/.all-contributorsrc index e681f5f70..14f5e5da8 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -5,6 +5,15 @@ "imageSize": 100, "commit": false, "contributors": [ + { + "login": "kennyLtv", + "name": "Kenny Lindelof", + "avatar_url": "https://avatars2.githubusercontent.com/u/6133325?v=4", + "profile": "https://kennyl.design", + "contributions": [ + "question" + ] + }, { "login": "Scarsz", "name": "Austin Shapiro", @@ -62,7 +71,6 @@ "doc", "ideas", "review", - "question" ] } ], diff --git a/README.md b/README.md index 893d3d6b7..692ace9cd 100644 --- a/README.md +++ b/README.md @@ -59,7 +59,7 @@ Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/d -
UltimateByte
UltimateByte

🐛 💻 📖 🤔 👀 💬
Bourne-ID
Bourne-ID

🐛 💻 🤔 💬 👀
CedarLUG
CedarLUG

🐛 💻 🤔 💬 👀
Marvin Lehmann
Marvin Lehmann

🐛 💻
Austin Shapiro
Austin Shapiro

🐛 💻
+
UltimateByte
UltimateByte

🐛 💻 📖 🤔 👀 💬
Bourne-ID
Bourne-ID

🐛 💻 🤔 💬 👀
CedarLUG
CedarLUG

🐛 💻 🤔 💬 👀
Marvin Lehmann
Marvin Lehmann

🐛 💻
Austin Shapiro
Austin Shapiro

🐛 💻
Kenny Lindelof
Kenny Lindelof

💬
From bbed6a9f8826e18f1b8f6fe6c261107accc17b54 Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" Date: Sun, 7 Apr 2019 23:24:01 +0100 Subject: [PATCH 032/534] docs: add Frisasky as a contributor (#2268) * docs: update README.md * docs: create .all-contributorsrc --- .all-contributorsrc | 9 +++++++++ README.md | 2 +- 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/.all-contributorsrc b/.all-contributorsrc index 14f5e5da8..1304b1dff 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -5,6 +5,15 @@ "imageSize": 100, "commit": false, "contributors": [ + { + "login": "Frisasky", + "name": "Frisasky", + "avatar_url": "https://avatars2.githubusercontent.com/u/26865851?v=4", + "profile": "https://github.com/Frisasky", + "contributions": [ + "question" + ] + }, { "login": "kennyLtv", "name": "Kenny Lindelof", diff --git a/README.md b/README.md index 692ace9cd..a9a7310de 100644 --- a/README.md +++ b/README.md @@ -59,7 +59,7 @@ Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/d -
UltimateByte
UltimateByte

🐛 💻 📖 🤔 👀 💬
Bourne-ID
Bourne-ID

🐛 💻 🤔 💬 👀
CedarLUG
CedarLUG

🐛 💻 🤔 💬 👀
Marvin Lehmann
Marvin Lehmann

🐛 💻
Austin Shapiro
Austin Shapiro

🐛 💻
Kenny Lindelof
Kenny Lindelof

💬
+
UltimateByte
UltimateByte

🐛 💻 📖 🤔 👀 💬
Bourne-ID
Bourne-ID

🐛 💻 🤔 💬 👀
CedarLUG
CedarLUG

🐛 💻 🤔 💬 👀
Marvin Lehmann
Marvin Lehmann

🐛 💻
Austin Shapiro
Austin Shapiro

🐛 💻
Kenny Lindelof
Kenny Lindelof

💬
Frisasky
Frisasky

💬
From 5f8cdcf13897b416559e5f4a8fd19341105a9664 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Sun, 7 Apr 2019 23:25:00 +0100 Subject: [PATCH 033/534] Update README.md --- README.md | 1 - 1 file changed, 1 deletion(-) diff --git a/README.md b/README.md index a9a7310de..abb875feb 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,4 @@

-[![All Contributors](https://img.shields.io/badge/all_contributors-1-orange.svg?style=flat-square)](#contributors)
LinuxGSM

From 0d6c7903bdb56461ea31140eac1f1fd60ea31391 Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" Date: Sun, 7 Apr 2019 23:38:01 +0100 Subject: [PATCH 034/534] docs: add dgibbs64 as a contributor (#2269) * docs: update README.md * docs: create .all-contributorsrc --- .all-contributorsrc | 24 ++++++++++++++++++++---- README.md | 4 ++-- 2 files changed, 22 insertions(+), 6 deletions(-) diff --git a/.all-contributorsrc b/.all-contributorsrc index 1304b1dff..c3654dea7 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -6,6 +6,22 @@ "commit": false, "contributors": [ { + "login": "dgibbs64", + "name": "Daniel Gibbs", + "avatar_url": "https://avatars2.githubusercontent.com/u/4478206?v=4", + "profile": "https://danielgibbs.co.uk", + "contributions": [ + "bug", + "code", + "ideas", + "question", + "review", + "content", + "doc", + "infra" + ] + }, + { "login": "Frisasky", "name": "Frisasky", "avatar_url": "https://avatars2.githubusercontent.com/u/26865851?v=4", @@ -49,10 +65,10 @@ "avatar_url": "https://avatars1.githubusercontent.com/u/7073616?v=4", "profile": "https://github.com/Bourne-ID", "contributions": [ - "bug", - "code", - "ideas", - "question", + "review", + "content", + "doc", + "infra" "review" ] }, diff --git a/README.md b/README.md index abb875feb..0d91b9d5b 100644 --- a/README.md +++ b/README.md @@ -58,8 +58,8 @@ Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/d -
UltimateByte
UltimateByte

🐛 💻 📖 🤔 👀 💬
Bourne-ID
Bourne-ID

🐛 💻 🤔 💬 👀
CedarLUG
CedarLUG

🐛 💻 🤔 💬 👀
Marvin Lehmann
Marvin Lehmann

🐛 💻
Austin Shapiro
Austin Shapiro

🐛 💻
Kenny Lindelof
Kenny Lindelof

💬
Frisasky
Frisasky

💬
+
Daniel Gibbs
Daniel Gibbs

🐛 💻 🤔 💬 👀 🖋 📖 🚇
UltimateByte
UltimateByte

🐛 💻 📖 🤔 👀 💬
Bourne-ID
Bourne-ID

🐛 💻 🤔 💬 👀
CedarLUG
CedarLUG

🐛 💻 🤔 💬 👀
Marvin Lehmann
Marvin Lehmann

🐛 💻
Austin Shapiro
Austin Shapiro

🐛 💻
Kenny Lindelof
Kenny Lindelof

💬
Frisasky
Frisasky

💬
-This project follows the [all-contributors](https://github.com/all-contributors/all-contributors) specification. Contributions of any kind welcome! +This project follows the [all-contributors](https://github.com/all-contributors/all-contributors) specification. Contributions of any kind welcome! \ No newline at end of file From df27a40d8e16eb3a8802865c89220c7a1c06945e Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Mon, 8 Apr 2019 09:44:41 +0100 Subject: [PATCH 035/534] fix(update): correct remotelocation for fctrserver --- 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 cde4b35e6..6efd56024 100644 --- a/lgsm/functions/update_factorio.sh +++ b/lgsm/functions/update_factorio.sh @@ -144,7 +144,7 @@ fn_update_factorio_compare(){ } # The location where the builds are checked and downloaded. -remotelocation="mojang.com" +remotelocation="factorio.com" # Game server architecture. factorioarch="linux64" From 62a49df88bcc85d35309ad3baa0ebf8873859be9 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Mon, 8 Apr 2019 16:42:48 +0100 Subject: [PATCH 036/534] fix(ts3server): Change password will no longer show in all game servers apart from TS3 (#2273) --- 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 7be0f8d66..4b69f104d 100644 --- a/lgsm/functions/core_getopt.sh +++ b/lgsm/functions/core_getopt.sh @@ -90,7 +90,7 @@ if [ "${engine}" == "source" ]; then fi # TeamSpeak exclusive -if [ "${shortname}" != "ts3" ]; then +if [ "${shortname}" == "ts3" ]; then currentopt+=( "${cmd_change_password[@]}" ) fi From c7413599d2c194633f880245d8641eadcabf3089 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Tue, 9 Apr 2019 11:58:41 +0100 Subject: [PATCH 037/534] fix(check): prevent restart from bypassing check_executable (#2278) --- 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 c4e7947ef..f0f0a67b7 100644 --- a/lgsm/functions/check_executable.sh +++ b/lgsm/functions/check_executable.sh @@ -9,10 +9,11 @@ local function_selfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" # Check if executable exists if [ ! -f "${executabledir}/${execname}" ]; then - fn_print_fail_nl "executable was not found:" - echo " * ${executabledir}/${execname}" + fn_print_fail_nl "executable was not found" + echo "* ${executabledir}/${execname}" if [ -d "${lgsmlogdir}" ]; then fn_script_log_fatal "Executable was not found: ${executabledir}/${execname}" fi + unset exitbypass core_exit.sh fi From 5058214388e287aa7a02d88fe6ee18f841ff9974 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Tue, 9 Apr 2019 13:10:16 +0100 Subject: [PATCH 038/534] fix(fix): re-add fix_tf2 and minor fix refactor (#2279) --- lgsm/functions/fix.sh | 45 +++++++++++++++++----------------- lgsm/functions/fix_dst.sh | 4 +-- lgsm/functions/fix_mta.sh | 2 +- lgsm/functions/fix_ss3.sh | 5 +++- lgsm/functions/fix_steamcmd.sh | 8 +++--- lgsm/functions/fix_tf2.sh | 2 +- lgsm/functions/fix_ts3.sh | 7 ++++-- 7 files changed, 40 insertions(+), 33 deletions(-) diff --git a/lgsm/functions/fix.sh b/lgsm/functions/fix.sh index 6785306f3..3eae6c91d 100644 --- a/lgsm/functions/fix.sh +++ b/lgsm/functions/fix.sh @@ -61,8 +61,10 @@ if [ "${function_selfname}" != "command_install.sh" ]&&[ -z "${fixbypass}" ]; th fix_sdtd.sh elif [ "${shortname}" == "ss3" ]; then fix_ss3.sh + elif [ "${shortname}" == "tf2" ]; then + fix_tf2.sh elif [ "${shortname}" == "ts3" ]; then - fix_ts3.sh + fix_ts3.sh elif [ "${shortname}" == "mta" ]; then fix_mta.sh elif [ "${shortname}" == "wurm" ]; then @@ -72,26 +74,25 @@ fi # Fixes that are run on install only. if [ "${function_selfname}" == "command_install.sh" ]; then - echo "" - echo "Applying Post-Install Fixes" - echo "=================================" - sleep 0.5 - if [ "${shortname}" == "kf" ]; then - fix_kf.sh - elif [ "${shortname}" == "kf2" ]; then - fix_kf2.sh - elif [ "${shortname}" == "ro" ]; then - fix_ro.sh - elif [ "${shortname}" == "ut2k4" ]; then - fix_ut2k4.sh - elif [ "${shortname}" == "ut" ]; then - fix_ut.sh - elif [ "${shortname}" == "ut3" ]; then - fix_ut3.sh - elif [ "${shortname}" == "tf2" ]; then - fix_tf2.sh - else - fn_print_information_nl "No fixes required." + if [ "${shortname}" == "kf" ]||[ "${shortname}" == "kf2" ]||[ "${shortname}" == "ro" ]||[ "${shortname}" == "ut2k4" ]||[ "${shortname}" == "ut" ]||[ "${shortname}" == "ut3" ]; then + echo "" + echo "Applying Post-Install Fixes" + echo "=================================" + sleep 0.5 + if [ "${shortname}" == "kf" ]; then + fix_kf.sh + elif [ "${shortname}" == "kf2" ]; then + fix_kf2.sh + elif [ "${shortname}" == "ro" ]; then + fix_ro.sh + elif [ "${shortname}" == "ut2k4" ]; then + fix_ut2k4.sh + elif [ "${shortname}" == "ut" ]; then + fix_ut.sh + elif [ "${shortname}" == "ut3" ]; then + fix_ut3.sh + else + fn_print_information_nl "No fixes required." + fi fi - fi diff --git a/lgsm/functions/fix_dst.sh b/lgsm/functions/fix_dst.sh index 24debfc9e..832b81398 100644 --- a/lgsm/functions/fix_dst.sh +++ b/lgsm/functions/fix_dst.sh @@ -11,8 +11,8 @@ 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 "${serverfiles}/bin/lib32/libcurl-gnutls.so.4" ]; then - fixname="libcurl-gnutls.so.4 missing" + fixname="libcurl-gnutls.so.4" fn_fix_msg_start 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 +fi diff --git a/lgsm/functions/fix_mta.sh b/lgsm/functions/fix_mta.sh index f16064a96..e8943f5e1 100644 --- a/lgsm/functions/fix_mta.sh +++ b/lgsm/functions/fix_mta.sh @@ -16,4 +16,4 @@ if [ ! -f "${lgsmdir}/lib/libmysqlclient.so.16" ]; then fn_fix_msg_end fi -export LD_LIBRARY_PATH=:"${libdir}" \ No newline at end of file +export LD_LIBRARY_PATH=:"${libdir}" diff --git a/lgsm/functions/fix_ss3.sh b/lgsm/functions/fix_ss3.sh index 3ebbc3910..73626f366 100644 --- a/lgsm/functions/fix_ss3.sh +++ b/lgsm/functions/fix_ss3.sh @@ -10,5 +10,8 @@ local function_selfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" # Fixes https://steamcommunity.com/app/41070/discussions/0/353916981477716386/ if [ "$(diff "${steamcmddir}/linux32/steamclient.so" "${serverfiles}/Bin/steamclient.so" >/dev/null)" ]; then + fixname="steamclient.so" + fn_fix_msg_start cp -f "${steamcmddir}/linux32/steamclient.so" "${serverfiles}/Bin/steamclient.so" -fi \ No newline at end of file + fn_fix_msg_end +fi diff --git a/lgsm/functions/fix_steamcmd.sh b/lgsm/functions/fix_steamcmd.sh index 9802c702f..a3f60e89c 100644 --- a/lgsm/functions/fix_steamcmd.sh +++ b/lgsm/functions/fix_steamcmd.sh @@ -10,7 +10,7 @@ local function_selfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" # Fixes: [S_API FAIL] SteamAPI_Init() failed; unable to locate a running instance of Steam,or a local steamclient.so. if [ ! -f "${HOME}/.steam/sdk32/steamclient.so" ]; then - fixname="steamclient.so general" + fixname="steamclient.so" fn_fix_msg_start mkdir -pv "${HOME}/.steam/sdk32" >> "${lgsmlog}" cp -v "${steamcmddir}/linux32/steamclient.so" "${HOME}/.steam/sdk32/steamclient.so" >> "${lgsmlog}" @@ -23,7 +23,7 @@ if [ "${shortname}" == "ss3" ]; then fixname="libsteam.so" fn_fix_msg_start mkdir -pv "${HOME}/.steam/bin32" >> "${lgsmlog}" - cp -v "${serverfiles}/Bin/libsteam.so" "${HOME}/.steam/bin32/libsteam.so" >> "${lgsmlog}" + cp "${serverfiles}/Bin/libsteam.so" "${HOME}/.steam/bin32/libsteam.so" >> "${lgsmlog}" fn_fix_msg_end fi elif [ "${shortname}" == "hw" ]; then @@ -31,13 +31,13 @@ elif [ "${shortname}" == "hw" ]; 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" >> "${lgsmlog}" + cp "${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" >> "${lgsmlog}" + cp "${steamcmddir}/linux32/steamclient.so" "${serverfiles}/Hurtworld_Data/Plugins/x86_64/steamclient.so" >> "${lgsmlog}" fn_fix_msg_end fi elif [ "${shortname}" == "tu" ]; then diff --git a/lgsm/functions/fix_tf2.sh b/lgsm/functions/fix_tf2.sh index df161a1b5..26a31846e 100644 --- a/lgsm/functions/fix_tf2.sh +++ b/lgsm/functions/fix_tf2.sh @@ -10,7 +10,7 @@ local function_selfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" # Fixes: Team Fortress 2 Segmentation fault for Red-Hat Distros #2062. if [ -f "/etc/redhat-release" ]&&[ ! -f "${serverfiles}/bin/libcurl-gnutls.so.4" ]; then - fixname="libcurl-gnutls.so.4 missing" + fixname="libcurl-gnutls.so.4" fn_fix_msg_start ln -s "/usr/lib/libcurl.so.4" "${serverfiles}/bin/libcurl-gnutls.so.4" fn_fix_msg_end diff --git a/lgsm/functions/fix_ts3.sh b/lgsm/functions/fix_ts3.sh index fd28a90bd..0d27c316b 100644 --- a/lgsm/functions/fix_ts3.sh +++ b/lgsm/functions/fix_ts3.sh @@ -10,5 +10,8 @@ local function_selfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" # Fixes: makes libmariadb2 available #1924 if [ ! -f "${serverfiles}/libmariadb.so.2" ]; then - ln -s "${serverfiles}/redist/libmariadb.so.2" "${serverfiles}/libmariadb.so.2" -fi \ No newline at end of file + fixname="libmariadb.so.2" + fn_fix_msg_start + cp "${serverfiles}/redist/libmariadb.so.2" "${serverfiles}/libmariadb.so.2" + fn_fix_msg_end +fi From 6468e8e89796b202795db6738c2e58c7d067b9ba Mon Sep 17 00:00:00 2001 From: Frisasky Date: Tue, 9 Apr 2019 20:17:44 +0800 Subject: [PATCH 039/534] feat(newserver): Dystopia (#2245) Co-authored-by: digimoncn@gmail.com --- .../config-lgsm/dysserver/_default.cfg | 135 ++++++++++++++++++ lgsm/data/serverlist.csv | 1 + lgsm/functions/info_glibc.sh | 3 + lgsm/functions/install_config.sh | 6 + 4 files changed, 145 insertions(+) create mode 100644 lgsm/config-default/config-lgsm/dysserver/_default.cfg diff --git a/lgsm/config-default/config-lgsm/dysserver/_default.cfg b/lgsm/config-default/config-lgsm/dysserver/_default.cfg new file mode 100644 index 000000000..84342b6fa --- /dev/null +++ b/lgsm/config-default/config-lgsm/dysserver/_default.cfg @@ -0,0 +1,135 @@ +################################## +######## 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://docs.linuxgsm.com/configuration/start-parameters +ip="0.0.0.0" +port="27015" +clientport="27005" +sourcetvport="27020" +defaultmap="dys_broadcast" +maxplayers="16" + +## Optional: Game Server Login Token +# GSLT can be used for running a public server. +# More info: https://linuxgsm.com/gslt +gslt="" + +## Server Start Command | https://docs.linuxgsm.com/configuration/start-parameters#additional-parameters +fn_parms(){ +parms="-game "${serverfiles}/dystopia" -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) + +# More info | https://docs.linuxgsm.com/alerts#more-info +postalert="off" +postdays="7" +posttarget="https://hastebin.com" + +# Discord Alerts | https://docs.linuxgsm.com/alerts/discord +discordalert="off" +discordwebhook="webhook" + +# Email Alerts | https://docs.linuxgsm.com/alerts/email +emailalert="off" +email="email@example.com" +emailfrom="" + +# IFTTT Alerts | https://docs.linuxgsm.com/alerts/ifttt +iftttalert="off" +ifttttoken="accesstoken" +iftttevent="linuxgsm_alert" + +# Mailgun Email Alerts | https://docs.linuxgsm.com/alerts/mailgun +mailgunalert="off" +mailguntoken="accesstoken" +mailgundomain="example.com" +mailgunemailfrom="alert@example.com" +mailgunemail="email@myemail.com" + +# Pushbullet Alerts | https://docs.linuxgsm.com/alerts/pushbullet +pushbulletalert="off" +pushbullettoken="accesstoken" +channeltag="" + +# Pushover Alerts | https://docs.linuxgsm.com/alerts/pushover +pushoveralert="off" +pushovertoken="accesstoken" + +# Telegram Alerts | https://docs.linuxgsm.com/alerts/telegram +# You can add a custom cURL string eg proxy (useful in Russia) or else in "curlcustomstring". +# like a "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help", if you not need +# any custom string in curl - simple ignore this parameter. +telegramalert="off" +telegramtoken="accesstoken" +telegramchatid="" +curlcustomstring="" + +## Updating | https://docs.linuxgsm.com/commands/update +updateonstart="off" + +## Backup | https://docs.linuxgsm.com/commands/backup +maxbackups="4" +maxbackupdays="30" +stoponbackup="on" + +## Logging | https://docs.linuxgsm.com/features/logging +consolelogging="on" +logdays="7" + +#### LinuxGSM Advanced Settings #### + +# ANSI Colors +ansi="on" + +## SteamCMD Settings +# Server appid +appid="17585" +# 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="Dystopia" +engine="source" + +#### Directories #### +# Edit with care + +## Server Specific Directories +systemdir="${serverfiles}/dystopia" +executabledir="${serverfiles}/bin" +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" +alertlog="${lgsmlogdir}/${servicename}-alert.log" +postdetailslog="${lgsmlogdir}/${servicename}-postdetails.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/data/serverlist.csv b/lgsm/data/serverlist.csv index 47c20e4b2..92ca3b4b9 100644 --- a/lgsm/data/serverlist.csv +++ b/lgsm/data/serverlist.csv @@ -25,6 +25,7 @@ doi,doiserver,Day of Infamy dmc,dmcserver,Deathmatch Classic dst,dstserver,Don't Starve Together dab,dabserver,Double Action: Boogaloo +dys,dysserver,Dystopia eco,ecoserver,Eco em,emserver,Empires Mod fctr,fctrserver,Factorio diff --git a/lgsm/functions/info_glibc.sh b/lgsm/functions/info_glibc.sh index c22e850ec..d822c4b95 100644 --- a/lgsm/functions/info_glibc.sh +++ b/lgsm/functions/info_glibc.sh @@ -51,6 +51,9 @@ elif [ "${gamename}" == "Day of Infamy" ]; then elif [ "${gamename}" == "Double Action: Boogaloo" ]; then glibcrequired="2.15" glibcfix="yes" +elif [ "${gamename}" == "Dystopia" ]; then + glibcrequired="2.15" + glibcfix="no" elif [ "${gamename}" == "Eco" ]; then glibcrequired="NOT REQUIRED" glibcfix="no" diff --git a/lgsm/functions/install_config.sh b/lgsm/functions/install_config.sh index 7659690ca..3b42615b3 100644 --- a/lgsm/functions/install_config.sh +++ b/lgsm/functions/install_config.sh @@ -313,6 +313,12 @@ elif [ "${gamename}" == "Double Action: Boogaloo" ]; then fn_fetch_default_config fn_default_config_remote fn_set_config_vars +elif [ "${gamename}" == "Dystopia" ]; then + gamedirname="Dystopia" + array_configs+=( server.cfg ) + fn_fetch_default_config + fn_default_config_remote + fn_set_config_vars elif [ "${gamename}" == "ET: Legacy" ]; then gamedirname="ETLegacy" array_configs+=( server.cfg ) From 6e48c66e189f4dc6db4136b03bd494a2efaa6919 Mon Sep 17 00:00:00 2001 From: frisasky1 <49201678+frisasky1@users.noreply.github.com> Date: Tue, 9 Apr 2019 20:26:56 +0800 Subject: [PATCH 040/534] fix(bsserver): fix launch issue and add GSLT support (#2276) Co-authored-by: digimoncn@gmail.com * fix launch problem * add gslt parameter * blade symphony now requires gslt --- lgsm/config-default/config-lgsm/bsserver/_default.cfg | 7 ++++++- lgsm/functions/install_gslt.sh | 8 ++++---- 2 files changed, 10 insertions(+), 5 deletions(-) diff --git a/lgsm/config-default/config-lgsm/bsserver/_default.cfg b/lgsm/config-default/config-lgsm/bsserver/_default.cfg index eacfe5900..ac2e83825 100644 --- a/lgsm/config-default/config-lgsm/bsserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/bsserver/_default.cfg @@ -20,9 +20,14 @@ sourcetvport="27020" defaultmap="duel_winter" maxplayers="16" +## Required: Game Server Login Token +# GSLT is required for running a public server. +# More info: https://linuxgsm.com/gslt +gslt="" + ## Server Start Command | https://docs.linuxgsm.com/configuration/start-parameters#additional-parameters fn_parms(){ -parms="-autoupdate -strictportbind -ip ${ip} -port ${port} +clientport ${clientport} +tv_port ${sourcetvport} +map ${defaultmap} +servercfgfile ${servercfg} -maxplayers ${maxplayers}" +parms="-game "${serverfiles}/berimbau" -autoupdate -strictportbind -ip ${ip} -port ${port} +clientport ${clientport} +tv_port ${sourcetvport} +sv_setsteamaccount ${gslt} +map ${defaultmap} +servercfgfile ${servercfg} -maxplayers ${maxplayers}" } #### LinuxGSM Settings #### diff --git a/lgsm/functions/install_gslt.sh b/lgsm/functions/install_gslt.sh index ab1ea7dca..2c8c0e9f3 100644 --- a/lgsm/functions/install_gslt.sh +++ b/lgsm/functions/install_gslt.sh @@ -12,7 +12,7 @@ echo "" echo "Game Server Login Token" echo "=================================" sleep 0.5 -if [ "${gamename}" == "Counter-Strike: Global Offensive" ]||[ "${gamename}" == "Counter-Strike: Source" ]||[ "${gamename}" == "No More Room in Hell" ]; then +if [ "${shortname}" == "csgo" ]||[ "${shortname}" == "css" ]||[ "${shortname}" == "nmrih" ]||[ "${shortname}" == "bs" ]; then echo "GSLT is required to run a public ${gamename} server" fn_script_log_info "GSLT is required to run a public ${gamename} server" else @@ -26,7 +26,7 @@ fn_script_log_info "Get more info and a token here:" fn_script_log_info "https://linuxgsm.com/gslt" echo "" if [ -z "${autoinstall}" ]; then - if [ "${gamename}" != "Tower Unite" ]; then + if [ "${shortname}" != "tu" ]; then echo "Enter token below (Can be blank)." echo -n "GSLT TOKEN: " read -r token @@ -38,11 +38,11 @@ if [ -z "${autoinstall}" ]; then fi fi sleep 0.5 -if [ "${gamename}" == "Tower Unite" ]; then +if [ "${shortname}" == "tu" ]; then echo "The GSLT can be changed by editing ${servercfgdir}/${servercfg}." fn_script_log_info "The GSLT can be changed by editing ${servercfgdir}/${servercfg}." else echo "The GSLT can be changed by editing ${configdirserver}/${servicename}.cfg." fn_script_log_info "The GSLT can be changed by editing ${configdirserver}/${servicename}.cfg." fi -echo "" \ No newline at end of file +echo "" From b6e3b1b191b6cf8e64645c17e6d8e2ef7654ffa7 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Tue, 9 Apr 2019 15:15:42 +0100 Subject: [PATCH 041/534] feat(install): refactor gslt to automatically detect gslt variable (#2280) --- lgsm/functions/command_install.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lgsm/functions/command_install.sh b/lgsm/functions/command_install.sh index 78b0e5441..2d0a4aa30 100644 --- a/lgsm/functions/command_install.sh +++ b/lgsm/functions/command_install.sh @@ -32,7 +32,7 @@ else # Configuration install_config.sh - if [ "${shortname}" == "bb2" ]||[ "${shortname}" == "bmdm" ]||[ "${shortname}" == "csgo" ]||[ "${shortname}" == "em" ]||[ "${shortname}" == "gmod" ]||[ "${shortname}" == "nmrih" ]||[ "${shortname}" == "tf2" ]||[ "${shortname}" == "tu" ]; then + if [ -v "${gslt}" ]; then install_gslt.sh elif [ "${shortname}" == "dst" ]; then install_dst_token.sh @@ -47,4 +47,4 @@ else fix.sh install_complete.sh core_exit.sh -fi \ No newline at end of file +fi From 38164851bd99c5798c48dac815847a501f739244 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Tue, 9 Apr 2019 15:56:24 +0100 Subject: [PATCH 042/534] fix(monitor): monitor does not continue to query if session has failed --- lgsm/functions/command_monitor.sh | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/lgsm/functions/command_monitor.sh b/lgsm/functions/command_monitor.sh index 3b36b3376..aeec02c59 100644 --- a/lgsm/functions/command_monitor.sh +++ b/lgsm/functions/command_monitor.sh @@ -124,6 +124,7 @@ fn_monitor_check_session(){ fn_script_log_info "Monitor is starting ${servername}" sleep 0.5 command_restart.sh + core_exit.sh fi sleep 0.5 } @@ -195,4 +196,4 @@ elif [ "${shortname}" == "ts3" ]||[ "${shortname}" == "eco" ]||[ "${shortname}" else fn_monitor_query fi -core_exit.sh \ No newline at end of file +core_exit.sh From 64d21a1b88cc5d1dcd977c8d8e22df62a5b0eac2 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Tue, 9 Apr 2019 20:00:55 +0100 Subject: [PATCH 043/534] fix(mcserver):correct minecraft port info (#2284) --- lgsm/functions/info_config.sh | 8 ++++---- lgsm/functions/info_messages.sh | 6 +++--- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/lgsm/functions/info_config.sh b/lgsm/functions/info_config.sh index 5c07f44ad..53b7637c6 100644 --- a/lgsm/functions/info_config.sh +++ b/lgsm/functions/info_config.sh @@ -320,6 +320,7 @@ fn_info_config_inss(){ rconport=${rconport:-"0"} fi } + fn_info_config_minecraft(){ if [ ! -f "${servercfgfullpath}" ]; then servername="${unavailable}" @@ -329,7 +330,6 @@ fn_info_config_minecraft(){ port="${zero}" queryport="${zero}" queryenabled="${unavailable}" - rconport="${zero}" gamemode="${unavailable}" gameworld="${unavailable}" else @@ -338,9 +338,8 @@ fn_info_config_minecraft(){ rconport=$(grep "rcon.port" "${servercfgfullpath}" | grep -v "#" | tr -cd '[:digit:]') maxplayers=$(grep "max-players" "${servercfgfullpath}" | grep -v "#" | tr -cd '[:digit:]') port=$(grep "server-port" "${servercfgfullpath}" | grep -v "#" | tr -cd '[:digit:]') - queryport=$(grep "query.port" "${servercfgfullpath}" | grep -v "#" | tr -cd '[:digit:]') + queryport="${port}" queryenabled=$(grep "enable-query" "${servercfgfullpath}" | sed -e 's/^[ \t]*//g' -e '/^#/d' -e 's/enable-query//g' | tr -d '=\";,:' | sed -e 's/^[ \t]*//' -e 's/[ \t]*$//') - rconport=$(grep "rcon.port" "${servercfgfullpath}" | grep -v "#" | tr -cd '[:digit:]') gamemode=$(grep "gamemode" "${servercfgfullpath}" | grep -v "#" | tr -cd '[:digit:]') gameworld=$(grep "level-name" "${servercfgfullpath}" | sed -e 's/^[ \t]*//g' -e '/^#/d' -e 's/level-name//g' | tr -d '=\";,:' | sed -e 's/^[ \t]*//' -e 's/[ \t]*$//') @@ -354,9 +353,10 @@ fn_info_config_minecraft(){ rconport=${rconport:-"NOT SET"} maxplayers=${maxplayers:-"NOT SET"} port=${port:-"NOT SET"} + queryport="${queryport:-"NOT SET"}" + queryenabled="${queryenabled:-"NOT SET"}" gamemode=${gamemode:-"NOT SET"} gameworld=${gameworld:-"NOT SET"} - fi } diff --git a/lgsm/functions/info_messages.sh b/lgsm/functions/info_messages.sh index 5080334dc..020b1b238 100644 --- a/lgsm/functions/info_messages.sh +++ b/lgsm/functions/info_messages.sh @@ -78,7 +78,7 @@ fn_info_message_performance(){ echo -e "${blue}CPU Model:\t${default}${cpumodel}" echo -e "${blue}CPU Cores:\t${default}${cpucores}" echo -e "${blue}CPU Frequency:\t${default}${cpufreuency}" - } | column -s $'\t' -t + } | column -s $'\t' -t echo -e "" { echo -e "${blue}Mem:\t${blue}total\tused\tfree\tcached\tavailable${default}" @@ -737,8 +737,8 @@ fn_info_message_minecraft(){ { echo -e "DESCRIPTION\tDIRECTION\tPORT\tPROTOCOL" echo -e "> Game\tINBOUND\t${port}\ttcp" - echo -e "> Game\tINBOUND\t${queryport}\tudp" - echo -e "> Game\tINBOUND\t${rconport}\ttcp" + echo -e "> Query\tINBOUND\t${queryport}\tudp" + echo -e "> Rcon\tINBOUND\t${rconport}\ttcp" } | column -s $'\t' -t } From f0eda3aa34868a4d7fce751dec7cfe9e7b87db4c Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Tue, 9 Apr 2019 20:05:56 +0100 Subject: [PATCH 044/534] fix(mcserver): eula now correctly alters to true (#2286) --- lgsm/functions/install_eula.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lgsm/functions/install_eula.sh b/lgsm/functions/install_eula.sh index c2554792f..cc676f0dc 100644 --- a/lgsm/functions/install_eula.sh +++ b/lgsm/functions/install_eula.sh @@ -39,7 +39,7 @@ if [ "${shortname}" == "ts3" ]; then touch "${executabledir}/.ts3server_license_accepted" elif [ "${shortname}" == "mc" ]; then touch "${serverfiles}/eula.txt" - sed -i "s/eula=false/eula=true/g" "${serverfiles}/eula.txt" + echo "eula=true" > "${serverfiles}/eula.txt" elif [ "${shortname}" == "ut" ]; then : fi From 8d54475023ea9264f3d6ff7a930e7aef68cdccf4 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Tue, 9 Apr 2019 23:53:53 +0100 Subject: [PATCH 045/534] fix(gsquery): update help with correct list of engines --- lgsm/functions/query_gsquery.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lgsm/functions/query_gsquery.py b/lgsm/functions/query_gsquery.py index 74c26eeb7..fe809be15 100644 --- a/lgsm/functions/query_gsquery.py +++ b/lgsm/functions/query_gsquery.py @@ -104,7 +104,7 @@ if __name__ == '__main__': action='store', dest='engine', default=False, - help='Engine type: avalanche2.0, avalanche3.0, goldsource, idtech2, idtech3, iw2.0, iw3.0, minecraft, quake, quakelive, realvirtuality, refractor, spark, source, unity3d, unreal, unreal2.' + help='Engine type: avalanche2.0 avalanche3.0 goldsource idtech2 idtech3 ioquake3 iw2.0 iw3.0 madness quake quakelive realvirtuality refracto source spark starbound unity3d unreal unreal2 unreal4 wurm.' ) parser.add_option( '-v', '--verbose', From b4eac064d2513c5001dc0d0bbdf595a7633e4f83 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Wed, 10 Apr 2019 00:00:46 +0100 Subject: [PATCH 046/534] feat(dev): add udp query to query raw --- lgsm/functions/command_dev_query_raw.sh | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/lgsm/functions/command_dev_query_raw.sh b/lgsm/functions/command_dev_query_raw.sh index 2b9267501..4d57e8aca 100644 --- a/lgsm/functions/command_dev_query_raw.sh +++ b/lgsm/functions/command_dev_query_raw.sh @@ -55,4 +55,18 @@ if [ "${querystatus}" == "0" ]; then echo "tcp query PASS" else echo "tcp query FAIL" -fi \ No newline at end of file +fi + +echo"" +echo "=================================" +echo "udp Raw Output" +echo "=================================" +echo"" +echo "bash -c 'exec 3<> /dev/udp/'${ip}'/'${queryport}''" +bash -c 'exec 3<> /dev/udp/'${ip}'/'${queryport}'' +querystatus="$?" +if [ "${querystatus}" == "0" ]; then + echo "udp query PASS" +else + echo "udp query FAIL" +fi From 11547a3c82edce6ffcc656f4279e5cb3790bf395 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Wed, 10 Apr 2019 00:20:52 +0100 Subject: [PATCH 047/534] feat(travis-ci): Add support for Minecraft test to travis-ci (#2287) * feat(travis-ci): add minecraft test * update MIT Licence date * feat(travis): depricate travis-ci shellcheck * removed bash from travis as reverting to trusty * fix(mcserver): eula now correctly alteres to true * fix(update): correct mcserver timed loop * travis-ci now uses ens interface instead of eth * added internet IP next to query raw --- .travis.yml | 8 +- lgsm/functions/install_server_files.sh | 2 +- lgsm/functions/update_minecraft.sh | 5 +- linuxgsm.sh | 4 +- tests/tests_fctrserver.sh | 14 +- tests/tests_jc2server.sh | 14 +- tests/tests_mcserver.sh | 1043 ++++++++++++++++++++++++ tests/tests_shellcheck.sh | 4 +- tests/tests_ts3server.sh | 14 +- 9 files changed, 1086 insertions(+), 22 deletions(-) create mode 100644 tests/tests_mcserver.sh diff --git a/.travis.yml b/.travis.yml index 39bef46e4..59c6d892b 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,4 +1,4 @@ -language: bash node_js +language: node_js dist: xenial node_js: - 10 @@ -40,6 +40,8 @@ jobs: - # stage name not required script: bash tests/tests_fctrserver.sh - # stage name not required - script: bash tests/tests_ts3server.sh + script: bash tests/tests_mcserver.sh - # stage name not required - script: bash tests/tests_shellcheck.sh + script: bash tests/tests_ts3server.sh + - # retired as codacy does this check. + # script: bash tests/tests_shellcheck.sh diff --git a/lgsm/functions/install_server_files.sh b/lgsm/functions/install_server_files.sh index ddaf33202..871cd403e 100644 --- a/lgsm/functions/install_server_files.sh +++ b/lgsm/functions/install_server_files.sh @@ -36,7 +36,7 @@ fn_install_server_files(){ elif [ "${shortname}" == "qw" ]; then remote_fileurl="https://files.linuxgsm.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 [ "${shortname}" == "rtcw" ]; then - remote_fileurl="https://files.linuxgsm.com/ReturnToCastleWolfenstein/iortcw-1.51b-x86_64-server-linux-20190208.tar.bz2"; local_filedir="${tmpdir}"; local_filename="iortcw-1.51b-x86_64-server-linux-20190208.tar.bz2"; chmodx="nochmodx" run="norun"; force="noforce"; md5="7e555481a3b98e168dfb5e6ddc2fb879" + remote_fileurl="https://files.linuxgsm.com/ReturnToCastleWolfenstein/iortcw-1.51b-x86_64-server-linux-20190208.tar.bz2"; local_filedir="${tmpdir}"; local_filename="iortcw-1.51b-x86_64-server-linux-20190208.tar.bz2"; chmodx="nochmodx" run="norun"; force="noforce"; md5="7e555481a3b98e168dfb5e6ddc2fb879" elif [ "${shortname}" == "ut2k4" ]; then remote_fileurl="https://files.linuxgsm.com/UnrealTournament2004/ut2004-server-3369-2-ultimate-linux.tar.bz2"; local_filedir="${tmpdir}"; local_filename="ut2004-server-3369-2-ultimate-linux.tar.bz2"; chmodx="nochmodx" run="norun"; force="noforce"; md5="67c5e2cd9c2a4b04f163962ee41eff54" elif [ "${shortname}" == "ut99" ]; then diff --git a/lgsm/functions/update_minecraft.sh b/lgsm/functions/update_minecraft.sh index 02b2b8c12..7bdcf3e48 100644 --- a/lgsm/functions/update_minecraft.sh +++ b/lgsm/functions/update_minecraft.sh @@ -74,16 +74,15 @@ fn_update_minecraft_localbuild(){ if [ -z "${localbuild}" ]; then # Gives time for var to generate. - end="$(SECONDS+120)" totalseconds=0 - while [ "${SECONDS}" -lt "${end}" ]; do + for seconds in {1..120}; do fn_print_info "Checking for update: ${remotelocation}: checking local build: waiting for local build: ${totalseconds}" if [ -z "${loopignore}" ]; then loopignore=1 fn_script_log_info "Waiting for local build to generate" fi localbuild=$(cat "${serverfiles}/logs/latest.log" 2> /dev/null | grep version | grep -Eo '((\.)?[0-9]{1,3}){1,3}\.[0-9]{1,3}' | grep -Eo "TeamSpeak 3 Server ((\.)?[0-9]{1,3}){1,3}\.[0-9]{1,3}" | grep -Eo "((\.)?[0-9]{1,3}){1,3}\.[0-9]{1,3}") - if [ "${localbuild}" ]; then + if [ "${localbuild}" ]||[ "${seconds}" == "120" ]; then break fi sleep 1 diff --git a/linuxgsm.sh b/linuxgsm.sh index d7a274693..9502f2db3 100755 --- a/linuxgsm.sh +++ b/linuxgsm.sh @@ -1,7 +1,7 @@ #!/bin/bash # Project: Game Server Managers - LinuxGSM # Author: Daniel Gibbs -# License: MIT License, Copyright (c) 2017 Daniel Gibbs +# License: MIT License, Copyright (c) 2019 Daniel Gibbs # Purpose: Linux Game Server Management Script # Contributors: https://linuxgsm.com/contrib # Documentation: https://docs.linuxgsm.com @@ -377,4 +377,4 @@ else getopt=$1 core_getopt.sh fi -fi \ No newline at end of file +fi diff --git a/tests/tests_fctrserver.sh b/tests/tests_fctrserver.sh index dc0d0b056..330742abb 100644 --- a/tests/tests_fctrserver.sh +++ b/tests/tests_fctrserver.sh @@ -1,7 +1,7 @@ #!/bin/bash # Project: Game Server Managers - LinuxGSM # Author: Daniel Gibbs -# License: MIT License, Copyright (c) 2017 Daniel Gibbs +# License: MIT License, Copyright (c) 2019 Daniel Gibbs # Purpose: Travis CI Tests: Factorio | Linux Game Server Management Script # Contributors: https://github.com/GameServerManagers/LinuxGSM/graphs/contributors # Documentation: https://docs.linuxgsm.com/ @@ -452,6 +452,14 @@ fn_test_result_fail(){ fi } +# test result n/a +fn_test_result_na(){ + echo "=================================" + echo "Expected result: N/A" + echo "Actual result: N/A" + fn_print_fail_nl "TEST N/A" +} + echo "=================================" echo "Travis CI Tests" echo "Linux Game Server Manager" @@ -570,7 +578,7 @@ echo "=================" grep functionfile= "${TRAVIS_BUILD_DIR}/dev-debug.log" | sed 's/functionfile=//g' echo "" -echo "2.0 - Instalation" +echo "2.0 - Installation" echo "==================================================================" echo "" @@ -986,4 +994,4 @@ requiredstatus="OFFLINE" fn_setstatus fn_print_info "Tidying up directories." rm -rfv "${serverfiles}" -core_exit.sh \ No newline at end of file +core_exit.sh diff --git a/tests/tests_jc2server.sh b/tests/tests_jc2server.sh index 573b2dd0e..f71d5a669 100644 --- a/tests/tests_jc2server.sh +++ b/tests/tests_jc2server.sh @@ -1,7 +1,7 @@ #!/bin/bash # Project: Game Server Managers - LinuxGSM # Author: Daniel Gibbs -# License: MIT License, Copyright (c) 2017 Daniel Gibbs +# License: MIT License, Copyright (c) 2019 Daniel Gibbs # Purpose: Travis CI Tests: Just Cause 2 | Linux Game Server Management Script # Contributors: https://github.com/GameServerManagers/LinuxGSM/graphs/contributors # Documentation: https://docs.linuxgsm.com/ @@ -578,7 +578,7 @@ echo "=================" grep functionfile= "${TRAVIS_BUILD_DIR}/dev-debug.log" | sed 's/functionfile=//g' echo "" -echo "2.0 - Instalation" +echo "2.0 - Installation" echo "==================================================================" echo "" @@ -904,14 +904,18 @@ echo "=================================" echo "Description:" echo "Inserting Travis IP in to config." echo "Allows monitor to work" -travisip=$(ip -o -4 addr|grep eth0|awk '{print $4}'|grep -oe '\([0-9]\{1,3\}\.\?\)\{4\}'|grep -v 127.0.0) +if [ "$(ip -o -4 addr|grep eth0)" ]; then + travisip=$(ip -o -4 addr | grep eth0 | awk '{print $4}' | grep -oe '\([0-9]\{1,3\}\.\?\)\{4\}' | grep -v 127.0.0) +else + travisip=$(ip -o -4 addr | grep ens | awk '{print $4}' | grep -oe '\([0-9]\{1,3\}\.\?\)\{4\}' | sort -u | grep -v 127.0.0) +fi sed -i "/BindIP/c\BindIP = \"${travisip}\"," "${serverfiles}/config.lua" echo "IP: ${travisip}" echo "" echo "5.0 - Monitor Tests" echo "==================================================================" - +info_config.sh echo "" echo "Server IP - Port: ${ip}:${port}" echo "Server IP - Query Port: ${ip}:${queryport}" @@ -1151,4 +1155,4 @@ requiredstatus="OFFLINE" fn_setstatus fn_print_info "Tidying up directories." rm -rfv "${serverfiles}" -core_exit.sh \ No newline at end of file +core_exit.sh diff --git a/tests/tests_mcserver.sh b/tests/tests_mcserver.sh new file mode 100644 index 000000000..be518434b --- /dev/null +++ b/tests/tests_mcserver.sh @@ -0,0 +1,1043 @@ +#!/bin/bash +# Project: Game Server Managers - LinuxGSM +# Author: Daniel Gibbs +# License: MIT License, Copyright (c) 2019 Daniel Gibbs +# Purpose: Travis CI Tests: Factorio | Linux Game Server Management Script +# Contributors: https://github.com/GameServerManagers/LinuxGSM/graphs/contributors +# Documentation: https://docs.linuxgsm.com/ +# Website: https://linuxgsm.com +travistest="1" +version="190401" +shortname="mc" +gameservername="mcserver" +rootdir="$(dirname "$(readlink -f "${BASH_SOURCE[0]}")")" +selfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" +servicename="${gameservername}" +lockselfname=".${servicename}.lock" +lgsmdir="${rootdir}/lgsm" +logdir="${rootdir}/log" +lgsmlogdir="${logdir}/lgsm" +steamcmddir="${rootdir}/steamcmd" +serverfiles="${rootdir}/serverfiles" +functionsdir="${lgsmdir}/functions" +libdir="${lgsmdir}/lib" +tmpdir="${lgsmdir}/tmp" +configdir="${lgsmdir}/config-lgsm" +configdirserver="${configdir}/${gameservername}" +configdirdefault="${lgsmdir}/config-default" + +# Allows for testing not on Travis CI +if [ ! -v TRAVIS ]; then + TRAVIS_BRANCH="develop" + TRAVIS_BUILD_DIR="${rootdir}" +fi + +## 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}" + +# Core Function that is required first +core_functions.sh(){ + functionfile="${FUNCNAME}" + fn_bootstrap_fetch_file_github "lgsm/functions" "core_functions.sh" "${functionsdir}" "chmodx" "run" "noforcedl" "nomd5" +} + +# Bootstrap +# Fetches the core functions required before passed off to core_dl.sh + +# Fetches core functions +fn_bootstrap_fetch_file(){ + remote_fileurl="${1}" + local_filedir="${2}" + local_filename="${3}" + chmodx="${4:-0}" + run="${5:-0}" + forcedl="${6:-0}" + md5="${7:-0}" + # download file if missing or download forced + if [ ! -f "${local_filedir}/${local_filename}" ]||[ "${forcedl}" == "forcedl" ]; then + if [ ! -d "${local_filedir}" ]; then + mkdir -p "${local_filedir}" + fi + # Defines curl path + curlpath=$(command -v curl 2>/dev/null) + + # If curl exists download file + if [ "$(basename "${curlpath}")" == "curl" ]; then + # trap to remove part downloaded files + echo -en " 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" + if [ -f "${lgsmlog}" ]; then + echo -e "${remote_fileurl}" | tee -a "${lgsmlog}" + echo "${curlcmd}" | tee -a "${lgsmlog}" + fi + exit 1 + else + echo -e "\e[0;32mOK\e[0m" + fi + else + echo "[ FAIL ] Curl is not installed" + exit 1 + fi + # make file chmodx if chmodx is set + if [ "${chmodx}" == "chmodx" ]; then + chmod +x "${local_filedir}/${local_filename}" + fi + fi + + if [ -f "${local_filedir}/${local_filename}" ]; then + # run file if run is set + if [ "${run}" == "run" ]; then + source "${local_filedir}/${local_filename}" + fi + 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 + +fn_print_center() { + columns="$(tput cols)" + line="$@" + printf "%*s\n" $(( (${#line} + columns) / 2)) "${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 +} + +# 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 "$(command -v "${menucmd}")" ]; then + menucmd=$(command -v "${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 -aw "${userinput}" "${serverlist}")) + shortname="${server_info_array[0]}" # csgo + gameservername="${server_info_array[1]}" # csgoserver + gamename="${server_info_array[2]}" # Counter Strike: Global Offensive +} + +fn_install_getopt(){ + userinput="empty" + echo "Usage: $0 [option]" + echo -e "" + echo "Installer - Linux Game Server Managers - Version ${version}" + echo "https://linuxgsm.com" + echo -e "" + echo -e "Commands" + echo -e "install\t\t| Select server to install." + echo -e "servername\t| e.g $0 csgoserver. Enter name of server/game to install." + echo -e "list\t\t| List all servers available for install." + exit +} + +fn_install_file(){ + local_filename="${gameservername}" + if [ -e "${local_filename}" ]; then + i=2 + while [ -e "${local_filename}-${i}" ] ; do + let i++ + done + local_filename="${local_filename}-${i}" + fi + cp -R "${selfname}" "${local_filename}" + sed -i -e "s/shortname=\"core\"/shortname=\"${shortname}\"/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 + echo "./${local_filename} install" + else + echo "Remember to check server ports" + echo "./${local_filename} details" + fi + echo "" + 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 + +# LinuxGSM installer mode +if [ "${shortname}" == "core" ]; then + userinput=$1 + datadir="${tmpdir}/data" + serverlist="${datadir}/serverlist.csv" + + # Download the latest serverlist. This is the complete list of all supported servers. + fn_bootstrap_fetch_file_github "lgsm/data" "serverlist.csv" "${datadir}" "nochmodx" "norun" "forcedl" "nomd5" + 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" ]||[ "${userinput}" == "i" ]; then + fn_install_menu result "LinuxGSM" "Select game to install" "${serverlist}" + userinput="${result}" + fn_server_info + if [ "${result}" == "${gameservername}" ]; then + fn_install_file + elif [ "${result}" == "" ]; then + echo "Install canceled" + else + echo "[ FAIL ] menu result does not match gameservername" + echo "result: ${result}" + echo "gameservername: ${gameservername}" + fi + elif [ -n "${userinput}" ]; then + fn_server_info + if [ "${userinput}" == "${gameservername}" ]||[ "${userinput}" == "${gamename}" ]||[ "${userinput}" == "${shortname}" ]; then + fn_install_file + else + echo "[ FAIL ] unknown game server" + fi + else + fn_install_getopt + fi + +# LinuxGSM Server Mode +else + 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/${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 -en " copying _default.cfg...\c" + 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" + exit 1 + else + echo -e "\e[0;32mOK\e[0m" + fi + else + 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 -en " copying _default.cfg...\c" + 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" + exit 1 + else + echo -e "\e[0;32mOK\e[0m" + fi + fi + fi + 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" "${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" "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 + fn_fetch_file_github "" "linuxgsm.sh" "${tmpdir}" "chmodx" "norun" "noforcedl" "nomd5" + fi + + # Prevents running of core_exit.sh for Travis. + if [ -z "${travistest}" ]; then + getopt=$1 + core_getopt.sh + fi +fi + +fn_currentstatus_tmux(){ + check_status.sh + if [ "${status}" != "0" ]; then + currentstatus="ONLINE" + else + currentstatus="OFFLINE" + fi +} + +fn_currentstatus_ts3(){ + check_status.sh + if [ "${status}" != "0" ]; then + currentstatus="ONLINE" + else + currentstatus="OFFLINE" + fi +} + +fn_setstatus(){ + fn_currentstatus_tmux + echo"" + echo "Required status: ${requiredstatus}" + counter=0 + echo "Current status: ${currentstatus}" + while [ "${requiredstatus}" != "${currentstatus}" ]; do + counter=$((counter+1)) + fn_currentstatus_tmux + echo -en "New status: ${currentstatus}\\r" + + if [ "${requiredstatus}" == "ONLINE" ]; then + (command_start.sh > /dev/null 2>&1) + else + (command_stop.sh > /dev/null 2>&1) + fi + if [ "${counter}" -gt "5" ]; then + currentstatus="FAIL" + echo "Current status: ${currentstatus}" + echo "" + echo "Unable to start or stop server." + exit 1 + fi + done + echo -en "New status: ${currentstatus}\\r" + echo -e "\n" + echo "Test starting:" + echo "" + sleep 0.5 +} + +# End of every test will expect the result to either pass or fail +# If the script does not do as intended the whole test will fail +# if expecting a pass +fn_test_result_pass(){ + if [ $? != 0 ]; then + echo "=================================" + echo "Expected result: PASS" + echo "Actual result: FAIL" + fn_print_fail_nl "TEST FAILED" + exitcode=1 + core_exit.sh + else + echo "=================================" + echo "Expected result: PASS" + echo "Actual result: PASS" + fn_print_ok_nl "TEST PASSED" + echo "" + fi +} + +# if expecting a fail +fn_test_result_fail(){ + if [ $? == 0 ]; then + echo "=================================" + echo "Expected result: FAIL" + echo "Actual result: PASS" + fn_print_fail_nl "TEST FAILED" + exitcode=1 + core_exit.sh + else + echo "=================================" + echo "Expected result: FAIL" + echo "Actual result: FAIL" + fn_print_ok_nl "TEST PASSED" + echo "" + fi +} + +# test result n/a +fn_test_result_na(){ + echo "=================================" + echo "Expected result: N/A" + echo "Actual result: N/A" + fn_print_fail_nl "TEST N/A" +} + +echo "=================================" +echo "Travis CI Tests" +echo "Linux Game Server Manager" +echo "by Daniel Gibbs" +echo "Contributors: http://goo.gl/qLmitD" +echo "https://linuxgsm.com" +echo "=================================" +echo "" +echo "=================================" +echo "Server Tests" +echo "Using: ${gamename}" +echo "Testing Branch: $TRAVIS_BRANCH" +echo "=================================" + +echo "" +echo "0.0 - Pre-test Tasks" +echo "==================================================================" +echo "Description:" +echo "Create log dir's" +echo "" + +echo "" +echo "0.1 - Create log dir's" +echo "=================================" +echo "" +( + exec 5>"${TRAVIS_BUILD_DIR}/dev-debug.log" + BASH_XTRACEFD="5" + set -x + install_logs.sh +) +echo "run order" +echo "=================" +grep functionfile= "${TRAVIS_BUILD_DIR}/dev-debug.log" | sed 's/functionfile=//g' + +echo "" +echo "0.2 - Enable dev-debug" +echo "=================================" +echo "Description:" +echo "Enable dev-debug" +echo "" +( + exec 5>"${TRAVIS_BUILD_DIR}/dev-debug.log" + BASH_XTRACEFD="5" + set -x + command_dev_debug.sh +) +fn_test_result_pass +echo "run order" +echo "=================" +grep functionfile= "${TRAVIS_BUILD_DIR}/dev-debug.log" | sed 's/functionfile=//g' + +echo "" +echo "1.0 - Pre-install tests" +echo "==================================================================" +echo "" + +echo "1.1 - start - no files" +echo "=================================" +echo "Description:" +echo "test script reaction to missing server files." +echo "Command: ./${gameservername} start" +echo "" +# Allows for testing not on Travis CI +if [ ! -v TRAVIS ]; then +( + exec 5>"${TRAVIS_BUILD_DIR}/dev-debug.log" + BASH_XTRACEFD="5" + set -x + command_start.sh +) +fn_test_result_fail +else + echo "Test bypassed" +fi + +echo "run order" +echo "=================" +grep functionfile= "${TRAVIS_BUILD_DIR}/dev-debug.log" | sed 's/functionfile=//g' + +echo "" +echo "1.2 - getopt" +echo "=================================" +echo "Description:" +echo "displaying options messages." +echo "Command: ./${gameservername}" +echo "" +( + exec 5>"${TRAVIS_BUILD_DIR}/dev-debug.log" + BASH_XTRACEFD="5" + set -x + core_getopt.sh +) +fn_test_result_pass +echo "run order" +echo "=================" +grep functionfile= "${TRAVIS_BUILD_DIR}/dev-debug.log" | sed 's/functionfile=//g' + +echo "" +echo "1.3 - getopt with incorrect args" +echo "=================================" +echo "Description:" +echo "displaying options messages." +echo "Command: ./${gameservername} abc123" +echo "" +getopt="abc123" +( + exec 5>"${TRAVIS_BUILD_DIR}/dev-debug.log" + BASH_XTRACEFD="5" + set -x + core_getopt.sh +) +fn_test_result_fail +echo "run order" +echo "=================" +grep functionfile= "${TRAVIS_BUILD_DIR}/dev-debug.log" | sed 's/functionfile=//g' + +echo "" +echo "2.0 - Installation" +echo "==================================================================" + +echo "" +echo "2.0 - install" +echo "=================================" +echo "Description:" +echo "install ${gamename} server." +echo "Command: ./${gameservername} auto-install" +( + exec 5>"${TRAVIS_BUILD_DIR}/dev-debug.log" + BASH_XTRACEFD="5" + set -x + fn_autoinstall +) +fn_test_result_pass +echo "run order" +echo "=================" +grep functionfile= "${TRAVIS_BUILD_DIR}/dev-debug.log" | sed 's/functionfile=//g' + +echo "" +echo "3.0 - Start/Stop/Restart Tests" +echo "==================================================================" + +echo "" +echo "3.1 - start" +echo "=================================" +echo "Description:" +echo "start ${gamename} server." +echo "Command: ./${gameservername} start" +requiredstatus="OFFLINE" +fn_setstatus +( + exec 5>"${TRAVIS_BUILD_DIR}/dev-debug.log" + BASH_XTRACEFD="5" + set -x + command_start.sh +) +fn_test_result_pass +echo "run order" +echo "=================" +grep functionfile= "${TRAVIS_BUILD_DIR}/dev-debug.log" | sed 's/functionfile=//g' + +echo "" +echo "3.2 - start - online" +echo "=================================" +echo "Description:" +echo "start ${gamename} server while already running." +echo "Command: ./${gameservername} start" +requiredstatus="ONLINE" +fn_setstatus +( + exec 5>"${TRAVIS_BUILD_DIR}/dev-debug.log" + BASH_XTRACEFD="5" + set -x + command_start.sh +) +fn_test_result_fail +echo "run order" +echo "=================" +grep functionfile= "${TRAVIS_BUILD_DIR}/dev-debug.log" | sed 's/functionfile=//g' + +echo "" +echo "3.3 - start - updateonstart" +echo "=================================" +echo "Description:" +echo "will update server on start." +echo "Command: ./${gameservername} start" +requiredstatus="OFFLINE" +fn_setstatus +( + exec 5>"${TRAVIS_BUILD_DIR}/dev-debug.log" + BASH_XTRACEFD="5" + set -x + updateonstart="on";command_start.sh +) +fn_test_result_pass +echo "run order" +echo "=================" +grep functionfile= "${TRAVIS_BUILD_DIR}/dev-debug.log" | sed 's/functionfile=//g' +echo "" +echo "30s Pause" +echo "=================================" +echo "Description:" +echo "give time for server to fully start." +echo "Command: sleep 30" +requiredstatus="ONLINE" +fn_setstatus +sleep 30 + +echo "" +echo "3.4 - stop" +echo "=================================" +echo "Description:" +echo "stop ${gamename} server." +echo "Command: ./${gameservername} stop" +requiredstatus="ONLINE" +fn_setstatus +( + exec 5>"${TRAVIS_BUILD_DIR}/dev-debug.log" + BASH_XTRACEFD="5" + set -x + command_stop.sh +) +fn_test_result_pass +echo "run order" +echo "=================" +grep functionfile= "${TRAVIS_BUILD_DIR}/dev-debug.log" | sed 's/functionfile=//g' + +echo "" +echo "3.5 - stop - offline" +echo "=================================" +echo "Description:" +echo "stop ${gamename} server while already stopped." +echo "Command: ./${gameservername} stop" +requiredstatus="OFFLINE" +fn_setstatus +( + exec 5>"${TRAVIS_BUILD_DIR}/dev-debug.log" + BASH_XTRACEFD="5" + set -x + command_stop.sh +) +fn_test_result_fail +echo "run order" +echo "=================" +grep functionfile= "${TRAVIS_BUILD_DIR}/dev-debug.log" | sed 's/functionfile=//g' + +echo "" +echo "3.6 - restart" +echo "=================================" +echo "Description:" +echo "restart ${gamename}." +echo "Command: ./${gameservername} restart" +requiredstatus="ONLINE" +fn_setstatus +( + exec 5>"${TRAVIS_BUILD_DIR}/dev-debug.log" + BASH_XTRACEFD="5" + set -x + command_restart.sh +) +fn_test_result_pass +echo "run order" +echo "=================" +grep functionfile= "${TRAVIS_BUILD_DIR}/dev-debug.log" | sed 's/functionfile=//g' + +echo "" +echo "3.7 - restart - offline" +echo "=================================" +echo "Description:" +echo "restart ${gamename} while already stopped." +echo "Command: ./${gameservername} restart" +requiredstatus="OFFLINE" +fn_setstatus +( + exec 5>"${TRAVIS_BUILD_DIR}/dev-debug.log" + BASH_XTRACEFD="5" + set -x + command_restart.sh +) +fn_test_result_pass +echo "run order" +echo "=================" +grep functionfile= "${TRAVIS_BUILD_DIR}/dev-debug.log" | sed 's/functionfile=//g' + +echo "" +echo "4.0 - Update Tests" +echo "==================================================================" + +echo "" +echo "4.1 - update" +echo "=================================" +echo "Description:" +echo "check for updates." +echo "Command: ./${gameservername} update" +requiredstatus="OFFLINE" +fn_setstatus +( + exec 5>"${TRAVIS_BUILD_DIR}/dev-debug.log" + BASH_XTRACEFD="5" + set -x + command_update.sh +) +fn_test_result_pass +echo "run order" +echo "=================" +grep functionfile= "${TRAVIS_BUILD_DIR}/dev-debug.log" | sed 's/functionfile=//g' + +echo "" +echo "Inserting IP address" +echo "=================================" +echo "Description:" +echo "Inserting Travis IP in to config." +echo "Allows monitor to work" +if [ "$(ip -o -4 addr|grep eth0)" ]; then + travisip=$(ip -o -4 addr | grep eth0 | awk '{print $4}' | grep -oe '\([0-9]\{1,3\}\.\?\)\{4\}' | grep -v 127.0.0) +else + travisip=$(ip -o -4 addr | grep ens | awk '{print $4}' | grep -oe '\([0-9]\{1,3\}\.\?\)\{4\}' | sort -u | grep -v 127.0.0) +fi +sed -i "/server-ip=/c\server-ip=${travisip}" "${serverfiles}/server.properties" +echo "IP: ${travisip}" + +echo "" +echo "5.0 - Monitor Tests" +echo "==================================================================" +info_config.sh +echo "" +echo "Server IP - Port: ${ip}:${port}" +echo "Server IP - Query Port: ${ip}:${queryport}" + +echo "" +echo "30s Pause" +echo "=================================" +echo "Description:" +echo "give time for server to fully start." +echo "Command: sleep 30" +requiredstatus="ONLINE" +fn_setstatus +sleep 60 + +echo "" +echo "5.1 - monitor - online" +echo "=================================" +echo "Description:" +echo "run monitor server while already running." +echo "Command: ./${gameservername} monitor" +requiredstatus="ONLINE" +fn_setstatus +( + exec 5>"${TRAVIS_BUILD_DIR}/dev-debug.log" + BASH_XTRACEFD="5" + set -x + command_monitor.sh +) +fn_test_result_pass +echo "run order" +echo "=================" +grep functionfile= "${TRAVIS_BUILD_DIR}/dev-debug.log" | sed 's/functionfile=//g' + +echo "" +echo "5.2 - monitor - offline - with lockfile" +echo "=================================" +echo "Description:" +echo "run monitor while server is offline with lockfile." +echo "Command: ./${gameservername} monitor" +requiredstatus="OFFLINE" +fn_setstatus +fn_print_info_nl "creating lockfile." +date > "${rootdir}/${lockselfname}" +( + exec 5>"${TRAVIS_BUILD_DIR}/dev-debug.log" + BASH_XTRACEFD="5" + set -x + command_monitor.sh +) +fn_test_result_pass +echo "run order" +echo "=================" +grep functionfile= "${TRAVIS_BUILD_DIR}/dev-debug.log" | sed 's/functionfile=//g' + +echo "" +echo "5.3 - monitor - offline - no lockfile" +echo "=================================" +echo "Description:" +echo "run monitor while server is offline with no lockfile." +echo "Command: ./${gameservername} monitor" +requiredstatus="OFFLINE" +fn_setstatus +( + exec 5>"${TRAVIS_BUILD_DIR}/dev-debug.log" + BASH_XTRACEFD="5" + set -x + command_monitor.sh +) +fn_test_result_fail +echo "run order" +echo "=================" +grep functionfile= "${TRAVIS_BUILD_DIR}/dev-debug.log" | sed 's/functionfile=//g' + +echo "" +echo "5.4 - test-alert" +echo "=================================" +echo "Description:" +echo "run monitor while server is offline with no lockfile." +echo "Command: ./${gameservername} test-alert" +requiredstatus="OFFLINE" +fn_setstatus +( + exec 5>"${TRAVIS_BUILD_DIR}/dev-debug.log" + BASH_XTRACEFD="5" + set -x + command_test_alert.sh +) +fn_test_result_fail +echo "run order" +echo "=================" +grep functionfile= "${TRAVIS_BUILD_DIR}/dev-debug.log" | sed 's/functionfile=//g' + +echo "" +echo "6.0 - Details Tests" +echo "==================================================================" + +echo "" +echo "6.1 - details" +echo "=================================" +echo "Description:" +echo "display details." +echo "Command: ./${gameservername} details" +requiredstatus="ONLINE" +fn_setstatus +( + exec 5>"${TRAVIS_BUILD_DIR}/dev-debug.log" + BASH_XTRACEFD="5" + set -x + command_details.sh +) +fn_test_result_pass +echo "run order" +echo "=================" +grep functionfile= "${TRAVIS_BUILD_DIR}/dev-debug.log" | sed 's/functionfile=//g' + +echo "" +echo "6.2 - postdetails" +echo "=================================" +echo "Description:" +echo "post details." +echo "Command: ./${gameservername} postdetails" +requiredstatus="ONLINE" +fn_setstatus +( + exec 5>"${TRAVIS_BUILD_DIR}/dev-debug.log" + BASH_XTRACEFD="5" + set -x + command_postdetails.sh +) +fn_test_result_pass +echo "run order" +echo "=================" +grep functionfile= "${TRAVIS_BUILD_DIR}/dev-debug.log" | sed 's/functionfile=//g' + +echo "" +echo "7.0 - Backup Tests" +echo "==================================================================" + +echo "" +echo "7.1 - backup" +echo "=================================" +echo "Description:" +echo "run a backup." +echo "Command: ./${gameservername} backup" +requiredstatus="ONLINE" +fn_setstatus +echo "test de-activated until issue #1839 fixed" +#(command_backup.sh) +fn_test_result_pass +echo "run order" +echo "=================" +grep functionfile= "${TRAVIS_BUILD_DIR}/dev-debug.log" | sed 's/functionfile=//g' + +echo "" +echo "8.0 - Development Tools Tests" +echo "==================================================================" + +echo "" +echo "8.1 - dev - detect glibc" +echo "=================================" +echo "Description:" +echo "detect glibc." +echo "Command: ./${gameservername} detect-glibc" +requiredstatus="ONLINE" +fn_setstatus +( + exec 5>"${TRAVIS_BUILD_DIR}/dev-debug.log" + BASH_XTRACEFD="5" + set -x + command_dev_detect_glibc.sh +) +fn_test_result_pass +echo "run order" +echo "=================" +grep functionfile= "${TRAVIS_BUILD_DIR}/dev-debug.log" | sed 's/functionfile=//g' + +echo "" +echo "8.2 - dev - detect ldd" +echo "=================================" +echo "Description:" +echo "detect ldd." +echo "Command: ./${gameservername} detect-ldd" +requiredstatus="ONLINE" +fn_setstatus +( + exec 5>"${TRAVIS_BUILD_DIR}/dev-debug.log" + BASH_XTRACEFD="5" + set -x + command_dev_detect_ldd.sh +) +fn_test_result_pass +echo "run order" +echo "=================" +grep functionfile= "${TRAVIS_BUILD_DIR}/dev-debug.log" | sed 's/functionfile=//g' + +echo "" +echo "8.3 - dev - detect deps" +echo "=================================" +echo "Description:" +echo "detect dependencies." +echo "Command: ./${gameservername} detect-deps" +requiredstatus="ONLINE" +fn_setstatus +( + exec 5>"${TRAVIS_BUILD_DIR}/dev-debug.log" + BASH_XTRACEFD="5" + set -x + command_dev_detect_deps.sh +) +fn_test_result_pass +echo "run order" +echo "=================" +grep functionfile= "${TRAVIS_BUILD_DIR}/dev-debug.log" | sed 's/functionfile=//g' + +echo "" +echo "Inserting IP address" +echo "=================================" +echo "Description:" +echo "Inserting Travis IP in to config." +echo "Allows monitor to work" +if [ "$(ip -o -4 addr|grep eth0)" ]; then + travisip=$(ip -o -4 addr | grep eth0 | awk '{print $4}' | grep -oe '\([0-9]\{1,3\}\.\?\)\{4\}' | grep -v 127.0.0) +else + travisip=$(ip -o -4 addr | grep ens | awk '{print $4}' | grep -oe '\([0-9]\{1,3\}\.\?\)\{4\}' | sort -u | grep -v 127.0.0) +fi +sed -i "/server-ip=/c\server-ip=${travisip}" "${serverfiles}/server.properties" +echo "IP: ${travisip}" + +echo "" +echo "8.4 - dev - query-raw" +echo "=================================" +echo "Description:" +echo "raw query output." +echo "Command: ./${gameservername} query-raw" +requiredstatus="ONLINE" +fn_setstatus +( + exec 5>"${TRAVIS_BUILD_DIR}/dev-debug.log" + BASH_XTRACEFD="5" + set -x + command_dev_query_raw.sh +) +fn_test_result_na +echo "run order" +echo "=================" +grep functionfile= "${TRAVIS_BUILD_DIR}/dev-debug.log" | sed 's/functionfile=//g' + +echo "" +echo "=================================" +echo "Server Tests - Complete!" +echo "Using: ${gamename}" +echo "=================================" +requiredstatus="OFFLINE" +fn_setstatus +fn_print_info "Tidying up directories." +rm -rfv "${serverfiles}" +core_exit.sh diff --git a/tests/tests_shellcheck.sh b/tests/tests_shellcheck.sh index d01140758..6d33507e6 100644 --- a/tests/tests_shellcheck.sh +++ b/tests/tests_shellcheck.sh @@ -1,7 +1,7 @@ #!/bin/bash # Project: Game Server Managers - LinuxGSM # Author: Daniel Gibbs -# License: MIT License, Copyright (c) 2017 Daniel Gibbs +# License: MIT License, Copyright (c) 2019 Daniel Gibbs # Purpose: Travis CI Tests: Shellcheck | Linux Game Server Management Script # Contributors: https://github.com/GameServerManagers/LinuxGSM/graphs/contributors # Documentation: https://docs.linuxgsm.com/ @@ -29,4 +29,4 @@ echo "" echo "=================================" echo "Bash Analysis Tests - Complete!" echo "Using: Shellcheck" -echo "=================================" \ No newline at end of file +echo "=================================" diff --git a/tests/tests_ts3server.sh b/tests/tests_ts3server.sh index 425ae193e..809bc2d2a 100644 --- a/tests/tests_ts3server.sh +++ b/tests/tests_ts3server.sh @@ -1,7 +1,7 @@ #!/bin/bash # Project: Game Server Managers - LinuxGSM # Author: Daniel Gibbs -# License: MIT License, Copyright (c) 2017 Daniel Gibbs +# License: MIT License, Copyright (c) 2019 Daniel Gibbs # Purpose: Travis CI Tests: Teamspeak 3 | Linux Game Server Management Script # Contributors: https://github.com/GameServerManagers/LinuxGSM/graphs/contributors # Documentation: https://docs.linuxgsm.com/ @@ -452,6 +452,14 @@ fn_test_result_fail(){ fi } +# test result n/a +fn_test_result_na(){ + echo "=================================" + echo "Expected result: N/A" + echo "Actual result: N/A" + fn_print_fail_nl "TEST N/A" +} + echo "=================================" echo "Travis CI Tests" echo "Linux Game Server Manager" @@ -570,7 +578,7 @@ echo "=================" grep functionfile= "${TRAVIS_BUILD_DIR}/dev-debug.log" | sed 's/functionfile=//g' echo "" -echo "2.0 - Instalation" +echo "2.0 - Installation" echo "==================================================================" echo "" @@ -986,4 +994,4 @@ requiredstatus="OFFLINE" fn_setstatus fn_print_info "Tidying up directories." rm -rfv "${serverfiles}" -core_exit.sh \ No newline at end of file +core_exit.sh From 25cf2b2081fac705d9b459e8203559276af6bae2 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Wed, 10 Apr 2019 00:30:38 +0100 Subject: [PATCH 048/534] fix(fix): re-add fix_tf2 and minor fix refactor (#2289) --- lgsm/functions/core_functions.sh | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/lgsm/functions/core_functions.sh b/lgsm/functions/core_functions.sh index d28fb2ffb..ad82b2186 100644 --- a/lgsm/functions/core_functions.sh +++ b/lgsm/functions/core_functions.sh @@ -357,6 +357,11 @@ functionfile="${FUNCNAME}" fn_fetch_function } +fix_tf2.sh(){ +functionfile="${FUNCNAME}" +fn_fetch_function +} + fix_ut3.sh(){ functionfile="${FUNCNAME}" fn_fetch_function @@ -649,4 +654,4 @@ core_messages.sh core_dl.sh # Calls the global Ctrl-C trap -core_trap.sh \ No newline at end of file +core_trap.sh From e9939cc8544c054b3703ae8b3a04197d458c87ef Mon Sep 17 00:00:00 2001 From: frisasky1 <49201678+frisasky1@users.noreply.github.com> Date: Wed, 10 Apr 2019 22:37:02 +0800 Subject: [PATCH 049/534] feat(newserver): Nuclear Dawn (#2291) Co-authored-by: digimoncn@gmail.com --- .../config-lgsm/ndserver/_default.cfg | 130 ++++++++++++++++++ lgsm/data/serverlist.csv | 1 + lgsm/functions/install_config.sh | 6 + 3 files changed, 137 insertions(+) create mode 100644 lgsm/config-default/config-lgsm/ndserver/_default.cfg diff --git a/lgsm/config-default/config-lgsm/ndserver/_default.cfg b/lgsm/config-default/config-lgsm/ndserver/_default.cfg new file mode 100644 index 000000000..192bac7e8 --- /dev/null +++ b/lgsm/config-default/config-lgsm/ndserver/_default.cfg @@ -0,0 +1,130 @@ +################################## +######## 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://docs.linuxgsm.com/configuration/start-parameters +ip="0.0.0.0" +port="27015" +clientport="27005" +sourcetvport="27020" +defaultmap="hydro" +maxplayers="32" + +## Server Start Command | https://docs.linuxgsm.com/configuration/start-parameters#additional-parameters +fn_parms(){ +parms="-game nucleardawn -strictportbind -ip ${ip} -port ${port} +clientport ${clientport} +tv_port ${sourcetvport} +map ${defaultmap} +servercfgfile ${servercfg} -maxplayers ${maxplayers}" +} + +#### LinuxGSM Settings #### + +## Notification Alerts +# (on|off) + +# More info | https://docs.linuxgsm.com/alerts#more-info +postalert="off" +postdays="7" +posttarget="https://hastebin.com" + +# Discord Alerts | https://docs.linuxgsm.com/alerts/discord +discordalert="off" +discordwebhook="webhook" + +# Email Alerts | https://docs.linuxgsm.com/alerts/email +emailalert="off" +email="email@example.com" +emailfrom="" + +# IFTTT Alerts | https://docs.linuxgsm.com/alerts/ifttt +iftttalert="off" +ifttttoken="accesstoken" +iftttevent="linuxgsm_alert" + +# Mailgun Email Alerts | https://docs.linuxgsm.com/alerts/mailgun +mailgunalert="off" +mailguntoken="accesstoken" +mailgundomain="example.com" +mailgunemailfrom="alert@example.com" +mailgunemail="email@myemail.com" + +# Pushbullet Alerts | https://docs.linuxgsm.com/alerts/pushbullet +pushbulletalert="off" +pushbullettoken="accesstoken" +channeltag="" + +# Pushover Alerts | https://docs.linuxgsm.com/alerts/pushover +pushoveralert="off" +pushovertoken="accesstoken" + +# Telegram Alerts | https://docs.linuxgsm.com/alerts/telegram +# You can add a custom cURL string eg proxy (useful in Russia) or else in "curlcustomstring". +# like a "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help", if you not need +# any custom string in curl - simple ignore this parameter. +telegramalert="off" +telegramtoken="accesstoken" +telegramchatid="" +curlcustomstring="" + +## Updating | https://docs.linuxgsm.com/commands/update +updateonstart="off" + +## Backup | https://docs.linuxgsm.com/commands/backup +maxbackups="4" +maxbackupdays="30" +stoponbackup="on" + +## Logging | https://docs.linuxgsm.com/features/logging +consolelogging="on" +logdays="7" + +#### LinuxGSM Advanced Settings #### + +# ANSI Colors +ansi="on" + +## SteamCMD Settings +# Server appid +appid="111710" +# 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="Nuclear Dawn" +engine="source" + +#### Directories #### +# Edit with care + +## Server Specific Directories +systemdir="${serverfiles}/nucleardawn" +executabledir="${serverfiles}" +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" +alertlog="${lgsmlogdir}/${servicename}-alert.log" +postdetailslog="${lgsmlogdir}/${servicename}-postdetails.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/data/serverlist.csv b/lgsm/data/serverlist.csv index 92ca3b4b9..9013e8662 100644 --- a/lgsm/data/serverlist.csv +++ b/lgsm/data/serverlist.csv @@ -48,6 +48,7 @@ l4d2,l4d2server,Left 4 Dead 2 mc,mcserver,Minecraft mta,mtaserver,Multi Theft Auto mumble,mumbleserver,Mumble +nd,ndserver,Nuclear Dawn nmrih,nmrihserver,No More Room in Hell ns,nsserver,Natural Selection ns2,ns2server,Natural Selection 2 diff --git a/lgsm/functions/install_config.sh b/lgsm/functions/install_config.sh index 3b42615b3..aa9550889 100644 --- a/lgsm/functions/install_config.sh +++ b/lgsm/functions/install_config.sh @@ -439,6 +439,12 @@ elif [ "${gamename}" == "No More Room in Hell" ]; then fn_fetch_default_config fn_default_config_remote fn_set_config_vars +elif [ "${gamename}" == "Nuclear Dawn" ]; then + gamedirname="NuclearDawn" + array_configs+=( server.cfg ) + fn_fetch_default_config + fn_default_config_remote + fn_set_config_vars elif [ "${gamename}" == "Multi Theft Auto" ]; then gamedirname="MultiTheftAuto" fn_check_cfgdir From 24f09004269576df49ef21b48806e0f42a8442e4 Mon Sep 17 00:00:00 2001 From: Attila Date: Mon, 22 Apr 2019 23:02:57 +0200 Subject: [PATCH 050/534] feat(csgoserver): Add SVG support to FastDL (#2298) Co-authored-by: borzak.attila@gmail.com CS:GO with Panorama now supports SVG custom logos, which are displayed in more places than a PNG logo. Panorama now uses materials/panorama/images/tournaments/teams folder to look for custom team logos, which can be .png and .svg Fixes #2297 --- 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 19fc1b464..3c0d6b356 100644 --- a/lgsm/functions/command_fastdl.sh +++ b/lgsm/functions/command_fastdl.sh @@ -154,7 +154,7 @@ fn_fastdl_preview(){ # Garry's Mod if [ "${shortname}" == "gmod" ]; then cd "${systemdir}" || exit - allowed_extentions_array=( "*.ain" "*.bsp" "*.mdl" "*.mp3" "*.ogg" "*.otf" "*.pcf" "*.phy" "*.png" "*.vtf" "*.vmt" "*.vtx" "*.vvd" "*.ttf" "*.wav" ) + allowed_extentions_array=( "*.ain" "*.bsp" "*.mdl" "*.mp3" "*.ogg" "*.otf" "*.pcf" "*.phy" "*.png" "*.svg" "*.vtf" "*.vmt" "*.vtx" "*.vvd" "*.ttf" "*.wav" ) for allowed_extention in "${allowed_extentions_array[@]}"; do fileswc=0 tput sc @@ -176,7 +176,7 @@ fn_fastdl_preview(){ if [ "${directory}" == "maps" ]; then local allowed_extentions_array=( "*.bsp" "*.ain" "*.nav" "*.jpg" "*.txt" ) elif [ "${directory}" == "materials" ]; then - local allowed_extentions_array=( "*.vtf" "*.vmt" "*.vbf" ) + local allowed_extentions_array=( "*.vtf" "*.vmt" "*.vbf" "*.png" "*.svg" ) elif [ "${directory}" == "models" ]; then local allowed_extentions_array=( "*.vtx" "*.vvd" "*.mdl" "*.phy" "*.jpg" "*.png" ) elif [ "${directory}" == "particles" ]; then @@ -315,7 +315,7 @@ fn_fastdl_source(){ if [ "${directory}" == "maps" ]; then local allowed_extentions_array=( "*.bsp" "*.ain" "*.nav" "*.jpg" "*.txt" ) elif [ "${directory}" == "materials" ]; then - local allowed_extentions_array=( "*.vtf" "*.vmt" "*.vbf" ) + local allowed_extentions_array=( "*.vtf" "*.vmt" "*.vbf" "*.png" "*.svg" ) elif [ "${directory}" == "models" ]; then local allowed_extentions_array=( "*.vtx" "*.vvd" "*.mdl" "*.phy" "*.jpg" "*.png" ) elif [ "${directory}" == "particles" ]; then @@ -430,4 +430,4 @@ echo "FastDL files are located in:" echo "${fastdldir}" echo "FastDL completed" fn_script_log_info "FastDL completed" -core_exit.sh \ No newline at end of file +core_exit.sh From ba96836f5c7610a2fad8cf6ec821cea405feeac7 Mon Sep 17 00:00:00 2001 From: frisasky1 <49201678+frisasky1@users.noreply.github.com> Date: Tue, 23 Apr 2019 05:04:49 +0800 Subject: [PATCH 051/534] feat(debug): add debug option for quake engine ( id tech 1) (#2293) Co-authored-by: digimoncn@gmail.com --- lgsm/functions/command_debug.sh | 2 ++ 1 file changed, 2 insertions(+) diff --git a/lgsm/functions/command_debug.sh b/lgsm/functions/command_debug.sh index 40b527b10..7664ff8be 100644 --- a/lgsm/functions/command_debug.sh +++ b/lgsm/functions/command_debug.sh @@ -104,6 +104,8 @@ elif [ "${engine}" == "realvirtuality" ]; then # be escaped for regular (tmux) loading, but need to be # stripped when loading straight from the console. ${executable} ${parms//\\;/;} +elif [ "${engine}" == "quake" ]; then + ${executable} ${parms} -condebug else ${executable} ${parms} fi From 18a5d7b1781f4dd7eccf63ab7ab627f59e7e4cbf Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Mon, 22 Apr 2019 22:35:53 +0100 Subject: [PATCH 052/534] release: 190422 --- linuxgsm.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/linuxgsm.sh b/linuxgsm.sh index 9502f2db3..6f29d4377 100755 --- a/linuxgsm.sh +++ b/linuxgsm.sh @@ -20,7 +20,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="190301" +version="190422" shortname="core" gameservername="core" rootdir="$(dirname "$(readlink -f "${BASH_SOURCE[0]}")")" From aba8f0c2c26d6c0cb0eb27eac84f0e4bf30d01a5 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Sat, 27 Apr 2019 00:33:01 +0100 Subject: [PATCH 053/534] fix(bsserver): updated executable directory (#2308) --- lgsm/config-default/config-lgsm/bsserver/_default.cfg | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lgsm/config-default/config-lgsm/bsserver/_default.cfg b/lgsm/config-default/config-lgsm/bsserver/_default.cfg index ac2e83825..3792882b1 100644 --- a/lgsm/config-default/config-lgsm/bsserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/bsserver/_default.cfg @@ -114,7 +114,7 @@ engine="source" ## Server Specific Directories systemdir="${serverfiles}/berimbau" -executabledir="${serverfiles}" +executabledir="${serverfiles}/bin" executable="./srcds_run.sh" servercfg="${servicename}.cfg" servercfgdefault="server.cfg" From 9a906b0ea432551af69fae0cffa3c519762e9e74 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Sat, 27 Apr 2019 00:51:30 +0100 Subject: [PATCH 054/534] fix(travis): correct test name --- tests/tests_mcserver.sh | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/tests/tests_mcserver.sh b/tests/tests_mcserver.sh index be518434b..9e5eb5442 100644 --- a/tests/tests_mcserver.sh +++ b/tests/tests_mcserver.sh @@ -2,10 +2,11 @@ # Project: Game Server Managers - LinuxGSM # Author: Daniel Gibbs # License: MIT License, Copyright (c) 2019 Daniel Gibbs -# Purpose: Travis CI Tests: Factorio | Linux Game Server Management Script +# Purpose: Travis CI Tests: Minecraft | Linux Game Server Management Script # Contributors: https://github.com/GameServerManagers/LinuxGSM/graphs/contributors # Documentation: https://docs.linuxgsm.com/ # Website: https://linuxgsm.com + travistest="1" version="190401" shortname="mc" From 1ba0cd7545a2ed3b24d9f76a649e1d68b4b33582 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Sat, 27 Apr 2019 12:05:41 +0100 Subject: [PATCH 055/534] feat(monitor): add udp query option (#2314) --- lgsm/functions/command_monitor.sh | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/lgsm/functions/command_monitor.sh b/lgsm/functions/command_monitor.sh index aeec02c59..491015bcc 100644 --- a/lgsm/functions/command_monitor.sh +++ b/lgsm/functions/command_monitor.sh @@ -30,6 +30,9 @@ for queryattempt in {1..5}; do elif [ "${querymethod}" == "tcp" ]; then bash -c 'exec 3<> /dev/tcp/'${ip}'/'${queryport}'' querystatus="$?" + elif [ "${querymethod}" == "udp" ]; then + bash -c 'exec 3<> /dev/udp/'${ip}'/'${queryport}'' + querystatus="$?" fi if [ "${querystatus}" == "0" ]; then @@ -175,6 +178,11 @@ fn_monitor_query_tcp(){ fn_monitor_loop } +fn_monitor_query_upd(){ + querymethod="upd" + fn_monitor_loop +} + monitorflag=1 fn_print_dots "${servername}" sleep 0.5 From cd36a1efd99d3ab61fd08d055b86cd769bb1a9a7 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Sat, 27 Apr 2019 22:32:21 +0100 Subject: [PATCH 056/534] fix(terraria): add fix preventing server from starting (#2317) --- lgsm/functions/core_functions.sh | 5 +++++ lgsm/functions/fix.sh | 2 ++ lgsm/functions/fix_terraria.sh | 11 +++++++++++ 3 files changed, 18 insertions(+) create mode 100644 lgsm/functions/fix_terraria.sh diff --git a/lgsm/functions/core_functions.sh b/lgsm/functions/core_functions.sh index ad82b2186..b6f139ca1 100644 --- a/lgsm/functions/core_functions.sh +++ b/lgsm/functions/core_functions.sh @@ -357,6 +357,11 @@ functionfile="${FUNCNAME}" fn_fetch_function } +fix_terraria.sh(){ +functionfile="${FUNCNAME}" +fn_fetch_function +} + fix_tf2.sh(){ functionfile="${FUNCNAME}" fn_fetch_function diff --git a/lgsm/functions/fix.sh b/lgsm/functions/fix.sh index 3eae6c91d..ba83b9820 100644 --- a/lgsm/functions/fix.sh +++ b/lgsm/functions/fix.sh @@ -63,6 +63,8 @@ if [ "${function_selfname}" != "command_install.sh" ]&&[ -z "${fixbypass}" ]; th fix_ss3.sh elif [ "${shortname}" == "tf2" ]; then fix_tf2.sh + elif [ "${shortname}" == "terraria" ]; then + fix_terraria.sh elif [ "${shortname}" == "ts3" ]; then fix_ts3.sh elif [ "${shortname}" == "mta" ]; then diff --git a/lgsm/functions/fix_terraria.sh b/lgsm/functions/fix_terraria.sh new file mode 100644 index 000000000..1a898d046 --- /dev/null +++ b/lgsm/functions/fix_terraria.sh @@ -0,0 +1,11 @@ +#!/bin/bash +# LinuxGSM fix_terraria.sh function +# Author: Daniel Gibbs +# Website: https://linuxgsm.com +# Description: Resolves an issue with Terraria. + +local commandname="FIX" +local commandaction="Fix" +local function_selfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" + +export TERM=xterm From b8f1c675adf6471eb29e82c530cd4d363373207f Mon Sep 17 00:00:00 2001 From: Attila <1230402+borzaka@users.noreply.github.com> Date: Sun, 28 Apr 2019 21:03:53 +0200 Subject: [PATCH 057/534] feat(csgoserver): Unnecessary FreeForAll info, add map hint to Danger Zone (#2318) And some indentation fix. --- .../config-lgsm/csgoserver/_default.cfg | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/lgsm/config-default/config-lgsm/csgoserver/_default.cfg b/lgsm/config-default/config-lgsm/csgoserver/_default.cfg index fd9865e17..6a0e9bbd9 100644 --- a/lgsm/config-default/config-lgsm/csgoserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/csgoserver/_default.cfg @@ -10,15 +10,15 @@ ## Server Start Settings | https://docs.linuxgsm.com/configuration/start-parameters # https://developer.valvesoftware.com/wiki/Counter-Strike:_Global_Offensive_Dedicated_Servers#Starting_the_Server -# [Game Modes] gametype gamemode mapgroup (you can mix these across Game Modes, but use only one) -# Arms Race 1 0 mg_armsrace -# Classic Casual 0 0 mg_casualsigma, mg_casualdelta -# Classic Competitive 0 1 mg_active, mg_reserves, mg_hostage, mg_de_dust2 -# Custom 3 0 -# Deathmatch 1 2 mg_deathmatch -# Demolition 1 1 mg_demolition -# Wingman 0 2 -# Danger Zone (FreeForAll) 6 0 mg_dz_blacksite +# [Game Modes] gametype gamemode mapgroup (you can mix these across Game Modes, but use only one) +# Arms Race 1 0 mg_armsrace +# Classic Casual 0 0 mg_casualsigma, mg_casualdelta +# Classic Competitive 0 1 mg_active, mg_reserves, mg_hostage, mg_de_dust2 +# Custom 3 0 +# Deathmatch 1 2 mg_deathmatch +# Demolition 1 1 mg_demolition +# Wingman 0 2 +# Danger Zone 6 0 mg_dz_blacksite (map: dz_blacksite) gametype="0" gamemode="0" mapgroup="mg_active" From a7dc7fd388645ab3fdbf68ed22ba014c66f7ca58 Mon Sep 17 00:00:00 2001 From: Frisasky Date: Mon, 29 Apr 2019 03:15:35 +0800 Subject: [PATCH 058/534] fix(twserver): Change how Teeworlds configs are handled (#2313) Co-authored-by: Frisa --- lgsm/config-default/config-lgsm/twserver/_default.cfg | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lgsm/config-default/config-lgsm/twserver/_default.cfg b/lgsm/config-default/config-lgsm/twserver/_default.cfg index 59b355ddc..b983e3b21 100644 --- a/lgsm/config-default/config-lgsm/twserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/twserver/_default.cfg @@ -17,7 +17,7 @@ ip="0.0.0.0" ## Server Start Command | https://docs.linuxgsm.com/configuration/start-parameters#additional-parameters fn_parms(){ -parms="-f ${servercfgfullpath}" +parms="-f ${servercfg}" } #### LinuxGSM Settings #### @@ -108,7 +108,7 @@ 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="${serverfiles}" +servercfgdir="${serverfiles}/tw" servercfgfullpath="${servercfgdir}/${servercfg}" ## Backup Directory From daecf5439f0c2c16a73136231561b02d7bce5c5f Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Sun, 28 Apr 2019 20:22:23 +0100 Subject: [PATCH 059/534] fix malformed json file --- .all-contributorsrc | 209 ++++++++++++++++++++++---------------------- 1 file changed, 104 insertions(+), 105 deletions(-) diff --git a/.all-contributorsrc b/.all-contributorsrc index c3654dea7..c58e19984 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -1,107 +1,106 @@ { - "files": [ - "README.md" - ], - "imageSize": 100, - "commit": false, - "contributors": [ - { - "login": "dgibbs64", - "name": "Daniel Gibbs", - "avatar_url": "https://avatars2.githubusercontent.com/u/4478206?v=4", - "profile": "https://danielgibbs.co.uk", - "contributions": [ - "bug", - "code", - "ideas", - "question", - "review", - "content", - "doc", - "infra" - ] - }, - { - "login": "Frisasky", - "name": "Frisasky", - "avatar_url": "https://avatars2.githubusercontent.com/u/26865851?v=4", - "profile": "https://github.com/Frisasky", - "contributions": [ - "question" - ] - }, - { - "login": "kennyLtv", - "name": "Kenny Lindelof", - "avatar_url": "https://avatars2.githubusercontent.com/u/6133325?v=4", - "profile": "https://kennyl.design", - "contributions": [ - "question" - ] - }, - { - "login": "Scarsz", - "name": "Austin Shapiro", - "avatar_url": "https://avatars1.githubusercontent.com/u/7691988?v=4", - "profile": "https://scarsz.me", - "contributions": [ - "bug", - "code" - ] - }, - { - "login": "marvinlehmann", - "name": "Marvin Lehmann", - "avatar_url": "https://avatars2.githubusercontent.com/u/4151266?v=4", - "profile": "https://github.com/marvinlehmann", - "contributions": [ - "bug", - "code" - ] - }, - { - "login": "Bourne-ID", - "name": "Bourne-ID", - "avatar_url": "https://avatars1.githubusercontent.com/u/7073616?v=4", - "profile": "https://github.com/Bourne-ID", - "contributions": [ - "review", - "content", - "doc", - "infra" - "review" - ] - }, - { - "login": "cedarlug", - "name": "CedarLUG", - "avatar_url": "https://avatars2.githubusercontent.com/u/19336442?v=4", - "profile": "http://cedarlug.org", - "contributions": [ - "bug", - "code", - "ideas", - "question", - "review" - ] - }, - { - "login": "UltimateByte", - "name": "UltimateByte", - "avatar_url": "https://avatars3.githubusercontent.com/u/8805941?v=4", - "profile": "https://www.terageek.org | https://www.haisoft.fr", - "contributions": [ - "bug", - "code", - "doc", - "ideas", - "review", - ] - } - ], - "contributorsPerLine": 7, - "projectName": "LinuxGSM", - "projectOwner": "GameServerManagers", - "repoType": "github", - "repoHost": "https://github.com" + "files": [ + "README.md" + ], + "imageSize": 100, + "commit": false, + "contributors": [{ + "login": "dgibbs64", + "name": "Daniel Gibbs", + "avatar_url": "https://avatars2.githubusercontent.com/u/4478206?v=4", + "profile": "https://danielgibbs.co.uk", + "contributions": [ + "bug", + "code", + "ideas", + "question", + "review", + "content", + "doc", + "infra" + ] + }, + { + "login": "Frisasky", + "name": "Frisasky", + "avatar_url": "https://avatars2.githubusercontent.com/u/26865851?v=4", + "profile": "https://github.com/Frisasky", + "contributions": [ + "question" + ] + }, + { + "login": "kennyLtv", + "name": "Kenny Lindelof", + "avatar_url": "https://avatars2.githubusercontent.com/u/6133325?v=4", + "profile": "https://kennyl.design", + "contributions": [ + "question" + ] + }, + { + "login": "Scarsz", + "name": "Austin Shapiro", + "avatar_url": "https://avatars1.githubusercontent.com/u/7691988?v=4", + "profile": "https://scarsz.me", + "contributions": [ + "bug", + "code" + ] + }, + { + "login": "marvinlehmann", + "name": "Marvin Lehmann", + "avatar_url": "https://avatars2.githubusercontent.com/u/4151266?v=4", + "profile": "https://github.com/marvinlehmann", + "contributions": [ + "bug", + "code" + ] + }, + { + "login": "Bourne-ID", + "name": "Bourne-ID", + "avatar_url": "https://avatars1.githubusercontent.com/u/7073616?v=4", + "profile": "https://github.com/Bourne-ID", + "contributions": [ + "review", + "content", + "doc", + "infra", + "review" + ] + }, + { + "login": "cedarlug", + "name": "CedarLUG", + "avatar_url": "https://avatars2.githubusercontent.com/u/19336442?v=4", + "profile": "http://cedarlug.org", + "contributions": [ + "bug", + "code", + "ideas", + "question", + "review" + ] + }, + { + "login": "UltimateByte", + "name": "UltimateByte", + "avatar_url": "https://avatars3.githubusercontent.com/u/8805941?v=4", + "profile": "https://www.terageek.org | https://www.haisoft.fr", + "contributions": [ + "bug", + "code", + "doc", + "ideas", + "review" + ] + } + ], + "contributorsPerLine": 7, + "projectName": "LinuxGSM", + "projectOwner": "GameServerManagers", + "repoType": "github", + "repoHost": "https://github.com" } From ca057c3c6218222acd9ce9a2c9bb559813008ccc Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Sun, 28 Apr 2019 20:23:11 +0100 Subject: [PATCH 060/534] Update .all-contributorsrc --- .all-contributorsrc | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/.all-contributorsrc b/.all-contributorsrc index c58e19984..5c0052849 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -26,7 +26,9 @@ "avatar_url": "https://avatars2.githubusercontent.com/u/26865851?v=4", "profile": "https://github.com/Frisasky", "contributions": [ - "question" + "question", + "bug", + "code" ] }, { From ab335b8d1fe2a269054e290a43224bbb4a8a7d79 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Sun, 28 Apr 2019 20:23:44 +0100 Subject: [PATCH 061/534] fix malformed json file Update .all-contributorsrc --- .all-contributorsrc | 211 ++++++++++++++++++++++---------------------- 1 file changed, 106 insertions(+), 105 deletions(-) diff --git a/.all-contributorsrc b/.all-contributorsrc index c3654dea7..5c0052849 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -1,107 +1,108 @@ { - "files": [ - "README.md" - ], - "imageSize": 100, - "commit": false, - "contributors": [ - { - "login": "dgibbs64", - "name": "Daniel Gibbs", - "avatar_url": "https://avatars2.githubusercontent.com/u/4478206?v=4", - "profile": "https://danielgibbs.co.uk", - "contributions": [ - "bug", - "code", - "ideas", - "question", - "review", - "content", - "doc", - "infra" - ] - }, - { - "login": "Frisasky", - "name": "Frisasky", - "avatar_url": "https://avatars2.githubusercontent.com/u/26865851?v=4", - "profile": "https://github.com/Frisasky", - "contributions": [ - "question" - ] - }, - { - "login": "kennyLtv", - "name": "Kenny Lindelof", - "avatar_url": "https://avatars2.githubusercontent.com/u/6133325?v=4", - "profile": "https://kennyl.design", - "contributions": [ - "question" - ] - }, - { - "login": "Scarsz", - "name": "Austin Shapiro", - "avatar_url": "https://avatars1.githubusercontent.com/u/7691988?v=4", - "profile": "https://scarsz.me", - "contributions": [ - "bug", - "code" - ] - }, - { - "login": "marvinlehmann", - "name": "Marvin Lehmann", - "avatar_url": "https://avatars2.githubusercontent.com/u/4151266?v=4", - "profile": "https://github.com/marvinlehmann", - "contributions": [ - "bug", - "code" - ] - }, - { - "login": "Bourne-ID", - "name": "Bourne-ID", - "avatar_url": "https://avatars1.githubusercontent.com/u/7073616?v=4", - "profile": "https://github.com/Bourne-ID", - "contributions": [ - "review", - "content", - "doc", - "infra" - "review" - ] - }, - { - "login": "cedarlug", - "name": "CedarLUG", - "avatar_url": "https://avatars2.githubusercontent.com/u/19336442?v=4", - "profile": "http://cedarlug.org", - "contributions": [ - "bug", - "code", - "ideas", - "question", - "review" - ] - }, - { - "login": "UltimateByte", - "name": "UltimateByte", - "avatar_url": "https://avatars3.githubusercontent.com/u/8805941?v=4", - "profile": "https://www.terageek.org | https://www.haisoft.fr", - "contributions": [ - "bug", - "code", - "doc", - "ideas", - "review", - ] - } - ], - "contributorsPerLine": 7, - "projectName": "LinuxGSM", - "projectOwner": "GameServerManagers", - "repoType": "github", - "repoHost": "https://github.com" + "files": [ + "README.md" + ], + "imageSize": 100, + "commit": false, + "contributors": [{ + "login": "dgibbs64", + "name": "Daniel Gibbs", + "avatar_url": "https://avatars2.githubusercontent.com/u/4478206?v=4", + "profile": "https://danielgibbs.co.uk", + "contributions": [ + "bug", + "code", + "ideas", + "question", + "review", + "content", + "doc", + "infra" + ] + }, + { + "login": "Frisasky", + "name": "Frisasky", + "avatar_url": "https://avatars2.githubusercontent.com/u/26865851?v=4", + "profile": "https://github.com/Frisasky", + "contributions": [ + "question", + "bug", + "code" + ] + }, + { + "login": "kennyLtv", + "name": "Kenny Lindelof", + "avatar_url": "https://avatars2.githubusercontent.com/u/6133325?v=4", + "profile": "https://kennyl.design", + "contributions": [ + "question" + ] + }, + { + "login": "Scarsz", + "name": "Austin Shapiro", + "avatar_url": "https://avatars1.githubusercontent.com/u/7691988?v=4", + "profile": "https://scarsz.me", + "contributions": [ + "bug", + "code" + ] + }, + { + "login": "marvinlehmann", + "name": "Marvin Lehmann", + "avatar_url": "https://avatars2.githubusercontent.com/u/4151266?v=4", + "profile": "https://github.com/marvinlehmann", + "contributions": [ + "bug", + "code" + ] + }, + { + "login": "Bourne-ID", + "name": "Bourne-ID", + "avatar_url": "https://avatars1.githubusercontent.com/u/7073616?v=4", + "profile": "https://github.com/Bourne-ID", + "contributions": [ + "review", + "content", + "doc", + "infra", + "review" + ] + }, + { + "login": "cedarlug", + "name": "CedarLUG", + "avatar_url": "https://avatars2.githubusercontent.com/u/19336442?v=4", + "profile": "http://cedarlug.org", + "contributions": [ + "bug", + "code", + "ideas", + "question", + "review" + ] + }, + { + "login": "UltimateByte", + "name": "UltimateByte", + "avatar_url": "https://avatars3.githubusercontent.com/u/8805941?v=4", + "profile": "https://www.terageek.org | https://www.haisoft.fr", + "contributions": [ + "bug", + "code", + "doc", + "ideas", + "review" + ] + } + ], + "contributorsPerLine": 7, + "projectName": "LinuxGSM", + "projectOwner": "GameServerManagers", + "repoType": "github", + "repoHost": "https://github.com" } From 818580275fed913b0dcd5d1181e2775cabdf2e05 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Sun, 28 Apr 2019 20:23:44 +0100 Subject: [PATCH 062/534] fix malformed json file Update .all-contributorsrc --- .all-contributorsrc | 211 ++++++++++++++++++++++---------------------- 1 file changed, 106 insertions(+), 105 deletions(-) diff --git a/.all-contributorsrc b/.all-contributorsrc index c3654dea7..5c0052849 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -1,107 +1,108 @@ { - "files": [ - "README.md" - ], - "imageSize": 100, - "commit": false, - "contributors": [ - { - "login": "dgibbs64", - "name": "Daniel Gibbs", - "avatar_url": "https://avatars2.githubusercontent.com/u/4478206?v=4", - "profile": "https://danielgibbs.co.uk", - "contributions": [ - "bug", - "code", - "ideas", - "question", - "review", - "content", - "doc", - "infra" - ] - }, - { - "login": "Frisasky", - "name": "Frisasky", - "avatar_url": "https://avatars2.githubusercontent.com/u/26865851?v=4", - "profile": "https://github.com/Frisasky", - "contributions": [ - "question" - ] - }, - { - "login": "kennyLtv", - "name": "Kenny Lindelof", - "avatar_url": "https://avatars2.githubusercontent.com/u/6133325?v=4", - "profile": "https://kennyl.design", - "contributions": [ - "question" - ] - }, - { - "login": "Scarsz", - "name": "Austin Shapiro", - "avatar_url": "https://avatars1.githubusercontent.com/u/7691988?v=4", - "profile": "https://scarsz.me", - "contributions": [ - "bug", - "code" - ] - }, - { - "login": "marvinlehmann", - "name": "Marvin Lehmann", - "avatar_url": "https://avatars2.githubusercontent.com/u/4151266?v=4", - "profile": "https://github.com/marvinlehmann", - "contributions": [ - "bug", - "code" - ] - }, - { - "login": "Bourne-ID", - "name": "Bourne-ID", - "avatar_url": "https://avatars1.githubusercontent.com/u/7073616?v=4", - "profile": "https://github.com/Bourne-ID", - "contributions": [ - "review", - "content", - "doc", - "infra" - "review" - ] - }, - { - "login": "cedarlug", - "name": "CedarLUG", - "avatar_url": "https://avatars2.githubusercontent.com/u/19336442?v=4", - "profile": "http://cedarlug.org", - "contributions": [ - "bug", - "code", - "ideas", - "question", - "review" - ] - }, - { - "login": "UltimateByte", - "name": "UltimateByte", - "avatar_url": "https://avatars3.githubusercontent.com/u/8805941?v=4", - "profile": "https://www.terageek.org | https://www.haisoft.fr", - "contributions": [ - "bug", - "code", - "doc", - "ideas", - "review", - ] - } - ], - "contributorsPerLine": 7, - "projectName": "LinuxGSM", - "projectOwner": "GameServerManagers", - "repoType": "github", - "repoHost": "https://github.com" + "files": [ + "README.md" + ], + "imageSize": 100, + "commit": false, + "contributors": [{ + "login": "dgibbs64", + "name": "Daniel Gibbs", + "avatar_url": "https://avatars2.githubusercontent.com/u/4478206?v=4", + "profile": "https://danielgibbs.co.uk", + "contributions": [ + "bug", + "code", + "ideas", + "question", + "review", + "content", + "doc", + "infra" + ] + }, + { + "login": "Frisasky", + "name": "Frisasky", + "avatar_url": "https://avatars2.githubusercontent.com/u/26865851?v=4", + "profile": "https://github.com/Frisasky", + "contributions": [ + "question", + "bug", + "code" + ] + }, + { + "login": "kennyLtv", + "name": "Kenny Lindelof", + "avatar_url": "https://avatars2.githubusercontent.com/u/6133325?v=4", + "profile": "https://kennyl.design", + "contributions": [ + "question" + ] + }, + { + "login": "Scarsz", + "name": "Austin Shapiro", + "avatar_url": "https://avatars1.githubusercontent.com/u/7691988?v=4", + "profile": "https://scarsz.me", + "contributions": [ + "bug", + "code" + ] + }, + { + "login": "marvinlehmann", + "name": "Marvin Lehmann", + "avatar_url": "https://avatars2.githubusercontent.com/u/4151266?v=4", + "profile": "https://github.com/marvinlehmann", + "contributions": [ + "bug", + "code" + ] + }, + { + "login": "Bourne-ID", + "name": "Bourne-ID", + "avatar_url": "https://avatars1.githubusercontent.com/u/7073616?v=4", + "profile": "https://github.com/Bourne-ID", + "contributions": [ + "review", + "content", + "doc", + "infra", + "review" + ] + }, + { + "login": "cedarlug", + "name": "CedarLUG", + "avatar_url": "https://avatars2.githubusercontent.com/u/19336442?v=4", + "profile": "http://cedarlug.org", + "contributions": [ + "bug", + "code", + "ideas", + "question", + "review" + ] + }, + { + "login": "UltimateByte", + "name": "UltimateByte", + "avatar_url": "https://avatars3.githubusercontent.com/u/8805941?v=4", + "profile": "https://www.terageek.org | https://www.haisoft.fr", + "contributions": [ + "bug", + "code", + "doc", + "ideas", + "review" + ] + } + ], + "contributorsPerLine": 7, + "projectName": "LinuxGSM", + "projectOwner": "GameServerManagers", + "repoType": "github", + "repoHost": "https://github.com" } From 298e52d192734b104763a5b5fc398b2d87a39a10 Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" Date: Sun, 28 Apr 2019 20:32:32 +0100 Subject: [PATCH 063/534] docs: add Frisasky as a contributor (#2319) --- .all-contributorsrc | 213 ++++++++++++++++++++++---------------------- README.md | 5 +- linuxgsm.sh | 2 +- 3 files changed, 110 insertions(+), 110 deletions(-) diff --git a/.all-contributorsrc b/.all-contributorsrc index 5c0052849..23560809b 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -1,108 +1,109 @@ { - "files": [ - "README.md" - ], - "imageSize": 100, - "commit": false, - "contributors": [{ - "login": "dgibbs64", - "name": "Daniel Gibbs", - "avatar_url": "https://avatars2.githubusercontent.com/u/4478206?v=4", - "profile": "https://danielgibbs.co.uk", - "contributions": [ - "bug", - "code", - "ideas", - "question", - "review", - "content", - "doc", - "infra" - ] - }, - { - "login": "Frisasky", - "name": "Frisasky", - "avatar_url": "https://avatars2.githubusercontent.com/u/26865851?v=4", - "profile": "https://github.com/Frisasky", - "contributions": [ - "question", - "bug", - "code" - ] - }, - { - "login": "kennyLtv", - "name": "Kenny Lindelof", - "avatar_url": "https://avatars2.githubusercontent.com/u/6133325?v=4", - "profile": "https://kennyl.design", - "contributions": [ - "question" - ] - }, - { - "login": "Scarsz", - "name": "Austin Shapiro", - "avatar_url": "https://avatars1.githubusercontent.com/u/7691988?v=4", - "profile": "https://scarsz.me", - "contributions": [ - "bug", - "code" - ] - }, - { - "login": "marvinlehmann", - "name": "Marvin Lehmann", - "avatar_url": "https://avatars2.githubusercontent.com/u/4151266?v=4", - "profile": "https://github.com/marvinlehmann", - "contributions": [ - "bug", - "code" - ] - }, - { - "login": "Bourne-ID", - "name": "Bourne-ID", - "avatar_url": "https://avatars1.githubusercontent.com/u/7073616?v=4", - "profile": "https://github.com/Bourne-ID", - "contributions": [ - "review", - "content", - "doc", - "infra", - "review" - ] - }, - { - "login": "cedarlug", - "name": "CedarLUG", - "avatar_url": "https://avatars2.githubusercontent.com/u/19336442?v=4", - "profile": "http://cedarlug.org", - "contributions": [ - "bug", - "code", - "ideas", - "question", - "review" - ] - }, - { - "login": "UltimateByte", - "name": "UltimateByte", - "avatar_url": "https://avatars3.githubusercontent.com/u/8805941?v=4", - "profile": "https://www.terageek.org | https://www.haisoft.fr", - "contributions": [ - "bug", - "code", - "doc", - "ideas", - "review" - ] - } - ], - "contributorsPerLine": 7, - "projectName": "LinuxGSM", - "projectOwner": "GameServerManagers", - "repoType": "github", - "repoHost": "https://github.com" + "files": [ + "README.md" + ], + "imageSize": 100, + "commit": false, + "contributors": [ + { + "login": "dgibbs64", + "name": "Daniel Gibbs", + "avatar_url": "https://avatars2.githubusercontent.com/u/4478206?v=4", + "profile": "https://danielgibbs.co.uk", + "contributions": [ + "bug", + "code", + "ideas", + "question", + "review", + "content", + "doc", + "infra" + ] + }, + { + "login": "Frisasky", + "name": "Frisasky", + "avatar_url": "https://avatars2.githubusercontent.com/u/26865851?v=4", + "profile": "https://github.com/Frisasky", + "contributions": [ + "question", + "bug", + "code" + ] + }, + { + "login": "kennyLtv", + "name": "Kenny Lindelof", + "avatar_url": "https://avatars2.githubusercontent.com/u/6133325?v=4", + "profile": "https://kennyl.design", + "contributions": [ + "question" + ] + }, + { + "login": "Scarsz", + "name": "Austin Shapiro", + "avatar_url": "https://avatars1.githubusercontent.com/u/7691988?v=4", + "profile": "https://scarsz.me", + "contributions": [ + "bug", + "code" + ] + }, + { + "login": "marvinlehmann", + "name": "Marvin Lehmann", + "avatar_url": "https://avatars2.githubusercontent.com/u/4151266?v=4", + "profile": "https://github.com/marvinlehmann", + "contributions": [ + "bug", + "code" + ] + }, + { + "login": "Bourne-ID", + "name": "Bourne-ID", + "avatar_url": "https://avatars1.githubusercontent.com/u/7073616?v=4", + "profile": "https://github.com/Bourne-ID", + "contributions": [ + "review", + "content", + "doc", + "infra", + "review" + ] + }, + { + "login": "cedarlug", + "name": "CedarLUG", + "avatar_url": "https://avatars2.githubusercontent.com/u/19336442?v=4", + "profile": "http://cedarlug.org", + "contributions": [ + "bug", + "code", + "ideas", + "question", + "review" + ] + }, + { + "login": "UltimateByte", + "name": "UltimateByte", + "avatar_url": "https://avatars3.githubusercontent.com/u/8805941?v=4", + "profile": "https://www.terageek.org | https://www.haisoft.fr", + "contributions": [ + "bug", + "code", + "doc", + "ideas", + "review" + ] + } + ], + "contributorsPerLine": 7, + "projectName": "LinuxGSM", + "projectOwner": "GameServerManagers", + "repoType": "github", + "repoHost": "https://github.com" } diff --git a/README.md b/README.md index 0d91b9d5b..c4ca68ce9 100644 --- a/README.md +++ b/README.md @@ -3,7 +3,7 @@ LinuxGSM - [![LinuxGSM](https://img.shields.io/badge/-LinuxGSM-2b2b2b.svg?logo=data%3Aimage%2Fpng%3Bbase64%2CiVBORw0KGgoAAAANSUhEUgAAACsAAABACAYAAACDbo5ZAAAGD0lEQVR4AcWYa2wUVRvHz75c2vJ2disXoUBEVIioRAx%2BMIFA1IRwUS6KCCiIKBrvhEYiiGm5iBgk8QOGEgUUDYTttmVZWFr2UmwURS6iYAoCtmisElSsdHdbkT7%2BTzoNy%2BGc2dm54C%2F5Rdkz85x%2FZ86ZOXOYXYhIg3Phx%2FA4PAcv6f%2Btg5vhHJjP3EcZsgsshufJHH%2FAJbDztQ7aG35J1vgCXn%2BtgvrgEbLHYei9FmE3kDOUuh10OGwjZ7gEh7kZ9gNyllK3gnrg7%2BQs56DHjbCDyB0GuRF2ArnDeDfCziF3mO1G2FfJHRa4EXYpuUOxG2GXkzuUuBH2TXKH5W6ELSV3eM%2BNsOUk5yQcAY8p2uvgSPitor3MjbB1UOQXOFBvHwpbhPYWOExvL4SNUOQ7p4P2JTlzhOPmCu0vCu1PQpE2WOhk2MdJjk9y7HNwP1wEPUJbAcmZ6WTYrYolnifbxZBiibnFySHQCkUaLdY7C0V4%2FT5OhF1JcuIW6%2B0lOcvsBi2Ezao3j8Ov7Quwj52w60jNKIs1R5GatVaDDoEXSU4D7GSxbidYT3IuwjusFK0mNUVMwaZNNbl%2B%2F87hoVCom0HthaQmnG3QB0lNPcxlCvz%2B0GtlZTuorCxYYlA%2FDzbY%2FnrAgV3hCVLzCDMgEAi9wMMi9IIM%2FUwnNXWwi5mwRaSmmmXA798xq%2F3Khp420VeE1LyS6eQeBhttSXgzywCCToIUCOyYZvKLOWWwkdfd6ORVpGYJM0F5efDe9mEQHGty2BWTmhVGO4PNBmOoKzMBxmo%2FhD25dWvljSbD5hjMkb9gT9lJq63Mzi1bKkbjloc7xBWtwiRrDASCVRi%2FRxA8if%2BvrawMTzYI%2FACpeUv2KFFtDcUyTKilCHcis8G1Ga7wHpLzG8wVFs1K7jaeUKHZfIxmkj9%2FM4S9x9RGiMEudo0QbCVu9Xqn5PWEwLUk5%2FP0iaXac53I0kAH9Sau4m54lo%2FdTMfyekLYKQZ7ub34AbMMlmw5irC2VYTN0fuVMYMf8JHxJ7L7YYXAlSRnI2%2F8RtH4siTsDMz%2BZ5yS15OEXUxyDjGD1%2BvEq8MG16CDzY6JepKwT6geYbzxb0XjGMl7vwGSgzZIwo4nOa1M8Yr9Afb%2Fj8L21%2FsXaeaNZ2A6KTiEASph%2F0vF80cn4tokqu79fzfCUk2vfF4%2FFdFGEjGPHvg2yWrsDG%2F4%2BqpZB8jPOiXjWk0y5iXdM3XhKUvxBTA9UvHuvNPh%2Bzb%2BWj10z6nwuHWBbQFMvNCjKnn7qd1jS%2Fnx9VX3b6jC%2BbwOr5eMe3%2B83IcW4%2F3qgT%2BUTbA9srGaiHsn8AKiF6Ld%2FxF%2FOx6eeAJXabvK78MTTornNMd6XJTVR7%2Fj9bBjhFxV%2FMc1kJOAy2AeA%2FgrV4mFVDZFCqm8rEJ6qysCAWqK9iaztRJRbWXa4moFTELOav7jY%2FqAvoXp0Gc9NX7bIZl17%2FZl0rC1wRLeno0NvP%2B0CTcYNnS8wW6CtzNANaxzKqo9hRNOQ8rGo7tmSsMe2zWdt2frqVRcm5s2fofCgawDNHRNxnyfqgsYez4y4ADCjRM9H73hsNWafILTQdaFiSTj%2BQ%2FxA6yH7d%2BCmR8XbYr0a7VTF2N4siSsb5qdos3R6%2FjGxpULFfw7EfORnbrI9TAToX0sD40%2F2ylcGdh2Rdhg%2BSf2gka9jRTqK9%2BGwgHz7RTfVbHxirDhivdthYUvMRX8aYAD9lstvi%2B0aDL2DUZ0eCBUNNVG0IP65FLTWqPdiqdC0koHTVXe7iyNRG23QotBEy1RbTAzQyrmnYUT2rLsoA13JpcB4eVC2daBM1g2JGLekmwf5On7EJfngfZTNnVSce8bFjaTmQdvs%2FXmO%2FJVpoXdx3RSUe9O00Fj3nUdy0RLgRHiHXOPGW1h2uKZ07c9rG%2Bxyefp23pQeyBIEQoavYlakrG8fnrY5yHn2fbxXzAgw7m8bT5zkkSk4C7cpmOK21esB%2FXAQ5DzFfTo43%2BF%2FDzf0eZ4wZ3MDSjMcvD6nIeOahGgia%2FyU3HforTPkWkwnakdn0cI9jqfbPjD%2FuQLJr6644snlgX%2FApOMoyd1R5%2FxAAAAAElFTkSuQmCC)](https://linuxgsm.com) [![Build Status](https://travis-ci.com/GameServerManagers/LinuxGSM.svg?branch=master)](https://travis-ci.com/GameServerManagers/LinuxGSM) [![Codacy Badge](https://api.codacy.com/project/badge/Grade/3e98be27840043a090c3ab6e35db44b0)](https://app.codacy.com/app/GameServerManagers/LinuxGSM?utm_source=github.com&utm_medium=referral&utm_content=GameServerManagers/LinuxGSM&utm_campaign=Badge_Grade_Dashboard) [![Discord](https://discordapp.com/api/guilds/127498813903601664/widget.png?style=shield)](https://linuxgsm.com/discord) [![MIT Licence](https://badges.frapsoft.com/os/mit/mit.svg?v=103)](https://github.com/GameServerManagers/LinuxGSM/blob/master/LICENSE) [![made-with-bash](https://img.shields.io/badge/-Made%20with%20Bash-1f425f.svg?logo=image%2Fpng%3Bbase64%2CiVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyZpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw%2FeHBhY2tldCBiZWdpbj0i77u%2FIiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8%2BIDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNi1jMTExIDc5LjE1ODMyNSwgMjAxNS8wOS8xMC0wMToxMDoyMCAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENDIDIwMTUgKFdpbmRvd3MpIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOkE3MDg2QTAyQUZCMzExRTVBMkQxRDMzMkJDMUQ4RDk3IiB4bXBNTTpEb2N1bWVudElEPSJ4bXAuZGlkOkE3MDg2QTAzQUZCMzExRTVBMkQxRDMzMkJDMUQ4RDk3Ij4gPHhtcE1NOkRlcml2ZWRGcm9tIHN0UmVmOmluc3RhbmNlSUQ9InhtcC5paWQ6QTcwODZBMDBBRkIzMTFFNUEyRDFEMzMyQkMxRDhEOTciIHN0UmVmOmRvY3VtZW50SUQ9InhtcC5kaWQ6QTcwODZBMDFBRkIzMTFFNUEyRDFEMzMyQkMxRDhEOTciLz4gPC9yZGY6RGVzY3JpcHRpb24%2BIDwvcmRmOlJERj4gPC94OnhtcG1ldGE%2BIDw%2FeHBhY2tldCBlbmQ9InIiPz6lm45hAAADkklEQVR42qyVa0yTVxzGn7d9Wy03MS2ii8s%2BeokYNQSVhCzOjXZOFNF4jx%2BMRmPUMEUEqVG36jo2thizLSQSMd4N8ZoQ8RKjJtooaCpK6ZoCtRXKpRempbTv5ey83bhkAUphz8fznvP8znn%2B%2F3NeEEJgNBoRRSmz0ub%2FfuxEacBg%2FDmYtiCjgo5NG2mBXq%2BH5I1ogMRk9Zbd%2BQU2e1ML6VPLOyf5tvBQ8yT1lG10imxsABm7SLs898GTpyYynEzP60hO3trHDKvMigUwdeaceacqzp7nOI4n0SSIIjl36ao4Z356OV07fSQAk6xJ3XGg%2BLCr1d1OYlVHp4eUHPnerU79ZA%2F1kuv1JQMAg%2BE4O2P23EumF3VkvHprsZKMzKwbRUXFEyTvSIEmTVbrysp%2BWr8wfQHGK6WChVa3bKUmdWou%2BjpArdGkzZ41c1zG%2Fu5uGH4swzd561F%2BuhIT4%2BLnSuPsv9%2BJKIpjNr9dXYOyk7%2FBZrcjIT4eCnoKgedJP4BEqhG77E3NKP31FO7cfQA5K0dSYuLgz2TwCWJSOBzG6crzKK%2BohNfni%2Bx6OMUMMNe%2Fgf7ocbw0v0acKg6J8Ql0q%2BT%2FAXR5PNi5dz9c71upuQqCKFAD%2BYhrZLEAmpodaHO3Qy6TI3NhBpbrshGtOWKOSMYwYGQM8nJzoFJNxP2HjyIQho4PewK6hBktoDcUwtIln4PjOWzflQ%2Be5yl0yCCYgYikTclGlxadio%2BBQCSiW1UXoVGrKYwH4RgMrjU1HAB4vR6LzWYfFUCKxfS8Ftk5qxHoCUQAUkRJaSEokkV6Y%2F%2BJUOC4hn6A39NVXVBYeNP8piH6HeA4fPbpdBQV5KOx0QaL1YppX3Jgk0TwH2Vg6S3u%2BdB91%2B%2FpuNYPYFl5uP5V7ZqvsrX7jxqMXR6ff3gCQSTzFI0a1TX3wIs8ul%2Bq4HuWAAiM39vhOuR1O1fQ2gT%2F26Z8Z5vrl2OHi9OXZn995nLV9aFfS6UC9JeJPfuK0NBohWpCHMSAAsFe74WWP%2BvT25wtP9Bpob6uGqqyDnOtaeumjRu%2ByFu36VntK%2FPA5umTJeUtPWZSU9BCgud661odVp3DZtkc7AnYR33RRC708PrVi1larW7XwZIjLnd7R6SgSqWSNjU1B3F72pz5TZbXmX5vV81Yb7Lg7XT%2FUXriu8XLVqw6c6XqWnBKiiYU%2BMt3wWF7u7i91XlSEITwSAZ%2FCzAAHsJVbwXYFFEAAAAASUVORK5CYII%3D)](https://www.gnu.org/software/bash/) [![All Contributors](https://img.shields.io/badge/all_contributors-1-orange.svg?style=flat-square)](#contributors) + [![LinuxGSM](https://img.shields.io/badge/-LinuxGSM-2b2b2b.svg?logo=data%3Aimage%2Fpng%3Bbase64%2CiVBORw0KGgoAAAANSUhEUgAAACsAAABACAYAAACDbo5ZAAAGD0lEQVR4AcWYa2wUVRvHz75c2vJ2disXoUBEVIioRAx%2BMIFA1IRwUS6KCCiIKBrvhEYiiGm5iBgk8QOGEgUUDYTttmVZWFr2UmwURS6iYAoCtmisElSsdHdbkT7%2BTzoNy%2BGc2dm54C%2F5Rdkz85x%2FZ86ZOXOYXYhIg3Phx%2FA4PAcv6f%2Btg5vhHJjP3EcZsgsshufJHH%2FAJbDztQ7aG35J1vgCXn%2BtgvrgEbLHYei9FmE3kDOUuh10OGwjZ7gEh7kZ9gNyllK3gnrg7%2BQs56DHjbCDyB0GuRF2ArnDeDfCziF3mO1G2FfJHRa4EXYpuUOxG2GXkzuUuBH2TXKH5W6ELSV3eM%2BNsOUk5yQcAY8p2uvgSPitor3MjbB1UOQXOFBvHwpbhPYWOExvL4SNUOQ7p4P2JTlzhOPmCu0vCu1PQpE2WOhk2MdJjk9y7HNwP1wEPUJbAcmZ6WTYrYolnifbxZBiibnFySHQCkUaLdY7C0V4%2FT5OhF1JcuIW6%2B0lOcvsBi2Ezao3j8Ov7Quwj52w60jNKIs1R5GatVaDDoEXSU4D7GSxbidYT3IuwjusFK0mNUVMwaZNNbl%2B%2F87hoVCom0HthaQmnG3QB0lNPcxlCvz%2B0GtlZTuorCxYYlA%2FDzbY%2FnrAgV3hCVLzCDMgEAi9wMMi9IIM%2FUwnNXWwi5mwRaSmmmXA798xq%2F3Khp420VeE1LyS6eQeBhttSXgzywCCToIUCOyYZvKLOWWwkdfd6ORVpGYJM0F5efDe9mEQHGty2BWTmhVGO4PNBmOoKzMBxmo%2FhD25dWvljSbD5hjMkb9gT9lJq63Mzi1bKkbjloc7xBWtwiRrDASCVRi%2FRxA8if%2BvrawMTzYI%2FACpeUv2KFFtDcUyTKilCHcis8G1Ga7wHpLzG8wVFs1K7jaeUKHZfIxmkj9%2FM4S9x9RGiMEudo0QbCVu9Xqn5PWEwLUk5%2FP0iaXac53I0kAH9Sau4m54lo%2FdTMfyekLYKQZ7ub34AbMMlmw5irC2VYTN0fuVMYMf8JHxJ7L7YYXAlSRnI2%2F8RtH4siTsDMz%2BZ5yS15OEXUxyDjGD1%2BvEq8MG16CDzY6JepKwT6geYbzxb0XjGMl7vwGSgzZIwo4nOa1M8Yr9Afb%2Fj8L21%2FsXaeaNZ2A6KTiEASph%2F0vF80cn4tokqu79fzfCUk2vfF4%2FFdFGEjGPHvg2yWrsDG%2F4%2BqpZB8jPOiXjWk0y5iXdM3XhKUvxBTA9UvHuvNPh%2Bzb%2BWj10z6nwuHWBbQFMvNCjKnn7qd1jS%2Fnx9VX3b6jC%2BbwOr5eMe3%2B83IcW4%2F3qgT%2BUTbA9srGaiHsn8AKiF6Ld%2FxF%2FOx6eeAJXabvK78MTTornNMd6XJTVR7%2Fj9bBjhFxV%2FMc1kJOAy2AeA%2FgrV4mFVDZFCqm8rEJ6qysCAWqK9iaztRJRbWXa4moFTELOav7jY%2FqAvoXp0Gc9NX7bIZl17%2FZl0rC1wRLeno0NvP%2B0CTcYNnS8wW6CtzNANaxzKqo9hRNOQ8rGo7tmSsMe2zWdt2frqVRcm5s2fofCgawDNHRNxnyfqgsYez4y4ADCjRM9H73hsNWafILTQdaFiSTj%2BQ%2FxA6yH7d%2BCmR8XbYr0a7VTF2N4siSsb5qdos3R6%2FjGxpULFfw7EfORnbrI9TAToX0sD40%2F2ylcGdh2Rdhg%2BSf2gka9jRTqK9%2BGwgHz7RTfVbHxirDhivdthYUvMRX8aYAD9lstvi%2B0aDL2DUZ0eCBUNNVG0IP65FLTWqPdiqdC0koHTVXe7iyNRG23QotBEy1RbTAzQyrmnYUT2rLsoA13JpcB4eVC2daBM1g2JGLekmwf5On7EJfngfZTNnVSce8bFjaTmQdvs%2FXmO%2FJVpoXdx3RSUe9O00Fj3nUdy0RLgRHiHXOPGW1h2uKZ07c9rG%2Bxyefp23pQeyBIEQoavYlakrG8fnrY5yHn2fbxXzAgw7m8bT5zkkSk4C7cpmOK21esB%2FXAQ5DzFfTo43%2BF%2FDzf0eZ4wZ3MDSjMcvD6nIeOahGgia%2FyU3HforTPkWkwnakdn0cI9jqfbPjD%2FuQLJr6644snlgX%2FApOMoyd1R5%2FxAAAAAElFTkSuQmCC)](https://linuxgsm.com) [![Build Status](https://travis-ci.com/GameServerManagers/LinuxGSM.svg?branch=master)](https://travis-ci.com/GameServerManagers/LinuxGSM) [![Codacy Badge](https://api.codacy.com/project/badge/Grade/3e98be27840043a090c3ab6e35db44b0)](https://app.codacy.com/app/GameServerManagers/LinuxGSM?utm_source=github.com&utm_medium=referral&utm_content=GameServerManagers/LinuxGSM&utm_campaign=Badge_Grade_Dashboard) [![Discord](https://discordapp.com/api/guilds/127498813903601664/widget.png?style=shield)](https://linuxgsm.com/discord) [![MIT Licence](https://badges.frapsoft.com/os/mit/mit.svg?v=103)](https://github.com/GameServerManagers/LinuxGSM/blob/master/LICENSE) [![made-with-bash](https://img.shields.io/badge/-Made%20with%20Bash-1f425f.svg?logo=image%2Fpng%3Bbase64%2CiVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyZpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw%2FeHBhY2tldCBiZWdpbj0i77u%2FIiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8%2BIDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNi1jMTExIDc5LjE1ODMyNSwgMjAxNS8wOS8xMC0wMToxMDoyMCAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENDIDIwMTUgKFdpbmRvd3MpIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOkE3MDg2QTAyQUZCMzExRTVBMkQxRDMzMkJDMUQ4RDk3IiB4bXBNTTpEb2N1bWVudElEPSJ4bXAuZGlkOkE3MDg2QTAzQUZCMzExRTVBMkQxRDMzMkJDMUQ4RDk3Ij4gPHhtcE1NOkRlcml2ZWRGcm9tIHN0UmVmOmluc3RhbmNlSUQ9InhtcC5paWQ6QTcwODZBMDBBRkIzMTFFNUEyRDFEMzMyQkMxRDhEOTciIHN0UmVmOmRvY3VtZW50SUQ9InhtcC5kaWQ6QTcwODZBMDFBRkIzMTFFNUEyRDFEMzMyQkMxRDhEOTciLz4gPC9yZGY6RGVzY3JpcHRpb24%2BIDwvcmRmOlJERj4gPC94OnhtcG1ldGE%2BIDw%2FeHBhY2tldCBlbmQ9InIiPz6lm45hAAADkklEQVR42qyVa0yTVxzGn7d9Wy03MS2ii8s%2BeokYNQSVhCzOjXZOFNF4jx%2BMRmPUMEUEqVG36jo2thizLSQSMd4N8ZoQ8RKjJtooaCpK6ZoCtRXKpRempbTv5ey83bhkAUphz8fznvP8znn%2B%2F3NeEEJgNBoRRSmz0ub%2FfuxEacBg%2FDmYtiCjgo5NG2mBXq%2BH5I1ogMRk9Zbd%2BQU2e1ML6VPLOyf5tvBQ8yT1lG10imxsABm7SLs898GTpyYynEzP60hO3trHDKvMigUwdeaceacqzp7nOI4n0SSIIjl36ao4Z356OV07fSQAk6xJ3XGg%2BLCr1d1OYlVHp4eUHPnerU79ZA%2F1kuv1JQMAg%2BE4O2P23EumF3VkvHprsZKMzKwbRUXFEyTvSIEmTVbrysp%2BWr8wfQHGK6WChVa3bKUmdWou%2BjpArdGkzZ41c1zG%2Fu5uGH4swzd561F%2BuhIT4%2BLnSuPsv9%2BJKIpjNr9dXYOyk7%2FBZrcjIT4eCnoKgedJP4BEqhG77E3NKP31FO7cfQA5K0dSYuLgz2TwCWJSOBzG6crzKK%2BohNfni%2Bx6OMUMMNe%2Fgf7ocbw0v0acKg6J8Ql0q%2BT%2FAXR5PNi5dz9c71upuQqCKFAD%2BYhrZLEAmpodaHO3Qy6TI3NhBpbrshGtOWKOSMYwYGQM8nJzoFJNxP2HjyIQho4PewK6hBktoDcUwtIln4PjOWzflQ%2Be5yl0yCCYgYikTclGlxadio%2BBQCSiW1UXoVGrKYwH4RgMrjU1HAB4vR6LzWYfFUCKxfS8Ftk5qxHoCUQAUkRJaSEokkV6Y%2F%2BJUOC4hn6A39NVXVBYeNP8piH6HeA4fPbpdBQV5KOx0QaL1YppX3Jgk0TwH2Vg6S3u%2BdB91%2B%2FpuNYPYFl5uP5V7ZqvsrX7jxqMXR6ff3gCQSTzFI0a1TX3wIs8ul%2Bq4HuWAAiM39vhOuR1O1fQ2gT%2F26Z8Z5vrl2OHi9OXZn995nLV9aFfS6UC9JeJPfuK0NBohWpCHMSAAsFe74WWP%2BvT25wtP9Bpob6uGqqyDnOtaeumjRu%2ByFu36VntK%2FPA5umTJeUtPWZSU9BCgud661odVp3DZtkc7AnYR33RRC708PrVi1larW7XwZIjLnd7R6SgSqWSNjU1B3F72pz5TZbXmX5vV81Yb7Lg7XT%2FUXriu8XLVqw6c6XqWnBKiiYU%2BMt3wWF7u7i91XlSEITwSAZ%2FCzAAHsJVbwXYFFEAAAAASUVORK5CYII%3D)](https://www.gnu.org/software/bash/) [![All Contributors](https://img.shields.io/badge/all_contributors-8-orange.svg?style=flat-square)](#contributors) [LinuxGSM](https://linuxgsm.com) is the command line tool for quick, simple deployment and management of dedicated game servers. @@ -57,8 +57,7 @@ Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/d - -
Daniel Gibbs
Daniel Gibbs

🐛 💻 🤔 💬 👀 🖋 📖 🚇
UltimateByte
UltimateByte

🐛 💻 📖 🤔 👀 💬
Bourne-ID
Bourne-ID

🐛 💻 🤔 💬 👀
CedarLUG
CedarLUG

🐛 💻 🤔 💬 👀
Marvin Lehmann
Marvin Lehmann

🐛 💻
Austin Shapiro
Austin Shapiro

🐛 💻
Kenny Lindelof
Kenny Lindelof

💬
Frisasky
Frisasky

💬
+
Daniel Gibbs
Daniel Gibbs

🐛 💻 🤔 💬 👀 🖋 📖 🚇
Frisasky
Frisasky

💬 🐛 💻
Kenny Lindelof
Kenny Lindelof

💬
Austin Shapiro
Austin Shapiro

🐛 💻
Marvin Lehmann
Marvin Lehmann

🐛 💻
Bourne-ID
Bourne-ID

👀 🖋 📖 🚇 👀
CedarLUG
CedarLUG

🐛 💻 🤔 💬 👀
UltimateByte
UltimateByte

🐛 💻 📖 🤔 👀
diff --git a/linuxgsm.sh b/linuxgsm.sh index 9502f2db3..6f29d4377 100755 --- a/linuxgsm.sh +++ b/linuxgsm.sh @@ -20,7 +20,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="190301" +version="190422" shortname="core" gameservername="core" rootdir="$(dirname "$(readlink -f "${BASH_SOURCE[0]}")")" From fde759447c0a57dff168eb4a958fb75dc91e0753 Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" Date: Sun, 28 Apr 2019 20:37:09 +0100 Subject: [PATCH 064/534] docs: add borzaka as a contributor (#2320) --- .all-contributorsrc | 10 ++++++++++ README.md | 4 ++-- 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/.all-contributorsrc b/.all-contributorsrc index 23560809b..9e4a36a51 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -99,6 +99,16 @@ "ideas", "review" ] + }, + { + "login": "borzaka", + "name": "Attila", + "avatar_url": "https://avatars0.githubusercontent.com/u/1230402?v=4", + "profile": "https://github.com/borzaka", + "contributions": [ + "code", + "bug" + ] } ], "contributorsPerLine": 7, diff --git a/README.md b/README.md index c4ca68ce9..a028258e8 100644 --- a/README.md +++ b/README.md @@ -3,7 +3,7 @@ LinuxGSM - [![LinuxGSM](https://img.shields.io/badge/-LinuxGSM-2b2b2b.svg?logo=data%3Aimage%2Fpng%3Bbase64%2CiVBORw0KGgoAAAANSUhEUgAAACsAAABACAYAAACDbo5ZAAAGD0lEQVR4AcWYa2wUVRvHz75c2vJ2disXoUBEVIioRAx%2BMIFA1IRwUS6KCCiIKBrvhEYiiGm5iBgk8QOGEgUUDYTttmVZWFr2UmwURS6iYAoCtmisElSsdHdbkT7%2BTzoNy%2BGc2dm54C%2F5Rdkz85x%2FZ86ZOXOYXYhIg3Phx%2FA4PAcv6f%2Btg5vhHJjP3EcZsgsshufJHH%2FAJbDztQ7aG35J1vgCXn%2BtgvrgEbLHYei9FmE3kDOUuh10OGwjZ7gEh7kZ9gNyllK3gnrg7%2BQs56DHjbCDyB0GuRF2ArnDeDfCziF3mO1G2FfJHRa4EXYpuUOxG2GXkzuUuBH2TXKH5W6ELSV3eM%2BNsOUk5yQcAY8p2uvgSPitor3MjbB1UOQXOFBvHwpbhPYWOExvL4SNUOQ7p4P2JTlzhOPmCu0vCu1PQpE2WOhk2MdJjk9y7HNwP1wEPUJbAcmZ6WTYrYolnifbxZBiibnFySHQCkUaLdY7C0V4%2FT5OhF1JcuIW6%2B0lOcvsBi2Ezao3j8Ov7Quwj52w60jNKIs1R5GatVaDDoEXSU4D7GSxbidYT3IuwjusFK0mNUVMwaZNNbl%2B%2F87hoVCom0HthaQmnG3QB0lNPcxlCvz%2B0GtlZTuorCxYYlA%2FDzbY%2FnrAgV3hCVLzCDMgEAi9wMMi9IIM%2FUwnNXWwi5mwRaSmmmXA798xq%2F3Khp420VeE1LyS6eQeBhttSXgzywCCToIUCOyYZvKLOWWwkdfd6ORVpGYJM0F5efDe9mEQHGty2BWTmhVGO4PNBmOoKzMBxmo%2FhD25dWvljSbD5hjMkb9gT9lJq63Mzi1bKkbjloc7xBWtwiRrDASCVRi%2FRxA8if%2BvrawMTzYI%2FACpeUv2KFFtDcUyTKilCHcis8G1Ga7wHpLzG8wVFs1K7jaeUKHZfIxmkj9%2FM4S9x9RGiMEudo0QbCVu9Xqn5PWEwLUk5%2FP0iaXac53I0kAH9Sau4m54lo%2FdTMfyekLYKQZ7ub34AbMMlmw5irC2VYTN0fuVMYMf8JHxJ7L7YYXAlSRnI2%2F8RtH4siTsDMz%2BZ5yS15OEXUxyDjGD1%2BvEq8MG16CDzY6JepKwT6geYbzxb0XjGMl7vwGSgzZIwo4nOa1M8Yr9Afb%2Fj8L21%2FsXaeaNZ2A6KTiEASph%2F0vF80cn4tokqu79fzfCUk2vfF4%2FFdFGEjGPHvg2yWrsDG%2F4%2BqpZB8jPOiXjWk0y5iXdM3XhKUvxBTA9UvHuvNPh%2Bzb%2BWj10z6nwuHWBbQFMvNCjKnn7qd1jS%2Fnx9VX3b6jC%2BbwOr5eMe3%2B83IcW4%2F3qgT%2BUTbA9srGaiHsn8AKiF6Ld%2FxF%2FOx6eeAJXabvK78MTTornNMd6XJTVR7%2Fj9bBjhFxV%2FMc1kJOAy2AeA%2FgrV4mFVDZFCqm8rEJ6qysCAWqK9iaztRJRbWXa4moFTELOav7jY%2FqAvoXp0Gc9NX7bIZl17%2FZl0rC1wRLeno0NvP%2B0CTcYNnS8wW6CtzNANaxzKqo9hRNOQ8rGo7tmSsMe2zWdt2frqVRcm5s2fofCgawDNHRNxnyfqgsYez4y4ADCjRM9H73hsNWafILTQdaFiSTj%2BQ%2FxA6yH7d%2BCmR8XbYr0a7VTF2N4siSsb5qdos3R6%2FjGxpULFfw7EfORnbrI9TAToX0sD40%2F2ylcGdh2Rdhg%2BSf2gka9jRTqK9%2BGwgHz7RTfVbHxirDhivdthYUvMRX8aYAD9lstvi%2B0aDL2DUZ0eCBUNNVG0IP65FLTWqPdiqdC0koHTVXe7iyNRG23QotBEy1RbTAzQyrmnYUT2rLsoA13JpcB4eVC2daBM1g2JGLekmwf5On7EJfngfZTNnVSce8bFjaTmQdvs%2FXmO%2FJVpoXdx3RSUe9O00Fj3nUdy0RLgRHiHXOPGW1h2uKZ07c9rG%2Bxyefp23pQeyBIEQoavYlakrG8fnrY5yHn2fbxXzAgw7m8bT5zkkSk4C7cpmOK21esB%2FXAQ5DzFfTo43%2BF%2FDzf0eZ4wZ3MDSjMcvD6nIeOahGgia%2FyU3HforTPkWkwnakdn0cI9jqfbPjD%2FuQLJr6644snlgX%2FApOMoyd1R5%2FxAAAAAElFTkSuQmCC)](https://linuxgsm.com) [![Build Status](https://travis-ci.com/GameServerManagers/LinuxGSM.svg?branch=master)](https://travis-ci.com/GameServerManagers/LinuxGSM) [![Codacy Badge](https://api.codacy.com/project/badge/Grade/3e98be27840043a090c3ab6e35db44b0)](https://app.codacy.com/app/GameServerManagers/LinuxGSM?utm_source=github.com&utm_medium=referral&utm_content=GameServerManagers/LinuxGSM&utm_campaign=Badge_Grade_Dashboard) [![Discord](https://discordapp.com/api/guilds/127498813903601664/widget.png?style=shield)](https://linuxgsm.com/discord) [![MIT Licence](https://badges.frapsoft.com/os/mit/mit.svg?v=103)](https://github.com/GameServerManagers/LinuxGSM/blob/master/LICENSE) [![made-with-bash](https://img.shields.io/badge/-Made%20with%20Bash-1f425f.svg?logo=image%2Fpng%3Bbase64%2CiVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyZpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw%2FeHBhY2tldCBiZWdpbj0i77u%2FIiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8%2BIDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNi1jMTExIDc5LjE1ODMyNSwgMjAxNS8wOS8xMC0wMToxMDoyMCAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENDIDIwMTUgKFdpbmRvd3MpIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOkE3MDg2QTAyQUZCMzExRTVBMkQxRDMzMkJDMUQ4RDk3IiB4bXBNTTpEb2N1bWVudElEPSJ4bXAuZGlkOkE3MDg2QTAzQUZCMzExRTVBMkQxRDMzMkJDMUQ4RDk3Ij4gPHhtcE1NOkRlcml2ZWRGcm9tIHN0UmVmOmluc3RhbmNlSUQ9InhtcC5paWQ6QTcwODZBMDBBRkIzMTFFNUEyRDFEMzMyQkMxRDhEOTciIHN0UmVmOmRvY3VtZW50SUQ9InhtcC5kaWQ6QTcwODZBMDFBRkIzMTFFNUEyRDFEMzMyQkMxRDhEOTciLz4gPC9yZGY6RGVzY3JpcHRpb24%2BIDwvcmRmOlJERj4gPC94OnhtcG1ldGE%2BIDw%2FeHBhY2tldCBlbmQ9InIiPz6lm45hAAADkklEQVR42qyVa0yTVxzGn7d9Wy03MS2ii8s%2BeokYNQSVhCzOjXZOFNF4jx%2BMRmPUMEUEqVG36jo2thizLSQSMd4N8ZoQ8RKjJtooaCpK6ZoCtRXKpRempbTv5ey83bhkAUphz8fznvP8znn%2B%2F3NeEEJgNBoRRSmz0ub%2FfuxEacBg%2FDmYtiCjgo5NG2mBXq%2BH5I1ogMRk9Zbd%2BQU2e1ML6VPLOyf5tvBQ8yT1lG10imxsABm7SLs898GTpyYynEzP60hO3trHDKvMigUwdeaceacqzp7nOI4n0SSIIjl36ao4Z356OV07fSQAk6xJ3XGg%2BLCr1d1OYlVHp4eUHPnerU79ZA%2F1kuv1JQMAg%2BE4O2P23EumF3VkvHprsZKMzKwbRUXFEyTvSIEmTVbrysp%2BWr8wfQHGK6WChVa3bKUmdWou%2BjpArdGkzZ41c1zG%2Fu5uGH4swzd561F%2BuhIT4%2BLnSuPsv9%2BJKIpjNr9dXYOyk7%2FBZrcjIT4eCnoKgedJP4BEqhG77E3NKP31FO7cfQA5K0dSYuLgz2TwCWJSOBzG6crzKK%2BohNfni%2Bx6OMUMMNe%2Fgf7ocbw0v0acKg6J8Ql0q%2BT%2FAXR5PNi5dz9c71upuQqCKFAD%2BYhrZLEAmpodaHO3Qy6TI3NhBpbrshGtOWKOSMYwYGQM8nJzoFJNxP2HjyIQho4PewK6hBktoDcUwtIln4PjOWzflQ%2Be5yl0yCCYgYikTclGlxadio%2BBQCSiW1UXoVGrKYwH4RgMrjU1HAB4vR6LzWYfFUCKxfS8Ftk5qxHoCUQAUkRJaSEokkV6Y%2F%2BJUOC4hn6A39NVXVBYeNP8piH6HeA4fPbpdBQV5KOx0QaL1YppX3Jgk0TwH2Vg6S3u%2BdB91%2B%2FpuNYPYFl5uP5V7ZqvsrX7jxqMXR6ff3gCQSTzFI0a1TX3wIs8ul%2Bq4HuWAAiM39vhOuR1O1fQ2gT%2F26Z8Z5vrl2OHi9OXZn995nLV9aFfS6UC9JeJPfuK0NBohWpCHMSAAsFe74WWP%2BvT25wtP9Bpob6uGqqyDnOtaeumjRu%2ByFu36VntK%2FPA5umTJeUtPWZSU9BCgud661odVp3DZtkc7AnYR33RRC708PrVi1larW7XwZIjLnd7R6SgSqWSNjU1B3F72pz5TZbXmX5vV81Yb7Lg7XT%2FUXriu8XLVqw6c6XqWnBKiiYU%2BMt3wWF7u7i91XlSEITwSAZ%2FCzAAHsJVbwXYFFEAAAAASUVORK5CYII%3D)](https://www.gnu.org/software/bash/) [![All Contributors](https://img.shields.io/badge/all_contributors-8-orange.svg?style=flat-square)](#contributors) +[![LinuxGSM](https://img.shields.io/badge/-LinuxGSM-2b2b2b.svg?logo=data%3Aimage%2Fpng%3Bbase64%2CiVBORw0KGgoAAAANSUhEUgAAACsAAABACAYAAACDbo5ZAAAGD0lEQVR4AcWYa2wUVRvHz75c2vJ2disXoUBEVIioRAx%2BMIFA1IRwUS6KCCiIKBrvhEYiiGm5iBgk8QOGEgUUDYTttmVZWFr2UmwURS6iYAoCtmisElSsdHdbkT7%2BTzoNy%2BGc2dm54C%2F5Rdkz85x%2FZ86ZOXOYXYhIg3Phx%2FA4PAcv6f%2Btg5vhHJjP3EcZsgsshufJHH%2FAJbDztQ7aG35J1vgCXn%2BtgvrgEbLHYei9FmE3kDOUuh10OGwjZ7gEh7kZ9gNyllK3gnrg7%2BQs56DHjbCDyB0GuRF2ArnDeDfCziF3mO1G2FfJHRa4EXYpuUOxG2GXkzuUuBH2TXKH5W6ELSV3eM%2BNsOUk5yQcAY8p2uvgSPitor3MjbB1UOQXOFBvHwpbhPYWOExvL4SNUOQ7p4P2JTlzhOPmCu0vCu1PQpE2WOhk2MdJjk9y7HNwP1wEPUJbAcmZ6WTYrYolnifbxZBiibnFySHQCkUaLdY7C0V4%2FT5OhF1JcuIW6%2B0lOcvsBi2Ezao3j8Ov7Quwj52w60jNKIs1R5GatVaDDoEXSU4D7GSxbidYT3IuwjusFK0mNUVMwaZNNbl%2B%2F87hoVCom0HthaQmnG3QB0lNPcxlCvz%2B0GtlZTuorCxYYlA%2FDzbY%2FnrAgV3hCVLzCDMgEAi9wMMi9IIM%2FUwnNXWwi5mwRaSmmmXA798xq%2F3Khp420VeE1LyS6eQeBhttSXgzywCCToIUCOyYZvKLOWWwkdfd6ORVpGYJM0F5efDe9mEQHGty2BWTmhVGO4PNBmOoKzMBxmo%2FhD25dWvljSbD5hjMkb9gT9lJq63Mzi1bKkbjloc7xBWtwiRrDASCVRi%2FRxA8if%2BvrawMTzYI%2FACpeUv2KFFtDcUyTKilCHcis8G1Ga7wHpLzG8wVFs1K7jaeUKHZfIxmkj9%2FM4S9x9RGiMEudo0QbCVu9Xqn5PWEwLUk5%2FP0iaXac53I0kAH9Sau4m54lo%2FdTMfyekLYKQZ7ub34AbMMlmw5irC2VYTN0fuVMYMf8JHxJ7L7YYXAlSRnI2%2F8RtH4siTsDMz%2BZ5yS15OEXUxyDjGD1%2BvEq8MG16CDzY6JepKwT6geYbzxb0XjGMl7vwGSgzZIwo4nOa1M8Yr9Afb%2Fj8L21%2FsXaeaNZ2A6KTiEASph%2F0vF80cn4tokqu79fzfCUk2vfF4%2FFdFGEjGPHvg2yWrsDG%2F4%2BqpZB8jPOiXjWk0y5iXdM3XhKUvxBTA9UvHuvNPh%2Bzb%2BWj10z6nwuHWBbQFMvNCjKnn7qd1jS%2Fnx9VX3b6jC%2BbwOr5eMe3%2B83IcW4%2F3qgT%2BUTbA9srGaiHsn8AKiF6Ld%2FxF%2FOx6eeAJXabvK78MTTornNMd6XJTVR7%2Fj9bBjhFxV%2FMc1kJOAy2AeA%2FgrV4mFVDZFCqm8rEJ6qysCAWqK9iaztRJRbWXa4moFTELOav7jY%2FqAvoXp0Gc9NX7bIZl17%2FZl0rC1wRLeno0NvP%2B0CTcYNnS8wW6CtzNANaxzKqo9hRNOQ8rGo7tmSsMe2zWdt2frqVRcm5s2fofCgawDNHRNxnyfqgsYez4y4ADCjRM9H73hsNWafILTQdaFiSTj%2BQ%2FxA6yH7d%2BCmR8XbYr0a7VTF2N4siSsb5qdos3R6%2FjGxpULFfw7EfORnbrI9TAToX0sD40%2F2ylcGdh2Rdhg%2BSf2gka9jRTqK9%2BGwgHz7RTfVbHxirDhivdthYUvMRX8aYAD9lstvi%2B0aDL2DUZ0eCBUNNVG0IP65FLTWqPdiqdC0koHTVXe7iyNRG23QotBEy1RbTAzQyrmnYUT2rLsoA13JpcB4eVC2daBM1g2JGLekmwf5On7EJfngfZTNnVSce8bFjaTmQdvs%2FXmO%2FJVpoXdx3RSUe9O00Fj3nUdy0RLgRHiHXOPGW1h2uKZ07c9rG%2Bxyefp23pQeyBIEQoavYlakrG8fnrY5yHn2fbxXzAgw7m8bT5zkkSk4C7cpmOK21esB%2FXAQ5DzFfTo43%2BF%2FDzf0eZ4wZ3MDSjMcvD6nIeOahGgia%2FyU3HforTPkWkwnakdn0cI9jqfbPjD%2FuQLJr6644snlgX%2FApOMoyd1R5%2FxAAAAAElFTkSuQmCC)](https://linuxgsm.com) [![Build Status](https://travis-ci.com/GameServerManagers/LinuxGSM.svg?branch=master)](https://travis-ci.com/GameServerManagers/LinuxGSM) [![Codacy Badge](https://api.codacy.com/project/badge/Grade/3e98be27840043a090c3ab6e35db44b0)](https://app.codacy.com/app/GameServerManagers/LinuxGSM?utm_source=github.com&utm_medium=referral&utm_content=GameServerManagers/LinuxGSM&utm_campaign=Badge_Grade_Dashboard) [![Discord](https://discordapp.com/api/guilds/127498813903601664/widget.png?style=shield)](https://linuxgsm.com/discord) [![MIT Licence](https://badges.frapsoft.com/os/mit/mit.svg?v=103)](https://github.com/GameServerManagers/LinuxGSM/blob/master/LICENSE) [![made-with-bash](https://img.shields.io/badge/-Made%20with%20Bash-1f425f.svg?logo=image%2Fpng%3Bbase64%2CiVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyZpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw%2FeHBhY2tldCBiZWdpbj0i77u%2FIiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8%2BIDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNi1jMTExIDc5LjE1ODMyNSwgMjAxNS8wOS8xMC0wMToxMDoyMCAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENDIDIwMTUgKFdpbmRvd3MpIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOkE3MDg2QTAyQUZCMzExRTVBMkQxRDMzMkJDMUQ4RDk3IiB4bXBNTTpEb2N1bWVudElEPSJ4bXAuZGlkOkE3MDg2QTAzQUZCMzExRTVBMkQxRDMzMkJDMUQ4RDk3Ij4gPHhtcE1NOkRlcml2ZWRGcm9tIHN0UmVmOmluc3RhbmNlSUQ9InhtcC5paWQ6QTcwODZBMDBBRkIzMTFFNUEyRDFEMzMyQkMxRDhEOTciIHN0UmVmOmRvY3VtZW50SUQ9InhtcC5kaWQ6QTcwODZBMDFBRkIzMTFFNUEyRDFEMzMyQkMxRDhEOTciLz4gPC9yZGY6RGVzY3JpcHRpb24%2BIDwvcmRmOlJERj4gPC94OnhtcG1ldGE%2BIDw%2FeHBhY2tldCBlbmQ9InIiPz6lm45hAAADkklEQVR42qyVa0yTVxzGn7d9Wy03MS2ii8s%2BeokYNQSVhCzOjXZOFNF4jx%2BMRmPUMEUEqVG36jo2thizLSQSMd4N8ZoQ8RKjJtooaCpK6ZoCtRXKpRempbTv5ey83bhkAUphz8fznvP8znn%2B%2F3NeEEJgNBoRRSmz0ub%2FfuxEacBg%2FDmYtiCjgo5NG2mBXq%2BH5I1ogMRk9Zbd%2BQU2e1ML6VPLOyf5tvBQ8yT1lG10imxsABm7SLs898GTpyYynEzP60hO3trHDKvMigUwdeaceacqzp7nOI4n0SSIIjl36ao4Z356OV07fSQAk6xJ3XGg%2BLCr1d1OYlVHp4eUHPnerU79ZA%2F1kuv1JQMAg%2BE4O2P23EumF3VkvHprsZKMzKwbRUXFEyTvSIEmTVbrysp%2BWr8wfQHGK6WChVa3bKUmdWou%2BjpArdGkzZ41c1zG%2Fu5uGH4swzd561F%2BuhIT4%2BLnSuPsv9%2BJKIpjNr9dXYOyk7%2FBZrcjIT4eCnoKgedJP4BEqhG77E3NKP31FO7cfQA5K0dSYuLgz2TwCWJSOBzG6crzKK%2BohNfni%2Bx6OMUMMNe%2Fgf7ocbw0v0acKg6J8Ql0q%2BT%2FAXR5PNi5dz9c71upuQqCKFAD%2BYhrZLEAmpodaHO3Qy6TI3NhBpbrshGtOWKOSMYwYGQM8nJzoFJNxP2HjyIQho4PewK6hBktoDcUwtIln4PjOWzflQ%2Be5yl0yCCYgYikTclGlxadio%2BBQCSiW1UXoVGrKYwH4RgMrjU1HAB4vR6LzWYfFUCKxfS8Ftk5qxHoCUQAUkRJaSEokkV6Y%2F%2BJUOC4hn6A39NVXVBYeNP8piH6HeA4fPbpdBQV5KOx0QaL1YppX3Jgk0TwH2Vg6S3u%2BdB91%2B%2FpuNYPYFl5uP5V7ZqvsrX7jxqMXR6ff3gCQSTzFI0a1TX3wIs8ul%2Bq4HuWAAiM39vhOuR1O1fQ2gT%2F26Z8Z5vrl2OHi9OXZn995nLV9aFfS6UC9JeJPfuK0NBohWpCHMSAAsFe74WWP%2BvT25wtP9Bpob6uGqqyDnOtaeumjRu%2ByFu36VntK%2FPA5umTJeUtPWZSU9BCgud661odVp3DZtkc7AnYR33RRC708PrVi1larW7XwZIjLnd7R6SgSqWSNjU1B3F72pz5TZbXmX5vV81Yb7Lg7XT%2FUXriu8XLVqw6c6XqWnBKiiYU%2BMt3wWF7u7i91XlSEITwSAZ%2FCzAAHsJVbwXYFFEAAAAASUVORK5CYII%3D)](https://www.gnu.org/software/bash/) [![All Contributors](https://img.shields.io/badge/all_contributors-9-orange.svg?style=flat-square)](#contributors) [LinuxGSM](https://linuxgsm.com) is the command line tool for quick, simple deployment and management of dedicated game servers. @@ -57,7 +57,7 @@ Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/d -
Daniel Gibbs
Daniel Gibbs

🐛 💻 🤔 💬 👀 🖋 📖 🚇
Frisasky
Frisasky

💬 🐛 💻
Kenny Lindelof
Kenny Lindelof

💬
Austin Shapiro
Austin Shapiro

🐛 💻
Marvin Lehmann
Marvin Lehmann

🐛 💻
Bourne-ID
Bourne-ID

👀 🖋 📖 🚇 👀
CedarLUG
CedarLUG

🐛 💻 🤔 💬 👀
UltimateByte
UltimateByte

🐛 💻 📖 🤔 👀
+
Daniel Gibbs
Daniel Gibbs

🐛 💻 🤔 💬 👀 🖋 📖 🚇
Frisasky
Frisasky

💬 🐛 💻
Kenny Lindelof
Kenny Lindelof

💬
Austin Shapiro
Austin Shapiro

🐛 💻
Marvin Lehmann
Marvin Lehmann

🐛 💻
Bourne-ID
Bourne-ID

👀 🖋 📖 🚇 👀
CedarLUG
CedarLUG

🐛 💻 🤔 💬 👀
UltimateByte
UltimateByte

🐛 💻 📖 🤔 👀
Attila
Attila

💻 🐛
From 5ec80b95211bc1be8ff5682329f2e2f71086576b Mon Sep 17 00:00:00 2001 From: Frisasky Date: Mon, 29 Apr 2019 03:41:32 +0800 Subject: [PATCH 065/534] feat(install): Add mono support for RHEL 8 (#2306) Co-authored-by: Frisa --- lgsm/functions/check_deps.sh | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/lgsm/functions/check_deps.sh b/lgsm/functions/check_deps.sh index 0cb0b0178..351c848d3 100644 --- a/lgsm/functions/check_deps.sh +++ b/lgsm/functions/check_deps.sh @@ -56,7 +56,10 @@ fn_install_mono_repo(){ monoautoinstall="1" fi elif [ "${distroid}" == "centos" ]; then - if [ "${distroversion}" == "7" ]; then + if [ "${distroversion}" == "8" ]; then + cmd="rpm --import 'https://keyserver.ubuntu.com/pks/lookup?op=get&search=0x3FA7E0328081BFF6A14DA29AA6A19B38D3D831EF';su -c 'curl https://download.mono-project.com/repo/centos8-stable.repo | tee /etc/yum.repos.d/mono-centos8-stable.repo'" + eval ${cmd} + elif [ "${distroversion}" == "7" ]; then cmd="rpm --import 'https://keyserver.ubuntu.com/pks/lookup?op=get&search=0x3FA7E0328081BFF6A14DA29AA6A19B38D3D831EF';su -c 'curl https://download.mono-project.com/repo/centos7-stable.repo | tee /etc/yum.repos.d/mono-centos7-stable.repo'" eval ${cmd} elif [ "${distroversion}" == "6" ]; then From 46dd088b821a7769204de2bab2903f453cca8f86 Mon Sep 17 00:00:00 2001 From: Attila <1230402+borzaka@users.noreply.github.com> Date: Wed, 1 May 2019 21:06:07 +0200 Subject: [PATCH 066/534] feat(csgoserver) Add mapgroup and map example for the new Danger Zone map: Sirocco (#2323) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Borzák Attila <1230402+borzaka@users.noreply.github.com> This new map Sirocco introduced to the game on 2019.04.30. Plus add note to not use other mapgroups with Danger Zone mode. --- lgsm/config-default/config-lgsm/csgoserver/_default.cfg | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lgsm/config-default/config-lgsm/csgoserver/_default.cfg b/lgsm/config-default/config-lgsm/csgoserver/_default.cfg index 6a0e9bbd9..8fb88de8b 100644 --- a/lgsm/config-default/config-lgsm/csgoserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/csgoserver/_default.cfg @@ -10,7 +10,7 @@ ## Server Start Settings | https://docs.linuxgsm.com/configuration/start-parameters # https://developer.valvesoftware.com/wiki/Counter-Strike:_Global_Offensive_Dedicated_Servers#Starting_the_Server -# [Game Modes] gametype gamemode mapgroup (you can mix these across Game Modes, but use only one) +# [Game Modes] gametype gamemode mapgroup (you can mix these across all Game Modes except Danger Zone, but use only one) # Arms Race 1 0 mg_armsrace # Classic Casual 0 0 mg_casualsigma, mg_casualdelta # Classic Competitive 0 1 mg_active, mg_reserves, mg_hostage, mg_de_dust2 @@ -18,7 +18,7 @@ # Deathmatch 1 2 mg_deathmatch # Demolition 1 1 mg_demolition # Wingman 0 2 -# Danger Zone 6 0 mg_dz_blacksite (map: dz_blacksite) +# Danger Zone 6 0 mg_dz_blacksite (map: dz_blacksite), mg_dz_sirocco (map: dz_sirocco) gametype="0" gamemode="0" mapgroup="mg_active" From 2a2e73445b2ba844a2b19f3b97e706f00a4ffb14 Mon Sep 17 00:00:00 2001 From: Frisasky Date: Thu, 2 May 2019 19:25:28 +0800 Subject: [PATCH 067/534] feat(nmrihserver): remove default parameter that disables VAC (#2326) --- lgsm/config-default/config-lgsm/nmrihserver/_default.cfg | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lgsm/config-default/config-lgsm/nmrihserver/_default.cfg b/lgsm/config-default/config-lgsm/nmrihserver/_default.cfg index 77a7dc464..9de8fd81e 100644 --- a/lgsm/config-default/config-lgsm/nmrihserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/nmrihserver/_default.cfg @@ -23,7 +23,7 @@ gslt="" ## Server Start Command | https://docs.linuxgsm.com/configuration/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}" +parms="-game nmrih -strictportbind -ip ${ip} -port ${port} +clientport ${clientport} +tv_port ${sourcetvport} +map ${defaultmap} +sv_setsteamaccount ${gslt} +servercfgfile ${servercfg} -maxplayers ${maxplayers}" } #### LinuxGSM Settings #### From 7734a3519e2b91acea196e6851445cb18b0a9500 Mon Sep 17 00:00:00 2001 From: Heihachi Date: Fri, 3 May 2019 09:33:36 -0400 Subject: [PATCH 068/534] feat(newserver): Unturned (#2296) Co-authored-by: admin@heihachi.pw --- .../config-lgsm/untserver/_default.cfg | 136 ++++++++++++++++++ lgsm/data/serverlist.csv | 1 + lgsm/functions/command_validate.sh | 2 + lgsm/functions/core_functions.sh | 5 + lgsm/functions/fix.sh | 2 + lgsm/functions/fix_unt.sh | 11 ++ lgsm/functions/info_glibc.sh | 3 + lgsm/functions/info_messages.sh | 14 +- lgsm/functions/info_parms.sh | 7 + lgsm/functions/install_config.sh | 6 + lgsm/functions/install_server_files.sh | 3 + lgsm/functions/update_steamcmd.sh | 6 +- 12 files changed, 193 insertions(+), 3 deletions(-) create mode 100644 lgsm/config-default/config-lgsm/untserver/_default.cfg create mode 100644 lgsm/functions/fix_unt.sh diff --git a/lgsm/config-default/config-lgsm/untserver/_default.cfg b/lgsm/config-default/config-lgsm/untserver/_default.cfg new file mode 100644 index 000000000..26db0910b --- /dev/null +++ b/lgsm/config-default/config-lgsm/untserver/_default.cfg @@ -0,0 +1,136 @@ +################################## +######## 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://docs.linuxgsm.com/configuration/start-parameters +ip="0.0.0.0" +port="27015" +maxplayers="20" +defaultmap="pei" + +## SteamCMD Login | https://github.com/GameServerManagers/LinuxGSM/wiki/SteamCMD#steamcmd-login +steamuser="username" +steampass='password' + +## Server Start Command | https://docs.linuxgsm.com/configuration/start-parameters#additional-parameters + +# Parameters are changed in game.ini and engine.ini (Location: ${systemdir}/Saved/Config/LinuxServer) +# Make sure you change the admin password before launching the server + +fn_parms(){ +parms="-port:${port} -players:${maxplayers} --nographics -${defaultmap} -batchmode +secureserver/${servicename}" +} + +#### LinuxGSM Settings #### + +## Notification Alerts +# (on|off) + +# More info | https://docs.linuxgsm.com/alerts#more-info +postalert="off" +postdays="7" +posttarget="https://hastebin.com" + +# Discord Alerts | https://docs.linuxgsm.com/alerts/discord +discordalert="off" +discordwebhook="webhook" + +# Email Alerts | https://docs.linuxgsm.com/alerts/email +emailalert="off" +email="email@example.com" +emailfrom="" + +# IFTTT Alerts | https://docs.linuxgsm.com/alerts/ifttt +iftttalert="off" +ifttttoken="accesstoken" +iftttevent="linuxgsm_alert" + +# Mailgun Email Alerts | https://docs.linuxgsm.com/alerts/mailgun +mailgunalert="off" +mailguntoken="accesstoken" +mailgundomain="example.com" +mailgunemailfrom="alert@example.com" +mailgunemail="email@myemail.com" + +# Pushbullet Alerts | https://docs.linuxgsm.com/alerts/pushbullet +pushbulletalert="off" +pushbullettoken="accesstoken" +channeltag="" + +# Pushover Alerts | https://docs.linuxgsm.com/alerts/pushover +pushoveralert="off" +pushovertoken="accesstoken" + +# Telegram Alerts | https://docs.linuxgsm.com/alerts/telegram +# You can add a custom cURL string eg proxy (useful in Russia) or else in "curlcustomstring". +# like a "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help", if you not need +# any custom string in curl - simple ignore this parameter. +telegramalert="off" +telegramtoken="accesstoken" +telegramchatid="" +curlcustomstring="" + +## Updating | https://docs.linuxgsm.com/commands/update +updateonstart="off" + +## Backup | https://docs.linuxgsm.com/commands/backup +maxbackups="4" +maxbackupdays="30" +stoponbackup="on" + +## Logging | https://docs.linuxgsm.com/features/logging +consolelogging="on" +logdays="7" + +#### LinuxGSM Advanced Settings #### + +# ANSI Colors +ansi="on" + +## SteamCMD Settings +# Server appid +appid="304930" +# 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="Unturned" +engine="unity3d" + +#### Directories #### +# Edit with care + +## Server Specific Directories +systemdir="${serverfiles}" +executabledir="${serverfiles}" +executable="./Unturned_Headless.x86" +servercfgdir="${systemdir}/Servers/${servicename}" +servercfg="Config.json" +servercfgdefault="Config.json" +servercfgfullpath="${servercfgdir}/${servercfg}" + +## Backup Directory +backupdir="${lgsmdir}/backup" + +## Logging Directories +logdir="${rootdir}/log" +gamelogdir="${logdir}/server" +lgsmlogdir="${logdir}/script" +consolelogdir="${logdir}/console" +lgsmlog="${lgsmlogdir}/${servicename}-script.log" +consolelog="${consolelogdir}/${servicename}-console.log" +alertlog="${lgsmlogdir}/${servicename}-alert.log" +postdetailslog="${lgsmlogdir}/${servicename}-postdetails.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/data/serverlist.csv b/lgsm/data/serverlist.csv index 9013e8662..960947995 100644 --- a/lgsm/data/serverlist.csv +++ b/lgsm/data/serverlist.csv @@ -83,6 +83,7 @@ tu,tuserver,Tower Unite ut2k4,ut2k4server,Unreal Tournament 2004 ut3,ut3server,Unreal Tournament 3 ut99,ut99server,Unreal Tournament 99 +unt,untserver,Unturned vs,vsserver,Vampire Slayer wet,wetserver,Wolfenstein: Enemy Territory wurm,wurmserver,Wurm Unlimited diff --git a/lgsm/functions/command_validate.sh b/lgsm/functions/command_validate.sh index 2e9dab18b..4b154a586 100644 --- a/lgsm/functions/command_validate.sh +++ b/lgsm/functions/command_validate.sh @@ -27,6 +27,8 @@ fn_validation(){ if [ "${appid}" == "90" ]; then ${unbuffer} ./steamcmd.sh +login "${steamuser}" "${steampass}" +force_install_dir "${serverfiles}" +app_info_print 70 +app_set_config 90 mod "${appidmod}" +app_update "${appid}" ${branch} +app_update "${appid}" ${branch} validate +quit | tee -a "${lgsmlog}" + elif [ "${gamename}" == "Unturned" ]; then + ${unbuffer} /steamcmd.sh +@sSteamCmdForcePlatformBitness 32 +login "${steamuser}" "${steampass}" +force_install_dir "${filesdir}" +app_update "${appid}" ${branch} validate +quit else ${unbuffer} ./steamcmd.sh +login "${steamuser}" "${steampass}" +force_install_dir "${serverfiles}" +app_update "${appid}" ${branch} validate +quit | tee -a "${lgsmlog}" fi diff --git a/lgsm/functions/core_functions.sh b/lgsm/functions/core_functions.sh index b6f139ca1..dd18e0d2c 100644 --- a/lgsm/functions/core_functions.sh +++ b/lgsm/functions/core_functions.sh @@ -402,6 +402,11 @@ functionfile="${FUNCNAME}" fn_fetch_function } +fix_unt.sh(){ +functionfile="${FUNCNAME}" +fn_fetch_function +} + fix_wurm.sh(){ functionfile="${FUNCNAME}" fn_fetch_function diff --git a/lgsm/functions/fix.sh b/lgsm/functions/fix.sh index ba83b9820..da9c362e4 100644 --- a/lgsm/functions/fix.sh +++ b/lgsm/functions/fix.sh @@ -69,6 +69,8 @@ if [ "${function_selfname}" != "command_install.sh" ]&&[ -z "${fixbypass}" ]; th fix_ts3.sh elif [ "${shortname}" == "mta" ]; then fix_mta.sh + elif [ "${shortname}" == "unt" ]; then + fix_unt.sh elif [ "${shortname}" == "wurm" ]; then fix_wurm.sh fi diff --git a/lgsm/functions/fix_unt.sh b/lgsm/functions/fix_unt.sh new file mode 100644 index 000000000..d89f69558 --- /dev/null +++ b/lgsm/functions/fix_unt.sh @@ -0,0 +1,11 @@ +#!/bin/bash +# LinuxGSM fix_rust.sh function +# Author: Daniel Gibbs +# Website: https://linuxgsm.com +# Description: Resolves startup issue with Unturned + +local commandname="FIX" +local commandaction="Fix" + +# Fixes: [Raknet] Server Shutting Down (Shutting Down) +export LD_LIBRARY_PATH="$LD_LIBRARY_PATH:${systemdir}/lib" diff --git a/lgsm/functions/info_glibc.sh b/lgsm/functions/info_glibc.sh index d822c4b95..63760c714 100644 --- a/lgsm/functions/info_glibc.sh +++ b/lgsm/functions/info_glibc.sh @@ -165,6 +165,9 @@ elif [ "${gamename}" == "Wurm Unlimited" ]; then elif [ "${gamename}" == "Multi Theft Auto" ]; then glibcrequired="2.7" glibcfix="no" +elif [ "${gamename}" == "Unturned" ]; then + glibcrequired="2.15" + glibcfix="no" elif [ "${gamename}" == "Zombie Panic! Source" ]; then glibcrequired="2.15" glibcfix="yes" diff --git a/lgsm/functions/info_messages.sh b/lgsm/functions/info_messages.sh index 020b1b238..701c6940e 100644 --- a/lgsm/functions/info_messages.sh +++ b/lgsm/functions/info_messages.sh @@ -495,7 +495,7 @@ fn_info_message_ports(){ fi done # engines/games that require editing the parms - local ports_edit_array=( "goldsource" "Factorio" "Hurtworld" "iw3.0" "ioquake3" "Rust" "spark" "source" "starbound" "unreal4" "realvirtuality") + local ports_edit_array=( "goldsource" "Factorio" "Hurtworld" "iw3.0" "ioquake3" "Rust" "spark" "source" "starbound" "unreal4" "realvirtuality" "Unturned") for port_edit in "${ports_edit_array[@]}" do if [ "${engine}" == "${port_edit}" ]||[ "${gamename}" == "${port_edit}" ]||[ "${shortname}" == "${port_edit}" ]; then @@ -1107,6 +1107,16 @@ fn_info_message_unreal3(){ } | column -s $'\t' -t } +fn_info_message_unturned(){ + echo -e "netstat -atunp | grep Unturned" + echo -e "" + { + echo -e "DESCRIPTION\tDIRECTION\tPORT\tPROTOCOL" + echo -e "> Game\tINBOUND\t${port}\tudp" + echo -e "> Query\tINBOUND\t${queryport}\tudp" + } | column -s $'\t' -t +} + fn_info_message_kf2(){ echo -e "netstat -atunp | grep KFGame" echo -e "" @@ -1229,6 +1239,8 @@ fn_info_message_select_engine(){ fn_info_message_teamspeak3 elif [ "${gamename}" == "Tower Unite" ]; then fn_info_message_towerunite + elif [ "${shortname}" == "unt" ]; then + fn_info_message_unturned elif [ "${gamename}" == "Multi Theft Auto" ]; then fn_info_message_mta elif [ "${gamename}" == "Mumble" ]; then diff --git a/lgsm/functions/info_parms.sh b/lgsm/functions/info_parms.sh index 9ac95d477..dd289543e 100644 --- a/lgsm/functions/info_parms.sh +++ b/lgsm/functions/info_parms.sh @@ -164,6 +164,11 @@ fn_info_parms_unreal3(){ adminpassword=${adminpassword:-"NOT SET"} } +fn_info_parms_unturned(){ + servername=${servicename:-"NOT SET"} + port=${port:-"0"} + queryport=$((port + 1)) +} fn_info_parms_kf2(){ queryport=${queryport:-"0"} defaultmap=${defaultmap:-"NOT SET"} @@ -222,4 +227,6 @@ elif [ "${engine}" == "unreal" ]||[ "${engine}" == "unreal2" ]; then # Unreal 3 engine elif [ "${engine}" == "unreal3" ]; then fn_info_parms_unreal3 +elif [ "${shortname}" == "unt" ]; then + fn_info_parms_unturned fi diff --git a/lgsm/functions/install_config.sh b/lgsm/functions/install_config.sh index aa9550889..dce59b8fb 100644 --- a/lgsm/functions/install_config.sh +++ b/lgsm/functions/install_config.sh @@ -607,6 +607,12 @@ elif [ "${gamename}" == "Unreal Tournament 99" ]; then fn_fetch_default_config fn_default_config_remote fn_set_config_vars +elif [ "${shortname}" == "unt" ]; then + gamedirname="Unturned" + array_configs+=( Config.json ) + fn_fetch_default_config + fn_default_config_remote + fn_set_config_vars elif [ "${gamename}" == "Vampire Slayer" ]; then gamedirname="VampireSlayer" array_configs+=( server.cfg ) diff --git a/lgsm/functions/install_server_files.sh b/lgsm/functions/install_server_files.sh index 871cd403e..1ac39200d 100644 --- a/lgsm/functions/install_server_files.sh +++ b/lgsm/functions/install_server_files.sh @@ -92,6 +92,9 @@ fn_install_server_files_steamcmd(){ if [ "${appid}" == "90" ]; then ${unbuffer} ./steamcmd.sh +login "${steamuser}" "${steampass}" +force_install_dir "${serverfiles}" +app_set_config 90 mod "${appidmod}" +app_update "${appid}" ${branch} +quit local exitcode=$? + elif [ "${shortname}" == "unt" ]; then + ${unbuffer} ./steamcmd.sh +@sSteamCmdForcePlatformBitness 32 +login "${steamuser}" "${steampass}" +force_install_dir "${serverfiles}" +app_update "${appid}" ${branch} validate +quit + local exitcode=$? else ${unbuffer} ./steamcmd.sh +login "${steamuser}" "${steampass}" +force_install_dir "${serverfiles}" +app_update "${appid}" ${branch} +quit local exitcode=$? diff --git a/lgsm/functions/update_steamcmd.sh b/lgsm/functions/update_steamcmd.sh index 0a38699e5..9fd29eff7 100644 --- a/lgsm/functions/update_steamcmd.sh +++ b/lgsm/functions/update_steamcmd.sh @@ -20,6 +20,8 @@ fn_update_steamcmd_dl(){ cd "${steamcmddir}" || exit if [ "${appid}" == "90" ]; then ${unbuffer} ./steamcmd.sh +login "${steamuser}" "${steampass}" +force_install_dir "${serverfiles}" +app_set_config 90 mod "${appidmod}" +app_update "${appid}" ${branch} +quit | tee -a "${lgsmlog}" + elif [ "${shortname}" == "unt" ]; then + ${unbuffer} ./steamcmd.sh +@sSteamCmdForcePlatformBitness 32 +login "${steamuser}" "${steampass}" +force_install_dir "${filesdir}" +app_update "${appid}" ${branch} validate +quit else ${unbuffer} ./steamcmd.sh +login "${steamuser}" "${steampass}" +force_install_dir "${serverfiles}" +app_update "${appid}" ${branch} +quit | tee -a "${lgsmlog}" fi @@ -73,7 +75,7 @@ fn_update_steamcmd_remotebuild(){ fn_script_log_fatal "Unable to get remote build" core_exit.sh fi - fi + fi } fn_update_steamcmd_compare(){ @@ -134,7 +136,7 @@ fn_update_steamcmd_compare(){ if [ -v "${branch}" ]; then echo -e "* Branch: ${branch}" fi - echo -e "https://steamdb.info/app/${appid}/" + echo -e "https://steamdb.info/app/${appid}/" fn_script_log_info "No update available" fn_script_log_info "Local build: ${localbuild}" fn_script_log_info "Remote build: ${remotebuild}" From c9b40e41d471f53212df1f8eb5b8ede73156700c Mon Sep 17 00:00:00 2001 From: Attila <1230402+borzaka@users.noreply.github.com> Date: Fri, 3 May 2019 22:25:42 +0200 Subject: [PATCH 069/534] feat(docs) Add more use case for Comment update in PULL_REQUEST_TEMPLATE (#2324) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Borzák Attila <1230402+borzaka@users.noreply.github.com> --- PULL_REQUEST_TEMPLATE.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/PULL_REQUEST_TEMPLATE.md b/PULL_REQUEST_TEMPLATE.md index f139c2cc0..749aadeed 100644 --- a/PULL_REQUEST_TEMPLATE.md +++ b/PULL_REQUEST_TEMPLATE.md @@ -10,7 +10,7 @@ Fixes #[issue] * [ ] New feature (change which adds functionality). * [ ] New Server (new server added). * [ ] Refactor (restructures existing code). -* [ ] Comment update (typo, spelling, etc). +* [ ] Comment update (typo, spelling, explanation, examples, etc). * [ ] This change requires a documentation update. ## Checklist From 1d0c7f5702fa252faf9b4271e75dc9c9310ab75d Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Fri, 3 May 2019 22:03:38 +0100 Subject: [PATCH 070/534] release 190503 --- linuxgsm.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/linuxgsm.sh b/linuxgsm.sh index 6f29d4377..e5c22af3b 100755 --- a/linuxgsm.sh +++ b/linuxgsm.sh @@ -20,7 +20,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="190422" +version="190503" shortname="core" gameservername="core" rootdir="$(dirname "$(readlink -f "${BASH_SOURCE[0]}")")" From c401b342ecc7fed463b345c794f30d51ac7834f8 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Fri, 3 May 2019 22:04:34 +0100 Subject: [PATCH 071/534] missing dot --- lgsm/functions/command_validate.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lgsm/functions/command_validate.sh b/lgsm/functions/command_validate.sh index 4b154a586..c324b93b8 100644 --- a/lgsm/functions/command_validate.sh +++ b/lgsm/functions/command_validate.sh @@ -28,7 +28,7 @@ fn_validation(){ if [ "${appid}" == "90" ]; then ${unbuffer} ./steamcmd.sh +login "${steamuser}" "${steampass}" +force_install_dir "${serverfiles}" +app_info_print 70 +app_set_config 90 mod "${appidmod}" +app_update "${appid}" ${branch} +app_update "${appid}" ${branch} validate +quit | tee -a "${lgsmlog}" elif [ "${gamename}" == "Unturned" ]; then - ${unbuffer} /steamcmd.sh +@sSteamCmdForcePlatformBitness 32 +login "${steamuser}" "${steampass}" +force_install_dir "${filesdir}" +app_update "${appid}" ${branch} validate +quit + ${unbuffer} ./steamcmd.sh +@sSteamCmdForcePlatformBitness 32 +login "${steamuser}" "${steampass}" +force_install_dir "${filesdir}" +app_update "${appid}" ${branch} validate +quit else ${unbuffer} ./steamcmd.sh +login "${steamuser}" "${steampass}" +force_install_dir "${serverfiles}" +app_update "${appid}" ${branch} validate +quit | tee -a "${lgsmlog}" fi From 954e4e9f1be0522ac3191045376e5aa77de53e0b Mon Sep 17 00:00:00 2001 From: Frisasky Date: Mon, 6 May 2019 00:55:54 +0800 Subject: [PATCH 072/534] fix(q3server): correct Quake 3 dedicated parameter Co-authored-by: Frisa --- lgsm/config-default/config-lgsm/q3server/_default.cfg | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lgsm/config-default/config-lgsm/q3server/_default.cfg b/lgsm/config-default/config-lgsm/q3server/_default.cfg index 80b1b464d..fdbd4acec 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://docs.linuxgsm.com/configuration/start-parameters#additional-parameters fn_parms(){ -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}" +parms="+set sv_punkbuster 0 +set fs_basepath ${serverfiles} +set dedicated 2 +set com_hunkMegs 32 +set net_ip ${ip} +set net_port ${port} +exec ${servercfg} +map ${defaultmap}" } #### LinuxGSM Settings #### From 147dd20bc264bf4c60806c2ef36d457f0fa55ba1 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Mon, 6 May 2019 21:05:33 +0100 Subject: [PATCH 073/534] fix(update): correct minecraft localbuild var --- lgsm/functions/update_minecraft.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lgsm/functions/update_minecraft.sh b/lgsm/functions/update_minecraft.sh index 7bdcf3e48..3cf19731a 100644 --- a/lgsm/functions/update_minecraft.sh +++ b/lgsm/functions/update_minecraft.sh @@ -81,7 +81,7 @@ fn_update_minecraft_localbuild(){ loopignore=1 fn_script_log_info "Waiting for local build to generate" fi - localbuild=$(cat "${serverfiles}/logs/latest.log" 2> /dev/null | grep version | grep -Eo '((\.)?[0-9]{1,3}){1,3}\.[0-9]{1,3}' | grep -Eo "TeamSpeak 3 Server ((\.)?[0-9]{1,3}){1,3}\.[0-9]{1,3}" | grep -Eo "((\.)?[0-9]{1,3}){1,3}\.[0-9]{1,3}") + localbuild=$(cat "${serverfiles}/logs/latest.log" 2> /dev/null | grep version | grep -Eo '((\.)?[0-9]{1,3}){1,3}\.[0-9]{1,3}') if [ "${localbuild}" ]||[ "${seconds}" == "120" ]; then break fi From a705a31a77e5d6166477c8c21ea359d8abd8b979 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Tue, 7 May 2019 09:34:10 +0100 Subject: [PATCH 074/534] feat(qwserver): update nquake download archive (#2340) --- 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 1ac39200d..adb56bf73 100644 --- a/lgsm/functions/install_server_files.sh +++ b/lgsm/functions/install_server_files.sh @@ -34,7 +34,7 @@ fn_install_server_files(){ elif [ "${shortname}" == "q3" ]; then remote_fileurl="https://files.linuxgsm.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 [ "${shortname}" == "qw" ]; then - remote_fileurl="https://files.linuxgsm.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" + remote_fileurl="https://files.linuxgsm.com/QuakeWorld/nquake.server.linux.190506.full.tar.bz2"; local_filedir="${tmpdir}"; local_filename="nquake.server.linux.190506.full.tar.bz2"; chmodx="nochmodx" run="norun"; force="noforce"; md5="74405ec030463c5e1175e776ab572d32" elif [ "${shortname}" == "rtcw" ]; then remote_fileurl="https://files.linuxgsm.com/ReturnToCastleWolfenstein/iortcw-1.51b-x86_64-server-linux-20190208.tar.bz2"; local_filedir="${tmpdir}"; local_filename="iortcw-1.51b-x86_64-server-linux-20190208.tar.bz2"; chmodx="nochmodx" run="norun"; force="noforce"; md5="7e555481a3b98e168dfb5e6ddc2fb879" elif [ "${shortname}" == "ut2k4" ]; then From 09fe43935cc74c9c14ef887bb01cf6c965041a8b Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Tue, 7 May 2019 13:22:46 +0100 Subject: [PATCH 075/534] feat(config): standardise 32/64 bit binary selection (#2339) --- lgsm/config-default/config-lgsm/hwserver/_default.cfg | 9 +-------- lgsm/config-default/config-lgsm/qlserver/_default.cfg | 7 ++----- lgsm/config-default/config-lgsm/sdtdserver/_default.cfg | 6 +----- 3 files changed, 4 insertions(+), 18 deletions(-) diff --git a/lgsm/config-default/config-lgsm/hwserver/_default.cfg b/lgsm/config-default/config-lgsm/hwserver/_default.cfg index 19fadc681..0be9eba7c 100644 --- a/lgsm/config-default/config-lgsm/hwserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/hwserver/_default.cfg @@ -25,8 +25,6 @@ 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://docs.linuxgsm.com/configuration/start-parameters#additional-parameters # Edit with care | http://hurtworld.wikia.com/wiki/Hosting_A_Server @@ -119,11 +117,7 @@ engine="unity3d" ## Server Specific Directories systemdir="${serverfiles}" executabledir="${serverfiles}" -if [ "${x64mode}" == "1" ]; then - executable="./Hurtworld.x86_64" -else - executable="./Hurtworld.x86" -fi +executable=$([ "$(uname -m)" == "x86_64" ] && echo "./Hurtworld.x86_64" || echo "./Hurtworld.x86") ## Backup Directory backupdir="${rootdir}/backups" @@ -143,4 +137,3 @@ postdetailslog="${lgsmlogdir}/${servicename}-postdetails.log" 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" - diff --git a/lgsm/config-default/config-lgsm/qlserver/_default.cfg b/lgsm/config-default/config-lgsm/qlserver/_default.cfg index 0c8ffa81b..d77f20c5a 100644 --- a/lgsm/config-default/config-lgsm/qlserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/qlserver/_default.cfg @@ -8,12 +8,9 @@ #### Server Settings #### -## Server Start Settings | https://docs.linuxgsm.com/configuration/start-parameters -arch="x64" # x64 or x86 - ## Server Start Command | https://docs.linuxgsm.com/configuration/start-parameters#additional-parameters # Edit with care | Install/Config Guide : https://steamcommunity.com/sharedfiles/filedetails/?id=542966946 -# Console Commands : http://www.regurge.at/ql/ +# Console Commands : http://www.regurge.at/ql fn_parms(){ parms="+exec ${servercfg}" } @@ -103,7 +100,7 @@ engine="idtech3_ql" ## Server Specific Directories systemdir="${serverfiles}" executabledir="${serverfiles}" -executable=$([ "${arch}" == 'x64' ] && echo "./run_server_x64.sh" || echo "./run_server_x86.sh") +executable=$([ "$(uname -m)" == "x86_64" ] && echo "./run_server_x64.sh" || echo "./run_server_x86.sh") servercfg="${servicename}.cfg" servercfgdefault="server.cfg" servercfgdir="${serverfiles}/baseq3" diff --git a/lgsm/config-default/config-lgsm/sdtdserver/_default.cfg b/lgsm/config-default/config-lgsm/sdtdserver/_default.cfg index 6a9b6ab79..59a6d9eb7 100644 --- a/lgsm/config-default/config-lgsm/sdtdserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/sdtdserver/_default.cfg @@ -101,11 +101,7 @@ engine="unity3d" ## Server Specific Directories systemdir="${serverfiles}" executabledir="${serverfiles}" -if [ "$(uname -m)" == "x86_64" ]; then - executable="./7DaysToDieServer.x86_64" -else - executable="./7DaysToDieServer.x86" -fi +executable=$([ "$(uname -m)" == "x86_64" ] && echo "./7DaysToDieServer.x86_64" || echo "./7DaysToDieServer.x86") servercfgdefault="serverconfig.xml" servercfgdirdefault="${serverfiles}" servercfgfullpathdefault="${servercfgdirdefault}/${servercfgdefault}" From 378d8f0fa3a1be2e4f6596959022aef1dfec1e3d Mon Sep 17 00:00:00 2001 From: Frisasky Date: Wed, 8 May 2019 03:24:25 +0800 Subject: [PATCH 076/534] feat(install): update Return to Castle Wolfenstein package (#2344) Co-authored-by: Frisa --- 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 adb56bf73..67b4af9fe 100644 --- a/lgsm/functions/install_server_files.sh +++ b/lgsm/functions/install_server_files.sh @@ -36,7 +36,7 @@ fn_install_server_files(){ elif [ "${shortname}" == "qw" ]; then remote_fileurl="https://files.linuxgsm.com/QuakeWorld/nquake.server.linux.190506.full.tar.bz2"; local_filedir="${tmpdir}"; local_filename="nquake.server.linux.190506.full.tar.bz2"; chmodx="nochmodx" run="norun"; force="noforce"; md5="74405ec030463c5e1175e776ab572d32" elif [ "${shortname}" == "rtcw" ]; then - remote_fileurl="https://files.linuxgsm.com/ReturnToCastleWolfenstein/iortcw-1.51b-x86_64-server-linux-20190208.tar.bz2"; local_filedir="${tmpdir}"; local_filename="iortcw-1.51b-x86_64-server-linux-20190208.tar.bz2"; chmodx="nochmodx" run="norun"; force="noforce"; md5="7e555481a3b98e168dfb5e6ddc2fb879" + remote_fileurl="https://files.linuxgsm.com/ReturnToCastleWolfenstein/iortcw-1.51c-x86_64-server-linux-20190507.tar.bz2"; local_filedir="${tmpdir}"; local_filename="iortcw-1.51c-x86_64-server-linux-20190507.tar.bz2"; chmodx="nochmodx" run="norun"; force="noforce"; md5="6a3be9700372b228d1187422464e4212" elif [ "${shortname}" == "ut2k4" ]; then remote_fileurl="https://files.linuxgsm.com/UnrealTournament2004/ut2004-server-3369-2-ultimate-linux.tar.bz2"; local_filedir="${tmpdir}"; local_filename="ut2004-server-3369-2-ultimate-linux.tar.bz2"; chmodx="nochmodx" run="norun"; force="noforce"; md5="67c5e2cd9c2a4b04f163962ee41eff54" elif [ "${shortname}" == "ut99" ]; then From ab48c0b7f05c732b1486a85ff865ed5df7e1282c Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Tue, 7 May 2019 20:25:17 +0100 Subject: [PATCH 077/534] feat(query-raw): add TCP/UDP query to game port (#2341) --- lgsm/functions/command_dev_query_raw.sh | 50 +++++++++++++++++++------ 1 file changed, 39 insertions(+), 11 deletions(-) diff --git a/lgsm/functions/command_dev_query_raw.sh b/lgsm/functions/command_dev_query_raw.sh index 4d57e8aca..79072468f 100644 --- a/lgsm/functions/command_dev_query_raw.sh +++ b/lgsm/functions/command_dev_query_raw.sh @@ -7,8 +7,10 @@ local commandname="QUERY-RAW" local commandaction="Query Raw" local function_selfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" - -echo "=================================" +echo "" +echo "Query Port" +echo "==================================================================" +echo "" echo "Gamedig Raw Output" echo "=================================" echo"" @@ -33,7 +35,6 @@ echo "${gamedigcmd}" echo"" echo "${gamedigraw}" | jq echo"" -echo "=================================" echo "gsquery Raw Output" echo "=================================" echo"" @@ -44,29 +45,56 @@ fi "${functionsdir}"/query_gsquery.py -a "${ip}" -p "${queryport}" -e "${engine}" echo"" -echo "=================================" -echo "tcp Raw Output" +echo "TCP Raw Output" echo "=================================" echo"" echo "bash -c 'exec 3<> /dev/tcp/'${ip}'/'${queryport}''" bash -c 'exec 3<> /dev/tcp/'${ip}'/'${queryport}'' querystatus="$?" if [ "${querystatus}" == "0" ]; then - echo "tcp query PASS" + echo "TCP query PASS" else - echo "tcp query FAIL" + echo "TCP query FAIL" fi echo"" -echo "=================================" -echo "udp Raw Output" +echo "UDP Raw Output" echo "=================================" echo"" echo "bash -c 'exec 3<> /dev/udp/'${ip}'/'${queryport}''" bash -c 'exec 3<> /dev/udp/'${ip}'/'${queryport}'' querystatus="$?" if [ "${querystatus}" == "0" ]; then - echo "udp query PASS" + echo "UPD query PASS" +else + echo "UPD query FAIL" +fi +echo "" +echo "Game Port" +echo "==================================================================" +echo "" +echo"" +echo "TCP Raw Output" +echo "=================================" +echo"" +echo "bash -c 'exec 3<> /dev/tcp/'${ip}'/'${port}''" +bash -c 'exec 3<> /dev/tcp/'${ip}'/'${port}'' +querystatus="$?" +if [ "${querystatus}" == "0" ]; then + echo "TCP query PASS" +else + echo "TCP query FAIL" +fi + +echo"" +echo "UDP Raw Output" +echo "=================================" +echo"" +echo "bash -c 'exec 3<> /dev/udp/'${ip}'/'${port}''" +bash -c 'exec 3<> /dev/udp/'${ip}'/'${port}'' +querystatus="$?" +if [ "${querystatus}" == "0" ]; then + echo "UDP query PASS" else - echo "udp query FAIL" + echo "UDP query FAIL" fi From 66e0bd9fea82499ccc92b49e2970a530fe422fa2 Mon Sep 17 00:00:00 2001 From: Christian Date: Tue, 7 May 2019 21:55:39 +0200 Subject: [PATCH 078/534] feat(newserver): Mordhau (#2333) Co-authored-by: Christian Birk --- .../config-lgsm/mhserver/_default.cfg | 129 ++++++++++++++++++ lgsm/data/serverlist.csv | 1 + lgsm/functions/info_config.sh | 22 +++ lgsm/functions/info_glibc.sh | 3 + lgsm/functions/info_messages.sh | 16 +++ lgsm/functions/info_parms.sh | 7 + lgsm/functions/install_config.sh | 7 + 7 files changed, 185 insertions(+) create mode 100644 lgsm/config-default/config-lgsm/mhserver/_default.cfg diff --git a/lgsm/config-default/config-lgsm/mhserver/_default.cfg b/lgsm/config-default/config-lgsm/mhserver/_default.cfg new file mode 100644 index 000000000..75d80ddf1 --- /dev/null +++ b/lgsm/config-default/config-lgsm/mhserver/_default.cfg @@ -0,0 +1,129 @@ +################################## +######## 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://docs.linuxgsm.com/configuration/start-parameters +ip="0.0.0.0" +port="7777" +queryport="27015" +# Maps: FFA_Camp, FFA_Contraband, FFA_Grad, FFA_MountainPeak, FFA_Taiga, FFA_ThePit, FFA_Tourney, SKM_Camp, SKM_Contraband, SKM_Grad, SKM_MountainPeak, SKM_Taiga, SKM_ThePit, SKM_Tourney, TDM_Camp, TDM_Contraband, TDM_Grad, TDM_MountainPeak, TDM_Taiga, TDM_ThePit, TDM_Tourney +defaultmap="FFA_ThePit" + +## Server Start Command | https://docs.linuxgsm.com/configuration/start-parameters#additional-parameters +fn_parms(){ +parms="Mordhau ${defaultmap} -log -MultiHome=${ip} -MaxPlayers=${maxplayers} -Port=${port} -QueryPort=${queryport}" +} + +#### LinuxGSM Settings #### + +## Notification Alerts +# (on|off) + +# More info | https://docs.linuxgsm.com/alerts#more-info +postalert="off" +postdays="7" +posttarget="https://hastebin.com" + +# Discord Alerts | https://docs.linuxgsm.com/alerts/discord +discordalert="off" +discordwebhook="webhook" + +# Email Alerts | https://docs.linuxgsm.com/alerts/email +emailalert="off" +email="email@example.com" +emailfrom="" + +# IFTTT Alerts | https://docs.linuxgsm.com/alerts/ifttt +iftttalert="off" +ifttttoken="accesstoken" +iftttevent="linuxgsm_alert" + +# Mailgun Email Alerts | https://docs.linuxgsm.com/alerts/mailgun +mailgunalert="off" +mailguntoken="accesstoken" +mailgundomain="example.com" +mailgunemailfrom="alert@example.com" +mailgunemail="email@myemail.com" + +# Pushbullet Alerts | https://docs.linuxgsm.com/alerts/pushbullet +pushbulletalert="off" +pushbullettoken="accesstoken" +channeltag="" + +# Pushover Alerts | https://docs.linuxgsm.com/alerts/pushover +pushoveralert="off" +pushovertoken="accesstoken" + +# Telegram Alerts | https://docs.linuxgsm.com/alerts/telegram +# You can add a custom cURL string eg proxy (useful in Russia) or else in "curlcustomstring". +# like a "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help", if you not need +# any custom string in curl - simple ignore this parameter. +telegramalert="off" +telegramtoken="accesstoken" +telegramchatid="" +curlcustomstring="" + +## Updating | https://docs.linuxgsm.com/commands/update +updateonstart="off" + +## Backup | https://docs.linuxgsm.com/commands/backup +maxbackups="4" +maxbackupdays="30" +stoponbackup="on" + +## Logging | https://docs.linuxgsm.com/features/logging +consolelogging="on" +logdays="7" + +#### LinuxGSM Advanced Settings #### + +# ANSI Colors +ansi="on" + +## SteamCMD Settings +# Server appid +appid="629800" +# 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="MORDHAU" +engine="unreal4" + +#### Directories #### +# Edit with care + +## Server Specific Directories +systemdir="${serverfiles}/Mordhau" +executabledir="${systemdir}/Binaries/Linux" +executable="./MordhauServer-Linux-Shipping" +servercfgdir="${systemdir}/Saved/Config/LinuxServer" +servercfg="Game.ini" +servercfgdefault="Game.ini" +servercfgfullpath="${servercfgdir}/${servercfg}" + +## Backup Directory +backupdir="${lgsmdir}/backup" + +## 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" +alertlog="${lgsmlogdir}/${servicename}-alert.log" +postdetailslog="${lgsmlogdir}/${servicename}-postdetails.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/data/serverlist.csv b/lgsm/data/serverlist.csv index 960947995..e32dd4e90 100644 --- a/lgsm/data/serverlist.csv +++ b/lgsm/data/serverlist.csv @@ -46,6 +46,7 @@ kf2,kf2server,Killing Floor 2 l4d,l4dserver,Left 4 Dead l4d2,l4d2server,Left 4 Dead 2 mc,mcserver,Minecraft +mh,mhserver,Mordhau mta,mtaserver,Multi Theft Auto mumble,mumbleserver,Mumble nd,ndserver,Nuclear Dawn diff --git a/lgsm/functions/info_config.sh b/lgsm/functions/info_config.sh index 53b7637c6..410531b05 100644 --- a/lgsm/functions/info_config.sh +++ b/lgsm/functions/info_config.sh @@ -1146,6 +1146,26 @@ fn_info_config_stationeers(){ fi } +fn_info_config_mordhau() { + if [ ! -f "${servercfgfullpath}" ]; then + servername="${unavailable}" + serverpassword="${unavailable}" + rconpassword="${unavailable}" + maxplayers="${unavailable}" + else + servername=$(grep "ServerName" "${servercfgfullpath}" | awk -F '=' '{print $2}') + serverpassword=$(grep "ServerPassword" "${servercfgfullpath}" | awk -F '=' '{print $2}') + rconpassword=$(grep "AdminPassword" "${servercfgfullpath}" | awk -F '=' '{print $2}') + maxplayers=$(grep "MaxSlots" "${servercfgfullpath}" | awk -F '=' '{print $2}') + + # Not set + servername=${servername:-"NOT SET"} + serverpassword=${serverpassword:-"NOT SET"} + rconpassword=${rconpassword:-"NOT SET"} + maxplayers=${maxplayers:-"0"} + fi +} + # ARK: Survival Evolved if [ "${shortname}" == "ark" ]; then fn_info_config_ark @@ -1276,4 +1296,6 @@ elif [ "${shortname}" == "squad" ]; then # Stationeers elif [ "${shortname}" == "st" ]; then fn_info_config_stationeers +elif [ "${shortname}" == "mh" ]; then + fn_info_config_mordhau fi diff --git a/lgsm/functions/info_glibc.sh b/lgsm/functions/info_glibc.sh index 63760c714..26e5ec911 100644 --- a/lgsm/functions/info_glibc.sh +++ b/lgsm/functions/info_glibc.sh @@ -147,6 +147,9 @@ elif [ "${gamename}" == "NS2: Combat" ]; then elif [ "${gamename}" == "TeamSpeak 3" ]; then glibcrequired="NOT REQUIRED" glibcfix="no" +elif [ "${gamename}" == "Mordhau" ]; then + glibcrequired="2.17" + glibcfix="no" elif [ "${gamename}" == "Mumble" ]; then glibcrequired="NOT REQUIRED" glibcfix="no" diff --git a/lgsm/functions/info_messages.sh b/lgsm/functions/info_messages.sh index 701c6940e..f0c85cd95 100644 --- a/lgsm/functions/info_messages.sh +++ b/lgsm/functions/info_messages.sh @@ -1179,6 +1179,20 @@ fn_info_message_mta(){ } | column -s $'\t' -t } +fn_info_message_mordhau(){ + echo -e "netstat -atunp | grep Mord" + 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_info_message_select_engine(){ # Display details depending on game or engine. if [ "${gamename}" == "7 Days To Die" ]; then @@ -1241,6 +1255,8 @@ fn_info_message_select_engine(){ fn_info_message_towerunite elif [ "${shortname}" == "unt" ]; then fn_info_message_unturned + elif [ "${shortname}" == "mh" ]; then + fn_info_message_mordhau elif [ "${gamename}" == "Multi Theft Auto" ]; then fn_info_message_mta elif [ "${gamename}" == "Mumble" ]; then diff --git a/lgsm/functions/info_parms.sh b/lgsm/functions/info_parms.sh index dd289543e..5e9cb1327 100644 --- a/lgsm/functions/info_parms.sh +++ b/lgsm/functions/info_parms.sh @@ -146,6 +146,11 @@ fn_info_config_towerunite(){ queryport=${queryport:-"0"} } +fn_info_config_mordhau(){ + port=${port:-"0"} + queryport=${queryport:-"0"} +} + fn_info_parms_unreal(){ defaultmap=${defaultmap:-"NOT SET"} queryport=$((port + 1)) @@ -221,6 +226,8 @@ elif [ "${engine}" == "spark" ]; then fn_info_parms_spark elif [ "${shortname}" == "tu" ]; then fn_info_config_towerunite +elif [ "${shortname}" == "mh" ]; then + fn_info_config_mordhau # Unreal/Unreal 2 engine elif [ "${engine}" == "unreal" ]||[ "${engine}" == "unreal2" ]; then fn_info_parms_unreal diff --git a/lgsm/functions/install_config.sh b/lgsm/functions/install_config.sh index dce59b8fb..61a7ec8c6 100644 --- a/lgsm/functions/install_config.sh +++ b/lgsm/functions/install_config.sh @@ -427,6 +427,13 @@ elif [ "${gamename}" == "Minecraft" ]; then fn_fetch_default_config fn_default_config_remote fn_set_config_vars +elif [ "${gamename}" == "Mordhau" ]; then + gamedirname="Mordhau" + fn_check_cfgdir + array_configs+=( Game.ini ) + fn_fetch_default_config + fn_default_config_remote + fn_set_config_vars elif [ "${gamename}" == "Natural Selection" ]; then gamedirname="NaturalSelection" array_configs+=( server.cfg ) From cc906640d109a7fdb3130369a701b368cf3e9059 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Tue, 7 May 2019 21:37:45 +0100 Subject: [PATCH 079/534] mhserver: correct server name (#2346) --- .../config-lgsm/mhserver/_default.cfg | 2 +- .../config-lgsm/mordhauserver/_default.cfg | 133 ++++++++++++++++++ lgsm/data/serverlist.csv | 2 +- lgsm/functions/check_system_requirements.sh | 3 + lgsm/functions/info_config.sh | 10 ++ lgsm/functions/info_glibc.sh | 5 +- lgsm/functions/info_messages.sh | 15 ++ lgsm/functions/info_parms.sh | 7 + lgsm/functions/install_config.sh | 9 +- 9 files changed, 182 insertions(+), 4 deletions(-) create mode 100644 lgsm/config-default/config-lgsm/mordhauserver/_default.cfg diff --git a/lgsm/config-default/config-lgsm/mhserver/_default.cfg b/lgsm/config-default/config-lgsm/mhserver/_default.cfg index 75d80ddf1..45c81adf5 100644 --- a/lgsm/config-default/config-lgsm/mhserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/mhserver/_default.cfg @@ -96,7 +96,7 @@ branch="" ## LinuxGSM Server Details # Do not edit -gamename="MORDHAU" +gamename="Mordhau" engine="unreal4" #### Directories #### diff --git a/lgsm/config-default/config-lgsm/mordhauserver/_default.cfg b/lgsm/config-default/config-lgsm/mordhauserver/_default.cfg new file mode 100644 index 000000000..b13b87cbf --- /dev/null +++ b/lgsm/config-default/config-lgsm/mordhauserver/_default.cfg @@ -0,0 +1,133 @@ +################################## +######## 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" +#rconport="27020" | add to fn_params() RCONPort=${rconport}? +maxplayers="16" + +## Server Start Command | https://github.com/GameServerManagers/LinuxGSM/wiki/Start-Parameters#additional-parameters +fn_parms(){ +parms="\"FFA_Camp?listen?MultiHome=${ip}?MaxPlayers=${maxplayers}?QueryPort=${queryport}?Port=${port}?\"" +} + +#### LinuxGSM Settings #### + +## Notification Alerts +# (on|off) + +# More info | https://github.com/GameServerManagers/LinuxGSM/wiki/Alerts#more-info +postalert="off" +postdays="7" +posttarget="https://hastebin.com" + +# Discord Alerts | https://github.com/GameServerManagers/LinuxGSM/wiki/Discord +discordalert="off" +discordwebhook="webhook" + +# Email Alerts | https://github.com/GameServerManagers/LinuxGSM/wiki/Email +emailalert="off" +email="email@example.com" +emailfrom="" + +# IFTTT Alerts | https://github.com/GameServerManagers/LinuxGSM/wiki/IFTTT +iftttalert="off" +ifttttoken="accesstoken" +iftttevent="linuxgsm_alert" + +# Mailgun Email Alerts | https://github.com/GameServerManagers/LinuxGSM/wiki/mailgun +mailgunalert="off" +mailguntoken="accesstoken" +mailgundomain="example.com" +mailgunemailfrom="alert@example.com" +mailgunemail="email@myemail.com" + +# Pushbullet Alerts | https://github.com/GameServerManagers/LinuxGSM/wiki/Pushbullet +pushbulletalert="off" +pushbullettoken="accesstoken" +channeltag="" + +# Pushover Alerts | https://github.com/GameServerManagers/LinuxGSM/wiki/Pushover +pushoveralert="off" +pushovertoken="accesstoken" + +# Telegram Alerts | https://github.com/GameServerManagers/LinuxGSM/wiki/Telegram +# You can add a custom cURL string eg proxy (useful in Russia) or else in "curlcustomstring". +# like a "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help", if you not need +# any custom string in curl - simple ignore this parameter. +telegramalert="off" +telegramtoken="accesstoken" +telegramchatid="" +curlcustomstring="" + +## 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="629800" +# 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="Mordhau" +engine="unreal4" + +#### Directories #### +# Edit with care + +## Server Specific Directories +systemdir="${serverfiles}/mordhau" +executabledir="${systemdir}/Binaries/Linux" +executable="./MordhauServer-Linux-Shipping" +servercfgdir="${systemdir}/Config" +servercfg="DefaultGame.ini" +servercfgdefault="DefaultGame.ini" +servercfgfullpath="${servercfgdir}/${servercfg}" + +## Backup Directory +backupdir="${lgsmdir}/backup" + +## 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" +alertlog="${lgsmlogdir}/${servicename}-alert.log" +postdetailslog="${lgsmlogdir}/${servicename}-postdetails.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" + +## Github Branch Select +# Allows for the use of different function files +# from a different repo and/or branch. +githubuser="Viretick" +githubrepo="LinuxGSM" +githubbranch="custom-servers" diff --git a/lgsm/data/serverlist.csv b/lgsm/data/serverlist.csv index e32dd4e90..4eefca614 100644 --- a/lgsm/data/serverlist.csv +++ b/lgsm/data/serverlist.csv @@ -46,7 +46,7 @@ kf2,kf2server,Killing Floor 2 l4d,l4dserver,Left 4 Dead l4d2,l4d2server,Left 4 Dead 2 mc,mcserver,Minecraft -mh,mhserver,Mordhau +mh,mhserver,MORDHAU mta,mtaserver,Multi Theft Auto mumble,mumbleserver,Mumble nd,ndserver,Nuclear Dawn diff --git a/lgsm/functions/check_system_requirements.sh b/lgsm/functions/check_system_requirements.sh index ce961548d..96a73f8e6 100644 --- a/lgsm/functions/check_system_requirements.sh +++ b/lgsm/functions/check_system_requirements.sh @@ -15,6 +15,9 @@ info_distro.sh if [ "${shortname}" == "ark" ]; then ramrequirementmb="4000" ramrequirementgb="4" +elif [ "${shortname}" == "mh" ]; then + ramrequirementmb="4000" + ramrequirementgb="4" elif [ "${shortname}" == "arma3" ]; then ramrequirementmb="1000" ramrequirementgb="1" diff --git a/lgsm/functions/info_config.sh b/lgsm/functions/info_config.sh index 410531b05..274c7b3a3 100644 --- a/lgsm/functions/info_config.sh +++ b/lgsm/functions/info_config.sh @@ -87,6 +87,16 @@ fn_info_config_ark(){ fi } +fn_info_config_mordhau(){ + if [ ! -f "${servercfgfullpath}" ]; then + servername="${unavailable}" + else + 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 +} + fn_info_config_ballistic_overkill(){ if [ ! -f "${servercfgfullpath}" ]; then servername="${unavailable}" diff --git a/lgsm/functions/info_glibc.sh b/lgsm/functions/info_glibc.sh index 26e5ec911..2f283b778 100644 --- a/lgsm/functions/info_glibc.sh +++ b/lgsm/functions/info_glibc.sh @@ -9,6 +9,9 @@ local function_selfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" if [ "${gamename}" == "ARK: Survival Evolved" ]; then glibcrequired="2.15" glibcfix="no" +elif [ "${gamename}" == "Mordhau" ]; then + glibcrequired="2.15" + glibcfix="no" elif [ "${gamename}" == "Ballistic Overkill" ]; then glibcrequired="2.15" glibcfix="yes" @@ -147,7 +150,7 @@ elif [ "${gamename}" == "NS2: Combat" ]; then elif [ "${gamename}" == "TeamSpeak 3" ]; then glibcrequired="NOT REQUIRED" glibcfix="no" -elif [ "${gamename}" == "Mordhau" ]; then +elif [ "${gamename}" == "MORDHAU" ]; then glibcrequired="2.17" glibcfix="no" elif [ "${gamename}" == "Mumble" ]; then diff --git a/lgsm/functions/info_messages.sh b/lgsm/functions/info_messages.sh index f0c85cd95..0e86ebeff 100644 --- a/lgsm/functions/info_messages.sh +++ b/lgsm/functions/info_messages.sh @@ -578,6 +578,21 @@ fn_info_message_ark(){ } | column -s $'\t' -t } +fn_info_message_mordhau(){ + echo -e "netstat -atunp | grep Mordhau" + 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_info_message_ballisticoverkill(){ echo -e "netstat -atunp | grep BODS.x86" echo -e "" diff --git a/lgsm/functions/info_parms.sh b/lgsm/functions/info_parms.sh index 5e9cb1327..1443a55ca 100644 --- a/lgsm/functions/info_parms.sh +++ b/lgsm/functions/info_parms.sh @@ -22,6 +22,13 @@ fn_info_parms_ark(){ maxplayers=${maxplayers:-"0"} } +fn_info_parms_mordhau(){ + port=${port:-"0"} + queryport=${queryport:-"0"} + #rconport=${rconport:-"0"} + maxplayers=${maxplayers:-"0"} +} + fn_info_parms_realvirtuality(){ port=${port:-"0"} queryport=$((port + 1)) diff --git a/lgsm/functions/install_config.sh b/lgsm/functions/install_config.sh index 61a7ec8c6..c4e613dcf 100644 --- a/lgsm/functions/install_config.sh +++ b/lgsm/functions/install_config.sh @@ -154,6 +154,13 @@ elif [ "${gamename}" == "ARK: Survival Evolved" ]; then fn_fetch_default_config fn_default_config_remote fn_set_config_vars +elif [ "${gamename}" == "Mordhau" ]; then + gamedirname="mordhau" + fn_check_cfgdir + array_configs+=( DefaultEngine.ini ) + fn_fetch_default_config + fn_default_config_remote + fn_set_config_vars elif [ "${gamename}" == "ARMA 3" ]; then gamedirname="Arma3" fn_check_cfgdir @@ -427,7 +434,7 @@ elif [ "${gamename}" == "Minecraft" ]; then fn_fetch_default_config fn_default_config_remote fn_set_config_vars -elif [ "${gamename}" == "Mordhau" ]; then +elif [ "${gamename}" == "MORDHAU" ]; then gamedirname="Mordhau" fn_check_cfgdir array_configs+=( Game.ini ) From 1747e4ee940dcce47c19bf7b23b40bf569bfdca2 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Tue, 7 May 2019 22:21:44 +0100 Subject: [PATCH 080/534] mhserver: further fixes after accidental merge of wrong branch (#2347) --- .../config-lgsm/mhserver/_default.cfg | 2 +- .../config-lgsm/mordhauserver/_default.cfg | 133 ------------------ lgsm/functions/info_config.sh | 12 +- lgsm/functions/info_messages.sh | 21 +-- lgsm/functions/info_parms.sh | 17 +-- lgsm/functions/install_config.sh | 7 - 6 files changed, 8 insertions(+), 184 deletions(-) delete mode 100644 lgsm/config-default/config-lgsm/mordhauserver/_default.cfg diff --git a/lgsm/config-default/config-lgsm/mhserver/_default.cfg b/lgsm/config-default/config-lgsm/mhserver/_default.cfg index 45c81adf5..08a3d608c 100644 --- a/lgsm/config-default/config-lgsm/mhserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/mhserver/_default.cfg @@ -17,7 +17,7 @@ defaultmap="FFA_ThePit" ## Server Start Command | https://docs.linuxgsm.com/configuration/start-parameters#additional-parameters fn_parms(){ -parms="Mordhau ${defaultmap} -log -MultiHome=${ip} -MaxPlayers=${maxplayers} -Port=${port} -QueryPort=${queryport}" +parms="Mordhau ${defaultmap} -log -MultiHome=${ip} -Port=${port} -QueryPort=${queryport}" } #### LinuxGSM Settings #### diff --git a/lgsm/config-default/config-lgsm/mordhauserver/_default.cfg b/lgsm/config-default/config-lgsm/mordhauserver/_default.cfg deleted file mode 100644 index b13b87cbf..000000000 --- a/lgsm/config-default/config-lgsm/mordhauserver/_default.cfg +++ /dev/null @@ -1,133 +0,0 @@ -################################## -######## 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" -#rconport="27020" | add to fn_params() RCONPort=${rconport}? -maxplayers="16" - -## Server Start Command | https://github.com/GameServerManagers/LinuxGSM/wiki/Start-Parameters#additional-parameters -fn_parms(){ -parms="\"FFA_Camp?listen?MultiHome=${ip}?MaxPlayers=${maxplayers}?QueryPort=${queryport}?Port=${port}?\"" -} - -#### LinuxGSM Settings #### - -## Notification Alerts -# (on|off) - -# More info | https://github.com/GameServerManagers/LinuxGSM/wiki/Alerts#more-info -postalert="off" -postdays="7" -posttarget="https://hastebin.com" - -# Discord Alerts | https://github.com/GameServerManagers/LinuxGSM/wiki/Discord -discordalert="off" -discordwebhook="webhook" - -# Email Alerts | https://github.com/GameServerManagers/LinuxGSM/wiki/Email -emailalert="off" -email="email@example.com" -emailfrom="" - -# IFTTT Alerts | https://github.com/GameServerManagers/LinuxGSM/wiki/IFTTT -iftttalert="off" -ifttttoken="accesstoken" -iftttevent="linuxgsm_alert" - -# Mailgun Email Alerts | https://github.com/GameServerManagers/LinuxGSM/wiki/mailgun -mailgunalert="off" -mailguntoken="accesstoken" -mailgundomain="example.com" -mailgunemailfrom="alert@example.com" -mailgunemail="email@myemail.com" - -# Pushbullet Alerts | https://github.com/GameServerManagers/LinuxGSM/wiki/Pushbullet -pushbulletalert="off" -pushbullettoken="accesstoken" -channeltag="" - -# Pushover Alerts | https://github.com/GameServerManagers/LinuxGSM/wiki/Pushover -pushoveralert="off" -pushovertoken="accesstoken" - -# Telegram Alerts | https://github.com/GameServerManagers/LinuxGSM/wiki/Telegram -# You can add a custom cURL string eg proxy (useful in Russia) or else in "curlcustomstring". -# like a "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help", if you not need -# any custom string in curl - simple ignore this parameter. -telegramalert="off" -telegramtoken="accesstoken" -telegramchatid="" -curlcustomstring="" - -## 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="629800" -# 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="Mordhau" -engine="unreal4" - -#### Directories #### -# Edit with care - -## Server Specific Directories -systemdir="${serverfiles}/mordhau" -executabledir="${systemdir}/Binaries/Linux" -executable="./MordhauServer-Linux-Shipping" -servercfgdir="${systemdir}/Config" -servercfg="DefaultGame.ini" -servercfgdefault="DefaultGame.ini" -servercfgfullpath="${servercfgdir}/${servercfg}" - -## Backup Directory -backupdir="${lgsmdir}/backup" - -## 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" -alertlog="${lgsmlogdir}/${servicename}-alert.log" -postdetailslog="${lgsmlogdir}/${servicename}-postdetails.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" - -## Github Branch Select -# Allows for the use of different function files -# from a different repo and/or branch. -githubuser="Viretick" -githubrepo="LinuxGSM" -githubbranch="custom-servers" diff --git a/lgsm/functions/info_config.sh b/lgsm/functions/info_config.sh index 274c7b3a3..131113bdf 100644 --- a/lgsm/functions/info_config.sh +++ b/lgsm/functions/info_config.sh @@ -87,16 +87,6 @@ fn_info_config_ark(){ fi } -fn_info_config_mordhau(){ - if [ ! -f "${servercfgfullpath}" ]; then - servername="${unavailable}" - else - 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 -} - fn_info_config_ballistic_overkill(){ if [ ! -f "${servercfgfullpath}" ]; then servername="${unavailable}" @@ -1156,7 +1146,7 @@ fn_info_config_stationeers(){ fi } -fn_info_config_mordhau() { +fn_info_config_mordhau(){ if [ ! -f "${servercfgfullpath}" ]; then servername="${unavailable}" serverpassword="${unavailable}" diff --git a/lgsm/functions/info_messages.sh b/lgsm/functions/info_messages.sh index 0e86ebeff..ac6bb2e6a 100644 --- a/lgsm/functions/info_messages.sh +++ b/lgsm/functions/info_messages.sh @@ -578,21 +578,6 @@ fn_info_message_ark(){ } | column -s $'\t' -t } -fn_info_message_mordhau(){ - echo -e "netstat -atunp | grep Mordhau" - 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_info_message_ballisticoverkill(){ echo -e "netstat -atunp | grep BODS.x86" echo -e "" @@ -1199,11 +1184,7 @@ fn_info_message_mordhau(){ 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 "> Game\tINBOUND\t${port}\tupd" echo -e "> Query\tINBOUND\t${queryport}\tudp" } | column -s $'\t' -t } diff --git a/lgsm/functions/info_parms.sh b/lgsm/functions/info_parms.sh index 1443a55ca..34ebc793d 100644 --- a/lgsm/functions/info_parms.sh +++ b/lgsm/functions/info_parms.sh @@ -22,13 +22,6 @@ fn_info_parms_ark(){ maxplayers=${maxplayers:-"0"} } -fn_info_parms_mordhau(){ - port=${port:-"0"} - queryport=${queryport:-"0"} - #rconport=${rconport:-"0"} - maxplayers=${maxplayers:-"0"} -} - fn_info_parms_realvirtuality(){ port=${port:-"0"} queryport=$((port + 1)) @@ -148,12 +141,12 @@ fn_info_parms_stickybots(){ maxplayers=${maxplayers:-"0"} } -fn_info_config_towerunite(){ +fn_info_parms_towerunite(){ port=${port:-"0"} queryport=${queryport:-"0"} } -fn_info_config_mordhau(){ +fn_info_parms_mordhau(){ port=${port:-"0"} queryport=${queryport:-"0"} } @@ -225,16 +218,16 @@ elif [ "${shortname}" == "sbots" ]; then fn_info_parms_stickybots # Serious Sam elif [ "${shortname}" == "ss3" ]; then - fn_info_config_seriousengine35 + fn_info_parms_seriousengine35 elif [ "${engine}" == "source" ]||[ "${engine}" == "goldsource" ]; then fn_info_parms_source # Spark elif [ "${engine}" == "spark" ]; then fn_info_parms_spark elif [ "${shortname}" == "tu" ]; then - fn_info_config_towerunite + fn_info_parms_towerunite elif [ "${shortname}" == "mh" ]; then - fn_info_config_mordhau + fn_info_parms_mordhau # Unreal/Unreal 2 engine elif [ "${engine}" == "unreal" ]||[ "${engine}" == "unreal2" ]; then fn_info_parms_unreal diff --git a/lgsm/functions/install_config.sh b/lgsm/functions/install_config.sh index c4e613dcf..f9c7e1cb2 100644 --- a/lgsm/functions/install_config.sh +++ b/lgsm/functions/install_config.sh @@ -154,13 +154,6 @@ elif [ "${gamename}" == "ARK: Survival Evolved" ]; then fn_fetch_default_config fn_default_config_remote fn_set_config_vars -elif [ "${gamename}" == "Mordhau" ]; then - gamedirname="mordhau" - fn_check_cfgdir - array_configs+=( DefaultEngine.ini ) - fn_fetch_default_config - fn_default_config_remote - fn_set_config_vars elif [ "${gamename}" == "ARMA 3" ]; then gamedirname="Arma3" fn_check_cfgdir From d521b3521358d95e417883d9e00639548fdfa8d9 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Tue, 7 May 2019 22:31:46 +0100 Subject: [PATCH 081/534] mhserver: further fixes after accidental merge of wrong branch (#2347) mhserver: fix further regressions --- .../config-lgsm/mhserver/_default.cfg | 4 +- .../config-lgsm/mordhauserver/_default.cfg | 133 ------------------ lgsm/functions/info_config.sh | 12 +- lgsm/functions/info_glibc.sh | 3 - lgsm/functions/info_messages.sh | 21 +-- lgsm/functions/info_parms.sh | 17 +-- lgsm/functions/install_config.sh | 7 - 7 files changed, 9 insertions(+), 188 deletions(-) delete mode 100644 lgsm/config-default/config-lgsm/mordhauserver/_default.cfg diff --git a/lgsm/config-default/config-lgsm/mhserver/_default.cfg b/lgsm/config-default/config-lgsm/mhserver/_default.cfg index 45c81adf5..e8395ed2f 100644 --- a/lgsm/config-default/config-lgsm/mhserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/mhserver/_default.cfg @@ -17,7 +17,7 @@ defaultmap="FFA_ThePit" ## Server Start Command | https://docs.linuxgsm.com/configuration/start-parameters#additional-parameters fn_parms(){ -parms="Mordhau ${defaultmap} -log -MultiHome=${ip} -MaxPlayers=${maxplayers} -Port=${port} -QueryPort=${queryport}" +parms="Mordhau ${defaultmap} -log -MultiHome=${ip} -Port=${port} -QueryPort=${queryport}" } #### LinuxGSM Settings #### @@ -96,7 +96,7 @@ branch="" ## LinuxGSM Server Details # Do not edit -gamename="Mordhau" +gamename="MORDHAU" engine="unreal4" #### Directories #### diff --git a/lgsm/config-default/config-lgsm/mordhauserver/_default.cfg b/lgsm/config-default/config-lgsm/mordhauserver/_default.cfg deleted file mode 100644 index b13b87cbf..000000000 --- a/lgsm/config-default/config-lgsm/mordhauserver/_default.cfg +++ /dev/null @@ -1,133 +0,0 @@ -################################## -######## 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" -#rconport="27020" | add to fn_params() RCONPort=${rconport}? -maxplayers="16" - -## Server Start Command | https://github.com/GameServerManagers/LinuxGSM/wiki/Start-Parameters#additional-parameters -fn_parms(){ -parms="\"FFA_Camp?listen?MultiHome=${ip}?MaxPlayers=${maxplayers}?QueryPort=${queryport}?Port=${port}?\"" -} - -#### LinuxGSM Settings #### - -## Notification Alerts -# (on|off) - -# More info | https://github.com/GameServerManagers/LinuxGSM/wiki/Alerts#more-info -postalert="off" -postdays="7" -posttarget="https://hastebin.com" - -# Discord Alerts | https://github.com/GameServerManagers/LinuxGSM/wiki/Discord -discordalert="off" -discordwebhook="webhook" - -# Email Alerts | https://github.com/GameServerManagers/LinuxGSM/wiki/Email -emailalert="off" -email="email@example.com" -emailfrom="" - -# IFTTT Alerts | https://github.com/GameServerManagers/LinuxGSM/wiki/IFTTT -iftttalert="off" -ifttttoken="accesstoken" -iftttevent="linuxgsm_alert" - -# Mailgun Email Alerts | https://github.com/GameServerManagers/LinuxGSM/wiki/mailgun -mailgunalert="off" -mailguntoken="accesstoken" -mailgundomain="example.com" -mailgunemailfrom="alert@example.com" -mailgunemail="email@myemail.com" - -# Pushbullet Alerts | https://github.com/GameServerManagers/LinuxGSM/wiki/Pushbullet -pushbulletalert="off" -pushbullettoken="accesstoken" -channeltag="" - -# Pushover Alerts | https://github.com/GameServerManagers/LinuxGSM/wiki/Pushover -pushoveralert="off" -pushovertoken="accesstoken" - -# Telegram Alerts | https://github.com/GameServerManagers/LinuxGSM/wiki/Telegram -# You can add a custom cURL string eg proxy (useful in Russia) or else in "curlcustomstring". -# like a "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help", if you not need -# any custom string in curl - simple ignore this parameter. -telegramalert="off" -telegramtoken="accesstoken" -telegramchatid="" -curlcustomstring="" - -## 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="629800" -# 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="Mordhau" -engine="unreal4" - -#### Directories #### -# Edit with care - -## Server Specific Directories -systemdir="${serverfiles}/mordhau" -executabledir="${systemdir}/Binaries/Linux" -executable="./MordhauServer-Linux-Shipping" -servercfgdir="${systemdir}/Config" -servercfg="DefaultGame.ini" -servercfgdefault="DefaultGame.ini" -servercfgfullpath="${servercfgdir}/${servercfg}" - -## Backup Directory -backupdir="${lgsmdir}/backup" - -## 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" -alertlog="${lgsmlogdir}/${servicename}-alert.log" -postdetailslog="${lgsmlogdir}/${servicename}-postdetails.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" - -## Github Branch Select -# Allows for the use of different function files -# from a different repo and/or branch. -githubuser="Viretick" -githubrepo="LinuxGSM" -githubbranch="custom-servers" diff --git a/lgsm/functions/info_config.sh b/lgsm/functions/info_config.sh index 274c7b3a3..131113bdf 100644 --- a/lgsm/functions/info_config.sh +++ b/lgsm/functions/info_config.sh @@ -87,16 +87,6 @@ fn_info_config_ark(){ fi } -fn_info_config_mordhau(){ - if [ ! -f "${servercfgfullpath}" ]; then - servername="${unavailable}" - else - 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 -} - fn_info_config_ballistic_overkill(){ if [ ! -f "${servercfgfullpath}" ]; then servername="${unavailable}" @@ -1156,7 +1146,7 @@ fn_info_config_stationeers(){ fi } -fn_info_config_mordhau() { +fn_info_config_mordhau(){ if [ ! -f "${servercfgfullpath}" ]; then servername="${unavailable}" serverpassword="${unavailable}" diff --git a/lgsm/functions/info_glibc.sh b/lgsm/functions/info_glibc.sh index 2f283b778..63bbdd6d5 100644 --- a/lgsm/functions/info_glibc.sh +++ b/lgsm/functions/info_glibc.sh @@ -9,9 +9,6 @@ local function_selfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" if [ "${gamename}" == "ARK: Survival Evolved" ]; then glibcrequired="2.15" glibcfix="no" -elif [ "${gamename}" == "Mordhau" ]; then - glibcrequired="2.15" - glibcfix="no" elif [ "${gamename}" == "Ballistic Overkill" ]; then glibcrequired="2.15" glibcfix="yes" diff --git a/lgsm/functions/info_messages.sh b/lgsm/functions/info_messages.sh index 0e86ebeff..ac6bb2e6a 100644 --- a/lgsm/functions/info_messages.sh +++ b/lgsm/functions/info_messages.sh @@ -578,21 +578,6 @@ fn_info_message_ark(){ } | column -s $'\t' -t } -fn_info_message_mordhau(){ - echo -e "netstat -atunp | grep Mordhau" - 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_info_message_ballisticoverkill(){ echo -e "netstat -atunp | grep BODS.x86" echo -e "" @@ -1199,11 +1184,7 @@ fn_info_message_mordhau(){ 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 "> Game\tINBOUND\t${port}\tupd" echo -e "> Query\tINBOUND\t${queryport}\tudp" } | column -s $'\t' -t } diff --git a/lgsm/functions/info_parms.sh b/lgsm/functions/info_parms.sh index 1443a55ca..34ebc793d 100644 --- a/lgsm/functions/info_parms.sh +++ b/lgsm/functions/info_parms.sh @@ -22,13 +22,6 @@ fn_info_parms_ark(){ maxplayers=${maxplayers:-"0"} } -fn_info_parms_mordhau(){ - port=${port:-"0"} - queryport=${queryport:-"0"} - #rconport=${rconport:-"0"} - maxplayers=${maxplayers:-"0"} -} - fn_info_parms_realvirtuality(){ port=${port:-"0"} queryport=$((port + 1)) @@ -148,12 +141,12 @@ fn_info_parms_stickybots(){ maxplayers=${maxplayers:-"0"} } -fn_info_config_towerunite(){ +fn_info_parms_towerunite(){ port=${port:-"0"} queryport=${queryport:-"0"} } -fn_info_config_mordhau(){ +fn_info_parms_mordhau(){ port=${port:-"0"} queryport=${queryport:-"0"} } @@ -225,16 +218,16 @@ elif [ "${shortname}" == "sbots" ]; then fn_info_parms_stickybots # Serious Sam elif [ "${shortname}" == "ss3" ]; then - fn_info_config_seriousengine35 + fn_info_parms_seriousengine35 elif [ "${engine}" == "source" ]||[ "${engine}" == "goldsource" ]; then fn_info_parms_source # Spark elif [ "${engine}" == "spark" ]; then fn_info_parms_spark elif [ "${shortname}" == "tu" ]; then - fn_info_config_towerunite + fn_info_parms_towerunite elif [ "${shortname}" == "mh" ]; then - fn_info_config_mordhau + fn_info_parms_mordhau # Unreal/Unreal 2 engine elif [ "${engine}" == "unreal" ]||[ "${engine}" == "unreal2" ]; then fn_info_parms_unreal diff --git a/lgsm/functions/install_config.sh b/lgsm/functions/install_config.sh index c4e613dcf..f9c7e1cb2 100644 --- a/lgsm/functions/install_config.sh +++ b/lgsm/functions/install_config.sh @@ -154,13 +154,6 @@ elif [ "${gamename}" == "ARK: Survival Evolved" ]; then fn_fetch_default_config fn_default_config_remote fn_set_config_vars -elif [ "${gamename}" == "Mordhau" ]; then - gamedirname="mordhau" - fn_check_cfgdir - array_configs+=( DefaultEngine.ini ) - fn_fetch_default_config - fn_default_config_remote - fn_set_config_vars elif [ "${gamename}" == "ARMA 3" ]; then gamedirname="Arma3" fn_check_cfgdir From f120f7b9ee591e6ba9e42c72440ad0fa7c17fad4 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Tue, 7 May 2019 22:38:57 +0100 Subject: [PATCH 082/534] mhserver: further regressions --- lgsm/functions/info_messages.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lgsm/functions/info_messages.sh b/lgsm/functions/info_messages.sh index ac6bb2e6a..2400e8569 100644 --- a/lgsm/functions/info_messages.sh +++ b/lgsm/functions/info_messages.sh @@ -1184,7 +1184,7 @@ fn_info_message_mordhau(){ echo -e "" { echo -e "DESCRIPTION\tDIRECTION\tPORT\tPROTOCOL" - echo -e "> Game\tINBOUND\t${port}\tupd" + echo -e "> Game\tINBOUND\t${port}\tudp" echo -e "> Query\tINBOUND\t${queryport}\tudp" } | column -s $'\t' -t } From eddc32c7b3c7d20dabd7c7369d0e5b2290c3ac40 Mon Sep 17 00:00:00 2001 From: Christian Date: Wed, 8 May 2019 23:23:19 +0200 Subject: [PATCH 083/534] fix(mhserver): add new BeaconPort for MORDHAU (#2348) Co-authored-by: Christian Birk Joining a server will now reserve a slot in advance, fixing the issue of being booted after loading. Server owners will have to make sure that the beacon port (15000) is reachable; it can be overridden on the command line with BeaconPort= --- lgsm/config-default/config-lgsm/mhserver/_default.cfg | 3 ++- lgsm/functions/info_messages.sh | 1 + lgsm/functions/info_parms.sh | 1 + 3 files changed, 4 insertions(+), 1 deletion(-) diff --git a/lgsm/config-default/config-lgsm/mhserver/_default.cfg b/lgsm/config-default/config-lgsm/mhserver/_default.cfg index e8395ed2f..4ae249588 100644 --- a/lgsm/config-default/config-lgsm/mhserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/mhserver/_default.cfg @@ -11,13 +11,14 @@ ## Server Start Settings | https://docs.linuxgsm.com/configuration/start-parameters ip="0.0.0.0" port="7777" +beaconport="15000" queryport="27015" # Maps: FFA_Camp, FFA_Contraband, FFA_Grad, FFA_MountainPeak, FFA_Taiga, FFA_ThePit, FFA_Tourney, SKM_Camp, SKM_Contraband, SKM_Grad, SKM_MountainPeak, SKM_Taiga, SKM_ThePit, SKM_Tourney, TDM_Camp, TDM_Contraband, TDM_Grad, TDM_MountainPeak, TDM_Taiga, TDM_ThePit, TDM_Tourney defaultmap="FFA_ThePit" ## Server Start Command | https://docs.linuxgsm.com/configuration/start-parameters#additional-parameters fn_parms(){ -parms="Mordhau ${defaultmap} -log -MultiHome=${ip} -Port=${port} -QueryPort=${queryport}" +parms="Mordhau ${defaultmap} -log -MultiHome=${ip} -Port=${port} -BeaconPort=${beaconport} -QueryPort=${queryport}" } #### LinuxGSM Settings #### diff --git a/lgsm/functions/info_messages.sh b/lgsm/functions/info_messages.sh index 2400e8569..3cdfb6477 100644 --- a/lgsm/functions/info_messages.sh +++ b/lgsm/functions/info_messages.sh @@ -1185,6 +1185,7 @@ fn_info_message_mordhau(){ { echo -e "DESCRIPTION\tDIRECTION\tPORT\tPROTOCOL" echo -e "> Game\tINBOUND\t${port}\tudp" + echo -e "> BeaconPort\tINBOUND\t${beaconport}\tudp" echo -e "> Query\tINBOUND\t${queryport}\tudp" } | column -s $'\t' -t } diff --git a/lgsm/functions/info_parms.sh b/lgsm/functions/info_parms.sh index 34ebc793d..544c8178c 100644 --- a/lgsm/functions/info_parms.sh +++ b/lgsm/functions/info_parms.sh @@ -149,6 +149,7 @@ fn_info_parms_towerunite(){ fn_info_parms_mordhau(){ port=${port:-"0"} queryport=${queryport:-"0"} + beaconport=${beaconport:-"0"} } fn_info_parms_unreal(){ From 41877ee4b8eb98d5dca8c00a345026a62c5618c3 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Thu, 9 May 2019 18:46:21 +0100 Subject: [PATCH 084/534] release v19.6.0 --- linuxgsm.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/linuxgsm.sh b/linuxgsm.sh index e5c22af3b..c2607c7ab 100755 --- a/linuxgsm.sh +++ b/linuxgsm.sh @@ -20,7 +20,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="190503" +version="v19.6.0" shortname="core" gameservername="core" rootdir="$(dirname "$(readlink -f "${BASH_SOURCE[0]}")")" From 229fe133f6cb60d49c8a37819c4cb771abd2b03a Mon Sep 17 00:00:00 2001 From: DUDU54 <14166148+DUDU54@users.noreply.github.com> Date: Sun, 12 May 2019 18:21:49 +0900 Subject: [PATCH 085/534] fix(mcserver): correct wrong query port fetched from config (#2355) Co-authored-by: DUDU54 <14166148+DUDU54@users.noreply.github.com> --- lgsm/functions/info_config.sh | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/lgsm/functions/info_config.sh b/lgsm/functions/info_config.sh index 131113bdf..2af5ab5da 100644 --- a/lgsm/functions/info_config.sh +++ b/lgsm/functions/info_config.sh @@ -338,7 +338,10 @@ fn_info_config_minecraft(){ rconport=$(grep "rcon.port" "${servercfgfullpath}" | grep -v "#" | tr -cd '[:digit:]') maxplayers=$(grep "max-players" "${servercfgfullpath}" | grep -v "#" | tr -cd '[:digit:]') port=$(grep "server-port" "${servercfgfullpath}" | grep -v "#" | tr -cd '[:digit:]') - queryport="${port}" + queryport=$(grep "query.port" "${servercfgfullpath}" | grep -v "#" | tr -cd '[:digit:]') + if [ -z "${queryport}" ]; then + queryport=${port} + fi queryenabled=$(grep "enable-query" "${servercfgfullpath}" | sed -e 's/^[ \t]*//g' -e '/^#/d' -e 's/enable-query//g' | tr -d '=\";,:' | sed -e 's/^[ \t]*//' -e 's/[ \t]*$//') gamemode=$(grep "gamemode" "${servercfgfullpath}" | grep -v "#" | tr -cd '[:digit:]') gameworld=$(grep "level-name" "${servercfgfullpath}" | sed -e 's/^[ \t]*//g' -e '/^#/d' -e 's/level-name//g' | tr -d '=\";,:' | sed -e 's/^[ \t]*//' -e 's/[ \t]*$//') @@ -353,7 +356,7 @@ fn_info_config_minecraft(){ rconport=${rconport:-"NOT SET"} maxplayers=${maxplayers:-"NOT SET"} port=${port:-"NOT SET"} - queryport="${queryport:-"NOT SET"}" + queryport=${queryport:-"NOT SET"} queryenabled="${queryenabled:-"NOT SET"}" gamemode=${gamemode:-"NOT SET"} gameworld=${gameworld:-"NOT SET"} From 56a971c2d4c7f3f2b83cf1cb3378b2d281573343 Mon Sep 17 00:00:00 2001 From: DUDU54 <14166148+DUDU54@users.noreply.github.com> Date: Sun, 12 May 2019 18:22:55 +0900 Subject: [PATCH 086/534] fix(mtaserver): correct wrong executable name in update (#2353) --- 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 a2536f0b7..90eb424f5 100644 --- a/lgsm/functions/update_mta.sh +++ b/lgsm/functions/update_mta.sh @@ -18,7 +18,7 @@ fn_update_mta_dl(){ if [ "${exitcode}" == "0" ]; then fn_print_ok_eol_nl fn_script_log_pass "Copying to ${serverfiles}" - chmod u+x "${serverfiles}/minecraft_server.jar" + chmod u+x "${serverfiles}/mta-server64" fn_clear_tmp else fn_print_fail_eol_nl @@ -63,7 +63,7 @@ fn_update_mta_localbuild(){ fn_script_log_error "Set localbuild to 0" sleep 0.5 fi - + totalseconds=$((totalseconds + 1)) done fi @@ -81,7 +81,7 @@ fn_update_mta_localbuild(){ if [ -z "${loopignore}" ]; then loopignore=1 fn_script_log_info "Waiting for local build to generate" - fi + fi localbuild=$(grep "= Multi Theft Auto: San Andreas v" "${serverfiles}/mods/deathmatch/logs/server.log" | awk '{ print $7 }' | sed -r 's/^.{1}//' | tail -1) if [ "${localbuild}" ]; then break @@ -90,7 +90,7 @@ fn_update_mta_localbuild(){ totalseconds=$((totalseconds + 1)) done fi - + if [ -z "${localbuild}" ]; then localbuild="0" fn_print_error "Checking for update: ${remotelocation}: waiting for local build: missing local build info" @@ -129,7 +129,7 @@ fn_update_mta_remotebuild(){ fn_script_log_fatal "Unable to get remote build" core_exit.sh fi - fi + fi } fn_update_mta_compare(){ From fa6cfe408613e2fe3dae63eae8e87c4e7efb9aaf Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Sun, 12 May 2019 22:28:27 +0100 Subject: [PATCH 087/534] feat(ui): add message display setting (#2357) * setting to change the time in seconds messages are displayed. Default 0.5s * Travis-CI messages have a 0s delay to speed up testing. --- .../config-lgsm/arkserver/_default.cfg | 3 ++ .../config-lgsm/arma3server/_default.cfg | 3 ++ .../config-lgsm/bb2server/_default.cfg | 3 ++ .../config-lgsm/bbserver/_default.cfg | 3 ++ .../config-lgsm/bdserver/_default.cfg | 3 ++ .../config-lgsm/bf1942server/_default.cfg | 3 ++ .../config-lgsm/bmdmserver/_default.cfg | 3 ++ .../config-lgsm/boserver/_default.cfg | 3 ++ .../config-lgsm/bsserver/_default.cfg | 3 ++ .../config-lgsm/bt1944server/_default.cfg | 3 ++ .../config-lgsm/ccserver/_default.cfg | 3 ++ .../config-lgsm/cod2server/_default.cfg | 3 ++ .../config-lgsm/cod4server/_default.cfg | 3 ++ .../config-lgsm/codserver/_default.cfg | 3 ++ .../config-lgsm/coduoserver/_default.cfg | 3 ++ .../config-lgsm/codwawserver/_default.cfg | 3 ++ .../config-lgsm/csczserver/_default.cfg | 3 ++ .../config-lgsm/csgoserver/_default.cfg | 3 ++ .../config-lgsm/csserver/_default.cfg | 3 ++ .../config-lgsm/cssserver/_default.cfg | 3 ++ .../config-lgsm/dabserver/_default.cfg | 3 ++ .../config-lgsm/dmcserver/_default.cfg | 3 ++ .../config-lgsm/dodserver/_default.cfg | 3 ++ .../config-lgsm/dodsserver/_default.cfg | 3 ++ .../config-lgsm/doiserver/_default.cfg | 3 ++ .../config-lgsm/dstserver/_default.cfg | 3 ++ .../config-lgsm/dysserver/_default.cfg | 3 ++ .../config-lgsm/ecoserver/_default.cfg | 3 ++ .../config-lgsm/emserver/_default.cfg | 3 ++ .../config-lgsm/etlserver/_default.cfg | 3 ++ .../config-lgsm/fctrserver/_default.cfg | 3 ++ .../config-lgsm/fofserver/_default.cfg | 3 ++ .../config-lgsm/gesserver/_default.cfg | 3 ++ .../config-lgsm/gmodserver/_default.cfg | 3 ++ .../config-lgsm/hl2dmserver/_default.cfg | 3 ++ .../config-lgsm/hldmserver/_default.cfg | 3 ++ .../config-lgsm/hldmsserver/_default.cfg | 3 ++ .../config-lgsm/hwserver/_default.cfg | 3 ++ .../config-lgsm/insserver/_default.cfg | 3 ++ .../config-lgsm/inssserver/_default.cfg | 3 ++ .../config-lgsm/iosserver/_default.cfg | 3 ++ .../config-lgsm/jc2server/_default.cfg | 3 ++ .../config-lgsm/jc3server/_default.cfg | 3 ++ .../config-lgsm/kf2server/_default.cfg | 3 ++ .../config-lgsm/kfserver/_default.cfg | 3 ++ .../config-lgsm/l4d2server/_default.cfg | 3 ++ .../config-lgsm/l4dserver/_default.cfg | 3 ++ .../config-lgsm/mcserver/_default.cfg | 3 ++ .../config-lgsm/mhserver/_default.cfg | 3 ++ .../config-lgsm/mtaserver/_default.cfg | 3 ++ .../config-lgsm/mumbleserver/_default.cfg | 3 ++ .../config-lgsm/ndserver/_default.cfg | 3 ++ .../config-lgsm/nmrihserver/_default.cfg | 3 ++ .../config-lgsm/ns2cserver/_default.cfg | 3 ++ .../config-lgsm/ns2server/_default.cfg | 3 ++ .../config-lgsm/nsserver/_default.cfg | 3 ++ .../config-lgsm/opforserver/_default.cfg | 3 ++ .../config-lgsm/pcserver/_default.cfg | 3 ++ .../config-lgsm/pstbsserver/_default.cfg | 3 ++ .../config-lgsm/pvkiiserver/_default.cfg | 3 ++ .../config-lgsm/pzserver/_default.cfg | 3 ++ .../config-lgsm/q2server/_default.cfg | 3 ++ .../config-lgsm/q3server/_default.cfg | 3 ++ .../config-lgsm/qlserver/_default.cfg | 3 ++ .../config-lgsm/qwserver/_default.cfg | 3 ++ .../config-lgsm/ricochetserver/_default.cfg | 3 ++ .../config-lgsm/roserver/_default.cfg | 3 ++ .../config-lgsm/rtcwserver/_default.cfg | 3 ++ .../config-lgsm/rustserver/_default.cfg | 3 ++ .../config-lgsm/rwserver/_default.cfg | 3 ++ .../config-lgsm/sampserver/_default.cfg | 3 ++ .../config-lgsm/sbotsserver/_default.cfg | 3 ++ .../config-lgsm/sbserver/_default.cfg | 3 ++ .../config-lgsm/sdtdserver/_default.cfg | 3 ++ .../config-lgsm/squadserver/_default.cfg | 3 ++ .../config-lgsm/ss3server/_default.cfg | 3 ++ .../config-lgsm/stserver/_default.cfg | 3 ++ .../config-lgsm/svenserver/_default.cfg | 3 ++ .../config-lgsm/terrariaserver/_default.cfg | 3 ++ .../config-lgsm/tf2server/_default.cfg | 3 ++ .../config-lgsm/tfcserver/_default.cfg | 3 ++ .../config-lgsm/ts3server/_default.cfg | 3 ++ .../config-lgsm/tuserver/_default.cfg | 3 ++ .../config-lgsm/twserver/_default.cfg | 3 ++ .../config-lgsm/untserver/_default.cfg | 3 ++ .../config-lgsm/ut2k4server/_default.cfg | 3 ++ .../config-lgsm/ut3server/_default.cfg | 3 ++ .../config-lgsm/ut99server/_default.cfg | 3 ++ .../config-lgsm/utserver/_default.cfg | 3 ++ .../config-lgsm/vsserver/_default.cfg | 3 ++ .../config-lgsm/wetserver/_default.cfg | 3 ++ .../config-lgsm/wurmserver/_default.cfg | 3 ++ .../config-lgsm/zpsserver/_default.cfg | 3 ++ lgsm/functions/alert_email.sh | 2 +- lgsm/functions/alert_ifttt.sh | 3 +- lgsm/functions/alert_mailgun.sh | 3 +- lgsm/functions/alert_pushbullet.sh | 1 - lgsm/functions/alert_pushover.sh | 3 +- lgsm/functions/alert_telegram.sh | 1 - lgsm/functions/check_config.sh | 5 -- lgsm/functions/check_deps.sh | 10 ++-- lgsm/functions/check_glibc.sh | 4 +- lgsm/functions/check_ip.sh | 4 -- lgsm/functions/check_logs.sh | 1 - lgsm/functions/check_permissions.sh | 7 +-- lgsm/functions/check_steamcmd.sh | 1 - lgsm/functions/check_system_requirements.sh | 4 +- lgsm/functions/command_backup.sh | 19 ++----- lgsm/functions/command_console.sh | 3 -- lgsm/functions/command_debug.sh | 3 -- lgsm/functions/command_fastdl.sh | 14 ++--- lgsm/functions/command_mods_install.sh | 1 - lgsm/functions/command_mods_remove.sh | 8 +-- lgsm/functions/command_mods_update.sh | 4 +- lgsm/functions/command_monitor.sh | 10 ---- lgsm/functions/command_postdetails.sh | 4 +- lgsm/functions/command_start.sh | 12 ++--- lgsm/functions/command_stop.sh | 20 +++---- lgsm/functions/command_test_alert.sh | 1 - lgsm/functions/command_ts3_server_pass.sh | 2 - lgsm/functions/command_update.sh | 1 - lgsm/functions/command_update_linuxgsm.sh | 1 - lgsm/functions/command_validate.sh | 13 ++--- lgsm/functions/command_wipe.sh | 53 ++++++++----------- lgsm/functions/core_dl.sh | 6 +-- lgsm/functions/core_messages.sh | 34 +++++++++--- lgsm/functions/fix.sh | 6 +-- lgsm/functions/fix_kf.sh | 8 +-- lgsm/functions/fix_kf2.sh | 4 +- lgsm/functions/fix_mta.sh | 2 +- lgsm/functions/fix_ro.sh | 10 ++-- lgsm/functions/fix_ut.sh | 2 +- lgsm/functions/fix_ut2k4.sh | 8 +-- lgsm/functions/fix_ut3.sh | 4 +- lgsm/functions/install_config.sh | 24 ++++----- lgsm/functions/install_dst_token.sh | 2 +- lgsm/functions/install_eula.sh | 2 +- lgsm/functions/install_factorio_save.sh | 2 +- lgsm/functions/install_gslt.sh | 4 +- lgsm/functions/install_logs.sh | 4 +- lgsm/functions/install_server_dir.sh | 2 +- lgsm/functions/install_server_files.sh | 2 +- lgsm/functions/install_squad_license.sh | 4 +- lgsm/functions/install_steamcmd.sh | 2 +- lgsm/functions/install_ts3db.sh | 9 ++-- lgsm/functions/install_ut2k4_key.sh | 2 +- lgsm/functions/logs.sh | 4 +- lgsm/functions/mods_core.sh | 16 +++--- lgsm/functions/update_factorio.sh | 12 +---- lgsm/functions/update_minecraft.sh | 14 +---- lgsm/functions/update_mta.sh | 14 +---- lgsm/functions/update_mumble.sh | 12 +---- lgsm/functions/update_steamcmd.sh | 20 ++----- lgsm/functions/update_ts3.sh | 23 +++----- tests/tests_fctrserver.sh | 1 - tests/tests_jc2server.sh | 1 - tests/tests_mcserver.sh | 3 +- tests/tests_ts3server.sh | 1 - 158 files changed, 450 insertions(+), 311 deletions(-) diff --git a/lgsm/config-default/config-lgsm/arkserver/_default.cfg b/lgsm/config-default/config-lgsm/arkserver/_default.cfg index 47189ae12..9306d3b4e 100644 --- a/lgsm/config-default/config-lgsm/arkserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/arkserver/_default.cfg @@ -88,6 +88,9 @@ logdays="7" # ANSI Colors ansi="on" +# Message Display Time +sleeptime="0.5" + ## SteamCMD Settings # Server appid appid="376030" diff --git a/lgsm/config-default/config-lgsm/arma3server/_default.cfg b/lgsm/config-default/config-lgsm/arma3server/_default.cfg index c7f9f1187..07fff7375 100644 --- a/lgsm/config-default/config-lgsm/arma3server/_default.cfg +++ b/lgsm/config-default/config-lgsm/arma3server/_default.cfg @@ -102,6 +102,9 @@ logdays="7" # ANSI Colors ansi="on" +# Message Display Time +sleeptime="0.5" + ## SteamCMD Settings # Server appid appid="233780" diff --git a/lgsm/config-default/config-lgsm/bb2server/_default.cfg b/lgsm/config-default/config-lgsm/bb2server/_default.cfg index 17014193d..e04d61e72 100644 --- a/lgsm/config-default/config-lgsm/bb2server/_default.cfg +++ b/lgsm/config-default/config-lgsm/bb2server/_default.cfg @@ -92,6 +92,9 @@ logdays="7" # ANSI Colors ansi="on" +# Message Display Time +sleeptime="0.5" + ## SteamCMD Settings # Server appid appid="475370" diff --git a/lgsm/config-default/config-lgsm/bbserver/_default.cfg b/lgsm/config-default/config-lgsm/bbserver/_default.cfg index 0002910f9..2b891d4ed 100644 --- a/lgsm/config-default/config-lgsm/bbserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/bbserver/_default.cfg @@ -86,6 +86,9 @@ logdays="7" # ANSI Colors ansi="on" +# Message Display Time +sleeptime="0.5" + ## SteamCMD Settings # Server appid appid="90" diff --git a/lgsm/config-default/config-lgsm/bdserver/_default.cfg b/lgsm/config-default/config-lgsm/bdserver/_default.cfg index ad5bc4a7b..602936e6d 100644 --- a/lgsm/config-default/config-lgsm/bdserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/bdserver/_default.cfg @@ -86,6 +86,9 @@ logdays="7" # ANSI Colors ansi="on" +# Message Display Time +sleeptime="0.5" + ## SteamCMD Settings # Server appid appid="817300" diff --git a/lgsm/config-default/config-lgsm/bf1942server/_default.cfg b/lgsm/config-default/config-lgsm/bf1942server/_default.cfg index 0323fa414..c0f799198 100644 --- a/lgsm/config-default/config-lgsm/bf1942server/_default.cfg +++ b/lgsm/config-default/config-lgsm/bf1942server/_default.cfg @@ -79,6 +79,9 @@ logdays="7" # ANSI Colors ansi="on" +# Message Display Time +sleeptime="0.5" + ## LinuxGSM Server Details # Do not edit gamename="Battlefield: 1942" diff --git a/lgsm/config-default/config-lgsm/bmdmserver/_default.cfg b/lgsm/config-default/config-lgsm/bmdmserver/_default.cfg index d3036144e..4eb1ceec3 100644 --- a/lgsm/config-default/config-lgsm/bmdmserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/bmdmserver/_default.cfg @@ -92,6 +92,9 @@ logdays="7" # ANSI Colors ansi="on" +# Message Display Time +sleeptime="0.5" + ## SteamCMD Settings # Server appid appid="346680" diff --git a/lgsm/config-default/config-lgsm/boserver/_default.cfg b/lgsm/config-default/config-lgsm/boserver/_default.cfg index c9fc1c954..77a5b0b4b 100644 --- a/lgsm/config-default/config-lgsm/boserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/boserver/_default.cfg @@ -85,6 +85,9 @@ logdays="7" # ANSI Colors ansi="on" +# Message Display Time +sleeptime="0.5" + ## SteamCMD Settings # Server appid appid="416880" diff --git a/lgsm/config-default/config-lgsm/bsserver/_default.cfg b/lgsm/config-default/config-lgsm/bsserver/_default.cfg index 3792882b1..e9294e0a4 100644 --- a/lgsm/config-default/config-lgsm/bsserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/bsserver/_default.cfg @@ -96,6 +96,9 @@ logdays="7" # ANSI Colors ansi="on" +# Message Display Time +sleeptime="0.5" + ## SteamCMD Settings # Server appid appid="228780" diff --git a/lgsm/config-default/config-lgsm/bt1944server/_default.cfg b/lgsm/config-default/config-lgsm/bt1944server/_default.cfg index 22b3f4e4d..dcb01817b 100644 --- a/lgsm/config-default/config-lgsm/bt1944server/_default.cfg +++ b/lgsm/config-default/config-lgsm/bt1944server/_default.cfg @@ -84,6 +84,9 @@ logdays="7" # ANSI Colors ansi="on" +# Message Display Time +sleeptime="0.5" + ## SteamCMD Settings # Server appid appid="805140" diff --git a/lgsm/config-default/config-lgsm/ccserver/_default.cfg b/lgsm/config-default/config-lgsm/ccserver/_default.cfg index c85af6137..f07e8bf87 100644 --- a/lgsm/config-default/config-lgsm/ccserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/ccserver/_default.cfg @@ -87,6 +87,9 @@ logdays="7" # ANSI Colors ansi="on" +# Message Display Time +sleeptime="0.5" + ## SteamCMD Settings # Server appid appid="383410" diff --git a/lgsm/config-default/config-lgsm/cod2server/_default.cfg b/lgsm/config-default/config-lgsm/cod2server/_default.cfg index 61b0a56e8..1bbc6abb2 100644 --- a/lgsm/config-default/config-lgsm/cod2server/_default.cfg +++ b/lgsm/config-default/config-lgsm/cod2server/_default.cfg @@ -82,6 +82,9 @@ logdays="7" # ANSI Colors ansi="on" +# Message Display Time +sleeptime="0.5" + ## LinuxGSM Server Details # Do not edit gamename="Call of Duty 2" diff --git a/lgsm/config-default/config-lgsm/cod4server/_default.cfg b/lgsm/config-default/config-lgsm/cod4server/_default.cfg index a46248950..d2da96d90 100644 --- a/lgsm/config-default/config-lgsm/cod4server/_default.cfg +++ b/lgsm/config-default/config-lgsm/cod4server/_default.cfg @@ -82,6 +82,9 @@ logdays="7" # ANSI Colors ansi="on" +# Message Display Time +sleeptime="0.5" + ## LinuxGSM Server Details # Do not edit gamename="Call of Duty 4" diff --git a/lgsm/config-default/config-lgsm/codserver/_default.cfg b/lgsm/config-default/config-lgsm/codserver/_default.cfg index 67c6dc918..6797cf433 100644 --- a/lgsm/config-default/config-lgsm/codserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/codserver/_default.cfg @@ -82,6 +82,9 @@ logdays="7" # ANSI Colors ansi="on" +# Message Display Time +sleeptime="0.5" + ## LinuxGSM Server Details # Do not edit gamename="Call of Duty" diff --git a/lgsm/config-default/config-lgsm/coduoserver/_default.cfg b/lgsm/config-default/config-lgsm/coduoserver/_default.cfg index c61d3f96b..ea142dee9 100644 --- a/lgsm/config-default/config-lgsm/coduoserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/coduoserver/_default.cfg @@ -82,6 +82,9 @@ logdays="7" # ANSI Colors ansi="on" +# Message Display Time +sleeptime="0.5" + ## LinuxGSM Server Details # Do not edit gamename="Call of Duty: United Offensive" diff --git a/lgsm/config-default/config-lgsm/codwawserver/_default.cfg b/lgsm/config-default/config-lgsm/codwawserver/_default.cfg index 4296b4b7c..87ddb9468 100644 --- a/lgsm/config-default/config-lgsm/codwawserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/codwawserver/_default.cfg @@ -82,6 +82,9 @@ logdays="7" # ANSI Colors ansi="on" +# Message Display Time +sleeptime="0.5" + ## LinuxGSM Server Details # Do not edit gamename="Call of Duty: World at War" diff --git a/lgsm/config-default/config-lgsm/csczserver/_default.cfg b/lgsm/config-default/config-lgsm/csczserver/_default.cfg index 363d82e6b..f8b17a3ac 100644 --- a/lgsm/config-default/config-lgsm/csczserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/csczserver/_default.cfg @@ -86,6 +86,9 @@ logdays="7" # ANSI Colors ansi="on" +# Message Display Time +sleeptime="0.5" + ## SteamCMD Settings # Server appid appid="90" diff --git a/lgsm/config-default/config-lgsm/csgoserver/_default.cfg b/lgsm/config-default/config-lgsm/csgoserver/_default.cfg index 8fb88de8b..3bd16b090 100644 --- a/lgsm/config-default/config-lgsm/csgoserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/csgoserver/_default.cfg @@ -112,6 +112,9 @@ logdays="7" # ANSI Colors ansi="on" +# Message Display Time +sleeptime="0.5" + ## SteamCMD Settings # Server appid appid="740" diff --git a/lgsm/config-default/config-lgsm/csserver/_default.cfg b/lgsm/config-default/config-lgsm/csserver/_default.cfg index c3f087a0f..c465ad5c0 100644 --- a/lgsm/config-default/config-lgsm/csserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/csserver/_default.cfg @@ -86,6 +86,9 @@ logdays="7" # ANSI Colors ansi="on" +# Message Display Time +sleeptime="0.5" + ## SteamCMD Settings # Server appid appid="90" diff --git a/lgsm/config-default/config-lgsm/cssserver/_default.cfg b/lgsm/config-default/config-lgsm/cssserver/_default.cfg index 47ba05037..945327cf8 100644 --- a/lgsm/config-default/config-lgsm/cssserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/cssserver/_default.cfg @@ -92,6 +92,9 @@ logdays="7" # ANSI Colors ansi="on" +# Message Display Time +sleeptime="0.5" + ## SteamCMD Settings # Server appid appid="232330" diff --git a/lgsm/config-default/config-lgsm/dabserver/_default.cfg b/lgsm/config-default/config-lgsm/dabserver/_default.cfg index efa06c0a0..b3c062c33 100644 --- a/lgsm/config-default/config-lgsm/dabserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/dabserver/_default.cfg @@ -87,6 +87,9 @@ logdays="7" # ANSI Colors ansi="on" +# Message Display Time +sleeptime="0.5" + ## SteamCMD Settings # Server appid appid="317800" diff --git a/lgsm/config-default/config-lgsm/dmcserver/_default.cfg b/lgsm/config-default/config-lgsm/dmcserver/_default.cfg index 008ebfe60..be42fe649 100644 --- a/lgsm/config-default/config-lgsm/dmcserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/dmcserver/_default.cfg @@ -86,6 +86,9 @@ logdays="7" # ANSI Colors ansi="on" +# Message Display Time +sleeptime="0.5" + ## SteamCMD Settings # Server appid appid="90" diff --git a/lgsm/config-default/config-lgsm/dodserver/_default.cfg b/lgsm/config-default/config-lgsm/dodserver/_default.cfg index 09eb2eb1d..586d825bd 100644 --- a/lgsm/config-default/config-lgsm/dodserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/dodserver/_default.cfg @@ -86,6 +86,9 @@ logdays="7" # ANSI Colors ansi="on" +# Message Display Time +sleeptime="0.5" + ## SteamCMD Settings # Server appid appid="90" diff --git a/lgsm/config-default/config-lgsm/dodsserver/_default.cfg b/lgsm/config-default/config-lgsm/dodsserver/_default.cfg index 5e9438356..6c747e26a 100644 --- a/lgsm/config-default/config-lgsm/dodsserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/dodsserver/_default.cfg @@ -87,6 +87,9 @@ logdays="7" # ANSI Colors ansi="on" +# Message Display Time +sleeptime="0.5" + ## SteamCMD Settings # Server appid appid="232290" diff --git a/lgsm/config-default/config-lgsm/doiserver/_default.cfg b/lgsm/config-default/config-lgsm/doiserver/_default.cfg index cb507f756..8f8ffad37 100644 --- a/lgsm/config-default/config-lgsm/doiserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/doiserver/_default.cfg @@ -89,6 +89,9 @@ logdays="7" # ANSI Colors ansi="on" +# Message Display Time +sleeptime="0.5" + ## SteamCMD Settings # Server appid appid="462310" diff --git a/lgsm/config-default/config-lgsm/dstserver/_default.cfg b/lgsm/config-default/config-lgsm/dstserver/_default.cfg index 645826951..2674c33f4 100644 --- a/lgsm/config-default/config-lgsm/dstserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/dstserver/_default.cfg @@ -90,6 +90,9 @@ logdays="7" # ANSI Colors ansi="on" +# Message Display Time +sleeptime="0.5" + ## SteamCMD Settings # Server appid appid="343050" diff --git a/lgsm/config-default/config-lgsm/dysserver/_default.cfg b/lgsm/config-default/config-lgsm/dysserver/_default.cfg index 84342b6fa..822389fd3 100644 --- a/lgsm/config-default/config-lgsm/dysserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/dysserver/_default.cfg @@ -92,6 +92,9 @@ logdays="7" # ANSI Colors ansi="on" +# Message Display Time +sleeptime="0.5" + ## SteamCMD Settings # Server appid appid="17585" diff --git a/lgsm/config-default/config-lgsm/ecoserver/_default.cfg b/lgsm/config-default/config-lgsm/ecoserver/_default.cfg index 10908f448..c1936a028 100644 --- a/lgsm/config-default/config-lgsm/ecoserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/ecoserver/_default.cfg @@ -75,6 +75,9 @@ logdays="7" # ANSI Colors ansi="on" +# Message Display Time +sleeptime="0.5" + ## SteamCMD Settings # Server appid appid="739590" diff --git a/lgsm/config-default/config-lgsm/emserver/_default.cfg b/lgsm/config-default/config-lgsm/emserver/_default.cfg index 3188dcf47..b2cd2b08a 100644 --- a/lgsm/config-default/config-lgsm/emserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/emserver/_default.cfg @@ -92,6 +92,9 @@ logdays="7" # ANSI Colors ansi="on" +# Message Display Time +sleeptime="0.5" + ## SteamCMD Settings # Server appid appid="460040" diff --git a/lgsm/config-default/config-lgsm/etlserver/_default.cfg b/lgsm/config-default/config-lgsm/etlserver/_default.cfg index 86e71c8bb..b2762dc16 100644 --- a/lgsm/config-default/config-lgsm/etlserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/etlserver/_default.cfg @@ -76,6 +76,9 @@ logdays="7" # ANSI Colors ansi="on" +# Message Display Time +sleeptime="0.5" + ## LinuxGSM Server Details # Do not edit gamename="ET: Legacy" diff --git a/lgsm/config-default/config-lgsm/fctrserver/_default.cfg b/lgsm/config-default/config-lgsm/fctrserver/_default.cfg index 4117dfbe5..bb6036d91 100644 --- a/lgsm/config-default/config-lgsm/fctrserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/fctrserver/_default.cfg @@ -87,6 +87,9 @@ logdays="7" # ANSI Colors ansi="on" +# Message Display Time +sleeptime="0.5" + ## LinuxGSM Server Details # Do not edit gamename="Factorio" diff --git a/lgsm/config-default/config-lgsm/fofserver/_default.cfg b/lgsm/config-default/config-lgsm/fofserver/_default.cfg index 18d0081f0..45c9526ce 100644 --- a/lgsm/config-default/config-lgsm/fofserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/fofserver/_default.cfg @@ -87,6 +87,9 @@ logdays="7" # ANSI Colors ansi="on" +# Message Display Time +sleeptime="0.5" + ## SteamCMD Settings # Server appid appid="295230" diff --git a/lgsm/config-default/config-lgsm/gesserver/_default.cfg b/lgsm/config-default/config-lgsm/gesserver/_default.cfg index 6f810f409..7f1fc8fcb 100644 --- a/lgsm/config-default/config-lgsm/gesserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/gesserver/_default.cfg @@ -87,6 +87,9 @@ logdays="7" # ANSI Colors ansi="on" +# Message Display Time +sleeptime="0.5" + ## SteamCMD Settings # Server appid appid="310" # Source 2007 SDK diff --git a/lgsm/config-default/config-lgsm/gmodserver/_default.cfg b/lgsm/config-default/config-lgsm/gmodserver/_default.cfg index 00732dd30..03990a8a2 100644 --- a/lgsm/config-default/config-lgsm/gmodserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/gmodserver/_default.cfg @@ -103,6 +103,9 @@ logdays="7" # ANSI Colors ansi="on" +# Message Display Time +sleeptime="0.5" + ## SteamCMD Settings # Server appid appid="4020" diff --git a/lgsm/config-default/config-lgsm/hl2dmserver/_default.cfg b/lgsm/config-default/config-lgsm/hl2dmserver/_default.cfg index c5796eab5..974fb0478 100644 --- a/lgsm/config-default/config-lgsm/hl2dmserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/hl2dmserver/_default.cfg @@ -87,6 +87,9 @@ logdays="7" # ANSI Colors ansi="on" +# Message Display Time +sleeptime="0.5" + ## SteamCMD Settings # Server appid appid="232370" diff --git a/lgsm/config-default/config-lgsm/hldmserver/_default.cfg b/lgsm/config-default/config-lgsm/hldmserver/_default.cfg index 41308db1f..6a8dcc880 100644 --- a/lgsm/config-default/config-lgsm/hldmserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/hldmserver/_default.cfg @@ -86,6 +86,9 @@ logdays="7" # ANSI Colors ansi="on" +# Message Display Time +sleeptime="0.5" + ## SteamCMD Settings # Server appid appid="90" diff --git a/lgsm/config-default/config-lgsm/hldmsserver/_default.cfg b/lgsm/config-default/config-lgsm/hldmsserver/_default.cfg index 91ae5546b..e31fee26d 100644 --- a/lgsm/config-default/config-lgsm/hldmsserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/hldmsserver/_default.cfg @@ -87,6 +87,9 @@ logdays="7" # ANSI Colors ansi="on" +# Message Display Time +sleeptime="0.5" + ## SteamCMD Settings # Server appid appid="255470" diff --git a/lgsm/config-default/config-lgsm/hwserver/_default.cfg b/lgsm/config-default/config-lgsm/hwserver/_default.cfg index 0be9eba7c..8272cca0b 100644 --- a/lgsm/config-default/config-lgsm/hwserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/hwserver/_default.cfg @@ -98,6 +98,9 @@ logdays="7" # ANSI Colors ansi="on" +# Message Display Time +sleeptime="0.5" + ## SteamCMD Settings # Server appid appid="405100" diff --git a/lgsm/config-default/config-lgsm/insserver/_default.cfg b/lgsm/config-default/config-lgsm/insserver/_default.cfg index 7adb4b718..f7f047a10 100644 --- a/lgsm/config-default/config-lgsm/insserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/insserver/_default.cfg @@ -94,6 +94,9 @@ logdays="7" # ANSI Colors ansi="on" +# Message Display Time +sleeptime="0.5" + ## SteamCMD Settings # Server appid appid="237410" diff --git a/lgsm/config-default/config-lgsm/inssserver/_default.cfg b/lgsm/config-default/config-lgsm/inssserver/_default.cfg index 1ba1df679..1714219ec 100644 --- a/lgsm/config-default/config-lgsm/inssserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/inssserver/_default.cfg @@ -95,6 +95,9 @@ logdays="7" # ANSI Colors ansi="on" +# Message Display Time +sleeptime="0.5" + ## SteamCMD Settings # Server appid appid="581330" diff --git a/lgsm/config-default/config-lgsm/iosserver/_default.cfg b/lgsm/config-default/config-lgsm/iosserver/_default.cfg index f42987541..9d9d61c99 100644 --- a/lgsm/config-default/config-lgsm/iosserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/iosserver/_default.cfg @@ -87,6 +87,9 @@ logdays="7" # ANSI Colors ansi="on" +# Message Display Time +sleeptime="0.5" + ## SteamCMD Settings # Server appid appid="673990" diff --git a/lgsm/config-default/config-lgsm/jc2server/_default.cfg b/lgsm/config-default/config-lgsm/jc2server/_default.cfg index cb67c18d3..d539ee38c 100644 --- a/lgsm/config-default/config-lgsm/jc2server/_default.cfg +++ b/lgsm/config-default/config-lgsm/jc2server/_default.cfg @@ -79,6 +79,9 @@ logdays="7" # ANSI Colors ansi="on" +# Message Display Time +sleeptime="0.5" + ## SteamCMD Settings # Server appid appid="261140" diff --git a/lgsm/config-default/config-lgsm/jc3server/_default.cfg b/lgsm/config-default/config-lgsm/jc3server/_default.cfg index ced884359..995fd4714 100644 --- a/lgsm/config-default/config-lgsm/jc3server/_default.cfg +++ b/lgsm/config-default/config-lgsm/jc3server/_default.cfg @@ -79,6 +79,9 @@ logdays="7" # ANSI Colors ansi="on" +# Message Display Time +sleeptime="0.5" + ## SteamCMD Settings # Server appid appid="619960" diff --git a/lgsm/config-default/config-lgsm/kf2server/_default.cfg b/lgsm/config-default/config-lgsm/kf2server/_default.cfg index c6db77168..72c06d1b0 100644 --- a/lgsm/config-default/config-lgsm/kf2server/_default.cfg +++ b/lgsm/config-default/config-lgsm/kf2server/_default.cfg @@ -85,6 +85,9 @@ logdays="7" # ANSI Colors ansi="on" +# Message Display Time +sleeptime="0.5" + ## SteamCMD Settings # Server appid appid="232130" diff --git a/lgsm/config-default/config-lgsm/kfserver/_default.cfg b/lgsm/config-default/config-lgsm/kfserver/_default.cfg index 25b828a1b..1644f73cc 100644 --- a/lgsm/config-default/config-lgsm/kfserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/kfserver/_default.cfg @@ -91,6 +91,9 @@ logdays="7" # ANSI Colors ansi="on" +# Message Display Time +sleeptime="0.5" + ## SteamCMD Settings # Server appid appid="215360" diff --git a/lgsm/config-default/config-lgsm/l4d2server/_default.cfg b/lgsm/config-default/config-lgsm/l4d2server/_default.cfg index 9bd1b8bac..c7205100c 100644 --- a/lgsm/config-default/config-lgsm/l4d2server/_default.cfg +++ b/lgsm/config-default/config-lgsm/l4d2server/_default.cfg @@ -86,6 +86,9 @@ logdays="7" # ANSI Colors ansi="on" +# Message Display Time +sleeptime="0.5" + ## SteamCMD Settings # Server appid appid="222860" diff --git a/lgsm/config-default/config-lgsm/l4dserver/_default.cfg b/lgsm/config-default/config-lgsm/l4dserver/_default.cfg index d4003b91e..33e562310 100644 --- a/lgsm/config-default/config-lgsm/l4dserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/l4dserver/_default.cfg @@ -86,6 +86,9 @@ logdays="7" # ANSI Colors ansi="on" +# Message Display Time +sleeptime="0.5" + ## SteamCMD Settings # Server appid appid="222840" diff --git a/lgsm/config-default/config-lgsm/mcserver/_default.cfg b/lgsm/config-default/config-lgsm/mcserver/_default.cfg index 5d904a61b..4bfa870df 100644 --- a/lgsm/config-default/config-lgsm/mcserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/mcserver/_default.cfg @@ -81,6 +81,9 @@ logdays="7" # ANSI Colors ansi="on" +# Message Display Time +sleeptime="0.5" + ## LinuxGSM Server Details # Do not edit gamename="Minecraft" diff --git a/lgsm/config-default/config-lgsm/mhserver/_default.cfg b/lgsm/config-default/config-lgsm/mhserver/_default.cfg index 4ae249588..2ad316151 100644 --- a/lgsm/config-default/config-lgsm/mhserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/mhserver/_default.cfg @@ -87,6 +87,9 @@ logdays="7" # ANSI Colors ansi="on" +# Message Display Time +sleeptime="0.5" + ## SteamCMD Settings # Server appid appid="629800" diff --git a/lgsm/config-default/config-lgsm/mtaserver/_default.cfg b/lgsm/config-default/config-lgsm/mtaserver/_default.cfg index 459c2a45e..bc03ccf15 100644 --- a/lgsm/config-default/config-lgsm/mtaserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/mtaserver/_default.cfg @@ -77,6 +77,9 @@ logdays="7" # ANSI Colors ansi="on" +# Message Display Time +sleeptime="0.5" + ## LinuxGSM Server Details # Do not edit gamename="Multi Theft Auto" diff --git a/lgsm/config-default/config-lgsm/mumbleserver/_default.cfg b/lgsm/config-default/config-lgsm/mumbleserver/_default.cfg index c151ff914..d848af88f 100644 --- a/lgsm/config-default/config-lgsm/mumbleserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/mumbleserver/_default.cfg @@ -80,6 +80,9 @@ logdays="7" # ANSI Colors ansi="on" +# Message Display Time +sleeptime="0.5" + ## LinuxGSM Server Details # Do not edit gamename="Mumble" diff --git a/lgsm/config-default/config-lgsm/ndserver/_default.cfg b/lgsm/config-default/config-lgsm/ndserver/_default.cfg index 192bac7e8..cf7712e3e 100644 --- a/lgsm/config-default/config-lgsm/ndserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/ndserver/_default.cfg @@ -87,6 +87,9 @@ logdays="7" # ANSI Colors ansi="on" +# Message Display Time +sleeptime="0.5" + ## SteamCMD Settings # Server appid appid="111710" diff --git a/lgsm/config-default/config-lgsm/nmrihserver/_default.cfg b/lgsm/config-default/config-lgsm/nmrihserver/_default.cfg index 9de8fd81e..10d7696a6 100644 --- a/lgsm/config-default/config-lgsm/nmrihserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/nmrihserver/_default.cfg @@ -92,6 +92,9 @@ logdays="7" # ANSI Colors ansi="on" +# Message Display Time +sleeptime="0.5" + ## SteamCMD Settings # Server appid appid="317670" diff --git a/lgsm/config-default/config-lgsm/ns2cserver/_default.cfg b/lgsm/config-default/config-lgsm/ns2cserver/_default.cfg index 7398c3cb9..f8de5a44c 100644 --- a/lgsm/config-default/config-lgsm/ns2cserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/ns2cserver/_default.cfg @@ -94,6 +94,9 @@ logdays="7" # ANSI Colors ansi="on" +# Message Display Time +sleeptime="0.5" + ## SteamCMD Settings # Server appid appid="313900" diff --git a/lgsm/config-default/config-lgsm/ns2server/_default.cfg b/lgsm/config-default/config-lgsm/ns2server/_default.cfg index 3786e558c..2f7e602ca 100644 --- a/lgsm/config-default/config-lgsm/ns2server/_default.cfg +++ b/lgsm/config-default/config-lgsm/ns2server/_default.cfg @@ -98,6 +98,9 @@ logdays="7" # ANSI Colors ansi="on" +# Message Display Time +sleeptime="0.5" + ## SteamCMD Settings # Server appid appid="4940" diff --git a/lgsm/config-default/config-lgsm/nsserver/_default.cfg b/lgsm/config-default/config-lgsm/nsserver/_default.cfg index 25c22e9dd..1a5f8db9c 100644 --- a/lgsm/config-default/config-lgsm/nsserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/nsserver/_default.cfg @@ -86,6 +86,9 @@ logdays="7" # ANSI Colors ansi="on" +# Message Display Time +sleeptime="0.5" + ## SteamCMD Settings # Server appid appid="90" diff --git a/lgsm/config-default/config-lgsm/opforserver/_default.cfg b/lgsm/config-default/config-lgsm/opforserver/_default.cfg index b7f449e28..3618a40c1 100644 --- a/lgsm/config-default/config-lgsm/opforserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/opforserver/_default.cfg @@ -86,6 +86,9 @@ logdays="7" # ANSI Colors ansi="on" +# Message Display Time +sleeptime="0.5" + ## SteamCMD Settings # Server appid appid="90" diff --git a/lgsm/config-default/config-lgsm/pcserver/_default.cfg b/lgsm/config-default/config-lgsm/pcserver/_default.cfg index 2dd4f0514..8b0f7ce78 100644 --- a/lgsm/config-default/config-lgsm/pcserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/pcserver/_default.cfg @@ -79,6 +79,9 @@ logdays="7" # ANSI Colors ansi="on" +# Message Display Time +sleeptime="0.5" + ## SteamCMD Settings # Server appid appid="332670" diff --git a/lgsm/config-default/config-lgsm/pstbsserver/_default.cfg b/lgsm/config-default/config-lgsm/pstbsserver/_default.cfg index b331cc134..3bb8dd0e4 100644 --- a/lgsm/config-default/config-lgsm/pstbsserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/pstbsserver/_default.cfg @@ -90,6 +90,9 @@ logdays="7" # ANSI Colors ansi="on" +# Message Display Time +sleeptime="0.5" + ## SteamCMD Settings # Server appid appid="746200" diff --git a/lgsm/config-default/config-lgsm/pvkiiserver/_default.cfg b/lgsm/config-default/config-lgsm/pvkiiserver/_default.cfg index b75b07348..1a197d8f1 100644 --- a/lgsm/config-default/config-lgsm/pvkiiserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/pvkiiserver/_default.cfg @@ -87,6 +87,9 @@ logdays="7" # ANSI Colors ansi="on" +# Message Display Time +sleeptime="0.5" + ## SteamCMD Settings # Server appid appid="17575" diff --git a/lgsm/config-default/config-lgsm/pzserver/_default.cfg b/lgsm/config-default/config-lgsm/pzserver/_default.cfg index 179c7dd34..5aadad897 100644 --- a/lgsm/config-default/config-lgsm/pzserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/pzserver/_default.cfg @@ -82,6 +82,9 @@ logdays="7" # ANSI Colors ansi="on" +# Message Display Time +sleeptime="0.5" + ## SteamCMD Settings # Server appid appid="380870" diff --git a/lgsm/config-default/config-lgsm/q2server/_default.cfg b/lgsm/config-default/config-lgsm/q2server/_default.cfg index 6eac2ebd8..c109e7bcf 100644 --- a/lgsm/config-default/config-lgsm/q2server/_default.cfg +++ b/lgsm/config-default/config-lgsm/q2server/_default.cfg @@ -81,6 +81,9 @@ logdays="7" # ANSI Colors ansi="on" +# Message Display Time +sleeptime="0.5" + ## LinuxGSM Server Details # Do not edit gamename="Quake 2" diff --git a/lgsm/config-default/config-lgsm/q3server/_default.cfg b/lgsm/config-default/config-lgsm/q3server/_default.cfg index fdbd4acec..89491a537 100644 --- a/lgsm/config-default/config-lgsm/q3server/_default.cfg +++ b/lgsm/config-default/config-lgsm/q3server/_default.cfg @@ -81,6 +81,9 @@ logdays="7" # ANSI Colors ansi="on" +# Message Display Time +sleeptime="0.5" + ## LinuxGSM Server Details # Do not edit gamename="Quake 3: Arena" diff --git a/lgsm/config-default/config-lgsm/qlserver/_default.cfg b/lgsm/config-default/config-lgsm/qlserver/_default.cfg index d77f20c5a..b4ac70336 100644 --- a/lgsm/config-default/config-lgsm/qlserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/qlserver/_default.cfg @@ -81,6 +81,9 @@ logdays="7" # ANSI Colors ansi="on" +# Message Display Time +sleeptime="0.5" + ## SteamCMD Settings # Server appid appid="349090" diff --git a/lgsm/config-default/config-lgsm/qwserver/_default.cfg b/lgsm/config-default/config-lgsm/qwserver/_default.cfg index 07ed79cf6..dad680aa8 100644 --- a/lgsm/config-default/config-lgsm/qwserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/qwserver/_default.cfg @@ -80,6 +80,9 @@ logdays="7" # ANSI Colors ansi="on" +# Message Display Time +sleeptime="0.5" + ## LinuxGSM Server Details # Do not edit gamename="QuakeWorld" diff --git a/lgsm/config-default/config-lgsm/ricochetserver/_default.cfg b/lgsm/config-default/config-lgsm/ricochetserver/_default.cfg index 51c34163b..1e4848403 100644 --- a/lgsm/config-default/config-lgsm/ricochetserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/ricochetserver/_default.cfg @@ -86,6 +86,9 @@ logdays="7" # ANSI Colors ansi="on" +# Message Display Time +sleeptime="0.5" + ## SteamCMD Settings # Server appid appid="90" diff --git a/lgsm/config-default/config-lgsm/roserver/_default.cfg b/lgsm/config-default/config-lgsm/roserver/_default.cfg index 8ac336381..6402a7c51 100644 --- a/lgsm/config-default/config-lgsm/roserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/roserver/_default.cfg @@ -87,6 +87,9 @@ logdays="7" # ANSI Colors ansi="on" +# Message Display Time +sleeptime="0.5" + ## SteamCMD Settings # Server appid appid="223250" diff --git a/lgsm/config-default/config-lgsm/rtcwserver/_default.cfg b/lgsm/config-default/config-lgsm/rtcwserver/_default.cfg index a863c5425..2c753f26d 100644 --- a/lgsm/config-default/config-lgsm/rtcwserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/rtcwserver/_default.cfg @@ -81,6 +81,9 @@ logdays="7" # ANSI Colors ansi="on" +# Message Display Time +sleeptime="0.5" + ## LinuxGSM Server Details # Do not edit gamename="Return to Castle Wolfenstein" diff --git a/lgsm/config-default/config-lgsm/rustserver/_default.cfg b/lgsm/config-default/config-lgsm/rustserver/_default.cfg index df590c2f3..b5e56db5b 100644 --- a/lgsm/config-default/config-lgsm/rustserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/rustserver/_default.cfg @@ -111,6 +111,9 @@ logdays="7" # ANSI Colors ansi="on" +# Message Display Time +sleeptime="0.5" + ## SteamCMD Settings # Server appid appid="258550" diff --git a/lgsm/config-default/config-lgsm/rwserver/_default.cfg b/lgsm/config-default/config-lgsm/rwserver/_default.cfg index ace8d23ae..56d6d4526 100644 --- a/lgsm/config-default/config-lgsm/rwserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/rwserver/_default.cfg @@ -82,6 +82,9 @@ logdays="7" # ANSI Colors ansi="on" +# Message Display Time +sleeptime="0.5" + ## SteamCMD Settings # Server appid appid="339010" diff --git a/lgsm/config-default/config-lgsm/sampserver/_default.cfg b/lgsm/config-default/config-lgsm/sampserver/_default.cfg index 5302a842b..40a49ae93 100644 --- a/lgsm/config-default/config-lgsm/sampserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/sampserver/_default.cfg @@ -80,6 +80,9 @@ logdays="7" # ANSI Colors ansi="on" +# Message Display Time +sleeptime="0.5" + ## LinuxGSM Server Details # Do not edit gamename="San Andreas Multiplayer" diff --git a/lgsm/config-default/config-lgsm/sbotsserver/_default.cfg b/lgsm/config-default/config-lgsm/sbotsserver/_default.cfg index 72e55c0a4..61ad1d74b 100644 --- a/lgsm/config-default/config-lgsm/sbotsserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/sbotsserver/_default.cfg @@ -84,6 +84,9 @@ logdays="7" # ANSI Colors ansi="on" +# Message Display Time +sleeptime="0.5" + ## SteamCMD Settings # Server appid appid="974130" diff --git a/lgsm/config-default/config-lgsm/sbserver/_default.cfg b/lgsm/config-default/config-lgsm/sbserver/_default.cfg index 2d76ce0b3..8026983fe 100644 --- a/lgsm/config-default/config-lgsm/sbserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/sbserver/_default.cfg @@ -86,6 +86,9 @@ logdays="7" # ANSI Colors ansi="on" +# Message Display Time +sleeptime="0.5" + ## SteamCMD Settings # Server appid appid="211820" diff --git a/lgsm/config-default/config-lgsm/sdtdserver/_default.cfg b/lgsm/config-default/config-lgsm/sdtdserver/_default.cfg index 59a6d9eb7..b1d94ee0f 100644 --- a/lgsm/config-default/config-lgsm/sdtdserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/sdtdserver/_default.cfg @@ -82,6 +82,9 @@ logdays="7" # ANSI Colors ansi="on" +# Message Display Time +sleeptime="0.5" + ## SteamCMD Settings # Server appid appid="294420" diff --git a/lgsm/config-default/config-lgsm/squadserver/_default.cfg b/lgsm/config-default/config-lgsm/squadserver/_default.cfg index e947bb462..a4f2c704e 100644 --- a/lgsm/config-default/config-lgsm/squadserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/squadserver/_default.cfg @@ -84,6 +84,9 @@ logdays="7" # ANSI Colors ansi="on" +# Message Display Time +sleeptime="0.5" + ## SteamCMD Settings # Server appid appid="403240" diff --git a/lgsm/config-default/config-lgsm/ss3server/_default.cfg b/lgsm/config-default/config-lgsm/ss3server/_default.cfg index 563a93c4d..8a79c7954 100644 --- a/lgsm/config-default/config-lgsm/ss3server/_default.cfg +++ b/lgsm/config-default/config-lgsm/ss3server/_default.cfg @@ -83,6 +83,9 @@ logdays="7" # ANSI Colors ansi="on" +# Message Display Time +sleeptime="0.5" + ## SteamCMD Settings # Server appid appid="41080" diff --git a/lgsm/config-default/config-lgsm/stserver/_default.cfg b/lgsm/config-default/config-lgsm/stserver/_default.cfg index 1b4bef940..9492cb311 100644 --- a/lgsm/config-default/config-lgsm/stserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/stserver/_default.cfg @@ -89,6 +89,9 @@ logdays="7" # ANSI Colors ansi="on" +# Message Display Time +sleeptime="0.5" + ## SteamCMD Settings # Server appid appid="600760" diff --git a/lgsm/config-default/config-lgsm/svenserver/_default.cfg b/lgsm/config-default/config-lgsm/svenserver/_default.cfg index 34a1a70f0..dd434be27 100644 --- a/lgsm/config-default/config-lgsm/svenserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/svenserver/_default.cfg @@ -86,6 +86,9 @@ logdays="7" # ANSI Colors ansi="on" +# Message Display Time +sleeptime="0.5" + ## SteamCMD Settings # Server appid appid="276060" diff --git a/lgsm/config-default/config-lgsm/terrariaserver/_default.cfg b/lgsm/config-default/config-lgsm/terrariaserver/_default.cfg index 9dc763f19..a099b3fb2 100644 --- a/lgsm/config-default/config-lgsm/terrariaserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/terrariaserver/_default.cfg @@ -86,6 +86,9 @@ logdays="7" # ANSI Colors ansi="on" +# Message Display Time +sleeptime="0.5" + ## SteamCMD Settings # Server appid appid="105600" diff --git a/lgsm/config-default/config-lgsm/tf2server/_default.cfg b/lgsm/config-default/config-lgsm/tf2server/_default.cfg index 92eaa64b4..e0a429d99 100644 --- a/lgsm/config-default/config-lgsm/tf2server/_default.cfg +++ b/lgsm/config-default/config-lgsm/tf2server/_default.cfg @@ -92,6 +92,9 @@ logdays="7" # ANSI Colors ansi="on" +# Message Display Time +sleeptime="0.5" + ## SteamCMD Settings # Server appid appid="232250" diff --git a/lgsm/config-default/config-lgsm/tfcserver/_default.cfg b/lgsm/config-default/config-lgsm/tfcserver/_default.cfg index d31998a0b..5f2184566 100644 --- a/lgsm/config-default/config-lgsm/tfcserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/tfcserver/_default.cfg @@ -86,6 +86,9 @@ logdays="7" # ANSI Colors ansi="on" +# Message Display Time +sleeptime="0.5" + ## SteamCMD Settings # Server appid appid="90" diff --git a/lgsm/config-default/config-lgsm/ts3server/_default.cfg b/lgsm/config-default/config-lgsm/ts3server/_default.cfg index f448c2f09..66787fc67 100644 --- a/lgsm/config-default/config-lgsm/ts3server/_default.cfg +++ b/lgsm/config-default/config-lgsm/ts3server/_default.cfg @@ -75,6 +75,9 @@ logdays="7" # ANSI Colors ansi="on" +# Message Display Time +sleeptime="0.5" + ## LinuxGSM Server Details # Do not edit gamename="TeamSpeak 3" diff --git a/lgsm/config-default/config-lgsm/tuserver/_default.cfg b/lgsm/config-default/config-lgsm/tuserver/_default.cfg index 91544d2f1..6764131da 100644 --- a/lgsm/config-default/config-lgsm/tuserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/tuserver/_default.cfg @@ -89,6 +89,9 @@ logdays="7" # ANSI Colors ansi="on" +# Message Display Time +sleeptime="0.5" + ## SteamCMD Settings # Server appid appid="439660" diff --git a/lgsm/config-default/config-lgsm/twserver/_default.cfg b/lgsm/config-default/config-lgsm/twserver/_default.cfg index b983e3b21..eee3683c5 100644 --- a/lgsm/config-default/config-lgsm/twserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/twserver/_default.cfg @@ -86,6 +86,9 @@ logdays="7" # ANSI Colors ansi="on" +# Message Display Time +sleeptime="0.5" + ## SteamCMD Settings # Server appid appid="380840" diff --git a/lgsm/config-default/config-lgsm/untserver/_default.cfg b/lgsm/config-default/config-lgsm/untserver/_default.cfg index 26db0910b..b6cbf28a5 100644 --- a/lgsm/config-default/config-lgsm/untserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/untserver/_default.cfg @@ -93,6 +93,9 @@ logdays="7" # ANSI Colors ansi="on" +# Message Display Time +sleeptime="0.5" + ## SteamCMD Settings # Server appid appid="304930" diff --git a/lgsm/config-default/config-lgsm/ut2k4server/_default.cfg b/lgsm/config-default/config-lgsm/ut2k4server/_default.cfg index 5f32042df..8f5475533 100644 --- a/lgsm/config-default/config-lgsm/ut2k4server/_default.cfg +++ b/lgsm/config-default/config-lgsm/ut2k4server/_default.cfg @@ -80,6 +80,9 @@ logdays="7" # ANSI Colors ansi="on" +# Message Display Time +sleeptime="0.5" + ## LinuxGSM Server Details # Do not edit gamename="Unreal Tournament 2004" diff --git a/lgsm/config-default/config-lgsm/ut3server/_default.cfg b/lgsm/config-default/config-lgsm/ut3server/_default.cfg index 1716e3c0f..3c001c769 100644 --- a/lgsm/config-default/config-lgsm/ut3server/_default.cfg +++ b/lgsm/config-default/config-lgsm/ut3server/_default.cfg @@ -91,6 +91,9 @@ logdays="7" # ANSI Colors ansi="on" +# Message Display Time +sleeptime="0.5" + ## LinuxGSM Server Details # Do not edit gamename="Unreal Tournament 3" diff --git a/lgsm/config-default/config-lgsm/ut99server/_default.cfg b/lgsm/config-default/config-lgsm/ut99server/_default.cfg index 9942968d1..f69c5b7d3 100644 --- a/lgsm/config-default/config-lgsm/ut99server/_default.cfg +++ b/lgsm/config-default/config-lgsm/ut99server/_default.cfg @@ -80,6 +80,9 @@ logdays="7" # ANSI Colors ansi="on" +# Message Display Time +sleeptime="0.5" + ## LinuxGSM Server Details # Do not edit gamename="Unreal Tournament 99" diff --git a/lgsm/config-default/config-lgsm/utserver/_default.cfg b/lgsm/config-default/config-lgsm/utserver/_default.cfg index 8f81eb7da..32ed512e4 100644 --- a/lgsm/config-default/config-lgsm/utserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/utserver/_default.cfg @@ -84,6 +84,9 @@ logdays="7" # ANSI Colors ansi="on" +# Message Display Time +sleeptime="0.5" + ## LinuxGSM Server Details # Do not edit gamename="Unreal Tournament" diff --git a/lgsm/config-default/config-lgsm/vsserver/_default.cfg b/lgsm/config-default/config-lgsm/vsserver/_default.cfg index e6e85f0f9..ee0fcbbb4 100644 --- a/lgsm/config-default/config-lgsm/vsserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/vsserver/_default.cfg @@ -86,6 +86,9 @@ logdays="7" # ANSI Colors ansi="on" +# Message Display Time +sleeptime="0.5" + ## SteamCMD Settings # Server appid appid="90" diff --git a/lgsm/config-default/config-lgsm/wetserver/_default.cfg b/lgsm/config-default/config-lgsm/wetserver/_default.cfg index 31daa3252..64032b699 100644 --- a/lgsm/config-default/config-lgsm/wetserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/wetserver/_default.cfg @@ -76,6 +76,9 @@ logdays="7" # ANSI Colors ansi="on" +# Message Display Time +sleeptime="0.5" + ## LinuxGSM Server Details # Do not edit gamename="Wolfenstein: Enemy Territory" diff --git a/lgsm/config-default/config-lgsm/wurmserver/_default.cfg b/lgsm/config-default/config-lgsm/wurmserver/_default.cfg index c57f1f7c0..479c6eebc 100644 --- a/lgsm/config-default/config-lgsm/wurmserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/wurmserver/_default.cfg @@ -78,6 +78,9 @@ logdays="7" # ANSI Colors ansi="on" +# Message Display Time +sleeptime="0.5" + ## SteamCMD Settings # Server appid appid="402370" diff --git a/lgsm/config-default/config-lgsm/zpsserver/_default.cfg b/lgsm/config-default/config-lgsm/zpsserver/_default.cfg index 9b9c38347..41f892663 100644 --- a/lgsm/config-default/config-lgsm/zpsserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/zpsserver/_default.cfg @@ -92,6 +92,9 @@ logdays="7" # ANSI Colors ansi="on" +# Message Display Time +sleeptime="0.5" + ## SteamCMD Settings # Server appid appid="17505" diff --git a/lgsm/functions/alert_email.sh b/lgsm/functions/alert_email.sh index d3db30319..f1ceb73e5 100644 --- a/lgsm/functions/alert_email.sh +++ b/lgsm/functions/alert_email.sh @@ -9,7 +9,7 @@ local commandaction="Alert" local function_selfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" fn_print_dots "Sending Email alert: ${email}" -sleep 0.5 +fn_sleep_time if [ -n "${emailfrom}" ]; then mail -s "${alertsubject}" -r "${emailfrom}" "${email}" < "${alertlog}" diff --git a/lgsm/functions/alert_ifttt.sh b/lgsm/functions/alert_ifttt.sh index 07c99dda6..261f3de62 100644 --- a/lgsm/functions/alert_ifttt.sh +++ b/lgsm/functions/alert_ifttt.sh @@ -18,7 +18,6 @@ EOF ) fn_print_dots "Sending IFTTT alert" -sleep 0.5 iftttsend=$(${curlpath} -sSL -H "Content-Type: application/json" -X POST -d """${json}""" "https://maker.ifttt.com/trigger/${iftttevent}/with/key/${ifttttoken}" | grep "Bad Request") if [ -n "${iftttsend}" ]; then @@ -27,4 +26,4 @@ if [ -n "${iftttsend}" ]; then else fn_print_ok_nl "Sending IFTTT alert" fn_script_log_pass "Sent IFTTT alert" -fi \ No newline at end of file +fi diff --git a/lgsm/functions/alert_mailgun.sh b/lgsm/functions/alert_mailgun.sh index d42aaddab..8b32b73a8 100644 --- a/lgsm/functions/alert_mailgun.sh +++ b/lgsm/functions/alert_mailgun.sh @@ -9,7 +9,6 @@ local commandaction="Alert" local function_selfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" fn_print_dots "Sending Email alert: Mailgun: ${email}" -sleep 0.5 mailgunsend=$(${curlpath} -s --user "api:${mailguntoken}" \ -F from="LinuxGSM <${mailgunemailfrom}>" \ @@ -25,4 +24,4 @@ if [ -z "${mailgunsend}" ]; then else fn_print_ok_nl "Sending Email alert: Mailgun: ${email}" fn_script_log_pass "Sending Email alert: Mailgun: ${email}" -fi \ No newline at end of file +fi diff --git a/lgsm/functions/alert_pushbullet.sh b/lgsm/functions/alert_pushbullet.sh index aebef54ab..72995a70f 100644 --- a/lgsm/functions/alert_pushbullet.sh +++ b/lgsm/functions/alert_pushbullet.sh @@ -19,7 +19,6 @@ EOF ) fn_print_dots "Sending Pushbullet alert" -sleep 0.5 pushbulletsend=$(${curlpath} -sSL -u """${pushbullettoken}"":" -H "Content-Type: application/json" -X POST -d """${json}""" "https://api.pushbullet.com/v2/pushes" | grep "error_code") if [ -n "${pushbulletsend}" ]; then diff --git a/lgsm/functions/alert_pushover.sh b/lgsm/functions/alert_pushover.sh index d25e598c6..352737261 100644 --- a/lgsm/functions/alert_pushover.sh +++ b/lgsm/functions/alert_pushover.sh @@ -9,7 +9,6 @@ local commandaction="Alert" local function_selfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" fn_print_dots "Sending Pushover alert" -sleep 0.5 # Different alerts are given different priorities and notification sounds if [ "${alertsound}" == "1" ]; then @@ -32,4 +31,4 @@ if [ -n "${pushoversend}" ]; then else fn_print_ok_nl "Sending Pushover alert" fn_script_log_pass "Sent Pushover alert" -fi \ No newline at end of file +fi diff --git a/lgsm/functions/alert_telegram.sh b/lgsm/functions/alert_telegram.sh index 647ea7008..331c0a6de 100644 --- a/lgsm/functions/alert_telegram.sh +++ b/lgsm/functions/alert_telegram.sh @@ -18,7 +18,6 @@ EOF ) fn_print_dots "Sending Telegram alert" -sleep 0.5 telegramsend=$(${curlpath} -sSL -H "Content-Type: application/json" -X POST -d """${json}""" "https://api.telegram.org/bot${telegramtoken}/sendMessage" ${curlcustomstring} | grep "error_code") if [ -n "${telegramsend}" ]; then diff --git a/lgsm/functions/check_config.sh b/lgsm/functions/check_config.sh index dff515742..2f507808b 100644 --- a/lgsm/functions/check_config.sh +++ b/lgsm/functions/check_config.sh @@ -10,12 +10,10 @@ local function_selfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" if [ ! -e "${servercfgfullpath}" ]; then if [ "${shortname}" != "hw" ]&&[ "${shortname}" != "ut3" ]&&[ "${shortname}" != "kf2" ]; then fn_print_dots "" - sleep 0.5 fn_print_warn_nl "Configuration file missing!" echo "${servercfgfullpath}" fn_script_log_warn "Configuration file missing!" fn_script_log_warn "${servercfgfullpath}" - sleep 1 install_config.sh fi fi @@ -23,7 +21,6 @@ fi if [ "${shortname}" == "rust" ]; then if [ -z "${rconpassword}" ]; then fn_print_dots "" - sleep 0.5 fn_print_fail_nl "RCON password is not set!" echo " * Not setting an RCON password causes issues with ${gamename}" fn_script_log_fatal "RCON password is not set" @@ -31,10 +28,8 @@ if [ "${shortname}" == "rust" ]; then core_exit.sh elif [ "${rconpassword}" == "CHANGE_ME" ]; then fn_print_dots "" - sleep 0.5 fn_print_warn_nl "Default RCON Password detected!" echo " * Having ${rconpassword} as a password is not very safe." fn_script_log_warn "Default RCON Password detected" - sleep 2 fi fi diff --git a/lgsm/functions/check_deps.sh b/lgsm/functions/check_deps.sh index 351c848d3..d69926f8f 100644 --- a/lgsm/functions/check_deps.sh +++ b/lgsm/functions/check_deps.sh @@ -9,7 +9,6 @@ local commandname="CHECK" fn_install_mono_repo(){ if [ "${monostatus}" != "0" ]; then fn_print_dots "Adding Mono repository" - sleep 0.5 if [ "${autoinstall}" == "1" ]; then sudo -n true > /dev/null 2>&1 else @@ -107,7 +106,6 @@ fn_install_universe_repo(){ if [ "${jquniversemissing}" != "0" ]&&[ "${distroid}" == "ubuntu" ]; then fn_print_warning_nl "Ubuntu 18.04.1 contains a bug which means the sources.list file does not populate with the Ubuntu universe repository." fn_print_information_nl "Attempting to add Universe Repo" - sleep 0.5 if [ "${autoinstall}" == "1" ]; then sudo -n true > /dev/null 2>&1 else @@ -180,14 +178,14 @@ fn_deps_detector(){ missingdep=0 if [ "${function_selfname}" == "command_install.sh" ]; then echo -e "${green}${deptocheck}${default}" - sleep 0.2 + fn_sleep_time fi else # if dependency is not found missingdep=1 if [ "${function_selfname}" == "command_install.sh" ]; then echo -e "${red}${deptocheck}${default}" - sleep 0.2 + fn_sleep_time fi # Define required dependencies for SteamCMD if [ -n "${appid}" ]; then @@ -231,7 +229,7 @@ fn_found_missing_deps(){ fn_print_warning_nl "Missing dependencies: ${red}${array_deps_missing[@]}${default}" fn_script_log_warn "Missing dependencies: ${array_deps_missing[@]}" - sleep 0.5 + fn_sleep_time if [ -n "${monostatus}" ]; then fn_install_mono_repo fi @@ -553,7 +551,7 @@ if [ "${function_selfname}" == "command_install.sh" ]; then echo "=================================" fn_print_information_nl "Checking any missing dependencies for ${gamename} server only." fn_print_information_nl "This will NOT install a ${gamename} server." - sleep 2 + fn_sleep_time else echo "" echo "Checking Dependencies" diff --git a/lgsm/functions/check_glibc.sh b/lgsm/functions/check_glibc.sh index d353ed8af..7abf46dd1 100644 --- a/lgsm/functions/check_glibc.sh +++ b/lgsm/functions/check_glibc.sh @@ -13,12 +13,10 @@ if [ "${glibcrequired}" == "NOT REQUIRED" ]; then : elif [ "$(printf '%s\n'${glibcrequired}'\n' "${glibcversion}" | sort -V | head -n 1)" != "${glibcrequired}" ]||[ "${glibcrequired}" == "UNKNOWN" ]; then fn_print_dots "Glibc" - sleep 0.5 fn_print_error_nl "glibc: ${red}glibc distro version ${glibcversion} too old${default}" echo -en "\n" echo -e " * glibc required: ${glibcrequired}" echo -e " * glibc installed: ${red}${glibcversion}${default}" echo -en "\n" fn_print_information "The game server will probably not work. A distro upgrade is required!" - sleep 2 -fi \ No newline at end of file +fi diff --git a/lgsm/functions/check_ip.sh b/lgsm/functions/check_ip.sh index ba0fd6ece..d9390ac0e 100644 --- a/lgsm/functions/check_ip.sh +++ b/lgsm/functions/check_ip.sh @@ -21,7 +21,6 @@ if [ "${shortname}" != "ts3" ]&&[ "${shortname}" != "mumble" ]&&[ "${travistest} # IP is not set to specific IP if [ "${ip}" == "0.0.0.0" ]||[ "${ip}" == "" ]; then fn_print_dots "Check IP" - sleep 0.2 # Multiple interfaces if [ "${getipwc}" -ge "2" ]; then if [ "${function_selfname}" == "command_details.sh" ]; then @@ -29,7 +28,6 @@ if [ "${shortname}" != "ts3" ]&&[ "${shortname}" != "mumble" ]&&[ "${travistest} else fn_print_fail "Check IP: Multiple IP addresses found." fi - sleep 0.2 echo -en "\n" # IP is set within game config if [ "${ipsetinconfig}" == "1" ]; then @@ -66,7 +64,6 @@ if [ "${shortname}" != "ts3" ]&&[ "${shortname}" != "mumble" ]&&[ "${travistest} # Single interface elif [ "${ipsetinconfig}" == "1" ]; then fn_print_fail "Check IP: IP address not set in game config." - sleep 0.5 echo -en "\n" fn_print_information "Specify the IP you want to bind within ${servercfg}.\n" echo -en " * location: ${servercfgfullpath}\n" @@ -85,7 +82,6 @@ if [ "${shortname}" != "ts3" ]&&[ "${shortname}" != "mumble" ]&&[ "${travistest} else fn_print_info_nl "Check IP: ${getip}" fn_script_log_info "IP automatically set as: ${getip}" - sleep 0.2 ip="${getip}" fi fi diff --git a/lgsm/functions/check_logs.sh b/lgsm/functions/check_logs.sh index 717e53ada..1a71f3dfd 100644 --- a/lgsm/functions/check_logs.sh +++ b/lgsm/functions/check_logs.sh @@ -9,7 +9,6 @@ local function_selfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" 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 diff --git a/lgsm/functions/check_permissions.sh b/lgsm/functions/check_permissions.sh index f1bca798d..e1c0cabd7 100644 --- a/lgsm/functions/check_permissions.sh +++ b/lgsm/functions/check_permissions.sh @@ -171,7 +171,7 @@ fn_sys_perm_fix_manually_msg(){ 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 0.5 + fn_sleep_time if [ "${monitorflag}" == 1 ]; then alert="permissions" alert.sh @@ -184,7 +184,6 @@ fn_sys_perm_errors_fix(){ sudo -n true > /dev/null 2>&1 if [ $? -eq 0 ]; then fn_print_dots "Automatically fixing /sys permissions" - sleep 0.5 fn_script_log_info "Automatically fixing /sys permissions." if [ "${sysdirpermerror}" == "1" ]; then sudo chmod a+rx "/sys" @@ -200,13 +199,12 @@ fn_sys_perm_errors_fix(){ if [ "${sysdirpermerror}" == "1" ]||[ "${classdirpermerror}" == "1" ]||[ "${netdirpermerror}" == "1" ]; then fn_print_error "Could not fix /sys permissions" fn_script_log_error "Could not fix /sys permissions." - sleep 0.5 + fn_sleep_time # Show the user how to fix fn_sys_perm_fix_manually_msg else fn_print_ok_nl "Automatically fixing /sys permissions" fn_script_log_pass "Permissions in /sys fixed" - sleep 0.5 fi else # Show the user how to fix @@ -221,7 +219,6 @@ fn_sys_perm_error_process(){ if [ "${sysdirpermerror}" == "1" ]||[ "${classdirpermerror}" == "1" ]||[ "${netdirpermerror}" == "1" ]; then fn_print_error_nl "Permission error(s) found in /sys" fn_script_log_error "Permission error(s) found in /sys" - sleep 0.5 # Run the fix fn_sys_perm_errors_fix fi diff --git a/lgsm/functions/check_steamcmd.sh b/lgsm/functions/check_steamcmd.sh index f47abf359..518696e0e 100644 --- a/lgsm/functions/check_steamcmd.sh +++ b/lgsm/functions/check_steamcmd.sh @@ -52,7 +52,6 @@ fn_check_steamcmd_sh(){ else fn_print_error_nl "SteamCMD is missing" fn_script_log_error "SteamCMD is missing" - sleep 0.5 fn_install_steamcmd fi elif [ "${function_selfname}" == "command_install.sh" ]; then diff --git a/lgsm/functions/check_system_requirements.sh b/lgsm/functions/check_system_requirements.sh index 96a73f8e6..d0cf9bf8d 100644 --- a/lgsm/functions/check_system_requirements.sh +++ b/lgsm/functions/check_system_requirements.sh @@ -42,11 +42,9 @@ fi if [ -n "${ramrequirementmb}" ]; then if [ "${physmemtotalmb}" -lt "${ramrequirementmb}" ]; then fn_print_dots "Check RAM" - sleep 0.5 # Warn the user fn_print_warn_nl "Check RAM: ${ramrequirementgb}G required, ${physmemtotal} available" - sleep 0.5 echo " * ${gamename} server may fail to run or experience poor performance." - sleep 0.5 + fn_sleep_time fi fi diff --git a/lgsm/functions/command_backup.sh b/lgsm/functions/command_backup.sh index c5d48e202..c5530440d 100644 --- a/lgsm/functions/command_backup.sh +++ b/lgsm/functions/command_backup.sh @@ -17,7 +17,6 @@ fn_backup_trap(){ echo -en "backup ${backupname}.tar.gz..." fn_print_canceled_eol_nl fn_script_log_info "Backup ${backupname}.tar.gz: CANCELED" - sleep 0.5 rm -f "${backupdir}/${backupname}.tar.gz" | tee -a "${lgsmlog}" echo -en "backup ${backupname}.tar.gz..." fn_print_removed_eol_nl @@ -44,10 +43,7 @@ fn_backup_init(){ info_distro.sh fn_print_dots "Backup starting" fn_script_log_info "Backup starting" - sleep 0.5 - fn_print_ok "Backup starting" - sleep 0.5 - echo -en "\n" + fn_print_ok_nl "Backup starting" if [ ! -d "${backupdir}" ]||[ "${backupcount}" == "0" ]; then fn_print_info_nl "There are no previous backups" else @@ -59,7 +55,6 @@ fn_backup_init(){ daysago="${lastbackupdaysago} days ago" fi echo " * Previous backup was created ${daysago}, total size ${lastbackupsize}" - sleep 0.5 fi } @@ -80,7 +75,6 @@ fn_backup_stop_server(){ else fn_print_warn_nl "${servicename} will be stopped during the backup" fn_script_log_warn "${servicename} will be stopped during the backup" - sleep 5 serverstopped="yes" exitbypass=1 command_stop.sh @@ -109,7 +103,6 @@ fn_backup_compression(){ # Tells how much will be compressed using rootdirduexbackup value from info_distro and prompt for continue fn_print_info "A total of ${rootdirduexbackup} will be compressed." fn_script_log_info "A total of ${rootdirduexbackup} will be compressed: ${backupdir}/${backupname}.tar.gz" - sleep 2 fn_print_dots "Backup (${rootdirduexbackup}) ${backupname}.tar.gz, in progress..." fn_script_log_info "backup ${rootdirduexbackup} ${backupname}.tar.gz, in progress" excludedir=$(fn_backup_relpath) @@ -131,7 +124,6 @@ fn_backup_compression(){ fn_script_log_fatal "Starting backup" else fn_print_ok_eol - sleep 0.5 fn_print_ok_nl "Completed: ${backupname}.tar.gz, total size $(du -sh "${backupdir}/${backupname}.tar.gz" | awk '{print $1}')" fn_script_log_pass "Backup created: ${backupname}.tar.gz, total size $(du -sh "${backupdir}/${backupname}.tar.gz" | awk '{print $1}')" fi @@ -153,18 +145,15 @@ fn_backup_prune(){ if [ "${backupquotadiff}" -gt "0" ]||[ "${backupsoudatedcount}" -gt "0" ]; then fn_print_dots "Pruning" fn_script_log_info "Backup pruning activated" - sleep 0.5 fn_print_ok_nl "Pruning" - sleep 0.5 # If maxbackups greater or equal to backupsoutdatedcount, then it is over maxbackupdays if [ "${backupquotadiff}" -ge "${backupsoudatedcount}" ]; then # Display how many backups will be cleared echo " * Pruning: ${backupquotadiff} backup(s) has exceeded the ${maxbackups} backups limit" fn_script_log_info "Pruning: ${backupquotadiff} backup(s) has exceeded the ${maxbackups} backups limit" - sleep 0.5 + fn_sleep_time fn_print_dots "Pruning: Clearing ${backupquotadiff} backup(s)" fn_script_log_info "Pruning: Clearing ${backupquotadiff} backup(s)" - sleep 0.5 # Clear backups over quota find "${backupdir}"/ -type f -name "*.tar.gz" -printf '%T@ %p\n' | sort -rn | tail -${backupquotadiff} | cut -f2- -d" " | xargs rm fn_print_ok_nl "Pruning: Clearing ${backupquotadiff} backup(s)" @@ -174,16 +163,14 @@ fn_backup_prune(){ # Display how many backups will be cleared echo " * Pruning: ${backupsoudatedcount} backup(s) are older than ${maxbackupdays} days." fn_script_log_info "Pruning: ${backupsoudatedcount} backup(s) older than ${maxbackupdays} days." - sleep 0.5 + fn_sleep_time fn_print_dots "Pruning: Clearing ${backupquotadiff} backup(s)." fn_script_log_info "Pruning: Clearing ${backupquotadiff} backup(s)" - sleep 0.5 # Clear backups over quota find "${backupdir}"/ -type f -mtime +"${maxbackupdays}" -exec rm -f {} \; fn_print_ok_nl "Pruning: Clearing ${backupquotadiff} backup(s)" fn_script_log_pass "Pruning: Cleared ${backupquotadiff} backup(s)" fi - sleep 0.5 fi fi } diff --git a/lgsm/functions/command_console.sh b/lgsm/functions/command_console.sh index 8daf02105..26f0a4707 100644 --- a/lgsm/functions/command_console.sh +++ b/lgsm/functions/command_console.sh @@ -22,19 +22,16 @@ if ! fn_prompt_yn "Continue?" Y; then echo Exiting; return fi fn_print_dots "Accessing console" -sleep 0.5 check_status.sh if [ "${status}" != "0" ]; then fn_print_ok_nl "Accessing console" fn_script_log_pass "Console accessed" - sleep 0.5 tmux attach-session -t "${servicename}" fn_print_ok_nl "Closing console" fn_script_log_pass "Console closed" else fn_print_error_nl "Server not running" fn_script_log_error "Failed to access: Server not running" - sleep 0.5 if fn_prompt_yn "Do you want to start the server?" Y; then exitbypass=1 command_start.sh diff --git a/lgsm/functions/command_debug.sh b/lgsm/functions/command_debug.sh index 7664ff8be..1ae89fb94 100644 --- a/lgsm/functions/command_debug.sh +++ b/lgsm/functions/command_debug.sh @@ -80,12 +80,10 @@ fi fn_print_info_nl "Stopping any running servers" fn_script_log_info "Stopping any running servers" -sleep 0.5 exitbypass=1 command_stop.sh fn_print_dots "Starting debug" fn_script_log_info "Starting debug" -sleep 0.5 fn_print_ok_nl "Starting debug" # Create lockfile @@ -111,7 +109,6 @@ else fi fn_print_dots "Stopping debug" -sleep 1 fn_print_ok_nl "Stopping debug" # remove trap. trap - INT diff --git a/lgsm/functions/command_fastdl.sh b/lgsm/functions/command_fastdl.sh index 3c0d6b356..f686e6126 100644 --- a/lgsm/functions/command_fastdl.sh +++ b/lgsm/functions/command_fastdl.sh @@ -77,7 +77,7 @@ fn_clear_old_fastdl(){ fn_print_ok_eol_nl fn_script_log_pass "Clearing existing FastDL directory ${fastdldir}" fi - sleep 0.5 + fn_sleep_time fi } @@ -95,7 +95,7 @@ fn_fastdl_dirs(){ fn_print_ok_eol_nl fn_script_log_pass "Creating web directory ${webdir}" fi - sleep 0.5 + fn_sleep_time fi if [ ! -d "${fastdldir}" ]; then echo -en "creating fastdl directory ${fastdldir}..." @@ -109,7 +109,7 @@ fn_fastdl_dirs(){ fn_print_ok_eol_nl fn_script_log_pass "Creating fastdl directory ${fastdldir}" fi - sleep 0.5 + fn_sleep_time fi } @@ -204,7 +204,7 @@ fn_fastdl_preview(){ fi if [ -f "${tmpdir}/fastdl_files_to_compress.txt" ]; then echo "calculating total file size..." - sleep 0.5 + fn_sleep_time totalfiles=$(wc -l < "${tmpdir}/fastdl_files_to_compress.txt") # Calculates total file size while read -r dufile; do @@ -271,7 +271,7 @@ fn_fastdl_gmod(){ fi # Clear addons directory in fastdl echo -en "clearing addons dir from fastdl dir..." - sleep 0.5 + fn_sleep_time rm -R "${fastdldir:?}/addons" exitcode=$? if [ ${exitcode} -ne 0 ]; then @@ -286,7 +286,7 @@ fn_fastdl_gmod(){ # 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..." - sleep 1 + fn_sleep_time cp -Rf "${fastdldir}/lua/"* "${fastdldir}" exitcode=$? if [ ${exitcode} -ne 0 ]; then @@ -331,7 +331,7 @@ fn_fastdl_source(){ ((fileswc++)) tput rc; tput el printf "copying ${directory} ${allowed_extention} : ${fileswc}..." - sleep 0.01 + fn_sleep_time if [ ! -d "${fastdldir}/${directory}" ]; then mkdir "${fastdldir}/${directory}" fi diff --git a/lgsm/functions/command_mods_install.sh b/lgsm/functions/command_mods_install.sh index b26bb9e06..38bc4979a 100644 --- a/lgsm/functions/command_mods_install.sh +++ b/lgsm/functions/command_mods_install.sh @@ -85,7 +85,6 @@ 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 0.5 echo " * Any configs may be overwritten." if ! fn_prompt_yn "Continue?" Y; then echo Exiting; core_exit.sh diff --git a/lgsm/functions/command_mods_remove.sh b/lgsm/functions/command_mods_remove.sh index 7a0eb7dd2..344f9e2a9 100644 --- a/lgsm/functions/command_mods_remove.sh +++ b/lgsm/functions/command_mods_remove.sh @@ -58,7 +58,7 @@ fn_script_log_info "Removing ${modsfilelistsize} files from ${modprettyname}" echo -e "removing ${modprettyname}" echo -e "* ${modsfilelistsize} files to be removed" echo -e "* location: ${modinstalldir}" -sleep 0.5 +fn_sleep_time # Go through every file and remove it modfileline="1" tput sc @@ -87,10 +87,10 @@ if [ ${exitcode} -ne 0 ]; then else fn_print_ok_eol_nl fi -sleep 0.5 +fn_sleep_time # Remove file list echo -en "removing ${modcommand}-files.txt..." -sleep 0.5 +fn_sleep_time rm -rf "${modsdir}/${modcommand}-files.txt" local exitcode=$? if [ ${exitcode} -ne 0 ]; then @@ -104,7 +104,7 @@ fi # Remove mods from installed mods list echo -en "removing ${modcommand} from ${modsinstalledlist}..." -sleep 0.5 +fn_sleep_time sed -i "/^${modcommand}$/d" "${modsinstalledlistfullpath}" local exitcode=$? diff --git a/lgsm/functions/command_mods_update.sh b/lgsm/functions/command_mods_update.sh index b80e4416e..43eb1cb80 100644 --- a/lgsm/functions/command_mods_update.sh +++ b/lgsm/functions/command_mods_update.sh @@ -17,7 +17,7 @@ mods_core.sh fn_remove_cfg_files(){ if [ "${modkeepfiles}" != "OVERWRITE" ]&&[ "${modkeepfiles}" != "NOUPDATE" ]; then echo -e "the following files/directories will be preserved:" - sleep 0.5 + fn_sleep_time # Count how many files there are to remove filestopreserve="$(echo "${modkeepfiles}" | awk -F ';' '{ print NF }')" # Test all subvalues of "modkeepfiles" using the ";" separator @@ -39,7 +39,6 @@ fn_remove_cfg_files(){ } fn_print_dots "Update addons/mods" -sleep 0.5 fn_mods_check_installed fn_print_info_nl "Update addons/mods: ${installedmodscount} addons/mods will be updated" fn_script_log_info "${installedmodscount} mods or addons will be updated" @@ -66,7 +65,6 @@ for ((ulindex=0; ulindex < ${#installedmodslist[@]}; ulindex++)); do echo -e " * ${yellow}${modprettyname}${default} (retain common custom files)" fi done -sleep 0.5 ## Update # List all installed mods and apply update diff --git a/lgsm/functions/command_monitor.sh b/lgsm/functions/command_monitor.sh index 491015bcc..9760380de 100644 --- a/lgsm/functions/command_monitor.sh +++ b/lgsm/functions/command_monitor.sh @@ -18,7 +18,6 @@ for queryattempt in {1..5}; do fn_print_dots "Querying port: ${querymethod}: ${ip}:${queryport} : ${totalseconds}/${queryattempt}: " fn_print_querying_eol fn_script_log_info "Querying port: ${querymethod}: ${ip}:${queryport} : ${queryattempt} : QUERYING" - sleep 0.5 if [ "${querymethod}" == "gamedig" ]; then query_gamedig.sh elif [ "${querymethod}" == "gsquery" ]; then @@ -37,7 +36,6 @@ for queryattempt in {1..5}; do if [ "${querystatus}" == "0" ]; then # Server query OK. - sleep 0.5 fn_print_ok "Querying port: ${querymethod}: ${ip}:${queryport} : ${totalseconds}/${queryattempt}: " fn_print_ok_eol_nl fn_script_log_pass "Querying port: ${querymethod}: ${ip}:${queryport} : ${queryattempt}: OK" @@ -48,7 +46,6 @@ for queryattempt in {1..5}; do fn_script_log_info "Querying port: ${querymethod}: ${ip}:${queryport} : ${queryattempt}: FAIL" fn_print_fail "Querying port: ${querymethod}: ${ip}:${queryport} : ${totalseconds}/${queryattempt}: " fn_print_fail_eol - sleep 0.5 # Monitor try gamedig first then gsquery before restarting. if [ "${querymethod}" == "gsquery" ]; then if [ "${totalseconds}" -ge "59" ]; then @@ -56,7 +53,6 @@ for queryattempt in {1..5}; do fn_print_fail "Querying port: ${querymethod}: ${ip}:${queryport} : ${totalseconds}/${queryattempt}: " fn_print_fail_eol_nl fn_script_log_error "Querying port: ${querymethod}: ${ip}:${queryport} : ${queryattempt}: FAIL" - sleep 0.5 # Send alert if enabled. alert="restartquery" @@ -74,7 +70,6 @@ for queryattempt in {1..5}; do for seconds in {1..15}; do fn_print_fail "Querying port: ${querymethod}: ${ip}:${queryport} : ${totalseconds}/${queryattempt}: WAIT" totalseconds=$((totalseconds + 1)) - sleep 1 if [ "${seconds}" == "15" ]; then break fi @@ -98,7 +93,6 @@ fn_monitor_check_update(){ if [ "$(ps -ef | grep "${selfname} update" | grep -v grep | wc -l)" != "0" ]; then fn_print_error_nl "SteamCMD is currently checking for updates" fn_script_log_error "SteamCMD is currently checking for updates" - sleep 0.5 core_exit.sh fi } @@ -107,7 +101,6 @@ fn_monitor_check_session(){ fn_print_dots "Checking session: " fn_print_checking_eol fn_script_log_info "Checking session: CHECKING" - sleep 0.5 if [ "${status}" != "0" ]; then fn_print_ok "Checking session: " fn_print_ok_eol_nl @@ -125,11 +118,9 @@ fn_monitor_check_session(){ alert="restart" alert.sh fn_script_log_info "Monitor is starting ${servername}" - sleep 0.5 command_restart.sh core_exit.sh fi - sleep 0.5 } fn_monitor_query(){ @@ -185,7 +176,6 @@ fn_monitor_query_upd(){ monitorflag=1 fn_print_dots "${servername}" -sleep 0.5 check.sh logs.sh info_config.sh diff --git a/lgsm/functions/command_postdetails.sh b/lgsm/functions/command_postdetails.sh index 660bb326f..4b34c9f39 100644 --- a/lgsm/functions/command_postdetails.sh +++ b/lgsm/functions/command_postdetails.sh @@ -80,7 +80,6 @@ fi if [ "${posttarget}" == "http://pastebin.com" ] ; then fn_print_dots "Posting details to pastbin.com for ${postexpire}" - sleep 0.5 # grab the return from 'value' from an initial visit to pastebin. csrftoken=$(${curlpath} -s "${posttarget}" | sed -n 's/^.*input type="hidden" name="csrf_token_post" value="\(.*\)".*$/\1/p') @@ -100,7 +99,6 @@ if [ "${posttarget}" == "http://pastebin.com" ] ; then echo " Please share the following url for support: ${pdurl}" elif [ "${posttarget}" == "https://hastebin.com" ] ; then fn_print_dots "Posting details to hastebin.com" - sleep 0.5 # 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 @@ -117,4 +115,4 @@ if [ -z "${alertflag}" ]; then core_exit.sh else alerturl="${pdurl}" -fi \ No newline at end of file +fi diff --git a/lgsm/functions/command_start.sh b/lgsm/functions/command_start.sh index d61907ee0..1ab7b4403 100644 --- a/lgsm/functions/command_start.sh +++ b/lgsm/functions/command_start.sh @@ -15,16 +15,16 @@ fn_start_teamspeak3(){ fn_script_log_warn "${servercfgfullpath} is missing" echo " * Creating blank ${servercfg}" fn_script_log_info "Creating blank ${servercfg}" - sleep 1 + fn_sleep_time echo " * ${servercfg} can remain blank by default." fn_script_log_info "${servercfgfullpath} can remain blank by default." - sleep 1 + fn_sleep_time echo " * ${servercfg} is located in ${servercfgfullpath}." fn_script_log_info "${servercfg} is located in ${servercfgfullpath}." sleep 5 touch "${servercfgfullpath}" fi - sleep 0.5 + fn_sleep_time if [ -f "${lgsmlog}" ]; then mv "${lgsmlog}" "${lgsmlogdate}" fi @@ -40,7 +40,7 @@ fn_start_teamspeak3(){ else ./ts3server_startscript.sh start inifile="${servercfgfullpath}" > /dev/null 2>&1 fi - sleep 0.5 + fn_sleep_time check_status.sh if [ "${status}" == "0" ]; then fn_print_fail_nl "Unable to start ${servername}" @@ -128,14 +128,13 @@ if [ "${consolelogging}" == "off" ]; then echo "Console logging disabled by user" >> "${consolelog}" fn_script_log_info "Console logging disabled by user" fi -sleep 0.5 +fn_sleep_time # If the server fails to start check_status.sh if [ "${status}" == "0" ]; then fn_print_fail_nl "Unable to start ${servername}" fn_script_log_fatal "Unable to start ${servername}" - sleep 0.5 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:" @@ -187,7 +186,6 @@ sleep 0.5 } fn_print_dots "${servername}" -sleep 0.5 check.sh # Is the server already started if [ "${status}" != "0" ]; then # $status comes from check_status.sh, which is run by check.sh for this command diff --git a/lgsm/functions/command_stop.sh b/lgsm/functions/command_stop.sh index fc43476e6..9aadfbe54 100644 --- a/lgsm/functions/command_stop.sh +++ b/lgsm/functions/command_stop.sh @@ -33,7 +33,7 @@ fn_stop_graceful_ctrlc(){ fn_print_fail_eol_nl fn_script_log_error "Graceful: CTRL+c: FAIL" fi - sleep 0.5 + fn_sleep_time } # Attempts graceful shutdown by sending a specified command. @@ -62,7 +62,7 @@ fn_stop_graceful_cmd(){ fn_print_fail_eol_nl fn_script_log_error "Graceful: sending \"${1}\": FAIL" fi - sleep 0.5 + fn_sleep_time } # Attempts graceful of goldsource using rcon 'quit' command. @@ -82,7 +82,6 @@ fn_stop_graceful_goldsource(){ fn_print_ok "Graceful: sending \"quit\": ${seconds}: " fn_print_ok_eol_nl fn_script_log_pass "Graceful: sending \"quit\": OK: ${seconds} seconds" - sleep 0.5 } # Attempts graceful of 7 Days To Die using telnet. @@ -119,13 +118,12 @@ fn_stop_telnet_sdtd(){ expect { eof } puts "Completed.\n" ') - fi + fi } fn_stop_graceful_sdtd(){ fn_print_dots "Graceful: telnet" fn_script_log_info "Graceful: telnet" - sleep 0.5 if [ "${telnetenabled}" == "false" ]; then fn_print_info_nl "Graceful: telnet: DISABLED: Enable in ${servercfg}" elif [ "$(command -v expect 2>/dev/null)" ]; then @@ -133,7 +131,6 @@ fn_stop_graceful_sdtd(){ for telnetip in 127.0.0.1 ${ip}; do fn_print_dots "Graceful: telnet: ${telnetip}:${telnetport}" fn_script_log_info "Graceful: telnet: ${telnetip}:${telnetport}" - sleep 0.5 fn_stop_telnet_sdtd completed=$(echo -en "\n ${sdtd_telnet_shutdown}" | grep "Completed.") refused=$(echo -en "\n ${sdtd_telnet_shutdown}" | grep "Timeout or EOF") @@ -141,7 +138,6 @@ fn_stop_graceful_sdtd(){ fn_print_error "Graceful: telnet: ${telnetip}:${telnetport} : " fn_print_fail_eol_nl fn_script_log_error "Graceful: telnet: ${telnetip}:${telnetport} : FAIL" - sleep 1 elif [ -n "${completed}" ]; then break fi @@ -183,7 +179,7 @@ fn_stop_graceful_sdtd(){ fn_print_fail_eol_nl fn_script_log_warn "Graceful: telnet: expect not installed: FAIL" fi - sleep 0.5 + fn_sleep_time } fn_stop_graceful_select(){ @@ -233,7 +229,6 @@ fn_stop_ark(){ # 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 0.5 else break # Our job is done here fi # end if for pid range check @@ -249,7 +244,6 @@ fn_stop_ark(){ fn_stop_teamspeak3(){ fn_print_dots "${servername}" - sleep 0.5 "${serverfiles}"/ts3server_startscript.sh stop > /dev/null 2>&1 check_status.sh if [ "${status}" == "0" ]; then @@ -266,10 +260,9 @@ fn_stop_teamspeak3(){ fn_stop_tmux(){ fn_print_dots "${servername}" fn_script_log_info "tmux kill-session: ${servername}" - sleep 0.5 # Kill tmux session tmux kill-session -t "${servicename}" > /dev/null 2>&1 - sleep 0.5 + fn_sleep_time check_status.sh if [ "${status}" == "0" ]; then # ARK doesn't clean up immediately after tmux is killed. @@ -304,7 +297,6 @@ fn_stop_pre_check(){ } fn_print_dots "${servername}" -sleep 0.5 check.sh info_config.sh fn_stop_pre_check @@ -314,4 +306,4 @@ if [ -f "${rootdir}/${lockselfname}" ]; then fi if [ -z "${exitbypass}" ]; then core_exit.sh -fi \ No newline at end of file +fi diff --git a/lgsm/functions/command_test_alert.sh b/lgsm/functions/command_test_alert.sh index ff5084696..014e082b2 100644 --- a/lgsm/functions/command_test_alert.sh +++ b/lgsm/functions/command_test_alert.sh @@ -9,7 +9,6 @@ local commandaction="Alert" local function_selfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" fn_print_dots "${servername}" -sleep 0.5 check.sh info_config.sh alert="test" diff --git a/lgsm/functions/command_ts3_server_pass.sh b/lgsm/functions/command_ts3_server_pass.sh index cbd3ad9ae..46a028a98 100644 --- a/lgsm/functions/command_ts3_server_pass.sh +++ b/lgsm/functions/command_ts3_server_pass.sh @@ -25,14 +25,12 @@ fn_serveradmin_password_prompt(){ fn_serveradmin_password_set(){ fn_print_info_nl "Starting server with new password..." fn_script_log_info "Starting server with new password" - sleep 0.5 # Start server in "new password mode" ts3serverpass="1" exitbypass="1" command_start.sh fn_print_ok_nl "Password applied" fn_script_log_pass "New ServerAdmin password applied" - sleep 0.5 } # Running functions diff --git a/lgsm/functions/command_update.sh b/lgsm/functions/command_update.sh index 9c366ae61..c3c289d97 100644 --- a/lgsm/functions/command_update.sh +++ b/lgsm/functions/command_update.sh @@ -9,7 +9,6 @@ local commandaction="Update" local function_selfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" fn_print_dots "" -sleep 0.2 check.sh logs.sh diff --git a/lgsm/functions/command_update_linuxgsm.sh b/lgsm/functions/command_update_linuxgsm.sh index c4c49aee5..5d8422936 100644 --- a/lgsm/functions/command_update_linuxgsm.sh +++ b/lgsm/functions/command_update_linuxgsm.sh @@ -9,7 +9,6 @@ local commandaction="Update LinuxGSM" local function_selfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" fn_print_dots "Updating LinuxGSM" -sleep 0.5 check.sh fn_script_log_info "Updating LinuxGSM" echo -en "\n" diff --git a/lgsm/functions/command_validate.sh b/lgsm/functions/command_validate.sh index c324b93b8..de999be25 100644 --- a/lgsm/functions/command_validate.sh +++ b/lgsm/functions/command_validate.sh @@ -9,15 +9,12 @@ local commandaction="Validate" local function_selfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" fn_validation(){ + fn_print_info "Validating files: SteamCMD" echo "" - echo -e " * Validating may overwrite some customised files." - echo -en " * https://developer.valvesoftware.com/wiki/SteamCMD#Validate" - sleep 3 - echo -en "\n" - + echo -e "* Validating may overwrite some customised files." + echo -e "* https://docs.linuxgsm.com/commands/validate" fn_script_log_info "Validating files: SteamCMD" - sleep 0.5 - + sleep 3 cd "${steamcmddir}" || exit # Detects if unbuffer command is available for 32 bit distributions only. info_distro.sh @@ -44,9 +41,7 @@ fn_validation(){ } fn_print_dots "Validating files:" -sleep 0.5 fn_print_dots "Validating files: SteamCMD" -sleep 0.5 check.sh check_status.sh if [ "${status}" != "0" ]; then diff --git a/lgsm/functions/command_wipe.sh b/lgsm/functions/command_wipe.sh index fdcbe424d..7a98c2155 100644 --- a/lgsm/functions/command_wipe.sh +++ b/lgsm/functions/command_wipe.sh @@ -48,138 +48,131 @@ fn_wipe_server_remove_files(){ if [ -n "$(find "${serveridentitydir}" -type f -name "proceduralmap.*.map")" ]; then currentaction="Removing map file(s): ${serveridentitydir}/proceduralmap.*.map" echo -en "Removing procedural map proceduralmap.*.map file(s)..." - sleep 0.5 + fn_sleep_time fn_script_log "${currentaction}" find "${serveridentitydir:?}" -type f -name "proceduralmap.*.map" -delete fn_wipe_exit_code - sleep 0.5 + fn_sleep_time else fn_print_information_nl "No procedural map file to remove" fn_script_log_info "No procedural map file to remove." - sleep 0.5 fi # Wipe procedural map save if [ -n "$(find "${serveridentitydir}" -type f -name "proceduralmap.*.sav")" ]; then currentaction="Removing procedural map save(s): ${serveridentitydir}/proceduralmap.*.sav" echo -en "Removing map saves proceduralmap.*.sav file(s)..." - sleep 0.5 + fn_sleep_time fn_script_log "${currentaction}" find "${serveridentitydir:?}" -type f -name "proceduralmap.*.sav" -delete fn_wipe_exit_code - sleep 0.5 + fn_sleep_time else fn_print_information_nl "No procedural map save to remove" fn_script_log_info "No procedural map save to remove." - sleep 0.5 fi # Wipe Barren map if [ -n "$(find "${serveridentitydir}" -type f -name "barren*.map")" ]; then currentaction="Removing map file(s): ${serveridentitydir}/barren*.map" echo -en "Removing barren map barren*.map file(s)..." - sleep 0.5 + fn_sleep_time fn_script_log "${currentaction}" find "${serveridentitydir:?}" -type f -name "barren*.map" -delete fn_wipe_exit_code - sleep 0.5 + fn_sleep_time else fn_print_information_nl "No barren map file to remove" fn_script_log_info "No barren map file to remove." - sleep 0.5 fi # Wipe barren map save if [ -n "$(find "${serveridentitydir}" -type f -name "barren*.sav")" ]; then currentaction="Removing barren map save(s): ${serveridentitydir}/barren*.sav" echo -en "Removing barren map saves barren*.sav file(s)..." - sleep 0.5 + fn_sleep_time fn_script_log "${currentaction}" find "${serveridentitydir:?}" -type f -name "barren*.sav" -delete fn_wipe_exit_code - sleep 0.5 + fn_sleep_time else fn_print_information_nl "No barren map save to remove" fn_script_log_info "No barren map save to remove." - sleep 0.5 fi # Wipe user dir, might be a legacy thing, maybe to be removed if [ -d "${serveridentitydir}/user" ]; then currentaction="Removing user directory: ${serveridentitydir}/user" echo -en "Removing user directory..." - sleep 0.5 + fn_sleep_time fn_script_log "${currentaction}" rm -rf "${serveridentitydir:?}/user" fn_wipe_exit_code - sleep 0.5 + fn_sleep_time # We do not print additional information if there is nothing to remove since this might be obsolete fi # Wipe storage dir, might be a legacy thing, maybe to be removed if [ -d "${serveridentitydir}/storage" ]; then currentaction="Removing storage directory: ${serveridentitydir}/storage" echo -en "Removing storage directory..." - sleep 0.5 + fn_sleep_time fn_script_log "${currentaction}" rm -rf "${serveridentitydir:?}/storage" fn_wipe_exit_code - sleep 0.5 + fn_sleep_time # We do not print additional information if there is nothing to remove since this might be obsolete fi # Wipe sv.files if [ -n "$(find "${serveridentitydir}" -type f -name "sv.files.*.db")" ]; then currentaction="Removing server misc files: ${serveridentitydir}/sv.files.*.db" echo -en "Removing server misc srv.files*.db file(s)..." - sleep 0.5 + fn_sleep_time fn_script_log "${currentaction}" find "${serveridentitydir:?}" -type f -name "sv.files.*.d" -delete fn_wipe_exit_code - sleep 0.5 + fn_sleep_time # No further information if not found because it should I could not get this file showing up fi # Wipe player death files if [ -n "$(find "${serveridentitydir}" -type f -name "player.deaths.*.db")" ]; then currentaction="Removing player death files: ${serveridentitydir}/player.deaths.*.db" echo -en "Removing player deaths player.deaths.*.db file(s)..." - sleep 0.5 + fn_sleep_time fn_script_log "${currentaction}" find "${serveridentitydir:?}" -type f -name "player.deaths.*.db" -delete fn_wipe_exit_code - sleep 0.5 + fn_sleep_time else fn_print_information_nl "No player death to remove" fn_script_log_info "No player death to remove." - sleep 0.5 fi # Wipe blueprints only if wipeall command was used if [ "${wipeall}" == "1" ]; then if [ -n "$(find "${serveridentitydir}" -type f -name "player.blueprints.*.db")" ]; then currentaction="Removing blueprint file(s): ${serveridentitydir}/player.blueprints.*.db" echo -en "Removing blueprints player.blueprints.*.db file(s)..." - sleep 0.5 + fn_sleep_time fn_script_log "${currentaction}" find "${serveridentitydir:?}" -type f -name "player.blueprints.*.db" -delete fn_wipe_exit_code - sleep 0.5 + fn_sleep_time else fn_print_information_nl "No blueprint file to remove" fn_script_log_info "No blueprint file to remove." - sleep 0.5 fi elif [ -n "$(find "${serveridentitydir}" -type f -name "player.blueprints.*.db")" ]; then fn_print_information_nl "Keeping blueprints" fn_script_log_info "Keeping blueprints." - sleep 0.5 else fn_print_information_nl "No blueprints found" fn_script_log_info "No blueprints found." - sleep 0.5 + fn_sleep_time fi # Wipe some logs that might be there if [ -n "$(find "${serveridentitydir}" -type f -name "Log.*.txt")" ]; then currentaction="Removing log files: ${serveridentitydir}/Log.*.txt" echo -en "Removing Log files..." - sleep 0.5 + fn_sleep_time fn_script_log "${currentaction}" find "${serveridentitydir:?}" -type f -name "Log.*.txt" -delete fn_wipe_exit_code - sleep 0.5 + fn_sleep_time # We do not print additional information if there are no logs to remove fi # You can add an "elif" here to add another game or engine @@ -195,12 +188,11 @@ if [ "${shortname}" == "rust" ]; 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 0.5 + fn_sleep_time fn_wipe_server_process else fn_print_information_nl "No data to wipe was found" fn_script_log_info "No data to wipe was found." - sleep 0.5 core_exit.sh fi # You can add an "elif" here to add another game or engine @@ -208,7 +200,6 @@ else # Game not listed fn_print_information_nl "Wipe is not available for this game" fn_script_log_info "Wipe is not available for this game." - sleep 0.5 core_exit.sh fi diff --git a/lgsm/functions/core_dl.sh b/lgsm/functions/core_dl.sh index 3018dcf13..910e1dec8 100644 --- a/lgsm/functions/core_dl.sh +++ b/lgsm/functions/core_dl.sh @@ -41,7 +41,7 @@ fn_dl_md5(){ # Runs MD5 Check if available. if [ "${md5}" != "0" ]&&[ "${md5}" != "nomd5" ]; then echo -en "verifying ${local_filename} with MD5..." - sleep 0.5 + fn_sleep_time local md5sumcmd=$(md5sum "${local_filedir}/${local_filename}"|awk '{print $1;}') if [ "${md5sumcmd}" != "${md5}" ]; then fn_print_fail_eol_nl @@ -104,7 +104,7 @@ fn_fetch_trap(){ echo -en "downloading ${local_filename}..." fn_print_canceled_eol_nl fn_script_log_info "Downloading ${local_filename}...CANCELED" - sleep 0.5 + fn_sleep_time rm -f "${local_filedir}/${local_filename}" echo -en "downloading ${local_filename}..." fn_print_removed_eol_nl @@ -131,7 +131,7 @@ fn_fetch_file(){ # Larger files show a progress bar. if [ "${local_filename##*.}" == "bz2" ]||[ "${local_filename##*.}" == "gz" ]||[ "${local_filename##*.}" == "zip" ]||[ "${local_filename##*.}" == "jar" ]||[ "${local_filename##*.}" == "xz" ]; then echo -en "downloading ${local_filename}..." - sleep 0.5 + fn_sleep_time echo -en "\033[1K" curlcmd=$(${curlpath} --progress-bar --fail -L -o "${local_filedir}/${local_filename}" "${remote_fileurl}") echo -en "downloading ${local_filename}..." diff --git a/lgsm/functions/core_messages.sh b/lgsm/functions/core_messages.sh index 74ae8cf5d..e28e65765 100644 --- a/lgsm/functions/core_messages.sh +++ b/lgsm/functions/core_messages.sh @@ -28,6 +28,12 @@ fn_ansi_loader(){ creeol="\r\033[K" } +fn_sleep_time(){ + if [ "${sleeptime}" != "0" ]||[ "${travistest}" != "1" ]; then + sleep "${sleeptime}" + fi +} + # Log display ######################## ## Feb 28 14:56:58 ut99-server: Monitor: @@ -110,6 +116,7 @@ fn_print_dots(){ else echo -en "${creeol}[ .... ] $@" fi + fn_sleep_time } fn_print_dots_nl(){ @@ -118,7 +125,7 @@ fn_print_dots_nl(){ else echo -e "${creeol}[ .... ] $@" fi - sleep 0.5 + fn_sleep_time echo -en "\n" } @@ -129,6 +136,7 @@ fn_print_ok(){ else echo -en "${creeol}[${green} OK ${default}] $@" fi + fn_sleep_time } fn_print_ok_nl(){ @@ -137,7 +145,7 @@ fn_print_ok_nl(){ else echo -en "${creeol}[${green} OK ${default}] $@" fi - sleep 0.5 + fn_sleep_time echo -en "\n" } @@ -148,6 +156,7 @@ fn_print_fail(){ else echo -en "${creeol}[${red} FAIL ${default}] $@" fi + fn_sleep_time } fn_print_fail_nl(){ @@ -156,7 +165,7 @@ fn_print_fail_nl(){ else echo -en "${creeol}[${red} FAIL ${default}] $@" fi - sleep 0.5 + fn_sleep_time echo -en "\n" } @@ -167,6 +176,7 @@ fn_print_error(){ else echo -en "${creeol}[${red}ERROR ${default}] $@" fi + fn_sleep_time } fn_print_error_nl(){ @@ -175,7 +185,7 @@ fn_print_error_nl(){ else echo -en "${creeol}[${red}ERROR ${default}] $@" fi - sleep 0.5 + fn_sleep_time echo -en "\n" } @@ -186,6 +196,7 @@ fn_print_warn(){ else echo -en "${creeol}[${yellow} WARN ${default}] $@" fi + fn_sleep_time } fn_print_warn_nl(){ @@ -194,7 +205,7 @@ fn_print_warn_nl(){ else echo -en "${creeol}[${yellow} WARN ${default}] $@" fi - sleep 0.5 + fn_sleep_time echo -en "\n" } @@ -205,6 +216,7 @@ fn_print_info(){ else echo -en "${creeol}[${cyan} INFO ${default}] $@" fi + fn_sleep_time } fn_print_info_nl(){ @@ -213,7 +225,7 @@ fn_print_info_nl(){ else echo -en "${creeol}[${cyan} INFO ${default}] $@" fi - sleep 0.5 + fn_sleep_time echo -en "\n" } @@ -232,46 +244,56 @@ fn_print_header(){ # Complete! fn_print_complete(){ echo -en "${green}Complete!${default} $@" + fn_sleep_time } fn_print_complete_nl(){ echo -e "${green}Complete!${default} $@" + fn_sleep_time } # Failure! fn_print_failure(){ echo -en "${red}Failure!${default} $@" + fn_sleep_time } fn_print_failure_nl(){ echo -e "${red}Failure!${default} $@" + fn_sleep_time } # Error! fn_print_error2(){ echo -en "${red}Error!${default} $@" + fn_sleep_time } fn_print_error2_nl(){ echo -e "${red}Error!${default} $@" + fn_sleep_time } # Warning! fn_print_warning(){ echo -en "${yellow}Warning!${default} $@" + fn_sleep_time } fn_print_warning_nl(){ echo -e "${yellow}Warning!${default} $@" + fn_sleep_time } # Information! fn_print_information(){ echo -en "${cyan}Information!${default} $@" + fn_sleep_time } fn_print_information_nl(){ echo -e "${cyan}Information!${default} $@" + fn_sleep_time } # Y/N Prompt diff --git a/lgsm/functions/fix.sh b/lgsm/functions/fix.sh index da9c362e4..9fddc3189 100644 --- a/lgsm/functions/fix.sh +++ b/lgsm/functions/fix.sh @@ -11,18 +11,14 @@ local commandaction="Fix" # Messages that are displayed for some fixes fn_fix_msg_start(){ fn_print_dots "Applying ${fixname} fix: ${gamename}" - sleep 0.5 fn_print_info "Applying ${fixname} fix: ${gamename}" fn_script_log_info "Applying ${fixname} fix: ${gamename}" - sleep 0.5 } fn_fix_msg_start_nl(){ fn_print_dots "Applying ${fixname} fix: ${gamename}" - sleep 0.5 fn_print_info "Applying ${fixname} fix: ${gamename}" fn_script_log_info "Applying ${fixname} fix: ${gamename}" - sleep 0.5 } fn_fix_msg_end(){ @@ -82,7 +78,7 @@ if [ "${function_selfname}" == "command_install.sh" ]; then echo "" echo "Applying Post-Install Fixes" echo "=================================" - sleep 0.5 + fn_sleep_time if [ "${shortname}" == "kf" ]; then fix_kf.sh elif [ "${shortname}" == "kf2" ]; then diff --git a/lgsm/functions/fix_kf.sh b/lgsm/functions/fix_kf.sh index dbb0c78c1..e9f5f3860 100644 --- a/lgsm/functions/fix_kf.sh +++ b/lgsm/functions/fix_kf.sh @@ -12,15 +12,15 @@ echo "Applying WebAdmin ROOst.css fix." echo "http://forums.tripwireinteractive.com/showpost.php?p=585435&postcount=13" sed -i 's/none}/none;/g' "${serverfiles}/Web/ServerAdmin/ROOst.css" sed -i 's/underline}/underline;/g' "${serverfiles}/Web/ServerAdmin/ROOst.css" -sleep 0.5 +fn_sleep_time 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 0.5 +fn_sleep_time echo "applying server name fix." -sleep 0.5 +fn_sleep_time echo "forcing server restart..." -sleep 0.5 +fn_sleep_time exitbypass=1 command_start.sh sleep 5 diff --git a/lgsm/functions/fix_kf2.sh b/lgsm/functions/fix_kf2.sh index 3e3e23080..e8f3440f0 100644 --- a/lgsm/functions/fix_kf2.sh +++ b/lgsm/functions/fix_kf2.sh @@ -13,9 +13,9 @@ parms="\"${defaultmap}?Game=KFGameContent.KFGameInfo_VersusSurvival\"" } fn_print_information "starting ${gamename} server to generate configs." -sleep 1 +fn_sleep_time exitbypass=1 command_start.sh sleep 10 exitbypass=1 -command_stop.sh \ No newline at end of file +command_stop.sh diff --git a/lgsm/functions/fix_mta.sh b/lgsm/functions/fix_mta.sh index e8943f5e1..4eb4ff900 100644 --- a/lgsm/functions/fix_mta.sh +++ b/lgsm/functions/fix_mta.sh @@ -11,7 +11,7 @@ local function_selfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" if [ ! -f "${lgsmdir}/lib/libmysqlclient.so.16" ]; then fixname="libmysqlclient16" fn_fix_msg_start_nl - sleep 0.5 + fn_sleep_time 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/fix_ro.sh b/lgsm/functions/fix_ro.sh index b96ae582e..1ded9824b 100644 --- a/lgsm/functions/fix_ro.sh +++ b/lgsm/functions/fix_ro.sh @@ -12,18 +12,18 @@ echo "Applying WebAdmin ROOst.css fix." echo "http://forums.tripwireinteractive.com/showpost.php?p=585435&postcount=13" sed -i 's/none}/none;/g' "${serverfiles}/Web/ServerAdmin/ROOst.css" sed -i 's/underline}/underline;/g' "${serverfiles}/Web/ServerAdmin/ROOst.css" -sleep 0.5 +fn_sleep_time 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 0.5 +fn_sleep_time echo "Applying Steam AppID fix." sed -i 's/1210/1200/g' "${systemdir}/steam_appid.txt" -sleep 0.5 +fn_sleep_time echo "applying server name fix." -sleep 0.5 +fn_sleep_time echo "forcing server restart..." -sleep 0.5 +fn_sleep_time exitbypass=1 command_start.sh sleep 5 diff --git a/lgsm/functions/fix_ut.sh b/lgsm/functions/fix_ut.sh index aaaad40cb..7e9b7dc97 100644 --- a/lgsm/functions/fix_ut.sh +++ b/lgsm/functions/fix_ut.sh @@ -11,4 +11,4 @@ local function_selfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" #Set Binary Executable echo "chmod +x ${executabledir}/${executable}" chmod +x "${executabledir}/${executable}" -sleep 0.5 \ No newline at end of file +fn_sleep_time \ No newline at end of file diff --git a/lgsm/functions/fix_ut2k4.sh b/lgsm/functions/fix_ut2k4.sh index b29b312c3..3789909b3 100644 --- a/lgsm/functions/fix_ut2k4.sh +++ b/lgsm/functions/fix_ut2k4.sh @@ -12,15 +12,15 @@ echo "applying WebAdmin ut2003.css fix." echo "http://forums.tripwireinteractive.com/showpost.php?p=585435&postcount=13" sed -i 's/none}/none;/g' "${serverfiles}/Web/ServerAdmin/ut2003.css" sed -i 's/underline}/underline;/g' "${serverfiles}/Web/ServerAdmin/ut2003.css" -sleep 0.5 +fn_sleep_time 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 0.5 +fn_sleep_time echo "applying server name fix." -sleep 0.5 +fn_sleep_time echo "forcing server restart." -sleep 0.5 +fn_sleep_time exitbypass=1 command_start.sh sleep 5 diff --git a/lgsm/functions/fix_ut3.sh b/lgsm/functions/fix_ut3.sh index fa95052ac..53bde310f 100644 --- a/lgsm/functions/fix_ut3.sh +++ b/lgsm/functions/fix_ut3.sh @@ -13,9 +13,9 @@ parms="server VCTF-Suspense?Game=UTGameContent.UTVehicleCTFGame_Content?bIsDedic } fn_print_information "starting ${gamename} server to generate configs." -sleep 1 +fn_sleep_time exitbypass=1 command_start.sh sleep 10 exitbypass=1 -command_stop.sh \ No newline at end of file +command_stop.sh diff --git a/lgsm/functions/install_config.sh b/lgsm/functions/install_config.sh index f9c7e1cb2..997624f73 100644 --- a/lgsm/functions/install_config.sh +++ b/lgsm/functions/install_config.sh @@ -23,7 +23,7 @@ fn_fetch_default_config(){ echo "Downloading ${gamename} Configs" echo "=================================" echo "default configs from https://github.com/GameServerManagers/Game-Server-Configs" - sleep 0.5 + fn_sleep_time mkdir -p "${lgsmdir}/config-default/config-game" githuburl="https://raw.githubusercontent.com/GameServerManagers/Game-Server-Configs/master" for config in "${array_configs[@]}"; do @@ -50,14 +50,14 @@ fn_default_config_remote(){ cp -nv "${lgsmdir}/config-default/config-game/${config}" "${servercfgdir}/${config}" fi done - sleep 0.5 + fn_sleep_time } # Copys local default config to server config location fn_default_config_local(){ echo "copying ${servercfgdefault} config file." cp -nv "${servercfgfullpathdefault}" "${servercfgfullpath}" - sleep 0.5 + fn_sleep_time } # Changes some variables within the default configs @@ -70,7 +70,7 @@ fn_set_config_vars(){ rconpass="admin${random}" echo "changing hostname." fn_script_log_info "changing hostname." - sleep 0.5 + fn_sleep_time # prevents var from being overwritten with the servername if grep -q "SERVERNAME=SERVERNAME" "${lgsmdir}/config-default/config-game/${config}" 2>/dev/null; then sed -i "s/SERVERNAME=SERVERNAME/SERVERNAME=${servername}/g" "${servercfgfullpath}" @@ -86,11 +86,11 @@ fn_set_config_vars(){ else sed -i "s/ADMINPASSWORD/${rconpass}/g" "${servercfgfullpath}" fi - sleep 0.5 + fn_sleep_time else fn_script_log_warn "Config file not found, cannot alter it." echo "Config file not found, cannot alter it." - sleep 0.5 + fn_sleep_time fi } @@ -101,16 +101,16 @@ fn_set_dst_config_vars(){ echo "changing server name." fn_script_log_info "changing server name." sed -i "s/SERVERNAME/LinuxGSM/g" "${clustercfgfullpath}" - sleep 0.5 + fn_sleep_time echo "changing shard mode." fn_script_log_info "changing shard mode." sed -i "s/USESHARDING/${sharding}/g" "${clustercfgfullpath}" - sleep 0.5 + fn_sleep_time echo "randomizing cluster key." fn_script_log_info "randomizing cluster key." randomkey=$(tr -dc A-Za-z0-9_ < /dev/urandom | head -c 8 | xargs) sed -i "s/CLUSTERKEY/${randomkey}/g" "${clustercfgfullpath}" - sleep 0.5 + fn_sleep_time else echo "${clustercfg} is already configured." fn_script_log_info "${clustercfg} is already configured." @@ -128,11 +128,11 @@ fn_set_dst_config_vars(){ echo "changing shard name." fn_script_log_info "changing shard name." sed -i "s/SHARDNAME/${shard}/g" "${servercfgfullpath}" - sleep 0.5 + fn_sleep_time echo "changing master setting." fn_script_log_info "changing master setting." sed -i "s/ISMASTER/${master}/g" "${servercfgfullpath}" - sleep 0.5 + fn_sleep_time ## worldgenoverride.lua if [ "${cave}" == "true" ]; then @@ -140,7 +140,7 @@ fn_set_dst_config_vars(){ fn_script_log_info "defining ${shard} as cave in ${servercfgdir}/worldgenoverride.lua." echo 'return { override_enabled = true, preset = "DST_CAVE", }' > "${servercfgdir}/worldgenoverride.lua" fi - sleep 0.5 + fn_sleep_time echo "" } diff --git a/lgsm/functions/install_dst_token.sh b/lgsm/functions/install_dst_token.sh index 11a4c3679..616a6469b 100644 --- a/lgsm/functions/install_dst_token.sh +++ b/lgsm/functions/install_dst_token.sh @@ -11,7 +11,7 @@ local function_selfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" echo "" echo "Enter ${gamename} Cluster Token" echo "=================================" -sleep 0.5 +fn_sleep_time echo "A cluster token is required to run this server!" echo "Follow the instructions in this link to obtain this key:" echo "https://linuxgsm.com/dst-auth-token" diff --git a/lgsm/functions/install_eula.sh b/lgsm/functions/install_eula.sh index cc676f0dc..fca4838af 100644 --- a/lgsm/functions/install_eula.sh +++ b/lgsm/functions/install_eula.sh @@ -15,7 +15,7 @@ fi echo "" echo "Accept ${gamename} EULA" echo "=================================" -sleep 0.5 +fn_sleep_time echo "You are required to accept the EULA:" echo "${eulaurl}" echo "" diff --git a/lgsm/functions/install_factorio_save.sh b/lgsm/functions/install_factorio_save.sh index 3b243c9d4..804ef88e7 100644 --- a/lgsm/functions/install_factorio_save.sh +++ b/lgsm/functions/install_factorio_save.sh @@ -10,6 +10,6 @@ local commandaction="Install" echo "" echo "Creating initial Factorio savefile" echo "=================================" -sleep 0.5 +fn_sleep_time check_glibc.sh "${executabledir}"/factorio --create "${serverfiles}/save1" diff --git a/lgsm/functions/install_gslt.sh b/lgsm/functions/install_gslt.sh index 2c8c0e9f3..87fccae70 100644 --- a/lgsm/functions/install_gslt.sh +++ b/lgsm/functions/install_gslt.sh @@ -11,7 +11,7 @@ local function_selfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" echo "" echo "Game Server Login Token" echo "=================================" -sleep 0.5 +fn_sleep_time if [ "${shortname}" == "csgo" ]||[ "${shortname}" == "css" ]||[ "${shortname}" == "nmrih" ]||[ "${shortname}" == "bs" ]; then echo "GSLT is required to run a public ${gamename} server" fn_script_log_info "GSLT is required to run a public ${gamename} server" @@ -37,7 +37,7 @@ if [ -z "${autoinstall}" ]; then fi fi fi -sleep 0.5 +fn_sleep_time if [ "${shortname}" == "tu" ]; then echo "The GSLT can be changed by editing ${servercfgdir}/${servercfg}." fn_script_log_info "The GSLT can be changed by editing ${servercfgdir}/${servercfg}." diff --git a/lgsm/functions/install_logs.sh b/lgsm/functions/install_logs.sh index bc8184839..d02bb8e35 100644 --- a/lgsm/functions/install_logs.sh +++ b/lgsm/functions/install_logs.sh @@ -13,7 +13,7 @@ if [ "${checklogs}" != "1" ]; then echo "Creating log directories" echo "=================================" fi -sleep 0.5 +fn_sleep_time # Create LinuxGSM logs echo -en "installing log dir: ${logdir}..." mkdir -p "${logdir}" @@ -102,5 +102,5 @@ if [ -d "${rootdir}/Steam/logs" ]; then fi fi fi -sleep 0.5 +fn_sleep_time fn_script_log_info "Logs installed" diff --git a/lgsm/functions/install_server_dir.sh b/lgsm/functions/install_server_dir.sh index abb8f6fb0..18255ebd8 100644 --- a/lgsm/functions/install_server_dir.sh +++ b/lgsm/functions/install_server_dir.sh @@ -11,7 +11,7 @@ local function_selfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" echo "" echo "Server Directory" echo "=================================" -sleep 0.5 +fn_sleep_time if [ -d "${serverfiles}" ]; then fn_print_warning_nl "A server is already installed here." fi diff --git a/lgsm/functions/install_server_files.sh b/lgsm/functions/install_server_files.sh index 67b4af9fe..e921e9c15 100644 --- a/lgsm/functions/install_server_files.sh +++ b/lgsm/functions/install_server_files.sh @@ -131,7 +131,7 @@ fn_install_server_files_steamcmd(){ echo "" echo "Installing ${gamename} Server" echo "=================================" -sleep 0.5 +fn_sleep_time if [ -n "${appid}" ]; then fn_install_server_files_steamcmd diff --git a/lgsm/functions/install_squad_license.sh b/lgsm/functions/install_squad_license.sh index 3b0711309..f9cf40835 100644 --- a/lgsm/functions/install_squad_license.sh +++ b/lgsm/functions/install_squad_license.sh @@ -11,7 +11,7 @@ local function_selfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" echo "" echo "Squad Server License" echo "=================================" -sleep 0.5 +fn_sleep_time echo "Server license is an optional feature for ${gamename} server" fn_script_log_info "Server license is an optional feature for ${gamename} server" @@ -20,7 +20,7 @@ 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 0.5 +fn_sleep_time 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 diff --git a/lgsm/functions/install_steamcmd.sh b/lgsm/functions/install_steamcmd.sh index 10d095423..4b24c4274 100644 --- a/lgsm/functions/install_steamcmd.sh +++ b/lgsm/functions/install_steamcmd.sh @@ -10,5 +10,5 @@ local commandaction="Install" echo "" echo "Installing SteamCMD" echo "=================================" -sleep 0.5 +fn_sleep_time check_steamcmd.sh diff --git a/lgsm/functions/install_ts3db.sh b/lgsm/functions/install_ts3db.sh index 77dea1bae..264f2597f 100644 --- a/lgsm/functions/install_ts3db.sh +++ b/lgsm/functions/install_ts3db.sh @@ -27,7 +27,7 @@ fn_install_ts3db_mariadb(){ echo "" echo "Configure ${gamename} Server for MariaDB" echo "=================================" - sleep 0.5 + fn_sleep_time read -rp "Enter MariaDB hostname: " mariahostname read -rp "Enter MariaDB port: " mariaport read -rp "Enter MariaDB username: " mariausername @@ -48,13 +48,13 @@ fn_install_ts3db_mariadb(){ sed -i "s/dbpluginparameter=/dbpluginparameter=ts3db_mariadb.ini/g" "${servercfgfullpath}" sed -i "s/dbsqlcreatepath=create_sqlite\//dbsqlcreatepath=create_mariadb\//g" "${servercfgfullpath}" echo "updating ts3db_mariadb.ini." - sleep 0.5 + fn_sleep_time } echo "" echo "Select Database" echo "=================================" -sleep 0.5 +fn_sleep_time if [ -z "${autoinstall}" ]; then if fn_prompt_yn "Do you want to use MariaDB instead of sqlite? (MariaDB must be pre-configured)" N; then fn_install_ts3db_mariadb @@ -69,9 +69,8 @@ install_eula.sh echo "" echo "Getting privilege key" echo "=================================" -sleep 0.5 +fn_sleep_time fn_print_information_nl "Save these details for later." -sleep 0.5 cd "${executabledir}" || exit ${executable} start inifile=ts3-server.ini sleep 5 diff --git a/lgsm/functions/install_ut2k4_key.sh b/lgsm/functions/install_ut2k4_key.sh index f1e840462..0f0fe6da5 100644 --- a/lgsm/functions/install_ut2k4_key.sh +++ b/lgsm/functions/install_ut2k4_key.sh @@ -11,7 +11,7 @@ local function_selfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" echo "" echo "Enter ${gamename} CD Key" echo "=================================" -sleep 0.5 +fn_sleep_time echo "To get your server listed on the Master Server list" echo "you must get a free CD key. Get a key here:" echo "https://forums.unrealtournament.com/utserver/cdkey.php?2004" diff --git a/lgsm/functions/logs.sh b/lgsm/functions/logs.sh index 69dbc7deb..803f9e243 100644 --- a/lgsm/functions/logs.sh +++ b/lgsm/functions/logs.sh @@ -22,7 +22,7 @@ if [ "${status}" != "0" ]&&[ "${function_selfname}" == "command_start.sh" ]&&[ - fn_print_info "Moving game logs to ${gamelogdir}" fn_script_log_info "Moving game logs to ${gamelogdir}" echo -en "\n" - sleep 0.5 + fn_sleep_time mv "${systemdir}"/gamelog*.log "${gamelogdir}" fi fi @@ -40,7 +40,7 @@ if [ $(find "${lgsmlogdir}"/ -type f -mtime +"${logdays}" | wc -l) -ne "0" ]; th legacyserverlogdir="${logdir}/server" # Setting up counting variables scriptcount="0" ; consolecount="0" ; gamecount="0" ; srcdscount="0" ; smcount="0" ; ulxcount="0" ; darkrpcount="0" ; legacycount="0" - sleep 0.5 + fn_sleep_time fn_print_ok_nl "Starting" fn_print_info_nl "Removing logs older than ${logdays} days" fn_script_log_info "Removing logs older than ${logdays} days" diff --git a/lgsm/functions/mods_core.sh b/lgsm/functions/mods_core.sh index cf2178b3c..c65727738 100644 --- a/lgsm/functions/mods_core.sh +++ b/lgsm/functions/mods_core.sh @@ -38,7 +38,7 @@ fn_mod_lowercase(){ if [ "${modlowercase}" == "LowercaseOn" ]; then echo -en "converting ${modprettyname} files to lowercase..." - sleep 0.5 + fn_sleep_time fn_script_log_info "Converting ${modprettyname} files to lowercase" fileswc=$(find "${extractdir}" -depth | wc -l) echo -en "\r" @@ -61,14 +61,14 @@ fn_mod_lowercase(){ else fn_print_ok_eol_nl fi - sleep 0.5 + fn_sleep_time fi } # Create ${modcommand}-files.txt containing the full extracted file/directory list fn_mod_create_filelist(){ echo -en "building ${modcommand}-files.txt..." - sleep 0.5 + fn_sleep_time # ${modsdir}/${modcommand}-files.txt find "${extractdir}" -mindepth 1 -printf '%P\n' > "${modsdir}/${modcommand}-files.txt" local exitcode=$? @@ -84,13 +84,13 @@ fn_mod_create_filelist(){ if [ -f "${modsdir}/.removedfiles.tmp" ]; then cat "${modsdir}/.removedfiles.tmp" >> "${modsdir}/${modcommand}-files.txt" fi - sleep 0.5 + fn_sleep_time } # Copy the mod into serverfiles fn_mod_copy_destination(){ echo -en "copying ${modprettyname} to ${modinstalldir}..." - sleep 0.5 + fn_sleep_time cp -Rf "${extractdir}/." "${modinstalldir}/" local exitcode=$? if [ ${exitcode} -ne 0 ]; then @@ -116,7 +116,7 @@ fn_mod_tidy_files_list(){ fn_check_mod_files_list # Output to the user echo -en "tidy up ${modcommand}-files.txt..." - sleep 0.5 + fn_sleep_time 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;" @@ -354,7 +354,7 @@ fn_create_mods_dir(){ fn_print_ok_eol_nl fn_script_log_pass "Creating mod download dir ${modsdir}" fi - sleep 0.5 + fn_sleep_time fi # Create mod install directory if [ ! -d "${modinstalldir}" ]; then @@ -369,7 +369,7 @@ fn_create_mods_dir(){ fn_print_ok_eol_nl fn_script_log_pass "Creating mod install directory ${modinstalldir}" fi - sleep 0.5 + fn_sleep_time fi # Create lgsm/data/${modsinstalledlist} diff --git a/lgsm/functions/update_factorio.sh b/lgsm/functions/update_factorio.sh index 6efd56024..c6d27ee65 100644 --- a/lgsm/functions/update_factorio.sh +++ b/lgsm/functions/update_factorio.sh @@ -28,7 +28,6 @@ fn_update_factorio_dl(){ fn_update_factorio_localbuild(){ # Gets local build info. fn_print_dots "Checking for update: ${remotelocation}: checking local build" - sleep 0.5 # Uses executable to find local build. cd "${executabledir}" || exit if [ -f "${executable}" ]; then @@ -40,7 +39,6 @@ fn_update_factorio_localbuild(){ fn_print_error "Checking for update: ${remotelocation}: checking local build" fn_script_log_error "Checking local build" fi - sleep 0.5 } fn_update_factorio_remotebuild(){ @@ -48,7 +46,6 @@ fn_update_factorio_remotebuild(){ remotebuild=$(${curlpath} -s "https://factorio.com/get-download/${downloadbranch}/headless/${factorioarch}" | grep -o '[0-9]\.[0-9]\{1,\}\.[0-9]\{1,\}' | head -1) if [ "${installer}" != "1" ]; then fn_print_dots "Checking for update: ${remotelocation}: checking remote build" - sleep 0.5 # Checks if remotebuild variable has been set. if [ -z "${remotebuild}" ]||[ "${remotebuild}" == "null" ]; then fn_print_fail "Checking for update: ${remotelocation}: checking remote build" @@ -57,7 +54,6 @@ fn_update_factorio_remotebuild(){ else fn_print_ok "Checking for update: ${remotelocation}: checking remote build" fn_script_log_pass "Checking remote build" - sleep 0.5 fi else # Checks if remotebuild variable has been set. @@ -66,18 +62,16 @@ fn_update_factorio_remotebuild(){ fn_script_log_fatal "Unable to get remote build" core_exit.sh fi - fi + fi } fn_update_factorio_compare(){ fn_print_dots "Checking for update: ${remotelocation}" - sleep 0.5 # Removes dots so if statement can compare version numbers. localbuilddigit=$(echo "${localbuild}" | tr -cd '[:digit:]') remotebuilddigit=$(echo "${remotebuild}" | tr -cd '[:digit:]') if [ "${localbuilddigit}" -ne "${remotebuilddigit}" ]||[ "${forceupdate}" == "1" ]; then fn_print_ok_nl "Checking for update: ${remotelocation}" - sleep 0.5 echo -en "\n" echo -e "Update available" echo -e "* Local build: ${red}${localbuild} ${factorioarch}${default}" @@ -92,7 +86,7 @@ fn_update_factorio_compare(){ fn_script_log_info "Branch: ${branch}" fi fn_script_log_info "${localbuild} > ${remotebuild}" - sleep 0.5 + fn_sleep_time echo -en "\n" echo -en "applying update.\r" sleep 1 @@ -126,7 +120,6 @@ fn_update_factorio_compare(){ alert.sh else fn_print_ok_nl "Checking for update: ${remotelocation}" - sleep 0.5 echo -en "\n" echo -e "No update available" echo -e "* Local build: ${green}${localbuild} ${factorioarch}${default}" @@ -163,7 +156,6 @@ if [ "${installer}" == "1" ]; then else fn_print_dots "Checking for update: ${remotelocation}" fn_script_log_info "Checking for update: ${remotelocation}" - sleep 0.5 fn_update_factorio_localbuild fn_update_factorio_remotebuild fn_update_factorio_compare diff --git a/lgsm/functions/update_minecraft.sh b/lgsm/functions/update_minecraft.sh index 3cf19731a..8fa3ef40a 100644 --- a/lgsm/functions/update_minecraft.sh +++ b/lgsm/functions/update_minecraft.sh @@ -30,18 +30,14 @@ fn_update_minecraft_dl(){ fn_update_minecraft_localbuild(){ # Gets local build info. fn_print_dots "Checking for update: ${remotelocation}: checking local build" - sleep 0.5 # Uses log file to gather info. # Gives time for log file to generate. if [ ! -f "${serverfiles}/logs/latest.log" ]; then fn_print_error "Checking for update: ${remotelocation}: checking local build" - sleep 0.5 fn_print_error_nl "Checking for update: ${remotelocation}: checking local build: no log files" fn_script_log_error "No log file found" - sleep 0.5 fn_print_info_nl "Checking for update: ${remotelocation}: checking local build: forcing server restart" fn_script_log_info "Forcing server restart" - sleep 0.5 exitbypass=1 command_stop.sh exitbypass=1 @@ -61,7 +57,6 @@ fn_update_minecraft_localbuild(){ fn_print_error "Checking for update: ${remotelocation}: waiting for log file: missing log file" fn_script_log_error "Missing log file" fn_script_log_error "Set localbuild to 0" - sleep 0.5 fi totalseconds=$((totalseconds + 1)) @@ -99,7 +94,6 @@ fn_update_minecraft_localbuild(){ fn_print_ok "Checking for update: ${remotelocation}: checking local build" fn_script_log_pass "Checking local build" fi - sleep 0.5 } fn_update_minecraft_remotebuild(){ @@ -107,7 +101,6 @@ fn_update_minecraft_remotebuild(){ remotebuild=$(${curlpath} -s "https://launchermeta.${remotelocation}/mc/game/version_manifest.json" | jq -r '.latest.release') if [ "${installer}" != "1" ]; then fn_print_dots "Checking for update: ${remotelocation}: checking remote build" - sleep 0.5 # Checks if remotebuild variable has been set. if [ -z "${remotebuild}" ]||[ "${remotebuild}" == "null" ]; then fn_print_fail "Checking for update: ${remotelocation}: checking remote build" @@ -116,7 +109,6 @@ fn_update_minecraft_remotebuild(){ else fn_print_ok "Checking for update: ${remotelocation}: checking remote build" fn_script_log_pass "Checking remote build" - sleep 0.5 fi else # Checks if remotebuild variable has been set. @@ -131,12 +123,10 @@ fn_update_minecraft_remotebuild(){ fn_update_minecraft_compare(){ # Removes dots so if statement can compare version numbers. fn_print_dots "Checking for update: ${remotelocation}" - sleep 0.5 localbuilddigit=$(echo "${localbuild}" | tr -cd '[:digit:]') remotebuilddigit=$(echo "${remotebuild}" | tr -cd '[:digit:]') if [ "${localbuilddigit}" -ne "${remotebuilddigit}" ]||[ "${forceupdate}" == "1" ]; then fn_print_ok_nl "Checking for update: ${remotelocation}" - sleep 0.5 echo -en "\n" echo -e "Update available" echo -e "* Local build: ${red}${localbuild}${default}" @@ -145,7 +135,7 @@ fn_update_minecraft_compare(){ fn_script_log_info "Local build: ${localbuild}" fn_script_log_info "Remote build: ${remotebuild}" fn_script_log_info "${localbuild} > ${remotebuild}" - sleep 0.5 + fn_sleep_time echo -en "\n" echo -en "applying update.\r" sleep 1 @@ -179,7 +169,6 @@ fn_update_minecraft_compare(){ alert.sh else fn_print_ok_nl "Checking for update: ${remotelocation}" - sleep 0.5 echo -en "\n" echo -e "No update available" echo -e "* Local build: ${green}${localbuild}${default}" @@ -199,7 +188,6 @@ if [ "${installer}" == "1" ]; then else fn_print_dots "Checking for update: ${remotelocation}" fn_script_log_info "Checking for update: ${remotelocation}" - sleep 0.5 fn_update_minecraft_localbuild fn_update_minecraft_remotebuild fn_update_minecraft_compare diff --git a/lgsm/functions/update_mta.sh b/lgsm/functions/update_mta.sh index 90eb424f5..935ab474e 100644 --- a/lgsm/functions/update_mta.sh +++ b/lgsm/functions/update_mta.sh @@ -30,18 +30,14 @@ fn_update_mta_dl(){ fn_update_mta_localbuild(){ # Gets local build info. fn_print_dots "Checking for update: ${remotelocation}: checking local build" - sleep 0.5 # Uses log file to gather info. # Gives time for log file to generate. if [ ! -f "${serverfiles}/mods/deathmatch/logs/server.log" ]; then fn_print_error "Checking for update: ${remotelocation}: checking local build" - sleep 0.5 fn_print_error_nl "Checking for update: ${remotelocation}: checking local build: no log files" fn_script_log_error "No log file found" - sleep 0.5 fn_print_info_nl "Checking for update: ${remotelocation}: checking local build: forcing server restart" fn_script_log_info "Forcing server restart" - sleep 0.5 exitbypass=1 command_stop.sh exitbypass=1 @@ -61,7 +57,6 @@ fn_update_mta_localbuild(){ fn_print_error "Checking for update: ${remotelocation}: waiting for log file: missing log file" fn_script_log_error "Missing log file" fn_script_log_error "Set localbuild to 0" - sleep 0.5 fi totalseconds=$((totalseconds + 1)) @@ -100,7 +95,6 @@ fn_update_mta_localbuild(){ fn_print_ok "Checking for update: ${remotelocation}: checking local build" fn_script_log_pass "Checking local build" fi - sleep 0.5 } fn_update_mta_remotebuild(){ @@ -111,7 +105,6 @@ fn_update_mta_remotebuild(){ remotebuild="${majorversion}.${minorversion}.${maintenanceversion}" if [ "${installer}" != "1" ]; then fn_print_dots "Checking for update: ${remotelocation}: checking remote build" - sleep 0.5 # Checks if remotebuild variable has been set. if [ -z "${remotebuild}" ]||[ "${remotebuild}" == "null" ]; then fn_print_fail "Checking for update: ${remotelocation}: checking remote build" @@ -120,7 +113,6 @@ fn_update_mta_remotebuild(){ else fn_print_ok "Checking for update: ${remotelocation}: checking remote build" fn_script_log_pass "Checking remote build" - sleep 0.5 fi else # Checks if remotebuild variable has been set. @@ -135,7 +127,6 @@ fn_update_mta_remotebuild(){ fn_update_mta_compare(){ # Removes dots so if statement can compare version numbers. fn_print_dots "Checking for update: ${remotelocation}" - sleep 0.5 localbuilddigit=$(echo "${localbuild}" | tr -cd '[:digit:]') remotebuilddigit=$(echo "${remotebuild}" | tr -cd '[:digit:]') if [ "${localbuilddigit}" -ne "${remotebuilddigit}" ]||[ "${forceupdate}" == "1" ]; then @@ -146,7 +137,6 @@ fn_update_mta_compare(){ else mtaupdatestatus="available" fi - sleep 0.5 echo -en "\n" echo -e "Update ${mtaupdatestatus}:" echo -e "* Local build: ${red}${localbuild}${default}" @@ -155,7 +145,7 @@ fn_update_mta_compare(){ fn_script_log_info "Local build: ${localbuild}" fn_script_log_info "Remote build: ${remotebuild}" fn_script_log_info "${localbuild} > ${remotebuild}" - sleep 0.5 + fn_sleep_time echo -en "\n" echo -en "applying update.\r" sleep 1 @@ -189,7 +179,6 @@ fn_update_mta_compare(){ alert.sh else fn_print_ok_nl "Checking for update: ${remotelocation}" - sleep 0.5 echo -en "\n" echo -e "No update available" echo -e "* Local build: ${green}${localbuild}${default}" @@ -209,7 +198,6 @@ if [ "${installer}" == "1" ]; then else fn_print_dots "Checking for update: ${remotelocation}" fn_script_log_info "Checking for update: ${remotelocation}" - sleep 0.5 fn_update_mta_localbuild fn_update_mta_remotebuild fn_update_mta_compare diff --git a/lgsm/functions/update_mumble.sh b/lgsm/functions/update_mumble.sh index ba98449e2..eb0bdcda3 100644 --- a/lgsm/functions/update_mumble.sh +++ b/lgsm/functions/update_mumble.sh @@ -28,7 +28,6 @@ fn_update_mumble_dl(){ fn_update_mumble_localbuild(){ # Gets local build info. fn_print_dots "Checking for update: ${remotelocation}: checking local build" - sleep 0.5 # Uses executable to find local build. cd "${executabledir}" || exit if [ -f "${executable}" ]; then @@ -40,7 +39,6 @@ fn_update_mumble_localbuild(){ fn_print_error "Checking for update: ${remotelocation}: checking local build" fn_script_log_error "Checking local build" fi - sleep 0.5 } fn_update_mumble_remotebuild(){ @@ -48,7 +46,6 @@ fn_update_mumble_remotebuild(){ remotebuild=$(${curlpath} -s "https://api.github.com/repos/mumble-voip/mumble/releases/latest" | grep 'murmur-static_x86.*\.bz2"' | tail -1 | awk -F"/" '{ print $8 }') if [ "${installer}" != "1" ]; then fn_print_dots "Checking for update: ${remotelocation}: checking remote build" - sleep 0.5 # Checks if remotebuild variable has been set. if [ -z "${remotebuild}" ]||[ "${remotebuild}" == "null" ]; then fn_print_fail "Checking for update: ${remotelocation}: checking remote build" @@ -57,7 +54,6 @@ fn_update_mumble_remotebuild(){ else fn_print_ok "Checking for update: ${remotelocation}: checking remote build" fn_script_log_pass "Checking remote build" - sleep 0.5 fi else # Checks if remotebuild variable has been set. @@ -66,18 +62,16 @@ fn_update_mumble_remotebuild(){ fn_script_log_fatal "Unable to get remote build" core_exit.sh fi - fi + fi } fn_update_mumble_compare(){ # Removes dots so if statement can compare version numbers. fn_print_dots "Checking for update: ${remotelocation}" - sleep 0.5 localbuilddigit=$(echo "${localbuild}" | tr -cd '[:digit:]') remotebuilddigit=$(echo "${remotebuild}" | tr -cd '[:digit:]') if [ "${localbuilddigit}" -ne "${remotebuilddigit}" ]||[ "${forceupdate}" == "1" ]; then fn_print_ok_nl "Checking for update: ${remotelocation}" - sleep 0.5 echo -en "\n" echo -e "Update available" echo -e "* Local build: ${red}${localbuild} ${mumblearch}${default}" @@ -86,7 +80,7 @@ fn_update_mumble_compare(){ fn_script_log_info "Local build: ${localbuild} ${mumblearch}" fn_script_log_info "Remote build: ${remotebuild} ${mumblearch}" fn_script_log_info "${localbuild} > ${remotebuild}" - sleep 0.5 + fn_sleep_time echo -en "\n" echo -en "applying update.\r" sleep 1 @@ -120,7 +114,6 @@ fn_update_mumble_compare(){ alert.sh else fn_print_ok_nl "Checking for update: ${remotelocation}" - sleep 0.5 echo -en "\n" echo -e "No update available" echo -e "* Local build: ${green}${localbuild} ${mumblearch}${default}" @@ -143,7 +136,6 @@ if [ "${installer}" == "1" ]; then else fn_print_dots "Checking for update: ${remotelocation}" fn_script_log_info "Checking for update: ${remotelocation}" - sleep 0.5 fn_update_mumble_localbuild fn_update_mumble_remotebuild fn_update_mumble_compare diff --git a/lgsm/functions/update_steamcmd.sh b/lgsm/functions/update_steamcmd.sh index 9fd29eff7..7b690643d 100644 --- a/lgsm/functions/update_steamcmd.sh +++ b/lgsm/functions/update_steamcmd.sh @@ -31,7 +31,6 @@ fn_update_steamcmd_dl(){ fn_update_steamcmd_localbuild(){ # Gets local build info. fn_print_dots "Checking for update: ${remotelocation}: checking local build" - sleep 0.5 fn_appmanifest_check # Uses appmanifest to find local build. localbuild=$(grep buildid "${appmanifestfile}" | tr '[:blank:]"' ' ' | tr -s ' ' | cut -d\ -f3) @@ -48,7 +47,7 @@ fn_update_steamcmd_localbuild(){ else branchname="public" fi - sleep 0.5 + fn_sleep_time } fn_update_steamcmd_remotebuild(){ @@ -57,7 +56,6 @@ fn_update_steamcmd_remotebuild(){ remotebuild=$(./steamcmd.sh +login "${steamuser}" "${steampass}" +app_info_update 1 +app_info_print "${appid}" +quit | sed '1,/branches/d' | sed "1,/${branchname}/d" | grep -m 1 buildid | tr -cd '[:digit:]') if [ "${installer}" != "1" ]; then fn_print_dots "Checking for update: ${remotelocation}: checking remote build" - sleep 0.5 # Checks if remotebuild variable has been set. if [ -z "${remotebuild}" ]||[ "${remotebuild}" == "null" ]; then fn_print_fail "Checking for update: ${remotelocation}: checking remote build" @@ -66,7 +64,6 @@ fn_update_steamcmd_remotebuild(){ else fn_print_ok "Checking for update: ${remotelocation}: checking remote build" fn_script_log_pass "Checking remote build" - sleep 0.5 fi else # Checks if remotebuild variable has been set. @@ -80,10 +77,8 @@ fn_update_steamcmd_remotebuild(){ fn_update_steamcmd_compare(){ fn_print_dots "Checking for update: ${remotelocation}" - sleep 0.5 if [ "${localbuild}" != "${remotebuild}" ]; then fn_print_ok_nl "Checking for update: ${remotelocation}" - sleep 0.5 echo -en "\n" echo -e "Update available" echo -e "* Local build: ${red}${localbuild}${default}" @@ -99,7 +94,7 @@ fn_update_steamcmd_compare(){ fn_script_log_info "Branch: ${branch}" fi fn_script_log_info "${localbuild} > ${remotebuild}" - sleep 0.5 + fn_sleep_time echo -en "\n" echo -en "applying update.\r" sleep 1 @@ -128,7 +123,6 @@ fn_update_steamcmd_compare(){ alert.sh else fn_print_ok_nl "Checking for update: ${remotelocation}" - sleep 0.5 echo -en "\n" echo -e "No update available" echo -e "* Local build: ${green}${localbuild}${default}" @@ -156,22 +150,18 @@ fn_appmanifest_check(){ # Multiple or no matching appmanifest files may sometimes be present. # This error is corrected if required. if [ "${appmanifestfilewc}" -ge "2" ]; then - sleep 0.5 + fn_sleep_time fn_print_error "Multiple appmanifest_${appid}.acf files found" fn_script_log_error "Multiple appmanifest_${appid}.acf files found" - sleep 2 fn_print_dots "Removing x${appmanifestfilewc} appmanifest_${appid}.acf files" - sleep 0.5 for appfile in ${appmanifestfile}; do rm "${appfile}" done - sleep 0.5 appmanifestfilewc1="${appmanifestfilewc}" fn_appmanifest_info if [ "${appmanifestfilewc}" -ge "2" ]; then fn_print_fail "Unable to remove x${appmanifestfilewc} appmanifest_${appid}.acf files" fn_script_log_fatal "Unable to remove x${appmanifestfilewc} appmanifest_${appid}.acf files" - sleep 0.5 echo " * Check user permissions" for appfile in ${appmanifestfile}; do echo " ${appfile}" @@ -180,19 +170,15 @@ fn_appmanifest_check(){ else fn_print_ok "Removed x${appmanifestfilewc1} appmanifest_${appid}.acf files" fn_script_log_pass "Removed x${appmanifestfilewc1} appmanifest_${appid}.acf files" - sleep 0.5 fn_print_info_nl "Forcing update to correct issue" fn_script_log_info "Forcing update to correct issue" - sleep 0.5 fn_update_steamcmd_dl fi elif [ "${appmanifestfilewc}" -eq "0" ]; then fn_print_error_nl "No appmanifest_${appid}.acf found" fn_script_log_error "No appmanifest_${appid}.acf found" - sleep 0.5 fn_print_info_nl "Forcing update to correct issue" fn_script_log_info "Forcing update to correct issue" - sleep 0.5 fn_update_steamcmd_dl fn_appmanifest_info if [ "${appmanifestfilewc}" -eq "0" ]; then diff --git a/lgsm/functions/update_ts3.sh b/lgsm/functions/update_ts3.sh index e64bd8f3a..31a015e6e 100644 --- a/lgsm/functions/update_ts3.sh +++ b/lgsm/functions/update_ts3.sh @@ -33,18 +33,15 @@ fn_update_ts3_dl(){ fn_update_ts3_localbuild(){ # Gets local build info. fn_print_dots "Checking for update: ${remotelocation}: checking local build" - sleep 0.5 + fn_sleep_time # Uses log file to gather info. # Gives time for log file to generate. if [ ! -d "${serverfiles}/logs" ]||[ -z "$(find "${serverfiles}/logs/"* -name 'ts3server*_0.log' 2> /dev/null)" ]; then fn_print_error "Checking for update: ${remotelocation}: checking local build" - sleep 0.5 fn_print_error_nl "Checking for update: ${remotelocation}: checking local build: no log files" fn_script_log_error "No log file found" - sleep 0.5 fn_print_info_nl "Checking for update: ${remotelocation}: checking local build: forcing server restart" fn_script_log_info "Forcing server restart" - sleep 0.5 exitbypass=1 command_stop.sh exitbypass=1 @@ -64,9 +61,8 @@ fn_update_ts3_localbuild(){ fn_print_error "Checking for update: ${remotelocation}: waiting for log file: missing log file" fn_script_log_error "Missing log file" fn_script_log_error "Set localbuild to 0" - sleep 0.5 fi - + totalseconds=$((totalseconds + 1)) done fi @@ -84,7 +80,7 @@ fn_update_ts3_localbuild(){ if [ -z "${loopignore}" ]; then loopignore=1 fn_script_log_info "Waiting for local build to generate" - fi + fi localbuild=$(cat $(find ./* -name "ts3server*_0.log" 2> /dev/null | sort | tail -1) | grep -Eo "TeamSpeak 3 Server ((\.)?[0-9]{1,3}){1,3}\.[0-9]{1,3}" | grep -Eo "((\.)?[0-9]{1,3}){1,3}\.[0-9]{1,3}") if [ "${localbuild}" ]; then break @@ -93,7 +89,7 @@ fn_update_ts3_localbuild(){ totalseconds=$((totalseconds + 1)) done fi - + if [ -z "${localbuild}" ]; then localbuild="0" fn_print_error "Checking for update: ${remotelocation}: waiting for local build: missing local build info" @@ -103,7 +99,6 @@ fn_update_ts3_localbuild(){ fn_print_ok "Checking for update: ${remotelocation}: checking local build" fn_script_log_pass "Checking local build" fi - sleep 0.5 } fn_update_ts3_remotebuild(){ @@ -115,7 +110,6 @@ fn_update_ts3_remotebuild(){ fi if [ "${installer}" != "1" ]; then fn_print_dots "Checking for update: ${remotelocation}: checking remote build" - sleep 0.5 # Checks if remotebuild variable has been set. if [ -z "${remotebuild}" ]||[ "${remotebuild}" == "null" ]; then fn_print_fail "Checking for update: ${remotelocation}: checking remote build" @@ -124,7 +118,6 @@ fn_update_ts3_remotebuild(){ else fn_print_ok "Checking for update: ${remotelocation}: checking remote build" fn_script_log_pass "Checking remote build" - sleep 0.5 fi else # Checks if remotebuild variable has been set. @@ -133,18 +126,16 @@ fn_update_ts3_remotebuild(){ fn_script_log_fatal "Unable to get remote build" core_exit.sh fi - fi + fi } fn_update_ts3_compare(){ # Removes dots so if statement can compare version numbers. fn_print_dots "Checking for update: ${remotelocation}" - sleep 0.5 localbuilddigit=$(echo "${localbuild}" | tr -cd '[:digit:]') remotebuilddigit=$(echo "${remotebuild}" | tr -cd '[:digit:]') if [ "${localbuilddigit}" -ne "${remotebuilddigit}" ]||[ "${forceupdate}" == "1" ]; then fn_print_ok_nl "Checking for update: ${remotelocation}" - sleep 0.5 echo -en "\n" echo -e "Update available" echo -e "* Local build: ${red}${localbuild}${default}" @@ -153,7 +144,7 @@ fn_update_ts3_compare(){ fn_script_log_info "Local build: ${localbuild}" fn_script_log_info "Remote build: ${remotebuild}" fn_script_log_info "${localbuild} > ${remotebuild}" - sleep 0.5 + fn_sleep_time echo -en "\n" echo -en "applying update.\r" sleep 1 @@ -187,7 +178,6 @@ fn_update_ts3_compare(){ alert.sh else fn_print_ok_nl "Checking for update: ${remotelocation}" - sleep 0.5 echo -en "\n" echo -e "No update available" echo -e "* Local build: ${green}${localbuild}${default}" @@ -219,7 +209,6 @@ if [ "${installer}" == "1" ]; then else fn_print_dots "Checking for update: ${remotelocation}" fn_script_log_info "Checking for update: ${remotelocation}" - sleep 0.5 fn_update_ts3_localbuild fn_update_ts3_remotebuild fn_update_ts3_compare diff --git a/tests/tests_fctrserver.sh b/tests/tests_fctrserver.sh index 330742abb..4151a7f21 100644 --- a/tests/tests_fctrserver.sh +++ b/tests/tests_fctrserver.sh @@ -411,7 +411,6 @@ fn_setstatus(){ echo -e "\n" echo "Test starting:" echo "" - sleep 0.5 } # End of every test will expect the result to either pass or fail diff --git a/tests/tests_jc2server.sh b/tests/tests_jc2server.sh index f71d5a669..2f0103025 100644 --- a/tests/tests_jc2server.sh +++ b/tests/tests_jc2server.sh @@ -411,7 +411,6 @@ fn_setstatus(){ echo -e "\n" echo "Test starting:" echo "" - sleep 0.5 } # End of every test will expect the result to either pass or fail diff --git a/tests/tests_mcserver.sh b/tests/tests_mcserver.sh index 9e5eb5442..6df2da2ac 100644 --- a/tests/tests_mcserver.sh +++ b/tests/tests_mcserver.sh @@ -411,7 +411,6 @@ fn_setstatus(){ echo -e "\n" echo "Test starting:" echo "" - sleep 0.5 } # End of every test will expect the result to either pass or fail @@ -797,7 +796,7 @@ echo "give time for server to fully start." echo "Command: sleep 30" requiredstatus="ONLINE" fn_setstatus -sleep 60 +sleep 30 echo "" echo "5.1 - monitor - online" diff --git a/tests/tests_ts3server.sh b/tests/tests_ts3server.sh index 809bc2d2a..f4de2baa5 100644 --- a/tests/tests_ts3server.sh +++ b/tests/tests_ts3server.sh @@ -411,7 +411,6 @@ fn_setstatus(){ echo -e "\n" echo "Test starting:" echo "" - sleep 0.5 } # End of every test will expect the result to either pass or fail From 9d7c9cca5c9a9c6a3de16c35dedfbf6a320d561a Mon Sep 17 00:00:00 2001 From: Frisasky Date: Tue, 21 May 2019 04:47:33 +0800 Subject: [PATCH 088/534] fix(squadserver): resolve executable and config issues (#2362) Co-authored-by: Frisa --- lgsm/config-default/config-lgsm/squadserver/_default.cfg | 2 +- lgsm/functions/install_config.sh | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/lgsm/config-default/config-lgsm/squadserver/_default.cfg b/lgsm/config-default/config-lgsm/squadserver/_default.cfg index a4f2c704e..1d82936e5 100644 --- a/lgsm/config-default/config-lgsm/squadserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/squadserver/_default.cfg @@ -106,7 +106,7 @@ engine="unreal4" ## Server Specific Directories systemdir="${serverfiles}/Squad" executabledir="${serverfiles}" -executable="./SquadServer.sh" +executable="./SquadGameServer.sh" servercfg="${servicename}.cfg" servercfgdefault="Server.cfg" servercfgdir="${systemdir}/ServerConfig" diff --git a/lgsm/functions/install_config.sh b/lgsm/functions/install_config.sh index 997624f73..ccbcfea23 100644 --- a/lgsm/functions/install_config.sh +++ b/lgsm/functions/install_config.sh @@ -532,7 +532,7 @@ elif [ "${gamename}" == "Serious Sam 3: BFE" ]; then fn_set_config_vars elif [ "${gamename}" == "Squad" ]; then gamedirname="Squad" - array_configs+=( Server.cfg Rcon.cfg ) + array_configs+=( Admins.cfg Bans.cfg License.cfg Server.cfg Rcon.cfg ) fn_fetch_default_config fn_default_config_remote fn_set_config_vars From bab543a24d469c604dbf64047e4aca5e931e58b7 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Mon, 3 Jun 2019 17:58:54 +0100 Subject: [PATCH 089/534] Create FUNDING.yml --- .github/FUNDING.yml | 9 +++++++++ 1 file changed, 9 insertions(+) create mode 100644 .github/FUNDING.yml diff --git a/.github/FUNDING.yml b/.github/FUNDING.yml new file mode 100644 index 000000000..a93e5704d --- /dev/null +++ b/.github/FUNDING.yml @@ -0,0 +1,9 @@ +# These are supported funding model platforms + +github: # Replace with up to 4 GitHub Sponsors-enabled usernames e.g., [user1, user2] +patreon: dgibbs # Replace with a single Patreon username +open_collective: # Replace with a single Open Collective username +ko_fi: # Replace with a single Ko-fi username +tidelift: # Replace with a single Tidelift platform-name/package-name e.g., npm/babel +community_bridge: # Replace with a single Community Bridge project-name e.g., cloud-foundry +custom: # Replace with a single custom sponsorship URL From e9caaa9dbf64c6a589cecbf35523eb2016af8c7d Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Mon, 3 Jun 2019 18:01:50 +0100 Subject: [PATCH 090/534] Update FUNDING.yml --- .github/FUNDING.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/FUNDING.yml b/.github/FUNDING.yml index a93e5704d..7c0234ea5 100644 --- a/.github/FUNDING.yml +++ b/.github/FUNDING.yml @@ -6,4 +6,4 @@ open_collective: # Replace with a single Open Collective username ko_fi: # Replace with a single Ko-fi username tidelift: # Replace with a single Tidelift platform-name/package-name e.g., npm/babel community_bridge: # Replace with a single Community Bridge project-name e.g., cloud-foundry -custom: # Replace with a single custom sponsorship URL +PayPal: https://www.paypal.me/dgibbs64 # Replace with a single custom sponsorship URL From e2ca77de3b95a737b6aaf4d7454362e354e3ba30 Mon Sep 17 00:00:00 2001 From: tkrn Date: Mon, 3 Jun 2019 16:37:44 -0400 Subject: [PATCH 091/534] feat(newserver): Soldier of Fortune 2: Gold Edition (#2359) Co-authored-by: tkrn --- .../config-lgsm/sof2server/_default.cfg | 119 ++++++++++++++++++ lgsm/data/serverlist.csv | 1 + lgsm/functions/core_functions.sh | 5 + lgsm/functions/fix.sh | 2 + lgsm/functions/fix_sof2.sh | 11 ++ lgsm/functions/info_config.sh | 23 ++++ lgsm/functions/info_glibc.sh | 3 + lgsm/functions/info_messages.sh | 11 ++ lgsm/functions/info_parms.sh | 14 +++ lgsm/functions/install_config.sh | 6 + lgsm/functions/install_server_files.sh | 2 + 11 files changed, 197 insertions(+) create mode 100644 lgsm/config-default/config-lgsm/sof2server/_default.cfg create mode 100644 lgsm/functions/fix_sof2.sh diff --git a/lgsm/config-default/config-lgsm/sof2server/_default.cfg b/lgsm/config-default/config-lgsm/sof2server/_default.cfg new file mode 100644 index 000000000..cb35b339c --- /dev/null +++ b/lgsm/config-default/config-lgsm/sof2server/_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://docs.linuxgsm.com/configuration/start-parameters +ip="0.0.0.0" +port="20100" +defaultmap="mp_shop" + +## Server Start Command | https://docs.linuxgsm.com/configuration/start-parameters#additional-parameters +fn_parms(){ +parms="+set sv_punkbuster 0 +set dedicated 2 +set net_ip ${ip} +set net_port ${port} +exec ${servercfg} +map ${defaultmap}" +} + +#### LinuxGSM Settings #### + +## Notification Alerts +# (on|off) + +# More info | https://docs.linuxgsm.com/alerts#more-info +postalert="off" +postdays="7" +posttarget="https://hastebin.com" + +# Discord Alerts | https://docs.linuxgsm.com/alerts/discord +discordalert="off" +discordwebhook="webhook" + +# Email Alerts | https://docs.linuxgsm.com/alerts/email +emailalert="off" +email="email@example.com" +emailfrom="" + +# IFTTT Alerts | https://docs.linuxgsm.com/alerts/ifttt +iftttalert="off" +ifttttoken="accesstoken" +iftttevent="linuxgsm_alert" + +# Mailgun Email Alerts | https://docs.linuxgsm.com/alerts/mailgun +mailgunalert="off" +mailguntoken="accesstoken" +mailgundomain="example.com" +mailgunemailfrom="alert@example.com" +mailgunemail="email@myemail.com" + +# Pushbullet Alerts | https://docs.linuxgsm.com/alerts/pushbullet +pushbulletalert="off" +pushbullettoken="accesstoken" +channeltag="" + +# Pushover Alerts | https://docs.linuxgsm.com/alerts/pushover +pushoveralert="off" +pushovertoken="accesstoken" + +# Telegram Alerts | https://docs.linuxgsm.com/alerts/telegram +# You can add a custom cURL string eg proxy (useful in Russia) or else in "curlcustomstring". +# like a "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help", if you not need +# any custom string in curl - simple ignore this parameter. +telegramalert="off" +telegramtoken="accesstoken" +telegramchatid="" +curlcustomstring="" + +## Backup | https://docs.linuxgsm.com/commands/backup +maxbackups="4" +maxbackupdays="30" +stoponbackup="on" + +## Logging | https://docs.linuxgsm.com/features/logging +consolelogging="on" +logdays="7" + +#### LinuxGSM Advanced Settings #### + +# ANSI Colors +ansi="on" + +# Message Display Time +sleeptime="0.5" + +## LinuxGSM Server Details +# Do not edit +gamename="Soldier Of Fortune 2: Gold Edition" +engine="idtech3" + +#### Directories #### +# Edit with care + +## Server Specific Directories +systemdir="${serverfiles}/main" +executabledir="${serverfiles}" +executable="./sof2ded" +servercfg="${servicename}.cfg" +servercfgdefault="server.cfg" +servercfgdir="${systemdir}" +servercfgfullpath="${servercfgdir}/${servercfg}" + +## Backup Directory +backupdir="${rootdir}/backups" + +## Logging Directories +logdir="${rootdir}/log" +gamelogdir="${serverfiles}/Logs" +lgsmlogdir="${logdir}/script" +consolelogdir="${logdir}/console" +lgsmlog="${lgsmlogdir}/${servicename}-script.log" +consolelog="${consolelogdir}/${servicename}-console.log" +alertlog="${lgsmlogdir}/${servicename}-alert.log" +postdetailslog="${lgsmlogdir}/${servicename}-postdetails.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/data/serverlist.csv b/lgsm/data/serverlist.csv index 4eefca614..b9494bede 100644 --- a/lgsm/data/serverlist.csv +++ b/lgsm/data/serverlist.csv @@ -70,6 +70,7 @@ rust,rustserver,Rust rw,rwserver, Rising World samp,sampserver,San Andreas Multiplayer sbots,sbotsserver, StickyBots +sof2,sof2server,Soldier Of Fortune 2: Gold Edition ss3,ss3server,Serious Sam 3: BFE sb,sbserver,Starbound st,stserver,Stationeers diff --git a/lgsm/functions/core_functions.sh b/lgsm/functions/core_functions.sh index dd18e0d2c..e8346dae1 100644 --- a/lgsm/functions/core_functions.sh +++ b/lgsm/functions/core_functions.sh @@ -382,6 +382,11 @@ functionfile="${FUNCNAME}" fn_fetch_function } +fix_sof2.sh(){ +functionfile="${FUNCNAME}" +fn_fetch_function +} + fix_ss3.sh(){ functionfile="${FUNCNAME}" fn_fetch_function diff --git a/lgsm/functions/fix.sh b/lgsm/functions/fix.sh index 9fddc3189..a92d1b855 100644 --- a/lgsm/functions/fix.sh +++ b/lgsm/functions/fix.sh @@ -55,6 +55,8 @@ if [ "${function_selfname}" != "command_install.sh" ]&&[ -z "${fixbypass}" ]; th fix_rw.sh elif [ "${shortname}" == "sdtd" ]; then fix_sdtd.sh + elif [ "${shortname}" == "sof2" ]; then + fix_sof2.sh elif [ "${shortname}" == "ss3" ]; then fix_ss3.sh elif [ "${shortname}" == "tf2" ]; then diff --git a/lgsm/functions/fix_sof2.sh b/lgsm/functions/fix_sof2.sh new file mode 100644 index 000000000..2715f7f8c --- /dev/null +++ b/lgsm/functions/fix_sof2.sh @@ -0,0 +1,11 @@ +#!/bin/bash +# LinuxGSM fix_rust.sh function +# Author: Daniel Gibbs +# Website: https://linuxgsm.com +# Description: Resolves startup issue with Soldier of Fortune 2 + +local commandname="FIX" +local commandaction="Fix" + +# Fixes: error while loading shared libraries: libcxa.so.1 +export LD_LIBRARY_PATH=":$LD_LIBRARY_PATH" diff --git a/lgsm/functions/info_config.sh b/lgsm/functions/info_config.sh index 2af5ab5da..11ddb95ec 100644 --- a/lgsm/functions/info_config.sh +++ b/lgsm/functions/info_config.sh @@ -650,6 +650,26 @@ fn_info_config_sbots(){ maxplayers=${maxplayers:-"0"} } +fn_info_config_sof2(){ + if [ ! -f "${servercfgfullpath}" ]; then + rconpassword="${unavailable}" + servername="${unavailable}" + serverpassword="${unavailable}" + maxplayers="${zero}" + else + 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]*$//') + 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:]') + + # Not Set + rconpassword=${rconpassword:-"NOT SET"} + servername=${servername:-"NOT SET"} + serverpassword=${serverpassword:-"NOT SET"} + maxplayers=${maxplayers:-"0"} + fi +} + fn_info_config_source(){ if [ ! -f "${servercfgfullpath}" ]; then servername="${unavailable}" @@ -1250,6 +1270,9 @@ elif [ "${shortname}" == "rw" ]; then # Serious Sam elif [ "${shortname}" == "ss3" ]; then fn_info_config_seriousengine35 +# Soldier Of Fortune 2: Gold Edition +elif [ "${shortname}" == "sof2" ]; then + fn_info_config_sof2 # Source Engine Games elif [ "${engine}" == "source" ]||[ "${engine}" == "goldsource" ]; then fn_info_config_source diff --git a/lgsm/functions/info_glibc.sh b/lgsm/functions/info_glibc.sh index 63bbdd6d5..b82140b24 100644 --- a/lgsm/functions/info_glibc.sh +++ b/lgsm/functions/info_glibc.sh @@ -111,6 +111,9 @@ elif [ "${gamename}" == "Return to Castle Wolfenstein" ]; then elif [ "${shortname}" == "rw" ]; then glibcrequired="2.14" glibcfix="no" +elif [ "${gamename}" == "Soldier Of Fortune 2: Gold Edition" ]; then + glibcrequired="2.1" + glibcfix="no" elif [ "${gamename}" == "San Andreas Multiplayer" ]; then glibcrequired="2.3" glibcfix="no" diff --git a/lgsm/functions/info_messages.sh b/lgsm/functions/info_messages.sh index 3cdfb6477..a5cb8bce1 100644 --- a/lgsm/functions/info_messages.sh +++ b/lgsm/functions/info_messages.sh @@ -942,6 +942,15 @@ fn_info_message_sdtd(){ } | column -s $'\t' -t } +fn_info_message_sof2(){ + echo -e "netstat -atunp | grep sof2ded" + echo -e "" + { + echo -e "DESCRIPTION\tDIRECTION\tPORT\tPROTOCOL" + echo -e "> Game/Query\tINBOUND\t${port}\tudp" + } | column -s $'\t' -t +} + fn_info_message_source(){ echo -e "netstat -atunp | grep srcds_linux" echo -e "" @@ -1284,6 +1293,8 @@ fn_info_message_select_engine(){ fn_info_message_seriousengine35 elif [ "${engine}" == "source" ]; then fn_info_message_source + elif [ "${gamename}" == "Soldier Of Fortune 2: Gold Edition" ]; then + fn_info_message_sof2 elif [ "${engine}" == "spark" ]; then fn_info_message_spark elif [ "${engine}" == "starbound" ]; then diff --git a/lgsm/functions/info_parms.sh b/lgsm/functions/info_parms.sh index 544c8178c..7b080036d 100644 --- a/lgsm/functions/info_parms.sh +++ b/lgsm/functions/info_parms.sh @@ -111,6 +111,11 @@ fn_info_parms_rust(){ tickrate=${tickrate:-"0"} } +fn_info_parms_sof2(){ + port=${port:-"0"} + defaultmap=${defaultmap:-"NOT SET"} +} + fn_info_parms_source(){ defaultmap=${defaultmap:-"NOT SET"} maxplayers=${maxplayers:-"0"} @@ -141,6 +146,12 @@ fn_info_parms_stickybots(){ maxplayers=${maxplayers:-"0"} } +fn_info_parms_sof2(){ + port=${port:-"0"} + queryport=${port} + defaultmap=${defaultmap:-"NOT SET"} +} + fn_info_parms_towerunite(){ port=${port:-"0"} queryport=${queryport:-"0"} @@ -214,6 +225,9 @@ elif [ "${shortname}" == "rust" ]; then # Rising World elif [ "${shortname}" == "rw" ]; then fn_info_parms_risingworld +# Soldier Of Fortune 2: Gold Edition +elif [ "${shortname}" == "sof2" ]; then + fn_info_parms_sof2 # Sticky Bots elif [ "${shortname}" == "sbots" ]; then fn_info_parms_stickybots diff --git a/lgsm/functions/install_config.sh b/lgsm/functions/install_config.sh index ccbcfea23..cb5a431ad 100644 --- a/lgsm/functions/install_config.sh +++ b/lgsm/functions/install_config.sh @@ -530,6 +530,12 @@ elif [ "${gamename}" == "Serious Sam 3: BFE" ]; then fn_fetch_default_config fn_default_config_remote fn_set_config_vars +elif [ "${gamename}" == "Soldier Of Fortune 2: Gold Edition" ]; then + gamedirname="SoldierOfFortune2Gold" + array_configs+=( server.cfg mapcycle.txt) + fn_fetch_default_config + fn_default_config_remote + fn_set_config_vars elif [ "${gamename}" == "Squad" ]; then gamedirname="Squad" array_configs+=( Admins.cfg Bans.cfg License.cfg Server.cfg Rcon.cfg ) diff --git a/lgsm/functions/install_server_files.sh b/lgsm/functions/install_server_files.sh index e921e9c15..cf2ee3e90 100644 --- a/lgsm/functions/install_server_files.sh +++ b/lgsm/functions/install_server_files.sh @@ -37,6 +37,8 @@ fn_install_server_files(){ remote_fileurl="https://files.linuxgsm.com/QuakeWorld/nquake.server.linux.190506.full.tar.bz2"; local_filedir="${tmpdir}"; local_filename="nquake.server.linux.190506.full.tar.bz2"; chmodx="nochmodx" run="norun"; force="noforce"; md5="74405ec030463c5e1175e776ab572d32" elif [ "${shortname}" == "rtcw" ]; then remote_fileurl="https://files.linuxgsm.com/ReturnToCastleWolfenstein/iortcw-1.51c-x86_64-server-linux-20190507.tar.bz2"; local_filedir="${tmpdir}"; local_filename="iortcw-1.51c-x86_64-server-linux-20190507.tar.bz2"; chmodx="nochmodx" run="norun"; force="noforce"; md5="6a3be9700372b228d1187422464e4212" + elif [ "${shortname}" == "sof2" ]; then + remote_fileurl="https://files.linuxgsm.com/SoldierOfFortune2/sof2gold-1.03.tar.bz2"; local_filedir="${tmpdir}"; local_filename="sof2gold-1.03.tar.bz2"; chmodx="nochmodx" run="norun"; force="noforce"; md5="871b1dc0dafeeace65b198119e8fa200" elif [ "${shortname}" == "ut2k4" ]; then remote_fileurl="https://files.linuxgsm.com/UnrealTournament2004/ut2004-server-3369-2-ultimate-linux.tar.bz2"; local_filedir="${tmpdir}"; local_filename="ut2004-server-3369-2-ultimate-linux.tar.bz2"; chmodx="nochmodx" run="norun"; force="noforce"; md5="67c5e2cd9c2a4b04f163962ee41eff54" elif [ "${shortname}" == "ut99" ]; then From c4978b6ce8761dfb7554ab2ed7c8575c2987324a Mon Sep 17 00:00:00 2001 From: Kirill Shamilin Date: Mon, 3 Jun 2019 23:40:32 +0300 Subject: [PATCH 092/534] fix(ts3server): fix ability to update TS3 on older i686 arch. (#2367) Co-authored-by: Kirill Shamilin --- lgsm/functions/update_ts3.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lgsm/functions/update_ts3.sh b/lgsm/functions/update_ts3.sh index 31a015e6e..bef15b53b 100644 --- a/lgsm/functions/update_ts3.sh +++ b/lgsm/functions/update_ts3.sh @@ -103,9 +103,9 @@ fn_update_ts3_localbuild(){ fn_update_ts3_remotebuild(){ # Gets remote build info. - if [ "${arch}" == "x86_64" ]; then + if [ "${ts3arch}" == "x86_64" ]; then remotebuild="$(${curlpath} -s "https://www.teamspeak.com/versions/server.json" | jq -r '.linux.x86_64.version')" - elif [ "${arch}" == "x86" ]; then + elif [ "${ts3arch}" == "x86" ]; then remotebuild="$(${curlpath} -s "https://www.teamspeak.com/versions/server.json" | jq -r '.linux.x86.version')" fi if [ "${installer}" != "1" ]; then From a9116929bd8acb4cdcbd085525a74a180102d055 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Tue, 4 Jun 2019 14:26:58 +0100 Subject: [PATCH 093/534] Create issue_label_bot.yaml --- .github/issue_label_bot.yaml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 .github/issue_label_bot.yaml diff --git a/.github/issue_label_bot.yaml b/.github/issue_label_bot.yaml new file mode 100644 index 000000000..ee6d724f1 --- /dev/null +++ b/.github/issue_label_bot.yaml @@ -0,0 +1,4 @@ +label-alias: + bug: 'type: bug' + feature_request: 'type: feature request' + question: 'question' From 5f50c2849dc57763cd4b96546669495ee636d068 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Fri, 7 Jun 2019 16:07:15 +0100 Subject: [PATCH 094/534] Update FUNDING.yml --- .github/FUNDING.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/FUNDING.yml b/.github/FUNDING.yml index 7c0234ea5..269038098 100644 --- a/.github/FUNDING.yml +++ b/.github/FUNDING.yml @@ -6,4 +6,4 @@ open_collective: # Replace with a single Open Collective username ko_fi: # Replace with a single Ko-fi username tidelift: # Replace with a single Tidelift platform-name/package-name e.g., npm/babel community_bridge: # Replace with a single Community Bridge project-name e.g., cloud-foundry -PayPal: https://www.paypal.me/dgibbs64 # Replace with a single custom sponsorship URL +other: https://www.paypal.me/dgibbs64 # Replace with a single custom sponsorship URL From 67d0edb02e102ed36db5564f74cd831159be0afa Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Fri, 7 Jun 2019 16:07:55 +0100 Subject: [PATCH 095/534] Update FUNDING.yml --- .github/FUNDING.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/FUNDING.yml b/.github/FUNDING.yml index 269038098..62f2cf7a8 100644 --- a/.github/FUNDING.yml +++ b/.github/FUNDING.yml @@ -6,4 +6,4 @@ open_collective: # Replace with a single Open Collective username ko_fi: # Replace with a single Ko-fi username tidelift: # Replace with a single Tidelift platform-name/package-name e.g., npm/babel community_bridge: # Replace with a single Community Bridge project-name e.g., cloud-foundry -other: https://www.paypal.me/dgibbs64 # Replace with a single custom sponsorship URL +custom: https://www.paypal.me/dgibbs64 # Replace with a single custom sponsorship URL From ef130971753144de3eca3f98c91538df1606ae37 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Sun, 9 Jun 2019 00:21:26 +0100 Subject: [PATCH 096/534] Revert "fix(ts3server): fix ability to update TS3 on older i686 arch. (#2367)" (#2381) This reverts commit c4978b6ce8761dfb7554ab2ed7c8575c2987324a. --- lgsm/functions/update_ts3.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lgsm/functions/update_ts3.sh b/lgsm/functions/update_ts3.sh index bef15b53b..31a015e6e 100644 --- a/lgsm/functions/update_ts3.sh +++ b/lgsm/functions/update_ts3.sh @@ -103,9 +103,9 @@ fn_update_ts3_localbuild(){ fn_update_ts3_remotebuild(){ # Gets remote build info. - if [ "${ts3arch}" == "x86_64" ]; then + if [ "${arch}" == "x86_64" ]; then remotebuild="$(${curlpath} -s "https://www.teamspeak.com/versions/server.json" | jq -r '.linux.x86_64.version')" - elif [ "${ts3arch}" == "x86" ]; then + elif [ "${arch}" == "x86" ]; then remotebuild="$(${curlpath} -s "https://www.teamspeak.com/versions/server.json" | jq -r '.linux.x86.version')" fi if [ "${installer}" != "1" ]; then From c4ff9c80faca7b08ada26d1d47d5189f9cfda6fa Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Sun, 9 Jun 2019 00:38:10 +0100 Subject: [PATCH 097/534] feat(glibc): migrate glibc info to _default.cfg (#2379) --- .../config-lgsm/arkserver/_default.cfg | 3 +- .../config-lgsm/arma3server/_default.cfg | 3 +- .../config-lgsm/bb2server/_default.cfg | 3 +- .../config-lgsm/bbserver/_default.cfg | 3 +- .../config-lgsm/bdserver/_default.cfg | 3 +- .../config-lgsm/bf1942server/_default.cfg | 3 +- .../config-lgsm/bmdmserver/_default.cfg | 3 +- .../config-lgsm/boserver/_default.cfg | 3 +- .../config-lgsm/bsserver/_default.cfg | 3 +- .../config-lgsm/bt1944server/_default.cfg | 3 +- .../config-lgsm/ccserver/_default.cfg | 3 +- .../config-lgsm/cod2server/_default.cfg | 3 +- .../config-lgsm/cod4server/_default.cfg | 3 +- .../config-lgsm/codserver/_default.cfg | 3 +- .../config-lgsm/coduoserver/_default.cfg | 3 +- .../config-lgsm/codwawserver/_default.cfg | 3 +- .../config-lgsm/csczserver/_default.cfg | 3 +- .../config-lgsm/csgoserver/_default.cfg | 5 +- .../config-lgsm/csserver/_default.cfg | 3 +- .../config-lgsm/cssserver/_default.cfg | 3 +- .../config-lgsm/dabserver/_default.cfg | 3 +- .../config-lgsm/dmcserver/_default.cfg | 3 +- .../config-lgsm/dodserver/_default.cfg | 3 +- .../config-lgsm/dodsserver/_default.cfg | 3 +- .../config-lgsm/doiserver/_default.cfg | 3 +- .../config-lgsm/dstserver/_default.cfg | 3 +- .../config-lgsm/dysserver/_default.cfg | 3 +- .../config-lgsm/ecoserver/_default.cfg | 3 +- .../config-lgsm/emserver/_default.cfg | 3 +- .../config-lgsm/etlserver/_default.cfg | 3 +- .../config-lgsm/fctrserver/_default.cfg | 3 +- .../config-lgsm/fofserver/_default.cfg | 3 +- .../config-lgsm/gesserver/_default.cfg | 4 +- .../config-lgsm/gmodserver/_default.cfg | 3 +- .../config-lgsm/hl2dmserver/_default.cfg | 3 +- .../config-lgsm/hldmserver/_default.cfg | 3 +- .../config-lgsm/hldmsserver/_default.cfg | 3 +- .../config-lgsm/hwserver/_default.cfg | 3 +- .../config-lgsm/insserver/_default.cfg | 3 +- .../config-lgsm/inssserver/_default.cfg | 3 +- .../config-lgsm/iosserver/_default.cfg | 3 +- .../config-lgsm/jc2server/_default.cfg | 3 +- .../config-lgsm/jc3server/_default.cfg | 3 +- .../config-lgsm/kf2server/_default.cfg | 4 +- .../config-lgsm/kfserver/_default.cfg | 3 +- .../config-lgsm/l4d2server/_default.cfg | 3 +- .../config-lgsm/l4dserver/_default.cfg | 3 +- .../config-lgsm/mcserver/_default.cfg | 3 +- .../config-lgsm/mhserver/_default.cfg | 3 +- .../config-lgsm/mtaserver/_default.cfg | 3 +- .../config-lgsm/mumbleserver/_default.cfg | 4 +- .../config-lgsm/ndserver/_default.cfg | 3 +- .../config-lgsm/nmrihserver/_default.cfg | 3 +- .../config-lgsm/ns2cserver/_default.cfg | 3 +- .../config-lgsm/ns2server/_default.cfg | 3 +- .../config-lgsm/nsserver/_default.cfg | 3 +- .../config-lgsm/opforserver/_default.cfg | 3 +- .../config-lgsm/pcserver/_default.cfg | 3 +- .../config-lgsm/pstbsserver/_default.cfg | 3 +- .../config-lgsm/pvkiiserver/_default.cfg | 3 +- .../config-lgsm/pzserver/_default.cfg | 3 +- .../config-lgsm/q2server/_default.cfg | 3 +- .../config-lgsm/q3server/_default.cfg | 3 +- .../config-lgsm/qlserver/_default.cfg | 3 +- .../config-lgsm/qwserver/_default.cfg | 3 +- .../config-lgsm/ricochetserver/_default.cfg | 3 +- .../config-lgsm/roserver/_default.cfg | 3 +- .../config-lgsm/rtcwserver/_default.cfg | 3 +- .../config-lgsm/rustserver/_default.cfg | 3 +- .../config-lgsm/rwserver/_default.cfg | 3 +- .../config-lgsm/sampserver/_default.cfg | 3 +- .../config-lgsm/sbotsserver/_default.cfg | 5 +- .../config-lgsm/sbserver/_default.cfg | 3 +- .../config-lgsm/sdtdserver/_default.cfg | 3 +- .../config-lgsm/sof2server/_default.cfg | 1 + .../config-lgsm/squadserver/_default.cfg | 3 +- .../config-lgsm/ss3server/_default.cfg | 3 +- .../config-lgsm/stserver/_default.cfg | 4 +- .../config-lgsm/svenserver/_default.cfg | 3 +- .../config-lgsm/terrariaserver/_default.cfg | 3 +- .../config-lgsm/tf2server/_default.cfg | 3 +- .../config-lgsm/tfcserver/_default.cfg | 3 +- .../config-lgsm/ts3server/_default.cfg | 4 +- .../config-lgsm/tuserver/_default.cfg | 3 +- .../config-lgsm/twserver/_default.cfg | 3 +- .../config-lgsm/untserver/_default.cfg | 3 +- .../config-lgsm/ut2k4server/_default.cfg | 3 +- .../config-lgsm/ut3server/_default.cfg | 3 +- .../config-lgsm/ut99server/_default.cfg | 3 +- .../config-lgsm/utserver/_default.cfg | 3 +- .../config-lgsm/vsserver/_default.cfg | 3 +- .../config-lgsm/wetserver/_default.cfg | 3 +- .../config-lgsm/wurmserver/_default.cfg | 3 +- .../config-lgsm/zpsserver/_default.cfg | 3 +- lgsm/functions/alert.sh | 3 +- lgsm/functions/check_glibc.sh | 22 +- lgsm/functions/command_debug.sh | 19 +- lgsm/functions/command_details.sh | 2 - lgsm/functions/command_postdetails.sh | 1 - lgsm/functions/core_functions.sh | 7 +- lgsm/functions/info_distro.sh | 7 + lgsm/functions/info_glibc.sh | 236 ------------------ lgsm/functions/info_messages.sh | 17 +- 103 files changed, 235 insertions(+), 368 deletions(-) delete mode 100644 lgsm/functions/info_glibc.sh diff --git a/lgsm/config-default/config-lgsm/arkserver/_default.cfg b/lgsm/config-default/config-lgsm/arkserver/_default.cfg index 9306d3b4e..be19aacf6 100644 --- a/lgsm/config-default/config-lgsm/arkserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/arkserver/_default.cfg @@ -88,7 +88,7 @@ logdays="7" # ANSI Colors ansi="on" -# Message Display Time +# Message Display Time sleeptime="0.5" ## SteamCMD Settings @@ -103,6 +103,7 @@ branch="" # Do not edit gamename="ARK: Survival Evolved" engine="unreal4" +glibc="2.15" #### Directories #### # Edit with care diff --git a/lgsm/config-default/config-lgsm/arma3server/_default.cfg b/lgsm/config-default/config-lgsm/arma3server/_default.cfg index 07fff7375..a456e1b44 100644 --- a/lgsm/config-default/config-lgsm/arma3server/_default.cfg +++ b/lgsm/config-default/config-lgsm/arma3server/_default.cfg @@ -102,7 +102,7 @@ logdays="7" # ANSI Colors ansi="on" -# Message Display Time +# Message Display Time sleeptime="0.5" ## SteamCMD Settings @@ -117,6 +117,7 @@ branch="" # Do not edit gamename="ARMA 3" engine="realvirtuality" +glibc="2.13" #### Directories #### # Edit with care diff --git a/lgsm/config-default/config-lgsm/bb2server/_default.cfg b/lgsm/config-default/config-lgsm/bb2server/_default.cfg index e04d61e72..0a45d187f 100644 --- a/lgsm/config-default/config-lgsm/bb2server/_default.cfg +++ b/lgsm/config-default/config-lgsm/bb2server/_default.cfg @@ -92,7 +92,7 @@ logdays="7" # ANSI Colors ansi="on" -# Message Display Time +# Message Display Time sleeptime="0.5" ## SteamCMD Settings @@ -107,6 +107,7 @@ branch="" # Do not edit gamename="BrainBread 2" engine="source" +glibc="2.17" #### Directories #### # Edit with care diff --git a/lgsm/config-default/config-lgsm/bbserver/_default.cfg b/lgsm/config-default/config-lgsm/bbserver/_default.cfg index 2b891d4ed..1ee54e0c1 100644 --- a/lgsm/config-default/config-lgsm/bbserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/bbserver/_default.cfg @@ -86,7 +86,7 @@ logdays="7" # ANSI Colors ansi="on" -# Message Display Time +# Message Display Time sleeptime="0.5" ## SteamCMD Settings @@ -102,6 +102,7 @@ branch="" # Do not edit gamename="BrainBread" engine="goldsource" +glibc="2.3.4" #### Directories #### # Edit with care diff --git a/lgsm/config-default/config-lgsm/bdserver/_default.cfg b/lgsm/config-default/config-lgsm/bdserver/_default.cfg index 602936e6d..404b3b796 100644 --- a/lgsm/config-default/config-lgsm/bdserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/bdserver/_default.cfg @@ -86,7 +86,7 @@ logdays="7" # ANSI Colors ansi="on" -# Message Display Time +# Message Display Time sleeptime="0.5" ## SteamCMD Settings @@ -97,6 +97,7 @@ appid="817300" # Do not edit gamename="Base Defense" engine="goldsource" +glibc="2.14" #### Directories #### # Edit with care diff --git a/lgsm/config-default/config-lgsm/bf1942server/_default.cfg b/lgsm/config-default/config-lgsm/bf1942server/_default.cfg index c0f799198..a047bbfb7 100644 --- a/lgsm/config-default/config-lgsm/bf1942server/_default.cfg +++ b/lgsm/config-default/config-lgsm/bf1942server/_default.cfg @@ -79,13 +79,14 @@ logdays="7" # ANSI Colors ansi="on" -# Message Display Time +# Message Display Time sleeptime="0.5" ## LinuxGSM Server Details # Do not edit gamename="Battlefield: 1942" engine="refractor" +glibc="2.0" #### Directories #### # Edit with care diff --git a/lgsm/config-default/config-lgsm/bmdmserver/_default.cfg b/lgsm/config-default/config-lgsm/bmdmserver/_default.cfg index 4eb1ceec3..2e27bf99e 100644 --- a/lgsm/config-default/config-lgsm/bmdmserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/bmdmserver/_default.cfg @@ -92,7 +92,7 @@ logdays="7" # ANSI Colors ansi="on" -# Message Display Time +# Message Display Time sleeptime="0.5" ## SteamCMD Settings @@ -107,6 +107,7 @@ branch="" # Do not edit gamename="Black Mesa: Deathmatch" engine="source" +glibc="2.15" #### Directories #### # Edit with care diff --git a/lgsm/config-default/config-lgsm/boserver/_default.cfg b/lgsm/config-default/config-lgsm/boserver/_default.cfg index 77a5b0b4b..c41c23b85 100644 --- a/lgsm/config-default/config-lgsm/boserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/boserver/_default.cfg @@ -85,7 +85,7 @@ logdays="7" # ANSI Colors ansi="on" -# Message Display Time +# Message Display Time sleeptime="0.5" ## SteamCMD Settings @@ -100,6 +100,7 @@ branch="" # Do not edit gamename="Ballistic Overkill" engine="unity3d" +glibc="2.15" #### Directories #### # Edit with care diff --git a/lgsm/config-default/config-lgsm/bsserver/_default.cfg b/lgsm/config-default/config-lgsm/bsserver/_default.cfg index e9294e0a4..d6ed55c81 100644 --- a/lgsm/config-default/config-lgsm/bsserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/bsserver/_default.cfg @@ -96,7 +96,7 @@ logdays="7" # ANSI Colors ansi="on" -# Message Display Time +# Message Display Time sleeptime="0.5" ## SteamCMD Settings @@ -111,6 +111,7 @@ branch="" # Do not edit gamename="Blade Symphony" engine="source" +glibc="2.15" #### Directories #### # Edit with care diff --git a/lgsm/config-default/config-lgsm/bt1944server/_default.cfg b/lgsm/config-default/config-lgsm/bt1944server/_default.cfg index dcb01817b..dfc6333dc 100644 --- a/lgsm/config-default/config-lgsm/bt1944server/_default.cfg +++ b/lgsm/config-default/config-lgsm/bt1944server/_default.cfg @@ -84,7 +84,7 @@ logdays="7" # ANSI Colors ansi="on" -# Message Display Time +# Message Display Time sleeptime="0.5" ## SteamCMD Settings @@ -99,6 +99,7 @@ branch="" # Do not edit gamename="Battalion 1944" engine="unreal4" +glibc="2.17" #### Directories #### # Edit with care diff --git a/lgsm/config-default/config-lgsm/ccserver/_default.cfg b/lgsm/config-default/config-lgsm/ccserver/_default.cfg index f07e8bf87..5fd37c64c 100644 --- a/lgsm/config-default/config-lgsm/ccserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/ccserver/_default.cfg @@ -87,7 +87,7 @@ logdays="7" # ANSI Colors ansi="on" -# Message Display Time +# Message Display Time sleeptime="0.5" ## SteamCMD Settings @@ -102,6 +102,7 @@ branch="" # Do not edit gamename="Codename CURE" engine="source" +glibc="2.15" #### Directories #### # Edit with care diff --git a/lgsm/config-default/config-lgsm/cod2server/_default.cfg b/lgsm/config-default/config-lgsm/cod2server/_default.cfg index 1bbc6abb2..be01e6fb4 100644 --- a/lgsm/config-default/config-lgsm/cod2server/_default.cfg +++ b/lgsm/config-default/config-lgsm/cod2server/_default.cfg @@ -82,13 +82,14 @@ logdays="7" # ANSI Colors ansi="on" -# Message Display Time +# Message Display Time sleeptime="0.5" ## LinuxGSM Server Details # Do not edit gamename="Call of Duty 2" engine="iw2.0" +glibc="2.1.3" #### Directories #### # Edit with care diff --git a/lgsm/config-default/config-lgsm/cod4server/_default.cfg b/lgsm/config-default/config-lgsm/cod4server/_default.cfg index d2da96d90..01fe6f560 100644 --- a/lgsm/config-default/config-lgsm/cod4server/_default.cfg +++ b/lgsm/config-default/config-lgsm/cod4server/_default.cfg @@ -82,13 +82,14 @@ logdays="7" # ANSI Colors ansi="on" -# Message Display Time +# Message Display Time sleeptime="0.5" ## LinuxGSM Server Details # Do not edit gamename="Call of Duty 4" engine="iw3.0" +glibc="2.3" #### Directories #### # Edit with care diff --git a/lgsm/config-default/config-lgsm/codserver/_default.cfg b/lgsm/config-default/config-lgsm/codserver/_default.cfg index 6797cf433..cd3db5ec5 100644 --- a/lgsm/config-default/config-lgsm/codserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/codserver/_default.cfg @@ -82,13 +82,14 @@ logdays="7" # ANSI Colors ansi="on" -# Message Display Time +# Message Display Time sleeptime="0.5" ## LinuxGSM Server Details # Do not edit gamename="Call of Duty" engine="idtech3" +glibc="2.1" #### Directories #### # Edit with care diff --git a/lgsm/config-default/config-lgsm/coduoserver/_default.cfg b/lgsm/config-default/config-lgsm/coduoserver/_default.cfg index ea142dee9..36b08300e 100644 --- a/lgsm/config-default/config-lgsm/coduoserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/coduoserver/_default.cfg @@ -82,13 +82,14 @@ logdays="7" # ANSI Colors ansi="on" -# Message Display Time +# Message Display Time sleeptime="0.5" ## LinuxGSM Server Details # Do not edit gamename="Call of Duty: United Offensive" engine="idtech3" +glibc="2.1" #### Directories #### # Edit with care diff --git a/lgsm/config-default/config-lgsm/codwawserver/_default.cfg b/lgsm/config-default/config-lgsm/codwawserver/_default.cfg index 87ddb9468..86f667ffd 100644 --- a/lgsm/config-default/config-lgsm/codwawserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/codwawserver/_default.cfg @@ -82,13 +82,14 @@ logdays="7" # ANSI Colors ansi="on" -# Message Display Time +# Message Display Time sleeptime="0.5" ## LinuxGSM Server Details # Do not edit gamename="Call of Duty: World at War" engine="iw3.0" +glibc="2.3.2" #### Directories #### # Edit with care diff --git a/lgsm/config-default/config-lgsm/csczserver/_default.cfg b/lgsm/config-default/config-lgsm/csczserver/_default.cfg index f8b17a3ac..da41f37c9 100644 --- a/lgsm/config-default/config-lgsm/csczserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/csczserver/_default.cfg @@ -86,7 +86,7 @@ logdays="7" # ANSI Colors ansi="on" -# Message Display Time +# Message Display Time sleeptime="0.5" ## SteamCMD Settings @@ -102,6 +102,7 @@ branch="" # Do not edit gamename="Counter-Strike: Condition Zero" engine="goldsource" +glibc="2.3.6" #### Directories #### # Edit with care diff --git a/lgsm/config-default/config-lgsm/csgoserver/_default.cfg b/lgsm/config-default/config-lgsm/csgoserver/_default.cfg index 3bd16b090..f81ca8e90 100644 --- a/lgsm/config-default/config-lgsm/csgoserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/csgoserver/_default.cfg @@ -17,7 +17,7 @@ # Custom 3 0 # Deathmatch 1 2 mg_deathmatch # Demolition 1 1 mg_demolition -# Wingman 0 2 +# Wingman 0 2 # Danger Zone 6 0 mg_dz_blacksite (map: dz_blacksite), mg_dz_sirocco (map: dz_sirocco) gametype="0" gamemode="0" @@ -112,7 +112,7 @@ logdays="7" # ANSI Colors ansi="on" -# Message Display Time +# Message Display Time sleeptime="0.5" ## SteamCMD Settings @@ -127,6 +127,7 @@ branch="" # Do not edit gamename="Counter-Strike: Global Offensive" engine="source" +glibc="2.15" #### Directories #### # Edit with care diff --git a/lgsm/config-default/config-lgsm/csserver/_default.cfg b/lgsm/config-default/config-lgsm/csserver/_default.cfg index c465ad5c0..bf044c8a6 100644 --- a/lgsm/config-default/config-lgsm/csserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/csserver/_default.cfg @@ -86,7 +86,7 @@ logdays="7" # ANSI Colors ansi="on" -# Message Display Time +# Message Display Time sleeptime="0.5" ## SteamCMD Settings @@ -102,6 +102,7 @@ branch="" # Do not edit gamename="Counter-Strike 1.6" engine="goldsource" +glibc="2.3.6" #### Directories #### # Edit with care diff --git a/lgsm/config-default/config-lgsm/cssserver/_default.cfg b/lgsm/config-default/config-lgsm/cssserver/_default.cfg index 945327cf8..beb83ee29 100644 --- a/lgsm/config-default/config-lgsm/cssserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/cssserver/_default.cfg @@ -92,7 +92,7 @@ logdays="7" # ANSI Colors ansi="on" -# Message Display Time +# Message Display Time sleeptime="0.5" ## SteamCMD Settings @@ -107,6 +107,7 @@ branch="" # Do not edit gamename="Counter-Strike: Source" engine="source" +glibc="2.3.6" #### Directories #### # Edit with care diff --git a/lgsm/config-default/config-lgsm/dabserver/_default.cfg b/lgsm/config-default/config-lgsm/dabserver/_default.cfg index b3c062c33..e29118a7a 100644 --- a/lgsm/config-default/config-lgsm/dabserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/dabserver/_default.cfg @@ -87,7 +87,7 @@ logdays="7" # ANSI Colors ansi="on" -# Message Display Time +# Message Display Time sleeptime="0.5" ## SteamCMD Settings @@ -102,6 +102,7 @@ branch="" # Do not edit gamename="Double Action: Boogaloo" engine="source" +glibc="2.15" #### Directories #### # Edit with care diff --git a/lgsm/config-default/config-lgsm/dmcserver/_default.cfg b/lgsm/config-default/config-lgsm/dmcserver/_default.cfg index be42fe649..412e5ab73 100644 --- a/lgsm/config-default/config-lgsm/dmcserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/dmcserver/_default.cfg @@ -86,7 +86,7 @@ logdays="7" # ANSI Colors ansi="on" -# Message Display Time +# Message Display Time sleeptime="0.5" ## SteamCMD Settings @@ -102,6 +102,7 @@ branch="" # Do not edit gamename="Deathmatch Classic" engine="goldsource" +glibc="2.3.4" #### Directories #### # Edit with care diff --git a/lgsm/config-default/config-lgsm/dodserver/_default.cfg b/lgsm/config-default/config-lgsm/dodserver/_default.cfg index 586d825bd..518e821c3 100644 --- a/lgsm/config-default/config-lgsm/dodserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/dodserver/_default.cfg @@ -86,7 +86,7 @@ logdays="7" # ANSI Colors ansi="on" -# Message Display Time +# Message Display Time sleeptime="0.5" ## SteamCMD Settings @@ -102,6 +102,7 @@ branch="" # Do not edit gamename="Day of Defeat" engine="goldsource" +glibc="2.3.4" #### Directories #### # Edit with care diff --git a/lgsm/config-default/config-lgsm/dodsserver/_default.cfg b/lgsm/config-default/config-lgsm/dodsserver/_default.cfg index 6c747e26a..67c4dd837 100644 --- a/lgsm/config-default/config-lgsm/dodsserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/dodsserver/_default.cfg @@ -87,7 +87,7 @@ logdays="7" # ANSI Colors ansi="on" -# Message Display Time +# Message Display Time sleeptime="0.5" ## SteamCMD Settings @@ -102,6 +102,7 @@ branch="" # Do not edit gamename="Day of Defeat: Source" engine="source" +glibc="2.3.6" #### Directories #### # Edit with care diff --git a/lgsm/config-default/config-lgsm/doiserver/_default.cfg b/lgsm/config-default/config-lgsm/doiserver/_default.cfg index 8f8ffad37..464020800 100644 --- a/lgsm/config-default/config-lgsm/doiserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/doiserver/_default.cfg @@ -89,7 +89,7 @@ logdays="7" # ANSI Colors ansi="on" -# Message Display Time +# Message Display Time sleeptime="0.5" ## SteamCMD Settings @@ -104,6 +104,7 @@ branch="" # Do not edit gamename="Day of Infamy" engine="source" +glibc="2.15" #### Directories #### # Edit with care diff --git a/lgsm/config-default/config-lgsm/dstserver/_default.cfg b/lgsm/config-default/config-lgsm/dstserver/_default.cfg index 2674c33f4..ca0eb82f3 100644 --- a/lgsm/config-default/config-lgsm/dstserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/dstserver/_default.cfg @@ -90,7 +90,7 @@ logdays="7" # ANSI Colors ansi="on" -# Message Display Time +# Message Display Time sleeptime="0.5" ## SteamCMD Settings @@ -105,6 +105,7 @@ branch="" # Do not edit gamename="Don't Starve Together" engine="dontstarve" +glibc="2.15" ## Service Name | https://docs.linuxgsm.com/features/multiple-game-servers servicename="dst-server-${shard}" diff --git a/lgsm/config-default/config-lgsm/dysserver/_default.cfg b/lgsm/config-default/config-lgsm/dysserver/_default.cfg index 822389fd3..283902256 100644 --- a/lgsm/config-default/config-lgsm/dysserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/dysserver/_default.cfg @@ -92,7 +92,7 @@ logdays="7" # ANSI Colors ansi="on" -# Message Display Time +# Message Display Time sleeptime="0.5" ## SteamCMD Settings @@ -107,6 +107,7 @@ branch="" # Do not edit gamename="Dystopia" engine="source" +glibc="2.15" #### Directories #### # Edit with care diff --git a/lgsm/config-default/config-lgsm/ecoserver/_default.cfg b/lgsm/config-default/config-lgsm/ecoserver/_default.cfg index c1936a028..17149df44 100644 --- a/lgsm/config-default/config-lgsm/ecoserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/ecoserver/_default.cfg @@ -75,7 +75,7 @@ logdays="7" # ANSI Colors ansi="on" -# Message Display Time +# Message Display Time sleeptime="0.5" ## SteamCMD Settings @@ -90,6 +90,7 @@ branch="" # Do not edit gamename="Eco" engine="unity3d" +glibc="null" #### Directories #### # Edit with care diff --git a/lgsm/config-default/config-lgsm/emserver/_default.cfg b/lgsm/config-default/config-lgsm/emserver/_default.cfg index b2cd2b08a..d7cad367d 100644 --- a/lgsm/config-default/config-lgsm/emserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/emserver/_default.cfg @@ -92,7 +92,7 @@ logdays="7" # ANSI Colors ansi="on" -# Message Display Time +# Message Display Time sleeptime="0.5" ## SteamCMD Settings @@ -107,6 +107,7 @@ branch="" # Do not edit gamename="Empires Mod" engine="source" +glibc="2.15" #### Directories #### # Edit with care diff --git a/lgsm/config-default/config-lgsm/etlserver/_default.cfg b/lgsm/config-default/config-lgsm/etlserver/_default.cfg index b2762dc16..b380c8da2 100644 --- a/lgsm/config-default/config-lgsm/etlserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/etlserver/_default.cfg @@ -76,13 +76,14 @@ logdays="7" # ANSI Colors ansi="on" -# Message Display Time +# Message Display Time sleeptime="0.5" ## LinuxGSM Server Details # Do not edit gamename="ET: Legacy" engine="idtech3" +glibc="2.7" #### Directories #### # Edit with care diff --git a/lgsm/config-default/config-lgsm/fctrserver/_default.cfg b/lgsm/config-default/config-lgsm/fctrserver/_default.cfg index bb6036d91..699a202fd 100644 --- a/lgsm/config-default/config-lgsm/fctrserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/fctrserver/_default.cfg @@ -87,13 +87,14 @@ logdays="7" # ANSI Colors ansi="on" -# Message Display Time +# Message Display Time sleeptime="0.5" ## LinuxGSM Server Details # Do not edit gamename="Factorio" engine="factorio" +glibc="2.18" #### Directories #### # Edit with care diff --git a/lgsm/config-default/config-lgsm/fofserver/_default.cfg b/lgsm/config-default/config-lgsm/fofserver/_default.cfg index 45c9526ce..c2dff17ca 100644 --- a/lgsm/config-default/config-lgsm/fofserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/fofserver/_default.cfg @@ -87,7 +87,7 @@ logdays="7" # ANSI Colors ansi="on" -# Message Display Time +# Message Display Time sleeptime="0.5" ## SteamCMD Settings @@ -102,6 +102,7 @@ branch="" # Do not edit gamename="Fistful of Frags" engine="source" +glibc="2.15" #### Directories #### # Edit with care diff --git a/lgsm/config-default/config-lgsm/gesserver/_default.cfg b/lgsm/config-default/config-lgsm/gesserver/_default.cfg index 7f1fc8fcb..e4912eaa6 100644 --- a/lgsm/config-default/config-lgsm/gesserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/gesserver/_default.cfg @@ -87,7 +87,7 @@ logdays="7" # ANSI Colors ansi="on" -# Message Display Time +# Message Display Time sleeptime="0.5" ## SteamCMD Settings @@ -102,6 +102,8 @@ branch="" # Do not edit gamename="GoldenEye: Source" engine="source" +glibc="2.15" + #### Directories #### # Edit with care diff --git a/lgsm/config-default/config-lgsm/gmodserver/_default.cfg b/lgsm/config-default/config-lgsm/gmodserver/_default.cfg index 03990a8a2..33cf589ad 100644 --- a/lgsm/config-default/config-lgsm/gmodserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/gmodserver/_default.cfg @@ -103,7 +103,7 @@ logdays="7" # ANSI Colors ansi="on" -# Message Display Time +# Message Display Time sleeptime="0.5" ## SteamCMD Settings @@ -118,6 +118,7 @@ branch="" # Do not edit gamename="Garry's Mod" engine="source" +glibc="2.15" #### Directories #### # Edit with care diff --git a/lgsm/config-default/config-lgsm/hl2dmserver/_default.cfg b/lgsm/config-default/config-lgsm/hl2dmserver/_default.cfg index 974fb0478..15a6e44b1 100644 --- a/lgsm/config-default/config-lgsm/hl2dmserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/hl2dmserver/_default.cfg @@ -87,7 +87,7 @@ logdays="7" # ANSI Colors ansi="on" -# Message Display Time +# Message Display Time sleeptime="0.5" ## SteamCMD Settings @@ -102,6 +102,7 @@ branch="" # Do not edit gamename="Half Life 2: Deathmatch" engine="source" +glibc="2.3.6" #### Directories #### # Edit with care diff --git a/lgsm/config-default/config-lgsm/hldmserver/_default.cfg b/lgsm/config-default/config-lgsm/hldmserver/_default.cfg index 6a8dcc880..8705915cd 100644 --- a/lgsm/config-default/config-lgsm/hldmserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/hldmserver/_default.cfg @@ -86,7 +86,7 @@ logdays="7" # ANSI Colors ansi="on" -# Message Display Time +# Message Display Time sleeptime="0.5" ## SteamCMD Settings @@ -101,6 +101,7 @@ branch="" # Do not edit gamename="Half Life: Deathmatch" engine="goldsource" +glibc="2.3.4" #### Directories #### # Edit with care diff --git a/lgsm/config-default/config-lgsm/hldmsserver/_default.cfg b/lgsm/config-default/config-lgsm/hldmsserver/_default.cfg index e31fee26d..621bcfff2 100644 --- a/lgsm/config-default/config-lgsm/hldmsserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/hldmsserver/_default.cfg @@ -87,7 +87,7 @@ logdays="7" # ANSI Colors ansi="on" -# Message Display Time +# Message Display Time sleeptime="0.5" ## SteamCMD Settings @@ -102,6 +102,7 @@ branch="" # Do not edit gamename="Half-Life Deathmatch: Source" engine="source" +glibc="2.3.6" #### Directories #### # Edit with care diff --git a/lgsm/config-default/config-lgsm/hwserver/_default.cfg b/lgsm/config-default/config-lgsm/hwserver/_default.cfg index 8272cca0b..5014c1608 100644 --- a/lgsm/config-default/config-lgsm/hwserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/hwserver/_default.cfg @@ -98,7 +98,7 @@ logdays="7" # ANSI Colors ansi="on" -# Message Display Time +# Message Display Time sleeptime="0.5" ## SteamCMD Settings @@ -113,6 +113,7 @@ branch="" # Do not edit gamename="Hurtworld" engine="unity3d" +glibc="2.15" #### Directories #### # Edit with care diff --git a/lgsm/config-default/config-lgsm/insserver/_default.cfg b/lgsm/config-default/config-lgsm/insserver/_default.cfg index f7f047a10..78fcc3142 100644 --- a/lgsm/config-default/config-lgsm/insserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/insserver/_default.cfg @@ -94,7 +94,7 @@ logdays="7" # ANSI Colors ansi="on" -# Message Display Time +# Message Display Time sleeptime="0.5" ## SteamCMD Settings @@ -109,6 +109,7 @@ branch="" # Do not edit gamename="Insurgency" engine="source" +glibc="2.15" #### Directories #### # Edit with care diff --git a/lgsm/config-default/config-lgsm/inssserver/_default.cfg b/lgsm/config-default/config-lgsm/inssserver/_default.cfg index 1714219ec..debd0a48b 100644 --- a/lgsm/config-default/config-lgsm/inssserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/inssserver/_default.cfg @@ -95,7 +95,7 @@ logdays="7" # ANSI Colors ansi="on" -# Message Display Time +# Message Display Time sleeptime="0.5" ## SteamCMD Settings @@ -110,6 +110,7 @@ branch="" # Do not edit gamename="Insurgency: Sandstorm" engine="unreal4" +glibc="2.17" #### Directories #### # Edit with care diff --git a/lgsm/config-default/config-lgsm/iosserver/_default.cfg b/lgsm/config-default/config-lgsm/iosserver/_default.cfg index 9d9d61c99..4ba8da210 100644 --- a/lgsm/config-default/config-lgsm/iosserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/iosserver/_default.cfg @@ -87,7 +87,7 @@ logdays="7" # ANSI Colors ansi="on" -# Message Display Time +# Message Display Time sleeptime="0.5" ## SteamCMD Settings @@ -102,6 +102,7 @@ branch="" # Do not edit gamename="IOSoccer" engine="source" +glibc="2.3.6" #### Directories #### # Edit with care diff --git a/lgsm/config-default/config-lgsm/jc2server/_default.cfg b/lgsm/config-default/config-lgsm/jc2server/_default.cfg index d539ee38c..514430d91 100644 --- a/lgsm/config-default/config-lgsm/jc2server/_default.cfg +++ b/lgsm/config-default/config-lgsm/jc2server/_default.cfg @@ -79,7 +79,7 @@ logdays="7" # ANSI Colors ansi="on" -# Message Display Time +# Message Display Time sleeptime="0.5" ## SteamCMD Settings @@ -94,6 +94,7 @@ branch="" # Do not edit gamename="Just Cause 2" engine="avalanche2.0" +glibc="2.13" #### Directories #### # Edit with care diff --git a/lgsm/config-default/config-lgsm/jc3server/_default.cfg b/lgsm/config-default/config-lgsm/jc3server/_default.cfg index 995fd4714..5f82ae5b5 100644 --- a/lgsm/config-default/config-lgsm/jc3server/_default.cfg +++ b/lgsm/config-default/config-lgsm/jc3server/_default.cfg @@ -79,7 +79,7 @@ logdays="7" # ANSI Colors ansi="on" -# Message Display Time +# Message Display Time sleeptime="0.5" ## SteamCMD Settings @@ -94,6 +94,7 @@ branch="" # Do not edit gamename="Just Cause 3" engine="avalanche3.0" +glibc="2.17" #### Directories #### # Edit with care diff --git a/lgsm/config-default/config-lgsm/kf2server/_default.cfg b/lgsm/config-default/config-lgsm/kf2server/_default.cfg index 72c06d1b0..bef2d527f 100644 --- a/lgsm/config-default/config-lgsm/kf2server/_default.cfg +++ b/lgsm/config-default/config-lgsm/kf2server/_default.cfg @@ -85,7 +85,7 @@ logdays="7" # ANSI Colors ansi="on" -# Message Display Time +# Message Display Time sleeptime="0.5" ## SteamCMD Settings @@ -100,6 +100,7 @@ branch="" # Do not edit gamename="Killing Floor 2" engine="unreal3" +glibc="2.3.2" #### Directories #### # Edit with care @@ -128,4 +129,3 @@ postdetailslog="${lgsmlogdir}/${servicename}-postdetails.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/kfserver/_default.cfg b/lgsm/config-default/config-lgsm/kfserver/_default.cfg index 1644f73cc..9ba4af439 100644 --- a/lgsm/config-default/config-lgsm/kfserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/kfserver/_default.cfg @@ -91,7 +91,7 @@ logdays="7" # ANSI Colors ansi="on" -# Message Display Time +# Message Display Time sleeptime="0.5" ## SteamCMD Settings @@ -106,6 +106,7 @@ branch="" # Do not edit gamename="Killing Floor" engine="unreal2" +glibc="2.4" #### Directories #### # Edit with care diff --git a/lgsm/config-default/config-lgsm/l4d2server/_default.cfg b/lgsm/config-default/config-lgsm/l4d2server/_default.cfg index c7205100c..26f0211fb 100644 --- a/lgsm/config-default/config-lgsm/l4d2server/_default.cfg +++ b/lgsm/config-default/config-lgsm/l4d2server/_default.cfg @@ -86,7 +86,7 @@ logdays="7" # ANSI Colors ansi="on" -# Message Display Time +# Message Display Time sleeptime="0.5" ## SteamCMD Settings @@ -101,6 +101,7 @@ branch="" # Do not edit gamename="Left 4 Dead 2" engine="source" +glibc="2.3.6" #### Directories #### # Edit with care diff --git a/lgsm/config-default/config-lgsm/l4dserver/_default.cfg b/lgsm/config-default/config-lgsm/l4dserver/_default.cfg index 33e562310..8fc41d29b 100644 --- a/lgsm/config-default/config-lgsm/l4dserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/l4dserver/_default.cfg @@ -86,7 +86,7 @@ logdays="7" # ANSI Colors ansi="on" -# Message Display Time +# Message Display Time sleeptime="0.5" ## SteamCMD Settings @@ -101,6 +101,7 @@ branch="" # Do not edit gamename="Left 4 Dead" engine="source" +glibc="2.3.6" #### Directories #### # Edit with care diff --git a/lgsm/config-default/config-lgsm/mcserver/_default.cfg b/lgsm/config-default/config-lgsm/mcserver/_default.cfg index 4bfa870df..103de1620 100644 --- a/lgsm/config-default/config-lgsm/mcserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/mcserver/_default.cfg @@ -81,13 +81,14 @@ logdays="7" # ANSI Colors ansi="on" -# Message Display Time +# Message Display Time sleeptime="0.5" ## LinuxGSM Server Details # Do not edit gamename="Minecraft" engine="lwjgl2" +glibc="null" #### Directories #### # Edit with care diff --git a/lgsm/config-default/config-lgsm/mhserver/_default.cfg b/lgsm/config-default/config-lgsm/mhserver/_default.cfg index 2ad316151..f3b0c6b61 100644 --- a/lgsm/config-default/config-lgsm/mhserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/mhserver/_default.cfg @@ -87,7 +87,7 @@ logdays="7" # ANSI Colors ansi="on" -# Message Display Time +# Message Display Time sleeptime="0.5" ## SteamCMD Settings @@ -102,6 +102,7 @@ branch="" # Do not edit gamename="MORDHAU" engine="unreal4" +glibc="2.17" #### Directories #### # Edit with care diff --git a/lgsm/config-default/config-lgsm/mtaserver/_default.cfg b/lgsm/config-default/config-lgsm/mtaserver/_default.cfg index bc03ccf15..6af6c2d53 100644 --- a/lgsm/config-default/config-lgsm/mtaserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/mtaserver/_default.cfg @@ -77,13 +77,14 @@ logdays="7" # ANSI Colors ansi="on" -# Message Display Time +# Message Display Time sleeptime="0.5" ## LinuxGSM Server Details # Do not edit gamename="Multi Theft Auto" engine="renderware" +glibc="2.7" #### Directories #### # Edit with care diff --git a/lgsm/config-default/config-lgsm/mumbleserver/_default.cfg b/lgsm/config-default/config-lgsm/mumbleserver/_default.cfg index d848af88f..0dcca762f 100644 --- a/lgsm/config-default/config-lgsm/mumbleserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/mumbleserver/_default.cfg @@ -80,12 +80,14 @@ logdays="7" # ANSI Colors ansi="on" -# Message Display Time +# Message Display Time sleeptime="0.5" ## LinuxGSM Server Details # Do not edit gamename="Mumble" +engine="null" +glibc="null" #### Directories #### # Edit with care diff --git a/lgsm/config-default/config-lgsm/ndserver/_default.cfg b/lgsm/config-default/config-lgsm/ndserver/_default.cfg index cf7712e3e..9bbab8d20 100644 --- a/lgsm/config-default/config-lgsm/ndserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/ndserver/_default.cfg @@ -87,7 +87,7 @@ logdays="7" # ANSI Colors ansi="on" -# Message Display Time +# Message Display Time sleeptime="0.5" ## SteamCMD Settings @@ -102,6 +102,7 @@ branch="" # Do not edit gamename="Nuclear Dawn" engine="source" +glibc="2.3.6" #### Directories #### # Edit with care diff --git a/lgsm/config-default/config-lgsm/nmrihserver/_default.cfg b/lgsm/config-default/config-lgsm/nmrihserver/_default.cfg index 10d7696a6..fe6005c22 100644 --- a/lgsm/config-default/config-lgsm/nmrihserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/nmrihserver/_default.cfg @@ -92,7 +92,7 @@ logdays="7" # ANSI Colors ansi="on" -# Message Display Time +# Message Display Time sleeptime="0.5" ## SteamCMD Settings @@ -107,6 +107,7 @@ branch="" # Do not edit gamename="No More Room in Hell" engine="source" +glibc="2.15" #### Directories #### # Edit with care diff --git a/lgsm/config-default/config-lgsm/ns2cserver/_default.cfg b/lgsm/config-default/config-lgsm/ns2cserver/_default.cfg index f8de5a44c..f9dfaf640 100644 --- a/lgsm/config-default/config-lgsm/ns2cserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/ns2cserver/_default.cfg @@ -94,7 +94,7 @@ logdays="7" # ANSI Colors ansi="on" -# Message Display Time +# Message Display Time sleeptime="0.5" ## SteamCMD Settings @@ -109,6 +109,7 @@ branch="" # Do not edit gamename="NS2: Combat" engine="spark" +glibc="2.15" #### Directories #### # Edit with care diff --git a/lgsm/config-default/config-lgsm/ns2server/_default.cfg b/lgsm/config-default/config-lgsm/ns2server/_default.cfg index 2f7e602ca..9916e4fc6 100644 --- a/lgsm/config-default/config-lgsm/ns2server/_default.cfg +++ b/lgsm/config-default/config-lgsm/ns2server/_default.cfg @@ -98,7 +98,7 @@ logdays="7" # ANSI Colors ansi="on" -# Message Display Time +# Message Display Time sleeptime="0.5" ## SteamCMD Settings @@ -113,6 +113,7 @@ branch="" # Do not edit gamename="Natural Selection 2" engine="spark" +glibc="2.17" #### Directories #### # Edit with care diff --git a/lgsm/config-default/config-lgsm/nsserver/_default.cfg b/lgsm/config-default/config-lgsm/nsserver/_default.cfg index 1a5f8db9c..753bd99d3 100644 --- a/lgsm/config-default/config-lgsm/nsserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/nsserver/_default.cfg @@ -86,7 +86,7 @@ logdays="7" # ANSI Colors ansi="on" -# Message Display Time +# Message Display Time sleeptime="0.5" ## SteamCMD Settings @@ -102,6 +102,7 @@ branch="" # Do not edit gamename="Natural Selection" engine="goldsource" +glibc="2.3.4" #### Directories #### # Edit with care diff --git a/lgsm/config-default/config-lgsm/opforserver/_default.cfg b/lgsm/config-default/config-lgsm/opforserver/_default.cfg index 3618a40c1..e2e17db19 100644 --- a/lgsm/config-default/config-lgsm/opforserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/opforserver/_default.cfg @@ -86,7 +86,7 @@ logdays="7" # ANSI Colors ansi="on" -# Message Display Time +# Message Display Time sleeptime="0.5" ## SteamCMD Settings @@ -102,6 +102,7 @@ branch="" # Do not edit gamename="Half-Life: Opposing Force" engine="goldsource" +glibc="2.3.4" #### Directories #### # Edit with care diff --git a/lgsm/config-default/config-lgsm/pcserver/_default.cfg b/lgsm/config-default/config-lgsm/pcserver/_default.cfg index 8b0f7ce78..03eea31ce 100644 --- a/lgsm/config-default/config-lgsm/pcserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/pcserver/_default.cfg @@ -79,7 +79,7 @@ logdays="7" # ANSI Colors ansi="on" -# Message Display Time +# Message Display Time sleeptime="0.5" ## SteamCMD Settings @@ -94,6 +94,7 @@ branch="" # Do not edit gamename="Project Cars" engine="madness" +glibc="2.4" #### Directories #### # Edit with care diff --git a/lgsm/config-default/config-lgsm/pstbsserver/_default.cfg b/lgsm/config-default/config-lgsm/pstbsserver/_default.cfg index 3bb8dd0e4..3a0914658 100644 --- a/lgsm/config-default/config-lgsm/pstbsserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/pstbsserver/_default.cfg @@ -90,7 +90,7 @@ logdays="7" # ANSI Colors ansi="on" -# Message Display Time +# Message Display Time sleeptime="0.5" ## SteamCMD Settings @@ -105,6 +105,7 @@ branch="" # Do not edit gamename="pstbsserver" engine="unreal4" +glibc="2.17" #### Directories #### # Edit with care diff --git a/lgsm/config-default/config-lgsm/pvkiiserver/_default.cfg b/lgsm/config-default/config-lgsm/pvkiiserver/_default.cfg index 1a197d8f1..0acf99a18 100644 --- a/lgsm/config-default/config-lgsm/pvkiiserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/pvkiiserver/_default.cfg @@ -87,7 +87,7 @@ logdays="7" # ANSI Colors ansi="on" -# Message Display Time +# Message Display Time sleeptime="0.5" ## SteamCMD Settings @@ -102,6 +102,7 @@ branch="" # Do not edit gamename="Pirates, Vikings, and Knights II" engine="source" +glibc="2.15" #### Directories #### # Edit with care diff --git a/lgsm/config-default/config-lgsm/pzserver/_default.cfg b/lgsm/config-default/config-lgsm/pzserver/_default.cfg index 5aadad897..ffcce5488 100644 --- a/lgsm/config-default/config-lgsm/pzserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/pzserver/_default.cfg @@ -82,7 +82,7 @@ logdays="7" # ANSI Colors ansi="on" -# Message Display Time +# Message Display Time sleeptime="0.5" ## SteamCMD Settings @@ -97,6 +97,7 @@ branch="" # Do not edit gamename="Project Zomboid" engine="projectzomboid" +glibc="2.15" #### Directories #### # Edit with care diff --git a/lgsm/config-default/config-lgsm/q2server/_default.cfg b/lgsm/config-default/config-lgsm/q2server/_default.cfg index c109e7bcf..ea597b8ef 100644 --- a/lgsm/config-default/config-lgsm/q2server/_default.cfg +++ b/lgsm/config-default/config-lgsm/q2server/_default.cfg @@ -81,13 +81,14 @@ logdays="7" # ANSI Colors ansi="on" -# Message Display Time +# Message Display Time sleeptime="0.5" ## LinuxGSM Server Details # Do not edit gamename="Quake 2" engine="idtech2" +glibc="null" #### Directories #### # Edit with care diff --git a/lgsm/config-default/config-lgsm/q3server/_default.cfg b/lgsm/config-default/config-lgsm/q3server/_default.cfg index 89491a537..51c6aeed7 100644 --- a/lgsm/config-default/config-lgsm/q3server/_default.cfg +++ b/lgsm/config-default/config-lgsm/q3server/_default.cfg @@ -81,13 +81,14 @@ logdays="7" # ANSI Colors ansi="on" -# Message Display Time +# Message Display Time sleeptime="0.5" ## LinuxGSM Server Details # Do not edit gamename="Quake 3: Arena" engine="idtech3" +glibc="2.1" #### Directories #### # Edit with care diff --git a/lgsm/config-default/config-lgsm/qlserver/_default.cfg b/lgsm/config-default/config-lgsm/qlserver/_default.cfg index b4ac70336..31ea6ead8 100644 --- a/lgsm/config-default/config-lgsm/qlserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/qlserver/_default.cfg @@ -81,7 +81,7 @@ logdays="7" # ANSI Colors ansi="on" -# Message Display Time +# Message Display Time sleeptime="0.5" ## SteamCMD Settings @@ -96,6 +96,7 @@ branch="" # Do not edit gamename="Quake Live" engine="idtech3_ql" +glibc="2.15" #### Directories #### # Edit with care diff --git a/lgsm/config-default/config-lgsm/qwserver/_default.cfg b/lgsm/config-default/config-lgsm/qwserver/_default.cfg index dad680aa8..9a1abc2bd 100644 --- a/lgsm/config-default/config-lgsm/qwserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/qwserver/_default.cfg @@ -80,13 +80,14 @@ logdays="7" # ANSI Colors ansi="on" -# Message Display Time +# Message Display Time sleeptime="0.5" ## LinuxGSM Server Details # Do not edit gamename="QuakeWorld" engine="quake" +glibc="2.17" #### Directories #### # Edit with care diff --git a/lgsm/config-default/config-lgsm/ricochetserver/_default.cfg b/lgsm/config-default/config-lgsm/ricochetserver/_default.cfg index 1e4848403..477423b81 100644 --- a/lgsm/config-default/config-lgsm/ricochetserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/ricochetserver/_default.cfg @@ -86,7 +86,7 @@ logdays="7" # ANSI Colors ansi="on" -# Message Display Time +# Message Display Time sleeptime="0.5" ## SteamCMD Settings @@ -102,6 +102,7 @@ branch="" # Do not edit gamename="Ricochet" engine="goldsource" +glibcr="2.3.4" #### Directories #### # Edit with care diff --git a/lgsm/config-default/config-lgsm/roserver/_default.cfg b/lgsm/config-default/config-lgsm/roserver/_default.cfg index 6402a7c51..89865f281 100644 --- a/lgsm/config-default/config-lgsm/roserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/roserver/_default.cfg @@ -87,7 +87,7 @@ logdays="7" # ANSI Colors ansi="on" -# Message Display Time +# Message Display Time sleeptime="0.5" ## SteamCMD Settings @@ -102,6 +102,7 @@ branch="" # Do not edit gamename="Red Orchestra: Ostfront 41-45" engine="unreal2" +glibc="2.4" #### Directories #### # Edit with care diff --git a/lgsm/config-default/config-lgsm/rtcwserver/_default.cfg b/lgsm/config-default/config-lgsm/rtcwserver/_default.cfg index 2c753f26d..d875df5ca 100644 --- a/lgsm/config-default/config-lgsm/rtcwserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/rtcwserver/_default.cfg @@ -81,13 +81,14 @@ logdays="7" # ANSI Colors ansi="on" -# Message Display Time +# Message Display Time sleeptime="0.5" ## LinuxGSM Server Details # Do not edit gamename="Return to Castle Wolfenstein" engine="ioquake3" +glibc="2.1" #### Directories #### # Edit with care diff --git a/lgsm/config-default/config-lgsm/rustserver/_default.cfg b/lgsm/config-default/config-lgsm/rustserver/_default.cfg index b5e56db5b..1759a1c90 100644 --- a/lgsm/config-default/config-lgsm/rustserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/rustserver/_default.cfg @@ -111,7 +111,7 @@ logdays="7" # ANSI Colors ansi="on" -# Message Display Time +# Message Display Time sleeptime="0.5" ## SteamCMD Settings @@ -126,6 +126,7 @@ branch="" # Do not edit gamename="Rust" engine="unity3d" +glibc="2.15" #### Directories #### # Edit with care diff --git a/lgsm/config-default/config-lgsm/rwserver/_default.cfg b/lgsm/config-default/config-lgsm/rwserver/_default.cfg index 56d6d4526..eea0b712c 100644 --- a/lgsm/config-default/config-lgsm/rwserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/rwserver/_default.cfg @@ -82,7 +82,7 @@ logdays="7" # ANSI Colors ansi="on" -# Message Display Time +# Message Display Time sleeptime="0.5" ## SteamCMD Settings @@ -97,6 +97,7 @@ branch="" # Do not edit gamename="Rising World" engine="risingworld" +glibc="null" #### Directories #### # Edit with care diff --git a/lgsm/config-default/config-lgsm/sampserver/_default.cfg b/lgsm/config-default/config-lgsm/sampserver/_default.cfg index 40a49ae93..1f878023b 100644 --- a/lgsm/config-default/config-lgsm/sampserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/sampserver/_default.cfg @@ -80,13 +80,14 @@ logdays="7" # ANSI Colors ansi="on" -# Message Display Time +# Message Display Time sleeptime="0.5" ## LinuxGSM Server Details # Do not edit gamename="San Andreas Multiplayer" engine="renderware" +glibc="2.3" #### Directories #### # Edit with care diff --git a/lgsm/config-default/config-lgsm/sbotsserver/_default.cfg b/lgsm/config-default/config-lgsm/sbotsserver/_default.cfg index 61ad1d74b..38a04f459 100644 --- a/lgsm/config-default/config-lgsm/sbotsserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/sbotsserver/_default.cfg @@ -84,7 +84,7 @@ logdays="7" # ANSI Colors ansi="on" -# Message Display Time +# Message Display Time sleeptime="0.5" ## SteamCMD Settings @@ -99,6 +99,7 @@ branch="" # Do not edit gamename="StickyBots" engine="unreal4" +glibc="2.17" #### Directories #### # Edit with care @@ -127,4 +128,4 @@ postdetailslog="${lgsmlogdir}/${servicename}-postdetails.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 +consolelogdate="${consolelogdir}/${servicename}-console-$(date '+%Y-%m-%d-%H:%M:%S').log" diff --git a/lgsm/config-default/config-lgsm/sbserver/_default.cfg b/lgsm/config-default/config-lgsm/sbserver/_default.cfg index 8026983fe..8b0df872a 100644 --- a/lgsm/config-default/config-lgsm/sbserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/sbserver/_default.cfg @@ -86,7 +86,7 @@ logdays="7" # ANSI Colors ansi="on" -# Message Display Time +# Message Display Time sleeptime="0.5" ## SteamCMD Settings @@ -101,6 +101,7 @@ branch="" # Do not edit gamename="Starbound" engine="starbound" +glibc="2.17" #### Directories #### # Edit with care diff --git a/lgsm/config-default/config-lgsm/sdtdserver/_default.cfg b/lgsm/config-default/config-lgsm/sdtdserver/_default.cfg index b1d94ee0f..d56f05a5a 100644 --- a/lgsm/config-default/config-lgsm/sdtdserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/sdtdserver/_default.cfg @@ -82,7 +82,7 @@ logdays="7" # ANSI Colors ansi="on" -# Message Display Time +# Message Display Time sleeptime="0.5" ## SteamCMD Settings @@ -97,6 +97,7 @@ branch="" # Do not edit gamename="7 Days To Die" engine="unity3d" +glibc="2.15" #### Directories #### # Edit with care diff --git a/lgsm/config-default/config-lgsm/sof2server/_default.cfg b/lgsm/config-default/config-lgsm/sof2server/_default.cfg index cb35b339c..d0e5dc776 100644 --- a/lgsm/config-default/config-lgsm/sof2server/_default.cfg +++ b/lgsm/config-default/config-lgsm/sof2server/_default.cfg @@ -88,6 +88,7 @@ sleeptime="0.5" # Do not edit gamename="Soldier Of Fortune 2: Gold Edition" engine="idtech3" +glibc="2.1" #### Directories #### # Edit with care diff --git a/lgsm/config-default/config-lgsm/squadserver/_default.cfg b/lgsm/config-default/config-lgsm/squadserver/_default.cfg index 1d82936e5..075f3d940 100644 --- a/lgsm/config-default/config-lgsm/squadserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/squadserver/_default.cfg @@ -84,7 +84,7 @@ logdays="7" # ANSI Colors ansi="on" -# Message Display Time +# Message Display Time sleeptime="0.5" ## SteamCMD Settings @@ -99,6 +99,7 @@ branch="" # Do not edit gamename="Squad" engine="unreal4" +glibc="2.17" #### Directories #### # Edit with care diff --git a/lgsm/config-default/config-lgsm/ss3server/_default.cfg b/lgsm/config-default/config-lgsm/ss3server/_default.cfg index 8a79c7954..54f2dc817 100644 --- a/lgsm/config-default/config-lgsm/ss3server/_default.cfg +++ b/lgsm/config-default/config-lgsm/ss3server/_default.cfg @@ -83,7 +83,7 @@ logdays="7" # ANSI Colors ansi="on" -# Message Display Time +# Message Display Time sleeptime="0.5" ## SteamCMD Settings @@ -98,6 +98,7 @@ branch="" # Do not edit gamename="Serious Sam 3: BFE" engine="seriousengine35" +glibc="2.13" #### Directories #### # Edit with care diff --git a/lgsm/config-default/config-lgsm/stserver/_default.cfg b/lgsm/config-default/config-lgsm/stserver/_default.cfg index 9492cb311..856a2b639 100644 --- a/lgsm/config-default/config-lgsm/stserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/stserver/_default.cfg @@ -89,7 +89,7 @@ logdays="7" # ANSI Colors ansi="on" -# Message Display Time +# Message Display Time sleeptime="0.5" ## SteamCMD Settings @@ -104,6 +104,7 @@ branch="" # Do not edit gamename="Stationeers" engine="unity3d" +glibc="2.15" #### Directories #### # Edit with care @@ -133,4 +134,3 @@ postdetailslog="${lgsmlogdir}/${servicename}-postdetails.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/svenserver/_default.cfg b/lgsm/config-default/config-lgsm/svenserver/_default.cfg index dd434be27..f938b7773 100644 --- a/lgsm/config-default/config-lgsm/svenserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/svenserver/_default.cfg @@ -86,7 +86,7 @@ logdays="7" # ANSI Colors ansi="on" -# Message Display Time +# Message Display Time sleeptime="0.5" ## SteamCMD Settings @@ -101,6 +101,7 @@ branch="" # Do not edit gamename="Sven Co-op" engine="goldsource" +glibc="2.24" #### Directories #### # Edit with care diff --git a/lgsm/config-default/config-lgsm/terrariaserver/_default.cfg b/lgsm/config-default/config-lgsm/terrariaserver/_default.cfg index a099b3fb2..3d260389f 100644 --- a/lgsm/config-default/config-lgsm/terrariaserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/terrariaserver/_default.cfg @@ -86,7 +86,7 @@ logdays="7" # ANSI Colors ansi="on" -# Message Display Time +# Message Display Time sleeptime="0.5" ## SteamCMD Settings @@ -101,6 +101,7 @@ branch="" # Do not edit gamename="Terraria" engine="terraria" +glibc="2.7" #### Directories #### # Edit with care diff --git a/lgsm/config-default/config-lgsm/tf2server/_default.cfg b/lgsm/config-default/config-lgsm/tf2server/_default.cfg index e0a429d99..d9ab34b4a 100644 --- a/lgsm/config-default/config-lgsm/tf2server/_default.cfg +++ b/lgsm/config-default/config-lgsm/tf2server/_default.cfg @@ -92,7 +92,7 @@ logdays="7" # ANSI Colors ansi="on" -# Message Display Time +# Message Display Time sleeptime="0.5" ## SteamCMD Settings @@ -107,6 +107,7 @@ branch="" # Do not edit gamename="Team Fortress 2" engine="source" +glibc="2.15" #### Directories #### # Edit with care diff --git a/lgsm/config-default/config-lgsm/tfcserver/_default.cfg b/lgsm/config-default/config-lgsm/tfcserver/_default.cfg index 5f2184566..297268e83 100644 --- a/lgsm/config-default/config-lgsm/tfcserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/tfcserver/_default.cfg @@ -86,7 +86,7 @@ logdays="7" # ANSI Colors ansi="on" -# Message Display Time +# Message Display Time sleeptime="0.5" ## SteamCMD Settings @@ -102,6 +102,7 @@ branch="" # Do not edit gamename="Team Fortress Classic" engine="goldsource" +glibc="2.3.4" #### Directories #### # Edit with care diff --git a/lgsm/config-default/config-lgsm/ts3server/_default.cfg b/lgsm/config-default/config-lgsm/ts3server/_default.cfg index 66787fc67..03a6f47e5 100644 --- a/lgsm/config-default/config-lgsm/ts3server/_default.cfg +++ b/lgsm/config-default/config-lgsm/ts3server/_default.cfg @@ -75,13 +75,15 @@ logdays="7" # ANSI Colors ansi="on" -# Message Display Time +# Message Display Time sleeptime="0.5" ## LinuxGSM Server Details # Do not edit gamename="TeamSpeak 3" servername="TeamSpeak 3 Server" +engine="null" +glibc="null" #### Directories #### # Edit with care diff --git a/lgsm/config-default/config-lgsm/tuserver/_default.cfg b/lgsm/config-default/config-lgsm/tuserver/_default.cfg index 6764131da..42019c23a 100644 --- a/lgsm/config-default/config-lgsm/tuserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/tuserver/_default.cfg @@ -89,7 +89,7 @@ logdays="7" # ANSI Colors ansi="on" -# Message Display Time +# Message Display Time sleeptime="0.5" ## SteamCMD Settings @@ -104,6 +104,7 @@ branch="" # Do not edit gamename="Tower Unite" engine="unreal4" +glibc="2.17" #### Directories #### # Edit with care diff --git a/lgsm/config-default/config-lgsm/twserver/_default.cfg b/lgsm/config-default/config-lgsm/twserver/_default.cfg index eee3683c5..f9c8ebdda 100644 --- a/lgsm/config-default/config-lgsm/twserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/twserver/_default.cfg @@ -86,7 +86,7 @@ logdays="7" # ANSI Colors ansi="on" -# Message Display Time +# Message Display Time sleeptime="0.5" ## SteamCMD Settings @@ -101,6 +101,7 @@ branch="" # Do not edit gamename="Teeworlds" engine="teeworlds" +glibc="2.14" #### Directories #### # Edit with care diff --git a/lgsm/config-default/config-lgsm/untserver/_default.cfg b/lgsm/config-default/config-lgsm/untserver/_default.cfg index b6cbf28a5..aba9cc558 100644 --- a/lgsm/config-default/config-lgsm/untserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/untserver/_default.cfg @@ -93,7 +93,7 @@ logdays="7" # ANSI Colors ansi="on" -# Message Display Time +# Message Display Time sleeptime="0.5" ## SteamCMD Settings @@ -108,6 +108,7 @@ branch="" # Do not edit gamename="Unturned" engine="unity3d" +glibc="2.15" #### Directories #### # Edit with care diff --git a/lgsm/config-default/config-lgsm/ut2k4server/_default.cfg b/lgsm/config-default/config-lgsm/ut2k4server/_default.cfg index 8f5475533..af9e9d630 100644 --- a/lgsm/config-default/config-lgsm/ut2k4server/_default.cfg +++ b/lgsm/config-default/config-lgsm/ut2k4server/_default.cfg @@ -80,13 +80,14 @@ logdays="7" # ANSI Colors ansi="on" -# Message Display Time +# Message Display Time sleeptime="0.5" ## LinuxGSM Server Details # Do not edit gamename="Unreal Tournament 2004" engine="unreal2" +glibc="2.4" #### Directories #### # Edit with care diff --git a/lgsm/config-default/config-lgsm/ut3server/_default.cfg b/lgsm/config-default/config-lgsm/ut3server/_default.cfg index 3c001c769..3606d79ec 100644 --- a/lgsm/config-default/config-lgsm/ut3server/_default.cfg +++ b/lgsm/config-default/config-lgsm/ut3server/_default.cfg @@ -91,13 +91,14 @@ logdays="7" # ANSI Colors ansi="on" -# Message Display Time +# Message Display Time sleeptime="0.5" ## LinuxGSM Server Details # Do not edit gamename="Unreal Tournament 3" engine="unreal3" +glibc="2.3.2" #### Directories #### # Edit with care diff --git a/lgsm/config-default/config-lgsm/ut99server/_default.cfg b/lgsm/config-default/config-lgsm/ut99server/_default.cfg index f69c5b7d3..627a4bdf4 100644 --- a/lgsm/config-default/config-lgsm/ut99server/_default.cfg +++ b/lgsm/config-default/config-lgsm/ut99server/_default.cfg @@ -80,13 +80,14 @@ logdays="7" # ANSI Colors ansi="on" -# Message Display Time +# Message Display Time sleeptime="0.5" ## LinuxGSM Server Details # Do not edit gamename="Unreal Tournament 99" engine="unreal" +glibc="2.1" #### Directories #### # Edit with care diff --git a/lgsm/config-default/config-lgsm/utserver/_default.cfg b/lgsm/config-default/config-lgsm/utserver/_default.cfg index 32ed512e4..6bda1840b 100644 --- a/lgsm/config-default/config-lgsm/utserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/utserver/_default.cfg @@ -84,13 +84,14 @@ logdays="7" # ANSI Colors ansi="on" -# Message Display Time +# Message Display Time sleeptime="0.5" ## LinuxGSM Server Details # Do not edit gamename="Unreal Tournament" engine="unreal4" +glibc="2.17" #### Directories #### # Edit with care diff --git a/lgsm/config-default/config-lgsm/vsserver/_default.cfg b/lgsm/config-default/config-lgsm/vsserver/_default.cfg index ee0fcbbb4..1b8323999 100644 --- a/lgsm/config-default/config-lgsm/vsserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/vsserver/_default.cfg @@ -86,7 +86,7 @@ logdays="7" # ANSI Colors ansi="on" -# Message Display Time +# Message Display Time sleeptime="0.5" ## SteamCMD Settings @@ -102,6 +102,7 @@ branch="" # Do not edit gamename="Vampire Slayer" engine="goldsource" +glibc="2.3.4" #### Directories #### # Edit with care diff --git a/lgsm/config-default/config-lgsm/wetserver/_default.cfg b/lgsm/config-default/config-lgsm/wetserver/_default.cfg index 64032b699..8c063de0a 100644 --- a/lgsm/config-default/config-lgsm/wetserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/wetserver/_default.cfg @@ -76,13 +76,14 @@ logdays="7" # ANSI Colors ansi="on" -# Message Display Time +# Message Display Time sleeptime="0.5" ## LinuxGSM Server Details # Do not edit gamename="Wolfenstein: Enemy Territory" engine="idtech3" +glibc="2.2.4" #### Directories #### # Edit with care diff --git a/lgsm/config-default/config-lgsm/wurmserver/_default.cfg b/lgsm/config-default/config-lgsm/wurmserver/_default.cfg index 479c6eebc..769621fd6 100644 --- a/lgsm/config-default/config-lgsm/wurmserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/wurmserver/_default.cfg @@ -78,7 +78,7 @@ logdays="7" # ANSI Colors ansi="on" -# Message Display Time +# Message Display Time sleeptime="0.5" ## SteamCMD Settings @@ -93,6 +93,7 @@ branch="" # Do not edit gamename="Wurm Unlimited" engine="wurm" +glibc="2.14" #### Directories #### # Edit with care diff --git a/lgsm/config-default/config-lgsm/zpsserver/_default.cfg b/lgsm/config-default/config-lgsm/zpsserver/_default.cfg index 41f892663..d412eca0a 100644 --- a/lgsm/config-default/config-lgsm/zpsserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/zpsserver/_default.cfg @@ -92,7 +92,7 @@ logdays="7" # ANSI Colors ansi="on" -# Message Display Time +# Message Display Time sleeptime="0.5" ## SteamCMD Settings @@ -107,6 +107,7 @@ branch="" # Do not edit gamename="Zombie Panic! Source" engine="source" +glibc="2.15" #### Directories #### # Edit with care diff --git a/lgsm/functions/alert.sh b/lgsm/functions/alert.sh index 508c704a6..3a7bf2604 100644 --- a/lgsm/functions/alert.sh +++ b/lgsm/functions/alert.sh @@ -10,7 +10,6 @@ local commandaction="Alert" fn_alert_log(){ info_distro.sh info_config.sh - info_glibc.sh info_messages.sh if [ -f "${alertlog}" ]; then rm "${alertlog}" @@ -190,4 +189,4 @@ elif [ -z "${telegramchatid}" ]&&[ "${function_selfname}" == "command_test_alert fn_print_error_nl "Telegram chat id not set." echo " * https://docs.linuxgsm.com/alerts/telegram" fn_script_error "Telegram chat id not set." -fi \ No newline at end of file +fi diff --git a/lgsm/functions/check_glibc.sh b/lgsm/functions/check_glibc.sh index 7abf46dd1..4ff80b84b 100644 --- a/lgsm/functions/check_glibc.sh +++ b/lgsm/functions/check_glibc.sh @@ -2,21 +2,27 @@ # LinuxGSM check_glibc.sh function # Author: Daniel Gibbs # Website: https://linuxgsm.com -# Description: Checks if the server has the correct Glibc version or a fix available. +# Description: Checks if the server has the correct Glibc version. local commandname="CHECK" -info_glibc.sh info_distro.sh -if [ "${glibcrequired}" == "NOT REQUIRED" ]; then +if [ "${glibc}" == "null" ]; then + # Glibc is not required. : -elif [ "$(printf '%s\n'${glibcrequired}'\n' "${glibcversion}" | sort -V | head -n 1)" != "${glibcrequired}" ]||[ "${glibcrequired}" == "UNKNOWN" ]; then - fn_print_dots "Glibc" - fn_print_error_nl "glibc: ${red}glibc distro version ${glibcversion} too old${default}" +elif [ -z "${glibc}" ]; then + fn_print_dots "glibc" + fn_print_error_nl "glibc requirement unknown" + fn_script_log_error "glibc requirement unknown" +elif [ "$(printf '%s\n'${glibc}'\n' "${glibcversion}" | sort -V | head -n 1)" != "${glibc}" ]; then + fn_print_dots "glibc" + fn_print_error_nl "glibc requirements not met" + fn_script_log_error "glibc requirements not met" echo -en "\n" - echo -e " * glibc required: ${glibcrequired}" + echo -e " * glibc required: ${glibc}" echo -e " * glibc installed: ${red}${glibcversion}${default}" echo -en "\n" - fn_print_information "The game server will probably not work. A distro upgrade is required!" + fn_print_information_nl "distro upgrade is required" + fn_script_log_info "distro upgrade is required" fi diff --git a/lgsm/functions/command_debug.sh b/lgsm/functions/command_debug.sh index 1ae89fb94..668c07b2b 100644 --- a/lgsm/functions/command_debug.sh +++ b/lgsm/functions/command_debug.sh @@ -34,18 +34,21 @@ echo -e "${blue}tmux:\t${default}${tmuxv}" echo -e "${blue}Avg Load:\t${default}${load}" echo -e "${blue}Free Memory:\t${default}${physmemfree}" echo -e "${blue}Free Disk:\t${default}${availspace}" + # 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 - echo -e "${blue}glibc required:\t${red}${glibcrequired} ${default}(${red}glibc distro version ${glibcversion} too old${default})" +if [ -n "${glibc}" ]; then + if [ "${glibc}" == "null" ]; then + # Glibc is not required. + : + elif [ -z "${glibc}" ]; then + echo -e "${blue}glibc required:\t${red}UNKNOWN${default}" + elif [ "$(printf '%s\n'${glibc}'\n' ${glibcversion} | sort -V | head -n 1)" != "${glibc}" ]; then + echo -e "${blue}glibc required:\t${red}${glibc} ${default}(${red}distro glibc ${glibcversion} too old${default})" else - echo -e "${blue}glibc required:\t${green}${glibcrequired}${default}" + echo -e "${blue}glibc required:\t${green}${glibc}${default}" fi fi + # Server ip if [ "${multiple_ip}" == "1" ]; then echo -e "${blue}Server IP:\t${default}NOT SET" diff --git a/lgsm/functions/command_details.sh b/lgsm/functions/command_details.sh index 4b11d0658..f70361d50 100644 --- a/lgsm/functions/command_details.sh +++ b/lgsm/functions/command_details.sh @@ -14,7 +14,6 @@ check.sh info_config.sh info_parms.sh info_distro.sh -info_glibc.sh info_messages.sh query_gamedig.sh fn_info_message_distro @@ -32,4 +31,3 @@ fn_info_message_ports fn_info_message_select_engine fn_info_message_statusbottom core_exit.sh - diff --git a/lgsm/functions/command_postdetails.sh b/lgsm/functions/command_postdetails.sh index 4b34c9f39..50dc4798f 100644 --- a/lgsm/functions/command_postdetails.sh +++ b/lgsm/functions/command_postdetails.sh @@ -56,7 +56,6 @@ else info_config.sh info_parms.sh info_distro.sh - info_glibc.sh info_messages.sh query_gamedig.sh touch "${postdetailslog}" || fn_bad_postdetailslog diff --git a/lgsm/functions/core_functions.sh b/lgsm/functions/core_functions.sh index e8346dae1..af1e933e0 100644 --- a/lgsm/functions/core_functions.sh +++ b/lgsm/functions/core_functions.sh @@ -51,7 +51,6 @@ fn_fetch_function # Commands - command_backup.sh(){ functionfile="${FUNCNAME}" fn_fetch_function @@ -434,15 +433,11 @@ functionfile="${FUNCNAME}" fn_fetch_function } -info_glibc.sh(){ -functionfile="${FUNCNAME}" -fn_fetch_function -} - info_messages.sh(){ functionfile="${FUNCNAME}" fn_fetch_function } + info_parms.sh(){ functionfile="${FUNCNAME}" fn_fetch_function diff --git a/lgsm/functions/info_distro.sh b/lgsm/functions/info_distro.sh index 11ab3149d..d343459dc 100644 --- a/lgsm/functions/info_distro.sh +++ b/lgsm/functions/info_distro.sh @@ -235,3 +235,10 @@ if [ ! "$(command -v jq 2>/dev/null)" ]; then fi fi fi + +# Sets the SteamCMD glibc requirement if the game server requirement is less or not required. +if [ -n "${appid}" ]; then + if [ "${glibc}" = "null" ]||[ -z "${glibc}" ]||[ "$(printf '%s\n'${glibc}'\n' "2.14" | sort -V | head -n 1)" != "2.14" ]; then + glibc="2.14" + fi +fi diff --git a/lgsm/functions/info_glibc.sh b/lgsm/functions/info_glibc.sh deleted file mode 100644 index b82140b24..000000000 --- a/lgsm/functions/info_glibc.sh +++ /dev/null @@ -1,236 +0,0 @@ -#!/bin/bash -# LinuxGSM info_glibc.sh function -# Author: Daniel Gibbs -# Website: https://linuxgsm.com -# Description: Stores details on servers Glibc requirements. - -local function_selfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" - -if [ "${gamename}" == "ARK: Survival Evolved" ]; then - glibcrequired="2.15" - glibcfix="no" -elif [ "${gamename}" == "Ballistic Overkill" ]; then - glibcrequired="2.15" - glibcfix="yes" -elif [ "${gamename}" == "Base Defense" ]; then - glibcrequired="2.14" - glibcfix="no" -elif [ "${gamename}" == "Black Mesa: Deathmatch" ]; then - glibcrequired="2.15" - glibcfix="yes" -elif [ "${gamename}" == "Blade Symphony" ]; then - glibcrequired="2.15" - glibcfix="yes" -elif [ "${gamename}" == "BrainBread 2" ]; then - glibcrequired="2.17" - glibcfix="no" -elif [ "${gamename}" == "Call of Duty" ]; then - glibcrequired="2.1" - glibcfix="no" -elif [ "${gamename}" == "Call of Duty 2" ]; then - glibcrequired="2.1.3" - glibcfix="no" -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" -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" -elif [ "${gamename}" == "Double Action: Boogaloo" ]; then - glibcrequired="2.15" - glibcfix="yes" -elif [ "${gamename}" == "Dystopia" ]; then - glibcrequired="2.15" - glibcfix="no" -elif [ "${gamename}" == "Eco" ]; then - glibcrequired="NOT REQUIRED" - glibcfix="no" -elif [ "${gamename}" == "Empires Mod" ]; then - glibcrequired="2.15" - glibcfix="yes" -elif [ "${gamename}" == "Factorio" ]; then - glibcrequired="2.18" - glibcfix="yes" -elif [ "${gamename}" == "Fistful of Frags" ]; then - glibcrequired="2.15" - glibcfix="yes" -elif [ "${gamename}" == "Garry's Mod" ]; then - glibcrequired="2.15" - glibcfix="yes" -elif [ "${gamename}" == "GoldenEye: Source" ]; then - glibcrequired="2.15" - glibcfix="yes" -elif [ "${gamename}" == "Insurgency" ]; then - glibcrequired="2.15" - glibcfix="yes" -elif [ "${shortname}" == "kf2" ]; then - glibcrequired="2.17" - glibcfix="no" -elif [ "${shortname}" == "tu" ]; then - glibcrequired="2.15" - glibcfix="no" -elif [ "${gamename}" == "Mumble" ]; then - glibcrequired="NOT REQUIRED" - glibcfix="no" -elif [ "${gamename}" == "No More Room in Hell" ]; then - glibcrequired="2.15" - glibcfix="yes" -elif [ "${gamename}" == "Project Cars" ]; then - glibcrequired="2.4" - glibcfix="no" -elif [ "${gamename}" == "Pirates, Vikings, and Knights II" ]; then - glibcrequired="2.15" - glibcfix="yes" -elif [ "${shortname}" == "pstbs" ]; then - glibcrequired="2.17" - glibcfix="no" -elif [ "${gamename}" == "Quake 2" ]; then - glibcrequired="NOT REQUIRED" - glibcfix="no" -elif [ "${gamename}" == "Quake 3: Arena" ]; then - glibcrequired="2.1" - glibcfix="no" -elif [ "${gamename}" == "Quake Live" ]; then - glibcrequired="2.15" - glibcfix="no" -elif [ "${gamename}" == "Return to Castle Wolfenstein" ]; then - glibcrequired="2.1" - glibcfix="no" -elif [ "${shortname}" == "rw" ]; then - glibcrequired="2.14" - glibcfix="no" -elif [ "${gamename}" == "Soldier Of Fortune 2: Gold Edition" ]; then - glibcrequired="2.1" - glibcfix="no" -elif [ "${gamename}" == "San Andreas Multiplayer" ]; then - glibcrequired="2.3" - glibcfix="no" -elif [ "${gamename}" == "Squad" ]; then - glibcrequired="2.17" - glibcfix="no" -elif [ "${gamename}" == "Sven Co-op" ]; then - glibcrequired="2.24" - glibcfix="no" -elif [ "${shortname}" == "sbots" ]; then - glibcrequired="2.17" - glibcfix="no" -elif [ "${gamename}" == "Team Fortress 2" ]; then - glibcrequired="2.15" - glibcfix="yes" -elif [ "${gamename}" == "TeamSpeak 3" ]; then - glibcrequired="NOT REQUIRED" - glibcfix="no" -elif [ "${gamename}" == "Teeworlds" ]; then - glibcrequired="2.14" - glibcfix="no" -elif [ "${gamename}" == "Just Cause 2" ]; then - glibcrequired="2.13" - glibcfix="yes" -elif [ "${gamename}" == "Just Cause 3" ]; then - glibcrequired="2.17" - glibcfix="no" -elif [ "${gamename}" == "Natural Selection 2" ]; then - glibcrequired="2.17" - glibcfix="no" -elif [ "${gamename}" == "NS2: Combat" ]; then - glibcrequired="2.15" - glibcfix="yes" -elif [ "${gamename}" == "TeamSpeak 3" ]; then - glibcrequired="NOT REQUIRED" - glibcfix="no" -elif [ "${gamename}" == "MORDHAU" ]; then - glibcrequired="2.17" - glibcfix="no" -elif [ "${gamename}" == "Mumble" ]; then - glibcrequired="NOT REQUIRED" - glibcfix="no" -elif [ "${engine}" == "refractor" ]; then - glibcrequired="2.0" - glibcfix="no" -elif [ "${gamename}" == "Wolfenstein: Enemy Territory" ]; then - glibcrequired="2.2.4" - glibcfix="no" -elif [ "${gamename}" == "ET: Legacy" ]; then - glibcrequired="2.7" - glibcfix="no" -elif [ "${gamename}" == "Wurm Unlimited" ]; then - glibcrequired="2.14" - glibcfix="no" -elif [ "${gamename}" == "Multi Theft Auto" ]; then - glibcrequired="2.7" - glibcfix="no" -elif [ "${gamename}" == "Unturned" ]; then - glibcrequired="2.15" - glibcfix="no" -elif [ "${gamename}" == "Zombie Panic! Source" ]; then - glibcrequired="2.15" - glibcfix="yes" -elif [ "${engine}" == "starbound" ]; then - glibcrequired="2.17" - glibcfix="no" -elif [ "${engine}" == "quake" ]; then - glibcrequired="2.0" - glibcfix="no" -elif [ "${engine}" == "terraria" ]; then - glibcrequired="2.7" - glibcfix="no" -elif [ "${engine}" == "unreal" ]; then - glibcrequired="2.1" - glibcfix="no" -elif [ "${engine}" == "unreal2" ]; then - glibcrequired="2.4" - glibcfix="no" -elif [ "${engine}" == "unreal3" ]; then - glibcrequired="2.3.2" - glibcfix="no" -elif [ "${engine}" == "unreal4" ]; then - glibcrequired="2.17" - glibcfix="no" -elif [ "${engine}" == "unity3d" ]; then - glibcrequired="2.15" - glibcfix="no" -elif [ "${engine}" == "dontstarve" ]; then - glibcrequired="2.15" - glibcfix="no" -elif [ "${engine}" == "lwjgl2" ]; then - glibcrequired="NOT REQUIRED" - glibcfix="no" -elif [ "${engine}" == "projectzomboid" ]; then - glibcrequired="2.15" - glibcfix="no" -elif [ "${engine}" == "realvirtuality" ]; then - glibcrequired="2.13" - glibcfix="yes" -elif [ "${engine}" == "seriousengine35" ]; then - glibcrequired="2.13" - glibcfix="yes" -elif [ "${engine}" == "source" ]; then - glibcrequired="2.3.6" - glibcfix="no" -elif [ "${engine}" == "goldsource" ]; then - glibcrequired="2.3.4" - glibcfix="no" -else - glibcrequired="UNKNOWN" - glibcfix="no" -fi - -# Sets the SteamCMD glibc requirement if the game server requirement is less or not required. -if [ -n "${appid}" ]; then - if [ "${glibcrequired}" = "NOT REQUIRED" ]||[ -z "${glibcrequired}" ]||[ "$(printf '%s\n'${glibcrequired}'\n' "2.14" | sort -V | head -n 1)" != "2.14" ]; then - glibcrequired="2.14" - glibcfix="no" - fi -fi diff --git a/lgsm/functions/info_messages.sh b/lgsm/functions/info_messages.sh index a5cb8bce1..4c1b960c4 100644 --- a/lgsm/functions/info_messages.sh +++ b/lgsm/functions/info_messages.sh @@ -369,15 +369,16 @@ fn_info_message_script(){ 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 - echo -e "${blue}glibc required:\t${red}${glibcrequired} ${default}(${red}glibc distro version ${glibcversion} too old${default})" + if [ -n "${glibc}" ]; then + if [ "${glibc}" == "null" ]; then + # Glibc is not required. + : + elif [ -z "${glibc}" ]; then + echo -e "${blue}glibc required:\t${red}UNKNOWN${default}" + elif [ "$(printf '%s\n'${glibc}'\n' ${glibcversion} | sort -V | head -n 1)" != "${glibc}" ]; then + echo -e "${blue}glibc required:\t${red}${glibc} ${default}(${red}distro glibc ${glibcversion} too old${default})" else - echo -e "${blue}glibc required:\t${green}${glibcrequired}${default}" + echo -e "${blue}glibc required:\t${green}${glibc}${default}" fi fi From fc0580fbba197b8adcb4f37a2572d92d387b0ef3 Mon Sep 17 00:00:00 2001 From: Christian Date: Mon, 10 Jun 2019 19:04:46 +0200 Subject: [PATCH 098/534] fix(ts3server): ts3 now requires glibc (#2387) Co-authored-by: Christian Birk --- lgsm/config-default/config-lgsm/ts3server/_default.cfg | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lgsm/config-default/config-lgsm/ts3server/_default.cfg b/lgsm/config-default/config-lgsm/ts3server/_default.cfg index 03a6f47e5..871fe71bc 100644 --- a/lgsm/config-default/config-lgsm/ts3server/_default.cfg +++ b/lgsm/config-default/config-lgsm/ts3server/_default.cfg @@ -83,7 +83,7 @@ sleeptime="0.5" gamename="TeamSpeak 3" servername="TeamSpeak 3 Server" engine="null" -glibc="null" +glibc="2.17" #### Directories #### # Edit with care From c22058fe3b0f9950f1486e2c382eefd11be2b590 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Mon, 10 Jun 2019 18:18:12 +0100 Subject: [PATCH 099/534] Update FUNDING.yml --- .github/FUNDING.yml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/.github/FUNDING.yml b/.github/FUNDING.yml index 62f2cf7a8..f0900ae1e 100644 --- a/.github/FUNDING.yml +++ b/.github/FUNDING.yml @@ -6,4 +6,8 @@ open_collective: # Replace with a single Open Collective username ko_fi: # Replace with a single Ko-fi username tidelift: # Replace with a single Tidelift platform-name/package-name e.g., npm/babel community_bridge: # Replace with a single Community Bridge project-name e.g., cloud-foundry +liberapay: # Replace with a single Liberapay username +issuehunt: # Replace with a single IssueHunt username +otechie: # Replace with a single Otechie username +custom: # Replace with a single custom sponsorship URL custom: https://www.paypal.me/dgibbs64 # Replace with a single custom sponsorship URL From 4f44482317aeb4761aff3374780c19f2db9e4ab5 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Mon, 10 Jun 2019 18:18:40 +0100 Subject: [PATCH 100/534] Update FUNDING.yml --- .github/FUNDING.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/.github/FUNDING.yml b/.github/FUNDING.yml index f0900ae1e..d05c374dc 100644 --- a/.github/FUNDING.yml +++ b/.github/FUNDING.yml @@ -9,5 +9,4 @@ community_bridge: # Replace with a single Community Bridge project-name e.g., cl liberapay: # Replace with a single Liberapay username issuehunt: # Replace with a single IssueHunt username otechie: # Replace with a single Otechie username -custom: # Replace with a single custom sponsorship URL custom: https://www.paypal.me/dgibbs64 # Replace with a single custom sponsorship URL From 62cb12f6f6d6ce00106b9006bac0657d9f5cfbb5 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Mon, 10 Jun 2019 22:38:17 +0100 Subject: [PATCH 101/534] refactor of pull request template --- .../ISSUE_TEMPLATE/PULL_REQUEST_TEMPLATE.md | 22 +++++++++++++------ 1 file changed, 15 insertions(+), 7 deletions(-) rename PULL_REQUEST_TEMPLATE.md => .github/ISSUE_TEMPLATE/PULL_REQUEST_TEMPLATE.md (68%) diff --git a/PULL_REQUEST_TEMPLATE.md b/.github/ISSUE_TEMPLATE/PULL_REQUEST_TEMPLATE.md similarity index 68% rename from PULL_REQUEST_TEMPLATE.md rename to .github/ISSUE_TEMPLATE/PULL_REQUEST_TEMPLATE.md index 749aadeed..8c40ff457 100644 --- a/PULL_REQUEST_TEMPLATE.md +++ b/.github/ISSUE_TEMPLATE/PULL_REQUEST_TEMPLATE.md @@ -1,6 +1,6 @@ # Description -Please include a summary of the change and which issue is fixed. +Please include a summary of the change and which issues is fixed Fixes #[issue] @@ -11,18 +11,19 @@ Fixes #[issue] * [ ] New Server (new server added). * [ ] Refactor (restructures existing code). * [ ] Comment update (typo, spelling, explanation, examples, etc). -* [ ] This change requires a documentation update. ## Checklist -* [ ] This code follows the style guidelines of this project. +PR will not be merged until all steps are complete. + * [ ] This pull request links to an issue. * [ ] This pull request uses the `develop` branch as its base. +* [ ] This code follows the style guidelines of this project. * [ ] I have provided Co-author details below. * [ ] I have performed a self-review of my own code. -* [ ] I have squashed commits. -* [ ] I have commented my code, particularly in hard to understand areas. -* [ ] I have made corresponding changes to the documentation if required. +* [ ] I have checked that this code is commented where required. +* [ ] I have provided a detailed enough description of this PR. +* [ ] I have checked If documentation needs updating. ## Provide Github Email @@ -33,8 +34,15 @@ Co-authored-by: John Doe - [ ] I do not wish to provide an email. I am aware this will hide me as the author of this commit. - All pull requests will now be squashed to create a tidy commit history and simplify changelog creation. You can provide either your own email or a GitHub-provided no-reply email. When a PR is squashed the author becomes the person who squashed the PR. This removes you as the author of your own PR. The only workaround for this is to add your details as a co-author. More info about co-authors can be found [here](https://help.github.com/en/articles/creating-a-commit-with-multiple-authors). + +## Documentation + +If documentation does need updating either update it by creating a PR (preferred) or request a documentation update. +* User docs: https://github.com/GameServerManagers/LinuxGSM-Docs +* Dev docs: https://github.com/GameServerManagers/LinuxGSM-Dev-Docs + +**Thank you for your Pull Request!** From 389cbe727552fe25eee0cf83b989da587ed799d7 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Tue, 11 Jun 2019 18:51:46 +0100 Subject: [PATCH 102/534] feat(details): add steam master server setting (#2385) This new feature will confirm if supported game servers are listed on the steam master server. --- .../config-lgsm/arkserver/_default.cfg | 6 +++--- .../config-lgsm/arma3server/_default.cfg | 6 +++--- .../config-lgsm/bb2server/_default.cfg | 6 +++--- .../config-lgsm/bbserver/_default.cfg | 6 +++--- .../config-lgsm/bdserver/_default.cfg | 4 ++++ .../config-lgsm/bmdmserver/_default.cfg | 6 +++--- .../config-lgsm/boserver/_default.cfg | 8 ++++---- .../config-lgsm/bsserver/_default.cfg | 6 +++--- .../config-lgsm/bt1944server/_default.cfg | 6 +++--- .../config-lgsm/ccserver/_default.cfg | 6 +++--- .../config-lgsm/csczserver/_default.cfg | 6 +++--- .../config-lgsm/csgoserver/_default.cfg | 6 +++--- .../config-lgsm/csserver/_default.cfg | 6 +++--- .../config-lgsm/cssserver/_default.cfg | 6 +++--- .../config-lgsm/dabserver/_default.cfg | 6 +++--- .../config-lgsm/dmcserver/_default.cfg | 6 +++--- .../config-lgsm/dodserver/_default.cfg | 6 +++--- .../config-lgsm/dodsserver/_default.cfg | 6 +++--- .../config-lgsm/doiserver/_default.cfg | 6 +++--- .../config-lgsm/dstserver/_default.cfg | 6 +++--- .../config-lgsm/dysserver/_default.cfg | 6 +++--- .../config-lgsm/ecoserver/_default.cfg | 6 +++--- .../config-lgsm/emserver/_default.cfg | 6 +++--- .../config-lgsm/fofserver/_default.cfg | 6 +++--- .../config-lgsm/gesserver/_default.cfg | 6 +++--- .../config-lgsm/gmodserver/_default.cfg | 6 +++--- .../config-lgsm/hl2dmserver/_default.cfg | 6 +++--- .../config-lgsm/hldmserver/_default.cfg | 6 +++--- .../config-lgsm/hldmsserver/_default.cfg | 6 +++--- .../config-lgsm/hwserver/_default.cfg | 6 +++--- .../config-lgsm/insserver/_default.cfg | 6 +++--- .../config-lgsm/inssserver/_default.cfg | 6 +++--- .../config-lgsm/iosserver/_default.cfg | 6 +++--- .../config-lgsm/jc2server/_default.cfg | 6 +++--- .../config-lgsm/jc3server/_default.cfg | 6 +++--- .../config-lgsm/kf2server/_default.cfg | 6 +++--- .../config-lgsm/kfserver/_default.cfg | 6 +++--- .../config-lgsm/l4d2server/_default.cfg | 6 +++--- .../config-lgsm/l4dserver/_default.cfg | 6 +++--- .../config-lgsm/mhserver/_default.cfg | 6 +++--- .../config-lgsm/ndserver/_default.cfg | 6 +++--- .../config-lgsm/nmrihserver/_default.cfg | 6 +++--- .../config-lgsm/ns2cserver/_default.cfg | 6 +++--- .../config-lgsm/ns2server/_default.cfg | 6 +++--- .../config-lgsm/nsserver/_default.cfg | 6 +++--- .../config-lgsm/opforserver/_default.cfg | 6 +++--- .../config-lgsm/pcserver/_default.cfg | 6 +++--- .../config-lgsm/pstbsserver/_default.cfg | 6 +++--- .../config-lgsm/pvkiiserver/_default.cfg | 6 +++--- .../config-lgsm/pzserver/_default.cfg | 6 +++--- .../config-lgsm/qlserver/_default.cfg | 6 +++--- .../config-lgsm/ricochetserver/_default.cfg | 6 +++--- .../config-lgsm/roserver/_default.cfg | 6 +++--- .../config-lgsm/rustserver/_default.cfg | 6 +++--- .../config-lgsm/rwserver/_default.cfg | 6 +++--- .../config-lgsm/sbotsserver/_default.cfg | 6 +++--- .../config-lgsm/sbserver/_default.cfg | 5 ++--- .../config-lgsm/sdtdserver/_default.cfg | 6 +++--- .../config-lgsm/squadserver/_default.cfg | 6 +++--- .../config-lgsm/ss3server/_default.cfg | 6 +++--- .../config-lgsm/stserver/_default.cfg | 6 +++--- .../config-lgsm/svenserver/_default.cfg | 6 +++--- .../config-lgsm/terrariaserver/_default.cfg | 6 +++--- .../config-lgsm/tf2server/_default.cfg | 6 +++--- .../config-lgsm/tfcserver/_default.cfg | 6 +++--- .../config-lgsm/tuserver/_default.cfg | 6 +++--- .../config-lgsm/twserver/_default.cfg | 6 +++--- .../config-lgsm/untserver/_default.cfg | 6 +++--- .../config-lgsm/vsserver/_default.cfg | 6 +++--- .../config-lgsm/wurmserver/_default.cfg | 6 +++--- .../config-lgsm/zpsserver/_default.cfg | 6 +++--- lgsm/functions/command_debug.sh | 8 ++++++++ lgsm/functions/info_distro.sh | 15 +++++++++------ 73 files changed, 231 insertions(+), 217 deletions(-) diff --git a/lgsm/config-default/config-lgsm/arkserver/_default.cfg b/lgsm/config-default/config-lgsm/arkserver/_default.cfg index be19aacf6..afe5d8aea 100644 --- a/lgsm/config-default/config-lgsm/arkserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/arkserver/_default.cfg @@ -94,10 +94,10 @@ sleeptime="0.5" ## 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" +# SteamCMD Branch | https://docs.linuxgsm.com/steamcmd/branch branch="" +# Master Server | https://docs.linuxgsm.com/steamcmd/steam-master-server +steammaster="true" ## LinuxGSM Server Details # Do not edit diff --git a/lgsm/config-default/config-lgsm/arma3server/_default.cfg b/lgsm/config-default/config-lgsm/arma3server/_default.cfg index a456e1b44..6f1d61596 100644 --- a/lgsm/config-default/config-lgsm/arma3server/_default.cfg +++ b/lgsm/config-default/config-lgsm/arma3server/_default.cfg @@ -108,10 +108,10 @@ sleeptime="0.5" ## 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" +# SteamCMD Branch | https://docs.linuxgsm.com/steamcmd/branch branch="" +# Master Server | https://docs.linuxgsm.com/steamcmd/steam-master-server +steammaster="false" ## LinuxGSM Server Details # Do not edit diff --git a/lgsm/config-default/config-lgsm/bb2server/_default.cfg b/lgsm/config-default/config-lgsm/bb2server/_default.cfg index 0a45d187f..a1df15a8a 100644 --- a/lgsm/config-default/config-lgsm/bb2server/_default.cfg +++ b/lgsm/config-default/config-lgsm/bb2server/_default.cfg @@ -98,10 +98,10 @@ sleeptime="0.5" ## 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" +# SteamCMD Branch | https://docs.linuxgsm.com/steamcmd/branch branch="" +# Master Server | https://docs.linuxgsm.com/steamcmd/steam-master-server +steammaster="true" ## LinuxGSM Server Details # Do not edit diff --git a/lgsm/config-default/config-lgsm/bbserver/_default.cfg b/lgsm/config-default/config-lgsm/bbserver/_default.cfg index 1ee54e0c1..95ea35acd 100644 --- a/lgsm/config-default/config-lgsm/bbserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/bbserver/_default.cfg @@ -93,10 +93,10 @@ sleeptime="0.5" # 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" +# SteamCMD Branch | https://docs.linuxgsm.com/steamcmd/branch branch="" +# Master Server | https://docs.linuxgsm.com/steamcmd/steam-master-server +steammaster="false" ## LinuxGSM Server Details # Do not edit diff --git a/lgsm/config-default/config-lgsm/bdserver/_default.cfg b/lgsm/config-default/config-lgsm/bdserver/_default.cfg index 404b3b796..cfb29f608 100644 --- a/lgsm/config-default/config-lgsm/bdserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/bdserver/_default.cfg @@ -92,6 +92,10 @@ sleeptime="0.5" ## SteamCMD Settings # Server appid appid="817300" +# SteamCMD Branch | https://docs.linuxgsm.com/steamcmd/branch +branch="" +# Master Server | https://docs.linuxgsm.com/steamcmd/steam-master-server +steammaster="true" ## LinuxGSM Server Details # Do not edit diff --git a/lgsm/config-default/config-lgsm/bmdmserver/_default.cfg b/lgsm/config-default/config-lgsm/bmdmserver/_default.cfg index 2e27bf99e..9f60b4235 100644 --- a/lgsm/config-default/config-lgsm/bmdmserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/bmdmserver/_default.cfg @@ -98,10 +98,10 @@ sleeptime="0.5" ## 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" +# SteamCMD Branch | https://docs.linuxgsm.com/steamcmd/branch branch="" +# Master Server | https://docs.linuxgsm.com/steamcmd/steam-master-server +steammaster="true" ## LinuxGSM Server Details # Do not edit diff --git a/lgsm/config-default/config-lgsm/boserver/_default.cfg b/lgsm/config-default/config-lgsm/boserver/_default.cfg index c41c23b85..778733547 100644 --- a/lgsm/config-default/config-lgsm/boserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/boserver/_default.cfg @@ -16,7 +16,7 @@ ip="" ## Server Start Command | https://docs.linuxgsm.com/configuration/start-parameters#additional-parameters fn_parms(){ -parms=" -batchmode -nographics -dedicated -configfile=${servercfgfullpath}" +parms="-batchmode -nographics -dedicated -configfile=${servercfgfullpath}" } #### LinuxGSM Settings #### @@ -91,10 +91,10 @@ sleeptime="0.5" ## 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" +# SteamCMD Branch | https://docs.linuxgsm.com/steamcmd/branch branch="" +# Master Server | https://docs.linuxgsm.com/steamcmd/steam-master-server +steammaster="false" ## LinuxGSM Server Details # Do not edit diff --git a/lgsm/config-default/config-lgsm/bsserver/_default.cfg b/lgsm/config-default/config-lgsm/bsserver/_default.cfg index d6ed55c81..04b20addd 100644 --- a/lgsm/config-default/config-lgsm/bsserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/bsserver/_default.cfg @@ -102,10 +102,10 @@ sleeptime="0.5" ## 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" +# SteamCMD Branch | https://docs.linuxgsm.com/steamcmd/branch branch="" +# Master Server | https://docs.linuxgsm.com/steamcmd/steam-master-server +steammaster="true" ## LinuxGSM Server Details # Do not edit diff --git a/lgsm/config-default/config-lgsm/bt1944server/_default.cfg b/lgsm/config-default/config-lgsm/bt1944server/_default.cfg index dfc6333dc..81a00f049 100644 --- a/lgsm/config-default/config-lgsm/bt1944server/_default.cfg +++ b/lgsm/config-default/config-lgsm/bt1944server/_default.cfg @@ -90,10 +90,10 @@ sleeptime="0.5" ## SteamCMD Settings # Server appid appid="805140" -# Steam App Branch Select -# Allows to opt into the various Steam app branches. Default branch is "". -# Example: "-beta latest_experimental" +# SteamCMD Branch | https://docs.linuxgsm.com/steamcmd/branch branch="" +# Master Server | https://docs.linuxgsm.com/steamcmd/steam-master-server +steammaster="false" ## LinuxGSM Server Details # Do not edit diff --git a/lgsm/config-default/config-lgsm/ccserver/_default.cfg b/lgsm/config-default/config-lgsm/ccserver/_default.cfg index 5fd37c64c..3bf39a55d 100644 --- a/lgsm/config-default/config-lgsm/ccserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/ccserver/_default.cfg @@ -93,10 +93,10 @@ sleeptime="0.5" ## 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" +# SteamCMD Branch | https://docs.linuxgsm.com/steamcmd/branch branch="" +# Master Server | https://docs.linuxgsm.com/steamcmd/steam-master-server +steammaster="false" ## LinuxGSM Server Details # Do not edit diff --git a/lgsm/config-default/config-lgsm/csczserver/_default.cfg b/lgsm/config-default/config-lgsm/csczserver/_default.cfg index da41f37c9..bb1ce28d6 100644 --- a/lgsm/config-default/config-lgsm/csczserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/csczserver/_default.cfg @@ -93,10 +93,10 @@ sleeptime="0.5" # 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" +# SteamCMD Branch | https://docs.linuxgsm.com/steamcmd/branch branch="" +# Master Server | https://docs.linuxgsm.com/steamcmd/steam-master-server +steammaster="true" ## LinuxGSM Server Details # Do not edit diff --git a/lgsm/config-default/config-lgsm/csgoserver/_default.cfg b/lgsm/config-default/config-lgsm/csgoserver/_default.cfg index f81ca8e90..5ff46fcf4 100644 --- a/lgsm/config-default/config-lgsm/csgoserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/csgoserver/_default.cfg @@ -118,10 +118,10 @@ sleeptime="0.5" ## 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" +# SteamCMD Branch | https://docs.linuxgsm.com/steamcmd/branch branch="" +# Master Server | https://docs.linuxgsm.com/steamcmd/steam-master-server +steammaster="true" ## LinuxGSM Server Details # Do not edit diff --git a/lgsm/config-default/config-lgsm/csserver/_default.cfg b/lgsm/config-default/config-lgsm/csserver/_default.cfg index bf044c8a6..471d76fb7 100644 --- a/lgsm/config-default/config-lgsm/csserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/csserver/_default.cfg @@ -93,10 +93,10 @@ sleeptime="0.5" # 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" +# SteamCMD Branch | https://docs.linuxgsm.com/steamcmd/branch branch="" +# Master Server | https://docs.linuxgsm.com/steamcmd/steam-master-server +steammaster="true" ## LinuxGSM Server Details # Do not edit diff --git a/lgsm/config-default/config-lgsm/cssserver/_default.cfg b/lgsm/config-default/config-lgsm/cssserver/_default.cfg index beb83ee29..72fd8f04d 100644 --- a/lgsm/config-default/config-lgsm/cssserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/cssserver/_default.cfg @@ -98,10 +98,10 @@ sleeptime="0.5" ## 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" +# SteamCMD Branch | https://docs.linuxgsm.com/steamcmd/branch branch="" +# Master Server | https://docs.linuxgsm.com/steamcmd/steam-master-server +steammaster="true" ## LinuxGSM Server Details # Do not edit diff --git a/lgsm/config-default/config-lgsm/dabserver/_default.cfg b/lgsm/config-default/config-lgsm/dabserver/_default.cfg index e29118a7a..295387379 100644 --- a/lgsm/config-default/config-lgsm/dabserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/dabserver/_default.cfg @@ -93,10 +93,10 @@ sleeptime="0.5" ## 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" +# SteamCMD Branch | https://docs.linuxgsm.com/steamcmd/branch branch="" +# Master Server | https://docs.linuxgsm.com/steamcmd/steam-master-server +steammaster="true" ## LinuxGSM Server Details # Do not edit diff --git a/lgsm/config-default/config-lgsm/dmcserver/_default.cfg b/lgsm/config-default/config-lgsm/dmcserver/_default.cfg index 412e5ab73..9aae5bfd9 100644 --- a/lgsm/config-default/config-lgsm/dmcserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/dmcserver/_default.cfg @@ -93,10 +93,10 @@ sleeptime="0.5" # 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" +# SteamCMD Branch | https://docs.linuxgsm.com/steamcmd/branch branch="" +# Master Server | https://docs.linuxgsm.com/steamcmd/steam-master-server +steammaster="true" ## LinuxGSM Server Details # Do not edit diff --git a/lgsm/config-default/config-lgsm/dodserver/_default.cfg b/lgsm/config-default/config-lgsm/dodserver/_default.cfg index 518e821c3..7484ba7c9 100644 --- a/lgsm/config-default/config-lgsm/dodserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/dodserver/_default.cfg @@ -93,10 +93,10 @@ sleeptime="0.5" # 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" +# SteamCMD Branch | https://docs.linuxgsm.com/steamcmd/branch branch="" +# Master Server | https://docs.linuxgsm.com/steamcmd/steam-master-server +steammaster="true" ## LinuxGSM Server Details # Do not edit diff --git a/lgsm/config-default/config-lgsm/dodsserver/_default.cfg b/lgsm/config-default/config-lgsm/dodsserver/_default.cfg index 67c4dd837..8969011f0 100644 --- a/lgsm/config-default/config-lgsm/dodsserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/dodsserver/_default.cfg @@ -93,10 +93,10 @@ sleeptime="0.5" ## 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" +# SteamCMD Branch | https://docs.linuxgsm.com/steamcmd/branch branch="" +# Master Server | https://docs.linuxgsm.com/steamcmd/steam-master-server +steammaster="true" ## LinuxGSM Server Details # Do not edit diff --git a/lgsm/config-default/config-lgsm/doiserver/_default.cfg b/lgsm/config-default/config-lgsm/doiserver/_default.cfg index 464020800..672c972cd 100644 --- a/lgsm/config-default/config-lgsm/doiserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/doiserver/_default.cfg @@ -95,10 +95,10 @@ sleeptime="0.5" ## 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" +# SteamCMD Branch | https://docs.linuxgsm.com/steamcmd/branch branch="" +# Master Server | https://docs.linuxgsm.com/steamcmd/steam-master-server +steammaster="true" ## LinuxGSM Server Details # Do not edit diff --git a/lgsm/config-default/config-lgsm/dstserver/_default.cfg b/lgsm/config-default/config-lgsm/dstserver/_default.cfg index ca0eb82f3..ea70e63c5 100644 --- a/lgsm/config-default/config-lgsm/dstserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/dstserver/_default.cfg @@ -96,10 +96,10 @@ sleeptime="0.5" ## 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" +# SteamCMD Branch | https://docs.linuxgsm.com/steamcmd/branch branch="" +# Master Server | https://docs.linuxgsm.com/steamcmd/steam-master-server +steammaster="false" ## LinuxGSM Server Details # Do not edit diff --git a/lgsm/config-default/config-lgsm/dysserver/_default.cfg b/lgsm/config-default/config-lgsm/dysserver/_default.cfg index 283902256..1efdf7655 100644 --- a/lgsm/config-default/config-lgsm/dysserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/dysserver/_default.cfg @@ -98,10 +98,10 @@ sleeptime="0.5" ## SteamCMD Settings # Server appid appid="17585" -# Steam App Branch Select -# Allows to opt into the various Steam app branches. Default branch is "". -# Example: "-beta latest_experimental" +# SteamCMD Branch | https://docs.linuxgsm.com/steamcmd/branch branch="" +# Master Server | https://docs.linuxgsm.com/steamcmd/steam-master-server +steammaster="true" ## LinuxGSM Server Details # Do not edit diff --git a/lgsm/config-default/config-lgsm/ecoserver/_default.cfg b/lgsm/config-default/config-lgsm/ecoserver/_default.cfg index 17149df44..1996226d8 100644 --- a/lgsm/config-default/config-lgsm/ecoserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/ecoserver/_default.cfg @@ -81,10 +81,10 @@ sleeptime="0.5" ## SteamCMD Settings # Server appid appid="739590" -# Steam App Branch Select -# Allows to opt into the various Steam app branches. Default branch is "". -# Example: "-beta 7.3.0" +# SteamCMD Branch | https://docs.linuxgsm.com/steamcmd/branch branch="" +# Master Server | https://docs.linuxgsm.com/steamcmd/steam-master-server +steammaster="false" ## LinuxGSM Server Details # Do not edit diff --git a/lgsm/config-default/config-lgsm/emserver/_default.cfg b/lgsm/config-default/config-lgsm/emserver/_default.cfg index d7cad367d..15a44e3e6 100644 --- a/lgsm/config-default/config-lgsm/emserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/emserver/_default.cfg @@ -98,10 +98,10 @@ sleeptime="0.5" ## 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" +# SteamCMD Branch | https://docs.linuxgsm.com/steamcmd/branch branch="" +# Master Server | https://docs.linuxgsm.com/steamcmd/steam-master-server +steammaster="true" ## LinuxGSM Server Details # Do not edit diff --git a/lgsm/config-default/config-lgsm/fofserver/_default.cfg b/lgsm/config-default/config-lgsm/fofserver/_default.cfg index c2dff17ca..4399350ac 100644 --- a/lgsm/config-default/config-lgsm/fofserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/fofserver/_default.cfg @@ -93,10 +93,10 @@ sleeptime="0.5" ## 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" +# SteamCMD Branch | https://docs.linuxgsm.com/steamcmd/branch branch="" +# Master Server | https://docs.linuxgsm.com/steamcmd/steam-master-server +steammaster="true" ## LinuxGSM Server Details # Do not edit diff --git a/lgsm/config-default/config-lgsm/gesserver/_default.cfg b/lgsm/config-default/config-lgsm/gesserver/_default.cfg index e4912eaa6..f82d94bd5 100644 --- a/lgsm/config-default/config-lgsm/gesserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/gesserver/_default.cfg @@ -93,10 +93,10 @@ sleeptime="0.5" ## 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" +# SteamCMD Branch | https://docs.linuxgsm.com/steamcmd/branch branch="" +# Master Server | https://docs.linuxgsm.com/steamcmd/steam-master-server +steammaster="true" ## LinuxGSM Server Details # Do not edit diff --git a/lgsm/config-default/config-lgsm/gmodserver/_default.cfg b/lgsm/config-default/config-lgsm/gmodserver/_default.cfg index 33cf589ad..8c6f09565 100644 --- a/lgsm/config-default/config-lgsm/gmodserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/gmodserver/_default.cfg @@ -109,10 +109,10 @@ sleeptime="0.5" ## 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" +# SteamCMD Branch | https://docs.linuxgsm.com/steamcmd/branch branch="" +# Master Server | https://docs.linuxgsm.com/steamcmd/steam-master-server +steammaster="true" ## LinuxGSM Server Details # Do not edit diff --git a/lgsm/config-default/config-lgsm/hl2dmserver/_default.cfg b/lgsm/config-default/config-lgsm/hl2dmserver/_default.cfg index 15a6e44b1..7c9bb9a43 100644 --- a/lgsm/config-default/config-lgsm/hl2dmserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/hl2dmserver/_default.cfg @@ -93,10 +93,10 @@ sleeptime="0.5" ## 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" +# SteamCMD Branch | https://docs.linuxgsm.com/steamcmd/branch branch="" +# Master Server | https://docs.linuxgsm.com/steamcmd/steam-master-server +steammaster="true" ## LinuxGSM Server Details # Do not edit diff --git a/lgsm/config-default/config-lgsm/hldmserver/_default.cfg b/lgsm/config-default/config-lgsm/hldmserver/_default.cfg index 8705915cd..25dcd4736 100644 --- a/lgsm/config-default/config-lgsm/hldmserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/hldmserver/_default.cfg @@ -92,10 +92,10 @@ sleeptime="0.5" ## 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" +# SteamCMD Branch | https://docs.linuxgsm.com/steamcmd/branch branch="" +# Master Server | https://docs.linuxgsm.com/steamcmd/steam-master-server +steammaster="true" ## LinuxGSM Server Details # Do not edit diff --git a/lgsm/config-default/config-lgsm/hldmsserver/_default.cfg b/lgsm/config-default/config-lgsm/hldmsserver/_default.cfg index 621bcfff2..249b702fd 100644 --- a/lgsm/config-default/config-lgsm/hldmsserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/hldmsserver/_default.cfg @@ -93,10 +93,10 @@ sleeptime="0.5" ## 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" +# SteamCMD Branch | https://docs.linuxgsm.com/steamcmd/branch branch="" +# Master Server | https://docs.linuxgsm.com/steamcmd/steam-master-server +steammaster="true" ## LinuxGSM Server Details # Do not edit diff --git a/lgsm/config-default/config-lgsm/hwserver/_default.cfg b/lgsm/config-default/config-lgsm/hwserver/_default.cfg index 5014c1608..7006a0bbb 100644 --- a/lgsm/config-default/config-lgsm/hwserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/hwserver/_default.cfg @@ -104,10 +104,10 @@ sleeptime="0.5" ## 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" +# SteamCMD Branch | https://docs.linuxgsm.com/steamcmd/branch branch="" +# Master Server | https://docs.linuxgsm.com/steamcmd/steam-master-server +steammaster="false" ## LinuxGSM Server Details # Do not edit diff --git a/lgsm/config-default/config-lgsm/insserver/_default.cfg b/lgsm/config-default/config-lgsm/insserver/_default.cfg index 78fcc3142..317444a82 100644 --- a/lgsm/config-default/config-lgsm/insserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/insserver/_default.cfg @@ -100,10 +100,10 @@ sleeptime="0.5" ## 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" +# SteamCMD Branch | https://docs.linuxgsm.com/steamcmd/branch branch="" +# Master Server | https://docs.linuxgsm.com/steamcmd/steam-master-server +steammaster="false" ## LinuxGSM Server Details # Do not edit diff --git a/lgsm/config-default/config-lgsm/inssserver/_default.cfg b/lgsm/config-default/config-lgsm/inssserver/_default.cfg index debd0a48b..1ff1665f5 100644 --- a/lgsm/config-default/config-lgsm/inssserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/inssserver/_default.cfg @@ -101,10 +101,10 @@ sleeptime="0.5" ## SteamCMD Settings # Server appid appid="581330" -# Steam App Branch Select -# Allows to opt into the various Steam app branches. Default branch is "". -# Example: "-beta latest_experimental" +# SteamCMD Branch | https://docs.linuxgsm.com/steamcmd/branch branch="" +# Master Server | https://docs.linuxgsm.com/steamcmd/steam-master-server +steammaster="false" ## LinuxGSM Server Details # Do not edit diff --git a/lgsm/config-default/config-lgsm/iosserver/_default.cfg b/lgsm/config-default/config-lgsm/iosserver/_default.cfg index 4ba8da210..72021c0cf 100644 --- a/lgsm/config-default/config-lgsm/iosserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/iosserver/_default.cfg @@ -93,10 +93,10 @@ sleeptime="0.5" ## SteamCMD Settings # Server appid appid="673990" -# Steam App Branch Select -# Allows to opt into the various Steam app branches. Default branch is "". -# Example: "-beta latest_experimental" +# SteamCMD Branch | https://docs.linuxgsm.com/steamcmd/branch branch="" +# Master Server | https://docs.linuxgsm.com/steamcmd/steam-master-server +steammaster="false" ## LinuxGSM Server Details # Do not edit diff --git a/lgsm/config-default/config-lgsm/jc2server/_default.cfg b/lgsm/config-default/config-lgsm/jc2server/_default.cfg index 514430d91..44ce7a033 100644 --- a/lgsm/config-default/config-lgsm/jc2server/_default.cfg +++ b/lgsm/config-default/config-lgsm/jc2server/_default.cfg @@ -85,10 +85,10 @@ sleeptime="0.5" ## 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" +# SteamCMD Branch | https://docs.linuxgsm.com/steamcmd/branch branch="" +# Master Server | https://docs.linuxgsm.com/steamcmd/steam-master-server +steammaster="true" ## LinuxGSM Server Details # Do not edit diff --git a/lgsm/config-default/config-lgsm/jc3server/_default.cfg b/lgsm/config-default/config-lgsm/jc3server/_default.cfg index 5f82ae5b5..5bfeb4b53 100644 --- a/lgsm/config-default/config-lgsm/jc3server/_default.cfg +++ b/lgsm/config-default/config-lgsm/jc3server/_default.cfg @@ -85,10 +85,10 @@ sleeptime="0.5" ## SteamCMD Settings # Server appid appid="619960" -# Steam App Branch Select -# Allows to opt into the various Steam app branches. Default branch is "". -# Example: "-beta latest_experimental" +# SteamCMD Branch | https://docs.linuxgsm.com/steamcmd/branch branch="" +# Master Server | https://docs.linuxgsm.com/steamcmd/steam-master-server +steammaster="false" ## LinuxGSM Server Details # Do not edit diff --git a/lgsm/config-default/config-lgsm/kf2server/_default.cfg b/lgsm/config-default/config-lgsm/kf2server/_default.cfg index bef2d527f..e84287456 100644 --- a/lgsm/config-default/config-lgsm/kf2server/_default.cfg +++ b/lgsm/config-default/config-lgsm/kf2server/_default.cfg @@ -91,10 +91,10 @@ sleeptime="0.5" ## SteamCMD Settings # Server appid appid="232130" -# Steam App Branch Select -# Allows to opt into the various Steam app branches. Default branch is "". -# Example: "-beta latest_experimental" +# SteamCMD Branch | https://docs.linuxgsm.com/steamcmd/branch branch="" +# Master Server | https://docs.linuxgsm.com/steamcmd/steam-master-server +steammaster="false" ## LinuxGSM Server Details # Do not edit diff --git a/lgsm/config-default/config-lgsm/kfserver/_default.cfg b/lgsm/config-default/config-lgsm/kfserver/_default.cfg index 9ba4af439..3bd2b572a 100644 --- a/lgsm/config-default/config-lgsm/kfserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/kfserver/_default.cfg @@ -97,10 +97,10 @@ sleeptime="0.5" ## 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" +# SteamCMD Branch | https://docs.linuxgsm.com/steamcmd/branch branch="" +# Master Server | https://docs.linuxgsm.com/steamcmd/steam-master-server +steammaster="false" ## LinuxGSM Server Details # Do not edit diff --git a/lgsm/config-default/config-lgsm/l4d2server/_default.cfg b/lgsm/config-default/config-lgsm/l4d2server/_default.cfg index 26f0211fb..0d9352588 100644 --- a/lgsm/config-default/config-lgsm/l4d2server/_default.cfg +++ b/lgsm/config-default/config-lgsm/l4d2server/_default.cfg @@ -92,10 +92,10 @@ sleeptime="0.5" ## 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" +# SteamCMD Branch | https://docs.linuxgsm.com/steamcmd/branch branch="" +# Master Server | https://docs.linuxgsm.com/steamcmd/steam-master-server +steammaster="false" ## LinuxGSM Server Details # Do not edit diff --git a/lgsm/config-default/config-lgsm/l4dserver/_default.cfg b/lgsm/config-default/config-lgsm/l4dserver/_default.cfg index 8fc41d29b..558291eec 100644 --- a/lgsm/config-default/config-lgsm/l4dserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/l4dserver/_default.cfg @@ -92,10 +92,10 @@ sleeptime="0.5" ## 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" +# SteamCMD Branch | https://docs.linuxgsm.com/steamcmd/branch branch="" +# Master Server | https://docs.linuxgsm.com/steamcmd/steam-master-server +steammaster="false" ## LinuxGSM Server Details # Do not edit diff --git a/lgsm/config-default/config-lgsm/mhserver/_default.cfg b/lgsm/config-default/config-lgsm/mhserver/_default.cfg index f3b0c6b61..7e35f9c62 100644 --- a/lgsm/config-default/config-lgsm/mhserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/mhserver/_default.cfg @@ -93,10 +93,10 @@ sleeptime="0.5" ## SteamCMD Settings # Server appid appid="629800" -# Steam App Branch Select -# Allows to opt into the various Steam app branches. Default branch is "". -# Example: "-beta latest_experimental" +# SteamCMD Branch | https://docs.linuxgsm.com/steamcmd/branch branch="" +# Master Server | https://docs.linuxgsm.com/steamcmd/steam-master-server +steammaster="false" ## LinuxGSM Server Details # Do not edit diff --git a/lgsm/config-default/config-lgsm/ndserver/_default.cfg b/lgsm/config-default/config-lgsm/ndserver/_default.cfg index 9bbab8d20..5a96d0cdc 100644 --- a/lgsm/config-default/config-lgsm/ndserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/ndserver/_default.cfg @@ -93,10 +93,10 @@ sleeptime="0.5" ## SteamCMD Settings # Server appid appid="111710" -# Steam App Branch Select -# Allows to opt into the various Steam app branches. Default branch is "". -# Example: "-beta latest_experimental" +# SteamCMD Branch | https://docs.linuxgsm.com/steamcmd/branch branch="" +# Master Server | https://docs.linuxgsm.com/steamcmd/steam-master-server +steammaster="true" ## LinuxGSM Server Details # Do not edit diff --git a/lgsm/config-default/config-lgsm/nmrihserver/_default.cfg b/lgsm/config-default/config-lgsm/nmrihserver/_default.cfg index fe6005c22..4f5e37129 100644 --- a/lgsm/config-default/config-lgsm/nmrihserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/nmrihserver/_default.cfg @@ -98,10 +98,10 @@ sleeptime="0.5" ## 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" +# SteamCMD Branch | https://docs.linuxgsm.com/steamcmd/branch branch="" +# Master Server | https://docs.linuxgsm.com/steamcmd/steam-master-server +steammaster="true" ## LinuxGSM Server Details # Do not edit diff --git a/lgsm/config-default/config-lgsm/ns2cserver/_default.cfg b/lgsm/config-default/config-lgsm/ns2cserver/_default.cfg index f9dfaf640..ba78da4b6 100644 --- a/lgsm/config-default/config-lgsm/ns2cserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/ns2cserver/_default.cfg @@ -100,10 +100,10 @@ sleeptime="0.5" ## 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" +# SteamCMD Branch | https://docs.linuxgsm.com/steamcmd/branch branch="" +# Master Server | https://docs.linuxgsm.com/steamcmd/steam-master-server +steammaster="true" ## LinuxGSM Server Details # Do not edit diff --git a/lgsm/config-default/config-lgsm/ns2server/_default.cfg b/lgsm/config-default/config-lgsm/ns2server/_default.cfg index 9916e4fc6..9e5e7044f 100644 --- a/lgsm/config-default/config-lgsm/ns2server/_default.cfg +++ b/lgsm/config-default/config-lgsm/ns2server/_default.cfg @@ -104,10 +104,10 @@ sleeptime="0.5" ## 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" +# SteamCMD Branch | https://docs.linuxgsm.com/steamcmd/branch branch="" +# Master Server | https://docs.linuxgsm.com/steamcmd/steam-master-server +steammaster="true" ## LinuxGSM Server Details # Do not edit diff --git a/lgsm/config-default/config-lgsm/nsserver/_default.cfg b/lgsm/config-default/config-lgsm/nsserver/_default.cfg index 753bd99d3..16e80a554 100644 --- a/lgsm/config-default/config-lgsm/nsserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/nsserver/_default.cfg @@ -93,10 +93,10 @@ sleeptime="0.5" # 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" +# SteamCMD Branch | https://docs.linuxgsm.com/steamcmd/branch branch="" +# Master Server | https://docs.linuxgsm.com/steamcmd/steam-master-server +steammaster="true" ## LinuxGSM Server Details # Do not edit diff --git a/lgsm/config-default/config-lgsm/opforserver/_default.cfg b/lgsm/config-default/config-lgsm/opforserver/_default.cfg index e2e17db19..d9fc738e2 100644 --- a/lgsm/config-default/config-lgsm/opforserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/opforserver/_default.cfg @@ -93,10 +93,10 @@ sleeptime="0.5" # 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" +# SteamCMD Branch | https://docs.linuxgsm.com/steamcmd/branch branch="" +# Master Server | https://docs.linuxgsm.com/steamcmd/steam-master-server +steammaster="true" ## LinuxGSM Server Details # Do not edit diff --git a/lgsm/config-default/config-lgsm/pcserver/_default.cfg b/lgsm/config-default/config-lgsm/pcserver/_default.cfg index 03eea31ce..d9ed6a032 100644 --- a/lgsm/config-default/config-lgsm/pcserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/pcserver/_default.cfg @@ -85,10 +85,10 @@ sleeptime="0.5" ## 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" +# SteamCMD Branch | https://docs.linuxgsm.com/steamcmd/branch branch="" +# Master Server | https://docs.linuxgsm.com/steamcmd/steam-master-server +steammaster="false" ## LinuxGSM Server Details # Do not edit diff --git a/lgsm/config-default/config-lgsm/pstbsserver/_default.cfg b/lgsm/config-default/config-lgsm/pstbsserver/_default.cfg index 3a0914658..997e57784 100644 --- a/lgsm/config-default/config-lgsm/pstbsserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/pstbsserver/_default.cfg @@ -96,10 +96,10 @@ sleeptime="0.5" ## SteamCMD Settings # Server appid appid="746200" -# Steam App Branch Select -# Allows to opt into the various Steam app branches. Default branch is "". -# Example: "-beta latest_experimental" +# SteamCMD Branch | https://docs.linuxgsm.com/steamcmd/branch branch="" +# Master Server | https://docs.linuxgsm.com/steamcmd/steam-master-server +steammaster="false" ## LinuxGSM Server Details # Do not edit diff --git a/lgsm/config-default/config-lgsm/pvkiiserver/_default.cfg b/lgsm/config-default/config-lgsm/pvkiiserver/_default.cfg index 0acf99a18..f853e8583 100644 --- a/lgsm/config-default/config-lgsm/pvkiiserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/pvkiiserver/_default.cfg @@ -93,10 +93,10 @@ sleeptime="0.5" ## 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" +# SteamCMD Branch | https://docs.linuxgsm.com/steamcmd/branch branch="" +# Master Server | https://docs.linuxgsm.com/steamcmd/steam-master-server +steammaster="true" ## LinuxGSM Server Details # Do not edit diff --git a/lgsm/config-default/config-lgsm/pzserver/_default.cfg b/lgsm/config-default/config-lgsm/pzserver/_default.cfg index ffcce5488..8884ad99c 100644 --- a/lgsm/config-default/config-lgsm/pzserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/pzserver/_default.cfg @@ -88,10 +88,10 @@ sleeptime="0.5" ## 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" +# SteamCMD Branch | https://docs.linuxgsm.com/steamcmd/branch branch="" +# Master Server | https://docs.linuxgsm.com/steamcmd/steam-master-server +steammaster="false" ## LinuxGSM Server Details # Do not edit diff --git a/lgsm/config-default/config-lgsm/qlserver/_default.cfg b/lgsm/config-default/config-lgsm/qlserver/_default.cfg index 31ea6ead8..b062c8860 100644 --- a/lgsm/config-default/config-lgsm/qlserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/qlserver/_default.cfg @@ -87,10 +87,10 @@ sleeptime="0.5" ## 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" +# SteamCMD Branch | https://docs.linuxgsm.com/steamcmd/branch branch="" +# Master Server | https://docs.linuxgsm.com/steamcmd/steam-master-server +steammaster="true" ## LinuxGSM Server Details # Do not edit diff --git a/lgsm/config-default/config-lgsm/ricochetserver/_default.cfg b/lgsm/config-default/config-lgsm/ricochetserver/_default.cfg index 477423b81..44ee520b2 100644 --- a/lgsm/config-default/config-lgsm/ricochetserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/ricochetserver/_default.cfg @@ -93,10 +93,10 @@ sleeptime="0.5" # 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" +# SteamCMD Branch | https://docs.linuxgsm.com/steamcmd/branch branch="" +# Master Server | https://docs.linuxgsm.com/steamcmd/steam-master-server +steammaster="true" ## LinuxGSM Server Details # Do not edit diff --git a/lgsm/config-default/config-lgsm/roserver/_default.cfg b/lgsm/config-default/config-lgsm/roserver/_default.cfg index 89865f281..e4148ec75 100644 --- a/lgsm/config-default/config-lgsm/roserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/roserver/_default.cfg @@ -93,10 +93,10 @@ sleeptime="0.5" ## 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" +# SteamCMD Branch | https://docs.linuxgsm.com/steamcmd/branch branch="" +# Master Server | https://docs.linuxgsm.com/steamcmd/steam-master-server +steammaster="false" ## LinuxGSM Server Details # Do not edit diff --git a/lgsm/config-default/config-lgsm/rustserver/_default.cfg b/lgsm/config-default/config-lgsm/rustserver/_default.cfg index 1759a1c90..4e7064ccf 100644 --- a/lgsm/config-default/config-lgsm/rustserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/rustserver/_default.cfg @@ -117,10 +117,10 @@ sleeptime="0.5" ## 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" +# SteamCMD Branch | https://docs.linuxgsm.com/steamcmd/branch branch="" +# Master Server | https://docs.linuxgsm.com/steamcmd/steam-master-server +steammaster="false" ## LinuxGSM Server Details # Do not edit diff --git a/lgsm/config-default/config-lgsm/rwserver/_default.cfg b/lgsm/config-default/config-lgsm/rwserver/_default.cfg index eea0b712c..0f8c9645b 100644 --- a/lgsm/config-default/config-lgsm/rwserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/rwserver/_default.cfg @@ -88,10 +88,10 @@ sleeptime="0.5" ## SteamCMD Settings # Server appid appid="339010" -# Steam App Branch Select -# Allows to opt into the various Steam app branches. Default branch is "". -# Example: "-beta latest_experimental" +# SteamCMD Branch | https://docs.linuxgsm.com/steamcmd/branch branch="" +# Master Server | https://docs.linuxgsm.com/steamcmd/steam-master-server +steammaster="false" ## LinuxGSM Server Details # Do not edit diff --git a/lgsm/config-default/config-lgsm/sbotsserver/_default.cfg b/lgsm/config-default/config-lgsm/sbotsserver/_default.cfg index 38a04f459..9e32e5d43 100644 --- a/lgsm/config-default/config-lgsm/sbotsserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/sbotsserver/_default.cfg @@ -90,10 +90,10 @@ sleeptime="0.5" ## SteamCMD Settings # Server appid appid="974130" -# Steam App Branch Select -# Allows to opt into the various Steam app branches. Default branch is "". -# Example: "-beta latest_experimental" +# SteamCMD Branch | https://docs.linuxgsm.com/steamcmd/branch branch="" +# Master Server | https://docs.linuxgsm.com/steamcmd/steam-master-server +steammaster="false" ## LinuxGSM Server Details # Do not edit diff --git a/lgsm/config-default/config-lgsm/sbserver/_default.cfg b/lgsm/config-default/config-lgsm/sbserver/_default.cfg index 8b0df872a..7de6bd3b5 100644 --- a/lgsm/config-default/config-lgsm/sbserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/sbserver/_default.cfg @@ -92,10 +92,9 @@ sleeptime="0.5" ## 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" +# SteamCMD Branch | https://docs.linuxgsm.com/steamcmd/branch branch="" +steammaster="flase" ## LinuxGSM Server Details # Do not edit diff --git a/lgsm/config-default/config-lgsm/sdtdserver/_default.cfg b/lgsm/config-default/config-lgsm/sdtdserver/_default.cfg index d56f05a5a..38cffed24 100644 --- a/lgsm/config-default/config-lgsm/sdtdserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/sdtdserver/_default.cfg @@ -88,10 +88,10 @@ sleeptime="0.5" ## 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" +# SteamCMD Branch | https://docs.linuxgsm.com/steamcmd/branch branch="" +# Master Server | https://docs.linuxgsm.com/steamcmd/steam-master-server +steammaster="true" ## LinuxGSM Server Details # Do not edit diff --git a/lgsm/config-default/config-lgsm/squadserver/_default.cfg b/lgsm/config-default/config-lgsm/squadserver/_default.cfg index 075f3d940..5254148cd 100644 --- a/lgsm/config-default/config-lgsm/squadserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/squadserver/_default.cfg @@ -90,10 +90,10 @@ sleeptime="0.5" ## 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" +# SteamCMD Branch | https://docs.linuxgsm.com/steamcmd/branch branch="" +# Master Server | https://docs.linuxgsm.com/steamcmd/steam-master-server +steammaster="false" ## LinuxGSM Server Details # Do not edit diff --git a/lgsm/config-default/config-lgsm/ss3server/_default.cfg b/lgsm/config-default/config-lgsm/ss3server/_default.cfg index 54f2dc817..af9df3a5a 100644 --- a/lgsm/config-default/config-lgsm/ss3server/_default.cfg +++ b/lgsm/config-default/config-lgsm/ss3server/_default.cfg @@ -89,10 +89,10 @@ sleeptime="0.5" ## 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" +# SteamCMD Branch | https://docs.linuxgsm.com/steamcmd/branch branch="" +# Master Server | https://docs.linuxgsm.com/steamcmd/steam-master-server +steammaster="false" ## LinuxGSM Server Details # Do not edit diff --git a/lgsm/config-default/config-lgsm/stserver/_default.cfg b/lgsm/config-default/config-lgsm/stserver/_default.cfg index 856a2b639..a92271abd 100644 --- a/lgsm/config-default/config-lgsm/stserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/stserver/_default.cfg @@ -95,10 +95,10 @@ sleeptime="0.5" ## SteamCMD Settings # Server appid appid="600760" -# Steam App Branch Select -# Allows to opt into the various Steam app branches. Default branch is "". -# Example: "-beta latest_experimental" +# SteamCMD Branch | https://docs.linuxgsm.com/steamcmd/branch branch="" +# Master Server | https://docs.linuxgsm.com/steamcmd/steam-master-server +steammaster="false" ## LinuxGSM Server Details # Do not edit diff --git a/lgsm/config-default/config-lgsm/svenserver/_default.cfg b/lgsm/config-default/config-lgsm/svenserver/_default.cfg index f938b7773..066b35e5c 100644 --- a/lgsm/config-default/config-lgsm/svenserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/svenserver/_default.cfg @@ -92,10 +92,10 @@ sleeptime="0.5" ## 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" +# SteamCMD Branch | https://docs.linuxgsm.com/steamcmd/branch branch="" +# Master Server | https://docs.linuxgsm.com/steamcmd/steam-master-server +steammaster="true" ## LinuxGSM Server Details # Do not edit diff --git a/lgsm/config-default/config-lgsm/terrariaserver/_default.cfg b/lgsm/config-default/config-lgsm/terrariaserver/_default.cfg index 3d260389f..0f59b17c4 100644 --- a/lgsm/config-default/config-lgsm/terrariaserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/terrariaserver/_default.cfg @@ -92,10 +92,10 @@ sleeptime="0.5" ## 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" +# SteamCMD Branch | https://docs.linuxgsm.com/steamcmd/branch branch="" +# Master Server | https://docs.linuxgsm.com/steamcmd/steam-master-server +steammaster="false" ## LinuxGSM Server Details # Do not edit diff --git a/lgsm/config-default/config-lgsm/tf2server/_default.cfg b/lgsm/config-default/config-lgsm/tf2server/_default.cfg index d9ab34b4a..fc2675a42 100644 --- a/lgsm/config-default/config-lgsm/tf2server/_default.cfg +++ b/lgsm/config-default/config-lgsm/tf2server/_default.cfg @@ -98,10 +98,10 @@ sleeptime="0.5" ## 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" +# SteamCMD Branch | https://docs.linuxgsm.com/steamcmd/branch branch="" +# Master Server | https://docs.linuxgsm.com/steamcmd/steam-master-server +steammaster="true" ## LinuxGSM Server Details # Do not edit diff --git a/lgsm/config-default/config-lgsm/tfcserver/_default.cfg b/lgsm/config-default/config-lgsm/tfcserver/_default.cfg index 297268e83..753dce496 100644 --- a/lgsm/config-default/config-lgsm/tfcserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/tfcserver/_default.cfg @@ -93,10 +93,10 @@ sleeptime="0.5" # 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" +# SteamCMD Branch | https://docs.linuxgsm.com/steamcmd/branch branch="" +# Master Server | https://docs.linuxgsm.com/steamcmd/steam-master-server +steammaster="true" ## LinuxGSM Server Details # Do not edit diff --git a/lgsm/config-default/config-lgsm/tuserver/_default.cfg b/lgsm/config-default/config-lgsm/tuserver/_default.cfg index 42019c23a..b3277fc37 100644 --- a/lgsm/config-default/config-lgsm/tuserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/tuserver/_default.cfg @@ -95,10 +95,10 @@ sleeptime="0.5" ## 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" +# SteamCMD Branch | https://docs.linuxgsm.com/steamcmd/branch branch="" +# Master Server | https://docs.linuxgsm.com/steamcmd/steam-master-server +steammaster="false" ## LinuxGSM Server Details # Do not edit diff --git a/lgsm/config-default/config-lgsm/twserver/_default.cfg b/lgsm/config-default/config-lgsm/twserver/_default.cfg index f9c8ebdda..3dbed4eff 100644 --- a/lgsm/config-default/config-lgsm/twserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/twserver/_default.cfg @@ -92,10 +92,10 @@ sleeptime="0.5" ## 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" +# SteamCMD Branch | https://docs.linuxgsm.com/steamcmd/branch branch="" +# Master Server | https://docs.linuxgsm.com/steamcmd/steam-master-server +steammaster="false" ## LinuxGSM Server Details # Do not edit diff --git a/lgsm/config-default/config-lgsm/untserver/_default.cfg b/lgsm/config-default/config-lgsm/untserver/_default.cfg index aba9cc558..ef582c298 100644 --- a/lgsm/config-default/config-lgsm/untserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/untserver/_default.cfg @@ -99,10 +99,10 @@ sleeptime="0.5" ## SteamCMD Settings # Server appid appid="304930" -# Steam App Branch Select -# Allows to opt into the various Steam app branches. Default branch is "". -# Example: "-beta latest_experimental" +# SteamCMD Branch | https://docs.linuxgsm.com/steamcmd/branch branch="" +# Master Server | https://docs.linuxgsm.com/steamcmd/steam-master-server +steammaster="false" ## LinuxGSM Server Details # Do not edit diff --git a/lgsm/config-default/config-lgsm/vsserver/_default.cfg b/lgsm/config-default/config-lgsm/vsserver/_default.cfg index 1b8323999..1672d0d72 100644 --- a/lgsm/config-default/config-lgsm/vsserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/vsserver/_default.cfg @@ -93,10 +93,10 @@ sleeptime="0.5" # 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" +# SteamCMD Branch | https://docs.linuxgsm.com/steamcmd/branch branch="" +# Master Server | https://docs.linuxgsm.com/steamcmd/steam-master-server +steammaster="true" ## LinuxGSM Server Details # Do not edit diff --git a/lgsm/config-default/config-lgsm/wurmserver/_default.cfg b/lgsm/config-default/config-lgsm/wurmserver/_default.cfg index 769621fd6..862215212 100644 --- a/lgsm/config-default/config-lgsm/wurmserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/wurmserver/_default.cfg @@ -84,10 +84,10 @@ sleeptime="0.5" ## SteamCMD Settings # Server appid appid="402370" -# Steam App Branch Select -# Allows to opt into the various Steam app branches. Default branch is "". -# Example: "-beta latest_experimental" +# SteamCMD Branch | https://docs.linuxgsm.com/steamcmd/branch branch="" +# Master Server | https://docs.linuxgsm.com/steamcmd/steam-master-server +steammaster="false" ## LinuxGSM Server Details # Do not edit diff --git a/lgsm/config-default/config-lgsm/zpsserver/_default.cfg b/lgsm/config-default/config-lgsm/zpsserver/_default.cfg index d412eca0a..3c4e0285a 100644 --- a/lgsm/config-default/config-lgsm/zpsserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/zpsserver/_default.cfg @@ -98,10 +98,10 @@ sleeptime="0.5" ## SteamCMD Settings # Server appid appid="17505" -# Steam App Branch Select -# Allows to opt into the various Steam app branches. Default branch is "". -# Example: "-beta latest_experimental" +# SteamCMD Branch | https://docs.linuxgsm.com/steamcmd/branch branch="" +# Master Server | https://docs.linuxgsm.com/steamcmd/steam-master-server +steammaster="true" ## LinuxGSM Server Details # Do not edit diff --git a/lgsm/functions/command_debug.sh b/lgsm/functions/command_debug.sh index 668c07b2b..014b0aeb5 100644 --- a/lgsm/functions/command_debug.sh +++ b/lgsm/functions/command_debug.sh @@ -61,6 +61,14 @@ if [ -n "${extip}" ]; then echo -e "${blue}Internet IP:\t${default}${extip}:${port}" fi fi +# Listed on Master Server +if [ "${masterserver}" ];then + if [ "${masterserver}" == "true" ];then + echo -e "${blue}Master Server:\t${green}${masterserver}${default}" + else + echo -e "${blue}Master Server:\t${red}${masterserver}${default}" + fi +fi # Server password if [ -n "${serverpassword}" ]; then echo -e "${blue}Server password:\t${default}${serverpassword}" diff --git a/lgsm/functions/info_distro.sh b/lgsm/functions/info_distro.sh index d343459dc..711b14ba5 100644 --- a/lgsm/functions/info_distro.sh +++ b/lgsm/functions/info_distro.sh @@ -223,14 +223,17 @@ if [ -z "${extip}" ]; then fi # Steam Master Server - checks if detected by master server -if [ ! "$(command -v jq 2>/dev/null)" ]; then +if [ "$(command -v jq 2>/dev/null)" ]; then if [ "${ip}" ]&&[ "${port}" ]; then - if [ "${engine}" == "source" ]||[ "${engine}" == "goldsource" ]||[ "${shortname}" == "jc2" ]||[ "${shortname}" == "ql" ]; then - masterserver=$(${curlpath} -s 'https://api.steampowered.com/ISteamApps/GetServersAtAddress/v0001?addr='${ip}':'${port}'&format=json' | jq '.response.servers[]|.addr' | wc -l) - if [ "${steammaster}" == "1" ]; then - masterserver="true" - else + if [ "${steammaster}" == "true" ]; then + masterserver=$(${curlpath} -m 3 -s 'https://api.steampowered.com/ISteamApps/GetServersAtAddress/v0001?addr='${ip}':'${port}'&format=json' | jq '.response.servers[]|.addr' | wc -l) + if [ "${masterserver}" == "0" ]; then + masterserver=$(${curlpath} -m 3 -s 'https://api.steampowered.com/ISteamApps/GetServersAtAddress/v0001?addr='${extip}':'${port}'&format=json' | jq '.response.servers[]|.addr' | wc -l) + fi + if [ "${masterserver}" == "0" ]; then masterserver="false" + else + masterserver="true" fi fi fi From cf10b5c797a7b7b4d2aea11770dbd4515e15b649 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Tue, 11 Jun 2019 22:11:38 +0100 Subject: [PATCH 103/534] fix(core): prevent invalid time interval error --- lgsm/functions/core_messages.sh | 3 +++ 1 file changed, 3 insertions(+) diff --git a/lgsm/functions/core_messages.sh b/lgsm/functions/core_messages.sh index e28e65765..c0fe5b634 100644 --- a/lgsm/functions/core_messages.sh +++ b/lgsm/functions/core_messages.sh @@ -30,6 +30,9 @@ fn_ansi_loader(){ fn_sleep_time(){ if [ "${sleeptime}" != "0" ]||[ "${travistest}" != "1" ]; then + if [ -z "${sleeptime}" ]; then + sleeptime=0.5 + fi sleep "${sleeptime}" fi } From 5901f19d07332ac2ce99cc014673a9cc8ed7b7d5 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Tue, 11 Jun 2019 22:35:46 +0100 Subject: [PATCH 104/534] feat(alerts): add displayip variable (#2310) --- lgsm/config-default/config-lgsm/arkserver/_default.cfg | 3 +++ lgsm/config-default/config-lgsm/arma3server/_default.cfg | 3 +++ lgsm/config-default/config-lgsm/bb2server/_default.cfg | 3 +++ lgsm/config-default/config-lgsm/bbserver/_default.cfg | 3 +++ lgsm/config-default/config-lgsm/bdserver/_default.cfg | 3 +++ .../config-default/config-lgsm/bf1942server/_default.cfg | 3 +++ lgsm/config-default/config-lgsm/bmdmserver/_default.cfg | 3 +++ lgsm/config-default/config-lgsm/boserver/_default.cfg | 3 +++ lgsm/config-default/config-lgsm/bsserver/_default.cfg | 3 +++ .../config-default/config-lgsm/bt1944server/_default.cfg | 3 +++ lgsm/config-default/config-lgsm/ccserver/_default.cfg | 3 +++ lgsm/config-default/config-lgsm/cod2server/_default.cfg | 3 +++ lgsm/config-default/config-lgsm/cod4server/_default.cfg | 3 +++ lgsm/config-default/config-lgsm/codserver/_default.cfg | 3 +++ lgsm/config-default/config-lgsm/coduoserver/_default.cfg | 3 +++ .../config-default/config-lgsm/codwawserver/_default.cfg | 3 +++ lgsm/config-default/config-lgsm/csczserver/_default.cfg | 3 +++ lgsm/config-default/config-lgsm/csgoserver/_default.cfg | 3 +++ lgsm/config-default/config-lgsm/csserver/_default.cfg | 3 +++ lgsm/config-default/config-lgsm/cssserver/_default.cfg | 3 +++ lgsm/config-default/config-lgsm/dabserver/_default.cfg | 3 +++ lgsm/config-default/config-lgsm/dmcserver/_default.cfg | 3 +++ lgsm/config-default/config-lgsm/dodserver/_default.cfg | 3 +++ lgsm/config-default/config-lgsm/dodsserver/_default.cfg | 3 +++ lgsm/config-default/config-lgsm/doiserver/_default.cfg | 3 +++ lgsm/config-default/config-lgsm/dstserver/_default.cfg | 3 +++ lgsm/config-default/config-lgsm/dysserver/_default.cfg | 3 +++ lgsm/config-default/config-lgsm/ecoserver/_default.cfg | 3 +++ lgsm/config-default/config-lgsm/emserver/_default.cfg | 3 +++ lgsm/config-default/config-lgsm/etlserver/_default.cfg | 3 +++ lgsm/config-default/config-lgsm/fctrserver/_default.cfg | 3 +++ lgsm/config-default/config-lgsm/fofserver/_default.cfg | 3 +++ lgsm/config-default/config-lgsm/gesserver/_default.cfg | 3 +++ lgsm/config-default/config-lgsm/gmodserver/_default.cfg | 3 +++ lgsm/config-default/config-lgsm/hl2dmserver/_default.cfg | 3 +++ lgsm/config-default/config-lgsm/hldmserver/_default.cfg | 3 +++ lgsm/config-default/config-lgsm/hldmsserver/_default.cfg | 3 +++ lgsm/config-default/config-lgsm/hwserver/_default.cfg | 3 +++ lgsm/config-default/config-lgsm/insserver/_default.cfg | 3 +++ lgsm/config-default/config-lgsm/inssserver/_default.cfg | 3 +++ lgsm/config-default/config-lgsm/iosserver/_default.cfg | 3 +++ lgsm/config-default/config-lgsm/jc2server/_default.cfg | 3 +++ lgsm/config-default/config-lgsm/jc3server/_default.cfg | 3 +++ lgsm/config-default/config-lgsm/kf2server/_default.cfg | 3 +++ lgsm/config-default/config-lgsm/kfserver/_default.cfg | 3 +++ lgsm/config-default/config-lgsm/l4d2server/_default.cfg | 3 +++ lgsm/config-default/config-lgsm/l4dserver/_default.cfg | 3 +++ lgsm/config-default/config-lgsm/mcserver/_default.cfg | 3 +++ lgsm/config-default/config-lgsm/mtaserver/_default.cfg | 3 +++ .../config-default/config-lgsm/mumbleserver/_default.cfg | 3 +++ lgsm/config-default/config-lgsm/ndserver/_default.cfg | 3 +++ lgsm/config-default/config-lgsm/nmrihserver/_default.cfg | 3 +++ lgsm/config-default/config-lgsm/ns2cserver/_default.cfg | 3 +++ lgsm/config-default/config-lgsm/ns2server/_default.cfg | 3 +++ lgsm/config-default/config-lgsm/nsserver/_default.cfg | 3 +++ lgsm/config-default/config-lgsm/opforserver/_default.cfg | 3 +++ lgsm/config-default/config-lgsm/pcserver/_default.cfg | 3 +++ lgsm/config-default/config-lgsm/pstbsserver/_default.cfg | 3 +++ lgsm/config-default/config-lgsm/pvkiiserver/_default.cfg | 3 +++ lgsm/config-default/config-lgsm/pzserver/_default.cfg | 3 +++ lgsm/config-default/config-lgsm/q2server/_default.cfg | 3 +++ lgsm/config-default/config-lgsm/q3server/_default.cfg | 3 +++ lgsm/config-default/config-lgsm/qlserver/_default.cfg | 3 +++ lgsm/config-default/config-lgsm/qwserver/_default.cfg | 3 +++ .../config-lgsm/ricochetserver/_default.cfg | 3 +++ lgsm/config-default/config-lgsm/roserver/_default.cfg | 3 +++ lgsm/config-default/config-lgsm/rtcwserver/_default.cfg | 3 +++ lgsm/config-default/config-lgsm/rustserver/_default.cfg | 3 +++ lgsm/config-default/config-lgsm/rwserver/_default.cfg | 3 +++ lgsm/config-default/config-lgsm/sampserver/_default.cfg | 3 +++ lgsm/config-default/config-lgsm/sbotsserver/_default.cfg | 3 +++ lgsm/config-default/config-lgsm/sbserver/_default.cfg | 3 +++ lgsm/config-default/config-lgsm/sdtdserver/_default.cfg | 3 +++ lgsm/config-default/config-lgsm/sof2server/_default.cfg | 3 +++ lgsm/config-default/config-lgsm/squadserver/_default.cfg | 3 +++ lgsm/config-default/config-lgsm/ss3server/_default.cfg | 3 +++ lgsm/config-default/config-lgsm/stserver/_default.cfg | 3 +++ lgsm/config-default/config-lgsm/svenserver/_default.cfg | 3 +++ .../config-lgsm/terrariaserver/_default.cfg | 3 +++ lgsm/config-default/config-lgsm/tf2server/_default.cfg | 3 +++ lgsm/config-default/config-lgsm/tfcserver/_default.cfg | 3 +++ lgsm/config-default/config-lgsm/ts3server/_default.cfg | 3 +++ lgsm/config-default/config-lgsm/tuserver/_default.cfg | 3 +++ lgsm/config-default/config-lgsm/twserver/_default.cfg | 3 +++ lgsm/config-default/config-lgsm/ut2k4server/_default.cfg | 3 +++ lgsm/config-default/config-lgsm/ut3server/_default.cfg | 3 +++ lgsm/config-default/config-lgsm/ut99server/_default.cfg | 3 +++ lgsm/config-default/config-lgsm/utserver/_default.cfg | 3 +++ lgsm/config-default/config-lgsm/vsserver/_default.cfg | 3 +++ lgsm/config-default/config-lgsm/wetserver/_default.cfg | 3 +++ lgsm/config-default/config-lgsm/wurmserver/_default.cfg | 3 +++ lgsm/config-default/config-lgsm/zpsserver/_default.cfg | 3 +++ lgsm/functions/alert_discord.sh | 2 +- lgsm/functions/alert_ifttt.sh | 2 +- lgsm/functions/alert_pushbullet.sh | 2 +- lgsm/functions/alert_pushover.sh | 2 +- lgsm/functions/alert_telegram.sh | 2 +- lgsm/functions/info_distro.sh | 9 +++++++++ lgsm/functions/info_messages.sh | 7 ++++++- 99 files changed, 296 insertions(+), 6 deletions(-) diff --git a/lgsm/config-default/config-lgsm/arkserver/_default.cfg b/lgsm/config-default/config-lgsm/arkserver/_default.cfg index afe5d8aea..a1fec34a6 100644 --- a/lgsm/config-default/config-lgsm/arkserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/arkserver/_default.cfg @@ -27,6 +27,9 @@ parms="\"${defaultmap}?AltSaveDirectoryName=${defaultmap}?listen?MultiHome=${ip} ## Notification Alerts # (on|off) +# Display IP | https://docs.linuxgsm.com/alerts#display-ip +displayip="" + # More info | https://docs.linuxgsm.com/alerts#more-info postalert="off" postdays="7" diff --git a/lgsm/config-default/config-lgsm/arma3server/_default.cfg b/lgsm/config-default/config-lgsm/arma3server/_default.cfg index 6f1d61596..4f323f7e4 100644 --- a/lgsm/config-default/config-lgsm/arma3server/_default.cfg +++ b/lgsm/config-default/config-lgsm/arma3server/_default.cfg @@ -41,6 +41,9 @@ parms="-ip=${ip} -port=${port} -cfg=${networkcfgfullpath} -config=${servercfgful ## Notification Alerts # (on|off) +# Display IP | https://docs.linuxgsm.com/alerts#display-ip +displayip="" + # More info | https://docs.linuxgsm.com/alerts#more-info postalert="off" postdays="7" diff --git a/lgsm/config-default/config-lgsm/bb2server/_default.cfg b/lgsm/config-default/config-lgsm/bb2server/_default.cfg index a1df15a8a..48b1f164a 100644 --- a/lgsm/config-default/config-lgsm/bb2server/_default.cfg +++ b/lgsm/config-default/config-lgsm/bb2server/_default.cfg @@ -31,6 +31,9 @@ parms="-game brainbread2 -strictportbind -ip ${ip} -port ${port} +clientport ${c ## Notification Alerts # (on|off) +# Display IP | https://docs.linuxgsm.com/alerts#display-ip +displayip="" + # More info | https://docs.linuxgsm.com/alerts#more-info postalert="off" postdays="7" diff --git a/lgsm/config-default/config-lgsm/bbserver/_default.cfg b/lgsm/config-default/config-lgsm/bbserver/_default.cfg index 95ea35acd..1910706f2 100644 --- a/lgsm/config-default/config-lgsm/bbserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/bbserver/_default.cfg @@ -25,6 +25,9 @@ parms="-game brainbread -strictportbind +ip ${ip} -port ${port} +clientport ${cl ## Notification Alerts # (on|off) +# Display IP | https://docs.linuxgsm.com/alerts#display-ip +displayip="" + # More info | https://docs.linuxgsm.com/alerts#more-info postalert="off" postdays="7" diff --git a/lgsm/config-default/config-lgsm/bdserver/_default.cfg b/lgsm/config-default/config-lgsm/bdserver/_default.cfg index cfb29f608..99f546ab6 100644 --- a/lgsm/config-default/config-lgsm/bdserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/bdserver/_default.cfg @@ -25,6 +25,9 @@ parms="-game bdef -strictportbind +ip ${ip} -port ${port} +clientport ${clientpo ## Notification Alerts # (on|off) +# Display IP | https://docs.linuxgsm.com/alerts#display-ip +displayip="" + # More info | https://docs.linuxgsm.com/alerts#more-info postalert="off" postdays="7" diff --git a/lgsm/config-default/config-lgsm/bf1942server/_default.cfg b/lgsm/config-default/config-lgsm/bf1942server/_default.cfg index a047bbfb7..23c61227f 100644 --- a/lgsm/config-default/config-lgsm/bf1942server/_default.cfg +++ b/lgsm/config-default/config-lgsm/bf1942server/_default.cfg @@ -18,6 +18,9 @@ parms="+hostServer 1 +dedicated 1" ## Notification Alerts # (on|off) +# Display IP | https://docs.linuxgsm.com/alerts#display-ip +displayip="" + # More info | https://docs.linuxgsm.com/alerts#more-info postalert="off" postdays="7" diff --git a/lgsm/config-default/config-lgsm/bmdmserver/_default.cfg b/lgsm/config-default/config-lgsm/bmdmserver/_default.cfg index 9f60b4235..1c29b6aa5 100644 --- a/lgsm/config-default/config-lgsm/bmdmserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/bmdmserver/_default.cfg @@ -31,6 +31,9 @@ parms="-game bms -strictportbind -ip ${ip} -port ${port} +clientport ${clientpor ## Notification Alerts # (on|off) +# Display IP | https://docs.linuxgsm.com/alerts#display-ip +displayip="" + # More info | https://docs.linuxgsm.com/alerts#more-info postalert="off" postdays="7" diff --git a/lgsm/config-default/config-lgsm/boserver/_default.cfg b/lgsm/config-default/config-lgsm/boserver/_default.cfg index 778733547..ae9a0cee8 100644 --- a/lgsm/config-default/config-lgsm/boserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/boserver/_default.cfg @@ -24,6 +24,9 @@ parms="-batchmode -nographics -dedicated -configfile=${servercfgfullpath}" ## Notification Alerts # (on|off) +# Display IP | https://docs.linuxgsm.com/alerts#display-ip +displayip="" + # More info | https://docs.linuxgsm.com/alerts#more-info postalert="off" postdays="7" diff --git a/lgsm/config-default/config-lgsm/bsserver/_default.cfg b/lgsm/config-default/config-lgsm/bsserver/_default.cfg index 04b20addd..93eb491f3 100644 --- a/lgsm/config-default/config-lgsm/bsserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/bsserver/_default.cfg @@ -35,6 +35,9 @@ parms="-game "${serverfiles}/berimbau" -autoupdate -strictportbind -ip ${ip} -po ## Notification Alerts # (on|off) +# Display IP | https://docs.linuxgsm.com/alerts#display-ip +displayip="" + # More info | https://docs.linuxgsm.com/alerts#more-info postalert="off" postdays="7" diff --git a/lgsm/config-default/config-lgsm/bt1944server/_default.cfg b/lgsm/config-default/config-lgsm/bt1944server/_default.cfg index 81a00f049..b5164fecf 100644 --- a/lgsm/config-default/config-lgsm/bt1944server/_default.cfg +++ b/lgsm/config-default/config-lgsm/bt1944server/_default.cfg @@ -23,6 +23,9 @@ parms="/Game/Maps/Final_Maps/Derailed?Game=/Script/ShooterGame.BombGameMode?list ## Notification Alerts # (on|off) +# Display IP | https://docs.linuxgsm.com/alerts#display-ip +displayip="" + # More info | https://docs.linuxgsm.com/alerts#more-info postalert="off" postdays="7" diff --git a/lgsm/config-default/config-lgsm/ccserver/_default.cfg b/lgsm/config-default/config-lgsm/ccserver/_default.cfg index 3bf39a55d..7d30f03bb 100644 --- a/lgsm/config-default/config-lgsm/ccserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/ccserver/_default.cfg @@ -26,6 +26,9 @@ parms="-game cure -strictportbind -ip ${ip} -port ${port} +clientport ${clientpo ## Notification Alerts # (on|off) +# Display IP | https://docs.linuxgsm.com/alerts#display-ip +displayip="" + # More info | https://docs.linuxgsm.com/alerts#more-info postalert="off" postdays="7" diff --git a/lgsm/config-default/config-lgsm/cod2server/_default.cfg b/lgsm/config-default/config-lgsm/cod2server/_default.cfg index be01e6fb4..1d114e688 100644 --- a/lgsm/config-default/config-lgsm/cod2server/_default.cfg +++ b/lgsm/config-default/config-lgsm/cod2server/_default.cfg @@ -24,6 +24,9 @@ parms="+set sv_punkbuster 0 +set fs_basepath ${serverfiles} +set dedicated 2 +se ## Notification Alerts # (on|off) +# Display IP | https://docs.linuxgsm.com/alerts#display-ip +displayip="" + # More info | https://docs.linuxgsm.com/alerts#more-info postalert="off" postdays="7" diff --git a/lgsm/config-default/config-lgsm/cod4server/_default.cfg b/lgsm/config-default/config-lgsm/cod4server/_default.cfg index 01fe6f560..210450f59 100644 --- a/lgsm/config-default/config-lgsm/cod4server/_default.cfg +++ b/lgsm/config-default/config-lgsm/cod4server/_default.cfg @@ -24,6 +24,9 @@ parms="+set sv_punkbuster 0 +set fs_basepath ${serverfiles} +set fs_homepath ${s ## Notification Alerts # (on|off) +# Display IP | https://docs.linuxgsm.com/alerts#display-ip +displayip="" + # More info | https://docs.linuxgsm.com/alerts#more-info postalert="off" postdays="7" diff --git a/lgsm/config-default/config-lgsm/codserver/_default.cfg b/lgsm/config-default/config-lgsm/codserver/_default.cfg index cd3db5ec5..d548cfb59 100644 --- a/lgsm/config-default/config-lgsm/codserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/codserver/_default.cfg @@ -24,6 +24,9 @@ parms="+set sv_punkbuster 0 +set fs_basepath ${serverfiles} +set dedicated 2 +se ## Notification Alerts # (on|off) +# Display IP | https://docs.linuxgsm.com/alerts#display-ip +displayip="" + # More info | https://docs.linuxgsm.com/alerts#more-info postalert="off" postdays="7" diff --git a/lgsm/config-default/config-lgsm/coduoserver/_default.cfg b/lgsm/config-default/config-lgsm/coduoserver/_default.cfg index 36b08300e..355f9f339 100644 --- a/lgsm/config-default/config-lgsm/coduoserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/coduoserver/_default.cfg @@ -24,6 +24,9 @@ parms="+set sv_punkbuster 0 +set fs_basepath ${serverfiles} +set dedicated 2 +se ## Notification Alerts # (on|off) +# Display IP | https://docs.linuxgsm.com/alerts#display-ip +displayip="" + # More info | https://docs.linuxgsm.com/alerts#more-info postalert="off" postdays="7" diff --git a/lgsm/config-default/config-lgsm/codwawserver/_default.cfg b/lgsm/config-default/config-lgsm/codwawserver/_default.cfg index 86f667ffd..3f0b882bc 100644 --- a/lgsm/config-default/config-lgsm/codwawserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/codwawserver/_default.cfg @@ -24,6 +24,9 @@ parms="+set sv_punkbuster 0 +set fs_basepath ${serverfiles} +set dedicated 2 +se ## Notification Alerts # (on|off) +# Display IP | https://docs.linuxgsm.com/alerts#display-ip +displayip="" + # More info | https://docs.linuxgsm.com/alerts#more-info postalert="off" postdays="7" diff --git a/lgsm/config-default/config-lgsm/csczserver/_default.cfg b/lgsm/config-default/config-lgsm/csczserver/_default.cfg index bb1ce28d6..b3620a68c 100644 --- a/lgsm/config-default/config-lgsm/csczserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/csczserver/_default.cfg @@ -25,6 +25,9 @@ parms="-game czero -strictportbind +ip ${ip} -port ${port} +clientport ${clientp ## Notification Alerts # (on|off) +# Display IP | https://docs.linuxgsm.com/alerts#display-ip +displayip="" + # More info | https://docs.linuxgsm.com/alerts#more-info postalert="off" postdays="7" diff --git a/lgsm/config-default/config-lgsm/csgoserver/_default.cfg b/lgsm/config-default/config-lgsm/csgoserver/_default.cfg index 5ff46fcf4..fa9a79e9d 100644 --- a/lgsm/config-default/config-lgsm/csgoserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/csgoserver/_default.cfg @@ -51,6 +51,9 @@ parms="-game csgo -usercon -strictportbind -ip ${ip} -port ${port} +clientport $ ## Notification Alerts # (on|off) +# Display IP | https://docs.linuxgsm.com/alerts#display-ip +displayip="" + # More info | https://docs.linuxgsm.com/alerts#more-info postalert="off" postdays="7" diff --git a/lgsm/config-default/config-lgsm/csserver/_default.cfg b/lgsm/config-default/config-lgsm/csserver/_default.cfg index 471d76fb7..e088813a3 100644 --- a/lgsm/config-default/config-lgsm/csserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/csserver/_default.cfg @@ -25,6 +25,9 @@ parms="-game cstrike -strictportbind +ip ${ip} -port ${port} +clientport ${clien ## Notification Alerts # (on|off) +# Display IP | https://docs.linuxgsm.com/alerts#display-ip +displayip="" + # More info | https://docs.linuxgsm.com/alerts#more-info postalert="off" postdays="7" diff --git a/lgsm/config-default/config-lgsm/cssserver/_default.cfg b/lgsm/config-default/config-lgsm/cssserver/_default.cfg index 72fd8f04d..dccd9afbb 100644 --- a/lgsm/config-default/config-lgsm/cssserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/cssserver/_default.cfg @@ -31,6 +31,9 @@ parms="-game cstrike -strictportbind -ip ${ip} -port ${port} +clientport ${clien ## Notification Alerts # (on|off) +# Display IP | https://docs.linuxgsm.com/alerts#display-ip +displayip="" + # More info | https://docs.linuxgsm.com/alerts#more-info postalert="off" postdays="7" diff --git a/lgsm/config-default/config-lgsm/dabserver/_default.cfg b/lgsm/config-default/config-lgsm/dabserver/_default.cfg index 295387379..dc6ad1bde 100644 --- a/lgsm/config-default/config-lgsm/dabserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/dabserver/_default.cfg @@ -26,6 +26,9 @@ parms="-strictportbind -ip ${ip} -port ${port} +clientport ${clientport} +tv_por ## Notification Alerts # (on|off) +# Display IP | https://docs.linuxgsm.com/alerts#display-ip +displayip="" + # More info | https://docs.linuxgsm.com/alerts#more-info postalert="off" postdays="7" diff --git a/lgsm/config-default/config-lgsm/dmcserver/_default.cfg b/lgsm/config-default/config-lgsm/dmcserver/_default.cfg index 9aae5bfd9..fa68dd498 100644 --- a/lgsm/config-default/config-lgsm/dmcserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/dmcserver/_default.cfg @@ -25,6 +25,9 @@ parms="-game dmc -strictportbind +ip ${ip} -port ${port} +clientport ${clientpor ## Notification Alerts # (on|off) +# Display IP | https://docs.linuxgsm.com/alerts#display-ip +displayip="" + # More info | https://docs.linuxgsm.com/alerts#more-info postalert="off" postdays="7" diff --git a/lgsm/config-default/config-lgsm/dodserver/_default.cfg b/lgsm/config-default/config-lgsm/dodserver/_default.cfg index 7484ba7c9..77c07a7f4 100644 --- a/lgsm/config-default/config-lgsm/dodserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/dodserver/_default.cfg @@ -25,6 +25,9 @@ parms="-game dod -strictportbind +ip ${ip} -port ${port} +clientport ${clientpor ## Notification Alerts # (on|off) +# Display IP | https://docs.linuxgsm.com/alerts#display-ip +displayip="" + # More info | https://docs.linuxgsm.com/alerts#more-info postalert="off" postdays="7" diff --git a/lgsm/config-default/config-lgsm/dodsserver/_default.cfg b/lgsm/config-default/config-lgsm/dodsserver/_default.cfg index 8969011f0..8f01c98ea 100644 --- a/lgsm/config-default/config-lgsm/dodsserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/dodsserver/_default.cfg @@ -26,6 +26,9 @@ parms="-game dod -strictportbind -ip ${ip} -port ${port} +clientport ${clientpor ## Notification Alerts # (on|off) +# Display IP | https://docs.linuxgsm.com/alerts#display-ip +displayip="" + # More info | https://docs.linuxgsm.com/alerts#more-info postalert="off" postdays="7" diff --git a/lgsm/config-default/config-lgsm/doiserver/_default.cfg b/lgsm/config-default/config-lgsm/doiserver/_default.cfg index 672c972cd..da35c0130 100644 --- a/lgsm/config-default/config-lgsm/doiserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/doiserver/_default.cfg @@ -28,6 +28,9 @@ parms="-game doi -strictportbind -ip ${ip} -port ${port} +clientport ${clientpor ## Notification Alerts # (on|off) +# Display IP | https://docs.linuxgsm.com/alerts#display-ip +displayip="" + # More info | https://docs.linuxgsm.com/alerts#more-info postalert="off" postdays="7" diff --git a/lgsm/config-default/config-lgsm/dstserver/_default.cfg b/lgsm/config-default/config-lgsm/dstserver/_default.cfg index ea70e63c5..f4af4602b 100644 --- a/lgsm/config-default/config-lgsm/dstserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/dstserver/_default.cfg @@ -29,6 +29,9 @@ parms="-persistent_storage_root ${persistentstorageroot} -conf_dir ${confdir} -c ## Notification Alerts # (on|off) +# Display IP | https://docs.linuxgsm.com/alerts#display-ip +displayip="" + # More info | https://docs.linuxgsm.com/alerts#more-info postalert="off" postdays="7" diff --git a/lgsm/config-default/config-lgsm/dysserver/_default.cfg b/lgsm/config-default/config-lgsm/dysserver/_default.cfg index 1efdf7655..48f26076f 100644 --- a/lgsm/config-default/config-lgsm/dysserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/dysserver/_default.cfg @@ -31,6 +31,9 @@ parms="-game "${serverfiles}/dystopia" -strictportbind -ip ${ip} -port ${port} + ## Notification Alerts # (on|off) +# Display IP | https://docs.linuxgsm.com/alerts#display-ip +displayip="" + # More info | https://docs.linuxgsm.com/alerts#more-info postalert="off" postdays="7" diff --git a/lgsm/config-default/config-lgsm/ecoserver/_default.cfg b/lgsm/config-default/config-lgsm/ecoserver/_default.cfg index 1996226d8..ed261434f 100644 --- a/lgsm/config-default/config-lgsm/ecoserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/ecoserver/_default.cfg @@ -18,6 +18,9 @@ fn_parms(){ ## Notification Alerts # (on|off) +# Display IP | https://docs.linuxgsm.com/alerts#display-ip +displayip="" + # More info | https://docs.linuxgsm.com/alerts#more-info postalert="off" postdays="7" diff --git a/lgsm/config-default/config-lgsm/emserver/_default.cfg b/lgsm/config-default/config-lgsm/emserver/_default.cfg index 15a44e3e6..500165b64 100644 --- a/lgsm/config-default/config-lgsm/emserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/emserver/_default.cfg @@ -31,6 +31,9 @@ parms="-game empires -strictportbind -ip ${ip} -port ${port} +clientport ${clien ## Notification Alerts # (on|off) +# Display IP | https://docs.linuxgsm.com/alerts#display-ip +displayip="" + # More info | https://docs.linuxgsm.com/alerts#more-info postalert="off" postdays="7" diff --git a/lgsm/config-default/config-lgsm/etlserver/_default.cfg b/lgsm/config-default/config-lgsm/etlserver/_default.cfg index b380c8da2..22cfde4bb 100644 --- a/lgsm/config-default/config-lgsm/etlserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/etlserver/_default.cfg @@ -18,6 +18,9 @@ fn_parms(){ ## Notification Alerts # (on|off) +# Display IP | https://docs.linuxgsm.com/alerts#display-ip +displayip="" + # More info | https://docs.linuxgsm.com/alerts#more-info postalert="off" postdays="7" diff --git a/lgsm/config-default/config-lgsm/fctrserver/_default.cfg b/lgsm/config-default/config-lgsm/fctrserver/_default.cfg index 699a202fd..ed0968baa 100644 --- a/lgsm/config-default/config-lgsm/fctrserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/fctrserver/_default.cfg @@ -26,6 +26,9 @@ parms="--start-server ${serverfiles}/save1.zip --server-settings ${servercfgfull ## Notification Alerts # (on|off) +# Display IP | https://docs.linuxgsm.com/alerts#display-ip +displayip="" + # More info | https://docs.linuxgsm.com/alerts#more-info postalert="off" postdays="7" diff --git a/lgsm/config-default/config-lgsm/fofserver/_default.cfg b/lgsm/config-default/config-lgsm/fofserver/_default.cfg index 4399350ac..4ae3ecb4c 100644 --- a/lgsm/config-default/config-lgsm/fofserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/fofserver/_default.cfg @@ -26,6 +26,9 @@ parms="-game fof -strictportbind -ip ${ip} -port ${port} +clientport ${clientpor ## Notification Alerts # (on|off) +# Display IP | https://docs.linuxgsm.com/alerts#display-ip +displayip="" + # More info | https://docs.linuxgsm.com/alerts#more-info postalert="off" postdays="7" diff --git a/lgsm/config-default/config-lgsm/gesserver/_default.cfg b/lgsm/config-default/config-lgsm/gesserver/_default.cfg index f82d94bd5..3e049dc8b 100644 --- a/lgsm/config-default/config-lgsm/gesserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/gesserver/_default.cfg @@ -26,6 +26,9 @@ parms="-game gesource -strictportbind -ip ${ip} -port ${port} +clientport ${clie ## Notification Alerts # (on|off) +# Display IP | https://docs.linuxgsm.com/alerts#display-ip +displayip="" + # More info | https://docs.linuxgsm.com/alerts#more-info postalert="off" postdays="7" diff --git a/lgsm/config-default/config-lgsm/gmodserver/_default.cfg b/lgsm/config-default/config-lgsm/gmodserver/_default.cfg index 8c6f09565..105694bbb 100644 --- a/lgsm/config-default/config-lgsm/gmodserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/gmodserver/_default.cfg @@ -42,6 +42,9 @@ parms="-game garrysmod -strictportbind -ip ${ip} -port ${port} -tickrate ${tickr ## Notification Alerts # (on|off) +# Display IP | https://docs.linuxgsm.com/alerts#display-ip +displayip="" + # More info | https://docs.linuxgsm.com/alerts#more-info postalert="off" postdays="7" diff --git a/lgsm/config-default/config-lgsm/hl2dmserver/_default.cfg b/lgsm/config-default/config-lgsm/hl2dmserver/_default.cfg index 7c9bb9a43..d6cc0b37d 100644 --- a/lgsm/config-default/config-lgsm/hl2dmserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/hl2dmserver/_default.cfg @@ -26,6 +26,9 @@ parms="-game hl2mp -strictportbind -ip ${ip} -port ${port} +clientport ${clientp ## Notification Alerts # (on|off) +# Display IP | https://docs.linuxgsm.com/alerts#display-ip +displayip="" + # More info | https://docs.linuxgsm.com/alerts#more-info postalert="off" postdays="7" diff --git a/lgsm/config-default/config-lgsm/hldmserver/_default.cfg b/lgsm/config-default/config-lgsm/hldmserver/_default.cfg index 25dcd4736..af8ec0a41 100644 --- a/lgsm/config-default/config-lgsm/hldmserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/hldmserver/_default.cfg @@ -25,6 +25,9 @@ parms="-game valve -strictportbind +ip ${ip} -port ${port} +clientport ${clientp ## Notification Alerts # (on|off) +# Display IP | https://docs.linuxgsm.com/alerts#display-ip +displayip="" + # More info | https://docs.linuxgsm.com/alerts#more-info postalert="off" postdays="7" diff --git a/lgsm/config-default/config-lgsm/hldmsserver/_default.cfg b/lgsm/config-default/config-lgsm/hldmsserver/_default.cfg index 249b702fd..1c8b58bbd 100644 --- a/lgsm/config-default/config-lgsm/hldmsserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/hldmsserver/_default.cfg @@ -26,6 +26,9 @@ parms="-game hl1mp -strictportbind -ip ${ip} -port ${port} +clientport ${clientp ## Notification Alerts # (on|off) +# Display IP | https://docs.linuxgsm.com/alerts#display-ip +displayip="" + # More info | https://docs.linuxgsm.com/alerts#more-info postalert="off" postdays="7" diff --git a/lgsm/config-default/config-lgsm/hwserver/_default.cfg b/lgsm/config-default/config-lgsm/hwserver/_default.cfg index 7006a0bbb..476bb2bd2 100644 --- a/lgsm/config-default/config-lgsm/hwserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/hwserver/_default.cfg @@ -37,6 +37,9 @@ parms="-batchmode -nographics -exec \"host ${port} ${defaultmap} ${loadsave};que ## Notification Alerts # (on|off) +# Display IP | https://docs.linuxgsm.com/alerts#display-ip +displayip="" + # More info | https://docs.linuxgsm.com/alerts#more-info postalert="off" postdays="7" diff --git a/lgsm/config-default/config-lgsm/insserver/_default.cfg b/lgsm/config-default/config-lgsm/insserver/_default.cfg index 317444a82..a0f1471c2 100644 --- a/lgsm/config-default/config-lgsm/insserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/insserver/_default.cfg @@ -33,6 +33,9 @@ parms="-game insurgency -strictportbind -ip ${ip} -port ${port} +clientport ${cl ## Notification Alerts # (on|off) +# Display IP | https://docs.linuxgsm.com/alerts#display-ip +displayip="" + # More info | https://docs.linuxgsm.com/alerts#more-info postalert="off" postdays="7" diff --git a/lgsm/config-default/config-lgsm/inssserver/_default.cfg b/lgsm/config-default/config-lgsm/inssserver/_default.cfg index 1ff1665f5..312f8826d 100644 --- a/lgsm/config-default/config-lgsm/inssserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/inssserver/_default.cfg @@ -34,6 +34,9 @@ fn_parms(){ ## Notification Alerts # (on|off) +# Display IP | https://docs.linuxgsm.com/alerts#display-ip +displayip="" + # More info | https://docs.linuxgsm.com/alerts#more-info postalert="off" postdays="7" diff --git a/lgsm/config-default/config-lgsm/iosserver/_default.cfg b/lgsm/config-default/config-lgsm/iosserver/_default.cfg index 72021c0cf..fccbc13d9 100644 --- a/lgsm/config-default/config-lgsm/iosserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/iosserver/_default.cfg @@ -26,6 +26,9 @@ parms="-game iosoccer -strictportbind -ip ${ip} -port ${port} +clientport ${clie ## Notification Alerts # (on|off) +# Display IP | https://docs.linuxgsm.com/alerts#display-ip +displayip="" + # More info | https://docs.linuxgsm.com/alerts#more-info postalert="off" postdays="7" diff --git a/lgsm/config-default/config-lgsm/jc2server/_default.cfg b/lgsm/config-default/config-lgsm/jc2server/_default.cfg index 44ce7a033..da1d34189 100644 --- a/lgsm/config-default/config-lgsm/jc2server/_default.cfg +++ b/lgsm/config-default/config-lgsm/jc2server/_default.cfg @@ -18,6 +18,9 @@ parms="" ## Notification Alerts # (on|off) +# Display IP | https://docs.linuxgsm.com/alerts#display-ip +displayip="" + # More info | https://docs.linuxgsm.com/alerts#more-info postalert="off" postdays="7" diff --git a/lgsm/config-default/config-lgsm/jc3server/_default.cfg b/lgsm/config-default/config-lgsm/jc3server/_default.cfg index 5bfeb4b53..6992a1029 100644 --- a/lgsm/config-default/config-lgsm/jc3server/_default.cfg +++ b/lgsm/config-default/config-lgsm/jc3server/_default.cfg @@ -18,6 +18,9 @@ parms="" ## Notification Alerts # (on|off) +# Display IP | https://docs.linuxgsm.com/alerts#display-ip +displayip="" + # More info | https://docs.linuxgsm.com/alerts#more-info postalert="off" postdays="7" diff --git a/lgsm/config-default/config-lgsm/kf2server/_default.cfg b/lgsm/config-default/config-lgsm/kf2server/_default.cfg index e84287456..9a8ab3329 100644 --- a/lgsm/config-default/config-lgsm/kf2server/_default.cfg +++ b/lgsm/config-default/config-lgsm/kf2server/_default.cfg @@ -24,6 +24,9 @@ parms="\"${defaultmap}?Game=${gamemode}?ConfigSubDir=${servicename} -QueryPort=$ ## Notification Alerts # (on|off) +# Display IP | https://docs.linuxgsm.com/alerts#display-ip +displayip="" + # More info | https://docs.linuxgsm.com/alerts#more-info postalert="off" postdays="7" diff --git a/lgsm/config-default/config-lgsm/kfserver/_default.cfg b/lgsm/config-default/config-lgsm/kfserver/_default.cfg index 3bd2b572a..1f47ec58a 100644 --- a/lgsm/config-default/config-lgsm/kfserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/kfserver/_default.cfg @@ -30,6 +30,9 @@ parms="server ${defaultmap}?game=KFmod.KFGameType?VACSecured=true -nohomedir ini ## Notification Alerts # (on|off) +# Display IP | https://docs.linuxgsm.com/alerts#display-ip +displayip="" + # More info | https://docs.linuxgsm.com/alerts#more-info postalert="off" postdays="7" diff --git a/lgsm/config-default/config-lgsm/l4d2server/_default.cfg b/lgsm/config-default/config-lgsm/l4d2server/_default.cfg index 0d9352588..b69a3e734 100644 --- a/lgsm/config-default/config-lgsm/l4d2server/_default.cfg +++ b/lgsm/config-default/config-lgsm/l4d2server/_default.cfg @@ -25,6 +25,9 @@ parms="-game left4dead2 -strictportbind -ip ${ip} -port ${port} +clientport ${cl ## Notification Alerts # (on|off) +# Display IP | https://docs.linuxgsm.com/alerts#display-ip +displayip="" + # More info | https://docs.linuxgsm.com/alerts#more-info postalert="off" postdays="7" diff --git a/lgsm/config-default/config-lgsm/l4dserver/_default.cfg b/lgsm/config-default/config-lgsm/l4dserver/_default.cfg index 558291eec..9326ed808 100644 --- a/lgsm/config-default/config-lgsm/l4dserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/l4dserver/_default.cfg @@ -25,6 +25,9 @@ parms="-game left4dead -strictportbind -ip ${ip} -port ${port} +clientport ${cli ## Notification Alerts # (on|off) +# Display IP | https://docs.linuxgsm.com/alerts#display-ip +displayip="" + # More info | https://docs.linuxgsm.com/alerts#more-info postalert="off" postdays="7" diff --git a/lgsm/config-default/config-lgsm/mcserver/_default.cfg b/lgsm/config-default/config-lgsm/mcserver/_default.cfg index 103de1620..6f737fcb2 100644 --- a/lgsm/config-default/config-lgsm/mcserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/mcserver/_default.cfg @@ -20,6 +20,9 @@ parms="nogui" ## Notification Alerts # (on|off) +# Display IP | https://docs.linuxgsm.com/alerts#display-ip +displayip="" + # More info | https://docs.linuxgsm.com/alerts#more-info postalert="off" postdays="7" diff --git a/lgsm/config-default/config-lgsm/mtaserver/_default.cfg b/lgsm/config-default/config-lgsm/mtaserver/_default.cfg index 6af6c2d53..9fc6a08b0 100644 --- a/lgsm/config-default/config-lgsm/mtaserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/mtaserver/_default.cfg @@ -19,6 +19,9 @@ parms="" ## Notification Alerts # (on|off) +# Display IP | https://docs.linuxgsm.com/alerts#display-ip +displayip="" + # More info | https://docs.linuxgsm.com/alerts#more-info postalert="off" postdays="7" diff --git a/lgsm/config-default/config-lgsm/mumbleserver/_default.cfg b/lgsm/config-default/config-lgsm/mumbleserver/_default.cfg index 0dcca762f..2ef9f3ee6 100644 --- a/lgsm/config-default/config-lgsm/mumbleserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/mumbleserver/_default.cfg @@ -19,6 +19,9 @@ parms="-fg -ini ${servercfgfullpath}" ## Notification Alerts # (on|off) +# Display IP | https://docs.linuxgsm.com/alerts#display-ip +displayip="" + # More info | https://docs.linuxgsm.com/alerts#more-info postalert="off" postdays="7" diff --git a/lgsm/config-default/config-lgsm/ndserver/_default.cfg b/lgsm/config-default/config-lgsm/ndserver/_default.cfg index 5a96d0cdc..2c352d49b 100644 --- a/lgsm/config-default/config-lgsm/ndserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/ndserver/_default.cfg @@ -26,6 +26,9 @@ parms="-game nucleardawn -strictportbind -ip ${ip} -port ${port} +clientport ${c ## Notification Alerts # (on|off) +# Display IP | https://docs.linuxgsm.com/alerts#display-ip +displayip="" + # More info | https://docs.linuxgsm.com/alerts#more-info postalert="off" postdays="7" diff --git a/lgsm/config-default/config-lgsm/nmrihserver/_default.cfg b/lgsm/config-default/config-lgsm/nmrihserver/_default.cfg index 4f5e37129..8b3edcc9e 100644 --- a/lgsm/config-default/config-lgsm/nmrihserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/nmrihserver/_default.cfg @@ -31,6 +31,9 @@ parms="-game nmrih -strictportbind -ip ${ip} -port ${port} +clientport ${clientp ## Notification Alerts # (on|off) +# Display IP | https://docs.linuxgsm.com/alerts#display-ip +displayip="" + # More info | https://docs.linuxgsm.com/alerts#more-info postalert="off" postdays="7" diff --git a/lgsm/config-default/config-lgsm/ns2cserver/_default.cfg b/lgsm/config-default/config-lgsm/ns2cserver/_default.cfg index ba78da4b6..23c70c212 100644 --- a/lgsm/config-default/config-lgsm/ns2cserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/ns2cserver/_default.cfg @@ -33,6 +33,9 @@ parms="-name \"${servername}\" -port ${port} -webadmin -webdomain ${ip} -webuser ## Notification Alerts # (on|off) +# Display IP | https://docs.linuxgsm.com/alerts#display-ip +displayip="" + # More info | https://docs.linuxgsm.com/alerts#more-info postalert="off" postdays="7" diff --git a/lgsm/config-default/config-lgsm/ns2server/_default.cfg b/lgsm/config-default/config-lgsm/ns2server/_default.cfg index 9e5e7044f..98c3bf3d4 100644 --- a/lgsm/config-default/config-lgsm/ns2server/_default.cfg +++ b/lgsm/config-default/config-lgsm/ns2server/_default.cfg @@ -37,6 +37,9 @@ parms="-name \"${servername}\" -port ${port} -webadmin -webdomain ${ip} -webuser ## Notification Alerts # (on|off) +# Display IP | https://docs.linuxgsm.com/alerts#display-ip +displayip="" + # More info | https://docs.linuxgsm.com/alerts#more-info postalert="off" postdays="7" diff --git a/lgsm/config-default/config-lgsm/nsserver/_default.cfg b/lgsm/config-default/config-lgsm/nsserver/_default.cfg index 16e80a554..e7b40f0c2 100644 --- a/lgsm/config-default/config-lgsm/nsserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/nsserver/_default.cfg @@ -25,6 +25,9 @@ parms="-game ns -strictportbind +ip ${ip} -port ${port} +clientport ${clientport ## Notification Alerts # (on|off) +# Display IP | https://docs.linuxgsm.com/alerts#display-ip +displayip="" + # More info | https://docs.linuxgsm.com/alerts#more-info postalert="off" postdays="7" diff --git a/lgsm/config-default/config-lgsm/opforserver/_default.cfg b/lgsm/config-default/config-lgsm/opforserver/_default.cfg index d9fc738e2..9d85f0049 100644 --- a/lgsm/config-default/config-lgsm/opforserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/opforserver/_default.cfg @@ -25,6 +25,9 @@ parms="-game gearbox -strictportbind +ip ${ip} -port ${port} +clientport ${clien ## Notification Alerts # (on|off) +# Display IP | https://docs.linuxgsm.com/alerts#display-ip +displayip="" + # More info | https://docs.linuxgsm.com/alerts#more-info postalert="off" postdays="7" diff --git a/lgsm/config-default/config-lgsm/pcserver/_default.cfg b/lgsm/config-default/config-lgsm/pcserver/_default.cfg index d9ed6a032..fdf8db746 100644 --- a/lgsm/config-default/config-lgsm/pcserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/pcserver/_default.cfg @@ -18,6 +18,9 @@ parms="--config ${servercfg}" ## Notification Alerts # (on|off) +# Display IP | https://docs.linuxgsm.com/alerts#display-ip +displayip="" + # More info | https://docs.linuxgsm.com/alerts#more-info postalert="off" postdays="7" diff --git a/lgsm/config-default/config-lgsm/pstbsserver/_default.cfg b/lgsm/config-default/config-lgsm/pstbsserver/_default.cfg index 997e57784..ce13b1ab3 100644 --- a/lgsm/config-default/config-lgsm/pstbsserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/pstbsserver/_default.cfg @@ -29,6 +29,9 @@ parms="MULTIHOME=${ip}?RANDOM=${randommap}?Port=${port}?QueryPort=${queryport}?M ## Notification Alerts # (on|off) +# Display IP | https://docs.linuxgsm.com/alerts#display-ip +displayip="" + # More info | https://docs.linuxgsm.com/alerts#more-info postalert="off" postdays="7" diff --git a/lgsm/config-default/config-lgsm/pvkiiserver/_default.cfg b/lgsm/config-default/config-lgsm/pvkiiserver/_default.cfg index f853e8583..1d70816d2 100644 --- a/lgsm/config-default/config-lgsm/pvkiiserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/pvkiiserver/_default.cfg @@ -26,6 +26,9 @@ parms="-game pvkii -strictportbind -ip ${ip} -port ${port} +clientport ${clientp ## Notification Alerts # (on|off) +# Display IP | https://docs.linuxgsm.com/alerts#display-ip +displayip="" + # More info | https://docs.linuxgsm.com/alerts#more-info postalert="off" postdays="7" diff --git a/lgsm/config-default/config-lgsm/pzserver/_default.cfg b/lgsm/config-default/config-lgsm/pzserver/_default.cfg index 8884ad99c..8b258cfe9 100644 --- a/lgsm/config-default/config-lgsm/pzserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/pzserver/_default.cfg @@ -21,6 +21,9 @@ parms="-ip ${ip} -adminpassword \"${adminpassword}\" -servername ${servicename}" ## Notification Alerts # (on|off) +# Display IP | https://docs.linuxgsm.com/alerts#display-ip +displayip="" + # More info | https://docs.linuxgsm.com/alerts#more-info postalert="off" postdays="7" diff --git a/lgsm/config-default/config-lgsm/q2server/_default.cfg b/lgsm/config-default/config-lgsm/q2server/_default.cfg index ea597b8ef..c2ac3340e 100644 --- a/lgsm/config-default/config-lgsm/q2server/_default.cfg +++ b/lgsm/config-default/config-lgsm/q2server/_default.cfg @@ -23,6 +23,9 @@ parms="+set dedicated 1 +set ip ${ip} +set port ${port} +exec ${servercfg} +set ## Notification Alerts # (on|off) +# Display IP | https://docs.linuxgsm.com/alerts#display-ip +displayip="" + # More info | https://docs.linuxgsm.com/alerts#more-info postalert="off" postdays="7" diff --git a/lgsm/config-default/config-lgsm/q3server/_default.cfg b/lgsm/config-default/config-lgsm/q3server/_default.cfg index 51c6aeed7..0c205c6b8 100644 --- a/lgsm/config-default/config-lgsm/q3server/_default.cfg +++ b/lgsm/config-default/config-lgsm/q3server/_default.cfg @@ -23,6 +23,9 @@ parms="+set sv_punkbuster 0 +set fs_basepath ${serverfiles} +set dedicated 2 +se ## Notification Alerts # (on|off) +# Display IP | https://docs.linuxgsm.com/alerts#display-ip +displayip="" + # More info | https://docs.linuxgsm.com/alerts#more-info postalert="off" postdays="7" diff --git a/lgsm/config-default/config-lgsm/qlserver/_default.cfg b/lgsm/config-default/config-lgsm/qlserver/_default.cfg index b062c8860..01bd7950b 100644 --- a/lgsm/config-default/config-lgsm/qlserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/qlserver/_default.cfg @@ -20,6 +20,9 @@ parms="+exec ${servercfg}" ## Notification Alerts # (on|off) +# Display IP | https://docs.linuxgsm.com/alerts#display-ip +displayip="" + # More info | https://docs.linuxgsm.com/alerts#more-info postalert="off" postdays="7" diff --git a/lgsm/config-default/config-lgsm/qwserver/_default.cfg b/lgsm/config-default/config-lgsm/qwserver/_default.cfg index 9a1abc2bd..b2ccd0af6 100644 --- a/lgsm/config-default/config-lgsm/qwserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/qwserver/_default.cfg @@ -22,6 +22,9 @@ parms="-port ${port} -game ktx +exec ${servercfg}" ## Notification Alerts # (on|off) +# Display IP | https://docs.linuxgsm.com/alerts#display-ip +displayip="" + # More info | https://docs.linuxgsm.com/alerts#more-info postalert="off" postdays="7" diff --git a/lgsm/config-default/config-lgsm/ricochetserver/_default.cfg b/lgsm/config-default/config-lgsm/ricochetserver/_default.cfg index 44ee520b2..41ccda337 100644 --- a/lgsm/config-default/config-lgsm/ricochetserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/ricochetserver/_default.cfg @@ -25,6 +25,9 @@ parms="-game ricochet -strictportbind +ip ${ip} -port ${port} +clientport ${clie ## Notification Alerts # (on|off) +# Display IP | https://docs.linuxgsm.com/alerts#display-ip +displayip="" + # More info | https://docs.linuxgsm.com/alerts#more-info postalert="off" postdays="7" diff --git a/lgsm/config-default/config-lgsm/roserver/_default.cfg b/lgsm/config-default/config-lgsm/roserver/_default.cfg index e4148ec75..dd4614682 100644 --- a/lgsm/config-default/config-lgsm/roserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/roserver/_default.cfg @@ -26,6 +26,9 @@ parms="server ${defaultmap}?game=ROGame.ROTeamGame?VACSecured=true -nohomedir in ## Notification Alerts # (on|off) +# Display IP | https://docs.linuxgsm.com/alerts#display-ip +displayip="" + # More info | https://docs.linuxgsm.com/alerts#more-info postalert="off" postdays="7" diff --git a/lgsm/config-default/config-lgsm/rtcwserver/_default.cfg b/lgsm/config-default/config-lgsm/rtcwserver/_default.cfg index d875df5ca..012a86815 100644 --- a/lgsm/config-default/config-lgsm/rtcwserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/rtcwserver/_default.cfg @@ -23,6 +23,9 @@ parms="+set sv_punkbuster 0 +set fs_basepath ${serverfiles} +set dedicated 1 +se ## Notification Alerts # (on|off) +# Display IP | https://docs.linuxgsm.com/alerts#display-ip +displayip="" + # More info | https://docs.linuxgsm.com/alerts#more-info postalert="off" postdays="7" diff --git a/lgsm/config-default/config-lgsm/rustserver/_default.cfg b/lgsm/config-default/config-lgsm/rustserver/_default.cfg index 4e7064ccf..a132a7585 100644 --- a/lgsm/config-default/config-lgsm/rustserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/rustserver/_default.cfg @@ -50,6 +50,9 @@ parms="-batchmode +server.ip ${ip} +server.port ${port} +server.tickrate ${tickr ## Notification Alerts # (on|off) +# Display IP | https://docs.linuxgsm.com/alerts#display-ip +displayip="" + # More info | https://docs.linuxgsm.com/alerts#more-info postalert="off" postdays="7" diff --git a/lgsm/config-default/config-lgsm/rwserver/_default.cfg b/lgsm/config-default/config-lgsm/rwserver/_default.cfg index 0f8c9645b..358304664 100644 --- a/lgsm/config-default/config-lgsm/rwserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/rwserver/_default.cfg @@ -21,6 +21,9 @@ parms="" ## Notification Alerts # (on|off) +# Display IP | https://docs.linuxgsm.com/alerts#display-ip +displayip="" + # More info | https://docs.linuxgsm.com/alerts#more-info postalert="off" postdays="7" diff --git a/lgsm/config-default/config-lgsm/sampserver/_default.cfg b/lgsm/config-default/config-lgsm/sampserver/_default.cfg index 1f878023b..ab54a20c1 100644 --- a/lgsm/config-default/config-lgsm/sampserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/sampserver/_default.cfg @@ -22,6 +22,9 @@ parms="" ## Notification Alerts # (on|off) +# Display IP | https://docs.linuxgsm.com/alerts#display-ip +displayip="" + # More info | https://docs.linuxgsm.com/alerts#more-info postalert="off" postdays="7" diff --git a/lgsm/config-default/config-lgsm/sbotsserver/_default.cfg b/lgsm/config-default/config-lgsm/sbotsserver/_default.cfg index 9e32e5d43..847168d02 100644 --- a/lgsm/config-default/config-lgsm/sbotsserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/sbotsserver/_default.cfg @@ -26,6 +26,9 @@ parms="Port=${port}?QueryPort=${queryport} -startup_map ${defaultmap} -server_na ## Notification Alerts # (on|off) +# Display IP | https://docs.linuxgsm.com/alerts#display-ip +displayip="" + # More info | https://docs.linuxgsm.com/alerts#more-info postalert="off" postdays="7" diff --git a/lgsm/config-default/config-lgsm/sbserver/_default.cfg b/lgsm/config-default/config-lgsm/sbserver/_default.cfg index 7de6bd3b5..bf7928642 100644 --- a/lgsm/config-default/config-lgsm/sbserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/sbserver/_default.cfg @@ -25,6 +25,9 @@ parms="" ## Notification Alerts # (on|off) +# Display IP | https://docs.linuxgsm.com/alerts#display-ip +displayip="" + # More info | https://docs.linuxgsm.com/alerts#more-info postalert="off" postdays="7" diff --git a/lgsm/config-default/config-lgsm/sdtdserver/_default.cfg b/lgsm/config-default/config-lgsm/sdtdserver/_default.cfg index 38cffed24..59c408431 100644 --- a/lgsm/config-default/config-lgsm/sdtdserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/sdtdserver/_default.cfg @@ -21,6 +21,9 @@ parms="-logfile ${gamelogdir}/output_log__$(date +%Y-%m-%d__%H-%M-%S).txt -quit ## Notification Alerts # (on|off) +# Display IP | https://docs.linuxgsm.com/alerts#display-ip +displayip="" + # More info | https://docs.linuxgsm.com/alerts#more-info postalert="off" postdays="7" diff --git a/lgsm/config-default/config-lgsm/sof2server/_default.cfg b/lgsm/config-default/config-lgsm/sof2server/_default.cfg index d0e5dc776..31d5c2306 100644 --- a/lgsm/config-default/config-lgsm/sof2server/_default.cfg +++ b/lgsm/config-default/config-lgsm/sof2server/_default.cfg @@ -23,6 +23,9 @@ parms="+set sv_punkbuster 0 +set dedicated 2 +set net_ip ${ip} +set net_port ${p ## Notification Alerts # (on|off) +# Display IP | https://docs.linuxgsm.com/alerts#display-ip +displayip="" + # More info | https://docs.linuxgsm.com/alerts#more-info postalert="off" postdays="7" diff --git a/lgsm/config-default/config-lgsm/squadserver/_default.cfg b/lgsm/config-default/config-lgsm/squadserver/_default.cfg index 5254148cd..d9dd3b171 100644 --- a/lgsm/config-default/config-lgsm/squadserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/squadserver/_default.cfg @@ -23,6 +23,9 @@ parms="MULTIHOME=${ip} RANDOM=${randommap} Port=${port} QueryPort=${queryport}" ## Notification Alerts # (on|off) +# Display IP | https://docs.linuxgsm.com/alerts#display-ip +displayip="" + # More info | https://docs.linuxgsm.com/alerts#more-info postalert="off" postdays="7" diff --git a/lgsm/config-default/config-lgsm/ss3server/_default.cfg b/lgsm/config-default/config-lgsm/ss3server/_default.cfg index af9df3a5a..496e11ce0 100644 --- a/lgsm/config-default/config-lgsm/ss3server/_default.cfg +++ b/lgsm/config-default/config-lgsm/ss3server/_default.cfg @@ -22,6 +22,9 @@ parms="+ip ${ip} +logfile ${gamelog} +exec ${servercfgfullpath}" ## Notification Alerts # (on|off) +# Display IP | https://docs.linuxgsm.com/alerts#display-ip +displayip="" + # More info | https://docs.linuxgsm.com/alerts#more-info postalert="off" postdays="7" diff --git a/lgsm/config-default/config-lgsm/stserver/_default.cfg b/lgsm/config-default/config-lgsm/stserver/_default.cfg index a92271abd..9239d1b6c 100644 --- a/lgsm/config-default/config-lgsm/stserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/stserver/_default.cfg @@ -28,6 +28,9 @@ parms="-batchmode -nographics -autostart -gameport=${port} -updateport=${querypo ## Notification Alerts # (on|off) +# Display IP | https://docs.linuxgsm.com/alerts#display-ip +displayip="" + # More info | https://docs.linuxgsm.com/alerts#more-info postalert="off" postdays="7" diff --git a/lgsm/config-default/config-lgsm/svenserver/_default.cfg b/lgsm/config-default/config-lgsm/svenserver/_default.cfg index 066b35e5c..7b0b2524d 100644 --- a/lgsm/config-default/config-lgsm/svenserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/svenserver/_default.cfg @@ -25,6 +25,9 @@ parms="-game svencoop -strictportbind +ip ${ip} -port ${port} +clientport ${clie ## Notification Alerts # (on|off) +# Display IP | https://docs.linuxgsm.com/alerts#display-ip +displayip="" + # More info | https://docs.linuxgsm.com/alerts#more-info postalert="off" postdays="7" diff --git a/lgsm/config-default/config-lgsm/terrariaserver/_default.cfg b/lgsm/config-default/config-lgsm/terrariaserver/_default.cfg index 0f59b17c4..e064f10c1 100644 --- a/lgsm/config-default/config-lgsm/terrariaserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/terrariaserver/_default.cfg @@ -25,6 +25,9 @@ parms="-config ${servercfgfullpath}" ## Notification Alerts # (on|off) +# Display IP | https://docs.linuxgsm.com/alerts#display-ip +displayip="" + # More info | https://docs.linuxgsm.com/alerts#more-info postalert="off" postdays="7" diff --git a/lgsm/config-default/config-lgsm/tf2server/_default.cfg b/lgsm/config-default/config-lgsm/tf2server/_default.cfg index fc2675a42..7399cb941 100644 --- a/lgsm/config-default/config-lgsm/tf2server/_default.cfg +++ b/lgsm/config-default/config-lgsm/tf2server/_default.cfg @@ -31,6 +31,9 @@ parms="-game tf -strictportbind -ip ${ip} -port ${port} +clientport ${clientport ## Notification Alerts # (on|off) +# Display IP | https://docs.linuxgsm.com/alerts#display-ip +displayip="" + # More info | https://docs.linuxgsm.com/alerts#more-info postalert="off" postdays="7" diff --git a/lgsm/config-default/config-lgsm/tfcserver/_default.cfg b/lgsm/config-default/config-lgsm/tfcserver/_default.cfg index 753dce496..adfe3b56d 100644 --- a/lgsm/config-default/config-lgsm/tfcserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/tfcserver/_default.cfg @@ -25,6 +25,9 @@ parms="-game tfc -strictportbind _ip ${ip} -port ${port} +clientport ${clientpor ## Notification Alerts # (on|off) +# Display IP | https://docs.linuxgsm.com/alerts#display-ip +displayip="" + # More info | https://docs.linuxgsm.com/alerts#more-info postalert="off" postdays="7" diff --git a/lgsm/config-default/config-lgsm/ts3server/_default.cfg b/lgsm/config-default/config-lgsm/ts3server/_default.cfg index 871fe71bc..6c6b116cd 100644 --- a/lgsm/config-default/config-lgsm/ts3server/_default.cfg +++ b/lgsm/config-default/config-lgsm/ts3server/_default.cfg @@ -14,6 +14,9 @@ ## Notification Alerts # (on|off) +# Display IP | https://docs.linuxgsm.com/alerts#display-ip +displayip="" + # More info | https://docs.linuxgsm.com/alerts#more-info postalert="off" postdays="7" diff --git a/lgsm/config-default/config-lgsm/tuserver/_default.cfg b/lgsm/config-default/config-lgsm/tuserver/_default.cfg index b3277fc37..8397e826d 100644 --- a/lgsm/config-default/config-lgsm/tuserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/tuserver/_default.cfg @@ -28,6 +28,9 @@ parms="-log -MultiHome=${ip} -Port=${port} -QueryPort=${queryport} -TowerServerI ## Notification Alerts # (on|off) +# Display IP | https://docs.linuxgsm.com/alerts#display-ip +displayip="" + # More info | https://docs.linuxgsm.com/alerts#more-info postalert="off" postdays="7" diff --git a/lgsm/config-default/config-lgsm/twserver/_default.cfg b/lgsm/config-default/config-lgsm/twserver/_default.cfg index 3dbed4eff..e655aa023 100644 --- a/lgsm/config-default/config-lgsm/twserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/twserver/_default.cfg @@ -25,6 +25,9 @@ parms="-f ${servercfg}" ## Notification Alerts # (on|off) +# Display IP | https://docs.linuxgsm.com/alerts#display-ip +displayip="" + # More info | https://docs.linuxgsm.com/alerts#more-info postalert="off" postdays="7" diff --git a/lgsm/config-default/config-lgsm/ut2k4server/_default.cfg b/lgsm/config-default/config-lgsm/ut2k4server/_default.cfg index af9e9d630..390eb3b47 100644 --- a/lgsm/config-default/config-lgsm/ut2k4server/_default.cfg +++ b/lgsm/config-default/config-lgsm/ut2k4server/_default.cfg @@ -22,6 +22,9 @@ parms="server ${defaultmap}?game=XGame.xDeathMatch -nohomedir ini=${servercfg} l ## Notification Alerts # (on|off) +# Display IP | https://docs.linuxgsm.com/alerts#display-ip +displayip="" + # More info | https://docs.linuxgsm.com/alerts#more-info postalert="off" postdays="7" diff --git a/lgsm/config-default/config-lgsm/ut3server/_default.cfg b/lgsm/config-default/config-lgsm/ut3server/_default.cfg index 3606d79ec..8afab880c 100644 --- a/lgsm/config-default/config-lgsm/ut3server/_default.cfg +++ b/lgsm/config-default/config-lgsm/ut3server/_default.cfg @@ -33,6 +33,9 @@ parms="server ${defaultmap}?Game=${game}?bIsDedicated=${isdedicated}?bIsLanMatch ## Notification Alerts # (on|off) +# Display IP | https://docs.linuxgsm.com/alerts#display-ip +displayip="" + # More info | https://docs.linuxgsm.com/alerts#more-info postalert="off" postdays="7" diff --git a/lgsm/config-default/config-lgsm/ut99server/_default.cfg b/lgsm/config-default/config-lgsm/ut99server/_default.cfg index 627a4bdf4..ee45795dd 100644 --- a/lgsm/config-default/config-lgsm/ut99server/_default.cfg +++ b/lgsm/config-default/config-lgsm/ut99server/_default.cfg @@ -22,6 +22,9 @@ parms="server ${defaultmap}.unr ini=${servercfgfullpath}" ## Notification Alerts # (on|off) +# Display IP | https://docs.linuxgsm.com/alerts#display-ip +displayip="" + # More info | https://docs.linuxgsm.com/alerts#more-info postalert="off" postdays="7" diff --git a/lgsm/config-default/config-lgsm/utserver/_default.cfg b/lgsm/config-default/config-lgsm/utserver/_default.cfg index 6bda1840b..027012b8e 100644 --- a/lgsm/config-default/config-lgsm/utserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/utserver/_default.cfg @@ -26,6 +26,9 @@ parms="UnrealTournament ${defaultmap}?Game=${gametype}?TimeLimit=${timelimit} -p ## Notification Alerts # (on|off) +# Display IP | https://docs.linuxgsm.com/alerts#display-ip +displayip="" + # More info | https://docs.linuxgsm.com/alerts#more-info postalert="off" postdays="7" diff --git a/lgsm/config-default/config-lgsm/vsserver/_default.cfg b/lgsm/config-default/config-lgsm/vsserver/_default.cfg index 1672d0d72..b21d1d7b4 100644 --- a/lgsm/config-default/config-lgsm/vsserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/vsserver/_default.cfg @@ -25,6 +25,9 @@ parms="-game vs -strictportbind +ip ${ip} -port ${port} +clientport ${clientport ## Notification Alerts # (on|off) +# Display IP | https://docs.linuxgsm.com/alerts#display-ip +displayip="" + # More info | https://docs.linuxgsm.com/alerts#more-info postalert="off" postdays="7" diff --git a/lgsm/config-default/config-lgsm/wetserver/_default.cfg b/lgsm/config-default/config-lgsm/wetserver/_default.cfg index 8c063de0a..2525bc8b3 100644 --- a/lgsm/config-default/config-lgsm/wetserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/wetserver/_default.cfg @@ -18,6 +18,9 @@ fn_parms(){ ## Notification Alerts # (on|off) +# Display IP | https://docs.linuxgsm.com/alerts#display-ip +displayip="" + # More info | https://docs.linuxgsm.com/alerts#more-info postalert="off" postdays="7" diff --git a/lgsm/config-default/config-lgsm/wurmserver/_default.cfg b/lgsm/config-default/config-lgsm/wurmserver/_default.cfg index 862215212..fb19f13fb 100644 --- a/lgsm/config-default/config-lgsm/wurmserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/wurmserver/_default.cfg @@ -20,6 +20,9 @@ fn_parms(){ ## Notification Alerts # (on|off) +# Display IP | https://docs.linuxgsm.com/alerts#display-ip +displayip="" + # More info | https://docs.linuxgsm.com/alerts#more-info postalert="off" postdays="7" diff --git a/lgsm/config-default/config-lgsm/zpsserver/_default.cfg b/lgsm/config-default/config-lgsm/zpsserver/_default.cfg index 3c4e0285a..e9aa313fc 100644 --- a/lgsm/config-default/config-lgsm/zpsserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/zpsserver/_default.cfg @@ -31,6 +31,9 @@ parms="-game zps -strictportbind -ip ${ip} -port ${port} +clientport ${clientpor ## Notification Alerts # (on|off) +# Display IP | https://docs.linuxgsm.com/alerts#display-ip +displayip="" + # More info | https://docs.linuxgsm.com/alerts#more-info postalert="off" postdays="7" diff --git a/lgsm/functions/alert_discord.sh b/lgsm/functions/alert_discord.sh index 2ace8935f..0d4b22123 100644 --- a/lgsm/functions/alert_discord.sh +++ b/lgsm/functions/alert_discord.sh @@ -35,7 +35,7 @@ json=$(cat <${alertsubject} ${alertemoji}\n\nMessage\n${alertbody}\n\nGame\n${gamename}\n\nServer name\n${servername}\n\nHostname\n${HOSTNAME}\n\nServer IP\n${extip:-$ip}:${port}\n\nMore info\n${alerturl}", + "text": "${alertemoji} ${alertsubject} ${alertemoji}\n\nMessage\n${alertbody}\n\nGame\n${gamename}\n\nServer name\n${servername}\n\nHostname\n${HOSTNAME}\n\nServer IP\n${alertip}:${port}\n\nMore info\n${alerturl}", "disable_web_page_preview": "yes", EOF ) diff --git a/lgsm/functions/info_distro.sh b/lgsm/functions/info_distro.sh index 711b14ba5..8100feb97 100644 --- a/lgsm/functions/info_distro.sh +++ b/lgsm/functions/info_distro.sh @@ -222,6 +222,15 @@ if [ -z "${extip}" ]; then fi fi +# Alert IP address +if [ "${displayip}" ]; then + alertip="${displayip}" +elif [ "${extip}" ]; then + alertip="${extip}" +else + alertip="${ip}" +fi + # Steam Master Server - checks if detected by master server if [ "$(command -v jq 2>/dev/null)" ]; then if [ "${ip}" ]&&[ "${port}" ]; then diff --git a/lgsm/functions/info_messages.sh b/lgsm/functions/info_messages.sh index 4c1b960c4..d8f7abd63 100644 --- a/lgsm/functions/info_messages.sh +++ b/lgsm/functions/info_messages.sh @@ -155,13 +155,18 @@ fn_info_message_gameserver(){ echo -e "${blue}Server IP:\t${default}${ip}:${port}" fi - # External server ip + # Internet ip if [ -n "${extip}" ]; then if [ "${ip}" != "${extip}" ]; then echo -e "${blue}Internet IP:\t${default}${extip}:${port}" fi fi + # Display ip + if [ -n "${displayip}" ]; then + echo -e "${blue}Display IP:\t${default}${displayip}:${port}" + fi + # Server password if [ -n "${serverpassword}" ]; then echo -e "${blue}Server password:\t${default}${serverpassword}" From e0acffad80a880da6d4dfbbd8107e0418e82266c Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Thu, 13 Jun 2019 19:36:32 +0100 Subject: [PATCH 105/534] feat: Refactor comments to follow standards (#2389) --- lgsm/functions/alert.sh | 4 +- lgsm/functions/alert_pushover.sh | 4 +- lgsm/functions/check.sh | 4 +- lgsm/functions/check_deps.sh | 73 ++++---- lgsm/functions/check_ip.sh | 12 +- lgsm/functions/check_logs.sh | 6 +- lgsm/functions/check_permissions.sh | 58 +++--- lgsm/functions/check_steamcmd.sh | 2 +- lgsm/functions/check_system_requirements.sh | 2 +- lgsm/functions/command_backup.sh | 64 +++---- lgsm/functions/command_debug.sh | 18 +- lgsm/functions/command_dev_detect_deps.sh | 4 +- lgsm/functions/command_fastdl.sh | 54 +++--- lgsm/functions/command_install.sh | 4 +- lgsm/functions/command_mods_install.sh | 32 ++-- lgsm/functions/command_mods_remove.sh | 30 +-- lgsm/functions/command_mods_update.sh | 32 ++-- lgsm/functions/command_postdetails.sh | 8 +- lgsm/functions/command_start.sh | 35 ++-- lgsm/functions/command_stop.sh | 63 +++---- lgsm/functions/command_ts3_server_pass.sh | 6 +- lgsm/functions/command_update_linuxgsm.sh | 4 +- lgsm/functions/command_wipe.sh | 46 ++--- lgsm/functions/core_getopt.sh | 70 +++---- lgsm/functions/core_legacy.sh | 4 +- lgsm/functions/core_messages.sh | 6 +- lgsm/functions/fix.sh | 4 +- lgsm/functions/fix_coduo.sh | 3 +- lgsm/functions/fix_dst.sh | 2 +- lgsm/functions/fix_rust.sh | 2 +- lgsm/functions/fix_ts3.sh | 4 +- lgsm/functions/fix_unt.sh | 2 +- lgsm/functions/fix_wurm.sh | 8 +- lgsm/functions/info_config.sh | 2 +- lgsm/functions/info_distro.sh | 18 +- lgsm/functions/install_config.sh | 16 +- lgsm/functions/install_logs.sh | 10 +- lgsm/functions/install_server_files.sh | 10 +- lgsm/functions/install_ts3db.sh | 1 - lgsm/functions/logs.sh | 30 +-- lgsm/functions/mods_core.sh | 184 +++++++++--------- lgsm/functions/query_gamedig.sh | 28 +-- linuxgsm.sh | 81 ++++---- tests/tests_fctrserver.sh | 196 ++++++++++--------- tests/tests_jc2server.sh | 197 +++++++++++--------- tests/tests_mcserver.sh | 197 +++++++++++--------- tests/tests_ts3server.sh | 197 +++++++++++--------- 47 files changed, 962 insertions(+), 875 deletions(-) diff --git a/lgsm/functions/alert.sh b/lgsm/functions/alert.sh index 3a7bf2604..a5b753f0d 100644 --- a/lgsm/functions/alert.sh +++ b/lgsm/functions/alert.sh @@ -93,10 +93,10 @@ elif [ "${alert}" == "config" ]; then fn_alert_config fi -# Generate alert log +# Generate alert log. fn_alert_log -# Generates the more info link +# Generates the more info link. if [ "${postalert}" == "on" ]&&[ -n "${postalert}" ]; then alertflag=1 command_postdetails.sh diff --git a/lgsm/functions/alert_pushover.sh b/lgsm/functions/alert_pushover.sh index 8bba73ee7..1eab80df5 100644 --- a/lgsm/functions/alert_pushover.sh +++ b/lgsm/functions/alert_pushover.sh @@ -10,12 +10,12 @@ local function_selfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" fn_print_dots "Sending Pushover alert" -# Different alerts are given different priorities and notification sounds +# Different alerts are given different priorities and notification sounds. if [ "${alertsound}" == "1" ]; then alertsound="" alertpriority="0" elif [ "${alertsound}" == "2" ]; then - # restarted + # restarted. alertsound="siren" alertpriority="1" else diff --git a/lgsm/functions/check.sh b/lgsm/functions/check.sh index 0a1768884..21e63aca4 100644 --- a/lgsm/functions/check.sh +++ b/lgsm/functions/check.sh @@ -7,8 +7,8 @@ local commandname="CHECK" -# Every command that requires checks just references check.sh -# check.sh selects which checks to run by using arrays +# Every command that requires checks just references check.sh. +# check.sh selects which checks to run by using arrays. if [ "${userinput}" != "install" ]&&[ "${userinput}" != "auto-install" ]&&[ "${userinput}" != "i" ]&&[ "${userinput}" != "ai" ]; then check_root.sh diff --git a/lgsm/functions/check_deps.sh b/lgsm/functions/check_deps.sh index d69926f8f..45423ec2d 100644 --- a/lgsm/functions/check_deps.sh +++ b/lgsm/functions/check_deps.sh @@ -102,7 +102,7 @@ fn_install_mono_repo(){ } fn_install_universe_repo(){ - # Defensive coding - As this is an ubuntu only issue then check to make sure this fix is needed, and we are using ubuntu + # Defensive coding - As this is an ubuntu only issue then check to make sure this fix is needed, and we are using ubuntu. if [ "${jquniversemissing}" != "0" ]&&[ "${distroid}" == "ubuntu" ]; then fn_print_warning_nl "Ubuntu 18.04.1 contains a bug which means the sources.list file does not populate with the Ubuntu universe repository." fn_print_information_nl "Attempting to add Universe Repo" @@ -138,7 +138,7 @@ fn_install_universe_repo(){ } fn_deps_detector(){ - # Checks if dependency is missing + # Checks if dependency is missing. if [ "${tmuxcheck}" == "1" ]; then # Added for users compiling tmux from source to bypass check. depstatus=0 @@ -152,16 +152,16 @@ fn_deps_detector(){ elif [ "${deptocheck}" == "jq" ]&&[ "${distroversion}" == "6" ]; then jqstatus=1 elif [ "${deptocheck}" == "jq" ]&&[ "${distroid}" == "ubuntu" ]&&[ "${distroversion}" == "18.04" ]&& ! grep -qE "^deb .*universe" /etc/apt/sources.list; then - #1985 ubuntu 18.04.1 bug does not set sources.list correctly which means universe is not active by default - #If the universe repo does not exist, mark as dependency missing and universe missing + # #1985 ubuntu 18.04.1 bug does not set sources.list correctly which means universe is not active by default + # If the universe repo does not exist, mark as dependency missing and universe missing. depstatus=1 jquniversemissing=1 elif [ "${deptocheck}" == "mono-complete" ]; then if [ "$(command -v mono 2>/dev/null)" ]&&[ "$(mono --version 2>&1 | grep -Po '(?<=version )\d')" -ge 5 ]; then - # Mono >= 5.0.0 already installed + # Mono >= 5.0.0 already installed. depstatus=0 else - # Mono not installed or installed Mono < 5.0.0 + # Mono not installed or installed Mono < 5.0.0. depstatus=1 monostatus=1 fi @@ -174,20 +174,20 @@ fn_deps_detector(){ fi if [ "${depstatus}" == "0" ]; then - # if dependency is found + # If dependency is found. missingdep=0 if [ "${function_selfname}" == "command_install.sh" ]; then echo -e "${green}${deptocheck}${default}" fn_sleep_time fi else - # if dependency is not found + # If dependency is not found. missingdep=1 if [ "${function_selfname}" == "command_install.sh" ]; then echo -e "${red}${deptocheck}${default}" fn_sleep_time fi - # Define required dependencies for SteamCMD + # Define required dependencies for SteamCMD. if [ -n "${appid}" ]; then if [ "${deptocheck}" == "glibc.i686" ]||[ "${deptocheck}" == "libstdc++64.i686" ]||[ "${deptocheck}" == "lib32gcc1" ]||[ "${deptocheck}" == "libstdc++6:i386" ]; then steamcmdfail=1 @@ -195,14 +195,14 @@ fn_deps_detector(){ fi fi - # Missing dependencies are added to array_deps_missing + # Missing dependencies are added to array_deps_missing. if [ "${missingdep}" == "1" ]; then array_deps_missing+=("${deptocheck}") fi } fn_deps_email(){ - # Adds postfix to required dependencies if email alert is enabled + # Adds postfix to required dependencies if email alert is enabled. if [ "${emailalert}" == "on" ]; then if [ -f /usr/bin/mailx ]; then if [ -d /etc/exim4 ]; then @@ -316,25 +316,25 @@ fn_found_missing_deps(){ } fn_check_loop(){ - # Loop though required depenencies + # Loop though required depenencies. for deptocheck in "${array_deps_required[@]}" do fn_deps_detector done - # user to be informed of any missing dependencies + # user to be informed of any missing dependencies. fn_found_missing_deps } -# Generate require dependencies for debian based systems +# Generate require dependencies for debian based systems. fn_deps_build_debian(){ - # Generate array of missing deps + # Generate array of missing deps. array_deps_missing=() - ## LinuxGSM requirements + # LinuxGSM requirements. array_deps_required=( curl wget ca-certificates file bsdmainutils util-linux python bzip2 gzip unzip binutils bc jq ) - # All servers except ts3 require tmux + # All servers except ts3 require tmux. if [ "${shortname}" != "ts3" ]; then if [ "$(command -v tmux 2>/dev/null)" ]; then tmuxcheck=1 # Added for users compiling tmux from source to bypass check. @@ -343,7 +343,7 @@ fn_deps_build_debian(){ fi fi - # All servers except ts3, mumble, GTA and minecraft servers require libstdc++6 and lib32gcc1 + # All servers except ts3, mumble, GTA and minecraft servers require libstdc++6 and lib32gcc1. if [ "${shortname}" != "ts3" ]&&[ "${shortname}" != "mumble" ]&&[ "${shortname}" != "mc" ]&&[ "${engine}" != "renderware" ]; then if [ "${arch}" == "x86_64" ]; then array_deps_required+=( lib32gcc1 libstdc++6:i386 ) @@ -352,9 +352,9 @@ fn_deps_build_debian(){ fi fi - ## Game Specific requirements + # Game Specific requirements. - # Natural Selection 2 - x64 only + # Natural Selection 2 - x64 only. if [ "${shortname}" == "ns2" ]; then array_deps_required+=( speex libtbb2 ) # NS2: Combat @@ -392,14 +392,16 @@ fn_deps_build_debian(){ elif [ "${shortname}" == "mc" ]; then javaversion=$(java -version 2>&1 | grep "version") if [ "${javaversion}" ]; then - javacheck=1 # Added for users using Oracle JRE to bypass the check. + # Added for users using Oracle JRE to bypass the check. + javacheck=1 else array_deps_required+=( openjdk-8-jre-headless ) fi # Project Zomboid elif [ "${shortname}" == "pz" ]; then if [ -n "$(java -version 2>&1 | grep "version")" ]; then - javacheck=1 # Added for users using Oracle JRE to bypass the check. + # Added for users using Oracle JRE to bypass the check. + javacheck=1 array_deps_required+=( rng-tools ) else array_deps_required+=( default-jre rng-tools ) @@ -415,10 +417,10 @@ fn_deps_build_debian(){ array_deps_required+=( libssl1.0.0:i386 zlib1g:i386 ) # Unreal Engine elif [ "${executable}" == "./ucc-bin" ]; then - #UT2K4 + # UT2K4 if [ -f "${executabledir}/ut2004-bin" ]; then array_deps_required+=( libsdl1.2debian libstdc++5:i386 ) - #UT99 + # UT99 else array_deps_required+=( libsdl1.2debian ) fi @@ -437,11 +439,11 @@ fn_deps_build_debian(){ } fn_deps_build_redhat(){ - # Generate array of missing deps + # Generate array of missing deps. array_deps_missing=() - # LinuxGSM requirements - ## CentOS 6 + # LinuxGSM requirements. + # CentOS 6 if [ "${distroversion}" == "6" ]; then array_deps_required=( epel-release curl wget util-linux-ng python file gzip bzip2 unzip binutils bc jq ) elif [ "${distroversion}" == "7" ]; then @@ -454,16 +456,17 @@ fn_deps_build_redhat(){ array_deps_required=( curl wget util-linux python file gzip bzip2 unzip binutils bc jq ) fi - # All servers except ts3 require tmux + # All servers except ts3 require tmux. if [ "${shortname}" != "ts3" ]; then if [ "$(command -v tmux 2>/dev/null)" ]; then - tmuxcheck=1 # Added for users compiling tmux from source to bypass check. + # Added for users compiling tmux from source to bypass check. + tmuxcheck=1 else array_deps_required+=( tmux ) fi fi - # All servers except ts3,mumble,multitheftauto and minecraft servers require glibc.i686 and libstdc++.i686 + # All servers except ts3, mumble, multi theft auto and minecraft servers require glibc.i686 and libstdc++.i686. if [ "${shortname}" != "ts3" ]&&[ "${shortname}" != "mumble" ]&&[ "${shortname}" != "mc" ]&&[ "${engine}" != "renderware" ]; then if [[ "${distroname}" == *"Amazon Linux AMI"* ]]; then array_deps_required+=( glibc.i686 libstdc++64.i686 ) @@ -472,7 +475,7 @@ fn_deps_build_redhat(){ fi fi - # Game Specific requirements + # Game Specific requirements. # Natural Selection 2 (x64 only) if [ "${shortname}" == "ns2" ]; then @@ -507,7 +510,8 @@ fn_deps_build_redhat(){ elif [ "${shortname}" == "mc" ]; then javaversion=$(java -version 2>&1 | grep "version") if [ "${javaversion}" ]; then - javacheck=1 # Added for users using Oracle JRE to bypass the check. + # Added for users using Oracle JRE to bypass the check. + javacheck=1 array_deps_required+=( rng-tools ) else array_deps_required+=( java-1.8.0-openjdk rng-tools ) @@ -516,7 +520,8 @@ fn_deps_build_redhat(){ elif [ "${shortname}" == "pz" ]; then javaversion=$(java -version 2>&1 | grep "version") if [ "${javaversion}" ]; then - javacheck=1 # Added for users using Oracle JRE to bypass the check. + # Added for users using Oracle JRE to bypass the check. + javacheck=1 array_deps_required+=( rng-tools ) else array_deps_required+=( java-1.8.0-openjdk rng-tools ) @@ -559,7 +564,7 @@ if [ "${function_selfname}" == "command_install.sh" ]; then fi fi -# Filter checking in to Debian or Red Hat Based +# Filter checking in to Debian or Red Hat Based. info_distro.sh if [ -f "/etc/debian_version" ]; then fn_deps_build_debian diff --git a/lgsm/functions/check_ip.sh b/lgsm/functions/check_ip.sh index d9390ac0e..b54dddd16 100644 --- a/lgsm/functions/check_ip.sh +++ b/lgsm/functions/check_ip.sh @@ -18,10 +18,10 @@ if [ "${shortname}" != "ts3" ]&&[ "${shortname}" != "mumble" ]&&[ "${travistest} info_config.sh info_parms.sh - # IP is not set to specific IP + # IP is not set to specific IP. if [ "${ip}" == "0.0.0.0" ]||[ "${ip}" == "" ]; then fn_print_dots "Check IP" - # Multiple interfaces + # Multiple interfaces. if [ "${getipwc}" -ge "2" ]; then if [ "${function_selfname}" == "command_details.sh" ]; then fn_print_warn "Check IP: Multiple IP addresses found." @@ -29,7 +29,7 @@ if [ "${shortname}" != "ts3" ]&&[ "${shortname}" != "mumble" ]&&[ "${travistest} fn_print_fail "Check IP: Multiple IP addresses found." fi echo -en "\n" - # IP is set within game config + # IP is set within game config. if [ "${ipsetinconfig}" == "1" ]; then fn_print_information "Specify the IP you want to bind within ${servercfg}.\n" echo -en " * location: ${servercfgfullpath}\n" @@ -37,7 +37,7 @@ if [ "${shortname}" != "ts3" ]&&[ "${shortname}" != "mumble" ]&&[ "${travistest} echo -en "Set ${ipinconfigvar} to one of the following:\n" fn_script_log_fatal "Multiple IP addresses found." fn_script_log_fatal "Specify the IP you want to bind within: ${servercfgfullpath}." - # IP is set within LinuxGSM config + # IP is set within LinuxGSM config. else fn_print_information_nl "Specify the IP you want to bind within a LinuxGSM config file.\n" echo -en " * location: ${configdirserver}\n" @@ -54,14 +54,14 @@ if [ "${shortname}" != "ts3" ]&&[ "${shortname}" != "mumble" ]&&[ "${travistest} echo -en "\n" echo -en "https://linuxgsm.com/network-interfaces\n" echo -en "" - # Do not exit for details and postdetails commands + # Do not exit for details and postdetails commands. if [ "${function_selfname}" != "command_details.sh" ]||[ "${function_selfname}" != "command_postdetails.sh" ]; then fn_script_log_fatal "https://linuxgsm.com/network-interfaces\n" core_exit.sh else ip="NOT SET" fi - # Single interface + # Single interface. elif [ "${ipsetinconfig}" == "1" ]; then fn_print_fail "Check IP: IP address not set in game config." echo -en "\n" diff --git a/lgsm/functions/check_logs.sh b/lgsm/functions/check_logs.sh index 1a71f3dfd..9f3e87427 100644 --- a/lgsm/functions/check_logs.sh +++ b/lgsm/functions/check_logs.sh @@ -14,13 +14,13 @@ fn_check_logs(){ install_logs.sh } -# Create directories for the script and console logs +# Create directories for the script and console logs. if [ ! -d "${lgsmlogdir}" ]||[ ! -d "${consolelogdir}" ]&&[ "${shortname}" != "ts3" ]; then fn_check_logs fi -# Create gamelogdir -# If variable exists gamelogdir exists and log/server does not +# 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 diff --git a/lgsm/functions/check_permissions.sh b/lgsm/functions/check_permissions.sh index e1c0cabd7..77dfd1b5b 100644 --- a/lgsm/functions/check_permissions.sh +++ b/lgsm/functions/check_permissions.sh @@ -71,11 +71,11 @@ fn_check_permissions(){ fi fi - # Check rootdir permissions + # Check rootdir permissions. if [ -n "${rootdir}" ]; then - # Get permission numbers on directory under the form 775 + # Get permission numbers on directory under the form 775. rootdirperm="$(stat -c %a "${rootdir}")" - # Grab the first and second digit for user and group permission + # Grab the first and second digit for user and group permission. userrootdirperm="${rootdirperm:0:1}" grouprootdirperm="${rootdirperm:1:1}" if [ "${userrootdirperm}" != "7" ]&&[ "${grouprootdirperm}" != "7" ]; then @@ -92,20 +92,20 @@ fn_check_permissions(){ core_exit.sh fi fi - # Check if executable is executable and attempt to fix it - # First get executable name + # Check if executable is executable and attempt to fix it. + # First get executable name. execname="$(basename "${executable}")" if [ -f "${executabledir}/${execname}" ]; then - # Get permission numbers on file under the form 775 + # Get permission numbers on file under the form 775. execperm="$(stat -c %a "${executabledir}/${execname}")" - # Grab the first and second digit for user and group permission + # Grab the first and second digit for user and group permission. userexecperm="${execperm:0:1}" groupexecperm="${execperm:1:1}" - # Check for invalid user permission + # Check for invalid user permission. if [ "${userexecperm}" == "0" ]||[ "${userexecperm}" == "2" ]||[ "${userexecperm}" == "4" ]||[ "${userexecperm}" == "6" ]; then - # If user permission is invalid, then check for invalid group permissions + # If user permission is invalid, then check for invalid group permissions. if [ "${groupexecperm}" == "0" ]||[ "${groupexecperm}" == "2" ]||[ "${groupexecperm}" == "4" ]||[ "${groupexecperm}" == "6" ]; then - # If permission issues are found + # If permission issues are found. fn_print_warn_nl "Permissions issue found" fn_script_log_warn "Permissions issue found" fn_print_information_nl "The following file is not executable:" @@ -114,17 +114,17 @@ fn_check_permissions(){ fn_script_log_info "${executabledir}/${execname}" fn_print_information_nl "Applying chmod u+x,g+x ${executabledir}/${execname}" fn_script_log_info "Applying chmod u+x,g+x ${execperm}" - # Make the executable executable + # Make the executable executable. chmod u+x,g+x "${executabledir}/${execname}" - # Second check to see if it's been successfully applied - # Get permission numbers on file under the form 775 + # Second check to see if it's been successfully applied. + # Get permission numbers on file under the form 775. execperm="$(stat -c %a "${executabledir}/${execname}")" - # Grab the first and second digit for user and group permission + # Grab the first and second digit for user and group permission. userexecperm="${execperm:0:1}" groupexecperm="${execperm:1:1}" if [ "${userexecperm}" == "0" ]||[ "${userexecperm}" == "2" ]||[ "${userexecperm}" == "4" ]||[ "${userexecperm}" == "6" ]; then if [ "${groupexecperm}" == "0" ]||[ "${groupexecperm}" == "2" ]||[ "${groupexecperm}" == "4" ]||[ "${groupexecperm}" == "6" ]; then - # If errors are still found + # If errors are still found. fn_print_fail_nl "The following file could not be set executable:" ls -l "${executabledir}/${execname}" fn_script_log_warn "The following file could not be set executable:" @@ -141,16 +141,16 @@ fn_check_permissions(){ fi } -## The following fn_sys_perm_* functions checks for permission errors in /sys directory +## The following fn_sys_perm_* functions checks for permission errors in /sys directory. -# Checks for permission errors in /sys directory +# Checks for permission errors in /sys directory. fn_sys_perm_errors_detect(){ - # Reset test variables + # Reset test variables. sysdirpermerror="0" classdirpermerror="0" netdirpermerror="0" - # Check permissions - # /sys, /sys/class and /sys/class/net should be readable & executable + # Check permissions/ + # /sys, /sys/class and /sys/class/net should be readable & executable. if [ ! -r "/sys" ]||[ ! -x "/sys" ]; then sysdirpermerror="1" fi @@ -162,7 +162,7 @@ fn_sys_perm_errors_detect(){ fi } -# Display a message on how to fix the issue manually +# Display a message on how to fix the issue manually. fn_sys_perm_fix_manually_msg(){ echo "" fn_print_information_nl "This error causes servers to fail starting properly" @@ -179,7 +179,7 @@ fn_sys_perm_fix_manually_msg(){ core_exit.sh } -# Attempt to fix /sys related permission errors if sudo is available, exits otherwise +# Attempt to fix /sys related permission errors if sudo is available, exits otherwise. fn_sys_perm_errors_fix(){ sudo -n true > /dev/null 2>&1 if [ $? -eq 0 ]; then @@ -194,28 +194,28 @@ fn_sys_perm_errors_fix(){ if [ "${netdirpermerror}" == "1" ]; then sudo chmod a+rx "/sys/class/net" fi - # Run check again to see if it's fixed + # 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 /sys permissions" fn_script_log_error "Could not fix /sys permissions." fn_sleep_time - # Show the user how to fix + # Show the user how to fix. fn_sys_perm_fix_manually_msg else fn_print_ok_nl "Automatically fixing /sys permissions" fn_script_log_pass "Permissions in /sys fixed" fi else - # Show the user how to fix + # Show the user how to fix. fn_sys_perm_fix_manually_msg fi } -# Processes to the /sys related permission errors check & fix/info +# Processes to the /sys related permission errors check & fix/info. fn_sys_perm_error_process(){ fn_sys_perm_errors_detect - # If any error was found + # If any error was found. if [ "${sysdirpermerror}" == "1" ]||[ "${classdirpermerror}" == "1" ]||[ "${netdirpermerror}" == "1" ]; then fn_print_error_nl "Permission error(s) found in /sys" fn_script_log_error "Permission error(s) found in /sys" @@ -224,9 +224,9 @@ fn_sys_perm_error_process(){ fi } -# Run perm error detect & fix/alert functions on /sys directories +# Run perm error detect & fix/alert functions on /sys directories. -## Run checks +## Run checks. if [ "$(whoami)" != "root" ]; then fn_check_ownership fn_check_permissions diff --git a/lgsm/functions/check_steamcmd.sh b/lgsm/functions/check_steamcmd.sh index 518696e0e..2972ae71d 100644 --- a/lgsm/functions/check_steamcmd.sh +++ b/lgsm/functions/check_steamcmd.sh @@ -33,7 +33,7 @@ fn_check_steamcmd_user(){ fi core_exit.sh fi - # Anonymous user is set if steamuser is missing + # Anonymous user is set if steamuser is missing. if [ -z "${steamuser}" ]; then if [ -d "${lgsmlogdir}" ]; then fn_script_log_info "Using anonymous Steam login" diff --git a/lgsm/functions/check_system_requirements.sh b/lgsm/functions/check_system_requirements.sh index d0cf9bf8d..bc2317f48 100644 --- a/lgsm/functions/check_system_requirements.sh +++ b/lgsm/functions/check_system_requirements.sh @@ -42,7 +42,7 @@ fi if [ -n "${ramrequirementmb}" ]; then if [ "${physmemtotalmb}" -lt "${ramrequirementmb}" ]; then fn_print_dots "Check RAM" - # Warn the user + # Warn the user. fn_print_warn_nl "Check RAM: ${ramrequirementgb}G required, ${physmemtotal} available" echo " * ${gamename} server may fail to run or experience poor performance." fn_sleep_time diff --git a/lgsm/functions/command_backup.sh b/lgsm/functions/command_backup.sh index c5530440d..de5a11aff 100644 --- a/lgsm/functions/command_backup.sh +++ b/lgsm/functions/command_backup.sh @@ -21,12 +21,12 @@ fn_backup_trap(){ echo -en "backup ${backupname}.tar.gz..." fn_print_removed_eol_nl fn_script_log_info "Backup ${backupname}.tar.gz: REMOVED" - # Remove lock file + # Remove lock file. rm -f "${tmpdir}/.backup.lock" core_exit.sh } -# Check if a backup is pending or has been aborted using .backup.lock +# Check if a backup is pending or has been aborted using .backup.lock. fn_backup_check_lockfile(){ if [ -f "${tmpdir}/.backup.lock" ]; then fn_print_info_nl "Lock file found: Backup is currently running" @@ -35,9 +35,9 @@ fn_backup_check_lockfile(){ fi } -# Initialisation +# Initialisation. fn_backup_init(){ - # Backup file name with servicename and current date + # Backup file name with servicename and current date. backupname="${servicename}-$(date '+%Y-%m-%d-%H%M%S')" info_distro.sh @@ -58,20 +58,20 @@ fn_backup_init(){ fi } -# Check if server is started and whether to stop it +# Check if server is started and whether to stop it. fn_backup_stop_server(){ check_status.sh - # Server is stopped + # Server is stopped. if [ "${status}" == "0" ]; then serverstopped="no" - # Server is running and stoponbackup=off + # Server is running and stoponbackup=off. elif [ "${stoponbackup}" == "off" ]; then serverstopped="no" fn_print_warn_nl "${servicename} is currently running" echo " * Although unlikely; creating a backup while ${servicename} is running might corrupt the backup." fn_script_log_warn "${servicename} is currently running" fn_script_log_warn "Although unlikely; creating a backup while ${servicename} is running might corrupt the backup" - # Server is running and will be stopped if stoponbackup=on or unset + # Server is running and will be stopped if stoponbackup=on or unset. else fn_print_warn_nl "${servicename} will be stopped during the backup" fn_script_log_warn "${servicename} will be stopped during the backup" @@ -81,16 +81,16 @@ fn_backup_stop_server(){ fi } -# Create required folders +# Create required folders. fn_backup_dir(){ - # Create backupdir if it doesn't exist + # Create backupdir if it doesn't exist. if [ ! -d "${backupdir}" ]; then mkdir -p "${backupdir}" fi } fn_backup_create_lockfile(){ - # Create lockfile + # Create lockfile. date > "${tmpdir}/.backup.lock" fn_script_log_info "Lockfile generated" fn_script_log_info "${tmpdir}/.backup.lock" @@ -98,9 +98,9 @@ fn_backup_create_lockfile(){ trap fn_backup_trap INT } -# Compressing files +# Compressing files. fn_backup_compression(){ - # Tells how much will be compressed using rootdirduexbackup value from info_distro and prompt for continue + # Tells how much will be compressed using rootdirduexbackup value from info_distro and prompt for continue. fn_print_info "A total of ${rootdirduexbackup} will be compressed." fn_script_log_info "A total of ${rootdirduexbackup} will be compressed: ${backupdir}/${backupname}.tar.gz" fn_print_dots "Backup (${rootdirduexbackup}) ${backupname}.tar.gz, in progress..." @@ -131,36 +131,36 @@ fn_backup_compression(){ rm -f "${tmpdir}/.backup.lock" } -# Clear old backups according to maxbackups and maxbackupdays variables +# Clear old backups according to maxbackups and maxbackupdays variables. fn_backup_prune(){ - # Clear if backup variables are set + # Clear if backup variables are set. if [ -n "${maxbackups}" ]&&[ -n "${maxbackupdays}" ]; then - # How many backups there are + # How many backups there are. info_distro.sh - # How many backups exceed maxbackups + # How many backups exceed maxbackups. backupquotadiff=$((backupcount-maxbackups)) - # How many backups exceed maxbackupdays + # How many backups exceed maxbackupdays. backupsoudatedcount=$(find "${backupdir}"/ -type f -name "*.tar.gz" -mtime +"${maxbackupdays}"|wc -l) - # If anything can be cleared + # If anything can be cleared. if [ "${backupquotadiff}" -gt "0" ]||[ "${backupsoudatedcount}" -gt "0" ]; then fn_print_dots "Pruning" fn_script_log_info "Backup pruning activated" fn_print_ok_nl "Pruning" - # If maxbackups greater or equal to backupsoutdatedcount, then it is over maxbackupdays + # If maxbackups greater or equal to backupsoutdatedcount, then it is over maxbackupdays. if [ "${backupquotadiff}" -ge "${backupsoudatedcount}" ]; then - # Display how many backups will be cleared + # Display how many backups will be cleared. echo " * Pruning: ${backupquotadiff} backup(s) has exceeded the ${maxbackups} backups limit" fn_script_log_info "Pruning: ${backupquotadiff} backup(s) has exceeded the ${maxbackups} backups limit" fn_sleep_time fn_print_dots "Pruning: Clearing ${backupquotadiff} backup(s)" fn_script_log_info "Pruning: Clearing ${backupquotadiff} backup(s)" - # Clear backups over quota + # Clear backups over quota. find "${backupdir}"/ -type f -name "*.tar.gz" -printf '%T@ %p\n' | sort -rn | tail -${backupquotadiff} | cut -f2- -d" " | xargs rm fn_print_ok_nl "Pruning: Clearing ${backupquotadiff} backup(s)" fn_script_log_pass "Pruning: Cleared ${backupquotadiff} backup(s)" - # If maxbackupdays is used over maxbackups + # If maxbackupdays is used over maxbackups. elif [ "${backupquotadiff}" -lt "${backupsoudatedcount}" ]; then - # Display how many backups will be cleared + # Display how many backups will be cleared. echo " * Pruning: ${backupsoudatedcount} backup(s) are older than ${maxbackupdays} days." fn_script_log_info "Pruning: ${backupsoudatedcount} backup(s) older than ${maxbackupdays} days." fn_sleep_time @@ -176,9 +176,9 @@ fn_backup_prune(){ } fn_backup_relpath() { - # Written by CedarLUG as a "realpath --relative-to" alternative in bash + # Written by CedarLUG as a "realpath --relative-to" alternative in bash. - # Populate an array of tokens initialized from the rootdir components: + # Populate an array of tokens initialized from the rootdir components. declare -a rdirtoks=($(readlink -f "${rootdir}" | sed "s/\// /g")) if [ ${#rdirtoks[@]} -eq 0 ]; then @@ -187,7 +187,7 @@ fn_backup_relpath() { core_exit.sh fi - # Populate an array of tokens initialized from the backupdir components: + # Populate an array of tokens initialized from the backupdir components. declare -a bdirtoks=($(readlink -f "${backupdir}" | sed "s/\// /g")) if [ ${#bdirtoks[@]} -eq 0 ]; then fn_print_fail_nl "Problem assessing backupdir during relative path assessment" @@ -195,14 +195,14 @@ fn_backup_relpath() { core_exit.sh fi - # Compare the leading entries of each array. These common elements will be clipped off + # Compare the leading entries of each array. These common elements will be clipped off. # for the relative path output. for ((base=0; base<${#rdirtoks[@]}; base++)) do [[ "${rdirtoks[$base]}" != "${bdirtoks[$base]}" ]] && break done - # Next, climb out of the remaining rootdir location with updir references... + # Next, climb out of the remaining rootdir location with updir references. for ((x=base;x<${#rdirtoks[@]};x++)) do echo -n "../" @@ -215,7 +215,7 @@ fn_backup_relpath() { done # In the event there were no directories left in the backupdir above to - # traverse down, just add a newline. Otherwise at this point, there is + # traverse down, just add a newline. Otherwise at this point, there is # one remaining directory component in the backupdir to navigate. if (( "$base" < "${#bdirtoks[@]}" )) ; then echo "${bdirtoks[ $(( ${#bdirtoks[@]} - 1)) ]}" @@ -224,7 +224,7 @@ fn_backup_relpath() { fi } -# Restart the server if it was stopped for the backup +# Restart the server if it was stopped for the backup. fn_backup_start_server(){ if [ "${serverstopped}" == "yes" ]; then exitbypass=1 @@ -232,7 +232,7 @@ fn_backup_start_server(){ fi } -# Run functions +# Run functions. fn_backup_check_lockfile fn_backup_create_lockfile fn_backup_init diff --git a/lgsm/functions/command_debug.sh b/lgsm/functions/command_debug.sh index 014b0aeb5..af7d6801a 100644 --- a/lgsm/functions/command_debug.sh +++ b/lgsm/functions/command_debug.sh @@ -10,7 +10,7 @@ local function_selfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" # Trap to remove lockfile on quit. fn_lockfile_trap(){ - # Remove lockfile + # Remove lockfile. rm -f "${rootdir}/${lockselfname}" # resets terminal. Servers can sometimes mess up the terminal on exit. reset @@ -23,7 +23,7 @@ check.sh fix.sh info_distro.sh info_config.sh -# NOTE: Check if works with server without parms. Could be intergrated in to info_parms.sh +# NOTE: Check if works with server without parms. Could be intergrated in to info_parms.sh. fn_parms fn_print_header echo -e "${blue}Distro:\t${default}${distroname}" @@ -35,7 +35,7 @@ echo -e "${blue}Avg Load:\t${default}${load}" echo -e "${blue}Free Memory:\t${default}${physmemfree}" echo -e "${blue}Free Disk:\t${default}${availspace}" -# glibc required +# glibc required. if [ -n "${glibc}" ]; then if [ "${glibc}" == "null" ]; then # Glibc is not required. @@ -49,19 +49,19 @@ if [ -n "${glibc}" ]; then fi fi -# Server ip +# Server IP if [ "${multiple_ip}" == "1" ]; then echo -e "${blue}Server IP:\t${default}NOT SET" else echo -e "${blue}Server IP:\t${default}${ip}:${port}" fi -# External server ip +# External server IP. if [ -n "${extip}" ]; then if [ "${ip}" != "${extip}" ]; then echo -e "${blue}Internet IP:\t${default}${extip}:${port}" fi fi -# Listed on Master Server +# Listed on Master Server. if [ "${masterserver}" ];then if [ "${masterserver}" == "true" ];then echo -e "${blue}Master Server:\t${green}${masterserver}${default}" @@ -69,7 +69,7 @@ if [ "${masterserver}" ];then echo -e "${blue}Master Server:\t${red}${masterserver}${default}" fi fi -# Server password +# Server password. if [ -n "${serverpassword}" ]; then echo -e "${blue}Server password:\t${default}${serverpassword}" fi @@ -97,7 +97,7 @@ fn_print_dots "Starting debug" fn_script_log_info "Starting debug" fn_print_ok_nl "Starting debug" -# Create lockfile +# Create lockfile. date > "${rootdir}/${lockselfname}" fn_script_log_info "Lockfile generated" fn_script_log_info "${rootdir}/${lockselfname}" @@ -105,7 +105,7 @@ fn_script_log_info "${rootdir}/${lockselfname}" trap fn_lockfile_trap INT cd "${executabledir}" || exit -# Note: do not add double quotes to ${executable} ${parms} +# Note: do not add double quotes to ${executable} ${parms}. if [ "${engine}" == "source" ]||[ "${engine}" == "goldsource" ]; then ${executable} ${parms} -debug elif [ "${engine}" == "realvirtuality" ]; then diff --git a/lgsm/functions/command_dev_detect_deps.sh b/lgsm/functions/command_dev_detect_deps.sh index d0dae61b2..ad431a722 100644 --- a/lgsm/functions/command_dev_detect_deps.sh +++ b/lgsm/functions/command_dev_detect_deps.sh @@ -61,7 +61,7 @@ while read -r lib; do local libs_array=( libtier0.so libtier0_srv.so libvstdlib_srv.so Core.so libvstdlib.so libtier0_s.so Editor.so Engine.so liblua.so libsteam_api.so ld-linux-x86-64.so.2 libPhysX3_x86.so libPhysX3Common_x86.so libPhysX3Cooking_x86.so) for lib_file in "${libs_array[@]}" do - # Known shared libs what dont requires dependencies + # Known shared libs what dont requires dependencies. if [ "${lib}" == "${lib_file}" ]; then libdetected=1 fi @@ -190,4 +190,4 @@ rm -f "${tmpdir}/.depdetect_readelf_uniq" rm -f "${tmpdir}/.depdetect_unknown" rm -f "${tmpdir}/.depdetect_unknown_uniq" -core_exit.sh \ No newline at end of file +core_exit.sh diff --git a/lgsm/functions/command_fastdl.sh b/lgsm/functions/command_fastdl.sh index f686e6126..bf75b8177 100644 --- a/lgsm/functions/command_fastdl.sh +++ b/lgsm/functions/command_fastdl.sh @@ -11,18 +11,18 @@ local function_selfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" check.sh -# Directories +# Directories. if [ -z "${webdir}" ]; then webdir="${rootdir}/public_html" fi fastdldir="${webdir}/fastdl" addonsdir="${systemdir}/addons" -# Server lua autorun dir, used to autorun lua on client connect to the server +# Server lua autorun dir, used to autorun lua on client connect to the server. luasvautorundir="${systemdir}/lua/autorun/server" luafastdlfile="lgsm_cl_force_fastdl.lua" luafastdlfullpath="${luasvautorundir}/${luafastdlfile}" -# Check if bzip2 is installed +# Check if bzip2 is installed. if [ -z "$(command -v bzip2 2>/dev/null)" ]; then fn_print_fail "bzip2 is not installed" fn_script_log_fatal "bzip2 is not installed" @@ -34,11 +34,11 @@ fn_print_header echo "More info: https://docs.linuxgsm.com/commands/fastdl" echo "" -# Prompts user for FastDL creation settings +# Prompts user for FastDL creation settings. echo "${commandaction} setup" echo "=================================" -# Prompt for clearing old files if directory was already here +# Prompt for clearing old files if directory was already here. if [ -d "${fastdldir}" ]; then fn_print_warning_nl "FastDL directory already exists." echo "${fastdldir}" @@ -50,9 +50,9 @@ if [ -d "${fastdldir}" ]; then fi fi -# Garry's Mod Specific +# Garry's Mod Specific. if [ "${shortname}" == "gmod" ]; then - # Prompt for download enforcer, which is using a .lua addfile resource generator + # 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" @@ -62,9 +62,9 @@ if [ "${shortname}" == "gmod" ]; then fi fi -# Clears any fastdl directory content +# Clears any fastdl directory content. fn_clear_old_fastdl(){ - # Clearing old FastDL + # Clearing old FastDL. if [ -d "${fastdldir}" ]; then echo -en "clearing existing FastDL directory ${fastdldir}..." rm -R "${fastdldir:?}" @@ -82,7 +82,7 @@ fn_clear_old_fastdl(){ } fn_fastdl_dirs(){ - # Check and create directories + # Check and create directories. if [ ! -d "${webdir}" ]; then echo -en "creating web directory ${webdir}..." mkdir -p "${webdir}" @@ -143,9 +143,9 @@ fn_human_readable_file_size(){ fi } -# Provides info about the fastdl directory content and prompts for confirmation +# Provides info about the fastdl directory content and prompts for confirmation. fn_fastdl_preview(){ - # Remove any file list + # Remove any file list. if [ -f "${tmpdir}/fastdl_files_to_compress.txt" ]; then rm -f "${tmpdir}/fastdl_files_to_compress.txt" fi @@ -206,7 +206,7 @@ fn_fastdl_preview(){ echo "calculating total file size..." fn_sleep_time totalfiles=$(wc -l < "${tmpdir}/fastdl_files_to_compress.txt") - # Calculates total file size + # Calculates total file size. while read -r dufile; do filesize=$(stat -c %s "${dufile}") filesizetotal=$(( ${filesizetotal} + ${filesize} )) @@ -231,7 +231,7 @@ fn_fastdl_preview(){ fi } -# Builds Garry's Mod fastdl directory content +# Builds Garry's Mod fastdl directory content. fn_fastdl_gmod(){ cd "${systemdir}" || exit for allowed_extention in "${allowed_extentions_array[@]}" @@ -256,7 +256,7 @@ fn_fastdl_gmod(){ fn_print_ok_eol_nl fi done - # Correct addons directory structure for FastDL + # Correct addons directory structure for FastDL. if [ -d "${fastdldir}/addons" ]; then echo -en "updating addons file structure..." cp -Rf "${fastdldir}"/addons/*/* "${fastdldir}" @@ -269,7 +269,7 @@ fn_fastdl_gmod(){ fn_print_ok_eol_nl fn_script_log_pass "Updating addons file structure" fi - # Clear addons directory in fastdl + # Clear addons directory in fastdl. echo -en "clearing addons dir from fastdl dir..." fn_sleep_time rm -R "${fastdldir:?}/addons" @@ -283,7 +283,7 @@ fn_fastdl_gmod(){ 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 + # 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..." fn_sleep_time @@ -300,7 +300,7 @@ fn_fastdl_gmod(){ fi if [ -f "${tmpdir}/fastdl_files_to_compress.txt" ]; then totalfiles=$(wc -l < "${tmpdir}/fastdl_files_to_compress.txt") - # Calculates total file size + # Calculates total file size. while read dufile; do filesize=$(du -b "${dufile}" | awk '{ print $1 }') filesizetotal=$(( ${filesizetotal} + ${filesize} )) @@ -353,9 +353,9 @@ fn_fastdl_source(){ done } -# Builds the fastdl directory content +# Builds the fastdl directory content. fn_fastdl_build(){ - # Copy all needed files for FastDL + # Copy all needed files for FastDL. echo -e "copying files to ${fastdldir}" fn_script_log_info "Copying files to ${fastdldir}" if [ "${shortname}" == "gmod" ]; then @@ -366,9 +366,9 @@ fn_fastdl_build(){ fi } -# Generate lua file that will force download any file into the FastDL directory +# Generate lua file that will force download any file into the FastDL directory. fn_fastdl_gmod_dl_enforcer(){ - # Clear old lua file + # Clear old lua file. if [ -f "${luafastdlfullpath}" ]; then echo -en "removing existing download enforcer: ${luafastdlfile}..." rm "${luafastdlfullpath:?}" @@ -382,11 +382,11 @@ fn_fastdl_gmod_dl_enforcer(){ fn_script_log_pass "Removing existing download enforcer ${luafastdlfullpath}" fi fi - # Generate new one if user said yes + # Generate new one if user said yes. 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 + # Read all filenames and put them into a lua file at the right path. while read -r line; do echo "resource.AddFile( \"${line}\" )" >> "${luafastdlfullpath}" done < <(find "${fastdldir:?}" \( -type f ! -name "*.bz2" \) -printf '%P\n') @@ -402,7 +402,7 @@ fn_fastdl_gmod_dl_enforcer(){ fi } -# Compresses FastDL files using bzip2 +# Compresses FastDL files using bzip2. fn_fastdl_bzip2(){ while read -r filetocompress; do echo -en "\r\033[Kcompressing ${filetocompress}..." @@ -419,13 +419,13 @@ fn_fastdl_bzip2(){ fn_print_ok_eol_nl } -# Run functions +# Run functions. fn_fastdl_preview fn_clear_old_fastdl fn_fastdl_dirs fn_fastdl_build fn_fastdl_bzip2 -# Finished message +# Finished message. echo "FastDL files are located in:" echo "${fastdldir}" echo "FastDL completed" diff --git a/lgsm/functions/command_install.sh b/lgsm/functions/command_install.sh index 2d0a4aa30..c1192a60a 100644 --- a/lgsm/functions/command_install.sh +++ b/lgsm/functions/command_install.sh @@ -18,7 +18,7 @@ else install_logs.sh check_deps.sh installflag=1 - # Download and install + # Download and install. if [ "${shortname}" == "ut2k4" ]; then install_server_files.sh install_ut2k4_key.sh @@ -30,7 +30,7 @@ else install_server_files.sh fi - # Configuration + # Configuration. install_config.sh if [ -v "${gslt}" ]; then install_gslt.sh diff --git a/lgsm/functions/command_mods_install.sh b/lgsm/functions/command_mods_install.sh index 38bc4979a..cac08929d 100644 --- a/lgsm/functions/command_mods_install.sh +++ b/lgsm/functions/command_mods_install.sh @@ -14,17 +14,17 @@ mods_core.sh fn_print_header -# Displays a list of installed mods +# Displays a list of installed mods. fn_mods_installed_list if [ "${installedmodscount}" -gt "0" ]; then echo "Installed addons/mods" echo "=================================" - # Go through all available commands, get details and display them to the user + # 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 + # 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 + # Display mod info to the user. echo -e " * ${green}${modcommand}${default}${default}" done echo "" @@ -32,25 +32,25 @@ fi echo "Available addons/mods" echo "=================================" -# Display available mods from mods_list.sh +# Display available mods from mods_list.sh. # Set and reset vars compatiblemodslistindex=0 -# As long as we're within index values +# As long as we're within index values. while [ "${compatiblemodslistindex}" -lt "${#compatiblemodslist[@]}" ]; do - # Set values for convenience + # Set values for convenience. displayedmodname="${compatiblemodslist[compatiblemodslistindex]}" displayedmodcommand="${compatiblemodslist[compatiblemodslistindex+1]}" displayedmodsite="${compatiblemodslist[compatiblemodslistindex+2]}" displayedmoddescription="${compatiblemodslist[compatiblemodslistindex+3]}" - # Output mods to the user + # Output mods to the user. echo -e "${displayedmodname} - ${displayedmoddescription} - ${displayedmodsite}" echo -e " * ${cyan}${displayedmodcommand}${default}" - # Increment index from the amount of values we just displayed + # Increment index from the amount of values we just displayed. let "compatiblemodslistindex+=4" ((totalmodsavailable++)) done -# If no mods are available for a specific game +# If no mods are available for a specific game. if [ -z "${compatiblemodslist}" ]; then fn_print_fail_nl "No mods are currently available for ${gamename}." fn_script_log_info "No mods are currently available for ${gamename}." @@ -58,20 +58,20 @@ if [ -z "${compatiblemodslist}" ]; then fi fn_script_log_info "${totalmodsavailable} addons/mods are available for install" -## User selects a mod +## 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 + # 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 -# Get mod info +# Get mod info. currentmod="${usermodselect}" fn_mod_get_info @@ -80,7 +80,7 @@ echo "Installing ${modprettyname}" echo "=================================" fn_script_log_info "${modprettyname} selected for install" -# Check if the mod is already installed and warn the user +# 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" @@ -93,7 +93,7 @@ if [ -f "${modsinstalledlistfullpath}" ]; then fi fi -## Installation +## Installation. fn_create_mods_dir fn_mods_clear_tmp_dir diff --git a/lgsm/functions/command_mods_remove.sh b/lgsm/functions/command_mods_remove.sh index 344f9e2a9..9c64d4808 100644 --- a/lgsm/functions/command_mods_remove.sh +++ b/lgsm/functions/command_mods_remove.sh @@ -17,27 +17,27 @@ fn_print_header echo "Remove addons/mods" echo "=================================" -## Displays list of installed mods -# Generates list to display to user +# 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 + # Current mod is the "mlindex" value of the array we are going through. currentmod="${installedmodslist[mlindex]}" - # Get mod info + # Get mod info. fn_mod_get_info - # Display mod info to the user + # Display mod info to the user. echo -e "${red}${modcommand}${default} - ${modprettyname} - ${moddescription}" done echo "" -# 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 [[ ! " ${installedmodslist[@]} " =~ " ${usermodselect} " ]]; do echo -en "Enter an ${cyan}addon/mod${default} to ${red}remove${default} (or exit to abort): " read -r usermodselect - # Exit if user says exit or abort + # 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 @@ -53,19 +53,19 @@ currentmod="${usermodselect}" fn_mod_get_info fn_check_mod_files_list -# Uninstall the mod +# Uninstall the mod. fn_script_log_info "Removing ${modsfilelistsize} files from ${modprettyname}" echo -e "removing ${modprettyname}" echo -e "* ${modsfilelistsize} files to be removed" echo -e "* location: ${modinstalldir}" fn_sleep_time -# Go through every file and remove it +# Go through every file and remove it. modfileline="1" tput sc while [ "${modfileline}" -le "${modsfilelistsize}" ]; do - # Current line defines current file to remove + # Current line defines current file to remove. currentfileremove="$(sed "${modfileline}q;d" "${modsdir}/${modcommand}-files.txt")" - # If file or directory exists, then remove it + # If file or directory exists, then remove it. if [ -f "${modinstalldir}/${currentfileremove}" ]||[ -d "${modinstalldir}/${currentfileremove}" ]; then rm -rf "${modinstalldir:?}/${currentfileremove}" @@ -88,7 +88,7 @@ else fn_print_ok_eol_nl fi fn_sleep_time -# Remove file list +# Remove file list. echo -en "removing ${modcommand}-files.txt..." fn_sleep_time rm -rf "${modsdir}/${modcommand}-files.txt" @@ -102,7 +102,7 @@ else fn_print_ok_eol_nl fi -# Remove mods from installed mods list +# Remove mods from installed mods list. echo -en "removing ${modcommand} from ${modsinstalledlist}..." fn_sleep_time @@ -118,7 +118,7 @@ else fi # Oxide fix -# Oxide replaces server files, so a validate is required after uninstall +# 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" diff --git a/lgsm/functions/command_mods_update.sh b/lgsm/functions/command_mods_update.sh index 43eb1cb80..70a91cf5e 100644 --- a/lgsm/functions/command_mods_update.sh +++ b/lgsm/functions/command_mods_update.sh @@ -12,23 +12,23 @@ local function_selfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" check.sh mods_core.sh -# Prevents specific files being overwritten upon update (set by ${modkeepfiles}) -# For that matter, remove cfg files after extraction before copying them to destination +# 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 echo -e "the following files/directories will be preserved:" fn_sleep_time - # Count how many files there are to remove + # Count how many files there are to remove. filestopreserve="$(echo "${modkeepfiles}" | awk -F ';' '{ print NF }')" - # Test all subvalues of "modkeepfiles" using the ";" separator + # Test all subvalues of "modkeepfiles" using the ";" separator. for ((preservefilesindex=1; preservefilesindex < ${filestopreserve}; preservefilesindex++)); do - # Put the current file we are looking for into a variable + # Put the current file we are looking for into a variable. 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 it matches an existing file that have been extracted delete the file. 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 + # 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 @@ -43,22 +43,22 @@ fn_mods_check_installed 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 +# 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 + # 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 + # Display installed mods and the update policy. if [ -z "${modkeepfiles}" ]; then - # If modkeepfiles is not set for some reason, that's a problem + # If modkeepfiles is not set for some reason, that's a problem. 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 + # If the mod won't get updated. elif [ "${modkeepfiles}" == "NOUPDATE" ]; then echo -e " * ${red}{modprettyname}${default} (won't be updated)" - # If the mode is just overwritten + # If the mode is just overwritten. elif [ "${modkeepfiles}" == "OVERWRITE" ]; then echo -e " * ${modprettyname} (overwrite)" else @@ -67,14 +67,14 @@ for ((ulindex=0; ulindex < ${#installedmodslist[@]}; ulindex++)); do done ## Update -# List all installed mods and apply update -# Reset line value +# List all installed mods and apply update. +# Reset line value. installedmodsline="1" while [ "${installedmodsline}" -le "${installedmodscount}" ]; do 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" + # 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" diff --git a/lgsm/functions/command_postdetails.sh b/lgsm/functions/command_postdetails.sh index 50dc4798f..e0967117f 100644 --- a/lgsm/functions/command_postdetails.sh +++ b/lgsm/functions/command_postdetails.sh @@ -31,10 +31,10 @@ 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 +# This, too, may be overridden from the command line at the top-level. postexpire="${postexpire="30D"}" -# source all of the functions defined in the details command +# source all of the functions defined in the details command. info_messages.sh fn_bad_postdetailslog() { @@ -42,12 +42,12 @@ fn_bad_postdetailslog() { core_exit.sh } -# Remove any existing postdetails.log file +# Remove any existing postdetails.log file. if [ -f "${postdetailslog}" ]; then rm -f "${postdetailslog}" fi -# Rather than a one-pass sed parser, default to using a temporary directory +# Rather than a one-pass sed parser, default to using a temporary directory. if [ -n "${alertflag}" ]; then postdetailslog="${alertlog}" else diff --git a/lgsm/functions/command_start.sh b/lgsm/functions/command_start.sh index 1ab7b4403..d955aef17 100644 --- a/lgsm/functions/command_start.sh +++ b/lgsm/functions/command_start.sh @@ -28,9 +28,9 @@ fn_start_teamspeak3(){ if [ -f "${lgsmlog}" ]; then mv "${lgsmlog}" "${lgsmlogdate}" fi - # Create lockfile + # Create lockfile. date > "${rootdir}/${lockselfname}" - # Accept license + # Accept license. if [ ! -f "${executabledir}/.ts3server_license_accepted" ]; then install_eula.sh fi @@ -59,7 +59,7 @@ fn_start_tmux(){ else fn_parms fi - # check for tmux size variables + # check for tmux size variables. if [[ "${servercfgtmuxwidth}" =~ ^[0-9]+$ ]]; then sessionwidth="${servercfgtmuxwidth}" else @@ -71,7 +71,7 @@ fn_start_tmux(){ sessionheight="23" fi - # Log rotation + # Log rotation. fn_script_log_info "Rotating log files" if [ "${engine}" == "unreal2" ]&&[ -f "${gamelog}" ]; then mv "${gamelog}" "${gamelogdate}" @@ -83,17 +83,17 @@ fn_start_tmux(){ mv "${consolelog}" "${consolelogdate}" fi - # Create lockfile + # Create lockfile. date > "${rootdir}/${lockselfname}" cd "${executabledir}" tmux new-session -d -x "${sessionwidth}" -y "${sessionheight}" -s "${servicename}" "${executable} ${parms}" 2> "${lgsmlogdir}/.${servicename}-tmux-error.tmp" - # Create logfile + # Create logfile. touch "${consolelog}" - # Get tmux version + # Get tmux version. tmuxversion="$(tmux -V | sed "s/tmux //" | sed -n '1 p')" - # Tmux compiled from source will return "master", therefore ignore it + # Tmux compiled from source will return "master", therefore ignore it. if [ "$(tmux -V | sed "s/tmux //" | sed -n '1 p')" == "master" ]; then fn_script_log "Tmux version: master (user compiled)" echo "Tmux version: master (user compiled)" >> "${consolelog}" @@ -101,20 +101,20 @@ fn_start_tmux(){ tmux pipe-pane -o -t "${servicename}" "exec cat >> '${consolelog}'" fi elif [ -n "${tmuxversion}" ]; then - # Get the digit version of tmux + # Get the digit version of tmux. tmuxversion="$(tmux -V | sed "s/tmux //" | sed -n '1 p' | tr -cd '[:digit:]')" - # tmux pipe-pane not supported in tmux versions < 1.6 + # tmux pipe-pane not supported in tmux versions < 1.6. if [ "${tmuxversion}" -lt "16" ]; then echo "Console logging disabled: Tmux => 1.6 required https://linuxgsm.com/tmux-upgrade Currently installed: $(tmux -V)" > "${consolelog}" - # Console logging disabled: Bug in tmux 1.8 breaks logging + # Console logging disabled: Bug in tmux 1.8 breaks logging. elif [ "${tmuxversion}" -eq "18" ]; then echo "Console logging disabled: Bug in tmux 1.8 breaks logging https://linuxgsm.com/tmux-upgrade Currently installed: $(tmux -V)" > "${consolelog}" - # Console logging enable or not set + # Console logging enable or not set. elif [ "${consolelogging}" == "on" ]||[ -z "${consolelogging}" ]; then tmux pipe-pane -o -t "${servicename}" "exec cat >> '${consolelog}'" fi @@ -123,14 +123,14 @@ fn_start_tmux(){ fn_script_log_warn "Unable to detect tmux version" fi -# Console logging disabled +# Console logging disabled. if [ "${consolelogging}" == "off" ]; then echo "Console logging disabled by user" >> "${consolelog}" fn_script_log_info "Console logging disabled by user" fi fn_sleep_time - # If the server fails to start + # If the server fails to start. check_status.sh if [ "${status}" == "0" ]; then fn_print_fail_nl "Unable to start ${servername}" @@ -187,8 +187,9 @@ fn_sleep_time fn_print_dots "${servername}" check.sh -# Is the server already started -if [ "${status}" != "0" ]; then # $status comes from check_status.sh, which is run by check.sh for this command +# Is the server already started. +# $status comes from check_status.sh, which is run by check.sh for this command +if [ "${status}" != "0" ]; then fn_print_info_nl "${servername} is already running" fn_script_log_error "${servername} is already running" if [ -z "${exitbypass}" ]; then @@ -201,7 +202,7 @@ fi info_config.sh logs.sh -# Will check for updates is updateonstart is yes +# Will check for updates is updateonstart is yes. if [ "${updateonstart}" == "yes" ]||[ "${updateonstart}" == "1" ]||[ "${updateonstart}" == "on" ]; then exitbypass=1 unset updateonstart diff --git a/lgsm/functions/command_stop.sh b/lgsm/functions/command_stop.sh index 9aadfbe54..ad3b64882 100644 --- a/lgsm/functions/command_stop.sh +++ b/lgsm/functions/command_stop.sh @@ -9,13 +9,13 @@ local commandname="STOP" local commandaction="Stopping" local function_selfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" -# Attempts graceful shutdown by sending the 'CTRL+c'. +# Attempts graceful shutdown by sending 'CTRL+c'. fn_stop_graceful_ctrlc(){ fn_print_dots "Graceful: CTRL+c" fn_script_log_info "Graceful: CTRL+c" - # sends quit + # Sends quit. tmux send-keys -t "${servicename}" C-c > /dev/null 2>&1 - # waits up to 30 seconds giving the server time to shutdown gracefuly + # 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 @@ -38,13 +38,13 @@ fn_stop_graceful_ctrlc(){ # Attempts graceful shutdown by sending a specified command. # Usage: fn_stop_graceful_cmd "console_command" "timeout_in_seconds" -# e.g.: fn_stop_graceful_cmd "quit" "30" +# e.g.: fn_stop_graceful_cmd "quit" "30" fn_stop_graceful_cmd(){ fn_print_dots "Graceful: sending \"${1}\"" fn_script_log_info "Graceful: sending \"${1}\"" - # sends specific stop command + # Sends specific stop command. tmux send -t "${servicename}" "${1}" ENTER > /dev/null 2>&1 - # waits up to given seconds giving the server time to shutdown gracefully + # Waits up to ${seconds} seconds giving the server time to shutdown gracefully. for ((seconds=1; seconds<=${2}; seconds++)); do check_status.sh if [ "${status}" == "0" ]; then @@ -65,16 +65,15 @@ fn_stop_graceful_cmd(){ fn_sleep_time } -# 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. +# Attempts graceful shutdown of goldsource using rcon 'quit' command. +# There is only a 3 second delay before a forced a tmux shutdown +# as Goldsource servers 'quit' command does a restart rather than shutdown. fn_stop_graceful_goldsource(){ 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 + # Waits 3 seconds as goldsource servers restart with the quit command. for seconds in {1..3}; do sleep 1 fn_print_dots "Graceful: sending \"quit\": ${seconds}" @@ -84,7 +83,6 @@ fn_stop_graceful_goldsource(){ fn_script_log_pass "Graceful: sending \"quit\": OK: ${seconds} seconds" } -# Attempts graceful of 7 Days To Die using telnet. fn_stop_telnet_sdtd(){ if [ -z "${telnetpass}" ]||[ "${telnetpass}" == "NOT SET" ]; then sdtd_telnet_shutdown=$( expect -c ' @@ -121,6 +119,7 @@ fn_stop_telnet_sdtd(){ fi } +# Attempts graceful shutdown of 7 Days To Die using telnet. fn_stop_graceful_sdtd(){ fn_print_dots "Graceful: telnet" fn_script_log_info "Graceful: telnet" @@ -143,8 +142,8 @@ fn_stop_graceful_sdtd(){ fi done - # If telnet was successful will use telnet again to check the connection has closed - # This confirms that the tmux session can now be killed. + # If telnet shutdown was successful will use telnet again to check + # the connection has closed, confirming that the tmux session can now be killed. if [ -n "${completed}" ]; then for seconds in {1..30}; do fn_stop_telnet_sdtd @@ -158,8 +157,7 @@ fn_stop_graceful_sdtd(){ sleep 1 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 + # If telnet shutdown fails tmux shutdown will be used, this risks loss of world save. else if [ -n "${refused}" ]; then fn_print_error "Graceful: telnet: " @@ -185,26 +183,28 @@ fn_stop_graceful_sdtd(){ fn_stop_graceful_select(){ if [ "${shortname}" == "sdtd" ]; then fn_stop_graceful_sdtd - elif [ "${engine}" == "Spark" ]; then + elif [ "${engine}" == "spark" ]; then fn_stop_graceful_cmd "q" 30 elif [ "${shortname}" == "terraria" ]; then fn_stop_graceful_cmd "exit" 30 elif [ "${shortname}" == "mc" ]; then fn_stop_graceful_cmd "stop" 30 elif [ "${shortname}" == "mta" ]; then - # we need a long wait time here as resources are stopped individually and process their own shutdowns + # Long wait time required for mta + # as resources shutdown individually. fn_stop_graceful_cmd "quit" 120 elif [ "${engine}" == "goldsource" ]; then fn_stop_graceful_goldsource elif [ "${engine}" == "unity3d" ]||[ "${engine}" == "unreal4" ]||[ "${engine}" == "unreal3" ]||[ "${engine}" == "unreal2" ]||[ "${engine}" == "unreal" ]||[ "${shortname}" == "fctr" ]||[ "${shortname}" == "mumble" ]||[ "${shortname}" == "wurm" ]||[ "${shortname}" == "jc2" ]||[ "${shortname}" == "jc3" ]; then fn_stop_graceful_ctrlc - elif [ "${engine}" == "source" ]||[ "${engine}" == "quake" ]||[ "${engine}" == "idtech2" ]||[ "${engine}" == "idtech3" ]||[ "${engine}" == "idtech3_ql" ]||[ "${shortname}" == "jc2" ]||[ "${shortname}" == "pz" ]||[ "${shortname}" == "rw" ]; then + elif [ "${engine}" == "source" ]||[ "${engine}" == "quake" ]||[ "${engine}" == "idtech2" ]||[ "${engine}" == "idtech3" ]||[ "${engine}" == "idtech3_ql" ]||[ "${shortname}" == "pz" ]||[ "${shortname}" == "rw" ]; then fn_stop_graceful_cmd "quit" 30 fi } fn_stop_ark(){ - maxpiditer=15 # The maximum number of times to check if the ark pid has closed gracefully. + # The maximum number of times to check if the ark pid has closed gracefully. + maxpiditer=15 info_config.sh if [ -z "${queryport}" ]; then fn_print_warn "No queryport found using info_config.sh" @@ -222,16 +222,15 @@ fn_stop_ark(){ 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 + # 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}" else - break # Our job is done here - fi # end if for pid range check + break + fi done if [[ ${pidcheck} -eq ${maxpiditer} ]] ; then # The process doesn't want to close after 20 seconds. @@ -239,15 +238,14 @@ fn_stop_ark(){ fn_print_error "Terminating reluctant Ark process: ${pid}" kill -9 ${pid} fi - fi # end if for port check -} # end of fn_stop_ark + fi +} fn_stop_teamspeak3(){ fn_print_dots "${servername}" "${serverfiles}"/ts3server_startscript.sh stop > /dev/null 2>&1 check_status.sh if [ "${status}" == "0" ]; then - # Remove lockfile rm -f "${rootdir}/${lockselfname}" fn_print_ok_nl "${servername}" fn_script_log_pass "Stopped ${servername}" @@ -265,7 +263,7 @@ fn_stop_tmux(){ fn_sleep_time check_status.sh if [ "${status}" == "0" ]; then - # ARK doesn't clean up immediately after tmux is killed. + # ARK does not clean up immediately after tmux is killed. # Make certain the ports are cleared before continuing. if [ "${shortname}" == "ark" ]; then fn_stop_ark @@ -278,10 +276,9 @@ fn_stop_tmux(){ fi } -# checks if the server is already stopped before trying to stop. +# Checks if the server is already stopped. fn_stop_pre_check(){ -# Is the server already stopped - if [ "${status}" == "0" ]; then # $status comes from check_status.sh, which is run by check.sh for this command + if [ "${status}" == "0" ]; then fn_print_info_nl "${servername} is already stopped" fn_script_log_error "${servername} is already stopped" elif [ "${shortname}" == "ts3" ]; then @@ -289,7 +286,7 @@ fn_stop_pre_check(){ else fn_stop_graceful_select fi - # Check status again, a stop tmux session if needed + # Check status again, a stop tmux session if needed. check_status.sh if [ "${status}" != "0" ]; then fn_stop_tmux @@ -300,7 +297,7 @@ fn_print_dots "${servername}" check.sh info_config.sh fn_stop_pre_check -# Remove lockfile +# Remove lockfile. if [ -f "${rootdir}/${lockselfname}" ]; then rm -f "${rootdir}/${lockselfname}" fi diff --git a/lgsm/functions/command_ts3_server_pass.sh b/lgsm/functions/command_ts3_server_pass.sh index 46a028a98..f1b18560e 100644 --- a/lgsm/functions/command_ts3_server_pass.sh +++ b/lgsm/functions/command_ts3_server_pass.sh @@ -25,7 +25,7 @@ fn_serveradmin_password_prompt(){ fn_serveradmin_password_set(){ fn_print_info_nl "Starting server with new password..." fn_script_log_info "Starting server with new password" - # Start server in "new password mode" + # Start server in "new password mode". ts3serverpass="1" exitbypass="1" command_start.sh @@ -33,12 +33,12 @@ fn_serveradmin_password_set(){ fn_script_log_pass "New ServerAdmin password applied" } -# Running functions +# Running functions. check.sh fn_serveradmin_password_prompt check_status.sh if [ "${status}" != "0" ]; then - # Stop any running server + # Stop any running server. exitbypass="1" command_stop.sh fn_serveradmin_password_set diff --git a/lgsm/functions/command_update_linuxgsm.sh b/lgsm/functions/command_update_linuxgsm.sh index 5d8422936..4a70c7748 100644 --- a/lgsm/functions/command_update_linuxgsm.sh +++ b/lgsm/functions/command_update_linuxgsm.sh @@ -14,7 +14,7 @@ fn_script_log_info "Updating LinuxGSM" echo -en "\n" if [ -z "${legacymode}" ]; then - # Check and update _default.cfg + # Check and update _default.cfg. echo -en " checking config _default.cfg...\c" 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 @@ -71,7 +71,7 @@ if [ -z "${legacymode}" ]; then fi fi -# Check and update functions +# Check and update functions. if [ -n "${functionsdir}" ]; then if [ -d "${functionsdir}" ]; then cd "${functionsdir}" || exit diff --git a/lgsm/functions/command_wipe.sh b/lgsm/functions/command_wipe.sh index 7a98c2155..12e85d90d 100644 --- a/lgsm/functions/command_wipe.sh +++ b/lgsm/functions/command_wipe.sh @@ -13,7 +13,7 @@ check.sh fn_print_header fn_script_log "Entering ${gamename} ${commandaction}" -# Process to server wipe +# Process to server wipe. fn_wipe_server_process(){ check_status.sh if [ "${status}" != "0" ]; then @@ -29,7 +29,7 @@ fn_wipe_server_process(){ fn_script_log "server data wiped." } -# Provides an exit code upon error +# Provides an exit code upon error. fn_wipe_exit_code(){ ((exitcode=$?)) if [ ${exitcode} -ne 0 ]; then @@ -40,11 +40,11 @@ fn_wipe_exit_code(){ fi } -# Removes files to wipe server +# Removes files to wipe server. fn_wipe_server_remove_files(){ - # Rust Wipe + # Rust Wipe. if [ "${shortname}" == "rust" ]; then - # Wipe pocedural map + # Wipe pocedural map. if [ -n "$(find "${serveridentitydir}" -type f -name "proceduralmap.*.map")" ]; then currentaction="Removing map file(s): ${serveridentitydir}/proceduralmap.*.map" echo -en "Removing procedural map proceduralmap.*.map file(s)..." @@ -57,7 +57,7 @@ fn_wipe_server_remove_files(){ fn_print_information_nl "No procedural map file to remove" fn_script_log_info "No procedural map file to remove." fi - # Wipe procedural map save + # Wipe procedural map save. if [ -n "$(find "${serveridentitydir}" -type f -name "proceduralmap.*.sav")" ]; then currentaction="Removing procedural map save(s): ${serveridentitydir}/proceduralmap.*.sav" echo -en "Removing map saves proceduralmap.*.sav file(s)..." @@ -70,7 +70,7 @@ fn_wipe_server_remove_files(){ fn_print_information_nl "No procedural map save to remove" fn_script_log_info "No procedural map save to remove." fi - # Wipe Barren map + # Wipe Barren map. if [ -n "$(find "${serveridentitydir}" -type f -name "barren*.map")" ]; then currentaction="Removing map file(s): ${serveridentitydir}/barren*.map" echo -en "Removing barren map barren*.map file(s)..." @@ -83,7 +83,7 @@ fn_wipe_server_remove_files(){ fn_print_information_nl "No barren map file to remove" fn_script_log_info "No barren map file to remove." fi - # Wipe barren map save + # Wipe barren map save. if [ -n "$(find "${serveridentitydir}" -type f -name "barren*.sav")" ]; then currentaction="Removing barren map save(s): ${serveridentitydir}/barren*.sav" echo -en "Removing barren map saves barren*.sav file(s)..." @@ -96,7 +96,7 @@ fn_wipe_server_remove_files(){ fn_print_information_nl "No barren map save to remove" fn_script_log_info "No barren map save to remove." fi - # Wipe user dir, might be a legacy thing, maybe to be removed + # Wipe user dir, might be a legacy thing, maybe to be removed. if [ -d "${serveridentitydir}/user" ]; then currentaction="Removing user directory: ${serveridentitydir}/user" echo -en "Removing user directory..." @@ -105,9 +105,9 @@ fn_wipe_server_remove_files(){ rm -rf "${serveridentitydir:?}/user" fn_wipe_exit_code fn_sleep_time - # We do not print additional information if there is nothing to remove since this might be obsolete + # We do not print additional information if there is nothing to remove since this might be obsolete. fi - # Wipe storage dir, might be a legacy thing, maybe to be removed + # Wipe storage dir, might be a legacy thing, maybe to be removed. if [ -d "${serveridentitydir}/storage" ]; then currentaction="Removing storage directory: ${serveridentitydir}/storage" echo -en "Removing storage directory..." @@ -116,9 +116,9 @@ fn_wipe_server_remove_files(){ rm -rf "${serveridentitydir:?}/storage" fn_wipe_exit_code fn_sleep_time - # We do not print additional information if there is nothing to remove since this might be obsolete + # We do not print additional information if there is nothing to remove since this might be obsolete. fi - # Wipe sv.files + # Wipe sv.files. if [ -n "$(find "${serveridentitydir}" -type f -name "sv.files.*.db")" ]; then currentaction="Removing server misc files: ${serveridentitydir}/sv.files.*.db" echo -en "Removing server misc srv.files*.db file(s)..." @@ -127,9 +127,9 @@ fn_wipe_server_remove_files(){ find "${serveridentitydir:?}" -type f -name "sv.files.*.d" -delete fn_wipe_exit_code fn_sleep_time - # No further information if not found because it should I could not get this file showing up + # No further information if not found because it should I could not get this file showing up. fi - # Wipe player death files + # Wipe player death files. if [ -n "$(find "${serveridentitydir}" -type f -name "player.deaths.*.db")" ]; then currentaction="Removing player death files: ${serveridentitydir}/player.deaths.*.db" echo -en "Removing player deaths player.deaths.*.db file(s)..." @@ -142,7 +142,7 @@ fn_wipe_server_remove_files(){ fn_print_information_nl "No player death to remove" fn_script_log_info "No player death to remove." fi - # Wipe blueprints only if wipeall command was used + # Wipe blueprints only if wipeall command was used. if [ "${wipeall}" == "1" ]; then if [ -n "$(find "${serveridentitydir}" -type f -name "player.blueprints.*.db")" ]; then currentaction="Removing blueprint file(s): ${serveridentitydir}/player.blueprints.*.db" @@ -164,7 +164,7 @@ fn_wipe_server_remove_files(){ fn_script_log_info "No blueprints found." fn_sleep_time fi - # Wipe some logs that might be there + # Wipe some logs that might be there. if [ -n "$(find "${serveridentitydir}" -type f -name "Log.*.txt")" ]; then currentaction="Removing log files: ${serveridentitydir}/Log.*.txt" echo -en "Removing Log files..." @@ -173,14 +173,14 @@ fn_wipe_server_remove_files(){ find "${serveridentitydir:?}" -type f -name "Log.*.txt" -delete fn_wipe_exit_code fn_sleep_time - # We do not print additional information if there are no logs to remove + # We do not print additional information if there are no logs to remove. fi - # You can add an "elif" here to add another game or engine + # You can add an "elif" here to add another game or engine. fi } -# Check if there is something to wipe, prompt the user, and call appropriate functions -# Rust Wipe +# Check if there is something to wipe, prompt the user, and call appropriate functions. +# Rust Wipe. if [ "${shortname}" == "rust" ]; then if [ -d "${serveridentitydir}/storage" ]||[ -d "${serveridentitydir}/user" ]||[ -n "$(find "${serveridentitydir}" -type f -name "proceduralmap*.sav")" ]||[ -n "$(find "${serveridentitydir}" -type f -name "barren*.sav")" ]||[ -n "$(find "${serveridentitydir}" -type f -name "Log.*.txt")" ]||[ -n "$(find "${serveridentitydir}" -type f -name "player.deaths.*.db")" ]||[ -n "$(find "${serveridentitydir}" -type f -name "player.blueprints.*.db")" ]||[ -n "$(find "${serveridentitydir}" -type f -name "sv.files.*.db")" ]; then fn_print_warning_nl "Any user, storage, log and map data from ${serveridentitydir} will be erased." @@ -195,9 +195,9 @@ if [ "${shortname}" == "rust" ]; then fn_script_log_info "No data to wipe was found." core_exit.sh fi -# You can add an "elif" here to add another game or engine +# You can add an "elif" here to add another game or engine. else - # Game not listed + # Game not listed. fn_print_information_nl "Wipe is not available for this game" fn_script_log_info "Wipe is not available for this game." core_exit.sh diff --git a/lgsm/functions/core_getopt.sh b/lgsm/functions/core_getopt.sh index 4b69f104d..dbd240bbb 100644 --- a/lgsm/functions/core_getopt.sh +++ b/lgsm/functions/core_getopt.sh @@ -6,9 +6,9 @@ local function_selfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" -### Define all commands here ### +### Define all commands here. ## User commands | Trigger commands | Description -# Standard commands +# Standard commands. cmd_install=( "i;install" "command_install.sh" "Install the server." ) cmd_auto_install=( "ai;auto-install" "fn_autoinstall" "Install the server without prompts." ) cmd_start=( "st;start" "command_start.sh" "Start the server." ) @@ -21,19 +21,19 @@ cmd_update_linuxgsm=( "ul;update-lgsm;uf;update-functions" "command_update_linux 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." ) cmd_donate=( "do;donate" "command_donate.sh" "Donation options." ) -# Console servers only +# 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 +# Update servers only. 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 +# SteamCMD servers only. cmd_validate=( "v;validate" "command_validate.sh" "Validate server files with SteamCMD." ) -# Server with mods-install +# 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 +# Server specific. cmd_change_password=( "pw;change-password" "command_ts3_server_pass.sh" "Change TS3 serveradmin password." ) 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 main game server data." ) @@ -44,7 +44,7 @@ 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_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 +# Dev commands. 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." ) @@ -53,48 +53,48 @@ cmd_dev_query_raw=( "qr;query-raw" "command_dev_query_raw.sh" "The raw output of cmd_dev_clear_functions=( "cf;clear-functions" "command_dev_clear_functions.sh" "Delete the contents of the functions dir." ) -### Set specific opt here ### +### Set specific opt here. currentopt=( "${cmd_start[@]}" "${cmd_stop[@]}" "${cmd_restart[@]}" "${cmd_monitor[@]}" "${cmd_test_alert[@]}" "${cmd_details[@]}" "${cmd_postdetails[@]}" ) -# Update LGSM +# Update LGSM. currentopt+=( "${cmd_update_linuxgsm[@]}" ) -# Exclude noupdate games here +# Exclude noupdate games here. if [ "${engine}" != "quake" ]&&[ "${engine}" != "idtech2" ]&&[ "${engine}" != "idtech3" ]&&[ "${engine}" != "iw2.0" ]&&[ "${engine}" != "iw3.0" ]&&[ "${shortname}" != "bf1942" ]&&[ "${shortname}" != "samp" ]; then currentopt+=( "${cmd_update[@]}" ) - # force update for SteamCMD only or MTA + # force update for SteamCMD only or MTA. if [ -n "${appid}" ]||[ "${shortname}" == "mta" ]; then currentopt+=( "${cmd_force_update[@]}" ) fi fi -# Validate command +# Validate command. if [ -n "${appid}" ]; then currentopt+=( "${cmd_validate[@]}" ) fi -#Backup +#Backup. currentopt+=( "${cmd_backup[@]}" ) -# Exclude games without a console +# Exclude games without a console. if [ "${shortname}" != "ts3" ]; then currentopt+=( "${cmd_console[@]}" "${cmd_debug[@]}" ) fi -## Game server exclusive commands +## Game server exclusive commands. -# FastDL command +# FastDL command. if [ "${engine}" == "source" ]; then currentopt+=( "${cmd_fastdl[@]}" ) fi -# TeamSpeak exclusive +# TeamSpeak exclusive. if [ "${shortname}" == "ts3" ]; then currentopt+=( "${cmd_change_password[@]}" ) fi -# Unreal exclusive +# Unreal exclusive. if [ "${shortname}" == "rust" ]; then currentopt+=( "${cmd_wipe[@]}" "${cmd_wipeall[@]}" ) fi @@ -109,39 +109,39 @@ if [ "${engine}" == "unreal" ]; then currentopt+=( "${cmd_map_compressor_u99[@]}" ) fi -# DST exclusive +# DST exclusive. if [ "${shortname}" == "dst" ]; then currentopt+=( "${cmd_install_dst_token[@]}" ) fi -# MTA exclusive +# MTA exclusive. if [ "${shortname}" == "mta" ]; then currentopt+=( "${cmd_install_default_resources[@]}" ) fi -# Squad license exclusive +# Squad license exclusive. if [ "${shortname}" == "squad" ]; then currentopt+=( "${cmd_install_squad_license[@]}" ) fi -## Mods commands +## Mods commands. if [ "${engine}" == "source" ]||[ "${shortname}" == "rust" ]||[ "${shortname}" == "hq" ]||[ "${shortname}" == "sdtd" ]; then currentopt+=( "${cmd_mods_install[@]}" "${cmd_mods_remove[@]}" "${cmd_mods_update[@]}" ) fi -## Installer +## Installer. currentopt+=( "${cmd_install[@]}" "${cmd_auto_install[@]}" ) -## Developer commands +## Developer commands. currentopt+=( "${cmd_dev_debug[@]}" ) if [ -f ".dev-debug" ]; then currentopt+=( "${cmd_dev_detect_deps[@]}" "${cmd_dev_detect_glibc[@]}" "${cmd_dev_detect_ldd[@]}" "${cmd_dev_query_raw[@]}" "${cmd_dev_clear_functions[@]}" ) fi -## Donate +## Donate. currentopt+=( "${cmd_donate[@]}" ) -### Build list of available commands +### Build list of available commands. optcommands=() index="0" for ((index="0"; index < ${#currentopt[@]}; index+=3)); do @@ -151,7 +151,7 @@ for ((index="0"; index < ${#currentopt[@]}; index+=3)); do done done -# Shows LinuxGSM usage +# Shows LinuxGSM usage. fn_opt_usage(){ echo "Usage: $0 [option]" echo -e "" @@ -159,11 +159,11 @@ fn_opt_usage(){ echo "https://linuxgsm.com/${gameservername}" echo -e "" echo -e "${lightyellow}Commands${default}" - # Display available commands + # Display available commands. index="0" { for ((index="0"; index < ${#currentopt[@]}; index+=3)); do - # Hide developer commands + # 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 @@ -172,20 +172,20 @@ fn_opt_usage(){ core_exit.sh } -### Check if user commands exist and run corresponding scripts, or display script usage +# Check if user commands exist and run corresponding scripts, or display script usage. if [ -z "${getopt}" ]; then fn_opt_usage fi -# Command exists +# Command exists. for i in "${optcommands[@]}"; do if [ "${i}" == "${getopt}" ] ; then - # Seek and run command + # 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 + # Run command. eval "${currentopt[index+1]}" core_exit.sh break @@ -195,7 +195,7 @@ for i in "${optcommands[@]}"; do fi done -# If we're executing this, it means command was not found +# If we're executing this, it means command was not found. echo -e "${red}Unknown command${default}: $0 ${getopt}" exitcode=2 fn_opt_usage diff --git a/lgsm/functions/core_legacy.sh b/lgsm/functions/core_legacy.sh index 137bfe08c..1b525b669 100644 --- a/lgsm/functions/core_legacy.sh +++ b/lgsm/functions/core_legacy.sh @@ -41,7 +41,7 @@ if [ -z "${alertlog}" ]; then alertlog="${emaillog}" fi -# Alternations to workshop variables +# Alternations to workshop variables. if [ -z "${wsapikey}" ]; then if [ "${workshopauth}" ]; then wsapikey="${workshopauth}" @@ -62,4 +62,4 @@ if [ -z "${wsstartmap}" ]; then if [ "${ws_start_map}" ]; then wscollectionid="${ws_start_map}" fi -fi \ No newline at end of file +fi diff --git a/lgsm/functions/core_messages.sh b/lgsm/functions/core_messages.sh index c0fe5b634..c909b5479 100644 --- a/lgsm/functions/core_messages.sh +++ b/lgsm/functions/core_messages.sh @@ -5,8 +5,8 @@ # Website: https://linuxgsm.com # Description: Defines on-screen messages such as [ OK ] and how script logs look. -# nl: new line: message is following by a new line -# eol: end of line: message is placed at the end of the current line +# nl: new line: message is following by a new line. +# eol: end of line: message is placed at the end of the current line. fn_ansi_loader(){ if [ "${ansi}" != "off" ]; then # echo colors @@ -24,7 +24,7 @@ fn_ansi_loader(){ cyan="\e[36m" lightcyan="\e[96m" fi - # carriage return & erase to end of line + # carriage return & erase to end of line. creeol="\r\033[K" } diff --git a/lgsm/functions/fix.sh b/lgsm/functions/fix.sh index a92d1b855..51e9b5a69 100644 --- a/lgsm/functions/fix.sh +++ b/lgsm/functions/fix.sh @@ -8,7 +8,7 @@ local commandname="FIX" local commandaction="Fix" -# Messages that are displayed for some fixes +# Messages that are displayed for some fixes. fn_fix_msg_start(){ fn_print_dots "Applying ${fixname} fix: ${gamename}" fn_print_info "Applying ${fixname} fix: ${gamename}" @@ -31,7 +31,7 @@ fn_fix_msg_end(){ fi } -# Fixes that are run on start +# Fixes that are run on start. if [ "${function_selfname}" != "command_install.sh" ]&&[ -z "${fixbypass}" ]; then if [ -n "${appid}" ]; then fix_steamcmd.sh diff --git a/lgsm/functions/fix_coduo.sh b/lgsm/functions/fix_coduo.sh index 09530e99a..9eb4e78d7 100644 --- a/lgsm/functions/fix_coduo.sh +++ b/lgsm/functions/fix_coduo.sh @@ -7,6 +7,5 @@ local commandname="FIX" local commandaction="Fix" -# Force glibc fix +# Force glibc fix. fix_glibc.sh - diff --git a/lgsm/functions/fix_dst.sh b/lgsm/functions/fix_dst.sh index 832b81398..e2850c8b8 100644 --- a/lgsm/functions/fix_dst.sh +++ b/lgsm/functions/fix_dst.sh @@ -8,7 +8,7 @@ local commandname="FIX" local commandaction="Fix" 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) +# 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 "${serverfiles}/bin/lib32/libcurl-gnutls.so.4" ]; then fixname="libcurl-gnutls.so.4" diff --git a/lgsm/functions/fix_rust.sh b/lgsm/functions/fix_rust.sh index f4eb5298d..854020873 100644 --- a/lgsm/functions/fix_rust.sh +++ b/lgsm/functions/fix_rust.sh @@ -7,5 +7,5 @@ local commandname="FIX" local commandaction="Fix" -# Fixes: [Raknet] Server Shutting Down (Shutting Down) +# Fixes: [Raknet] Server Shutting Down (Shutting Down). export LD_LIBRARY_PATH="$LD_LIBRARY_PATH:${systemdir}/RustDedicated_Data/Plugins/x86_64" diff --git a/lgsm/functions/fix_ts3.sh b/lgsm/functions/fix_ts3.sh index 0d27c316b..751b5dbd5 100644 --- a/lgsm/functions/fix_ts3.sh +++ b/lgsm/functions/fix_ts3.sh @@ -8,10 +8,10 @@ local commandname="FIX" local commandaction="Fix" local function_selfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" -# Fixes: makes libmariadb2 available #1924 +# Fixes: makes libmariadb2 available #1924. if [ ! -f "${serverfiles}/libmariadb.so.2" ]; then fixname="libmariadb.so.2" fn_fix_msg_start cp "${serverfiles}/redist/libmariadb.so.2" "${serverfiles}/libmariadb.so.2" - fn_fix_msg_end + fn_fix_msg_end fi diff --git a/lgsm/functions/fix_unt.sh b/lgsm/functions/fix_unt.sh index d89f69558..bc29a54ed 100644 --- a/lgsm/functions/fix_unt.sh +++ b/lgsm/functions/fix_unt.sh @@ -7,5 +7,5 @@ local commandname="FIX" local commandaction="Fix" -# Fixes: [Raknet] Server Shutting Down (Shutting Down) +# Fixes: [Raknet] Server Shutting Down (Shutting Down). export LD_LIBRARY_PATH="$LD_LIBRARY_PATH:${systemdir}/lib" diff --git a/lgsm/functions/fix_wurm.sh b/lgsm/functions/fix_wurm.sh index 5c90dc402..756636cac 100644 --- a/lgsm/functions/fix_wurm.sh +++ b/lgsm/functions/fix_wurm.sh @@ -4,13 +4,13 @@ # Website: https://linuxgsm.com # Description: Resolves various issues with ARK: Survival Evolved. -# Copies steamclient.so to correct location +# Copies steamclient.so to correct location. if [ ! -f "${serverfiles}/nativelibs" ]; then cp -f "${serverfiles}/linux64/steamclient.so" "${serverfiles}/nativelibs" fi -# First run requires start with no parms -# After first run new dirs are created +# First run requires start with no parms. +# After first run new dirs are created. if [ ! -d "${serverfiles}/Creative" ]; then parmsbypass=1 fixbypass=1 @@ -20,4 +20,4 @@ if [ ! -d "${serverfiles}/Creative" ]; then exitbypass=1 command_stop.sh unset parmsbypass -fi \ No newline at end of file +fi diff --git a/lgsm/functions/info_config.sh b/lgsm/functions/info_config.sh index 11ddb95ec..14d77cf9f 100644 --- a/lgsm/functions/info_config.sh +++ b/lgsm/functions/info_config.sh @@ -7,7 +7,7 @@ local function_selfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" -## Examples of filtering to get info from config files +## Examples of filtering to get info from config files. # sed 's/foo//g' - remove foo # tr -cd '[:digit:]' leave only digits # tr -d '=\"; ' remove selected characters =\"; diff --git a/lgsm/functions/info_distro.sh b/lgsm/functions/info_distro.sh index 8100feb97..17faeb50a 100644 --- a/lgsm/functions/info_distro.sh +++ b/lgsm/functions/info_distro.sh @@ -19,7 +19,7 @@ kernel=$(uname -r) # Distro ID - ubuntu # Distro Codename - xenial -# Gathers distro info from various sources filling in missing gaps +# Gathers distro info from various sources filling in missing gaps. distro_info_array=( os-release lsb_release hostnamectl debian_version redhat-release ) for distro_info in "${distro_info_array[@]}" do @@ -97,18 +97,18 @@ cpufreuency=$(awk -F: ' /cpu MHz/ {freq=$2} END {print freq " MHz"}' /proc/cpuin ## Memory information # Available RAM and swap. -# Newer distros can use numfmt to give more accurate results +# Newer distros can use numfmt to give more accurate results. if [ -n "$(command -v numfmt 2>/dev/null)" ]; then - # Issue #2005 - Kernel 3.14+ contains MemAvailable which should be used. All others will be calculated + # Issue #2005 - Kernel 3.14+ contains MemAvailable which should be used. All others will be calculated. - # get the raw KB values of these fields + # get the raw KB values of these fields. physmemtotalkb=$(grep MemTotal /proc/meminfo | awk '{print $2}') physmemfreekb=$(grep ^MemFree /proc/meminfo | awk '{print $2}') physmembufferskb=$(grep ^Buffers /proc/meminfo | awk '{print $2}') physmemcachedkb=$(grep ^Cached /proc/meminfo | awk '{print $2}') physmemreclaimablekb=$(grep ^SReclaimable /proc/meminfo | awk '{print $2}') - # check if MemAvailable Exists + # check if MemAvailable Exists. if grep -q ^MemAvailable /proc/meminfo; then physmemactualfreekb=$(grep ^MemAvailable /proc/meminfo | awk '{print $2}') else @@ -183,12 +183,12 @@ fi if [ -d "${backupdir}" ]; then # Used space in backups dir. backupdirdu=$(du -sh "${backupdir}" | awk '{print $1}') - # If no backup dir, size is 0M + # If no backup dir, size is 0M. if [ -z "${backupdirdu}" ]; then backupdirdu="0M" fi - # number of backups set to 0 by default + # number of backups set to 0 by default. backupcount=0 # If there are backups in backup dir. @@ -210,7 +210,7 @@ fi if [ -z "${extip}" ]; then extip=$(${curlpath} -4 -m 3 ifconfig.co 2>/dev/null) exitcode=$? - # Should ifconfig.co return an error will use last known IP + # Should ifconfig.co return an error will use last known IP. if [ ${exitcode} -eq 0 ]; then echo "${extip}" > "${tmpdir}/extip.txt" else @@ -231,7 +231,7 @@ else alertip="${ip}" fi -# Steam Master Server - checks if detected by master server +# Steam Master Server - checks if detected by master server. if [ "$(command -v jq 2>/dev/null)" ]; then if [ "${ip}" ]&&[ "${port}" ]; then if [ "${steammaster}" == "true" ]; then diff --git a/lgsm/functions/install_config.sh b/lgsm/functions/install_config.sh index cb5a431ad..b601da7fc 100644 --- a/lgsm/functions/install_config.sh +++ b/lgsm/functions/install_config.sh @@ -8,7 +8,7 @@ local commandname="INSTALL" local commandaction="Install" local function_selfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" -# Checks if server 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." @@ -17,7 +17,7 @@ fn_check_cfgdir(){ fi } -# Downloads default configs from Game-Server-Configs repo to lgsm/config-default +# Downloads default configs from Game-Server-Configs repo to lgsm/config-default. fn_fetch_default_config(){ echo "" echo "Downloading ${gamename} Configs" @@ -31,7 +31,7 @@ fn_fetch_default_config(){ done } -# Copys default configs from Game-Server-Configs repo to server config location +# Copys default configs from Game-Server-Configs repo to server config location. fn_default_config_remote(){ for config in "${array_configs[@]}"; do # every config is copied @@ -53,14 +53,14 @@ fn_default_config_remote(){ fn_sleep_time } -# Copys local default config to server config location +# Copys local default config to server config location. fn_default_config_local(){ echo "copying ${servercfgdefault} config file." cp -nv "${servercfgfullpathdefault}" "${servercfgfullpath}" fn_sleep_time } -# Changes some variables within the default configs +# Changes some variables within the default configs. # SERVERNAME to LinuxGSM # PASSWORD to random password fn_set_config_vars(){ @@ -71,7 +71,7 @@ fn_set_config_vars(){ echo "changing hostname." fn_script_log_info "changing hostname." fn_sleep_time - # prevents var from being overwritten with the servername + # prevents var from being overwritten with the servername. if grep -q "SERVERNAME=SERVERNAME" "${lgsmdir}/config-default/config-game/${config}" 2>/dev/null; then sed -i "s/SERVERNAME=SERVERNAME/SERVERNAME=${servername}/g" "${servercfgfullpath}" elif grep -q "SERVERNAME=\"SERVERNAME\"" "${lgsmdir}/config-default/config-game/${config}" 2>/dev/null; then @@ -94,7 +94,7 @@ fn_set_config_vars(){ fi } -# Changes some variables within the default Don't Starve Together configs +# Changes some variables within the default Don't Starve Together configs. fn_set_dst_config_vars(){ ## cluster.ini if grep -Fq "SERVERNAME" "${clustercfgfullpath}"; then @@ -117,7 +117,7 @@ fn_set_dst_config_vars(){ fi ## server.ini - # removing unnecessary options (dependent on sharding & shard type) + # removing unnecessary options (dependent on sharding & shard type). if [ "${sharding}" == "false" ]; then sed -i "s/ISMASTER//g" "${servercfgfullpath}" sed -i "/SHARDNAME/d" "${servercfgfullpath}" diff --git a/lgsm/functions/install_logs.sh b/lgsm/functions/install_logs.sh index d02bb8e35..c886c9140 100644 --- a/lgsm/functions/install_logs.sh +++ b/lgsm/functions/install_logs.sh @@ -14,7 +14,7 @@ if [ "${checklogs}" != "1" ]; then echo "=================================" fi fn_sleep_time -# Create LinuxGSM logs +# Create LinuxGSM logs. echo -en "installing log dir: ${logdir}..." mkdir -p "${logdir}" if [ $? -ne 0 ]; then @@ -40,7 +40,7 @@ if [ $? -ne 0 ]; then else fn_print_ok_eol_nl fi -# Create Console logs +# Create Console logs. if [ -n "${consolelogdir}" ]; then echo -en "installing console log dir: ${consolelogdir}..." mkdir -p "${consolelogdir}" @@ -60,7 +60,7 @@ if [ -n "${consolelogdir}" ]; then fi fi -# Create Game logs +# Create Game logs. if [ -n "${gamelogdir}" ]&&[ ! -d "${gamelogdir}" ]; then echo -en "installing game log dir: ${gamelogdir}..." mkdir -p "${gamelogdir}" @@ -73,7 +73,7 @@ if [ -n "${gamelogdir}" ]&&[ ! -d "${gamelogdir}" ]; then fi # Symlink to gamelogdir -# unless gamelogdir is within logdir +# 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 @@ -89,7 +89,7 @@ if [ -n "${gamelogdir}" ]; then fi 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 [ ! -L "${logdir}/steamcmd" ]; then echo -en "creating symlink to steam log dir: ${logdir}/steamcmd -> ${rootdir}/Steam/logs..." diff --git a/lgsm/functions/install_server_files.sh b/lgsm/functions/install_server_files.sh index cf2ee3e90..be94748f9 100644 --- a/lgsm/functions/install_server_files.sh +++ b/lgsm/functions/install_server_files.sh @@ -64,11 +64,11 @@ fn_install_server_files_steamcmd(){ counter=$((counter+1)) cd "${steamcmddir}" if [ "${counter}" -le "10" ]; then - # Attempt 1-4: Standard attempt - # Attempt 5-6: Validate attempt - # Attempt 7-8: Validate, delete long name dir - # Attempt 9-10: Validate, delete long name dir, re-download SteamCMD - # Attempt 11: Failure + # Attempt 1-4: Standard attempt. + # Attempt 5-6: Validate attempt. + # Attempt 7-8: Validate, delete long name dir. + # Attempt 9-10: Validate, delete long name dir, re-download SteamCMD. + # Attempt 11: Failure. if [ "${counter}" -ge "2" ]; then fn_print_warning_nl "SteamCMD did not complete the download, retrying: Attempt ${counter}" diff --git a/lgsm/functions/install_ts3db.sh b/lgsm/functions/install_ts3db.sh index 264f2597f..6fbe45724 100644 --- a/lgsm/functions/install_ts3db.sh +++ b/lgsm/functions/install_ts3db.sh @@ -65,7 +65,6 @@ fi install_eula.sh -## Get privilege key echo "" echo "Getting privilege key" echo "=================================" diff --git a/lgsm/functions/logs.sh b/lgsm/functions/logs.sh index 803f9e243..c4de5e8c8 100644 --- a/lgsm/functions/logs.sh +++ b/lgsm/functions/logs.sh @@ -8,14 +8,14 @@ local commandname="LOGS" local commandaction="Log-Manager" -# Check if logfile variable and file exist, create logfile if it doesn't exist +# Check if logfile variable and file exist, create logfile if it doesn't exist. if [ -n "${consolelog}" ]; then if [ ! -e "${consolelog}" ]; then touch "${consolelog}" fi fi -# For games not displaying a console, and having logs into their game directory +# For games not displaying a console, and having logs into their game directory. check_status.sh if [ "${status}" != "0" ]&&[ "${function_selfname}" == "command_start.sh" ]&&[ -n "${gamelogfile}" ]; then if [ -n "$(find "${systemdir}" -name "gamelog*.log")" ]; then @@ -27,7 +27,7 @@ if [ "${status}" != "0" ]&&[ "${function_selfname}" == "command_start.sh" ]&&[ - fi fi -# Log manager will start the cleanup if it finds logs older than "${logdays}" +# Log manager will start the cleanup if it finds logs older than "${logdays}". if [ $(find "${lgsmlogdir}"/ -type f -mtime +"${logdays}" | wc -l) -ne "0" ]; then fn_print_dots "Starting" # Set common logs directories @@ -44,24 +44,24 @@ if [ $(find "${lgsmlogdir}"/ -type f -mtime +"${logdays}" | wc -l) -ne "0" ]; th fn_print_ok_nl "Starting" fn_print_info_nl "Removing logs older than ${logdays} days" fn_script_log_info "Removing logs older than ${logdays} days" - # Logging logfiles to be removed according to "${logdays}", counting and removing them - # Script logfiles + # Logging logfiles to be removed according to "${logdays}", counting and removing them. + # Script logfiles. 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 + # SRCDS and unreal logfiles. if [ "${engine}" == "unreal2" ]||[ "${engine}" == "source" ]; then 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 + # Console logfiles. if [ -n "${consolelog}" ]; then 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 + # Common logfiles. if [ -d "${commonlogs}" ]; then find "${commonlogs}"/ -type f -mtime +"${logdays}" | tee >> "${lgsmlog}" smcount=$(find "${commonlogs}"/ -type f -mtime +"${logdays}" | wc -l) @@ -72,23 +72,23 @@ if [ $(find "${lgsmlogdir}"/ -type f -mtime +"${logdays}" | wc -l) -ne "0" ]; th smcount=$(find "${commonsourcelogs}"/* -type f -mtime +"${logdays}" | wc -l) find "${commonsourcelogs}"/* -mtime +"${logdays}" -type f -exec rm -f {} \; fi - # Source addons logfiles + # Source addons logfiles. if [ "${engine}" == "source" ]; then - # SourceMod logfiles + # SourceMod logfiles. if [ -d "${sourcemodlogdir}" ]; then 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 - # Garry's Mod logfiles + # Garry's Mod logfiles. if [ "${gamename}" == "Garry's Mod" ]; then - # ULX logfiles + # ULX logfiles. if [ -d "${ulxlogdir}" ]; then 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 + # DarkRP logfiles. if [ -d "${darkrplogdir}" ]; then find "${darkrplogdir}"/ -type f -mtime +"${logdays}" | tee >> "${lgsmlog}" darkrpcount=$(find "${darkrplogdir}"/ -type f -mtime +"${logdays}" | wc -l) @@ -97,9 +97,9 @@ if [ $(find "${lgsmlogdir}"/ -type f -mtime +"${logdays}" | wc -l) -ne "0" ]; th fi fi - # Count total amount of files removed + # Count total amount of files removed. countlogs=$((${scriptcount} + ${consolecount} + ${gamecount} + ${srcdscount} + ${smcount} + ${ulxcount} + ${darkrpcount})) - # Job done + # Job done. fn_print_ok_nl "Removed ${countlogs} log files" fn_script_log "Removed ${countlogs} log files" fi diff --git a/lgsm/functions/mods_core.sh b/lgsm/functions/mods_core.sh index c65727738..30e436a53 100644 --- a/lgsm/functions/mods_core.sh +++ b/lgsm/functions/mods_core.sh @@ -9,19 +9,19 @@ local commandname="MODS" local commandaction="Mods" local function_selfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" -# Files and Directories +# Files and Directories. modsdir="${lgsmdir}/mods" modstmpdir="${modsdir}/tmp" extractdir="${modstmpdir}/extract" modsinstalledlist="installed-mods.txt" modsinstalledlistfullpath="${modsdir}/${modsinstalledlist}" -## Installation +## Installation. -# Download management +# 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 + # 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_fatal "An issue occurred downloading ${modprettyname}" @@ -33,7 +33,7 @@ fn_mod_install_files(){ fn_dl_extract "${modstmpdir}" "${modfilename}" "${extractdir}" } -# Convert mod files to lowercase if needed +# Convert mod files to lowercase if needed. fn_mod_lowercase(){ if [ "${modlowercase}" == "LowercaseOn" ]; then @@ -65,11 +65,11 @@ fn_mod_lowercase(){ fi } -# Create ${modcommand}-files.txt containing the full extracted file/directory list +# Create ${modcommand}-files.txt containing the full extracted file/directory list. fn_mod_create_filelist(){ echo -en "building ${modcommand}-files.txt..." fn_sleep_time - # ${modsdir}/${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 @@ -80,14 +80,14 @@ fn_mod_create_filelist(){ fn_print_ok_eol_nl fn_script_log_pass "Building ${modsdir}/${modcommand}-files.txt" fi - # Adding removed files if needed + # Adding removed files if needed. if [ -f "${modsdir}/.removedfiles.tmp" ]; then cat "${modsdir}/.removedfiles.tmp" >> "${modsdir}/${modcommand}-files.txt" fi fn_sleep_time } -# Copy the mod into serverfiles +# Copy the mod into serverfiles. fn_mod_copy_destination(){ echo -en "copying ${modprettyname} to ${modinstalldir}..." fn_sleep_time @@ -102,7 +102,7 @@ fn_mod_copy_destination(){ fi } -# Add the mod to the installed-mods.txt +# Add the mod to the installed-mods.txt. fn_mod_add_list(){ if [ ! -n "$(sed -n "/^${modcommand}$/p" "${modsinstalledlistfullpath}")" ]; then echo "${modcommand}" >> "${modsinstalledlistfullpath}" @@ -110,26 +110,26 @@ fn_mod_add_list(){ fi } -# Prevent sensitive directories from being erased upon uninstall by removing them from: ${modcommand}-files.txt +# Prevent sensitive directories from being erased upon uninstall by removing them from: ${modcommand}-files.txt. fn_mod_tidy_files_list(){ - # Check file list validity + # Check file list validity. fn_check_mod_files_list # Output to the user echo -en "tidy up ${modcommand}-files.txt..." fn_sleep_time fn_script_log_info "Tidy up ${modcommand}-files.txt" - # Lines/files to remove from file list (end with ";" separator) + # 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;" # Loop through files to remove from file list, - # generate 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 + # Test all subvalue of "removefromlist" using the ";" separator. for ((filesindex=1; filesindex < removefromlistamount; filesindex++)); do - # Put current file into test variable + # Put current file into test variable. removefilevar="$(echo "${removefromlist}" | awk -F ';' -v x=${filesindex} '{ print $x }')" - # Delete line(s) matching exactly + # Delete line(s) matching exactly. sed -i "/^${removefilevar}$/d" "${modsdir}/${modcommand}-files.txt" - # Exit on error + # Exit on error. local exitcode=$? if [ ${exitcode} -ne 0 ]; then fn_print_fail_eol_nl @@ -140,42 +140,42 @@ fn_mod_tidy_files_list(){ done fn_print_ok_eol_nl # Sourcemod fix - # Remove metamod from sourcemod fileslist + # Remove metamod from sourcemod fileslist. if [ "${modcommand}" == "sourcemod" ]; then - # Remove addons/metamod & addons/metamod/sourcemod.vdf from ${modcommand}-files.txt + # Remove addons/metamod & addons/metamod/sourcemod.vdf from ${modcommand}-files.txt. sed -i "/^addons\/metamod$/d" "${modsdir}/${modcommand}-files.txt" sed -i "/^addons\/metamod\/sourcemod.vdf$/d" "${modsdir}/${modcommand}-files.txt" fi } -## Information Gathering +## Information Gathering. -# Get details of a mod any (relevant and unique, such as full mod name or install command) value +# 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 + # Variable to know when job is done. modinfocommand="0" - # Find entry in global array + # Find entry in global array. for ((index=0; index <= ${#mods_global_array[@]}; index++)); do - # When entry is found + # When entry is found. if [ "${mods_global_array[index]}" == "${currentmod}" ]; then - # Go back to the previous "MOD" separator + # Go back to the previous "MOD" separator. for ((index=index; index <= ${#mods_global_array[@]}; index--)); do - # When "MOD" is found + # When "MOD" is found. if [ "${mods_global_array[index]}" == "MOD" ]; then - # Get info + # Get info. fn_mods_define modinfocommand="1" break fi done fi - # Exit the loop if job is done + # Exit the loop if job is done. if [ "${modinfocommand}" == "1" ]; then break fi done - # What happens if mod is not found + # 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}" @@ -183,7 +183,7 @@ fn_mod_get_info(){ fi } -# Define all variables for a mod at once when index is set to a separator +# 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." @@ -206,25 +206,25 @@ fi moddescription="${mods_global_array[index+13]}" } -# Builds list of installed mods -# using installed-mods.txt grabing mod info from mods_list.sh +# 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 + # Set/reset variables. installedmodsline="1" installedmodslist=() modprettynamemaxlength="0" modsitemaxlength="0" moddescriptionmaxlength="0" modcommandmaxlength="0" - # Loop through every line of the installed mods list ${modsinstalledlistfullpath} + # 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 + # Get mod info to make sure mod exists. fn_mod_get_info - # Add the mod to available commands + # Add the mod to available commands. installedmodslist+=( "${modcommand}" ) - # Increment line check + # Increment line check. ((installedmodsline++)) done if [ -n "${installedmodscount}" ]; then @@ -232,99 +232,99 @@ fn_mods_installed_list(){ fi } -# Loops through mods_global_array to define available mods & provide available 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 + # First, reset variables. compatiblemodslist=() availablemodscommands=() - # Find compatible games - # Find separators through the global array + # 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 current value is a separator; then. if [ "${mods_global_array[index]}" == "${modseparator}" ]; then - # Set mod variables + # Set mod variables. fn_mods_define - # Test if game is compatible + # Test if game is compatible. fn_mod_compatible_test - # If game is compatible + # If game is compatible. if [ "${modcompatibility}" == "1" ]; then - # Put it into an array to prepare user output + # Put it into an array to prepare user output. compatiblemodslist+=( "${modprettyname}" "${modcommand}" "${modsite}" "${moddescription}" ) - # Keep available commands in an array to make life easier + # Keep available commands in an array to make life easier. availablemodscommands+=( "${modcommand}" ) fi fi done } -## Mod compatibility check +## Mod compatibility check. -# Find out if a game is compatible with a mod from a modgames (list of games supported by a mod) variable +# 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 + # Reset test value. modcompatiblegame="0" - # If value is set to GAMES (ignore) + # If value is set to GAMES (ignore). if [ "${modgames}" != "GAMES" ]; then - # How many games we need to test + # How many games we need to test. gamesamount="$(echo "${modgames}" | awk -F ';' '{ print NF }')" - # Test all subvalue of "modgames" using the ";" separator + # Test all subvalue of "modgames" using the ";" separator. for ((gamevarindex=1; gamevarindex < gamesamount; gamevarindex++)); do - # Put current game name into modtest variable + # Put current game name into modtest variable. gamemodtest="$( echo "${modgames}" | awk -F ';' -v x=${gamevarindex} '{ print $x }' )" - # If game name matches + # If game name matches. if [ "${gamemodtest}" == "${gamename}" ]; then - # Mod is compatible ! + # 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 +# 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 + # Reset test value. modcompatibleengine="0" - # If value is set to ENGINES (ignore) + # If value is set to ENGINES (ignore). if [ "${modengines}" != "ENGINES" ]; then - # How many engines we need to test + # How many engines we need to test. enginesamount="$(echo "${modengines}" | awk -F ';' '{ print NF }')" - # Test all subvalue of "modengines" using the ";" separator + # Test all subvalue of "modengines" using the ";" separator. for ((gamevarindex=1; gamevarindex < ${enginesamount}; gamevarindex++)); do - # Put current engine name into modtest variable + # Put current engine name into modtest variable. enginemodtest="$( echo "${modengines}" | awk -F ';' -v x=${gamevarindex} '{ print $x }' )" - # If engine name matches + # If engine name matches. if [ "${enginemodtest}" == "${engine}" ]; then - # Mod is compatible! + # 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 +# 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 + # Reset test value. modeincompatiblegame="0" - # If value is set to NOTGAMES (ignore) + # If value is set to NOTGAMES (ignore). if [ "${modexcludegames}" != "NOTGAMES" ]; then - # How many engines we need to test + # How many engines we need to test. excludegamesamount="$(echo "${modexcludegames}" | awk -F ';' '{ print NF }')" - # Test all subvalue of "modexcludegames" using the ";" separator + # Test all subvalue of "modexcludegames" using the ";" separator. for ((gamevarindex=1; gamevarindex < excludegamesamount; gamevarindex++)); do - # Put current engine name into modtest variable + # Put current engine name into modtest variable. excludegamemodtest="$( echo "${modexcludegames}" | awk -F ';' -v x=${gamevarindex} '{ print $x }' )" - # If engine name matches + # If engine name matches. if [ "${excludegamemodtest}" == "${gamename}" ]; then - # Mod is compatible! + # Mod is compatible. modeincompatiblegame="1" fi done fi } -# Sums up if a mod is compatible or not with modcompatibility=0/1 +# Sums up if a mod is compatible or not with modcompatibility=0/1. fn_mod_compatible_test(){ - # Test game and engine compatibility + # Test game and engine compatibility. fn_compatible_mod_games fn_compatible_mod_engines fn_not_compatible_mod_games @@ -337,11 +337,11 @@ fn_mod_compatible_test(){ fi } -## Directory management +## Directory management. -# Create mods files and directories if it doesn't exist +# Create mods files and directories if it doesn't exist. fn_create_mods_dir(){ - # Create lgsm data modsdir + # Create lgsm data modsdir. if [ ! -d "${modsdir}" ]; then echo -en "creating LinuxGSM mods data directory ${modsdir}..." mkdir -p "${modsdir}" @@ -356,7 +356,7 @@ fn_create_mods_dir(){ fi fn_sleep_time fi - # Create mod install directory + # Create mod install directory. if [ ! -d "${modinstalldir}" ]; then echo -en "creating mods install directory ${modinstalldir}..." mkdir -p "${modinstalldir}" @@ -372,14 +372,14 @@ fn_create_mods_dir(){ fn_sleep_time fi - # Create lgsm/data/${modsinstalledlist} + # Create lgsm/data/${modsinstalledlist}. if [ ! -f "${modsinstalledlistfullpath}" ]; then touch "${modsinstalledlistfullpath}" fn_script_log_info "Created ${modsinstalledlistfullpath}" fi } -# Create tmp download mod directory +# Create tmp download mod directory. fn_mods_create_tmp_dir(){ if [ ! -d "${modstmpdir}" ]; then mkdir -p "${modstmpdir}" @@ -396,7 +396,7 @@ fn_mods_create_tmp_dir(){ fi } -# Remove the tmp mod download directory when finished +# Remove the tmp mod download directory when finished. fn_mods_clear_tmp_dir(){ if [ -d "${modstmpdir}" ]; then echo -en "clearing mod download directory ${modstmpdir}..." @@ -412,13 +412,13 @@ fn_mods_clear_tmp_dir(){ fi fi - # Clear temp file list as well + # Clear temp file list as well. if [ -f "${modsdir}/.removedfiles.tmp" ]; then rm "${modsdir}/.removedfiles.tmp" fi } -# Counts how many mods were installed +# Counts how many mods were installed. fn_mods_count_installed(){ if [ -f "${modsinstalledlistfullpath}" ]; then installedmodscount="$(wc -l < "${modsinstalledlistfullpath}")" @@ -427,11 +427,11 @@ fn_mods_count_installed(){ fi } -# Exits if no mods were installed +# Exits if no mods were installed. fn_mods_check_installed(){ - # Count installed mods + # Count installed mods. fn_mods_count_installed - # If no mods are found + # If no mods are found. if [ ${installedmodscount} -eq 0 ]; then echo "" fn_print_failure_nl "No installed mods or addons were found" @@ -441,13 +441,13 @@ fn_mods_check_installed(){ fi } -# Checks that mod files list exists and isn't empty +# 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 + # 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 + # How many lines is the file list. modsfilelistsize="$(wc -l < "${modsdir}/${modcommand}-files.txt")" - # If file list is empty + # If file list is empty. if [ "${modsfilelistsize}" -eq 0 ]; then fn_print_failure "${modcommand}-files.txt is empty" echo "* Unable to remove ${modprettyname}" @@ -461,7 +461,7 @@ fn_check_mod_files_list(){ fi } -## Database initialisation +## Database initialisation. mods_list.sh fn_mods_available diff --git a/lgsm/functions/query_gamedig.sh b/lgsm/functions/query_gamedig.sh index ba5c45f33..2c6192030 100644 --- a/lgsm/functions/query_gamedig.sh +++ b/lgsm/functions/query_gamedig.sh @@ -5,7 +5,7 @@ # Description: Querys a gameserver using node-gamedig. # https://github.com/sonicsnes/node-gamedig -#Check if gamedig and jq are installed +# Check if gamedig and jq are installed. if [ "$(command -v gamedig 2>/dev/null)" ]&&[ "$(command -v jq 2>/dev/null)" ]; then if [ "${engine}" == "idtech3_ql" ]; then @@ -78,56 +78,56 @@ if [ "$(command -v gamedig 2>/dev/null)" ]&&[ "$(command -v jq 2>/dev/null)" ]; fi done - # will bypass query if server offline + # will bypass query if server offline. check_status.sh if [ "${status}" != "0" ]; then - # checks if query is working null = pass + # checks if query is working null = pass. gamedigcmd=$(echo "gamedig --type \"${gamedigengine}\" --host \"${ip}\" --query_port \"${queryport}\"|jq") gamedigraw=$(gamedig --type "${gamedigengine}" --host "${ip}" --query_port "${queryport}") querystatus=$(echo "${gamedigraw}" | jq '.error|length') - + if [ "${querystatus}" != "null" ]; then gamedigcmd=$(echo "gamedig --type \"${gamedigengine}\" --host \"${ip}\" --port \"${queryport}\"|jq") gamedigraw=$(gamedig --type "${gamedigengine}" --host "${ip}" --port "${queryport}") querystatus=$(echo "${gamedigraw}" | jq '.error|length') - - fi - - # server name + fi + + + # server name. gdname=$(echo "${gamedigraw}" | jq -re '.name') if [ "${gdname}" == "null" ]; then unset gdname fi - # numplayers + # numplayers. gdplayers=$(echo "${gamedigraw}" | jq -re '.players|length') if [ "${gdplayers}" == "null" ]; then unset gdplayers fi - # maxplayers + # maxplayers. gdmaxplayers=$(echo "${gamedigraw}" | jq -re '.maxplayers|length') if [ "${gdmaxplayers}" == "null" ]; then unset maxplayers fi - # current map + # current map. gdmap=$(echo "${gamedigraw}" | jq -re '.map') if [ "${gdmap}" == "null" ]; then unset gdmap fi - # current gamemode + # current gamemode. gdgamemode=$(echo "${gamedigraw}" | jq -re '.raw.rules.GameMode_s') if [ "${gdgamemode}" == "null" ]; then unset gdgamemode fi - # numbots + # numbots. gdbots=$(echo "${gamedigraw}" | jq -re '.raw.numbots') if [ "${gdbots}" == "null" ]||[ "${gdbots}" == "0" ]; then unset gdbots fi fi -fi \ No newline at end of file +fi diff --git a/linuxgsm.sh b/linuxgsm.sh index c2607c7ab..c549ef46a 100755 --- a/linuxgsm.sh +++ b/linuxgsm.sh @@ -25,7 +25,7 @@ shortname="core" gameservername="core" rootdir="$(dirname "$(readlink -f "${BASH_SOURCE[0]}")")" selfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" -servicename="${selfname}" +servicename="${gameservername}" lockselfname=".${servicename}.lock" lgsmdir="${rootdir}/lgsm" logdir="${rootdir}/log" @@ -35,6 +35,9 @@ serverfiles="${rootdir}/serverfiles" functionsdir="${lgsmdir}/functions" libdir="${lgsmdir}/lib" tmpdir="${lgsmdir}/tmp" +datadir="${lgsmdir}/data" +serverlist="${datadir}/serverlist.csv" +serverlistmenu="${datadir}/serverlistmenu.csv" configdir="${lgsmdir}/config-lgsm" configdirserver="${configdir}/${gameservername}" configdirdefault="${lgsmdir}/config-default" @@ -47,16 +50,16 @@ githubuser="GameServerManagers" githubrepo="LinuxGSM" githubbranch="master" -# Core Function that is required first +# Core function that is required first. core_functions.sh(){ functionfile="${FUNCNAME}" fn_bootstrap_fetch_file_github "lgsm/functions" "core_functions.sh" "${functionsdir}" "chmodx" "run" "noforcedl" "nomd5" } # Bootstrap -# Fetches the core functions required before passed off to core_dl.sh +# Fetches the core functions required before passed off to core_dl.sh. -# Fetches core functions +# Fetches core functions. fn_bootstrap_fetch_file(){ remote_fileurl="${1}" local_filedir="${2}" @@ -65,17 +68,17 @@ fn_bootstrap_fetch_file(){ run="${5:-0}" forcedl="${6:-0}" md5="${7:-0}" - # download file if missing or download forced + # Download file if missing or download forced. if [ ! -f "${local_filedir}/${local_filename}" ]||[ "${forcedl}" == "forcedl" ]; then if [ ! -d "${local_filedir}" ]; then mkdir -p "${local_filedir}" fi - # Defines curl path + # Defines curl path. curlpath=$(command -v curl 2>/dev/null) - # If curl exists download file + # If curl exists download file. if [ "$(basename "${curlpath}")" == "curl" ]; then - # trap to remove part downloaded files + # Trap to remove part downloaded files. echo -en " fetching ${local_filename}...\c" curlcmd=$(${curlpath} -s --fail -L -o "${local_filedir}/${local_filename}" "${remote_fileurl}" 2>&1) local exitcode=$? @@ -93,14 +96,14 @@ fn_bootstrap_fetch_file(){ echo "[ FAIL ] Curl is not installed" exit 1 fi - # make file chmodx if chmodx is set + # Make file chmodx if chmodx is set. if [ "${chmodx}" == "chmodx" ]; then chmod +x "${local_filedir}/${local_filename}" fi fi if [ -f "${local_filedir}/${local_filename}" ]; then - # run file if run is set + # Run file if run is set. if [ "${run}" == "run" ]; then source "${local_filedir}/${local_filename}" fi @@ -119,11 +122,11 @@ fn_bootstrap_fetch_file_github(){ run="${5:-0}" forcedl="${6:-0}" md5="${7:-0}" - # Passes vars to the file download function + # Passes vars to the file download function. fn_bootstrap_fetch_file "${remote_fileurl}" "${local_filedir}" "${local_filename}" "${chmodx}" "${run}" "${forcedl}" "${md5}" } -# Installer menu +# Installer menu. fn_print_center() { columns="$(tput cols)" @@ -136,7 +139,7 @@ fn_print_horizontal(){ printf '%*s\n' "${COLUMNS:-$(tput cols)}" '' | tr ' ' "${char}" } -# Bash Menu +# Bash menu. fn_install_menu_bash() { local resultvar=$1 title=$2 @@ -160,7 +163,7 @@ fn_install_menu_bash() { done } -# Whiptail/Dialog Menu +# Whiptail/Dialog menu. fn_install_menu_whiptail() { local menucmd=$1 local resultvar=$2 @@ -175,7 +178,7 @@ fn_install_menu_whiptail() { while read -r line; do key=$(echo "${line}" | awk -F "," '{print $3}') val=$(echo "${line}" | awk -F "," '{print $2}') - menu_options+=( ${val//\"} "${key//\"}" ) + 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 @@ -185,14 +188,14 @@ fn_install_menu_whiptail() { fi } -# Menu selector +# Menu selector. fn_install_menu() { local resultvar=$1 local selection="" title=$2 caption=$3 options=$4 - # Get menu command + # Get menu command. for menucmd in whiptail dialog bash; do if [ -x "$(command -v "${menucmd}")" ]; then menucmd=$(command -v "${menucmd}") @@ -208,7 +211,7 @@ fn_install_menu() { eval "$resultvar=\"${selection}\"" } -# Gets server info from serverlist.csv and puts in to array +# Gets server info from serverlist.csv and puts in to array. fn_server_info(){ IFS="," server_info_array=($(grep -aw "${userinput}" "${serverlist}")) @@ -226,7 +229,7 @@ fn_install_getopt(){ echo -e "" echo -e "Commands" echo -e "install\t\t| Select server to install." - echo -e "servername\t| e.g $0 csgoserver. Enter name of server/game to install." + echo -e "servername\t| Enter name of game server to install. e.g $0 csgoserver." echo -e "list\t\t| List all servers available for install." exit } @@ -271,25 +274,23 @@ if [ "$(whoami)" == "root" ]; then fi fi -# LinuxGSM installer mode -if [ "${shortname}" == "core" ]; then - datadir="${tmpdir}/data" - serverlist="${datadir}/serverlist.csv" - - # Download the latest serverlist. This is the complete list of all supported servers. - fn_bootstrap_fetch_file_github "lgsm/data" "serverlist.csv" "${datadir}" "nochmodx" "norun" "forcedl" "nomd5" - if [ ! -f "${serverlist}" ]; then - echo "[ FAIL ] serverlist.csv could not be loaded." - exit 1 - fi +# Download the latest serverlist. This is the complete list of all supported servers. +fn_bootstrap_fetch_file_github "lgsm/data" "serverlist.csv" "${datadir}" "nochmodx" "norun" "forcedl" "nomd5" +if [ ! -f "${serverlist}" ]; then + echo "[ FAIL ] serverlist.csv could not be loaded." + exit 1 +fi - if [ "${userinput}" == "list" ]; then +# LinuxGSM installer mode. +if [ "${shortname}" == "core" ]; then + if [ "${userinput}" == "list" ]||[ "${userinput}" == "l" ]; then { - awk -F "," '{print $2 "\t" $3}' "${serverlist}" + tail -n +2 "${serverlist}" | awk -F "," '{print $2 "\t" $3}' } | column -s $'\t' -t | more exit elif [ "${userinput}" == "install" ]||[ "${userinput}" == "i" ]; then - fn_install_menu result "LinuxGSM" "Select game to install" "${serverlist}" + tail -n +2 "${serverlist}" | awk -F "," '{print $1 "," $2 "," $3}' > "${serverlistmenu}" + fn_install_menu result "LinuxGSM" "Select game server to install." "${serverlistmenu}" userinput="${result}" fn_server_info if [ "${result}" == "${gameservername}" ]; then @@ -312,11 +313,11 @@ if [ "${shortname}" == "core" ]; then fn_install_getopt fi -# LinuxGSM Server Mode +# LinuxGSM server mode. else core_functions.sh if [ "${shortname}" != "core-dep" ]; then - # Load LinuxGSM configs + # 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/${gameservername}/_default.cfg" ]; then @@ -350,14 +351,14 @@ else fi fi source "${configdirserver}/_default.cfg" - # Load the common.cfg config. If missing download it + # 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" "${chmodx}" "nochmodx" "norun" "noforcedl" "nomd5" source "${configdirserver}/common.cfg" else source "${configdirserver}/common.cfg" fi - # Load the instance.cfg config. If missing download it + # 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" "nochmodx" "norun" "noforcedl" "nomd5" source "${configdirserver}/${servicename}.cfg" @@ -365,14 +366,14 @@ else source "${configdirserver}/${servicename}.cfg" fi - # Load the linuxgsm.sh in to tmpdir. If missing download it + # Load the linuxgsm.sh in to tmpdir. If missing download it. if [ ! -f "${tmpdir}/linuxgsm.sh" ]; then fn_fetch_file_github "" "linuxgsm.sh" "${tmpdir}" "chmodx" "norun" "noforcedl" "nomd5" fi fi - # Enables ANSI colours from core_messages.sh. Can be disabled with ansi=off + # Enables ANSI colours from core_messages.sh. Can be disabled with ansi=off. fn_ansi_loader - # Prevents running of core_exit.sh for Travis. + # Prevents running of core_exit.sh for Travis-CI. if [ "${travistest}" != "1" ]; then getopt=$1 core_getopt.sh diff --git a/tests/tests_fctrserver.sh b/tests/tests_fctrserver.sh index 4151a7f21..18b2b66bb 100644 --- a/tests/tests_fctrserver.sh +++ b/tests/tests_fctrserver.sh @@ -3,12 +3,25 @@ # Author: Daniel Gibbs # License: MIT License, Copyright (c) 2019 Daniel Gibbs # Purpose: Travis CI Tests: Factorio | Linux Game Server Management Script -# Contributors: https://github.com/GameServerManagers/LinuxGSM/graphs/contributors -# Documentation: https://docs.linuxgsm.com/ +# Contributors: https://linuxgsm.com/contrib +# Documentation: https://docs.linuxgsm.com # Website: https://linuxgsm.com +# DO NOT EDIT THIS FILE +# LinuxGSM configuration is no longer edited here +# To update your LinuxGSM config go to: +# lgsm/config-lgsm +# https://docs.linuxgsm.com/configuration/linuxgsm-config + +# Debugging +if [ -f ".dev-debug" ]; then + exec 5>dev-debug.log + BASH_XTRACEFD="5" + set -x +fi + travistest="1" -version="180409" +version="v19.6.0" shortname="fctr" gameservername="fctrserver" rootdir="$(dirname "$(readlink -f "${BASH_SOURCE[0]}")")" @@ -23,9 +36,13 @@ serverfiles="${rootdir}/serverfiles" functionsdir="${lgsmdir}/functions" libdir="${lgsmdir}/lib" tmpdir="${lgsmdir}/tmp" +datadir="${lgsmdir}/data" +serverlist="${datadir}/serverlist.csv" +serverlistmenu="${datadir}/serverlistmenu.csv" configdir="${lgsmdir}/config-lgsm" configdirserver="${configdir}/${gameservername}" configdirdefault="${lgsmdir}/config-default" +userinput="${1}" # Allows for testing not on Travis CI if [ ! -v TRAVIS ]; then @@ -40,16 +57,16 @@ githubuser="GameServerManagers" githubrepo="LinuxGSM" githubbranch="${TRAVIS_BRANCH}" -# Core Function that is required first +# Core function that is required first. core_functions.sh(){ functionfile="${FUNCNAME}" fn_bootstrap_fetch_file_github "lgsm/functions" "core_functions.sh" "${functionsdir}" "chmodx" "run" "noforcedl" "nomd5" } # Bootstrap -# Fetches the core functions required before passed off to core_dl.sh +# Fetches the core functions required before passed off to core_dl.sh. -# Fetches core functions +# Fetches core functions. fn_bootstrap_fetch_file(){ remote_fileurl="${1}" local_filedir="${2}" @@ -58,42 +75,42 @@ fn_bootstrap_fetch_file(){ run="${5:-0}" forcedl="${6:-0}" md5="${7:-0}" - # download file if missing or download forced + # Download file if missing or download forced. if [ ! -f "${local_filedir}/${local_filename}" ]||[ "${forcedl}" == "forcedl" ]; then if [ ! -d "${local_filedir}" ]; then mkdir -p "${local_filedir}" fi - # Defines curl path + # Defines curl path. curlpath=$(command -v curl 2>/dev/null) - # If curl exists download file + # If curl exists download file. if [ "$(basename "${curlpath}")" == "curl" ]; then - # trap to remove part downloaded files + # Trap to remove part downloaded files. echo -en " 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 "FAIL" if [ -f "${lgsmlog}" ]; then echo -e "${remote_fileurl}" | tee -a "${lgsmlog}" echo "${curlcmd}" | tee -a "${lgsmlog}" fi exit 1 else - echo -e "\e[0;32mOK\e[0m" + echo -e "OK" fi else echo "[ FAIL ] Curl is not installed" exit 1 fi - # make file chmodx if chmodx is set + # Make file chmodx if chmodx is set. if [ "${chmodx}" == "chmodx" ]; then chmod +x "${local_filedir}/${local_filename}" fi fi if [ -f "${local_filedir}/${local_filename}" ]; then - # run file if run is set + # Run file if run is set. if [ "${run}" == "run" ]; then source "${local_filedir}/${local_filename}" fi @@ -112,11 +129,11 @@ fn_bootstrap_fetch_file_github(){ run="${5:-0}" forcedl="${6:-0}" md5="${7:-0}" - # Passes vars to the file download function + # Passes vars to the file download function. fn_bootstrap_fetch_file "${remote_fileurl}" "${local_filedir}" "${local_filename}" "${chmodx}" "${run}" "${forcedl}" "${md5}" } -# Installer menu +# Installer menu. fn_print_center() { columns="$(tput cols)" @@ -129,7 +146,7 @@ fn_print_horizontal(){ printf '%*s\n' "${COLUMNS:-$(tput cols)}" '' | tr ' ' "${char}" } -# Bash Menu +# Bash menu. fn_install_menu_bash() { local resultvar=$1 title=$2 @@ -153,7 +170,7 @@ fn_install_menu_bash() { done } -# Whiptail/Dialog Menu +# Whiptail/Dialog menu. fn_install_menu_whiptail() { local menucmd=$1 local resultvar=$2 @@ -168,7 +185,7 @@ fn_install_menu_whiptail() { while read -r line; do key=$(echo "${line}" | awk -F "," '{print $3}') val=$(echo "${line}" | awk -F "," '{print $2}') - menu_options+=( ${val//\"} "${key//\"}" ) + 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 @@ -178,14 +195,14 @@ fn_install_menu_whiptail() { fi } -# Menu selector +# Menu selector. fn_install_menu() { local resultvar=$1 local selection="" title=$2 caption=$3 options=$4 - # Get menu command + # Get menu command. for menucmd in whiptail dialog bash; do if [ -x "$(command -v "${menucmd}")" ]; then menucmd=$(command -v "${menucmd}") @@ -201,7 +218,7 @@ fn_install_menu() { eval "$resultvar=\"${selection}\"" } -# Gets server info from serverlist.csv and puts in to array +# Gets server info from serverlist.csv and puts in to array. fn_server_info(){ IFS="," server_info_array=($(grep -aw "${userinput}" "${serverlist}")) @@ -219,7 +236,7 @@ fn_install_getopt(){ echo -e "" echo -e "Commands" echo -e "install\t\t| Select server to install." - echo -e "servername\t| e.g $0 csgoserver. Enter name of server/game to install." + echo -e "servername\t| Enter name of game server to install. e.g $0 csgoserver." echo -e "list\t\t| List all servers available for install." exit } @@ -248,9 +265,14 @@ fn_install_file(){ exit } -# Prevent from running this script as root. +# Prevent LinuxGSM from running as root. Except if doing a dependency install. if [ "$(whoami)" == "root" ]; then - if [ ! -f "${functionsdir}/core_functions.sh" ]||[ ! -f "${functionsdir}/check_root.sh" ]||[ ! -f "${functionsdir}/core_messages.sh" ]; then + if [ "${userinput}" == "install" ]||[ "${userinput}" == "auto-install" ]||[ "${userinput}" == "i" ]||[ "${userinput}" == "ai" ]; then + if [ "${shortname}" == "core" ]; then + echo "[ FAIL ] Do NOT run this script as root!" + exit 1 + fi + elif [ ! -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 @@ -259,26 +281,23 @@ if [ "$(whoami)" == "root" ]; then fi fi -# LinuxGSM installer mode -if [ "${shortname}" == "core" ]; then - userinput=$1 - datadir="${tmpdir}/data" - serverlist="${datadir}/serverlist.csv" - - # Download the latest serverlist. This is the complete list of all supported servers. - fn_bootstrap_fetch_file_github "lgsm/data" "serverlist.csv" "${datadir}" "nochmodx" "norun" "forcedl" "nomd5" - if [ ! -f "${serverlist}" ]; then - echo "[ FAIL ] serverlist.csv could not be loaded." - exit 1 - fi +# Download the latest serverlist. This is the complete list of all supported servers. +fn_bootstrap_fetch_file_github "lgsm/data" "serverlist.csv" "${datadir}" "nochmodx" "norun" "forcedl" "nomd5" +if [ ! -f "${serverlist}" ]; then + echo "[ FAIL ] serverlist.csv could not be loaded." + exit 1 +fi - if [ "${userinput}" == "list" ]; then +# LinuxGSM installer mode. +if [ "${shortname}" == "core" ]; then + if [ "${userinput}" == "list" ]||[ "${userinput}" == "l" ]; then { - awk -F "," '{print $2 "\t" $3}' "${serverlist}" + tail -n +2 "${serverlist}" | awk -F "," '{print $2 "\t" $3}' } | column -s $'\t' -t | more exit elif [ "${userinput}" == "install" ]||[ "${userinput}" == "i" ]; then - fn_install_menu result "LinuxGSM" "Select game to install" "${serverlist}" + tail -n +2 "${serverlist}" | awk -F "," '{print $1 "," $2 "," $3}' > "${serverlistmenu}" + fn_install_menu result "LinuxGSM" "Select game server to install." "${serverlistmenu}" userinput="${result}" fn_server_info if [ "${result}" == "${gameservername}" ]; then @@ -301,65 +320,68 @@ if [ "${shortname}" == "core" ]; then fn_install_getopt fi -# LinuxGSM Server Mode +# LinuxGSM server mode. else 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/${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 -en " copying _default.cfg...\c" - 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" - exit 1 - else - echo -e "\e[0;32mOK\e[0m" + if [ "${shortname}" != "core-dep" ]; then + # 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/${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 - else - 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." + if [ ! -f "${configdirserver}/_default.cfg" ]; then + mkdir -p "${configdirserver}" echo -en " copying _default.cfg...\c" 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" + echo -e "FAIL" exit 1 else - echo -e "\e[0;32mOK\e[0m" + echo -e "OK" + fi + else + 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 -en " copying _default.cfg...\c" + cp -R "${configdirdefault}/config-lgsm/${gameservername}/_default.cfg" "${configdirserver}/_default.cfg" + exitcode=$? + if [ ${exitcode} -ne 0 ]; then + echo -e "FAIL" + exit 1 + else + echo -e "OK" + fi fi fi - fi - 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" "${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" "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 - fn_fetch_file_github "" "linuxgsm.sh" "${tmpdir}" "chmodx" "norun" "noforcedl" "nomd5" - fi + 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" "${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" "nochmodx" "norun" "noforcedl" "nomd5" + source "${configdirserver}/${servicename}.cfg" + else + source "${configdirserver}/${servicename}.cfg" + fi - # Prevents running of core_exit.sh for Travis. - if [ -z "${travistest}" ]; then + # Load the linuxgsm.sh in to tmpdir. If missing download it. + if [ ! -f "${tmpdir}/linuxgsm.sh" ]; then + fn_fetch_file_github "" "linuxgsm.sh" "${tmpdir}" "chmodx" "norun" "noforcedl" "nomd5" + fi + fi + # Enables ANSI colours from core_messages.sh. Can be disabled with ansi=off. + fn_ansi_loader + # Prevents running of core_exit.sh for Travis-CI. + if [ "${travistest}" != "1" ]; then getopt=$1 core_getopt.sh fi diff --git a/tests/tests_jc2server.sh b/tests/tests_jc2server.sh index 2f0103025..d3a348b43 100644 --- a/tests/tests_jc2server.sh +++ b/tests/tests_jc2server.sh @@ -3,12 +3,25 @@ # Author: Daniel Gibbs # License: MIT License, Copyright (c) 2019 Daniel Gibbs # Purpose: Travis CI Tests: Just Cause 2 | Linux Game Server Management Script -# Contributors: https://github.com/GameServerManagers/LinuxGSM/graphs/contributors -# Documentation: https://docs.linuxgsm.com/ +# Contributors: https://linuxgsm.com/contrib +# Documentation: https://docs.linuxgsm.com # Website: https://linuxgsm.com +# DO NOT EDIT THIS FILE +# LinuxGSM configuration is no longer edited here +# To update your LinuxGSM config go to: +# lgsm/config-lgsm +# https://docs.linuxgsm.com/configuration/linuxgsm-config + +# Debugging +if [ -f ".dev-debug" ]; then + exec 5>dev-debug.log + BASH_XTRACEFD="5" + set -x +fi + travistest="1" -version="180409" +version="v19.6.0" shortname="jc2" gameservername="jc2server" rootdir="$(dirname "$(readlink -f "${BASH_SOURCE[0]}")")" @@ -23,9 +36,13 @@ serverfiles="${rootdir}/serverfiles" functionsdir="${lgsmdir}/functions" libdir="${lgsmdir}/lib" tmpdir="${lgsmdir}/tmp" +datadir="${lgsmdir}/data" +serverlist="${datadir}/serverlist.csv" +serverlistmenu="${datadir}/serverlistmenu.csv" configdir="${lgsmdir}/config-lgsm" configdirserver="${configdir}/${gameservername}" configdirdefault="${lgsmdir}/config-default" +userinput="${1}" # Allows for testing not on Travis CI if [ ! -v TRAVIS ]; then @@ -40,16 +57,16 @@ githubuser="GameServerManagers" githubrepo="LinuxGSM" githubbranch="${TRAVIS_BRANCH}" -# Core Function that is required first +# Core function that is required first. core_functions.sh(){ functionfile="${FUNCNAME}" fn_bootstrap_fetch_file_github "lgsm/functions" "core_functions.sh" "${functionsdir}" "chmodx" "run" "noforcedl" "nomd5" } # Bootstrap -# Fetches the core functions required before passed off to core_dl.sh +# Fetches the core functions required before passed off to core_dl.sh. -# Fetches core functions +# Fetches core functions. fn_bootstrap_fetch_file(){ remote_fileurl="${1}" local_filedir="${2}" @@ -58,42 +75,42 @@ fn_bootstrap_fetch_file(){ run="${5:-0}" forcedl="${6:-0}" md5="${7:-0}" - # download file if missing or download forced + # Download file if missing or download forced. if [ ! -f "${local_filedir}/${local_filename}" ]||[ "${forcedl}" == "forcedl" ]; then if [ ! -d "${local_filedir}" ]; then mkdir -p "${local_filedir}" fi - # Defines curl path + # Defines curl path. curlpath=$(command -v curl 2>/dev/null) - # If curl exists download file + # If curl exists download file. if [ "$(basename "${curlpath}")" == "curl" ]; then - # trap to remove part downloaded files + # Trap to remove part downloaded files. echo -en " 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 "FAIL" if [ -f "${lgsmlog}" ]; then echo -e "${remote_fileurl}" | tee -a "${lgsmlog}" echo "${curlcmd}" | tee -a "${lgsmlog}" fi exit 1 else - echo -e "\e[0;32mOK\e[0m" + echo -e "OK" fi else echo "[ FAIL ] Curl is not installed" exit 1 fi - # make file chmodx if chmodx is set + # Make file chmodx if chmodx is set. if [ "${chmodx}" == "chmodx" ]; then chmod +x "${local_filedir}/${local_filename}" fi fi if [ -f "${local_filedir}/${local_filename}" ]; then - # run file if run is set + # Run file if run is set. if [ "${run}" == "run" ]; then source "${local_filedir}/${local_filename}" fi @@ -112,11 +129,11 @@ fn_bootstrap_fetch_file_github(){ run="${5:-0}" forcedl="${6:-0}" md5="${7:-0}" - # Passes vars to the file download function + # Passes vars to the file download function. fn_bootstrap_fetch_file "${remote_fileurl}" "${local_filedir}" "${local_filename}" "${chmodx}" "${run}" "${forcedl}" "${md5}" } -# Installer menu +# Installer menu. fn_print_center() { columns="$(tput cols)" @@ -129,7 +146,7 @@ fn_print_horizontal(){ printf '%*s\n' "${COLUMNS:-$(tput cols)}" '' | tr ' ' "${char}" } -# Bash Menu +# Bash menu. fn_install_menu_bash() { local resultvar=$1 title=$2 @@ -153,7 +170,7 @@ fn_install_menu_bash() { done } -# Whiptail/Dialog Menu +# Whiptail/Dialog menu. fn_install_menu_whiptail() { local menucmd=$1 local resultvar=$2 @@ -168,7 +185,7 @@ fn_install_menu_whiptail() { while read -r line; do key=$(echo "${line}" | awk -F "," '{print $3}') val=$(echo "${line}" | awk -F "," '{print $2}') - menu_options+=( ${val//\"} "${key//\"}" ) + 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 @@ -178,14 +195,14 @@ fn_install_menu_whiptail() { fi } -# Menu selector +# Menu selector. fn_install_menu() { local resultvar=$1 local selection="" title=$2 caption=$3 options=$4 - # Get menu command + # Get menu command. for menucmd in whiptail dialog bash; do if [ -x "$(command -v "${menucmd}")" ]; then menucmd=$(command -v "${menucmd}") @@ -201,7 +218,7 @@ fn_install_menu() { eval "$resultvar=\"${selection}\"" } -# Gets server info from serverlist.csv and puts in to array +# Gets server info from serverlist.csv and puts in to array. fn_server_info(){ IFS="," server_info_array=($(grep -aw "${userinput}" "${serverlist}")) @@ -219,7 +236,7 @@ fn_install_getopt(){ echo -e "" echo -e "Commands" echo -e "install\t\t| Select server to install." - echo -e "servername\t| e.g $0 csgoserver. Enter name of server/game to install." + echo -e "servername\t| Enter name of game server to install. e.g $0 csgoserver." echo -e "list\t\t| List all servers available for install." exit } @@ -248,9 +265,14 @@ fn_install_file(){ exit } -# Prevent from running this script as root. +# Prevent LinuxGSM from running as root. Except if doing a dependency install. if [ "$(whoami)" == "root" ]; then - if [ ! -f "${functionsdir}/core_functions.sh" ]||[ ! -f "${functionsdir}/check_root.sh" ]||[ ! -f "${functionsdir}/core_messages.sh" ]; then + if [ "${userinput}" == "install" ]||[ "${userinput}" == "auto-install" ]||[ "${userinput}" == "i" ]||[ "${userinput}" == "ai" ]; then + if [ "${shortname}" == "core" ]; then + echo "[ FAIL ] Do NOT run this script as root!" + exit 1 + fi + elif [ ! -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 @@ -259,26 +281,23 @@ if [ "$(whoami)" == "root" ]; then fi fi -# LinuxGSM installer mode -if [ "${shortname}" == "core" ]; then - userinput=$1 - datadir="${tmpdir}/data" - serverlist="${datadir}/serverlist.csv" - - # Download the latest serverlist. This is the complete list of all supported servers. - fn_bootstrap_fetch_file_github "lgsm/data" "serverlist.csv" "${datadir}" "nochmodx" "norun" "forcedl" "nomd5" - if [ ! -f "${serverlist}" ]; then - echo "[ FAIL ] serverlist.csv could not be loaded." - exit 1 - fi +# Download the latest serverlist. This is the complete list of all supported servers. +fn_bootstrap_fetch_file_github "lgsm/data" "serverlist.csv" "${datadir}" "nochmodx" "norun" "forcedl" "nomd5" +if [ ! -f "${serverlist}" ]; then + echo "[ FAIL ] serverlist.csv could not be loaded." + exit 1 +fi - if [ "${userinput}" == "list" ]; then +# LinuxGSM installer mode. +if [ "${shortname}" == "core" ]; then + if [ "${userinput}" == "list" ]||[ "${userinput}" == "l" ]; then { - awk -F "," '{print $2 "\t" $3}' "${serverlist}" + tail -n +2 "${serverlist}" | awk -F "," '{print $2 "\t" $3}' } | column -s $'\t' -t | more exit elif [ "${userinput}" == "install" ]||[ "${userinput}" == "i" ]; then - fn_install_menu result "LinuxGSM" "Select game to install" "${serverlist}" + tail -n +2 "${serverlist}" | awk -F "," '{print $1 "," $2 "," $3}' > "${serverlistmenu}" + fn_install_menu result "LinuxGSM" "Select game server to install." "${serverlistmenu}" userinput="${result}" fn_server_info if [ "${result}" == "${gameservername}" ]; then @@ -301,65 +320,68 @@ if [ "${shortname}" == "core" ]; then fn_install_getopt fi -# LinuxGSM Server Mode +# LinuxGSM server mode. else 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/${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 -en " copying _default.cfg...\c" - 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" - exit 1 - else - echo -e "\e[0;32mOK\e[0m" + if [ "${shortname}" != "core-dep" ]; then + # 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/${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 - else - 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." + if [ ! -f "${configdirserver}/_default.cfg" ]; then + mkdir -p "${configdirserver}" echo -en " copying _default.cfg...\c" 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" + echo -e "FAIL" exit 1 else - echo -e "\e[0;32mOK\e[0m" + echo -e "OK" + fi + else + 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 -en " copying _default.cfg...\c" + cp -R "${configdirdefault}/config-lgsm/${gameservername}/_default.cfg" "${configdirserver}/_default.cfg" + exitcode=$? + if [ ${exitcode} -ne 0 ]; then + echo -e "FAIL" + exit 1 + else + echo -e "OK" + fi fi fi - fi - 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" "${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" "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 - fn_fetch_file_github "" "linuxgsm.sh" "${tmpdir}" "chmodx" "norun" "noforcedl" "nomd5" - fi + 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" "${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" "nochmodx" "norun" "noforcedl" "nomd5" + source "${configdirserver}/${servicename}.cfg" + else + source "${configdirserver}/${servicename}.cfg" + fi - # Prevents running of core_exit.sh for Travis. - if [ -z "${travistest}" ]; then + # Load the linuxgsm.sh in to tmpdir. If missing download it. + if [ ! -f "${tmpdir}/linuxgsm.sh" ]; then + fn_fetch_file_github "" "linuxgsm.sh" "${tmpdir}" "chmodx" "norun" "noforcedl" "nomd5" + fi + fi + # Enables ANSI colours from core_messages.sh. Can be disabled with ansi=off. + fn_ansi_loader + # Prevents running of core_exit.sh for Travis-CI. + if [ "${travistest}" != "1" ]; then getopt=$1 core_getopt.sh fi @@ -914,7 +936,6 @@ echo "IP: ${travisip}" echo "" echo "5.0 - Monitor Tests" echo "==================================================================" -info_config.sh echo "" echo "Server IP - Port: ${ip}:${port}" echo "Server IP - Query Port: ${ip}:${queryport}" diff --git a/tests/tests_mcserver.sh b/tests/tests_mcserver.sh index 6df2da2ac..05a7e210a 100644 --- a/tests/tests_mcserver.sh +++ b/tests/tests_mcserver.sh @@ -3,12 +3,25 @@ # Author: Daniel Gibbs # License: MIT License, Copyright (c) 2019 Daniel Gibbs # Purpose: Travis CI Tests: Minecraft | Linux Game Server Management Script -# Contributors: https://github.com/GameServerManagers/LinuxGSM/graphs/contributors -# Documentation: https://docs.linuxgsm.com/ +# Contributors: https://linuxgsm.com/contrib +# Documentation: https://docs.linuxgsm.com # Website: https://linuxgsm.com +# DO NOT EDIT THIS FILE +# LinuxGSM configuration is no longer edited here +# To update your LinuxGSM config go to: +# lgsm/config-lgsm +# https://docs.linuxgsm.com/configuration/linuxgsm-config + +# Debugging +if [ -f ".dev-debug" ]; then + exec 5>dev-debug.log + BASH_XTRACEFD="5" + set -x +fi + travistest="1" -version="190401" +version="v19.6.0" shortname="mc" gameservername="mcserver" rootdir="$(dirname "$(readlink -f "${BASH_SOURCE[0]}")")" @@ -23,9 +36,13 @@ serverfiles="${rootdir}/serverfiles" functionsdir="${lgsmdir}/functions" libdir="${lgsmdir}/lib" tmpdir="${lgsmdir}/tmp" +datadir="${lgsmdir}/data" +serverlist="${datadir}/serverlist.csv" +serverlistmenu="${datadir}/serverlistmenu.csv" configdir="${lgsmdir}/config-lgsm" configdirserver="${configdir}/${gameservername}" configdirdefault="${lgsmdir}/config-default" +userinput="${1}" # Allows for testing not on Travis CI if [ ! -v TRAVIS ]; then @@ -40,16 +57,16 @@ githubuser="GameServerManagers" githubrepo="LinuxGSM" githubbranch="${TRAVIS_BRANCH}" -# Core Function that is required first +# Core function that is required first. core_functions.sh(){ functionfile="${FUNCNAME}" fn_bootstrap_fetch_file_github "lgsm/functions" "core_functions.sh" "${functionsdir}" "chmodx" "run" "noforcedl" "nomd5" } # Bootstrap -# Fetches the core functions required before passed off to core_dl.sh +# Fetches the core functions required before passed off to core_dl.sh. -# Fetches core functions +# Fetches core functions. fn_bootstrap_fetch_file(){ remote_fileurl="${1}" local_filedir="${2}" @@ -58,42 +75,42 @@ fn_bootstrap_fetch_file(){ run="${5:-0}" forcedl="${6:-0}" md5="${7:-0}" - # download file if missing or download forced + # Download file if missing or download forced. if [ ! -f "${local_filedir}/${local_filename}" ]||[ "${forcedl}" == "forcedl" ]; then if [ ! -d "${local_filedir}" ]; then mkdir -p "${local_filedir}" fi - # Defines curl path + # Defines curl path. curlpath=$(command -v curl 2>/dev/null) - # If curl exists download file + # If curl exists download file. if [ "$(basename "${curlpath}")" == "curl" ]; then - # trap to remove part downloaded files + # Trap to remove part downloaded files. echo -en " 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 "FAIL" if [ -f "${lgsmlog}" ]; then echo -e "${remote_fileurl}" | tee -a "${lgsmlog}" echo "${curlcmd}" | tee -a "${lgsmlog}" fi exit 1 else - echo -e "\e[0;32mOK\e[0m" + echo -e "OK" fi else echo "[ FAIL ] Curl is not installed" exit 1 fi - # make file chmodx if chmodx is set + # Make file chmodx if chmodx is set. if [ "${chmodx}" == "chmodx" ]; then chmod +x "${local_filedir}/${local_filename}" fi fi if [ -f "${local_filedir}/${local_filename}" ]; then - # run file if run is set + # Run file if run is set. if [ "${run}" == "run" ]; then source "${local_filedir}/${local_filename}" fi @@ -112,11 +129,11 @@ fn_bootstrap_fetch_file_github(){ run="${5:-0}" forcedl="${6:-0}" md5="${7:-0}" - # Passes vars to the file download function + # Passes vars to the file download function. fn_bootstrap_fetch_file "${remote_fileurl}" "${local_filedir}" "${local_filename}" "${chmodx}" "${run}" "${forcedl}" "${md5}" } -# Installer menu +# Installer menu. fn_print_center() { columns="$(tput cols)" @@ -129,7 +146,7 @@ fn_print_horizontal(){ printf '%*s\n' "${COLUMNS:-$(tput cols)}" '' | tr ' ' "${char}" } -# Bash Menu +# Bash menu. fn_install_menu_bash() { local resultvar=$1 title=$2 @@ -153,7 +170,7 @@ fn_install_menu_bash() { done } -# Whiptail/Dialog Menu +# Whiptail/Dialog menu. fn_install_menu_whiptail() { local menucmd=$1 local resultvar=$2 @@ -168,7 +185,7 @@ fn_install_menu_whiptail() { while read -r line; do key=$(echo "${line}" | awk -F "," '{print $3}') val=$(echo "${line}" | awk -F "," '{print $2}') - menu_options+=( ${val//\"} "${key//\"}" ) + 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 @@ -178,14 +195,14 @@ fn_install_menu_whiptail() { fi } -# Menu selector +# Menu selector. fn_install_menu() { local resultvar=$1 local selection="" title=$2 caption=$3 options=$4 - # Get menu command + # Get menu command. for menucmd in whiptail dialog bash; do if [ -x "$(command -v "${menucmd}")" ]; then menucmd=$(command -v "${menucmd}") @@ -201,7 +218,7 @@ fn_install_menu() { eval "$resultvar=\"${selection}\"" } -# Gets server info from serverlist.csv and puts in to array +# Gets server info from serverlist.csv and puts in to array. fn_server_info(){ IFS="," server_info_array=($(grep -aw "${userinput}" "${serverlist}")) @@ -219,7 +236,7 @@ fn_install_getopt(){ echo -e "" echo -e "Commands" echo -e "install\t\t| Select server to install." - echo -e "servername\t| e.g $0 csgoserver. Enter name of server/game to install." + echo -e "servername\t| Enter name of game server to install. e.g $0 csgoserver." echo -e "list\t\t| List all servers available for install." exit } @@ -248,9 +265,14 @@ fn_install_file(){ exit } -# Prevent from running this script as root. +# Prevent LinuxGSM from running as root. Except if doing a dependency install. if [ "$(whoami)" == "root" ]; then - if [ ! -f "${functionsdir}/core_functions.sh" ]||[ ! -f "${functionsdir}/check_root.sh" ]||[ ! -f "${functionsdir}/core_messages.sh" ]; then + if [ "${userinput}" == "install" ]||[ "${userinput}" == "auto-install" ]||[ "${userinput}" == "i" ]||[ "${userinput}" == "ai" ]; then + if [ "${shortname}" == "core" ]; then + echo "[ FAIL ] Do NOT run this script as root!" + exit 1 + fi + elif [ ! -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 @@ -259,26 +281,23 @@ if [ "$(whoami)" == "root" ]; then fi fi -# LinuxGSM installer mode -if [ "${shortname}" == "core" ]; then - userinput=$1 - datadir="${tmpdir}/data" - serverlist="${datadir}/serverlist.csv" - - # Download the latest serverlist. This is the complete list of all supported servers. - fn_bootstrap_fetch_file_github "lgsm/data" "serverlist.csv" "${datadir}" "nochmodx" "norun" "forcedl" "nomd5" - if [ ! -f "${serverlist}" ]; then - echo "[ FAIL ] serverlist.csv could not be loaded." - exit 1 - fi +# Download the latest serverlist. This is the complete list of all supported servers. +fn_bootstrap_fetch_file_github "lgsm/data" "serverlist.csv" "${datadir}" "nochmodx" "norun" "forcedl" "nomd5" +if [ ! -f "${serverlist}" ]; then + echo "[ FAIL ] serverlist.csv could not be loaded." + exit 1 +fi - if [ "${userinput}" == "list" ]; then +# LinuxGSM installer mode. +if [ "${shortname}" == "core" ]; then + if [ "${userinput}" == "list" ]||[ "${userinput}" == "l" ]; then { - awk -F "," '{print $2 "\t" $3}' "${serverlist}" + tail -n +2 "${serverlist}" | awk -F "," '{print $2 "\t" $3}' } | column -s $'\t' -t | more exit elif [ "${userinput}" == "install" ]||[ "${userinput}" == "i" ]; then - fn_install_menu result "LinuxGSM" "Select game to install" "${serverlist}" + tail -n +2 "${serverlist}" | awk -F "," '{print $1 "," $2 "," $3}' > "${serverlistmenu}" + fn_install_menu result "LinuxGSM" "Select game server to install." "${serverlistmenu}" userinput="${result}" fn_server_info if [ "${result}" == "${gameservername}" ]; then @@ -301,65 +320,68 @@ if [ "${shortname}" == "core" ]; then fn_install_getopt fi -# LinuxGSM Server Mode +# LinuxGSM server mode. else 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/${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 -en " copying _default.cfg...\c" - 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" - exit 1 - else - echo -e "\e[0;32mOK\e[0m" + if [ "${shortname}" != "core-dep" ]; then + # 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/${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 - else - 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." + if [ ! -f "${configdirserver}/_default.cfg" ]; then + mkdir -p "${configdirserver}" echo -en " copying _default.cfg...\c" 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" + echo -e "FAIL" exit 1 else - echo -e "\e[0;32mOK\e[0m" + echo -e "OK" + fi + else + 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 -en " copying _default.cfg...\c" + cp -R "${configdirdefault}/config-lgsm/${gameservername}/_default.cfg" "${configdirserver}/_default.cfg" + exitcode=$? + if [ ${exitcode} -ne 0 ]; then + echo -e "FAIL" + exit 1 + else + echo -e "OK" + fi fi fi - fi - 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" "${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" "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 - fn_fetch_file_github "" "linuxgsm.sh" "${tmpdir}" "chmodx" "norun" "noforcedl" "nomd5" - fi + 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" "${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" "nochmodx" "norun" "noforcedl" "nomd5" + source "${configdirserver}/${servicename}.cfg" + else + source "${configdirserver}/${servicename}.cfg" + fi - # Prevents running of core_exit.sh for Travis. - if [ -z "${travistest}" ]; then + # Load the linuxgsm.sh in to tmpdir. If missing download it. + if [ ! -f "${tmpdir}/linuxgsm.sh" ]; then + fn_fetch_file_github "" "linuxgsm.sh" "${tmpdir}" "chmodx" "norun" "noforcedl" "nomd5" + fi + fi + # Enables ANSI colours from core_messages.sh. Can be disabled with ansi=off. + fn_ansi_loader + # Prevents running of core_exit.sh for Travis-CI. + if [ "${travistest}" != "1" ]; then getopt=$1 core_getopt.sh fi @@ -783,7 +805,6 @@ echo "IP: ${travisip}" echo "" echo "5.0 - Monitor Tests" echo "==================================================================" -info_config.sh echo "" echo "Server IP - Port: ${ip}:${port}" echo "Server IP - Query Port: ${ip}:${queryport}" diff --git a/tests/tests_ts3server.sh b/tests/tests_ts3server.sh index f4de2baa5..9aa929d55 100644 --- a/tests/tests_ts3server.sh +++ b/tests/tests_ts3server.sh @@ -3,12 +3,25 @@ # Author: Daniel Gibbs # License: MIT License, Copyright (c) 2019 Daniel Gibbs # Purpose: Travis CI Tests: Teamspeak 3 | Linux Game Server Management Script -# Contributors: https://github.com/GameServerManagers/LinuxGSM/graphs/contributors -# Documentation: https://docs.linuxgsm.com/ +# Contributors: https://linuxgsm.com/contrib +# Documentation: https://docs.linuxgsm.com # Website: https://linuxgsm.com +# DO NOT EDIT THIS FILE +# LinuxGSM configuration is no longer edited here +# To update your LinuxGSM config go to: +# lgsm/config-lgsm +# https://docs.linuxgsm.com/configuration/linuxgsm-config + +# Debugging +if [ -f ".dev-debug" ]; then + exec 5>dev-debug.log + BASH_XTRACEFD="5" + set -x +fi + travistest="1" -version="180409" +version="v19.6.0" shortname="ts3" gameservername="ts3server" rootdir="$(dirname "$(readlink -f "${BASH_SOURCE[0]}")")" @@ -23,9 +36,13 @@ serverfiles="${rootdir}/serverfiles" functionsdir="${lgsmdir}/functions" libdir="${lgsmdir}/lib" tmpdir="${lgsmdir}/tmp" +datadir="${lgsmdir}/data" +serverlist="${datadir}/serverlist.csv" +serverlistmenu="${datadir}/serverlistmenu.csv" configdir="${lgsmdir}/config-lgsm" configdirserver="${configdir}/${gameservername}" configdirdefault="${lgsmdir}/config-default" +userinput="${1}" # Allows for testing not on Travis CI if [ ! -v TRAVIS ]; then @@ -40,16 +57,16 @@ githubuser="GameServerManagers" githubrepo="LinuxGSM" githubbranch="${TRAVIS_BRANCH}" -# Core Function that is required first +# Core function that is required first. core_functions.sh(){ functionfile="${FUNCNAME}" fn_bootstrap_fetch_file_github "lgsm/functions" "core_functions.sh" "${functionsdir}" "chmodx" "run" "noforcedl" "nomd5" } # Bootstrap -# Fetches the core functions required before passed off to core_dl.sh +# Fetches the core functions required before passed off to core_dl.sh. -# Fetches core functions +# Fetches core functions. fn_bootstrap_fetch_file(){ remote_fileurl="${1}" local_filedir="${2}" @@ -58,42 +75,42 @@ fn_bootstrap_fetch_file(){ run="${5:-0}" forcedl="${6:-0}" md5="${7:-0}" - # download file if missing or download forced + # Download file if missing or download forced. if [ ! -f "${local_filedir}/${local_filename}" ]||[ "${forcedl}" == "forcedl" ]; then if [ ! -d "${local_filedir}" ]; then mkdir -p "${local_filedir}" fi - # Defines curl path + # Defines curl path. curlpath=$(command -v curl 2>/dev/null) - # If curl exists download file + # If curl exists download file. if [ "$(basename "${curlpath}")" == "curl" ]; then - # trap to remove part downloaded files + # Trap to remove part downloaded files. echo -en " 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 "FAIL" if [ -f "${lgsmlog}" ]; then echo -e "${remote_fileurl}" | tee -a "${lgsmlog}" echo "${curlcmd}" | tee -a "${lgsmlog}" fi exit 1 else - echo -e "\e[0;32mOK\e[0m" + echo -e "OK" fi else echo "[ FAIL ] Curl is not installed" exit 1 fi - # make file chmodx if chmodx is set + # Make file chmodx if chmodx is set. if [ "${chmodx}" == "chmodx" ]; then chmod +x "${local_filedir}/${local_filename}" fi fi if [ -f "${local_filedir}/${local_filename}" ]; then - # run file if run is set + # Run file if run is set. if [ "${run}" == "run" ]; then source "${local_filedir}/${local_filename}" fi @@ -112,11 +129,11 @@ fn_bootstrap_fetch_file_github(){ run="${5:-0}" forcedl="${6:-0}" md5="${7:-0}" - # Passes vars to the file download function + # Passes vars to the file download function. fn_bootstrap_fetch_file "${remote_fileurl}" "${local_filedir}" "${local_filename}" "${chmodx}" "${run}" "${forcedl}" "${md5}" } -# Installer menu +# Installer menu. fn_print_center() { columns="$(tput cols)" @@ -129,7 +146,7 @@ fn_print_horizontal(){ printf '%*s\n' "${COLUMNS:-$(tput cols)}" '' | tr ' ' "${char}" } -# Bash Menu +# Bash menu. fn_install_menu_bash() { local resultvar=$1 title=$2 @@ -153,7 +170,7 @@ fn_install_menu_bash() { done } -# Whiptail/Dialog Menu +# Whiptail/Dialog menu. fn_install_menu_whiptail() { local menucmd=$1 local resultvar=$2 @@ -168,7 +185,7 @@ fn_install_menu_whiptail() { while read -r line; do key=$(echo "${line}" | awk -F "," '{print $3}') val=$(echo "${line}" | awk -F "," '{print $2}') - menu_options+=( ${val//\"} "${key//\"}" ) + 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 @@ -178,14 +195,14 @@ fn_install_menu_whiptail() { fi } -# Menu selector +# Menu selector. fn_install_menu() { local resultvar=$1 local selection="" title=$2 caption=$3 options=$4 - # Get menu command + # Get menu command. for menucmd in whiptail dialog bash; do if [ -x "$(command -v "${menucmd}")" ]; then menucmd=$(command -v "${menucmd}") @@ -201,7 +218,7 @@ fn_install_menu() { eval "$resultvar=\"${selection}\"" } -# Gets server info from serverlist.csv and puts in to array +# Gets server info from serverlist.csv and puts in to array. fn_server_info(){ IFS="," server_info_array=($(grep -aw "${userinput}" "${serverlist}")) @@ -219,7 +236,7 @@ fn_install_getopt(){ echo -e "" echo -e "Commands" echo -e "install\t\t| Select server to install." - echo -e "servername\t| e.g $0 csgoserver. Enter name of server/game to install." + echo -e "servername\t| Enter name of game server to install. e.g $0 csgoserver." echo -e "list\t\t| List all servers available for install." exit } @@ -248,9 +265,14 @@ fn_install_file(){ exit } -# Prevent from running this script as root. +# Prevent LinuxGSM from running as root. Except if doing a dependency install. if [ "$(whoami)" == "root" ]; then - if [ ! -f "${functionsdir}/core_functions.sh" ]||[ ! -f "${functionsdir}/check_root.sh" ]||[ ! -f "${functionsdir}/core_messages.sh" ]; then + if [ "${userinput}" == "install" ]||[ "${userinput}" == "auto-install" ]||[ "${userinput}" == "i" ]||[ "${userinput}" == "ai" ]; then + if [ "${shortname}" == "core" ]; then + echo "[ FAIL ] Do NOT run this script as root!" + exit 1 + fi + elif [ ! -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 @@ -259,26 +281,23 @@ if [ "$(whoami)" == "root" ]; then fi fi -# LinuxGSM installer mode -if [ "${shortname}" == "core" ]; then - userinput=$1 - datadir="${tmpdir}/data" - serverlist="${datadir}/serverlist.csv" - - # Download the latest serverlist. This is the complete list of all supported servers. - fn_bootstrap_fetch_file_github "lgsm/data" "serverlist.csv" "${datadir}" "nochmodx" "norun" "forcedl" "nomd5" - if [ ! -f "${serverlist}" ]; then - echo "[ FAIL ] serverlist.csv could not be loaded." - exit 1 - fi +# Download the latest serverlist. This is the complete list of all supported servers. +fn_bootstrap_fetch_file_github "lgsm/data" "serverlist.csv" "${datadir}" "nochmodx" "norun" "forcedl" "nomd5" +if [ ! -f "${serverlist}" ]; then + echo "[ FAIL ] serverlist.csv could not be loaded." + exit 1 +fi - if [ "${userinput}" == "list" ]; then +# LinuxGSM installer mode. +if [ "${shortname}" == "core" ]; then + if [ "${userinput}" == "list" ]||[ "${userinput}" == "l" ]; then { - awk -F "," '{print $2 "\t" $3}' "${serverlist}" + tail -n +2 "${serverlist}" | awk -F "," '{print $2 "\t" $3}' } | column -s $'\t' -t | more exit elif [ "${userinput}" == "install" ]||[ "${userinput}" == "i" ]; then - fn_install_menu result "LinuxGSM" "Select game to install" "${serverlist}" + tail -n +2 "${serverlist}" | awk -F "," '{print $1 "," $2 "," $3}' > "${serverlistmenu}" + fn_install_menu result "LinuxGSM" "Select game server to install." "${serverlistmenu}" userinput="${result}" fn_server_info if [ "${result}" == "${gameservername}" ]; then @@ -301,65 +320,68 @@ if [ "${shortname}" == "core" ]; then fn_install_getopt fi -# LinuxGSM Server Mode +# LinuxGSM server mode. else 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/${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 -en " copying _default.cfg...\c" - 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" - exit 1 - else - echo -e "\e[0;32mOK\e[0m" + if [ "${shortname}" != "core-dep" ]; then + # 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/${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 - else - 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." + if [ ! -f "${configdirserver}/_default.cfg" ]; then + mkdir -p "${configdirserver}" echo -en " copying _default.cfg...\c" 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" + echo -e "FAIL" exit 1 else - echo -e "\e[0;32mOK\e[0m" + echo -e "OK" + fi + else + 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 -en " copying _default.cfg...\c" + cp -R "${configdirdefault}/config-lgsm/${gameservername}/_default.cfg" "${configdirserver}/_default.cfg" + exitcode=$? + if [ ${exitcode} -ne 0 ]; then + echo -e "FAIL" + exit 1 + else + echo -e "OK" + fi fi fi - fi - 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" "${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" "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 - fn_fetch_file_github "" "linuxgsm.sh" "${tmpdir}" "chmodx" "norun" "noforcedl" "nomd5" - fi + 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" "${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" "nochmodx" "norun" "noforcedl" "nomd5" + source "${configdirserver}/${servicename}.cfg" + else + source "${configdirserver}/${servicename}.cfg" + fi - # Prevents running of core_exit.sh for Travis. - if [ -z "${travistest}" ]; then + # Load the linuxgsm.sh in to tmpdir. If missing download it. + if [ ! -f "${tmpdir}/linuxgsm.sh" ]; then + fn_fetch_file_github "" "linuxgsm.sh" "${tmpdir}" "chmodx" "norun" "noforcedl" "nomd5" + fi + fi + # Enables ANSI colours from core_messages.sh. Can be disabled with ansi=off. + fn_ansi_loader + # Prevents running of core_exit.sh for Travis-CI. + if [ "${travistest}" != "1" ]; then getopt=$1 core_getopt.sh fi @@ -760,7 +782,6 @@ grep functionfile= "${TRAVIS_BUILD_DIR}/dev-debug.log" | sed 's/functionfile=//g echo "" echo "5.0 - Monitor Tests" echo "==================================================================" - echo "" echo "Server IP - Port: ${ip}:${port}" echo "Server IP - Query Port: ${ip}:${queryport}" From eb391b13ee9385043336c872a9ca050e344e2fbd Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Sun, 16 Jun 2019 09:25:45 +0100 Subject: [PATCH 106/534] feat(monitor): monitor queries will not begin immediately after start (#2391) A delay timer has been added to give game servers time to boot before monitor begins query. This is useful for large game servers or that have several mods querydelay setting has been added to _default.cfg --- .../config-lgsm/arkserver/_default.cfg | 4 ++++ .../config-lgsm/arma3server/_default.cfg | 4 ++++ .../config-lgsm/bb2server/_default.cfg | 4 ++++ .../config-lgsm/bbserver/_default.cfg | 4 ++++ .../config-lgsm/bdserver/_default.cfg | 4 ++++ .../config-lgsm/bf1942server/_default.cfg | 4 ++++ .../config-lgsm/bmdmserver/_default.cfg | 4 ++++ .../config-lgsm/boserver/_default.cfg | 4 ++++ .../config-lgsm/bsserver/_default.cfg | 4 ++++ .../config-lgsm/bt1944server/_default.cfg | 4 ++++ .../config-lgsm/ccserver/_default.cfg | 4 ++++ .../config-lgsm/cod2server/_default.cfg | 4 ++++ .../config-lgsm/cod4server/_default.cfg | 4 ++++ .../config-lgsm/codserver/_default.cfg | 4 ++++ .../config-lgsm/coduoserver/_default.cfg | 4 ++++ .../config-lgsm/codwawserver/_default.cfg | 4 ++++ .../config-lgsm/csczserver/_default.cfg | 4 ++++ .../config-lgsm/csgoserver/_default.cfg | 4 ++++ .../config-lgsm/csserver/_default.cfg | 4 ++++ .../config-lgsm/cssserver/_default.cfg | 4 ++++ .../config-lgsm/dabserver/_default.cfg | 4 ++++ .../config-lgsm/dmcserver/_default.cfg | 4 ++++ .../config-lgsm/dodserver/_default.cfg | 4 ++++ .../config-lgsm/dodsserver/_default.cfg | 4 ++++ .../config-lgsm/doiserver/_default.cfg | 4 ++++ .../config-lgsm/dstserver/_default.cfg | 4 ++++ .../config-lgsm/dysserver/_default.cfg | 4 ++++ .../config-lgsm/ecoserver/_default.cfg | 4 ++++ .../config-lgsm/emserver/_default.cfg | 4 ++++ .../config-lgsm/etlserver/_default.cfg | 4 ++++ .../config-lgsm/fctrserver/_default.cfg | 4 ++++ .../config-lgsm/fofserver/_default.cfg | 4 ++++ .../config-lgsm/gesserver/_default.cfg | 4 ++++ .../config-lgsm/gmodserver/_default.cfg | 4 ++++ .../config-lgsm/hl2dmserver/_default.cfg | 4 ++++ .../config-lgsm/hldmserver/_default.cfg | 4 ++++ .../config-lgsm/hldmsserver/_default.cfg | 4 ++++ .../config-lgsm/hwserver/_default.cfg | 4 ++++ .../config-lgsm/insserver/_default.cfg | 4 ++++ .../config-lgsm/inssserver/_default.cfg | 4 ++++ .../config-lgsm/iosserver/_default.cfg | 4 ++++ .../config-lgsm/jc2server/_default.cfg | 4 ++++ .../config-lgsm/jc3server/_default.cfg | 4 ++++ .../config-lgsm/kf2server/_default.cfg | 4 ++++ .../config-lgsm/kfserver/_default.cfg | 4 ++++ .../config-lgsm/l4d2server/_default.cfg | 4 ++++ .../config-lgsm/l4dserver/_default.cfg | 4 ++++ .../config-lgsm/mcserver/_default.cfg | 4 ++++ .../config-lgsm/mhserver/_default.cfg | 4 ++++ .../config-lgsm/mtaserver/_default.cfg | 4 ++++ .../config-lgsm/mumbleserver/_default.cfg | 4 ++++ .../config-lgsm/ndserver/_default.cfg | 4 ++++ .../config-lgsm/nmrihserver/_default.cfg | 4 ++++ .../config-lgsm/ns2cserver/_default.cfg | 4 ++++ .../config-lgsm/ns2server/_default.cfg | 4 ++++ .../config-lgsm/nsserver/_default.cfg | 4 ++++ .../config-lgsm/opforserver/_default.cfg | 4 ++++ .../config-lgsm/pcserver/_default.cfg | 4 ++++ .../config-lgsm/pstbsserver/_default.cfg | 4 ++++ .../config-lgsm/pvkiiserver/_default.cfg | 4 ++++ .../config-lgsm/pzserver/_default.cfg | 4 ++++ .../config-lgsm/q2server/_default.cfg | 4 ++++ .../config-lgsm/q3server/_default.cfg | 4 ++++ .../config-lgsm/qlserver/_default.cfg | 4 ++++ .../config-lgsm/qwserver/_default.cfg | 4 ++++ .../config-lgsm/ricochetserver/_default.cfg | 4 ++++ .../config-lgsm/roserver/_default.cfg | 4 ++++ .../config-lgsm/rtcwserver/_default.cfg | 4 ++++ .../config-lgsm/rustserver/_default.cfg | 4 ++++ .../config-lgsm/rwserver/_default.cfg | 4 ++++ .../config-lgsm/sampserver/_default.cfg | 4 ++++ .../config-lgsm/sbotsserver/_default.cfg | 4 ++++ .../config-lgsm/sbserver/_default.cfg | 4 ++++ .../config-lgsm/sdtdserver/_default.cfg | 4 ++++ .../config-lgsm/sof2server/_default.cfg | 4 ++++ .../config-lgsm/squadserver/_default.cfg | 4 ++++ .../config-lgsm/ss3server/_default.cfg | 4 ++++ .../config-lgsm/stserver/_default.cfg | 4 ++++ .../config-lgsm/svenserver/_default.cfg | 4 ++++ .../config-lgsm/terrariaserver/_default.cfg | 4 ++++ .../config-lgsm/tf2server/_default.cfg | 4 ++++ .../config-lgsm/tfcserver/_default.cfg | 4 ++++ .../config-lgsm/ts3server/_default.cfg | 4 ++++ .../config-lgsm/tuserver/_default.cfg | 4 ++++ .../config-lgsm/twserver/_default.cfg | 4 ++++ .../config-lgsm/untserver/_default.cfg | 4 ++++ .../config-lgsm/ut2k4server/_default.cfg | 4 ++++ .../config-lgsm/ut3server/_default.cfg | 4 ++++ .../config-lgsm/ut99server/_default.cfg | 4 ++++ .../config-lgsm/utserver/_default.cfg | 4 ++++ .../config-lgsm/vsserver/_default.cfg | 4 ++++ .../config-lgsm/wetserver/_default.cfg | 4 ++++ .../config-lgsm/wurmserver/_default.cfg | 4 ++++ .../config-lgsm/zpsserver/_default.cfg | 4 ++++ lgsm/functions/command_backup.sh | 2 +- lgsm/functions/command_debug.sh | 2 +- lgsm/functions/command_dev_debug.sh | 4 ++-- lgsm/functions/command_monitor.sh | 21 ++++++++++++++++++- lgsm/functions/command_start.sh | 5 +++-- lgsm/functions/core_messages.sh | 9 ++++++++ tests/tests_fctrserver.sh | 2 +- tests/tests_jc2server.sh | 2 +- tests/tests_mcserver.sh | 2 +- tests/tests_ts3server.sh | 2 +- 104 files changed, 416 insertions(+), 11 deletions(-) diff --git a/lgsm/config-default/config-lgsm/arkserver/_default.cfg b/lgsm/config-default/config-lgsm/arkserver/_default.cfg index a1fec34a6..728a9f68a 100644 --- a/lgsm/config-default/config-lgsm/arkserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/arkserver/_default.cfg @@ -86,6 +86,10 @@ stoponbackup="on" consolelogging="on" logdays="7" +## Monitor | https://docs.linuxgsm.com/commands/monitor +# Query delay time +querydelay="5" + #### LinuxGSM Advanced Settings #### # ANSI Colors diff --git a/lgsm/config-default/config-lgsm/arma3server/_default.cfg b/lgsm/config-default/config-lgsm/arma3server/_default.cfg index 4f323f7e4..828bbdd04 100644 --- a/lgsm/config-default/config-lgsm/arma3server/_default.cfg +++ b/lgsm/config-default/config-lgsm/arma3server/_default.cfg @@ -100,6 +100,10 @@ stoponbackup="on" consolelogging="on" logdays="7" +## Monitor | https://docs.linuxgsm.com/commands/monitor +# Query delay time +querydelay="5" + #### LinuxGSM Advanced Settings #### # ANSI Colors diff --git a/lgsm/config-default/config-lgsm/bb2server/_default.cfg b/lgsm/config-default/config-lgsm/bb2server/_default.cfg index 48b1f164a..80e1244f9 100644 --- a/lgsm/config-default/config-lgsm/bb2server/_default.cfg +++ b/lgsm/config-default/config-lgsm/bb2server/_default.cfg @@ -90,6 +90,10 @@ stoponbackup="on" consolelogging="on" logdays="7" +## Monitor | https://docs.linuxgsm.com/commands/monitor +# Query delay time +querydelay="1" + #### LinuxGSM Advanced Settings #### # ANSI Colors diff --git a/lgsm/config-default/config-lgsm/bbserver/_default.cfg b/lgsm/config-default/config-lgsm/bbserver/_default.cfg index 1910706f2..2a89c8849 100644 --- a/lgsm/config-default/config-lgsm/bbserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/bbserver/_default.cfg @@ -84,6 +84,10 @@ stoponbackup="on" consolelogging="on" logdays="7" +## Monitor | https://docs.linuxgsm.com/commands/monitor +# Query delay time +querydelay="1" + #### LinuxGSM Advanced Settings #### # ANSI Colors diff --git a/lgsm/config-default/config-lgsm/bdserver/_default.cfg b/lgsm/config-default/config-lgsm/bdserver/_default.cfg index 99f546ab6..5e030759c 100644 --- a/lgsm/config-default/config-lgsm/bdserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/bdserver/_default.cfg @@ -84,6 +84,10 @@ stoponbackup="on" consolelogging="on" logdays="7" +## Monitor | https://docs.linuxgsm.com/commands/monitor +# Query delay time +querydelay="1" + #### LinuxGSM Advanced Settings #### # ANSI Colors diff --git a/lgsm/config-default/config-lgsm/bf1942server/_default.cfg b/lgsm/config-default/config-lgsm/bf1942server/_default.cfg index 23c61227f..c1193658f 100644 --- a/lgsm/config-default/config-lgsm/bf1942server/_default.cfg +++ b/lgsm/config-default/config-lgsm/bf1942server/_default.cfg @@ -77,6 +77,10 @@ stoponbackup="on" consolelogging="on" logdays="7" +## Monitor | https://docs.linuxgsm.com/commands/monitor +# Query delay time +querydelay="1" + #### LinuxGSM Advanced Settings #### # ANSI Colors diff --git a/lgsm/config-default/config-lgsm/bmdmserver/_default.cfg b/lgsm/config-default/config-lgsm/bmdmserver/_default.cfg index 1c29b6aa5..f2d27f8b5 100644 --- a/lgsm/config-default/config-lgsm/bmdmserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/bmdmserver/_default.cfg @@ -90,6 +90,10 @@ stoponbackup="on" consolelogging="on" logdays="7" +## Monitor | https://docs.linuxgsm.com/commands/monitor +# Query delay time +querydelay="1" + #### LinuxGSM Advanced Settings #### # ANSI Colors diff --git a/lgsm/config-default/config-lgsm/boserver/_default.cfg b/lgsm/config-default/config-lgsm/boserver/_default.cfg index ae9a0cee8..1793f6bd5 100644 --- a/lgsm/config-default/config-lgsm/boserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/boserver/_default.cfg @@ -83,6 +83,10 @@ stoponbackup="on" consolelogging="on" logdays="7" +## Monitor | https://docs.linuxgsm.com/commands/monitor +# Query delay time +querydelay="1" + #### LinuxGSM Advanced Settings #### # ANSI Colors diff --git a/lgsm/config-default/config-lgsm/bsserver/_default.cfg b/lgsm/config-default/config-lgsm/bsserver/_default.cfg index 93eb491f3..08823a4bc 100644 --- a/lgsm/config-default/config-lgsm/bsserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/bsserver/_default.cfg @@ -94,6 +94,10 @@ stoponbackup="on" consolelogging="on" logdays="7" +## Monitor | https://docs.linuxgsm.com/commands/monitor +# Query delay time +querydelay="1" + #### LinuxGSM Advanced Settings #### # ANSI Colors diff --git a/lgsm/config-default/config-lgsm/bt1944server/_default.cfg b/lgsm/config-default/config-lgsm/bt1944server/_default.cfg index b5164fecf..2176236c5 100644 --- a/lgsm/config-default/config-lgsm/bt1944server/_default.cfg +++ b/lgsm/config-default/config-lgsm/bt1944server/_default.cfg @@ -82,6 +82,10 @@ stoponbackup="on" consolelogging="on" logdays="7" +## Monitor | https://docs.linuxgsm.com/commands/monitor +# Query delay time +querydelay="1" + #### LinuxGSM Advanced Settings #### # ANSI Colors diff --git a/lgsm/config-default/config-lgsm/ccserver/_default.cfg b/lgsm/config-default/config-lgsm/ccserver/_default.cfg index 7d30f03bb..65d36f1b2 100644 --- a/lgsm/config-default/config-lgsm/ccserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/ccserver/_default.cfg @@ -85,6 +85,10 @@ stoponbackup="on" consolelogging="on" logdays="7" +## Monitor | https://docs.linuxgsm.com/commands/monitor +# Query delay time +querydelay="1" + #### LinuxGSM Advanced Settings #### # ANSI Colors diff --git a/lgsm/config-default/config-lgsm/cod2server/_default.cfg b/lgsm/config-default/config-lgsm/cod2server/_default.cfg index 1d114e688..8f4602123 100644 --- a/lgsm/config-default/config-lgsm/cod2server/_default.cfg +++ b/lgsm/config-default/config-lgsm/cod2server/_default.cfg @@ -80,6 +80,10 @@ stoponbackup="on" consolelogging="on" logdays="7" +## Monitor | https://docs.linuxgsm.com/commands/monitor +# Query delay time +querydelay="1" + #### LinuxGSM Advanced Settings #### # ANSI Colors diff --git a/lgsm/config-default/config-lgsm/cod4server/_default.cfg b/lgsm/config-default/config-lgsm/cod4server/_default.cfg index 210450f59..6ef656494 100644 --- a/lgsm/config-default/config-lgsm/cod4server/_default.cfg +++ b/lgsm/config-default/config-lgsm/cod4server/_default.cfg @@ -80,6 +80,10 @@ stoponbackup="on" consolelogging="on" logdays="7" +## Monitor | https://docs.linuxgsm.com/commands/monitor +# Query delay time +querydelay="1" + #### LinuxGSM Advanced Settings #### # ANSI Colors diff --git a/lgsm/config-default/config-lgsm/codserver/_default.cfg b/lgsm/config-default/config-lgsm/codserver/_default.cfg index d548cfb59..7c6cd2e35 100644 --- a/lgsm/config-default/config-lgsm/codserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/codserver/_default.cfg @@ -80,6 +80,10 @@ stoponbackup="on" consolelogging="on" logdays="7" +## Monitor | https://docs.linuxgsm.com/commands/monitor +# Query delay time +querydelay="1" + #### LinuxGSM Advanced Settings #### # ANSI Colors diff --git a/lgsm/config-default/config-lgsm/coduoserver/_default.cfg b/lgsm/config-default/config-lgsm/coduoserver/_default.cfg index 355f9f339..3a61761c5 100644 --- a/lgsm/config-default/config-lgsm/coduoserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/coduoserver/_default.cfg @@ -80,6 +80,10 @@ stoponbackup="on" consolelogging="on" logdays="7" +## Monitor | https://docs.linuxgsm.com/commands/monitor +# Query delay time +querydelay="1" + #### LinuxGSM Advanced Settings #### # ANSI Colors diff --git a/lgsm/config-default/config-lgsm/codwawserver/_default.cfg b/lgsm/config-default/config-lgsm/codwawserver/_default.cfg index 3f0b882bc..1610ab01f 100644 --- a/lgsm/config-default/config-lgsm/codwawserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/codwawserver/_default.cfg @@ -80,6 +80,10 @@ stoponbackup="on" consolelogging="on" logdays="7" +## Monitor | https://docs.linuxgsm.com/commands/monitor +# Query delay time +querydelay="1" + #### LinuxGSM Advanced Settings #### # ANSI Colors diff --git a/lgsm/config-default/config-lgsm/csczserver/_default.cfg b/lgsm/config-default/config-lgsm/csczserver/_default.cfg index b3620a68c..eb85d04ce 100644 --- a/lgsm/config-default/config-lgsm/csczserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/csczserver/_default.cfg @@ -84,6 +84,10 @@ stoponbackup="on" consolelogging="on" logdays="7" +## Monitor | https://docs.linuxgsm.com/commands/monitor +# Query delay time +querydelay="1" + #### LinuxGSM Advanced Settings #### # ANSI Colors diff --git a/lgsm/config-default/config-lgsm/csgoserver/_default.cfg b/lgsm/config-default/config-lgsm/csgoserver/_default.cfg index fa9a79e9d..5dac93530 100644 --- a/lgsm/config-default/config-lgsm/csgoserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/csgoserver/_default.cfg @@ -110,6 +110,10 @@ stoponbackup="on" consolelogging="on" logdays="7" +## Monitor | https://docs.linuxgsm.com/commands/monitor +# Query delay time +querydelay="1" + #### LinuxGSM Advanced Settings #### # ANSI Colors diff --git a/lgsm/config-default/config-lgsm/csserver/_default.cfg b/lgsm/config-default/config-lgsm/csserver/_default.cfg index e088813a3..60390eb68 100644 --- a/lgsm/config-default/config-lgsm/csserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/csserver/_default.cfg @@ -84,6 +84,10 @@ stoponbackup="on" consolelogging="on" logdays="7" +## Monitor | https://docs.linuxgsm.com/commands/monitor +# Query delay time +querydelay="1" + #### LinuxGSM Advanced Settings #### # ANSI Colors diff --git a/lgsm/config-default/config-lgsm/cssserver/_default.cfg b/lgsm/config-default/config-lgsm/cssserver/_default.cfg index dccd9afbb..e07733c32 100644 --- a/lgsm/config-default/config-lgsm/cssserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/cssserver/_default.cfg @@ -90,6 +90,10 @@ stoponbackup="on" consolelogging="on" logdays="7" +## Monitor | https://docs.linuxgsm.com/commands/monitor +# Query delay time +querydelay="1" + #### LinuxGSM Advanced Settings #### # ANSI Colors diff --git a/lgsm/config-default/config-lgsm/dabserver/_default.cfg b/lgsm/config-default/config-lgsm/dabserver/_default.cfg index dc6ad1bde..e65d5cb94 100644 --- a/lgsm/config-default/config-lgsm/dabserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/dabserver/_default.cfg @@ -85,6 +85,10 @@ stoponbackup="on" consolelogging="on" logdays="7" +## Monitor | https://docs.linuxgsm.com/commands/monitor +# Query delay time +querydelay="1" + #### LinuxGSM Advanced Settings #### # ANSI Colors diff --git a/lgsm/config-default/config-lgsm/dmcserver/_default.cfg b/lgsm/config-default/config-lgsm/dmcserver/_default.cfg index fa68dd498..804cb020c 100644 --- a/lgsm/config-default/config-lgsm/dmcserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/dmcserver/_default.cfg @@ -84,6 +84,10 @@ stoponbackup="on" consolelogging="on" logdays="7" +## Monitor | https://docs.linuxgsm.com/commands/monitor +# Query delay time +querydelay="1" + #### LinuxGSM Advanced Settings #### # ANSI Colors diff --git a/lgsm/config-default/config-lgsm/dodserver/_default.cfg b/lgsm/config-default/config-lgsm/dodserver/_default.cfg index 77c07a7f4..e82012e29 100644 --- a/lgsm/config-default/config-lgsm/dodserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/dodserver/_default.cfg @@ -84,6 +84,10 @@ stoponbackup="on" consolelogging="on" logdays="7" +## Monitor | https://docs.linuxgsm.com/commands/monitor +# Query delay time +querydelay="1" + #### LinuxGSM Advanced Settings #### # ANSI Colors diff --git a/lgsm/config-default/config-lgsm/dodsserver/_default.cfg b/lgsm/config-default/config-lgsm/dodsserver/_default.cfg index 8f01c98ea..4ce487dbc 100644 --- a/lgsm/config-default/config-lgsm/dodsserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/dodsserver/_default.cfg @@ -85,6 +85,10 @@ stoponbackup="on" consolelogging="on" logdays="7" +## Monitor | https://docs.linuxgsm.com/commands/monitor +# Query delay time +querydelay="1" + #### LinuxGSM Advanced Settings #### # ANSI Colors diff --git a/lgsm/config-default/config-lgsm/doiserver/_default.cfg b/lgsm/config-default/config-lgsm/doiserver/_default.cfg index da35c0130..1b8f16916 100644 --- a/lgsm/config-default/config-lgsm/doiserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/doiserver/_default.cfg @@ -87,6 +87,10 @@ stoponbackup="on" consolelogging="on" logdays="7" +## Monitor | https://docs.linuxgsm.com/commands/monitor +# Query delay time +querydelay="1" + #### LinuxGSM Advanced Settings #### # ANSI Colors diff --git a/lgsm/config-default/config-lgsm/dstserver/_default.cfg b/lgsm/config-default/config-lgsm/dstserver/_default.cfg index f4af4602b..70bc1e1bc 100644 --- a/lgsm/config-default/config-lgsm/dstserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/dstserver/_default.cfg @@ -88,6 +88,10 @@ stoponbackup="on" consolelogging="on" logdays="7" +## Monitor | https://docs.linuxgsm.com/commands/monitor +# Query delay time +querydelay="1" + #### LinuxGSM Advanced Settings #### # ANSI Colors diff --git a/lgsm/config-default/config-lgsm/dysserver/_default.cfg b/lgsm/config-default/config-lgsm/dysserver/_default.cfg index 48f26076f..554bc1ee6 100644 --- a/lgsm/config-default/config-lgsm/dysserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/dysserver/_default.cfg @@ -90,6 +90,10 @@ stoponbackup="on" consolelogging="on" logdays="7" +## Monitor | https://docs.linuxgsm.com/commands/monitor +# Query delay time +querydelay="1" + #### LinuxGSM Advanced Settings #### # ANSI Colors diff --git a/lgsm/config-default/config-lgsm/ecoserver/_default.cfg b/lgsm/config-default/config-lgsm/ecoserver/_default.cfg index ed261434f..b08ddd850 100644 --- a/lgsm/config-default/config-lgsm/ecoserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/ecoserver/_default.cfg @@ -73,6 +73,10 @@ stoponbackup="on" consolelogging="on" logdays="7" +## Monitor | https://docs.linuxgsm.com/commands/monitor +# Query delay time +querydelay="1" + #### LinuxGSM Advanced Settings #### # ANSI Colors diff --git a/lgsm/config-default/config-lgsm/emserver/_default.cfg b/lgsm/config-default/config-lgsm/emserver/_default.cfg index 500165b64..5b9efc6de 100644 --- a/lgsm/config-default/config-lgsm/emserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/emserver/_default.cfg @@ -90,6 +90,10 @@ stoponbackup="on" consolelogging="on" logdays="7" +## Monitor | https://docs.linuxgsm.com/commands/monitor +# Query delay time +querydelay="1" + #### LinuxGSM Advanced Settings #### # ANSI Colors diff --git a/lgsm/config-default/config-lgsm/etlserver/_default.cfg b/lgsm/config-default/config-lgsm/etlserver/_default.cfg index 22cfde4bb..9033c8fcf 100644 --- a/lgsm/config-default/config-lgsm/etlserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/etlserver/_default.cfg @@ -74,6 +74,10 @@ stoponbackup="on" consolelogging="on" logdays="7" +## Monitor | https://docs.linuxgsm.com/commands/monitor +# Query delay time +querydelay="1" + #### LinuxGSM Advanced Settings #### # ANSI Colors diff --git a/lgsm/config-default/config-lgsm/fctrserver/_default.cfg b/lgsm/config-default/config-lgsm/fctrserver/_default.cfg index ed0968baa..59fdd7b8f 100644 --- a/lgsm/config-default/config-lgsm/fctrserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/fctrserver/_default.cfg @@ -85,6 +85,10 @@ stoponbackup="on" consolelogging="on" logdays="7" +## Monitor | https://docs.linuxgsm.com/commands/monitor +# Query delay time +querydelay="1" + #### LinuxGSM Advanced Settings #### # ANSI Colors diff --git a/lgsm/config-default/config-lgsm/fofserver/_default.cfg b/lgsm/config-default/config-lgsm/fofserver/_default.cfg index 4ae3ecb4c..692bce2bb 100644 --- a/lgsm/config-default/config-lgsm/fofserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/fofserver/_default.cfg @@ -85,6 +85,10 @@ stoponbackup="on" consolelogging="on" logdays="7" +## Monitor | https://docs.linuxgsm.com/commands/monitor +# Query delay time +querydelay="1" + #### LinuxGSM Advanced Settings #### # ANSI Colors diff --git a/lgsm/config-default/config-lgsm/gesserver/_default.cfg b/lgsm/config-default/config-lgsm/gesserver/_default.cfg index 3e049dc8b..4a16eacc2 100644 --- a/lgsm/config-default/config-lgsm/gesserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/gesserver/_default.cfg @@ -85,6 +85,10 @@ stoponbackup="on" consolelogging="on" logdays="7" +## Monitor | https://docs.linuxgsm.com/commands/monitor +# Query delay time +querydelay="1" + #### LinuxGSM Advanced Settings #### # ANSI Colors diff --git a/lgsm/config-default/config-lgsm/gmodserver/_default.cfg b/lgsm/config-default/config-lgsm/gmodserver/_default.cfg index 105694bbb..7090b26aa 100644 --- a/lgsm/config-default/config-lgsm/gmodserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/gmodserver/_default.cfg @@ -101,6 +101,10 @@ stoponbackup="on" consolelogging="on" logdays="7" +## Monitor | https://docs.linuxgsm.com/commands/monitor +# Query delay time +querydelay="5" + #### LinuxGSM Advanced Settings #### # ANSI Colors diff --git a/lgsm/config-default/config-lgsm/hl2dmserver/_default.cfg b/lgsm/config-default/config-lgsm/hl2dmserver/_default.cfg index d6cc0b37d..15a39af24 100644 --- a/lgsm/config-default/config-lgsm/hl2dmserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/hl2dmserver/_default.cfg @@ -85,6 +85,10 @@ stoponbackup="on" consolelogging="on" logdays="7" +## Monitor | https://docs.linuxgsm.com/commands/monitor +# Query delay time +querydelay="1" + #### LinuxGSM Advanced Settings #### # ANSI Colors diff --git a/lgsm/config-default/config-lgsm/hldmserver/_default.cfg b/lgsm/config-default/config-lgsm/hldmserver/_default.cfg index af8ec0a41..1f57e9880 100644 --- a/lgsm/config-default/config-lgsm/hldmserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/hldmserver/_default.cfg @@ -84,6 +84,10 @@ stoponbackup="on" consolelogging="on" logdays="7" +## Monitor | https://docs.linuxgsm.com/commands/monitor +# Query delay time +querydelay="1" + #### LinuxGSM Advanced Settings #### # ANSI Colors diff --git a/lgsm/config-default/config-lgsm/hldmsserver/_default.cfg b/lgsm/config-default/config-lgsm/hldmsserver/_default.cfg index 1c8b58bbd..c89b5a19c 100644 --- a/lgsm/config-default/config-lgsm/hldmsserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/hldmsserver/_default.cfg @@ -85,6 +85,10 @@ stoponbackup="on" consolelogging="on" logdays="7" +## Monitor | https://docs.linuxgsm.com/commands/monitor +# Query delay time +querydelay="1" + #### LinuxGSM Advanced Settings #### # ANSI Colors diff --git a/lgsm/config-default/config-lgsm/hwserver/_default.cfg b/lgsm/config-default/config-lgsm/hwserver/_default.cfg index 476bb2bd2..d01949784 100644 --- a/lgsm/config-default/config-lgsm/hwserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/hwserver/_default.cfg @@ -96,6 +96,10 @@ stoponbackup="on" consolelogging="on" logdays="7" +## Monitor | https://docs.linuxgsm.com/commands/monitor +# Query delay time +querydelay="1" + #### LinuxGSM Advanced Settings #### # ANSI Colors diff --git a/lgsm/config-default/config-lgsm/insserver/_default.cfg b/lgsm/config-default/config-lgsm/insserver/_default.cfg index a0f1471c2..4e09e078b 100644 --- a/lgsm/config-default/config-lgsm/insserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/insserver/_default.cfg @@ -92,6 +92,10 @@ stoponbackup="on" consolelogging="on" logdays="7" +## Monitor | https://docs.linuxgsm.com/commands/monitor +# Query delay time +querydelay="1" + #### LinuxGSM Advanced Settings #### # ANSI Colors diff --git a/lgsm/config-default/config-lgsm/inssserver/_default.cfg b/lgsm/config-default/config-lgsm/inssserver/_default.cfg index 312f8826d..04ab3128c 100644 --- a/lgsm/config-default/config-lgsm/inssserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/inssserver/_default.cfg @@ -93,6 +93,10 @@ stoponbackup="on" consolelogging="on" logdays="7" +## Monitor | https://docs.linuxgsm.com/commands/monitor +# Query delay time +querydelay="1" + #### LinuxGSM Advanced Settings #### # ANSI Colors diff --git a/lgsm/config-default/config-lgsm/iosserver/_default.cfg b/lgsm/config-default/config-lgsm/iosserver/_default.cfg index fccbc13d9..435b8310e 100644 --- a/lgsm/config-default/config-lgsm/iosserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/iosserver/_default.cfg @@ -85,6 +85,10 @@ stoponbackup="on" consolelogging="on" logdays="7" +## Monitor | https://docs.linuxgsm.com/commands/monitor +# Query delay time +querydelay="1" + #### LinuxGSM Advanced Settings #### # ANSI Colors diff --git a/lgsm/config-default/config-lgsm/jc2server/_default.cfg b/lgsm/config-default/config-lgsm/jc2server/_default.cfg index da1d34189..439adc72e 100644 --- a/lgsm/config-default/config-lgsm/jc2server/_default.cfg +++ b/lgsm/config-default/config-lgsm/jc2server/_default.cfg @@ -77,6 +77,10 @@ stoponbackup="on" consolelogging="on" logdays="7" +## Monitor | https://docs.linuxgsm.com/commands/monitor +# Query delay time +querydelay="1" + #### LinuxGSM Advanced Settings #### # ANSI Colors diff --git a/lgsm/config-default/config-lgsm/jc3server/_default.cfg b/lgsm/config-default/config-lgsm/jc3server/_default.cfg index 6992a1029..a302deee0 100644 --- a/lgsm/config-default/config-lgsm/jc3server/_default.cfg +++ b/lgsm/config-default/config-lgsm/jc3server/_default.cfg @@ -77,6 +77,10 @@ stoponbackup="on" consolelogging="on" logdays="7" +## Monitor | https://docs.linuxgsm.com/commands/monitor +# Query delay time +querydelay="1" + #### LinuxGSM Advanced Settings #### # ANSI Colors diff --git a/lgsm/config-default/config-lgsm/kf2server/_default.cfg b/lgsm/config-default/config-lgsm/kf2server/_default.cfg index 9a8ab3329..8c917fea6 100644 --- a/lgsm/config-default/config-lgsm/kf2server/_default.cfg +++ b/lgsm/config-default/config-lgsm/kf2server/_default.cfg @@ -83,6 +83,10 @@ stoponbackup="on" consolelogging="on" logdays="7" +## Monitor | https://docs.linuxgsm.com/commands/monitor +# Query delay time +querydelay="1" + #### LinuxGSM Advanced Settings #### # ANSI Colors diff --git a/lgsm/config-default/config-lgsm/kfserver/_default.cfg b/lgsm/config-default/config-lgsm/kfserver/_default.cfg index 1f47ec58a..b182c60b5 100644 --- a/lgsm/config-default/config-lgsm/kfserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/kfserver/_default.cfg @@ -89,6 +89,10 @@ stoponbackup="on" consolelogging="on" logdays="7" +## Monitor | https://docs.linuxgsm.com/commands/monitor +# Query delay time +querydelay="1" + #### LinuxGSM Advanced Settings #### # ANSI Colors diff --git a/lgsm/config-default/config-lgsm/l4d2server/_default.cfg b/lgsm/config-default/config-lgsm/l4d2server/_default.cfg index b69a3e734..6b3f09c9d 100644 --- a/lgsm/config-default/config-lgsm/l4d2server/_default.cfg +++ b/lgsm/config-default/config-lgsm/l4d2server/_default.cfg @@ -84,6 +84,10 @@ stoponbackup="on" consolelogging="on" logdays="7" +## Monitor | https://docs.linuxgsm.com/commands/monitor +# Query delay time +querydelay="1" + #### LinuxGSM Advanced Settings #### # ANSI Colors diff --git a/lgsm/config-default/config-lgsm/l4dserver/_default.cfg b/lgsm/config-default/config-lgsm/l4dserver/_default.cfg index 9326ed808..80dfee1e4 100644 --- a/lgsm/config-default/config-lgsm/l4dserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/l4dserver/_default.cfg @@ -84,6 +84,10 @@ stoponbackup="on" consolelogging="on" logdays="7" +## Monitor | https://docs.linuxgsm.com/commands/monitor +# Query delay time +querydelay="1" + #### LinuxGSM Advanced Settings #### # ANSI Colors diff --git a/lgsm/config-default/config-lgsm/mcserver/_default.cfg b/lgsm/config-default/config-lgsm/mcserver/_default.cfg index 6f737fcb2..7b744ff51 100644 --- a/lgsm/config-default/config-lgsm/mcserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/mcserver/_default.cfg @@ -79,6 +79,10 @@ stoponbackup="on" consolelogging="on" logdays="7" +## Monitor | https://docs.linuxgsm.com/commands/monitor +# Query delay time +querydelay="1" + #### LinuxGSM Advanced Settings #### # ANSI Colors diff --git a/lgsm/config-default/config-lgsm/mhserver/_default.cfg b/lgsm/config-default/config-lgsm/mhserver/_default.cfg index 7e35f9c62..30f68f0cd 100644 --- a/lgsm/config-default/config-lgsm/mhserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/mhserver/_default.cfg @@ -82,6 +82,10 @@ stoponbackup="on" consolelogging="on" logdays="7" +## Monitor | https://docs.linuxgsm.com/commands/monitor +# Query delay time +querydelay="1" + #### LinuxGSM Advanced Settings #### # ANSI Colors diff --git a/lgsm/config-default/config-lgsm/mtaserver/_default.cfg b/lgsm/config-default/config-lgsm/mtaserver/_default.cfg index 9fc6a08b0..cbe998b5a 100644 --- a/lgsm/config-default/config-lgsm/mtaserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/mtaserver/_default.cfg @@ -75,6 +75,10 @@ stoponbackup="on" consolelogging="on" logdays="7" +## Monitor | https://docs.linuxgsm.com/commands/monitor +# Query delay time +querydelay="1" + #### LinuxGSM Advanced Settings #### # ANSI Colors diff --git a/lgsm/config-default/config-lgsm/mumbleserver/_default.cfg b/lgsm/config-default/config-lgsm/mumbleserver/_default.cfg index 2ef9f3ee6..0404d5834 100644 --- a/lgsm/config-default/config-lgsm/mumbleserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/mumbleserver/_default.cfg @@ -78,6 +78,10 @@ stoponbackup="on" consolelogging="on" logdays="7" +## Monitor | https://docs.linuxgsm.com/commands/monitor +# Query delay time +querydelay="1" + #### LinuxGSM Advanced Settings #### # ANSI Colors diff --git a/lgsm/config-default/config-lgsm/ndserver/_default.cfg b/lgsm/config-default/config-lgsm/ndserver/_default.cfg index 2c352d49b..ce6932680 100644 --- a/lgsm/config-default/config-lgsm/ndserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/ndserver/_default.cfg @@ -85,6 +85,10 @@ stoponbackup="on" consolelogging="on" logdays="7" +## Monitor | https://docs.linuxgsm.com/commands/monitor +# Query delay time +querydelay="1" + #### LinuxGSM Advanced Settings #### # ANSI Colors diff --git a/lgsm/config-default/config-lgsm/nmrihserver/_default.cfg b/lgsm/config-default/config-lgsm/nmrihserver/_default.cfg index 8b3edcc9e..a59455630 100644 --- a/lgsm/config-default/config-lgsm/nmrihserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/nmrihserver/_default.cfg @@ -90,6 +90,10 @@ stoponbackup="on" consolelogging="on" logdays="7" +## Monitor | https://docs.linuxgsm.com/commands/monitor +# Query delay time +querydelay="1" + #### LinuxGSM Advanced Settings #### # ANSI Colors diff --git a/lgsm/config-default/config-lgsm/ns2cserver/_default.cfg b/lgsm/config-default/config-lgsm/ns2cserver/_default.cfg index 23c70c212..bedb28177 100644 --- a/lgsm/config-default/config-lgsm/ns2cserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/ns2cserver/_default.cfg @@ -92,6 +92,10 @@ stoponbackup="on" consolelogging="on" logdays="7" +## Monitor | https://docs.linuxgsm.com/commands/monitor +# Query delay time +querydelay="1" + #### LinuxGSM Advanced Settings #### # ANSI Colors diff --git a/lgsm/config-default/config-lgsm/ns2server/_default.cfg b/lgsm/config-default/config-lgsm/ns2server/_default.cfg index 98c3bf3d4..3c6c0e34a 100644 --- a/lgsm/config-default/config-lgsm/ns2server/_default.cfg +++ b/lgsm/config-default/config-lgsm/ns2server/_default.cfg @@ -96,6 +96,10 @@ stoponbackup="on" consolelogging="on" logdays="7" +## Monitor | https://docs.linuxgsm.com/commands/monitor +# Query delay time +querydelay="1" + #### LinuxGSM Advanced Settings #### # ANSI Colors diff --git a/lgsm/config-default/config-lgsm/nsserver/_default.cfg b/lgsm/config-default/config-lgsm/nsserver/_default.cfg index e7b40f0c2..0bd6f4e9b 100644 --- a/lgsm/config-default/config-lgsm/nsserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/nsserver/_default.cfg @@ -84,6 +84,10 @@ stoponbackup="on" consolelogging="on" logdays="7" +## Monitor | https://docs.linuxgsm.com/commands/monitor +# Query delay time +querydelay="1" + #### LinuxGSM Advanced Settings #### # ANSI Colors diff --git a/lgsm/config-default/config-lgsm/opforserver/_default.cfg b/lgsm/config-default/config-lgsm/opforserver/_default.cfg index 9d85f0049..278288e74 100644 --- a/lgsm/config-default/config-lgsm/opforserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/opforserver/_default.cfg @@ -84,6 +84,10 @@ stoponbackup="on" consolelogging="on" logdays="7" +## Monitor | https://docs.linuxgsm.com/commands/monitor +# Query delay time +querydelay="1" + #### LinuxGSM Advanced Settings #### # ANSI Colors diff --git a/lgsm/config-default/config-lgsm/pcserver/_default.cfg b/lgsm/config-default/config-lgsm/pcserver/_default.cfg index fdf8db746..b2c26aaad 100644 --- a/lgsm/config-default/config-lgsm/pcserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/pcserver/_default.cfg @@ -77,6 +77,10 @@ stoponbackup="on" consolelogging="on" logdays="7" +## Monitor | https://docs.linuxgsm.com/commands/monitor +# Query delay time +querydelay="1" + #### LinuxGSM Advanced Settings #### # ANSI Colors diff --git a/lgsm/config-default/config-lgsm/pstbsserver/_default.cfg b/lgsm/config-default/config-lgsm/pstbsserver/_default.cfg index ce13b1ab3..9b4f6762c 100644 --- a/lgsm/config-default/config-lgsm/pstbsserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/pstbsserver/_default.cfg @@ -88,6 +88,10 @@ stoponbackup="on" consolelogging="on" logdays="7" +## Monitor | https://docs.linuxgsm.com/commands/monitor +# Query delay time +querydelay="1" + #### LinuxGSM Advanced Settings #### # ANSI Colors diff --git a/lgsm/config-default/config-lgsm/pvkiiserver/_default.cfg b/lgsm/config-default/config-lgsm/pvkiiserver/_default.cfg index 1d70816d2..407324f3b 100644 --- a/lgsm/config-default/config-lgsm/pvkiiserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/pvkiiserver/_default.cfg @@ -85,6 +85,10 @@ stoponbackup="on" consolelogging="on" logdays="7" +## Monitor | https://docs.linuxgsm.com/commands/monitor +# Query delay time +querydelay="1" + #### LinuxGSM Advanced Settings #### # ANSI Colors diff --git a/lgsm/config-default/config-lgsm/pzserver/_default.cfg b/lgsm/config-default/config-lgsm/pzserver/_default.cfg index 8b258cfe9..c5db5f93a 100644 --- a/lgsm/config-default/config-lgsm/pzserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/pzserver/_default.cfg @@ -80,6 +80,10 @@ stoponbackup="on" consolelogging="on" logdays="7" +## Monitor | https://docs.linuxgsm.com/commands/monitor +# Query delay time +querydelay="1" + #### LinuxGSM Advanced Settings #### # ANSI Colors diff --git a/lgsm/config-default/config-lgsm/q2server/_default.cfg b/lgsm/config-default/config-lgsm/q2server/_default.cfg index c2ac3340e..4369281e4 100644 --- a/lgsm/config-default/config-lgsm/q2server/_default.cfg +++ b/lgsm/config-default/config-lgsm/q2server/_default.cfg @@ -79,6 +79,10 @@ stoponbackup="on" consolelogging="on" logdays="7" +## Monitor | https://docs.linuxgsm.com/commands/monitor +# Query delay time +querydelay="1" + #### LinuxGSM Advanced Settings #### # ANSI Colors diff --git a/lgsm/config-default/config-lgsm/q3server/_default.cfg b/lgsm/config-default/config-lgsm/q3server/_default.cfg index 0c205c6b8..2f1bc15f4 100644 --- a/lgsm/config-default/config-lgsm/q3server/_default.cfg +++ b/lgsm/config-default/config-lgsm/q3server/_default.cfg @@ -79,6 +79,10 @@ stoponbackup="on" consolelogging="on" logdays="7" +## Monitor | https://docs.linuxgsm.com/commands/monitor +# Query delay time +querydelay="1" + #### LinuxGSM Advanced Settings #### # ANSI Colors diff --git a/lgsm/config-default/config-lgsm/qlserver/_default.cfg b/lgsm/config-default/config-lgsm/qlserver/_default.cfg index 01bd7950b..0535d7789 100644 --- a/lgsm/config-default/config-lgsm/qlserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/qlserver/_default.cfg @@ -79,6 +79,10 @@ stoponbackup="on" consolelogging="on" logdays="7" +## Monitor | https://docs.linuxgsm.com/commands/monitor +# Query delay time +querydelay="1" + #### LinuxGSM Advanced Settings #### # ANSI Colors diff --git a/lgsm/config-default/config-lgsm/qwserver/_default.cfg b/lgsm/config-default/config-lgsm/qwserver/_default.cfg index b2ccd0af6..f9fd737f4 100644 --- a/lgsm/config-default/config-lgsm/qwserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/qwserver/_default.cfg @@ -78,6 +78,10 @@ stoponbackup="on" consolelogging="on" logdays="7" +## Monitor | https://docs.linuxgsm.com/commands/monitor +# Query delay time +querydelay="1" + #### LinuxGSM Advanced Settings #### # ANSI Colors diff --git a/lgsm/config-default/config-lgsm/ricochetserver/_default.cfg b/lgsm/config-default/config-lgsm/ricochetserver/_default.cfg index 41ccda337..727f1ddc5 100644 --- a/lgsm/config-default/config-lgsm/ricochetserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/ricochetserver/_default.cfg @@ -84,6 +84,10 @@ stoponbackup="on" consolelogging="on" logdays="7" +## Monitor | https://docs.linuxgsm.com/commands/monitor +# Query delay time +querydelay="1" + #### LinuxGSM Advanced Settings #### # ANSI Colors diff --git a/lgsm/config-default/config-lgsm/roserver/_default.cfg b/lgsm/config-default/config-lgsm/roserver/_default.cfg index dd4614682..0ecfaad5d 100644 --- a/lgsm/config-default/config-lgsm/roserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/roserver/_default.cfg @@ -85,6 +85,10 @@ stoponbackup="on" consolelogging="on" logdays="7" +## Monitor | https://docs.linuxgsm.com/commands/monitor +# Query delay time +querydelay="1" + #### LinuxGSM Advanced Settings #### # ANSI Colors diff --git a/lgsm/config-default/config-lgsm/rtcwserver/_default.cfg b/lgsm/config-default/config-lgsm/rtcwserver/_default.cfg index 012a86815..cf1373e64 100644 --- a/lgsm/config-default/config-lgsm/rtcwserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/rtcwserver/_default.cfg @@ -79,6 +79,10 @@ stoponbackup="on" consolelogging="on" logdays="7" +## Monitor | https://docs.linuxgsm.com/commands/monitor +# Query delay time +querydelay="1" + #### LinuxGSM Advanced Settings #### # ANSI Colors diff --git a/lgsm/config-default/config-lgsm/rustserver/_default.cfg b/lgsm/config-default/config-lgsm/rustserver/_default.cfg index a132a7585..7167acd03 100644 --- a/lgsm/config-default/config-lgsm/rustserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/rustserver/_default.cfg @@ -109,6 +109,10 @@ stoponbackup="on" consolelogging="on" logdays="7" +## Monitor | https://docs.linuxgsm.com/commands/monitor +# Query delay time +querydelay="1" + #### LinuxGSM Advanced Settings #### # ANSI Colors diff --git a/lgsm/config-default/config-lgsm/rwserver/_default.cfg b/lgsm/config-default/config-lgsm/rwserver/_default.cfg index 358304664..7f4222b30 100644 --- a/lgsm/config-default/config-lgsm/rwserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/rwserver/_default.cfg @@ -80,6 +80,10 @@ stoponbackup="on" consolelogging="on" logdays="7" +## Monitor | https://docs.linuxgsm.com/commands/monitor +# Query delay time +querydelay="1" + #### LinuxGSM Advanced Settings #### # ANSI Colors diff --git a/lgsm/config-default/config-lgsm/sampserver/_default.cfg b/lgsm/config-default/config-lgsm/sampserver/_default.cfg index ab54a20c1..b76e92538 100644 --- a/lgsm/config-default/config-lgsm/sampserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/sampserver/_default.cfg @@ -78,6 +78,10 @@ stoponbackup="on" consolelogging="on" logdays="7" +## Monitor | https://docs.linuxgsm.com/commands/monitor +# Query delay time +querydelay="1" + #### LinuxGSM Advanced Settings #### # ANSI Colors diff --git a/lgsm/config-default/config-lgsm/sbotsserver/_default.cfg b/lgsm/config-default/config-lgsm/sbotsserver/_default.cfg index 847168d02..c9e6d450a 100644 --- a/lgsm/config-default/config-lgsm/sbotsserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/sbotsserver/_default.cfg @@ -82,6 +82,10 @@ stoponbackup="on" consolelogging="on" logdays="7" +## Monitor | https://docs.linuxgsm.com/commands/monitor +# Query delay time +querydelay="1" + #### LinuxGSM Advanced Settings #### # ANSI Colors diff --git a/lgsm/config-default/config-lgsm/sbserver/_default.cfg b/lgsm/config-default/config-lgsm/sbserver/_default.cfg index bf7928642..3f157a72a 100644 --- a/lgsm/config-default/config-lgsm/sbserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/sbserver/_default.cfg @@ -84,6 +84,10 @@ stoponbackup="on" consolelogging="on" logdays="7" +## Monitor | https://docs.linuxgsm.com/commands/monitor +# Query delay time +querydelay="1" + #### LinuxGSM Advanced Settings #### # ANSI Colors diff --git a/lgsm/config-default/config-lgsm/sdtdserver/_default.cfg b/lgsm/config-default/config-lgsm/sdtdserver/_default.cfg index 59c408431..06d97810f 100644 --- a/lgsm/config-default/config-lgsm/sdtdserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/sdtdserver/_default.cfg @@ -80,6 +80,10 @@ stoponbackup="on" consolelogging="on" logdays="7" +## Monitor | https://docs.linuxgsm.com/commands/monitor +# Query delay time +querydelay="1" + #### LinuxGSM Advanced Settings #### # ANSI Colors diff --git a/lgsm/config-default/config-lgsm/sof2server/_default.cfg b/lgsm/config-default/config-lgsm/sof2server/_default.cfg index 31d5c2306..897be4a3e 100644 --- a/lgsm/config-default/config-lgsm/sof2server/_default.cfg +++ b/lgsm/config-default/config-lgsm/sof2server/_default.cfg @@ -79,6 +79,10 @@ stoponbackup="on" consolelogging="on" logdays="7" +## Monitor | https://docs.linuxgsm.com/commands/monitor +# Query delay time +querydelay="1" + #### LinuxGSM Advanced Settings #### # ANSI Colors diff --git a/lgsm/config-default/config-lgsm/squadserver/_default.cfg b/lgsm/config-default/config-lgsm/squadserver/_default.cfg index d9dd3b171..3c2109527 100644 --- a/lgsm/config-default/config-lgsm/squadserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/squadserver/_default.cfg @@ -82,6 +82,10 @@ stoponbackup="on" consolelogging="on" logdays="7" +## Monitor | https://docs.linuxgsm.com/commands/monitor +# Query delay time +querydelay="1" + #### LinuxGSM Advanced Settings #### # ANSI Colors diff --git a/lgsm/config-default/config-lgsm/ss3server/_default.cfg b/lgsm/config-default/config-lgsm/ss3server/_default.cfg index 496e11ce0..bb6f78a1b 100644 --- a/lgsm/config-default/config-lgsm/ss3server/_default.cfg +++ b/lgsm/config-default/config-lgsm/ss3server/_default.cfg @@ -81,6 +81,10 @@ stoponbackup="on" consolelogging="on" logdays="7" +## Monitor | https://docs.linuxgsm.com/commands/monitor +# Query delay time +querydelay="1" + #### LinuxGSM Advanced Settings #### # ANSI Colors diff --git a/lgsm/config-default/config-lgsm/stserver/_default.cfg b/lgsm/config-default/config-lgsm/stserver/_default.cfg index 9239d1b6c..93a59f2f8 100644 --- a/lgsm/config-default/config-lgsm/stserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/stserver/_default.cfg @@ -87,6 +87,10 @@ stoponbackup="on" consolelogging="on" logdays="7" +## Monitor | https://docs.linuxgsm.com/commands/monitor +# Query delay time +querydelay="1" + #### LinuxGSM Advanced Settings #### # ANSI Colors diff --git a/lgsm/config-default/config-lgsm/svenserver/_default.cfg b/lgsm/config-default/config-lgsm/svenserver/_default.cfg index 7b0b2524d..91912d425 100644 --- a/lgsm/config-default/config-lgsm/svenserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/svenserver/_default.cfg @@ -84,6 +84,10 @@ stoponbackup="on" consolelogging="on" logdays="7" +## Monitor | https://docs.linuxgsm.com/commands/monitor +# Query delay time +querydelay="1" + #### LinuxGSM Advanced Settings #### # ANSI Colors diff --git a/lgsm/config-default/config-lgsm/terrariaserver/_default.cfg b/lgsm/config-default/config-lgsm/terrariaserver/_default.cfg index e064f10c1..3dc5646f4 100644 --- a/lgsm/config-default/config-lgsm/terrariaserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/terrariaserver/_default.cfg @@ -84,6 +84,10 @@ stoponbackup="on" consolelogging="on" logdays="7" +## Monitor | https://docs.linuxgsm.com/commands/monitor +# Query delay time +querydelay="1" + #### LinuxGSM Advanced Settings #### # ANSI Colors diff --git a/lgsm/config-default/config-lgsm/tf2server/_default.cfg b/lgsm/config-default/config-lgsm/tf2server/_default.cfg index 7399cb941..2bcade720 100644 --- a/lgsm/config-default/config-lgsm/tf2server/_default.cfg +++ b/lgsm/config-default/config-lgsm/tf2server/_default.cfg @@ -90,6 +90,10 @@ stoponbackup="on" consolelogging="on" logdays="7" +## Monitor | https://docs.linuxgsm.com/commands/monitor +# Query delay time +querydelay="1" + #### LinuxGSM Advanced Settings #### # ANSI Colors diff --git a/lgsm/config-default/config-lgsm/tfcserver/_default.cfg b/lgsm/config-default/config-lgsm/tfcserver/_default.cfg index adfe3b56d..b34d820b7 100644 --- a/lgsm/config-default/config-lgsm/tfcserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/tfcserver/_default.cfg @@ -84,6 +84,10 @@ stoponbackup="on" consolelogging="on" logdays="7" +## Monitor | https://docs.linuxgsm.com/commands/monitor +# Query delay time +querydelay="1" + #### LinuxGSM Advanced Settings #### # ANSI Colors diff --git a/lgsm/config-default/config-lgsm/ts3server/_default.cfg b/lgsm/config-default/config-lgsm/ts3server/_default.cfg index 6c6b116cd..47da3e4b6 100644 --- a/lgsm/config-default/config-lgsm/ts3server/_default.cfg +++ b/lgsm/config-default/config-lgsm/ts3server/_default.cfg @@ -73,6 +73,10 @@ stoponbackup="on" consolelogging="on" logdays="7" +## Monitor | https://docs.linuxgsm.com/commands/monitor +# Query delay time +querydelay="1" + #### LinuxGSM Advanced Settings #### # ANSI Colors diff --git a/lgsm/config-default/config-lgsm/tuserver/_default.cfg b/lgsm/config-default/config-lgsm/tuserver/_default.cfg index 8397e826d..6207f5c31 100644 --- a/lgsm/config-default/config-lgsm/tuserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/tuserver/_default.cfg @@ -87,6 +87,10 @@ stoponbackup="on" consolelogging="on" logdays="7" +## Monitor | https://docs.linuxgsm.com/commands/monitor +# Query delay time +querydelay="1" + #### LinuxGSM Advanced Settings #### # ANSI Colors diff --git a/lgsm/config-default/config-lgsm/twserver/_default.cfg b/lgsm/config-default/config-lgsm/twserver/_default.cfg index e655aa023..56d505183 100644 --- a/lgsm/config-default/config-lgsm/twserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/twserver/_default.cfg @@ -84,6 +84,10 @@ stoponbackup="on" consolelogging="on" logdays="7" +## Monitor | https://docs.linuxgsm.com/commands/monitor +# Query delay time +querydelay="1" + #### LinuxGSM Advanced Settings #### # ANSI Colors diff --git a/lgsm/config-default/config-lgsm/untserver/_default.cfg b/lgsm/config-default/config-lgsm/untserver/_default.cfg index ef582c298..2913f0ea8 100644 --- a/lgsm/config-default/config-lgsm/untserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/untserver/_default.cfg @@ -88,6 +88,10 @@ stoponbackup="on" consolelogging="on" logdays="7" +## Monitor | https://docs.linuxgsm.com/commands/monitor +# Query delay time +querydelay="1" + #### LinuxGSM Advanced Settings #### # ANSI Colors diff --git a/lgsm/config-default/config-lgsm/ut2k4server/_default.cfg b/lgsm/config-default/config-lgsm/ut2k4server/_default.cfg index 390eb3b47..9f43be864 100644 --- a/lgsm/config-default/config-lgsm/ut2k4server/_default.cfg +++ b/lgsm/config-default/config-lgsm/ut2k4server/_default.cfg @@ -78,6 +78,10 @@ stoponbackup="on" consolelogging="on" logdays="7" +## Monitor | https://docs.linuxgsm.com/commands/monitor +# Query delay time +querydelay="1" + #### LinuxGSM Advanced Settings #### # ANSI Colors diff --git a/lgsm/config-default/config-lgsm/ut3server/_default.cfg b/lgsm/config-default/config-lgsm/ut3server/_default.cfg index 8afab880c..a1c4496bd 100644 --- a/lgsm/config-default/config-lgsm/ut3server/_default.cfg +++ b/lgsm/config-default/config-lgsm/ut3server/_default.cfg @@ -89,6 +89,10 @@ stoponbackup="on" consolelogging="on" logdays="7" +## Monitor | https://docs.linuxgsm.com/commands/monitor +# Query delay time +querydelay="1" + #### LinuxGSM Advanced Settings #### # ANSI Colors diff --git a/lgsm/config-default/config-lgsm/ut99server/_default.cfg b/lgsm/config-default/config-lgsm/ut99server/_default.cfg index ee45795dd..66d0edd41 100644 --- a/lgsm/config-default/config-lgsm/ut99server/_default.cfg +++ b/lgsm/config-default/config-lgsm/ut99server/_default.cfg @@ -78,6 +78,10 @@ stoponbackup="on" consolelogging="on" logdays="7" +## Monitor | https://docs.linuxgsm.com/commands/monitor +# Query delay time +querydelay="1" + #### LinuxGSM Advanced Settings #### # ANSI Colors diff --git a/lgsm/config-default/config-lgsm/utserver/_default.cfg b/lgsm/config-default/config-lgsm/utserver/_default.cfg index 027012b8e..9b29dd204 100644 --- a/lgsm/config-default/config-lgsm/utserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/utserver/_default.cfg @@ -82,6 +82,10 @@ stoponbackup="on" consolelogging="on" logdays="7" +## Monitor | https://docs.linuxgsm.com/commands/monitor +# Query delay time +querydelay="1" + #### LinuxGSM Advanced Settings #### # ANSI Colors diff --git a/lgsm/config-default/config-lgsm/vsserver/_default.cfg b/lgsm/config-default/config-lgsm/vsserver/_default.cfg index b21d1d7b4..31d67e6e6 100644 --- a/lgsm/config-default/config-lgsm/vsserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/vsserver/_default.cfg @@ -84,6 +84,10 @@ stoponbackup="on" consolelogging="on" logdays="7" +## Monitor | https://docs.linuxgsm.com/commands/monitor +# Query delay time +querydelay="1" + #### LinuxGSM Advanced Settings #### # ANSI Colors diff --git a/lgsm/config-default/config-lgsm/wetserver/_default.cfg b/lgsm/config-default/config-lgsm/wetserver/_default.cfg index 2525bc8b3..ae88991cb 100644 --- a/lgsm/config-default/config-lgsm/wetserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/wetserver/_default.cfg @@ -74,6 +74,10 @@ stoponbackup="on" consolelogging="on" logdays="7" +## Monitor | https://docs.linuxgsm.com/commands/monitor +# Query delay time +querydelay="1" + #### LinuxGSM Advanced Settings #### # ANSI Colors diff --git a/lgsm/config-default/config-lgsm/wurmserver/_default.cfg b/lgsm/config-default/config-lgsm/wurmserver/_default.cfg index fb19f13fb..1263771cc 100644 --- a/lgsm/config-default/config-lgsm/wurmserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/wurmserver/_default.cfg @@ -76,6 +76,10 @@ stoponbackup="on" consolelogging="on" logdays="7" +## Monitor | https://docs.linuxgsm.com/commands/monitor +# Query delay time +querydelay="1" + #### LinuxGSM Advanced Settings #### # ANSI Colors diff --git a/lgsm/config-default/config-lgsm/zpsserver/_default.cfg b/lgsm/config-default/config-lgsm/zpsserver/_default.cfg index e9aa313fc..e9acd034e 100644 --- a/lgsm/config-default/config-lgsm/zpsserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/zpsserver/_default.cfg @@ -90,6 +90,10 @@ stoponbackup="on" consolelogging="on" logdays="7" +## Monitor | https://docs.linuxgsm.com/commands/monitor +# Query delay time +querydelay="1" + #### LinuxGSM Advanced Settings #### # ANSI Colors diff --git a/lgsm/functions/command_backup.sh b/lgsm/functions/command_backup.sh index de5a11aff..1fb43cea2 100644 --- a/lgsm/functions/command_backup.sh +++ b/lgsm/functions/command_backup.sh @@ -91,7 +91,7 @@ fn_backup_dir(){ fn_backup_create_lockfile(){ # Create lockfile. - date > "${tmpdir}/.backup.lock" + date '+%s' > "${tmpdir}/.backup.lock" fn_script_log_info "Lockfile generated" fn_script_log_info "${tmpdir}/.backup.lock" # trap to remove lockfile on quit. diff --git a/lgsm/functions/command_debug.sh b/lgsm/functions/command_debug.sh index af7d6801a..2949dedab 100644 --- a/lgsm/functions/command_debug.sh +++ b/lgsm/functions/command_debug.sh @@ -98,7 +98,7 @@ fn_script_log_info "Starting debug" fn_print_ok_nl "Starting debug" # Create lockfile. -date > "${rootdir}/${lockselfname}" +date '+%s' > "${rootdir}/${lockselfname}" fn_script_log_info "Lockfile generated" fn_script_log_info "${rootdir}/${lockselfname}" # trap to remove lockfile on quit. diff --git a/lgsm/functions/command_dev_debug.sh b/lgsm/functions/command_dev_debug.sh index 7c831681a..5229d068d 100644 --- a/lgsm/functions/command_dev_debug.sh +++ b/lgsm/functions/command_dev_debug.sh @@ -13,8 +13,8 @@ if [ -f "${rootdir}/.dev-debug" ]; then fn_print_ok_nl "Disabled dev-debug" fn_script_log_info "Disabled dev-debug" else - date > "${rootdir}/.dev-debug" + date '+%s' > "${rootdir}/.dev-debug" fn_print_ok_nl "Enabled dev-debug" fn_script_log_info "Enabled dev-debug" fi -core_exit.sh \ No newline at end of file +core_exit.sh diff --git a/lgsm/functions/command_monitor.sh b/lgsm/functions/command_monitor.sh index 9760380de..772be28a9 100644 --- a/lgsm/functions/command_monitor.sh +++ b/lgsm/functions/command_monitor.sh @@ -18,7 +18,14 @@ for queryattempt in {1..5}; do fn_print_dots "Querying port: ${querymethod}: ${ip}:${queryport} : ${totalseconds}/${queryattempt}: " fn_print_querying_eol fn_script_log_info "Querying port: ${querymethod}: ${ip}:${queryport} : ${queryattempt} : QUERYING" - if [ "${querymethod}" == "gamedig" ]; then + if [ "$(cat "${rootdir}/${lockselfname}")" > "$(date "+%s" -d "${querydelay} mins ago")" ]; then + fn_print_ok "Querying port: ${querymethod}: ${ip}:${queryport} : ${totalseconds}/${queryattempt}: " + fn_print_delay_eol + fn_script_log_info "Querying port: ${querymethod}: ${ip}:${queryport} : ${queryattempt} : DELAY" + fn_script_log_info "Query bypassed: ${gameservername} started less than ${querydelay} minute ago" + monitorpass=1 + core_exit.sh + elif [ "${querymethod}" == "gamedig" ]; then query_gamedig.sh elif [ "${querymethod}" == "gsquery" ]; then if [ ! -f "${functionsdir}/query_gsquery.py" ]; then @@ -184,6 +191,17 @@ info_parms.sh fn_monitor_check_lockfile fn_monitor_check_update fn_monitor_check_session + +# Fix if lockfile is not unix time or contains letters +if [[ "$(cat "${rootdir}/${lockselfname}")" =~ [A-Za-z] ]]; then + date '+%s' > "${rootdir}/${lockselfname}" +fi + +# Add a query bypass if missing +if [ -z "${querydelay}" ]; then + querydelay="1" +fi + # Query has to be enabled in Starbound config. if [ "${shortname}" == "sb" ]; then if [ "${queryenabled}" == "true" ]; then @@ -194,4 +212,5 @@ elif [ "${shortname}" == "ts3" ]||[ "${shortname}" == "eco" ]||[ "${shortname}" else fn_monitor_query fi + core_exit.sh diff --git a/lgsm/functions/command_start.sh b/lgsm/functions/command_start.sh index d955aef17..ed7d98498 100644 --- a/lgsm/functions/command_start.sh +++ b/lgsm/functions/command_start.sh @@ -29,7 +29,8 @@ fn_start_teamspeak3(){ mv "${lgsmlog}" "${lgsmlogdate}" fi # Create lockfile. - date > "${rootdir}/${lockselfname}" + + date '+%s' > "${rootdir}/${lockselfname}" # Accept license. if [ ! -f "${executabledir}/.ts3server_license_accepted" ]; then install_eula.sh @@ -83,7 +84,7 @@ fn_start_tmux(){ mv "${consolelog}" "${consolelogdate}" fi - # Create lockfile. + # Create lockfile date > "${rootdir}/${lockselfname}" cd "${executabledir}" tmux new-session -d -x "${sessionwidth}" -y "${sessionheight}" -s "${servicename}" "${executable} ${parms}" 2> "${lgsmlogdir}/.${servicename}-tmux-error.tmp" diff --git a/lgsm/functions/core_messages.sh b/lgsm/functions/core_messages.sh index c909b5479..51b9a4817 100644 --- a/lgsm/functions/core_messages.sh +++ b/lgsm/functions/core_messages.sh @@ -384,6 +384,15 @@ fn_print_checking_eol_nl(){ echo -e "${cyan}CHECKING${default}" } +# DELAY +fn_print_delay_eol(){ + echo -en "${green}DELAY${default}" +} + +fn_print_delay_eol_nl(){ + echo -e "${green}DELAY${default}" +} + # CANCELED fn_print_canceled_eol(){ echo -en "${yellow}CANCELED${default}" diff --git a/tests/tests_fctrserver.sh b/tests/tests_fctrserver.sh index 18b2b66bb..ca4bf150f 100644 --- a/tests/tests_fctrserver.sh +++ b/tests/tests_fctrserver.sh @@ -815,7 +815,7 @@ echo "Command: ./${gameservername} monitor" requiredstatus="OFFLINE" fn_setstatus fn_print_info_nl "creating lockfile." -date > "${rootdir}/${lockselfname}" +date '+%s' > "${rootdir}/${lockselfname}" ( exec 5>"${TRAVIS_BUILD_DIR}/dev-debug.log" BASH_XTRACEFD="5" diff --git a/tests/tests_jc2server.sh b/tests/tests_jc2server.sh index d3a348b43..dbcca9b42 100644 --- a/tests/tests_jc2server.sh +++ b/tests/tests_jc2server.sh @@ -968,7 +968,7 @@ echo "Command: ./${gameservername} monitor" requiredstatus="OFFLINE" fn_setstatus fn_print_info_nl "creating lockfile." -date > "${rootdir}/${lockselfname}" +date '+%s' > "${rootdir}/${lockselfname}" ( exec 5>"${TRAVIS_BUILD_DIR}/dev-debug.log" BASH_XTRACEFD="5" diff --git a/tests/tests_mcserver.sh b/tests/tests_mcserver.sh index 05a7e210a..426851163 100644 --- a/tests/tests_mcserver.sh +++ b/tests/tests_mcserver.sh @@ -847,7 +847,7 @@ echo "Command: ./${gameservername} monitor" requiredstatus="OFFLINE" fn_setstatus fn_print_info_nl "creating lockfile." -date > "${rootdir}/${lockselfname}" +date '+%s' > "${rootdir}/${lockselfname}" ( exec 5>"${TRAVIS_BUILD_DIR}/dev-debug.log" BASH_XTRACEFD="5" diff --git a/tests/tests_ts3server.sh b/tests/tests_ts3server.sh index 9aa929d55..d243ef13e 100644 --- a/tests/tests_ts3server.sh +++ b/tests/tests_ts3server.sh @@ -814,7 +814,7 @@ echo "Command: ./${gameservername} monitor" requiredstatus="OFFLINE" fn_setstatus fn_print_info_nl "creating lockfile." -date > "${rootdir}/${lockselfname}" +date '+%s' > "${rootdir}/${lockselfname}" ( exec 5>"${TRAVIS_BUILD_DIR}/dev-debug.log" BASH_XTRACEFD="5" From 1fabc013562c1994f68b9b0d2567399798255454 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Mon, 17 Jun 2019 00:40:54 +0100 Subject: [PATCH 107/534] feat(newserver): Barotrauma (#2400) Co-authored-by: Yann Kraetzschmann --- .../config-lgsm/btserver/_default.cfg | 137 ++++++++++++++++++ lgsm/data/serverlist.csv | 1 + lgsm/functions/check_system_requirements.sh | 3 + lgsm/functions/command_monitor.sh | 2 +- lgsm/functions/fix_steamcmd.sh | 10 +- lgsm/functions/info_config.sh | 26 ++++ lgsm/functions/info_messages.sh | 13 ++ lgsm/functions/info_parms.sh | 8 + lgsm/functions/install_config.sh | 7 + lgsm/functions/query_gamedig.sh | 2 +- lgsm/functions/query_gsquery.py | 2 +- 11 files changed, 207 insertions(+), 4 deletions(-) create mode 100644 lgsm/config-default/config-lgsm/btserver/_default.cfg diff --git a/lgsm/config-default/config-lgsm/btserver/_default.cfg b/lgsm/config-default/config-lgsm/btserver/_default.cfg new file mode 100644 index 000000000..614269477 --- /dev/null +++ b/lgsm/config-default/config-lgsm/btserver/_default.cfg @@ -0,0 +1,137 @@ +################################## +######## 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://docs.linuxgsm.com/steamcmd#steamcmd-login +steamuser="username" +steampass='password' + +## Server Start Command | https://docs.linuxgsm.com/configuration/start-parameters#additional-parameters +fn_parms(){ +parms="" +} + +#### LinuxGSM Settings #### + +## Notification Alerts +# (on|off) + +# Display IP | https://docs.linuxgsm.com/alerts#display-ip +displayip="" + +# More info | https://docs.linuxgsm.com/alerts#more-info +postalert="off" +postdays="7" +posttarget="https://hastebin.com" + +# Discord Alerts | https://docs.linuxgsm.com/alerts/discord +discordalert="off" +discordwebhook="webhook" + +# Email Alerts | https://docs.linuxgsm.com/alerts/email +emailalert="off" +email="email@example.com" +emailfrom="" + +# IFTTT Alerts | https://docs.linuxgsm.com/alerts/ifttt +iftttalert="off" +ifttttoken="accesstoken" +iftttevent="linuxgsm_alert" + +# Mailgun Email Alerts | https://docs.linuxgsm.com/alerts/mailgun +mailgunalert="off" +mailguntoken="accesstoken" +mailgundomain="example.com" +mailgunemailfrom="alert@example.com" +mailgunemail="email@myemail.com" + +# Pushbullet Alerts | https://docs.linuxgsm.com/alerts/pushbullet +pushbulletalert="off" +pushbullettoken="accesstoken" +channeltag="" + +# Pushover Alerts | https://docs.linuxgsm.com/alerts/pushover +pushoveralert="off" +pushovertoken="accesstoken" + +# Telegram Alerts | https://docs.linuxgsm.com/alerts/telegram +# You can add a custom cURL string eg proxy (useful in Russia) or else in "curlcustomstring". +# like a "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help", if you not need +# any custom string in curl - simple ignore this parameter. +telegramalert="off" +telegramtoken="accesstoken" +telegramchatid="" +curlcustomstring="" + +## Updating | https://docs.linuxgsm.com/commands/update +updateonstart="off" + +## Backup | https://docs.linuxgsm.com/commands/backup +maxbackups="4" +maxbackupdays="30" +stoponbackup="on" + +## Logging | https://docs.linuxgsm.com/features/logging +consolelogging="on" +logdays="7" + +## Monitor | https://docs.linuxgsm.com/commands/monitor +# Query delay time +querydelay="1" + +#### LinuxGSM Advanced Settings #### + +# ANSI Colors +ansi="on" + +# Message Display Time +sleeptime="0.5" + +## SteamCMD Settings +# Server appid +appid="602960" +# SteamCMD Branch | https://docs.linuxgsm.com/steamcmd/branch +branch="" +# Master Server | https://docs.linuxgsm.com/steamcmd/steam-master-server +steammaster="true" + +## LinuxGSM Server Details +# Do not edit +gamename="Barotrauma" +engine="barotrauma" +glibc="2.17" + +#### Directories #### +# Edit with care + +## Server Specific Directories +systemdir="${serverfiles}" +executabledir="${systemdir}" +executable="./DedicatedServer" +servercfg="serversettings.xml" +servercfgdefault="serversettings.xml" +servercfgdir="${systemdir}" +servercfgfullpath="${servercfgdir}/${servercfg}" + +## Backup Directory +backupdir="${lgsmdir}/backups" + +## Logging Directories +logdir="${rootdir}/log" +gamelogdir="${systemdir}/ServerLogs" +lgsmlogdir="${logdir}/script" +consolelogdir="${logdir}/console" +lgsmlog="${lgsmlogdir}/${servicename}-script.log" +consolelog="${consolelogdir}/${servicename}-console.log" +alertlog="${lgsmlogdir}/${servicename}-alert.log" +postdetailslog="${lgsmlogdir}/${servicename}-postdetails.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/data/serverlist.csv b/lgsm/data/serverlist.csv index b9494bede..b230e225b 100644 --- a/lgsm/data/serverlist.csv +++ b/lgsm/data/serverlist.csv @@ -8,6 +8,7 @@ bmdm,bmdmserver,Black Mesa: Deathmatch bs,bsserver,Blade Symphony bb,bbserver,BrainBread bb2,bb2server,BrainBread 2 +bt,btserver,Barotrauma bt1944,bt1944server,Battalion 1944 cod,codserver,Call of Duty cod2,cod2server,Call of Duty 2 diff --git a/lgsm/functions/check_system_requirements.sh b/lgsm/functions/check_system_requirements.sh index bc2317f48..1493f6b85 100644 --- a/lgsm/functions/check_system_requirements.sh +++ b/lgsm/functions/check_system_requirements.sh @@ -15,6 +15,9 @@ info_distro.sh if [ "${shortname}" == "ark" ]; then ramrequirementmb="4000" ramrequirementgb="4" +elif [ "${shortname}" == "bt" ]; then + ramrequirementmb="1000" + ramrequirementgb="1" elif [ "${shortname}" == "mh" ]; then ramrequirementmb="4000" ramrequirementgb="4" diff --git a/lgsm/functions/command_monitor.sh b/lgsm/functions/command_monitor.sh index 772be28a9..49cfffbce 100644 --- a/lgsm/functions/command_monitor.sh +++ b/lgsm/functions/command_monitor.sh @@ -133,7 +133,7 @@ fn_monitor_check_session(){ fn_monitor_query(){ fn_script_log_info "Querying port: query enabled" # Engines that work with query. - local allowed_engines_array=( avalanche2.0 avalanche3.0 goldsource idtech2 idtech3 idtech3_ql ioquake3 iw2.0 iw3.0 lwjgl2 madness quake refractor realvirtuality source spark starbound unity3d unreal unreal2 unreal4 wurm ) + local allowed_engines_array=( avalanche2.0 avalanche3.0 barotrauma goldsource idtech2 idtech3 idtech3_ql ioquake3 iw2.0 iw3.0 lwjgl2 madness quake refractor realvirtuality source spark starbound unity3d unreal unreal2 unreal4 wurm ) for allowed_engine in "${allowed_engines_array[@]}" do if [ "${allowed_engine}" == "${engine}" ]; then diff --git a/lgsm/functions/fix_steamcmd.sh b/lgsm/functions/fix_steamcmd.sh index a3f60e89c..eb1622978 100644 --- a/lgsm/functions/fix_steamcmd.sh +++ b/lgsm/functions/fix_steamcmd.sh @@ -17,7 +17,15 @@ if [ ! -f "${HOME}/.steam/sdk32/steamclient.so" ]; then fn_fix_msg_end fi -if [ "${shortname}" == "ss3" ]; then +if [ "${shortname}" == "bt" ]; then + # Fixes: [S_API FAIL] SteamAPI_Init() failed; SteamAPI_IsSteamRunning() failed. + if [ ! -L "${executabledir}/lib64/steamclient.so" ]; then + fixname="steamclient.so x86_64" + fn_fix_msg_start + cp -s -v "${steamcmddir}/linux64/steamclient.so" "${executabledir}/lib64/steamclient.so" >> "${lgsmlog}" + fn_fix_msg_end + fi +elif [ "${shortname}" == "ss3" ]; then # Fixes: .steam/bin32/libsteam.so: cannot open shared object file: No such file or directory if [ ! -f "${HOME}/.steam/bin32/libsteam.so" ]; then fixname="libsteam.so" diff --git a/lgsm/functions/info_config.sh b/lgsm/functions/info_config.sh index 14d77cf9f..275fb54f2 100644 --- a/lgsm/functions/info_config.sh +++ b/lgsm/functions/info_config.sh @@ -110,6 +110,29 @@ fn_info_config_ballistic_overkill(){ fi } +fn_info_config_barotrauma(){ + if [ ! -f "${servercfgfullpath}" ]; then + servername="${unavailable}" + serverpassword="${unavailable}" + port="${zero}" + queryport="${zero}" + maxplayers="${unavailable}" + else + servername=$(grep -Po 'name="\K.*(?=")' "${servercfgfullpath}") # Assuming GNU grep is used + serverpassword=$(grep -Po 'password="\K.*(?=")' "${servercfgfullpath}") # Assuming GNU grep is used + port=$(grep " port=" "${servercfgfullpath}" | tr -cd '[:digit:]') + queryport=$(grep "queryport=" "${servercfgfullpath}" | tr -cd '[:digit:]') + 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:-"0"} + fi +} + fn_info_config_battalion1944(){ if [ ! -f "${servercfgfullpath}" ]; then servername="${unavailable}" @@ -1195,6 +1218,9 @@ if [ "${shortname}" == "ark" ]; then # Ballistic Overkill elif [ "${shortname}" == "bo" ]; then fn_info_config_ballistic_overkill +# Barotrauma +elif [ "${shortname}" == "bt" ]; then + fn_info_config_barotrauma # Battalion 1944 elif [ "${shortname}" == "bt1944" ]; then fn_info_config_battalion1944 diff --git a/lgsm/functions/info_messages.sh b/lgsm/functions/info_messages.sh index d8f7abd63..270caaadd 100644 --- a/lgsm/functions/info_messages.sh +++ b/lgsm/functions/info_messages.sh @@ -1205,6 +1205,17 @@ fn_info_message_mordhau(){ } | column -s $'\t' -t } +fn_info_message_barotrauma(){ + echo "netstat -atunp | grep /./DedicatedSer" + echo -e "" + { + echo -e "DESCRIPTION\tDIRECTION\tPORT\tPROTOCOL" + echo -e "> Game\tINBOUND\t${port}\tudp" + echo -e "> Query\tINBOUND\t$((port+1))\tudp" + } | column -s $'\t' -t +} + + fn_info_message_select_engine(){ # Display details depending on game or engine. if [ "${gamename}" == "7 Days To Die" ]; then @@ -1213,6 +1224,8 @@ fn_info_message_select_engine(){ fn_info_message_ark elif [ "${gamename}" == "Ballistic Overkill" ]; then fn_info_message_ballisticoverkill + elif [ "${gamename}" == "Barotrauma" ]; then + fn_info_message_barotrauma elif [ "${gamename}" == "Battalion 1944" ]; then fn_info_message_battalion1944 elif [ "${gamename}" == "Call of Duty" ]; then diff --git a/lgsm/functions/info_parms.sh b/lgsm/functions/info_parms.sh index 7b080036d..f21924c92 100644 --- a/lgsm/functions/info_parms.sh +++ b/lgsm/functions/info_parms.sh @@ -22,6 +22,11 @@ fn_info_parms_ark(){ maxplayers=${maxplayers:-"0"} } +fn_info_parms_barotrauma(){ + port=${port:-"0"} + queryport=${queryport:-"0"} +} + fn_info_parms_realvirtuality(){ port=${port:-"0"} queryport=$((port + 1)) @@ -197,6 +202,9 @@ if [ "${shortname}" == "ark" ]; then # ARMA 3 elif [ "${shortname}" == "arma3" ]; then fn_info_parms_realvirtuality +# Barotrauma +elif [ "${shortname}" == "bt" ]; then + fn_info_parms_barotrauma # Call of Duty elif [ "${shortname}" == "cod" ]||[ "${shortname}" == "coduo" ]||[ "${engine}" == "iw2.0" ]||[ "${engine}" == "iw3.0" ]; then fn_info_parms_cod diff --git a/lgsm/functions/install_config.sh b/lgsm/functions/install_config.sh index b601da7fc..7edad6595 100644 --- a/lgsm/functions/install_config.sh +++ b/lgsm/functions/install_config.sh @@ -173,6 +173,13 @@ elif [ "${gamename}" == "Base Defense" ]; then fn_fetch_default_config fn_default_config_remote fn_set_config_vars +elif [ "${gamename}" == "Barotrauma" ]; then + gamedirname="Barotrauma" + fn_check_cfgdir + array_configs+=( serversettings.xml ) + fn_fetch_default_config + fn_default_config_remote + fn_set_config_vars elif [ "${gamename}" == "Battalion 1944" ]; then gamedirname="Battalion1944" fn_check_cfgdir diff --git a/lgsm/functions/query_gamedig.sh b/lgsm/functions/query_gamedig.sh index 2c6192030..56d55206f 100644 --- a/lgsm/functions/query_gamedig.sh +++ b/lgsm/functions/query_gamedig.sh @@ -14,7 +14,7 @@ if [ "$(command -v gamedig 2>/dev/null)" ]&&[ "$(command -v jq 2>/dev/null)" ]; local engine="unreal4" fi - local engine_query_array=( avalanche3.0 madness quakelive realvirtuality refractor source goldsource spark starbound unity3d unreal4 wurm ) + local engine_query_array=( avalanche3.0 barotrauma madness quakelive realvirtuality refractor source goldsource spark starbound unity3d unreal4 wurm ) for engine_query in "${engine_query_array[@]}" do if [ "${engine_query}" == "${engine}" ]; then diff --git a/lgsm/functions/query_gsquery.py b/lgsm/functions/query_gsquery.py index fe809be15..b02262382 100644 --- a/lgsm/functions/query_gsquery.py +++ b/lgsm/functions/query_gsquery.py @@ -17,7 +17,7 @@ class gsquery: self.server_response_timeout = 5 self.default_buffer_length = 1024 # - sourcequery=[ 'avalanche3.0','madness','quakelive','realvirtuality','refractor','source','goldsource','spark','starbound','unity3d', 'unreal4', 'wurm' ] + sourcequery=[ 'avalanche3.0','barotrauma''madness','quakelive','realvirtuality','refractor','source','goldsource','spark','starbound','unity3d', 'unreal4', 'wurm' ] idtech3query=['idtech3','iw3.0','ioquake3'] idtech2query=['idtech2','quake','iw2.0'] minecraftquery=['minecraft','lwjgl2'] From 98287d9515e2fcc8613c2944657a97dd89925536 Mon Sep 17 00:00:00 2001 From: Diego Jara Date: Mon, 17 Jun 2019 15:48:37 -0500 Subject: [PATCH 108/534] feat(mods): add get5 and SteamWorks mods (#2375) Co-authored-by: Diego Jara --- lgsm/functions/mods_core.sh | 40 +++++++++++++++++++++++++++++++++++++ lgsm/functions/mods_list.sh | 18 ++++++++++++++--- 2 files changed, 55 insertions(+), 3 deletions(-) diff --git a/lgsm/functions/mods_core.sh b/lgsm/functions/mods_core.sh index 30e436a53..d2e18d6bf 100644 --- a/lgsm/functions/mods_core.sh +++ b/lgsm/functions/mods_core.sh @@ -146,6 +146,46 @@ fn_mod_tidy_files_list(){ sed -i "/^addons\/metamod$/d" "${modsdir}/${modcommand}-files.txt" sed -i "/^addons\/metamod\/sourcemod.vdf$/d" "${modsdir}/${modcommand}-files.txt" fi + + # Remove common paths from deletion list (Add your sourcemod mod here) + if [ "${modcommand}" == "gokz" ] || [ "${modcommand}" == "ttt" ] || [ "${modcommand}" == "steamworks" ] || [ "${modcommand}" == "get5" ]; then + sed -i "/^addons\/sourcemod$/d" "${modsdir}/${modcommand}-files.txt" + sed -i "/^addons\/sourcemod\/configs$/d" "${modsdir}/${modcommand}-files.txt" + sed -i "/^addons\/sourcemod\/extensions$/d" "${modsdir}/${modcommand}-files.txt" + sed -i "/^addons\/sourcemod\/logs$/d" "${modsdir}/${modcommand}-files.txt" + sed -i "/^addons\/sourcemod\/plugins$/d" "${modsdir}/${modcommand}-files.txt" + sed -i "/^addons\/sourcemod\/plugins\/disabled$/d" "${modsdir}/${modcommand}-files.txt" + sed -i "/^addons\/sourcemod\/scripting$/d" "${modsdir}/${modcommand}-files.txt" + sed -i "/^addons\/sourcemod\/scripting\/include$/d" "${modsdir}/${modcommand}-files.txt" + sed -i "/^addons\/sourcemod\/translations$/d" "${modsdir}/${modcommand}-files.txt" + # Don't delete directories of translations like 'fr', 'sv', 'de', etc + sed -i "/^addons\/sourcemod\/translations\/[A-Za-z0-9_]*$/d" "${modsdir}/${modcommand}-files.txt" + sed -i "/^cfg\/sourcemod$/d" "${modsdir}/${modcommand}-files.txt" + sed -i "/^maps$/d" "${modsdir}/${modcommand}-files.txt" + sed -i "/^materialss$/d" "${modsdir}/${modcommand}-files.txt" + sed -i "/^materials\/models$/d" "${modsdir}/${modcommand}-files.txt" + sed -i "/^materials\/models\/weapons$/d" "${modsdir}/${modcommand}-files.txt" + sed -i "/^materials\/darkness$/d" "${modsdir}/${modcommand}-files.txt" + sed -i "/^materials\/decals$/d" "${modsdir}/${modcommand}-files.txt" + sed -i "/^materials\/overlays$/d" "${modsdir}/${modcommand}-files.txt" + sed -i "/^models$/d" "${modsdir}/${modcommand}-files.txt" + sed -i "/^models\/weapons$/d" "${modsdir}/${modcommand}-files.txt" + sed -i "/^sound$/d" "${modsdir}/${modcommand}-files.txt" + sed -i "/^sound\/weapons$/d" "${modsdir}/${modcommand}-files.txt" + fi + + # Remove paths of specific mods from deletion list + if [ "${modcommand}" == "gokz" ]; then + sed -i "/^addons\/sourcemod\/scripting\/include\/smjansson.inc$/d" "${modsdir}/${modcommand}-files.txt" + sed -i "/^addons\/sourcemod\/scripting\/include\/GlobalAPI-Core.inc$/d" "${modsdir}/${modcommand}-files.txt" + sed -i "/^addons\/sourcemod\/scripting\/include\/sourcebanspp.inc$/d" "${modsdir}/${modcommand}-files.txt" + sed -i "/^addons\/sourcemod\/scripting\/include\/autoexecconfig.inc$/d" "${modsdir}/${modcommand}-files.txt" + sed -i "/^addons\/sourcemod\/scripting\/include\/colorvariables.inc$/d" "${modsdir}/${modcommand}-files.txt" + sed -i "/^addons\/sourcemod\/scripting\/include\/movementapi.inc$/d" "${modsdir}/${modcommand}-files.txt" + sed -i "/^addons\/sourcemod\/scripting\/include\/movement.inc$/d" "${modsdir}/${modcommand}-files.txt" + sed -i "/^addons\/sourcemod\/scripting\/include\/dhooks.inc$/d" "${modsdir}/${modcommand}-files.txt" + sed -i "/^addons\/sourcemod\/scripting\/include\/updater.inc$/d" "${modsdir}/${modcommand}-files.txt" + fi } ## Information Gathering. diff --git a/lgsm/functions/mods_list.sh b/lgsm/functions/mods_list.sh index eb1e2f8bf..c0d240e41 100644 --- a/lgsm/functions/mods_list.sh +++ b/lgsm/functions/mods_list.sh @@ -26,6 +26,16 @@ sourcemodscrapeurl="https://sm.alliedmods.net/smdrop/${sourcemodmversion}/source sourcemodlatestfile="$(wget "${sourcemodscrapeurl}" -q -O -)" sourcemoddownloadurl="https://www.sourcemod.net/latest.php?os=linux&version=${sourcemodmversion}" sourcemodurl="${sourcemoddownloadurl}" +# Steamworks +steamworksscrapeurl="https://users.alliedmods.net/~kyles/builds/SteamWorks" +steamworkslatestfile="$(curl -sL ${steamworksscrapeurl} | grep -m 1 linux | cut -d '"' -f 4)" +steamworksdownloadurl="${steamworksscrapeurl}/${steamworkslatestfile}" +steamworksurl="${steamworksdownloadurl}" +# CS:GO Mods +get5scrapepath="$(curl -sL https://ci.splewis.net/job/get5/lastSuccessfulBuild/api/xml | grep -oP "\K(.+)(?=)")" +get5latestfile="$(echo "${get5scrapepath}" | xargs -n 1 -I @ sh -c "echo "basename "@""")" +get5downloadurl="https://ci.splewis.net/job/get5/lastSuccessfulBuild/artifact/${get5scrapepath}" +get5url="${get5downloadurl}" # Oxide oxiderustlatestlink="$(curl -sL https://api.github.com/repos/theumod/umod.rust/releases/latest | grep browser_download_url | cut -d '"' -f 4)" oxidehurtworldlatestlink="$(curl -sL https://api.github.com/repos/OxideMod/Oxide.Hurtworld/releases/latest | grep browser_download_url | cut -d '"' -f 4 | grep "Oxide.Hurtworld.zip")" @@ -59,10 +69,12 @@ modseparator="MOD" # 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)" ) +mod_info_steamworks=( MOD "steamworks" "SteamWorks" "${steamworksurl}" "${steamworkslatestfile}" "0" "LowercaseOff" "${systemdir}" "OVERWRITE" "ENGINES" "Counter-Strike: Global Offensive;" "NOTGAMES" "https://github.com/KyleSanderson/SteamWorks" "Exposing SteamWorks functions to SourcePawn" ) # CS:GO Mods -mod_info_gokz=( MOD "gokz" "GOKZ" "https://bitbucket.org/kztimerglobalteam/gokz/downloads/GOKZ-latest.zip" "gokz-latest.zip" "0" "LowercaseOff" "${systemdir}" "cfg;addons/sourcemod/configs;" "ENGINES" "Counter Strike: Global Offensive" "NOTGAMES" "https://bitbucket.org/kztimerglobalteam/gokz/src/master/" "Implements the KZ game mode (requires SourceMod and MetaMod)") -mod_info_ttt=( MOD "ttt" "Trouble in Terrorist Town" "https://csgottt.com/downloads/ttt-latest-dev-${sourcemodmversion}.zip" "ttt-latest.zip" "0" "LowercaseOff" "${systemdir}" "cfg;addons/sourcemod/configs;" "ENGINES" "Counter Strike: Global Offensive" "NOTGAMES" "https://github.com/Bara/TroubleinTerroristTown" "Implements the TTT game mode (requires SourceMod and MetaMod)") +mod_info_gokz=( MOD "gokz" "GOKZ" "https://bitbucket.org/kztimerglobalteam/gokz/downloads/GOKZ-latest.zip" "gokz-latest.zip" "0" "LowercaseOff" "${systemdir}" "cfg;addons/sourcemod/configs;" "ENGINES" "Counter-Strike: Global Offensive;" "NOTGAMES" "https://bitbucket.org/kztimerglobalteam/gokz/src/master/" "Implements the KZ game mode (requires SourceMod and MetaMod)" ) +mod_info_ttt=( MOD "ttt" "Trouble in Terrorist Town" "https://csgottt.com/downloads/ttt-latest-dev-${sourcemodmversion}.zip" "ttt-latest.zip" "0" "LowercaseOff" "${systemdir}" "cfg;addons/sourcemod/configs;" "ENGINES" "Counter-Strike: Global Offensive;" "NOTGAMES" "https://github.com/Bara/TroubleinTerroristTown" "Implements the TTT game mode (requires SourceMod and MetaMod)" ) +mod_info_get5=( MOD "get5" "Get 5" "${get5url}" "${get5latestfile}" "0" "LowercaseOff" "${systemdir}" "cfg;addons/sourcemod/configs;" "ENGINES" "Counter-Strike: Global Offensive;" "NOTGAMES" "https://github.com/splewis/get5" "Plugin for competitive matches/scrims (requires SourceMod and 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" ) @@ -85,4 +97,4 @@ mod_info_hwoxide=( MOD "hwoxide" "Oxide for Hurtworld" "${oxidehurtworldlatestli mod_info_sdtdoxide=( MOD "sdtdoxide" "Oxide for 7 Days To Die" "${oxidesdtdlatestlink}" "Oxide.SevenDaysToDie.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_gokz[@]}" "${mod_info_ttt[@]}" "${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_pac3[@]}" "${mod_info_wiremod[@]}" "${mod_info_wiremodextras[@]}" "${mod_info_darkrp[@]}" "${mod_info_darkrpmodification[@]}" "${mod_info_rustoxide[@]}" "${mod_info_hwoxide[@]}" "${mod_info_sdtdoxide[@]}" ) +mods_global_array=( "${mod_info_metamod[@]}" "${mod_info_sourcemod[@]}" "${mod_info_steamworks[@]}" "${mod_info_gokz[@]}" "${mod_info_ttt[@]}" "${mod_info_get5[@]}" "${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_pac3[@]}" "${mod_info_wiremod[@]}" "${mod_info_wiremodextras[@]}" "${mod_info_darkrp[@]}" "${mod_info_darkrpmodification[@]}" "${mod_info_rustoxide[@]}" "${mod_info_hwoxide[@]}" "${mod_info_sdtdoxide[@]}" ) From 16bbb21736eff2caaaa48875670382e0998fa4ec Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Mon, 17 Jun 2019 22:07:21 +0100 Subject: [PATCH 109/534] correct if for query delay --- lgsm/functions/command_monitor.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lgsm/functions/command_monitor.sh b/lgsm/functions/command_monitor.sh index 49cfffbce..06786cadd 100644 --- a/lgsm/functions/command_monitor.sh +++ b/lgsm/functions/command_monitor.sh @@ -18,7 +18,7 @@ for queryattempt in {1..5}; do fn_print_dots "Querying port: ${querymethod}: ${ip}:${queryport} : ${totalseconds}/${queryattempt}: " fn_print_querying_eol fn_script_log_info "Querying port: ${querymethod}: ${ip}:${queryport} : ${queryattempt} : QUERYING" - if [ "$(cat "${rootdir}/${lockselfname}")" > "$(date "+%s" -d "${querydelay} mins ago")" ]; then + if [ "$(cat "${rootdir}/${lockselfname}")" -lt "$(date "+%s" -d "${querydelay} mins ago")" ]; then fn_print_ok "Querying port: ${querymethod}: ${ip}:${queryport} : ${totalseconds}/${queryattempt}: " fn_print_delay_eol fn_script_log_info "Querying port: ${querymethod}: ${ip}:${queryport} : ${queryattempt} : DELAY" From e3a94dccf6670a8acb820a3920f710a3788dfa92 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Mon, 17 Jun 2019 22:18:10 +0100 Subject: [PATCH 110/534] correct comment --- lgsm/functions/check_permissions.sh | 2 +- lgsm/functions/command_start.sh | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/lgsm/functions/check_permissions.sh b/lgsm/functions/check_permissions.sh index 77dfd1b5b..7108b16c1 100644 --- a/lgsm/functions/check_permissions.sh +++ b/lgsm/functions/check_permissions.sh @@ -149,7 +149,7 @@ fn_sys_perm_errors_detect(){ sysdirpermerror="0" classdirpermerror="0" netdirpermerror="0" - # Check permissions/ + # Check permissions. # /sys, /sys/class and /sys/class/net should be readable & executable. if [ ! -r "/sys" ]||[ ! -x "/sys" ]; then sysdirpermerror="1" diff --git a/lgsm/functions/command_start.sh b/lgsm/functions/command_start.sh index ed7d98498..afaa82326 100644 --- a/lgsm/functions/command_start.sh +++ b/lgsm/functions/command_start.sh @@ -28,8 +28,8 @@ fn_start_teamspeak3(){ if [ -f "${lgsmlog}" ]; then mv "${lgsmlog}" "${lgsmlogdate}" fi - # Create lockfile. + # Create lockfile. date '+%s' > "${rootdir}/${lockselfname}" # Accept license. if [ ! -f "${executabledir}/.ts3server_license_accepted" ]; then From cd7a62746e76d902e40f15bf5f1176638312bcb0 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Tue, 18 Jun 2019 22:16:45 +0100 Subject: [PATCH 111/534] release v19.7.0 --- linuxgsm.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/linuxgsm.sh b/linuxgsm.sh index c549ef46a..aba85f1b0 100755 --- a/linuxgsm.sh +++ b/linuxgsm.sh @@ -20,7 +20,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="v19.6.0" +version="v19.7.0" shortname="core" gameservername="core" rootdir="$(dirname "$(readlink -f "${BASH_SOURCE[0]}")")" From af50e2a5c6ae415f1020b1f51471fe7ed1575c0a Mon Sep 17 00:00:00 2001 From: Morbo <14136326+Morb0@users.noreply.github.com> Date: Fri, 21 Jun 2019 02:00:38 +0300 Subject: [PATCH 112/534] feat(barotrauma): Migrate to use dedicated server appid Co-authored-by: Morbo <14136326+Morb0@users.noreply.github.com> --- lgsm/config-default/config-lgsm/btserver/_default.cfg | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/lgsm/config-default/config-lgsm/btserver/_default.cfg b/lgsm/config-default/config-lgsm/btserver/_default.cfg index 614269477..ed8650e16 100644 --- a/lgsm/config-default/config-lgsm/btserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/btserver/_default.cfg @@ -8,10 +8,6 @@ #### Server Settings #### -## SteamCMD Login | https://docs.linuxgsm.com/steamcmd#steamcmd-login -steamuser="username" -steampass='password' - ## Server Start Command | https://docs.linuxgsm.com/configuration/start-parameters#additional-parameters fn_parms(){ parms="" @@ -95,7 +91,7 @@ sleeptime="0.5" ## SteamCMD Settings # Server appid -appid="602960" +appid="1026340" # SteamCMD Branch | https://docs.linuxgsm.com/steamcmd/branch branch="" # Master Server | https://docs.linuxgsm.com/steamcmd/steam-master-server From 66a260586e17f4b9d24d91226b03c452c7e92ca2 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Fri, 21 Jun 2019 09:09:22 +0100 Subject: [PATCH 113/534] feat(barotrauma): Migrate to use dedicated server appid (#2404) Co-authored-by: Morbo <14136326+Morb0@users.noreply.github.com> --- lgsm/config-default/config-lgsm/btserver/_default.cfg | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/lgsm/config-default/config-lgsm/btserver/_default.cfg b/lgsm/config-default/config-lgsm/btserver/_default.cfg index 614269477..ed8650e16 100644 --- a/lgsm/config-default/config-lgsm/btserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/btserver/_default.cfg @@ -8,10 +8,6 @@ #### Server Settings #### -## SteamCMD Login | https://docs.linuxgsm.com/steamcmd#steamcmd-login -steamuser="username" -steampass='password' - ## Server Start Command | https://docs.linuxgsm.com/configuration/start-parameters#additional-parameters fn_parms(){ parms="" @@ -95,7 +91,7 @@ sleeptime="0.5" ## SteamCMD Settings # Server appid -appid="602960" +appid="1026340" # SteamCMD Branch | https://docs.linuxgsm.com/steamcmd/branch branch="" # Master Server | https://docs.linuxgsm.com/steamcmd/steam-master-server From dc931a771866aca1c47d1787a39df072ba4b3845 Mon Sep 17 00:00:00 2001 From: Christian Date: Sat, 22 Jun 2019 18:34:47 +0200 Subject: [PATCH 114/534] fix(install): fix url in command (#2407) --- lgsm/functions/install_ut2k4_key.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lgsm/functions/install_ut2k4_key.sh b/lgsm/functions/install_ut2k4_key.sh index 0f0fe6da5..79066167e 100644 --- a/lgsm/functions/install_ut2k4_key.sh +++ b/lgsm/functions/install_ut2k4_key.sh @@ -14,7 +14,7 @@ echo "=================================" fn_sleep_time echo "To get your server listed on the Master Server list" echo "you must get a free CD key. Get a key here:" -echo "https://forums.unrealtournament.com/utserver/cdkey.php?2004" +echo "https://www.epicgames.com/unrealtournament/forums/cdkey.php?2004" echo "" if [ -z "${autoinstall}" ]; then echo "Once you have the key enter it below" @@ -28,4 +28,4 @@ else echo "You can add your key using the following command" echo "./${selfname} server-cd-key" fi -echo "" \ No newline at end of file +echo "" From 4cc300ba7fe65a15bee29f28e8a25d06d52fb1e5 Mon Sep 17 00:00:00 2001 From: Christian Date: Sat, 22 Jun 2019 23:46:17 +0200 Subject: [PATCH 115/534] fix(monitor): fix querydelay not delaying (#2406) Co-authored-by: Christian Birk --- lgsm/functions/command_monitor.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lgsm/functions/command_monitor.sh b/lgsm/functions/command_monitor.sh index 06786cadd..56b8ecf53 100644 --- a/lgsm/functions/command_monitor.sh +++ b/lgsm/functions/command_monitor.sh @@ -18,7 +18,7 @@ for queryattempt in {1..5}; do fn_print_dots "Querying port: ${querymethod}: ${ip}:${queryport} : ${totalseconds}/${queryattempt}: " fn_print_querying_eol fn_script_log_info "Querying port: ${querymethod}: ${ip}:${queryport} : ${queryattempt} : QUERYING" - if [ "$(cat "${rootdir}/${lockselfname}")" -lt "$(date "+%s" -d "${querydelay} mins ago")" ]; then + if [ "$(cat "${rootdir}/${lockselfname}")" -gt "$(date "+%s" -d "${querydelay} mins ago")" ]; then fn_print_ok "Querying port: ${querymethod}: ${ip}:${queryport} : ${totalseconds}/${queryattempt}: " fn_print_delay_eol fn_script_log_info "Querying port: ${querymethod}: ${ip}:${queryport} : ${queryattempt} : DELAY" From b90623f0058d37023a803a3898084b311819f585 Mon Sep 17 00:00:00 2001 From: Christian Date: Sat, 22 Jun 2019 23:58:21 +0200 Subject: [PATCH 116/534] fix(install): check if gslt token empty instead of existing (#2408) Co-authored-by: Christian Birk --- 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 c1192a60a..20f0d3445 100644 --- a/lgsm/functions/command_install.sh +++ b/lgsm/functions/command_install.sh @@ -32,7 +32,7 @@ else # Configuration. install_config.sh - if [ -v "${gslt}" ]; then + if [ -z "${gslt}" ]; then install_gslt.sh elif [ "${shortname}" == "dst" ]; then install_dst_token.sh From 0b4479b3803e0c61f2b03c4172a7b4fa34f477f9 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Sun, 23 Jun 2019 16:33:03 +0100 Subject: [PATCH 117/534] fix(install): correct gslt detection --- 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 20f0d3445..2bc534d69 100644 --- a/lgsm/functions/command_install.sh +++ b/lgsm/functions/command_install.sh @@ -32,7 +32,7 @@ else # Configuration. install_config.sh - if [ -z "${gslt}" ]; then + if [ -v gslt ]; then install_gslt.sh elif [ "${shortname}" == "dst" ]; then install_dst_token.sh From 0cb92e08c7975edfb1a78399614b440da46aa6e2 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Mon, 24 Jun 2019 00:27:36 +0100 Subject: [PATCH 118/534] release v19.8.1 --- linuxgsm.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/linuxgsm.sh b/linuxgsm.sh index aba85f1b0..8baa3d8c8 100755 --- a/linuxgsm.sh +++ b/linuxgsm.sh @@ -20,7 +20,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="v19.7.0" +version="v19.8.1" shortname="core" gameservername="core" rootdir="$(dirname "$(readlink -f "${BASH_SOURCE[0]}")")" From a030e95ab74113d06bfbf3a13f1d3c4c9fd5ceae Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Wed, 26 Jun 2019 20:29:41 +0100 Subject: [PATCH 119/534] fix(untserver): update appid for Unturned --- lgsm/config-default/config-lgsm/untserver/_default.cfg | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lgsm/config-default/config-lgsm/untserver/_default.cfg b/lgsm/config-default/config-lgsm/untserver/_default.cfg index 2913f0ea8..44c8e40a2 100644 --- a/lgsm/config-default/config-lgsm/untserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/untserver/_default.cfg @@ -102,7 +102,7 @@ sleeptime="0.5" ## SteamCMD Settings # Server appid -appid="304930" +appid="1110390" # SteamCMD Branch | https://docs.linuxgsm.com/steamcmd/branch branch="" # Master Server | https://docs.linuxgsm.com/steamcmd/steam-master-server From 4c493d74fc71089a9dd267323fabca5fb89eeb06 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Wed, 26 Jun 2019 22:52:14 +0100 Subject: [PATCH 120/534] fix(untserver): Unturned is now x64 --- lgsm/config-default/config-lgsm/untserver/_default.cfg | 2 +- lgsm/functions/fix_unt.sh | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/lgsm/config-default/config-lgsm/untserver/_default.cfg b/lgsm/config-default/config-lgsm/untserver/_default.cfg index 44c8e40a2..b65a45510 100644 --- a/lgsm/config-default/config-lgsm/untserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/untserver/_default.cfg @@ -120,7 +120,7 @@ glibc="2.15" ## Server Specific Directories systemdir="${serverfiles}" executabledir="${serverfiles}" -executable="./Unturned_Headless.x86" +executable="./Unturned_Headless.x86_64" servercfgdir="${systemdir}/Servers/${servicename}" servercfg="Config.json" servercfgdefault="Config.json" diff --git a/lgsm/functions/fix_unt.sh b/lgsm/functions/fix_unt.sh index bc29a54ed..3c9c9335a 100644 --- a/lgsm/functions/fix_unt.sh +++ b/lgsm/functions/fix_unt.sh @@ -7,5 +7,5 @@ local commandname="FIX" local commandaction="Fix" -# Fixes: [Raknet] Server Shutting Down (Shutting Down). -export LD_LIBRARY_PATH="$LD_LIBRARY_PATH:${systemdir}/lib" +# steamclient.so: cannot open shared object file: No such file or directory +export LD_LIBRARY_PATH="${serverfiles}/linux64:${serverfiles}:$LD_LIBRARY_PATH" From b873a83dc3c97a15ad7cd689c859ae2353b1d153 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Wed, 26 Jun 2019 22:53:21 +0100 Subject: [PATCH 121/534] fix(linuxgsm.sh): bug causing serverlist.csv to keep downloading --- linuxgsm.sh | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) diff --git a/linuxgsm.sh b/linuxgsm.sh index 8baa3d8c8..a1f4af394 100755 --- a/linuxgsm.sh +++ b/linuxgsm.sh @@ -258,6 +258,15 @@ fn_install_file(){ exit } +fn_dl_serverlist(){ + # Download the latest serverlist. This is the complete list of all supported servers. + fn_bootstrap_fetch_file_github "lgsm/data" "serverlist.csv" "${datadir}" "nochmodx" "norun" "forcedl" "nomd5" + if [ ! -f "${serverlist}" ]; then + echo "[ FAIL ] serverlist.csv could not be loaded." + exit 1 + fi +} + # Prevent LinuxGSM from running as root. Except if doing a dependency install. if [ "$(whoami)" == "root" ]; then if [ "${userinput}" == "install" ]||[ "${userinput}" == "auto-install" ]||[ "${userinput}" == "i" ]||[ "${userinput}" == "ai" ]; then @@ -274,21 +283,16 @@ if [ "$(whoami)" == "root" ]; then fi fi -# Download the latest serverlist. This is the complete list of all supported servers. -fn_bootstrap_fetch_file_github "lgsm/data" "serverlist.csv" "${datadir}" "nochmodx" "norun" "forcedl" "nomd5" -if [ ! -f "${serverlist}" ]; then - echo "[ FAIL ] serverlist.csv could not be loaded." - exit 1 -fi - # LinuxGSM installer mode. if [ "${shortname}" == "core" ]; then if [ "${userinput}" == "list" ]||[ "${userinput}" == "l" ]; then + fn_dl_serverlist { tail -n +2 "${serverlist}" | awk -F "," '{print $2 "\t" $3}' } | column -s $'\t' -t | more exit elif [ "${userinput}" == "install" ]||[ "${userinput}" == "i" ]; then + fn_dl_serverlist tail -n +2 "${serverlist}" | awk -F "," '{print $1 "," $2 "," $3}' > "${serverlistmenu}" fn_install_menu result "LinuxGSM" "Select game server to install." "${serverlistmenu}" userinput="${result}" From 8cdb66850bc1c2420f48926826516e26a07b360a Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Wed, 26 Jun 2019 22:54:07 +0100 Subject: [PATCH 122/534] hotfix v19.8.3 --- linuxgsm.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/linuxgsm.sh b/linuxgsm.sh index a1f4af394..f27794c2c 100755 --- a/linuxgsm.sh +++ b/linuxgsm.sh @@ -20,7 +20,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="v19.8.1" +version="v19.8.3" shortname="core" gameservername="core" rootdir="$(dirname "$(readlink -f "${BASH_SOURCE[0]}")")" @@ -292,7 +292,7 @@ if [ "${shortname}" == "core" ]; then } | column -s $'\t' -t | more exit elif [ "${userinput}" == "install" ]||[ "${userinput}" == "i" ]; then - fn_dl_serverlist + fn_dl_serverlist tail -n +2 "${serverlist}" | awk -F "," '{print $1 "," $2 "," $3}' > "${serverlistmenu}" fn_install_menu result "LinuxGSM" "Select game server to install." "${serverlistmenu}" userinput="${result}" From 320fae5ac22d2e9df378c2e74480be8e8919739a Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Wed, 26 Jun 2019 23:25:54 +0100 Subject: [PATCH 123/534] fix(untserver): specific steamcmd parameters no longer required --- lgsm/functions/command_validate.sh | 2 -- lgsm/functions/update_steamcmd.sh | 2 -- 2 files changed, 4 deletions(-) diff --git a/lgsm/functions/command_validate.sh b/lgsm/functions/command_validate.sh index de999be25..f6be3f5b6 100644 --- a/lgsm/functions/command_validate.sh +++ b/lgsm/functions/command_validate.sh @@ -24,8 +24,6 @@ fn_validation(){ if [ "${appid}" == "90" ]; then ${unbuffer} ./steamcmd.sh +login "${steamuser}" "${steampass}" +force_install_dir "${serverfiles}" +app_info_print 70 +app_set_config 90 mod "${appidmod}" +app_update "${appid}" ${branch} +app_update "${appid}" ${branch} validate +quit | tee -a "${lgsmlog}" - elif [ "${gamename}" == "Unturned" ]; then - ${unbuffer} ./steamcmd.sh +@sSteamCmdForcePlatformBitness 32 +login "${steamuser}" "${steampass}" +force_install_dir "${filesdir}" +app_update "${appid}" ${branch} validate +quit else ${unbuffer} ./steamcmd.sh +login "${steamuser}" "${steampass}" +force_install_dir "${serverfiles}" +app_update "${appid}" ${branch} validate +quit | tee -a "${lgsmlog}" fi diff --git a/lgsm/functions/update_steamcmd.sh b/lgsm/functions/update_steamcmd.sh index 7b690643d..8f27cd3fe 100644 --- a/lgsm/functions/update_steamcmd.sh +++ b/lgsm/functions/update_steamcmd.sh @@ -20,8 +20,6 @@ fn_update_steamcmd_dl(){ cd "${steamcmddir}" || exit if [ "${appid}" == "90" ]; then ${unbuffer} ./steamcmd.sh +login "${steamuser}" "${steampass}" +force_install_dir "${serverfiles}" +app_set_config 90 mod "${appidmod}" +app_update "${appid}" ${branch} +quit | tee -a "${lgsmlog}" - elif [ "${shortname}" == "unt" ]; then - ${unbuffer} ./steamcmd.sh +@sSteamCmdForcePlatformBitness 32 +login "${steamuser}" "${steampass}" +force_install_dir "${filesdir}" +app_update "${appid}" ${branch} validate +quit else ${unbuffer} ./steamcmd.sh +login "${steamuser}" "${steampass}" +force_install_dir "${serverfiles}" +app_update "${appid}" ${branch} +quit | tee -a "${lgsmlog}" fi From 412f56a2434333b3faabb85a4f0396fe152e20cf Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Thu, 27 Jun 2019 07:34:02 +0100 Subject: [PATCH 124/534] Revert "fix(linuxgsm.sh): bug causing serverlist.csv to keep downloading" This reverts commit b873a83dc3c97a15ad7cd689c859ae2353b1d153. --- linuxgsm.sh | 22 +++++++++------------- 1 file changed, 9 insertions(+), 13 deletions(-) diff --git a/linuxgsm.sh b/linuxgsm.sh index f27794c2c..fd56f849d 100755 --- a/linuxgsm.sh +++ b/linuxgsm.sh @@ -20,7 +20,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="v19.8.3" +version="v19.8.1" shortname="core" gameservername="core" rootdir="$(dirname "$(readlink -f "${BASH_SOURCE[0]}")")" @@ -258,15 +258,6 @@ fn_install_file(){ exit } -fn_dl_serverlist(){ - # Download the latest serverlist. This is the complete list of all supported servers. - fn_bootstrap_fetch_file_github "lgsm/data" "serverlist.csv" "${datadir}" "nochmodx" "norun" "forcedl" "nomd5" - if [ ! -f "${serverlist}" ]; then - echo "[ FAIL ] serverlist.csv could not be loaded." - exit 1 - fi -} - # Prevent LinuxGSM from running as root. Except if doing a dependency install. if [ "$(whoami)" == "root" ]; then if [ "${userinput}" == "install" ]||[ "${userinput}" == "auto-install" ]||[ "${userinput}" == "i" ]||[ "${userinput}" == "ai" ]; then @@ -283,16 +274,21 @@ if [ "$(whoami)" == "root" ]; then fi fi +# Download the latest serverlist. This is the complete list of all supported servers. +fn_bootstrap_fetch_file_github "lgsm/data" "serverlist.csv" "${datadir}" "nochmodx" "norun" "forcedl" "nomd5" +if [ ! -f "${serverlist}" ]; then + echo "[ FAIL ] serverlist.csv could not be loaded." + exit 1 +fi + # LinuxGSM installer mode. if [ "${shortname}" == "core" ]; then if [ "${userinput}" == "list" ]||[ "${userinput}" == "l" ]; then - fn_dl_serverlist { tail -n +2 "${serverlist}" | awk -F "," '{print $2 "\t" $3}' } | column -s $'\t' -t | more exit elif [ "${userinput}" == "install" ]||[ "${userinput}" == "i" ]; then - fn_dl_serverlist tail -n +2 "${serverlist}" | awk -F "," '{print $1 "," $2 "," $3}' > "${serverlistmenu}" fn_install_menu result "LinuxGSM" "Select game server to install." "${serverlistmenu}" userinput="${result}" @@ -382,4 +378,4 @@ else getopt=$1 core_getopt.sh fi -fi +fi \ No newline at end of file From 7f4260e1ac79d00edd77a2bccfd7c882b5c55221 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Sat, 29 Jun 2019 01:45:28 +0100 Subject: [PATCH 125/534] fix(linuxgsm.sh): reverted servicename back to selfname --- linuxgsm.sh | 6 +++--- tests/tests_fctrserver.sh | 2 +- tests/tests_jc2server.sh | 2 +- tests/tests_mcserver.sh | 2 +- tests/tests_ts3server.sh | 2 +- 5 files changed, 7 insertions(+), 7 deletions(-) diff --git a/linuxgsm.sh b/linuxgsm.sh index fd56f849d..62a810f9d 100755 --- a/linuxgsm.sh +++ b/linuxgsm.sh @@ -20,12 +20,12 @@ if [ -f ".dev-debug" ]; then set -x fi -version="v19.8.1" +version="v19.8.4" shortname="core" gameservername="core" rootdir="$(dirname "$(readlink -f "${BASH_SOURCE[0]}")")" selfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" -servicename="${gameservername}" +servicename="${selfname}" lockselfname=".${servicename}.lock" lgsmdir="${rootdir}/lgsm" logdir="${rootdir}/log" @@ -378,4 +378,4 @@ else getopt=$1 core_getopt.sh fi -fi \ No newline at end of file +fi diff --git a/tests/tests_fctrserver.sh b/tests/tests_fctrserver.sh index ca4bf150f..de29a27d1 100644 --- a/tests/tests_fctrserver.sh +++ b/tests/tests_fctrserver.sh @@ -26,7 +26,7 @@ shortname="fctr" gameservername="fctrserver" rootdir="$(dirname "$(readlink -f "${BASH_SOURCE[0]}")")" selfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" -servicename="${gameservername}" +servicename="${selfname}" lockselfname=".${servicename}.lock" lgsmdir="${rootdir}/lgsm" logdir="${rootdir}/log" diff --git a/tests/tests_jc2server.sh b/tests/tests_jc2server.sh index dbcca9b42..065c67f18 100644 --- a/tests/tests_jc2server.sh +++ b/tests/tests_jc2server.sh @@ -26,7 +26,7 @@ shortname="jc2" gameservername="jc2server" rootdir="$(dirname "$(readlink -f "${BASH_SOURCE[0]}")")" selfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" -servicename="${gameservername}" +servicename="${selfname}" lockselfname=".${servicename}.lock" lgsmdir="${rootdir}/lgsm" logdir="${rootdir}/log" diff --git a/tests/tests_mcserver.sh b/tests/tests_mcserver.sh index 426851163..4be29da73 100644 --- a/tests/tests_mcserver.sh +++ b/tests/tests_mcserver.sh @@ -26,7 +26,7 @@ shortname="mc" gameservername="mcserver" rootdir="$(dirname "$(readlink -f "${BASH_SOURCE[0]}")")" selfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" -servicename="${gameservername}" +servicename="${selfname}" lockselfname=".${servicename}.lock" lgsmdir="${rootdir}/lgsm" logdir="${rootdir}/log" diff --git a/tests/tests_ts3server.sh b/tests/tests_ts3server.sh index d243ef13e..faeb0e616 100644 --- a/tests/tests_ts3server.sh +++ b/tests/tests_ts3server.sh @@ -26,7 +26,7 @@ shortname="ts3" gameservername="ts3server" rootdir="$(dirname "$(readlink -f "${BASH_SOURCE[0]}")")" selfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" -servicename="${gameservername}" +servicename="${selfname}" lockselfname=".${servicename}.lock" lgsmdir="${rootdir}/lgsm" logdir="${rootdir}/log" From 65d30538533051e655eb2971d2d69b907e2899f2 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Sat, 29 Jun 2019 02:06:55 +0100 Subject: [PATCH 126/534] fix(linuxgsm.sh): fix bug causing serverlist.csv to keep loading --- linuxgsm.sh | 16 +++++++--------- 1 file changed, 7 insertions(+), 9 deletions(-) diff --git a/linuxgsm.sh b/linuxgsm.sh index 62a810f9d..450218cb7 100755 --- a/linuxgsm.sh +++ b/linuxgsm.sh @@ -58,8 +58,6 @@ core_functions.sh(){ # Bootstrap # Fetches the core functions required before passed off to core_dl.sh. - -# Fetches core functions. fn_bootstrap_fetch_file(){ remote_fileurl="${1}" local_filedir="${2}" @@ -274,15 +272,15 @@ if [ "$(whoami)" == "root" ]; then fi fi -# Download the latest serverlist. This is the complete list of all supported servers. -fn_bootstrap_fetch_file_github "lgsm/data" "serverlist.csv" "${datadir}" "nochmodx" "norun" "forcedl" "nomd5" -if [ ! -f "${serverlist}" ]; then - echo "[ FAIL ] serverlist.csv could not be loaded." - exit 1 -fi - # LinuxGSM installer mode. if [ "${shortname}" == "core" ]; then + # Download the latest serverlist. This is the complete list of all supported servers. + fn_bootstrap_fetch_file_github "lgsm/data" "serverlist.csv" "${datadir}" "nochmodx" "norun" "forcedl" "nomd5" + if [ ! -f "${serverlist}" ]; then + echo "[ FAIL ] serverlist.csv could not be loaded." + exit 1 + fi + if [ "${userinput}" == "list" ]||[ "${userinput}" == "l" ]; then { tail -n +2 "${serverlist}" | awk -F "," '{print $2 "\t" $3}' From f34960503d929e6fa944d067d9ae1dccb0521792 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Sun, 30 Jun 2019 18:53:49 +0100 Subject: [PATCH 127/534] fix(docs): moved pull_request_template.md to correct location --- .../pull_request_template.md} | 0 ISSUE_TEMPLATE.md | 15 --------------- 2 files changed, 15 deletions(-) rename .github/{ISSUE_TEMPLATE/PULL_REQUEST_TEMPLATE.md => PULL_REQUEST_TEMPLATE/pull_request_template.md} (100%) delete mode 100644 ISSUE_TEMPLATE.md diff --git a/.github/ISSUE_TEMPLATE/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE/pull_request_template.md similarity index 100% rename from .github/ISSUE_TEMPLATE/PULL_REQUEST_TEMPLATE.md rename to .github/PULL_REQUEST_TEMPLATE/pull_request_template.md diff --git a/ISSUE_TEMPLATE.md b/ISSUE_TEMPLATE.md deleted file mode 100644 index c08b7705a..000000000 --- a/ISSUE_TEMPLATE.md +++ /dev/null @@ -1,15 +0,0 @@ -Follow **[this guide](https://linuxgsm.com/support/#guide)** to make sure you post the correct info. -For general support visit the **[LinuxGSM-Support](https://github.com/GameServerManagers/LinuxGSM-Support)**. - -Issues here are **ONLY** for: -* LinuxGSM bugs -* feature suggestions -* code contributions - -Issues here are **NOT** for: -* General support -* Specific game server issues (e.g CS:GO, TF2) -* Dedicated server issues (e.g Ubuntu, CentOS) -* Anything not directly related to LinuxGSM development - -Any general support issues on GitHub will be closed. From 7a6044177e08ff5f97993b0562bbf49027342882 Mon Sep 17 00:00:00 2001 From: Frisasky Date: Thu, 4 Jul 2019 19:15:30 +0800 Subject: [PATCH 128/534] feat(bbserver): enable steam master query (#2429) Co-authored-by: Frisa --- lgsm/config-default/config-lgsm/bbserver/_default.cfg | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lgsm/config-default/config-lgsm/bbserver/_default.cfg b/lgsm/config-default/config-lgsm/bbserver/_default.cfg index 2a89c8849..db7a8dfff 100644 --- a/lgsm/config-default/config-lgsm/bbserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/bbserver/_default.cfg @@ -103,7 +103,7 @@ appidmod="cstrike" # SteamCMD Branch | https://docs.linuxgsm.com/steamcmd/branch branch="" # Master Server | https://docs.linuxgsm.com/steamcmd/steam-master-server -steammaster="false" +steammaster="true" ## LinuxGSM Server Details # Do not edit From 8f0ecf27cc5678b1a42ff383096d213de1ab66a2 Mon Sep 17 00:00:00 2001 From: Frisasky Date: Thu, 4 Jul 2019 19:16:51 +0800 Subject: [PATCH 129/534] feat(cod4server): update COD4 glibc version (#2425) Co-authored-by: Frisa --- lgsm/config-default/config-lgsm/cod4server/_default.cfg | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lgsm/config-default/config-lgsm/cod4server/_default.cfg b/lgsm/config-default/config-lgsm/cod4server/_default.cfg index 6ef656494..099128073 100644 --- a/lgsm/config-default/config-lgsm/cod4server/_default.cfg +++ b/lgsm/config-default/config-lgsm/cod4server/_default.cfg @@ -96,7 +96,7 @@ sleeptime="0.5" # Do not edit gamename="Call of Duty 4" engine="iw3.0" -glibc="2.3" +glibc="2.12" #### Directories #### # Edit with care From 15c52a9d2e4839b174135b094fe2895051ec09ff Mon Sep 17 00:00:00 2001 From: Frisasky Date: Thu, 4 Jul 2019 19:18:01 +0800 Subject: [PATCH 130/534] feat(untserver): add mono dependency for Unturned (#2426) Co-authored-by: Frisa --- 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 45423ec2d..e9cd50dd0 100644 --- a/lgsm/functions/check_deps.sh +++ b/lgsm/functions/check_deps.sh @@ -544,6 +544,9 @@ fn_deps_build_redhat(){ # Eco elif [ "${shortname}" == "eco" ]; then array_deps_required+=( mono-complete ) + # Unturned + elif [ "${shortname}" == "unt" ]; then + array_deps_required+=( mono-complete ) fi fn_deps_email fn_check_loop From 135a48696417224bcdb49477f74a00e43ab37043 Mon Sep 17 00:00:00 2001 From: Frisasky Date: Thu, 4 Jul 2019 19:18:55 +0800 Subject: [PATCH 131/534] fix(ecoserver): add missing Network.eco for Eco (#2424) Co-authored-by: Frisa --- 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 7edad6595..88776d8c5 100644 --- a/lgsm/functions/install_config.sh +++ b/lgsm/functions/install_config.sh @@ -326,6 +326,12 @@ elif [ "${gamename}" == "Dystopia" ]; then fn_fetch_default_config fn_default_config_remote fn_set_config_vars +elif [ "${gamename}" == "Eco" ]; then + gamedirname="Eco" + array_configs+=( Network.eco ) + fn_fetch_default_config + fn_default_config_remote + fn_set_config_vars elif [ "${gamename}" == "ET: Legacy" ]; then gamedirname="ETLegacy" array_configs+=( server.cfg ) From 2c5bcdc2bc484211c350046bfd2c7915089abaf8 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Fri, 5 Jul 2019 20:05:25 +0100 Subject: [PATCH 132/534] fix(coduoserver): removed fix that is no longer required. --- lgsm/functions/fix_coduo.sh | 11 ----------- 1 file changed, 11 deletions(-) delete mode 100644 lgsm/functions/fix_coduo.sh diff --git a/lgsm/functions/fix_coduo.sh b/lgsm/functions/fix_coduo.sh deleted file mode 100644 index 9eb4e78d7..000000000 --- a/lgsm/functions/fix_coduo.sh +++ /dev/null @@ -1,11 +0,0 @@ -#!/bin/bash -# LinuxGSM fix_coduo.sh function -# Author: Alexander Hurd -# Website: https://linuxgsm.com -# Description: Fixes for Call of Duty: United Offensive - -local commandname="FIX" -local commandaction="Fix" - -# Force glibc fix. -fix_glibc.sh From eb17129279db7aba882fc4b0521c1500cbc626da Mon Sep 17 00:00:00 2001 From: Frisasky Date: Sat, 6 Jul 2019 03:13:24 +0800 Subject: [PATCH 133/534] feat(newserver): SourceForts Classic (#2430) Co-authored-by: Frisa --- .../config-lgsm/sfcserver/_default.cfg | 141 ++++++++++++++++++ lgsm/data/serverlist.csv | 1 + lgsm/functions/core_functions.sh | 5 + lgsm/functions/fix.sh | 2 + lgsm/functions/fix_sfc.sh | 49 ++++++ lgsm/functions/install_config.sh | 18 ++- lgsm/functions/install_server_files.sh | 6 +- 7 files changed, 214 insertions(+), 8 deletions(-) create mode 100644 lgsm/config-default/config-lgsm/sfcserver/_default.cfg create mode 100644 lgsm/functions/fix_sfc.sh diff --git a/lgsm/config-default/config-lgsm/sfcserver/_default.cfg b/lgsm/config-default/config-lgsm/sfcserver/_default.cfg new file mode 100644 index 000000000..e4c2662b0 --- /dev/null +++ b/lgsm/config-default/config-lgsm/sfcserver/_default.cfg @@ -0,0 +1,141 @@ +################################## +######## 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://docs.linuxgsm.com/configuration/start-parameters +ip="0.0.0.0" +port="27015" +clientport="27005" +sourcetvport="27020" +defaultmap="sf_astrodome" +maxplayers="32" + +## Server Start Command | https://docs.linuxgsm.com/configuration/start-parameters#additional-parameters +fn_parms(){ +parms="-game sfclassic -strictportbind -ip ${ip} -port ${port} +clientport ${clientport} +tv_port ${sourcetvport} +map ${defaultmap} +servercfgfile ${servercfg} -maxplayers ${maxplayers}" +} + +#### LinuxGSM Settings #### + +## Notification Alerts +# (on|off) + +# Display IP | https://docs.linuxgsm.com/alerts#display-ip +displayip="" + +# More info | https://docs.linuxgsm.com/alerts#more-info +postalert="off" +postdays="7" +posttarget="https://hastebin.com" + +# Discord Alerts | https://docs.linuxgsm.com/alerts/discord +discordalert="off" +discordwebhook="webhook" + +# Email Alerts | https://docs.linuxgsm.com/alerts/email +emailalert="off" +email="email@example.com" +emailfrom="" + +# IFTTT Alerts | https://docs.linuxgsm.com/alerts/ifttt +iftttalert="off" +ifttttoken="accesstoken" +iftttevent="linuxgsm_alert" + +# Mailgun Email Alerts | https://docs.linuxgsm.com/alerts/mailgun +mailgunalert="off" +mailguntoken="accesstoken" +mailgundomain="example.com" +mailgunemailfrom="alert@example.com" +mailgunemail="email@myemail.com" + +# Pushbullet Alerts | https://docs.linuxgsm.com/alerts/pushbullet +pushbulletalert="off" +pushbullettoken="accesstoken" +channeltag="" + +# Pushover Alerts | https://docs.linuxgsm.com/alerts/pushover +pushoveralert="off" +pushovertoken="accesstoken" + +# Telegram Alerts | https://docs.linuxgsm.com/alerts/telegram +# You can add a custom cURL string eg proxy (useful in Russia) or else in "curlcustomstring". +# like a "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help", if you not need +# any custom string in curl - simple ignore this parameter. +telegramalert="off" +telegramtoken="accesstoken" +telegramchatid="" +curlcustomstring="" + +## Updating | https://docs.linuxgsm.com/commands/update +updateonstart="off" + +## Backup | https://docs.linuxgsm.com/commands/backup +maxbackups="4" +maxbackupdays="30" +stoponbackup="on" + +## Logging | https://docs.linuxgsm.com/features/logging +consolelogging="on" +logdays="7" + +## Monitor | https://docs.linuxgsm.com/commands/monitor +# Query delay time +querydelay="1" + +#### LinuxGSM Advanced Settings #### + +# ANSI Colors +ansi="on" + +# Message Display Time +sleeptime="0.5" + +## SteamCMD Settings +# Server appid +appid="244310" # Source 2013 SDK +# SteamCMD Branch | https://docs.linuxgsm.com/steamcmd/branch +branch="" +# Master Server | https://docs.linuxgsm.com/steamcmd/steam-master-server +steammaster="true" + +## LinuxGSM Server Details +# Do not edit +gamename="SourceForts Classic" +engine="source" +glibc="2.15" + +#### Directories #### +# Edit with care + +## Server Specific Directories +systemdir="${serverfiles}/sfclassic" +executabledir="${serverfiles}" +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" +alertlog="${lgsmlogdir}/${servicename}-alert.log" +postdetailslog="${lgsmlogdir}/${servicename}-postdetails.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/data/serverlist.csv b/lgsm/data/serverlist.csv index b230e225b..aa1d2c8c1 100644 --- a/lgsm/data/serverlist.csv +++ b/lgsm/data/serverlist.csv @@ -71,6 +71,7 @@ rust,rustserver,Rust rw,rwserver, Rising World samp,sampserver,San Andreas Multiplayer sbots,sbotsserver, StickyBots +sfc,sfcserver,SourceForts Classic sof2,sof2server,Soldier Of Fortune 2: Gold Edition ss3,ss3server,Serious Sam 3: BFE sb,sbserver,Starbound diff --git a/lgsm/functions/core_functions.sh b/lgsm/functions/core_functions.sh index af1e933e0..43ce5984e 100644 --- a/lgsm/functions/core_functions.sh +++ b/lgsm/functions/core_functions.sh @@ -351,6 +351,11 @@ functionfile="${FUNCNAME}" fn_fetch_function } +fix_sfc.sh(){ +functionfile="${FUNCNAME}" +fn_fetch_function +} + fix_steamcmd.sh(){ functionfile="${FUNCNAME}" fn_fetch_function diff --git a/lgsm/functions/fix.sh b/lgsm/functions/fix.sh index 51e9b5a69..85c789c73 100644 --- a/lgsm/functions/fix.sh +++ b/lgsm/functions/fix.sh @@ -55,6 +55,8 @@ if [ "${function_selfname}" != "command_install.sh" ]&&[ -z "${fixbypass}" ]; th fix_rw.sh elif [ "${shortname}" == "sdtd" ]; then fix_sdtd.sh + elif [ "${shortname}" == "sfc" ]; then + fix_sfc.sh elif [ "${shortname}" == "sof2" ]; then fix_sof2.sh elif [ "${shortname}" == "ss3" ]; then diff --git a/lgsm/functions/fix_sfc.sh b/lgsm/functions/fix_sfc.sh new file mode 100644 index 000000000..060ec4823 --- /dev/null +++ b/lgsm/functions/fix_sfc.sh @@ -0,0 +1,49 @@ +#!/bin/bash +# LinuxGSM fix_sfc.sh function +# Author: Daniel Gibbs +# Website: https://linuxgsm.com +# Description: Resolves various issues with Source Forts Classic. + +local commandname="FIX" +local commandaction="Fix" +local function_selfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" + +if [ ! -f "${serverfiles}/bin/datacache.so" ]; then + ln -s "${serverfiles}/bin/datacache_srv.so" "${serverfiles}/bin/datacache.so" +fi + +if [ ! -f "${serverfiles}/bin/dedicated.so" ]; then + ln -s "${serverfiles}/bin/dedicated_srv.so" "${serverfiles}/bin/dedicated.so" +fi + +if [ ! -f "${serverfiles}/bin/engine.so" ]; then + ln -s "${serverfiles}/bin/engine_srv.so" "${serverfiles}/bin/engine.so" +fi + +if [ ! -f "${serverfiles}/bin/materialsystem.so" ]; then + ln -s "${serverfiles}/bin/materialsystem_srv.so" "${serverfiles}/bin/materialsystem.so" +fi + +if [ ! -f "${serverfiles}/bin/replay.so" ]; then + ln -s "${serverfiles}/bin/replay_srv.so" "${serverfiles}/bin/replay.so" +fi + +if [ ! -f "${serverfiles}/bin/shaderapiempty.so" ]; then + ln -s "${serverfiles}/bin/shaderapiempty_srv.so" "${serverfiles}/bin/shaderapiempty.so" +fi + +if [ ! -f "${serverfiles}/bin/soundemittersystem.so" ]; then + ln -s "${serverfiles}/bin/soundemittersystem_srv.so" "${serverfiles}/bin/soundemittersystem.so" +fi + +if [ ! -f "${serverfiles}/bin/studiorender.so" ]; then + ln -s "${serverfiles}/bin/studiorender_srv.so" "${serverfiles}/bin/studiorender.so" +fi + +if [ ! -f "${serverfiles}/bin/vphysics.so" ]; then + ln -s "${serverfiles}/bin/vphysics_srv.so" "${serverfiles}/bin/vphysics.so" +fi + +if [ ! -f "${serverfiles}/bin/scenefilecache.so" ]; then + ln -s "${serverfiles}/bin/scenefilecache_srv.so" "${serverfiles}/bin/scenefilecache.so" +fi diff --git a/lgsm/functions/install_config.sh b/lgsm/functions/install_config.sh index 88776d8c5..a643bb1df 100644 --- a/lgsm/functions/install_config.sh +++ b/lgsm/functions/install_config.sh @@ -537,6 +537,12 @@ elif [ "${gamename}" == "Rust" ]; then array_configs+=( server.cfg ) fn_fetch_default_config fn_default_config_remote +elif [ "${gamename}" == "San Andreas Multiplayer" ]; then + gamedirname="SanAndreasMultiplayer" + array_configs+=( server.cfg ) + fn_fetch_default_config + fn_default_config_remote + fn_set_config_vars elif [ "${gamename}" == "Serious Sam 3: BFE" ]; then gamedirname="SeriousSam3BFE" array_configs+=( server.ini ) @@ -549,6 +555,12 @@ elif [ "${gamename}" == "Soldier Of Fortune 2: Gold Edition" ]; then fn_fetch_default_config fn_default_config_remote fn_set_config_vars +elif [ "${gamename}" == "SourceForts Classic" ]; then + gamedirname="SourceFortsClassic" + array_configs+=( server.cfg ) + fn_fetch_default_config + fn_default_config_remote + fn_set_config_vars elif [ "${gamename}" == "Squad" ]; then gamedirname="Squad" array_configs+=( Admins.cfg Bans.cfg License.cfg Server.cfg Rcon.cfg ) @@ -567,12 +579,6 @@ elif [ "${gamename}" == "Stationeers" ]; then fn_fetch_default_config fn_default_config_remote fn_set_config_vars -elif [ "${gamename}" == "San Andreas Multiplayer" ]; then - gamedirname="SanAndreasMultiplayer" - array_configs+=( server.cfg ) - fn_fetch_default_config - fn_default_config_remote - fn_set_config_vars elif [ "${gamename}" == "Sven Co-op" ]; then gamedirname="SvenCoop" array_configs+=( server.cfg ) diff --git a/lgsm/functions/install_server_files.sh b/lgsm/functions/install_server_files.sh index be94748f9..cefaa5a68 100644 --- a/lgsm/functions/install_server_files.sh +++ b/lgsm/functions/install_server_files.sh @@ -37,7 +37,9 @@ fn_install_server_files(){ remote_fileurl="https://files.linuxgsm.com/QuakeWorld/nquake.server.linux.190506.full.tar.bz2"; local_filedir="${tmpdir}"; local_filename="nquake.server.linux.190506.full.tar.bz2"; chmodx="nochmodx" run="norun"; force="noforce"; md5="74405ec030463c5e1175e776ab572d32" elif [ "${shortname}" == "rtcw" ]; then remote_fileurl="https://files.linuxgsm.com/ReturnToCastleWolfenstein/iortcw-1.51c-x86_64-server-linux-20190507.tar.bz2"; local_filedir="${tmpdir}"; local_filename="iortcw-1.51c-x86_64-server-linux-20190507.tar.bz2"; chmodx="nochmodx" run="norun"; force="noforce"; md5="6a3be9700372b228d1187422464e4212" - elif [ "${shortname}" == "sof2" ]; then + elif [ "${shortname}" == "sfc" ]; then + remote_fileurl="https://files.linuxgsm.com/SourceFortsClassic/SFClassic-1.0-RC7-fix.tar.bz2"; local_filedir="${tmpdir}"; local_filename="SFClassic-1.0-RC7-fix.tar.bz2"; chmodx="nochmodx" run="norun"; force="noforce"; md5="e0d4cfd298a8a356053f92b1fa7d1002" + elif [ "${shortname}" == "sof2" ]; then remote_fileurl="https://files.linuxgsm.com/SoldierOfFortune2/sof2gold-1.03.tar.bz2"; local_filedir="${tmpdir}"; local_filename="sof2gold-1.03.tar.bz2"; chmodx="nochmodx" run="norun"; force="noforce"; md5="871b1dc0dafeeace65b198119e8fa200" elif [ "${shortname}" == "ut2k4" ]; then remote_fileurl="https://files.linuxgsm.com/UnrealTournament2004/ut2004-server-3369-2-ultimate-linux.tar.bz2"; local_filedir="${tmpdir}"; local_filename="ut2004-server-3369-2-ultimate-linux.tar.bz2"; chmodx="nochmodx" run="norun"; force="noforce"; md5="67c5e2cd9c2a4b04f163962ee41eff54" @@ -151,7 +153,7 @@ elif [ "${shortname}" == "mta" ]; then elif [ "${shortname}" == "fctr" ]; then update_factorio.sh install_factorio_save.sh -elif [ -z "${appid}" ]||[ "${shortname}" == "ges" ]||[ "${shortname}" == "bd" ]||[ "${shortname}" == "bb" ]||[ "${shortname}" == "ns" ]||[ "${shortname}" == "vs" ]; then +elif [ -z "${appid}" ]||[ "${shortname}" == "ges" ]||[ "${shortname}" == "bd" ]||[ "${shortname}" == "bb" ]||[ "${shortname}" == "ns" ]||[ "${shortname}" == "sfc" ]||[ "${shortname}" == "vs" ]; then if [ "${shortname}" == "ut" ]; then install_eula.sh fi From 9695902f6ab23e78a49719d53da46a4727f8bc32 Mon Sep 17 00:00:00 2001 From: Frisasky Date: Sat, 6 Jul 2019 03:47:34 +0800 Subject: [PATCH 134/534] feat(newserver): The Specialists (#2427) Co-authored-by: Frisa --- .../config-lgsm/tsserver/_default.cfg | 141 ++++++++++++++++++ lgsm/data/serverlist.csv | 1 + lgsm/functions/install_config.sh | 6 + lgsm/functions/install_server_files.sh | 4 +- 4 files changed, 151 insertions(+), 1 deletion(-) create mode 100644 lgsm/config-default/config-lgsm/tsserver/_default.cfg diff --git a/lgsm/config-default/config-lgsm/tsserver/_default.cfg b/lgsm/config-default/config-lgsm/tsserver/_default.cfg new file mode 100644 index 000000000..3f0c63afe --- /dev/null +++ b/lgsm/config-default/config-lgsm/tsserver/_default.cfg @@ -0,0 +1,141 @@ +################################## +######## 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://docs.linuxgsm.com/configuration/start-parameters +ip="0.0.0.0" +port="27015" +clientport="27005" +defaultmap="ts_neobaroque" +maxplayers="32" + +## Server Start Command | https://docs.linuxgsm.com/configuration/start-parameters#additional-parameters +fn_parms(){ +parms="-game ts -strictportbind +ip ${ip} -port ${port} +clientport ${clientport} +map ${defaultmap} +servercfgfile ${servercfg} -maxplayers ${maxplayers} " +} + +#### LinuxGSM Settings #### + +## Notification Alerts +# (on|off) + +# Display IP | https://docs.linuxgsm.com/alerts#display-ip +displayip="" + +# More info | https://docs.linuxgsm.com/alerts#more-info +postalert="off" +postdays="7" +posttarget="https://hastebin.com" + +# Discord Alerts | https://docs.linuxgsm.com/alerts/discord +discordalert="off" +discordwebhook="webhook" + +# Email Alerts | https://docs.linuxgsm.com/alerts/email +emailalert="off" +email="email@example.com" +emailfrom="" + +# IFTTT Alerts | https://docs.linuxgsm.com/alerts/ifttt +iftttalert="off" +ifttttoken="accesstoken" +iftttevent="linuxgsm_alert" + +# Mailgun Email Alerts | https://docs.linuxgsm.com/alerts/mailgun +mailgunalert="off" +mailguntoken="accesstoken" +mailgundomain="example.com" +mailgunemailfrom="alert@example.com" +mailgunemail="email@myemail.com" + +# Pushbullet Alerts | https://docs.linuxgsm.com/alerts/pushbullet +pushbulletalert="off" +pushbullettoken="accesstoken" +channeltag="" + +# Pushover Alerts | https://docs.linuxgsm.com/alerts/pushover +pushoveralert="off" +pushovertoken="accesstoken" + +# Telegram Alerts | https://docs.linuxgsm.com/alerts/telegram +# You can add a custom cURL string eg proxy (useful in Russia) or else in "curlcustomstring". +# like a "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help", if you not need +# any custom string in curl - simple ignore this parameter. +telegramalert="off" +telegramtoken="accesstoken" +telegramchatid="" +curlcustomstring="" + +## Updating | https://docs.linuxgsm.com/commands/update +updateonstart="off" + +## Backup | https://docs.linuxgsm.com/commands/backup +maxbackups="4" +maxbackupdays="30" +stoponbackup="on" + +## Logging | https://docs.linuxgsm.com/features/logging +consolelogging="on" +logdays="7" + +## Monitor | https://docs.linuxgsm.com/commands/monitor +# Query delay time +querydelay="1" + +#### LinuxGSM Advanced Settings #### + +# ANSI Colors +ansi="on" + +# Message Display Time +sleeptime="0.5" + +## SteamCMD Settings +# Server appid +appid="90" +appidmod="cstrike" +# SteamCMD Branch | https://docs.linuxgsm.com/steamcmd/branch +branch="" +# Master Server | https://docs.linuxgsm.com/steamcmd/steam-master-server +steammaster="true" + +## LinuxGSM Server Details +# Do not edit +gamename="The Specialists" +engine="goldsource" +glibc="2.3.4" + +#### Directories #### +# Edit with care + +## Server Specific Directories +systemdir="${serverfiles}/ts" +executabledir="${serverfiles}" +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" +alertlog="${lgsmlogdir}/${servicename}-alert.log" +postdetailslog="${lgsmlogdir}/${servicename}-postdetails.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/data/serverlist.csv b/lgsm/data/serverlist.csv index aa1d2c8c1..f63247e82 100644 --- a/lgsm/data/serverlist.csv +++ b/lgsm/data/serverlist.csv @@ -80,6 +80,7 @@ squad,squadserver,Squad sven,svenserver,Sven Co-op tf2,tf2server,Team Fortress 2 tfc,tfcserver,Team Fortress Classic +ts,tsserver,The Specialists ts3,ts3server,Teamspeak 3 tw,twserver,Teeworlds terraria,terrariaserver,Terraria diff --git a/lgsm/functions/install_config.sh b/lgsm/functions/install_config.sh index a643bb1df..56d8325f3 100644 --- a/lgsm/functions/install_config.sh +++ b/lgsm/functions/install_config.sh @@ -597,6 +597,12 @@ elif [ "${gamename}" == "Team Fortress Classic" ]; then fn_fetch_default_config fn_default_config_remote fn_set_config_vars +elif [ "${gamename}" == "The Specialists" ]; then + gamedirname="TheSpecialists" + array_configs+=( server.cfg ) + fn_fetch_default_config + fn_default_config_remote + fn_set_config_vars elif [ "${gamename}" == "TeamSpeak 3" ]; then gamedirname="TeamSpeak3" array_configs+=( ts3server.ini ) diff --git a/lgsm/functions/install_server_files.sh b/lgsm/functions/install_server_files.sh index cefaa5a68..ba5c7cffb 100644 --- a/lgsm/functions/install_server_files.sh +++ b/lgsm/functions/install_server_files.sh @@ -41,6 +41,8 @@ fn_install_server_files(){ remote_fileurl="https://files.linuxgsm.com/SourceFortsClassic/SFClassic-1.0-RC7-fix.tar.bz2"; local_filedir="${tmpdir}"; local_filename="SFClassic-1.0-RC7-fix.tar.bz2"; chmodx="nochmodx" run="norun"; force="noforce"; md5="e0d4cfd298a8a356053f92b1fa7d1002" elif [ "${shortname}" == "sof2" ]; then remote_fileurl="https://files.linuxgsm.com/SoldierOfFortune2/sof2gold-1.03.tar.bz2"; local_filedir="${tmpdir}"; local_filename="sof2gold-1.03.tar.bz2"; chmodx="nochmodx" run="norun"; force="noforce"; md5="871b1dc0dafeeace65b198119e8fa200" + elif [ "${shortname}" == "ts" ]; then + remote_fileurl="https://files.linuxgsm.com/TheSpecialists/ts-3-linux-final.tar.bz2"; local_filedir="${tmpdir}"; local_filename="ts-3-linux-final.tar.bz2"; chmodx="nochmodx" run="norun"; force="noforce"; md5="38e8a8325339f85a7745117802f940b7" elif [ "${shortname}" == "ut2k4" ]; then remote_fileurl="https://files.linuxgsm.com/UnrealTournament2004/ut2004-server-3369-2-ultimate-linux.tar.bz2"; local_filedir="${tmpdir}"; local_filename="ut2004-server-3369-2-ultimate-linux.tar.bz2"; chmodx="nochmodx" run="norun"; force="noforce"; md5="67c5e2cd9c2a4b04f163962ee41eff54" elif [ "${shortname}" == "ut99" ]; then @@ -153,7 +155,7 @@ elif [ "${shortname}" == "mta" ]; then elif [ "${shortname}" == "fctr" ]; then update_factorio.sh install_factorio_save.sh -elif [ -z "${appid}" ]||[ "${shortname}" == "ges" ]||[ "${shortname}" == "bd" ]||[ "${shortname}" == "bb" ]||[ "${shortname}" == "ns" ]||[ "${shortname}" == "sfc" ]||[ "${shortname}" == "vs" ]; then +elif [ -z "${appid}" ]||[ "${shortname}" == "ges" ]||[ "${shortname}" == "bd" ]||[ "${shortname}" == "bb" ]||[ "${shortname}" == "ns" ]||[ "${shortname}" == "sfc" ]||[ "${shortname}" == "ts" ]||[ "${shortname}" == "vs" ]; then if [ "${shortname}" == "ut" ]; then install_eula.sh fi From 2ebf890721b7042659323629f33b448bcc5f8529 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Wed, 10 Jul 2019 21:50:54 +0100 Subject: [PATCH 135/534] code tidy --- lgsm/functions/install_server_files.sh | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/lgsm/functions/install_server_files.sh b/lgsm/functions/install_server_files.sh index ba5c7cffb..22452582a 100644 --- a/lgsm/functions/install_server_files.sh +++ b/lgsm/functions/install_server_files.sh @@ -39,10 +39,10 @@ fn_install_server_files(){ remote_fileurl="https://files.linuxgsm.com/ReturnToCastleWolfenstein/iortcw-1.51c-x86_64-server-linux-20190507.tar.bz2"; local_filedir="${tmpdir}"; local_filename="iortcw-1.51c-x86_64-server-linux-20190507.tar.bz2"; chmodx="nochmodx" run="norun"; force="noforce"; md5="6a3be9700372b228d1187422464e4212" elif [ "${shortname}" == "sfc" ]; then remote_fileurl="https://files.linuxgsm.com/SourceFortsClassic/SFClassic-1.0-RC7-fix.tar.bz2"; local_filedir="${tmpdir}"; local_filename="SFClassic-1.0-RC7-fix.tar.bz2"; chmodx="nochmodx" run="norun"; force="noforce"; md5="e0d4cfd298a8a356053f92b1fa7d1002" - elif [ "${shortname}" == "sof2" ]; then - remote_fileurl="https://files.linuxgsm.com/SoldierOfFortune2/sof2gold-1.03.tar.bz2"; local_filedir="${tmpdir}"; local_filename="sof2gold-1.03.tar.bz2"; chmodx="nochmodx" run="norun"; force="noforce"; md5="871b1dc0dafeeace65b198119e8fa200" - elif [ "${shortname}" == "ts" ]; then - remote_fileurl="https://files.linuxgsm.com/TheSpecialists/ts-3-linux-final.tar.bz2"; local_filedir="${tmpdir}"; local_filename="ts-3-linux-final.tar.bz2"; chmodx="nochmodx" run="norun"; force="noforce"; md5="38e8a8325339f85a7745117802f940b7" + elif [ "${shortname}" == "sof2" ]; then + remote_fileurl="https://files.linuxgsm.com/SoldierOfFortune2/sof2gold-1.03.tar.bz2"; local_filedir="${tmpdir}"; local_filename="sof2gold-1.03.tar.bz2"; chmodx="nochmodx" run="norun"; force="noforce"; md5="871b1dc0dafeeace65b198119e8fa200" + elif [ "${shortname}" == "ts" ]; then + remote_fileurl="https://files.linuxgsm.com/TheSpecialists/ts-3-linux-final.tar.bz2"; local_filedir="${tmpdir}"; local_filename="ts-3-linux-final.tar.bz2"; chmodx="nochmodx" run="norun"; force="noforce"; md5="38e8a8325339f85a7745117802f940b7" elif [ "${shortname}" == "ut2k4" ]; then remote_fileurl="https://files.linuxgsm.com/UnrealTournament2004/ut2004-server-3369-2-ultimate-linux.tar.bz2"; local_filedir="${tmpdir}"; local_filename="ut2004-server-3369-2-ultimate-linux.tar.bz2"; chmodx="nochmodx" run="norun"; force="noforce"; md5="67c5e2cd9c2a4b04f163962ee41eff54" elif [ "${shortname}" == "ut99" ]; then From 15a5887f804af2005efa6f86bd677f8eee08f3d2 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Wed, 10 Jul 2019 22:09:06 +0100 Subject: [PATCH 136/534] moved pull_request_template.md --- .github/{PULL_REQUEST_TEMPLATE => }/pull_request_template.md | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename .github/{PULL_REQUEST_TEMPLATE => }/pull_request_template.md (100%) diff --git a/.github/PULL_REQUEST_TEMPLATE/pull_request_template.md b/.github/pull_request_template.md similarity index 100% rename from .github/PULL_REQUEST_TEMPLATE/pull_request_template.md rename to .github/pull_request_template.md From 2e6d29237eca55715014e8329e6e07c160734960 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Wed, 10 Jul 2019 22:14:47 +0100 Subject: [PATCH 137/534] fix(btserver): update executable (#2438) --- lgsm/config-default/config-lgsm/btserver/_default.cfg | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lgsm/config-default/config-lgsm/btserver/_default.cfg b/lgsm/config-default/config-lgsm/btserver/_default.cfg index ed8650e16..46f6079a9 100644 --- a/lgsm/config-default/config-lgsm/btserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/btserver/_default.cfg @@ -109,7 +109,7 @@ glibc="2.17" ## Server Specific Directories systemdir="${serverfiles}" executabledir="${systemdir}" -executable="./DedicatedServer" +executable="./Launch_DedicatedServer" servercfg="serversettings.xml" servercfgdefault="serversettings.xml" servercfgdir="${systemdir}" From 2590b5e1cf9d9fd9934ca56db966940a6872aae1 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Wed, 10 Jul 2019 22:17:20 +0100 Subject: [PATCH 138/534] release: v19.9.0 --- linuxgsm.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/linuxgsm.sh b/linuxgsm.sh index 450218cb7..3bebf5771 100755 --- a/linuxgsm.sh +++ b/linuxgsm.sh @@ -20,7 +20,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="v19.8.4" +version="v19.9.0" shortname="core" gameservername="core" rootdir="$(dirname "$(readlink -f "${BASH_SOURCE[0]}")")" From e054678803794cb6d56311a52697f064f71075a0 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Wed, 10 Jul 2019 23:22:28 +0100 Subject: [PATCH 139/534] fix(travis-ci): resolve broken tests (#2440) --- .../config-lgsm/btserver/_default.cfg | 2 +- tests/tests_fctrserver.sh | 9 +++---- tests/tests_jc2server.sh | 24 +++++++++---------- tests/tests_mcserver.sh | 24 +++++++++---------- tests/tests_ts3server.sh | 24 +++++++++---------- 5 files changed, 42 insertions(+), 41 deletions(-) diff --git a/lgsm/config-default/config-lgsm/btserver/_default.cfg b/lgsm/config-default/config-lgsm/btserver/_default.cfg index ed8650e16..46f6079a9 100644 --- a/lgsm/config-default/config-lgsm/btserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/btserver/_default.cfg @@ -109,7 +109,7 @@ glibc="2.17" ## Server Specific Directories systemdir="${serverfiles}" executabledir="${systemdir}" -executable="./DedicatedServer" +executable="./Launch_DedicatedServer" servercfg="serversettings.xml" servercfgdefault="serversettings.xml" servercfgdir="${systemdir}" diff --git a/tests/tests_fctrserver.sh b/tests/tests_fctrserver.sh index de29a27d1..5901a7e29 100644 --- a/tests/tests_fctrserver.sh +++ b/tests/tests_fctrserver.sh @@ -20,8 +20,7 @@ if [ -f ".dev-debug" ]; then set -x fi -travistest="1" -version="v19.6.0" +version="v19.9.0" shortname="fctr" gameservername="fctrserver" rootdir="$(dirname "$(readlink -f "${BASH_SOURCE[0]}")")" @@ -48,6 +47,9 @@ userinput="${1}" if [ ! -v TRAVIS ]; then TRAVIS_BRANCH="develop" TRAVIS_BUILD_DIR="${rootdir}" +else + servicename="travis" + travistest="1" fi ## GitHub Branch Select @@ -381,7 +383,7 @@ else # Enables ANSI colours from core_messages.sh. Can be disabled with ansi=off. fn_ansi_loader # Prevents running of core_exit.sh for Travis-CI. - if [ "${travistest}" != "1" ]; then + if [ -z "${travistest}" ]; then getopt=$1 core_getopt.sh fi @@ -782,7 +784,6 @@ grep functionfile= "${TRAVIS_BUILD_DIR}/dev-debug.log" | sed 's/functionfile=//g echo "" echo "5.0 - Monitor Tests" echo "==================================================================" - echo "" echo "Server IP - Port: ${ip}:${port}" echo "Server IP - Query Port: ${ip}:${queryport}" diff --git a/tests/tests_jc2server.sh b/tests/tests_jc2server.sh index 065c67f18..e0a9cd826 100644 --- a/tests/tests_jc2server.sh +++ b/tests/tests_jc2server.sh @@ -20,8 +20,7 @@ if [ -f ".dev-debug" ]; then set -x fi -travistest="1" -version="v19.6.0" +version="v19.9.0" shortname="jc2" gameservername="jc2server" rootdir="$(dirname "$(readlink -f "${BASH_SOURCE[0]}")")" @@ -48,6 +47,9 @@ userinput="${1}" if [ ! -v TRAVIS ]; then TRAVIS_BRANCH="develop" TRAVIS_BUILD_DIR="${rootdir}" +else + servicename="travis" + travistest="1" fi ## GitHub Branch Select @@ -65,8 +67,6 @@ core_functions.sh(){ # Bootstrap # Fetches the core functions required before passed off to core_dl.sh. - -# Fetches core functions. fn_bootstrap_fetch_file(){ remote_fileurl="${1}" local_filedir="${2}" @@ -281,15 +281,15 @@ if [ "$(whoami)" == "root" ]; then fi fi -# Download the latest serverlist. This is the complete list of all supported servers. -fn_bootstrap_fetch_file_github "lgsm/data" "serverlist.csv" "${datadir}" "nochmodx" "norun" "forcedl" "nomd5" -if [ ! -f "${serverlist}" ]; then - echo "[ FAIL ] serverlist.csv could not be loaded." - exit 1 -fi - # LinuxGSM installer mode. if [ "${shortname}" == "core" ]; then + # Download the latest serverlist. This is the complete list of all supported servers. + fn_bootstrap_fetch_file_github "lgsm/data" "serverlist.csv" "${datadir}" "nochmodx" "norun" "forcedl" "nomd5" + if [ ! -f "${serverlist}" ]; then + echo "[ FAIL ] serverlist.csv could not be loaded." + exit 1 + fi + if [ "${userinput}" == "list" ]||[ "${userinput}" == "l" ]; then { tail -n +2 "${serverlist}" | awk -F "," '{print $2 "\t" $3}' @@ -381,7 +381,7 @@ else # Enables ANSI colours from core_messages.sh. Can be disabled with ansi=off. fn_ansi_loader # Prevents running of core_exit.sh for Travis-CI. - if [ "${travistest}" != "1" ]; then + if [ -z "${travistest}" ]; then getopt=$1 core_getopt.sh fi diff --git a/tests/tests_mcserver.sh b/tests/tests_mcserver.sh index 4be29da73..7853a9690 100644 --- a/tests/tests_mcserver.sh +++ b/tests/tests_mcserver.sh @@ -20,8 +20,7 @@ if [ -f ".dev-debug" ]; then set -x fi -travistest="1" -version="v19.6.0" +version="v19.9.0" shortname="mc" gameservername="mcserver" rootdir="$(dirname "$(readlink -f "${BASH_SOURCE[0]}")")" @@ -48,6 +47,9 @@ userinput="${1}" if [ ! -v TRAVIS ]; then TRAVIS_BRANCH="develop" TRAVIS_BUILD_DIR="${rootdir}" +else + servicename="travis" + travistest="1" fi ## GitHub Branch Select @@ -65,8 +67,6 @@ core_functions.sh(){ # Bootstrap # Fetches the core functions required before passed off to core_dl.sh. - -# Fetches core functions. fn_bootstrap_fetch_file(){ remote_fileurl="${1}" local_filedir="${2}" @@ -281,15 +281,15 @@ if [ "$(whoami)" == "root" ]; then fi fi -# Download the latest serverlist. This is the complete list of all supported servers. -fn_bootstrap_fetch_file_github "lgsm/data" "serverlist.csv" "${datadir}" "nochmodx" "norun" "forcedl" "nomd5" -if [ ! -f "${serverlist}" ]; then - echo "[ FAIL ] serverlist.csv could not be loaded." - exit 1 -fi - # LinuxGSM installer mode. if [ "${shortname}" == "core" ]; then + # Download the latest serverlist. This is the complete list of all supported servers. + fn_bootstrap_fetch_file_github "lgsm/data" "serverlist.csv" "${datadir}" "nochmodx" "norun" "forcedl" "nomd5" + if [ ! -f "${serverlist}" ]; then + echo "[ FAIL ] serverlist.csv could not be loaded." + exit 1 + fi + if [ "${userinput}" == "list" ]||[ "${userinput}" == "l" ]; then { tail -n +2 "${serverlist}" | awk -F "," '{print $2 "\t" $3}' @@ -381,7 +381,7 @@ else # Enables ANSI colours from core_messages.sh. Can be disabled with ansi=off. fn_ansi_loader # Prevents running of core_exit.sh for Travis-CI. - if [ "${travistest}" != "1" ]; then + if [ -z "${travistest}" ]; then getopt=$1 core_getopt.sh fi diff --git a/tests/tests_ts3server.sh b/tests/tests_ts3server.sh index faeb0e616..b6bbd5edc 100644 --- a/tests/tests_ts3server.sh +++ b/tests/tests_ts3server.sh @@ -20,8 +20,7 @@ if [ -f ".dev-debug" ]; then set -x fi -travistest="1" -version="v19.6.0" +version="v19.9.0" shortname="ts3" gameservername="ts3server" rootdir="$(dirname "$(readlink -f "${BASH_SOURCE[0]}")")" @@ -48,6 +47,9 @@ userinput="${1}" if [ ! -v TRAVIS ]; then TRAVIS_BRANCH="develop" TRAVIS_BUILD_DIR="${rootdir}" +else + servicename="travis" + travistest="1" fi ## GitHub Branch Select @@ -65,8 +67,6 @@ core_functions.sh(){ # Bootstrap # Fetches the core functions required before passed off to core_dl.sh. - -# Fetches core functions. fn_bootstrap_fetch_file(){ remote_fileurl="${1}" local_filedir="${2}" @@ -281,15 +281,15 @@ if [ "$(whoami)" == "root" ]; then fi fi -# Download the latest serverlist. This is the complete list of all supported servers. -fn_bootstrap_fetch_file_github "lgsm/data" "serverlist.csv" "${datadir}" "nochmodx" "norun" "forcedl" "nomd5" -if [ ! -f "${serverlist}" ]; then - echo "[ FAIL ] serverlist.csv could not be loaded." - exit 1 -fi - # LinuxGSM installer mode. if [ "${shortname}" == "core" ]; then + # Download the latest serverlist. This is the complete list of all supported servers. + fn_bootstrap_fetch_file_github "lgsm/data" "serverlist.csv" "${datadir}" "nochmodx" "norun" "forcedl" "nomd5" + if [ ! -f "${serverlist}" ]; then + echo "[ FAIL ] serverlist.csv could not be loaded." + exit 1 + fi + if [ "${userinput}" == "list" ]||[ "${userinput}" == "l" ]; then { tail -n +2 "${serverlist}" | awk -F "," '{print $2 "\t" $3}' @@ -381,7 +381,7 @@ else # Enables ANSI colours from core_messages.sh. Can be disabled with ansi=off. fn_ansi_loader # Prevents running of core_exit.sh for Travis-CI. - if [ "${travistest}" != "1" ]; then + if [ -z "${travistest}" ]; then getopt=$1 core_getopt.sh fi From 187d7e7b09f46f170985d7c027ca16ab49aaa088 Mon Sep 17 00:00:00 2001 From: Frisasky Date: Sun, 14 Jul 2019 05:36:41 +0800 Subject: [PATCH 141/534] feat(refactor): remove unused glibc files (#2443) Co-authored-by: Frisa --- lgsm/lib/ubuntu12.04/amd64/libc.so.6 | Bin 1807032 -> 0 bytes lgsm/lib/ubuntu12.04/amd64/libm.so.6 | Bin 1030512 -> 0 bytes lgsm/lib/ubuntu12.04/i386/libc.so.6 | Bin 1730024 -> 0 bytes lgsm/lib/ubuntu12.04/i386/libm.so.6 | Bin 173576 -> 0 bytes lgsm/lib/ubuntu12.04/i386/libpthread.so.0 | Bin 124663 -> 0 bytes lgsm/lib/ubuntu12.04/i386/libstdc++.so.6 | Bin 905712 -> 0 bytes 6 files changed, 0 insertions(+), 0 deletions(-) delete mode 100644 lgsm/lib/ubuntu12.04/amd64/libc.so.6 delete mode 100644 lgsm/lib/ubuntu12.04/amd64/libm.so.6 delete mode 100644 lgsm/lib/ubuntu12.04/i386/libc.so.6 delete mode 100644 lgsm/lib/ubuntu12.04/i386/libm.so.6 delete mode 100644 lgsm/lib/ubuntu12.04/i386/libpthread.so.0 delete mode 100644 lgsm/lib/ubuntu12.04/i386/libstdc++.so.6 diff --git a/lgsm/lib/ubuntu12.04/amd64/libc.so.6 b/lgsm/lib/ubuntu12.04/amd64/libc.so.6 deleted file mode 100644 index c83c7057c810e0a5afd501dd9578bd0a853d29d6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1807032 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

kp~L!b)GmCc`%w`)Wf-DC&Ah); zEqUE7Y=m**8Y0(MdQRe)_VT*Pm)9kQ@>-h_MqX=s#L8=3)Ar5s`f)^0{w2`8=08 z=VzCZwJp%}E@bU{e4f)LYuDNtF)56!J%XOGvR3m!{SnNQ#r`~bobSG@9b@K+m9@81 zczx;x?})FhnM}?m&3UJGAf~|p%ukHrDXa! z5XIoy15x}~?w{=&Gl;01&uk}u>lv^-ld0y#Fqsp0aAtRQ(?3T1ep%-Ma2CR{Z%{_8^~zIrWtbt)Wj_ zwjJw?@O6?hSx5lFMW!5Qx|Nbpihf1ZA7N{lvMcR#cwK`tp_y_38qC z;;n^<3gze7$j^mg?+HFL8in#Rc3)lU%|h9EYN71>3ms%-=XlEV)8%KldyUl>RlKnBT};iBl^+wfSnr=b`x!iBB_rt4<8WXM|`4^8f5`AU|n^4l2{_ zX9s*?q0bj`hA;eF^3yeZA&2}t(3?kAbm_0|+=(B^zKCQcu=x%GUHr4k{}JzhoM^(l)K8i$=BU6Vv zw=ZyJuZnbC$u?|nCm}cv?129n>H>w6RW@mP_n;CG)Ap)a{KFG5Pu0ax@+f|B9`z z^P2p+=596f{g2^>dHD{aXKc4PiAq|P`+Xb!Oycn0z8_C~9Y^NuL#C0g&EBVmDA6Dm zhK(uT?>U_l&7Qy!F?VV`F&i0@FQ@Y0Bz7lf|Cj{)=1>#H@vwcj#5Ya$7MR@lE`NEi z+x3i&yo1uQsAH_@?otg7+XpcYcFwrlaK(-Nm)m}Ug=U7VXl&^^u9s{IT_Y!U;((!| zho2+tjLbQIk;#Si@WQZ;6J^E>S&@l^V<*J7^^EP7YR=8K`QT3toDIf^f0DMm32dtn znJO5J0MYIU^aTzfaWg{C`QIa`>_uHyT=|JJ;{am1>AkML4HDrf3%)*s{3OZ?a)Tg% zL%dPI&TRR}g44oUfyannacbB}4y51a(AZFpLj?49Q@G-sj;&7e5WY(mcY?8c_>H8M z2IOP&ai0PKk}5i6>CM*5lE2XIR+@eG5e5erlIhOk zpAUrLBwnL<+^aqO$%sYws44!GHws>YPCN5~y*C`@S&v};++D1=c z70$XpOxuuD}%mDyh0M+In@5tRv6?|bN{BGww!yetK38-$Cq(A zfs=Twp!_LF*lw@u94%g7OFij9hTcWsvHjb%VFQ@*XUr~>SFS$RAm{#Se!NFWhdzGd z5@X&Hkb^VYeVycECGC0%tnb!xGVCCYoz6qza$~Jh@`qZ(vA6Z%+-^QS1GaT$Ux9`0C-`NU|H76UH(b)N zzPj;i6p)JDLm{5}r93Kefs(Vv;TzOfR4Q8CeNQ4(WDN_5?eEj}Y5 zs6iD((oaa+q1FdXlI7bOgFYvIy2?Cg<^0aI%F*N1qxVFQ|ju!A<~7*ccWmP z02a99z!E=h>YavOlJ`Qwllf7~AodBTTb%iyW3>QKn;!IdreOs(pRUfd$rKU1-1K8! z$gUjg((yb7SzptKzOBqTH%_Gn_{k5u`z}YeA04Tv#cc6q!z9S25Kq<=j+}T7hwhUP zcQ@@jrzp&f{IEX!Hb_@xPqnTh_@9)arsewBeKDL>cTsIobe74SrpaZZQb9oM6{_*L zH`I>wagWD0UCev&xMlLID5?&& zu?wCl`lTgNJmQuuF#UtQ^p>CPrH0IB0X>wbNPK;Hz1dfvjT?n97r~sOt4@_C%GEx$ zG2@oVBUH8Q$%*HfNbXh+4ckbbyx3-jN=P_2-D*}M#lLNU7X`g|ISch}=-gMMqw>q` z1c=QT+n~B4B2|g|2~EucmMwnVZhV|+vZq>lTxv$s7?@L@ca#6Uy0LXc1gp)=e|8Op zGsJZMP zRO&-Q4t_8wn68=+RZyGbN>!!OaBlZNZi`P;9N(~&O2!VyV@Ac~aBQy}pzj1J$XT=S z#B(}@8(t;lIYk|q%Q-WR0~cqlecZVeq`xUzq~Q14nYLsE<3zq9Acy8BRe~I5VFY5yZE>;@t8mPiRIk(!Rul9}R~YXpn9ir#R_b z?Bs;zXI{pK`P4Jik9j@!+@V8J)8-e>E2N*K8cUxj;frg!1w9-NO- zEOBb>frVi(>P>7A}7l-uyzx`EW4JB&(4IEe>(s{5Fa(o5?y{zzqRDP2L`xF-q9byFynL@Cc6 zfVaf@%z3SYoq2b^axW3oc2+W=7EP!@*6a*K6*`Wx9DLUHAN0Hw6NJeHUFq<3ZCChDS5w=z)*jl^%=2j&25_cGI6k z);gea9}n^cE~Tg(l@)6xlbm`MF?C1bXr-vfc-+NokL@kFRE`U*ZK{!xF_qgVeZ)lU z+k5cR#8>y~Gk=5AbzhBjX5Q9|rf1Fz*UHT^&Sq*sphsXYwPh?H&nb0lGv}Fy(N>=2 zF9jNG$0YUa;PeHr(3YL<2EvCI*SF#8cBgxR1`n*+Fm{J~frc2W!PT)D+U)s%!J$HB z%~xY_%5RB>@#QWFk&bhlC7r}w8U=2dF*Shz)bPlLn&9h{+kv1 zbYK}SMtvr?y|*)CDZ;%b^P}ERi8Gb0gt@8zMz}Ap7xNIMxGDP^9r=0L3)(x4k*N8I2o12YR80oY}`< zZF~&_-jHyQ*hciq^4J{jaY9Xgc3^CNOcRrz{l>9JlVA2^DK1m<*>wQQ5Z_cD-`;in zra|Sgr@c`ouSV)A{ph-Ie9+?)oa9lo&zXH?2gHOc4=Z{Y(zdXnhst}9f}Yr0G5!5` zW?wZL(RF;%rf{{d`sj39;p*pt(vs}v+r^Z!ZHpgq=n|AU_@GgVe!y{{Xyp=TS|`Q{ zQKB_|$ce9mW44V4ju*}j$GvhaoxmmKhTS;O`XHKG(|@^_-fHzbtEeSUBuDg^QO=A9 z@jK!5F&M*-}o+^&c-9ZYusGwS9dN=YF{Q_rP=?SChqXk=PP7n8J_yP9d#nKx& z$P;{wZOHX(TR-Q+u>!|FAx=D79^VGLlj~=HO|VLl(nYi4+4C?$WcJD)j`=a&?M8EQ z^*#FdDL5i?YC%oea#_U!+3!y>?a550eyr;eF`s3|LSm4G<1Rsg?_d@M z_dAGpUC4GPuBGRE<%VBuPlf$Zb&cJqrfga6IBQp^AGut$ls}*u#}J-zzm8{%bR`nV zFhg^8#yg3Ph&g(s9#g@5ZTbF?eqvYnZS$>$Z&;qoBXR7~e+G42Cdy-Y07%9>ZXfK_wePc6*2>w?_;7vKXjn4 ze9!q@=Me33JGlfpkXG8?&0L8j>i*nllWL|?VLgTIa<(5ES)4>B3Cz{0$wgCTNahQq zjqi0#uaM-{E###4uDp9wcp5-GbvT8{jX&?$7hq{eb` zS@#}>xx)A6Xi6X&xR}lo9*W+G*lJEm>juNujcG$tz9c*NR-iG}id~0{!nF}1q{MwW z>vpwTP40pItGojdB!*M@I`FQwLMf5xx+O+GOnp+5+LHZhy~c*a`F;v6zEy`APA08y zh7ez(n{rk3UV?-`WQ~WcJao!o(vUy5+XJdCf*-Gib*bmju2s^I-1$)Oo$!PDR2Bxv z>9{3O<2%_`Z_`v*?{>7~LrK9;pCi`#!$AmpQIFjW{`aq>605mDKj^0{uu+|IDx=;Bl*`y;C0OM-*Z1dVqs2}G%KNiKKY(-Tg zQMD9yW{zeO$lgCgS3uNc+-z;?*+~4|lj}z|N19tYvC$PBiS_p^EdUtUayN5rYvi$$ zF+HO9Sju2a9pV}rYS_o<^w2dc<^^4}l^(xgTPXGkt19cPV0?F>@rYmfam2a18Ts|u zSTempdTi!ttJ#d)obCM~Ex!kfL7y^)m)EJAJLgS15&9S&dm8n|rNcZ#T*#ZeNu$-m zR+(7>)~)ciF+HR)h*r?*9^Jg^ z=)a~Pvn!YYv4bt?qem4`f88vKR!)ZO&Ga)f&6yd7Pa8hFMK*@M7$j-<)-^`qGY%s+ zP=awwhG(eHSuWy~&R&M8`B+!Ee*A8tqP=+1J&q`+K+n0yF&f@@9XC6@$nqk(@2j#~ zB&U&+S@BDN@1SPZja*Py#s=!W@+xYsvDE??9H)?2VMJ1cUHM^tRdr~p2ei7fk zdeRv|n)s4x@2tZ9j&G;CZGO&-69{Q5g%f$NvNs-7JU7$k7kS$1ObU+3p_k%B*4E;3b9wf&b?}HAatsqEhP=OR zBzNf`b*YzZZmqsH%JGX55eL zv66Tc%fL01x@)JbR zFfnWCQYwQz10p8(l# zn0IrLXt8B)XU1P?w}4JFdx=N;<6tt~6gByW@?OiGgz**>wxZ*mn>MR3k@1H-$aEkS70XIEeDjA`4PG=>gA-*nSP0C7=OkwtW)BVO&ocW- ze40~2mUU&@s8LcQZA`gdiUo#~oG9j$Y^_Ocn|z>T37w?1duB+OH@T71BApL-{Y5Ps zOX|>0_6q_=D8Q>k@Ms7UX{v{o%vQlzV?urT1L{1Ej~Z?cLtLszbY!zT-!=iwt!xQ?d|4-OV%~|Gb%OV@R7}+sBj`+zED+CDvA{}QD}b+nF7t=!bm?3TTT-^`=7yD&@H+jM&$ed%2&&ARNi(zV3TkMSSX zveZ&B6Z``*=iJQCi`>i;rQ3)#w~YVHHUevtj@c8zU}&}|$ShDAPb_nFJ(yFw(0kep zZX4AHUHpRd_qqB3b0 zWOLK#*?tfBS}&7T{z7Lw3}4i3NErCIoF>fFbQm9e({^-jD(1;dQivWe)T}b(i@S2A znWV>zU(Yq6PGU3}6i!rgcc}LxzM2t_Q@436V`#ZX{IvJ^9?wCABHXDx*5{_$qc$+dS;3bET<7}%*J_mBI$`apFhbRKB(iKu|$%k;XsM{i7bnVs-tk#$t8Qb1X@_QC9ZD&+seJl=oBI zw_taVT|M>44*PnhlMec~$@DIpX{pV$W;vM-XGF5UBvZ=#xeYG1!S636cy9$?XM-=W z!5{q6ROuvDX``xij)K$08?Va)mAnXpA`{*Pe1DbiTG@IB_kt5H55!Yq7X4Zgs07CtOXVWwS#`yWPBOL@JqKYK(t)E!ei5?G z?9auzBL&YRQ2e}tZ9Yesg7?ft(BT)nINFWLF`9bEWGYa=@kEK$R#$9tl4~f@X1lx1 zZ{i-U4TtFJ0M%g-nYA`>tFjl4hF|2v)okJ}38%c=lc|rr->VTzn_KzIG2^@crn~9O zLuZ-cylp1Ev4t9EZ~d6Aw(-2tL?-H38?}WvjQstI3UDBl9Zl5!Gz9~wHyI{M)LI+$ zB^&k6ih7o)ph{7jypHfKtC!;P26Mygw*y$btO0Ak0WUXodk68mHptu`)S*+izW~#4 zZrP7o8$o6vb0+GyK;{Op-%5%dA#;P`ZIHPzrCG?_VPi3ZEnTP&?ICl>x^IQd9dL(M zKQ*SBAt-qAQgCye7cIW+KyY*HaO@gt*XCbGamNxj_loVW06%xS(blBP@K=I1hB*Qp z-B{pis-=_oJ>Qwf7cg|zUQ~SX&rU$jv;paE)OT=n|H$`R0gkRz^zoZfvv$JI9Y?;x z&)GX=q32!T=eB|^3=YleBCJ}W=)yGLNqmi%_vG{?m=Asvh;|UFvhZ|MH*IG+diN7^ z6!_%-Kj7&OybAjHe-ux5LsE0<{}P_A=Xb!8C4Suh4o^3OBJy}Tm4_{`8a&-;JjzI_tV_t+ z;OT_u`)}}c@1l>>z8&y%)d8OFdCK@-!qXjcpc%n-c)Itk5;#^wzk3-EL!RWF05 z`-@s+@pOik0zBQL`LxN`7)k{D5LpxYX)|Na9q?uTES~O=1C+y)qamXLrQ1U4D!vn> zP88@v>MC{tspEFQu5POt$1;fUDE(Jm|f(XTp;TaCNm%pKx^x`Nbe4F=~Nz6&6^h zIa&a$YuoQ6lLGvsGwmVrS9wwFOc2La0lsdW|2>bd`w*-4F7b6E7}4iCl8F@ z5nwlpiU?p=%`EyheBGZczD`8?yKlhP4M&@y6WihIqI@gB*S&`MwGChQIC`eR*X@aY zP0igAU&js;m~UuF%;$d#Usv5DzuUYkeBIprsFbWKB0pc{2{nQn_ZiN$0lw~QM#X$% zF`f~@5BBkOb%ppkW#gx8rIq=dnWfW*XqN5@UpGKyV>MRd0AF|GzI?0FsT${&8lEk} zu0jQKQx)vNAnd+xY7ZhzIbf`rxf>twj%W~e6#>F-g6uUDmGs*Xb`!+ACz6px*ga9& z$fFke(#9jHx6%JcSo1`r>;*S-z?Hipa#@yD>%U>LOAKK%P=*a+j?JAI?1!g+4kAt) z);H|_4KTa=zAg&YhX0Mm3eIk0Y-DZn{n$sf{onU-cBHL3iL`QgxC6{?n1R_{!{(mx zhnR=ibvA@&V0LX8%O*Zd6Kj~o*;Q*>4?uV);8tc{5h6fA*^1?%;M}W(Ps!Exqw=_BV~y*I6FIxPU1vZ znZ?=t8iAnYrW<77y$=#H(tjRthbiKZ_GI5U5(m-v@}?&@K82K`S4 z`h$Wd=of3d!Q53C%-vC@6D;OV_hW#$!+)cXy1V81MiLYN?>>M>Ot{3&T*uyUd*I#G z$P@#-yNrhbcvs!O$*$wR9er0_h`w_xzclE(iUG1-tJCy1IDN}kjr=+@H{}6%+_8vR zwib9)1V}+`+1CP)4GRExV})y~%;WEd+OZP;?(SEV(=H%*`vmfG7dX6b4Lt`BOnj!4 zZBV?|MVcejgF}2MUUhZ_D}%w62~%5(#)HJ50w0Yxb&Msj#QRuA&4#CFh=0RS7{<~} zQ#k?hY=fs1=MJ5f$KyR=LL(V02*%uR-v!J27s)F$+^V7eM8xO#Ts?869(-h;VS~Fs z=9%x?2RJj1fN((O4R{Jp)`rZR;3M;Jjl4aNZ9D&dco{tiM|) z>|21;d)m;I1?$Duwc+$83a2-r9Zqjd8%}R;;q(?`VgoP5%~xy|7vl3y0@48^JLoI3 z*ho*-PgQSzEI#iG&X(u(p#Xo!lrXSm&}R*H6Vd8RK{(%s^WEa}KESALHbzB~PU>}D zjjH$!_&jyzj`%!%a}vK*M$MZnK5v%E^_%c{*AnXE^V;%j!{^!j>P>zYpBKqzw-Y|^ zFa@;%^WMj(?*sFO1;D%!Z7U?Yrn(0Wr3+plru2H9QRq*1XoDh9mI6dxuztD#xbuZq zi(?r?o?SkPmzUFSc&9<+ZH7-9MBa8(<~BrLZxCgcUgWjp+wgejLj?5w2*m9kc`V-L zRMTrEYa5d2LnQA+>RX8I8bXsoUX-spVq4`Ti9SZ$cXm&kBC;b_T57SW$zJ_gjm@yFS9&A~T@!1|~FyE;?+DS+Zx#xn;oO z@JgKIub=^GuK^D4RGX@^Qekvu04)yh%NHyTuOyGd6MSWiwD$7dw7JmaBy^{kJ{-;m z?@Y~sO!rT#O)chKzhf=_M27iV^dNG8#8VC%y9$YSzFh@5i4Ft{iPu8Qs4RY;{15-& z7rkoKtk`v;gJgoSEx_V6@G8Sag>+J3@i;=jfAFFsf)JYMWAQ4yXN3;(l^ZnJR~k+G zEgY|j9J~YQZ`Oben0L0;Kn9K%f$6(*p7ocjW&`$7=B1nYn@aWSG>q~;Rk6k5@kAy7 zf-0)LnedmuJ_*D{JsnZNAlY%(oK)unH5`JZRN6TJUmpSs|?cYN${VYJ^tu(r~bdPEo=~?(1 z=-P<7)T;)S*8%nr1x}bpZ+ZNMT|QdTc}GnSfwrr0YL%vHqe#g0B>fm4tf$Ofzlv%gTh!H^!}gp0EPmrF z*5U%|9Yf2!(w)G1e>T(6>SqF6l_+Zgu5=_z)z_G!wx7wXbo_4tT&bZ3sd5Vs0pLo* zyDPwz{r)BWdmI%sI^7O{s{uaX$~2Z0hkm~Wa5d4p44E6>zGV{lOdDHJtMljxLEBVb zb$mOs-iA3dst5@tG!U;gsFkATZWqq&X)6>9a8{-g;H)_Mu_Ml^Jp1%d{n;PP{F<@= zXQgzx`}6&&d0WCK7gVG?zB)4xkj}yR33XxsjNF%R+6M%tGea(~BG0Hk0!HRJQS8v2 zfsy6eW2s1xnTWI8utLN2oS7GqlaYP~8_CJd9kG#XDP)(}$o~o#IfYydF0zx_*&JqDoCb$@+{(C}Nkm$YJPGAQ`tzI-vj$sZ1~e zGw=ovDLUOH9&#Wt{LU6L5XkY^ok5P}+2=0XX}|-Jql(JQ5#PUAo(`#4f%uumbd`Y( z53t}%b_I!y6Qd4NnXZw^6G@(Wy<-VCSiB?{AMpt{^K>v@EM)H*VeCpk9(^-X&(zo; z^~Sg$_4K+UQm>zKc@q(2&9ofqoH0ZK$%yEKq1GC+=1dna_|XYyD_a66M6#0!yOfIg z_Oi{u_5K~(BmZjbsO|B3+LrH)B7&+?Q;JiRODG8gt@jgt4NPw+nSLWo?>Npd!|}k; z9qY_^2|^KcXXefD$6(Hzol;|F;6CPz`@CR!#zP|WB^zdB11-hOpf;GEI%a2>-ZU9z zq@PXZ;eQ0v8{@Wz>CFdH;9Uje4bvv*#5389H-Nq4L|M|qW@_~u=;M~zPvp~_5D|6& z>s5H84OkES594CMdi{_kfnFrco?YR$hwa&K4QmP)@Vhd91U4M6Me;@Xy?#63_eM%m z?ajv;Wc8T-t1#N(fKFtaH=uf7qwW1i?A|>nqdwMecPz&i#`l^t^DeQQv|aJn$Y>TI z`7~Uf7Oa*^<&m7J|334T8sV z*4iXeUKc>@`kxe_b=$buO+!AV>TKr85i_ISd#MySEo_~)G=99Mwj8zCGYNI!A% zJT)An7(Tc!OF$mnS7N|@U-wfbZYx!g+0QHl_i5Q21xpR9ABHjkxDQEX{@d#9#~95c zQRpeHAcLxcI>yPoh6AvEFp&-HtyI3lnz3sqFV28l@KCk)j3!5>dtc8OzJ7V7F?`*1KPyxN&g>2IqM{-$cqaA6Z<*p!_!KwYm z=JJ3I-opkj`8~k~Vm8qRCvEUYBxCI{N2v{bZn%Qe#aqs3gZ=%9F`>M(ZHjp|MKP!D zEnKgks%7MFy7(EAX_Y;`1=nfGRe>l>{N_D4;Xn(&+ui2VVDmXZB^wadd(WBHZ}`x( z{#+Zp_;P{`oNJK{e!&KxV1xJh9l-|8_@IK*#U~Zi`yZ?kfNGto^>n8DZ8qU{GNi%x z+)F}(sT*VSZLq;>Z14%{bOVE|x54My;3gYkak!baz2Qg&ThA8nX?K#_{J0pll>oy|OP>9}^w4oOw{z45!;$sb`^in* z!uwu(_}`EK{+D`(^lk7z*GY`$is@G5>RuICyn&kF9hNri0$QaHOYuYE~D2vZW_p@d7;GMJ{R-E>F0( zIW+EuU83sl`w19c)kAZ{omR0r(D&}1>P@3cWv|uH{OLGyeF+6yuJ{v^@I12^@FFY zrD1Bvj5JK`c=JYl*oy0(Fb7qk!j8RYWEWqpiulT=vgaV9%413)J zt#&cmp({_M`A)JcZ8G3K0DC>*8{f_Uoi6^!EW0I_!;1scTOp@sDLf8YmiI92sG+wy+! zlNVi02(||s_ek&IkpMogww0gI$s|4ecyMA z;yo(H)TcU+(+m9H9R@Ed!08R5XN1#R$JiTh(W`inlGS(hrf6y)F7Pxv3y^v{;`7XX zB0FI7Zbk*RxV$f%nRoiQyhWlSa|`4Ki?6CcLyc! z)#!~cw_kH6_cr%Px5z{!JO5G z$GcIc68XD(od-1(Jl;TKjD#wsCd&YP1g9#0JA zY+;Y&?`|B}7QG!HrcZJET zRXKj*0F(EqzE%B+>FV54wV(Q|!0X-5$jM;xiU`r>i;+s1Egu|OnT0!li^77Hm$415iUZ!b$Ay1MzTx$Kft* zq^b{%6*_ZE>0_b@-FSl~S(~W%smLA<6hrH=-qFkz(Eq%iWuBh@}6Z-5LfAZ}M# z?A-_Ts^V=XGvV}bu-2MgsgK%OCnG2MrI<3PJiOnv070_@=_D=_Ymc|!{Vr=JqKfb{ z;?9}+%(cpjtsq+i8sr*G-Xovc8X4rjYMzNL4rQmf0WuF&LSHezsC~O|h^NnW80Rw) z;G=b^muXJl_Sn2<1yKzPn^*139H$q9&Eqf~$_;2nGSFY3=LFciz6P6jcpjD)&GdR5 zc^}~NcJPKLP~Pxef$}goz(qLMbO#T{0`-k}ynTFcc!nQghiX-|tQ#zg$Lm{-LHZSS znEs60IA`XCw5UEaI9wyI9_T3bx`U~%bXX1kSilw3l;PO{un?CB80YFE>MGy$eNe>C zGK9oUq&UQTek>b#(XF4E-9fg@v+maSa{IRF3&P`NtzW#X?nbVBc6`@{9{9!k%=e2| z7k>A;Hzg^C8IsET#XI%Fo&DlLaKxmpl$nzVHGJUf>rGHrCf@tYg(dPI4(kX*l*#B3gf6&hWckfbY!r?bY~Yp+_@U zRO724^-gMKUFL2>BlY-wd3h64hq(z%AF9D&O$}D)yi+_ZUlR_AWPa3|>pW_fUiRkx zDki?pnERgbR&HGxd*8Uj17YX8)4;ijFn1L=#q-u6q%HnxSNOWCExztubK(4egU&Oi zj5+6`)?5E~b9Rld(;F$PUn zg3hP!c7gME(U*MwMzPHrIGr4Lw881lg6#eiknVoWSJJ|g7m)|r8ZPZtu^-?K;niqo zR}f*;Ebq^zaXUJ$D-m|+zro4<1n%(-IJu`*f3MA5-QCQ{xz+SnFzPjB&qC}kujK|2 zdGchaGzXmN`>GG-pb_a0q}+0OtHWnq#tj_SHRm1Hb%sX=NVyt0tmE=p>o(ES&^?F_ z<1tcPzglp)qY80yza@BAI5|_1#KnZ}jFWryzre})$hUgA3pDE!PXIK7A87Te3|Q_< z@5?sOoR!jEmH}#)RP)U%QBwKt_?UrI^yEDbTfv+AnjG)iDaT(F z=J-2Xtvo#M0h?;HQn6tQ7q;-c3rJ+BJb>r*6FhIUaRapuF15P&gLOSa-bj-j;;p;U zmf5MT0jgGjm>aGI2s-UU37r{g(Svdxu=-qw-+5-P_p0wQP|#*iK<`+mt07zXht&SMpS1!DgaG zfmR+Tdu-tM?d{XVc4Qg>W9AnmjF}$WFlHveXOt4Cshn~SZ^3_`!I+&D9r>d1{1#0& z1Q;{bUXGdE%GY%Aq^~n$923)^&N5YdQw@R5Ovz+u{4wJc@l2}YjZr-71I{gkn+*YO z*3h#JWCnb$HQVjEA{OEXUA7K<5a$_?uP6iY%_o;F;4bWHI4#X{X7*)3<1MIOz1V^? zScX+}W9BD2xg3gbJK0Gb!w}o;PT6Mz*=x2t)zjJqM3H1}uo1X0djen+Z3L>H46#CC zf-9Jf&ip3ec@qAzC!EQ{E;a$J!;)jAeJwU#g%(mYeJHO&Yyi?%quaq1)?`0oQ`Q?T z5(6}*!j0=Uqsf9?xs&!eGmlhr(Q|SAhU&D@x#=)IXhAQ8({P#@d4@g;T)$ZzL$2T6 zsY|VCbNwccaMmf(;>pQ0G4J|~E=`b4z3!6TD4n8jJ9tw)ZnU+jxlr{;Eif7#>pi@` zt+3wTte#Ofp zu#B-=|W5G08+0^Wy0S6VFdqew&x zL6Nsdcg|ejglDkKLnJ9O4@)L^6$Eh3rKvWxG7?`0-gH5v`3vg|ve`+#2ZKkCfO!=y z#TR5y6{&7xA;v+7A&#SRk-4$MF73jMjmD?6_XOFEn^75!%4Ko{i879^$5JPQ$3}I} z$WJsJ**b-l!FZJXnbY!I6|#(~p^N;5D&VnbChVQvya>*N)rYg!ol#%5 z7KY?6U+cr~N8>9(-X+3k`1Lc)(c4#)7}Q@ZCPSmUlJRO0uxV9xzSYS?Egku_k z!q_NuQ+ASi-7wUyE*}2|l{tjG@;I!~^i^GEw4A&x8XNg1^C$$|%s9DR49E;Bg!JGm z6o-9ZzTTEw(-%{sFNx&v4V~(1_vQDs0_^K{eL=ra%OlTgyy{XAm;h&F)bJ10s10zo z*Z|Hj=uw?!?+QpTn38$Kk`$FS*?%_|g}jbTZ?l-{hf0K6ga@YEL9Yf$^1w5*;?zvZ z4nL8ceXEz5s@|m}(7XhACjOmgEkpTEV@h2Lew8ku+7wJq*~=-~rd>k$k+~biKn&Ym z2N2Hk=f9JH)tk?l41b=gPnjb!9jjqXcPOT>feQTObEPl|SaO`V$ZRm)ahkD2Oyb9a zDx5!>?a2xoJi!JZJc(d~z1jQ+6TGht{;>_-UFQT1;Ay1|ZdqtDKhXw1(MYfXbUaRQ zWbP>V^gL6=y;Mc~ecR}}+vwe=65W7p;x@NOZ14u!kDd0+pA&4LI+qfRZ@vt3n@n!9 zv6k3aGx)LKs*{K%W!l>$W{~NAp^bNsjdzXW85q^xwy=|J@Dv;Ti-`mqAlTN2wg*7J zAr|O|&PKLa47{bLr;B533VjA{xAA}P-I*-ta zeds+w6sq~;0@H&MKW#BYj^vlEo&0^B5;SR0*KhLo^>^z2WwWXK zKwI}ib==D!zW)9oL-Db98`%fdZuX&rmNd0t=0-o;$3mCrA6)63*K{lr2!|}2HbF}>HI+=@1ZC( z*-zNpXB&4ZQTDM>&a+Xv@?$Y^FA;^{ZB3>NDs1p2>H>rKddvo|w!!<_;O0{ZHsG{h zC^!IM+CB;F^xi`1CNSZ4Et8wPSK#vjYV{2|#Ye5GXXKJ{AFNqY_!MONs}Qw10UkgW z&qJiFLE4xEs}b*Tb!n#i3ATpgsTz~+Va)>rM*QgarhUC_@Gu)ZS0@Aw_-=)Q)5Vt` z(l!+yfuMJR&pLihfX^E0=C7=*$aUiUJpR3OH>LYb;}`pm`#9sS&<(m?#{He%-yL*O z?CpvL@??1Us-B^k2q9MFriMeOiz?0^zOXJ+d~+AsQ?!s+-hb7n&Ym?a#X7}lSLFqz zeT`?`9u3P5ZEZa{#Imw!%EL&wQ0z(eZMvDjZn-}f-oW}ls-G~G$FBT_`mOI=P`^)X z{YKsB*Uuazpnm2%8(VcahBw=Vt@zz=4_e^Lk4Q+8+3or)lI@^R_!XwQ*(;gK%yvRu zm&I<@K3Nx&RTu9D;ubWhpgn!RbAQM7US0g;3W%YgxBJ@O-rsLcZ}oQeo~gDSy&GP{ z*ods_Lg$83MWrZWB~zcJ>P=LwsOy5*U*9^SH23JNSws6bA`x#Y}QTl*4<2ZU-N#OdGEjFnLR^2LUUx?bc)@o5GD*~T8rwnEtFbH zY^8D%r|@M`x7N6cit?`umM4PhEbl$$vgk)#a{vdrYO- z+5)o>%|MZ}TpD~Yl@3a~n~aeOj~8T|drB z#{BNF#)EAhaLj@9+mSz4+Dp^@=%J}R2F>`#_dtrK`sE(Z55})d?q&j1m<-=x@XcV9 znb(&@Y{f_N><`Al=JRE?u*CIy4a!EH+d>4126Wn^5f~%kGfNIU9 zqO_ZC9LBHyM5NXFmMI>o=)AhTW_KeK(vED)I=gjGeQG~29ThEIoG=xsDm4W@VKQ7= zJd$$tx3u_j|H)1F$VPtOIrI$d1pmADL(1vBLZsdL22~RE(=K|bgEtTiN&z1D>~x>` z*c(D~PU1gznw3^>tTB2Z-fQo`97cGRjZ~16w+X_`>}F| zz<+Aq&fx9*g_53y?Q!E9kb14Lz0<|Fkv!Q%aq&ex&i5Wi#YKK*s@9&^Gn9RRHyGP( zP0s8l6V3tAiKSh#b@O+p?L4IxW*doUM7RA0GCrYG^(qgpGW+u zi}dV0LVSXk7X-gu5d4)5{!>BljDp~GTJLA7(gnf4D+ul{s86P9OhIsCLGVf&Twf5} zzaaQ~!aQZFjw%TLUP16MS->(?PC@V?1;M`}*q4#W$M=P?+-ffvHn(X{-LQ=28#KW2 zGKo5~53fzIaQ_Wcm~FMFKv#2kjx>ICw3GNN!!{po&4TWuY^K+4)?oPr;TV+pG^#kH+qYV(ui4B1^6vJK9M;$*lJ6fz9Yi;Xy~o zJ{O|08!_C}bGc$E^4+Zxb*z#!Y;r4CJBba-nse%9Y-zV}LG=NOZ(tw7rADyfwjRwT z;7f{1kB+i-j%JE_u`fFQVx8to-b$gm_el<;ZZDyBb!C`LGrjeciFF9O#ikkT9;nq$ z9Wl3L|9;okLZ7&4lfq4#=uTo4dDWL~h=!MNYfm)1$knO-53`?NjE0}Ny_zhSsIX1K zd|_lsZRqIw%w=Kkrx1d*uMaxPNxmV_Wl zQrrwUK&6^e$BnPu9G@ow=;fx875q9gU!yT@YROy_Izvab2isnFUf<*M42jUSiVU)4 z34Mf@44TSzq(3s*b!Bv^?RNHny0}wYl$kSA;@wUEf3&>|d{ou7_&<{e1O!i1Xt7p} zHCiG*5(Om!n!yR2(TP&=fv?uyprzF+l^H;*5IQp^r^i8RrP^MtTyI;k*4J%`=ruTr zLI7I@tcp+2TAgEjASeVx^82oJ&Y4F*d+-1E|K;<6IcJ~!Tzl>H+H0?^Rp=Q2IdGtp zV+Nnket2%akiAT+_p(}Rv+Ev_kJ@Ow#MfpS52A)#1hiy6yn1_C``kRMFomK;YMyaw z$U#kezNR%*Q%j9nYp5O8PO}aDr~B)ov*qi2}|~f#6eux7h>l zRD=aBxm|-6ofqisBEgM-bH2dYow?kUF;_ATjzy&`4VuZGKo!ni?jW1^oq0LGB#)_}kWfJcnpV$@U-fFU;E2M|7di=nEv0}(z+2%=FlDgVhaSpfm z9iP}4o%2)gQ|!9Vw+5Jl2m+mg`IB=aX*!MpSXBhD~yfreCt5>Q?{D0dH@u5!zj^uLai z(3wSYg-hqh1BmjihZ-=j77Etgeik27US46BY%UUu9Y z*P$b+`V~8c?bo{3pmj>G*#$MNkCgt86i0y&e&`hwTW&lG5s@A|9gNt=ZlY}bCE4V~ zbFK_ez++m*2I5CaLS;xhY+5BSbG8k(6u1;?{ZLIEH=XKvPUTkgr@D-352@BG9_mGt zl-rlJcB`bNJ`me)RgglMSuHZrps1TbAlUQo`8fcPQvqW0*&^Y69=p8d^g!&A6(<0N z>~|U%JF@kqEpvl`_}Mtr%nG&4g^vvDIXk!i(sBcI@Jy4vYeKD=^{>W1VodBG#J=Xz zS?RQv-|oI6@ObuEjNA&a|jC|8moskI{e5 zOw+ofO|#s3CqGeZGIqanY8A59txM%gT7YZaxS_cyW_Rp z@!E{nmhsM?;r7uw;4AtVwJ)rUmR?wu*fl`BDmF(EFR|xEtG5^nMgL7t+=UXl1JBZ7 zUFnIRM-p#uk$Vl_uP{3|mjZxi06;Xj&a@s=$Xcx}bUbR^A^lHnh;WgyeGafj&qi9s zz_4@#AH?hS5lLAsPs@#kbwHZyw)Eak7D0MUeA$74o>8oe#Lg3p))V*~vQ{TLxfgRa zeOuaOvmYPs+9>v?Ot8LdUPGd{e9j9YD|2>p+0BvQ7K(-XHdEeceU%3L7j{btYRq5d z;_o&OkB!#%_mMwpwF)lv{DS-0ckTOo8_CW!5Gl7lqgBj6{oAF*8BWB_n2&*GC+Y_FVc^oX$bneWmw2+^>A)my{Pl zZ(sEaE8JJQN=1hwKMATVm*pdvBQH+3u<6|2|LgVat>%dJskflbbi1rawQUrwMsG2G zH!2aJ7H+1?LJNN7uE#$t;oY=<+oC_$upX~uJzm3loXvWi$9h~S_|JNr$3EY$1Q|$D z`eRRGJ)X^aoITTBk2{Bc#d<_)*+}7JMpolkS&a>{8qL@#Mh*VDMh%y88a3w;Ft+Bd z>K1YuHNUG~q`!ZvUZTH$seVL%@igVvOed>1^Ba`~h~-g?e6j}l9a1abX`)irVwF6> z$jbj?2tt}^^Q9|`$yL-z>5@yKg&%(&x&S@m6lKQ|Yd0L(dRF=kSfln0)Fbf{sEjR+ z(qtx9HU6krZBzZHM&j@?YJ+!%+T_B_XT)%v%*3HNn^gpi)@*bRAdBw9w@+nTj)!x0Qp*W zjWm+Iq!=r<$_bk8l^}4Rd%3f5^TQ~8ExV2kX?sRe%w;XRjt?!DJjm<%8l|PnsQ>}~ zcbf1+Gd+za|DrD(Ejp171I2>`iroQ`9L?^G)ZmCszGc^h*d;Byz8jm=vga?WB4v^b46F-0v zAXjrCE&(6I)zihJ=a9k70~%>8&W3huCXeN@AMt-#4BWZBx`on4J6(y@YZcX0;iva} zJ@4->!j5D}mXe{Zkuu!GMKj>VJ91j4B+iAIbm1K!L>H>m4;T4?ZcL*asbg?^lUCiJ zgHj?GKhpgeJ48#0{m*E>rTSKS)Yb(4;mC_U5i_DJo4V~1O1CmBxGxSBRYFHGWGAaf z$ei$(t)Eh=yE2&f@s>rn8e1wtty^9;wAhuwm^Op_QNjw>yq~@B`=yAm1Mu>t*1C*1 zja5mNZC;gPTWjIjuf+RwC9Q$iX}$zQn89%Z4O6k?6iG0Bd-ZZ2!?3_)by5=Bnf%Vp z0|$eVGUJl8!ku|?EaFub{}TD-UCL%}x?aNNiaSE3Y&2CEZLbXhfGww?Y%idBEKSql z_raB7M-aLVY)c8F&t%(#trj1$&oR#_#8cvcr*mW^=TnP6y*lkiGRapaVAgTDbm0d@ zQ*0!^M)Ainwpf3p1m%YZT3I& zq$MRWRj9jxy0hH%&3)&sk4q(c*Zotiy8)m{y=5(0Z+KF1y?Gjyy40;keg9eOmjgzy zVj9Hdhej&O$B2DxgWzF?FX|!9B0ypBmxHbj)r7#7>@@^D1Vf*eTDY8mqgZ%J@FL#- zbD?e^8my_I?N7Sebi26cGKIfO|B*t3(jNsAD2c!ToL4yn;m(ge$E^EsA8otqk#k~j zm6_R&5!wM+%kUW*Ra9nujnuWKD@_p_425L3LzIQ$CDS|rSC5M0s|0#~LWe=$%OT!J zD|Lcn*;C3E>{8;I5X%=P9cx{ptI{l;RB2sM#=Qp;ItT!AL9 z55Bp(FCH`2wl!4aVZ`)COa5xO!lN(f)kh z23f810rGSpMp%(p^*|%MHqkrZ2zLQ6`C=N$BY+h&-MBqjE&iKE`|bMst=qM+Huop- z#e8*sGs5qCB;Z~FC)eF4A%4JGp#Ctk3#pl2w+0q5MDhh`cy8hqT*p(}V}toNmn)qT zulD&2$4I_L@6mB>cPN9hM(X>L(iP;iW%~P6ShJSCExeE?#i?h(VO%K0i6|W&7VI(H z^{zbSVZQlH14n}R`_7RR1CnTv)jfo;*WvY6i&yMgcW+FW@Xv;W^18aHr2x znb)3FlKaX>n;fI{CSdu-#)v&I;^YZRSby^{f=^(ChYoxqPr&&= z1aC0fv>Q;zrXUPnP~p^&D0DaR1t8V7#D}Gl)|%qkge}Yf7i+(4eP)ju zUKRi{wYv6nP3ltAMJcN@*yW6;BJS%_bM|R81aDM9;y}{5Smp~5!Dubl)}E|xq0fGU zEc~(k2$B+o>?63kOXd4)ltRHy>5}s(L(K6DW-cm2lpE$)qSKg~%fr_5!0=1QHt0H- zF6~qmwgY{XrbEF_XE|7wtKZ7**qF#vpd-r+K+^-up$=2o=}6Pvu7PTAsv(x`m32_5rd% zaw$nFzV(QYvnNpY?2o?h$%`+LUL;J!-*LW8Ay3YA+n>cM@kxs(%l(WFx_qX1bBXYtPIfutWpHten_342e1``yR8mM1vo?e2_EB_&lDm zs_fXR`CB8_2hL+#nZ8_n6V|*-yegL?as`}$Ivou{3tXC2>(Z=0=|nUHUfJx?Bj+ke zpI8iMvJE8=UWMW!R}S$hwT}+~zNN7mCF$`~71*~63n|0i zU%~kX9)mm%cCjQjLK~`*=_!`P>CaqFAuW91Gp{qdd4Mv^6%spBtb^(E1~5-sis<^w zWHQ>-aO_F+_(CxMSCFnveUXF*@#%U)A1zd$;EfA$1XGq~)`K-DhLY8H#+2?SDul zZNnv!LJEQD*u0#iWIEWXRL!}iS77q5$oy$inN(CHaOKqr$o%{^m$36t!<-vzQ&r+>KF5LE$9N{6FD)HrWsaNsh>)wy^ ztons-Ul9WZR*L`MOe+w`iYf-n@4oCR*{3;tQe;VSO<-cLkDXeV!A>79#R|@T(SoB< zFD=XydvHqXF29CX`O7}qULJS?okaWu%&tqY{=p}(G<>q_WY=C}W4$?Jq?q^*qTI<| zIV?Gs*bUP#DGdMKt0#*fI$}LP^)JLYc)clm)+Ga|jIpe|Aj zsZx9J6h{|jKf^cHQ-b|;`j7q?ACBP`KZgO`qPU48gxkOL(8rHDC6N7eS^v(v^ppPA z?YsZ;C?{JPCe?w;Z^8q`+?buV#yB)*ZeN%SpMPA3A%^5p+U_T@BOnD%e#QP5m-^G~r`BQ;_ z0Q!T9>=!d|(Ujwo<%w#rf`fBmncuJD9B~^7+2ejb2<5B%-*}ckl7Gsh@?w;>>|t$# zQ1=ySjMQC{!8-0#sVF^RDnG=`t;=v~$9gk6-PW9ctPnO`2rF37e011Un=4Sw6R zNyt8GY1@-{mOtwJ9*?=U?`_Ss9Y>lt?psnxdcrt<3fldE0m!Yc8+L2}vns50;uKc! z7doFZo4$Tfz}xv7k^Rva7E*e`3#0*=>?QIlVll_Vx6uuEFVNvBnm+36yASm2fb1zW z^5UMoWqEL2DvP%#Cj6(Y67>iC&9|iK=NY)TOWmSxoxCySBV4Nvi>`&1Wiw4&BHqoGp2NJ_ zct>*O6>8^hc1v~U~G=F&2hfjT}tKl(Ct-tqH!I| zcHRU+r|YzfW6xbZrLswEB#-11I{={$;W&uMcpnWmZv9Nrcy2H|dLZCV^zLu8zAZ`i zp)Y)KGRG<|2MchPgvR1pp*WhWu|24Ko4)P^I1x8%N#tBc4xv$kVF2%=XR_V{xW# z!x5{*2V-%Uq?D0z1W$4Xc5w!px4pB1^P-vX5%MDE904TniMJ{_MQXIK2_3OIjC^n& zdWeorfR~XSnQ2DyyQJXRaM?l7pY+g+_z_X!@+NDWWS9|658qjN5aW`=L1t`($Xn-; zaljDChzTS#C=(?-R5U$wz2w{8WUY>U-9ijIqhiqd{i2$Akko24uA$tYBojx<{ucY% zpsh{TKL>T~cb?=a|L1{f6j&_>b*G8Ae7Rn*KuA$(8I>L;qe@N0Qf%Y9+ z;ZxS=YKY9eQj0ydE|V?!P6-<;D?^42wdtm_z-pBh;*WmlNms- zV_F1nY<_{kY1A7{A9^Z3qW?9L8nSw6@O1-P4hYiapAP0i7^86ukmx2cwMHN@f<4^O zpmm`^z2qpNbd%AzT3{ow_LKWl4gT}#p}(TQAWY)rn-1V%7iKkuLxU%}jCq!1G&1$) z6mV3@`5yoyCoTjqb(tt+Bzydv!T5vro-clx5;d~?G9K%;BL~myhl7Z2qF;q^M7zxQ zM3enj7v+04`}!bt)KLcm)%e`_Pm05Aq5Cmz$D*ox^o~)k-JikJAEwbr-4A^LZtbK= zZ!eesW;pke>dI5m^n~B&w>{1?(1S%Vxu5I%Th8b1d-)By`WoUj(e#)f@!n*CJKLO} zkj1Sh`=27G5B&h2+7f3c%3_n%rS8!E{8vNgCHl%#fY6f&*5}5;<-j4wU!FQI$6uCF z7l9j@BIPfC(AQmLh7>PDmJ&i!<&)z5droud@ZquXCWv9r6)#!%35Jb1E-kLRPHAy$ zhD(QqGbkngA$9c}D2MPf=&R(f!yBXmq3`4 zEpiOP@`WJ7l*;T#8e%W(DII3da?_qndU=U7^A9AAHx6M2J@?ul-NL+(WJqLUEOVJCzkj)5_07H#q z*T+|oVwN-}*TmnUjwY*n&dH?InAVPHO*g?FS4!SH&HCwVdMA1O;FIa9|{In=!v`>=W4Ag+2*2>1@hfR1Y&7B`=`C@+T`e^+N zM(YSrP#u0hV}MQ83yr5vAH~q|VJRCGt9BkIl||s{AH>fz_elR`;Nh{)8!3T`(LOgQ zhvwdj*1y(dZFHSEnrdE+(Emt1_e#g^siv#vC3oG+rf;D_LJSx*jxDiooArBUUvee%#M~XNe}2x_ z>!<9F59}Ecsy`rhP$c1$kvMznm5Y46jydJ{;;LxPb7tqB5_}1<{$zp#T!_}MlJFX< zb!Io5l@9-+jLE+4KC`};S?%`AN33Td_t=At_E~^>yG$sK0oGPxF-6idch8*^YS}d( zjiY|Y96Lm3i0=|NoRmzC=)Ix(%GgxqjDB^`-Wsi01t2y^S0u1#`T_`me=C6TXGM?U=pIIhqV^IyGr6#)?-3A(NN#rROjC`J)>SQSs{2p@@K zcJZ=6z%-W$fo~fS z|0n1s#(^YLDQ))R56WTnkAjKK200{WfNbyf5C*Wp`;NLH-v<_be@wqW{x@&e*PTD9 zPg{M9BW&zXmffZo#CMyi4N^048D6Gx6!a~w{RH?zX+EeD;j=1x7&B|85f`v08i|Lc zf9%7H>r7RoW*s3-A|N?rivVn8P&Bjiy)wFFB!#sQL8CH~=ryA0O9%*jN0(XutZ_$Y zw0u|Zni;e@dB;KM6~X@chz@?h%jdQ(h+=krpj}{e5L1k=1U?dZ5A9N zh!TE%S6BB&t?AWUl#|#~M_Qkm_AG?Mr#90@$a*nU^I3efIc{q0tawA)G16#*(Z15O zrXos;Uj$(@a2%K}k=d>WN@5H0;O_2NHZ^~U6xuh1J7}I!hLh<1V$PAK{nIKDPHW!g z*0^tH$5soUnmSUn3Tp1T6?|C^c2iq6-_`47&MZj4%2 z$S|YUj~Qir3uio{)=j;voLW&cIk%KO84tt1PqzbBs&^MQ=GF`&Mqo{y2)F3gH|avy zJ}I<)RRu={R5c>f@T)wK#1_dCauOq@dc{!`MH4fvl=#cB(<59sHNtzY90Vr<+7ruQX&mdD$gWE{71-K1M1lDz z|0^daeiw|{6VDZlUgey~ROIQm**#IrIvfx! z*B18M(l^*hO_ByGjt%IyYvnCH{J^7g zD6=Z{h#*4&Qgo+gc<9lcl9OUGNFjna>_e`EpR&v=%QV zIc)6;w{@)MDe-<)%dU&(9F5e*Df;0->`{qqm3gPpKCFZ?-{IYCE?Z=lrlh)PI+bNW z;AVHKfp=-YI~C47MZKq}mCEqgoicNuM&_Qb&OKe8duq!)Rp*|Pxu>~2$zOM>%1c|7 zs^zIl+EbZvqKTi4grA8l+8YR1^P{*LnnwGQVemXt@xpC zBdMk2F_KS^tme|?0jdjI%LLS{q$T`>o-(Cg>%j~!QS0}2@)LnMb*DD+ByE}^2d<3T zzn98-4uj4{xQB%0X0*PDYXe24Cr#ED#CI~IrTS*3o0eb^M!$k&XK$%52{hSPRGGo2 z&4kv=VX5)ef!KA#OrEpytn{#xIjQ7Uc?MO&GVqANNjyEVG7@~rta&DyzFNlp&n@_8 z49BFXgO?!RoSaxD%|qwJto5zK$^tDNk4Vpr z!B#j#Z5INzLLh2iw!~ciNB3`VwEoqoamK3=(RWq@%X8A>FNt)%SIW9{J6#VsVDyJY z67Ow^*6fyT4+iko7Sl>E(avqOXT^whaks(~iy!Fjez-f!j%w$-hj#8cJYr=aYce&F zAnH*!Q@oCk*=z84Wr}q=qPC_*Z7pXcKcYgsEtyi8H>Px^HuvBZeh3Q)YjA;ccSh5n zWt37+ll2TTY<@qu`NG6O7*xX`WmgvM(Gh!=ROrH7w~RHSpZh zb9a*kr_j!FDX?j~!?ATZOqYyN10;0{TH1>Rge<5YWW^SNY@)Z+NY97WiW|tn)5>61 zX<@F3owY^+r!P)C0eE4noC2`)6RaF3vTkIauF58?#6LR2E?dqyfO&tO;93f6sm{3d z8m)AovG742wm$=FAHf6bem(n68UpiX5fQpEcR{dR?$C2zq#0Tag>7GZRUV&KT_%46)W*>oQJhCR?6(3-u<`mX`UI za7mkk8K*34rOJ2@+mp)p-j*JrA2ZGXeH-Sz4Qxw)3OZTqHFc<_u5AQk_3oRMF`D!# z&o(^9Fkv;*GcTIRR7IP6bIVksI?6J&wNP%co+pd-?Jf0Mw~_v}%q%ezGSI6onH_7f ztR5!&)6+x=!gTUenI~h#Vj1_DiSg?pHZyeUCXGEaUAFQtkU$Q2Lbyyqno|3FTbhuW zP6*?}4}J?oBy`5ablG5}V*yPx$Sz6Q^MtUj@4W6k+G>-w2xDz+V(G0<^zK3aq6vh} zwhB5JS|G|jBEhYU=?OuyaLrcqjn>2EV{ny-bBn+C1&%Y@jkXUc=wX{j5kx$`Dq}{1 z-JaOULLGtMU=`uQkr%PqSa)FNC@tVH_jK>@|yRlg`1v`FC4g~G;2jk> z&y1aaV}%**y5f+d#$Rl->UPu$O+mm~a$B*0wPo>v0UP-$J^bKr0%=!jGuoF41;PH3 z5@I3J*kYj*M!V7oPZ+b7^=f0wgjldrEBUb&OF>JsNpY8S=(?v4r3%a3nwAN@pp@jW z+%GO=S|&uIZ!=JAJ%k>m%a=At$CU5XtaikDhx^;wsx}DUq_S?MZOnYY5id>9SV)wt zPUkXaL{QS1kw;JGQjy2fL#;VFLFO)rrIiKzgi)~*7O6QMcAjn(x50nF^AECZfMxqOQ@nwk<8m&OoJss_}Tkse@sk zs{?9VEW_D*FntS)2XhXClLdOGtIX&qTxG~Po{@k}GNOX&XS?v)+R(PFpoPO4j1{YZ z)slYIZ{c05_cWRu$V8RWWwjbcg3wXa3M!pDEn%xG>`sg~lEYBsGPE`(L7wb!g*pV)V;84G5Z*0zXS=*jc z6#L%)7J}dHSN%i0dlNL$gPGq@T8T*cUtY|U_^91bNaEq7PmsFW04KUCkl3qjNTZb!Mf&=KcWm@ftUKl7misBuAsOCuH$WEX zOE*%=?2{po@&y}ZRZjmC{}uGUJcaUtWthQr9tHL0Q&!sSU_Tr&T4nBKDTt9FJ^VHs z0_58ot^ig{q{eu-Dl<48t_9u1B6@0r(Y_;`p0o}R>p`>Mf$b+NSbALWP;I0{&T_8X zA}BmG@prWXh>owU;$!uCEnJ|ovm`h?{+Jj(vYGDGTm~pp?E-W*JhQGYvsbShyk67g zO+PQ5(G$F0A4(SOb)_y6wocO5txN0~H2Zx^8|gWdws9T#gy#9l%^(NQ@-ryfO#c}S zEoZEdxUdn)z^|pl3p(U~k)e&7&*G!4^Hi_jjD_{2Bs2$ex&oYF9wmR#Jf1G;UpbG? zCqUMt$;X(5 zXb_27#d&8L#l7{0QJ*E+#T4}n2E+hQaKmW74y)FgLH9(~>~|Br1WnQ9GH31tL0}iV zXCDW{&13MKSzkSBc#Tk6S!&~}x$7E_&i<^=Xsv^bdhE{;*;^%+pQ*=dc^{6K^6m#7 zy-Jez0-5vUeSz%z%-r62hfe)6kcksn0mvGpcoC=Y*+l;#%qigB`?nP%^mjpUkDgWo zi2_d1ow}R^SuM^S<6gj3Gl_o!k=7mVl{RVIc%fHSBIQ&$B1I*z^y z^Zj|~hoa9)k-f==(JHohkF4~(`M;;+@7-JsrpExA2PT0^0hpYxiInH!QGs0W)nZ3m zzv`!1x$4{cRsR@NO-EnJsR1E|9iXF24FAj%_uDiRqxgTzRtNU$z=iqo_3J=)N-VfC zVCPu6^1lS7OZb1CDj@tHw0_xG-KG@dI#re{6obALx!b+9+4IZ)(JZv~Jg+|0{+P3lH4O{n#+#SQ5MR3TCTy7^Z$hyfS zHbSHAUP?&RYkw1nP4!Mu@~yQV5f!c8rJNEtI$4S#*q7OBU~Y*HnFM7N%s1vtW%y4c zvlp`q(cVQZUc?uZID9%)a=nUnf?$feAT4BTE-&X^!bhL8fHc<*2MaC^H20DjBzr@ zZ6|iPS8e=j%$4L@HIaJcaskUNX1i66()OMZR4{|9X=tQ0gpa%@vbu~B*H`e;UMylu zaBU4A-2p7dIO+{-ac9-)HszPGp>Eri>4|#~ZEfAh2oK8ar@I!|C=(knr-%$(MX)v) zid@)}EWt>aN0+t0VpZU{z0jqF?1C;WDozD*O<@w|OX*_a$EgkTP9z-C3K6!!h3w)f zIOq9xqm5K-bqVXoaG`e64M!5iz4OQJ?WKI;`Uxr#6wQH!@>xp)* zL)rw)@lhHPbh+N%neBa( zkFJiww-6m$cuXai4)ce82-Tkx(gL!**xWxd2|dqRMMH;x-&#CXFtq40i2>_sK^V zsF%r`&g_TL90GeNVYJqOTZMQ$=L&F`yR+8Nh~H%+vHDBkcV7|w{Ojpy-bMLC@ zXZ;bFe#WymlD%*8o*WK&mYLDzIvcK0iR)aXLBR8CD)R6NhbC{@XGQjfM>_$#Hhu+V z^x;ys7gn=t|8skBNUj%0NH08W@Otr3SwS!2zmpz(U3=hR#jj~2*NdO*3oB;%z1WoX zdhwF~@HZZElqu}CWTcK1G@_k{`HC%8WV{lV}6`5C&uNymXYBX#g5HE%j4R9pgk^6<67MVt(gclQjF4W3p2~&-vXvLnWh0~C}2&ZO`ehdrTY+fdB1$)15H{zM& zvIRn$b*n*?nPOivNyf0HLQA-2jnURYswb+%zsrg2i_PZsIn+^&IcLsIt6jU*%uS*z z7kcePZT)VvK2=pra*WpBk&p|}HYAk9cB0}iT=(EoE zeg70mft{)yq!iYwRfw;gwJBc_Wn;%^xoas`hv>CNV7B$4JbbwQC7O=(Ie!N^3+6Z? zw{8CyZG=lzu5=cnJQshT)9iiofElX?m}3fnnLT@Q4sgEs-TKSJi(!SoOYo(H3Ibr^ zNLrzT*|IR(WO9RrcK*M($Vwj2r|#ns()suAD$)AoTS_{A^-W0U1R+b<}L@Xi!yx-KYlF8LQg^HdU=%frn>_G}5Q6|W=bJH8m!CAXjym^4zl z3>z*j7{0&uQr8zj!LNOKs2?!A{ITy9z~fSd$I!M*6_+M&Qd~NV9~YOZ8o1U*oegtF zw{zjUE`OnxaK zdYF}#O1yB&?XD*JHZH%x^boSBs>;it)#)KGdZmQL59%e_ZF^d5)>Pd2cG;kHI5kkE zNlNEi<@!}PqkbLG`PRTe>jt6Xji)VY73rK>iDc=D?SZz`1ow+*c2-J^W=8V4uZ!EK z_;}{_tfy3}&C@1`3SKCSr;!hkOp%|o_j7&=gwF&wvxAOz_x^99o*e5P1_yhB{PVrN ze`A=?XXHz6d+9gFaR^~CkX2i}zWxgf=j88z$TT>X_HY~p3=FQNG0$o#l;w`~4kSLKxD z(yiK~v;>Kr@){)e77=ZV7x{UVEl%qBJ$959`iKU&S$=Q`;g)A3S-!t8lS#E^+Qq-T zznY@rVHdcl_~Ot4RQw4qh2XpX4R3gV<-u=98YoroCIUoJz-(@)MIT)vjf)Qq{y{1- z5u*UBkvP}P?M{i)l8g-w(w!2A1flxfDRDAz>CjA`Fg0x@eU%QI^NEqk?f+uV zo@O{hDfT7#E=C^(gKuA|Br!Z_^?s=-Joxq{@!+a5lBO8^#CK^R5578MB%a6Aw=ZMN zL!`U*C22|ROWG8N+_CnRE*8l2w=a!3EhiWmt(Oy1u~02AS{I95$TPeQq7r64LoMbg z*W<9zzO+u#zs$b$AOp~q^AlKAx6TnDQ^Sj(42Bo!DU%_!=UFtuvU+e}d%5v%e9zln zq&1Iehdtpp^(u|H(8Ub16^SL$A#N)m(LZ_dal-DpvuXw4+$wpk_q{R#`+H@@Q~=3 zB7no{O&{|!@@1B*Yka=2ZKL3UZ@Joq=({h=)hndub3MQt3|7!|AC{{mUtP)ICw4NKN$x z^42xXP2s{ZS|5_x^2pi!(%=6pWjNNTv+&!OJVp4zel>oXB5Wijak%cb>AX033jo-V7 z+Rn~>Kh;&7e!7((FlhnjbSdDft^}LdOLblLlf4F_XRs1CWl+>!SJ)J*uG9YouyU$v zCJ!%PxtvUE9u9a|@BF8)x(;OAI?sDvC>$cZO?B8Cn+o9IFPYTLB5?T4EIF|sRD2!w z7*U`Ft*`g==9i2)!1NEg{M2Bh>xZfx|zhp;jDyZsBq9?_9>%)1QIuy1att*6*2iD8*w@3bPG0vUDRpiqG z9X$BZ^0FUanB7RpF>;xSUrG^I@0>LzrxU8z9j0aHg{=y>|2R_tclqBGa3@vxfU7^g zznQ0Jjdox>)dKJzy5&Z?RS`^wuhYB|m#BiA? zxshg$tCev_N~Lq@b9p}b@z#grATSq}ThC={pA}ka={d~n@8vAPV*@x#uy!UW)e+Dp z8^J=Y%`OXs+iINysLE?e@P!=*^mp0x7+;Jv7!srdG`z8xxET8uU-O$!&Z}&#y054fc<;+jZ+hq! z2}7J7^YB_l*#9aA@dzFm$hM8zgRIw=-Fz%^MSvQ;UH|wgGL&!i8%lG)iId0oVEMt` z9e!Qykui~Fine7;Ga)IQgSX% zdm>#bZsK2>ZimrAZad3imfd|RymkDosEMgH^G+++J@Gs`2NTM!NZvMDr|czRv(F+D zcFy>AjquT;$&|a|a@^qE0bR+dWniu>fG#P8=)sdQ0qJFx?H%TnP+*d?GNJh7X?af{AunOL~= zKv+x;guS~3n0tE^M&eAw!Qzn-TEp(hP&F4MN=;ew3Rf6}6RjrMNVZV7XCZeT4nj2< z59%1lljMn?g!j$7<0H-MeDy7R+pz^hd{g!;3tWKa)cX3&O!n1s-ahJRA$Dk2dK5>p zdhJ7u2))mdPeI`PV~r5FRZq}a4m{!;pylSgj_lk;eem2&s-|+2(m7 z%OcPIX;~?>LuQ4NM6}2_=f2gyEvJv{(z(1nT03Vv_OHlJ-(LN8T4}1d>&`{YXK_-` z?_8@cra>fY*D{^A7{}uMx#~$CSM64Fr;J2R#3DY(3)bWT&YO<#AQ3Wz2lXuVdFWLh z$NQ49c=bCby3_icYjI#Fcxs<7|Qg6 z%-vo$jMSk>#qL3931;J(I9xk({N&VjvHro~H|b)^{(fY^Vy{5bEnMtI>i|H)g5Mj| zMB0P+3AjB;Lr51s@}qM)l93opj(ri^AIWM}VyhMhE)U{zq=cGD1IEHDd11Y;10K2c z-uLZ-Uj7?`bx|*G-XGU9U2_R3>pKITy|)W3vBhZDDJ7fcpDOv&Lt9Q)dE@jhl{XIj z!ruoSaik~cjv`-9rnz^s(t`K{LIDoo%RW}mHUA~6MYPBv*8DUsjDa0WqK{JH42Av08rL0`Th^C6-w8v|``NE5z) z=jLt2`&rqiJ-Cc}Mmp+>l2-{fUr>zA;Qp7Q^R4g79H=b&Wf*Kc#QfTbJ*}^}=7il7>;G&g)MZNbyc47FC%InBkrL_}j&zhqxy*(Gm9AE>@+ac)M7- zN7ny0s!49USauO;Lbr>BF8SNV#oCH3nDv$0#b2$hylNnEXThlAS#bVctZ&TuMg8Yo zsQMJ?4u3^t)cJS3J_>o=@wuXfyiU|5XV%^{{rANk=vnWhcmZXPV~Do!Lr+FO|B>u{7v%)>b+jD2(Y2T0(ZQQ+;wnS5bZ0kyB73LD7nl#TJF5z~ z;H7#fOeJ3R&Cd(w4af$0!Ccy5s)_`2Z96JBgJ?XH49=M=a(FoFu;Tf)Yn^(TUBR#; z$yPkQJ)52TKP9n9sF(WZEJ6C7!h<&`FQQQFtVD-U;K00zFnM{(G5K#Wyag%+fB^{g zH^BSADNm@EIuYuP)CemS?sQ0=Az1>oGX(YyaG9 zXsf+-g2^MOqVls(N;}?aeGz=jwd2zSXIL-Ya*>6Y40-$|?ko{A)T~d`mM@B;e|Uj_ zdJY%UA;XfJz=EMt{2oLdELB4efj>SWkWu}f>xd8L+d2;g$qR%WuQ*az!;qyFM$$pf z%4g2-wkmL>@2(C)NL!DS>IQ!gX$Wx6hYm?*uCK|LdqK;6+bjNUS|cgPK)mwXCk?GAEP9Ey z63KN-iz@i+xn*)bs#)lTJIKUo=)(WOK=UncpypM9<8#FqFmG});8tzXo2O+rD&l8? zb!(n*H4g5FQqRHcWe+mX>9k}pIsWdtL7J|wZBO3d&_38m457-l0zo z^v7@KedfP-H9I%#opdx3LXOc5VZxNYZlT&@?DsU%`yQ8d>Fp~w6>YezynT>G5I-m{9SAH zau})MRM+!xzx|XAZYF>8C(3wx>=lvXnjY*|(=Ft3{!L~-tyq%7klcvIJ@6G6a`-+F zVwlucj1WfRRNC>uX|xZ%u6v)*Gu+-Gf+$Q~=*55UbTZxsqkVe;NZ#R09e~b(L@q6J ze(i&KBDjM>bnS_%5FO9u*jSf?TTqDBqorgAer-?R(n>Cyz&hdgYS!e!Ehg@BcYT>S zygbC&pM3sSn?EPb{W>5QOF1LxfX@iLEst?-K5vKQ56)+Fbj6YGtYi;!KN_hqSRkBN z`SduL8PF>Z+*5|m$$ZJ_Y#(uIh*29FL(BQ2RP}AQDz`Py%+u{=bKCTdJ%gnQu0rU) zR`w%_wJ_@&d#wXy7Qb!pU!v!oEA#Qxym+YuOVwzigi6(*sRR-=k3a}%&Coq@PP-j4 zk&hY*?;r;EUDcbbNKIB}_yKGBcnt7Z*7D%zdi^WU@@I1MhM+I5}fjChuG$d$ou+8H&*k)qF?(HY%Lv4!lf){F2yc7C`+BEIIR9DfBsQo7$ z0pVgBQyh#HKfk{#P&c1a$|LMoCEq|1JZk*3+f5}sEoKLqfvHO=&ubDm-gaERE?4_gk zlg8!QnXaTI_vt4EpYAXIbacTdS>y#3jw|@o$0t7!wD-$+9=%QaDfdHhaf9>u(xN=) zPmNkH$kjn1dtxn~X8VN_HynGVkt_=e(9WuA5lSeJu z*^?c3KU>Fip6iyh3zgb9G?;L~Bcukog~5&A?B@7sr51P32JbP`-+bA$M`bh2m1z+> zI^X0Xz%o+XBWQdo6SB@7X)M%eD*0Ml=m-ElV+8$lt^l2`ET9iuPgu8xagD!ePOZkt zHC7A=6M`H84j;cxe9yVcXYO!E;&eH`9~Z!Vm4(66~~AKfOre75g#$xvj+u z?`;B_?nZ66yD=l}8|`NgwN`U02L=aqY2RWk3(Ja1ZH1zm_Jq$DYT%kvOsk`cbS|E+ zh}x4I@baqU)t*1i>S*ABXh1hs4{1#H8P)+5Ofvg5une*@zw$`{%c89bl(XE$aZKPmoDgJz>eKxmarzDWCbkmMpo?2t2hmg~_y;EvGiA-`q z(I|dH+lkKDtq$jsxjQBKx&lxK@WadJ>A8cg02d-|-p2IKZs1f0=Ih`{gnP1bU*g4x73rw`vLs^N@(QNyC5 z8Y;Ag#YYs5qLsHV??e1tu8#<(ZzzpLLfg4cuPPS8mqSL_)Vx_ILN41>aZ+YLeR5^D zID5jyz}^LRW3bm9P_%w?qY);g`V||)R_`VL-7S~-am)9Ko_PdU6b4(91X_VAa?SKi zDCM!$VYwqOyKt_Huty87*~1^RJ%r`XcPoBp%T2$=g>uXnL@IC9$Bn2xsiMhl z$dQ4k?xbg_K9?34sgIDEgi_?lgY!BmLdRH#?i#dbxvP-(jDudw67YEOFD%iMbkGuVy2riDwO1M zp^l7{kHqv#bdAh@#BxGipFvXR<^kdKj81#;TwV(HY_0X3I}f*3*R88royeTt**hSS zDU&EadxiEqTz7P%)$VVYUqXGlk$*cbmpXA*8b4mV|p%Xb%r{34lvnHpL=kmdA*q)_Hx7?|Ga69Un_|w_hZLD zYHB8uXj5=C(j!&iMqVKW-Zs&s_ z^?M@1(GlV&2$vhq2l#jgN^*JHFSyw?f#}mB##m+^AL= zt$*pdkE21SiQvE^Jba6Em#vm6B_LL`e$9;^W0Q#x6*_&~iM8SpY|=mZ9(qcyp$%Kl z_FSX)8bs_ytlv#sA35OwGMeepD9;@V!St}dNePd9W>5T<+ybBk(j1qT@f)|C4J?hM zxHX`z$lf{bCO<#^z(Az_Gvnr8kj!x>QbRDRNaDj0A-kzE_zK{x@0|Z4H$21^(0m2W zi|6ufC(yjTOmNHVK_ner4KHcv%dWahT&&KoFgXpOt(?hpzh45SGPw|4Ek3l1G1m>-Me=IQ) zk)n@kaS*zYJ!D9ppLw*^n>A+?gUo)uUykPLUU9#E8HsbhS!7IdqLj+h15sNikP^1< zc3Bu##m(pkk1vYg@v*|Ast_JKnGvsDkyGR@1rtK3i=j~HXfRpEBDx?+$d5$fPbs&` za{*^Cz|Hs12cePpG3^%E&zz*70YqKTclp%IC!-z}>(T(BsgZ(XLcbP1(2suo)fuM* zxPbr5%1^ElnWE1KtHfmK|ISYU6Z*{ARfR)}Ok+LCSlpeJpRrY}cqjP^~ZFBTUs z-6I9g8%zx2Up9@rtY|l<#7GhuEBohP2s`mm(`b`euY$k%{7MM&G)UHc_MtLy$U5>5g3Yx6SI9 z%d@dCOU|gRTrFasNDOuEg5+KSkE%z~XI5xsk;K?Q>>DFSM|4AP$XXqucSfoSo`fbIo5=+%oMMXBd_=B!heXmt zy6QH#a2UTnVvXlY9^hKPHU2S>5}+ec2qdC44$-maeG702T(Oa-%T{^i*1@!1a?7oy zoaNH$!;_3s*4gl#2_mq`hNlYGDwa2MePXIYfYCne=PkRgXj}X;b7Uk}pyai5$TKSG zFW?*@ZYWFaMIzdZ z=9CuEf}<91p*VP4ZY|cyu~M5!=+z-5_moP}o{NC&LDYv~ntCXA3DZj9l(eYfP|N{Er9UAd^qdON$CGskCG z;fF!ImBDa*&;0k@sv!3YN!zW))@sm~nA>&K(UiXW<}y1akV|FeAMHXlei)ohhAo_J z;gO;-;&014QT=bi*}>LB)$Ux#iV9iC3yGCw(0{22uTcCmco66}re2$Wu;T!z{QAh3 zv=>VO4qEbmsQ%>}4+__7!}BinTbwtMRVc#@aZ5n0Nh8VN)R1hNaMGtoPm$WFW&3njckqIZmud>=dwC2$;C zxD{;G;YG~OLOeiG!>a`&b`>>#p-K;ZrlU3R- zgjcv8G3#==wg|}0AJKE@mHvHPo@iA@dTd}QantVF*au8y{19(?5AtejtZ&>MNjL6B ztcpGk~bq1!$)QdE{aMT|w5%*5XG5W={Y!SL}0FlHDPzO}2(MtAHmMo#=%= z+$MvMw+Q)6$mw`6C2>oRZ_E-dl|NN?mB$O&P1kGYIb>*V4~IKrtchVy=19& zG5?vwDl)|tQBm6wr_QS$g6>kjy=zKrVB*0FIw7We`DH#q;%E(NgDNMwq za2api0oSB}u4GNDaz#~HHA}1Fm$~D@9d&Am`(7(+<7b)8X&I_(v+%cnB)YlJjg91C z^f`ME!G=7JjPb)rokF2-X@`{c@hxZfNXa2^Bo>p8N*K`m*;>T3yts-a*h&doS)Plo zHb-;AD$-OtBbd<|?TwxBeEjvAph~~aB;LB;$x3LnOfH#4g zCx1C3dh_$;qK0TOKhxDJLc1W`*Wm1hC^lDsltZx}@zxy}C3T8A4vIN*QyS^~qJ#)I1B^Q|VuD;k4?WWu>Xm8* z)+UT((5$U`SMqkYDkAkOjnr>p;ElnL?G9OFLW*9gWc@6wkil&?7Ct2|4{C{G@0;gn zvo3je;j&tFHFFoD^}dl@z#7i}0snUo(W7ieq)wxL=Xy#miZ zmAgBdf}2c86CwMBnVgj#zao1=Eq*C3`IM`5NIoYWUa{M=DjF;Hk61fAy{9q#9k|Qf z-PT%eFsvGIyg}cgk;sn-1&kxw{j6^~k?hF-v*=ZeK6SMrsEXQ#Ko#O*N z^Ez$}fH550S)Ue((MZc_H*57Ml^>DlIyaX@YF66%TC+M7>~>xyL%x6FXJV-Yn%dxs zmqy!4Bowo`3)HTF25hEUTcygptimNAr1Cf4m05+rxiY8IirZ{HBjmehf04WMNxoQf zeom|zS18u(C(f0g5G7*GDllHw6L=nf!V_zH{yRrcAac6cMV?s>zi_33yv*esg4(C) z0=9Y;sONnHr6DhNTgu*@HvEgOTm;vXp(U~<1tU}Vh-E#}j3Lye)p_7J*HO}^|33Y- zmnnh1n;W|!Ud}<99c<0Hv6y1kKScFQT3r$m3`P4`*z zlxTmc$nQ@h_dDi?3a9q^&q)lU?P997n_6JisSgA{iJcCR0D;L*e#Y{%P2m8a(kAj- zxTM5Vk;ualCykpg@KeLK*sxP3CfBCahw&qwSq$HmWAgSIVaFJ~f-rXhPWxa5ji_^k z>%8veoCAW8iR|J(v$5VQ6kcBAPt!-0AFOVMM4;I$^r(ZGUKHW(x0)9ti7$p3_hg(^ zV*7CI2hhFbBDDd#+`)Kq`?KQvNXgx=QgF>YB7 zoSK?fMlI~1FGp*-P^vL;3Xrn9TZQkq%Dc;cLMR>PD3`)pJLLk=ng?f+m8(Ke$^K2V zyM_XM7)E(~U%M2od0%cz>E$X0uF-W(sLs`hK~d`;aMcmi5w(@8qU{K`b?#%PiL?wL zt?PF?K~|neI{=T+slX4;=cvKePEC`UGQw{)aYJHXll5Mt=H;`Ej?o!mJ)zF`280sZPv<_; z9qS;+ZlBXrO2hTLjAVd~!t@jbL$xrYv&_5J{S*uNcF6RY?~foldrweo$jP-7U;*5E z1Wj^Boe)ZpLr}$))m#&fb2J*USE*^Azx2%dVcpjakN?@Uo0gneAAN7jtffA^uwGHC zMYyK-g||)H806vcRu_V<&r1!vd||`fDifZ*up+j<)5^kf*BO^!oAzK#HcUfBqt(?U zw1PGEUPyKWlK(9`p~jP)kDtyAglj&LExyzugnPv4TLuZeXx`9N^LKAWu`QPU_oN)g z{QV3Wl9DH9C&-LF{AYjxVM3|D3oo^YM_5)?SN1QUkaMBrY*zW)(?Jg98UbgHAZwxv z3NP>y49QbCWJG0nI_?4%pvt-PM|8bB1y8^y3oWRNsn@jz{lG}cLh@OADk7^&1TNeq zC-4l`i>5;-hRDs#sTxgF?Wb--Vtz%faeG&d>c7tZe1d-o9UbS4!pP~-GkXf^&Xkd} z>Sf>YL^i9b3`ulKl~{~_%Zcnfef>-cLt+U7WeZhgZZ-zu9e^a;fnX;NOSgCSbSs?{ zdY7(*AV=9@>IFQF={WFz8IlJnL%=I(YTgd#g$!RXicB6|{RB z;LIb>voMzek2Yr-B~Uqw*08bA^?>t`TtVkLhIo|dp_>KzYC%>HTXY9mD6FsnzK!wh z^juP8IGuE7c?19DR@eJAtF6v#O$(J^eKVLgSxskJW$!aK0#RyZ36=eV&I3%AyE>av z@5~$N&s%zYcio1(JZajax$SDS+PkCmZ^yayS=X*}2E{$$DqOD&$wAYh4{U z`o41y8cLYxp%{<_gB3lqr_Rq|Ed3FT&GDd4an|{Ud>5hO6LoNR@wHf`^cBhHCC3Un zDSt~IZ{UA*4K%Iz5;GlN0=jxj1+V|5l8F;R*~jPY@kp7sVs!s2w7rp=LQ}u`0Nnkh zV2Zdysaz3CpUqsnon1h=2$#7R>?3&7^|nVDH>o_ZhlqcTMA`T`i>W|7Hj-SfA+vjM5k}IJkIp|HIyQGAm zV%`XF{K`B^yjBSRCR$8YBGc%q8qOqU(xr#7KlUv2T{m4Lq&H8VA4>L+Gn7KPf}b~G z#_gF<;(56%36g%sAa>e6)j`WA*Mph27VWrZt2Q+`6Mrs++Q=R{&(Hygy z*(1zK2t^ql?Yyv0{pvx)Ll6=s7tpOND;G}`5h^3;Nfj6w8o3a0Rtzb&tc&(K4Y>3tJaWG=fR{*L(y82asx}T%S&TX{t6_tGc zhksE?fbvcg|GASlLZ(rGPcgd2y&GDfw z>)uHIhP>|fjVx$yg*)d^!pGI@e2xKl4H}ejhjj|W%H?ocQu4P|v7ntK^1eEr#zF@#obF&-ULgLkWuTFuv< zp}c-WUu8E80Q{{RA0v3%6tnrYI{ed*-ALjRbwD1rF)?BNTB*g@(l_)SoKTI_y;8}L zzM(Jao4BsXj`5|{_>Ep&U4`T2NW3&#NDi#PpcZ&aeex`B3(Nj4>p`!4BDJqz_JBVh zV!uHP7JG_S9-=Q!j1TTUWO?V6UPi9Z`Wm(M{1Q3O`CMi$J>fiYiuHVQS6AeHaz{$V z=?P;BKEG1%xrxttVDc0?KXhKi`a5o#pQ)GnRKPmJ><(8?kx^uuhOuF6b=PGiynOP0 zlH_{xhPu~$eL(IHpThO&CJboGlL$D$r`a0S>$VNdOZC}V75<&ur0dnmn!a*&F5PSn zSJ(a@=H3N9it23q-wg={1qbkkt=6;+mZ&HwDB+?kBsz;5MFF*5sUSsPYN_sWQN-Zx zO2&0DT4}Y_*0yT3UaOL#0w!DnC@NAfs8x}AnIVdJDK~}uzt1@{v$LB7_4U`!|Ml~c z?980&bDrlp&+R^gasYYxv0 zCq5xoehyW~qU=h*MQZncv==KMD;|%}_zk1|MOW;G?_uJPY+Zr+`ysMkEYq)w>wsg{ z0AlTC5d&&HQ9hcHR1qJ44u9>QXXrq+%aDBOe+d1X6ULPir&PPB{HKZrv%?P9SK`$M zZo_6TTWrL*t%+@Rw3$6%AHJyF*36b1oKit|J7Y%m7I6pe!!Slyu|A{YUDO}3W%0io zC5qC!f)PfN@0S_rr};&EC~@j8vFZ@fSUG2sxNNbC+4rid8(UsR9#`}=JJVmq)9}Is z2!o{g?p6Haw&qol#jF{^#Zn_JQ&oYDlW1S!{8J;S9gGrs8PMgTgqnG36BnxLT|onG zy-4N+C8<4*doow`9-i6_##Ey*(ksAnzk%sGAareB=Sz9oQwzzw7IZ-91$ix;zQ-04 z)zztWRoTlr#fNUKCLHwm=ma|l@J%pC1#4nunX6sVPa={4YjxPx5QXfB0kw(K7hJBA z=y5L&)ZHQC2% zc{zt$D+~@Id{}07S;;PyyrvZQOCxACnYfUsQN3zXJ$s&HsEH;w7biCwtZruin4h5gR-c#EGAHkX3va8D_@;9 zNa?rIu-K${6It20AFXh9Y`SA^TZf+>npLP7CjZkt? zxg6B%SCc)xEOBr&xv5s`^Za7c4pey+F6vKlOpa#{o`=;dX03`q)EWTNwxH||{jS5rM`4U-I4lj?^F{u?*_r^F|SR$f$S+JHnnx?o0= zMd|+6SCFrZ!!7;b2mbs%SM4K&5vgR2?BjeSZjO3%ezz5d7E)wWW4$h?(`w}f{}F#F zQ9Icu$|X0odw>$5*X17UR54`E;lf#}C}3~;l`s%_BfD7CTB^8+`Q-C!^nV)9@CZhe zpA?(h-Zh&xbuzQXx0vBZJZ(rfBQwSKMXgsN)?SI%nHGsqZ&Y22;4rz$dg)01hyfKT zfh)oQj0(4cb&Ng|+Rn!I-W_hD-gv+go+zG_)WgLt30@-|1~Bk`7@X;vGL7W# zd0JVdBR8}$Qw|*~)O~^$f)&Rp+SN8tBYBF@Zjo?v&kCAJlqQ=GQdMs+sM;Ggnd|c) zp4ysF^*(E)Z^v4~7>Z<@PFw-_N2gn7UnamyO!NV#`gQm04x#rrD`{Uy8l;?<)DZ}c z^pEJaio304U5q7hwwKiBkWCN(Ddh(A05FZGj%V>tES?1DjE`W97yti7Af2?Vjx2SE zR6m@8?^5o&Ss`-!IqfWZynnsXz~MPqkn6WIl8q2s;0QS(TjJzPyyo&zS{ly|IqzOs zs|h^F(aTzS7;>xn8#7MZq{g<6Wy9)SW4#?8klSBiqns2O*#|4OaugcLS8$uR)8VT% z70;cP9q_#x;zozkV9ff=i|o-91fdwIi)2++9bO~?JSZ*1Q@O=k{5!C=LyCe)h72k7 z*8)tsSjnB<8jN-2&SUjKB#ppw5XqH0YiN$`UvWGy=*xd@O@6pLxw0?aSi6l>b3sSX zs*Yx0@t;9}(;}X%6NsO|-ai9skHc27mloAjaA78kD))ae>-f>4X9BOD8eZD5Y9y~? zfdU!dG4vu6g%hs|igPv&YpYOjCedA3#qB&2)P?I*d?58E0)irJk-_~-;ywd;3Y>Eb zzHiRQV<%nkeHY)2hFJO3oZ#X7gxyl_N66nIhF3vNBIe}D$s!#S2vQd9vI4lU^%)JT zp@GR-q!yuh>t!sn60d#nePmZ9zTZK>k}JN8fX+Qro1#r0d-6H->B;BO?CHqjTiFMu z9ghg@=@;TwRWf(wv&}{QT#*}jo8zix#agrCrBT_cK}IYapZAr~&^?wtCoJN&D8#*6 zuk}Q0kqkjf5fIY*z#73PL89<*5a}+B7p!8bk$#DfPN@h6UjJ->PMjCsb55RkN3Dl{ zovm}Tk|!koBEv7W=3@)i{0)V0-kPuBsUY;CMt5C>-c&8VzDCy2xkU?6DMqX~TB4UT zUe;F0t1f>uQZ>AC`FqYuXQcWnPT*1gVLS<&KS8q?%>ZCA@r4@49S1LxYBx8}F!K!X zM`xz=4R6rn874q9<_$y}=v&0kc1ZPS+Ucmv$E?+!cowU8-L!5juMH`gaJ+LnOJh*3K2vB>oXv3#8^_*sWm%#ZE|N9mhX z()fsk!PJ57SYH0a8HeMHh90#$D{(>bDwa9m=VMUPj3qlKMl(gpp$jiD=6%EmGkbDt zwe>MqZ`V|O(lS8f6a0SvPBhU;)qjFwR615F$Fh@KlS7wK`7x<%aoWWu9Je_PRTejh z43k(|JF9#u-ENcunUXDMs&3J4MGs33t-r*$=_WqaR+Uc;JGX#plj>bkEE?{k4pa8z zd*^V7)4u;zfgn6w_E_f*AeKYUTUgDY7qlx_V_I7{%7!uTdJezUg&pM_x3&P{x*m~a z@%3TnAiB2Cq*>=W2oBaKd#bQL;R;xL2LsSz5j^M3;RSx{W=7oKMQs_M^Dz!6qhVaB zhs&bEJL|Ir(bBi@K&OySG*T}nQz;zexx3YG@)jQJt&fVUVM7YP+Uhppsu5Cdp?o|S|nVd zKw1bDG!c*%ZpP)*w!(`DdO+0gGf?3NROn!&2WRoVoq>SheOCfY;c8u}+YYXlnvhzt zRHIrmBQ5t|J3mp#N5YGDlnQ4ryitKul{C_q0Xvl~@9S1!j;_}6Dtrp{Ida>c=Rj(A z;Dc$#86ndv1J2GN-mex(CD?9_Iz+xbAm$QSnFF_*VF9t`W>gU$u$mpW>f(EB5ZV;=TlnICDCx z_|Xj=_V}3~v`NLh2@NR^C?7!8r30aWLu81DGB-j2f-tC)K0sqnWuZ#TbK1LjA{;=k z;|++03Spg2V1SEDIXG4ow4va5I*7T)m7Dita3$hll(U6CIzo~O6x{=oTm%bu2h}c) z+-=d*Z~fU!qNhC-Pf)x?JU@}KdvEGu|~NHqt@~z&{}K!45MK`26HSm z%}e; zVpjRuk_2H&@%!N``za}7v^7SOpVP*pTr1T z9$|R$Vf$BbcHWxMaXR*hJt=ee2Uklna&EPFwi zNS*5b?_st>Qh5XWU20u4dq&sz%t$7}5v2IE%Jm5|X02~IP_J86ricjN_@SsQk;+vG zEv^&kW;B$hRwv%g^dv027y3qY!WxtK*~({U?_Hg_6zSpRsMTDP>B0aKzef~Mqlxc5 zsjAE6`}S*$StocdlV#G`Liy)Or7tswlE2>1d_W{Kb694-{JDsPQI#1}9Lt_p%q04M z%w(hFI9ZzQspN5Y9tT%dHYJWxhenu0rj*gWpV^y#IU~2!obbF^ z@rHy&$UM4KXMR>{y@L70oyHyLB)Mr!Qqwrb^?*u8|4=hQ`Zy{MCb_=j8#nFk=X1J5 z#DnaxZh_Bt20m}%bNv{F=FpEg*&h=m*0}z!D+Sm8!t9lk{dx5$4svk)?2DyXP3C}4 zz!7dP2D{=v&yGMMe%2~^lXrl00A=v)ucFoSRjVY&>Nb~F62EFGZS8iA{Q9}I_B_vj zrSWn*9oW&;9$tR(GfLf-e705AO6wyuJ@b^~)qS55zj?x1D3fkMkx02}Wuc1>agRF6&{EK%d56-j zO)M&s7-*ho*M6D^r8Syms$P}`d`-C@7D^5Ts;0cEVgM7RuuVoFH8Lap4?yZSFjcFS zf59Z0bA`<3spA$BGjp}I^Y_HO+MIIQQ|%$j`FnAv__1Pgiysx8usH{KasC>q!O>oEczb&r_IRDbm zLF!V<{)Ku?sF-#O@-Ov`^!Mn0l5zC2#&xpuMQUesyXxzmmDcd#wLd zM*pUBE`Vyf6BI}3o8Y%x-gGUXtQu26*FnL;M=)YcTjv14j!9CDTb zZP)H8cCLq64F&wY3L37?1O5pL_+?Di^9uqm2vVx1ucQr6ooB3Fj3i!zLf@!%e@02! zQrF=}e4`71Ou)D)5#IIo|1^h%UBY`5gHfzTF&(EKO|{-WmG3GT+?Dgh89{$WavEI) z?Kz|1N^ z$o`*4ef)Wm(mDKzUme7qJJphVxFhL^+rgc*TtEY^%3vdv%Z=${=Ej4QTYs;YR`AKUzcJ zCkOcu&`Ynhlc#`aTWEcGpkKBSTBlOM)7ho*g1yXcEU2nfuQfP-*~n6jx@S_I$ZB>2 z5K6;pd7L5G*Xx=XWSrYsLtlk-$NwQpfKoe`qjrw=8Y+>7hRB!{Ed|y+x4+sCQq}o6 zs3zSUmh0wnc!ANdMc!J{x;nGroTJ`Ko?|^fZ=1F+$s2*1kvELX7_jpM#-rS*1N|S> zamCZ5;?=668b>%cj$2t`t!(yY=vo#1zWkDzI@ic3J$Vhs)c!`pDP6IH4h^6$ZT@3In^j!wx4T#@KC#+wMOSG{L#)Zf^cbLf1gY4JF1V)%At_Ixu#=0T1gV-y!6R8$m2y zw`Mxs$0>vzCn#qb_oAL6eP^Zp%&;2bHZKVr%UdCBl}(O{X!ouzcfC+W0zs1`1g`j4m}x%=|iJjcO1(i><4MM~K% zwwfhR(?@gqT3$-wyX3F*x-#9E`#IVDnOevD+T8p5azDrCevWp35^wMSTIGGV(jk5t zsWo&`zjbLX3Je@Gnym@f?(EGvEL2~QL%cA#j!PaIxH;kE$)c2^+wIMVNb)Nh_(F+w zBTJEwx*N%!^OPQ1<_1)eEU6ihu2pUbRlqhgk;zz9R4Z|E1E*w?ba5*6Po@4-)vEpv zC8MHgomxs+X+o7xtT!6gMJiu5(l^ixpyObg3{wF#MS$c$V2=4j`n#qovp{A|5gB~T zk;n>kF@`SoKU;P2BiCt27t1BeDl?9`6@|; zp*Sbi74lbgsYouCWdgQ`-k=JomF7Zh%tV>Ae3Cq^fh4WOHsMuKC!R= zv{*EWc{f34dadLaDgkHk1a2JrDj_J{1N|Rq-e@4{riMIbgG)jppQSJVF^Hi&sLe#U zzLHqu)^}#9Ex3x-#U&YXrufgO<=EujOxpdD+q)QZ8~7}%L@fL=@*x!&4WC&rMXXnn zoBNTLXu7)B74Fc4xVfnm{|%7FQ)bDj?%O`oNI) z6u`pAQ?)db9rpyeGeF^^jqByw3C^)AJ6eixu~RZUXJ>*|i)Hp;N#c}9?XC&&F8q65 z;wR`Ic=&qrFvht4eHzbniY%s$kgR38lDRo|^T_whR_Z-&>lZqUS=7AP?n`ICdV9DxC8@l12+9bZC;16sz=#}V;E_&1t} z*FH}uG})GohRbMtL@RH9l6YH{APeuVX#8z!Ro7a1YgDajd0EkiJh}A;v{U~GxBj_O zKk@FQ`j$7eUY1;4+H#Am8>1&h48w^m6kN!TTASPf-hIRyVm0bzLZ@VlYZ+9Zle1ML z)=C9kXxhJ>rzj;Y)%p54KG$mi3hV}${KgD_*19pNnwM!!4m%H01O71XxZ_D}sMf{e zjKZBlnvumq3M6GS(p!;VGo4l{ij`3*Jo=QEEf>-MxR5gsv7Ki2m1gGaW;o?=Pp}yx zuO4ZynZHRhy-){?)Q=FJbDcPE@TKiN0!DgzYrdA?-dB*HqgEkQrpR!Lk^ZruGr?DZ)hSXJcc{{! z%M@ZH-&9$s+EGDeTP<(vjZ?(mBY=k!0oAiT<@`t8Dwe5!xsx_qjK#*eJwNN#*@e)Tod zmq_X4;=5=938HJQ)LkIZN>jCmX#4AS7uhyy^=GiX#>7`25fsviUix?+ar4dUtLRcAz_q)nowhOcRMOgKv z$r|g0_zxJoY~vo^JY&*dY2lOWWIt=&sx~*m&VE3skTRtGkXrgJr(>pd z_a2Ik)XP6~Sm;1G`XXnk-YqHlwZjmD-toeQZ1dVEz@(7Rg_fxh~2r>Swv8P zmSp-xl!wMhy(2Sl*Ud;vs*7!Uvqe-f(#MZLq*h-AuN_Wbv?lM7N$=2v8D?+-Q(cA! z>Xh;sCRcGZOiqbp6Rm!kY>vlCPMa$dfkF@fMB$Bqt{8R_30Nb8HGb=LJh`ICKU zI6z}Fm1Ugsq1=XIEuPA6_8GE9N&i)K_edE@Gm`oggsL~QHTC^lRgROGwb|}#bN(^8 zeYcVRJy`>DBy{AU{L#sn+_qX4`4hg3uyaii5%{~ZU?AHxCf{Wl_3Ur)XFn!y_Se_u zx39rQdZ}1e=Ms`5N(v4ty_Et5LW9i6o$d!}x(oDlhqEgMrt3mRP9n{sY9=kEAWUxh zQo0DD!eriHN-&!?;+QTzh(xafQm)&D8;BeRt57hucKEOgbBs~L>NO}f2dnv&`Ev=v zY9XS3pot|Pcum~uHBpH!a{c<_I&NaIN39C8piVf#CeDH=9FvtNyB(8sksll|QV0FS zCAMEOG@Wlz-6j_0k@PT~l=_)mT573OjH1F?8ZODjwKPZz#|_0RUJt*MO-1A}EwS0Z zco1J?W`UH#@kBKNk}IWoGMm-eNUaz`)#T#Qy0y+n2)xvjNpM1Pdl~VsOk;C}daqg| zv%559&1yzJJ`kl*R%jvY=cr9bq-*2)(R_4w_5O`d zmhtX$^8sEgq!puKuc3Y8`wYFn6%pkiiQ1t!d}k(=@Q8Auq{rss&f%6G&`+*}yfPY! z2uMl&fF?EycK4{7*EZ_j-3DXYL{ASmY4R zc2>gNa>%-ig$c49LDsyYX+|=5#Mv#>6mrFm6>(YG+Q#BKy1Ukb;)` zlkZ71YF7kcEpDS3Z|}_%*C)4MZlpe9Z%b~!6qg?hNC*8AU8G9-a7N7po72OobP3u3 ze=_ss-)c!{vOo~OIc@SUrigm^!wLOH{`QvB=5sdI0tB|Tsl34k!@p_+=JpAGvetL; zhuwJkc`->l_3`vU>75UKXFZd%vVVHj;nlD?)&* z3db*^;T5vr@xkiku@=l4|fi!sKv>NLR3{HXqa3~>u z5`QDC$wv-E(&SWrRaw0*J&blaaV+!8 zsYdegX$2H*G%Oc%lEkT`hb{?SZlpg|XAPBwTfh~|OrC0_hLghEYtcxqpZ+z?Txz8M zrkYW`H1iI;G1ttSU)KzZ^aPrb`sB=34SHH%ynr`Trh@oADdTIWI|fQ`YM-dd z{wl0B&gRbjoaO2`LY0)2EL68Z70HJbV~4@t2gr+kRb$>~ir0AEHu4lCM`46!Qt4M= zXAV&fCZPj}J7kq9cm!5@$J z_^y#2r1~r=`(c2aX4EdrmMpt-UlM=$QuQ!jswNsr3xpNh&8F=|<`5;s#Sh`upfq3# z*+2NR3S|=u^88wvZBWSzI0~FKw#>R@GgndQD;ytWEO{0kGpnpTt!p!#oD)f`ARbe; za=Dq_X%z#>VYSkwiN51W@MyaB&^J8^{BLYfIn1j-$|_t&PvLnwC|fV-sTVE%E(%RR zwyybJ2Vz@5}`V)0OAYPzBJ8FuoclTCrzIZn+1tSD{SFPDo>iO zQtz|+y%y1PQnYEsn-HvfI8zZ9gY&rr*+Pk(JM-r=2@&O+=?dF^1wqc)9zyS4DF3+A ziWsLgk|D=h2>>R`Serg9visikHB)_GR0Usg5E!>N)z#{K-c&8#5J`P`lqIL`vGiYmcsp;4DC zcR-fAzzVDyE?Mq4#tPOn<__bMChJ)WU;q)y)SsPQgxI_GL$-cg3eNjrIMT(Vz%ftN z=4M0eFRy{v^axms+x{49L%@0X?#%XXuA&#}F+In9uQLvUp zv_Xse73x``8fzQEkSrPT?#Jl8sH%>8<(tFUb$;Nlp3)2T>YZR#Hgl^1n3H~Ub{FN3=7 z>!TWLH>8P{A@*2VYx^elP zrAI~#^(bqQ>z%{WlRi*#$13%_cc=_zw>?~aFdpaki?F7{(d5pvRn)Z9zfP8ng36D^ z=HApRAh*Laq?qTELdLk5q5(_m7#^u~qg3*Yv(5L@V;Dy6Rq!ndQF;Z9a2=Eh6lj&F5B8i@7%}Ia3 znqrCX!)s-Ne~)KL?{}oK<)F>2mCi98&AUbM(6ksej(FgV6+R%~Iby7u34-8ScINS4m135ZBs#=vG=!a&35m(}pN74fqL zQOcSkgP-wXh4B zpxCU&X`59)9@(f4k!gE2t6ISbWw$yOtFsI772&paD^)q8EBkgUY$~gqQ#e+N*`SPO zg&U?CXc10u8_#ku$_)m>6?doGRk|BBV%ej5E)=7PT-(N?CGUwhmi%sO+Em&FlM=P6SB>vz;zma;K8r=CL2_Y;liFK_Z%5-ISc_?T9 zur@)?Vg-v@FE}$f@mV9bqjx1AtR6n#SYtFOD<~KJP90o)laXG^X9cgrj+50=hDB`) z4Z8-sk#${_&CfYnT0*{bUP3H}eb(#;`&4lNI$&g?HOSfVrs}N`U}16`ic5DRQoP>U z=MPpZB0HR}U_bCv0(2#hs*Y>WF}d!yo8;Ty_~v4^BgY#c=sqw+Gdl`(HY-1!>#@SH zNg_2blulFd3%9=o>}NS*ylrGYBhvef%i=}k!%f!6iUMlo2ttFbr$KpBV{JyN>#dwb z3VOs&RSg>2IZn>$^^^haN#ZBBZ%jp4)|2f84&*wYIU>Jvw_Dl~IY!z_Jb`zZ1rq2W zolK=!u`k+n=Kux?%Tay=#U4#=LN>E1kGaxDtLp9<4mm1ISW{D{lLGHT?T{3)0I(bDIG>nY#e_h&1w=V60KGyYjM@z zDt?5eGj#`*ycR@o=FqKP-**B=Fmh%M>S%ohvt)fq`9%YsggSpbEy^_j)~7YrC%&BO z`CSDD-p-mhT5o?-6?{dE%?i2}B)4~a02V*5Zig=@|G4=&iCczWSUYJ@@Y zR0%iH2`fZA9n`gRBFo(x+r;d-+urWYXpSq#$(~K@RFN}P5Y`XbQIRx7 z&Up%pONwROI?&B3g>D7;JmHmqs(WZZAiVyDMoU=PN=8Rw=Al|h+wu^YRi+c%K#YxqAcFFz!=qaZ}i&~1_ zTF;g#tr9|kOPGx$Dfh4nZHJu7b@00EuR0h{b8tMbo#2kAo*gGJo)|>8$MNjNa4usw zpEDe1Dv0Cx%n}{+%Ozui*8y1k)a(0u`LJ-XH0`nPqSrUPIasA%M~!g$ilc1KN8MQ% z#E`oL0`il?n%XUBDa3UwVV%h)P=K$P>QyklbC$gIgf$f~2fZm@E@luwJelT9<20?L zcG7>c1G2QBnqZ0TFD$jGu=50bz_^RXP{b8lxVT!{L1+oDb%h6~8uEvNkYVqHVLH!9 zj-agXM{)MSjM|Pontfef51X+UK8BqfDVbNU4v{~k|!W+9V| z^eDFEw#~y$hVmiTJi=FzuoB$K?Ebk49EV1==ROD``S2KDU2!Rg{a&*t`?Hwu!gVBG zSj)AZ)jz!t2<)09)Mh5hq!mwTDbL#}e@b*tyOuS$1&1%3o-YV4>9aoB(c-~VD$n1y zxBI$B`>*G-;_Wo@@cZ(*jXL!hji{l9h2(S6#hWNo?GDwoKeEE(g|LnEZEyISddu@l zepBr&lYKnb-km(Q+a6P&By&HIx~k$Vype&5i-Bdk726D?o9z$eVj3eqiiD@{!qgFH z?lm62S##%OpmL?A{Q~nkkMRWB8@Pwz-6t%@m%^sPDBSjztx<4dIUssgMb3I@kwTsI z(sVweyLQy_P24*ysk{%kZ9jnJwdb}~<&3$*;VRZz3ZR!M|B#YeoL0rJN@_cKvU5%V zLLqa^e@a*XJHM5Y`Z2-0$sNZ`AMc4epE=!m<@2?YF4C=cmcWI^g6Bl(SHT=k|F?qj zDT8-f-V-1;mO4cO1bK7sR{f(TgCZ$NcuIC?zv{ZftH^^d+I7ViYooGfLp-s zAO{dLRLgU|1!|4+I#?WdT*{+DpUV-Z0=ux>XVLCXSXbm&fQ~xxweV-Xt{u4JeW_8e zYtHYtufVR-haFD^KEFelR6AngEI=dn0-)2%AD^Xey5j-M~n{3ny0=rsw$)O|~L>MOlfAijWg) z>JXmXCEd7M=+A9jy2)$U?XBfcUX*)!-C8!>lMowR`+gf17!_S`&PQb;M`Y%YmO&Ep zf;h2Z3-|Vwn%Wwm%p*cCd?$D5Tj&`7YZ}{E_R-^ksPeyl76^-Q>FdYX?AxKQtBKMO zd~JF1zt?pcyIVV5KlhH;wZC&Y_lhjmmhF#H5L8w*;VRBb769D1taV_{L(}z3sar+Z}%%7-_6DmMhufLBN8YxU`20N*T6Ge!2|6BS*d7-w@ zXit|$jnqW_M&v7q@AYpzp1DfgE%|g8fcN-f(48d_Gq*P9fj!Nm=LdUI>UpMw!g}ZD z*Q?=C=s&NDI)kZ=4_J@W75P=Zr>gw7R#)yWZ3m5)DqopUkn10ET10lS$f>9WdTkO{ z7RfHNgQC8XO8-b0gfdLVvO~M)jFZj?+JFsB7R1*f{59dNVqt6PDL0%WeRQ+jU!V-M*&P*$gjr#$mE@xoMf$od0d4 z<%$?jAJHSy+|#v2211(9Cz`9eqetGb9KP!3A9j17u|mhP^B5k_Z|+$=j%M2t884KL z_B+w`us!h4hY2NUXZ0QBgsWx4Vm|{39y>ML^>}aLK>-DFyT>fG5Ct0E|InlheZbD8 z(f!0VQVEH2{wKE~IwO~c=1zih|Y>{UrcPpk?`LPshvlo@VrE33|Sl-@8vhB% zm_N(20Ts72a(MhRoZe9*_F62wQ~Vzq1?}5r=5c`3lwLl{jmmZ%6qTD8J3FPo4gur= ziQ@=>@FH0k;w3*nJ{K?fqPB8x*)|ZnH-c6OacwMroIl9ODBK(1} z+FBs)@|*u2yb_1COWOT#uj>6=_}vp?#Qhq{nG^wtb*`_*HCAw_!#fvmj~puI3UvzJ zHG4Y8DmkzXFFRa_{5v7Y;5{J7T_?9Y;lJbMRdS=ucY)yeMlx{dgBu(W{R(+>6{2N5 z11n_FvxI`a(|Gs9geD<9bjXB?rE3{6Oz6Ad=$;1fxdNC=PK8|XCVv3md}sgZB6f)E zfG%#R!frQIVT;6#)ZL0%H#%pxoZlcu&X}8#=j_!ubV9kn`VJpA?D-C7NY4-4*R&_ z4#B1hPWde0)b7}7a|Ueo^8ETr-VcMh+K&V^@h_#2(|dHMfp~q>wodA^+e8SXUO+|XZ?Cl{CXyvVLS5S06O*T zNlHHa)`HE&YS?WSpiIJDz7u7iw1)+_0%5MhuFXLJhBM-Wj=t2m{Y&K#=!)BnpWfFt*XKjfVjR=8SK1)DgAi(q& z6mVwokH&3h%Rf}f+f>PuCp$;*{LR_aW0ZD9xxap^iZgQ+FXyK#%`55s=V)9(;cK`G zIQ-C4B^In@pRq6P>++Hno+_c<6OZz;60Oxy!jdtY2g1X&?&twa;&=Vyg3btv!xmgA z(G90&OP25~yI6Mua*036-XVQ+ALa2#zdQB8NdF04&jt0+2LES&ev(T{xRw`*KzG; znmPdXcSZwH8RsqmjN>JR>@bgLn3zITy8t9N33qHP-WUK9ud$ zQhsVOR&zfR6?JUDNPh8(Er@gQI`A!Goc?P6MyMYLBlS_d_%~|3Rb_4Dm?8d)empa! zd%E-2NY^1Pz@lUpr)3s>xPhK@Nd0NnqW3rOmgu-+kp}v|Nu(1r(tm4mS=jFJ+fJb& zch>XS%+3gpa*HN5R#}^fI*M8%%yPDMRpm>>uG2$A!fd12i-l*-3`B0!QC;dg$({!383exK#dre z%B&y|z6Aa?Zk)(g#M+nfP;GsHnMq2qj50p?sbj)pnMJS2a$4!`{HvE|ZB^xGM*0PW zKD9nI*`KpM&-3W6&weV}xprtdtMGH=9#(;fJTF+}d7@$*P?^ql#A7 zi9e)Cr#`XN7Yaxtq`+W7t^%z15P6m%{XrQYy`^d5ThKiQ%sCvW5F?y?Na}lP5<U{(3P0#ae3e{5v^We|~y zX3a~(RLWuZvrIV%LP2b2Hd+G98xdXl@4MDcXcsWfvU;QhHBKw z^O&^-sxgvTX&b%<9Trqy&xWfg(j1}>&FheKx5fB~n6)8lz1*_YpN%377ZOg0dDd8D zF?h9LntFcD_xbM5rl#Tx&Z{#gIOL!r$aa#OD?;Y&be3r&P24Uw=co)2M*0N627CX_ zdjo}16vDCwdNtfNaL3^b07gS3>`VZyq^+7jTSv>gOvxzP@(Vk6sQ`?UfxPs6H%>;q zRCuM7ZZo{voU=m~+B8P2asy*XbS`;F<%4Xe)(ghmhviukC+J*YCX~P>b$n|i)G&my5h zV9s4cxtJ@F(F7LT=s}6g=U%%vxi*EBQH(@c{7Z%%o#>M*E?e!H6SaBNYKo6=-^cf% zuc-B+Beyh4IsypHKi9w~d!QPl+7oqVSoZf9ox>=N)!uCc+LJlwbaisCJs{1s+SBOL z`4tbWnY+vXngnnP3!3#dZ=~yYsP(&HV_^N%{^Q)h7rlLf>CP;kJoc?*4(DD0gwU?y z4$jF;IS3cMmAl{>GFyX3zx1GVIJo0O$u)2&V8tf5z|zr(daUttJ-F>hS>YVs`duO; z(Qy(8U;+*WO4XUYv#Q8}cJcEE7_%{v6z6{6d!^1b%+jidXYY?CC zlhM_w0e{!3eQ-Of^NKf=YFi~_gWmj)b_^7MrbtkdzeS#*>?;q;af$ct zlW~_!-2i4(WxNEq&OdqG;TfNcpffr51MR9aK4*Ef>l5wQo$*l{WCv$_de8Ki5^@Qg z@u^XkEOo#^qS)0=HQ4U_GlfN5$U=-nCclVZ2lGDXz_U|9MgS#$H~3bAMBZ`e5z#JTz*VW>)6)A{(gwG8c1Nj{d6Khac&0}3Pwk!-Y7 z#)-Z%9$;Ff{E1{|_ZyYDW9tS1TxLN(UX8Nu_|FFZ+RbmEMrX&}C6}-=kLtT96SB8( zQ$6V{z>u>siuf0{uj4M2sv-LLCi-Z?Hmw~dSMusi zfJ>ljx~SUwu>R}JZ73hln%3JSwJBC&>O>J!-`f(iKD56q7hF);0~IS?X*;}W4uwv$ z?*5M`1EQfule^K+ehfa5^j6D%8VVT=g^YrNsZSs}hv0*buEhHx@L@KJyXV^z3e4fn z(*v7MzD1$X6n+?XT%V3}o5!A-hrV~(e>q>#3%BLMRRV{&+qbxzwClT`D|JUrl8*I+w^O4nJ7)nX3=r=Nn4PO|5F^@X4L2v+IAz<^ z`@oxhdGig{0s0W66V!4nX5iD=d?8{Z{R@%(b2OAs(eM3P5ZTR&r~=mE#%|;ZStCCv zvd=tEGoUvWdCTC{CE34|ilAlgr8MbTZ((;8LV`ns+U}o!;5L>ArAeUlm zG1RzqsU(n|vs8W6k%P|4=Y6^0wLcZI_Z7U6UHD_Usm7JnZ-Z;H3vXHKN}L z0S@n!c>cCA_i=g7%WK9Rw4b+gj2D^w4UX}~uPi*mYuEhB-#N%jB)ectHfG;;Yyay& z4tysf1N+T4r118!n>`XcEr1Xd6%@Mn*ER9O$YnE{o5-nwLea!0{A4FDWFj9a>ygl?Edou6q*}e-D#vPTAF9dNb|I((UFhs zY>KoUT}h(m8;{Otm|pC|@D>@`@H*}j>;Q;$r=TxcrW%J&iJMq^D4%?I=4Z z&h|&C*LtNoq|{lO_m(|>%`*pD-Hm^oRXoWWU91x#8dZ9kI~*@3fHw-y@Xeo(@f0)= zp~KwFX4mQ3v7nN?h3PFx7=~Uq4Kv;jGSeqdR~7XpvF&iabMbjGV&T z%So*AN#~F|Tmsbl&oJ&(EZBbr!8Tkv`{eij&-eJ5V{0Da?(U(gTTO)?sS)hpZXk#pN^B;HXYakOW*k+ODc4%RjC3KmY{ezX|&rHXX}C4GQC zHk8|$%HZH{t#_MV@jHqJIMN+&1;JHdUt85Z2lRG?BJ%C6P#r(|l0-6y)GfkmuICwQ zlgq_4o{IGDj$@dN!`tt_p6L~^lUsWR*oiYkwrZWF!2~Cq^KxFsS8oqa&%=f-M*G;1 z`Vi5dBK^O^b9?#n03(GBC zE#-oEQvaC0bl2U+r%cJyRL+-lE|m|6OgHcAp^cHgcCjivPxa&{U-12@GnUBbJxQx~ zk5)1OIds4ZuyEr7gLdTH6Z>@2rEu z6ThMD4#YigUVpl@t<>k6cbZ_pg~Fd(QOSUJb9*6fXpT#}812@KpW|zJM?&;@;-J^@ zIg^3__4PYHZ_UMEU%vKq@BBh>k)*`3z#XYu2`WGg53dQD;on19%%Pdbb*|c{0NZ@w z@lh$CDY=wJauoPSUgp+^%nWLA+zcaGQ4l*`oT8Ogby}}_j`ysWmSBVIO%?(!izRtDh5*4YVeHPidJtId;z`w^B;dzdge2q$vGgV@WQ z_}kt*oxN$PL#o`w8M^>gUf)>)a>RF_xL|?3vHQ>WfRJmj4(M64EnV{xxV}av&)!0DP@eb0f~zT@>aF2x_P-0-D*_|G#sj@DwZ&;)#>2{e0XT~ z>y?)V`caC7?2oS3Hn74@pTn)pCZu?fP6pPTD)~J`U(mGnZ`zl!%riv3Me>2DkC1)PQxE8?-&%5?9vVzzSwQ}1l{n- z?KGU-L&MYUN0RM>qKn%wX+mVga#v6xx((>C;W;bosAiAppzVi{k_8%Ets-qtZl~?_ zoTG0aG3KniUE1DuUHjucgSK^of?DZ%Re@MY0kgvVi>M`Hzl2W z*M$VcWK;m!QwSK>dZ840r>e3xtW*j87@2g}DE(NAw=)^I_US6GnT`>%=6}IUu8kCC zK{x`U{{H3M^ht`|^pEHwQah_$!p+VvC!T3DamToTyGv1Sua6EHN4D1!k$kx%>hFcFWvD6}z%EV$MaPe&{NWhCEci0rxX{Rmc*;IO2M1PR-> zvlqv*R|AUmgglWI*0{cbqHYYCeHEX%(1CD_jq%w8V-P6O@^6^`ISkI-4?KDMkyqf_ z$?e_Y+@4S~w+73b%ZRycMBfY|VFP;ifKkhQx-@D1#eV2~oFbahd#qe*F3zBx0=+qg>ULo7nx|7lvICgtWfCge2*8by8UHHNnS>J5iht)_sb@cHhWqs zhZ#5}x4S;iCnm{!0GUE*kAl=ZokJi5`!U@Rg%Wd-S|6t!p8!01lTomoiqJBO&~k$9 z08uS7C0A3=y+GC@pFPwjNyk@+Jl~)r=Vi*Bnmxa7NSmL0+d7tU0>WMwSO#qCYvnnh zzUhE4GaHkDwm^Q&Y68NDW;H=4B1k+HPAS*+mY@21hVv5&u(0(2Ah{*1F<>9U_8?D* zFI=OvSnoz0uGmqiKwQe_xG9BMk#1CFjvFVd?_GrhatsmV@UOygi@p-I-uAA(Sw`ic zCZ>aCdY`XFT{mc^CkyBcw@SaNig@B|e5k8Y#Y>66buOemR7Eve+>mOfytg|sSyz>E zMR?~pincMb3$~I$SHRnm@-(PU(N4R#mQe)d{0*vd86qmGiob>?j`Z$uJRjzuNa}t~ zQYY7yS3*w$D>vny^8hV)F#03EW7%@;b&1aTN~}nP3VxuxE=h(e@4Cy0qz|Ug<|L+j z8p$LQYN^B{SF8y{3U=*mRzAmRq>UzdH#oITQ0Utjd+d#8i%0Qu!a|)P!hBr&&+v|P zreo(yp^a2=_Mv=KYtvM7l^6SG=LXajBRw&=hDz_%I*w8Or9JH=wVHBr%C!R=?k-H? z4m~`&v4^V>Zgf}Cna@h0w7CUM>vfmP@RZ0R=6v*=M7my~zdf6NoS8gm1mD|8-3#=- z33X;zF-4tEDifYhov$nE6z^@2I&o)z8|vJ}aNAJlnP=sw^IsGYGCUI))-D#&16`_` z2iWUczSW+@vsie*{2)#4QZ#8Xnr}gqA?Fy`y8_k`O_MjDlSh+>1lLp1Jzo~ECWa}g10 zE~BSk{V54qaSA-5A89s z!8BjM$QFOuAtO5pQLRHp_Di}@@xp8VBdDbEH-jiIy8@+2w!^_)>y5M|`G#G^PuIKu zaF!8nm7fCH69k;kh!)6Mk?bKm!oCMY8RLyq-6D*Y-ony47nrk{3`Jq2PBAR$=iEtCt1f^gla++J1dAmUhOpdkx)yu^O(rf)`5{^xhN(<~(~#KqmMGK|id{ zPP<#ByE-aP-xUNrn~e^g$?qqAg}V^({U|Mx4&Oygbe_7IX=c>@uR2!8)hY^{QJK*S zK7pFPK{q%%SBY>Y(yG7o^Bd{NkW08bUh@a86==UxVDMV;p8~4$^qcfA{~*IId7>d` zw7pPXemzMT6mx?r1`Gm_IRPoR**f2AcR&L=98k5KIn0#&IB!4$^vivD>1Qi;4&x=P zNwz=nP=9R9Z%nV^o?oJx+b~1gAULB&JB9VjdbHHV6iQF+L1i}4>awb52 zhT>;282P365(mf>|M1MdMvc##FoWn~n_VoR=v^}Iwf7a8{(m})KJ?dIE$2SUMOR|j zlD-N%ns$1CdwFPjwL&n{9 z3_pssGg+V4s206B|LdpqblT^IV!t7I+; z5cFra9M=(Yz9a?p2JAe71m|uqzrMkL-NsX5e_Rs~D!aHq~PpN@)7wr(L z*0g+LMN1JH6Cb}vtQSXp29Us>@sh#6G620x6la}*34K6PKBauH| z6bxO3tF^BMq^raxpv<2xb8C0V&hKTWooE z0=|uG0IqXJ1I6C(NjT(u$#h(eV#^U7vAtI*r1PcsU+uhpIn&Dy23u>Ht$i-rjX7tz z{B|xAo|yY&1U~(fPxbZn)RNQ~DI$@^mJ{9_D<2f&=EdPLewpzTjEbuA(MCnAe7sRH zwtT8laYwl{Y*gG`Ua$T>SbmrK`$YMp>hGfRM*f=FRQU$=cWim-N-lE5_#EPI*M9Pn z_Pa|^aGCt-Wmke53|NM-EI6Kcd7uBzpxA85cTn1YwTw)HbUPRstfBY)a?p8@oj}6& z#|YT`|Nala@AZ?yvfwWKtnECFNDyI3&9pzHY%sg0L%HLS# z?(**PJZHJIy)2jSik8n^)&pMl@0P!)d~}RwgN%nk?UM1}s-421k{@yL(xI2%Bj7DL zI3j2)>rY%0KJ** zn^_L%FT~$7eEMWFThb*lFvMMsW@fgCVy$cE+xNx&t7n8dR ztvC8(-mo7>+?HXoOHV29CD17YFnyMJ@<6ulx~3lDXdP}^Ez@qJjiq!;v#;`6^<&qo zwr6q8s?}U=ZNSf}nztukD)}sC5NgTnsJQIkJwmF_lT@Enu*V(#RclKv`7-o~vjb<* zxN}MX5H3K*nb~f?*c5u0I(1q5V`R zd1I}Z@dJ5U^l+)*Wq+E$*}J)$T0+xW7C#W&(~Yb@?}BB1J}wH~ersu{!WXNo;&S`J$0b&xxSY;A z<9=Ky1R66&Zjr-IsR6QcWry7fMcK=^TTu>kvafZ=XChl$X?%YoN6_umWjuCMrWCNp z6XI7rLerM@w*GXl`jpr|Q&rxlcW6r}G%PfnT{iVEc#}tk$I^=~Jwul^^GhcN3FU+q z3bf7ap`9r1JWPEpC*+qk(r9Uj8DBbAsUAvJ+=YO+k_ZSI;7h9`@yl@LhxB_%;i%u= zFYjfJYJ$#1l%2$Xe*Wyp*^#p%)(eqwk+Bi$i*bVMP`d!#%yhem)`WFV%ydD#=xU$- zSWzg#R$NlK)|ht%oo6TSWJND%ghSy=2vt?QZ%+8w48O&q+84i81o*hOhH_?dSP@ah zKxi^gMt|au*tD{JXP?|N6m5F1Eb`3uKX(d6yDYaCkxtW`u!`xI#`?c&cIx)rb8y>5 zU4EGAKBDx8sq&#+mzq|$242d7VW>A>!UeN7y6ru6LF1+pvuSg&nJxa6*piw)?93&& z2yIm*p}K0YSC@OqY?5-0lsgUAQb9QqGkv4>IPLb0+Uw+%;{wS&jgNz0s=cO7{CbJ8 zoyComOkfo`pu*lHO5zC~x!vb4z*}OgW@qB%rBBsr;$)wBIxARfShilmJN^KoBrAIu zX|3IKyZTx9-JGVMalLFL`3ZCFb}4U+^xqW%b(=zYg*g*fhI`ON%as}*mo&QM|K*Kv z>p%GXo9$xG64|E)Ua0;I`+Nt;a0-R(IX~D%{#wul+;iz>UrP@Tu^Mdc)_SMcS+cSy z(S=3tI?)Ql2j(mn3_S0G$oY{AA{Rz3%Iz1_TJ6_b85TruSObH z_2OW>d#lEWiZ|MS-9H?9iYcI!Zx0()`@?OP_p;UsC)VXZRpsHeT}|}QuDaG4Y+O>| z;6^F#vTY$ad+uLLL;csmYkmj`Z@OckZhT^L&;bcUSnf)`OT~5D)>&)w8UDgEnV?Z( z4h!SixH7y9Fx*cA?35KtfrXh|)!MQtut7wjmsm)zJNAvzP>tfg$r2fE2Ia7)>WL?Qcs ztpLR`CF58TU?0u&LXNRs?;WD=#HnWH*D_gFWPf)>&Mb}hS1XbnHf*=7M^{-7BW=r2 zyQrUU@zbps&6LKhGu6^~nqM*+XVnI|idIZcW67q$&QaE$*44}2Z@fgRBY;ncw`^Tr zo9O4Z-2r6(%8eVLxPt5z3bIoGqyWy^a^5oJ*>Bv?g}H{RR6{4i>Fw%j=sUMiuMY7S z$|)5(&3$SKe8TDx{IoXrspW4j#&GZUc2XaSG+JtA`mXq$NRStVWHsK=t8scPlgV3+ znjvSD#s|2o@yJ&)?`~Tn#^3uJ>8E5l_SU~2=C@nb%v?jP*BM;16DbZSPmg!+PrAlt z`_T)(6^N@;R|>>a6=W`h&y)h+3%(VAcYW!vQ~<#5jr@u`0V=`vTE=ZB2Il~LLOv94 z2z; z@YAgrvqt4p%c*f_1Ib7&6sV9-E#0XZv{Cf3-#`CbE#=Ie{u+EYYU!72D6p6ZjmV>x z`v&C}Q^KqQ)Ur76seoGkocrW0CNwjKYagvIeaN30%iPqKIQqGezhy^|IGzyDyToxH zzg^NNSLQyoBm)pWFYx{$_QU`G?R#=jnx|RSEBi>HeM&@!sP&a;y~0L~R@#5Hl7^PZ z?qse^mCK6DfA)#5Bl2WR4$4ZP!w0IQ=(Le3s_zO%4?R{H)Nyf_K-R-A;3Id`B zZlQ$ef!p~jdZ4n}V?v-$zCGq#&op7APC*f?Nxv80C!+GUrmv-w>dYm|8e_~|EhEX6^qkThd*zx$Kky@>Od_^)~e$epEpP(U*U}(xtmpx$4>2x%q_&S1u zTQ_?8w|(_*cC|(-m&@>H^|Y_iPsWW8(}ujGoy#9ncBR>mcmp5Az{zyXF02Q=a4buJ z*jc|rptUiBHovquJEwK`?%ms7`r)eHwfq-%@UdGTJOe;OO-}dwYik)-RTJmmi^%@+ zQV1FMjZS98COehHAjEnq(2F^e8p<50{ytbvLLZ)=C@RPEKu(PJYe zNlGyST>G#${mSpFb(<<+@z!m@7B`&v$n(G7*Cec zBJcOr?-!rO`#!w)*7r%)QNC|KL)Ci=98eOD|DAEj_c!(TL#16?^_k*BDCD(&ul~Nc zhVQF_-`)DZaqCO__XWOl97tw$%HIW8GONs)%<2WyCoP9VMn-Bb9Vt>mJ3I|Ei_ffv z2B_8yvB-L2>#_d~?3|5Mbm@Wfppw1MxUq?U)9WaG9i@%bXnLQsvzC{Mp1k}KFP)*h zbLIZ*z_+kd>9Mq8*>$Srn{VG>1Xn#Mw%9ce0Rye|?)c}^imvmV)Y;b`e{$#Y!~=A5 zV+-B9qDCiO%ixzX6KAPD>p5^XQs4Ux*`YmT;Wl@FE6|3Bj11U#xD`vdKS z1cJg`L{wbRh=?FAK>>+?(wJa3c9c;N*Kq++M@5v5AS#R9O}Jhg(GkTNRK}4JcSgl+ z3?!fgR5UP(xU#6wm$)D*1Vnhh->JH{@9pj&`u^{G`9A1dd)28^XRA|H(P4~DO+g4X zO+gP(3)XU199>Oq9?YtK!C9GGRBo)R=-H`j8R#bSF-jHSLD$qG<{pgPG9N&p<0bK9 zQHO#-$tn9@vlKnsHj&JodJs;5{Mp z($x|3DuN|q-T-?!dHfF6}uCkMAK!E2>=AP|OmbivUWgZP{!N-&Tx z?QL-Q>aD+Fv607kQ+J$S5C~4*AdDU77SV&cL|^<*5LDh$W);5seNQUl=pLhuL<9}M zh|v!mA4eP8qdrvChCi;(>aijyL6BC2D%9g@t*y>?h44IlxEs_G+-5(zb!G@c>33x-V=4xGP{NI#|T7+wo=1;Mfx@qbFnJF=WHWNU~Z6UAuI@ z5uuX{jxIq@ch@(xoeu0$Jx* zyJz*>XyMCSrEX?-y^H`W1+>qm5!$uSDZn&5@y}+(Zyu=v% z)g_Ab1Yjaj{-~F2He$8~hCb?g)x?hjG zUp4O6?e5nb?$>I3snLvc<7VNjm=nGh@Bdnb2b(rAN)0G1f%O;!_8opuy>juu_rblE*4Z_X4!O6Q&*+g7x zjToaU0OPK?h-Tc0cnP|6kx}(^2OwMCs-V@bQ*1|x5&OOca@2>L!NwEA^S&lbn2HkO z_Fsrk@u!d;vIcxJOCnt%nyv}eZij{b?T`W!2m<^Z37!y6JjV~LfH>S8*HF9%-?`0* zg`lw>3=7nu7%iucZiy2+D-Z#p;u`541T$t-q+jdk0E{fJADyr&BNmoyHooW z?c~!9#?%s2u1A5z&k+#Z7*9A4UXL;hVQXyrur;hW)OAa!c1J#;Z!QX3XBLOMo!LHA z+n66JT@-DlXTau({P6H4uMwLC}EBo!q~bzn2M(+=K_@GiePMQUX5LV*&{^CtbqkcpPC#ki8Xd} z2}O0N#nj|r`IOi}@>y?7;2H#smj|{+MMR7;tGQWQlWKp(VTQBYn8^$95k1D4_nDmepjCj49CKiSG4&?!diGei zX$|bcbM!}MWN!y511@BQ7n#jfZ#43jl}g_|swD)BBxR29aO~%`N=#z;ycMW< zay17^@^9S3on>rHOyVm9JW~E7!ja(*GsB=*-;aUa6!9X~z}|zB1#f{EfbYN=x$B$U zJwaO=H&;MdJFd(+zl2Tz1Cj-8acEzbM>Dlj%!2pL6_L`~n{hKh>-KDi7mFu*qXppR zfZgprjy3LrvmGO%$3v)`dImb}lBClSpkxSgxdnThRktt^_f!><4yzeU6~`JcGOFgY zbIAkdltGaJ|Lch1z1%JzeCWqBsoDr>unMN*RD5DC8=tB95~gkl!i*=%Avi(@iE{`_ zEK&!np!^_6+(RnsV%cj{P<{|3ULjR}5F|PwC^aHT^h1!byVs((mmSHz7w(TGt$SM5 zwMM*Qu$t?U%b7vD6l-hS>e$=GQ?Z~17Szd_0ZamRB_QG~+eJG_7~k7%zlIMeT7&-u zR-Ekl=s)?>@8-{-U_TGekQ$dy?WA>gl{`r$$C&&XlP^TFRCBXa-?jJW;;oxiJ=-J<&I{_d`EkXj49YnO-w@nE0V2R*jJzeJz^)mVMEZ| zYX7hu36PyPULZb7M&cRv$XsHtMuO&@V{U4iZ}RqH#WTnB@=@pL5e{WejC2MWXPt!J zZTvv%V|44+s@5ytWy^m-q>|3z&m87vd_z)7mFrUdR4FYC9Iwi1K_GEaqw0VAtXk|= zNYX^y$BNzqmr|@~Mv8y~CBnvEJ{F)64-s!g4F!CNRTH>iU>gt!4WG}DhgnYy z7m$~gupYCvP8J6y0kkYhbTgC8AMA=}I7dlkmm?UcyaG2*MK1}b1s%=8fwQa$x2ka! zr_QZ#xvl2xx+&Do3`P|$I?Lc@V-W*xB3$e^4pea~hzZzl@izlJ&@H7!2Y&-1NE{B1 zDf2OZ8&9Eg=|Ob<3hPJ1CSsPuD8vo%G<;I40x-ZU8V$ErLLpSUK0h>hha$Y60Y*@8 z4^Kmk^j6MK;SH29X`?Qctf&bkE1^|50upYksUe6{N1dkb!~x)Sw~a&`-6B%8L|+94 zUC{e93|s)v4wxP_#u@D{V_dP-H@%y?6hO2Wxq=;b8?p~WJK*Q9lcMrTuhJD`uP$pQ z*kQkbwnKa&dWOtmt3&hwADOa5a}+^ps(kk^ylxM!jnQ7J2>=i_1ti1b99u>#+wxp! z+lmkbWb~ULwCTbi{p^Z<%15#DaS%R2$=1(3A{6S^Swf-eKLQDQg(PUzub2-dm%%=r zmdrxdI0!B>L{N%feVj?(%z=ZkrMt!)3m6j+bo$Q=HiINb+0A86KQyeC{!ITF-B2=~ zh}oBc6gwoti2WI%y1>zdC4^qe*+6X8iYIwmLDP>PD%nLul;WEyh-r#r#MUEJ7dXmS zd_Ic@#m7jzjl@$8;!CS|&8_`HmNlEX$&yu7K?wXo2>hz5W8A8O#pa4KxJIc#!WX4~ ztGWG+_+khT-bzlA{y3F%lKyn_RN??>g{q-AdZHH?|CZVuorA{ky1?;n=>f%fgv#ka zY+RcXBi8TCJ8NWS&H; z74#$;u8jD95H%TunHtm_d{fim82bn>zImQAv{-KtSatVKdg|3Z&31omHJ zj#Dx1F}kAk(4HvSFMyWR*uumA(D1sV;`H#~ER#9BmFSJrizWDOYIxS@A~?{}_%fUQ zr}lZI)a?vzf7Y$EPl9ehadf<@H+nM%p;TX^>L6ruRo+^oY8Pq?=DlYJfAp@oXtA?k z#vE7|pjpO&80xa0gJiHkB39on-L%7-iUf9GUz4q0 zdPpc=vzbEqR;>i(TS3bA87_{R+s26B2#a%iDM!mfR#0fcm{aQl#V(YB#Wv1~?_MCw z((U1^=XgMbXBd&g=KFw-j;Trgy*ir^ek1Wcv}^lWW+RDc_-KJFPPfwG{z`HE>TY`? zb05XtKu8;)GQeWMibfzQ_$n58;B`=ifOrqt2O&j_2+ZHs$^Qf-FuMn<5(0-7rALsI zIc2F$XRFbuNM{~*ve0gzhhpo66I(m7PvXC5FUa*^`~^1$BOsW11j)ZL z`iwcjFStgmfZZ8vG2L}+t|tp$DMr69Mtp|USq~(-@j*eN1v3PRYGJBY?DN5`J5_V@ z06-j6TZ*6E(TiYS44{25G5&za;vK;PbCH>#H4jE#WzRbZFNP)$7;=hO^r%TaiBG6d zuIhxBI#3^0H>O=`+PxNb)_viH53e!Mp#DW=R{zWKI~Y?aJut<{2;sqaInZ}vG#amo zj*e9`Dex+)3E-@74cI!nX%FL4vc%M=JKDX*I#+ddhR5uvy7_D`x10G+H|rAPoc<{r zq%1yd>11>Ek3cpYdGZ2dptJzNGnOieHMTUSEJsGyJokAkkUXDx&Y~?KL5tw6hizM3 zmzagGVic)M%+`&o)XCM%Q-_6c%gK;v7;v<@uzG3FsJaiehm*m>T_syTtQXFssK{R8 zItEM^I6fen1%oGhx-ggkaCoQ6z6c||u4bQPS@U}GI_sq5g!q8R-M%BpCJTlY%=0CB3y{U8XVS?esUlF8^qH&zvgwS zCwL{4A`kW+sJ#Rih5#d+`mZM(%sCVjaepA@hBhQ50i_mKm~Ta_IUIJwVbk>^okrEo zkhM^-7}0#4H&z#lG?P#$Susy82il0+d{TYE<|?eKibHU6j7hC|L910Kid6qZ^%bSN z#@3vbY}d<`?LXx(VvEFr5=ste6NW{QFMqlhBa|J0ixC6>QFt(|0^YC>>OO>2>*w-u z4bx@}BY>SzL0x6AjQ)gWf4W2nE?fCPEbC?%(+3r(IWVd|09IgffOMRnhIQ(^54NIY z@Vwp(4dG-dA%_bF1!k7OEMi?cFH*W1j`XWTuRf*z_6e6RhK&frIVaio;&AQ8X0GAr zOGMIeq%B4fPAs(+a6hTrTy2es4obFrSY{wCDM#=q7TT`e(4ltM5m>%j^bY6Mrxl#k zvCs4TLA6YvrjHRz%Hcv`R9N198IXW84J4S#p_tFk#Sbo1)7DBfqwwJ!jFRpiPDDX`9bT<<7klE2jXH~ zL7am^l-TGzQ80=2=24+HLvZJ=d@wxx%#xrrtOtf5GP>C=uA}I|S zm_K1wWGI#l1yjZGRU~jMV?FO4u|!vgU8dn2y+0XiY-Zr7E1eSZjA`^5!HteUkJxrt z|9?chxfJRNJq}{EMYtIfAGi%aA7jF~jYVxLO4nc;A61`W6}%d2ES&IsKRVzWbKD7kLi%zGRe4^-*6}W zJ}lXU3?)O@k4*MPw;I;{J9K&(d5j${a%mr^ifm006Y z%Sq<=BKs&$)^y$CI$0*ATAje_{t zdPcOM@`zBf_4(6}14wrC}zoHmcfE4B84|1p8J&jD$i4cda_2Ui*a&Tyw5!-+dpSYTtrmNv95n z{D&r~_T#1$5IVapGT zo|HpTp**Q_sobGMiQVj+>86fV)nS^s_3Y$|HvpdzN0Ml#WH`dq&}5niQ)Fs_4wVUtx%-2=Z<%qY<8kFX$O!d96ui%zqY{IFL`r)Y!^7bDfKplu^EB`Z%D(BEA7lc zbFQ?*>jX2Uogh^?%zv2?rgH(iIJuhtbHl=zay}Aa^rd(Mqc7t@_7Y}Ni8SUv&sAw z!v1+RUhbV5eTo@o=?!m^XT=SO=i3(kDkZGGXP$bH3(p9 zlUVDhovD&^SBDRlu7 zGN$1mqS0P!6c-=sE~$C=)T?+pCc(Rk^TmiE8id|tf0bqmqg)gLO);!nl-eS3*{k^c zpY$qDb#>yC4PNYvqfV_Ex^+@P+yirprz^fN zjUeo$x8iQ7INNau{Cux{hwPVV-}3P{=pfgQ>eE8`c1lsU$+?d(M?(#VV>+0U9E|i?#A3v|p z#sdMVpQHIu-K8?1CsZBTUt0>;D2nFpuaULE{Cf{1VC)|;hkd2#UQP6PRSO^i2Wced+$iIy#35XO8bC*7vVKLO^khMS zlKGYc0l78;mww{I!;P)D5$M7)y%9JD22;QN)2R9nnt}~fIMIEDn4oK2B(rFJUBk009|%Gc>OFKVl#*-Fv5q zOKT^Ixb)?J9dYTkb=tbQk|nh<^*H~6r!f^*(Yo?TqQkek@`q8#FCa9m^zL=k97f0w z(4KZLAmrZybQ}lb(~v~@#~zJ-=i0fy5Ia?}a}R@xvlAUZmXTJHItI4!^GIgQtq`HZ zG$PV0!tJe~99LEbZ8+d>#mZfhxB!X8M&d^VSSqneNXQVxf*5{;Dq__vUt}cSW_`)v z&R|_|r`kLblSTxJemAvuI$ZB@i{ID8l32A=6FmkMM?30zDh~!*q$#AXzp4ehZCJyM ziF6Z7OvJ>o$mBI>RDAok;qHi~K-IO3$gAhsN?g1VTBI%O$`8g!^umI$X3&n3_jXq# zsu9c(iaVpWc@v#gE#;omvVLE2%z+Ulwi2F#3MO&tAmx-?$KfNr zYXS?W?579yE~`vy{Q2jWWlVtA@2Sj!2Mx2|#&1OW=mBdOqQLc3Mqf%EK z=iU5#Fep34?><+weIxOG|;uA;D|FCB>e#C%?!l=@*<*Hmo9Lzz`=uWANhZ zg+kUHd_4;x?+^#1hxi!a9up&Co)X*DoVVqir-z$DgBn@IH<1H(M|@*9&xjAe`1~Wr zO+xO78)PQ_z=(@k3Egmh`jB*($b=a5X)3-h09p8?E$KnwnEml%lrL2ig_j0O(V{zR zE!_aN>Bj>omS7XkQAbQ%q!WtaQi^TctakTeYuG%n@>^}zhBzs60;eWfUBo~*l`j%X zLcc96wfP9ZEmhV5{Zvq+Y*cBxMwvN-v^ur#hF=^8?W`K*2UBKA2KxrolV0-W-B;TC zB1VS3{R92686T*ZZD|5v=e73w1a`&zDb<&D6&f@qG;RMSkyyI{RK8NSlb*jpLi7fgbpkrUy;YS`sfm~l^+9guGB;`Uqv(WtryL-!4!YP!Ngz!NHn z+RVhT^`7U$C&>VmZeS#C1zTqSr~Z%qrw1S=7#nt&;Iu17KALdGV8ng`X8E^Z-EsUE z1qF1as7^jg@F5t2cB?pjjm85F=F2K`D&O-oV(o+1O zu#0QCuFVp6_&nKE)ABB9FmGgG^!5iabTR}~uD-rVg0R+ z=Ea&%Y9Nj>2l|Q^A>{E*2o@W08)I_tJ$@$xu_gI-SLsFC#X&?+%ORt5fA#jlC8N=? zn)W(9Sc$8~bg?l5JuSm4qML3tdN5m5q&MGw6b%d5+O5zZ`{DyT2po~UyB@>BBK;XM z6&70M8^q2{h?FAh@Zl2Ul`4yoxI!cGVx&6tyrSySSpS5|>R|nMv`eAh`V+P?F3pCbr?@~k-n+tqMWlg`8@$|JM_|1g5f< z-E4T@vpDHynQqsJKZlue+BRadW!{Pzr~Pi+#hK@{KMU1KNB)KnhrsDkPf*P}fchL# zEPHS*b4sl)AsOP&Nt(f&rz0oU!m6>d7LL9}))1~J)J+j z$6;RrtO!Km8a6+LuZXdrpt)TKuQko1mF7F~V6eU&C1Xy`7J~mFd9PtDI2?t1AS_bT z@Pd4M0unQ1;dg$I?tbDyuI?T`*wx)@&={7XWAUy_ys9JYch_JDJ|_gVvAqYo#k&W( zO&s|fO`u6!9E2wJ&Ybf~!y|iRmzi!yF(F=*d+1MIl(P_OLPNM3Nffp07vJTC5iVk6 zH{y48qCCpQVn9& zv+xb-KL-Mi$jw9X;pOVecQdHjPHUukms9;w16p5Y<3hhr=L5fo3ykL(5bR z211H;cuv(iNbG(QWeH*&)j&xX3RGUzfKc4yk*O!qy3nzA-liZ)&~nu&dld!c|Fj_W zDI8RU9}$$14pS;mFUCPGNc!_m{tm_f-NlZq(0#VMoi5m=v zl12QE0uLK}LO#@a5K*V4o!b31EdcGhT zt=af-hO;a>(UDrmRCS~z9oFd~{#BnJV`)2AYe~~p5V$sTAV*&C*a!{M!+Q zTcR53eR3`>t*SbDU*jR}+H>{3yRle(OK>cfAhe4%sMA3bJ=`ZdWkF{q-kFJ2lW%}d z9fcxk&VY*uv@$ZLM-zJ9caA9eXH+BWB!mw%{x>9K$ce}K8W(Z?P-OP1WI2?=2hgQh zHK_>t_Xq+xltQ7DIZY2sKJY4ql21`oM=6Y;MsE*tD245uEKMtgJe?(@AB1O}fxzpo z7X&W3P7t`+za0c_`7XD&HLxe4-ZVw=>kY+3piH^F3uNLc%Px0YE*`bGTb@b8! zr8m5Ye9n4#0^iiD9#;8`!~V6C$Fk?j^ITQ{BUYL?drg_Q%KoJ!&SHMDbv zh7T+WC5KK&6TX8c<U`srVvqnCLR zen;>$y7|!Hr;qR9LaiU4R>v*jf52?9^*Br`_Sq$gOA#(e_N99O%MC#}GjRbT)5ju* zs3JImn{0(VV&6uf<d^jF~xF9+L_K=^rh;K)~1JUzX z^fZ4_oF8qnY>wMTmu0yrmo?qJ`M|-n{V^NqaM3bPz^6Aa zc%6o5p><+|cLywHGla08(cC_Bqf;vk;(>;_js|%zq5hGMc1tyqc>TaY7cua_CJt61E~LW`g^1=-t)D+lt2KA9@4-h#+nmVUO@HvUUeAjbfP@_lxRBDl*g+_wk+=aH^5oTz zBh}f4O3X(*FP&!WS4<` zg^!G`)9FjYsImuV<%o0#R2An9Z@ef>@} zjnWnV(pcn8uG8bzJC%|&+K**b+7RvlDMGv3n8#w-jku&r{dLQfEm1+oK5rU*{YC-S5xP7c=aSFHO;G8ox`i+%^;De zp*F#uXN*JNu%R)UKS}+Q=F{6gRWcRTGM6fihcPoPQ;i+Q`yx(#4U?}u1jhMi3VZ~% zvS_LDlTeZq`;96UA1BC^|8H=k&-28MaW}bmab((1I4WYnt3J`!%JKmp2qs&P&);`{t>Aot4O*I zN$lGds&AFAvtQ?D=jUS0@XcuC}MnaW)F&3N1Sb?B33}VsdGqqFvPJm(J-bw$Ysfiyk$NYT_O51k7xC7CEtZZbRe9J=AOk z8?$O}cr~N!NB*!q3yX`@-QcfIu|cu~U~Gn3)K7$b1+9S;no0m_uhf4oE9~d55W~^< zkdNH{PBh%>fbDdScwP30Yn|CSg;jUVs+zrc3dICs|I9A`nJb}B0^*_$BX&GKvg<+f zSE9J`+!EHX7BEn(fr>Su0oHKcS6~fi0PozDP3Ihcb@X8Cuo+|Z-P>VQZ9z`RQ_fXf zvD2}yckVp#=C*5J$m!hL9#6j1$t^@|AI`1z0te0SL5VEB!k$7fVAuC#0!Z_fA;{@U z7sOyKT_~~Q{{!9MYe%m)3Etr>Ppzh zvAG5{1#CKTE6`Bhs+dF#X9JGjhRj)=x}X5=8?Qkm(jmRXJI%&7?rQ0T=m0(oCO!L$ zTuF{^{xM4caN}>|B>vV}XGBAj>zFxYzR{@&iAakwm@ItwXuAC4zH$Up{huP99{n-i zfH2>}^|Z>j5C;R!>CIfTI)%_3=I)PQtJ%@4vN8ngwoX+q9*0V_&)3bS>Iccbjs9g17K?<0ZSZI$guj;Rf%~_~i}WApx7jNEGxDi>O^s9V<-gZd6~=vfFNq}TzLvT3qn6GS zEcRDVl9;$j`>jqVU5lymBrWljn&YqVQ%{lsRC8a7Q6IdoSKi3N16e>)UUe7HZ&noL z6CSu@az-Po#Ov4cqqGNW0FJvQM6Iv};6!Tqq}09t6NEMrMJEzH<`x)<&rahG`d3E0 z_aMTwuvd?saNh4Zb|%hKcEQ+c1TxqeAvf5h>6))0U3htDqhv->gxcuTmB52Um3U>alj z(lERu(|NdOrxLc-$sNKB)Fpc8q74_TdB%f=5VA+LW+!8_kwxytxiZXf8(ipIWW5##JqQKa!Bj&pHc+|P9*Vk0P6r<&2ykr9h)=?B%d9yJt4DKjzFC$d9ED*+m;0%$ z8Ju3&DH1~vHK|%=$w-Vr06wC`r~uBD z_2xEnOAyIpkFjPj1NTdk?e4Qml0$~os|-xOWuqy{<`!P?5dSx(uMAg%qCk1~Z|kIL z00Y!y_X5P>D#Nl}$?-2mlKl%}yHCK>^+%*Jj;u`|>XF;BN0};C$9wa_UyXf7IB|PAXyQo#yf@aI;p=EqC1Focv#N?BVJQ%t7 z8IFCI7u$4nY{z-VlxNU=7soJl0sHUB;k}=|=Zc@(Ku_trAe6Uj_l96>d7d@6K;9w1 zZ*0dkfSa5wSYBY?10=IX~f`XA)Zid~5usG=FGxPrL{7X&9S4-|6- zt~U~ABMOs>hm6Vz)m7^@u*!4zyhH5O&?ufi2!7t`>GSetxRkuSp6kAdN%t`F7 zJd1Bj_DA){L=TJY2v_1T=yF~Jz#P{3xQ%q+&e)D)E7#z^C?xrC<%WjO0apek|Jk|n zAEWXgg8b1nWoD|?B-9V2Of{_5>jEPvYItYlbou>T8lL8=;6n6ow{xdPFF+f@5|B*c z>zT>E3%N!HCU2imk5w|E9!mljplr11_KNW)3xEBI^U-cP&MfR+i~9QqU!`$VVOno0 zl^#sn?4^`n=Ae`ZQ@xDs>{gLHJ1@EqzK%B%|0HLMRSTsz;%8y`!0!!jTw3!<@r_4o zf?au0?`*VMW_A{e+}hhtAV)h>@GdKAFF`x`LAhf|JrpYB)JT+}Ni<=^``|-b)6JA7 z*$pE;Y;byDsvl@~KwUwv67<4|?>dLcdPV(!fPY0{mG4iEP@9KFqJ6MJA@ZjHQ4oX8 z@}m|>>yukTXdDMBEQyv%RLjPQmw;D-GQV2Hfg5Et5nc=22p6S$u!_pf@5;<)Nd@pE zD(<|WB+!{psuM}}NFoH<^l_QF7&{9DqoOP9&e5E@=n=7Buvm_RwjRWNC-oqTM%5!w z#Y$Hjck|UI$Z@?`3=|c-!Q4lkgpkZR{UPR)R$> zhkZY_6bFKIkx(DTUVA2)ZE)*b@Zd8W$;~iZ-t8K{4j|pqc!xQK|SZVjIXag9fP9GWZY7ApK8E4{Z zQkiXUahV&5S)L3HPa+60gju0S-S_%^%c~cVi&1kS7LG!=Dj1G)Yd>fa_7x3Y*BYxi^ua zS_CX3epN4Fehh^zzNuRrN)E;(RHWnS;>uQ(3^xM3t}x4LvH!du5feB?0`8$H`v^DF zYwg!^j>|87jYENQU?^9aAZc*&IzmC1qxEcmGzNxQjGxpu$CFPQiRaNO=``drsys3p zB><{+g z!nZjBnedIF0B+<@o{v{aW?^F%l%`_%_qfr;L7H##KwUViiDeMuWH{z0(M}@&>MjgQ z9wro4o}er^B2)@Tmp6(z3*SQ=>n!2`h|sjoJs3wc_zBPsS$EFHj0gj3c^kvMLw&|U zrPw*1-8=@@b3&!)9gcmABWNtt4h%r47122jagi&2fg9-+Fnd@cs!(j_fswL4b0~%w ziGc`2N}p9c>|w0A?ls}qTjWCEZ)cjFN`#e8cDu0#9dx0!5&=K7qUVr@p$i4}B3Rs^ zFYq-oq2S;T9)^~Bu^ShbrtW}}ho2dVzoKvU)2M*@_G_IXXu`)tw6KPMDZYgGe6b2P*9OY-vczJwZXI9%nI`p>n0`y`RoO2M!Y^%JlEV6!k4$L=H78_&mnGg=`TgQ z8i{|is4L9^DNm%Yy5^Lj?Cr43PfvA&D}a3hxSGO)Ts&_aJTx46Rr$Y( z>Wuf_>5S*k|t^#C4ly*6>W>P!#XfzVuRE=A7+lBGx6IdWL3<>4hgUg zF|)0q(;=ut_lxZ~(Wp8Y`~++f5tZK~f(6ZrnMPHdlER8mvx?bdnyhX=`vZ(Z?g7hu zi^oXRZzhv--s&A%)f1*OWwWZj)v;NtXB zx0*6qs`DIdv)nEbdobSp57oNHyP@oYdTDnMJ~NDW_N_D=?;2yo=WgK#wADxPfptx0 z3L?)RP=Ma}u{+X(X6sw958)9uFo&;s|Cy0E_6VZCuw7Zit!UY?lAI0&_pr4eCnaqC zxyY&jh={VO_kS}GQB(cog9Q2t(a-Q%e8+5 z@c>He6a-WoxN$MD3gtcW-qTou+49~`HtpC3ND41Qx{s|ZQVKl;Lo5wfhl@TNl(@CsYC|K-|40oXr^R+$TDd8)6)4G?aEqnV`|uU)C}=$!02S~0 zuIDqHk0*k_aSubF%qmvoBwrD|jwnE}pxjJBj;ukSao-}@e{k|zijx(%7EGCqVArF3 z5H`Pnma`OJP?18`9W|lSH6gR{=EEAUap+Z9={m^76ll@cQ0eM1XIn+F?Z;Pcgxvy{ zE3TzUDN?#P`cbH~F}kwM>c2Bsx_RufhE`gyFE3piZ5hOc&SiK;Zwu0lX-{GmqqZW{ zcJmAP&xlV%jFo7Q@x!v$-;y4cnIa>@CUl}Jv$T2^uz+IsEIY3*BjEf{h{sPUjmdv{*JG(HAR6EBF6v-;UTLi)F%W`_7sWyNFGuPnJ}fWz^gJlB5UT^ z>j^@MZq=UUVs1TW^kG;__Pr3uWS2)k#-#w{(a=>*3n+%dj1X;&|BqjixCCtkDu*y& z+%F+f0z33)1AkKu0&9Lfonegwn-R#wftklBk!gt*nIJBKeWtEDN(2ET-U1_tHC~Ii zHG#fpt;9&&e6UFVP($&N=6s3K>82e6!b-*ZjCk@qPd_FhklBwfu)f@ZE1SimHF%5+ z!@Mehmb=zPJEUc?)LR|Jj-WEe&p#TooD2eyZPD$i4uQ&qYS-aGA3=sh`2qwlE;JZ}~!6PR?aX>sfLhqw0S2hWxK|zLGhw97SDhLZO((_JP&C`JOot39hUJj{8|Z) zk-~K^gk0hJW2hqTK<|UmM+U0sTEOO0)M~8nWk^pClzIkfB9J-A=TQJfkA|8KIZoz% znY|E>0MP34CY%ASBLAG^^{3^hk73|31F5uosLxGUgD*>^qIZN$Jbpol(;NUYninbE zRJjD|4cO52sM3|UyC3S2!xbdEFC)Jkh+K|JEX=14HL)&e#dr-_X~n%XRUz@{+9>BC z`-tinJ&c~6ERZ^4mR$A|-3N3&0O*9xJlCcIHo++7vp%wHwb7k-;PNq3hzDy zuNbrMuEtEnDFsZTo4QHh7wO;Djk%Zn^8waq%KD$S>f|Tjd4r2K4z&WqPqjH58p)Di; z3|&&Y4r5~FmkJ^HdWsq|Ox3CTwxtJrpaSU;?0cEjrQzQ+LPM4|x7ghTlFH#wWUb^l zblLs{u6`b=rEMc-!7)88KbR}17}+Q#U354?X~WadWA{pGIRa#4;RwvCmRi1gC_`#l ziv^mtB_swx45#E-Ov&>N;Usz^i>P7u#N;SFA#EnH#Y{rUiv$IwkkK8(bG|XGgeK(~ z!wFsYY7B$W4H-kKbFSWt4W!^WE-c4*HoHr1X=`daUN1Y3l;sFsYLYKGkVuo}c<*7$ z*5!D$2xM}aekcGYK%$ejo)rO(Ve@n6s&j2Un=GmoVO)l%U@duh1jcB<4MZi5AJ+ab zp}COXI65*9_*S0yG;EaZPUYb~Z`cE|__m%6CfbmP=l5Wao%R{zX4Us&@fEfbvssqJ z_b%bqnmODd+}dyWI~#P99Zz>mU9yb*sefR>XjoxuI*(+^3Ru(UvTj%>fIX0TB6&L~ z_S`uTT@J07!`N_Ftm66nikQ_DSW_21C{)adUy8ZXRbuc=!xUl=b_;xxk77XpQaP~c z!~=*wvLYbI&m?Z8SHy7;Irc)1|K+a^Hm%0tEC&t56w9?B*z_R~GmTA;KwrouyH82S zJJmF0iv6k`!Ij3Qntlvx`RPRjGO_6`6aXkdfYQk1m|`=q3HSvxN?p{RG|IuI#Cl8+ zfW3@3-y~ z)ZlA+4#bkq0u*-gc*Sq3@HSESUgGxe- zL#jOy(PG*yhKQ3TGM@~z^Umd)r+Vh{6$CQp@>7VBv>&NG3wwfMa68(%e3z^iESOvT zY&L!?g(a^8fnB{u(_Jv8T7N-h-lKKzqO4+5P)x}wt~Dp|2zBrDs(B99gq*8JbemW; zf4~Y><1nAwC1C}}vTpaib&r7}@t&W`pMtHey=Wl>2I+5M=@%TdqKB?EWP^yILINP^ z#EUVQ^cK`e4kl|03Kof50dvnTPP`{hGhoenZ74LDz=nczdtyKtEQT!_QG6z? zLF{bE8m6sq!`fJPAXtH&gQ2s{9W?puFBZ6I*dQjl_4*ENE_#duPAXyA-LP<~HN(aaRKGr`Q*XNx2Le`6SDC z2ziD)4nyvv%sP75iFc918FqX!baSOqD%ChoTegB`q(i_iK-PFofm|y51?9Dh&8Ra5F0eF)6CE9vgY{9fP;xQSF=|`=Y^7YOz*xmRksX$ zo0tC78S$MEFdTsZFTjJRY2^}QT#MFVniDb3DviLVMft8CCaPl0w31h`81ek%j?|As z@&ii{3)31@T9#}$gLVwOf4;|Vf?;s>x-X+mJ8>vFN)nIdXvB*#^Nv7;7f(>7D95`( zeMFu#5)GI-dk6kg(!^S@1TRA#fyLCzqaOsC?|Z8-EdkLk)wT) zPa&rZ;jclTTnJBA#0n7p5yCPBL(pat2|6uh!uqxiURXzn1maTS0-K(^iKC>iVhMxB zOVHMF46>@A?`k8N5pRXTX&_}8%D{I}&LzHErYho_cn`7m|L`CAK zU9mr>Qr51hNM}Gc^T4Y69$}UL@!C&MwO{7;p!j6jr~ePNyPMpA(C*-gj>zp%>vRX8 zp-#TY+X3@zY=K@PQL))XN{V%TC9H|ti3ns8w{DDsL2R%hJ0cwgDYX&5Yk$?lhFo72lchvBow=;>lH5Y%9Q$9eqVvfgmAZLP;Y+ zU3cgeks6$k6{>L^_a=8BUaLLOWMBBN1?+nu>7)%kvmnuWaI7t$mAxLP=G%Y!hy!?f2KL8&cBp)cr+0-(f@niTIr58Zwqg>5-Su0E;>)`L9vR56#>9IO z@GpR2$nGwHZ(GQ|o3jAcBX`aPaGliYtUy@+M@qA4)74LsMVqcRB9JLvZH6(C3*c61 zbEJ`Yr&q4luolimf?n@oxEEu{piu-Qmx2+$0J@}CuG?11ux@!10+}uE176FPcQ@x~ zvANg?YNTXw5##j5GWcXN(u zz7h>MKAPy9q1Ix*Cq1SkfFhnTjoPn?G5L*I&wyq6$8;(Bp!PK!ubVMIX(UJu{~Z|qD=4(6_53Tkls0%a{= zN2SjG*pzwCO9rk3R^?b%aTs;d@Hm%jC_QP%A(#yhAOTK!pS3Kr;a{?1Y{aPb9#v^WPzcC)$@fSQvw_|(!1=-GJvOLfO_}R~f z;nVIU`>e7ov;nCFM65a-8w{zf00<yLxgP=n6-i*^|Eu(e(7>VVv9k zLoIY`qJ_T-R(V?3B%0eFfMyMNNUkvy$gFu<_|wOKa14m z$bN;8p~cV=(kj;}X_1%vbFk$HCw)DUDj$SE=wAUzPm7;xJ9>n`{~?em1U`j0@%*WQ zJoy^H8-T~Y(s4#304FEA%O`}TkPm&HX^EmAVsemp?0-Y>v1fe7oP}p^BkK|T^+;;U z!cDPIqEZz1pzMPU1(H4l8fGq{PKR`1x;U~ngT^%b91uQl5{S+!UBBU=MAht6qK?FN2iw?^sI-aNml4ZYRQrdXi%a&$EE z*}X+rD7-6OI(rRYTI0ykzZV*(ucT$tV`unHZ+tu!0P99<`-x-QYCFS^Bd6QwKSi|!oqyJ>V5QqGxDa} z(f7oE&`Us%L`N~`wD^u2Jb>8ZOCThP=P?GiF}EWU0=znrVQ~JtsrfhG$9lkd43aOd zhtaSacr8tK?=`v`Z{^TY#zDr7Sh6v!HjmLA`8%Q_Z)F&p!=$gqfO=;qwCetY0|A(y zXMiSS^LUpW_NtnKNSwAafHEPJ4#hTL*LYwXY%(thal3d3w~NZ;nEsx7jFsG zeuwSi8mu=KFycK?1N@*P=0|c#k3QSxJEi@~UEDkt3%AA>ZQI7}mi9le)YJYXWE6A3 z0LUo*DVU(or?jPV;h@k3yAZGnpZ^{LrE?O_-VZBMJE4J0i8Uk31i5^)UormQNy3Ck zb3%D|L`#a%5cw_`8(OG93t9lkLPJs$dx}WuS%#Tjly$OACDpLA{%+QHhOE`BCf^1*E+T(cUGJ`DceA4Z#XYg?QLOwTXYRYi4wO~NC8SQ-b>FL`e`V(394o)rIzlKr z_eIdtvnIf93H8EVpr4(ZNl7NX&J`lm6JCjDC5N1bt!li|tF8`M1UU7$l=<+4Zz1f6Hj_rf2N!zsT|s#-dpPfc=(Az8 zpbmKbhR7|l1>~;oph@7WkS+A7I*Qvv#rTC3M@#0Fxvu>LB(Gti+wYsGuQ-GF6YVoj zU>VTK89sd0Kq!(V6xelh$o;)Hcmd{YRp~vd8s*(13rY5<0(J?cVGL3hV%HtvWaJ=# zUl9Qst%Ojd`uZx>)WL{vgDqM2M%JZ1MeHum8`pTcJ_^X;qQNmZ++F1-0Hwg zEV&5DSn0zXyel0%us>*mEb&Ej7R;W*W+X^|U=EMZHHVKK2~o(al+A$_B7Q8Kzs2q> zeSv6n_T^0;AsZutzvC-Nz}+zlsv{S{V&yPq`=OUvsOMx98euiJuX+tZXWHWwW3aDl z6<&#CZ0Krn05e7DRB!Z(EYKOGF4q>Y-5LqNmv4zL4zi56PLM^@c_V%%%pT5!;(C#jDqS<;2f(m>a?XZp84QYUR|kQTxZ^7N!n4!9<#SYa zA}Vw3gHFDp4_I^mEyy#3|d*O@9d(mzIAY||Fz*jB~B=PRBj%;Pb{~~d**_bui z;XGZ!dSB@z1pNC-CnCn(SDNu{5q4TeIr~amKs&SBg%&>^3F&stvvFg}P>D)6+e^Z_ z*{%rqo9&Dkx7ov`*=wCxFf;aY@_JSr;0zVMZ=n_et=t5UPC_7Z&D z%jMaxwOWs7VYO}RUnwF-$ttN`!8NHo=wh;Pcryf(xGrlq$uW<(lM z?`%|j@?X}d9P4l`1E|ik7&^IBYRgDJ#o39CLO;dPe)BEZQ3o-m|KG| zvuCnu_`9zLm;U-H(q!0SN3 z*&Vcgf7MZy$0(P6I2D{aLhv?h;_#Vd&^?RZqRU11M}G)r%m+tow`RAL=BLLTF&z~> z1Bd(FLCs4mV^WE_7!vEy+m=)Fi}T5hq_;+*22-Q(8&pO>jR-ij>#GIrBcE50+y0t@ z+)V%!A!+OIC<<1SziC6xpTzYqVd|E8(v0{tPQ3E@fzL91k$l&o#Bb+>sR`G2SOT*& zXdHC@@(pQGOO>h7XqXZi?F&HeUhI!@8&|{NslC3#0qyi~oUsgjj^NE~&c2fks3C-s z5t=9ARP7Fd0?e=k?p*NvNQWhB=R1BmR+~q|9tNNQahWE5jh*6sPrx zPv03$RKz5-57O6sNkN-{{kLZc3#rD_jQu01gFAX>v{y5)auW~A+6{va$e+jYJPgP4 zh`wd4>L(60)A4+RME+kno=2luPUjQH6MJ2!^Q9}Ao((>$rl!wK&qV4pRFDmO2ikXi zrkvSFv)*jbU5DgQ-6FyzWPaqTE@}~L@BV(bsnxI48a>O7(>paE&+3QfDP?gd!>_5b z%k`?S(fx~F;w*Oq`G_X;v;VLjjjN>|G2x64y;SOO+y^hc)g7P)l(W9mb=-?OblrY0 z7995neshqymiK_CJ-kP_R|#Ucz>8j13x1y(PY&Tue?ku2I_)A{YWZb3m)nM?q$dBG zk7&jG$@%W`Nb_B7KC;)4=r}}W1c}O5U=FzB8C1qSrSUltGriW*EA~|;ICug!(ZsES zEyj`f%;A#suT!TNN1+#v7y{8_<6n57P#w`$_lw$p;RxMxse>7^9_C&Lh)^ijClKv8 z$SP}SgBz?;PolI0c+pg(v|C8+e~kSiWL;boN_<-RuH6RZb%*RHK&l+-pKLcn22OUU z*r08o(=Pm-1%JzvnKLy4F?0W~=J;T&&<3%?g6Aacdu}&@m^gLrCFmKY)9@ zw%3P{@aTQ!0i-ceA20X}=0ivgnkqZIcGQ2kz8wj`5fh$-9gt`}mnO&GKMZ!yKC9L7+P~c;b zs(~liD*&~Rc?-DXToGVln)g~j8L*_FcfkJP@k}DLMq>1hlXCY!k+OKM$QuzEO1A!YBQE4k_AKAVpMH<^z@sbu!9G$o!*I9^_f>oZ#g@mc^kxr| z0@%wQ!nTfQ4Pb$V&nx(y3Gu+k@IJdBC&T;sUy?7i{5e(b4zNycemp{U)`W)P-)(c| z=AE0f^$pGX^^|EQWhCe=q{Nif_D5-+ zBwImiTrtJF4-_#UrgoH?JDN*bkSbzHlq0k#0m>Oiy8f}K-zDTCtl(glk+=s_vL|ex z_?XQ1%Ufl>hw@(RWWN_q!hC-X`*Ny&C|*7m3CN?>oP{zf5;)+AKbdt|g?&G48adh^ z3q&-x%GCSk=R}6oKc%W4KJe~dmBYSA%z7H6lzinFhONSPkqL~X1e8aN(T6iy$v>pB zO5}A_ljLNN929buLgW5Lp~;I#-L;e;4i~B78(mt1`J%LA{}nQ?i})ha^<4 zoI08Lo&@#$rha{z1XnPNou08YV>v7zniB#WW@k3@0b};`6ZIT*gqJly6gGq_#n>u8aE9|L(*ri!*_tL%l6M6?A zeA1BFxdYOjbEif6)MR(i15Qiw{`+N3wgA)~fe_y2<;`_4Wvk zJAu>)^hhI~gS&^J#ouL+qR^6Mka`4>*a0^{goqyEkd(xw09`-8G3u!vgH)>)xPzOE z1_r4`q1u$kASH+uEd!tL&vcEV=I+#U*Ab3l{;>Cu8x&ElcU)VO39y=nxtdh& zRY>(R3MGmzxLz>>3E@(9w3a6L+Rl{v_|HPvaVS1|kwd&4lad3wv8>)_Qc6>gRO4S= zSZhm^L$5W}C`D;qGwz6j)7PGe@}^mt<6MmxD?vce<^GL@=!$cP!2O9DMC(nE%GQ&r z8N>$Ai_DblH}?BBfz-jvi@1S-_1qrgH{!P;O&uMZ2fMiUAjvPFXxwR)8w|fgAk&BN zEyU4>5L3pw7M?&<3!{GBFkY!f`;~|2{^0`TW6@Y?Vjg0R#NqgMN|vys!Jg@=aP$mU z_J)u#)%b2Y`Xq@yj?wEp(I-oE7e>GBiS8lMof!S1C%UIZ7c+X6C%TtJAI9i}CmIK% z(UbO!9_5MdEz#{5J^oJ6-`bXP=|^Q{&+!jq_h+|VDu3mP+O%|rw_ z%FJpyY;>=|1IJ=q#6h=7IDkD9k@~hgV+M*nE33(RnCmVK|EA!Pwd%^f$iu-6eALa|MG?orhS**BJqIC8KQ$!C^ETjSEYCy;=9=m>u!{$nc%5b8!ercwxN z+`t0lMK(g%h+nA!gsTyM54eOBLeq#pt^$N1F1CQ%F|W9jz;^6hAV7E-@%1V|C>im0 zRDb}%)+5wUWFt0VYYKde2La!+r01#fxKqC9Kz^B9ANn+KORy3_8_Y$Gt;g^mmyB`Os>XS@36|2CkL; zKf90O0oIqP4vrWJN}4tezR0d;aJ#+aEp5HLg(6R?2z6)hma~^}CcNHXN6l19WvNK; zi!d92ZxdF+gRb6#Qn>=NnyhisYx0P_dSNzUlB|POScR(6uX#&p0 zM&uZZoeL?Nh&xq!-^D0=$`IrcTF&Hq%mHU1e1J2K+Oh}PYwWLFO(lg6^WGdL)G z%DD7oqeim-D}%!=Ss0c-!iQn6V&~B{2(@^d}x%YIb!7 z$71&;5`W89Q8Qu>Xtib!XjK>9E3|qGc9T8XD%M{4+h{czb-0?FAFVcF3ipIowfCcW zpw&Zg^-W%N{cNrDaq?CB`rQ^wEXIMc>$2e#KBA23nb!Avou*+bZv zPrJYq5oF%vNh0;V4w4PwfP0Zu9xW?Ftw4{JTCwu0&cHizR;lfAXqH?aV zY!6Hneh`|Esy7tuFzvF*R)=Qpg{5y`ij=-%RILS{cAf?bI~&+55gCTQpcI7=JZBG^ z8S473yW<&7wrULpkce?r(@lc5D{5r0Q`ds6zNQFRjW)bUky)?_C{{@(UefV^(M zi0!XNI13FOk!Ikf9t6a^@ZhzPXo(JbQP0VJ!2k#8bk^u8f^M*3+Q*<77u|FLjcAiE zcG)X){)#r5MzIbU@}5vEngohbDYd`F#5Osw8!pK;uzBcYu7OPqHa)PJqHySSkGKH@~QR+jrt?FZhwB+V&!f@xRT6y5vInL;e8De+#)nqx=CE0_8tPxJk@7@1k6o zkq-$Y7iL^_defNEm%QAeuzt*#21=>d2vMH5VmFQQRRHmxuw(LFdl*g}cS|N}Ac4?Z z$X&s&H-YF6oR&G9%eaC|*vTihW+36m%$$vcTg)bh{opX)u!o|?ricAJ9NhOb?7Pqo z9HBq`FJz%69HHUc`DQ;Ekp=)Bs%r~6s_){lT0erq;w?$X%e4SXQy!jk{^QY$fr7Zj zUxv9R_2u8h416s-i(Dz4+O@rDD&UZzs_&IyI>!#iU(TnHEsh$B2-~M*wKpE^DR_By zbFRu2IT(@tzMjUuLIpVxgQ4!aKWc~BG4LsNk{rQ8cDPda4B$}^?nAkNS_rcOkWr!u@j|e!fIc-~!92WcRxgz-P?Oef zR-L#;BIfnSXj1crP;#2js7Nzucp-%zr}cHO5QGUPODDv9=XOGxJ)^DwThqkUp1-^b z{AR1{O1i!2ssjKZPnV|psU{igG)W=TX>ycmlF56~Gc8j}uCO)_~enmkdOyu_KyFM&I2uvjpO*PtzD+xRAFQud31Ma0{MVO_^Y>=0rRCY1Q&nha3e4(hDuNikaj&9{s^toi^AD&|K-mdsNSqr zt&+>Tt*%OSbz8mK+o~>-*(w^mlMSjB!&YUfpw)5Gs;DukgtV$WV)a-lWw@;_Nxk@z z;1Mt6-3tgWpATa&7K*E-VZ6|;U_u`)K$$m*lWL$<-2@=al!cUX^aQ8+r<>Fek(Qkq zQQ%Fm7&N95{J`E&!;o@7)&vo60IM|&8@6P9xHq$!^2ik)<%K><$6C-x=Lsp&ChQZa zAKb^9?1BjWVlP@^yP%%Dy17p1AWOr+fpiL2LBQOPT~%eyu<=C=Jn;opd7PtqNx;I{ z#{`h%hK8$iKDBG}LwQTeN^uq80_2rK4@;relT{&JdLOc0CuIxe)s>YVW5oaJv>1=-I5}IZI*<3(c^~Nr4n~!gb_AX0VDVg+)AI%R0QuYb zqV$|qhphWZ1>6F&0SKJjkdiaNd&g(#}AEdf*TovcY#`n785s zE&M&*Ld5zz7h*VXae3)cMtq=?v%BPMJ=$CKeOx@@yhY`u9r4OD6kn;+#s}&g=&kcE zB78Wnw!HL6yyE8M{3kv_)&YkxXT&a9w2t&6i69CcMcl0R6TDWG*@XM zB2+3nNJbp)a5$-iq08EgElxkm#q}`I?9@Ga2l^x{%Y9TTdX~OjaLj-VvtBXmcU)Bv zT4dD~*t1}S2)-c-&{!nEczNgxm^kN5cEc*Cc5VAvZW0KNzevNAD6r{2K5J*gztG(f z>QctISMkL^9BSW6^An&9v(#qS8!?6vVh?{lew;%kV{hewc6a|?9cahq{WLkyt`8#M zKzpxHX)X5dU7f%cm}*so!Vf^Ud&cdvYkb~go|O#KIb zy<77#I@A_GeCn_YrDv!}$20t5H00UyQHe(R_SEqwX+@((Ln(T;vt@5!rLuz&IG}W4 zlX|<}d{0SQF;>Fj!^ho!b4hpr9ME9nX}PtH9KssOHgQYw1hK?sn;+xMUr zv`sQ^U*k?cc3X>3lRX}(06nR{T`Z{to0EEpqzc`)SHlhwe1nj5QcsgqVF&hfNo9jh zYB5rSZ-|wQo0q{i#F~+ZPfOmbgD33&L)^K*M^RmmKN}JW5S*x}(fWurXd*rm#g+)z zEJJ1uF2=WQt)V+}>h_mGLBYigHYkk=_W+%3bdI z+5&gb?j7S-TqkwOEb~ig^}0p?@Wea;!0*`q zho6(ry}DHZc>C5y$sM6`r5!JKu(ZK>d&%9!&RS1>FZXD2!ELkTKCW^F7+!8jef#`m z$-RPH*75Q3+)tGhSa~Ji1hi0>(2|;C-+Jr7r+mD(mG}Bz|50H2H3rY)hVQ$(rb99# zjHY_N3=n^o!Ske3_M(5IX#=M-I<+7*occ`^8^0R1nq{&51u0qPp$chi-;H{Na<1tu zb+}ND-mI!UsvI|9$0l)Sd9ep&vng*oYon+UUP1B~HNuOkdqHo4 zbyDJgNhuPk%MhZg6gg&}_AaHp>^_bnMVqu`Mesm&DzFl`bny_{{#3FLJieSBI1kGu ziocC9*5nxsw-IPN!=pV|xtGav>eTDAvN}fiS-&T%xw$!fUc~xh^eBk~l^lZ{@^KMP zMI#E0g*ClR>%7u})*5k@?P#qjDxt!7+vi*=*1dM#h{Aa_y^V##LX>U^$DInISNE7P zF`B$6H)>r_T3{@kky~vnTtSXxoMtA6byM*Nh9&bF$v{(5TUrpYmJUtU4qam`tdRIi z)b&O<{t@ocfqN2xoRyXb`#FV0(xKlEy+_?S-S!m<$mc+Wd zU2Ls6QFl0x{&KJ8sZ?@P+K{MO|n48v;WNZf1HNd5=%tzDL zThsEmN@^F)RjfFeopH{>>ddw&#t_1y&#*Kw=TE0rgrqZ9HOquB$xOBN!<4%Y?4lycso*mv{TdP)1i`<^halgbfTo$8 zN*7iBa2`H47JljW@;D8*yhb4jfxA#evNlXVdm0Nr(_@^z!RnU!0Fj7$P6SI_#Q6qq zlbRc^4o&6)7nwC93Uf0M+)bvcS8)?bhG6o901N=!_~jKw(_0i#Fp-seUiWoI5rWFdqu7oH?6sF!m7!y3T*7O(1DaZU^ zJ(MiGpFQPyzB{{3{;gff$Jm6|+h8X8T#ND&uL_vbd8 z)Lzp&m$;uyB7rdf>Csd&nr2dPhH+DlCPj(>QC(zz61@JL*m-~E3EePt!?Y=M1w+$w zPk;e&<)-FH4!t@|pbE2&4_cXHBS6?#42Ciq4>vgqNP_kIyI{-Ds3w*ld(v zy1*#E^6y4@LyJ-Vt2G>Cjab`^#7gN+vaYCAX%dQfYi&A$&xLzq$0*^^OzMciR+FrD zcD#kGrk2?;#OR3if%EiZA(jKKol5r6wh;8TxaXS^V?f2PV<9eQijB-kteSaw<=S*_ z<}2^fgC*g|#-deL;caR?sai8*lbKWsVG+;j**iw956tAH&baUe;R`QZI*Ir~DjPGY zl$ih2ZhDu=X2Fdv0P=Qms$BKE_wQelGe)OhrG5ra;2);>EgoD8oKA*J4)Q4mcIgQ6kp+T>5xgyUcJ zm;tr77W(v$_!6;ph|psH&`e&N=arkj5h(SDi?s4DPgx33NH@*W7UI{~ieIv2#KwJSy+2TrE#FZvtyuP^dbM6eth${`p5`rf=Bu_P$ z{Kez(Jtxl?fVJ(M%Vgc{|D+k(-myud^e{hSpxd1rSD&Am8x4ze4YIz(2j@_Ejx~Y_ z1bi~WOpypPDPNfR5@BY$&|XHEQR{$~Vwm1L1pBab1oA(`)lNw;S&ZS4bWki z&v&h>I?1p!h+#{Wra@Xi`;rMFgno))6j2yEXxrXfN+<$?Xn_y@^wI7*pQX(%L}c3x|U01zQ_v7k6tkUqDs`NR9~LB z!T-*acm7Q$WT|D~`pe5z8I_iiH^%tiQP!7pe&nayL*SA81?X!cxGl8LE&NXObqe&= zaDuG$Gqvoo1^{w=@BBQGKRnsv803Kr{p~Avg_T~(9?2nv(0A%>5fQANso`YL`BD@g#tk1x znw|f5j8W!P}ZKM(&NIS!>EiLYwvn3~Iu#{r`kOCwQ2z*N) zXCnaK-+^OH#9C%@M12dEzsgmW9pR_oave{9pRb+~ax<+@oZ;W+^cB~r#}30LP-0pu zo`yQf+2EA?D<|hE^wakWidsVo;zRO6)@tje#UCENc=yqbAC?$R zd#J2&V`IZHUcn)GaVON&Vhv#{(t`>ZjHXX6rV^xKKtsZ;FY<&nWB#9|KlYyme5ym0 zE%CuOeI;EgqD!a$n=tW4lbA#i&mKMfCG}dxYs9{$)O1dVvLp6$3JXpdFY&>n)yKw` zj@}DY;ePUMVMp(q)Z3A~nFEh}0%KCFgok_N;ZPoKmWTa4w!6U@c-U7R<2;2!HIy*R z%!w@*^dGa13ZHf7rzBJm>cU!XAC&scU(cLpUxIdfS*ugiNkl$u9a6v$bK--a;C73g zSg$P|J&h(#`RAky}4uDqmX+#kQIg^18v?F$hwTI zX0C#rSlT9&d`;NeCG&iJlz*Hk>nhF^*D&4VADhO){RU0tN(ZLGpczI&=GdT%V}oEd zn{Vx(Q@NSw3WqRM^gyP4L20pRUr|~jx}&lvPZd!+R?5An*OXSHEi#wtdGw5guMR&? zR5)W8u)ypev2URGKm7%MmqFa_cHPB=IVhxKJl{la!C-`3Ctn z(K4yoXzEEXefhbvWsxuriO6_>-JQO|Ik>=#v0F>x?{(vnGih1w1wEOxrnh4~+Ltj$ zuB5sb22hi8`60@pVOmSENRw(N8{5<;P{e=Cq`id~(~8SHj`fg=n!e;Qn#@1&*MMfN znpn<8I1`du$8W%|r6!!vXZ@4XF$Av-&cRD5AiP?xrnS5Eee6>-E_!YxP zZI(ERP7dm4G<`&B*jgu`qcs6t>Oit4HOF^ysP%Ln;cta<#gc4nQs+`!!(D(|xt8*k zZv%Zk^`H+Zo90Vfz*;*nONug=D!=*EZ={aq%C+I=Wx{wZhZo6P<=d&D^6k+w@ZZk$ z2fi8R!oaTw7O7l%(kz1zIZ_632EVBvkji(~l10*+%9h5L^FS7n-Y&7a!-G*@#-!K+ zB@$W7C}T?inXk)P}` z@(W;a8Akp%#au@IR~}tn;<0g;8`FA6{rLEfklpRDwcFPU*FpSyOq#HVx}1DyUc(V) z>rjC{%xed%At%;-OUM2VQ{XuJH~h?6GfvjIajBoZBg1f+7uBdG2l3fk5TqK92R`am z)3c#gF|IR(aor)lrat2;@9#6NL152Jp6M~IGXq((R91#79qVVMAMlq*^cCBbt|I<% zLD#_9TlLXh7soJNTyREZa_Z4};H+GwWKTT@rfxiR%Gc`wA3qzv98RTllwW z)$9qTRYw(ZS@TS*wWGd-89DEFQskh@c3DpcbOOFoAAD24@Rtx-RrM0`vQ!seR$y%z zcOkJ^Mwn*55o68JN=2Vak~v&=L7L}M?He%J;n9+wulA32Z>za~jruMM41+?!LBakuwd!Q}82UHxw1O6(tR-2wwc(L5%PO3szIvQRO zt8^z-chzr~3dH-trGi6!DyX%OjatK%ctoXP=>2JqieppS5Sf5q^e0xgu$C5?>zA?) zaRk1p#Xcx@MEjDG*bD-07u^6OTQxC$X0O;}PhJYgKPWM+m%=?>ueFX1&-oyy5kc-- z$YLC~ba;}*P4qyMg^bNJo%rk3ids->S}FUW^euw_%FXGwxa26kuB!viWt zG__zyt->;S-Bs9Ke_3?yxh}KlxT~@A3*qC*{9iZ8qPxLecb&H%k>)qlTJM_HN2mpz zkN!b|RJ|egeGy*@M0_a{@ugVAmlCFKS?XXQq2{YIOIB(q<}rH2@yM_F0M?tJo8IR4 z5I)yDk4=&z{YT|dXxcBd@hrwD)K@K(=~yc8V5_A;fFw0n%NJjn);jrSfA1Tv1zA43 zTfA3^-vc^YycBUwzS<#eh;BqaI@bM2G^_<3=pH*_MY0J)+rSs@zDBp7{&E@La*O8W_(5c$SViy^z)IZml)q&xB{d#L}X^TM?dm zEVufZ_7SCm%-}fn7FIeL(ef_tARiBK1>9D;A_6WXA_DIBG=2f`6(Y(`qyzC~1N69+ z{HnxPk*Egsi%lPNN$iprils{f3L#c&DPJQ`K5r)D1*Ar;_mmEre#^|4aaNmF9v!SL zHI<4}p6caEAqQs8-r0FbW~a5@RrgirG|tZL*Kmi=FRXRxUn@SbR!MWIp92N=y?|y? zKjGb9ZINFx_%W@m8W^AlSUBIm6SX|srEVFSrjyO7C)3R1;*5+;(@sM!`xV#8y%yoj zma?gl%+`1d|I#U0xfDl`Stv4aNBscYL#meJbCNvozz)6Hg0t=;_ORf3VoykQgFV~+ zMw3mwa8{n?@WjsE!@eR4Me58mA^xUkr2X_Cy2?_2|8Zw5^}7C9EcKv%K1X~%_o5s!OK71M6;^jsU9&krSE z$TjB8pxKu&XYK%=rV>so+tIMi$jp;{N@W+e+>r(&-S z;A`peKEBqe`IOm8tPf=A4M-;Ic|S|zYn0ucwI?$_zG0j81Q&;7=10Ddr=0?DZ+;9> z;$+so;_yC#5T=M3-`Nq%Z(kN_IH8>#+rj(Jme@JXs?Z5c1lgUj|Fj=#q5h`!Yq|8^ z+Zn7*zYx&RJkG~RI-A1{^|R7e;FFUB=?|-ANJ)1Q;a{4+VU|_=4Z)9v7?}_L z_Jzma2(=)7N?qe`+qg3$gTKyq1m1SQn^3WfWqwUU8M0PSqr;-MTAjmowca0xt?Ink zH27Dv>Z4dub)vn&V`6mjTbNiQUEg=TdNmh-Tuu*A1-?gAb06WS;#%F)JLxD2qMV=-lqOC zKP!EG0J-M`(lv6yaCl7keDOa(q7W~?7X_&%TL5IyA`Fa27>T3Ns-Z7&yo7{{PgwV)ER#lt?Y8(gbL{gOy@{^P$@i6 zq^u${J|L$7vG}~wq8DZYWwSL`ew^7@co20X$Yn+%$wyIp8eVXh7mY06Cg))0zoH5w zI`f;8o;InO*aZhh>_Mf`sx48YhRsX6Q?4s95`UM%(uUL*weZE9#(IZgR?$E^r;eP> zhv7>Xy1ZZ{0BLfhJd5tiMc`f3ly8#Y^+4uH0o_2EdW8CZyHoNw5}Wk4HP$m?EhkeV zkSmEd8X`*hZVuMGuKEyV$jLgg4#3D{%pC?$B6eP>k`|@K^L2|2)0=B;;+HF^Y5pRP zq>bOc#hv-S(3oCe-lj>t#YN5+%?C2PGY${I@P*-@gfG&3PnutmSH_ONU;6jn7#Tt8 zF5xV8{w>$CYttQZwae)z-1pREA$~jm7ZmZkOQ{hwml`3NU0jHkyqB370d?13Pso}X zXB^|tj9btG24=w7fh;+<5XkE9XJz)v!T>RArG$9A{h>Es!qz_#E!MfJu(FYIo`v07 zEt>$)4gO-?!#Xs*eRB)ni+NhSKxLBwn@o}bdihDjb$`L`MW;68SY<*M_ z3sEE+X5rbbNibTzd1UBQ=ck8iDx|8|nE_-#^4BgD`e=X7rO5fTQ(M($B>u#M8Q&ZV z&+8uH95G)utPs8xwRV{O^wzR0fO9&P;0vMeE-tp4M)Ob*2B!0}luGak(_VTIWy!*S7)PvBUTB-Cu*zc68%0BY&+cEp${3*(q~Q>yy~6b>+~bQ{>ljzp^if8H{HCqeZ5!Mf&IXG^V6Jq3El=YvL>}?{ ze=A$k_dBf^-YVD1+ImlFFum#Od^}aPvA1A&*zsBO@qr`#`S@tI81h0OOODwveVJ;R%lUI}$O)`ESEiIg6Oj(Q# z^{SPVjLZ1DxP|96{4VDGReqP~_sOJ0B*P&q{~=!C?>EX1>Z_9pRMb$EVke5fvIH$kh@QqwHmmj0Zd5-_ zEe#*&Dwh^YMteR`h8lwN{IfZw?m60b}liWXa0ibSn=G z;pLg?FlBs4UTlSOWdKVR!o0W<^594B>7UbV>i*YNeqdU;scMK;^KU**z0K4`a@u4r zUU|So^R&Fa71Y|XCN+*y8GdT#KP~0x%<0wAXs|5bQXKy}sZ{e{m~V;S3H#s^>EZVE z6KQ*lwB2mypG>#3Z7Ba(9u*i5=Ry99559rMG#GP9Gn&@qX)u2AXL(z~+t#IM5Pkh2 za{d~TUDiWY0jsjs4z?*{Gqz3WZD!>v%#tv^L`&=^!u$qJjYUKoCk_vTF2x&5$j{Ed zdIrON+Z75>jfuQdFIrGj6g^`_XFFa@&XZ+5oWfXVB5?>q4J+bIv^3luu6jB4M10m1 z5VcEH+WS(#AP2-M>`F|ymYjExqYg(+5$qfD-r!vsiErfr5caR7m5T6lG80!O`e z`hj~zyp04SF-RoaYf1~5B2Mh5-E-_drL5QU4knoc?QrFG#$Y7IOJzN<_{@7xo=&QG z3xUSEe2NgF2%k*3D}})^<%+47`2w#9&bhgFXU(~-{}S9N_l!%)A(V4Bcg~%!UTb(| z&Yi;xa6DChtRwrWAEj^AY0M;Nrh;wHf>C!77_~1W)210P6RD-ko0c{`Yhk!U0Wd8~QMh z{()KOVd^D)8R^ym@tv6ZFPCqV0+|$U)$V+;qooysl>Xu8purp@roz-Da-}X~{sNvV z*DeD70Ql3&7AODm?l~#(+`@8=Pq2uSSFcyo4Y$;ytVzTSDwVaw&aameGSS||=PIj= zII|W}@FHqtnSL|Iw2z;0oN?vyzMMXUL+7Pasy4*(o&882iMNyR zMD&9VAL3Oq;AZh@KKNwybNVU#AU($@BswpMdmJmk5$-fcF^+vkrnzsLSxP}#`~YQ^ zd~yUWr`Is*34esV=X~5Kwaz%$7a8V$Nu9~TwSnw;f$Z%%yKf--vOu<+AmHo$0@;TL zvhNbYNDkg~m)~~3K=$io2V_fmbcGJ*o&@5#edNQ+Lj)y!7v;>HH)P7Ya;CUnxpL;o z!ag!`<``=A`8^5rCbTfW!bxy1w{yVW@I7D6m z0iZ7_f{~$MjbRD8=`6toPq4ZI(JEvNC>yZ-n>>u94I{NX;Jnue$Cfpa#AjV$&^ zQ_HpIm^i|l{c4H`i?UDM8{x82rBtojNZ*~&^XB)M0ylF#yhO;KGld zwuG(K?l3bh99#o*gG_T)s}q%k7#Vn(@7g&0HNisfEn(x)N~1~CBXO5zw4jhvVCrtn!%4 z;RpECvX{HvDSlRZPJoII4Wwr@XPPkxe|3bvZc*}*_}gNi(*$E$+pvX097C9_3jmQB zp9#(6J2Rp}8p@oe?AmhHMH@ctBTAL|i)BmGNU>O(S$8#^tad&|WKA#4me)FIA0@i9 zt+&1)cdmtUsP11!`51=KO38Tq0SYqk*%8PRsXRbA z|M9allTq~I8ntl}5V{e1G0>uWZpI@$ba`gMkpsbbTQZlDP=F9G+c$ zxZP`{Wom@E$Y}gA|25wrGX8SCDNc^VJT0Ahys_7Sr?8!;CJvXsHg=l->R zR)G6AH^U!S!y+^M(Xdupuecf{m(gYONDnW^slIwV^2gpZf?uA+v-_#tE5jwNSH$%* zaVJQVwI&hgfe`CwFM@zNSO*%vU5WeHOa4^JlLnOs^iC=g)~PsWv-QfHO%lm=B)gq~ zv2&spj72dX&!{mLfz2Kmn};FMV&5fng1c!;d{wU1EBzYZ$2aYs^NP3ayH!J49rcr?T4SC#z|Ps!K@Te1t%0dyrBoNW`Ro7e4ExXG-5KEK z(Oy3GZ_md5#epns|H_yhhx%Dr*l%u*cXW&jqm#6@a@hxvwD;47pm&yQW6oG?~`En1R5tYBC*(_F^2m zh|EAn_RI`FJwK3sX(0W@pa|Q^dNt=`@pl2|IMi9&@MTye#HV~NM48c=D3yWBf6mJf zL0ifE`^F<*TL0ptZ05=Y!eMK5m$RBJqTUklwe!!}yE`nrD8(~qATB}E`mSKNhZ5kS z(jC-j+IN=9ZbMFdi0H$K59!QOrAKjogc>!yHrV~uT}|K-Aw@C@HPS5hz>y1;)oD`F132ZlM&`e)Xrmaw}k2>ZUX{+m&nLg?FD(V zA|s(l=ih%;J$GO^6568eX=P2W};OGj$LHfl^S*n@V$M4IbNh^vNk&rUr{{m5cT_H}6=)YK>MG3Zp8(U=2c37-YTm95j zzF$%6?D~lHvT4njA}9TdLC9ETwTz(HD2w$r7r!KWz!Q}o&}6fF)u+8=o)N^%OiKCW zw0ciH+nQG@%}2Rfut+q;>%=}%%$cT$HJZ_%S2`AdgL>2I`HUz3s4hEt0Fyeg5wG~!4dOLa0JK8_!ye<-&Et7ZLQeWzi5KL$sMP>b{tCy7JyGk@Hc$s$jBerB=~0R_A;$<;QF^EJYfFz- zVT-L{_0dpEfJQISH2R{@=n*cBZg5`wxEHbfr|(OcBUeVPFU{m=$afQn?s(0#>sm~k zZrPW%MQ!?I|7u6H+=<#(I;*nglcqO`+7)mYHsgB$&R0rJa82)O&I$9p zCh)w{eRfYSNPAQG>=w~1aZ4DlGkN_BdZ-BNOe3Xv<$#@fm4%g8IcF-lYWgMf3y@>v zRnbo}|9{-v1ya~%Tx9)SJ*!bk=eF?bbxvGby=U=RlV_HUvGUn^^%+`edD-FD;pLZ5 znEni_mvH2X(h7O?9LL=KfD#@%nj7U~D=s~@9&C|+9brP9&RYD-`~OCCnx}8K$so(mjeVstv?wQ#kSu5jhuQYzxXyrDrxlv~rzUH{i5LKgENK2GFcKFt%ft^T8 zPG;3h6FEF1q^%F6znncB##7mj6IJ`-B5Ng+V1<@8f9W4k3dj$ay90Z6u?$R0o0n^8 zlUT#eGOVy&K;K1dNKOe^Q}Zg@safh}d=1B{1Es<9L%&cpsR5m#2Grl$!qlw=K11@n z8shJ&8q$jcLt59tq24*m8fh|}2&8Wgq(3f0&5W<4>*IU7E>G(DE(UxV51}vZK!qeKFZ!tZ!a{W5hOa< zR(LMJYhMsRxPsymfwgu4<{TpPQVEK_gjj=sR8ui6TSBbqnuK_nYDmH9mx>OiWh6w| zvpo4*EhIkHRUz>(zrKKwnA1H=NW5`(2F58l%o!k~djnZhv$JeJON2y`*Vc$UgHZ6A zEHG`#M9FR-V7#33v2bZFBDJ=GEjD(@P#O4phnDi(LrWa#_TYc+q5%9KIPJvwIpYD%s3$>R5V&v{Smcg~7)wVhPXaFORsACBe9x^hZgg7dJyltguO z`dd_Wr#&y=(W<(?@sZX)+{2Ud7Qa(3VC?i3&@t3wi)_Y@1^3rCUa-1?Slpju`m?v`!-Gp9_Mdewwerd?_#r|ggK49F7GFe9riDy63dl#j1_ON* zPW?gUHZmZ@i0-mQP2c0`Q8uSq$!(@HPJ#49!ee!Hx;^l$AVN*wz;wH@Th?^@{!V|o z{Rp8ZFx`F_$O=ol{@QhfpQZL>+CLi&nVvrxyFt|TEEzfQ9ACA3pz4>W6XV=g#%^#g z&#q2vq;-zA8$8`j67@NThK*tX7Jpl#c1>oJ`{~0u|Sqm-upCoho6~0Wr@Vo#GZwokpna~ZpnZ|+I`*C3 z|LA}v`ar5__d(k~8?<8sS+laU2K!kWw4SC(6yUKFglpPy*>?sL#g6mZS&=8+q;Y+h`U z-)+FlshdPId8K_>qjivMI#ubfVbL!=mKnR86YAM;QP-EX8~tws2Jx9+Wx=h-=RVwO zvf0B?epc2wq5T5s*#>bn4^oG`?-6O{=vC_O4!b(<2%G_LlAh6pZs~dQz4XUfNVf8@Z`MAysjI-VT0+C;aTxzl zco^Y?ws3KNTRfiPn_eX z_}}5X?`)jKyX<71=S%#eRehO{Ft>c9BIv|d)&h6QbZ(iry94RZS{nNi<%_5kKMHJW z=(?mY-naIYV$-f?HQ`o~ow?4*KNQ6>VenfLEo$#=)M0AUoq}<@UlBKp-G+?KTCbdY z6`UR~ogy{cx0KEdwov}Lvy$HHTGRJ?bvz3IJDj89O#8ZPFRESj9o zI{khFf!`id>c;S*AAw7fI+>DlmdaA+ENG@cGXKj#GM`dWflP2NuBfBTop;N+r;n6x za_+i>c&}9#ln#g?FA(r;g{=N}x_ZcmN(az2*+}wXejnH5G-sLgJWJW4@ZsBY zyz#vh-uVd?obc`TwZ#DgUGR9->Ws;SMZzA;KHRCSuYL ztSOm(u+kzTr#OwO5uH^#k6;?3Af!47X*8oi+$&$g*#n}Kl32lxqF8aT;1G~Xh+vWI zecwi<-Tj~GO1pa@KhK;d1h8S%R~;%mMRtGJ3;nk#`Pt>q1evz7djG5>G$N;C@zk@Msm?mrtj zL45Y1PN!&rB*NeoZx_a1wZdpxC^TT#6kCh?jldaiwOIvW8cmHPkDS0!E#>?g0tYNI zcj`3+SUIm<1Sty*oBhrs5Jd>R_fk`A1ctl6H}mH^jAR73YX(dT&Wc6n?F$5FX-%HlKp4NuG85s>+A(O`)~X_ z^LxoYj%=4-_%W$v7`QhMkl3Epa>mV!{m>}K$YzvBOUE1K=ao(|%I_>~qynS-9%alh z%C+*xD1TfjeT;Hf*^_ivTg;#ZVks=*BYq1j_|+jbl47@^rDA85C@bbHTTj-~=G6CY zRCZpE=YA)B#B~pdDD~gyBR*XBUG))%sJ0M+|0{jO`oCs`zJTEN!e={!`iOeR7u0EXdh8Z-s#=fz(o%OngC6?<(X@USJ$B2Oee~Ezo}~5IKcOyH zkG+~EQfKjQD8FGl|I4te$3D%~W8ZOxr^kMYVtebcfA>T5*pGYPdwS|+t{md)w1=Fk zblSJ6lA_&yohPNgHl+u1dF!fz>mxa?wvYb$)sM5L*Cp@!)9dVP{q>AMmW({07Q4XD zQVK5bIK^yk^1OY4tTy(L0cO7;73Sg{xpM!2J*?X7H*A0>N7{!z1u^8bFDYo~Q_(W# zy}SbaGJ7JQ#IG&RF>Y-kBwE&g#6*-LnbgXb_U?J?N4x}iF9^I#3`J(2m))%UC)zjs zC%ezCknkkm%h=$Naq5wb>yb3;OO)Qt>4$wJ{Z8h*pj)1!16GY_>sUi;%En31umr6scXEs=ECGHR?amS z^*nIRg*pdbe(MzVc3~qoU2xmQl?%A(g4-^B)k35MZnuyd#*`G%^aW2!jz|vPcsb&a z^@O7uYucemLtlAesq4o~TYYC*`Vv|y;<1Q!xDum8ek^rshSQ$dC45Ss>uwxCR8nx3 zV^R z_xtp1*w{ETG_9d6+_<}M>}RZ(5u(+WzlEx@Vv!6hoV=iv8#tnJ<;J^PqE@+y*(7TH zLayVIc4O1S*1u^}c{(jkbC1U0UED1}INe+f(a!$xiLlkmF7_$ud96{qBPF_?=EhmH z+HBt{;EV69Fyd*laVYDi;1gd`V5zLAT_$RVznv{R5W=w6bK+@CSc+l`E(m&yl9{J_VaDU?%t`UiE+!76a-W;`iMD2^A z=|~aUpj?K;EkSXoC=%L5(0o{0!+%CjcqRNyAG)RE6)aJ~241PP)^LtDzGD|!*@gmr zpm)Z*c2Won$G;zstopd2O3hvSR+UC1@p?fRVXB-@Na9P zNvex)U+Bh%&H+nccrEF_n|A(PY-u|Wcy3o0k4*N-Gq!K1!(C(UG@*19yFB_Px!c+Wue)5oT1HkKA!*$C!gPfW0KlbI2T{p z1GPr3wRHCTaz=78!vB$sv)1ZxPJvw9vdL-mZ>L=0>*V|b|CZ$GF9u8ItCEA)kw#da z7UwS~2%#-AlTU1+ch5+CXo=-K`$Q_7u$};Wvk!CgOzSOaYMJERVOFh=y%?FW>nVY> zk)Jw?p{VssIHBO3cB5CzWPVF&=4t6}+@jKsoWB}}1AXjF&Y-e|Jp}W?Q+(Vpv#&&F zm~k{A8H!~)c?g_|{glcJoS)(Jvr4yz6{0&M{`wfW-y!LzJ$^|-vDxjA^!?uc+#XYu z{*S+(9VKBPVAg9zWAP(r zYjOBFS#i>Zs$b%uEQig}1t={;vUV_cII}ZtnSOwYi)QFcvwXK%zRs*#8Jl2sBM#I@ zj>+8`Vu9~gQ!G1v*}6|Js%zrJdQC~JyJ;V!tSTba?6a9~ZoK9Yt{XlKa$Fp0yyj${ zt<`mheGulhu@sjLvZc-cYnAeEIf70y9iCAeeBWQu3yNZGhj#&!Y4jVtLbCSs98@aP zdxMLrH)4G$W|nU=yPYN-zJ2XJ9iFkjjDTYd#NbuHS)Y-Q+qC{n;voifXOmUf zqTM)1>ih3rD5HbU1<&{b*8t#3^WtOJB0636oi0zHsqO0}RKeU*%7hz#l`|t^omgrl zwo!-j2mjPrG9rXi9J^9NYE$6i2t6q>F;7>v$UAvB?CP+FQZ*jB`JXZg-5?I~At{?h zaN)U(=dk-+!L!^}BIyHomfMd_i%65n{6%gu*Q4Yg=sp9>{OjH4V&~rv2~I93HN{;P z=Qi&|J)oN``eW6(&?SsGB@s4&-v-Bg+J#A8X{;ZtB*M zyqoq}_%WSTfgW`)U+=SgU+?1^GCBY+49hewj?08#S(@7Bl|U1Fz&Y?oH(JYH#a{M` zW#l16v`rmcWuVX3>bTyAA@40K*uIAO%x|joxhrrm9>S=&n&lrRkpC|Ep7vg^??8MLdM<7dxD3Eo#pQWwT8FaDV;K-#Lf79{eZ>lqOXb?^7 zHT<#~zE}CSdmtTtcW~*~r)h7&-88k;!TbYiyapq!6qg8DU3)9c(^{Mjh^gm?O z!SzJ>yQ%d=0=Dfo=1XJ%Vspo4+qo*hkdBwla!d?uD>r#QYz0FXen}scpxJdw*nJ~- zs36*hN)YW+38MYtX=1lfL9~wrJ_ODtd^WMOl}p#Y>qQ{`_3Oenh=;dM;$N?k&hlTd zzwUV*6<&C^b4eXS&CLQhE|FpJuJeOBvELDpXx%Cu1|$Fj9>%GcWNi*0+ovPmdac&? zswJ`K(r>Bu*?$nYT&+aI1~Amv&v99=Hp`c`*X4v*v*Sy=423m10vRk{PgFqg1-~_E90+}zY_kA;IEj!KKvE&SIA!he|c8_ zQi)MCYTp<|2e@*~cZpL}4eq@NUR{V&RNYyeA~krS2VbB3zpYBKWAKW@^+ z#~J^1wb|IOYZ@}Ebf0>3q` zK3LiJ+Jrth2844{;L4w|j@+kb+D{1fRMeJbQF}THptI^tdvSS;7Hm^ht9v=-!_*TjEzG;MS?ZQx8DdUimT-_y>^zVD z%@s>q#coEmWEzS0X`e-0yI+h*_P^ImJ|z`6YavN*-q|y&owf4027uV_ibsmcxg*-| ztfFXWN7R~KZCXR?!!O9Uk;Px;rjBRrozxsj_P?H?ISEyp0-t=yR{}RxP$Xcb^yoi_ zlIHfeqUG;9dGBXh#}I6~a5L>GMP|2|tS`zRA$|YwWdA?OGN${?x6X_5q4gF@3ic|PEAmS^o-PZKufAftlx-2zY_9+~-+iD)L5 zX6dt@_(CwJ=qdzzpXzG&h~2+*B-C3Jt=cnv2-;PnN&5i}D=-$-cT|03Brwc!IFjqK zPzY{ge2$5VMU;g_WIQh-Udkd_&ljm7aUZV{>0GpYr}(W9ly)6S(1oN~+nswKbf>~H zHHO&J(d3DUqKK-WI&Uo#%8M_M^7hOk=PfC#-_>4oe9_3z7f}m+-FWJnY$9EWoSPhq zrYx`2`uQ%|_>dE}@pHzx!?eNg&E=sM0M7O34R@A&g-wLBzaU#*Fxy(U%=8_I5Eya;dyYr1#i zEt@uMs-*#>$-Qz1@J+R|QhL!^V``9Y7?+xHkth!v)w`(sJExyl9~Jt!c>%?^B4~gr z-8!T~e$&@^@PLLzG!>HOz9A9!5AwdTdvfu3d~qH}K1DU3kPks=@O}`jZRcBS8=dZ{ z*Rp@DkeR6@UhO~1PM$eUNDfIM@W_u5UqR-jK)Kwf0ait`6ohWSxXe-fzc=aMDjSjatG`Mx{E)ci*8Yg zRJ1-51*S>-iCsZsgJV!k_bBmm(xs6?q$8kYG+jtS`j5?$HW|&G4>Yg0aVgQ91w!F( z@vEyj>n5Ltm7t|fj@E{80H>^@?VI4?&Jkca1$cb^b?}gZOZ_+Q$P7~8!I`J8g~xG3 zT+V`r-9l;DRyI63mhA(NU5H0}!(;4DMF0z^!n8BJb>WdKv{Ws)gT56Us`8{<5Dq00 zBuLXocuZwW#CkIr)LS+`GN7NrjzsN7Xp5r>I;TA|BKEIJA~sGx?wo*c&0j4YsahVf z*ihHBMB+R87&l0K5sVqc05RqZ`{JAi2aY>Na$IBaCor%+Pmst$O*{KbJIR_NKI|1u zo?T?zzSyj4HEwT-R=pVJrMAb)#9||{iSiP2Li5F~##MPl2Q2+gE#_xdC8jLTicWhR1lgoD%8JE@@%c=-H?^@bO49c;iz zKu0zBNR%$16A`;2VpkWK&3ywIIyuq6rF;NcfiKd+8*l@OE5-LO!O9lhy4iV zDQEy6Ek#vt&Pdl;>DuyCWbymC!;^!)7YS{xBf5ScK?3K@`oyh1b150BTKvn;!r)+} z_0n*pJg78BVwZsntAfDQf`Ea(X=1aMK_qq+Xj(QxoVs_XN9PVQ?=W*9&{8M0qP1XHdz_C+ICS+2@Bqp54tLW zBg|xTPNTHzX$3YoIn<%F0s(&N%0Nma5<6~HeaVawcCYs3A-SluUc?|c03NM`=$g(_ zA_7}|N#lpaxM2CMFXOM+>LsQHJ#WZ0<(u?+?_HhKUIb)1TvC1=W+CHD-y!R(x?h7O zA(rp7Z42-nBKD62e|ob_ zD$vw%ZiURKZt-J3#dAHL$^+w8&vaU^<60)v@F-%`MbiQ0@Li_GLFQflci#MR*I##h z6_{eO`(sX65>4h^AFWz3?fc>Q%w0VrNpn}jf$5{Y^`G|RRXt+{>}Bfb$-FaMI7Z4> z%BCostnQE@2F9mk*CKmA!h964*ftF2$nFA01`JI*x8W!ymoIj5mA!rFc+=`;T0a@j zvRwqQn#q;>igVMlgx3l@z+|knz}bo%C87HY?ETUY`|YX2Mo2lQ%Rv=F(&x&UJD8|dW);eswDyG6A_DqciItpHU`&YR0M@VHu zne(Om8#@xHvFfYwPc6vU`EmiB;K4S_*c35C)x=y~n})nDXKy-7JpUR)k-h~Je)pC4P_>2{Ni~V>m_&V?Wb{(vKeoHp8Wm1zRpW;=dti*ZRbt9 zI~9r6$+%_N{oJBRjO);0Z|mU6B}#l3Q%{-r5Ld_!dw}e)tAV+9U$3=ipd;h)e|@yK%4&5m5P7r~-fwc5CDD}&{*YeB5Ha&=F~_4p#m zVW*nOLNw*C%-D!YA7W>tg=7x~T03rS6A;NssTFbuKx`Q|5}+}&b}AiHt8*0I2kc=w zZq=Y{S|G(`rJiC7i-KgDIh`RivwiSD=cMNw-?akTs+ z;+^awS9l?a4<-mdWv3M=p?GRm3NR&vD*RQZH zpRbMoEU+-CYMPNb%MMw-u?kXmP!M@HOMm03Y;ZCcMVQ7uvvaIz|51R!^^65!>rG_` zX2VmaA&d91JQT&s@yz&k9gC6|lX*{wssnf73agL85OoAGw9M{P8hb<#bczd2*HkHx z=*LPV2P&>y7(`fWjV5}wuEj1=HgZ5E8hX#^gMyq`+1ma|&q2!s(1Ik?wkwh>%rhlA z)(G&TQlgyyk>Ku3nI85}G1b8HOT{}Q(UN)2GP zHnq{d{O9f~*rq68~^lB(zQLEKEo?d|d0a zsk$J2ALGw>(XqG;DKU*2{t-A34$CvuX!=9)&WBPRTLB3VVNHqU0yUsKJQR22dFhM3}WO5TaTo6A(j zT;BfygvSR=ON1+Crz1i$hiG!rhZ8@a_#Jt%%VZawxSuqqAKjn}y5;?-ZQqv9?6l?J z9z2<+Wz}x@(OCe*a?(d?{&{~v!-?K!bF(e-Bf5$H1oK33C=^;B~#rN2;5EU>)QWK`;j|%HR5+l zVti%=1d6WNNIawp)sKxPg~eF)Rpr=yFM3=pc+q|2z28sOJse@|KecPI=+B8 z@s%Cvo4on#`DPM-7FDfmM@3azhQc7~f+`_9`>1_(S+weGE?AjS)__51MoFaVvsk(8 z);J({9|VA?ZX}*lMMspS4X^&FJ)#T^q_@>#sgr<`yWm|CEyrU2s)-igEPn~+A7gjh5o*9Sa*5pPx8L-9I7CCj zg~Rr4xw%3C?&eDEqufQhzBqOi_imwqtS>vPW&0Y9gUr5N_!p~T`rrO~@4?HXJ0vxs zyD>^Pl}&f=s#f(aK_1;*_kl{p6m22Oqxa;m7=g)1Y(+7|x&n`qRbLh(O+iAV+^RsX z9*2<-WinR@oO-f2#`oc(vQ4f_Zo{Yu_PcpxXWz*71EubW4~}z-MaHA##G;Hx$uT^7 zU*a$Guam?|H$;WCu@9Z|-aNWIXJ;e-f?)a)w)0Bcmo*v*-NR=<;1lu7E=iU3E2TR)YcKF=-@jhRxsrZ8WuzLI)a8Y9JY0wad7zeK zf9t&YBbCn*4fphTuOfFZx6Jgc@#=QAM&QFh;Za<{RsIImkn;wl3OmvB%3iD%sV_I^6POni4C!%YBxqm^Gf|91sRo(f8 zekV1T&Gb$68GvcHd-NVSbZ<1BB75@IAq7;$Ju2sMD~NX@5q1wB5T zYqOB-g%Y7_k3XMrQ;+2}u%0nk39M)G^Gq3}=p5Dj6)N6O&rbH~kL%FL^6il-j-9_51-ZphV;E-Dog+hg zoH1jiWrZB!>=iPjlEXpqa3_PHQ&vB_ox#?M*_Sw&?dVI-QQ6A)>I%)Hg8 zdQBtpx!G-6L2A0F3f&d#R3o#3Y4Y1DpIIwhcGOVS2}&CRcj`7x_0f50FAtsLcoOM) zB7UO6k49(Al?8D2g4ppi|GWT8t)hS1Khpr}Ep<+K9P9}y$Pl2ve8HNO@7f=w8aHLWjb-(w{dM>oXhEXTapoZ=g;96Q%EsP*0oPNd(eN# z!W}p-uXWcJnsFr;#&>h^uz18behA-_m{t0|Vf$HCZHF=cI#sP+tf<*Lkq>ydXs%q@ z!Be-MEi{|h%DZfD_)U( z%~ln@lb(rZhuw)w9degxtH7$v=#J4PgkZSVoUkQgJi^&>TNsHe_HXF8u~E7p`daj( zE+~PKsIT=9)7(U@>YKq3#$a#y+?jHQI8ActQc7;|_UPl_NG~Q?{EQ=wrk|3Wk`ogC zdgN9eP2Uu4YvSss7^ z^;6#w0&zhz6V3n3k{R9YgBmv$#QsO}-`ga3iw#v|&5rTEK6B{8S+}Ic$Kzl)0W>&pq z{H9WptF{?QSuB(o1p+KYcM&v3mGH+@`7+-2sTq3Jqj+&uS;T~*^l&~NUS@SO z=Baxev{Wb?*bSUhqTi{FYGTSGg3YtCkwfGOcZ`8BjrqT0JW%BVQo*`?4%(svM2BS> zkE~HdD0k^_P=X5>ZAJJ(twy4kbUm~j4Q%QYHHBvqflAin>wXWK9*tC%T~WR{r6d=e@D zB2x9baRcHaMU-G10D;o2E;r_#!eGTKD)CQMlPboAcaZ!5aW}H7r+Dklh7JykEMw(0 z=HElvD97>C`4aJvqd{O`avKPfFF`I%LW%c}$uy1fpqBbP45;D~dGZ1TAddekx?voc zb^wGA49nfa2#`FI?{xbmFiIIz=CzL}UyD#$R3a+4)CBRk)D#I}%yNZ5k#{G26Ct_% zqi?B)5fwcC;u_9TTtZed0Enka6cOy*i~Htm$;la<)5yBf^qG)DHx%qb8*8aSj@R`R5AhdY_}{Lqv3#R@Bak_Nx}M@Oc;0iZC5w zgcAM*RRcNz00ZMhTtAWLWZG!@4nfhCLdn)I3Q{KlJ|BN}evkcd32ntgp`*jS1}gQi zh<-XL^(USK{4}GVmbmm8jkMeq=jp1^2jDr)G<+>~wLO}dci#e_hIxVDni6BXEQ0N! z1VaPwMgk#}rD%u1Nrob}fd53S?G2MuycBkLpE_eVpkgau4!w%$s7Y!AC?)R7hG~wK z4CXHS=LNv|*{;$a5_j1ol<{c6V?X0W%ml((=HM2u+3|oD!a}DHM!tqoH>v%Fx z1|4d};c~wSdL$Tz3=&G9Cf&00E}!pCM*{;|D&FF5Yg(LCJdExl4a(XswiIi{C_h?2I@6L^Ir+DfzKJf7mR?bcidc^7f zY;KM^-K2JPG?fpt^3n?f z>%FJ9VJgjCpelMqH^PdHV$lOLu7!djr*{IAcrZL6t~9G+ooR4e^XBjYz197*LTn@} zREm~JRgl8Fh>NzDy_)&AUM3#6*C7gJ;_c9J3NZ_`i8c;hJQ#7BQGhU^OpADh&C*u# zYvL6?=@ncayWC9L;)jU$^=I2p!!ja!tPK*sFn3tSMSO!ZdI2z#D2D8PU4`)_$Rq6f z;~~NqPKa%H;};TWU%_8rol5@JT)2&;?j!9={KC<490TtSoRYk&bxc17b|*2IU!Ex2 zHuo6RW=8GCtawiWTLsSZlvPU2B@5WxKZ+64PK8B0(c*3+TvAGFs;@;RinMAODGwmT2lw)_6m%9H6!>g zfpL5LH3iPaeeu^UO%c0*Pe(sqU2hgzGN5eBd8qgvCfhv7$Xim#4{BN)n03VpCD{1{zk(H_pSIkTZkfIUk59-S90OHvJRntLCuc?WsAeSZLkr?gQuPT5Fa3#*&k= z4@%$I%z4ANTDwz}i^96fZfB|X)Z7k`!6o-*k-^qGeO$kYC=?)rfx$_ z7B{3LB=%oXtb4c>UV_;4YzzP5`jeQ$JG*y@uPA3^WMfv4K3DI%BUPJ;3d7kJe3%KE z_>r^qA;?LD*~LcF?NVB>O|*n|=gS+((b7IUrH9GO!F@OqYBfXbCpX8U?(!bBabcTW zFtU7`>}_yly7qU%s@~$XqtfjBg%4{vHk@eTL0q}RR`*D}HBW5A&w2bx{I&blVxCa@ zZn3}ztiQD=S&+*6O~gx+)3#8*_>;><3LR=w`^*EeU*N4;r;dHFLpJJ|>I?(lE~M$g zQs-nf6jw7OesWm4mzCjB(l;m2kX%1i#MXI=& zmcD!_rY|45^6O@F$IWycQ$?W`i`Tp+VsV$mul3x$;Y!3OsQ3h>8DTrXh|j*=pJ025 zMic$4^fEnE_3w9zmwvA5g}e7y1r@nmY>^O@Cvpx~hVp>Oc}`}lF|1bnV6_)vmxlfB zn9Q(es$ox6_wdxpp@R+1-(TeX0AbS~?<$wN$*(T3(Eaj{SzM~;Z9Wi>hkyd`Jvxvz zEjugE&)Q4gQO?mOKHi9+c!9gyhu)T4+nC2}WBagFEd8yiw$)s=iu^gbw}hYW`u&;D zo-a^x(ejdymL)z~5J3;5R!_e1Hv5R6{}7d9tgh**-dh z=>Tfp`9l_JuDZoX&9T|=PXw~2XJ=jJXQdzD{>&bQB7gpRfj|f41wMb_lIXy2*|hz` z)_@2HXDsZvVU3hGQzKUS%z+sbIIsWz>pXP%L|maW=b`QVV?I9(*#H$GVYUaPdXXEL z-+}%TD?!{mD#ZMZR{Vc2Xe|wUacf1|_?ln?=tgFI_J3%56Zojgv+qA483;l=Q9+}Y z$Dr6IA{NB7M2Jlwz!{t<%3>aOD{? z5pdsu3eFf26pay={J+2ZJ~J6W`#%5o^Lg`8=G^;!-Pd+s7d`cdr7lMCEjxmo&h9zC z|F8Qyn^ZLoJM;L4!c z8AxWjmyqqfjNf)AaW0`cFV;*m0HpM(1l?p7)jV@)7ZCZGNy<7Vbh?t-Zn3ilq!iw$ zIkQ4HaI`sy%8jT;_ROpTsphbWe0r}tyNJy0@Yy9;iWoS1m_L6y#uz?*NRMgJSr|AI z?T4L>KS10C8`nx21DTn)wkpx~?=F5cN;_tzvhSNLzsj1#xQ7OV4ys9S8%s?T+EFEY z3U8t=j@4?naQc#=6Soe{vq})M|8R%$Kf_yjw8$)#k&#aY7GAC8TK1P3W4s`Kyh3h| z-p37Zn6B)PXvnQvecf$!{;283V2shjHKOp;*^Tx=7`UPnpRMUu1^%^~lTGGemVh?;Um%hl+H$eH@dnq+vbZij8mb+dp>?8bZq8{EQ zy=#<;+r!S7cV%ZIe^=@;^c3))T!eJ3?S5-}LmHWXFwr~06_C%XQY(($yBE$Py)QMo zDXyP*jmqmQwwkw0P+U7Y$JZdEPXAQ1lp|l#{A`juhehQ)32yNZN>v}0`}p$y6k9&+ zD^VGVQ=Qwo*qm#s2u>NN#n8dqI>*m3#PKTU(I=Y7>Lm2q#gf`m97wQU`^wv$8*W#% zC|Q%rny0>P-b8^)X-z#)<}*s9&aLIDw!LmZv|BA)hUqLS@Un4S>SwQY7gyox*J@+E zc}u|zRJcAxrxT|XNr$qI}GkZ z5wTVWNZLGB2WTE&)D!lAZ$CFp=BNU_PGVLSXdMBg3babG`>F!nr)a4H-K`IAhm?M# zzhN|iz{8~t#3T3#gHdlppTlYa%{esK_c*ZT@kmhygOwsjy*N79QrkCi6meE48`b?&q zJjckMfCph7`<8={iJvh|*vk!1f+|&6NAg%lvrO zxIji1?B^+7FfW5L}z3(sBw%FR2?C}Xi{jN+R;d)y}6xaI|y`YWfQ0|DOotJ-eT{Q6fCz7p$T z_Zv8&yNB%A_g-%P2h>ju6H40tV)BP-h28F<$JO@RAl&wg4E$mL=n)b07Y<7Ia~?6X zK>Mj*eX32ew6Tv_W{ktm*phicVqVn=pW#q;A?KPYMP>YDS$!~WB)Q45`e3p(s;6P# zG2F&ZJi@HYfdPtN)mHoK9AfCvU^&y`8h5KYW?vK_PfxL;oDdKv8Cb!Mv&mY|delq2 z6Z>NRES{#M`276idJjFwSDeKEkO#)T6Mu`YVf^g`up^<4?MHBkD^{gf5gp*cR^`m7 zn^{{%Xo8`7)};(~7stb^2g>vz>+9%TR>DXiFlg_+u_m$8%5BYIeuJsRhcKHY1V^Z_mygD6JdD~ws2 zNd61;`OmrD-14lZSAG6Ryn%2MZwXoiI&Qhbsl6P81>>|{%4!0YFreRJD_ZJvuu%uo z%c7=hI;9TQ89i|7()y~c(QD8L%a@I6^ua)31AQ>*f;~smwq7td=C(fn!_?1F7DnZ% zJUxM`mPRVt0+OF~K)|sgeFo88^tyT7Bz!p44I2ooiF{@)a;Z06PDUw`%_I;Ok8zuQ zrz(spi|=W_vAu*RqldD<={<75F=YGE;&N3>mnqQi_1@(kORYZ^9A;Fs%!$9kzNxcJfzgR)k9%PAvJgqf=Np({H@>65zOMc6Oa6os~lq=j-$MN4&?omPNC|in$ z0vWQjb(ASUIH<@zwoffPP`A)~tp&XY{Qb+;Q4$hm=y`pD{%t+$90~Bx7GEoX_XbT^ zLi-s1O&>_M47{kbT(HrJjq`XH@U7QN8r4zW6t`+`aDQ~^>o;@GNx08$8VfH1f0Ck< z44lp^M)cS^|M$&w08Ptzr+-IF^J%HQpeA}C-IW=Q^ZK)5d*MZ(I~qrjquS&EzUB6- zoPM=E8k`UIQ;N-CpH2vN$(YH9rL225-uaC7R(h{^Yn{Zc)S24xOm_yPiy%SJKS;B< z;JrfD_vqgI!;V|9WfuyLJ=fPR_)5`U0q;dY%Vr&<9=)~~FGPDXnExT|#^>v@Zno>4 z<6R*NjUx-p(iY<)2dLn|`G)WKy}$a{Q<0M98jw zdF6PJaL5woLpBQBV_)QP`go;`*N)J$t02S+m5J)K@?pAZ9rkP&uf z@1feKsLaZhAFrYJxEC3j?~jT`lH&j&9Tz$A1G}?GH}<9#!aqelHl*BMO{Q3QAlePIley)wx-F~QK+~ANn?<0I* z);8hcOU@~ZN7Ef+cPs2XHL)<{_xS~vjr5T7;~N{>+~nK`ctxA)F}%QNweMs~+}Pa5 zc&J*eQN`x2;j_OPVC)X2iFthUuS4@5KTO|x&eB@bz$cSkLJ(ALd|4ORJKv-PP%t@u z8c3K%e}j`NiPxf*V?q6f0+!v)&yS|kbMlFVD}K@^8r2|FrUA=LqDxeDSq_V z+SEq{%~vU3wifBH>Wf)vpy+G*^e3(1bEo}m=Ci|m+6ryHGRlB9UehXkap_=%GQ3`E zNWe0Ht=Vza9|5i5SO{_5_gt`YELMRNzZ~!vEK$0*1%-9yEc}eKVNb;zC;l~Ohr^)b zgLS-d-R#*pj`aDL+jAo_p7VO+hveksIPne8EhG(Wyo?i&#|fzSo_k6Fr0vYE`;zlX ziV^ZZE`6Z%S>^#kUhPvwPJT@PhGhCTeDD4p(^a2s@B07PULoxj+V-9&qjRJ5^lh83o3N}h zt4Z#6C%%mL3M39}?6X(1=Dtz?L(~_t_5IzHm&U%W?>-amms{VZ|FOPEa%6Ysk<+_3 z?PfOQSI@a|GqpACWEV3R_=QeF?@VHAup9jnrg_sx5@IK% z5962nB(|nz0U8oTc}goFE@<>iHcf0zeo$z;-9l6rx0NaP)j>^HnW%h4P36<}Yma*6 z_ALV^bKCnf@wSh*n>w(?7ES+>Pj&F;CdyPhKbvn=SH5N0$UG*J0jlt4L^kcFpCd4m z8pI9ZlU7*qqcn`nirX`qK9IP*=K&Y68oVl;$ftS}>5BRVpG)@`pZcdvv-$nDao*pN zt?w>A>%r}AV(h7vXqd*?e|Ds{C~0JGQ?~{=Q85&W^aowGf%^u~m*>r%p2GkiV)-huO}nPl`4?$B8M9h~^#Sq}9WbTNy9iMJZD>~( z-c8}zOTXyL*)aIj^SS+#ewtjIzt|Wu{DRcUDdvP%HO9FFnuONEVU|A0z8CS0osTD( z05~>yTj9CT!k;JsTK!#l(hyJs~wND_o0{5qK)EJ((!(QNN&ZL~Kn7Tw-D$17dX=jtc#mAJ|FwV0P` zCEUVx{?6k|wggJAku3o`KIl^zQpV`!J@DhjAAvC+Z7}o;)PMXk?IC!8hHLy^3RF#~ zfqzWLYL*;>)ih8+u_o`q#)TMCJjid{uYDz<1%#H?IFGE75F;axXFHa$9s8PEWv~*2 z?<5moEhXc5mQv=Cw4M`sCzoQ0Adrrm*Sauj?V5T8u+MIs$^r!2`Yb-R=vHcz86W$k zOnU_O;U5I*;p`-)kuxo=R@R};zq6SZAz+;w?l4VT#8cY}Qv^N;X28{)@u)3+Q|941 za8^zF6Ux({*ekA1^Q*Qr;q zZR(QrdU7CN6017(GS{%ia?|p(ELlhV3)%4R@-{bh8N?=yat5%-KWZ3nYmqdrbSrr2 zlc_CzqiL&&;j-U9EW)T?H{?c*J+-IPmp<7&FLed~oa^4YVyWawYktuqOE00%;?JIL z8QD7@0mfQ;!H7)7=`g^?usUvHP2p*Xfn=CtbO{0KWhM3Cuoa(0s&{0oa1 zeT1j;r7btUYBw+5NDnEGWC1 zFF*9}&xYn%<@(TTd^Y~jZ4JG^hyG&KCzz7X&d%aTiE|Ryt90+q;(JYK9wCgkX711O z_8v`6{7!bQKd9r_6Y{h#g|wi)5oYpSsivt~Spl2k`hCoc7I%2xDO46c!Ca9;nq$?? z6wQm4>~tQi9BG>Qks2)~IMf7xK+yI29!J3M6$|y}7wFmV`}}%q?8Aj|TvGeq!kLE) z=a~iq-O`T3soXwX*v@BAFnj$XPU!pAo0{y6SiPu%A#Ne<$Z4AXfk5tQU>1#i(~mN+ z3_k!=!}x!IAu$cb7-enzz*{q5KKf-|K_ej1^e$($;D1ow4^8@1@_^7}e)JbC%ufiK zh51n?zWR3qHAz~S|02#wL^KQ*ro@C!B7_$G;UI`VCZiaf@4GE)4w&K&Ej)TK6?d)& zPN4{I_^SYmX|d2}yUaXxGd$sdt_gj745c^1LRbR2xX7M` zy)$2j;b1q~3w)*JYBw`KroDu1FEkG(R{CA)$>MX_{RBSNr4fSVw(!0s)p-uHW zyQx0qa`?_ou72(qbOC*TkDi=XG0J++Y^9G0}? zn{DM4KVtHJ#RPuq1{-YlaIE^93N;pNuwH7&Zm>Kx60H4DZ86qoK9aK7$inUmR}dMi zo^E=ht+ETvPbYEnp?0fmHKE0Xg00epYKZBeu7FtdXI(kn?YDZtwmkUO6 zUxywq5BAM?pw_qSo6~dGyUQHcDvD(QRk6BhaMl98{NfX7EZvI+sQ--f&DAWkdU^x- zfAWv>E&3SfVeGBX)R4N9+Oh4%`JCBM?`=g1%td8Nk572hqMN4^a~hGV-Lo$WSG=n0 zb&1ivz|v-7J@X&NbC5sbdAoxms4~$f{x5%vl z@xkCyi&TwbBLh)0^iFo&0@;xBPHr&Hioolrq&wb_l=*dNALWY_TlG9* z{W2Oz7I9yr?UJR}5I!=LGa3SiM;_Wu-dM10y!iTK8Q>ZGFO{0HMFAdR^q-XDRCj@O za^#(1^BW6|r;^u{$>tx6f6}pKk}=O7=^xa-I=^wCTZOpWKY5t&>6wM>b}nAbyc;?A zV1CQIgCvX>{Xw?z%7)?k0FLfKr+}VBUjgQpx7}sabM5sTkK`;<>V4QkU?;BG2(6M$t({GVcO*Ok!Kn6mz}=}wg97}%;{Zaj6PB0RiffpNA!|* z&N$oPl-R?UTNxhMgOS|_)TP`J8Io~d`LYK14@=kC`Jj}fg*g?^ypR1ANU{MP@1~ZJ zF1&4_^cjpFl;10QGtq4~|NrX$)tteg|DWvD|5>W?BOubg{m0Er7QTI3|IPi^RdLXN zz5Eg7R%G}Ls=b+elJZVMs-%h)J!8gmqmmEMcoKV!Cr3Vt@JHfzDVuqpL2aPFRCrH* zbP#RSc+254#kPE-XL^?n!zr<`CF~s}fFc({<+Rqs^0WVD))?cLJWoTP7Izo9F0|IU zXxA3_BmqE*+U}l;zK8f5Y=@}jm*7Vux}TLHB0@Z{YoP0?T=`?Gek;ot;LRFIB+Jt5 ztiWV70hZUqUvc6x^K8`sT#-$y0EF{oADn;NlqtBk4Pku1f(xBK5?Z zvXf?%N|8IAz{|iuFCzN=Fs`=USX+L22$Qz7OD_Kj#;9H7@@-EGju^KouUYlQ+H-NS zV&v;{HP8CX&R5r2uaS=Sp7dm3@Ylknnb>Q@PI}cgCw3PDfYybIWZt%hV_#uQ=LzDV z*{ntlx@fh@$N;SBY&MD%50U5^OFCaU^~urFqiAJrP@upOM^=vlO=FLY(xY&$?0$0c zx=^0fD0bFXy~K>pADtIHRI;rm@<jx3o`2JK(!moWP6NQD2WsPCUBn zfxw##z3uiae1hNEyvKMftoJs6srxnVzVQA(`?pEfSvB#f@o!V61Ks7{=6sqqjA!#$ zL#Li}f3b+G1?%$i&{h~5Rh;)@+jkORcRd?41R1d8Dq;2N$=58goc?D~(EORZ&exHE0!JwuxJ z9Iw%h(-p$)5o#~UkDkQMd%oz^@9?V^*rzQ{%|H^AMLGcM>Ha$nzRi8I&pone#P~J69>xy&)I{cl;b@J`T+-1c!35fD{A`? zcxKe!hL0`PxMm#)Q4J1x2G>VTC#rcy|1lT8QdN!H*sfXl7`bpc5J>KVj;d{%(zm1X*ezoPsm>o4fz#y$N78DBxQXP}C0y{%1}U~gz<_NqGGpMLKI*q+?>Rfr8? zbNp1k8dzJiBlc!<%zbYUiuCovvlQuBq&SHm_YNr1hzXVxgd!bFAQl?Izqkk*blS5+ zVF_-p^N&`%IDheeY#*czCm3!@+rehO233#`wIGv0tpevKJ!yPr`^D08bO zl{b=+p%U>1oy39P>U($ z*f!(}zajbPA|P3;1M<-)lr_p5pGzp?NN{ZL8A%#HAj;PeODcb(%K(9fh}n@FWZ|$)lO=QnYUADO})8pDF)ucM@+fMHwXu5kzsTO3f?t%pG z-CbKlS{%z@-cr4&zxGLvcwYK=qCvyKUx&%LO=!J&oY(Ie^Yg0*)V60pIUpCHDNguf zDpzc(%j_S+{-cxlk0m~bx#J{^lZPxr?O|*zWf&qpP{p2r1$?Dnft0X#kJv})UlR=a zYr?{kg0Ph|{D_;}=9go47)RfBC+bH@#A4Z$4KIwL^rho=s3ZIKJ6}1n`Q2vNzU(rUG|)C2{URV zy$K*Ow{2;<58cSZ6Si?rRU|&|9q+UJ`@)~kbK#G{FYq?!^LWJi%NvB?$@Rw+HGXg4 zm{Pq9@W-6*%E)=fNuGg^1Mw=iMg2j)Q6523ztVLn4i^6Lp6t4>4Z7fuG#JZKP}t|A zuHES5+}BmDF#RNz;-KRfIOF%tl?b*Q^0u)hG?n}Q4fT1jpE3zc=;!#N#@;wYBb#xu zmuH>s@ofp$r4!6A=Yw%re|m@cfj_+y7VYheZYd=j z#Y1p8L>2-{boy>8uDcAGW!t?L?l_N(>8wfx?|p6d1)P!8*&m>coN-dzc)cm|gxR-e z@K|&=?y688hF2kx;q<|V`DxtE5EZ=&zuG0nYxd`<6L|Cni?cNKS2D>r8N|3T)Fanm zGsg!{vVbeGk6_x&E=nI}U}WCYP4vR9+ySZ)mTR!v` ztL`kxz^{eGIf*9K3H*wh&hzrC3vF_zWD`MhK~C~Albkh^kUFKS;tpGKRZht-a+2?SPwi$)zLS%5 z@K)0$Kd0o4Imy2>$=Q<8oTRO`$_&CmUkdICEv_Rnj-zPWc8AqlGo=XZ#T)=DYz;p z>Aa3TDqWP5BuzLf9hy_=#W~5_ZE~NS{1Gvw7UjthWjLq28uJv9K)8RD>eewU;-h<0$Y?baIpWdyWm9@1i_V#46aK&+nCSM8Y3 zb5M%yR+XnAH^R{IpSPjPywT`am%% z?GAgdj7wfu4H}f1Xsf&*&@6v9V~pnG;8%?1+fO^$tF7Dzvmi%Dm-gPYU#v$biP*w4jT2CFjb9qA(O2+(ir%^C>r7VL8s=j!TjpI zrWQwk-^tuDe3Sf7f_I}l^NKhlKae-)IsxFzm=e`>SqYETmnN*!4=23by>NZ{B%yM9 z@VkQa3CiGo36Ju^^{G;F#d>Ar6#KqUM;?k6&K~w1T>lW~f7!1$KFq}*zUw@6`SYBK7~Wy591yT^fI|aEmA1WM%ccIx zQkjh;eYCH#>!$Ho)Gs3(i_;r{Jqu`4E70Zka{YD6$VOW{Q$O#D)2pa0+b6=Z-WS{) z0zPIHt~1pj%Fp$~sXm!zGhH}_lD5B`>c(E_S3nGGSgx#hn!U5a+=G5-?VotJjef%o zUzqM1wH9xEtorC4!tC~wYSxc849#on!N+lYaP9d08vh7tIdqB}8;;=QaSE!$E*w<^ z2xf?kPGa7S0Ksfuui%vgv0GpDH&|C@T*xXS9@@RYy*lreI&V#^`hHVKz>_>j<*ho+ z>3m`!c^XWINY(O2?$Ewh-N_w~zdA2;G1WuZPBRf~{^F^MNESPj1V#4a(a_NY^i=|O zTrkCLEns>$sG%ds77I<|U#W@Peb;x{-HdUgbAz$<P1QYadQr){Y^{?jgY=g>3--{8=*b0Cg9H?Xm2%T@OBHz-;@_mQ(-63OT|I#2b$2=(`0a$4S^5Jf70ZOZ}FOF~)?c%Gw1y$`2_y~I& z!c;M`z0SegWBgU3bOXg-G1*%%=z}#G>_CmctJVj-!Y%27(L*-yB&o+}=aFX+VXlu< zt&NT`lWq0Vt^rVgF|#b4qyn>lOqyO@xJjkG;4Ge@K*a`Cs+xjY8egf!J!zu7Zb^@5 zvFn`#tZ8Dzyb%&OuVKoHdopF%b_B`zA`Af*>EBX|EeA$b!f(sy_*&lC#=a@@<6hKTQXAdLO6dzq~{BfM5~k7LL%P$0HzviW}NCCW7Rlwdg;Vv znaYgmuclaLytkVsIkzTFdhFTpitF`l;|=t=7JSj9vhfMZ7W<;ci5q><1z%Xk+z3Sz z(0s;a|5gFc2Jf?iK%oMCZJ-mo0nXy0Af-epUjhq(+nf`-9{w5ZC#MmV6W_D1YV-7T zhgXm0WX^aK#2*gL`yFo8ZYTZ~q(R#naZ0hOS<6O2Aw1dl=_j4M=oxI_UjL)*)%Tny zgko0SLo_U@CaF@$4lt;%VOwyR!%p2NL*#)Cr=!WrfAR1y^*)`Vit}$5R2Y^ThGtu8 z=xRO6>07M&ybW!)XW&B@ewzH=Nqb2!{m^HsV!@Z4^OE=~Oc9hO38v7@c# zS9h!xKmah`Ml>*X$i`X&@gG031^}U~sl@lK99X=S*3b$H=r4N3y-a0+lK{Eq_-xN# zriVQc5pI5)`}xam|2F)Tr|zXJ_eFwdwj8Ll(Xrqk@TN_=M?u;VY3?P>H1}xr1+?-+ zUK2G-il*z&^bPsOp1mtdy??arofA*0{p20$RT$&*d3j%yHF#e?7hqhl>CmTf`9ss^ZG(Q_mY8@EV8ElfLpK(y+ zsP|q8xb+J@Y&d`<|8!S7t1RqaQz9oHFn0b)ZnMAW*qC|?49XFTvoAd9ZX(aS%|`| zl@y;~zU~5e14vwN2tL?WyWVLfGUA;a^ResIb`W)d8*AnE#Zz0Xr7Tj_()dT|_LV_v zAQqC5aWLD{knwO;34XZV3lS_hE}>%)|E>Xgi$(hqoS_yi7sPKH7Glhx76n05eTSYpxQipC7)F?jyBb{7PR-c*0|}A zR{E5JyG&=ovE>Y8l^a`;A6~F~6Y>Zru|MY`*lhcMt<7cyB9TkjYepb4k}u?k?8ox@ z{CR`J`ICpa$+HKz_4!v2F}17>=g>`R#bw>7y3AehwRDFdp8Z}JqmRCi+wT3Mn^C9S z311<_q4>*}4&Jin!5JCV!M2}(;Ipm8ZLI~$Q%x&FFxYi#t;ol`^mTym2s=gFi3**> z1H_vBr%I@ABlXpLo9iJ5{9iN)-SQXA;RjOy;rubBbU6Uw8ieHeH2Th&Ujw8=i-iML zu_3I&lZ%STZ(96{5kN0bC`tWMW&Kgi-kS5fhy7VK7^KwU zhDWt|m6KyNKD`C8p&f7B?!aW_ySr7n-Tf|B?{pgIl}pV=8wC7q%Dvd6vR(NN1Jt#% zA@u{(bjVd2tf0x^TMY!s%=*8#&2Zkt(ImT_N&!$)iPEvA2xkd4onFZn#Edsqo%o{bAii@^<{-YrS3oE6 zJh1V#SoJw3pAh-!)Z`?dS6&eLpPJCqgrF<-;E%00tW2Cr8E&SLDq;3>Z-G*G;5s;n zw$6DPMQkgJBiC;Dq1=sHPk;CG*WCWBDx8;jhe!ND3vR;J1@1j30XMllpvns{E)*Sv zod4S>@V!J&nf(ikl+E|9s>#fs6%AHkLUG7@CLSd3FE~Pv-VM1IsranE;>T|6`TW|4 zVbx44YP+#>ecOwf_0mvx%3T(R0Zybj82CqwZ3-EuTCc`BLQY)%ENa?UL`^R5tC-(jFHvKe| z0zn|4;;)-Ajw{0FbmMS5$_puQW8WMx>$uqF{AfjcXcqaIiw8}<;?J}@3yNQXCUf&K zskY8e8uFv+50sRwJdtsvZUF6JC(Qn3*G^ao6B{Q(kbnzJRiU4n{3my!zFS!4ChPiA zyMO3ZoG7p+Tnen3mlb?bf+5GH}r4l#b+Y6&xH?P8Y-ZZwtu8p3RSV zgMO^;VL0|X5!IT|0-ec>x`Pkl-P)) zOUarS&EFY2wGh)br#4`UY`mKsTg3f7 z$nc+*+PB4#;ZsYT!~}AM7qIa=!N>6{&LNvzGHZY3ErW)15|=82KWQ4bs^l>CP zU|_w@T_f(}4st7Abn{=<6^HN^m&j+9HqLX0pIg#6$6avko;`#S$7^DBPy`D0c{=Kc zU(^sCKB~QLL=j}SES-g8Qw9`$V>sJ}?u|9$V}5)`xN5zVc!BN0$>Qx=#(v9+aQ=>P z>;)F{+9F2TkRC}De)S?i3wvzWQ#v^2r3rW_xRH>dl2oa5cDb`zcg68lV%FBLKE;-M zf^z0jtnze~+k_U)-sPlv!=jWsi37}>Uk3mfesP(T(B<#Ot|`ky1Jj#_4^@Lj%qUCa z&!Cg}p~N4Q#lIG2@p)y;mdRYH%uFU22YFv7Z@B8yXstqadA(~$noNCBVI`Bx(tT84 z)vo9<%3~%t$ilbH@hj!R^R(67uj<5eX0{F z7s;hId7MrDX*PM2P5$CoQ+l9HepbnARl3C{zhRSm+vI3A`Hv(^-}6J>FH{#k$>oJ| z1^hKm7r3YsU#{8lLT&#d?Dt)%=;3`Y;>THJm_x(+t|!S^C^jV-UQ|Aj5<)8sLlzX^ z0O%RRBc$jho`A|9VpX=d7e2I#Fb@>l4=5nRi0VrUIE65A~## z^r7rqlRp`%5aQ*9x|zn8rw1FTV@A=o2;%&eCx*&+koA@gej7p!nG!CXF0{6y{9!m!0|2*{uvat3a(;Ph0rd&f*Nr{HfLxAdsQ>lU6qwzc0`6n@!N1?BwF_oE za!z)}Yx&IZjIT9$jA~kv-Z+V$D4$f*=9%DNg4ACD2Pf<`Eum8|Sq~=^tFAFcg&a*V zSqG>j$kAvMI#>nSV~O`UL~Z?;*i|jddD*=bGO%Vh4cB%Q^DOS$4Urtj0~ zYYiR$_|QCUCrx4+j}~H11oXAcVWTn)&oesKWj_4A2QUw=@1WUXE?xh0tS+x{^RZXj z;`aPl3e#?4Lt|BJ&>3_l->s-TpI@=JVpt=1s}G1b##sNQqg}c9adW~wewG~~RJEV9 zj&P0aS5Hu(WM$pQupS!HpS1`0MD0Y{H41}(_sI?BguP17BmPf|hP*ji|22yt1S}ut zPh5?z)yC*yhHf3lI8HBtY7~(<1p8ab6A_=&XGp-|}ZH z9qpf13T+!b4EW%idP-|0Sfe60{{>OKIDm#Kwd82yvwrb8H)xK2J%_afdFZI~Y6`su zG)5ary*Xu`+Z*=jII?&p6}#)a^9Ok2zvsCOsCcv@-9AiJi7u5DfTG_#$_{f|TXZ0z zz)bYj%r$VrfYcEp3(NsFm&au0iCpHs##g{P&P_`<_>=bFuuR_RC5_u)>YX911i*2q zKe;frwp(m%zBjqhO){Mxbv#HN?1}%PUF`|K@3Cah$d~rSC%BEx6R|NxR{jrF4wemu z&2vheMK7KObzalH8szD6z96Atc+b@S9zJNrBbVql}r1n>yU# zi#2;rYz7g2DgkJ0srzYNs$itse)bdeb>?0WZ;1Bx%vO@tkjcBrO zj20_@5eCQ;b9!oIdmsVqH_?e(<)Ag0bh0u}rMwZM17s6(`fJp_(^;H)&IC0@>;6f*W z3ngBJ|0d_)CBhuQ0MDn&txPbuAXUD}R}Kak)CmR%1JG2eb&KSG#;B)-lam^7kxTin zOh*h#D6uqi{;eos13gR`oKYa%po9oLK_y|FI*Z<*W3_%g`?ueGfLc2i5#v)e!BuZ_ z`DSJs@U!53=KrgR|AYFf51qsXYTNHyw^%}q;^fZ-ZO$uWMSv3EWgudr3>n(fRAHUw7M5%8^nTFK<}cZF=1z%~f? zUmY0^9ev#e5r1w;eZ}YDSmzP*CUS@WGd`4=M+KV;Vg@_Dr{Ma&!Z@R;^cG81_atq^k{46ehHb;;perHt_9CI!?`uQ&)vpoY zHp{m>syC=C^)~o}*&pnebLdwSGv9Vs*P^DsPf=w2+tW^-U%f*WFiCE5g1K&MCP z_PmI_3RUeRiyOPha$uHUD z**5u)G`Z}zN*-pD|7nvOZ1O);`d%d;YLkC$ldEjZ?q_ z%zj;~a>0Imitlt^wjym7(dOtl^1(A{)^x;4oT|_2A$yenQ%?Ecs{Aoz0<`UPlh>9k z*e0=B>Nx;x`dJvD)VunACZs!gK<#T|YdVK)eEj&FlX<{?;t4nB>vVF!G>P8a()0vA z{OXk)Y|zmmQ~@QPx(Idh^szF3SaoK3<6M~P%76MoGM)WLe`IZaVb15^DvZA<0mZfJZN3wXn*#(tnsBp6S zmaS}tQqi>AH=E@1ZSpXiJU*MePRU*kRn?TG%T<+(?n>&OzaC3s&ca{XnK@+}GvhHc z%+e>6PS3U9`z!vceP?ynlg#Q3mh1eUwjhG!zniYzO&6A3rLLWBySB&}y7!S1?kw zMLZ3NQ-5;KI!z`A>r|%6$nZ3pG}D=B?{25*Np=p?bo1ZLG*znc{+fq@wr~GqlV{oF zcmAD8?oIL@?}sHf*Y${C6lIjzJMZb%IP@NnpX!BRGSS|$MRPRC$a#iwAN_2u$UO9* zh8f#(C!tDh=^AJ{u6JN6^aS=}^4Eh44V%Xv$7@c{7U4h{Lhgvzpc@t#LN0U*zo<&4 z59uKTa!oV?Z=M>`v7+6XdK0)b!$A4;oV8bK-p|{Y8LupvFf8tts;&WnOZhbi-_YnCbWXk zSu0}IU-KN!zF<1v#IFrT-Z54NTGNO3V4nBTug%b7)?A-?5X^P^&C|}} zH-+FP#~kux8PljcLe|J*9c5@*egOS73gMfx_-@j?9W6TwV>`NG(!r0eu)J33HMq$W zR@C#@2<=igc}h_()fI6bL~Ms_+gsjP)OL*MYfDBoaE!l&ZWfP3xUd0g16Px=>QDdNg#$V9 zL&(Htt`ni2x`wr_18RXhwbg=$3-xYk>t5TEF0A)<)Fwv_u7lce!(JMFuAU+~hEXm8 z)@4-^T2j4hV=dee2z6u4S19v%z9&*ZWKm1naa&RcD(_(BsUh?1So3wt*FgAeV=>%zfZ3RR>zkRK)MUXa0>9E6Dk$|fzT*V7z%aq9~F@PQm}YE zW%e;12K{!c5NVw}J>p$Jl{>ZQ3!oB2&Yi_#=)ARj&>a(wgJ(}pjvJhuc;LC}Z|nnz zpw@aZ^Ah9MxD=#nPVJ`6074yC7)tMK&{x#+Fyetg=I^xYPV+8!JO_xx= z*{^B>3z@rF)Wz(Y#`VdI>{YB3n9KA(|x;zw!J+;O%~v*-)ozJ96HpHZ5gO|9^k%+Pz&ul=0Gt)^dB z(62YT`n9M1Z4ia?BiLC@{6%-@@aqN)a~AzxpA|d8_mEA?2R}{C*$U3$t7j}pk-4xwif`=b<{+G17lHrX9{cK((WH)yK2yGV6(2ORTeC_PIH^ zaK@VUb{iIc%a-o!!32tPRM&Wr_7Qx)eCRQe+=-8)J0mP*7}i%pgg~wLj7_iod_!IT zbt667Y}?N{Kn*~rA~94YxP+J-=ENSM4&aJ77>W1!2Cm$8r-3W0nUK!tQNR>VG=~x0 zn$(ey34j%J*$B0rl#xFtC+^|`SPi}P%|3j;^X7BsRAD!=o}&iM1--?akOuGM!eH_Q zr(9>zItYMp?90IlMw~@Y6Li7D%ljx|ytC-OAfjwPMND)S-5x{?E>uK=v*`LDqNbqs zF)d)7GZIjgZX`OuKa!yhpc@tnYnuuX?*yT?fOs2UqmmN^-kE85EbuN+QqneYhhM@2 zjKle&Sj4}oysfaFa|8%tQ@$V}UZm>l*&jx#SO{(}v{$R#qDE9_xy@@zBEz{UxEGwn zcKFTqcKA16;RW*oZc2t9MlQ>`x)S>cyy$Q%K4AC4z%jrKRTogrez5hz$-?8H zZw0_2-uckC@NzvV#$qyY(PeDM^kn|A=O9`4BJ1<5^l<2D;ToEVN9_9OhGC6ZA1zb* z2_}WRXK;ExAD|{nqcXtJ9>{*vE5SPLUDaDGZD-K{8nqGl9_c{;GNF?ZYo47xNfYhQ zDq;pPCm76`v-oD+cFdUp=lJ6=fTfbzafhGAEjmzNSiYun43Xj0mdpal1ZU8^n?q)hcPIXUKE12JsiAH>7kJz?qj4Sa?2Jm-WoOh}`Fqdk>_X=C z{9w8zL9QvII2>~800}f|&UKo`XHi17;OiN;h1U-~vEsBr;+(K|1qTn2j@PFoJs0ep zDY+s&&=6Xo5tKbS7CFhH28pdCr~lhx@UPuzF!&emFxc7dKY*Q0*&hu4l9yPG*3d`j z$TZQB^q+uv^x|Hd{Vtn*i?VN3_7j!eOWAXwt2;UVI`Fb?bATfbtom;1Vnmju z^1Tcyq3vMk1s$@Y^xw$46!ho2_tTZv2Kz}`a{j17-4%?H+OWZ2EU;;OTN`E`f_H$8Y2NjF51<<*>BH^B70_0&ow$0$($8KX5{Mfc zIuja#i$qHh@vbRKf1}5ne(_URX(vBp%e%g0d_rf$D;+-Q3%0q!iJ4>p2WSfEL`y-fCf?`katpmz&rP$K?e5%jMYY-Yp2l0L1ZzM`X^Tl9t>k_;*K z_vvK!M}kyIx2@R>t+^heeSz*oj&cu^uNI{2lWN4(|;XA(hXqyp`?P!k=A zRG|I3+Aa8pFfuF5G@oJb6qvsMke=a8)Yr_1W!s3)M)#bBzZDEm79XRYSD^8D!Z92w zv@sgoBvJ%>xP%U%lAk?bmvXAcAn#~5W-^Y4-1I}~+mKLz+oNC%IC>}jJ!0Xpp?GKY zx3Oie-6ma#qPitA0tyaXn%dIQ-N>g&VY>7-K}jrmX=5?NECusvNcR-B=vS_rK_8QI zSyFbbsz^=TK!U{EM3|CJ{2>dsilFM*>Co}{#plvB*DDPt=Wjyz&>%gc%uJ=r%xtka zm>n~Dux7%^Q+EQI_6OJ$u>cTI$7mg3ihHnCUI4VrD@xz3OUe(ONS}IyQgy+ToW3|7=X(}O)_&63qQXa<^m&gsf)WR?4V#Fw7m7F0fGPytD2 zyvk<2orH`&$H8Ro=eIr|{z2a*G!~9Mmk+L3lzsse3&n&I)9Xn77m@tU?om3V3%E;= z(f%tBEr5tKcC&23FFX(Ihjp2%R{Xv{p`!E+!qH+cgida)J1GU>XQ_G3n4Ubg8XW?0 z0Dh|%@4lUKE%9WPOBSDLj$GxW-6Cp1y0-6;nOX&WER?9HO@_~P1g;mfu}i- zWkEt`Kin$D=`0>&mdbGRS$pB%gBzt!gK~**`*?ZWy zWMO|E-HKyYvC=INWH<^_Y$$g-OI~6ajBo7aW}WQpV_Ub`EPxaLjZH3R8C_#@S1Sa} z?8G*nU@Xg2rsd$Y7F3>SI@9+cMnc`1cQY2*hoP(ABh`tI1EPduJIVlMJ0lhu7x)q~ zu4ygOwCbZ&AI_q~%}rE24VYa*POhkIZ%12GhfwuRbDIH#qT?jw$gV3IW+qT zQ6hTXa(Mii=&kJ4|GJD!+M_gXhF{vYfVO^a+q&AewfR-rny0oL+8V7rX{^-e?1_;y zztdAR72$2CRTh2_XP(AD&=Crk^D{0O)cpyW_Bt+c~PQ( z_c%qm0s&pAC9g0Iv!s>+jS1lmLr_SL2k+dg1%Z*~5-h(Hbyp{gTg;BE{MW5!qQ0WG zWnXGzp8lLk{-aI4-6sD%n>86M#d)Ek)8_cy}JoX#SEyn;&|!G;ADgAsZa7ttpS zFTkZ%>C-Sn$Iumcq37rtZ4F&^OCYijT|JX!DB)&imiCyS;KfXP>Zo0ImYn#D<^pdh zXFPp3en{0#YZSu1=`4c6dujC6%a^*Fu>95q}SKnyc`-+@u zZ?M`cH0CObZ?TmuvXv}SuYaXk`5u)RDjHA-70rE_>iH*-%J&f$SpCD!fWf+jO^{`< zmOclFw+z;6fbmY^$P)tw>t!Z*5W&<^+8?qp(LCoMH#rl<&+1c2OD${DJS~q^zx1r? z5Ign9rpz~0mYrH*LOTiR%0a7j9E|4~J9#szN5$eH<2TSf6jB#;m{`jJ(gvzpF{4jg zIrQ=B!fu`JAcq~mG+jc_X7k~`+8nU`($q9!c|IXMk z@eDLm|b6X=7>zdZ`ma1Y>4X}+W->@1G+ z^+cJv726H7G^G0~w)~LVe<>~^C7bmO4TkCNvWPQkQ#cv@URmnK511;TJHE){c>U1h z>7={U{d|{H9O8da$>inzn9bLWkQmqO+d*bhnvhrrNamGl-k;PFAfw@m*4P&GM5ZY^ z*|+6NKoG_jJRbY~Tv4&LA>$o0>`f|yCaH!dp>S+V54R^mW4gG`?TP4bQilQVsSDl` zy7`r}_!0_-lRqobyWUjLy9Bl(7+2c$Yl{#WG|2dHnOVH5^|Qv&`Y2jQuXtSYg#Oem z7KYw(3cK6rwrqiXS|4!V^;)F1D7L9bq~|8!VNojmrXlJ@#L;P5{FY~SQkF*({W>A_ zJY3I_H_OOVVy6?2>e`8YQ|81kN5Ks<-DLPg9m`~B6M6)3^UvUc&4n%)otGX9$j$Ii{7}_J?6>V1s(PR>Or-Ne z+V@$8wCQuQ_`#bEgj@DY122Bg`Cqn~3ph1?wehF=H3AXoNr54XLpshZt!R!CeLbdG z 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≶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�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%0D*UW@L842^f zE}Ql#MVVU;{wMJpU|Lv2`-Da4VS0ECrp>|gWcGXxM=d?vxy?I;>a_i9m;T44?b0jG zsG~SWAbC>{o{qqI1@|qs>}-`x<+oq8pP93$y5xf?uLxZTTTaCV6~A6&+Pzl2FetQj zRdwvO)>^AmYF%4r3E5pTN6-Fk?Xq^L=Re3u1AR2Db+5=i|^fBTn$7HGOdrTg+sQGSRfWk^^2vp3EaU+ad9)hl0HGl zg%}g_F)_z^G1&S_%VwKS*3?57{DG z5qv``GO~#CifcuBO5Z{hEsmZqp6Hvr^1N7#A2d?T;b3DrpAp|m9R9V>hWx?xL$92t z&<;wALcAj5^}=?GbHf=wppwY@O8gecdHxZpyEa{SWB_8wiq^LiyshSUAv#mCRHU;+ zKTPk(kmdo!oMWToy+`7BiAZjJy-*i!=BEO-Vh^CCYhYrAdLI7;fNnELk~F zy1)r6PxgaC=}WRi0RsG~kf#sbS0RC!2rBesmC%#59>3&-2}58u%j1jNI6lEXu~RA2 z!Yn)IPs@c5T1PwbZgsPBr|`#unRzvkUNcKBgyvS5poq@|X|sWpKxo%6_9-?Vx9<+l z>_%b|DB=^cJ_ikENQDsIp{w0NAtNz?v{ZLKU)9erpDetMqFs_h&lds;d*EsRC9kK~ zHSO;IAgkQFD?*zxo3PBqK<)^{wjB{Y2e!$Qbi40ArIPyQ5GekvlPrv@A{ichxmN<1>Jj~}f+RjI2OMbr8CmEURA_=4(nJ>L1X`w?BL1*@_ z=&n8R)HyOt4w?CHtr&zGRwf-T>l$xh$UB@bH6J0kpld?zkz{}vB#>ZCqN;$i`PDh; zJ;~+r5%jQZd`7aFk$e(0Wa3kBf3X_!UPWJJzTs{}C^XeN^FGt6xjk%E)gf%2N=awn znMfYtK<$KlGEs+q-j&{R6|Ts+=P&d^455}7@dJgoNDl4lr8<+nB)PF5%Js{osx!*F zfCCzCUBP{BtLh0D)v71tI$FkEG-_GyY8%dAsl`eNpIn_h<gYQLP7cb`-Om61Ss)P`c0}a(mZ~RM zc%iy!_lBaA(c}u`;Og!d6tVTodG(|&q1Ks_;MNJL8I$aJvdJ@_5PIXbMAIo>$KTz682==)nwJ&iB3*5Il{f2I7P1RNByekB4 z5;^D>Sz6tF2%E8Kg}_E79K+9Kw5O6H&rb1S8mI9mdBRMuCKmflMV-q|(8XSDG4UE> z#CuCA4=ck~k%G>Gn-<&nLT@tN=cP5-dAv&2otmfTIIn_4PbwJFDxfm)F6-r~HmY_x z+mF}A(k(qjHQty(z#R8)=+x=1o+!Wv@yGqHcVJ*?y#`181;{z8w}^b@ZQ@9APuXmX z;Jb~x0->_A1@L*UXHfAkJl5C+h zytV1;H^RJSc^p#v=^RXIIL3vOdCynagG+`Wke>*=N=~>ZGC?uA>F$9#EYA;o8tw%mMhv2#LUH_FPm+~Xu)vitI$ zA`b3#)n`~fB+IICXw5<5`}^}`ANmhzJS}2zOIk#6I(8nZVOKCS*aag|DQIWs+s_R0 zCNpt75#s8lNWmxGhJhe7$r-z`Gd12YS7y2;|JO{OOsH{pH>n}nec#hCqe~9mx?MZ7 z@YAlL7ldhct{4pelI-=#s~Z0t@ghZi&pDlb!lm{FKbrGn>js5#6c^;6FxcH9Xqzm1 z`?zi)=k~}BI@I^$9)msX$z|}2OEYQ_cPY7Hsi0HBf2L=7sZygrq+4=hkv#<%kh1_aO!ls$T=4%LQ3YB6VV9W6ClWGds}sEXL+^M zn=BRiDr1LBbG8pkkD_OjgdBJsw${STS!;%@cEky`wIn=ot?19dGZ|a|HBLEo zz&M`>ot_}WjAM@Mn#_N zM!BE2Gt#ceNP8(ue&wCGV`VpLlggg%q@a=5mxZP5>6iN1iBGzDQHwH|uG9^S*u#BM zpzHIeR(=J^jPrextF5(Rj&p0AFBvWTsgaP~jy3coi3o-ECu>a(wgp_DULUsl&LZ0R z_dp+U7DoRq7`*SXeB1e>pP<^7{58!U*T^A|s|Un*r>j`mTqA&2IkiNm3cP+Pp=%-J zaz5$pGob-L`+(FGZBD%uaGgELtbv0>_ zyK9sJmCesc{x&0d5~YLl>F)Bw-m$Xp_mMH^1iVNcMnZI6Iss4UXO1@k8<*$=JTA>J z0sFb4YYOO2{u`vqc15ZOe>ot$#6eCcAm&ZL)ub{3kCHcY0?s7b89X380nf+;G|0D| zzwDnn0oPJQ{_QparP_Hx*wzmL`xKdg%@Vq1w+SeRqLlTMilQy4xdHs&BD2DO{xLxZ zfPW{lMgAun{(mB8fbtiI+u*;}ga3?-K@KS7gRm{shIn6YP)_3|k`# zVk7b}wMOqSrhw-|N(V*?N{=xTt4YQ1p{AK#DY1-s8}$((Jcb#SONTT$k6iUVeDc&Q zkQMjl&|t*hl>BhYay)DyTrroKg_3+4PL_3{XgE1^xYIS1I?Trh%2mV`=Zv;{_CxK+ z7%6wRl;Gwr%st9|qiQP+4cCTlcpYZx1=%aMEUq&WqSH3**)jrqR9?;s921Vpi%vCL zMoFU_1I=zSbmn{?BO!-X=A6(v37w(q4EqB()BJ0f1jGC7hnd4$!YwrA$zjs^nZv6F zPny;&&PbbbUXatjiIoT)qA!s{7i>RFC|;J>G~+y(?jsy*3G|km2P&So6*`- z9)Eu=F1+%${(X=)SYM))`qMnG)s4;vpY7m1sMIZH^27kqzOQaWw7!aHCk09SjBZO3 zuE0#DlfG>$mAa$tL?-= zKSTc}hrMLkvei6HH)I*yte+&>oZIiz zufOwEYaJ)Va#6NDims1XS%hrx*`m`-_r6lA)ZUNMTEw%Z_WoD;`8%)oBlw{A$Lmk8 zV*MHV*~8lVo?h>rcmANgz3?%=x9(m+Z@+j?08!=l_9OlJRl2wAgPb3#t*@)$My!|9 zUHgZY*RK6biyRqr?IHc_$tQifpAQkV!LGxl$hiaAY4>}G1?sm*VzSq8?dj0pybt;& z%TALYIZ6Ns7B`~7-5|f+8_T_q4hjWZ`hn@;9HPxXM_~cJpjC0o1h?56DOTUXJv zzq8+T3ZU_Jc6XDRjdSUit*y$ zIYDsX3mxeqcR%m9LElC{~v;wVB}I^{ClvG*ufDwwYL}ENH}cAq-c$0@_I*k zp2*dDaS8BUGv{;Jgk*oKXzt96zt5c}F`oG4(LVesama7l5oaqDQ7Q@G?a zl+#>+xN&t-bjnZA@#D%=z3<>xc z5>NpNc-_a#a0$H2Ewg|wt@SLH#e5Sr0vxoJ!Q#gTJ5m&^zmC>_IYn6Mz?=1dJRe!> zKNz4?AN{JjWN{V+sHiI~h6adCLq{#+)n3Jfoq${Up9kAcS3(Hv+%1diaP?0xww;r< z$p~fah$00#$mU^xFn~mgCl&~zLzV=wP7A;<6k#u+2%!$(FYl}Yed$LQyg8E#n7r=Z zsjPDZD_oCC$b^@Fleu)SlpNBqg(8RU6)|ulv6L!&6FFB^r$}=PRo)BmT)Di00jj@v zjd(&PSEg0<%VEpx?F~MmheP{WSrr_pgQKdENXZgUpQ^vv$%g5ls>SW6cdC{P4(>uS z3Z)zx@7Jp z;4PWOJR_H0GVTPj>d2zQO#5CP)d+u7Bl4of7!xW|$I6O=5$$axx_Tob zy;jn8V%oA@rYbEESeKDBP^P_2!qAeD^l5g|6B$Xe&30gKa6|qMb=(7Ob^H7F7V#sC$=EXFFCQY;ID)D?IkN~Ld-4^%QOyuo z3q^uXZ3d7szLxwar5@=%NBANMq@D;QlJ74giG9c!C|$D$HqVqHi5<&@sH>fmfe$){8>h_n7XC~LhQqzRgAB&cCr(TQNcwjgS?C0%pb)c=YtdI zU~=rC;bhfXGZ}pbQ^ZP?7NT(O|CZ=gej#D!5;z}gq3S>o439z~zn1BVl$rJj-Ul1q zlk=+aa#uB^H?g1Bi4|_h9s#E)+mJm%m6WEvA2PwM=X~F~VB29>8i?0h^>+*IFSt)} zKWz`2TEi&lw&+}nwA;d0sW5f91ndKhIeYVNaU`GjqoZe;_7qf3rxk^hz0UbJ@=E&@ z7Vc?urG>K9M&&mU(i)@k<(fp3X`N6^kjHt3Ubl>MLSh-|yddk`b(Yt$7)l?{UOvo4 zwy=G6k(oTC6SdNa)>>(w#tnf}z~Gh|Za*58t9jFxpEqeMjEWA1xbj=-RZry798Db{ zO&OK1(9Th`1IiQu1iu{_|GnAcccX#^nfjpPwhA(;KIl6%9KJrtm7wT@2CE{dR|Tpq zn)`-mkmwcA3<-j#5Bewp7TLYdrlqt#=))~isfgDfmWos#G)qG5^+EMgp)WP68k$DO zlvu-Dl96_9Mq0K$$U6w3kGMkHRO(?lD{;R1XLmzj6e){^jLV5%U&y`j>(8qoKFNObTlGFOQ zvd%vE<3NtGhmZ*Po5`99{?0@@hwqmLzv|=a<=f7Gp+UiaH$^%G|3K}$;OjGJa6En7 zV-nhvKF*YyGWBtBax46w-Z$t0@IQiV?e%e|k~4t+8OOE3-`B?t%1EA=k({BAWBsZdP{FPCbQ-G}H;uOswl=%PDlK3Vqp;*RC<<6|V-y{6p_4H0>K z7i~)Rt@js8OMyK8RsH%&dHi!^g9*=)$3OQ?y7#wgEopiD6#ew&@wf0n?X zn(y^~sMmXER9t)e`dxl+&(*4>w*$1QKpuane*LsOzE4}%Qj27`X?gqy`svH#-{oU> zdHfs1LOmBsVzSo+OW-{8mPH~zDoe`GkIUn)^v06QSOR(c9bXHiWH=XS^MO46H2r!^ zh)R|`{#VkpPgzrgXg^yX-#a6DXGXFwkN}1|X8`?Ak(EwS7Rk-!qg3%_4M~Er(;SqLYNoy$Hd0)JXM7%O8ou z;!kCklC+8MF3kdb5rbD1c@;)`r49(}&eC~NysT`Wzh8yC*AsHfY1Eg8W-DC0^p>ig zIvep&D`ibIaUSnpd)RI=oB%$r?%>KUYuG? z`#7c`txe*tu?PQjO!TX|?MFub!L&VUg5{q1uxTOpZ*d9{*r7nX^Jhs8*Kd#^a*RM; z*j+|gAR*P6iA+c|=bq@ecb4c_#C_4bjZ8!;%IC;6*w z=_EqQKr-oD6soM+&Q0C(GbD=#XmcuAoT`$=>s7SHk>JX#W<;o{l11EYvlFdy$&+I*%6T zL13`LXd<&60Y74|x66KHCEk$19Opgq$`q&O1N|@R1M^;MTk0tyR%b@MioEfQes=zO z^oPzIB5#3VXU%oYte%`sPx>vw8VG3?VpF-u;PjAIh!Klrx+Nv)SD_a4>JTXFJJxxc>NOwdGk9niMS9w;<%L*_qpNhrGuK5BVcOT%BF*yXWic0sjZA!P) z?P*HA@m~3eem}$LK{4jCP7ZPD6?<-bKok+kxGF#%skCP<- z@K-eil}%jBg+e)@xdM5oHnLS{TR-t7^-%FMWH#+5ibZu3wjU{OlJEM((zMSvn08zn zfF|dJqE%j_7{_lBe^}PK`N+;8K5eZypG=Ylrk-uaN{e$MQ_bXaT7JmN`9drG^-mX)w>sU$j8%JblKG+kU!F~ zsG9Tek*+vC&1_?Z^wB=#AG?>cmT1Y-f|4Tes>Ou10F7>J?ejyvjBP70)I(-17K?oc zBb6dY>!#XRH_gLg#b&!Ax6`#xmrRt7mA&>c8$+~EX>l46hKM0xf%B&#=%kfb93=Ai z6JmR3gGR3aX$vw5+oox|uYy?FHGcg^GP?HlpA^*ZC;Ii@)^Ys}9n`P#e&u<`soe-N zxaU7Y_=e}GcpWoY!CL4CB5eToA0{Db=5W1Wbie33I2=mt-LR>ml?=G;6Q4d<^)^L1 zwK6aS@X7P#;@KzQ`H^zlCv06+K&{c`PXE_;$gRl%eOFLFfxNzN5va79WTkl@X(j)V zl{LwGB;SxNpkPr><1ilzLa0!ogH=3RB-+9;1Z7Gka|K2qagX=NUoAG+bSuw{h4O+7 zK|96}?x+-5P3B$;YfY;Lqx4bx)7zn2%JU@IZ1L3TPEW6(v-347C|MG1aTZFc#OmsnTYFQ# z{3D15ksw&u7A$HD_Va@kUNQQF?-9`-*}0}Y7SrsNk^ELjJ6{tDTFU!L23m=(X~}=> zB@k6Ulb5WOgM+8uzJSfJ*JOsebyY>|Rk>lWco0BJK$#E*o)zcKjq^N1pvuU9E9MFx z?enqPzL5$d# zE20Qbb|3eQoCt^R_(6Wk2JGTGm8hkh19u>lO?E%QOa8!1{;ZYcwh?u;VHBn*Zq*nRAYZ`}Z z7ySI4zLnW)ydh(k%65m)!1@-Z{#(R_jg(Zim>{aPjYq#Y-_4L2yV3d{N#?Gn1hOv` zH;_E9tOA6TsOLo4;>hGP!=SaNp4K>zI zcDX`6gCa$QjrdccP-w0UQm4P07yD$rHYmAXguDIwQW{%(BAfsM&~f!jyFH=xlqH z)mYz2OEft7UfHd^p3|PR*DpOB(8MrYZ%wv*zQ&eV7k1kKAoO zW~W}HsU=Y%i@T(izwSU@vMBXv7CDsl_ZRZW`nv~E{y(3;g8ygpw{UaY{N3u$-xdFV z=FeYWVj-0=Yi~;R9nM-EjkTY*zTJOlP2Ix2o?bsMrWVM%q4!&VfA>lz355EyQ9&3AEK-N~q1--?_%Pj-Lj)hkqvX~e}>l{y;vNUr=pD!y3k z{A(vcietkHBEytYn>H2Om#huj*Km!Tn(b-ZmU(s#WUi3Rp6yX;MSx$}`3hs$HTbTw zegJon$`n*3r{#!R7!T4*I^jsVdckM8)%8Dko(pb-wdPvbq1Ca^Hii3tK^0=~1OJFi z2)P8O_rR0+bMNWOBR{POxF$n|Izw?H$5$jz*(L9UEZBgL%2nZ<9o0Eo&1APF+rWA~ z_2qIErzZx(PJvmnH2RfkpTxMGXGs_4ZTNSaIj54>=VOv(PbIsCoSsi}e({}SoXplw zQ{KzB&geK0nopzh>wSmyyis#(fhH#Jv1O@H2` z#s{Rv=JM7-^Mo^z;k#jpoGn%>|#}sdSC$&4Y2<$$%DjZinir7Fcfm+FYK34XDFH(Jvc+0gf2?P=a-G43qO(2G81ft)`}98ZT}4eO0^f z%iDcl-R^smerF!Dt!sDV(gSJ=zo|FFw!ES8ru~sKUE!Bk{`^=7>aaytE0?_`-n8?d zBd5=|Y-o45NO277buf*!NsyZS`e(J(f8`$Pmw4(Q{}c7UbWL{s>GQnx17>_L2@^Z+ zMUm;Gy6CwMvN3THk8Q8Pb86yHQmeOq=Pw3v9idKmg!(LInoAZXdma>d&78QRIyrvU z&Qzh`ckFX9tgS4$GB462(KKVD9Nmz3rw@~Sij*moj%kCfgc@%kO^!Eh!oTmY{*n1; zyk@uj%YHQfZ#91!e_Wf@m(c}ThVI|n;u>$>t^O;1wEpXM%U|-N`6us|f3F|SKXteK z?_KpH@bU0<)a#0`2U;stHX8NoP@FCGah4Qz5ttK@S2Co1O&~QDljYBsgUOkiZ~VpM zqNCS&G~b57SfK zkxn7Jep1G`?P2OQlXE3Qb39*uLe4`+$S&Uk6?MM82~Gm9h-_+yiICTKmBqOSK4`-x zXWv}1CVSbm=hs3H=SeFxUa5_1-CP2?bb`1u%rX0{uK&cTqt*IFGHSOAi0|#6<^Rob z1_wZK*E4i~A5ISa-Cv}Evg2vTdF>Ut?_Y#*=zc|gx8e{Lk~z+&jA!OWYF8d@Qj<|R zN)CHf3weh9Y}-JoZ0Dc4hMv!t0#@_4k426m>Z|N1JVKVO&5DZt6&7VFEy%S7ZypDZ zQ%{Z-uA?N9r%GhjjD(uL+EHogp`ea$A2aT6GJe0X-wIQ!I7Lfr~i`A6df z09tk*C?>HMf3l74=FGikKU!ryD&8EFSF3eJEe-VmYG#xN*KXv@5agj5P zyJfh1jygW4S7elN*Cy|C^r&$|BEKSDT8td)*IT6ZHV_>?3s`NO5hYkzL-11qH=Pbt zaJ(66EGJ(!JZ`uYcu4V%;6Yg#W~62M1<#*!`H}ZD0#01>z8rb6ar4fcN6nIjMxu`4 zrXKV9LH;?{%e;ucINCGrx|jg5GFy>)0y0xve;`)b+CaX74>#ayB#xH^@hg|EPq4^H z97GiLxx*!?ZGM0s_Zd2yWt*R*{==vL!Yo_9{mFwO2h2FrEIYS<7cRw_W#dLygreNO z1Yd_V`S?@z#=#WWG-DLX(LoVM_v}T;bL{*pE`jNe4Li!aw{9kRG9Uwg%Bsp<>lbM> z%Vd(GOH)tz{VY>hKWvso8GiJc)GRMv9I6%4$pg&#lLU||0gm)%PeM|+0$07r|7vA_ z^IBY}3CZ#M;RV%NA^k~~-Jou~pm8pXAEPU4kypu!g0C;YK0;I0!;!vlCX4g|ah4hF zPqlxgS}M(pe4yC_2j1`=LEBQE?466H*zfdp<;2| zAqu|&ensI|DBtyqrKjHf>F(V*O3p*7Ac$kPqw_;WjjsweJ*`BT5= zfDMONe`)hu81(B8r?vHq{;2OWYoRL|Hid7HZ&G%?JUxFbY}5Az`Nm}DJ6H}i)Ta)Q zEc~K==67_8RxlN@ z@O>Jm-r`;;l74&v{4&^I(Fc4cvLa7N#07JNM2L@AW;fo?B^bm<@K7r#i6Zc#->`zJ z&?!2z{;tvxBR-cDWmgh|nPBInNh181En$^1AZwU8Og}WvIaJd%3W-FJGg;XQ0^m6U zO$G;W;Qh=$sO^P8V^14bea?kv@w~|1BDb&#tCMHtT#6#?mlrzSw+oLnvs~NoQK8Qm zS@*amN4bi?%3QGRfS!ecRe&*#Gz*z7AJ-<>Cs@6jyj-AyMae>$HBy9W-`xQT+~^-^MEnb3@Zt z*6$Dxn?}5gpvz%(ghTZ^wn)^iukshF^XP?4ov%~zT=u0NQu;r?t7Jg@|H)&Dbjh;2 zW_G2j;?Au4En;=>nNtrsK}8`7k;h*+%*)RuFXvn#K@(Tt9JMvtokq%~5uvc}Lnzv) zgmIUOYdB2~YtHLQV;j`u&#Cw?NQ4Q>FtdcGQ{~>IF=xNJ?Ry*XUEs6W;{A#^_iH}d z-~*j>M=CvhKzzO$8FO`tk!7HHMOT9Qcb-sqE*gb=g+0qnZ(|1Q{EL@6P>ct8t z;0~5pB15h$+s0N&7bB@gG3wKc_Ug6JEs(e(iQB~@RmQ~qPRJd#qkD86iKW6B?nhp% z*1l3=wRUmx*vKG4?mP*B3nBNpbm*Vy(8CfE#BoJJA0!s(6#AMZ8~(G zgxDHF?pO)E1if=dNhnlAs8mAQ*W(B|k9DK9euNqvTY`rW^!7LBs=b(w2V8`kN*|q9 zy6X21_5-g&U#CMG(xDI2p*Pc^W$Dm-3F+`>ODI%Mhj8mli2k~Nk&t%$ehJarkek$0 ziny_Kz8lh^-%3aUc1b!kK|FKyr2!V!)-*ZBEghP<~OE02MBJP!lzUfj2Nk{>- zZ#vW^9r{6bac`ZvUlVo`{}Gzz;{1zIAiZ%{OY9n8Ni6mgt_d9 z>6pqSr09KoI<-F`pmP}_d*@cv3vO>o(w^><4&|jo+kuytx+xu6pALPH4y{awmZn4V z(xKA0zc=a;|t@cd#8TX9f z%Qe%XlhUCR(xIc%p`vtX|8%IEgp>kxl91AfZ2-xO`$|GZ(&JAh)GDF(CFGzcaaTxa zqQo^zNNag19rqszDU=^4#CX;t&UW%;JoihI&R5b)dRLM@N7U}#EJ@np^@N<}rxpD! zl~}Fod_uZ^h;g=iDqlWRp&Mn#{4nfrfA+}RkAzeRH+%wHM)z}f+m~v*dXxDdR&>k{ z_ZiUx@^H$+&9*@Gu`pElu;!0U!EpWk&ri z&I#Xg#`~+BM|^(#&35TLP@K9YBmLRz^zq*SQJ>+2(h+mW2YxN`m8nnq=M5q|qo5r|0-zY!xL{BLbb zl|Go^p3R5Pw|Gb=8!6ba@hruTz35`ly8%*8IA3oS9KvTNI~(}p^6l4gp{Y-{^elG% zb~&6PQXjRaSWb=bHkc~H>fFOeb#heBkkxwCJaw|HYy7PF&siM(=bf$1p+Tk{`49w~ ziW=y1XVymHb8r4ILQP+dLPRJM9AEDYtBdscMB=jy%6+)u>ZhXaufn>ohRCoS(3jxQHL;_{(JcGrcT{!9-Qsk7~Y_L>*s@kx5P5POzLH zo<}QUpO$lnX4H^n@=j&^QNSRM#Y-m`@p2@E#@!duYU$CuvPVkk$sYb2aXIu*TC!rl z^oG1PI*q8U32Cele#l7R2M{J$yX*Yn(w*qB5M*ngs*^8u-Vb^d&Jh8YtR3UFhuHa8 zm8PAPUXM;z9$vKD>7@U<3N;`>Q^zSr#w`cL)`xslnXSVHSx}S|=Qx*rxwF;lkDSAe z#BZgA5e^D zKvPk_!5jA}($aynB##1#jvI%B>QgLXkW#^QC@WD+0S^RVhslQ^O8vSz{_+e@pQhN_ zJiNzCkoPC^1XC&()+ePk*rHH%eY1!*Y>fz8v-=Sbq#NKadCXICS&8#CPLYsd^Z<^C z?~7#46CNlRS;=!GkDa`TpNjhRDm}3h9)xEWN?L3|xoIT}2zq#^Z-kyt4@6fw<@e-B zG>O6>{w{Hz-B)C_osfDlhwEd^so1YHFS2jx-jVKL?Sl0B4kvHuVb9bqdI(D^Aqt7D z$8{Hobt~PHh-gyl*jxR%9jna?H0{{}Kr@+?Be9srTiZPW$+KmOUy1XH50^|Vh+aG< z*^LA8Tn|J&UlX>D#(GO}UiA!C!xzjfPagrPLiOkoJRi~jV>2hIWqrWdGqtG2BeI{O zzA&w^*pan5$4rC{uo8f-blbUUrIJB}2BWRYPYNLs674-H!yv^=lJnpHp-fC?pBIF- zG_z*nkH})NXI?~RK-_vpKLCu;0zNF0*Y(iX9A|6&FJ3HkN5c$G=L#K)^QpVDm8)!L z?^n%LresnOf*#4w?KA(%Uv~oa!#@kQ3%gu;fsuHOUoal4I|6!qxwIjsm{sUbfmi26 z4wDo*cbj~9=wjNZGbo1phPm|(3{0l%&pDNjOHSTQ6^C!P-Uq0|_FTaydGvs53|j(v zJ=(tcTU={3=Q#g)V>9+b>!V+W?c)IgrW++YYV1o35a2>;?jtp9eVdwJV{J`sF^B(g z7?nX;Kz`plTW9(dTb3uQ)vXD_o!qzJFNZYM-H3VscXlI`ZpM~%a*viF|WJ z>v%`h%=reh#dm`7A^>PX^4oKPG!-sci#<*bdbr%MeX=?md`X%a?tx04%R1M2kcL34 z)Z+m~U&dx87{<=-9OCsNz%C=M&*|7okJ-`{yUyj@=hGI}W(e%k`*&eWTS@&5#$)oS zFdp{c*sh*NJPE+Wycxd9qh|V+Wb2y{>%?->Jc653q0vU-MWWnu`Qy#;Jf^*URDa5z;^&12rMGv# zCbrf}B}LXp74jIN2S(>n_#GLAoG#tDGHh$jr47!DG~o83BQ3fW2;#Y4=l~SgTE`Z- zJnnt*217FK!Sb(kl8h??BBqHele(tVNLgu4dbrPM@kI?y*XRwRvV zijd8@5>t2bbR+)y-ohDR>DLS*fkTpj%rUm1+?b=B$F2KFCtn`2OmzD_Ws~xG#XBfq z+`W{T(xWeJFyedjU3#(+?3-XP`SMZe>nZ-Wl-HN#aT_ZkB>h(G@?|eq* z{IeWzS_@JKD*oKQuiP({|DJM{wV^^fo%oiz z*nq0=I{6hl{=sf93==MGD80#uJ6_T#$~H5$h*5febb|-5#1o`dVoRNY59^Dp+0xfE zJ|s5D*UVM?_1~-(&u8rSfPYe<*$C+5-(jlz5CpjGO|WcqvUIaZ3$2;AQ_%V3WuJD8 zEZ}JXVvP8cnycGpGNF)5byNL~JrXOsg_yFv%*`mp-DrwKXhceIZeoa|I>|WPK{R=3 z!@Qd)EIiS~lZEeY);YcQ5HHR^iiU-Qs6##0`*$ROc{Fe+yR+bD;7QD$sb7MJ9y5;W z$BVKQjiC4~i4}B0NV*>0z7o^MYwn>{)CF>;pm{ikcOvKUu5Eff%W~=g7^KV0g}Ua> zS->bd3wtZd>C$P@_a)bIR#42%@#j@y)`LAAm5YonJwLL4P;ORMIi1!>e~NWVy#c>b z_x%9m*P!O}189q7Yb5?bwP}8^(oV{#s-(TW1Uk0T7eNW@z54a7N>evFBADak4fBo? zHG_Ab5E*RTy%9`cEhzpP@$K@(diaLlOjbSxK`)&UUE%W#sSUhYD)^yD#0>wQCMvcp zF0ZoINB0?%tQ^)_HwTS;yq5}3Nh99VO(3MBhgeMyzy}N+*oESz(xw1h7gl@_>61xua z)`GjSh3zNh$3Fs9FZeV!b*R@qV<|LqbFtADhq48-$K3i1 zaQH5jv$%@d4e@J9W%cKMArna6RMT@^Z)mejkiPlJ7_WPO+$$k{h+0L!= z*g8yng#7t6jcBH(kb5yPtZ!XSom>%k3z9|6HjLe0W?;5dlm(;njujZa!2ShV3s=4y zuo69q4co_5=3WJ&{s5vr4FMqpqCP62WHbv=w=Gs^spKmm>01`FM46=cn_zBraz>}> ziEjr0UoDwEl;siEcNF36ymy5%#lsX1x~!YN(;dI92*;Ysb4a+U0F!93O@9DH)@zR* zdQa@_UJUVouRe5So9kVMA96<%UsbZ+h<^mp)8+U!0XZp{c31Utkw)FvTKHv;*5|xT zZv`=hT#g19KE5l^lFeHl>%)O~+`q>mJQE3xI$hRCr}^o{iRJYOiH z2%v^esTSQ|Zem5ae<1GChUcdV*zc2cSxQQ#d|J(pD=>9#7`GEv>tpGGj|j1kS&~XQ zd_rz1E6R=pIhT{2HG3%~;m^X>lTC!68^Q(GZ+IPL0`#qs51wU=yfVK+BeQZOINy*LR&dmdgu&ze`l*bTMGEgOZS$~oyd2bZiRf`5592!fEoA|*jb&N z3gN*zc6=JHBVT|< za8g)>=Qv*@6@hctB!B;(voAhyj&!FmXa4+`-#*NkBl{r8mONEC>T^l0+kU?60n4Ln zj5#;tl*bwSFNH8rcj{GPy9e#ZSF-F6H*^(-x(&`%a(hA{=>8oQO-0?b(D^V}5>!y< z6QbOs*W+x~JBR2@wpHNW>Iv$YDA|2F;yIn66m2lY!h-kp@mpB$*wP|zjVPXQyplaP zY$pZ!)tox*q$~*!>|7RtexI5w{y~7tHo48Y*HMIy3=^7mEvU?uD3ADh6=C@TU&1?G zu(ilvwvM(-i=2Hncr@@oz=kIo5TGcdFr}UaDE&j^E?x6C>x%kUMMi24*LCi*9Y*5! zx<=PRU)?95N#6c0>qU5xj@Qdwq`>1|%$j+J`@+}jdhyR50ow@IAw)q2=&lpq(OT@& zZ@1SL>C;UG&hmMXUZ2hMi+cuI$8Gl4o5wF7uKaSn$mgKM!T|~qPRyrTACHhi%$TB5 zh{GnyPgxm1FFek0oxSF6kwL|!CtAKA6O)?fjT45-^!SI|sOP2L0Jxd^T1 z3Q;tV@hDQVl$+7r|Gu7O_RZ9-Ty51N$RG8Dp4bwdNU$>E2M05kPrEXOw2j8Ud zlnFrteceqL1^kM#e1QNjcT$0~>{CUe_*xwc{4IOf@n(#7D{yY}sWO@)5lQ-7=0S6X z%REx1@A^-i?tFDPfxlzn2+QyrFsjm4@?|Zol9=(ZY_=Y@g$1jY1tv^2jgHYq2heDR z^>!*xqT9Fr$CtGA>pzi1?tJ-t_N_$wY<4y_xh{Ivj>MgvY1i8e2LeHRw$N7=jci^l znnr$PCw>Ha3qJz~CQvM4yZImLgM|~l(tmP|_#L9go%od;zTD}AK^Ix}ip0u@Tp^JG zBhp_~jL4s|`Hy8UcEEo;N2IqDenAb@B~91wlM=sj!h?oOnj*@QM!x2`=V2Vk0ycCK zc}F&LG{Z1|yWFGRLkwkh4pJ^$SYzeoRMv&g@tM0jZ3ENZ!-ne#fk z&NDJ>Z|AUP3Q&yORv=N5{UdpLuyKf&Zw}?+@jDO>naOCAnVie%bHN&9d`{;q1h?^OKDL-Aigd}}L^GV+Y*127L&i7jK2c;81Zo+ zgERGcCRkAaHDQ;mMV_=Z^#FAVvIy!|rg7xxV9jM8?jE6z-41tmOT}%6JAWM+@#}>p zW&tC_Clpkev53#o+WbZAnJKmP<-&AdN^~hMNpeiO)=cD*vC_L!lWeU8RU&%o zEa2hzjlL!^p4IP87be)3^bG=CoTdRg@gNA=3o+nc3PfK|XR)~wA-F5#6@{s8UmiX6 zgieCmEh>hSki3Eo10k8+Sxf+oU#HSRkph^$#352PS@!JJSlTpQuU51)C|M&t>V{E? z;F(lHGyI)@3V)m_Z)<SmmfY|d4+!5YAg&yk|;Pl4>uuxX)5kJ|TM@ zC;~-!U@ZSjhX5B^%ULk7?z9p>Gn8=8d9AdxAt?|S-eahvRAA_RWK=nVS<1{ILT0GF zG+7-FAk8|g@B%gBCt~&Ra#HgtGgoOo?IA*Nru?8w&BTddWGe_oQl#l!kCy7I37@T3n*%NyQPL3-cH4Ak zghpf+ma0dAny^evV$GL#48u$OAJl}os0lHt34)l5UwE=@&pP*?^Bb{#VQBn*1A~rLh&sfe1=_!!7^cwfjJ0&ktTr9B26y%Q1 z^a=6M%XqC&mxhehLK=Ymnmg&9KuI{u48b((b52K7%>FcKcfcTmMx*^jQ8>XQ0!$Be zctcRP#bhy-A9e@j$Q_gmGIMOl%5mfjcHWTYsNLDMJ;lL;sLFfONK1bTzaHNo8So35 z(5?Isz7sbqX`6TV?xm*J0TUE+<@!niDKvuIbaTX4hHXRVfdKLj6Y)v}`3k)6zah-K zpKH4t(W0Xj7-b<`)YYkz8HzMsJ@!~z-mX-`}bxP{RKb6zl6?=&`_vM^~H7R8d` zKGAL(6DHho48?Pi0X=2B7bOw`2D|D}0ixI+->$*#wLxEr3-9=Q5gvv;gIqbSJ^g9{ zJiKR=VDDCjIwy><$(1B5lkv_{Nmc@8x(g`H&yl&?08mHC zi@@7x=xqxn1T=3Eh1~nd<~@v_C=*WrBLf^l?Srh{;BsrLw@OI#VGwBEDJt<<$6JUS zG^W|!I@P9He*xw#d0nF{?Y7*~-iyYq{LkJrU)}b<7BMdX;GIsITVq%FUvI^%~Uhi1YkJPzUUhyEi%CVz?l*buj48NQApX%jd|03V8>R5Oo$wiX(lk+*8t~ zgVrA+gTLTE$qdHugnPHz@`=SuKr8P1kNCZ6V{uPWi8K@o_lRPj@HqSvYDkZ;@gDVa zN*?)2ynCMd@(Ws#eY<7<5v>Ge{E;-dZRv4ZyJWUskh=DUshRCZrB2IiKQ%RuOiIUg z`*!hMItJR*)tT*6)8QrI^tY{+?_$DjBS-2Ql}_C7I;EwDr7Ec*{d(YDEbQqZc!LbQ zsU<3Z=aO*hw;it+?Q_|+c&zQ;(Y(|9cS9Y&3+#L&He_b|u4~`Lb*(LwU0dFfXB@?T z6~}WWHjl<&F#bON4bwHC(>0)2&ww`K67KK%`+m^s*X6}=;p%!W1e&ud%}GcJEj zZ|yQB-@d5wzf<|!8P{#ZGkVdtGX~?b&F{IPjz9H`hn16D@y=yD?PffMULNhfKNANK z2_Nf>52H<-knOr4H8Iaq>|`f9H(;9c?B1?AY~FS@S+NjWsVY z$9wnDkUi+t3%Sp)VDevH6>{V(n_IBHBo z>c}yJ4ZR&QhT;EBGREATpc3gPdb*jpzT6*w`EKKg&O~*JCFZ@p7ED| z&G_GmoEszBSawr2p)TcyZ#>U%JNrc5e9wc#ruS=x(uBR}HoZB6y6cW(cO&1-8;aUY zept-uZ90yJ<ZUvTuAIcN%JTlr+{xZA9`H6Al z83iRZU3;hO`EGL0JF23L-GT_tKCd?xri8OygaO-d&2%bw!H+0n-l45s5u z#TOW`7sicg;ra1USNBH7tkE0GbuH^A>I}M(I>>b4auS`rs-u{RTb!OFeE$C#52<9#xiokHI7>)P{^ z=?OzGvlbLsJ<`0Lzf}Oqx3FIXiq%t`_mhRIFrFJ?05ro*_t#ms=5OXHK9p!^+YvSI zVWL{ppwf%-r}C5SVxO#&**UX9`LG@00E$n3A1#1~!I(nN9@qx%9|CrqGsA4jAQz6s zp@@9-en)b1dA3*Ulf4!X)NB{uwMm@qnwq}DS*8KVuKpU6QKS8t9A2mLD1OPV5FM3S z`Lj4TSi-b!;}C2B$#sm;04XGQ8-rR;>SG{ZSBRu=>3d!iaFI~1;k!_qzmf;a1b(g_ zd5UtW)b5Y8F`8X5)9=M&GIIym>6;x5Zr&sXS_&r$jocc&<5Vj@O?k2_#0>QNa?0bf z&kKMWYXNU^Zg-$QTusPuP9IIIis;JQ2jn0on_)4 z^mGug&SDh>rG$2;O+8edQbugZx zSAYEOr>rvY9AY7QxAN)qh;b&vF-;~`D$j{CkYHMisY7m?mKgrX@x!b!R%sg+(KIMI1G*|K;EI~7Ok@h&VbHhWd{3K%tN>|6YdsKIb z1Fw+`$jHc~%>uL_%oN4ep{Qec+y|1&$_=8l*Tx^o3vpU@8~5+L1+uc+##*_5!1~#3 z!-%(t1J5sD3ZUE5pZq%eQS=>3XSad0V=*Qq3f$l!e!-boOcxO z?MA7va;HMGV)uC_!(KvR?f^i+#S}hBSJqW47?n)rAiS^+)R4tefrx0TGAjmovlO{*1|t z4|K^R*`Vul^DxZH{|&lfZk~29(ex$yS~VGK3U(SAbX|~7zXD||E7}D5MZ$hO;!Kgi z31_ztOTV3+9iEzgm)HJ~cr`EsiT#ZT{vF2Q_WTf%0Ebz%{0HQckZzmT0bXaBz8O?? zrmO1rwQ`?Jh!)b-MofE?fsW6gCFw68IT4?xs^h4F=PKlSm1p8~_RzoG=G_e$6#H)^ zWcHCNBfz%8frg0I@t~P~-eG2D_wM7}Z_hX(3I0WHxPUAHEBLb;5>Vg0gXqMJX6R{= zU)YCNFL{t#zz6LVZWZ$`ThEX8TmBUFuZfcs(8N?$Z0wZp`Px{}V9?Y7>$2-Y_JGLQ zT%~+Ib&3xm2}xk%hkFA(@eVW}0;#EW;-ABk|Fg&>d1;$j)XF~!WPKGvc^>2qx#In+ z1aBzLua{i_b-Xm`=l7(6L}5x5DOLW|uho;+$8Q(gxtK?i6$hsVqR>yQpAMq6wmId6 znH$x;`9GktY*(F?yU08=Sh*?Y;SzezL%e=F=LN>;DZ4tn0EeVVDC(4>`=ys-f>ZTt zxM9MbRm-d=ImzYQ-Ogxs3f)S8ECgQyTXBxDzgWxLg96+w{<8x(Ohinxh;t2U*>yGf zPUl>jUPs|bc3#z3HrV{f{z%V%@(5_FxeeMj3~l8P01%^3uyVKJ&l+(i=ycdX?=Pmv zj-yj}fbM8W_2chgD?be4U_P_*M;IzW{xa7l3*To>z8suJ?G-{ZGcv(|tKpG}g3-P^ z(a(7Djo{vC1<&zSNFT6fE@N`us0O<}QW zG~ST3TRR3CewQ4bMcZ;v<_d6UVwiJ+MvT5=$cHP+Tl?#{PQI2g z;7SDdCJ6G2KRBf#&b%sG*QeO<&E5_eKF}AD?_M83q!{UD-umjv+U&wdG?SY(SAt_wR? zg_HG9Mz|{?_Y3d=)NxdfWV=pIKZ_DlH8uSNEYqLSS9?_yiE!iHe4U%>X!iLvSOzi0 zn3c-4HQrfNL%agyNbt?N={qE$KBoz-Jf+%KU*d(U!(0cBt0RZ@Bt)8lQT7c8+ZP>4 z;vRtaMXgp#tG5G7Yzc1XR0$_ zX;?63#8vM@`Uej>P6v2GF?&sk{Fg346egY9mYSah#EC&0Uduk1Y!&hPt_g*aAE&oO z?T=X^wrxLj>zDTPh488I+Zqc8W#NMwdJ}Of1iCr!G5N9|l>1q6%c zx9wLrZ&e8I6WSiykes$5iBl-waQ!Zf%+oSWFYAJv6GK;b?3=9kgPzAb;agRGf2xnw zkE}~?iV^A}jI{w9gGytUJ1B&E?bFHn_tJ#GPKDrI_L{hz&xi($84?!3>>XX;D{g(0 zJ0Q70(`O6HWC_dwR*T7FY-CF0tg-qTypd@H%qLth!raQO62JQO0D7&AYhFlP@@fP#bd zCNQ>r1&ys=`ZN^{ZTMQE67ED)-wxy$8{wqjyrl||$@&@Rgny-GwBn1_e<%Htb6VJ^ zu=s7lY}tZERb;bTHi*z3gwV=%B{Z|V2v!J1dJ7f`zfSB#Z+_05$^;Z0Ot;g z!UbWWWn>0LW7@oM64jSLI%gRN&vzMXW`!(hWmfJ*UZTz!;b{GtRq3H4I=R2Me(N>+ z$DIEEjMevFN|Zc#Z`ChrAp5m%^UcaVgL+KW%RBB&*xM2uFhs~n7+E<2^7YjGYhFq< zUooQ7*ISTw%G+Tj>z}xK|A-U*XQV#7Ycswc6I2@?y-X#pA{3!{h&Usc+RH=^L4x`k ztv3W>-EtJI(z!0L0>ogfJDnfjvgy;L_pJ^eZqi_yKJ59Z3cW9I$boqEtd(jJ=HDY< zU?{nn{Z1`Qd_xJQkyS?l!6bJ!qB1p`P8m~)`}wbpjl|0RkP_ZqRLq%vzRL@|KoMh` z`C*S;=hPI}itIQlwaNPj1%lT8NN0_$2@{O{(yCKUQ?fLfrqqX>4Kp|Sjg|~EGbry3 z(V&X<#r=4ZeK9vcsi;n#<{7QqaR(hjAOvPQb4WK*z_0JAa)0Ry?~clCh>(S|bNKn|;$5$fz^XbXg%@qR)yz-k;zlc=19}~E-NSEmTuWo+aXb6Y1+xUOOOp=);0~Cu*|dyRD3xv*zq7RklDY8 z)=kvLwLZ;Myw6clqHxBQ6y2*+@|BaoJ>2;IMThxl`1MkV=*Gj!zk>H{* ztL2!whTP`Vk7bP7H|Y#|q5pAZ4OYu$dRETIC50H<9v9Yy#;~*T(lt|)^&QOn^i+A! zyNpF8iK0Q#J1AKv`HUQ$C!ry6H^ln*X`7>dZs7?S*YKi zmwhSG^srFSD~?sObK-jq?0=xVpRJ0h_F1cC&&)Oq?BC-geP$cXw16-4KMDlc{J533 zd}n*KZVn@3>*I8m!Rkr=M^x>k2#(5yFX)I-tL3RYC~OvSak|t2e8hgx5B|bnB^uzBLD$qdLM#6-$-R?=ATEn+U85PFm!Tk6zbh6{6=u! z-~*a5_xYNyCf2~z^sk}>ZJi^3P7}a1VRLO!r*}1!Z1y+i)Qw`7U@)it4MJa5dP{{4 zgk>1W7y!_~?vL-X%Ox+~b#kXwN%rZ70dUH&&bkU7}V7*Na~r-0g-sa+JF zFX6d{dIjme8SP^X<_+jxQKy5u?L3s4`>qjnHA*(ma6b;Q+d>%olvZGBDq7R$!q zh^2jthZ?QutCYnW{Rnauf}qnDE?ON71NI| zLD5$Kfqw+9}bqR zar^8fYpj;Zbq$gF_17LOZRP?a*r}O{L2S4WHwxS|6B5-+U7`TrdJE}VV4pDK_u+pU zC4KlmuT6=}msrYl<2p0o2Vtoet!C;&E*bS=VnfG1GnyN6h~l&8p16dGF;f4TTNBQq=6>FI)yNo)aC4_PTdX!9U@qgkhJfrYvng#f0}j6 z$)&_yD`X*RujgJ%eG9c}2|F;)BVD?+P9vc;^NDaq51M8|=H~UGiU^=Q`q*($vf?h2 z+XT-f1;r(&S+$RP!w}Hc>(Vbp2!b7sJOA=QFl{x()p5wJ5A66{!vY^j$@kB$=MP)f%v{A6%5Oz)gokl(c%-~HpCDPhzsrK$GxKR`nnHdl6S)I< zU=nDo*m=hADoB@|gl{AG#sPkq=yoh~;? zE;)Mr|3a}<;ij|3Ddze+UjZ6hA?vZ`` z9VKz;ZVZ}RDsyzpXnT9>dzDtp$4+$VM(fTl>&9cWAtVB-Fl^$@q9+Vje5_uYJKGf} zK{1eDAR!9WHuCGu1~vgaih4-LIOd-%x&(uN z6fgYMZ;=z60cLvndw{>sty~9f;_m^%k_p>0s-Sk0l6XeA-@%3suAY`gWW-Rh`}qi{ z!BGEC*}P2qOlE_>945ZvCIvRrG^;z;HfUnMfF5P$mb0_)UGr4I9Df>5$wE4uCo<8$ z>J~G2j(IaFpNuKhL?LL2;d}E)r8kC*;sXf}Hd%R#*0)+W&WA9)l#u~B3d4`=r`hi` z+8zG3$sn)Bz!H)Wouc|z@Q#9>{s0}7%Nu;{id_>dSyEWFb@Ec&{*WybqgajUy%g5h%6h>2er6lw_&-8O%jxV}9_U zCS&8Pu!gL`i~=HJA&8=HbQI^TlT4V%eM9G5*^;AK$r)B#AbtR)JcmEXL9>5zuZG~? zgW+A>EB(Kf@lyWuv@d~piNd5F7Prr5U+Ai8Zvq)iHP2CvcY3-8PQp}1SklIoWqXWe>Eyp)cy=LXn{UBE0>y|7O55S zqH+{a>%7Ax>P!W|MZd{VXK71kOW~OJ(jRdO-t{#h)#qzM%{=X{2^n9$OVuZTcD3K5 zoUa3!qAuE$9;B9;U)t8p|G!p-0ww6<-bxUWFLS;U6be*_KzAx?JWlwRnt2|@ELhZT z>W@pW!)7m?ZZYknLZ}<@+pyi2FYvVzW4!-ZSHeAL@(@VIh}UmYh?Y=^`_hP#LL`>_ z3WewlgpM$MCG)S^AEQneg z*yJ`Qa+)b$;DeTFG3wOal$iFgDf4&A8wZ?&DT4;h$(Oe6HEmrrx}B^qX_0?*nm9Rt;BTbx}Q80mx`ay(XGiVKs2MtG#A2qN~`nWR+llz1g z+-#_YFZFBY4YXSNX?`TqUgOX;<4;Z=*`0dFYVotwcUgIx+9hSd?q3b&JlC)hmo#6k zs#@v1E+@`DSeN0k%vw~$0LKiViNd*+iD{3SP@6X!lvoQCrcVRU{TPiS^PoXknU%Yc zH>+i@QD;@A$Bs~&|1y<#?2VjYKlGaYQR7Y-)&J!5Uh=$;qmyQ+=-RiVDBP_)k%xsS zm9T$>LfIP1ZbTHN07c|M=8&?)(1(c|?oA_s*4fp2m}}lby?Zc~H@^p~$X}L@^mJmN zFNgm({qSm3jW5rNy-f8DI)BZ<@ldP07s}$H)j=l(zR>fYBKgO1gi^<8r7T&fE2s67 zMs&wUjjXfsiUcFHw5lX4joe(x#1 zVX_rSo#fCisSTP;= z!f$=l0lavfWLqKEF1Cth9cGSR4p%pb2n~y5->gWz;G=FRXZ5=}{!I>Uy$)@NmPoK-W9wUL(&=SV92nT8|QCjggRPO)XLXu1I1{8xhH7YBa$U#`uMf^YueneDe29nDl@j9@}RMy-&wg!d6Bl}jS=E8yZ!ocW!s2l zlmx944;Qurdmrad%>8J(6fI&uqifQ1DVn(_E&FhWxGDef$uJmb?vl8jUOZiq-kq|n zv3`WoF>|i<6ZhLV$`W9Bi6R>m23DZ^p$Eq7jj{`J`!2BLK0gkw>$wr*luP9Yd(4$iEnXA2c;~$NLM%qaRHL7FZNGl-{F)jpBtBQ7`IiM zEeHG)w-j7zQ!K9Lwo-WNZC36c#6hVIKl2hUDerbW{^94wX%4W&?}yX$?^F{E+*PT< zd9*y{4)xBxBLz<9F2%O;2=+yNl~^|S(gl@bR^%W(23GeM)U3Sd>&oa%UF?t4e%tZ+NkCjfyHyNy7h|AZoXQv>Kpn%ml8kMhSv{8O44O_Gq8chUsQTlY8o zG9XXqcnLS*2_YPu@3>nZ=kYPSw%Y^4SONw-HiVNbg%kf^e#S20=YARV-K{_C>^7tF ze(qpDSo$=AWXF{taMt3C@FAD{yE6?HFYi)|w-3thIiK1qs;Z7yl2>fp0EbzPiqT22E^ z-50_L*qN!#y5&xja-~W6j!D^OQm$6Y!p(3+Q}Swm7&_jlDTvlGR6vW2Vp($syH(iZ-NzfIj|>bY<> zT-MZ`op9ZnXt=gtBD6KJyj1SKi<1*i z8hPHW<=UgtDbODWX);&jHJ1dwOlj^?Hl^jF3To2Myy0{5ot}`mm7TP zex#=E83tc*lRjO~xqlh_UZ!Ugj>eOaHTb{YlvDiprtWJ@xoT4`Wy;Au*VLUh<(8A~ zNl~R-fd4{(42ArT7YFj45(-K%XN6K5UtR=@plnc}m5Yy_{|z!e5Hjw(IcV~9Sk53L z#KW%0=;;e6NZ2ttS8Tk92vVzdLq@N1_8yc8@DU&)VV_2k9%O7qi3;@V2NaeTx_#_$ z?vi}HC%vhArh(&Qe70_B;lnBo!)rsG6CSy7oA0R_>t8M*eLepH){?4s zs_LEJyWaPq!PEk4p+e*~bsHYKc|U437wa`Qb1|4hYH zH2iN&r%_sA-$#9U_%Ql%uSw02^8ehQ^8+|OVEVmM3?5nK_c~ms@tK=zXEcBPcjC*l z9|_SIy{4+J<@TmO>DuC(2TZ<|0#sy`pDSFa`n)5_(Sy(Q3Bsl7kE|qsWSLiQDuC}U z5r5=H8d>*!!*wsnXgd`g>K0vG`cm2$bCVdCtCBXm4cnl7ePRPFrPV{PPY=RXU-M}o zxNmNboD+4<8Oa&!X{#gn`pg)fEQH&qIKyK0Ta)aL8O^c!m*yp-^-s?`En>eKv!9C% zeKt1qwOIXUH%!3^Yu?brw5K_P%sysuJ@52i-RSg3G4H=RVfSy<3O-W*$PJrfp$_W0 z;a|kk`^m@)qC?kDjf5VK+B1gx(fx^5kO2&`cg`CbvtKmz#)du>FZ6#t5_++5+B($B zC$(Pe-HN z`9Xg;?vsff*&CyyvAyoshw|H{T;13D>O7V_}<5*q&71Pqj}yYU8}hUYh|ZW zV{%uMs!hG5eRZwB*89NyDIbYVU6!sO%zq@a<76v;E1h-bF4mS>8;?=@@~Y)Vt=ajg zcu8Ny=d;EfI(x_vEdytuN2jXBaQt#lx@KSzT*xN0c%4SDGqUXmJOlvXX6iMWlaEdR082hqF9S}Q>onTG@Z?My?u;La z+pWDP7R20IjPdntDFWKfg%nPC*^{abmDqdkUMNRLguFGO_VGgiHi9+HqWfcSJFH)Vmu|EmM#N%+WZyX| zHGm!1F~{N=w#MwbhMp6SL=xUdeo^{ka5#-_fTq#-qVbd&b*?US!JP$4$!ymdT$E^B zA-%HDvmmrqzG4(eYD)3m;$w}BU;^`N4Dz|z;2D&m!#bPx=i7L z%uGhV>F!wW@Ja0td8hkyaA{zQQ$OuGMX|@2vBalv8Z${}sF^m-GTq;%o^(csexwVp zKoACpjQuEKAb55RC%5O%<5~Y$+cj&H5sqmF%RKD5`E{vNJT0JQN6o$uxi=CwAqYa4 zw3+PURRr2;ZbYZ9H7#EQsS{PX7PC}sgx;B`?;pAriWi0}oM1n6D?aAE$@Fazj9gXq6ROg;B(Q;VXT>?y>1+g>P)+@rHC8@NXFC@Dulw^Zo&Spd z+|b$6pQ}IZ>Cd6X{-hUkgigRo+Lztd@psyTFCcw8c9&NvT55JCjTDP43d15#rS>Ya z$RixRf+ZX8ve(Y54_MAYm=*@EvDbDS&@-PR{xJ1N_SfbSB<3yH z%NuWW6TlN&B1RB)Bm+Dhkf%Sr`sdAo$N*zAL}@Uc`bpHea`%BbauHUm*^XI1~$c1AFw?sNEH`BG3>@CBrdVisfmjq9knx}VPctewix|1lHC|z0oLFw)fzo$$t>z%^I6@j=k@7!*q8a>N6eA zdtbqI1G&RFfn#5Z?GC>b`%3_^b3aDt(-WYU1Xj*CCM#czdm{}R8Yq{h@8SytKzpp! z;Hf>f*8JLO8ROP6r!IFtzj?bR5bTa@UkG8-Dhz!T#%|uxuP9T7C7qFL7-{DZkSo9b zk&H5&iCUB7Ag8?velA?O)ZORzU34mTTSt}jD!=d5lo`E0=OiohofEd}+`W~17PQlB~jJY=?yw({ozdn5NTI6zIBc{!2+^+DRuE1I4W`==0Aau!v_a^0yT zBAM>7sYAKRqoY#q>;!S<#A+F(bV7CbVZwR~(J|EQER$BiX#rIOY>}Ytc_nFt?Xir0 zit;i!^doKiHga>(FX@WSk<&XgF03uS($R6OXr(CMxKe@!s004chFdL`>PF|7IwMAJ zXVie98Tl=dxgMw?KDle@L-*kiA<25fWo+wHg<-z*UG^R7ml0R@h%R(UEe+eE4tQ7k zzxJbE1Q0GKpYQ8{n!{wbkRJFTl=urk$m~~C+PnmA5uBYc3X;yym{WsJ3=T#ex>X>U z7Q|hHk)7}wpNscq3~(^cXiSu2`)(H#qcIgu{P?n93U!yyD6ug7%iPJ#2@C%M@(ozH z^JPPf?=j74-u!A7{_e@U5aT5mVZ|&|Ubn5Eh7$-oF2bobg3g0B-OM7OLq&vu9H#*Ptyc;WF=r1!+ZUtnZ_1t9pdK^P^EMC z0_-uW2SL3nTORl|Ot?S8>&1j;fW0CUo=Vu05)(cp4$uskZt2a0MU*W+m+xNXr>ac+ z!Olcs>~@Y~6xGNi$9D=R-g+q#|9__ShJl3nn{M{MeND23?jxSxe!+0W3pL-w5vP7< z7mhgd0>pEQ8cIqPu3kumqGDx~aVr|j*s+ZF6N!r#0tEZBym&vDrLDHmJ-MhXHYxDCT|4ldK7NY%lDe~ZFxZD_c6vlq=Sr04##Nh(O ze_z@Q5Fhz~xbBXUSa|(;1B9nF<9)4IIQgVqfRH#}Gdt>x4hGU|=BA%Qx**CdV*UO? zz4SMjpXhg@5Z%l4Tl16w!&l8y`SZ~G7|(6agc|Pv#^!@!kw^mu-!X*Nwr% ztY)s>x#?MI`tYx4y8AbN)5F0%tC>surYC<>(+{E`^=|sH^Jsbt;>W3wxYb<9db~$^ z8qqo1h^PE4Lv6@a1hID+X+AVXY}^?3b%f>JBelRN4`y(`{6tgEQT{^hvx|$9&iG48 zpf%D>Ja%X>zL?KrnP&}XQ-i*Vyk0(G7xH@VTt-+y4J&0ulWJ9i-W&u6EpdJsz1o@c ze@@rjyD#3oSN4DTP_HsjKlZ(6Os`%W_)Wcv?b@r!>eU)xxQqQ~5(_%Kgb%(DTsjqY zWs-AI>^Xg=*D|{@!YhhnEm|VGC6&YU)n>Euk~{uzM*y??IYiV` zErX7u78^D5;pz*D_A8p>-s5!~P8hMSxE1c>`QaM!AVGKf4qukJnqa7;<{{!_2H%TC z#}+>o_qX(2=SgWp=0}Q`xixgwln?5U+^1@bRcsfrsdnRUSu7vqDOT|;P7x;4a?Qq8 zWqfQ1x4NrC?Eem^2O&fLmgQ!*2IQ21oNEu2&%>bjZ5*8#(U~B41}JjhC$_&N{KHkCZqPiM+WNwD zyS#)p*+b>~!F;zdZsVln`+r0Tt8UNjqUqsq#}BHG!^r-OS()5K|Ks&9TxE4|Lqh}f ztAi^KUGp7WXu@SF>@k%G&`7X*yPW#6=tx`l~cBHbPz z`b@k~yvL`|zdTX@1eTtp73*^AFVzC#kFSqX!ZIh`LYVT9AkXfy?Fm})Q;663as2#6c={{ zQQThNQz)L@)HMZy<=UhAFDF@9nP=k~LmdBmJl^J&CkMZp?DZZ_4t_Q{_^HzOs^s9ulY`fl z-m8;?A4v{w^WQ^l@wUyiRK*e?)<(30Yk#rZed-!daX42Gl7EBg&nIzf`3Ah?D6^T+ z&b|7pILMXP9LpKv*3@C0m2-K@FcbYtj8qu(s)&t9#fG89f9}7p`>ea;`4YtOBs?|V z_FxKo;QPIdjczES$BzW$~IH*hJ2bq>h0z?l#pv7!F7 zu%T*e(Q0eLYTX!L+D|dS&9+zFFJ02Rh(kg<@3%~{?zQaoGqT&tQ&s%!mpYB9@!r$Q zwVk#_4b0$SW4|)~zO7fKyTx=AN?yCnD>L$&a+xm7soTgi_adBI6VWhSS&!&`Sl|&?{SaT~)8 zH*nl15RBN6}wk=Svc{}_w_5&us+kU9wV~A(+JkM76=5bp%OO2YDIiO==q}g z$2pxl?bfAEbA;<7@H)A7W z;2VqZHFlqSSvsje$aFI`dY92rDa`P!U*!{~%C)_!Br-7p0QXD3-|-y#lTIV{)^*l` zEI^zQXg3Rm zGjsNPlYBoUUuIU{vJ}(g8)iOa8u_+=9o!p<&|0S|uHZM?I61xAKE29`hwak|V7Wgl zz>a&G{bA={WlJe&_)uDFESyQhi_~zua7KUPPc`sJ=aTjxhU>ecye=B0&vqeh5+3h3 z%)oW@{wV^cVLEFcn8YSMbPLX;m7R1nu_sO7L0+{alzxM|qCv+7XHtI%YtJR+={+K& z&kd*7VFuW!K_m;)>%N`HzO6fWhTTES(6M8(T`8 z3MCL9l<{;vjKh{(h}I8KpF^T>_9cZozfY;4OmOD^if4Rc24*fXPZ`21V_( zC-#rp@oLteqBsWg2%2mH%_RGNgWMgc>RqaOhpksTooSySPAhAlP^X`GyQY^iwkvZB z;m8pi=vSOLNmPWq!VZl&(e#=rAlUB7t}Ew?Xe;)Vd&fTFLwj}4*ivJgwrlTaxmGh+ zD_PhyZGV*KrF-80BPGRFdl!;e+@Bt?&iilk>dOo4>Fh}t)H+K&Vorg`6+$WJ{Xq~N z)61ItKKu^LG80$$V-`Z6b)DA+4e}as0`PZ&WiG+6}wy2 z5G7f@Zlss3$?r=7z{oQJ1}Ovev?jk%S-dv51iD$i2lVXy288;4JBH&tr}VD2oJh5r z{yrsw{;oWNCLl$5MY^+B8q*psuvmzdV&$jfmP>pc)2G6B2d)zA+>hp%n31>a%b8a* zq<;R8#_(0m7zi^iWkw97E^;CRkLYeKD;xV|MxZ|h&z8*WfiO!NlSM6WAan8k$}W-W z_a;t|b%yDNYuRD}j@OB|b-lai@6p$s z6LX}13^6Kdv9Vhbgk=j^_KP>Qo2dwi%niw8$h`APjt`YqMCCSS#0dcgVozZ@v=-d#fiA>{Ox2`z*5P>+P0Q_lPN4`|PAju?+-yC6zy z&r4ou?1W+xPIjlxfEE#QvWQ^xdW1c$fT}*ZhjE&HqJXG!_dxpa?xw(t*=?KH2Q2yS znEeD>-3Fre9l`-?8-iei>WFpknda^v z5+yQc_=uU2T_ODRyRU&XCJq3A@SjPNG}+v5snfdGK(v_CUS_bLo2RVy)9i#A`mjHy z?T(+Bb)d6CO|xI(lguSU91D>iwyU^rgZ*;u%81&ts+0B)Yvb(=Luk0njuX^2KAhe3 z8tYy|F*EG=aOaF_evWreA4op4@U!D1jnsdZ%CnO%Md#%zH^qR&Q)c4BeD)<|45sF}t%rR#2y09l$mdX`_N{ z51^b^ZR#p(46)@!Yn|>1fBg2`BkF{p=y98 zk)8;wM1B+dJB!psdm`J&6QRS2HO{2!_J)zv4XaE%K0)V59mVfK{5C*^^tTR5v?s>F z50Eg#*zMjlu0(}a{zug5X+VZAux}V8rYITvf!YUMZ zLfP%*ez|>BuED4i={?#T2Hrpf5U{1mTMhQenB4{V*T^QrRz*cae!lVL8WR=zlc-)a zZJSASUq-UL@Bg8p-6f!>I}4VV!=D|DCLpCHc;zc9J?cY}`yeD~mt?q41li~7fhY_p zfd~WpsUD@z-NRSf8$IX2=%CaGPO4tHVtSNVj`IVnmX)>wbbFA?^g%e2I(YP`6#JA#e_UDuz{s) zZRNfm0sC+YRe!Dg?J%0RMAE3uUf=N&d93{Xe3HD2I^KFAPQO1HMF(JLnkgzfHHH#RS!bLgi{~{h zLwL%BZn_w_N`LRA58ZPb`cR>9FT*zGlAGg zMRKMr&2C2}a_A&S#(-cGPq~-V=kKNrt&!@@CG1~y@A&^(85&RbdM3Hp*kF>2APGv7 z+@a+0K{(ydHG@Ut1YY2h3P93MXnFF#$Sz@`bLs&(zW#t}VU1Ma3*9td;wb-MYFfVN}K zeypOzO}Cs+=}xnZ{53I9p8IC$JE;D9$dBQm~vI6ofix@*}qZPw2Pr#bhB*k(Yf}1(5+*JY_ zA!q}=tD{LT!2+^y{Xn!qoDbbwC+kIo0ng?e*jOw+#!-M-w3- zP>AFAiF;_GJHE2WM~TDx#_K;K4m7D$K~4?9uTm%H#A^{}@AmON>yP(Yf4pIRds3|z zR&7K=<|koWar@uxkvfV1#Wvi`E?W#O=$p}!{hNlhN{KF5)XIggKT&j+hMGr5r!* zZ6lQS_`N#gko|jwXn3AKL3VfgSu$P*xe*V&d4_l#tVR5r*i<(t@6B+tM;b6e+v0<- zsUr6q=1zZxmbF?ry(g$u_b=`yVFS@>RD_>ZOTqmD7Z0--^1e-2AzxMcI<>Tt9Dywa zZ{n>Ah=GBh>mdxH?(lKvTjcB~-2>HoqgW@ZwULrvP;9DaVd(vXN{XzuKcpv!=RRi& z3=q}BZ$8R`^+pk2-u2*JUcG0w7EQ?ng{7UKn`R_lBaJjm6TTcFfS$G3Sf~1$m#c89 z>5OMjDNB7P(h};}t3*E-r0lLl;mlA$K{e+*(N&gyzwz?UA;xby)er9o!rUj?-o**s z%&bW^n*EE{xuZ!2dixEwmY6)>W%6W`u_Wc**m>5BJEv>oI-adZbHuBWncGaNjrMyH zGX;$3BraQqn?yP;HS08glPErI;=qJ+O57Pa0>LkyXTz2afPx5!dl-zwt~p)dG-8Y4 zC?#X!Aw;{r#GQCeqVV0S)3amx(yT%xByIc{o=RW^X20jZ8tq}GAf0HBnK^=Z>_b${ zyB=)I((;l~J@Y^0mHj5%hT>Ta<+&!fjJ{(?6j{)1bT%_f*)Q9LSJVspNhDRr#F88{ zRWv$vb*DQ6M@87DHS?IW&(}?3x~YhcyWG1mX0xU*EB7IP6V5@hsIcY33mxKotAB@f zqcgHD#aR-gvLx&YRmkansrd;uNdxNzciw0ir#s8I@KNeh$1mVJt%!n2Cjc#1 zs;m_p%_WLrUH1wuBJ{5mDa;Hp!DU+yEpjY#9bO^!6Q#{t?B;CeZ*gbEcPQGDsVcxs zFrRsiH0du9E>vbhci0EjwU0Nb@D5Rb90On{fa$X+RswU>ewixQY@CE9G9z03W{G0>9{bAtz-=>XCoCl#Avm0^;DS2sm^8P2_?wi!U$q-1i&}=kWD@wcZ4AeUJ}e&sACrHZ@D-Re%>+c?^=AY- z8}RIk_68rHr|}JZ3U-bGd`zzJ26m11;|8VA^+qWh+deh7n^h`U;8H`C=Ao=88^O5Q z2|AC}L(xE@;DwFE@MvZA?*oGig_eqZ@77+NBF8|tNiA(QvaQo=fRD!*U`f}iF+COC zd(wh~-pJ;ZJCP=WS$o>s{mR_ww-x7W6|!>oAgfCGGgfX3y-yTYD9Tnzem8VF{zL^LS`y`kS&1%*C^duI2PAroQHgX{F#rK=qoMryB$;vh_Ul+5`>o%5Jv#lfR zO>v!@mvOwLQu*uP%UN)Z*x)0?y9z(X;=HJ81?jKdD)nB5kuangd%*p&1hCn=`)vFb z=7HZ+Fo2HFHNN86W6COG*K68hP-*23gE33!bl>4%_AYpY5OzXkd2~l$EdrE6iZ@&f z`_>*3f~R-yZJ;}N&oY~0EBt~ijqL9e>}t)4lY(|2YLH#d0|!jB+%%DfASG38!3 z!N2&g4&bd4e%${$y0?16u{9C{MaDaXT<92wQL?B=9cU^D*a<^F<7bX0u+Ivf0?o($ zqw4gR^gZ^3BAx>K#{W=hu!ECoSR=Gg$(W61w6o!&=IrW$?%azIiECnIM|d|9Y`&*1 z;3AL-{oY0D-ORXTyTnNz+y6?_v;AS(ThyYh0_n!o=$w|V{$WO^YmS_ zdFr>T&8U!3@!i)su%vFWjbnPIUaD7{rdE`BA8pil=PvHmsbFM}D`J;Z`Nk6bCbOgZ z`zOS+t^K^0Tzwd@;LpQ~)=2F5-j%4S?!!?ZFO%qg(*7WRv=0LxhVD7{at_5_V<_L4 z6aM^)YU=5k>DENLMel<>p2LnR?Ga5-R|9k91*V}A{(gns+sEH~Jo&B?y|p%urV&zc zH;)O$S^Rq1%t6TR$K(AGjg`7eOs3<97U`^vF=Ds^ExyTu6ENw;UX*;hS4oPplQ+oB z&qgu6w-VECaZopzwn~FK6o~qRQmD4#x{E`QLd(hj!#==nD*5j1Ot-6-qd=B_C$0veoXmb|?daa0)ubD`SsJw$L+}DG(-&LuD0KF-EL~Fe6%wf57nmj)%j~Bmy*((b6ges zae9#V27P5+8yWZYtNVz% zeF*qR^ZV$U;wW$_cF5G{cQy51Jlox84bdiYY3v%-{3oSMnFwS5)VsP7wEAz;}^OcqxG?NkWG{wg+@QXv5C*2Foo%q^bjm(bkORl2DbSic^3F0OGO zHa&Sc{h^{Fo8A`&WS(ZMg@b=o;AoJ@jxoA(UgPjLee*TQV+Sz)g#AGyJ3hH*%~1bp z7{T1T(}pSVjKY{3%up+eLnW-CcCt*4J$PVuP=hT4pz|;xpY=7PePXB4LhL!31D5~S z<7I?Dt#O|@OpxE~kJlf}faVPv@3HkgA1{_M)IUYj14Z0dE5RgZr+R0~(>3M#1nY{Lk!n00Uei9VZoze0~SeAK;% zmHUaPHrw5g`xLNEuu@ID(68)1iFQT!zB9Wmi^L55)_-%9tabO3Q4wBzQyeie5b=XlZ_UU`zzftn$K(j5}`Gm zt`&U;-RHIn>ckTujAyQitnslKYO&_0^$c{B+c*$TS3*!6S~fMfzbX}fhL&*(~2M~L40~=FNpt6 z%1gHEV(TV<%di)`73L$}^hJhNtoaJmU971D{BMiSVb^9Z<2{+S~eg`L-^qw7u`E-RN3~>k83gaGZ&OcVF z2ht?)-G4jIULKtru<>zpGpxUWpxb@u1)by^^vVJ`Ax*BU@=k#simbFELoUNl0~xmW z7sDp#7os@^Q06`|(Wkl3x&k8l7s*A`mx$=lPkRy3qhy7MYOVRLdg{%ze^+B_4a!dZVeufTYd*aq+;Qus50Hw@r#{D=e6 zIMkk%L-G$ab)hl~Dn!KN;zNt3@}pkdho zv=hmG7)nfQ4+^aL+5$t=z*-7Sk7Q3}C+;H1*twiCs3Hlw#i+oY~ND0jIx;>M(`OZdza)4tPY@vdn-BB z(vI$J-JVNzf&NvDUB_`u78Tj|&r3ST#hq^@os-TeTyZ7pQ23g7+dJWS=v5gzxrX3~ zc<3Q>3EDq2rComny;&gfYhwS*!t-{I8QCuULb4?CR32H*)+w1Pi~_c&uU@e?|l7)4;nY%byF?pTK*S+dNjfDg=6=FDQ}G+nf*Vk{uMUi~03)rt89;x3j?+k{Ys2Ex2%o|eQo_^JtcTBdM?d@p&>sCI*L>{#- zI;P`EUk>{i6PX#Gf6o1#*IQ4+KaU3KDt>S1_Gi)%y);)V`{iR?0dVuLkX$#c5@4HQ zX}Kjk70$Kc(KEwV?r3`5SpV4pt-Y(xt_?*l<_uf|j^HuQ?TJ9%1Op-v6Q0t_-AOs? z-bs8EWef-?BOo45w{aw^-O4K(jvjK)@W3p0q}4L%$R#)uDZo)DYq$L8R4X^mED6~+ zd3cWm6u^qdh8Y2SgHKLGr-4@7yW1tJ&Ga+3O7iyxl55>xlFY*~jLRhYSs*lbPEUdB zO9iUk%SaY63b}*~%3n)|6*_1Ty(qGVcNA=g3FFuQ*7=On!p`a8cwt=s=-{@|{ZgzQ zGoml8nzF6^`KI*vr|A#qL)00E^47yR`F19}%&aOFF}kzEnOGGu)1LiQ(;MBb1TNm@ zpLkhHHn#B&k2>-G?7gPHg<~i0`!>yzF9@Cv3&{}RbwoF%D9g1R?WYyybXR&;@sas` zkoTzi8}I4wy07W)I@8~%b6u4u#nsSjW^OgToSG~f`!*m!E%tDD|5P}=T8X$BG*HROn>b1_hQIek#nIhUep=Lqp^xmBu;|4MOL8y!C9K~ETB(23NGGfC59;&I zT)yt@ShRIRnE@0?f-?iTy-wt7YqhIbyV%XzMMSNd1V{o_WKl$E6>+^<{gZMeLeo0{Y?tnA4i&f{;{0lV|IM{Rf z!=~a_NbxlMjYIV3@tL>^9XQ`Dlz5{F+#w{oAoE>X`*%sh@I0JHxOZQ;B>tXxS6Sj< zf6OC6h%N+d#yw@3RS@qo-xM$_HJfHt7#H}AsfoEB)ST}p*VM#pc|46r-Mq4pp*&ke zFSJ$Wx7^ywiuH)JPA^^aoGheun^Wtxl$xHk&yuHAVga@CAluIxJF%}Q=1%R3?N$L& zb=ZUHr(;~JtFOIEGD zUlv3Zh)AC~`ir<$`pn}(9(D6lcK=z0oF>f6JisM&ysU~kudhMm9JF9wmT!g%BxSw4 zO)l_VnXjcfREpOOsi;oBmAAS=UjqR>UsWjuW@x;W5m&B)jAq?B|J{sIR};4l$`Z+t%VnZai~=LP@nHM%QSIC)nQ4tdC)nsHld+=Wz` z+8Nt!=P_ylAWiCSTW(WTHGlV>M^%|;6w$0$ZMTq3MbomU4?OWzj6?7ycB6cfuJY*$ zd1i8R>=II^V|>MVyy9+9J7u**-4(^B)=ia3nlr$Q7Spt zNxsraE+L5Rb5Bb0+fMR(-Kz2`C;5LQ`4vfi$w^-3Bp>f2k0W{NbN?D?J?5nT)=Axu z6DoT4Yiat=QuscSu`hSn6vw(eZ1jnrWrD(I&B~t;d_W#&r2PW6o=_{p&WRm?C%8+_ z(2^&?z9iOogS zxKL^w(6H?et;*>Ry_$o)0rgb$QF&~P@-mlN#|NxZdqPi10r;BOkqD_r3#*e7>*fg7 zg}SnQQ~?Z@b;zcJwuP2@lhMK>w2DysND!eUAc81%q>nK&bZPTfFbZ?T^riR$O4Tq- zbHu|t&sHLok0eEXL&}hJ(MmYFUbKj?xi=ot1tguD^7PL4M(U+Y^?Cbqyx{TzaaxMl z`NZy2H92^EkK0Gi7Fmb1+y*yENi00%C++^0Qgg^tUqeap@pu&pm@=z=V~&8U=VLHV zUIZRp{31vALI7aptq{TMcUw7RYDtZ*q1Pex3P1mJrPOTxLf!#%;3e=>?%r`dDDcAaJLl7JHCW6HCb!9mEWwHwVPkggq$8a=hyxT~7J!TQgs zpCi+%`=qU|n4eGE>Q3XQudNQgyKYZg9n^lWQCDJ1JTYf}C`HN3I|Q^%*DKJbej|f4 z;|tO7V<@0D6%=d91wc!tQ%fy?a;Yihc{a~j*9~bQ^rUL&zJRtz-HMBJ&{(bYp2nB{ zi}};Cq(%6|;A-O`u>z8Nxk!4%-=F6(t&}~URS3EHACNL8?r3eXw{0>5XmYhpKHc=Y z8GuZ@mMWs31KlW4eSS#r&#c`m^2%K4SncQXxQ8j6cabBe%<#-sF}0@-AC+K;*Qm?4 z*F)R0_$r==@qx}(ETqMz67l|ckKzb|g1usJb2-Xb@mKZq+*Q`gzjq5Ak!Gr>x^?a< zwx0}}N1Uv4A^^((17oe@+C&-t@W{nU%IkcUwNvOk7V%i*JR%=U3Hm7h(GF4R zLc*0(>l<(uiqOiH=t^Gbd{RJ8|Kd*!$jk5p+eB&0A|P|tW3d@}g7qg~Maq@jPf;_k zZ<$+5{e<;2T!4CO1=z=$p8N#@tq}W{5YC z*v<>yy(gqAKULyxr*(8Vqyf2}llc*4$SK@QB|5&p8)Xz5CB3tE>`nT4?$gR?vVXOG5TKVt*Bo6RR6v80&cCXyTs zs^>}d;@k8>^&pcT;!m<@R3#mQKVk;_Jlelg#{`A1N7`6^(T@pUwPF8oEE{%)i(zZc z$Ud4_l@oi+Y1IBVyDHAQ*w{A4$B4TT%14a%baQqQj*LsJ91qezqL=L*<;WsQ0XQq4 z062KlCVXw{`v(WzY46!^9RdVW4qGoj`>i|2jtjS_>bG9rge>pK;6KmK$+frBfxa%N zx5xpPFphrvQJ}2gki1e2@&E5i;>w(DSu84?LF?&X$ilQYA@Nhdwa=1ym4WU09q?uu zI1;;I+ns$7=z_@$)iwY5yN*(T{T^@6jii2S)`&ib^TRpT#lN)9hQsmh)c$&Y?0K#e zQr~2PGe`3JUG;hnuZb6gPsqW}>f&qoNTx>wCoxJQ)W9cw6*IuN=?5RI9T6teJLdmwl8o~S6IETe>*?%E@ z0FMR#nX@H`K(SVbQ0h3Yk$$Dm*Z(;t$I&=Qar4J!gr>m@*|f)>Lw*DQ0>9F8l@)qk zHY+VD)XduOHZ`5d6ZnA;)7Xz3Qe$6&h9z$qmMoj_FlSgiCi?ei$u}sP=s%z(<@^D` zbMBfG{ht%REcurDwogmGs~)gmved(VM}IldkC{rJ`hrRS0rh~$&n?s1|0(6isHdN6 z$+7C;XIipQJ^U1YS3UehOMXK=JQ6ES^gj$-U--wEoFxLgSP^4g{%F>9rrna?H$X2O zL7S|vV}3sk5%V*#`-rDK;sDROt2@&>upd-(WDr~Xo!}&yH4D{Nf+MJbbj4g`o*jC3 z(`@GVL+`MxIhmgfy~8`@WQ?JAIK>=$29wDr=!G&)wx?gV z7Yx12eUcL!$Ego9i5&abp>%ZtFp_s?9$TBs$HvA~bU?U|A`TwA2ueInA{KcGT{Iq1Za(7QlE%Ddgu)0J1IYTo)%MGolyG#lM$r0v z(Tou(J@77gP+xabaS?p5_DlrcvU4-r(v;#VV>hxR9?Fc}d)6d2yQWg<1-zGMP6p3g z_l+hZJ2kZ8F7N69;l+j7#HmcXEYPrdrKi>``$Hu90Rdu(oc?Y&?&RN)}2l=+Sr`k%!k3 zeHB<(;=?c{LzTpz&-PD%Ic&5Kj3Zk`2ae6g=OWTNtoL7NRICG~yN5L@*D0z|iL1gu zE*jbohq@3;$~cHAtMG_kmkBq2A0-?(YN;7KOAjhKhCwjfZw6P!IjPWI3W%7$p?V!6 zM%`PrXX?i3DG(#}?iYIgAjSSm&u@o*s-6dFTYDy0e8JR{>&9gs8>*`Qu&QDc|4TLB z7^vm|4?oN+JI#miF&>f90kga?UE5YJ?W$R2xs+qt*uU&rfccqUHm zYvXSTd|9E;2Sx79mLlu#{hzSS&Mvq9pdRX~aFyc0K}2jEryGy;BPY4aGMxvnb)WN~ zTlY8*eruXM81GzT-^{}RzGY)Osmn3$mLC2S6CrEexxV=+Z>VL$(hsa3kO5i!eIojq zWR_LoKTf2v&1Y9^tJuiAa|vFE%2&kXvO2Nc6IMvS=in#ma&8B|0pE26EpOuMrO?{M zEBOUj*-@-gU*>wO<*LLEkrZ&@>9L;XUGDfjLElr-L+t@sKN9}j({rDEkbgb*{m6M> z4_#I`3`d8}mjlmBteaGYvpv=|&V$$bmh(_(g`I~Y%kMmtSQpBJ0PbuaWcr8ZU!qZ3 z60~$D`?AC>6(6vL<~fbVGHzT`+l+H&-J(ag;oX93#t{%d7&1%GYw(y=24+puINrQ! zU3tvs00Nj>uN;tZa_BMVlz6O{)dF;zT==6 z7AyX=;$1IcLu4nc<>$HYvm;r@d@dY1`1IfVn`pVkWqjHkibOxu6}1GomxO)GX5L9G zdM_k47h?&l<8!*hTwM(w!Z||#S@GPse`x(So8sqdVe9N@PW&X})=F4?)p7c#I;%Q4 zh)0~jqn}#0WlN5vq$jg-iEL+?-b3NLN#JW4*#6uk5nyjqFs?Ee$ZVSrE7s50&(@S5 zF#d)44Vy&z&m^U2-dw~3*W=COxWs&Lzn-rAtM3kO@x-7iNOf}Nd2p(B2iKKBD)#UQ zXyu87|K$w?!yC14>s0MKy(%$Zd#DqkbvF(R_|}!M*|;W*3zdE_RlBY8W346ENJzg3 zE8zR%6Fkfv6*Sa?3L__z#o^#4Vyf^Yw57^f=PoXLUs^zOxz?ro9e`h> zM@^|zkN!|bD`w&el{cMls0}t<(bvAnJYaW+8rs{>gSIDN!dw0Fp<$N0gimhB* zo6k#C)@0gJ(6=Wu`D_A7zB>4_IvbC7e>ONTlQAq9FL&y?+2BR%0$e73o^0-DHDXr! zj+7S@qCBp}xje)=T{l2xf;8d8iU%;rNuGD3r$0xG_y)fu_Kj3m)g!c|K{ZG-#&o{x zPHf&WdSzSF7?shST-f8jkIsq|kVfiC4pUMXs;&+%Mlu>iW?An+v;?J=+XwKN70C^D ziA+wpOiqO=2Um=icm*wn?wL>N z<|XKnw1GQe7Cq($R_ZfnCLfZe!+L@W5Ru|T>vs7r=SAZ~^w6#AomT?xY{%fsy3~0s z7lQ?3x#j0o#EpxoI97&^XY6!Yj>M7QMwED?j(oEVC034Z+)5P)su-nxFDO9A?Birw z(YMYrc52H?Y^`GHd$kA7KmZXmZ>|jbZuSSYNjLk=8_EJGaI_0YA)-@nBt5ez@Dg=F z30WeUu?{?pbt;?iNl>UJf|W(g+lxxkXzkEa-;%G

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

81-BRsqncqQ7Cte}~lhNek$6sj9 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%0DZe-DCf)Gp& z8(W<_FYb?~mPk**X=EU%rnA!)NJZ=~5EC!=&{>|zdOVdKFx#Js?yEY3=g?g^H- zX$dWE_ZbktJ)KH1=%^42LvhrpyMUUQA85(H@Wic2iSF9YEs|W${DLpS=^{FG*01b3 za$3SShT0otT7<5Z2nSd!(!1m2V2aS1-P1bicMd)LqbgBX&T=Y}dXel5 zszv;8)8l$X4Fyj`qMMyi>zjzQS`PP&q&_|`p!7oqN)gU$HC(7yc9>jx%8&}^VCpnA z4geuj%PIqCF77%6AhA36mXDZes=!4+DSIZ7jz`Hak&YWY|K-BM&-RDJLX5a1bQmPw zvGH7w{T>H!r&m^Mk|`JjpQG=u_%7WjU`vrhtudv2=Mz4^qz`RXDq>Pn#as31*Lb9`bTV@hrYF?hL)02fVd}c>XmnGQxfEZL%K7=h3 z(}5goL1G9uVkbL5u`^_+G{N3vre^;{mV#!y&R1s{h>`~P)uNWHG)9Yb^PET;&PdJ} z5XbM*)1_v6D-9$*(;VN^Ox`rd+c><@NJAx}n>?VKz^|9=023>fp4vk7Y))i}Phj3B z5;V8ANPX+6Es@`zTED_vV?tG@?M=MC}ac3&dV(%Q5q%UfCib zv>q#Tp94Vw7#MC|G3{A_tZtCGej0wR#N;=ewKL$d{LcgD8(H7j6NONs!yQD}`23|J z%E8AX#1%COA>#_CMcgm8F?Xw8 z4)X_!hSQBfb<#%2SJP;qa`yKBWA0txqpGgH|4b5ag4h!)XjH1v#x}HC14T_rY%?+g zXLO=iMQN*+HdJYAHPsoVDiEBBa(Wn`RV!`nQ~Ff<;M4Z0Z7ou-0W?9Z3V6dyD_%Lr zc%dQ}QOW!L?R_Q}rTx6`|MUO9pMO5eIkV5cuD#aUYpuQZ+L(6hOr;%vu{d-xr4%&8 zoWCce_z}#fx0XYQWlkZQnearPpVO9<1A9R zz*57Bj)is0_{~+T^gytUda&E{V9TH$^rVYlrw3C^BOPtyIY<57`tC^$!@2iK6_={y zW|XKOlcIi1GX0>1(xoX*LAL{#mh5>hM40}TIIZgz6HtQHtX%xpx?37Xbj;A0r^Ayb z^Q|QsT1zdRFY9SBJrJ7$X$QMVMe;Ll>BO^`C--lB#^1Cr)xj(Fr6zdJzSIVf*_ZlY z9WQdYT+LH;4t2KFD!4q#(J)_n9K62YduTS$AP4-vCb&AvHG*7XrDAyX9*4I>T?}Gq zDcCdDkWrRsAZOOKm;uoALKHBXSLGM49Q) z;96_N$NJCv7;h!xssvZF-b(!*P1c5>9Tr znb5y1VKxZT@raXunS_L2>>$A~!t+I)9Jb`_IES~>6)A#lo3EMT3{9xPnMB9Ty7Al6 z5WM-R7lT8IZp`B#9{{92{CZFs^pfBuLcW2P9-`&Fw&WIP^|xe5=tC3(IaNVDd!rhL zoA%z!UNCq>^10e;J93I17}5FQZRZ<_?#T_+t=?QNk-4ZEI*!IMIU2@fGm2L4ge*J1 zIRN*U4u+TC15vK!1)n6Wm7i4-t^(;j&gP0Du)-rjU2L#5)h@)2rM=enP$Jqu znQ?Cfk6jt9IFxY;GR&s^)^_f*PkWSm&=|}I3b36M{Ax%Eop&BuLI>6dm)H?pJfy_; zKhj2Aq+|Yu(9c#m0qQ6xLJil4nE3e78l&Ck;T=~r?4O;iTf+u^9>j7z06_SRPBtW& zZ(TLNCHNMiJ~M>+P@R3k^=f+8NBqpy4USuaRR8yQ_BZTzu1QF_UHICW?F-`(G@SGy{w?fMG~dg6KWeas`(9!zh<-i0lI3xzQ)^- zLM?w88A@6mil6ewOM5$X9)=U=({LX&k=s#E=JqR3={DMtaZf&`-<=&n4~~oD4d8>8 z(Ahb*#U9UMej7YRCHXHdl(V+s9NS{JapvE}yVoR{#M z^KRRtGF@Pm z!pi_raIkvJ3dcUq-sW=BKJP``;1~71cQ&aP_NJ>3Hv2 zGkv|Q2I$G$RwgpiwI&>vU~}#DSxJAf9qGmGu**j6cr<5<*Dho9TrbnRZwY@5UCkZO zet6n%G#laC2A_D&9hLK57Jbb<2>&tdkM}1(tYl&ccd=&^1*K_Q*XrM1r@Dz5>jAoQ z_R&8E;fYaqD)6Vsl_LIJ&mR-jTfs?<4$co6$r!&UNLkC|6v$wrv>j3mUvH z0$~sJ1H>+9;1Oj*dezv1?zc8SlH3-zvK1X(wbn211W-#`2>a$Ydnx1wF zmq4l9s>H#>np2CT9;WjcZ#JYW7BAopYt~9dc7kIR{)ya>^jk)XeJoOBH_Nijj`a}u zuET#vevBSmYJ&Kd-2M9b7AemdZ$JF<_>LRnCVHUwyXYEhjBsj+eFANeU{ArLCfYHm z)sGhaQyrY0>!%4R*5(`C6l{0s4C(oEPO;nnX2K*=2qLE+i=6n zD1aKC#N0b>VDySj-XaX0N(>0oGiJCpsDDs$rtxMmN{t(QiVmf%SBvUBIp4gt%<23V z)K9xp1-!5DZme1*zQ?9tx?)Z}*em^sfqqK1FS}ocZ&>8W_P(S_!{P-1b4Cm z3@EbNe8##NymW)odqkmba6ENtWZbx1wK`d~+vz-vdPVGPHr=)i7;_DLSP8Fy5S)Vi z7YF00)484XGCYIt@&Iu)DdTLUXF=J_z52tqp<_Ak(t)w`PoND_z@Q>n->|yC9?J2w zX*=stNT1B!4ReuP9X?C*)?Q@#x8@`Lo2LHh`bq;+5jMumk#!&G(8HGubf_P#Z0t)q zR6@A$&xUI{oo&>JuA20=CY)qXcqTuEUZ6GG`q99HCD@yjAoSE#!Qlp!oZ>7Di<*Z< z&ftrqu*cOXNHr4gkIXI5IcKg|?rO1u57S!p4Gh|6%_iW1H@A@x?Kpz8dcRT8;Jz#R z`kKzEt2J9hhmhHAyRfdd)j#_6Rvn3W81In8j+C6hp4LY?Zt0zu>6FLGGy2@ZXIUef zxSrlw^Z_be%Kr~_S{nun_EndQN1HRT6s=QHiIkYfUW-OS@|h;tuQcACpHBKyVT|CN z{N!D!9by~7?|-a?jd8X+oqwfK(@*g`+=9on7Qcmi(nalT+IFZi{?z9grI%THF-`>) z8cwmemfvi60{!aVb1nXg`^igBO-#Ce{CTht|FVrf&rTOzWs7_26rJ1375I6aL`&6?0JAxwtQuTI~5Q_<58;iwJ7vpEsFx-5Y{nq`XC6BnfwO6@H1U*}5j8v0 zG<)_yv$INgz{R07&(@Iwv<=u(gzo`t7XM(kB3Bmvjd#sce=ig$4Er(tm>zsx^>TS% zLqFU`;i1RWA87DeOpDb@d0V`LIc3yNjZyChIadG@Anu z0|F85dLL5c208F;pz4gNbYk-&?g64&Tv^472Z?j8pD-M z%^du3@AGxog@flyZsIPNu1p<_rSzblNrX5`APU@V1L*pWMtTkonZry;G%;A;AnfH{ zmWU&LnKMl#Bv-J^2wOqaq|Cmr1*ePdB4o9eA{a#kd5|;+zlxg$7qKHjT;CPG!?bd^ z;jf@m!asMUaXLBEdd3kyiBV5wI|i|FOVIS)!GpY-DN6e}_|%I?gu(k)zc+w^Z{pEm z__Q3L51wy#7~Y~)i>*_sNI;Oy#3INSNnu*sL)km5{=!ezGvq|pG!*}|_Y)z5nM2Of zHHOXPG^|XUYH*uBb*LHfo7q1Nzoo_4)I&RFLE$--@?~cC?V~GLI9XjTWztKuu!V}1 zT1?g>kp3XSm)%Iw!?B1T>b5usP>TjIHJXiMt|*ed@iw z@bq1F^o_TT^e(Op=K^lAG$S!-TxNT*1BBy z${r2WMwbo4=Q%_9nNzu_mGm=vUae#%v2Nu4dF-Mfik!_ck!;=UPF6q)!yWKK9u;S9 z5JF0jKoH?XNuf@Y&^wwQPZx)q9z)%2+T;{pG13T?2o}?|mnXEG;a3tDXf3riYjJIt zGVHSBP%&ITXK|lkW$t!=R($6JW^eNJ1ck+k8&|!7k#EcVSF{Zl9C1lsU(1dMDzlZ# zW7$sL;@S9e;^!R2POrL$OCRE7ej@YuwnQ!3|^HGgPiLhFs%x-k_#W!P$j+Fh+v5w5qu+ zUdkkcdHw-nUNC41I-NxSgE&sHdhwB^jApj zVLA~bB|YTi6;5AEqVgc0!4vdwHSya?C2ywJ)zUj{6b&jD3Jbe*e*=DJ`HAz76~HG z5iCTzZTv6}@Ah1^&O}KTW%}`d=*15MLghNEzbV_8Yw;YE7n>V7;OPHFzMO5j?>TgnRo8zw6O^iUQrkRUtP%)iMuYT~qN;yN&hduvEg zFe>8deampkw7j@BDqD)kYp<68JIMQlOu880H*qXkDBU$KXCl!ACs@pwu^6G}cQ;cJRBnID?-DmaE55veP;Qj?yjxTG}e zZ`^@%$FEtwKmijnK${b7JA%%c(Hhw8dMSb!K40R&(aD%W;zY{ZWk?DHF{qOA-V~y6 z=h5P?f=(E%L+xjk>~B!II90?z5Z#vXOMgyLA=EUN?S?jmYR&%d44;83o0B1~+h)0# zTO7l2k(bJQ4~*)Sj|E36nx1fqIz)!QWV*uEoouRS-kWAu=AH#_*QoxCWwFH~eW9OL?<#;1LAs(T+Iw$c0qgVGJA2knruJ>o;m(1;sg zHVD3RpOJ&?U_>r(1k#;Ojgx~st&CHxnqj%c>+LBas#-=Ow#$roN>F#FeB*gbd*r;k zZYdvwKYUYWC) zmqAz>hA3720KDiMMv+q=!WW@J@wXOd(Kn?NJOsMH*l?+t^=A#kF_DU`V$77Z=%A5D zOnDl^dltEC4iQV=78Ae-UlIIzhM_=Fty7p!g%DzmH?2BcKmn~HE%S~|D%jN)6-k;& zKHMBPP?2cSIF)i{`3e_H?$g2#xw2Ve_<49XpZBu=g(a0B80;~bI2dNv7<2iM_!rat ziy9~X&l1M%axnv^VCSCd`bKi)2o?9i8OhQ0My~d3CV4GAW^%99E*Zpjp-g=<>j>L$ zA@)OqC#*57?e|Y-=L|>2H*kBbz;KYMFzQj-SKL5*hLt@=msqOk`Ba(le*opM-GPc0 zoOriDo$%Pc>Kq1r5FXt>V>X*P7=nT>7-6dyWGYM;Hz~f=-YSb~B9eH}x5DC1oK0fp z22ybf2@piWdyRy~cyQI%nHEUJ?sFc)$ArIPA>Gh2au`1|#qYFt>vhf`)lXC=v2HFb(A7u}oVFm-_FgN8#kJ~SL#-HLZ>>Rgz5^KK zcUL)ufAE6Pnfq9x>83h$(J35-7}5$2ab#i+w|FR);AH6qo&QPI_SE?E$qm-^ER#I;)nS6rgYRDze!g{7|PokYU&anA~f}iiT}mU zzPVp8H_Z}@uq1CO9%q917O;q#n&3QYP>O!xz_g||$dHnn_^q<5p2Q`13C33f`UNMD z7*3_r#1m_q)>Q&)tN%TGpPSeFsb%7H8<{IVb+cBEgwzE;wcM-8r*4k5#nQ99-%j=HDs)(fPTPVESo7t};RW@dF0$vmO1BeKt}C?Xw+y zO_uYj=5FA5zYYILt9E@9fVW7X?mPx8Q;ww9OSH9l*Mtknw8Y;Z_p_#H1$O*cWI1R7 zkzg{Y+<=V;hi3Jfd5BivBm?fxKg#6KMfnM~R_`qQ93a_|7!fC6tN$0xdcOHdn*M^( z0b7?Q3Hhwro@QN(_$Kqo36{UCW&ShX3*Ixqdska-41i@7Px?9FpQ@Qu9Etbtn3Z7# z&2n7apSD!gx|FW2#;3qXzFVId3kib{a2OFJHy{-zlUoL+!il_qH%pw(DSV4&@YsPF z{040e%pfh+Lyv^wX;6G2A2WVQh^t)hw~tixM^>yT;DfONzOCRc2ijl{r9*VxrQj}X z>W)zml=WV>3GSjpbmA4PFKJmVs{lyU^}EdLJ>p3WuT))VOIk)&VF0B4WLUs1_;b=Nir?FqQMJNK;HWOy7$C8$nw{9)?-6q-P$ZI`zu z;&0)}2r+)^%@{l<8P1Vg4q^^xy|Ly__=eg4Z5ng$RYUlO68iZ@(-<~?zp9SdSvgcg z^QSFIa%~ldP7-JW6ECUs#yf>M%EYqSN?2F_9@a*WQ{ER--bIx`>TI)q$kV_n zG?-D`V7WIy!R$BeV)(ph5v%PeXHgCH@rHjovQDSqB;SUz{z~w)c-AzTTh1z>3huuM z%8 z?K-|0-2MgiK-J-0R4(3F_ykSSk8q6vxMja>j3Io89Js`>mck2qtZQ6YAkhSfG%G-1AWG->=p`80>iVWr4KPKfPoO=$5;ZFbzA-_gxlswI7O}k&` zD`!brK%N~~mrf?pAgGa4u-6%ow}Pen%ZX!r)Srik_Gc8OhW4kNlv00kOH5@5Yw_T< zGwD)=sdUbA8}Rxmk~mOIKk&s1b^)NL_{S~IS%x<9eayMQ!dpR+Fa;^Vh|Ikr(K6YS zTBd=8pW##fy**CnH&wwHeu3jlf`{-qgN5|_(iVaMa*g$j;dHbrhmVm> z_KU#~I7^*j-jn{v=wUwuwhx8C$EkQI1j}BDO~B7M@#nNX-PcRy@&oPgAOw3F2+El@(c=Qmr}57X{Y%d8IWfr5xb{L z_HN)hym4LJ)FlO>MbdqPi)L*22Ubk0*UzhEe_9o|x_FO#BB2$hp}lO^YPJf7^Exm2 z7h&@@jdbDI^#k}O^=T*bn zH#*Xd=w#Y&agFNKMM~OlpK45Ae>Oj6Pp5NSO{pLG*)u5ib6#=MLG}MUyQw^mPWqR# ztGXk*uW6}cUSrwp8X-7=ji+Oz@BB6;`pxHK*YVnDFaUVX=1MWfX1Wpe8~CMt7bRv2 zKJ!Z?nCa^*00VGuH_%1|y_L(+7;=_v#v8gY%(lXLIY_#oP*+Rcc<(2P6?}JH89#Wu zPc8V@*Yhg_9CSE@oS!r~uUW>&uArQVqNE)$kVd&Uzj(;kuq&vrIgV7?E+&@cABU~h z4J@ipI;U<8K8_2v*^g>=I>(|X$Wq00;{o6flRn|nvepG>#kID{N?YNlNE_GHakuFY z0N$@$Wra__vmN-I=>Vl)rxqStc^HT}E2b!lK{FLVS}2;!HN#!OJ`Ch25|J5Ns4VtI z=Nl9g(C40%X?x|AV)M<$^{;*EJAK6FeuY99iim7dF#DjvbkcDo(C^t4!l`F}x&&4h zp3(~uJZ8t}+;qOt{45^)S4K*^a$j@UNYnH?q)}$UuPGx@iQR)$TPlM0PK)?~Y0p)O zLh6A2&MGYGbnm9RE5$^QItw=MO96-s3vfI5lqIn&wux&c z*yU<*e%UQ)1;8Wg-Wlgp{yyPREWtjXdhcTPvf@;BEX4Mw${gY%05^947JftB<2I`H zWYycNb{)QRJ?&SmZYi+se>~p`m?}QUQzn$@`PVAF_0iD{+1Au;!EFicC7?ZUye5I4 zjT)4|#F>!}9+l3uYmBC`FtWxCJ9AYPv^i>l8(ZJES(_Rz*~-FEW(9>N>=4SGOw!VU z*2eG&Se3y9WO_UKI$y~xhLBkJUlhfeg+0t|nl)n&YvUvk<9Ak!8cr0P;js>4o#j5u zr!!seU884Wk!s=;_B3eLS)t7s^6X!h4WcQ5dkLlFO4}DSv<+bV31}b~V;9h^&Np&L zB>kHVx@x7v&TThv^9s$=L`LK|MS^92?01F<8oiyWcTqaRDBkpH+yLzBR82B}EQ+p^ z#<1b~=L)`4$+kZFCf-=vaplyqAJlqJQlW5Oq>6FprL+3_*exsU0wE{~lhgSjhN<2O z4Gn^i7vZu)KQ-wWMNF(et~X}A)A=KEV!qWJ!s2n4pEPwj@kg>BW1jC7^)Y2ft9wbt zq;d2%7UKKbBh_;cOXly2YgwXHQrPG zy3O)WKhQ1SZ2-s)woGJ)ypD|K-Om95WJdDQ^Ll#T`3FE_oa}&&tr`Fnw2wrLB5xGW zQaZ

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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 diff --git a/lgsm/lib/ubuntu12.04/amd64/libm.so.6 b/lgsm/lib/ubuntu12.04/amd64/libm.so.6 deleted file mode 100644 index 3ec2d34207edf68a826a81c41b6ebbff023505c8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 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 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

Udv 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Đ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�je2pY}^*&wivf1xLN+I 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 diff --git a/lgsm/lib/ubuntu12.04/i386/libc.so.6 b/lgsm/lib/ubuntu12.04/i386/libc.so.6 deleted file mode 100644 index 916329be756e318766e3a334bcea3dd59a24a7d4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1730024 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

;NLPT1x%$1URa`B-Ve+Q z0^)}8RBfaSNOj7)?hPL?s>wx0bc-#rT+9XGUp_(4CY7;z4u`>d#rDlLl;|BN{g5Gj z_%WfE;ARylS;pd>EILkkktwWj7Z@?M zWg+D1Sl>_?e;)}u7)i)oA?v>5Q z@Mg#(mYo*xHeb+PW=$lPi0xJEQQ6!fM{Gi#q!8_PJc+`np{9qF%mIee;YXk5lJDyq zEsneGkf)~0#GvGCH3?9GuyS?$z*=Q&v`|DgGm+6v)ij*8VPH5KLHIZ(7aJ15!QSVW z64n6+3dJs!W0N0JbEzS;$=E2VXgSQd@$x7;p34o&88T9lZ#Qr0ARq`ei?|pqL-ulp zc;}D2ID^4P23?1EP46|Ek+VDX(aZ9Oa6AydYBIQ(!fHrZ{W+viI}1gP!AX ziHcQXP_(g19BgbPXcgP0F&3_PoInyO#gyV<3z2!v?}Hhnk0|L*YN)@iQ@WjPjj+sB zQoy^4gfQ>aX8R4!Oel_yIorT=QV2)du4(gKK-gk-jzog(8l-N-$w)3wG(xT_i`}Bc zB+AgaIsxSvX%NPeut^=cokWfH;%*J z!e`=Q^O>9AQ6ypmpa962Qp3xrFToFq{zof6WKtU2|+a9Xjz{(HsTWx5)=c zY?mQs+Y#AVvLGdako0Dyc&SX@67DRJEcS5WZWqA_qG5y1k}#!2=YV%VNQ4&^8I!>h zk^EpG!4%fa-VtU^l6qP16EEbYAogtsx-wQH8Fphsh4s}5%kE)l<&bFXK#0i!-N`Df zU|CP)A+%P?5>p0-DFq`@dF@@e(J*250ZRfV9MmYe{3evqpfjd?4ynf}9%7CHN|+ky zM@Ho>CpPhnc1eNx99G|>e@OC3elbZErhrZHI{7>?BdqaM&YEq4WR>Scf^dDCx&&G< z_~nEW5@CVVMv?Pf=-(TWS$xIE2%D)HJ02Y zdM3AFlPJXk%Oq=x=s4Yy>By9FTsZ%srLLeqoF>~0M+m1}wM=LkG9)V^PD=FB6clq@ zW~Wouxj}1Q5oPYd2WDt9GnumS+%kYg&uhG6A7P&$aZ9S!E|do>`9t;-U7aVEgO%Ag ziBTF3e;Zv^S8WiEX9YewVlHj0bp&EafkvnhL(fTN>42B(XCure;@_L6Va6E>M(af- z&LWBxEwf<($`QOgRdP0h29r)PL79UsZMH$use^E!0LhF2Z5q^M)GGTLAI>1ID+@T- zS#eWtsGpUQGlciaT*0ueoNkH`ITx0sk1;~fBS0(VV17@_a*#teHHX)VCJPG62J_hu zN`=92sH_*Ou};^3LkG+dXV%)TyWG<}rngNTw_QU=?8lI=$x{7!)!b#4*PD|O$F>4c z5JF~g5G0U4z=w1qckoxtA&6t6KxOZm<}>5Uok-YJRRvcDhgcehfJKBnG`Zm>39ky(o zx42HF7My)%n!%miVK#(Hy&^hf&kUqkkXS^G7RHPGTN8vt;T8wo78#k>zH|=rL`= zH8?P}{3?dHtXbzY4w}t%MbRWWe&P@c(6+JNZG5*0JQS10hTd2c)=i$e3Nx!G9x|_1s|Bn zzr2OT#9m~*>8eDMnklX3@1uBb-8|EbC^74?CsYqjtyH9;7X9<__r_ z8!(@{qQ)lMVk6Vi1!UAqRBoo$tX=TFJ4cRl(d`%;S4!5jB?WF267c~*2fHJ9X17aCXb?l7X5QE))V($VE7nRYQoVy`u1pZYrlj=@kOsL*^I1_|PkJ|V>WyDpF*oVr2)3n0(jRqY<*#S)WB#@uq7{W7Yl%{E@ax zN+<9%26*NZERT%)!+WkasN79sCCR1HVXl^u0d5C*ymZPbXHzg;M42Te7bCHx#A(9y zHr>ex);T<*!?Z13r>ID-_Nt5%LfX%%9UK9$8mhx_J0^DOQohE( z0*RoE-H>CZ-2fNB<4hMzo5sB@iD>e4kc3Nr?j`BOg~{RGiNpj2csnC*ai7Oq#EC8K ztfmn}mF)9zVl$G)@m&uuW#jgN+MHRfJP}YW#!s6MK0432N?ybyX79o@&{9g_8VbOU z%jUz>;BQVZBuh&3Y^)9>aT(--_P9%tQ0fL`O*ylQ1Rr1k0j6H#+e}GjsLc}0U(tv> zRPuwGwdw+j91!rlsS;si=2E#<>UW6%m|kchCiMhr&4Mr9#?kEBWZL-Kb?&|c@z+ff zVmc^A`UhU8_#hJpmFeXiD@!Qu8>Y(G7XK!PUgU`L<|eS}P-P5&ot%RSB%~D3CfH)}={UPsSYW}jdxP5+ z@O*^a=!a+tezPc;6{cU!LrVszONO?Cdyc?xMOP`stlF1KHSdz0L(lP)MdGxS{U9x- zv;{{KF;h6PjA}G?0!-S4TL_lQ46fbr!VV+e3+=+h$OP$DB}JHBj%0%XmA>62YSm&{ zV+x!UiEnP9W6{{zVx&}`kfw%i;>3$BhQ^lAWgaj1I8Q1@1!5%10|Lbfj$xUZimgoMJ%Dn@{6qI3PiHBGM!naOh zL-Yw3oLy>Stk(h|l}EVv$)QfHC0o;rIF z&Y{sTXzH`eF_HqN6$9H_9)GyOCg;004dylfxUNfVp39|-0~g@7R(3$@GN&RK*i4dR zY)Qxm8#e8%aZHGi3D+6oblojHI{fCOlBhYOIml|Lff!VatO>W;UqRu+QUW$_Klx0G2 zQ@Kd`Pjys+Me{0;%gh(-E{&NIXen*yOnp>UxQ*>2l2TqN+nj5e(hV~H%}gSOXLi!K zKiFFavd@+**IZsJOBAHG%D9~^)X8@)nCo2ubb?Dgj9o8Iv49{;uaLHoUtRyl?~%UI zCf}0mK4W_)ADwtKl_2nLMWi+Am?rFCL_6m&;-ODzd!WhYgzgoJrZ)-jW>!k< zL6ov@Jz?5Q1i94(H=VzX4xRagmk>*n1qK3))`W>%m@PEc9TS5DiBnr&#z1rTH@1xM8P~9H?4F}1-I&LFj1LR;2o?(zI@C8LdqZKc zAW1-q>@Zx$T?H;hg)|id#-C;bOnv}*1jcqY<(NCALJtGg-bKzRDloj>Y!W(d?oMZoTs<^tZ&$5Mb&yb^JaK4DnLAKI+F~&^ zVRtvWs4|bc7@Ef6K+ezcffWLG5$$l6amRV5$b`|@SY?quSc=PqAt3URKHE$$9z?vH z`82Cxl*om-*$h~IjEM$&h+D46>=2)bu!-a8=NCYbLo_9GP{I~m36-!iS>?iS z93F7E$yD7!X_f4ru`#t{U>~$#iC$28lhX1hQqkdfJMI0K%>udf<K$NG>p!7vc}A+V`sgI>5Lb%Y7Hj0uBcex;-S2Jj&o=qr}aB{wO%hP`!?aS2)+)x zy%+nDBhp2K8Ha7*#29a&jPbJ)Qf;qHUgo*yNSve;^^riy4Hzm*rdxA4$!aC*1T@Ff z%Chh&w*nw#>?tGEwm#5-V;K=A0~;~Q_u!5vEG~W?15=Fsk|kCxk5>>&N-mLaIGs7` zlt4rrTq~kl5=*||HQdSa@gaWo%;Z$Ht+angA_uF)A|wX0%U}ottWNSN4DmAV{kf0< z!^Nwh-D8S~^%J7U1X|8}EhGVIV+v4Pu-o1(!9vyDzoJRAjoz6X^%Fqk)(cn%9m11B zZ(9mPkn9AaeXN@?9VchE;1 z!7VNle~pl1K2LC9i42Vm6ImTEq@H+?@miPP$xg}g2b(@c#OmB_DKd#i%i{8qmXC50hJ829|$DhTqM>;8nW2y6bZ$ zY_4#er<20S^$M9ahpc55NoO4hOg^U%+zJyX7qy^mT^W5fVdu$6?EB!<@zVtO06VBw3fd(nLBV0NrM&UN5n65<%Q|wlYvQT4%aL)gPQpPc zLp<9f*TW@y2OXaM!V{ghk$6m*du2lB9zrL5qZ4|E)r3Q_1K>>VD4cZQ*ZRnIV(ciAz6cNY0vRwd40i`q%myc6uFoJmmh zv3i1G$R~3O4T{Nju35T#5qv(x zBqH~gweIwA^<6S?khV{=%CJin`;srwR!H|K0~c zNhk7{nkhwOpv46g=;ooIKAz^1zh4)x)2x%aIG5&$)X&b8;amZ_jSEvJRtS9%Q7zng z3(Qj8L4~`P3QXz_cC=i!MCzD5x8yB3nt9|2avG7ig9wJo{TAyeB>@2>wYxx|pudEt>=m&RC&31!zd}+Sm*HF} z@s;6VZ?bdA1u_KFBzoxjpykme7LrLDDL|ADayLGsqB<}!ki(`Ng9x)<7;ZDiD$)^h zH{^~M!{Ze+atTdPmx;Qu5vgnMv85LKSBDl7n`H(&Bf@z{0MQ-3`Gbb;nL+pJ63D?? z)ooE(X#Uy^&A^zRr-EpqR87NqnLwX;&b>60mM~1{{)FQnUXn4+jQopy zQfJ~y>+_R|4l|aREbX80FB7>{Dj@9q1O*HJxsGNW(l>t5)W67txn=^&AKdNfhSUpL zWTm>e5{pwJkLO*?+tekQI19#7{Bv?6a%}}uQ}Iu(OsSJ_t8~j?!%4HdF}1P@FiOx8 z3u(*%MG~Sq)j-kY+Ta+nn~UtS^h_{`MTFpR*AToi3N$Gx2i54#wb6o$i}_SMcP!X4 z*Cn8Tvy0_g?FMh;M(Z&K<>+LJTz)(q$w4S0r-y3n<#EdLa(}8(k$26B-209#Z~!Es zfG)Eq5ScdQpn!xBt4mxK(J0zM`SA1;vzr^mhteXuIuTqJ!oye}DBE07`y^Wrv=4^H zJPIBwyj+0xl$FK$#%Bc_Jw8*_AUR2@?K9h2jXa6TkZTFv*%I82zy62y&_2tp)m0KiP- zAA@6cvg{-b!~`A$;Dzpsh^PJZo5weDh$ zFml)asn+`+nEE}LJ!!Ef)pJd%=bBW{WQ>F2(UP$aj(E3ShSn5TwV1l3ookzv z1+iAJoK~U#Vh_E3*PeK28|}Q;u6OkpMqBZJ{T?6?<`=W-c3@M@a{e}08um|q510u! zY-fcI3g43UHhg@?yc1#KItb?~=?_SM#J8vw&PLhv~lmRp@$SNLrq zbfO-Hr-t^9HP|@n-|T+pFTtO&f9iLK12?lu!jPMHIgkpLQ0H3fw*Z%`OZFwST-0!I zs6O-;ZWi*pS||JE#!Ond5dwDz$Jz(CL#{527x1W=>^D}dFCaPUY6-vcZ};D3zVo4W zT3^7M%CC-B<6AaTG-B9Z;pxmth(!jGr;UcVZbzGe^->Egn-sg5R`G;X)L+h_7*JT;V6osebxfYY;}w z5Gb1O=X1_8Nub#FyWhXQ@#Vbd-g|yN=Q+=L&W}5!pXxHuQc(lc^Qe{_)7L$dcPB{% zS6VxmVp<#7wj2%he~fX?q}J8BP-5x)bc)()q)VkqS<(ikbDSxq=4hsJi>7lCMz!=a z)P1&Z26}Zm4D*}FlbV`-Hu-L@$|Ielj-j3_i^*>jZA;%Fo%%$`9HfwzMOuR>)AR^} zG@@D$X^WU5ZShR}k2Ioslt{QEH!SP#k`_t zAmo`M8`@5-KjZOLURsk`R^HdzG$9qr7P^IJT6_7NZN-!VDDi}hq)d2{&PA74*D7rT zvXPROtPVx_F$Bkdq@|uxQo0;E1>M%^cnr1)ZJUnE=d&PgN*@P3NxC$J6ZSL{1C^eN2<(YitrLtXJ(Iy6%hO`X)Xyvq=@vQyNEn@%U) z|8z^G=U5DXYBU3R&Vb!xT%D^f?__;WYZKGc^-rfUsZ>$co3=UwQeqmDQ`2ecJN%^o zk9$#_S}tlK;iD|aM1JXbw8h!1E1v6Grk^mKiFCC!;Tc4+7n$9exFEB zmyXY*wUH8YrsnCp6Eaopggn&@9bqO*f+b7$JjU1ZRd;d4Hl?*?Zv4)a=#Nmk92u28 zi?UQqh4J~{sj3%Dj4&Bdtug3vQT-gB_{Mk>7LMi3j^;@pP_m2Cqh_jXNgZD2pg$R3 z=gCxbNZ!kVOnLuQWhHqhUBiiZyvHznN*&a5$B8_&-PEb;SZY?twD6y9GcBET9F>of zJ#(HYul7rHN!c>mA7v^G!`SIM=(a>UQQoI~)Age)wG8OP@xK0V!gER2g{h`T932MM zA)?PhUFi_&>DPoQkY*z7>4B^!%$ztlfpbHVHlQw48s}h z%1L2%OBjabAHz^5KQgIa&r2AF4B^!%&C5Iw?#_!Z0lV7={`a zo)qS=gkf0zF${GrXHt1GZqe<|u>4~f>ig-F!kj8$7?ytwLn}RVQkYp1hGF@~FdThn zO$u|Kgkf0zF${f?+(}{PNEn9YAH&d|oG~fPdfPq<$=C>#>H!UMu#;UVFu z@R-o}xX#}z^a=gKfG|gxE6fw-3xmP}VWF@{SRyPHmJ2I{mBK1vwXjxLCtNCw3S+`% z;W}Z9aD#A@aI=gD1`-S_2`-MY7S2!#@Bs?a}zf8+JC@c^b3X6m# z!ct+mutHcVtP)lWYlU^f#lj`RrNU*x<-!Kx3Sn5-C|oU!3S+`%;W}Z9aD#B8aFcMe zaEoxOaGS7I*d}Zjb_hF#y}~|Wzi>dfPq<$=C>#>H!UMu#;UVFu@R-mjk$xid3j@L& zVXiPwm@f=zCQ_X+n42ZcjIS9m}; zEIcF}6&@2BmrJ_~eL}x5Aj}cw3iE{d!l1A~SSTzKRtl?x)xug~op7;miEycKnQ*zV zLAXK~7B&i33!}oAuvxfH*dp8@+$h{6+$`K8+$!8AY!$W%+l3v%WmjnVE*CZkR|vzx zM&W8>=yP4`-J_%0pUL3eqrnr zy57ygb;1_m2H{5GCZWGn$IBDe36}_?!kBQQaFcMeuua%0>=*76y24@MsL&|W`TK+c zVXm-3SSws13=12DtA$ZvOxP@3Cu|XJ5N;H15^ff55pET36SfN5gzdr(VW+TLI4B$v zy21m(Vc{X+sPLH3xKhi=pJ2`-KC-eZu|1LE(_l6&?^8bESQSKA~S25atMTg?Yk!VNh5htQ1xWtA(|~ zI^kmB65&$eGU0MzgK&i~ENm367RH3l!gazH;RfMG;U?i`VW+TL*e@Iq4hn~a!@@&C zqg>=E3(Xog#lrXFjtr-%ohfQ1;RpMk+4KqDy$GL z6D}7v2v-Qh!bah0VN@6sHVfAYTZ9{g8-<&Mn}u71TZP+%t->~8yRbvpDeM;Z3j2ip z!U5qv;eO$ua7gG14+w{ahlHcTV?yH^>9<0k&@T)KbA-9VJYl{tC@c^b2}^{f!g67S zuu@nhtQOV^>x7GiON2{>%Y@5?4Z;<|u&`0MS{N0^gw4Wr!WQ8M;YQ&m;b!3$;a1@` zVXLrB*e>i4b_%dfPq<$=C>#>H!UMu#;UVFu(5R617W#yKVL+H8%oXMd z^MyfSfv`|mBrFk@3oC?`!YX04uvSL6D%>V)6}Ac6g&o39VYjeX*eC244hRQ@-hUB25&DGz zVU93gSShR$E)~Xv&BArU7U2frM&TymX5kj$R^c{btFTSjF6=(Mi1Hxh9A>pX-n9x`tau@o9 zeqlhEBg_@%3G;G925=-UEu-Yu<(#@RCr8iEEKs5eL}x5AS@6T3X6m#!ct+m zutHcVtP)lWYlU^f#lj`RrNU*x<-!Kx3SqNwov=l?LAX)4Nw`_KMYvVCP1q`I6SfOG zgq^}}VXv@H*e`U22ZY1IL&8zvF`-cx7GiON2{>%Y@5?4Z;<|u&`0MS{N0^gw4Wr!WQ9H;WlBbuua%5>=1SeyM?{NK4HIb zK)6r1UpOcn61u_z!eOEBTHP*wVL+H8%oXMd^MyfSfv`|mBrFk@3d@BR!b)M4uv%Cv zTrO-7t`LTWjl$K!s4ymM7OoSv2sa2f3O5Ni3%3Zj3bzScg}uT)VZU%dxKFrWI4B$v zy21m(Vc{X+sPLH3xK6i^Pv{p0gayJvVUe&zSSl=pJ2`-QIXfN)rNNH{7y zCN%z4?3U0c^a}&R9AU07Pna(Z3JZjV!Xjanuv%CvtP?I4E)gyjE)y;nHV9V;!@@@4 zYGG6u6E+LC30sA2!gk>S;jr+Ku&`Rosa#ksTq0}`t`@EnZW3-2b_n}~`-KODz8bMt z!hkSGm@CW^<_m+u0%4)BNLV5)6_yJtgq6Z7VYRSUxLCMU*dSaX3=12D8y4w$3=93& z>+5RaVqt@Dv#?LN^piULGT{ngR2UPs2saD22wR1n!fs)|a8NiT92Ock>U_PzfG}Se z6c!09gq6Zt;Zor;;R<0?7!$S#Hw(82TZNs%ZehQ0P&g!Xg$IPg!b3uDovxQpm@f

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

^a$$(aFN4?yGmz$;MyXLk+&*aWwas9xEyNm zN-srVtbKL}2xm+M2xx?G^%2(i-L-h3AB%l8XB4J;8HJWz%1v884nyQVsNW2H>H^N@ z_}?>$tpp8F|Ln3XEf4^#06_K;jia`2yt(s3>3`EYu1uv}nZ$ETjB4(q^lVC-B@XTv zs#%5Z)z%kX-7`VG5^>O0-twIr5dY5f>1-d`NBXBX@7$nCm6KY|U!)*U!wZ0vXboDrYm>ce6ll5kANW5}pz2K1p|8p-2vb*iLmpe+ zoPh^c#J~#5AG&|}aXrcx2ldPP8{0)Mi@N9}rLF;}7tDG*w~1{f!fC($ME(gq;RpB$ zelL>n{+aOKLQ*~he!lc8TqvR^K|+zOkRaB_He6n^JI$J{stfTw60CCty9^TR^VdOt zPHU7T-rk*fI?w%}={(KDxCDS=D!@Ji-b-AjGsSSqz3!c;TZa9_cWMwbe z;@u7{remqQxd`uv*gebzIJLfhILq+NzKrGXWyj}*{Jf74hDHgPcK}AY|0pcV7-9CF z(D##MB-~)WoBVTmZ#MrR3SFrPVJw9X#ptX;?|6gZ^1q=Y&q}oCXCja0w&0C6<9hx_ zA9g;ZZh+bv=#I`W-|U{{ZbDrY0!Ej_SiNZ4doi#14~-+Uo$bd@45r^T#=pX`_0^FB-KdumUw{HRWdRg+Rmg}ADiO4y} zB-)FrbAKX@%wweJOb$knuva8US;8*5dSuQ$wf9H-Z~D-D{%@zYX+<57?N8o1X?liOT-PkT;io>fBcP7(HcTyy~0{p#Ia`$!d z;dV-9AIl+Z<$nU@{-5Ok!q1Zbik5Y`s?6`js~SM@A_!3kISXv1nOXVq(}I3?0an0f zTx-knKKy;`0Ov15r@O-*5_^bBIS?=Y(5A?+ik5HF`%M33`kkMdHK=JIy>Qj_WD5{^ zFpvuXB)AWwEe|mAZr$Dso95;mK2of>2Qt^?2Xy#9<1-+0-5`3i#iMCdzQHQ?Me#v= zBhFtmjOI^w3-_g7b2CKCUp16=PT$$u&>74BusiNeq^|;kmqyP6&ww-Uz(DsK;3y_3 z`8w~pG70R(n+mj%!0aGG?lp#KEEGO9{A%#2;#Xs2CBK4O?$XiT0wWavrR%!j-C*Di z4B+(`bH5NgP5KSINm}nR`m@YC#eiJ#3_62Vknvlyk?GCc7g=y$W;Az%#y`qbK5#7M z(&OJuyuE$IN10gkFdmpHWgeck8dL5pm(Xd$tlXsMF8IVH7`_+gJ4Zy$N{`=)ri`Gs zWRrMx;ZHkru2nT~%TT7^Ok)i`-1z;9DwJT2it3#hMTMESvcNVp23&eP?-NpPxz2v)c99#Fwx()+} ztH&NDlYLb2hL&b^)9g`e#0^nFGR z#=~8CrvCVBd&O-&v4tC+Y%ns%4Y*ykue>BzyMha?jr|$i@UhmqcmQmsOqmcxR=v>o za(UAxapWin$PzwKonXkPwV%jI;4K3D zcbx_qn98S2;z~p+bg?rbb@&3MNgHN^zCCH`fT)6dP1Jky|%a#Y5V>w$*l?ls&`v zD-!vncCVQxb{!b|l5^t*aMdZe)FN7cmckSKV$z}@RAp6Nn z41T9l8_s$mn~n@6$e5G*x}E`H$^*y?F>a;PHp@Z2&c;YCnDLy=V`5hfhcu(IU!ij5 zR%C85>mis2Uzua~$Weedhst_!wN#~#5kcx-kboeIn#g)D(7CNd+rAL?b<%g__!peS zc$opcfV>Qn{#KF$z0!;RMR`_-xSQAjU0;;5oT&)$5A~P9Yb0~}r4kmr;jKA&~Ozr?5KI7uB$(&~`FaGE7^bvQk~2)}x&?xy_MtGU{c zrid7O(+eMWPdFm+#`Y0gf`O!Mz!@|>pTR~H$YuN$8GW(J3iHkvu1M=B7MkH; z{|IUbItBf|M~`@W&tB;hsQZcV?kO{gnmmN{EhXFTRA1ojWOnFtxh->|oW0W9e!5SR z6h9>}q0axpCY0uf3sg39pUdC|;NrAw{}bgyzYb7`<}X?-H@TzvtSM zv%ek^Hh~HDe{0Wx%tLBRw+Ut%Xsxg>(4L%q#d_-OybpDpA>x|$SzAo4NXr}|Rju0B zLSub&(a|yq4s0(7HExSy5TMyhjF{2qdrHoCuCblqPO$Zon!`zREs}pU0@|ijHn6?@`+Ldo=$n z@)jOt=09y_erGlsAE~Aol!WV>&<^8g?yyxPYx-H_)U~B^E=$H=Qi4}s8$fbG)wpe( zaJ?m3!;g2QspYpDsAWZzHQN7Pw2G@WE$0k(4 zVBeTZvk6pX8`rDCb%3o1cvC56Fcr)!kCyddllb$amBuArVwOVPO+DOe&b{e38DWVc zBx@kCl}o!i3t=TDZH|@816JCvOx!vruocQ}o%7Qmg*rPY6lD^zEXvh@=utu9F2TpZ zJ6siLrpg|=BT>UT#YZKH4P}}O-coNdG%Jg<&&e4IhS{+BD46k({`hZeT!arjbrTWj zjI%SrCNaWvYvwCLNEDgX8X2syivlJ7A8dJRFMD%JB@VmS$*D9Kb{JioNfc}G3%YHe zAZakc-~NnXWae!V%gii37`)a@GC7>ocln;f+Smq(n!%CSCbxct*&phDuC@yoHD)U^wB3-|=dY6-YmwXLe zF_n6qhsJG%p#5lwKa2=RGqq@|zdz*8yCXYL^ALCZ9U1ogjK2d=h3WbgnR%-)k&O2a z)o;u{=O23+V2_HAB3Jk^B8M|5It$kWJF(Uw&d=-HAJs6KIp^@5JJ)WF7^CoLjKWM& ze)V(lTlxXJE&B^&7pGcGtKz4#A&fyCzs4#Ww8>xFq&Uo?bIG4sR)0|_YIgn)HbNr^2+Zmt*)0aW5{_o(Y7_Egs@dU0-z@K07 zSayZMgcGiq+~b#d*Oe0ufBZ5H@5e&-1}dWc5k5KfZ7TM?t)@1xKEQ2*gkgUzupbn+ zjYwHTs%yQlm;VpHK@^OIfp)_g_<&2`zH9B<9OjQmwbD>}Tzz|20CNxagvs9a{B zSi=aN^od#ZYNV9du;A5?WKUavoZ49Np7$){M&r6~v@o09Y{_7W5SyGH&~G%3rc}O4 zgMNCn5rJR7W*YIG^g-#1^4-xK>N(i0S(Z5`oW3B!&C&z3ICPWnM4#{52;)DME}%!t z?$VF99Dr`SF=;u<`Pd^$%r2mP@0v7xWDkholJ(ok3gJq!zmq_B$xDuZ@?2=`;tcUk z(OT-f9fzrT*Wex;S)~@oM!+toso*R&i;fMugWKu`gc%3>!qxD#Ggg!N@w7zy74C59 zy(W&!ND`sFxAawzAx#yrPb4;wdfT#h1bpe>YxWPBME*-=MTyu_`}1WwEfrtheHl-~ z?C$pD*6WPp(ES?~%8jUFTgB<2oG%hN2$wW0ToWaPE!3;W|{{^n;;rGFuAsO04<_WU0#^z8bJxZc)zguX{Q^G|G?-Y zoU^?bLM5WGrRJzu^!h}y#cbe?y;w8YNd*T&N^rjp$hPPFw`Lnov9qQ{c!6Ztt57ZA z+J#l@mx%%4=^PgQ&u;qI`#l=BX{)|>$d|?6CEV}Qk&I3xB?7SFCN352jI!6eO!CCP znA5mkMWpRoi?sihjHs-nEG<1t>n9z(JiHt&mRS*%e5TLF%hNPjBY;h?Ls`C=I5+-B zF1NeZ+@Rs>gfk6zj`~)AB@T-lIY@c2;_la8cEs^r`U#Jt5j8qw*XhB??Am z+SINRA-gotUTBrbdWp9clSPNWd9lGLneM;1nM`F42$yRLavI~OK+{-?~T8=o$ znaC~TAyGrg6e}PCeWT0{YpRbAwm$U6YGV>mUlnGXt{<7pAX#j&HvKG< zbG#-E!v(HE;E<4;##u(EO1nTA)Spbu;KDpmFuO3bd2XA6h$PFA#k39rB#+h8cw%IQ zJL#Uqyk+Kex@WZ2g*!v(!I{x)K#o5S0~irXRMGGk(RG&C={i_1r%5Payk$8IR(Db6 zpPmnJ+wqWFrNRKY4wCmmCv&dF*V2|Yx!LTj|U!m&yrW#!Bw8OT{rJQC}EeIKbZA9*a@#5|ta};hjx(_17oH^ulyCuT}=1zzHP{;2$CKc2R`U zX+N3-1j!`Mko9S4=)Wqpm^dw%@hx3U|LU%Fl4?!JQ_toS?0ecrQ?-ef$B4I*9gN=X zb3X3G$W~ld_(kjmX;`jO-^r%9{(c$g!PF)l0Tbm#8j<>duk%Z1{ctqXi%0mFUZMd# zK_Jb=Ke2hu0FWz_Geno5P0iH+fnw^iFMHWz$fqo^5@VGOz{n_81kNxH{#A@0+}6r9 z9hD8c2gk-ZYkUTDxOgu+s>u#Z;bF4o`PI(LJx)jZm+g2uP%E-HW zR(VVIjUM)oiPtiY?9&()b<@XG@QHc@5AKgC)U<+q217why3L%pD8g5%0Qx3+%Ftmj6&96jV?47PGIzm=rZm@=eO6 z2e72!4#gZD$kCbjJ<2F1bZq{x(-4HPBrD9kg)cGaG2EynyTCXT#I?XUgI_H$YR6@S z-!j+M=oND0Qb!IH7K3i~9G{IVv00lR(3YzL zwZID_g68ld(}BXo`m$g>&+;*S|0c;I-bO`KEhGYeQu8GIZzu2*a@Oog6PU82?kC~W z*a>hoKYN(bf62{^W&>kaIcpwIPgI8U$nbsUl(2#2@xu6P4SSA@eYauHN%1;C*KAXF zTjfKD67NTF867c`F9pP#3Bs_+E+`;Z4`fW7d5s6)U9tI6cayncg?H^OA4nDPU+)jS z&_X}NLU;bGevxOc?lolachO?#-&tLDme;cF;iv&9Z#x_B0p>ZltZE{(t0u;=*L*$sP6h#x1as8VQR zDn5;hp-Vl4Dj6|=zqXe6?alkPf8Ua|dsqlCkn zKRi%PfBzoMu{nekJ6GK=qt2676LTls${c46w~SfThh@JKv^Uujo52T@9Ls0ZgR^pA z{N0-2@r#ITin2MpVfTo5L3UX3F)L@W1KAp)9ywSaP)DX4#>R1y$b5iTB}7yArcpH` zSD;O^W$yE~JUYVK$3g#@aw~e9GA?&fRG)=wC=+RbM#gJo=#M{vnKgQ`R`YJ}`U15! zL~H4RxK-HSZQLr{=ToMY_7ZP!1tvcacy36c%d?SqHWA|JbbU<3TXB;o-s;1>aTaMp z_E%8SMdkeNNi&VM{>Q|&8EpJ<>sN8o|Gfi*(U1NNMw3>!so3Q=4G zI$_Jrtz0mVG}oNrq`piy25{s|0j`WTOyPVx=?qJLE%5kHTz^shN77OgoW zR$5aUE2$YYy*V~ic{<4JJ_oj^bN{R~?F-e_>FFSx%-@3zuFzY zK6_TK-`x&5f(2ZrDn}6qnD@-Woj{bwazbIaos}~SCR31C{WSR2?@CWcVU)(BtFp!C^E>US$IgSl%2UrQ@s6$O9}|+7Bs5 zLjmzd67&9Mecr9}&2sFw_G#S1GD=$&*kZFg(2O-s>M(SP{}uk=r{I9+e#j5-`cq|J z^?Bp`y#ZI(h}oIB(W5hy-b}o+U3{I?0!v|RwyN3M-d$5q_}L(S-q3@eZN2#UjQhM( zPs?-sj0ODE)`ftdrB8P86E2=&nOQ~)#7sB|KL>bEFtstvq`d=z_8t$z{1f=2T=7*o z+6Jr|;0@abL!UC^p*_zw7thF2@I|7kFx{K=h@sZ2=dUoWR4g)%du)6~~yk#>Dm&2T3<8Dv1L%#ZNFgva#Vq3NZj zvH+y1Vn5KB8>aC=6(^f*+j#q&q+A5qUm5=5yCBAUQhoyfL`Hy=uc#yhqEzhn-}4Ud zZ{bI-u%GMIHe&{lTDyrINF_5o-R_KTnFB_bfw}C;8ErgwwG`-fSqN4x{7FYA7Ih`V zlFV0HTZN<^DgOd}U-p6FcH(-QlZxX6;DS8VkCFz5WH(UL6K7(b56tnzAQ(TE;$$sK)Q53l+c*sjet64 zHYf6kDY95aBk5623^K2o?HL)VM4B zEIyOJ>bj5U_fp0ME;8W}G{zBK`*h~~(vS0IJE9fK1NCCB^m5iPgGooi9d#4J5hoeu zduD~H9bVV*D4ejOYTT!QVy10;u<=#I0f<}+z3Zr1H23n~2~DZ|u zt!p@xu7uN^31xwUhe~J7rjE!(`SE*eE{pvMTdl@@nwpFn1n3lGEcH(Sk!Hk*-)Tah z-#Yy!-VeK{gT=UpYSho&s*(-P>VPv@*JifD5!8Xyk$AV9+mf9do>2}|2E%l6GlbAe z#fjW~Q*)f|)2oH3v3$*dZpYLFo2fcqo6+-GTFg!hr_M&!ujs%pvyF6YRE>O!R!EO%1aK3de5~0kvCFM@Z9m)#1$Q(IXLvRP({WUv2Ihz~WkNuM3cJ(1v|& zhgxmgL%%8Dt7t6#jDt-wNpMqoo8VOXVS&brfQ{Gcqy_^Nu_<$LyMDbD3Ehux7_$DWH(A zo9qI+9t&$WrjK!A16MlZGNYe9AT={;Q)1U3XW>f_KC{TE2Ho6hNG}cnODefeYQe(m zsTXLs_t6`cE0cjhqo%0q&EZxeI5dmS3x|e;n~)mVnmKP%V)vlgx(Bri;8#(?pmPFO z6VO?m8{eY)3cq8xGK>U09`7Wt3LcMUos35_>!r9+5dIEe7`niKDGG%q&x3#qbAG3) z5`OzsFQl6m`u{Cbtg!wfP~MCQiXO` zst9I0WFTysZS;zy34PKJP`n%6vhz_ZSr!PxKKns|nn`?J6IrXZB!%7u#b)`dO#P{m zrHG6jpOl5}wv5UFUD4tVeO=sD{nq+RpAHI!aT*Ly_fMCDR8R2v)Gm69-~KEVOnRVc zUc=n}p?QQA#18OBQUY?F8qxsfvthThVeYBn5l-sY@BqTsGFS#SpvT3a?#FJT4%gBPDZI$Vth)jjYd*tnUOgiOj|kGL2^& zg%I`Yd4onNcq2037d#8%jU{_J4MVLe(hNi>i|J&S=hG`&)6LdWJ#$F|@|`?rpa!Z` z2Se4ZWDms@j>$W*l>K^3O^SF3umXKltBh3zz{9v!4jS|ttOj}y7zap%*3`HI)t*~m zn;LsAeOQq1c!at&#u4niK`c!^yogA=;TJl$s%7X-qwZCiT{1BBCZqT0mw#&d2a3tT zJrBexGP9r8c?Y#xeW!Pg%YJ`)vxaJ&ERad{2@}W~hJ&a1HL=;>XKWF`%xY6x_Yko{ z5b!au{OID!H)Eddm=Kcejzj>%@XC?57kDU_Thy`+RX-i_qlrFD?C=3W5tk)G5ghZv{XOQttB>_+gu3V?>) zNaFkC$t;iFrk@qYQYUP_ETT0<2h%&$*W7o#?JtWA_{GSUcG58xExsNGrT zkmH8kQ(`0M-`=qMr@i6D<~Qt~7rzsrwG11#!z(j{meFl7Sf+$I9B9T3W$0bfjCP2c zv4n(F!`y>)_01CKX>WctqDmj0VDU32I3Q-7WyD_~9Q(33LoSPAO32qHPM!OzCD_?W zlg?E+P(maU^LtnC??9UI6XAfxR(VK z=QXJN+#b0;Mrv#>LAFbSD~$1#Nk&(zGOHRSEAH-~yYfj|1I45q`bRaz0>E$Iz5-du zSjVq@pk89!5Lzvvku~%dRFw?GyAazzJs1&1#OJTF1FwHMtAn|godeF~lj2anI+@ph z7g@#xl`fFw;xo{XrMZDkB*E4em zhS|19mw#8fdB;i<@c@%s$4J_s9mRH-tujL3V^zrceZnjm2XVx^=>+xgN3?8_e4eju zp;A`+(shr7vM;8C;qkri5kRBOKLB!L&}-P&Eh@Pg2=`Q5%_e%)ONc7ev7dD`I zqw9zd<#v6;S9Y zlKc!sZtb6c$gZHVAa3`1#O(Zf?2kU~rqVxX3Y85qh(5;)jI2@oV4?Ks3S_J!b`Vfz zm>F{NMb=+clO!NTZnGQC()+(vm~dHo=kOw^FAQaqGiKwsOwEAU zT%u}$z22FLq=Ls|oYZ;b&PG*O_>0aMm>O-p;auFrS{GRu?FrLTz4MwE{KLqOyeq%6 z@+6M+ca;iSz2oYj)I>^g@t|W%KJCA5$j#wT6lt@+kT>9HxMcFtPz6#mkpcHP;B|@1 z(c*dsT<^-p-0Fn=vK^yr&ydY{j2Opr1F2~ZHwgIm@lhoC+rjir!(2qairBlrg1N>g zlM0?Ibg5TOZax*vq!}!=m-^EP|86wmx%(v1FbYdo~dM6djPAIN9DG3qAh=XfX##`9zbi9S6Ux&p1^vfv;Y+u zMNl8|?)yhz5#g|jU2df+K0#uZyqi*NDP;0gkjcryTp8!nEe!HyB+_!Q1*2p(%_ND>U ze@QkDwHTWFXTd|&iLQy4W)h3+6ts`%KXV@Bx(Wy{WZ5nx_`K$45`PGaco+S2SEqjw zL${zyTl-IQpH|-j)y{2FCcpvQnFvV5l9?O`Et-aQ=}&I%P}%I?4W5i4mm?Bt$uIv* zOHSm4$gQ(O{`u4@W%vyzHI~Hco$kli4Drw8(fX;lkL#b#f)jXGTcMd%jr498sW|Y5 zM#;rq81ZqY-i(k>+-=N+b|)zp4qBk=;O{v{8#P>mArOlH(ESuxR*`Q4!RnpPf{pyT z9|z}EZM_eWr0JOIZmTyuGxg(|(7q~zgFA!mscbVTYnsH?w{UDd&8cA&)b!qc-=8I@ z$j+zUZJ^dw>7^uh`we>f3od~xYUhiL4Qivy9-zK+-W}vzh$X3xvg{wucomG?aQDy~|O*b@9atRS-KP zeK9M{EXt0_&r~ijvBrwE43lUxJg5hx6660QpIa35DoJP`V^lz5eIYKaAnt@+uUReu zwfhdejH%`zs$ryP;RB}7Mt<_K_m}dke`y*2&GuQ3{}nvaUB(4)G&9ET?Rv}SZLE_j zLEW*qD1bT=&nig#!XQsjPuTVsI35wYoXcm*o7>elemU)0YBoqhJkI|oi!>p&s0RU* zx;H5vahaCrsTjBQqvQ)VYW;EvqJUI#oZJYQO!{eLk&O$C-u^9owE5+?nS;PPH|8pwfmv+gl2joqWZz(B zQ*(CgSOU*8XxB`!c(NXDu#8}A)LcqDg4ATbGJmyjsHuVS`p09^KIyS3c;wFG0qzFP z<}aiXX7<9M)WBENNtxS*7(|s7Nl^rza{uSNh)?n-TuHO&W6?0?>uw0v2`V@QoRp5y zFeXLeve3`i3rJuzeFo1r*&t&X6-kC&LfKgn_AYpmPPiE#|=Mi7AN&RO;{lb<4sjs#3GB%*USDs6@3)I5+0}B$*MKG#J@_l zGToD#p<{c;h;-pXg?BBtnq+~0~63g0}OX4H{mkN*!| z)F0S+Is@-t>KjaMgN~Y6ZS+QFxuy1QHZH!a0YF2p<&PM{qvY2+;3ctu8M*Es{1H(6 zO4`{h|78Q;S#nHuFzoxk;*xmSh8ixplap z4>YE25gIzX1RC$C!avc%>CIY**XkJ4e(_(6WMiSFStJwwIR^G>b2i!xI?9hz$rfMK zRb0C+DIWV)?kJ6!-G8*P2e0F6ZO4GVF5JB8kA|CE+A!$ak2usJI>dk?nU(YVpqhfyu zTAXtp2Y3AhT?>&su4hY7YK*u!V(d%H`0oN>=Cqk#2;&>};8K~)kyc8c0%)UKQGJqJhlbZwnB4kvm_hWD+aut~K=pMi$5J@L&Ywlw;gjCw zMD;JX@5HfV$GFi@L9+zO>O&j3-6$XZYL0avZQbMk zI0zWv#gaBE7_Su4BKZr%RITwQuSZdK8&5on2>QpPGV7n=XzEi42WAZ>!ATCFX=Wvw z!7!Q|pEZhR?6ulveT`RDdKE#Sk2nWc6QUs2TFJX%V+ zS4P`ungtL$3Q|uE>PQ#e2YIQ|cjWSD z13%1goW$RGa5tEc-s(p|bHHbW=x`?2`uwk?hbA})V{-|bvD%oH+#zDtVQy^|^6`=Y zr)w@T)Z^9+ARiqvt1r)ID6IEWK+|Yx{|uy+I7i{w_Do_AwjH9?>%j23VD7O9-l*h* zw|>OjP7K9P-}W-Tf%9>iE zz3Z}Xt;-~yRr3O`+&6abHX`>svgCv+81j|l-Q4hu>w1`>Yrt?P)kO8|fBQPUNp_>E zQ@g@66}hhEHRQ8ZuM@$Mfeb(OQ#xp{7NaWpKit2K79)R3r$<-1&-!VlEQ&TL1={)F zK}}Y)SPuO~o(fAJd+#;1ed#u)aj(jW*eBD52dD3s1Wb$k2Bz`PyZlvVWo!T5P|y|C zqEYAk2-To*cNLGFJtHW(FR>{;vPvo}2&&}%^~^AH-)lnNFav5Spwg~jRBRs6dPP5$ zB5A_GiH)7vR~6r&n7IPcJGoe!n6eqRVS6vXqKV-Y$`P*VEI{`T*K}=RTFws2q$!bD zU%YPrP)7mu=4S9?tDwPA@n!bGF}%*3rOMX+^ZL(3@)eP#>z|GPTZwoV!^>i|h2IkW zO7%88St!j5f{Ldps_+`|Za_CBh}CQ2Iq-2T<%d&lxXSTcreDez+Vb+`)OD8^xLO0} zH3O%n2LlLSf-a3QwQUfHDbbloyfmtJ^UI>*P#Okd=b#BRMd2RvSS6aMaN%E9t>ZmM z*}s}VSl6D6+Ng(EGg1CAs5^(Pq4r)6cQ+-zzh8;joBO8y!_+Ce1W}E6O+TRr?F%%Z z=x5{qx0i(fMe{!s{|)*?9{xA3sG5G&{-e=-3z3}hR{|Eb(_(J&S ze-8e-ucpxZ-ixC3yL0IT2yx%Ck#}j|{p`{n(%9T=;T>w={jwWgAH4c^;63(&@H?*? zULUmkV(>H@E{W2iioKWt`teUW^M%$?c$G-Jidb5;5yr@qpo^lo6rzIIk<-N}8!_(M z$}~VIkRVXCwPSjo?+repGlx>t=uBnoyQ@6VrCapCRMFyB>TP*mjhlqeBp zP{50YPA+^yUyt zIW&ikQ#6nUNCVk|Y+Nr?)-mt}!(_y$UTclI41tAlwxG21A}{nUgudRK=S17xKQX*7 z(%!v@(O7KOjDH=1Y1O9`(w0EDVo2Ku!sn*%(x9dQdqcp3A^teS=^jK)0}k)xx?YFB z14?Uz+QJ3(n|kBdW4!t9`bq01_2=Ulo{j%K!tl3ie~~wFd-!;*q5Yh)(!Yvxrnl<~})!i44_89_vPIx{l^3Ir<< z4A%_KA@45cZCEsR_#*-V;<<%%r~YrU56mdO>N*zPH=8hT!h$+m^keG`yb^Y6<~sV@ zlYGnJyY{c5!YJVz;E_`WB4qvU$fD9X2NTDi)Z0G~$ z$iIPePl;~a_KC%R8$Vvy;J;wD!T%#tXmki>LgZb%;UqBHWrf*H4P{LeT$;d?t1W&G zD#zR)0VQ?9y{iqUYh!@Y#EY7!Z9xRMPTg}|RG&o)nAP55cBVn|?Y4S@g{{7Ey>RU{ zoI(Gd_@A>`^ly!Wzbyi{4E}cYIDj^_`hlIC-Fd7HkA3_N1!P?NOzaElhaT_=z;#O_HTWD zzl_Eh^`3p8d!VvYnTVOo{KiUskM@7H@Aj(|Yp=iN3(_;NS7@M7wKCRLKO;JvDG0W` z!}o9R7ge{-xrmMNqeR6*sHmA$zBvyT2+XBc7EWI0IoWV%LN~RiL<@T5TgaF@jx3YA zglC9QUHhN2KD)7a4=XlPYt+>okinKVm3l8ettMVVITTY-$J$z_o(aB|08Ll^w0M zXvg7BJ-bf3=y+0}NVsj+UWk(E<2EA*sl&7d-T?M{Qf)p}7PuQe3rZ6;QXhGCP z^}j-vZc_aIF_Ge^&#Aw+mgmglKCNcNpK5@-I^(k&(Zj&&G2R{74J^k=pdDhM-T1|z zHDhnx0vPOF8G;!i>3C0Vl%QPz0Bqi+q+&DPraUW*haXGs4!te6GtoLUR1eGWE85It z&Gq;|BHF$^FmB^33p_=e^%H=#5E|DDfpy;f%l3A1@7|O8!NKP(;i1}#UC$BbFI8;b z*@o^8#a3{SYx&pQcjI?eb80Yl9HvUmNOH#tH2>Uwrxq<@u}tJ+GKY>P?^>^4worb3 zjyP`}U{g4&S-qW8C!iVVN81CjN;KdY^!+h>RXOi?@K6;tZlwkp7c)PO+H+gY)_l8< z0Zht|+@8H7pr>sc*6MN~2GnKpF3Nc`+C|{^z7K)BNV<#kvoVovxBId6tzqWI2Q2AAmnS&%lodW z-dxIO_?FetZ>j_2%LinXcP*V86+7V{o+>dSRx? zWCL=k_a#%&QYz}QIF3hX`l#;WzRb47?t=(EwtHawi7o?f@m4d)6;NHivEKHF6P{ z7Z9wf;r%b9A{n}(pjHKn^v-XIey8)m^*oTE*h#J-!CAbCzr^5+os!tqFLse_%o;=@ zr#^z|j4>EWF?XVH!`uam{0SU8G|aFo51ujUv?$M7Tsgu+kl=R7D;>|QWRRTz2cXCI zLcZhn_+drIbUdbod9hyuxWqe@xR-R8z_qv!BGO>~EN~0@d#-+VG=}`2cBgA`_heqp z_dJWAiC$&k`Q>~H{6jTdJVGQVC|O4X^1VN`ikc@*H*_BDZ@pa-=P zii`U|i)Ve1*d10agCQ!CN@fTvIdT@iqg=Z=c=Q|d&<}dWPP6oV1O)b_uZID%e-LSF z2i{xY{DrO3BTLDNpK7u4%a@&fnt1A*GgQ1dlb&bcWLKJ2`bU%A)pMSr)v5&l=E43TzVsOU zc??Xn5o8EdNRPfUbglZzl4+mQS9;hFXZHzXbBkbH_<1mTV$|EdIj?(s3TClbBn<}Q z-tT@6R^1ST_8r$JZl@VY_kSLw9_>578<`$7+VQB`_v6ol(Tz=WxBXn&19JZU*p;vI zzVkBHqse8b^u2P)cD#)Y-L~WR3?gq|{`q7<-=oi>QVTlg%-F2yS*Zrf3dZCF7yR}_ zHzywj`(p?vI@YM|*L+@;0sT{bmS1VgpYnO-1OHu@w@w~4?4NDG^R7|xbsv4l7(Uxc z!6203K}HMKJY&@-F>ZDD+?mO?{^RI0UOA{y1?gy^#&yVC{e7> zM{lG$Ft1cu>^Zbdxr_&v)&A1mjD>c|)mb=+84z0aEX+{l*KWsK$wtj}6#PQoKI*gm zHHg-TQrCz>D5xO}6w%nMREI{6Q2buq_Mk&=rluCos#Cde!)L%|jlW+{Solm2|CjDn zF^e0)kYb`aneQUZe@IVIn1-7@*`*ZckjE$~3EIEH)Z#3yi+-Qn{QLkTm-&;51jIp% zW=25_geOAH$tc0{OfuR)QomSqa@%O`eM7=Bi7(ke^<5s*w>XR=9eOGAq4ZKyASegq zB*ks9dkI+#U0<*X5vr-BnhEWJum08m%8(vVM$6ov!Kg5f+%aGqXcJjMUuxh~KTkS) z_)exwX2~JoWsi*ALaX^QmDWwASrT}S;dDBpu}{S9priB9_y^2LjI7i+P47aD%%W%m zSwTzNbh{e3;tkutKaqtKYlSXr4~6I2O;GX#tL;&dt>~@d0Ut`0xG|2`)Ae*T_2oYRM%_&*x zR51bNQhSPJ!YNiT1`#GjAtLxPjwJE+fMoO)ew@^aN+;Y8^MS`Ycig@6+00MWIcFS? z*;V}vXpD6hh@YI2`T_FyqA=0Qg%CU-r$A5RcY=RCb17?=)57mV zkPaHlSHogWDR?d?=fviU4x1zSD|T2THbx<^MQV{=>*$Rr^i4ly3(-$WkbVi&iR`q! z05U>w9uia0>5WBZ{QFfk``B5bBhC&l(-U(FPGtZ5Q#|`O^T+BHHKNc-C6zr!e7H6} zSomh|l7x|_u|U=&f+3QJ*6y|EZ;(Z~`D^yQQHQjNTvRzzIJ$F(aO~R(Pq|BfJAg(Q zr!LUm5MZX4xXv8bnMhTrUueoE$agSsk=e;%GWj!UI4?Eo*v3VTO?hC*%)Q)p z6TAVirix{N$}TV`Ub4@dA1GLf1|*(|lQiK>WWQEy&b~vDT0Tyo=fqB_i_VcSuN288 zNE4%zGj#_mru2+hj9e0t^5Yc|O$wG3I+ylj31nczH$IX=rp;*%YGFlAWVtH_MnpyM zH)utyYle7&8cC}wwW#jDVOPt_foRnB_kM!fhUM8mt4>|r$hJ=jnLo$Uk%m+32M`B@ zDjz)xVB(T~eQnv!B!+a|BXS3xKB1dQYz%gor-=o<}b+o}yw> zP@H2j%v4}wM8md=rzFcBK%5L?=yqm7_xvq%G7A832I}gl3OBA-O}XpUtwr8@G-UOD zL+^Cyd&UJ(HXX@x=|gj0*v&S*?5}f15z(1Hc|d5+`w!j6wgnny5{HX?WIp?NbH1l7 zc2sWqwg1R>{woImBTSpb3A<|ReTjB8t`|J6O=JHwBP)C`hvRZ8x6l-gZ-4`mn;2Xu zf(wO%TI2Vkf;UnYP4FZ?e3`+QtN8K@@n*ntyF2Yw#eMh_%1nFyG#SIu`V)l2zwb}5 z6zT*1lPg58@!jyB`TrOG3+NaKbU zy$alQtB(8s*n9W*sH&^~eK8##Nq_`xt3bV=k6N_Uo-tnVMgWz3-=BTXOeQ2C zw*5W7-yc6-nwdFg@3q%jd+oK?UVH7enIi*+v82o%rAsM^a-7+78>@Rfr`BWI3wk*v zS^nqLzywqp@Ffq6ak;d|Ep;@3d|${1@uucnBvkr$IJi}#g5dxBL}TG5o@)eqfBd#I zqqTT6vn1kFu&X!?c}0U$CC&sYH5DWSaNP?qV%F>{`KruT-ySjNV!jUJ>*aML>gxC| zdM_Hm`C-+Nm6W!YI5TA$N9fR3dEUa|WFvBO4+oQ{=@!>6WS81%d_5>eqiT(5GwLvY zCSq-|`OgsuW)OlJ+D^As)v|A+JU7p}OHB3aO}2>0iJ``cm5(E?W zcwl?pClNBfDqQE{=_=9JOn^AsWtk0V?N>@|Pf&DW-TsqN2BhA*k^BI%PF7o4E4 zkVkbL|A|*VxD%f&CB$MnQbPIgOSftNR6-!a48=RtA$E%ZdSEqAey_}JJ#xa*DT&9 z8vRfl2@%G}Z5Q||;YP++ssxsk_!bC;ddBN~!3f9VODF~ev6mtd`q;p{sqh3nnPP6h z($_#+C~hOr7N_tvr7ce5yU`Yc(_33G?x!EU)g+8*G(4bV3pIXyE5;a2r!XlS#c&1~ zp$MGTxiuWCWu){NCPwKLdbOL(IN&^Eyuf~Y-$c#6;3^y43=>q7SLctV!n)?R$U&im ze>klEj1iP6;#?niw)Y=#(ZzGyYa%0N#pcwt*F;B1ImkDj8bX5UE#z1p&0Gd+?tr*p z2vxFFpGIdb<`Mi;uhVBY@C&A^o8e}zOTTOFz@$3~PiHp4hEwdf2l6V1WSK#NjCViM zkkFWK`~aEk*cT*oGg|LDLzKO=AYO-;9^* zw~#y(fJT2Hzsddd*Nb~7lfu77Rkggf8$2XZYP<0%+y1`^)I*D}! zYHQNK^;T0c1(JXGOk9F*INygR{9ebuLR&?o?xaL&>^*o?@>XQX9p;mvc(9Ug z^iy#{dmSIu)1N%G8|7|)a*4tC{_%T-@gCxXHve9DUo1GRS-`urH{N?0AJlCV2L4mo zRlQ|ru3BvQXxtt!?}NV;2G1u{%eVJ+S5E-^OY=9tuc%M_Uc6iQP2MwpyWf9YqUx)1 zsorD%@$T-nQs|EFYyZ)x5JfxXt?mx3F}sevAq2aQ6DZjoAlP%)@iu>{*hkD*cW+6a zE6|U%sU0rwx!;L~NncCvZjIw!0)Kx?0bOOWA#Rp?P6Smc&6$^ANtY&eva{`}D8vFR zpH;@m-QC2}BHv$Stb(6EkB;U*Fd<7Lwg@(_ykOEAeHKx_} zcP6Gzo;IDb@+0NJ=zM?|P}baQwTz9?lptU5&GXLh+_-9)CX>t^jfQvL;R!Q{;*~Mu zZ`EbLJew}lg+_2Jm#Jlo3f|}Ef&QfB^CQ?|*sMpIu4RKWgQu4C z4wlyQf7e97{`a;EVneaw)D8`7(uZFYi@@Vo!)hU4y`@>q`rKw4}~5)z-qc2 zzYue}8Vtp2PAC85g7RwyaLjc^^W2gYtynrDiNbnOxvAMO(q0EEE;72b)#aO3&BCir5<5rm4&yyg!J`ismtzYVAa zYk4E+!R`hETY2`Fow7I<>r}dF=t{oSuQ269@kCNtM-=ar4^}i>sE?b>MXHEZHov^T z-YG$vG6q4C=eg0p!c&geo4B08h?7pXBM1fh^@uk1RaED~)z>;FDQ~a55F?Q{U0;`$ zG1$SYYz3%a`bM{`9fPc?ab!)MwWl*hZ3&3Y*j3bi0AIRAP1lD|s(3Iq7J=SCKbC=2yoBSpn5;ZXzOrC2KZ>{kekMN{mRd0&utF{rf2iYn%~R7R!vtwg zKj0p%yXZ7Zbh1&hF{UxiJ-5gzv9egV^tzIyVx$rx;@X#^$?q2Bh&^-UN}m=pooD;T<+xpN>3Mz+WTdoxWM1eSnI}`2_@Cajw~LQm zqxbTBH~2G|>THFulz3mxa__3B`yCzcC3V}+w72+^l`K|aq7!0>G@$yEWuoNSIG)-}&Pocpu?S=ZbgtlQ=sM1-ARe)hVKH=4^o znf){+)|7uTZ<*G49h-uJ>G*eJ|9QW=O`Tl?S#)+TrUp(|=OxrmHpqBCy-@pjvC;0q zc3X)%k^8bBr-0l*?*3#4N-QZRdpTpmtQZ|8hqimr9;hingXl%Uz?wU^Fk z*6_{>8bD)9DWHNM)JGf2_7Qz~jv0R$U(lZ``S8L9%WKaf+`Rk*8Z0IavlQ2~+(gx} zS*O?JSl9na#cQ&;FAc98Y!c7CIyNcf{zU1zlep_X-zE=}@iW+)!krs4!zC-wKSlg+ z#EvG?s&{moSphG;*4LEdmYZ&xmf!7ji0wBjbO$a)oF$=HR_W7QTeD)9KsgatbXes{ zR}`PLsA%BlvB}!6^C@PU5XDRrq8BnnZNqBuq?Ic|=Z4r%t;qo$kTx-~pM6t3VKojx zojNtyP@WuuwrM6P%WAp-lFD*r9;{u5cNAwu$rc^z^}h53va^<#NW7oBNH;fD+^tOHntM&31v8%2 z_-oMeULe~9WIHB4)A%cT%tg6b_KvLBe)f)ijeK#-0l?j9`CD7V@iT zREyowM6w|O!EeP3`uptKO4hW&#GaaQzh)AaaGsg%@}R5lK%E}}^yU45mpsVO;XV8m zG?DWo@FOqB=^ske_!}7Vyw()Bk;RfHG2QRXu4x>#%d(obP-|;Ve$Hc5;hdg7M1Y$Z+4fX#;Zr#NkieMErQr|)?%6ZV)_xUNb2t7IV%<|p z>Pz+u<$lP7Tr>e})(T=ZO>g$+_Ldt@SV%3~@%N`I`;tzn)b zPX#n<5+6tyvrRMHmp~Jsq?6}`TsS}ofm$$3xxkR5d1taP;Z2oF zP)$KB71A3taZ#}eYvHBUcnj=z8MTDMAYD`#rwSlh>#S#}pyNkgOKzFd&x$%^lWF|D z&x;~=bpG8@|DK?`Niws)9*ZsWv+c^fFkk=+7#aMR%|DtVfy}5%rQgi zLyEFEet?~M94^dM%ShlAKsr{`ako{lC*WTK--Ok`^gZ5`b6VU< z*^Ixos;n+OD6=oi3v*-9S-Do@H~li)t!AHLjSjIkoMV$aXzCXSW#aKct#mENx~`%J!8tlh>v1gmETY5dab4dF`v z{Q?3+kb9PyXdXU{@PD6$O&R*AhcV}l%<4EMfMag6Pw}{lff{3L1qA*ygE7T-d*{AS ziJMl_Rs0pY@VY_`!sjSB6JIP3xo#1S_&9WZy^u(eu@onMztyeG?l(F&u|%P4N?%pg znw-L`)HvB4m*KG*EA4_xq}A+R(J+mvZ8fO&_o4k=8@>d^E_v*Ms782Sh_b8L9zR}U z&9F$mgSR@(-zvYSX20l9VHX%z)Lu5?3bSN%fllW#aleiwCQ`*_x06Ar}|IoT#MRW+Cca=hE#Ky7P~eF&5M z;oLrat#I_b(aMc9G3<{w893vdb_N4u;No8ifKQ&AE%PF8vBnt7N&#Iyjg45I39#}4 z=Q`OX$<^S;m^B!7JejZ+d6+z1Gua2d!j+K9Ao{X>4Ezy zd1X-Y_@HDZC7TSF{8;+rb4WnPzC9KI=Kf*sfA;eVc(ayh9{u1H4AQcYbF&1}of>r# zlla0dg|Mt?gR$qWiLHs;Cd1h36^YS@bEod`)mT+W@P!VKwpYvY3pv$~q&dyt*}0Z! zjs3EvTq5$AJW1h|e*Em{R;PM3{os8z#Z1HPPBlhhf5ezs(adEJ|7m+yVtTlI-Mqma z7USOI>)ifE`+ij3&OF&({b#i}JDUSl+zY|`Z87sc{t@d8LyA+q)~(KV4K?l6n^hbY zSiLT>r0A!g!qja3G7h&^XGfgz8=dOst)>+WkklzG*Cf7bs)84)+TNu6c>3ov%I6Xn zEGKTBX&zSUZ(#n}Z-oOBhkRgE_9idw>N1WIt5LrdKif>d`G`I#sBV+EPTUYimD42E zZ8fc=sC%;kyo=FfKkD1Dj!GDhT(@<{<;TnmiR!gd4{r7IZe<=p$z~ti`x^CpJk0%@ zJ*rm9)pspenRUQp^jFCAss+osfkkA`M}4f^>XlME^kmo6jZT}}WF*Ki+|5RgLJ?yPU6%*Jh>yQ~=JsKK__wF~-SHdo zNvmE9jyJYaU3D9EvV^+*klv+bGTz_^Soas!+-AHTmQ=4@JTA*z^rYpD-{0x3_WL=- ziN>uASodbJ#R2D#pd|FGmkKeA&4lG-XSwzYRYcKoVYRTB_3Jc3`<$~I#&Jotv&CHe z%5n|<`90{%W6y3(js&^jEC`te&HBahdm%UM7};h0;@s>DuAH4IO(2t-f8MNh5?RME z)@u5rXzfd0k|$BuZPJ(`!r^B5NuBCfovE9wMpkyga43B`QT>SbI$88GCBfyor8Xah zWD^?J$I?*K9lA%Cg-qOuTfNR*xYFK4z9%FC1>SGrT5esis-Dn*OCH6OfLf!wQo0(VachXxatU|I`!{oS^Wy>hW+Gc^{&W@IU z4rDWlNVm_6%sCGi&*x7v7(%lnbH7=-b-3I{YC@AB7cz&?4^!mbNR@^dA}y$^0t&+h1x8yD4hM@6#p6XMEU!( zALQ$O<5e2>Tu-mk zEF2hUjow}*@G=%|$6M?Nd>MbzA6;R2B3P#VN%u<0e33utpw_K$!~;b{09BojGyTYeKCF}Y24(S{K@n)mF&sS^p^)stB!)TGtTj(ESg?^rY6e$ zXZ%ceKBSh7pQ*Cj63Os0?Svt9&7S)JG_97(H1^1s@iT3tRu4Z@yTJJC1mDl}i!@yI z$F6>+2i5cpI?D{Ur1DBN@5aA0W3dL-%g6oe{-vQ~zl?wB=KKCd|I&SD`||$<{-vYw zU+v;w`tZOn?O!^R#=h9UbQxh-47UFV{Y%rw{Ac`2e_Os=|5D^D|BL>m&JF*vf2laP z5C77bd;0b--TrU+mwuexb4ic&AzSbN+y12$YowNT?_Zi}-v0~!rOAW;GybLT*8Kne zB{QS$Z#F6{XYc$=kwHC$@&6tF(izX~-oJF>zv^E)x9We@zcgs{-ujm|o%Ln>ORr)n zc{vT5M}Lfy-}sm0N-_Q=nN0ry|I%$segD$5-|Wu6bn9p{4g3D3ei{Cy$;tP$pGHfzXUwlufBijB1(5#bym~uyZ0}p@d*4&8C5I4lz&NB z_3|%?8rNrx{7a%@_x>fr&y;^jY}P{G_b=&}?D&~ai7}~PuUE=VBA{-Z=!skTbU(yfx zm+lahgnsq*FBu*fG4#czFaJ^wYofs6^_w$y!?@o5CE@4GW6y5v+rMO}k$*|DYy3;T z;9kkkl=~y)U&;Zj{7YhN%D-gl@6wR(Uz$QG`Ilz!+0(zIKF#zm85l+q0{@aw__zE^ zYN0RxQd%U8^!Y^Z;$OOV1?Z;yOM;WAz7Ii`bEz`zT-vqwjC09g{oH3M=hC-!YCX0` zf6|CO_>)fgfi(N0hkvm@DfwmmNz-sx<$5n)E#Th(I7`a@9S5*~w#A(l)qp*H6bgN7 z{C(U&9CTH@G{L~d-tSC}B5L4dDskGj))Yk(XVtO<9O=B2`0<^LGd%q)fy&s!$rqq& zD-c<}BQa}Y;}extyy)JKXDe1O1*WZP->Oio#;wV%bH)#Aug=$?t!uBYVCYuo@#Tzu zY)1Io*wu0mag`o%L%lKsne}+0YTvW%O`kc{l^uVO|H;qK=2jLFLL?7__xe>L{er_F z#Lvd&ym)t%cp`Zz61v^bPvu6`$<>wirYs1I4r~FpV7EbDz1X+BfBe$d-bUF?&q)XK zR!Rfk4JaZk@4&k+tYcQ`NMyi9yu0#LJ#hne3aoOzaAuqlK1F`kB6Zl zKePgf)ghC}mb;>P4bwM ze=dM?LsO?a&rM^0kGx~vl6exP+(WZN<+TOY4GrQ{Wt1BghcKRU+;g~ahx-HLAG?H% zOq2T;g&Nf^sT?OzneAQi4rlh~MxE_;GVC72$jW!t#R{DloGl&EfSw|ERz#V#l3^zv zjc?JQajTYp)?OI}kS;w*ooV&`G>Nn5wt^M}SNjw-ib2lPXxv=JXyiL06~)DnoCe)` z&8xG^{a5WZ24s6pfgpF>WyX`vGZB!=K1-zn0du|E=8EVezQWn6#;g$BAGMQN7O9+9 z=r?I%CE_$kQ)fFhxi}+r9snTno2!3m^97-k8KTu*ldD!!Me&4dPs8-CakmHcen~y^ zFeu+~=Pv&H9{DZ358^_0_95uGr&GiI*doagdCkF?*6@NkB7f=e*R!N5lFDtT6G>OERh=uXJ1 zUl8sZVcpbXEq!|UT869TPR|Xuwq=drVo2Cqo0t`LCra!KRM~oJTABYsA(JC@&(&Js z9!DUWy)p~XlLVU2Vtpb^8s zzAPBOvcdlfG#(W@v!XW0=x&o@@yDSTf3YKAe!kT>0lA{pg7|*C&G%CfeS`Md2gkvkf~I$QS7HB3Oc;8Mns-qQw$x=Cs}o{ol$ zvgC1mLC%%YXCmF^Y!l19DI|H(a>|^h7?UfcVh0H>oiPb)L$Rn@Mfz*0THub!2mj&g z_|0V{KZV5B4E(Q?G3<;i^iCLwngSbd4bBF>7zQS{eHQ30iAQSRlTx&T-BNSf0D>Tm z`cl<~iA5T{_Ug+`>H$B0&n$>G`FpIUAM-VNp(Yo9{;E;jOD$Zm9<3SXWETS&B0pZWL*~cR1xljo2 z^1RxU0xJLZNjH`KL?!gWEwcj&zzhNds+?@4}*nVLg+;`R>7Ll@MfYePmK3vq**^6}3;RQ&D z0Fj@GZ)TsK;4ihcl;1kF5w>oW&UB|2N&%RgFcluQ4fdqSPi|s-xZH=k)|@>G`jbXD z#ImWt-+yk6=<^wa|=lL84-YS|EwuP(l?_d`Mox0P)cu zq|z#h7*NOi?8A&=B)&@5p{`Nd$$NPS9m0Dhnzz^drrE6+_EmXHzGv*eA=8dz(nCQ;bBJiqps!@eM=dJq1%`&lE z$nywH?8?%uj4N2=t@|w=9%{G0VEh8oiFNyRV_CqzHc` zU~C)vmv`RGFQyaEKO^N0gA2wKV3O4WLao-dSF(b2PgFGV6)G;)7^AG?2*#}rz{dFB zgg;j*Kzigd6?H`ms`4a|QxE-Jzgw8NJa6R(z#Cs=zY%uY1l=H%$EzA?dsG}{W`c={ zkkDkt3Q|*?7y@-SsLk#fpz$mp(R{V71ah*LXGeWBOwg$0g>cwKhe(4m$qs=m-P`PW zH6J5nK+9mkP>_QK)uEUsgxsywMGRF%FqyiT5r7)g&Bj*V)&gpN~ZG&5t&9#XWa^M6dQqy}IfjK|6$X zZz+cS8njAmAFmPLNwD5{**rE}d6uuZ03z{IHS+`Kd-n?Y*jc{$n~r@oSy=LeGKbu5 zIE-U~AR8pl0SE~RR~P$z^@y1lgR<}5#t42zrM|6JWj|w0FM}Oj9e@oT!tdUVVgb?syDNSN@nKWJv>h{mH6Pvd@O-q&%? zCcbY{gCO8Tr#mmIaiZ+BPTYjMZ#+(X)Wl=%#b%;E1L=>%{>opHBYz*D(vpvkE_Bbq zSk02L+G;J`FnnFV>Rh7Ytw*N~lUWcc^zG7UVps4OFSYj-9nA6ZA6qT5NF?v;ENy?BdiOm!oj2x**9ZTFm@T!`8q&w-LXc?=F0`a za^OX^D+60BoSNH46rsA_$g|a09_SI?R@@E0FI1bN{{VM%0ZjG0yG5+k^icpNc>F6? zfr4sZoga2yJY=Q4azLFk`n2Q^g--yW+DP&50suODCNnOvs7l6eV9IIrA83U|w{Dk~ zjf{XRqGQ61Qlha69fpurOw@)k0gaLNSJ!yV@+ijdh|`*=)M7;;@lo#-;7E(rIn#y# z+MQP7_?C1{u`@Ntsm@ORLnb5gjs^_+{~h|DzEA4FR$a3%8q(U&=!FrC8iaa@>8~0D zK6xnx4V_lgCy?y=v_Aej!>mSy(KL)Vwr+AhC1IpLx6_#>!7f&i=betC3|RFe z-kV#|(bFKScu6O>(7WXrguRFFL{YLDBKjLj?!Y+g@m}L?fUyC`B`MK=Q^!o9E1!mPY2aeG$;rT zbDvKFkMvpe8^5Lg9o+v5&Z4U!<@?F@&Q*m~uk1qwj#jdUiS}a+w~I^*K{HdI$NXSD zI;g$U%pQT~(}}ucBkh$lDHL*QXAl!=Jvuh()aLLph-D=o*-mX9ANx7A%mia|+A9lH zxV_TY`A%(tJ2tny(yW%9+G2NXo>M#09h=`?$;N|VmbqgKoZ3ovY@t(I<&G_KYHQuG z#ZK)wcWjA!&Pb=eZ(a~U z;qKYmnHW`d?W3{moDj-Cdart)AJ3!#9G6(c)D}v`Ed49TETj`7~b8D-d zu@!D@tuwaLtsUo#t#WH8xs_AeM^6%E?W3pY!x>xaj2;KsLOErpc1zXQDB^b-@9A&Z zSH#@Pkh-Ce3xPx4`4@^aulIv9Tn4Ha+~CQFR@>Ya9vXGW?aZ2uoA|ouoKforuN!PN zPQ~HobJ@D_SjOS5 zg~GmL%&0kB%49Vj4n*t51696iydL~jP0R({wR{=1o=qsck-Sd9G0PzX!{2AJTb}2L z%e`m4L|A%|@+1erF{`R#tMOyz3Iw6JAsVWOX=`vTmnAr24OKwQ4)Lj(TV|UEZ63FmYf^+B1URGGh;GTcAJJN2uNK;nkNGBw85U8X~PSd*Fb7Y`F4 z^0rgNq)8%^cm>}{8?IV%BS%!?zQVisNy1Q&#Sv2je3%f?0$Ie@US-hh--gMzGR*0- z*;dm#ysKXrzS3%X(|psh@Qr-4Aua5z;fACqps+wJ2CCU`9CA8X@SWrFw1#{->&{;_ zYV!N)Nu?LJek6Nz)UPF8O-G{>Q(c>Q{E-Y1Ngm0oQI|F>LLSef7p))d%imFFTsri} zR?~Y-$=%gH&#d-#k5|9WeDz$9SO1gw>JeUPesJDf&Q4t@@%WJc`Lye!-&#Lw#SZ#O ztMftG`uG7NI?Gv;?61D@?Td8zyx!$cQu!$5UxbpNJjV6SD|PpQ^01P^=u9m}w|a+- z+J^TL987$#^IqcdBX$EX0=(-o-~sAz_>y8q_weZWjp$j_zX z^rXulyPNWrqQATS}SynDUGo6)U-xu zdJn_P7tPWQ=Q-=N>`5^%@%RIoGI0kbM|EsECKMYs>ZU`oFdgUdq`UC%GYik@@v0vv zQm_!LL&+JuN-WtZJ>|Y8tQ154_?!BM%RE`$qvoK@nuqsz^=M{${dhI%Z13jnAa^~o zWHr5lcdr|{Co&7a*yGjTGG9I3<5g$ot2=l#>axr5*$*3a;ZN1XydH%&XBM8*!nmdMWeOC)+b=|1k5_E4)hB{{>r7 z;T-2L;Sj%+dBXmh&+6z}$(GiehkT4v$sY&)eO6@{xY~RgiQSv;9e1u~%=0R)7l+oH3zdoHVel7S^{HoXu zzg*4`8J0N{vSmhzWjW3SjH!IXvOH%3))V}JWd+WJLbtZqaIDCgP@I@h>rA5~d|tEf zW(-DmQkgTY%4+%{Y%|=vEQuSEBoRpc7C7yybdR@Q&ZXT zC-`}GnxD1s^SgcUb2`tu`DyYa(lJW1tt6$Bw7fzVr_gQ1F8*kwu8d~K(ShAp25W=A zgtsG6m28MqBp=2fPYu~11>PyMO)^8>5nBM*T;F)nLQq$BFcr|ApV>v$&U{r>GQ$g~ zMqrZPen|j1Gh3j^_p0ssT(AE$b^7(&>2%!h++8~a{7kl6Tldz+uG46|kTK{je=8hH zk*j>Me*Lzosy}9T^&c_y7pwkNnf2{=#xX|4vzZW92^Yk#DsY|xpK8H*hWA|q`kifq zyYpm@cGk6QJHlY-=?iuqSW`nmFiI^H@lM3`;6>Bb8wZ_2B1S%4 z(YK)RBF~*7)@4H_#+|KOZ~(*xC$8<1^Jd$A^A6GJ%&(Unt>**RIcG(+Ozd;t zAY+kh-uv*&4gANp0-r@f0KYi#Lj!;Ne)GzmNh8@0Z75*mUeoY~X@*YAyTXj zbl+7QFl1~PQ z$OLx^E%eMvXI=jwbUC=xKj+x_Fimow;~UcnS}t@QB@D zRR#iXcHzL5`1oKq#E|PV+pXG1DEC=)UYrHv_Yt2Q?zlWMZ0d8)_(M36&2@d2AF9??_ zRai}P;GMM;msS~dRR>o=r)Hei<1kb7SLNj!zrUq*Jvo z1SC(>+w>JY=E@G1s652=JS2HC813?w$GXB*K}+t0Xz4SZt@SWBPJmkd8zsJ%to}{D z$o%)KQd}4DXpAQR#8aaWIf(1aTZtqAdDG;mK-e;AXXLHIyLzHz?b8o;D{I;`rF-U} zJ+i5#RJ`nT`gYlVJj`(xWm`*?CF_c4drc9gL(YVVvwiV|94FcEhLjcNfinRY)sXfY zt)oLSmz)Vh+_48b6ApC89^yGvP2?Uq@O?&ly_hOgM7!w4qETW;oNVF7K?c zS68m;lTjTnXoN987J2tf5Ix614{i*0&`g9}2{wPk5-Tv^j%JC)C3^$u#e92p(Rr)P zux zx#PvN&MgEnLFXXR>GQ2X{Q87-rJ*-nzQ&Yq56TbTrTm&yc`0P3MburccYvvK6II}o zuD~g1dV0|*cFVUPJEE!M>(1KFw_CQ$v=9PE1F&VsKEt2UMC{E49D*RD%|vAquWE{E zwlMgLv)-g#N=Y7|O$&{N0U102U<}sqLeQnmr9i_zH*7eP_ z%68-dsl6bhZS9JKhsAPWdI6xiuRdnpqi@VT#~zYE*Gz!##Bp}ThC2P*YjDZYX;Ke7 zIg&7v(v|Hs*?QRVu>67YZFNyhA000>6ZfHSrjU7bqpwk}4{+(+=#Nb&agCQjs3(W)g} zT4FNpd%%sI>cPzWZ)+jC<;r&urMye3uCS>KWzs4T42EjG@BX6i|T zyjROOmzn`x;@kjluL;c?NiOzHx}QZ%PcuK&;GJwusv_cNRkx*(Yfg3ClWIK8`PMXl z19_snktXlSHzno`$W{_2Tcvr!1bU4#1;Z~m zS48~4Tq097zfB^XkdG;xHQ-|g!3})Kr~XgOYufAI*CyvS!aPnA|}^UT;OpsNal!Ay@8 z1*z|fPi>FjAogcm^BFNFpl4FrlT52MHi@WYV`yc(HZyn?Op+!Y1A~ofMb1^mlbwp3 z_jbPpc6j!wzGyxjf7vNMwd3}b-?8G-y%Gy*jG+o?X@z()_-BZ`?(`eg2(l8d~;G8iHZ8 zZFq=qmALn+5jU=Vva?)!9Dpz$PPMy2vAjhy!kx3nIYiQkKTRu53s&tG<74Q}67+At zHVywS&oY(fuLpR?1HQbP7adPEJKH)pmbcB`lBhVNYG757t?v>gS!QuR7y5SvM9l;5ai_cyvzH#KcoG}&GFs?!!6ws&@b zgReL2>dj%hHR>+hRK9R??07fJ=`5cev1*7+5d5isRuekI2kfGSM5B#g>rVZ1c>D03 z@zw6absCayWD&Piy^#~k3e;@nBoyPXr(USu2&r9xTdGIdcK=n!!vsPNp^RqQ&^cj- zzSR^Ce&^6YKzC3a@>*i`WTZ@fgj!U4nf^@QKWqH9pkC#zI#WGV_4jW1vYLz&-$U}J zIPV1>TV^U<2$zF0%0<@~bM=pI#|VZLy0_Sv&+}^Ky`6th-~P=M-TSJSSYQl`zeF-+ zAS0Ml9GqRNn7@ewbJ{wdblQ3>M>=13Muss2J8owt$aCKFHh#m%bDlv;m@*YR#;q)$ zlwf`VraIoII)L*!0$@pV24*)cKbO{kDfym>NK4qJzUofR_O3cZoZRt-k@fML$m4*7 zST`DH*1}ia>1lEQ1nPBSwREeIHROFl~sll3gEW%6*Urvd4V5JGqY%)Mti-k^6yxoJS}6a=#s!);P$cfnIW7y~1kz zfhr*UNeO>2j??=UzCS+}`12R|{(SE#;x`&rRc^{015)=!j3iro5ctW8%b0(dIi1~W zyCUTW4CwBb`*j&|kBzLY4{gL_csOf19(LCBl>OJ7Vk7%E8DV{Wx-a==e98dT(A)!t zd1j}{7xb(de%)lPxU`#Qo=eGhh4-7&#hGD$^Yu5%d$V=p2ja|FHVjI)Hn82>b19J}K;Bf;r(znUI4(eJzrEjrPy-sHT*50ug!N#fUq=$9NfJYL^CeGOeBtQ&PiviHIfs$6^ ze9DQe>W#_6`RW^5>HLtX{j?dVGwq*s>*t}IWFr3awM^OEJN-Q2Kd+y)zS>LuTsC#@ z^>d$?X6om!1;DdP-YlxtNRjl9iN~R3=ptt^{mj^ejdiG^)HY%>5lE$iByQ+*4?{t2;4Em(rZeu=%hjLTbz0Av#; z-?hsqEmwnzVvrWLtQ~mqN&A=>ncTvzbsg(cp8Q}o@%Mr{mN!rK{&KR~pRkAa|Gf9@ ztLT?%U-9kigE481^uB5^S-sKtmdfnyU9s{sAO6euMx2*ezsayqu_IW&6=QXd#L83T z#TV=|cRb%WE1u}dNHqdOwZUwn#rR&N@4GVgy0j(ef61h0&PZ|gmcc>5Z7 zHv&)BWAT)*>eVX4ol*MW&M19=#HP?OiEgFhF)f&e{1$X86%UDR4he;NMku@nj9I>Uc`;)$@o<$)LW${V8l9)%$Mxq}bGpLa{ue^&qi{@le=us4iZ zQFynC!kBgr$s6QwA(kXo6zVv*rhyBl!5a)x=DG4MR?QZ;Vxk0OT~V!)Ns75lTv2Pl zHQ;@?4XcGn=Ka!F^-143La*hy=l7Dni|tX_zzM}q&`E;@W)mhqP|>+)ft+RB2by9d z2Ah9I1qW}jBFi9yq}= zcll+9>|f;IESH}hZS&OqufMU=J4JO@JxX1s{2ARurLNT8%Ny4H^(*&63)*Es^AjX# zZUUyJ#7L-~QDa}LS&V@{^?W(bowoTS6VFXIaN-z1R%=!2LJc@i2+6y;##eNDd=|Fte>r-F#mkbVvMp$Rt^Rpw5iF9j% zZsy8KjAu!{$>65^4pG30DPF~;_+UqlujzFiLP|q;|mIgY93^oJR9ne*K^8GeNxaTqcXs^*K#T`|W?iC$Vz=aE&dsnSqPx zG~sYd3PA7u1OHU389yDb8Y8TbPN_~>%86Q4Q$xfR;$_V-th$CQy_r zq2=xU!8z};4XQhQ{bf&koGC+}=X(#6K*~gZ7%=HS-ciHo$Clfl#)0A=W%f^yOAC?m zg}gf%`>u*V$Pft)O7G31RsVv2wZ6uq0yeR{(K9)wA2`rJ^Mwg!9q$@}Uljs;VhkJf zS=N|XVKFoKSKw-(U{f>r$q4$9oaj7^Tk+EmdwrI5# z1!f z+Jz=8kMvzjR8RN)#*RwZMLg{>Isu;&yQk1c27X<0V#$J2$!%#zam?^Kl2{^eyLu1q zYW8#j-FEddtK(+Q3p=gKAegu`+>xvCvACLG;Vf=+CDjSX7R&fiF*BaDmd*}4AJlIz ziJhR2nX&2mD2=bHzdGxr_%roa_Zt~s-B#T-({Am@b%Eqh+UDmOp<G;6JkS(AKrZ3lPJZ#GfKo~9C4C>L?_XD`N3`*u;xG0W z%Y5hjkG+eBs$bq}LxV5;%w3r6#J4%DF+Uwcp7cpaV$)#U#0n3!-`b*4CPPp&)1S}X z-c{Eg`u4?bl_W7?gN-N*#*G(Q)5(k#>+hd0cF+IVjc;=oe&)QB3ZPH*Z!l?jZylxP zFQIv=ndR&H<(-WneuRGxAP(3Tq6W!^x z#H33vpZ=X_>DI=l<3}2QZ^zNToux)|t)*kbjT{?3 zRgJcW!H4#;LW$X7udqjZqa$49ZY2vT_eJd~WyKe@r<^LgwD*X@%+mCYj+*w)pxhU= z_Z7-~QF}yr?Al&c&-Svd#y9Cix6yEzeh%(L4IbDlHHAbI_Km*pEaDYDB@4`IypLMM z7LxQw)dy@{T_2m!F^~9U#6_Z^1%upHcOB`Aj4p>uiww^{JI$OWUzgOGYsRlTpxws- za3P?@k3$-DzqiLFxz6ZF{7{o<0p%PxRuEkKSdQGj%mL;A+lJK|58D00+xPMEPg9I_ zMrSt%McOM-gXs$Gl?p=(B`Z(|-m%0320h_q1z&tHG@p7gI@)oMkta6S)`2-6zh}L` z$BEjzHLZ4RfS%NThzRI7mT_SfM?-kShV)7#c z5LL^di52oq1LoPb(9E{Va0&WuWLqW5mI9#KYeGZ~Otw!Q4LKQQe597s}Uy{lb#&Z>_)Eg?5nZj0Mi79C{7V(*)F#e*obO6xL zRfPwF3coWIO#fMpzc96&9RYlop8@>(p!j@K+-jUDow&w32JS$z+X`BJp&8^*jfbQNdrMFAz>f|j* zd~+Yq*E245d48hGU)H<4d9Hizn>C02ypkz4Q$EKPjvz$JS=%wRnK>c$wfY@{V&AOa zK|kxf*Ww%_m+VC{gGeq9V)lr?*o{#jmj_8MRVMzb^K3G%af-c=mfjRS9gnDAdp;L_ z9k=SaOn_}??lpeOA{^ky_J4ri!F}U*u<%nE@O#c2i24`s^YNZZrehOD67b*rz6$M@ z`MZ=UAoKTn{r2m$lZ`H~ zARlwe99sC-9Wr~4EZ-6vP(Qz`xHq$g z&YQBD6m!P}`eX>ap1PHeU;$FVGD9jOg=ergShnj5!k=e0bhL_3yDmGr*N1ESUTOTX zC%-c3v-8BYNKg8%=%(+xK7AJj^v!h3`lc_)a0h**Pa`b_&a-_}cFL}lA>XANI-c1x zUC;DQ*TX(tig(ueJL8Vc^&UJ}B$Yl+mtl~DOg4+mp`deIZ$=;CQi)PF0ng3BcY2Hq zRinul&<=gK`%F)MX86-)G7NhAJ*1CJ?t=9R5UhsXje|kTsP|E z(4GC9uSc9g7-QzV0u~C35F(BFr?_?W5yn*|7dcRHwCZI!IUl9{dsCe?Y^qsHOT4B7 z#fJW%Ngn4X*Hixd(yop(Q}%XOICdT@m&M~lTFmYkO0G*<&?@F~tzs^*nS;K?dV_^+ zVl-=8AH-Me9Y@7iIjwdlmQv=M_*<+weVf#bXXiuauhuX2$3xgN^TS6y zc@!-rCWYf~bZmA$U?Ii)w%A?AlG|TTJ((j6J`o06giuGvoz2dNlv}(+h0+aaTut_V znJYREU*`KW?QxWVDF;hoKlgE`e>;P50vNm!cI_i30}6RhejjWx)GqDhY=dK}8n?o_ zhC!iv&|01MU^tylZN)KQZSu2v$C@VZeN;^ryGzt$;^E8HFe|*L=`q#^=xNOz7g0xZ ze&d1u`ruZ6>v?KP`RWN~PN{Y6bqvYC-C`|u1!H@tuubNbu@QS4cCIq->7Y^L#Zt{VK)BPx)cKcNo<6paZ z<$v3hezrOIW-YBI-;>pNGX)ZlKkVCaCIYhKMBy)I*2Ch3_2l?|ZtkgDtHwh7F#Aq{ z+DQ@)F6v~Sww5Yuly;o+Nj=4+6#D45u~u_cg|a+tUS_gZH8t^~2gs~6$nQCx?Fwj^ z{q{7-`2F>di(bZq)J6rL+DCHk^>|1sFgA_aZGG3jbVst#JK%UF?QhzUFnqEa{|_Xv z)=qIVozLn~DE{cT@nd>m)jy4u<>Qo<+@GF;AL)8entE2#`8=;**ngCt8BG|B0uwDk ze_Twq-ECoeBc3&JJ84e9t_fRDGWxa^#6GsS4UD~Saxbf2z4clMnyysOnXZf<-QA5z z-AnAr zyNs9GA&mdsTO>JOonvme_f?|FA91w-`02yiZM=a-U3-ftMnk-|f#^K@V}7-pXF^HO z*YG@3Rjh&g?WSC+!~qY<;e~(aG?o9y=FYAJ(O+iRM+zm62Fce>F#|8QFT45*r5|U1 z9$Ivg6vE$sOAY&?6(}Qn8|^3T^%@KIXMAs1Ei4n}xfzRf%?qLpJK+3N^HwFs_7ndx zx$>OsLhs)7P{40+X?F~Uu{)58s8HZD+u)n4Y%CG4i@Tzl=pHhQ^bO z(eG9aja|Ysxl1nq(|p&}@OF+RmlK3=p^J%ubaMw;OUH+dX1h9E5I~zoC@B(i^p(r18l=N|dASl6QcCC?CveTkdxd4dxL>6*I-$kmqWAFqx=a z$1C!G@2mQYOntoSDardb4fiE^U+aNTyMZGrg7LxrpMiIRkB^tH=1d`jL2Cc3z`M>A z8$dDeH2&4^-(~!(=?P6|!u|Q|8>a04JgD(;9}g4uE0RSJ3x%EUlX()2yWFXAOl74h{_K6TFcay}L7Gt0iHaMo6SjO0g*&oVye z^Qq0L1$N`^g)}%R&P`;yYc= zxRJkF%&pk^VUHDS5Z@6UZ1n#hjD^IePc0~T4|2_t)4r^L@Av_%s%_jPG3M};i|$b4 zqTB2pORg}tdNby{@yAQmKl%;P9y=88hP|_2{0)x_a_~jUYvZSuhY!`8pQPu_lstk@ z(bZgvA7eg#RjX>@=8muUcBz(4=I!ib%={s@iZ_fliG+9)eRiim{F?*5dB@R|HiCkG z-id>ttmT3G+3(Bn(EdIb@xn{{Iw>lGNQcBzpn=Y)V69#3bq*9m=2H!=tHay!I*^(y z*59$SCD%_oOLF*(Wp}m=U_!GRbqMeY)BBfW64{CkG$!0bJa?Dmsm_M@O#kR^Vo5Q- zQ)v-6$IAq81?5r$^2H1M%1v>Nj_gx?aP0;tQe(0`i(?bcV7kJjA`VUb&+k z_YOcLmFYZXFFvlQkt|&uvog%(PkCX-)|1#u|1K|I{u1`z(kkTyaII^%g>qOO7QI}k z()CN$wLF=sP$2gqXa!!?jqg&#UAOFJQs?nE_qBHl!-ZPztbhB$^e zSabkfdk6=L2Dhh{hGyFg5!q2+G?arcH0X*+P=Ws>;1Y9)y`pe6 z%wz66FvMQUpZRVzJ_t;Z&E~;c9%$M@x${d!`5N(l+CVrUXg+%@Q`IAeXZ|=Sh+RcF z^+_Uf24pQrjAQ;;2Z{dtW327^1qXEviX9W^et$NC^NrLRzP4psKYDdB-z9wDo0w8~ zLHUb16&A9pJ_M#Yk;_;D%aE77ica@2AUs(!Sm{c$kqQt^V)~b%_^dy=(tO;&0EgT_ zIIYGy+OmyaVBlTL56#TKr>a-Xyy25ZeoyVMW&pGA4YcSo0rN%2V7tyYU`pCQBxCJ; zfH70J(LaM9H~MHXV9oD@9l`G_k!tv77kwmAfVQD(dnL^!&!8mpoNH^sbES<KW=JALfr)51CmbvwT zF@P|}Is@J8eSY}XE^|d&Afesz8u5O$@RP3OG_j9$7>v2#%6P0Gai5W`r!J|htK-?X zudFNhp7S2xF1h%7SI*}1yH^#Q7xMn`Catx=cV{g*N;=3ws77z!xsB+czG~&YOR!73slS?USWo?V z;@cVctD#kCq_SOXQ4L2vWtWq>SdOHSpt&*zjUQ`2QVxP{YzM4CNEbJ3^HLxUU66x(*1Y!uz=EvAX}RC1FlcY zg8EE{I4FpXOiTI6rOF4}#<3N6|I39WjjDPZpwrb>~bSp;4u_icm z7I?;7ASlI7ipQ5f|C!MfPfF^@pOvsLVPS#{q{pSYNj(tbP$LaFtSq175u?GxVt|qq zH!3{j{fzvUnn51m2TUk9I<$r34WRv zAN)2g^L`e;?XE2AMk#Mqn23r<>R6fd$R9VL7{Kq?GkK`Bl^K7|_FZGm1OJ5~)Ze`# zTJ8XvOukNc_bzV=CR=%@E}zN;C-kkkxyCq0bQFf{Jjg&%=NcX3SjL4vU2&`B-Rxy6 zff@(^*PWd2r*$B%|F+L10Ehl+F9g7}M{FcARovMs`0-P%`<}^eNoL1Sa9-#OmA;$J zUL_O^avdSu5W?V=J9dk~`ar%j_LI)*rY7Tz!iLWTY2xl7`Ej%XxLxuk;h#-0s5^g6 zy@B}o?YqS-6Jp97i67N7GmdPZ)Y$U}-ic%nJeV^~DyQyK3cBoNndPoWdW!Qhk8*tS zsfe4s2UL2t`aiu|rMDk6K#t!7kQ8(H>VwB`FLoDSU6&DA!fk)S)cH}W#IkomwQEh`aFP)kbv9_+zv9Z zmh1`EGVQVjHPZ_G_3fhRygk)Rbt(Qo6<&1$g$boh*taqpNlne61B{O_a9pI{{%(Jspc;7Z|hNS@)!rzP*-R$$r*Xw>)w0J@?$x zOuXZAJ)T?aZ0Y>R`nMC2bIRM|2Xq`0kjuHpEuA0W9XyDP{LWhIftK>Nd2gqla{q2y zR>$McJO#+Kk1=x)7KbK>Y=C-8A2Z(Y0diu11}-)Q*Yy>P!0S}}#!_m+(|jgSbD)EH zHP^EYjm`g!pJywJ^!{Sye4tCQw)a;JW=nJK!M8ekv|+R_uY(|Q+FAwwj9-g$0~Ovw zonqig0EeHG&^c2a6Pr-%Rp%RL)=}7>zQ4tKa>{_NmbW4#XY#`F51O``m7-O(g<2Pi zE$-Qo&JWl`(6Pb`-GO{7AjS%|CW;%}YAs7~r^YVje%HnviNfU=rCUgqM-8Ut9Q)m@ z&QExlpExHxd_A>`0(xY`CWo&Nd*v^%OE)HYI%TZJLj(f7k*NA!D3N`=%lXw<1$M?d z9_k=tK3=C8;n;umWCyvRVTHP#yqh|YjAT{#Yd`laML*<#W*&{_BDoQG;r;Re;^}w> zn(T-Kx5fj;Zize?cC3!447F!P%c}|tW8dOOzE;G!XY;Kfk^5slxUWi(FLX|H#wzrJ zh;8lxj2iYiL%Q3qR(opJ8%~>Q>t&{NYRZprAol{(>wQ3Gdy~nDoFdk?00k>8&@o`7}UrSg-HA%foH|0+kXi=$;D%{>n8%}LTYcFKgXTL z{b$_%t<1yD^oT=he(lI*$*&+hg(C>E6S+$5gJP4Ml77&Bz+VaNkos?B?-XEwod42hE)AiL%>|5%_f2^n zLuPTP>rvTxU`LiRlQa^X?82@oTy4HmS4;m=uP938VgO6%P0SL7cw7JkF|E)Idxs$T zi5fI>lny+*%`M>;hQ-_p+AbYbx|Kyh4t2fON6bd2v{IEb02q^;HgWfK#G}2^SLxCA zN@M+_d8McPHVV|d84)@#{eRi}_V_5P=8dO$v+zOTUWoY*f5 zn`7IP;~n@35fn`E7A=ztm$E;Wmsp2xc?$^jv5+_uBm)GIp^&4L<%Fe5akTf z(HYEfN4_JaNKKZ?p4SwbWscY!9I-9*U8Hd`%iq<@w?P1nq71XQH6+8j(W4FDW2Pg0 z9zuu0&vMggy=YXYTbm=cLCKeI*BgAsh|PNa_0N*|`#vMEns*zvc_b~Atkpm@fWxxj z*T~?9@^@pmE`&7T1ZL!3t9cV*kL{l`GF)2ZEU=#^S@Bn5rZ*!`4RvNY^pJ5rl0*f= zn?pSi!HYzG>1KFybA=bq*v+Wg3~!^PT@DQ-$KtNuq zH*x9c0h~)58cF^@Z(*-7-eVLke-q(Y;7KV^aARxl0xY2I0b4W55$#>ReL;m+>MY+t z6^6rwsAUi!eRebqy~O(1ll1G}gu8YRsxmf3?_#fnoK4Qai4fp)sDNMrhuo_G_1kb> zk%45>K%fxWA@xR&0rHCG;tPzaSe>Gn7g0X%Wn% zPzoH}<_7M-`CU|(3CzJn@DBA1%P^*8;G9umqDL_?x{RYH@yAn2LD^G>AU&olI0-9A ztPP4XdJlR#5=9ytj1e1vH`_V9-3Y&IG&X#aW{jwhox=6QcY%^#4$Qs9=pQ)IzM3(1 zKSWV$639iLst<25N7P%xu7~0*-==y z!4C2UosY%gZXqPZNDDSi8OVX($mhUP4TZH01^xIgxPR)2=m*E^YcL;ZrN8(daW>lH zWq~TDj&=qC&S}^p_DOk&k}7w(@uhqhJ1#!8l3&4B-$_l+HU9$OS!C8Q?4X=@A_bsN z(Vf7vBsgelUJ}bvVEF;D49;>PMT@>BM~wpxUvQ7yl5)tns?Ydn>=>g_%=(uZHybD|GtFs_P;Wx!tjX)i_U>DYG&{v&|JeIL5z&EJG-g6KCf&L=C)++WR zwVeSAl{8QLt4wd;VWWct3K*#rFmQOS^6gFK@3OozzF?ycD9MmP1=jQpuO4i{EbFAX zhhKyBJ?(d9`O9jxekO9dB16K{;}^nnXV$E<^qpAkz>2;K7l5(g5x%>Cy?x?C%`GaI z0nXfU;t6D32EKZH#Uc;oBKAY&VU2J6bH>Yf{_1CTkT=D*iNBK8NC2aC0h%Niye=|L z8zOElkywRAT-k}NH`7BGo0SuA1jP@`zNmxoK zX0V_Lc0&QBf1P*&h=z;rq+cU`Y^gzr3V!Xho8H!I+Qix0N>Cx{X>}yx3KRYI(FRQ3a z(!h2iUA>66h~;CT@Wmq~LAHn=N= zAsFqBDy3hm^_5oZF9rmJQ}NE;{|GEeeGgXT3hiYuL4nY43K$J-T>to*FXGD$DxMhi zwJqP1EOyF&r-Sma8417LI?-ITGvd{`p48#{U-3QiKYT)|`Sh2J0>B0d7gks~jrNeM zSo@GJyR7E{WIYa0Gq5Hcwe?T6N@gDl?ZX-@zk^o@{lSU%$rhl$1yCj&M7rDZb>>Aa0IlfsXZ%B}I_PDD4*QrTW4H8N1f~%6}g^se1 z`-t*&+X9LL*B$+Al|wDLqz z5a$USMP|t<9JyysDo3=sw*<#Xv$g0xs5eXRjn!(cY!$>+B^m>AaRL0$cv2S$Lrx)#b(NR5YSF6AbR;aTjS z4*4D0>S&oeCxPFx=El?Oz4o&okmG~q!EO{=Gt4#7EbN0jAN+B=>GPd^a5>_xZsmA$ z{He=`JL{eS}IfKL>JF7x3eU08+!k`!RR`Js`c#2?n3-1U4at&iMog za=uO#B*F?P>|LP``2~(1SAeN|Fly7MX#b@a`B?V5!!O&~-_UH&OU=f?NWHay5iQ#A zb;kaN1DOp6`|mqoIGH2>$WAu*};GSxND&rF^V%7oP= zK)2NX{`=(mnmTYj%yA$Wo7W+5Vwu2oV@ULf9}yTt9s`!G^${=hIWqrqnI{A{X!E&= zH~6+PO3T#27wvO#Pjw9r!6BQ8#`X_JY-~s!+-AFDOYta2M2OnCOpU0Uj)#{Q*WG#y zD0jgZ#K+|>{P@ii@-`41T+>M&AR_85GDVn3Yn^w81VSgH?88jGjoDw;>4#duK=5qsyPNFUZ zq3x)#z@IZW<<4~f|Clso{Tm$k|ihv@lWTOY4;6BPjDJ|WkV2W9k&u}P!vh)C+0g;TGK@5Sq??VnyXZ*h8JvQ~0TV(u> zYm_UV1Ca9PP5lXWZ6)P;%zPA2;jDF3GN zH&FuGm2m>M01D`P_Kpznl+!pD>MnN^h`&YTh3f*Yrf zz50)YW3J#H1hc3(cARP_80W#4LP2e1T60+iwjb;^Heo|Fmc3@UEli3aN{QOgMW@DV z3g6=(hPiy(zyNqgBK5ORrh`OZ3J#j(&l|!@Jc(Nb3(YVlPXkrU#2I5?gLHVCeOd1$ zdvsDfYa3JGDMlEx;CosV>u;?X&!%pa#WCzFD%4h%cGK+wZ2Qt{-o)^~4lWB5XI>!5 zI#ef5BEaB}u4|`ZOo05Y>;Q8~kqiyZfeU_|B)XP9s5Pqgvg6`NhOX`i!CYtF0t^uv zjU8W=0Py)k+HY2Azpl?kI+NG+gYF|>%5&p^>GP7#2J}M+RTM4ShyHH+?sqA@C)HAV zODz3jas={q-<6W|Rtyjb&f3sa?8`$Bw68rx-8;H=dS6fYQ)|*Ugn5dSVBx#gq<$Dk z>9tOZ7Z^78hA$){=6UqWe2jEUYm40gr=thD>^lTz_%Xu21off}4xUttRrYVdYV<*W zEV|I%`wnnzxM2#-_)n}j} zN8I0oC+u4T@yph|BkcgD?x9T3nT|b|uF(0oni1TCGn`JuM)iRqZ>&oEeluDIhKK4q z+`+fQpIa9qtx;OAK`VO+K2v>-kG>UUNAVkc+Z!9>W!}`qNVlDXw4x>+iOc2ENO^&Lg?6>|wddAFVBhDlMP=cK(i=DG6*w{1Awz*eH{JJ=*AG`4-G&RaaAB2^-px_6%|zzh3dhx;Qp=SzI25* z3QdTIa-35Ma?$=M-XrF3&8*vIgwB)yUTfgEAWt;pLE}Oq2#jY*U*tWW!oXDJdS>18exPx{D;FxVFN2n{Byac&MA(2 zuaRZyYjE`(%fgkOZ@`UM#7wuVRee8~`gTk|*7|Ns)YlJ)=3-Fpt!jFT9{ZGP5(65f3WLTv%Y;hEM2BsPL_O>@k_)mcdW+6p9y%9&2W5X%VZ>-3&Ry;)IPuEOE zE+VXrihR4|ISvCM+-4iI3&g324^4XcDvHbszfnQAJzcpVnP(5IxIYd9BlF>B#gbTM zt@umIQ(HZK%v$kS%G1}?(>tw2kMk)kKx@Tij0uIB;wb+V-a9je@`KTdU^mA<<*yFd zJ%q3Y)5Kq$i|`121FR`vUSTeJnOCoeMq^s9^E%uYbOeBM%K4;ZlHm*3-ldq;k)YHP zs0UVfJwCM`TTIt}=xjsa$NpsLLpA|N42hQh6!C_XWIQ1}>upGFs?ON0h4rxo@ZazB zN@$CX4Nd?g0Z>>+tdG0l$1ol{+vWlDoPdM|LIl06neiTwMoUhbcl^9RR2B6?{1=uu zqAr-&xGb#y$?8NrM~&1*qwS;D+4SS5a=hpIPk~*J@>0pg*7OX=ZcJ2H!3ce+Qu&lW zd|Zh7HfPPsoAk%s+@KtOMPK7r!)|mACJu4Gc`|NmsVs!W*W(lT)CfLrhm-ge91A|9 zQt<(A!1pYL(921LlIwhU)_URH!3XDmY$RVU5^$_E{)V zLV}0~?ztnQ*jhpdlVF5yWv_vuD%7;m3xL184?Y7z#feJpmP$@yC5S-=3=SV9`oTWh zMXT6JjiP|1zd&sOyc5XQQ1-HhoDKFG54 zRm2IBDvbda^vu8p{T@6ohv)dU_y~FXn|HWT<(<*3CG(K{?oD zo|6JJm*?Ihx%zB zL%1s;HC6l?A$6q)^_UBWfD@2cZs*X315zw)>t@3q01mP)h+8^A6=)_^a$Kf2WqX z^ajy{6Xw1mooFqy%+WJDPBRvxCbH+9=+-To`JTFK0K0Zfg;Z_TcS2+en;|g$w{H38 zft3^&6jud$Z`mdfV%;fko443o>g7#Lo6npdc%s)~xfW0V{!VP`JCl((`V7~*>%pxp z4V%}ihf{V#5CJ)+IpZnia_eTqgCH(7Qa@(`da#8071qOZ(9{Fs=bHPHkg>`={Zz2# z3M0*ZZecz2b9?tM>H|aa8|?nEw;cGPhvN8a^S*^PjlzjbHwhY?v*RnEQ^02*hXbyK zK$|?LRLll;QMe%Nv$-8Fe(rflcj62+ePvSF@bv!Y3_fQ*!ydXXBd%HBb)7s#UjYU~1nxG`qchmu@n^}YkG zrp7Cl7B$=0VAy?RXH*=w1otKt;Z|YX#duXk5`7Eq{gb)BBjSVtsc2pv6SWqGZm$l^9I5ukNDlniDmUb~-9S2;PI(rRTIXAci65RuTK2vsKzTs>DdbfdLNPlRdeQuW;}J4+#xV)WODR-n{J?w73YjR&>MQ$K*??$XWy#9JTI2g(;)fuW^gf zs_*!PspHi)6i$v;w+3o)Z{)>1>~}I=jRsbH=GPh$ZjZjtMQC^P{|tTaW$G_Jgb6E*W4VM-g)$8j4d)W z`DJK&VQ0$F)C)rsAF#zz$EDt2_y28Nf(Dz3dBgO`t~nuGPj5sAmr*IH0NfyghXJu? zhQBR#P{_z~2B~((aXIo@_&OL+fZh;9Z&(%kd+5$Mwc0%RpIf3l6dB_b>({?J9^A`< z!a*A{%!e6-vhf?jug}pkYas!+^|l_bw7L+1O-Z!(k;W}AN^;!7TpD_nD+DUX>zvhW zQ`a>zW@W=-9B7`8ShYN8cePdkg*9OZC(a>cGGyc&7jM(depvp&4LnKk#sZoT!(FTW zA(B7AD2~0AI$E~fZ+JDNA?~_P_#gMI0!j_njfajt;&$cuc~(qj;{ZzWjPU{L% ziog1y4q^OEV7zzrQDFo6#*D35UIg(3Upm~h`%3MPu`xC=<>h<|7D6uA$C+FX`eO2! zyE4Fuvj-c__HAChaBN}ysAsvTsqZYnQbfk*k3wEb;1SHQmm+b>+|}O&rp87{42|+q zN)CR@@XNuOMmh)YD*RH=xGlqvbxE3!PDS(ouC@)Q>uU-wyL`2Z64X z_(F?$KD-WpGd{cqL05W|!klFcVbvaENJi5T4=QkRD>LK{B<6rSOcs#4d^(;RC%#e( zoM13|@S+nbSq3oRpNz3# z?{dzioo}zceaOzBv_hm1VC+85o&U#LYyccx{W3s^5{j)A$B#^-c{DX$%*JUn157@;+4l{td zA4epRSq~Btv>fv6zMrfxo@ZAx@i9NdNBSCXC*t;xWQ}C1u@NG>DFxWy6WxjV&eZ$O z9lvM3-Xc~>*AT1CGWKha9nL_?01Sk9H1}g}dhfZ%#2FAsjNC!_JtzX;+GG2@{Ggyd zQ5briIRLBB=jeYz{0rVAfN|a2_X+-VLe`e;ZP=F4bC2=%+>aSAq&=|DYaAq?hL62H zUrNAoNbYR^{|gyFVfh6~1<`85|6j3=iSsXidgMlg^Y%G{f-Dp99JHbr+>t$;K#H3U zefFgUxB8tc^N-QWfC#Z z8R2!<33V20g>VdM2X^XTOkV(>KPsPl&g8j4cN#mIJeidKm?<2><|`$CO!ZIslO2G- z+G{`XJh48VSiiBHb1J99!~?;;ks^CQTDIfGgQVA@GL<@Q-&XyrGm!2qyfLyqoF}69 z{S;VATTWfNZ?geM5-@y3*+ZLye>U)`DJ(==-e)4;!kt+awWhkG8W@g+>Zeg<> zSwZ%sUyk^IT{v(JP)o6I1!@gLeKF*>)J%h$Q>$A=>F^L^QR4Cj8=&~=cD@2;#s_%o z#SJHkB@lvQG$=DL#yPH1yKD2gG!Ga2P(*K^k768(vatCKGX@RfQwsCr7no*2TIj{$ zVz1vQ$NBDXRBNmk&V(N{l}n-;NE~}H$IW~Y$Mq|TM8y+Vms(Fypo5YAfOkP7}r z8N1ciD*gemli?!v$Bu`+U$(Vh7%Jt^n9L_p@EkkeUw?e$&IgHb^!bfRKq>nC<7Wx! z%B~=#=<})$Vf;y8^zRBrs)(k*BRkrUF&7KG*Tx+cbses+rwGPn$@S}l%Sr3BBf;&` zUK*7YIl5RA7UjJH`=lemCLf&knAsuiV+76{mvupV3jgMH2&1pSxV;%8DN$#h}@Tmgt4@V2Hb$r5{B#O!YwP6`49&vOK zTf>{%5xiP~_tlS%ieg7T4krPn(E2@rw4^IY&i6RLw*%fcKTXP}boG4)@gOut;z}sl zpB@od-|h+)+cA;PCbt8~w4d8RE?#Y)xY6aRmeQ?5a$1$1j{&V31(U}VpC}03c}dr7 zcKCBklBN{?z6~$p+=fwIf#@t=s5S{OH6Ei*AiBGPm@4gU^*{Fr#2J*(HU$FnuVcF= z)B(Hvv?PcGgin`{&R-l21czTZ{XC9H3cnr_IHz?52j9~NHV$)&(>sLmGlB8mn4_Ym zEq|^_;d+9)EP-ep9mLMslP=ge=Tqaqo+9T8j}A7QpfmXQcMN~Dz~5MNl-y{`kH4fq zP4L4dFlQYdOsBmUBmt$g_p&ER{W)DhN@?#c9m1F_Fm{hVN(wvU-(yMOsr}6-(0_Hb z&^vFRKX(j&=@ZiaM-RUPt*57gPPEdc0(sM@Bk(1mPm8*=RD#LAmb6sLaNgA4pcfk>pgBQr zN8`ufR4NrGF@9`$spIjZRcX?d)rzhyeMm$dcNjNF^eef8`y!=RT;y9+jySPJmzZQ7f z(ZcIYzttpxr|P#Nf&SzVkCK}y_E(#Hf@4zPtDb{=f`5Qxv`s$2)N+)OcTprMBM&}G z=AGIFIw}0(!H&+5n!^8|35fSDI!cPV)OwdCYe;H6$jaeIh~~{lQ%9HZ$8`e#UV(qo z(ZEmWv;M|EmXC)PSkWDSEI7CmtkL)DQwmp)vHM`n2yv^ei)AE=-Dy{|z@DG5Jcv9| zkhpV1r;L1zG8_lT_?LFI0?HeIA*-r8hmxAC67bs7gN69^kV(&wwW;(t#Zu|1Wq|}e z!v&MZs-vT)M@O}So^ArAwsRnw1dp{!!llqJUYcv+pnGl676UFnVd@R921ep_Vv@x*J1tc zR`ol@QtK~mRew*Zf8K?ia<-HD8OGCL{d3`|O!h~oSZe+CERdxCA))`6>+jiF{q9!v zJH=A#FKtzSPpN<2@MEQ)`L;Tyzaf==r&wzJ^(>I2|3RVunCtJ=S^e%-^*hB<>o09p ze^04@US-$x$NPKlj%r2!T>Sv4DD50dC;judPT)-uczcF*id84@+?~KXP2k;k%<#B4 z(5{uK|L-Tg)kh6a9cTu(|4h37?S=e&bsv0=O!>8_!%%^|@pTWCtzWHtnE8w?;jsqX z?ADZWYT37O!~m8=;K}DU50!3vusXR&9YBPc%1oRR!3vy6VFX!m&ZRn;&-IsZpn1|?UDOVTW~h+=fWb!*)CY~qu(FJ zxl&0jZ*YzvqA zSBQVD!v)~_Kp=P|TuF=6PhW`kNUaZI?woxy3YEsszDYUt=6QafIQ2$bPzCHC$jh|QDWBXOXGq;gk+UX-#tFIp1=1FW*S9`L~f!7C)+K3lmz z$wzFE*|>@8U0_2F>rBue;rb8qMQ|C%*|LDm0;Cg_%JPh~U_3soO*^I@l*1JtB|l20 z7%!G+3$7CbsS<3xjlQ3<4}^ySg?bwOqHFLFc`G`Hk23f1LwzR${jdOL>C+RN>EFOJ z)>R3-Sei zk3lfe=eadO*4XgNs0x>|liL8q_kwGvyM%2R&eswza#Q!^|3KSZhQ#pQ2*070@H-4y zh;rXioLKzE^IKIRrUiSr(7h_LW?2L`Nfp*PnQ5ike)L|lH=i((?XpmHycW2TU77KNcF*U~IdDTqD#f7dYL3HRFBG!R z!B?@{I)PhViLhy9BF3s6>JojI|v?F&d}kAk)`ml#D$YCqRD{ot1+sq`gn< zZqNdt_ReFOjO+L}g z&>Onx?;mnE1YZK95H>M%)lZmaoSVf`#9^WK3^-p{Z?E`0<*2w6L&y&Ic>Q4CX_?wH zubXwhns^uT2_!$k-f<3u(&y>|wSb&DupP#+3(%scYRgcDpeHnJ%j&rS(U{b?4IgCp z+<;Bn#6$JNy(#io+KD`t*(VXV)xWdYI84aq z#fV$;J>l&NuYaR2W)P}~@J-8F@qoR*tGW~q9>7O2^T<3veAse|IU3uC%^3&^1MDoY zf;k7XjeYi6ca!MH&jZmaJgjvCJKUe;Sz0-=}Z13Zf{7$qt4%%Yo zO4b*!FC@&>e;?F!i{r2X`?@P(f>Ctv>AuZDj<9GztpY4VkW(Vuul4AGVIuJl_#i3? z5G3Rgfvx!5c-z4w$F9GVm<%}rCP&@dBtCli2}$}plD8_U^Oa!N)E`5g31V?U{%5m& zQ#A`{PV~22`{l)?c?9bJFZ6dO-_r!CBU;S-W+jj}905lo7l!PknO|Ut#7=MI5a4zP zX0+4l&XqF9AwL_9!)1_tTC+o7w)2}O*K$}jB41$3mA2qlEL;9^Q~Ar+TzA9uP30S? zU!1f>NMMc|+`TJ5fJF-vJQf`PhfbJ@?C5`%>oS{q+vrJ@HZE;WH)tvp~oC#SljTx z@|H5uuObL1w;MNsJA7dj8aHKxA5*M)u9SEQA7IAubX3R8nEx+Ru!0q)AQzqN-fLc* zVLZ*+fK6mFZ0`8HRA_gb!jPbltwr{Mk%$uPZ~0uRu1>01a!E0p`V*sksa3uWEtA$% zE~5!JT>gAhc|A2*QzRRts;ivDRc_*{AaPZkxGGItRVJ>gohwC#nnqhAmKqkDYN08_ zJtxy;kt9=|Go3{Fws!ns@_8e|CeZ5sL^h7ez_Fs}gNxZdg|FlMFVE9>&h1y0w@0^# zwCk;JQ3Q>;xBU1)qNKr36T*}-{b2gk*Scg>gq%m}ahw-nPWKrWzl+xuyMyyqgg*Ma z1R?a9Q?n?%gr-Hf)5NscYuaWWi)R0lnr!+U-2@arG>r+ z{hk9iOff2;4odhXs5a$Z)ne!44k;b*5!tLWrGwHN`tlsK4Zb#YX&fM`l%gn0T^bXr zcPBnm-xI2Q?`#lL`NXiki6o`=^xKK#fwN&HAlewn73lTd^bZbUW@hMYaHLIaz)AMF zdai#YHqy|)z$MZg?)zY4)Vi^o{_&xP9o_YVg~k#p<|d?^0hy?=Nk4=u;%=B!uf`%9 zf3@2gVA+HSXP4`2T)lV+%DO*uA23#I$0ITUKQ6-?um_K10u!xn3GQ)RFY^E6eX02R zOu=k`qJIS`cJDJ*P(KG7Cs#BHhq#jjEkWlTBUG`{z62+lkB{pW!#GXs6KXUYP7mwLxjBsZH2xJMeh zc;ERQTLxEsWAk`U;6P_k{3f8WZGa6KV|&*eMzRi)!+)xc_#*lvRG!F(!u=Hp&ayXI zY@kaDVRUfnyo3^wlncbscejV^$9M7q7MF)JY#lo)+R39Oka`0WL5-vLmLKkAnidEi{?$MXK4Q)npYh`_jPQQhns3ZHWPeYV%@If>P-+!D8SEGSm^ymIPQAk8#u*xBA0A@iPD;M{<1ftcesk6#VlxgTli8*sG}IEnVeN38^P{cZnZ4_v_Qk?JG#PvvZ%DB^q) zKCs_d$t|DSg79QGq`c?8gkf4-e(Gl$Pm#I z`s4_#oQ<#HU#f@CI7j*~{_upve5-I}{n_ zHt?9{9bnwxAz71q3?AY$UY%TFuDBIX;GuYQA%6AU?%44n$9S#X!r(b;vO9QqTDIjo zABW|6FSe>);rCPCvu3me4^OqtC3oSw0qNYR<3154kN(MF9D1^E-@fq~6vW^V&(zZ} z@x-B8p~2=&UduDzgc;ouIt}Kwkp<1;tg{e1ov?6JZmBmsY&!R&FamRV`y<|O;BHU-L zuR#$QSk8Mq_n0o)VH{AAi(Z}V2A`xSxbejL&)e!##~*E4}4R2Pq7I})#(39k7 zyrNZTkV-d>yfJUcIB`9i<^97ryAJ0sjrAI5QRh{7%pOJscU~gb8J7=AaU?x{e1=X* zz*RPP@CrKES+fgAA0A8#m3HL#7Pgd?c5B$yjk0eF00Se!u;B{rXc-$s*iQ_NMQrET zQho>jgbxZ8pIW1@W7o+5{@tvijh3eYBbcnc6g-ce_KI3i8a)-j#H|{=A=%FH^RTEM zkl@}7XW1{$BdbT8iPaO&;*;@QojFp5JpbGF!2FHm;`30x{Ul7M*1i5Y{hud&-)PwP zLBo!|M!%oGPKAKO2`}=POQdz0wFp*bFsxuH=LxC~p%^tlGl>YV*KTWJ0US$Ek5cB- ztV;To;hP7x>Z`JX>yRf^_rA$g!!%aCrr^UKPQ#A9l`IVW>vI(FHAV6Pfi>tKxQ)d{ zBwX=RUYLtnf$6!$oa8kk#kkfFyR~`myMcog=CO5{KHdw%0W#aLI}NG7xAmooU@T_i z6uz!KaIh~b7b6oDi=F)EX~+N~@1G@3NO`@uL<;ZwY~RPyyZ4(Bey+=N*S-ziA}pZ4 zKm^^Xa_5w9(&qIgW2D#s^=%i0=YK?mMMYWNMcgB$fXo5vF1|4-s@C!R%Sl%O-W56+ z8x|2m`s}4=kZq>CG=1O1=}khBdk>COk=4X(Q-BUG$)0kfA_wm(vykL@YtSM&lP@(R zBnW0E1=JJuG4Nc~OsDWQK6rNsO3O2u9nZN!-WlJbEWm9al{T~Z;Vm>d)? zPCZN2W-ewsstSpP=x;%t&9mQr1XB`>5%YAB05_y4xR^qsMQj*pN>U4PVn)bRxHXsi z(4DFOwaA5T4qq?7f#Ea4m0UPifM%Apm^bjbj9=K4I*wXP9>ZrZ;vKDAIx=aU%IM>H zMh)ku;hl5%4~}HRX>+In^1nSks+MoID)x{V3rAMf@YEoWeb+o3MZnW~a75pJEVhe2 z5aw>&EdtpGr$@5Fgj}*yh|o}c`>=m_!U++jQ5+Z1D06*VOMV|mo81bpX%r_6>l0Bu zEfIzRSQS}`A}Q3Ju}o1{jv|VSu=7#tr)4i$ z!|9lb#Z&(#SFaW>tR8tWR4uCX*vK*7a_NsQS>0+r7k`f_iCyg!P?o0pTjNY|VJ6x- zt6J?rRorDdktvEECPO@F82BbhZh*r2+VfqZA%!imQ&lwvwnaC&fjbq4%O3IS{uZW> z#-S`B`bxRQ*Dk(S5-q+7ME%`nOf<`$!&Yi_n$|*GIC%{fKD2q&UTG7Y#Hh(b)drcF zM&lcw4xa3pGSCb?<%6()+q^KtXnJF}d7<}|1D5wT)0>H1p?%EBS*J8w-Y2_xG9A5% z&D{W^W9zn5@ZX0|H@wgA2kfF+vh(TFWQyk5x2l%iit7W|TO69>EUU#??51roL2u|a z_kHSrGqfOJY%qJjVH*vF^@A_+O!=NU^EMw$%CpRiGK{z0*kxYiJtb;+Z#TU>`7ztr z&|r5z4LMLfbB&FrC;bf@^EKL2$^G2tv%zZ*0*KEUTZTyREJp# zJy*>kJs+KVO!TDv59vAG1)+?+(yBkC&~wLZ(sTT=(Ub8%qz5h9Rr{=&MS99lIi~jM z`9Gy6tt)!Im`QrVImbj#x37sFeFqXM>IZvjch<+=NtrLC$XAiz|8)Oj!r%Qh;g9^n z?fU=e^w4$QU#_}Y`v1wtL{E?ZDLu7a(R0TP>Ho(@Px}9qp3<)9S#y*0|8E^r`(*wP z>Cv}&y6pecrT_bniJtENLwZhk<#g3P0iox?lRBga4$$LZK)F)v0qvQ}3I7v2;B@%N zp$EiHNYQ6kO_Tor%?|PJ%%1W5PunA_gZA(`oQ8=86En-Urjo4Q4q0NLHJXdW@b&dE z`uY>w|HVUfH{rdoKyu{(F&dK z=9FLSwR_Q1^eFEJ$Qy^O3o-T z9=|rSH=gnsm%oDl8h&EeLIPpha^4K{Hr_SVH0tQuH}}7WUx)oe4A*0kztXQ8zgm~; zSnwF46F7e6ulj-`Fu_;&u=&c{rB;M zp%%xlt^W@vemBAhgUyrsZ`fXHET#J|uD?2m|L@p#N%$%D6p#5u$PDeBcNgNoO4>mT zqv5(&Cw9|Plxt%*@wkzM-Sp-?9oS7dTm*LLT9bpV5ZuYu`XBW5*J?j8-azFjEVIw~ z1ufa7y(wrC*yp@*8bz;mUrMk-ar3X{KxPoBSI$USuRX~gUno+Yd?G~ zQON@;t)fxPs#9^C(lne`j$bqmBFTyo#YSV*(kH5CI2dW?p)cs3m(5N1_0q3sz)k-+ zHo&Vu{rK#yq>s^O}gn=~|cJ69Rs<&@Ks7sW|zb&1m?cd@) z_Nvp2HHGzKg%q;2%HH;K((%*d+S2hDKGY%_Xg2i{P{74wq!D4rMTxoO2~vXG|JI`~ z<0{sZ>*!JpQp!+vu1l)pgyDL}vnwdMi2cGI$y38&^}V@*aNW&@f=1CqB;AMsjK&H- z$?FDOx89~FbpQ*jZ>Mp=5xgtmZ7U8Db$9q0bdZwxE<*aP9Wugi#MX0OfX$dFN5*5N zi9hxSXR>NVN9aKkx>DLDL1*-2^3)`J`}jKWn5U&!y4-&k_pw{S<2L-Qok0G&y>0pH zJ&pVwA^gq4HTnA)@KOBr;fdmJKCT@8vRGIA{TbK^{%R3y@k0m>VVEoU(cDI%L!O8V z0B=9a6F&b%?ZkCbshXp|>jL9ZbFN(mZlJc@CY>Po&%oOb8BSWjJ!lewKug6w#*Fj1Zu_vTjRuM2qIsmRq{x@{ zq&X2FwaC@dcBM|=I0bjk%9oRlmK*7itTcWOv!SzSypE~8dHS{%c^jmg@`eKNI_^MO z6&fJRTr>&QD8+HBy7EA`;g#2}#D*RAq{~d5h0I3@y1O*8Jiu47PUgy$My^9U79(Dw z1Z!FbGvs2cUlk7S_$glFalX8sh}V4KJyTA(MY}1|5V?V)4WMsJOkZ9KAM{7b26y;I z!)7V5Ssc1a3-!925whtO%c# zLR8J1FI&z7M{D)1EphBdO68dj`svMUYQqD-QxnO2ZA4reLp|Y>nuf}9da59u3EeRi zpXy)XEN^VuxoqDCiV?)dGYB=1h0`|e=5f{4C(#S~thN)~{GF!2I z2?)~Xcu{UK$~j!Ed!)l}<~ZLBly9=|%`NhcFuLwH9e(oz=Nsl()aUr{%?6D z!*5QIZ>Ha@&&fvlE2O+MMP0bV@}JBiEz_sybNmpQ@hB6m!XJryaAb!kE+yJ6dM~0F zQW^NYw;cxdL^0)uUF(h>YEvpJUdlt@%AW)#N55=S&VI{*b`ygolI5;#Q?5Qv9JWBSR{fYKCGk$tib7J+e=`*GBJR@l4y83C(Z;%35jmUwQo$p2w|L zoF6$#dc3|fVDG(x3Sx?jr{)Cpe#@aEARU zIkIVcE{w~;&ML8&O9e%k8)X>tD(&f)lk*4CI_CW6APS?;IPkB);bSYlg5%6mehGea z@jDv7^tCgBBqu?wFVSLXJEz6ac20|-?bu@Y0&Ta5S7@Vwptp4!wX?USmBLrY?d?(% z6k&9!glP$Tn{Vx&Gaz%TDT}(?=kY#|T}Zu;-h}&Wc(2||c`7aE{d&IVp>NK6mXF;Q zx7Qg+Gw3Je-U>JEm8#km^{CaQ)fJ)@Onn`08rJo^`kd|*LC{xX>T6m(gObGKVwE{1 zZgn^#u(jx3@WNa{yNnhm^Lvz#HQT?_4apUDyVD|_BtUXUq|pE;!$wW zV-uyorOiVh!hu+aO&}8LMUyA}iGBud;)Xr!OW=X3CK+is2XVVY)k;v~5XE=uu)o+c zSyl&1h3iqNqMVr7+4ZPprw8+nAc~h)+ug>(4fCs?9RBEQN(@_>a#LL;142(3(>$mXb)77D zWD}3NdNmG*GEuq0aAy*m!d+a$SqARrgEUn;j3-g#AeAKEkJFFzgRW`6GKMi0IzNbA z7(JkY@oDiOEiw&=Am|GUB%kqLTHSa)=mOp-1y7rQ9ts-6D4_YlMy>8e(CNTrtf5uu zrtzy__H|$~KofaoIzrX{*QW@i#Y^C-&F72{?Uio~%L;ym^D6;cXxHkll4|N;)3aw| zvm5@#RjId+wsJ#r*+_RzC`)lGejnb0FY2yES&~+`t0N4^tf@dk5TLDK3}d`C7#8l~ zw53De_X#JJXJqsoGM(zQYG7+8Nk&yBuse5F5jI zAcX@~#7tY3ReNwyXjI{@I_w3#4P}~!iQtJyMrYvx;z);4CACC%$!o7%f0yKp;pvJv zexkx{ydAv*PaxLvb_(An(F{G(HA_#6BYB)4nUh3PaH%bJDTQgQjmBVGB*(WB=z}Vh zuEaQD~;FUTbdqtL?icT0h z2?J@ntT4`a8h3zvSGsOWU*bKdlWs=GW*NSK{YMGxoqZe*yqM(*9S42*XYjF{1)WjO z^z_3qjII7D{~C{gthV16OIk+%3p%OQ-03`-JI&~9?!=LvbEg?*Mwk;=Jn;nF!ax@#U($0LJY%35?}U_8>Dq6Vjrse5tu?1bPq7 zC*(9B`6Rrj_TXuu`|Dm0{Q)11W*c^k@2eE81J0|uz$1vOs6*BpK1e@=R(CZ-$2_K~ z3eN=seWS$-dWDe*ZJ8REZKgk*6&`mib06-U2J%;kEGXxJ8nDO)97aPCiC1E##~vW; zZ?~COozUUDDqJCOp;Qs^&hFF-E+5Apg8e-FM%W*N*?ZFL>v;Vw6vg#VdCe1Vab1J! z*prZ)&*KXxPP{?Q*cVZv1xCu^8cI*U1DV*;Uj^X$3Wk57N$;m>Y*zN*o)i-pu9TNC zNNSNV%31nflrfr7i{fZ1&k$x7gK_XuL~X9s2~M3XY&jdI_B@O4UB;%*A4O1lIxO=# z*+^y8;b>i#OUC8a@#x%YnG8f{-V^)g1u9g#6kh=D6GXP&*z{};UIOl8fdb-FCof!h z$Y23V6?_+X;j$lfzPE9MXYj`kX0Y5@`jKp349`(}wcVDJI|;j$=sS)9BqaW2O@ zg|W93oalj1$O+f&*wN|i4sNn1qmqP3tBrE}+WsaGN<0q8Gc(fc_{O z0F#hzAZ6|vwwklcK%tB|=SEii%mQvDmF7fS$6n|N{5b%h_)1QTpWEuIj;j4V@D=fa zBgfHqqr{N1D@Re7);DLuFvF&1sX8>g!-)?`2w$zLCbF5Wsx?-%uQ*($uR(w_a-N9* z+LhNs&~L^t04V}6djjuwu|uf)OL#vTlso0KaUZ+Qc{!Ljk0*30=5HOX7fipH^c?sy zGu2m(4zPj9W4&NIeyPVTy^L-`aWuWDo?&0qRj3<0Z?|4B=dbA5t>&2R<}a+E^YsG0 zwTE8^^3-~P-2WW+ovjxSDcssCTqp zpvXwB7qD9TF5^zir~0b(0+wsHUO+mX^#a1TKl%mk)p~*4cb^D8bg*7fT}}RO{JgE4 zxB}$w_2{OiP7Of*9?!ca8Ms3_z7krs>L@d7kr&V6QE3yAROl_d48$^Nw;S?#SA2gC z11G`X4RSHi1yD8@egOS2mKN^iGpW*CK{Vn^3q%6#C{6OqKGGz2!uH97n)0}bE6XHNxuP5Z78l_kQ z>MF6G@UXKohxG&&G9M)XXFb9BO4bve(7Iet=#$mudV<2L^YsL>p{w--e$Ri9nJWHr zJ%QM;6Nm?v;& zrU#W_-!!J<`f?ahTKQT9?K!%*uvmmUnQlJ-pxAG?4!zP3pKjb|9|QjqZe#SeQcLH$ zhdIM5yO>eq2-KKutc_);`93y3_n?5*;X~H@y0u8v`xa_~yUnRr_WE(=nxCvUJ5leH zOB-FS)(MW%o}K8d5#&2-1YFkzcCo*}4+Og8cxs48!eM;Di^@^$IE-Vz=F9k^!l|ua zMh~-lXWE0YXD)gkuhZx`P<6x33L;_+3)`uQq^j#Z{ts9rJehe_YEhi(|5@{75-!*!**PN zcI?osQZy)k^3l?;PSKFS`8D7icY<{2Pj+xVc7JlNkn@+F9drKw=1+F0g+JM8F|?i2 zVrV<3#n5(aF?KIY-^eSNp6|75qjvU~P~53MnQ!f9uY?3Df3n=EA z;cN6K&;J93`|I{6lXCc+itP!HKsR>mPbPPvW?T7_$=ybsjnI`pnWZ}QCv&_i1>DMR z@J-phD%iZYMl)T(y%+Fy{`YI5wn)YqlX>k=4V@Jrt&2v2r=(?0m7(__8igHC#+;UCAEv5b)2^iK{M zUm;&oc?QGcv|FyhV{KVKxFG9(gX-at)ao9>v(_8gyl!nJ0|5MzSkm8Ib|c(S0gO9w zKh$1%1V1j|48Z3C=Ty1K$BIbbXg^$|JUyOT?ZJEpJJcKA8El-Ija6nyj z{V!Bxu+}NRgm6|b2Qe*8>8GM*-Px;cG)6smXf(!NfuZAXqML)=b^yw&q_C=ivB_9% z?p83P14&||TLOLrZ0w&vD6#*g3KNl10IUX>OW>m|vHvxc{bAZWOhUYn2G$j3!Un_F?hP~o#Q6kYja?3xGOWTY2slzdyH8}7kr(O%m+gab zxkqcGk;H9hdNN~{V}PXkYflrp9{A`O?bH8@zxKTE{|EiGM^=UAEAM;hMHi`l`{JVSF-j>)-bjwtEog#>Q@d4y@jNhD{-EB78I$QMEU?lL> z^qrLX>wU-?G{+nxnP>d)NuvI2_l96ajyC^W7%R}FvW-nKzkEjn42b0rvHH0%_t(0E zUxfymrVTA&rbAEmFsmm-UZ3+e(zXn)Mjgul0;L+$a*zxv_?1!Z3vVnKELkEZawb@SEoONK@t6MJfc>ZIF>>xg{W&-Fbof`e3#jHmg$>~^HgDza zciX{rvwi^RaULVPh0uBnS7BKT!J@c-Kt(nZDkVJqXaNA==h`h>x`7F*Xbv)pB9;mb zqb+zCyvd8Y4+N3IZSuglLKoMUnV)8?(^mFrE~|05L*5uxAhYB;+ylW_!TnQqTh;C$ ziScXmY%njl-`F_$^tS7kSZ`tJ$vyeGXQVs42kWO$cmbBr6NqY%kZQ8JO3|9jx%q**jRix|d&7c%S8v zF#zLNH{^tNZ^CS)tU=m-w%^!<2)QWFIXQAW9h@lf4>?h;og%JLt;{MeO++jC(qvt| z!5w^MD(G}KdxpA0dxA*54Gz`~#YgfU>rN|kn?2XM!(WgAXaRqM36XzM*sjk356FtV zSHKDQr?guoMQWTI`d*fzH?1OP07RNZZ_sZ0HL1lo>3&J1fb)CARUo~UtTaFb?Flzx z1i}OG1T|P?Znt8kn{$1C-iExdP&5F>-u7o=tK#FFMna3Ak!XGu?!u`yx83c~lhQ$Y zAyEik-F_Dlsq_u5L?^ic*NyHR>{K->ee6@$d*{3?t)u^pR8Tq{OcAW=-Vb{GK*9rr zGVJA(WW>yhp3BOXo&oWaK5UKTmV_Kl{}d1KMGnL-ODN?c3GYFzu_4cP?>8`;y3qkM z0G*NzRl!p#eC~rzXUlsF^pkI|8Q1%x&trgKI{{3#m45={#3Ru219|%esnZ;2ZuD>T z=iPYA{6L-@;DY?G4#o!nM)Zn_-Ux?AUW287!r5IFdOb>;>BMZ>y5<(>FVvN997G={ zH`o&UqbE@$rFs2qj}vek)xm{s6d6#~4d@xy`=B=g%^zhFX-YB^>Jr^JLagMLzwM*6 zWJPD;d;5X=WK~Dd<=d<9Hmc#XcKKEOuz7rTk3m%W3%1I9KO4464ivL}J(fMGdn>Yo ztEQeJ1g^65T_lidEkWR&O&|~)Kt+QOeb&NH&%rOu9v?tu>qxEcv@7G)c-99NzrphW z6kQSO_uKP>tUm+wlN}%z{Xy3Ep-oOQY(Vnkn;evxc#|_|jX}v^)71OjO;f(9mH`TPIo6o7T_83e`$H%gKEyX2{EQJc zZzJU^=$xH{7Kw5(xMumC5C{fctt}=674LG`^aIZVoH{T=+!i?5~fnvGJ%CXSx9)@Fh{OUgLYvM2J z27k%*9O^#cA!h{G-xlm1euw<^TfXApn4Br!5aPf{=ezZUqp!xtYwLP(m=0l}HETpRCJeKm5Wj}K+xlxSz95k4X$wyXPI1c)?5$e1- z)Zb($4xu)38Nzcu*o43y@xNgtX;&xaQ6fJ)hPVLraIvAt{(;o>@;^Y^MgGAT z?|Y={3f5J@A$V{_7G^TwAq-u1zkmrd2nCHX9@MHhB?>k%-(dSB;oUCqvf9J@yg3e! zr=bI0#!v^1-yndM5 zgtEgyeV2RgSBFu4+F5aj;iD=5Bo9hIo8cd&p>I%AXe+OCaatMrmh>CFF&oK8F`K@Z zvKP0W#2*}Z*rSzw`fwU*2!wjT!IJBaZ9tQb2E=MSD(d6@kruW zt~Mophwr?-!B!8a+NE0ADk+vKPc>tmqw=7EzAqK7*+dQGHM6v3ndTBQWkFS-hqiLP z;SJyjJrx<_hcRJDiTrb&*YYC#2}%{Nubmm_@f~e(1Akql7x~We&o#XP6mn&RddIT0 zl~L1sZnNj-8DVc6R^9rr4X$SBPO??fGuCM0&ao`B+H2o`4jB>vesDl!#E$2CW3M?m z+kk@Y)(i#P9Nvw+6i`LSV*>^B!KYth5E({gWPgZDs*iW@tFOs|<`aHVzU&JH@ZaAi z;p5C=G*YQqorTsZgQ?Fc3Z9hMh4@n1tN_lDbTKgs;4di^cM{HCKsk6dcSAEY5A%Ao z$m;I&MvLKR?1!l?EdxOmmpdTlm_?bf^PF+5xzy_kXF^g6VEq_B_uxJw{4MK3r=_PM zIk#`j+z(u(P>~1SI)*dsP{=l`F=+{}HZvmY!!IBgBz~5`q{7eROs~pBryza$7a*Od zbQKr{`0M8YfyY0^W5`+oQj8AG(CT)84tnT6!0+6z9(m-EOl|(dAOS^koam?<68(r< zd#VBf^s`;S8tx(I*od*{%EtM~4ozlYDyP-`0+&K8!Qhm$1OqtN8^cL>sd16d{Grzv zlVyz+yM_k(`^@|r{*g5z&VY;XF~sNR=$GFoDNqH2(f2j|B}`TfdyqSnkH@)aG(U!W z*ouxn5q5S|tHX(6u0ihbXXu8x%HFzmzuuG$?0cC*zaZJa;hZN^UzOe5;L++H(e5BYWdemkrsIfr5aIiW}t+=u%0w%x$mhk(yZ0}3mg!=P-2F? zco6ABn0!s~x+w!1iUDM0=7cOr8HK`rZLdh!s?cC#5>G5EHHuN9#JJF#XE*HkU`Go- zFotGvG80NShu~}hH_8O6Q zs?Ih`vtb)Fp{UOMdf~VgN@!9#=uK za*Qma(gW#?wm`ms2cG4_xt=rS6jYrvXoM?ty74J4^J6`wpAG6A^1*o;{1p5M1p*6t z;|2x{lWs;QP)ufJM4LG)i6X}|`ZMawHKGfcb{;IqjgH1U41MUKk)OyVljTQ7;ZpIN zXYtMIJzUI_^XeTIA27uVx%D$?C3cCXBbCrETKF8Sl*I@tMkY!$!g*@Caqk^w! zb=*%F*`?Lp3NdA`TSIXz_n9Mo!Bw*|&FhfE6<0HxgR5p^U%WZo8yw=Bv!6Mxhj@dl zLeBaQj$3#u{w%!LywQW))8=ppHqw!6b&y143U9FcGfe%ryg^z}xnZq&FBuyVmSe2D zEV=K~XrSV%5ATD_iUS8#y<;>qMElnP$9V*?QEo!BMQurky@ zTQ0*9>Ka(IwOm`;~WvvSjgb1(1~O%Zpb* zhyobZxH!l&RRiQNpulg1F$`VNz8z($Gz-^*9g7>N{@~*YAp7ga0l1F#=R6X}8*jpI zbOior%U~z-@Jg8Bd$pD8jD0;{3v*~H#!xm2WR(EnD*;Dlf2HppXfYb1TcDZncr?zf zLhXeOAE%isCV|yX(2j{cL#9_7;5}E1{0&7B?X9h>&ufVO5jTbFVNqi^FKh-)Eultj z*$JpQwgPL8s6O_Xsye)fUF@~E{#GXILIYF9>?qtY z4>|S?=Ckx^z+Zs*tlyrKOAK7V04Xvc*wPJ1dL z%=Xit?`?Sw$|?<|aBZW-4{+a@20PMij0A=_lTDfxLu779=J}UJF{pO5oag8x$};)_n#9i91+r)& z)Q9Gw+9=K*#4+V)|4;CItV1rcB@b6V{fqthkf%8M&Eewa#AUuQ!ehKO0Q1+u6LC)A zJXwi_3j-Vq7@+Nyj}_-|%NpJVBb8jSo+tS7haQJEbEF@HYV%Jf7P5hflWw8T9=|h= zDK=H%J<3L#0So&<;&Kgmr6`4tU&nnzXwfLQ3z=w@=+(H0%lXa{3=!PYGJ^*N<=cNd zodP{@y$E!H@wNzbacB+>cr(+@GtKE)7?dKk?r4Jl6~8KA?0#H{EHSPWV${#9$qF7+ z=j=e=-yGM6@UvX&g?Ufjv2%$>bv6$_&Nj!wZ#7_S_TaH-Xo{q9gEuzPu{&mX;ES`W z(}H7jv|DE5<@hF7evUrOpQb!G`Nm5ooJ{BhMWC@5o`UEG*c~w6dSD(O+!X#2|K~15 z;id{PxnnPhy?3!JL-B+FX3DSjYIOl#1I?lS!9#PVj8XCrHVpM^5pG3_t$-dP`s6h_ zfD7H*esc#t!ZY$)jy@mek6wzxe7AW!-oed;*U>yYlkv(&--Jj|yvgi^gn@@~IKN|i z4fRK7;G4LAtHzn2Q{jsmz@aGi!PD4gH#fnEm>3ubxXRofCJx?5b|Y94{Khz-dOcU0 zSSO-F#q4?ZeCd_dG~{N19+L1Ubg#TUlv-^uPNqlKMCbAmIeeLm4^b*q0o{hqqDA@x zBHm?#SXAS&#}?s!tPe+xREt#!f^tu+?+(~Bd%-$Rwn)3D<#l5fhdHh8VZa2u(Pr2W z(0vDop?-b{xQ*$I_b|eKS)GWC1`v2T2102K$0adv?|~Z8U~S`;J(-IRP_Te*pAXFq zfWR$_cycfHfN=KUFy!kq79RnB7;LNIu%ya8Q;v_Ty%s=Ds6Eyzr&K|opa=K*NQ`tM z`AtCtZmVH9d?n-sE`E?_N4HCfYVuL~2VXnq0Ah6r3>4jkNhp5PfNn<12DD6*RyPMc z=oJc#hC9Vkz&z(7feB^l`3lDK;P}ilP{i^T1ZzP043u)l75fLabo$7Zct$zJHeEZ0^u^zX&qw$C41cS&#jCVsoWFBUn{9Xlb`ax!&qivEa09xja|)89 zAHW^)*I@Y)Oe+KL8zFy`*8rssaQsoG8vtnWU8tdj+C-K&?BD+w!W_aRP_;Vb#%b_* z8hVo>8+HYf=2Ix52LVd#FElM*+T+TlGeBI72CeQjytX{)9HwSV6(A#7qt8BzwQ=Q6 z)#iQ`^+oR{Oo)cxg(EjmY4im2U*gL;D3ufbA9L>m9#wVie`mr70i!3_2vK8=I#!UV zMAJ$nYM=?A5{ydFR;<*kT-u`b&kWEC7&tSK)5F+U^p;xMt1Z74E3LLtilQ_@$e>b0 zib|_jk)obq0Kq>HP|5rG?sF!8FzW65ywCgmcpft6?6ddUYp=cb+H0@9_S)RE#?UHG zuh+85pNFy?uKCUHaQ|jB#P)Z9(WHX>FNCwbDVitz8dbSC`v$5=pGw8usFfvVx~gOS zrbd$N>ps9L?t~>c_mDCD6aE~T?}N8|iiwkV@*RBB|L}j|yp9clli4f?L4yRS2-W|2 z19(5?rE8r_fh9Oiqzg_y$anqT7<|tUzJEkL0X^rEWC)X9!;{2Pw+5%L(NeRkz13G1 zBQDC~mM=?6)~{h^YZ)@GX!y8-=_AUXwPzRRSeK3~481sfT;3f;cp*&tdNATp8coy& z$!n!w-lq(i4-IKunjb=qRKV~R7sW88JLhi@y9{|JcZq+c%SwbCLi3cly5g zQ~Q0Dv~nmcT}5A;d(*w6O+yy6XwN{DFLx*8Gw`q~Ro9@@XAAbO&)_G^96 zbzU@fSoqJk$ACY$`Whv|Yi63+f;3$xl)@B6(xoGHt!8g7dVf?y2!|(G>UU}1J7RCmY@$%Ek9WPNDxd)_4R_sqz(&d$N_Nx8`{sJH^<=8wLd zlNU;%k?P>K?ph;gt_5ge2t}6$u+<)6O5)>;*OBk6K3IL#f}1b5zi#wzxmj(bjyk(l z2E%KcL=%7%@ik9#!veb0EGO?PumfE(+8;2MO1x!#wqX4bok9;R*SApt*7H%DtVpEPHS`s-gDa8@#ju$}Cikc19ToZ+< zW=j^xe1KeRfcWjNUu(JsAoZKF_6EWEUMHL_m{)5yfE6u;iEGwd@ry;)g*R$Y)jwtE zHEV+uwF_jQz~0>M)F5baTW90OnYBD~3?S`WmWQnPLegAa1+yD_lXlWxUYZ+w)195? z%-X_Qpl^zLB&2^$z5^+3%CPU@Cq1a5HCvqemGFJ%TC}EF1RVYrw|&0DwNoo0N`f_0!``{vBY|}Z-X`JR~mE@=EhXytX;DK1lM!W;XE}>w?Gjr3Od`@sF9*` z&01^7hH`{jkO;~>v25-)|HVt=fefvTN=(&*Xyb0rQs$l~NjVrO}0 z?0BzT5{VD4EZVfgyIt6@8A~ygzEM(cjXRdP~@i4r{L$fFToN63l-nBV(TJ6E%%dgZ1$a4U-)&?{zth-a4t+Ib9)vx4=SDj2YTRDN!(09j+~MU%>n zFM6?fkdg5kw(%m_#*0I-r|rN87{V68lzRmd?{aWr_b|BoNzItndjSsvLdCR`rT z)dSAr$S&Tz_Xmgo(I-J}S)@(hmqqgV&W77lkq>yc;xS(Lk1EKu5^w1H>{2aarE`fP zC#~fS6+20S>5kIY7N z{m3T{wc;t5-l}hL(-aNtpWf#?Lj}&6-Zc)+Ps?Qr% zN}k7^`X!>m1k7V@Z5|`fORo8l4TbND_`p5)M~VgDq@w?ceX)^CCWrLe5kEkRmrPh;)!{cFR{VJq=I>o~z-A)Kc} z2Ll`Hm+L*Y)U`{sT&k5PnlUu0X*jO zck7qAmto&qnt0Z!U&Ib*{c`AhVNSH){*n2)96_We_J?H(PX{%)wT;7PJ?IvmV9h^4 zcmSO(?JF_iL?^qmmOHVf&i&%sOm8-u3BkBD54&CL{LXFtL0L}?Km17ku?pK$#XWE| zZFO12d(3w*o%D;}3r;BZ7hz3DUMl;(Q@hlyS*ls_9&(|sCy$Z;vTu8KY9Dl0>D8Lw zTe#IMb7tqeW5U|INsAh>$Asd>Oo8MW__1ke#W(OpOX27qoEUQP$EbZUiKY@h!Mjm5 zzSH~Z5-+-xlLlI zu2@Y;e3h(CF0ITuT3Pdd4%53en*wH0J!gt=HOsY~3TF)jwEc7tk|$ zQz#6#W=WQW2@ci{JO5*&Sy=HaRY(02H`mv|yjx#mF#(I$EF-CYi2(_*)wj^{N%|ny z+lh6UAzZWE*RzZbRQq6zq2aSJ&iv0YNY+065FpO%Vwx^NwBO8x&YI}BWVjDYORf*^ z>>E~$^IoP2>G+7Z9@@9pODTmR>NgZ1Q%#3I~AG+?TrQV=Q_&NyZ+H^_Tq1 z_P6B4_Eer7-C21<^lb)-vv2Uh12s!?N+bi8MZcu+l+C}t`m#_-Y;R>LSGCd=+IVc@ zxAGz@UZKIWy0`5OwcGky^Rzvf0t)|9HH-B_NRCBF@>$E1jS`Yv4;p(cSUx(3-2rxM zI61fd@ZrM;HlMobj0XNicj_ASf`=O#fLy&MIU(1oelMrle!bV=!^30Ctat)2n6N5d zh^_X=+AK!-^IHQ3TMBTn5!2iE@+#z6YaWL9KlA|64)i>Ux;7XSKnP$MtL z&(KSyaBgC}hA6~+ z59dxJOC(tyfJhB9j?E!HGf$=sU8P0RT?+O-&tzF1giRan{ReIExk=5CIjo#2{P~*s z>sE*lOc7r{7>Ajq8}1H$A0wc7$~~Kde>`y>&Aw$>ub`9C6G+lNgb4@7ubC*sK{@z1 zJ2i{x;$+<>E)1DofV_t?|nChqu!oP+eyibuicr zsV6X2M=b#U;1yr;%rOJ7GHv`}a17L}Z_M}x(vb`7m-#d5<@l4LN-`p!n!NwMxl5LuIGN#ewF@qqMa|pd7 z={^K)+*xs_c5%}Et>{#{C@n2FX+NMhwb9?^c;@AlPY zfXUUGf2~H#xG=&m7soegHu3Y6gc>CuKPyqExB4Zl@1da6rokyJ)n@M+HVU0JFiqBw zXwClv=@JOz^5J15I`h)B+dEiEyf%-bL{|Wj@Cmpq2NuX7XiV(#bNUK&jf6qff-bc? ztVEF+@Qc)l^Z=fngb@t>kYzkIJV(QP`ER~t9`6|F9k#{FP1!t}{4|?`w!gF40cV)t zNbd_K92#L7hU~^8rJ{D3HSbJSPnE|gYc^lHzrfWrIq!M*??DXI=I5rLW$*`hlKu5( z$zX6x6Wa<+{10?mM@u_9ulGxV5_6yT>e;>$W5s7vg1TfD!$WN3!Uf6pn_NbM|JKq?a*#V9~P8-W1Jj3-1>{G2ivur}U=e!k@kI zQM>o?Ui0SW8SR=_j+9C+EFFsF2Df1~rHGyvA4)H}XBO8sj~3uSpgcyGc5neuP1S%x z42so|tvzevZp~t~YeE~fb=Th0-vs>Rrllyz*E3A)n#V%vE9B=PZM2A#tTwvTU8PrR zenPu*UA58ca0O2;Y^J?NXMW7t=+r-$>F>+SKrbzqySR=acj%={1HJS)S@-&&r)q$q z1ZJm`Uu`749(@&MJWql`N|e~We!1O}&$#8THMjmTl}g&{g29`#pVt#zwO;ge>lb+s zz)IAc#?29fE9~|<+%LhWxY7E zH!rDtK_^erHf0d-M2C;OfkOgC{8IIb&%Z}#cuO|Wz<__Fr;)7-;|A8M7qPo{FmA=H z$1wH++g*>ffb460VP?%&2oD5KpkrI}zQKD3Hc%kT4_mEy8(C&M2Nxz(UFQ=T0X0~W}8#9Eq#7Zb0fUt#+Dn#S!%cD z`@FNNgLm%j$~#D*8(1=>wL29|&@^@8IuM5+45_vJZ1LA|>1KwxXfd1&>1&ys^m2}J zGeel=FM}d|9JyF~(x9C5-FgnD0A+p?S;$=%qi_q56+PX=AEl?)0t6weQ#yM82k+_K zL3JDSaw{k{8jQNayBB!Yihw7q_&SOU%%Aw}$W|EfzH6$r5`P!tvLGE%Y)+7I)NtY2-yyW@%m>o1eZa`;SOsIFN>O(nq` z@c^I50l(M0m@BbR*`hPSJ}ziAb3Vi?wV_)=ANwb96wj`jJ#jg zFZ0@!h2n}41GZ|?2J4!x=fiZOt2%-ULauCH3;qu_ zui(fSCf(jLYsN+}(k|ky&NK)`!gd&hQe6Eft1Xh zu}kN?lS3cIzKTVHpDTy8X>Rm|B=slvzL?yoZcIq3UP$8AU{jl4%ZnWd<<$#yrXb z800`wj(+AS8WYccxT_fCa$>*8T1PYg(Gz43pPE3;dsE`HU zN)OMlGU@!sX6MVql5q>+(v)^Ei@Qng|ph zJ>PD-B(@D|<;gL{9W~T3J0D^1Tn4q-lJ3S~K3?{6aCU}KDts=0)n7xuVy4kigM2?4 z%_gG;`Hbk~BBr@eeS0rX=MZ65?VXV4T$q;cmDYW#Jw)x927f)9K>0ktbYWGu=@V9{ z&Q&^9-Fz=gQ@f5ejJr^OlOuyyvsZb~@q%jH3gC22243Oc(4I_zWSz`ErqtbU`mq|Q z-$+S%UfWs~x{w7@2r(Y*$E3o1aUsvdP;t+d zXSz%?22fx3b}h9^U>n?_5kX&W%I^70JyCsV#qT4pHk$Yv`B-@75DsW7-vXZ z-sGIUQ)g%z6 zvKqgw#6mr?m#+hXsx-=fy3Wx?{vc%d)Te)pJ zg0LF_DqKSd`7Ur?F53)+A$(D$R}&F0pic6K*hCaOoNWHS>w3QDdDEl?jN6MCd8K2s z-DgunpZak6Cu%hk0N)MKBNyVR_OjiXgg+3voR3v#jaOU+zrml`hy^4Whm%W?9eK`Z zj@T9{N<2#I=n^)Y{rL6~No7EmIN?Y;N4+A>1PRHb$+Z9k{#X=dAZ&W9l!|sHkkfD8(CcWr?8X?rN@hU!W?ec7XIqR}S zdFSoGzJUC~hVu0RAGT*&*oR(*p+zFZEY{VA-hr`rL@V=qAnA_Bs+U=qofcC+=$Hnx z`&YZ*32)>fwda{%^uq{SSYX91V7jyL0LV+#Xk&oo;U@jq?}YJ}U=Xl<`*bCEviF~= z(Y9rd6@L=@np=~XtY7avO0Dj!O>WHwjEl*__T<>PVYgb%fu z?D9Fz{lf$*sfMeCEvr~rm^9a<$*8^7iVp@p@9xtAk}Q8LPyl1`&@0Kxl`Y$I9rML` zx=!CK&4lMXJ(ic0F3Evj@pN0qlXMWj?2POa zJ)jf_?`=Cr3nqhRVhrCQDoz1gomsCr_1m1-4l91ER%(6DmMwnPYps2t+qRTSi-0uO zl(OQ3)Z&`0Wt+tazG|ABwIJwB!?rbf-uY;PPq1B(k{?bnQ4F<>&F#wCVW9IR^+| zkU1B*WZLC$h|+k03uh3bIU(-{AGfy;pVe?Dm$dY;64#MtgcuH~RmFJWy5S~W{UCSC zC*{IlrM2{9W@P+M;SH`SatbmJQkGrF#D`4k*dDMhB<2WE&3&C+SAqY1yuUI8d&BH` zG-;vF`fhXdXwD(^N!2V7W~>{f$u$W=?Gnt?3E3d_*DS7b3`?XEVgmiM;&+PJCKbvS zx(RU+!^;S6Qu5t|SjqH6&3!)co5Zcp+>c#5<(iVV=()&>A7H+;+b^-=Ut=KI?QE~z z%!6~dNW!MAeTMjBFMT&}lDkio z1Ey?q%FqYvdya3MlOLyVkJ?pN)=WU>GwoeNu^lI)ku!a9X1~2R6~?&_B$~r^Tk#$H z2y-f~L3x@`z`)apMyaUDb8reP2xOoy9qa`jM9U3i{xIz>Mn%%#>r#CkS>SB4n@duv zfxX+j^nXACbFM7@3veg6U4dxUAs&n@=q?3n8mL{EAkp)U2ndF{Q{R-l-$;R3_c`^= z8tz?3zCQrtBGJ-N#}E`AR(v{%wikA4*z;`SNGGp8o!UYOALU`&u>L-G{M?TlE<8I{ z(D1|1*|B~NDB>{+EomBF(_}5U1R-TCFoyfI1=k>jpk|T2#&yr1TVEud>mH4m`XWd* ztD$UvC+ECyXF>XDilDbh=JZpEtbl@P0zQO!plZn5s?7j1!YW?4b0eUfR@l#!oFO1( z`_s4aYue%7KNGShtM?yBhUdEXYl=V@4m*chw&%4Rk_WzDk!J%`AmTccDgL?xmZ4X! z0T;%XYi5@KDgXGDv)&s=A^(0@U(h7)AMaOC2+m(9avp4w$VoSfHxXuGEAba;Nl?3d zuJpG*3tQKW5`v*r(9VPzoi&S$3Nx+FHSa!BDp0e?Y%IvLM?L2~igAKAMK46k%PBMV zmzV7t~wpvkc!y1EDCk$3IXzJ{Ti&q36P0N z!!rBg^n7|UfF+lnp2!0OLLN+*D!vI|qbHl1L)UnjANl=M--OeKS#J67rtv1ovN~gr z_$lb<^g>|xWPyijkzjWmpBbICZ=@nH#rX)5*jX%TX!GuD6T09IvLWwYS-J5fY0W%` z=DRr{bQ(E!$JZs^e+`YC7cxQIO!1|Ryjf^)To-^eF631KFc4~+V9CRMw6VlK@m{x9 zK4=)X7rC>FoIaY%XW&1^!^dm;+DsV4QuIjm2D0))z$^y=uyVV7IdBd-?z}Y)^eZ|azk7JoHm?De7 z!yS-xzqy$kSTO*u%8Pt5p9J4{2=3P!v4JbP`1ZoXbW!Ie&cPbZb0=~k7yx0Snf z!_c)}zVpP2abagK@k`}zP%$RVjdINq0)KwMMd!~zf^X@r^Q*nT?UB+w?k5U9Vs;RE z!welNm}uuOO1wF{=&ZFxTqEKiDEOFP9F1T|+r@=rqFWe5vEZlZu#6cUG?%PGhWva{BDN<^5_S_r3MIMTAT5HAHY1 zR&y{F9qv>b7jf;a!@7lt21C+I=#2JFpQZ=2xXS?hxXB0R8eq>xPf#J(p4uH)ClG(V zc{SySoAOTu<+I2H#s7VHcNuse;}ge-I+B?h z|9yBv47_ClyevNj?OpKi!+Uk7+B>ml{F?rKc&>q$-!p#q{rm8S8+cD8d!*l@e;-~Z zt@ch0;2lA~#s5CMpBs3^N8lHX&j-81>uG#nXUe~}p!;|T$}joi@+X<{i+e7=^oz^C z%EjCCf6wKYeR27poASj+ln?mvvF_#nH{pzjd~m4X_CNv%zcKp>?z_ zs{#LFGL|xby7lKr$Ol}4|vbx?1=me;AO{00B^^?5AQAm z?_;O?_zn2m>khA@#eqI&=08*Zsi1ropP)Z?bua%Zy7w^uWH>d<`0p8?z1`vUgwG?U zeCZMR1nv3Yi_3q{l;71TdgOJ?2gkW~Teq^(Ch|~+e8vgv$)d*)Q+}B#U*sM^kB_^- z_%t8(K#x~``+t0z2(0+!=E&y|M_JXCCo<*(e! z!_Do-8}q}a`Mp@h?E2Pq-;^GA^_5pS&-g}!C+3jLoFnX-|C`^qu2VZhKZRu8Sq9-p z=5zardwiTygwlC7x8lX$a;~9FC?VtbA-x}tBl*N3Ly)EBv z3&+-EUKas_{YJMA*AG@$b<*+M3v2?;`h=$cQ6fxaAn){lso$2&JMt2ksS%mX3Q^mW z_5z-hV~WZ)X9|5g$eNJd!ezcgxxE*p?24S&uJ3IwPL3}ydVOl7igA5K5r1?10B;dL zwAvtNq&8SevHVE?c1vM2r=PRF%iU$x9~UYWnr!QmYCj@`*oD-|9c^E6vayI(!`i@+ zDxUZzy`e>6HAXo^olx+8wPc?;c^O^qE>tTV(-x=TNv#~yvJPo|sh~S~-U-`9i3bv# z_%#?f{hdu+FyNv=gV&naHY%lm0Dm>BH$T1zC#-nCQ}5pbs!!+aUw=QsTluCcsGtIM zP%O_~C4g)#pHMNqAa-o##ELr#41J@8Z1w0uiapu0dCs9SHg!#pbw^3nT8VdQO{!)G ze{(YV*s=RLuW;Vux#&4SjP29nbqSw{ht`K^fV)cA)VDZ%NfsQ4c5pC{eL&~A*yb*v zJLqi+*6e`5@$ai)q8EkS+*DPONbFv?xBZGjOyIEE*&X(VLNoe0cr_Td^FQL8raR1J zj{Q?m6d1&*-x2$LwxOWjBhjt6tfzj*m@BG+9(YkJ`H=e2?}2@KmoYm_d;LyuHgf;_ zHc@|-E$Yh>rQI1FuuO9z?HrTd_r86gAVNTiCnHt>pI=O(g>c(TlbMA+|kb zreD#5@cjhuH}a)O3tX@D4b?fCIWGRku_ohcU)@c^Q zzPNT5$|&K6=W3naneC#EZ1zK+f>FZ9%#+>aJ$I#pP8HjGL)oSy1Rs6~Lkw!m=9+Vr zGjaMj5FNrYC;Al-;XrN)RpPABt4%{n2X1mm;5MhF#0cl9D2M^djiClZ6KU@#9vu^+ z^e)OJugT+x!h0=;dU18Sp$?~pN7Ib)j{{L-#P8 zqc7xiIZ6xxsVlXuZuWnOh)RIihJ)wCre35yu<13!*$kh4Nh60aM#}SDd%fo5#PlKR zQ9(DG@N6KQc{>+&x3#nX!?9KWk}Om%X6nj!D;+6-rcIp{J5)q1^*!9*W=q^%+Bl2sP;*yCL2|aLKCblbv9+^OehWS zC`LjM1%#y zZ*=nd9{ixa!n^YfGexqk_=7_PYVRR}lrL}0MKA#q5Qkj5{P^#@&=jz_AMbCb8;>;c z#j7*uym&W)d|AZ!M6}_^`wBd0xAnvM;s|KpHqh*~Gfjs`zLhnns>5|8``aERckD$H zkWS>bqi_VVRz!~q+0D5x9>iYW_dUA}HAn>wQAew-_y+AYJt<5w6AyzvMb(zE*LDzoEhMQP$&$w zRd};csd$(DJON!7vOmd-PV%{hEx%~E;@#P=a2|I^Ywrt%^C!JyB{)wMtG3<*ZxNAr zJj#koR0i_0dRZNi;7=1Ff}V#D!rt)*K4=fM0zdW}K|ZDzy;y^C>FJb0hoa!#@)-;-flGvG_WMX&RIjsZ8+ znjTJW@r6&C^j`sH_?50vmsoLucQ&PU+k=@mkKjC?kJEF2YRUz0_6bhcfAxyjQMR9X z3q_8xSJ0}Bl*vt8D8dd0BA_aH*(Up7-{})DC9fD5&At?dC~ylSZ04;kG&W2>E`WXLoY)Yy1J1NR z2}e(B9UbB-a<&-LGlTZ~!D4RJo9Pdrtu5>lkJ8>X709iv6h*cEQ+*=*|j?r)Bg`|wt6TQR{x!pVk0mGRas>*gJ-SZ`@BFd?u{bdzoq6@;}Oo|0-EvpCawQM&VYbCI`pYr`|KSPz=JH zUg_*{)(ydZsO9Z&-w)OEbj>LO&*($I^vNuxHRas=0%9T3j67;j%QvXWKFp0~=EhyCs*)R!Z-93EGr9UW+GJv2w^-*+@*8vfYiNv`b~0ka?h~ti54& z2vEO=U<|r+dzL?mnv6lb$pE1&Z5U<(+Ggd&c&gpZmH^J7Wkm4Etw5Ex=1!)#DYCO= zr_N@THx6)iHcpW579lOU(hc0zsIqpySzjan5GLWo=Gmu#{4kuVnh)S=+22|*HkZKc z;VW9JbK7&Yy|*`(QRkZB3%DvaN$E^~NioJ>QjBFuk^UEi1f#>}Sc$DX3LCpMOn^er zODTcsDOu_Lk&#TZ%E9Z$6TvI}FkjIx%qBuvvvC|${BC(nd3|0MuQvVwUS)w`tvD}v zS;*O|t=u>0Ear8b(<->G-rmHkv$t}H6<^L%O?>&CTST1i&5$By%v3-v zLWdSkj81&plM8nZ20zq^5~EF7R~YB$66ZySlOp92BViKzXMde}wNLwMacA>RuJPMx zf718q3)Hl6dqO+SQzN`V9(%jRkw)u^4@2)Q4K;F&&y~5+6NiT*GtZE}BpSE9HrxeI zzRY@C4SX@P*vRP-x#uLW?3LNoRk-r($KUXZOpAUtT`ekwD8<%_+~mTk=voZqBG#Ge z`3!hfmRJcPk1VxT)Z|q5jeb~J65aO%J9;_Jp5&@(q{sWe@z0$AS2iiia)Pq-jlIQlLJqmz;({b= zdLu=;`}HzRk~d59wX7dY*J3~y+uJN_#l1HPm+gD|u4y!n>1nFe@DKM#_5`N}I8S~V z76Uok!<-$_JUxBs= zj?z$KCeJ)^Ka3l;TPHavQgew?@5aqnl(LrA25G+pq!{DeR?WHINr<@{ofquXM53J9 zlNm~t{i0WvJquqC&77k9F^x$Cj%Ugz?|I5L+|TwEhUM#(B^vk9m+>_Cr*oc0#v0ud zTK25DMk(GL+sFtS3LN;VTveyED#heAX1TvmN!qtTQZ?|M+ZA;N+#^=}TX5T)yqpH3 zn2w=riAwQX8vOc70&M56UnqoTp^V`ivO1_(j3cl7MH9#-zC28~Beus>o*w;syhJvlL36!*ogA$kBjI(856HN z=MkK7O*r$CX&(!@(p(H8S6M%P2<(|QLdjVnsF^6n|BHLSKIuq`zMsw`&99GgC4I3f z)mcC8k2=*<+1EJ`!w!iW%#=la`(cmwD*IXS_fWrtyv`3+4#$^=Usf#6VNvW}x+-Zu zPEVq^4nmV37RddELu9?1ukp<@s&0M=B4O!~p~Tf$iz%U!*jYvdn2U&6onZ0VX=cXC zNFy`1SNYBXYT*f*K8|iO2m&SJk!wqQS%h`MWV;_P7>TTPf=`nmy|M(|WT(&x4r0SF z2x{I%C~SYb12XrkP)@@lIWB|-ypeXU_M)R0&m-f_GcL}$tC+iUxG-^l^>?xAoR~Rd zaubrPm@M2M)a-{=Nck$J3_I0_@(KG@5;Fbb zcv!FQQ3#37`y~8)ZuOzOCnb=r^#E$Tg*t<_I^z%KXP#;jsmgYnV;nyJ^ZxX33Zz#7 z&gj3T*%Bl2hZuE#c9HcL* zml!w$)FlSuJ0u1Or6obYjnG#7PspR>eUUMsh)$a4u*gK^Hey4JzHqPMiF;hKkuLj! zcZJJ|1H=1@fOR`xXx3N&B-%Nk+K&+5Rk=A|O;s@mnRXf2L|9l5sUs5yY#c7kSP&Vn zmvP(`WYM_b^bI{w8j#&tK3B>^Dn54$KT=F4r{W`}M1(ahG2NA>Kg2Q5@R74FU5cDg zGn*%4GrNd~1{q{nENn{4T@_(sW=o?kK#6bOe^|_($b;6R&^eS4g>L+pf0goH%J|hN zcv=IviVx`bQyHM?&3sLTj-m{g{eV6{dCj?bIo|o|eV@}NJ0q*o^LUp+K*tSEQ!>z3 zCAs8Z8;nT$`Z?Yt$JX%6wD-D+@bMY#*+lICEXW*}Eg#LJ?=@ZS38qQN6lfmlO#$Sm zM1^iL%KH$PX&An*gm8K>-|1G3KM5(u`!JN75O<4g3-|I#0Ed)vu?@YP8}xGe4xmFn ze_p%ZN+3k|WEe%tsaCiaq(}W16trd&Qb3rxLy{j^+E) z0fgDtH1L_5%n{uE^EpjxQq)j2qB!#>f8O@bmx=~pVQ8R0es*@l7p0J$lZths*^^WH zF^xvg^C!@3q_*;7GXo|!H5@uUdIA^JbGwnzB+1v0n?z)aD2Z-oYb%(K{q_G^f%_id zv^^kB#4N`+XYXSNqtyLj5hl60LZiKxv(EbQV_-(Kdv?Y5kSpw^-ohy6XEk%VQ~hM| z%@3(*vY!30$SuSWQp;4{V&=r?aef@572E;kr^NQ!>C%RS*7Pc~%K7`YheOS9;CUwQ zlOhtWH({`%{Y^Y06Gtl>7wdFCG|*XRC(v0x=+jFtOQ934d&Pwc9>m+|F34!Gu&MmzF?i64|hq-uJFF zho&_WJ!_us^6SK)?sG6WzY7LE)%^E2RPzt!`8OgEVAA*Z(RhI4yfdFs7cQO55P5Eq#+tKcaGTxMD|(~*i0RK*slBnc-PYTQl}68zv%%n`y@DxJ6frG_Mrcx? zQS6A}pe{Fya--|9r#H`W`yM(taFvuWRWw3$h?u+C`}%9;jf>$M1ln?O5h?^x-t_{7TI zH>np<`<0-ERBqoXrN;O?7A~&?k~tU4Rd6QGcaQjc1AG{`4()G4Kzm5Q?) zr&D`os!2(ospye{GMOs1caq3w}?hdZjzZ|BGSWMC2Ze+Bxyevs7~Md8X}wJv7-2`BF(DdMG2j&WH`HAy!*_J z!5SIQkT}5nH8SKLL}fX$mkv#ikBlWDoWo})SO=G`@z=pMr0F~9C;%p#<__kzK_Ty& zW82sbI7WbEw%5|gTtn_wvdF-mZ>`?6zxo;kRp)s36NrO%dNj_A+kimYcL+oA=A^sf z0eYLgUC3O?VJ40VJL`~6tzv)eCzLp!w7eC@%%+2_IuXN%u=n-3hAnjUh4)jGvkEk- z?}4;rdV8N(3g#$D+AHZ?v6zt)9g;)zv0XY>8@n2AY;{p@J{XvQX32PDtY|{E;@A8h zHZdOjv8Mz3QI==QIf{gV&X4LxI`;p1mk7ctUmiig3PKe&KQd}QDEy!@R zpP|@iHdAYAbdl-WaD-m^xwKTnh^ao%gh0AtO{0`MI~lRVAYdgSWOMdckEX|u5BOU4 z%xq%pJ=BS#;f?r@08q&W@PFx-IIrehHf~7ToG}6RrR9`+DTu<=QrIu*jV^*ciTmMr zBx9+&$}BhYFEm_sC3O}XyQ*&kiKxKpO{jN@bXpR7r;-WAA~DMaNqZ|ik$%^QHc0h} zg_ffbbJE5o>i>7(OCB2n{U-UeM&+^J_Vt^{jqL?&@5B5UJZyb`&0<;J;4ekn_|Va zQ{3fVDwOcC&_cmh#y}5Ae53Jg8BAn9F4_eDVw|^$R z=SX0b5?})Yb03xRAw;> z5Qw;QYW@u~JDP8xMeE2RG8z)L1YZHAVHa^9H+}tx7}d!i+RfuleTRqPbxRsz0?yL#bd6=5oJ6} z57^+w*E^KntBRa;IKQznpIu$H-;Db}9iI6o6X5J?J8cg%X^w8 zZ1X-w@2u+O>3|xtc%?{nGN|F@;4cGu*;u&R-J!ZbA=W$9Thl35hT*QzCp9Xp`u7uH z$4boODK*M0=qKB=t8!v}z3bk_{@{$N>T!rJz<6LKUZ&e@vjr2f%^plnH(pRCU^kPi zD>hl{2nJAz;RV=g1cm?p|~L()G&h1v=0%T=k@sl$CDN=A3Ze;B4M|AG_z zd1z1DyPfSZ_jjnj)BQwOgR1wJ7b$Qe42J(QXnL>ceW>33??2UhnezMJO@1?NG=5S*nM1#P5>Y{@fEK zdR=V%liq*C`}3dGxnBdY5l~Z2;MtwcF`E@YPxNEzO}cmSlw4@*eJZT-A&nTu zm&&qdD^IoV(-pLXVtr&KWG)p+XENDQKa-!Y#h#bdVy(ot`J}Mm-_Y;%ep~|Q-ONBk z_iVPI^^lm0Ff(Kr~I-5aWY2~AV*7_>U-Ig z?vuqk+CT8i$R@#g^}YF-mX3GDcFWUNr>HN=Hr?q{AH>WY z@*7Gs!JDfsv-#LX@TQQD$z;5!5AoYgyvyvcw|^0|xwjw(ZT^~H;xy+IV}I-7Z-E@t zb?Mwe6H14*=0PA}EAc&ZqF>43JcPaLT4&bB?l9;254;B-lK?q&JVG(nrrUkF*YpYw zY(u_V-0MGZV{PuNkDXoDKjR*kv=<}GIWgcaT*QM8wr}E69JVlZ$l+aK7u)8>c4Uq- z`t3D&?%iA%ZN)e13(a(mCR6!0?HVZKHZE_vICih(;{EJr^>%LF=1=WUY&p z_3q8v;H$30ke){Xz_2;UAP|#pN7U7CLCUe%{WYcB+8s`w4r&--rUxU=+zb7#qI`~X z^A1VB=l_17-Nbbvx>@t!14Kp(tEC+cO!c|p);sTe!qJ>m&JEwW z^*ho~6{*YU<)dj4!~J-7;ZmB=@?78G2nEBXeUp3h4r7x{iJ^Q?>2!ZM6RH%lB9IKw zT@u33sNKJptb?=N+Sf!dG4}lD@F1^wZF-s8JKMtE?rmY#I*AtqsVXcsh6ZlUR=>ZT zaR2mjvHy|8FKx&YpKE8~Pv$Y^Z!CzuDkO_vG%}Ue`8LGBYUp{t7vFy8$|H|X-A8+^ z#8QZD;`Ehu(}naA#qt5Z(xKD==}-km1Tj%KkU2$zm8Ur zREP|CZ(tb_-2Q7F<0VI~_m9CQA zt~6trd2D}84!8PT1|&3*O0?f$Kr?ach0E*La3dA=)U#9*tIZ_Nrwzl{^3#2*Kn$NQ zhzR+Y4jLVS4jbmX8~rxBiE_LubqkrUgFT0nO}+j+o=uGH)m(fVOj&s${we%A2Qnv$ z-?BNZ#6N(euP^f3G1qQ0^0nfC6_?*0Koat(Wv`gd_X^lBbXt;C$1o@g)tnn{K@9M0 z3>9&6G^#3}sEv5bG961XGTX+=x`pwZ93ApXwGGNQ-}%X3xtB0@>wzOJsl@4T;yR)r zi9qRhG>Bvp&?W8a7f3C5<5e|_Q$4RAVeHREj^X9>aHatw-CO|TCHVIJhY!dU z_$dWaCbJ=C@APbn`16|1t1#8k7e+gy3HbmpHU;HXb(gZTg#W*y>cRZWhW^RA61%y` zOUjx^x>l|*RdMVcR>r>J-ro;ly4(!=Q>iqD~P){RMf!;c+%kF>HBhB9OJ>_<3 z#?>@C>tk=w!)outV|$ig!&D<74_A%-En$IU`F3-$!%4xwS}oSA|FbsbF^9#6Xz1ir z?2UevxvNvu_k`g-)Nkf7HiJ5*^(H1UqcGNQ^B(%HCb4aRZNbY!otsNUKY}$93bZEA zUQ^=KZd0F{8#QXlXC>4{WZ)VOX0I7xX8X8Og1L?S-mVRdkyb?pr03q?McHTNC#!p( z;m_$Ki&({-M6@$53+U}nb)&LV-6%8F{bQS^x||zwz`AvSl~Q3U52n33qJS~G zxwYGHXxw!3`A2D)(9+x&r7yh;cGq|>+nj!r$0iX|2QZQ0D9Xb0SCCXi^Km|h5@b|7 z)xe$vw~Y7h{H;3egUhffMI%*=zG_C{SXl?=snrAQABM4c>wb7Q7Z$sTAv^}3H7*!G z1!3d!9|L8i)C`UX$G&dtITty-5s8MgUtril{ywpPa3kp{ImCdHISnz0<^%a23qD6z zGl&AOaJg=sVA`yf zM9=ALcXhVimz#E9-`Vb0j0EZ4ZY+;kxGRIt(bbcibiSpe%lQ@q>NwI2Aanqdd^c#WA;j+$(iL=OjN zgM1~@EgT5sQny~3=`a9#-y$0ol?I1TO{$gFJWnPQSPGS>WBua{pbQX(c`I%vlp~Fx z>@d?1)^_JoO6T`W)hb${WxbAqYJWovUmmDIl{y|Cy+&sMFGRIF2dEkiDx{3e$%4p) zX>=tpEoXS9*J?&%7`Ydt9&XG$XZX_;2qtnfFJfO?L!`_6NZGRxtN2M!YR44_p^*!L z2WB=l`SNHic+K?w^(*z)O{0uFngRwhAnIAJvEAP6o=vYA9ZJ7$^-+ed$7BGgbC6q1 zVq_{5xCva1Ly-h3_~xOdRU&T~E0a9QO{$*>QA#tt6(2IDGIG4QjSQ8vXR|w)+|gUS z+wMUA>YMgPz`s%|AH*X{uJB>?R7kN!NX zCsQwKb8qU3I(_Wm=DoMRN`9g8ZHKUY~xI5bGxI*AIz) zks3okc_U1srombI$uq8#eqpno+?Wo?cR$}iX(G$CQktx#dp8pDt_?k>Nvc)|-iU51@n!M{zy+?CzwPJmJ4VSo%sq$OIN4u8 zB6x#tgO3)N1I57BaFQ2fqmPPl@!?fMN&LfOgC6t6al;7D?{NFg>!gV3wB8W4c@>ol zV7^XD2h2wR_x9mab+n*~T+G|0CbI77(yJCk7LaDQA5N*ia`61-FWV*3^!!8Q)N+#< zFI^#{Q~=!D1Z4V9Qf3BitYpiH6Km#JhFAT4+BlZ<5NTpyC#7l=qaeId^0WLhfLu`) z0sp}V*tiU-&y)OP4Z6=_HTEA7q*g-RPJvQiVCoP&*S9i+gO>Qsz*KF@?#4pkmtA?Z znj`>`ZU9`C?Z=VAcw2aDxA8`t(6I)Oc%*@{0emL}T>{M{0PU;hkf1cB1yL3g7|KVc zgOEP0{lxSl>1g^Vc{~xGIPeSc>WmQ>s-mz&t7|V~T?g_uYEEfHSb-{1> z=i*oRnfR$(kN82iqN$4|;_7q0shes!P1Pi1?? z?*fD0%8NSbxAt@KyH7E}d+cA8^YN25&J*KT8hIB?JI3!HP=vUMQ zzxAJs-v_$Ns7L%%?nwO3=}yTG{Eqz;ek$D)eg_r_zZsRC^xN>c_>KQe{8Y}z?}F}F zeX4(N+j%7QRJP~-y~g0Tb$BO!n?4u6<@-L1ek$kVH~b6m+k`gOy?0f%XZ-&1Q_*i& z7yPz-E`EidiJ!{(_>KGm{DyuCKb7qnzkvq7MHhC`Z|mpc7iA~9XZ}+;AHU0mpBWz& z>7K{OJ?L}YDX7vt@!$0S68+jLI`Mn$bMf1vnX||7p>jTc*L(r}_P%o@b}HMQe)ZP` zOGI|V|9-!491o6oS!V?)YW=nDLg}+^SbmmXzt;mDmQ51ruywfTTdUV3$0&@4HGc@H z9NwCm3xHw`)ab=}?Wb31>(O&NpmAdPjGPj(x9Lis?H}NV#iQhqUfb+7{dm@Dsm@`o zx*fY&^0t$yaiUhzAF1~7k%`04v*w?xXBNJ=yJpcArhC~KaBndiC==IF~1Mw z#Ku3$nj7wJC#Hkca6?Eo4_NgDr>?@@$*ZJdTlbjA93nI-Ao)r~@Q3~g`B3TksIYq%|ta}iTGH^uPogx z-5$reN!GkR)WZP1P2Ur{Q@MO;??ww_*H4A}oCdCj@aeha@!K^epo|Kozo%r`SB_wU z#c(TW<4tQmpA!g-7`+sk?m<$XB1H{~_9l|xh=c821BPDheez?$ zo81jw>s^Ak_})*!8*(JP%5NVD@An4YIo;q*Gw|{k9tp2_;F0jgUU?+E>kYiu&+FRW zuNZg}e5@a;Xu2@RR&!*p^15Q?0GnWMAi*EstyTb4Ie6qb}QLbi#IohV!Q0MVW*9Y6}@W!9P}^v*}IJE3>BEwwUZkB ziha1(^pis`GcGIMi$;m#*O-4HxPjTb_Sym=M_RJsU){4vc);J~a^ccP>JE_il9{OQPD?Ks2|BVPKj?+j!_0n5zw1&4{jU#&5EnyBa{ihnWn?^b7RS#VgJ<-{SK0~|U zpf#b!JkzM?*9Z=>vvWU+6KrH3yf@V15d1aTueF+ZEb5;9--6P#HakxDWwseUZF4qe zHo(`f5|O4$6SW^Nhjg_KlOn(Q{A#mIdt2rFhWQ=pAgNDPtJ!VuQd;)3e6LX;gZk#| zGCRFbMa+i4QxT6s_{?tL$FqMV$s0Zgoqt(mD=8QbxABAH*7C?E9+(%V@RQ?TmB~JC z34KVS)F^#qNSfa~%`v=(a~gn-b-T4Uy0D$kq~pXR%gKaF;h)CRoZ;> zE8Q$ne0o*`M)LN5MOUcTN!K~MN~IOWO$ZwZSInDtnIpnIUy4_6JW@#tPRbEwd&KzeDV1m+h+ORxS?z?# zY6q<{jq{r`XRQbVJ7+nh^b!zo4y1>{1Ku&XFJ(z@ezWIc2R4dii-y2!{sBF68kW&o z<*tfT(!Id#eTLX4b}{=1bfC5+xZ!;a!>V}rWqHxlKkdJP%DRS(%EaOgjm{n!4kdQa z?(O!m$5i@9e*AHx{tp}!KMHXGaJRF@Wt9vq5&tLMYEPD@uvpfoaoG*Xa8ehSiAq1ed|J18gJfvVHbyXjYGY3D(R zWXNmeIrFn*u6MT{{&@sF<>YNP=&_p@dw-oLx>lWK=&Ehaa(oGe;^ ze>X3BN{=+uxdZY!-}UL&K09oWGt`sxk<=OH56Q6i*BoevOO!jRa&~Wf+egl*N_$&| zziw}zfd8vze+$tH>aLohc^qsd#{Sxgld&OANnjQ!FBFoX!m~`KVF81B?EflFFX11FFYFp{y`7j2&lbUOb?9Z zO7H!-qFwYWhIZAAjXDHTlu2tU;h^K+mneQ*YXC<0K7V`<>ps5E=y7~st%8h9S7n1y z?p_%ler29zpTalvB&{>9b`dG zVio3P!h!v`0U5`NT0~5GGs}MZ_|e5YE1VZX`|o=*=Z8}{A%wIPSSIpxyxj!gi>|AWT9Yz*VVtb@AKGrq3)BX8UJ36 z$2X{Ba~d`@EG=*pJyMib=S1{tB_8H)Q<4q$B%k0TvomfiYuXtHQq$QcHo!d%WF*fZ z(~INN2n8v6e-M3E61^6iB;82PK@Eq_j$KMf0i75PcP;V*im1DXW66x3 zX{|U*p(R_1-j+P#t)M>o$sQ zxy;EOwz1`30ks?!G)2=^o2ANka~U8+E4hRC@KXtUy`~qzO=PAe?d;fZhBJ<=|5`(p zMbm!3TInJYI0S(Q%jCy@mWzqoK|(0p(glS#M<`lIrLh5ZoUaIhlL}_mW&Kg4{AT?s z3Ulp4$3&mA59J!$RkS%>BaVO%S%Utz%A(E`4IWGRgg>n-zzYlv;@27(@a}A}!fmG^ z1ETOZmNq5_xZJwuH1+nyPMbgSt2(u$QVnisD=n#K32;sz0niMA;Oj{&SfB$-9edjw zxJQh)M)Sw8k$)5m?cVSTwm@~Th*NTo_{AL%`zGC8s$Q_)De3!)bMc&ajOI2(h;&hV zPU=zZu@a9^62h0F1$=50?_b0Df8X7!)5XcJYvwUIN5_)%CM46<=-6nB^vC`6eGYlFJeHqYH;Uz`}KUOD#`VB@|<}ktCacj+wZ&c zXQ}U&mvrg7X7!zs-}gMARu7QgFHyMt4QGHlK$6fJ%^wgqgbzlOPkaWV2>)BW$Z2Vd zIk$7NNHok{CBEYzsqY77&%7w-=;&#j7l0i0nFMx8&rgpdnS$6*ECqD13-k zPx2<}SZv={^0D^2q`md08~zt1^X;~vDfB( zD}D0c54U?;@de8wEqaql#p!uL027_oFNBNosJ%mHo<4*WY0r7&P^#iS6uV~i>~H3n zO7hbcsv{cI(X~Hq{Ha<0fB7@|v;K?vvjmu5)Sm%8ifK?u7kU&Kdg!FId~youNS_|N zagp}cw{_AZ;D?C!@(+aUH77H;vc1nVarUZD5J}O#ruQXheSCsrx#p6P9o~$d;LS7e z`T!5q22DS{E7Vt>{3PI~i@FpwT_k+G%S_qliwW!lE3|W}YT60(n%3GrUxL}`tBKrf zc#@+n9o^f>-@Oft`M{w5(&;Bt*6?>%7?+%`NCV>QKWAZR{h}Z(tR?9Bv2^)Rm|_h4 zUFtnPLnJB(WM9vE^uvo3KN;ST7k8aCe>9*>=<_lKc zuc{!KI#=C1R)I^NV{Rh}d-w0#Pn0XSkF>5*_lj=o>f+B(?d}C?Q^m_st|=xbw|AHHh@PFwi2>cTy@I&4~JsbDDTyHneox5V-ge+aj)yEW_e;zEN6{i?$qw;zMY@D zO4FtZ%>yUs(xMrsB?}YuhUEO9>E|$RBh;^%$$M>rVspcizTaP<_;82B0J7_>=XS5J z0UQXl4tYMn!2c=mKbzm*U6&nq>u_J{7;iL)@gFne-!Ff}c>U?f!@*cfX3GWD2lObU zPVKoAOqWm(#7%zs?yn;mzuB#bjwdl5$t5~UCH~Z?^zDPeg>OcGztG^esz`ypWP)V# z^d^41b1yK5?NHSftQB8k8TpJ6kl&7_6gj1~bT^{nTRev`l(cs-$2f6g<%7|T4lmd| zhZ$_%h7guLTVCA%4|CrFA4PSxzX=O07@fsNO*Pu6s|KY?lq%6!1I-4c34#(pMMcF_ zTdEXyAzFfovkMuA!L)%&l~$}+ZN(M^0p*rJNPv0?6a*`+fT*)BDjo|`@<(EA8-uEkeedkNk}LSm(nz<#`I2@pmChgpM&D&wq8 zOhI+o?|;TqtT1O$@f<4|CJtyG@G!9FJ3SjPm$Jdmt{>kAFABh$UIRRtb0y{?XGq`{ zC6hz9)#deV#wiIBbyhpGRGc5MX0*$@7%fnP`A`v=3;*}BpPG*j(Z;7@zgT#kM>%k3$O1HLUiIUM`hgJiYcr<0rBo}`8>&Cnh?uI!88vQQ+*wvqtfYTHKC!rz(zT8)D!I#5rN-8O6@4JP5b!a?Z z+o<${1w4OaZ63(SB;L+IW{}T^8}=B9Wu$y|qC6=$iz!m@>`ysd(^fByWVkPB1AN_qT9hYz zB&`9GC2<*@2gUO)>94j3f(vzek68}9T#<$2j`WUl7I@Y1 zcf*~Ww;wa-{!S|AO-{}}%nASK1mxi$rfqchd{g9yE%VzWux7t}_15pm*e2D47Yq&H zo^vFc=*BrXfNua#Iyx)bD1&A#Z;z{{E&v#!2dn|R!$q7w~r2-zi^ITl5w-)>d zntIKlspdoemc5QOZ)1b|wQ0zgeR#qRuy9%L89SD|jDmtdDtqd` zwi%ta9CCUn`ZbIMs>oG_n3Js9$|AGS*O~q)DdVN~Uyc>8FV0 zSPT3g;8>cf2-Xjnr_#G8vK)l)^o1?p^%Q&Q-H^<8Rb>fyj$zLp7y|G4F|2q_WXJt0 zAKqj?iM9RczqFo84h5phEd3X}Es*?{%i{zLy&4+*G>eEsoJUuVnLW%BiwqrOhYSF?&`v3EjWg5MCf2!(L2CrjW71IN@` zZ-ZQ^_UZ)+AXnsMK1yRR9&+-Z%31U}^%)Pr=!>nmW;lhXU_6QQ*U|qTU|t-IQR*}E z5$kLYo$Yuzold7MEZWs9kZ{*%G7iH+Omsupc+s#d?u(y zzQ6q$5(_0x<=ju2CJ_AAPbMiK1mTqW;C9r8GjFI(0NAGb;8wzJ%AJ=+cpKwVFX0n5 zB?vOqjc|y~A|-p@B9G!LF8Mjt3T`4zEd7noz9dDPH{xIhELEJ`!z|on4Z(elzrqTq z$P37xT{k(82R9ULHwtUBH%z?BG%MjeT+?IX_ZwGr3TGPOY8>!^bsj~v6VJ--Q91r} zzV2a;M+9gpB7f$o*95D>J1T)c3ZO^JTcx+YZ_%pS_G#Pm5ea zTF+7FGxp)^{Z2&VgO zqi~6V5L9C?aU6qdwaD3!RkO4feNU=~R+!!iY0G>7qGT4K3!q}`S@vg;562i5Zoz-^CzBsN#T5CxC9yS(lYnI2H(DP z6B6^aVBse4UtVxNMWb*NN`S)LzEA^E=0hY!ea0u7W$HXcya1JT3NFd6pEwdv?hUu}2M2kHhxx{!6fOD{IGfd?_X7OA1YT7QXjO*^FneQf zj3$7NahH~*Pf_{`%jGh;jaVdX2%c!bCJTds}+$3VGKDISOJgfdQZo z;R33> ztLo{u34bjY*ydh>qI_GQS38nLfCcG1Bn>BGprRDKWJ78Sf|Qx{9{eyKm%+0d^Q5A@ zK%i$sB0UlnGa6A)pSNkG>ddBLPJDhCPDE3PuFrczS~P~eA^SPow*%n8eFlhn5gWwN zx92J&Z#U-%`WVA@vk?TWP_aa7H;ts@f_EG%(k=A?aW-BVsR8?=z>(%_7K)!33Zh9`#+JRSvef)zXFP^hyBiD7g&{)hoJli?kv+0dT0CMh-!GASsOBJOYN_ z9D(RGwBqP#mSG+oZwsCw?(rs#xnt#o#hq_IqnJ`Ks~b!(2MvhmNEquszy9OJ3>-=G zUo_u-)({CejVZ&h)m{IAXSM!=4{fH4fzNj9KgJNRxme>4yfQNVf4TnSf$sr#|84W_ z{}?O?JpU0O&|Uw5XSM!=4{Z?W^5fLIi8o)@{~$j?j|_zPF`kr1ouLj)JL{bPE`Br% z1)ZBpTlldF&uaY#AKIYvD1N-`F5-25=l^wn1lDpesCE!Y6N7kF`hOum4k{1?R!wT* z$HjP7>p%F=27yP-|Bfd9#$jF#Ix-jI?Ej+q-#K&stLA^}z2z`7?i4U*@ZtZ_9`P;b zfB%Jn;I~`(q2_-F2>~}g3x_YTr-VR9?lwVMC^gTVT4&HrA6 zGkX3v=YP+E+cE?KHKgAA7?Fi3;CjcNV;;EP9`MgZ2;n9t!fy}1ot@i~#1U+oslNc@ zjy?XUC=;hs4H-G{e2hMEv8*GXlv6KS$S~keZT;avCp`bzwnW8Fh@vQKBUY#*Xb4v4 zL^2j{_uN}^5Le|*Kg@Vl_8~+AQhs9;%;bO^r&WI@TOpovD@x2SEV_;GT?P2yf%Y1o z!Nb*+vTXxP&XdluyY^jDMMv``XQ;Amrc5HgKG1Am=C;}rUrDrorL@1;^9}9Kt8&}l z`5tj0^P?eWo|r3s@(-*2_p#_!RbmvHYNqtY_6;n%$H>NqeI1xMUTr@s#areR7mbqs zyX|*4pLj=>ONe_^>B>sApM?0QcU#l4pJbnL5N&7a*iZ71*BUSTNxURd%YKqn^M_b8 zuj6d;W+R($dAXUSyIZv&=|uNya1H_o4^8%By9SQVvbjUV-L5ee-&$?g;E>(O_lBSu z)mmyCtjIUM&>-2YAu*EyKE6r`T_t-pWbMTW+;?XT_lE))up|b}i%?L5vD*<;o=4`4K-;{BC^gZDN}Sq5`u1ccXE7XaV;Dd<1O% z8DCGW&nICyGIATRx4fGWi;nm)6^z`589&B0DEkjmD8YY=ZV~z)>8AL+Uk6wvu6e{C1!t z%HhvgB1Vg>!(YssV9FaE_gjcHTbKaD*aAtJ0An^}cc)(L5%1u9L!@Qshrs)mo-)Vs z0&1@hGBd{9vdLhy7aJHb@Zj)fh7wVvm6sqYC@U+?k9U(a)m+r{PY zBqT%W+yuYZjbMKVoKSriCF=Wm2lcVPeeDTS-+@EY-<yYDrdf+;>`%&Ql|z4#8E`gH1LQ~N+&=W5r9Xr4lOt4R?BrdUYLiyuy|EM(_q%Qk^|F?3Vw-hF?2A8!t|ZK8LRy~uEcdeG+U85c z?;v;`f1{EGArgIzWS%sbE&&y_Zb&e*F?5-JC~3)hln-rZKIG>?aolv?n=D}D|itc#^S%ra9rTLkS zWMBpjIeVIhonKt2lWSn77VMIH+yG9Z;wgs`RL9YDShIpv`YX90m+Z|Nb9$@!pq!Do z?zAL~@BNcja_Sv!vYQ8wh%OIm#$o*h0bl3}9ENP&*PwshZQ^LX*%$hy_SXYe=#&Pv z0RZ_Nap$>fK3qi5KtBll0KU8x!93JG@g@rg;$iJ|%7fSETpIo0CA6|{m{>Hq*B!6fL*dev%BkUI)(Wy^G+^W>=zPLbaD#lXHVj*?sh*Nf> zc%{$ng{Xq>A``Y|rsL3lqAYQ$g%p%)!9vx91V{14;E-OD5&%3HLqN~Hfb~&zxWjG+ zE(%Dh`N-F8PxglJr}1AUXk>?+jE3hFvJ2MlLWOxhGQ?>MhLydDG zRd##?7Sq6=bozKE2)Tnx?1|@l@ymlZ$KaP5X|#b@Gv|A7>ZTU`Egx_?Cr){rjz`tB zxs+feH5vj4>Xo_rDW}Tun~xb-NpT3zZ5MM1D5wGJn35TdM_2nYNj=%ByZVdlZBqCF z&^8C2t>3H?1UeT9dVAnK*6TUv=t-rRs9%9gpHNS|PQ-Y?$}9MXA#wcJU-yuSFUhP$ zc}ZWq+!CzX{eK1(#w!*qo$cCpAsvr!{S^tb_y!WD?-w9rC@=|V7~|I>1L&0LJfaon zNo&(fkc8gVo5mROQhR&~h*Gw64P>jtYTgokH1+*$-eC?DMCz-} zScQqX=x1z9oqISIt0O=)tLj6j5O5~xml@9yJ45oLE)>Ke$!$+B1fCgwr&}Rbb@cOc z?nZPL-Vw(J)Xi?3w1{V}3?2t+rYG5`i5^x6r8tPY7wJ@_$0AK$8O@fE9s^#%qnBq9 zs#6rB)G+!F!7e|+1F{D6oQuInH#3EGY5+V?Pk1~_&ch$%eElT+YSFFu8~Z2zfNycA zA@e!6BA}Eip-tg&G^i7YEgmuRPV%&4Graj@-YT!hF3=;Ef~CXbrOW{p+2!QP?4G!QRjb@ z7;@g_?UmB;u?FPm@)=x4iqfD~XAfqO-Lpl-{;^ilhZ>e>wDf|f;B$Z?7e6BRWJjxL zg>e$({N(yBR9k9<5MQF~rxxMKi!QH4XCSk{Lte;Qhk6vVkR|LFUIAS=FNA~3GaZf; zUDtB5u_3Hjr;~M)Vx?^Qn8(5nQ&E_G=pW$A;L3;loQuhT92_VM5L(wv#>cz9t>2OH zbhW+|B}%*0cWIS1ud^ri6lj7|xE~{F z693xi+wDK5Sl{`%h&2h&fzCY)*x*b8=VsMNC_5g4BiEf$WH8FMbkAi%v=kVxzLw5B z){9=eLw)IBQ~svmhf^qA9wQ6b$VyPfbieG0uPQ-&9(hbD4@GuTtdd1kbxN_PLIbiX zwRb=j=MVu^%)sQEXz8a=$kEa)Zwhcp)rJcs{AL13&f1h7%eQ505*p4xGUk&D9hqMN=s}?94FF^aI)CU@CvDrux4~E+Wb!m=SB~8;( zgJsw-n*r1N#loUG#v)qNy8vod(VHbnZwGkLTYyKIJ>7-gGg{uh{M-_$48G#6@wo?X@=2jduUnr;klI+wCz#|u5lWe@jz6_axQY!iqpfv;8=#7xh zTw^<_71~AFZ+IDMlV@M|72GGm{*z}~>_3)^wX^?q$WXSl4|}Zc=c3`yL9&hEA86`* z+q_eTKhH7zze2TE)#W&%($UpwZx%q$i8K5{B}9NZ`A3_dhmNGOBlvA&@5eo@SkObT znIAlH`1EA#&AgVTv;^f-O$RR_u%0sT<5)eiPcp>7lRravMMFQ3h8_sjqG6y{O#N6s zV6zzP{GE72b)<*6W0s@G+e*RJWyfJhmA&7Jf=- zPK-CWS7xnKc0JY)sGuKo=*Vm0-9&riMeJPsaqas+$G($8ERf$``)6QJ+4pd6D@%L_ z`Zln&)g>q5U0&;VE zeI{6%s700B-PQXpXVM zpIk>!?VT!Ch-e)0GK^CJa5}vDSoPs?)OF&J`T;5WD3?W$2-p3NM+xAR4ltSwrj7w| zwt^V6XbCzx@_<-~@K3JGKY8Gvf%dE)vOC{JcUoZpzO{myq1^U7B#0Lt>J3ti0&08V zcO-r@@jDE^0sIcZF9ujH(Gpz;xf~*aTn>>yE{8}Umk>$Fb(TY}{^I1pYe&i#;1*ykf`5nB!sv~=dSf5h|!kTd6dC#LUYT78%Ni(9^bFcRMnw0vj& z`1Hy);}yjJt|cBfY(G}~ZxWi;qWwW1Qy-(@?}9Riab(@L8YUwC7s1_#uJ{rU-~j+RaXj(wIqo_tju#5bg&^@Oiz^fHJH{nYb;yn1 zUB#}qir<|BUJHMB34L7QNW}CYeJ%bv;(5;{USR$Z{d4?YA`HpC_P99-zc-ZY4k!RJ z3})ggHz7xzPVyzi9wOBj%03!m0PTi2Zx^G_^o{YZFc)uVc)mhA&inxa%P-)qqdzj8`2)#LU4cm#a8e3+1#okulS$se z?`Q*_IIlbGSZ}Z?b1Cbg-eAhr8^aHY-guIFV?CbRj1ud07U92d(i`mE3F{43+FEZA zo}=`}n+FM)ArNTMZNNJ92HUYuy$O0_5jjYg^yNs$Be3rs`Bx>_om0O0;6K{i$0exg z8~m#`kOjD=ozvtA)@_-32mh+qMasVl;oyK{SvNLvZ2yX1?cj~*jPkD}eGk${`&X}A z$zEJ>R4*D(h3j8!SDP&UX^;z2aS8VoJ z{#922wc=gZzhaZe^{-SPlz(-ikoE(lt^KR_0kI2fhyIlV@wfM{`u>2Je{E}f{!vi> zkNqo`Xdr_k2>dIDNFbL(B#_G?638V)694MQ4!L$F$aS=bFa18If5or%>Knj;%Dw6fp3 z@wUDFw%fdGYro&`zuB7u)f8$H^cM+wQurri;#Tx`yAl3-e4U#2 zVY9Ti?$rEU(zGGn4LwI!L_GMGe#XuL6I&+hw`cws(!N8CucTi^Iz9~^k;r@Z-o&c; zcait9rQY6XNsD9&HdByjFXFy7?-C;JhWOq=aYsp5RmBu<2~ZQVN_Nx0(0XBWk{d_o z4Ec#jX&zElrcl+`X) z#jp0kf#A)D$g8@fzl)6>;!CktZQ@mTVViFG>JJ*)_acC5wCH6Luj-?qPWV%xuoJK9 zt-ioO_fk(V(3$E9y**s*#;YCz-PpUN$J+O(oYo9C?KUjC4B_Mj|1Z4`cn?XKTr^Vi+Gid>45Up_r2XQ=D!305ESlR z21=l!5GNFvjvJ(MDV69ioG6Dfppiov(8!?-Xe5*oC+b%Yjed6&jgI0#=`(#P#ewZ& zRs3pC#QyRaZxXU}Nk74KPijk3(j%C@N3>^4{-rJ7ui|%ZZg6{TkBd-SO?$)8MoY?AQLL|DgT)82gU@^Y)897yEVZv}4*Y zVz<5hB6jO^65)9Ei@7?mU+v^&+(o49-u3O}Wh6>#(eH|fG6@VsdD#G}TQ82r7jwZV z{FUeo7yE6FcdayZX5**=ii$BAH>S(@-59**!j#bll;|g@#_{`Di@B5qDK|{H0hrCU z$jzVV_gx=5N^V$$|Bfd&?1Hlh$aOa`Z*2;k7}X^FJ~rE0Zhk6FtNuW4q{HI*we&ZZ zN^5Ge1^X#Xh{v{wZj$s;q+2ZtQU2eB#Im_gjra6z?gGulz^}VNlP|T$dHPA&(s2X{ z=hq;?C~gUo?L{oq=3PR>WM$?LQ7+*h&hJ>hW_+2Dud$%cw~4^E_=z6_OsdEe^%EZ{ zm4I+$BG3n4QHxAr1+9Xx7Z4%G^%v^}dng7wtgO17J9z>aGWM*N2iP zxrW$XA1X8Sm%k`$CFjPbp)mc>M7%XVtwTRFr2J6XsZkj!bIBCFndMvgrNp?%b#J(D z?z)Go&_J7rEQyMDZAN$`YMoB%C&jKHOHJ@BK_A=1i5BQ~=xINnb;RIFKzxwv_ zJPD;-c`j=s&k=mVtPTFQ@VCe_vwcf>W-aDY7Nk5g<;rvC4_oB-$CGDv zp(A-#-D#0$HrraBpWLPFAoEe4+2M}mnJw6VyEY-ul8z(YUY@VUV&C%BOV^yJJkKCV zE%H1Y$@cO*tIfOP$a8ha@?5+3|ARdL6{8AThW`qA-ue9hRGt-?j*@3$T;zE)mV6vj zo=Md9@=T&)ZU=vlEziu;N}i7quV4E;a@_T++spMFl;-$yA$}pO@arQ=Y~jt%Rqrsq z-1ftc$Cqz21SNrCcT{tfch3fnJ-*~u`?ps^V$}Fj(yt-i@%S=XdZDjs--{)v#vNa- zRZw>@zN}SW(8p@^gt5yq^@QHeu5rhg4WO3+N8=exo3-s-yYVHPJ=XYg1oj=^{Kp!1 ze90z{JHAwXP~*!Jh4ei@+IoC>*`#k6Upf$f`|)MP+3Zd?bf;DH0P7(X)c@Z2(xsH8 zJN?D@(xD7!qQWl_}AhkK;<$rDyKSAQXL;rb{pTHvgcRW9V zpm#K0R^4dv6WDBPKViHyZRpH*)OeZwbjHi9-+t}~z_A)HOL`5`YP{Tb|D69!;`dj} z+v9gXDsk~!i3Z!^w+UYreh=fx!7sBN55MDE@XPY%QWhY7r8Wn@rSG-icQ2mX`C%-= zf5*cwLGK8^sv9l%WwWjEd#W^T=*)K%e%Vh4zpUR5_DSGZ()S=O_-zxfd?k(8y<%B= z?E11=>`5A)A&DK>lT`Huy2`JfpsP~U6Li(2)vi7H!qHVjF=^FSI@{S3HhV04(p5mM zSnApnHhEloqWYlh$%#Vxbvt|VJ|K22dx!JC4#eNyp7cFK^xx|pWB%W>CoZKB8CO(* zJ#i=l8ab2!jU38=MnV~}CtW{OHviM3Xmpf4kv<>Op75((kF%>Cdm`zNnO62h($6!k z>`6<0WltnMmEV;;N#u9ql`{W(8nO4w*PM7-I@-kWK+OjQkZ3P@-+-gNWTaokTcZJdL?Jil>pD z7pIb*FD`cInTf0kdiF-5Jw1E1d3Stzp4TxwH+}FQq-Q<09{=a#qwKlRb1j^iW6+b> zZBI{Pw@xP!jz>@C>VTd%*|(iaV*cw@5)&8F^+7(^4~8!@II7?V9-W7V$n-;Hk#k-c z+2DLBIaf+Du!1zoXuvc3#FiAh;)qax~=&CJBdA#i4)fEMSE}^bvlLB2m;dK0T z@!)pqL!HC@v=#V*MHN0CLy!^9(iS0Y-S;%_q3b+xynN=72(b~UUCV#7tR(sB@Pm4F zGR`VM?~>laaTWn%PX#u!djmK^fYHfAU9iI+Q7H5%px36z639v`+(4+iX;b(KgO~t- z=Kwg7#n}g}0B9fp$jp_D@ePP;3GAUMmGN4INB6J9OaI{~32t534Hr_3!j!yOl>;hp zA7mpN(Q}c~5AiZ!p4Vzb0tNWdBBvpGXf2ck;!XiP%4h7-afpPYm2%WwYu2(r4vS*$ z(0cI-Fj~?E5T;kWtEno(qS{P4Tj-dYjaAo8`LKg;9Lr%HgMr&68jy!ufZUl|H7m}A z4zioWZ`2VZV4oCQzgJ}FX~aDxrWZQ7yq0|vbYdQSfERU#Sa%m~@c>^jPW)0CZpnMZ=}KaPgp~rE;|ISeiT&ER;;sz3fCR#rVZGjAK^+6h{2E~a~jXrq0v@+(wKLDQbvfGTcyK$B4Dy=R9bfEd@ZtAYR9QHpjnQ~B8Z_YQhmnqcI1Gwmi*LvJ;jC|=ALg~_hov`CKdc9w z$I%az`4HI9k>TU&2kMfe^uyg_j;|jg3Lsjdh|)nYM$>y9Xg(n=!7eyjVm(f&Q(A&Z z1N%5yqEcxIBcUbuIiV$p(%5EKOSJF|?@Ot{4x&{10<7#WU;W3w$OtFRc&BXXSd{VL z?7*sVc#yrVEq9zieTT4-<_^NeJ1rCE+>!L)1)KQ50t#NelBVN!7DwK!Dk-u@4%?GO zJDAH$HcxN8z=zG%>1;iTrCAGWkaa%8rI$R?6B^SToQ4~DIt@?F-tgdXW3acLCx&~B zlmJvZG%-d3w~fH@mAL;kKMm(Cx^E3&KCjgW!YeT zs(qjvu~qVtgRMGC|Cz)0W_~8?sTwW(&>6UBZm7@CWZ@3*0eLXq!HFTo|#blHw39Q@)WFsn)+g0t-C zmjZ${>Rnty${Ah;6l7OM0p^Vg%=@|Kp8GfY02yt~;V|Tcc9L6ld$W!b?9>1Uj*)th zp7nj4-M`AprK*s=f4m-%2|Qz^`x-6s8hf6f0dK?zdaR(B4t(u}s!+gd-yA%Ei$Sqa z)VM!Gn^EoV;7+U`4P9gA`#IL`OI@k2S9r!ia-xHAOP`7-!0qFFBq3~Eiz9Jm-z6IA zYv8OZHsra3a2xfZzcSB_Ta&1?nzzK~z@IT1RDSy`;5GIu{Bg>++h30Qat!V=cTB-b zz|Ez?bGc(L{S&;{%3Nd$EoW58Fo6~ zRm7Lp(rL&xxp%#!@X?v?RqxA6I(xzdSyaWn(>e2Fta=FN?;qW=e0hCtJ`A( zNIta=_@-9p6Mm-)$v5Lq9V6h`uIQ!CUXq(;0N#$EwUA4O8&3U2BeI%#0#pvrJj#B# zGh4VEEkJ9K#YaJ!F`m>Sf1|)x{ec`#`9ll+M+x_0>6jK_z{l~4RRj>3Xnr#iMS3~y znaI!5V>XN2^QNf`@bDNz%r!?jqfypJt&P3j>3UPL7O_c7YbO|3ym$9kCyyrwaULb zkzb3BAhA)$4KRns8Y&V%{D(T3_pR3=a>NO$($^$m|MqaNmCK{se8@!H*x&7kQj-I* z9%T99-j%=&RooES>pjfGbx3|BN1DS^48LBRBR9#>A6NUd2xn**B;($ASHO)#hM8;} zH1Y$`Sw^ze-)judF!tFu9b)YP2=X@kf4FvBgBiH@UJ=o4%ISBnu}j9 zpx_n(#NC8JF@V9FzIemsJbm!%#jhyypFs(9ENJ^+6LH$A(V!04RPrSL+o5Cv_RBxg zf189{t@Hp5X=^>8J^p7LuVF<3x%eQbXQ1(3KsUBEeet3>BT$L=AY&hEM&MpNBIj8A z*kcY5nOd|jO2dg6f_F^rVr2=#7Ml)iw&;1}V-;iy0}RyTW}(NLP%2Y*Z$!XFfq`W6 z<|q!hd0AG((jh_XY?g>YCf4GbK^RIuYHaauP}fAEv=)5|<;{5txKFj{00k>6%90t( z&o@Bm*f*zLiVDu-RBb`RaMWM)N8nmZ7eOagoGze|8%KgLYuZp4_ke(ET0{m7ihn6K z6{?xu7Kl$P$f!MgLa@;>VxG-z7McDdHOw-3i3L0&*f<6lS4YP}KaFG$;%?J=o z*{CFl$imqylu&^~Hj-v-gsX(3e2jO%R>TQN%rbU4M5er!@@VXlVIwFieTH3;g<5{6 zc65W~4BlnQ2b|OncIgv)2v)JZy{4tsqB;12+Juk}si{(M(6&D5~Q_b1Vx*Ed68U+_iD@<~wd4c^Ir?Yb)XA zne+?nP2WYyvA_Vf^fSGm>CH^5?+ckOY)X8W{C6|0zR%$Im!RXF@{<1u(rvsioHuQM z{dE$Q-{faxeC=*F`Euo+W<#HWsWD~jF<@8v@+SLD$v;@~XPQ-c+2F#B;Q^+;1aLxl z?lGkto_+=@h@OTJ`#r>L2m1QGgS0F-16$$Gs+x2=jsw?ysFs3iRk7Mu0c!|;Lwt6n zO+BNV{FofKV82`Ywa#?m5~4r;hc-QS?gR8mCyY7l^eD4x8A0C|?$_bT64m&qMg2HV z2iGDpBYfXBt`Rf9sW^gAEVi=)XRYo-E8p!$$JP3-NrB6(s?R}l{o_6LQWZ@*F2#%Y zt<+1mH-~Riht;Y{Jw3;NUiimW-jy0I(zAy6lj?eIvW5jN(|7K%Qj)XZHnwQNJyy{+ zV99S5)mp*rKyRuQTniag=c_x+``g8|8#u-(NK1byh#}`Q^I`uqc4Z@Xn-vb(ek38UG`ySCebiUDp_pU+@g0=B$6+ivE zcx}NZ&}9Z|9YiN^i#8&OJ?;jJeRIxMK1Va7g@W;8EcD`B8Mf^_%D% z+)fDKXpz8(Tv@m!Q;m}3pb9kZqn#lT;5XVw`_4ZLe3sB%i(C)2+ZINT1EU8p#xBNZ zz$fzIoJDezz2hKt!(G3lW7G@52;SlNYC0{4+HvpgVue6~kMxbZ*_kjrDse9;B{7nj7z62_&xt08w zK@63{Z@7AF;Bl#z* z@=j@Xo98=R=$J0=Ou?k7kZtn3H^X}h@Zt>9EA@k#^k18L81=>0BF5PS|f<{-MxwAh3ejIwqbPv8qTQpy-iTij0$dM(b}nKy^k z(oMS@C9dV(A}w+OuwH(MhwCr-63xB-1peRz`PejiD9-pX2v$!ABO=r6%55V6JJ|gjZVRB8q@#|cDhH1?&`6>*&3206=WBsYx*;&BvwQB zD};NtYkX}u;1&mN#Rua2TB67nP_{4w1wJSRq5d5{c$NHbiYP%Ugb#R9JUBaDkrTK` zGlfyf2V^jO^P8^?EW$WInyd@1y}*>ub-{HWBPy5x3+4JQXs!m|9VsK< zVec;jrRxmQ|KOCe5+6cB@8T`gMT#kk)6%>D69jgflHj&r3YKi5hO1%a3*8h|ixe`Y zK`SpAZ>iGEnf&XpM5^}a0yvj|*(zGwNpd>Xs{yqs6|qKemHq5x7_mqjvC-%)E@;Lz z&4y~_)a>=4!BkQ5-7Y!9%?ke0tG@>iB;f`*`cGVuA*@nrz=hVqUBukUuL5(BazAOP z=yx$|lSjye?-3`3&wlVeX&;vgrEooOWthBr&hY-|D`fbSsTJFcK&EG_CqIh>gc znK7kIy*G(|#}c5dIhKbKj+|+Wa=Yoij#cc_T3?e(18%!pV5vBE)*%q z(eILHi`E*;MbBvC;5ot}! z6Mpe*G)1TDTRY)8Tlo_E1KL~C$nJz8dQM-(X4HGT;B~X;&e%wNv`o7Gc4i7PZ~p>m zUD5-Y-iNfrw?|<%s=$6?4?U^084}{%r}I7SBD+r?Je`zhQje8v$~(X@+pg z92zpw3mtY5cEbI5qymx)R>6GAWQ@ z*Wz@p^3}mAbm<80ELU~`9I4m&>|66RU&9@tX?(=+@>rzXP3LIjEZa{|`i@@jbxz;FpR%;75#;SckeM1PbIr z@D;y#=of_o1D7D?j$n@#`89sgnOtO6JD4$9p!~ahFCwjQU2oS9X%lWXahHlV;l}Ls z;|D_;1Mv*Krjx$oa8Im!0ImYsgsYO)syvrwn+AT zXQ3Wh8}aLBv}1D;ZXSs*VZ0{%Ym+Vmnzp=e5;At{!TAy{M#r=W;{&)5z0rkIi(H5| z3eL%1^L`(KLlHTT?rTk(a*%yG17J_QxVSPFM+)SF*i?7Yw;%4gMrWSQc$-u&xwI*3 zk;vYxJz9-lFkx=?fRymt=HQg<8+_qSU#? zH3!h_XBbHn?$#FHkWq}Q<0jm!EnWwF-B_$Ya$YBEK!z6i8Wq6s@m8H)@e7n4N?NNe zhUb9%=c@c?7V9O+ovd+Q>!HJ;i4L0AqnU}DfT2tfs~7qLazXR9bZF{jU}w>1jDJNx zg2n-m={4IsVS>Q9MWH?yT%dRZ8pwVHD8%jbIn=BZ=#H{e&Z*oo$K?@9F}-(ggr6!`}SD*UiRWV^w=?fQy8F zfO5kCiqa`u7Xa@1unan-Ui1WKZgPRvJm?8I&{6ox)e|z#({qx)6W)k!P}9WMwGOC2 zeo+n!i)7Fj{d96~GaF~BhHk*TQ;j$KKsYsij?hKkeplXwQebqm?QmSmU^)R85&^4O zllNN#oA28*8;#tzj(?NhG5T~@-;FHXjJc_p>)XDMFLI&JkK)8x?R2V*UTTdgPxb&p z($VK!GdBhL#}`j!`#6n4rU$0I1hHxi??Hxib@E3qX91bgUrv0;{)AQEhpNkW6B4u3 zXP>+H>*i}c(6R_~Pdx>0ua$p}Yx*x@6e2jSE;to_)-)r$%Yc#R9f(@w_tZH>DOPx4 zeQ*;&uMaNdgmiIz@b#ol#YWMR`d~HR8^L9D!CJmwgY^QzdSu+n_w~VT{K5N8eos7I z$xXWm0vPg1er+()1r_w@B)XHZ{hq_Do?fz10xPN=-LJei5Q`O$l zu+JUco2Ao?U>Oa=ffwl&mAM}XkC?>uX5kwgDBJ;=Y7EZL2*0K`L3s_K=oL*vcTskI2ViH0wYtkWXXp`Wskg{WfSdA{KkaFTOe6v5;502t4Jk4o<8Vdchs@(QHndk4xqo{i0}T1ZP;mO$jy8TKb*v211GK0&%?) zIHymOivgUH`-Ho56$ZilG?gZ$Ps?T*Mqg@5RB{K(uICWmuP}=cOHO=|Cv!VKYqS5u2glF>W zrf~kmAJHlLml>`#C!}PL6Zskk-{MH8P*42zhwi3#bR-qtkuv+nJ3R~MCxxq7)x=j- z{bpgU*$wyb7S?Lfd&!UC>a6BY;TI510J!L^72d=?Zo*)PxS!3@!#(?*Npi%whHi&1 zVH7Q!Fh*NE4xY-9P7`j?7B^<^Gs1Jn55cv!@ITJ$Y7NN<-EIVznBlob;X*UGEPkHj zuk6znUoNH2VX3-_XB6uXCwH|59}Zop*LBiAI^1&)yrqd-Ocq!zbl5<=yRT6hnR#Gf>fEFQMrni$XD|DshaJO(X9=G8!yR`Pf%VU^tM*Pz3;%Lxdt;)L;uaoMW+VIp5BG&vVd&{NlM&ViXHtvwhv4EV6>t{5VCJWqMYBLavv3;Lx7feKC<{yN zWej>J9DTE}^1f=~s#D<$_id1eqFG>vqS+{B<|X^gqS;1&-(=0|hr#eHmDfm3(mzk5 zB8MI~N|$L1=Cwnh~CFhG*;b=NP3G@tjJysEFa> z&`gv|c2TfQFJ0D2o5Bh5B=jv=Rd<`J?wa5-ZR$`wTZ6pdA#L%XWUJ(`QMv?GA@F?- z5HR6S^nA6*=jafgyztY*bASSC@))CZ9we+daa|mLD zp|x$uiW!{MDHzEP&ef)NfwyOtR$_|zS~L6trpB+lukZz;Jgd4>;Vj}i`~qxvya(+y zJi78#{FuE5SB>RN#eLPrV^}iT9RCnGvrz90!yg+31K{WhyOZA3L!0_HdfotbN(IUi zUd&npWCvcd^C84X>hP_oELIMc=ZrJW{1j_)x=}g@SQ>2RrvqhzD`3bhodf)EwM+iJ zW`4lPAB)8;M*cW6zn768GV^;I`6Xt4A0vN~ncvr#QpSe!bBrkwJS0#($C!*&z=CS5 z7FMX{ECW&f1UOcqdJi#Hy2K1FGz%+SxFL$vKsRDGoj|{VJdm4w*j+6$3{_b9V+^o4 zl-i;jKuRp6zQJEcmdL=zvV&;gFNp>oX9I;x5R5fTU0NcnBdTF9=IYo0SG-hqAUk&= zwCc*v1*qB)oZu{Lgy=wMp?u6YEHV1|v?&2l1`+{^1G%pl|+u%sn5n1yqx)6Ak}MsPk*iG6h@YAo^V5Vytj83)wxnj=H;4BYm>Jxq8qnqJQUzQEnbKsty?^uRX8p7iTRLn_(0liVyqQiLc1BU zc%r8}oY&VGB|d(B#A}qK$b-))@ykPsQIcv7@|N#lpUV$2KJIq`dCS_#Wo@83H`s4b3U-5g0egdbpm* zMNbMp(xW>rm)OgyP){?s39*DzjG_iQl>-2sS=3dy>`-%R=wKg4{qs{$i_tay3@g2Bw;DTLN9-d#el}3B9)7%0 z7nio>G{CvD@6|NMhEW0W;K5xXXS# zenge!oNx4Db_{bW^4YF>3OGcnPG5_FOlZ|{0HQPCK=U=UYsb*QPPhQs0{{(BXaslJ zv)N2=mm6BB9FetAZMk3=+fKq9RQc*hCjnuIXqyhpu=C^ z`|aN5cI)BQ_z+P+vozhl3rqTO{^>6P-c>apbuF)(hJvkl-3zup7O#V~QjIQL1Ss~2 zK>|E^?WL)}Ak1j0Aubo+nMHm$uN1p~!MZRkbiLwP9~TgS(yn~;cHkaxnIjkd+RDXc zPl{Y{yw%|BBWx2#Loul}`yjMozl1j5W9}m8Zkh7KDiYFU5cD%?a;-xX2P(m}-}>Jfp1yxKcI7Gb5Neut6@coCZ0{RBz6-4)ZnIsu3nXTpd@ znZJ1*i}A7l?IA`p=CN~JlZ}lk^;l4eB>&-YmU?pLEs({+(o4Lvrb#YhfX*IBZC_Zv zp8<^NZv(-mDv1@Dtg9|B8B^J+UTsld;}AAHE>K%4je|~X7`r>cH`x1k8l2PA!R0$W z8Gs2Z+qDQ6ZyT%7MsLUdz=zQmb!SYDJff|rY0S&VMrGSXma>EAYmuAq+C*8dnZ2Ii zs6Et}9EhI{GMWNbFq4ic|3Ng&E3TFubOp7?i^Ur#zE^Ye}9skWlp zp_9=7jSW2lnm6VR2IabAB&sd)Mb?FPgXEcVy)iagtYov`p=y8$w;&&CI1LrG4hGU% zl1;oIcVB!@xs>S;j8AI7-nEq>HSF;j3oeCxZTeig7x@eFWL4Mac|$A>XIgK{7{7-# zU~VZywF;f!8YV1m2PH}@tUPAbXu?ik_!ZF<-Hl-uz~g(_XM$Dnw~?gW?u8ZGAZ2fD z@x|DB(nHxNb3!^}HrdFNeZLp;88GDxTvAcy%Lai{y|RJj9S|kQEI_;zX8QI8FlAWi zHf;i#HZl>7#_FJ7u+FoA*us3_El2{8H`tps$wUL5Bsj`n_JCGo&0EkA_3;JYobxHk zdEot6gaiN|q6m4VRn6i>aJ>;nL}0IbQ6z?Sqs_*_SPAiRLZvQ8sRLVMl?r|~VKi}Z zhof81|Ez@{k?rTmhTz)=z(d)g3@!2y(&VGqa5TsVXMV1H_cYctDlp03)Icp)6ha7k zS%6lHL1klMpo|&njCpdGuCWr2M&{SCZHD?7kKtyq~k$}&;%gB$GHMa zzh1ctIEYJo{j27zM&h6koN0>8VdOBYxFQZgn&eP-@LpD{34+O`d7H|sITm0fnw1WAp278wddRh8|Z6J5sVm+a!_BP9efum;|(fd=w{Ww{kG~r@Pf9jYe zuV%?4FpJ22`67Gxbe)KB=!3xgRNDG#?0*_0x86<)LOQ z*RzJ4BkP!{3b;Z>Mhbpw7=|r7xvH6dfQZC%kE=yKJdoB5@1p3R$wwvXAMb0#P43*P zagnnqn_34S!J+44vAF>YPjdeiDxuzU*`?#}tfzWFaWx&k4M;4UoN zBJF0)`kFp7;{8UG{T1Xv#voYAi`Z;6LFFJyJTk65#@J>VN@0Mv2fGLo`}N_SsN|=WnkXsLL|k4ZvxZb*ap^zx^47h8-=x;ApEryZE0fyCN6{! zT)BPEes$=8#J%aSC?`c*JWs5oefSMhv2+}~?1f?F>$0-kdPL{ zjE$jy+Brs%Ky4dHbA;GZFT z%L2=QRG_LithX043kl=B7p^M5p&ojz)p+DTJl5ioDXWTWQHyKd^jQl7UIFD(AiJ+1 ze5`~Lyrei}!Cv;!7u+(Ii(FPDfO8_)rrMqng6N2cpEgf?fJi0E;7UO)dJ$(jR3Wnm zmt&re7nZ&X^0E^6Qj4s?O;9N);<3Aq{1W~ck&>9_vcK~Uy~ONQtB%5qv7@az89N;f zA#S};fG)-tE<;YjGK5HgxWP`q{4`pqSGoXLeKxkekWqR~!+1e;)XYuen_E7i;WZ?O z7MTqSzylyYoT`mv=|--{Zt(1DM(sFk$3xx#<)wT0JKSRjLa=l7Ic{DSphsI&L$!|uu*wbR_p>8>~5 zrA6kTb-nq4B?LkX0xA^8Zdz;r&>}PN(wY~*j&H)-p-YMP%9R{To$N;saXgp&BNzk< ztBTl>GI%hSNgu${&-xfv8Yck3YeRW)6a?t>8Q3B=O={peAY{oz7Wq`O3#=v!luG)5 z1Z>1%5PZf#Ccpld#PGcK)*>iQm4VGZ^cYBna?bYpobE1L&G`wI-A)iy#;yYncix7rzNjjxm#^Ux9A4hTniIeRI`b*+nSuJFs^K>~t~CrXoKc?CEV`Uv3~o z$$2Y%p729b>^(Yi7?eNc z7i@yM2Jn%+tr?27F_0pg4nlYr4`4X%Z^W^UZr>{QInP!okOw3uj7t-+h>rFJ6qFHu za@3K-`ziJXJHKc)_L<#v?7b?NwX_?~U3-BnrTxUHsfqdjR8|IP@@lL>*mx3acgboN$3={`Hw^vC_$o zF`RUo#~W&ZFT5DULtac_!F0?<;jB;b41-dMX9CP-YY)OFZqzFLoWGnQv@9sIAZNut~s^pDZa=sdh_Rd!1&_2rrE10-mk=4kv#jsze3X}dkATPy4&RV^>%DX zJL@R^hBB}9?6W8KFsD%TOdO*@kyGO^Vv^%Cw)@BFd)ro?(52H*dF(KzT^zsGmHf>K zeelV%*fJ$MxGbz0;E849kEO>G zUS@})@D!?SBWDRwC@+L4gfYoy>HXRn$zptJP5ZupI9lCGm1t3jFI6Iiz|wC*dGqp) zW${b^z^GiTl5_rC`8zC-r!9t)2;@`OQ_H8~Wv-GjM7}VEfiwjNk31AgTy=XswrJ?J zz1*GWGGB@FgTMqCs48J$*6n3B=e#bSSB^PNZmbxMh0kNP#k>$O&)bV!>4yIx=mpy1 zjTB})_Clk*@!S#ygfs-^h=imA<-kOEs2K_rU|q5nzphn$FLb?GfNNls=Q;_)2AD3q z8RK|P_5+_w;lBgo0zl01mMD~oPXm2O>$OAVuolR*n}zMg-(!G8?dMSE<#DqFT?M6o zj&ZUIV=}GKrOK%+a7?^|d9F$e#SB+)o1zx~2*Q|rG^YLiRR*}zTfw@e5ZkH|R z*e&VKZZcB);>FNqS=Ai9g&r_fR#<{L$cp$DOCY|*8r6VP;#;zK6W72dzfPYNSjOhv zEgy)+8m#9Y`NwScSU5h6(MH*HJ;3wVe&w)aQ*+1oV zq887A_%rS1>rMcFV1eFf&E5c^I|_f8|Hfbw^WS%H{u|l^(;{G3(gRIW&!suPin?t( z2*vIo03zuiz=t|`G7ij3ptn8hBQ}cT6`UzAHGX~riWwvkU*c=5;KTV3XrG=B9g$+S z?UJ9`Au!e~1&>06q9q2KdlTS)hiw0{czr ztyZxL6_C9|2vKqk_TFBjifGaE@ew@X@DO=l)Hr@qGf*FXQ}81;pT9&S9g3kV5yIa{ z{>MZOJ4Eo*Hd4S?!j3ygXYL0#W5jdlTMktYam0gZ753S!59F!;Ok5ehDg!_g9;Q)Y zF^ch&Kq&4zIHDb)K@#E;i1BfAFMh$*zy@ksK4@QaF%WpEwzwh2DK=~Z z0w|4`e!?EI3Y?QpBP=7ZtI-tM9etn0zC&MPCKgY2$+kv0gc8$ONFtl42KhdR-$&v* zYT3h5GP-#IPimktm*4yHd#lmQJiH{ZU;_`aO$i8uI~unrh_1;C1VTP`XT?Jz&TJnq zGu6vK;U$2k{IXX3Bx;?Geu_7H059RSij0TPZ-wfdS#*k9NsS}V?Q6{lWE# zpT|e1_U_>|#fU##3f;m@5)N|JXr?RP> z4V_h`xKuv1FRjI^rlySTR!-J-;6#D2yl8*3Tp(xZ6C6hTGheMn#soKR{R9oXj5mlO zIhmr!#I~37Q&55?3ok?qvJ*=UbCfFv88)#O3oPfyZw`Ksd2-vG7=+P2wk*!z`U3h} zH`ya!rIC7fB#mUcS@j0C-8Lro)}p-78O!Oe8RXOS-{M(Y#1oEh_vX7q7lUa?{izzUXmb{ShZ{&+N zu!M=?mSj_uI&GjG44olIRd)@)55SgCdkA#YJ6|*)zuZ2}=4yLNUqVmBwo!}V%`14L zkP!Q;^XloAS6S37f}+@+{F>PRYkWxhmMkEB4-V%Fl4;OZnC9E8^x}(I`v8}LV-p!K zBBTemQ2kt}w%&yTXJLh(t2Iv9jf;#h!FB&VnBWSHzZ><)bSEuFpMc$rSRF&rq?8u9 z9wJfh^OT{rS1Z8XkYuliZ6N2GMT&n1=n8@r10w}1HXj(=FXbwO`RWkCN=@obH*h_DX)<&tfkMPMf376{usK# zOq88GE*iZTy<)UcW4&sqv67KmBC$rA z1Zoi?0@{&jnHfv5rAqMzXp2ZZ3FdgbZKj~@%;P-O(YChQ)+*w=CA{PU^#!bNwYF8O z^;`mqFGZwk{@>r)=jIKxGymuLJbXUn+_TSqS$nOu*Is+=wby=D8^}uz+}-$tv*3OJ z4&`r-qj4wunBt6?si0K-*10(c?Eh@0KG`~`*&0q9f4R=g5G#X*qMqBzkNxh);L({W zzqD`*OsH`X!qk@8LW0c1_~J@16z1Dp4o1R9&2^wnLb!m{Q1)dO9p0y$D{Xl!gK7H`aS7nn;@S|{TM^0B_kYmc&n1rrFl0Tf?pC+pOuq^k?$#ldt^K`x;U*QH~07 z^z++in*JIcDAc$!f40IzesSU1_758m&wb0a^#qPDJ*x-Z-}L4$B!w=YJ~TjS^FJUj z+D~Cj=DgYb)@+vZE_A=}iJswpVXS*^WAT=z%?uB^X{$D##Z{c`ps1@W4+4{s<=es+ z2SaXeQlpsiWTEW4ZJzV1b{-NJECY4Zd3GL>`{o6Vc)kOU+;0>+*9V{4{`-A+%JrcS z=3@zLG3fN?hroQAgBkynOn{@DP3n=H!L!xkGuPX}Qdp+}**!U2LVzyhfAjt^ulX`) z*!RBqB3_|~jGPzptl~L?XNG4p&&s~uVi<@h2JIq>LA!`z&`uPi1S0fB{eniP(%-=} z+UNErqtb`o-lVVL$W0%hP#IU+`xw2u+nelNE-QtvNLYCN`5)4IVDFpt{r&#$${*d{ zr1;qcp4AE2B0lAPR~1&FQ@5`F>9nEvoC83*4=~GrgPsDSRP zv)UxVSw%iNU$VBv?gKpg>nuJ7>Exb@=pW7@TC&2Qb$T5XEmENG@4h;frRu(Wz}2kO z5gA)~g#Thq`_{%j_tmMNg=2)%K=p^$Z3M^eK0tfFn|F5~ptP+6ej%6H2)9WOi03&d4HXuK8DDhmOtwF*F1oM`#J6PZ?B~9()!+Poct6xnFjX>v zd)#f4{Um~5K^_R{;tDMnKKedya$gKbEbvQ-H}Ud*@7-SDmR3D$Y~2rnYBnP*T+eeL zCagLX^==2Jvs!AYid(i1m-O#iH_~4z?2V7EY+Ryz^nh)6Rx;gExK-}->C zgJrQ?!y$(-C@Lt~Z>~lXZu|q9#Bd<5=()%AQspk`xefVKNBd*#Vxf84(F;upevS)h&)ZN(KfOJP?6r{eMHJ-FIDhzx^w3^m_TyhnVt9 z{Ld7)AR^L#y&Vbe7a6B{t<3Zdx)rZ|^YV)2XOs}P`CFy6A1ve=nQz5%GtMZjeR^Ts zA4OaM@{`TmkXVn3YVZE2VoEeIM)r94FYc`+bQZp=Wx$QOUmF&2@7)P4ALC;p?u z)!KPas6X1qa1$cu*>}MtVT~8k2_t zO4=XAH_}fb9pBwu5JLf&%3+vFZ$pN&T+JE>Y1Pv61p2wR_jH_u0gg9wB#h{VJ>7w| zLw1ggfxO6poNT`V_y&Oe#pIgF2j|Kx#8d8@Wwm=3PRT7zlmSOlXrHcT9N z-$82t@nt>7C)W(e!d2awJrOWdcwHFym%8sSIS@9a{at*lB#VLOpnTh|Ytgrs^u225kE6VQGf#Axnl z$b2lhVjY0g#gZ%T=hV zrT)6Ey~o1M>380RI`w0=9Z$$A=?d5Jos@KJQ)~}-ZCHE}5-Pip4%aAS?z|6TVTX<+ zJkebebD=QJ7nd2Gx!B2wUpsUk(0H<)i2vod34v`6A3GD`KVkPF~wP(mP0Wn*X~;Qx-s1szqB5{ zTmEjW<*?+M>C9lM(w=R|``F^&5O2jq@zU|7mKE8&O?~wDbQ}UUIoQ9@5K<%5`lF~x z{-sRaz)%4U*7xKZWCDQv6M!rd9FvQ1bWF(%YdO)^HEW#jd4-y*h^aP(m|(1bG;eqt z;>Gdk7siu2TUi7V@b5L4qCA54=ANCvdrmC3G}Z_23)ITRho$}=4oGTDk1AH`hMDj$ zM1z0j6fMG&vBI~mzx}iDNQ8Uv4&#zZvDXa$tFgiF5C62GKsGk`!SmiL7a#0zB@V8) zHevg%`;Kqzmy17B;axv8`m0?>d(c*dpry&{y>ju{U9ZM-lM;-$%;HZC;zNu8|NInu zxQ9u-qbb(iRO;Ao(Ch;KYj*d%I(U4zX&8u8KGW@Omz0c zuN$P2`S#2cSr8SUehW`xmA)#4G%ra=5;F&T!#O3!5GrU z`Cm;0m&EIr~RGR{3GqOYzv&VPGIY1(}=(&MEUJ zmj&mf{K=_cdfIPJ_uTFF8{s=H^(@J{NKET>$ZK1;zE6J4qPhf#Mx8QxF^11UL)uoT zeeCiPTmqVF_y-P)_iqW<`3o+j3Y-2@%$Bd0#drr8*D^_npSg-~YO+`mFKxqU{q2qo z%QrrvkKrddI3Jw@?QYzvkJ}V#?YA5kcvczw#!Z8wt%avtQjGbQPhPD!F@0x18!|5D zTW5E>tfL%ZC072+IU?V4>Js;gzY~c~JPOYr{f^t_Dn?8*KQXT^5zjvCxV&cf@`tSc zmIJXC7B9k}EtJ%?Uu2`JFA)Rl6W#3>3YOdzw{*8Ft`KHQ-HNHMbeGiCAK zZXv>xma6{D+w+auu?7`#kKm!bS{@JT(J98(4;x$n{_@)n@FSwV&3?e2DyU^9*^YXi zyBi;@OtzoSFM_o#@`>LQj3Rtg(r#WQzR1;=^QpUi34ej1!*5q1|L(E;wR;E1y>6KI z(tBgB(+BS%{Ush}Y+F#{eUK#7+oE#=D?=!z&k}J6LH$TDb5-qmWyCdV*;Mo?+4e-Q&kP!DK~Bo=vaxj9p!@fD%UQ$ zJbBM~1WMXFY|$mjd)C!9Uc2z0bLW-&xdtlsy9iLCut#ikXy?i{B^Jh$jV&Ef;vo^bB9i`E5=9f4H@Lff?lEVjO5ES8*;bO>tZwaGQ- z9U8P;yL(-Rc<0_rDU_ZgpLpj9@1@d_>pDjBb=2~2rb;_z#e(zF{w$(`*!^0K9r-5X z*nE@tyCmNPfmj5j{8{PXZsD4sd!7xCn7^>xH}n^BAjd(3XEgk{{Gr9<#F*bk6@(R8!%TS+pAzWoNxHeD(2wuhX?B# zon-q6I$snhJmcCZLVjxmg(nmH-1hrAW|J$2Vn&WizUcl)#kAIW1QYcHbmN%pYdY?hkYvR&TUgtJ+-wry?8rKr05gj!{N zZ!Oj`{)m;)yQ_C%yk@gqi&R`jNljpBBW0<$m|a4zm^Rg?_GTvtmI-gXa93|nhnq(PZ}*6p0OnD+j7&98&{T>agY_xtlXe>^1W$*5x=zHNQ_Gc) zyR(hCS-W<56QeF=Pv7rGgAmp-J(&77i>c%GMP*CFz(qx;&jMr*@o9RV${EjuzrO>^ zr4Ik*Jk=EbP48EMo9O!ky!YG`ef*D2>-R1?7d@6$I6K9=qR6b>_n(#YXzc6|cEz{vY<4 z<|F-N`4!h-I(`rONC9HVoji*ZISRsoKEl1uAWaw7G~SqRyhW(=XWmMLNeMsH4eRzG zb)z$P?u|uS8M}kPZ|-m~q$3!d-?H4Op6FT580gS+zPs_>O05%g zWhZ>241J^V+S;=d#L&FwJoJpcsVp(C_p<0PJ!6QD@xy3b_vsk|!08$LhG8$p32Y>asVM{Qg>e-&#LN4C4lx`w#K_6 zg|o>gXkhsj0aU8wS71HvS;@9=cViICHzr8z<$i+m(mh*(mUO;R5~0^0-t!w#^U<5# z-0@SI^_e^VaJ~Y%UQ?VnZY8Gi1+|s%}^C@JDImz;_0EAM*!fZEq^6Qh;VZhY*pPFq!HbiI0jskYQrn9jb= z41AVKy$vonGbLga)4I~4UVvhoLnW!eQ{Yvd2H75X8(|y-mHZA?X83E^ z@?Id-_nzc$&g(3|Bf+yuS^2#F29Mb9t@`Wj;BR>8pCz51g-RwGzk9S^UoO5b=hg7c zEym3$-%F@52pZHg)n(ny(@Y*?gRI#I&9Z-fc;>IKRHkqI-_nOiyk5zKi5?w!*|Kb`5{3+vrFpr#`I96qbVd%hzm z#sdZP5`@~S# zu?_kg3sQ<_Iw7lF!k2UE(wA#&myil8f}jkFD6}90TQP3;Jb!gR}0B| zZd1K}IM)umPb>{qmJ6UKmK_~DkmgtN*N@h$oseu9(KD^K?CR_}G81lXd7Ij_r#DB4 zjZhHx)7(e#XB(2BD(TC?uOCwG-s5DvITX4!i6ArAx7L%t-iaNg{E9=8_ZYZyeNRB) zHizYv*n^4}G`IBu^`xXUOYF-)pXcT+bBO|~q%PzW&+-e%ll*m;zvYs(H*=1DZr9!< zmzd1$+EY4r%+_3bc`n|}1qO4+bmdy*=pMCHkfK<#TdifU2jsN3VTvgq9J_g@=)q9I z&K6CKqa`&p-kzSwr>WORkiB(^`NH8>cbe+kDZrF#_Xs+XA(yr?p*j{AY)g^V@H?M& zahc?4tx-s!`0=U`d3xuM&3%ad(Co18A~Ls9cTmQL*zn}TTX#2{7pu%3Zt@U(4M=R+ z)wVX*%1P~q zh0=cdR#-teYBRq_2GRY;*|EHFh#Ir3e&Sr4J}&lebIh4+|05G*aZG?s^<~fkhWBcr zp66ISwV=sh|AcMvaHVkA^wqt+_wT%X^0|K3JKMP$anG?`dq<2}=Wn{?3Her!**f=t z3rmaq5l{jG6xPuP42Y=%0XzlC2_CH}B^)`$3>28n~A`o^UKipzc(Lo{so^T&c9Tf{0?{A2BJH)adxlRkqPlgXj7G+Sf&9*q&)_% zc!0~jGbXu*oX44IK@TOqPOy4^Z1v6$SE=4RRB!w49HD*N&Jk~2-}Z5smu~7@eq<-0 za&jpmKyPz8xc&xmcq^1IrW4pMet<9|Trw{srrMI!#mC&LOq)td@mFbMg*~!I53`uUOKPbn&9J1j=dI&pctmUAWSfaQn{_Nqfd<#SQA>}K4jbEBK zydCcTr6aBum;K-qHa|B*gc;!G!tjcp(mP`dKd+!Vf2Ax9%z;Jxzl!&HH(9Nwc-Im} znA4`m#k?oLj!_O1M9#QGcneoBWrM_&ArTpI{b)n%R~-jQxmh8;;l#m z%|y*5=8y{lhM!V}-YwFwn&ROI4##3>kP0ycF|5OgeYZRn?FQZ^TpCo}z8=BPp65Iu z*PeiGPA6X zyk$~s_kjCbbc?JDc1esQsac5}QH_>DLFX-I`a(0tXLPp_#8u>RxOc_Nz1g4KE9cGr z^?xv#+vc9+>X}^2)?lO)R%W;fCw9phSDK&rH=emnGYYz)GXeMc9GyUpLwTgR2Th@`;Ax8ahRGd#aK9reTjOR&&o4bMkE} z-niOdaU+?`SA?9>UBZjVNe6s-Lvd_T{43nSIyAiL#~`W1j>`0}hur>jIy}O&@qeO? z|MIZ?N94Ujm1EXAA{Y)gjqKwlVfGhp|-$oAZSeU)mON=^6z1zrU@72I%8IDHyd zFxjiOA<=){QuZjj{+X~-3PyrhI4Sh4jssN(dU3KO56@eh`1ckqVp)Te+xT@$h#y_c1&H-UsZ>2}i8|wL5oftB^G21R<%K zE?0;Vcm2rV`zFSL3Ufk&Ozk_fv;DAVc%X@AI*v2D*Tu4L29wLM9`!r;{ICrKc3f|x5flC{Rg_jU^sBb?K@x}UhHXv7pe_pOmT%0kUnS&$E{0t%D=Vz88 z7$p2`>=Tu(;3 z5UjJ}RiyP@Acy!n)+k~*GCc-9jh zo_fo3Gw``Vam}r~{T7ymv_y)IznA4!R{x0&cWmRlnf=93$V4Q!iz8Itln#0{rEn~r zwDFzuruR9`DFlMxHHigMmw%pl#k7rh7++-ln*xGMdhQxH9yK2~8-Bejh2Qw`hTj?B zcWLHA>T_tliy|K@K9v^G(EVh~De| ze;}6GPP2G#YA{ld1F7t{fDi6}TP9rWInHoVPj{uGG(gFX|DSJNP z-m?+LXlI{iG;aEJ82EH&Gl@uRa1ugF*(ii0ZdlEy#(GJcFEm9iR2nz16k% z^Z>eF>XO#8p<5&#^-4dt@lzg+o;dM34c7l4W0V1)b%~ngi}zlTmQtjRh`thl3szp(H}}kNbI)Kw5zRe-6y7NNd)}?P(ZOVFhc;Oj zW}W&Oh3VF^(akXujZ2|?UC`zhzDP-aE+;dolll1r_j3wAuXR6X@KftsGF-TiBwhMK zB#acL&8Db|7Y9#KHr1FUmujj143$Xc%tnxBnSMcpre7DI{3s3|w66bO71|A~ z9>bLX^j8p>ZJ9K`V*n%89_60qn}KFvBD*{M&nL}9NNmBcVam+8B4js{Dt)kPBZfys zRTV&mn|`Z8$&QdpC{jTygf&a>Q1HYuYt%8m`{L(OXmRhz4*d3n8{#hp1mOliTDN2IraevkARm>FFrzo`SQ8#|H z5Bvk#q2cFk8nKSQ(Es!0=%+w?mfu>Kv}K-C>Sf^vp9eCcn*kY#*ODj#@Uz2m+RrwA zN>d?qd4K9se(E1M8tb=Zmhg%oY0Gr#2ZM+R?)EFeuOHa2GQyzAsh##Nzi!d5He7iv$6EK+;NCX4x5@5plY5)u-kx-C&F*b0Z&0S(z3p*tcYK^WS7k~_ z#FBF>i2$#KAN00aP;9aU1cX1?V#U>|!8yY-6W|1H6f0;v%YaQof>V|8)9Quz$K!0F z9A+PC%iKPouCz%YsU9xf*$B#tP4QWKx8p3PNfxJ!`8H8htG1oAOQ?1vWY3`{|D0XA znsdl}3EEayxpvf7>PTz##?wvmcsYV$u?cWK>p+&*vqoBY`PTP)Yd2^$M_ubi- zP4y!rx!DiwCFfNV+{yZC(X4&CI`3>}Z)iRor5ohH?lw-A|BO{V*L0c04fsGbGLUam z6#1h1_F%{8`9;oKL6eAm>Pt{h;binf+J#$YQ$`yR@@_(naWbSncew0eKtCmScx3r% z$Q`b|EYc5c;r8vr9Bws3yV%yNGoe7nXH)Awm?s5<3{pKrb|6ioH4HTXV`C@E zBMyVC+n^tEZd8ECAU2G0a32C?a-MWk3R#U#UQoX>_>4|h3x#cnh1c*ak|9MPj4ZOO zN|1f{plaWlY-3BPk2cg;QaGOk??Dr7knS7m=YuB2cvBR&s3`@vF>#X3#OJa-1z>Yw zj_trmyJAr`*iIw=0NqPJ`}J8Vv2v8JEN&H!dcg2;w5$^?C+Q{^i6e&My_kPVV%PRW z&iX=)K4n+uoMJ6KUU!^IGWtTLl~gKKxUlwqW`}O={_XSW%T(#)MW24X4?L|DuXzFr zRk9OF6C$ZCUmKEYhZ7%QMApJHtqH|84OYz+~ zFmH(BuMODoeB(aD&(n6b9+wX8Da{^dHs>Dpd7Y(I80(#tMxDH)XcxtXAEEIZcU$@E z*(60^O5qn;QW3^X@t;bTV!=N6;ZIEo&d-~=c(3%~-){g9Xdb-(Ufdu4{sO5W=VlWKef^>10}pCc=9^4I3`XReBu#8g4rVjtZjs>C25{kzW zx$YZ4y|?bNntv=m_WdyAlYADK=Y!ou_=U@az2^?KlO<)rWKJfvoDfVd$4G=j=>dx_ z$(PzpHqij)RNO_yV@NvIbCCN=RG5p_JIm6MN^a;YWFlUL=62@oj&rQI^r+^mC|o-l|*jJIG5K={s=DO zOm5=pIi5(9$-&erFE2~6b8fnGCELGD z=aD-5ajA%gZ_N`ue-a&8b1*XEm2^Z%Xx7%#9YHFX98YdZZuUnb;5Ks`TFafmJbImc zl&b*zOA{?OqjA%1 z+VYTN9*uh&hk38Ohscv8x8^Z+i*mCnf~l1@w9`UBB0Th`AizN@Rw-upHzwPDr~)P6 zuqhLKJ)V5jzqGo2r$cX>cCN=h;Xp`U9ZIv9RVDR^yRAM907Zo$7u+)tfPcGncdu1i z_%CWHib19!M=6_%zRtiFm85$vRa;Hk)@=WV3iP|HjJTse*DO9cW}0G|%8KIbrC;`E z;yNqJ_etvffKQ|CQ@U8{_5q*%CY7+My!fexcv3~!UeGMwoe_h;JPlHik-zoGVKW(E z9VwKOoq1zc1(>D^+qwvIKY<8Ml^R1Yycf$CK1DrJS@})?c$bs-HV7-tjLG)T16|>A zgF}@Vjy_lX+NQg8a!n4&%;R%_-QO9wUh8)e1D++vIHZ%~D4!%(yzI}>ukG`TDe$^Ga=TtJ5O|8_3 z5p?RB*t6QOAAay4JVhFlNS)FUER4A#Q&fuW6Ty;ra&z)=cf8a;gc_?zFIjYo3Kh3! zt66jLE_>!aCVrDoInF>aG~_2kBm6g&VCs*=KJo7O_!2Ka3`m4<9j~hJF3wcH7w{5$ zJQ$&ooM5c$S;keR$<5xospQqB3L%YB*=meO*bjAbpZkqDXGkX_xtLyo{7GLeSEo%a zZ&0-k_g5Etk!$!)y0(F6=vRGGy6Qv;Ttm1rh>FlTI49#zt_;qp3Z_^4lQVvEm0iCR z*$;$GbXxIT>UUIOgT3W$%8wTV6u-UwtZnKU>df;b;sbzL(AQQ|MZUgLtwtOc7BD0g zw+a;(({gx_D!fAgvhz4TSn&e@$~`Qw@+w71TI5#jkx2`{$ro0{L@F2BR?Ee>X-h=XK zSTXP8U}44WB93`c0`?5kDBn5D?rlh4^u_f8 zweAEmMVoxtlbk<8OO7BA&-cq8`70B0j=EVF$^jzWd9l$y!SR;1%u;KVkMj~*9Zr?R z7#~i$T75vaK*N?)LBtFerR6^&rKxrq_p#NYH1y!?Z039QLICkm^LV)UKM)J6GPkHz zVhkfRP^uWx@hA}n?QPcCqBbdYl;|Ces-^d{^gbY?=Bach9DS{n>16wR1_>@7Pkrd- z%I{CbV35ru@O8IkfcNHyX1zmMCD8yq=Wqe~!!Ini;OZ?POz1(PjM0SEf58YiS5LzQ zZ*YG|f4Na7?&{lf{p(9_ME7hsG`JaGd z5vMc^w=pDLqM57v+-a#9;H@Fqb|T~ok8G#je6V~i^^1mI5DldOVshX4k|0?6j>TI_ z$p#GsWqh?YTX40?2$O%yYF?#78U!a3`cXCkSidfoOZ(JkJmU#w!O>?h?wm!h_i7kUE)Hy zq2Oh!bpg)0S{8g?LxgpKf3^KkIDvh31B>Fxn@`6a=wdfB9uDl?@uv`XegJ2%KxoxrK?hix|rVZI?S*`9;Y#mWfOKL~}wPItAlqWz+k?FPDD_#Fk@`Yu9n z&MPZ$f8HkPPptP%snAKp?1>ARnZ3Q*@zdhp`P9gsg@>P61DyCBkbbC=JEMO0+kZ?K zGig2?BTjbe!U`-JF31wBHB`SstH`khf+&EEa5ePT*?jkuQ$nId2xStv=V9z21M{b% z>^~lmUGl}{?w5|TPbKJY8I90o*+$~5gygKza&#~;73-RCPI_^(Izi=Em{clwl>*({xnCU-yf&Ywr zN^JX*={214B@MerSy;DkUN$M1%5ltUf6JJ4EuRgVGTw{BSjmjpB-Rdw#}pRCEm$DP ztV$RYtoCNl_GeWSXlT~h_MKNg>?)3qdT=q#)Tbz9n~~CeV8-z3|AoBfB}S=d#yr)t zS^KNi#r@Sm^XshpBu3Cg{O%k(SYaK^$O*%>*`ujIOUSKV;jxH`rt#T>I1k#}d*!b< z20YH&Q0{Ni`3~kIX7h4zp2E>`Ntpqc{dll=98=9Ff=T1S{Kq)#w~C_FN~V@STb}5g z{ugW3;%>=0W=1Am`&WNYvgxn>8{rz*ncOeMV5BjB9kX~`Prjf3#LvtK<)#g zf*7`j1=_WQk;4lsS!*Dynt2YK+%0q(#h#}$nCOo!%s3X0KU4eD?0(Gyq zw>Nu8ki>*@6jr*Eo62Ha2QfINNH9n|j{<}}xk(E&okx^GF1B_35P#pH;|IS@Ae~Dy zVsSNfLU72*GdNnax#i?wT58O;3De3KjhZkmeR-KbEoG=PyTHI9rhd_WPcUsivg-)}0Hi(r!jIKqbXJ*%~q{iu@V zJ^#hKw?m#7YS|Velua8UQ@Q5&1T3MmQj05sBLs$Zf|}ywNq9uJuyM;ZlB~OT<(n!* z!|;>{k*Ly7LM$qwhMtFMDAL#eFSn<#hmmaBe|yFAWdx0+pY`Ec7l~ijevnXviiY-H zI%^%vPK)FXF1B=A(``I6W?k(w$);y)cr%>CUw+?>YkC%YDzJO&Cy%sM$bcW{-wdAmkfada49ismWWoUaR3kXY0zefssRZ9TOp(ELEtoehSW@l1 zKWy1)LG#!#d%eBGmW>IH@OI)UAU+vwwikciIDbjC8Po@>`VCICEGjKN`@Cz}QZxg- zmZ}wZ##l}c@7XYzKNYz|qI|3%0Sa%)xM6^??4&*zjs}JS0C@Ap#eu-vkny)F)Xsj| zom_19x&C&G`TOkOXg%1!-%n^gG!_)d_HC{l%-9WLwW~hHh3&ondcSRJcHgVGl#52@ zE>Q4?+{8F%H75V-L;AMpKqx)g+0kMlv^3ws21-jrGw0{C-(qRCh)&k~v+5A@NUSbpHvus-2 zHm0lP<>1mP90!;jV^59Qs)kRtSW8=PRV=?MAt{~X?_4y)hWNQsGgsIZ)kl{wiOcrNPqkZUS*W zC0JQ~8oDeNT!owuys^A7ufg~_o>iA@!-`mft}#9eR>_Adcis+Pu)17uI!qRO3X)g* zkM@Y~>li1BDIjhAVxDoHb9|PZ@+wG+hzwDi#_hL6r)HEqMXP+K^3VN3XM(eLGrji4 z413Y}Gc|`<$bTcZQjJooDy;sILOx^<&3o#FrhnGooYL#rOm*WObP?bVXx}mlOy9a% z!0BEa{r&Ow&JWL-Dg69qPlTUw5q@q4-oP6_6hHTn{1N#1?1$k;%b0op2Y5Q}=Z2@B ze-xh7xZx>&OA$}%&Axb2#vyo8Mu#VLxiFqW#r(aH){Ac*ZTmsoag=NgxJ>RN#3kkLw*Rl(sTw2!CPs{Q-2f>f} zOQ(9)b{6GH-~MyodZ@2FgNo4;j->c9$Oz;{@$Va|M%c_iupmE>}7rZ zr5o1IUum#tzkRf(sHlHSUv!CRDnoYJSDP8t>BFMG>eH%GA;Pr39@TmgwIaVibbo!4 zM!TUhhMzI5Kkb}iE$M?7RJf1253mmEqnCglJJy3ry>9B+fIL=dkr)v9b(A-dD->Gz5kv4^B1qP{yjDD#58^ll6)U} zV*2Obi)d&krhESVBm2+BhxNb0q6VEXpzAtxx!|np7)`h95CZW^kv>ig_lngjo*F~ z8W(9RT~T{=4Aau@>Jo`$$5+w4$X>3r*S_P@bWk{~Ic_gLNWI+P+I9%<ORdLU_chv8Z@HBb;Yj4S#2u^y#*N^9m8?QO<<1abY z57_Lu*3VwW{3gFN1>-enFQl>l!`-A>->-7{CR;v(ek}RyxWqncDfWPnG-p z1whJuSi8a_fL_;O9j!`xi72+4T4*Z^7AGe+9k9H0=28U+=lB^P(0OOOr6Kw*oT+-v zv66OE{O`+s}xzi823KbHaxIDd!lymZN_;V@Vo5!bbScW!Cd{|{;aA({!DuOh6s=w>+}mMqPzDvm`c){jogo?}fTdM5iB=^Hz_rtxA zOTkX~jn9j#-h2(NTAf)=3fDib;^E((>CofBOq;Uhzs{G=TWP}ID8=~uFbKQy0gmc? zCX%LNf|LZ`DmSsT_;|MJ12$Fh>`1nJMy?*4Ti?~}oLq4*C2bx?+&UO&(HeG51+HN> zAgEY+yzD~1)zy2G(paag{$hKJ9|)SN0`31+(*}>RI4T7rkV9>D9A;YDd-trx*MF_6 zVpzLi_m(6|vR8|Rq0Km)N}Fke*RlMZ!OxsaF@|?q`Z(k=yEMU~pi_}~c8);<#U!teY-lC2~7zf8&0d4*WemYJ=*n`$>D z+h3A2ynwJ|FqtOZ$*`%8l+^?3I9-=xba<2~+RyZ)I^}(yukhZlPqxjZ`U#(I*=hNv z$7?T$x4al!kieAmoUP3<%K2C=K5;2V7}n}!vkiJbonbQ@lqAAw-`0`QmfN_uPj2Le z2{TK;FZL13ah_gQX_fw@k;;oX0TSzyS#A6 zpEWTF>8tpTRiU0>g2ehOnDYqBjOIjcQaR2^pdvvpWjq#GrYT<8ZlG4ORo@*qDV1@q zRk1Bxr#1->1o)y%TY8gHg+IXd_=82GQnL`033nX0tJg?`*fK7_#g&Zu3{k@?_>5_( z{dPcge3|YfWW2YxzU8llBgx1RZU#5z#RV7xq3e1BLIJH9K}><6?9k)L2b(;$E7Y<5J@6*~{o|)n^$$Qy5*Npf2|&ipYae5^ zu(?1Sr{2C{DNa#7R{iR5VGC%a*Y&8vpYF?q8(1xaD)~L6wSKf{u{eGLPGL$}j%lmp zezl!!zZv705zP%<1ITAGT7TTTsSI~G+&Ct zuPKpiJ3#%J0>s*Jjhp-l|D8=h(#8b@6pia(S~*cgt&v$}rnI*`j@2e#FCB-7oBS5w z6J`(!^7?g!&mnKT`gqL5PvJ-U3Qi|XgfrF_&X=WhbK&D^m4&fTTOvou;lV5AShE6fvp+C7}oe5 z4;m#Is$k6wcn@3t8Bk@o;+=tZiF_$oewKi{y4t3)rI+$?93SmmwLhBMGmKZ_1l#o4 zSBc?2wd63{$0_^1Kjr!qN!ZBnhoXP?t1oA|4sA8S=lY`xXF)vh%YiGJ`UhTcdxmtq z1+C5cKtn71#{zdu{7 zHv1K3yv6czV@k$x=?*G%?r{g@uD9A{LS%guR?%4>EwoadrV{3A86s>k>vjWIEMjr- zpxSr)N4l;(3la*nO|5s|(Y~c3lkXcXbs? zZ!LZ6N6Gd-@aifY+HPr7SK+JBiFtmaDc_d2po2Tn`Yu``xb(C7(}SxzsTxu1AS!5K zX#6`ua(0t%pIxbueCiCYx^Yncw_zWbUzzpIWtJLb=~vwlq%VD6nyaa#iv7piW5)2-L$Bi@&jAzX_?QtSG&{|svowU`aU zhs6mnNSb-!2mBy@gJ({~Epoe?8`L9jyKg6nPE ztx)CqmtUcwpnqV?w=8szWtU@1s?w}r4z#d*6s2h!ZMyHd{RL{eQ=eV8_7kXSmHT=v zO~Tq5NF3|YI8-Ne(K+o^Mqk2vUNtjW8!-VT!77z!rG8&(USzu{=8mW34$y(Ly!DIk zCAm}Vs9F}G*i9R{JxLB^Q}|Tk4yehy871s!p-YNjeGorJ&7yULFTCQK-Kv^2?@Rq+ z94>j(OhT$H6I>>mN zdWfx9_P#+VL$PKIkeFyAhGSZ&;Q$jc7s;-%Rl#;p z!&?m@jTK1(q_!B(= zXgs9o4dSJKyNJZV8;|+a@%VuGalW&)C`JoP6H3)==9f9Nx&-3Q3oa|WWLiRom+<8? z1m2hbh=vuuv%TwmV(twevz_p9)uXa!2P0&uVWGevsmnU!^Ox>m$g$qvLe|rVhwFZVFS;qoL7gu;MZ7ErjVnO>eTg2^c-hI zqUX{3lxRGp;v`Vcw)Il3jH5nEakmRNO6qg8mHgoQp6@9Da|vd)TsuX-e3L47 zyLCZ4#cgic&HmLwxpmC-Q|;NT5=|fb7UISLNZOyH>$_Q^xPHc`&e3*1f}^#)x>8Zy#!Sot>T{H zxw~)YjhQyQfzROETnl)bPd!gp2s((Ki~*56=!>$TfD6Jmsr5O#H-TUAFm>$!xsM)J zxyj83${Mua;c8NF3o|^pl;QygoCvq#B2gKIj`ijrXTMUkWRgqnqy|QU6iF{@@t8j{ z;8^zMy!3Wh`l|_6e&HpzxY>ZdeB=KT)gr{!^$eYU63 z$1Nfe=&J_b<3M=$$U8P%?%=nd4~UGOx3MxmX)Lvs_?Kn!lY}RX{F4}Q{s<{JSA$D` z4@-@Gyo*25A7^XH5CYEGmw>mg!yl(EQ_~wxr*C50b9narTW2KKv|eI~6W#+hi2wX7 z_|j^}ZNHWW%c>bQ;RtxiEqrp95FLpFyCp5B2UrR%uysNPI$Jx@l^wfjg(5HW9J+Rr zUQd`4y4~~Sfc8OBr8Nr4ZS7VsItxd+1qqp|E$pi*y=*;LwOG1N_UFTc|3J!~V88-x zU;j$gA2j3c8XU-Z+rzwdf;K$;zyOxm=#h_fa-j;>E_)Hrmi0Ct`(tK>H@+_O7@*}>BL-!N3%CW z)8V8lThrtxnFz>Fs>Wh|hiMLjA%Dkvn|0ORLL$%9;o5xs~<{M4^*SA-^K5jb&z$ zq~t~y@EcxrC|Vl3aACpys0d3ALr>EhCu?!vE)+75XH$6S*{r9ZK1KqTK_wiFBY93V z#b0cn%M`<+&W|6%*GxWslu*4%CChJkCV$)eT!!$$*L`*Cp2r| z`x4&AiLrQ&S2|DAuJ}GV*QcLFd{ETSK3wktw>KJYiQ_;J1Zo?E_cq^jt}DJYP;nwG zc|7}+TTeAc7&rBrAu<~*&tZs|g^cMlavK<0yrtWaV7qscC)qWoN45O2=K-r1drWxY z^*Ws6#y8KMFI3;kgC)|5;pS6Cm2-ZZD9JsTxm_P;$)l{Ir+i?0PC4ZKHyI#X z3zXd#czq(=q_j(x7Oa(;6KzXSp&Ra!TwYei3f@Zs$#Z`qzB&Jf8|u802dQ@vQe zYi}u(iYrOLf2L$_Z_fjR)@z0@L&@!#wPXwb^OM5WF;65^i8_+vKb2JQV9T07TOABq zhU6#j7f#;k*0}ZGNw#;9>~E`Ci!qA3uHL$hz%isSavmXrSf7doL}5CIR`R)eHr`CL ziE_Y~eXIBGuaf0KXNeIZu%JomCfnZcrLO{t+^7p^)YQ7caJ$O{fbD-RSN$|M$Lejl72QF+9(KNNx`Xrxbcd^WbEeT} z`G|OK6T8uw4Jyt=`pJCLSbj3+lemc=nhTNBlj4EJyq34F3v%5Q-CE%{v0|#0DuMZl z0r#czhJZJ>bFPf=g`Y_2vvoyr9E!@orDcI0;i?X?DOyd(bxNhbN-oIGVdF;qyW^kV z>mAg4i8XF(ymNkGTruBJMN;i)O(;y(@38}Nyont62QS)JAE~(C^pSAGYo;gE><;he zSK(@PzO^*xID0gms&5Y*|Iw;i71DIzOl1zxNU%y zpC-Q-rv92;!oidWIf-?b%8=hq-}p%L-S@xIJLoDYwG(T}i0_bnnqj0^xI?f8M7Xkv zd!uAp%6ZBh-o<;*0t8Z|9HM0z}2zL1IaZ_u@3J0<^Snq9>&+B`Cm(p;mFe^Bj~8{Dw#jUhhzAE1|LUI z;M4p*mj4s7=RYLF1-G5*(#?`M(jcU0$052Q`RI-&F7s=kEO*+Gd~CW#D~j!_9T{+RB}c0&ERIK_kuRkxp29$1V}PGV?0mbS<3T7p2K*a#52ybisu15 z$M77^^AkKr@H`n(Xay=JSt4P;GwVYvU5JTkpndyA6Dq>}{B`o(r#q%~$<5ycc6EQs_-5*Mz&6lO=EJE~>cHc_p#$Aruf=OVX#Go)e>LxLS!zwU z?$1rt>^ebre%5q%y^yNedas;yP}^-gevEtD`_b=P^t)?ks_XS~QoL6!!>xboJ*e%09Y5n6 zpe8K!fgL|_uc@xr%1QD5Le>X%{8U-*+Ho6^;NqEJTm}frg1XFUORq`%4+#d3+!@j5&aSQsf7AateI6f7A6`>k1*6Z4{qzZn^eM{#!FxuZ zJNNt#A@E-NQ2P82fDnB?_`uPpaFJw;i{I<63}zD00yO*^Q+(_CrJJxrKWHgT`XU2| z@{?;0!N|X6md-ga1{l^&rBIH6HF6!lhmG8lTr-UUz9`=HLb;MA9nke+s_TWs$W440 zF>+Vei{&FXxsm#GG*aJmBb8gV4~3E?C67E(v#u*Vv}T>ZOG&$2Qn!-2{WrE1YPPk$ zs8Lz7CAQh$TJwhZXp`fkE?TPD>TlV$y#^N^%d|E21pI(AR_kBr!Y+SX>#J~F38Df< zBBk|3mTV;>KY*E#61~Z;LTcpGBOfaq049)^cnR%-C%gV~RM+;>k=P;?nbl1+qy;sM2uOvslu4G(r zlJ~qzNByVf);!VmN^0b`k*^2UnXb+3b?>;?pR!|~1x-yM;j*9PgTHS1gGWCCh&Y+( zwk08DTiErNk8Rs7lzhygq+r3791lg?SJ#6?ruk912Qx2&YdGXkm?wo7p_Iw47mabc zNIq=jHa?i%BgRqE;n0%VfM27ai)R#s;uNL}?(c;sVMfzdE{zZ3 z$-T)n%Z5k%*mOYGtHzIeNE|UT?0U6) zq*w{57gOw|yrXG^*PZY;dJahm;^D$d(b)9g)nuRUn93DW(!!cX>AkvxfMaL~bsbZ| z@084xj;6!Vi<*uwJ5a~0!#k#qZr!j0aGgkGT?hCY>ru53L~qG8)2VkVb&5_`9FCTv z^`iT{!x>o4VS z+#3-geXjJQSMPScnh-0#J~D4z620>1py`Nr_!;lHs55{8K)`8^D5p7E`SU?Ndx_h+ z3W<)<9aCfc+Fp+OsL_|`n00_gCv=H3fk2dwsoah{+~K*1xgrAt^Y1y0xVpCq!GULZF|>isji*nkx=fK2Cd369T%ki z?H!X2_jh$n8tv#k4FWRVbzE>n$28-IbjP&A2GAd#-J;=6m5(!BsS&Xr&B;}lDSKx* zO`_Rx+h53pCIzof3|d&k-gC{)n%y;PYo6$)7^)ACcu6-CMB!rf#lXRN~> zGC5)WOFo?PUb-^5X4PRkZvR_vM+)Ca;xiTc1N}wotdH`)k=T`O`68?R`7Zh2WSkv& z;|rLFS=6FE-p@~;#qFJXvR3+;J`M4@8E9XtMo}3DiN^YvWlX5Q9Tz9Yf{H&44YMTru={XrrG|i3l|-7N+uViY;^t*FSAkJ5=cdQk5-O$nOD z`Lmj3)wCduO=I&-GXxMNXIsgp$++C|7Pq&)K!ZP29%URxMYHK_b38{?g=QB%FT!$87FS_$f?&=#XzUKbN%7nicIs&t?u$N0P_%2`zrZEug4x@sKuUH( z#MMy*^&0oxYT2iTNvdHUIXZQ`dK_$2uc0=T%c@$w9!x3^E~xOE=H!~@`LiyDEC5^) zE<9^@uVd))T+d7l!F-i0L_Di`7+Z96B8iG8lDkrrDW+fgSC}0aO3bl%-k!|Y z+HDxY7L~!Mt?R_kj-*N;sb(+jzL`NXfbB z53%@Mof)eSw`a!d@u2MnqBpCW@SfkBVNagm?4kdZHyQR?{*}8e66jdri05BNtm2kx zr%;{G?px$CEy}&V%qvo@W@q@EeubRQ5CqJjYL+QM5`k%4t+#Fvj4pl!P5e98l4~Et zf9I{+AQ=|8N_3b8l{$+nB&0}dM;=&g(ATFp0p z+i{ytSkAxfc6kM+e!6@)YC}U;?wrzO!?u#O-gCn^0d6-&YYm1RVL!)DXTsIb(VbQ1 zNzN;mwITPyv(BVBqVt*`7cu0_J6T6C^v?+$hfPNvi2;ZAw z&dC*Epk6&vy0%W0jb{I#&uz9bF_^M=e0>{uv}3_hg{E>HRp3+%M-{M|PAtnerTGGP zWT?1Vnc6awc_^AdDmw-IS)zGFHVg`OT*a<=?!g@G5g`|NL~ptkxal;2ZUiM~rBk5I9>DA#B=K@0H-0~Mv*^s8a9;Q3SkeQQ)N%oL zZLxU(8ut?j|-f0POt(i<4i$Bl~yN)m2kLko*AP} z9_xMN3U%7w*fJr9XeMX9?bxU^UwhhZ;5HQd#6-5$?xq>EIoC;1sXlNMjX=fKuRAqG z)hVs-n{j0o-EJV{q8b!R)zDRH2ykszqU{?q7t>M8MfHV14+|Tnk zPtcIL7(Sa44r9!>u5Y`?Y@y8oDD%dbLdO|k?!xTRMM_NJOLH*rib?5%%Q7f~>b*lF zF`{Q+AjaE(F%(OFzw&FiF}_N$vto(GJzfife8v_Jc52lgc=7F)5`h z-X;-;2NPL%4)UR}z`8)YG^m4H(n)L!Yl=#bh-y|@#2RH0Yl)t9h!xpS!=tz|k^5iP z$aiuFR4>j`$)^T7uf%xMJe6$IKASe6Ch=tZ06{nK=JOmIdwlRGvE5|%Ni5Fz)5;72q0dvxIMR}DDp!~Ls0k*v?1a)TkFXbgcEbzYvC&9rGRSF$H!(SH@{{K6 z4)-Q69^O{FH{BM>o9IQ(lzV%Sw_K!uk#2eg0Ib0WGM04TMA?2wLel^@Pe z*@2uE)AL)yN>e;5H^*{Vqv$&nE||(>GhFe!IlN*#2j2ID|IQ&7R$r=cPv83cqxQWf z|6$0!SNp#EUYQ>j{cyGbkYvv~o`aeRZ(RIFZ*(7N)hJQ?r>jMADF?ZB8EZraEzQM{ zfBr+{ARxt{yYbbM@VqzP?e*JVAYV9_pWW@R^0UNmmrH%mSBhdLezz#58n!)QnBfL( zJ2Vi=dr_fe`yz%zF5WKtJQqWb*?>el9#7!HVx^lN>Fr6~uhEvAx;3yKFks4Z z*9i-ZaE|h5lqLe}u8r540&jynxsgD;Lf z$*$#mwkPxV?v1sKGhe2O{(EC@H3Snv$A(%O|5|+a*e2uN*k^fs%H10qzRB_+UvjX} z(1*j~e)J)9BlnQH%ighWhw0?7F!A^AB6q%V6MwlJ) z{RltsaY5OI$f7kXp0Mkj-My}x$OQr3bJ*O@LAT&4Q6;zrG&l2kI;HbJZf1wyTVF1A z<9WK#FoeH9o?RUtYh4;8AnOxzc;H=s9ngov?So_;AO6{WSjvZhBT9~F-k#yvW4t}1 zvQxv~jTK^|%uy|NWsVV9WaMsMh`V1RJLNvSj^Y*z-Ejtm(yowQuRD}8qCz*~l2Let z>1Mzl`1v(!!{0N-asKHJxeJ?e$GlRzYW&y!MxW>m9ag{Vqxm2@$3#4LsKtbIb11xBo2Z@f zyu-j{P(C5Fkz_irj2qr_#V)pG>XeUaK40~g)OTCxo)n()Nh-P4J_eoUfzx4s83l(v zh6GvV%IUDZx&Xiiw}Y1DoWN||pe{%LOA)|qDbD}7JLVPXfvXJCoHu8XmPr+Y76KQ& zD&XSk@Gno>@jICX6vNbY&Mm3px&FRfc@n-6It$4DrmLuCZ6x<6+`j%10C0X}Msvk? zUODgz)STA|EKzN)Snzhn1ez}F&};P}-O$@L%Pf`4SV zBUeNgb+m*IixM|gv$`ynGIFinms~ffDvhS%e73R-MuZ=?(z`yi!HKSKk{v?ekDhV} zl(LyUte7w7ZK4G;8btUqVHM2`zlNbo&exD>$Z!SvNDZPReh#w=d`uI9`DjL4G}V!e z=k)jf=&%r;_Wifrm?;A4>=EaO=UPRN-R?$XRL@Liul?84bA7R%NX{GM-e7zm#;mTZ zsEZ|~vH63>R^iNQaM~T<4px?I69;>H4oSADN4W>yz7G&T5cCA?6UOZtEx^~>QHxgB zlXv@(Z;Ms(AA7=EW)NF)QW!tk28zB69Vmq@Hc+gP28u=~14ZDmD%SYK;K5(B%fb(` z%{e9zVx87@-6!CMd@wwB*Iz}UX_`;0|I*cfja%k?GtO1!Xdc{sVaG=E5!*%Q zMq`%CKQGQrbPkUb(|#N&E z?;jsmRs8>Fo25-lWCH{U5+Fj56eA>1rICOsX4`-bR@#)RRS=>4s(@v;E!viZO=z#T z3(>aNx1yqN)GAf06f8(f(uSrWLMb4qs0EAOB}EGIqpe6j&)1y0n@t)JeZSw|KfZlD zntS)&bLY&NGiPSboH=u3N#xp9KT!V3yyx0{dZs%oHlsbt`^JMqUYF+!?*im54Svbm zaoeW)A8LIfw?BB|lx%eS^vOsOw=?*FE!gf@lOwtAg1PjqmaWS)xb&YpK%ZJsMdVUuZidQSE^N0UZ#iJRQgT5TVB};tYJ2lUgzE}?&WNsc*55a0B$dqzJ1L?TOJq^glzAe8MEb%_Q{=wTI@ALq-R zuAW~CWf#sYW&o3ceWG2dMU@4~dw?l%+4r*nf2kWEZa?KIY&C4#wDx-pj96aVCJP0d!f58hQ7uT*oPMs7=GTrQ|#_fytqb63^S(+xP5w9P|HC{46*ynki! zW#_p4l*=PR?-0-%w4btH`zbH=M=GMZ-1bxI(0X$;I}ooG|N&TVtdWFPeXZq}fA zUl_;Ue(?Y>E5}+&-%qoAm%mRjtWjH0DYDen?D83!KkCZ`qQw5UNyRGl+0~dXOjrtn zMH|f_brJV0oLtQ>=a4#pZdd5XNUpO|*NrHMwI89OKdo|sKZ0SjL}R^IJA<+hdnXDY z&)gJvr1r~{`tpvInRkrCtBcc%Cgc4N4u2fRBe@yWHlfGWTx?to269PDr`iDFwj&~Z z(i7e8a%~(z9^5xDc=s_ zHu1D!pgBvco&Y=e@%PYRsdj~QCyTszGt%S>B`(MoZ6jl+spx3J4PjbdW|~kmd+4ec=t-2GEOpQcqo9bi41| z(yzQijI&p#DSSM(HI(LiRVGT=Me&%mat1KigtdBrJs&2ex2xeHZUtp%{(a<@H*Urv>Sy2Zp%S_IuuJ>-_zRzxLUmI7;2zJIVGZ_N5%R22+9m*83B) zjrA1Jk(tb&aL!Ca2JF9T*?%==|BZVK`_DGKrnK)sE3O`_ekvSuS75)s=qu$UE8lVlH0@Dc!s= z93rXX9Cb(}E^iKr4DG(JqF)?5os;Hlt}j6w#5L)o{qT{&%X}_;UO>*B2=vdK%LC+4 zgE5DD^kJ28`jqDs3hl(>2cG*4GwdY55XifDWAP_`(+q!vGZjN4GR)^k`GyiKn(%{M zz7Un?@dTH?JJSPmnq8^##RKJ6XP;-wyQXK94t zo<82o+J}Ez@9e|BaD6-baAHl)K6Khg{>HYQZ$Kfxxgt2hD!lz$Xqt2b6!DuYy>z49 z6!~8$@)uQHc22qW_an22W<4>>jRtQe|obk2& zy&cM}XZo?DhC6jjuem057uFNkX)5i{^T3}zB}|R(PplW0`zwTrn#|^;i8InI#lGQ2 z+Pbg=>%E-lA^_i~8o#-SOjHj2DHWkdhr?y`{swzr8iJIw2e2(xx6Z2vp8L=sa_EbH z4zUWhQiC+LjA(|l2GqnE60j)K6%|4c`O${V^6gjMR?iy9K{{}uZ-HHC*#rEvh@{gk zFVu6}h2uAudmS@)9PY(QU#k1&GOuH%J+u{*^la|Ejtlez#UFnhy&vD|8~xMGTeDIZ zv?aKMA4~~-^;(*s;>*+V9m4S2N17R0<2Ua>h`z_$GOP17GNEyV^ps*E>Br1UeP{&d zEr}BP?9adpe7<36T%&27{$#$-AI7Z_*s}&@O2y1>+`Sh64H1blJ=5o0;H|F`-j8_c zO0G7}a66}4)<8OKq%?{)P}ZL~6ThZZuWT*e7C9^B#E+XA@cu$OLjS3+y{3MY>|D{r z&r`ei_pOdtyXI=lJq*VX-<-#qaW=?a!_eUKSi4L}zHyU6hre$f=dX}2xi{V_lzQV! zByjeVa(1f+&K>NvJdH;=y#(W=z+16^57I49dGV#`4&8grPkAlvy>aPGKy<2<^iM$r zr5)#_vz*gA1x5)Wsk7IxtWzna_dEa7y#M`)-k#S-N}6s&V75&OmTF|+DgHWG=* zFTc5yofUhEV;_kxEo@$@;WJi`8EM;+WALx_%@W!((EDsa45R#QLjV16T49dc;b|XJ&()c?XM6! zi8!_@6AjL*a*gPFgU2iMT{^zfH>RVFo(0HiU`QAM1UE3I$w6m>yS+-UkV2NM85qn7 ztrlk~-9DW!vImi3TYrreZMN`=B!2}|>c^6B5yHEKtBD^3Pi{tbG`=HBXFku{P7SH? z@79Cz!bKGklZd|kZR=N@-J&C%J<;}}1=@8*+~ezB^jy)jL};Cp(#E8*o6Zw_lQDJO z$>O^8CWvpEz*C4UbH`?UnZH3C#_eFc+h+4-ch}ffp3D}Juz~m%8}Zozl~L|$T9#gK zk}BfUK4+=9j6VlZ-p$@>WCfgV4T$g7;sK8Kf0GKGbvD%#-;j zwG8o}IQ#zQ#n~hu$FD1oJ@6uj*r2nCMUuf{9>0XXC~UD#lkOn7Q93s zY6u)iEz-oc8csLdrtg@zM0mNRT~&n>E%(Zgcq4-(<{Wv`a-`@C4nEY$N3+lGAI?7i z_=X|&dFj6P`TJY3&*N?}EbbDB%z?|```hOW%{Y23=6zd8(UZ3FM)!#h*%{04n=K)V z8u2>u16&FUu!|6)`@6;*}%yQ_Uk zuA9cn*?=+_J(K@QkGYA?V_;0@s&0K`Si1StyG9gITnsmE08N5eT8OMqj_&CCd1U@a zN%2US{gQGuH%swMeBc+TDO@M|o@oZ&FrZJw;0%v@e@ymq?lW36zSxJYVQiBbsrnIz zl4C4(*S7SugZlec3N>LbSjI?v{gd}$XL`Y;Qa*aCTrHVr80C5SQ|f)fS*dagfGSiS z?JMWm3{WcJUdtiVxM~igm|^*|o46KnZRD!yQ-eq4k0SBpoCw_q+4IE&e_B3#>M7R= zqgj~zF0&E6;8 za<&(EZ}t^CG-YTdKIu;>dTnDQ@iG%7A{*Jbk@)MZRNaW=Gu}(>4@X`jgM!r*7)&Ai|83J4LD2Z?xR{ zdK`S?N}>=3{+Yaex3%XRUsWK&y{<>9gX`f#cH~RCYTv!TM$GMzbc|D0>3{!3ns%bU zC>lKQ@SgrU)=FaSEHq$AN?Ax5mXJo3l~%iTxk}P0MK{#S))Cb$XnOq(=F?)*eXNEz z*#7p9BBTerH1LAo0Ur4nT*%cwk?1A*Pm)iJXflf{qlB8V++mM&$`+siRPlQlFJ1r| zm=m$~)xwU5?xmHtQW~lk(LCKsg>kF)=^yZ-8nK3XDQiTbrlBqRhPV2_y=DA&?BSPx zhRc)?N_zSML8-~6t8kS**ym$7=VW7OB9ADL4zn)EZ~^-Z8DZO4rV?C*Kwn6=b2Gr8$)v%$oK^;c)2k3 z2>J2%jmc!ci=VPdob1^K1Gs+(Fl$daU?pVirMbjkHxxOD6N>t7mtQ0$kAjd&b`iHN z8s}~FC!;_ooA*iBf*MUv+?(1RnL8%+=IF$JsW-Op5OrcR+ ziRduSEalY{P|`LRm*+yKnL_G=Y>&b6jd_)(ZdaX=SjQ)*G*c+rvyc4EqC}^8Wr80f zH~Vf3`(tXbo>_j|rZaAou#^>61KV5BY&tc2G~Uf9*@151#(i8*YwrPMKL?G0@@TSq zmy?11^=+x1DsStjHl0`7HTCXygLK=@cK!zE8}#jIb{5Gg{^Z|phswx+TZ%)_I?Q<8 zXcc`1o??56!PPnC?7>RDi&W(0ZdMYDZ*A)lOsYAbV0kw`oX!IMINafl3<+tbhTw&a z+H)l}Dk-(})kvzWNH2Rst)XqSuhI#kd&d|Ot{X0-`n;AM1~4tH#Kc|PR}mjiX6uo* z-GKwT-?IMCTm64q`ft?F1iv777B=`#>!;nczXUoo1uq2Fe(I-@C1Bp@hJuy|jUb3j zN07;C{;&j*01ZC=Zz5#tTdqIy@%gmj^GE-Gf{*4hK{tH+?-0oFQ5@gz|0;^i1cTJh z2AKn}qUBy-$Dr}=*ot@6|K;QSW%!MwUJb+Xy2_=`eZ9D!Yqx6CJ&YXQWHTd;k zM2&O4{C4BLn$fwgh&Bh4_YNZZyTb8KLLa3lcVj*@@DyDFg{zV8I$v6Hq%=6+YTNEv z??)k_ReDd{ z8W*gnwUw3J#M*nHK$=YyVj#I>C7^`H8`r+pzq!5gXbSy%`$gC&Qro4iA_ukY6~MVi z5{e^id{-qX2$QxR;k&65jK^^Uu}ZYugz4stLGCd9#=DtaGBi_ zN}=^bCnmp3+NZv665r+85S4pP_|N<~%R!tCjDhEAcm+4I^JPqM>oe^nF`9#W>!8AwbJRv{YF{r^W3p^JdYX$^}BQlo8ubL)*~XgeX5QG z`NW?f;w$D^v8`PRp zbUDkGGcYxw_y!;Qsg?ZFf(S_ksjlAbIZZD+8>-UidK#w1yXwBt&R(VnviNF=T&}aZ z7IVFnt3qck;u__8frrf4%8d+9X4eqSX$J{SX#-K7JqT#v;J0;lj^_99-u`o+^F~!W z=Zy**wjOLiDnJ@e8&w*YD5F8&Cqf*b_^Nd4A)xLp!>EZciys8QQyj^6u zsGZDhS>C4~=!@|lURX9sW396XCRq0mMnhNPnDnI)6>Lxon7Dq&J>K6%)o(5+SoCg- zJ}6gjB8n@SMGx$+Mo7yKrT9nwl+RD>ze0b^41Vw@(XJ{5OA+6o8OjAVL%GO%5}IAgFnF{>2nIGuOoUnwpT%)&Yq7B+#{9C^S*6~D8C}d&@ zEe&qagq{!vI&C~<8+oSYJG)dI+X%;Eboucpyr=k+bGXWS_-{-+Sr6iVSUJ6{`cJQ! z^=!lOFG9;Vn6R77ae9AUOt@q-c!sN>I(2h%tVAK|-#9CXfDYJ(y&$y%WJL z_6tbC5SY2TZoAy^T(7fUipUOJ4LVL&M&z)z*cek3nlPOph zo+s$vp|AbusT$XiNJe@oBr>A{Kj^Z?I!UYKiGJ#8%uPy76PD6T%)#NMf?)o)H3v^@ z^rENstBjQQWwYUmkY&eSW=$_Z>kQ|q?I8dJCNGu2Z>+J~^-sX^Mx9}t#*L(<=IF7Hn#IuFzu#lejxJr7`2-ktdNs(c=m3P^_ZqOo%p8)UjqhIIW+hqsy$t5JI)F_MWMP6B@ST_ z?4v?D9qH^an}X|3;E)2>iccdI_Gtwz>sKo_zNd6u@GDA$9?Pn}XlJT7QupG*TLLnJ zQZtb?(72@T8l`__E)x>icbOJ{0aJMxIm$cl=gu8n@8Ka0BCX2JLC0|EJLl zG_#Rr&h%dPg5UOIppjNwvn2rl{tks)RW zCm!=I4-fZI2M6~st%VQE{Uu^pqPT^#H^wvmWgc~bIbMhl_y$dw68i;PRK*twlbsTO zJidTyQBVLg3X<0i+v6-$n06Qyz9wSbt@DoS(QnnXw=CF%Dc!cIae=kBM(EQ>MLssF zy@VE$5^rztb^4ID-k&&?itx!Krm?)?m9VN~h+-)0{`!mk04(?R>bqURrS?Ul+`qI0 z^H}}8Prza)HQD@TH8}VEVOD2w2XiO^wr2NzCp#Wx(9vvpH>4dT54lRh=~|_${Mn-4 zlu9lY{*)>%imcLtg>=p|t~Ge{(b>-1jo6=@_22vp_|lBS!~f6V$)Nq;gePV8pTZMq z@@X2G*0IPrJ3SUmRik+W6@4*3lOLVsgL%`CO-GuE1y=WwUv_vjD2tJ;dVV_vhIHE zaKFa8UxE8o?|unAN;bG(yWFqFfs$Gqc~11PxF?pUMKq<;&|tb=!boavnMy3T`f49o zZ}Jo81yDq8`vQZrkHrln!wGfsqsdq4exeQ|m=ugE4y15_TG(Ex?Us519ZR^S0v^hQw1;62PARta zT$A^FY86O4%dJ$LIRV%M^JDQ7I+W%&1|NA$Y}GSY{*A<&)+vwIINcQ&fT{*vdn9l^4J@r|VDbWBfu5@ORO9)K*j5 zZ_L1hGFvy|>er;YqI%Hxp3Zb*ot6&h-qK*5CivW#BI9`8$F|pQj@|oktnt^FJ;^6h zy%ne7*jsRKs;9zIN;!vwTQ5HE?h44?wsR$a*~}<=?a4R(emkS%R-Qm&>MIE*LgTg` zmBH`1_PtySLjMx(-=`lHnLnMB0a_Y-^c5_M&3%W5#eB~FL@$sY3|PS*Mc12+^|vK= zqn?#G*5oetO)P;Tlgo1lmhdrFU@0Fv*Ej8EI+A_F z62FaPBvnaDp7H$gYVxCmS5$+umDbYE}A$xe;>~W=ohjnJ>zpM1ZJJo zj9Y1@G5DBDBo|D+%6`?h942M5V}pLCQEi)AzYyB6cD{xVq|l+8W%AHq&hU4i^EFD3 zbK7ywM>?JoyN@*GtIComASU0-c^b;{)uz`4va?{Z}Y|bY8`(QwE<`AsY)n3LCT7a%=6o^=j5n7cj*LkEu9h znEgG;nRK-2Qhy{ZuGc)mLswjWjJd}i24uONKM|~SGmc7+MGu7;5yvf`A}35}I}FE5 zusp`u5?IOEgC$r$=3I%tVfTy!^f)z%>-eF^Nxb;YJ^g)K2Jr)Jk?^8&o&T%8Yhp{t zS@^r#Ha&P1BKb}Ewi|&~Erdy7hGwOyIySOAtfwNpR)$wIRIG1DxBy1RYxE4$G~eF6S5Wm~fCTUdpAnjw@_6tv7onRJC`i;$ReG70(_9 zF{vU9K%bO73}RAMIXMcwL z7v_K;N&Ui~2Ij)-67LNiuh-fM!kSmk^B;u%KcaxzHtn80RR7e7fW5eM zo&ITlll9+y4$dMP8Q8%Z-)Iu7(v{C{~KU z_!TEM(KRzQrexqgL0?k~)MCrrID~oc#3psWw}>N~8%$J89IsrO6C2aSaZjAwJ8=qr zI1`;*Y$E4caQl12D6u6!)$oAXv?XqOLu&W_P-rF(>gSSoax(6UBiZWBQ^aR%@n%&& z0h>P79)qCpQSZdbf=e|9etI!p=jvGO#vWe#@#1s~iB)VR-NVE~EQw!LQkzaRU0Yh& z&M&>hdJAsAmt}!4?H^T5?&Z%T+IO->c*fbJ7HdCA?^=e{PkYFXZ`YCvYzJgfh~xB{Tkn(z-K?lF#@PO6txm zPW~1)tk;k*ib|St4m&`i=`$6r6P&T_M51Zwn{-jOI#o z$=^|I#9^wWRu0hLt^9pXcp>XV^=$BgeIVB%IEbsL+I^Nd+BW{pl>eNx@ExC{vV7f? z-6Pt=4T~5Z$!2Lxj~J!JFP!7q`Hdhco4h(Ukd_LSnP&Baoan=+LBRJQ2OIaK3H%4 z;C89|q%W92637y7LMhSMVMta9$!@&~Yz>V<;CiJtm{g?H29t_OZIIU#M>q2eLF8#7 zGS?YH)mg>YEVitMFCl@q_0yZYb99LNWN*4wVI=GG2F6#Ru;G#Eg#fkNEG-Icug)-H z^7GfB52yHAPf|)cEh#FO-KqCWeyqEcfxM^&Eja_E(^qlEt*a$(1Ry;%2xz1D%bksf zK%F|x4T0p5791f9VhZNhG%TeVsh*kHX_07QYdKyw%m)unUg#t1yGOl1|( z+Y^iQ*^t9FbUkJ$ZL(x4nKU=NLOiIag}TjVtjJZUyw~7oE}!EfkSGxG`U^GCTU~ zUsx>$`QYIxuY^1|3Q!U@*dWz_30`TpnIKYz#H{yo-mi!&zlRe^K;5PiIaw6zcw7)l zD}xg{@aCq*lffd3Q|9wB$8!jl@hbC49;qK&YF{vqhHV26zOYeT{PM-N;@l)5n9?T1 zN9bzS+BIm#^Gt)SKD;)B*G64sxQxf9lkWryH7s%F4bgRmrzsiv}IWW+zN!{@wn&i4e z)DOOSD0ZZFukmWw?HbjFIM(ix4zP5#Bq35NKbZ&ka55i+b@n;e6yDXy%-NE!`1w3f zFw)KY+LBwFu_ei|{8}*gdiok6cqLaxZ?#uUd^Y!H@}^Ulz6~jSDxy<^YtF~6yc0~b z1kCPNu=%u5)1CybQQMoq7ZE9}q4Qtnr;x4zn&}MD>fn4(2xUkRC zsi!0s&al2kE~q!Q^JzL&a9W-uIg0lZGWYXJMb=x9>ii=ApbrL&_;9_7PHhYhCM96o zrsbc-#&(2k2wee9BDY@)7xN$*Y{7;M*V;<_&lj9FyK?f}qlv!x@CXui53?90Iaa&P zCh{nlDRuYH+eVb&=R01oW+py}J63^*FM3b($t``1$iaat8W(ClO;VefK};*u=P%Ct zolkkHOMXRoo1!UGs~@?}*s~E1DeEg+qb2z)#7Mer-;s2~*t0@BuBa$NelvZsOP+RU|pEHl~q0rYre0T@ZSB@h9|D7-Vzo40N~F zC!vn~0cG@}F)4DhjIkgnDQzcOoA2K>AbI{+yw}p-6(CpXAIR`Jlv?-dI5Ls;Jt<|a zHhQDqg(MgW zY34?Jf{Al60ab_sMzI9*mr?$CQ3f>gHLV|4;YrszsjWb`%E`=rFaSgEHHw+skt5i2)xDIqLk?RYlL8{us8Q8ciM?Ub3%{{Oo@c1o8REaaEW z5rf+ce-7cF4-CscvHK1+K7p9pcoMQpmX+9dVw-^W;iL89qgnZkG-N!#i>Gn?!IFmZ0g31zg-jk`n7A8iniH_Z^^oJVkE!Ujl#D2`B%M=uXD_*`_Xc~Np zI1z-^CH{xeHD&WoH6p~?m!d4LIa^exWRtW!VzL1k5|uSlU3}e$G|cEAm03!qaK?zl z*x}3px6ZJ8L}GvR8nL&(H~J+iT}NRVJZRO(>4HxG$2@d8_q}m2U|Z*po&0CrEg=?` zV`mm^_pq=ppeR~fEFWi27)z{gtGHik9iq5@vajO)^_ix)KOj)1cZ``b$K`%Ie`Y26 zv{=iyR9@s3X*J|3Jcium&?A*IW5e~EaP0=#RinT~{NTGdS8Zs<>3sh%`rz=oLlcuy zn~VF#5Ld*y^Ym8|6hBvcNHyoRHPdP>3*gq*$<|5po7XHTgd zJ6W{w!vuC~Zv4CWlWEqu7+dgB6FgM!v!^5Y`yJw=#Cc{PHiE~6wVK^D0yk)X>Q$N6 z3VdScuS5<^6`V+$z)}`nH8Be_=9PJmvL;Oe78_b8&pDlOl9&n~48IaUyLXRB-rn(o zZRt(k-1ijqoxZt|iJ?H!+FWo0v9g2@_WdH%>)>SH1iwrg|4ehMNqt`vlVgvRN_GKp*5*+L-G+8xDZM<*})jBiF+E`=q z1=(U&mTTuox5=&=4-j2BU}xnHgi7?tIh1W@?y>BwAJI;G=h~@vuAN`e3 zRy#R8+S;iGdyAspNEhF^Z~JUMD>dWH*Z0mT9xz|aH{}}}l_nNKeUN8_ROCI+u9y68 z!F$K{$?*0OD9Z%j$38l@BGg~^LZ86~(%|{TJFb6t`{@6>`Zo+~pS`pC&8l+KuTB4{ zeR$XZQvG>zKiv+^mkf`Spt$&bXO?8w|BLW?u#*At&EQlv^r-*E694St!m~>wZ`M6L z?|{13=ZzWr(wc}jhb(ucKIJHr>M62$-*mne1T7oRDXn{W&bxp<_F->MX{6gbyZAFh z>7n{5es*bUPvP97QW>euB7r@-*z(pzIEdLO$;W>u4`&vB-Un<93O`U`Qqhgfet=o~ ze+{4US=)uS90-X)P{_~>?q4l!IdKY}sp+M4d*@V+-Al$&Sr)MguBgh1A1K-Z41f$~M5QBHK z;1Nqk>;fSQyeRRC(tdFtBE2a}B*V}HDkaaewkGo2?9E@@u9i<0Bo{A2YZ|cYPRUsx z3CsgTEQYF_MyCvCC5B?dKTJM=T3ig)smXi$wwe8CRvs3{)1No>UY<1%*Ji)Nzlxhp zP9Pa0!E(x(M@N>S6xZA7`X}cO(e<15)%ACbH_LE>K$&K8`CExSG=9+F8Anf4(e@hu zP+H6KCUX^}V|Gp!Y<)Sj__WIyjhcM7ixB#`vMI>F!sn^%`I?O^xH+-`Low;vZC4a5 zz=+5z>ukBaF;Bs0s-e`4A;yn>tGgppT)5yq<5BM$N^|yLZP(!VqoKct!iQf$vka6f z;DyrQz8{Jg8k*sSi8@72Hhh?L7Q@hvemZbf(ec{+t$R81F5;@i5A8Z+NU@KOhmC6G zeV22N;r64tZ`smu5_qoEShr#TnFsm!Swjf_eGCmsN~Fgs0k(-=-#vbCH}wD zLdQGD-<{V{5&Y$QLj4j4-=pupJ0U#iAry!C>pM2@)Nl~1LLqgvzWK~``lkH#t=+-V z&i_0r;)-w*udkgjB*o7u+Iue+ppMiUTr@z zV#{r!&RKv%Aq0#0jN#(Yfo<{OJy)EBe9Li<^0$dPA`kb z+E1XQVDBf?Q_nk%nYYS*{Z(Q7-$z`EgJWn5+RcJr2EKcg@A@_mC@>d~RT|9uZxM9& zM9Wn`EqH8;V>hm#F5hpU=Gv}{{rB@L3|T7ibJ9=(~zf8qq8y+C5 zo~Cn$6!^tArLVm&)qnWBqEzP8?q{Oj!}isJGb8DbZEf8%dhYSGx`e~nH|+5zQ@;N0 z^vCW?y?Cm;#diZl;WW|1V-p{tSaIZ~CB-A4`Dq}RY)dJ$T`{%OQ6@#QhTVEp?*xfV z4wgT(eVaD75wz>(f23l%t|YRprZfT!P8uKCzAf2DMMa;<+|3$)Za(ekF*&&8yP`)B zhwWV`YmJ9B^yX%~FujkyC|)`DB2?VVUN_xY&DQrjWGF~k%!ZZVYI68#Q<_D;6Gfbl|C(oY&{rBg!pD**<&uTK24zwS7{Hykx^_buOM|EIqqTS!fl_`ZV!kl{hOr>;=8(moHraNi$<57*xCx;nhx99~=9HKXm7 zl+S!z*X%#>e{lJ?)%LzKwO?#0ObQRnAX>n+7`_|FxEYV}uk4fQ)O>l-8InvzO^P8dkVZfP+yn5^C82+AW>o`~)PsBeZ( zO!u{N)6aB!;Vy7{B`v;F77`>fkKOaMLQD}zB@`_LQ&nu!r z@`B_cDX0}u2QK7tV1z)Lq0!Hh_Nf`-VLq=&;>%OPqKu~5mmu(vhWz-UxJ_t znk0Vv`_ykR3GVCH@Ptnwz^z~pq)WYK3DVhKbFm*LU2QJ#XIEYj$sp4z!-8IOlxG*& zv-;e#5}sXc&l+;iwEZGs&l+>jw4Y->(3&E@e&1?Kh?p)up>9j;`ZGc8wAGfTFt+%^ z{9wUoc4bkR--f36F8Qg)ip90RB?#3eSp;0APdb~b{sOY06E8`WW$S{H{sK1pjwIC` z%3=Y=G6t=8f9i!1nKRXD)31`|4Ym99M<;=>5TT)U0a=WazYGxvY$Inf8sy~n{kT}C z$rV`{Vp9787_Nqr-k8kOh{E;M)SppwXehr!{6nLlg-kvK`OVE%u+)7!w)Tb0xA>-) zP#U*KZ@v0D^PORy&E?swPPJox4apFm<)iT0qC`<^^8y%rvnGX-Vg`e`? z>X(IjI)n$}1#Gg3d!b%+y>Z{GBqvBuiD)1j@4>lTwcc69Rn})Ee8)Cwq$KGq*kVJ- zLZ|Uv-`_hmp9sc~*`{rie+HXE8Y_HuxYE)W26fqbt8k{+d9<~!O$~1Ty6QZPI@@-tpZtZKU$R_@ z>?PD%I=$wlh&0umPOVean2EIL??aJx8yO|Y-_C0;x9H-<*Q6G%LA2cjyZZ4peoLnh z4CGpw-fCFJmoo~BKuk>xzJQ>VXggo!r*8yZV?oR~!EafE zTs+gs#U@yf-1^=Y87Bxu$t471d`Gf06~85tT6oKT1Qjh@jaby;CsfEvMxvr6Sf2!d z-X}iM8(*VF^~P^?mz6@5lSk

k;}WzC71Qd17)Jog*FTWt^Dotb3}oxKrJ9y4uRrBAxBJaKsqKYc%MwnsXjxlm??_kQLIm#W z*!5oncwxNQZ&^K-CzFZ`owuyC$N}-ri~21Od854ZI5YP)h3ua#c7cK|w`o{~C<6JaqS;d?-q|6r_G<)h{Utk=?-`pYh}bR({$c3g|@ ztd}`wD!Q%W?pOQo7MAZwy?vK-k6HCLupVvt?S$phHMgJo4)xo*QSVg0NyrCdvlZv` z+tgqkX%5;p)lp-ZkPz)=g2h{*)m7ICsb6k^#|mQUEu$n9cSs_#RXV5a#yshi9eVIx zs%TBMSn)IP#n=|0WN7gX>!zt|KK?D^zrdMgK+I24b5n`f5s*s@qzi@}w-0H2Lt$RDm zMki(V*EP4gJc?+W(>nArd307&geLgKh-;~u-KJ_vLp5`7D&CHoX_xVh52NEyJ{|I5 z0#jdh|Hcix>rcmTbBz`W^GT5-LY`{b0|896bjI4hhxewp<08S}U(TRd0&O7mQoD3q z$}8RZ@l}IW^Ba6^3Qs01ikoZ;Y~ipIY`hWKNlKAEO)cy+?cBMKcGhHUFVynmJ6JX` zDrGFG)!O&!!}R>|K4W>ka41~3G+lfX-QzFBJX+HI*Ac1p3wR#&7PiJZPL`=*-H~n_ z&+$TPlpkMG7;mk!``GpK)!29^&--(E8+~RM^tu$_y|4c^^-Q7Hygafeg62eLI`AVr z>(aYrW_T;q-}gw##^R46xV-gj_U?D}#(rvVz4S~Tr5DtVaJ-N%zS}{Fbfe}_W{V$T zQ2S|dux}@ca2kDK%kn}y|A?H}>1p>weaGM*FY(i=F+J_e(a6?pbB#*gVRE}00Y(z1 zTC{aZ$9a?_r#aBs=On?=JE>Tx`i7Un=N8R$^?G;CQ0*&>W34LxPSxX|RSW^-ul!gE z`WXcXVt5jFVWz}>+Myy5tKGMI-@v%Rh?sRqv$qFrLbV0Hv5p2?Jg>z@uodc1QvGMc z-OvcN523joRTj4T3_qqm1MzSaC{cmtHE8PQ<$lZZ+6QP)V}2VvYlDj;oEP;9wU~PA(XYnRb-{Bo^jch55FUc~_Sz@htabdiq&Ke(E{GwVH zU!tbHTTQbQcKkD=vPi^o`4-71ewAxie06AY#5&5P@fWTkYwE(~i_Y=Siu&;Nf&M77 zNWvuh29@R}mvFxHBVNnWz60~@lURpDnAs@H$;Z{a)Tf-IpZ(QnEM@xFimJ4E+4f@w z3mfU1ECaQ7OQ9}ojXaWCxGoxt@8NhPZ{ZSoNt;_UxA8Kya7h8WdZdZAteUPAY{Bst zmJL?dqv+rM`>0W-g)W)hsLW1BsopbfGSz!#u?AIUri>Pv5B`o9ZLXZPsJ!0Piz6~h z>m|M%<)U)jxJiqbID?8VVE)qsF`Kt6I?1=A#ds|BL|3P$92MzCJLjosB>Y47xUaUh zuGhFJNX!n|V3OFb@rfSC;$oG?C$_LJ({X%!`F)gzw4KP>B2Jsinh@KL#${k-Vjb@S z*$iiU^>=nWkem_1Z7%idNZ$Vv0hh$NLFL33-=fB7evO8t&z-u=8i&ZKIj^W+V0FukcIclwmy@?yzz zpk11H4vq%_a^0{JeuXsI5IhRlYCwgxSw9pNF?~7e_V7l9R!#`5=kl_3O37T-?$)CN=xAL;2q8 zH@5rn0wLg{230s(n;iV|isO2y6a#?vG#9Zc16Q8dc7PJ(KIOHgB-$ zJxES`SQKaXWv4l&eb*J;iygIp9NH>lt$H;Jw0c{BikgtKqzvg1YW&h*!c)e+{(P z3qWmuUpgF5@=;!TL_TR89|1<>u1s~6cnH1~O%|O@-U2zswVx0Ij^nso9E#}%`DGB& zB&;d$K30^xqIZ(4Iu)rVkeQy3wSR}-g2!Nt3gC{77#+5!9hix;C_2p?#ECQfk;V?v z;N&`pbtox0>xZ+zJXjQ>kIF#>b+4%d-9omkXly1+Ol16NLtZec1Ah&T0(1 z$R71ZM3T&fs>b#SS3{Sp;gkT`R1D2U$&V&-nyDucK-aiG>V+T;K1@82LKS%_AD ztvein_}soNliMb7#*pWkQ9MnjK9F;H9GP=@oWLDyUz8Ne^hrZ}SDvnWdC#t4bltD8 z9Qtk<5HN22cV=)24PyQGc$WXPro>VP#0=hCWiq9h3Y<*Q>0Dx4WXdp3diTiBeVvjmSt@yCo{mIv7%78v8+zCvYeLCi4^V zQo%*R)=hX}<`mUE9P60L$W3#evJ3tmpKh#?f1?H*HKeN2(HrWxja`3+8{v)F5g2QK ziF$4DU!hl%Sv%8-dpFM0uSDenqDT+$s@u|6N8W1C(_0nb0djKpb|;U_cK#&irmdhY z13R>hnX9@gsF(lLut(j z1Aa;O>}4CGb8|!V%-j&277o#iAt59SzBz$N(41GZZ)K;o{}4GGftyYZ2jhwmMrR1) z6Trv~V6FF9gwXd}HGq#N%ZXd>!AYE3?759mMnZm8dLGXiDF69?1OD*zw8KWU?JZyy<+a=rTl_p84v(a7x8$6Sjo9?tca42U{;BxNUOT!M z-edBr?3QxkFI8 zTH`J3DO~7QqAI=Shy14M$dg|4R*)$nxn;wq{c-$?CVLfw|V@ zIo57{w;SK_HL><~jK5yD>cbJ?*;A5N(`Fv8(#00K%8>`zg|7X%U7q zTNrutwC1w869)SP;%kpl`$K=gNvh97-!{Sft~WZ8V67qd>W5L-m-54JE-3_=3DLs% zQqG?CB8Bm_UWaNT1(6@$s&qv0RpKWt+2gd}SGaPeDX}fHSs=$_IMdxKlplYnu%+F# zAnXe-zLw=AW%*uojF;^6lO_H+Fe~d*i(&dm^D3=Rtz~^G*@@5tC;Tpf6;qWs^Y%b;1mg@t)8*#8FCv93Zx& zv^LX^6zlXqPOHP^tl!cSq$~?WH@+c;!iO{}yQH<=ORmCm^l;x{p}a1>!7p8G>sqmn z4}uTvQj`AbCs$=Q@O9R{qa))>yynLtC9s>Hirr``f8lBlWbC*=ZE9Y^!V6h>B3n+E z;E65X2{>vesCI#upMncWIHa@I-j~Nb}KU;#N5JgRVscP9{bz& zOB|J2xVB$wTC1hqp2H&|em?GW`1vV*WDN=P|6_krIM)6JjJ^$OW#1N!hw&H;vOlw! zhiGKpq*(U8jC)Db`lT+h%}8J)ne^zadW&(7uZ*?-j&?ekuNH^y{Y-(%vh3{00fTk` zq(Ad*K=N1&8>g{ky>#MOGX;Ec9oO+b!vVPR)a3V9u#R)V!=YszD2O|O=n-gO>%N{n z4%VE8NVNw*mZ9l-*ycPPe-sMkRFO{IkyF%P&ME3|gi3Y~pNTG!!|+k~%$=}@%6ZoaiOpr9l&3_v^0+j(^P7x8ZYW>I%LWYWD!!}d zJK0fdYa#Lw;nvZG3RgeChhr%5A;vBx7-$GQ^Xd zq-n5Pu4^uyq-p0%s(c!Yh?bY{KnK{)sI<5eg#b;aDn*(!an-c2(ZizrmK;+(#l+tH4hQZ?N48f&-B3;-~HW(5ykxbGRMC=s7$OnlIpa zkU=p6+Rs#6obp7au?LuV-=jex+t{5$FHgW0-Z}+|C*Yk;{lh4@nQ~ri9he1#OK{u3 zO^yp&g4-0%DHQ-WFbmKcoMy3u25+pr22`{L*KK20Gp~>&kU{P^3n~<8)Y+m3UB;_u zFb}eX6M^4|GPJbz0hCP(n?G#e|>QLkg7tPv= zg0Xm7=qru08fNeHvG(cu9(Me2_`S<$mD(OkUW1>x25>GuYzBB`Hu1A}ND&V9>L0Ry z(&DA22A492ZrhY8lZS0GMzEi>WC3sfmrT&DYP%Q5YAMD>K7b`XA@eNny!ci>Uc#<* zGo4w{stkUm$Gxcf@BsT?^4lk-sd-C!@|aPPMU!L$;)d)-?g`@oX^mD1p!`*F zpqBC|xB#WA(Yjovr<571cr8z9yf#!Qmf}z^zFh|9+03Th{M4S2=3?j{S81GVL#u%J65@$QY?}N z*FZxwwuF7QH;zDgGPV*|`XIb;yLJ;EZI0b%DHJXp3`h<*(G@?)>mJsomZy+uMtn!+ zK<;LRafAPDc55e|^GvA_BX8GWR_@yv>Z8qo?}}s^;B2#3!ryXVx!(;D3XI773H2vG zx5n*w!QBtIvK&6e$vaZ0bEHt~D_K1WE*<9-{8l`rz=0zRGM9zl55Xf-0hrumlpBT* z3n%r#VRJN~Rvv;cpOi-|{Zzma%89Q85RH`;v!H9`;by0DXQr;OdH(}$^GF$vdiji$ z5hQm&kMIw7WrPX3*>w?3K8|Em&I+bCbQ9e0)a2d$cLz*BF5`u+5f+_nzghKuufYB0 z(0_do9@cU__jYY~tog!{zO(Xx#yY+vx(@+-9e|Na)otAdX3Oh;Qw?R9EZuvK?%q3c z?4vB}I;c8QCD*F+wzyV(D=*PU7;hTNpWted>$1{pJd5WRe3^}RXtB-r=j(5+JU83a zf)$PY_R>xKr6O}pTZKhratu!)JNF@u3%3%!E8T1Ut@eZXo(^B4l)2d4OJ3%hK9fkJ zH*%BuGmE{BX{s=S+v#W`iB$gUD%WwL>NR+?dhG}4+AaLyq`9A+(`)PTC(TJ-*=y_A zCtZ2X=Xz~2b2cK#x%8crTPp~sq-5)gR#Npc)&%zwcMLt)H@QX zM_R{ddSWr7u*fY-W`*CUR^vXfq9hL%($Jx}pn(r0-3UL%oC)5`nUxx}pE%9h73&zK z#^eMB;|nQ3o}7<+k<4~jo_(!h3>%`35mq0$Cf2U`>%LL&_wls9?~ZWfJBuMzKPH-7 z?$$v=I3I9uMjpzhUBa`|jRpPGm7uOrpT1R(@?Ew^TOST3d%Rv@?5nfcS`YRMLoSlcfP@@`(LeXXY_dQQ-7YgX>FY?e1?~ zFQzO=H2LwTz4+sP{Havee(0`sORz%dO(tI3y@lIn^~QIU8!k}WK0fDu`GI0LDsQ9f zw1Uh;?vb}PVBZ&i>as44*pThxkH3!^wEo6$wNCE4HEcjGABxT|E)Rb2c@3bd15Mt@ z93LOr;N#3xSMat%L1sIR_u6-DKzf@KhoyEGEIN5?Z=xo0zvN5bwAp7if1QWxN7Y1u&oqQ?L6B6Y-f#~M#3Kagd;;*(Q*qKV(Iac|*{ z)Smr`Cyur61dDJUyCdsrvfnh@3dU}HLVXk8(b2!?_qAQMuZ83-Ol;JSzq;MYSL>2H zuIWk_+u3aC2?{dwF5W)22jO^x?(-Z}kFZ?eC7&i$F~N2ZlUSv0MdR1OjK@YV0z)o=U}qCGX}zFf7PNo{RA<%tYU(erM?LbSPx_~y=W zYH#rYo{ef5fgLq^Vn4lfx$e_?lIl8IzS|xejhsIoIq%&mt6$dbMKs=KN6el(q~v2u z-h&wSl3o6t`c@-6zNNOSH~x^ckC*I8Cvh`t%^rIrn%Z4H=cRPK>mHK`az$^I56mFp z50pUf#X7UgQ|_|WW-{@o0Z!Mg)34ws%s)dcVmB^UgVzfe*+Wk2HH1<==-KE-!$JNE zYrauKayan>p)mWi>UqO+`d;D9_$|0ijW3CHSlD;-({=0BCNEva-&luP*=bS2Ps-F+ z9l_Kabm(rZV?MaM;<5Ilxc67+BR{?!jASPYGj)wj8)fHqN%7$bq_|!O@4muu{$>(p z^L=Xk2*j`OnID}W>u3^^E-`jYx6_Md)1R)}Mb+uj4qNNlO1GsJ?kGr49yOnuy$<1; zl+nCc?C-58;kTDAdi0dZLk*j zMvo90Jkjt?X%d5B9T~oXQ{S8S#`w!Iqj91aWyVxODBgk0l47CIi2zv1{K(?knX54wEUe#>@mg-Fx) zs6QQ#Yc{;YJ@nGmybAm?vFTRm7O`c7+^<@_u?;fX(+3s(;co5qoK^FR>a6xT-|{C` z+1VCuY*BBjYjhn8>>K24S}zH6r??~CVdfglKzE?s%r*%gCB~ai#8h8ZQS)5+W-g`n z7A!bu5h8p$bD7M40WGzA-n?CE*d-K|APV)LGQFC*^XEnJo+PGQ*i7xVfiRhvDtL%W z!xATI61Y&m!w8vbh*LMEdfsdtam>5xaZ$jMU!}yZesXLme1~a%cqX&Y88l5fLOSUkiIlIBXuB7hGSo?F(Ov!-%pzAjF(oPH^ zT1W7;pQtS{CohT))*~q8=OXh9kzC#1<#*u%Qa;`_3NOf%k-@w~`{FK#v)EFFa zkvid~QAO@tx_Q@xTTK1aX`lQ&4Sw-Sp2d;L^;jM}PZk@L&gS{EOnC%9dP%<*O~imu z(w4~~ot0r(29ZgCqM-7>%%bBMY}472`umMaD}&1GtGlhN0oy4bfVh!;IDwWYuB zw`^AiR0SnLwgH7{Bx-px8@Yl&|&hOCc+^H-qY^KIhZlyFwn z&c@^q9Bau2lsV%)6h2X7Ty6B2G(UHfbw+}ercS!yuP=)L zj^sFeko<0Mbgatu{b`6ld1`Q^;r%V9;cT@+->X>goT>2sL=n4#$=@@#ATYh9AA{K6 z?cd!X2l3Q&`ch5_YukA*KZ4%Rh#E~mB~U+2f{XsXW7Q9*t=IjARw_w+mS&qHoC~vG%9r45&ZZ7$@^1fQS8f4>3ddVGnl|#~L?=T;)Yiw%o>@o|akO(thi80{m-w~5KdHZhf1J2S77l^H01)-(aFvfG{uC`@R`j$k z;GqeFx+CxoWWunpsF1kBX6qxfAfZ{;H_V%|`t@1}){^wi|u z=KDgbpihqz=f*ZnIXLxvO=|Dxc|oe{V7kFA6^eVL-(FPUU}54R?B~`G6(oC389?m!fBuht%fvhVSIZJ%`N{9GR_h4QZ6qj{!YtOSbc{qVc#0}E@)x0{Cl_Tcc_W5RC>`PS^8 zdi1x_PL~H$KOvd>_#2}n9pyh9cd@ftaU*K&73GSaHV>U&eJUu){BGbyw02swK?wci z5YF^bUhR@p{i%nVCnLF^SA8mThOMabY81+#oW!yxWj{;?&_%&xGgSXH)z6_|*?d$w zCyW$LjBlM5X07$79U^x_X`)sG;=fj#0dTr|x90F((pwV~r@ar8`BFAb6rx^>N*7upvD$X+@owpcN`!b`ohPJiq)BH0tJ z;k?Socil;cohGJ$aP=4lr}5Q*NYE;ry5qyYdZ~YGZ~DB^Q{1vXnp=1F9O zKc~X~BJ*8uFS)u_Z!KzjMke}k{rFx+cav8(QHGT-eUC{$KPa0FO zgahH2hNiZYqpQ78=Gc-+qccw-Y4U5Y=^DN3^!tR$4aypGx?#0A!)@j+L)3d&NVYwz z7Zl!_+I?N@h6hyCzFKTP7I|o#ArksSn0L;H7fRrTV!z!sas-@6z&I-2!#L6yZFhkx zVwU#GR-lVD+7Umgp822JG{l|@^ZC)Bir^y#r)RgxgEAPbh=6N-oxYN4gNVz*en8yQbVRz!&L}~;|b1D1dwUqOGaQ@AU0xW@i5iH zff~8|l<-6=d>8Z_YHPIid2&m+3%@Qc%S=PldLB7CZ+ z2!MBiy!o@0ukaH4DtO(s4YVtBpH`<+0^+6gsR&^P61hQ_E$6YC8n#k)txIfZ)2RG6 zdHcOIzbp-2pDHTMAE>V?S0C9)2h}J4tMjR=Zq>W;9oHMq&r5^FR$tM7R^Kh}yguxI ztLa;>sej8{qf7-HF{D|pDYuHU8<`bYAI~iqnooNw4wjuoW-0}n&K1oXfqZf5bhCF7 z5$%K9K^zR{O2HPs^-+IG-uu+;dd(8wIlRy7`0RKQ{4xjsa|VCMtHZ+&ePL!;85iKQ zan%tky>Yl2-w=PfmgV~2+7s6I_m8VRiMOclVZI(xPs#B0tR1MQGoN0|41Vcbz`s%O z!v>V5Qwep1{oJ=H$)qEkQ9AhHY|hk^$Ck4MA#L!0ek+3t84UH?)9-Bq@2&hR1Me@> z`(q@y-1k<#UccSE1wVG;c#o{jDA24xu zf!oV!TEW`Zr+*%8i`A#4MFJ`+36Oxb2>1v8wWWx9*C-+?1gzxu{>d!Xg6tR^Q(e9)qv0iVq@^U?@ z9q-!RK)kqXoOypz4!g(2ZeoRhY1tmaO2jH3CuEH3bWc>|TSxk+`=9tJmoce3Y;wP%*7ja+YC zR$KqmME0GiZueW5?aA=W5;fO5-}SkC^MicjR3G@4hH7x9ahRxFugUZx$r9wO;W4nM zTdVT=!X$Ui1(V%p z&iC8DCW1NpjT}$P&4Blg{upcqc9U6QSxvC;%FUGUtR7agNLAWdD30Wr5&JkyN60j@ z6~y1b%mlfDpDo%syi>IEBH(%V8aDHW zGjGmecoIKk=BblDj3N2}{@|p(3k~<>5v4gEF;kyro9Vs7wEVF{c`&YyoKp^JByKE&<+K zJ2>yUo+|NROxVqq0G3m_L{tpa3)EU_s>)z&M$x2 zn*rQ2H0hZMM}9K|hczjY z+Mt#&APj#)e!stAXskhmYa?RlQ)A4vWI$Y`!260HctsPBhiF)mt>5$iosC!o>qnMwd9|XZ~ zZnnBnggUcl@dv#1u)l!!ac)Y)kX85z;q?GL;1}0fJ%C#pm|lV8p2nlm*ACPNzMs#3 zXHWib=JJboi&TUy(POo88@=G_p4?-3?7_Rui(XJdUSvRNk6v)PG8#Kl?-?ORW3iK? z`gV@>nMlkB@xLGh^sO4x%yFmtj8fqL$zig5)HMqMK_nqF4@uud zdzEvSS+*>X_b{d@s&RiY{D0LYPC*oE-u!t;QvS}D#mp<6@3>`lC8?-3tJzH*4U zaFKAvTsW`$&2AeX>W^m_`rj)0*TT1l@J%oigUt^he1P(oM-0`M^@!s;#UA+Qw&&OB zrDmPJ!UVC0*uy9-+8zo>e$9`1Nd8Jymx>J&n7w7O67&!1AJOwTvgffn_t;AUSI?9L zo;l8H7(JXtOu-0G5OM0YOp67kK@ou3*-s{}3D^;tJ5jT8#PI0hy@;Wgvb+159o>lB z^sj-o>3uchr2oJ(bbARenI)R>%awk>l-h0XWpPYQvfYL%Y#2qi)y$4X%#Xwu7ljhX zGpAG+RB#zTZsBl9O=D-4;tkDgrVO4JKDzVSfDc1Si$b~C6mP?sz^=2kQtTRtytZJb zE=2p~PTQzm8cQec(VBy{jB(x)Y_BGB?X(zG4*HzeKj`jq(Ivq=vf6ABMf-(@sEkct#beV+OE8DL<-8aZatp7dJs{c>y5wb&E#rfx8&$nkX$)0_H z6wx{?qp1GIg|Q}cn`na_$m0wA8soX>%#%G}_ZpChv7s03ByO+-lDN1xahwKme8wYG zn2TkMEtCUn7#3SO`gl4wZhh$E(L8p>9d4~W2Z9bD z4qW20)69tOJ_Lp}dxhZ#_rjL)|G+O{BIt%O$L4S<9CO581D*KC!OWjdx}B!2d4BjC z-4g->z14p5J5e=~QnV?7=>K)Hadbs8#?MA;uE`{OY&>Gxm~-M6g4h}X`K5~_+1&Q{ z#a>bdp;6?B8wLG^_qKPtOO%G9+Oy4)vj>lM{eulkv&#zZHx#9TGU7^7ytDOT(Prm^ zfkk-QM9lgMp%R#5f69C3U%-zwLx~8tjub||`(mC5Yw`%&p1DokaW~7rbQ8GgyA~~T zw;y1y+RlPW?xfNDTGZI9l0Eh+Q^wuy{H)daY1_z++?XPyef#tF`;@Kw ze;;SQuMfW8`SSkXPcq;CWWJYzymHakq*ns2biV%y^Zk~--+$Nh{f*NE-_?D;KW)Io zJMet}@8ZGos1sby4qh?tkiMWCn7=uo7EQeA)i|=l3~4^7wz_OQ!$N zS$>~fE&ZqYMVTj}vF>KJv9*Vo-~TrH{)48-C{yGr&of1uOc8d6f5Offm$)g>yVv|} zT1jo*EM4StW71b>OvM)9URA>JT=4^*#unK+B*!>o8~-XZr`*lD?-K(HL>65U9(Buo zu(xT)jJjnpztb+Yo&ygz=gS%w`UE@(b8&RV?SDQMMcETV5t-T4k(QZr9a@eXIvqj({khYhzO?Y{b|RI z`ja7;#N;{UqNk&bXu7XzYq z%S`^#pK|rb^e^V5-r(7rGtYi8Jw+0gA+}4YpaMGujVgXjg%|z_BWwi+qs<95Rl`iH zY~2zr`pJB1$kZM-s5vucCzva7mK8S;#kaqA%`T92snc@JzT_)Ta$mprWN+p!ij}$h ziW0iCvUFN4Iph7kF?%U6Kq>LVc?qr8WZCCz2-0f zS)UCg0&0@8tp6s+%M6fiG0i<%RabHNC2bB1(lttsq`H3kb%)ctOR#hw4qcX0?0oMZwBot6m^cjL-z7#eTf6PiIV3n#g^U;IU9*_c60X(2F7 zrH^|jhn}Vv3Mdqv_K2|cC2veIKPMAaHEIr8Edu&-)&m3dJ8DvR`p*P25RVvD;+(x! zIO3Cvvl zUxsO7{pv}}&%qS5CK@gCl7?|aV_xHLsH7X;dieT&{#NM!r>Ok5g7QWlc#XOR6vggX z>M0NE$<=BqbCDIczCPST{**d)6Z7YqT8pU_LaspM4fB#(&v+tz8R%qsBE)Kf=Ysj>>6MNB>N_%>h5a z|LbJo?>JhtszJFcM;+DI-7HRIu%6#vW4He*Q{at_Dxj+b!e4g&xMsF+P6N4yzsqneR9I z#KHJ5n}+!>og~OF0}zVo+Ji14@aJM|6Iy?KWXFp-uyT!CuN_)_+>BP!}!%$?BFVe)t zCK3d-bWgA+MDkSJo1PeMLsJh`3QyJ4Nc7orqrC{po1w6nhG;-v#G7G{-2e6Q-elE7 zM*a7vBFV>>*>7EczCYPCviS+wle^zt+Dg^(&AQGiH zcrsk{Fv`e5q~IfcrQnxwuHE4u*JY&O7pxR~(pw^ZEm^l9L=eMKw@Bb#d(;nF$9g0B zb^a;PFA~k2&$|1#&4Im`)O)~^oHd`P+XR)FH5p_d997I;5f zL1rE9O7a^7F=*pd+CxSIt!p0DA7~|-4UB?oQgdgRcvWrQ%~z@D%EUWFe{53#NniK;n9)vJ3PDMlcVOx@#t+v`l%Nl!T~Ul#(hgJ_S-Q%~RrWC5zVP;e13vD^ef zUhhk;B?8D|MO>^~etE}XWdKG`a${0=HxOXYzwZ>{k=i3JnQ^budS=p#0Ll3m%U9gG zd8|+vzsu*EDs(5o33%O$q#sm$$&RwcJ057_Y3_Tun@HdD5--YJr}6R!!!rPs-(z~8J6e0H2-q$0;2_w6fD`X&k4i3#^ICrJ?PGN)#69adp_US1^d^P&B zmO_NJddlM-yvE?ZHYAK9C@@T!@cY_`$V}`fyFNsVD|;c)BIomwI4Uc^k@#5mq*QQ! zSl!C_K%f9d4KV=~6=(Nrb>;&O{y~N&Hdc-tFcxid?J*82RTFwL{yH zaqCoY%;gwP63>#EYb7EF&#tV&4(4l@z1!V5>s4&S=to3nVYT~**RYxFWEu@$M~7Lf zbl-j_z$9M}XRnfI-H?5b^{OI%t|M07tmaY6Bsr&j(u$=~%fuSE2E@7fRb{iYIJtvk z9>dpB{qRk?qGmx)ow`aUC-1}`}oYprv0XS%Q7dqHh z1jjH&DGE+YG)z8iitfd0U|l$^{fT{0(K8StsADK$64q$%d3l6?xpG4RxxFa=I$J2o zP4Lal{wBm^Q|q~p!R(vngUri|P=yK#a`p?=ZdGx602JMUu*7E-i*gH~*JE~7T~|!o zVW+;`8xh0wk-J{r`eU)aO1@r0h6#+Xt|b}aog21$OoY!ys8wG}prS2%NSp;4l53o)5!L6BaSx$3R3Gv`uj$wUbaBmJt_E2Kn>r?5wx zV6R*2Rg%!LZ}~D=z1n5PLB@k;QXDJq3ntrD%Y@=Gx3CX1b7ixn_G+p$0T?(_Qi{ffL03 z7(T16`B~o0cTAUxUPG4KNpe~y4@|ZXY~1_x#3wt)H0~XnI3J4>890$kV*E>udnY7( zSe?^Szz1s6AtXsXGZ&LvZc4{{a?E5NKcm#rqjvQk=!^G>Y4Q?yuqW1TzayrB)-{iP@xv6 z0Ul}i7vww4a4@)pvut(=o3Ry|t#1}Jz1mGqx67X@$gl*hf#YZ)E{}~76eCiT znJfOja!?5q3ce`@R_>d#tiGh7)i2WB(BR=Ia#C7RDM~G`VD&COb<8GlDlHzxt(^Kc z7?uup^z660&%iNgq0Cu!1sj`M7FDP!W^YA9>l;M?)AX`|7(*LvxxTLxJsy0RtT87g zzRa)y0S2$r0=lg)R;-(q0o7D9*=>kgqEjbORP4v1X)A3{b4`>Nt6o;*2MF{)JUv+;1P5? zEqiz>rXw+-7^?9XA8!b=8hG+#q&#jHXPfAle=8Zt?Dyv!kZ}UXiEqXcnaCRT%&03* zZsl%!>KvIS!pBI4PrU-7YSXji=j`-#cjWzVnarFj?sPP zSO12lyT-Se#`wB^g34LNLsP32v0xXD1AO&D0s}p|A7e zzl`Gx$SU{x$tLtF2;%6(aM{J`b&rBB1*ufHMJzwuWD=i;(`(2bgZ02ru_>f@F98+r zs_UWPz46a6W=qils6*@1m}{c?mN_kI_$oEL*EG#54cr11S351Z9FizP=0}4gvrB1? zl3!s2cz%=~cl#H9nuht`Qr_#{{w%l zS0OY0viHkCD?GH(wW!llQ{q2xtX9CMxAw;qC4S?gu#?`dbr?%`XW3aL4fjB`>0{87 zydOn4j5nJRz{0h8`shsfbnH!{ld3ki#AlRhwr-BPEbQ{=agWR-hOy`7j0BJ>CNB~ub5Oytxtg7R z*u3*b?n-PS-($3+s4}3aipxLGWsHR+`RHtg<1H%GcR~^gLo*}Z(PE+6hvd=^W)62! zs~^dZu)f3xv5IHPeiHfN;wSoYkk# z=RS>y_YaZ*bVFf&qc@aA2^9c`LD3n>S7qLyEUV<5)uf|m^Qzb*8TCy@oxVcsOI zK{O>Qga@wvQ9)|T+*V!3SrUnYnv!thn1|zP;t?e0SDEwc04m4a5i%S6 z2N1Y$?Y0|b?|CLO&UjS0uVtE;HZS&9}rhXm^A=$=d&Cgk^so9Y&sm znbE>A_%HzAUqARA5E)0e7aGwkL^#^gsR#~p&%)-nP&&T0ttvukWfr0#$iHfxSeiJt z^DAb2yxOJ3Y0(-|^smKEN((u6H;|NOW+(;#tY@iMQ18AI0dp;osKQd}FAs;h+=*#1 zsS3t6LtzpA2s#jg$pV{NcCi?q`ywU?CMY?FaWREk!krwAUn>b^2TERnT&TV#A`Z)# z$YOK82u2hU?>V5~qoG8pTc4`cBdao1cAjYY48g6c!ClO`*`W@W)J(^+QRqa@oB^to zH!3auFoSP-mGBZL| z?>cjq*$UYC{89nLiXFAFze-EpiWV#Yb+TMrqmC=P4C8qlWU6E0cAKvIW1jC@`v;Rx-bJA2h>2h zJpYr12F3v37)W&JXzrsT@|o#9c#WlL*$9RcbwE=%~f9zq(VN~!wB3$g|%=rhV222Fr7o24n_FmKFW^6@UUDD{5!`FdfqgAqc zC@0F0k;6^VE7EP9Hb`R2Z9ic@9dnW6YG$<>!w zN@gr8Y%nUzHyM$c>2)3TmKUE?bR|Ya7G=bE>MD9riHRe!<_gI*#iTeX1%UR59svV- zopxplcBf?qT{2@RRina+!cP%{lmVQmA;?@{&0v_yM3T221+la`EoT?9MjY69Q_-m4 zZp9m8GwlvqZEUP)71U1ztJUV2$cGxq+E@*ihjwy^ebsvXUDn6s@qZ2(AXwYnvoT5@ z&aBVW81ncnluAVvke4N`Mrc}a1KkuuAd^Z0>I!JY-+rXQ;uNMCZ1nevH zJ{tVcy0Cu{F{zxE4Q^CCH|GBrR#dtigL5fFWPYKC&6_OjU8|$T{@q7dOsYpkXN0<{ zLf00#S4st&>CTSWmcC6(RU3h=bjB@ylG7>Z59foKVt)XH(zNQwEoNsc;%Sfe`_xp@ zQ7B;9FD8)gXlt=QC(MUv1Fv2E-E-{8|6YD*oMOHPt;I>7E1fbK=h?l@{2d+bl`VO% za-ji^B%2917Oda%{zB6kIs6}%_Sd2@0#5a7W)J<9^e%T<;eG}1*rmc0+iQ@LrC4~)5=LliKWG^)2v2~VI#Sh2U7s!^2jFGYM zvOP0?Q|G*I*&REiWf7^dLhp&LX%l+F;wxh}BaV<(* z273R`dZ0LDud8Y*#m+huyh$UTItNvq zK5by;oT&HpC~HGb0lVOOc>FJJM=zN2NLqz3!$5K&<^-lsty?Ich0)=h$&Vomqv$0r z#iWROin`+ZF3YrXoI7FaGQ1+$tX2Wnmt2~@xWC9aFMSV51V|lD z`fBl79a~4Qyp$ip`VKui?C;9r`}q^It_vMU+-b6SRB#BkXG z-RZPE=04W6btNB?du!syHtlWXF`j7JtEBiOcW2|?Q>LHcubW0BG@48P`%HE%oj>2Q zn9rd-?k%SJx((Bh;A6hMQP+>1_KRS{TlVe+UZvvMJ>R|6t`|)`gwv<0j@tEMsw(Jw zka4Vgk@}6OVas^jvl^wvM3qw2WWN1A@;QH=^rFf@-34xReP>ehsgBKyr;;l#QBef6 ze*=ZgZR&RZ(M*QgaK=!L-{PZon1h{#a}UwL?&oPDdn`0;;jW7uwm|KQDFY#uou`)m z!?+l|mG5`-{r(oxllc2hZKhn%WSMQUW6p2Ltd3+Kqz3Rb=_xk7bDe0RXohIzL7`Vw zQ(r`E>4k{w3;_}7y?y$7wE^K-%68N~6NU>z{m=A5z<9nF)xDTKO%=588GJrvM)N6m z&Yiq6EEZI_oawtz%&l0aRDnvdzO~{{b22@wXp-@as{pdZFUa zBKllE4#4Mc$=?h1pW5Oy*Hc5#>i2rp1KP~Akcj+?lzeVe5O5P$lq!Fj-t~w4!Gnru5st)3d2sMc>hUj$?1`ga7UQ1oF1rIR1-Q zj|;9el-o2S2CI>0vMnlY@!y9I{zQT7&-u6?ecYa}NVNccLH1fz!F=db{%X^{q4(?` z$pD?vws!vybN+n0na6wG+cl4~Uku78BF-{pDB3^6k-75tBl5j)|L;5Dc$&xCgcmeD zQ4+>;^f9Mp&Qh9ybVMrtJ%&iO1?@g0MyYxHRCY0sO|J_oxVo;Q$SOo#COKH=hL~{8 z1@ClEdO%?TF#_92G?`Rv8}Hr%bHJ18OArqw*zz!baFSLB>ij!tuW8k>_x3N~==eDy zcegv=oC$jXS3D)9Vk5~W&_vu9uM5nWm`KePuPGCL#gkPe6%!lv&^NJ);6*#6&E1^r z7~rym$CTx78H(csh70nRHeNU2avV28nF#}&)H#eZ%{)ut91@;l)G`ZV@}A03M+ns% zp;bl_Y?__45a*}mUfMlxLF`47cy#05>k~65H%1T#+`*+P5TGOq{ELhsZq7xHJ1rN4 zuv~T4gJ124UaTF_EA5VGW`1m}t-}~u)cXLJE|~5o`dVOfEQoEeZBrGYk?Xb7`WFiy za0$N7tva73fJyj=5;jtwbOpjgB#yO5CWpUqvFrERm&PE%s%JBqN`Xa#$SrAwZX|~M z4`(J8N(`6zoT_ATmNK;pu>X~|#ZYjVTpfi_Mi)Ej!|93BVu5MI0P#g?6gr%iO#c1{MGzuVBG$!x7=`TO_d34sLGT zTS!Fi+H{Ga0RzddBQerWY!5f?4b7W)*p$RSy=XhuO<{*`7-@+sKvq`QJgwxZ!L9p- zx~LK6`67~QH8ORISGa{lw=Nt+)$ol&eB*TkuW-^j_wG#?;69P;INV)eGG-=xBD+v5 ztS^0BDV(h^2nls$pVE|qQ3dNix~(-+*b6s%1$KWL${v$n-}U~kwSGxXfzOp!*_yEj zE5^$*w+#~?3MSoZlj@r45=(Gon~3&l-a3Dmch=+~`FcbfbtM>t z#wNG)$A2w8V)l`koVbg(3xB`(VE@W1(XX&O?OM)6wypuw3zj2e?X$&`xyd*ww*mWZ zeG3|zwZ2gU<^EEJxoOpDzh|jJ*J!UIa8ejM`%}rTn)pdLDbOBm4~u`zf9DF8P~eev zF$Hm$H^3|Y2#KwoZ#07vgJ=K0pck|9wDO5`|Bigp^a8!l?Dc-Z@O6_J1Ki#6A66-`?Nfd(!ZA7Yu(xRg{?abLE|uz3$$8B~P15 zUP|sce#W5Wt2OZf4>BLSpWHg&Y3hx-U+Cd8>=kOucLK(VYX7H~y1}Vq}{qoI<(o2;!$RCVZ__=SxgTsbD-FrQt%m z*RAn)mYMfcO&z>v>WjGf&tqRHY_6M@Kgtxd88FO0AGnBre3wCAxzoZP4ak$rdG2zx z>Rj`ei#t({?o|V<0wathpP0Lh<>llX!6GvIO@Ub!TjfRgAC0ZzyucfP!udB^G4u5s zyfXcc=THH>8@edh6d3TmpBlYZEX3SQ2RPqaW$*1YRN1-R zVm@y_ssNCYem?`>-2VZYwqL?sgikg6%ALHHU+r{_;Med&7uY{>*W1Dd(Oc)UqvSSA z$u>+;ucaz1xW2I4XI^tt8jRy98?%8AVSjB(kd)L2% z+BFt+%sqQ7+KvA?lrBICJYmcz2rB;;(gEj4vpSdYGk;wPrH1eF2mRn36Yu|aTI`e| z1o*0%8nw`r&P9xXChVD34gfnXh5iocrfJoWQ1z>)IjQe4A**LNsk8O_o%k1nfHAxJ z4wq?MJBB)4qb*Ht$ga-uNxD^50J%IIMnXF+qeIn0t$#-KrB3Pz08+n^5JBwzuZ*J(`;}$VGQF1lJc8+ z{t?%`qs_?D%xwm<6WB@DkUqu+AE+?1_D=?%PU?TD-RpPa5=_$re79fr7}aam2MQII zmLuctHJSuYx`AhNZ=?O*czxkeCvEP~F!`Ha*4+`=!Q?W0%ix28536*x6DqOg^6Bbp z);RH*@{NzP(MLDrLLOEbk;BnnHdu1fdnup2kv}dh=Y%U6>=7FFKRmL%J9|0FmL5eG z);=spn^OO9RuWCC=Ks2XLF4TD0w-0%@Op!Gttn@hE8VF!)}C0<$QI3M98e3Ky+>VN z96#Z}5S{~_^k9{qJchfQt}jlG4u{xpd!qH#PqlU*-}rKQ;@gd{G{%46)sGeYR4rEp z4pn&dIF@q28?Y~$`cC(#C5u175Fa;c$$k1AJZi}z{SLB0JeBLIhjD4v?T&q@9DjYj z-602>!EOglB^C;l(P4BK>{g@0iF9yis<)Z$3!%g{S@~t7m#e)0JqTlv`&d?oasv6T z^esPmo2#Qc=W&Zxzg?>v6QAF&?xPQ0_pvCg{_2;vcV`CrpTLtV`%jH>p+B7G&bd5P z=)ug!0&_o>e?7*mrd99#w^*)hY!kePYO7>IbkbLW-AuCjqSv)sDu1(bA(06vIvI7_ z9i^b@#DkihoB8CV@oi>9LfJfT0e>H+i`|*CLT*xTTx!E#M&gTA?TJrib*WF#|EhLN zm-Zg4O!J+5@*4FQjb*E;1@}QyW#Tg(Nj0EM<9;#<%MtXDZ&=WaZ)^wRmIt)L!{I|-GtgZ;hH<}7zH-R-2 zwoIEwFEy|d6s0gbkv5w%Fb^+T0akN_*t&MW94K_494QwU>;MQ@W!(d8}$5d=j<4L6I@eyje;&^ySu%6p0NWAx~nJ)Hh7{{pcj7=y(B% z8FF%$Xb`OZ$}?mJ$$SWn{133ZARTg)Wg#dc6_EY4^mei#jOn@sXMD@*{G;!N^N`-Iv4 zGCfgway=)3!m*pk?4SEL9JTKMoC=z=+0UcvG_AV$=i*PgYf#2uf73FvE*z6-{td6l zQX_F`(6D*`t{+Ktsg6HdMSVaQjBMyDdw@9-?0A}(nzu(x!P_}DevS_b5Z(MDfR$WS7_x{*0Qm|{4yDMTNc;vv*eX)@|oVIhXR`Cp z_m21wM4<)Ivv6Tw5KNfd1X0s!b;7LwU3PIwhrHL_`FD!|>));;nf5$vHx4aLs~Uf1 z_)`TsPeCJs|J1&M|M-In{()j7oM5+NpMKD$=~sjgc{ZEtr+W0S#R$|kub-S$4%@Xl zl&IQ;SdDt)$KY#bMfO?Y_+^^c$}$uh8R240MC_LXu~s@2tXeexz45W3<10gtbv|t6 zRB(^ja+o-Kc)CH(8*v1isH;1|M__BxvEV*caNCEV?Jci{gc9|gbN?^Ge)B(!urD73 z`MoA#AM$H??)(eFev}>pVNZhyc$mKe8r4V#_iw_vq-j;b?Pi@YOowsMp>u;U3GM4k zf^*cg;`qS_VUPx4(inG|(Y-!&5TJ&O{>&h>pRmCjr@OY?&5XpFP~yzSmm3pDQd2MG zDSj#X)s7Ro$QJ)HV^Pbsv@^p8kAmdYRSvDgC78=u6|$Pkv@QP##-;a=tPF;va~b1! za24uoGY)kHB9G7a1uAhUt!q3EifCOwi!cyk{owy0o`I&&|EnIJxBe1&ec112>lFH5 zVCcW}W6}SU3``IGi?xCNh}JT!m0@zig*Y5)M6rLFNWb-jjl(x7M#fn=g|ZLj)3t+A z<#pzAqCSc*@%d1Y12=vvX}oIuL=(U72+NLL(D~mVlaR}$wGMj0;O~ON!Jkf+LdZAh z`35}~`crxClt*>Xzy0y~XO>J&tA^e7{}!JU!WN}q(#VX#qTxI?zxuJTdBcI&gbqIl zpLgf*`OE(cJ|B6`;Ilveu{nGW)$?^0pU3lj06xw6Bb0#x_(Pfh?d`(nmY*1W#@x-j zR+qp(D&pVns8_UbIiL+=brmdNMQYs>sySY>tiF~*Dd|~^lviK2yPs~0BrJkkA9nFY z!0n;FB!015UuwcdQNS16~`nEWaK=ontFO(< z%4GB}`F~*ZDWPA+4^dF1H_bj3_FvICu%UTKJKp)bW{*TCG8K7sW-0Nd&zco+Vhhu- zA~~+0e8>)OQVoIY4`VB4QcZGoi7`ncH~2neM<<)%mOtq{L(}VKb#q^AFbpyt}H+ zx%oAo;p@9rvr(em8m~?Tf(x04#z^TzImrWl(KEBR5@JM>B?3bNEmmzhu6PAbRpSUSZ1mJit&dW*D5XP!>y75h0plQ4;hoTgI8XNvlFoC_uWXfHe?cAz8O(%1ikPWC4 z4YCdAH|W7%M{@%V0WZ25W?^Su;CfkhIK$$k&I^i;87X2^|K}=&mgtx%t(gUKHkuPQ z9Bz;pk@LBZ0hT$p$}jgu?Z=c?QOKG54c;kNo(=Jkn}2o1L+iqUJof5pj@bmR_Re~P}GJ&}B7KGI4}a8F#L>mesvtcsb>`@HAIPB`auBLn3z*qgrr&Hru##G?H;xz8$t+)5#DY&$5^5DqL-nR! zwLuE4?0_vW^y7*xy_lUn>6Mepyt?us8?x6@EALD?SdXrmDC;%1nXvSCC=h)bh_W^6 zyyYjzLr_)$?~eL+`Qjw8`S5O4A^7dWCs+f8{q?MKK+6|k(c;C1E%$I~xm@))W!m~# z_r7X1UTe=rpX7`^+C0^dF&gDbrqw@rMq=)eiSvr`~6q?fs}T_jX_m>`^U|{_`S*$c-vLu~W5$UJJeHp2ym8i0`feuCkCX zGOmK}C=DDQXq#r7&x?9zmFLeg}aDKePxw@HxW<0Pd^b1h{@C_@weB2bJ4W3+%Wj*OmvS6t|z%ce(5dUoLw? zxIwnzS5_bG@rOR1_>fJjelw4-IfEiGxQ11mgpSZeTJ+@n++JV5yrX`kL={_#M|IR+ zp~v2{FECKQ9vG;%Sp#+A>CWf(JCCCEot=$leTRG)9ysAWW8{~MXO4BW}i zcLdZ_JtO|j>hCzIPilS{!_n~lc3A>4IQV7@`dV*mQ?k17SbLJJ8GiA&@cF2$GG-b7 za18{J+lfh&T77B!I%u+XKo+_yZUF*KRE^Nos4>t!grSg?(c9V$>1uja8yarEI3ew1 zXDiWyhu?$8{fCey#DdE&E(E8-yZiNby0asA5nS3YNi?BHm}(yYv;w0>KB{H!@O1>E zKaZRZ&5vsTD1e`?WJd+%tv#c{1LttRn19Mk!u8@gSa-0qCcZ((M&!m^y-03(JGr(7 z8tMzYCN!N8lJskA1DXW}_#NHxa)Wo7O#=OxlWsIeYLH?VxVhCXpOV!_9P89^W+<1# z((zC< zORZ{~p>xx&a-1^qM&^!?=qbG>JB``WU0+sp*RLuiAoApWQ~d92$SD0{*P;>xHp zfY<$Xqvo5iYiyh^u>CbP1f5og6X~pC`e|STer3l;rWcJ*nSblQ1%CajzkyV{ErqrIz3bfo_Cyvv9B>hh{JPU-<5;!yDJHoKP562`r{)Eyso$4BBt zFtNt<#qQwFVym~*N0V$dTvJtFZuy|QcV3A%SiTVT(OqqYiIbDv0}}%pUnwMZ8Q{8m zot8F+^nj&MPM?}w0v3jBkOY^G=6?~sfk;fWTQ;@&gYq3tzRus{w_oOtFLu{vzasn~ zfA+8MC3Fbti!a6}J$tS)+5N`H%I(y42ltqgd-&ctWHkL11r>b5^7p}c6(ZXz0b(l3 zk4NA0BHjPecr+&Md?BFUW4@r1w!8iqK-<-?CjMEHbCblsR{Z)v{X}a~&70cJ zO#wfyGzfwz_81+1Y#KeBMj?Up>d-o0Lhw>F`4h?{x2~uP%?@01zK&L%m`0 zJKY`i_H(_R&-M^nN4;_E=%|O0NDde!lA8VOe_?Fy>gX4V{qK8$6v!>E_cI!5+;aW1 zxHvc%XbAq>lRhpS-vJJoL79aF+?MYL4JbsjsqJ9a7%rrKOtQOShBNA_z*GKd_+OK( z+giO8dy+=hAR5J#%CJUy89kl9j7N2ldIc}Z%r5JU<X&p~ui|)$GXh@tLd6AOHmpx#vVMi-w+P z+9M9-&Mtw6Odpr2`?MR@JSp)TLMGOEiMcg7Gp1zvFv>$>F@Wr-Gek1uuOJM59|dI> zTxn5ukxACzp2q1BlApXsC0eF#YY_VES#b3^08& zFP-;kP>7ea(lNAzJjlI-vmp*5YuWmN-{0fAT@Ps_umA1mRe$_r)W6UD@cOkLJY@f``^87?zk%fro|nPGrYV+)`nQ@kN@znNw_lMf`Z$hXIw|787wl%LG+`=CuU9&b zk*^fHOXW$I7)aURFtIYh*W-1&>LN8x`d*%iDM`F@cXx^qsGTR7`CEMhak%-!VPN@S zr&h*4Sv@6@)pjuf)HxwcV&^O9%^ZM8D<-6W%(J&t?GCLg zcGGKl$kYxCeMP#pGxwFj6x!k~RC2QI_~h0dLolAjKAU`H$B-={18zrJcoEQ^DJ@rj zq$G2|XeVn1z1y99Smi_Q1qIVfY>SOE@ghk5L>S`$vH>FGE?q&c6ALEDVkr}imsUdK z$k`mqR$nseh(_q=>??3)1AkAeq?$QwGP}&;x1Z|jUUZm~TB6zwNL2P6b|k*(WmKW< zO{Vq;s-BVw^tfVe3Z!~I@=XiCC+>G(!j_6cHffrruW`t?a42*~2 z)ZS$ou}Ifq%FCz@7n{fYy<+`E@vo@i8`;Alyq~vF)fHX95&1=#=ubRbTcp_QKQyf` zz)EO|on4x1PWm&P+#{Y^RpM@Eu8#WwZqs^6FbgOX1>1d5zfp!hoz#;KZDb5OXg)Jw zPdB4XrI?xJm^?L9r6Tb z#~Ma=!Ad6ZomvV+N4n9NyKo-g{T&D(&paxvHB(dQW)zaq)b-h)5v#9W z;!{w(S=yeS9V>kTz27tQ$oiQnqlt4+7d7#hylaY^_EF!N&RpZF6J82!7l?A6xm~eX z;SM_0nff%y&sbtWf0-2(Jre|&Gb&Y&b!gp+0p?8t+2LuyXc-Q2gDQe|%z6{uvqJ$E zxHCx~l~_u@GS_rB?X%qAQl07Fl59Ut)BhdUP+6un_F2n6IHoh?71yv5%Yr)68f-~@ zoCFfZ@Hw#<2}d*G5tU|be;095I34Gv?-Rzl{Lk)^aUDTcLzaN4O_S8n?YC%=1RL3Dc48JyhMnVZ@w!7W=(cCufa1y*PXC zUIyWQ<7Wb6+1*hiOdXZu6obVnFpo$UVBYUyW+m4ankL|MIt+oLgrBg#$l%IJEfT{_M5+t}aZ;+0sgK{6sXF?o=)U({P3w|+ z%fmYA7V(jJCu}FTlyE+QV>V)~ma`E%Or`yY58Kn7{Uv!2h9!xw=egl+3{J)b*);j= z@QbPTo^H)unr=)>HJg^3T(2pYt|JvXo)q<_6&IbF-1ojS_XYsKd;KfqJky!eV1zW> zM)YJRjDPY1=7l7+CQ5;wRoVZ*W&``wqm=CKS;r#g>=8xm94yRXb7o}xqj#B|LDw)U ziK;E-R@`#`vxG4)9qBGyB(R~ro!(N>@QH?BuO+9Lap&hOUurxZI=)qKUmp^=cloEk zElPIVoYeoo6xVRnH+{^dk+h1MkUvG=Kl3K5U~XaHF`$CQl^K~ z=QlUQ2oKAfG~}rS{TBKCkY6q_F;i6Ul>{TO%7zAF6Kh@2CkVC`aTOYL0)keM+B|Aj z1nC5g8w&cph<#iXUIPLGTJgSC?41dzSn|i(o)NdsjJw-4+&}vu!@zjfMU1R>Qq!oz zgzB8_q_5&xt^VpA*pX2Pdh`p6PfPX2YNC6VZxLj{>d8U3fROb)=j5E8Iz>-;2V@+5xVk1f*SGQ{ zBD|)!h*&@G&(I-~U|M#FOPC=yb5csj&q8pC1k9H4&yP%iX@9Se6kV!0lmz|a|-0`9>^9FW4m*d;xq8(|?M4{WRH9HjC1G>FLbnA9lddez_ zvevm$)d#1LA2lqCdCNR>)bkwp%B!;$1FFEaQ_m>U*-P-+V-24D31U+C7#^rGSTByJ zW@Zg8tc`C;_RHrktwn}Ie;{p4^ae6xo8gwZ>?vs)1#Ru2#cG$sE5#x)7| z!q|!?7iXf)UO#w5IA&4jfB#LRhozR1Pjlw zS8G;}%(H-fT)Inp2&s(lST)E=5zWvJ@?+6$&I zyzPu+I9AUP`2W443w~`}jl3l?9=Mh(Muv-vY5n3Zm56dPcknkqNq?hN&j(G?Ok!JR z+*-@OJB<2aMtkXyM*IOz~WYeSvjcg2U2Km_lt;&)7DcI`eVJD@r?Pa9Y*=Zap!}Lh~(QyaglZT>-YN&p7E039gI;RVI3-yF&}Aa^Vv* ztB5f^-=1LUBAeT8(IPfrcDCU2ty_%dgIcNF^(Hp~KT>^ulO+!71%EAtIB7J8Bo3`3x;-TFgeB zO7;t7Kc{J8n29+wXV=8Eckecsc3Mo`vwwRrc*(evG+WL3uETuS*!M7OIFIGw+3OKk z2lRWqXR%ZU7a&qdrg|}6IqK!RS(q5T?BCPL7RjMm(PaNnz6YptGXjk+>*ILoS=vp{ z*9bC|r~aoaCx0)~qxoQ^F!OE%EC>NuSba*o7~z*bT9Y|B>uKvhebgD;QHm8nBOE_` z_%2=kl$PfXQ|WAe{I4^KACw828Rpcsxmz=1j)R7WJWdeq&n92pF=T6K;c5z-<33@R zV?O17H2PV}gbp&K!|vqao@s*W6JL?KSA!{py(B07D`c`!_Oh(~b6ulTzj)7dDmy`( zGx|LGeZzN(@FawWo(d zJA(P&U*ddgruK~Ewerc$=p6DaL_N~PtJ@}3BDCA9iCSTA)H#~F>wPUAP2-x=!8FW} z>Ke7qdsqlacf$;wv>LTB#ooXl&-N9vuiM6O7Gwu7k1aMc)yveC@4dP|HKr9|BKs6u ze9R#$ml>MwJ^0*%Z0gu7aOm$(xlhCnE>~24hz0Qu<~^vd@|1 z+^{`~!j;< zY|I-Hp7dOLvVUPA9K;NxRe;r%3)B?@MQ>6vY#>uR5{gs>*=Ek3T12WX=7}9L!(c({ z4h+iKZ!_zx!Y`x@KB?@>TWHD*ZuQj27DNq_~3GoH7^kHDuu< z34(8EFn+`& z9MJT8DcDV5cZq+ycXi3?VV_By=^1S?v<|AUQIESsK|#F?#1GOvcANMFx5Hw^h{B7Q zXTh8szAO8h1PQTS40iBbT&MwYQj5&4#H}?e5oN=u zteP-A7W3>KWR?Dj0#a`AnU26B;c}L-1*U-PZZjVr50KnXU42xo0Q!|ds{;vAW_g6E zNYh{AVPRm(-cNqZ*$p*>mE9P8g9UI8*Y7ZTi69kgG!~QWLt@<2=TTqwIGBiDwzJ|^ zhbJI0C2{xNY&$F>aZ-db>1LW{5^H<(F*|2nL;Tr^DhAiHHpqqZDdqo?Dg&eB#$46d z{--M3~xbp(w2Eoq++;;-tM5#FQ(FLnF8EhO$COfrM z^!KV~8{q3@Kv2(*q%<+A$MmV^9%(VXcu~)Mvs@^fP%%1b=Cr?JBi+lHRns@}jn17e zyM^H>X5`dJOc104x;k1fr>Y@i{FMkqP3>)wHgZyUEb6n(!2o{(a8<1qWtO%=TFUvKB&&=-@qt#XAHnzZu7Dw|H!$QT=|yVj zA(G%Z)9u>O!(py&h5RJyma}i}*4>Z0yIZ$fZk%;1vx!%GW9-KpdSmSG!Y1ZIi_Kda zdzhW&Qf#1r8Tgu2whZscK0qNW1w;qyD3rZRt4}&oN$u)jmUomQGi64SLDN>MPJD2$ zDYIRf?7Gp?A|+GxdCIYaN2T9W3w5vc#_dEU{ZQRE{M$lD)@r3ci<6z@WBDp#N>5XT zW?`>?`S=iX9@b`K|L>Uio#95Zz__%5Tdr=c`PLqL9xtDNvdO>sl7r_z5w!r1DRcjF z1(nqJpELRYK>p;GBC1wMhiY+Aen$pP_1P=_`rN%#L42ED&=UVtmlCq&?mx3a@Lpis zFGZylyowJ|^HC~)xjCpjU*8;4U;m)KU^;x{`WE)8uM{9E{L@T*%f8L#u*IVmc40ml zd@k&d#Yy<-Iq!hVTY;zjVtV55c}ShRUWJVkr})-UKHhJ;SIH;o#j`B*613B_kzxg*L2lfuKQMVsC$1aj5+5(F05&hzr@E1!4Y$PJK zb^P~^B+SG5%oRsHfYw-$dFV43h}`X57ysY`tZ@q5?U{!vNFw2$e8MR<;SOin%n}d( z`vx6WY$JIZq!xx277SOX}mFu+g+0*KAXm3aMoaS%Qd?GKX<&t0_Bvfu0rdJ z=lBOVKYV46%X?diP|~MT3!MvU8iU$v;3K)AVHks0zhrP|1ec%1!AJX{^SAUe|E~|d zm6OrXoBM$1ZQwU8y=hD=F&cUkVi#CkSt?vXZH5B7|6!Jh%1`Uxsp-;D1o^Y!7X?0` z!*d`jYiAAU?as3;z5RzeAkYKoZMD+>f6$vwFkAsxXe*pv_QzOsPK%qSNB%aYodgOHm1WDiDaWxYsk-kArI+DhRpQpo67e+Wj|kmZyQ z&b#~=%Jd?QQblMp_%UQ`M>p8K@xp}%&Dn=McAT*vT)1q1hBlV#Pv=7Zm`H-&jpk@B zQQH_E{I77-DOtXkZ^3<%IEU?iHpi6%{#otUFB1uMT!bSmH`SpEYuzK>CkC(kW38?& zltU{g9wq(xQ_Kvh=CDR|`*g50_>CRfLL{Oe6d#V*3h zQO7fGk`L-eTw|1EikL)O1igH@(mOSS>_7UmoE;P$F4P%2?OW>J@N!lwgoa@#D*V@% z3iuyh$mE>Dif`5O1o?xpU~D2^Dd5cPj1mnKJsYF%EypwcVZ11?}d3 za{gfZHE$ZnISX5u*{fb|c<`kLl9#^m{}2-OU!I?b>i_+w|Nk#r&GnuIi8&v1NPn>B zCjRH6`NMtH0J{1D&;#lii<*G^KhPg;{Um9Nhw_IzfA~tjbBPde74^zh{WcSdW>fqa z$OT{Il_LuZdIDm&(cC@XfnKTd_nPvR2QR<+!^{7`lz)A4-}X-sxq8X9eamCF6I?xT z>~|hR@O;|Tcjtcf1^s!vZ+!>r&kKJQKBnwfK7eOK-|`;?9?#Sl*{{AK^rON{KDB>+ zavGJp!+!k?@Xhs(=liFd3LlyzgoQoN4A{EF(GOy^zKS4Bhl1~`M<4q8st@`8)zS|s z{~_PMdd!EEKlpbee;BE;{)vl4wZA_f0jZ;b2pE!U;S{C8po&{)P!G8(D#J+*j!}YR z5OFGvATs-xR<68JkZW&@zx2;)?=;(9Ep=;MQX~2DQQDbE%;-b4lOxbvd$oR@X|Mh3 zrhn>-7Ed~SB~RcFT;;EYFPUevK z{m}8r-ge0Hm4+?o{J>GBhYQAkbo%+{f)5*?KI8vKGyWf={_(eec>N#R|9fz->pew3 zkUozx@GThk(fhx?`$OPs*7{yJAf~9lKEsCS_aB3>c8Pc1SglrPa8_TbwS_6 zww>F?m73T=n)dGCuXF1>(%yEaO5Le#yk6n%t|Y(S8k{#bH8`i2A6dZP?{18^e|Hve z%h$R`#pD{Csav^ievflU>w|iCe%j_fk>1SGI}$%NG80PNx46bm9o=I)x>Gw;)IevCkf?GuoT$%Vv0ojFhEJ)h zPe$CeI`vpUf890i6ZZLz)&cJi_yUtm$iA$n0DxtyaJII%7NaL|ufydWkPM?00;i2rc&xLqsYj7^ne=5FaB`w5T zsa2r?inY9VRy>Afu(D}y_f2dgNpZ4ysxGA>uWk`tF^_I#Q-Stj7h7C*`&iiO5xsnT+d-rShDz}v@n!yKDF@(-c z9hd|C$-O{)H(id>;OhPH`o867FSgP2Ix!?i|x1}6A3 z?PT}-hl$%~GQJE5xpB(Q;j_Clts`WS#2=}ZXypp_vOj#UQK$z#X6YT8r52lJ!V2E? z)FQ)JB$Q3=DRFM~s66Cnr>l*P?gk-nEeK@nr}7(robhjcvP&BkX96~iMTm@mgOLT$ z#?)uCl_a}wamMC@OTJ0v2bA29eNoBGYz>@9H8*%i(k`R9d4mSeNxj3+(`M>$jg{Kn zkd12>hau0EU{b~ZMv0BKgyOwWVt&2^tY_-qvfD`RT?!(Z%9l9IY4ek|a zpm~8*(M1jeN@eg(!IhRS)~leUi?E>!<#{gq5Xm;aE-@MC=S2UgyCk0$)EoIUfvHgH zKI60;DbXZOf}g7d)|oJ1E2U0iw;^Zm^t2`HMFtXC-o-CYOfY>t-`&=}%)OE{dZ5Xp zjso}8yY3wQALwT4z4zH)Ncys;`7bb+tT1UWJl5d6u)e|RTx;<+RU*RF@Ft9TkhkO- zG;l9^s-$4}$IOkJ!ZAv3sT62Dx59T z+wvpi*)W)^jXXOWxi(h58hce}$Pd3@Ipo6OebZNGCfu_Cu-v_Gp^c8Q_l%^zeSHga( zko*t+3$e^hgIu0Z|L&fgOeIJfQnimvb<%gk!XUNogUZ#XfuAM@i5d;=R~xBIE5LTy z(?)>P6s+Tgc8w*&6p1;vUS^AZ2xL>a-QH+7NM=}Pi>`CCQu+M>Yn;?o5CD<2g#<=m zLod;MItbSM`GS6-UxnkP3mW7OCJLQ4%nVxDycXH)tXL=Ud?C4*6s3LH{?7qbbf;d5 zHRSrK?%8hk9RkGnx5%>@@%=oLcIp#|Zv98)x@H|vsP)YoMJPSu`=q@1jxvu5bbCuo z(bRgxca*6a4eVRU@2KQ=6oFV~LVb0fY}3{6K0x!PvvwTh>Xon{$B3 z_Bv`lP`3XeV20~*%$|X?{W7wB9{7sUcErf`jW)C&^e*}SLSDXarGI((uE3G%&i=i4 znf8NTK;%@Um9{$EJ;R|m4+>Oofin^cbQoMtvBg_Is%h$N|mJ zIF)X0vtr^pi947R9f}(93T-0p8r1iLs1J~FPVp#K$yz(gRBRQGwb^$AC4hlGIBjr) zvM_AhjF>hzW-lbEw-QhY6d*B9w>NLHN z68Tnm?c<4C10Zrls^(ZAzD9i6tG?an1Xb0yU`)#1CMTU%7hY)_LI6%>7MTw1cygb7 zhyQ}7dY^_QG+VR3k^?*33o#)%J~0qk+4UT!$}1WbWHpKg54{zQJLC(5e4^g|7Du-T z5UXUEkyIn_5;MyK<@2{H)SCu2W`9bOc&MB#iW}UG4blV}w91>V$?x*Y$_{>nUNVw<7IYa}at{lbAw1|T z&d75J`dFDu)n(eG7LGip(B8>l^1g2dVNB7;b2xWckjwk3O%0DchvPHS+D+b#HubQP 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 z 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∓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

=$B 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 diff --git a/lgsm/lib/ubuntu12.04/i386/libm.so.6 b/lgsm/lib/ubuntu12.04/i386/libm.so.6 deleted file mode 100644 index 23c73207a8dbddfdb51aa5ca09deadcfead6b79e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 173576 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 Lg06)>(xUr6O`|c! diff --git a/lgsm/lib/ubuntu12.04/i386/libpthread.so.0 b/lgsm/lib/ubuntu12.04/i386/libpthread.so.0 deleted file mode 100644 index a2353e112b5cf9c1ed3f75cc3d6e44b2d6b4e878..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 124663 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

LmMR@5>8mp$zvRq^;HvluaHp1q5jbri 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 DjkA1q diff --git a/lgsm/lib/ubuntu12.04/i386/libstdc++.so.6 b/lgsm/lib/ubuntu12.04/i386/libstdc++.so.6 deleted file mode 100644 index 614f0ec234e609c6339e82577e744701e8f60595..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 905712 zcmZ782|QKJ<3I4Z*QIN}mTXCvBqSk~q`G$5LP**q3CR{hmTQ+(NJ0{lR1!jzBvH1C zNSjJp9!io>RQiAJ^Zk8)uixu`p66}m%*>fHXJ*cvb1$!=j4e$l6bkw8#znZuzkAzh zL>q}x4+Q_s(k4toC(2|2k^4{ne-A(y7b5sCZcZA5{F^TxCrHFI{-ev3kcX7! ziqNu7kXW|;$G->Qq?~-(|Io(%e<>o32=lArunvl$^A z|2^Io`J7|^|Lwo$w?qE_t$$<|O4VRe4d^T;n@wfJ7_tkDMf0iYuY3f%_&J@ zL>W{rf^Pob4Fm5XGl$r-=_J4LG$)x#T)2n;o5`bRUqo$n8>F%5B^1V7Itw|RO#_u1 zrOFd@%*lTfX!7RhCl;L*%}6z}K|e&h(aO;|gvAyjEF&MfG-0vuKL%{&xo8T5O^C6$ zauRw2NqlqV8HCEBEA#AQTC%9x^w~z&B9evNh-g15zBx^Im(BYnh7%rozOI;$lUZ4OlBrdCqoHj z6)2g~!{yQh{ z&`;ABvT$|0bTSan;&q~kGv|s^-Kbm?P7{fS+2cJ-+=T)}pII4uIS=!YSA>R!uoOCx zPN&@AB@&|AQYM6Ez-N$8SW<@UG&cSH&J{FKw2Vm4;pL`cxVR|dB}r;@nkvPZtAtXH z`7B3giRcqoH$%eBBs3=GIF)T6%4FvgsxoDRs6L@DmLf&F2-S|wVA11jDD*ibnkmmT zR;2PQrKAz6IE!aDTF8U>MA#&Ag8_?WPk3mgk<2rvr%g7BV|zw_FX1RUWCHr zWyovu$q=eR6GqO3DnOxf?mq>#2Ck!=!O$`DV~`Cj;;}Jy8WsO%lVGG0DQYG+pEgZU zip?a%jaiD~R5FKQK}Z=qR2TZCtaRNk+-R&H!?|FPJ9xZ7}}Hj zbZsIkFNxKM)hN$%oVAHlmL}V*z@(9UZU!}ua~vT8#6y}_3UL;VkwURyk5L3!ylldz zlg360NmZip;xJ5q7LCwSuj#B>%10Pztp+D`3qzD<%zlq`!ki+ms)EK{V=0g-g*)tw zoknZyR>y7Ndd9}gV37D!!nh+;!lWyj-7_F3ZAoRc2$f1zq!K3D&vp_O#gfFLFeoIM z>`;&*%s6SZh@YKbL7{P_Y1mMSO(q2^mk{R`C#eZiJm&iGh`A6-v;mceumns

m_% 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%0Dp( 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 Date: Fri, 26 Jul 2019 19:35:40 +0200 Subject: [PATCH 142/534] fix(fastdl): linebreaks for fastdl output (#2451) Co-authored-by: Christian Birk --- lgsm/functions/command_fastdl.sh | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/lgsm/functions/command_fastdl.sh b/lgsm/functions/command_fastdl.sh index bf75b8177..0c763808a 100644 --- a/lgsm/functions/command_fastdl.sh +++ b/lgsm/functions/command_fastdl.sh @@ -166,6 +166,8 @@ fn_fastdl_preview(){ done < <(find . -type f -iname ${allowed_extention}) if [ ${fileswc} != 0 ]; then fn_print_ok_eol_nl + else + fn_print_info_eol_nl fi done # Source engine @@ -197,6 +199,8 @@ fn_fastdl_preview(){ printf "gathering ${directory} ${allowed_extention} : ${fileswc}..." if [ ${fileswc} != 0 ]; then fn_print_ok_eol_nl + else + fn_print_info_eol_nl fi done fi From ba938b5fbd3137c60977508b13ce992c83dc50cc Mon Sep 17 00:00:00 2001 From: Christian Date: Tue, 30 Jul 2019 13:21:20 +0200 Subject: [PATCH 143/534] fix(check_deps): sven coop libssl (#2456) Co-authored-by: Christian Birk --- 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 e9cd50dd0..0f6a0f863 100644 --- a/lgsm/functions/check_deps.sh +++ b/lgsm/functions/check_deps.sh @@ -414,7 +414,7 @@ fn_deps_build_debian(){ 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 ) # Sven Co-op elif [ "${shortname}" == "sven" ]; then - array_deps_required+=( libssl1.0.0:i386 zlib1g:i386 ) + array_deps_required+=( libssl1.1:i386 zlib1g:i386 ) # Unreal Engine elif [ "${executable}" == "./ucc-bin" ]; then # UT2K4 From 43af797b07b2368bb51cc19d33e6a606a89687fe Mon Sep 17 00:00:00 2001 From: Frisasky Date: Sat, 24 Aug 2019 01:55:39 +0800 Subject: [PATCH 144/534] fix(doiserver): now requires maxplayers to be set to 32 (#2468) Co-authored-by: Frisa --- lgsm/config-default/config-lgsm/doiserver/_default.cfg | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lgsm/config-default/config-lgsm/doiserver/_default.cfg b/lgsm/config-default/config-lgsm/doiserver/_default.cfg index 1b8f16916..b5d2dc63f 100644 --- a/lgsm/config-default/config-lgsm/doiserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/doiserver/_default.cfg @@ -14,7 +14,7 @@ port="27015" clientport="27005" sourcetvport="27020" defaultmap="bastogne" -maxplayers="16" +maxplayers="32" tickrate="64" workshop="0" From 44eb0702d7191076e0ba79bdf3a02282a6a2eb87 Mon Sep 17 00:00:00 2001 From: Christian Date: Fri, 23 Aug 2019 21:13:49 +0200 Subject: [PATCH 145/534] fix(btserver): fix serverbinary #2453 (#2477) Co-authored-by: John Doe --- lgsm/config-default/config-lgsm/btserver/_default.cfg | 2 +- lgsm/functions/info_messages.sh | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/lgsm/config-default/config-lgsm/btserver/_default.cfg b/lgsm/config-default/config-lgsm/btserver/_default.cfg index 46f6079a9..14236eae4 100644 --- a/lgsm/config-default/config-lgsm/btserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/btserver/_default.cfg @@ -109,7 +109,7 @@ glibc="2.17" ## Server Specific Directories systemdir="${serverfiles}" executabledir="${systemdir}" -executable="./Launch_DedicatedServer" +executable="./DedicatedServer.exe" servercfg="serversettings.xml" servercfgdefault="serversettings.xml" servercfgdir="${systemdir}" diff --git a/lgsm/functions/info_messages.sh b/lgsm/functions/info_messages.sh index 270caaadd..0754ee232 100644 --- a/lgsm/functions/info_messages.sh +++ b/lgsm/functions/info_messages.sh @@ -1206,7 +1206,7 @@ fn_info_message_mordhau(){ } fn_info_message_barotrauma(){ - echo "netstat -atunp | grep /./DedicatedSer" + echo "netstat -atunp | grep /./Server.bin" echo -e "" { echo -e "DESCRIPTION\tDIRECTION\tPORT\tPROTOCOL" From a917b553abd5bd2dbce1e43b5312fe6c0833cb4c Mon Sep 17 00:00:00 2001 From: Frisasky Date: Sat, 24 Aug 2019 03:45:07 +0800 Subject: [PATCH 146/534] feat(newserver): Zombie Master: Reborn (#2465) Co-authored-by: Frisa --- .../config-lgsm/zmrserver/_default.cfg | 141 ++++++++++++++++++ lgsm/data/serverlist.csv | 1 + lgsm/functions/core_functions.sh | 5 + lgsm/functions/fix.sh | 2 + lgsm/functions/fix_zmr.sh | 49 ++++++ lgsm/functions/install_config.sh | 6 + lgsm/functions/install_server_files.sh | 4 +- 7 files changed, 207 insertions(+), 1 deletion(-) create mode 100644 lgsm/config-default/config-lgsm/zmrserver/_default.cfg create mode 100644 lgsm/functions/fix_zmr.sh diff --git a/lgsm/config-default/config-lgsm/zmrserver/_default.cfg b/lgsm/config-default/config-lgsm/zmrserver/_default.cfg new file mode 100644 index 000000000..6eb3bbb5e --- /dev/null +++ b/lgsm/config-default/config-lgsm/zmrserver/_default.cfg @@ -0,0 +1,141 @@ +################################## +######## 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://docs.linuxgsm.com/configuration/start-parameters +ip="0.0.0.0" +port="27015" +clientport="27005" +sourcetvport="27020" +defaultmap="zm_docksofthedead" +maxplayers="16" + +## Server Start Command | https://docs.linuxgsm.com/configuration/start-parameters#additional-parameters +fn_parms(){ +parms="-game zombie_master_reborn -strictportbind -ip ${ip} -port ${port} +clientport ${clientport} +tv_port ${sourcetvport} +map ${defaultmap} +servercfgfile ${servercfg} -maxplayers ${maxplayers}" +} + +#### LinuxGSM Settings #### + +## Notification Alerts +# (on|off) + +# Display IP | https://docs.linuxgsm.com/alerts#display-ip +displayip="" + +# More info | https://docs.linuxgsm.com/alerts#more-info +postalert="off" +postdays="7" +posttarget="https://hastebin.com" + +# Discord Alerts | https://docs.linuxgsm.com/alerts/discord +discordalert="off" +discordwebhook="webhook" + +# Email Alerts | https://docs.linuxgsm.com/alerts/email +emailalert="off" +email="email@example.com" +emailfrom="" + +# IFTTT Alerts | https://docs.linuxgsm.com/alerts/ifttt +iftttalert="off" +ifttttoken="accesstoken" +iftttevent="linuxgsm_alert" + +# Mailgun Email Alerts | https://docs.linuxgsm.com/alerts/mailgun +mailgunalert="off" +mailguntoken="accesstoken" +mailgundomain="example.com" +mailgunemailfrom="alert@example.com" +mailgunemail="email@myemail.com" + +# Pushbullet Alerts | https://docs.linuxgsm.com/alerts/pushbullet +pushbulletalert="off" +pushbullettoken="accesstoken" +channeltag="" + +# Pushover Alerts | https://docs.linuxgsm.com/alerts/pushover +pushoveralert="off" +pushovertoken="accesstoken" + +# Telegram Alerts | https://docs.linuxgsm.com/alerts/telegram +# You can add a custom cURL string eg proxy (useful in Russia) or else in "curlcustomstring". +# like a "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help", if you not need +# any custom string in curl - simple ignore this parameter. +telegramalert="off" +telegramtoken="accesstoken" +telegramchatid="" +curlcustomstring="" + +## Updating | https://docs.linuxgsm.com/commands/update +updateonstart="off" + +## Backup | https://docs.linuxgsm.com/commands/backup +maxbackups="4" +maxbackupdays="30" +stoponbackup="on" + +## Logging | https://docs.linuxgsm.com/features/logging +consolelogging="on" +logdays="7" + +## Monitor | https://docs.linuxgsm.com/commands/monitor +# Query delay time +querydelay="1" + +#### LinuxGSM Advanced Settings #### + +# ANSI Colors +ansi="on" + +# Message Display Time +sleeptime="0.5" + +## SteamCMD Settings +# Server appid +appid="244310" # Source 2013 SDK +# SteamCMD Branch | https://docs.linuxgsm.com/steamcmd/branch +branch="" +# Master Server | https://docs.linuxgsm.com/steamcmd/steam-master-server +steammaster="true" + +## LinuxGSM Server Details +# Do not edit +gamename="Zombie Master: Reborn" +engine="source" +glibc="2.15" + +#### Directories #### +# Edit with care + +## Server Specific Directories +systemdir="${serverfiles}/zombie_master_reborn" +executabledir="${serverfiles}" +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" +alertlog="${lgsmlogdir}/${servicename}-alert.log" +postdetailslog="${lgsmlogdir}/${servicename}-postdetails.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/data/serverlist.csv b/lgsm/data/serverlist.csv index f63247e82..7eb92b603 100644 --- a/lgsm/data/serverlist.csv +++ b/lgsm/data/serverlist.csv @@ -93,4 +93,5 @@ vs,vsserver,Vampire Slayer wet,wetserver,Wolfenstein: Enemy Territory wurm,wurmserver,Wurm Unlimited etl,etlserver,ET: Legacy +zmr,zmrserver,Zombie Master: Reborn zps,zpsserver,Zombie Panic! Source diff --git a/lgsm/functions/core_functions.sh b/lgsm/functions/core_functions.sh index 43ce5984e..713114cb0 100644 --- a/lgsm/functions/core_functions.sh +++ b/lgsm/functions/core_functions.sh @@ -421,6 +421,11 @@ functionfile="${FUNCNAME}" fn_fetch_function } +fix_zmr.sh(){ +functionfile="${FUNCNAME}" +fn_fetch_function +} + # Info info_config.sh(){ diff --git a/lgsm/functions/fix.sh b/lgsm/functions/fix.sh index 85c789c73..23153d87c 100644 --- a/lgsm/functions/fix.sh +++ b/lgsm/functions/fix.sh @@ -73,6 +73,8 @@ if [ "${function_selfname}" != "command_install.sh" ]&&[ -z "${fixbypass}" ]; th fix_unt.sh elif [ "${shortname}" == "wurm" ]; then fix_wurm.sh + elif [ "${shortname}" == "zmr" ]; then + fix_zmr.sh fi fi diff --git a/lgsm/functions/fix_zmr.sh b/lgsm/functions/fix_zmr.sh new file mode 100644 index 000000000..0edfee967 --- /dev/null +++ b/lgsm/functions/fix_zmr.sh @@ -0,0 +1,49 @@ +#!/bin/bash +# LinuxGSM fix_sfc.sh function +# Author: Daniel Gibbs +# Website: https://linuxgsm.com +# Description: Resolves various issues with Zombie Master: Reborn. + +local commandname="FIX" +local commandaction="Fix" +local function_selfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" + +if [ ! -f "${serverfiles}/bin/datacache.so" ]; then + ln -s "${serverfiles}/bin/datacache_srv.so" "${serverfiles}/bin/datacache.so" +fi + +if [ ! -f "${serverfiles}/bin/dedicated.so" ]; then + ln -s "${serverfiles}/bin/dedicated_srv.so" "${serverfiles}/bin/dedicated.so" +fi + +if [ ! -f "${serverfiles}/bin/engine.so" ]; then + ln -s "${serverfiles}/bin/engine_srv.so" "${serverfiles}/bin/engine.so" +fi + +if [ ! -f "${serverfiles}/bin/materialsystem.so" ]; then + ln -s "${serverfiles}/bin/materialsystem_srv.so" "${serverfiles}/bin/materialsystem.so" +fi + +if [ ! -f "${serverfiles}/bin/replay.so" ]; then + ln -s "${serverfiles}/bin/replay_srv.so" "${serverfiles}/bin/replay.so" +fi + +if [ ! -f "${serverfiles}/bin/shaderapiempty.so" ]; then + ln -s "${serverfiles}/bin/shaderapiempty_srv.so" "${serverfiles}/bin/shaderapiempty.so" +fi + +if [ ! -f "${serverfiles}/bin/soundemittersystem.so" ]; then + ln -s "${serverfiles}/bin/soundemittersystem_srv.so" "${serverfiles}/bin/soundemittersystem.so" +fi + +if [ ! -f "${serverfiles}/bin/studiorender.so" ]; then + ln -s "${serverfiles}/bin/studiorender_srv.so" "${serverfiles}/bin/studiorender.so" +fi + +if [ ! -f "${serverfiles}/bin/vphysics.so" ]; then + ln -s "${serverfiles}/bin/vphysics_srv.so" "${serverfiles}/bin/vphysics.so" +fi + +if [ ! -f "${serverfiles}/bin/scenefilecache.so" ]; then + ln -s "${serverfiles}/bin/scenefilecache_srv.so" "${serverfiles}/bin/scenefilecache.so" +fi diff --git a/lgsm/functions/install_config.sh b/lgsm/functions/install_config.sh index 56d8325f3..a443eb375 100644 --- a/lgsm/functions/install_config.sh +++ b/lgsm/functions/install_config.sh @@ -669,6 +669,12 @@ elif [ "${gamename}" == "Wurm Unlimited" ]; then fn_fetch_default_config fn_default_config_remote fn_set_config_vars +elif [ "${gamename}" == "Zombie Master: Reborn" ]; then + gamedirname="ZombieMasterReborn" + array_configs+=( server.cfg ) + fn_fetch_default_config + fn_default_config_remote + fn_set_config_vars elif [ "${gamename}" == "Zombie Panic! Source" ]; then gamedirname="ZombiePanicSource" array_configs+=( server.cfg ) diff --git a/lgsm/functions/install_server_files.sh b/lgsm/functions/install_server_files.sh index 22452582a..3913b656b 100644 --- a/lgsm/functions/install_server_files.sh +++ b/lgsm/functions/install_server_files.sh @@ -57,6 +57,8 @@ fn_install_server_files(){ remote_fileurl="https://files.linuxgsm.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" elif [ "${shortname}" == "samp" ]; then remote_fileurl="https://files.sa-mp.com/samp037svr_R2-1.tar.gz"; local_filedir="${tmpdir}"; local_filename="samp037svr_R2-1.tar.gz"; chmodx="nochmodx" run="norun"; force="noforce"; md5="93705e165550c97484678236749198a4" + elif [ "${shortname}" == "zmr" ]; then + remote_fileurl="https://files.linuxgsm.com/ZombieMasterReborn/zombie_master_reborn_b4_fix5.1.tar.bz2"; local_filedir="${tmpdir}"; local_filename="zombie_master_reborn_b4_fix5.1.tar.bz2"; chmodx="nochmodx" run="norun"; force="noforce"; md5="73472bd84dfa6d203f3b5f48f760773e" fi fn_fetch_file "${remote_fileurl}" "${local_filedir}" "${local_filename}" "${chmodx}" "${run}" "${forcedl}" "${md5}" fn_dl_extract "${local_filedir}" "${local_filename}" "${serverfiles}" @@ -155,7 +157,7 @@ elif [ "${shortname}" == "mta" ]; then elif [ "${shortname}" == "fctr" ]; then update_factorio.sh install_factorio_save.sh -elif [ -z "${appid}" ]||[ "${shortname}" == "ges" ]||[ "${shortname}" == "bd" ]||[ "${shortname}" == "bb" ]||[ "${shortname}" == "ns" ]||[ "${shortname}" == "sfc" ]||[ "${shortname}" == "ts" ]||[ "${shortname}" == "vs" ]; then +elif [ -z "${appid}" ]||[ "${shortname}" == "bd" ]||[ "${shortname}" == "bb" ]||[ "${shortname}" == "ges" ]||[ "${shortname}" == "ns" ]||[ "${shortname}" == "sfc" ]||[ "${shortname}" == "ts" ]||[ "${shortname}" == "vs" ]||[ "${shortname}" == "zmr" ]; then if [ "${shortname}" == "ut" ]; then install_eula.sh fi From debd737274a2d16d1b00b078e691a90d8dbcac20 Mon Sep 17 00:00:00 2001 From: Frisasky Date: Sat, 24 Aug 2019 17:33:30 +0800 Subject: [PATCH 147/534] feat(newserver): Action half-life (#2460) Co-authored-by: Frisa --- .../config-lgsm/ahlserver/_default.cfg | 141 ++++++++++++++++++ lgsm/data/serverlist.csv | 1 + lgsm/functions/install_config.sh | 6 + lgsm/functions/install_server_files.sh | 6 +- 4 files changed, 152 insertions(+), 2 deletions(-) create mode 100644 lgsm/config-default/config-lgsm/ahlserver/_default.cfg diff --git a/lgsm/config-default/config-lgsm/ahlserver/_default.cfg b/lgsm/config-default/config-lgsm/ahlserver/_default.cfg new file mode 100644 index 000000000..ec35692ef --- /dev/null +++ b/lgsm/config-default/config-lgsm/ahlserver/_default.cfg @@ -0,0 +1,141 @@ +################################## +######## 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://docs.linuxgsm.com/configuration/start-parameters +ip="0.0.0.0" +port="27015" +clientport="27005" +defaultmap="ahl_hydro" +maxplayers="16" + +## Server Start Command | https://docs.linuxgsm.com/configuration/start-parameters#additional-parameters +fn_parms(){ +parms="-game action -strictportbind +ip ${ip} -port ${port} +clientport ${clientport} +map ${defaultmap} +servercfgfile ${servercfg} -maxplayers ${maxplayers} " +} + +#### LinuxGSM Settings #### + +## Notification Alerts +# (on|off) + +# Display IP | https://docs.linuxgsm.com/alerts#display-ip +displayip="" + +# More info | https://docs.linuxgsm.com/alerts#more-info +postalert="off" +postdays="7" +posttarget="https://hastebin.com" + +# Discord Alerts | https://docs.linuxgsm.com/alerts/discord +discordalert="off" +discordwebhook="webhook" + +# Email Alerts | https://docs.linuxgsm.com/alerts/email +emailalert="off" +email="email@example.com" +emailfrom="" + +# IFTTT Alerts | https://docs.linuxgsm.com/alerts/ifttt +iftttalert="off" +ifttttoken="accesstoken" +iftttevent="linuxgsm_alert" + +# Mailgun Email Alerts | https://docs.linuxgsm.com/alerts/mailgun +mailgunalert="off" +mailguntoken="accesstoken" +mailgundomain="example.com" +mailgunemailfrom="alert@example.com" +mailgunemail="email@myemail.com" + +# Pushbullet Alerts | https://docs.linuxgsm.com/alerts/pushbullet +pushbulletalert="off" +pushbullettoken="accesstoken" +channeltag="" + +# Pushover Alerts | https://docs.linuxgsm.com/alerts/pushover +pushoveralert="off" +pushovertoken="accesstoken" + +# Telegram Alerts | https://docs.linuxgsm.com/alerts/telegram +# You can add a custom cURL string eg proxy (useful in Russia) or else in "curlcustomstring". +# like a "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help", if you not need +# any custom string in curl - simple ignore this parameter. +telegramalert="off" +telegramtoken="accesstoken" +telegramchatid="" +curlcustomstring="" + +## Updating | https://docs.linuxgsm.com/commands/update +updateonstart="off" + +## Backup | https://docs.linuxgsm.com/commands/backup +maxbackups="4" +maxbackupdays="30" +stoponbackup="on" + +## Logging | https://docs.linuxgsm.com/features/logging +consolelogging="on" +logdays="7" + +## Monitor | https://docs.linuxgsm.com/commands/monitor +# Query delay time +querydelay="1" + +#### LinuxGSM Advanced Settings #### + +# ANSI Colors +ansi="on" + +# Message Display Time +sleeptime="0.5" + +## SteamCMD Settings +# Server appid +appid="90" +appidmod="cstrike" +# SteamCMD Branch | https://docs.linuxgsm.com/steamcmd/branch +branch="" +# Master Server | https://docs.linuxgsm.com/steamcmd/steam-master-server +steammaster="true" + +## LinuxGSM Server Details +# Do not edit +gamename="Action half-life" +engine="goldsource" +glibc="2.3.4" + +#### Directories #### +# Edit with care + +## Server Specific Directories +systemdir="${serverfiles}/action" +executabledir="${serverfiles}" +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" +alertlog="${lgsmlogdir}/${servicename}-alert.log" +postdetailslog="${lgsmlogdir}/${servicename}-postdetails.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/data/serverlist.csv b/lgsm/data/serverlist.csv index 7eb92b603..bf922e595 100644 --- a/lgsm/data/serverlist.csv +++ b/lgsm/data/serverlist.csv @@ -1,3 +1,4 @@ +ahl,ahlserver,Action half-life arma3,arma3server,ARMA 3 sdtd,sdtdserver,7 Days to Die ark,arkserver,ARK: Survival Evolved diff --git a/lgsm/functions/install_config.sh b/lgsm/functions/install_config.sh index a443eb375..8f991d517 100644 --- a/lgsm/functions/install_config.sh +++ b/lgsm/functions/install_config.sh @@ -147,6 +147,12 @@ fn_set_dst_config_vars(){ if [ "${gamename}" == "7 Days To Die" ]; then gamedirname="7DaysToDie" fn_default_config_local +elif [ "${gamename}" == "Action half-life" ]; then + gamedirname="ActionHalfLife" + array_configs+=( server.cfg ) + fn_fetch_default_config + fn_default_config_remote + fn_set_config_vars elif [ "${gamename}" == "ARK: Survival Evolved" ]; then gamedirname="ARKSurvivalEvolved" fn_check_cfgdir diff --git a/lgsm/functions/install_server_files.sh b/lgsm/functions/install_server_files.sh index 3913b656b..7e6e45b30 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 [ "${shortname}" == "bf1942" ]; then + if [ "${shortname}" == "ahl" ]; then + remote_fileurl="https://files.linuxgsm.com/ActionHalfLife/action_halflife-1.0.tar.bz2"; local_filedir="${tmpdir}"; local_filename="action_halflife-1.0.tar.bz2"; chmodx="nochmodx" run="norun"; force="noforce"; md5="31430e670692b2eeaa0d1217db4dcb73" + elif [ "${shortname}" == "bf1942" ]; then remote_fileurl="https://files.linuxgsm.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 [ "${shortname}" == "bb" ]; then remote_fileurl="https://files.linuxgsm.com/BrainBread/brainbread-v1.2-linuxserver.tar.bz2"; local_filedir="${tmpdir}"; local_filename="brainbread-v1.2-linuxserver.tar.bz2"; chmodx="nochmodx" run="norun"; force="noforce"; md5="5c729a7e9eecfa81b71a6a1f7267f0fd" @@ -157,7 +159,7 @@ elif [ "${shortname}" == "mta" ]; then elif [ "${shortname}" == "fctr" ]; then update_factorio.sh install_factorio_save.sh -elif [ -z "${appid}" ]||[ "${shortname}" == "bd" ]||[ "${shortname}" == "bb" ]||[ "${shortname}" == "ges" ]||[ "${shortname}" == "ns" ]||[ "${shortname}" == "sfc" ]||[ "${shortname}" == "ts" ]||[ "${shortname}" == "vs" ]||[ "${shortname}" == "zmr" ]; then +elif [ -z "${appid}" ]||[ "${shortname}" == "ahl" ]||[ "${shortname}" == "bd" ]||[ "${shortname}" == "bb" ]||[ "${shortname}" == "ges" ]||[ "${shortname}" == "ns" ]||[ "${shortname}" == "sfc" ]||[ "${shortname}" == "ts" ]||[ "${shortname}" == "vs" ]||[ "${shortname}" == "zmr" ]; then if [ "${shortname}" == "ut" ]; then install_eula.sh fi From 6761e50b607c97b3c8cec2ed12cedb0c4fca5574 Mon Sep 17 00:00:00 2001 From: Christian Date: Sat, 24 Aug 2019 18:10:03 +0200 Subject: [PATCH 148/534] fix(fastdl): correct fastdl file structure (#2450) Co-authored-by: Christian Birk --- lgsm/functions/command_fastdl.sh | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/lgsm/functions/command_fastdl.sh b/lgsm/functions/command_fastdl.sh index 0c763808a..c09250217 100644 --- a/lgsm/functions/command_fastdl.sh +++ b/lgsm/functions/command_fastdl.sh @@ -336,17 +336,21 @@ fn_fastdl_source(){ tput rc; tput el printf "copying ${directory} ${allowed_extention} : ${fileswc}..." fn_sleep_time - if [ ! -d "${fastdldir}/${directory}" ]; then - mkdir "${fastdldir}/${directory}" + # get relative path of file in the dir + tmprelfilepath="${fastdlfile#"${systemdir}/"}" + copytodir="${tmprelfilepath%/*}" + # create relative path for fastdl + if [ ! -d "${fastdldir}/${copytodir}" ]; then + mkdir -p "${fastdldir}/${copytodir}" fi - cp "${fastdlfile}" "${fastdldir}/${directory}" + cp "${fastdlfile}" "${fastdldir}/${copytodir}" exitcode=$? if [ ${exitcode} -ne 0 ]; then fn_print_fail_eol_nl - fn_script_log_fatal "Copying ${fastdlfile} > ${fastdldir}/${directory}" + fn_script_log_fatal "Copying ${fastdlfile} > ${fastdldir}/${copytodir}" core_exit.sh else - fn_script_log_pass "Copying ${fastdlfile} > ${fastdldir}/${directory}" + fn_script_log_pass "Copying ${fastdlfile} > ${fastdldir}/${copytodir}" fi done < <(find "${systemdir}/${directory}" -type f -iname ${allowed_extention}) if [ ${fileswc} != 0 ]; then From bcd585bae9330f1757e7b4e6fc7e091591b96c6d Mon Sep 17 00:00:00 2001 From: Christian Date: Sun, 25 Aug 2019 19:49:04 +0200 Subject: [PATCH 149/534] feat(newserver): Soldat (#2445) Co-authored-by: Christian Birk --- .../config-lgsm/solserver/_default.cfg | 127 ++++++++++++++++++ lgsm/data/serverlist.csv | 1 + lgsm/functions/command_monitor.sh | 2 +- lgsm/functions/command_stop.sh | 2 +- lgsm/functions/info_config.sh | 15 +++ lgsm/functions/info_messages.sh | 14 +- lgsm/functions/info_parms.sh | 11 ++ lgsm/functions/install_config.sh | 6 + lgsm/functions/install_server_files.sh | 4 +- 9 files changed, 178 insertions(+), 4 deletions(-) create mode 100644 lgsm/config-default/config-lgsm/solserver/_default.cfg diff --git a/lgsm/config-default/config-lgsm/solserver/_default.cfg b/lgsm/config-default/config-lgsm/solserver/_default.cfg new file mode 100644 index 000000000..96e8b789e --- /dev/null +++ b/lgsm/config-default/config-lgsm/solserver/_default.cfg @@ -0,0 +1,127 @@ +################################## +######## 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://docs.linuxgsm.com/configuration/start-parameters +ip="0.0.0.0" +port="23073" +maxplayers="32" +maplist="mapslist.txt" + +## Server Start Command | https://docs.linuxgsm.com/configuration/start-parameters#additional-parameters +fn_parms(){ +parms="-b ${ip} -p ${port} -l ${maxplayers} -m ${maplist} -c ${servercfg}" +} + +#### LinuxGSM Settings #### + +## Notification Alerts +# (on|off) + +# Display IP | https://docs.linuxgsm.com/alerts#display-ip +displayip="" + +# More info | https://docs.linuxgsm.com/alerts#more-info +postalert="off" +postdays="7" +posttarget="https://hastebin.com" + +# Discord Alerts | https://docs.linuxgsm.com/alerts/discord +discordalert="off" +discordwebhook="webhook" + +# Email Alerts | https://docs.linuxgsm.com/alerts/email +emailalert="off" +email="email@example.com" +emailfrom="" + +# IFTTT Alerts | https://docs.linuxgsm.com/alerts/ifttt +iftttalert="off" +ifttttoken="accesstoken" +iftttevent="linuxgsm_alert" + +# Mailgun Email Alerts | https://docs.linuxgsm.com/alerts/mailgun +mailgunalert="off" +mailguntoken="accesstoken" +mailgundomain="example.com" +mailgunemailfrom="alert@example.com" +mailgunemail="email@myemail.com" + +# Pushbullet Alerts | https://docs.linuxgsm.com/alerts/pushbullet +pushbulletalert="off" +pushbullettoken="accesstoken" +channeltag="" + +# Pushover Alerts | https://docs.linuxgsm.com/alerts/pushover +pushoveralert="off" +pushovertoken="accesstoken" + +# Telegram Alerts | https://docs.linuxgsm.com/alerts/telegram +# You can add a custom cURL string eg proxy (useful in Russia) or else in "curlcustomstring". +# like a "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help", if you not need +# any custom string in curl - simple ignore this parameter. +telegramalert="off" +telegramtoken="accesstoken" +telegramchatid="" +curlcustomstring="" + +## Backup | https://docs.linuxgsm.com/commands/backup +maxbackups="4" +maxbackupdays="30" +stoponbackup="on" + +## Logging | https://docs.linuxgsm.com/features/logging +consolelogging="on" +logdays="7" + +## Monitor | https://docs.linuxgsm.com/commands/monitor +# Query delay time +querydelay="1" + +#### LinuxGSM Advanced Settings #### + +# ANSI Colors +ansi="on" + +# Message Display Time +sleeptime="0.5" + +## LinuxGSM Server Details +# Do not edit +gamename="Soldat" +engine="soldat" +glibc="2.1" + +#### Directories #### +# Edit with care + +## Server Specific Directories +systemdir="${serverfiles}" +executabledir="${systemdir}" +executable="./soldatserver" +servercfg="soldat.ini" +servercfgdir="${systemdir}" +servercfgfullpath="${servercfgdir}/${servercfg}" + +## Backup Directory +backupdir="${rootdir}/backups" + +## Logging Directories +logdir="${rootdir}/log" +gamelogdir="${serverfiles}/logs" +lgsmlogdir="${logdir}/script" +consolelogdir="${logdir}/console" +lgsmlog="${lgsmlogdir}/${servicename}-script.log" +consolelog="${consolelogdir}/${servicename}-console.log" +alertlog="${lgsmlogdir}/${servicename}-alert.log" +postdetailslog="${lgsmlogdir}/${servicename}-postdetails.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/data/serverlist.csv b/lgsm/data/serverlist.csv index bf922e595..2b3567314 100644 --- a/lgsm/data/serverlist.csv +++ b/lgsm/data/serverlist.csv @@ -74,6 +74,7 @@ samp,sampserver,San Andreas Multiplayer sbots,sbotsserver, StickyBots sfc,sfcserver,SourceForts Classic sof2,sof2server,Soldier Of Fortune 2: Gold Edition +sol,solserver,Soldat ss3,ss3server,Serious Sam 3: BFE sb,sbserver,Starbound st,stserver,Stationeers diff --git a/lgsm/functions/command_monitor.sh b/lgsm/functions/command_monitor.sh index 56b8ecf53..dca5fc964 100644 --- a/lgsm/functions/command_monitor.sh +++ b/lgsm/functions/command_monitor.sh @@ -176,7 +176,7 @@ fn_monitor_query_tcp(){ fn_monitor_loop } -fn_monitor_query_upd(){ +fn_monitor_query_udp(){ querymethod="upd" fn_monitor_loop } diff --git a/lgsm/functions/command_stop.sh b/lgsm/functions/command_stop.sh index ad3b64882..3aae20992 100644 --- a/lgsm/functions/command_stop.sh +++ b/lgsm/functions/command_stop.sh @@ -195,7 +195,7 @@ fn_stop_graceful_select(){ fn_stop_graceful_cmd "quit" 120 elif [ "${engine}" == "goldsource" ]; then fn_stop_graceful_goldsource - elif [ "${engine}" == "unity3d" ]||[ "${engine}" == "unreal4" ]||[ "${engine}" == "unreal3" ]||[ "${engine}" == "unreal2" ]||[ "${engine}" == "unreal" ]||[ "${shortname}" == "fctr" ]||[ "${shortname}" == "mumble" ]||[ "${shortname}" == "wurm" ]||[ "${shortname}" == "jc2" ]||[ "${shortname}" == "jc3" ]; then + elif [ "${engine}" == "unity3d" ]||[ "${engine}" == "unreal4" ]||[ "${engine}" == "unreal3" ]||[ "${engine}" == "unreal2" ]||[ "${engine}" == "unreal" ]||[ "${shortname}" == "fctr" ]||[ "${shortname}" == "mumble" ]||[ "${shortname}" == "wurm" ]||[ "${shortname}" == "jc2" ]||[ "${shortname}" == "jc3" ]||[ "${shortname}" == "sol" ]; then fn_stop_graceful_ctrlc elif [ "${engine}" == "source" ]||[ "${engine}" == "quake" ]||[ "${engine}" == "idtech2" ]||[ "${engine}" == "idtech3" ]||[ "${engine}" == "idtech3_ql" ]||[ "${shortname}" == "pz" ]||[ "${shortname}" == "rw" ]; then fn_stop_graceful_cmd "quit" 30 diff --git a/lgsm/functions/info_config.sh b/lgsm/functions/info_config.sh index 275fb54f2..15d91de7e 100644 --- a/lgsm/functions/info_config.sh +++ b/lgsm/functions/info_config.sh @@ -1212,6 +1212,18 @@ fn_info_config_mordhau(){ fi } +fn_info_config_soldat(){ + if [ ! -f "${servercfgfullpath}" ]; then + servername="${unavailable}" + serverpassword="${unavailable}" + adminpassword="${unavailable}" + else + servername=$(grep "Server_Name" "${servercfgfullpath}" | awk -F '=' '{print $2}') + serverpassword=$(grep "Game_Password" "${servercfgfullpath}" | awk -F '=' '{print $2}') + adminpassword=$(grep "Admin_Password" "${servercfgfullpath}" | awk -F '=' '{print $2}') + fi +} + # ARK: Survival Evolved if [ "${shortname}" == "ark" ]; then fn_info_config_ark @@ -1296,6 +1308,9 @@ elif [ "${shortname}" == "rw" ]; then # Serious Sam elif [ "${shortname}" == "ss3" ]; then fn_info_config_seriousengine35 +# Soldat +elif [ "${shortname}" == "sol" ]; then + fn_info_config_soldat # Soldier Of Fortune 2: Gold Edition elif [ "${shortname}" == "sof2" ]; then fn_info_config_sof2 diff --git a/lgsm/functions/info_messages.sh b/lgsm/functions/info_messages.sh index 0754ee232..b7cb76704 100644 --- a/lgsm/functions/info_messages.sh +++ b/lgsm/functions/info_messages.sh @@ -501,7 +501,7 @@ fn_info_message_ports(){ fi done # engines/games that require editing the parms - local ports_edit_array=( "goldsource" "Factorio" "Hurtworld" "iw3.0" "ioquake3" "Rust" "spark" "source" "starbound" "unreal4" "realvirtuality" "Unturned") + local ports_edit_array=( "goldsource" "Factorio" "Hurtworld" "iw3.0" "ioquake3" "Rust" "Soldat" "spark" "source" "starbound" "unreal4" "realvirtuality" "Unturned" ) for port_edit in "${ports_edit_array[@]}" do if [ "${engine}" == "${port_edit}" ]||[ "${gamename}" == "${port_edit}" ]||[ "${shortname}" == "${port_edit}" ]; then @@ -1215,6 +1215,16 @@ fn_info_message_barotrauma(){ } | column -s $'\t' -t } +fn_info_message_soldat() { + echo "netstat -atunp | grep soldat" + echo -e "" + { + echo -e "DESCRIPTION\tDIRECTION\tPORT\tPROTOCOL" + echo -e "> Game\tINBOUND\t${port}\tudp" + echo -e "> RCON\tINBOUND\t${port}\ttcp" + echo -e "> FILES\tINBOUND\t$((port+10))\ttcp" + } | column -s $'\t' -t +} fn_info_message_select_engine(){ # Display details depending on game or engine. @@ -1272,6 +1282,8 @@ fn_info_message_select_engine(){ fn_info_message_squad elif [ "${gamename}" == "Stationeers" ]; then fn_info_message_stationeers + elif [ "${shortname}" == "sol" ]; then + fn_info_message_soldat elif [ "${shortname}" == "sbots" ]; then fn_info_message_sbots elif [ "${gamename}" == "TeamSpeak 3" ]; then diff --git a/lgsm/functions/info_parms.sh b/lgsm/functions/info_parms.sh index f21924c92..f902f2e23 100644 --- a/lgsm/functions/info_parms.sh +++ b/lgsm/functions/info_parms.sh @@ -157,6 +157,15 @@ fn_info_parms_sof2(){ defaultmap=${defaultmap:-"NOT SET"} } +fn_info_parms_soldat(){ + port=${port:-"0"} + queryport=${port} + servername=${servername:-"NOT SET"} + serverpassword=${serverpassword:-"NOT SET"} + adminpassword=${adminpassword:-"NOT SET"} + maxplayers=${maxplayers:-"0"} +} + fn_info_parms_towerunite(){ port=${port:-"0"} queryport=${queryport:-"0"} @@ -239,6 +248,8 @@ elif [ "${shortname}" == "sof2" ]; then # Sticky Bots elif [ "${shortname}" == "sbots" ]; then fn_info_parms_stickybots +elif [ "${shortname}" == "sol" ]; then + fn_info_parms_soldat # Serious Sam elif [ "${shortname}" == "ss3" ]; then fn_info_parms_seriousengine35 diff --git a/lgsm/functions/install_config.sh b/lgsm/functions/install_config.sh index 8f991d517..1adeeb744 100644 --- a/lgsm/functions/install_config.sh +++ b/lgsm/functions/install_config.sh @@ -555,6 +555,12 @@ elif [ "${gamename}" == "Serious Sam 3: BFE" ]; then fn_fetch_default_config fn_default_config_remote fn_set_config_vars +elif [ "${gamename}" == "Soldat" ]; then + gamedirname="Soldat" + array_configs+=( soldat.ini ) + fn_fetch_default_config + fn_default_config_remote + fn_set_config_vars elif [ "${gamename}" == "Soldier Of Fortune 2: Gold Edition" ]; then gamedirname="SoldierOfFortune2Gold" array_configs+=( server.cfg mapcycle.txt) diff --git a/lgsm/functions/install_server_files.sh b/lgsm/functions/install_server_files.sh index 7e6e45b30..3de499a4c 100644 --- a/lgsm/functions/install_server_files.sh +++ b/lgsm/functions/install_server_files.sh @@ -59,6 +59,8 @@ fn_install_server_files(){ remote_fileurl="https://files.linuxgsm.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" elif [ "${shortname}" == "samp" ]; then remote_fileurl="https://files.sa-mp.com/samp037svr_R2-1.tar.gz"; local_filedir="${tmpdir}"; local_filename="samp037svr_R2-1.tar.gz"; chmodx="nochmodx" run="norun"; force="noforce"; md5="93705e165550c97484678236749198a4" + elif [ "${shortname}" == "sol" ]; then + remote_fileurl="https://static.soldat.pl/downloads/soldatserver2.8.1_1.7.1.zip"; local_filedir="${tmpdir}"; local_filename="soldatserver2.8.1_1.7.1.zip"; chmodx="nochmodx" run="norun"; force="noforce"; md5="994409c28520425965dec5c71ccb55e1" elif [ "${shortname}" == "zmr" ]; then remote_fileurl="https://files.linuxgsm.com/ZombieMasterReborn/zombie_master_reborn_b4_fix5.1.tar.bz2"; local_filedir="${tmpdir}"; local_filename="zombie_master_reborn_b4_fix5.1.tar.bz2"; chmodx="nochmodx" run="norun"; force="noforce"; md5="73472bd84dfa6d203f3b5f48f760773e" fi @@ -159,7 +161,7 @@ elif [ "${shortname}" == "mta" ]; then elif [ "${shortname}" == "fctr" ]; then update_factorio.sh install_factorio_save.sh -elif [ -z "${appid}" ]||[ "${shortname}" == "ahl" ]||[ "${shortname}" == "bd" ]||[ "${shortname}" == "bb" ]||[ "${shortname}" == "ges" ]||[ "${shortname}" == "ns" ]||[ "${shortname}" == "sfc" ]||[ "${shortname}" == "ts" ]||[ "${shortname}" == "vs" ]||[ "${shortname}" == "zmr" ]; then +elif [ -z "${appid}" ]||[ "${shortname}" == "ahl" ]||[ "${shortname}" == "bd" ]||[ "${shortname}" == "bb" ]||[ "${shortname}" == "ges" ]||[ "${shortname}" == "ns" ]||[ "${shortname}" == "sfc" ]||[ "${shortname}" == "sol" ]||[ "${shortname}" == "ts" ]||[ "${shortname}" == "vs" ]||[ "${shortname}" == "zmr" ]; then if [ "${shortname}" == "ut" ]; then install_eula.sh fi From 20473df46ecfc843493d7f93ee4d2f83ec7fb072 Mon Sep 17 00:00:00 2001 From: Christian Date: Tue, 27 Aug 2019 16:33:46 +0200 Subject: [PATCH 150/534] refactor(backup): unify backupdir on all configs (#2405) Co-authored-by: Christian Birk --- .../config-lgsm/ahlserver/_default.cfg | 2 +- .../config-lgsm/bb2server/_default.cfg | 2 +- .../config-lgsm/bbserver/_default.cfg | 2 +- .../config-lgsm/bdserver/_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/btserver/_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 | 2 +- .../config-lgsm/coduoserver/_default.cfg | 2 +- .../config-lgsm/codwawserver/_default.cfg | 2 +- .../config-lgsm/csczserver/_default.cfg | 2 +- .../config-lgsm/csserver/_default.cfg | 2 +- .../config-lgsm/cssserver/_default.cfg | 2 +- .../config-lgsm/dabserver/_default.cfg | 2 +- .../config-lgsm/dmcserver/_default.cfg | 2 +- .../config-lgsm/dodserver/_default.cfg | 2 +- .../config-lgsm/dodsserver/_default.cfg | 2 +- .../config-lgsm/doiserver/_default.cfg | 2 +- .../config-lgsm/dstserver/_default.cfg | 2 +- .../config-lgsm/dysserver/_default.cfg | 2 +- .../config-lgsm/ecoserver/_default.cfg | 2 +- .../config-lgsm/emserver/_default.cfg | 2 +- .../config-lgsm/etlserver/_default.cfg | 2 +- .../config-lgsm/fctrserver/_default.cfg | 2 +- .../config-lgsm/fofserver/_default.cfg | 2 +- .../config-lgsm/gesserver/_default.cfg | 2 +- .../config-lgsm/gmodserver/_default.cfg | 2 +- .../config-lgsm/hl2dmserver/_default.cfg | 2 +- .../config-lgsm/hldmserver/_default.cfg | 2 +- .../config-lgsm/hldmsserver/_default.cfg | 2 +- .../config-lgsm/hwserver/_default.cfg | 2 +- .../config-lgsm/insserver/_default.cfg | 2 +- .../config-lgsm/iosserver/_default.cfg | 2 +- .../config-lgsm/jc2server/_default.cfg | 2 +- .../config-lgsm/jc3server/_default.cfg | 2 +- .../config-lgsm/kfserver/_default.cfg | 2 +- .../config-lgsm/l4d2server/_default.cfg | 2 +- .../config-lgsm/l4dserver/_default.cfg | 2 +- .../config-lgsm/mcserver/_default.cfg | 2 +- .../config-lgsm/mtaserver/_default.cfg | 2 +- .../config-lgsm/mumbleserver/_default.cfg | 2 +- .../config-lgsm/ndserver/_default.cfg | 2 +- .../config-lgsm/nmrihserver/_default.cfg | 2 +- .../config-lgsm/ns2cserver/_default.cfg | 2 +- .../config-lgsm/ns2server/_default.cfg | 2 +- .../config-lgsm/nsserver/_default.cfg | 2 +- .../config-lgsm/opforserver/_default.cfg | 2 +- .../config-lgsm/pcserver/_default.cfg | 2 +- .../config-lgsm/pvkiiserver/_default.cfg | 2 +- .../config-lgsm/pzserver/_default.cfg | 2 +- .../config-lgsm/q2server/_default.cfg | 2 +- .../config-lgsm/q3server/_default.cfg | 2 +- .../config-lgsm/qlserver/_default.cfg | 2 +- .../config-lgsm/qwserver/_default.cfg | 2 +- .../config-lgsm/ricochetserver/_default.cfg | 2 +- .../config-lgsm/roserver/_default.cfg | 2 +- .../config-lgsm/rtcwserver/_default.cfg | 2 +- .../config-lgsm/rustserver/_default.cfg | 2 +- .../config-lgsm/rwserver/_default.cfg | 2 +- .../config-lgsm/sampserver/_default.cfg | 2 +- .../config-lgsm/sbotsserver/_default.cfg | 2 +- .../config-lgsm/sbserver/_default.cfg | 2 +- .../config-lgsm/sfcserver/_default.cfg | 2 +- .../config-lgsm/sof2server/_default.cfg | 2 +- .../config-lgsm/solserver/_default.cfg | 2 +- .../config-lgsm/ss3server/_default.cfg | 2 +- .../config-lgsm/stserver/_default.cfg | 2 +- .../config-lgsm/svenserver/_default.cfg | 2 +- .../config-lgsm/terrariaserver/_default.cfg | 2 +- .../config-lgsm/tf2server/_default.cfg | 2 +- .../config-lgsm/tfcserver/_default.cfg | 2 +- .../config-lgsm/ts3server/_default.cfg | 2 +- .../config-lgsm/tsserver/_default.cfg | 2 +- .../config-lgsm/tuserver/_default.cfg | 2 +- .../config-lgsm/twserver/_default.cfg | 2 +- .../config-lgsm/ut2k4server/_default.cfg | 2 +- .../config-lgsm/ut3server/_default.cfg | 2 +- .../config-lgsm/ut99server/_default.cfg | 2 +- .../config-lgsm/utserver/_default.cfg | 2 +- .../config-lgsm/vsserver/_default.cfg | 2 +- .../config-lgsm/wetserver/_default.cfg | 2 +- .../config-lgsm/wurmserver/_default.cfg | 2 +- .../config-lgsm/zmrserver/_default.cfg | 2 +- .../config-lgsm/zpsserver/_default.cfg | 2 +- lgsm/functions/command_backup.sh | 68 +++++++++++++------ 90 files changed, 136 insertions(+), 110 deletions(-) diff --git a/lgsm/config-default/config-lgsm/ahlserver/_default.cfg b/lgsm/config-default/config-lgsm/ahlserver/_default.cfg index ec35692ef..bee9cbcc3 100644 --- a/lgsm/config-default/config-lgsm/ahlserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/ahlserver/_default.cfg @@ -124,7 +124,7 @@ servercfgdir="${systemdir}" servercfgfullpath="${servercfgdir}/${servercfg}" ## Backup Directory -backupdir="${rootdir}/backups" +backupdir="${lgsmdir}/backup" ## Logging Directories logdir="${rootdir}/log" diff --git a/lgsm/config-default/config-lgsm/bb2server/_default.cfg b/lgsm/config-default/config-lgsm/bb2server/_default.cfg index 80e1244f9..0abc8c5ae 100644 --- a/lgsm/config-default/config-lgsm/bb2server/_default.cfg +++ b/lgsm/config-default/config-lgsm/bb2server/_default.cfg @@ -129,7 +129,7 @@ servercfgdir="${systemdir}/cfg" servercfgfullpath="${servercfgdir}/${servercfg}" ## Backup Directory -backupdir="${rootdir}/backups" +backupdir="${lgsmdir}/backup" ## Logging Directories logdir="${rootdir}/log" diff --git a/lgsm/config-default/config-lgsm/bbserver/_default.cfg b/lgsm/config-default/config-lgsm/bbserver/_default.cfg index db7a8dfff..b299f8fb6 100644 --- a/lgsm/config-default/config-lgsm/bbserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/bbserver/_default.cfg @@ -124,7 +124,7 @@ servercfgdir="${systemdir}" servercfgfullpath="${servercfgdir}/${servercfg}" ## Backup Directory -backupdir="${rootdir}/backups" +backupdir="${lgsmdir}/backup" ## Logging Directories logdir="${rootdir}/log" diff --git a/lgsm/config-default/config-lgsm/bdserver/_default.cfg b/lgsm/config-default/config-lgsm/bdserver/_default.cfg index 5e030759c..f4314d1f0 100644 --- a/lgsm/config-default/config-lgsm/bdserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/bdserver/_default.cfg @@ -123,7 +123,7 @@ servercfgdir="${systemdir}" servercfgfullpath="${servercfgdir}/${servercfg}" ## Backup Directory -backupdir="${rootdir}/backups" +backupdir="${lgsmdir}/backup" ## Logging Directories logdir="${rootdir}/log" diff --git a/lgsm/config-default/config-lgsm/bf1942server/_default.cfg b/lgsm/config-default/config-lgsm/bf1942server/_default.cfg index c1193658f..ef1da1ffb 100644 --- a/lgsm/config-default/config-lgsm/bf1942server/_default.cfg +++ b/lgsm/config-default/config-lgsm/bf1942server/_default.cfg @@ -108,7 +108,7 @@ servercfgdir="${systemdir}/mods/bf1942/settings" servercfgfullpath="${servercfgdir}/${servercfg}" ## Backup Directory -backupdir="${rootdir}/backups" +backupdir="${lgsmdir}/backup" ## Logging Directories logdir="${rootdir}/log" diff --git a/lgsm/config-default/config-lgsm/bmdmserver/_default.cfg b/lgsm/config-default/config-lgsm/bmdmserver/_default.cfg index f2d27f8b5..7927bcf90 100644 --- a/lgsm/config-default/config-lgsm/bmdmserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/bmdmserver/_default.cfg @@ -129,7 +129,7 @@ servercfgdir="${systemdir}/cfg" servercfgfullpath="${servercfgdir}/${servercfg}" ## Backup Directory -backupdir="${rootdir}/backups" +backupdir="${lgsmdir}/backup" ## Logging Directories logdir="${rootdir}/log" diff --git a/lgsm/config-default/config-lgsm/boserver/_default.cfg b/lgsm/config-default/config-lgsm/boserver/_default.cfg index 1793f6bd5..b0fe9a3aa 100644 --- a/lgsm/config-default/config-lgsm/boserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/boserver/_default.cfg @@ -122,7 +122,7 @@ servercfgdir="${systemdir}" servercfgfullpath="${servercfgdir}/${servercfg}" ## Backup Directory -backupdir="${rootdir}/backups" +backupdir="${lgsmdir}/backup" ## Logging Directories logdir="${rootdir}/log" diff --git a/lgsm/config-default/config-lgsm/bsserver/_default.cfg b/lgsm/config-default/config-lgsm/bsserver/_default.cfg index 08823a4bc..a29b6cfda 100644 --- a/lgsm/config-default/config-lgsm/bsserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/bsserver/_default.cfg @@ -133,7 +133,7 @@ servercfgdir="${systemdir}/cfg" servercfgfullpath="${servercfgdir}/${servercfg}" ## Backup Directory -backupdir="${rootdir}/backups" +backupdir="${lgsmdir}/backup" ## Logging Directories logdir="${rootdir}/log" diff --git a/lgsm/config-default/config-lgsm/btserver/_default.cfg b/lgsm/config-default/config-lgsm/btserver/_default.cfg index 14236eae4..65925ff2e 100644 --- a/lgsm/config-default/config-lgsm/btserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/btserver/_default.cfg @@ -116,7 +116,7 @@ servercfgdir="${systemdir}" servercfgfullpath="${servercfgdir}/${servercfg}" ## Backup Directory -backupdir="${lgsmdir}/backups" +backupdir="${lgsmdir}/backup" ## Logging Directories logdir="${rootdir}/log" diff --git a/lgsm/config-default/config-lgsm/ccserver/_default.cfg b/lgsm/config-default/config-lgsm/ccserver/_default.cfg index 65d36f1b2..77d5af934 100644 --- a/lgsm/config-default/config-lgsm/ccserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/ccserver/_default.cfg @@ -124,7 +124,7 @@ servercfgdir="${systemdir}/cfg" servercfgfullpath="${servercfgdir}/${servercfg}" ## Backup Directory -backupdir="${rootdir}/backups" +backupdir="${lgsmdir}/backup" ## Logging Directories logdir="${rootdir}/log" diff --git a/lgsm/config-default/config-lgsm/cod2server/_default.cfg b/lgsm/config-default/config-lgsm/cod2server/_default.cfg index 8f4602123..edc5b087d 100644 --- a/lgsm/config-default/config-lgsm/cod2server/_default.cfg +++ b/lgsm/config-default/config-lgsm/cod2server/_default.cfg @@ -111,7 +111,7 @@ servercfgdir="${systemdir}/main" servercfgfullpath="${servercfgdir}/${servercfg}" ## Backup Directory -backupdir="${rootdir}/backups" +backupdir="${lgsmdir}/backup" ## Logging Directories logdir="${rootdir}/log" diff --git a/lgsm/config-default/config-lgsm/cod4server/_default.cfg b/lgsm/config-default/config-lgsm/cod4server/_default.cfg index 099128073..23cce4a4c 100644 --- a/lgsm/config-default/config-lgsm/cod4server/_default.cfg +++ b/lgsm/config-default/config-lgsm/cod4server/_default.cfg @@ -111,7 +111,7 @@ servercfgdir="${systemdir}/main" servercfgfullpath="${servercfgdir}/${servercfg}" ## Backup Directory -backupdir="${rootdir}/backups" +backupdir="${lgsmdir}/backup" ## Logging Directories logdir="${rootdir}/log" diff --git a/lgsm/config-default/config-lgsm/codserver/_default.cfg b/lgsm/config-default/config-lgsm/codserver/_default.cfg index 7c6cd2e35..41d22bf82 100644 --- a/lgsm/config-default/config-lgsm/codserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/codserver/_default.cfg @@ -111,7 +111,7 @@ servercfgdir="${systemdir}/main" servercfgfullpath="${servercfgdir}/${servercfg}" ## Backup Directory -backupdir="${rootdir}/backups" +backupdir="${lgsmdir}/backup" ## Logging Directories logdir="${rootdir}/log" diff --git a/lgsm/config-default/config-lgsm/coduoserver/_default.cfg b/lgsm/config-default/config-lgsm/coduoserver/_default.cfg index 3a61761c5..7664974a0 100644 --- a/lgsm/config-default/config-lgsm/coduoserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/coduoserver/_default.cfg @@ -111,7 +111,7 @@ servercfgdir="${systemdir}/uo" servercfgfullpath="${servercfgdir}/${servercfg}" ## Backup Directory -backupdir="${rootdir}/backups" +backupdir="${lgsmdir}/backup" ## Logging Directories logdir="${rootdir}/log" diff --git a/lgsm/config-default/config-lgsm/codwawserver/_default.cfg b/lgsm/config-default/config-lgsm/codwawserver/_default.cfg index 1610ab01f..99732af5d 100644 --- a/lgsm/config-default/config-lgsm/codwawserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/codwawserver/_default.cfg @@ -111,7 +111,7 @@ servercfgdir="${systemdir}/main" servercfgfullpath="${servercfgdir}/${servercfg}" ## Backup Directory -backupdir="${rootdir}/backups" +backupdir="${lgsmdir}/backup" ## Logging Directories logdir="${rootdir}/log" diff --git a/lgsm/config-default/config-lgsm/csczserver/_default.cfg b/lgsm/config-default/config-lgsm/csczserver/_default.cfg index eb85d04ce..980ab873d 100644 --- a/lgsm/config-default/config-lgsm/csczserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/csczserver/_default.cfg @@ -124,7 +124,7 @@ servercfgdir="${systemdir}" servercfgfullpath="${servercfgdir}/${servercfg}" ## Backup Directory -backupdir="${rootdir}/backups" +backupdir="${lgsmdir}/backup" ## Logging Directories logdir="${rootdir}/log" diff --git a/lgsm/config-default/config-lgsm/csserver/_default.cfg b/lgsm/config-default/config-lgsm/csserver/_default.cfg index 60390eb68..6875f9f5b 100644 --- a/lgsm/config-default/config-lgsm/csserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/csserver/_default.cfg @@ -124,7 +124,7 @@ servercfgdir="${systemdir}" servercfgfullpath="${servercfgdir}/${servercfg}" ## Backup Directory -backupdir="${rootdir}/backups" +backupdir="${lgsmdir}/backup" ## Logging Directories logdir="${rootdir}/log" diff --git a/lgsm/config-default/config-lgsm/cssserver/_default.cfg b/lgsm/config-default/config-lgsm/cssserver/_default.cfg index e07733c32..4f54ce5f2 100644 --- a/lgsm/config-default/config-lgsm/cssserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/cssserver/_default.cfg @@ -129,7 +129,7 @@ servercfgdir="${systemdir}/cfg" servercfgfullpath="${servercfgdir}/${servercfg}" ## Backup Directory -backupdir="${rootdir}/backups" +backupdir="${lgsmdir}/backup" ## Logging Directories logdir="${rootdir}/log" diff --git a/lgsm/config-default/config-lgsm/dabserver/_default.cfg b/lgsm/config-default/config-lgsm/dabserver/_default.cfg index e65d5cb94..c9e202985 100644 --- a/lgsm/config-default/config-lgsm/dabserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/dabserver/_default.cfg @@ -124,7 +124,7 @@ servercfgdir="${systemdir}/cfg" servercfgfullpath="${servercfgdir}/${servercfg}" ## Backup Directory -backupdir="${rootdir}/backups" +backupdir="${lgsmdir}/backup" ## Logging Directories logdir="${rootdir}/log" diff --git a/lgsm/config-default/config-lgsm/dmcserver/_default.cfg b/lgsm/config-default/config-lgsm/dmcserver/_default.cfg index 804cb020c..b67b2650a 100644 --- a/lgsm/config-default/config-lgsm/dmcserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/dmcserver/_default.cfg @@ -124,7 +124,7 @@ servercfgdir="${systemdir}" servercfgfullpath="${servercfgdir}/${servercfg}" ## Backup Directory -backupdir="${rootdir}/backups" +backupdir="${lgsmdir}/backup" ## Logging Directories logdir="${rootdir}/log" diff --git a/lgsm/config-default/config-lgsm/dodserver/_default.cfg b/lgsm/config-default/config-lgsm/dodserver/_default.cfg index e82012e29..13f174eab 100644 --- a/lgsm/config-default/config-lgsm/dodserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/dodserver/_default.cfg @@ -124,7 +124,7 @@ servercfgdir="${systemdir}" servercfgfullpath="${servercfgdir}/${servercfg}" ## Backup Directory -backupdir="${rootdir}/backups" +backupdir="${lgsmdir}/backup" ## Logging Directories logdir="${rootdir}/log" diff --git a/lgsm/config-default/config-lgsm/dodsserver/_default.cfg b/lgsm/config-default/config-lgsm/dodsserver/_default.cfg index 4ce487dbc..1f94decf0 100644 --- a/lgsm/config-default/config-lgsm/dodsserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/dodsserver/_default.cfg @@ -124,7 +124,7 @@ servercfgdir="${systemdir}/cfg" servercfgfullpath="${servercfgdir}/${servercfg}" ## Backup Directory -backupdir="${rootdir}/backups" +backupdir="${lgsmdir}/backup" ## Logging Directories logdir="${rootdir}/log" diff --git a/lgsm/config-default/config-lgsm/doiserver/_default.cfg b/lgsm/config-default/config-lgsm/doiserver/_default.cfg index b5d2dc63f..59531d02d 100644 --- a/lgsm/config-default/config-lgsm/doiserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/doiserver/_default.cfg @@ -126,7 +126,7 @@ servercfgdir="${systemdir}/cfg" servercfgfullpath="${servercfgdir}/${servercfg}" ## Backup Directory -backupdir="${rootdir}/backups" +backupdir="${lgsmdir}/backup" ## Logging Directories logdir="${rootdir}/log" diff --git a/lgsm/config-default/config-lgsm/dstserver/_default.cfg b/lgsm/config-default/config-lgsm/dstserver/_default.cfg index 70bc1e1bc..0265ebb23 100644 --- a/lgsm/config-default/config-lgsm/dstserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/dstserver/_default.cfg @@ -134,7 +134,7 @@ servercfgfullpath="${servercfgdir}/${servercfg}" servercfgdefault="server.ini" ## Backup Directory -backupdir="${rootdir}/backups" +backupdir="${lgsmdir}/backup" ## Logging Directories logdir="${rootdir}/log" diff --git a/lgsm/config-default/config-lgsm/dysserver/_default.cfg b/lgsm/config-default/config-lgsm/dysserver/_default.cfg index 554bc1ee6..8e7bfb32a 100644 --- a/lgsm/config-default/config-lgsm/dysserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/dysserver/_default.cfg @@ -129,7 +129,7 @@ servercfgdir="${systemdir}/cfg" servercfgfullpath="${servercfgdir}/${servercfg}" ## Backup Directory -backupdir="${rootdir}/backups" +backupdir="${lgsmdir}/backup" ## Logging Directories logdir="${rootdir}/log" diff --git a/lgsm/config-default/config-lgsm/ecoserver/_default.cfg b/lgsm/config-default/config-lgsm/ecoserver/_default.cfg index b08ddd850..5387a83c8 100644 --- a/lgsm/config-default/config-lgsm/ecoserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/ecoserver/_default.cfg @@ -112,7 +112,7 @@ servercfgdir="${systemdir}/Configs" servercfgfullpath="${servercfgdir}/${servercfg}" ## Backup Directory -backupdir="${rootdir}/backups" +backupdir="${lgsmdir}/backup" ## Logging Directories logdir="${rootdir}/log" diff --git a/lgsm/config-default/config-lgsm/emserver/_default.cfg b/lgsm/config-default/config-lgsm/emserver/_default.cfg index 5b9efc6de..70c491179 100644 --- a/lgsm/config-default/config-lgsm/emserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/emserver/_default.cfg @@ -129,7 +129,7 @@ servercfgdir="${systemdir}/cfg" servercfgfullpath="${servercfgdir}/${servercfg}" ## Backup Directory -backupdir="${rootdir}/backups" +backupdir="${lgsmdir}/backup" ## Logging Directories logdir="${rootdir}/log" diff --git a/lgsm/config-default/config-lgsm/etlserver/_default.cfg b/lgsm/config-default/config-lgsm/etlserver/_default.cfg index 9033c8fcf..efdb506bc 100644 --- a/lgsm/config-default/config-lgsm/etlserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/etlserver/_default.cfg @@ -105,7 +105,7 @@ servercfgdir="${systemdir}/etmain" servercfgfullpath="${servercfgdir}/${servercfg}" ## Backup Directory -backupdir="${rootdir}/backups" +backupdir="${lgsmdir}/backup" ## Logging Directories logdir="${rootdir}/log" diff --git a/lgsm/config-default/config-lgsm/fctrserver/_default.cfg b/lgsm/config-default/config-lgsm/fctrserver/_default.cfg index 59fdd7b8f..deaf3bce0 100644 --- a/lgsm/config-default/config-lgsm/fctrserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/fctrserver/_default.cfg @@ -116,7 +116,7 @@ servercfgdir="${serverfiles}/data" servercfgfullpath="${servercfgdir}/${servercfg}" ## Backup Directory -backupdir="${rootdir}/backups" +backupdir="${lgsmdir}/backup" ## Logging Directories gamelogdir="${serverfiles}" diff --git a/lgsm/config-default/config-lgsm/fofserver/_default.cfg b/lgsm/config-default/config-lgsm/fofserver/_default.cfg index 692bce2bb..f4cc72c11 100644 --- a/lgsm/config-default/config-lgsm/fofserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/fofserver/_default.cfg @@ -124,7 +124,7 @@ servercfgdir="${systemdir}/cfg" servercfgfullpath="${servercfgdir}/${servercfg}" ## Backup Directory -backupdir="${rootdir}/backups" +backupdir="${lgsmdir}/backup" ## Logging Directories logdir="${rootdir}/log" diff --git a/lgsm/config-default/config-lgsm/gesserver/_default.cfg b/lgsm/config-default/config-lgsm/gesserver/_default.cfg index 4a16eacc2..6f2426524 100644 --- a/lgsm/config-default/config-lgsm/gesserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/gesserver/_default.cfg @@ -124,7 +124,7 @@ servercfgdir="${systemdir}/cfg" servercfgfullpath="${servercfgdir}/${servercfg}" ## Backup Directory -backupdir="${rootdir}/backups" +backupdir="${lgsmdir}/backup" ## Logging Directories logdir="${rootdir}/log" diff --git a/lgsm/config-default/config-lgsm/gmodserver/_default.cfg b/lgsm/config-default/config-lgsm/gmodserver/_default.cfg index 7090b26aa..8901aaea5 100644 --- a/lgsm/config-default/config-lgsm/gmodserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/gmodserver/_default.cfg @@ -141,7 +141,7 @@ servercfgdir="${systemdir}/cfg" servercfgfullpath="${servercfgdir}/${servercfg}" ## Backup Directory -backupdir="${rootdir}/backups" +backupdir="${lgsmdir}/backup" ## Logging Directories logdir="${rootdir}/log" diff --git a/lgsm/config-default/config-lgsm/hl2dmserver/_default.cfg b/lgsm/config-default/config-lgsm/hl2dmserver/_default.cfg index 15a39af24..03c867f87 100644 --- a/lgsm/config-default/config-lgsm/hl2dmserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/hl2dmserver/_default.cfg @@ -124,7 +124,7 @@ servercfgdir="${systemdir}/cfg" servercfgfullpath="${servercfgdir}/${servercfg}" ## Backup Directory -backupdir="${rootdir}/backups" +backupdir="${lgsmdir}/backup" ## Logging Directories logdir="${rootdir}/log" diff --git a/lgsm/config-default/config-lgsm/hldmserver/_default.cfg b/lgsm/config-default/config-lgsm/hldmserver/_default.cfg index 1f57e9880..52c2aa398 100644 --- a/lgsm/config-default/config-lgsm/hldmserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/hldmserver/_default.cfg @@ -123,7 +123,7 @@ servercfgdir="${systemdir}" servercfgfullpath="${servercfgdir}/${servercfg}" ## Backup Directory -backupdir="${rootdir}/backups" +backupdir="${lgsmdir}/backup" ## Logging Directories logdir="${rootdir}/log" diff --git a/lgsm/config-default/config-lgsm/hldmsserver/_default.cfg b/lgsm/config-default/config-lgsm/hldmsserver/_default.cfg index c89b5a19c..798a85107 100644 --- a/lgsm/config-default/config-lgsm/hldmsserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/hldmsserver/_default.cfg @@ -124,7 +124,7 @@ servercfgdir="${systemdir}/cfg" servercfgfullpath="${servercfgdir}/${servercfg}" ## Backup Directory -backupdir="${rootdir}/backups" +backupdir="${lgsmdir}/backup" ## Logging Directories logdir="${rootdir}/log" diff --git a/lgsm/config-default/config-lgsm/hwserver/_default.cfg b/lgsm/config-default/config-lgsm/hwserver/_default.cfg index d01949784..a48ece00a 100644 --- a/lgsm/config-default/config-lgsm/hwserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/hwserver/_default.cfg @@ -131,7 +131,7 @@ executabledir="${serverfiles}" executable=$([ "$(uname -m)" == "x86_64" ] && echo "./Hurtworld.x86_64" || echo "./Hurtworld.x86") ## Backup Directory -backupdir="${rootdir}/backups" +backupdir="${lgsmdir}/backup" ## Logging Directories logdir="${rootdir}/log" diff --git a/lgsm/config-default/config-lgsm/insserver/_default.cfg b/lgsm/config-default/config-lgsm/insserver/_default.cfg index 4e09e078b..833b56c94 100644 --- a/lgsm/config-default/config-lgsm/insserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/insserver/_default.cfg @@ -131,7 +131,7 @@ servercfgdir="${systemdir}/cfg" servercfgfullpath="${servercfgdir}/${servercfg}" ## Backup Directory -backupdir="${rootdir}/backups" +backupdir="${lgsmdir}/backup" ## Logging Directories logdir="${rootdir}/log" diff --git a/lgsm/config-default/config-lgsm/iosserver/_default.cfg b/lgsm/config-default/config-lgsm/iosserver/_default.cfg index 435b8310e..1bfaedfc2 100644 --- a/lgsm/config-default/config-lgsm/iosserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/iosserver/_default.cfg @@ -124,7 +124,7 @@ servercfgdir="${systemdir}/cfg" servercfgfullpath="${servercfgdir}/${servercfg}" ## Backup Directory -backupdir="${rootdir}/backups" +backupdir="${lgsmdir}/backup" ## Logging Directories logdir="${rootdir}/log" diff --git a/lgsm/config-default/config-lgsm/jc2server/_default.cfg b/lgsm/config-default/config-lgsm/jc2server/_default.cfg index 439adc72e..858ba5707 100644 --- a/lgsm/config-default/config-lgsm/jc2server/_default.cfg +++ b/lgsm/config-default/config-lgsm/jc2server/_default.cfg @@ -116,7 +116,7 @@ servercfgdir="${serverfiles}" servercfgfullpath="${servercfgdir}/${servercfg}" ## Backup Directory -backupdir="${rootdir}/backups" +backupdir="${lgsmdir}/backup" ## Logging Directories logdir="${rootdir}/log" diff --git a/lgsm/config-default/config-lgsm/jc3server/_default.cfg b/lgsm/config-default/config-lgsm/jc3server/_default.cfg index a302deee0..776f170b5 100644 --- a/lgsm/config-default/config-lgsm/jc3server/_default.cfg +++ b/lgsm/config-default/config-lgsm/jc3server/_default.cfg @@ -116,7 +116,7 @@ servercfgdir="${serverfiles}" servercfgfullpath="${servercfgdir}/${servercfg}" ## Backup Directory -backupdir="${rootdir}/backups" +backupdir="${lgsmdir}/backup" ## Logging Directories logdir="${rootdir}/log" diff --git a/lgsm/config-default/config-lgsm/kfserver/_default.cfg b/lgsm/config-default/config-lgsm/kfserver/_default.cfg index b182c60b5..88c5d5c3d 100644 --- a/lgsm/config-default/config-lgsm/kfserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/kfserver/_default.cfg @@ -130,7 +130,7 @@ servercfgfullpath="${servercfgdir}/${servercfg}" compressedmapsdir="${rootdir}/Maps-Compressed" ## Backup Directory -backupdir="${rootdir}/backups" +backupdir="${lgsmdir}/backup" ## Logging Directories logdir="${rootdir}/log" diff --git a/lgsm/config-default/config-lgsm/l4d2server/_default.cfg b/lgsm/config-default/config-lgsm/l4d2server/_default.cfg index 6b3f09c9d..60637ba3f 100644 --- a/lgsm/config-default/config-lgsm/l4d2server/_default.cfg +++ b/lgsm/config-default/config-lgsm/l4d2server/_default.cfg @@ -123,7 +123,7 @@ servercfgdir="${systemdir}/cfg" servercfgfullpath="${servercfgdir}/${servercfg}" ## Backup Directory -backupdir="${rootdir}/backups" +backupdir="${lgsmdir}/backup" ## Logging Directories logdir="${rootdir}/log" diff --git a/lgsm/config-default/config-lgsm/l4dserver/_default.cfg b/lgsm/config-default/config-lgsm/l4dserver/_default.cfg index 80dfee1e4..206a5d63a 100644 --- a/lgsm/config-default/config-lgsm/l4dserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/l4dserver/_default.cfg @@ -123,7 +123,7 @@ servercfgdir="${systemdir}/cfg" servercfgfullpath="${servercfgdir}/${servercfg}" ## Backup Directory -backupdir="${rootdir}/backups" +backupdir="${lgsmdir}/backup" ## Logging Directories logdir="${rootdir}/log" diff --git a/lgsm/config-default/config-lgsm/mcserver/_default.cfg b/lgsm/config-default/config-lgsm/mcserver/_default.cfg index 7b744ff51..6d8bfae71 100644 --- a/lgsm/config-default/config-lgsm/mcserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/mcserver/_default.cfg @@ -110,7 +110,7 @@ servercfgdir="${serverfiles}" servercfgfullpath="${servercfgdir}/${servercfg}" ## Backup Directory -backupdir="${rootdir}/backups" +backupdir="${lgsmdir}/backup" ## Logging Directories logdir="${rootdir}/log" diff --git a/lgsm/config-default/config-lgsm/mtaserver/_default.cfg b/lgsm/config-default/config-lgsm/mtaserver/_default.cfg index cbe998b5a..f5db494ed 100644 --- a/lgsm/config-default/config-lgsm/mtaserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/mtaserver/_default.cfg @@ -106,7 +106,7 @@ servercfgdir="${systemdir}/mods/deathmatch" servercfgfullpath="${servercfgdir}/${servercfg}" ## Backup Directory -backupdir="${rootdir}/backups" +backupdir="${lgsmdir}/backup" ## Logging Directories logdir="${rootdir}/log" diff --git a/lgsm/config-default/config-lgsm/mumbleserver/_default.cfg b/lgsm/config-default/config-lgsm/mumbleserver/_default.cfg index 0404d5834..1c87b4c77 100644 --- a/lgsm/config-default/config-lgsm/mumbleserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/mumbleserver/_default.cfg @@ -109,7 +109,7 @@ servercfgdir="${serverfiles}" servercfgfullpath="${servercfgdir}/${servercfg}" ## Backup Directory -backupdir="${rootdir}/backups" +backupdir="${lgsmdir}/backup" ## Logging Directories logdir="${rootdir}/log" diff --git a/lgsm/config-default/config-lgsm/ndserver/_default.cfg b/lgsm/config-default/config-lgsm/ndserver/_default.cfg index ce6932680..0d920f0e2 100644 --- a/lgsm/config-default/config-lgsm/ndserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/ndserver/_default.cfg @@ -124,7 +124,7 @@ servercfgdir="${systemdir}/cfg" servercfgfullpath="${servercfgdir}/${servercfg}" ## Backup Directory -backupdir="${rootdir}/backups" +backupdir="${lgsmdir}/backup" ## Logging Directories logdir="${rootdir}/log" diff --git a/lgsm/config-default/config-lgsm/nmrihserver/_default.cfg b/lgsm/config-default/config-lgsm/nmrihserver/_default.cfg index a59455630..25aa74192 100644 --- a/lgsm/config-default/config-lgsm/nmrihserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/nmrihserver/_default.cfg @@ -129,7 +129,7 @@ servercfgdir="${systemdir}/cfg" servercfgfullpath="${servercfgdir}/${servercfg}" ## Backup Directory -backupdir="${rootdir}/backups" +backupdir="${lgsmdir}/backup" ## Logging Directories logdir="${rootdir}/log" diff --git a/lgsm/config-default/config-lgsm/ns2cserver/_default.cfg b/lgsm/config-default/config-lgsm/ns2cserver/_default.cfg index bedb28177..b5d75252b 100644 --- a/lgsm/config-default/config-lgsm/ns2cserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/ns2cserver/_default.cfg @@ -130,7 +130,7 @@ servercfgfullpath="${servercfgdir}" modstoragedir="${servercfgdir}/Workshop" ## Backup Directory -backupdir="${rootdir}/backups" +backupdir="${lgsmdir}/backup" ## Logging Directories logdir="${rootdir}/log" diff --git a/lgsm/config-default/config-lgsm/ns2server/_default.cfg b/lgsm/config-default/config-lgsm/ns2server/_default.cfg index 3c6c0e34a..79c0b169e 100644 --- a/lgsm/config-default/config-lgsm/ns2server/_default.cfg +++ b/lgsm/config-default/config-lgsm/ns2server/_default.cfg @@ -134,7 +134,7 @@ servercfgfullpath="${servercfgdir}" modstoragedir="${servercfgdir}/Workshop" ## Backup Directory -backupdir="${rootdir}/backups" +backupdir="${lgsmdir}/backup" ## Logging Directories logdir="${rootdir}/log" diff --git a/lgsm/config-default/config-lgsm/nsserver/_default.cfg b/lgsm/config-default/config-lgsm/nsserver/_default.cfg index 0bd6f4e9b..7b3fb9bde 100644 --- a/lgsm/config-default/config-lgsm/nsserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/nsserver/_default.cfg @@ -124,7 +124,7 @@ servercfgdir="${systemdir}" servercfgfullpath="${servercfgdir}/${servercfg}" ## Backup Directory -backupdir="${rootdir}/backups" +backupdir="${lgsmdir}/backup" ## Logging Directories logdir="${rootdir}/log" diff --git a/lgsm/config-default/config-lgsm/opforserver/_default.cfg b/lgsm/config-default/config-lgsm/opforserver/_default.cfg index 278288e74..9b0c611b6 100644 --- a/lgsm/config-default/config-lgsm/opforserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/opforserver/_default.cfg @@ -124,7 +124,7 @@ servercfgdir="${systemdir}" servercfgfullpath="${servercfgdir}/${servercfg}" ## Backup Directory -backupdir="${rootdir}/backups" +backupdir="${lgsmdir}/backup" ## Logging Directories logdir="${rootdir}/log" diff --git a/lgsm/config-default/config-lgsm/pcserver/_default.cfg b/lgsm/config-default/config-lgsm/pcserver/_default.cfg index b2c26aaad..1a324a399 100644 --- a/lgsm/config-default/config-lgsm/pcserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/pcserver/_default.cfg @@ -116,7 +116,7 @@ servercfgdir="${systemdir}" servercfgfullpath="${servercfgdir}/${servercfg}" ## Backup Directory -backupdir="${rootdir}/backups" +backupdir="${lgsmdir}/backup" ## Logging Directories logdir="${rootdir}/log" diff --git a/lgsm/config-default/config-lgsm/pvkiiserver/_default.cfg b/lgsm/config-default/config-lgsm/pvkiiserver/_default.cfg index 407324f3b..50afb6323 100644 --- a/lgsm/config-default/config-lgsm/pvkiiserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/pvkiiserver/_default.cfg @@ -124,7 +124,7 @@ servercfgdir="${systemdir}/cfg" servercfgfullpath="${servercfgdir}/${servercfg}" ## Backup Directory -backupdir="${rootdir}/backups" +backupdir="${lgsmdir}/backup" ## Logging Directories logdir="${rootdir}/log" diff --git a/lgsm/config-default/config-lgsm/pzserver/_default.cfg b/lgsm/config-default/config-lgsm/pzserver/_default.cfg index c5db5f93a..3592c6fc8 100644 --- a/lgsm/config-default/config-lgsm/pzserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/pzserver/_default.cfg @@ -119,7 +119,7 @@ servercfgdir="${HOME}/Zomboid/Server" servercfgfullpath="${servercfgdir}/${servercfg}" ## Backup Directory -backupdir="${rootdir}/backups" +backupdir="${lgsmdir}/backup" ## Logging Directories logdir="${rootdir}/log" diff --git a/lgsm/config-default/config-lgsm/q2server/_default.cfg b/lgsm/config-default/config-lgsm/q2server/_default.cfg index 4369281e4..920f0f012 100644 --- a/lgsm/config-default/config-lgsm/q2server/_default.cfg +++ b/lgsm/config-default/config-lgsm/q2server/_default.cfg @@ -110,7 +110,7 @@ servercfgdir="${systemdir}" servercfgfullpath="${servercfgdir}/${servercfg}" ## Backup Directory -backupdir="${rootdir}/backups" +backupdir="${lgsmdir}/backup" ## Logging Directories logdir="${rootdir}/log" diff --git a/lgsm/config-default/config-lgsm/q3server/_default.cfg b/lgsm/config-default/config-lgsm/q3server/_default.cfg index 2f1bc15f4..30d2363ab 100644 --- a/lgsm/config-default/config-lgsm/q3server/_default.cfg +++ b/lgsm/config-default/config-lgsm/q3server/_default.cfg @@ -110,7 +110,7 @@ servercfgdir="${systemdir}" servercfgfullpath="${servercfgdir}/${servercfg}" ## Backup Directory -backupdir="${rootdir}/backups" +backupdir="${lgsmdir}/backup" ## Logging Directories logdir="${rootdir}/log" diff --git a/lgsm/config-default/config-lgsm/qlserver/_default.cfg b/lgsm/config-default/config-lgsm/qlserver/_default.cfg index 0535d7789..f05bd78ec 100644 --- a/lgsm/config-default/config-lgsm/qlserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/qlserver/_default.cfg @@ -118,7 +118,7 @@ servercfgdir="${serverfiles}/baseq3" servercfgfullpath="${servercfgdir}/${servercfg}" ## Backup Directory -backupdir="${rootdir}/backups" +backupdir="${lgsmdir}/backup" ## Logging Directories logdir="${rootdir}/log" diff --git a/lgsm/config-default/config-lgsm/qwserver/_default.cfg b/lgsm/config-default/config-lgsm/qwserver/_default.cfg index f9fd737f4..8d52d2f1c 100644 --- a/lgsm/config-default/config-lgsm/qwserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/qwserver/_default.cfg @@ -109,7 +109,7 @@ servercfgdir="${systemdir}" servercfgfullpath="${servercfgdir}/${servercfg}" ## Backup Directory -backupdir="${rootdir}/backups" +backupdir="${lgsmdir}/backup" ## Logging Directories logdir="${rootdir}/log" diff --git a/lgsm/config-default/config-lgsm/ricochetserver/_default.cfg b/lgsm/config-default/config-lgsm/ricochetserver/_default.cfg index 727f1ddc5..53ed05649 100644 --- a/lgsm/config-default/config-lgsm/ricochetserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/ricochetserver/_default.cfg @@ -124,7 +124,7 @@ servercfgdir="${systemdir}" servercfgfullpath="${servercfgdir}/${servercfg}" ## Backup Directory -backupdir="${rootdir}/backups" +backupdir="${lgsmdir}/backup" ## Logging Directories logdir="${rootdir}/log" diff --git a/lgsm/config-default/config-lgsm/roserver/_default.cfg b/lgsm/config-default/config-lgsm/roserver/_default.cfg index 0ecfaad5d..e0e5719bb 100644 --- a/lgsm/config-default/config-lgsm/roserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/roserver/_default.cfg @@ -126,7 +126,7 @@ servercfgfullpath="${servercfgdir}/${servercfg}" compressedmapsdir="${rootdir}/Maps-Compressed" ## Backup Directory -backupdir="${rootdir}/backups" +backupdir="${lgsmdir}/backup" ## Logging Directories logdir="${rootdir}/log" diff --git a/lgsm/config-default/config-lgsm/rtcwserver/_default.cfg b/lgsm/config-default/config-lgsm/rtcwserver/_default.cfg index cf1373e64..7d0eca7ee 100644 --- a/lgsm/config-default/config-lgsm/rtcwserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/rtcwserver/_default.cfg @@ -110,7 +110,7 @@ servercfgdir="${systemdir}" servercfgfullpath="${servercfgdir}/${servercfg}" ## Backup Directory -backupdir="${rootdir}/backups" +backupdir="${lgsmdir}/backup" ## Logging Directories logdir="${rootdir}/log" diff --git a/lgsm/config-default/config-lgsm/rustserver/_default.cfg b/lgsm/config-default/config-lgsm/rustserver/_default.cfg index 7167acd03..1af31d373 100644 --- a/lgsm/config-default/config-lgsm/rustserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/rustserver/_default.cfg @@ -149,7 +149,7 @@ servercfgdir="${serveridentitydir}/cfg" servercfgfullpath="${servercfgdir}/${servercfg}" ## Backup Directory -backupdir="${rootdir}/backups" +backupdir="${lgsmdir}/backup" ## Logging Directories logdir="${rootdir}/log" diff --git a/lgsm/config-default/config-lgsm/rwserver/_default.cfg b/lgsm/config-default/config-lgsm/rwserver/_default.cfg index 7f4222b30..10a8ac03d 100644 --- a/lgsm/config-default/config-lgsm/rwserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/rwserver/_default.cfg @@ -119,7 +119,7 @@ servercfgdir="${serverfiles}" servercfgfullpath="${servercfgdir}/${servercfg}" ## Backup Directory -backupdir="${rootdir}/backups" +backupdir="${lgsmdir}/backup" ## Logging Directories logdir="${rootdir}/log" diff --git a/lgsm/config-default/config-lgsm/sampserver/_default.cfg b/lgsm/config-default/config-lgsm/sampserver/_default.cfg index b76e92538..600c0498a 100644 --- a/lgsm/config-default/config-lgsm/sampserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/sampserver/_default.cfg @@ -108,7 +108,7 @@ servercfgdir="${systemdir}/samp03" servercfgfullpath="${servercfgdir}/${servercfg}" ## Backup Directory -backupdir="${rootdir}/backups" +backupdir="${lgsmdir}/backup" ## Logging Directories logdir="${rootdir}/log" diff --git a/lgsm/config-default/config-lgsm/sbotsserver/_default.cfg b/lgsm/config-default/config-lgsm/sbotsserver/_default.cfg index c9e6d450a..1c95132b1 100644 --- a/lgsm/config-default/config-lgsm/sbotsserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/sbotsserver/_default.cfg @@ -121,7 +121,7 @@ servercfgdir="${systemdir}/blank1/Saved/Config/LinuxServer" servercfgfullpath="${servercfgdir}/${servercfg}" ## Backup Directory -backupdir="${rootdir}/backups" +backupdir="${lgsmdir}/backup" ## Logging Directories logdir="${rootdir}/log" diff --git a/lgsm/config-default/config-lgsm/sbserver/_default.cfg b/lgsm/config-default/config-lgsm/sbserver/_default.cfg index 3f157a72a..5cf9a10fd 100644 --- a/lgsm/config-default/config-lgsm/sbserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/sbserver/_default.cfg @@ -122,7 +122,7 @@ servercfgdir="${serverfiles}/storage" servercfgfullpath="${servercfgdir}/${servercfg}" ## Backup Directory -backupdir="${rootdir}/backups" +backupdir="${lgsmdir}/backup" ## Logging Directories logdir="${rootdir}/log" diff --git a/lgsm/config-default/config-lgsm/sfcserver/_default.cfg b/lgsm/config-default/config-lgsm/sfcserver/_default.cfg index e4c2662b0..15318155f 100644 --- a/lgsm/config-default/config-lgsm/sfcserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/sfcserver/_default.cfg @@ -124,7 +124,7 @@ servercfgdir="${systemdir}/cfg" servercfgfullpath="${servercfgdir}/${servercfg}" ## Backup Directory -backupdir="${rootdir}/backups" +backupdir="${lgsmdir}/backup" ## Logging Directories logdir="${rootdir}/log" diff --git a/lgsm/config-default/config-lgsm/sof2server/_default.cfg b/lgsm/config-default/config-lgsm/sof2server/_default.cfg index 897be4a3e..cd3053a83 100644 --- a/lgsm/config-default/config-lgsm/sof2server/_default.cfg +++ b/lgsm/config-default/config-lgsm/sof2server/_default.cfg @@ -110,7 +110,7 @@ servercfgdir="${systemdir}" servercfgfullpath="${servercfgdir}/${servercfg}" ## Backup Directory -backupdir="${rootdir}/backups" +backupdir="${lgsmdir}/backup" ## Logging Directories logdir="${rootdir}/log" diff --git a/lgsm/config-default/config-lgsm/solserver/_default.cfg b/lgsm/config-default/config-lgsm/solserver/_default.cfg index 96e8b789e..ffd2d7db1 100644 --- a/lgsm/config-default/config-lgsm/solserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/solserver/_default.cfg @@ -110,7 +110,7 @@ servercfgdir="${systemdir}" servercfgfullpath="${servercfgdir}/${servercfg}" ## Backup Directory -backupdir="${rootdir}/backups" +backupdir="${lgsmdir}/backup" ## Logging Directories logdir="${rootdir}/log" diff --git a/lgsm/config-default/config-lgsm/ss3server/_default.cfg b/lgsm/config-default/config-lgsm/ss3server/_default.cfg index bb6f78a1b..050be2d51 100644 --- a/lgsm/config-default/config-lgsm/ss3server/_default.cfg +++ b/lgsm/config-default/config-lgsm/ss3server/_default.cfg @@ -120,7 +120,7 @@ servercfgdir="${serverfiles}/Content/SeriousSam3/Config" servercfgfullpath="${servercfgdir}/${servercfg}" ## Backup Directory -backupdir="${rootdir}/backups" +backupdir="${lgsmdir}/backup" ## Logging Directories logdir="${rootdir}/log" diff --git a/lgsm/config-default/config-lgsm/stserver/_default.cfg b/lgsm/config-default/config-lgsm/stserver/_default.cfg index 93a59f2f8..a380fb91d 100644 --- a/lgsm/config-default/config-lgsm/stserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/stserver/_default.cfg @@ -126,7 +126,7 @@ servercfgdir="${systemdir}" servercfgfullpath="${servercfgdir}/${servercfg}" ## Backup Directory -backupdir="${rootdir}/backups" +backupdir="${lgsmdir}/backup" ## Logging Directories logdir="${rootdir}/log" diff --git a/lgsm/config-default/config-lgsm/svenserver/_default.cfg b/lgsm/config-default/config-lgsm/svenserver/_default.cfg index 91912d425..a1342611c 100644 --- a/lgsm/config-default/config-lgsm/svenserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/svenserver/_default.cfg @@ -123,7 +123,7 @@ servercfgdir="${systemdir}" servercfgfullpath="${servercfgdir}/${servercfg}" ## Backup Directory -backupdir="${rootdir}/backups" +backupdir="${lgsmdir}/backup" ## Logging Directories logdir="${rootdir}/log" diff --git a/lgsm/config-default/config-lgsm/terrariaserver/_default.cfg b/lgsm/config-default/config-lgsm/terrariaserver/_default.cfg index 3dc5646f4..9a940f4d8 100644 --- a/lgsm/config-default/config-lgsm/terrariaserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/terrariaserver/_default.cfg @@ -123,7 +123,7 @@ servercfgdir="${serverfiles}" servercfgfullpath="${servercfgdir}/${servercfg}" ## Backup Directory -backupdir="${rootdir}/backups" +backupdir="${lgsmdir}/backup" ## Logging Directories logdir="${rootdir}/log" diff --git a/lgsm/config-default/config-lgsm/tf2server/_default.cfg b/lgsm/config-default/config-lgsm/tf2server/_default.cfg index 2bcade720..106cabdb1 100644 --- a/lgsm/config-default/config-lgsm/tf2server/_default.cfg +++ b/lgsm/config-default/config-lgsm/tf2server/_default.cfg @@ -129,7 +129,7 @@ servercfgdir="${systemdir}/cfg" servercfgfullpath="${servercfgdir}/${servercfg}" ## Backup Directory -backupdir="${rootdir}/backups" +backupdir="${lgsmdir}/backup" ## Logging Directories logdir="${rootdir}/log" diff --git a/lgsm/config-default/config-lgsm/tfcserver/_default.cfg b/lgsm/config-default/config-lgsm/tfcserver/_default.cfg index b34d820b7..b65c06f6d 100644 --- a/lgsm/config-default/config-lgsm/tfcserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/tfcserver/_default.cfg @@ -124,7 +124,7 @@ servercfgdir="${systemdir}" servercfgfullpath="${servercfgdir}/${servercfg}" ## Backup Directory -backupdir="${rootdir}/backups" +backupdir="${lgsmdir}/backup" ## Logging Directories logdir="${rootdir}/log" diff --git a/lgsm/config-default/config-lgsm/ts3server/_default.cfg b/lgsm/config-default/config-lgsm/ts3server/_default.cfg index 47da3e4b6..210a406c8 100644 --- a/lgsm/config-default/config-lgsm/ts3server/_default.cfg +++ b/lgsm/config-default/config-lgsm/ts3server/_default.cfg @@ -105,7 +105,7 @@ servercfgdir="${serverfiles}" servercfgfullpath="${servercfgdir}/${servercfg}" ## Backup Directory -backupdir="${rootdir}/backups" +backupdir="${lgsmdir}/backup" ## Logging Directories logdir="${rootdir}/log" diff --git a/lgsm/config-default/config-lgsm/tsserver/_default.cfg b/lgsm/config-default/config-lgsm/tsserver/_default.cfg index 3f0c63afe..75dae8d96 100644 --- a/lgsm/config-default/config-lgsm/tsserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/tsserver/_default.cfg @@ -124,7 +124,7 @@ servercfgdir="${systemdir}" servercfgfullpath="${servercfgdir}/${servercfg}" ## Backup Directory -backupdir="${rootdir}/backups" +backupdir="${lgsmdir}/backup" ## Logging Directories logdir="${rootdir}/log" diff --git a/lgsm/config-default/config-lgsm/tuserver/_default.cfg b/lgsm/config-default/config-lgsm/tuserver/_default.cfg index 6207f5c31..72f78ee05 100644 --- a/lgsm/config-default/config-lgsm/tuserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/tuserver/_default.cfg @@ -126,7 +126,7 @@ servercfgfullpath="${servercfgdir}/${servercfg}" servercfgdefault="TowerServer.ini" ## Backup Directory -backupdir="${rootdir}/backups" +backupdir="${lgsmdir}/backup" ## Logging Directories logdir="${rootdir}/log" diff --git a/lgsm/config-default/config-lgsm/twserver/_default.cfg b/lgsm/config-default/config-lgsm/twserver/_default.cfg index 56d505183..9e1fe3db9 100644 --- a/lgsm/config-default/config-lgsm/twserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/twserver/_default.cfg @@ -123,7 +123,7 @@ servercfgdir="${serverfiles}/tw" servercfgfullpath="${servercfgdir}/${servercfg}" ## Backup Directory -backupdir="${rootdir}/backups" +backupdir="${lgsmdir}/backup" ## Logging Directories logdir="${rootdir}/log" diff --git a/lgsm/config-default/config-lgsm/ut2k4server/_default.cfg b/lgsm/config-default/config-lgsm/ut2k4server/_default.cfg index 9f43be864..9481d792a 100644 --- a/lgsm/config-default/config-lgsm/ut2k4server/_default.cfg +++ b/lgsm/config-default/config-lgsm/ut2k4server/_default.cfg @@ -110,7 +110,7 @@ servercfgfullpath="${servercfgdir}/${servercfg}" compressedmapsdir="${rootdir}/Maps-Compressed" ## Backup Directory -backupdir="${rootdir}/backups" +backupdir="${lgsmdir}/backup" ## Logging Directories logdir="${rootdir}/log" diff --git a/lgsm/config-default/config-lgsm/ut3server/_default.cfg b/lgsm/config-default/config-lgsm/ut3server/_default.cfg index a1c4496bd..f2d5a1bcf 100644 --- a/lgsm/config-default/config-lgsm/ut3server/_default.cfg +++ b/lgsm/config-default/config-lgsm/ut3server/_default.cfg @@ -120,7 +120,7 @@ servercfgdir="${systemdir}/UTGame/Config/${servicename}" servercfgfullpath="${servercfgdir}/${servercfg}" ## Backup Directory -backupdir="${rootdir}/backups" +backupdir="${lgsmdir}/backup" ## Logging Directories logdir="${rootdir}/log" diff --git a/lgsm/config-default/config-lgsm/ut99server/_default.cfg b/lgsm/config-default/config-lgsm/ut99server/_default.cfg index 66d0edd41..d49740942 100644 --- a/lgsm/config-default/config-lgsm/ut99server/_default.cfg +++ b/lgsm/config-default/config-lgsm/ut99server/_default.cfg @@ -110,7 +110,7 @@ servercfgfullpath="${servercfgdir}/${servercfg}" compressedmapsdir="${rootdir}/Maps-Compressed" ## Backup Directory -backupdir="${rootdir}/backups" +backupdir="${lgsmdir}/backup" ## Logging Directories logdir="${rootdir}/log" diff --git a/lgsm/config-default/config-lgsm/utserver/_default.cfg b/lgsm/config-default/config-lgsm/utserver/_default.cfg index 9b29dd204..3cd111eb3 100644 --- a/lgsm/config-default/config-lgsm/utserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/utserver/_default.cfg @@ -112,7 +112,7 @@ servercfgdir="${systemdir}/UnrealTournament/Saved/Config/LinuxServer" servercfgfullpath="${servercfgdir}/${servercfg}" ## Backup Directory -backupdir="${rootdir}/backups" +backupdir="${lgsmdir}/backup" ## Logging Directories logdir="${rootdir}/log" diff --git a/lgsm/config-default/config-lgsm/vsserver/_default.cfg b/lgsm/config-default/config-lgsm/vsserver/_default.cfg index 31d67e6e6..94b192363 100644 --- a/lgsm/config-default/config-lgsm/vsserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/vsserver/_default.cfg @@ -124,7 +124,7 @@ servercfgdir="${systemdir}" servercfgfullpath="${servercfgdir}/${servercfg}" ## Backup Directory -backupdir="${rootdir}/backups" +backupdir="${lgsmdir}/backup" ## Logging Directories logdir="${rootdir}/log" diff --git a/lgsm/config-default/config-lgsm/wetserver/_default.cfg b/lgsm/config-default/config-lgsm/wetserver/_default.cfg index ae88991cb..1a5f66c4d 100644 --- a/lgsm/config-default/config-lgsm/wetserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/wetserver/_default.cfg @@ -105,7 +105,7 @@ servercfgdir="${systemdir}/etmain" servercfgfullpath="${servercfgdir}/${servercfg}" ## Backup Directory -backupdir="${rootdir}/backups" +backupdir="${lgsmdir}/backup" ## Logging Directories logdir="${rootdir}/log" diff --git a/lgsm/config-default/config-lgsm/wurmserver/_default.cfg b/lgsm/config-default/config-lgsm/wurmserver/_default.cfg index 1263771cc..9db80aafb 100644 --- a/lgsm/config-default/config-lgsm/wurmserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/wurmserver/_default.cfg @@ -115,7 +115,7 @@ servercfgdir="${systemdir}" servercfgfullpath="${servercfgdir}/${servercfg}" ## Backup Directory -backupdir="${rootdir}/backups" +backupdir="${lgsmdir}/backup" ## Logging Directories logdir="${rootdir}/log" diff --git a/lgsm/config-default/config-lgsm/zmrserver/_default.cfg b/lgsm/config-default/config-lgsm/zmrserver/_default.cfg index 6eb3bbb5e..d51752fec 100644 --- a/lgsm/config-default/config-lgsm/zmrserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/zmrserver/_default.cfg @@ -124,7 +124,7 @@ servercfgdir="${systemdir}/cfg" servercfgfullpath="${servercfgdir}/${servercfg}" ## Backup Directory -backupdir="${rootdir}/backups" +backupdir="${lgsmdir}/backup" ## Logging Directories logdir="${rootdir}/log" diff --git a/lgsm/config-default/config-lgsm/zpsserver/_default.cfg b/lgsm/config-default/config-lgsm/zpsserver/_default.cfg index e9acd034e..36e8373f3 100644 --- a/lgsm/config-default/config-lgsm/zpsserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/zpsserver/_default.cfg @@ -129,7 +129,7 @@ servercfgdir="${systemdir}/cfg" servercfgfullpath="${servercfgdir}/${servercfg}" ## Backup Directory -backupdir="${rootdir}/backups" +backupdir="${lgsmdir}/backup" ## Logging Directories logdir="${rootdir}/log" diff --git a/lgsm/functions/command_backup.sh b/lgsm/functions/command_backup.sh index 1fb43cea2..3a758886c 100644 --- a/lgsm/functions/command_backup.sh +++ b/lgsm/functions/command_backup.sh @@ -89,6 +89,31 @@ fn_backup_dir(){ fi } +# Migrate Backups from old dir before refactor +fn_backup_migrate_olddir(){ + # Check if old backup dir is there before the refactor and move the backups + if [ -d "${rootdir}/backups" ]; then + if [ "${rootdir}/backups" != "${backupdir}" ]; then + fn_print_dots "Backup directory is being migrated" + fn_script_log_info "Backup directory is being migrated" + fn_script_log_info "${rootdir}/backups > ${backupdir}" + mv "${rootdir}/backups/"* "${backupdir}" 2>/dev/null + exitcode=$? + if [ "${exitcode}" -eq 0 ]; then + rmdir "${rootdir}/backups" 2>/dev/null + exitcode=$? + fi + if [ "${exitcode}" -eq 0 ]; then + fn_print_ok_nl "Backup directory is being migrated" + fn_script_log_pass "Backup directory is being migrated" + else + fn_print_error_nl "Backup directory is being migrated" + fn_script_log_error "Backup directory is being migrated" + fi + fi + fi +} + fn_backup_create_lockfile(){ # Create lockfile. date '+%s' > "${tmpdir}/.backup.lock" @@ -105,7 +130,7 @@ fn_backup_compression(){ fn_script_log_info "A total of ${rootdirduexbackup} will be compressed: ${backupdir}/${backupname}.tar.gz" fn_print_dots "Backup (${rootdirduexbackup}) ${backupname}.tar.gz, in progress..." fn_script_log_info "backup ${rootdirduexbackup} ${backupname}.tar.gz, in progress" - excludedir=$(fn_backup_relpath) + excludedir=$(fn_backup_relpath) # Check that excludedir is a valid path. if [ ! -d "${excludedir}" ] ; then @@ -176,10 +201,10 @@ fn_backup_prune(){ } fn_backup_relpath() { - # Written by CedarLUG as a "realpath --relative-to" alternative in bash. + # Written by CedarLUG as a "realpath --relative-to" alternative in bash. # Populate an array of tokens initialized from the rootdir components. - declare -a rdirtoks=($(readlink -f "${rootdir}" | sed "s/\// /g")) + declare -a rdirtoks=($(readlink -f "${rootdir}" | sed "s/\// /g")) if [ ${#rdirtoks[@]} -eq 0 ]; then fn_print_fail_nl "Problem assessing rootdir during relative path assessment" @@ -188,7 +213,7 @@ fn_backup_relpath() { fi # Populate an array of tokens initialized from the backupdir components. - declare -a bdirtoks=($(readlink -f "${backupdir}" | sed "s/\// /g")) + declare -a bdirtoks=($(readlink -f "${backupdir}" | sed "s/\// /g")) if [ ${#bdirtoks[@]} -eq 0 ]; then fn_print_fail_nl "Problem assessing backupdir during relative path assessment" fn_script_log_fatal "Problem assessing backupdir during relative path assessment: ${rootdir}" @@ -197,31 +222,31 @@ fn_backup_relpath() { # Compare the leading entries of each array. These common elements will be clipped off. # for the relative path output. - for ((base=0; base<${#rdirtoks[@]}; base++)) - do - [[ "${rdirtoks[$base]}" != "${bdirtoks[$base]}" ]] && break - done + for ((base=0; base<${#rdirtoks[@]}; base++)) + do + [[ "${rdirtoks[$base]}" != "${bdirtoks[$base]}" ]] && break + done # Next, climb out of the remaining rootdir location with updir references. - for ((x=base;x<${#rdirtoks[@]};x++)) - do - echo -n "../" - done + for ((x=base;x<${#rdirtoks[@]};x++)) + do + echo -n "../" + done # Climb down the remaining components of the backupdir location. - for ((x=base;x<$(( ${#bdirtoks[@]} - 1 ));x++)) - do - echo -n "${bdirtoks[$x]}/" - done + for ((x=base;x<$(( ${#bdirtoks[@]} - 1 ));x++)) + do + echo -n "${bdirtoks[$x]}/" + done # In the event there were no directories left in the backupdir above to # traverse down, just add a newline. Otherwise at this point, there is # one remaining directory component in the backupdir to navigate. - if (( "$base" < "${#bdirtoks[@]}" )) ; then - echo "${bdirtoks[ $(( ${#bdirtoks[@]} - 1)) ]}" - else - echo - fi + if (( "$base" < "${#bdirtoks[@]}" )) ; then + echo "${bdirtoks[ $(( ${#bdirtoks[@]} - 1)) ]}" + else + echo + fi } # Restart the server if it was stopped for the backup. @@ -238,6 +263,7 @@ fn_backup_create_lockfile fn_backup_init fn_backup_stop_server fn_backup_dir +fn_backup_migrate_olddir fn_backup_compression fn_backup_prune fn_backup_start_server From e85446909f94c7df5ba33e87bcb5bcb691f3582f Mon Sep 17 00:00:00 2001 From: DavidRayner Date: Tue, 27 Aug 2019 15:45:47 +0100 Subject: [PATCH 151/534] Battalion 1944: update start parameters (#2467) Co-authored-by: David Rayner * bt1944: BombGameMode to WartideGameMode fn_parms * bt1944: ${ip} to ${extip} fn_parms --- lgsm/config-default/config-lgsm/bt1944server/_default.cfg | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lgsm/config-default/config-lgsm/bt1944server/_default.cfg b/lgsm/config-default/config-lgsm/bt1944server/_default.cfg index 2176236c5..fec39515d 100644 --- a/lgsm/config-default/config-lgsm/bt1944server/_default.cfg +++ b/lgsm/config-default/config-lgsm/bt1944server/_default.cfg @@ -15,7 +15,7 @@ queryport="7780" ## Server Start Command | https://docs.linuxgsm.com/configuration/start-parameters#additional-parameters fn_parms(){ -parms="/Game/Maps/Final_Maps/Derailed?Game=/Script/ShooterGame.BombGameMode?listen -log -broadcastip=\"${ip}\" -PORT=${port} -QueryPort=${queryport} -defgameini=\"${servercfgfullpath}\"" +parms="/Game/Maps/Final_Maps/Derailed?Game=/Script/ShooterGame.WartideGameMode?listen -log -broadcastip=\"${extip}\" -PORT=${port} -QueryPort=${queryport} -defgameini=\"${servercfgfullpath}\"" } #### LinuxGSM Settings #### From 81c9e5184687ccaa4784f97e20d3796fcc92b524 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Tue, 27 Aug 2019 16:01:54 +0100 Subject: [PATCH 152/534] fix(details): master server will now only show if set to true (#2488) --- lgsm/functions/command_debug.sh | 8 ++++---- lgsm/functions/info_distro.sh | 4 ++-- lgsm/functions/info_messages.sh | 8 ++++---- 3 files changed, 10 insertions(+), 10 deletions(-) diff --git a/lgsm/functions/command_debug.sh b/lgsm/functions/command_debug.sh index 2949dedab..b06f05263 100644 --- a/lgsm/functions/command_debug.sh +++ b/lgsm/functions/command_debug.sh @@ -62,11 +62,11 @@ if [ -n "${extip}" ]; then fi fi # Listed on Master Server. -if [ "${masterserver}" ];then - if [ "${masterserver}" == "true" ];then - echo -e "${blue}Master Server:\t${green}${masterserver}${default}" +if [ "${displaymasterserver}" ];then + if [ "${displaymasterserver}" == "true" ];then + echo -e "${blue}Master Server:\t${green}${displaymasterserver}${default}" else - echo -e "${blue}Master Server:\t${red}${masterserver}${default}" + echo -e "${blue}Master Server:\t${red}${displaymasterserver}${default}" fi fi # Server password. diff --git a/lgsm/functions/info_distro.sh b/lgsm/functions/info_distro.sh index 17faeb50a..3b7b6b951 100644 --- a/lgsm/functions/info_distro.sh +++ b/lgsm/functions/info_distro.sh @@ -240,9 +240,9 @@ if [ "$(command -v jq 2>/dev/null)" ]; then masterserver=$(${curlpath} -m 3 -s 'https://api.steampowered.com/ISteamApps/GetServersAtAddress/v0001?addr='${extip}':'${port}'&format=json' | jq '.response.servers[]|.addr' | wc -l) fi if [ "${masterserver}" == "0" ]; then - masterserver="false" + displaymasterserver="false" else - masterserver="true" + displaymasterserver="true" fi fi fi diff --git a/lgsm/functions/info_messages.sh b/lgsm/functions/info_messages.sh index b7cb76704..1e58ae3ac 100644 --- a/lgsm/functions/info_messages.sh +++ b/lgsm/functions/info_messages.sh @@ -329,11 +329,11 @@ fn_info_message_gameserver(){ fi # Listed on Master Server - if [ "${masterserver}" ];then - if [ "${masterserver}" == "true" ];then - echo -e "${blue}Master Server:\t${green}${masterserver}${default}" + if [ "${displaymasterserver}" ];then + if [ "${displaymasterserver}" == "true" ];then + echo -e "${blue}Master Server:\t${green}${displaymasterserver}${default}" else - echo -e "${blue}Master Server:\t${red}${masterserver}${default}" + echo -e "${blue}Master Server:\t${red}${displaymasterserver}${default}" fi fi From 3d43c4ce5762528d8ac98dd9504a5fd82083f643 Mon Sep 17 00:00:00 2001 From: Bourne-ID Date: Wed, 28 Aug 2019 22:38:53 +0100 Subject: [PATCH 153/534] fix(mtaserver): auto-install no longer waits at a prompt (#2418) --- lgsm/functions/command_install_resources_mta.sh | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/lgsm/functions/command_install_resources_mta.sh b/lgsm/functions/command_install_resources_mta.sh index 7e7c4bb10..85fe20197 100644 --- a/lgsm/functions/command_install_resources_mta.sh +++ b/lgsm/functions/command_install_resources_mta.sh @@ -19,7 +19,12 @@ fn_install_resources(){ fn_print_header -fn_print_warning_nl "Installing the default resources with existing resources may cause issues." -if fn_prompt_yn "Do you want to install MTA default resources?" Y; then - fn_install_resources +if [ -z "${autoinstall}" ]; then + fn_print_warning_nl "Installing the default resources with existing resources may cause issues." + if fn_prompt_yn "Do you want to install MTA default resources?" Y; then + fn_install_resources + fi +else + fn_print_warning_nl "Default resources are not installed when using ./${selfname} auto-install." + fn_print_information_nl "To install default resources use ./${selfname} install" fi From 0e6a92655290d008461810e558d1dff5a6d5ec32 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Wed, 28 Aug 2019 22:42:35 +0100 Subject: [PATCH 154/534] feat(template): co-authored-by no longer required. co-authored-by details are not longer required as it is auto detected now. --- .github/pull_request_template.md | 15 --------------- 1 file changed, 15 deletions(-) diff --git a/.github/pull_request_template.md b/.github/pull_request_template.md index 8c40ff457..a04f0dc68 100644 --- a/.github/pull_request_template.md +++ b/.github/pull_request_template.md @@ -19,26 +19,11 @@ PR will not be merged until all steps are complete. * [ ] This pull request links to an issue. * [ ] This pull request uses the `develop` branch as its base. * [ ] This code follows the style guidelines of this project. -* [ ] I have provided Co-author details below. * [ ] I have performed a self-review of my own code. * [ ] I have checked that this code is commented where required. * [ ] I have provided a detailed enough description of this PR. * [ ] I have checked If documentation needs updating. -## Provide Github Email - -Fill out below info or tick box below: -``` -Co-authored-by: John Doe -``` - -- [ ] I do not wish to provide an email. I am aware this will hide me as the author of this commit. - -All pull requests will now be squashed to create a tidy commit history and simplify changelog creation. You can provide either your own email or a GitHub-provided no-reply email. - -When a PR is squashed the author becomes the person who squashed the PR. This removes you as the author of your own PR. -The only workaround for this is to add your details as a co-author. More info about co-authors can be found [here](https://help.github.com/en/articles/creating-a-commit-with-multiple-authors). - ## Documentation If documentation does need updating either update it by creating a PR (preferred) or request a documentation update. From c3521ba749daae1fc9ecaa3290dc22e6b7ca2d3e Mon Sep 17 00:00:00 2001 From: Sean Date: Wed, 28 Aug 2019 14:43:59 -0700 Subject: [PATCH 155/534] feat(postdetails): add postdetails support for https://termbin.com (#2485) --- lgsm/functions/command_postdetails.sh | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/lgsm/functions/command_postdetails.sh b/lgsm/functions/command_postdetails.sh index e0967117f..817d8d6c0 100644 --- a/lgsm/functions/command_postdetails.sh +++ b/lgsm/functions/command_postdetails.sh @@ -105,6 +105,12 @@ elif [ "${posttarget}" == "https://hastebin.com" ] ; then fn_print_ok_nl "Posting details to hastebin.com for ${postexpire}" pdurl="${posttarget}/${link}" echo " Please share the following url for support: ${pdurl}" +elif [ "${posttarget}" == "https://termbin.com" ] ; then + fn_print_dots "Posting details to termbin.com" + link=$(cat "${postdetailslog}" | nc termbin.com 9999 | tr -d '\n\0') + fn_print_ok_nl "Posting details to termbin.com" + pdurl="${link}" + echo " Please share the following url for support: ${pdurl}" else fn_print_warn_nl "Review output in: ${postdetailslog}" core_exit.sh From 1d41bc66d31deb70f133565b168d70187d72bf47 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Fri, 30 Aug 2019 09:56:15 +0100 Subject: [PATCH 156/534] feat(refactor): general refactor of if statements (#2492) * Codacy recommendation fixes --- .gitattributes | 2 +- .github/ISSUE_TEMPLATE/new-server-request.md | 2 +- .github/potential-duplicates.yml | 2 +- .github/request-info.yml | 4 +- .github/topissuebot.yml | 2 +- .github/welcome.yml | 2 +- .github/write-good.yml | 2 +- .gitignore | 2 +- CONTRIBUTING.md | 2 +- LICENSE | 1 - README.md | 26 +-- lgsm/functions/alert_email.sh | 2 +- lgsm/functions/check_deps.sh | 2 +- lgsm/functions/check_permissions.sh | 6 +- lgsm/functions/check_system_dir.sh | 1 - lgsm/functions/command_dev_clear_functions.sh | 2 +- lgsm/functions/command_donate.sh | 2 +- lgsm/functions/command_fastdl.sh | 6 +- lgsm/functions/command_monitor.sh | 4 +- lgsm/functions/command_restart.sh | 2 +- lgsm/functions/command_start.sh | 6 +- lgsm/functions/command_update_functions.sh | 2 +- lgsm/functions/core_dl.sh | 4 +- lgsm/functions/core_trap.sh | 2 +- lgsm/functions/fix_ark.sh | 2 +- lgsm/functions/fix_arma3.sh | 2 +- lgsm/functions/fix_ges.sh | 2 +- lgsm/functions/fix_kf.sh | 2 +- lgsm/functions/fix_rw.sh | 2 +- lgsm/functions/fix_sdtd.sh | 2 +- lgsm/functions/fix_ut.sh | 2 +- lgsm/functions/fix_ut2k4.sh | 2 +- lgsm/functions/info_distro.sh | 4 +- lgsm/functions/info_messages.sh | 68 +++---- lgsm/functions/install_config.sh | 192 ++++++++---------- lgsm/functions/install_server_dir.sh | 2 +- lgsm/functions/install_server_files.sh | 2 +- lgsm/functions/install_squad_license.sh | 2 +- lgsm/functions/logs.sh | 4 +- lgsm/functions/mods_core.sh | 2 +- lgsm/functions/query_gamedig.sh | 2 +- linuxgsm.sh | 2 +- tests/tests_fctrserver.sh | 2 +- tests/tests_jc2server.sh | 2 +- tests/tests_mcserver.sh | 2 +- tests/tests_ts3server.sh | 2 +- 46 files changed, 189 insertions(+), 203 deletions(-) diff --git a/.gitattributes b/.gitattributes index 802343b27..bbe6490d1 100644 --- a/.gitattributes +++ b/.gitattributes @@ -19,4 +19,4 @@ *.pdf diff=astextplain *.PDF diff=astextplain *.rtf diff=astextplain -*.RTF diff=astextplain \ No newline at end of file +*.RTF diff=astextplain diff --git a/.github/ISSUE_TEMPLATE/new-server-request.md b/.github/ISSUE_TEMPLATE/new-server-request.md index d27b3b497..adb1f5f4f 100644 --- a/.github/ISSUE_TEMPLATE/new-server-request.md +++ b/.github/ISSUE_TEMPLATE/new-server-request.md @@ -26,4 +26,4 @@ If yes Use SteamDB to get the appid. (https://steamdb.info). We only support Linux servers and do not support Wine. * [ ] Yes -* [ ] No \ No newline at end of file +* [ ] No diff --git a/.github/potential-duplicates.yml b/.github/potential-duplicates.yml index 9c973de06..3ca5a7cb8 100644 --- a/.github/potential-duplicates.yml +++ b/.github/potential-duplicates.yml @@ -10,4 +10,4 @@ referenceComment: > Potential duplicates: {{#issues}} - [#{{ number }}] {{ title }} ({{ accuracy }}%) - {{/issues}} \ No newline at end of file + {{/issues}} diff --git a/.github/request-info.yml b/.github/request-info.yml index 1b354d9f7..ed407c3b5 100644 --- a/.github/request-info.yml +++ b/.github/request-info.yml @@ -3,7 +3,7 @@ # *Required* Comment to reply with requestInfoReplyComment: > ![More Data required](https://i.imgur.com/yS9cecv.png) - More data is required to assist with this issue + More data is required to assist with this issue or issue template was not used correctly. https://linuxgsm.com/support/#guide @@ -14,4 +14,4 @@ requestInfoReplyComment: > # - updates # *OPTIONAL* Label to be added to Issues and Pull Requests with insufficient information given -requestInfoLabelToAdd: "needs more info" \ No newline at end of file +requestInfoLabelToAdd: "needs more info" diff --git a/.github/topissuebot.yml b/.github/topissuebot.yml index b02540a2d..06c64ae01 100644 --- a/.github/topissuebot.yml +++ b/.github/topissuebot.yml @@ -1,4 +1,4 @@ # Configuration for top-issue-bot labelName: ":thumbsup: Top Issue!" labelColor: "f442c2" -numberOfIssuesToLabel: 5 \ No newline at end of file +numberOfIssuesToLabel: 5 diff --git a/.github/welcome.yml b/.github/welcome.yml index 7a120a2fa..7d0cb281b 100644 --- a/.github/welcome.yml +++ b/.github/welcome.yml @@ -18,4 +18,4 @@ newPRWelcomeComment: > firstPRMergeComment: > Congratulations on merging your first pull request! Thank you for supporting LinuxGSM! -# It is recommend to include as many gifs and emojis as possible \ No newline at end of file +# It is recommend to include as many gifs and emojis as possible diff --git a/.github/write-good.yml b/.github/write-good.yml index 2bdb512ad..00eefa99c 100644 --- a/.github/write-good.yml +++ b/.github/write-good.yml @@ -1,4 +1,4 @@ # .github/write-good.yml writeGood: true alex: true -spellchecker: true \ No newline at end of file +spellchecker: true diff --git a/.gitignore b/.gitignore index 2b0bcabc1..12218bea3 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,2 @@ *.db -.idea \ No newline at end of file +.idea diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 764f21e19..33650771e 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -33,4 +33,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-and-Conventions) \ No newline at end of file +[Syntax & Coding Conventions](https://github.com/GameServerManagers/LinuxGSM/wiki/Syntax-and-Conventions) diff --git a/LICENSE b/LICENSE index 9bcd64251..950cea23a 100644 --- a/LICENSE +++ b/LICENSE @@ -19,4 +19,3 @@ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - diff --git a/README.md b/README.md index a028258e8..73d811da3 100644 --- a/README.md +++ b/README.md @@ -2,10 +2,10 @@
LinuxGSM

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

- + [![LinuxGSM](https://img.shields.io/badge/-LinuxGSM-2b2b2b.svg?logo=data%3Aimage%2Fpng%3Bbase64%2CiVBORw0KGgoAAAANSUhEUgAAACsAAABACAYAAACDbo5ZAAAGD0lEQVR4AcWYa2wUVRvHz75c2vJ2disXoUBEVIioRAx%2BMIFA1IRwUS6KCCiIKBrvhEYiiGm5iBgk8QOGEgUUDYTttmVZWFr2UmwURS6iYAoCtmisElSsdHdbkT7%2BTzoNy%2BGc2dm54C%2F5Rdkz85x%2FZ86ZOXOYXYhIg3Phx%2FA4PAcv6f%2Btg5vhHJjP3EcZsgsshufJHH%2FAJbDztQ7aG35J1vgCXn%2BtgvrgEbLHYei9FmE3kDOUuh10OGwjZ7gEh7kZ9gNyllK3gnrg7%2BQs56DHjbCDyB0GuRF2ArnDeDfCziF3mO1G2FfJHRa4EXYpuUOxG2GXkzuUuBH2TXKH5W6ELSV3eM%2BNsOUk5yQcAY8p2uvgSPitor3MjbB1UOQXOFBvHwpbhPYWOExvL4SNUOQ7p4P2JTlzhOPmCu0vCu1PQpE2WOhk2MdJjk9y7HNwP1wEPUJbAcmZ6WTYrYolnifbxZBiibnFySHQCkUaLdY7C0V4%2FT5OhF1JcuIW6%2B0lOcvsBi2Ezao3j8Ov7Quwj52w60jNKIs1R5GatVaDDoEXSU4D7GSxbidYT3IuwjusFK0mNUVMwaZNNbl%2B%2F87hoVCom0HthaQmnG3QB0lNPcxlCvz%2B0GtlZTuorCxYYlA%2FDzbY%2FnrAgV3hCVLzCDMgEAi9wMMi9IIM%2FUwnNXWwi5mwRaSmmmXA798xq%2F3Khp420VeE1LyS6eQeBhttSXgzywCCToIUCOyYZvKLOWWwkdfd6ORVpGYJM0F5efDe9mEQHGty2BWTmhVGO4PNBmOoKzMBxmo%2FhD25dWvljSbD5hjMkb9gT9lJq63Mzi1bKkbjloc7xBWtwiRrDASCVRi%2FRxA8if%2BvrawMTzYI%2FACpeUv2KFFtDcUyTKilCHcis8G1Ga7wHpLzG8wVFs1K7jaeUKHZfIxmkj9%2FM4S9x9RGiMEudo0QbCVu9Xqn5PWEwLUk5%2FP0iaXac53I0kAH9Sau4m54lo%2FdTMfyekLYKQZ7ub34AbMMlmw5irC2VYTN0fuVMYMf8JHxJ7L7YYXAlSRnI2%2F8RtH4siTsDMz%2BZ5yS15OEXUxyDjGD1%2BvEq8MG16CDzY6JepKwT6geYbzxb0XjGMl7vwGSgzZIwo4nOa1M8Yr9Afb%2Fj8L21%2FsXaeaNZ2A6KTiEASph%2F0vF80cn4tokqu79fzfCUk2vfF4%2FFdFGEjGPHvg2yWrsDG%2F4%2BqpZB8jPOiXjWk0y5iXdM3XhKUvxBTA9UvHuvNPh%2Bzb%2BWj10z6nwuHWBbQFMvNCjKnn7qd1jS%2Fnx9VX3b6jC%2BbwOr5eMe3%2B83IcW4%2F3qgT%2BUTbA9srGaiHsn8AKiF6Ld%2FxF%2FOx6eeAJXabvK78MTTornNMd6XJTVR7%2Fj9bBjhFxV%2FMc1kJOAy2AeA%2FgrV4mFVDZFCqm8rEJ6qysCAWqK9iaztRJRbWXa4moFTELOav7jY%2FqAvoXp0Gc9NX7bIZl17%2FZl0rC1wRLeno0NvP%2B0CTcYNnS8wW6CtzNANaxzKqo9hRNOQ8rGo7tmSsMe2zWdt2frqVRcm5s2fofCgawDNHRNxnyfqgsYez4y4ADCjRM9H73hsNWafILTQdaFiSTj%2BQ%2FxA6yH7d%2BCmR8XbYr0a7VTF2N4siSsb5qdos3R6%2FjGxpULFfw7EfORnbrI9TAToX0sD40%2F2ylcGdh2Rdhg%2BSf2gka9jRTqK9%2BGwgHz7RTfVbHxirDhivdthYUvMRX8aYAD9lstvi%2B0aDL2DUZ0eCBUNNVG0IP65FLTWqPdiqdC0koHTVXe7iyNRG23QotBEy1RbTAzQyrmnYUT2rLsoA13JpcB4eVC2daBM1g2JGLekmwf5On7EJfngfZTNnVSce8bFjaTmQdvs%2FXmO%2FJVpoXdx3RSUe9O00Fj3nUdy0RLgRHiHXOPGW1h2uKZ07c9rG%2Bxyefp23pQeyBIEQoavYlakrG8fnrY5yHn2fbxXzAgw7m8bT5zkkSk4C7cpmOK21esB%2FXAQ5DzFfTo43%2BF%2FDzf0eZ4wZ3MDSjMcvD6nIeOahGgia%2FyU3HforTPkWkwnakdn0cI9jqfbPjD%2FuQLJr6644snlgX%2FApOMoyd1R5%2FxAAAAAElFTkSuQmCC)](https://linuxgsm.com) [![Build Status](https://travis-ci.com/GameServerManagers/LinuxGSM.svg?branch=master)](https://travis-ci.com/GameServerManagers/LinuxGSM) [![Codacy Badge](https://api.codacy.com/project/badge/Grade/3e98be27840043a090c3ab6e35db44b0)](https://app.codacy.com/app/GameServerManagers/LinuxGSM?utm_source=github.com&utm_medium=referral&utm_content=GameServerManagers/LinuxGSM&utm_campaign=Badge_Grade_Dashboard) [![Discord](https://discordapp.com/api/guilds/127498813903601664/widget.png?style=shield)](https://linuxgsm.com/discord) [![MIT Licence](https://badges.frapsoft.com/os/mit/mit.svg?v=103)](https://github.com/GameServerManagers/LinuxGSM/blob/master/LICENSE) [![made-with-bash](https://img.shields.io/badge/-Made%20with%20Bash-1f425f.svg?logo=image%2Fpng%3Bbase64%2CiVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyZpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw%2FeHBhY2tldCBiZWdpbj0i77u%2FIiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8%2BIDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNi1jMTExIDc5LjE1ODMyNSwgMjAxNS8wOS8xMC0wMToxMDoyMCAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENDIDIwMTUgKFdpbmRvd3MpIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOkE3MDg2QTAyQUZCMzExRTVBMkQxRDMzMkJDMUQ4RDk3IiB4bXBNTTpEb2N1bWVudElEPSJ4bXAuZGlkOkE3MDg2QTAzQUZCMzExRTVBMkQxRDMzMkJDMUQ4RDk3Ij4gPHhtcE1NOkRlcml2ZWRGcm9tIHN0UmVmOmluc3RhbmNlSUQ9InhtcC5paWQ6QTcwODZBMDBBRkIzMTFFNUEyRDFEMzMyQkMxRDhEOTciIHN0UmVmOmRvY3VtZW50SUQ9InhtcC5kaWQ6QTcwODZBMDFBRkIzMTFFNUEyRDFEMzMyQkMxRDhEOTciLz4gPC9yZGY6RGVzY3JpcHRpb24%2BIDwvcmRmOlJERj4gPC94OnhtcG1ldGE%2BIDw%2FeHBhY2tldCBlbmQ9InIiPz6lm45hAAADkklEQVR42qyVa0yTVxzGn7d9Wy03MS2ii8s%2BeokYNQSVhCzOjXZOFNF4jx%2BMRmPUMEUEqVG36jo2thizLSQSMd4N8ZoQ8RKjJtooaCpK6ZoCtRXKpRempbTv5ey83bhkAUphz8fznvP8znn%2B%2F3NeEEJgNBoRRSmz0ub%2FfuxEacBg%2FDmYtiCjgo5NG2mBXq%2BH5I1ogMRk9Zbd%2BQU2e1ML6VPLOyf5tvBQ8yT1lG10imxsABm7SLs898GTpyYynEzP60hO3trHDKvMigUwdeaceacqzp7nOI4n0SSIIjl36ao4Z356OV07fSQAk6xJ3XGg%2BLCr1d1OYlVHp4eUHPnerU79ZA%2F1kuv1JQMAg%2BE4O2P23EumF3VkvHprsZKMzKwbRUXFEyTvSIEmTVbrysp%2BWr8wfQHGK6WChVa3bKUmdWou%2BjpArdGkzZ41c1zG%2Fu5uGH4swzd561F%2BuhIT4%2BLnSuPsv9%2BJKIpjNr9dXYOyk7%2FBZrcjIT4eCnoKgedJP4BEqhG77E3NKP31FO7cfQA5K0dSYuLgz2TwCWJSOBzG6crzKK%2BohNfni%2Bx6OMUMMNe%2Fgf7ocbw0v0acKg6J8Ql0q%2BT%2FAXR5PNi5dz9c71upuQqCKFAD%2BYhrZLEAmpodaHO3Qy6TI3NhBpbrshGtOWKOSMYwYGQM8nJzoFJNxP2HjyIQho4PewK6hBktoDcUwtIln4PjOWzflQ%2Be5yl0yCCYgYikTclGlxadio%2BBQCSiW1UXoVGrKYwH4RgMrjU1HAB4vR6LzWYfFUCKxfS8Ftk5qxHoCUQAUkRJaSEokkV6Y%2F%2BJUOC4hn6A39NVXVBYeNP8piH6HeA4fPbpdBQV5KOx0QaL1YppX3Jgk0TwH2Vg6S3u%2BdB91%2B%2FpuNYPYFl5uP5V7ZqvsrX7jxqMXR6ff3gCQSTzFI0a1TX3wIs8ul%2Bq4HuWAAiM39vhOuR1O1fQ2gT%2F26Z8Z5vrl2OHi9OXZn995nLV9aFfS6UC9JeJPfuK0NBohWpCHMSAAsFe74WWP%2BvT25wtP9Bpob6uGqqyDnOtaeumjRu%2ByFu36VntK%2FPA5umTJeUtPWZSU9BCgud661odVp3DZtkc7AnYR33RRC708PrVi1larW7XwZIjLnd7R6SgSqWSNjU1B3F72pz5TZbXmX5vV81Yb7Lg7XT%2FUXriu8XLVqw6c6XqWnBKiiYU%2BMt3wWF7u7i91XlSEITwSAZ%2FCzAAHsJVbwXYFFEAAAAASUVORK5CYII%3D)](https://www.gnu.org/software/bash/) [![All Contributors](https://img.shields.io/badge/all_contributors-9-orange.svg?style=flat-square)](#contributors) - -[LinuxGSM](https://linuxgsm.com) is the command line tool for quick, simple deployment and management of dedicated game servers. + +[LinuxGSM](https://linuxgsm.com) is the command line tool for quick, simple deployment and management of dedicated game servers. ## Hassle-Free Dedicated Game Servers @@ -15,22 +15,22 @@ Traditionally game servers are not easy to manage yourself. Admins often have to 80+ game servers supported -* :truck: Installer -* :mag: Monitor -* :phone: Alerts -* :cloud: Updater -* :blue_book: Server Details -* :floppy_disk: Backup +* :truck: Installer +* :mag: Monitor +* :phone: Alerts +* :cloud: Updater +* :blue_book: Server Details +* :floppy_disk: Backup * :computer: Console -## :penguin: Compatibility +## :penguin: Compatibility Linux Game Server Managers are tested to work on the following Linux distros. * Debian based (Ubuntu, Mint etc.) * Red Hat based (CentOS, Fedora etc.) -Other distros are likely to work but are not fully tested. +Other distros are likely to work but are not fully tested. ## :wrench: Requirements @@ -41,7 +41,7 @@ Each game server has its own specific dependency requirements, but most require ## :blue_book: Documentation -Documentation is found at [linuxgsm.com](https://linuxgsm.com) and [docs.linuxgsm.com](https://docs.linuxgsm.com) +Documentation is found at [linuxgsm.com](https://linuxgsm.com) and [docs.linuxgsm.com](https://docs.linuxgsm.com) ## :question: Support @@ -61,4 +61,4 @@ Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/d -This project follows the [all-contributors](https://github.com/all-contributors/all-contributors) specification. Contributions of any kind welcome! \ No newline at end of file +This project follows the [all-contributors](https://github.com/all-contributors/all-contributors) specification. Contributions of any kind welcome! diff --git a/lgsm/functions/alert_email.sh b/lgsm/functions/alert_email.sh index f1ceb73e5..1517261fc 100644 --- a/lgsm/functions/alert_email.sh +++ b/lgsm/functions/alert_email.sh @@ -23,4 +23,4 @@ if [ "${exitcode}" == "0" ]; then else fn_print_fail_nl "Sending Email alert: ${email}" fn_script_log_fatal "Sending Email alert: ${email}" -fi \ No newline at end of file +fi diff --git a/lgsm/functions/check_deps.sh b/lgsm/functions/check_deps.sh index 0f6a0f863..61e1df2f9 100644 --- a/lgsm/functions/check_deps.sh +++ b/lgsm/functions/check_deps.sh @@ -120,7 +120,7 @@ fn_install_universe_repo(){ sleep 1 echo -en " \r" cmd="sudo apt-add-repository universe" - eval ${cmd} + eval "${cmd}" if [ $? -eq 0 ]; then fn_print_complete_nl "Installing universe repository completed." fn_script_log_pass "Installing universe repository completed." diff --git a/lgsm/functions/check_permissions.sh b/lgsm/functions/check_permissions.sh index 7108b16c1..aa7bb3de2 100644 --- a/lgsm/functions/check_permissions.sh +++ b/lgsm/functions/check_permissions.sh @@ -9,17 +9,17 @@ local commandname="CHECK" fn_check_ownership(){ if [ -f "${rootdir}/${selfname}" ]; then - if [ "$(find "${rootdir}/${selfname}" -not -user $(whoami) | wc -l)" -ne "0" ]; then + if [ "$(find "${rootdir}/${selfname}" -not -user "$(whoami)" | wc -l)" -ne "0" ]; then selfownissue=1 fi fi if [ -d "${functionsdir}" ]; then - if [ "$(find "${functionsdir}" -not -user $(whoami) | wc -l)" -ne "0" ]; then + if [ "$(find "${functionsdir}" -not -user "$(whoami)" | wc -l)" -ne "0" ]; then funcownissue=1 fi fi if [ -d "${serverfiles}" ]; then - if [ "$(find "${serverfiles}" -not -user $(whoami) | wc -l)" -ne "0" ]; then + if [ "$(find "${serverfiles}" -not -user "$(whoami)" | wc -l)" -ne "0" ]; then filesownissue=1 fi fi diff --git a/lgsm/functions/check_system_dir.sh b/lgsm/functions/check_system_dir.sh index 0a10b15ac..fd9ff3644 100644 --- a/lgsm/functions/check_system_dir.sh +++ b/lgsm/functions/check_system_dir.sh @@ -20,4 +20,3 @@ if [ ! -d "${checkdir}" ]; then fi core_exit.sh fi - diff --git a/lgsm/functions/command_dev_clear_functions.sh b/lgsm/functions/command_dev_clear_functions.sh index bf026ced5..5c698f05f 100644 --- a/lgsm/functions/command_dev_clear_functions.sh +++ b/lgsm/functions/command_dev_clear_functions.sh @@ -12,4 +12,4 @@ if fn_prompt_yn "Do you want to delete all functions?" Y; then rm -rfv "${functionsdir:?}/"* rm -rfv "${configdirdefault:?}/"* fi -core_exit.sh \ No newline at end of file +core_exit.sh diff --git a/lgsm/functions/command_donate.sh b/lgsm/functions/command_donate.sh index a277b87b6..0cb3a0aee 100644 --- a/lgsm/functions/command_donate.sh +++ b/lgsm/functions/command_donate.sh @@ -15,4 +15,4 @@ echo -e "* ${blue}Patreon:${default} https://linuxgsm.com/patreon" echo -e "* ${blue}PayPal:${default} https://linuxgsm.com/paypal" echo -e "* ${blue}Flattr:${default} https://linuxgsm.com/flattr" echo -e "" -echo -e "LinuxGSM has been going since 2012" \ No newline at end of file +echo -e "LinuxGSM has been going since 2012" diff --git a/lgsm/functions/command_fastdl.sh b/lgsm/functions/command_fastdl.sh index c09250217..5dba7ba53 100644 --- a/lgsm/functions/command_fastdl.sh +++ b/lgsm/functions/command_fastdl.sh @@ -196,7 +196,7 @@ fn_fastdl_preview(){ 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}..." + echo "gathering ${directory} ${allowed_extention} : ${fileswc}..." if [ ${fileswc} != 0 ]; then fn_print_ok_eol_nl else @@ -245,7 +245,7 @@ fn_fastdl_gmod(){ while read -r fastdlfile; do ((fileswc++)) tput rc; tput el - printf "copying ${allowed_extention} : ${fileswc}..." + echo "copying ${allowed_extention} : ${fileswc}..." cp --parents "${fastdlfile}" "${fastdldir}" exitcode=$? if [ ${exitcode} -ne 0 ]; then @@ -255,7 +255,7 @@ fn_fastdl_gmod(){ else fn_script_log_pass "Copying ${fastdlfile} > ${fastdldir}" fi - done < <(find . -type f -iname ${allowed_extention}) + done < <(find . -type f -iname "${allowed_extention}") if [ ${fileswc} != 0 ]; then fn_print_ok_eol_nl fi diff --git a/lgsm/functions/command_monitor.sh b/lgsm/functions/command_monitor.sh index dca5fc964..8382d1fb7 100644 --- a/lgsm/functions/command_monitor.sh +++ b/lgsm/functions/command_monitor.sh @@ -96,8 +96,8 @@ fn_monitor_check_lockfile(){ } fn_monitor_check_update(){ - # Monitor will not check if update is running. - if [ "$(ps -ef | grep "${selfname} update" | grep -v grep | wc -l)" != "0" ]; then + # Monitor will check if update is already running. + if [ "$(pgrep "${selfname} update" | wc -l)" != "0" ]; then fn_print_error_nl "SteamCMD is currently checking for updates" fn_script_log_error "SteamCMD is currently checking for updates" core_exit.sh diff --git a/lgsm/functions/command_restart.sh b/lgsm/functions/command_restart.sh index db8678bb5..2ece0810c 100644 --- a/lgsm/functions/command_restart.sh +++ b/lgsm/functions/command_restart.sh @@ -11,4 +11,4 @@ local function_selfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" info_config.sh exitbypass=1 command_stop.sh -command_start.sh \ No newline at end of file +command_start.sh diff --git a/lgsm/functions/command_start.sh b/lgsm/functions/command_start.sh index afaa82326..ed81fe63e 100644 --- a/lgsm/functions/command_start.sh +++ b/lgsm/functions/command_start.sh @@ -35,7 +35,7 @@ fn_start_teamspeak3(){ if [ ! -f "${executabledir}/.ts3server_license_accepted" ]; then install_eula.sh fi - cd "${executabledir}" + cd "${executabledir}" || exit if [ "${ts3serverpass}" == "1" ]; then ./ts3server_startscript.sh start serveradmin_password="${newpassword}" inifile="${servercfgfullpath}" > /dev/null 2>&1 else @@ -86,7 +86,7 @@ fn_start_tmux(){ # Create lockfile date > "${rootdir}/${lockselfname}" - cd "${executabledir}" + cd "${executabledir}" || exit tmux new-session -d -x "${sessionwidth}" -y "${sessionheight}" -s "${servicename}" "${executable} ${parms}" 2> "${lgsmlogdir}/.${servicename}-tmux-error.tmp" # Create logfile. @@ -154,7 +154,7 @@ fn_sleep_time echo "" echo "Fix" echo "=================================" - if [ ! $(grep "tty:" /etc/group|grep "$(whoami)") ]; then + if [ ! "$(grep "tty:" /etc/group|grep "$(whoami)")" ]; then echo "$(whoami) is not part of the tty group." fn_script_log_info "$(whoami) is not part of the tty group." group=$(grep tty /etc/group) diff --git a/lgsm/functions/command_update_functions.sh b/lgsm/functions/command_update_functions.sh index 33609b121..4825be027 100644 --- a/lgsm/functions/command_update_functions.sh +++ b/lgsm/functions/command_update_functions.sh @@ -10,4 +10,4 @@ functionfile="${FUNCNAME}" fn_fetch_function } -command_update_linuxgsm.sh \ No newline at end of file +command_update_linuxgsm.sh diff --git a/lgsm/functions/core_dl.sh b/lgsm/functions/core_dl.sh index 910e1dec8..86eb202d8 100644 --- a/lgsm/functions/core_dl.sh +++ b/lgsm/functions/core_dl.sh @@ -34,7 +34,7 @@ fn_clear_tmp(){ fn_print_error_eol_nl fn_script_log_error "clearing LinuxGSM tmp directory" fi - fi + fi } fn_dl_md5(){ @@ -260,4 +260,4 @@ curlpath=$(command -v curl 2>/dev/null) if [ "$(basename "${curlpath}")" != "curl" ]; then echo "[ FAIL ] Curl is not installed" exit 1 -fi \ No newline at end of file +fi diff --git a/lgsm/functions/core_trap.sh b/lgsm/functions/core_trap.sh index 57bec2aa7..54f2ef2c5 100644 --- a/lgsm/functions/core_trap.sh +++ b/lgsm/functions/core_trap.sh @@ -10,4 +10,4 @@ fn_exit_trap(){ } # trap to give an exit code. -trap fn_exit_trap INT \ No newline at end of file +trap fn_exit_trap INT diff --git a/lgsm/functions/fix_ark.sh b/lgsm/functions/fix_ark.sh index e9be8ecaf..ccb0a93cb 100644 --- a/lgsm/functions/fix_ark.sh +++ b/lgsm/functions/fix_ark.sh @@ -11,4 +11,4 @@ fi if [ ! -d "${serverfiles}/Engine/Binaries/ThirdParty/SteamCMD/Linux/steamapps" ]; then ln -s "$HOME/Steam/steamapps/" "${serverfiles}/Engine/Binaries/ThirdParty/SteamCMD/Linux/steamapps" -fi \ No newline at end of file +fi diff --git a/lgsm/functions/fix_arma3.sh b/lgsm/functions/fix_arma3.sh index 06e54f7cd..ffa3d35e0 100644 --- a/lgsm/functions/fix_arma3.sh +++ b/lgsm/functions/fix_arma3.sh @@ -14,4 +14,4 @@ if [ ! -d "${HOME}/.local/share/Arma 3" ]||[ ! -d "${HOME}/.local/share/Arma 3 - fn_fix_msg_start mkdir -p "${HOME}/.local/share/Arma 3 - Other Profiles" fn_fix_msg_end -fi \ No newline at end of file +fi diff --git a/lgsm/functions/fix_ges.sh b/lgsm/functions/fix_ges.sh index 977697cca..35e1411e3 100644 --- a/lgsm/functions/fix_ges.sh +++ b/lgsm/functions/fix_ges.sh @@ -8,4 +8,4 @@ local commandname="FIX" local commandaction="Fix" # Fixes: MALLOC_CHECK_ needing to be set to 0. -export MALLOC_CHECK_=0 \ No newline at end of file +export MALLOC_CHECK_=0 diff --git a/lgsm/functions/fix_kf.sh b/lgsm/functions/fix_kf.sh index e9f5f3860..bb5a8b6ca 100644 --- a/lgsm/functions/fix_kf.sh +++ b/lgsm/functions/fix_kf.sh @@ -30,4 +30,4 @@ exitbypass=1 command_start.sh sleep 5 exitbypass=1 -command_stop.sh \ No newline at end of file +command_stop.sh diff --git a/lgsm/functions/fix_rw.sh b/lgsm/functions/fix_rw.sh index 3ce85a699..da5fd8286 100644 --- a/lgsm/functions/fix_rw.sh +++ b/lgsm/functions/fix_rw.sh @@ -7,4 +7,4 @@ local commandname="FIX" local commandaction="Fix" -export LD_LIBRARY_PATH="${serverfiles}/linux64:${serverfiles}:$LD_LIBRARY_PATH" \ No newline at end of file +export LD_LIBRARY_PATH="${serverfiles}/linux64:${serverfiles}:$LD_LIBRARY_PATH" diff --git a/lgsm/functions/fix_sdtd.sh b/lgsm/functions/fix_sdtd.sh index 04ac7936d..ca0dc09a1 100644 --- a/lgsm/functions/fix_sdtd.sh +++ b/lgsm/functions/fix_sdtd.sh @@ -7,4 +7,4 @@ local commandname="FIX" local commandaction="Fix" -export LD_LIBRARY_PATH="${serverfiles}" \ No newline at end of file +export LD_LIBRARY_PATH="${serverfiles}" diff --git a/lgsm/functions/fix_ut.sh b/lgsm/functions/fix_ut.sh index 7e9b7dc97..5632c86e4 100644 --- a/lgsm/functions/fix_ut.sh +++ b/lgsm/functions/fix_ut.sh @@ -11,4 +11,4 @@ local function_selfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" #Set Binary Executable echo "chmod +x ${executabledir}/${executable}" chmod +x "${executabledir}/${executable}" -fn_sleep_time \ No newline at end of file +fn_sleep_time diff --git a/lgsm/functions/fix_ut2k4.sh b/lgsm/functions/fix_ut2k4.sh index 3789909b3..cc517e1f3 100644 --- a/lgsm/functions/fix_ut2k4.sh +++ b/lgsm/functions/fix_ut2k4.sh @@ -30,4 +30,4 @@ exitbypass=1 command_start.sh sleep 5 exitbypass=1 -command_stop.sh \ No newline at end of file +command_stop.sh diff --git a/lgsm/functions/info_distro.sh b/lgsm/functions/info_distro.sh index 3b7b6b951..76445050f 100644 --- a/lgsm/functions/info_distro.sh +++ b/lgsm/functions/info_distro.sh @@ -235,9 +235,9 @@ fi if [ "$(command -v jq 2>/dev/null)" ]; then if [ "${ip}" ]&&[ "${port}" ]; then if [ "${steammaster}" == "true" ]; then - masterserver=$(${curlpath} -m 3 -s 'https://api.steampowered.com/ISteamApps/GetServersAtAddress/v0001?addr='${ip}':'${port}'&format=json' | jq '.response.servers[]|.addr' | wc -l) + masterserver="$(${curlpath} -m 3 -s 'https://api.steampowered.com/ISteamApps/GetServersAtAddress/v0001?addr='${ip}':'${port}'&format=json' | jq '.response.servers[]|.addr' | wc -l)" if [ "${masterserver}" == "0" ]; then - masterserver=$(${curlpath} -m 3 -s 'https://api.steampowered.com/ISteamApps/GetServersAtAddress/v0001?addr='${extip}':'${port}'&format=json' | jq '.response.servers[]|.addr' | wc -l) + masterserver="$(${curlpath} -m 3 -s 'https://api.steampowered.com/ISteamApps/GetServersAtAddress/v0001?addr='${extip}':'${port}'&format=json' | jq '.response.servers[]|.addr' | wc -l)" fi if [ "${masterserver}" == "0" ]; then displaymasterserver="false" diff --git a/lgsm/functions/info_messages.sh b/lgsm/functions/info_messages.sh index 1e58ae3ac..dfe75c037 100644 --- a/lgsm/functions/info_messages.sh +++ b/lgsm/functions/info_messages.sh @@ -1228,85 +1228,87 @@ fn_info_message_soldat() { fn_info_message_select_engine(){ # Display details depending on game or engine. - if [ "${gamename}" == "7 Days To Die" ]; then + if [ "${shortname}" == "sdtd" ]; then fn_info_message_sdtd - elif [ "${gamename}" == "ARK: Survival Evolved" ]; then + elif [ "${shortname}" == "ark" ]; then fn_info_message_ark - elif [ "${gamename}" == "Ballistic Overkill" ]; then + elif [ "${shortname}" == "bo" ]; then fn_info_message_ballisticoverkill - elif [ "${gamename}" == "Barotrauma" ]; then + elif [ "${shortname}" == "bt" ]; then fn_info_message_barotrauma - elif [ "${gamename}" == "Battalion 1944" ]; then + elif [ "${shortname}" == "bt1944" ]; then fn_info_message_battalion1944 - elif [ "${gamename}" == "Call of Duty" ]; then + elif [ "${shortname}" == "cod" ]; then fn_info_message_cod - elif [ "${gamename}" == "Call of Duty: United Offensive" ]; then + elif [ "${shortname}" == "coduo" ]; then fn_info_message_coduo - elif [ "${gamename}" == "Call of Duty 2" ]; then + elif [ "${shortname}" == "cod2" ]; then fn_info_message_cod2 - elif [ "${gamename}" == "Call of Duty 4" ]; then + elif [ "${shortname}" == "cod4" ]; then fn_info_message_cod4 - elif [ "${gamename}" == "Call of Duty: World at War" ]; then + elif [ "${shortname}" == "codwaw" ]; then fn_info_message_codwaw - elif [ "${gamename}" == "Eco" ]; then + elif [ "${shortname}" == "eco" ]; then fn_info_message_eco - elif [ "${gamename}" == "ET: Legacy" ]; then + elif [ "${shortname}" == "etl" ]; then fn_info_message_etlegacy - elif [ "${gamename}" == "Factorio" ]; then + elif [ "${shortname}" == "fctr" ]; then fn_info_message_factorio - elif [ "${gamename}" == "Hurtworld" ]; then + elif [ "${shortname}" == "hw" ]; then fn_info_message_hurtworld elif [ "${shortname}" == "inss" ]; then fn_info_message_inss - elif [ "${gamename}" == "Just Cause 2" ]; then + elif [ "${shortname}" == "jc2" ]; then fn_info_message_justcause2 - elif [ "${gamename}" == "Just Cause 3" ]; then + elif [ "${shortname}" == "jc3" ]; then fn_info_message_justcause3 elif [ "${shortname}" == "kf2" ]; then fn_info_message_kf2 elif [ "${shortname}" == "pstbs" ]; then fn_info_message_pstbs - elif [ "${gamename}" == "Project Cars" ]; then + elif [ "${shortname}" == "pc" ]; then fn_info_message_projectcars - elif [ "${gamename}" == "QuakeWorld" ]; then + elif [ "${shortname}" == "qw" ]; then fn_info_message_quake - elif [ "${gamename}" == "Quake 2" ]; then + elif [ "${shortname}" == "q2" ]; then fn_info_message_quake2 - elif [ "${gamename}" == "Quake 3: Arena" ]; then + elif [ "${shortname}" == "q3" ]; then fn_info_message_quake3 - elif [ "${gamename}" == "Quake Live" ]; then + elif [ "${shortname}" == "ql" ]; then fn_info_message_quakelive - elif [ "${gamename}" == "San Andreas Multiplayer" ]; then + elif [ "${shortname}" == "samp" ]; then fn_info_message_samp - elif [ "${gamename}" == "Squad" ]; then + elif [ "${shortname}" == "squad" ]; then fn_info_message_squad - elif [ "${gamename}" == "Stationeers" ]; then + elif [ "${shortname}" == "st" ]; then fn_info_message_stationeers + elif [ "${shortname}" == "sof2" ]; then + fn_info_message_sof2 elif [ "${shortname}" == "sol" ]; then fn_info_message_soldat elif [ "${shortname}" == "sbots" ]; then fn_info_message_sbots - elif [ "${gamename}" == "TeamSpeak 3" ]; then + elif [ "${shortname}" == "ts3" ]; then fn_info_message_teamspeak3 - elif [ "${gamename}" == "Tower Unite" ]; then + elif [ "${shortname}" == "tu" ]; then fn_info_message_towerunite elif [ "${shortname}" == "unt" ]; then fn_info_message_unturned elif [ "${shortname}" == "mh" ]; then fn_info_message_mordhau - elif [ "${gamename}" == "Multi Theft Auto" ]; then + elif [ "${shortname}" == "mta" ]; then fn_info_message_mta - elif [ "${gamename}" == "Mumble" ]; then + elif [ "${shortname}" == "mumble" ]; then fn_info_message_mumble - elif [ "${gamename}" == "Return to Castle Wolfenstein" ]; then + elif [ "${shortname}" == "rtcw" ]; then fn_info_message_rtcw - elif [ "${gamename}" == "Rust" ]; then + elif [ "${shortname}" == "rust" ]; then fn_info_message_rust - elif [ "${gamename}" == "Wurm Unlimited" ]; then + elif [ "${shortname}" == "wurm" ]; then fn_info_message_wurmunlimited elif [ "${shortname}" == "rw" ]; then fn_info_message_risingworld - elif [ "${gamename}" == "Wolfenstein: Enemy Territory" ]; then + elif [ "${shortname}" == "wet" ]; then fn_info_message_wolfensteinenemyterritory elif [ "${engine}" == "refractor" ]; then fn_info_message_refractor @@ -1324,8 +1326,6 @@ fn_info_message_select_engine(){ fn_info_message_seriousengine35 elif [ "${engine}" == "source" ]; then fn_info_message_source - elif [ "${gamename}" == "Soldier Of Fortune 2: Gold Edition" ]; then - fn_info_message_sof2 elif [ "${engine}" == "spark" ]; then fn_info_message_spark elif [ "${engine}" == "starbound" ]; then diff --git a/lgsm/functions/install_config.sh b/lgsm/functions/install_config.sh index 1adeeb744..7dfb31378 100644 --- a/lgsm/functions/install_config.sh +++ b/lgsm/functions/install_config.sh @@ -40,10 +40,10 @@ fn_default_config_remote(){ if [ "${config}" == "${servercfgdefault}" ]; then mkdir -p "${servercfgdir}" cp -nv "${lgsmdir}/config-default/config-game/${config}" "${servercfgfullpath}" - elif [ "${gamename}" == "ARMA 3" ]&&[ "${config}" == "${networkcfgdefault}" ]; then + elif [ "${shortname}" == "arma3" ]&&[ "${config}" == "${networkcfgdefault}" ]; then mkdir -p "${servercfgdir}" cp -nv "${lgsmdir}/config-default/config-game/${config}" "${networkcfgfullpath}" - elif [ "${gamename}" == "Don't Starve Together" ]&&[ "${config}" == "${clustercfgdefault}" ]; then + elif [ "${shortname}" == "dst" ]&&[ "${config}" == "${clustercfgdefault}" ]; then cp -nv "${lgsmdir}/config-default/config-game/${clustercfgdefault}" "${clustercfgfullpath}" else mkdir -p "${servercfgdir}" @@ -144,514 +144,502 @@ fn_set_dst_config_vars(){ echo "" } -if [ "${gamename}" == "7 Days To Die" ]; then +if [ "${shortname}" == "sdtd" ]; then gamedirname="7DaysToDie" fn_default_config_local -elif [ "${gamename}" == "Action half-life" ]; then +elif [ "${shortname}" == "ahl" ]; then gamedirname="ActionHalfLife" array_configs+=( server.cfg ) fn_fetch_default_config fn_default_config_remote fn_set_config_vars -elif [ "${gamename}" == "ARK: Survival Evolved" ]; then +elif [ "${shortname}" == "ark" ]; 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 +elif [ "${shortname}" == "arma3" ]; then gamedirname="Arma3" fn_check_cfgdir array_configs+=( server.cfg network.cfg ) fn_fetch_default_config fn_default_config_remote fn_set_config_vars -elif [ "${gamename}" == "Ballistic Overkill" ]; then +elif [ "${shortname}" == "bo" ]; then gamedirname="BallisticOverkill" array_configs+=( config.txt ) fn_fetch_default_config fn_default_config_remote fn_set_config_vars -elif [ "${gamename}" == "Base Defense" ]; then +elif [ "${shortname}" == "bo" ]; then gamedirname="BaseDefense" array_configs+=( server.cfg ) fn_fetch_default_config fn_default_config_remote fn_set_config_vars -elif [ "${gamename}" == "Barotrauma" ]; then +elif [ "${shortname}" == "bt" ]; then gamedirname="Barotrauma" fn_check_cfgdir array_configs+=( serversettings.xml ) fn_fetch_default_config fn_default_config_remote fn_set_config_vars -elif [ "${gamename}" == "Battalion 1944" ]; then +elif [ "${shortname}" == "Battalion 1944" ]; then gamedirname="Battalion1944" fn_check_cfgdir array_configs+=( DefaultGame.ini ) fn_fetch_default_config fn_default_config_remote fn_set_config_vars -elif [ "${gamename}" == "Battlefield: 1942" ]; then +elif [ "${shortname}" == "bt1942" ]; then gamedirname="Battlefield1942" array_configs+=( serversettings.con ) fn_fetch_default_config fn_default_config_remote fn_set_config_vars -elif [ "${gamename}" == "Blade Symphony" ]; then +elif [ "${shortname}" == "bs" ]; then gamedirname="BladeSymphony" array_configs+=( server.cfg ) fn_fetch_default_config fn_default_config_remote fn_set_config_vars -elif [ "${gamename}" == "BrainBread" ]; then +elif [ "${shortname}" == "bb" ]; then gamedirname="BrainBread" array_configs+=( server.cfg ) fn_fetch_default_config fn_default_config_remote fn_set_config_vars -elif [ "${gamename}" == "BrainBread 2" ]; then +elif [ "${shortname}" == "bb2" ]; then gamedirname="BrainBread2" array_configs+=( server.cfg ) fn_fetch_default_config fn_default_config_remote fn_set_config_vars -elif [ "${gamename}" == "Black Mesa: Deathmatch" ]; then +elif [ "${shortname}" == "bmdm" ]; then gamedirname="BlackMesa" array_configs+=( server.cfg ) fn_fetch_default_config fn_default_config_remote fn_set_config_vars -elif [ "${gamename}" == "Call of Duty" ]; then +elif [ "${shortname}" == "cod" ]; then gamedirname="CallOfDuty" array_configs+=( server.cfg ) fn_fetch_default_config fn_default_config_remote fn_set_config_vars -elif [ "${gamename}" == "Call of Duty: United Offensive" ]; then +elif [ "${shortname}" == "coduo" ]; then gamedirname="CallOfDutyUnitedOffensive" array_configs+=( server.cfg ) fn_fetch_default_config fn_default_config_remote fn_set_config_vars -elif [ "${gamename}" == "Call of Duty 2" ]; then +elif [ "${shortname}" == "cod2" ]; then gamedirname="CallOfDuty2" array_configs+=( server.cfg ) fn_fetch_default_config fn_default_config_remote fn_set_config_vars -elif [ "${gamename}" == "Call of Duty 4" ]; then +elif [ "${shortname}" == "cod4" ]; 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 +elif [ "${shortname}" == "codwaw" ]; then gamedirname="CallOfDutyWorldAtWar" array_configs+=( server.cfg ) fn_fetch_default_config fn_default_config_remote fn_set_config_vars -elif [ "${gamename}" == "Codename CURE" ]; then +elif [ "${shortname}" == "cc" ]; then gamedirname="CodenameCURE" array_configs+=( server.cfg ) fn_fetch_default_config fn_default_config_remote fn_set_config_vars -elif [ "${gamename}" == "Counter-Strike 1.6" ]; then +elif [ "${shortname}" == "cs" ]; then gamedirname="CounterStrike" array_configs+=( server.cfg ) fn_fetch_default_config fn_default_config_remote fn_set_config_vars -elif [ "${gamename}" == "Counter-Strike: Condition Zero" ]; then +elif [ "${shortname}" == "cscz" ]; then gamedirname="CounterStrikeConditionZero" array_configs+=( server.cfg ) fn_fetch_default_config fn_default_config_remote fn_set_config_vars -elif [ "${gamename}" == "Counter-Strike: Global Offensive" ]; then +elif [ "${shortname}" == "csgo" ]; then gamedirname="CounterStrikeGlobalOffensive" array_configs+=( server.cfg ) fn_fetch_default_config fn_default_config_remote 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 +elif [ "${shortname}" == "css" ]; then gamedirname="CounterStrikeSource" array_configs+=( server.cfg ) fn_fetch_default_config fn_default_config_remote fn_set_config_vars -elif [ "${gamename}" == "Day of Defeat" ]; then +elif [ "${shortname}" == "dod" ]; then gamedirname="DayOfDefeat" array_configs+=( server.cfg ) fn_fetch_default_config fn_default_config_remote fn_set_config_vars -elif [ "${gamename}" == "Day of Defeat: Source" ]; then +elif [ "${shortname}" == "dods" ]; then gamedirname="DayOfDefeatSource" array_configs+=( server.cfg ) fn_fetch_default_config fn_default_config_remote fn_set_config_vars -elif [ "${gamename}" == "Day of Infamy" ]; then +elif [ "${shortname}" == "doi" ]; then gamedirname="DayOfInfamy" array_configs+=( server.cfg ) fn_fetch_default_config fn_default_config_remote fn_set_config_vars -elif [ "${gamename}" == "Deathmatch Classic" ]; then +elif [ "${shortname}" == "dmc" ]; then gamedirname="DeathmatchClassic" array_configs+=( server.cfg ) fn_fetch_default_config fn_default_config_remote fn_set_config_vars -elif [ "${gamename}" == "Don't Starve Together" ]; then +elif [ "${shortname}" == "dst" ]; then gamedirname="DontStarveTogether" fn_check_cfgdir array_configs+=( cluster.ini server.ini ) fn_fetch_default_config fn_default_config_remote fn_set_dst_config_vars -elif [ "${gamename}" == "Double Action: Boogaloo" ]; then +elif [ "${shortname}" == "dab" ]; then gamedirname="DoubleActionBoogaloo" array_configs+=( server.cfg ) fn_fetch_default_config fn_default_config_remote fn_set_config_vars -elif [ "${gamename}" == "Dystopia" ]; then +elif [ "${shortname}" == "dys" ]; then gamedirname="Dystopia" array_configs+=( server.cfg ) fn_fetch_default_config fn_default_config_remote fn_set_config_vars -elif [ "${gamename}" == "Eco" ]; then +elif [ "${shortname}" == "eco" ]; then gamedirname="Eco" array_configs+=( Network.eco ) fn_fetch_default_config fn_default_config_remote fn_set_config_vars -elif [ "${gamename}" == "ET: Legacy" ]; then +elif [ "${shortname}" == "etl" ]; then gamedirname="ETLegacy" array_configs+=( server.cfg ) fn_fetch_default_config fn_default_config_remote fn_set_config_vars -elif [ "${gamename}" == "Factorio" ]; then +elif [ "${shortname}" == "fctr" ]; 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 +elif [ "${shortname}" == "fof" ]; then gamedirname="FistfulofFrags" array_configs+=( server.cfg ) fn_fetch_default_config fn_default_config_remote fn_set_config_vars -elif [ "${gamename}" == "Garry's Mod" ]; then +elif [ "${shortname}" == "gmod" ]; then gamedirname="GarrysMod" array_configs+=( server.cfg ) fn_fetch_default_config fn_default_config_remote fn_set_config_vars -elif [ "${gamename}" == "GoldenEye: Source" ]; then +elif [ "${shortname}" == "ges" ]; then gamedirname="GoldenEyeSource" array_configs+=( server.cfg ) fn_fetch_default_config fn_default_config_remote fn_set_config_vars -elif [ "${gamename}" == "Half Life: Deathmatch" ]; then +elif [ "${shortname}" == "hldm" ]; then gamedirname="HalfLifeDeathmatch" array_configs+=( server.cfg ) fn_fetch_default_config fn_default_config_remote fn_set_config_vars -elif [ "${gamename}" == "Half-Life Deathmatch: Source" ]; then +elif [ "${shortname}" == "hldms" ]; then gamedirname="HalfLifeDeathmatchSource" array_configs+=( server.cfg ) fn_fetch_default_config fn_default_config_remote fn_set_config_vars -elif [ "${gamename}" == "Half-Life: Opposing Force" ]; then +elif [ "${shortname}" == "opfor" ]; then gamedirname="OpposingForce" array_configs+=( server.cfg ) fn_fetch_default_config fn_default_config_remote fn_set_config_vars -elif [ "${gamename}" == "Half Life 2: Deathmatch" ]; then +elif [ "${shortname}" == "hl2dm" ]; then gamedirname="HalfLife2Deathmatch" array_configs+=( server.cfg ) fn_fetch_default_config fn_default_config_remote fn_set_config_vars -elif [ "${gamename}" == "Insurgency" ]; then +elif [ "${shortname}" == "ins" ]; then gamedirname="Insurgency" array_configs+=( server.cfg ) fn_fetch_default_config fn_default_config_remote fn_set_config_vars -elif [ "${gamename}" == "IOSoccer" ]; then +elif [ "${shortname}" == "ios" ]; then gamedirname="IOSoccer" array_configs+=( server.cfg ) fn_fetch_default_config fn_default_config_remote fn_set_config_vars -elif [ "${gamename}" == "Just Cause 2" ]; then +elif [ "${shortname}" == "jc2" ]; then gamedirname="JustCause2" array_configs+=( config.lua ) fn_fetch_default_config fn_default_config_remote fn_set_config_vars -elif [ "${gamename}" == "Just Cause 3" ]; then +elif [ "${shortname}" == "jc3" ]; then gamedirname="JustCause3" array_configs+=( config.json ) fn_fetch_default_config fn_default_config_remote fn_set_config_vars -elif [ "${gamename}" == "Killing Floor" ]; then +elif [ "${shortname}" == "kf" ]; then gamedirname="KillingFloor" array_configs+=( Default.ini ) fn_fetch_default_config fn_default_config_remote fn_set_config_vars -elif [ "${gamename}" == "Left 4 Dead" ]; then - gamedirname="Left4Dead" - array_configs+=( server.cfg ) - fn_fetch_default_config - fn_default_config_remote - fn_set_config_vars -elif [ "${gamename}" == "Left 4 Dead" ]; then +elif [ "${shortname}" == "l4d" ]; then gamedirname="Left4Dead" array_configs+=( server.cfg ) fn_fetch_default_config fn_default_config_remote fn_set_config_vars -elif [ "${gamename}" == "Left 4 Dead 2" ]; then +elif [ "${shortname}" == "l4d2" ]; then gamedirname="Left4Dead2" array_configs+=( server.cfg ) fn_fetch_default_config fn_default_config_remote fn_set_config_vars -elif [ "${gamename}" == "Minecraft" ]; then +elif [ "${shortname}" == "mc" ]; then gamedirname="Minecraft" array_configs+=( server.properties ) fn_fetch_default_config fn_default_config_remote fn_set_config_vars -elif [ "${gamename}" == "MORDHAU" ]; then +elif [ "${shortname}" == "mh" ]; then gamedirname="Mordhau" fn_check_cfgdir array_configs+=( Game.ini ) fn_fetch_default_config fn_default_config_remote fn_set_config_vars -elif [ "${gamename}" == "Natural Selection" ]; then +elif [ "${shortname}" == "ns" ]; then gamedirname="NaturalSelection" array_configs+=( server.cfg ) fn_fetch_default_config fn_default_config_remote fn_set_config_vars -elif [ "${gamename}" == "No More Room in Hell" ]; then +elif [ "${shortname}" == "nmrih" ]; then gamedirname="NoMoreRoominHell" array_configs+=( server.cfg ) fn_fetch_default_config fn_default_config_remote fn_set_config_vars -elif [ "${gamename}" == "Nuclear Dawn" ]; then +elif [ "${shortname}" == "nd" ]; then gamedirname="NuclearDawn" array_configs+=( server.cfg ) fn_fetch_default_config fn_default_config_remote fn_set_config_vars -elif [ "${gamename}" == "Multi Theft Auto" ]; then +elif [ "${shortname}" == "mta" ]; then gamedirname="MultiTheftAuto" fn_check_cfgdir array_configs+=( acl.xml mtaserver.conf vehiclecolors.conf ) fn_fetch_default_config fn_default_config_remote -elif [ "${gamename}" == "Mumble" ]; then +elif [ "${shortname}" == "mumble" ]; then gamedirname="Mumble" array_configs+=( murmur.ini ) fn_fetch_default_config fn_default_config_remote -elif [ "${gamename}" == "Pirates, Vikings, and Knights II" ]; then +elif [ "${shortname}" == "pvkii" ]; then gamedirname="PiratesVikingandKnightsII" array_configs+=( server.cfg ) fn_fetch_default_config fn_default_config_remote fn_set_config_vars -elif [ "${gamename}" == "Project Zomboid" ]; then +elif [ "${shortname}" == "pz" ]; then gamedirname="ProjectZomboid" fn_check_cfgdir array_configs+=( server.ini ) fn_fetch_default_config fn_default_config_remote fn_set_config_vars -elif [ "${gamename}" == "Project Cars" ]; then +elif [ "${shortname}" == "pc" ]; then gamedirname="ProjectCars" array_configs+=( server.cfg ) fn_fetch_default_config fn_default_config_remote fn_set_config_vars -elif [ "${gamename}" == "Quake 2" ]; then +elif [ "${shortname}" == "q2" ]; then gamedirname="Quake2" array_configs+=( server.cfg ) fn_fetch_default_config fn_default_config_remote fn_set_config_vars -elif [ "${gamename}" == "Quake 3: Arena" ]; then +elif [ "${shortname}" == "q3" ]; then gamedirname="Quake3Arena" array_configs+=( server.cfg ) fn_fetch_default_config fn_default_config_remote fn_set_config_vars -elif [ "${gamename}" == "Quake Live" ]; then +elif [ "${shortname}" == "ql" ]; then gamedirname="QuakeLive" array_configs+=( server.cfg ) fn_fetch_default_config fn_default_config_remote fn_set_config_vars -elif [ "${gamename}" == "QuakeWorld" ]; then +elif [ "${shortname}" == "qw" ]; then gamedirname="QuakeWorld" array_configs+=( server.cfg ) fn_fetch_default_config fn_default_config_remote fn_set_config_vars -elif [ "${gamename}" == "Ricochet" ]; then +elif [ "${shortname}" == "ricochet" ]; then gamedirname="Ricochet" array_configs+=( server.cfg ) fn_fetch_default_config fn_default_config_remote fn_set_config_vars -elif [ "${gamename}" == "Return to Castle Wolfenstein" ]; then +elif [ "${shortname}" == "rtcw" ]; then gamedirname="ReturnToCastleWolfenstein" array_configs+=( server.cfg ) fn_fetch_default_config fn_default_config_remote fn_set_config_vars -elif [ "${gamename}" == "Rust" ]; then +elif [ "${shortname}" == "rust" ]; then gamedirname="Rust" fn_check_cfgdir array_configs+=( server.cfg ) fn_fetch_default_config fn_default_config_remote -elif [ "${gamename}" == "San Andreas Multiplayer" ]; then +elif [ "${shortname}" == "samp" ]; then gamedirname="SanAndreasMultiplayer" array_configs+=( server.cfg ) fn_fetch_default_config fn_default_config_remote fn_set_config_vars -elif [ "${gamename}" == "Serious Sam 3: BFE" ]; then +elif [ "${shortname}" == "ss3" ]; then gamedirname="SeriousSam3BFE" array_configs+=( server.ini ) fn_fetch_default_config fn_default_config_remote fn_set_config_vars -elif [ "${gamename}" == "Soldat" ]; then +elif [ "${shortname}" == "sol" ]; then gamedirname="Soldat" array_configs+=( soldat.ini ) fn_fetch_default_config fn_default_config_remote fn_set_config_vars -elif [ "${gamename}" == "Soldier Of Fortune 2: Gold Edition" ]; then +elif [ "${shortname}" == "sof2" ]; then gamedirname="SoldierOfFortune2Gold" array_configs+=( server.cfg mapcycle.txt) fn_fetch_default_config fn_default_config_remote fn_set_config_vars -elif [ "${gamename}" == "SourceForts Classic" ]; then +elif [ "${shortname}" == "sfc" ]; then gamedirname="SourceFortsClassic" array_configs+=( server.cfg ) fn_fetch_default_config fn_default_config_remote fn_set_config_vars -elif [ "${gamename}" == "Squad" ]; then +elif [ "${shortname}" == "squad" ]; then gamedirname="Squad" array_configs+=( Admins.cfg Bans.cfg License.cfg Server.cfg Rcon.cfg ) fn_fetch_default_config fn_default_config_remote fn_set_config_vars -elif [ "${gamename}" == "Starbound" ]; then +elif [ "${shortname}" == "sb" ]; then gamedirname="Starbound" array_configs+=( starbound_server.config ) fn_fetch_default_config fn_default_config_remote fn_set_config_vars -elif [ "${gamename}" == "Stationeers" ]; then +elif [ "${shortname}" == "st" ]; then gamedirname="Stationeers" array_configs+=( default.ini ) fn_fetch_default_config fn_default_config_remote fn_set_config_vars -elif [ "${gamename}" == "Sven Co-op" ]; then +elif [ "${shortname}" == "sven" ]; then gamedirname="SvenCoop" array_configs+=( server.cfg ) fn_fetch_default_config fn_default_config_remote fn_set_config_vars -elif [ "${gamename}" == "Team Fortress 2" ]; then +elif [ "${shortname}" == "tf2" ]; then gamedirname="TeamFortress2" array_configs+=( server.cfg ) fn_fetch_default_config fn_default_config_remote fn_set_config_vars -elif [ "${gamename}" == "Team Fortress Classic" ]; then +elif [ "${shortname}" == "tfc" ]; then gamedirname="TeamFortressClassic" array_configs+=( server.cfg ) fn_fetch_default_config fn_default_config_remote fn_set_config_vars -elif [ "${gamename}" == "The Specialists" ]; then +elif [ "${shortname}" == "ts" ]; then gamedirname="TheSpecialists" array_configs+=( server.cfg ) fn_fetch_default_config fn_default_config_remote fn_set_config_vars -elif [ "${gamename}" == "TeamSpeak 3" ]; then +elif [ "${shortname}" == "ts3" ]; then gamedirname="TeamSpeak3" array_configs+=( ts3server.ini ) fn_fetch_default_config fn_default_config_remote -elif [ "${gamename}" == "Teeworlds" ]; then +elif [ "${shortname}" == "tw" ]; then gamedirname="Teeworlds" array_configs+=( server.cfg ctf.cfg dm.cfg duel.cfg tdm.cfg ) fn_fetch_default_config fn_default_config_remote fn_set_config_vars -elif [ "${gamename}" == "Terraria" ]; then +elif [ "${shortname}" == "terraria" ]; then gamedirname="Terraria" array_configs+=( serverconfig.txt ) fn_fetch_default_config fn_default_config_remote fn_set_config_vars -elif [ "${gamename}" == "Tower Unite" ]; then +elif [ "${shortname}" == "tu" ]; then gamedirname="TowerUnite" fn_check_cfgdir array_configs+=( TowerServer.ini ) fn_fetch_default_config fn_default_config_remote fn_set_config_vars -elif [ "${gamename}" == "Unreal Tournament" ]; then +elif [ "${shortname}" == "ut" ]; then gamedirname="UnrealTournament" array_configs+=( Game.ini Engine.ini ) fn_fetch_default_config fn_default_config_remote fn_set_config_vars -elif [ "${gamename}" == "Unreal Tournament 2004" ]; then +elif [ "${shortname}" == "ut2k4" ]; then gamedirname="UnrealTournament2004" array_configs+=( UT2004.ini ) fn_fetch_default_config fn_default_config_remote fn_set_config_vars -elif [ "${gamename}" == "Unreal Tournament 99" ]; then +elif [ "${shortname}" == "ut99" ]; then gamedirname="UnrealTournament99" array_configs+=( Default.ini ) fn_fetch_default_config @@ -663,31 +651,31 @@ elif [ "${shortname}" == "unt" ]; then fn_fetch_default_config fn_default_config_remote fn_set_config_vars -elif [ "${gamename}" == "Vampire Slayer" ]; then +elif [ "${shortname}" == "vs" ]; then gamedirname="VampireSlayer" array_configs+=( server.cfg ) fn_fetch_default_config fn_default_config_remote fn_set_config_vars -elif [ "${gamename}" == "Wolfenstein: Enemy Territory" ]; then +elif [ "${shortname}" == "wet" ]; then gamedirname="WolfensteinEnemyTerritory" array_configs+=( server.cfg ) fn_fetch_default_config fn_default_config_remote fn_set_config_vars -elif [ "${gamename}" == "Wurm Unlimited" ]; then +elif [ "${shortname}" == "wurm" ]; then gamedirname="WurmUnlimited" array_configs+=( server.cfg ) fn_fetch_default_config fn_default_config_remote fn_set_config_vars -elif [ "${gamename}" == "Zombie Master: Reborn" ]; then +elif [ "${shortname}" == "zmr" ]; then gamedirname="ZombieMasterReborn" array_configs+=( server.cfg ) fn_fetch_default_config fn_default_config_remote fn_set_config_vars -elif [ "${gamename}" == "Zombie Panic! Source" ]; then +elif [ "${shortname}" == "zps" ]; then gamedirname="ZombiePanicSource" array_configs+=( server.cfg ) fn_fetch_default_config diff --git a/lgsm/functions/install_server_dir.sh b/lgsm/functions/install_server_dir.sh index 18255ebd8..cd8fe8c21 100644 --- a/lgsm/functions/install_server_dir.sh +++ b/lgsm/functions/install_server_dir.sh @@ -24,4 +24,4 @@ if [ -z "${autoinstall}" ]; then fi if [ ! -d "${serverfiles}" ]; then mkdir -v "${serverfiles}" -fi \ No newline at end of file +fi diff --git a/lgsm/functions/install_server_files.sh b/lgsm/functions/install_server_files.sh index 3de499a4c..295a81cd7 100644 --- a/lgsm/functions/install_server_files.sh +++ b/lgsm/functions/install_server_files.sh @@ -72,7 +72,7 @@ fn_install_server_files_steamcmd(){ counter="0" while [ "${counter}" == "0" ]||[ "${exitcode}" != "0" ]; do counter=$((counter+1)) - cd "${steamcmddir}" + cd "${steamcmddir}" || exit if [ "${counter}" -le "10" ]; then # Attempt 1-4: Standard attempt. # Attempt 5-6: Validate attempt. diff --git a/lgsm/functions/install_squad_license.sh b/lgsm/functions/install_squad_license.sh index f9cf40835..f5d5dc457 100644 --- a/lgsm/functions/install_squad_license.sh +++ b/lgsm/functions/install_squad_license.sh @@ -23,4 +23,4 @@ echo "" fn_sleep_time 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 +echo "" diff --git a/lgsm/functions/logs.sh b/lgsm/functions/logs.sh index c4de5e8c8..280b50a92 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 "${lgsmlogdir}"/ -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" @@ -81,7 +81,7 @@ if [ $(find "${lgsmlogdir}"/ -type f -mtime +"${logdays}" | wc -l) -ne "0" ]; th find "${sourcemodlogdir}"/ -mtime +"${logdays}" -type f -exec rm -f {} \; fi # Garry's Mod logfiles. - if [ "${gamename}" == "Garry's Mod" ]; then + if [ "${shortname}" == "gmod" ]; then # ULX logfiles. if [ -d "${ulxlogdir}" ]; then find "${ulxlogdir}"/ -type f -mtime +"${logdays}" | tee >> "${lgsmlog}" diff --git a/lgsm/functions/mods_core.sh b/lgsm/functions/mods_core.sh index d2e18d6bf..02d95c2f0 100644 --- a/lgsm/functions/mods_core.sh +++ b/lgsm/functions/mods_core.sh @@ -43,7 +43,7 @@ fn_mod_lowercase(){ fileswc=$(find "${extractdir}" -depth | wc -l) echo -en "\r" while read -r src; do - dst=$(dirname "${src}"$(/)basename "${src}" | tr 'A-Z' 'a-z') + 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" diff --git a/lgsm/functions/query_gamedig.sh b/lgsm/functions/query_gamedig.sh index 56d55206f..39e8d884a 100644 --- a/lgsm/functions/query_gamedig.sh +++ b/lgsm/functions/query_gamedig.sh @@ -10,7 +10,7 @@ if [ "$(command -v gamedig 2>/dev/null)" ]&&[ "$(command -v jq 2>/dev/null)" ]; if [ "${engine}" == "idtech3_ql" ]; then local engine="quakelive" - elif [ "${gamename}" == "Killing Floor 2" ]; then + elif [ "${shortname}" == "kf2" ]; then local engine="unreal4" fi diff --git a/linuxgsm.sh b/linuxgsm.sh index 3bebf5771..cc9ec81be 100755 --- a/linuxgsm.sh +++ b/linuxgsm.sh @@ -151,7 +151,7 @@ fn_install_menu_bash() { while read -r line || [[ -n "${line}" ]]; do var=$(echo "${line}" | awk -F "," '{print $2 " - " $3}') menu_options+=( "${var}" ) - done < ${options} + done < "${options}" menu_options+=( "Cancel" ) select option in "${menu_options[@]}"; do if [ -n "${option}" ]&&[ "${option}" != "Cancel" ]; then diff --git a/tests/tests_fctrserver.sh b/tests/tests_fctrserver.sh index 5901a7e29..6c74712cc 100644 --- a/tests/tests_fctrserver.sh +++ b/tests/tests_fctrserver.sh @@ -162,7 +162,7 @@ fn_install_menu_bash() { while read -r line || [[ -n "${line}" ]]; do var=$(echo "${line}" | awk -F "," '{print $2 " - " $3}') menu_options+=( "${var}" ) - done < ${options} + done < "${options}" menu_options+=( "Cancel" ) select option in "${menu_options[@]}"; do if [ -n "${option}" ]&&[ "${option}" != "Cancel" ]; then diff --git a/tests/tests_jc2server.sh b/tests/tests_jc2server.sh index e0a9cd826..8aa9e09cc 100644 --- a/tests/tests_jc2server.sh +++ b/tests/tests_jc2server.sh @@ -160,7 +160,7 @@ fn_install_menu_bash() { while read -r line || [[ -n "${line}" ]]; do var=$(echo "${line}" | awk -F "," '{print $2 " - " $3}') menu_options+=( "${var}" ) - done < ${options} + done < "${options}" menu_options+=( "Cancel" ) select option in "${menu_options[@]}"; do if [ -n "${option}" ]&&[ "${option}" != "Cancel" ]; then diff --git a/tests/tests_mcserver.sh b/tests/tests_mcserver.sh index 7853a9690..df76274fb 100644 --- a/tests/tests_mcserver.sh +++ b/tests/tests_mcserver.sh @@ -160,7 +160,7 @@ fn_install_menu_bash() { while read -r line || [[ -n "${line}" ]]; do var=$(echo "${line}" | awk -F "," '{print $2 " - " $3}') menu_options+=( "${var}" ) - done < ${options} + done < "${options}" menu_options+=( "Cancel" ) select option in "${menu_options[@]}"; do if [ -n "${option}" ]&&[ "${option}" != "Cancel" ]; then diff --git a/tests/tests_ts3server.sh b/tests/tests_ts3server.sh index b6bbd5edc..c0d257059 100644 --- a/tests/tests_ts3server.sh +++ b/tests/tests_ts3server.sh @@ -160,7 +160,7 @@ fn_install_menu_bash() { while read -r line || [[ -n "${line}" ]]; do var=$(echo "${line}" | awk -F "," '{print $2 " - " $3}') menu_options+=( "${var}" ) - done < ${options} + done < "${options}" menu_options+=( "Cancel" ) select option in "${menu_options[@]}"; do if [ -n "${option}" ]&&[ "${option}" != "Cancel" ]; then From b5a33de1f64c89067d1641a931978da9d050ed48 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Sun, 1 Sep 2019 18:54:41 +0100 Subject: [PATCH 157/534] v19.10.0 --- linuxgsm.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/linuxgsm.sh b/linuxgsm.sh index cc9ec81be..c709934d6 100755 --- a/linuxgsm.sh +++ b/linuxgsm.sh @@ -20,7 +20,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="v19.9.0" +version="v19.10.0" shortname="core" gameservername="core" rootdir="$(dirname "$(readlink -f "${BASH_SOURCE[0]}")")" From 641b1a2df051708e2df905231804bc3c3ff4928b Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Sun, 1 Sep 2019 18:54:57 +0100 Subject: [PATCH 158/534] v19.10.0 --- linuxgsm.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/linuxgsm.sh b/linuxgsm.sh index cc9ec81be..c709934d6 100755 --- a/linuxgsm.sh +++ b/linuxgsm.sh @@ -20,7 +20,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="v19.9.0" +version="v19.10.0" shortname="core" gameservername="core" rootdir="$(dirname "$(readlink -f "${BASH_SOURCE[0]}")")" From a8d3fafe85c4c389af940fa500c33cc6017f305d Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Fri, 13 Sep 2019 20:07:25 +0100 Subject: [PATCH 159/534] v19.10.1 * fix(rustserver): new oxide download link for linux build 06.09.2019 (#2500) --- lgsm/functions/mods_list.sh | 4 ++-- linuxgsm.sh | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/lgsm/functions/mods_list.sh b/lgsm/functions/mods_list.sh index c0d240e41..0be790e7b 100644 --- a/lgsm/functions/mods_list.sh +++ b/lgsm/functions/mods_list.sh @@ -37,7 +37,7 @@ get5latestfile="$(echo "${get5scrapepath}" | xargs -n 1 -I @ sh -c "echo "basena get5downloadurl="https://ci.splewis.net/job/get5/lastSuccessfulBuild/artifact/${get5scrapepath}" get5url="${get5downloadurl}" # Oxide -oxiderustlatestlink="$(curl -sL https://api.github.com/repos/theumod/umod.rust/releases/latest | grep browser_download_url | cut -d '"' -f 4)" +oxiderustlatestlink="https://umod.org/games/rust/download/develop" # fix for linux build 06.09.2019 oxidehurtworldlatestlink="$(curl -sL https://api.github.com/repos/OxideMod/Oxide.Hurtworld/releases/latest | grep browser_download_url | cut -d '"' -f 4 | grep "Oxide.Hurtworld.zip")" oxidesdtdlatestlink="$(curl -sL https://api.github.com/repos/OxideMod/Oxide.SevenDaysToDie/releases/latest | grep browser_download_url | cut -d '"' -f 4)" @@ -92,7 +92,7 @@ mod_info_darkrpmodification=( MOD "darkrpmodification" "DarkRP Modification" "ht # Oxidemod -mod_info_rustoxide=( MOD "rustoxide" "Oxide for Rust" "${oxiderustlatestlink}" "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_rustoxide=( MOD "rustoxide" "Oxide for Rust" "${oxiderustlatestlink}" "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" "${oxidehurtworldlatestlink}" "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" "${oxidesdtdlatestlink}" "Oxide.SevenDaysToDie.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" ) diff --git a/linuxgsm.sh b/linuxgsm.sh index c709934d6..41f8cf2d1 100755 --- a/linuxgsm.sh +++ b/linuxgsm.sh @@ -20,7 +20,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="v19.10.0" +version="v19.10.1" shortname="core" gameservername="core" rootdir="$(dirname "$(readlink -f "${BASH_SOURCE[0]}")")" From 89387aa346c490da9b5645d6a899cea151e9153f Mon Sep 17 00:00:00 2001 From: Christian Date: Fri, 20 Sep 2019 22:45:56 +0200 Subject: [PATCH 160/534] fix(utserver): remove SteamCMD auth requirement 32-bit workaround (#2516) --- lgsm/config-default/config-lgsm/untserver/_default.cfg | 4 ---- lgsm/functions/install_server_files.sh | 3 --- 2 files changed, 7 deletions(-) diff --git a/lgsm/config-default/config-lgsm/untserver/_default.cfg b/lgsm/config-default/config-lgsm/untserver/_default.cfg index b65a45510..16179473a 100644 --- a/lgsm/config-default/config-lgsm/untserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/untserver/_default.cfg @@ -14,10 +14,6 @@ port="27015" maxplayers="20" defaultmap="pei" -## SteamCMD Login | https://github.com/GameServerManagers/LinuxGSM/wiki/SteamCMD#steamcmd-login -steamuser="username" -steampass='password' - ## Server Start Command | https://docs.linuxgsm.com/configuration/start-parameters#additional-parameters # Parameters are changed in game.ini and engine.ini (Location: ${systemdir}/Saved/Config/LinuxServer) diff --git a/lgsm/functions/install_server_files.sh b/lgsm/functions/install_server_files.sh index 295a81cd7..4046798c0 100644 --- a/lgsm/functions/install_server_files.sh +++ b/lgsm/functions/install_server_files.sh @@ -104,9 +104,6 @@ fn_install_server_files_steamcmd(){ if [ "${appid}" == "90" ]; then ${unbuffer} ./steamcmd.sh +login "${steamuser}" "${steampass}" +force_install_dir "${serverfiles}" +app_set_config 90 mod "${appidmod}" +app_update "${appid}" ${branch} +quit local exitcode=$? - elif [ "${shortname}" == "unt" ]; then - ${unbuffer} ./steamcmd.sh +@sSteamCmdForcePlatformBitness 32 +login "${steamuser}" "${steampass}" +force_install_dir "${serverfiles}" +app_update "${appid}" ${branch} validate +quit - local exitcode=$? else ${unbuffer} ./steamcmd.sh +login "${steamuser}" "${steampass}" +force_install_dir "${serverfiles}" +app_update "${appid}" ${branch} +quit local exitcode=$? From 316a2ba9a5b543cc78c0cc10067f9f412b0238c0 Mon Sep 17 00:00:00 2001 From: Frisasky Date: Sat, 21 Sep 2019 04:47:01 +0800 Subject: [PATCH 161/534] fix(doiserver): refactor workshop support (#2511) --- lgsm/config-default/config-lgsm/doiserver/_default.cfg | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/lgsm/config-default/config-lgsm/doiserver/_default.cfg b/lgsm/config-default/config-lgsm/doiserver/_default.cfg index 59531d02d..279444eef 100644 --- a/lgsm/config-default/config-lgsm/doiserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/doiserver/_default.cfg @@ -13,14 +13,13 @@ ip="0.0.0.0" port="27015" clientport="27005" sourcetvport="27020" -defaultmap="bastogne" +defaultmap="bastogne stronghold" maxplayers="32" tickrate="64" -workshop="0" ## Server Start Command | https://docs.linuxgsm.com/configuration/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}" +parms="-game doi -strictportbind -ip ${ip} -port ${port} +clientport ${clientport} +tv_port ${sourcetvport} -tickrate ${tickrate} +map ${defaultmap} +servercfgfile ${servercfg} -maxplayers ${maxplayers} -workshop" } #### LinuxGSM Settings #### From 400fa256b67eefd650f74435f7660bbed7cf66f9 Mon Sep 17 00:00:00 2001 From: Frisasky Date: Fri, 13 Sep 2019 17:02:28 +0800 Subject: [PATCH 162/534] fix typo --- 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 7dfb31378..33779d1c4 100644 --- a/lgsm/functions/install_config.sh +++ b/lgsm/functions/install_config.sh @@ -186,7 +186,7 @@ elif [ "${shortname}" == "bt" ]; then fn_fetch_default_config fn_default_config_remote fn_set_config_vars -elif [ "${shortname}" == "Battalion 1944" ]; then +elif [ "${shortname}" == "bt1944" ]; then gamedirname="Battalion1944" fn_check_cfgdir array_configs+=( DefaultGame.ini ) From 7c9a4f7d8283cc6b0e3a5dc1e386a64df0f186db Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Fri, 20 Sep 2019 23:25:23 +0100 Subject: [PATCH 163/534] feat(stop): stop type can now be set in _default.cfg (#2520) --- .../config-lgsm/ahlserver/_default.cfg | 13 +++ .../config-lgsm/arkserver/_default.cfg | 13 +++ .../config-lgsm/arma3server/_default.cfg | 13 +++ .../config-lgsm/bb2server/_default.cfg | 13 +++ .../config-lgsm/bbserver/_default.cfg | 13 +++ .../config-lgsm/bdserver/_default.cfg | 13 +++ .../config-lgsm/bf1942server/_default.cfg | 13 +++ .../config-lgsm/bmdmserver/_default.cfg | 13 +++ .../config-lgsm/boserver/_default.cfg | 13 +++ .../config-lgsm/bsserver/_default.cfg | 13 +++ .../config-lgsm/bt1944server/_default.cfg | 13 +++ .../config-lgsm/btserver/_default.cfg | 13 +++ .../config-lgsm/ccserver/_default.cfg | 13 +++ .../config-lgsm/cod2server/_default.cfg | 13 +++ .../config-lgsm/cod4server/_default.cfg | 13 +++ .../config-lgsm/codserver/_default.cfg | 13 +++ .../config-lgsm/coduoserver/_default.cfg | 13 +++ .../config-lgsm/codwawserver/_default.cfg | 13 +++ .../config-lgsm/csczserver/_default.cfg | 13 +++ .../config-lgsm/csgoserver/_default.cfg | 13 +++ .../config-lgsm/csserver/_default.cfg | 13 +++ .../config-lgsm/cssserver/_default.cfg | 13 +++ .../config-lgsm/dabserver/_default.cfg | 13 +++ .../config-lgsm/dmcserver/_default.cfg | 13 +++ .../config-lgsm/dodserver/_default.cfg | 13 +++ .../config-lgsm/dodsserver/_default.cfg | 13 +++ .../config-lgsm/doiserver/_default.cfg | 13 +++ .../config-lgsm/dstserver/_default.cfg | 13 +++ .../config-lgsm/dysserver/_default.cfg | 13 +++ .../config-lgsm/ecoserver/_default.cfg | 13 +++ .../config-lgsm/emserver/_default.cfg | 13 +++ .../config-lgsm/etlserver/_default.cfg | 13 +++ .../config-lgsm/fctrserver/_default.cfg | 13 +++ .../config-lgsm/fofserver/_default.cfg | 13 +++ .../config-lgsm/gesserver/_default.cfg | 13 +++ .../config-lgsm/gmodserver/_default.cfg | 13 +++ .../config-lgsm/hl2dmserver/_default.cfg | 13 +++ .../config-lgsm/hldmserver/_default.cfg | 13 +++ .../config-lgsm/hldmsserver/_default.cfg | 13 +++ .../config-lgsm/hwserver/_default.cfg | 13 +++ .../config-lgsm/insserver/_default.cfg | 13 +++ .../config-lgsm/inssserver/_default.cfg | 13 +++ .../config-lgsm/iosserver/_default.cfg | 13 +++ .../config-lgsm/jc2server/_default.cfg | 13 +++ .../config-lgsm/jc3server/_default.cfg | 13 +++ .../config-lgsm/kf2server/_default.cfg | 13 +++ .../config-lgsm/kfserver/_default.cfg | 13 +++ .../config-lgsm/l4d2server/_default.cfg | 13 +++ .../config-lgsm/l4dserver/_default.cfg | 13 +++ .../config-lgsm/mcserver/_default.cfg | 13 +++ .../config-lgsm/mhserver/_default.cfg | 13 +++ .../config-lgsm/mtaserver/_default.cfg | 13 +++ .../config-lgsm/mumbleserver/_default.cfg | 13 +++ .../config-lgsm/ndserver/_default.cfg | 13 +++ .../config-lgsm/nmrihserver/_default.cfg | 13 +++ .../config-lgsm/ns2cserver/_default.cfg | 13 +++ .../config-lgsm/ns2server/_default.cfg | 13 +++ .../config-lgsm/nsserver/_default.cfg | 13 +++ .../config-lgsm/opforserver/_default.cfg | 13 +++ .../config-lgsm/pcserver/_default.cfg | 13 +++ .../config-lgsm/pstbsserver/_default.cfg | 13 +++ .../config-lgsm/pvkiiserver/_default.cfg | 13 +++ .../config-lgsm/pzserver/_default.cfg | 13 +++ .../config-lgsm/q2server/_default.cfg | 13 +++ .../config-lgsm/q3server/_default.cfg | 13 +++ .../config-lgsm/qlserver/_default.cfg | 13 +++ .../config-lgsm/qwserver/_default.cfg | 13 +++ .../config-lgsm/ricochetserver/_default.cfg | 13 +++ .../config-lgsm/roserver/_default.cfg | 13 +++ .../config-lgsm/rtcwserver/_default.cfg | 13 +++ .../config-lgsm/rustserver/_default.cfg | 13 +++ .../config-lgsm/rwserver/_default.cfg | 13 +++ .../config-lgsm/sampserver/_default.cfg | 13 +++ .../config-lgsm/sbotsserver/_default.cfg | 13 +++ .../config-lgsm/sbserver/_default.cfg | 13 +++ .../config-lgsm/sdtdserver/_default.cfg | 13 +++ .../config-lgsm/sfcserver/_default.cfg | 13 +++ .../config-lgsm/sof2server/_default.cfg | 13 +++ .../config-lgsm/solserver/_default.cfg | 13 +++ .../config-lgsm/squadserver/_default.cfg | 13 +++ .../config-lgsm/ss3server/_default.cfg | 13 +++ .../config-lgsm/stserver/_default.cfg | 13 +++ .../config-lgsm/svenserver/_default.cfg | 13 +++ .../config-lgsm/terrariaserver/_default.cfg | 13 +++ .../config-lgsm/tf2server/_default.cfg | 13 +++ .../config-lgsm/tfcserver/_default.cfg | 13 +++ .../config-lgsm/ts3server/_default.cfg | 13 +++ .../config-lgsm/tsserver/_default.cfg | 13 +++ .../config-lgsm/tuserver/_default.cfg | 13 +++ .../config-lgsm/twserver/_default.cfg | 13 +++ .../config-lgsm/untserver/_default.cfg | 13 +++ .../config-lgsm/ut2k4server/_default.cfg | 13 +++ .../config-lgsm/ut3server/_default.cfg | 13 +++ .../config-lgsm/ut99server/_default.cfg | 13 +++ .../config-lgsm/utserver/_default.cfg | 13 +++ .../config-lgsm/vsserver/_default.cfg | 13 +++ .../config-lgsm/wetserver/_default.cfg | 13 +++ .../config-lgsm/wurmserver/_default.cfg | 13 +++ .../config-lgsm/zmrserver/_default.cfg | 13 +++ .../config-lgsm/zpsserver/_default.cfg | 13 +++ lgsm/functions/command_stop.sh | 88 +++++-------------- lgsm/functions/info_config.sh | 2 +- 102 files changed, 1325 insertions(+), 65 deletions(-) diff --git a/lgsm/config-default/config-lgsm/ahlserver/_default.cfg b/lgsm/config-default/config-lgsm/ahlserver/_default.cfg index bee9cbcc3..b56b231b6 100644 --- a/lgsm/config-default/config-lgsm/ahlserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/ahlserver/_default.cfg @@ -105,6 +105,19 @@ branch="" # Master Server | https://docs.linuxgsm.com/steamcmd/steam-master-server steammaster="true" +# Stop Mode | https://docs.linuxgsm.com/steamcmd/stopmode +# 1: tmux kill +# 2: CTRL+c +# 3: quit +# 4: quit 120s +# 5: stop +# 6: q +# 7: exit +# 8: 7 Days to Die +# 9: Gold Source +# 10: Teamspeak 3 +stopmode="9" + ## LinuxGSM Server Details # Do not edit gamename="Action half-life" diff --git a/lgsm/config-default/config-lgsm/arkserver/_default.cfg b/lgsm/config-default/config-lgsm/arkserver/_default.cfg index 728a9f68a..44ed4cb74 100644 --- a/lgsm/config-default/config-lgsm/arkserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/arkserver/_default.cfg @@ -106,6 +106,19 @@ branch="" # Master Server | https://docs.linuxgsm.com/steamcmd/steam-master-server steammaster="true" +# Stop Mode | https://docs.linuxgsm.com/steamcmd/stopmode +# 1: tmux kill +# 2: CTRL+c +# 3: quit +# 4: quit 120s +# 5: stop +# 6: q +# 7: exit +# 8: 7 Days to Die +# 9: Gold Source +# 10: Teamspeak 3 +stopmode="2" + ## LinuxGSM Server Details # Do not edit gamename="ARK: Survival Evolved" diff --git a/lgsm/config-default/config-lgsm/arma3server/_default.cfg b/lgsm/config-default/config-lgsm/arma3server/_default.cfg index 828bbdd04..13d14571a 100644 --- a/lgsm/config-default/config-lgsm/arma3server/_default.cfg +++ b/lgsm/config-default/config-lgsm/arma3server/_default.cfg @@ -120,6 +120,19 @@ branch="" # Master Server | https://docs.linuxgsm.com/steamcmd/steam-master-server steammaster="false" +# Stop Mode | https://docs.linuxgsm.com/steamcmd/stopmode +# 1: tmux kill +# 2: CTRL+c +# 3: quit +# 4: quit 120s +# 5: stop +# 6: q +# 7: exit +# 8: 7 Days to Die +# 9: Gold Source +# 10: Teamspeak 3 +stopmode="2" + ## LinuxGSM Server Details # Do not edit gamename="ARMA 3" diff --git a/lgsm/config-default/config-lgsm/bb2server/_default.cfg b/lgsm/config-default/config-lgsm/bb2server/_default.cfg index 0abc8c5ae..15a60ffcc 100644 --- a/lgsm/config-default/config-lgsm/bb2server/_default.cfg +++ b/lgsm/config-default/config-lgsm/bb2server/_default.cfg @@ -110,6 +110,19 @@ branch="" # Master Server | https://docs.linuxgsm.com/steamcmd/steam-master-server steammaster="true" +# Stop Mode | https://docs.linuxgsm.com/steamcmd/stopmode +# 1: tmux kill +# 2: CTRL+c +# 3: quit +# 4: quit 120s +# 5: stop +# 6: q +# 7: exit +# 8: 7 Days to Die +# 9: Gold Source +# 10: Teamspeak 3 +stopmode="3" + ## LinuxGSM Server Details # Do not edit gamename="BrainBread 2" diff --git a/lgsm/config-default/config-lgsm/bbserver/_default.cfg b/lgsm/config-default/config-lgsm/bbserver/_default.cfg index b299f8fb6..dc1f40bfe 100644 --- a/lgsm/config-default/config-lgsm/bbserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/bbserver/_default.cfg @@ -105,6 +105,19 @@ branch="" # Master Server | https://docs.linuxgsm.com/steamcmd/steam-master-server steammaster="true" +# Stop Mode | https://docs.linuxgsm.com/steamcmd/stopmode +# 1: tmux kill +# 2: CTRL+c +# 3: quit +# 4: quit 120s +# 5: stop +# 6: q +# 7: exit +# 8: 7 Days to Die +# 9: Gold Source +# 10: Teamspeak 3 +stopmode="9" + ## LinuxGSM Server Details # Do not edit gamename="BrainBread" diff --git a/lgsm/config-default/config-lgsm/bdserver/_default.cfg b/lgsm/config-default/config-lgsm/bdserver/_default.cfg index f4314d1f0..503917509 100644 --- a/lgsm/config-default/config-lgsm/bdserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/bdserver/_default.cfg @@ -104,6 +104,19 @@ branch="" # Master Server | https://docs.linuxgsm.com/steamcmd/steam-master-server steammaster="true" +# Stop Mode | https://docs.linuxgsm.com/steamcmd/stopmode +# 1: tmux kill +# 2: CTRL+c +# 3: quit +# 4: quit 120s +# 5: stop +# 6: q +# 7: exit +# 8: 7 Days to Die +# 9: Gold Source +# 10: Teamspeak 3 +stopmode="9" + ## LinuxGSM Server Details # Do not edit gamename="Base Defense" diff --git a/lgsm/config-default/config-lgsm/bf1942server/_default.cfg b/lgsm/config-default/config-lgsm/bf1942server/_default.cfg index ef1da1ffb..abc0416de 100644 --- a/lgsm/config-default/config-lgsm/bf1942server/_default.cfg +++ b/lgsm/config-default/config-lgsm/bf1942server/_default.cfg @@ -89,6 +89,19 @@ ansi="on" # Message Display Time sleeptime="0.5" +# Stop Mode | https://docs.linuxgsm.com/steamcmd/stopmode +# 1: tmux kill +# 2: CTRL+c +# 3: quit +# 4: quit 120s +# 5: stop +# 6: q +# 7: exit +# 8: 7 Days to Die +# 9: Gold Source +# 10: Teamspeak 3 +stopmode="2" + ## LinuxGSM Server Details # Do not edit gamename="Battlefield: 1942" diff --git a/lgsm/config-default/config-lgsm/bmdmserver/_default.cfg b/lgsm/config-default/config-lgsm/bmdmserver/_default.cfg index 7927bcf90..8f31587da 100644 --- a/lgsm/config-default/config-lgsm/bmdmserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/bmdmserver/_default.cfg @@ -110,6 +110,19 @@ branch="" # Master Server | https://docs.linuxgsm.com/steamcmd/steam-master-server steammaster="true" +# Stop Mode | https://docs.linuxgsm.com/steamcmd/stopmode +# 1: tmux kill +# 2: CTRL+c +# 3: quit +# 4: quit 120s +# 5: stop +# 6: q +# 7: exit +# 8: 7 Days to Die +# 9: Gold Source +# 10: Teamspeak 3 +stopmode="3" + ## LinuxGSM Server Details # Do not edit gamename="Black Mesa: Deathmatch" diff --git a/lgsm/config-default/config-lgsm/boserver/_default.cfg b/lgsm/config-default/config-lgsm/boserver/_default.cfg index b0fe9a3aa..0a7bfec4b 100644 --- a/lgsm/config-default/config-lgsm/boserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/boserver/_default.cfg @@ -103,6 +103,19 @@ branch="" # Master Server | https://docs.linuxgsm.com/steamcmd/steam-master-server steammaster="false" +# Stop Mode | https://docs.linuxgsm.com/steamcmd/stopmode +# 1: tmux kill +# 2: CTRL+c +# 3: quit +# 4: quit 120s +# 5: stop +# 6: q +# 7: exit +# 8: 7 Days to Die +# 9: Gold Source +# 10: Teamspeak 3 +stopmode="2" + ## LinuxGSM Server Details # Do not edit gamename="Ballistic Overkill" diff --git a/lgsm/config-default/config-lgsm/bsserver/_default.cfg b/lgsm/config-default/config-lgsm/bsserver/_default.cfg index a29b6cfda..dced9aa76 100644 --- a/lgsm/config-default/config-lgsm/bsserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/bsserver/_default.cfg @@ -114,6 +114,19 @@ branch="" # Master Server | https://docs.linuxgsm.com/steamcmd/steam-master-server steammaster="true" +# Stop Mode | https://docs.linuxgsm.com/steamcmd/stopmode +# 1: tmux kill +# 2: CTRL+c +# 3: quit +# 4: quit 120s +# 5: stop +# 6: q +# 7: exit +# 8: 7 Days to Die +# 9: Gold Source +# 10: Teamspeak 3 +stopmode="3" + ## LinuxGSM Server Details # Do not edit gamename="Blade Symphony" diff --git a/lgsm/config-default/config-lgsm/bt1944server/_default.cfg b/lgsm/config-default/config-lgsm/bt1944server/_default.cfg index fec39515d..a91e1a481 100644 --- a/lgsm/config-default/config-lgsm/bt1944server/_default.cfg +++ b/lgsm/config-default/config-lgsm/bt1944server/_default.cfg @@ -102,6 +102,19 @@ branch="" # Master Server | https://docs.linuxgsm.com/steamcmd/steam-master-server steammaster="false" +# Stop Mode | https://docs.linuxgsm.com/steamcmd/stopmode +# 1: tmux kill +# 2: CTRL+c +# 3: quit +# 4: quit 120s +# 5: stop +# 6: q +# 7: exit +# 8: 7 Days to Die +# 9: Gold Source +# 10: Teamspeak 3 +stopmode="2" + ## LinuxGSM Server Details # Do not edit gamename="Battalion 1944" diff --git a/lgsm/config-default/config-lgsm/btserver/_default.cfg b/lgsm/config-default/config-lgsm/btserver/_default.cfg index 65925ff2e..cf17a4f21 100644 --- a/lgsm/config-default/config-lgsm/btserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/btserver/_default.cfg @@ -97,6 +97,19 @@ branch="" # Master Server | https://docs.linuxgsm.com/steamcmd/steam-master-server steammaster="true" +# Stop Mode | https://docs.linuxgsm.com/steamcmd/stopmode +# 1: tmux kill +# 2: CTRL+c +# 3: quit +# 4: quit 120s +# 5: stop +# 6: q +# 7: exit +# 8: 7 Days to Die +# 9: Gold Source +# 10: Teamspeak 3 +stopmode="7" + ## LinuxGSM Server Details # Do not edit gamename="Barotrauma" diff --git a/lgsm/config-default/config-lgsm/ccserver/_default.cfg b/lgsm/config-default/config-lgsm/ccserver/_default.cfg index 77d5af934..739020f11 100644 --- a/lgsm/config-default/config-lgsm/ccserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/ccserver/_default.cfg @@ -105,6 +105,19 @@ branch="" # Master Server | https://docs.linuxgsm.com/steamcmd/steam-master-server steammaster="false" +# Stop Mode | https://docs.linuxgsm.com/steamcmd/stopmode +# 1: tmux kill +# 2: CTRL+c +# 3: quit +# 4: quit 120s +# 5: stop +# 6: q +# 7: exit +# 8: 7 Days to Die +# 9: Gold Source +# 10: Teamspeak 3 +stopmode="3" + ## LinuxGSM Server Details # Do not edit gamename="Codename CURE" diff --git a/lgsm/config-default/config-lgsm/cod2server/_default.cfg b/lgsm/config-default/config-lgsm/cod2server/_default.cfg index edc5b087d..fbf559886 100644 --- a/lgsm/config-default/config-lgsm/cod2server/_default.cfg +++ b/lgsm/config-default/config-lgsm/cod2server/_default.cfg @@ -92,6 +92,19 @@ ansi="on" # Message Display Time sleeptime="0.5" +# Stop Mode | https://docs.linuxgsm.com/steamcmd/stopmode +# 1: tmux kill +# 2: CTRL+c +# 3: quit +# 4: quit 120s +# 5: stop +# 6: q +# 7: exit +# 8: 7 Days to Die +# 9: Gold Source +# 10: Teamspeak 3 +stopmode="3" + ## LinuxGSM Server Details # Do not edit gamename="Call of Duty 2" diff --git a/lgsm/config-default/config-lgsm/cod4server/_default.cfg b/lgsm/config-default/config-lgsm/cod4server/_default.cfg index 23cce4a4c..f2837cc5d 100644 --- a/lgsm/config-default/config-lgsm/cod4server/_default.cfg +++ b/lgsm/config-default/config-lgsm/cod4server/_default.cfg @@ -92,6 +92,19 @@ ansi="on" # Message Display Time sleeptime="0.5" +# Stop Mode | https://docs.linuxgsm.com/steamcmd/stopmode +# 1: tmux kill +# 2: CTRL+c +# 3: quit +# 4: quit 120s +# 5: stop +# 6: q +# 7: exit +# 8: 7 Days to Die +# 9: Gold Source +# 10: Teamspeak 3 +stopmode="3" + ## LinuxGSM Server Details # Do not edit gamename="Call of Duty 4" diff --git a/lgsm/config-default/config-lgsm/codserver/_default.cfg b/lgsm/config-default/config-lgsm/codserver/_default.cfg index 41d22bf82..4feec18ba 100644 --- a/lgsm/config-default/config-lgsm/codserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/codserver/_default.cfg @@ -92,6 +92,19 @@ ansi="on" # Message Display Time sleeptime="0.5" +# Stop Mode | https://docs.linuxgsm.com/steamcmd/stopmode +# 1: tmux kill +# 2: CTRL+c +# 3: quit +# 4: quit 120s +# 5: stop +# 6: q +# 7: exit +# 8: 7 Days to Die +# 9: Gold Source +# 10: Teamspeak 3 +stopmode="3" + ## LinuxGSM Server Details # Do not edit gamename="Call of Duty" diff --git a/lgsm/config-default/config-lgsm/coduoserver/_default.cfg b/lgsm/config-default/config-lgsm/coduoserver/_default.cfg index 7664974a0..4ce3f341e 100644 --- a/lgsm/config-default/config-lgsm/coduoserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/coduoserver/_default.cfg @@ -92,6 +92,19 @@ ansi="on" # Message Display Time sleeptime="0.5" +# Stop Mode | https://docs.linuxgsm.com/steamcmd/stopmode +# 1: tmux kill +# 2: CTRL+c +# 3: quit +# 4: quit 120s +# 5: stop +# 6: q +# 7: exit +# 8: 7 Days to Die +# 9: Gold Source +# 10: Teamspeak 3 +stopmode="3" + ## LinuxGSM Server Details # Do not edit gamename="Call of Duty: United Offensive" diff --git a/lgsm/config-default/config-lgsm/codwawserver/_default.cfg b/lgsm/config-default/config-lgsm/codwawserver/_default.cfg index 99732af5d..ebb5bd817 100644 --- a/lgsm/config-default/config-lgsm/codwawserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/codwawserver/_default.cfg @@ -92,6 +92,19 @@ ansi="on" # Message Display Time sleeptime="0.5" +# Stop Mode | https://docs.linuxgsm.com/steamcmd/stopmode +# 1: tmux kill +# 2: CTRL+c +# 3: quit +# 4: quit 120s +# 5: stop +# 6: q +# 7: exit +# 8: 7 Days to Die +# 9: Gold Source +# 10: Teamspeak 3 +stopmode="3" + ## LinuxGSM Server Details # Do not edit gamename="Call of Duty: World at War" diff --git a/lgsm/config-default/config-lgsm/csczserver/_default.cfg b/lgsm/config-default/config-lgsm/csczserver/_default.cfg index 980ab873d..b7dc4c2c4 100644 --- a/lgsm/config-default/config-lgsm/csczserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/csczserver/_default.cfg @@ -105,6 +105,19 @@ branch="" # Master Server | https://docs.linuxgsm.com/steamcmd/steam-master-server steammaster="true" +# Stop Mode | https://docs.linuxgsm.com/steamcmd/stopmode +# 1: tmux kill +# 2: CTRL+c +# 3: quit +# 4: quit 120s +# 5: stop +# 6: q +# 7: exit +# 8: 7 Days to Die +# 9: Gold Source +# 10: Teamspeak 3 +stopmode="9" + ## LinuxGSM Server Details # Do not edit gamename="Counter-Strike: Condition Zero" diff --git a/lgsm/config-default/config-lgsm/csgoserver/_default.cfg b/lgsm/config-default/config-lgsm/csgoserver/_default.cfg index 5dac93530..0abcf5a02 100644 --- a/lgsm/config-default/config-lgsm/csgoserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/csgoserver/_default.cfg @@ -130,6 +130,19 @@ branch="" # Master Server | https://docs.linuxgsm.com/steamcmd/steam-master-server steammaster="true" +# Stop Mode | https://docs.linuxgsm.com/steamcmd/stopmode +# 1: tmux kill +# 2: CTRL+c +# 3: quit +# 4: quit 120s +# 5: stop +# 6: q +# 7: exit +# 8: 7 Days to Die +# 9: Gold Source +# 10: Teamspeak 3 +stopmode="3" + ## LinuxGSM Server Details # Do not edit gamename="Counter-Strike: Global Offensive" diff --git a/lgsm/config-default/config-lgsm/csserver/_default.cfg b/lgsm/config-default/config-lgsm/csserver/_default.cfg index 6875f9f5b..2fadd3f15 100644 --- a/lgsm/config-default/config-lgsm/csserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/csserver/_default.cfg @@ -105,6 +105,19 @@ branch="" # Master Server | https://docs.linuxgsm.com/steamcmd/steam-master-server steammaster="true" +# Stop Mode | https://docs.linuxgsm.com/steamcmd/stopmode +# 1: tmux kill +# 2: CTRL+c +# 3: quit +# 4: quit 120s +# 5: stop +# 6: q +# 7: exit +# 8: 7 Days to Die +# 9: Gold Source +# 10: Teamspeak 3 +stopmode="9" + ## LinuxGSM Server Details # Do not edit gamename="Counter-Strike 1.6" diff --git a/lgsm/config-default/config-lgsm/cssserver/_default.cfg b/lgsm/config-default/config-lgsm/cssserver/_default.cfg index 4f54ce5f2..10f3fbca6 100644 --- a/lgsm/config-default/config-lgsm/cssserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/cssserver/_default.cfg @@ -110,6 +110,19 @@ branch="" # Master Server | https://docs.linuxgsm.com/steamcmd/steam-master-server steammaster="true" +# Stop Mode | https://docs.linuxgsm.com/steamcmd/stopmode +# 1: tmux kill +# 2: CTRL+c +# 3: quit +# 4: quit 120s +# 5: stop +# 6: q +# 7: exit +# 8: 7 Days to Die +# 9: Gold Source +# 10: Teamspeak 3 +stopmode="3" + ## LinuxGSM Server Details # Do not edit gamename="Counter-Strike: Source" diff --git a/lgsm/config-default/config-lgsm/dabserver/_default.cfg b/lgsm/config-default/config-lgsm/dabserver/_default.cfg index c9e202985..9e3c640b5 100644 --- a/lgsm/config-default/config-lgsm/dabserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/dabserver/_default.cfg @@ -105,6 +105,19 @@ branch="" # Master Server | https://docs.linuxgsm.com/steamcmd/steam-master-server steammaster="true" +# Stop Mode | https://docs.linuxgsm.com/steamcmd/stopmode +# 1: tmux kill +# 2: CTRL+c +# 3: quit +# 4: quit 120s +# 5: stop +# 6: q +# 7: exit +# 8: 7 Days to Die +# 9: Gold Source +# 10: Teamspeak 3 +stopmode="3" + ## LinuxGSM Server Details # Do not edit gamename="Double Action: Boogaloo" diff --git a/lgsm/config-default/config-lgsm/dmcserver/_default.cfg b/lgsm/config-default/config-lgsm/dmcserver/_default.cfg index b67b2650a..8b80399cd 100644 --- a/lgsm/config-default/config-lgsm/dmcserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/dmcserver/_default.cfg @@ -105,6 +105,19 @@ branch="" # Master Server | https://docs.linuxgsm.com/steamcmd/steam-master-server steammaster="true" +# Stop Mode | https://docs.linuxgsm.com/steamcmd/stopmode +# 1: tmux kill +# 2: CTRL+c +# 3: quit +# 4: quit 120s +# 5: stop +# 6: q +# 7: exit +# 8: 7 Days to Die +# 9: Gold Source +# 10: Teamspeak 3 +stopmode="9" + ## LinuxGSM Server Details # Do not edit gamename="Deathmatch Classic" diff --git a/lgsm/config-default/config-lgsm/dodserver/_default.cfg b/lgsm/config-default/config-lgsm/dodserver/_default.cfg index 13f174eab..e274aeb25 100644 --- a/lgsm/config-default/config-lgsm/dodserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/dodserver/_default.cfg @@ -105,6 +105,19 @@ branch="" # Master Server | https://docs.linuxgsm.com/steamcmd/steam-master-server steammaster="true" +# Stop Mode | https://docs.linuxgsm.com/steamcmd/stopmode +# 1: tmux kill +# 2: CTRL+c +# 3: quit +# 4: quit 120s +# 5: stop +# 6: q +# 7: exit +# 8: 7 Days to Die +# 9: Gold Source +# 10: Teamspeak 3 +stopmode="9" + ## LinuxGSM Server Details # Do not edit gamename="Day of Defeat" diff --git a/lgsm/config-default/config-lgsm/dodsserver/_default.cfg b/lgsm/config-default/config-lgsm/dodsserver/_default.cfg index 1f94decf0..fb4ab1d66 100644 --- a/lgsm/config-default/config-lgsm/dodsserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/dodsserver/_default.cfg @@ -105,6 +105,19 @@ branch="" # Master Server | https://docs.linuxgsm.com/steamcmd/steam-master-server steammaster="true" +# Stop Mode | https://docs.linuxgsm.com/steamcmd/stopmode +# 1: tmux kill +# 2: CTRL+c +# 3: quit +# 4: quit 120s +# 5: stop +# 6: q +# 7: exit +# 8: 7 Days to Die +# 9: Gold Source +# 10: Teamspeak 3 +stopmode="3" + ## LinuxGSM Server Details # Do not edit gamename="Day of Defeat: Source" diff --git a/lgsm/config-default/config-lgsm/doiserver/_default.cfg b/lgsm/config-default/config-lgsm/doiserver/_default.cfg index 279444eef..570c41631 100644 --- a/lgsm/config-default/config-lgsm/doiserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/doiserver/_default.cfg @@ -106,6 +106,19 @@ branch="" # Master Server | https://docs.linuxgsm.com/steamcmd/steam-master-server steammaster="true" +# Stop Mode | https://docs.linuxgsm.com/steamcmd/stopmode +# 1: tmux kill +# 2: CTRL+c +# 3: quit +# 4: quit 120s +# 5: stop +# 6: q +# 7: exit +# 8: 7 Days to Die +# 9: Gold Source +# 10: Teamspeak 3 +stopmode="3" + ## LinuxGSM Server Details # Do not edit gamename="Day of Infamy" diff --git a/lgsm/config-default/config-lgsm/dstserver/_default.cfg b/lgsm/config-default/config-lgsm/dstserver/_default.cfg index 0265ebb23..b2aec6c44 100644 --- a/lgsm/config-default/config-lgsm/dstserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/dstserver/_default.cfg @@ -108,6 +108,19 @@ branch="" # Master Server | https://docs.linuxgsm.com/steamcmd/steam-master-server steammaster="false" +# Stop Mode | https://docs.linuxgsm.com/steamcmd/stopmode +# 1: tmux kill +# 2: CTRL+c +# 3: quit +# 4: quit 120s +# 5: stop +# 6: q +# 7: exit +# 8: 7 Days to Die +# 9: Gold Source +# 10: Teamspeak 3 +stopmode="2" + ## LinuxGSM Server Details # Do not edit gamename="Don't Starve Together" diff --git a/lgsm/config-default/config-lgsm/dysserver/_default.cfg b/lgsm/config-default/config-lgsm/dysserver/_default.cfg index 8e7bfb32a..20d93aeff 100644 --- a/lgsm/config-default/config-lgsm/dysserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/dysserver/_default.cfg @@ -110,6 +110,19 @@ branch="" # Master Server | https://docs.linuxgsm.com/steamcmd/steam-master-server steammaster="true" +# Stop Mode | https://docs.linuxgsm.com/steamcmd/stopmode +# 1: tmux kill +# 2: CTRL+c +# 3: quit +# 4: quit 120s +# 5: stop +# 6: q +# 7: exit +# 8: 7 Days to Die +# 9: Gold Source +# 10: Teamspeak 3 +stopmode="3" + ## LinuxGSM Server Details # Do not edit gamename="Dystopia" diff --git a/lgsm/config-default/config-lgsm/ecoserver/_default.cfg b/lgsm/config-default/config-lgsm/ecoserver/_default.cfg index 5387a83c8..bfd875640 100644 --- a/lgsm/config-default/config-lgsm/ecoserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/ecoserver/_default.cfg @@ -93,6 +93,19 @@ branch="" # Master Server | https://docs.linuxgsm.com/steamcmd/steam-master-server steammaster="false" +# Stop Mode | https://docs.linuxgsm.com/steamcmd/stopmode +# 1: tmux kill +# 2: CTRL+c +# 3: quit +# 4: quit 120s +# 5: stop +# 6: q +# 7: exit +# 8: 7 Days to Die +# 9: Gold Source +# 10: Teamspeak 3 +stopmode="2" + ## LinuxGSM Server Details # Do not edit gamename="Eco" diff --git a/lgsm/config-default/config-lgsm/emserver/_default.cfg b/lgsm/config-default/config-lgsm/emserver/_default.cfg index 70c491179..6a333dec6 100644 --- a/lgsm/config-default/config-lgsm/emserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/emserver/_default.cfg @@ -110,6 +110,19 @@ branch="" # Master Server | https://docs.linuxgsm.com/steamcmd/steam-master-server steammaster="true" +# Stop Mode | https://docs.linuxgsm.com/steamcmd/stopmode +# 1: tmux kill +# 2: CTRL+c +# 3: quit +# 4: quit 120s +# 5: stop +# 6: q +# 7: exit +# 8: 7 Days to Die +# 9: Gold Source +# 10: Teamspeak 3 +stopmode="3" + ## LinuxGSM Server Details # Do not edit gamename="Empires Mod" diff --git a/lgsm/config-default/config-lgsm/etlserver/_default.cfg b/lgsm/config-default/config-lgsm/etlserver/_default.cfg index efdb506bc..f79e4770e 100644 --- a/lgsm/config-default/config-lgsm/etlserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/etlserver/_default.cfg @@ -86,6 +86,19 @@ ansi="on" # Message Display Time sleeptime="0.5" +# Stop Mode | https://docs.linuxgsm.com/steamcmd/stopmode +# 1: tmux kill +# 2: CTRL+c +# 3: quit +# 4: quit 120s +# 5: stop +# 6: q +# 7: exit +# 8: 7 Days to Die +# 9: Gold Source +# 10: Teamspeak 3 +stopmode="3" + ## LinuxGSM Server Details # Do not edit gamename="ET: Legacy" diff --git a/lgsm/config-default/config-lgsm/fctrserver/_default.cfg b/lgsm/config-default/config-lgsm/fctrserver/_default.cfg index deaf3bce0..d33d407dc 100644 --- a/lgsm/config-default/config-lgsm/fctrserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/fctrserver/_default.cfg @@ -97,6 +97,19 @@ ansi="on" # Message Display Time sleeptime="0.5" +# Stop Mode | https://docs.linuxgsm.com/steamcmd/stopmode +# 1: tmux kill +# 2: CTRL+c +# 3: quit +# 4: quit 120s +# 5: stop +# 6: q +# 7: exit +# 8: 7 Days to Die +# 9: Gold Source +# 10: Teamspeak 3 +stopmode="2" + ## LinuxGSM Server Details # Do not edit gamename="Factorio" diff --git a/lgsm/config-default/config-lgsm/fofserver/_default.cfg b/lgsm/config-default/config-lgsm/fofserver/_default.cfg index f4cc72c11..f1884e523 100644 --- a/lgsm/config-default/config-lgsm/fofserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/fofserver/_default.cfg @@ -105,6 +105,19 @@ branch="" # Master Server | https://docs.linuxgsm.com/steamcmd/steam-master-server steammaster="true" +# Stop Mode | https://docs.linuxgsm.com/steamcmd/stopmode +# 1: tmux kill +# 2: CTRL+c +# 3: quit +# 4: quit 120s +# 5: stop +# 6: q +# 7: exit +# 8: 7 Days to Die +# 9: Gold Source +# 10: Teamspeak 3 +stopmode="3" + ## LinuxGSM Server Details # Do not edit gamename="Fistful of Frags" diff --git a/lgsm/config-default/config-lgsm/gesserver/_default.cfg b/lgsm/config-default/config-lgsm/gesserver/_default.cfg index 6f2426524..f9cfea98f 100644 --- a/lgsm/config-default/config-lgsm/gesserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/gesserver/_default.cfg @@ -105,6 +105,19 @@ branch="" # Master Server | https://docs.linuxgsm.com/steamcmd/steam-master-server steammaster="true" +# Stop Mode | https://docs.linuxgsm.com/steamcmd/stopmode +# 1: tmux kill +# 2: CTRL+c +# 3: quit +# 4: quit 120s +# 5: stop +# 6: q +# 7: exit +# 8: 7 Days to Die +# 9: Gold Source +# 10: Teamspeak 3 +stopmode="3" + ## LinuxGSM Server Details # Do not edit gamename="GoldenEye: Source" diff --git a/lgsm/config-default/config-lgsm/gmodserver/_default.cfg b/lgsm/config-default/config-lgsm/gmodserver/_default.cfg index 8901aaea5..8bc03daa7 100644 --- a/lgsm/config-default/config-lgsm/gmodserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/gmodserver/_default.cfg @@ -121,6 +121,19 @@ branch="" # Master Server | https://docs.linuxgsm.com/steamcmd/steam-master-server steammaster="true" +# Stop Mode | https://docs.linuxgsm.com/steamcmd/stopmode +# 1: tmux kill +# 2: CTRL+c +# 3: quit +# 4: quit 120s +# 5: stop +# 6: q +# 7: exit +# 8: 7 Days to Die +# 9: Gold Source +# 10: Teamspeak 3 +stopmode="3" + ## LinuxGSM Server Details # Do not edit gamename="Garry's Mod" diff --git a/lgsm/config-default/config-lgsm/hl2dmserver/_default.cfg b/lgsm/config-default/config-lgsm/hl2dmserver/_default.cfg index 03c867f87..8c421c949 100644 --- a/lgsm/config-default/config-lgsm/hl2dmserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/hl2dmserver/_default.cfg @@ -105,6 +105,19 @@ branch="" # Master Server | https://docs.linuxgsm.com/steamcmd/steam-master-server steammaster="true" +# Stop Mode | https://docs.linuxgsm.com/steamcmd/stopmode +# 1: tmux kill +# 2: CTRL+c +# 3: quit +# 4: quit 120s +# 5: stop +# 6: q +# 7: exit +# 8: 7 Days to Die +# 9: Gold Source +# 10: Teamspeak 3 +stopmode="3" + ## LinuxGSM Server Details # Do not edit gamename="Half Life 2: Deathmatch" diff --git a/lgsm/config-default/config-lgsm/hldmserver/_default.cfg b/lgsm/config-default/config-lgsm/hldmserver/_default.cfg index 52c2aa398..47b102e99 100644 --- a/lgsm/config-default/config-lgsm/hldmserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/hldmserver/_default.cfg @@ -104,6 +104,19 @@ branch="" # Master Server | https://docs.linuxgsm.com/steamcmd/steam-master-server steammaster="true" +# Stop Mode | https://docs.linuxgsm.com/steamcmd/stopmode +# 1: tmux kill +# 2: CTRL+c +# 3: quit +# 4: quit 120s +# 5: stop +# 6: q +# 7: exit +# 8: 7 Days to Die +# 9: Gold Source +# 10: Teamspeak 3 +stopmode="9" + ## LinuxGSM Server Details # Do not edit gamename="Half Life: Deathmatch" diff --git a/lgsm/config-default/config-lgsm/hldmsserver/_default.cfg b/lgsm/config-default/config-lgsm/hldmsserver/_default.cfg index 798a85107..a53cb0979 100644 --- a/lgsm/config-default/config-lgsm/hldmsserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/hldmsserver/_default.cfg @@ -105,6 +105,19 @@ branch="" # Master Server | https://docs.linuxgsm.com/steamcmd/steam-master-server steammaster="true" +# Stop Mode | https://docs.linuxgsm.com/steamcmd/stopmode +# 1: tmux kill +# 2: CTRL+c +# 3: quit +# 4: quit 120s +# 5: stop +# 6: q +# 7: exit +# 8: 7 Days to Die +# 9: Gold Source +# 10: Teamspeak 3 +stopmode="3" + ## LinuxGSM Server Details # Do not edit gamename="Half-Life Deathmatch: Source" diff --git a/lgsm/config-default/config-lgsm/hwserver/_default.cfg b/lgsm/config-default/config-lgsm/hwserver/_default.cfg index a48ece00a..60a9e092f 100644 --- a/lgsm/config-default/config-lgsm/hwserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/hwserver/_default.cfg @@ -116,6 +116,19 @@ branch="" # Master Server | https://docs.linuxgsm.com/steamcmd/steam-master-server steammaster="false" +# Stop Mode | https://docs.linuxgsm.com/steamcmd/stopmode +# 1: tmux kill +# 2: CTRL+c +# 3: quit +# 4: quit 120s +# 5: stop +# 6: q +# 7: exit +# 8: 7 Days to Die +# 9: Gold Source +# 10: Teamspeak 3 +stopmode="2" + ## LinuxGSM Server Details # Do not edit gamename="Hurtworld" diff --git a/lgsm/config-default/config-lgsm/insserver/_default.cfg b/lgsm/config-default/config-lgsm/insserver/_default.cfg index 833b56c94..c05287dc2 100644 --- a/lgsm/config-default/config-lgsm/insserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/insserver/_default.cfg @@ -112,6 +112,19 @@ branch="" # Master Server | https://docs.linuxgsm.com/steamcmd/steam-master-server steammaster="false" +# Stop Mode | https://docs.linuxgsm.com/steamcmd/stopmode +# 1: tmux kill +# 2: CTRL+c +# 3: quit +# 4: quit 120s +# 5: stop +# 6: q +# 7: exit +# 8: 7 Days to Die +# 9: Gold Source +# 10: Teamspeak 3 +stopmode="3" + ## LinuxGSM Server Details # Do not edit gamename="Insurgency" diff --git a/lgsm/config-default/config-lgsm/inssserver/_default.cfg b/lgsm/config-default/config-lgsm/inssserver/_default.cfg index 04ab3128c..32d7c84fc 100644 --- a/lgsm/config-default/config-lgsm/inssserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/inssserver/_default.cfg @@ -113,6 +113,19 @@ branch="" # Master Server | https://docs.linuxgsm.com/steamcmd/steam-master-server steammaster="false" +# Stop Mode | https://docs.linuxgsm.com/steamcmd/stopmode +# 1: tmux kill +# 2: CTRL+c +# 3: quit +# 4: quit 120s +# 5: stop +# 6: q +# 7: exit +# 8: 7 Days to Die +# 9: Gold Source +# 10: Teamspeak 3 +stopmode="2" + ## LinuxGSM Server Details # Do not edit gamename="Insurgency: Sandstorm" diff --git a/lgsm/config-default/config-lgsm/iosserver/_default.cfg b/lgsm/config-default/config-lgsm/iosserver/_default.cfg index 1bfaedfc2..afa0668ca 100644 --- a/lgsm/config-default/config-lgsm/iosserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/iosserver/_default.cfg @@ -105,6 +105,19 @@ branch="" # Master Server | https://docs.linuxgsm.com/steamcmd/steam-master-server steammaster="false" +# Stop Mode | https://docs.linuxgsm.com/steamcmd/stopmode +# 1: tmux kill +# 2: CTRL+c +# 3: quit +# 4: quit 120s +# 5: stop +# 6: q +# 7: exit +# 8: 7 Days to Die +# 9: Gold Source +# 10: Teamspeak 3 +stopmode="3" + ## LinuxGSM Server Details # Do not edit gamename="IOSoccer" diff --git a/lgsm/config-default/config-lgsm/jc2server/_default.cfg b/lgsm/config-default/config-lgsm/jc2server/_default.cfg index 858ba5707..00c0327b4 100644 --- a/lgsm/config-default/config-lgsm/jc2server/_default.cfg +++ b/lgsm/config-default/config-lgsm/jc2server/_default.cfg @@ -97,6 +97,19 @@ branch="" # Master Server | https://docs.linuxgsm.com/steamcmd/steam-master-server steammaster="true" +# Stop Mode | https://docs.linuxgsm.com/steamcmd/stopmode +# 1: tmux kill +# 2: CTRL+c +# 3: quit +# 4: quit 120s +# 5: stop +# 6: q +# 7: exit +# 8: 7 Days to Die +# 9: Gold Source +# 10: Teamspeak 3 +stopmode="2" + ## LinuxGSM Server Details # Do not edit gamename="Just Cause 2" diff --git a/lgsm/config-default/config-lgsm/jc3server/_default.cfg b/lgsm/config-default/config-lgsm/jc3server/_default.cfg index 776f170b5..7d5646cbb 100644 --- a/lgsm/config-default/config-lgsm/jc3server/_default.cfg +++ b/lgsm/config-default/config-lgsm/jc3server/_default.cfg @@ -97,6 +97,19 @@ branch="" # Master Server | https://docs.linuxgsm.com/steamcmd/steam-master-server steammaster="false" +# Stop Mode | https://docs.linuxgsm.com/steamcmd/stopmode +# 1: tmux kill +# 2: CTRL+c +# 3: quit +# 4: quit 120s +# 5: stop +# 6: q +# 7: exit +# 8: 7 Days to Die +# 9: Gold Source +# 10: Teamspeak 3 +stopmode="2" + ## LinuxGSM Server Details # Do not edit gamename="Just Cause 3" diff --git a/lgsm/config-default/config-lgsm/kf2server/_default.cfg b/lgsm/config-default/config-lgsm/kf2server/_default.cfg index 8c917fea6..1105ed553 100644 --- a/lgsm/config-default/config-lgsm/kf2server/_default.cfg +++ b/lgsm/config-default/config-lgsm/kf2server/_default.cfg @@ -103,6 +103,19 @@ branch="" # Master Server | https://docs.linuxgsm.com/steamcmd/steam-master-server steammaster="false" +# Stop Mode | https://docs.linuxgsm.com/steamcmd/stopmode +# 1: tmux kill +# 2: CTRL+c +# 3: quit +# 4: quit 120s +# 5: stop +# 6: q +# 7: exit +# 8: 7 Days to Die +# 9: Gold Source +# 10: Teamspeak 3 +stopmode="2" + ## LinuxGSM Server Details # Do not edit gamename="Killing Floor 2" diff --git a/lgsm/config-default/config-lgsm/kfserver/_default.cfg b/lgsm/config-default/config-lgsm/kfserver/_default.cfg index 88c5d5c3d..df574eb72 100644 --- a/lgsm/config-default/config-lgsm/kfserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/kfserver/_default.cfg @@ -109,6 +109,19 @@ branch="" # Master Server | https://docs.linuxgsm.com/steamcmd/steam-master-server steammaster="false" +# Stop Mode | https://docs.linuxgsm.com/steamcmd/stopmode +# 1: tmux kill +# 2: CTRL+c +# 3: quit +# 4: quit 120s +# 5: stop +# 6: q +# 7: exit +# 8: 7 Days to Die +# 9: Gold Source +# 10: Teamspeak 3 +stopmode="2" + ## LinuxGSM Server Details # Do not edit gamename="Killing Floor" diff --git a/lgsm/config-default/config-lgsm/l4d2server/_default.cfg b/lgsm/config-default/config-lgsm/l4d2server/_default.cfg index 60637ba3f..16b2573e6 100644 --- a/lgsm/config-default/config-lgsm/l4d2server/_default.cfg +++ b/lgsm/config-default/config-lgsm/l4d2server/_default.cfg @@ -104,6 +104,19 @@ branch="" # Master Server | https://docs.linuxgsm.com/steamcmd/steam-master-server steammaster="false" +# Stop Mode | https://docs.linuxgsm.com/steamcmd/stopmode +# 1: tmux kill +# 2: CTRL+c +# 3: quit +# 4: quit 120s +# 5: stop +# 6: q +# 7: exit +# 8: 7 Days to Die +# 9: Gold Source +# 10: Teamspeak 3 +stopmode="3" + ## LinuxGSM Server Details # Do not edit gamename="Left 4 Dead 2" diff --git a/lgsm/config-default/config-lgsm/l4dserver/_default.cfg b/lgsm/config-default/config-lgsm/l4dserver/_default.cfg index 206a5d63a..6f12f0946 100644 --- a/lgsm/config-default/config-lgsm/l4dserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/l4dserver/_default.cfg @@ -104,6 +104,19 @@ branch="" # Master Server | https://docs.linuxgsm.com/steamcmd/steam-master-server steammaster="false" +# Stop Mode | https://docs.linuxgsm.com/steamcmd/stopmode +# 1: tmux kill +# 2: CTRL+c +# 3: quit +# 4: quit 120s +# 5: stop +# 6: q +# 7: exit +# 8: 7 Days to Die +# 9: Gold Source +# 10: Teamspeak 3 +stopmode="2" + ## LinuxGSM Server Details # Do not edit gamename="Left 4 Dead" diff --git a/lgsm/config-default/config-lgsm/mcserver/_default.cfg b/lgsm/config-default/config-lgsm/mcserver/_default.cfg index 6d8bfae71..11befde4c 100644 --- a/lgsm/config-default/config-lgsm/mcserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/mcserver/_default.cfg @@ -91,6 +91,19 @@ ansi="on" # Message Display Time sleeptime="0.5" +# Stop Mode | https://docs.linuxgsm.com/steamcmd/stopmode +# 1: tmux kill +# 2: CTRL+c +# 3: quit +# 4: quit 120s +# 5: stop +# 6: q +# 7: exit +# 8: 7 Days to Die +# 9: Gold Source +# 10: Teamspeak 3 +stopmode="5" + ## LinuxGSM Server Details # Do not edit gamename="Minecraft" diff --git a/lgsm/config-default/config-lgsm/mhserver/_default.cfg b/lgsm/config-default/config-lgsm/mhserver/_default.cfg index 30f68f0cd..d77850315 100644 --- a/lgsm/config-default/config-lgsm/mhserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/mhserver/_default.cfg @@ -102,6 +102,19 @@ branch="" # Master Server | https://docs.linuxgsm.com/steamcmd/steam-master-server steammaster="false" +# Stop Mode | https://docs.linuxgsm.com/steamcmd/stopmode +# 1: tmux kill +# 2: CTRL+c +# 3: quit +# 4: quit 120s +# 5: stop +# 6: q +# 7: exit +# 8: 7 Days to Die +# 9: Gold Source +# 10: Teamspeak 3 +stopmode="2" + ## LinuxGSM Server Details # Do not edit gamename="MORDHAU" diff --git a/lgsm/config-default/config-lgsm/mtaserver/_default.cfg b/lgsm/config-default/config-lgsm/mtaserver/_default.cfg index f5db494ed..13649e564 100644 --- a/lgsm/config-default/config-lgsm/mtaserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/mtaserver/_default.cfg @@ -87,6 +87,19 @@ ansi="on" # Message Display Time sleeptime="0.5" +# Stop Mode | https://docs.linuxgsm.com/steamcmd/stopmode +# 1: tmux kill +# 2: CTRL+c +# 3: quit +# 4: quit 120s +# 5: stop +# 6: q +# 7: exit +# 8: 7 Days to Die +# 9: Gold Source +# 10: Teamspeak 3 +stopmode="4" + ## LinuxGSM Server Details # Do not edit gamename="Multi Theft Auto" diff --git a/lgsm/config-default/config-lgsm/mumbleserver/_default.cfg b/lgsm/config-default/config-lgsm/mumbleserver/_default.cfg index 1c87b4c77..68bb910ee 100644 --- a/lgsm/config-default/config-lgsm/mumbleserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/mumbleserver/_default.cfg @@ -90,6 +90,19 @@ ansi="on" # Message Display Time sleeptime="0.5" +# Stop Mode | https://docs.linuxgsm.com/steamcmd/stopmode +# 1: tmux kill +# 2: CTRL+c +# 3: quit +# 4: quit 120s +# 5: stop +# 6: q +# 7: exit +# 8: 7 Days to Die +# 9: Gold Source +# 10: Teamspeak 3 +stopmode="2" + ## LinuxGSM Server Details # Do not edit gamename="Mumble" diff --git a/lgsm/config-default/config-lgsm/ndserver/_default.cfg b/lgsm/config-default/config-lgsm/ndserver/_default.cfg index 0d920f0e2..cb1be264e 100644 --- a/lgsm/config-default/config-lgsm/ndserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/ndserver/_default.cfg @@ -105,6 +105,19 @@ branch="" # Master Server | https://docs.linuxgsm.com/steamcmd/steam-master-server steammaster="true" +# Stop Mode | https://docs.linuxgsm.com/steamcmd/stopmode +# 1: tmux kill +# 2: CTRL+c +# 3: quit +# 4: quit 120s +# 5: stop +# 6: q +# 7: exit +# 8: 7 Days to Die +# 9: Gold Source +# 10: Teamspeak 3 +stopmode="3" + ## LinuxGSM Server Details # Do not edit gamename="Nuclear Dawn" diff --git a/lgsm/config-default/config-lgsm/nmrihserver/_default.cfg b/lgsm/config-default/config-lgsm/nmrihserver/_default.cfg index 25aa74192..29e828a05 100644 --- a/lgsm/config-default/config-lgsm/nmrihserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/nmrihserver/_default.cfg @@ -110,6 +110,19 @@ branch="" # Master Server | https://docs.linuxgsm.com/steamcmd/steam-master-server steammaster="true" +# Stop Mode | https://docs.linuxgsm.com/steamcmd/stopmode +# 1: tmux kill +# 2: CTRL+c +# 3: quit +# 4: quit 120s +# 5: stop +# 6: q +# 7: exit +# 8: 7 Days to Die +# 9: Gold Source +# 10: Teamspeak 3 +stopmode="3" + ## LinuxGSM Server Details # Do not edit gamename="No More Room in Hell" diff --git a/lgsm/config-default/config-lgsm/ns2cserver/_default.cfg b/lgsm/config-default/config-lgsm/ns2cserver/_default.cfg index b5d75252b..35b7ae6dc 100644 --- a/lgsm/config-default/config-lgsm/ns2cserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/ns2cserver/_default.cfg @@ -112,6 +112,19 @@ branch="" # Master Server | https://docs.linuxgsm.com/steamcmd/steam-master-server steammaster="true" +# Stop Mode | https://docs.linuxgsm.com/steamcmd/stopmode +# 1: tmux kill +# 2: CTRL+c +# 3: quit +# 4: quit 120s +# 5: stop +# 6: q +# 7: exit +# 8: 7 Days to Die +# 9: Gold Source +# 10: Teamspeak 3 +stopmode="6" + ## LinuxGSM Server Details # Do not edit gamename="NS2: Combat" diff --git a/lgsm/config-default/config-lgsm/ns2server/_default.cfg b/lgsm/config-default/config-lgsm/ns2server/_default.cfg index 79c0b169e..f974a6c22 100644 --- a/lgsm/config-default/config-lgsm/ns2server/_default.cfg +++ b/lgsm/config-default/config-lgsm/ns2server/_default.cfg @@ -116,6 +116,19 @@ branch="" # Master Server | https://docs.linuxgsm.com/steamcmd/steam-master-server steammaster="true" +# Stop Mode | https://docs.linuxgsm.com/steamcmd/stopmode +# 1: tmux kill +# 2: CTRL+c +# 3: quit +# 4: quit 120s +# 5: stop +# 6: q +# 7: exit +# 8: 7 Days to Die +# 9: Gold Source +# 10: Teamspeak 3 +stopmode="6" + ## LinuxGSM Server Details # Do not edit gamename="Natural Selection 2" diff --git a/lgsm/config-default/config-lgsm/nsserver/_default.cfg b/lgsm/config-default/config-lgsm/nsserver/_default.cfg index 7b3fb9bde..986ec729b 100644 --- a/lgsm/config-default/config-lgsm/nsserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/nsserver/_default.cfg @@ -105,6 +105,19 @@ branch="" # Master Server | https://docs.linuxgsm.com/steamcmd/steam-master-server steammaster="true" +# Stop Mode | https://docs.linuxgsm.com/steamcmd/stopmode +# 1: tmux kill +# 2: CTRL+c +# 3: quit +# 4: quit 120s +# 5: stop +# 6: q +# 7: exit +# 8: 7 Days to Die +# 9: Gold Source +# 10: Teamspeak 3 +stopmode="9" + ## LinuxGSM Server Details # Do not edit gamename="Natural Selection" diff --git a/lgsm/config-default/config-lgsm/opforserver/_default.cfg b/lgsm/config-default/config-lgsm/opforserver/_default.cfg index 9b0c611b6..08b8c8c81 100644 --- a/lgsm/config-default/config-lgsm/opforserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/opforserver/_default.cfg @@ -105,6 +105,19 @@ branch="" # Master Server | https://docs.linuxgsm.com/steamcmd/steam-master-server steammaster="true" +# Stop Mode | https://docs.linuxgsm.com/steamcmd/stopmode +# 1: tmux kill +# 2: CTRL+c +# 3: quit +# 4: quit 120s +# 5: stop +# 6: q +# 7: exit +# 8: 7 Days to Die +# 9: Gold Source +# 10: Teamspeak 3 +stopmode="9" + ## LinuxGSM Server Details # Do not edit gamename="Half-Life: Opposing Force" diff --git a/lgsm/config-default/config-lgsm/pcserver/_default.cfg b/lgsm/config-default/config-lgsm/pcserver/_default.cfg index 1a324a399..0203a2ade 100644 --- a/lgsm/config-default/config-lgsm/pcserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/pcserver/_default.cfg @@ -97,6 +97,19 @@ branch="" # Master Server | https://docs.linuxgsm.com/steamcmd/steam-master-server steammaster="false" +# Stop Mode | https://docs.linuxgsm.com/steamcmd/stopmode +# 1: tmux kill +# 2: CTRL+c +# 3: quit +# 4: quit 120s +# 5: stop +# 6: q +# 7: exit +# 8: 7 Days to Die +# 9: Gold Source +# 10: Teamspeak 3 +stopmode="2" + ## LinuxGSM Server Details # Do not edit gamename="Project Cars" diff --git a/lgsm/config-default/config-lgsm/pstbsserver/_default.cfg b/lgsm/config-default/config-lgsm/pstbsserver/_default.cfg index 9b4f6762c..28cb15094 100644 --- a/lgsm/config-default/config-lgsm/pstbsserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/pstbsserver/_default.cfg @@ -108,6 +108,19 @@ branch="" # Master Server | https://docs.linuxgsm.com/steamcmd/steam-master-server steammaster="false" +# Stop Mode | https://docs.linuxgsm.com/steamcmd/stopmode +# 1: tmux kill +# 2: CTRL+c +# 3: quit +# 4: quit 120s +# 5: stop +# 6: q +# 7: exit +# 8: 7 Days to Die +# 9: Gold Source +# 10: Teamspeak 3 +stopmode="2" + ## LinuxGSM Server Details # Do not edit gamename="pstbsserver" diff --git a/lgsm/config-default/config-lgsm/pvkiiserver/_default.cfg b/lgsm/config-default/config-lgsm/pvkiiserver/_default.cfg index 50afb6323..391dbf491 100644 --- a/lgsm/config-default/config-lgsm/pvkiiserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/pvkiiserver/_default.cfg @@ -105,6 +105,19 @@ branch="" # Master Server | https://docs.linuxgsm.com/steamcmd/steam-master-server steammaster="true" +# Stop Mode | https://docs.linuxgsm.com/steamcmd/stopmode +# 1: tmux kill +# 2: CTRL+c +# 3: quit +# 4: quit 120s +# 5: stop +# 6: q +# 7: exit +# 8: 7 Days to Die +# 9: Gold Source +# 10: Teamspeak 3 +stopmode="3" + ## LinuxGSM Server Details # Do not edit gamename="Pirates, Vikings, and Knights II" diff --git a/lgsm/config-default/config-lgsm/pzserver/_default.cfg b/lgsm/config-default/config-lgsm/pzserver/_default.cfg index 3592c6fc8..04b479490 100644 --- a/lgsm/config-default/config-lgsm/pzserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/pzserver/_default.cfg @@ -100,6 +100,19 @@ branch="" # Master Server | https://docs.linuxgsm.com/steamcmd/steam-master-server steammaster="false" +# Stop Mode | https://docs.linuxgsm.com/steamcmd/stopmode +# 1: tmux kill +# 2: CTRL+c +# 3: quit +# 4: quit 120s +# 5: stop +# 6: q +# 7: exit +# 8: 7 Days to Die +# 9: Gold Source +# 10: Teamspeak 3 +stopmode="3" + ## LinuxGSM Server Details # Do not edit gamename="Project Zomboid" diff --git a/lgsm/config-default/config-lgsm/q2server/_default.cfg b/lgsm/config-default/config-lgsm/q2server/_default.cfg index 920f0f012..dd537ca67 100644 --- a/lgsm/config-default/config-lgsm/q2server/_default.cfg +++ b/lgsm/config-default/config-lgsm/q2server/_default.cfg @@ -91,6 +91,19 @@ ansi="on" # Message Display Time sleeptime="0.5" +# Stop Mode | https://docs.linuxgsm.com/steamcmd/stopmode +# 1: tmux kill +# 2: CTRL+c +# 3: quit +# 4: quit 120s +# 5: stop +# 6: q +# 7: exit +# 8: 7 Days to Die +# 9: Gold Source +# 10: Teamspeak 3 +stopmode="3" + ## LinuxGSM Server Details # Do not edit gamename="Quake 2" diff --git a/lgsm/config-default/config-lgsm/q3server/_default.cfg b/lgsm/config-default/config-lgsm/q3server/_default.cfg index 30d2363ab..91ec7b459 100644 --- a/lgsm/config-default/config-lgsm/q3server/_default.cfg +++ b/lgsm/config-default/config-lgsm/q3server/_default.cfg @@ -91,6 +91,19 @@ ansi="on" # Message Display Time sleeptime="0.5" +# Stop Mode | https://docs.linuxgsm.com/steamcmd/stopmode +# 1: tmux kill +# 2: CTRL+c +# 3: quit +# 4: quit 120s +# 5: stop +# 6: q +# 7: exit +# 8: 7 Days to Die +# 9: Gold Source +# 10: Teamspeak 3 +stopmode="3" + ## LinuxGSM Server Details # Do not edit gamename="Quake 3: Arena" diff --git a/lgsm/config-default/config-lgsm/qlserver/_default.cfg b/lgsm/config-default/config-lgsm/qlserver/_default.cfg index f05bd78ec..8c773cc09 100644 --- a/lgsm/config-default/config-lgsm/qlserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/qlserver/_default.cfg @@ -99,6 +99,19 @@ branch="" # Master Server | https://docs.linuxgsm.com/steamcmd/steam-master-server steammaster="true" +# Stop Mode | https://docs.linuxgsm.com/steamcmd/stopmode +# 1: tmux kill +# 2: CTRL+c +# 3: quit +# 4: quit 120s +# 5: stop +# 6: q +# 7: exit +# 8: 7 Days to Die +# 9: Gold Source +# 10: Teamspeak 3 +stopmode="3" + ## LinuxGSM Server Details # Do not edit gamename="Quake Live" diff --git a/lgsm/config-default/config-lgsm/qwserver/_default.cfg b/lgsm/config-default/config-lgsm/qwserver/_default.cfg index 8d52d2f1c..8667c7934 100644 --- a/lgsm/config-default/config-lgsm/qwserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/qwserver/_default.cfg @@ -90,6 +90,19 @@ ansi="on" # Message Display Time sleeptime="0.5" +# Stop Mode | https://docs.linuxgsm.com/steamcmd/stopmode +# 1: tmux kill +# 2: CTRL+c +# 3: quit +# 4: quit 120s +# 5: stop +# 6: q +# 7: exit +# 8: 7 Days to Die +# 9: Gold Source +# 10: Teamspeak 3 +stopmode="3" + ## LinuxGSM Server Details # Do not edit gamename="QuakeWorld" diff --git a/lgsm/config-default/config-lgsm/ricochetserver/_default.cfg b/lgsm/config-default/config-lgsm/ricochetserver/_default.cfg index 53ed05649..e237cab94 100644 --- a/lgsm/config-default/config-lgsm/ricochetserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/ricochetserver/_default.cfg @@ -105,6 +105,19 @@ branch="" # Master Server | https://docs.linuxgsm.com/steamcmd/steam-master-server steammaster="true" +# Stop Mode | https://docs.linuxgsm.com/steamcmd/stopmode +# 1: tmux kill +# 2: CTRL+c +# 3: quit +# 4: quit 120s +# 5: stop +# 6: q +# 7: exit +# 8: 7 Days to Die +# 9: Gold Source +# 10: Teamspeak 3 +stopmode="9" + ## LinuxGSM Server Details # Do not edit gamename="Ricochet" diff --git a/lgsm/config-default/config-lgsm/roserver/_default.cfg b/lgsm/config-default/config-lgsm/roserver/_default.cfg index e0e5719bb..2215fc4f7 100644 --- a/lgsm/config-default/config-lgsm/roserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/roserver/_default.cfg @@ -105,6 +105,19 @@ branch="" # Master Server | https://docs.linuxgsm.com/steamcmd/steam-master-server steammaster="false" +# Stop Mode | https://docs.linuxgsm.com/steamcmd/stopmode +# 1: tmux kill +# 2: CTRL+c +# 3: quit +# 4: quit 120s +# 5: stop +# 6: q +# 7: exit +# 8: 7 Days to Die +# 9: Gold Source +# 10: Teamspeak 3 +stopmode="2" + ## LinuxGSM Server Details # Do not edit gamename="Red Orchestra: Ostfront 41-45" diff --git a/lgsm/config-default/config-lgsm/rtcwserver/_default.cfg b/lgsm/config-default/config-lgsm/rtcwserver/_default.cfg index 7d0eca7ee..60bcf588d 100644 --- a/lgsm/config-default/config-lgsm/rtcwserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/rtcwserver/_default.cfg @@ -91,6 +91,19 @@ ansi="on" # Message Display Time sleeptime="0.5" +# Stop Mode | https://docs.linuxgsm.com/steamcmd/stopmode +# 1: tmux kill +# 2: CTRL+c +# 3: quit +# 4: quit 120s +# 5: stop +# 6: q +# 7: exit +# 8: 7 Days to Die +# 9: Gold Source +# 10: Teamspeak 3 +stopmode="3" + ## LinuxGSM Server Details # Do not edit gamename="Return to Castle Wolfenstein" diff --git a/lgsm/config-default/config-lgsm/rustserver/_default.cfg b/lgsm/config-default/config-lgsm/rustserver/_default.cfg index 1af31d373..0b8aeed35 100644 --- a/lgsm/config-default/config-lgsm/rustserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/rustserver/_default.cfg @@ -129,6 +129,19 @@ branch="" # Master Server | https://docs.linuxgsm.com/steamcmd/steam-master-server steammaster="false" +# Stop Mode | https://docs.linuxgsm.com/steamcmd/stopmode +# 1: tmux kill +# 2: CTRL+c +# 3: quit +# 4: quit 120s +# 5: stop +# 6: q +# 7: exit +# 8: 7 Days to Die +# 9: Gold Source +# 10: Teamspeak 3 +stopmode="3" + ## LinuxGSM Server Details # Do not edit gamename="Rust" diff --git a/lgsm/config-default/config-lgsm/rwserver/_default.cfg b/lgsm/config-default/config-lgsm/rwserver/_default.cfg index 10a8ac03d..a87161ace 100644 --- a/lgsm/config-default/config-lgsm/rwserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/rwserver/_default.cfg @@ -100,6 +100,19 @@ branch="" # Master Server | https://docs.linuxgsm.com/steamcmd/steam-master-server steammaster="false" +# Stop Mode | https://docs.linuxgsm.com/steamcmd/stopmode +# 1: tmux kill +# 2: CTRL+c +# 3: quit +# 4: quit 120s +# 5: stop +# 6: q +# 7: exit +# 8: 7 Days to Die +# 9: Gold Source +# 10: Teamspeak 3 +stopmode="3" + ## LinuxGSM Server Details # Do not edit gamename="Rising World" diff --git a/lgsm/config-default/config-lgsm/sampserver/_default.cfg b/lgsm/config-default/config-lgsm/sampserver/_default.cfg index 600c0498a..6c1b65e77 100644 --- a/lgsm/config-default/config-lgsm/sampserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/sampserver/_default.cfg @@ -90,6 +90,19 @@ ansi="on" # Message Display Time sleeptime="0.5" +# Stop Mode | https://docs.linuxgsm.com/steamcmd/stopmode +# 1: tmux kill +# 2: CTRL+c +# 3: quit +# 4: quit 120s +# 5: stop +# 6: q +# 7: exit +# 8: 7 Days to Die +# 9: Gold Source +# 10: Teamspeak 3 +stopmode="2" + ## LinuxGSM Server Details # Do not edit gamename="San Andreas Multiplayer" diff --git a/lgsm/config-default/config-lgsm/sbotsserver/_default.cfg b/lgsm/config-default/config-lgsm/sbotsserver/_default.cfg index 1c95132b1..9b59c6e2d 100644 --- a/lgsm/config-default/config-lgsm/sbotsserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/sbotsserver/_default.cfg @@ -102,6 +102,19 @@ branch="" # Master Server | https://docs.linuxgsm.com/steamcmd/steam-master-server steammaster="false" +# Stop Mode | https://docs.linuxgsm.com/steamcmd/stopmode +# 1: tmux kill +# 2: CTRL+c +# 3: quit +# 4: quit 120s +# 5: stop +# 6: q +# 7: exit +# 8: 7 Days to Die +# 9: Gold Source +# 10: Teamspeak 3 +stopmode="2" + ## LinuxGSM Server Details # Do not edit gamename="StickyBots" diff --git a/lgsm/config-default/config-lgsm/sbserver/_default.cfg b/lgsm/config-default/config-lgsm/sbserver/_default.cfg index 5cf9a10fd..ab6e86f99 100644 --- a/lgsm/config-default/config-lgsm/sbserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/sbserver/_default.cfg @@ -103,6 +103,19 @@ appid="211820" branch="" steammaster="flase" +# Stop Mode | https://docs.linuxgsm.com/steamcmd/stopmode +# 1: tmux kill +# 2: CTRL+c +# 3: quit +# 4: quit 120s +# 5: stop +# 6: q +# 7: exit +# 8: 7 Days to Die +# 9: Gold Source +# 10: Teamspeak 3 +stopmode="2" + ## LinuxGSM Server Details # Do not edit gamename="Starbound" diff --git a/lgsm/config-default/config-lgsm/sdtdserver/_default.cfg b/lgsm/config-default/config-lgsm/sdtdserver/_default.cfg index 06d97810f..7ddaba4a0 100644 --- a/lgsm/config-default/config-lgsm/sdtdserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/sdtdserver/_default.cfg @@ -100,6 +100,19 @@ branch="" # Master Server | https://docs.linuxgsm.com/steamcmd/steam-master-server steammaster="true" +# Stop Mode | https://docs.linuxgsm.com/steamcmd/stopmode +# 1: tmux kill +# 2: CTRL+c +# 3: quit +# 4: quit 120s +# 5: stop +# 6: q +# 7: exit +# 8: 7 Days to Die +# 9: Gold Source +# teamspeak 3 +stopmode="8" + ## LinuxGSM Server Details # Do not edit gamename="7 Days To Die" diff --git a/lgsm/config-default/config-lgsm/sfcserver/_default.cfg b/lgsm/config-default/config-lgsm/sfcserver/_default.cfg index 15318155f..c1879746b 100644 --- a/lgsm/config-default/config-lgsm/sfcserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/sfcserver/_default.cfg @@ -105,6 +105,19 @@ branch="" # Master Server | https://docs.linuxgsm.com/steamcmd/steam-master-server steammaster="true" +# Stop Mode | https://docs.linuxgsm.com/steamcmd/stopmode +# 1: tmux kill +# 2: CTRL+c +# 3: quit +# 4: quit 120s +# 5: stop +# 6: q +# 7: exit +# 8: 7 Days to Die +# 9: Gold Source +# 10: Teamspeak 3 +stopmode="3" + ## LinuxGSM Server Details # Do not edit gamename="SourceForts Classic" diff --git a/lgsm/config-default/config-lgsm/sof2server/_default.cfg b/lgsm/config-default/config-lgsm/sof2server/_default.cfg index cd3053a83..3b3769dc5 100644 --- a/lgsm/config-default/config-lgsm/sof2server/_default.cfg +++ b/lgsm/config-default/config-lgsm/sof2server/_default.cfg @@ -91,6 +91,19 @@ ansi="on" # Message Display Time sleeptime="0.5" +# Stop Mode | https://docs.linuxgsm.com/steamcmd/stopmode +# 1: tmux kill +# 2: CTRL+c +# 3: quit +# 4: quit 120s +# 5: stop +# 6: q +# 7: exit +# 8: 7 Days to Die +# 9: Gold Source +# 10: Teamspeak 3 +stopmode="3" + ## LinuxGSM Server Details # Do not edit gamename="Soldier Of Fortune 2: Gold Edition" diff --git a/lgsm/config-default/config-lgsm/solserver/_default.cfg b/lgsm/config-default/config-lgsm/solserver/_default.cfg index ffd2d7db1..9296881a5 100644 --- a/lgsm/config-default/config-lgsm/solserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/solserver/_default.cfg @@ -92,6 +92,19 @@ ansi="on" # Message Display Time sleeptime="0.5" +# Stop Mode | https://docs.linuxgsm.com/steamcmd/stopmode +# 1: tmux kill +# 2: CTRL+c +# 3: quit +# 4: quit 120s +# 5: stop +# 6: q +# 7: exit +# 8: 7 Days to Die +# 9: Gold Source +# 10: Teamspeak 3 +stopmode="2" + ## LinuxGSM Server Details # Do not edit gamename="Soldat" diff --git a/lgsm/config-default/config-lgsm/squadserver/_default.cfg b/lgsm/config-default/config-lgsm/squadserver/_default.cfg index 3c2109527..22470dc8f 100644 --- a/lgsm/config-default/config-lgsm/squadserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/squadserver/_default.cfg @@ -102,6 +102,19 @@ branch="" # Master Server | https://docs.linuxgsm.com/steamcmd/steam-master-server steammaster="false" +# Stop Mode | https://docs.linuxgsm.com/steamcmd/stopmode +# 1: tmux kill +# 2: CTRL+c +# 3: quit +# 4: quit 120s +# 5: stop +# 6: q +# 7: exit +# 8: 7 Days to Die +# 9: Gold Source +# 10: Teamspeak 3 +stopmode="2" + ## LinuxGSM Server Details # Do not edit gamename="Squad" diff --git a/lgsm/config-default/config-lgsm/ss3server/_default.cfg b/lgsm/config-default/config-lgsm/ss3server/_default.cfg index 050be2d51..1a3593202 100644 --- a/lgsm/config-default/config-lgsm/ss3server/_default.cfg +++ b/lgsm/config-default/config-lgsm/ss3server/_default.cfg @@ -101,6 +101,19 @@ branch="" # Master Server | https://docs.linuxgsm.com/steamcmd/steam-master-server steammaster="false" +# Stop Mode | https://docs.linuxgsm.com/steamcmd/stopmode +# 1: tmux kill +# 2: CTRL+c +# 3: quit +# 4: quit 120s +# 5: stop +# 6: q +# 7: exit +# 8: 7 Days to Die +# 9: Gold Source +# 10: Teamspeak 3 +stopmode="2" + ## LinuxGSM Server Details # Do not edit gamename="Serious Sam 3: BFE" diff --git a/lgsm/config-default/config-lgsm/stserver/_default.cfg b/lgsm/config-default/config-lgsm/stserver/_default.cfg index a380fb91d..a1ca3945a 100644 --- a/lgsm/config-default/config-lgsm/stserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/stserver/_default.cfg @@ -107,6 +107,19 @@ branch="" # Master Server | https://docs.linuxgsm.com/steamcmd/steam-master-server steammaster="false" +# Stop Mode | https://docs.linuxgsm.com/steamcmd/stopmode +# 1: tmux kill +# 2: CTRL+c +# 3: quit +# 4: quit 120s +# 5: stop +# 6: q +# 7: exit +# 8: 7 Days to Die +# 9: Gold Source +# 10: Teamspeak 3 +stopmode="2" + ## LinuxGSM Server Details # Do not edit gamename="Stationeers" diff --git a/lgsm/config-default/config-lgsm/svenserver/_default.cfg b/lgsm/config-default/config-lgsm/svenserver/_default.cfg index a1342611c..02413e527 100644 --- a/lgsm/config-default/config-lgsm/svenserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/svenserver/_default.cfg @@ -104,6 +104,19 @@ branch="" # Master Server | https://docs.linuxgsm.com/steamcmd/steam-master-server steammaster="true" +# Stop Mode | https://docs.linuxgsm.com/steamcmd/stopmode +# 1: tmux kill +# 2: CTRL+c +# 3: quit +# 4: quit 120s +# 5: stop +# 6: q +# 7: exit +# 8: 7 Days to Die +# 9: Gold Source +# 10: Teamspeak 3 +stopmode="9" + ## LinuxGSM Server Details # Do not edit gamename="Sven Co-op" diff --git a/lgsm/config-default/config-lgsm/terrariaserver/_default.cfg b/lgsm/config-default/config-lgsm/terrariaserver/_default.cfg index 9a940f4d8..bd1ec9e4a 100644 --- a/lgsm/config-default/config-lgsm/terrariaserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/terrariaserver/_default.cfg @@ -104,6 +104,19 @@ branch="" # Master Server | https://docs.linuxgsm.com/steamcmd/steam-master-server steammaster="false" +# Stop Mode | https://docs.linuxgsm.com/steamcmd/stopmode +# 1: tmux kill +# 2: CTRL+c +# 3: quit +# 4: quit 120s +# 5: stop +# 6: q +# 7: exit +# 8: 7 Days to Die +# 9: Gold Source +# 10: Teamspeak 3 +stopmode="7" + ## LinuxGSM Server Details # Do not edit gamename="Terraria" diff --git a/lgsm/config-default/config-lgsm/tf2server/_default.cfg b/lgsm/config-default/config-lgsm/tf2server/_default.cfg index 106cabdb1..c8330396b 100644 --- a/lgsm/config-default/config-lgsm/tf2server/_default.cfg +++ b/lgsm/config-default/config-lgsm/tf2server/_default.cfg @@ -110,6 +110,19 @@ branch="" # Master Server | https://docs.linuxgsm.com/steamcmd/steam-master-server steammaster="true" +# Stop Mode | https://docs.linuxgsm.com/steamcmd/stopmode +# 1: tmux kill +# 2: CTRL+c +# 3: quit +# 4: quit 120s +# 5: stop +# 6: q +# 7: exit +# 8: 7 Days to Die +# 9: Gold Source +# 10: Teamspeak 3 +stopmode="3" + ## LinuxGSM Server Details # Do not edit gamename="Team Fortress 2" diff --git a/lgsm/config-default/config-lgsm/tfcserver/_default.cfg b/lgsm/config-default/config-lgsm/tfcserver/_default.cfg index b65c06f6d..8a0ccfb5f 100644 --- a/lgsm/config-default/config-lgsm/tfcserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/tfcserver/_default.cfg @@ -105,6 +105,19 @@ branch="" # Master Server | https://docs.linuxgsm.com/steamcmd/steam-master-server steammaster="true" +# Stop Mode | https://docs.linuxgsm.com/steamcmd/stopmode +# 1: tmux kill +# 2: CTRL+c +# 3: quit +# 4: quit 120s +# 5: stop +# 6: q +# 7: exit +# 8: 7 Days to Die +# 9: Gold Source +# 10: Teamspeak 3 +stopmode="9" + ## LinuxGSM Server Details # Do not edit gamename="Team Fortress Classic" diff --git a/lgsm/config-default/config-lgsm/ts3server/_default.cfg b/lgsm/config-default/config-lgsm/ts3server/_default.cfg index 210a406c8..f59afdfde 100644 --- a/lgsm/config-default/config-lgsm/ts3server/_default.cfg +++ b/lgsm/config-default/config-lgsm/ts3server/_default.cfg @@ -85,6 +85,19 @@ ansi="on" # Message Display Time sleeptime="0.5" +# Stop Mode | https://docs.linuxgsm.com/steamcmd/stopmode +# 1: tmux kill +# 2: CTRL+c +# 3: quit +# 4: quit 120s +# 5: stop +# 6: q +# 7: exit +# 8: 7 Days to Die +# 9: Gold Source +# 10: Teamspeak 3 +stopmode="" + ## LinuxGSM Server Details # Do not edit gamename="TeamSpeak 3" diff --git a/lgsm/config-default/config-lgsm/tsserver/_default.cfg b/lgsm/config-default/config-lgsm/tsserver/_default.cfg index 75dae8d96..d17776b80 100644 --- a/lgsm/config-default/config-lgsm/tsserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/tsserver/_default.cfg @@ -105,6 +105,19 @@ branch="" # Master Server | https://docs.linuxgsm.com/steamcmd/steam-master-server steammaster="true" +# Stop Mode | https://docs.linuxgsm.com/steamcmd/stopmode +# 1: tmux kill +# 2: CTRL+c +# 3: quit +# 4: quit 120s +# 5: stop +# 6: q +# 7: exit +# 8: 7 Days to Die +# 9: Gold Source +# 10: Teamspeak 3 +stopmode="9" + ## LinuxGSM Server Details # Do not edit gamename="The Specialists" diff --git a/lgsm/config-default/config-lgsm/tuserver/_default.cfg b/lgsm/config-default/config-lgsm/tuserver/_default.cfg index 72f78ee05..3ad279d18 100644 --- a/lgsm/config-default/config-lgsm/tuserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/tuserver/_default.cfg @@ -107,6 +107,19 @@ branch="" # Master Server | https://docs.linuxgsm.com/steamcmd/steam-master-server steammaster="false" +# Stop Mode | https://docs.linuxgsm.com/steamcmd/stopmode +# 1: tmux kill +# 2: CTRL+c +# 3: quit +# 4: quit 120s +# 5: stop +# 6: q +# 7: exit +# 8: 7 Days to Die +# 9: Gold Source +# 10: Teamspeak 3 +stopmode="2" + ## LinuxGSM Server Details # Do not edit gamename="Tower Unite" diff --git a/lgsm/config-default/config-lgsm/twserver/_default.cfg b/lgsm/config-default/config-lgsm/twserver/_default.cfg index 9e1fe3db9..cc4183e44 100644 --- a/lgsm/config-default/config-lgsm/twserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/twserver/_default.cfg @@ -104,6 +104,19 @@ branch="" # Master Server | https://docs.linuxgsm.com/steamcmd/steam-master-server steammaster="false" +# Stop Mode | https://docs.linuxgsm.com/steamcmd/stopmode +# 1: tmux kill +# 2: CTRL+c +# 3: quit +# 4: quit 120s +# 5: stop +# 6: q +# 7: exit +# 8: 7 Days to Die +# 9: Gold Source +# 10: Teamspeak 3 +stopmode="2" + ## LinuxGSM Server Details # Do not edit gamename="Teeworlds" diff --git a/lgsm/config-default/config-lgsm/untserver/_default.cfg b/lgsm/config-default/config-lgsm/untserver/_default.cfg index 16179473a..d9670e9a7 100644 --- a/lgsm/config-default/config-lgsm/untserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/untserver/_default.cfg @@ -104,6 +104,19 @@ branch="" # Master Server | https://docs.linuxgsm.com/steamcmd/steam-master-server steammaster="false" +# Stop Mode | https://docs.linuxgsm.com/steamcmd/stopmode +# 1: tmux kill +# 2: CTRL+c +# 3: quit +# 4: quit 120s +# 5: stop +# 6: q +# 7: exit +# 8: 7 Days to Die +# 9: Gold Source +# 10: Teamspeak 3 +stopmode="2" + ## LinuxGSM Server Details # Do not edit gamename="Unturned" diff --git a/lgsm/config-default/config-lgsm/ut2k4server/_default.cfg b/lgsm/config-default/config-lgsm/ut2k4server/_default.cfg index 9481d792a..b2c6b861c 100644 --- a/lgsm/config-default/config-lgsm/ut2k4server/_default.cfg +++ b/lgsm/config-default/config-lgsm/ut2k4server/_default.cfg @@ -90,6 +90,19 @@ ansi="on" # Message Display Time sleeptime="0.5" +# Stop Mode | https://docs.linuxgsm.com/steamcmd/stopmode +# 1: tmux kill +# 2: CTRL+c +# 3: quit +# 4: quit 120s +# 5: stop +# 6: q +# 7: exit +# 8: 7 Days to Die +# 9: Gold Source +# 10: Teamspeak 3 +stopmode="2" + ## LinuxGSM Server Details # Do not edit gamename="Unreal Tournament 2004" diff --git a/lgsm/config-default/config-lgsm/ut3server/_default.cfg b/lgsm/config-default/config-lgsm/ut3server/_default.cfg index f2d5a1bcf..9df05d71d 100644 --- a/lgsm/config-default/config-lgsm/ut3server/_default.cfg +++ b/lgsm/config-default/config-lgsm/ut3server/_default.cfg @@ -101,6 +101,19 @@ ansi="on" # Message Display Time sleeptime="0.5" +# Stop Mode | https://docs.linuxgsm.com/steamcmd/stopmode +# 1: tmux kill +# 2: CTRL+c +# 3: quit +# 4: quit 120s +# 5: stop +# 6: q +# 7: exit +# 8: 7 Days to Die +# 9: Gold Source +# 10: Teamspeak 3 +stopmode="2" + ## LinuxGSM Server Details # Do not edit gamename="Unreal Tournament 3" diff --git a/lgsm/config-default/config-lgsm/ut99server/_default.cfg b/lgsm/config-default/config-lgsm/ut99server/_default.cfg index d49740942..e4949ee82 100644 --- a/lgsm/config-default/config-lgsm/ut99server/_default.cfg +++ b/lgsm/config-default/config-lgsm/ut99server/_default.cfg @@ -90,6 +90,19 @@ ansi="on" # Message Display Time sleeptime="0.5" +# Stop Mode | https://docs.linuxgsm.com/steamcmd/stopmode +# 1: tmux kill +# 2: CTRL+c +# 3: quit +# 4: quit 120s +# 5: stop +# 6: q +# 7: exit +# 8: 7 Days to Die +# 9: Gold Source +# 10: Teamspeak 3 +stopmode="2" + ## LinuxGSM Server Details # Do not edit gamename="Unreal Tournament 99" diff --git a/lgsm/config-default/config-lgsm/utserver/_default.cfg b/lgsm/config-default/config-lgsm/utserver/_default.cfg index 3cd111eb3..067b5845a 100644 --- a/lgsm/config-default/config-lgsm/utserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/utserver/_default.cfg @@ -94,6 +94,19 @@ ansi="on" # Message Display Time sleeptime="0.5" +# Stop Mode | https://docs.linuxgsm.com/steamcmd/stopmode +# 1: tmux kill +# 2: CTRL+c +# 3: quit +# 4: quit 120s +# 5: stop +# 6: q +# 7: exit +# 8: 7 Days to Die +# 9: Gold Source +# 10: Teamspeak 3 +stopmode="2" + ## LinuxGSM Server Details # Do not edit gamename="Unreal Tournament" diff --git a/lgsm/config-default/config-lgsm/vsserver/_default.cfg b/lgsm/config-default/config-lgsm/vsserver/_default.cfg index 94b192363..16efdfe02 100644 --- a/lgsm/config-default/config-lgsm/vsserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/vsserver/_default.cfg @@ -105,6 +105,19 @@ branch="" # Master Server | https://docs.linuxgsm.com/steamcmd/steam-master-server steammaster="true" +# Stop Mode | https://docs.linuxgsm.com/steamcmd/stopmode +# 1: tmux kill +# 2: CTRL+c +# 3: quit +# 4: quit 120s +# 5: stop +# 6: q +# 7: exit +# 8: 7 Days to Die +# 9: Gold Source +# 10: Teamspeak 3 +stopmode="9" + ## LinuxGSM Server Details # Do not edit gamename="Vampire Slayer" diff --git a/lgsm/config-default/config-lgsm/wetserver/_default.cfg b/lgsm/config-default/config-lgsm/wetserver/_default.cfg index 1a5f66c4d..39fdcde91 100644 --- a/lgsm/config-default/config-lgsm/wetserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/wetserver/_default.cfg @@ -86,6 +86,19 @@ ansi="on" # Message Display Time sleeptime="0.5" +# Stop Mode | https://docs.linuxgsm.com/steamcmd/stopmode +# 1: tmux kill +# 2: CTRL+c +# 3: quit +# 4: quit 120s +# 5: stop +# 6: q +# 7: exit +# 8: 7 Days to Die +# 9: Gold Source +# 10: Teamspeak 3 +stopmode="3" + ## LinuxGSM Server Details # Do not edit gamename="Wolfenstein: Enemy Territory" diff --git a/lgsm/config-default/config-lgsm/wurmserver/_default.cfg b/lgsm/config-default/config-lgsm/wurmserver/_default.cfg index 9db80aafb..30b12de19 100644 --- a/lgsm/config-default/config-lgsm/wurmserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/wurmserver/_default.cfg @@ -96,6 +96,19 @@ branch="" # Master Server | https://docs.linuxgsm.com/steamcmd/steam-master-server steammaster="false" +# Stop Mode | https://docs.linuxgsm.com/steamcmd/stopmode +# 1: tmux kill +# 2: CTRL+c +# 3: quit +# 4: quit 120s +# 5: stop +# 6: q +# 7: exit +# 8: 7 Days to Die +# 9: Gold Source +# 10: Teamspeak 3 +stopmode="2" + ## LinuxGSM Server Details # Do not edit gamename="Wurm Unlimited" diff --git a/lgsm/config-default/config-lgsm/zmrserver/_default.cfg b/lgsm/config-default/config-lgsm/zmrserver/_default.cfg index d51752fec..44cb30fb3 100644 --- a/lgsm/config-default/config-lgsm/zmrserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/zmrserver/_default.cfg @@ -105,6 +105,19 @@ branch="" # Master Server | https://docs.linuxgsm.com/steamcmd/steam-master-server steammaster="true" +# Stop Mode | https://docs.linuxgsm.com/steamcmd/stopmode +# 1: tmux kill +# 2: CTRL+c +# 3: quit +# 4: quit 120s +# 5: stop +# 6: q +# 7: exit +# 8: 7 Days to Die +# 9: Gold Source +# 10: Teamspeak 3 +stopmode="3" + ## LinuxGSM Server Details # Do not edit gamename="Zombie Master: Reborn" diff --git a/lgsm/config-default/config-lgsm/zpsserver/_default.cfg b/lgsm/config-default/config-lgsm/zpsserver/_default.cfg index 36e8373f3..8c926cac5 100644 --- a/lgsm/config-default/config-lgsm/zpsserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/zpsserver/_default.cfg @@ -110,6 +110,19 @@ branch="" # Master Server | https://docs.linuxgsm.com/steamcmd/steam-master-server steammaster="true" +# Stop Mode | https://docs.linuxgsm.com/steamcmd/stopmode +# 1: tmux kill +# 2: CTRL+c +# 3: quit +# 4: quit 120s +# 5: stop +# 6: q +# 7: exit +# 8: 7 Days to Die +# 9: Gold Source +# 10: Teamspeak 3 +stopmode="3" + ## LinuxGSM Server Details # Do not edit gamename="Zombie Panic! Source" diff --git a/lgsm/functions/command_stop.sh b/lgsm/functions/command_stop.sh index 3aae20992..01cce6a4a 100644 --- a/lgsm/functions/command_stop.sh +++ b/lgsm/functions/command_stop.sh @@ -83,7 +83,8 @@ fn_stop_graceful_goldsource(){ fn_script_log_pass "Graceful: sending \"quit\": OK: ${seconds} seconds" } -fn_stop_telnet_sdtd(){ +# telnet command for sdtd graceful shutdown. +fn_stop_graceful_sdtd_telnet(){ if [ -z "${telnetpass}" ]||[ "${telnetpass}" == "NOT SET" ]; then sdtd_telnet_shutdown=$( expect -c ' proc abort {} { @@ -130,7 +131,7 @@ fn_stop_graceful_sdtd(){ for telnetip in 127.0.0.1 ${ip}; do fn_print_dots "Graceful: telnet: ${telnetip}:${telnetport}" fn_script_log_info "Graceful: telnet: ${telnetip}:${telnetport}" - fn_stop_telnet_sdtd + fn_stop_graceful_sdtd_telnet completed=$(echo -en "\n ${sdtd_telnet_shutdown}" | grep "Completed.") refused=$(echo -en "\n ${sdtd_telnet_shutdown}" | grep "Timeout or EOF") if [ -n "${refused}" ]; then @@ -146,7 +147,7 @@ fn_stop_graceful_sdtd(){ # the connection has closed, confirming that the tmux session can now be killed. if [ -n "${completed}" ]; then for seconds in {1..30}; do - fn_stop_telnet_sdtd + fn_stop_graceful_sdtd_telnet refused=$(echo -en "\n ${sdtd_telnet_shutdown}" | grep "Timeout or EOF") if [ -n "${refused}" ]; then fn_print_ok "Graceful: telnet: ${telnetip}:${telnetport} : " @@ -181,63 +182,26 @@ fn_stop_graceful_sdtd(){ } fn_stop_graceful_select(){ - if [ "${shortname}" == "sdtd" ]; then - fn_stop_graceful_sdtd - elif [ "${engine}" == "spark" ]; then + if [ "${stopmode}" == "1" ]; then + fn_stop_tmux + elif [ "${stopmode}" == "2" ]; then + fn_stop_graceful_ctrlc + elif [ "${stopmode}" == "3" ]; then + fn_stop_graceful_cmd "quit" 30 + elif [ "${stopmode}" == "4" ]; then + fn_stop_graceful_cmd "quit" 120 + elif [ "${stopmode}" == "5" ]; then + fn_stop_graceful_cmd "stop" 30 + elif [ "${stopmode}" == "6" ]; then fn_stop_graceful_cmd "q" 30 - elif [ "${shortname}" == "terraria" ]; then + elif [ "${stopmode}" == "7" ]; then fn_stop_graceful_cmd "exit" 30 - elif [ "${shortname}" == "mc" ]; then - fn_stop_graceful_cmd "stop" 30 - elif [ "${shortname}" == "mta" ]; then - # Long wait time required for mta - # as resources shutdown individually. - fn_stop_graceful_cmd "quit" 120 - elif [ "${engine}" == "goldsource" ]; then + elif [ "${stopmode}" == "8" ]; then + fn_stop_graceful_sdtd + elif [ "${stopmode}" == "9" ]; then fn_stop_graceful_goldsource - elif [ "${engine}" == "unity3d" ]||[ "${engine}" == "unreal4" ]||[ "${engine}" == "unreal3" ]||[ "${engine}" == "unreal2" ]||[ "${engine}" == "unreal" ]||[ "${shortname}" == "fctr" ]||[ "${shortname}" == "mumble" ]||[ "${shortname}" == "wurm" ]||[ "${shortname}" == "jc2" ]||[ "${shortname}" == "jc3" ]||[ "${shortname}" == "sol" ]; then - fn_stop_graceful_ctrlc - elif [ "${engine}" == "source" ]||[ "${engine}" == "quake" ]||[ "${engine}" == "idtech2" ]||[ "${engine}" == "idtech3" ]||[ "${engine}" == "idtech3_ql" ]||[ "${shortname}" == "pz" ]||[ "${shortname}" == "rw" ]; then - fn_stop_graceful_cmd "quit" 30 - fi -} - -fn_stop_ark(){ - # The maximum number of times to check if the ark pid has closed gracefully. - maxpiditer=15 - 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="${serverfiles}" - 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}" - else - break - fi - 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 + elif [ "${stopmode}" == "10" ]; then + fn_stop_teamspeak3 fi } @@ -258,16 +222,11 @@ fn_stop_teamspeak3(){ fn_stop_tmux(){ fn_print_dots "${servername}" fn_script_log_info "tmux kill-session: ${servername}" - # Kill tmux session + # Kill tmux session. tmux kill-session -t "${servicename}" > /dev/null 2>&1 fn_sleep_time check_status.sh if [ "${status}" == "0" ]; then - # ARK does not clean up immediately after tmux is killed. - # Make certain the ports are cleared before continuing. - if [ "${shortname}" == "ark" ]; then - fn_stop_ark - fi fn_print_ok_nl "${servername}" fn_script_log_pass "Stopped ${servername}" else @@ -284,9 +243,10 @@ fn_stop_pre_check(){ elif [ "${shortname}" == "ts3" ]; then fn_stop_teamspeak3 else + # Select graceful shutdown. fn_stop_graceful_select fi - # Check status again, a stop tmux session if needed. + # Check status again, a kill tmux session if graceful shutdown failed. check_status.sh if [ "${status}" != "0" ]; then fn_stop_tmux diff --git a/lgsm/functions/info_config.sh b/lgsm/functions/info_config.sh index 15d91de7e..d141af6ab 100644 --- a/lgsm/functions/info_config.sh +++ b/lgsm/functions/info_config.sh @@ -1320,7 +1320,7 @@ elif [ "${engine}" == "source" ]||[ "${engine}" == "goldsource" ]; then # Starbound elif [ "${shortname}" == "sb" ]; then fn_info_config_starbound -# TeamSpeak 3 +# 10: Teamspeak 3 elif [ "${shortname}" == "ts3" ]; then fn_info_config_teamspeak3 # Mumble From 39bed3ee077bafc63ee5114881259a6d3895f11e Mon Sep 17 00:00:00 2001 From: Frisasky Date: Sun, 22 Sep 2019 02:25:49 +0800 Subject: [PATCH 164/534] fix(insserver): resolve config issues (#2521) --- lgsm/config-default/config-lgsm/insserver/_default.cfg | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/lgsm/config-default/config-lgsm/insserver/_default.cfg b/lgsm/config-default/config-lgsm/insserver/_default.cfg index c05287dc2..c2cd9fb35 100644 --- a/lgsm/config-default/config-lgsm/insserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/insserver/_default.cfg @@ -13,10 +13,9 @@ ip="0.0.0.0" port="27015" clientport="27005" sourcetvport="27020" -defaultmap="ministry" -maxplayers="16" +defaultmap="embassy_coop checkpoint" +maxplayers="32" tickrate="64" -workshop="0" ## Optional: Game Server Login Token # GSLT can be used for running a public server. @@ -25,7 +24,7 @@ gslt="" ## Server Start Command | https://docs.linuxgsm.com/configuration/start-parameters#additional-parameters fn_parms(){ -parms="-game insurgency -strictportbind -ip ${ip} -port ${port} +clientport ${clientport} +tv_port ${sourcetvport} -tickrate ${tickrate} +sv_setsteamaccount ${gslt} +map ${defaultmap} +servercfgfile ${servercfg} -maxplayers ${maxplayers} +sv_workshop_enabled ${workshop} -norestart" +parms="-game insurgency -strictportbind -ip ${ip} -port ${port} +clientport ${clientport} +tv_port ${sourcetvport} -tickrate ${tickrate} +sv_setsteamaccount ${gslt} +map ${defaultmap} +servercfgfile ${servercfg} -maxplayers ${maxplayers} -workshop" } #### LinuxGSM Settings #### From 5e6773a0318ff0824fa5c5e6bbe34556584bcac9 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Sun, 22 Sep 2019 14:02:01 +0100 Subject: [PATCH 165/534] v19.10.2 --- linuxgsm.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/linuxgsm.sh b/linuxgsm.sh index 41f8cf2d1..143493712 100755 --- a/linuxgsm.sh +++ b/linuxgsm.sh @@ -20,7 +20,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="v19.10.1" +version="v19.10.2" shortname="core" gameservername="core" rootdir="$(dirname "$(readlink -f "${BASH_SOURCE[0]}")")" From 98e7b2bc389e5c49dde07c5f76f3a3af1389b605 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Mon, 23 Sep 2019 11:01:44 +0100 Subject: [PATCH 166/534] added ko-fi --- .github/FUNDING.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/FUNDING.yml b/.github/FUNDING.yml index d05c374dc..79d78730b 100644 --- a/.github/FUNDING.yml +++ b/.github/FUNDING.yml @@ -3,7 +3,7 @@ github: # Replace with up to 4 GitHub Sponsors-enabled usernames e.g., [user1, user2] patreon: dgibbs # Replace with a single Patreon username open_collective: # Replace with a single Open Collective username -ko_fi: # Replace with a single Ko-fi username +ko_fi: dgibbs # Replace with a single Ko-fi username tidelift: # Replace with a single Tidelift platform-name/package-name e.g., npm/babel community_bridge: # Replace with a single Community Bridge project-name e.g., cloud-foundry liberapay: # Replace with a single Liberapay username From 11336dc7ddd5f4dcf73dd248c6fe989ddd07f8e4 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Fri, 4 Oct 2019 12:09:29 +0100 Subject: [PATCH 167/534] feat(details): Add game server resource usage and details refactor (#2527) * Add game server memory usage in details * add network details * added link speed --- .../config-lgsm/ts3server/_default.cfg | 2 +- lgsm/functions/alert.sh | 4 +- lgsm/functions/command_details.sh | 4 +- lgsm/functions/command_postdetails.sh | 4 +- lgsm/functions/info_distro.sh | 23 +- lgsm/functions/info_messages.sh | 362 ++++++++++-------- 6 files changed, 235 insertions(+), 164 deletions(-) diff --git a/lgsm/config-default/config-lgsm/ts3server/_default.cfg b/lgsm/config-default/config-lgsm/ts3server/_default.cfg index f59afdfde..0d595fb69 100644 --- a/lgsm/config-default/config-lgsm/ts3server/_default.cfg +++ b/lgsm/config-default/config-lgsm/ts3server/_default.cfg @@ -96,7 +96,7 @@ sleeptime="0.5" # 8: 7 Days to Die # 9: Gold Source # 10: Teamspeak 3 -stopmode="" +stopmode="10" ## LinuxGSM Server Details # Do not edit diff --git a/lgsm/functions/alert.sh b/lgsm/functions/alert.sh index a5b753f0d..ba5b19bf0 100644 --- a/lgsm/functions/alert.sh +++ b/lgsm/functions/alert.sh @@ -18,8 +18,8 @@ fn_alert_log(){ { fn_info_message_head fn_info_message_distro - fn_info_message_performance - fn_info_message_disk + fn_info_message_server_resource + fn_info_message_gameserver_resource fn_info_message_gameserver fn_info_logs } | sed -r "s/\x1B\[([0-9]{1,2}(;[0-9]{1,2})?)?[m|K]//g"| tee -a "${alertlog}" > /dev/null 2>&1 diff --git a/lgsm/functions/command_details.sh b/lgsm/functions/command_details.sh index f70361d50..6e4e8fecc 100644 --- a/lgsm/functions/command_details.sh +++ b/lgsm/functions/command_details.sh @@ -17,8 +17,8 @@ info_distro.sh info_messages.sh query_gamedig.sh fn_info_message_distro -fn_info_message_performance -fn_info_message_disk +fn_info_message_server_resource +fn_info_message_gameserver_resource fn_info_message_gameserver fn_info_message_script fn_info_message_backup diff --git a/lgsm/functions/command_postdetails.sh b/lgsm/functions/command_postdetails.sh index 817d8d6c0..5fa7532b5 100644 --- a/lgsm/functions/command_postdetails.sh +++ b/lgsm/functions/command_postdetails.sh @@ -61,8 +61,8 @@ else touch "${postdetailslog}" || fn_bad_postdetailslog { fn_info_message_distro - fn_info_message_performance - fn_info_message_disk + fn_info_message_server_resource + fn_info_message_gameserver_resource fn_info_message_gameserver fn_info_message_script fn_info_message_backup diff --git a/lgsm/functions/info_distro.sh b/lgsm/functions/info_distro.sh index 76445050f..745e86060 100644 --- a/lgsm/functions/info_distro.sh +++ b/lgsm/functions/info_distro.sh @@ -7,6 +7,12 @@ local function_selfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" +### Game Server pid +if [ "${status}" == "1" ]; then + if [ "${shortname}" != "ts3" ]; then + gameserverpid=$(tmux list-sessions -F "#{session_name} #{pane_pid}"| grep "^${servicename}"|awk '{print $2}') + fi +fi ### Distro information ## Distro @@ -92,7 +98,11 @@ load=$(uptime|awk -F 'load average: ' '{ print $2 }') ## CPU information cpumodel=$(awk -F: '/model name/ {name=$2} END {print name}' /proc/cpuinfo | sed 's/^[ \t]*//;s/[ \t]*$//') cpucores=$(awk -F: '/model name/ {core++} END {print core}' /proc/cpuinfo) -cpufreuency=$(awk -F: ' /cpu MHz/ {freq=$2} END {print freq " MHz"}' /proc/cpuinfo | sed 's/^[ \t]*//;s/[ \t]*$//') +cpufreqency=$(awk -F: ' /cpu MHz/ {freq=$2} END {print freq " MHz"}' /proc/cpuinfo | sed 's/^[ \t]*//;s/[ \t]*$//') +# CPU usage of the game server pid +if [ "${status}" == "1" ]; then + cpuused=$(ps --forest -o pcpu -g "$(ps -o sid= -p "${gameserverpid}")"|awk '{s+=$1} END {print s}') +fi ## Memory information # Available RAM and swap. @@ -126,6 +136,13 @@ if [ -n "$(command -v numfmt 2>/dev/null)" ]; then swaptotal=$(numfmt --to=iec --from=iec --suffix=B "$(grep ^SwapTotal /proc/meminfo | awk '{print $2}')K") swapfree=$(numfmt --to=iec --from=iec --suffix=B "$(grep ^SwapFree /proc/meminfo | awk '{print $2}')K") swapused=$(numfmt --to=iec --from=iec --suffix=B "$(($(grep ^SwapTotal /proc/meminfo | awk '{print $2}')-$(grep ^SwapFree /proc/meminfo | awk '{print $2}')))K") + # RAM usage of the game server pid + # MB + if [ "${status}" == "1" ]; then + memused=$(ps --forest -o rss -g "$(ps -o sid= -p "${gameserverpid}")"|awk '{s+=$1} END {print s}'| awk '{$1/=1024;printf "%.0fMB\t",$1}{print $2}') + # % + pmemused=$(ps --forest -o %mem -g "$(ps -o sid= -p 2766)"|awk '{s+=$1} END {print s}') + fi else # Older distros will need to use free. # Older versions of free do not support -h option. @@ -206,6 +223,10 @@ if [ -d "${backupdir}" ]; then fi fi +# Network Interface name +netint=$(ip -o addr | grep "${ip}" | awk '{print $2}') +netlink=$(ethtool "${netint}" 2>/dev/null| grep Speed | awk '{print $2}') + # External IP address if [ -z "${extip}" ]; then extip=$(${curlpath} -4 -m 3 ifconfig.co 2>/dev/null) diff --git a/lgsm/functions/info_messages.sh b/lgsm/functions/info_messages.sh index dfe75c037..067e5283c 100644 --- a/lgsm/functions/info_messages.sh +++ b/lgsm/functions/info_messages.sh @@ -46,85 +46,127 @@ fn_info_message_distro(){ echo -e "${lightyellow}Distro Details${default}" fn_messages_separator { - 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}" + echo -e "${lightblue}Distro:\t${default}${distroname}" + echo -e "${lightblue}Arch:\t${default}${arch}" + echo -e "${lightblue}Kernel:\t${default}${kernel}" + echo -e "${lightblue}Hostname:\t${default}${HOSTNAME}" + echo -e "${lightblue}Uptime:\t${default}${days}d, ${hours}h, ${minutes}m" + echo -e "${lightblue}tmux:\t${default}${tmuxv}" + echo -e "${lightblue}glibc:\t${default}${glibcversion}" } | column -s $'\t' -t } -fn_info_message_performance(){ +fn_info_message_server_resource(){ # - # Performance - # ===================================== - # Uptime: 55d, 3h, 38m - # Avg Load: 1.00, 1.01, 0.78 + # Server Resource + # ========================================================================================================================================================================================================================================== + # CPU + # Model: Intel(R) Xeon(R) CPU E5-2680 v3 @ 2.50GHz + # Cores: 4 + # Frequency: 2499.994 MHz + # Avg Load: 0.20, 0.08, 0.01 + # + # Memory + # Mem: total used free cached available + # Physical: 7.8GB 598MB 7.0GB 4.0GB 7.0GB + # Swap: 512MB 0B 512MB # - # Mem: total used free cached - # Physical: 741M 656M 85M 256M - # Swap: 0B 0B 0B + # Storage + # Filesystem: /dev/sda + # Total: 157G + # Used: 138G + # Available: 12G echo -e "" - echo -e "${lightyellow}Performance${default}" - + echo -e "${lightyellow}Server Resource${default}" + fn_messages_separator { - echo -e "${blue}Uptime:\t${default}${days}d, ${hours}h, ${minutes}m" - echo -e "${blue}Avg Load:\t${default}${load}" + echo -e "${lightyellow}CPU\t${default}" + echo -e "${lightblue}Model:\t${default}${cpumodel}" + echo -e "${lightblue}Cores:\t${default}${cpucores}" + echo -e "${lightblue}Frequency:\t${default}${cpufreqency}" + echo -e "${lightblue}Avg Load:\t${default}${load}" } | column -s $'\t' -t echo -e "" { - echo -e "${blue}CPU Model:\t${default}${cpumodel}" - echo -e "${blue}CPU Cores:\t${default}${cpucores}" - echo -e "${blue}CPU Frequency:\t${default}${cpufreuency}" + echo -e "${lightyellow}Memory\t${default}" + echo -e "${lightblue}Mem:\t${lightblue}total\tused\tfree\tcached\tavailable${default}" + echo -e "${lightblue}Physical:\t${default}${physmemtotal}\t${physmemused}\t${physmemfree}\t${physmemcached}\t${physmemavailable}${default}" + echo -e "${lightblue}Swap:\t${default}${swaptotal}\t${swapused}\t${swapfree}${default}" } | column -s $'\t' -t echo -e "" { - echo -e "${blue}Mem:\t${blue}total\tused\tfree\tcached\tavailable${default}" - echo -e "${blue}Physical:\t${default}${physmemtotal}\t${physmemused}\t${physmemfree}\t${physmemcached}\t${physmemavailable}${default}" - echo -e "${blue}Swap:\t${default}${swaptotal}\t${swapused}\t${swapfree}${default}" + echo -e "${lightyellow}Storage${default}" + echo -e "${lightblue}Filesystem:\t${default}${filesystem}" + echo -e "${lightblue}Total:\t\t${default}${totalspace}" + echo -e "${lightblue}Used:\t\t${default}${usedspace}" + echo -e "${lightblue}Available:\t${default}${availspace}" + } | column -s $'\t' -t + echo -e "" + { + echo -e "${lightyellow}Network${default}" + if [ "${netint}" ]; then + echo -e "${lightblue}Interface:\t${default}${netint}" + fi + if [ "${netlink}" ]; then + echo -e "${lightblue}Link Speed:\t${default}${netlink}" + fi + echo -e "${lightblue}IP:\t${default}${ip}" + if [ "${ip}" != "${extip}" ]; then + echo -e "${lightblue}Internet IP:\t${default}${extip}" + fi } | column -s $'\t' -t } -fn_info_message_disk(){ +fn_info_message_gameserver_resource(){ + # Game Server Resource Usage + # ========================================================================================================================================================================================================================================== + # CPU Used: 2.5% + # Mem Used: 2.1% 171MB # # Storage - # ===================================== - # Filesystem: /dev/disk/by-uuid/320c8edd-a2ce-4a23-8c9d-e00a7af2d6ff - # Total: 15G - # Used: 8.4G - # Available: 5.7G - # LinuxGSM Total: 1G - # Serverfiles: 961M - # Backups: 2G + # Total: 21G + # Serverfiles: 20G + # Backups: 20K echo -e "" - echo -e "${lightyellow}Storage${default}" + echo -e "${lightyellow}Game Server Resource Usage${default}" fn_messages_separator { - 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}LinuxGSM Total:\t${default}${rootdirdu}" - echo -e "${blue}Serverfiles:\t${default}${serverfilesdu}" + if [ "${status}" == "1" ]; then + echo -e "${lightblue}CPU Used:\t${default}${cpuused}%${default}" + echo -e "${lightblue}Mem Used:\t${default}${pmemused}%\t${memused}${default}" + else + echo -e "${lightblue}CPU Used:\t${default}0%${default}" + echo -e "${lightblue}Mem Used:\t${default}0%\t0MB${default}" + fi + } | column -s $'\t' -t + echo -e "" + { + echo -e "${lightyellow}Storage${default}" + echo -e "${lightblue}Total:\t${default}${rootdirdu}" + echo -e "${lightblue}Serverfiles:\t${default}${serverfilesdu}" if [ -d "${backupdir}" ]; then - echo -e "${blue}Backups:\t${default}${backupdirdu}" + echo -e "${lightblue}Backups:\t${default}${backupdirdu}" fi } | column -s $'\t' -t } fn_info_message_gameserver(){ - # - # Quake Live Server Details - # ===================================== - # Server name: ql-server - # Server IP: 1.2.3.4:27960 - # RCON password: CHANGE_ME + # Counter-Strike: Global Offensive Server Details + # ========================================================================================================================================================================================================================================== + # Server name: LinuxGSM + # Server IP: 80.70.189.230:27015 # Server password: NOT SET - # Maxplayers: 16 - # Status: OFFLINE + # RCON password: adminF54CC0VR + # Players: 0/16 + # Current Map: de_mirage + # Default Map: de_mirage + # Game type: 0 + # Game mode: 0 + # Tick rate: 64 + # Master Server: true + # Status: ONLINE echo -e "" echo -e "${lightgreen}${gamename} Server Details${default}" @@ -133,215 +175,215 @@ fn_info_message_gameserver(){ { # Server name if [ -n "${gdname}" ]; then - echo -e "${blue}Server name:\t${default}${gdname}" + echo -e "${lightblue}Server name:\t${default}${gdname}" elif [ -n "${servername}" ]; then - echo -e "${blue}Server name:\t${default}${servername}" + echo -e "${lightblue}Server name:\t${default}${servername}" fi # Server description if [ -n "${serverdescription}" ]; then - echo -e "${blue}Server Description:\t${default}${serverdescription}" + echo -e "${lightblue}Server Description:\t${default}${serverdescription}" fi # Branch if [ -n "${branch}" ]; then - echo -e "${blue}Branch:\t${default}${branch}" + echo -e "${lightblue}Branch:\t${default}${branch}" fi # Server ip if [ "${multiple_ip}" == "1" ]; then - echo -e "${blue}Server IP:\t${default}NOT SET" + echo -e "${lightblue}Server IP:\t${default}NOT SET" else - echo -e "${blue}Server IP:\t${default}${ip}:${port}" + echo -e "${lightblue}Server IP:\t${default}${ip}:${port}" fi # Internet ip if [ -n "${extip}" ]; then if [ "${ip}" != "${extip}" ]; then - echo -e "${blue}Internet IP:\t${default}${extip}:${port}" + echo -e "${lightblue}Internet IP:\t${default}${extip}:${port}" fi fi # Display ip if [ -n "${displayip}" ]; then - echo -e "${blue}Display IP:\t${default}${displayip}:${port}" + echo -e "${lightblue}Display IP:\t${default}${displayip}:${port}" fi # Server password if [ -n "${serverpassword}" ]; then - echo -e "${blue}Server password:\t${default}${serverpassword}" + echo -e "${lightblue}Server password:\t${default}${serverpassword}" fi # Query enabled (Starbound) if [ -n "${queryenabled}" ]; then - echo -e "${blue}Query enabled:\t${default}${queryenabled}" + echo -e "${lightblue}Query enabled:\t${default}${queryenabled}" fi # RCON enabled (Starbound) if [ -n "${rconenabled}" ]; then - echo -e "${blue}RCON enabled:\t${default}${rconpassword}" + echo -e "${lightblue}RCON enabled:\t${default}${rconpassword}" fi # RCON password if [ -n "${rconpassword}" ]; then - echo -e "${blue}RCON password:\t${default}${rconpassword}" + echo -e "${lightblue}RCON password:\t${default}${rconpassword}" fi # RCON web (Rust) if [ -n "${rconweb}" ]; then - echo -e "${blue}RCON web:\t${default}${rconweb}" + echo -e "${lightblue}RCON web:\t${default}${rconweb}" fi # Admin password if [ -n "${adminpassword}" ]; then - echo -e "${blue}Admin password:\t${default}${adminpassword}" + echo -e "${lightblue}Admin password:\t${default}${adminpassword}" fi # Stats password (Quake Live) if [ -n "${statspassword}" ]; then - echo -e "${blue}Stats password:\t${default}${statspassword}" + echo -e "${lightblue}Stats password:\t${default}${statspassword}" fi # Players if [ "${querystatus}" != "0" ]; then if [ -n "${maxplayers}" ]; then - echo -e "${blue}Maxplayers:\t${default}${maxplayers}" + echo -e "${lightblue}Maxplayers:\t${default}${maxplayers}" fi else if [ -n "${gdplayers}" ]&&[ -n "${gdmaxplayers}" ]; then - echo -e "${blue}Players:\t${default}${gdplayers}/${gdmaxplayers}" + echo -e "${lightblue}Players:\t${default}${gdplayers}/${gdmaxplayers}" elif [ -n "${gdplayers}" ]&&[ -n "${maxplayers}" ]; then - echo -e "${blue}Players:\t${default}${gdplayers}/${maxplayers}" + echo -e "${lightblue}Players:\t${default}${gdplayers}/${maxplayers}" elif [ -z "${gdplayers}" ]&&[ -n "${gdmaxplayers}" ]; then - echo -e "${blue}Players:\t${default}0/${gdmaxplayers}" + echo -e "${lightblue}Players:\t${default}0/${gdmaxplayers}" elif [ -n "${gdplayers}" ]&&[ -z "${gdmaxplayers}" ]; then - echo -e "${blue}Players:\t${default}${gdplayers}|∞" + echo -e "${lightblue}Players:\t${default}${gdplayers}|∞" elif [ -z "${gdplayers}" ]&&[ -z "${gdmaxplayers}" ]&&[ -n "${maxplayers}" ]; then - echo -e "${blue}Maxplayers:\t${default}${maxplayers}" + echo -e "${lightblue}Maxplayers:\t${default}${maxplayers}" fi fi # Bots if [ -n "${gdbots}" ]; then - echo -e "${blue}Bots:\t${default}${gdbots}" + echo -e "${lightblue}Bots:\t${default}${gdbots}" fi # Current Map if [ -n "${gdmap}" ]; then - echo -e "${blue}Current Map:\t${default}${gdmap}" + echo -e "${lightblue}Current Map:\t${default}${gdmap}" fi if [ -n "${defaultscenario}" ]; then # Current Scenario if [ -n "${gdgamemode}" ]; then - echo -e "${blue}Current Scenario:\t${default}${gdgamemode}" + echo -e "${lightblue}Current Scenario:\t${default}${gdgamemode}" fi else # Current Scenario if [ -n "${gdgamemode}" ]; then - echo -e "${blue}Current Game Mode:\t${default}${gdgamemode}" + echo -e "${lightblue}Current Game Mode:\t${default}${gdgamemode}" fi fi # Default Map if [ -n "${defaultmap}" ]; then - echo -e "${blue}Default Map:\t${default}${defaultmap}" + echo -e "${lightblue}Default Map:\t${default}${defaultmap}" fi # Default Scenario if [ -n "${defaultscenario}" ]; then - echo -e "${blue}Default Scenario:\t${default}${defaultscenario}" + echo -e "${lightblue}Default Scenario:\t${default}${defaultscenario}" fi # Game type if [ -n "${gametype}" ]; then - echo -e "${blue}Game type:\t${default}${gametype}" + echo -e "${lightblue}Game type:\t${default}${gametype}" fi # Game mode if [ -n "${gamemode}" ]; then - echo -e "${blue}Game mode:\t${default}${gamemode}" + echo -e "${lightblue}Game mode:\t${default}${gamemode}" fi # Game world if [ -n "${gameworld}" ]; then - echo -e "${blue}Game world:\t${default}${gameworld}" + echo -e "${lightblue}Game world:\t${default}${gameworld}" fi # Tick rate if [ -n "${tickrate}" ]; then - echo -e "${blue}Tick rate:\t${default}${tickrate}" + echo -e "${lightblue}Tick rate:\t${default}${tickrate}" fi # Sharding (Don't Starve Together) if [ -n "${sharding}" ]; then - echo -e "${blue}Sharding:\t${default}${sharding}" + echo -e "${lightblue}Sharding:\t${default}${sharding}" fi # Master (Don't Starve Together) if [ -n "${master}" ]; then - echo -e "${blue}Master:\t${default}${master}" + echo -e "${lightblue}Master:\t${default}${master}" fi # Shard (Don't Starve Together) if [ -n "${shard}" ]; then - echo -e "${blue}Shard:\t${default}${shard}" + echo -e "${lightblue}Shard:\t${default}${shard}" fi # Cluster (Don't Starve Together) if [ -n "${cluster}" ]; then - echo -e "${blue}Cluster:\t${default}${cluster}" + echo -e "${lightblue}Cluster:\t${default}${cluster}" fi # Cave (Don't Starve Together) if [ -n "${cave}" ]; then - echo -e "${blue}Cave:\t${default}${cave}" + echo -e "${lightblue}Cave:\t${default}${cave}" fi # Creativemode (Hurtworld) if [ -n "${creativemode}" ]; then - echo -e "${blue}Creativemode:\t${default}${creativemode}" + echo -e "${lightblue}Creativemode:\t${default}${creativemode}" fi # TeamSpeak dbplugin if [ -n "${dbplugin}" ]; then - echo -e "${blue}dbplugin:\t${default}${dbplugin}" + echo -e "${lightblue}dbplugin:\t${default}${dbplugin}" fi # ASE (Multi Theft Auto) if [ -n "${ase}" ]; then - echo -e "${blue}ASE:\t${default}${ase}" + echo -e "${lightblue}ASE:\t${default}${ase}" fi # Save interval (Rust) if [ -n "${saveinterval}" ]; then - echo -e "${blue}ASE:\t${default}${saveinterval} s" + echo -e "${lightblue}ASE:\t${default}${saveinterval} s" fi # Random map rotation mode (Squad and Post Scriptum) if [ -n "${randommap}" ]; then - echo -e "${blue}Map rotation:\t${default}${randommap}" + echo -e "${lightblue}Map rotation:\t${default}${randommap}" fi # Listed on Master Server if [ "${displaymasterserver}" ];then if [ "${displaymasterserver}" == "true" ];then - echo -e "${blue}Master Server:\t${green}${displaymasterserver}${default}" + echo -e "${lightblue}Master Server:\t${green}${displaymasterserver}${default}" else - echo -e "${blue}Master Server:\t${red}${displaymasterserver}${default}" + echo -e "${lightblue}Master Server:\t${red}${displaymasterserver}${default}" fi fi # Online status if [ "${status}" == "0" ]; then - echo -e "${blue}Status:\t${red}OFFLINE${default}" + echo -e "${lightblue}Status:\t${red}OFFLINE${default}" else - echo -e "${blue}Status:\t${green}ONLINE${default}" + echo -e "${lightblue}Status:\t${green}ONLINE${default}" fi } | column -s $'\t' -t echo -e "" @@ -349,80 +391,88 @@ fn_info_message_gameserver(){ fn_info_message_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 + # csgoserver Script Details + #========================================================================================================================================================================================================================================== + # Script name: csgoserver + # LinuxGSM version: v19.9.0 + # glibc required: 2.15 + # Discord alert: off + # Email alert: off + # Pushbullet alert: off + # IFTTT alert: off + # Mailgun (email) alert: off + # Pushover alert: off + # Telegram alert: off + # Update on start: off + # User: lgsm + # Location: /home/lgsm/csgoserver + # Config file: /home/lgsm/csgoserver/serverfiles/csgo/cfg/csgoserver.cfg + echo -e "${lightgreen}${selfname} Script Details${default}" fn_messages_separator { - # Service name - echo -e "${blue}Service name:\t${default}${servicename}" + # Script name + echo -e "${lightblue}Script name:\t${default}${servicename}" - # Script version + # LinuxGSM version if [ -n "${version}" ]; then - echo -e "${blue}${selfname} version:\t${default}${version}" + echo -e "${lightblue}LinuxGSM version:\t${default}${version}" fi - # User - echo -e "${blue}User:\t${default}$(whoami)" - # glibc required if [ -n "${glibc}" ]; then if [ "${glibc}" == "null" ]; then # Glibc is not required. : elif [ -z "${glibc}" ]; then - echo -e "${blue}glibc required:\t${red}UNKNOWN${default}" + echo -e "${lightblue}glibc required:\t${red}UNKNOWN${default}" elif [ "$(printf '%s\n'${glibc}'\n' ${glibcversion} | sort -V | head -n 1)" != "${glibc}" ]; then - echo -e "${blue}glibc required:\t${red}${glibc} ${default}(${red}distro glibc ${glibcversion} too old${default})" + echo -e "${lightblue}glibc required:\t${red}${glibc} ${default}(${red}distro glibc ${glibcversion} too old${default})" else - echo -e "${blue}glibc required:\t${green}${glibc}${default}" + echo -e "${lightblue}glibc required:\t${green}${glibc}${default}" fi fi # Discord alert - echo -e "${blue}Discord alert:\t${default}${discordalert}" + echo -e "${lightblue}Discord alert:\t${default}${discordalert}" # Email alert - echo -e "${blue}Email alert:\t${default}${emailalert}" + echo -e "${lightblue}Email alert:\t${default}${emailalert}" # Pushbullet alert - echo -e "${blue}Pushbullet alert:\t${default}${pushbulletalert}" + echo -e "${lightblue}Pushbullet alert:\t${default}${pushbulletalert}" # IFTTT alert - echo -e "${blue}IFTTT alert:\t${default}${iftttalert}" + echo -e "${lightblue}IFTTT alert:\t${default}${iftttalert}" # Mailgun alert - echo -e "${blue}Mailgun (email) alert:\t${default}${mailgunalert}" + echo -e "${lightblue}Mailgun (email) alert:\t${default}${mailgunalert}" # Pushover alert - echo -e "${blue}Pushover alert:\t${default}${pushoveralert}" + echo -e "${lightblue}Pushover alert:\t${default}${pushoveralert}" # Telegram alert - echo -e "${blue}Telegram alert:\t${default}${telegramalert}" + echo -e "${lightblue}Telegram alert:\t${default}${telegramalert}" # Update on start if [ -n "${updateonstart}" ]; then - echo -e "${blue}Update on start:\t${default}${updateonstart}" + echo -e "${lightblue}Update on start:\t${default}${updateonstart}" fi + # User + echo -e "${lightblue}User:\t${default}$(whoami)" + # Script location - echo -e "${blue}Location:\t${default}${rootdir}" + echo -e "${lightblue}Location:\t${default}${rootdir}" # Config file location if [ -n "${servercfgfullpath}" ]; then if [ -f "${servercfgfullpath}" ]; then - echo -e "${blue}Config file:\t${default}${servercfgfullpath}" + echo -e "${lightblue}Config file:\t${default}${servercfgfullpath}" elif [ -d "${servercfgfullpath}" ]; then - echo -e "${blue}Config dir:\t${default}${servercfgfullpath}" + echo -e "${lightblue}Config dir:\t${default}${servercfgfullpath}" else - echo -e "${blue}Config file:\t${default}${red}${servercfgfullpath}${default} (${red}FILE MISSING${default})" + echo -e "${lightblue}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}" + echo -e "${lightblue}Network config file:\t${default}${networkcfgfullpath}" fi } | column -s $'\t' -t } @@ -444,17 +494,17 @@ fn_info_message_backup(){ echo -e "No Backups created" else { - echo -e "${blue}No. of backups:\t${default}${backupcount}" - echo -e "${blue}Latest backup:${default}" + echo -e "${lightblue}No. of backups:\t${default}${backupcount}" + echo -e "${lightblue}Latest backup:${default}" if [ "${lastbackupdaysago}" == "0" ]; then - echo -e "${blue} date:\t${default}${lastbackupdate} (less than 1 day ago)" + echo -e "${lightblue} date:\t${default}${lastbackupdate} (less than 1 day ago)" elif [ "${lastbackupdaysago}" == "1" ]; then - echo -e "${blue} date:\t${default}${lastbackupdate} (1 day ago)" + echo -e "${lightblue} date:\t${default}${lastbackupdate} (1 day ago)" else - echo -e "${blue} date:\t${default}${lastbackupdate} (${lastbackupdaysago} days ago)" + echo -e "${lightblue} date:\t${default}${lastbackupdate} (${lastbackupdaysago} days ago)" fi - echo -e "${blue} file:\t${default}${lastbackup}" - echo -e "${blue} size:\t${default}${lastbackupsize}" + echo -e "${lightblue} file:\t${default}${lastbackup}" + echo -e "${lightblue} size:\t${default}${lastbackupsize}" } | column -s $'\t' -t fi } @@ -516,9 +566,9 @@ fn_info_message_ports(){ fn_info_message_statusbottom(){ echo -e "" if [ "${status}" == "0" ]; then - echo -e "${blue}Status:\t${red}OFFLINE${default}" + echo -e "${lightblue}Status:\t${red}OFFLINE${default}" else - echo -e "${blue}Status:\t${green}ONLINE${default}" + echo -e "${lightblue}Status:\t${green}ONLINE${default}" fi echo -e "" } @@ -934,17 +984,17 @@ fn_info_message_sdtd(){ echo -e "${lightgreen}${servername} WebAdmin${default}" fn_messages_separator { - 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}" + echo -e "${lightblue}WebAdmin enabled:\t${default}${webadminenabled}" + echo -e "${lightblue}WebAdmin url:\t${default}http://${ip}:${webadminport}" + echo -e "${lightblue}WebAdmin password:\t${default}${webadminpass}" } | column -s $'\t' -t echo -e "" echo -e "${lightgreen}${servername} Telnet${default}" fn_messages_separator { - 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}" + echo -e "${lightblue}Telnet enabled:\t${default}${telnetenabled}" + echo -e "${lightblue}Telnet address:\t${default}${ip} ${telnetport}" + echo -e "${lightblue}Telnet password:\t${default}${telnetpass}" } | column -s $'\t' -t } @@ -982,9 +1032,9 @@ fn_info_message_spark(){ echo -e "${lightgreen}${servername} WebAdmin${default}" fn_messages_separator { - 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}" + echo -e "${lightblue}WebAdmin url:\t${default}http://${ip}:${webadminport}/index.html" + echo -e "${lightblue}WebAdmin username:\t${default}${webadminuser}" + echo -e "${lightblue}WebAdmin password:\t${default}${webadminpass}" } | column -s $'\t' -t } @@ -1095,10 +1145,10 @@ fn_info_message_unreal(){ echo -e "${lightgreen}${servername} WebAdmin${default}" fn_messages_separator { - 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}" + echo -e "${lightblue}WebAdmin enabled:\t${default}${webadminenabled}" + echo -e "${lightblue}WebAdmin url:\t${default}http://${ip}:${webadminport}" + echo -e "${lightblue}WebAdmin username:\t${default}${webadminuser}" + echo -e "${lightblue}WebAdmin password:\t${default}${webadminpass}" } | column -s $'\t' -t } @@ -1115,10 +1165,10 @@ fn_info_message_unreal3(){ echo -e "${lightgreen}${servername} WebAdmin${default}" fn_messages_separator { - 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}" + echo -e "${lightblue}WebAdmin enabled:\t${default}${webadminenabled}" + echo -e "${lightblue}WebAdmin url:\t${default}http://${ip}:${webadminport}" + echo -e "${lightblue}WebAdmin username:\t${default}${webadminuser}" + echo -e "${lightblue}WebAdmin password:\t${default}${webadminpass}" } | column -s $'\t' -t } @@ -1146,10 +1196,10 @@ fn_info_message_kf2(){ echo -e "${lightgreen}${servername} WebAdmin${default}" fn_messages_separator { - 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}" + echo -e "${lightblue}WebAdmin enabled:\t${default}${webadminenabled}" + echo -e "${lightblue}WebAdmin url:\t${default}http://${ip}:${webadminport}" + echo -e "${lightblue}WebAdmin username:\t${default}${webadminuser}" + echo -e "${lightblue}WebAdmin password:\t${default}${webadminpass}" } | column -s $'\t' -t } From a08454daeeff2cae9efe426d84ed8753fca5f6e5 Mon Sep 17 00:00:00 2001 From: Frisasky Date: Mon, 7 Oct 2019 01:25:39 +0800 Subject: [PATCH 168/534] feat(config):standardise reservedslots variable (#2533) --- lgsm/config-default/config-lgsm/pstbsserver/_default.cfg | 4 ++-- lgsm/functions/info_config.sh | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/lgsm/config-default/config-lgsm/pstbsserver/_default.cfg b/lgsm/config-default/config-lgsm/pstbsserver/_default.cfg index 28cb15094..c3212981c 100644 --- a/lgsm/config-default/config-lgsm/pstbsserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/pstbsserver/_default.cfg @@ -17,11 +17,11 @@ queryport="10037" #servername="LinuxGSM Server" # If your server is not meeting the minimal server requirement, do not host the server for 80 players, decrease that number. maxplayers="40" -numreservedslots="2" +reservedslots="2" ## Server Start Command | https://docs.linuxgsm.com/configuration/start-parameters#additional-parameters fn_parms(){ -parms="MULTIHOME=${ip}?RANDOM=${randommap}?Port=${port}?QueryPort=${queryport}?MaxPlayers=${maxplayers}?NumReservedSlots=${numreservedslots}" +parms="MULTIHOME=${ip}?RANDOM=${randommap}?Port=${port}?QueryPort=${queryport}?MaxPlayers=${maxplayers}?NumReservedSlots=${reservedslots}" } #### LinuxGSM Settings #### diff --git a/lgsm/functions/info_config.sh b/lgsm/functions/info_config.sh index d141af6ab..f7bbb7bc2 100644 --- a/lgsm/functions/info_config.sh +++ b/lgsm/functions/info_config.sh @@ -391,11 +391,11 @@ fn_info_config_pstbs(){ if [ ! -f "${servercfgfullpath}" ]; then servername="${unavailable}" maxplayers="${unavailable}" - numreservedslots="${unavailable}" + reservedslots="${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]*$//')" maxplayers="$(grep "MaxPlayers=" "${servercfgfullpath}" | tr -cd '[:digit:]')" - numreservedslots="$(grep "NumReservedSlots=" "${servercfgfullpath}" | tr -cd '[:digit:]')" + reservedslots="$(grep "NumReservedSlots=" "${servercfgfullpath}" | tr -cd '[:digit:]')" fi if [ ! -f "${servercfgdir}/Rcon.cfg" ]; then From f975d5cab6d421899fb27290dfc4ca23777cb353 Mon Sep 17 00:00:00 2001 From: Frisasky Date: Mon, 7 Oct 2019 01:27:50 +0800 Subject: [PATCH 169/534] feat(steamcmd):fix branch support (#2532) --- lgsm/functions/command_validate.sh | 4 ++-- lgsm/functions/install_server_files.sh | 8 ++++---- lgsm/functions/update_steamcmd.sh | 4 ++-- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/lgsm/functions/command_validate.sh b/lgsm/functions/command_validate.sh index f6be3f5b6..b2395f6d5 100644 --- a/lgsm/functions/command_validate.sh +++ b/lgsm/functions/command_validate.sh @@ -23,9 +23,9 @@ fn_validation(){ fi if [ "${appid}" == "90" ]; then - ${unbuffer} ./steamcmd.sh +login "${steamuser}" "${steampass}" +force_install_dir "${serverfiles}" +app_info_print 70 +app_set_config 90 mod "${appidmod}" +app_update "${appid}" ${branch} +app_update "${appid}" ${branch} validate +quit | tee -a "${lgsmlog}" + ${unbuffer} ./steamcmd.sh +login "${steamuser}" "${steampass}" +force_install_dir "${serverfiles}" +app_info_print 70 +app_set_config 90 mod "${appidmod}" +app_update "${appid}" ${branch} +app_update "${appid}" -beta ${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 "${lgsmlog}" + ${unbuffer} ./steamcmd.sh +login "${steamuser}" "${steampass}" +force_install_dir "${serverfiles}" +app_update "${appid}" -beta ${branch} validate +quit | tee -a "${lgsmlog}" 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 4046798c0..9b9343a66 100644 --- a/lgsm/functions/install_server_files.sh +++ b/lgsm/functions/install_server_files.sh @@ -102,18 +102,18 @@ fn_install_server_files_steamcmd(){ if [ "${counter}" -le "4" ]; then if [ "${appid}" == "90" ]; then - ${unbuffer} ./steamcmd.sh +login "${steamuser}" "${steampass}" +force_install_dir "${serverfiles}" +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}" -beta ${branch} +quit local exitcode=$? else - ${unbuffer} ./steamcmd.sh +login "${steamuser}" "${steampass}" +force_install_dir "${serverfiles}" +app_update "${appid}" ${branch} +quit + ${unbuffer} ./steamcmd.sh +login "${steamuser}" "${steampass}" +force_install_dir "${serverfiles}" +app_update "${appid}" -beta ${branch} +quit local exitcode=$? 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}" -beta ${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}" -beta ${branch} validate +quit local exitcode=$? fi fi diff --git a/lgsm/functions/update_steamcmd.sh b/lgsm/functions/update_steamcmd.sh index 8f27cd3fe..9185617f8 100644 --- a/lgsm/functions/update_steamcmd.sh +++ b/lgsm/functions/update_steamcmd.sh @@ -19,9 +19,9 @@ fn_update_steamcmd_dl(){ cd "${steamcmddir}" || exit if [ "${appid}" == "90" ]; then - ${unbuffer} ./steamcmd.sh +login "${steamuser}" "${steampass}" +force_install_dir "${serverfiles}" +app_set_config 90 mod "${appidmod}" +app_update "${appid}" ${branch} +quit | tee -a "${lgsmlog}" + ${unbuffer} ./steamcmd.sh +login "${steamuser}" "${steampass}" +force_install_dir "${serverfiles}" +app_set_config 90 mod "${appidmod}" +app_update "${appid}" -beta ${branch} +quit | tee -a "${lgsmlog}" else - ${unbuffer} ./steamcmd.sh +login "${steamuser}" "${steampass}" +force_install_dir "${serverfiles}" +app_update "${appid}" ${branch} +quit | tee -a "${lgsmlog}" + ${unbuffer} ./steamcmd.sh +login "${steamuser}" "${steampass}" +force_install_dir "${serverfiles}" +app_update "${appid}" -beta ${branch} +quit | tee -a "${lgsmlog}" fi fix.sh } From fc13af0b9c30ede746a6c86448bf94813c9fd63a Mon Sep 17 00:00:00 2001 From: Kenny Lindelof Date: Sun, 6 Oct 2019 13:29:35 -0400 Subject: [PATCH 170/534] feat(alerts): add slack support to alerts (#2529) * working on slack integration need to test on an actual server now * forgot to include the correct script * fixed a couple things with naming * added slack alert to the core_functions list * fixed issue with variables on slack alert * changed message structure to not be hard coded * trying to resolve jq problem with parsing * had the gamename where the hostname should be * fixed error with jq and how the data was formated * fixed if logic to look for ok on response from slack webhook * missed a space * added doc URL to slack in default config * added slack alert variables to remaining configs --- .../config-lgsm/ahlserver/_default.cfg | 4 + .../config-lgsm/arkserver/_default.cfg | 4 + .../config-lgsm/arma3server/_default.cfg | 4 + .../config-lgsm/bb2server/_default.cfg | 4 + .../config-lgsm/bbserver/_default.cfg | 4 + .../config-lgsm/bdserver/_default.cfg | 4 + .../config-lgsm/bf1942server/_default.cfg | 4 + .../config-lgsm/bmdmserver/_default.cfg | 4 + .../config-lgsm/boserver/_default.cfg | 4 + .../config-lgsm/bsserver/_default.cfg | 4 + .../config-lgsm/bt1944server/_default.cfg | 4 + .../config-lgsm/btserver/_default.cfg | 4 + .../config-lgsm/ccserver/_default.cfg | 4 + .../config-lgsm/cod2server/_default.cfg | 4 + .../config-lgsm/cod4server/_default.cfg | 4 + .../config-lgsm/codserver/_default.cfg | 4 + .../config-lgsm/coduoserver/_default.cfg | 4 + .../config-lgsm/codwawserver/_default.cfg | 4 + .../config-lgsm/csczserver/_default.cfg | 4 + .../config-lgsm/csgoserver/_default.cfg | 4 + .../config-lgsm/csserver/_default.cfg | 4 + .../config-lgsm/cssserver/_default.cfg | 4 + .../config-lgsm/dabserver/_default.cfg | 4 + .../config-lgsm/dmcserver/_default.cfg | 4 + .../config-lgsm/dodserver/_default.cfg | 4 + .../config-lgsm/dodsserver/_default.cfg | 4 + .../config-lgsm/doiserver/_default.cfg | 4 + .../config-lgsm/dstserver/_default.cfg | 4 + .../config-lgsm/dysserver/_default.cfg | 4 + .../config-lgsm/ecoserver/_default.cfg | 4 + .../config-lgsm/emserver/_default.cfg | 4 + .../config-lgsm/etlserver/_default.cfg | 4 + .../config-lgsm/fctrserver/_default.cfg | 4 + .../config-lgsm/fofserver/_default.cfg | 4 + .../config-lgsm/gesserver/_default.cfg | 4 + .../config-lgsm/gmodserver/_default.cfg | 4 + .../config-lgsm/hl2dmserver/_default.cfg | 4 + .../config-lgsm/hldmserver/_default.cfg | 4 + .../config-lgsm/hldmsserver/_default.cfg | 4 + .../config-lgsm/hwserver/_default.cfg | 4 + .../config-lgsm/insserver/_default.cfg | 4 + .../config-lgsm/inssserver/_default.cfg | 4 + .../config-lgsm/iosserver/_default.cfg | 4 + .../config-lgsm/jc2server/_default.cfg | 4 + .../config-lgsm/jc3server/_default.cfg | 4 + .../config-lgsm/kf2server/_default.cfg | 4 + .../config-lgsm/kfserver/_default.cfg | 4 + .../config-lgsm/l4d2server/_default.cfg | 4 + .../config-lgsm/l4dserver/_default.cfg | 4 + .../config-lgsm/mcserver/_default.cfg | 4 + .../config-lgsm/mhserver/_default.cfg | 4 + .../config-lgsm/mtaserver/_default.cfg | 4 + .../config-lgsm/mumbleserver/_default.cfg | 4 + .../config-lgsm/ndserver/_default.cfg | 4 + .../config-lgsm/nmrihserver/_default.cfg | 4 + .../config-lgsm/ns2cserver/_default.cfg | 4 + .../config-lgsm/ns2server/_default.cfg | 4 + .../config-lgsm/nsserver/_default.cfg | 4 + .../config-lgsm/opforserver/_default.cfg | 4 + .../config-lgsm/pcserver/_default.cfg | 4 + .../config-lgsm/pstbsserver/_default.cfg | 4 + .../config-lgsm/pvkiiserver/_default.cfg | 4 + .../config-lgsm/pzserver/_default.cfg | 4 + .../config-lgsm/q2server/_default.cfg | 4 + .../config-lgsm/q3server/_default.cfg | 4 + .../config-lgsm/qlserver/_default.cfg | 4 + .../config-lgsm/qwserver/_default.cfg | 4 + .../config-lgsm/ricochetserver/_default.cfg | 4 + .../config-lgsm/roserver/_default.cfg | 4 + .../config-lgsm/rtcwserver/_default.cfg | 4 + .../config-lgsm/rustserver/_default.cfg | 4 + .../config-lgsm/rwserver/_default.cfg | 4 + .../config-lgsm/sampserver/_default.cfg | 4 + .../config-lgsm/sbotsserver/_default.cfg | 4 + .../config-lgsm/sbserver/_default.cfg | 4 + .../config-lgsm/sdtdserver/_default.cfg | 4 + .../config-lgsm/sfcserver/_default.cfg | 4 + .../config-lgsm/sof2server/_default.cfg | 4 + .../config-lgsm/solserver/_default.cfg | 4 + .../config-lgsm/squadserver/_default.cfg | 4 + .../config-lgsm/ss3server/_default.cfg | 4 + .../config-lgsm/stserver/_default.cfg | 4 + .../config-lgsm/svenserver/_default.cfg | 4 + .../config-lgsm/terrariaserver/_default.cfg | 4 + .../config-lgsm/tf2server/_default.cfg | 4 + .../config-lgsm/tfcserver/_default.cfg | 4 + .../config-lgsm/ts3server/_default.cfg | 4 + .../config-lgsm/tsserver/_default.cfg | 4 + .../config-lgsm/tuserver/_default.cfg | 4 + .../config-lgsm/twserver/_default.cfg | 4 + .../config-lgsm/untserver/_default.cfg | 4 + .../config-lgsm/ut2k4server/_default.cfg | 4 + .../config-lgsm/ut3server/_default.cfg | 4 + .../config-lgsm/ut99server/_default.cfg | 4 + .../config-lgsm/utserver/_default.cfg | 4 + .../config-lgsm/vsserver/_default.cfg | 4 + .../config-lgsm/wetserver/_default.cfg | 4 + .../config-lgsm/wurmserver/_default.cfg | 4 + .../config-lgsm/zmrserver/_default.cfg | 4 + .../config-lgsm/zpsserver/_default.cfg | 4 + lgsm/functions/alert.sh | 11 +++ lgsm/functions/alert_slack.sh | 76 +++++++++++++++++++ lgsm/functions/core_functions.sh | 4 + 103 files changed, 491 insertions(+) create mode 100644 lgsm/functions/alert_slack.sh diff --git a/lgsm/config-default/config-lgsm/ahlserver/_default.cfg b/lgsm/config-default/config-lgsm/ahlserver/_default.cfg index b56b231b6..513db4374 100644 --- a/lgsm/config-default/config-lgsm/ahlserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/ahlserver/_default.cfg @@ -37,6 +37,10 @@ posttarget="https://hastebin.com" discordalert="off" discordwebhook="webhook" +# Slack Alerts | https://docs.linuxgsm.com/alerts/slack +slackalert="off" +slackwebhook="webhook" + # Email Alerts | https://docs.linuxgsm.com/alerts/email emailalert="off" email="email@example.com" diff --git a/lgsm/config-default/config-lgsm/arkserver/_default.cfg b/lgsm/config-default/config-lgsm/arkserver/_default.cfg index 44ed4cb74..94bdaebc1 100644 --- a/lgsm/config-default/config-lgsm/arkserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/arkserver/_default.cfg @@ -39,6 +39,10 @@ posttarget="https://hastebin.com" discordalert="off" discordwebhook="webhook" +# Slack Alerts | https://docs.linuxgsm.com/alerts/slack +slackalert="off" +slackwebhook="webhook" + # Email Alerts | https://docs.linuxgsm.com/alerts/email emailalert="off" email="email@example.com" diff --git a/lgsm/config-default/config-lgsm/arma3server/_default.cfg b/lgsm/config-default/config-lgsm/arma3server/_default.cfg index 13d14571a..c01336adf 100644 --- a/lgsm/config-default/config-lgsm/arma3server/_default.cfg +++ b/lgsm/config-default/config-lgsm/arma3server/_default.cfg @@ -53,6 +53,10 @@ posttarget="https://hastebin.com" discordalert="off" discordwebhook="webhook" +# Slack Alerts | https://docs.linuxgsm.com/alerts/slack +slackalert="off" +slackwebhook="webhook" + # Email Alerts | https://docs.linuxgsm.com/alerts/email emailalert="off" email="email@example.com" diff --git a/lgsm/config-default/config-lgsm/bb2server/_default.cfg b/lgsm/config-default/config-lgsm/bb2server/_default.cfg index 15a60ffcc..f2a4f4f4e 100644 --- a/lgsm/config-default/config-lgsm/bb2server/_default.cfg +++ b/lgsm/config-default/config-lgsm/bb2server/_default.cfg @@ -43,6 +43,10 @@ posttarget="https://hastebin.com" discordalert="off" discordwebhook="webhook" +# Slack Alerts | https://docs.linuxgsm.com/alerts/slack +slackalert="off" +slackwebhook="webhook" + # Email Alerts | https://docs.linuxgsm.com/alerts/email emailalert="off" email="email@example.com" diff --git a/lgsm/config-default/config-lgsm/bbserver/_default.cfg b/lgsm/config-default/config-lgsm/bbserver/_default.cfg index dc1f40bfe..6a91321e4 100644 --- a/lgsm/config-default/config-lgsm/bbserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/bbserver/_default.cfg @@ -37,6 +37,10 @@ posttarget="https://hastebin.com" discordalert="off" discordwebhook="webhook" +# Slack Alerts | https://docs.linuxgsm.com/alerts/slack +slackalert="off" +slackwebhook="webhook" + # Email Alerts | https://docs.linuxgsm.com/alerts/email emailalert="off" email="email@example.com" diff --git a/lgsm/config-default/config-lgsm/bdserver/_default.cfg b/lgsm/config-default/config-lgsm/bdserver/_default.cfg index 503917509..abc3c9286 100644 --- a/lgsm/config-default/config-lgsm/bdserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/bdserver/_default.cfg @@ -37,6 +37,10 @@ posttarget="https://hastebin.com" discordalert="off" discordwebhook="webhook" +# Slack Alerts | https://docs.linuxgsm.com/alerts/slack +slackalert="off" +slackwebhook="webhook" + # Email Alerts | https://docs.linuxgsm.com/alerts/email emailalert="off" email="email@example.com" diff --git a/lgsm/config-default/config-lgsm/bf1942server/_default.cfg b/lgsm/config-default/config-lgsm/bf1942server/_default.cfg index abc0416de..ca193f795 100644 --- a/lgsm/config-default/config-lgsm/bf1942server/_default.cfg +++ b/lgsm/config-default/config-lgsm/bf1942server/_default.cfg @@ -30,6 +30,10 @@ posttarget="https://hastebin.com" discordalert="off" discordwebhook="webhook" +# Slack Alerts | https://docs.linuxgsm.com/alerts/slack +slackalert="off" +slackwebhook="webhook" + # Email Alerts | https://docs.linuxgsm.com/alerts/email emailalert="off" email="email@example.com" diff --git a/lgsm/config-default/config-lgsm/bmdmserver/_default.cfg b/lgsm/config-default/config-lgsm/bmdmserver/_default.cfg index 8f31587da..42b918a55 100644 --- a/lgsm/config-default/config-lgsm/bmdmserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/bmdmserver/_default.cfg @@ -43,6 +43,10 @@ posttarget="https://hastebin.com" discordalert="off" discordwebhook="webhook" +# Slack Alerts | https://docs.linuxgsm.com/alerts/slack +slackalert="off" +slackwebhook="webhook" + # Email Alerts | https://docs.linuxgsm.com/alerts/email emailalert="off" email="email@example.com" diff --git a/lgsm/config-default/config-lgsm/boserver/_default.cfg b/lgsm/config-default/config-lgsm/boserver/_default.cfg index 0a7bfec4b..0395820bd 100644 --- a/lgsm/config-default/config-lgsm/boserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/boserver/_default.cfg @@ -36,6 +36,10 @@ posttarget="https://hastebin.com" discordalert="off" discordwebhook="webhook" +# Slack Alerts | https://docs.linuxgsm.com/alerts/slack +slackalert="off" +slackwebhook="webhook" + # Email Alerts | https://docs.linuxgsm.com/alerts/email emailalert="off" email="email@example.com" diff --git a/lgsm/config-default/config-lgsm/bsserver/_default.cfg b/lgsm/config-default/config-lgsm/bsserver/_default.cfg index dced9aa76..21dc7a0af 100644 --- a/lgsm/config-default/config-lgsm/bsserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/bsserver/_default.cfg @@ -47,6 +47,10 @@ posttarget="https://hastebin.com" discordalert="off" discordwebhook="webhook" +# Slack Alerts | https://docs.linuxgsm.com/alerts/slack +slackalert="off" +slackwebhook="webhook" + # Email Alerts | https://docs.linuxgsm.com/alerts/email emailalert="off" email="email@example.com" diff --git a/lgsm/config-default/config-lgsm/bt1944server/_default.cfg b/lgsm/config-default/config-lgsm/bt1944server/_default.cfg index a91e1a481..6116933ee 100644 --- a/lgsm/config-default/config-lgsm/bt1944server/_default.cfg +++ b/lgsm/config-default/config-lgsm/bt1944server/_default.cfg @@ -35,6 +35,10 @@ posttarget="https://hastebin.com" discordalert="off" discordwebhook="webhook" +# Slack Alerts | https://docs.linuxgsm.com/alerts/slack +slackalert="off" +slackwebhook="webhook" + # Email Alerts | https://docs.linuxgsm.com/alerts/email emailalert="off" email="email@example.com" diff --git a/lgsm/config-default/config-lgsm/btserver/_default.cfg b/lgsm/config-default/config-lgsm/btserver/_default.cfg index cf17a4f21..d70f24eab 100644 --- a/lgsm/config-default/config-lgsm/btserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/btserver/_default.cfg @@ -30,6 +30,10 @@ posttarget="https://hastebin.com" discordalert="off" discordwebhook="webhook" +# Slack Alerts | https://docs.linuxgsm.com/alerts/slack +slackalert="off" +slackwebhook="webhook" + # Email Alerts | https://docs.linuxgsm.com/alerts/email emailalert="off" email="email@example.com" diff --git a/lgsm/config-default/config-lgsm/ccserver/_default.cfg b/lgsm/config-default/config-lgsm/ccserver/_default.cfg index 739020f11..4a58debe3 100644 --- a/lgsm/config-default/config-lgsm/ccserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/ccserver/_default.cfg @@ -38,6 +38,10 @@ posttarget="https://hastebin.com" discordalert="off" discordwebhook="webhook" +# Slack Alerts | https://docs.linuxgsm.com/alerts/slack +slackalert="off" +slackwebhook="webhook" + # Email Alerts | https://docs.linuxgsm.com/alerts/email emailalert="off" email="email@example.com" diff --git a/lgsm/config-default/config-lgsm/cod2server/_default.cfg b/lgsm/config-default/config-lgsm/cod2server/_default.cfg index fbf559886..c13d4773e 100644 --- a/lgsm/config-default/config-lgsm/cod2server/_default.cfg +++ b/lgsm/config-default/config-lgsm/cod2server/_default.cfg @@ -36,6 +36,10 @@ posttarget="https://hastebin.com" discordalert="off" discordwebhook="webhook" +# Slack Alerts | https://docs.linuxgsm.com/alerts/slack +slackalert="off" +slackwebhook="webhook" + # Email Alerts | https://docs.linuxgsm.com/alerts/email emailalert="off" email="email@example.com" diff --git a/lgsm/config-default/config-lgsm/cod4server/_default.cfg b/lgsm/config-default/config-lgsm/cod4server/_default.cfg index f2837cc5d..4fbb9abfc 100644 --- a/lgsm/config-default/config-lgsm/cod4server/_default.cfg +++ b/lgsm/config-default/config-lgsm/cod4server/_default.cfg @@ -36,6 +36,10 @@ posttarget="https://hastebin.com" discordalert="off" discordwebhook="webhook" +# Slack Alerts | https://docs.linuxgsm.com/alerts/slack +slackalert="off" +slackwebhook="webhook" + # Email Alerts | https://docs.linuxgsm.com/alerts/email emailalert="off" email="email@example.com" diff --git a/lgsm/config-default/config-lgsm/codserver/_default.cfg b/lgsm/config-default/config-lgsm/codserver/_default.cfg index 4feec18ba..3c858e74c 100644 --- a/lgsm/config-default/config-lgsm/codserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/codserver/_default.cfg @@ -36,6 +36,10 @@ posttarget="https://hastebin.com" discordalert="off" discordwebhook="webhook" +# Slack Alerts | https://docs.linuxgsm.com/alerts/slack +slackalert="off" +slackwebhook="webhook" + # Email Alerts | https://docs.linuxgsm.com/alerts/email emailalert="off" email="email@example.com" diff --git a/lgsm/config-default/config-lgsm/coduoserver/_default.cfg b/lgsm/config-default/config-lgsm/coduoserver/_default.cfg index 4ce3f341e..64c3635f6 100644 --- a/lgsm/config-default/config-lgsm/coduoserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/coduoserver/_default.cfg @@ -36,6 +36,10 @@ posttarget="https://hastebin.com" discordalert="off" discordwebhook="webhook" +# Slack Alerts | https://docs.linuxgsm.com/alerts/slack +slackalert="off" +slackwebhook="webhook" + # Email Alerts | https://docs.linuxgsm.com/alerts/email emailalert="off" email="email@example.com" diff --git a/lgsm/config-default/config-lgsm/codwawserver/_default.cfg b/lgsm/config-default/config-lgsm/codwawserver/_default.cfg index ebb5bd817..2d0381c00 100644 --- a/lgsm/config-default/config-lgsm/codwawserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/codwawserver/_default.cfg @@ -36,6 +36,10 @@ posttarget="https://hastebin.com" discordalert="off" discordwebhook="webhook" +# Slack Alerts | https://docs.linuxgsm.com/alerts/slack +slackalert="off" +slackwebhook="webhook" + # Email Alerts | https://docs.linuxgsm.com/alerts/email emailalert="off" email="email@example.com" diff --git a/lgsm/config-default/config-lgsm/csczserver/_default.cfg b/lgsm/config-default/config-lgsm/csczserver/_default.cfg index b7dc4c2c4..a74e7d1cb 100644 --- a/lgsm/config-default/config-lgsm/csczserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/csczserver/_default.cfg @@ -37,6 +37,10 @@ posttarget="https://hastebin.com" discordalert="off" discordwebhook="webhook" +# Slack Alerts | https://docs.linuxgsm.com/alerts/slack +slackalert="off" +slackwebhook="webhook" + # Email Alerts | https://docs.linuxgsm.com/alerts/email emailalert="off" email="email@example.com" diff --git a/lgsm/config-default/config-lgsm/csgoserver/_default.cfg b/lgsm/config-default/config-lgsm/csgoserver/_default.cfg index 0abcf5a02..b480dc7d7 100644 --- a/lgsm/config-default/config-lgsm/csgoserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/csgoserver/_default.cfg @@ -63,6 +63,10 @@ posttarget="https://hastebin.com" discordalert="off" discordwebhook="webhook" +# Slack Alerts | https://docs.linuxgsm.com/alerts/slack +slackalert="off" +slackwebhook="webhook" + # Email Alerts | https://docs.linuxgsm.com/alerts/email emailalert="off" email="email@example.com" diff --git a/lgsm/config-default/config-lgsm/csserver/_default.cfg b/lgsm/config-default/config-lgsm/csserver/_default.cfg index 2fadd3f15..92a54e7dd 100644 --- a/lgsm/config-default/config-lgsm/csserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/csserver/_default.cfg @@ -37,6 +37,10 @@ posttarget="https://hastebin.com" discordalert="off" discordwebhook="webhook" +# Slack Alerts | https://docs.linuxgsm.com/alerts/slack +slackalert="off" +slackwebhook="webhook" + # Email Alerts | https://docs.linuxgsm.com/alerts/email emailalert="off" email="email@example.com" diff --git a/lgsm/config-default/config-lgsm/cssserver/_default.cfg b/lgsm/config-default/config-lgsm/cssserver/_default.cfg index 10f3fbca6..a4ab653ae 100644 --- a/lgsm/config-default/config-lgsm/cssserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/cssserver/_default.cfg @@ -43,6 +43,10 @@ posttarget="https://hastebin.com" discordalert="off" discordwebhook="webhook" +# Slack Alerts | https://docs.linuxgsm.com/alerts/slack +slackalert="off" +slackwebhook="webhook" + # Email Alerts | https://docs.linuxgsm.com/alerts/email emailalert="off" email="email@example.com" diff --git a/lgsm/config-default/config-lgsm/dabserver/_default.cfg b/lgsm/config-default/config-lgsm/dabserver/_default.cfg index 9e3c640b5..0f0a75b31 100644 --- a/lgsm/config-default/config-lgsm/dabserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/dabserver/_default.cfg @@ -38,6 +38,10 @@ posttarget="https://hastebin.com" discordalert="off" discordwebhook="webhook" +# Slack Alerts | https://docs.linuxgsm.com/alerts/slack +slackalert="off" +slackwebhook="webhook" + # Email Alerts | https://docs.linuxgsm.com/alerts/email emailalert="off" email="email@example.com" diff --git a/lgsm/config-default/config-lgsm/dmcserver/_default.cfg b/lgsm/config-default/config-lgsm/dmcserver/_default.cfg index 8b80399cd..9a12049b1 100644 --- a/lgsm/config-default/config-lgsm/dmcserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/dmcserver/_default.cfg @@ -37,6 +37,10 @@ posttarget="https://hastebin.com" discordalert="off" discordwebhook="webhook" +# Slack Alerts | https://docs.linuxgsm.com/alerts/slack +slackalert="off" +slackwebhook="webhook" + # Email Alerts | https://docs.linuxgsm.com/alerts/email emailalert="off" email="email@example.com" diff --git a/lgsm/config-default/config-lgsm/dodserver/_default.cfg b/lgsm/config-default/config-lgsm/dodserver/_default.cfg index e274aeb25..646f3cd45 100644 --- a/lgsm/config-default/config-lgsm/dodserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/dodserver/_default.cfg @@ -37,6 +37,10 @@ posttarget="https://hastebin.com" discordalert="off" discordwebhook="webhook" +# Slack Alerts | https://docs.linuxgsm.com/alerts/slack +slackalert="off" +slackwebhook="webhook" + # Email Alerts | https://docs.linuxgsm.com/alerts/email emailalert="off" email="email@example.com" diff --git a/lgsm/config-default/config-lgsm/dodsserver/_default.cfg b/lgsm/config-default/config-lgsm/dodsserver/_default.cfg index fb4ab1d66..cc6a7b107 100644 --- a/lgsm/config-default/config-lgsm/dodsserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/dodsserver/_default.cfg @@ -38,6 +38,10 @@ posttarget="https://hastebin.com" discordalert="off" discordwebhook="webhook" +# Slack Alerts | https://docs.linuxgsm.com/alerts/slack +slackalert="off" +slackwebhook="webhook" + # Email Alerts | https://docs.linuxgsm.com/alerts/email emailalert="off" email="email@example.com" diff --git a/lgsm/config-default/config-lgsm/doiserver/_default.cfg b/lgsm/config-default/config-lgsm/doiserver/_default.cfg index 570c41631..0023e1dc3 100644 --- a/lgsm/config-default/config-lgsm/doiserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/doiserver/_default.cfg @@ -39,6 +39,10 @@ posttarget="https://hastebin.com" discordalert="off" discordwebhook="webhook" +# Slack Alerts | https://docs.linuxgsm.com/alerts/slack +slackalert="off" +slackwebhook="webhook" + # Email Alerts | https://docs.linuxgsm.com/alerts/email emailalert="off" email="email@example.com" diff --git a/lgsm/config-default/config-lgsm/dstserver/_default.cfg b/lgsm/config-default/config-lgsm/dstserver/_default.cfg index b2aec6c44..20f7f05c1 100644 --- a/lgsm/config-default/config-lgsm/dstserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/dstserver/_default.cfg @@ -41,6 +41,10 @@ posttarget="https://hastebin.com" discordalert="off" discordwebhook="webhook" +# Slack Alerts | https://docs.linuxgsm.com/alerts/slack +slackalert="off" +slackwebhook="webhook" + # Email Alerts | https://docs.linuxgsm.com/alerts/email emailalert="off" email="email@example.com" diff --git a/lgsm/config-default/config-lgsm/dysserver/_default.cfg b/lgsm/config-default/config-lgsm/dysserver/_default.cfg index 20d93aeff..66a483d42 100644 --- a/lgsm/config-default/config-lgsm/dysserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/dysserver/_default.cfg @@ -43,6 +43,10 @@ posttarget="https://hastebin.com" discordalert="off" discordwebhook="webhook" +# Slack Alerts | https://docs.linuxgsm.com/alerts/slack +slackalert="off" +slackwebhook="webhook" + # Email Alerts | https://docs.linuxgsm.com/alerts/email emailalert="off" email="email@example.com" diff --git a/lgsm/config-default/config-lgsm/ecoserver/_default.cfg b/lgsm/config-default/config-lgsm/ecoserver/_default.cfg index bfd875640..dc1c8e9f3 100644 --- a/lgsm/config-default/config-lgsm/ecoserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/ecoserver/_default.cfg @@ -30,6 +30,10 @@ posttarget="https://hastebin.com" discordalert="off" discordwebhook="webhook" +# Slack Alerts | https://docs.linuxgsm.com/alerts/slack +slackalert="off" +slackwebhook="webhook" + # Email Alerts | https://docs.linuxgsm.com/alerts/email emailalert="off" email="email@example.com" diff --git a/lgsm/config-default/config-lgsm/emserver/_default.cfg b/lgsm/config-default/config-lgsm/emserver/_default.cfg index 6a333dec6..50defd25e 100644 --- a/lgsm/config-default/config-lgsm/emserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/emserver/_default.cfg @@ -43,6 +43,10 @@ posttarget="https://hastebin.com" discordalert="off" discordwebhook="webhook" +# Slack Alerts | https://docs.linuxgsm.com/alerts/slack +slackalert="off" +slackwebhook="webhook" + # Email Alerts | https://docs.linuxgsm.com/alerts/email emailalert="off" email="email@example.com" diff --git a/lgsm/config-default/config-lgsm/etlserver/_default.cfg b/lgsm/config-default/config-lgsm/etlserver/_default.cfg index f79e4770e..aa467674f 100644 --- a/lgsm/config-default/config-lgsm/etlserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/etlserver/_default.cfg @@ -30,6 +30,10 @@ posttarget="https://hastebin.com" discordalert="off" discordwebhook="webhook" +# Slack Alerts | https://docs.linuxgsm.com/alerts/slack +slackalert="off" +slackwebhook="webhook" + # Email Alerts | https://docs.linuxgsm.com/alerts/email emailalert="off" email="email@example.com" diff --git a/lgsm/config-default/config-lgsm/fctrserver/_default.cfg b/lgsm/config-default/config-lgsm/fctrserver/_default.cfg index d33d407dc..7173175e6 100644 --- a/lgsm/config-default/config-lgsm/fctrserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/fctrserver/_default.cfg @@ -38,6 +38,10 @@ posttarget="https://hastebin.com" discordalert="off" discordwebhook="webhook" +# Slack Alerts | https://docs.linuxgsm.com/alerts/slack +slackalert="off" +slackwebhook="webhook" + # Email Alerts | https://docs.linuxgsm.com/alerts/email emailalert="off" email="email@example.com" diff --git a/lgsm/config-default/config-lgsm/fofserver/_default.cfg b/lgsm/config-default/config-lgsm/fofserver/_default.cfg index f1884e523..782b7f86b 100644 --- a/lgsm/config-default/config-lgsm/fofserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/fofserver/_default.cfg @@ -38,6 +38,10 @@ posttarget="https://hastebin.com" discordalert="off" discordwebhook="webhook" +# Slack Alerts | https://docs.linuxgsm.com/alerts/slack +slackalert="off" +slackwebhook="webhook" + # Email Alerts | https://docs.linuxgsm.com/alerts/email emailalert="off" email="email@example.com" diff --git a/lgsm/config-default/config-lgsm/gesserver/_default.cfg b/lgsm/config-default/config-lgsm/gesserver/_default.cfg index f9cfea98f..0a9d799b3 100644 --- a/lgsm/config-default/config-lgsm/gesserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/gesserver/_default.cfg @@ -38,6 +38,10 @@ posttarget="https://hastebin.com" discordalert="off" discordwebhook="webhook" +# Slack Alerts | https://docs.linuxgsm.com/alerts/slack +slackalert="off" +slackwebhook="webhook" + # Email Alerts | https://docs.linuxgsm.com/alerts/email emailalert="off" email="email@example.com" diff --git a/lgsm/config-default/config-lgsm/gmodserver/_default.cfg b/lgsm/config-default/config-lgsm/gmodserver/_default.cfg index 8bc03daa7..bc26f69cd 100644 --- a/lgsm/config-default/config-lgsm/gmodserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/gmodserver/_default.cfg @@ -54,6 +54,10 @@ posttarget="https://hastebin.com" discordalert="off" discordwebhook="webhook" +# Slack Alerts | https://docs.linuxgsm.com/alerts/slack +slackalert="off" +slackwebhook="webhook" + # Email Alerts | https://docs.linuxgsm.com/alerts/email emailalert="off" email="email@example.com" diff --git a/lgsm/config-default/config-lgsm/hl2dmserver/_default.cfg b/lgsm/config-default/config-lgsm/hl2dmserver/_default.cfg index 8c421c949..5be86032f 100644 --- a/lgsm/config-default/config-lgsm/hl2dmserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/hl2dmserver/_default.cfg @@ -38,6 +38,10 @@ posttarget="https://hastebin.com" discordalert="off" discordwebhook="webhook" +# Slack Alerts | https://docs.linuxgsm.com/alerts/slack +slackalert="off" +slackwebhook="webhook" + # Email Alerts | https://docs.linuxgsm.com/alerts/email emailalert="off" email="email@example.com" diff --git a/lgsm/config-default/config-lgsm/hldmserver/_default.cfg b/lgsm/config-default/config-lgsm/hldmserver/_default.cfg index 47b102e99..67d8b3279 100644 --- a/lgsm/config-default/config-lgsm/hldmserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/hldmserver/_default.cfg @@ -37,6 +37,10 @@ posttarget="https://hastebin.com" discordalert="off" discordwebhook="webhook" +# Slack Alerts | https://docs.linuxgsm.com/alerts/slack +slackalert="off" +slackwebhook="webhook" + # Email Alerts | https://docs.linuxgsm.com/alerts/email emailalert="off" email="email@example.com" diff --git a/lgsm/config-default/config-lgsm/hldmsserver/_default.cfg b/lgsm/config-default/config-lgsm/hldmsserver/_default.cfg index a53cb0979..a53a47ddd 100644 --- a/lgsm/config-default/config-lgsm/hldmsserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/hldmsserver/_default.cfg @@ -38,6 +38,10 @@ posttarget="https://hastebin.com" discordalert="off" discordwebhook="webhook" +# Slack Alerts | https://docs.linuxgsm.com/alerts/slack +slackalert="off" +slackwebhook="webhook" + # Email Alerts | https://docs.linuxgsm.com/alerts/email emailalert="off" email="email@example.com" diff --git a/lgsm/config-default/config-lgsm/hwserver/_default.cfg b/lgsm/config-default/config-lgsm/hwserver/_default.cfg index 60a9e092f..3deea0f22 100644 --- a/lgsm/config-default/config-lgsm/hwserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/hwserver/_default.cfg @@ -49,6 +49,10 @@ posttarget="https://hastebin.com" discordalert="off" discordwebhook="webhook" +# Slack Alerts | https://docs.linuxgsm.com/alerts/slack +slackalert="off" +slackwebhook="webhook" + # Email Alerts | https://docs.linuxgsm.com/alerts/email emailalert="off" email="email@example.com" diff --git a/lgsm/config-default/config-lgsm/insserver/_default.cfg b/lgsm/config-default/config-lgsm/insserver/_default.cfg index c2cd9fb35..9ebea05e0 100644 --- a/lgsm/config-default/config-lgsm/insserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/insserver/_default.cfg @@ -44,6 +44,10 @@ posttarget="https://hastebin.com" discordalert="off" discordwebhook="webhook" +# Slack Alerts | https://docs.linuxgsm.com/alerts/slack +slackalert="off" +slackwebhook="webhook" + # Email Alerts | https://docs.linuxgsm.com/alerts/email emailalert="off" email="email@example.com" diff --git a/lgsm/config-default/config-lgsm/inssserver/_default.cfg b/lgsm/config-default/config-lgsm/inssserver/_default.cfg index 32d7c84fc..28a0e9c95 100644 --- a/lgsm/config-default/config-lgsm/inssserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/inssserver/_default.cfg @@ -46,6 +46,10 @@ posttarget="https://hastebin.com" discordalert="off" discordwebhook="webhook" +# Slack Alerts | https://docs.linuxgsm.com/alerts/slack +slackalert="off" +slackwebhook="webhook" + # Email Alerts | https://docs.linuxgsm.com/alerts/email emailalert="off" email="email@example.com" diff --git a/lgsm/config-default/config-lgsm/iosserver/_default.cfg b/lgsm/config-default/config-lgsm/iosserver/_default.cfg index afa0668ca..4a13f1e36 100644 --- a/lgsm/config-default/config-lgsm/iosserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/iosserver/_default.cfg @@ -38,6 +38,10 @@ posttarget="https://hastebin.com" discordalert="off" discordwebhook="webhook" +# Slack Alerts | https://docs.linuxgsm.com/alerts/slack +slackalert="off" +slackwebhook="webhook" + # Email Alerts | https://docs.linuxgsm.com/alerts/email emailalert="off" email="email@example.com" diff --git a/lgsm/config-default/config-lgsm/jc2server/_default.cfg b/lgsm/config-default/config-lgsm/jc2server/_default.cfg index 00c0327b4..039366269 100644 --- a/lgsm/config-default/config-lgsm/jc2server/_default.cfg +++ b/lgsm/config-default/config-lgsm/jc2server/_default.cfg @@ -30,6 +30,10 @@ posttarget="https://hastebin.com" discordalert="off" discordwebhook="webhook" +# Slack Alerts | https://docs.linuxgsm.com/alerts/slack +slackalert="off" +slackwebhook="webhook" + # Email Alerts | https://docs.linuxgsm.com/alerts/email emailalert="off" email="email@example.com" diff --git a/lgsm/config-default/config-lgsm/jc3server/_default.cfg b/lgsm/config-default/config-lgsm/jc3server/_default.cfg index 7d5646cbb..5b1ad7b54 100644 --- a/lgsm/config-default/config-lgsm/jc3server/_default.cfg +++ b/lgsm/config-default/config-lgsm/jc3server/_default.cfg @@ -30,6 +30,10 @@ posttarget="https://hastebin.com" discordalert="off" discordwebhook="webhook" +# Slack Alerts | https://docs.linuxgsm.com/alerts/slack +slackalert="off" +slackwebhook="webhook" + # Email Alerts | https://docs.linuxgsm.com/alerts/email emailalert="off" email="email@example.com" diff --git a/lgsm/config-default/config-lgsm/kf2server/_default.cfg b/lgsm/config-default/config-lgsm/kf2server/_default.cfg index 1105ed553..a6bef1b81 100644 --- a/lgsm/config-default/config-lgsm/kf2server/_default.cfg +++ b/lgsm/config-default/config-lgsm/kf2server/_default.cfg @@ -36,6 +36,10 @@ posttarget="https://hastebin.com" discordalert="off" discordwebhook="webhook" +# Slack Alerts | https://docs.linuxgsm.com/alerts/slack +slackalert="off" +slackwebhook="webhook" + # Email Alerts | https://docs.linuxgsm.com/alerts/email emailalert="off" email="email@example.com" diff --git a/lgsm/config-default/config-lgsm/kfserver/_default.cfg b/lgsm/config-default/config-lgsm/kfserver/_default.cfg index df574eb72..4675447d6 100644 --- a/lgsm/config-default/config-lgsm/kfserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/kfserver/_default.cfg @@ -42,6 +42,10 @@ posttarget="https://hastebin.com" discordalert="off" discordwebhook="webhook" +# Slack Alerts | https://docs.linuxgsm.com/alerts/slack +slackalert="off" +slackwebhook="webhook" + # Email Alerts | https://docs.linuxgsm.com/alerts/email emailalert="off" email="email@example.com" diff --git a/lgsm/config-default/config-lgsm/l4d2server/_default.cfg b/lgsm/config-default/config-lgsm/l4d2server/_default.cfg index 16b2573e6..0727b44bf 100644 --- a/lgsm/config-default/config-lgsm/l4d2server/_default.cfg +++ b/lgsm/config-default/config-lgsm/l4d2server/_default.cfg @@ -37,6 +37,10 @@ posttarget="https://hastebin.com" discordalert="off" discordwebhook="webhook" +# Slack Alerts | https://docs.linuxgsm.com/alerts/slack +slackalert="off" +slackwebhook="webhook" + # Email Alerts | https://docs.linuxgsm.com/alerts/email emailalert="off" email="email@example.com" diff --git a/lgsm/config-default/config-lgsm/l4dserver/_default.cfg b/lgsm/config-default/config-lgsm/l4dserver/_default.cfg index 6f12f0946..c06c6eff9 100644 --- a/lgsm/config-default/config-lgsm/l4dserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/l4dserver/_default.cfg @@ -37,6 +37,10 @@ posttarget="https://hastebin.com" discordalert="off" discordwebhook="webhook" +# Slack Alerts | https://docs.linuxgsm.com/alerts/slack +slackalert="off" +slackwebhook="webhook" + # Email Alerts | https://docs.linuxgsm.com/alerts/email emailalert="off" email="email@example.com" diff --git a/lgsm/config-default/config-lgsm/mcserver/_default.cfg b/lgsm/config-default/config-lgsm/mcserver/_default.cfg index 11befde4c..cb3ae01b6 100644 --- a/lgsm/config-default/config-lgsm/mcserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/mcserver/_default.cfg @@ -32,6 +32,10 @@ posttarget="https://hastebin.com" discordalert="off" discordwebhook="webhook" +# Slack Alerts | https://docs.linuxgsm.com/alerts/slack +slackalert="off" +slackwebhook="webhook" + # Email Alerts | https://docs.linuxgsm.com/alerts/email emailalert="off" email="email@example.com" diff --git a/lgsm/config-default/config-lgsm/mhserver/_default.cfg b/lgsm/config-default/config-lgsm/mhserver/_default.cfg index d77850315..f3846d238 100644 --- a/lgsm/config-default/config-lgsm/mhserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/mhserver/_default.cfg @@ -35,6 +35,10 @@ posttarget="https://hastebin.com" discordalert="off" discordwebhook="webhook" +# Slack Alerts | https://docs.linuxgsm.com/alerts/slack +slackalert="off" +slackwebhook="webhook" + # Email Alerts | https://docs.linuxgsm.com/alerts/email emailalert="off" email="email@example.com" diff --git a/lgsm/config-default/config-lgsm/mtaserver/_default.cfg b/lgsm/config-default/config-lgsm/mtaserver/_default.cfg index 13649e564..dca15b385 100644 --- a/lgsm/config-default/config-lgsm/mtaserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/mtaserver/_default.cfg @@ -31,6 +31,10 @@ posttarget="https://hastebin.com" discordalert="off" discordwebhook="webhook" +# Slack Alerts | https://docs.linuxgsm.com/alerts/slack +slackalert="off" +slackwebhook="webhook" + # Email Alerts | https://docs.linuxgsm.com/alerts/email emailalert="off" email="email@example.com" diff --git a/lgsm/config-default/config-lgsm/mumbleserver/_default.cfg b/lgsm/config-default/config-lgsm/mumbleserver/_default.cfg index 68bb910ee..0d31699c2 100644 --- a/lgsm/config-default/config-lgsm/mumbleserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/mumbleserver/_default.cfg @@ -31,6 +31,10 @@ posttarget="https://hastebin.com" discordalert="off" discordwebhook="webhook" +# Slack Alerts | https://docs.linuxgsm.com/alerts/slack +slackalert="off" +slackwebhook="webhook" + # Email Alerts | https://docs.linuxgsm.com/alerts/email emailalert="off" email="email@example.com" diff --git a/lgsm/config-default/config-lgsm/ndserver/_default.cfg b/lgsm/config-default/config-lgsm/ndserver/_default.cfg index cb1be264e..5971fac1e 100644 --- a/lgsm/config-default/config-lgsm/ndserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/ndserver/_default.cfg @@ -38,6 +38,10 @@ posttarget="https://hastebin.com" discordalert="off" discordwebhook="webhook" +# Slack Alerts | https://docs.linuxgsm.com/alerts/slack +slackalert="off" +slackwebhook="webhook" + # Email Alerts | https://docs.linuxgsm.com/alerts/email emailalert="off" email="email@example.com" diff --git a/lgsm/config-default/config-lgsm/nmrihserver/_default.cfg b/lgsm/config-default/config-lgsm/nmrihserver/_default.cfg index 29e828a05..b95bcfb84 100644 --- a/lgsm/config-default/config-lgsm/nmrihserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/nmrihserver/_default.cfg @@ -43,6 +43,10 @@ posttarget="https://hastebin.com" discordalert="off" discordwebhook="webhook" +# Slack Alerts | https://docs.linuxgsm.com/alerts/slack +slackalert="off" +slackwebhook="webhook" + # Email Alerts | https://docs.linuxgsm.com/alerts/email emailalert="off" email="email@example.com" diff --git a/lgsm/config-default/config-lgsm/ns2cserver/_default.cfg b/lgsm/config-default/config-lgsm/ns2cserver/_default.cfg index 35b7ae6dc..9fea23aab 100644 --- a/lgsm/config-default/config-lgsm/ns2cserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/ns2cserver/_default.cfg @@ -45,6 +45,10 @@ posttarget="https://hastebin.com" discordalert="off" discordwebhook="webhook" +# Slack Alerts | https://docs.linuxgsm.com/alerts/slack +slackalert="off" +slackwebhook="webhook" + # Email Alerts | https://docs.linuxgsm.com/alerts/email emailalert="off" email="email@example.com" diff --git a/lgsm/config-default/config-lgsm/ns2server/_default.cfg b/lgsm/config-default/config-lgsm/ns2server/_default.cfg index f974a6c22..dd6f9150b 100644 --- a/lgsm/config-default/config-lgsm/ns2server/_default.cfg +++ b/lgsm/config-default/config-lgsm/ns2server/_default.cfg @@ -49,6 +49,10 @@ posttarget="https://hastebin.com" discordalert="off" discordwebhook="webhook" +# Slack Alerts | https://docs.linuxgsm.com/alerts/slack +slackalert="off" +slackwebhook="webhook" + # Email Alerts | https://docs.linuxgsm.com/alerts/email emailalert="off" email="email@example.com" diff --git a/lgsm/config-default/config-lgsm/nsserver/_default.cfg b/lgsm/config-default/config-lgsm/nsserver/_default.cfg index 986ec729b..0368bc5ba 100644 --- a/lgsm/config-default/config-lgsm/nsserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/nsserver/_default.cfg @@ -37,6 +37,10 @@ posttarget="https://hastebin.com" discordalert="off" discordwebhook="webhook" +# Slack Alerts | https://docs.linuxgsm.com/alerts/slack +slackalert="off" +slackwebhook="webhook" + # Email Alerts | https://docs.linuxgsm.com/alerts/email emailalert="off" email="email@example.com" diff --git a/lgsm/config-default/config-lgsm/opforserver/_default.cfg b/lgsm/config-default/config-lgsm/opforserver/_default.cfg index 08b8c8c81..bfea855be 100644 --- a/lgsm/config-default/config-lgsm/opforserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/opforserver/_default.cfg @@ -37,6 +37,10 @@ posttarget="https://hastebin.com" discordalert="off" discordwebhook="webhook" +# Slack Alerts | https://docs.linuxgsm.com/alerts/slack +slackalert="off" +slackwebhook="webhook" + # Email Alerts | https://docs.linuxgsm.com/alerts/email emailalert="off" email="email@example.com" diff --git a/lgsm/config-default/config-lgsm/pcserver/_default.cfg b/lgsm/config-default/config-lgsm/pcserver/_default.cfg index 0203a2ade..dc59cfe77 100644 --- a/lgsm/config-default/config-lgsm/pcserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/pcserver/_default.cfg @@ -30,6 +30,10 @@ posttarget="https://hastebin.com" discordalert="off" discordwebhook="webhook" +# Slack Alerts | https://docs.linuxgsm.com/alerts/slack +slackalert="off" +slackwebhook="webhook" + # Email Alerts | https://docs.linuxgsm.com/alerts/email emailalert="off" email="email@example.com" diff --git a/lgsm/config-default/config-lgsm/pstbsserver/_default.cfg b/lgsm/config-default/config-lgsm/pstbsserver/_default.cfg index c3212981c..956d86b85 100644 --- a/lgsm/config-default/config-lgsm/pstbsserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/pstbsserver/_default.cfg @@ -41,6 +41,10 @@ posttarget="https://hastebin.com" discordalert="off" discordwebhook="webhook" +# Slack Alerts | https://docs.linuxgsm.com/alerts/slack +slackalert="off" +slackwebhook="webhook" + # Email Alerts | https://docs.linuxgsm.com/alerts/email emailalert="off" email="email@example.com" diff --git a/lgsm/config-default/config-lgsm/pvkiiserver/_default.cfg b/lgsm/config-default/config-lgsm/pvkiiserver/_default.cfg index 391dbf491..1fd1a7dc3 100644 --- a/lgsm/config-default/config-lgsm/pvkiiserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/pvkiiserver/_default.cfg @@ -38,6 +38,10 @@ posttarget="https://hastebin.com" discordalert="off" discordwebhook="webhook" +# Slack Alerts | https://docs.linuxgsm.com/alerts/slack +slackalert="off" +slackwebhook="webhook" + # Email Alerts | https://docs.linuxgsm.com/alerts/email emailalert="off" email="email@example.com" diff --git a/lgsm/config-default/config-lgsm/pzserver/_default.cfg b/lgsm/config-default/config-lgsm/pzserver/_default.cfg index 04b479490..3ecb85125 100644 --- a/lgsm/config-default/config-lgsm/pzserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/pzserver/_default.cfg @@ -33,6 +33,10 @@ posttarget="https://hastebin.com" discordalert="off" discordwebhook="webhook" +# Slack Alerts | https://docs.linuxgsm.com/alerts/slack +slackalert="off" +slackwebhook="webhook" + # Email Alerts | https://docs.linuxgsm.com/alerts/email emailalert="off" email="email@example.com" diff --git a/lgsm/config-default/config-lgsm/q2server/_default.cfg b/lgsm/config-default/config-lgsm/q2server/_default.cfg index dd537ca67..67463687b 100644 --- a/lgsm/config-default/config-lgsm/q2server/_default.cfg +++ b/lgsm/config-default/config-lgsm/q2server/_default.cfg @@ -35,6 +35,10 @@ posttarget="https://hastebin.com" discordalert="off" discordwebhook="webhook" +# Slack Alerts | https://docs.linuxgsm.com/alerts/slack +slackalert="off" +slackwebhook="webhook" + # Email Alerts | https://docs.linuxgsm.com/alerts/email emailalert="off" email="email@example.com" diff --git a/lgsm/config-default/config-lgsm/q3server/_default.cfg b/lgsm/config-default/config-lgsm/q3server/_default.cfg index 91ec7b459..2b079dbbe 100644 --- a/lgsm/config-default/config-lgsm/q3server/_default.cfg +++ b/lgsm/config-default/config-lgsm/q3server/_default.cfg @@ -35,6 +35,10 @@ posttarget="https://hastebin.com" discordalert="off" discordwebhook="webhook" +# Slack Alerts | https://docs.linuxgsm.com/alerts/slack +slackalert="off" +slackwebhook="webhook" + # Email Alerts | https://docs.linuxgsm.com/alerts/email emailalert="off" email="email@example.com" diff --git a/lgsm/config-default/config-lgsm/qlserver/_default.cfg b/lgsm/config-default/config-lgsm/qlserver/_default.cfg index 8c773cc09..b55cbd227 100644 --- a/lgsm/config-default/config-lgsm/qlserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/qlserver/_default.cfg @@ -32,6 +32,10 @@ posttarget="https://hastebin.com" discordalert="off" discordwebhook="webhook" +# Slack Alerts | https://docs.linuxgsm.com/alerts/slack +slackalert="off" +slackwebhook="webhook" + # Email Alerts | https://docs.linuxgsm.com/alerts/email emailalert="off" email="email@example.com" diff --git a/lgsm/config-default/config-lgsm/qwserver/_default.cfg b/lgsm/config-default/config-lgsm/qwserver/_default.cfg index 8667c7934..c94a460d4 100644 --- a/lgsm/config-default/config-lgsm/qwserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/qwserver/_default.cfg @@ -34,6 +34,10 @@ posttarget="https://hastebin.com" discordalert="off" discordwebhook="webhook" +# Slack Alerts | https://docs.linuxgsm.com/alerts/slack +slackalert="off" +slackwebhook="webhook" + # Email Alerts | https://docs.linuxgsm.com/alerts/email emailalert="off" email="email@example.com" diff --git a/lgsm/config-default/config-lgsm/ricochetserver/_default.cfg b/lgsm/config-default/config-lgsm/ricochetserver/_default.cfg index e237cab94..36457b93d 100644 --- a/lgsm/config-default/config-lgsm/ricochetserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/ricochetserver/_default.cfg @@ -37,6 +37,10 @@ posttarget="https://hastebin.com" discordalert="off" discordwebhook="webhook" +# Slack Alerts | https://docs.linuxgsm.com/alerts/slack +slackalert="off" +slackwebhook="webhook" + # Email Alerts | https://docs.linuxgsm.com/alerts/email emailalert="off" email="email@example.com" diff --git a/lgsm/config-default/config-lgsm/roserver/_default.cfg b/lgsm/config-default/config-lgsm/roserver/_default.cfg index 2215fc4f7..76b3f312f 100644 --- a/lgsm/config-default/config-lgsm/roserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/roserver/_default.cfg @@ -38,6 +38,10 @@ posttarget="https://hastebin.com" discordalert="off" discordwebhook="webhook" +# Slack Alerts | https://docs.linuxgsm.com/alerts/slack +slackalert="off" +slackwebhook="webhook" + # Email Alerts | https://docs.linuxgsm.com/alerts/email emailalert="off" email="email@example.com" diff --git a/lgsm/config-default/config-lgsm/rtcwserver/_default.cfg b/lgsm/config-default/config-lgsm/rtcwserver/_default.cfg index 60bcf588d..e49bf9471 100644 --- a/lgsm/config-default/config-lgsm/rtcwserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/rtcwserver/_default.cfg @@ -35,6 +35,10 @@ posttarget="https://hastebin.com" discordalert="off" discordwebhook="webhook" +# Slack Alerts | https://docs.linuxgsm.com/alerts/slack +slackalert="off" +slackwebhook="webhook" + # Email Alerts | https://docs.linuxgsm.com/alerts/email emailalert="off" email="email@example.com" diff --git a/lgsm/config-default/config-lgsm/rustserver/_default.cfg b/lgsm/config-default/config-lgsm/rustserver/_default.cfg index 0b8aeed35..5bebb709d 100644 --- a/lgsm/config-default/config-lgsm/rustserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/rustserver/_default.cfg @@ -62,6 +62,10 @@ posttarget="https://hastebin.com" discordalert="off" discordwebhook="webhook" +# Slack Alerts | https://docs.linuxgsm.com/alerts/slack +slackalert="off" +slackwebhook="webhook" + # Email Alerts | https://docs.linuxgsm.com/alerts/email emailalert="off" email="email@example.com" diff --git a/lgsm/config-default/config-lgsm/rwserver/_default.cfg b/lgsm/config-default/config-lgsm/rwserver/_default.cfg index a87161ace..6452e61f3 100644 --- a/lgsm/config-default/config-lgsm/rwserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/rwserver/_default.cfg @@ -33,6 +33,10 @@ posttarget="https://hastebin.com" discordalert="off" discordwebhook="webhook" +# Slack Alerts | https://docs.linuxgsm.com/alerts/slack +slackalert="off" +slackwebhook="webhook" + # Email Alerts | https://docs.linuxgsm.com/alerts/email emailalert="off" email="email@example.com" diff --git a/lgsm/config-default/config-lgsm/sampserver/_default.cfg b/lgsm/config-default/config-lgsm/sampserver/_default.cfg index 6c1b65e77..7de9d62a0 100644 --- a/lgsm/config-default/config-lgsm/sampserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/sampserver/_default.cfg @@ -34,6 +34,10 @@ posttarget="https://hastebin.com" discordalert="off" discordwebhook="webhook" +# Slack Alerts | https://docs.linuxgsm.com/alerts/slack +slackalert="off" +slackwebhook="webhook" + # Email Alerts | https://docs.linuxgsm.com/alerts/email emailalert="off" email="email@example.com" diff --git a/lgsm/config-default/config-lgsm/sbotsserver/_default.cfg b/lgsm/config-default/config-lgsm/sbotsserver/_default.cfg index 9b59c6e2d..d1ff39ccb 100644 --- a/lgsm/config-default/config-lgsm/sbotsserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/sbotsserver/_default.cfg @@ -38,6 +38,10 @@ posttarget="https://hastebin.com" discordalert="off" discordwebhook="webhook" +# Slack Alerts | https://docs.linuxgsm.com/alerts/slack +slackalert="off" +slackwebhook="webhook" + # Email Alerts | https://docs.linuxgsm.com/alerts/email emailalert="off" email="email@example.com" diff --git a/lgsm/config-default/config-lgsm/sbserver/_default.cfg b/lgsm/config-default/config-lgsm/sbserver/_default.cfg index ab6e86f99..dc1e400a6 100644 --- a/lgsm/config-default/config-lgsm/sbserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/sbserver/_default.cfg @@ -37,6 +37,10 @@ posttarget="https://hastebin.com" discordalert="off" discordwebhook="webhook" +# Slack Alerts | https://docs.linuxgsm.com/alerts/slack +slackalert="off" +slackwebhook="webhook" + # Email Alerts | https://docs.linuxgsm.com/alerts/email emailalert="off" email="email@example.com" diff --git a/lgsm/config-default/config-lgsm/sdtdserver/_default.cfg b/lgsm/config-default/config-lgsm/sdtdserver/_default.cfg index 7ddaba4a0..c9271524f 100644 --- a/lgsm/config-default/config-lgsm/sdtdserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/sdtdserver/_default.cfg @@ -33,6 +33,10 @@ posttarget="https://hastebin.com" discordalert="off" discordwebhook="webhook" +# Slack Alerts | https://docs.linuxgsm.com/alerts/slack +slackalert="off" +slackwebhook="webhook" + # Email Alerts | https://docs.linuxgsm.com/alerts/email emailalert="off" email="email@example.com" diff --git a/lgsm/config-default/config-lgsm/sfcserver/_default.cfg b/lgsm/config-default/config-lgsm/sfcserver/_default.cfg index c1879746b..3e3f4f7f5 100644 --- a/lgsm/config-default/config-lgsm/sfcserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/sfcserver/_default.cfg @@ -38,6 +38,10 @@ posttarget="https://hastebin.com" discordalert="off" discordwebhook="webhook" +# Slack Alerts | https://docs.linuxgsm.com/alerts/slack +slackalert="off" +slackwebhook="webhook" + # Email Alerts | https://docs.linuxgsm.com/alerts/email emailalert="off" email="email@example.com" diff --git a/lgsm/config-default/config-lgsm/sof2server/_default.cfg b/lgsm/config-default/config-lgsm/sof2server/_default.cfg index 3b3769dc5..26a0cc0cf 100644 --- a/lgsm/config-default/config-lgsm/sof2server/_default.cfg +++ b/lgsm/config-default/config-lgsm/sof2server/_default.cfg @@ -35,6 +35,10 @@ posttarget="https://hastebin.com" discordalert="off" discordwebhook="webhook" +# Slack Alerts | https://docs.linuxgsm.com/alerts/slack +slackalert="off" +slackwebhook="webhook" + # Email Alerts | https://docs.linuxgsm.com/alerts/email emailalert="off" email="email@example.com" diff --git a/lgsm/config-default/config-lgsm/solserver/_default.cfg b/lgsm/config-default/config-lgsm/solserver/_default.cfg index 9296881a5..6f846493c 100644 --- a/lgsm/config-default/config-lgsm/solserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/solserver/_default.cfg @@ -36,6 +36,10 @@ posttarget="https://hastebin.com" discordalert="off" discordwebhook="webhook" +# Slack Alerts | https://docs.linuxgsm.com/alerts/slack +slackalert="off" +slackwebhook="webhook" + # Email Alerts | https://docs.linuxgsm.com/alerts/email emailalert="off" email="email@example.com" diff --git a/lgsm/config-default/config-lgsm/squadserver/_default.cfg b/lgsm/config-default/config-lgsm/squadserver/_default.cfg index 22470dc8f..64fe026cc 100644 --- a/lgsm/config-default/config-lgsm/squadserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/squadserver/_default.cfg @@ -35,6 +35,10 @@ posttarget="https://hastebin.com" discordalert="off" discordwebhook="webhook" +# Slack Alerts | https://docs.linuxgsm.com/alerts/slack +slackalert="off" +slackwebhook="webhook" + # Email Alerts | https://docs.linuxgsm.com/alerts/email emailalert="off" email="email@example.com" diff --git a/lgsm/config-default/config-lgsm/ss3server/_default.cfg b/lgsm/config-default/config-lgsm/ss3server/_default.cfg index 1a3593202..580b90968 100644 --- a/lgsm/config-default/config-lgsm/ss3server/_default.cfg +++ b/lgsm/config-default/config-lgsm/ss3server/_default.cfg @@ -34,6 +34,10 @@ posttarget="https://hastebin.com" discordalert="off" discordwebhook="webhook" +# Slack Alerts | https://docs.linuxgsm.com/alerts/slack +slackalert="off" +slackwebhook="webhook" + # Email Alerts | https://docs.linuxgsm.com/alerts/email emailalert="off" email="email@example.com" diff --git a/lgsm/config-default/config-lgsm/stserver/_default.cfg b/lgsm/config-default/config-lgsm/stserver/_default.cfg index a1ca3945a..3305cd282 100644 --- a/lgsm/config-default/config-lgsm/stserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/stserver/_default.cfg @@ -40,6 +40,10 @@ posttarget="https://hastebin.com" discordalert="off" discordwebhook="webhook" +# Slack Alerts | https://docs.linuxgsm.com/alerts/slack +slackalert="off" +slackwebhook="webhook" + # Email Alerts | https://docs.linuxgsm.com/alerts/email emailalert="off" email="email@example.com" diff --git a/lgsm/config-default/config-lgsm/svenserver/_default.cfg b/lgsm/config-default/config-lgsm/svenserver/_default.cfg index 02413e527..f02443156 100644 --- a/lgsm/config-default/config-lgsm/svenserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/svenserver/_default.cfg @@ -37,6 +37,10 @@ posttarget="https://hastebin.com" discordalert="off" discordwebhook="webhook" +# Slack Alerts | https://docs.linuxgsm.com/alerts/slack +slackalert="off" +slackwebhook="webhook" + # Email Alerts | https://docs.linuxgsm.com/alerts/email emailalert="off" email="email@example.com" diff --git a/lgsm/config-default/config-lgsm/terrariaserver/_default.cfg b/lgsm/config-default/config-lgsm/terrariaserver/_default.cfg index bd1ec9e4a..4d3f06dab 100644 --- a/lgsm/config-default/config-lgsm/terrariaserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/terrariaserver/_default.cfg @@ -37,6 +37,10 @@ posttarget="https://hastebin.com" discordalert="off" discordwebhook="webhook" +# Slack Alerts | https://docs.linuxgsm.com/alerts/slack +slackalert="off" +slackwebhook="webhook" + # Email Alerts | https://docs.linuxgsm.com/alerts/email emailalert="off" email="email@example.com" diff --git a/lgsm/config-default/config-lgsm/tf2server/_default.cfg b/lgsm/config-default/config-lgsm/tf2server/_default.cfg index c8330396b..dbd00f79f 100644 --- a/lgsm/config-default/config-lgsm/tf2server/_default.cfg +++ b/lgsm/config-default/config-lgsm/tf2server/_default.cfg @@ -43,6 +43,10 @@ posttarget="https://hastebin.com" discordalert="off" discordwebhook="webhook" +# Slack Alerts | https://docs.linuxgsm.com/alerts/slack +slackalert="off" +slackwebhook="webhook" + # Email Alerts | https://docs.linuxgsm.com/alerts/email emailalert="off" email="email@example.com" diff --git a/lgsm/config-default/config-lgsm/tfcserver/_default.cfg b/lgsm/config-default/config-lgsm/tfcserver/_default.cfg index 8a0ccfb5f..ac4cee489 100644 --- a/lgsm/config-default/config-lgsm/tfcserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/tfcserver/_default.cfg @@ -37,6 +37,10 @@ posttarget="https://hastebin.com" discordalert="off" discordwebhook="webhook" +# Slack Alerts | https://docs.linuxgsm.com/alerts/slack +slackalert="off" +slackwebhook="webhook" + # Email Alerts | https://docs.linuxgsm.com/alerts/email emailalert="off" email="email@example.com" diff --git a/lgsm/config-default/config-lgsm/ts3server/_default.cfg b/lgsm/config-default/config-lgsm/ts3server/_default.cfg index 0d595fb69..54f70adb0 100644 --- a/lgsm/config-default/config-lgsm/ts3server/_default.cfg +++ b/lgsm/config-default/config-lgsm/ts3server/_default.cfg @@ -26,6 +26,10 @@ posttarget="https://hastebin.com" discordalert="off" discordwebhook="webhook" +# Slack Alerts | https://docs.linuxgsm.com/alerts/slack +slackalert="off" +slackwebhook="webhook" + # Email Alerts | https://docs.linuxgsm.com/alerts/email emailalert="off" email="email@example.com" diff --git a/lgsm/config-default/config-lgsm/tsserver/_default.cfg b/lgsm/config-default/config-lgsm/tsserver/_default.cfg index d17776b80..1a5bc27ed 100644 --- a/lgsm/config-default/config-lgsm/tsserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/tsserver/_default.cfg @@ -37,6 +37,10 @@ posttarget="https://hastebin.com" discordalert="off" discordwebhook="webhook" +# Slack Alerts | https://docs.linuxgsm.com/alerts/slack +slackalert="off" +slackwebhook="webhook" + # Email Alerts | https://docs.linuxgsm.com/alerts/email emailalert="off" email="email@example.com" diff --git a/lgsm/config-default/config-lgsm/tuserver/_default.cfg b/lgsm/config-default/config-lgsm/tuserver/_default.cfg index 3ad279d18..fae0f5137 100644 --- a/lgsm/config-default/config-lgsm/tuserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/tuserver/_default.cfg @@ -40,6 +40,10 @@ posttarget="https://hastebin.com" discordalert="off" discordwebhook="webhook" +# Slack Alerts | https://docs.linuxgsm.com/alerts/slack +slackalert="off" +slackwebhook="webhook" + # Email Alerts | https://docs.linuxgsm.com/alerts/email emailalert="off" email="email@example.com" diff --git a/lgsm/config-default/config-lgsm/twserver/_default.cfg b/lgsm/config-default/config-lgsm/twserver/_default.cfg index cc4183e44..f0c817a6e 100644 --- a/lgsm/config-default/config-lgsm/twserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/twserver/_default.cfg @@ -37,6 +37,10 @@ posttarget="https://hastebin.com" discordalert="off" discordwebhook="webhook" +# Slack Alerts | https://docs.linuxgsm.com/alerts/slack +slackalert="off" +slackwebhook="webhook" + # Email Alerts | https://docs.linuxgsm.com/alerts/email emailalert="off" email="email@example.com" diff --git a/lgsm/config-default/config-lgsm/untserver/_default.cfg b/lgsm/config-default/config-lgsm/untserver/_default.cfg index d9670e9a7..32b468a12 100644 --- a/lgsm/config-default/config-lgsm/untserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/untserver/_default.cfg @@ -37,6 +37,10 @@ posttarget="https://hastebin.com" discordalert="off" discordwebhook="webhook" +# Slack Alerts | https://docs.linuxgsm.com/alerts/slack +slackalert="off" +slackwebhook="webhook" + # Email Alerts | https://docs.linuxgsm.com/alerts/email emailalert="off" email="email@example.com" diff --git a/lgsm/config-default/config-lgsm/ut2k4server/_default.cfg b/lgsm/config-default/config-lgsm/ut2k4server/_default.cfg index b2c6b861c..178586854 100644 --- a/lgsm/config-default/config-lgsm/ut2k4server/_default.cfg +++ b/lgsm/config-default/config-lgsm/ut2k4server/_default.cfg @@ -34,6 +34,10 @@ posttarget="https://hastebin.com" discordalert="off" discordwebhook="webhook" +# Slack Alerts | https://docs.linuxgsm.com/alerts/slack +slackalert="off" +slackwebhook="webhook" + # Email Alerts | https://docs.linuxgsm.com/alerts/email emailalert="off" email="email@example.com" diff --git a/lgsm/config-default/config-lgsm/ut3server/_default.cfg b/lgsm/config-default/config-lgsm/ut3server/_default.cfg index 9df05d71d..990013274 100644 --- a/lgsm/config-default/config-lgsm/ut3server/_default.cfg +++ b/lgsm/config-default/config-lgsm/ut3server/_default.cfg @@ -45,6 +45,10 @@ posttarget="https://hastebin.com" discordalert="off" discordwebhook="webhook" +# Slack Alerts | https://docs.linuxgsm.com/alerts/slack +slackalert="off" +slackwebhook="webhook" + # Email Alerts | https://docs.linuxgsm.com/alerts/email emailalert="off" email="email@example.com" diff --git a/lgsm/config-default/config-lgsm/ut99server/_default.cfg b/lgsm/config-default/config-lgsm/ut99server/_default.cfg index e4949ee82..8c74230a2 100644 --- a/lgsm/config-default/config-lgsm/ut99server/_default.cfg +++ b/lgsm/config-default/config-lgsm/ut99server/_default.cfg @@ -34,6 +34,10 @@ posttarget="https://hastebin.com" discordalert="off" discordwebhook="webhook" +# Slack Alerts | https://docs.linuxgsm.com/alerts/slack +slackalert="off" +slackwebhook="webhook" + # Email Alerts | https://docs.linuxgsm.com/alerts/email emailalert="off" email="email@example.com" diff --git a/lgsm/config-default/config-lgsm/utserver/_default.cfg b/lgsm/config-default/config-lgsm/utserver/_default.cfg index 067b5845a..206625b7c 100644 --- a/lgsm/config-default/config-lgsm/utserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/utserver/_default.cfg @@ -38,6 +38,10 @@ posttarget="https://hastebin.com" discordalert="off" discordwebhook="webhook" +# Slack Alerts | https://docs.linuxgsm.com/alerts/slack +slackalert="off" +slackwebhook="webhook" + # Email Alerts | https://docs.linuxgsm.com/alerts/email emailalert="off" email="email@example.com" diff --git a/lgsm/config-default/config-lgsm/vsserver/_default.cfg b/lgsm/config-default/config-lgsm/vsserver/_default.cfg index 16efdfe02..5ff4fc2d8 100644 --- a/lgsm/config-default/config-lgsm/vsserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/vsserver/_default.cfg @@ -37,6 +37,10 @@ posttarget="https://hastebin.com" discordalert="off" discordwebhook="webhook" +# Slack Alerts | https://docs.linuxgsm.com/alerts/slack +slackalert="off" +slackwebhook="webhook" + # Email Alerts | https://docs.linuxgsm.com/alerts/email emailalert="off" email="email@example.com" diff --git a/lgsm/config-default/config-lgsm/wetserver/_default.cfg b/lgsm/config-default/config-lgsm/wetserver/_default.cfg index 39fdcde91..cdbaa61ec 100644 --- a/lgsm/config-default/config-lgsm/wetserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/wetserver/_default.cfg @@ -30,6 +30,10 @@ posttarget="https://hastebin.com" discordalert="off" discordwebhook="webhook" +# Slack Alerts | https://docs.linuxgsm.com/alerts/slack +slackalert="off" +slackwebhook="webhook" + # Email Alerts | https://docs.linuxgsm.com/alerts/email emailalert="off" email="email@example.com" diff --git a/lgsm/config-default/config-lgsm/wurmserver/_default.cfg b/lgsm/config-default/config-lgsm/wurmserver/_default.cfg index 30b12de19..7fb2493b8 100644 --- a/lgsm/config-default/config-lgsm/wurmserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/wurmserver/_default.cfg @@ -32,6 +32,10 @@ posttarget="https://hastebin.com" discordalert="off" discordwebhook="webhook" +# Slack Alerts | https://docs.linuxgsm.com/alerts/slack +slackalert="off" +slackwebhook="webhook" + # Email Alerts | https://docs.linuxgsm.com/alerts/email emailalert="off" email="email@example.com" diff --git a/lgsm/config-default/config-lgsm/zmrserver/_default.cfg b/lgsm/config-default/config-lgsm/zmrserver/_default.cfg index 44cb30fb3..c4519b5f7 100644 --- a/lgsm/config-default/config-lgsm/zmrserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/zmrserver/_default.cfg @@ -38,6 +38,10 @@ posttarget="https://hastebin.com" discordalert="off" discordwebhook="webhook" +# Slack Alerts | https://docs.linuxgsm.com/alerts/slack +slackalert="off" +slackwebhook="webhook" + # Email Alerts | https://docs.linuxgsm.com/alerts/email emailalert="off" email="email@example.com" diff --git a/lgsm/config-default/config-lgsm/zpsserver/_default.cfg b/lgsm/config-default/config-lgsm/zpsserver/_default.cfg index 8c926cac5..e97e65dec 100644 --- a/lgsm/config-default/config-lgsm/zpsserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/zpsserver/_default.cfg @@ -43,6 +43,10 @@ posttarget="https://hastebin.com" discordalert="off" discordwebhook="webhook" +# Slack Alerts | https://docs.linuxgsm.com/alerts/slack +slackalert="off" +slackwebhook="webhook" + # Email Alerts | https://docs.linuxgsm.com/alerts/email emailalert="off" email="email@example.com" diff --git a/lgsm/functions/alert.sh b/lgsm/functions/alert.sh index ba5b19bf0..e5f0e9c0c 100644 --- a/lgsm/functions/alert.sh +++ b/lgsm/functions/alert.sh @@ -190,3 +190,14 @@ elif [ -z "${telegramchatid}" ]&&[ "${function_selfname}" == "command_test_alert echo " * https://docs.linuxgsm.com/alerts/telegram" fn_script_error "Telegram chat id not set." fi + +if [ "${slackalert}" == "on" ]&&[ -n "${slackalert}" ]; then + alert_slack.sh +elif [ "${slackalert}" != "on" ]&&[ "${function_selfname}" == "command_test_alert.sh" ]; then + fn_print_warn_nl "Slack alerts not enabled" + fn_script_log_warn "Slack alerts not enabled" +elif [ -z "${slacktoken}" ]&&[ "${function_selfname}" == "command_test_alert.sh" ]; then + fn_print_error_nl "Slack token not set" + echo " * https://docs.linuxgsm.com/alerts/slack" + fn_script_error "Slack token not set" +fi \ No newline at end of file diff --git a/lgsm/functions/alert_slack.sh b/lgsm/functions/alert_slack.sh new file mode 100644 index 000000000..2e71f337e --- /dev/null +++ b/lgsm/functions/alert_slack.sh @@ -0,0 +1,76 @@ +#!/bin/bash +# LinuxGSM alert_slack.sh function +# Author: Kenneth Lindeof +# Website: https://linuxgsm.com +# Description: Sends Slack alert. + +if ! command -v jq > /dev/null; then + fn_print_fail_nl "Sending Slack alert: jq is missing." + fn_script_log_fatal "Sending Slack alert: jq is missing." +fi + +json=$(cat < Date: Mon, 7 Oct 2019 03:55:47 +0800 Subject: [PATCH 171/534] feat(newserver): Action: Source (#2507) --- .../config-lgsm/ahl2server/_default.cfg | 158 ++++++++++++++++++ lgsm/data/serverlist.csv | 1 + lgsm/functions/install_config.sh | 6 + 3 files changed, 165 insertions(+) create mode 100644 lgsm/config-default/config-lgsm/ahl2server/_default.cfg diff --git a/lgsm/config-default/config-lgsm/ahl2server/_default.cfg b/lgsm/config-default/config-lgsm/ahl2server/_default.cfg new file mode 100644 index 000000000..2d39ca4da --- /dev/null +++ b/lgsm/config-default/config-lgsm/ahl2server/_default.cfg @@ -0,0 +1,158 @@ +################################## +######## 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://docs.linuxgsm.com/steamcmd#steamcmd-login +steamuser="username" +steampass='password' + +## Server Start Settings | https://docs.linuxgsm.com/configuration/start-parameters +ip="0.0.0.0" +port="27015" +clientport="27005" +sourcetvport="27020" +defaultmap="act_airport" +maxplayers="20" + +## Server Start Command | https://docs.linuxgsm.com/configuration/start-parameters#additional-parameters +fn_parms(){ +parms="-game ahl2 -strictportbind -ip ${ip} -port ${port} +clientport ${clientport} +tv_port ${sourcetvport} +map ${defaultmap} +servercfgfile ${servercfg} -maxplayers ${maxplayers}" +} + +#### LinuxGSM Settings #### + +## Notification Alerts +# (on|off) + +# Display IP | https://docs.linuxgsm.com/alerts#display-ip +displayip="" + +# More info | https://docs.linuxgsm.com/alerts#more-info +postalert="off" +postdays="7" +posttarget="https://hastebin.com" + +# Discord Alerts | https://docs.linuxgsm.com/alerts/discord +discordalert="off" +discordwebhook="webhook" + +# Email Alerts | https://docs.linuxgsm.com/alerts/email +emailalert="off" +email="email@example.com" +emailfrom="" + +# IFTTT Alerts | https://docs.linuxgsm.com/alerts/ifttt +iftttalert="off" +ifttttoken="accesstoken" +iftttevent="linuxgsm_alert" + +# Mailgun Email Alerts | https://docs.linuxgsm.com/alerts/mailgun +mailgunalert="off" +mailguntoken="accesstoken" +mailgundomain="example.com" +mailgunemailfrom="alert@example.com" +mailgunemail="email@myemail.com" + +# Pushbullet Alerts | https://docs.linuxgsm.com/alerts/pushbullet +pushbulletalert="off" +pushbullettoken="accesstoken" +channeltag="" + +# Pushover Alerts | https://docs.linuxgsm.com/alerts/pushover +pushoveralert="off" +pushovertoken="accesstoken" + +# Telegram Alerts | https://docs.linuxgsm.com/alerts/telegram +# You can add a custom cURL string eg proxy (useful in Russia) or else in "curlcustomstring". +# like a "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help", if you not need +# any custom string in curl - simple ignore this parameter. +telegramalert="off" +telegramtoken="accesstoken" +telegramchatid="" +curlcustomstring="" + +## Updating | https://docs.linuxgsm.com/commands/update +updateonstart="off" + +## Backup | https://docs.linuxgsm.com/commands/backup +maxbackups="4" +maxbackupdays="30" +stoponbackup="on" + +## Logging | https://docs.linuxgsm.com/features/logging +consolelogging="on" +logdays="7" + +## Monitor | https://docs.linuxgsm.com/commands/monitor +# Query delay time +querydelay="1" + +#### LinuxGSM Advanced Settings #### + +# ANSI Colors +ansi="on" + +# Message Display Time +sleeptime="0.5" + +# Stop Mode | https://docs.linuxgsm.com/steamcmd/stopmode +# 1: tmux kill +# 2: CTRL+c +# 3: quit +# 4: quit 120s +# 5: stop +# 6: q +# 7: exit +# 8: 7 Days to Die +# 9: Gold Source +# 10: Teamspeak 3 +stopmode="3" + +## SteamCMD Settings +# Server appid +appid="985050" +# SteamCMD Branch | https://docs.linuxgsm.com/steamcmd/branch +branch="" +# Master Server | https://docs.linuxgsm.com/steamcmd/steam-master-server +steammaster="true" + +## LinuxGSM Server Details +# Do not edit +gamename="Action: Source" +engine="source" +glibc="2.15" + +#### Directories #### +# Edit with care + +## Server Specific Directories +systemdir="${serverfiles}/ahl2" +executabledir="${serverfiles}" +executable="./srcds_run" +servercfg="${servicename}.cfg" +servercfgdefault="server.cfg" +servercfgdir="${systemdir}/cfg" +servercfgfullpath="${servercfgdir}/${servercfg}" + +## Backup Directory +backupdir="${lgsmdir}/backup" + +## Logging Directories +logdir="${rootdir}/log" +gamelogdir="${systemdir}/logs" +lgsmlogdir="${logdir}/script" +consolelogdir="${logdir}/console" +lgsmlog="${lgsmlogdir}/${servicename}-script.log" +consolelog="${consolelogdir}/${servicename}-console.log" +alertlog="${lgsmlogdir}/${servicename}-alert.log" +postdetailslog="${lgsmlogdir}/${servicename}-postdetails.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/data/serverlist.csv b/lgsm/data/serverlist.csv index 2b3567314..6be10634d 100644 --- a/lgsm/data/serverlist.csv +++ b/lgsm/data/serverlist.csv @@ -1,4 +1,5 @@ ahl,ahlserver,Action half-life +ahl2,ahl2server,Action: Source arma3,arma3server,ARMA 3 sdtd,sdtdserver,7 Days to Die ark,arkserver,ARK: Survival Evolved diff --git a/lgsm/functions/install_config.sh b/lgsm/functions/install_config.sh index 33779d1c4..ea9687daa 100644 --- a/lgsm/functions/install_config.sh +++ b/lgsm/functions/install_config.sh @@ -153,6 +153,12 @@ elif [ "${shortname}" == "ahl" ]; then fn_fetch_default_config fn_default_config_remote fn_set_config_vars +elif [ "${shortname}" == "ahl2" ]; then + gamedirname="ActionSource" + array_configs+=( server.cfg ) + fn_fetch_default_config + fn_default_config_remote + fn_set_config_vars elif [ "${shortname}" == "ark" ]; then gamedirname="ARKSurvivalEvolved" fn_check_cfgdir From 4cb2417db70eda435b067c504e505e176664a769 Mon Sep 17 00:00:00 2001 From: Frisasky Date: Mon, 7 Oct 2019 04:00:46 +0800 Subject: [PATCH 172/534] fix(install): dependency checking for CentOS 8 and upgrade gsquery to python3 (#2526) --- .travis.yml | 2 +- lgsm/functions/check_deps.sh | 21 +++++++++++++-------- lgsm/functions/query_gsquery.py | 4 ++-- 3 files changed, 16 insertions(+), 11 deletions(-) diff --git a/.travis.yml b/.travis.yml index 59c6d892b..5606c8e6a 100644 --- a/.travis.yml +++ b/.travis.yml @@ -19,7 +19,7 @@ addons: - gzip - unzip - bsdmainutils - - python + - python3 - util-linux - ca-certificates - binutils diff --git a/lgsm/functions/check_deps.sh b/lgsm/functions/check_deps.sh index 61e1df2f9..359795f31 100644 --- a/lgsm/functions/check_deps.sh +++ b/lgsm/functions/check_deps.sh @@ -42,7 +42,10 @@ fn_install_mono_repo(){ monoautoinstall="1" fi elif [ "${distroid}" == "debian" ]; then - if [ "${distroversion}" == "9" ]; then + if [ "${distroversion}" == "10" ]; then + cmd="sudo apt install apt-transport-https dirmngr;sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys 3FA7E0328081BFF6A14DA29AA6A19B38D3D831EF;echo 'deb https://download.mono-project.com/repo/debian stable-buster main' | sudo tee /etc/apt/sources.list.d/mono-official-stable.list;sudo apt update" + eval ${cmd} + elif [ "${distroversion}" == "9" ]; then cmd="sudo apt install apt-transport-https dirmngr;sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys 3FA7E0328081BFF6A14DA29AA6A19B38D3D831EF;echo 'deb https://download.mono-project.com/repo/debian stable-stretch main' | sudo tee /etc/apt/sources.list.d/mono-official-stable.list;sudo apt update" eval ${cmd} elif [ "${distroversion}" == "8" ]; then @@ -332,7 +335,7 @@ fn_deps_build_debian(){ array_deps_missing=() # LinuxGSM requirements. - array_deps_required=( curl wget ca-certificates file bsdmainutils util-linux python bzip2 gzip unzip binutils bc jq ) + array_deps_required=( curl wget ca-certificates file bsdmainutils util-linux python3 bzip2 gzip unzip binutils bc jq ) # All servers except ts3 require tmux. if [ "${shortname}" != "ts3" ]; then @@ -443,17 +446,19 @@ fn_deps_build_redhat(){ array_deps_missing=() # LinuxGSM requirements. - # CentOS 6 + # CentOS if [ "${distroversion}" == "6" ]; then - array_deps_required=( epel-release curl wget util-linux-ng python file gzip bzip2 unzip binutils bc jq ) + array_deps_required=( epel-release curl wget util-linux-ng python3 file gzip bzip2 unzip binutils bc jq ) elif [ "${distroversion}" == "7" ]; then - array_deps_required=( epel-release curl wget util-linux python file gzip bzip2 unzip binutils bc jq ) + array_deps_required=( epel-release curl wget util-linux python3 file gzip bzip2 unzip binutils bc jq ) + elif [ "${distroversion}" == "8" ]; then + array_deps_required=( epel-release curl wget util-linux python3 file gzip bzip2 unzip binutils bc jq ) elif [ "${distroid}" == "fedora" ]; then - array_deps_required=( curl wget util-linux python2 file gzip bzip2 unzip binutils bc jq ) + array_deps_required=( curl wget util-linux python3 file gzip bzip2 unzip binutils bc jq ) elif [[ "${distroname}" == *"Amazon Linux AMI"* ]]; then - array_deps_required=( curl wget util-linux python27 file gzip bzip2 unzip binutils bc jq ) + array_deps_required=( curl wget util-linux python3 file gzip bzip2 unzip binutils bc jq ) else - array_deps_required=( curl wget util-linux python file gzip bzip2 unzip binutils bc jq ) + array_deps_required=( curl wget util-linux python3 file gzip bzip2 unzip binutils bc jq ) fi # All servers except ts3 require tmux. diff --git a/lgsm/functions/query_gsquery.py b/lgsm/functions/query_gsquery.py index b02262382..87207653d 100644 --- a/lgsm/functions/query_gsquery.py +++ b/lgsm/functions/query_gsquery.py @@ -1,4 +1,4 @@ -#! /usr/bin/env python +#! /usr/bin/env python3 # -*- coding: utf-8 -*- # query_gsquery.py # Author: Anonymous & Daniel Gibbs @@ -82,7 +82,7 @@ class gsquery: if __name__ == '__main__': parser = optparse.OptionParser( - usage='usage: python %prog [options]', + usage='usage: python3 %prog [options]', version='%prog 0.0.1' ) parser.add_option( From 7396f1e93a1352f0c9969b7e12e4f164a6a37ef1 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Mon, 7 Oct 2019 21:33:49 +0100 Subject: [PATCH 173/534] feat(newserver): Warfork (#2535) * feat(newserver): warfork (#2475) * feat(newserver): warfork (#2508) * fixing player numbers bug * gamepid bug * add qfustion engine * Update info_messages.sh * Added missing slack settings * removed tab --- .../config-lgsm/ahl2server/_default.cfg | 4 + .../config-lgsm/etlserver/_default.cfg | 2 +- .../config-lgsm/wfserver/_default.cfg | 153 ++++++++++++++++++ lgsm/data/serverlist.csv | 1 + lgsm/functions/command_monitor.sh | 2 +- lgsm/functions/info_config.sh | 20 +++ lgsm/functions/info_distro.sh | 2 +- lgsm/functions/info_messages.sh | 38 +++-- lgsm/functions/info_parms.sh | 50 +++--- lgsm/functions/install_config.sh | 6 + lgsm/functions/query_gamedig.sh | 10 +- lgsm/functions/query_gsquery.py | 2 +- 12 files changed, 253 insertions(+), 37 deletions(-) create mode 100644 lgsm/config-default/config-lgsm/wfserver/_default.cfg diff --git a/lgsm/config-default/config-lgsm/ahl2server/_default.cfg b/lgsm/config-default/config-lgsm/ahl2server/_default.cfg index 2d39ca4da..f819cf468 100644 --- a/lgsm/config-default/config-lgsm/ahl2server/_default.cfg +++ b/lgsm/config-default/config-lgsm/ahl2server/_default.cfg @@ -42,6 +42,10 @@ posttarget="https://hastebin.com" discordalert="off" discordwebhook="webhook" +# Slack Alerts | https://docs.linuxgsm.com/alerts/slack +slackalert="off" +slackwebhook="webhook" + # Email Alerts | https://docs.linuxgsm.com/alerts/email emailalert="off" email="email@example.com" diff --git a/lgsm/config-default/config-lgsm/etlserver/_default.cfg b/lgsm/config-default/config-lgsm/etlserver/_default.cfg index aa467674f..c7e480ae2 100644 --- a/lgsm/config-default/config-lgsm/etlserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/etlserver/_default.cfg @@ -10,7 +10,7 @@ ## Server Start Command | https://docs.linuxgsm.com/configuration/start-parameters#additional-parameters fn_parms(){ - parms="+set net_strict 1 +set fs_homepath ${serverfiles} +exec ${servercfg}" +parms="+set net_strict 1 +set fs_homepath ${serverfiles} +exec ${servercfg}" } #### LinuxGSM Settings #### diff --git a/lgsm/config-default/config-lgsm/wfserver/_default.cfg b/lgsm/config-default/config-lgsm/wfserver/_default.cfg new file mode 100644 index 000000000..eb54646f8 --- /dev/null +++ b/lgsm/config-default/config-lgsm/wfserver/_default.cfg @@ -0,0 +1,153 @@ +################################## +######## 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://docs.linuxgsm.com/configuration/start-parameters +ip="0.0.0.0" +port="44400" +httpport="44444" + +## Server Start Command | https://docs.linuxgsm.com/configuration/start-parameters#additional-parameters +fn_parms(){ +parms="+exec ${servercfg} +sv_http_ip ${ip} +set sv_http_port ${httpport} +sv_ip ${ip} +sv_port ${port}" +} + +#### LinuxGSM Settings #### + +## Notification Alerts +# (on|off) + +# Display IP | https://docs.linuxgsm.com/alerts#display-ip +displayip="" + +# More info | https://docs.linuxgsm.com/alerts#more-info +postalert="off" +postdays="7" +posttarget="https://hastebin.com" + +# Discord Alerts | https://docs.linuxgsm.com/alerts/discord +discordalert="off" +discordwebhook="webhook" + +# Slack Alerts | https://docs.linuxgsm.com/alerts/slack +slackalert="off" +slackwebhook="webhook" + +# Email Alerts | https://docs.linuxgsm.com/alerts/email +emailalert="off" +email="email@example.com" +emailfrom="" + +# IFTTT Alerts | https://docs.linuxgsm.com/alerts/ifttt +iftttalert="off" +ifttttoken="accesstoken" +iftttevent="linuxgsm_alert" + +# Mailgun Email Alerts | https://docs.linuxgsm.com/alerts/mailgun +mailgunalert="off" +mailguntoken="accesstoken" +mailgundomain="example.com" +mailgunemailfrom="alert@example.com" +mailgunemail="email@myemail.com" + +# Pushbullet Alerts | https://docs.linuxgsm.com/alerts/pushbullet +pushbulletalert="off" +pushbullettoken="accesstoken" +channeltag="" + +# Pushover Alerts | https://docs.linuxgsm.com/alerts/pushover +pushoveralert="off" +pushovertoken="accesstoken" + +# Telegram Alerts | https://docs.linuxgsm.com/alerts/telegram +# You can add a custom cURL string eg proxy (useful in Russia) or else in "curlcustomstring". +# like a "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help", if you not need +# any custom string in curl - simple ignore this parameter. +telegramalert="off" +telegramtoken="accesstoken" +telegramchatid="" +curlcustomstring="" + +## Backup | https://docs.linuxgsm.com/commands/backup +maxbackups="4" +maxbackupdays="30" +stoponbackup="on" + +## Logging | https://docs.linuxgsm.com/features/logging +consolelogging="on" +logdays="7" + +## Monitor | https://docs.linuxgsm.com/commands/monitor +# Query delay time +querydelay="1" + +#### LinuxGSM Advanced Settings #### + +# ANSI Colors +ansi="on" + +# Message Display Time +sleeptime="0.5" + +# Stop Mode | https://docs.linuxgsm.com/steamcmd/stopmode +# 1: tmux kill +# 2: CTRL+c +# 3: quit +# 4: quit 120s +# 5: stop +# 6: q +# 7: exit +# 8: 7 Days to Die +# 9: Gold Source +# 10: Teamspeak 3 +stopmode="3" + +## SteamCMD Settings +# Server appid +appid="1136510" +appidmod="warfork" +# SteamCMD Branch | https://docs.linuxgsm.com/steamcmd/branch +branch="" +# Master Server | https://docs.linuxgsm.com/steamcmd/steam-master-server +steammaster="true" + +## LinuxGSM Server Details +# Do not edit +gamename="Warfork" +engine="qfusion" +glibc="2.15" + +#### Directories #### +# Edit with care + +## Server Specific Directories +systemdir="${serverfiles}/Warfork.app/Contents/Resources" +executabledir="${systemdir}" +executable="./wf_server.x86_64" +servercfg="${servicename}.cfg" +servercfgdefault="server.cfg" +servercfgdir="${systemdir}/basewf" +servercfgfullpath="${servercfgdir}/${servercfg}" + +## Backup Directory +backupdir="${lgsmdir}/backup" + +## Logging Directories +logdir="${rootdir}/log" +gamelogdir="${serverfiles}/Logs" +lgsmlogdir="${logdir}/script" +consolelogdir="${logdir}/console" +lgsmlog="${lgsmlogdir}/${servicename}-script.log" +consolelog="${consolelogdir}/${servicename}-console.log" +alertlog="${lgsmlogdir}/${servicename}-alert.log" +postdetailslog="${lgsmlogdir}/${servicename}-postdetails.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/data/serverlist.csv b/lgsm/data/serverlist.csv index 6be10634d..49109659b 100644 --- a/lgsm/data/serverlist.csv +++ b/lgsm/data/serverlist.csv @@ -94,6 +94,7 @@ ut99,ut99server,Unreal Tournament 99 unt,untserver,Unturned vs,vsserver,Vampire Slayer wet,wetserver,Wolfenstein: Enemy Territory +wf,wfserver,Warfork wurm,wurmserver,Wurm Unlimited etl,etlserver,ET: Legacy zmr,zmrserver,Zombie Master: Reborn diff --git a/lgsm/functions/command_monitor.sh b/lgsm/functions/command_monitor.sh index 8382d1fb7..3eaa944de 100644 --- a/lgsm/functions/command_monitor.sh +++ b/lgsm/functions/command_monitor.sh @@ -133,7 +133,7 @@ fn_monitor_check_session(){ fn_monitor_query(){ fn_script_log_info "Querying port: query enabled" # Engines that work with query. - local allowed_engines_array=( avalanche2.0 avalanche3.0 barotrauma goldsource idtech2 idtech3 idtech3_ql ioquake3 iw2.0 iw3.0 lwjgl2 madness quake refractor realvirtuality source spark starbound unity3d unreal unreal2 unreal4 wurm ) + local allowed_engines_array=( avalanche2.0 avalanche3.0 barotrauma goldsource idtech2 idtech3 idtech3_ql ioquake3 iw2.0 iw3.0 lwjgl2 madness quake qfusion refractor realvirtuality source spark starbound unity3d unreal unreal2 unreal4 wurm ) for allowed_engine in "${allowed_engines_array[@]}" do if [ "${allowed_engine}" == "${engine}" ]; then diff --git a/lgsm/functions/info_config.sh b/lgsm/functions/info_config.sh index f7bbb7bc2..b63d401ea 100644 --- a/lgsm/functions/info_config.sh +++ b/lgsm/functions/info_config.sh @@ -935,6 +935,24 @@ fn_info_config_unreal3(){ fi } + +fn_info_config_warfork(){ + if [ ! -f "${servercfgfullpath}" ]; then + rconpassword="${unavailable}" + servername="${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 "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]*$//') + maxplayers=$(grep "sv_maxclients" "${servercfgfullpath}" | grep -v "#" | tr -cd '[:digit:]') + + # Not Set + rconpassword=${rconpassword:-"NOT SET"} + servername=${servername:-"NOT SET"} + maxplayers=${maxplayers:-"0"} + fi +} + fn_info_config_kf2(){ if [ ! -f "${servercfgfullpath}" ]; then servername="${unavailable}" @@ -1352,6 +1370,8 @@ elif [ "${shortname}" == "sdtd" ]; then fn_info_config_sdtd elif [ "${shortname}" == "wet" ]; then fn_info_config_wolfensteinenemyterritory +elif [ "${shortname}" == "wf" ]; then + fn_info_config_warfork elif [ "${shortname}" == "etl" ]; then fn_info_config_etlegacy elif [ "${shortname}" == "wurm" ]; then diff --git a/lgsm/functions/info_distro.sh b/lgsm/functions/info_distro.sh index 745e86060..13af615ce 100644 --- a/lgsm/functions/info_distro.sh +++ b/lgsm/functions/info_distro.sh @@ -141,7 +141,7 @@ if [ -n "$(command -v numfmt 2>/dev/null)" ]; then if [ "${status}" == "1" ]; then memused=$(ps --forest -o rss -g "$(ps -o sid= -p "${gameserverpid}")"|awk '{s+=$1} END {print s}'| awk '{$1/=1024;printf "%.0fMB\t",$1}{print $2}') # % - pmemused=$(ps --forest -o %mem -g "$(ps -o sid= -p 2766)"|awk '{s+=$1} END {print s}') + pmemused=$(ps --forest -o %mem -g "$(ps -o sid= -p "${gameserverpid}")"|awk '{s+=$1} END {print s}') fi else # Older distros will need to use free. diff --git a/lgsm/functions/info_messages.sh b/lgsm/functions/info_messages.sh index 067e5283c..d7ff01dab 100644 --- a/lgsm/functions/info_messages.sh +++ b/lgsm/functions/info_messages.sh @@ -539,7 +539,7 @@ fn_info_message_ports(){ parmslocation="${red}UNKNOWN${default}" # engines/games that require editing in the config file - local ports_edit_array=( "avalanche2.0" "avalanche3.0" "Ballistic Overkill" "dontstarve" "Eco" "idtech2" "idtech3" "idtech3_ql" "lwjgl2" "Project Cars" "projectzomboid" "quake" "refractor" "realvirtuality" "renderware" "seriousengine35" "Stationeers" "teeworlds" "terraria" "unreal" "unreal2" "unreal3" "TeamSpeak 3" "Mumble" "7 Days To Die" "wurm" ) + local ports_edit_array=( "avalanche2.0" "avalanche3.0" "Ballistic Overkill" "dontstarve" "Eco" "idtech2" "idtech3" "idtech3_ql" "lwjgl2" "Project Cars" "projectzomboid" "quake" "refractor" "realvirtuality" "renderware" "seriousengine35" "Stationeers" "teeworlds" "terraria" "unreal" "unreal2" "unreal3" "TeamSpeak 3" "Mumble" "7 Days To Die" "wurm") for port_edit in "${ports_edit_array[@]}" do if [ "${shortname}" == "ut3" ]; then @@ -551,7 +551,7 @@ fn_info_message_ports(){ fi done # engines/games that require editing the parms - local ports_edit_array=( "goldsource" "Factorio" "Hurtworld" "iw3.0" "ioquake3" "Rust" "Soldat" "spark" "source" "starbound" "unreal4" "realvirtuality" "Unturned" ) + local ports_edit_array=( "goldsource" "Factorio" "Hurtworld" "iw3.0" "ioquake3" "qfusion" "Rust" "Soldat" "spark" "source" "starbound" "unreal4" "realvirtuality" "Unturned" ) for port_edit in "${ports_edit_array[@]}" do if [ "${engine}" == "${port_edit}" ]||[ "${gamename}" == "${port_edit}" ]||[ "${shortname}" == "${port_edit}" ]; then @@ -727,6 +727,16 @@ fn_info_message_eco(){ } | column -s $'\t' -t } + +fn_info_message_etlegacy(){ + echo -e "netstat -atunp | grep etlded" + echo -e "" + { + echo -e "DESCRIPTION\tDIRECTION\tPORT\tPROTOCOL" + echo -e "> Game/Query\tINBOUND\t${port}\tudp" + } | column -s $'\t' -t +} + fn_info_message_factorio(){ echo -e "netstat -atunp | grep factorio" echo -e "" @@ -1153,6 +1163,7 @@ fn_info_message_unreal(){ } fn_info_message_unreal3(){ + fn_info_message_password_strip echo -e "netstat -atunp | grep ut3-bin" echo -e "" { @@ -1182,7 +1193,10 @@ fn_info_message_unturned(){ } | column -s $'\t' -t } + + fn_info_message_kf2(){ + fn_info_message_password_strip echo -e "netstat -atunp | grep KFGame" echo -e "" { @@ -1212,14 +1226,6 @@ fn_info_message_wolfensteinenemyterritory(){ } | column -s $'\t' -t } -fn_info_message_etlegacy(){ - echo -e "netstat -atunp | grep etlded" - echo -e "" - { - echo -e "DESCRIPTION\tDIRECTION\tPORT\tPROTOCOL" - echo -e "> Game/Query\tINBOUND\t${port}\tudp" - } | column -s $'\t' -t -} fn_info_message_wurmunlimited(){ echo -e "netstat -atunp | grep WurmServer" @@ -1276,6 +1282,16 @@ fn_info_message_soldat() { } | column -s $'\t' -t } +fn_info_message_warfork(){ + echo -e "netstat -atunp | grep wf_server" + echo -e "" + { + echo -e "DESCRIPTION\tDIRECTION\tPORT\tPROTOCOL" + echo -e "> Game\tINBOUND\t${port}\tudp" + echo -e "> HTTP\tINBOUND\t${httpport}\ttcp" + } | column -s $'\t' -t +} + fn_info_message_select_engine(){ # Display details depending on game or engine. if [ "${shortname}" == "sdtd" ]; then @@ -1354,6 +1370,8 @@ fn_info_message_select_engine(){ fn_info_message_rtcw elif [ "${shortname}" == "rust" ]; then fn_info_message_rust + elif [ "${shortname}" == "wf" ]; then + fn_info_message_warfork elif [ "${shortname}" == "wurm" ]; then fn_info_message_wurmunlimited elif [ "${shortname}" == "rw" ]; then diff --git a/lgsm/functions/info_parms.sh b/lgsm/functions/info_parms.sh index f902f2e23..f7cf11cbc 100644 --- a/lgsm/functions/info_parms.sh +++ b/lgsm/functions/info_parms.sh @@ -27,11 +27,6 @@ fn_info_parms_barotrauma(){ queryport=${queryport:-"0"} } -fn_info_parms_realvirtuality(){ - port=${port:-"0"} - queryport=$((port + 1)) -} - fn_info_parms_cod(){ defaultmap=${defaultmap:-"NOT SET"} maxplayers=${maxplayers:-"0"} @@ -57,6 +52,15 @@ fn_info_parms_factorio(){ rconpassword=${rconpassword:-"NOT SET"} } +fn_info_parms_hurtworld(){ + servername=${servername:-"NOT SET"} + port=${port:-"0"} + queryport=${queryport:-"0"} + maxplayers=${maxplayers:-"0"} + defaultmap=${defaultmap:-"NOT SET"} + creativemode=${creativemode:-"NOT SET"} +} + fn_info_parms_inss(){ port=${port:-"0"} queryport=${queryport:-"0"} @@ -67,13 +71,16 @@ fn_info_parms_inss(){ maxplayers=${maxplayers:-"0"} } -fn_info_parms_hurtworld(){ - servername=${servername:-"NOT SET"} - port=${port:-"0"} +fn_info_parms_kf2(){ queryport=${queryport:-"0"} - maxplayers=${maxplayers:-"0"} defaultmap=${defaultmap:-"NOT SET"} - creativemode=${creativemode:-"NOT SET"} +} + + +fn_info_parms_mordhau(){ + port=${port:-"0"} + queryport=${queryport:-"0"} + beaconport=${beaconport:-"0"} } fn_info_parms_projectzomboid(){ @@ -90,12 +97,16 @@ fn_info_parms_quake2(){ defaultmap=${defaultmap:-"NOT SET"} } +fn_info_parms_realvirtuality(){ + port=${port:-"0"} + queryport=$((port + 1)) +} + fn_info_parms_risingworld(){ servername=${servername:-"NOT SET"} port=${port:-"0"} queryport=${port} httpqueryport=$((port - 1)) - } fn_info_parms_rtcw(){ @@ -171,12 +182,6 @@ fn_info_parms_towerunite(){ queryport=${queryport:-"0"} } -fn_info_parms_mordhau(){ - port=${port:-"0"} - queryport=${queryport:-"0"} - beaconport=${beaconport:-"0"} -} - fn_info_parms_unreal(){ defaultmap=${defaultmap:-"NOT SET"} queryport=$((port + 1)) @@ -200,9 +205,11 @@ fn_info_parms_unturned(){ port=${port:-"0"} queryport=$((port + 1)) } -fn_info_parms_kf2(){ - queryport=${queryport:-"0"} - defaultmap=${defaultmap:-"NOT SET"} + +fn_info_parms_wf(){ + port=${port:-"0"} + queryport="${port}" + webadminport=${webadminport:-"0"} } # ARK: Survival Evolved @@ -270,4 +277,7 @@ elif [ "${engine}" == "unreal3" ]; then fn_info_parms_unreal3 elif [ "${shortname}" == "unt" ]; then fn_info_parms_unturned +# Warfork +elif [ "${shortname}" == "wf" ]; then + fn_info_parms_wf fi diff --git a/lgsm/functions/install_config.sh b/lgsm/functions/install_config.sh index ea9687daa..ccb95fdb6 100644 --- a/lgsm/functions/install_config.sh +++ b/lgsm/functions/install_config.sh @@ -669,6 +669,12 @@ elif [ "${shortname}" == "wet" ]; then fn_fetch_default_config fn_default_config_remote fn_set_config_vars +elif [ "${shortname}" == "wf" ]; then + gamedirname="Warfork" + array_configs+=( server.cfg ) + fn_fetch_default_config + fn_default_config_remote + fn_set_config_vars elif [ "${shortname}" == "wurm" ]; then gamedirname="WurmUnlimited" array_configs+=( server.cfg ) diff --git a/lgsm/functions/query_gamedig.sh b/lgsm/functions/query_gamedig.sh index 39e8d884a..9438e4584 100644 --- a/lgsm/functions/query_gamedig.sh +++ b/lgsm/functions/query_gamedig.sh @@ -46,7 +46,7 @@ if [ "$(command -v gamedig 2>/dev/null)" ]&&[ "$(command -v jq 2>/dev/null)" ]; fi done - local engine_query_array=( idtech3 iw3.0 ioquake3 ) + local engine_query_array=( idtech3 iw3.0 ioquake3 qfusion ) for engine_query in "${engine_query_array[@]}" do if [ "${engine_query}" == "${engine}" ]; then @@ -101,15 +101,19 @@ if [ "$(command -v gamedig 2>/dev/null)" ]&&[ "$(command -v jq 2>/dev/null)" ]; fi # numplayers. - gdplayers=$(echo "${gamedigraw}" | jq -re '.players|length') + gdplayers=$(echo "${gamedigraw}" | jq -re '.players') if [ "${gdplayers}" == "null" ]; then unset gdplayers + elif [ "${gdplayers}" == "[]" ]; then + gdplayers=0 fi # maxplayers. - gdmaxplayers=$(echo "${gamedigraw}" | jq -re '.maxplayers|length') + gdmaxplayers=$(echo "${gamedigraw}" | jq -re '.maxplayers') if [ "${gdmaxplayers}" == "null" ]; then unset maxplayers + elif [ "${gdmaxplayers}" == "[]" ]; then + gdmaxplayers=0 fi # current map. diff --git a/lgsm/functions/query_gsquery.py b/lgsm/functions/query_gsquery.py index 87207653d..fcfd4edc3 100644 --- a/lgsm/functions/query_gsquery.py +++ b/lgsm/functions/query_gsquery.py @@ -18,7 +18,7 @@ class gsquery: self.default_buffer_length = 1024 # sourcequery=[ 'avalanche3.0','barotrauma''madness','quakelive','realvirtuality','refractor','source','goldsource','spark','starbound','unity3d', 'unreal4', 'wurm' ] - idtech3query=['idtech3','iw3.0','ioquake3'] + idtech3query=['idtech3','iw3.0','ioquake3','qfusion'] idtech2query=['idtech2','quake','iw2.0'] minecraftquery=['minecraft','lwjgl2'] if self.option.engine in sourcequery: From d600b99c862d3cced995d9bd757f1ce6cacb465f Mon Sep 17 00:00:00 2001 From: Kenny Lindelof Date: Mon, 7 Oct 2019 16:35:56 -0400 Subject: [PATCH 174/534] bug(alert):include slack alert in detail command (#2536) --- lgsm/functions/info_messages.sh | 3 +++ 1 file changed, 3 insertions(+) diff --git a/lgsm/functions/info_messages.sh b/lgsm/functions/info_messages.sh index d7ff01dab..b13e1bcc4 100644 --- a/lgsm/functions/info_messages.sh +++ b/lgsm/functions/info_messages.sh @@ -397,6 +397,7 @@ fn_info_message_script(){ # LinuxGSM version: v19.9.0 # glibc required: 2.15 # Discord alert: off + # Slack alert: off # Email alert: off # Pushbullet alert: off # IFTTT alert: off @@ -436,6 +437,8 @@ fn_info_message_script(){ # Discord alert echo -e "${lightblue}Discord alert:\t${default}${discordalert}" + # Slack alert + echo -e "${lightblue}Slack alert:\t${default}${slackalert}" # Email alert echo -e "${lightblue}Email alert:\t${default}${emailalert}" # Pushbullet alert From 28eea326ffa441ba7e71bff12cce783abac960ba Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Mon, 7 Oct 2019 22:28:30 +0100 Subject: [PATCH 175/534] bug(monitor): fix quake2 and query not working (#2538) --- 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 f7cf11cbc..fe68fb9c2 100644 --- a/lgsm/functions/info_parms.sh +++ b/lgsm/functions/info_parms.sh @@ -94,6 +94,7 @@ fn_info_parms_quakeworld(){ fn_info_parms_quake2(){ port=${port:-"0"} + queryport=${port} defaultmap=${defaultmap:-"NOT SET"} } From 67cfaf429e26e7b5568c1e95588f18152c43ba4d Mon Sep 17 00:00:00 2001 From: Frisasky Date: Tue, 8 Oct 2019 19:17:26 +0800 Subject: [PATCH 176/534] bug(install): fix a typo breaking bf1942 install (#2541) --- 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 ccb95fdb6..0a9c9de52 100644 --- a/lgsm/functions/install_config.sh +++ b/lgsm/functions/install_config.sh @@ -199,7 +199,7 @@ elif [ "${shortname}" == "bt1944" ]; then fn_fetch_default_config fn_default_config_remote fn_set_config_vars -elif [ "${shortname}" == "bt1942" ]; then +elif [ "${shortname}" == "bf1942" ]; then gamedirname="Battlefield1942" array_configs+=( serversettings.con ) fn_fetch_default_config From 14528e8daf7cdfae512efbb3063943ea61909214 Mon Sep 17 00:00:00 2001 From: Christian Date: Sun, 13 Oct 2019 15:20:16 +0200 Subject: [PATCH 177/534] add gconf2 for dependecy checks (#2553) --- lgsm/functions/command_dev_detect_deps.sh | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/lgsm/functions/command_dev_detect_deps.sh b/lgsm/functions/command_dev_detect_deps.sh index ad431a722..15bd4aff8 100644 --- a/lgsm/functions/command_dev_detect_deps.sh +++ b/lgsm/functions/command_dev_detect_deps.sh @@ -123,6 +123,11 @@ while read -r lib; do echo "libopenal1" >> "${tmpdir}/.depdetect_ubuntu_list" echo "libopenal1" >> "${tmpdir}/.depdetect_debian_list" libdetected=1 + elif [ "${lib}" == "libgconf-2.so.4" ]; then + echo "GConf2" >> "${tmpdir}/.depdetect_centos_list" + echo "libgconf2-4" >> "${tmpdir}/.depdetect_ubuntu_list" + echo "libgconf2-4" >> "${tmpdir}/.depdetect_debian_list" + libdetected=1 fi if [ "${libdetected}" != "1" ]; then From de6cdee9462f2cd1d559d6c6a0fbabb6eeed6fb6 Mon Sep 17 00:00:00 2001 From: Frisasky Date: Sun, 13 Oct 2019 21:20:52 +0800 Subject: [PATCH 178/534] feat(fofserver): update default number of players (#2548) --- lgsm/config-default/config-lgsm/fofserver/_default.cfg | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lgsm/config-default/config-lgsm/fofserver/_default.cfg b/lgsm/config-default/config-lgsm/fofserver/_default.cfg index 782b7f86b..a5ab65550 100644 --- a/lgsm/config-default/config-lgsm/fofserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/fofserver/_default.cfg @@ -14,7 +14,7 @@ port="27015" clientport="27005" sourcetvport="27020" defaultmap="fof_depot" -maxplayers="16" +maxplayers="20" ## Server Start Command | https://docs.linuxgsm.com/configuration/start-parameters#additional-parameters fn_parms(){ From 63dffc5bb5034e75096fd6413cf99cf7304877ee Mon Sep 17 00:00:00 2001 From: Frisasky Date: Sun, 13 Oct 2019 21:21:44 +0800 Subject: [PATCH 179/534] feat(install): centos 8 python dependency checking (#2546) --- 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 359795f31..8cf1a3de4 100644 --- a/lgsm/functions/check_deps.sh +++ b/lgsm/functions/check_deps.sh @@ -448,11 +448,11 @@ fn_deps_build_redhat(){ # LinuxGSM requirements. # CentOS if [ "${distroversion}" == "6" ]; then - array_deps_required=( epel-release curl wget util-linux-ng python3 file gzip bzip2 unzip binutils bc jq ) + array_deps_required=( epel-release curl wget util-linux-ng python file gzip bzip2 unzip binutils bc jq ) elif [ "${distroversion}" == "7" ]; then array_deps_required=( epel-release curl wget util-linux python3 file gzip bzip2 unzip binutils bc jq ) elif [ "${distroversion}" == "8" ]; then - array_deps_required=( epel-release curl wget util-linux python3 file gzip bzip2 unzip binutils bc jq ) + array_deps_required=( epel-release curl wget util-linux python36 file gzip bzip2 unzip binutils bc jq ) elif [ "${distroid}" == "fedora" ]; then array_deps_required=( curl wget util-linux python3 file gzip bzip2 unzip binutils bc jq ) elif [[ "${distroname}" == *"Amazon Linux AMI"* ]]; then From 7a3fa84fa618e7e09005ab39cc5fc09dbf9ceb65 Mon Sep 17 00:00:00 2001 From: Frisasky Date: Mon, 14 Oct 2019 07:36:46 +0800 Subject: [PATCH 180/534] feat(newserver): Medal of Honor: Allied Assault (#2539) --- .../config-lgsm/mohaaserver/_default.cfg | 144 ++++++++++++++++++ lgsm/data/serverlist.csv | 1 + lgsm/functions/check_deps.sh | 3 + lgsm/functions/command_monitor.sh | 3 + lgsm/functions/info_config.sh | 23 +++ lgsm/functions/info_distro.sh | 6 +- lgsm/functions/info_messages.sh | 13 +- lgsm/functions/info_parms.sh | 8 + lgsm/functions/install_config.sh | 6 + lgsm/functions/install_server_files.sh | 2 + 10 files changed, 205 insertions(+), 4 deletions(-) create mode 100644 lgsm/config-default/config-lgsm/mohaaserver/_default.cfg diff --git a/lgsm/config-default/config-lgsm/mohaaserver/_default.cfg b/lgsm/config-default/config-lgsm/mohaaserver/_default.cfg new file mode 100644 index 000000000..521f3771a --- /dev/null +++ b/lgsm/config-default/config-lgsm/mohaaserver/_default.cfg @@ -0,0 +1,144 @@ +################################## +######## 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://docs.linuxgsm.com/configuration/start-parameters +ip="0.0.0.0" +port="12203" +defaultmap="dm/mohdm1" + +## Server Start Command | https://docs.linuxgsm.com/configuration/start-parameters#additional-parameters +fn_parms(){ +parms="+set sv_punkbuster 0 +set fs_basepath ${serverfiles} +set fs_outputpath ${gamelogdir} +set dedicated 2 +set net_ip ${ip} +set net_port ${port} +exec ${servercfg} +map ${defaultmap}" +} + +#### LinuxGSM Settings #### + +## Notification Alerts +# (on|off) + +# Display IP | https://docs.linuxgsm.com/alerts#display-ip +displayip="" + +# More info | https://docs.linuxgsm.com/alerts#more-info +postalert="off" +postdays="7" +posttarget="https://hastebin.com" + +# Discord Alerts | https://docs.linuxgsm.com/alerts/discord +discordalert="off" +discordwebhook="webhook" + +# Slack Alerts | https://docs.linuxgsm.com/alerts/slack +slackalert="off" +slackwebhook="webhook" + +# Email Alerts | https://docs.linuxgsm.com/alerts/email +emailalert="off" +email="email@example.com" +emailfrom="" + +# IFTTT Alerts | https://docs.linuxgsm.com/alerts/ifttt +iftttalert="off" +ifttttoken="accesstoken" +iftttevent="linuxgsm_alert" + +# Mailgun Email Alerts | https://docs.linuxgsm.com/alerts/mailgun +mailgunalert="off" +mailguntoken="accesstoken" +mailgundomain="example.com" +mailgunemailfrom="alert@example.com" +mailgunemail="email@myemail.com" + +# Pushbullet Alerts | https://docs.linuxgsm.com/alerts/pushbullet +pushbulletalert="off" +pushbullettoken="accesstoken" +channeltag="" + +# Pushover Alerts | https://docs.linuxgsm.com/alerts/pushover +pushoveralert="off" +pushovertoken="accesstoken" + +# Telegram Alerts | https://docs.linuxgsm.com/alerts/telegram +# You can add a custom cURL string eg proxy (useful in Russia) or else in "curlcustomstring". +# like a "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help", if you not need +# any custom string in curl - simple ignore this parameter. +telegramalert="off" +telegramtoken="accesstoken" +telegramchatid="" +curlcustomstring="" + +## Backup | https://docs.linuxgsm.com/commands/backup +maxbackups="4" +maxbackupdays="30" +stoponbackup="on" + +## Logging | https://docs.linuxgsm.com/features/logging +consolelogging="on" +logdays="7" + +## Monitor | https://docs.linuxgsm.com/commands/monitor +# Query delay time +querydelay="1" + +#### LinuxGSM Advanced Settings #### + +# ANSI Colors +ansi="on" + +# Message Display Time +sleeptime="0.5" + +# Stop Mode | https://docs.linuxgsm.com/steamcmd/stopmode +# 1: tmux kill +# 2: CTRL+c +# 3: quit +# 4: quit 120s +# 5: stop +# 6: q +# 7: exit +# 8: 7 Days to Die +# 9: Gold Source +# 10: Teamspeak 3 +stopmode="3" + +## LinuxGSM Server Details +# Do not edit +gamename="Medal of Honor: Allied Assault" +engine="idtech3" +glibc="2.3" + +#### Directories #### +# Edit with care + +## Server Specific Directories +systemdir="${serverfiles}/main" +executabledir="${serverfiles}" +executable="./mohaa_lnxded" +servercfg="${servicename}.cfg" +servercfgdefault="server.cfg" +servercfgdir="${serverfiles}" +servercfgfullpath="${serverfiles}/${servercfg}" + +## Backup Directory +backupdir="${lgsmdir}/backup" + +## Logging Directories +logdir="${rootdir}/log" +gamelogdir="${serverfiles}/Logs" +lgsmlogdir="${logdir}/script" +consolelogdir="${logdir}/console" +lgsmlog="${lgsmlogdir}/${servicename}-script.log" +consolelog="${consolelogdir}/${servicename}-console.log" +alertlog="${lgsmlogdir}/${servicename}-alert.log" +postdetailslog="${lgsmlogdir}/${servicename}-postdetails.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/data/serverlist.csv b/lgsm/data/serverlist.csv index 49109659b..60c02feff 100644 --- a/lgsm/data/serverlist.csv +++ b/lgsm/data/serverlist.csv @@ -50,6 +50,7 @@ l4d,l4dserver,Left 4 Dead l4d2,l4d2server,Left 4 Dead 2 mc,mcserver,Minecraft mh,mhserver,MORDHAU +mohaa,mohaaserver,Medal of Honor: Allied Assault mta,mtaserver,Multi Theft Auto mumble,mumbleserver,Mumble nd,ndserver,Nuclear Dawn diff --git a/lgsm/functions/check_deps.sh b/lgsm/functions/check_deps.sh index 8cf1a3de4..510bff36d 100644 --- a/lgsm/functions/check_deps.sh +++ b/lgsm/functions/check_deps.sh @@ -400,6 +400,9 @@ fn_deps_build_debian(){ else array_deps_required+=( openjdk-8-jre-headless ) fi + # Medal of Honor: Allied Assault + elif [ "${shortname}" == "mohaa" ]; then + array_deps_required+=( libstdc++5:i386 ) # Project Zomboid elif [ "${shortname}" == "pz" ]; then if [ -n "$(java -version 2>&1 | grep "version")" ]; then diff --git a/lgsm/functions/command_monitor.sh b/lgsm/functions/command_monitor.sh index 3eaa944de..01c50bdf3 100644 --- a/lgsm/functions/command_monitor.sh +++ b/lgsm/functions/command_monitor.sh @@ -209,6 +209,9 @@ if [ "${shortname}" == "sb" ]; then fi elif [ "${shortname}" == "ts3" ]||[ "${shortname}" == "eco" ]||[ "${shortname}" == "mumble" ]; then fn_monitor_query_tcp +elif [ "${shortname}" == "mohaa" ]; then + # prevent game from using query. Only used if specific game server cant query but engine can + : else fn_monitor_query fi diff --git a/lgsm/functions/info_config.sh b/lgsm/functions/info_config.sh index b63d401ea..0e161a2f5 100644 --- a/lgsm/functions/info_config.sh +++ b/lgsm/functions/info_config.sh @@ -386,6 +386,26 @@ fn_info_config_minecraft(){ fi } +fn_info_config_mohaa(){ + if [ ! -f "${servercfgfullpath}" ]; then + rconpassword="${unavailable}" + servername="${unavailable}" + serverpassword="${unavailable}" + maxplayers="${zero}" + else + rconpassword=$(grep "rconpassword" "${servercfgfullpath}" | sed -e 's/^[ \t]*//g' -e '/^\//d' -e 's/seta rconpassword//g' | tr -d '=\";,:' | sed -e 's/^[ \t]*//' -e 's/[ \t]*$//') + servername=$(grep "sv_hostname" "${servercfgfullpath}" | sed -e 's/^[ \t]*//g' -e '/^\//d' -e 's/seta 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/seta g_password//g' | tr -d '=\";,:' | sed -e 's/^[ \t]*//' -e 's/[ \t]*$//') + maxplayers=$(grep "sv_maxclients" "${servercfgfullpath}" | grep -v "#" | tr -cd '[:digit:]') + + # Not Set + rconpassword=${rconpassword:-"NOT SET"} + servername=${servername:-"NOT SET"} + serverpassword=${serverpassword:-"NOT SET"} + maxplayers=${maxplayers:-"0"} + fi +} + #Post Scriptum: The bloody Seventh fn_info_config_pstbs(){ if [ ! -f "${servercfgfullpath}" ]; then @@ -1290,6 +1310,9 @@ elif [ "${shortname}" == "jc3" ]; then # Killing Floor 2 elif [ "${shortname}" == "kf2" ]; then fn_info_config_kf2 +# Medal of Honor: Allied Assault +elif [ "${shortname}" == "mohaa" ]; then + fn_info_config_mohaa # QuakeWorld elif [ "${shortname}" == "qw" ]; then fn_info_config_quakeworld diff --git a/lgsm/functions/info_distro.sh b/lgsm/functions/info_distro.sh index 13af615ce..089f188c9 100644 --- a/lgsm/functions/info_distro.sh +++ b/lgsm/functions/info_distro.sh @@ -101,7 +101,7 @@ cpucores=$(awk -F: '/model name/ {core++} END {print core}' /proc/cpuinfo) cpufreqency=$(awk -F: ' /cpu MHz/ {freq=$2} END {print freq " MHz"}' /proc/cpuinfo | sed 's/^[ \t]*//;s/[ \t]*$//') # CPU usage of the game server pid if [ "${status}" == "1" ]; then - cpuused=$(ps --forest -o pcpu -g "$(ps -o sid= -p "${gameserverpid}")"|awk '{s+=$1} END {print s}') + cpuused=$(ps --forest -o pcpu -g "${gameserverpid}"|awk '{s+=$1} END {print s}') fi ## Memory information @@ -139,9 +139,9 @@ if [ -n "$(command -v numfmt 2>/dev/null)" ]; then # RAM usage of the game server pid # MB if [ "${status}" == "1" ]; then - memused=$(ps --forest -o rss -g "$(ps -o sid= -p "${gameserverpid}")"|awk '{s+=$1} END {print s}'| awk '{$1/=1024;printf "%.0fMB\t",$1}{print $2}') + memused=$(ps --forest -o rss -g "${gameserverpid}" | awk '{s+=$1} END {print s}'| awk '{$1/=1024;printf "%.0fMB\t",$1}{print $2}') # % - pmemused=$(ps --forest -o %mem -g "$(ps -o sid= -p "${gameserverpid}")"|awk '{s+=$1} END {print s}') + pmemused=$(ps --forest -o %mem -g "${gameserverpid}" | awk '{s+=$1} END {print s}') fi else # Older distros will need to use free. diff --git a/lgsm/functions/info_messages.sh b/lgsm/functions/info_messages.sh index b13e1bcc4..427389e1d 100644 --- a/lgsm/functions/info_messages.sh +++ b/lgsm/functions/info_messages.sh @@ -397,7 +397,7 @@ fn_info_message_script(){ # LinuxGSM version: v19.9.0 # glibc required: 2.15 # Discord alert: off - # Slack alert: off + # Slack alert: off # Email alert: off # Pushbullet alert: off # IFTTT alert: off @@ -811,6 +811,15 @@ fn_info_message_minecraft(){ } | column -s $'\t' -t } +fn_info_message_mohaa(){ + echo -e "netstat -atunp | grep mohaa_lnxded" + echo -e "" + { + echo -e "DESCRIPTION\tDIRECTION\tPORT\tPROTOCOL" + echo -e "> Game\tINBOUND\t${port}\tudp" + } | column -s $'\t' -t +} + fn_info_message_mumble(){ echo -e "netstat -atunp | grep murmur" echo -e "" @@ -1363,6 +1372,8 @@ fn_info_message_select_engine(){ fn_info_message_towerunite elif [ "${shortname}" == "unt" ]; then fn_info_message_unturned + elif [ "${shortname}" == "mohaa" ]; then + fn_info_message_mohaa elif [ "${shortname}" == "mh" ]; then fn_info_message_mordhau elif [ "${shortname}" == "mta" ]; then diff --git a/lgsm/functions/info_parms.sh b/lgsm/functions/info_parms.sh index fe68fb9c2..bcc5a0d9d 100644 --- a/lgsm/functions/info_parms.sh +++ b/lgsm/functions/info_parms.sh @@ -83,6 +83,12 @@ fn_info_parms_mordhau(){ beaconport=${beaconport:-"0"} } +fn_info_parms_mohaa(){ + port=${port:-"0"} + queryport=${port:-"0"} + defaultmap=${defaultmap:-"NOT SET"} +} + fn_info_parms_projectzomboid(){ adminpassword=${adminpassword:-"NOT SET"} } @@ -235,6 +241,8 @@ elif [ "${shortname}" == "inss" ]; then fn_info_parms_inss elif [ "${shortname}" == "kf2" ]; then fn_info_parms_kf2 +elif [ "${shortname}" == "mohaa" ]; then + fn_info_parms_mohaa # Project Zomboid elif [ "${shortname}" == "pz" ]; then fn_info_parms_projectzomboid diff --git a/lgsm/functions/install_config.sh b/lgsm/functions/install_config.sh index 0a9c9de52..69f9b4b6f 100644 --- a/lgsm/functions/install_config.sh +++ b/lgsm/functions/install_config.sh @@ -440,6 +440,12 @@ elif [ "${shortname}" == "mc" ]; then fn_fetch_default_config fn_default_config_remote fn_set_config_vars +elif [ "${shortname}" == "mohaa" ]; then + gamedirname="MedalOfHonorAlliedAssault" + array_configs+=( server.cfg ) + fn_fetch_default_config + fn_default_config_remote + fn_set_config_vars elif [ "${shortname}" == "mh" ]; then gamedirname="Mordhau" fn_check_cfgdir diff --git a/lgsm/functions/install_server_files.sh b/lgsm/functions/install_server_files.sh index 9b9343a66..b608e825f 100644 --- a/lgsm/functions/install_server_files.sh +++ b/lgsm/functions/install_server_files.sh @@ -29,6 +29,8 @@ fn_install_server_files(){ remote_fileurl="https://files.linuxgsm.com/WolfensteinEnemyTerritory/etlegacy-v2.75-i386-et-260b.tar.bz2"; local_filedir="${tmpdir}"; local_filename="etlegacy-v2.75-i386-et-260b.tar.bz2"; chmodx="nochmodx" run="norun"; force="noforce"; md5="92d7d4c26e0a295daed78cef623eeabb" elif [ "${shortname}" == "ges" ]; then remote_fileurl="https://files.linuxgsm.com/GoldenEyeSource/GoldenEye_Source_v5.0.6_full_server.tar.bz2"; local_filedir="${tmpdir}"; local_filename="GoldenEye_Source_v5.0.6_full_server.tar.bz2"; chmodx="nochmodx" run="norun"; force="noforce"; md5="c45c16293096706e8b5e2cd64a6f2931" + elif [ "${shortname}" == "mohaa" ]; then + remote_fileurl="https://files.linuxgsm.com/MedalofHonorAlliedAssault/moh_revival_v1.12_RC3.5.1.tar.bz2"; local_filedir="${tmpdir}"; local_filename="moh_revival_v1.12_RC3.5.1.tar.bz2"; chmodx="nochmodx" run="norun"; force="noforce"; md5="9d5924486a0cf5e46dd063216aad05c1" elif [ "${shortname}" == "ns" ]; then remote_fileurl="https://files.linuxgsm.com/NaturalSelection/ns_dedicated_server_v32.tar.bz2"; local_filedir="${tmpdir}"; local_filename="ns_dedicated_server_v32.tar.bz2"; chmodx="nochmodx" run="norun"; force="noforce"; md5="499cf63324b76925ada6baf5f2eacd67" elif [ "${shortname}" == "q2" ]; then From 7059d9a6cfe4f45e85533508784750bc88031ce2 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Mon, 14 Oct 2019 00:37:43 +0100 Subject: [PATCH 181/534] feat(linuxgsm): various ui improvements (#2554) * added column to debug * added colour to header * colourised LinuxGSM header text * updated donate message * ascii logo * warn colour and altered header --- .../config-lgsm/hwserver/_default.cfg | 2 +- .../config-lgsm/qlserver/_default.cfg | 2 +- .../config-lgsm/sdtdserver/_default.cfg | 2 +- lgsm/functions/alert.sh | 16 +- lgsm/functions/check_config.sh | 6 +- lgsm/functions/check_deps.sh | 70 +- lgsm/functions/check_executable.sh | 2 +- lgsm/functions/check_permissions.sh | 8 +- lgsm/functions/check_steamcmd.sh | 2 +- lgsm/functions/check_tmuxception.sh | 8 +- lgsm/functions/command_backup.sh | 14 +- lgsm/functions/command_console.sh | 4 +- lgsm/functions/command_debug.sh | 48 +- lgsm/functions/command_dev_clear_functions.sh | 8 +- lgsm/functions/command_dev_detect_deps.sh | 146 ++-- lgsm/functions/command_dev_detect_glibc.sh | 44 +- lgsm/functions/command_dev_detect_ldd.sh | 34 +- lgsm/functions/command_dev_query_raw.sh | 70 +- lgsm/functions/command_donate.sh | 11 +- lgsm/functions/command_fastdl.sh | 34 +- .../command_install_resources_mta.sh | 8 +- lgsm/functions/command_mods_install.sh | 22 +- lgsm/functions/command_mods_remove.sh | 12 +- lgsm/functions/command_mods_update.sh | 12 +- lgsm/functions/command_monitor.sh | 2 +- lgsm/functions/command_postdetails.sh | 7 +- lgsm/functions/command_start.sh | 52 +- lgsm/functions/command_ts3_server_pass.sh | 4 +- lgsm/functions/command_validate.sh | 2 +- lgsm/functions/command_wipe.sh | 2 +- lgsm/functions/compress_unreal2_maps.sh | 14 +- lgsm/functions/compress_ut99_maps.sh | 14 +- lgsm/functions/core_dl.sh | 16 +- lgsm/functions/core_exit.sh | 4 +- lgsm/functions/core_getopt.sh | 16 +- lgsm/functions/core_messages.sh | 61 +- lgsm/functions/core_trap.sh | 2 +- lgsm/functions/fix.sh | 6 +- lgsm/functions/fix_kf.sh | 12 +- lgsm/functions/fix_ro.sh | 14 +- lgsm/functions/fix_ut.sh | 2 +- lgsm/functions/fix_ut2k4.sh | 12 +- lgsm/functions/info_distro.sh | 4 +- lgsm/functions/info_messages.sh | 140 ++-- lgsm/functions/install_complete.sh | 14 +- lgsm/functions/install_config.sh | 36 +- lgsm/functions/install_dst_token.sh | 28 +- lgsm/functions/install_eula.sh | 24 +- lgsm/functions/install_factorio_save.sh | 6 +- lgsm/functions/install_gslt.sh | 24 +- lgsm/functions/install_header.sh | 18 +- lgsm/functions/install_logs.sh | 6 +- lgsm/functions/install_mta_resources.sh | 4 +- lgsm/functions/install_server_dir.sh | 8 +- lgsm/functions/install_server_files.sh | 12 +- lgsm/functions/install_squad_license.sh | 18 +- lgsm/functions/install_steamcmd.sh | 6 +- lgsm/functions/install_ts3db.sh | 34 +- lgsm/functions/install_ut2k4_key.sh | 24 +- lgsm/functions/mods_core.sh | 28 +- lgsm/functions/mods_list.sh | 2 +- lgsm/functions/query_gamedig.sh | 20 +- lgsm/functions/update_factorio.sh | 4 +- lgsm/functions/update_minecraft.sh | 4 +- lgsm/functions/update_mta.sh | 4 +- lgsm/functions/update_mumble.sh | 4 +- lgsm/functions/update_steamcmd.sh | 4 +- lgsm/functions/update_ts3.sh | 4 +- linuxgsm.sh | 44 +- tests/tests_fctrserver.sh | 608 +++++++------- tests/tests_jc2server.sh | 746 +++++++++--------- tests/tests_mcserver.sh | 664 ++++++++-------- tests/tests_shellcheck.sh | 42 +- tests/tests_ts3server.sh | 608 +++++++------- 74 files changed, 2031 insertions(+), 1988 deletions(-) diff --git a/lgsm/config-default/config-lgsm/hwserver/_default.cfg b/lgsm/config-default/config-lgsm/hwserver/_default.cfg index 3deea0f22..3f724ae5d 100644 --- a/lgsm/config-default/config-lgsm/hwserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/hwserver/_default.cfg @@ -145,7 +145,7 @@ glibc="2.15" ## Server Specific Directories systemdir="${serverfiles}" executabledir="${serverfiles}" -executable=$([ "$(uname -m)" == "x86_64" ] && echo "./Hurtworld.x86_64" || echo "./Hurtworld.x86") +executable=$([ "$(uname -m)" == "x86_64" ] && echo -e "./Hurtworld.x86_64" || echo -e "./Hurtworld.x86") ## Backup Directory backupdir="${lgsmdir}/backup" diff --git a/lgsm/config-default/config-lgsm/qlserver/_default.cfg b/lgsm/config-default/config-lgsm/qlserver/_default.cfg index b55cbd227..6dc89cb90 100644 --- a/lgsm/config-default/config-lgsm/qlserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/qlserver/_default.cfg @@ -128,7 +128,7 @@ glibc="2.15" ## Server Specific Directories systemdir="${serverfiles}" executabledir="${serverfiles}" -executable=$([ "$(uname -m)" == "x86_64" ] && echo "./run_server_x64.sh" || echo "./run_server_x86.sh") +executable=$([ "$(uname -m)" == "x86_64" ] && echo -e "./run_server_x64.sh" || echo -e "./run_server_x86.sh") servercfg="${servicename}.cfg" servercfgdefault="server.cfg" servercfgdir="${serverfiles}/baseq3" diff --git a/lgsm/config-default/config-lgsm/sdtdserver/_default.cfg b/lgsm/config-default/config-lgsm/sdtdserver/_default.cfg index c9271524f..9e4c6ed9a 100644 --- a/lgsm/config-default/config-lgsm/sdtdserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/sdtdserver/_default.cfg @@ -129,7 +129,7 @@ glibc="2.15" ## Server Specific Directories systemdir="${serverfiles}" executabledir="${serverfiles}" -executable=$([ "$(uname -m)" == "x86_64" ] && echo "./7DaysToDieServer.x86_64" || echo "./7DaysToDieServer.x86") +executable=$([ "$(uname -m)" == "x86_64" ] && echo -e "./7DaysToDieServer.x86_64" || echo -e "./7DaysToDieServer.x86") servercfgdefault="serverconfig.xml" servercfgdirdefault="${serverfiles}" servercfgfullpathdefault="${servercfgdirdefault}/${servercfgdefault}" diff --git a/lgsm/functions/alert.sh b/lgsm/functions/alert.sh index e5f0e9c0c..8de6b370e 100644 --- a/lgsm/functions/alert.sh +++ b/lgsm/functions/alert.sh @@ -118,7 +118,7 @@ elif [ "${discordalert}" != "on" ]&&[ "${function_selfname}" == "command_test_al fn_script_log_warn "Discord alerts not enabled" elif [ -z "${discordtoken}" ]&&[ "${function_selfname}" == "command_test_alert.sh" ]; then fn_print_error_nl "Discord token not set" - echo " * https://docs.linuxgsm.com/alerts/discord" + echo -e " * https://docs.linuxgsm.com/alerts/discord" fn_script_error "Discord token not set" fi @@ -139,7 +139,7 @@ elif [ "${iftttalert}" != "on" ]&&[ "${function_selfname}" == "command_test_aler fn_script_log_warn "IFTTT alerts not enabled" elif [ -z "${ifttttoken}" ]&&[ "${function_selfname}" == "command_test_alert.sh" ]; then fn_print_error_nl "IFTTT token not set" - echo " * https://docs.linuxgsm.com/alerts/ifttt" + echo -e " * https://docs.linuxgsm.com/alerts/ifttt" fn_script_error "IFTTT token not set" fi @@ -150,7 +150,7 @@ elif [ "${mailgunalert}" != "on" ]&&[ "${function_selfname}" == "command_test_al fn_script_log_warn "Mailgun alerts not enabled" elif [ -z "${mailguntoken}" ]&&[ "${function_selfname}" == "command_test_alert.sh" ]; then fn_print_error_nl "Mailgun token not set" - echo " * https://docs.linuxgsm.com/alerts/mailgun" + echo -e " * https://docs.linuxgsm.com/alerts/mailgun" fn_script_error "Mailgun token not set" fi @@ -161,7 +161,7 @@ elif [ "${pushbulletalert}" != "on" ]&&[ "${function_selfname}" == "command_test fn_script_log_warn "Pushbullet alerts not enabled" elif [ -z "${pushbullettoken}" ]&&[ "${function_selfname}" == "command_test_alert.sh" ]; then fn_print_error_nl "Pushbullet token not set" - echo " * https://docs.linuxgsm.com/alerts/pushbullet" + echo -e " * https://docs.linuxgsm.com/alerts/pushbullet" fn_script_error "Pushbullet token not set" fi @@ -172,7 +172,7 @@ elif [ "${pushoveralert}" != "on" ]&&[ "${function_selfname}" == "command_test_a fn_script_log_warn "Pushover alerts not enabled" elif [ -z "${pushovertoken}" ]&&[ "${function_selfname}" == "command_test_alert.sh" ]; then fn_print_error_nl "Pushover token not set" - echo " * https://docs.linuxgsm.com/alerts/pushover" + echo -e " * https://docs.linuxgsm.com/alerts/pushover" fn_script_error "Pushover token not set" fi @@ -183,11 +183,11 @@ elif [ "${telegramalert}" != "on" ]&&[ "${function_selfname}" == "command_test_a fn_script_log_warn "Telegram Messages not enabled" elif [ -z "${telegramtoken}" ]&&[ "${function_selfname}" == "command_test_alert.sh" ]; then fn_print_error_nl "Telegram token not set." - echo " * https://docs.linuxgsm.com/alerts/telegram" + echo -e " * https://docs.linuxgsm.com/alerts/telegram" fn_script_error "Telegram token not set." elif [ -z "${telegramchatid}" ]&&[ "${function_selfname}" == "command_test_alert.sh" ]; then fn_print_error_nl "Telegram chat id not set." - echo " * https://docs.linuxgsm.com/alerts/telegram" + echo -e " * https://docs.linuxgsm.com/alerts/telegram" fn_script_error "Telegram chat id not set." fi @@ -198,6 +198,6 @@ elif [ "${slackalert}" != "on" ]&&[ "${function_selfname}" == "command_test_aler fn_script_log_warn "Slack alerts not enabled" elif [ -z "${slacktoken}" ]&&[ "${function_selfname}" == "command_test_alert.sh" ]; then fn_print_error_nl "Slack token not set" - echo " * https://docs.linuxgsm.com/alerts/slack" + echo -e " * https://docs.linuxgsm.com/alerts/slack" fn_script_error "Slack token not set" fi \ No newline at end of file diff --git a/lgsm/functions/check_config.sh b/lgsm/functions/check_config.sh index 2f507808b..0b352070e 100644 --- a/lgsm/functions/check_config.sh +++ b/lgsm/functions/check_config.sh @@ -11,7 +11,7 @@ if [ ! -e "${servercfgfullpath}" ]; then if [ "${shortname}" != "hw" ]&&[ "${shortname}" != "ut3" ]&&[ "${shortname}" != "kf2" ]; then fn_print_dots "" fn_print_warn_nl "Configuration file missing!" - echo "${servercfgfullpath}" + echo -e "${servercfgfullpath}" fn_script_log_warn "Configuration file missing!" fn_script_log_warn "${servercfgfullpath}" install_config.sh @@ -22,14 +22,14 @@ if [ "${shortname}" == "rust" ]; then if [ -z "${rconpassword}" ]; then fn_print_dots "" fn_print_fail_nl "RCON password is not set!" - echo " * Not setting an RCON password causes issues with ${gamename}" + echo -e " * Not setting an RCON password causes issues with ${gamename}" fn_script_log_fatal "RCON password is not set" fn_script_log_fatal "Not setting an RCON password causes issues with ${gamename}" core_exit.sh elif [ "${rconpassword}" == "CHANGE_ME" ]; then fn_print_dots "" fn_print_warn_nl "Default RCON Password detected!" - echo " * Having ${rconpassword} as a password is not very safe." + echo -e " * Having ${rconpassword} as a password is not very safe." fn_script_log_warn "Default RCON Password detected" fi fi diff --git a/lgsm/functions/check_deps.sh b/lgsm/functions/check_deps.sh index 510bff36d..a1fad7f4d 100644 --- a/lgsm/functions/check_deps.sh +++ b/lgsm/functions/check_deps.sh @@ -36,9 +36,9 @@ fn_install_mono_repo(){ eval ${cmd} else fn_print_warn_nl "Installing Mono repository" - echo "Mono auto install not available for ${distroname}" - echo " Follow instructions on mono site to install the latest version of Mono." - echo " https://www.mono-project.com/download/stable/#download-lin" + echo -e "Mono auto install not available for ${distroname}" + echo -e " Follow instructions on mono site to install the latest version of Mono." + echo -e " https://www.mono-project.com/download/stable/#download-lin" monoautoinstall="1" fi elif [ "${distroid}" == "debian" ]; then @@ -52,9 +52,9 @@ fn_install_mono_repo(){ cmd="sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys 3FA7E0328081BFF6A14DA29AA6A19B38D3D831EF;sudo apt install apt-transport-https;echo 'deb https://download.mono-project.com/repo/debian stable-jessie main' | sudo tee /etc/apt/sources.list.d/mono-official-stable.list;sudo apt update" eval ${cmd} else - echo "Mono auto install not available for ${distroname}" - echo " Follow instructions on mono site to install the latest version of Mono." - echo " https://www.mono-project.com/download/stable/#download-lin" + echo -e "Mono auto install not available for ${distroname}" + echo -e " Follow instructions on mono site to install the latest version of Mono." + echo -e " https://www.mono-project.com/download/stable/#download-lin" monoautoinstall="1" fi elif [ "${distroid}" == "centos" ]; then @@ -68,18 +68,18 @@ fn_install_mono_repo(){ cmd="rpm --import 'https://keyserver.ubuntu.com/pks/lookup?op=get&search=0x3FA7E0328081BFF6A14DA29AA6A19B38D3D831EF';su -c 'curl https://download.mono-project.com/repo/centos6-stable.repo | tee /etc/yum.repos.d/mono-centos6-stable.repo'" eval ${cmd} else - echo "Mono auto install not available for ${distroname}" - echo " Follow instructions on mono site to install the latest version of Mono." - echo " https://www.mono-project.com/download/stable/#download-lin" + echo -e "Mono auto install not available for ${distroname}" + echo -e " Follow instructions on mono site to install the latest version of Mono." + echo -e " https://www.mono-project.com/download/stable/#download-lin" monoautoinstall="1" fi elif [ "${distroid}" == "fedora" ]; then cmd="rpm --import 'https://keyserver.ubuntu.com/pks/lookup?op=get&search=0x3FA7E0328081BFF6A14DA29AA6A19B38D3D831EF'; su -c 'curl https://download.mono-project.com/repo/centos7-stable.repo | tee /etc/yum.repos.d/mono-centos7-stable.repo'; dnf update" eval ${cmd} else - echo "Mono auto install not available for ${distroname}" - echo " Follow instructions on mono site to install the latest version of Mono." - echo " https://www.mono-project.com/download/stable/#download-lin" + echo -e "Mono auto install not available for ${distroname}" + echo -e " Follow instructions on mono site to install the latest version of Mono." + echo -e " https://www.mono-project.com/download/stable/#download-lin" monoautoinstall="1" fi if [ "${monoautoinstall}" != "1" ];then @@ -95,11 +95,11 @@ fn_install_mono_repo(){ fi else fn_print_information_nl "Installing Mono repository" - echo "" + echo -e "" fn_print_warning_nl "$(whoami) does not have sudo access. Manually install Mono repository." fn_script_log_warn "$(whoami) does not have sudo access. Manually install Mono repository." - echo " Follow instructions on mono site to install the latest version of Mono." - echo " https://www.mono-project.com/download/stable/#download-lin" + echo -e " Follow instructions on mono site to install the latest version of Mono." + echo -e " https://www.mono-project.com/download/stable/#download-lin" fi fi } @@ -134,8 +134,8 @@ fn_install_universe_repo(){ else fn_print_warning_nl "$(whoami) does not have sudo access. Manually add Universe repository." fn_script_log_warn "$(whoami) does not have sudo access. Manually add Universe repository." - echo " Please run the following command as a user with sudo access, and re-run the installation" - echo " sudo apt-add-repository universe" + echo -e " Please run the following command as a user with sudo access, and re-run the installation" + echo -e " sudo apt-add-repository universe" fi fi } @@ -238,7 +238,7 @@ fn_found_missing_deps(){ fi if [ -n "${jqstatus}" ]; then fn_print_warning_nl "jq is not available in the ${distroname} repository" - echo " * https://docs.linuxgsm.com/requirements/jq" + echo -e " * https://docs.linuxgsm.com/requirements/jq" fi if [ "${autoinstall}" == "1" ]; then sudo -n true > /dev/null 2>&1 @@ -268,18 +268,18 @@ fn_found_missing_deps(){ if [ $? != 0 ]; then fn_print_failure_nl "Unable to install dependencies" fn_script_log_fatal "Unable to install dependencies" - echo "" + echo -e "" fn_print_warning_nl "Manually install dependencies." fn_script_log_warn "Manually install dependencies." if [ -n "$(command -v dpkg-query 2>/dev/null)" ]; then - echo " sudo dpkg --add-architecture i386; sudo apt update; sudo apt install ${array_deps_missing[@]}" + echo -e " sudo dpkg --add-architecture i386; sudo apt update; sudo apt install ${array_deps_missing[@]}" elif [ -n "$(command -v dnf 2>/dev/null)" ]; then - echo " sudo dnf install ${array_deps_missing[@]}" + echo -e " sudo dnf install ${array_deps_missing[@]}" elif [ -n "$(command -v yum 2>/dev/null)" ]; then - echo " sudo yum install ${array_deps_missing[@]}" + echo -e " sudo yum install ${array_deps_missing[@]}" fi if [ "${steamcmdfail}" ]; then - echo "" + echo -e "" fn_print_failure_nl "Missing dependencies required to run SteamCMD." fn_script_log_fatal "Missing dependencies required to run SteamCMD." core_exit.sh @@ -289,23 +289,23 @@ fn_found_missing_deps(){ fn_script_log_pass "Install dependencies completed" fi else - echo "" + echo -e "" 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 2>/dev/null)" ]; then - echo " sudo dpkg --add-architecture i386; sudo apt update; sudo apt install ${array_deps_missing[@]}" + echo -e " sudo dpkg --add-architecture i386; sudo apt update; sudo apt install ${array_deps_missing[@]}" elif [ -n "$(command -v dnf 2>/dev/null)" ]; then - echo " sudo dnf install ${array_deps_missing[@]}" + echo -e " sudo dnf install ${array_deps_missing[@]}" elif [ -n "$(command -v yum 2>/dev/null)" ]; then - echo " sudo yum install ${array_deps_missing[@]}" + echo -e " sudo yum install ${array_deps_missing[@]}" fi if [ "${steamcmdfail}" ]; then - echo "" + echo -e "" fn_print_failure_nl "Missing dependencies required to run SteamCMD." fn_script_log_fatal "Missing dependencies required to run SteamCMD." core_exit.sh fi - echo "" + echo -e "" fi if [ "${function_selfname}" == "command_install.sh" ]; then sleep 5 @@ -562,16 +562,16 @@ fn_deps_build_redhat(){ if [ "${function_selfname}" == "command_install.sh" ]; then if [ "$(whoami)" == "root" ]; then - echo "" - echo "Checking Dependencies as root" - echo "=================================" + echo -e "" + echo -e "${lightyellow}Checking Dependencies as root${default}" + echo -e "=================================" fn_print_information_nl "Checking any missing dependencies for ${gamename} server only." fn_print_information_nl "This will NOT install a ${gamename} server." fn_sleep_time else - echo "" - echo "Checking Dependencies" - echo "=================================" + echo -e "" + echo -e "${lightyellow}Checking Dependencies${default}" + echo -e "=================================" fi fi diff --git a/lgsm/functions/check_executable.sh b/lgsm/functions/check_executable.sh index f0f0a67b7..918043555 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_print_fail_nl "executable was not found" - echo "* ${executabledir}/${execname}" + echo -e "* ${executabledir}/${execname}" if [ -d "${lgsmlogdir}" ]; then fn_script_log_fatal "Executable was not found: ${executabledir}/${execname}" fi diff --git a/lgsm/functions/check_permissions.sh b/lgsm/functions/check_permissions.sh index aa7bb3de2..cb0cc9d5c 100644 --- a/lgsm/functions/check_permissions.sh +++ b/lgsm/functions/check_permissions.sh @@ -41,7 +41,7 @@ fn_check_ownership(){ fi } | column -s $'\t' -t | tee -a "${lgsmlog}" - echo "" + echo -e "" fn_print_information_nl "please see https://docs.linuxgsm.com/support/faq#fail-starting-game-server-permission-issues-found" fn_script_log "For more information, please see https://docs.linuxgsm.com/support/faq#fail-starting-game-server-permission-issues-found" if [ "${monitorflag}" == 1 ]; then @@ -164,12 +164,12 @@ fn_sys_perm_errors_detect(){ # Display a message on how to fix the issue manually. fn_sys_perm_fix_manually_msg(){ - echo "" + echo -e "" 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:" + echo -e " * 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" + echo -e " chmod a+rx /sys /sys/class /sys/class/net" fn_script_log "chmod a+rx /sys /sys/class /sys/class/net" fn_sleep_time if [ "${monitorflag}" == 1 ]; then diff --git a/lgsm/functions/check_steamcmd.sh b/lgsm/functions/check_steamcmd.sh index 2972ae71d..3f6cd90de 100644 --- a/lgsm/functions/check_steamcmd.sh +++ b/lgsm/functions/check_steamcmd.sh @@ -23,7 +23,7 @@ fn_check_steamcmd_user(){ else fn_print_fail_nl "Steam login not set. Update steamuser in ${configdirserver}" fi - echo " * Change steamuser=\"username\" to a valid steam login." + echo -e " * Change steamuser=\"username\" to a valid steam login." if [ -d "${lgsmlogdir}" ]; then if [ "${legacymode}" == "1" ]; then fn_script_log_fatal "Steam login not set. Update steamuser in ${selfname}" diff --git a/lgsm/functions/check_tmuxception.sh b/lgsm/functions/check_tmuxception.sh index 1a13bef9c..7e83cf844 100644 --- a/lgsm/functions/check_tmuxception.sh +++ b/lgsm/functions/check_tmuxception.sh @@ -12,8 +12,8 @@ fn_check_is_in_tmux(){ 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." - echo "It is not possible to run a tmux session inside another tmux session" - echo "https://docs.linuxgsm.com/requirements/tmux#tmuxception" + echo -e "It is not possible to run a tmux session inside another tmux session" + echo -e "https://docs.linuxgsm.com/requirements/tmux#tmuxception" core_exit.sh fi } @@ -23,8 +23,8 @@ fn_check_is_in_screen(){ 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." - echo "It is not possible to run a tmux session inside screen session" - echo "https://docs.linuxgsm.com/requirements/tmux#tmuxception" + echo -e "It is not possible to run a tmux session inside screen session" + echo -e "https://docs.linuxgsm.com/requirements/tmux#tmuxception" core_exit.sh fi } diff --git a/lgsm/functions/command_backup.sh b/lgsm/functions/command_backup.sh index 3a758886c..91f856809 100644 --- a/lgsm/functions/command_backup.sh +++ b/lgsm/functions/command_backup.sh @@ -13,7 +13,7 @@ check.sh # Trap to remove lockfile on quit. fn_backup_trap(){ - echo "" + echo -e "" echo -en "backup ${backupname}.tar.gz..." fn_print_canceled_eol_nl fn_script_log_info "Backup ${backupname}.tar.gz: CANCELED" @@ -54,7 +54,7 @@ fn_backup_init(){ else daysago="${lastbackupdaysago} days ago" fi - echo " * Previous backup was created ${daysago}, total size ${lastbackupsize}" + echo -e " * Previous backup was created ${daysago}, total size ${lastbackupsize}" fi } @@ -68,7 +68,7 @@ fn_backup_stop_server(){ elif [ "${stoponbackup}" == "off" ]; then serverstopped="no" fn_print_warn_nl "${servicename} is currently running" - echo " * Although unlikely; creating a backup while ${servicename} is running might corrupt the backup." + echo -e " * Although unlikely; creating a backup while ${servicename} is running might corrupt the backup." fn_script_log_warn "${servicename} is currently running" fn_script_log_warn "Although unlikely; creating a backup while ${servicename} is running might corrupt the backup" # Server is running and will be stopped if stoponbackup=on or unset. @@ -144,7 +144,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 "${lgsmlog}" + echo -e "${tarcmd}" | tee -a "${lgsmlog}" fn_print_fail_nl "Starting backup" fn_script_log_fatal "Starting backup" else @@ -174,7 +174,7 @@ fn_backup_prune(){ # If maxbackups greater or equal to backupsoutdatedcount, then it is over maxbackupdays. if [ "${backupquotadiff}" -ge "${backupsoudatedcount}" ]; then # Display how many backups will be cleared. - echo " * Pruning: ${backupquotadiff} backup(s) has exceeded the ${maxbackups} backups limit" + echo -e " * Pruning: ${backupquotadiff} backup(s) has exceeded the ${maxbackups} backups limit" fn_script_log_info "Pruning: ${backupquotadiff} backup(s) has exceeded the ${maxbackups} backups limit" fn_sleep_time fn_print_dots "Pruning: Clearing ${backupquotadiff} backup(s)" @@ -186,7 +186,7 @@ fn_backup_prune(){ # If maxbackupdays is used over maxbackups. elif [ "${backupquotadiff}" -lt "${backupsoudatedcount}" ]; then # Display how many backups will be cleared. - echo " * Pruning: ${backupsoudatedcount} backup(s) are older than ${maxbackupdays} days." + echo -e " * Pruning: ${backupsoudatedcount} backup(s) are older than ${maxbackupdays} days." fn_script_log_info "Pruning: ${backupsoudatedcount} backup(s) older than ${maxbackupdays} days." fn_sleep_time fn_print_dots "Pruning: Clearing ${backupquotadiff} backup(s)." @@ -243,7 +243,7 @@ fn_backup_relpath() { # traverse down, just add a newline. Otherwise at this point, there is # one remaining directory component in the backupdir to navigate. if (( "$base" < "${#bdirtoks[@]}" )) ; then - echo "${bdirtoks[ $(( ${#bdirtoks[@]} - 1)) ]}" + echo -e "${bdirtoks[ $(( ${#bdirtoks[@]} - 1)) ]}" else echo fi diff --git a/lgsm/functions/command_console.sh b/lgsm/functions/command_console.sh index 26f0a4707..f428ce56e 100644 --- a/lgsm/functions/command_console.sh +++ b/lgsm/functions/command_console.sh @@ -16,8 +16,8 @@ if [ "${shortname}" == "rust" ]||[ "${shortname}" == "hw" ]||[ "${shortname}" == 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://docs.linuxgsm.com/commands/console" -echo "" +echo -e " * https://docs.linuxgsm.com/commands/console" +echo -e "" if ! fn_prompt_yn "Continue?" Y; then echo Exiting; return fi diff --git a/lgsm/functions/command_debug.sh b/lgsm/functions/command_debug.sh index b06f05263..9422bbad7 100644 --- a/lgsm/functions/command_debug.sh +++ b/lgsm/functions/command_debug.sh @@ -26,65 +26,65 @@ info_config.sh # NOTE: Check if works with server without parms. Could be intergrated in to info_parms.sh. fn_parms fn_print_header -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}Avg Load:\t${default}${load}" -echo -e "${blue}Free Memory:\t${default}${physmemfree}" -echo -e "${blue}Free Disk:\t${default}${availspace}" - +{ + echo -e "${lightblue}Distro:\t\t${default}${distroname}" + echo -e "${lightblue}Arch:\t\t${default}${arch}" + echo -e "${lightblue}Kernel:\t\t${default}${kernel}" + echo -e "${lightblue}Hostname:\t\t${default}${HOSTNAME}" + echo -e "${lightblue}tmux:\t\t${default}${tmuxv}" + echo -e "${lightblue}Avg Load:\t\t${default}${load}" + echo -e "${lightblue}Free Memory:\t\t${default}${physmemfree}" + echo -e "${lightblue}Free Disk:\t\t${default}${availspace}" +} | column -s $'\t' -t # glibc required. if [ -n "${glibc}" ]; then if [ "${glibc}" == "null" ]; then # Glibc is not required. : elif [ -z "${glibc}" ]; then - echo -e "${blue}glibc required:\t${red}UNKNOWN${default}" + echo -e "${lightblue}glibc required:\t${red}UNKNOWN${default}" elif [ "$(printf '%s\n'${glibc}'\n' ${glibcversion} | sort -V | head -n 1)" != "${glibc}" ]; then - echo -e "${blue}glibc required:\t${red}${glibc} ${default}(${red}distro glibc ${glibcversion} too old${default})" + echo -e "${lightblue}glibc required:\t${red}${glibc} ${default}(${red}distro glibc ${glibcversion} too old${default})" else - echo -e "${blue}glibc required:\t${green}${glibc}${default}" + echo -e "${lightblue}glibc required:\t${green}${glibc}${default}" fi fi # Server IP if [ "${multiple_ip}" == "1" ]; then - echo -e "${blue}Server IP:\t${default}NOT SET" + echo -e "${lightblue}Server IP:\t${default}NOT SET" else - echo -e "${blue}Server IP:\t${default}${ip}:${port}" + echo -e "${lightblue}Server IP:\t${default}${ip}:${port}" fi # External server IP. if [ -n "${extip}" ]; then if [ "${ip}" != "${extip}" ]; then - echo -e "${blue}Internet IP:\t${default}${extip}:${port}" + echo -e "${lightblue}Internet IP:\t${default}${extip}:${port}" fi fi # Listed on Master Server. if [ "${displaymasterserver}" ];then if [ "${displaymasterserver}" == "true" ];then - echo -e "${blue}Master Server:\t${green}${displaymasterserver}${default}" + echo -e "${lightblue}Master Server:\t${green}${displaymasterserver}${default}" else - echo -e "${blue}Master Server:\t${red}${displaymasterserver}${default}" + echo -e "${lightblue}Master Server:\t${red}${displaymasterserver}${default}" fi fi # Server password. if [ -n "${serverpassword}" ]; then - echo -e "${blue}Server password:\t${default}${serverpassword}" + echo -e "${lightblue}Server password:\t${default}${serverpassword}" fi -echo "" -echo "Start parameters:" +echo -e "${lightblue}Start parameters:${default}" if [ "${engine}" == "source" ]||[ "${engine}" == "goldsource" ]; then - echo "${executable} ${parms} -debug" + echo -e "${executable} ${parms} -debug" else - echo "${executable} ${parms}" + echo -e "${executable} ${parms}" fi -echo "" +echo -e "" 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 "" +echo -e "" if ! fn_prompt_yn "Continue?" Y; then echo Exiting; return fi diff --git a/lgsm/functions/command_dev_clear_functions.sh b/lgsm/functions/command_dev_clear_functions.sh index 5c698f05f..95f54e842 100644 --- a/lgsm/functions/command_dev_clear_functions.sh +++ b/lgsm/functions/command_dev_clear_functions.sh @@ -4,10 +4,10 @@ # Website: https://linuxgsm.com # Description: Deletes the contents of the functions dir. -echo "=================================" -echo "Clear Functions" -echo "=================================" -echo "" +echo -e "=================================" +echo -e "Clear Functions" +echo -e "=================================" +echo -e "" if fn_prompt_yn "Do you want to delete all functions?" Y; then rm -rfv "${functionsdir:?}/"* rm -rfv "${configdirdefault:?}/"* diff --git a/lgsm/functions/command_dev_detect_deps.sh b/lgsm/functions/command_dev_detect_deps.sh index 15bd4aff8..c3b29872e 100644 --- a/lgsm/functions/command_dev_detect_deps.sh +++ b/lgsm/functions/command_dev_detect_deps.sh @@ -8,17 +8,17 @@ local commandname="DETECT-DEPS" local commandaction="Detect-Deps" local function_selfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" -echo "=================================" -echo "Dependencies Checker" -echo "=================================" -echo "Checking directory: " -echo "${serverfiles}" +echo -e "=================================" +echo -e "Dependencies Checker" +echo -e "=================================" +echo -e "Checking directory: " +echo -e "${serverfiles}" if [ "$(command -v eu-readelf 2>/dev/null)" ]; then readelf=eu-readelf elif [ "$(command -v readelf 2>/dev/null)" ]; then readelf=readelf else - echo "readelf/eu-readelf not installed" + echo -e "readelf/eu-readelf not installed" fi files=$(find "${serverfiles}" | wc -l) find "${serverfiles}" -type f -print0 | @@ -35,14 +35,14 @@ done sort "${tmpdir}/.depdetect_readelf" |uniq >"${tmpdir}/.depdetect_readelf_uniq" while read -r lib; do - echo "${lib}" + echo -e "${lib}" local libs_array=( libm.so.6 libc.so.6 libtcmalloc_minimal.so.4 libpthread.so.0 libdl.so.2 libnsl.so.1 libgcc_s.so.1 librt.so.1 ld-linux.so.2 libdbus-glib-1.so.2 libgio-2.0.so.0 libglib-2.0.so.0 libGL.so.1 libgobject-2.0.so.0 libnm-glib.so.4 libnm-util.so.2 ) for lib_file in "${libs_array[@]}" do if [ "${lib}" == "${lib_file}" ]; then - echo "glibc.i686" >> "${tmpdir}/.depdetect_centos_list" - echo "lib32gcc1" >> "${tmpdir}/.depdetect_ubuntu_list" - echo "lib32gcc1" >> "${tmpdir}/.depdetect_debian_list" + echo -e "glibc.i686" >> "${tmpdir}/.depdetect_centos_list" + echo -e "lib32gcc1" >> "${tmpdir}/.depdetect_ubuntu_list" + echo -e "lib32gcc1" >> "${tmpdir}/.depdetect_debian_list" libdetected=1 fi done @@ -51,9 +51,9 @@ while read -r lib; do for lib_file in "${libs_array[@]}" do if [ "${lib}" == "${lib_file}" ]; then - echo "java-1.8.0-openjdk" >> "${tmpdir}/.depdetect_centos_list" - echo "default-jre" >> "${tmpdir}/.depdetect_ubuntu_list" - echo "default-jre" >> "${tmpdir}/.depdetect_debian_list" + echo -e "java-1.8.0-openjdk" >> "${tmpdir}/.depdetect_centos_list" + echo -e "default-jre" >> "${tmpdir}/.depdetect_ubuntu_list" + echo -e "default-jre" >> "${tmpdir}/.depdetect_debian_list" libdetected=1 fi done @@ -68,71 +68,71 @@ while read -r lib; do done if [ "${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" + echo -e "libstdc++.i686" >> "${tmpdir}/.depdetect_centos_list" + echo -e "libstdc++6:i386" >> "${tmpdir}/.depdetect_ubuntu_list" + echo -e "libstdc++6:i386" >> "${tmpdir}/.depdetect_debian_list" libdetected=1 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" + echo -e "compat-libstdc++-33.i686" >> "${tmpdir}/.depdetect_centos_list" + echo -e "libstdc++5:i386" >> "${tmpdir}/.depdetect_ubuntu_list" + echo -e "libstdc++5:i386" >> "${tmpdir}/.depdetect_debian_list" libdetected=1 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" + echo -e "libcurl.i686" >> "${tmpdir}/.depdetect_centos_list" + echo -e "libcurl4-gnutls-dev:i386" >> "${tmpdir}/.depdetect_ubuntu_list" + echo -e "libcurl4-gnutls-dev:i386" >> "${tmpdir}/.depdetect_debian_list" libdetected=1 elif [ "${lib}" == "libspeex.so.1" ]||[ "${lib}" == "libspeexdsp.so.1" ]; then - echo "speex.i686" >> "${tmpdir}/.depdetect_centos_list" - echo "speex:i386" >> "${tmpdir}/.depdetect_ubuntu_list" - echo "speex:i386" >> "${tmpdir}/.depdetect_debian_list" + echo -e "speex.i686" >> "${tmpdir}/.depdetect_centos_list" + echo -e "speex:i386" >> "${tmpdir}/.depdetect_ubuntu_list" + echo -e "speex:i386" >> "${tmpdir}/.depdetect_debian_list" libdetected=1 elif [ "${lib}" == "./libSDL-1.2.so.0" ]||[ "${lib}" == "libSDL-1.2.so.0" ]; then - echo "SDL.i686" >> "${tmpdir}/.depdetect_centos_list" - echo "libsdl1.2debian" >> "${tmpdir}/.depdetect_ubuntu_list" - echo "libsdl1.2debian" >> "${tmpdir}/.depdetect_debian_list" + echo -e "SDL.i686" >> "${tmpdir}/.depdetect_centos_list" + echo -e "libsdl1.2debian" >> "${tmpdir}/.depdetect_ubuntu_list" + echo -e "libsdl1.2debian" >> "${tmpdir}/.depdetect_debian_list" libdetected=1 elif [ "${lib}" == "libtbb.so.2" ]; then - echo "tbb.i686" >> "${tmpdir}/.depdetect_centos_list" - echo "libtbb2" >> "${tmpdir}/.depdetect_ubuntu_list" - echo "libtbb2" >> "${tmpdir}/.depdetect_debian_list" + echo -e "tbb.i686" >> "${tmpdir}/.depdetect_centos_list" + echo -e "libtbb2" >> "${tmpdir}/.depdetect_ubuntu_list" + echo -e "libtbb2" >> "${tmpdir}/.depdetect_debian_list" libdetected=1 elif [ "${lib}" == "libXrandr.so.2" ]; then - echo "libXrandr" >> "${tmpdir}/.depdetect_centos_list" - echo "libxrandr2" >> "${tmpdir}/.depdetect_ubuntu_list" - echo "libxrandr2" >> "${tmpdir}/.depdetect_debian_list" + echo -e "libXrandr" >> "${tmpdir}/.depdetect_centos_list" + echo -e "libxrandr2" >> "${tmpdir}/.depdetect_ubuntu_list" + echo -e "libxrandr2" >> "${tmpdir}/.depdetect_debian_list" libdetected=1 elif [ "${lib}" == "libXext.so.6" ]; then - echo "libXext" >> "${tmpdir}/.depdetect_centos_list" - echo "libxext6" >> "${tmpdir}/.depdetect_ubuntu_list" - echo "libxext6" >> "${tmpdir}/.depdetect_debian_list" + echo -e "libXext" >> "${tmpdir}/.depdetect_centos_list" + echo -e "libxext6" >> "${tmpdir}/.depdetect_ubuntu_list" + echo -e "libxext6" >> "${tmpdir}/.depdetect_debian_list" libdetected=1 elif [ "${lib}" == "libXtst.so.6" ]; then - echo "libXtst" >> "${tmpdir}/.depdetect_centos_list" - echo "libxtst6" >> "${tmpdir}/.depdetect_ubuntu_list" - echo "libxtst6" >> "${tmpdir}/.depdetect_debian_list" + echo -e "libXtst" >> "${tmpdir}/.depdetect_centos_list" + echo -e "libxtst6" >> "${tmpdir}/.depdetect_ubuntu_list" + echo -e "libxtst6" >> "${tmpdir}/.depdetect_debian_list" libdetected=1 elif [ "${lib}" == "libpulse.so.0" ]; then - echo "pulseaudio-libs" >> "${tmpdir}/.depdetect_centos_list" - echo "libpulse0" >> "${tmpdir}/.depdetect_ubuntu_list" - echo "libpulse0" >> "${tmpdir}/.depdetect_debian_list" + echo -e "pulseaudio-libs" >> "${tmpdir}/.depdetect_centos_list" + echo -e "libpulse0" >> "${tmpdir}/.depdetect_ubuntu_list" + echo -e "libpulse0" >> "${tmpdir}/.depdetect_debian_list" libdetected=1 elif [ "${lib}" == "libopenal.so.1" ]; then - echo "" >> "${tmpdir}/.depdetect_centos_list" - echo "libopenal1" >> "${tmpdir}/.depdetect_ubuntu_list" - echo "libopenal1" >> "${tmpdir}/.depdetect_debian_list" + echo -e "" >> "${tmpdir}/.depdetect_centos_list" + echo -e "libopenal1" >> "${tmpdir}/.depdetect_ubuntu_list" + echo -e "libopenal1" >> "${tmpdir}/.depdetect_debian_list" libdetected=1 elif [ "${lib}" == "libgconf-2.so.4" ]; then - echo "GConf2" >> "${tmpdir}/.depdetect_centos_list" - echo "libgconf2-4" >> "${tmpdir}/.depdetect_ubuntu_list" - echo "libgconf2-4" >> "${tmpdir}/.depdetect_debian_list" + echo -e "GConf2" >> "${tmpdir}/.depdetect_centos_list" + echo -e "libgconf2-4" >> "${tmpdir}/.depdetect_ubuntu_list" + echo -e "libgconf2-4" >> "${tmpdir}/.depdetect_debian_list" libdetected=1 fi if [ "${libdetected}" != "1" ]; then unknownlib=1 - echo "${lib}" >> "${tmpdir}/.depdetect_unknown" + echo -e "${lib}" >> "${tmpdir}/.depdetect_unknown" fi unset libdetected done < "${tmpdir}/.depdetect_readelf_uniq" @@ -147,35 +147,35 @@ 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" -echo "" -echo "" -echo "Required Dependencies" -echo "=================================" -echo "${executable}" -echo "" -echo "CentOS" -echo "=================================" +echo -e "" +echo -e "" +echo -e "Required Dependencies" +echo -e "=================================" +echo -e "${executable}" +echo -e "" +echo -e "CentOS" +echo -e "=================================" cat "${tmpdir}/.depdetect_centos_line" -echo "" -echo "" -echo "Ubuntu" -echo "=================================" +echo -e "" +echo -e "" +echo -e "Ubuntu" +echo -e "=================================" cat "${tmpdir}/.depdetect_ubuntu_line" -echo "" -echo "" -echo "Debian" -echo "=================================" +echo -e "" +echo -e "" +echo -e "Debian" +echo -e "=================================" cat "${tmpdir}/.depdetect_debian_line" -echo "" +echo -e "" if [ "${unknownlib}" == "1" ]; then - echo "" - echo "Unknown shared Library" - echo "=================================" + echo -e "" + echo -e "Unknown shared Library" + echo -e "=================================" cat "${tmpdir}/.depdetect_unknown" fi -echo "" -echo "Required Librarys" -echo "=================================" +echo -e "" +echo -e "Required Librarys" +echo -e "=================================" sort "${tmpdir}/.depdetect_readelf" | uniq echo -en "\n" rm -f "${tmpdir}/.depdetect_centos_line" diff --git a/lgsm/functions/command_dev_detect_glibc.sh b/lgsm/functions/command_dev_detect_glibc.sh index 7f0fc409c..f8b858dff 100644 --- a/lgsm/functions/command_dev_detect_glibc.sh +++ b/lgsm/functions/command_dev_detect_glibc.sh @@ -9,9 +9,9 @@ local commandname="DETECT-GLIBC" local commandaction="Detect-Glibc" local function_selfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" -echo "=================================" -echo "glibc Requirements Checker" -echo "=================================" +echo -e "=================================" +echo -e "glibc Requirements Checker" +echo -e "=================================" if [ -z "$(command -v objdump)" ]; then fn_print_failure_nl "objdump is missing" @@ -24,13 +24,13 @@ if [ -z "${serverfiles}" ]; then fi if [ -d "${serverfiles}" ]; then - echo "Checking directory: " - echo "${serverfiles}" + echo -e "Checking directory: " + echo -e "${serverfiles}" elif [ -f "${serverfiles}" ]; then - echo "Checking file: " - echo "${serverfiles}" + echo -e "Checking file: " + echo -e "${serverfiles}" fi -echo "" +echo -e "" local glibc_check_dir_array=( steamcmddir serverfiles ) @@ -50,25 +50,25 @@ do 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_${glibc_check_var}.tmp" + echo -e "${glibcversion}: ${line}" >>"${tmpdir}/detect_glibc_files_${glibc_check_var}.tmp" fi objdump -T "${line}" 2>/dev/null | grep -oP "GLIBC[^ ]+" >>"${tmpdir}/detect_glibc_${glibc_check_var}.tmp" echo -n "${i} / ${glibc_check_files}" $'\r' ((i++)) done - echo "" - echo "" - echo "${glibc_check_name} glibc Requirements" - echo "=================================" + echo -e "" + echo -e "" + echo -e "${glibc_check_name} glibc Requirements" + echo -e "=================================" if [ -f "${tmpdir}/detect_glibc_files_${glibc_check_var}.tmp" ]; then - echo "Required glibc" + echo -e "Required glibc" cat "${tmpdir}/detect_glibc_${glibc_check_var}.tmp" | sort | uniq | sort -r --version-sort | head -1 |tee -a "${tmpdir}/detect_glibc_highest.tmp" - echo "" - echo "Files requiring GLIBC" - echo "Highest verion required: filename" + echo -e "" + echo -e "Files requiring GLIBC" + echo -e "Highest verion required: filename" cat "${tmpdir}/detect_glibc_files_${glibc_check_var}.tmp" - echo "" - echo "All required GLIBC versions" + echo -e "" + echo -e "All required GLIBC versions" cat "${tmpdir}/detect_glibc_${glibc_check_var}.tmp" | sort | uniq | sort -r --version-sort rm "${tmpdir}/detect_glibc_${glibc_check_var}.tmp" rm "${tmpdir}/detect_glibc_files_${glibc_check_var}.tmp" @@ -79,9 +79,9 @@ do fn_print_information_nl "${glibc_check_name} is not installed" fi done -echo "" -echo "Final glibc Requirement" -echo "=================================" +echo -e "" +echo -e "Final glibc Requirement" +echo -e "=================================" if [ -f "${tmpdir}/detect_glibc_highest.tmp" ]; then cat "${tmpdir}/detect_glibc_highest.tmp" | sort | uniq | sort -r --version-sort | head -1 rm "${tmpdir}/detect_glibc_highest.tmp" diff --git a/lgsm/functions/command_dev_detect_ldd.sh b/lgsm/functions/command_dev_detect_ldd.sh index 95898c4e4..394f60db2 100644 --- a/lgsm/functions/command_dev_detect_ldd.sh +++ b/lgsm/functions/command_dev_detect_ldd.sh @@ -9,48 +9,48 @@ local commandname="DETECT-LDD" local commandaction="Detect-LDD" local function_selfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" -echo "=================================" -echo "Shared Object dependencies Checker" -echo "=================================" +echo -e "=================================" +echo -e "Shared Object dependencies Checker" +echo -e "=================================" if [ -z "${serverfiles}" ]; then dir="$(dirname "$(readlink -f "${BASH_SOURCE[0]}")")" fi if [ -d "${serverfiles}" ]; then - echo "Checking directory: " - echo "${serverfiles}" + echo -e "Checking directory: " + echo -e "${serverfiles}" elif [ -f "${serverfiles}" ]; then - echo "Checking file: " - echo "${serverfiles}" + echo -e "Checking file: " + echo -e "${serverfiles}" fi -echo "" +echo -e "" files=$(find "${serverfiles}" | wc -l) find "${serverfiles}" -type f -print0 | while IFS= read -r -d $'\0' line; do if ldd "${line}" 2>/dev/null | grep -v "not a dynamic executable" then - echo "${line}" >> "${tmpdir}/detect_ldd.tmp" + echo -e "${line}" >> "${tmpdir}/detect_ldd.tmp" ldd "${line}" 2>/dev/null | grep -v "not a dynamic executable" >> "${tmpdir}/detect_ldd.tmp" if ldd "${line}" 2>/dev/null | grep -v "not a dynamic executable" | grep "not found" then - echo "${line}" >> "${tmpdir}/detect_ldd_not_found.tmp" + echo -e "${line}" >> "${tmpdir}/detect_ldd_not_found.tmp" ldd "${line}" 2>/dev/null | grep -v "not a dynamic executable" | grep "not found" >> "${tmpdir}/detect_ldd_not_found.tmp" fi fi echo -n "$i / $files" $'\r' ((i++)) done -echo "" -echo "" -echo "All" -echo "=================================" +echo -e "" +echo -e "" +echo -e "All" +echo -e "=================================" cat "${tmpdir}/detect_ldd.tmp" -echo "" -echo "Not Found" -echo "=================================" +echo -e "" +echo -e "Not Found" +echo -e "=================================" cat "${tmpdir}/detect_ldd_not_found.tmp" rm "${tmpdir}/detect_ldd.tmp" diff --git a/lgsm/functions/command_dev_query_raw.sh b/lgsm/functions/command_dev_query_raw.sh index 79072468f..d927cd61a 100644 --- a/lgsm/functions/command_dev_query_raw.sh +++ b/lgsm/functions/command_dev_query_raw.sh @@ -7,12 +7,12 @@ local commandname="QUERY-RAW" local commandaction="Query Raw" local function_selfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" -echo "" -echo "Query Port" -echo "==================================================================" -echo "" -echo "Gamedig Raw Output" -echo "=================================" +echo -e "" +echo -e "Query Port" +echo -e "==================================================================" +echo -e "" +echo -e "Gamedig Raw Output" +echo -e "=================================" echo"" if [ ! "$(command -v gamedig 2>/dev/null)" ]; then fn_print_failure_nl "gamedig not installed" @@ -31,70 +31,70 @@ elif [ "${shortname}" == "kf2" ]; then fi query_gamedig.sh -echo "${gamedigcmd}" +echo -e "${gamedigcmd}" echo"" -echo "${gamedigraw}" | jq +echo -e "${gamedigraw}" | jq echo"" -echo "gsquery Raw Output" -echo "=================================" +echo -e "gsquery Raw Output" +echo -e "=================================" echo"" -echo "./query_gsquery.py -a \"${ip}\" -p \"${queryport}\" -e \"${engine}\"" +echo -e "./query_gsquery.py -a \"${ip}\" -p \"${queryport}\" -e \"${engine}\"" if [ ! -f "${functionsdir}/query_gsquery.py" ]; then fn_fetch_file_github "lgsm/functions" "query_gsquery.py" "${functionsdir}" "chmodx" "norun" "noforce" "nomd5" fi "${functionsdir}"/query_gsquery.py -a "${ip}" -p "${queryport}" -e "${engine}" echo"" -echo "TCP Raw Output" -echo "=================================" +echo -e "TCP Raw Output" +echo -e "=================================" echo"" -echo "bash -c 'exec 3<> /dev/tcp/'${ip}'/'${queryport}''" +echo -e "bash -c 'exec 3<> /dev/tcp/'${ip}'/'${queryport}''" bash -c 'exec 3<> /dev/tcp/'${ip}'/'${queryport}'' querystatus="$?" if [ "${querystatus}" == "0" ]; then - echo "TCP query PASS" + echo -e "TCP query PASS" else - echo "TCP query FAIL" + echo -e "TCP query FAIL" fi echo"" -echo "UDP Raw Output" -echo "=================================" +echo -e "UDP Raw Output" +echo -e "=================================" echo"" -echo "bash -c 'exec 3<> /dev/udp/'${ip}'/'${queryport}''" +echo -e "bash -c 'exec 3<> /dev/udp/'${ip}'/'${queryport}''" bash -c 'exec 3<> /dev/udp/'${ip}'/'${queryport}'' querystatus="$?" if [ "${querystatus}" == "0" ]; then - echo "UPD query PASS" + echo -e "UPD query PASS" else - echo "UPD query FAIL" + echo -e "UPD query FAIL" fi -echo "" -echo "Game Port" -echo "==================================================================" -echo "" +echo -e "" +echo -e "Game Port" +echo -e "==================================================================" +echo -e "" echo"" -echo "TCP Raw Output" -echo "=================================" +echo -e "TCP Raw Output" +echo -e "=================================" echo"" -echo "bash -c 'exec 3<> /dev/tcp/'${ip}'/'${port}''" +echo -e "bash -c 'exec 3<> /dev/tcp/'${ip}'/'${port}''" bash -c 'exec 3<> /dev/tcp/'${ip}'/'${port}'' querystatus="$?" if [ "${querystatus}" == "0" ]; then - echo "TCP query PASS" + echo -e "TCP query PASS" else - echo "TCP query FAIL" + echo -e "TCP query FAIL" fi echo"" -echo "UDP Raw Output" -echo "=================================" +echo -e "UDP Raw Output" +echo -e "=================================" echo"" -echo "bash -c 'exec 3<> /dev/udp/'${ip}'/'${port}''" +echo -e "bash -c 'exec 3<> /dev/udp/'${ip}'/'${port}''" bash -c 'exec 3<> /dev/udp/'${ip}'/'${port}'' querystatus="$?" if [ "${querystatus}" == "0" ]; then - echo "UDP query PASS" + echo -e "UDP query PASS" else - echo "UDP query FAIL" + echo -e "UDP query FAIL" fi diff --git a/lgsm/functions/command_donate.sh b/lgsm/functions/command_donate.sh index 0cb3a0aee..036307051 100644 --- a/lgsm/functions/command_donate.sh +++ b/lgsm/functions/command_donate.sh @@ -3,16 +3,15 @@ # Author: Daniel Gibbs # Website: https://linuxgsm.com # Description: Shows ways to donate - -echo -e "" +fn_print_ascii_logo echo -e "${lightyellow}Support LinuxGSM${default}" echo -e "=================================" echo -e "" echo -e "Been using LinuxGSM?" echo -e "Consider donating to support development." echo -e "" -echo -e "* ${blue}Patreon:${default} https://linuxgsm.com/patreon" -echo -e "* ${blue}PayPal:${default} https://linuxgsm.com/paypal" -echo -e "* ${blue}Flattr:${default} https://linuxgsm.com/flattr" +echo -e "* ${lightblue}Patreon:${default} https://linuxgsm.com/patreon" +echo -e "* ${lightblue}PayPal:${default} https://linuxgsm.com/paypal" +echo -e "* ${lightblue}Ko-Fi:${default} https://linuxgsm.com/ko-fi" echo -e "" -echo -e "LinuxGSM has been going since 2012" +echo -e "LinuxGSM est. 2012" diff --git a/lgsm/functions/command_fastdl.sh b/lgsm/functions/command_fastdl.sh index 5dba7ba53..b8b43785c 100644 --- a/lgsm/functions/command_fastdl.sh +++ b/lgsm/functions/command_fastdl.sh @@ -31,18 +31,18 @@ fi # Header fn_print_header -echo "More info: https://docs.linuxgsm.com/commands/fastdl" -echo "" +echo -e "More info: https://docs.linuxgsm.com/commands/fastdl" +echo -e "" # Prompts user for FastDL creation settings. -echo "${commandaction} setup" -echo "=================================" +echo -e "${commandaction} setup" +echo -e "=================================" # 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 "" + echo -e "${fastdldir}" + echo -e "" if fn_prompt_yn "Overwrite existing directory?" Y; then fn_script_log_info "Overwrite existing directory: YES" else @@ -129,7 +129,7 @@ fn_human_readable_file_size(){ local precision="${2}" if [[ "${bytes}" == "1" ]]; then - echo "1 byte" + echo -e "1 byte" else for item in "${abbrevs[@]}"; do local factor="${item%:*}" @@ -162,7 +162,7 @@ fn_fastdl_preview(){ ((fileswc++)) tput rc; tput el printf "gathering ${allowed_extention} : ${fileswc}..." - echo "${ext}" >> "${tmpdir}/fastdl_files_to_compress.txt" + echo -e "${ext}" >> "${tmpdir}/fastdl_files_to_compress.txt" done < <(find . -type f -iname ${allowed_extention}) if [ ${fileswc} != 0 ]; then fn_print_ok_eol_nl @@ -193,10 +193,10 @@ fn_fastdl_preview(){ ((fileswc++)) tput rc; tput el printf "gathering ${directory} ${allowed_extention} : ${fileswc}..." - echo "${ext}" >> "${tmpdir}/fastdl_files_to_compress.txt" + echo -e "${ext}" >> "${tmpdir}/fastdl_files_to_compress.txt" done < <(find "${systemdir}/${directory}" -type f -iname ${allowed_extention}) tput rc; tput el - echo "gathering ${directory} ${allowed_extention} : ${fileswc}..." + echo -e "gathering ${directory} ${allowed_extention} : ${fileswc}..." if [ ${fileswc} != 0 ]; then fn_print_ok_eol_nl else @@ -207,7 +207,7 @@ fn_fastdl_preview(){ done fi if [ -f "${tmpdir}/fastdl_files_to_compress.txt" ]; then - echo "calculating total file size..." + echo -e "calculating total file size..." fn_sleep_time totalfiles=$(wc -l < "${tmpdir}/fastdl_files_to_compress.txt") # Calculates total file size. @@ -226,7 +226,7 @@ fn_fastdl_preview(){ fn_script_log_fatal "Generating file list." core_exit.sh fi - echo "about to compress ${totalfiles} files, total size $(fn_human_readable_file_size ${filesizetotal} 0)" + echo -e "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 @@ -245,7 +245,7 @@ fn_fastdl_gmod(){ while read -r fastdlfile; do ((fileswc++)) tput rc; tput el - echo "copying ${allowed_extention} : ${fileswc}..." + echo -e "copying ${allowed_extention} : ${fileswc}..." cp --parents "${fastdlfile}" "${fastdldir}" exitcode=$? if [ ${exitcode} -ne 0 ]; then @@ -396,7 +396,7 @@ fn_fastdl_gmod_dl_enforcer(){ touch "${luafastdlfullpath}" # Read all filenames and put them into a lua file at the right path. while read -r line; do - echo "resource.AddFile( \"${line}\" )" >> "${luafastdlfullpath}" + echo -e "resource.AddFile( \"${line}\" )" >> "${luafastdlfullpath}" done < <(find "${fastdldir:?}" \( -type f ! -name "*.bz2" \) -printf '%P\n') exitcode=$? if [ ${exitcode} -ne 0 ]; then @@ -434,8 +434,8 @@ fn_fastdl_dirs fn_fastdl_build fn_fastdl_bzip2 # Finished message. -echo "FastDL files are located in:" -echo "${fastdldir}" -echo "FastDL completed" +echo -e "FastDL files are located in:" +echo -e "${fastdldir}" +echo -e "FastDL completed" fn_script_log_info "FastDL completed" core_exit.sh diff --git a/lgsm/functions/command_install_resources_mta.sh b/lgsm/functions/command_install_resources_mta.sh index 85fe20197..0eaa378bd 100644 --- a/lgsm/functions/command_install_resources_mta.sh +++ b/lgsm/functions/command_install_resources_mta.sh @@ -9,12 +9,12 @@ local commandaction="Default Resources" local function_selfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" fn_install_resources(){ - echo "" - echo "Installing Default Resources" - echo "=================================" + echo -e "" + echo -e "Installing Default Resources" + echo -e "=================================" 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." + echo -e "Default Resources Installed." } fn_print_header diff --git a/lgsm/functions/command_mods_install.sh b/lgsm/functions/command_mods_install.sh index cac08929d..16ba9956f 100644 --- a/lgsm/functions/command_mods_install.sh +++ b/lgsm/functions/command_mods_install.sh @@ -17,8 +17,8 @@ fn_print_header # Displays a list of installed mods. fn_mods_installed_list if [ "${installedmodscount}" -gt "0" ]; then - echo "Installed addons/mods" - echo "=================================" + echo -e "Installed addons/mods" + echo -e "=================================" # 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. @@ -27,11 +27,11 @@ if [ "${installedmodscount}" -gt "0" ]; then # Display mod info to the user. echo -e " * ${green}${modcommand}${default}${default}" done - echo "" + echo -e "" fi -echo "Available addons/mods" -echo "=================================" +echo -e "Available addons/mods" +echo -e "=================================" # Display available mods from mods_list.sh. # Set and reset vars compatiblemodslistindex=0 @@ -59,7 +59,7 @@ fi fn_script_log_info "${totalmodsavailable} addons/mods are available for install" ## User selects a mod. -echo "" +echo -e "" while [[ ! " ${availablemodscommands[@]} " =~ " ${usermodselect} " ]]; do echo -en "Enter an ${cyan}addon/mod${default} to ${green}install${default} (or exit to abort): " read -r usermodselect @@ -75,9 +75,9 @@ done currentmod="${usermodselect}" fn_mod_get_info -echo "" -echo "Installing ${modprettyname}" -echo "=================================" +echo -e "" +echo -e "Installing ${modprettyname}" +echo -e "=================================" fn_script_log_info "${modprettyname} selected for install" # Check if the mod is already installed and warn the user. @@ -85,7 +85,7 @@ 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" - echo " * Any configs may be overwritten." + echo -e " * Any configs may be overwritten." if ! fn_prompt_yn "Continue?" Y; then echo Exiting; core_exit.sh fi @@ -105,7 +105,7 @@ fn_mod_copy_destination fn_mod_add_list fn_mod_tidy_files_list fn_mods_clear_tmp_dir -echo "${modprettyname} installed" +echo -e "${modprettyname} installed" fn_script_log_pass "${modprettyname} installed." core_exit.sh diff --git a/lgsm/functions/command_mods_remove.sh b/lgsm/functions/command_mods_remove.sh index 9c64d4808..3d2dae54b 100644 --- a/lgsm/functions/command_mods_remove.sh +++ b/lgsm/functions/command_mods_remove.sh @@ -14,8 +14,8 @@ mods_core.sh fn_mods_check_installed fn_print_header -echo "Remove addons/mods" -echo "=================================" +echo -e "Remove addons/mods" +echo -e "=================================" # Displays list of installed mods. # Generates list to display to user. @@ -29,7 +29,7 @@ for ((mlindex=0; mlindex < ${#installedmodslist[@]}; mlindex++)); do echo -e "${red}${modcommand}${default} - ${modprettyname} - ${moddescription}" done -echo "" +echo -e "" # 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 ${red}remove${default} (or exit to abort): " @@ -44,7 +44,7 @@ while [[ ! " ${installedmodslist[@]} " =~ " ${usermodselect} " ]]; do done fn_print_warning_nl "You are about to remove ${cyan}${usermodselect}${default}." -echo " * Any custom files/configuration will be removed." +echo -e " * Any custom files/configuration will be removed." if ! fn_prompt_yn "Continue?" Y; then echo Exiting; exit fi @@ -78,7 +78,7 @@ while [ "${modfileline}" -le "${modsfilelistsize}" ]; do fi fi tput rc; tput el - echo "removing ${modprettyname} ${modfileline} / ${modsfilelistsize} : ${currentfileremove}..." + echo -e "removing ${modprettyname} ${modfileline} / ${modsfilelistsize} : ${currentfileremove}..." ((modfileline++)) done if [ ${exitcode} -ne 0 ]; then @@ -126,7 +126,7 @@ if [ "${engine}" == "unity3d" ]&&[[ "${modprettyname}" == *"Oxide"* ]]; then command_validate.sh unset exitbypass fi -echo "${modprettyname} removed" +echo -e "${modprettyname} removed" fn_script_log "${modprettyname} removed" core_exit.sh diff --git a/lgsm/functions/command_mods_update.sh b/lgsm/functions/command_mods_update.sh index 70a91cf5e..5faa2f313 100644 --- a/lgsm/functions/command_mods_update.sh +++ b/lgsm/functions/command_mods_update.sh @@ -19,11 +19,11 @@ fn_remove_cfg_files(){ echo -e "the following files/directories will be preserved:" fn_sleep_time # Count how many files there are to remove. - filestopreserve="$(echo "${modkeepfiles}" | awk -F ';' '{ print NF }')" + filestopreserve="$(echo -e "${modkeepfiles}" | awk -F ';' '{ print NF }')" # Test all subvalues of "modkeepfiles" using the ";" separator. for ((preservefilesindex=1; preservefilesindex < ${filestopreserve}; preservefilesindex++)); do # Put the current file we are looking for into a variable. - filetopreserve="$(echo "${modkeepfiles}" | awk -F ';' -v x=${preservefilesindex} '{ print $x }' )" + filetopreserve="$(echo -e "${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}/${filetopreserve}" ]||[ -d "${extractdir}/${filetopreserve}" ]; then @@ -32,7 +32,7 @@ fn_remove_cfg_files(){ if [ ! -f "${modsdir}/.removedfiles.tmp" ]; then touch "${modsdir}/.removedfiles.tmp" fi - echo "${filetopreserve}" >> "${modsdir}/.removedfiles.tmp" + echo -e "${filetopreserve}" >> "${modsdir}/.removedfiles.tmp" fi done fi @@ -79,8 +79,8 @@ while [ "${installedmodsline}" -le "${installedmodscount}" ]; do 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 - echo "" - echo "==> Updating ${modprettyname}" + echo -e "" + echo -e "==> Updating ${modprettyname}" fn_create_mods_dir fn_mods_clear_tmp_dir fn_mods_create_tmp_dir @@ -101,7 +101,7 @@ while [ "${installedmodsline}" -le "${installedmodscount}" ]; do core_exit.sh fi done -echo "" +echo -e "" fn_print_ok_nl "Mods update complete" fn_script_log_info "Mods update complete" diff --git a/lgsm/functions/command_monitor.sh b/lgsm/functions/command_monitor.sh index 01c50bdf3..9cbe30069 100644 --- a/lgsm/functions/command_monitor.sh +++ b/lgsm/functions/command_monitor.sh @@ -90,7 +90,7 @@ fn_monitor_check_lockfile(){ if [ ! -f "${rootdir}/${lockselfname}" ]; then fn_print_error_nl "Disabled: No lockfile found" fn_script_log_error "Disabled: No lockfile found" - echo " * To enable monitor run ./${selfname} start" + echo -e " * To enable monitor run ./${selfname} start" core_exit.sh fi } diff --git a/lgsm/functions/command_postdetails.sh b/lgsm/functions/command_postdetails.sh index 5fa7532b5..9ce9920a4 100644 --- a/lgsm/functions/command_postdetails.sh +++ b/lgsm/functions/command_postdetails.sh @@ -95,7 +95,7 @@ if [ "${posttarget}" == "http://pastebin.com" ] ; then # Output the resulting link. fn_print_ok_nl "Posting details to pastbin.com for ${postexpire}" pdurl="${posttarget}${link}" - echo " Please share the following url for support: ${pdurl}" + echo -e " Please share the following url for support: ${pdurl}" elif [ "${posttarget}" == "https://hastebin.com" ] ; then fn_print_dots "Posting details to hastebin.com" # hastebin is a bit simpler. If successful, the returned result @@ -104,13 +104,14 @@ elif [ "${posttarget}" == "https://hastebin.com" ] ; then link=$(${curlpath} -H "HTTP_X_REQUESTED_WITH:XMLHttpRequest" -s -d "$(<${postdetailslog})" "${posttarget}/documents" | cut -d\" -f4) fn_print_ok_nl "Posting details to hastebin.com for ${postexpire}" pdurl="${posttarget}/${link}" - echo " Please share the following url for support: ${pdurl}" + echo -e "Please share the following url for support: ${pdurl}" elif [ "${posttarget}" == "https://termbin.com" ] ; then fn_print_dots "Posting details to termbin.com" link=$(cat "${postdetailslog}" | nc termbin.com 9999 | tr -d '\n\0') fn_print_ok_nl "Posting details to termbin.com" pdurl="${link}" - echo " Please share the following url for support: ${pdurl}" + echo -e "Please share the following url for support: " + echo -e "${pdurl}" else fn_print_warn_nl "Review output in: ${postdetailslog}" core_exit.sh diff --git a/lgsm/functions/command_start.sh b/lgsm/functions/command_start.sh index ed81fe63e..dac7aa2c3 100644 --- a/lgsm/functions/command_start.sh +++ b/lgsm/functions/command_start.sh @@ -97,7 +97,7 @@ fn_start_tmux(){ # Tmux compiled from source will return "master", therefore ignore it. if [ "$(tmux -V | sed "s/tmux //" | sed -n '1 p')" == "master" ]; then fn_script_log "Tmux version: master (user compiled)" - echo "Tmux version: master (user compiled)" >> "${consolelog}" + echo -e "Tmux version: master (user compiled)" >> "${consolelog}" if [ "${consolelogging}" == "on" ]||[ -z "${consolelogging}" ]; then tmux pipe-pane -o -t "${servicename}" "exec cat >> '${consolelog}'" fi @@ -106,13 +106,13 @@ fn_start_tmux(){ tmuxversion="$(tmux -V | sed "s/tmux //" | sed -n '1 p' | tr -cd '[:digit:]')" # tmux pipe-pane not supported in tmux versions < 1.6. if [ "${tmuxversion}" -lt "16" ]; then - echo "Console logging disabled: Tmux => 1.6 required + echo -e "Console logging disabled: Tmux => 1.6 required https://linuxgsm.com/tmux-upgrade Currently installed: $(tmux -V)" > "${consolelog}" # Console logging disabled: Bug in tmux 1.8 breaks logging. elif [ "${tmuxversion}" -eq "18" ]; then - echo "Console logging disabled: Bug in tmux 1.8 breaks logging + echo -e "Console logging disabled: Bug in tmux 1.8 breaks logging https://linuxgsm.com/tmux-upgrade Currently installed: $(tmux -V)" > "${consolelog}" # Console logging enable or not set. @@ -120,13 +120,13 @@ fn_start_tmux(){ tmux pipe-pane -o -t "${servicename}" "exec cat >> '${consolelog}'" fi else - echo "Unable to detect tmux version" >> "${consolelog}" + echo -e "Unable to detect tmux version" >> "${consolelog}" fn_script_log_warn "Unable to detect tmux version" fi # Console logging disabled. if [ "${consolelogging}" == "off" ]; then - echo "Console logging disabled by user" >> "${consolelog}" + echo -e "Console logging disabled by user" >> "${consolelog}" fn_script_log_info "Console logging disabled by user" fi fn_sleep_time @@ -139,39 +139,39 @@ fn_sleep_time 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 "${lgsmlog}" - echo "" - echo "Error" - echo "=================================" + echo -e "" + echo -e "Command" + echo -e "=================================" + echo -e "tmux new-session -d -s \"${servicename}\" \"${executable} ${parms}\"" | tee -a "${lgsmlog}" + echo -e "" + echo -e "Error" + echo -e "=================================" cat "${lgsmlogdir}/.${servicename}-tmux-error.tmp" | tee -a "${lgsmlog}" # Detected error https://linuxgsm.com/support if grep -c "Operation not permitted" "${lgsmlogdir}/.${servicename}-tmux-error.tmp" then - echo "" - echo "Fix" - echo "=================================" + echo -e "" + echo -e "Fix" + echo -e "=================================" if [ ! "$(grep "tty:" /etc/group|grep "$(whoami)")" ]; then - echo "$(whoami) is not part of the tty group." + echo -e "$(whoami) is not part of the tty group." fn_script_log_info "$(whoami) is not part of the tty group." group=$(grep tty /etc/group) - echo "" - echo " ${group}" + echo -e "" + echo -e " ${group}" fn_script_log_info "${group}" - echo "" - echo "Run the following command with root privileges." - echo "" - echo " usermod -G tty $(whoami)" - echo "" - echo "https://linuxgsm.com/tmux-op-perm" + echo -e "" + echo -e "Run the following command with root privileges." + echo -e "" + echo -e " usermod -G tty $(whoami)" + echo -e "" + echo -e "https://linuxgsm.com/tmux-op-perm" fn_script_log_info "https://linuxgsm.com/tmux-op-perm" else - echo "No known fix currently. Please log an issue." + echo -e "No known fix currently. Please log an issue." fn_script_log_info "No known fix currently. Please log an issue." - echo "https://linuxgsm.com/support" + echo -e "https://linuxgsm.com/support" fn_script_log_info "https://linuxgsm.com/support" fi fi diff --git a/lgsm/functions/command_ts3_server_pass.sh b/lgsm/functions/command_ts3_server_pass.sh index f1b18560e..d05dfdfc5 100644 --- a/lgsm/functions/command_ts3_server_pass.sh +++ b/lgsm/functions/command_ts3_server_pass.sh @@ -11,10 +11,10 @@ local function_selfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" fn_serveradmin_password_prompt(){ fn_print_header - echo "Press \"CTRL+b d\" to exit console." + echo -e "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." - echo "" + echo -e "" if ! fn_prompt_yn "Continue?" Y; then echo Exiting; exit fi diff --git a/lgsm/functions/command_validate.sh b/lgsm/functions/command_validate.sh index b2395f6d5..78210ff4b 100644 --- a/lgsm/functions/command_validate.sh +++ b/lgsm/functions/command_validate.sh @@ -10,7 +10,7 @@ local function_selfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" fn_validation(){ fn_print_info "Validating files: SteamCMD" - echo "" + echo -e "" echo -e "* Validating may overwrite some customised files." echo -e "* https://docs.linuxgsm.com/commands/validate" fn_script_log_info "Validating files: SteamCMD" diff --git a/lgsm/functions/command_wipe.sh b/lgsm/functions/command_wipe.sh index 12e85d90d..9c83d2897 100644 --- a/lgsm/functions/command_wipe.sh +++ b/lgsm/functions/command_wipe.sh @@ -25,7 +25,7 @@ fn_wipe_server_process(){ else fn_wipe_server_remove_files fi - echo "server data wiped" + echo -e "server data wiped" fn_script_log "server data wiped." } diff --git a/lgsm/functions/compress_unreal2_maps.sh b/lgsm/functions/compress_unreal2_maps.sh index 856bc5086..e5868bfbb 100644 --- a/lgsm/functions/compress_unreal2_maps.sh +++ b/lgsm/functions/compress_unreal2_maps.sh @@ -9,14 +9,14 @@ local function_selfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" check.sh fn_print_header -echo "Will compress all maps in:" -echo "" +echo -e "Will compress all maps in:" +echo -e "" pwd -echo "" -echo "Compressed maps saved to:" -echo "" -echo "${compressedmapsdir}" -echo "" +echo -e "" +echo -e "Compressed maps saved to:" +echo -e "" +echo -e "${compressedmapsdir}" +echo -e "" if ! fn_prompt_yn "Start compression?" Y; then echo Exiting; return fi diff --git a/lgsm/functions/compress_ut99_maps.sh b/lgsm/functions/compress_ut99_maps.sh index 0832ae997..f3f5449a5 100644 --- a/lgsm/functions/compress_ut99_maps.sh +++ b/lgsm/functions/compress_ut99_maps.sh @@ -9,14 +9,14 @@ local function_selfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" check.sh fn_print_header -echo "Will compress all maps in:" -echo "" +echo -e "Will compress all maps in:" +echo -e "" pwd -echo "" -echo "Compressed maps saved to:" -echo "" -echo "${compressedmapsdir}" -echo "" +echo -e "" +echo -e "Compressed maps saved to:" +echo -e "" +echo -e "${compressedmapsdir}" +echo -e "" if ! fn_prompt_yn "Start compression?" Y; then echo Exiting; return fi diff --git a/lgsm/functions/core_dl.sh b/lgsm/functions/core_dl.sh index 86eb202d8..162f66247 100644 --- a/lgsm/functions/core_dl.sh +++ b/lgsm/functions/core_dl.sh @@ -45,8 +45,8 @@ fn_dl_md5(){ local md5sumcmd=$(md5sum "${local_filedir}/${local_filename}"|awk '{print $1;}') if [ "${md5sumcmd}" != "${md5}" ]; then fn_print_fail_eol_nl - echo "${local_filename} returned MD5 checksum: ${md5sumcmd}" - echo "expected MD5 checksum: ${md5}" + echo -e "${local_filename} returned MD5 checksum: ${md5sumcmd}" + echo -e "expected MD5 checksum: ${md5}" fn_script_log_fatal "Verifying ${local_filename} with MD5" fn_script_log_info "${local_filename} returned MD5 checksum: ${md5sumcmd}" fn_script_log_info "Expected MD5 checksum: ${md5}" @@ -88,9 +88,9 @@ fn_dl_extract(){ fn_print_fail_eol_nl fn_script_log_fatal "Extracting download" if [ -f "${lgsmlog}" ]; then - echo "${extractcmd}" >> "${lgsmlog}" + echo -e "${extractcmd}" >> "${lgsmlog}" fi - echo "${extractcmd}" + echo -e "${extractcmd}" core_exit.sh else fn_print_ok_eol_nl @@ -100,7 +100,7 @@ fn_dl_extract(){ # Trap to remove file download if canceled before completed. fn_fetch_trap(){ - echo "" + echo -e "" echo -en "downloading ${local_filename}..." fn_print_canceled_eol_nl fn_script_log_info "Downloading ${local_filename}...CANCELED" @@ -145,10 +145,10 @@ fn_fetch_file(){ if [ -f "${lgsmlog}" ]; then fn_script_log_fatal "Downloading ${local_filename}" echo -e "${remote_fileurl}" >> "${lgsmlog}" - echo "${curlcmd}" >> "${lgsmlog}" + echo -e "${curlcmd}" >> "${lgsmlog}" fi echo -e "${remote_fileurl}" - echo "${curlcmd}" + echo -e "${curlcmd}" core_exit.sh else fn_print_ok_eol_nl @@ -258,6 +258,6 @@ fn_update_function(){ curlpath=$(command -v curl 2>/dev/null) if [ "$(basename "${curlpath}")" != "curl" ]; then - echo "[ FAIL ] Curl is not installed" + echo -e "[ FAIL ] Curl is not installed" exit 1 fi diff --git a/lgsm/functions/core_exit.sh b/lgsm/functions/core_exit.sh index f92d3b129..8c10d77e0 100644 --- a/lgsm/functions/core_exit.sh +++ b/lgsm/functions/core_exit.sh @@ -6,8 +6,8 @@ fn_exit_dev_debug(){ if [ -f "${rootdir}/.dev-debug" ]; then - echo "" - echo "${function_selfname} exiting with code: ${exitcode}" + echo -e "" + echo -e "${function_selfname} exiting with code: ${exitcode}" if [ -f "${rootdir}/dev-debug.log" ]; then grep "functionfile=" "${rootdir}/dev-debug.log" | sed 's/functionfile=//g' > "${rootdir}/dev-debug-function-order.log" fi diff --git a/lgsm/functions/core_getopt.sh b/lgsm/functions/core_getopt.sh index dbd240bbb..d45072862 100644 --- a/lgsm/functions/core_getopt.sh +++ b/lgsm/functions/core_getopt.sh @@ -145,18 +145,18 @@ currentopt+=( "${cmd_donate[@]}" ) optcommands=() index="0" for ((index="0"; index < ${#currentopt[@]}; index+=3)); do - cmdamount="$(echo "${currentopt[index]}" | awk -F ';' '{ print NF }')" + cmdamount="$(echo -e "${currentopt[index]}" | awk -F ';' '{ print NF }')" for ((cmdindex=1; cmdindex <= ${cmdamount}; cmdindex++)); do - optcommands+=( "$(echo "${currentopt[index]}" | awk -F ';' -v x=${cmdindex} '{ print $x }')" ) + optcommands+=( "$(echo -e "${currentopt[index]}" | awk -F ';' -v x=${cmdindex} '{ print $x }')" ) done done # Shows LinuxGSM usage. fn_opt_usage(){ - echo "Usage: $0 [option]" + echo -e "Usage: $0 [option]" echo -e "" - echo "LinuxGSM - ${gamename} - Version ${version}" - echo "https://linuxgsm.com/${gameservername}" + echo -e "LinuxGSM - ${gamename} - Version ${version}" + echo -e "https://linuxgsm.com/${gameservername}" echo -e "" echo -e "${lightyellow}Commands${default}" # Display available commands. @@ -165,7 +165,7 @@ fn_opt_usage(){ 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]}" + echo -e "${cyan}$(echo -e "${currentopt[index]}" | awk -F ';' '{ print $2 }')\t${default}$(echo -e "${currentopt[index]}" | awk -F ';' '{ print $1 }')\t| ${currentopt[index+2]}" fi done } | column -s $'\t' -t @@ -182,9 +182,9 @@ for i in "${optcommands[@]}"; do # Seek and run command. index="0" for ((index="0"; index < ${#currentopt[@]}; index+=3)); do - currcmdamount="$(echo "${currentopt[index]}" | awk -F ';' '{ print NF }')" + currcmdamount="$(echo -e "${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 + if [ "$(echo -e "${currentopt[index]}" | awk -F ';' -v x=${currcmdindex} '{ print $x }')" == "${getopt}" ]; then # Run command. eval "${currentopt[index+1]}" core_exit.sh diff --git a/lgsm/functions/core_messages.sh b/lgsm/functions/core_messages.sh index 51b9a4817..e1d394834 100644 --- a/lgsm/functions/core_messages.sh +++ b/lgsm/functions/core_messages.sh @@ -11,6 +11,7 @@ fn_ansi_loader(){ if [ "${ansi}" != "off" ]; then # echo colors default="\e[0m" + black="\e[30m" red="\e[31m" lightred="\e[91m" green="\e[32m" @@ -23,6 +24,9 @@ fn_ansi_loader(){ lightmagenta="\e[95m" cyan="\e[36m" lightcyan="\e[96m" + darkgrey="\e[90m" + lightgrey="\e[37m" + white="\e[97m" fi # carriage return & erase to end of line. creeol="\r\033[K" @@ -195,18 +199,18 @@ fn_print_error_nl(){ # [ WARN ] fn_print_warn(){ if [ -n "${commandaction}" ]; then - echo -en "${creeol}[${yellow} WARN ${default}] ${commandaction} ${servicename}: $@" + echo -en "${creeol}[${lightyellow} WARN ${default}] ${commandaction} ${servicename}: $@" else - echo -en "${creeol}[${yellow} WARN ${default}] $@" + echo -en "${creeol}[${lightyellow} WARN ${default}] $@" fi fn_sleep_time } fn_print_warn_nl(){ if [ -n "${commandaction}" ]; then - echo -en "${creeol}[${yellow} WARN ${default}] ${commandaction} ${servicename}: $@" + echo -en "${creeol}[${lightyellow} WARN ${default}] ${commandaction} ${servicename}: $@" else - echo -en "${creeol}[${yellow} WARN ${default}] $@" + echo -en "${creeol}[${lightyellow} WARN ${default}] $@" fi fn_sleep_time echo -en "\n" @@ -239,9 +243,8 @@ fn_print_info_nl(){ # ================================= fn_print_header(){ echo -e "" - echo -e "${gamename} ${commandaction}" + echo -e "${lightyellow}${gamename} ${commandaction}${default}" echo -e "=================================${default}" - echo -e "" } # Complete! @@ -279,12 +282,12 @@ fn_print_error2_nl(){ # Warning! fn_print_warning(){ - echo -en "${yellow}Warning!${default} $@" + echo -en "${lightyellow}Warning!${default} $@" fn_sleep_time } fn_print_warning_nl(){ - echo -e "${yellow}Warning!${default} $@" + echo -e "${lightyellow}Warning!${default} $@" fn_sleep_time } @@ -317,7 +320,7 @@ fn_prompt_yn(){ case "${yn}" in [Yy]|[Yy][Ee][Ss]) return 0 ;; [Nn]|[Nn][Oo]) return 1 ;; - *) echo "Please answer yes or no." ;; + *) echo -e "Please answer yes or no." ;; esac done } @@ -350,11 +353,11 @@ fn_print_error_eol(){ # WARN fn_print_warn_eol(){ - echo -en "${red}WARN${default}" + echo -en "${lightyellow}WARN${default}" } fn_print_warn_eol_nl(){ - echo -e "${red}WARN${default}" + echo -e "${lightyellow}WARN${default}" } # INFO @@ -419,3 +422,39 @@ fn_print_update_eol(){ fn_print_update_eol_nl(){ echo -e "${cyan}UPDATE${default}" } + +fn_print_ascii_logo(){ + echo -e "" + echo -e " mdMMMMbm" + echo -e " mMMMMMMMMMMm" + echo -e " mMMMMMMMMMMMMm" + echo -e " mMMMMMMMMMMMMMMm" + echo -e " hMMMV^VMMV^VMMMh" + echo -e " MMMMM MM MMMMM" + echo -e " hMMs vv sMMh" + echo -e " hMMM: :MMMh" + echo -e " .hMMMh hMMMh." + echo -e " -dMMMh ${lightgrey}__${default} hMMMd-" + echo -e " :mMMMs ${lightgrey}||${default} sMMMm:" + echo -e " :MMMM+ ${lightgrey}||${default} ${red}_${default} +NMMN:" + echo -e " .mMMM+ ${lightgrey}========${default} +MMMm." + echo -e " yMMMy ${darkgrey}##############${default} yMMMy" + echo -e " mMMM: ${darkgrey}##############${default} :MMMm" + echo -e " mMM ${lightyellow}nn${default} ${lightyellow}nn${default} ${lightyellow}nn${default} ${lightyellow}nn${default} MMm" + echo -e " o ${lightyellow}nNNNNNNNn${default} ${lightyellow}nNNNNNNNn${default} o" + echo -e " ${lightyellow}nNNNNNNNNNn${default} ${lightyellow}nNNNNNNNNNn${default}" + echo -e " ${lightyellow}nNNNNNNNNNNN${default} ${lightyellow}NNNNNNNNNNNn${default}" + echo -e " ${lightyellow}+NNNNNNNNN:${default} ${lightyellow}:NNNNNNNNN+${default}" + echo -e " ${lightyellow}nNNNNNNN${default} /\ ${lightyellow}NNNNNNNn${default}" + echo -e " ${lightyellow}nnnnn${default} db ${lightyellow}nnnnn${default}" + echo -e "" + echo -e "${lightyellow}888${default} ${lightyellow}d8b${default} ${default}.d8888b. .d8888b. 888b d888" + echo -e "${lightyellow}888 Y8P ${default}d88P Y88b d88P Y88b 8888b d8888" + echo -e "${lightyellow}888${default} ${default}888${default} 888 Y88b. 88888b.d88888" + echo -e "${lightyellow}888${default} ${lightyellow}888${default} ${lightyellow}88888b.${default} ${lightyellow}888${default} ${lightyellow}888${default} ${lightyellow}888${default} ${lightyellow}888${default} 888 Y888b. 888Y88888P888" + echo -e "${lightyellow}888${default} ${lightyellow}888${default} ${lightyellow}888${default} ${lightyellow}88b${default} ${lightyellow}888${default} ${lightyellow}888${default} ${lightyellow}Y8bd8P${default} 888 88888 Y88b. 888 Y888P 888" + echo -e "${lightyellow}888${default} ${lightyellow}888${default} ${lightyellow}888${default} ${lightyellow}888${default} ${lightyellow}888${default} ${lightyellow}888${default} ${lightyellow}X88K${default} 888 888 888 888 Y8P 888" + echo -e "${lightyellow}888${default} ${lightyellow}888${default} ${lightyellow}888${default} ${lightyellow}888${default} ${lightyellow}Y88b${default} ${lightyellow}88Y${default} ${lightyellow}.d8pq8b.${default} Y88b d88P Y88b d88P 888 * 888" + echo -e "${lightyellow}LinuxGSM${default} ${lightyellow}888${default} ${lightyellow}888${default} ${lightyellow}888${default} ${lightyellow}Y8888Y${default} ${lightyellow}888${default} ${lightyellow}888${default} Y2012P88 Y8888P 888 888" + echo -e "" +} diff --git a/lgsm/functions/core_trap.sh b/lgsm/functions/core_trap.sh index 54f2ef2c5..4c9db3579 100644 --- a/lgsm/functions/core_trap.sh +++ b/lgsm/functions/core_trap.sh @@ -5,7 +5,7 @@ # Description: Handles CTRL-C trap to give an exit code. fn_exit_trap(){ - echo "" + echo -e "" core_exit.sh } diff --git a/lgsm/functions/fix.sh b/lgsm/functions/fix.sh index 23153d87c..04d5c09b5 100644 --- a/lgsm/functions/fix.sh +++ b/lgsm/functions/fix.sh @@ -81,9 +81,9 @@ fi # Fixes that are run on install only. if [ "${function_selfname}" == "command_install.sh" ]; then if [ "${shortname}" == "kf" ]||[ "${shortname}" == "kf2" ]||[ "${shortname}" == "ro" ]||[ "${shortname}" == "ut2k4" ]||[ "${shortname}" == "ut" ]||[ "${shortname}" == "ut3" ]; then - echo "" - echo "Applying Post-Install Fixes" - echo "=================================" + echo -e "" + echo -e "Applying Post-Install Fixes" + echo -e "=================================" fn_sleep_time if [ "${shortname}" == "kf" ]; then fix_kf.sh diff --git a/lgsm/functions/fix_kf.sh b/lgsm/functions/fix_kf.sh index bb5a8b6ca..125252f06 100644 --- a/lgsm/functions/fix_kf.sh +++ b/lgsm/functions/fix_kf.sh @@ -8,18 +8,18 @@ local commandname="FIX" local commandaction="Fix" 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" +echo -e "Applying WebAdmin ROOst.css fix." +echo -e "http://forums.tripwireinteractive.com/showpost.php?p=585435&postcount=13" sed -i 's/none}/none;/g' "${serverfiles}/Web/ServerAdmin/ROOst.css" sed -i 's/underline}/underline;/g' "${serverfiles}/Web/ServerAdmin/ROOst.css" fn_sleep_time -echo "Applying WebAdmin CharSet fix." -echo "http://forums.tripwireinteractive.com/showpost.php?p=442340&postcount=1" +echo -e "Applying WebAdmin CharSet fix." +echo -e "http://forums.tripwireinteractive.com/showpost.php?p=442340&postcount=1" sed -i 's/CharSet="iso-8859-1"/CharSet="utf-8"/g' "${systemdir}/UWeb.int" fn_sleep_time -echo "applying server name fix." +echo -e "applying server name fix." fn_sleep_time -echo "forcing server restart..." +echo -e "forcing server restart..." fn_sleep_time exitbypass=1 command_start.sh diff --git a/lgsm/functions/fix_ro.sh b/lgsm/functions/fix_ro.sh index 1ded9824b..e354ce002 100644 --- a/lgsm/functions/fix_ro.sh +++ b/lgsm/functions/fix_ro.sh @@ -8,21 +8,21 @@ local commandname="FIX" local commandaction="Fix" 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" +echo -e "Applying WebAdmin ROOst.css fix." +echo -e "http://forums.tripwireinteractive.com/showpost.php?p=585435&postcount=13" sed -i 's/none}/none;/g' "${serverfiles}/Web/ServerAdmin/ROOst.css" sed -i 's/underline}/underline;/g' "${serverfiles}/Web/ServerAdmin/ROOst.css" fn_sleep_time -echo "Applying WebAdmin CharSet fix." -echo "http://forums.tripwireinteractive.com/showpost.php?p=442340&postcount=1" +echo -e "Applying WebAdmin CharSet fix." +echo -e "http://forums.tripwireinteractive.com/showpost.php?p=442340&postcount=1" sed -i 's/CharSet="iso-8859-1"/CharSet="utf-8"/g' "${systemdir}/uweb.int" fn_sleep_time -echo "Applying Steam AppID fix." +echo -e "Applying Steam AppID fix." sed -i 's/1210/1200/g' "${systemdir}/steam_appid.txt" fn_sleep_time -echo "applying server name fix." +echo -e "applying server name fix." fn_sleep_time -echo "forcing server restart..." +echo -e "forcing server restart..." fn_sleep_time exitbypass=1 command_start.sh diff --git a/lgsm/functions/fix_ut.sh b/lgsm/functions/fix_ut.sh index 5632c86e4..4d1b96355 100644 --- a/lgsm/functions/fix_ut.sh +++ b/lgsm/functions/fix_ut.sh @@ -9,6 +9,6 @@ local commandaction="Fix" local function_selfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" #Set Binary Executable -echo "chmod +x ${executabledir}/${executable}" +echo -e "chmod +x ${executabledir}/${executable}" chmod +x "${executabledir}/${executable}" fn_sleep_time diff --git a/lgsm/functions/fix_ut2k4.sh b/lgsm/functions/fix_ut2k4.sh index cc517e1f3..4f966d80b 100644 --- a/lgsm/functions/fix_ut2k4.sh +++ b/lgsm/functions/fix_ut2k4.sh @@ -8,18 +8,18 @@ local commandname="FIX" local commandaction="Fix" 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" +echo -e "applying WebAdmin ut2003.css fix." +echo -e "http://forums.tripwireinteractive.com/showpost.php?p=585435&postcount=13" sed -i 's/none}/none;/g' "${serverfiles}/Web/ServerAdmin/ut2003.css" sed -i 's/underline}/underline;/g' "${serverfiles}/Web/ServerAdmin/ut2003.css" fn_sleep_time -echo "applying WebAdmin CharSet fix." -echo "http://forums.tripwireinteractive.com/showpost.php?p=442340&postcount=1" +echo -e "applying WebAdmin CharSet fix." +echo -e "http://forums.tripwireinteractive.com/showpost.php?p=442340&postcount=1" sed -i 's/CharSet="iso-8859-1"/CharSet="utf-8"/g' "${systemdir}/UWeb.int" fn_sleep_time -echo "applying server name fix." +echo -e "applying server name fix." fn_sleep_time -echo "forcing server restart." +echo -e "forcing server restart." fn_sleep_time exitbypass=1 command_start.sh diff --git a/lgsm/functions/info_distro.sh b/lgsm/functions/info_distro.sh index 089f188c9..c7bf38a28 100644 --- a/lgsm/functions/info_distro.sh +++ b/lgsm/functions/info_distro.sh @@ -233,12 +233,12 @@ if [ -z "${extip}" ]; then exitcode=$? # Should ifconfig.co return an error will use last known IP. if [ ${exitcode} -eq 0 ]; then - echo "${extip}" > "${tmpdir}/extip.txt" + echo -e "${extip}" > "${tmpdir}/extip.txt" else if [ -f "${tmpdir}/extip.txt" ]; then extip=$(cat ${tmpdir}/extip.txt) else - echo "x.x.x.x" + echo -e "x.x.x.x" fi fi fi diff --git a/lgsm/functions/info_messages.sh b/lgsm/functions/info_messages.sh index 427389e1d..63deff33f 100644 --- a/lgsm/functions/info_messages.sh +++ b/lgsm/functions/info_messages.sh @@ -538,7 +538,7 @@ fn_info_message_ports(){ echo -e "" echo -e "${lightgreen}Ports${default}" fn_messages_separator - echo -e "Change ports by editing the parameters in:" + echo -e "${lightblue}Change ports by editing the parameters in:${default}" parmslocation="${red}UNKNOWN${default}" # engines/games that require editing in the config file @@ -563,7 +563,7 @@ fn_info_message_ports(){ done echo -e "${parmslocation}" echo -e "" - echo -e "Useful port diagnostic command:" + echo -e "${lightblue}Useful port diagnostic command:${default}" } fn_info_message_statusbottom(){ @@ -584,39 +584,39 @@ fn_info_logs(){ if [ -n "${lgsmlog}" ]; then echo -e "\nScript log\n===================" if [ ! "$(ls -A "${lgsmlogdir}")" ]; then - echo "${lgsmlogdir} (NO LOG FILES)" + echo -e "${lgsmlogdir} (NO LOG FILES)" elif [ ! -s "${lgsmlog}" ]; then - echo "${lgsmlog} (LOG FILE IS EMPTY)" + echo -e "${lgsmlog} (LOG FILE IS EMPTY)" else - echo "${lgsmlog}" + echo -e "${lgsmlog}" tail -25 "${lgsmlog}" fi - echo "" + echo -e "" fi if [ -n "${consolelog}" ]; then echo -e "\nConsole log\n====================" if [ ! "$(ls -A "${consolelogdir}")" ]; then - echo "${consolelogdir} (NO LOG FILES)" + echo -e "${consolelogdir} (NO LOG FILES)" elif [ ! -s "${consolelog}" ]; then - echo "${consolelog} (LOG FILE IS EMPTY)" + echo -e "${consolelog} (LOG FILE IS EMPTY)" else - echo "${consolelog}" + echo -e "${consolelog}" tail -25 "${consolelog}" | awk '{ sub("\r$", ""); print }' fi - echo "" + echo -e "" fi if [ -n "${gamelogdir}" ]; then echo -e "\nServer log\n===================" if [ ! "$(ls -A "${gamelogdir}")" ]; then - echo "${gamelogdir} (NO LOG FILES)" + echo -e "${gamelogdir} (NO LOG FILES)" else - echo "${gamelogdir}" + echo -e "${gamelogdir}" # dos2unix sed 's/\r//' tail "${gamelogdir}"/* 2>/dev/null | grep -v "==>" | sed '/^$/d' | sed 's/\r//' | tail -25 fi - echo "" + echo -e "" fi } @@ -626,7 +626,7 @@ fn_info_message_ark(){ echo -e "netstat -atunp | grep ShooterGame" echo -e "" { - echo -e "DESCRIPTION\tDIRECTION\tPORT\tPROTOCOL" + echo -e "${lightblue}DESCRIPTION\tDIRECTION\tPORT\tPROTOCOL${default}" 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 @@ -641,7 +641,7 @@ fn_info_message_ballisticoverkill(){ echo -e "netstat -atunp | grep BODS.x86" echo -e "" { - echo -e "DESCRIPTION\tDIRECTION\tPORT\tPROTOCOL" + echo -e "${lightblue}DESCRIPTION\tDIRECTION\tPORT\tPROTOCOL${default}" echo -e "> Game/RCON\tINBOUND\t${port}\tudp" echo -e "> Query\tINBOUND\t${queryport}\tudp" } | column -s $'\t' -t @@ -651,7 +651,7 @@ fn_info_message_battalion1944(){ echo -e "netstat -atunp | grep BattalionServ" echo -e "" { - echo -e "DESCRIPTION\tDIRECTION\tPORT\tPROTOCOL" + echo -e "${lightblue}DESCRIPTION\tDIRECTION\tPORT\tPROTOCOL${default}" echo -e "> Game\tINBOUND\t${port}\tudp" # Don't do arithmetics if ever the port wasn't a numeric value # unconfirmed - http://wiki.battaliongame.com/Community_Servers#Firewalls_.2F_Port_Forwarding @@ -667,7 +667,7 @@ fn_info_message_cod(){ echo -e "netstat -atunp | grep cod_lnxded" echo -e "" { - echo -e "DESCRIPTION\tDIRECTION\tPORT\tPROTOCOL" + echo -e "${lightblue}DESCRIPTION\tDIRECTION\tPORT\tPROTOCOL${default}" echo -e "> Game\tINBOUND\t${port}\tudp" } | column -s $'\t' -t } @@ -676,7 +676,7 @@ fn_info_message_coduo(){ echo -e "netstat -atunp | grep coduo_lnxded" echo -e "" { - echo -e "DESCRIPTION\tDIRECTION\tPORT\tPROTOCOL" + echo -e "${lightblue}DESCRIPTION\tDIRECTION\tPORT\tPROTOCOL${default}" echo -e "> Game\tINBOUND\t${port}\tudp" } | column -s $'\t' -t } @@ -685,7 +685,7 @@ fn_info_message_cod2(){ echo -e "netstat -atunp | grep cod2_lnxded" echo -e "" { - echo -e "DESCRIPTION\tDIRECTION\tPORT\tPROTOCOL" + echo -e "${lightblue}DESCRIPTION\tDIRECTION\tPORT\tPROTOCOL${default}" echo -e "> Game\tINBOUND\t${port}\tudp" } | column -s $'\t' -t } @@ -694,7 +694,7 @@ fn_info_message_cod4(){ echo -e "netstat -atunp" echo -e "" { - echo -e "DESCRIPTION\tDIRECTION\tPORT\tPROTOCOL" + echo -e "${lightblue}DESCRIPTION\tDIRECTION\tPORT\tPROTOCOL${default}" echo -e "> Game\tINBOUND\t${port}\tudp" } | column -s $'\t' -t } @@ -703,7 +703,7 @@ fn_info_message_codwaw(){ echo -e "netstat -atunp | grep codwaw_lnxded" echo -e "" { - echo -e "DESCRIPTION\tDIRECTION\tPORT\tPROTOCOL" + echo -e "${lightblue}DESCRIPTION\tDIRECTION\tPORT\tPROTOCOL${default}" echo -e "> Game\tINBOUND\t${port}\tudp" } | column -s $'\t' -t } @@ -712,7 +712,7 @@ fn_info_message_dontstarve(){ echo -e "netstat -atunp | grep dontstarve" echo -e "" { - echo -e "DESCRIPTION\tDIRECTION\tPORT\tPROTOCOL" + echo -e "${lightblue}DESCRIPTION\tDIRECTION\tPORT\tPROTOCOL${default}" echo -e "> Game: Server\tINBOUND\t${port}\tudp" echo -e "> Game: Master\tINBOUND\t${masterport}\tudp" echo -e "> Steam: Auth\tINBOUND\t${steamauthenticationport}\tudp" @@ -724,7 +724,7 @@ fn_info_message_eco(){ echo -e "netstat -atunp | grep mono" echo -e "" { - echo -e "DESCRIPTION\tDIRECTION\tPORT\tPROTOCOL" + echo -e "${lightblue}DESCRIPTION\tDIRECTION\tPORT\tPROTOCOL${default}" echo -e "> Game\tINBOUND\t${port}\tudp" echo -e "> WebAdmin\tINBOUND\t${webadminport}\ttcp" } | column -s $'\t' -t @@ -735,7 +735,7 @@ fn_info_message_etlegacy(){ echo -e "netstat -atunp | grep etlded" echo -e "" { - echo -e "DESCRIPTION\tDIRECTION\tPORT\tPROTOCOL" + echo -e "${lightblue}DESCRIPTION\tDIRECTION\tPORT\tPROTOCOL${default}" echo -e "> Game/Query\tINBOUND\t${port}\tudp" } | column -s $'\t' -t } @@ -744,7 +744,7 @@ fn_info_message_factorio(){ echo -e "netstat -atunp | grep factorio" echo -e "" { - echo -e "DESCRIPTION\tDIRECTION\tPORT\tPROTOCOL" + echo -e "${lightblue}DESCRIPTION\tDIRECTION\tPORT\tPROTOCOL${default}" echo -e "> Game\tINBOUND\t${port}\ttcp" } | column -s $'\t' -t } @@ -753,7 +753,7 @@ fn_info_message_goldsource(){ echo -e "netstat -atunp | grep hlds_linux" echo -e "" { - echo -e "DESCRIPTION\tDIRECTION\tPORT\tPROTOCOL" + echo -e "${lightblue}DESCRIPTION\tDIRECTION\tPORT\tPROTOCOL${default}" echo -e "> Game/RCON\tINBOUND\t${port}\ttcp/udp" echo -e "< Client\tOUTBOUND\t${clientport}\tudp" } | column -s $'\t' -t @@ -763,7 +763,7 @@ fn_info_message_hurtworld(){ echo -e "netstat -atunp | grep Hurtworld" echo -e "" { - echo -e "DESCRIPTION\tDIRECTION\tPORT\tPROTOCOL" + echo -e "${lightblue}DESCRIPTION\tDIRECTION\tPORT\tPROTOCOL${default}" echo -e "> Game/RCON\tINBOUND\t${port}\tudp" echo -e "> Query\tINBOUND\t${queryport}\tudp" } | column -s $'\t' -t @@ -773,7 +773,7 @@ fn_info_message_inss(){ echo -e "netstat -atunp | grep Insurgency" echo -e "" { - echo -e "DESCRIPTION\tDIRECTION\tPORT\tPROTOCOL" + echo -e "${lightblue}DESCRIPTION\tDIRECTION\tPORT\tPROTOCOL${default}" echo -e "> Game\tINBOUND\t${port}\tudp" echo -e "> Query\tINBOUND\t${queryport}\tudp" echo -e "> RCON\tINBOUND\t${rconport}\ttcp" @@ -784,7 +784,7 @@ fn_info_message_justcause2(){ echo -e "netstat -atunp | grep Jcmp-Server" echo -e "" { - echo -e "DESCRIPTION\tDIRECTION\tPORT\tPROTOCOL" + echo -e "${lightblue}DESCRIPTION\tDIRECTION\tPORT\tPROTOCOL${default}" echo -e "> Game\tINBOUND\t${port}\tudp" } | column -s $'\t' -t } @@ -793,7 +793,7 @@ fn_info_message_justcause3(){ echo -e "netstat -atunp | grep Server" echo -e "" { - echo -e "DESCRIPTION\tDIRECTION\tPORT\tPROTOCOL" + echo -e "${lightblue}DESCRIPTION\tDIRECTION\tPORT\tPROTOCOL${default}" echo -e "> Game\tINBOUND\t${port}\tudp" echo -e "> Query\tINBOUND\t${queryport}\tudp" echo -e "> Steam\tINBOUND\t${steamport}\tudp" @@ -804,7 +804,7 @@ fn_info_message_minecraft(){ echo -e "netstat -atunp | grep java" echo -e "" { - echo -e "DESCRIPTION\tDIRECTION\tPORT\tPROTOCOL" + echo -e "${lightblue}DESCRIPTION\tDIRECTION\tPORT\tPROTOCOL${default}" echo -e "> Game\tINBOUND\t${port}\ttcp" echo -e "> Query\tINBOUND\t${queryport}\tudp" echo -e "> Rcon\tINBOUND\t${rconport}\ttcp" @@ -824,7 +824,7 @@ fn_info_message_mumble(){ echo -e "netstat -atunp | grep murmur" echo -e "" { - echo -e "DESCRIPTION\tDIRECTION\tPORT\tPROTOCOL" + echo -e "${lightblue}DESCRIPTION\tDIRECTION\tPORT\tPROTOCOL${default}" echo -e "> Voice\tINBOUND\t${port}\tudp" echo -e "> ServerQuery\tINBOUND\t${port}\ttcp" } | column -s $'\t' -t @@ -833,7 +833,7 @@ fn_info_message_pstbs(){ echo -e "netstat -atunp | grep PostScriptum" echo -e "" { - echo -e "DESCRIPTION\tDIRECTION\tPORT\tPROTOCOL" + echo -e "${lightblue}DESCRIPTION\tDIRECTION\tPORT\tPROTOCOL${default}" echo -e "> Game\tINBOUND\t${port}\tudp" echo -e "> Query\tINBOUND\t${queryport}\tudp" echo -e "> RCON\tINBOUND\t${rconport}\ttcp" @@ -844,7 +844,7 @@ fn_info_message_projectcars(){ echo -e "netstat -atunp | grep DedicatedS" echo -e "" { - echo -e "DESCRIPTION\tDIRECTION\tPORT\tPROTOCOL" + echo -e "${lightblue}DESCRIPTION\tDIRECTION\tPORT\tPROTOCOL${default}" echo -e "> Game\tINBOUND\t${port}\tudp" echo -e "> Query\tINBOUND\t${queryport}\tudp" echo -e "> Steam\tINBOUND\t${steamport}\tudp" @@ -855,7 +855,7 @@ fn_info_message_projectzomboid(){ echo -e "netstat -atunp | grep java" echo -e "" { - echo -e "DESCRIPTION\tDIRECTION\tPORT\tPROTOCOL" + echo -e "${lightblue}DESCRIPTION\tDIRECTION\tPORT\tPROTOCOL${default}" echo -e "> Game\tINBOUND\t${port}\tudp" } | column -s $'\t' -t } @@ -864,7 +864,7 @@ fn_info_message_quake(){ echo -e "netstat -atunp | grep mvdsv" echo -e "" { - echo -e "DESCRIPTION\tDIRECTION\tPORT\tPROTOCOL" + echo -e "${lightblue}DESCRIPTION\tDIRECTION\tPORT\tPROTOCOL${default}" echo -e "> Game\tINBOUND\t${port}\tudp" } | column -s $'\t' -t } @@ -873,7 +873,7 @@ fn_info_message_quake2(){ echo -e "netstat -atunp | grep quake2" echo -e "" { - echo -e "DESCRIPTION\tDIRECTION\tPORT\tPROTOCOL" + echo -e "${lightblue}DESCRIPTION\tDIRECTION\tPORT\tPROTOCOL${default}" echo -e "> Game\tINBOUND\t${port}\tudp" } | column -s $'\t' -t } @@ -882,7 +882,7 @@ fn_info_message_quake3(){ echo -e "netstat -atunp | grep q3ded" echo -e "" { - echo -e "DESCRIPTION\tDIRECTION\tPORT\tPROTOCOL" + echo -e "${lightblue}DESCRIPTION\tDIRECTION\tPORT\tPROTOCOL${default}" echo -e "> Game\tINBOUND\t${port}\tudp" } | column -s $'\t' -t } @@ -895,7 +895,7 @@ fn_info_message_quakelive(){ echo -e "" fi { - echo -e "DESCRIPTION\tDIRECTION\tPORT\tPROTOCOL" + echo -e "${lightblue}DESCRIPTION\tDIRECTION\tPORT\tPROTOCOL${default}" echo -e "> Game/Query\tINBOUND\t${port}\tudp" echo -e "> Rcon\tINBOUND\t${rconport}\tudp" echo -e "> Stats\tINBOUND\t${statsport}\tudp" @@ -910,7 +910,7 @@ fn_info_message_realvirtuality(){ port="2302" fi { - echo -e "DESCRIPTION\tDIRECTION\tPORT\tPROTOCOL" + echo -e "${lightblue}DESCRIPTION\tDIRECTION\tPORT\tPROTOCOL${default}" 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 @@ -925,7 +925,7 @@ fn_info_message_refractor(){ echo -e "netstat -atunp | grep bf1942_lnxd" echo -e "" { - echo -e "DESCRIPTION\tDIRECTION\tPORT\tPROTOCOL" + echo -e "${lightblue}DESCRIPTION\tDIRECTION\tPORT\tPROTOCOL${default}" echo -e "> Game/Query\tINBOUND\t${port}\tudp" echo -e "> Steam: Query\tINBOUND\t${queryport}\tudp" } | column -s $'\t' -t @@ -935,7 +935,7 @@ fn_info_message_risingworld(){ echo -e "netstat -atunp | grep java" echo -e "" { - echo -e "DESCRIPTION\tDIRECTION\tPORT\tPROTOCOL" + echo -e "${lightblue}DESCRIPTION\tDIRECTION\tPORT\tPROTOCOL${default}" echo -e "> Game/Query\tINBOUND\t${port}\ttcp/udp" echo -e "> http query\tINBOUND\t${httpqueryport}\ttcp" echo -e "> RCON\tINBOUND\t${rconport}\ttcp" @@ -946,7 +946,7 @@ fn_info_message_rtcw(){ echo -e "netstat -atunp | grep iowolfded" echo -e "" { - echo -e "DESCRIPTION\tDIRECTION\tPORT\tPROTOCOL" + echo -e "${lightblue}DESCRIPTION\tDIRECTION\tPORT\tPROTOCOL${default}" echo -e "> Game\tINBOUND\t${port}\tudp" } | column -s $'\t' -t } @@ -955,7 +955,7 @@ fn_info_message_rust(){ echo -e "netstat -atunp | grep Rust" echo -e "" { - echo -e "DESCRIPTION\tDIRECTION\tPORT\tPROTOCOL" + echo -e "${lightblue}DESCRIPTION\tDIRECTION\tPORT\tPROTOCOL${default}" echo -e "> Game/Query\tINBOUND\t${port}\ttcp/udp" echo -e "> RCON\tINBOUND\t${rconport}\ttcp" } | column -s $'\t' -t @@ -965,7 +965,7 @@ fn_info_message_samp(){ echo -e "netstat -atunp | grep samp03svr" echo -e "" { - echo -e "DESCRIPTION\tDIRECTION\tPORT\tPROTOCOL" + echo -e "${lightblue}DESCRIPTION\tDIRECTION\tPORT\tPROTOCOL${default}" echo -e "> Game/RCON\tINBOUND\t${port}\ttcp/udp" } | column -s $'\t' -t } @@ -975,7 +975,7 @@ fn_info_message_seriousengine35(){ echo -e "netstat -atunp | grep Sam3_Dedicate" echo -e "" { - echo -e "DESCRIPTION\tDIRECTION\tPORT\tPROTOCOL" + echo -e "${lightblue}DESCRIPTION\tDIRECTION\tPORT\tPROTOCOL${default}" echo -e "> Game/RCON\tINBOUND\t${port}\ttcp" echo -e "> Query\tINBOUND\t${queryport}\tudp" } | column -s $'\t' -t @@ -985,7 +985,7 @@ fn_info_message_sbots(){ echo -e "netstat -atunp | grep blank1" echo -e "" { - echo -e "DESCRIPTION\tDIRECTION\tPORT\tPROTOCOL" + echo -e "${lightblue}DESCRIPTION\tDIRECTION\tPORT\tPROTOCOL${default}" echo -e "> Game\tINBOUND\t${port}\tudp" echo -e "> Query\tINBOUND\t${queryport}\tudp" } | column -s $'\t' -t @@ -996,7 +996,7 @@ fn_info_message_sdtd(){ echo -e "netstat -atunp | grep 7DaysToDie" echo -e "" { - echo -e "DESCRIPTION\tDIRECTION\tPORT\tPROTOCOL" + echo -e "${lightblue}DESCRIPTION\tDIRECTION\tPORT\tPROTOCOL${default}" echo -e "> Game/RCON\tINBOUND\t${port}\tudp" echo -e "> Query\tINBOUND\t${queryport}\tudp" echo -e "> WebAdmin\tINBOUND\t${webadminport}\ttcp" @@ -1024,7 +1024,7 @@ fn_info_message_sof2(){ echo -e "netstat -atunp | grep sof2ded" echo -e "" { - echo -e "DESCRIPTION\tDIRECTION\tPORT\tPROTOCOL" + echo -e "${lightblue}DESCRIPTION\tDIRECTION\tPORT\tPROTOCOL${default}" echo -e "> Game/Query\tINBOUND\t${port}\tudp" } | column -s $'\t' -t } @@ -1033,7 +1033,7 @@ fn_info_message_source(){ echo -e "netstat -atunp | grep srcds_linux" echo -e "" { - echo -e "DESCRIPTION\tDIRECTION\tPORT\tPROTOCOL" + echo -e "${lightblue}DESCRIPTION\tDIRECTION\tPORT\tPROTOCOL${default}" echo -e "> Game/RCON\tINBOUND\t${port}\ttcp/udp" echo -e "> SourceTV\tINBOUND\t${sourcetvport}\tudp" echo -e "< Client\tOUTBOUND\t${clientport}\tudp" @@ -1045,7 +1045,7 @@ fn_info_message_spark(){ echo -e "netstat -atunp | grep server_linux" echo -e "" { - echo -e "DESCRIPTION\tDIRECTION\tPORT\tPROTOCOL" + echo -e "${lightblue}DESCRIPTION\tDIRECTION\tPORT\tPROTOCOL${default}" echo -e "> Game/RCON\tINBOUND\t${port}\tudp" echo -e "> Query\tINBOUND\t${queryport}\tudp" echo -e "> WebAdmin\tINBOUND\t${webadminport}\ttcp" @@ -1064,7 +1064,7 @@ fn_info_message_squad(){ echo -e "netstat -atunp | grep SquadServer" echo -e "" { - echo -e "DESCRIPTION\tDIRECTION\tPORT\tPROTOCOL" + echo -e "${lightblue}DESCRIPTION\tDIRECTION\tPORT\tPROTOCOL${default}" echo -e "> Game\tINBOUND\t${port}\tudp" echo -e "> Query\tINBOUND\t${queryport}\tudp" echo -e "> RCON\tINBOUND\t${rconport}\ttcp" @@ -1075,7 +1075,7 @@ fn_info_message_starbound(){ echo -e "netstat -atunp | grep starbound" echo -e "" { - echo -e "DESCRIPTION\tDIRECTION\tPORT\tPROTOCOL" + echo -e "${lightblue}DESCRIPTION\tDIRECTION\tPORT\tPROTOCOL${default}" echo -e "> Game\tINBOUND\t${port}\ttcp" echo -e "> Query\tINBOUND\t${queryport}\ttcp" echo -e "> RCON\tINBOUND\t${rconport}\ttcp" @@ -1086,7 +1086,7 @@ fn_info_message_stationeers(){ echo -e "netstat -atunp | grep rocketstation" echo -e "" { - echo -e "DESCRIPTION\tDIRECTION\tPORT\tPROTOCOL" + echo -e "${lightblue}DESCRIPTION\tDIRECTION\tPORT\tPROTOCOL${default}" echo -e "> Game\tINBOUND\t${port}\ttcp" echo -e "> Query\tINBOUND\t${queryport}\ttcp" } | column -s $'\t' -t @@ -1096,7 +1096,7 @@ fn_info_message_teamspeak3(){ echo -e "netstat -atunp | grep ts3server" echo -e "" { - echo -e "DESCRIPTION\tDIRECTION\tPORT\tPROTOCOL" + echo -e "${lightblue}DESCRIPTION\tDIRECTION\tPORT\tPROTOCOL${default}" echo -e "> Voice\tINBOUND\t${port}\tudp" echo -e "> ServerQuery\tINBOUND\t${queryport}\ttcp" echo -e "> File transfer\tINBOUND\t${fileport}\ttcp" @@ -1107,7 +1107,7 @@ fn_info_message_teeworlds(){ echo -e "netstat -atunp | grep teeworlds_srv" echo -e "" { - echo -e "DESCRIPTION\tDIRECTION\tPORT\tPROTOCOL" + echo -e "${lightblue}DESCRIPTION\tDIRECTION\tPORT\tPROTOCOL${default}" echo -e "> Game\tINBOUND\t${port}\ttcp" } | column -s $'\t' -t } @@ -1116,7 +1116,7 @@ fn_info_message_terraria(){ echo -e "netstat -atunp | grep TerrariaServer" echo -e "" { - echo -e "DESCRIPTION\tDIRECTION\tPORT\tPROTOCOL" + echo -e "${lightblue}DESCRIPTION\tDIRECTION\tPORT\tPROTOCOL${default}" echo -e "> Game\tINBOUND\t${port}\ttcp" } | column -s $'\t' -t } @@ -1125,7 +1125,7 @@ fn_info_message_towerunite(){ echo -e "netstat -atunp | grep TowerServer" echo -e "" { - echo -e "DESCRIPTION\tDIRECTION\tPORT\tPROTOCOL" + echo -e "${lightblue}DESCRIPTION\tDIRECTION\tPORT\tPROTOCOL${default}" 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 @@ -1179,7 +1179,7 @@ fn_info_message_unreal3(){ echo -e "netstat -atunp | grep ut3-bin" echo -e "" { - echo -e "DESCRIPTION\tDIRECTION\tPORT\tPROTOCOL" + echo -e "${lightblue}DESCRIPTION\tDIRECTION\tPORT\tPROTOCOL${default}" echo -e "> Game\tINBOUND\t${port}\tudp" echo -e "> Query\tINBOUND\t${queryport}\tudp" echo -e "> WebAdmin\tINBOUND\t${webadminport}\ttcp\tListenPort=${webadminport}" @@ -1199,7 +1199,7 @@ fn_info_message_unturned(){ echo -e "netstat -atunp | grep Unturned" echo -e "" { - echo -e "DESCRIPTION\tDIRECTION\tPORT\tPROTOCOL" + echo -e "${lightblue}DESCRIPTION\tDIRECTION\tPORT\tPROTOCOL${default}" echo -e "> Game\tINBOUND\t${port}\tudp" echo -e "> Query\tINBOUND\t${queryport}\tudp" } | column -s $'\t' -t @@ -1212,7 +1212,7 @@ fn_info_message_kf2(){ echo -e "netstat -atunp | grep KFGame" echo -e "" { - echo -e "DESCRIPTION\tDIRECTION\tPORT\tPROTOCOL" + echo -e "${lightblue}DESCRIPTION\tDIRECTION\tPORT\tPROTOCOL${default}" echo -e "> Game\tINBOUND\t${port}\ttcp\tPort=${port}" echo -e "> Query\tINBOUND\t${queryport}\tudp" echo -e "> Steam\tINBOUND\t20560\tudp" @@ -1233,7 +1233,7 @@ fn_info_message_wolfensteinenemyterritory(){ echo -e "netstat -atunp | grep etded" echo -e "" { - echo -e "DESCRIPTION\tDIRECTION\tPORT\tPROTOCOL" + echo -e "${lightblue}DESCRIPTION\tDIRECTION\tPORT\tPROTOCOL${default}" echo -e "> Game/Query\tINBOUND\t${port}\tudp" } | column -s $'\t' -t } @@ -1243,7 +1243,7 @@ fn_info_message_wurmunlimited(){ echo -e "netstat -atunp | grep WurmServer" echo -e "" { - echo -e "DESCRIPTION\tDIRECTION\tPORT\tPROTOCOL" + echo -e "${lightblue}DESCRIPTION\tDIRECTION\tPORT\tPROTOCOL${default}" echo -e "> Game\tINBOUND\t${port}\ttcp" echo -e "> Game/Query\tINBOUND\t${queryport}\tudp" } | column -s $'\t' -t @@ -1253,7 +1253,7 @@ fn_info_message_mta(){ echo -e "netstat -atunp | grep mta-server64" echo -e "" { - echo -e "DESCRIPTION\tDIRECTION\tPORT\tPROTOCOL" + echo -e "${lightblue}DESCRIPTION\tDIRECTION\tPORT\tPROTOCOL${default}" echo -e "> Game\tOUTBOUND\t${port}\tudp" echo -e "> HTTP Server\tINBOUND\t${httpport}\ttcp" if [ "${ase}" == "Enabled" ]; then @@ -1266,7 +1266,7 @@ fn_info_message_mordhau(){ echo -e "netstat -atunp | grep Mord" echo -e "" { - echo -e "DESCRIPTION\tDIRECTION\tPORT\tPROTOCOL" + echo -e "${lightblue}DESCRIPTION\tDIRECTION\tPORT\tPROTOCOL${default}" echo -e "> Game\tINBOUND\t${port}\tudp" echo -e "> BeaconPort\tINBOUND\t${beaconport}\tudp" echo -e "> Query\tINBOUND\t${queryport}\tudp" @@ -1274,20 +1274,20 @@ fn_info_message_mordhau(){ } fn_info_message_barotrauma(){ - echo "netstat -atunp | grep /./Server.bin" + echo -e "netstat -atunp | grep /./Server.bin" echo -e "" { - echo -e "DESCRIPTION\tDIRECTION\tPORT\tPROTOCOL" + echo -e "${lightblue}DESCRIPTION\tDIRECTION\tPORT\tPROTOCOL${default}" echo -e "> Game\tINBOUND\t${port}\tudp" echo -e "> Query\tINBOUND\t$((port+1))\tudp" } | column -s $'\t' -t } fn_info_message_soldat() { - echo "netstat -atunp | grep soldat" + echo -e "netstat -atunp | grep soldat" echo -e "" { - echo -e "DESCRIPTION\tDIRECTION\tPORT\tPROTOCOL" + echo -e "${lightblue}DESCRIPTION\tDIRECTION\tPORT\tPROTOCOL${default}" echo -e "> Game\tINBOUND\t${port}\tudp" echo -e "> RCON\tINBOUND\t${port}\ttcp" echo -e "> FILES\tINBOUND\t$((port+10))\ttcp" @@ -1298,7 +1298,7 @@ fn_info_message_warfork(){ echo -e "netstat -atunp | grep wf_server" echo -e "" { - echo -e "DESCRIPTION\tDIRECTION\tPORT\tPROTOCOL" + echo -e "${lightblue}DESCRIPTION\tDIRECTION\tPORT\tPROTOCOL${default}" echo -e "> Game\tINBOUND\t${port}\tudp" echo -e "> HTTP\tINBOUND\t${httpport}\ttcp" } | column -s $'\t' -t diff --git a/lgsm/functions/install_complete.sh b/lgsm/functions/install_complete.sh index 18cfc16e5..63ba28d4f 100644 --- a/lgsm/functions/install_complete.sh +++ b/lgsm/functions/install_complete.sh @@ -8,12 +8,12 @@ local commandname="INSTALL" local commandaction="Install" local function_selfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" -echo "" -echo "=================================" -echo "Install Complete!" +echo -e "" +echo -e "=================================" +echo -e "Install Complete!" fn_script_log_info "Install Complete!" -echo "" -echo "To start server type:" -echo "./${selfname} start" -echo "" +echo -e "" +echo -e "To start server type:" +echo -e "./${selfname} start" +echo -e "" core_exit.sh diff --git a/lgsm/functions/install_config.sh b/lgsm/functions/install_config.sh index 69f9b4b6f..7cffbff4e 100644 --- a/lgsm/functions/install_config.sh +++ b/lgsm/functions/install_config.sh @@ -11,7 +11,7 @@ local function_selfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" # Checks if server cfg dir exists, creates it if it doesn't. fn_check_cfgdir(){ if [ ! -d "${servercfgdir}" ]; then - echo "creating ${servercfgdir} config directory." + echo -e "creating ${servercfgdir} config directory." fn_script_log_info "creating ${servercfgdir} config directory." mkdir -pv "${servercfgdir}" fi @@ -19,10 +19,10 @@ fn_check_cfgdir(){ # Downloads default configs from Game-Server-Configs repo to lgsm/config-default. fn_fetch_default_config(){ - echo "" - echo "Downloading ${gamename} Configs" - echo "=================================" - echo "default configs from https://github.com/GameServerManagers/Game-Server-Configs" + echo -e "" + echo -e "${lightyellow}Downloading ${gamename} Configs${default}" + echo -e "=================================" + echo -e "default configs from https://github.com/GameServerManagers/Game-Server-Configs" fn_sleep_time mkdir -p "${lgsmdir}/config-default/config-game" githuburl="https://raw.githubusercontent.com/GameServerManagers/Game-Server-Configs/master" @@ -35,7 +35,7 @@ fn_fetch_default_config(){ fn_default_config_remote(){ for config in "${array_configs[@]}"; do # every config is copied - echo "copying ${config} config file." + echo -e "copying ${config} config file." fn_script_log_info "copying ${servercfg} config file." if [ "${config}" == "${servercfgdefault}" ]; then mkdir -p "${servercfgdir}" @@ -55,7 +55,7 @@ fn_default_config_remote(){ # Copys local default config to server config location. fn_default_config_local(){ - echo "copying ${servercfgdefault} config file." + echo -e "copying ${servercfgdefault} config file." cp -nv "${servercfgfullpathdefault}" "${servercfgfullpath}" fn_sleep_time } @@ -68,7 +68,7 @@ fn_set_config_vars(){ random=$(tr -dc A-Za-z0-9_ < /dev/urandom | head -c 8 | xargs) servername="LinuxGSM" rconpass="admin${random}" - echo "changing hostname." + echo -e "changing hostname." fn_script_log_info "changing hostname." fn_sleep_time # prevents var from being overwritten with the servername. @@ -79,7 +79,7 @@ fn_set_config_vars(){ else sed -i "s/SERVERNAME/${servername}/g" "${servercfgfullpath}" fi - echo "changing rcon/admin password." + echo -e "changing rcon/admin password." fn_script_log_info "changing rcon/admin password." if [ "${shortname}" == "squad" ]; then sed -i "s/ADMINPASSWORD/${rconpass}/g" "${servercfgdir}/Rcon.cfg" @@ -89,7 +89,7 @@ fn_set_config_vars(){ fn_sleep_time else fn_script_log_warn "Config file not found, cannot alter it." - echo "Config file not found, cannot alter it." + echo -e "Config file not found, cannot alter it." fn_sleep_time fi } @@ -98,21 +98,21 @@ fn_set_config_vars(){ fn_set_dst_config_vars(){ ## cluster.ini if grep -Fq "SERVERNAME" "${clustercfgfullpath}"; then - echo "changing server name." + echo -e "changing server name." fn_script_log_info "changing server name." sed -i "s/SERVERNAME/LinuxGSM/g" "${clustercfgfullpath}" fn_sleep_time - echo "changing shard mode." + echo -e "changing shard mode." fn_script_log_info "changing shard mode." sed -i "s/USESHARDING/${sharding}/g" "${clustercfgfullpath}" fn_sleep_time - echo "randomizing cluster key." + echo -e "randomizing cluster key." fn_script_log_info "randomizing cluster key." randomkey=$(tr -dc A-Za-z0-9_ < /dev/urandom | head -c 8 | xargs) sed -i "s/CLUSTERKEY/${randomkey}/g" "${clustercfgfullpath}" fn_sleep_time else - echo "${clustercfg} is already configured." + echo -e "${clustercfg} is already configured." fn_script_log_info "${clustercfg} is already configured." fi @@ -125,23 +125,23 @@ fn_set_dst_config_vars(){ sed -i "/SHARDNAME/d" "${servercfgfullpath}" fi - echo "changing shard name." + echo -e "changing shard name." fn_script_log_info "changing shard name." sed -i "s/SHARDNAME/${shard}/g" "${servercfgfullpath}" fn_sleep_time - echo "changing master setting." + echo -e "changing master setting." fn_script_log_info "changing master setting." sed -i "s/ISMASTER/${master}/g" "${servercfgfullpath}" fn_sleep_time ## worldgenoverride.lua if [ "${cave}" == "true" ]; then - echo "defining ${shard} as cave in ${servercfgdir}/worldgenoverride.lua." + echo -e "defining ${shard} as cave in ${servercfgdir}/worldgenoverride.lua." fn_script_log_info "defining ${shard} as cave in ${servercfgdir}/worldgenoverride.lua." echo 'return { override_enabled = true, preset = "DST_CAVE", }' > "${servercfgdir}/worldgenoverride.lua" fi fn_sleep_time - echo "" + echo -e "" } if [ "${shortname}" == "sdtd" ]; then diff --git a/lgsm/functions/install_dst_token.sh b/lgsm/functions/install_dst_token.sh index 616a6469b..55e83ffe4 100644 --- a/lgsm/functions/install_dst_token.sh +++ b/lgsm/functions/install_dst_token.sh @@ -8,18 +8,18 @@ local commandname="INSTALL" local commandaction="Install" local function_selfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" -echo "" -echo "Enter ${gamename} Cluster Token" -echo "=================================" +echo -e "" +echo -e "${lightyellow}Enter ${gamename} Cluster Token${default}" +echo -e "=================================" fn_sleep_time -echo "A cluster token is required to run this server!" -echo "Follow the instructions in this link to obtain this key:" -echo "https://linuxgsm.com/dst-auth-token" -echo "" +echo -e "A cluster token is required to run this server!" +echo -e "Follow the instructions in this link to obtain this key:" +echo -e "https://linuxgsm.com/dst-auth-token" +echo -e "" if [ -z "${autoinstall}" ]; then overwritetoken="true" if [ -s "${clustercfgdir}/cluster_token.txt" ]; then - echo "The cluster token is already set. Do you want to overwrite it?" + echo -e "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" if fn_prompt_yn "Continue?" N; then overwritetoken="true" @@ -28,19 +28,19 @@ if [ -z "${autoinstall}" ]; then fi fi if [ "${overwritetoken}" == "true" ]; then - echo "Once you have the cluster token, enter it below" + echo -e "Once you have the cluster token, enter it below" echo -n "Cluster Token: " read -r token mkdir -pv "${clustercfgdir}" - echo "${token}" > "${clustercfgdir}/cluster_token.txt" + echo -e "${token}" > "${clustercfgdir}/cluster_token.txt" if [ -f "${clustercfgdir}/cluster_token.txt" ]; then - echo "Don't Starve Together cluster token created" + echo -e "Don't Starve Together cluster token created" fn_script_log_info "Don't Starve Together cluster token created" fi unset overwritetoken fi else - echo "You can add your cluster token using the following command" - echo "./${selfname} cluster-token" + echo -e "You can add your cluster token using the following command" + echo -e "./${selfname} cluster-token" fi -echo "" +echo -e "" diff --git a/lgsm/functions/install_eula.sh b/lgsm/functions/install_eula.sh index fca4838af..d7893b16c 100644 --- a/lgsm/functions/install_eula.sh +++ b/lgsm/functions/install_eula.sh @@ -12,26 +12,26 @@ elif [ "${shortname}" == "ut" ]; then eulaurl="https://www.epicgames.com/unrealtournament/unreal-tournament-pre-alpha-test-development-build-eula" fi -echo "" -echo "Accept ${gamename} EULA" -echo "=================================" +echo -e "" +echo -e "${lightyellow}Accept ${gamename} EULA${default}" +echo -e "=================================" fn_sleep_time -echo "You are required to accept the EULA:" -echo "${eulaurl}" -echo "" +echo -e "You are required to accept the EULA:" +echo -e "${eulaurl}" +echo -e "" if [ -z "${autoinstall}" ]; then - echo "By continuing you are indicating your agreement to the EULA." - echo "" + echo -e "By continuing you are indicating your agreement to the EULA." + echo -e "" if ! fn_prompt_yn "Continue?" Y; then core_exit.sh fi elif [ "${function_selfname}" == "command_start.sh" ]; then fn_print_info "By continuing you are indicating your agreement to the EULA." - echo "" + echo -e "" sleep 5 else - echo "By using auto-install you are indicating your agreement to the EULA." - echo "" + echo -e "By using auto-install you are indicating your agreement to the EULA." + echo -e "" sleep 5 fi @@ -39,7 +39,7 @@ if [ "${shortname}" == "ts3" ]; then touch "${executabledir}/.ts3server_license_accepted" elif [ "${shortname}" == "mc" ]; then touch "${serverfiles}/eula.txt" - echo "eula=true" > "${serverfiles}/eula.txt" + echo -e "eula=true" > "${serverfiles}/eula.txt" elif [ "${shortname}" == "ut" ]; then : fi diff --git a/lgsm/functions/install_factorio_save.sh b/lgsm/functions/install_factorio_save.sh index 804ef88e7..fd9e634a1 100644 --- a/lgsm/functions/install_factorio_save.sh +++ b/lgsm/functions/install_factorio_save.sh @@ -7,9 +7,9 @@ local commandname="INSTALL" local commandaction="Install" -echo "" -echo "Creating initial Factorio savefile" -echo "=================================" +echo -e "" +echo -e "${lightyellow}Creating initial Factorio savefile${default}" +echo -e "=================================" fn_sleep_time check_glibc.sh "${executabledir}"/factorio --create "${serverfiles}/save1" diff --git a/lgsm/functions/install_gslt.sh b/lgsm/functions/install_gslt.sh index 87fccae70..425fcb2b9 100644 --- a/lgsm/functions/install_gslt.sh +++ b/lgsm/functions/install_gslt.sh @@ -8,26 +8,26 @@ local commandname="INSTALL" local commandaction="Install" local function_selfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" -echo "" -echo "Game Server Login Token" -echo "=================================" +echo -e "" +echo -e "${lightyellow}Game Server Login Token${default}" +echo -e "=================================" fn_sleep_time if [ "${shortname}" == "csgo" ]||[ "${shortname}" == "css" ]||[ "${shortname}" == "nmrih" ]||[ "${shortname}" == "bs" ]; then - echo "GSLT is required to run a public ${gamename} server" + echo -e "GSLT is required to run a public ${gamename} server" fn_script_log_info "GSLT is required to run a public ${gamename} server" else - echo "GSLT is an optional feature for ${gamename} server" + echo -e "GSLT is an optional feature for ${gamename} server" fn_script_log_info "GSLT is an optional feature for ${gamename} server" fi -echo "Get more info and a token here:" -echo "https://linuxgsm.com/gslt" +echo -e "Get more info and a token here:" +echo -e "https://linuxgsm.com/gslt" fn_script_log_info "Get more info and a token here:" fn_script_log_info "https://linuxgsm.com/gslt" -echo "" +echo -e "" if [ -z "${autoinstall}" ]; then if [ "${shortname}" != "tu" ]; then - echo "Enter token below (Can be blank)." + echo -e "Enter token below (Can be blank)." echo -n "GSLT TOKEN: " read -r token if ! grep -q "^gslt=" "${configdirserver}/${servicename}.cfg" > /dev/null 2>&1; then @@ -39,10 +39,10 @@ if [ -z "${autoinstall}" ]; then fi fn_sleep_time if [ "${shortname}" == "tu" ]; then - echo "The GSLT can be changed by editing ${servercfgdir}/${servercfg}." + echo -e "The GSLT can be changed by editing ${servercfgdir}/${servercfg}." fn_script_log_info "The GSLT can be changed by editing ${servercfgdir}/${servercfg}." else - echo "The GSLT can be changed by editing ${configdirserver}/${servicename}.cfg." + echo -e "The GSLT can be changed by editing ${configdirserver}/${servicename}.cfg." fn_script_log_info "The GSLT can be changed by editing ${configdirserver}/${servicename}.cfg." fi -echo "" +echo -e "" diff --git a/lgsm/functions/install_header.sh b/lgsm/functions/install_header.sh index 40c2845fc..0b5febae1 100644 --- a/lgsm/functions/install_header.sh +++ b/lgsm/functions/install_header.sh @@ -9,10 +9,14 @@ local commandaction="Install" local function_selfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" clear -echo "=================================" -echo "LinuxGSM - ${gamename}" -echo "by Daniel Gibbs" -echo "Website: https://linuxgsm.com" -echo "Contributors: https://linuxgsm.com/contrib" -echo "Donate: https://linuxgsm.com/donate" -echo "=================================" +fn_print_ascii_logo +fn_sleep_time +echo -e "=================================" +echo -e "${lightyellow}Linux${default}GSM_" +echo -e "by Daniel Gibbs" +echo -e "${lightblue}Game:${default}${gamename}" +echo -e "${lightblue}Website:${default} https://linuxgsm.com" +echo -e "${lightblue}Contributors:${default} https://linuxgsm.com/contrib" +echo -e "${lightblue}Donate:${default} https://linuxgsm.com/donate" +echo -e "=================================" +fn_sleep_time diff --git a/lgsm/functions/install_logs.sh b/lgsm/functions/install_logs.sh index c886c9140..996e05f93 100644 --- a/lgsm/functions/install_logs.sh +++ b/lgsm/functions/install_logs.sh @@ -9,9 +9,9 @@ local commandaction="Install" local function_selfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" if [ "${checklogs}" != "1" ]; then - echo "" - echo "Creating log directories" - echo "=================================" + echo -e "" + echo -e "${lightyellow}Creating log directories${default}" + echo -e "=================================" fi fn_sleep_time # Create LinuxGSM logs. diff --git a/lgsm/functions/install_mta_resources.sh b/lgsm/functions/install_mta_resources.sh index b4ff2bece..d21de7f9c 100644 --- a/lgsm/functions/install_mta_resources.sh +++ b/lgsm/functions/install_mta_resources.sh @@ -10,5 +10,5 @@ local commandaction="Install" local function_selfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" 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" +echo -e " * install default resources using ./${selfname} install-default-resources" +echo -e " * download resources from https://community.multitheftauto.com" diff --git a/lgsm/functions/install_server_dir.sh b/lgsm/functions/install_server_dir.sh index cd8fe8c21..ee918c0e5 100644 --- a/lgsm/functions/install_server_dir.sh +++ b/lgsm/functions/install_server_dir.sh @@ -8,15 +8,15 @@ local commandname="INSTALL" local commandaction="Install" local function_selfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" -echo "" -echo "Server Directory" -echo "=================================" +echo -e "" +echo -e "${lightyellow}Server Directory${default}" +echo -e "=================================" fn_sleep_time if [ -d "${serverfiles}" ]; then fn_print_warning_nl "A server is already installed here." fi pwd -echo "" +echo -e "" if [ -z "${autoinstall}" ]; then if ! fn_prompt_yn "Continue?" Y; then exit diff --git a/lgsm/functions/install_server_files.sh b/lgsm/functions/install_server_files.sh index b608e825f..73c375fbb 100644 --- a/lgsm/functions/install_server_files.sh +++ b/lgsm/functions/install_server_files.sh @@ -88,7 +88,7 @@ fn_install_server_files_steamcmd(){ fi if [ "${counter}" -ge "7" ]; then - echo "Removing $(find "${serverfiles}" -type d -print0 | grep -Ez '[^/]{30}$')" + echo -e "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 @@ -139,9 +139,9 @@ fn_install_server_files_steamcmd(){ fi } -echo "" -echo "Installing ${gamename} Server" -echo "=================================" +echo -e "" +echo -e "${lightyellow}Installing ${gamename} Server${default}" +echo -e "=================================" fn_sleep_time if [ -n "${appid}" ]; then @@ -168,8 +168,8 @@ elif [ -z "${appid}" ]||[ "${shortname}" == "ahl" ]||[ "${shortname}" == "bd" ]| fi if [ -z "${autoinstall}" ]; then - echo "" - echo "=================================" + echo -e "" + echo -e "=================================" if ! fn_prompt_yn "Was the install successful?" Y; then install_retry.sh fi diff --git a/lgsm/functions/install_squad_license.sh b/lgsm/functions/install_squad_license.sh index f5d5dc457..b1e15e419 100644 --- a/lgsm/functions/install_squad_license.sh +++ b/lgsm/functions/install_squad_license.sh @@ -8,19 +8,19 @@ local commandname="INSTALL" local commandaction="Install" local function_selfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" -echo "" -echo "Squad Server License" -echo "=================================" +echo -e "" +echo -e "${lightyellow}Squad Server License${default}" +echo -e "=================================" fn_sleep_time -echo "Server license is an optional feature for ${gamename} server" +echo -e "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/" +echo -e "Get more info and a server license here:" +echo -e "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 "" +echo -e "" fn_sleep_time -echo "The Squad server license can be changed by editing ${servercfgdir}/License.cfg." +echo -e "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 "" +echo -e "" diff --git a/lgsm/functions/install_steamcmd.sh b/lgsm/functions/install_steamcmd.sh index 4b24c4274..e56c9b8aa 100644 --- a/lgsm/functions/install_steamcmd.sh +++ b/lgsm/functions/install_steamcmd.sh @@ -7,8 +7,8 @@ local commandname="INSTALL" local commandaction="Install" -echo "" -echo "Installing SteamCMD" -echo "=================================" +echo -e "" +echo -e "${lightyellow}Installing SteamCMD${default}" +echo -e "=================================" fn_sleep_time check_steamcmd.sh diff --git a/lgsm/functions/install_ts3db.sh b/lgsm/functions/install_ts3db.sh index 6fbe45724..cd2ef8653 100644 --- a/lgsm/functions/install_ts3db.sh +++ b/lgsm/functions/install_ts3db.sh @@ -24,9 +24,9 @@ fn_install_ts3db_mariadb(){ fi fi - echo "" - echo "Configure ${gamename} Server for MariaDB" - echo "=================================" + echo -e "" + echo -e "${lightyellow}Configure ${gamename} Server for MariaDB${default}" + echo -e "=================================" fn_sleep_time read -rp "Enter MariaDB hostname: " mariahostname read -rp "Enter MariaDB port: " mariaport @@ -36,24 +36,24 @@ fn_install_ts3db_mariadb(){ read -rp "Enter MariaDB socket path: " mariadbsocket { - echo "[config]" - echo "host='${mariahostname}'" - echo "port='${mariaport}'" - echo "username='${mariausername}'" - echo "password='${mariapassword}'" - echo "database='${mariadbname}'" - echo "socket='${mariadbsocket}'" + echo -e "[config]" + echo -e "host='${mariahostname}'" + echo -e "port='${mariaport}'" + echo -e "username='${mariausername}'" + echo -e "password='${mariapassword}'" + echo -e "database='${mariadbname}'" + echo -e "socket='${mariadbsocket}'" } >> "${servercfgdir}/ts3db_mariadb.ini" sed -i "s/dbplugin=ts3db_sqlite3/dbplugin=ts3db_mariadb/g" "${servercfgfullpath}" sed -i "s/dbpluginparameter=/dbpluginparameter=ts3db_mariadb.ini/g" "${servercfgfullpath}" sed -i "s/dbsqlcreatepath=create_sqlite\//dbsqlcreatepath=create_mariadb\//g" "${servercfgfullpath}" - echo "updating ts3db_mariadb.ini." + echo -e "updating ts3db_mariadb.ini." fn_sleep_time } -echo "" -echo "Select Database" -echo "=================================" +echo -e "" +echo -e "${lightyellow}Select Database${default}" +echo -e "=================================" fn_sleep_time if [ -z "${autoinstall}" ]; then if fn_prompt_yn "Do you want to use MariaDB instead of sqlite? (MariaDB must be pre-configured)" N; then @@ -65,9 +65,9 @@ fi install_eula.sh -echo "" -echo "Getting privilege key" -echo "=================================" +echo -e "" +echo -e "${lightyellow}Getting privilege key${default}" +echo -e "=================================" fn_sleep_time fn_print_information_nl "Save these details for later." cd "${executabledir}" || exit diff --git a/lgsm/functions/install_ut2k4_key.sh b/lgsm/functions/install_ut2k4_key.sh index 79066167e..ea9f0ac82 100644 --- a/lgsm/functions/install_ut2k4_key.sh +++ b/lgsm/functions/install_ut2k4_key.sh @@ -8,24 +8,24 @@ local commandname="INSTALL" local commandaction="Install" local function_selfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" -echo "" -echo "Enter ${gamename} CD Key" -echo "=================================" +echo -e "" +echo -e "${lightyellow}Enter ${gamename} CD Key${default}" +echo -e "=================================" fn_sleep_time -echo "To get your server listed on the Master Server list" -echo "you must get a free CD key. Get a key here:" -echo "https://www.epicgames.com/unrealtournament/forums/cdkey.php?2004" -echo "" +echo -e "To get your server listed on the Master Server list" +echo -e "you must get a free CD key. Get a key here:" +echo -e "https://www.epicgames.com/unrealtournament/forums/cdkey.php?2004" +echo -e "" if [ -z "${autoinstall}" ]; then - echo "Once you have the key enter it below" + echo -e "Once you have the key enter it below" echo -n "KEY: " read -r CODE - echo ""\""CDKey"\""="\""${CODE}"\""" > "${systemdir}/cdkey" + echo -e ""\""CDKey"\""="\""${CODE}"\""" > "${systemdir}/cdkey" if [ -f "${systemdir}/cdkey" ]; then fn_script_log_info "UT2K4 Server CD Key created" fi else - echo "You can add your key using the following command" - echo "./${selfname} server-cd-key" + echo -e "You can add your key using the following command" + echo -e "./${selfname} server-cd-key" fi -echo "" +echo -e "" diff --git a/lgsm/functions/mods_core.sh b/lgsm/functions/mods_core.sh index 02d95c2f0..f0b056b28 100644 --- a/lgsm/functions/mods_core.sh +++ b/lgsm/functions/mods_core.sh @@ -46,7 +46,7 @@ fn_mod_lowercase(){ 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" + [ ! -e "${dst}" ] && mv -T "${src}" "${dst}" || echo -e "${src} was not renamed" local exitcode=$? ((renamedwc++)) fi @@ -105,7 +105,7 @@ fn_mod_copy_destination(){ # Add the mod to the installed-mods.txt. fn_mod_add_list(){ if [ ! -n "$(sed -n "/^${modcommand}$/p" "${modsinstalledlistfullpath}")" ]; then - echo "${modcommand}" >> "${modsinstalledlistfullpath}" + echo -e "${modcommand}" >> "${modsinstalledlistfullpath}" fn_script_log_info "${modcommand} added to ${modsinstalledlist}" fi } @@ -122,11 +122,11 @@ fn_mod_tidy_files_list(){ 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 }')" + removefromlistamount="$(echo -e "${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 }')" + removefilevar="$(echo -e "${removefromlist}" | awk -F ';' -v x=${filesindex} '{ print $x }')" # Delete line(s) matching exactly. sed -i "/^${removefilevar}$/d" "${modsdir}/${modcommand}-files.txt" # Exit on error. @@ -228,7 +228,7 @@ 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" + echo -e "* https://github.com/GameServerManagers/LinuxGSM/issues" core_exit.sh fi modcommand="${mods_global_array[index+1]}" @@ -306,11 +306,11 @@ fn_compatible_mod_games(){ # 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 }')" + gamesamount="$(echo -e "${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 }' )" + gamemodtest="$( echo -e "${modgames}" | awk -F ';' -v x=${gamevarindex} '{ print $x }' )" # If game name matches. if [ "${gamemodtest}" == "${gamename}" ]; then # Mod is compatible. @@ -327,11 +327,11 @@ fn_compatible_mod_engines(){ # 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 }')" + enginesamount="$(echo -e "${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 }' )" + enginemodtest="$( echo -e "${modengines}" | awk -F ';' -v x=${gamevarindex} '{ print $x }' )" # If engine name matches. if [ "${enginemodtest}" == "${engine}" ]; then # Mod is compatible. @@ -348,11 +348,11 @@ fn_not_compatible_mod_games(){ # 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 }')" + excludegamesamount="$(echo -e "${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 }' )" + excludegamemodtest="$( echo -e "${modexcludegames}" | awk -F ';' -v x=${gamevarindex} '{ print $x }' )" # If engine name matches. if [ "${excludegamemodtest}" == "${gamename}" ]; then # Mod is compatible. @@ -473,9 +473,9 @@ fn_mods_check_installed(){ fn_mods_count_installed # If no mods are found. if [ ${installedmodscount} -eq 0 ]; then - echo "" + echo -e "" fn_print_failure_nl "No installed mods or addons were found" - echo " * Install mods using LinuxGSM first with: ./${selfname} mods-install" + echo -e " * Install mods using LinuxGSM first with: ./${selfname} mods-install" fn_script_log_error "No installed mods or addons were found." core_exit.sh fi @@ -490,7 +490,7 @@ fn_check_mod_files_list(){ # If file list is empty. if [ "${modsfilelistsize}" -eq 0 ]; then fn_print_failure "${modcommand}-files.txt is empty" - echo "* Unable to remove ${modprettyname}" + echo -e "* Unable to remove ${modprettyname}" fn_script_log_fatal "${modcommand}-files.txt is empty: Unable to remove ${modprettyname}." core_exit.sh fi diff --git a/lgsm/functions/mods_list.sh b/lgsm/functions/mods_list.sh index 0be790e7b..19ce5abb0 100644 --- a/lgsm/functions/mods_list.sh +++ b/lgsm/functions/mods_list.sh @@ -33,7 +33,7 @@ steamworksdownloadurl="${steamworksscrapeurl}/${steamworkslatestfile}" steamworksurl="${steamworksdownloadurl}" # CS:GO Mods get5scrapepath="$(curl -sL https://ci.splewis.net/job/get5/lastSuccessfulBuild/api/xml | grep -oP "\K(.+)(?=)")" -get5latestfile="$(echo "${get5scrapepath}" | xargs -n 1 -I @ sh -c "echo "basename "@""")" +get5latestfile="$(echo -e "${get5scrapepath}" | xargs -n 1 -I @ sh -c "echo -e "basename "@""")" get5downloadurl="https://ci.splewis.net/job/get5/lastSuccessfulBuild/artifact/${get5scrapepath}" get5url="${get5downloadurl}" # Oxide diff --git a/lgsm/functions/query_gamedig.sh b/lgsm/functions/query_gamedig.sh index 9438e4584..0a256bcab 100644 --- a/lgsm/functions/query_gamedig.sh +++ b/lgsm/functions/query_gamedig.sh @@ -82,26 +82,26 @@ if [ "$(command -v gamedig 2>/dev/null)" ]&&[ "$(command -v jq 2>/dev/null)" ]; check_status.sh if [ "${status}" != "0" ]; then # checks if query is working null = pass. - gamedigcmd=$(echo "gamedig --type \"${gamedigengine}\" --host \"${ip}\" --query_port \"${queryport}\"|jq") + gamedigcmd=$(echo -e "gamedig --type \"${gamedigengine}\" --host \"${ip}\" --query_port \"${queryport}\"|jq") gamedigraw=$(gamedig --type "${gamedigengine}" --host "${ip}" --query_port "${queryport}") - querystatus=$(echo "${gamedigraw}" | jq '.error|length') + querystatus=$(echo -e "${gamedigraw}" | jq '.error|length') if [ "${querystatus}" != "null" ]; then - gamedigcmd=$(echo "gamedig --type \"${gamedigengine}\" --host \"${ip}\" --port \"${queryport}\"|jq") + gamedigcmd=$(echo -e "gamedig --type \"${gamedigengine}\" --host \"${ip}\" --port \"${queryport}\"|jq") gamedigraw=$(gamedig --type "${gamedigengine}" --host "${ip}" --port "${queryport}") - querystatus=$(echo "${gamedigraw}" | jq '.error|length') + querystatus=$(echo -e "${gamedigraw}" | jq '.error|length') fi # server name. - gdname=$(echo "${gamedigraw}" | jq -re '.name') + gdname=$(echo -e "${gamedigraw}" | jq -re '.name') if [ "${gdname}" == "null" ]; then unset gdname fi # numplayers. - gdplayers=$(echo "${gamedigraw}" | jq -re '.players') + gdplayers=$(echo -e "${gamedigraw}" | jq -re '.players') if [ "${gdplayers}" == "null" ]; then unset gdplayers elif [ "${gdplayers}" == "[]" ]; then @@ -109,7 +109,7 @@ if [ "$(command -v gamedig 2>/dev/null)" ]&&[ "$(command -v jq 2>/dev/null)" ]; fi # maxplayers. - gdmaxplayers=$(echo "${gamedigraw}" | jq -re '.maxplayers') + gdmaxplayers=$(echo -e "${gamedigraw}" | jq -re '.maxplayers') if [ "${gdmaxplayers}" == "null" ]; then unset maxplayers elif [ "${gdmaxplayers}" == "[]" ]; then @@ -117,19 +117,19 @@ if [ "$(command -v gamedig 2>/dev/null)" ]&&[ "$(command -v jq 2>/dev/null)" ]; fi # current map. - gdmap=$(echo "${gamedigraw}" | jq -re '.map') + gdmap=$(echo -e "${gamedigraw}" | jq -re '.map') if [ "${gdmap}" == "null" ]; then unset gdmap fi # current gamemode. - gdgamemode=$(echo "${gamedigraw}" | jq -re '.raw.rules.GameMode_s') + gdgamemode=$(echo -e "${gamedigraw}" | jq -re '.raw.rules.GameMode_s') if [ "${gdgamemode}" == "null" ]; then unset gdgamemode fi # numbots. - gdbots=$(echo "${gamedigraw}" | jq -re '.raw.numbots') + gdbots=$(echo -e "${gamedigraw}" | jq -re '.raw.numbots') if [ "${gdbots}" == "null" ]||[ "${gdbots}" == "0" ]; then unset gdbots fi diff --git a/lgsm/functions/update_factorio.sh b/lgsm/functions/update_factorio.sh index c6d27ee65..fc79cde2d 100644 --- a/lgsm/functions/update_factorio.sh +++ b/lgsm/functions/update_factorio.sh @@ -68,8 +68,8 @@ fn_update_factorio_remotebuild(){ fn_update_factorio_compare(){ fn_print_dots "Checking for update: ${remotelocation}" # Removes dots so if statement can compare version numbers. - localbuilddigit=$(echo "${localbuild}" | tr -cd '[:digit:]') - remotebuilddigit=$(echo "${remotebuild}" | tr -cd '[:digit:]') + localbuilddigit=$(echo -e "${localbuild}" | tr -cd '[:digit:]') + remotebuilddigit=$(echo -e "${remotebuild}" | tr -cd '[:digit:]') if [ "${localbuilddigit}" -ne "${remotebuilddigit}" ]||[ "${forceupdate}" == "1" ]; then fn_print_ok_nl "Checking for update: ${remotelocation}" echo -en "\n" diff --git a/lgsm/functions/update_minecraft.sh b/lgsm/functions/update_minecraft.sh index 8fa3ef40a..e75a38dcc 100644 --- a/lgsm/functions/update_minecraft.sh +++ b/lgsm/functions/update_minecraft.sh @@ -123,8 +123,8 @@ fn_update_minecraft_remotebuild(){ fn_update_minecraft_compare(){ # Removes dots so if statement can compare version numbers. fn_print_dots "Checking for update: ${remotelocation}" - localbuilddigit=$(echo "${localbuild}" | tr -cd '[:digit:]') - remotebuilddigit=$(echo "${remotebuild}" | tr -cd '[:digit:]') + localbuilddigit=$(echo -e "${localbuild}" | tr -cd '[:digit:]') + remotebuilddigit=$(echo -e "${remotebuild}" | tr -cd '[:digit:]') if [ "${localbuilddigit}" -ne "${remotebuilddigit}" ]||[ "${forceupdate}" == "1" ]; then fn_print_ok_nl "Checking for update: ${remotelocation}" echo -en "\n" diff --git a/lgsm/functions/update_mta.sh b/lgsm/functions/update_mta.sh index 935ab474e..95461ab04 100644 --- a/lgsm/functions/update_mta.sh +++ b/lgsm/functions/update_mta.sh @@ -127,8 +127,8 @@ fn_update_mta_remotebuild(){ fn_update_mta_compare(){ # Removes dots so if statement can compare version numbers. fn_print_dots "Checking for update: ${remotelocation}" - localbuilddigit=$(echo "${localbuild}" | tr -cd '[:digit:]') - remotebuilddigit=$(echo "${remotebuild}" | tr -cd '[:digit:]') + localbuilddigit=$(echo -e "${localbuild}" | tr -cd '[:digit:]') + remotebuilddigit=$(echo -e "${remotebuild}" | tr -cd '[:digit:]') if [ "${localbuilddigit}" -ne "${remotebuilddigit}" ]||[ "${forceupdate}" == "1" ]; then fn_print_ok_nl "Checking for update: ${remotelocation}" if [ "${forceupdate}" == "1" ]; then diff --git a/lgsm/functions/update_mumble.sh b/lgsm/functions/update_mumble.sh index eb0bdcda3..9dd504ad0 100644 --- a/lgsm/functions/update_mumble.sh +++ b/lgsm/functions/update_mumble.sh @@ -68,8 +68,8 @@ fn_update_mumble_remotebuild(){ fn_update_mumble_compare(){ # Removes dots so if statement can compare version numbers. fn_print_dots "Checking for update: ${remotelocation}" - localbuilddigit=$(echo "${localbuild}" | tr -cd '[:digit:]') - remotebuilddigit=$(echo "${remotebuild}" | tr -cd '[:digit:]') + localbuilddigit=$(echo -e "${localbuild}" | tr -cd '[:digit:]') + remotebuilddigit=$(echo -e "${remotebuild}" | tr -cd '[:digit:]') if [ "${localbuilddigit}" -ne "${remotebuilddigit}" ]||[ "${forceupdate}" == "1" ]; then fn_print_ok_nl "Checking for update: ${remotelocation}" echo -en "\n" diff --git a/lgsm/functions/update_steamcmd.sh b/lgsm/functions/update_steamcmd.sh index 9185617f8..b27884513 100644 --- a/lgsm/functions/update_steamcmd.sh +++ b/lgsm/functions/update_steamcmd.sh @@ -160,9 +160,9 @@ fn_appmanifest_check(){ if [ "${appmanifestfilewc}" -ge "2" ]; then fn_print_fail "Unable to remove x${appmanifestfilewc} appmanifest_${appid}.acf files" fn_script_log_fatal "Unable to remove x${appmanifestfilewc} appmanifest_${appid}.acf files" - echo " * Check user permissions" + echo -e " * Check user permissions" for appfile in ${appmanifestfile}; do - echo " ${appfile}" + echo -e " ${appfile}" done core_exit.sh else diff --git a/lgsm/functions/update_ts3.sh b/lgsm/functions/update_ts3.sh index 31a015e6e..18768997c 100644 --- a/lgsm/functions/update_ts3.sh +++ b/lgsm/functions/update_ts3.sh @@ -132,8 +132,8 @@ fn_update_ts3_remotebuild(){ fn_update_ts3_compare(){ # Removes dots so if statement can compare version numbers. fn_print_dots "Checking for update: ${remotelocation}" - localbuilddigit=$(echo "${localbuild}" | tr -cd '[:digit:]') - remotebuilddigit=$(echo "${remotebuild}" | tr -cd '[:digit:]') + localbuilddigit=$(echo -e "${localbuild}" | tr -cd '[:digit:]') + remotebuilddigit=$(echo -e "${remotebuild}" | tr -cd '[:digit:]') if [ "${localbuilddigit}" -ne "${remotebuilddigit}" ]||[ "${forceupdate}" == "1" ]; then fn_print_ok_nl "Checking for update: ${remotelocation}" echo -en "\n" diff --git a/linuxgsm.sh b/linuxgsm.sh index 143493712..c7f802b6f 100755 --- a/linuxgsm.sh +++ b/linuxgsm.sh @@ -84,14 +84,14 @@ fn_bootstrap_fetch_file(){ echo -e "FAIL" if [ -f "${lgsmlog}" ]; then echo -e "${remote_fileurl}" | tee -a "${lgsmlog}" - echo "${curlcmd}" | tee -a "${lgsmlog}" + echo -e "${curlcmd}" | tee -a "${lgsmlog}" fi exit 1 else echo -e "OK" fi else - echo "[ FAIL ] Curl is not installed" + echo -e "[ FAIL ] Curl is not installed" exit 1 fi # Make file chmodx if chmodx is set. @@ -149,7 +149,7 @@ fn_install_menu_bash() { fn_print_horizontal menu_options=() while read -r line || [[ -n "${line}" ]]; do - var=$(echo "${line}" | awk -F "," '{print $2 " - " $3}') + var=$(echo -e "${line}" | awk -F "," '{print $2 " - " $3}') menu_options+=( "${var}" ) done < "${options}" menu_options+=( "Cancel" ) @@ -174,8 +174,8 @@ fn_install_menu_whiptail() { IFS="," menu_options=() while read -r line; do - key=$(echo "${line}" | awk -F "," '{print $3}') - val=$(echo "${line}" | awk -F "," '{print $2}') + key=$(echo -e "${line}" | awk -F "," '{print $3}') + val=$(echo -e "${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) @@ -220,10 +220,10 @@ fn_server_info(){ fn_install_getopt(){ userinput="empty" - echo "Usage: $0 [option]" + echo -e "Usage: $0 [option]" echo -e "" - echo "Installer - Linux Game Server Managers - Version ${version}" - echo "https://linuxgsm.com" + echo -e "Installer - Linux Game Server Managers - Version ${version}" + echo -e "https://linuxgsm.com" echo -e "" echo -e "Commands" echo -e "install\t\t| Select server to install." @@ -244,15 +244,15 @@ fn_install_file(){ cp -R "${selfname}" "${local_filename}" sed -i -e "s/shortname=\"core\"/shortname=\"${shortname}\"/g" "${local_filename}" sed -i -e "s/gameservername=\"core\"/gameservername=\"${gameservername}\"/g" "${local_filename}" - echo "Installed ${gamename} server as ${local_filename}" - echo "" + echo -e "Installed ${gamename} server as ${local_filename}" + echo -e "" if [ ! -d "${serverfiles}" ]; then - echo "./${local_filename} install" + echo -e "./${local_filename} install" else - echo "Remember to check server ports" - echo "./${local_filename} details" + echo -e "Remember to check server ports" + echo -e "./${local_filename} details" fi - echo "" + echo -e "" exit } @@ -260,11 +260,11 @@ fn_install_file(){ if [ "$(whoami)" == "root" ]; then if [ "${userinput}" == "install" ]||[ "${userinput}" == "auto-install" ]||[ "${userinput}" == "i" ]||[ "${userinput}" == "ai" ]; then if [ "${shortname}" == "core" ]; then - echo "[ FAIL ] Do NOT run this script as root!" + echo -e "[ FAIL ] Do NOT run this script as root!" exit 1 fi elif [ ! -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!" + echo -e "[ FAIL ] Do NOT run this script as root!" exit 1 else core_functions.sh @@ -277,7 +277,7 @@ if [ "${shortname}" == "core" ]; then # Download the latest serverlist. This is the complete list of all supported servers. fn_bootstrap_fetch_file_github "lgsm/data" "serverlist.csv" "${datadir}" "nochmodx" "norun" "forcedl" "nomd5" if [ ! -f "${serverlist}" ]; then - echo "[ FAIL ] serverlist.csv could not be loaded." + echo -e "[ FAIL ] serverlist.csv could not be loaded." exit 1 fi @@ -294,18 +294,18 @@ if [ "${shortname}" == "core" ]; then if [ "${result}" == "${gameservername}" ]; then fn_install_file elif [ "${result}" == "" ]; then - echo "Install canceled" + echo -e "Install canceled" else - echo "[ FAIL ] menu result does not match gameservername" - echo "result: ${result}" - echo "gameservername: ${gameservername}" + echo -e "[ FAIL ] menu result does not match gameservername" + echo -e "result: ${result}" + echo -e "gameservername: ${gameservername}" fi elif [ -n "${userinput}" ]; then fn_server_info if [ "${userinput}" == "${gameservername}" ]||[ "${userinput}" == "${gamename}" ]||[ "${userinput}" == "${shortname}" ]; then fn_install_file else - echo "[ FAIL ] unknown game server" + echo -e "[ FAIL ] unknown game server" fi else fn_install_getopt diff --git a/tests/tests_fctrserver.sh b/tests/tests_fctrserver.sh index 6c74712cc..2496cbcda 100644 --- a/tests/tests_fctrserver.sh +++ b/tests/tests_fctrserver.sh @@ -95,14 +95,14 @@ fn_bootstrap_fetch_file(){ echo -e "FAIL" if [ -f "${lgsmlog}" ]; then echo -e "${remote_fileurl}" | tee -a "${lgsmlog}" - echo "${curlcmd}" | tee -a "${lgsmlog}" + echo -e "${curlcmd}" | tee -a "${lgsmlog}" fi exit 1 else echo -e "OK" fi else - echo "[ FAIL ] Curl is not installed" + echo -e "[ FAIL ] Curl is not installed" exit 1 fi # Make file chmodx if chmodx is set. @@ -160,7 +160,7 @@ fn_install_menu_bash() { fn_print_horizontal menu_options=() while read -r line || [[ -n "${line}" ]]; do - var=$(echo "${line}" | awk -F "," '{print $2 " - " $3}') + var=$(echo -e "${line}" | awk -F "," '{print $2 " - " $3}') menu_options+=( "${var}" ) done < "${options}" menu_options+=( "Cancel" ) @@ -185,8 +185,8 @@ fn_install_menu_whiptail() { IFS="," menu_options=() while read -r line; do - key=$(echo "${line}" | awk -F "," '{print $3}') - val=$(echo "${line}" | awk -F "," '{print $2}') + key=$(echo -e "${line}" | awk -F "," '{print $3}') + val=$(echo -e "${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) @@ -231,10 +231,10 @@ fn_server_info(){ fn_install_getopt(){ userinput="empty" - echo "Usage: $0 [option]" + echo -e "Usage: $0 [option]" echo -e "" - echo "Installer - Linux Game Server Managers - Version ${version}" - echo "https://linuxgsm.com" + echo -e "Installer - Linux Game Server Managers - Version ${version}" + echo -e "https://linuxgsm.com" echo -e "" echo -e "Commands" echo -e "install\t\t| Select server to install." @@ -255,15 +255,15 @@ fn_install_file(){ cp -R "${selfname}" "${local_filename}" sed -i -e "s/shortname=\"core\"/shortname=\"${shortname}\"/g" "${local_filename}" sed -i -e "s/gameservername=\"core\"/gameservername=\"${gameservername}\"/g" "${local_filename}" - echo "Installed ${gamename} server as ${local_filename}" - echo "" + echo -e "Installed ${gamename} server as ${local_filename}" + echo -e "" if [ ! -d "${serverfiles}" ]; then - echo "./${local_filename} install" + echo -e "./${local_filename} install" else - echo "Remember to check server ports" - echo "./${local_filename} details" + echo -e "Remember to check server ports" + echo -e "./${local_filename} details" fi - echo "" + echo -e "" exit } @@ -271,11 +271,11 @@ fn_install_file(){ if [ "$(whoami)" == "root" ]; then if [ "${userinput}" == "install" ]||[ "${userinput}" == "auto-install" ]||[ "${userinput}" == "i" ]||[ "${userinput}" == "ai" ]; then if [ "${shortname}" == "core" ]; then - echo "[ FAIL ] Do NOT run this script as root!" + echo -e "[ FAIL ] Do NOT run this script as root!" exit 1 fi elif [ ! -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!" + echo -e "[ FAIL ] Do NOT run this script as root!" exit 1 else core_functions.sh @@ -286,7 +286,7 @@ fi # Download the latest serverlist. This is the complete list of all supported servers. fn_bootstrap_fetch_file_github "lgsm/data" "serverlist.csv" "${datadir}" "nochmodx" "norun" "forcedl" "nomd5" if [ ! -f "${serverlist}" ]; then - echo "[ FAIL ] serverlist.csv could not be loaded." + echo -e "[ FAIL ] serverlist.csv could not be loaded." exit 1 fi @@ -305,18 +305,18 @@ if [ "${shortname}" == "core" ]; then if [ "${result}" == "${gameservername}" ]; then fn_install_file elif [ "${result}" == "" ]; then - echo "Install canceled" + echo -e "Install canceled" else - echo "[ FAIL ] menu result does not match gameservername" - echo "result: ${result}" - echo "gameservername: ${gameservername}" + echo -e "[ FAIL ] menu result does not match gameservername" + echo -e "result: ${result}" + echo -e "gameservername: ${gameservername}" fi elif [ -n "${userinput}" ]; then fn_server_info if [ "${userinput}" == "${gameservername}" ]||[ "${userinput}" == "${gamename}" ]||[ "${userinput}" == "${shortname}" ]; then fn_install_file else - echo "[ FAIL ] unknown game server" + echo -e "[ FAIL ] unknown game server" fi else fn_install_getopt @@ -410,9 +410,9 @@ fn_currentstatus_ts3(){ fn_setstatus(){ fn_currentstatus_tmux echo"" - echo "Required status: ${requiredstatus}" + echo -e "Required status: ${requiredstatus}" counter=0 - echo "Current status: ${currentstatus}" + echo -e "Current status: ${currentstatus}" while [ "${requiredstatus}" != "${currentstatus}" ]; do counter=$((counter+1)) fn_currentstatus_tmux @@ -425,16 +425,16 @@ fn_setstatus(){ fi if [ "${counter}" -gt "5" ]; then currentstatus="FAIL" - echo "Current status: ${currentstatus}" - echo "" - echo "Unable to start or stop server." + echo -e "Current status: ${currentstatus}" + echo -e "" + echo -e "Unable to start or stop server." exit 1 fi done echo -en "New status: ${currentstatus}\\r" echo -e "\n" - echo "Test starting:" - echo "" + echo -e "Test starting:" + echo -e "" } # End of every test will expect the result to either pass or fail @@ -442,88 +442,88 @@ fn_setstatus(){ # if expecting a pass fn_test_result_pass(){ if [ $? != 0 ]; then - echo "=================================" - echo "Expected result: PASS" - echo "Actual result: FAIL" + echo -e "=================================" + echo -e "Expected result: PASS" + echo -e "Actual result: FAIL" fn_print_fail_nl "TEST FAILED" exitcode=1 core_exit.sh else - echo "=================================" - echo "Expected result: PASS" - echo "Actual result: PASS" + echo -e "=================================" + echo -e "Expected result: PASS" + echo -e "Actual result: PASS" fn_print_ok_nl "TEST PASSED" - echo "" + echo -e "" fi } # if expecting a fail fn_test_result_fail(){ if [ $? == 0 ]; then - echo "=================================" - echo "Expected result: FAIL" - echo "Actual result: PASS" + echo -e "=================================" + echo -e "Expected result: FAIL" + echo -e "Actual result: PASS" fn_print_fail_nl "TEST FAILED" exitcode=1 core_exit.sh else - echo "=================================" - echo "Expected result: FAIL" - echo "Actual result: FAIL" + echo -e "=================================" + echo -e "Expected result: FAIL" + echo -e "Actual result: FAIL" fn_print_ok_nl "TEST PASSED" - echo "" + echo -e "" fi } # test result n/a fn_test_result_na(){ - echo "=================================" - echo "Expected result: N/A" - echo "Actual result: N/A" + echo -e "=================================" + echo -e "Expected result: N/A" + echo -e "Actual result: N/A" fn_print_fail_nl "TEST N/A" } -echo "=================================" -echo "Travis CI Tests" -echo "Linux Game Server Manager" -echo "by Daniel Gibbs" -echo "Contributors: http://goo.gl/qLmitD" -echo "https://linuxgsm.com" -echo "=================================" -echo "" -echo "=================================" -echo "Server Tests" -echo "Using: ${gamename}" -echo "Testing Branch: $TRAVIS_BRANCH" -echo "=================================" - -echo "" -echo "0.0 - Pre-test Tasks" -echo "==================================================================" -echo "Description:" -echo "Create log dir's" -echo "" - -echo "" -echo "0.1 - Create log dir's" -echo "=================================" -echo "" +echo -e "=================================" +echo -e "Travis CI Tests" +echo -e "Linux Game Server Manager" +echo -e "by Daniel Gibbs" +echo -e "Contributors: http://goo.gl/qLmitD" +echo -e "https://linuxgsm.com" +echo -e "=================================" +echo -e "" +echo -e "=================================" +echo -e "Server Tests" +echo -e "Using: ${gamename}" +echo -e "Testing Branch: $TRAVIS_BRANCH" +echo -e "=================================" + +echo -e "" +echo -e "0.0 - Pre-test Tasks" +echo -e "==================================================================" +echo -e "Description:" +echo -e "Create log dir's" +echo -e "" + +echo -e "" +echo -e "0.1 - Create log dir's" +echo -e "=================================" +echo -e "" ( exec 5>"${TRAVIS_BUILD_DIR}/dev-debug.log" BASH_XTRACEFD="5" set -x install_logs.sh ) -echo "run order" -echo "=================" +echo -e "run order" +echo -e "=================" grep functionfile= "${TRAVIS_BUILD_DIR}/dev-debug.log" | sed 's/functionfile=//g' -echo "" -echo "0.2 - Enable dev-debug" -echo "=================================" -echo "Description:" -echo "Enable dev-debug" -echo "" +echo -e "" +echo -e "0.2 - Enable dev-debug" +echo -e "=================================" +echo -e "Description:" +echo -e "Enable dev-debug" +echo -e "" ( exec 5>"${TRAVIS_BUILD_DIR}/dev-debug.log" BASH_XTRACEFD="5" @@ -531,21 +531,21 @@ echo "" command_dev_debug.sh ) fn_test_result_pass -echo "run order" -echo "=================" +echo -e "run order" +echo -e "=================" grep functionfile= "${TRAVIS_BUILD_DIR}/dev-debug.log" | sed 's/functionfile=//g' -echo "" -echo "1.0 - Pre-install tests" -echo "==================================================================" -echo "" - -echo "1.1 - start - no files" -echo "=================================" -echo "Description:" -echo "test script reaction to missing server files." -echo "Command: ./${gameservername} start" -echo "" +echo -e "" +echo -e "1.0 - Pre-install tests" +echo -e "==================================================================" +echo -e "" + +echo -e "1.1 - start - no files" +echo -e "=================================" +echo -e "Description:" +echo -e "test script reaction to missing server files." +echo -e "Command: ./${gameservername} start" +echo -e "" # Allows for testing not on Travis CI if [ ! -v TRAVIS ]; then ( @@ -556,20 +556,20 @@ if [ ! -v TRAVIS ]; then ) fn_test_result_fail else - echo "Test bypassed" + echo -e "Test bypassed" fi -echo "run order" -echo "=================" +echo -e "run order" +echo -e "=================" grep functionfile= "${TRAVIS_BUILD_DIR}/dev-debug.log" | sed 's/functionfile=//g' -echo "" -echo "1.2 - getopt" -echo "=================================" -echo "Description:" -echo "displaying options messages." -echo "Command: ./${gameservername}" -echo "" +echo -e "" +echo -e "1.2 - getopt" +echo -e "=================================" +echo -e "Description:" +echo -e "displaying options messages." +echo -e "Command: ./${gameservername}" +echo -e "" ( exec 5>"${TRAVIS_BUILD_DIR}/dev-debug.log" BASH_XTRACEFD="5" @@ -577,17 +577,17 @@ echo "" core_getopt.sh ) fn_test_result_pass -echo "run order" -echo "=================" +echo -e "run order" +echo -e "=================" grep functionfile= "${TRAVIS_BUILD_DIR}/dev-debug.log" | sed 's/functionfile=//g' -echo "" -echo "1.3 - getopt with incorrect args" -echo "=================================" -echo "Description:" -echo "displaying options messages." -echo "Command: ./${gameservername} abc123" -echo "" +echo -e "" +echo -e "1.3 - getopt with incorrect args" +echo -e "=================================" +echo -e "Description:" +echo -e "displaying options messages." +echo -e "Command: ./${gameservername} abc123" +echo -e "" getopt="abc123" ( exec 5>"${TRAVIS_BUILD_DIR}/dev-debug.log" @@ -596,20 +596,20 @@ getopt="abc123" core_getopt.sh ) fn_test_result_fail -echo "run order" -echo "=================" +echo -e "run order" +echo -e "=================" grep functionfile= "${TRAVIS_BUILD_DIR}/dev-debug.log" | sed 's/functionfile=//g' -echo "" -echo "2.0 - Installation" -echo "==================================================================" +echo -e "" +echo -e "2.0 - Installation" +echo -e "==================================================================" -echo "" -echo "2.0 - install" -echo "=================================" -echo "Description:" -echo "install ${gamename} server." -echo "Command: ./${gameservername} auto-install" +echo -e "" +echo -e "2.0 - install" +echo -e "=================================" +echo -e "Description:" +echo -e "install ${gamename} server." +echo -e "Command: ./${gameservername} auto-install" ( exec 5>"${TRAVIS_BUILD_DIR}/dev-debug.log" BASH_XTRACEFD="5" @@ -617,20 +617,20 @@ echo "Command: ./${gameservername} auto-install" fn_autoinstall ) fn_test_result_pass -echo "run order" -echo "=================" +echo -e "run order" +echo -e "=================" grep functionfile= "${TRAVIS_BUILD_DIR}/dev-debug.log" | sed 's/functionfile=//g' -echo "" -echo "3.0 - Start/Stop/Restart Tests" -echo "==================================================================" +echo -e "" +echo -e "3.0 - Start/Stop/Restart Tests" +echo -e "==================================================================" -echo "" -echo "3.1 - start" -echo "=================================" -echo "Description:" -echo "start ${gamename} server." -echo "Command: ./${gameservername} start" +echo -e "" +echo -e "3.1 - start" +echo -e "=================================" +echo -e "Description:" +echo -e "start ${gamename} server." +echo -e "Command: ./${gameservername} start" requiredstatus="OFFLINE" fn_setstatus ( @@ -640,16 +640,16 @@ fn_setstatus command_start.sh ) fn_test_result_pass -echo "run order" -echo "=================" +echo -e "run order" +echo -e "=================" grep functionfile= "${TRAVIS_BUILD_DIR}/dev-debug.log" | sed 's/functionfile=//g' -echo "" -echo "3.2 - start - online" -echo "=================================" -echo "Description:" -echo "start ${gamename} server while already running." -echo "Command: ./${gameservername} start" +echo -e "" +echo -e "3.2 - start - online" +echo -e "=================================" +echo -e "Description:" +echo -e "start ${gamename} server while already running." +echo -e "Command: ./${gameservername} start" requiredstatus="ONLINE" fn_setstatus ( @@ -659,16 +659,16 @@ fn_setstatus command_start.sh ) fn_test_result_fail -echo "run order" -echo "=================" +echo -e "run order" +echo -e "=================" grep functionfile= "${TRAVIS_BUILD_DIR}/dev-debug.log" | sed 's/functionfile=//g' -echo "" -echo "3.3 - start - updateonstart" -echo "=================================" -echo "Description:" -echo "will update server on start." -echo "Command: ./${gameservername} start" +echo -e "" +echo -e "3.3 - start - updateonstart" +echo -e "=================================" +echo -e "Description:" +echo -e "will update server on start." +echo -e "Command: ./${gameservername} start" requiredstatus="OFFLINE" fn_setstatus ( @@ -678,16 +678,16 @@ fn_setstatus updateonstart="on";command_start.sh ) fn_test_result_pass -echo "run order" -echo "=================" +echo -e "run order" +echo -e "=================" grep functionfile= "${TRAVIS_BUILD_DIR}/dev-debug.log" | sed 's/functionfile=//g' -echo "" -echo "3.4 - stop" -echo "=================================" -echo "Description:" -echo "stop ${gamename} server." -echo "Command: ./${gameservername} stop" +echo -e "" +echo -e "3.4 - stop" +echo -e "=================================" +echo -e "Description:" +echo -e "stop ${gamename} server." +echo -e "Command: ./${gameservername} stop" requiredstatus="ONLINE" fn_setstatus ( @@ -697,16 +697,16 @@ fn_setstatus command_stop.sh ) fn_test_result_pass -echo "run order" -echo "=================" +echo -e "run order" +echo -e "=================" grep functionfile= "${TRAVIS_BUILD_DIR}/dev-debug.log" | sed 's/functionfile=//g' -echo "" -echo "3.5 - stop - offline" -echo "=================================" -echo "Description:" -echo "stop ${gamename} server while already stopped." -echo "Command: ./${gameservername} stop" +echo -e "" +echo -e "3.5 - stop - offline" +echo -e "=================================" +echo -e "Description:" +echo -e "stop ${gamename} server while already stopped." +echo -e "Command: ./${gameservername} stop" requiredstatus="OFFLINE" fn_setstatus ( @@ -716,16 +716,16 @@ fn_setstatus command_stop.sh ) fn_test_result_fail -echo "run order" -echo "=================" +echo -e "run order" +echo -e "=================" grep functionfile= "${TRAVIS_BUILD_DIR}/dev-debug.log" | sed 's/functionfile=//g' -echo "" -echo "3.6 - restart" -echo "=================================" -echo "Description:" -echo "restart ${gamename}." -echo "Command: ./${gameservername} restart" +echo -e "" +echo -e "3.6 - restart" +echo -e "=================================" +echo -e "Description:" +echo -e "restart ${gamename}." +echo -e "Command: ./${gameservername} restart" requiredstatus="ONLINE" fn_setstatus ( @@ -735,16 +735,16 @@ fn_setstatus command_restart.sh ) fn_test_result_pass -echo "run order" -echo "=================" +echo -e "run order" +echo -e "=================" grep functionfile= "${TRAVIS_BUILD_DIR}/dev-debug.log" | sed 's/functionfile=//g' -echo "" -echo "3.7 - restart - offline" -echo "=================================" -echo "Description:" -echo "restart ${gamename} while already stopped." -echo "Command: ./${gameservername} restart" +echo -e "" +echo -e "3.7 - restart - offline" +echo -e "=================================" +echo -e "Description:" +echo -e "restart ${gamename} while already stopped." +echo -e "Command: ./${gameservername} restart" requiredstatus="OFFLINE" fn_setstatus ( @@ -754,20 +754,20 @@ fn_setstatus command_restart.sh ) fn_test_result_pass -echo "run order" -echo "=================" +echo -e "run order" +echo -e "=================" grep functionfile= "${TRAVIS_BUILD_DIR}/dev-debug.log" | sed 's/functionfile=//g' -echo "" -echo "4.0 - Update Tests" -echo "==================================================================" +echo -e "" +echo -e "4.0 - Update Tests" +echo -e "==================================================================" -echo "" -echo "4.1 - update" -echo "=================================" -echo "Description:" -echo "check for updates." -echo "Command: ./${gameservername} update" +echo -e "" +echo -e "4.1 - update" +echo -e "=================================" +echo -e "Description:" +echo -e "check for updates." +echo -e "Command: ./${gameservername} update" requiredstatus="OFFLINE" fn_setstatus ( @@ -777,23 +777,23 @@ fn_setstatus command_update.sh ) fn_test_result_pass -echo "run order" -echo "=================" +echo -e "run order" +echo -e "=================" grep functionfile= "${TRAVIS_BUILD_DIR}/dev-debug.log" | sed 's/functionfile=//g' -echo "" -echo "5.0 - Monitor Tests" -echo "==================================================================" -echo "" -echo "Server IP - Port: ${ip}:${port}" -echo "Server IP - Query Port: ${ip}:${queryport}" - -echo "" -echo "5.1 - monitor - online" -echo "=================================" -echo "Description:" -echo "run monitor server while already running." -echo "Command: ./${gameservername} monitor" +echo -e "" +echo -e "5.0 - Monitor Tests" +echo -e "==================================================================" +echo -e "" +echo -e "Server IP - Port: ${ip}:${port}" +echo -e "Server IP - Query Port: ${ip}:${queryport}" + +echo -e "" +echo -e "5.1 - monitor - online" +echo -e "=================================" +echo -e "Description:" +echo -e "run monitor server while already running." +echo -e "Command: ./${gameservername} monitor" requiredstatus="ONLINE" fn_setstatus ( @@ -803,16 +803,16 @@ fn_setstatus command_monitor.sh ) fn_test_result_pass -echo "run order" -echo "=================" +echo -e "run order" +echo -e "=================" grep functionfile= "${TRAVIS_BUILD_DIR}/dev-debug.log" | sed 's/functionfile=//g' -echo "" -echo "5.2 - monitor - offline - with lockfile" -echo "=================================" -echo "Description:" -echo "run monitor while server is offline with lockfile." -echo "Command: ./${gameservername} monitor" +echo -e "" +echo -e "5.2 - monitor - offline - with lockfile" +echo -e "=================================" +echo -e "Description:" +echo -e "run monitor while server is offline with lockfile." +echo -e "Command: ./${gameservername} monitor" requiredstatus="OFFLINE" fn_setstatus fn_print_info_nl "creating lockfile." @@ -824,16 +824,16 @@ date '+%s' > "${rootdir}/${lockselfname}" command_monitor.sh ) fn_test_result_pass -echo "run order" -echo "=================" +echo -e "run order" +echo -e "=================" grep functionfile= "${TRAVIS_BUILD_DIR}/dev-debug.log" | sed 's/functionfile=//g' -echo "" -echo "5.3 - monitor - offline - no lockfile" -echo "=================================" -echo "Description:" -echo "run monitor while server is offline with no lockfile." -echo "Command: ./${gameservername} monitor" +echo -e "" +echo -e "5.3 - monitor - offline - no lockfile" +echo -e "=================================" +echo -e "Description:" +echo -e "run monitor while server is offline with no lockfile." +echo -e "Command: ./${gameservername} monitor" requiredstatus="OFFLINE" fn_setstatus ( @@ -843,16 +843,16 @@ fn_setstatus command_monitor.sh ) fn_test_result_fail -echo "run order" -echo "=================" +echo -e "run order" +echo -e "=================" grep functionfile= "${TRAVIS_BUILD_DIR}/dev-debug.log" | sed 's/functionfile=//g' -echo "" -echo "5.4 - test-alert" -echo "=================================" -echo "Description:" -echo "run monitor while server is offline with no lockfile." -echo "Command: ./${gameservername} test-alert" +echo -e "" +echo -e "5.4 - test-alert" +echo -e "=================================" +echo -e "Description:" +echo -e "run monitor while server is offline with no lockfile." +echo -e "Command: ./${gameservername} test-alert" requiredstatus="OFFLINE" fn_setstatus ( @@ -862,20 +862,20 @@ fn_setstatus command_test_alert.sh ) fn_test_result_fail -echo "run order" -echo "=================" +echo -e "run order" +echo -e "=================" grep functionfile= "${TRAVIS_BUILD_DIR}/dev-debug.log" | sed 's/functionfile=//g' -echo "" -echo "6.0 - Details Tests" -echo "==================================================================" +echo -e "" +echo -e "6.0 - Details Tests" +echo -e "==================================================================" -echo "" -echo "6.1 - details" -echo "=================================" -echo "Description:" -echo "display details." -echo "Command: ./${gameservername} details" +echo -e "" +echo -e "6.1 - details" +echo -e "=================================" +echo -e "Description:" +echo -e "display details." +echo -e "Command: ./${gameservername} details" requiredstatus="ONLINE" fn_setstatus ( @@ -885,16 +885,16 @@ fn_setstatus command_details.sh ) fn_test_result_pass -echo "run order" -echo "=================" +echo -e "run order" +echo -e "=================" grep functionfile= "${TRAVIS_BUILD_DIR}/dev-debug.log" | sed 's/functionfile=//g' -echo "" -echo "6.2 - postdetails" -echo "=================================" -echo "Description:" -echo "post details." -echo "Command: ./${gameservername} postdetails" +echo -e "" +echo -e "6.2 - postdetails" +echo -e "=================================" +echo -e "Description:" +echo -e "post details." +echo -e "Command: ./${gameservername} postdetails" requiredstatus="ONLINE" fn_setstatus ( @@ -904,39 +904,39 @@ fn_setstatus command_postdetails.sh ) fn_test_result_pass -echo "run order" -echo "=================" +echo -e "run order" +echo -e "=================" grep functionfile= "${TRAVIS_BUILD_DIR}/dev-debug.log" | sed 's/functionfile=//g' -echo "" -echo "7.0 - Backup Tests" -echo "==================================================================" +echo -e "" +echo -e "7.0 - Backup Tests" +echo -e "==================================================================" -echo "" -echo "7.1 - backup" -echo "=================================" -echo "Description:" -echo "run a backup." -echo "Command: ./${gameservername} backup" +echo -e "" +echo -e "7.1 - backup" +echo -e "=================================" +echo -e "Description:" +echo -e "run a backup." +echo -e "Command: ./${gameservername} backup" requiredstatus="ONLINE" fn_setstatus -echo "test de-activated until issue #1839 fixed" +echo -e "test de-activated until issue #1839 fixed" #(command_backup.sh) fn_test_result_pass -echo "run order" -echo "=================" +echo -e "run order" +echo -e "=================" grep functionfile= "${TRAVIS_BUILD_DIR}/dev-debug.log" | sed 's/functionfile=//g' -echo "" -echo "8.0 - Development Tools Tests" -echo "==================================================================" +echo -e "" +echo -e "8.0 - Development Tools Tests" +echo -e "==================================================================" -echo "" -echo "8.1 - dev - detect glibc" -echo "=================================" -echo "Description:" -echo "detect glibc." -echo "Command: ./${gameservername} detect-glibc" +echo -e "" +echo -e "8.1 - dev - detect glibc" +echo -e "=================================" +echo -e "Description:" +echo -e "detect glibc." +echo -e "Command: ./${gameservername} detect-glibc" requiredstatus="ONLINE" fn_setstatus ( @@ -946,16 +946,16 @@ fn_setstatus command_dev_detect_glibc.sh ) fn_test_result_pass -echo "run order" -echo "=================" +echo -e "run order" +echo -e "=================" grep functionfile= "${TRAVIS_BUILD_DIR}/dev-debug.log" | sed 's/functionfile=//g' -echo "" -echo "8.2 - dev - detect ldd" -echo "=================================" -echo "Description:" -echo "detect ldd." -echo "Command: ./${gameservername} detect-ldd" +echo -e "" +echo -e "8.2 - dev - detect ldd" +echo -e "=================================" +echo -e "Description:" +echo -e "detect ldd." +echo -e "Command: ./${gameservername} detect-ldd" requiredstatus="ONLINE" fn_setstatus ( @@ -965,16 +965,16 @@ fn_setstatus command_dev_detect_ldd.sh ) fn_test_result_pass -echo "run order" -echo "=================" +echo -e "run order" +echo -e "=================" grep functionfile= "${TRAVIS_BUILD_DIR}/dev-debug.log" | sed 's/functionfile=//g' -echo "" -echo "8.3 - dev - detect deps" -echo "=================================" -echo "Description:" -echo "detect dependencies." -echo "Command: ./${gameservername} detect-deps" +echo -e "" +echo -e "8.3 - dev - detect deps" +echo -e "=================================" +echo -e "Description:" +echo -e "detect dependencies." +echo -e "Command: ./${gameservername} detect-deps" requiredstatus="ONLINE" fn_setstatus ( @@ -984,16 +984,16 @@ fn_setstatus command_dev_detect_deps.sh ) fn_test_result_pass -echo "run order" -echo "=================" +echo -e "run order" +echo -e "=================" grep functionfile= "${TRAVIS_BUILD_DIR}/dev-debug.log" | sed 's/functionfile=//g' -echo "" -echo "8.4 - dev - query-raw" -echo "=================================" -echo "Description:" -echo "raw query output." -echo "Command: ./${gameservername} query-raw" +echo -e "" +echo -e "8.4 - dev - query-raw" +echo -e "=================================" +echo -e "Description:" +echo -e "raw query output." +echo -e "Command: ./${gameservername} query-raw" requiredstatus="ONLINE" fn_setstatus ( @@ -1003,15 +1003,15 @@ fn_setstatus command_dev_query_raw.sh ) fn_test_result_na -echo "run order" -echo "=================" +echo -e "run order" +echo -e "=================" grep functionfile= "${TRAVIS_BUILD_DIR}/dev-debug.log" | sed 's/functionfile=//g' -echo "" -echo "=================================" -echo "Server Tests - Complete!" -echo "Using: ${gamename}" -echo "=================================" +echo -e "" +echo -e "=================================" +echo -e "Server Tests - Complete!" +echo -e "Using: ${gamename}" +echo -e "=================================" requiredstatus="OFFLINE" fn_setstatus fn_print_info "Tidying up directories." diff --git a/tests/tests_jc2server.sh b/tests/tests_jc2server.sh index 8aa9e09cc..973ab7eb2 100644 --- a/tests/tests_jc2server.sh +++ b/tests/tests_jc2server.sh @@ -93,14 +93,14 @@ fn_bootstrap_fetch_file(){ echo -e "FAIL" if [ -f "${lgsmlog}" ]; then echo -e "${remote_fileurl}" | tee -a "${lgsmlog}" - echo "${curlcmd}" | tee -a "${lgsmlog}" + echo -e "${curlcmd}" | tee -a "${lgsmlog}" fi exit 1 else echo -e "OK" fi else - echo "[ FAIL ] Curl is not installed" + echo -e "[ FAIL ] Curl is not installed" exit 1 fi # Make file chmodx if chmodx is set. @@ -158,7 +158,7 @@ fn_install_menu_bash() { fn_print_horizontal menu_options=() while read -r line || [[ -n "${line}" ]]; do - var=$(echo "${line}" | awk -F "," '{print $2 " - " $3}') + var=$(echo -e "${line}" | awk -F "," '{print $2 " - " $3}') menu_options+=( "${var}" ) done < "${options}" menu_options+=( "Cancel" ) @@ -183,8 +183,8 @@ fn_install_menu_whiptail() { IFS="," menu_options=() while read -r line; do - key=$(echo "${line}" | awk -F "," '{print $3}') - val=$(echo "${line}" | awk -F "," '{print $2}') + key=$(echo -e "${line}" | awk -F "," '{print $3}') + val=$(echo -e "${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) @@ -229,10 +229,10 @@ fn_server_info(){ fn_install_getopt(){ userinput="empty" - echo "Usage: $0 [option]" + echo -e "Usage: $0 [option]" echo -e "" - echo "Installer - Linux Game Server Managers - Version ${version}" - echo "https://linuxgsm.com" + echo -e "Installer - Linux Game Server Managers - Version ${version}" + echo -e "https://linuxgsm.com" echo -e "" echo -e "Commands" echo -e "install\t\t| Select server to install." @@ -253,15 +253,15 @@ fn_install_file(){ cp -R "${selfname}" "${local_filename}" sed -i -e "s/shortname=\"core\"/shortname=\"${shortname}\"/g" "${local_filename}" sed -i -e "s/gameservername=\"core\"/gameservername=\"${gameservername}\"/g" "${local_filename}" - echo "Installed ${gamename} server as ${local_filename}" - echo "" + echo -e "Installed ${gamename} server as ${local_filename}" + echo -e "" if [ ! -d "${serverfiles}" ]; then - echo "./${local_filename} install" + echo -e "./${local_filename} install" else - echo "Remember to check server ports" - echo "./${local_filename} details" + echo -e "Remember to check server ports" + echo -e "./${local_filename} details" fi - echo "" + echo -e "" exit } @@ -269,11 +269,11 @@ fn_install_file(){ if [ "$(whoami)" == "root" ]; then if [ "${userinput}" == "install" ]||[ "${userinput}" == "auto-install" ]||[ "${userinput}" == "i" ]||[ "${userinput}" == "ai" ]; then if [ "${shortname}" == "core" ]; then - echo "[ FAIL ] Do NOT run this script as root!" + echo -e "[ FAIL ] Do NOT run this script as root!" exit 1 fi elif [ ! -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!" + echo -e "[ FAIL ] Do NOT run this script as root!" exit 1 else core_functions.sh @@ -286,7 +286,7 @@ if [ "${shortname}" == "core" ]; then # Download the latest serverlist. This is the complete list of all supported servers. fn_bootstrap_fetch_file_github "lgsm/data" "serverlist.csv" "${datadir}" "nochmodx" "norun" "forcedl" "nomd5" if [ ! -f "${serverlist}" ]; then - echo "[ FAIL ] serverlist.csv could not be loaded." + echo -e "[ FAIL ] serverlist.csv could not be loaded." exit 1 fi @@ -303,18 +303,18 @@ if [ "${shortname}" == "core" ]; then if [ "${result}" == "${gameservername}" ]; then fn_install_file elif [ "${result}" == "" ]; then - echo "Install canceled" + echo -e "Install canceled" else - echo "[ FAIL ] menu result does not match gameservername" - echo "result: ${result}" - echo "gameservername: ${gameservername}" + echo -e "[ FAIL ] menu result does not match gameservername" + echo -e "result: ${result}" + echo -e "gameservername: ${gameservername}" fi elif [ -n "${userinput}" ]; then fn_server_info if [ "${userinput}" == "${gameservername}" ]||[ "${userinput}" == "${gamename}" ]||[ "${userinput}" == "${shortname}" ]; then fn_install_file else - echo "[ FAIL ] unknown game server" + echo -e "[ FAIL ] unknown game server" fi else fn_install_getopt @@ -408,9 +408,9 @@ fn_currentstatus_ts3(){ fn_setstatus(){ fn_currentstatus_tmux echo"" - echo "Required status: ${requiredstatus}" + echo -e "Required status: ${requiredstatus}" counter=0 - echo "Current status: ${currentstatus}" + echo -e "Current status: ${currentstatus}" while [ "${requiredstatus}" != "${currentstatus}" ]; do counter=$((counter+1)) fn_currentstatus_tmux @@ -423,16 +423,16 @@ fn_setstatus(){ fi if [ "${counter}" -gt "5" ]; then currentstatus="FAIL" - echo "Current status: ${currentstatus}" - echo "" - echo "Unable to start or stop server." + echo -e "Current status: ${currentstatus}" + echo -e "" + echo -e "Unable to start or stop server." exit 1 fi done echo -en "New status: ${currentstatus}\\r" echo -e "\n" - echo "Test starting:" - echo "" + echo -e "Test starting:" + echo -e "" } # End of every test will expect the result to either pass or fail @@ -440,88 +440,88 @@ fn_setstatus(){ # if expecting a pass fn_test_result_pass(){ if [ $? != 0 ]; then - echo "=================================" - echo "Expected result: PASS" - echo "Actual result: FAIL" + echo -e "=================================" + echo -e "Expected result: PASS" + echo -e "Actual result: FAIL" fn_print_fail_nl "TEST FAILED" exitcode=1 core_exit.sh else - echo "=================================" - echo "Expected result: PASS" - echo "Actual result: PASS" + echo -e "=================================" + echo -e "Expected result: PASS" + echo -e "Actual result: PASS" fn_print_ok_nl "TEST PASSED" - echo "" + echo -e "" fi } # if expecting a fail fn_test_result_fail(){ if [ $? == 0 ]; then - echo "=================================" - echo "Expected result: FAIL" - echo "Actual result: PASS" + echo -e "=================================" + echo -e "Expected result: FAIL" + echo -e "Actual result: PASS" fn_print_fail_nl "TEST FAILED" exitcode=1 core_exit.sh else - echo "=================================" - echo "Expected result: FAIL" - echo "Actual result: FAIL" + echo -e "=================================" + echo -e "Expected result: FAIL" + echo -e "Actual result: FAIL" fn_print_ok_nl "TEST PASSED" - echo "" + echo -e "" fi } # test result n/a fn_test_result_na(){ - echo "=================================" - echo "Expected result: N/A" - echo "Actual result: N/A" + echo -e "=================================" + echo -e "Expected result: N/A" + echo -e "Actual result: N/A" fn_print_fail_nl "TEST N/A" } -echo "=================================" -echo "Travis CI Tests" -echo "Linux Game Server Manager" -echo "by Daniel Gibbs" -echo "Contributors: http://goo.gl/qLmitD" -echo "https://linuxgsm.com" -echo "=================================" -echo "" -echo "=================================" -echo "Server Tests" -echo "Using: ${gamename}" -echo "Testing Branch: $TRAVIS_BRANCH" -echo "=================================" - -echo "" -echo "0.0 - Pre-test Tasks" -echo "==================================================================" -echo "Description:" -echo "Create log dir's" -echo "" - -echo "" -echo "0.1 - Create log dir's" -echo "=================================" -echo "" +echo -e "=================================" +echo -e "Travis CI Tests" +echo -e "Linux Game Server Manager" +echo -e "by Daniel Gibbs" +echo -e "Contributors: http://goo.gl/qLmitD" +echo -e "https://linuxgsm.com" +echo -e "=================================" +echo -e "" +echo -e "=================================" +echo -e "Server Tests" +echo -e "Using: ${gamename}" +echo -e "Testing Branch: $TRAVIS_BRANCH" +echo -e "=================================" + +echo -e "" +echo -e "0.0 - Pre-test Tasks" +echo -e "==================================================================" +echo -e "Description:" +echo -e "Create log dir's" +echo -e "" + +echo -e "" +echo -e "0.1 - Create log dir's" +echo -e "=================================" +echo -e "" ( exec 5>"${TRAVIS_BUILD_DIR}/dev-debug.log" BASH_XTRACEFD="5" set -x install_logs.sh ) -echo "run order" -echo "=================" +echo -e "run order" +echo -e "=================" grep functionfile= "${TRAVIS_BUILD_DIR}/dev-debug.log" | sed 's/functionfile=//g' -echo "" -echo "0.2 - Enable dev-debug" -echo "=================================" -echo "Description:" -echo "Enable dev-debug" -echo "" +echo -e "" +echo -e "0.2 - Enable dev-debug" +echo -e "=================================" +echo -e "Description:" +echo -e "Enable dev-debug" +echo -e "" ( exec 5>"${TRAVIS_BUILD_DIR}/dev-debug.log" BASH_XTRACEFD="5" @@ -529,21 +529,21 @@ echo "" command_dev_debug.sh ) fn_test_result_pass -echo "run order" -echo "=================" +echo -e "run order" +echo -e "=================" grep functionfile= "${TRAVIS_BUILD_DIR}/dev-debug.log" | sed 's/functionfile=//g' -echo "" -echo "1.0 - Pre-install tests" -echo "==================================================================" -echo "" - -echo "1.1 - start - no files" -echo "=================================" -echo "Description:" -echo "test script reaction to missing server files." -echo "Command: ./${gameservername} start" -echo "" +echo -e "" +echo -e "1.0 - Pre-install tests" +echo -e "==================================================================" +echo -e "" + +echo -e "1.1 - start - no files" +echo -e "=================================" +echo -e "Description:" +echo -e "test script reaction to missing server files." +echo -e "Command: ./${gameservername} start" +echo -e "" # Allows for testing not on Travis CI if [ ! -v TRAVIS ]; then ( @@ -554,20 +554,20 @@ if [ ! -v TRAVIS ]; then ) fn_test_result_fail else - echo "Test bypassed" + echo -e "Test bypassed" fi -echo "run order" -echo "=================" +echo -e "run order" +echo -e "=================" grep functionfile= "${TRAVIS_BUILD_DIR}/dev-debug.log" | sed 's/functionfile=//g' -echo "" -echo "1.2 - getopt" -echo "=================================" -echo "Description:" -echo "displaying options messages." -echo "Command: ./${gameservername}" -echo "" +echo -e "" +echo -e "1.2 - getopt" +echo -e "=================================" +echo -e "Description:" +echo -e "displaying options messages." +echo -e "Command: ./${gameservername}" +echo -e "" ( exec 5>"${TRAVIS_BUILD_DIR}/dev-debug.log" BASH_XTRACEFD="5" @@ -575,17 +575,17 @@ echo "" core_getopt.sh ) fn_test_result_pass -echo "run order" -echo "=================" +echo -e "run order" +echo -e "=================" grep functionfile= "${TRAVIS_BUILD_DIR}/dev-debug.log" | sed 's/functionfile=//g' -echo "" -echo "1.3 - getopt with incorrect args" -echo "=================================" -echo "Description:" -echo "displaying options messages." -echo "Command: ./${gameservername} abc123" -echo "" +echo -e "" +echo -e "1.3 - getopt with incorrect args" +echo -e "=================================" +echo -e "Description:" +echo -e "displaying options messages." +echo -e "Command: ./${gameservername} abc123" +echo -e "" getopt="abc123" ( exec 5>"${TRAVIS_BUILD_DIR}/dev-debug.log" @@ -594,20 +594,20 @@ getopt="abc123" core_getopt.sh ) fn_test_result_fail -echo "run order" -echo "=================" +echo -e "run order" +echo -e "=================" grep functionfile= "${TRAVIS_BUILD_DIR}/dev-debug.log" | sed 's/functionfile=//g' -echo "" -echo "2.0 - Installation" -echo "==================================================================" +echo -e "" +echo -e "2.0 - Installation" +echo -e "==================================================================" -echo "" -echo "2.0 - install" -echo "=================================" -echo "Description:" -echo "install ${gamename} server." -echo "Command: ./${gameservername} auto-install" +echo -e "" +echo -e "2.0 - install" +echo -e "=================================" +echo -e "Description:" +echo -e "install ${gamename} server." +echo -e "Command: ./${gameservername} auto-install" ( exec 5>"${TRAVIS_BUILD_DIR}/dev-debug.log" BASH_XTRACEFD="5" @@ -615,20 +615,20 @@ echo "Command: ./${gameservername} auto-install" fn_autoinstall ) fn_test_result_pass -echo "run order" -echo "=================" +echo -e "run order" +echo -e "=================" grep functionfile= "${TRAVIS_BUILD_DIR}/dev-debug.log" | sed 's/functionfile=//g' -echo "" -echo "3.0 - Start/Stop/Restart Tests" -echo "==================================================================" +echo -e "" +echo -e "3.0 - Start/Stop/Restart Tests" +echo -e "==================================================================" -echo "" -echo "3.1 - start" -echo "=================================" -echo "Description:" -echo "start ${gamename} server." -echo "Command: ./${gameservername} start" +echo -e "" +echo -e "3.1 - start" +echo -e "=================================" +echo -e "Description:" +echo -e "start ${gamename} server." +echo -e "Command: ./${gameservername} start" requiredstatus="OFFLINE" fn_setstatus ( @@ -638,16 +638,16 @@ fn_setstatus command_start.sh ) fn_test_result_pass -echo "run order" -echo "=================" +echo -e "run order" +echo -e "=================" grep functionfile= "${TRAVIS_BUILD_DIR}/dev-debug.log" | sed 's/functionfile=//g' -echo "" -echo "3.2 - start - online" -echo "=================================" -echo "Description:" -echo "start ${gamename} server while already running." -echo "Command: ./${gameservername} start" +echo -e "" +echo -e "3.2 - start - online" +echo -e "=================================" +echo -e "Description:" +echo -e "start ${gamename} server while already running." +echo -e "Command: ./${gameservername} start" requiredstatus="ONLINE" fn_setstatus ( @@ -657,16 +657,16 @@ fn_setstatus command_start.sh ) fn_test_result_fail -echo "run order" -echo "=================" +echo -e "run order" +echo -e "=================" grep functionfile= "${TRAVIS_BUILD_DIR}/dev-debug.log" | sed 's/functionfile=//g' -echo "" -echo "3.3 - start - updateonstart" -echo "=================================" -echo "Description:" -echo "will update server on start." -echo "Command: ./${gameservername} start" +echo -e "" +echo -e "3.3 - start - updateonstart" +echo -e "=================================" +echo -e "Description:" +echo -e "will update server on start." +echo -e "Command: ./${gameservername} start" requiredstatus="OFFLINE" fn_setstatus ( @@ -676,16 +676,16 @@ fn_setstatus updateonstart="on";command_start.sh ) fn_test_result_pass -echo "run order" -echo "=================" +echo -e "run order" +echo -e "=================" grep functionfile= "${TRAVIS_BUILD_DIR}/dev-debug.log" | sed 's/functionfile=//g' -echo "" -echo "3.4 - stop" -echo "=================================" -echo "Description:" -echo "stop ${gamename} server." -echo "Command: ./${gameservername} stop" +echo -e "" +echo -e "3.4 - stop" +echo -e "=================================" +echo -e "Description:" +echo -e "stop ${gamename} server." +echo -e "Command: ./${gameservername} stop" requiredstatus="ONLINE" fn_setstatus ( @@ -695,16 +695,16 @@ fn_setstatus command_stop.sh ) fn_test_result_pass -echo "run order" -echo "=================" +echo -e "run order" +echo -e "=================" grep functionfile= "${TRAVIS_BUILD_DIR}/dev-debug.log" | sed 's/functionfile=//g' -echo "" -echo "3.5 - stop - offline" -echo "=================================" -echo "Description:" -echo "stop ${gamename} server while already stopped." -echo "Command: ./${gameservername} stop" +echo -e "" +echo -e "3.5 - stop - offline" +echo -e "=================================" +echo -e "Description:" +echo -e "stop ${gamename} server while already stopped." +echo -e "Command: ./${gameservername} stop" requiredstatus="OFFLINE" fn_setstatus ( @@ -714,16 +714,16 @@ fn_setstatus command_stop.sh ) fn_test_result_fail -echo "run order" -echo "=================" +echo -e "run order" +echo -e "=================" grep functionfile= "${TRAVIS_BUILD_DIR}/dev-debug.log" | sed 's/functionfile=//g' -echo "" -echo "3.6 - restart" -echo "=================================" -echo "Description:" -echo "restart ${gamename}." -echo "Command: ./${gameservername} restart" +echo -e "" +echo -e "3.6 - restart" +echo -e "=================================" +echo -e "Description:" +echo -e "restart ${gamename}." +echo -e "Command: ./${gameservername} restart" requiredstatus="ONLINE" fn_setstatus ( @@ -733,16 +733,16 @@ fn_setstatus command_restart.sh ) fn_test_result_pass -echo "run order" -echo "=================" +echo -e "run order" +echo -e "=================" grep functionfile= "${TRAVIS_BUILD_DIR}/dev-debug.log" | sed 's/functionfile=//g' -echo "" -echo "3.7 - restart - offline" -echo "=================================" -echo "Description:" -echo "restart ${gamename} while already stopped." -echo "Command: ./${gameservername} restart" +echo -e "" +echo -e "3.7 - restart - offline" +echo -e "=================================" +echo -e "Description:" +echo -e "restart ${gamename} while already stopped." +echo -e "Command: ./${gameservername} restart" requiredstatus="OFFLINE" fn_setstatus ( @@ -752,20 +752,20 @@ fn_setstatus command_restart.sh ) fn_test_result_pass -echo "run order" -echo "=================" +echo -e "run order" +echo -e "=================" grep functionfile= "${TRAVIS_BUILD_DIR}/dev-debug.log" | sed 's/functionfile=//g' -echo "" -echo "4.0 - Update Tests" -echo "==================================================================" +echo -e "" +echo -e "4.0 - Update Tests" +echo -e "==================================================================" -echo "" -echo "4.1 - update" -echo "=================================" -echo "Description:" -echo "check for updates." -echo "Command: ./${gameservername} update" +echo -e "" +echo -e "4.1 - update" +echo -e "=================================" +echo -e "Description:" +echo -e "check for updates." +echo -e "Command: ./${gameservername} update" requiredstatus="OFFLINE" fn_setstatus ( @@ -775,16 +775,16 @@ fn_setstatus command_update.sh ) fn_test_result_pass -echo "run order" -echo "=================" +echo -e "run order" +echo -e "=================" grep functionfile= "${TRAVIS_BUILD_DIR}/dev-debug.log" | sed 's/functionfile=//g' -echo "" -echo "4.2 - update - change buildid" -echo "=================================" -echo "Description:" -echo "change the buildid tricking SteamCMD to update." -echo "Command: ./jc2server update" +echo -e "" +echo -e "4.2 - update - change buildid" +echo -e "=================================" +echo -e "Description:" +echo -e "change the buildid tricking SteamCMD to update." +echo -e "Command: ./jc2server update" requiredstatus="OFFLINE" fn_setstatus fn_print_info_nl "changed buildid to 0." @@ -796,16 +796,16 @@ sed -i 's/[0-9]\+/0/' "${serverfiles}/steamapps/appmanifest_${appid}.acf" command_update.sh ) fn_test_result_pass -echo "run order" -echo "=================" +echo -e "run order" +echo -e "=================" grep functionfile= "${TRAVIS_BUILD_DIR}/dev-debug.log" | sed 's/functionfile=//g' -echo "" -echo "4.3 - update - change buildid - online" -echo "=================================" -echo "Description:" -echo "change the buildid tricking SteamCMD to update server while already running." -echo "Command: ./jc2server update" +echo -e "" +echo -e "4.3 - update - change buildid - online" +echo -e "=================================" +echo -e "Description:" +echo -e "change the buildid tricking SteamCMD to update server while already running." +echo -e "Command: ./jc2server update" requiredstatus="ONLINE" fn_setstatus fn_print_info_nl "changed buildid to 0." @@ -817,16 +817,16 @@ sed -i 's/[0-9]\+/0/' "${serverfiles}/steamapps/appmanifest_${appid}.acf" command_update.sh ) fn_test_result_pass -echo "run order" -echo "=================" +echo -e "run order" +echo -e "=================" grep functionfile= "${TRAVIS_BUILD_DIR}/dev-debug.log" | sed 's/functionfile=//g' -echo "" -echo "4.4 - update - remove appmanifest file" -echo "=================================" -echo "Description:" -echo "removing appmanifest file will cause script to repair." -echo "Command: ./jc2server update" +echo -e "" +echo -e "4.4 - update - remove appmanifest file" +echo -e "=================================" +echo -e "Description:" +echo -e "removing appmanifest file will cause script to repair." +echo -e "Command: ./jc2server update" requiredstatus="OFFLINE" fn_setstatus fn_print_info_nl "removed appmanifest_${appid}.acf." @@ -838,16 +838,16 @@ rm --verbose "${serverfiles}/steamapps/appmanifest_${appid}.acf" command_update.sh ) fn_test_result_pass -echo "run order" -echo "=================" +echo -e "run order" +echo -e "=================" grep functionfile= "${TRAVIS_BUILD_DIR}/dev-debug.log" | sed 's/functionfile=//g' -echo "" -echo "4.5 - force-update" -echo "=================================" -echo "Description:" -echo "force-update bypassing update check." -echo "Command: ./jc2server force-update" +echo -e "" +echo -e "4.5 - force-update" +echo -e "=================================" +echo -e "Description:" +echo -e "force-update bypassing update check." +echo -e "Command: ./jc2server force-update" requiredstatus="OFFLINE" fn_setstatus ( @@ -857,16 +857,16 @@ fn_setstatus forceupdate=1;command_update.sh ) fn_test_result_pass -echo "run order" -echo "=================" +echo -e "run order" +echo -e "=================" grep functionfile= "${TRAVIS_BUILD_DIR}/dev-debug.log" | sed 's/functionfile=//g' -echo "" -echo "4.6 - force-update - online" -echo "=================================" -echo "Description:" -echo "force-update bypassing update check server while already running." -echo "Command: ./jc2server force-update" +echo -e "" +echo -e "4.6 - force-update - online" +echo -e "=================================" +echo -e "Description:" +echo -e "force-update bypassing update check server while already running." +echo -e "Command: ./jc2server force-update" requiredstatus="ONLINE" fn_setstatus ( @@ -876,16 +876,16 @@ fn_setstatus forceupdate=1;command_update.sh ) fn_test_result_pass -echo "run order" -echo "=================" +echo -e "run order" +echo -e "=================" grep functionfile= "${TRAVIS_BUILD_DIR}/dev-debug.log" | sed 's/functionfile=//g' -echo "" -echo "4.7 - validate" -echo "=================================" -echo "Description:" -echo "validate server files." -echo "Command: ./jc2server validate" +echo -e "" +echo -e "4.7 - validate" +echo -e "=================================" +echo -e "Description:" +echo -e "validate server files." +echo -e "Command: ./jc2server validate" requiredstatus="OFFLINE" fn_setstatus ( @@ -895,17 +895,17 @@ fn_setstatus command_validate.sh ) fn_test_result_pass -echo "run order" -echo "=================" +echo -e "run order" +echo -e "=================" grep functionfile= "${TRAVIS_BUILD_DIR}/dev-debug.log" | sed 's/functionfile=//g' -echo "" -echo "4.8 - validate - online" -echo "=================================" -echo "Description:" -echo "validate server files while server already running." -echo "" -echo "Command: ./jc2server validate" +echo -e "" +echo -e "4.8 - validate - online" +echo -e "=================================" +echo -e "Description:" +echo -e "validate server files while server already running." +echo -e "" +echo -e "Command: ./jc2server validate" requiredstatus="ONLINE" fn_setstatus ( @@ -915,37 +915,37 @@ fn_setstatus command_validate.sh ) fn_test_result_pass -echo "run order" -echo "=================" +echo -e "run order" +echo -e "=================" grep functionfile= "${TRAVIS_BUILD_DIR}/dev-debug.log" | sed 's/functionfile=//g' -echo "" -echo "Inserting IP address" -echo "=================================" -echo "Description:" -echo "Inserting Travis IP in to config." -echo "Allows monitor to work" +echo -e "" +echo -e "Inserting IP address" +echo -e "=================================" +echo -e "Description:" +echo -e "Inserting Travis IP in to config." +echo -e "Allows monitor to work" if [ "$(ip -o -4 addr|grep eth0)" ]; then travisip=$(ip -o -4 addr | grep eth0 | awk '{print $4}' | grep -oe '\([0-9]\{1,3\}\.\?\)\{4\}' | grep -v 127.0.0) else travisip=$(ip -o -4 addr | grep ens | awk '{print $4}' | grep -oe '\([0-9]\{1,3\}\.\?\)\{4\}' | sort -u | grep -v 127.0.0) fi sed -i "/BindIP/c\BindIP = \"${travisip}\"," "${serverfiles}/config.lua" -echo "IP: ${travisip}" - -echo "" -echo "5.0 - Monitor Tests" -echo "==================================================================" -echo "" -echo "Server IP - Port: ${ip}:${port}" -echo "Server IP - Query Port: ${ip}:${queryport}" - -echo "" -echo "5.1 - monitor - online" -echo "=================================" -echo "Description:" -echo "run monitor server while already running." -echo "Command: ./${gameservername} monitor" +echo -e "IP: ${travisip}" + +echo -e "" +echo -e "5.0 - Monitor Tests" +echo -e "==================================================================" +echo -e "" +echo -e "Server IP - Port: ${ip}:${port}" +echo -e "Server IP - Query Port: ${ip}:${queryport}" + +echo -e "" +echo -e "5.1 - monitor - online" +echo -e "=================================" +echo -e "Description:" +echo -e "run monitor server while already running." +echo -e "Command: ./${gameservername} monitor" requiredstatus="ONLINE" fn_setstatus ( @@ -955,16 +955,16 @@ fn_setstatus command_monitor.sh ) fn_test_result_pass -echo "run order" -echo "=================" +echo -e "run order" +echo -e "=================" grep functionfile= "${TRAVIS_BUILD_DIR}/dev-debug.log" | sed 's/functionfile=//g' -echo "" -echo "5.2 - monitor - offline - with lockfile" -echo "=================================" -echo "Description:" -echo "run monitor while server is offline with lockfile." -echo "Command: ./${gameservername} monitor" +echo -e "" +echo -e "5.2 - monitor - offline - with lockfile" +echo -e "=================================" +echo -e "Description:" +echo -e "run monitor while server is offline with lockfile." +echo -e "Command: ./${gameservername} monitor" requiredstatus="OFFLINE" fn_setstatus fn_print_info_nl "creating lockfile." @@ -976,16 +976,16 @@ date '+%s' > "${rootdir}/${lockselfname}" command_monitor.sh ) fn_test_result_pass -echo "run order" -echo "=================" +echo -e "run order" +echo -e "=================" grep functionfile= "${TRAVIS_BUILD_DIR}/dev-debug.log" | sed 's/functionfile=//g' -echo "" -echo "5.3 - monitor - offline - no lockfile" -echo "=================================" -echo "Description:" -echo "run monitor while server is offline with no lockfile." -echo "Command: ./${gameservername} monitor" +echo -e "" +echo -e "5.3 - monitor - offline - no lockfile" +echo -e "=================================" +echo -e "Description:" +echo -e "run monitor while server is offline with no lockfile." +echo -e "Command: ./${gameservername} monitor" requiredstatus="OFFLINE" fn_setstatus ( @@ -995,16 +995,16 @@ fn_setstatus command_monitor.sh ) fn_test_result_fail -echo "run order" -echo "=================" +echo -e "run order" +echo -e "=================" grep functionfile= "${TRAVIS_BUILD_DIR}/dev-debug.log" | sed 's/functionfile=//g' -echo "" -echo "5.4 - test-alert" -echo "=================================" -echo "Description:" -echo "run monitor while server is offline with no lockfile." -echo "Command: ./${gameservername} test-alert" +echo -e "" +echo -e "5.4 - test-alert" +echo -e "=================================" +echo -e "Description:" +echo -e "run monitor while server is offline with no lockfile." +echo -e "Command: ./${gameservername} test-alert" requiredstatus="OFFLINE" fn_setstatus cp "${servercfgfullpath}" "config.lua" @@ -1016,25 +1016,25 @@ sed -i 's/[0-9]\+/0/' "${servercfgfullpath}" command_test_alert.sh ) fn_test_result_fail -echo "run order" -echo "=================" +echo -e "run order" +echo -e "=================" grep functionfile= "${TRAVIS_BUILD_DIR}/dev-debug.log" | sed 's/functionfile=//g' -echo "" +echo -e "" fn_print_info_nl "Re-generating ${servercfg}." cp -v "config.lua" "${servercfgfullpath}" -echo "=================================" - -echo "" -echo "6.0 - Details Tests" -echo "==================================================================" - -echo "" -echo "6.1 - details" -echo "=================================" -echo "Description:" -echo "display details." -echo "Command: ./${gameservername} details" +echo -e "=================================" + +echo -e "" +echo -e "6.0 - Details Tests" +echo -e "==================================================================" + +echo -e "" +echo -e "6.1 - details" +echo -e "=================================" +echo -e "Description:" +echo -e "display details." +echo -e "Command: ./${gameservername} details" requiredstatus="ONLINE" fn_setstatus ( @@ -1044,16 +1044,16 @@ fn_setstatus command_details.sh ) fn_test_result_pass -echo "run order" -echo "=================" +echo -e "run order" +echo -e "=================" grep functionfile= "${TRAVIS_BUILD_DIR}/dev-debug.log" | sed 's/functionfile=//g' -echo "" -echo "6.2 - postdetails" -echo "=================================" -echo "Description:" -echo "post details." -echo "Command: ./${gameservername} postdetails" +echo -e "" +echo -e "6.2 - postdetails" +echo -e "=================================" +echo -e "Description:" +echo -e "post details." +echo -e "Command: ./${gameservername} postdetails" requiredstatus="ONLINE" fn_setstatus ( @@ -1063,39 +1063,39 @@ fn_setstatus command_postdetails.sh ) fn_test_result_pass -echo "run order" -echo "=================" +echo -e "run order" +echo -e "=================" grep functionfile= "${TRAVIS_BUILD_DIR}/dev-debug.log" | sed 's/functionfile=//g' -echo "" -echo "7.0 - Backup Tests" -echo "==================================================================" +echo -e "" +echo -e "7.0 - Backup Tests" +echo -e "==================================================================" -echo "" -echo "7.1 - backup" -echo "=================================" -echo "Description:" -echo "run a backup." -echo "Command: ./${gameservername} backup" +echo -e "" +echo -e "7.1 - backup" +echo -e "=================================" +echo -e "Description:" +echo -e "run a backup." +echo -e "Command: ./${gameservername} backup" requiredstatus="ONLINE" fn_setstatus -echo "test de-activated until issue #1839 fixed" +echo -e "test de-activated until issue #1839 fixed" #(command_backup.sh) fn_test_result_pass -echo "run order" -echo "=================" +echo -e "run order" +echo -e "=================" grep functionfile= "${TRAVIS_BUILD_DIR}/dev-debug.log" | sed 's/functionfile=//g' -echo "" -echo "8.0 - Development Tools Tests" -echo "==================================================================" +echo -e "" +echo -e "8.0 - Development Tools Tests" +echo -e "==================================================================" -echo "" -echo "8.1 - dev - detect glibc" -echo "=================================" -echo "Description:" -echo "detect glibc." -echo "Command: ./${gameservername} detect-glibc" +echo -e "" +echo -e "8.1 - dev - detect glibc" +echo -e "=================================" +echo -e "Description:" +echo -e "detect glibc." +echo -e "Command: ./${gameservername} detect-glibc" requiredstatus="ONLINE" fn_setstatus ( @@ -1105,16 +1105,16 @@ fn_setstatus command_dev_detect_glibc.sh ) fn_test_result_pass -echo "run order" -echo "=================" +echo -e "run order" +echo -e "=================" grep functionfile= "${TRAVIS_BUILD_DIR}/dev-debug.log" | sed 's/functionfile=//g' -echo "" -echo "8.2 - dev - detect ldd" -echo "=================================" -echo "Description:" -echo "detect ldd." -echo "Command: ./${gameservername} detect-ldd" +echo -e "" +echo -e "8.2 - dev - detect ldd" +echo -e "=================================" +echo -e "Description:" +echo -e "detect ldd." +echo -e "Command: ./${gameservername} detect-ldd" requiredstatus="ONLINE" fn_setstatus ( @@ -1124,16 +1124,16 @@ fn_setstatus command_dev_detect_ldd.sh ) fn_test_result_pass -echo "run order" -echo "=================" +echo -e "run order" +echo -e "=================" grep functionfile= "${TRAVIS_BUILD_DIR}/dev-debug.log" | sed 's/functionfile=//g' -echo "" -echo "8.3 - dev - detect deps" -echo "=================================" -echo "Description:" -echo "detect dependencies." -echo "Command: ./${gameservername} detect-deps" +echo -e "" +echo -e "8.3 - dev - detect deps" +echo -e "=================================" +echo -e "Description:" +echo -e "detect dependencies." +echo -e "Command: ./${gameservername} detect-deps" requiredstatus="ONLINE" fn_setstatus ( @@ -1143,16 +1143,16 @@ fn_setstatus command_dev_detect_deps.sh ) fn_test_result_pass -echo "run order" -echo "=================" +echo -e "run order" +echo -e "=================" grep functionfile= "${TRAVIS_BUILD_DIR}/dev-debug.log" | sed 's/functionfile=//g' -echo "" -echo "8.4 - dev - query-raw" -echo "=================================" -echo "Description:" -echo "raw query output." -echo "Command: ./${gameservername} query-raw" +echo -e "" +echo -e "8.4 - dev - query-raw" +echo -e "=================================" +echo -e "Description:" +echo -e "raw query output." +echo -e "Command: ./${gameservername} query-raw" requiredstatus="ONLINE" fn_setstatus ( @@ -1162,15 +1162,15 @@ fn_setstatus command_dev_query_raw.sh ) fn_test_result_na -echo "run order" -echo "=================" +echo -e "run order" +echo -e "=================" grep functionfile= "${TRAVIS_BUILD_DIR}/dev-debug.log" | sed 's/functionfile=//g' -echo "" -echo "=================================" -echo "Server Tests - Complete!" -echo "Using: ${gamename}" -echo "=================================" +echo -e "" +echo -e "=================================" +echo -e "Server Tests - Complete!" +echo -e "Using: ${gamename}" +echo -e "=================================" requiredstatus="OFFLINE" fn_setstatus fn_print_info "Tidying up directories." diff --git a/tests/tests_mcserver.sh b/tests/tests_mcserver.sh index df76274fb..0ddb2143b 100644 --- a/tests/tests_mcserver.sh +++ b/tests/tests_mcserver.sh @@ -93,14 +93,14 @@ fn_bootstrap_fetch_file(){ echo -e "FAIL" if [ -f "${lgsmlog}" ]; then echo -e "${remote_fileurl}" | tee -a "${lgsmlog}" - echo "${curlcmd}" | tee -a "${lgsmlog}" + echo -e "${curlcmd}" | tee -a "${lgsmlog}" fi exit 1 else echo -e "OK" fi else - echo "[ FAIL ] Curl is not installed" + echo -e "[ FAIL ] Curl is not installed" exit 1 fi # Make file chmodx if chmodx is set. @@ -158,7 +158,7 @@ fn_install_menu_bash() { fn_print_horizontal menu_options=() while read -r line || [[ -n "${line}" ]]; do - var=$(echo "${line}" | awk -F "," '{print $2 " - " $3}') + var=$(echo -e "${line}" | awk -F "," '{print $2 " - " $3}') menu_options+=( "${var}" ) done < "${options}" menu_options+=( "Cancel" ) @@ -183,8 +183,8 @@ fn_install_menu_whiptail() { IFS="," menu_options=() while read -r line; do - key=$(echo "${line}" | awk -F "," '{print $3}') - val=$(echo "${line}" | awk -F "," '{print $2}') + key=$(echo -e "${line}" | awk -F "," '{print $3}') + val=$(echo -e "${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) @@ -229,10 +229,10 @@ fn_server_info(){ fn_install_getopt(){ userinput="empty" - echo "Usage: $0 [option]" + echo -e "Usage: $0 [option]" echo -e "" - echo "Installer - Linux Game Server Managers - Version ${version}" - echo "https://linuxgsm.com" + echo -e "Installer - Linux Game Server Managers - Version ${version}" + echo -e "https://linuxgsm.com" echo -e "" echo -e "Commands" echo -e "install\t\t| Select server to install." @@ -253,15 +253,15 @@ fn_install_file(){ cp -R "${selfname}" "${local_filename}" sed -i -e "s/shortname=\"core\"/shortname=\"${shortname}\"/g" "${local_filename}" sed -i -e "s/gameservername=\"core\"/gameservername=\"${gameservername}\"/g" "${local_filename}" - echo "Installed ${gamename} server as ${local_filename}" - echo "" + echo -e "Installed ${gamename} server as ${local_filename}" + echo -e "" if [ ! -d "${serverfiles}" ]; then - echo "./${local_filename} install" + echo -e "./${local_filename} install" else - echo "Remember to check server ports" - echo "./${local_filename} details" + echo -e "Remember to check server ports" + echo -e "./${local_filename} details" fi - echo "" + echo -e "" exit } @@ -269,11 +269,11 @@ fn_install_file(){ if [ "$(whoami)" == "root" ]; then if [ "${userinput}" == "install" ]||[ "${userinput}" == "auto-install" ]||[ "${userinput}" == "i" ]||[ "${userinput}" == "ai" ]; then if [ "${shortname}" == "core" ]; then - echo "[ FAIL ] Do NOT run this script as root!" + echo -e "[ FAIL ] Do NOT run this script as root!" exit 1 fi elif [ ! -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!" + echo -e "[ FAIL ] Do NOT run this script as root!" exit 1 else core_functions.sh @@ -286,7 +286,7 @@ if [ "${shortname}" == "core" ]; then # Download the latest serverlist. This is the complete list of all supported servers. fn_bootstrap_fetch_file_github "lgsm/data" "serverlist.csv" "${datadir}" "nochmodx" "norun" "forcedl" "nomd5" if [ ! -f "${serverlist}" ]; then - echo "[ FAIL ] serverlist.csv could not be loaded." + echo -e "[ FAIL ] serverlist.csv could not be loaded." exit 1 fi @@ -303,18 +303,18 @@ if [ "${shortname}" == "core" ]; then if [ "${result}" == "${gameservername}" ]; then fn_install_file elif [ "${result}" == "" ]; then - echo "Install canceled" + echo -e "Install canceled" else - echo "[ FAIL ] menu result does not match gameservername" - echo "result: ${result}" - echo "gameservername: ${gameservername}" + echo -e "[ FAIL ] menu result does not match gameservername" + echo -e "result: ${result}" + echo -e "gameservername: ${gameservername}" fi elif [ -n "${userinput}" ]; then fn_server_info if [ "${userinput}" == "${gameservername}" ]||[ "${userinput}" == "${gamename}" ]||[ "${userinput}" == "${shortname}" ]; then fn_install_file else - echo "[ FAIL ] unknown game server" + echo -e "[ FAIL ] unknown game server" fi else fn_install_getopt @@ -408,9 +408,9 @@ fn_currentstatus_ts3(){ fn_setstatus(){ fn_currentstatus_tmux echo"" - echo "Required status: ${requiredstatus}" + echo -e "Required status: ${requiredstatus}" counter=0 - echo "Current status: ${currentstatus}" + echo -e "Current status: ${currentstatus}" while [ "${requiredstatus}" != "${currentstatus}" ]; do counter=$((counter+1)) fn_currentstatus_tmux @@ -423,16 +423,16 @@ fn_setstatus(){ fi if [ "${counter}" -gt "5" ]; then currentstatus="FAIL" - echo "Current status: ${currentstatus}" - echo "" - echo "Unable to start or stop server." + echo -e "Current status: ${currentstatus}" + echo -e "" + echo -e "Unable to start or stop server." exit 1 fi done echo -en "New status: ${currentstatus}\\r" echo -e "\n" - echo "Test starting:" - echo "" + echo -e "Test starting:" + echo -e "" } # End of every test will expect the result to either pass or fail @@ -440,88 +440,88 @@ fn_setstatus(){ # if expecting a pass fn_test_result_pass(){ if [ $? != 0 ]; then - echo "=================================" - echo "Expected result: PASS" - echo "Actual result: FAIL" + echo -e "=================================" + echo -e "Expected result: PASS" + echo -e "Actual result: FAIL" fn_print_fail_nl "TEST FAILED" exitcode=1 core_exit.sh else - echo "=================================" - echo "Expected result: PASS" - echo "Actual result: PASS" + echo -e "=================================" + echo -e "Expected result: PASS" + echo -e "Actual result: PASS" fn_print_ok_nl "TEST PASSED" - echo "" + echo -e "" fi } # if expecting a fail fn_test_result_fail(){ if [ $? == 0 ]; then - echo "=================================" - echo "Expected result: FAIL" - echo "Actual result: PASS" + echo -e "=================================" + echo -e "Expected result: FAIL" + echo -e "Actual result: PASS" fn_print_fail_nl "TEST FAILED" exitcode=1 core_exit.sh else - echo "=================================" - echo "Expected result: FAIL" - echo "Actual result: FAIL" + echo -e "=================================" + echo -e "Expected result: FAIL" + echo -e "Actual result: FAIL" fn_print_ok_nl "TEST PASSED" - echo "" + echo -e "" fi } # test result n/a fn_test_result_na(){ - echo "=================================" - echo "Expected result: N/A" - echo "Actual result: N/A" + echo -e "=================================" + echo -e "Expected result: N/A" + echo -e "Actual result: N/A" fn_print_fail_nl "TEST N/A" } -echo "=================================" -echo "Travis CI Tests" -echo "Linux Game Server Manager" -echo "by Daniel Gibbs" -echo "Contributors: http://goo.gl/qLmitD" -echo "https://linuxgsm.com" -echo "=================================" -echo "" -echo "=================================" -echo "Server Tests" -echo "Using: ${gamename}" -echo "Testing Branch: $TRAVIS_BRANCH" -echo "=================================" - -echo "" -echo "0.0 - Pre-test Tasks" -echo "==================================================================" -echo "Description:" -echo "Create log dir's" -echo "" - -echo "" -echo "0.1 - Create log dir's" -echo "=================================" -echo "" +echo -e "=================================" +echo -e "Travis CI Tests" +echo -e "Linux Game Server Manager" +echo -e "by Daniel Gibbs" +echo -e "Contributors: http://goo.gl/qLmitD" +echo -e "https://linuxgsm.com" +echo -e "=================================" +echo -e "" +echo -e "=================================" +echo -e "Server Tests" +echo -e "Using: ${gamename}" +echo -e "Testing Branch: $TRAVIS_BRANCH" +echo -e "=================================" + +echo -e "" +echo -e "0.0 - Pre-test Tasks" +echo -e "==================================================================" +echo -e "Description:" +echo -e "Create log dir's" +echo -e "" + +echo -e "" +echo -e "0.1 - Create log dir's" +echo -e "=================================" +echo -e "" ( exec 5>"${TRAVIS_BUILD_DIR}/dev-debug.log" BASH_XTRACEFD="5" set -x install_logs.sh ) -echo "run order" -echo "=================" +echo -e "run order" +echo -e "=================" grep functionfile= "${TRAVIS_BUILD_DIR}/dev-debug.log" | sed 's/functionfile=//g' -echo "" -echo "0.2 - Enable dev-debug" -echo "=================================" -echo "Description:" -echo "Enable dev-debug" -echo "" +echo -e "" +echo -e "0.2 - Enable dev-debug" +echo -e "=================================" +echo -e "Description:" +echo -e "Enable dev-debug" +echo -e "" ( exec 5>"${TRAVIS_BUILD_DIR}/dev-debug.log" BASH_XTRACEFD="5" @@ -529,21 +529,21 @@ echo "" command_dev_debug.sh ) fn_test_result_pass -echo "run order" -echo "=================" +echo -e "run order" +echo -e "=================" grep functionfile= "${TRAVIS_BUILD_DIR}/dev-debug.log" | sed 's/functionfile=//g' -echo "" -echo "1.0 - Pre-install tests" -echo "==================================================================" -echo "" - -echo "1.1 - start - no files" -echo "=================================" -echo "Description:" -echo "test script reaction to missing server files." -echo "Command: ./${gameservername} start" -echo "" +echo -e "" +echo -e "1.0 - Pre-install tests" +echo -e "==================================================================" +echo -e "" + +echo -e "1.1 - start - no files" +echo -e "=================================" +echo -e "Description:" +echo -e "test script reaction to missing server files." +echo -e "Command: ./${gameservername} start" +echo -e "" # Allows for testing not on Travis CI if [ ! -v TRAVIS ]; then ( @@ -554,20 +554,20 @@ if [ ! -v TRAVIS ]; then ) fn_test_result_fail else - echo "Test bypassed" + echo -e "Test bypassed" fi -echo "run order" -echo "=================" +echo -e "run order" +echo -e "=================" grep functionfile= "${TRAVIS_BUILD_DIR}/dev-debug.log" | sed 's/functionfile=//g' -echo "" -echo "1.2 - getopt" -echo "=================================" -echo "Description:" -echo "displaying options messages." -echo "Command: ./${gameservername}" -echo "" +echo -e "" +echo -e "1.2 - getopt" +echo -e "=================================" +echo -e "Description:" +echo -e "displaying options messages." +echo -e "Command: ./${gameservername}" +echo -e "" ( exec 5>"${TRAVIS_BUILD_DIR}/dev-debug.log" BASH_XTRACEFD="5" @@ -575,17 +575,17 @@ echo "" core_getopt.sh ) fn_test_result_pass -echo "run order" -echo "=================" +echo -e "run order" +echo -e "=================" grep functionfile= "${TRAVIS_BUILD_DIR}/dev-debug.log" | sed 's/functionfile=//g' -echo "" -echo "1.3 - getopt with incorrect args" -echo "=================================" -echo "Description:" -echo "displaying options messages." -echo "Command: ./${gameservername} abc123" -echo "" +echo -e "" +echo -e "1.3 - getopt with incorrect args" +echo -e "=================================" +echo -e "Description:" +echo -e "displaying options messages." +echo -e "Command: ./${gameservername} abc123" +echo -e "" getopt="abc123" ( exec 5>"${TRAVIS_BUILD_DIR}/dev-debug.log" @@ -594,20 +594,20 @@ getopt="abc123" core_getopt.sh ) fn_test_result_fail -echo "run order" -echo "=================" +echo -e "run order" +echo -e "=================" grep functionfile= "${TRAVIS_BUILD_DIR}/dev-debug.log" | sed 's/functionfile=//g' -echo "" -echo "2.0 - Installation" -echo "==================================================================" +echo -e "" +echo -e "2.0 - Installation" +echo -e "==================================================================" -echo "" -echo "2.0 - install" -echo "=================================" -echo "Description:" -echo "install ${gamename} server." -echo "Command: ./${gameservername} auto-install" +echo -e "" +echo -e "2.0 - install" +echo -e "=================================" +echo -e "Description:" +echo -e "install ${gamename} server." +echo -e "Command: ./${gameservername} auto-install" ( exec 5>"${TRAVIS_BUILD_DIR}/dev-debug.log" BASH_XTRACEFD="5" @@ -615,20 +615,20 @@ echo "Command: ./${gameservername} auto-install" fn_autoinstall ) fn_test_result_pass -echo "run order" -echo "=================" +echo -e "run order" +echo -e "=================" grep functionfile= "${TRAVIS_BUILD_DIR}/dev-debug.log" | sed 's/functionfile=//g' -echo "" -echo "3.0 - Start/Stop/Restart Tests" -echo "==================================================================" +echo -e "" +echo -e "3.0 - Start/Stop/Restart Tests" +echo -e "==================================================================" -echo "" -echo "3.1 - start" -echo "=================================" -echo "Description:" -echo "start ${gamename} server." -echo "Command: ./${gameservername} start" +echo -e "" +echo -e "3.1 - start" +echo -e "=================================" +echo -e "Description:" +echo -e "start ${gamename} server." +echo -e "Command: ./${gameservername} start" requiredstatus="OFFLINE" fn_setstatus ( @@ -638,16 +638,16 @@ fn_setstatus command_start.sh ) fn_test_result_pass -echo "run order" -echo "=================" +echo -e "run order" +echo -e "=================" grep functionfile= "${TRAVIS_BUILD_DIR}/dev-debug.log" | sed 's/functionfile=//g' -echo "" -echo "3.2 - start - online" -echo "=================================" -echo "Description:" -echo "start ${gamename} server while already running." -echo "Command: ./${gameservername} start" +echo -e "" +echo -e "3.2 - start - online" +echo -e "=================================" +echo -e "Description:" +echo -e "start ${gamename} server while already running." +echo -e "Command: ./${gameservername} start" requiredstatus="ONLINE" fn_setstatus ( @@ -657,16 +657,16 @@ fn_setstatus command_start.sh ) fn_test_result_fail -echo "run order" -echo "=================" +echo -e "run order" +echo -e "=================" grep functionfile= "${TRAVIS_BUILD_DIR}/dev-debug.log" | sed 's/functionfile=//g' -echo "" -echo "3.3 - start - updateonstart" -echo "=================================" -echo "Description:" -echo "will update server on start." -echo "Command: ./${gameservername} start" +echo -e "" +echo -e "3.3 - start - updateonstart" +echo -e "=================================" +echo -e "Description:" +echo -e "will update server on start." +echo -e "Command: ./${gameservername} start" requiredstatus="OFFLINE" fn_setstatus ( @@ -676,25 +676,25 @@ fn_setstatus updateonstart="on";command_start.sh ) fn_test_result_pass -echo "run order" -echo "=================" +echo -e "run order" +echo -e "=================" grep functionfile= "${TRAVIS_BUILD_DIR}/dev-debug.log" | sed 's/functionfile=//g' -echo "" -echo "30s Pause" -echo "=================================" -echo "Description:" -echo "give time for server to fully start." -echo "Command: sleep 30" +echo -e "" +echo -e "30s Pause" +echo -e "=================================" +echo -e "Description:" +echo -e "give time for server to fully start." +echo -e "Command: sleep 30" requiredstatus="ONLINE" fn_setstatus sleep 30 -echo "" -echo "3.4 - stop" -echo "=================================" -echo "Description:" -echo "stop ${gamename} server." -echo "Command: ./${gameservername} stop" +echo -e "" +echo -e "3.4 - stop" +echo -e "=================================" +echo -e "Description:" +echo -e "stop ${gamename} server." +echo -e "Command: ./${gameservername} stop" requiredstatus="ONLINE" fn_setstatus ( @@ -704,16 +704,16 @@ fn_setstatus command_stop.sh ) fn_test_result_pass -echo "run order" -echo "=================" +echo -e "run order" +echo -e "=================" grep functionfile= "${TRAVIS_BUILD_DIR}/dev-debug.log" | sed 's/functionfile=//g' -echo "" -echo "3.5 - stop - offline" -echo "=================================" -echo "Description:" -echo "stop ${gamename} server while already stopped." -echo "Command: ./${gameservername} stop" +echo -e "" +echo -e "3.5 - stop - offline" +echo -e "=================================" +echo -e "Description:" +echo -e "stop ${gamename} server while already stopped." +echo -e "Command: ./${gameservername} stop" requiredstatus="OFFLINE" fn_setstatus ( @@ -723,16 +723,16 @@ fn_setstatus command_stop.sh ) fn_test_result_fail -echo "run order" -echo "=================" +echo -e "run order" +echo -e "=================" grep functionfile= "${TRAVIS_BUILD_DIR}/dev-debug.log" | sed 's/functionfile=//g' -echo "" -echo "3.6 - restart" -echo "=================================" -echo "Description:" -echo "restart ${gamename}." -echo "Command: ./${gameservername} restart" +echo -e "" +echo -e "3.6 - restart" +echo -e "=================================" +echo -e "Description:" +echo -e "restart ${gamename}." +echo -e "Command: ./${gameservername} restart" requiredstatus="ONLINE" fn_setstatus ( @@ -742,16 +742,16 @@ fn_setstatus command_restart.sh ) fn_test_result_pass -echo "run order" -echo "=================" +echo -e "run order" +echo -e "=================" grep functionfile= "${TRAVIS_BUILD_DIR}/dev-debug.log" | sed 's/functionfile=//g' -echo "" -echo "3.7 - restart - offline" -echo "=================================" -echo "Description:" -echo "restart ${gamename} while already stopped." -echo "Command: ./${gameservername} restart" +echo -e "" +echo -e "3.7 - restart - offline" +echo -e "=================================" +echo -e "Description:" +echo -e "restart ${gamename} while already stopped." +echo -e "Command: ./${gameservername} restart" requiredstatus="OFFLINE" fn_setstatus ( @@ -761,20 +761,20 @@ fn_setstatus command_restart.sh ) fn_test_result_pass -echo "run order" -echo "=================" +echo -e "run order" +echo -e "=================" grep functionfile= "${TRAVIS_BUILD_DIR}/dev-debug.log" | sed 's/functionfile=//g' -echo "" -echo "4.0 - Update Tests" -echo "==================================================================" +echo -e "" +echo -e "4.0 - Update Tests" +echo -e "==================================================================" -echo "" -echo "4.1 - update" -echo "=================================" -echo "Description:" -echo "check for updates." -echo "Command: ./${gameservername} update" +echo -e "" +echo -e "4.1 - update" +echo -e "=================================" +echo -e "Description:" +echo -e "check for updates." +echo -e "Command: ./${gameservername} update" requiredstatus="OFFLINE" fn_setstatus ( @@ -784,47 +784,47 @@ fn_setstatus command_update.sh ) fn_test_result_pass -echo "run order" -echo "=================" +echo -e "run order" +echo -e "=================" grep functionfile= "${TRAVIS_BUILD_DIR}/dev-debug.log" | sed 's/functionfile=//g' -echo "" -echo "Inserting IP address" -echo "=================================" -echo "Description:" -echo "Inserting Travis IP in to config." -echo "Allows monitor to work" +echo -e "" +echo -e "Inserting IP address" +echo -e "=================================" +echo -e "Description:" +echo -e "Inserting Travis IP in to config." +echo -e "Allows monitor to work" if [ "$(ip -o -4 addr|grep eth0)" ]; then travisip=$(ip -o -4 addr | grep eth0 | awk '{print $4}' | grep -oe '\([0-9]\{1,3\}\.\?\)\{4\}' | grep -v 127.0.0) else travisip=$(ip -o -4 addr | grep ens | awk '{print $4}' | grep -oe '\([0-9]\{1,3\}\.\?\)\{4\}' | sort -u | grep -v 127.0.0) fi sed -i "/server-ip=/c\server-ip=${travisip}" "${serverfiles}/server.properties" -echo "IP: ${travisip}" - -echo "" -echo "5.0 - Monitor Tests" -echo "==================================================================" -echo "" -echo "Server IP - Port: ${ip}:${port}" -echo "Server IP - Query Port: ${ip}:${queryport}" - -echo "" -echo "30s Pause" -echo "=================================" -echo "Description:" -echo "give time for server to fully start." -echo "Command: sleep 30" +echo -e "IP: ${travisip}" + +echo -e "" +echo -e "5.0 - Monitor Tests" +echo -e "==================================================================" +echo -e "" +echo -e "Server IP - Port: ${ip}:${port}" +echo -e "Server IP - Query Port: ${ip}:${queryport}" + +echo -e "" +echo -e "30s Pause" +echo -e "=================================" +echo -e "Description:" +echo -e "give time for server to fully start." +echo -e "Command: sleep 30" requiredstatus="ONLINE" fn_setstatus sleep 30 -echo "" -echo "5.1 - monitor - online" -echo "=================================" -echo "Description:" -echo "run monitor server while already running." -echo "Command: ./${gameservername} monitor" +echo -e "" +echo -e "5.1 - monitor - online" +echo -e "=================================" +echo -e "Description:" +echo -e "run monitor server while already running." +echo -e "Command: ./${gameservername} monitor" requiredstatus="ONLINE" fn_setstatus ( @@ -834,16 +834,16 @@ fn_setstatus command_monitor.sh ) fn_test_result_pass -echo "run order" -echo "=================" +echo -e "run order" +echo -e "=================" grep functionfile= "${TRAVIS_BUILD_DIR}/dev-debug.log" | sed 's/functionfile=//g' -echo "" -echo "5.2 - monitor - offline - with lockfile" -echo "=================================" -echo "Description:" -echo "run monitor while server is offline with lockfile." -echo "Command: ./${gameservername} monitor" +echo -e "" +echo -e "5.2 - monitor - offline - with lockfile" +echo -e "=================================" +echo -e "Description:" +echo -e "run monitor while server is offline with lockfile." +echo -e "Command: ./${gameservername} monitor" requiredstatus="OFFLINE" fn_setstatus fn_print_info_nl "creating lockfile." @@ -855,16 +855,16 @@ date '+%s' > "${rootdir}/${lockselfname}" command_monitor.sh ) fn_test_result_pass -echo "run order" -echo "=================" +echo -e "run order" +echo -e "=================" grep functionfile= "${TRAVIS_BUILD_DIR}/dev-debug.log" | sed 's/functionfile=//g' -echo "" -echo "5.3 - monitor - offline - no lockfile" -echo "=================================" -echo "Description:" -echo "run monitor while server is offline with no lockfile." -echo "Command: ./${gameservername} monitor" +echo -e "" +echo -e "5.3 - monitor - offline - no lockfile" +echo -e "=================================" +echo -e "Description:" +echo -e "run monitor while server is offline with no lockfile." +echo -e "Command: ./${gameservername} monitor" requiredstatus="OFFLINE" fn_setstatus ( @@ -874,16 +874,16 @@ fn_setstatus command_monitor.sh ) fn_test_result_fail -echo "run order" -echo "=================" +echo -e "run order" +echo -e "=================" grep functionfile= "${TRAVIS_BUILD_DIR}/dev-debug.log" | sed 's/functionfile=//g' -echo "" -echo "5.4 - test-alert" -echo "=================================" -echo "Description:" -echo "run monitor while server is offline with no lockfile." -echo "Command: ./${gameservername} test-alert" +echo -e "" +echo -e "5.4 - test-alert" +echo -e "=================================" +echo -e "Description:" +echo -e "run monitor while server is offline with no lockfile." +echo -e "Command: ./${gameservername} test-alert" requiredstatus="OFFLINE" fn_setstatus ( @@ -893,20 +893,20 @@ fn_setstatus command_test_alert.sh ) fn_test_result_fail -echo "run order" -echo "=================" +echo -e "run order" +echo -e "=================" grep functionfile= "${TRAVIS_BUILD_DIR}/dev-debug.log" | sed 's/functionfile=//g' -echo "" -echo "6.0 - Details Tests" -echo "==================================================================" +echo -e "" +echo -e "6.0 - Details Tests" +echo -e "==================================================================" -echo "" -echo "6.1 - details" -echo "=================================" -echo "Description:" -echo "display details." -echo "Command: ./${gameservername} details" +echo -e "" +echo -e "6.1 - details" +echo -e "=================================" +echo -e "Description:" +echo -e "display details." +echo -e "Command: ./${gameservername} details" requiredstatus="ONLINE" fn_setstatus ( @@ -916,16 +916,16 @@ fn_setstatus command_details.sh ) fn_test_result_pass -echo "run order" -echo "=================" +echo -e "run order" +echo -e "=================" grep functionfile= "${TRAVIS_BUILD_DIR}/dev-debug.log" | sed 's/functionfile=//g' -echo "" -echo "6.2 - postdetails" -echo "=================================" -echo "Description:" -echo "post details." -echo "Command: ./${gameservername} postdetails" +echo -e "" +echo -e "6.2 - postdetails" +echo -e "=================================" +echo -e "Description:" +echo -e "post details." +echo -e "Command: ./${gameservername} postdetails" requiredstatus="ONLINE" fn_setstatus ( @@ -935,39 +935,39 @@ fn_setstatus command_postdetails.sh ) fn_test_result_pass -echo "run order" -echo "=================" +echo -e "run order" +echo -e "=================" grep functionfile= "${TRAVIS_BUILD_DIR}/dev-debug.log" | sed 's/functionfile=//g' -echo "" -echo "7.0 - Backup Tests" -echo "==================================================================" +echo -e "" +echo -e "7.0 - Backup Tests" +echo -e "==================================================================" -echo "" -echo "7.1 - backup" -echo "=================================" -echo "Description:" -echo "run a backup." -echo "Command: ./${gameservername} backup" +echo -e "" +echo -e "7.1 - backup" +echo -e "=================================" +echo -e "Description:" +echo -e "run a backup." +echo -e "Command: ./${gameservername} backup" requiredstatus="ONLINE" fn_setstatus -echo "test de-activated until issue #1839 fixed" +echo -e "test de-activated until issue #1839 fixed" #(command_backup.sh) fn_test_result_pass -echo "run order" -echo "=================" +echo -e "run order" +echo -e "=================" grep functionfile= "${TRAVIS_BUILD_DIR}/dev-debug.log" | sed 's/functionfile=//g' -echo "" -echo "8.0 - Development Tools Tests" -echo "==================================================================" +echo -e "" +echo -e "8.0 - Development Tools Tests" +echo -e "==================================================================" -echo "" -echo "8.1 - dev - detect glibc" -echo "=================================" -echo "Description:" -echo "detect glibc." -echo "Command: ./${gameservername} detect-glibc" +echo -e "" +echo -e "8.1 - dev - detect glibc" +echo -e "=================================" +echo -e "Description:" +echo -e "detect glibc." +echo -e "Command: ./${gameservername} detect-glibc" requiredstatus="ONLINE" fn_setstatus ( @@ -977,16 +977,16 @@ fn_setstatus command_dev_detect_glibc.sh ) fn_test_result_pass -echo "run order" -echo "=================" +echo -e "run order" +echo -e "=================" grep functionfile= "${TRAVIS_BUILD_DIR}/dev-debug.log" | sed 's/functionfile=//g' -echo "" -echo "8.2 - dev - detect ldd" -echo "=================================" -echo "Description:" -echo "detect ldd." -echo "Command: ./${gameservername} detect-ldd" +echo -e "" +echo -e "8.2 - dev - detect ldd" +echo -e "=================================" +echo -e "Description:" +echo -e "detect ldd." +echo -e "Command: ./${gameservername} detect-ldd" requiredstatus="ONLINE" fn_setstatus ( @@ -996,16 +996,16 @@ fn_setstatus command_dev_detect_ldd.sh ) fn_test_result_pass -echo "run order" -echo "=================" +echo -e "run order" +echo -e "=================" grep functionfile= "${TRAVIS_BUILD_DIR}/dev-debug.log" | sed 's/functionfile=//g' -echo "" -echo "8.3 - dev - detect deps" -echo "=================================" -echo "Description:" -echo "detect dependencies." -echo "Command: ./${gameservername} detect-deps" +echo -e "" +echo -e "8.3 - dev - detect deps" +echo -e "=================================" +echo -e "Description:" +echo -e "detect dependencies." +echo -e "Command: ./${gameservername} detect-deps" requiredstatus="ONLINE" fn_setstatus ( @@ -1015,30 +1015,30 @@ fn_setstatus command_dev_detect_deps.sh ) fn_test_result_pass -echo "run order" -echo "=================" +echo -e "run order" +echo -e "=================" grep functionfile= "${TRAVIS_BUILD_DIR}/dev-debug.log" | sed 's/functionfile=//g' -echo "" -echo "Inserting IP address" -echo "=================================" -echo "Description:" -echo "Inserting Travis IP in to config." -echo "Allows monitor to work" +echo -e "" +echo -e "Inserting IP address" +echo -e "=================================" +echo -e "Description:" +echo -e "Inserting Travis IP in to config." +echo -e "Allows monitor to work" if [ "$(ip -o -4 addr|grep eth0)" ]; then travisip=$(ip -o -4 addr | grep eth0 | awk '{print $4}' | grep -oe '\([0-9]\{1,3\}\.\?\)\{4\}' | grep -v 127.0.0) else travisip=$(ip -o -4 addr | grep ens | awk '{print $4}' | grep -oe '\([0-9]\{1,3\}\.\?\)\{4\}' | sort -u | grep -v 127.0.0) fi sed -i "/server-ip=/c\server-ip=${travisip}" "${serverfiles}/server.properties" -echo "IP: ${travisip}" - -echo "" -echo "8.4 - dev - query-raw" -echo "=================================" -echo "Description:" -echo "raw query output." -echo "Command: ./${gameservername} query-raw" +echo -e "IP: ${travisip}" + +echo -e "" +echo -e "8.4 - dev - query-raw" +echo -e "=================================" +echo -e "Description:" +echo -e "raw query output." +echo -e "Command: ./${gameservername} query-raw" requiredstatus="ONLINE" fn_setstatus ( @@ -1048,15 +1048,15 @@ fn_setstatus command_dev_query_raw.sh ) fn_test_result_na -echo "run order" -echo "=================" +echo -e "run order" +echo -e "=================" grep functionfile= "${TRAVIS_BUILD_DIR}/dev-debug.log" | sed 's/functionfile=//g' -echo "" -echo "=================================" -echo "Server Tests - Complete!" -echo "Using: ${gamename}" -echo "=================================" +echo -e "" +echo -e "=================================" +echo -e "Server Tests - Complete!" +echo -e "Using: ${gamename}" +echo -e "=================================" requiredstatus="OFFLINE" fn_setstatus fn_print_info "Tidying up directories." diff --git a/tests/tests_shellcheck.sh b/tests/tests_shellcheck.sh index 6d33507e6..51784906c 100644 --- a/tests/tests_shellcheck.sh +++ b/tests/tests_shellcheck.sh @@ -7,26 +7,26 @@ # Documentation: https://docs.linuxgsm.com/ # Website: https://linuxgsm.com -echo "=================================" -echo "Travis CI Tests" -echo "Linux Game Server Manager" -echo "by Daniel Gibbs" -echo "Contributors: http://goo.gl/qLmitD" -echo "https://linuxgsm.com" -echo "=================================" -echo "" -echo "=================================" -echo "Bash Analysis Tests" -echo "Using: Shellcheck" -echo "Testing Branch: $TRAVIS_BRANCH" -echo "=================================" -echo "" +echo -e "=================================" +echo -e "Travis CI Tests" +echo -e "Linux Game Server Manager" +echo -e "by Daniel Gibbs" +echo -e "Contributors: http://goo.gl/qLmitD" +echo -e "https://linuxgsm.com" +echo -e "=================================" +echo -e "" +echo -e "=================================" +echo -e "Bash Analysis Tests" +echo -e "Using: Shellcheck" +echo -e "Testing Branch: $TRAVIS_BRANCH" +echo -e "=================================" +echo -e "" scissues=$(find . -type f \( -name "*.sh" -o -name "*.cfg" \) -not -path "./shunit2-2.1.6/*" -exec shellcheck --shell=bash --exclude=SC2154,SC2034 {} \; | grep -F "^--" | wc -l) -echo "Found issues: ${scissues}" -echo "=================================" +echo -e "Found issues: ${scissues}" +echo -e "=================================" find . -type f \( -name "*.sh" -o -name "*.cfg" \) -not -path "./shunit2-2.1.6/*" -exec shellcheck --shell=bash --exclude=SC2154,SC2034 {} \; -echo "" -echo "=================================" -echo "Bash Analysis Tests - Complete!" -echo "Using: Shellcheck" -echo "=================================" +echo -e "" +echo -e "=================================" +echo -e "Bash Analysis Tests - Complete!" +echo -e "Using: Shellcheck" +echo -e "=================================" diff --git a/tests/tests_ts3server.sh b/tests/tests_ts3server.sh index c0d257059..3df1b4a96 100644 --- a/tests/tests_ts3server.sh +++ b/tests/tests_ts3server.sh @@ -93,14 +93,14 @@ fn_bootstrap_fetch_file(){ echo -e "FAIL" if [ -f "${lgsmlog}" ]; then echo -e "${remote_fileurl}" | tee -a "${lgsmlog}" - echo "${curlcmd}" | tee -a "${lgsmlog}" + echo -e "${curlcmd}" | tee -a "${lgsmlog}" fi exit 1 else echo -e "OK" fi else - echo "[ FAIL ] Curl is not installed" + echo -e "[ FAIL ] Curl is not installed" exit 1 fi # Make file chmodx if chmodx is set. @@ -158,7 +158,7 @@ fn_install_menu_bash() { fn_print_horizontal menu_options=() while read -r line || [[ -n "${line}" ]]; do - var=$(echo "${line}" | awk -F "," '{print $2 " - " $3}') + var=$(echo -e "${line}" | awk -F "," '{print $2 " - " $3}') menu_options+=( "${var}" ) done < "${options}" menu_options+=( "Cancel" ) @@ -183,8 +183,8 @@ fn_install_menu_whiptail() { IFS="," menu_options=() while read -r line; do - key=$(echo "${line}" | awk -F "," '{print $3}') - val=$(echo "${line}" | awk -F "," '{print $2}') + key=$(echo -e "${line}" | awk -F "," '{print $3}') + val=$(echo -e "${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) @@ -229,10 +229,10 @@ fn_server_info(){ fn_install_getopt(){ userinput="empty" - echo "Usage: $0 [option]" + echo -e "Usage: $0 [option]" echo -e "" - echo "Installer - Linux Game Server Managers - Version ${version}" - echo "https://linuxgsm.com" + echo -e "Installer - Linux Game Server Managers - Version ${version}" + echo -e "https://linuxgsm.com" echo -e "" echo -e "Commands" echo -e "install\t\t| Select server to install." @@ -253,15 +253,15 @@ fn_install_file(){ cp -R "${selfname}" "${local_filename}" sed -i -e "s/shortname=\"core\"/shortname=\"${shortname}\"/g" "${local_filename}" sed -i -e "s/gameservername=\"core\"/gameservername=\"${gameservername}\"/g" "${local_filename}" - echo "Installed ${gamename} server as ${local_filename}" - echo "" + echo -e "Installed ${gamename} server as ${local_filename}" + echo -e "" if [ ! -d "${serverfiles}" ]; then - echo "./${local_filename} install" + echo -e "./${local_filename} install" else - echo "Remember to check server ports" - echo "./${local_filename} details" + echo -e "Remember to check server ports" + echo -e "./${local_filename} details" fi - echo "" + echo -e "" exit } @@ -269,11 +269,11 @@ fn_install_file(){ if [ "$(whoami)" == "root" ]; then if [ "${userinput}" == "install" ]||[ "${userinput}" == "auto-install" ]||[ "${userinput}" == "i" ]||[ "${userinput}" == "ai" ]; then if [ "${shortname}" == "core" ]; then - echo "[ FAIL ] Do NOT run this script as root!" + echo -e "[ FAIL ] Do NOT run this script as root!" exit 1 fi elif [ ! -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!" + echo -e "[ FAIL ] Do NOT run this script as root!" exit 1 else core_functions.sh @@ -286,7 +286,7 @@ if [ "${shortname}" == "core" ]; then # Download the latest serverlist. This is the complete list of all supported servers. fn_bootstrap_fetch_file_github "lgsm/data" "serverlist.csv" "${datadir}" "nochmodx" "norun" "forcedl" "nomd5" if [ ! -f "${serverlist}" ]; then - echo "[ FAIL ] serverlist.csv could not be loaded." + echo -e "[ FAIL ] serverlist.csv could not be loaded." exit 1 fi @@ -303,18 +303,18 @@ if [ "${shortname}" == "core" ]; then if [ "${result}" == "${gameservername}" ]; then fn_install_file elif [ "${result}" == "" ]; then - echo "Install canceled" + echo -e "Install canceled" else - echo "[ FAIL ] menu result does not match gameservername" - echo "result: ${result}" - echo "gameservername: ${gameservername}" + echo -e "[ FAIL ] menu result does not match gameservername" + echo -e "result: ${result}" + echo -e "gameservername: ${gameservername}" fi elif [ -n "${userinput}" ]; then fn_server_info if [ "${userinput}" == "${gameservername}" ]||[ "${userinput}" == "${gamename}" ]||[ "${userinput}" == "${shortname}" ]; then fn_install_file else - echo "[ FAIL ] unknown game server" + echo -e "[ FAIL ] unknown game server" fi else fn_install_getopt @@ -408,9 +408,9 @@ fn_currentstatus_ts3(){ fn_setstatus(){ fn_currentstatus_ts3 echo"" - echo "Required status: ${requiredstatus}" + echo -e "Required status: ${requiredstatus}" counter=0 - echo "Current status: ${currentstatus}" + echo -e "Current status: ${currentstatus}" while [ "${requiredstatus}" != "${currentstatus}" ]; do counter=$((counter+1)) fn_currentstatus_ts3 @@ -423,16 +423,16 @@ fn_setstatus(){ fi if [ "${counter}" -gt "5" ]; then currentstatus="FAIL" - echo "Current status: ${currentstatus}" - echo "" - echo "Unable to start or stop server." + echo -e "Current status: ${currentstatus}" + echo -e "" + echo -e "Unable to start or stop server." exit 1 fi done echo -en "New status: ${currentstatus}\\r" echo -e "\n" - echo "Test starting:" - echo "" + echo -e "Test starting:" + echo -e "" } # End of every test will expect the result to either pass or fail @@ -440,88 +440,88 @@ fn_setstatus(){ # if expecting a pass fn_test_result_pass(){ if [ $? != 0 ]; then - echo "=================================" - echo "Expected result: PASS" - echo "Actual result: FAIL" + echo -e "=================================" + echo -e "Expected result: PASS" + echo -e "Actual result: FAIL" fn_print_fail_nl "TEST FAILED" exitcode=1 core_exit.sh else - echo "=================================" - echo "Expected result: PASS" - echo "Actual result: PASS" + echo -e "=================================" + echo -e "Expected result: PASS" + echo -e "Actual result: PASS" fn_print_ok_nl "TEST PASSED" - echo "" + echo -e "" fi } # if expecting a fail fn_test_result_fail(){ if [ $? == 0 ]; then - echo "=================================" - echo "Expected result: FAIL" - echo "Actual result: PASS" + echo -e "=================================" + echo -e "Expected result: FAIL" + echo -e "Actual result: PASS" fn_print_fail_nl "TEST FAILED" exitcode=1 core_exit.sh else - echo "=================================" - echo "Expected result: FAIL" - echo "Actual result: FAIL" + echo -e "=================================" + echo -e "Expected result: FAIL" + echo -e "Actual result: FAIL" fn_print_ok_nl "TEST PASSED" - echo "" + echo -e "" fi } # test result n/a fn_test_result_na(){ - echo "=================================" - echo "Expected result: N/A" - echo "Actual result: N/A" + echo -e "=================================" + echo -e "Expected result: N/A" + echo -e "Actual result: N/A" fn_print_fail_nl "TEST N/A" } -echo "=================================" -echo "Travis CI Tests" -echo "Linux Game Server Manager" -echo "by Daniel Gibbs" -echo "Contributors: http://goo.gl/qLmitD" -echo "https://linuxgsm.com" -echo "=================================" -echo "" -echo "=================================" -echo "Server Tests" -echo "Using: ${gamename}" -echo "Testing Branch: $TRAVIS_BRANCH" -echo "=================================" - -echo "" -echo "0.0 - Pre-test Tasks" -echo "==================================================================" -echo "Description:" -echo "Create log dir's" -echo "" - -echo "" -echo "0.1 - Create log dir's" -echo "=================================" -echo "" +echo -e "=================================" +echo -e "Travis CI Tests" +echo -e "Linux Game Server Manager" +echo -e "by Daniel Gibbs" +echo -e "Contributors: http://goo.gl/qLmitD" +echo -e "https://linuxgsm.com" +echo -e "=================================" +echo -e "" +echo -e "=================================" +echo -e "Server Tests" +echo -e "Using: ${gamename}" +echo -e "Testing Branch: $TRAVIS_BRANCH" +echo -e "=================================" + +echo -e "" +echo -e "0.0 - Pre-test Tasks" +echo -e "==================================================================" +echo -e "Description:" +echo -e "Create log dir's" +echo -e "" + +echo -e "" +echo -e "0.1 - Create log dir's" +echo -e "=================================" +echo -e "" ( exec 5>"${TRAVIS_BUILD_DIR}/dev-debug.log" BASH_XTRACEFD="5" set -x install_logs.sh ) -echo "run order" -echo "=================" +echo -e "run order" +echo -e "=================" grep functionfile= "${TRAVIS_BUILD_DIR}/dev-debug.log" | sed 's/functionfile=//g' -echo "" -echo "0.2 - Enable dev-debug" -echo "=================================" -echo "Description:" -echo "Enable dev-debug" -echo "" +echo -e "" +echo -e "0.2 - Enable dev-debug" +echo -e "=================================" +echo -e "Description:" +echo -e "Enable dev-debug" +echo -e "" ( exec 5>"${TRAVIS_BUILD_DIR}/dev-debug.log" BASH_XTRACEFD="5" @@ -529,21 +529,21 @@ echo "" command_dev_debug.sh ) fn_test_result_pass -echo "run order" -echo "=================" +echo -e "run order" +echo -e "=================" grep functionfile= "${TRAVIS_BUILD_DIR}/dev-debug.log" | sed 's/functionfile=//g' -echo "" -echo "1.0 - Pre-install tests" -echo "==================================================================" -echo "" - -echo "1.1 - start - no files" -echo "=================================" -echo "Description:" -echo "test script reaction to missing server files." -echo "Command: ./${gameservername} start" -echo "" +echo -e "" +echo -e "1.0 - Pre-install tests" +echo -e "==================================================================" +echo -e "" + +echo -e "1.1 - start - no files" +echo -e "=================================" +echo -e "Description:" +echo -e "test script reaction to missing server files." +echo -e "Command: ./${gameservername} start" +echo -e "" # Allows for testing not on Travis CI if [ ! -v TRAVIS ]; then ( @@ -554,20 +554,20 @@ if [ ! -v TRAVIS ]; then ) fn_test_result_fail else - echo "Test bypassed" + echo -e "Test bypassed" fi -echo "run order" -echo "=================" +echo -e "run order" +echo -e "=================" grep functionfile= "${TRAVIS_BUILD_DIR}/dev-debug.log" | sed 's/functionfile=//g' -echo "" -echo "1.2 - getopt" -echo "=================================" -echo "Description:" -echo "displaying options messages." -echo "Command: ./${gameservername}" -echo "" +echo -e "" +echo -e "1.2 - getopt" +echo -e "=================================" +echo -e "Description:" +echo -e "displaying options messages." +echo -e "Command: ./${gameservername}" +echo -e "" ( exec 5>"${TRAVIS_BUILD_DIR}/dev-debug.log" BASH_XTRACEFD="5" @@ -575,17 +575,17 @@ echo "" core_getopt.sh ) fn_test_result_pass -echo "run order" -echo "=================" +echo -e "run order" +echo -e "=================" grep functionfile= "${TRAVIS_BUILD_DIR}/dev-debug.log" | sed 's/functionfile=//g' -echo "" -echo "1.3 - getopt with incorrect args" -echo "=================================" -echo "Description:" -echo "displaying options messages." -echo "Command: ./${gameservername} abc123" -echo "" +echo -e "" +echo -e "1.3 - getopt with incorrect args" +echo -e "=================================" +echo -e "Description:" +echo -e "displaying options messages." +echo -e "Command: ./${gameservername} abc123" +echo -e "" getopt="abc123" ( exec 5>"${TRAVIS_BUILD_DIR}/dev-debug.log" @@ -594,20 +594,20 @@ getopt="abc123" core_getopt.sh ) fn_test_result_fail -echo "run order" -echo "=================" +echo -e "run order" +echo -e "=================" grep functionfile= "${TRAVIS_BUILD_DIR}/dev-debug.log" | sed 's/functionfile=//g' -echo "" -echo "2.0 - Installation" -echo "==================================================================" +echo -e "" +echo -e "2.0 - Installation" +echo -e "==================================================================" -echo "" -echo "2.0 - install" -echo "=================================" -echo "Description:" -echo "install ${gamename} server." -echo "Command: ./${gameservername} auto-install" +echo -e "" +echo -e "2.0 - install" +echo -e "=================================" +echo -e "Description:" +echo -e "install ${gamename} server." +echo -e "Command: ./${gameservername} auto-install" ( exec 5>"${TRAVIS_BUILD_DIR}/dev-debug.log" BASH_XTRACEFD="5" @@ -615,20 +615,20 @@ echo "Command: ./${gameservername} auto-install" fn_autoinstall ) fn_test_result_pass -echo "run order" -echo "=================" +echo -e "run order" +echo -e "=================" grep functionfile= "${TRAVIS_BUILD_DIR}/dev-debug.log" | sed 's/functionfile=//g' -echo "" -echo "3.0 - Start/Stop/Restart Tests" -echo "==================================================================" +echo -e "" +echo -e "3.0 - Start/Stop/Restart Tests" +echo -e "==================================================================" -echo "" -echo "3.1 - start" -echo "=================================" -echo "Description:" -echo "start ${gamename} server." -echo "Command: ./${gameservername} start" +echo -e "" +echo -e "3.1 - start" +echo -e "=================================" +echo -e "Description:" +echo -e "start ${gamename} server." +echo -e "Command: ./${gameservername} start" requiredstatus="OFFLINE" fn_setstatus ( @@ -638,16 +638,16 @@ fn_setstatus command_start.sh ) fn_test_result_pass -echo "run order" -echo "=================" +echo -e "run order" +echo -e "=================" grep functionfile= "${TRAVIS_BUILD_DIR}/dev-debug.log" | sed 's/functionfile=//g' -echo "" -echo "3.2 - start - online" -echo "=================================" -echo "Description:" -echo "start ${gamename} server while already running." -echo "Command: ./${gameservername} start" +echo -e "" +echo -e "3.2 - start - online" +echo -e "=================================" +echo -e "Description:" +echo -e "start ${gamename} server while already running." +echo -e "Command: ./${gameservername} start" requiredstatus="ONLINE" fn_setstatus ( @@ -657,16 +657,16 @@ fn_setstatus command_start.sh ) fn_test_result_fail -echo "run order" -echo "=================" +echo -e "run order" +echo -e "=================" grep functionfile= "${TRAVIS_BUILD_DIR}/dev-debug.log" | sed 's/functionfile=//g' -echo "" -echo "3.3 - start - updateonstart" -echo "=================================" -echo "Description:" -echo "will update server on start." -echo "Command: ./${gameservername} start" +echo -e "" +echo -e "3.3 - start - updateonstart" +echo -e "=================================" +echo -e "Description:" +echo -e "will update server on start." +echo -e "Command: ./${gameservername} start" requiredstatus="OFFLINE" fn_setstatus ( @@ -676,16 +676,16 @@ fn_setstatus updateonstart="on";command_start.sh ) fn_test_result_pass -echo "run order" -echo "=================" +echo -e "run order" +echo -e "=================" grep functionfile= "${TRAVIS_BUILD_DIR}/dev-debug.log" | sed 's/functionfile=//g' -echo "" -echo "3.4 - stop" -echo "=================================" -echo "Description:" -echo "stop ${gamename} server." -echo "Command: ./${gameservername} stop" +echo -e "" +echo -e "3.4 - stop" +echo -e "=================================" +echo -e "Description:" +echo -e "stop ${gamename} server." +echo -e "Command: ./${gameservername} stop" requiredstatus="ONLINE" fn_setstatus ( @@ -695,16 +695,16 @@ fn_setstatus command_stop.sh ) fn_test_result_pass -echo "run order" -echo "=================" +echo -e "run order" +echo -e "=================" grep functionfile= "${TRAVIS_BUILD_DIR}/dev-debug.log" | sed 's/functionfile=//g' -echo "" -echo "3.5 - stop - offline" -echo "=================================" -echo "Description:" -echo "stop ${gamename} server while already stopped." -echo "Command: ./${gameservername} stop" +echo -e "" +echo -e "3.5 - stop - offline" +echo -e "=================================" +echo -e "Description:" +echo -e "stop ${gamename} server while already stopped." +echo -e "Command: ./${gameservername} stop" requiredstatus="OFFLINE" fn_setstatus ( @@ -714,16 +714,16 @@ fn_setstatus command_stop.sh ) fn_test_result_fail -echo "run order" -echo "=================" +echo -e "run order" +echo -e "=================" grep functionfile= "${TRAVIS_BUILD_DIR}/dev-debug.log" | sed 's/functionfile=//g' -echo "" -echo "3.6 - restart" -echo "=================================" -echo "Description:" -echo "restart ${gamename}." -echo "Command: ./${gameservername} restart" +echo -e "" +echo -e "3.6 - restart" +echo -e "=================================" +echo -e "Description:" +echo -e "restart ${gamename}." +echo -e "Command: ./${gameservername} restart" requiredstatus="ONLINE" fn_setstatus ( @@ -733,16 +733,16 @@ fn_setstatus command_restart.sh ) fn_test_result_pass -echo "run order" -echo "=================" +echo -e "run order" +echo -e "=================" grep functionfile= "${TRAVIS_BUILD_DIR}/dev-debug.log" | sed 's/functionfile=//g' -echo "" -echo "3.7 - restart - offline" -echo "=================================" -echo "Description:" -echo "restart ${gamename} while already stopped." -echo "Command: ./${gameservername} restart" +echo -e "" +echo -e "3.7 - restart - offline" +echo -e "=================================" +echo -e "Description:" +echo -e "restart ${gamename} while already stopped." +echo -e "Command: ./${gameservername} restart" requiredstatus="OFFLINE" fn_setstatus ( @@ -752,20 +752,20 @@ fn_setstatus command_restart.sh ) fn_test_result_pass -echo "run order" -echo "=================" +echo -e "run order" +echo -e "=================" grep functionfile= "${TRAVIS_BUILD_DIR}/dev-debug.log" | sed 's/functionfile=//g' -echo "" -echo "4.0 - Update Tests" -echo "==================================================================" +echo -e "" +echo -e "4.0 - Update Tests" +echo -e "==================================================================" -echo "" -echo "4.1 - update" -echo "=================================" -echo "Description:" -echo "check for updates." -echo "Command: ./${gameservername} update" +echo -e "" +echo -e "4.1 - update" +echo -e "=================================" +echo -e "Description:" +echo -e "check for updates." +echo -e "Command: ./${gameservername} update" requiredstatus="OFFLINE" fn_setstatus ( @@ -775,23 +775,23 @@ fn_setstatus command_update.sh ) fn_test_result_pass -echo "run order" -echo "=================" +echo -e "run order" +echo -e "=================" grep functionfile= "${TRAVIS_BUILD_DIR}/dev-debug.log" | sed 's/functionfile=//g' -echo "" -echo "5.0 - Monitor Tests" -echo "==================================================================" -echo "" -echo "Server IP - Port: ${ip}:${port}" -echo "Server IP - Query Port: ${ip}:${queryport}" - -echo "" -echo "5.1 - monitor - online" -echo "=================================" -echo "Description:" -echo "run monitor server while already running." -echo "Command: ./${gameservername} monitor" +echo -e "" +echo -e "5.0 - Monitor Tests" +echo -e "==================================================================" +echo -e "" +echo -e "Server IP - Port: ${ip}:${port}" +echo -e "Server IP - Query Port: ${ip}:${queryport}" + +echo -e "" +echo -e "5.1 - monitor - online" +echo -e "=================================" +echo -e "Description:" +echo -e "run monitor server while already running." +echo -e "Command: ./${gameservername} monitor" requiredstatus="ONLINE" fn_setstatus ( @@ -801,16 +801,16 @@ fn_setstatus command_monitor.sh ) fn_test_result_pass -echo "run order" -echo "=================" +echo -e "run order" +echo -e "=================" grep functionfile= "${TRAVIS_BUILD_DIR}/dev-debug.log" | sed 's/functionfile=//g' -echo "" -echo "5.2 - monitor - offline - with lockfile" -echo "=================================" -echo "Description:" -echo "run monitor while server is offline with lockfile." -echo "Command: ./${gameservername} monitor" +echo -e "" +echo -e "5.2 - monitor - offline - with lockfile" +echo -e "=================================" +echo -e "Description:" +echo -e "run monitor while server is offline with lockfile." +echo -e "Command: ./${gameservername} monitor" requiredstatus="OFFLINE" fn_setstatus fn_print_info_nl "creating lockfile." @@ -822,16 +822,16 @@ date '+%s' > "${rootdir}/${lockselfname}" command_monitor.sh ) fn_test_result_pass -echo "run order" -echo "=================" +echo -e "run order" +echo -e "=================" grep functionfile= "${TRAVIS_BUILD_DIR}/dev-debug.log" | sed 's/functionfile=//g' -echo "" -echo "5.3 - monitor - offline - no lockfile" -echo "=================================" -echo "Description:" -echo "run monitor while server is offline with no lockfile." -echo "Command: ./${gameservername} monitor" +echo -e "" +echo -e "5.3 - monitor - offline - no lockfile" +echo -e "=================================" +echo -e "Description:" +echo -e "run monitor while server is offline with no lockfile." +echo -e "Command: ./${gameservername} monitor" requiredstatus="OFFLINE" fn_setstatus ( @@ -841,16 +841,16 @@ fn_setstatus command_monitor.sh ) fn_test_result_fail -echo "run order" -echo "=================" +echo -e "run order" +echo -e "=================" grep functionfile= "${TRAVIS_BUILD_DIR}/dev-debug.log" | sed 's/functionfile=//g' -echo "" -echo "5.4 - test-alert" -echo "=================================" -echo "Description:" -echo "run monitor while server is offline with no lockfile." -echo "Command: ./${gameservername} test-alert" +echo -e "" +echo -e "5.4 - test-alert" +echo -e "=================================" +echo -e "Description:" +echo -e "run monitor while server is offline with no lockfile." +echo -e "Command: ./${gameservername} test-alert" requiredstatus="OFFLINE" fn_setstatus ( @@ -860,20 +860,20 @@ fn_setstatus command_test_alert.sh ) fn_test_result_fail -echo "run order" -echo "=================" +echo -e "run order" +echo -e "=================" grep functionfile= "${TRAVIS_BUILD_DIR}/dev-debug.log" | sed 's/functionfile=//g' -echo "" -echo "6.0 - Details Tests" -echo "==================================================================" +echo -e "" +echo -e "6.0 - Details Tests" +echo -e "==================================================================" -echo "" -echo "6.1 - details" -echo "=================================" -echo "Description:" -echo "display details." -echo "Command: ./${gameservername} details" +echo -e "" +echo -e "6.1 - details" +echo -e "=================================" +echo -e "Description:" +echo -e "display details." +echo -e "Command: ./${gameservername} details" requiredstatus="ONLINE" fn_setstatus ( @@ -883,16 +883,16 @@ fn_setstatus command_details.sh ) fn_test_result_pass -echo "run order" -echo "=================" +echo -e "run order" +echo -e "=================" grep functionfile= "${TRAVIS_BUILD_DIR}/dev-debug.log" | sed 's/functionfile=//g' -echo "" -echo "6.2 - postdetails" -echo "=================================" -echo "Description:" -echo "post details." -echo "Command: ./${gameservername} postdetails" +echo -e "" +echo -e "6.2 - postdetails" +echo -e "=================================" +echo -e "Description:" +echo -e "post details." +echo -e "Command: ./${gameservername} postdetails" requiredstatus="ONLINE" fn_setstatus ( @@ -902,39 +902,39 @@ fn_setstatus command_postdetails.sh ) fn_test_result_pass -echo "run order" -echo "=================" +echo -e "run order" +echo -e "=================" grep functionfile= "${TRAVIS_BUILD_DIR}/dev-debug.log" | sed 's/functionfile=//g' -echo "" -echo "7.0 - Backup Tests" -echo "==================================================================" +echo -e "" +echo -e "7.0 - Backup Tests" +echo -e "==================================================================" -echo "" -echo "7.1 - backup" -echo "=================================" -echo "Description:" -echo "run a backup." -echo "Command: ./${gameservername} backup" +echo -e "" +echo -e "7.1 - backup" +echo -e "=================================" +echo -e "Description:" +echo -e "run a backup." +echo -e "Command: ./${gameservername} backup" requiredstatus="ONLINE" fn_setstatus -echo "test de-activated until issue #1839 fixed" +echo -e "test de-activated until issue #1839 fixed" #(command_backup.sh) fn_test_result_pass -echo "run order" -echo "=================" +echo -e "run order" +echo -e "=================" grep functionfile= "${TRAVIS_BUILD_DIR}/dev-debug.log" | sed 's/functionfile=//g' -echo "" -echo "8.0 - Development Tools Tests" -echo "==================================================================" +echo -e "" +echo -e "8.0 - Development Tools Tests" +echo -e "==================================================================" -echo "" -echo "8.1 - dev - detect glibc" -echo "=================================" -echo "Description:" -echo "detect glibc." -echo "Command: ./${gameservername} detect-glibc" +echo -e "" +echo -e "8.1 - dev - detect glibc" +echo -e "=================================" +echo -e "Description:" +echo -e "detect glibc." +echo -e "Command: ./${gameservername} detect-glibc" requiredstatus="ONLINE" fn_setstatus ( @@ -944,16 +944,16 @@ fn_setstatus command_dev_detect_glibc.sh ) fn_test_result_pass -echo "run order" -echo "=================" +echo -e "run order" +echo -e "=================" grep functionfile= "${TRAVIS_BUILD_DIR}/dev-debug.log" | sed 's/functionfile=//g' -echo "" -echo "8.2 - dev - detect ldd" -echo "=================================" -echo "Description:" -echo "detect ldd." -echo "Command: ./${gameservername} detect-ldd" +echo -e "" +echo -e "8.2 - dev - detect ldd" +echo -e "=================================" +echo -e "Description:" +echo -e "detect ldd." +echo -e "Command: ./${gameservername} detect-ldd" requiredstatus="ONLINE" fn_setstatus ( @@ -963,16 +963,16 @@ fn_setstatus command_dev_detect_ldd.sh ) fn_test_result_pass -echo "run order" -echo "=================" +echo -e "run order" +echo -e "=================" grep functionfile= "${TRAVIS_BUILD_DIR}/dev-debug.log" | sed 's/functionfile=//g' -echo "" -echo "8.3 - dev - detect deps" -echo "=================================" -echo "Description:" -echo "detect dependencies." -echo "Command: ./${gameservername} detect-deps" +echo -e "" +echo -e "8.3 - dev - detect deps" +echo -e "=================================" +echo -e "Description:" +echo -e "detect dependencies." +echo -e "Command: ./${gameservername} detect-deps" requiredstatus="ONLINE" fn_setstatus ( @@ -982,16 +982,16 @@ fn_setstatus command_dev_detect_deps.sh ) fn_test_result_pass -echo "run order" -echo "=================" +echo -e "run order" +echo -e "=================" grep functionfile= "${TRAVIS_BUILD_DIR}/dev-debug.log" | sed 's/functionfile=//g' -echo "" -echo "8.4 - dev - query-raw" -echo "=================================" -echo "Description:" -echo "raw query output." -echo "Command: ./${gameservername} query-raw" +echo -e "" +echo -e "8.4 - dev - query-raw" +echo -e "=================================" +echo -e "Description:" +echo -e "raw query output." +echo -e "Command: ./${gameservername} query-raw" requiredstatus="ONLINE" fn_setstatus ( @@ -1001,15 +1001,15 @@ fn_setstatus command_dev_query_raw.sh ) fn_test_result_na -echo "run order" -echo "=================" +echo -e "run order" +echo -e "=================" grep functionfile= "${TRAVIS_BUILD_DIR}/dev-debug.log" | sed 's/functionfile=//g' -echo "" -echo "=================================" -echo "Server Tests - Complete!" -echo "Using: ${gamename}" -echo "=================================" +echo -e "" +echo -e "=================================" +echo -e "Server Tests - Complete!" +echo -e "Using: ${gamename}" +echo -e "=================================" requiredstatus="OFFLINE" fn_setstatus fn_print_info "Tidying up directories." From 6b251cc473c0e19730a30f35284aba16fd045c56 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Mon, 14 Oct 2019 23:30:15 +0100 Subject: [PATCH 182/534] fix(install): pstbs and wurm dependency fix --- lgsm/functions/check_deps.sh | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/lgsm/functions/check_deps.sh b/lgsm/functions/check_deps.sh index 8cf1a3de4..574f888e9 100644 --- a/lgsm/functions/check_deps.sh +++ b/lgsm/functions/check_deps.sh @@ -436,6 +436,8 @@ fn_deps_build_debian(){ # Wurm: Unlimited elif [ "${shortname}" == "wurm" ]; then array_deps_required+=( xvfb ) + elif [ "${shortname}" == "pstbs" ]; then + array_deps_required+=( libgconf-2-4 ) fi fn_deps_email fn_check_loop @@ -521,7 +523,7 @@ fn_deps_build_redhat(){ else array_deps_required+=( java-1.8.0-openjdk rng-tools ) fi - # Project Zomboid & Minecraft + # Minecraft elif [ "${shortname}" == "pz" ]; then javaversion=$(java -version 2>&1 | grep "version") if [ "${javaversion}" ]; then @@ -552,6 +554,10 @@ fn_deps_build_redhat(){ # Unturned elif [ "${shortname}" == "unt" ]; then array_deps_required+=( mono-complete ) + elif [ "${shortname}" == "wurm" ]; then + array_deps_required+=( xorg-x11-server-Xvfb ) + elif [ "${shortname}" == "pstbs" ]; then + array_deps_required+=( GConf2 ) fi fn_deps_email fn_check_loop From 3d9f365f7b7e9abd991a1484238a5a262165f337 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Mon, 14 Oct 2019 23:37:15 +0100 Subject: [PATCH 183/534] feat(install): add tar to dependency checking --- lgsm/functions/check_deps.sh | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/lgsm/functions/check_deps.sh b/lgsm/functions/check_deps.sh index 574f888e9..c70c86266 100644 --- a/lgsm/functions/check_deps.sh +++ b/lgsm/functions/check_deps.sh @@ -335,7 +335,7 @@ fn_deps_build_debian(){ array_deps_missing=() # LinuxGSM requirements. - array_deps_required=( curl wget ca-certificates file bsdmainutils util-linux python3 bzip2 gzip unzip binutils bc jq ) + array_deps_required=( curl wget ca-certificates file bsdmainutils util-linux python3 tar bzip2 gzip unzip binutils bc jq ) # All servers except ts3 require tmux. if [ "${shortname}" != "ts3" ]; then @@ -450,17 +450,17 @@ fn_deps_build_redhat(){ # LinuxGSM requirements. # CentOS if [ "${distroversion}" == "6" ]; then - array_deps_required=( epel-release curl wget util-linux-ng python file gzip bzip2 unzip binutils bc jq ) + array_deps_required=( epel-release curl wget util-linux-ng python file tar gzip bzip2 unzip binutils bc jq ) elif [ "${distroversion}" == "7" ]; then - array_deps_required=( epel-release curl wget util-linux python3 file gzip bzip2 unzip binutils bc jq ) + array_deps_required=( epel-release curl wget util-linux python3 file tar gzip bzip2 unzip binutils bc jq ) elif [ "${distroversion}" == "8" ]; then - array_deps_required=( epel-release curl wget util-linux python36 file gzip bzip2 unzip binutils bc jq ) + array_deps_required=( epel-release curl wget util-linux python36 file tar gzip bzip2 unzip binutils bc jq ) elif [ "${distroid}" == "fedora" ]; then - array_deps_required=( curl wget util-linux python3 file gzip bzip2 unzip binutils bc jq ) + array_deps_required=( curl wget util-linux python3 file tar gzip bzip2 unzip binutils bc jq ) elif [[ "${distroname}" == *"Amazon Linux AMI"* ]]; then - array_deps_required=( curl wget util-linux python3 file gzip bzip2 unzip binutils bc jq ) + array_deps_required=( curl wget util-linux python3 file tar gzip bzip2 unzip binutils bc jq ) else - array_deps_required=( curl wget util-linux python3 file gzip bzip2 unzip binutils bc jq ) + array_deps_required=( curl wget util-linux python3 file tar gzip bzip2 unzip binutils bc jq ) fi # All servers except ts3 require tmux. From f5063a2c930fe9c7f4a49e6f31a98d5c8f8f3b63 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Wed, 16 Oct 2019 10:41:00 +0100 Subject: [PATCH 184/534] Update README.md --- README.md | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/README.md b/README.md index 73d811da3..da73c85e6 100644 --- a/README.md +++ b/README.md @@ -5,11 +5,11 @@ [![LinuxGSM](https://img.shields.io/badge/-LinuxGSM-2b2b2b.svg?logo=data%3Aimage%2Fpng%3Bbase64%2CiVBORw0KGgoAAAANSUhEUgAAACsAAABACAYAAACDbo5ZAAAGD0lEQVR4AcWYa2wUVRvHz75c2vJ2disXoUBEVIioRAx%2BMIFA1IRwUS6KCCiIKBrvhEYiiGm5iBgk8QOGEgUUDYTttmVZWFr2UmwURS6iYAoCtmisElSsdHdbkT7%2BTzoNy%2BGc2dm54C%2F5Rdkz85x%2FZ86ZOXOYXYhIg3Phx%2FA4PAcv6f%2Btg5vhHJjP3EcZsgsshufJHH%2FAJbDztQ7aG35J1vgCXn%2BtgvrgEbLHYei9FmE3kDOUuh10OGwjZ7gEh7kZ9gNyllK3gnrg7%2BQs56DHjbCDyB0GuRF2ArnDeDfCziF3mO1G2FfJHRa4EXYpuUOxG2GXkzuUuBH2TXKH5W6ELSV3eM%2BNsOUk5yQcAY8p2uvgSPitor3MjbB1UOQXOFBvHwpbhPYWOExvL4SNUOQ7p4P2JTlzhOPmCu0vCu1PQpE2WOhk2MdJjk9y7HNwP1wEPUJbAcmZ6WTYrYolnifbxZBiibnFySHQCkUaLdY7C0V4%2FT5OhF1JcuIW6%2B0lOcvsBi2Ezao3j8Ov7Quwj52w60jNKIs1R5GatVaDDoEXSU4D7GSxbidYT3IuwjusFK0mNUVMwaZNNbl%2B%2F87hoVCom0HthaQmnG3QB0lNPcxlCvz%2B0GtlZTuorCxYYlA%2FDzbY%2FnrAgV3hCVLzCDMgEAi9wMMi9IIM%2FUwnNXWwi5mwRaSmmmXA798xq%2F3Khp420VeE1LyS6eQeBhttSXgzywCCToIUCOyYZvKLOWWwkdfd6ORVpGYJM0F5efDe9mEQHGty2BWTmhVGO4PNBmOoKzMBxmo%2FhD25dWvljSbD5hjMkb9gT9lJq63Mzi1bKkbjloc7xBWtwiRrDASCVRi%2FRxA8if%2BvrawMTzYI%2FACpeUv2KFFtDcUyTKilCHcis8G1Ga7wHpLzG8wVFs1K7jaeUKHZfIxmkj9%2FM4S9x9RGiMEudo0QbCVu9Xqn5PWEwLUk5%2FP0iaXac53I0kAH9Sau4m54lo%2FdTMfyekLYKQZ7ub34AbMMlmw5irC2VYTN0fuVMYMf8JHxJ7L7YYXAlSRnI2%2F8RtH4siTsDMz%2BZ5yS15OEXUxyDjGD1%2BvEq8MG16CDzY6JepKwT6geYbzxb0XjGMl7vwGSgzZIwo4nOa1M8Yr9Afb%2Fj8L21%2FsXaeaNZ2A6KTiEASph%2F0vF80cn4tokqu79fzfCUk2vfF4%2FFdFGEjGPHvg2yWrsDG%2F4%2BqpZB8jPOiXjWk0y5iXdM3XhKUvxBTA9UvHuvNPh%2Bzb%2BWj10z6nwuHWBbQFMvNCjKnn7qd1jS%2Fnx9VX3b6jC%2BbwOr5eMe3%2B83IcW4%2F3qgT%2BUTbA9srGaiHsn8AKiF6Ld%2FxF%2FOx6eeAJXabvK78MTTornNMd6XJTVR7%2Fj9bBjhFxV%2FMc1kJOAy2AeA%2FgrV4mFVDZFCqm8rEJ6qysCAWqK9iaztRJRbWXa4moFTELOav7jY%2FqAvoXp0Gc9NX7bIZl17%2FZl0rC1wRLeno0NvP%2B0CTcYNnS8wW6CtzNANaxzKqo9hRNOQ8rGo7tmSsMe2zWdt2frqVRcm5s2fofCgawDNHRNxnyfqgsYez4y4ADCjRM9H73hsNWafILTQdaFiSTj%2BQ%2FxA6yH7d%2BCmR8XbYr0a7VTF2N4siSsb5qdos3R6%2FjGxpULFfw7EfORnbrI9TAToX0sD40%2F2ylcGdh2Rdhg%2BSf2gka9jRTqK9%2BGwgHz7RTfVbHxirDhivdthYUvMRX8aYAD9lstvi%2B0aDL2DUZ0eCBUNNVG0IP65FLTWqPdiqdC0koHTVXe7iyNRG23QotBEy1RbTAzQyrmnYUT2rLsoA13JpcB4eVC2daBM1g2JGLekmwf5On7EJfngfZTNnVSce8bFjaTmQdvs%2FXmO%2FJVpoXdx3RSUe9O00Fj3nUdy0RLgRHiHXOPGW1h2uKZ07c9rG%2Bxyefp23pQeyBIEQoavYlakrG8fnrY5yHn2fbxXzAgw7m8bT5zkkSk4C7cpmOK21esB%2FXAQ5DzFfTo43%2BF%2FDzf0eZ4wZ3MDSjMcvD6nIeOahGgia%2FyU3HforTPkWkwnakdn0cI9jqfbPjD%2FuQLJr6644snlgX%2FApOMoyd1R5%2FxAAAAAElFTkSuQmCC)](https://linuxgsm.com) [![Build Status](https://travis-ci.com/GameServerManagers/LinuxGSM.svg?branch=master)](https://travis-ci.com/GameServerManagers/LinuxGSM) [![Codacy Badge](https://api.codacy.com/project/badge/Grade/3e98be27840043a090c3ab6e35db44b0)](https://app.codacy.com/app/GameServerManagers/LinuxGSM?utm_source=github.com&utm_medium=referral&utm_content=GameServerManagers/LinuxGSM&utm_campaign=Badge_Grade_Dashboard) [![Discord](https://discordapp.com/api/guilds/127498813903601664/widget.png?style=shield)](https://linuxgsm.com/discord) [![MIT Licence](https://badges.frapsoft.com/os/mit/mit.svg?v=103)](https://github.com/GameServerManagers/LinuxGSM/blob/master/LICENSE) [![made-with-bash](https://img.shields.io/badge/-Made%20with%20Bash-1f425f.svg?logo=image%2Fpng%3Bbase64%2CiVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyZpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw%2FeHBhY2tldCBiZWdpbj0i77u%2FIiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8%2BIDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNi1jMTExIDc5LjE1ODMyNSwgMjAxNS8wOS8xMC0wMToxMDoyMCAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENDIDIwMTUgKFdpbmRvd3MpIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOkE3MDg2QTAyQUZCMzExRTVBMkQxRDMzMkJDMUQ4RDk3IiB4bXBNTTpEb2N1bWVudElEPSJ4bXAuZGlkOkE3MDg2QTAzQUZCMzExRTVBMkQxRDMzMkJDMUQ4RDk3Ij4gPHhtcE1NOkRlcml2ZWRGcm9tIHN0UmVmOmluc3RhbmNlSUQ9InhtcC5paWQ6QTcwODZBMDBBRkIzMTFFNUEyRDFEMzMyQkMxRDhEOTciIHN0UmVmOmRvY3VtZW50SUQ9InhtcC5kaWQ6QTcwODZBMDFBRkIzMTFFNUEyRDFEMzMyQkMxRDhEOTciLz4gPC9yZGY6RGVzY3JpcHRpb24%2BIDwvcmRmOlJERj4gPC94OnhtcG1ldGE%2BIDw%2FeHBhY2tldCBlbmQ9InIiPz6lm45hAAADkklEQVR42qyVa0yTVxzGn7d9Wy03MS2ii8s%2BeokYNQSVhCzOjXZOFNF4jx%2BMRmPUMEUEqVG36jo2thizLSQSMd4N8ZoQ8RKjJtooaCpK6ZoCtRXKpRempbTv5ey83bhkAUphz8fznvP8znn%2B%2F3NeEEJgNBoRRSmz0ub%2FfuxEacBg%2FDmYtiCjgo5NG2mBXq%2BH5I1ogMRk9Zbd%2BQU2e1ML6VPLOyf5tvBQ8yT1lG10imxsABm7SLs898GTpyYynEzP60hO3trHDKvMigUwdeaceacqzp7nOI4n0SSIIjl36ao4Z356OV07fSQAk6xJ3XGg%2BLCr1d1OYlVHp4eUHPnerU79ZA%2F1kuv1JQMAg%2BE4O2P23EumF3VkvHprsZKMzKwbRUXFEyTvSIEmTVbrysp%2BWr8wfQHGK6WChVa3bKUmdWou%2BjpArdGkzZ41c1zG%2Fu5uGH4swzd561F%2BuhIT4%2BLnSuPsv9%2BJKIpjNr9dXYOyk7%2FBZrcjIT4eCnoKgedJP4BEqhG77E3NKP31FO7cfQA5K0dSYuLgz2TwCWJSOBzG6crzKK%2BohNfni%2Bx6OMUMMNe%2Fgf7ocbw0v0acKg6J8Ql0q%2BT%2FAXR5PNi5dz9c71upuQqCKFAD%2BYhrZLEAmpodaHO3Qy6TI3NhBpbrshGtOWKOSMYwYGQM8nJzoFJNxP2HjyIQho4PewK6hBktoDcUwtIln4PjOWzflQ%2Be5yl0yCCYgYikTclGlxadio%2BBQCSiW1UXoVGrKYwH4RgMrjU1HAB4vR6LzWYfFUCKxfS8Ftk5qxHoCUQAUkRJaSEokkV6Y%2F%2BJUOC4hn6A39NVXVBYeNP8piH6HeA4fPbpdBQV5KOx0QaL1YppX3Jgk0TwH2Vg6S3u%2BdB91%2B%2FpuNYPYFl5uP5V7ZqvsrX7jxqMXR6ff3gCQSTzFI0a1TX3wIs8ul%2Bq4HuWAAiM39vhOuR1O1fQ2gT%2F26Z8Z5vrl2OHi9OXZn995nLV9aFfS6UC9JeJPfuK0NBohWpCHMSAAsFe74WWP%2BvT25wtP9Bpob6uGqqyDnOtaeumjRu%2ByFu36VntK%2FPA5umTJeUtPWZSU9BCgud661odVp3DZtkc7AnYR33RRC708PrVi1larW7XwZIjLnd7R6SgSqWSNjU1B3F72pz5TZbXmX5vV81Yb7Lg7XT%2FUXriu8XLVqw6c6XqWnBKiiYU%2BMt3wWF7u7i91XlSEITwSAZ%2FCzAAHsJVbwXYFFEAAAAASUVORK5CYII%3D)](https://www.gnu.org/software/bash/) [![All Contributors](https://img.shields.io/badge/all_contributors-9-orange.svg?style=flat-square)](#contributors) -[LinuxGSM](https://linuxgsm.com) is the command line tool for quick, simple deployment and management of dedicated game servers. +[LinuxGSM](https://linuxgsm.com) command-line tool for quick, simple deployment and management of Linux dedicated game servers. ## Hassle-Free Dedicated Game Servers -Traditionally game servers 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 as simple as possible allowing admins to spend less time on management and more time gaming. +Traditionally game servers are not easy to manage yourself. Admins often have to spend hours messing around trying to get their server working. LinuxGSM is a command-line tool designed to be as simple as possible, allowing admins to spend less time on management and more time gaming. ## Main features @@ -25,16 +25,17 @@ Traditionally game servers are not easy to manage yourself. Admins often have to ## :penguin: Compatibility -Linux Game Server Managers are tested to work on the following Linux distros. +sdtdserver will run on popular distros as long as the minimum requirements are met. -* Debian based (Ubuntu, Mint etc.) -* Red Hat based (CentOS, Fedora etc.) +* Ubuntu +* Debian +* CentOS Other distros are likely to work but are not fully tested. ## :wrench: Requirements -Each game server has its own specific dependency requirements, but most require GLIBC and Tmux. Visit the specific game server installation page on the [LinuxGSM](https://linuxgsm.com) website to see dependencies. +Each game server has its own specific dependency requirements, with most requiring GLIBC and Tmux. Visit the specific game server installation page on the [LinuxGSM](https://linuxgsm.com) website to check dependency requirements. * [GLIBC](https://docs.linuxgsm.com/requirements/glibc) >= 2.15 recommended [[specific requirements]](https://docs.linuxgsm.com/requirements/glibc#server-requirements) * [Tmux](https://docs.linuxgsm.com/requirements/tmux) >= 1.6 recommended (Avoid Tmux 1.8) @@ -49,7 +50,7 @@ There are a various ways to get support, check out the [support](https://linuxgs ## :heart: Donate -If you would like to [donate](https://linuxgsm.com/donate) to the project there are several ways you can, via [PayPal](https://www.paypal.me/dgibbs64), [Patreon](https://www.patreon.com/dgibbs) and [Flattr](https://flattr.com/@dgibbs). I would like to thank everyone who has previously sent a donation. LinuxGSM has been going since 2012 and I have spent 1000s of hours developing and improving the project and continue to regularly add support for new servers. +If you would like to [donate](https://linuxgsm.com/donate) to the project there are several ways you can, via [Patreon](https://www.patreon.com/dgibbs), [Ko-Fi](https://ko-fi.com/dgibbs) and [PayPal](https://www.paypal.me/dgibbs64). I would like to thank everyone who has previously sent a donation. Since 2010 LinuxGSM has been steadily growing with new servers, features and improvements added regularly. ## Contributors From c90465e6874a3feb34bb2b5dc4a808df337f8b76 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Wed, 16 Oct 2019 10:41:30 +0100 Subject: [PATCH 185/534] Update README.md --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index da73c85e6..30c3f6723 100644 --- a/README.md +++ b/README.md @@ -13,7 +13,7 @@ Traditionally game servers are not easy to manage yourself. Admins often have to ## Main features -80+ game servers supported +100+ game servers supported * :truck: Installer * :mag: Monitor @@ -25,7 +25,7 @@ Traditionally game servers are not easy to manage yourself. Admins often have to ## :penguin: Compatibility -sdtdserver will run on popular distros as long as the minimum requirements are met. +LinuxGSM will run on popular distros as long as the minimum requirements are met. * Ubuntu * Debian From dd0af7be8d902c794c022e5e25b2100fd5f5827b Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Wed, 16 Oct 2019 10:42:09 +0100 Subject: [PATCH 186/534] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 30c3f6723..ccf4604b6 100644 --- a/README.md +++ b/README.md @@ -50,7 +50,7 @@ There are a various ways to get support, check out the [support](https://linuxgs ## :heart: Donate -If you would like to [donate](https://linuxgsm.com/donate) to the project there are several ways you can, via [Patreon](https://www.patreon.com/dgibbs), [Ko-Fi](https://ko-fi.com/dgibbs) and [PayPal](https://www.paypal.me/dgibbs64). I would like to thank everyone who has previously sent a donation. Since 2010 LinuxGSM has been steadily growing with new servers, features and improvements added regularly. +If you would like to [donate](https://linuxgsm.com/donate) to the project there are several ways you can, via [Patreon](https://www.patreon.com/dgibbs), [Ko-Fi](https://ko-fi.com/dgibbs) and [PayPal](https://www.paypal.me/dgibbs64). I would like to thank everyone who has previously sent a donation. Since 2012 LinuxGSM has been steadily growing with new servers, features and improvements added regularly. ## Contributors From ba078b1920c92f76192ef86a66101bd2493a332e Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Wed, 16 Oct 2019 10:44:16 +0100 Subject: [PATCH 187/534] Update README.md --- README.md | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/README.md b/README.md index ccf4604b6..1587128a6 100644 --- a/README.md +++ b/README.md @@ -35,10 +35,7 @@ Other distros are likely to work but are not fully tested. ## :wrench: Requirements -Each game server has its own specific dependency requirements, with most requiring GLIBC and Tmux. Visit the specific game server installation page on the [LinuxGSM](https://linuxgsm.com) website to check dependency requirements. - -* [GLIBC](https://docs.linuxgsm.com/requirements/glibc) >= 2.15 recommended [[specific requirements]](https://docs.linuxgsm.com/requirements/glibc#server-requirements) -* [Tmux](https://docs.linuxgsm.com/requirements/tmux) >= 1.6 recommended (Avoid Tmux 1.8) +Each game server has its own specific dependency requirements. Visit a specific game server installation page on the [LinuxGSM](https://linuxgsm.com) website to check dependency requirements for the game server you want to install. ## :blue_book: Documentation From 8268e6ca126f84126c441eccba8911834383f659 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Wed, 16 Oct 2019 11:17:21 +0100 Subject: [PATCH 188/534] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 1587128a6..534ce9d79 100644 --- a/README.md +++ b/README.md @@ -39,7 +39,7 @@ Each game server has its own specific dependency requirements. Visit a specific ## :blue_book: Documentation -Documentation is found at [linuxgsm.com](https://linuxgsm.com) and [docs.linuxgsm.com](https://docs.linuxgsm.com) +Documentation is found at [linuxgsm.com](https://linuxgsm.com) and [docs.linuxgsm.com](https://docs.linuxgsm.com). ## :question: Support From 1e59974158fa702213a4e35a219d04899cd1d2ad Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Wed, 16 Oct 2019 22:40:24 +0100 Subject: [PATCH 189/534] resolved release review comments --- lgsm/config-default/config-lgsm/ahl2server/_default.cfg | 8 ++++---- lgsm/config-default/config-lgsm/ahlserver/_default.cfg | 8 ++++---- lgsm/config-default/config-lgsm/arkserver/_default.cfg | 8 ++++---- lgsm/config-default/config-lgsm/arma3server/_default.cfg | 8 ++++---- lgsm/config-default/config-lgsm/bb2server/_default.cfg | 8 ++++---- lgsm/config-default/config-lgsm/bbserver/_default.cfg | 8 ++++---- lgsm/config-default/config-lgsm/bdserver/_default.cfg | 8 ++++---- lgsm/config-default/config-lgsm/bf1942server/_default.cfg | 8 ++++---- lgsm/config-default/config-lgsm/bmdmserver/_default.cfg | 8 ++++---- lgsm/config-default/config-lgsm/boserver/_default.cfg | 8 ++++---- lgsm/config-default/config-lgsm/bsserver/_default.cfg | 8 ++++---- lgsm/config-default/config-lgsm/bt1944server/_default.cfg | 8 ++++---- lgsm/config-default/config-lgsm/btserver/_default.cfg | 8 ++++---- lgsm/config-default/config-lgsm/ccserver/_default.cfg | 8 ++++---- lgsm/config-default/config-lgsm/cod2server/_default.cfg | 8 ++++---- lgsm/config-default/config-lgsm/cod4server/_default.cfg | 8 ++++---- lgsm/config-default/config-lgsm/codserver/_default.cfg | 8 ++++---- lgsm/config-default/config-lgsm/coduoserver/_default.cfg | 8 ++++---- lgsm/config-default/config-lgsm/codwawserver/_default.cfg | 8 ++++---- lgsm/config-default/config-lgsm/csczserver/_default.cfg | 8 ++++---- lgsm/config-default/config-lgsm/csgoserver/_default.cfg | 8 ++++---- lgsm/config-default/config-lgsm/csserver/_default.cfg | 8 ++++---- lgsm/config-default/config-lgsm/cssserver/_default.cfg | 8 ++++---- lgsm/config-default/config-lgsm/dabserver/_default.cfg | 8 ++++---- lgsm/config-default/config-lgsm/dmcserver/_default.cfg | 8 ++++---- lgsm/config-default/config-lgsm/dodserver/_default.cfg | 8 ++++---- lgsm/config-default/config-lgsm/dodsserver/_default.cfg | 8 ++++---- lgsm/config-default/config-lgsm/doiserver/_default.cfg | 8 ++++---- lgsm/config-default/config-lgsm/dstserver/_default.cfg | 8 ++++---- lgsm/config-default/config-lgsm/dysserver/_default.cfg | 8 ++++---- lgsm/config-default/config-lgsm/ecoserver/_default.cfg | 8 ++++---- lgsm/config-default/config-lgsm/emserver/_default.cfg | 8 ++++---- lgsm/config-default/config-lgsm/etlserver/_default.cfg | 8 ++++---- lgsm/config-default/config-lgsm/fctrserver/_default.cfg | 8 ++++---- lgsm/config-default/config-lgsm/fofserver/_default.cfg | 8 ++++---- lgsm/config-default/config-lgsm/gesserver/_default.cfg | 8 ++++---- lgsm/config-default/config-lgsm/gmodserver/_default.cfg | 8 ++++---- lgsm/config-default/config-lgsm/hl2dmserver/_default.cfg | 8 ++++---- lgsm/config-default/config-lgsm/hldmserver/_default.cfg | 8 ++++---- lgsm/config-default/config-lgsm/hldmsserver/_default.cfg | 8 ++++---- lgsm/config-default/config-lgsm/hwserver/_default.cfg | 8 ++++---- lgsm/config-default/config-lgsm/insserver/_default.cfg | 8 ++++---- lgsm/config-default/config-lgsm/inssserver/_default.cfg | 8 ++++---- lgsm/config-default/config-lgsm/iosserver/_default.cfg | 8 ++++---- lgsm/config-default/config-lgsm/jc2server/_default.cfg | 8 ++++---- lgsm/config-default/config-lgsm/jc3server/_default.cfg | 8 ++++---- lgsm/config-default/config-lgsm/kf2server/_default.cfg | 8 ++++---- lgsm/config-default/config-lgsm/kfserver/_default.cfg | 8 ++++---- lgsm/config-default/config-lgsm/l4d2server/_default.cfg | 8 ++++---- lgsm/config-default/config-lgsm/l4dserver/_default.cfg | 8 ++++---- lgsm/config-default/config-lgsm/mcserver/_default.cfg | 8 ++++---- lgsm/config-default/config-lgsm/mohaaserver/_default.cfg | 8 ++++---- lgsm/config-default/config-lgsm/mtaserver/_default.cfg | 8 ++++---- lgsm/config-default/config-lgsm/mumbleserver/_default.cfg | 8 ++++---- lgsm/config-default/config-lgsm/ndserver/_default.cfg | 8 ++++---- lgsm/config-default/config-lgsm/nmrihserver/_default.cfg | 8 ++++---- lgsm/config-default/config-lgsm/ns2cserver/_default.cfg | 8 ++++---- lgsm/config-default/config-lgsm/ns2server/_default.cfg | 8 ++++---- lgsm/config-default/config-lgsm/nsserver/_default.cfg | 8 ++++---- lgsm/config-default/config-lgsm/opforserver/_default.cfg | 8 ++++---- lgsm/config-default/config-lgsm/pcserver/_default.cfg | 8 ++++---- lgsm/config-default/config-lgsm/pstbsserver/_default.cfg | 8 ++++---- lgsm/config-default/config-lgsm/pvkiiserver/_default.cfg | 8 ++++---- lgsm/config-default/config-lgsm/pzserver/_default.cfg | 8 ++++---- lgsm/config-default/config-lgsm/q2server/_default.cfg | 8 ++++---- lgsm/config-default/config-lgsm/q3server/_default.cfg | 8 ++++---- lgsm/config-default/config-lgsm/qlserver/_default.cfg | 8 ++++---- lgsm/config-default/config-lgsm/qwserver/_default.cfg | 8 ++++---- .../config-lgsm/ricochetserver/_default.cfg | 8 ++++---- lgsm/config-default/config-lgsm/roserver/_default.cfg | 8 ++++---- lgsm/config-default/config-lgsm/rtcwserver/_default.cfg | 8 ++++---- lgsm/config-default/config-lgsm/rustserver/_default.cfg | 8 ++++---- lgsm/config-default/config-lgsm/rwserver/_default.cfg | 8 ++++---- lgsm/config-default/config-lgsm/sampserver/_default.cfg | 8 ++++---- lgsm/config-default/config-lgsm/sbotsserver/_default.cfg | 8 ++++---- lgsm/config-default/config-lgsm/sbserver/_default.cfg | 8 ++++---- lgsm/config-default/config-lgsm/sdtdserver/_default.cfg | 8 ++++---- lgsm/config-default/config-lgsm/sfcserver/_default.cfg | 8 ++++---- lgsm/config-default/config-lgsm/sof2server/_default.cfg | 8 ++++---- lgsm/config-default/config-lgsm/solserver/_default.cfg | 8 ++++---- lgsm/config-default/config-lgsm/squadserver/_default.cfg | 8 ++++---- lgsm/config-default/config-lgsm/ss3server/_default.cfg | 8 ++++---- lgsm/config-default/config-lgsm/stserver/_default.cfg | 8 ++++---- lgsm/config-default/config-lgsm/svenserver/_default.cfg | 8 ++++---- .../config-lgsm/terrariaserver/_default.cfg | 8 ++++---- lgsm/config-default/config-lgsm/tf2server/_default.cfg | 8 ++++---- lgsm/config-default/config-lgsm/tfcserver/_default.cfg | 8 ++++---- lgsm/config-default/config-lgsm/ts3server/_default.cfg | 8 ++++---- lgsm/config-default/config-lgsm/tsserver/_default.cfg | 8 ++++---- lgsm/config-default/config-lgsm/tuserver/_default.cfg | 8 ++++---- lgsm/config-default/config-lgsm/twserver/_default.cfg | 8 ++++---- lgsm/config-default/config-lgsm/ut2k4server/_default.cfg | 8 ++++---- lgsm/config-default/config-lgsm/ut3server/_default.cfg | 8 ++++---- lgsm/config-default/config-lgsm/ut99server/_default.cfg | 8 ++++---- lgsm/config-default/config-lgsm/utserver/_default.cfg | 8 ++++---- lgsm/config-default/config-lgsm/vsserver/_default.cfg | 8 ++++---- lgsm/config-default/config-lgsm/wetserver/_default.cfg | 8 ++++---- lgsm/config-default/config-lgsm/wfserver/_default.cfg | 8 ++++---- lgsm/config-default/config-lgsm/wurmserver/_default.cfg | 8 ++++---- lgsm/config-default/config-lgsm/zmrserver/_default.cfg | 8 ++++---- lgsm/config-default/config-lgsm/zpsserver/_default.cfg | 8 ++++---- lgsm/functions/check_deps.sh | 4 ++-- lgsm/functions/info_config.sh | 2 +- 103 files changed, 407 insertions(+), 407 deletions(-) diff --git a/lgsm/config-default/config-lgsm/ahl2server/_default.cfg b/lgsm/config-default/config-lgsm/ahl2server/_default.cfg index f819cf468..03befbd00 100644 --- a/lgsm/config-default/config-lgsm/ahl2server/_default.cfg +++ b/lgsm/config-default/config-lgsm/ahl2server/_default.cfg @@ -42,10 +42,6 @@ posttarget="https://hastebin.com" discordalert="off" discordwebhook="webhook" -# Slack Alerts | https://docs.linuxgsm.com/alerts/slack -slackalert="off" -slackwebhook="webhook" - # Email Alerts | https://docs.linuxgsm.com/alerts/email emailalert="off" email="email@example.com" @@ -72,6 +68,10 @@ channeltag="" pushoveralert="off" pushovertoken="accesstoken" +# Slack Alerts | https://docs.linuxgsm.com/alerts/slack +slackalert="off" +slackwebhook="webhook" + # Telegram Alerts | https://docs.linuxgsm.com/alerts/telegram # You can add a custom cURL string eg proxy (useful in Russia) or else in "curlcustomstring". # like a "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help", if you not need diff --git a/lgsm/config-default/config-lgsm/ahlserver/_default.cfg b/lgsm/config-default/config-lgsm/ahlserver/_default.cfg index 513db4374..65cfd5fab 100644 --- a/lgsm/config-default/config-lgsm/ahlserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/ahlserver/_default.cfg @@ -37,10 +37,6 @@ posttarget="https://hastebin.com" discordalert="off" discordwebhook="webhook" -# Slack Alerts | https://docs.linuxgsm.com/alerts/slack -slackalert="off" -slackwebhook="webhook" - # Email Alerts | https://docs.linuxgsm.com/alerts/email emailalert="off" email="email@example.com" @@ -67,6 +63,10 @@ channeltag="" pushoveralert="off" pushovertoken="accesstoken" +# Slack Alerts | https://docs.linuxgsm.com/alerts/slack +slackalert="off" +slackwebhook="webhook" + # Telegram Alerts | https://docs.linuxgsm.com/alerts/telegram # You can add a custom cURL string eg proxy (useful in Russia) or else in "curlcustomstring". # like a "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help", if you not need diff --git a/lgsm/config-default/config-lgsm/arkserver/_default.cfg b/lgsm/config-default/config-lgsm/arkserver/_default.cfg index 94bdaebc1..f69643c12 100644 --- a/lgsm/config-default/config-lgsm/arkserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/arkserver/_default.cfg @@ -39,10 +39,6 @@ posttarget="https://hastebin.com" discordalert="off" discordwebhook="webhook" -# Slack Alerts | https://docs.linuxgsm.com/alerts/slack -slackalert="off" -slackwebhook="webhook" - # Email Alerts | https://docs.linuxgsm.com/alerts/email emailalert="off" email="email@example.com" @@ -69,6 +65,10 @@ channeltag="" pushoveralert="off" pushovertoken="accesstoken" +# Slack Alerts | https://docs.linuxgsm.com/alerts/slack +slackalert="off" +slackwebhook="webhook" + # Telegram Alerts | https://docs.linuxgsm.com/alerts/telegram # You can add a custom cURL string eg proxy (useful in Russia) or else in "curlcustomstring". # like a "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help", if you not need diff --git a/lgsm/config-default/config-lgsm/arma3server/_default.cfg b/lgsm/config-default/config-lgsm/arma3server/_default.cfg index c01336adf..d58cb76e5 100644 --- a/lgsm/config-default/config-lgsm/arma3server/_default.cfg +++ b/lgsm/config-default/config-lgsm/arma3server/_default.cfg @@ -53,10 +53,6 @@ posttarget="https://hastebin.com" discordalert="off" discordwebhook="webhook" -# Slack Alerts | https://docs.linuxgsm.com/alerts/slack -slackalert="off" -slackwebhook="webhook" - # Email Alerts | https://docs.linuxgsm.com/alerts/email emailalert="off" email="email@example.com" @@ -83,6 +79,10 @@ channeltag="" pushoveralert="off" pushovertoken="accesstoken" +# Slack Alerts | https://docs.linuxgsm.com/alerts/slack +slackalert="off" +slackwebhook="webhook" + # Telegram Alerts | https://docs.linuxgsm.com/alerts/telegram # You can add a custom cURL string eg proxy (useful in Russia) or else in "curlcustomstring". # like a "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help", if you not need diff --git a/lgsm/config-default/config-lgsm/bb2server/_default.cfg b/lgsm/config-default/config-lgsm/bb2server/_default.cfg index f2a4f4f4e..aa5ffca37 100644 --- a/lgsm/config-default/config-lgsm/bb2server/_default.cfg +++ b/lgsm/config-default/config-lgsm/bb2server/_default.cfg @@ -43,10 +43,6 @@ posttarget="https://hastebin.com" discordalert="off" discordwebhook="webhook" -# Slack Alerts | https://docs.linuxgsm.com/alerts/slack -slackalert="off" -slackwebhook="webhook" - # Email Alerts | https://docs.linuxgsm.com/alerts/email emailalert="off" email="email@example.com" @@ -73,6 +69,10 @@ channeltag="" pushoveralert="off" pushovertoken="accesstoken" +# Slack Alerts | https://docs.linuxgsm.com/alerts/slack +slackalert="off" +slackwebhook="webhook" + # Telegram Alerts | https://docs.linuxgsm.com/alerts/telegram # You can add a custom cURL string eg proxy (useful in Russia) or else in "curlcustomstring". # like a "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help", if you not need diff --git a/lgsm/config-default/config-lgsm/bbserver/_default.cfg b/lgsm/config-default/config-lgsm/bbserver/_default.cfg index 6a91321e4..11e7b23a0 100644 --- a/lgsm/config-default/config-lgsm/bbserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/bbserver/_default.cfg @@ -37,10 +37,6 @@ posttarget="https://hastebin.com" discordalert="off" discordwebhook="webhook" -# Slack Alerts | https://docs.linuxgsm.com/alerts/slack -slackalert="off" -slackwebhook="webhook" - # Email Alerts | https://docs.linuxgsm.com/alerts/email emailalert="off" email="email@example.com" @@ -67,6 +63,10 @@ channeltag="" pushoveralert="off" pushovertoken="accesstoken" +# Slack Alerts | https://docs.linuxgsm.com/alerts/slack +slackalert="off" +slackwebhook="webhook" + # Telegram Alerts | https://docs.linuxgsm.com/alerts/telegram # You can add a custom cURL string eg proxy (useful in Russia) or else in "curlcustomstring". # like a "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help", if you not need diff --git a/lgsm/config-default/config-lgsm/bdserver/_default.cfg b/lgsm/config-default/config-lgsm/bdserver/_default.cfg index abc3c9286..c2c148113 100644 --- a/lgsm/config-default/config-lgsm/bdserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/bdserver/_default.cfg @@ -37,10 +37,6 @@ posttarget="https://hastebin.com" discordalert="off" discordwebhook="webhook" -# Slack Alerts | https://docs.linuxgsm.com/alerts/slack -slackalert="off" -slackwebhook="webhook" - # Email Alerts | https://docs.linuxgsm.com/alerts/email emailalert="off" email="email@example.com" @@ -67,6 +63,10 @@ channeltag="" pushoveralert="off" pushovertoken="accesstoken" +# Slack Alerts | https://docs.linuxgsm.com/alerts/slack +slackalert="off" +slackwebhook="webhook" + # Telegram Alerts | https://docs.linuxgsm.com/alerts/telegram # You can add a custom cURL string eg proxy (useful in Russia) or else in "curlcustomstring". # like a "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help", if you not need diff --git a/lgsm/config-default/config-lgsm/bf1942server/_default.cfg b/lgsm/config-default/config-lgsm/bf1942server/_default.cfg index ca193f795..19e919726 100644 --- a/lgsm/config-default/config-lgsm/bf1942server/_default.cfg +++ b/lgsm/config-default/config-lgsm/bf1942server/_default.cfg @@ -30,10 +30,6 @@ posttarget="https://hastebin.com" discordalert="off" discordwebhook="webhook" -# Slack Alerts | https://docs.linuxgsm.com/alerts/slack -slackalert="off" -slackwebhook="webhook" - # Email Alerts | https://docs.linuxgsm.com/alerts/email emailalert="off" email="email@example.com" @@ -60,6 +56,10 @@ channeltag="" pushoveralert="off" pushovertoken="accesstoken" +# Slack Alerts | https://docs.linuxgsm.com/alerts/slack +slackalert="off" +slackwebhook="webhook" + # Telegram Alerts | https://docs.linuxgsm.com/alerts/telegram # You can add a custom cURL string eg proxy (useful in Russia) or else in "curlcustomstring". # like a "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help", if you not need diff --git a/lgsm/config-default/config-lgsm/bmdmserver/_default.cfg b/lgsm/config-default/config-lgsm/bmdmserver/_default.cfg index 42b918a55..4a42b24aa 100644 --- a/lgsm/config-default/config-lgsm/bmdmserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/bmdmserver/_default.cfg @@ -43,10 +43,6 @@ posttarget="https://hastebin.com" discordalert="off" discordwebhook="webhook" -# Slack Alerts | https://docs.linuxgsm.com/alerts/slack -slackalert="off" -slackwebhook="webhook" - # Email Alerts | https://docs.linuxgsm.com/alerts/email emailalert="off" email="email@example.com" @@ -73,6 +69,10 @@ channeltag="" pushoveralert="off" pushovertoken="accesstoken" +# Slack Alerts | https://docs.linuxgsm.com/alerts/slack +slackalert="off" +slackwebhook="webhook" + # Telegram Alerts | https://docs.linuxgsm.com/alerts/telegram # You can add a custom cURL string eg proxy (useful in Russia) or else in "curlcustomstring". # like a "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help", if you not need diff --git a/lgsm/config-default/config-lgsm/boserver/_default.cfg b/lgsm/config-default/config-lgsm/boserver/_default.cfg index 0395820bd..6f66c1680 100644 --- a/lgsm/config-default/config-lgsm/boserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/boserver/_default.cfg @@ -36,10 +36,6 @@ posttarget="https://hastebin.com" discordalert="off" discordwebhook="webhook" -# Slack Alerts | https://docs.linuxgsm.com/alerts/slack -slackalert="off" -slackwebhook="webhook" - # Email Alerts | https://docs.linuxgsm.com/alerts/email emailalert="off" email="email@example.com" @@ -66,6 +62,10 @@ channeltag="" pushoveralert="off" pushovertoken="accesstoken" +# Slack Alerts | https://docs.linuxgsm.com/alerts/slack +slackalert="off" +slackwebhook="webhook" + # Telegram Alerts | https://docs.linuxgsm.com/alerts/telegram # You can add a custom cURL string eg proxy (useful in Russia) or else in "curlcustomstring". # like a "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help", if you not need diff --git a/lgsm/config-default/config-lgsm/bsserver/_default.cfg b/lgsm/config-default/config-lgsm/bsserver/_default.cfg index 21dc7a0af..29f8d9814 100644 --- a/lgsm/config-default/config-lgsm/bsserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/bsserver/_default.cfg @@ -47,10 +47,6 @@ posttarget="https://hastebin.com" discordalert="off" discordwebhook="webhook" -# Slack Alerts | https://docs.linuxgsm.com/alerts/slack -slackalert="off" -slackwebhook="webhook" - # Email Alerts | https://docs.linuxgsm.com/alerts/email emailalert="off" email="email@example.com" @@ -77,6 +73,10 @@ channeltag="" pushoveralert="off" pushovertoken="accesstoken" +# Slack Alerts | https://docs.linuxgsm.com/alerts/slack +slackalert="off" +slackwebhook="webhook" + # Telegram Alerts | https://docs.linuxgsm.com/alerts/telegram # You can add a custom cURL string eg proxy (useful in Russia) or else in "curlcustomstring". # like a "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help", if you not need diff --git a/lgsm/config-default/config-lgsm/bt1944server/_default.cfg b/lgsm/config-default/config-lgsm/bt1944server/_default.cfg index 6116933ee..5ea155b17 100644 --- a/lgsm/config-default/config-lgsm/bt1944server/_default.cfg +++ b/lgsm/config-default/config-lgsm/bt1944server/_default.cfg @@ -35,10 +35,6 @@ posttarget="https://hastebin.com" discordalert="off" discordwebhook="webhook" -# Slack Alerts | https://docs.linuxgsm.com/alerts/slack -slackalert="off" -slackwebhook="webhook" - # Email Alerts | https://docs.linuxgsm.com/alerts/email emailalert="off" email="email@example.com" @@ -65,6 +61,10 @@ channeltag="" pushoveralert="off" pushovertoken="accesstoken" +# Slack Alerts | https://docs.linuxgsm.com/alerts/slack +slackalert="off" +slackwebhook="webhook" + # Telegram Alerts | https://docs.linuxgsm.com/alerts/telegram # You can add a custom cURL string eg proxy (useful in Russia) or else in "curlcustomstring". # like a "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help", if you not need diff --git a/lgsm/config-default/config-lgsm/btserver/_default.cfg b/lgsm/config-default/config-lgsm/btserver/_default.cfg index d70f24eab..600e016c7 100644 --- a/lgsm/config-default/config-lgsm/btserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/btserver/_default.cfg @@ -30,10 +30,6 @@ posttarget="https://hastebin.com" discordalert="off" discordwebhook="webhook" -# Slack Alerts | https://docs.linuxgsm.com/alerts/slack -slackalert="off" -slackwebhook="webhook" - # Email Alerts | https://docs.linuxgsm.com/alerts/email emailalert="off" email="email@example.com" @@ -60,6 +56,10 @@ channeltag="" pushoveralert="off" pushovertoken="accesstoken" +# Slack Alerts | https://docs.linuxgsm.com/alerts/slack +slackalert="off" +slackwebhook="webhook" + # Telegram Alerts | https://docs.linuxgsm.com/alerts/telegram # You can add a custom cURL string eg proxy (useful in Russia) or else in "curlcustomstring". # like a "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help", if you not need diff --git a/lgsm/config-default/config-lgsm/ccserver/_default.cfg b/lgsm/config-default/config-lgsm/ccserver/_default.cfg index 4a58debe3..fb6f47507 100644 --- a/lgsm/config-default/config-lgsm/ccserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/ccserver/_default.cfg @@ -38,10 +38,6 @@ posttarget="https://hastebin.com" discordalert="off" discordwebhook="webhook" -# Slack Alerts | https://docs.linuxgsm.com/alerts/slack -slackalert="off" -slackwebhook="webhook" - # Email Alerts | https://docs.linuxgsm.com/alerts/email emailalert="off" email="email@example.com" @@ -68,6 +64,10 @@ channeltag="" pushoveralert="off" pushovertoken="accesstoken" +# Slack Alerts | https://docs.linuxgsm.com/alerts/slack +slackalert="off" +slackwebhook="webhook" + # Telegram Alerts | https://docs.linuxgsm.com/alerts/telegram # You can add a custom cURL string eg proxy (useful in Russia) or else in "curlcustomstring". # like a "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help", if you not need diff --git a/lgsm/config-default/config-lgsm/cod2server/_default.cfg b/lgsm/config-default/config-lgsm/cod2server/_default.cfg index c13d4773e..523b61755 100644 --- a/lgsm/config-default/config-lgsm/cod2server/_default.cfg +++ b/lgsm/config-default/config-lgsm/cod2server/_default.cfg @@ -36,10 +36,6 @@ posttarget="https://hastebin.com" discordalert="off" discordwebhook="webhook" -# Slack Alerts | https://docs.linuxgsm.com/alerts/slack -slackalert="off" -slackwebhook="webhook" - # Email Alerts | https://docs.linuxgsm.com/alerts/email emailalert="off" email="email@example.com" @@ -66,6 +62,10 @@ channeltag="" pushoveralert="off" pushovertoken="accesstoken" +# Slack Alerts | https://docs.linuxgsm.com/alerts/slack +slackalert="off" +slackwebhook="webhook" + # Telegram Alerts | https://docs.linuxgsm.com/alerts/telegram # You can add a custom cURL string eg proxy (useful in Russia) or else in "curlcustomstring". # like a "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help", if you not need diff --git a/lgsm/config-default/config-lgsm/cod4server/_default.cfg b/lgsm/config-default/config-lgsm/cod4server/_default.cfg index 4fbb9abfc..546ad2b44 100644 --- a/lgsm/config-default/config-lgsm/cod4server/_default.cfg +++ b/lgsm/config-default/config-lgsm/cod4server/_default.cfg @@ -36,10 +36,6 @@ posttarget="https://hastebin.com" discordalert="off" discordwebhook="webhook" -# Slack Alerts | https://docs.linuxgsm.com/alerts/slack -slackalert="off" -slackwebhook="webhook" - # Email Alerts | https://docs.linuxgsm.com/alerts/email emailalert="off" email="email@example.com" @@ -66,6 +62,10 @@ channeltag="" pushoveralert="off" pushovertoken="accesstoken" +# Slack Alerts | https://docs.linuxgsm.com/alerts/slack +slackalert="off" +slackwebhook="webhook" + # Telegram Alerts | https://docs.linuxgsm.com/alerts/telegram # You can add a custom cURL string eg proxy (useful in Russia) or else in "curlcustomstring". # like a "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help", if you not need diff --git a/lgsm/config-default/config-lgsm/codserver/_default.cfg b/lgsm/config-default/config-lgsm/codserver/_default.cfg index 3c858e74c..f527bc194 100644 --- a/lgsm/config-default/config-lgsm/codserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/codserver/_default.cfg @@ -36,10 +36,6 @@ posttarget="https://hastebin.com" discordalert="off" discordwebhook="webhook" -# Slack Alerts | https://docs.linuxgsm.com/alerts/slack -slackalert="off" -slackwebhook="webhook" - # Email Alerts | https://docs.linuxgsm.com/alerts/email emailalert="off" email="email@example.com" @@ -66,6 +62,10 @@ channeltag="" pushoveralert="off" pushovertoken="accesstoken" +# Slack Alerts | https://docs.linuxgsm.com/alerts/slack +slackalert="off" +slackwebhook="webhook" + # Telegram Alerts | https://docs.linuxgsm.com/alerts/telegram # You can add a custom cURL string eg proxy (useful in Russia) or else in "curlcustomstring". # like a "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help", if you not need diff --git a/lgsm/config-default/config-lgsm/coduoserver/_default.cfg b/lgsm/config-default/config-lgsm/coduoserver/_default.cfg index 64c3635f6..cc4109847 100644 --- a/lgsm/config-default/config-lgsm/coduoserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/coduoserver/_default.cfg @@ -36,10 +36,6 @@ posttarget="https://hastebin.com" discordalert="off" discordwebhook="webhook" -# Slack Alerts | https://docs.linuxgsm.com/alerts/slack -slackalert="off" -slackwebhook="webhook" - # Email Alerts | https://docs.linuxgsm.com/alerts/email emailalert="off" email="email@example.com" @@ -66,6 +62,10 @@ channeltag="" pushoveralert="off" pushovertoken="accesstoken" +# Slack Alerts | https://docs.linuxgsm.com/alerts/slack +slackalert="off" +slackwebhook="webhook" + # Telegram Alerts | https://docs.linuxgsm.com/alerts/telegram # You can add a custom cURL string eg proxy (useful in Russia) or else in "curlcustomstring". # like a "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help", if you not need diff --git a/lgsm/config-default/config-lgsm/codwawserver/_default.cfg b/lgsm/config-default/config-lgsm/codwawserver/_default.cfg index 2d0381c00..484d64194 100644 --- a/lgsm/config-default/config-lgsm/codwawserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/codwawserver/_default.cfg @@ -36,10 +36,6 @@ posttarget="https://hastebin.com" discordalert="off" discordwebhook="webhook" -# Slack Alerts | https://docs.linuxgsm.com/alerts/slack -slackalert="off" -slackwebhook="webhook" - # Email Alerts | https://docs.linuxgsm.com/alerts/email emailalert="off" email="email@example.com" @@ -66,6 +62,10 @@ channeltag="" pushoveralert="off" pushovertoken="accesstoken" +# Slack Alerts | https://docs.linuxgsm.com/alerts/slack +slackalert="off" +slackwebhook="webhook" + # Telegram Alerts | https://docs.linuxgsm.com/alerts/telegram # You can add a custom cURL string eg proxy (useful in Russia) or else in "curlcustomstring". # like a "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help", if you not need diff --git a/lgsm/config-default/config-lgsm/csczserver/_default.cfg b/lgsm/config-default/config-lgsm/csczserver/_default.cfg index a74e7d1cb..15909d0f9 100644 --- a/lgsm/config-default/config-lgsm/csczserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/csczserver/_default.cfg @@ -37,10 +37,6 @@ posttarget="https://hastebin.com" discordalert="off" discordwebhook="webhook" -# Slack Alerts | https://docs.linuxgsm.com/alerts/slack -slackalert="off" -slackwebhook="webhook" - # Email Alerts | https://docs.linuxgsm.com/alerts/email emailalert="off" email="email@example.com" @@ -67,6 +63,10 @@ channeltag="" pushoveralert="off" pushovertoken="accesstoken" +# Slack Alerts | https://docs.linuxgsm.com/alerts/slack +slackalert="off" +slackwebhook="webhook" + # Telegram Alerts | https://docs.linuxgsm.com/alerts/telegram # You can add a custom cURL string eg proxy (useful in Russia) or else in "curlcustomstring". # like a "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help", if you not need diff --git a/lgsm/config-default/config-lgsm/csgoserver/_default.cfg b/lgsm/config-default/config-lgsm/csgoserver/_default.cfg index b480dc7d7..1358a186c 100644 --- a/lgsm/config-default/config-lgsm/csgoserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/csgoserver/_default.cfg @@ -63,10 +63,6 @@ posttarget="https://hastebin.com" discordalert="off" discordwebhook="webhook" -# Slack Alerts | https://docs.linuxgsm.com/alerts/slack -slackalert="off" -slackwebhook="webhook" - # Email Alerts | https://docs.linuxgsm.com/alerts/email emailalert="off" email="email@example.com" @@ -93,6 +89,10 @@ channeltag="" pushoveralert="off" pushovertoken="accesstoken" +# Slack Alerts | https://docs.linuxgsm.com/alerts/slack +slackalert="off" +slackwebhook="webhook" + # Telegram Alerts | https://docs.linuxgsm.com/alerts/telegram # You can add a custom cURL string eg proxy (useful in Russia) or else in "curlcustomstring". # like a "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help", if you not need diff --git a/lgsm/config-default/config-lgsm/csserver/_default.cfg b/lgsm/config-default/config-lgsm/csserver/_default.cfg index 92a54e7dd..7141f33a9 100644 --- a/lgsm/config-default/config-lgsm/csserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/csserver/_default.cfg @@ -37,10 +37,6 @@ posttarget="https://hastebin.com" discordalert="off" discordwebhook="webhook" -# Slack Alerts | https://docs.linuxgsm.com/alerts/slack -slackalert="off" -slackwebhook="webhook" - # Email Alerts | https://docs.linuxgsm.com/alerts/email emailalert="off" email="email@example.com" @@ -67,6 +63,10 @@ channeltag="" pushoveralert="off" pushovertoken="accesstoken" +# Slack Alerts | https://docs.linuxgsm.com/alerts/slack +slackalert="off" +slackwebhook="webhook" + # Telegram Alerts | https://docs.linuxgsm.com/alerts/telegram # You can add a custom cURL string eg proxy (useful in Russia) or else in "curlcustomstring". # like a "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help", if you not need diff --git a/lgsm/config-default/config-lgsm/cssserver/_default.cfg b/lgsm/config-default/config-lgsm/cssserver/_default.cfg index a4ab653ae..aa750fe1c 100644 --- a/lgsm/config-default/config-lgsm/cssserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/cssserver/_default.cfg @@ -43,10 +43,6 @@ posttarget="https://hastebin.com" discordalert="off" discordwebhook="webhook" -# Slack Alerts | https://docs.linuxgsm.com/alerts/slack -slackalert="off" -slackwebhook="webhook" - # Email Alerts | https://docs.linuxgsm.com/alerts/email emailalert="off" email="email@example.com" @@ -73,6 +69,10 @@ channeltag="" pushoveralert="off" pushovertoken="accesstoken" +# Slack Alerts | https://docs.linuxgsm.com/alerts/slack +slackalert="off" +slackwebhook="webhook" + # Telegram Alerts | https://docs.linuxgsm.com/alerts/telegram # You can add a custom cURL string eg proxy (useful in Russia) or else in "curlcustomstring". # like a "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help", if you not need diff --git a/lgsm/config-default/config-lgsm/dabserver/_default.cfg b/lgsm/config-default/config-lgsm/dabserver/_default.cfg index 0f0a75b31..e256c2a47 100644 --- a/lgsm/config-default/config-lgsm/dabserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/dabserver/_default.cfg @@ -38,10 +38,6 @@ posttarget="https://hastebin.com" discordalert="off" discordwebhook="webhook" -# Slack Alerts | https://docs.linuxgsm.com/alerts/slack -slackalert="off" -slackwebhook="webhook" - # Email Alerts | https://docs.linuxgsm.com/alerts/email emailalert="off" email="email@example.com" @@ -68,6 +64,10 @@ channeltag="" pushoveralert="off" pushovertoken="accesstoken" +# Slack Alerts | https://docs.linuxgsm.com/alerts/slack +slackalert="off" +slackwebhook="webhook" + # Telegram Alerts | https://docs.linuxgsm.com/alerts/telegram # You can add a custom cURL string eg proxy (useful in Russia) or else in "curlcustomstring". # like a "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help", if you not need diff --git a/lgsm/config-default/config-lgsm/dmcserver/_default.cfg b/lgsm/config-default/config-lgsm/dmcserver/_default.cfg index 9a12049b1..779f33632 100644 --- a/lgsm/config-default/config-lgsm/dmcserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/dmcserver/_default.cfg @@ -37,10 +37,6 @@ posttarget="https://hastebin.com" discordalert="off" discordwebhook="webhook" -# Slack Alerts | https://docs.linuxgsm.com/alerts/slack -slackalert="off" -slackwebhook="webhook" - # Email Alerts | https://docs.linuxgsm.com/alerts/email emailalert="off" email="email@example.com" @@ -67,6 +63,10 @@ channeltag="" pushoveralert="off" pushovertoken="accesstoken" +# Slack Alerts | https://docs.linuxgsm.com/alerts/slack +slackalert="off" +slackwebhook="webhook" + # Telegram Alerts | https://docs.linuxgsm.com/alerts/telegram # You can add a custom cURL string eg proxy (useful in Russia) or else in "curlcustomstring". # like a "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help", if you not need diff --git a/lgsm/config-default/config-lgsm/dodserver/_default.cfg b/lgsm/config-default/config-lgsm/dodserver/_default.cfg index 646f3cd45..2c47d5501 100644 --- a/lgsm/config-default/config-lgsm/dodserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/dodserver/_default.cfg @@ -37,10 +37,6 @@ posttarget="https://hastebin.com" discordalert="off" discordwebhook="webhook" -# Slack Alerts | https://docs.linuxgsm.com/alerts/slack -slackalert="off" -slackwebhook="webhook" - # Email Alerts | https://docs.linuxgsm.com/alerts/email emailalert="off" email="email@example.com" @@ -67,6 +63,10 @@ channeltag="" pushoveralert="off" pushovertoken="accesstoken" +# Slack Alerts | https://docs.linuxgsm.com/alerts/slack +slackalert="off" +slackwebhook="webhook" + # Telegram Alerts | https://docs.linuxgsm.com/alerts/telegram # You can add a custom cURL string eg proxy (useful in Russia) or else in "curlcustomstring". # like a "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help", if you not need diff --git a/lgsm/config-default/config-lgsm/dodsserver/_default.cfg b/lgsm/config-default/config-lgsm/dodsserver/_default.cfg index cc6a7b107..83ba5072a 100644 --- a/lgsm/config-default/config-lgsm/dodsserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/dodsserver/_default.cfg @@ -38,10 +38,6 @@ posttarget="https://hastebin.com" discordalert="off" discordwebhook="webhook" -# Slack Alerts | https://docs.linuxgsm.com/alerts/slack -slackalert="off" -slackwebhook="webhook" - # Email Alerts | https://docs.linuxgsm.com/alerts/email emailalert="off" email="email@example.com" @@ -68,6 +64,10 @@ channeltag="" pushoveralert="off" pushovertoken="accesstoken" +# Slack Alerts | https://docs.linuxgsm.com/alerts/slack +slackalert="off" +slackwebhook="webhook" + # Telegram Alerts | https://docs.linuxgsm.com/alerts/telegram # You can add a custom cURL string eg proxy (useful in Russia) or else in "curlcustomstring". # like a "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help", if you not need diff --git a/lgsm/config-default/config-lgsm/doiserver/_default.cfg b/lgsm/config-default/config-lgsm/doiserver/_default.cfg index 0023e1dc3..f74935f60 100644 --- a/lgsm/config-default/config-lgsm/doiserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/doiserver/_default.cfg @@ -39,10 +39,6 @@ posttarget="https://hastebin.com" discordalert="off" discordwebhook="webhook" -# Slack Alerts | https://docs.linuxgsm.com/alerts/slack -slackalert="off" -slackwebhook="webhook" - # Email Alerts | https://docs.linuxgsm.com/alerts/email emailalert="off" email="email@example.com" @@ -69,6 +65,10 @@ channeltag="" pushoveralert="off" pushovertoken="accesstoken" +# Slack Alerts | https://docs.linuxgsm.com/alerts/slack +slackalert="off" +slackwebhook="webhook" + # Telegram Alerts | https://docs.linuxgsm.com/alerts/telegram # You can add a custom cURL string eg proxy (useful in Russia) or else in "curlcustomstring". # like a "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help", if you not need diff --git a/lgsm/config-default/config-lgsm/dstserver/_default.cfg b/lgsm/config-default/config-lgsm/dstserver/_default.cfg index 20f7f05c1..fc054e87d 100644 --- a/lgsm/config-default/config-lgsm/dstserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/dstserver/_default.cfg @@ -41,10 +41,6 @@ posttarget="https://hastebin.com" discordalert="off" discordwebhook="webhook" -# Slack Alerts | https://docs.linuxgsm.com/alerts/slack -slackalert="off" -slackwebhook="webhook" - # Email Alerts | https://docs.linuxgsm.com/alerts/email emailalert="off" email="email@example.com" @@ -71,6 +67,10 @@ channeltag="" pushoveralert="off" pushovertoken="accesstoken" +# Slack Alerts | https://docs.linuxgsm.com/alerts/slack +slackalert="off" +slackwebhook="webhook" + # Telegram Alerts | https://docs.linuxgsm.com/alerts/telegram # You can add a custom cURL string eg proxy (useful in Russia) or else in "curlcustomstring". # like a "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help", if you not need diff --git a/lgsm/config-default/config-lgsm/dysserver/_default.cfg b/lgsm/config-default/config-lgsm/dysserver/_default.cfg index 66a483d42..717c17078 100644 --- a/lgsm/config-default/config-lgsm/dysserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/dysserver/_default.cfg @@ -43,10 +43,6 @@ posttarget="https://hastebin.com" discordalert="off" discordwebhook="webhook" -# Slack Alerts | https://docs.linuxgsm.com/alerts/slack -slackalert="off" -slackwebhook="webhook" - # Email Alerts | https://docs.linuxgsm.com/alerts/email emailalert="off" email="email@example.com" @@ -73,6 +69,10 @@ channeltag="" pushoveralert="off" pushovertoken="accesstoken" +# Slack Alerts | https://docs.linuxgsm.com/alerts/slack +slackalert="off" +slackwebhook="webhook" + # Telegram Alerts | https://docs.linuxgsm.com/alerts/telegram # You can add a custom cURL string eg proxy (useful in Russia) or else in "curlcustomstring". # like a "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help", if you not need diff --git a/lgsm/config-default/config-lgsm/ecoserver/_default.cfg b/lgsm/config-default/config-lgsm/ecoserver/_default.cfg index dc1c8e9f3..4d2e15d7c 100644 --- a/lgsm/config-default/config-lgsm/ecoserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/ecoserver/_default.cfg @@ -30,10 +30,6 @@ posttarget="https://hastebin.com" discordalert="off" discordwebhook="webhook" -# Slack Alerts | https://docs.linuxgsm.com/alerts/slack -slackalert="off" -slackwebhook="webhook" - # Email Alerts | https://docs.linuxgsm.com/alerts/email emailalert="off" email="email@example.com" @@ -60,6 +56,10 @@ channeltag="" pushoveralert="off" pushovertoken="accesstoken" +# Slack Alerts | https://docs.linuxgsm.com/alerts/slack +slackalert="off" +slackwebhook="webhook" + # Telegram Alerts | https://docs.linuxgsm.com/alerts/telegram telegramalert="off" telegramtoken="accesstoken" diff --git a/lgsm/config-default/config-lgsm/emserver/_default.cfg b/lgsm/config-default/config-lgsm/emserver/_default.cfg index 50defd25e..a33e7f71a 100644 --- a/lgsm/config-default/config-lgsm/emserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/emserver/_default.cfg @@ -43,10 +43,6 @@ posttarget="https://hastebin.com" discordalert="off" discordwebhook="webhook" -# Slack Alerts | https://docs.linuxgsm.com/alerts/slack -slackalert="off" -slackwebhook="webhook" - # Email Alerts | https://docs.linuxgsm.com/alerts/email emailalert="off" email="email@example.com" @@ -73,6 +69,10 @@ channeltag="" pushoveralert="off" pushovertoken="accesstoken" +# Slack Alerts | https://docs.linuxgsm.com/alerts/slack +slackalert="off" +slackwebhook="webhook" + # Telegram Alerts | https://docs.linuxgsm.com/alerts/telegram # You can add a custom cURL string eg proxy (useful in Russia) or else in "curlcustomstring". # like a "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help", if you not need diff --git a/lgsm/config-default/config-lgsm/etlserver/_default.cfg b/lgsm/config-default/config-lgsm/etlserver/_default.cfg index c7e480ae2..6c6a50734 100644 --- a/lgsm/config-default/config-lgsm/etlserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/etlserver/_default.cfg @@ -30,10 +30,6 @@ posttarget="https://hastebin.com" discordalert="off" discordwebhook="webhook" -# Slack Alerts | https://docs.linuxgsm.com/alerts/slack -slackalert="off" -slackwebhook="webhook" - # Email Alerts | https://docs.linuxgsm.com/alerts/email emailalert="off" email="email@example.com" @@ -60,6 +56,10 @@ channeltag="" pushoveralert="off" pushovertoken="accesstoken" +# Slack Alerts | https://docs.linuxgsm.com/alerts/slack +slackalert="off" +slackwebhook="webhook" + # Telegram Alerts | https://docs.linuxgsm.com/alerts/telegram # You can add a custom cURL string eg proxy (useful in Russia) or else in "curlcustomstring". # like a "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help", if you not need diff --git a/lgsm/config-default/config-lgsm/fctrserver/_default.cfg b/lgsm/config-default/config-lgsm/fctrserver/_default.cfg index 7173175e6..da4f64da8 100644 --- a/lgsm/config-default/config-lgsm/fctrserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/fctrserver/_default.cfg @@ -38,10 +38,6 @@ posttarget="https://hastebin.com" discordalert="off" discordwebhook="webhook" -# Slack Alerts | https://docs.linuxgsm.com/alerts/slack -slackalert="off" -slackwebhook="webhook" - # Email Alerts | https://docs.linuxgsm.com/alerts/email emailalert="off" email="email@example.com" @@ -68,6 +64,10 @@ channeltag="" pushoveralert="off" pushovertoken="accesstoken" +# Slack Alerts | https://docs.linuxgsm.com/alerts/slack +slackalert="off" +slackwebhook="webhook" + # Telegram Alerts | https://docs.linuxgsm.com/alerts/telegram # You can add a custom cURL string eg proxy (useful in Russia) or else in "curlcustomstring". # like a "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help", if you not need diff --git a/lgsm/config-default/config-lgsm/fofserver/_default.cfg b/lgsm/config-default/config-lgsm/fofserver/_default.cfg index a5ab65550..d78916c6f 100644 --- a/lgsm/config-default/config-lgsm/fofserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/fofserver/_default.cfg @@ -38,10 +38,6 @@ posttarget="https://hastebin.com" discordalert="off" discordwebhook="webhook" -# Slack Alerts | https://docs.linuxgsm.com/alerts/slack -slackalert="off" -slackwebhook="webhook" - # Email Alerts | https://docs.linuxgsm.com/alerts/email emailalert="off" email="email@example.com" @@ -68,6 +64,10 @@ channeltag="" pushoveralert="off" pushovertoken="accesstoken" +# Slack Alerts | https://docs.linuxgsm.com/alerts/slack +slackalert="off" +slackwebhook="webhook" + # Telegram Alerts | https://docs.linuxgsm.com/alerts/telegram # You can add a custom cURL string eg proxy (useful in Russia) or else in "curlcustomstring". # like a "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help", if you not need diff --git a/lgsm/config-default/config-lgsm/gesserver/_default.cfg b/lgsm/config-default/config-lgsm/gesserver/_default.cfg index 0a9d799b3..08adc02aa 100644 --- a/lgsm/config-default/config-lgsm/gesserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/gesserver/_default.cfg @@ -38,10 +38,6 @@ posttarget="https://hastebin.com" discordalert="off" discordwebhook="webhook" -# Slack Alerts | https://docs.linuxgsm.com/alerts/slack -slackalert="off" -slackwebhook="webhook" - # Email Alerts | https://docs.linuxgsm.com/alerts/email emailalert="off" email="email@example.com" @@ -68,6 +64,10 @@ channeltag="" pushoveralert="off" pushovertoken="accesstoken" +# Slack Alerts | https://docs.linuxgsm.com/alerts/slack +slackalert="off" +slackwebhook="webhook" + # Telegram Alerts | https://docs.linuxgsm.com/alerts/telegram # You can add a custom cURL string eg proxy (useful in Russia) or else in "curlcustomstring". # like a "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help", if you not need diff --git a/lgsm/config-default/config-lgsm/gmodserver/_default.cfg b/lgsm/config-default/config-lgsm/gmodserver/_default.cfg index bc26f69cd..06c92867d 100644 --- a/lgsm/config-default/config-lgsm/gmodserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/gmodserver/_default.cfg @@ -54,10 +54,6 @@ posttarget="https://hastebin.com" discordalert="off" discordwebhook="webhook" -# Slack Alerts | https://docs.linuxgsm.com/alerts/slack -slackalert="off" -slackwebhook="webhook" - # Email Alerts | https://docs.linuxgsm.com/alerts/email emailalert="off" email="email@example.com" @@ -84,6 +80,10 @@ channeltag="" pushoveralert="off" pushovertoken="accesstoken" +# Slack Alerts | https://docs.linuxgsm.com/alerts/slack +slackalert="off" +slackwebhook="webhook" + # Telegram Alerts | https://docs.linuxgsm.com/alerts/telegram # You can add a custom cURL string eg proxy (useful in Russia) or else in "curlcustomstring". # like a "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help", if you not need diff --git a/lgsm/config-default/config-lgsm/hl2dmserver/_default.cfg b/lgsm/config-default/config-lgsm/hl2dmserver/_default.cfg index 5be86032f..c710cbb62 100644 --- a/lgsm/config-default/config-lgsm/hl2dmserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/hl2dmserver/_default.cfg @@ -38,10 +38,6 @@ posttarget="https://hastebin.com" discordalert="off" discordwebhook="webhook" -# Slack Alerts | https://docs.linuxgsm.com/alerts/slack -slackalert="off" -slackwebhook="webhook" - # Email Alerts | https://docs.linuxgsm.com/alerts/email emailalert="off" email="email@example.com" @@ -68,6 +64,10 @@ channeltag="" pushoveralert="off" pushovertoken="accesstoken" +# Slack Alerts | https://docs.linuxgsm.com/alerts/slack +slackalert="off" +slackwebhook="webhook" + # Telegram Alerts | https://docs.linuxgsm.com/alerts/telegram # You can add a custom cURL string eg proxy (useful in Russia) or else in "curlcustomstring". # like a "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help", if you not need diff --git a/lgsm/config-default/config-lgsm/hldmserver/_default.cfg b/lgsm/config-default/config-lgsm/hldmserver/_default.cfg index 67d8b3279..eddf8143b 100644 --- a/lgsm/config-default/config-lgsm/hldmserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/hldmserver/_default.cfg @@ -37,10 +37,6 @@ posttarget="https://hastebin.com" discordalert="off" discordwebhook="webhook" -# Slack Alerts | https://docs.linuxgsm.com/alerts/slack -slackalert="off" -slackwebhook="webhook" - # Email Alerts | https://docs.linuxgsm.com/alerts/email emailalert="off" email="email@example.com" @@ -67,6 +63,10 @@ channeltag="" pushoveralert="off" pushovertoken="accesstoken" +# Slack Alerts | https://docs.linuxgsm.com/alerts/slack +slackalert="off" +slackwebhook="webhook" + # Telegram Alerts | https://docs.linuxgsm.com/alerts/telegram # You can add a custom cURL string eg proxy (useful in Russia) or else in "curlcustomstring". # like a "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help", if you not need diff --git a/lgsm/config-default/config-lgsm/hldmsserver/_default.cfg b/lgsm/config-default/config-lgsm/hldmsserver/_default.cfg index a53a47ddd..77b164052 100644 --- a/lgsm/config-default/config-lgsm/hldmsserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/hldmsserver/_default.cfg @@ -38,10 +38,6 @@ posttarget="https://hastebin.com" discordalert="off" discordwebhook="webhook" -# Slack Alerts | https://docs.linuxgsm.com/alerts/slack -slackalert="off" -slackwebhook="webhook" - # Email Alerts | https://docs.linuxgsm.com/alerts/email emailalert="off" email="email@example.com" @@ -68,6 +64,10 @@ channeltag="" pushoveralert="off" pushovertoken="accesstoken" +# Slack Alerts | https://docs.linuxgsm.com/alerts/slack +slackalert="off" +slackwebhook="webhook" + # Telegram Alerts | https://docs.linuxgsm.com/alerts/telegram # You can add a custom cURL string eg proxy (useful in Russia) or else in "curlcustomstring". # like a "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help", if you not need diff --git a/lgsm/config-default/config-lgsm/hwserver/_default.cfg b/lgsm/config-default/config-lgsm/hwserver/_default.cfg index 3f724ae5d..70e55e792 100644 --- a/lgsm/config-default/config-lgsm/hwserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/hwserver/_default.cfg @@ -49,10 +49,6 @@ posttarget="https://hastebin.com" discordalert="off" discordwebhook="webhook" -# Slack Alerts | https://docs.linuxgsm.com/alerts/slack -slackalert="off" -slackwebhook="webhook" - # Email Alerts | https://docs.linuxgsm.com/alerts/email emailalert="off" email="email@example.com" @@ -79,6 +75,10 @@ channeltag="" pushoveralert="off" pushovertoken="accesstoken" +# Slack Alerts | https://docs.linuxgsm.com/alerts/slack +slackalert="off" +slackwebhook="webhook" + # Telegram Alerts | https://docs.linuxgsm.com/alerts/telegram # You can add a custom cURL string eg proxy (useful in Russia) or else in "curlcustomstring". # like a "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help", if you not need diff --git a/lgsm/config-default/config-lgsm/insserver/_default.cfg b/lgsm/config-default/config-lgsm/insserver/_default.cfg index 9ebea05e0..246b00584 100644 --- a/lgsm/config-default/config-lgsm/insserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/insserver/_default.cfg @@ -44,10 +44,6 @@ posttarget="https://hastebin.com" discordalert="off" discordwebhook="webhook" -# Slack Alerts | https://docs.linuxgsm.com/alerts/slack -slackalert="off" -slackwebhook="webhook" - # Email Alerts | https://docs.linuxgsm.com/alerts/email emailalert="off" email="email@example.com" @@ -74,6 +70,10 @@ channeltag="" pushoveralert="off" pushovertoken="accesstoken" +# Slack Alerts | https://docs.linuxgsm.com/alerts/slack +slackalert="off" +slackwebhook="webhook" + # Telegram Alerts | https://docs.linuxgsm.com/alerts/telegram # You can add a custom cURL string eg proxy (useful in Russia) or else in "curlcustomstring". # like a "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help", if you not need diff --git a/lgsm/config-default/config-lgsm/inssserver/_default.cfg b/lgsm/config-default/config-lgsm/inssserver/_default.cfg index 28a0e9c95..cc54b8d3f 100644 --- a/lgsm/config-default/config-lgsm/inssserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/inssserver/_default.cfg @@ -46,10 +46,6 @@ posttarget="https://hastebin.com" discordalert="off" discordwebhook="webhook" -# Slack Alerts | https://docs.linuxgsm.com/alerts/slack -slackalert="off" -slackwebhook="webhook" - # Email Alerts | https://docs.linuxgsm.com/alerts/email emailalert="off" email="email@example.com" @@ -76,6 +72,10 @@ channeltag="" pushoveralert="off" pushovertoken="accesstoken" +# Slack Alerts | https://docs.linuxgsm.com/alerts/slack +slackalert="off" +slackwebhook="webhook" + # Telegram Alerts | https://docs.linuxgsm.com/alerts/telegram # You can add a custom cURL string eg proxy (useful in Russia) or else in "curlcustomstring". # like a "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help", if you not need diff --git a/lgsm/config-default/config-lgsm/iosserver/_default.cfg b/lgsm/config-default/config-lgsm/iosserver/_default.cfg index 4a13f1e36..0beecbdab 100644 --- a/lgsm/config-default/config-lgsm/iosserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/iosserver/_default.cfg @@ -38,10 +38,6 @@ posttarget="https://hastebin.com" discordalert="off" discordwebhook="webhook" -# Slack Alerts | https://docs.linuxgsm.com/alerts/slack -slackalert="off" -slackwebhook="webhook" - # Email Alerts | https://docs.linuxgsm.com/alerts/email emailalert="off" email="email@example.com" @@ -68,6 +64,10 @@ channeltag="" pushoveralert="off" pushovertoken="accesstoken" +# Slack Alerts | https://docs.linuxgsm.com/alerts/slack +slackalert="off" +slackwebhook="webhook" + # Telegram Alerts | https://docs.linuxgsm.com/alerts/telegram # You can add a custom cURL string eg proxy (useful in Russia) or else in "curlcustomstring". # like a "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help", if you not need diff --git a/lgsm/config-default/config-lgsm/jc2server/_default.cfg b/lgsm/config-default/config-lgsm/jc2server/_default.cfg index 039366269..52248161c 100644 --- a/lgsm/config-default/config-lgsm/jc2server/_default.cfg +++ b/lgsm/config-default/config-lgsm/jc2server/_default.cfg @@ -30,10 +30,6 @@ posttarget="https://hastebin.com" discordalert="off" discordwebhook="webhook" -# Slack Alerts | https://docs.linuxgsm.com/alerts/slack -slackalert="off" -slackwebhook="webhook" - # Email Alerts | https://docs.linuxgsm.com/alerts/email emailalert="off" email="email@example.com" @@ -60,6 +56,10 @@ channeltag="" pushoveralert="off" pushovertoken="accesstoken" +# Slack Alerts | https://docs.linuxgsm.com/alerts/slack +slackalert="off" +slackwebhook="webhook" + # Telegram Alerts | https://docs.linuxgsm.com/alerts/telegram # You can add a custom cURL string eg proxy (useful in Russia) or else in "curlcustomstring". # like a "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help", if you not need diff --git a/lgsm/config-default/config-lgsm/jc3server/_default.cfg b/lgsm/config-default/config-lgsm/jc3server/_default.cfg index 5b1ad7b54..b99603c03 100644 --- a/lgsm/config-default/config-lgsm/jc3server/_default.cfg +++ b/lgsm/config-default/config-lgsm/jc3server/_default.cfg @@ -30,10 +30,6 @@ posttarget="https://hastebin.com" discordalert="off" discordwebhook="webhook" -# Slack Alerts | https://docs.linuxgsm.com/alerts/slack -slackalert="off" -slackwebhook="webhook" - # Email Alerts | https://docs.linuxgsm.com/alerts/email emailalert="off" email="email@example.com" @@ -60,6 +56,10 @@ channeltag="" pushoveralert="off" pushovertoken="accesstoken" +# Slack Alerts | https://docs.linuxgsm.com/alerts/slack +slackalert="off" +slackwebhook="webhook" + # Telegram Alerts | https://docs.linuxgsm.com/alerts/telegram # You can add a custom cURL string eg proxy (useful in Russia) or else in "curlcustomstring". # like a "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help", if you not need diff --git a/lgsm/config-default/config-lgsm/kf2server/_default.cfg b/lgsm/config-default/config-lgsm/kf2server/_default.cfg index a6bef1b81..da31e737a 100644 --- a/lgsm/config-default/config-lgsm/kf2server/_default.cfg +++ b/lgsm/config-default/config-lgsm/kf2server/_default.cfg @@ -36,10 +36,6 @@ posttarget="https://hastebin.com" discordalert="off" discordwebhook="webhook" -# Slack Alerts | https://docs.linuxgsm.com/alerts/slack -slackalert="off" -slackwebhook="webhook" - # Email Alerts | https://docs.linuxgsm.com/alerts/email emailalert="off" email="email@example.com" @@ -66,6 +62,10 @@ channeltag="" pushoveralert="off" pushovertoken="accesstoken" +# Slack Alerts | https://docs.linuxgsm.com/alerts/slack +slackalert="off" +slackwebhook="webhook" + # Telegram Alerts | https://docs.linuxgsm.com/alerts/telegram # You can add a custom cURL string eg proxy (useful in Russia) or else in "curlcustomstring". # like a "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help", if you not need diff --git a/lgsm/config-default/config-lgsm/kfserver/_default.cfg b/lgsm/config-default/config-lgsm/kfserver/_default.cfg index 4675447d6..82d67bc62 100644 --- a/lgsm/config-default/config-lgsm/kfserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/kfserver/_default.cfg @@ -42,10 +42,6 @@ posttarget="https://hastebin.com" discordalert="off" discordwebhook="webhook" -# Slack Alerts | https://docs.linuxgsm.com/alerts/slack -slackalert="off" -slackwebhook="webhook" - # Email Alerts | https://docs.linuxgsm.com/alerts/email emailalert="off" email="email@example.com" @@ -72,6 +68,10 @@ channeltag="" pushoveralert="off" pushovertoken="accesstoken" +# Slack Alerts | https://docs.linuxgsm.com/alerts/slack +slackalert="off" +slackwebhook="webhook" + # Telegram Alerts | https://docs.linuxgsm.com/alerts/telegram # You can add a custom cURL string eg proxy (useful in Russia) or else in "curlcustomstring". # like a "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help", if you not need diff --git a/lgsm/config-default/config-lgsm/l4d2server/_default.cfg b/lgsm/config-default/config-lgsm/l4d2server/_default.cfg index 0727b44bf..2250b7393 100644 --- a/lgsm/config-default/config-lgsm/l4d2server/_default.cfg +++ b/lgsm/config-default/config-lgsm/l4d2server/_default.cfg @@ -37,10 +37,6 @@ posttarget="https://hastebin.com" discordalert="off" discordwebhook="webhook" -# Slack Alerts | https://docs.linuxgsm.com/alerts/slack -slackalert="off" -slackwebhook="webhook" - # Email Alerts | https://docs.linuxgsm.com/alerts/email emailalert="off" email="email@example.com" @@ -67,6 +63,10 @@ channeltag="" pushoveralert="off" pushovertoken="accesstoken" +# Slack Alerts | https://docs.linuxgsm.com/alerts/slack +slackalert="off" +slackwebhook="webhook" + # Telegram Alerts | https://docs.linuxgsm.com/alerts/telegram # You can add a custom cURL string eg proxy (useful in Russia) or else in "curlcustomstring". # like a "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help", if you not need diff --git a/lgsm/config-default/config-lgsm/l4dserver/_default.cfg b/lgsm/config-default/config-lgsm/l4dserver/_default.cfg index c06c6eff9..33ff44c30 100644 --- a/lgsm/config-default/config-lgsm/l4dserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/l4dserver/_default.cfg @@ -37,10 +37,6 @@ posttarget="https://hastebin.com" discordalert="off" discordwebhook="webhook" -# Slack Alerts | https://docs.linuxgsm.com/alerts/slack -slackalert="off" -slackwebhook="webhook" - # Email Alerts | https://docs.linuxgsm.com/alerts/email emailalert="off" email="email@example.com" @@ -67,6 +63,10 @@ channeltag="" pushoveralert="off" pushovertoken="accesstoken" +# Slack Alerts | https://docs.linuxgsm.com/alerts/slack +slackalert="off" +slackwebhook="webhook" + # Telegram Alerts | https://docs.linuxgsm.com/alerts/telegram # You can add a custom cURL string eg proxy (useful in Russia) or else in "curlcustomstring". # like a "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help", if you not need diff --git a/lgsm/config-default/config-lgsm/mcserver/_default.cfg b/lgsm/config-default/config-lgsm/mcserver/_default.cfg index cb3ae01b6..663c141a7 100644 --- a/lgsm/config-default/config-lgsm/mcserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/mcserver/_default.cfg @@ -32,10 +32,6 @@ posttarget="https://hastebin.com" discordalert="off" discordwebhook="webhook" -# Slack Alerts | https://docs.linuxgsm.com/alerts/slack -slackalert="off" -slackwebhook="webhook" - # Email Alerts | https://docs.linuxgsm.com/alerts/email emailalert="off" email="email@example.com" @@ -62,6 +58,10 @@ channeltag="" pushoveralert="off" pushovertoken="accesstoken" +# Slack Alerts | https://docs.linuxgsm.com/alerts/slack +slackalert="off" +slackwebhook="webhook" + # Telegram Alerts | https://docs.linuxgsm.com/alerts/telegram # You can add a custom cURL string eg proxy (useful in Russia) or else in "curlcustomstring". # like a "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help", if you not need diff --git a/lgsm/config-default/config-lgsm/mohaaserver/_default.cfg b/lgsm/config-default/config-lgsm/mohaaserver/_default.cfg index 521f3771a..4ee5487e7 100644 --- a/lgsm/config-default/config-lgsm/mohaaserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/mohaaserver/_default.cfg @@ -35,10 +35,6 @@ posttarget="https://hastebin.com" discordalert="off" discordwebhook="webhook" -# Slack Alerts | https://docs.linuxgsm.com/alerts/slack -slackalert="off" -slackwebhook="webhook" - # Email Alerts | https://docs.linuxgsm.com/alerts/email emailalert="off" email="email@example.com" @@ -65,6 +61,10 @@ channeltag="" pushoveralert="off" pushovertoken="accesstoken" +# Slack Alerts | https://docs.linuxgsm.com/alerts/slack +slackalert="off" +slackwebhook="webhook" + # Telegram Alerts | https://docs.linuxgsm.com/alerts/telegram # You can add a custom cURL string eg proxy (useful in Russia) or else in "curlcustomstring". # like a "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help", if you not need diff --git a/lgsm/config-default/config-lgsm/mtaserver/_default.cfg b/lgsm/config-default/config-lgsm/mtaserver/_default.cfg index dca15b385..5dc5dbbcc 100644 --- a/lgsm/config-default/config-lgsm/mtaserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/mtaserver/_default.cfg @@ -31,10 +31,6 @@ posttarget="https://hastebin.com" discordalert="off" discordwebhook="webhook" -# Slack Alerts | https://docs.linuxgsm.com/alerts/slack -slackalert="off" -slackwebhook="webhook" - # Email Alerts | https://docs.linuxgsm.com/alerts/email emailalert="off" email="email@example.com" @@ -61,6 +57,10 @@ channeltag="" pushoveralert="off" pushovertoken="accesstoken" +# Slack Alerts | https://docs.linuxgsm.com/alerts/slack +slackalert="off" +slackwebhook="webhook" + # Telegram Alerts | https://docs.linuxgsm.com/alerts/telegram # You can add a custom cURL string eg proxy (useful in Russia) or else in "curlcustomstring". # like a "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help", if you not need diff --git a/lgsm/config-default/config-lgsm/mumbleserver/_default.cfg b/lgsm/config-default/config-lgsm/mumbleserver/_default.cfg index 0d31699c2..4c6190596 100644 --- a/lgsm/config-default/config-lgsm/mumbleserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/mumbleserver/_default.cfg @@ -31,10 +31,6 @@ posttarget="https://hastebin.com" discordalert="off" discordwebhook="webhook" -# Slack Alerts | https://docs.linuxgsm.com/alerts/slack -slackalert="off" -slackwebhook="webhook" - # Email Alerts | https://docs.linuxgsm.com/alerts/email emailalert="off" email="email@example.com" @@ -61,6 +57,10 @@ channeltag="" pushoveralert="off" pushovertoken="accesstoken" +# Slack Alerts | https://docs.linuxgsm.com/alerts/slack +slackalert="off" +slackwebhook="webhook" + # Telegram Alerts | https://docs.linuxgsm.com/alerts/telegram # You can add a custom cURL string eg proxy (useful in Russia) or else in "curlcustomstring". # like a "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help", if you not need diff --git a/lgsm/config-default/config-lgsm/ndserver/_default.cfg b/lgsm/config-default/config-lgsm/ndserver/_default.cfg index 5971fac1e..4f54b6318 100644 --- a/lgsm/config-default/config-lgsm/ndserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/ndserver/_default.cfg @@ -38,10 +38,6 @@ posttarget="https://hastebin.com" discordalert="off" discordwebhook="webhook" -# Slack Alerts | https://docs.linuxgsm.com/alerts/slack -slackalert="off" -slackwebhook="webhook" - # Email Alerts | https://docs.linuxgsm.com/alerts/email emailalert="off" email="email@example.com" @@ -68,6 +64,10 @@ channeltag="" pushoveralert="off" pushovertoken="accesstoken" +# Slack Alerts | https://docs.linuxgsm.com/alerts/slack +slackalert="off" +slackwebhook="webhook" + # Telegram Alerts | https://docs.linuxgsm.com/alerts/telegram # You can add a custom cURL string eg proxy (useful in Russia) or else in "curlcustomstring". # like a "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help", if you not need diff --git a/lgsm/config-default/config-lgsm/nmrihserver/_default.cfg b/lgsm/config-default/config-lgsm/nmrihserver/_default.cfg index b95bcfb84..57869bc3e 100644 --- a/lgsm/config-default/config-lgsm/nmrihserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/nmrihserver/_default.cfg @@ -43,10 +43,6 @@ posttarget="https://hastebin.com" discordalert="off" discordwebhook="webhook" -# Slack Alerts | https://docs.linuxgsm.com/alerts/slack -slackalert="off" -slackwebhook="webhook" - # Email Alerts | https://docs.linuxgsm.com/alerts/email emailalert="off" email="email@example.com" @@ -73,6 +69,10 @@ channeltag="" pushoveralert="off" pushovertoken="accesstoken" +# Slack Alerts | https://docs.linuxgsm.com/alerts/slack +slackalert="off" +slackwebhook="webhook" + # Telegram Alerts | https://docs.linuxgsm.com/alerts/telegram # You can add a custom cURL string eg proxy (useful in Russia) or else in "curlcustomstring". # like a "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help", if you not need diff --git a/lgsm/config-default/config-lgsm/ns2cserver/_default.cfg b/lgsm/config-default/config-lgsm/ns2cserver/_default.cfg index 9fea23aab..7e6bca42a 100644 --- a/lgsm/config-default/config-lgsm/ns2cserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/ns2cserver/_default.cfg @@ -45,10 +45,6 @@ posttarget="https://hastebin.com" discordalert="off" discordwebhook="webhook" -# Slack Alerts | https://docs.linuxgsm.com/alerts/slack -slackalert="off" -slackwebhook="webhook" - # Email Alerts | https://docs.linuxgsm.com/alerts/email emailalert="off" email="email@example.com" @@ -75,6 +71,10 @@ channeltag="" pushoveralert="off" pushovertoken="accesstoken" +# Slack Alerts | https://docs.linuxgsm.com/alerts/slack +slackalert="off" +slackwebhook="webhook" + # Telegram Alerts | https://docs.linuxgsm.com/alerts/telegram # You can add a custom cURL string eg proxy (useful in Russia) or else in "curlcustomstring". # like a "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help", if you not need diff --git a/lgsm/config-default/config-lgsm/ns2server/_default.cfg b/lgsm/config-default/config-lgsm/ns2server/_default.cfg index dd6f9150b..41e52d53d 100644 --- a/lgsm/config-default/config-lgsm/ns2server/_default.cfg +++ b/lgsm/config-default/config-lgsm/ns2server/_default.cfg @@ -49,10 +49,6 @@ posttarget="https://hastebin.com" discordalert="off" discordwebhook="webhook" -# Slack Alerts | https://docs.linuxgsm.com/alerts/slack -slackalert="off" -slackwebhook="webhook" - # Email Alerts | https://docs.linuxgsm.com/alerts/email emailalert="off" email="email@example.com" @@ -79,6 +75,10 @@ channeltag="" pushoveralert="off" pushovertoken="accesstoken" +# Slack Alerts | https://docs.linuxgsm.com/alerts/slack +slackalert="off" +slackwebhook="webhook" + # Telegram Alerts | https://docs.linuxgsm.com/alerts/telegram # You can add a custom cURL string eg proxy (useful in Russia) or else in "curlcustomstring". # like a "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help", if you not need diff --git a/lgsm/config-default/config-lgsm/nsserver/_default.cfg b/lgsm/config-default/config-lgsm/nsserver/_default.cfg index 0368bc5ba..59e61097d 100644 --- a/lgsm/config-default/config-lgsm/nsserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/nsserver/_default.cfg @@ -37,10 +37,6 @@ posttarget="https://hastebin.com" discordalert="off" discordwebhook="webhook" -# Slack Alerts | https://docs.linuxgsm.com/alerts/slack -slackalert="off" -slackwebhook="webhook" - # Email Alerts | https://docs.linuxgsm.com/alerts/email emailalert="off" email="email@example.com" @@ -67,6 +63,10 @@ channeltag="" pushoveralert="off" pushovertoken="accesstoken" +# Slack Alerts | https://docs.linuxgsm.com/alerts/slack +slackalert="off" +slackwebhook="webhook" + # Telegram Alerts | https://docs.linuxgsm.com/alerts/telegram # You can add a custom cURL string eg proxy (useful in Russia) or else in "curlcustomstring". # like a "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help", if you not need diff --git a/lgsm/config-default/config-lgsm/opforserver/_default.cfg b/lgsm/config-default/config-lgsm/opforserver/_default.cfg index bfea855be..f5cf34813 100644 --- a/lgsm/config-default/config-lgsm/opforserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/opforserver/_default.cfg @@ -37,10 +37,6 @@ posttarget="https://hastebin.com" discordalert="off" discordwebhook="webhook" -# Slack Alerts | https://docs.linuxgsm.com/alerts/slack -slackalert="off" -slackwebhook="webhook" - # Email Alerts | https://docs.linuxgsm.com/alerts/email emailalert="off" email="email@example.com" @@ -67,6 +63,10 @@ channeltag="" pushoveralert="off" pushovertoken="accesstoken" +# Slack Alerts | https://docs.linuxgsm.com/alerts/slack +slackalert="off" +slackwebhook="webhook" + # Telegram Alerts | https://docs.linuxgsm.com/alerts/telegram # You can add a custom cURL string eg proxy (useful in Russia) or else in "curlcustomstring". # like a "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help", if you not need diff --git a/lgsm/config-default/config-lgsm/pcserver/_default.cfg b/lgsm/config-default/config-lgsm/pcserver/_default.cfg index dc59cfe77..ef1fb6925 100644 --- a/lgsm/config-default/config-lgsm/pcserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/pcserver/_default.cfg @@ -30,10 +30,6 @@ posttarget="https://hastebin.com" discordalert="off" discordwebhook="webhook" -# Slack Alerts | https://docs.linuxgsm.com/alerts/slack -slackalert="off" -slackwebhook="webhook" - # Email Alerts | https://docs.linuxgsm.com/alerts/email emailalert="off" email="email@example.com" @@ -60,6 +56,10 @@ channeltag="" pushoveralert="off" pushovertoken="accesstoken" +# Slack Alerts | https://docs.linuxgsm.com/alerts/slack +slackalert="off" +slackwebhook="webhook" + # Telegram Alerts | https://docs.linuxgsm.com/alerts/telegram # You can add a custom cURL string eg proxy (useful in Russia) or else in "curlcustomstring". # like a "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help", if you not need diff --git a/lgsm/config-default/config-lgsm/pstbsserver/_default.cfg b/lgsm/config-default/config-lgsm/pstbsserver/_default.cfg index 956d86b85..ad692c635 100644 --- a/lgsm/config-default/config-lgsm/pstbsserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/pstbsserver/_default.cfg @@ -41,10 +41,6 @@ posttarget="https://hastebin.com" discordalert="off" discordwebhook="webhook" -# Slack Alerts | https://docs.linuxgsm.com/alerts/slack -slackalert="off" -slackwebhook="webhook" - # Email Alerts | https://docs.linuxgsm.com/alerts/email emailalert="off" email="email@example.com" @@ -71,6 +67,10 @@ channeltag="" pushoveralert="off" pushovertoken="accesstoken" +# Slack Alerts | https://docs.linuxgsm.com/alerts/slack +slackalert="off" +slackwebhook="webhook" + # Telegram Alerts | https://docs.linuxgsm.com/alerts/telegram # You can add a custom cURL string eg proxy (useful in Russia) or else in "curlcustomstring". # like a "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help", if you not need diff --git a/lgsm/config-default/config-lgsm/pvkiiserver/_default.cfg b/lgsm/config-default/config-lgsm/pvkiiserver/_default.cfg index 1fd1a7dc3..cdfc1b20f 100644 --- a/lgsm/config-default/config-lgsm/pvkiiserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/pvkiiserver/_default.cfg @@ -38,10 +38,6 @@ posttarget="https://hastebin.com" discordalert="off" discordwebhook="webhook" -# Slack Alerts | https://docs.linuxgsm.com/alerts/slack -slackalert="off" -slackwebhook="webhook" - # Email Alerts | https://docs.linuxgsm.com/alerts/email emailalert="off" email="email@example.com" @@ -68,6 +64,10 @@ channeltag="" pushoveralert="off" pushovertoken="accesstoken" +# Slack Alerts | https://docs.linuxgsm.com/alerts/slack +slackalert="off" +slackwebhook="webhook" + # Telegram Alerts | https://docs.linuxgsm.com/alerts/telegram # You can add a custom cURL string eg proxy (useful in Russia) or else in "curlcustomstring". # like a "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help", if you not need diff --git a/lgsm/config-default/config-lgsm/pzserver/_default.cfg b/lgsm/config-default/config-lgsm/pzserver/_default.cfg index 3ecb85125..1b5bc2296 100644 --- a/lgsm/config-default/config-lgsm/pzserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/pzserver/_default.cfg @@ -33,10 +33,6 @@ posttarget="https://hastebin.com" discordalert="off" discordwebhook="webhook" -# Slack Alerts | https://docs.linuxgsm.com/alerts/slack -slackalert="off" -slackwebhook="webhook" - # Email Alerts | https://docs.linuxgsm.com/alerts/email emailalert="off" email="email@example.com" @@ -63,6 +59,10 @@ channeltag="" pushoveralert="off" pushovertoken="accesstoken" +# Slack Alerts | https://docs.linuxgsm.com/alerts/slack +slackalert="off" +slackwebhook="webhook" + # Telegram Alerts | https://docs.linuxgsm.com/alerts/telegram # You can add a custom cURL string eg proxy (useful in Russia) or else in "curlcustomstring". # like a "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help", if you not need diff --git a/lgsm/config-default/config-lgsm/q2server/_default.cfg b/lgsm/config-default/config-lgsm/q2server/_default.cfg index 67463687b..42525ec9b 100644 --- a/lgsm/config-default/config-lgsm/q2server/_default.cfg +++ b/lgsm/config-default/config-lgsm/q2server/_default.cfg @@ -35,10 +35,6 @@ posttarget="https://hastebin.com" discordalert="off" discordwebhook="webhook" -# Slack Alerts | https://docs.linuxgsm.com/alerts/slack -slackalert="off" -slackwebhook="webhook" - # Email Alerts | https://docs.linuxgsm.com/alerts/email emailalert="off" email="email@example.com" @@ -65,6 +61,10 @@ channeltag="" pushoveralert="off" pushovertoken="accesstoken" +# Slack Alerts | https://docs.linuxgsm.com/alerts/slack +slackalert="off" +slackwebhook="webhook" + # Telegram Alerts | https://docs.linuxgsm.com/alerts/telegram # You can add a custom cURL string eg proxy (useful in Russia) or else in "curlcustomstring". # like a "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help", if you not need diff --git a/lgsm/config-default/config-lgsm/q3server/_default.cfg b/lgsm/config-default/config-lgsm/q3server/_default.cfg index 2b079dbbe..105a66895 100644 --- a/lgsm/config-default/config-lgsm/q3server/_default.cfg +++ b/lgsm/config-default/config-lgsm/q3server/_default.cfg @@ -35,10 +35,6 @@ posttarget="https://hastebin.com" discordalert="off" discordwebhook="webhook" -# Slack Alerts | https://docs.linuxgsm.com/alerts/slack -slackalert="off" -slackwebhook="webhook" - # Email Alerts | https://docs.linuxgsm.com/alerts/email emailalert="off" email="email@example.com" @@ -65,6 +61,10 @@ channeltag="" pushoveralert="off" pushovertoken="accesstoken" +# Slack Alerts | https://docs.linuxgsm.com/alerts/slack +slackalert="off" +slackwebhook="webhook" + # Telegram Alerts | https://docs.linuxgsm.com/alerts/telegram # You can add a custom cURL string eg proxy (useful in Russia) or else in "curlcustomstring". # like a "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help", if you not need diff --git a/lgsm/config-default/config-lgsm/qlserver/_default.cfg b/lgsm/config-default/config-lgsm/qlserver/_default.cfg index 6dc89cb90..bf144b578 100644 --- a/lgsm/config-default/config-lgsm/qlserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/qlserver/_default.cfg @@ -32,10 +32,6 @@ posttarget="https://hastebin.com" discordalert="off" discordwebhook="webhook" -# Slack Alerts | https://docs.linuxgsm.com/alerts/slack -slackalert="off" -slackwebhook="webhook" - # Email Alerts | https://docs.linuxgsm.com/alerts/email emailalert="off" email="email@example.com" @@ -62,6 +58,10 @@ channeltag="" pushoveralert="off" pushovertoken="accesstoken" +# Slack Alerts | https://docs.linuxgsm.com/alerts/slack +slackalert="off" +slackwebhook="webhook" + # Telegram Alerts | https://docs.linuxgsm.com/alerts/telegram # You can add a custom cURL string eg proxy (useful in Russia) or else in "curlcustomstring". # like a "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help", if you not need diff --git a/lgsm/config-default/config-lgsm/qwserver/_default.cfg b/lgsm/config-default/config-lgsm/qwserver/_default.cfg index c94a460d4..5069e4818 100644 --- a/lgsm/config-default/config-lgsm/qwserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/qwserver/_default.cfg @@ -34,10 +34,6 @@ posttarget="https://hastebin.com" discordalert="off" discordwebhook="webhook" -# Slack Alerts | https://docs.linuxgsm.com/alerts/slack -slackalert="off" -slackwebhook="webhook" - # Email Alerts | https://docs.linuxgsm.com/alerts/email emailalert="off" email="email@example.com" @@ -64,6 +60,10 @@ channeltag="" pushoveralert="off" pushovertoken="accesstoken" +# Slack Alerts | https://docs.linuxgsm.com/alerts/slack +slackalert="off" +slackwebhook="webhook" + # Telegram Alerts | https://docs.linuxgsm.com/alerts/telegram # You can add a custom cURL string eg proxy (useful in Russia) or else in "curlcustomstring". # like a "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help", if you not need diff --git a/lgsm/config-default/config-lgsm/ricochetserver/_default.cfg b/lgsm/config-default/config-lgsm/ricochetserver/_default.cfg index 36457b93d..67e810d5b 100644 --- a/lgsm/config-default/config-lgsm/ricochetserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/ricochetserver/_default.cfg @@ -37,10 +37,6 @@ posttarget="https://hastebin.com" discordalert="off" discordwebhook="webhook" -# Slack Alerts | https://docs.linuxgsm.com/alerts/slack -slackalert="off" -slackwebhook="webhook" - # Email Alerts | https://docs.linuxgsm.com/alerts/email emailalert="off" email="email@example.com" @@ -67,6 +63,10 @@ channeltag="" pushoveralert="off" pushovertoken="accesstoken" +# Slack Alerts | https://docs.linuxgsm.com/alerts/slack +slackalert="off" +slackwebhook="webhook" + # Telegram Alerts | https://docs.linuxgsm.com/alerts/telegram # You can add a custom cURL string eg proxy (useful in Russia) or else in "curlcustomstring". # like a "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help", if you not need diff --git a/lgsm/config-default/config-lgsm/roserver/_default.cfg b/lgsm/config-default/config-lgsm/roserver/_default.cfg index 76b3f312f..d378dc455 100644 --- a/lgsm/config-default/config-lgsm/roserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/roserver/_default.cfg @@ -38,10 +38,6 @@ posttarget="https://hastebin.com" discordalert="off" discordwebhook="webhook" -# Slack Alerts | https://docs.linuxgsm.com/alerts/slack -slackalert="off" -slackwebhook="webhook" - # Email Alerts | https://docs.linuxgsm.com/alerts/email emailalert="off" email="email@example.com" @@ -68,6 +64,10 @@ channeltag="" pushoveralert="off" pushovertoken="accesstoken" +# Slack Alerts | https://docs.linuxgsm.com/alerts/slack +slackalert="off" +slackwebhook="webhook" + # Telegram Alerts | https://docs.linuxgsm.com/alerts/telegram # You can add a custom cURL string eg proxy (useful in Russia) or else in "curlcustomstring". # like a "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help", if you not need diff --git a/lgsm/config-default/config-lgsm/rtcwserver/_default.cfg b/lgsm/config-default/config-lgsm/rtcwserver/_default.cfg index e49bf9471..a70042e49 100644 --- a/lgsm/config-default/config-lgsm/rtcwserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/rtcwserver/_default.cfg @@ -35,10 +35,6 @@ posttarget="https://hastebin.com" discordalert="off" discordwebhook="webhook" -# Slack Alerts | https://docs.linuxgsm.com/alerts/slack -slackalert="off" -slackwebhook="webhook" - # Email Alerts | https://docs.linuxgsm.com/alerts/email emailalert="off" email="email@example.com" @@ -65,6 +61,10 @@ channeltag="" pushoveralert="off" pushovertoken="accesstoken" +# Slack Alerts | https://docs.linuxgsm.com/alerts/slack +slackalert="off" +slackwebhook="webhook" + # Telegram Alerts | https://docs.linuxgsm.com/alerts/telegram # You can add a custom cURL string eg proxy (useful in Russia) or else in "curlcustomstring". # like a "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help", if you not need diff --git a/lgsm/config-default/config-lgsm/rustserver/_default.cfg b/lgsm/config-default/config-lgsm/rustserver/_default.cfg index 5bebb709d..e643ef8a4 100644 --- a/lgsm/config-default/config-lgsm/rustserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/rustserver/_default.cfg @@ -62,10 +62,6 @@ posttarget="https://hastebin.com" discordalert="off" discordwebhook="webhook" -# Slack Alerts | https://docs.linuxgsm.com/alerts/slack -slackalert="off" -slackwebhook="webhook" - # Email Alerts | https://docs.linuxgsm.com/alerts/email emailalert="off" email="email@example.com" @@ -92,6 +88,10 @@ channeltag="" pushoveralert="off" pushovertoken="accesstoken" +# Slack Alerts | https://docs.linuxgsm.com/alerts/slack +slackalert="off" +slackwebhook="webhook" + # Telegram Alerts | https://docs.linuxgsm.com/alerts/telegram # You can add a custom cURL string eg proxy (useful in Russia) or else in "curlcustomstring". # like a "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help", if you not need diff --git a/lgsm/config-default/config-lgsm/rwserver/_default.cfg b/lgsm/config-default/config-lgsm/rwserver/_default.cfg index 6452e61f3..2ab86085b 100644 --- a/lgsm/config-default/config-lgsm/rwserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/rwserver/_default.cfg @@ -33,10 +33,6 @@ posttarget="https://hastebin.com" discordalert="off" discordwebhook="webhook" -# Slack Alerts | https://docs.linuxgsm.com/alerts/slack -slackalert="off" -slackwebhook="webhook" - # Email Alerts | https://docs.linuxgsm.com/alerts/email emailalert="off" email="email@example.com" @@ -63,6 +59,10 @@ channeltag="" pushoveralert="off" pushovertoken="accesstoken" +# Slack Alerts | https://docs.linuxgsm.com/alerts/slack +slackalert="off" +slackwebhook="webhook" + # Telegram Alerts | https://docs.linuxgsm.com/alerts/telegram # You can add a custom cURL string eg proxy (useful in Russia) or else in "curlcustomstring". # like a "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help", if you not need diff --git a/lgsm/config-default/config-lgsm/sampserver/_default.cfg b/lgsm/config-default/config-lgsm/sampserver/_default.cfg index 7de9d62a0..43f0d3cba 100644 --- a/lgsm/config-default/config-lgsm/sampserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/sampserver/_default.cfg @@ -34,10 +34,6 @@ posttarget="https://hastebin.com" discordalert="off" discordwebhook="webhook" -# Slack Alerts | https://docs.linuxgsm.com/alerts/slack -slackalert="off" -slackwebhook="webhook" - # Email Alerts | https://docs.linuxgsm.com/alerts/email emailalert="off" email="email@example.com" @@ -64,6 +60,10 @@ channeltag="" pushoveralert="off" pushovertoken="accesstoken" +# Slack Alerts | https://docs.linuxgsm.com/alerts/slack +slackalert="off" +slackwebhook="webhook" + # Telegram Alerts | https://docs.linuxgsm.com/alerts/telegram # You can add a custom cURL string eg proxy (useful in Russia) or else in "curlcustomstring". # like a "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help", if you not need diff --git a/lgsm/config-default/config-lgsm/sbotsserver/_default.cfg b/lgsm/config-default/config-lgsm/sbotsserver/_default.cfg index d1ff39ccb..8278af21d 100644 --- a/lgsm/config-default/config-lgsm/sbotsserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/sbotsserver/_default.cfg @@ -38,10 +38,6 @@ posttarget="https://hastebin.com" discordalert="off" discordwebhook="webhook" -# Slack Alerts | https://docs.linuxgsm.com/alerts/slack -slackalert="off" -slackwebhook="webhook" - # Email Alerts | https://docs.linuxgsm.com/alerts/email emailalert="off" email="email@example.com" @@ -68,6 +64,10 @@ channeltag="" pushoveralert="off" pushovertoken="accesstoken" +# Slack Alerts | https://docs.linuxgsm.com/alerts/slack +slackalert="off" +slackwebhook="webhook" + # Telegram Alerts | https://docs.linuxgsm.com/alerts/telegram # You can add a custom cURL string eg proxy (useful in Russia) or else in "curlcustomstring". # like a "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help", if you not need diff --git a/lgsm/config-default/config-lgsm/sbserver/_default.cfg b/lgsm/config-default/config-lgsm/sbserver/_default.cfg index dc1e400a6..09de95570 100644 --- a/lgsm/config-default/config-lgsm/sbserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/sbserver/_default.cfg @@ -37,10 +37,6 @@ posttarget="https://hastebin.com" discordalert="off" discordwebhook="webhook" -# Slack Alerts | https://docs.linuxgsm.com/alerts/slack -slackalert="off" -slackwebhook="webhook" - # Email Alerts | https://docs.linuxgsm.com/alerts/email emailalert="off" email="email@example.com" @@ -67,6 +63,10 @@ channeltag="" pushoveralert="off" pushovertoken="accesstoken" +# Slack Alerts | https://docs.linuxgsm.com/alerts/slack +slackalert="off" +slackwebhook="webhook" + # Telegram Alerts | https://docs.linuxgsm.com/alerts/telegram # You can add a custom cURL string eg proxy (useful in Russia) or else in "curlcustomstring". # like a "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help", if you not need diff --git a/lgsm/config-default/config-lgsm/sdtdserver/_default.cfg b/lgsm/config-default/config-lgsm/sdtdserver/_default.cfg index 9e4c6ed9a..5043bcac3 100644 --- a/lgsm/config-default/config-lgsm/sdtdserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/sdtdserver/_default.cfg @@ -33,10 +33,6 @@ posttarget="https://hastebin.com" discordalert="off" discordwebhook="webhook" -# Slack Alerts | https://docs.linuxgsm.com/alerts/slack -slackalert="off" -slackwebhook="webhook" - # Email Alerts | https://docs.linuxgsm.com/alerts/email emailalert="off" email="email@example.com" @@ -63,6 +59,10 @@ channeltag="" pushoveralert="off" pushovertoken="accesstoken" +# Slack Alerts | https://docs.linuxgsm.com/alerts/slack +slackalert="off" +slackwebhook="webhook" + # Telegram Alerts | https://docs.linuxgsm.com/alerts/telegram # You can add a custom cURL string eg proxy (useful in Russia) or else in "curlcustomstring". # like a "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help", if you not need diff --git a/lgsm/config-default/config-lgsm/sfcserver/_default.cfg b/lgsm/config-default/config-lgsm/sfcserver/_default.cfg index 3e3f4f7f5..aafdc7be8 100644 --- a/lgsm/config-default/config-lgsm/sfcserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/sfcserver/_default.cfg @@ -38,10 +38,6 @@ posttarget="https://hastebin.com" discordalert="off" discordwebhook="webhook" -# Slack Alerts | https://docs.linuxgsm.com/alerts/slack -slackalert="off" -slackwebhook="webhook" - # Email Alerts | https://docs.linuxgsm.com/alerts/email emailalert="off" email="email@example.com" @@ -68,6 +64,10 @@ channeltag="" pushoveralert="off" pushovertoken="accesstoken" +# Slack Alerts | https://docs.linuxgsm.com/alerts/slack +slackalert="off" +slackwebhook="webhook" + # Telegram Alerts | https://docs.linuxgsm.com/alerts/telegram # You can add a custom cURL string eg proxy (useful in Russia) or else in "curlcustomstring". # like a "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help", if you not need diff --git a/lgsm/config-default/config-lgsm/sof2server/_default.cfg b/lgsm/config-default/config-lgsm/sof2server/_default.cfg index 26a0cc0cf..a1dcea4d7 100644 --- a/lgsm/config-default/config-lgsm/sof2server/_default.cfg +++ b/lgsm/config-default/config-lgsm/sof2server/_default.cfg @@ -35,10 +35,6 @@ posttarget="https://hastebin.com" discordalert="off" discordwebhook="webhook" -# Slack Alerts | https://docs.linuxgsm.com/alerts/slack -slackalert="off" -slackwebhook="webhook" - # Email Alerts | https://docs.linuxgsm.com/alerts/email emailalert="off" email="email@example.com" @@ -65,6 +61,10 @@ channeltag="" pushoveralert="off" pushovertoken="accesstoken" +# Slack Alerts | https://docs.linuxgsm.com/alerts/slack +slackalert="off" +slackwebhook="webhook" + # Telegram Alerts | https://docs.linuxgsm.com/alerts/telegram # You can add a custom cURL string eg proxy (useful in Russia) or else in "curlcustomstring". # like a "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help", if you not need diff --git a/lgsm/config-default/config-lgsm/solserver/_default.cfg b/lgsm/config-default/config-lgsm/solserver/_default.cfg index 6f846493c..5cc80f3df 100644 --- a/lgsm/config-default/config-lgsm/solserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/solserver/_default.cfg @@ -36,10 +36,6 @@ posttarget="https://hastebin.com" discordalert="off" discordwebhook="webhook" -# Slack Alerts | https://docs.linuxgsm.com/alerts/slack -slackalert="off" -slackwebhook="webhook" - # Email Alerts | https://docs.linuxgsm.com/alerts/email emailalert="off" email="email@example.com" @@ -66,6 +62,10 @@ channeltag="" pushoveralert="off" pushovertoken="accesstoken" +# Slack Alerts | https://docs.linuxgsm.com/alerts/slack +slackalert="off" +slackwebhook="webhook" + # Telegram Alerts | https://docs.linuxgsm.com/alerts/telegram # You can add a custom cURL string eg proxy (useful in Russia) or else in "curlcustomstring". # like a "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help", if you not need diff --git a/lgsm/config-default/config-lgsm/squadserver/_default.cfg b/lgsm/config-default/config-lgsm/squadserver/_default.cfg index 64fe026cc..97991d083 100644 --- a/lgsm/config-default/config-lgsm/squadserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/squadserver/_default.cfg @@ -35,10 +35,6 @@ posttarget="https://hastebin.com" discordalert="off" discordwebhook="webhook" -# Slack Alerts | https://docs.linuxgsm.com/alerts/slack -slackalert="off" -slackwebhook="webhook" - # Email Alerts | https://docs.linuxgsm.com/alerts/email emailalert="off" email="email@example.com" @@ -65,6 +61,10 @@ channeltag="" pushoveralert="off" pushovertoken="accesstoken" +# Slack Alerts | https://docs.linuxgsm.com/alerts/slack +slackalert="off" +slackwebhook="webhook" + # Telegram Alerts | https://docs.linuxgsm.com/alerts/telegram # You can add a custom cURL string eg proxy (useful in Russia) or else in "curlcustomstring". # like a "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help", if you not need diff --git a/lgsm/config-default/config-lgsm/ss3server/_default.cfg b/lgsm/config-default/config-lgsm/ss3server/_default.cfg index 580b90968..5fe555d86 100644 --- a/lgsm/config-default/config-lgsm/ss3server/_default.cfg +++ b/lgsm/config-default/config-lgsm/ss3server/_default.cfg @@ -34,10 +34,6 @@ posttarget="https://hastebin.com" discordalert="off" discordwebhook="webhook" -# Slack Alerts | https://docs.linuxgsm.com/alerts/slack -slackalert="off" -slackwebhook="webhook" - # Email Alerts | https://docs.linuxgsm.com/alerts/email emailalert="off" email="email@example.com" @@ -64,6 +60,10 @@ channeltag="" pushoveralert="off" pushovertoken="accesstoken" +# Slack Alerts | https://docs.linuxgsm.com/alerts/slack +slackalert="off" +slackwebhook="webhook" + # Telegram Alerts | https://docs.linuxgsm.com/alerts/telegram # You can add a custom cURL string eg proxy (useful in Russia) or else in "curlcustomstring". # like a "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help", if you not need diff --git a/lgsm/config-default/config-lgsm/stserver/_default.cfg b/lgsm/config-default/config-lgsm/stserver/_default.cfg index 3305cd282..c295b947d 100644 --- a/lgsm/config-default/config-lgsm/stserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/stserver/_default.cfg @@ -40,10 +40,6 @@ posttarget="https://hastebin.com" discordalert="off" discordwebhook="webhook" -# Slack Alerts | https://docs.linuxgsm.com/alerts/slack -slackalert="off" -slackwebhook="webhook" - # Email Alerts | https://docs.linuxgsm.com/alerts/email emailalert="off" email="email@example.com" @@ -70,6 +66,10 @@ channeltag="" pushoveralert="off" pushovertoken="accesstoken" +# Slack Alerts | https://docs.linuxgsm.com/alerts/slack +slackalert="off" +slackwebhook="webhook" + # Telegram Alerts | https://docs.linuxgsm.com/alerts/telegram # You can add a custom cURL string eg proxy (useful in Russia) or else in "curlcustomstring". # like a "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help", if you not need diff --git a/lgsm/config-default/config-lgsm/svenserver/_default.cfg b/lgsm/config-default/config-lgsm/svenserver/_default.cfg index f02443156..837c2db37 100644 --- a/lgsm/config-default/config-lgsm/svenserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/svenserver/_default.cfg @@ -37,10 +37,6 @@ posttarget="https://hastebin.com" discordalert="off" discordwebhook="webhook" -# Slack Alerts | https://docs.linuxgsm.com/alerts/slack -slackalert="off" -slackwebhook="webhook" - # Email Alerts | https://docs.linuxgsm.com/alerts/email emailalert="off" email="email@example.com" @@ -67,6 +63,10 @@ channeltag="" pushoveralert="off" pushovertoken="accesstoken" +# Slack Alerts | https://docs.linuxgsm.com/alerts/slack +slackalert="off" +slackwebhook="webhook" + # Telegram Alerts | https://docs.linuxgsm.com/alerts/telegram # You can add a custom cURL string eg proxy (useful in Russia) or else in "curlcustomstring". # like a "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help", if you not need diff --git a/lgsm/config-default/config-lgsm/terrariaserver/_default.cfg b/lgsm/config-default/config-lgsm/terrariaserver/_default.cfg index 4d3f06dab..238bc71f9 100644 --- a/lgsm/config-default/config-lgsm/terrariaserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/terrariaserver/_default.cfg @@ -37,10 +37,6 @@ posttarget="https://hastebin.com" discordalert="off" discordwebhook="webhook" -# Slack Alerts | https://docs.linuxgsm.com/alerts/slack -slackalert="off" -slackwebhook="webhook" - # Email Alerts | https://docs.linuxgsm.com/alerts/email emailalert="off" email="email@example.com" @@ -67,6 +63,10 @@ channeltag="" pushoveralert="off" pushovertoken="accesstoken" +# Slack Alerts | https://docs.linuxgsm.com/alerts/slack +slackalert="off" +slackwebhook="webhook" + # Telegram Alerts | https://docs.linuxgsm.com/alerts/telegram # You can add a custom cURL string eg proxy (useful in Russia) or else in "curlcustomstring". # like a "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help", if you not need diff --git a/lgsm/config-default/config-lgsm/tf2server/_default.cfg b/lgsm/config-default/config-lgsm/tf2server/_default.cfg index dbd00f79f..606853630 100644 --- a/lgsm/config-default/config-lgsm/tf2server/_default.cfg +++ b/lgsm/config-default/config-lgsm/tf2server/_default.cfg @@ -43,10 +43,6 @@ posttarget="https://hastebin.com" discordalert="off" discordwebhook="webhook" -# Slack Alerts | https://docs.linuxgsm.com/alerts/slack -slackalert="off" -slackwebhook="webhook" - # Email Alerts | https://docs.linuxgsm.com/alerts/email emailalert="off" email="email@example.com" @@ -73,6 +69,10 @@ channeltag="" pushoveralert="off" pushovertoken="accesstoken" +# Slack Alerts | https://docs.linuxgsm.com/alerts/slack +slackalert="off" +slackwebhook="webhook" + # Telegram Alerts | https://docs.linuxgsm.com/alerts/telegram # You can add a custom cURL string eg proxy (useful in Russia) or else in "curlcustomstring". # like a "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help", if you not need diff --git a/lgsm/config-default/config-lgsm/tfcserver/_default.cfg b/lgsm/config-default/config-lgsm/tfcserver/_default.cfg index ac4cee489..cf02a2be3 100644 --- a/lgsm/config-default/config-lgsm/tfcserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/tfcserver/_default.cfg @@ -37,10 +37,6 @@ posttarget="https://hastebin.com" discordalert="off" discordwebhook="webhook" -# Slack Alerts | https://docs.linuxgsm.com/alerts/slack -slackalert="off" -slackwebhook="webhook" - # Email Alerts | https://docs.linuxgsm.com/alerts/email emailalert="off" email="email@example.com" @@ -67,6 +63,10 @@ channeltag="" pushoveralert="off" pushovertoken="accesstoken" +# Slack Alerts | https://docs.linuxgsm.com/alerts/slack +slackalert="off" +slackwebhook="webhook" + # Telegram Alerts | https://docs.linuxgsm.com/alerts/telegram # You can add a custom cURL string eg proxy (useful in Russia) or else in "curlcustomstring". # like a "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help", if you not need diff --git a/lgsm/config-default/config-lgsm/ts3server/_default.cfg b/lgsm/config-default/config-lgsm/ts3server/_default.cfg index 54f70adb0..6f7ab5f5e 100644 --- a/lgsm/config-default/config-lgsm/ts3server/_default.cfg +++ b/lgsm/config-default/config-lgsm/ts3server/_default.cfg @@ -26,10 +26,6 @@ posttarget="https://hastebin.com" discordalert="off" discordwebhook="webhook" -# Slack Alerts | https://docs.linuxgsm.com/alerts/slack -slackalert="off" -slackwebhook="webhook" - # Email Alerts | https://docs.linuxgsm.com/alerts/email emailalert="off" email="email@example.com" @@ -56,6 +52,10 @@ channeltag="" pushoveralert="off" pushovertoken="accesstoken" +# Slack Alerts | https://docs.linuxgsm.com/alerts/slack +slackalert="off" +slackwebhook="webhook" + # Telegram Alerts | https://docs.linuxgsm.com/alerts/telegram # You can add a custom cURL string eg proxy (useful in Russia) or else in "curlcustomstring". # like a "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help", if you not need diff --git a/lgsm/config-default/config-lgsm/tsserver/_default.cfg b/lgsm/config-default/config-lgsm/tsserver/_default.cfg index 1a5bc27ed..3ab453689 100644 --- a/lgsm/config-default/config-lgsm/tsserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/tsserver/_default.cfg @@ -37,10 +37,6 @@ posttarget="https://hastebin.com" discordalert="off" discordwebhook="webhook" -# Slack Alerts | https://docs.linuxgsm.com/alerts/slack -slackalert="off" -slackwebhook="webhook" - # Email Alerts | https://docs.linuxgsm.com/alerts/email emailalert="off" email="email@example.com" @@ -67,6 +63,10 @@ channeltag="" pushoveralert="off" pushovertoken="accesstoken" +# Slack Alerts | https://docs.linuxgsm.com/alerts/slack +slackalert="off" +slackwebhook="webhook" + # Telegram Alerts | https://docs.linuxgsm.com/alerts/telegram # You can add a custom cURL string eg proxy (useful in Russia) or else in "curlcustomstring". # like a "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help", if you not need diff --git a/lgsm/config-default/config-lgsm/tuserver/_default.cfg b/lgsm/config-default/config-lgsm/tuserver/_default.cfg index fae0f5137..871847600 100644 --- a/lgsm/config-default/config-lgsm/tuserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/tuserver/_default.cfg @@ -40,10 +40,6 @@ posttarget="https://hastebin.com" discordalert="off" discordwebhook="webhook" -# Slack Alerts | https://docs.linuxgsm.com/alerts/slack -slackalert="off" -slackwebhook="webhook" - # Email Alerts | https://docs.linuxgsm.com/alerts/email emailalert="off" email="email@example.com" @@ -70,6 +66,10 @@ channeltag="" pushoveralert="off" pushovertoken="accesstoken" +# Slack Alerts | https://docs.linuxgsm.com/alerts/slack +slackalert="off" +slackwebhook="webhook" + # Telegram Alerts | https://docs.linuxgsm.com/alerts/telegram # You can add a custom cURL string eg proxy (useful in Russia) or else in "curlcustomstring". # like a "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help", if you not need diff --git a/lgsm/config-default/config-lgsm/twserver/_default.cfg b/lgsm/config-default/config-lgsm/twserver/_default.cfg index f0c817a6e..9381b8a88 100644 --- a/lgsm/config-default/config-lgsm/twserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/twserver/_default.cfg @@ -37,10 +37,6 @@ posttarget="https://hastebin.com" discordalert="off" discordwebhook="webhook" -# Slack Alerts | https://docs.linuxgsm.com/alerts/slack -slackalert="off" -slackwebhook="webhook" - # Email Alerts | https://docs.linuxgsm.com/alerts/email emailalert="off" email="email@example.com" @@ -67,6 +63,10 @@ channeltag="" pushoveralert="off" pushovertoken="accesstoken" +# Slack Alerts | https://docs.linuxgsm.com/alerts/slack +slackalert="off" +slackwebhook="webhook" + # Telegram Alerts | https://docs.linuxgsm.com/alerts/telegram # You can add a custom cURL string eg proxy (useful in Russia) or else in "curlcustomstring". # like a "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help", if you not need diff --git a/lgsm/config-default/config-lgsm/ut2k4server/_default.cfg b/lgsm/config-default/config-lgsm/ut2k4server/_default.cfg index 178586854..942f8526e 100644 --- a/lgsm/config-default/config-lgsm/ut2k4server/_default.cfg +++ b/lgsm/config-default/config-lgsm/ut2k4server/_default.cfg @@ -34,10 +34,6 @@ posttarget="https://hastebin.com" discordalert="off" discordwebhook="webhook" -# Slack Alerts | https://docs.linuxgsm.com/alerts/slack -slackalert="off" -slackwebhook="webhook" - # Email Alerts | https://docs.linuxgsm.com/alerts/email emailalert="off" email="email@example.com" @@ -64,6 +60,10 @@ channeltag="" pushoveralert="off" pushovertoken="accesstoken" +# Slack Alerts | https://docs.linuxgsm.com/alerts/slack +slackalert="off" +slackwebhook="webhook" + # Telegram Alerts | https://docs.linuxgsm.com/alerts/telegram # You can add a custom cURL string eg proxy (useful in Russia) or else in "curlcustomstring". # like a "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help", if you not need diff --git a/lgsm/config-default/config-lgsm/ut3server/_default.cfg b/lgsm/config-default/config-lgsm/ut3server/_default.cfg index 990013274..ebb9eee7b 100644 --- a/lgsm/config-default/config-lgsm/ut3server/_default.cfg +++ b/lgsm/config-default/config-lgsm/ut3server/_default.cfg @@ -45,10 +45,6 @@ posttarget="https://hastebin.com" discordalert="off" discordwebhook="webhook" -# Slack Alerts | https://docs.linuxgsm.com/alerts/slack -slackalert="off" -slackwebhook="webhook" - # Email Alerts | https://docs.linuxgsm.com/alerts/email emailalert="off" email="email@example.com" @@ -75,6 +71,10 @@ channeltag="" pushoveralert="off" pushovertoken="accesstoken" +# Slack Alerts | https://docs.linuxgsm.com/alerts/slack +slackalert="off" +slackwebhook="webhook" + # Telegram Alerts | https://docs.linuxgsm.com/alerts/telegram # You can add a custom cURL string eg proxy (useful in Russia) or else in "curlcustomstring". # like a "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help", if you not need diff --git a/lgsm/config-default/config-lgsm/ut99server/_default.cfg b/lgsm/config-default/config-lgsm/ut99server/_default.cfg index 8c74230a2..b87486ecd 100644 --- a/lgsm/config-default/config-lgsm/ut99server/_default.cfg +++ b/lgsm/config-default/config-lgsm/ut99server/_default.cfg @@ -34,10 +34,6 @@ posttarget="https://hastebin.com" discordalert="off" discordwebhook="webhook" -# Slack Alerts | https://docs.linuxgsm.com/alerts/slack -slackalert="off" -slackwebhook="webhook" - # Email Alerts | https://docs.linuxgsm.com/alerts/email emailalert="off" email="email@example.com" @@ -64,6 +60,10 @@ channeltag="" pushoveralert="off" pushovertoken="accesstoken" +# Slack Alerts | https://docs.linuxgsm.com/alerts/slack +slackalert="off" +slackwebhook="webhook" + # Telegram Alerts | https://docs.linuxgsm.com/alerts/telegram # You can add a custom cURL string eg proxy (useful in Russia) or else in "curlcustomstring". # like a "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help", if you not need diff --git a/lgsm/config-default/config-lgsm/utserver/_default.cfg b/lgsm/config-default/config-lgsm/utserver/_default.cfg index 206625b7c..ddce48d22 100644 --- a/lgsm/config-default/config-lgsm/utserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/utserver/_default.cfg @@ -38,10 +38,6 @@ posttarget="https://hastebin.com" discordalert="off" discordwebhook="webhook" -# Slack Alerts | https://docs.linuxgsm.com/alerts/slack -slackalert="off" -slackwebhook="webhook" - # Email Alerts | https://docs.linuxgsm.com/alerts/email emailalert="off" email="email@example.com" @@ -68,6 +64,10 @@ channeltag="" pushoveralert="off" pushovertoken="accesstoken" +# Slack Alerts | https://docs.linuxgsm.com/alerts/slack +slackalert="off" +slackwebhook="webhook" + # Telegram Alerts | https://docs.linuxgsm.com/alerts/telegram # You can add a custom cURL string eg proxy (useful in Russia) or else in "curlcustomstring". # like a "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help", if you not need diff --git a/lgsm/config-default/config-lgsm/vsserver/_default.cfg b/lgsm/config-default/config-lgsm/vsserver/_default.cfg index 5ff4fc2d8..0d8be68fa 100644 --- a/lgsm/config-default/config-lgsm/vsserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/vsserver/_default.cfg @@ -37,10 +37,6 @@ posttarget="https://hastebin.com" discordalert="off" discordwebhook="webhook" -# Slack Alerts | https://docs.linuxgsm.com/alerts/slack -slackalert="off" -slackwebhook="webhook" - # Email Alerts | https://docs.linuxgsm.com/alerts/email emailalert="off" email="email@example.com" @@ -67,6 +63,10 @@ channeltag="" pushoveralert="off" pushovertoken="accesstoken" +# Slack Alerts | https://docs.linuxgsm.com/alerts/slack +slackalert="off" +slackwebhook="webhook" + # Telegram Alerts | https://docs.linuxgsm.com/alerts/telegram # You can add a custom cURL string eg proxy (useful in Russia) or else in "curlcustomstring". # like a "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help", if you not need diff --git a/lgsm/config-default/config-lgsm/wetserver/_default.cfg b/lgsm/config-default/config-lgsm/wetserver/_default.cfg index cdbaa61ec..7a2473945 100644 --- a/lgsm/config-default/config-lgsm/wetserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/wetserver/_default.cfg @@ -30,10 +30,6 @@ posttarget="https://hastebin.com" discordalert="off" discordwebhook="webhook" -# Slack Alerts | https://docs.linuxgsm.com/alerts/slack -slackalert="off" -slackwebhook="webhook" - # Email Alerts | https://docs.linuxgsm.com/alerts/email emailalert="off" email="email@example.com" @@ -60,6 +56,10 @@ channeltag="" pushoveralert="off" pushovertoken="accesstoken" +# Slack Alerts | https://docs.linuxgsm.com/alerts/slack +slackalert="off" +slackwebhook="webhook" + # Telegram Alerts | https://docs.linuxgsm.com/alerts/telegram # You can add a custom cURL string eg proxy (useful in Russia) or else in "curlcustomstring". # like a "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help", if you not need diff --git a/lgsm/config-default/config-lgsm/wfserver/_default.cfg b/lgsm/config-default/config-lgsm/wfserver/_default.cfg index eb54646f8..f6d028c2b 100644 --- a/lgsm/config-default/config-lgsm/wfserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/wfserver/_default.cfg @@ -35,10 +35,6 @@ posttarget="https://hastebin.com" discordalert="off" discordwebhook="webhook" -# Slack Alerts | https://docs.linuxgsm.com/alerts/slack -slackalert="off" -slackwebhook="webhook" - # Email Alerts | https://docs.linuxgsm.com/alerts/email emailalert="off" email="email@example.com" @@ -65,6 +61,10 @@ channeltag="" pushoveralert="off" pushovertoken="accesstoken" +# Slack Alerts | https://docs.linuxgsm.com/alerts/slack +slackalert="off" +slackwebhook="webhook" + # Telegram Alerts | https://docs.linuxgsm.com/alerts/telegram # You can add a custom cURL string eg proxy (useful in Russia) or else in "curlcustomstring". # like a "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help", if you not need diff --git a/lgsm/config-default/config-lgsm/wurmserver/_default.cfg b/lgsm/config-default/config-lgsm/wurmserver/_default.cfg index 7fb2493b8..50e5348c5 100644 --- a/lgsm/config-default/config-lgsm/wurmserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/wurmserver/_default.cfg @@ -32,10 +32,6 @@ posttarget="https://hastebin.com" discordalert="off" discordwebhook="webhook" -# Slack Alerts | https://docs.linuxgsm.com/alerts/slack -slackalert="off" -slackwebhook="webhook" - # Email Alerts | https://docs.linuxgsm.com/alerts/email emailalert="off" email="email@example.com" @@ -62,6 +58,10 @@ channeltag="" pushoveralert="off" pushovertoken="accesstoken" +# Slack Alerts | https://docs.linuxgsm.com/alerts/slack +slackalert="off" +slackwebhook="webhook" + # Telegram Alerts | https://docs.linuxgsm.com/alerts/telegram # You can add a custom cURL string eg proxy (useful in Russia) or else in "curlcustomstring". # like a "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help", if you not need diff --git a/lgsm/config-default/config-lgsm/zmrserver/_default.cfg b/lgsm/config-default/config-lgsm/zmrserver/_default.cfg index c4519b5f7..e3e21369b 100644 --- a/lgsm/config-default/config-lgsm/zmrserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/zmrserver/_default.cfg @@ -38,10 +38,6 @@ posttarget="https://hastebin.com" discordalert="off" discordwebhook="webhook" -# Slack Alerts | https://docs.linuxgsm.com/alerts/slack -slackalert="off" -slackwebhook="webhook" - # Email Alerts | https://docs.linuxgsm.com/alerts/email emailalert="off" email="email@example.com" @@ -68,6 +64,10 @@ channeltag="" pushoveralert="off" pushovertoken="accesstoken" +# Slack Alerts | https://docs.linuxgsm.com/alerts/slack +slackalert="off" +slackwebhook="webhook" + # Telegram Alerts | https://docs.linuxgsm.com/alerts/telegram # You can add a custom cURL string eg proxy (useful in Russia) or else in "curlcustomstring". # like a "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help", if you not need diff --git a/lgsm/config-default/config-lgsm/zpsserver/_default.cfg b/lgsm/config-default/config-lgsm/zpsserver/_default.cfg index e97e65dec..971fe70f3 100644 --- a/lgsm/config-default/config-lgsm/zpsserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/zpsserver/_default.cfg @@ -43,10 +43,6 @@ posttarget="https://hastebin.com" discordalert="off" discordwebhook="webhook" -# Slack Alerts | https://docs.linuxgsm.com/alerts/slack -slackalert="off" -slackwebhook="webhook" - # Email Alerts | https://docs.linuxgsm.com/alerts/email emailalert="off" email="email@example.com" @@ -73,6 +69,10 @@ channeltag="" pushoveralert="off" pushovertoken="accesstoken" +# Slack Alerts | https://docs.linuxgsm.com/alerts/slack +slackalert="off" +slackwebhook="webhook" + # Telegram Alerts | https://docs.linuxgsm.com/alerts/telegram # You can add a custom cURL string eg proxy (useful in Russia) or else in "curlcustomstring". # like a "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help", if you not need diff --git a/lgsm/functions/check_deps.sh b/lgsm/functions/check_deps.sh index 4f2bc5892..bbf7686b3 100644 --- a/lgsm/functions/check_deps.sh +++ b/lgsm/functions/check_deps.sh @@ -400,7 +400,7 @@ fn_deps_build_debian(){ else array_deps_required+=( openjdk-8-jre-headless ) fi - # Medal of Honor: Allied Assault + # Medal of Honor: Allied Assault elif [ "${shortname}" == "mohaa" ]; then array_deps_required+=( libstdc++5:i386 ) # Project Zomboid @@ -526,7 +526,7 @@ fn_deps_build_redhat(){ else array_deps_required+=( java-1.8.0-openjdk rng-tools ) fi - # Minecraft + # Project Zomboid elif [ "${shortname}" == "pz" ]; then javaversion=$(java -version 2>&1 | grep "version") if [ "${javaversion}" ]; then diff --git a/lgsm/functions/info_config.sh b/lgsm/functions/info_config.sh index 0e161a2f5..9c12907f8 100644 --- a/lgsm/functions/info_config.sh +++ b/lgsm/functions/info_config.sh @@ -1361,7 +1361,7 @@ elif [ "${engine}" == "source" ]||[ "${engine}" == "goldsource" ]; then # Starbound elif [ "${shortname}" == "sb" ]; then fn_info_config_starbound -# 10: Teamspeak 3 +# Teamspeak 3 elif [ "${shortname}" == "ts3" ]; then fn_info_config_teamspeak3 # Mumble From b28219bb1b823bd15f41817ee67ee8b7d10c52c9 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Wed, 16 Oct 2019 22:41:08 +0100 Subject: [PATCH 190/534] v19.11.0 --- linuxgsm.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/linuxgsm.sh b/linuxgsm.sh index c7f802b6f..d3e762851 100755 --- a/linuxgsm.sh +++ b/linuxgsm.sh @@ -20,7 +20,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="v19.10.2" +version="v19.11.0" shortname="core" gameservername="core" rootdir="$(dirname "$(readlink -f "${BASH_SOURCE[0]}")")" From 586467c5f752f0f46bcc79072b5fd6eb3d9491f2 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Wed, 16 Oct 2019 22:42:05 +0100 Subject: [PATCH 191/534] Update README.md Update README.md Update README.md Update README.md Update README.md --- README.md | 22 ++++++++++------------ 1 file changed, 10 insertions(+), 12 deletions(-) diff --git a/README.md b/README.md index 73d811da3..534ce9d79 100644 --- a/README.md +++ b/README.md @@ -5,15 +5,15 @@ [![LinuxGSM](https://img.shields.io/badge/-LinuxGSM-2b2b2b.svg?logo=data%3Aimage%2Fpng%3Bbase64%2CiVBORw0KGgoAAAANSUhEUgAAACsAAABACAYAAACDbo5ZAAAGD0lEQVR4AcWYa2wUVRvHz75c2vJ2disXoUBEVIioRAx%2BMIFA1IRwUS6KCCiIKBrvhEYiiGm5iBgk8QOGEgUUDYTttmVZWFr2UmwURS6iYAoCtmisElSsdHdbkT7%2BTzoNy%2BGc2dm54C%2F5Rdkz85x%2FZ86ZOXOYXYhIg3Phx%2FA4PAcv6f%2Btg5vhHJjP3EcZsgsshufJHH%2FAJbDztQ7aG35J1vgCXn%2BtgvrgEbLHYei9FmE3kDOUuh10OGwjZ7gEh7kZ9gNyllK3gnrg7%2BQs56DHjbCDyB0GuRF2ArnDeDfCziF3mO1G2FfJHRa4EXYpuUOxG2GXkzuUuBH2TXKH5W6ELSV3eM%2BNsOUk5yQcAY8p2uvgSPitor3MjbB1UOQXOFBvHwpbhPYWOExvL4SNUOQ7p4P2JTlzhOPmCu0vCu1PQpE2WOhk2MdJjk9y7HNwP1wEPUJbAcmZ6WTYrYolnifbxZBiibnFySHQCkUaLdY7C0V4%2FT5OhF1JcuIW6%2B0lOcvsBi2Ezao3j8Ov7Quwj52w60jNKIs1R5GatVaDDoEXSU4D7GSxbidYT3IuwjusFK0mNUVMwaZNNbl%2B%2F87hoVCom0HthaQmnG3QB0lNPcxlCvz%2B0GtlZTuorCxYYlA%2FDzbY%2FnrAgV3hCVLzCDMgEAi9wMMi9IIM%2FUwnNXWwi5mwRaSmmmXA798xq%2F3Khp420VeE1LyS6eQeBhttSXgzywCCToIUCOyYZvKLOWWwkdfd6ORVpGYJM0F5efDe9mEQHGty2BWTmhVGO4PNBmOoKzMBxmo%2FhD25dWvljSbD5hjMkb9gT9lJq63Mzi1bKkbjloc7xBWtwiRrDASCVRi%2FRxA8if%2BvrawMTzYI%2FACpeUv2KFFtDcUyTKilCHcis8G1Ga7wHpLzG8wVFs1K7jaeUKHZfIxmkj9%2FM4S9x9RGiMEudo0QbCVu9Xqn5PWEwLUk5%2FP0iaXac53I0kAH9Sau4m54lo%2FdTMfyekLYKQZ7ub34AbMMlmw5irC2VYTN0fuVMYMf8JHxJ7L7YYXAlSRnI2%2F8RtH4siTsDMz%2BZ5yS15OEXUxyDjGD1%2BvEq8MG16CDzY6JepKwT6geYbzxb0XjGMl7vwGSgzZIwo4nOa1M8Yr9Afb%2Fj8L21%2FsXaeaNZ2A6KTiEASph%2F0vF80cn4tokqu79fzfCUk2vfF4%2FFdFGEjGPHvg2yWrsDG%2F4%2BqpZB8jPOiXjWk0y5iXdM3XhKUvxBTA9UvHuvNPh%2Bzb%2BWj10z6nwuHWBbQFMvNCjKnn7qd1jS%2Fnx9VX3b6jC%2BbwOr5eMe3%2B83IcW4%2F3qgT%2BUTbA9srGaiHsn8AKiF6Ld%2FxF%2FOx6eeAJXabvK78MTTornNMd6XJTVR7%2Fj9bBjhFxV%2FMc1kJOAy2AeA%2FgrV4mFVDZFCqm8rEJ6qysCAWqK9iaztRJRbWXa4moFTELOav7jY%2FqAvoXp0Gc9NX7bIZl17%2FZl0rC1wRLeno0NvP%2B0CTcYNnS8wW6CtzNANaxzKqo9hRNOQ8rGo7tmSsMe2zWdt2frqVRcm5s2fofCgawDNHRNxnyfqgsYez4y4ADCjRM9H73hsNWafILTQdaFiSTj%2BQ%2FxA6yH7d%2BCmR8XbYr0a7VTF2N4siSsb5qdos3R6%2FjGxpULFfw7EfORnbrI9TAToX0sD40%2F2ylcGdh2Rdhg%2BSf2gka9jRTqK9%2BGwgHz7RTfVbHxirDhivdthYUvMRX8aYAD9lstvi%2B0aDL2DUZ0eCBUNNVG0IP65FLTWqPdiqdC0koHTVXe7iyNRG23QotBEy1RbTAzQyrmnYUT2rLsoA13JpcB4eVC2daBM1g2JGLekmwf5On7EJfngfZTNnVSce8bFjaTmQdvs%2FXmO%2FJVpoXdx3RSUe9O00Fj3nUdy0RLgRHiHXOPGW1h2uKZ07c9rG%2Bxyefp23pQeyBIEQoavYlakrG8fnrY5yHn2fbxXzAgw7m8bT5zkkSk4C7cpmOK21esB%2FXAQ5DzFfTo43%2BF%2FDzf0eZ4wZ3MDSjMcvD6nIeOahGgia%2FyU3HforTPkWkwnakdn0cI9jqfbPjD%2FuQLJr6644snlgX%2FApOMoyd1R5%2FxAAAAAElFTkSuQmCC)](https://linuxgsm.com) [![Build Status](https://travis-ci.com/GameServerManagers/LinuxGSM.svg?branch=master)](https://travis-ci.com/GameServerManagers/LinuxGSM) [![Codacy Badge](https://api.codacy.com/project/badge/Grade/3e98be27840043a090c3ab6e35db44b0)](https://app.codacy.com/app/GameServerManagers/LinuxGSM?utm_source=github.com&utm_medium=referral&utm_content=GameServerManagers/LinuxGSM&utm_campaign=Badge_Grade_Dashboard) [![Discord](https://discordapp.com/api/guilds/127498813903601664/widget.png?style=shield)](https://linuxgsm.com/discord) [![MIT Licence](https://badges.frapsoft.com/os/mit/mit.svg?v=103)](https://github.com/GameServerManagers/LinuxGSM/blob/master/LICENSE) [![made-with-bash](https://img.shields.io/badge/-Made%20with%20Bash-1f425f.svg?logo=image%2Fpng%3Bbase64%2CiVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyZpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw%2FeHBhY2tldCBiZWdpbj0i77u%2FIiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8%2BIDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNi1jMTExIDc5LjE1ODMyNSwgMjAxNS8wOS8xMC0wMToxMDoyMCAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENDIDIwMTUgKFdpbmRvd3MpIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOkE3MDg2QTAyQUZCMzExRTVBMkQxRDMzMkJDMUQ4RDk3IiB4bXBNTTpEb2N1bWVudElEPSJ4bXAuZGlkOkE3MDg2QTAzQUZCMzExRTVBMkQxRDMzMkJDMUQ4RDk3Ij4gPHhtcE1NOkRlcml2ZWRGcm9tIHN0UmVmOmluc3RhbmNlSUQ9InhtcC5paWQ6QTcwODZBMDBBRkIzMTFFNUEyRDFEMzMyQkMxRDhEOTciIHN0UmVmOmRvY3VtZW50SUQ9InhtcC5kaWQ6QTcwODZBMDFBRkIzMTFFNUEyRDFEMzMyQkMxRDhEOTciLz4gPC9yZGY6RGVzY3JpcHRpb24%2BIDwvcmRmOlJERj4gPC94OnhtcG1ldGE%2BIDw%2FeHBhY2tldCBlbmQ9InIiPz6lm45hAAADkklEQVR42qyVa0yTVxzGn7d9Wy03MS2ii8s%2BeokYNQSVhCzOjXZOFNF4jx%2BMRmPUMEUEqVG36jo2thizLSQSMd4N8ZoQ8RKjJtooaCpK6ZoCtRXKpRempbTv5ey83bhkAUphz8fznvP8znn%2B%2F3NeEEJgNBoRRSmz0ub%2FfuxEacBg%2FDmYtiCjgo5NG2mBXq%2BH5I1ogMRk9Zbd%2BQU2e1ML6VPLOyf5tvBQ8yT1lG10imxsABm7SLs898GTpyYynEzP60hO3trHDKvMigUwdeaceacqzp7nOI4n0SSIIjl36ao4Z356OV07fSQAk6xJ3XGg%2BLCr1d1OYlVHp4eUHPnerU79ZA%2F1kuv1JQMAg%2BE4O2P23EumF3VkvHprsZKMzKwbRUXFEyTvSIEmTVbrysp%2BWr8wfQHGK6WChVa3bKUmdWou%2BjpArdGkzZ41c1zG%2Fu5uGH4swzd561F%2BuhIT4%2BLnSuPsv9%2BJKIpjNr9dXYOyk7%2FBZrcjIT4eCnoKgedJP4BEqhG77E3NKP31FO7cfQA5K0dSYuLgz2TwCWJSOBzG6crzKK%2BohNfni%2Bx6OMUMMNe%2Fgf7ocbw0v0acKg6J8Ql0q%2BT%2FAXR5PNi5dz9c71upuQqCKFAD%2BYhrZLEAmpodaHO3Qy6TI3NhBpbrshGtOWKOSMYwYGQM8nJzoFJNxP2HjyIQho4PewK6hBktoDcUwtIln4PjOWzflQ%2Be5yl0yCCYgYikTclGlxadio%2BBQCSiW1UXoVGrKYwH4RgMrjU1HAB4vR6LzWYfFUCKxfS8Ftk5qxHoCUQAUkRJaSEokkV6Y%2F%2BJUOC4hn6A39NVXVBYeNP8piH6HeA4fPbpdBQV5KOx0QaL1YppX3Jgk0TwH2Vg6S3u%2BdB91%2B%2FpuNYPYFl5uP5V7ZqvsrX7jxqMXR6ff3gCQSTzFI0a1TX3wIs8ul%2Bq4HuWAAiM39vhOuR1O1fQ2gT%2F26Z8Z5vrl2OHi9OXZn995nLV9aFfS6UC9JeJPfuK0NBohWpCHMSAAsFe74WWP%2BvT25wtP9Bpob6uGqqyDnOtaeumjRu%2ByFu36VntK%2FPA5umTJeUtPWZSU9BCgud661odVp3DZtkc7AnYR33RRC708PrVi1larW7XwZIjLnd7R6SgSqWSNjU1B3F72pz5TZbXmX5vV81Yb7Lg7XT%2FUXriu8XLVqw6c6XqWnBKiiYU%2BMt3wWF7u7i91XlSEITwSAZ%2FCzAAHsJVbwXYFFEAAAAASUVORK5CYII%3D)](https://www.gnu.org/software/bash/) [![All Contributors](https://img.shields.io/badge/all_contributors-9-orange.svg?style=flat-square)](#contributors) -[LinuxGSM](https://linuxgsm.com) is the command line tool for quick, simple deployment and management of dedicated game servers. +[LinuxGSM](https://linuxgsm.com) command-line tool for quick, simple deployment and management of Linux dedicated game servers. ## Hassle-Free Dedicated Game Servers -Traditionally game servers 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 as simple as possible allowing admins to spend less time on management and more time gaming. +Traditionally game servers are not easy to manage yourself. Admins often have to spend hours messing around trying to get their server working. LinuxGSM is a command-line tool designed to be as simple as possible, allowing admins to spend less time on management and more time gaming. ## Main features -80+ game servers supported +100+ game servers supported * :truck: Installer * :mag: Monitor @@ -25,23 +25,21 @@ Traditionally game servers are not easy to manage yourself. Admins often have to ## :penguin: Compatibility -Linux Game Server Managers are tested to work on the following Linux distros. +LinuxGSM will run on popular distros as long as the minimum requirements are met. -* Debian based (Ubuntu, Mint etc.) -* Red Hat based (CentOS, Fedora etc.) +* Ubuntu +* Debian +* CentOS Other distros are likely to work but are not fully tested. ## :wrench: Requirements -Each game server has its own specific dependency requirements, but most require GLIBC and Tmux. Visit the specific game server installation page on the [LinuxGSM](https://linuxgsm.com) website to see dependencies. - -* [GLIBC](https://docs.linuxgsm.com/requirements/glibc) >= 2.15 recommended [[specific requirements]](https://docs.linuxgsm.com/requirements/glibc#server-requirements) -* [Tmux](https://docs.linuxgsm.com/requirements/tmux) >= 1.6 recommended (Avoid Tmux 1.8) +Each game server has its own specific dependency requirements. Visit a specific game server installation page on the [LinuxGSM](https://linuxgsm.com) website to check dependency requirements for the game server you want to install. ## :blue_book: Documentation -Documentation is found at [linuxgsm.com](https://linuxgsm.com) and [docs.linuxgsm.com](https://docs.linuxgsm.com) +Documentation is found at [linuxgsm.com](https://linuxgsm.com) and [docs.linuxgsm.com](https://docs.linuxgsm.com). ## :question: Support @@ -49,7 +47,7 @@ There are a various ways to get support, check out the [support](https://linuxgs ## :heart: Donate -If you would like to [donate](https://linuxgsm.com/donate) to the project there are several ways you can, via [PayPal](https://www.paypal.me/dgibbs64), [Patreon](https://www.patreon.com/dgibbs) and [Flattr](https://flattr.com/@dgibbs). I would like to thank everyone who has previously sent a donation. LinuxGSM has been going since 2012 and I have spent 1000s of hours developing and improving the project and continue to regularly add support for new servers. +If you would like to [donate](https://linuxgsm.com/donate) to the project there are several ways you can, via [Patreon](https://www.patreon.com/dgibbs), [Ko-Fi](https://ko-fi.com/dgibbs) and [PayPal](https://www.paypal.me/dgibbs64). I would like to thank everyone who has previously sent a donation. Since 2012 LinuxGSM has been steadily growing with new servers, features and improvements added regularly. ## Contributors From 82578561637999abbd7e530cdcfade1ba7fa446c Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Wed, 16 Oct 2019 22:59:32 +0100 Subject: [PATCH 192/534] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 534ce9d79..6c32bab75 100644 --- a/README.md +++ b/README.md @@ -5,7 +5,7 @@ [![LinuxGSM](https://img.shields.io/badge/-LinuxGSM-2b2b2b.svg?logo=data%3Aimage%2Fpng%3Bbase64%2CiVBORw0KGgoAAAANSUhEUgAAACsAAABACAYAAACDbo5ZAAAGD0lEQVR4AcWYa2wUVRvHz75c2vJ2disXoUBEVIioRAx%2BMIFA1IRwUS6KCCiIKBrvhEYiiGm5iBgk8QOGEgUUDYTttmVZWFr2UmwURS6iYAoCtmisElSsdHdbkT7%2BTzoNy%2BGc2dm54C%2F5Rdkz85x%2FZ86ZOXOYXYhIg3Phx%2FA4PAcv6f%2Btg5vhHJjP3EcZsgsshufJHH%2FAJbDztQ7aG35J1vgCXn%2BtgvrgEbLHYei9FmE3kDOUuh10OGwjZ7gEh7kZ9gNyllK3gnrg7%2BQs56DHjbCDyB0GuRF2ArnDeDfCziF3mO1G2FfJHRa4EXYpuUOxG2GXkzuUuBH2TXKH5W6ELSV3eM%2BNsOUk5yQcAY8p2uvgSPitor3MjbB1UOQXOFBvHwpbhPYWOExvL4SNUOQ7p4P2JTlzhOPmCu0vCu1PQpE2WOhk2MdJjk9y7HNwP1wEPUJbAcmZ6WTYrYolnifbxZBiibnFySHQCkUaLdY7C0V4%2FT5OhF1JcuIW6%2B0lOcvsBi2Ezao3j8Ov7Quwj52w60jNKIs1R5GatVaDDoEXSU4D7GSxbidYT3IuwjusFK0mNUVMwaZNNbl%2B%2F87hoVCom0HthaQmnG3QB0lNPcxlCvz%2B0GtlZTuorCxYYlA%2FDzbY%2FnrAgV3hCVLzCDMgEAi9wMMi9IIM%2FUwnNXWwi5mwRaSmmmXA798xq%2F3Khp420VeE1LyS6eQeBhttSXgzywCCToIUCOyYZvKLOWWwkdfd6ORVpGYJM0F5efDe9mEQHGty2BWTmhVGO4PNBmOoKzMBxmo%2FhD25dWvljSbD5hjMkb9gT9lJq63Mzi1bKkbjloc7xBWtwiRrDASCVRi%2FRxA8if%2BvrawMTzYI%2FACpeUv2KFFtDcUyTKilCHcis8G1Ga7wHpLzG8wVFs1K7jaeUKHZfIxmkj9%2FM4S9x9RGiMEudo0QbCVu9Xqn5PWEwLUk5%2FP0iaXac53I0kAH9Sau4m54lo%2FdTMfyekLYKQZ7ub34AbMMlmw5irC2VYTN0fuVMYMf8JHxJ7L7YYXAlSRnI2%2F8RtH4siTsDMz%2BZ5yS15OEXUxyDjGD1%2BvEq8MG16CDzY6JepKwT6geYbzxb0XjGMl7vwGSgzZIwo4nOa1M8Yr9Afb%2Fj8L21%2FsXaeaNZ2A6KTiEASph%2F0vF80cn4tokqu79fzfCUk2vfF4%2FFdFGEjGPHvg2yWrsDG%2F4%2BqpZB8jPOiXjWk0y5iXdM3XhKUvxBTA9UvHuvNPh%2Bzb%2BWj10z6nwuHWBbQFMvNCjKnn7qd1jS%2Fnx9VX3b6jC%2BbwOr5eMe3%2B83IcW4%2F3qgT%2BUTbA9srGaiHsn8AKiF6Ld%2FxF%2FOx6eeAJXabvK78MTTornNMd6XJTVR7%2Fj9bBjhFxV%2FMc1kJOAy2AeA%2FgrV4mFVDZFCqm8rEJ6qysCAWqK9iaztRJRbWXa4moFTELOav7jY%2FqAvoXp0Gc9NX7bIZl17%2FZl0rC1wRLeno0NvP%2B0CTcYNnS8wW6CtzNANaxzKqo9hRNOQ8rGo7tmSsMe2zWdt2frqVRcm5s2fofCgawDNHRNxnyfqgsYez4y4ADCjRM9H73hsNWafILTQdaFiSTj%2BQ%2FxA6yH7d%2BCmR8XbYr0a7VTF2N4siSsb5qdos3R6%2FjGxpULFfw7EfORnbrI9TAToX0sD40%2F2ylcGdh2Rdhg%2BSf2gka9jRTqK9%2BGwgHz7RTfVbHxirDhivdthYUvMRX8aYAD9lstvi%2B0aDL2DUZ0eCBUNNVG0IP65FLTWqPdiqdC0koHTVXe7iyNRG23QotBEy1RbTAzQyrmnYUT2rLsoA13JpcB4eVC2daBM1g2JGLekmwf5On7EJfngfZTNnVSce8bFjaTmQdvs%2FXmO%2FJVpoXdx3RSUe9O00Fj3nUdy0RLgRHiHXOPGW1h2uKZ07c9rG%2Bxyefp23pQeyBIEQoavYlakrG8fnrY5yHn2fbxXzAgw7m8bT5zkkSk4C7cpmOK21esB%2FXAQ5DzFfTo43%2BF%2FDzf0eZ4wZ3MDSjMcvD6nIeOahGgia%2FyU3HforTPkWkwnakdn0cI9jqfbPjD%2FuQLJr6644snlgX%2FApOMoyd1R5%2FxAAAAAElFTkSuQmCC)](https://linuxgsm.com) [![Build Status](https://travis-ci.com/GameServerManagers/LinuxGSM.svg?branch=master)](https://travis-ci.com/GameServerManagers/LinuxGSM) [![Codacy Badge](https://api.codacy.com/project/badge/Grade/3e98be27840043a090c3ab6e35db44b0)](https://app.codacy.com/app/GameServerManagers/LinuxGSM?utm_source=github.com&utm_medium=referral&utm_content=GameServerManagers/LinuxGSM&utm_campaign=Badge_Grade_Dashboard) [![Discord](https://discordapp.com/api/guilds/127498813903601664/widget.png?style=shield)](https://linuxgsm.com/discord) [![MIT Licence](https://badges.frapsoft.com/os/mit/mit.svg?v=103)](https://github.com/GameServerManagers/LinuxGSM/blob/master/LICENSE) [![made-with-bash](https://img.shields.io/badge/-Made%20with%20Bash-1f425f.svg?logo=image%2Fpng%3Bbase64%2CiVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyZpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw%2FeHBhY2tldCBiZWdpbj0i77u%2FIiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8%2BIDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNi1jMTExIDc5LjE1ODMyNSwgMjAxNS8wOS8xMC0wMToxMDoyMCAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENDIDIwMTUgKFdpbmRvd3MpIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOkE3MDg2QTAyQUZCMzExRTVBMkQxRDMzMkJDMUQ4RDk3IiB4bXBNTTpEb2N1bWVudElEPSJ4bXAuZGlkOkE3MDg2QTAzQUZCMzExRTVBMkQxRDMzMkJDMUQ4RDk3Ij4gPHhtcE1NOkRlcml2ZWRGcm9tIHN0UmVmOmluc3RhbmNlSUQ9InhtcC5paWQ6QTcwODZBMDBBRkIzMTFFNUEyRDFEMzMyQkMxRDhEOTciIHN0UmVmOmRvY3VtZW50SUQ9InhtcC5kaWQ6QTcwODZBMDFBRkIzMTFFNUEyRDFEMzMyQkMxRDhEOTciLz4gPC9yZGY6RGVzY3JpcHRpb24%2BIDwvcmRmOlJERj4gPC94OnhtcG1ldGE%2BIDw%2FeHBhY2tldCBlbmQ9InIiPz6lm45hAAADkklEQVR42qyVa0yTVxzGn7d9Wy03MS2ii8s%2BeokYNQSVhCzOjXZOFNF4jx%2BMRmPUMEUEqVG36jo2thizLSQSMd4N8ZoQ8RKjJtooaCpK6ZoCtRXKpRempbTv5ey83bhkAUphz8fznvP8znn%2B%2F3NeEEJgNBoRRSmz0ub%2FfuxEacBg%2FDmYtiCjgo5NG2mBXq%2BH5I1ogMRk9Zbd%2BQU2e1ML6VPLOyf5tvBQ8yT1lG10imxsABm7SLs898GTpyYynEzP60hO3trHDKvMigUwdeaceacqzp7nOI4n0SSIIjl36ao4Z356OV07fSQAk6xJ3XGg%2BLCr1d1OYlVHp4eUHPnerU79ZA%2F1kuv1JQMAg%2BE4O2P23EumF3VkvHprsZKMzKwbRUXFEyTvSIEmTVbrysp%2BWr8wfQHGK6WChVa3bKUmdWou%2BjpArdGkzZ41c1zG%2Fu5uGH4swzd561F%2BuhIT4%2BLnSuPsv9%2BJKIpjNr9dXYOyk7%2FBZrcjIT4eCnoKgedJP4BEqhG77E3NKP31FO7cfQA5K0dSYuLgz2TwCWJSOBzG6crzKK%2BohNfni%2Bx6OMUMMNe%2Fgf7ocbw0v0acKg6J8Ql0q%2BT%2FAXR5PNi5dz9c71upuQqCKFAD%2BYhrZLEAmpodaHO3Qy6TI3NhBpbrshGtOWKOSMYwYGQM8nJzoFJNxP2HjyIQho4PewK6hBktoDcUwtIln4PjOWzflQ%2Be5yl0yCCYgYikTclGlxadio%2BBQCSiW1UXoVGrKYwH4RgMrjU1HAB4vR6LzWYfFUCKxfS8Ftk5qxHoCUQAUkRJaSEokkV6Y%2F%2BJUOC4hn6A39NVXVBYeNP8piH6HeA4fPbpdBQV5KOx0QaL1YppX3Jgk0TwH2Vg6S3u%2BdB91%2B%2FpuNYPYFl5uP5V7ZqvsrX7jxqMXR6ff3gCQSTzFI0a1TX3wIs8ul%2Bq4HuWAAiM39vhOuR1O1fQ2gT%2F26Z8Z5vrl2OHi9OXZn995nLV9aFfS6UC9JeJPfuK0NBohWpCHMSAAsFe74WWP%2BvT25wtP9Bpob6uGqqyDnOtaeumjRu%2ByFu36VntK%2FPA5umTJeUtPWZSU9BCgud661odVp3DZtkc7AnYR33RRC708PrVi1larW7XwZIjLnd7R6SgSqWSNjU1B3F72pz5TZbXmX5vV81Yb7Lg7XT%2FUXriu8XLVqw6c6XqWnBKiiYU%2BMt3wWF7u7i91XlSEITwSAZ%2FCzAAHsJVbwXYFFEAAAAASUVORK5CYII%3D)](https://www.gnu.org/software/bash/) [![All Contributors](https://img.shields.io/badge/all_contributors-9-orange.svg?style=flat-square)](#contributors) -[LinuxGSM](https://linuxgsm.com) command-line tool for quick, simple deployment and management of Linux dedicated game servers. +[LinuxGSM](https://linuxgsm.com) is the command-line tool for quick, simple deployment and management of Linux dedicated game servers. ## Hassle-Free Dedicated Game Servers From 15bd3106f1f4cfa6b42419bb60db4aa7b47415cd Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Sat, 19 Oct 2019 13:26:52 +0100 Subject: [PATCH 193/534] changes to integrate ts3 with tmux --- .../config-lgsm/ts3server/_default.cfg | 2 +- lgsm/functions/check_deps.sh | 25 ++++++++----------- 2 files changed, 11 insertions(+), 16 deletions(-) diff --git a/lgsm/config-default/config-lgsm/ts3server/_default.cfg b/lgsm/config-default/config-lgsm/ts3server/_default.cfg index 54f70adb0..ab081ccbd 100644 --- a/lgsm/config-default/config-lgsm/ts3server/_default.cfg +++ b/lgsm/config-default/config-lgsm/ts3server/_default.cfg @@ -115,7 +115,7 @@ glibc="2.17" ## Server Specific Directories systemdir="${serverfiles}" executabledir="${serverfiles}" -executable="./ts3server_startscript.sh" +executable="./ts3server_minimal_runscript.sh" servercfg="${servicename}.ini" servercfgdefault="ts3server.ini" servercfgdir="${serverfiles}" diff --git a/lgsm/functions/check_deps.sh b/lgsm/functions/check_deps.sh index 4f2bc5892..91f131509 100644 --- a/lgsm/functions/check_deps.sh +++ b/lgsm/functions/check_deps.sh @@ -337,13 +337,10 @@ fn_deps_build_debian(){ # LinuxGSM requirements. array_deps_required=( curl wget ca-certificates file bsdmainutils util-linux python3 tar bzip2 gzip unzip binutils bc jq ) - # All servers except ts3 require tmux. - if [ "${shortname}" != "ts3" ]; then - if [ "$(command -v tmux 2>/dev/null)" ]; then - tmuxcheck=1 # Added for users compiling tmux from source to bypass check. - else - array_deps_required+=( tmux ) - fi + if [ "$(command -v tmux 2>/dev/null)" ]; then + tmuxcheck=1 # Added for users compiling tmux from source to bypass check. + else + array_deps_required+=( tmux ) fi # All servers except ts3, mumble, GTA and minecraft servers require libstdc++6 and lib32gcc1. @@ -400,7 +397,7 @@ fn_deps_build_debian(){ else array_deps_required+=( openjdk-8-jre-headless ) fi - # Medal of Honor: Allied Assault + # Medal of Honor: Allied Assault elif [ "${shortname}" == "mohaa" ]; then array_deps_required+=( libstdc++5:i386 ) # Project Zomboid @@ -467,13 +464,11 @@ fn_deps_build_redhat(){ fi # All servers except ts3 require tmux. - if [ "${shortname}" != "ts3" ]; then - if [ "$(command -v tmux 2>/dev/null)" ]; then - # Added for users compiling tmux from source to bypass check. - tmuxcheck=1 - else - array_deps_required+=( tmux ) - fi + if [ "$(command -v tmux 2>/dev/null)" ]; then + # Added for users compiling tmux from source to bypass check. + tmuxcheck=1 + else + array_deps_required+=( tmux ) fi # All servers except ts3, mumble, multi theft auto and minecraft servers require glibc.i686 and libstdc++.i686. From e8f4621cc0a31c2fd7948a022493acc8f148bace Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Sat, 19 Oct 2019 13:29:27 +0100 Subject: [PATCH 194/534] ts3 tmux getopt --- lgsm/functions/core_getopt.sh | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/lgsm/functions/core_getopt.sh b/lgsm/functions/core_getopt.sh index d45072862..668089f16 100644 --- a/lgsm/functions/core_getopt.sh +++ b/lgsm/functions/core_getopt.sh @@ -77,10 +77,7 @@ fi #Backup. currentopt+=( "${cmd_backup[@]}" ) -# Exclude games without a console. -if [ "${shortname}" != "ts3" ]; then - currentopt+=( "${cmd_console[@]}" "${cmd_debug[@]}" ) -fi +currentopt+=( "${cmd_console[@]}" "${cmd_debug[@]}" ) ## Game server exclusive commands. From 03de2ca2eba3a1ea7a8348c8b2d932486c50a5c2 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Sat, 19 Oct 2019 13:31:13 +0100 Subject: [PATCH 195/534] comments --- lgsm/functions/core_getopt.sh | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/lgsm/functions/core_getopt.sh b/lgsm/functions/core_getopt.sh index 668089f16..25890b3d5 100644 --- a/lgsm/functions/core_getopt.sh +++ b/lgsm/functions/core_getopt.sh @@ -74,9 +74,10 @@ if [ -n "${appid}" ]; then currentopt+=( "${cmd_validate[@]}" ) fi -#Backup. +# Backup. currentopt+=( "${cmd_backup[@]}" ) +# Console & Debug currentopt+=( "${cmd_console[@]}" "${cmd_debug[@]}" ) ## Game server exclusive commands. From a8ebcc5266dd1a50c61808035ea574c708f3e4a1 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Sat, 19 Oct 2019 14:06:32 +0100 Subject: [PATCH 196/534] test --- lgsm/config-default/config-lgsm/ts3server/_default.cfg | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/lgsm/config-default/config-lgsm/ts3server/_default.cfg b/lgsm/config-default/config-lgsm/ts3server/_default.cfg index ab081ccbd..7fe7111bc 100644 --- a/lgsm/config-default/config-lgsm/ts3server/_default.cfg +++ b/lgsm/config-default/config-lgsm/ts3server/_default.cfg @@ -11,6 +11,11 @@ #### LinuxGSM Settings #### +## Server Start Command | https://docs.linuxgsm.com/configuration/start-parameters#additional-parameters +fn_parms(){ +parms="inifile=${servercfgfullpath} pid_file=ts3server.pid" +} + ## Notification Alerts # (on|off) @@ -115,7 +120,7 @@ glibc="2.17" ## Server Specific Directories systemdir="${serverfiles}" executabledir="${serverfiles}" -executable="./ts3server_minimal_runscript.sh" +executable="./ts3server" servercfg="${servicename}.ini" servercfgdefault="ts3server.ini" servercfgdir="${serverfiles}" From 88825ac7a29f88a639676942c061dce22291448d Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Sat, 19 Oct 2019 14:16:12 +0100 Subject: [PATCH 197/534] ts3 start --- lgsm/functions/command_start.sh | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/lgsm/functions/command_start.sh b/lgsm/functions/command_start.sh index dac7aa2c3..4b61c3d90 100644 --- a/lgsm/functions/command_start.sh +++ b/lgsm/functions/command_start.sh @@ -210,9 +210,5 @@ if [ "${updateonstart}" == "yes" ]||[ "${updateonstart}" == "1" ]||[ "${updateon command_update.sh fi -if [ "${shortname}" == "ts3" ]; then - fn_start_teamspeak3 -else - fn_start_tmux -fi +fn_start_tmux core_exit.sh From c361bfb9f0190aabb2a6169df3d318c1590b59c0 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Sat, 19 Oct 2019 14:18:29 +0100 Subject: [PATCH 198/534] changed stop mode --- lgsm/config-default/config-lgsm/ts3server/_default.cfg | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lgsm/config-default/config-lgsm/ts3server/_default.cfg b/lgsm/config-default/config-lgsm/ts3server/_default.cfg index 7fe7111bc..6e0a4f8a6 100644 --- a/lgsm/config-default/config-lgsm/ts3server/_default.cfg +++ b/lgsm/config-default/config-lgsm/ts3server/_default.cfg @@ -105,7 +105,7 @@ sleeptime="0.5" # 8: 7 Days to Die # 9: Gold Source # 10: Teamspeak 3 -stopmode="10" +stopmode="2" ## LinuxGSM Server Details # Do not edit From 31db555ecb4b901bd497fb78631720eb2982b3cc Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Sat, 19 Oct 2019 14:25:13 +0100 Subject: [PATCH 199/534] changes to stop start --- lgsm/functions/command_start.sh | 8 ++++++-- lgsm/functions/command_stop.sh | 18 ------------------ 2 files changed, 6 insertions(+), 20 deletions(-) diff --git a/lgsm/functions/command_start.sh b/lgsm/functions/command_start.sh index 4b61c3d90..397c4eee2 100644 --- a/lgsm/functions/command_start.sh +++ b/lgsm/functions/command_start.sh @@ -39,7 +39,7 @@ fn_start_teamspeak3(){ 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 + fn_start_tmux fi fn_sleep_time check_status.sh @@ -210,5 +210,9 @@ if [ "${updateonstart}" == "yes" ]||[ "${updateonstart}" == "1" ]||[ "${updateon command_update.sh fi -fn_start_tmux +if [ "${shortname}" == "ts3" ]; then + fn_start_teamspeak3 +else + fn_start_tmux +fi core_exit.sh diff --git a/lgsm/functions/command_stop.sh b/lgsm/functions/command_stop.sh index 01cce6a4a..869e19761 100644 --- a/lgsm/functions/command_stop.sh +++ b/lgsm/functions/command_stop.sh @@ -200,22 +200,6 @@ fn_stop_graceful_select(){ fn_stop_graceful_sdtd elif [ "${stopmode}" == "9" ]; then fn_stop_graceful_goldsource - elif [ "${stopmode}" == "10" ]; then - fn_stop_teamspeak3 - fi -} - -fn_stop_teamspeak3(){ - fn_print_dots "${servername}" - "${serverfiles}"/ts3server_startscript.sh stop > /dev/null 2>&1 - check_status.sh - if [ "${status}" == "0" ]; then - rm -f "${rootdir}/${lockselfname}" - fn_print_ok_nl "${servername}" - fn_script_log_pass "Stopped ${servername}" - else - fn_print_fail_nl "Unable to stop ${servername}" - fn_script_log_error "Unable to stop ${servername}" fi } @@ -240,8 +224,6 @@ fn_stop_pre_check(){ if [ "${status}" == "0" ]; then fn_print_info_nl "${servername} is already stopped" fn_script_log_error "${servername} is already stopped" - elif [ "${shortname}" == "ts3" ]; then - fn_stop_teamspeak3 else # Select graceful shutdown. fn_stop_graceful_select From 4297954885401edb30fdb8c8a42b5f04f6d43df9 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Sat, 19 Oct 2019 14:27:13 +0100 Subject: [PATCH 200/534] add consolelog --- lgsm/config-default/config-lgsm/ts3server/_default.cfg | 1 + 1 file changed, 1 insertion(+) diff --git a/lgsm/config-default/config-lgsm/ts3server/_default.cfg b/lgsm/config-default/config-lgsm/ts3server/_default.cfg index 6e0a4f8a6..3201314b9 100644 --- a/lgsm/config-default/config-lgsm/ts3server/_default.cfg +++ b/lgsm/config-default/config-lgsm/ts3server/_default.cfg @@ -134,6 +134,7 @@ logdir="${rootdir}/log" gamelogdir="${serverfiles}/logs" lgsmlogdir="${logdir}/script" lgsmlog="${lgsmlogdir}/${servicename}-script.log" +consolelog="${consolelogdir}/${servicename}-console.log" alertlog="${lgsmlogdir}/${servicename}-alert.log" postdetailslog="${lgsmlogdir}/${servicename}-postdetails.log" From 06a7743dcdeac05caa3649d1da0e58af98b2d764 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Sat, 19 Oct 2019 23:46:55 +0100 Subject: [PATCH 201/534] added missing consolelogdir --- lgsm/config-default/config-lgsm/ts3server/_default.cfg | 1 + 1 file changed, 1 insertion(+) diff --git a/lgsm/config-default/config-lgsm/ts3server/_default.cfg b/lgsm/config-default/config-lgsm/ts3server/_default.cfg index 3201314b9..4b3ca814d 100644 --- a/lgsm/config-default/config-lgsm/ts3server/_default.cfg +++ b/lgsm/config-default/config-lgsm/ts3server/_default.cfg @@ -133,6 +133,7 @@ backupdir="${lgsmdir}/backup" logdir="${rootdir}/log" gamelogdir="${serverfiles}/logs" lgsmlogdir="${logdir}/script" +consolelogdir="${logdir}/console" lgsmlog="${lgsmlogdir}/${servicename}-script.log" consolelog="${consolelogdir}/${servicename}-console.log" alertlog="${lgsmlogdir}/${servicename}-alert.log" From 414658410ca9382c543fc1c68bebfc554c899180 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Sat, 19 Oct 2019 23:49:37 +0100 Subject: [PATCH 202/534] removed ts3 if --- lgsm/functions/info_distro.sh | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/lgsm/functions/info_distro.sh b/lgsm/functions/info_distro.sh index c7bf38a28..aee166272 100644 --- a/lgsm/functions/info_distro.sh +++ b/lgsm/functions/info_distro.sh @@ -9,9 +9,7 @@ local function_selfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" ### Game Server pid if [ "${status}" == "1" ]; then - if [ "${shortname}" != "ts3" ]; then - gameserverpid=$(tmux list-sessions -F "#{session_name} #{pane_pid}"| grep "^${servicename}"|awk '{print $2}') - fi + gameserverpid=$(tmux list-sessions -F "#{session_name} #{pane_pid}"| grep "^${servicename}"|awk '{print $2}') fi ### Distro information From 623a87e70bd6f24dd4f788cf5f14cf95a37c4b61 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Sat, 19 Oct 2019 23:54:45 +0100 Subject: [PATCH 203/534] change password --- lgsm/functions/command_start.sh | 6 +----- lgsm/functions/command_ts3_server_pass.sh | 3 ++- 2 files changed, 3 insertions(+), 6 deletions(-) diff --git a/lgsm/functions/command_start.sh b/lgsm/functions/command_start.sh index 397c4eee2..55bbfd414 100644 --- a/lgsm/functions/command_start.sh +++ b/lgsm/functions/command_start.sh @@ -36,11 +36,7 @@ fn_start_teamspeak3(){ install_eula.sh fi cd "${executabledir}" || exit - if [ "${ts3serverpass}" == "1" ]; then - ./ts3server_startscript.sh start serveradmin_password="${newpassword}" inifile="${servercfgfullpath}" > /dev/null 2>&1 - else - fn_start_tmux - fi + fn_start_tmux fn_sleep_time check_status.sh if [ "${status}" == "0" ]; then diff --git a/lgsm/functions/command_ts3_server_pass.sh b/lgsm/functions/command_ts3_server_pass.sh index d05dfdfc5..240b7c454 100644 --- a/lgsm/functions/command_ts3_server_pass.sh +++ b/lgsm/functions/command_ts3_server_pass.sh @@ -42,7 +42,8 @@ if [ "${status}" != "0" ]; then exitbypass="1" command_stop.sh fn_serveradmin_password_set - ts3serverpass="0" + parms="inifile=${servercfgfullpath} pid_file=ts3server.pid" +W ts3serverpass="0" fn_print_info_nl "Restarting server normally" fn_script_log_info "Restarting server normally" command_restart.sh From 1291bfd98bcb64588420a0c0b5edd9891dc4af93 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Sun, 20 Oct 2019 00:00:44 +0100 Subject: [PATCH 204/534] ts3 if --- lgsm/functions/check_logs.sh | 2 +- lgsm/functions/command_postdetails.sh | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/lgsm/functions/check_logs.sh b/lgsm/functions/check_logs.sh index 9f3e87427..61a8f2833 100644 --- a/lgsm/functions/check_logs.sh +++ b/lgsm/functions/check_logs.sh @@ -15,7 +15,7 @@ fn_check_logs(){ } # Create directories for the script and console logs. -if [ ! -d "${lgsmlogdir}" ]||[ ! -d "${consolelogdir}" ]&&[ "${shortname}" != "ts3" ]; then +if [ ! -d "${lgsmlogdir}" ]||[ ! -d "${consolelogdir}" ]; then fn_check_logs fi diff --git a/lgsm/functions/command_postdetails.sh b/lgsm/functions/command_postdetails.sh index 9ce9920a4..4bede0eb2 100644 --- a/lgsm/functions/command_postdetails.sh +++ b/lgsm/functions/command_postdetails.sh @@ -67,7 +67,7 @@ else fn_info_message_script fn_info_message_backup # Some game servers do not have parms. - if [ "${shortname}" != "ts3" ]&&[ "${shortname}" != "jc2" ]&&[ "${shortname}" != "jc3" ]&&[ "${shortname}" != "dst" ]&&[ "${shortname}" != "pz" ]&&[ "${engine}" != "renderware" ]; then + if [ "${shortname}" != "jc2" ]&&[ "${shortname}" != "jc3" ]&&[ "${shortname}" != "dst" ]&&[ "${shortname}" != "pz" ]&&[ "${engine}" != "renderware" ]; then fn_parms fn_info_message_commandlineparms fi From de5c747e9171237e580bd51883a704e335f7b562 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Sun, 20 Oct 2019 00:03:46 +0100 Subject: [PATCH 205/534] consoellogdate --- lgsm/config-default/config-lgsm/ts3server/_default.cfg | 1 + 1 file changed, 1 insertion(+) diff --git a/lgsm/config-default/config-lgsm/ts3server/_default.cfg b/lgsm/config-default/config-lgsm/ts3server/_default.cfg index 4b3ca814d..1cf740167 100644 --- a/lgsm/config-default/config-lgsm/ts3server/_default.cfg +++ b/lgsm/config-default/config-lgsm/ts3server/_default.cfg @@ -141,3 +141,4 @@ postdetailslog="${lgsmlogdir}/${servicename}-postdetails.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" From 899da8808a057f6b0abcf8a466bf8632070bc6f0 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Sun, 20 Oct 2019 00:13:46 +0100 Subject: [PATCH 206/534] bug --- lgsm/functions/command_ts3_server_pass.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lgsm/functions/command_ts3_server_pass.sh b/lgsm/functions/command_ts3_server_pass.sh index 240b7c454..851738dd3 100644 --- a/lgsm/functions/command_ts3_server_pass.sh +++ b/lgsm/functions/command_ts3_server_pass.sh @@ -23,7 +23,7 @@ fn_serveradmin_password_prompt(){ } fn_serveradmin_password_set(){ - fn_print_info_nl "Starting server with new password..." + fn_print_info_nl "Starting server with new password" fn_script_log_info "Starting server with new password" # Start server in "new password mode". ts3serverpass="1" @@ -43,7 +43,7 @@ if [ "${status}" != "0" ]; then command_stop.sh fn_serveradmin_password_set parms="inifile=${servercfgfullpath} pid_file=ts3server.pid" -W ts3serverpass="0" + ts3serverpass="0" fn_print_info_nl "Restarting server normally" fn_script_log_info "Restarting server normally" command_restart.sh From 2e4bff7922952b75008bdcc4d792782654f938bc Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Sun, 20 Oct 2019 00:17:13 +0100 Subject: [PATCH 207/534] ui --- lgsm/functions/command_ts3_server_pass.sh | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/lgsm/functions/command_ts3_server_pass.sh b/lgsm/functions/command_ts3_server_pass.sh index 851738dd3..b107967f1 100644 --- a/lgsm/functions/command_ts3_server_pass.sh +++ b/lgsm/functions/command_ts3_server_pass.sh @@ -11,7 +11,6 @@ local function_selfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" fn_serveradmin_password_prompt(){ fn_print_header - echo -e "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." echo -e "" @@ -19,7 +18,7 @@ fn_serveradmin_password_prompt(){ echo Exiting; exit fi fn_script_log_info "Initiating ${gamename} ServerAdmin password change" - read -rp "Enter new password : " newpassword + read -rp "Enter new password: " newpassword } fn_serveradmin_password_set(){ From 41b40c7c7876258c25ce752d3015279e6a297b09 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Sun, 20 Oct 2019 00:29:55 +0100 Subject: [PATCH 208/534] removed Exiting --- lgsm/functions/command_console.sh | 2 +- lgsm/functions/command_debug.sh | 2 +- lgsm/functions/command_mods_install.sh | 2 +- lgsm/functions/command_mods_remove.sh | 2 +- lgsm/functions/command_ts3_server_pass.sh | 8 ++++---- lgsm/functions/command_wipe.sh | 2 +- lgsm/functions/compress_unreal2_maps.sh | 2 +- lgsm/functions/compress_ut99_maps.sh | 2 +- lgsm/functions/install_retry.sh | 4 ++-- 9 files changed, 13 insertions(+), 13 deletions(-) diff --git a/lgsm/functions/command_console.sh b/lgsm/functions/command_console.sh index f428ce56e..1d08b2c92 100644 --- a/lgsm/functions/command_console.sh +++ b/lgsm/functions/command_console.sh @@ -19,7 +19,7 @@ fn_print_warning_nl "Do NOT press CTRL+c to exit." echo -e " * https://docs.linuxgsm.com/commands/console" echo -e "" if ! fn_prompt_yn "Continue?" Y; then - echo Exiting; return + return fi fn_print_dots "Accessing console" check_status.sh diff --git a/lgsm/functions/command_debug.sh b/lgsm/functions/command_debug.sh index 9422bbad7..5b3629844 100644 --- a/lgsm/functions/command_debug.sh +++ b/lgsm/functions/command_debug.sh @@ -86,7 +86,7 @@ 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 -e "" if ! fn_prompt_yn "Continue?" Y; then - echo Exiting; return + return fi fn_print_info_nl "Stopping any running servers" diff --git a/lgsm/functions/command_mods_install.sh b/lgsm/functions/command_mods_install.sh index 16ba9956f..58b0dc747 100644 --- a/lgsm/functions/command_mods_install.sh +++ b/lgsm/functions/command_mods_install.sh @@ -87,7 +87,7 @@ if [ -f "${modsinstalledlistfullpath}" ]; then fn_script_log_warn "${modprettyname} is already installed" echo -e " * Any configs may be overwritten." if ! fn_prompt_yn "Continue?" Y; then - echo Exiting; core_exit.sh + core_exit.sh fi fn_script_log_info "User selected to continue" fi diff --git a/lgsm/functions/command_mods_remove.sh b/lgsm/functions/command_mods_remove.sh index 3d2dae54b..08d18892f 100644 --- a/lgsm/functions/command_mods_remove.sh +++ b/lgsm/functions/command_mods_remove.sh @@ -46,7 +46,7 @@ done fn_print_warning_nl "You are about to remove ${cyan}${usermodselect}${default}." echo -e " * Any custom files/configuration will be removed." if ! fn_prompt_yn "Continue?" Y; then - echo Exiting; exit + core_exit.sh fi currentmod="${usermodselect}" diff --git a/lgsm/functions/command_ts3_server_pass.sh b/lgsm/functions/command_ts3_server_pass.sh index b107967f1..9a9f01c2c 100644 --- a/lgsm/functions/command_ts3_server_pass.sh +++ b/lgsm/functions/command_ts3_server_pass.sh @@ -5,8 +5,8 @@ # Website: https://linuxgsm.com # Description: Changes TS3 serveradmin password. -local commandname="TS3-CHANGE-PASS" -local commandaction="ServerAdmin Password Change" +local commandname="PASSWORD-CHANGE" +local commandaction="Password Change" local function_selfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" fn_serveradmin_password_prompt(){ @@ -22,7 +22,7 @@ fn_serveradmin_password_prompt(){ } fn_serveradmin_password_set(){ - fn_print_info_nl "Starting server with new password" + fn_print_info_nl "Starting " fn_script_log_info "Starting server with new password" # Start server in "new password mode". ts3serverpass="1" @@ -41,7 +41,7 @@ if [ "${status}" != "0" ]; then exitbypass="1" command_stop.sh fn_serveradmin_password_set - parms="inifile=${servercfgfullpath} pid_file=ts3server.pid" + parms="serveradmin_password="${newpassword}" inifile="${servercfgfullpath}" > /dev/null 2>&1" ts3serverpass="0" fn_print_info_nl "Restarting server normally" fn_script_log_info "Restarting server normally" diff --git a/lgsm/functions/command_wipe.sh b/lgsm/functions/command_wipe.sh index 9c83d2897..423491013 100644 --- a/lgsm/functions/command_wipe.sh +++ b/lgsm/functions/command_wipe.sh @@ -185,7 +185,7 @@ if [ "${shortname}" == "rust" ]; then if [ -d "${serveridentitydir}/storage" ]||[ -d "${serveridentitydir}/user" ]||[ -n "$(find "${serveridentitydir}" -type f -name "proceduralmap*.sav")" ]||[ -n "$(find "${serveridentitydir}" -type f -name "barren*.sav")" ]||[ -n "$(find "${serveridentitydir}" -type f -name "Log.*.txt")" ]||[ -n "$(find "${serveridentitydir}" -type f -name "player.deaths.*.db")" ]||[ -n "$(find "${serveridentitydir}" -type f -name "player.blueprints.*.db")" ]||[ -n "$(find "${serveridentitydir}" -type f -name "sv.files.*.db")" ]; then fn_print_warning_nl "Any user, storage, log and map data from ${serveridentitydir} will be erased." if ! fn_prompt_yn "Continue?" Y; then - echo Exiting; core_exit.sh + core_exit.sh fi fn_script_log_info "User selects to erase any user, storage, log and map data from ${serveridentitydir}" fn_sleep_time diff --git a/lgsm/functions/compress_unreal2_maps.sh b/lgsm/functions/compress_unreal2_maps.sh index e5868bfbb..3208212f2 100644 --- a/lgsm/functions/compress_unreal2_maps.sh +++ b/lgsm/functions/compress_unreal2_maps.sh @@ -18,7 +18,7 @@ echo -e "" echo -e "${compressedmapsdir}" echo -e "" if ! fn_prompt_yn "Start compression?" Y; then - echo Exiting; return + return fi mkdir -pv "${compressedmapsdir}" > /dev/null 2>&1 rm -rfv "${serverfiles}/Maps/"*.ut2.uz2 diff --git a/lgsm/functions/compress_ut99_maps.sh b/lgsm/functions/compress_ut99_maps.sh index f3f5449a5..d52ae01d0 100644 --- a/lgsm/functions/compress_ut99_maps.sh +++ b/lgsm/functions/compress_ut99_maps.sh @@ -18,7 +18,7 @@ echo -e "" echo -e "${compressedmapsdir}" echo -e "" if ! fn_prompt_yn "Start compression?" Y; then - echo Exiting; return + return fi mkdir -pv "${compressedmapsdir}" > /dev/null 2>&1 rm -rfv "${serverfiles}/Maps/"*.unr.uz diff --git a/lgsm/functions/install_retry.sh b/lgsm/functions/install_retry.sh index e2918c268..f5f4462ad 100644 --- a/lgsm/functions/install_retry.sh +++ b/lgsm/functions/install_retry.sh @@ -9,7 +9,7 @@ local commandaction="Install" local function_selfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" if fn_prompt_yn "Retry install?" Y; then - command_install.sh; exit + command_install.sh; core_exit.sh else - echo Exiting; exit + core_exit.sh fi From 6a8cd82a837182e4dd8389e81774f89b93b73439 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Sun, 20 Oct 2019 00:32:06 +0100 Subject: [PATCH 209/534] messages --- lgsm/functions/command_ts3_server_pass.sh | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/lgsm/functions/command_ts3_server_pass.sh b/lgsm/functions/command_ts3_server_pass.sh index 9a9f01c2c..f5d895987 100644 --- a/lgsm/functions/command_ts3_server_pass.sh +++ b/lgsm/functions/command_ts3_server_pass.sh @@ -19,11 +19,12 @@ fn_serveradmin_password_prompt(){ fi fn_script_log_info "Initiating ${gamename} ServerAdmin password change" read -rp "Enter new password: " newpassword + fn_print_info_nl "Changing password" + fn_script_log_info "Changing password" } fn_serveradmin_password_set(){ - fn_print_info_nl "Starting " - fn_script_log_info "Starting server with new password" + # Start server in "new password mode". ts3serverpass="1" exitbypass="1" @@ -35,6 +36,7 @@ fn_serveradmin_password_set(){ # Running functions. check.sh fn_serveradmin_password_prompt + check_status.sh if [ "${status}" != "0" ]; then # Stop any running server. @@ -43,8 +45,6 @@ if [ "${status}" != "0" ]; then fn_serveradmin_password_set parms="serveradmin_password="${newpassword}" inifile="${servercfgfullpath}" > /dev/null 2>&1" ts3serverpass="0" - fn_print_info_nl "Restarting server normally" - fn_script_log_info "Restarting server normally" command_restart.sh else fn_serveradmin_password_set From 2e42dc53b01ba53dfaa3a6444d58ce75ea11e84c Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Sun, 20 Oct 2019 00:35:40 +0100 Subject: [PATCH 210/534] removed ts3 if --- lgsm/functions/check_status.sh | 15 +-------------- lgsm/functions/command_ts3_server_pass.sh | 2 +- 2 files changed, 2 insertions(+), 15 deletions(-) diff --git a/lgsm/functions/check_status.sh b/lgsm/functions/check_status.sh index 529dcbf5b..7a5e62d6e 100644 --- a/lgsm/functions/check_status.sh +++ b/lgsm/functions/check_status.sh @@ -8,17 +8,4 @@ local commandname="CHECK" local function_selfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" -if [ "${shortname}" == "ts3" ]; then - # 1: Server is running - # 0: Server seems to have died - # 0: No server running (ts3server.pid is missing) - status=$("${executabledir}/ts3server_startscript.sh" status servercfgfullpathfile="${servercfgfullpath}") - if [ "${status}" == "Server is running" ]; then - status=1 - else - ts3error="${status}" - status=0 - fi -else - status=$(tmux list-sessions -F "#{session_name}" 2>/dev/null | grep -Ecx "^${servicename}") -fi +status=$(tmux list-sessions -F "#{session_name}" 2>/dev/null | grep -Ecx "^${servicename}") diff --git a/lgsm/functions/command_ts3_server_pass.sh b/lgsm/functions/command_ts3_server_pass.sh index f5d895987..1a912a39a 100644 --- a/lgsm/functions/command_ts3_server_pass.sh +++ b/lgsm/functions/command_ts3_server_pass.sh @@ -29,7 +29,7 @@ fn_serveradmin_password_set(){ ts3serverpass="1" exitbypass="1" command_start.sh - fn_print_ok_nl "Password applied" + fn_print_ok_nl "New password applied" fn_script_log_pass "New ServerAdmin password applied" } From 0734f2f86b3c2e4331b5593deb49e764adc15931 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Sun, 20 Oct 2019 00:40:49 +0100 Subject: [PATCH 211/534] remove check that is not required --- lgsm/functions/command_ts3_server_pass.sh | 3 --- 1 file changed, 3 deletions(-) diff --git a/lgsm/functions/command_ts3_server_pass.sh b/lgsm/functions/command_ts3_server_pass.sh index 1a912a39a..d7f3b73a0 100644 --- a/lgsm/functions/command_ts3_server_pass.sh +++ b/lgsm/functions/command_ts3_server_pass.sh @@ -24,7 +24,6 @@ fn_serveradmin_password_prompt(){ } fn_serveradmin_password_set(){ - # Start server in "new password mode". ts3serverpass="1" exitbypass="1" @@ -36,8 +35,6 @@ fn_serveradmin_password_set(){ # Running functions. check.sh fn_serveradmin_password_prompt - -check_status.sh if [ "${status}" != "0" ]; then # Stop any running server. exitbypass="1" From 2559dcebe1bdb646c9dbfe8ebd06fc737c94a3c2 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Sun, 20 Oct 2019 00:48:28 +0100 Subject: [PATCH 212/534] removed duplicate code --- lgsm/functions/command_start.sh | 19 ------------------- 1 file changed, 19 deletions(-) diff --git a/lgsm/functions/command_start.sh b/lgsm/functions/command_start.sh index 55bbfd414..7fc8a2987 100644 --- a/lgsm/functions/command_start.sh +++ b/lgsm/functions/command_start.sh @@ -24,30 +24,11 @@ fn_start_teamspeak3(){ sleep 5 touch "${servercfgfullpath}" fi - fn_sleep_time - if [ -f "${lgsmlog}" ]; then - mv "${lgsmlog}" "${lgsmlogdate}" - fi - - # Create lockfile. - date '+%s' > "${rootdir}/${lockselfname}" # Accept license. if [ ! -f "${executabledir}/.ts3server_license_accepted" ]; then install_eula.sh fi - cd "${executabledir}" || exit fn_start_tmux - fn_sleep_time - check_status.sh - 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: ${logdir}" - core_exit.sh - else - fn_print_ok_nl "${servername}" - fn_script_log_pass "Started ${servername}" - fi } fn_start_tmux(){ From 5c3c36e8d2d5e7d3fb450d6406eeaa5eb319f9a3 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Sun, 20 Oct 2019 01:01:22 +0100 Subject: [PATCH 213/534] fixing privilege key generation --- lgsm/functions/install_ts3db.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lgsm/functions/install_ts3db.sh b/lgsm/functions/install_ts3db.sh index cd2ef8653..352b77d73 100644 --- a/lgsm/functions/install_ts3db.sh +++ b/lgsm/functions/install_ts3db.sh @@ -71,6 +71,6 @@ echo -e "=================================" fn_sleep_time fn_print_information_nl "Save these details for later." cd "${executabledir}" || exit -${executable} start inifile=ts3-server.ini +./ts3server_startscript.sh start inifile=ts3-server.ini | tee "${serverfiles}/privilege_key.txt" sleep 5 -${executable} stop +./ts3server_startscript.sh stop From 3bfaad9ca9bd7da25da2dfcb2aa00f0f16664230 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Sun, 20 Oct 2019 17:22:47 +0100 Subject: [PATCH 214/534] changed status to gameserverpid --- lgsm/functions/info_distro.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lgsm/functions/info_distro.sh b/lgsm/functions/info_distro.sh index aee166272..1da562cff 100644 --- a/lgsm/functions/info_distro.sh +++ b/lgsm/functions/info_distro.sh @@ -98,7 +98,7 @@ cpumodel=$(awk -F: '/model name/ {name=$2} END {print name}' /proc/cpuinfo | sed cpucores=$(awk -F: '/model name/ {core++} END {print core}' /proc/cpuinfo) cpufreqency=$(awk -F: ' /cpu MHz/ {freq=$2} END {print freq " MHz"}' /proc/cpuinfo | sed 's/^[ \t]*//;s/[ \t]*$//') # CPU usage of the game server pid -if [ "${status}" == "1" ]; then +if [ "${gameserverpid}" ]; then cpuused=$(ps --forest -o pcpu -g "${gameserverpid}"|awk '{s+=$1} END {print s}') fi @@ -136,7 +136,7 @@ if [ -n "$(command -v numfmt 2>/dev/null)" ]; then swapused=$(numfmt --to=iec --from=iec --suffix=B "$(($(grep ^SwapTotal /proc/meminfo | awk '{print $2}')-$(grep ^SwapFree /proc/meminfo | awk '{print $2}')))K") # RAM usage of the game server pid # MB - if [ "${status}" == "1" ]; then + if [ "${gameserverpid}" ]; then memused=$(ps --forest -o rss -g "${gameserverpid}" | awk '{s+=$1} END {print s}'| awk '{$1/=1024;printf "%.0fMB\t",$1}{print $2}') # % pmemused=$(ps --forest -o %mem -g "${gameserverpid}" | awk '{s+=$1} END {print s}') From ef2660e92c7aaf7d267bbd9c083cb0a0ffe800b5 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Sun, 20 Oct 2019 17:28:10 +0100 Subject: [PATCH 215/534] output --- 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 352b77d73..444c19da5 100644 --- a/lgsm/functions/install_ts3db.sh +++ b/lgsm/functions/install_ts3db.sh @@ -71,6 +71,6 @@ echo -e "=================================" fn_sleep_time fn_print_information_nl "Save these details for later." cd "${executabledir}" || exit -./ts3server_startscript.sh start inifile=ts3-server.ini | tee "${serverfiles}/privilege_key.txt" +./ts3server_startscript.sh start inifile=ts3-server.ini 2>&1 | tee "${serverfiles}/privilege_key.txt" sleep 5 ./ts3server_startscript.sh stop From 10a24f19308d243bfd63fda3372dc4f38c5be3ec Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Sun, 20 Oct 2019 18:09:39 +0100 Subject: [PATCH 216/534] added privilege key save location --- lgsm/functions/install_ts3db.sh | 2 ++ 1 file changed, 2 insertions(+) diff --git a/lgsm/functions/install_ts3db.sh b/lgsm/functions/install_ts3db.sh index 444c19da5..744b4bea7 100644 --- a/lgsm/functions/install_ts3db.sh +++ b/lgsm/functions/install_ts3db.sh @@ -70,6 +70,8 @@ echo -e "${lightyellow}Getting privilege key${default}" echo -e "=================================" fn_sleep_time fn_print_information_nl "Save these details for later." +fn_print_information_nl "Key also saved in:" +echo -e "${serverfiles}/privilege_key.txt" cd "${executabledir}" || exit ./ts3server_startscript.sh start inifile=ts3-server.ini 2>&1 | tee "${serverfiles}/privilege_key.txt" sleep 5 From 370e394fae53b8d3aa8315f94ceab6c42d3d7af2 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Sun, 20 Oct 2019 19:35:10 +0100 Subject: [PATCH 217/534] codacy fixes --- lgsm/functions/command_ts3_server_pass.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lgsm/functions/command_ts3_server_pass.sh b/lgsm/functions/command_ts3_server_pass.sh index d7f3b73a0..fc242c16e 100644 --- a/lgsm/functions/command_ts3_server_pass.sh +++ b/lgsm/functions/command_ts3_server_pass.sh @@ -40,7 +40,7 @@ if [ "${status}" != "0" ]; then exitbypass="1" command_stop.sh fn_serveradmin_password_set - parms="serveradmin_password="${newpassword}" inifile="${servercfgfullpath}" > /dev/null 2>&1" + parms="serveradmin_password=\"${newpassword}\" inifile=\"${servercfgfullpath}\" > /dev/null 2>&1" ts3serverpass="0" command_restart.sh else From b5f6059003e8c2a63903729aa8e6774d189633da Mon Sep 17 00:00:00 2001 From: Attila <1230402+borzaka@users.noreply.github.com> Date: Fri, 1 Nov 2019 23:11:36 +0100 Subject: [PATCH 218/534] Add space after "Game:" during install Before: Game:Counter-Strike: Global Offensive After: Game: Counter-Strike: Global Offensive --- lgsm/functions/install_header.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lgsm/functions/install_header.sh b/lgsm/functions/install_header.sh index 0b5febae1..b524fe7ad 100644 --- a/lgsm/functions/install_header.sh +++ b/lgsm/functions/install_header.sh @@ -14,7 +14,7 @@ fn_sleep_time echo -e "=================================" echo -e "${lightyellow}Linux${default}GSM_" echo -e "by Daniel Gibbs" -echo -e "${lightblue}Game:${default}${gamename}" +echo -e "${lightblue}Game:${default} ${gamename}" echo -e "${lightblue}Website:${default} https://linuxgsm.com" echo -e "${lightblue}Contributors:${default} https://linuxgsm.com/contrib" echo -e "${lightblue}Donate:${default} https://linuxgsm.com/donate" From 8281f209dec30d101a63c2279d333fbd17598e42 Mon Sep 17 00:00:00 2001 From: Frisasky Date: Sun, 3 Nov 2019 23:11:51 +0800 Subject: [PATCH 219/534] feat(zmrserver): update server files (#2569) --- 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 73c375fbb..87161b04b 100644 --- a/lgsm/functions/install_server_files.sh +++ b/lgsm/functions/install_server_files.sh @@ -64,7 +64,7 @@ fn_install_server_files(){ elif [ "${shortname}" == "sol" ]; then remote_fileurl="https://static.soldat.pl/downloads/soldatserver2.8.1_1.7.1.zip"; local_filedir="${tmpdir}"; local_filename="soldatserver2.8.1_1.7.1.zip"; chmodx="nochmodx" run="norun"; force="noforce"; md5="994409c28520425965dec5c71ccb55e1" elif [ "${shortname}" == "zmr" ]; then - remote_fileurl="https://files.linuxgsm.com/ZombieMasterReborn/zombie_master_reborn_b4_fix5.1.tar.bz2"; local_filedir="${tmpdir}"; local_filename="zombie_master_reborn_b4_fix5.1.tar.bz2"; chmodx="nochmodx" run="norun"; force="noforce"; md5="73472bd84dfa6d203f3b5f48f760773e" + remote_fileurl="https://files.linuxgsm.com/ZombieMasterReborn/zombie_master_reborn_b5_2.tar.bz2"; local_filedir="${tmpdir}"; local_filename="zombie_master_reborn_b5_2.tar.bz2"; chmodx="nochmodx" run="norun"; force="noforce"; md5="d52ef2db376f5d21e3a4ceca85ec8761" fi fn_fetch_file "${remote_fileurl}" "${local_filedir}" "${local_filename}" "${chmodx}" "${run}" "${forcedl}" "${md5}" fn_dl_extract "${local_filedir}" "${local_filename}" "${serverfiles}" From d0fe7916051b4c13d7c4f1ba4d8e2965ffc562c0 Mon Sep 17 00:00:00 2001 From: Frisasky Date: Wed, 6 Nov 2019 21:17:21 +0800 Subject: [PATCH 220/534] fix(insserver): re-add no restart to parameters (#2577) --- lgsm/config-default/config-lgsm/insserver/_default.cfg | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lgsm/config-default/config-lgsm/insserver/_default.cfg b/lgsm/config-default/config-lgsm/insserver/_default.cfg index 246b00584..15e0b6ece 100644 --- a/lgsm/config-default/config-lgsm/insserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/insserver/_default.cfg @@ -24,7 +24,7 @@ gslt="" ## Server Start Command | https://docs.linuxgsm.com/configuration/start-parameters#additional-parameters fn_parms(){ -parms="-game insurgency -strictportbind -ip ${ip} -port ${port} +clientport ${clientport} +tv_port ${sourcetvport} -tickrate ${tickrate} +sv_setsteamaccount ${gslt} +map ${defaultmap} +servercfgfile ${servercfg} -maxplayers ${maxplayers} -workshop" +parms="-game insurgency -strictportbind -ip ${ip} -port ${port} +clientport ${clientport} +tv_port ${sourcetvport} -tickrate ${tickrate} +sv_setsteamaccount ${gslt} +map ${defaultmap} +servercfgfile ${servercfg} -maxplayers ${maxplayers} -workshop -norestart" } #### LinuxGSM Settings #### From e27143946faeb4eef57baeda92a17a1d87b62457 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Sun, 10 Nov 2019 22:45:52 +0000 Subject: [PATCH 221/534] fix(config): standardise design and bug fixes various issues with _default.cfg files (#2582) --- .travis.yml | 2 + .../config-lgsm/ahl2server/_default.cfg | 26 ++++---- .../config-lgsm/ahlserver/_default.cfg | 26 ++++---- .../config-lgsm/arkserver/_default.cfg | 28 ++++----- .../config-lgsm/arma3server/_default.cfg | 26 ++++---- .../config-lgsm/bb2server/_default.cfg | 30 +++++----- .../config-lgsm/bbserver/_default.cfg | 26 ++++---- .../config-lgsm/bdserver/_default.cfg | 26 ++++---- .../config-lgsm/bf1942server/_default.cfg | 24 ++++---- .../config-lgsm/bmdmserver/_default.cfg | 30 +++++----- .../config-lgsm/boserver/_default.cfg | 30 +++++----- .../config-lgsm/bsserver/_default.cfg | 30 +++++----- .../config-lgsm/bt1944server/_default.cfg | 28 ++++----- .../config-lgsm/btserver/_default.cfg | 26 ++++---- .../config-lgsm/ccserver/_default.cfg | 26 ++++---- .../config-lgsm/cod2server/_default.cfg | 24 ++++---- .../config-lgsm/cod4server/_default.cfg | 24 ++++---- .../config-lgsm/codserver/_default.cfg | 24 ++++---- .../config-lgsm/coduoserver/_default.cfg | 24 ++++---- .../config-lgsm/codwawserver/_default.cfg | 24 ++++---- .../config-lgsm/csczserver/_default.cfg | 26 ++++---- .../config-lgsm/csgoserver/_default.cfg | 32 +++++----- .../config-lgsm/csserver/_default.cfg | 26 ++++---- .../config-lgsm/cssserver/_default.cfg | 30 +++++----- .../config-lgsm/dabserver/_default.cfg | 26 ++++---- .../config-lgsm/dmcserver/_default.cfg | 26 ++++---- .../config-lgsm/dodserver/_default.cfg | 26 ++++---- .../config-lgsm/dodsserver/_default.cfg | 26 ++++---- .../config-lgsm/doiserver/_default.cfg | 27 +++++---- .../config-lgsm/dstserver/_default.cfg | 34 +++++------ .../config-lgsm/dysserver/_default.cfg | 30 +++++----- .../config-lgsm/ecoserver/_default.cfg | 30 ++++++---- .../config-lgsm/emserver/_default.cfg | 30 +++++----- .../config-lgsm/etlserver/_default.cfg | 24 ++++---- .../config-lgsm/fctrserver/_default.cfg | 25 ++++---- .../config-lgsm/fofserver/_default.cfg | 26 ++++---- .../config-lgsm/gesserver/_default.cfg | 26 ++++---- .../config-lgsm/gmodserver/_default.cfg | 30 +++++----- .../config-lgsm/hl2dmserver/_default.cfg | 26 ++++---- .../config-lgsm/hldmserver/_default.cfg | 26 ++++---- .../config-lgsm/hldmsserver/_default.cfg | 26 ++++---- .../config-lgsm/hwserver/_default.cfg | 26 ++++---- .../config-lgsm/insserver/_default.cfg | 30 +++++----- .../config-lgsm/inssserver/_default.cfg | 27 ++++----- .../config-lgsm/instance-template.cfg | 4 +- .../config-lgsm/iosserver/_default.cfg | 26 ++++---- .../config-lgsm/jc2server/_default.cfg | 26 ++++---- .../config-lgsm/jc3server/_default.cfg | 26 ++++---- .../config-lgsm/kf2server/_default.cfg | 26 ++++---- .../config-lgsm/kfserver/_default.cfg | 26 ++++---- .../config-lgsm/l4d2server/_default.cfg | 26 ++++---- .../config-lgsm/l4dserver/_default.cfg | 26 ++++---- .../config-lgsm/mcserver/_default.cfg | 24 ++++---- .../config-lgsm/mhserver/_default.cfg | 39 ++++++------ .../config-lgsm/mohaaserver/_default.cfg | 24 ++++---- .../config-lgsm/mtaserver/_default.cfg | 24 ++++---- .../config-lgsm/mumbleserver/_default.cfg | 24 ++++---- .../config-lgsm/ndserver/_default.cfg | 26 ++++---- .../config-lgsm/nmrihserver/_default.cfg | 30 +++++----- .../config-lgsm/ns2cserver/_default.cfg | 26 ++++---- .../config-lgsm/ns2server/_default.cfg | 26 ++++---- .../config-lgsm/nsserver/_default.cfg | 26 ++++---- .../config-lgsm/opforserver/_default.cfg | 28 ++++----- .../config-lgsm/pcserver/_default.cfg | 26 ++++---- .../config-lgsm/pstbsserver/_default.cfg | 30 +++++----- .../config-lgsm/pvkiiserver/_default.cfg | 26 ++++---- .../config-lgsm/pzserver/_default.cfg | 26 ++++---- .../config-lgsm/q2server/_default.cfg | 24 ++++---- .../config-lgsm/q3server/_default.cfg | 24 ++++---- .../config-lgsm/qlserver/_default.cfg | 26 ++++---- .../config-lgsm/qwserver/_default.cfg | 24 ++++---- .../config-lgsm/ricochetserver/_default.cfg | 28 ++++----- .../config-lgsm/roserver/_default.cfg | 26 ++++---- .../config-lgsm/rtcwserver/_default.cfg | 24 ++++---- .../config-lgsm/rustserver/_default.cfg | 26 ++++---- .../config-lgsm/rwserver/_default.cfg | 26 ++++---- .../config-lgsm/sampserver/_default.cfg | 24 ++++---- .../config-lgsm/sbotsserver/_default.cfg | 26 ++++---- .../config-lgsm/sbserver/_default.cfg | 26 ++++---- .../config-lgsm/sdtdserver/_default.cfg | 32 +++++----- .../config-lgsm/sfcserver/_default.cfg | 26 ++++---- .../config-lgsm/sof2server/_default.cfg | 24 ++++---- .../config-lgsm/solserver/_default.cfg | 28 +++++---- .../config-lgsm/squadserver/_default.cfg | 26 ++++---- .../config-lgsm/ss3server/_default.cfg | 28 ++++----- .../config-lgsm/stserver/_default.cfg | 28 ++++----- .../config-lgsm/svenserver/_default.cfg | 26 ++++---- .../config-lgsm/terrariaserver/_default.cfg | 26 ++++---- .../config-lgsm/tf2server/_default.cfg | 30 +++++----- .../config-lgsm/tfcserver/_default.cfg | 26 ++++---- .../config-lgsm/ts3server/_default.cfg | 22 +++---- .../config-lgsm/tsserver/_default.cfg | 26 ++++---- .../config-lgsm/tuserver/_default.cfg | 34 +++++------ .../config-lgsm/twserver/_default.cfg | 26 ++++---- .../config-lgsm/untserver/_default.cfg | 38 ++++++------ .../config-lgsm/ut2k4server/_default.cfg | 24 ++++---- .../config-lgsm/ut3server/_default.cfg | 26 ++++---- .../config-lgsm/ut99server/_default.cfg | 24 ++++---- .../config-lgsm/utserver/_default.cfg | 24 ++++---- .../config-lgsm/vsserver/_default.cfg | 26 ++++---- .../config-lgsm/wetserver/_default.cfg | 24 ++++---- .../config-lgsm/wfserver/_default.cfg | 26 ++++---- .../config-lgsm/wurmserver/_default.cfg | 26 ++++---- .../config-lgsm/zmrserver/_default.cfg | 26 ++++---- .../config-lgsm/zpsserver/_default.cfg | 30 +++++----- lgsm/functions/install_gslt.sh | 4 +- tests/tests_defaultcfg/defaultcfg_0.txt | 53 ++++++++++++++++ tests/tests_defaultcfg/defaultcfg_1.txt | 51 ++++++++++++++++ tests/tests_defaultcfg/tests_defaultcfg.sh | 60 +++++++++++++++++++ 109 files changed, 1553 insertions(+), 1377 deletions(-) create mode 100644 tests/tests_defaultcfg/defaultcfg_0.txt create mode 100644 tests/tests_defaultcfg/defaultcfg_1.txt create mode 100644 tests/tests_defaultcfg/tests_defaultcfg.sh diff --git a/.travis.yml b/.travis.yml index 5606c8e6a..78dea169d 100644 --- a/.travis.yml +++ b/.travis.yml @@ -43,5 +43,7 @@ jobs: script: bash tests/tests_mcserver.sh - # stage name not required script: bash tests/tests_ts3server.sh + - # stage name not required + script: bash tests/tests_defaultcfg/tests_defaultcfg.sh - # retired as codacy does this check. # script: bash tests/tests_shellcheck.sh diff --git a/lgsm/config-default/config-lgsm/ahl2server/_default.cfg b/lgsm/config-default/config-lgsm/ahl2server/_default.cfg index 03befbd00..f7f637608 100644 --- a/lgsm/config-default/config-lgsm/ahl2server/_default.cfg +++ b/lgsm/config-default/config-lgsm/ahl2server/_default.cfg @@ -1,12 +1,12 @@ ################################## ######## 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 +# DO NOT EDIT ANY CHANGES 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 #### +#### Game Server Settings #### ## SteamCMD Login | https://docs.linuxgsm.com/steamcmd#steamcmd-login steamuser="username" @@ -97,15 +97,15 @@ logdays="7" # Query delay time querydelay="1" -#### LinuxGSM Advanced Settings #### - -# ANSI Colors +## ANSI Colors | https://docs.linuxgsm.com/features/ansi-colors ansi="on" -# Message Display Time +#### Advanced Settings #### + +## Message Display Time | https://docs.linuxgsm.com/features/message-display-time sleeptime="0.5" -# Stop Mode | https://docs.linuxgsm.com/steamcmd/stopmode +## Stop Mode | https://docs.linuxgsm.com/features/stop-mode # 1: tmux kill # 2: CTRL+c # 3: quit @@ -118,7 +118,7 @@ sleeptime="0.5" # 10: Teamspeak 3 stopmode="3" -## SteamCMD Settings +## SteamCMD Settings | https://docs.linuxgsm.com/steamcmd # Server appid appid="985050" # SteamCMD Branch | https://docs.linuxgsm.com/steamcmd/branch @@ -126,7 +126,7 @@ branch="" # Master Server | https://docs.linuxgsm.com/steamcmd/steam-master-server steammaster="true" -## LinuxGSM Server Details +## Game Server Details # Do not edit gamename="Action: Source" engine="source" @@ -135,7 +135,7 @@ glibc="2.15" #### Directories #### # Edit with care -## Server Specific Directories +## Game Server Directories systemdir="${serverfiles}/ahl2" executabledir="${serverfiles}" executable="./srcds_run" diff --git a/lgsm/config-default/config-lgsm/ahlserver/_default.cfg b/lgsm/config-default/config-lgsm/ahlserver/_default.cfg index 65cfd5fab..56231c6d5 100644 --- a/lgsm/config-default/config-lgsm/ahlserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/ahlserver/_default.cfg @@ -1,12 +1,12 @@ ################################## ######## 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 +# DO NOT EDIT ANY CHANGES 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 #### +#### Game Server Settings #### ## Server Start Settings | https://docs.linuxgsm.com/configuration/start-parameters ip="0.0.0.0" @@ -92,15 +92,15 @@ logdays="7" # Query delay time querydelay="1" -#### LinuxGSM Advanced Settings #### - -# ANSI Colors +## ANSI Colors | https://docs.linuxgsm.com/features/ansi-colors ansi="on" -# Message Display Time +#### Advanced Settings #### + +## Message Display Time | https://docs.linuxgsm.com/features/message-display-time sleeptime="0.5" -## SteamCMD Settings +## SteamCMD Settings | https://docs.linuxgsm.com/steamcmd # Server appid appid="90" appidmod="cstrike" @@ -109,7 +109,7 @@ branch="" # Master Server | https://docs.linuxgsm.com/steamcmd/steam-master-server steammaster="true" -# Stop Mode | https://docs.linuxgsm.com/steamcmd/stopmode +## Stop Mode | https://docs.linuxgsm.com/features/stop-mode # 1: tmux kill # 2: CTRL+c # 3: quit @@ -122,7 +122,7 @@ steammaster="true" # 10: Teamspeak 3 stopmode="9" -## LinuxGSM Server Details +## Game Server Details # Do not edit gamename="Action half-life" engine="goldsource" @@ -131,7 +131,7 @@ glibc="2.3.4" #### Directories #### # Edit with care -## Server Specific Directories +## Game Server Directories systemdir="${serverfiles}/action" executabledir="${serverfiles}" executable="./hlds_run" diff --git a/lgsm/config-default/config-lgsm/arkserver/_default.cfg b/lgsm/config-default/config-lgsm/arkserver/_default.cfg index f69643c12..e8560b878 100644 --- a/lgsm/config-default/config-lgsm/arkserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/arkserver/_default.cfg @@ -1,12 +1,12 @@ ################################## ######## 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 +# DO NOT EDIT ANY CHANGES 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 #### +#### Game Server Settings #### ## Server Start Settings | https://docs.linuxgsm.com/configuration/start-parameters ip="0.0.0.0" @@ -94,15 +94,15 @@ logdays="7" # Query delay time querydelay="5" -#### LinuxGSM Advanced Settings #### - -# ANSI Colors +## ANSI Colors | https://docs.linuxgsm.com/features/ansi-colors ansi="on" -# Message Display Time +#### Advanced Settings #### + +## Message Display Time | https://docs.linuxgsm.com/features/message-display-time sleeptime="0.5" -## SteamCMD Settings +## SteamCMD Settings | https://docs.linuxgsm.com/steamcmd # Server appid appid="376030" # SteamCMD Branch | https://docs.linuxgsm.com/steamcmd/branch @@ -110,7 +110,7 @@ branch="" # Master Server | https://docs.linuxgsm.com/steamcmd/steam-master-server steammaster="true" -# Stop Mode | https://docs.linuxgsm.com/steamcmd/stopmode +## Stop Mode | https://docs.linuxgsm.com/features/stop-mode # 1: tmux kill # 2: CTRL+c # 3: quit @@ -123,7 +123,7 @@ steammaster="true" # 10: Teamspeak 3 stopmode="2" -## LinuxGSM Server Details +## Game Server Details # Do not edit gamename="ARK: Survival Evolved" engine="unreal4" @@ -132,13 +132,13 @@ glibc="2.15" #### Directories #### # Edit with care -## Server Specific Directories +## Game Server Directories systemdir="${serverfiles}/ShooterGame" executabledir="${systemdir}/Binaries/Linux" executable="./ShooterGameServer" -servercfgdir="${systemdir}/Saved/Config/LinuxServer" servercfg="GameUserSettings.ini" servercfgdefault="GameUserSettings.ini" +servercfgdir="${systemdir}/Saved/Config/LinuxServer" servercfgfullpath="${servercfgdir}/${servercfg}" ## Backup Directory diff --git a/lgsm/config-default/config-lgsm/arma3server/_default.cfg b/lgsm/config-default/config-lgsm/arma3server/_default.cfg index d58cb76e5..58cf35bc1 100644 --- a/lgsm/config-default/config-lgsm/arma3server/_default.cfg +++ b/lgsm/config-default/config-lgsm/arma3server/_default.cfg @@ -1,12 +1,12 @@ ################################## ######## 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 +# DO NOT EDIT ANY CHANGES 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 #### +#### Game Server Settings #### ## SteamCMD Login | https://docs.linuxgsm.com/steamcmd#steamcmd-login steamuser="username" @@ -108,15 +108,15 @@ logdays="7" # Query delay time querydelay="5" -#### LinuxGSM Advanced Settings #### - -# ANSI Colors +## ANSI Colors | https://docs.linuxgsm.com/features/ansi-colors ansi="on" -# Message Display Time +#### Advanced Settings #### + +## Message Display Time | https://docs.linuxgsm.com/features/message-display-time sleeptime="0.5" -## SteamCMD Settings +## SteamCMD Settings | https://docs.linuxgsm.com/steamcmd # Server appid appid="233780" # SteamCMD Branch | https://docs.linuxgsm.com/steamcmd/branch @@ -124,7 +124,7 @@ branch="" # Master Server | https://docs.linuxgsm.com/steamcmd/steam-master-server steammaster="false" -# Stop Mode | https://docs.linuxgsm.com/steamcmd/stopmode +## Stop Mode | https://docs.linuxgsm.com/features/stop-mode # 1: tmux kill # 2: CTRL+c # 3: quit @@ -137,7 +137,7 @@ steammaster="false" # 10: Teamspeak 3 stopmode="2" -## LinuxGSM Server Details +## Game Server Details # Do not edit gamename="ARMA 3" engine="realvirtuality" @@ -146,7 +146,7 @@ glibc="2.13" #### Directories #### # Edit with care -## Server Specific Directories +## Game Server Directories systemdir="${serverfiles}" executabledir="${serverfiles}" executable="./arma3server" diff --git a/lgsm/config-default/config-lgsm/bb2server/_default.cfg b/lgsm/config-default/config-lgsm/bb2server/_default.cfg index aa5ffca37..28b1234b7 100644 --- a/lgsm/config-default/config-lgsm/bb2server/_default.cfg +++ b/lgsm/config-default/config-lgsm/bb2server/_default.cfg @@ -1,12 +1,12 @@ ################################## ######## 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 +# DO NOT EDIT ANY CHANGES 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 #### +#### Game Server Settings #### ## Server Start Settings | https://docs.linuxgsm.com/configuration/start-parameters ip="0.0.0.0" @@ -16,9 +16,9 @@ sourcetvport="27020" defaultmap="bba_barracks" maxplayers="20" -## Optional: Game Server Login Token +## Game Server Login Token (GSLT): Optional # GSLT can be used for running a public server. -# More info: https://linuxgsm.com/gslt +# More info: https://docs.linuxgsm.com/steamcmd/gslt gslt="" ## Server Start Command | https://docs.linuxgsm.com/configuration/start-parameters#additional-parameters @@ -98,15 +98,15 @@ logdays="7" # Query delay time querydelay="1" -#### LinuxGSM Advanced Settings #### - -# ANSI Colors +## ANSI Colors | https://docs.linuxgsm.com/features/ansi-colors ansi="on" -# Message Display Time +#### Advanced Settings #### + +## Message Display Time | https://docs.linuxgsm.com/features/message-display-time sleeptime="0.5" -## SteamCMD Settings +## SteamCMD Settings | https://docs.linuxgsm.com/steamcmd # Server appid appid="475370" # SteamCMD Branch | https://docs.linuxgsm.com/steamcmd/branch @@ -114,7 +114,7 @@ branch="" # Master Server | https://docs.linuxgsm.com/steamcmd/steam-master-server steammaster="true" -# Stop Mode | https://docs.linuxgsm.com/steamcmd/stopmode +## Stop Mode | https://docs.linuxgsm.com/features/stop-mode # 1: tmux kill # 2: CTRL+c # 3: quit @@ -127,7 +127,7 @@ steammaster="true" # 10: Teamspeak 3 stopmode="3" -## LinuxGSM Server Details +## Game Server Details # Do not edit gamename="BrainBread 2" engine="source" @@ -136,7 +136,7 @@ glibc="2.17" #### Directories #### # Edit with care -## Server Specific Directories +## Game Server Directories systemdir="${serverfiles}/brainbread2" executabledir="${serverfiles}" executable="./srcds_run" diff --git a/lgsm/config-default/config-lgsm/bbserver/_default.cfg b/lgsm/config-default/config-lgsm/bbserver/_default.cfg index 11e7b23a0..6a4ee2d5c 100644 --- a/lgsm/config-default/config-lgsm/bbserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/bbserver/_default.cfg @@ -1,12 +1,12 @@ ################################## ######## 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 +# DO NOT EDIT ANY CHANGES 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 #### +#### Game Server Settings #### ## Server Start Settings | https://docs.linuxgsm.com/configuration/start-parameters ip="0.0.0.0" @@ -92,15 +92,15 @@ logdays="7" # Query delay time querydelay="1" -#### LinuxGSM Advanced Settings #### - -# ANSI Colors +## ANSI Colors | https://docs.linuxgsm.com/features/ansi-colors ansi="on" -# Message Display Time +#### Advanced Settings #### + +## Message Display Time | https://docs.linuxgsm.com/features/message-display-time sleeptime="0.5" -## SteamCMD Settings +## SteamCMD Settings | https://docs.linuxgsm.com/steamcmd # Server appid appid="90" appidmod="cstrike" @@ -109,7 +109,7 @@ branch="" # Master Server | https://docs.linuxgsm.com/steamcmd/steam-master-server steammaster="true" -# Stop Mode | https://docs.linuxgsm.com/steamcmd/stopmode +## Stop Mode | https://docs.linuxgsm.com/features/stop-mode # 1: tmux kill # 2: CTRL+c # 3: quit @@ -122,7 +122,7 @@ steammaster="true" # 10: Teamspeak 3 stopmode="9" -## LinuxGSM Server Details +## Game Server Details # Do not edit gamename="BrainBread" engine="goldsource" @@ -131,7 +131,7 @@ glibc="2.3.4" #### Directories #### # Edit with care -## Server Specific Directories +## Game Server Directories systemdir="${serverfiles}/brainbread" executabledir="${serverfiles}" executable="./hlds_run" diff --git a/lgsm/config-default/config-lgsm/bdserver/_default.cfg b/lgsm/config-default/config-lgsm/bdserver/_default.cfg index c2c148113..7bf53c255 100644 --- a/lgsm/config-default/config-lgsm/bdserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/bdserver/_default.cfg @@ -1,12 +1,12 @@ ################################## ######## 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 +# DO NOT EDIT ANY CHANGES 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 #### +#### Game Server Settings #### ## Server Start Settings | https://docs.linuxgsm.com/configuration/start-parameters ip="0.0.0.0" @@ -92,15 +92,15 @@ logdays="7" # Query delay time querydelay="1" -#### LinuxGSM Advanced Settings #### - -# ANSI Colors +## ANSI Colors | https://docs.linuxgsm.com/features/ansi-colors ansi="on" -# Message Display Time +#### Advanced Settings #### + +## Message Display Time | https://docs.linuxgsm.com/features/message-display-time sleeptime="0.5" -## SteamCMD Settings +## SteamCMD Settings | https://docs.linuxgsm.com/steamcmd # Server appid appid="817300" # SteamCMD Branch | https://docs.linuxgsm.com/steamcmd/branch @@ -108,7 +108,7 @@ branch="" # Master Server | https://docs.linuxgsm.com/steamcmd/steam-master-server steammaster="true" -# Stop Mode | https://docs.linuxgsm.com/steamcmd/stopmode +## Stop Mode | https://docs.linuxgsm.com/features/stop-mode # 1: tmux kill # 2: CTRL+c # 3: quit @@ -121,7 +121,7 @@ steammaster="true" # 10: Teamspeak 3 stopmode="9" -## LinuxGSM Server Details +## Game Server Details # Do not edit gamename="Base Defense" engine="goldsource" @@ -130,7 +130,7 @@ glibc="2.14" #### Directories #### # Edit with care -## Server Specific Directories +## Game Server Directories systemdir="${serverfiles}/bdef" executabledir="${serverfiles}" executable="./hlds_run" diff --git a/lgsm/config-default/config-lgsm/bf1942server/_default.cfg b/lgsm/config-default/config-lgsm/bf1942server/_default.cfg index 19e919726..a56e0548e 100644 --- a/lgsm/config-default/config-lgsm/bf1942server/_default.cfg +++ b/lgsm/config-default/config-lgsm/bf1942server/_default.cfg @@ -1,12 +1,12 @@ ################################## ######## 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 +# DO NOT EDIT ANY CHANGES 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 #### +#### Game Server Settings #### ## Server Start Command | https://docs.linuxgsm.com/configuration/start-parameters#additional-parameters fn_parms(){ @@ -85,15 +85,15 @@ logdays="7" # Query delay time querydelay="1" -#### LinuxGSM Advanced Settings #### - -# ANSI Colors +## ANSI Colors | https://docs.linuxgsm.com/features/ansi-colors ansi="on" -# Message Display Time +#### Advanced Settings #### + +## Message Display Time | https://docs.linuxgsm.com/features/message-display-time sleeptime="0.5" -# Stop Mode | https://docs.linuxgsm.com/steamcmd/stopmode +## Stop Mode | https://docs.linuxgsm.com/features/stop-mode # 1: tmux kill # 2: CTRL+c # 3: quit @@ -106,7 +106,7 @@ sleeptime="0.5" # 10: Teamspeak 3 stopmode="2" -## LinuxGSM Server Details +## Game Server Details # Do not edit gamename="Battlefield: 1942" engine="refractor" @@ -115,7 +115,7 @@ glibc="2.0" #### Directories #### # Edit with care -## Server Specific Directories +## Game Server Directories systemdir="${serverfiles}" executabledir="${systemdir}" executable="./start.sh" diff --git a/lgsm/config-default/config-lgsm/bmdmserver/_default.cfg b/lgsm/config-default/config-lgsm/bmdmserver/_default.cfg index 4a42b24aa..a0cd2872d 100644 --- a/lgsm/config-default/config-lgsm/bmdmserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/bmdmserver/_default.cfg @@ -1,12 +1,12 @@ ################################## ######## 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 +# DO NOT EDIT ANY CHANGES 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 #### +#### Game Server Settings #### ## Server Start Settings | https://docs.linuxgsm.com/configuration/start-parameters ip="0.0.0.0" @@ -16,9 +16,9 @@ sourcetvport="27020" defaultmap="dm_bounce" maxplayers="16" -## Optional: Game Server Login Token +## Game Server Login Token (GSLT): Optional # GSLT can be used for running a public server. -# More info: https://linuxgsm.com/gslt +# More info: https://docs.linuxgsm.com/steamcmd/gslt gslt="" ## Server Start Command | https://docs.linuxgsm.com/configuration/start-parameters#additional-parameters @@ -98,15 +98,15 @@ logdays="7" # Query delay time querydelay="1" -#### LinuxGSM Advanced Settings #### - -# ANSI Colors +## ANSI Colors | https://docs.linuxgsm.com/features/ansi-colors ansi="on" -# Message Display Time +#### Advanced Settings #### + +## Message Display Time | https://docs.linuxgsm.com/features/message-display-time sleeptime="0.5" -## SteamCMD Settings +## SteamCMD Settings | https://docs.linuxgsm.com/steamcmd # Server appid appid="346680" # SteamCMD Branch | https://docs.linuxgsm.com/steamcmd/branch @@ -114,7 +114,7 @@ branch="" # Master Server | https://docs.linuxgsm.com/steamcmd/steam-master-server steammaster="true" -# Stop Mode | https://docs.linuxgsm.com/steamcmd/stopmode +## Stop Mode | https://docs.linuxgsm.com/features/stop-mode # 1: tmux kill # 2: CTRL+c # 3: quit @@ -127,7 +127,7 @@ steammaster="true" # 10: Teamspeak 3 stopmode="3" -## LinuxGSM Server Details +## Game Server Details # Do not edit gamename="Black Mesa: Deathmatch" engine="source" @@ -136,7 +136,7 @@ glibc="2.15" #### Directories #### # Edit with care -## Server Specific Directories +## Game Server Directories systemdir="${serverfiles}/bms" executabledir="${serverfiles}" executable="./srcds_run" diff --git a/lgsm/config-default/config-lgsm/boserver/_default.cfg b/lgsm/config-default/config-lgsm/boserver/_default.cfg index 6f66c1680..5c31103a9 100644 --- a/lgsm/config-default/config-lgsm/boserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/boserver/_default.cfg @@ -1,16 +1,16 @@ ################################## ######## 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 +# DO NOT EDIT ANY CHANGES 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 #### +#### Game Server Settings #### -## Optional: Game Server Login Token +## Game Server Login Token (GSLT): Optional # GSLT can be used for running a public server. -# More info: https://linuxgsm.com/gslt +# More info: https://docs.linuxgsm.com/steamcmd/gslt gslt="" ip="" @@ -91,15 +91,15 @@ logdays="7" # Query delay time querydelay="1" -#### LinuxGSM Advanced Settings #### - -# ANSI Colors +## ANSI Colors | https://docs.linuxgsm.com/features/ansi-colors ansi="on" -# Message Display Time +#### Advanced Settings #### + +## Message Display Time | https://docs.linuxgsm.com/features/message-display-time sleeptime="0.5" -## SteamCMD Settings +## SteamCMD Settings | https://docs.linuxgsm.com/steamcmd # Server appid appid="416880" # SteamCMD Branch | https://docs.linuxgsm.com/steamcmd/branch @@ -107,7 +107,7 @@ branch="" # Master Server | https://docs.linuxgsm.com/steamcmd/steam-master-server steammaster="false" -# Stop Mode | https://docs.linuxgsm.com/steamcmd/stopmode +## Stop Mode | https://docs.linuxgsm.com/features/stop-mode # 1: tmux kill # 2: CTRL+c # 3: quit @@ -120,7 +120,7 @@ steammaster="false" # 10: Teamspeak 3 stopmode="2" -## LinuxGSM Server Details +## Game Server Details # Do not edit gamename="Ballistic Overkill" engine="unity3d" @@ -129,7 +129,7 @@ glibc="2.15" #### Directories #### # Edit with care -## Server Specific Directories +## Game Server Directories systemdir="${serverfiles}" executabledir="${serverfiles}" executable="./BODS.x86" diff --git a/lgsm/config-default/config-lgsm/bsserver/_default.cfg b/lgsm/config-default/config-lgsm/bsserver/_default.cfg index 29f8d9814..2a0cfe216 100644 --- a/lgsm/config-default/config-lgsm/bsserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/bsserver/_default.cfg @@ -1,12 +1,12 @@ ################################## ######## 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 +# DO NOT EDIT ANY CHANGES 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 #### +#### Game Server Settings #### ## SteamCMD Login | https://docs.linuxgsm.com/steamcmd#steamcmd-login steamuser="username" @@ -20,9 +20,9 @@ sourcetvport="27020" defaultmap="duel_winter" maxplayers="16" -## Required: Game Server Login Token +## Game Server Login Token (GSLT): Required # GSLT is required for running a public server. -# More info: https://linuxgsm.com/gslt +# More info: https://docs.linuxgsm.com/steamcmd/gslt gslt="" ## Server Start Command | https://docs.linuxgsm.com/configuration/start-parameters#additional-parameters @@ -102,15 +102,15 @@ logdays="7" # Query delay time querydelay="1" -#### LinuxGSM Advanced Settings #### - -# ANSI Colors +## ANSI Colors | https://docs.linuxgsm.com/features/ansi-colors ansi="on" -# Message Display Time +#### Advanced Settings #### + +## Message Display Time | https://docs.linuxgsm.com/features/message-display-time sleeptime="0.5" -## SteamCMD Settings +## SteamCMD Settings | https://docs.linuxgsm.com/steamcmd # Server appid appid="228780" # SteamCMD Branch | https://docs.linuxgsm.com/steamcmd/branch @@ -118,7 +118,7 @@ branch="" # Master Server | https://docs.linuxgsm.com/steamcmd/steam-master-server steammaster="true" -# Stop Mode | https://docs.linuxgsm.com/steamcmd/stopmode +## Stop Mode | https://docs.linuxgsm.com/features/stop-mode # 1: tmux kill # 2: CTRL+c # 3: quit @@ -131,7 +131,7 @@ steammaster="true" # 10: Teamspeak 3 stopmode="3" -## LinuxGSM Server Details +## Game Server Details # Do not edit gamename="Blade Symphony" engine="source" @@ -140,7 +140,7 @@ glibc="2.15" #### Directories #### # Edit with care -## Server Specific Directories +## Game Server Directories systemdir="${serverfiles}/berimbau" executabledir="${serverfiles}/bin" executable="./srcds_run.sh" diff --git a/lgsm/config-default/config-lgsm/bt1944server/_default.cfg b/lgsm/config-default/config-lgsm/bt1944server/_default.cfg index 5ea155b17..8a36d1cff 100644 --- a/lgsm/config-default/config-lgsm/bt1944server/_default.cfg +++ b/lgsm/config-default/config-lgsm/bt1944server/_default.cfg @@ -1,12 +1,12 @@ ################################## ######## 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 +# DO NOT EDIT ANY CHANGES 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 #### +#### Game Server Settings #### ## Server Start Settings | https://docs.linuxgsm.com/configuration/start-parameters ip="0.0.0.0" @@ -90,15 +90,15 @@ logdays="7" # Query delay time querydelay="1" -#### LinuxGSM Advanced Settings #### - -# ANSI Colors +## ANSI Colors | https://docs.linuxgsm.com/features/ansi-colors ansi="on" -# Message Display Time +#### Advanced Settings #### + +## Message Display Time | https://docs.linuxgsm.com/features/message-display-time sleeptime="0.5" -## SteamCMD Settings +## SteamCMD Settings | https://docs.linuxgsm.com/steamcmd # Server appid appid="805140" # SteamCMD Branch | https://docs.linuxgsm.com/steamcmd/branch @@ -106,7 +106,7 @@ branch="" # Master Server | https://docs.linuxgsm.com/steamcmd/steam-master-server steammaster="false" -# Stop Mode | https://docs.linuxgsm.com/steamcmd/stopmode +## Stop Mode | https://docs.linuxgsm.com/features/stop-mode # 1: tmux kill # 2: CTRL+c # 3: quit @@ -119,7 +119,7 @@ steammaster="false" # 10: Teamspeak 3 stopmode="2" -## LinuxGSM Server Details +## Game Server Details # Do not edit gamename="Battalion 1944" engine="unreal4" @@ -128,13 +128,13 @@ glibc="2.17" #### Directories #### # Edit with care -## Server Specific Directories +## Game Server Directories systemdir="${serverfiles}/Linux/Battalion" executabledir="${systemdir}/Binaries/Linux" executable="./BattalionServer" -servercfgdir="${systemdir}/Saved/Config/LinuxServer" servercfg="${servicename}.ini" servercfgdefault="DefaultGame.ini" +servercfgdir="${systemdir}/Saved/Config/LinuxServer" servercfgfullpath="${servercfgdir}/${servercfg}" ## Backup Directory diff --git a/lgsm/config-default/config-lgsm/btserver/_default.cfg b/lgsm/config-default/config-lgsm/btserver/_default.cfg index 600e016c7..1bb23e77c 100644 --- a/lgsm/config-default/config-lgsm/btserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/btserver/_default.cfg @@ -1,12 +1,12 @@ ################################## ######## 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 +# DO NOT EDIT ANY CHANGES 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 #### +#### Game Server Settings #### ## Server Start Command | https://docs.linuxgsm.com/configuration/start-parameters#additional-parameters fn_parms(){ @@ -85,15 +85,15 @@ logdays="7" # Query delay time querydelay="1" -#### LinuxGSM Advanced Settings #### - -# ANSI Colors +## ANSI Colors | https://docs.linuxgsm.com/features/ansi-colors ansi="on" -# Message Display Time +#### Advanced Settings #### + +## Message Display Time | https://docs.linuxgsm.com/features/message-display-time sleeptime="0.5" -## SteamCMD Settings +## SteamCMD Settings | https://docs.linuxgsm.com/steamcmd # Server appid appid="1026340" # SteamCMD Branch | https://docs.linuxgsm.com/steamcmd/branch @@ -101,7 +101,7 @@ branch="" # Master Server | https://docs.linuxgsm.com/steamcmd/steam-master-server steammaster="true" -# Stop Mode | https://docs.linuxgsm.com/steamcmd/stopmode +## Stop Mode | https://docs.linuxgsm.com/features/stop-mode # 1: tmux kill # 2: CTRL+c # 3: quit @@ -114,7 +114,7 @@ steammaster="true" # 10: Teamspeak 3 stopmode="7" -## LinuxGSM Server Details +## Game Server Details # Do not edit gamename="Barotrauma" engine="barotrauma" @@ -123,7 +123,7 @@ glibc="2.17" #### Directories #### # Edit with care -## Server Specific Directories +## Game Server Directories systemdir="${serverfiles}" executabledir="${systemdir}" executable="./DedicatedServer.exe" diff --git a/lgsm/config-default/config-lgsm/ccserver/_default.cfg b/lgsm/config-default/config-lgsm/ccserver/_default.cfg index fb6f47507..79cf4a9de 100644 --- a/lgsm/config-default/config-lgsm/ccserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/ccserver/_default.cfg @@ -1,12 +1,12 @@ ################################## ######## 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 +# DO NOT EDIT ANY CHANGES 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 #### +#### Game Server Settings #### ## Server Start Settings | https://docs.linuxgsm.com/configuration/start-parameters ip="0.0.0.0" @@ -93,15 +93,15 @@ logdays="7" # Query delay time querydelay="1" -#### LinuxGSM Advanced Settings #### - -# ANSI Colors +## ANSI Colors | https://docs.linuxgsm.com/features/ansi-colors ansi="on" -# Message Display Time +#### Advanced Settings #### + +## Message Display Time | https://docs.linuxgsm.com/features/message-display-time sleeptime="0.5" -## SteamCMD Settings +## SteamCMD Settings | https://docs.linuxgsm.com/steamcmd # Server appid appid="383410" # SteamCMD Branch | https://docs.linuxgsm.com/steamcmd/branch @@ -109,7 +109,7 @@ branch="" # Master Server | https://docs.linuxgsm.com/steamcmd/steam-master-server steammaster="false" -# Stop Mode | https://docs.linuxgsm.com/steamcmd/stopmode +## Stop Mode | https://docs.linuxgsm.com/features/stop-mode # 1: tmux kill # 2: CTRL+c # 3: quit @@ -122,7 +122,7 @@ steammaster="false" # 10: Teamspeak 3 stopmode="3" -## LinuxGSM Server Details +## Game Server Details # Do not edit gamename="Codename CURE" engine="source" @@ -131,7 +131,7 @@ glibc="2.15" #### Directories #### # Edit with care -## Server Specific Directories +## Game Server Directories systemdir="${serverfiles}/cure" executabledir="${serverfiles}" executable="./srcds_run" diff --git a/lgsm/config-default/config-lgsm/cod2server/_default.cfg b/lgsm/config-default/config-lgsm/cod2server/_default.cfg index 523b61755..daf5093cf 100644 --- a/lgsm/config-default/config-lgsm/cod2server/_default.cfg +++ b/lgsm/config-default/config-lgsm/cod2server/_default.cfg @@ -1,12 +1,12 @@ ################################## ######## 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 +# DO NOT EDIT ANY CHANGES 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 #### +#### Game Server Settings #### ## Server Start Settings | https://docs.linuxgsm.com/configuration/start-parameters ip="0.0.0.0" @@ -88,15 +88,15 @@ logdays="7" # Query delay time querydelay="1" -#### LinuxGSM Advanced Settings #### - -# ANSI Colors +## ANSI Colors | https://docs.linuxgsm.com/features/ansi-colors ansi="on" -# Message Display Time +#### Advanced Settings #### + +## Message Display Time | https://docs.linuxgsm.com/features/message-display-time sleeptime="0.5" -# Stop Mode | https://docs.linuxgsm.com/steamcmd/stopmode +## Stop Mode | https://docs.linuxgsm.com/features/stop-mode # 1: tmux kill # 2: CTRL+c # 3: quit @@ -109,7 +109,7 @@ sleeptime="0.5" # 10: Teamspeak 3 stopmode="3" -## LinuxGSM Server Details +## Game Server Details # Do not edit gamename="Call of Duty 2" engine="iw2.0" @@ -118,7 +118,7 @@ glibc="2.1.3" #### Directories #### # Edit with care -## Server Specific Directories +## Game Server Directories systemdir="${serverfiles}" executabledir="${serverfiles}" executable="./cod2_lnxded" diff --git a/lgsm/config-default/config-lgsm/cod4server/_default.cfg b/lgsm/config-default/config-lgsm/cod4server/_default.cfg index 546ad2b44..9925d3470 100644 --- a/lgsm/config-default/config-lgsm/cod4server/_default.cfg +++ b/lgsm/config-default/config-lgsm/cod4server/_default.cfg @@ -1,12 +1,12 @@ ################################## ######## 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 +# DO NOT EDIT ANY CHANGES 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 #### +#### Game Server Settings #### ## Server Start Settings | https://docs.linuxgsm.com/configuration/start-parameters ip="0.0.0.0" @@ -88,15 +88,15 @@ logdays="7" # Query delay time querydelay="1" -#### LinuxGSM Advanced Settings #### - -# ANSI Colors +## ANSI Colors | https://docs.linuxgsm.com/features/ansi-colors ansi="on" -# Message Display Time +#### Advanced Settings #### + +## Message Display Time | https://docs.linuxgsm.com/features/message-display-time sleeptime="0.5" -# Stop Mode | https://docs.linuxgsm.com/steamcmd/stopmode +## Stop Mode | https://docs.linuxgsm.com/features/stop-mode # 1: tmux kill # 2: CTRL+c # 3: quit @@ -109,7 +109,7 @@ sleeptime="0.5" # 10: Teamspeak 3 stopmode="3" -## LinuxGSM Server Details +## Game Server Details # Do not edit gamename="Call of Duty 4" engine="iw3.0" @@ -118,7 +118,7 @@ glibc="2.12" #### Directories #### # Edit with care -## Server Specific Directories +## Game Server Directories systemdir="${serverfiles}" executabledir="${serverfiles}" executable="./cod4x18_dedrun" diff --git a/lgsm/config-default/config-lgsm/codserver/_default.cfg b/lgsm/config-default/config-lgsm/codserver/_default.cfg index f527bc194..3e14bfc33 100644 --- a/lgsm/config-default/config-lgsm/codserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/codserver/_default.cfg @@ -1,12 +1,12 @@ ################################## ######## 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 +# DO NOT EDIT ANY CHANGES 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 #### +#### Game Server Settings #### ## Server Start Settings | https://docs.linuxgsm.com/configuration/start-parameters ip="0.0.0.0" @@ -88,15 +88,15 @@ logdays="7" # Query delay time querydelay="1" -#### LinuxGSM Advanced Settings #### - -# ANSI Colors +## ANSI Colors | https://docs.linuxgsm.com/features/ansi-colors ansi="on" -# Message Display Time +#### Advanced Settings #### + +## Message Display Time | https://docs.linuxgsm.com/features/message-display-time sleeptime="0.5" -# Stop Mode | https://docs.linuxgsm.com/steamcmd/stopmode +## Stop Mode | https://docs.linuxgsm.com/features/stop-mode # 1: tmux kill # 2: CTRL+c # 3: quit @@ -109,7 +109,7 @@ sleeptime="0.5" # 10: Teamspeak 3 stopmode="3" -## LinuxGSM Server Details +## Game Server Details # Do not edit gamename="Call of Duty" engine="idtech3" @@ -118,7 +118,7 @@ glibc="2.1" #### Directories #### # Edit with care -## Server Specific Directories +## Game Server Directories systemdir="${serverfiles}" executabledir="${serverfiles}" executable="./cod_lnxded" diff --git a/lgsm/config-default/config-lgsm/coduoserver/_default.cfg b/lgsm/config-default/config-lgsm/coduoserver/_default.cfg index cc4109847..8e52f570d 100644 --- a/lgsm/config-default/config-lgsm/coduoserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/coduoserver/_default.cfg @@ -1,12 +1,12 @@ ################################## ######## 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 +# DO NOT EDIT ANY CHANGES 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 #### +#### Game Server Settings #### ## Server Start Settings | https://docs.linuxgsm.com/configuration/start-parameters ip="0.0.0.0" @@ -88,15 +88,15 @@ logdays="7" # Query delay time querydelay="1" -#### LinuxGSM Advanced Settings #### - -# ANSI Colors +## ANSI Colors | https://docs.linuxgsm.com/features/ansi-colors ansi="on" -# Message Display Time +#### Advanced Settings #### + +## Message Display Time | https://docs.linuxgsm.com/features/message-display-time sleeptime="0.5" -# Stop Mode | https://docs.linuxgsm.com/steamcmd/stopmode +## Stop Mode | https://docs.linuxgsm.com/features/stop-mode # 1: tmux kill # 2: CTRL+c # 3: quit @@ -109,7 +109,7 @@ sleeptime="0.5" # 10: Teamspeak 3 stopmode="3" -## LinuxGSM Server Details +## Game Server Details # Do not edit gamename="Call of Duty: United Offensive" engine="idtech3" @@ -118,7 +118,7 @@ glibc="2.1" #### Directories #### # Edit with care -## Server Specific Directories +## Game Server Directories systemdir="${serverfiles}" executabledir="${serverfiles}" executable="./coduo_lnxded" diff --git a/lgsm/config-default/config-lgsm/codwawserver/_default.cfg b/lgsm/config-default/config-lgsm/codwawserver/_default.cfg index 484d64194..fcd502c44 100644 --- a/lgsm/config-default/config-lgsm/codwawserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/codwawserver/_default.cfg @@ -1,12 +1,12 @@ ################################## ######## 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 +# DO NOT EDIT ANY CHANGES 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 #### +#### Game Server Settings #### ## Server Start Settings | https://docs.linuxgsm.com/configuration/start-parameters ip="0.0.0.0" @@ -88,15 +88,15 @@ logdays="7" # Query delay time querydelay="1" -#### LinuxGSM Advanced Settings #### - -# ANSI Colors +## ANSI Colors | https://docs.linuxgsm.com/features/ansi-colors ansi="on" -# Message Display Time +#### Advanced Settings #### + +## Message Display Time | https://docs.linuxgsm.com/features/message-display-time sleeptime="0.5" -# Stop Mode | https://docs.linuxgsm.com/steamcmd/stopmode +## Stop Mode | https://docs.linuxgsm.com/features/stop-mode # 1: tmux kill # 2: CTRL+c # 3: quit @@ -109,7 +109,7 @@ sleeptime="0.5" # 10: Teamspeak 3 stopmode="3" -## LinuxGSM Server Details +## Game Server Details # Do not edit gamename="Call of Duty: World at War" engine="iw3.0" @@ -118,7 +118,7 @@ glibc="2.3.2" #### Directories #### # Edit with care -## Server Specific Directories +## Game Server Directories systemdir="${serverfiles}" executabledir="${serverfiles}" executable="./codwaw_lnxded" diff --git a/lgsm/config-default/config-lgsm/csczserver/_default.cfg b/lgsm/config-default/config-lgsm/csczserver/_default.cfg index 15909d0f9..9fb6c696b 100644 --- a/lgsm/config-default/config-lgsm/csczserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/csczserver/_default.cfg @@ -1,12 +1,12 @@ ################################## ######## 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 +# DO NOT EDIT ANY CHANGES 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 #### +#### Game Server Settings #### ## Server Start Settings | https://docs.linuxgsm.com/configuration/start-parameters ip="0.0.0.0" @@ -92,15 +92,15 @@ logdays="7" # Query delay time querydelay="1" -#### LinuxGSM Advanced Settings #### - -# ANSI Colors +## ANSI Colors | https://docs.linuxgsm.com/features/ansi-colors ansi="on" -# Message Display Time +#### Advanced Settings #### + +## Message Display Time | https://docs.linuxgsm.com/features/message-display-time sleeptime="0.5" -## SteamCMD Settings +## SteamCMD Settings | https://docs.linuxgsm.com/steamcmd # Server appid appid="90" appidmod="czero" @@ -109,7 +109,7 @@ branch="" # Master Server | https://docs.linuxgsm.com/steamcmd/steam-master-server steammaster="true" -# Stop Mode | https://docs.linuxgsm.com/steamcmd/stopmode +## Stop Mode | https://docs.linuxgsm.com/features/stop-mode # 1: tmux kill # 2: CTRL+c # 3: quit @@ -122,7 +122,7 @@ steammaster="true" # 10: Teamspeak 3 stopmode="9" -## LinuxGSM Server Details +## Game Server Details # Do not edit gamename="Counter-Strike: Condition Zero" engine="goldsource" @@ -131,7 +131,7 @@ glibc="2.3.6" #### Directories #### # Edit with care -## Server Specific Directories +## Game Server Directories systemdir="${serverfiles}/czero" executabledir="${serverfiles}" executable="./hlds_run" diff --git a/lgsm/config-default/config-lgsm/csgoserver/_default.cfg b/lgsm/config-default/config-lgsm/csgoserver/_default.cfg index 1358a186c..9aec6066b 100644 --- a/lgsm/config-default/config-lgsm/csgoserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/csgoserver/_default.cfg @@ -1,15 +1,15 @@ ################################## ######## 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 +# DO NOT EDIT ANY CHANGES 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 #### +#### Game Server Settings #### ## Server Start Settings | https://docs.linuxgsm.com/configuration/start-parameters -# https://developer.valvesoftware.com/wiki/Counter-Strike:_Global_Offensive_Dedicated_Servers#Starting_the_Server +# https://docs.linuxgsm.com/game-servers/counter-strike-global-offensive # [Game Modes] gametype gamemode mapgroup (you can mix these across all Game Modes except Danger Zone, but use only one) # Arms Race 1 0 mg_armsrace # Classic Casual 0 0 mg_casualsigma, mg_casualdelta @@ -30,9 +30,9 @@ defaultmap="de_mirage" maxplayers="16" tickrate="64" -## Required: Game Server Login Token +## Game Server Login Token (GSLT): Required # GSLT is required for running a public server. -# More info: https://linuxgsm.com/gslt +# More info: https://docs.linuxgsm.com/steamcmd/gslt gslt="" ## Workshop Parameters | https://developer.valvesoftware.com/wiki/CSGO_Workshop_For_Server_Operators @@ -118,15 +118,15 @@ logdays="7" # Query delay time querydelay="1" -#### LinuxGSM Advanced Settings #### - -# ANSI Colors +## ANSI Colors | https://docs.linuxgsm.com/features/ansi-colors ansi="on" -# Message Display Time +#### Advanced Settings #### + +## Message Display Time | https://docs.linuxgsm.com/features/message-display-time sleeptime="0.5" -## SteamCMD Settings +## SteamCMD Settings | https://docs.linuxgsm.com/steamcmd # Server appid appid="740" # SteamCMD Branch | https://docs.linuxgsm.com/steamcmd/branch @@ -134,7 +134,7 @@ branch="" # Master Server | https://docs.linuxgsm.com/steamcmd/steam-master-server steammaster="true" -# Stop Mode | https://docs.linuxgsm.com/steamcmd/stopmode +## Stop Mode | https://docs.linuxgsm.com/features/stop-mode # 1: tmux kill # 2: CTRL+c # 3: quit @@ -147,7 +147,7 @@ steammaster="true" # 10: Teamspeak 3 stopmode="3" -## LinuxGSM Server Details +## Game Server Details # Do not edit gamename="Counter-Strike: Global Offensive" engine="source" @@ -156,7 +156,7 @@ glibc="2.15" #### Directories #### # Edit with care -## Server Specific Directories +## Game Server Directories systemdir="${serverfiles}/csgo" executabledir="${serverfiles}" executable="./srcds_run" diff --git a/lgsm/config-default/config-lgsm/csserver/_default.cfg b/lgsm/config-default/config-lgsm/csserver/_default.cfg index 7141f33a9..f98851c0b 100644 --- a/lgsm/config-default/config-lgsm/csserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/csserver/_default.cfg @@ -1,12 +1,12 @@ ################################## ######## 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 +# DO NOT EDIT ANY CHANGES 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 #### +#### Game Server Settings #### ## Server Start Settings | https://docs.linuxgsm.com/configuration/start-parameters ip="0.0.0.0" @@ -92,15 +92,15 @@ logdays="7" # Query delay time querydelay="1" -#### LinuxGSM Advanced Settings #### - -# ANSI Colors +## ANSI Colors | https://docs.linuxgsm.com/features/ansi-colors ansi="on" -# Message Display Time +#### Advanced Settings #### + +## Message Display Time | https://docs.linuxgsm.com/features/message-display-time sleeptime="0.5" -## SteamCMD Settings +## SteamCMD Settings | https://docs.linuxgsm.com/steamcmd # Server appid appid="90" appidmod="cstrike" @@ -109,7 +109,7 @@ branch="" # Master Server | https://docs.linuxgsm.com/steamcmd/steam-master-server steammaster="true" -# Stop Mode | https://docs.linuxgsm.com/steamcmd/stopmode +## Stop Mode | https://docs.linuxgsm.com/features/stop-mode # 1: tmux kill # 2: CTRL+c # 3: quit @@ -122,7 +122,7 @@ steammaster="true" # 10: Teamspeak 3 stopmode="9" -## LinuxGSM Server Details +## Game Server Details # Do not edit gamename="Counter-Strike 1.6" engine="goldsource" @@ -131,7 +131,7 @@ glibc="2.3.6" #### Directories #### # Edit with care -## Server Specific Directories +## Game Server Directories systemdir="${serverfiles}/cstrike" executabledir="${serverfiles}" executable="./hlds_run" diff --git a/lgsm/config-default/config-lgsm/cssserver/_default.cfg b/lgsm/config-default/config-lgsm/cssserver/_default.cfg index aa750fe1c..36728fc39 100644 --- a/lgsm/config-default/config-lgsm/cssserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/cssserver/_default.cfg @@ -1,12 +1,12 @@ ################################## ######## 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 +# DO NOT EDIT ANY CHANGES 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 #### +#### Game Server Settings #### ## Server Start Settings | https://docs.linuxgsm.com/configuration/start-parameters ip="0.0.0.0" @@ -16,9 +16,9 @@ sourcetvport="27020" defaultmap="de_dust2" maxplayers="16" -## Required: Game Server Login Token +## Game Server Login Token (GSLT): Required # GSLT is required for running a public server. -# More info: https://linuxgsm.com/gslt +# More info: https://docs.linuxgsm.com/steamcmd/gslt gslt="" ## Server Start Command | https://docs.linuxgsm.com/configuration/start-parameters#additional-parameters @@ -98,15 +98,15 @@ logdays="7" # Query delay time querydelay="1" -#### LinuxGSM Advanced Settings #### - -# ANSI Colors +## ANSI Colors | https://docs.linuxgsm.com/features/ansi-colors ansi="on" -# Message Display Time +#### Advanced Settings #### + +## Message Display Time | https://docs.linuxgsm.com/features/message-display-time sleeptime="0.5" -## SteamCMD Settings +## SteamCMD Settings | https://docs.linuxgsm.com/steamcmd # Server appid appid="232330" # SteamCMD Branch | https://docs.linuxgsm.com/steamcmd/branch @@ -114,7 +114,7 @@ branch="" # Master Server | https://docs.linuxgsm.com/steamcmd/steam-master-server steammaster="true" -# Stop Mode | https://docs.linuxgsm.com/steamcmd/stopmode +## Stop Mode | https://docs.linuxgsm.com/features/stop-mode # 1: tmux kill # 2: CTRL+c # 3: quit @@ -127,7 +127,7 @@ steammaster="true" # 10: Teamspeak 3 stopmode="3" -## LinuxGSM Server Details +## Game Server Details # Do not edit gamename="Counter-Strike: Source" engine="source" @@ -136,7 +136,7 @@ glibc="2.3.6" #### Directories #### # Edit with care -## Server Specific Directories +## Game Server Directories systemdir="${serverfiles}/cstrike" executabledir="${serverfiles}" executable="./srcds_run" diff --git a/lgsm/config-default/config-lgsm/dabserver/_default.cfg b/lgsm/config-default/config-lgsm/dabserver/_default.cfg index e256c2a47..2cb7c139b 100644 --- a/lgsm/config-default/config-lgsm/dabserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/dabserver/_default.cfg @@ -1,12 +1,12 @@ ################################## ######## 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 +# DO NOT EDIT ANY CHANGES 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 #### +#### Game Server Settings #### ## Server Start Settings | https://docs.linuxgsm.com/configuration/start-parameters ip="0.0.0.0" @@ -93,15 +93,15 @@ logdays="7" # Query delay time querydelay="1" -#### LinuxGSM Advanced Settings #### - -# ANSI Colors +## ANSI Colors | https://docs.linuxgsm.com/features/ansi-colors ansi="on" -# Message Display Time +#### Advanced Settings #### + +## Message Display Time | https://docs.linuxgsm.com/features/message-display-time sleeptime="0.5" -## SteamCMD Settings +## SteamCMD Settings | https://docs.linuxgsm.com/steamcmd # Server appid appid="317800" # SteamCMD Branch | https://docs.linuxgsm.com/steamcmd/branch @@ -109,7 +109,7 @@ branch="" # Master Server | https://docs.linuxgsm.com/steamcmd/steam-master-server steammaster="true" -# Stop Mode | https://docs.linuxgsm.com/steamcmd/stopmode +## Stop Mode | https://docs.linuxgsm.com/features/stop-mode # 1: tmux kill # 2: CTRL+c # 3: quit @@ -122,7 +122,7 @@ steammaster="true" # 10: Teamspeak 3 stopmode="3" -## LinuxGSM Server Details +## Game Server Details # Do not edit gamename="Double Action: Boogaloo" engine="source" @@ -131,7 +131,7 @@ glibc="2.15" #### Directories #### # Edit with care -## Server Specific Directories +## Game Server Directories systemdir="${serverfiles}/dab" executabledir="${serverfiles}" executable="./dabds.sh" diff --git a/lgsm/config-default/config-lgsm/dmcserver/_default.cfg b/lgsm/config-default/config-lgsm/dmcserver/_default.cfg index 779f33632..7b4a02231 100644 --- a/lgsm/config-default/config-lgsm/dmcserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/dmcserver/_default.cfg @@ -1,12 +1,12 @@ ################################## ######## 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 +# DO NOT EDIT ANY CHANGES 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 #### +#### Game Server Settings #### ## Server Start Settings | https://docs.linuxgsm.com/configuration/start-parameters ip="0.0.0.0" @@ -92,15 +92,15 @@ logdays="7" # Query delay time querydelay="1" -#### LinuxGSM Advanced Settings #### - -# ANSI Colors +## ANSI Colors | https://docs.linuxgsm.com/features/ansi-colors ansi="on" -# Message Display Time +#### Advanced Settings #### + +## Message Display Time | https://docs.linuxgsm.com/features/message-display-time sleeptime="0.5" -## SteamCMD Settings +## SteamCMD Settings | https://docs.linuxgsm.com/steamcmd # Server appid appid="90" appidmod="dmc" @@ -109,7 +109,7 @@ branch="" # Master Server | https://docs.linuxgsm.com/steamcmd/steam-master-server steammaster="true" -# Stop Mode | https://docs.linuxgsm.com/steamcmd/stopmode +## Stop Mode | https://docs.linuxgsm.com/features/stop-mode # 1: tmux kill # 2: CTRL+c # 3: quit @@ -122,7 +122,7 @@ steammaster="true" # 10: Teamspeak 3 stopmode="9" -## LinuxGSM Server Details +## Game Server Details # Do not edit gamename="Deathmatch Classic" engine="goldsource" @@ -131,7 +131,7 @@ glibc="2.3.4" #### Directories #### # Edit with care -## Server Specific Directories +## Game Server Directories systemdir="${serverfiles}/dmc" executabledir="${serverfiles}" executable="./hlds_run" diff --git a/lgsm/config-default/config-lgsm/dodserver/_default.cfg b/lgsm/config-default/config-lgsm/dodserver/_default.cfg index 2c47d5501..57996d3ae 100644 --- a/lgsm/config-default/config-lgsm/dodserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/dodserver/_default.cfg @@ -1,12 +1,12 @@ ################################## ######## 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 +# DO NOT EDIT ANY CHANGES 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 #### +#### Game Server Settings #### ## Server Start Settings | https://docs.linuxgsm.com/configuration/start-parameters ip="0.0.0.0" @@ -92,15 +92,15 @@ logdays="7" # Query delay time querydelay="1" -#### LinuxGSM Advanced Settings #### - -# ANSI Colors +## ANSI Colors | https://docs.linuxgsm.com/features/ansi-colors ansi="on" -# Message Display Time +#### Advanced Settings #### + +## Message Display Time | https://docs.linuxgsm.com/features/message-display-time sleeptime="0.5" -## SteamCMD Settings +## SteamCMD Settings | https://docs.linuxgsm.com/steamcmd # Server appid appid="90" appidmod="dod" @@ -109,7 +109,7 @@ branch="" # Master Server | https://docs.linuxgsm.com/steamcmd/steam-master-server steammaster="true" -# Stop Mode | https://docs.linuxgsm.com/steamcmd/stopmode +## Stop Mode | https://docs.linuxgsm.com/features/stop-mode # 1: tmux kill # 2: CTRL+c # 3: quit @@ -122,7 +122,7 @@ steammaster="true" # 10: Teamspeak 3 stopmode="9" -## LinuxGSM Server Details +## Game Server Details # Do not edit gamename="Day of Defeat" engine="goldsource" @@ -131,7 +131,7 @@ glibc="2.3.4" #### Directories #### # Edit with care -## Server Specific Directories +## Game Server Directories systemdir="${serverfiles}/dod" executabledir="${serverfiles}" executable="./hlds_run" diff --git a/lgsm/config-default/config-lgsm/dodsserver/_default.cfg b/lgsm/config-default/config-lgsm/dodsserver/_default.cfg index 83ba5072a..cda770f33 100644 --- a/lgsm/config-default/config-lgsm/dodsserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/dodsserver/_default.cfg @@ -1,12 +1,12 @@ ################################## ######## 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 +# DO NOT EDIT ANY CHANGES 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 #### +#### Game Server Settings #### ## Server Start Settings | https://docs.linuxgsm.com/configuration/start-parameters ip="0.0.0.0" @@ -93,15 +93,15 @@ logdays="7" # Query delay time querydelay="1" -#### LinuxGSM Advanced Settings #### - -# ANSI Colors +## ANSI Colors | https://docs.linuxgsm.com/features/ansi-colors ansi="on" -# Message Display Time +#### Advanced Settings #### + +## Message Display Time | https://docs.linuxgsm.com/features/message-display-time sleeptime="0.5" -## SteamCMD Settings +## SteamCMD Settings | https://docs.linuxgsm.com/steamcmd # Server appid appid="232290" # SteamCMD Branch | https://docs.linuxgsm.com/steamcmd/branch @@ -109,7 +109,7 @@ branch="" # Master Server | https://docs.linuxgsm.com/steamcmd/steam-master-server steammaster="true" -# Stop Mode | https://docs.linuxgsm.com/steamcmd/stopmode +## Stop Mode | https://docs.linuxgsm.com/features/stop-mode # 1: tmux kill # 2: CTRL+c # 3: quit @@ -122,7 +122,7 @@ steammaster="true" # 10: Teamspeak 3 stopmode="3" -## LinuxGSM Server Details +## Game Server Details # Do not edit gamename="Day of Defeat: Source" engine="source" @@ -131,7 +131,7 @@ glibc="2.3.6" #### Directories #### # Edit with care -## Server Specific Directories +## Game Server Directories systemdir="${serverfiles}/dod" executabledir="${serverfiles}" executable="./srcds_run" diff --git a/lgsm/config-default/config-lgsm/doiserver/_default.cfg b/lgsm/config-default/config-lgsm/doiserver/_default.cfg index f74935f60..3ffbf2829 100644 --- a/lgsm/config-default/config-lgsm/doiserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/doiserver/_default.cfg @@ -1,12 +1,12 @@ ################################## ######## 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 +# DO NOT EDIT ANY CHANGES 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 #### +#### Game Server Settings #### ## Server Start Settings | https://docs.linuxgsm.com/configuration/start-parameters ip="0.0.0.0" @@ -94,15 +94,15 @@ logdays="7" # Query delay time querydelay="1" -#### LinuxGSM Advanced Settings #### - -# ANSI Colors +## ANSI Colors | https://docs.linuxgsm.com/features/ansi-colors ansi="on" -# Message Display Time +#### Advanced Settings #### + +## Message Display Time | https://docs.linuxgsm.com/features/message-display-time sleeptime="0.5" -## SteamCMD Settings +## SteamCMD Settings | https://docs.linuxgsm.com/steamcmd # Server appid appid="462310" # SteamCMD Branch | https://docs.linuxgsm.com/steamcmd/branch @@ -110,7 +110,7 @@ branch="" # Master Server | https://docs.linuxgsm.com/steamcmd/steam-master-server steammaster="true" -# Stop Mode | https://docs.linuxgsm.com/steamcmd/stopmode +## Stop Mode | https://docs.linuxgsm.com/features/stop-mode # 1: tmux kill # 2: CTRL+c # 3: quit @@ -123,7 +123,7 @@ steammaster="true" # 10: Teamspeak 3 stopmode="3" -## LinuxGSM Server Details +## Game Server Details # Do not edit gamename="Day of Infamy" engine="source" @@ -132,7 +132,7 @@ glibc="2.15" #### Directories #### # Edit with care -## Server Specific Directories +## Game Server Directories systemdir="${serverfiles}/doi" executabledir="${serverfiles}" executable="./srcds_run" @@ -147,6 +147,7 @@ backupdir="${lgsmdir}/backup" ## Logging Directories logdir="${rootdir}/log" gamelogdir="${systemdir}/logs" +lgsmlogdir="${logdir}/script" consolelogdir="${logdir}/console" lgsmlog="${lgsmlogdir}/${servicename}-script.log" consolelog="${consolelogdir}/${servicename}-console.log" diff --git a/lgsm/config-default/config-lgsm/dstserver/_default.cfg b/lgsm/config-default/config-lgsm/dstserver/_default.cfg index fc054e87d..b90e98e6e 100644 --- a/lgsm/config-default/config-lgsm/dstserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/dstserver/_default.cfg @@ -1,12 +1,12 @@ ################################## ######## 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 +# DO NOT EDIT ANY CHANGES 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 #### +#### Game Server Settings #### ## Installation Variables | https://docs.linuxgsm.com/game-servers/dont-starve-together sharding="false" @@ -96,15 +96,15 @@ logdays="7" # Query delay time querydelay="1" -#### LinuxGSM Advanced Settings #### - -# ANSI Colors +## ANSI Colors | https://docs.linuxgsm.com/features/ansi-colors ansi="on" -# Message Display Time +#### Advanced Settings #### + +## Message Display Time | https://docs.linuxgsm.com/features/message-display-time sleeptime="0.5" -## SteamCMD Settings +## SteamCMD Settings | https://docs.linuxgsm.com/steamcmd # Server appid appid="343050" # SteamCMD Branch | https://docs.linuxgsm.com/steamcmd/branch @@ -112,7 +112,7 @@ branch="" # Master Server | https://docs.linuxgsm.com/steamcmd/steam-master-server steammaster="false" -# Stop Mode | https://docs.linuxgsm.com/steamcmd/stopmode +## Stop Mode | https://docs.linuxgsm.com/features/stop-mode # 1: tmux kill # 2: CTRL+c # 3: quit @@ -125,7 +125,7 @@ steammaster="false" # 10: Teamspeak 3 stopmode="2" -## LinuxGSM Server Details +## Game Server Details # Do not edit gamename="Don't Starve Together" engine="dontstarve" @@ -137,18 +137,18 @@ servicename="dst-server-${shard}" #### Directories #### # Edit with care -## Server Specific Directories +## Game Server Directories systemdir="${serverfiles}" executabledir="${serverfiles}/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" +clustercfg="cluster.ini" +clustercfgdir="${persistentstorageroot}/${confdir}/${cluster}" +clustercfgfullpath="${clustercfgdir}/${clustercfg}" +clustercfgdefault="cluster.ini" ## Backup Directory backupdir="${lgsmdir}/backup" diff --git a/lgsm/config-default/config-lgsm/dysserver/_default.cfg b/lgsm/config-default/config-lgsm/dysserver/_default.cfg index 717c17078..7b43e81ed 100644 --- a/lgsm/config-default/config-lgsm/dysserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/dysserver/_default.cfg @@ -1,12 +1,12 @@ ################################## ######## 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 +# DO NOT EDIT ANY CHANGES 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 #### +#### Game Server Settings #### ## Server Start Settings | https://docs.linuxgsm.com/configuration/start-parameters ip="0.0.0.0" @@ -16,9 +16,9 @@ sourcetvport="27020" defaultmap="dys_broadcast" maxplayers="16" -## Optional: Game Server Login Token +## Game Server Login Token (GSLT): Optional # GSLT can be used for running a public server. -# More info: https://linuxgsm.com/gslt +# More info: https://docs.linuxgsm.com/steamcmd/gslt gslt="" ## Server Start Command | https://docs.linuxgsm.com/configuration/start-parameters#additional-parameters @@ -98,15 +98,15 @@ logdays="7" # Query delay time querydelay="1" -#### LinuxGSM Advanced Settings #### - -# ANSI Colors +## ANSI Colors | https://docs.linuxgsm.com/features/ansi-colors ansi="on" -# Message Display Time +#### Advanced Settings #### + +## Message Display Time | https://docs.linuxgsm.com/features/message-display-time sleeptime="0.5" -## SteamCMD Settings +## SteamCMD Settings | https://docs.linuxgsm.com/steamcmd # Server appid appid="17585" # SteamCMD Branch | https://docs.linuxgsm.com/steamcmd/branch @@ -114,7 +114,7 @@ branch="" # Master Server | https://docs.linuxgsm.com/steamcmd/steam-master-server steammaster="true" -# Stop Mode | https://docs.linuxgsm.com/steamcmd/stopmode +## Stop Mode | https://docs.linuxgsm.com/features/stop-mode # 1: tmux kill # 2: CTRL+c # 3: quit @@ -127,7 +127,7 @@ steammaster="true" # 10: Teamspeak 3 stopmode="3" -## LinuxGSM Server Details +## Game Server Details # Do not edit gamename="Dystopia" engine="source" @@ -136,7 +136,7 @@ glibc="2.15" #### Directories #### # Edit with care -## Server Specific Directories +## Game Server Directories systemdir="${serverfiles}/dystopia" executabledir="${serverfiles}/bin" executable="./srcds_run.sh" diff --git a/lgsm/config-default/config-lgsm/ecoserver/_default.cfg b/lgsm/config-default/config-lgsm/ecoserver/_default.cfg index 4d2e15d7c..7123bfab4 100644 --- a/lgsm/config-default/config-lgsm/ecoserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/ecoserver/_default.cfg @@ -1,12 +1,12 @@ ################################## ######## 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 +# DO NOT EDIT ANY CHANGES 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 #### +#### Game Server Settings #### ## Server Start Command | https://docs.linuxgsm.com/configuration/start-parameters#additional-parameters fn_parms(){ @@ -61,9 +61,13 @@ slackalert="off" slackwebhook="webhook" # Telegram Alerts | https://docs.linuxgsm.com/alerts/telegram +# You can add a custom cURL string eg proxy (useful in Russia) or else in "curlcustomstring". +# like a "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help", if you not need +# any custom string in curl - simple ignore this parameter. telegramalert="off" telegramtoken="accesstoken" telegramchatid="" +curlcustomstring="" ## Updating | https://docs.linuxgsm.com/commands/update updateonstart="off" @@ -81,15 +85,15 @@ logdays="7" # Query delay time querydelay="1" -#### LinuxGSM Advanced Settings #### - -# ANSI Colors +## ANSI Colors | https://docs.linuxgsm.com/features/ansi-colors ansi="on" -# Message Display Time +#### Advanced Settings #### + +## Message Display Time | https://docs.linuxgsm.com/features/message-display-time sleeptime="0.5" -## SteamCMD Settings +## SteamCMD Settings | https://docs.linuxgsm.com/steamcmd # Server appid appid="739590" # SteamCMD Branch | https://docs.linuxgsm.com/steamcmd/branch @@ -97,7 +101,7 @@ branch="" # Master Server | https://docs.linuxgsm.com/steamcmd/steam-master-server steammaster="false" -# Stop Mode | https://docs.linuxgsm.com/steamcmd/stopmode +## Stop Mode | https://docs.linuxgsm.com/features/stop-mode # 1: tmux kill # 2: CTRL+c # 3: quit @@ -110,7 +114,7 @@ steammaster="false" # 10: Teamspeak 3 stopmode="2" -## LinuxGSM Server Details +## Game Server Details # Do not edit gamename="Eco" engine="unity3d" @@ -119,7 +123,7 @@ glibc="null" #### Directories #### # Edit with care -## Server Specific Directories +## Game Server Directories systemdir="${serverfiles}" executabledir="${serverfiles}" executable="mono ./EcoServer.exe" diff --git a/lgsm/config-default/config-lgsm/emserver/_default.cfg b/lgsm/config-default/config-lgsm/emserver/_default.cfg index a33e7f71a..16fa4faae 100644 --- a/lgsm/config-default/config-lgsm/emserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/emserver/_default.cfg @@ -1,12 +1,12 @@ ################################## ######## 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 +# DO NOT EDIT ANY CHANGES 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 #### +#### Game Server Settings #### ## Server Start Settings | https://docs.linuxgsm.com/configuration/start-parameters ip="0.0.0.0" @@ -16,9 +16,9 @@ sourcetvport="27020" defaultmap="emp_district" maxplayers="62" -## Optional: Game Server Login Token +## Game Server Login Token (GSLT): Optional # GSLT can be used for running a public server. -# More info: https://linuxgsm.com/gslt +# More info: https://docs.linuxgsm.com/steamcmd/gslt gslt="" ## Server Start Command | https://docs.linuxgsm.com/configuration/start-parameters#additional-parameters @@ -98,15 +98,15 @@ logdays="7" # Query delay time querydelay="1" -#### LinuxGSM Advanced Settings #### - -# ANSI Colors +## ANSI Colors | https://docs.linuxgsm.com/features/ansi-colors ansi="on" -# Message Display Time +#### Advanced Settings #### + +## Message Display Time | https://docs.linuxgsm.com/features/message-display-time sleeptime="0.5" -## SteamCMD Settings +## SteamCMD Settings | https://docs.linuxgsm.com/steamcmd # Server appid appid="460040" # SteamCMD Branch | https://docs.linuxgsm.com/steamcmd/branch @@ -114,7 +114,7 @@ branch="" # Master Server | https://docs.linuxgsm.com/steamcmd/steam-master-server steammaster="true" -# Stop Mode | https://docs.linuxgsm.com/steamcmd/stopmode +## Stop Mode | https://docs.linuxgsm.com/features/stop-mode # 1: tmux kill # 2: CTRL+c # 3: quit @@ -127,7 +127,7 @@ steammaster="true" # 10: Teamspeak 3 stopmode="3" -## LinuxGSM Server Details +## Game Server Details # Do not edit gamename="Empires Mod" engine="source" @@ -136,7 +136,7 @@ glibc="2.15" #### Directories #### # Edit with care -## Server Specific Directories +## Game Server Directories systemdir="${serverfiles}/empires" executabledir="${serverfiles}" executable="./srcds_run" diff --git a/lgsm/config-default/config-lgsm/etlserver/_default.cfg b/lgsm/config-default/config-lgsm/etlserver/_default.cfg index 6c6a50734..d0b2653b7 100644 --- a/lgsm/config-default/config-lgsm/etlserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/etlserver/_default.cfg @@ -1,12 +1,12 @@ ################################## ######## 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 +# DO NOT EDIT ANY CHANGES 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 #### +#### Game Server Settings #### ## Server Start Command | https://docs.linuxgsm.com/configuration/start-parameters#additional-parameters fn_parms(){ @@ -82,15 +82,15 @@ logdays="7" # Query delay time querydelay="1" -#### LinuxGSM Advanced Settings #### - -# ANSI Colors +## ANSI Colors | https://docs.linuxgsm.com/features/ansi-colors ansi="on" -# Message Display Time +#### Advanced Settings #### + +## Message Display Time | https://docs.linuxgsm.com/features/message-display-time sleeptime="0.5" -# Stop Mode | https://docs.linuxgsm.com/steamcmd/stopmode +## Stop Mode | https://docs.linuxgsm.com/features/stop-mode # 1: tmux kill # 2: CTRL+c # 3: quit @@ -103,7 +103,7 @@ sleeptime="0.5" # 10: Teamspeak 3 stopmode="3" -## LinuxGSM Server Details +## Game Server Details # Do not edit gamename="ET: Legacy" engine="idtech3" @@ -112,7 +112,7 @@ glibc="2.7" #### Directories #### # Edit with care -## Server Specific Directories +## Game Server Directories systemdir="${serverfiles}" executabledir="${systemdir}" executable="./etlded" diff --git a/lgsm/config-default/config-lgsm/fctrserver/_default.cfg b/lgsm/config-default/config-lgsm/fctrserver/_default.cfg index da4f64da8..2dfa3ff21 100644 --- a/lgsm/config-default/config-lgsm/fctrserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/fctrserver/_default.cfg @@ -1,12 +1,12 @@ ################################## ######## 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 +# DO NOT EDIT ANY CHANGES 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 #### +#### Game Server Settings #### ## Server Start Settings | https://docs.linuxgsm.com/configuration/start-parameters ip="0.0.0.0" @@ -93,15 +93,15 @@ logdays="7" # Query delay time querydelay="1" -#### LinuxGSM Advanced Settings #### - -# ANSI Colors +## ANSI Colors | https://docs.linuxgsm.com/features/ansi-colors ansi="on" -# Message Display Time +#### Advanced Settings #### + +## Message Display Time | https://docs.linuxgsm.com/features/message-display-time sleeptime="0.5" -# Stop Mode | https://docs.linuxgsm.com/steamcmd/stopmode +## Stop Mode | https://docs.linuxgsm.com/features/stop-mode # 1: tmux kill # 2: CTRL+c # 3: quit @@ -114,7 +114,7 @@ sleeptime="0.5" # 10: Teamspeak 3 stopmode="2" -## LinuxGSM Server Details +## Game Server Details # Do not edit gamename="Factorio" engine="factorio" @@ -123,7 +123,7 @@ glibc="2.18" #### Directories #### # Edit with care -## Server Specific Directories +## Game Server Directories systemdir="${serverfiles}" executabledir="${serverfiles}/bin/x64" executable="./factorio" @@ -136,6 +136,7 @@ servercfgfullpath="${servercfgdir}/${servercfg}" backupdir="${lgsmdir}/backup" ## Logging Directories +logdir="${rootdir}/log" gamelogdir="${serverfiles}" lgsmlogdir="${logdir}/script" consolelogdir="${logdir}/console" diff --git a/lgsm/config-default/config-lgsm/fofserver/_default.cfg b/lgsm/config-default/config-lgsm/fofserver/_default.cfg index d78916c6f..9224a2268 100644 --- a/lgsm/config-default/config-lgsm/fofserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/fofserver/_default.cfg @@ -1,12 +1,12 @@ ################################## ######## 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 +# DO NOT EDIT ANY CHANGES 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 #### +#### Game Server Settings #### ## Server Start Settings | https://docs.linuxgsm.com/configuration/start-parameters ip="0.0.0.0" @@ -93,15 +93,15 @@ logdays="7" # Query delay time querydelay="1" -#### LinuxGSM Advanced Settings #### - -# ANSI Colors +## ANSI Colors | https://docs.linuxgsm.com/features/ansi-colors ansi="on" -# Message Display Time +#### Advanced Settings #### + +## Message Display Time | https://docs.linuxgsm.com/features/message-display-time sleeptime="0.5" -## SteamCMD Settings +## SteamCMD Settings | https://docs.linuxgsm.com/steamcmd # Server appid appid="295230" # SteamCMD Branch | https://docs.linuxgsm.com/steamcmd/branch @@ -109,7 +109,7 @@ branch="" # Master Server | https://docs.linuxgsm.com/steamcmd/steam-master-server steammaster="true" -# Stop Mode | https://docs.linuxgsm.com/steamcmd/stopmode +## Stop Mode | https://docs.linuxgsm.com/features/stop-mode # 1: tmux kill # 2: CTRL+c # 3: quit @@ -122,7 +122,7 @@ steammaster="true" # 10: Teamspeak 3 stopmode="3" -## LinuxGSM Server Details +## Game Server Details # Do not edit gamename="Fistful of Frags" engine="source" @@ -131,7 +131,7 @@ glibc="2.15" #### Directories #### # Edit with care -## Server Specific Directories +## Game Server Directories systemdir="${serverfiles}/fof" executabledir="${serverfiles}" executable="./srcds_run" diff --git a/lgsm/config-default/config-lgsm/gesserver/_default.cfg b/lgsm/config-default/config-lgsm/gesserver/_default.cfg index 08adc02aa..52e2c38e5 100644 --- a/lgsm/config-default/config-lgsm/gesserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/gesserver/_default.cfg @@ -1,12 +1,12 @@ ################################## ######## 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 +# DO NOT EDIT ANY CHANGES 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 #### +#### Game Server Settings #### ## Server Start Settings | https://docs.linuxgsm.com/configuration/start-parameters ip="0.0.0.0" @@ -93,15 +93,15 @@ logdays="7" # Query delay time querydelay="1" -#### LinuxGSM Advanced Settings #### - -# ANSI Colors +## ANSI Colors | https://docs.linuxgsm.com/features/ansi-colors ansi="on" -# Message Display Time +#### Advanced Settings #### + +## Message Display Time | https://docs.linuxgsm.com/features/message-display-time sleeptime="0.5" -## SteamCMD Settings +## SteamCMD Settings | https://docs.linuxgsm.com/steamcmd # Server appid appid="310" # Source 2007 SDK # SteamCMD Branch | https://docs.linuxgsm.com/steamcmd/branch @@ -109,7 +109,7 @@ branch="" # Master Server | https://docs.linuxgsm.com/steamcmd/steam-master-server steammaster="true" -# Stop Mode | https://docs.linuxgsm.com/steamcmd/stopmode +## Stop Mode | https://docs.linuxgsm.com/features/stop-mode # 1: tmux kill # 2: CTRL+c # 3: quit @@ -122,7 +122,7 @@ steammaster="true" # 10: Teamspeak 3 stopmode="3" -## LinuxGSM Server Details +## Game Server Details # Do not edit gamename="GoldenEye: Source" engine="source" @@ -131,7 +131,7 @@ glibc="2.15" #### Directories #### # Edit with care -## Server Specific Directories +## Game Server Directories systemdir="${serverfiles}/gesource" executabledir="${serverfiles}" executable="./srcds_run" diff --git a/lgsm/config-default/config-lgsm/gmodserver/_default.cfg b/lgsm/config-default/config-lgsm/gmodserver/_default.cfg index 06c92867d..31144cb68 100644 --- a/lgsm/config-default/config-lgsm/gmodserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/gmodserver/_default.cfg @@ -1,12 +1,12 @@ ################################## ######## 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 +# DO NOT EDIT ANY CHANGES 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 #### +#### Game Server Settings #### ## Server Start Settings | https://docs.linuxgsm.com/configuration/start-parameters ip="0.0.0.0" @@ -27,9 +27,9 @@ wscollectionid="" # Default -disableluarefresh, disables lua autorefresh reducing server lag. Auto refresh only useful for developers. customparms="-disableluarefresh" -## Optional: Game Server Login Token +## Game Server Login Token (GSLT): Optional # GSLT can be used for running a public server. -# More info: https://linuxgsm.com/gslt +# More info: https://docs.linuxgsm.com/steamcmd/gslt gslt="" ## Server Start Command | https://docs.linuxgsm.com/configuration/start-parameters#additional-parameters @@ -109,15 +109,15 @@ logdays="7" # Query delay time querydelay="5" -#### LinuxGSM Advanced Settings #### - -# ANSI Colors +## ANSI Colors | https://docs.linuxgsm.com/features/ansi-colors ansi="on" -# Message Display Time +#### Advanced Settings #### + +## Message Display Time | https://docs.linuxgsm.com/features/message-display-time sleeptime="0.5" -## SteamCMD Settings +## SteamCMD Settings | https://docs.linuxgsm.com/steamcmd # Server appid appid="4020" # SteamCMD Branch | https://docs.linuxgsm.com/steamcmd/branch @@ -125,7 +125,7 @@ branch="" # Master Server | https://docs.linuxgsm.com/steamcmd/steam-master-server steammaster="true" -# Stop Mode | https://docs.linuxgsm.com/steamcmd/stopmode +## Stop Mode | https://docs.linuxgsm.com/features/stop-mode # 1: tmux kill # 2: CTRL+c # 3: quit @@ -138,7 +138,7 @@ steammaster="true" # 10: Teamspeak 3 stopmode="3" -## LinuxGSM Server Details +## Game Server Details # Do not edit gamename="Garry's Mod" engine="source" @@ -147,7 +147,7 @@ glibc="2.15" #### Directories #### # Edit with care -## Server Specific Directories +## Game Server Directories systemdir="${serverfiles}/garrysmod" addonsdir="${systemdir}/addons" executabledir="${serverfiles}" diff --git a/lgsm/config-default/config-lgsm/hl2dmserver/_default.cfg b/lgsm/config-default/config-lgsm/hl2dmserver/_default.cfg index c710cbb62..94eadaefc 100644 --- a/lgsm/config-default/config-lgsm/hl2dmserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/hl2dmserver/_default.cfg @@ -1,12 +1,12 @@ ################################## ######## 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 +# DO NOT EDIT ANY CHANGES 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 #### +#### Game Server Settings #### ## Server Start Settings | https://docs.linuxgsm.com/configuration/start-parameters ip="0.0.0.0" @@ -93,15 +93,15 @@ logdays="7" # Query delay time querydelay="1" -#### LinuxGSM Advanced Settings #### - -# ANSI Colors +## ANSI Colors | https://docs.linuxgsm.com/features/ansi-colors ansi="on" -# Message Display Time +#### Advanced Settings #### + +## Message Display Time | https://docs.linuxgsm.com/features/message-display-time sleeptime="0.5" -## SteamCMD Settings +## SteamCMD Settings | https://docs.linuxgsm.com/steamcmd # Server appid appid="232370" # SteamCMD Branch | https://docs.linuxgsm.com/steamcmd/branch @@ -109,7 +109,7 @@ branch="" # Master Server | https://docs.linuxgsm.com/steamcmd/steam-master-server steammaster="true" -# Stop Mode | https://docs.linuxgsm.com/steamcmd/stopmode +## Stop Mode | https://docs.linuxgsm.com/features/stop-mode # 1: tmux kill # 2: CTRL+c # 3: quit @@ -122,7 +122,7 @@ steammaster="true" # 10: Teamspeak 3 stopmode="3" -## LinuxGSM Server Details +## Game Server Details # Do not edit gamename="Half Life 2: Deathmatch" engine="source" @@ -131,7 +131,7 @@ glibc="2.3.6" #### Directories #### # Edit with care -## Server Specific Directories +## Game Server Directories systemdir="${serverfiles}/hl2mp" executabledir="${serverfiles}" executable="./srcds_run" diff --git a/lgsm/config-default/config-lgsm/hldmserver/_default.cfg b/lgsm/config-default/config-lgsm/hldmserver/_default.cfg index eddf8143b..3d456656b 100644 --- a/lgsm/config-default/config-lgsm/hldmserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/hldmserver/_default.cfg @@ -1,12 +1,12 @@ ################################## ######## 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 +# DO NOT EDIT ANY CHANGES 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 #### +#### Game Server Settings #### ## Server Start Settings | https://docs.linuxgsm.com/configuration/start-parameters ip="0.0.0.0" @@ -92,15 +92,15 @@ logdays="7" # Query delay time querydelay="1" -#### LinuxGSM Advanced Settings #### - -# ANSI Colors +## ANSI Colors | https://docs.linuxgsm.com/features/ansi-colors ansi="on" -# Message Display Time +#### Advanced Settings #### + +## Message Display Time | https://docs.linuxgsm.com/features/message-display-time sleeptime="0.5" -## SteamCMD Settings +## SteamCMD Settings | https://docs.linuxgsm.com/steamcmd # Server appid appid="90" # SteamCMD Branch | https://docs.linuxgsm.com/steamcmd/branch @@ -108,7 +108,7 @@ branch="" # Master Server | https://docs.linuxgsm.com/steamcmd/steam-master-server steammaster="true" -# Stop Mode | https://docs.linuxgsm.com/steamcmd/stopmode +## Stop Mode | https://docs.linuxgsm.com/features/stop-mode # 1: tmux kill # 2: CTRL+c # 3: quit @@ -121,7 +121,7 @@ steammaster="true" # 10: Teamspeak 3 stopmode="9" -## LinuxGSM Server Details +## Game Server Details # Do not edit gamename="Half Life: Deathmatch" engine="goldsource" @@ -130,7 +130,7 @@ glibc="2.3.4" #### Directories #### # Edit with care -## Server Specific Directories +## Game Server Directories systemdir="${serverfiles}/valve" executabledir="${serverfiles}" executable="./hlds_run" diff --git a/lgsm/config-default/config-lgsm/hldmsserver/_default.cfg b/lgsm/config-default/config-lgsm/hldmsserver/_default.cfg index 77b164052..79c548834 100644 --- a/lgsm/config-default/config-lgsm/hldmsserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/hldmsserver/_default.cfg @@ -1,12 +1,12 @@ ################################## ######## 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 +# DO NOT EDIT ANY CHANGES 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 #### +#### Game Server Settings #### ## Server Start Settings | https://docs.linuxgsm.com/configuration/start-parameters ip="0.0.0.0" @@ -93,15 +93,15 @@ logdays="7" # Query delay time querydelay="1" -#### LinuxGSM Advanced Settings #### - -# ANSI Colors +## ANSI Colors | https://docs.linuxgsm.com/features/ansi-colors ansi="on" -# Message Display Time +#### Advanced Settings #### + +## Message Display Time | https://docs.linuxgsm.com/features/message-display-time sleeptime="0.5" -## SteamCMD Settings +## SteamCMD Settings | https://docs.linuxgsm.com/steamcmd # Server appid appid="255470" # SteamCMD Branch | https://docs.linuxgsm.com/steamcmd/branch @@ -109,7 +109,7 @@ branch="" # Master Server | https://docs.linuxgsm.com/steamcmd/steam-master-server steammaster="true" -# Stop Mode | https://docs.linuxgsm.com/steamcmd/stopmode +## Stop Mode | https://docs.linuxgsm.com/features/stop-mode # 1: tmux kill # 2: CTRL+c # 3: quit @@ -122,7 +122,7 @@ steammaster="true" # 10: Teamspeak 3 stopmode="3" -## LinuxGSM Server Details +## Game Server Details # Do not edit gamename="Half-Life Deathmatch: Source" engine="source" @@ -131,7 +131,7 @@ glibc="2.3.6" #### Directories #### # Edit with care -## Server Specific Directories +## Game Server Directories systemdir="${serverfiles}/hl1mp" executabledir="${serverfiles}" executable="./srcds_run" diff --git a/lgsm/config-default/config-lgsm/hwserver/_default.cfg b/lgsm/config-default/config-lgsm/hwserver/_default.cfg index 70e55e792..fc61ba85f 100644 --- a/lgsm/config-default/config-lgsm/hwserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/hwserver/_default.cfg @@ -1,12 +1,12 @@ ################################## ######## 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 +# DO NOT EDIT ANY CHANGES 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 #### +#### Game Server Settings #### ## Server Start Settings | https://docs.linuxgsm.com/configuration/start-parameters servername="LinuxGSM Server" @@ -104,15 +104,15 @@ logdays="7" # Query delay time querydelay="1" -#### LinuxGSM Advanced Settings #### - -# ANSI Colors +## ANSI Colors | https://docs.linuxgsm.com/features/ansi-colors ansi="on" -# Message Display Time +#### Advanced Settings #### + +## Message Display Time | https://docs.linuxgsm.com/features/message-display-time sleeptime="0.5" -## SteamCMD Settings +## SteamCMD Settings | https://docs.linuxgsm.com/steamcmd # Server appid appid="405100" # SteamCMD Branch | https://docs.linuxgsm.com/steamcmd/branch @@ -120,7 +120,7 @@ branch="" # Master Server | https://docs.linuxgsm.com/steamcmd/steam-master-server steammaster="false" -# Stop Mode | https://docs.linuxgsm.com/steamcmd/stopmode +## Stop Mode | https://docs.linuxgsm.com/features/stop-mode # 1: tmux kill # 2: CTRL+c # 3: quit @@ -133,7 +133,7 @@ steammaster="false" # 10: Teamspeak 3 stopmode="2" -## LinuxGSM Server Details +## Game Server Details # Do not edit gamename="Hurtworld" engine="unity3d" @@ -142,7 +142,7 @@ glibc="2.15" #### Directories #### # Edit with care -## Server Specific Directories +## Game Server Directories systemdir="${serverfiles}" executabledir="${serverfiles}" executable=$([ "$(uname -m)" == "x86_64" ] && echo -e "./Hurtworld.x86_64" || echo -e "./Hurtworld.x86") diff --git a/lgsm/config-default/config-lgsm/insserver/_default.cfg b/lgsm/config-default/config-lgsm/insserver/_default.cfg index 15e0b6ece..97cb653bb 100644 --- a/lgsm/config-default/config-lgsm/insserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/insserver/_default.cfg @@ -1,12 +1,12 @@ ################################## ######## 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 +# DO NOT EDIT ANY CHANGES 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 #### +#### Game Server Settings #### ## Server Start Settings | https://docs.linuxgsm.com/configuration/start-parameters ip="0.0.0.0" @@ -17,9 +17,9 @@ defaultmap="embassy_coop checkpoint" maxplayers="32" tickrate="64" -## Optional: Game Server Login Token +## Game Server Login Token (GSLT): Optional # GSLT can be used for running a public server. -# More info: https://linuxgsm.com/gslt +# More info: https://docs.linuxgsm.com/steamcmd/gslt gslt="" ## Server Start Command | https://docs.linuxgsm.com/configuration/start-parameters#additional-parameters @@ -99,15 +99,15 @@ logdays="7" # Query delay time querydelay="1" -#### LinuxGSM Advanced Settings #### - -# ANSI Colors +## ANSI Colors | https://docs.linuxgsm.com/features/ansi-colors ansi="on" -# Message Display Time +#### Advanced Settings #### + +## Message Display Time | https://docs.linuxgsm.com/features/message-display-time sleeptime="0.5" -## SteamCMD Settings +## SteamCMD Settings | https://docs.linuxgsm.com/steamcmd # Server appid appid="237410" # SteamCMD Branch | https://docs.linuxgsm.com/steamcmd/branch @@ -115,7 +115,7 @@ branch="" # Master Server | https://docs.linuxgsm.com/steamcmd/steam-master-server steammaster="false" -# Stop Mode | https://docs.linuxgsm.com/steamcmd/stopmode +## Stop Mode | https://docs.linuxgsm.com/features/stop-mode # 1: tmux kill # 2: CTRL+c # 3: quit @@ -128,7 +128,7 @@ steammaster="false" # 10: Teamspeak 3 stopmode="3" -## LinuxGSM Server Details +## Game Server Details # Do not edit gamename="Insurgency" engine="source" @@ -137,7 +137,7 @@ glibc="2.15" #### Directories #### # Edit with care -## Server Specific Directories +## Game Server Directories systemdir="${serverfiles}/insurgency" executabledir="${serverfiles}" executable="./srcds_run" diff --git a/lgsm/config-default/config-lgsm/inssserver/_default.cfg b/lgsm/config-default/config-lgsm/inssserver/_default.cfg index cc54b8d3f..c4873777c 100644 --- a/lgsm/config-default/config-lgsm/inssserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/inssserver/_default.cfg @@ -1,15 +1,14 @@ ################################## ######## 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 +# DO NOT EDIT ANY CHANGES 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 #### +#### Game Server Settings #### ## Server Start Settings | https://docs.linuxgsm.com/configuration/start-parameters - ip="0.0.0.0" port="27102" queryport="27131" @@ -101,15 +100,15 @@ logdays="7" # Query delay time querydelay="1" -#### LinuxGSM Advanced Settings #### - -# ANSI Colors +## ANSI Colors | https://docs.linuxgsm.com/features/ansi-colors ansi="on" -# Message Display Time +#### Advanced Settings #### + +## Message Display Time | https://docs.linuxgsm.com/features/message-display-time sleeptime="0.5" -## SteamCMD Settings +## SteamCMD Settings | https://docs.linuxgsm.com/steamcmd # Server appid appid="581330" # SteamCMD Branch | https://docs.linuxgsm.com/steamcmd/branch @@ -117,7 +116,7 @@ branch="" # Master Server | https://docs.linuxgsm.com/steamcmd/steam-master-server steammaster="false" -# Stop Mode | https://docs.linuxgsm.com/steamcmd/stopmode +## Stop Mode | https://docs.linuxgsm.com/features/stop-mode # 1: tmux kill # 2: CTRL+c # 3: quit @@ -130,7 +129,7 @@ steammaster="false" # 10: Teamspeak 3 stopmode="2" -## LinuxGSM Server Details +## Game Server Details # Do not edit gamename="Insurgency: Sandstorm" engine="unreal4" @@ -139,7 +138,7 @@ glibc="2.17" #### Directories #### # Edit with care -## Server Specific Directories +## Game Server Directories systemdir="${serverfiles}/Insurgency" executabledir="${systemdir}/Binaries/Linux" executable="./InsurgencyServer-Linux-Shipping" diff --git a/lgsm/config-default/config-lgsm/instance-template.cfg b/lgsm/config-default/config-lgsm/instance-template.cfg index 69646e3a7..1f8109ce6 100644 --- a/lgsm/config-default/config-lgsm/instance-template.cfg +++ b/lgsm/config-default/config-lgsm/instance-template.cfg @@ -1,5 +1,5 @@ ################################## -######## Instance Settings ######## +####### Instance Settings ######## ################################## # PLACE INSTANCE SETTINGS HERE -## These settings will apply to a specific instance \ No newline at end of file +## These settings will apply to a specific instance diff --git a/lgsm/config-default/config-lgsm/iosserver/_default.cfg b/lgsm/config-default/config-lgsm/iosserver/_default.cfg index 0beecbdab..f2e7b8261 100644 --- a/lgsm/config-default/config-lgsm/iosserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/iosserver/_default.cfg @@ -1,12 +1,12 @@ ################################## ######## 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 +# DO NOT EDIT ANY CHANGES 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 #### +#### Game Server Settings #### ## Server Start Settings | https://docs.linuxgsm.com/configuration/start-parameters ip="0.0.0.0" @@ -93,15 +93,15 @@ logdays="7" # Query delay time querydelay="1" -#### LinuxGSM Advanced Settings #### - -# ANSI Colors +## ANSI Colors | https://docs.linuxgsm.com/features/ansi-colors ansi="on" -# Message Display Time +#### Advanced Settings #### + +## Message Display Time | https://docs.linuxgsm.com/features/message-display-time sleeptime="0.5" -## SteamCMD Settings +## SteamCMD Settings | https://docs.linuxgsm.com/steamcmd # Server appid appid="673990" # SteamCMD Branch | https://docs.linuxgsm.com/steamcmd/branch @@ -109,7 +109,7 @@ branch="" # Master Server | https://docs.linuxgsm.com/steamcmd/steam-master-server steammaster="false" -# Stop Mode | https://docs.linuxgsm.com/steamcmd/stopmode +## Stop Mode | https://docs.linuxgsm.com/features/stop-mode # 1: tmux kill # 2: CTRL+c # 3: quit @@ -122,7 +122,7 @@ steammaster="false" # 10: Teamspeak 3 stopmode="3" -## LinuxGSM Server Details +## Game Server Details # Do not edit gamename="IOSoccer" engine="source" @@ -131,7 +131,7 @@ glibc="2.3.6" #### Directories #### # Edit with care -## Server Specific Directories +## Game Server Directories systemdir="${serverfiles}/iosoccer" executabledir="${serverfiles}" executable="./srcds_run" diff --git a/lgsm/config-default/config-lgsm/jc2server/_default.cfg b/lgsm/config-default/config-lgsm/jc2server/_default.cfg index 52248161c..fc9628231 100644 --- a/lgsm/config-default/config-lgsm/jc2server/_default.cfg +++ b/lgsm/config-default/config-lgsm/jc2server/_default.cfg @@ -1,12 +1,12 @@ ################################## ######## 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 +# DO NOT EDIT ANY CHANGES 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 #### +#### Game Server Settings #### ## Server Start Command | https://docs.linuxgsm.com/configuration/start-parameters#additional-parameters fn_parms(){ @@ -85,15 +85,15 @@ logdays="7" # Query delay time querydelay="1" -#### LinuxGSM Advanced Settings #### - -# ANSI Colors +## ANSI Colors | https://docs.linuxgsm.com/features/ansi-colors ansi="on" -# Message Display Time +#### Advanced Settings #### + +## Message Display Time | https://docs.linuxgsm.com/features/message-display-time sleeptime="0.5" -## SteamCMD Settings +## SteamCMD Settings | https://docs.linuxgsm.com/steamcmd # Server appid appid="261140" # SteamCMD Branch | https://docs.linuxgsm.com/steamcmd/branch @@ -101,7 +101,7 @@ branch="" # Master Server | https://docs.linuxgsm.com/steamcmd/steam-master-server steammaster="true" -# Stop Mode | https://docs.linuxgsm.com/steamcmd/stopmode +## Stop Mode | https://docs.linuxgsm.com/features/stop-mode # 1: tmux kill # 2: CTRL+c # 3: quit @@ -114,7 +114,7 @@ steammaster="true" # 10: Teamspeak 3 stopmode="2" -## LinuxGSM Server Details +## Game Server Details # Do not edit gamename="Just Cause 2" engine="avalanche2.0" @@ -123,7 +123,7 @@ glibc="2.13" #### Directories #### # Edit with care -## Server Specific Directories +## Game Server Directories systemdir="${serverfiles}" executabledir="${serverfiles}" executable="./Jcmp-Server" diff --git a/lgsm/config-default/config-lgsm/jc3server/_default.cfg b/lgsm/config-default/config-lgsm/jc3server/_default.cfg index b99603c03..19255c340 100644 --- a/lgsm/config-default/config-lgsm/jc3server/_default.cfg +++ b/lgsm/config-default/config-lgsm/jc3server/_default.cfg @@ -1,12 +1,12 @@ ################################## ######## 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 +# DO NOT EDIT ANY CHANGES 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 #### +#### Game Server Settings #### ## Server Start Command | https://docs.linuxgsm.com/configuration/start-parameters#additional-parameters fn_parms(){ @@ -85,15 +85,15 @@ logdays="7" # Query delay time querydelay="1" -#### LinuxGSM Advanced Settings #### - -# ANSI Colors +## ANSI Colors | https://docs.linuxgsm.com/features/ansi-colors ansi="on" -# Message Display Time +#### Advanced Settings #### + +## Message Display Time | https://docs.linuxgsm.com/features/message-display-time sleeptime="0.5" -## SteamCMD Settings +## SteamCMD Settings | https://docs.linuxgsm.com/steamcmd # Server appid appid="619960" # SteamCMD Branch | https://docs.linuxgsm.com/steamcmd/branch @@ -101,7 +101,7 @@ branch="" # Master Server | https://docs.linuxgsm.com/steamcmd/steam-master-server steammaster="false" -# Stop Mode | https://docs.linuxgsm.com/steamcmd/stopmode +## Stop Mode | https://docs.linuxgsm.com/features/stop-mode # 1: tmux kill # 2: CTRL+c # 3: quit @@ -114,7 +114,7 @@ steammaster="false" # 10: Teamspeak 3 stopmode="2" -## LinuxGSM Server Details +## Game Server Details # Do not edit gamename="Just Cause 3" engine="avalanche3.0" @@ -123,7 +123,7 @@ glibc="2.17" #### Directories #### # Edit with care -## Server Specific Directories +## Game Server Directories systemdir="${serverfiles}" executabledir="${serverfiles}" executable="./Server" diff --git a/lgsm/config-default/config-lgsm/kf2server/_default.cfg b/lgsm/config-default/config-lgsm/kf2server/_default.cfg index da31e737a..a40b54b81 100644 --- a/lgsm/config-default/config-lgsm/kf2server/_default.cfg +++ b/lgsm/config-default/config-lgsm/kf2server/_default.cfg @@ -1,12 +1,12 @@ ################################## ######## 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 +# DO NOT EDIT ANY CHANGES 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 #### +#### Game Server Settings #### ## Server Start Settings | https://docs.linuxgsm.com/configuration/start-parameters ip="0.0.0.0" @@ -91,15 +91,15 @@ logdays="7" # Query delay time querydelay="1" -#### LinuxGSM Advanced Settings #### - -# ANSI Colors +## ANSI Colors | https://docs.linuxgsm.com/features/ansi-colors ansi="on" -# Message Display Time +#### Advanced Settings #### + +## Message Display Time | https://docs.linuxgsm.com/features/message-display-time sleeptime="0.5" -## SteamCMD Settings +## SteamCMD Settings | https://docs.linuxgsm.com/steamcmd # Server appid appid="232130" # SteamCMD Branch | https://docs.linuxgsm.com/steamcmd/branch @@ -107,7 +107,7 @@ branch="" # Master Server | https://docs.linuxgsm.com/steamcmd/steam-master-server steammaster="false" -# Stop Mode | https://docs.linuxgsm.com/steamcmd/stopmode +## Stop Mode | https://docs.linuxgsm.com/features/stop-mode # 1: tmux kill # 2: CTRL+c # 3: quit @@ -120,7 +120,7 @@ steammaster="false" # 10: Teamspeak 3 stopmode="2" -## LinuxGSM Server Details +## Game Server Details # Do not edit gamename="Killing Floor 2" engine="unreal3" @@ -128,7 +128,7 @@ glibc="2.3.2" #### Directories #### # Edit with care -## Server Specific Directories +## Game Server Directories systemdir="${serverfiles}" executabledir="${systemdir}/Binaries/Win64" executable="./KFGameSteamServer.bin.x86_64" diff --git a/lgsm/config-default/config-lgsm/kfserver/_default.cfg b/lgsm/config-default/config-lgsm/kfserver/_default.cfg index 82d67bc62..dfaca2ec4 100644 --- a/lgsm/config-default/config-lgsm/kfserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/kfserver/_default.cfg @@ -1,12 +1,12 @@ ################################## ######## 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 +# DO NOT EDIT ANY CHANGES 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 #### +#### Game Server Settings #### ## SteamCMD Login | https://docs.linuxgsm.com/steamcmd#steamcmd-login steamuser="username" @@ -97,15 +97,15 @@ logdays="7" # Query delay time querydelay="1" -#### LinuxGSM Advanced Settings #### - -# ANSI Colors +## ANSI Colors | https://docs.linuxgsm.com/features/ansi-colors ansi="on" -# Message Display Time +#### Advanced Settings #### + +## Message Display Time | https://docs.linuxgsm.com/features/message-display-time sleeptime="0.5" -## SteamCMD Settings +## SteamCMD Settings | https://docs.linuxgsm.com/steamcmd # Server appid appid="215360" # SteamCMD Branch | https://docs.linuxgsm.com/steamcmd/branch @@ -113,7 +113,7 @@ branch="" # Master Server | https://docs.linuxgsm.com/steamcmd/steam-master-server steammaster="false" -# Stop Mode | https://docs.linuxgsm.com/steamcmd/stopmode +## Stop Mode | https://docs.linuxgsm.com/features/stop-mode # 1: tmux kill # 2: CTRL+c # 3: quit @@ -126,7 +126,7 @@ steammaster="false" # 10: Teamspeak 3 stopmode="2" -## LinuxGSM Server Details +## Game Server Details # Do not edit gamename="Killing Floor" engine="unreal2" @@ -135,7 +135,7 @@ glibc="2.4" #### Directories #### # Edit with care -## Server Specific Directories +## Game Server Directories serverfiles="${rootdir}/serverfiles" systemdir="${serverfiles}/System" executabledir="${systemdir}" diff --git a/lgsm/config-default/config-lgsm/l4d2server/_default.cfg b/lgsm/config-default/config-lgsm/l4d2server/_default.cfg index 2250b7393..aad9566b8 100644 --- a/lgsm/config-default/config-lgsm/l4d2server/_default.cfg +++ b/lgsm/config-default/config-lgsm/l4d2server/_default.cfg @@ -1,12 +1,12 @@ ################################## ######## 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 +# DO NOT EDIT ANY CHANGES 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 #### +#### Game Server Settings #### ## Server Start Settings | https://docs.linuxgsm.com/configuration/start-parameters ip="0.0.0.0" @@ -92,15 +92,15 @@ logdays="7" # Query delay time querydelay="1" -#### LinuxGSM Advanced Settings #### - -# ANSI Colors +## ANSI Colors | https://docs.linuxgsm.com/features/ansi-colors ansi="on" -# Message Display Time +#### Advanced Settings #### + +## Message Display Time | https://docs.linuxgsm.com/features/message-display-time sleeptime="0.5" -## SteamCMD Settings +## SteamCMD Settings | https://docs.linuxgsm.com/steamcmd # Server appid appid="222860" # SteamCMD Branch | https://docs.linuxgsm.com/steamcmd/branch @@ -108,7 +108,7 @@ branch="" # Master Server | https://docs.linuxgsm.com/steamcmd/steam-master-server steammaster="false" -# Stop Mode | https://docs.linuxgsm.com/steamcmd/stopmode +## Stop Mode | https://docs.linuxgsm.com/features/stop-mode # 1: tmux kill # 2: CTRL+c # 3: quit @@ -121,7 +121,7 @@ steammaster="false" # 10: Teamspeak 3 stopmode="3" -## LinuxGSM Server Details +## Game Server Details # Do not edit gamename="Left 4 Dead 2" engine="source" @@ -130,7 +130,7 @@ glibc="2.3.6" #### Directories #### # Edit with care -## Server Specific Directories +## Game Server Directories systemdir="${serverfiles}/left4dead2" executabledir="${serverfiles}" executable="./srcds_run" diff --git a/lgsm/config-default/config-lgsm/l4dserver/_default.cfg b/lgsm/config-default/config-lgsm/l4dserver/_default.cfg index 33ff44c30..b357e68e0 100644 --- a/lgsm/config-default/config-lgsm/l4dserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/l4dserver/_default.cfg @@ -1,12 +1,12 @@ ################################## ######## 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 +# DO NOT EDIT ANY CHANGES 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 #### +#### Game Server Settings #### ## Server Start Settings | https://docs.linuxgsm.com/configuration/start-parameters ip="0.0.0.0" @@ -92,15 +92,15 @@ logdays="7" # Query delay time querydelay="1" -#### LinuxGSM Advanced Settings #### - -# ANSI Colors +## ANSI Colors | https://docs.linuxgsm.com/features/ansi-colors ansi="on" -# Message Display Time +#### Advanced Settings #### + +## Message Display Time | https://docs.linuxgsm.com/features/message-display-time sleeptime="0.5" -## SteamCMD Settings +## SteamCMD Settings | https://docs.linuxgsm.com/steamcmd # Server appid appid="222840" # SteamCMD Branch | https://docs.linuxgsm.com/steamcmd/branch @@ -108,7 +108,7 @@ branch="" # Master Server | https://docs.linuxgsm.com/steamcmd/steam-master-server steammaster="false" -# Stop Mode | https://docs.linuxgsm.com/steamcmd/stopmode +## Stop Mode | https://docs.linuxgsm.com/features/stop-mode # 1: tmux kill # 2: CTRL+c # 3: quit @@ -121,7 +121,7 @@ steammaster="false" # 10: Teamspeak 3 stopmode="2" -## LinuxGSM Server Details +## Game Server Details # Do not edit gamename="Left 4 Dead" engine="source" @@ -130,7 +130,7 @@ glibc="2.3.6" #### Directories #### # Edit with care -## Server Specific Directories +## Game Server Directories systemdir="${serverfiles}/left4dead" executabledir="${serverfiles}" executable="./srcds_run" diff --git a/lgsm/config-default/config-lgsm/mcserver/_default.cfg b/lgsm/config-default/config-lgsm/mcserver/_default.cfg index 663c141a7..3a0a4f50c 100644 --- a/lgsm/config-default/config-lgsm/mcserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/mcserver/_default.cfg @@ -1,12 +1,12 @@ ################################## ######## 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 +# DO NOT EDIT ANY CHANGES 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 #### +#### Game Server Settings #### ## Server Start Settings | https://docs.linuxgsm.com/configuration/start-parameters javaram="1024" # -Xmx$1024M @@ -87,15 +87,15 @@ logdays="7" # Query delay time querydelay="1" -#### LinuxGSM Advanced Settings #### - -# ANSI Colors +## ANSI Colors | https://docs.linuxgsm.com/features/ansi-colors ansi="on" -# Message Display Time +#### Advanced Settings #### + +## Message Display Time | https://docs.linuxgsm.com/features/message-display-time sleeptime="0.5" -# Stop Mode | https://docs.linuxgsm.com/steamcmd/stopmode +## Stop Mode | https://docs.linuxgsm.com/features/stop-mode # 1: tmux kill # 2: CTRL+c # 3: quit @@ -108,7 +108,7 @@ sleeptime="0.5" # 10: Teamspeak 3 stopmode="5" -## LinuxGSM Server Details +## Game Server Details # Do not edit gamename="Minecraft" engine="lwjgl2" @@ -117,7 +117,7 @@ glibc="null" #### Directories #### # Edit with care -## Server Specific Directories +## Game Server Directories systemdir="${serverfiles}" executabledir="${serverfiles}" executable="java -Xmx${javaram}M -jar ${serverfiles}/minecraft_server.jar" diff --git a/lgsm/config-default/config-lgsm/mhserver/_default.cfg b/lgsm/config-default/config-lgsm/mhserver/_default.cfg index f3846d238..fa208e628 100644 --- a/lgsm/config-default/config-lgsm/mhserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/mhserver/_default.cfg @@ -1,12 +1,12 @@ ################################## ######## 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 +# DO NOT EDIT ANY CHANGES 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 #### +#### Game Server Settings #### ## Server Start Settings | https://docs.linuxgsm.com/configuration/start-parameters ip="0.0.0.0" @@ -26,6 +26,9 @@ parms="Mordhau ${defaultmap} -log -MultiHome=${ip} -Port=${port} -BeaconPort=${b ## Notification Alerts # (on|off) +# Display IP | https://docs.linuxgsm.com/alerts#display-ip +displayip="" + # More info | https://docs.linuxgsm.com/alerts#more-info postalert="off" postdays="7" @@ -35,10 +38,6 @@ posttarget="https://hastebin.com" discordalert="off" discordwebhook="webhook" -# Slack Alerts | https://docs.linuxgsm.com/alerts/slack -slackalert="off" -slackwebhook="webhook" - # Email Alerts | https://docs.linuxgsm.com/alerts/email emailalert="off" email="email@example.com" @@ -65,6 +64,10 @@ channeltag="" pushoveralert="off" pushovertoken="accesstoken" +# Slack Alerts | https://docs.linuxgsm.com/alerts/slack +slackalert="off" +slackwebhook="webhook" + # Telegram Alerts | https://docs.linuxgsm.com/alerts/telegram # You can add a custom cURL string eg proxy (useful in Russia) or else in "curlcustomstring". # like a "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help", if you not need @@ -90,15 +93,15 @@ logdays="7" # Query delay time querydelay="1" -#### LinuxGSM Advanced Settings #### - -# ANSI Colors +## ANSI Colors | https://docs.linuxgsm.com/features/ansi-colors ansi="on" -# Message Display Time +#### Advanced Settings #### + +## Message Display Time | https://docs.linuxgsm.com/features/message-display-time sleeptime="0.5" -## SteamCMD Settings +## SteamCMD Settings | https://docs.linuxgsm.com/steamcmd # Server appid appid="629800" # SteamCMD Branch | https://docs.linuxgsm.com/steamcmd/branch @@ -106,7 +109,7 @@ branch="" # Master Server | https://docs.linuxgsm.com/steamcmd/steam-master-server steammaster="false" -# Stop Mode | https://docs.linuxgsm.com/steamcmd/stopmode +## Stop Mode | https://docs.linuxgsm.com/features/stop-mode # 1: tmux kill # 2: CTRL+c # 3: quit @@ -119,7 +122,7 @@ steammaster="false" # 10: Teamspeak 3 stopmode="2" -## LinuxGSM Server Details +## Game Server Details # Do not edit gamename="MORDHAU" engine="unreal4" @@ -128,13 +131,13 @@ glibc="2.17" #### Directories #### # Edit with care -## Server Specific Directories +## Game Server Directories systemdir="${serverfiles}/Mordhau" executabledir="${systemdir}/Binaries/Linux" executable="./MordhauServer-Linux-Shipping" -servercfgdir="${systemdir}/Saved/Config/LinuxServer" servercfg="Game.ini" servercfgdefault="Game.ini" +servercfgdir="${systemdir}/Saved/Config/LinuxServer" servercfgfullpath="${servercfgdir}/${servercfg}" ## Backup Directory diff --git a/lgsm/config-default/config-lgsm/mohaaserver/_default.cfg b/lgsm/config-default/config-lgsm/mohaaserver/_default.cfg index 4ee5487e7..1b3f2c810 100644 --- a/lgsm/config-default/config-lgsm/mohaaserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/mohaaserver/_default.cfg @@ -1,12 +1,12 @@ ################################## ######## 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 +# DO NOT EDIT ANY CHANGES 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 #### +#### Game Server Settings #### ## Server Start Settings | https://docs.linuxgsm.com/configuration/start-parameters ip="0.0.0.0" @@ -87,15 +87,15 @@ logdays="7" # Query delay time querydelay="1" -#### LinuxGSM Advanced Settings #### - -# ANSI Colors +## ANSI Colors | https://docs.linuxgsm.com/features/ansi-colors ansi="on" -# Message Display Time +#### Advanced Settings #### + +## Message Display Time | https://docs.linuxgsm.com/features/message-display-time sleeptime="0.5" -# Stop Mode | https://docs.linuxgsm.com/steamcmd/stopmode +## Stop Mode | https://docs.linuxgsm.com/features/stop-mode # 1: tmux kill # 2: CTRL+c # 3: quit @@ -108,7 +108,7 @@ sleeptime="0.5" # 10: Teamspeak 3 stopmode="3" -## LinuxGSM Server Details +## Game Server Details # Do not edit gamename="Medal of Honor: Allied Assault" engine="idtech3" @@ -117,7 +117,7 @@ glibc="2.3" #### Directories #### # Edit with care -## Server Specific Directories +## Game Server Directories systemdir="${serverfiles}/main" executabledir="${serverfiles}" executable="./mohaa_lnxded" diff --git a/lgsm/config-default/config-lgsm/mtaserver/_default.cfg b/lgsm/config-default/config-lgsm/mtaserver/_default.cfg index 5dc5dbbcc..dbff0d959 100644 --- a/lgsm/config-default/config-lgsm/mtaserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/mtaserver/_default.cfg @@ -1,12 +1,12 @@ ################################## ######## 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 +# DO NOT EDIT ANY CHANGES 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 #### +#### Game Server Settings #### ## Server Start Command | https://docs.linuxgsm.com/configuration/start-parameters#additional-parameters # Edit with care @@ -83,15 +83,15 @@ logdays="7" # Query delay time querydelay="1" -#### LinuxGSM Advanced Settings #### - -# ANSI Colors +## ANSI Colors | https://docs.linuxgsm.com/features/ansi-colors ansi="on" -# Message Display Time +#### Advanced Settings #### + +## Message Display Time | https://docs.linuxgsm.com/features/message-display-time sleeptime="0.5" -# Stop Mode | https://docs.linuxgsm.com/steamcmd/stopmode +## Stop Mode | https://docs.linuxgsm.com/features/stop-mode # 1: tmux kill # 2: CTRL+c # 3: quit @@ -104,7 +104,7 @@ sleeptime="0.5" # 10: Teamspeak 3 stopmode="4" -## LinuxGSM Server Details +## Game Server Details # Do not edit gamename="Multi Theft Auto" engine="renderware" @@ -113,7 +113,7 @@ glibc="2.7" #### Directories #### # Edit with care -## Server Specific Directories +## Game Server Directories systemdir="${serverfiles}" resourcesdir="${systemdir}/mods/deathmatch/resources" executabledir="${systemdir}" diff --git a/lgsm/config-default/config-lgsm/mumbleserver/_default.cfg b/lgsm/config-default/config-lgsm/mumbleserver/_default.cfg index 4c6190596..ced8f1ec4 100644 --- a/lgsm/config-default/config-lgsm/mumbleserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/mumbleserver/_default.cfg @@ -1,12 +1,12 @@ ################################## ######## 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 +# DO NOT EDIT ANY CHANGES 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 #### +#### Game Server Settings #### # Use .ini config file for Mumble (Murmur) server. ## Server Start Command | https://docs.linuxgsm.com/configuration/start-parameters#additional-parameters @@ -86,15 +86,15 @@ logdays="7" # Query delay time querydelay="1" -#### LinuxGSM Advanced Settings #### - -# ANSI Colors +## ANSI Colors | https://docs.linuxgsm.com/features/ansi-colors ansi="on" -# Message Display Time +#### Advanced Settings #### + +## Message Display Time | https://docs.linuxgsm.com/features/message-display-time sleeptime="0.5" -# Stop Mode | https://docs.linuxgsm.com/steamcmd/stopmode +## Stop Mode | https://docs.linuxgsm.com/features/stop-mode # 1: tmux kill # 2: CTRL+c # 3: quit @@ -107,7 +107,7 @@ sleeptime="0.5" # 10: Teamspeak 3 stopmode="2" -## LinuxGSM Server Details +## Game Server Details # Do not edit gamename="Mumble" engine="null" @@ -116,7 +116,7 @@ glibc="null" #### Directories #### # Edit with care -## Server Specific Directories +## Game Server Directories systemdir="${serverfiles}" executabledir="${serverfiles}" executable="./murmur.x86" diff --git a/lgsm/config-default/config-lgsm/ndserver/_default.cfg b/lgsm/config-default/config-lgsm/ndserver/_default.cfg index 4f54b6318..3b360847d 100644 --- a/lgsm/config-default/config-lgsm/ndserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/ndserver/_default.cfg @@ -1,12 +1,12 @@ ################################## ######## 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 +# DO NOT EDIT ANY CHANGES 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 #### +#### Game Server Settings #### ## Server Start Settings | https://docs.linuxgsm.com/configuration/start-parameters ip="0.0.0.0" @@ -93,15 +93,15 @@ logdays="7" # Query delay time querydelay="1" -#### LinuxGSM Advanced Settings #### - -# ANSI Colors +## ANSI Colors | https://docs.linuxgsm.com/features/ansi-colors ansi="on" -# Message Display Time +#### Advanced Settings #### + +## Message Display Time | https://docs.linuxgsm.com/features/message-display-time sleeptime="0.5" -## SteamCMD Settings +## SteamCMD Settings | https://docs.linuxgsm.com/steamcmd # Server appid appid="111710" # SteamCMD Branch | https://docs.linuxgsm.com/steamcmd/branch @@ -109,7 +109,7 @@ branch="" # Master Server | https://docs.linuxgsm.com/steamcmd/steam-master-server steammaster="true" -# Stop Mode | https://docs.linuxgsm.com/steamcmd/stopmode +## Stop Mode | https://docs.linuxgsm.com/features/stop-mode # 1: tmux kill # 2: CTRL+c # 3: quit @@ -122,7 +122,7 @@ steammaster="true" # 10: Teamspeak 3 stopmode="3" -## LinuxGSM Server Details +## Game Server Details # Do not edit gamename="Nuclear Dawn" engine="source" @@ -131,7 +131,7 @@ glibc="2.3.6" #### Directories #### # Edit with care -## Server Specific Directories +## Game Server Directories systemdir="${serverfiles}/nucleardawn" executabledir="${serverfiles}" executable="./srcds_run" diff --git a/lgsm/config-default/config-lgsm/nmrihserver/_default.cfg b/lgsm/config-default/config-lgsm/nmrihserver/_default.cfg index 57869bc3e..80fb3b36d 100644 --- a/lgsm/config-default/config-lgsm/nmrihserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/nmrihserver/_default.cfg @@ -1,12 +1,12 @@ ################################## ######## 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 +# DO NOT EDIT ANY CHANGES 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 #### +#### Game Server Settings #### ## Server Start Settings | https://docs.linuxgsm.com/configuration/start-parameters ip="0.0.0.0" @@ -16,9 +16,9 @@ sourcetvport="27020" defaultmap="nmo_broadway" maxplayers="8" -## Optional: Game Server Login Token +## Game Server Login Token (GSLT): Optional # GSLT can be used for running a public server. -# More info: https://linuxgsm.com/gslt +# More info: https://docs.linuxgsm.com/steamcmd/gslt gslt="" ## Server Start Command | https://docs.linuxgsm.com/configuration/start-parameters#additional-parameters @@ -98,15 +98,15 @@ logdays="7" # Query delay time querydelay="1" -#### LinuxGSM Advanced Settings #### - -# ANSI Colors +## ANSI Colors | https://docs.linuxgsm.com/features/ansi-colors ansi="on" -# Message Display Time +#### Advanced Settings #### + +## Message Display Time | https://docs.linuxgsm.com/features/message-display-time sleeptime="0.5" -## SteamCMD Settings +## SteamCMD Settings | https://docs.linuxgsm.com/steamcmd # Server appid appid="317670" # SteamCMD Branch | https://docs.linuxgsm.com/steamcmd/branch @@ -114,7 +114,7 @@ branch="" # Master Server | https://docs.linuxgsm.com/steamcmd/steam-master-server steammaster="true" -# Stop Mode | https://docs.linuxgsm.com/steamcmd/stopmode +## Stop Mode | https://docs.linuxgsm.com/features/stop-mode # 1: tmux kill # 2: CTRL+c # 3: quit @@ -127,7 +127,7 @@ steammaster="true" # 10: Teamspeak 3 stopmode="3" -## LinuxGSM Server Details +## Game Server Details # Do not edit gamename="No More Room in Hell" engine="source" @@ -136,7 +136,7 @@ glibc="2.15" #### Directories #### # Edit with care -## Server Specific Directories +## Game Server Directories systemdir="${serverfiles}/nmrih" executabledir="${serverfiles}" executable="./srcds_run" diff --git a/lgsm/config-default/config-lgsm/ns2cserver/_default.cfg b/lgsm/config-default/config-lgsm/ns2cserver/_default.cfg index 7e6bca42a..e538a49c1 100644 --- a/lgsm/config-default/config-lgsm/ns2cserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/ns2cserver/_default.cfg @@ -1,12 +1,12 @@ ################################## ######## 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 +# DO NOT EDIT ANY CHANGES 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 #### +#### Game Server Settings #### ## Server Start Settings | https://docs.linuxgsm.com/configuration/start-parameters ip="0.0.0.0" @@ -100,15 +100,15 @@ logdays="7" # Query delay time querydelay="1" -#### LinuxGSM Advanced Settings #### - -# ANSI Colors +## ANSI Colors | https://docs.linuxgsm.com/features/ansi-colors ansi="on" -# Message Display Time +#### Advanced Settings #### + +## Message Display Time | https://docs.linuxgsm.com/features/message-display-time sleeptime="0.5" -## SteamCMD Settings +## SteamCMD Settings | https://docs.linuxgsm.com/steamcmd # Server appid appid="313900" # SteamCMD Branch | https://docs.linuxgsm.com/steamcmd/branch @@ -116,7 +116,7 @@ branch="" # Master Server | https://docs.linuxgsm.com/steamcmd/steam-master-server steammaster="true" -# Stop Mode | https://docs.linuxgsm.com/steamcmd/stopmode +## Stop Mode | https://docs.linuxgsm.com/features/stop-mode # 1: tmux kill # 2: CTRL+c # 3: quit @@ -129,7 +129,7 @@ steammaster="true" # 10: Teamspeak 3 stopmode="6" -## LinuxGSM Server Details +## Game Server Details # Do not edit gamename="NS2: Combat" engine="spark" @@ -138,7 +138,7 @@ glibc="2.15" #### Directories #### # Edit with care -## Server Specific Directories +## Game Server Directories systemdir="${serverfiles}" executabledir="${serverfiles}/ia32" executable="./ns2combatserver_linux32" diff --git a/lgsm/config-default/config-lgsm/ns2server/_default.cfg b/lgsm/config-default/config-lgsm/ns2server/_default.cfg index 41e52d53d..3a7a5efe7 100644 --- a/lgsm/config-default/config-lgsm/ns2server/_default.cfg +++ b/lgsm/config-default/config-lgsm/ns2server/_default.cfg @@ -1,12 +1,12 @@ ################################## ######## 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 +# DO NOT EDIT ANY CHANGES 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 #### +#### Game Server Settings #### ## SteamCMD Login | https://docs.linuxgsm.com/steamcmd#steamcmd-login steamuser="username" @@ -104,15 +104,15 @@ logdays="7" # Query delay time querydelay="1" -#### LinuxGSM Advanced Settings #### - -# ANSI Colors +## ANSI Colors | https://docs.linuxgsm.com/features/ansi-colors ansi="on" -# Message Display Time +#### Advanced Settings #### + +## Message Display Time | https://docs.linuxgsm.com/features/message-display-time sleeptime="0.5" -## SteamCMD Settings +## SteamCMD Settings | https://docs.linuxgsm.com/steamcmd # Server appid appid="4940" # SteamCMD Branch | https://docs.linuxgsm.com/steamcmd/branch @@ -120,7 +120,7 @@ branch="" # Master Server | https://docs.linuxgsm.com/steamcmd/steam-master-server steammaster="true" -# Stop Mode | https://docs.linuxgsm.com/steamcmd/stopmode +## Stop Mode | https://docs.linuxgsm.com/features/stop-mode # 1: tmux kill # 2: CTRL+c # 3: quit @@ -133,7 +133,7 @@ steammaster="true" # 10: Teamspeak 3 stopmode="6" -## LinuxGSM Server Details +## Game Server Details # Do not edit gamename="Natural Selection 2" engine="spark" @@ -142,7 +142,7 @@ glibc="2.17" #### Directories #### # Edit with care -## Server Specific Directories +## Game Server Directories systemdir="${serverfiles}" executabledir="${serverfiles}/x64" executable="./server_linux" diff --git a/lgsm/config-default/config-lgsm/nsserver/_default.cfg b/lgsm/config-default/config-lgsm/nsserver/_default.cfg index 59e61097d..f5663f514 100644 --- a/lgsm/config-default/config-lgsm/nsserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/nsserver/_default.cfg @@ -1,12 +1,12 @@ ################################## ######## 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 +# DO NOT EDIT ANY CHANGES 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 #### +#### Game Server Settings #### ## Server Start Settings | https://docs.linuxgsm.com/configuration/start-parameters ip="0.0.0.0" @@ -92,15 +92,15 @@ logdays="7" # Query delay time querydelay="1" -#### LinuxGSM Advanced Settings #### - -# ANSI Colors +## ANSI Colors | https://docs.linuxgsm.com/features/ansi-colors ansi="on" -# Message Display Time +#### Advanced Settings #### + +## Message Display Time | https://docs.linuxgsm.com/features/message-display-time sleeptime="0.5" -## SteamCMD Settings +## SteamCMD Settings | https://docs.linuxgsm.com/steamcmd # Server appid appid="90" appidmod="cstrike" @@ -109,7 +109,7 @@ branch="" # Master Server | https://docs.linuxgsm.com/steamcmd/steam-master-server steammaster="true" -# Stop Mode | https://docs.linuxgsm.com/steamcmd/stopmode +## Stop Mode | https://docs.linuxgsm.com/features/stop-mode # 1: tmux kill # 2: CTRL+c # 3: quit @@ -122,7 +122,7 @@ steammaster="true" # 10: Teamspeak 3 stopmode="9" -## LinuxGSM Server Details +## Game Server Details # Do not edit gamename="Natural Selection" engine="goldsource" @@ -131,7 +131,7 @@ glibc="2.3.4" #### Directories #### # Edit with care -## Server Specific Directories +## Game Server Directories systemdir="${serverfiles}/ns" executabledir="${serverfiles}" executable="./hlds_run" diff --git a/lgsm/config-default/config-lgsm/opforserver/_default.cfg b/lgsm/config-default/config-lgsm/opforserver/_default.cfg index f5cf34813..befa08b80 100644 --- a/lgsm/config-default/config-lgsm/opforserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/opforserver/_default.cfg @@ -1,12 +1,12 @@ ################################## ######## 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 +# DO NOT EDIT ANY CHANGES 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 #### +#### Game Server Settings #### ## Server Start Settings | https://docs.linuxgsm.com/configuration/start-parameters ip="0.0.0.0" @@ -20,7 +20,7 @@ fn_parms(){ parms="-game gearbox -strictportbind +ip ${ip} -port ${port} +clientport ${clientport} +map ${defaultmap} +servercfgfile ${servercfg} -maxplayers ${maxplayers}" } -### LinuxGSM Settings #### +#### LinuxGSM Settings #### ## Notification Alerts # (on|off) @@ -92,15 +92,15 @@ logdays="7" # Query delay time querydelay="1" -#### LinuxGSM Advanced Settings #### - -# ANSI Colors +## ANSI Colors | https://docs.linuxgsm.com/features/ansi-colors ansi="on" -# Message Display Time +#### Advanced Settings #### + +## Message Display Time | https://docs.linuxgsm.com/features/message-display-time sleeptime="0.5" -## SteamCMD Settings +## SteamCMD Settings | https://docs.linuxgsm.com/steamcmd # Server appid appid="90" appidmod="gearbox" @@ -109,7 +109,7 @@ branch="" # Master Server | https://docs.linuxgsm.com/steamcmd/steam-master-server steammaster="true" -# Stop Mode | https://docs.linuxgsm.com/steamcmd/stopmode +## Stop Mode | https://docs.linuxgsm.com/features/stop-mode # 1: tmux kill # 2: CTRL+c # 3: quit @@ -122,7 +122,7 @@ steammaster="true" # 10: Teamspeak 3 stopmode="9" -## LinuxGSM Server Details +## Game Server Details # Do not edit gamename="Half-Life: Opposing Force" engine="goldsource" @@ -131,7 +131,7 @@ glibc="2.3.4" #### Directories #### # Edit with care -## Server Specific Directories +## Game Server Directories systemdir="${serverfiles}/gearbox" executabledir="${serverfiles}" executable="./hlds_run" diff --git a/lgsm/config-default/config-lgsm/pcserver/_default.cfg b/lgsm/config-default/config-lgsm/pcserver/_default.cfg index ef1fb6925..328eaf685 100644 --- a/lgsm/config-default/config-lgsm/pcserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/pcserver/_default.cfg @@ -1,12 +1,12 @@ ################################## ######## 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 +# DO NOT EDIT ANY CHANGES 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 #### +#### Game Server Settings #### ## Server Start Command | https://docs.linuxgsm.com/configuration/start-parameters#additional-parameters fn_parms(){ @@ -85,15 +85,15 @@ logdays="7" # Query delay time querydelay="1" -#### LinuxGSM Advanced Settings #### - -# ANSI Colors +## ANSI Colors | https://docs.linuxgsm.com/features/ansi-colors ansi="on" -# Message Display Time +#### Advanced Settings #### + +## Message Display Time | https://docs.linuxgsm.com/features/message-display-time sleeptime="0.5" -## SteamCMD Settings +## SteamCMD Settings | https://docs.linuxgsm.com/steamcmd # Server appid appid="332670" # SteamCMD Branch | https://docs.linuxgsm.com/steamcmd/branch @@ -101,7 +101,7 @@ branch="" # Master Server | https://docs.linuxgsm.com/steamcmd/steam-master-server steammaster="false" -# Stop Mode | https://docs.linuxgsm.com/steamcmd/stopmode +## Stop Mode | https://docs.linuxgsm.com/features/stop-mode # 1: tmux kill # 2: CTRL+c # 3: quit @@ -114,7 +114,7 @@ steammaster="false" # 10: Teamspeak 3 stopmode="2" -## LinuxGSM Server Details +## Game Server Details # Do not edit gamename="Project Cars" engine="madness" @@ -123,7 +123,7 @@ glibc="2.4" #### Directories #### # Edit with care -## Server Specific Directories +## Game Server Directories systemdir="${serverfiles}" executabledir="${serverfiles}" executable="./DedicatedServerCmd" diff --git a/lgsm/config-default/config-lgsm/pstbsserver/_default.cfg b/lgsm/config-default/config-lgsm/pstbsserver/_default.cfg index ad692c635..648190ccd 100644 --- a/lgsm/config-default/config-lgsm/pstbsserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/pstbsserver/_default.cfg @@ -1,21 +1,19 @@ ################################## ######## 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 +# DO NOT EDIT ANY CHANGES 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 #### +#### Game Server Settings #### ## Server Start Settings | https://docs.linuxgsm.com/configuration/start-parameters - ip="0.0.0.0" -randommap="ALWAYS" port="10027" queryport="10037" +randommap="ALWAYS" #servername="LinuxGSM Server" -# If your server is not meeting the minimal server requirement, do not host the server for 80 players, decrease that number. maxplayers="40" reservedslots="2" @@ -96,15 +94,15 @@ logdays="7" # Query delay time querydelay="1" -#### LinuxGSM Advanced Settings #### - -# ANSI Colors +## ANSI Colors | https://docs.linuxgsm.com/features/ansi-colors ansi="on" -# Message Display Time +#### Advanced Settings #### + +## Message Display Time | https://docs.linuxgsm.com/features/message-display-time sleeptime="0.5" -## SteamCMD Settings +## SteamCMD Settings | https://docs.linuxgsm.com/steamcmd # Server appid appid="746200" # SteamCMD Branch | https://docs.linuxgsm.com/steamcmd/branch @@ -112,7 +110,7 @@ branch="" # Master Server | https://docs.linuxgsm.com/steamcmd/steam-master-server steammaster="false" -# Stop Mode | https://docs.linuxgsm.com/steamcmd/stopmode +## Stop Mode | https://docs.linuxgsm.com/features/stop-mode # 1: tmux kill # 2: CTRL+c # 3: quit @@ -125,7 +123,7 @@ steammaster="false" # 10: Teamspeak 3 stopmode="2" -## LinuxGSM Server Details +## Game Server Details # Do not edit gamename="pstbsserver" engine="unreal4" @@ -134,7 +132,7 @@ glibc="2.17" #### Directories #### # Edit with care -## Server Specific Directories +## Game Server Directories systemdir="${serverfiles}/PostScriptum" executabledir="${serverfiles}" executable="./PostScriptumServer.sh" diff --git a/lgsm/config-default/config-lgsm/pvkiiserver/_default.cfg b/lgsm/config-default/config-lgsm/pvkiiserver/_default.cfg index cdfc1b20f..4afec5c70 100644 --- a/lgsm/config-default/config-lgsm/pvkiiserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/pvkiiserver/_default.cfg @@ -1,12 +1,12 @@ ################################## ######## 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 +# DO NOT EDIT ANY CHANGES 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 #### +#### Game Server Settings #### ## Server Start Settings | https://docs.linuxgsm.com/configuration/start-parameters ip="0.0.0.0" @@ -93,15 +93,15 @@ logdays="7" # Query delay time querydelay="1" -#### LinuxGSM Advanced Settings #### - -# ANSI Colors +## ANSI Colors | https://docs.linuxgsm.com/features/ansi-colors ansi="on" -# Message Display Time +#### Advanced Settings #### + +## Message Display Time | https://docs.linuxgsm.com/features/message-display-time sleeptime="0.5" -## SteamCMD Settings +## SteamCMD Settings | https://docs.linuxgsm.com/steamcmd # Server appid appid="17575" # SteamCMD Branch | https://docs.linuxgsm.com/steamcmd/branch @@ -109,7 +109,7 @@ branch="" # Master Server | https://docs.linuxgsm.com/steamcmd/steam-master-server steammaster="true" -# Stop Mode | https://docs.linuxgsm.com/steamcmd/stopmode +## Stop Mode | https://docs.linuxgsm.com/features/stop-mode # 1: tmux kill # 2: CTRL+c # 3: quit @@ -122,7 +122,7 @@ steammaster="true" # 10: Teamspeak 3 stopmode="3" -## LinuxGSM Server Details +## Game Server Details # Do not edit gamename="Pirates, Vikings, and Knights II" engine="source" @@ -131,7 +131,7 @@ glibc="2.15" #### Directories #### # Edit with care -## Server Specific Directories +## Game Server Directories systemdir="${serverfiles}/pvkii" executabledir="${serverfiles}" executable="./srcds_run" diff --git a/lgsm/config-default/config-lgsm/pzserver/_default.cfg b/lgsm/config-default/config-lgsm/pzserver/_default.cfg index 1b5bc2296..e2955c90d 100644 --- a/lgsm/config-default/config-lgsm/pzserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/pzserver/_default.cfg @@ -1,12 +1,12 @@ ################################## ######## 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 +# DO NOT EDIT ANY CHANGES 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 #### +#### Game Server Settings #### ## Server Start Settings | https://docs.linuxgsm.com/configuration/start-parameters ip="0.0.0.0" @@ -88,15 +88,15 @@ logdays="7" # Query delay time querydelay="1" -#### LinuxGSM Advanced Settings #### - -# ANSI Colors +## ANSI Colors | https://docs.linuxgsm.com/features/ansi-colors ansi="on" -# Message Display Time +#### Advanced Settings #### + +## Message Display Time | https://docs.linuxgsm.com/features/message-display-time sleeptime="0.5" -## SteamCMD Settings +## SteamCMD Settings | https://docs.linuxgsm.com/steamcmd # Server appid appid="380870" # SteamCMD Branch | https://docs.linuxgsm.com/steamcmd/branch @@ -104,7 +104,7 @@ branch="" # Master Server | https://docs.linuxgsm.com/steamcmd/steam-master-server steammaster="false" -# Stop Mode | https://docs.linuxgsm.com/steamcmd/stopmode +## Stop Mode | https://docs.linuxgsm.com/features/stop-mode # 1: tmux kill # 2: CTRL+c # 3: quit @@ -117,7 +117,7 @@ steammaster="false" # 10: Teamspeak 3 stopmode="3" -## LinuxGSM Server Details +## Game Server Details # Do not edit gamename="Project Zomboid" engine="projectzomboid" @@ -126,7 +126,7 @@ glibc="2.15" #### Directories #### # Edit with care -## Server Specific Directories +## Game Server Directories systemdir="${serverfiles}" executabledir="${serverfiles}" executable="./start-server.sh" diff --git a/lgsm/config-default/config-lgsm/q2server/_default.cfg b/lgsm/config-default/config-lgsm/q2server/_default.cfg index 42525ec9b..f4200b816 100644 --- a/lgsm/config-default/config-lgsm/q2server/_default.cfg +++ b/lgsm/config-default/config-lgsm/q2server/_default.cfg @@ -1,12 +1,12 @@ ################################## ######## 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 +# DO NOT EDIT ANY CHANGES 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 #### +#### Game Server Settings #### ## Server Start Settings | https://docs.linuxgsm.com/configuration/start-parameters ip="0.0.0.0" @@ -87,15 +87,15 @@ logdays="7" # Query delay time querydelay="1" -#### LinuxGSM Advanced Settings #### - -# ANSI Colors +## ANSI Colors | https://docs.linuxgsm.com/features/ansi-colors ansi="on" -# Message Display Time +#### Advanced Settings #### + +## Message Display Time | https://docs.linuxgsm.com/features/message-display-time sleeptime="0.5" -# Stop Mode | https://docs.linuxgsm.com/steamcmd/stopmode +## Stop Mode | https://docs.linuxgsm.com/features/stop-mode # 1: tmux kill # 2: CTRL+c # 3: quit @@ -108,7 +108,7 @@ sleeptime="0.5" # 10: Teamspeak 3 stopmode="3" -## LinuxGSM Server Details +## Game Server Details # Do not edit gamename="Quake 2" engine="idtech2" @@ -117,7 +117,7 @@ glibc="null" #### Directories #### # Edit with care -## Server Specific Directories +## Game Server Directories systemdir="${serverfiles}/baseq2" executabledir="${serverfiles}" executable="./quake2" diff --git a/lgsm/config-default/config-lgsm/q3server/_default.cfg b/lgsm/config-default/config-lgsm/q3server/_default.cfg index 105a66895..b8bb7e0d4 100644 --- a/lgsm/config-default/config-lgsm/q3server/_default.cfg +++ b/lgsm/config-default/config-lgsm/q3server/_default.cfg @@ -1,12 +1,12 @@ ################################## ######## 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 +# DO NOT EDIT ANY CHANGES 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 #### +#### Game Server Settings #### ## Server Start Settings | https://docs.linuxgsm.com/configuration/start-parameters ip="0.0.0.0" @@ -87,15 +87,15 @@ logdays="7" # Query delay time querydelay="1" -#### LinuxGSM Advanced Settings #### - -# ANSI Colors +## ANSI Colors | https://docs.linuxgsm.com/features/ansi-colors ansi="on" -# Message Display Time +#### Advanced Settings #### + +## Message Display Time | https://docs.linuxgsm.com/features/message-display-time sleeptime="0.5" -# Stop Mode | https://docs.linuxgsm.com/steamcmd/stopmode +## Stop Mode | https://docs.linuxgsm.com/features/stop-mode # 1: tmux kill # 2: CTRL+c # 3: quit @@ -108,7 +108,7 @@ sleeptime="0.5" # 10: Teamspeak 3 stopmode="3" -## LinuxGSM Server Details +## Game Server Details # Do not edit gamename="Quake 3: Arena" engine="idtech3" @@ -117,7 +117,7 @@ glibc="2.1" #### Directories #### # Edit with care -## Server Specific Directories +## Game Server Directories systemdir="${serverfiles}/baseq3" executabledir="${serverfiles}" executable="./q3ded" diff --git a/lgsm/config-default/config-lgsm/qlserver/_default.cfg b/lgsm/config-default/config-lgsm/qlserver/_default.cfg index bf144b578..af316af7c 100644 --- a/lgsm/config-default/config-lgsm/qlserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/qlserver/_default.cfg @@ -1,12 +1,12 @@ ################################## ######## 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 +# DO NOT EDIT ANY CHANGES 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 #### +#### Game Server Settings #### ## Server Start Command | https://docs.linuxgsm.com/configuration/start-parameters#additional-parameters # Edit with care | Install/Config Guide : https://steamcommunity.com/sharedfiles/filedetails/?id=542966946 @@ -87,15 +87,15 @@ logdays="7" # Query delay time querydelay="1" -#### LinuxGSM Advanced Settings #### - -# ANSI Colors +## ANSI Colors | https://docs.linuxgsm.com/features/ansi-colors ansi="on" -# Message Display Time +#### Advanced Settings #### + +## Message Display Time | https://docs.linuxgsm.com/features/message-display-time sleeptime="0.5" -## SteamCMD Settings +## SteamCMD Settings | https://docs.linuxgsm.com/steamcmd # Server appid appid="349090" # SteamCMD Branch | https://docs.linuxgsm.com/steamcmd/branch @@ -103,7 +103,7 @@ branch="" # Master Server | https://docs.linuxgsm.com/steamcmd/steam-master-server steammaster="true" -# Stop Mode | https://docs.linuxgsm.com/steamcmd/stopmode +## Stop Mode | https://docs.linuxgsm.com/features/stop-mode # 1: tmux kill # 2: CTRL+c # 3: quit @@ -116,7 +116,7 @@ steammaster="true" # 10: Teamspeak 3 stopmode="3" -## LinuxGSM Server Details +## Game Server Details # Do not edit gamename="Quake Live" engine="idtech3_ql" @@ -125,7 +125,7 @@ glibc="2.15" #### Directories #### # Edit with care -## Server Specific Directories +## Game Server Directories systemdir="${serverfiles}" executabledir="${serverfiles}" executable=$([ "$(uname -m)" == "x86_64" ] && echo -e "./run_server_x64.sh" || echo -e "./run_server_x86.sh") diff --git a/lgsm/config-default/config-lgsm/qwserver/_default.cfg b/lgsm/config-default/config-lgsm/qwserver/_default.cfg index 5069e4818..ef19c7dc2 100644 --- a/lgsm/config-default/config-lgsm/qwserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/qwserver/_default.cfg @@ -1,12 +1,12 @@ ################################## ######## 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 +# DO NOT EDIT ANY CHANGES 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 #### +#### Game Server Settings #### ## Server Start Settings | https://docs.linuxgsm.com/configuration/start-parameters ip="0.0.0.0" @@ -86,15 +86,15 @@ logdays="7" # Query delay time querydelay="1" -#### LinuxGSM Advanced Settings #### - -# ANSI Colors +## ANSI Colors | https://docs.linuxgsm.com/features/ansi-colors ansi="on" -# Message Display Time +#### Advanced Settings #### + +## Message Display Time | https://docs.linuxgsm.com/features/message-display-time sleeptime="0.5" -# Stop Mode | https://docs.linuxgsm.com/steamcmd/stopmode +## Stop Mode | https://docs.linuxgsm.com/features/stop-mode # 1: tmux kill # 2: CTRL+c # 3: quit @@ -107,7 +107,7 @@ sleeptime="0.5" # 10: Teamspeak 3 stopmode="3" -## LinuxGSM Server Details +## Game Server Details # Do not edit gamename="QuakeWorld" engine="quake" @@ -116,7 +116,7 @@ glibc="2.17" #### Directories #### # Edit with care -## Server Specific Directories +## Game Server Directories systemdir="${serverfiles}/ktx" executabledir="${serverfiles}" executable="./mvdsv" diff --git a/lgsm/config-default/config-lgsm/ricochetserver/_default.cfg b/lgsm/config-default/config-lgsm/ricochetserver/_default.cfg index 67e810d5b..c6035eaba 100644 --- a/lgsm/config-default/config-lgsm/ricochetserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/ricochetserver/_default.cfg @@ -1,12 +1,12 @@ ################################## ######## 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 +# DO NOT EDIT ANY CHANGES 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 #### +#### Game Server Settings #### ## Server Start Settings | https://docs.linuxgsm.com/configuration/start-parameters ip="0.0.0.0" @@ -92,15 +92,15 @@ logdays="7" # Query delay time querydelay="1" -#### LinuxGSM Advanced Settings #### - -# ANSI Colors +## ANSI Colors | https://docs.linuxgsm.com/features/ansi-colors ansi="on" -# Message Display Time +#### Advanced Settings #### + +## Message Display Time | https://docs.linuxgsm.com/features/message-display-time sleeptime="0.5" -## SteamCMD Settings +## SteamCMD Settings | https://docs.linuxgsm.com/steamcmd # Server appid appid="90" appidmod="ricochet" @@ -109,7 +109,7 @@ branch="" # Master Server | https://docs.linuxgsm.com/steamcmd/steam-master-server steammaster="true" -# Stop Mode | https://docs.linuxgsm.com/steamcmd/stopmode +## Stop Mode | https://docs.linuxgsm.com/features/stop-mode # 1: tmux kill # 2: CTRL+c # 3: quit @@ -122,16 +122,16 @@ steammaster="true" # 10: Teamspeak 3 stopmode="9" -## LinuxGSM Server Details +## Game Server Details # Do not edit gamename="Ricochet" engine="goldsource" -glibcr="2.3.4" +glibc="2.3.4" #### Directories #### # Edit with care -## Server Specific Directories +## Game Server Directories systemdir="${serverfiles}/ricochet" executabledir="${serverfiles}" executable="./hlds_run" diff --git a/lgsm/config-default/config-lgsm/roserver/_default.cfg b/lgsm/config-default/config-lgsm/roserver/_default.cfg index d378dc455..6fba17ecd 100644 --- a/lgsm/config-default/config-lgsm/roserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/roserver/_default.cfg @@ -1,12 +1,12 @@ ################################## ######## 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 +# DO NOT EDIT ANY CHANGES 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 #### +#### Game Server Settings #### ## SteamCMD Login | https://docs.linuxgsm.com/steamcmd#steamcmd-login steamuser="username" @@ -93,15 +93,15 @@ logdays="7" # Query delay time querydelay="1" -#### LinuxGSM Advanced Settings #### - -# ANSI Colors +## ANSI Colors | https://docs.linuxgsm.com/features/ansi-colors ansi="on" -# Message Display Time +#### Advanced Settings #### + +## Message Display Time | https://docs.linuxgsm.com/features/message-display-time sleeptime="0.5" -## SteamCMD Settings +## SteamCMD Settings | https://docs.linuxgsm.com/steamcmd # Server appid appid="223250" # SteamCMD Branch | https://docs.linuxgsm.com/steamcmd/branch @@ -109,7 +109,7 @@ branch="" # Master Server | https://docs.linuxgsm.com/steamcmd/steam-master-server steammaster="false" -# Stop Mode | https://docs.linuxgsm.com/steamcmd/stopmode +## Stop Mode | https://docs.linuxgsm.com/features/stop-mode # 1: tmux kill # 2: CTRL+c # 3: quit @@ -122,7 +122,7 @@ steammaster="false" # 10: Teamspeak 3 stopmode="2" -## LinuxGSM Server Details +## Game Server Details # Do not edit gamename="Red Orchestra: Ostfront 41-45" engine="unreal2" @@ -131,7 +131,7 @@ glibc="2.4" #### Directories #### # Edit with care -## Server Specific Directories +## Game Server Directories serverfiles="${rootdir}/serverfiles" systemdir="${serverfiles}/system" executabledir="${systemdir}" diff --git a/lgsm/config-default/config-lgsm/rtcwserver/_default.cfg b/lgsm/config-default/config-lgsm/rtcwserver/_default.cfg index a70042e49..caddf44ec 100644 --- a/lgsm/config-default/config-lgsm/rtcwserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/rtcwserver/_default.cfg @@ -1,12 +1,12 @@ ################################## ######## 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 +# DO NOT EDIT ANY CHANGES 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 #### +#### Game Server Settings #### ## Server Start Settings | https://docs.linuxgsm.com/configuration/start-parameters ip="0.0.0.0" @@ -87,15 +87,15 @@ logdays="7" # Query delay time querydelay="1" -#### LinuxGSM Advanced Settings #### - -# ANSI Colors +## ANSI Colors | https://docs.linuxgsm.com/features/ansi-colors ansi="on" -# Message Display Time +#### Advanced Settings #### + +## Message Display Time | https://docs.linuxgsm.com/features/message-display-time sleeptime="0.5" -# Stop Mode | https://docs.linuxgsm.com/steamcmd/stopmode +## Stop Mode | https://docs.linuxgsm.com/features/stop-mode # 1: tmux kill # 2: CTRL+c # 3: quit @@ -108,7 +108,7 @@ sleeptime="0.5" # 10: Teamspeak 3 stopmode="3" -## LinuxGSM Server Details +## Game Server Details # Do not edit gamename="Return to Castle Wolfenstein" engine="ioquake3" @@ -117,7 +117,7 @@ glibc="2.1" #### Directories #### # Edit with care -## Server Specific Directories +## Game Server Directories systemdir="${serverfiles}/main" executabledir="${serverfiles}" executable="./iowolfded.x86_64" diff --git a/lgsm/config-default/config-lgsm/rustserver/_default.cfg b/lgsm/config-default/config-lgsm/rustserver/_default.cfg index e643ef8a4..db77df192 100644 --- a/lgsm/config-default/config-lgsm/rustserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/rustserver/_default.cfg @@ -1,12 +1,12 @@ ################################## ######## 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 +# DO NOT EDIT ANY CHANGES 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 #### +#### Game Server Settings #### ## Server Start Settings | https://docs.linuxgsm.com/configuration/start-parameters # More settings available after install in serverfiles/server/rust-server/server.cfg @@ -117,15 +117,15 @@ logdays="7" # Query delay time querydelay="1" -#### LinuxGSM Advanced Settings #### - -# ANSI Colors +## ANSI Colors | https://docs.linuxgsm.com/features/ansi-colors ansi="on" -# Message Display Time +#### Advanced Settings #### + +## Message Display Time | https://docs.linuxgsm.com/features/message-display-time sleeptime="0.5" -## SteamCMD Settings +## SteamCMD Settings | https://docs.linuxgsm.com/steamcmd # Server appid appid="258550" # SteamCMD Branch | https://docs.linuxgsm.com/steamcmd/branch @@ -133,7 +133,7 @@ branch="" # Master Server | https://docs.linuxgsm.com/steamcmd/steam-master-server steammaster="false" -# Stop Mode | https://docs.linuxgsm.com/steamcmd/stopmode +## Stop Mode | https://docs.linuxgsm.com/features/stop-mode # 1: tmux kill # 2: CTRL+c # 3: quit @@ -146,7 +146,7 @@ steammaster="false" # 10: Teamspeak 3 stopmode="3" -## LinuxGSM Server Details +## Game Server Details # Do not edit gamename="Rust" engine="unity3d" @@ -155,7 +155,7 @@ glibc="2.15" #### Directories #### # Edit with care -## Server Specific Directories +## Game Server Directories systemdir="${serverfiles}" executabledir="${serverfiles}" executable="./RustDedicated" diff --git a/lgsm/config-default/config-lgsm/rwserver/_default.cfg b/lgsm/config-default/config-lgsm/rwserver/_default.cfg index 2ab86085b..6d6cd7a2e 100644 --- a/lgsm/config-default/config-lgsm/rwserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/rwserver/_default.cfg @@ -1,12 +1,12 @@ ################################## ######## 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 +# DO NOT EDIT ANY CHANGES 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 #### +#### Game Server Settings #### ## Server Start Settings | https://docs.linuxgsm.com/configuration/start-parameters javaram="2048" # -Xmx$2048M @@ -88,15 +88,15 @@ logdays="7" # Query delay time querydelay="1" -#### LinuxGSM Advanced Settings #### - -# ANSI Colors +## ANSI Colors | https://docs.linuxgsm.com/features/ansi-colors ansi="on" -# Message Display Time +#### Advanced Settings #### + +## Message Display Time | https://docs.linuxgsm.com/features/message-display-time sleeptime="0.5" -## SteamCMD Settings +## SteamCMD Settings | https://docs.linuxgsm.com/steamcmd # Server appid appid="339010" # SteamCMD Branch | https://docs.linuxgsm.com/steamcmd/branch @@ -104,7 +104,7 @@ branch="" # Master Server | https://docs.linuxgsm.com/steamcmd/steam-master-server steammaster="false" -# Stop Mode | https://docs.linuxgsm.com/steamcmd/stopmode +## Stop Mode | https://docs.linuxgsm.com/features/stop-mode # 1: tmux kill # 2: CTRL+c # 3: quit @@ -117,7 +117,7 @@ steammaster="false" # 10: Teamspeak 3 stopmode="3" -## LinuxGSM Server Details +## Game Server Details # Do not edit gamename="Rising World" engine="risingworld" @@ -126,7 +126,7 @@ glibc="null" #### Directories #### # Edit with care -## Server Specific Directories +## Game Server Directories systemdir="${serverfiles}" executabledir="${serverfiles}" executable="java -Xmx${javaram}m -jar ${serverfiles}/server.jar" diff --git a/lgsm/config-default/config-lgsm/sampserver/_default.cfg b/lgsm/config-default/config-lgsm/sampserver/_default.cfg index 43f0d3cba..94b013172 100644 --- a/lgsm/config-default/config-lgsm/sampserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/sampserver/_default.cfg @@ -1,12 +1,12 @@ ################################## ######## 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 +# DO NOT EDIT ANY CHANGES 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 #### +#### Game Server Settings #### ## Server Start Settings | https://docs.linuxgsm.com/configuration/start-parameters ip="0.0.0.0" @@ -86,15 +86,15 @@ logdays="7" # Query delay time querydelay="1" -#### LinuxGSM Advanced Settings #### - -# ANSI Colors +## ANSI Colors | https://docs.linuxgsm.com/features/ansi-colors ansi="on" -# Message Display Time +#### Advanced Settings #### + +## Message Display Time | https://docs.linuxgsm.com/features/message-display-time sleeptime="0.5" -# Stop Mode | https://docs.linuxgsm.com/steamcmd/stopmode +## Stop Mode | https://docs.linuxgsm.com/features/stop-mode # 1: tmux kill # 2: CTRL+c # 3: quit @@ -107,7 +107,7 @@ sleeptime="0.5" # 10: Teamspeak 3 stopmode="2" -## LinuxGSM Server Details +## Game Server Details # Do not edit gamename="San Andreas Multiplayer" engine="renderware" @@ -116,7 +116,7 @@ glibc="2.3" #### Directories #### # Edit with care -## Server Specific Directories +## Game Server Directories systemdir="${serverfiles}" executabledir="${systemdir}/samp03" executable="./samp03svr" diff --git a/lgsm/config-default/config-lgsm/sbotsserver/_default.cfg b/lgsm/config-default/config-lgsm/sbotsserver/_default.cfg index 8278af21d..60055d1dc 100644 --- a/lgsm/config-default/config-lgsm/sbotsserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/sbotsserver/_default.cfg @@ -1,12 +1,12 @@ ################################## ######## 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 +# DO NOT EDIT ANY CHANGES 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 #### +#### Game Server Settings #### ## Server Start Settings | https://docs.linuxgsm.com/configuration/start-parameters port="7777" @@ -90,15 +90,15 @@ logdays="7" # Query delay time querydelay="1" -#### LinuxGSM Advanced Settings #### - -# ANSI Colors +## ANSI Colors | https://docs.linuxgsm.com/features/ansi-colors ansi="on" -# Message Display Time +#### Advanced Settings #### + +## Message Display Time | https://docs.linuxgsm.com/features/message-display-time sleeptime="0.5" -## SteamCMD Settings +## SteamCMD Settings | https://docs.linuxgsm.com/steamcmd # Server appid appid="974130" # SteamCMD Branch | https://docs.linuxgsm.com/steamcmd/branch @@ -106,7 +106,7 @@ branch="" # Master Server | https://docs.linuxgsm.com/steamcmd/steam-master-server steammaster="false" -# Stop Mode | https://docs.linuxgsm.com/steamcmd/stopmode +## Stop Mode | https://docs.linuxgsm.com/features/stop-mode # 1: tmux kill # 2: CTRL+c # 3: quit @@ -119,7 +119,7 @@ steammaster="false" # 10: Teamspeak 3 stopmode="2" -## LinuxGSM Server Details +## Game Server Details # Do not edit gamename="StickyBots" engine="unreal4" @@ -128,7 +128,7 @@ glibc="2.17" #### Directories #### # Edit with care -## Server Specific Directories +## Game Server Directories systemdir="${serverfiles}" executabledir="${systemdir}/blank1/Binaries/Linux" executable="./blank1Server-Linux-Shipping" diff --git a/lgsm/config-default/config-lgsm/sbserver/_default.cfg b/lgsm/config-default/config-lgsm/sbserver/_default.cfg index 09de95570..6bb5e7979 100644 --- a/lgsm/config-default/config-lgsm/sbserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/sbserver/_default.cfg @@ -1,12 +1,12 @@ ################################## ######## 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 +# DO NOT EDIT ANY CHANGES 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 #### +#### Game Server Settings #### ## SteamCMD Login | https://docs.linuxgsm.com/steamcmd#steamcmd-login steamuser="username" @@ -92,22 +92,22 @@ logdays="7" # Query delay time querydelay="1" -#### LinuxGSM Advanced Settings #### - -# ANSI Colors +## ANSI Colors | https://docs.linuxgsm.com/features/ansi-colors ansi="on" -# Message Display Time +#### Advanced Settings #### + +## Message Display Time | https://docs.linuxgsm.com/features/message-display-time sleeptime="0.5" -## SteamCMD Settings +## SteamCMD Settings | https://docs.linuxgsm.com/steamcmd # Server appid appid="211820" # SteamCMD Branch | https://docs.linuxgsm.com/steamcmd/branch branch="" steammaster="flase" -# Stop Mode | https://docs.linuxgsm.com/steamcmd/stopmode +## Stop Mode | https://docs.linuxgsm.com/features/stop-mode # 1: tmux kill # 2: CTRL+c # 3: quit @@ -120,7 +120,7 @@ steammaster="flase" # 10: Teamspeak 3 stopmode="2" -## LinuxGSM Server Details +## Game Server Details # Do not edit gamename="Starbound" engine="starbound" @@ -129,7 +129,7 @@ glibc="2.17" #### Directories #### # Edit with care -## Server Specific Directories +## Game Server Directories systemdir="${serverfiles}" executabledir="${serverfiles}/linux" executable="./starbound_server" diff --git a/lgsm/config-default/config-lgsm/sdtdserver/_default.cfg b/lgsm/config-default/config-lgsm/sdtdserver/_default.cfg index 5043bcac3..0da428304 100644 --- a/lgsm/config-default/config-lgsm/sdtdserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/sdtdserver/_default.cfg @@ -1,12 +1,12 @@ ################################## ######## 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 +# DO NOT EDIT ANY CHANGES 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 #### +#### Game Server Settings #### ## Server Start Settings | https://docs.linuxgsm.com/configuration/start-parameters ip="0.0.0.0" @@ -88,15 +88,15 @@ logdays="7" # Query delay time querydelay="1" -#### LinuxGSM Advanced Settings #### - -# ANSI Colors +## ANSI Colors | https://docs.linuxgsm.com/features/ansi-colors ansi="on" -# Message Display Time +#### Advanced Settings #### + +## Message Display Time | https://docs.linuxgsm.com/features/message-display-time sleeptime="0.5" -## SteamCMD Settings +## SteamCMD Settings | https://docs.linuxgsm.com/steamcmd # Server appid appid="294420" # SteamCMD Branch | https://docs.linuxgsm.com/steamcmd/branch @@ -104,7 +104,7 @@ branch="" # Master Server | https://docs.linuxgsm.com/steamcmd/steam-master-server steammaster="true" -# Stop Mode | https://docs.linuxgsm.com/steamcmd/stopmode +## Stop Mode | https://docs.linuxgsm.com/features/stop-mode # 1: tmux kill # 2: CTRL+c # 3: quit @@ -114,10 +114,10 @@ steammaster="true" # 7: exit # 8: 7 Days to Die # 9: Gold Source -# teamspeak 3 +# 10: Teamspeak 3 stopmode="8" -## LinuxGSM Server Details +## Game Server Details # Do not edit gamename="7 Days To Die" engine="unity3d" @@ -126,14 +126,12 @@ glibc="2.15" #### Directories #### # Edit with care -## Server Specific Directories +## Game Server Directories systemdir="${serverfiles}" executabledir="${serverfiles}" executable=$([ "$(uname -m)" == "x86_64" ] && echo -e "./7DaysToDieServer.x86_64" || echo -e "./7DaysToDieServer.x86") servercfgdefault="serverconfig.xml" -servercfgdirdefault="${serverfiles}" -servercfgfullpathdefault="${servercfgdirdefault}/${servercfgdefault}" -servercfg="${servicename}.xml" +servercfgfullpathdefault="${serverfiles}/${servercfgdefault}" servercfgdir="${serverfiles}" servercfgfullpath="${servercfgdir}/${servercfg}" diff --git a/lgsm/config-default/config-lgsm/sfcserver/_default.cfg b/lgsm/config-default/config-lgsm/sfcserver/_default.cfg index aafdc7be8..b1a278dc0 100644 --- a/lgsm/config-default/config-lgsm/sfcserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/sfcserver/_default.cfg @@ -1,12 +1,12 @@ ################################## ######## 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 +# DO NOT EDIT ANY CHANGES 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 #### +#### Game Server Settings #### ## Server Start Settings | https://docs.linuxgsm.com/configuration/start-parameters ip="0.0.0.0" @@ -93,15 +93,15 @@ logdays="7" # Query delay time querydelay="1" -#### LinuxGSM Advanced Settings #### - -# ANSI Colors +## ANSI Colors | https://docs.linuxgsm.com/features/ansi-colors ansi="on" -# Message Display Time +#### Advanced Settings #### + +## Message Display Time | https://docs.linuxgsm.com/features/message-display-time sleeptime="0.5" -## SteamCMD Settings +## SteamCMD Settings | https://docs.linuxgsm.com/steamcmd # Server appid appid="244310" # Source 2013 SDK # SteamCMD Branch | https://docs.linuxgsm.com/steamcmd/branch @@ -109,7 +109,7 @@ branch="" # Master Server | https://docs.linuxgsm.com/steamcmd/steam-master-server steammaster="true" -# Stop Mode | https://docs.linuxgsm.com/steamcmd/stopmode +## Stop Mode | https://docs.linuxgsm.com/features/stop-mode # 1: tmux kill # 2: CTRL+c # 3: quit @@ -122,7 +122,7 @@ steammaster="true" # 10: Teamspeak 3 stopmode="3" -## LinuxGSM Server Details +## Game Server Details # Do not edit gamename="SourceForts Classic" engine="source" @@ -131,7 +131,7 @@ glibc="2.15" #### Directories #### # Edit with care -## Server Specific Directories +## Game Server Directories systemdir="${serverfiles}/sfclassic" executabledir="${serverfiles}" executable="./srcds_run" diff --git a/lgsm/config-default/config-lgsm/sof2server/_default.cfg b/lgsm/config-default/config-lgsm/sof2server/_default.cfg index a1dcea4d7..4c3bbe762 100644 --- a/lgsm/config-default/config-lgsm/sof2server/_default.cfg +++ b/lgsm/config-default/config-lgsm/sof2server/_default.cfg @@ -1,12 +1,12 @@ ################################## ######## 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 +# DO NOT EDIT ANY CHANGES 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 #### +#### Game Server Settings #### ## Server Start Settings | https://docs.linuxgsm.com/configuration/start-parameters ip="0.0.0.0" @@ -87,15 +87,15 @@ logdays="7" # Query delay time querydelay="1" -#### LinuxGSM Advanced Settings #### - -# ANSI Colors +## ANSI Colors | https://docs.linuxgsm.com/features/ansi-colors ansi="on" -# Message Display Time +#### Advanced Settings #### + +## Message Display Time | https://docs.linuxgsm.com/features/message-display-time sleeptime="0.5" -# Stop Mode | https://docs.linuxgsm.com/steamcmd/stopmode +## Stop Mode | https://docs.linuxgsm.com/features/stop-mode # 1: tmux kill # 2: CTRL+c # 3: quit @@ -108,7 +108,7 @@ sleeptime="0.5" # 10: Teamspeak 3 stopmode="3" -## LinuxGSM Server Details +## Game Server Details # Do not edit gamename="Soldier Of Fortune 2: Gold Edition" engine="idtech3" @@ -117,7 +117,7 @@ glibc="2.1" #### Directories #### # Edit with care -## Server Specific Directories +## Game Server Directories systemdir="${serverfiles}/main" executabledir="${serverfiles}" executable="./sof2ded" diff --git a/lgsm/config-default/config-lgsm/solserver/_default.cfg b/lgsm/config-default/config-lgsm/solserver/_default.cfg index 5cc80f3df..b53933437 100644 --- a/lgsm/config-default/config-lgsm/solserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/solserver/_default.cfg @@ -1,12 +1,12 @@ ################################## ######## 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 +# DO NOT EDIT ANY CHANGES 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 #### +#### Game Server Settings #### ## Server Start Settings | https://docs.linuxgsm.com/configuration/start-parameters ip="0.0.0.0" @@ -88,15 +88,15 @@ logdays="7" # Query delay time querydelay="1" -#### LinuxGSM Advanced Settings #### - -# ANSI Colors +## ANSI Colors | https://docs.linuxgsm.com/features/ansi-colors ansi="on" -# Message Display Time +#### Advanced Settings #### + +## Message Display Time | https://docs.linuxgsm.com/features/message-display-time sleeptime="0.5" -# Stop Mode | https://docs.linuxgsm.com/steamcmd/stopmode +## Stop Mode | https://docs.linuxgsm.com/features/stop-mode # 1: tmux kill # 2: CTRL+c # 3: quit @@ -109,7 +109,7 @@ sleeptime="0.5" # 10: Teamspeak 3 stopmode="2" -## LinuxGSM Server Details +## Game Server Details # Do not edit gamename="Soldat" engine="soldat" @@ -118,12 +118,14 @@ glibc="2.1" #### Directories #### # Edit with care -## Server Specific Directories +## Game Server Directories systemdir="${serverfiles}" executabledir="${systemdir}" executable="./soldatserver" -servercfg="soldat.ini" servercfgdir="${systemdir}" +servercfg="soldat.ini" +servercfgdefault="soldat.ini" + servercfgfullpath="${servercfgdir}/${servercfg}" ## Backup Directory diff --git a/lgsm/config-default/config-lgsm/squadserver/_default.cfg b/lgsm/config-default/config-lgsm/squadserver/_default.cfg index 97991d083..e8f5c5a78 100644 --- a/lgsm/config-default/config-lgsm/squadserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/squadserver/_default.cfg @@ -1,12 +1,12 @@ ################################## ######## 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 +# DO NOT EDIT ANY CHANGES 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 #### +#### Game Server Settings #### ## Server Start Settings | https://docs.linuxgsm.com/configuration/start-parameters port="7787" @@ -90,15 +90,15 @@ logdays="7" # Query delay time querydelay="1" -#### LinuxGSM Advanced Settings #### - -# ANSI Colors +## ANSI Colors | https://docs.linuxgsm.com/features/ansi-colors ansi="on" -# Message Display Time +#### Advanced Settings #### + +## Message Display Time | https://docs.linuxgsm.com/features/message-display-time sleeptime="0.5" -## SteamCMD Settings +## SteamCMD Settings | https://docs.linuxgsm.com/steamcmd # Server appid appid="403240" # SteamCMD Branch | https://docs.linuxgsm.com/steamcmd/branch @@ -106,7 +106,7 @@ branch="" # Master Server | https://docs.linuxgsm.com/steamcmd/steam-master-server steammaster="false" -# Stop Mode | https://docs.linuxgsm.com/steamcmd/stopmode +## Stop Mode | https://docs.linuxgsm.com/features/stop-mode # 1: tmux kill # 2: CTRL+c # 3: quit @@ -119,7 +119,7 @@ steammaster="false" # 10: Teamspeak 3 stopmode="2" -## LinuxGSM Server Details +## Game Server Details # Do not edit gamename="Squad" engine="unreal4" @@ -128,7 +128,7 @@ glibc="2.17" #### Directories #### # Edit with care -## Server Specific Directories +## Game Server Directories systemdir="${serverfiles}/Squad" executabledir="${serverfiles}" executable="./SquadGameServer.sh" diff --git a/lgsm/config-default/config-lgsm/ss3server/_default.cfg b/lgsm/config-default/config-lgsm/ss3server/_default.cfg index 5fe555d86..c4efbdfb9 100644 --- a/lgsm/config-default/config-lgsm/ss3server/_default.cfg +++ b/lgsm/config-default/config-lgsm/ss3server/_default.cfg @@ -1,12 +1,12 @@ ################################## ######## 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 +# DO NOT EDIT ANY CHANGES 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 #### +#### Game Server Settings #### ## Server Start Settings | https://docs.linuxgsm.com/configuration/start-parameters ip="0.0.0.0" @@ -89,15 +89,15 @@ logdays="7" # Query delay time querydelay="1" -#### LinuxGSM Advanced Settings #### - -# ANSI Colors +## ANSI Colors | https://docs.linuxgsm.com/features/ansi-colors ansi="on" -# Message Display Time +#### Advanced Settings #### + +## Message Display Time | https://docs.linuxgsm.com/features/message-display-time sleeptime="0.5" -## SteamCMD Settings +## SteamCMD Settings | https://docs.linuxgsm.com/steamcmd # Server appid appid="41080" # SteamCMD Branch | https://docs.linuxgsm.com/steamcmd/branch @@ -105,7 +105,7 @@ branch="" # Master Server | https://docs.linuxgsm.com/steamcmd/steam-master-server steammaster="false" -# Stop Mode | https://docs.linuxgsm.com/steamcmd/stopmode +## Stop Mode | https://docs.linuxgsm.com/features/stop-mode # 1: tmux kill # 2: CTRL+c # 3: quit @@ -118,7 +118,7 @@ steammaster="false" # 10: Teamspeak 3 stopmode="2" -## LinuxGSM Server Details +## Game Server Details # Do not edit gamename="Serious Sam 3: BFE" engine="seriousengine35" @@ -127,10 +127,10 @@ glibc="2.13" #### Directories #### # Edit with care -## Server Specific Directories +## Game Server Directories systemdir="${serverfiles}/Bin" -executable="./runSam3_DedicatedServer.sh" executabledir="${systemdir}" +executable="./runSam3_DedicatedServer.sh" servercfg="${servicename}.ini" servercfgdefault="server.ini" servercfgdir="${serverfiles}/Content/SeriousSam3/Config" diff --git a/lgsm/config-default/config-lgsm/stserver/_default.cfg b/lgsm/config-default/config-lgsm/stserver/_default.cfg index c295b947d..3415e7331 100644 --- a/lgsm/config-default/config-lgsm/stserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/stserver/_default.cfg @@ -1,12 +1,12 @@ ################################## ######## 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 +# DO NOT EDIT ANY CHANGES 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 #### +#### Game Server Settings #### ## Server Start Settings | https://docs.linuxgsm.com/configuration/start-parameters ip="0.0.0.0" @@ -18,7 +18,7 @@ clearinterval=60 worldname="moon_save" ## Server Start Command | https://docs.linuxgsm.com/configuration/start-parameters#additional-parameters -# Edit with care | http://hurtworld.wikia.com/wiki/Hosting_A_Server +# Edit with care fn_parms(){ parms="-batchmode -nographics -autostart -gameport=${port} -updateport=${queryport} -worldtype=${worldtype} -loadworld=${worldname} -worldname=${worldname} -autosaveinterval=${autosaveinterval} -clearallinterval=${clearinterval}" } @@ -95,15 +95,15 @@ logdays="7" # Query delay time querydelay="1" -#### LinuxGSM Advanced Settings #### - -# ANSI Colors +## ANSI Colors | https://docs.linuxgsm.com/features/ansi-colors ansi="on" -# Message Display Time +#### Advanced Settings #### + +## Message Display Time | https://docs.linuxgsm.com/features/message-display-time sleeptime="0.5" -## SteamCMD Settings +## SteamCMD Settings | https://docs.linuxgsm.com/steamcmd # Server appid appid="600760" # SteamCMD Branch | https://docs.linuxgsm.com/steamcmd/branch @@ -111,7 +111,7 @@ branch="" # Master Server | https://docs.linuxgsm.com/steamcmd/steam-master-server steammaster="false" -# Stop Mode | https://docs.linuxgsm.com/steamcmd/stopmode +## Stop Mode | https://docs.linuxgsm.com/features/stop-mode # 1: tmux kill # 2: CTRL+c # 3: quit @@ -124,7 +124,7 @@ steammaster="false" # 10: Teamspeak 3 stopmode="2" -## LinuxGSM Server Details +## Game Server Details # Do not edit gamename="Stationeers" engine="unity3d" @@ -133,7 +133,7 @@ glibc="2.15" #### Directories #### # Edit with care -## Server Specific Directories +## Game Server Directories systemdir="${serverfiles}" executabledir="${serverfiles}" executable="./rocketstation_DedicatedServer.x86_64" diff --git a/lgsm/config-default/config-lgsm/svenserver/_default.cfg b/lgsm/config-default/config-lgsm/svenserver/_default.cfg index 837c2db37..fd9d67995 100644 --- a/lgsm/config-default/config-lgsm/svenserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/svenserver/_default.cfg @@ -1,12 +1,12 @@ ################################## ######## 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 +# DO NOT EDIT ANY CHANGES 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 #### +#### Game Server Settings #### ## Server Start Settings | https://docs.linuxgsm.com/configuration/start-parameters ip="0.0.0.0" @@ -92,15 +92,15 @@ logdays="7" # Query delay time querydelay="1" -#### LinuxGSM Advanced Settings #### - -# ANSI Colors +## ANSI Colors | https://docs.linuxgsm.com/features/ansi-colors ansi="on" -# Message Display Time +#### Advanced Settings #### + +## Message Display Time | https://docs.linuxgsm.com/features/message-display-time sleeptime="0.5" -## SteamCMD Settings +## SteamCMD Settings | https://docs.linuxgsm.com/steamcmd # Server appid appid="276060" # SteamCMD Branch | https://docs.linuxgsm.com/steamcmd/branch @@ -108,7 +108,7 @@ branch="" # Master Server | https://docs.linuxgsm.com/steamcmd/steam-master-server steammaster="true" -# Stop Mode | https://docs.linuxgsm.com/steamcmd/stopmode +## Stop Mode | https://docs.linuxgsm.com/features/stop-mode # 1: tmux kill # 2: CTRL+c # 3: quit @@ -121,7 +121,7 @@ steammaster="true" # 10: Teamspeak 3 stopmode="9" -## LinuxGSM Server Details +## Game Server Details # Do not edit gamename="Sven Co-op" engine="goldsource" @@ -130,7 +130,7 @@ glibc="2.24" #### Directories #### # Edit with care -## Server Specific Directories +## Game Server Directories systemdir="${serverfiles}/svencoop" executabledir="${serverfiles}" executable="./svends_run" diff --git a/lgsm/config-default/config-lgsm/terrariaserver/_default.cfg b/lgsm/config-default/config-lgsm/terrariaserver/_default.cfg index 238bc71f9..5046bb208 100644 --- a/lgsm/config-default/config-lgsm/terrariaserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/terrariaserver/_default.cfg @@ -1,12 +1,12 @@ ################################## ######## 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 +# DO NOT EDIT ANY CHANGES 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 #### +#### Game Server Settings #### ## SteamCMD Login | https://docs.linuxgsm.com/steamcmd#steamcmd-login steamuser="username" @@ -92,15 +92,15 @@ logdays="7" # Query delay time querydelay="1" -#### LinuxGSM Advanced Settings #### - -# ANSI Colors +## ANSI Colors | https://docs.linuxgsm.com/features/ansi-colors ansi="on" -# Message Display Time +#### Advanced Settings #### + +## Message Display Time | https://docs.linuxgsm.com/features/message-display-time sleeptime="0.5" -## SteamCMD Settings +## SteamCMD Settings | https://docs.linuxgsm.com/steamcmd # Server appid appid="105600" # SteamCMD Branch | https://docs.linuxgsm.com/steamcmd/branch @@ -108,7 +108,7 @@ branch="" # Master Server | https://docs.linuxgsm.com/steamcmd/steam-master-server steammaster="false" -# Stop Mode | https://docs.linuxgsm.com/steamcmd/stopmode +## Stop Mode | https://docs.linuxgsm.com/features/stop-mode # 1: tmux kill # 2: CTRL+c # 3: quit @@ -121,7 +121,7 @@ steammaster="false" # 10: Teamspeak 3 stopmode="7" -## LinuxGSM Server Details +## Game Server Details # Do not edit gamename="Terraria" engine="terraria" @@ -130,7 +130,7 @@ glibc="2.7" #### Directories #### # Edit with care -## Server Specific Directories +## Game Server Directories systemdir="${serverfiles}" executabledir="${serverfiles}" executable="./TerrariaServer" diff --git a/lgsm/config-default/config-lgsm/tf2server/_default.cfg b/lgsm/config-default/config-lgsm/tf2server/_default.cfg index 606853630..0948c0e9b 100644 --- a/lgsm/config-default/config-lgsm/tf2server/_default.cfg +++ b/lgsm/config-default/config-lgsm/tf2server/_default.cfg @@ -1,12 +1,12 @@ ################################## ######## 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 +# DO NOT EDIT ANY CHANGES 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 #### +#### Game Server Settings #### ## Server Start Settings | https://docs.linuxgsm.com/configuration/start-parameters ip="0.0.0.0" @@ -16,9 +16,9 @@ sourcetvport="27020" defaultmap="cp_badlands" maxplayers="16" -## Optional: Game Server Login Token +## Game Server Login Token (GSLT): Optional # GSLT can be used for running a public server. -# More info: https://linuxgsm.com/gslt +# More info: https://docs.linuxgsm.com/steamcmd/gslt gslt="" ## Server Start Command | https://docs.linuxgsm.com/configuration/start-parameters#additional-parameters @@ -98,15 +98,15 @@ logdays="7" # Query delay time querydelay="1" -#### LinuxGSM Advanced Settings #### - -# ANSI Colors +## ANSI Colors | https://docs.linuxgsm.com/features/ansi-colors ansi="on" -# Message Display Time +#### Advanced Settings #### + +## Message Display Time | https://docs.linuxgsm.com/features/message-display-time sleeptime="0.5" -## SteamCMD Settings +## SteamCMD Settings | https://docs.linuxgsm.com/steamcmd # Server appid appid="232250" # SteamCMD Branch | https://docs.linuxgsm.com/steamcmd/branch @@ -114,7 +114,7 @@ branch="" # Master Server | https://docs.linuxgsm.com/steamcmd/steam-master-server steammaster="true" -# Stop Mode | https://docs.linuxgsm.com/steamcmd/stopmode +## Stop Mode | https://docs.linuxgsm.com/features/stop-mode # 1: tmux kill # 2: CTRL+c # 3: quit @@ -127,7 +127,7 @@ steammaster="true" # 10: Teamspeak 3 stopmode="3" -## LinuxGSM Server Details +## Game Server Details # Do not edit gamename="Team Fortress 2" engine="source" @@ -136,7 +136,7 @@ glibc="2.15" #### Directories #### # Edit with care -## Server Specific Directories +## Game Server Directories systemdir="${serverfiles}/tf" executabledir="${serverfiles}" executable="./srcds_run" diff --git a/lgsm/config-default/config-lgsm/tfcserver/_default.cfg b/lgsm/config-default/config-lgsm/tfcserver/_default.cfg index cf02a2be3..548f6d9ff 100644 --- a/lgsm/config-default/config-lgsm/tfcserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/tfcserver/_default.cfg @@ -1,12 +1,12 @@ ################################## ######## 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 +# DO NOT EDIT ANY CHANGES 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 #### +#### Game Server Settings #### ## Server Start Settings | https://docs.linuxgsm.com/configuration/start-parameters ip="0.0.0.0" @@ -92,15 +92,15 @@ logdays="7" # Query delay time querydelay="1" -#### LinuxGSM Advanced Settings #### - -# ANSI Colors +## ANSI Colors | https://docs.linuxgsm.com/features/ansi-colors ansi="on" -# Message Display Time +#### Advanced Settings #### + +## Message Display Time | https://docs.linuxgsm.com/features/message-display-time sleeptime="0.5" -## SteamCMD Settings +## SteamCMD Settings | https://docs.linuxgsm.com/steamcmd # Server appid appid="90" appidmod="tfc" @@ -109,7 +109,7 @@ branch="" # Master Server | https://docs.linuxgsm.com/steamcmd/steam-master-server steammaster="true" -# Stop Mode | https://docs.linuxgsm.com/steamcmd/stopmode +## Stop Mode | https://docs.linuxgsm.com/features/stop-mode # 1: tmux kill # 2: CTRL+c # 3: quit @@ -122,7 +122,7 @@ steammaster="true" # 10: Teamspeak 3 stopmode="9" -## LinuxGSM Server Details +## Game Server Details # Do not edit gamename="Team Fortress Classic" engine="goldsource" @@ -131,7 +131,7 @@ glibc="2.3.4" #### Directories #### # Edit with care -## Server Specific Directories +## Game Server Directories systemdir="${serverfiles}/tfc" executabledir="${serverfiles}" executable="./hlds_run" diff --git a/lgsm/config-default/config-lgsm/ts3server/_default.cfg b/lgsm/config-default/config-lgsm/ts3server/_default.cfg index e211979db..fa37e5c64 100644 --- a/lgsm/config-default/config-lgsm/ts3server/_default.cfg +++ b/lgsm/config-default/config-lgsm/ts3server/_default.cfg @@ -1,10 +1,10 @@ ################################## ######## 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 +# DO NOT EDIT ANY CHANGES 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://docs.linuxgsm.com/configuration/start-parameters # Edit serverfiles/ts3server.ini after installation @@ -86,15 +86,15 @@ logdays="7" # Query delay time querydelay="1" -#### LinuxGSM Advanced Settings #### - -# ANSI Colors +## ANSI Colors | https://docs.linuxgsm.com/features/ansi-colors ansi="on" -# Message Display Time +#### Advanced Settings #### + +## Message Display Time | https://docs.linuxgsm.com/features/message-display-time sleeptime="0.5" -# Stop Mode | https://docs.linuxgsm.com/steamcmd/stopmode +## Stop Mode | https://docs.linuxgsm.com/features/stop-mode # 1: tmux kill # 2: CTRL+c # 3: quit @@ -107,7 +107,7 @@ sleeptime="0.5" # 10: Teamspeak 3 stopmode="2" -## LinuxGSM Server Details +## Game Server Details # Do not edit gamename="TeamSpeak 3" servername="TeamSpeak 3 Server" @@ -117,7 +117,7 @@ glibc="2.17" #### Directories #### # Edit with care -## Server Specific Directories +## Game Server Directories systemdir="${serverfiles}" executabledir="${serverfiles}" executable="./ts3server" diff --git a/lgsm/config-default/config-lgsm/tsserver/_default.cfg b/lgsm/config-default/config-lgsm/tsserver/_default.cfg index 3ab453689..8a44c171d 100644 --- a/lgsm/config-default/config-lgsm/tsserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/tsserver/_default.cfg @@ -1,12 +1,12 @@ ################################## ######## 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 +# DO NOT EDIT ANY CHANGES 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 #### +#### Game Server Settings #### ## Server Start Settings | https://docs.linuxgsm.com/configuration/start-parameters ip="0.0.0.0" @@ -92,15 +92,15 @@ logdays="7" # Query delay time querydelay="1" -#### LinuxGSM Advanced Settings #### - -# ANSI Colors +## ANSI Colors | https://docs.linuxgsm.com/features/ansi-colors ansi="on" -# Message Display Time +#### Advanced Settings #### + +## Message Display Time | https://docs.linuxgsm.com/features/message-display-time sleeptime="0.5" -## SteamCMD Settings +## SteamCMD Settings | https://docs.linuxgsm.com/steamcmd # Server appid appid="90" appidmod="cstrike" @@ -109,7 +109,7 @@ branch="" # Master Server | https://docs.linuxgsm.com/steamcmd/steam-master-server steammaster="true" -# Stop Mode | https://docs.linuxgsm.com/steamcmd/stopmode +## Stop Mode | https://docs.linuxgsm.com/features/stop-mode # 1: tmux kill # 2: CTRL+c # 3: quit @@ -122,7 +122,7 @@ steammaster="true" # 10: Teamspeak 3 stopmode="9" -## LinuxGSM Server Details +## Game Server Details # Do not edit gamename="The Specialists" engine="goldsource" @@ -131,7 +131,7 @@ glibc="2.3.4" #### Directories #### # Edit with care -## Server Specific Directories +## Game Server Directories systemdir="${serverfiles}/ts" executabledir="${serverfiles}" executable="./hlds_run" diff --git a/lgsm/config-default/config-lgsm/tuserver/_default.cfg b/lgsm/config-default/config-lgsm/tuserver/_default.cfg index 871847600..9951585d8 100644 --- a/lgsm/config-default/config-lgsm/tuserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/tuserver/_default.cfg @@ -1,21 +1,21 @@ ################################## ######## 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 +# DO NOT EDIT ANY CHANGES 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 #### +#### Game Server Settings #### ## Server Start Settings | https://docs.linuxgsm.com/configuration/start-parameters ip="0.0.0.0" port="7777" queryport="27015" -## Optional: Game Server Login Token +## Game Server Login Token (GSLT): Optional # GSLT can be used for running a public server. -# More info: https://linuxgsm.com/gslt +# More info: https://docs.linuxgsm.com/steamcmd/gslt gslt="" ## Server Start Command | https://docs.linuxgsm.com/configuration/start-parameters#additional-parameters @@ -95,15 +95,15 @@ logdays="7" # Query delay time querydelay="1" -#### LinuxGSM Advanced Settings #### - -# ANSI Colors +## ANSI Colors | https://docs.linuxgsm.com/features/ansi-colors ansi="on" -# Message Display Time +#### Advanced Settings #### + +## Message Display Time | https://docs.linuxgsm.com/features/message-display-time sleeptime="0.5" -## SteamCMD Settings +## SteamCMD Settings | https://docs.linuxgsm.com/steamcmd # Server appid appid="439660" # SteamCMD Branch | https://docs.linuxgsm.com/steamcmd/branch @@ -111,7 +111,7 @@ branch="" # Master Server | https://docs.linuxgsm.com/steamcmd/steam-master-server steammaster="false" -# Stop Mode | https://docs.linuxgsm.com/steamcmd/stopmode +## Stop Mode | https://docs.linuxgsm.com/features/stop-mode # 1: tmux kill # 2: CTRL+c # 3: quit @@ -124,7 +124,7 @@ steammaster="false" # 10: Teamspeak 3 stopmode="2" -## LinuxGSM Server Details +## Game Server Details # Do not edit gamename="Tower Unite" engine="unreal4" @@ -133,14 +133,14 @@ glibc="2.17" #### Directories #### # Edit with care -## Server Specific Directories +## Game Server Directories systemdir="${serverfiles}/Tower" executabledir="${systemdir}/Binaries/Linux" executable="./TowerServer-Linux-Shipping" -servercfgdir="${systemdir}/Binaries/Linux" servercfg="${servicename}.ini" -servercfgfullpath="${servercfgdir}/${servercfg}" servercfgdefault="TowerServer.ini" +servercfgdir="${systemdir}/Binaries/Linux" +servercfgfullpath="${servercfgdir}/${servercfg}" ## Backup Directory backupdir="${lgsmdir}/backup" diff --git a/lgsm/config-default/config-lgsm/twserver/_default.cfg b/lgsm/config-default/config-lgsm/twserver/_default.cfg index 9381b8a88..7703f02fb 100644 --- a/lgsm/config-default/config-lgsm/twserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/twserver/_default.cfg @@ -1,12 +1,12 @@ ################################## ######## 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 +# DO NOT EDIT ANY CHANGES 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 #### +#### Game Server Settings #### ## SteamCMD Login | https://docs.linuxgsm.com/steamcmd#steamcmd-login steamuser="username" @@ -92,15 +92,15 @@ logdays="7" # Query delay time querydelay="1" -#### LinuxGSM Advanced Settings #### - -# ANSI Colors +## ANSI Colors | https://docs.linuxgsm.com/features/ansi-colors ansi="on" -# Message Display Time +#### Advanced Settings #### + +## Message Display Time | https://docs.linuxgsm.com/features/message-display-time sleeptime="0.5" -## SteamCMD Settings +## SteamCMD Settings | https://docs.linuxgsm.com/steamcmd # Server appid appid="380840" # SteamCMD Branch | https://docs.linuxgsm.com/steamcmd/branch @@ -108,7 +108,7 @@ branch="" # Master Server | https://docs.linuxgsm.com/steamcmd/steam-master-server steammaster="false" -# Stop Mode | https://docs.linuxgsm.com/steamcmd/stopmode +## Stop Mode | https://docs.linuxgsm.com/features/stop-mode # 1: tmux kill # 2: CTRL+c # 3: quit @@ -121,7 +121,7 @@ steammaster="false" # 10: Teamspeak 3 stopmode="2" -## LinuxGSM Server Details +## Game Server Details # Do not edit gamename="Teeworlds" engine="teeworlds" @@ -130,7 +130,7 @@ glibc="2.14" #### Directories #### # Edit with care -## Server Specific Directories +## Game Server Directories systemdir="${serverfiles}/tw" executabledir="${systemdir}" executable="./teeworlds_srv" diff --git a/lgsm/config-default/config-lgsm/untserver/_default.cfg b/lgsm/config-default/config-lgsm/untserver/_default.cfg index 32b468a12..261a98977 100644 --- a/lgsm/config-default/config-lgsm/untserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/untserver/_default.cfg @@ -1,12 +1,12 @@ ################################## ######## 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 +# DO NOT EDIT ANY CHANGES 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 #### +#### Game Server Settings #### ## Server Start Settings | https://docs.linuxgsm.com/configuration/start-parameters ip="0.0.0.0" @@ -28,6 +28,9 @@ parms="-port:${port} -players:${maxplayers} --nographics -${defaultmap} -batchmo ## Notification Alerts # (on|off) +# Display IP | https://docs.linuxgsm.com/alerts#display-ip +displayip="" + # More info | https://docs.linuxgsm.com/alerts#more-info postalert="off" postdays="7" @@ -37,10 +40,6 @@ posttarget="https://hastebin.com" discordalert="off" discordwebhook="webhook" -# Slack Alerts | https://docs.linuxgsm.com/alerts/slack -slackalert="off" -slackwebhook="webhook" - # Email Alerts | https://docs.linuxgsm.com/alerts/email emailalert="off" email="email@example.com" @@ -67,6 +66,10 @@ channeltag="" pushoveralert="off" pushovertoken="accesstoken" +# Slack Alerts | https://docs.linuxgsm.com/alerts/slack +slackalert="off" +slackwebhook="webhook" + # Telegram Alerts | https://docs.linuxgsm.com/alerts/telegram # You can add a custom cURL string eg proxy (useful in Russia) or else in "curlcustomstring". # like a "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help", if you not need @@ -92,15 +95,15 @@ logdays="7" # Query delay time querydelay="1" -#### LinuxGSM Advanced Settings #### - -# ANSI Colors +## ANSI Colors | https://docs.linuxgsm.com/features/ansi-colors ansi="on" -# Message Display Time +#### Advanced Settings #### + +## Message Display Time | https://docs.linuxgsm.com/features/message-display-time sleeptime="0.5" -## SteamCMD Settings +## SteamCMD Settings | https://docs.linuxgsm.com/steamcmd # Server appid appid="1110390" # SteamCMD Branch | https://docs.linuxgsm.com/steamcmd/branch @@ -108,7 +111,7 @@ branch="" # Master Server | https://docs.linuxgsm.com/steamcmd/steam-master-server steammaster="false" -# Stop Mode | https://docs.linuxgsm.com/steamcmd/stopmode +## Stop Mode | https://docs.linuxgsm.com/features/stop-mode # 1: tmux kill # 2: CTRL+c # 3: quit @@ -121,7 +124,7 @@ steammaster="false" # 10: Teamspeak 3 stopmode="2" -## LinuxGSM Server Details +## Game Server Details # Do not edit gamename="Unturned" engine="unity3d" @@ -130,13 +133,14 @@ glibc="2.15" #### Directories #### # Edit with care -## Server Specific Directories +## Game Server Directories systemdir="${serverfiles}" executabledir="${serverfiles}" executable="./Unturned_Headless.x86_64" servercfgdir="${systemdir}/Servers/${servicename}" servercfg="Config.json" servercfgdefault="Config.json" +servercfgdir="${systemdir}/Servers/${servicename}" 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 942f8526e..db4f67291 100644 --- a/lgsm/config-default/config-lgsm/ut2k4server/_default.cfg +++ b/lgsm/config-default/config-lgsm/ut2k4server/_default.cfg @@ -1,12 +1,12 @@ ################################## ######## 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 +# DO NOT EDIT ANY CHANGES 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 #### +#### Game Server Settings #### ## Server Start Settings | https://docs.linuxgsm.com/configuration/start-parameters defaultmap="DM-Rankin" @@ -86,15 +86,15 @@ logdays="7" # Query delay time querydelay="1" -#### LinuxGSM Advanced Settings #### - -# ANSI Colors +## ANSI Colors | https://docs.linuxgsm.com/features/ansi-colors ansi="on" -# Message Display Time +#### Advanced Settings #### + +## Message Display Time | https://docs.linuxgsm.com/features/message-display-time sleeptime="0.5" -# Stop Mode | https://docs.linuxgsm.com/steamcmd/stopmode +## Stop Mode | https://docs.linuxgsm.com/features/stop-mode # 1: tmux kill # 2: CTRL+c # 3: quit @@ -107,7 +107,7 @@ sleeptime="0.5" # 10: Teamspeak 3 stopmode="2" -## LinuxGSM Server Details +## Game Server Details # Do not edit gamename="Unreal Tournament 2004" engine="unreal2" @@ -116,7 +116,7 @@ glibc="2.4" #### Directories #### # Edit with care -## Server Specific Directories +## Game Server Directories systemdir="${serverfiles}/System" executabledir="${systemdir}" executable="./ucc-bin" diff --git a/lgsm/config-default/config-lgsm/ut3server/_default.cfg b/lgsm/config-default/config-lgsm/ut3server/_default.cfg index ebb9eee7b..8d1cf1968 100644 --- a/lgsm/config-default/config-lgsm/ut3server/_default.cfg +++ b/lgsm/config-default/config-lgsm/ut3server/_default.cfg @@ -1,12 +1,12 @@ ################################## ######## 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 +# DO NOT EDIT ANY CHANGES 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 #### +#### Game Server Settings #### ## Server Start Settings | https://docs.linuxgsm.com/configuration/start-parameters ip="0.0.0.0" @@ -23,7 +23,7 @@ pureserver="1" allowjoininprogress="true" ## Server Start Command | https://docs.linuxgsm.com/configuration/start-parameters#additional-parameters -# Edit with care | List of game types and mutators : http://wiki.unrealadmin.org/FAQ:UT3 +# Edit with care | List of game types and mutators : https://docs.linuxgsm.com/game-servers/unreal-tournament-3 fn_parms(){ parms="server ${defaultmap}?Game=${game}?bIsDedicated=${isdedicated}?bIsLanMatch=${islanmatch}?bUsesStats=${usesstats}?bShouldAdvertise=${shouldadvertise}?PureServer=${pureserver}?bAllowJoinInProgress=${allowjoininprogress}?Mutator=${mutators}?ConfigSubDir=${servicename} -port=${port} -queryport=${queryport} -multihome=${ip} -nohomedir -unattended -log=${gamelog}" } @@ -97,15 +97,15 @@ logdays="7" # Query delay time querydelay="1" -#### LinuxGSM Advanced Settings #### - -# ANSI Colors +## ANSI Colors | https://docs.linuxgsm.com/features/ansi-colors ansi="on" -# Message Display Time +#### Advanced Settings #### + +## Message Display Time | https://docs.linuxgsm.com/features/message-display-time sleeptime="0.5" -# Stop Mode | https://docs.linuxgsm.com/steamcmd/stopmode +## Stop Mode | https://docs.linuxgsm.com/features/stop-mode # 1: tmux kill # 2: CTRL+c # 3: quit @@ -118,7 +118,7 @@ sleeptime="0.5" # 10: Teamspeak 3 stopmode="2" -## LinuxGSM Server Details +## Game Server Details # Do not edit gamename="Unreal Tournament 3" engine="unreal3" @@ -127,7 +127,7 @@ glibc="2.3.2" #### Directories #### # Edit with care -## Server Specific Directories +## Game Server Directories systemdir="${serverfiles}" executabledir="${systemdir}/Binaries" executable="./ut3" diff --git a/lgsm/config-default/config-lgsm/ut99server/_default.cfg b/lgsm/config-default/config-lgsm/ut99server/_default.cfg index b87486ecd..df198b3af 100644 --- a/lgsm/config-default/config-lgsm/ut99server/_default.cfg +++ b/lgsm/config-default/config-lgsm/ut99server/_default.cfg @@ -1,12 +1,12 @@ ################################## ######## 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 +# DO NOT EDIT ANY CHANGES 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 #### +#### Game Server Settings #### ## Server Start Settings | https://docs.linuxgsm.com/configuration/start-parameters defaultmap="DM-Deck16][" @@ -86,15 +86,15 @@ logdays="7" # Query delay time querydelay="1" -#### LinuxGSM Advanced Settings #### - -# ANSI Colors +## ANSI Colors | https://docs.linuxgsm.com/features/ansi-colors ansi="on" -# Message Display Time +#### Advanced Settings #### + +## Message Display Time | https://docs.linuxgsm.com/features/message-display-time sleeptime="0.5" -# Stop Mode | https://docs.linuxgsm.com/steamcmd/stopmode +## Stop Mode | https://docs.linuxgsm.com/features/stop-mode # 1: tmux kill # 2: CTRL+c # 3: quit @@ -107,7 +107,7 @@ sleeptime="0.5" # 10: Teamspeak 3 stopmode="2" -## LinuxGSM Server Details +## Game Server Details # Do not edit gamename="Unreal Tournament 99" engine="unreal" @@ -116,7 +116,7 @@ glibc="2.1" #### Directories #### # Edit with care -## Server Specific Directories +## Game Server Directories systemdir="${serverfiles}/System" executabledir="${systemdir}" executable="./ucc-bin" diff --git a/lgsm/config-default/config-lgsm/utserver/_default.cfg b/lgsm/config-default/config-lgsm/utserver/_default.cfg index ddce48d22..2bc0b3c9c 100644 --- a/lgsm/config-default/config-lgsm/utserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/utserver/_default.cfg @@ -1,12 +1,12 @@ ################################## ######## 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 +# DO NOT EDIT ANY CHANGES 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 #### +#### Game Server Settings #### ## Server Start Settings | https://docs.linuxgsm.com/configuration/start-parameters # For CTF: defaultmap="CTF-Face" gametype="CTF" @@ -90,15 +90,15 @@ logdays="7" # Query delay time querydelay="1" -#### LinuxGSM Advanced Settings #### - -# ANSI Colors +## ANSI Colors | https://docs.linuxgsm.com/features/ansi-colors ansi="on" -# Message Display Time +#### Advanced Settings #### + +## Message Display Time | https://docs.linuxgsm.com/features/message-display-time sleeptime="0.5" -# Stop Mode | https://docs.linuxgsm.com/steamcmd/stopmode +## Stop Mode | https://docs.linuxgsm.com/features/stop-mode # 1: tmux kill # 2: CTRL+c # 3: quit @@ -111,7 +111,7 @@ sleeptime="0.5" # 10: Teamspeak 3 stopmode="2" -## LinuxGSM Server Details +## Game Server Details # Do not edit gamename="Unreal Tournament" engine="unreal4" @@ -120,7 +120,7 @@ glibc="2.17" #### Directories #### # Edit with care -## Server Specific Directories +## Game Server Directories systemdir="${serverfiles}/LinuxServer" executabledir="${systemdir}/Engine/Binaries/Linux" executable="./UE4Server-Linux-Shipping" diff --git a/lgsm/config-default/config-lgsm/vsserver/_default.cfg b/lgsm/config-default/config-lgsm/vsserver/_default.cfg index 0d8be68fa..a7907034f 100644 --- a/lgsm/config-default/config-lgsm/vsserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/vsserver/_default.cfg @@ -1,12 +1,12 @@ ################################## ######## 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 +# DO NOT EDIT ANY CHANGES 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 #### +#### Game Server Settings #### ## Server Start Settings | https://docs.linuxgsm.com/configuration/start-parameters ip="0.0.0.0" @@ -92,15 +92,15 @@ logdays="7" # Query delay time querydelay="1" -#### LinuxGSM Advanced Settings #### - -# ANSI Colors +## ANSI Colors | https://docs.linuxgsm.com/features/ansi-colors ansi="on" -# Message Display Time +#### Advanced Settings #### + +## Message Display Time | https://docs.linuxgsm.com/features/message-display-time sleeptime="0.5" -## SteamCMD Settings +## SteamCMD Settings | https://docs.linuxgsm.com/steamcmd # Server appid appid="90" appidmod="cstrike" @@ -109,7 +109,7 @@ branch="" # Master Server | https://docs.linuxgsm.com/steamcmd/steam-master-server steammaster="true" -# Stop Mode | https://docs.linuxgsm.com/steamcmd/stopmode +## Stop Mode | https://docs.linuxgsm.com/features/stop-mode # 1: tmux kill # 2: CTRL+c # 3: quit @@ -122,7 +122,7 @@ steammaster="true" # 10: Teamspeak 3 stopmode="9" -## LinuxGSM Server Details +## Game Server Details # Do not edit gamename="Vampire Slayer" engine="goldsource" @@ -131,7 +131,7 @@ glibc="2.3.4" #### Directories #### # Edit with care -## Server Specific Directories +## Game Server Directories systemdir="${serverfiles}/vs" executabledir="${serverfiles}" executable="./hlds_run" diff --git a/lgsm/config-default/config-lgsm/wetserver/_default.cfg b/lgsm/config-default/config-lgsm/wetserver/_default.cfg index 7a2473945..e4a7cd606 100644 --- a/lgsm/config-default/config-lgsm/wetserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/wetserver/_default.cfg @@ -1,12 +1,12 @@ ################################## ######## 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 +# DO NOT EDIT ANY CHANGES 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 #### +#### Game Server Settings #### ## Server Start Command | https://docs.linuxgsm.com/configuration/start-parameters#additional-parameters fn_parms(){ @@ -82,15 +82,15 @@ logdays="7" # Query delay time querydelay="1" -#### LinuxGSM Advanced Settings #### - -# ANSI Colors +## ANSI Colors | https://docs.linuxgsm.com/features/ansi-colors ansi="on" -# Message Display Time +#### Advanced Settings #### + +## Message Display Time | https://docs.linuxgsm.com/features/message-display-time sleeptime="0.5" -# Stop Mode | https://docs.linuxgsm.com/steamcmd/stopmode +## Stop Mode | https://docs.linuxgsm.com/features/stop-mode # 1: tmux kill # 2: CTRL+c # 3: quit @@ -103,7 +103,7 @@ sleeptime="0.5" # 10: Teamspeak 3 stopmode="3" -## LinuxGSM Server Details +## Game Server Details # Do not edit gamename="Wolfenstein: Enemy Territory" engine="idtech3" @@ -112,7 +112,7 @@ glibc="2.2.4" #### Directories #### # Edit with care -## Server Specific Directories +## Game Server Directories systemdir="${serverfiles}" executabledir="${systemdir}" executable="./etded" diff --git a/lgsm/config-default/config-lgsm/wfserver/_default.cfg b/lgsm/config-default/config-lgsm/wfserver/_default.cfg index f6d028c2b..7ca4bdff5 100644 --- a/lgsm/config-default/config-lgsm/wfserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/wfserver/_default.cfg @@ -1,12 +1,12 @@ ################################## ######## 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 +# DO NOT EDIT ANY CHANGES 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 #### +#### Game Server Settings #### ## Server Start Settings | https://docs.linuxgsm.com/configuration/start-parameters ip="0.0.0.0" @@ -87,15 +87,15 @@ logdays="7" # Query delay time querydelay="1" -#### LinuxGSM Advanced Settings #### - -# ANSI Colors +## ANSI Colors | https://docs.linuxgsm.com/features/ansi-colors ansi="on" -# Message Display Time +#### Advanced Settings #### + +## Message Display Time | https://docs.linuxgsm.com/features/message-display-time sleeptime="0.5" -# Stop Mode | https://docs.linuxgsm.com/steamcmd/stopmode +## Stop Mode | https://docs.linuxgsm.com/features/stop-mode # 1: tmux kill # 2: CTRL+c # 3: quit @@ -108,7 +108,7 @@ sleeptime="0.5" # 10: Teamspeak 3 stopmode="3" -## SteamCMD Settings +## SteamCMD Settings | https://docs.linuxgsm.com/steamcmd # Server appid appid="1136510" appidmod="warfork" @@ -117,7 +117,7 @@ branch="" # Master Server | https://docs.linuxgsm.com/steamcmd/steam-master-server steammaster="true" -## LinuxGSM Server Details +## Game Server Details # Do not edit gamename="Warfork" engine="qfusion" @@ -126,7 +126,7 @@ glibc="2.15" #### Directories #### # Edit with care -## Server Specific Directories +## Game Server Directories systemdir="${serverfiles}/Warfork.app/Contents/Resources" executabledir="${systemdir}" executable="./wf_server.x86_64" diff --git a/lgsm/config-default/config-lgsm/wurmserver/_default.cfg b/lgsm/config-default/config-lgsm/wurmserver/_default.cfg index 50e5348c5..c54055f65 100644 --- a/lgsm/config-default/config-lgsm/wurmserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/wurmserver/_default.cfg @@ -1,12 +1,12 @@ ################################## ######## 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 +# DO NOT EDIT ANY CHANGES 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 #### +#### Game Server Settings #### ## Server Start Command | https://docs.linuxgsm.com/configuration/start-parameters#additional-parameters fn_parms(){ @@ -84,15 +84,15 @@ logdays="7" # Query delay time querydelay="1" -#### LinuxGSM Advanced Settings #### - -# ANSI Colors +## ANSI Colors | https://docs.linuxgsm.com/features/ansi-colors ansi="on" -# Message Display Time +#### Advanced Settings #### + +## Message Display Time | https://docs.linuxgsm.com/features/message-display-time sleeptime="0.5" -## SteamCMD Settings +## SteamCMD Settings | https://docs.linuxgsm.com/steamcmd # Server appid appid="402370" # SteamCMD Branch | https://docs.linuxgsm.com/steamcmd/branch @@ -100,7 +100,7 @@ branch="" # Master Server | https://docs.linuxgsm.com/steamcmd/steam-master-server steammaster="false" -# Stop Mode | https://docs.linuxgsm.com/steamcmd/stopmode +## Stop Mode | https://docs.linuxgsm.com/features/stop-mode # 1: tmux kill # 2: CTRL+c # 3: quit @@ -113,7 +113,7 @@ steammaster="false" # 10: Teamspeak 3 stopmode="2" -## LinuxGSM Server Details +## Game Server Details # Do not edit gamename="Wurm Unlimited" engine="wurm" @@ -122,7 +122,7 @@ glibc="2.14" #### Directories #### # Edit with care -## Server Specific Directories +## Game Server Directories systemdir="${serverfiles}" executabledir="${systemdir}" executable="xvfb-run ./WurmServerLauncher" diff --git a/lgsm/config-default/config-lgsm/zmrserver/_default.cfg b/lgsm/config-default/config-lgsm/zmrserver/_default.cfg index e3e21369b..57ab9440c 100644 --- a/lgsm/config-default/config-lgsm/zmrserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/zmrserver/_default.cfg @@ -1,12 +1,12 @@ ################################## ######## 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 +# DO NOT EDIT ANY CHANGES 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 #### +#### Game Server Settings #### ## Server Start Settings | https://docs.linuxgsm.com/configuration/start-parameters ip="0.0.0.0" @@ -93,15 +93,15 @@ logdays="7" # Query delay time querydelay="1" -#### LinuxGSM Advanced Settings #### - -# ANSI Colors +## ANSI Colors | https://docs.linuxgsm.com/features/ansi-colors ansi="on" -# Message Display Time +#### Advanced Settings #### + +## Message Display Time | https://docs.linuxgsm.com/features/message-display-time sleeptime="0.5" -## SteamCMD Settings +## SteamCMD Settings | https://docs.linuxgsm.com/steamcmd # Server appid appid="244310" # Source 2013 SDK # SteamCMD Branch | https://docs.linuxgsm.com/steamcmd/branch @@ -109,7 +109,7 @@ branch="" # Master Server | https://docs.linuxgsm.com/steamcmd/steam-master-server steammaster="true" -# Stop Mode | https://docs.linuxgsm.com/steamcmd/stopmode +## Stop Mode | https://docs.linuxgsm.com/features/stop-mode # 1: tmux kill # 2: CTRL+c # 3: quit @@ -122,7 +122,7 @@ steammaster="true" # 10: Teamspeak 3 stopmode="3" -## LinuxGSM Server Details +## Game Server Details # Do not edit gamename="Zombie Master: Reborn" engine="source" @@ -131,7 +131,7 @@ glibc="2.15" #### Directories #### # Edit with care -## Server Specific Directories +## Game Server Directories systemdir="${serverfiles}/zombie_master_reborn" executabledir="${serverfiles}" executable="./srcds_run" diff --git a/lgsm/config-default/config-lgsm/zpsserver/_default.cfg b/lgsm/config-default/config-lgsm/zpsserver/_default.cfg index 971fe70f3..c64e12864 100644 --- a/lgsm/config-default/config-lgsm/zpsserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/zpsserver/_default.cfg @@ -1,12 +1,12 @@ ################################## ######## 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 +# DO NOT EDIT ANY CHANGES 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 #### +#### Game Server Settings #### ## Server Start Settings | https://docs.linuxgsm.com/configuration/start-parameters ip="0.0.0.0" @@ -16,9 +16,9 @@ sourcetvport="27020" defaultmap="zps_deadend" maxplayers="20" -## Optional: Game Server Login Token +## Game Server Login Token (GSLT): Optional # GSLT can be used for running a public server. -# More info: https://linuxgsm.com/gslt +# More info: https://docs.linuxgsm.com/steamcmd/gslt gslt="" ## Server Start Command | https://docs.linuxgsm.com/configuration/start-parameters#additional-parameters @@ -98,15 +98,15 @@ logdays="7" # Query delay time querydelay="1" -#### LinuxGSM Advanced Settings #### - -# ANSI Colors +## ANSI Colors | https://docs.linuxgsm.com/features/ansi-colors ansi="on" -# Message Display Time +#### Advanced Settings #### + +## Message Display Time | https://docs.linuxgsm.com/features/message-display-time sleeptime="0.5" -## SteamCMD Settings +## SteamCMD Settings | https://docs.linuxgsm.com/steamcmd # Server appid appid="17505" # SteamCMD Branch | https://docs.linuxgsm.com/steamcmd/branch @@ -114,7 +114,7 @@ branch="" # Master Server | https://docs.linuxgsm.com/steamcmd/steam-master-server steammaster="true" -# Stop Mode | https://docs.linuxgsm.com/steamcmd/stopmode +## Stop Mode | https://docs.linuxgsm.com/features/stop-mode # 1: tmux kill # 2: CTRL+c # 3: quit @@ -127,7 +127,7 @@ steammaster="true" # 10: Teamspeak 3 stopmode="3" -## LinuxGSM Server Details +## Game Server Details # Do not edit gamename="Zombie Panic! Source" engine="source" @@ -136,7 +136,7 @@ glibc="2.15" #### Directories #### # Edit with care -## Server Specific Directories +## Game Server Directories systemdir="${serverfiles}/zps" executabledir="${serverfiles}" executable="./srcds_run" diff --git a/lgsm/functions/install_gslt.sh b/lgsm/functions/install_gslt.sh index 425fcb2b9..2fb76e35b 100644 --- a/lgsm/functions/install_gslt.sh +++ b/lgsm/functions/install_gslt.sh @@ -21,9 +21,9 @@ else fi echo -e "Get more info and a token here:" -echo -e "https://linuxgsm.com/gslt" +echo -e "https://docs.linuxgsm.com/steamcmd/gslt" fn_script_log_info "Get more info and a token here:" -fn_script_log_info "https://linuxgsm.com/gslt" +fn_script_log_info "https://docs.linuxgsm.com/steamcmd/gslt" echo -e "" if [ -z "${autoinstall}" ]; then if [ "${shortname}" != "tu" ]; then diff --git a/tests/tests_defaultcfg/defaultcfg_0.txt b/tests/tests_defaultcfg/defaultcfg_0.txt new file mode 100644 index 000000000..82b9b5ca2 --- /dev/null +++ b/tests/tests_defaultcfg/defaultcfg_0.txt @@ -0,0 +1,53 @@ +displayip +postalert +postdays +posttarget +discordalert +discordwebhook +emailalert +email +emailfrom +iftttalert +ifttttoken +iftttevent +mailgunalert +mailguntoken +mailgundomain +mailgunemailfrom +mailgunemail +pushbulletalert +pushbullettoken +channeltag +pushoveralert +pushovertoken +slackalert +slackwebhook +telegramalert +telegramtoken +telegramchatid +curlcustomstring +maxbackups +maxbackupdays +stoponbackup +consolelogging +logdays +querydelay +ansi +sleeptime +stopmode +gamename +engine +glibc +systemdir +executabledir +executable +backupdir +logdir +lgsmlogdir +consolelogdir +lgsmlog +consolelog +alertlog +postdetailslog +lgsmlogdate +consolelogdate diff --git a/tests/tests_defaultcfg/defaultcfg_1.txt b/tests/tests_defaultcfg/defaultcfg_1.txt new file mode 100644 index 000000000..d74a85520 --- /dev/null +++ b/tests/tests_defaultcfg/defaultcfg_1.txt @@ -0,0 +1,51 @@ +################################## +######## 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://docs.linuxgsm.com/configuration/start-parameters#additional-parameters +#### LinuxGSM Settings #### +## Notification Alerts +# (on|off) +# Display IP | https://docs.linuxgsm.com/alerts#display-ip +# More info | https://docs.linuxgsm.com/alerts#more-info +# Discord Alerts | https://docs.linuxgsm.com/alerts/discord +# Email Alerts | https://docs.linuxgsm.com/alerts/email +# IFTTT Alerts | https://docs.linuxgsm.com/alerts/ifttt +# Mailgun Email Alerts | https://docs.linuxgsm.com/alerts/mailgun +# Pushbullet Alerts | https://docs.linuxgsm.com/alerts/pushbullet +# Pushover Alerts | https://docs.linuxgsm.com/alerts/pushover +# Slack Alerts | https://docs.linuxgsm.com/alerts/slack +# Telegram Alerts | https://docs.linuxgsm.com/alerts/telegram +# You can add a custom cURL string eg proxy (useful in Russia) or else in "curlcustomstring". +# like a "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help", if you not need +# any custom string in curl - simple ignore this parameter. +## Backup | https://docs.linuxgsm.com/commands/backup +## Logging | https://docs.linuxgsm.com/features/logging +## Monitor | https://docs.linuxgsm.com/commands/monitor +# Query delay time +#### LinuxGSM Advanced Settings #### +# ANSI Colors +# Message Display Time +# Stop Mode | https://docs.linuxgsm.com/steamcmd/stopmode +# 1: tmux kill +# 2: CTRL+c +# 3: quit +# 4: quit 120s +# 5: stop +# 6: q +# 7: exit +# 8: 7 Days to Die +# 9: Gold Source +# 10: Teamspeak 3 +## LinuxGSM Server Details +# Do not edit +#### Directories #### +# Edit with care +## Server Specific Directories +## Backup Directory +## Logging Directories +## Logs Naming diff --git a/tests/tests_defaultcfg/tests_defaultcfg.sh b/tests/tests_defaultcfg/tests_defaultcfg.sh new file mode 100644 index 000000000..d905a0393 --- /dev/null +++ b/tests/tests_defaultcfg/tests_defaultcfg.sh @@ -0,0 +1,60 @@ +#!/bin/bash +echo -e "" +echo -e "0.1 - Full comparison Output" +echo -e "==================================================================" +echo -e "Description:" +echo -e "test checks that vars present in ALL _default.cfg files are correct." +echo -e "" +find "lgsm/config-default/config-lgsm/" ! -name '*template.cfg' -name "*.cfg" -type f -print0 | +while IFS= read -r -d $'\0' line; do + grep = ${line} | cut -f1 -d"=" > defaultcfgtemp.txt + diffoutput=$(diff tests/tests_defaultcfg/defaultcfg_0.txt defaultcfgtemp.txt) + if [ "${diffoutput}" ]; then + echo "File with errors:" + echo "${line}" + echo -e "=================================" + echo "${diffoutput}" + echo "" + fi + rm defaultcfgtemp.txt +done + +echo -e "" +echo -e "1.0 - Master Comparison" +echo -e "==================================================================" +echo -e "Description:" +echo -e "test checks that vars present in ALL _default.cfg files are correct." +echo -e "" +find lgsm/config-default/config-lgsm/ ! -name '*template.cfg' -name "*.cfg" -type f -print0 | +while IFS= read -r -d $'\0' line; do + grep = ${line} | cut -f1 -d"=" > defaultcfgtemp.txt + diffoutput=$(diff tests/tests_defaultcfg/defaultcfg_0.txt defaultcfgtemp.txt | grep '^<') + if [ "${diffoutput}" ]; then + echo "File with errors:" + echo "${line}" + echo -e "=================================" + echo "${diffoutput}" + echo "" + fi + rm defaultcfgtemp.txt +done + +echo -e "" +echo -e "2.0 - Check Comment" +echo -e "==================================================================" +echo -e "Description:" +echo -e "test checks that comments in ALL _default.cfg files are correct." +echo -e "" +find lgsm/config-default/config-lgsm/ ! -name '*template.cfg' -name "*.cfg" -type f -print0 | +while IFS= read -r -d $'\0' line; do + grep "#" ${line} > defaultcfgtemp.txt + diffoutput=$(diff tests/tests_defaultcfg/defaultcfg_1.txt defaultcfgtemp.txt | grep '^<') + if [ "${diffoutput}" ]; then + echo "File with errors:" + echo "${line}" + echo -e "=================================" + echo "${diffoutput}" + echo "" + fi + rm defaultcfgtemp.txt +done From 4e5a04e38aa7b778f67916eca7e9b74c7bfb3ac1 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Sun, 10 Nov 2019 22:52:01 +0000 Subject: [PATCH 222/534] feature(travis-ci): add basic unit test to identify issues with configs (#2583) --- tests/tests_defaultcfg/defaultcfg_1.txt | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/tests/tests_defaultcfg/defaultcfg_1.txt b/tests/tests_defaultcfg/defaultcfg_1.txt index d74a85520..19318d90c 100644 --- a/tests/tests_defaultcfg/defaultcfg_1.txt +++ b/tests/tests_defaultcfg/defaultcfg_1.txt @@ -1,11 +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 #### +# DO NOT EDIT ANY CHANGES 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. +#### Game Server Settings #### ## Server Start Command | https://docs.linuxgsm.com/configuration/start-parameters#additional-parameters #### LinuxGSM Settings #### ## Notification Alerts @@ -27,10 +27,10 @@ ## Logging | https://docs.linuxgsm.com/features/logging ## Monitor | https://docs.linuxgsm.com/commands/monitor # Query delay time -#### LinuxGSM Advanced Settings #### -# ANSI Colors -# Message Display Time -# Stop Mode | https://docs.linuxgsm.com/steamcmd/stopmode +## ANSI Colors | https://docs.linuxgsm.com/features/ansi-colors +#### Advanced Settings #### +## Message Display Time | https://docs.linuxgsm.com/features/message-display-time +## Stop Mode | https://docs.linuxgsm.com/features/stop-mode # 1: tmux kill # 2: CTRL+c # 3: quit @@ -41,11 +41,11 @@ # 8: 7 Days to Die # 9: Gold Source # 10: Teamspeak 3 -## LinuxGSM Server Details +## Game Server Details # Do not edit #### Directories #### # Edit with care -## Server Specific Directories +## Game Server Directories ## Backup Directory ## Logging Directories ## Logs Naming From c99fb69ffa6b668adde61140c81ebd4d26b7bc9c Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Sun, 10 Nov 2019 22:54:51 +0000 Subject: [PATCH 223/534] Add missing comma --- lgsm/config-default/config-lgsm/ahl2server/_default.cfg | 2 +- lgsm/config-default/config-lgsm/ahlserver/_default.cfg | 2 +- lgsm/config-default/config-lgsm/arkserver/_default.cfg | 2 +- lgsm/config-default/config-lgsm/arma3server/_default.cfg | 2 +- lgsm/config-default/config-lgsm/bb2server/_default.cfg | 2 +- lgsm/config-default/config-lgsm/bbserver/_default.cfg | 2 +- lgsm/config-default/config-lgsm/bdserver/_default.cfg | 2 +- lgsm/config-default/config-lgsm/bf1942server/_default.cfg | 2 +- lgsm/config-default/config-lgsm/bmdmserver/_default.cfg | 2 +- lgsm/config-default/config-lgsm/boserver/_default.cfg | 2 +- lgsm/config-default/config-lgsm/bsserver/_default.cfg | 2 +- lgsm/config-default/config-lgsm/bt1944server/_default.cfg | 2 +- lgsm/config-default/config-lgsm/btserver/_default.cfg | 2 +- lgsm/config-default/config-lgsm/ccserver/_default.cfg | 2 +- lgsm/config-default/config-lgsm/cod2server/_default.cfg | 2 +- lgsm/config-default/config-lgsm/cod4server/_default.cfg | 2 +- lgsm/config-default/config-lgsm/codserver/_default.cfg | 2 +- lgsm/config-default/config-lgsm/coduoserver/_default.cfg | 2 +- lgsm/config-default/config-lgsm/codwawserver/_default.cfg | 2 +- lgsm/config-default/config-lgsm/csczserver/_default.cfg | 2 +- lgsm/config-default/config-lgsm/csgoserver/_default.cfg | 2 +- lgsm/config-default/config-lgsm/csserver/_default.cfg | 2 +- lgsm/config-default/config-lgsm/cssserver/_default.cfg | 2 +- lgsm/config-default/config-lgsm/dabserver/_default.cfg | 2 +- lgsm/config-default/config-lgsm/dmcserver/_default.cfg | 2 +- lgsm/config-default/config-lgsm/dodserver/_default.cfg | 2 +- lgsm/config-default/config-lgsm/dodsserver/_default.cfg | 2 +- lgsm/config-default/config-lgsm/doiserver/_default.cfg | 2 +- lgsm/config-default/config-lgsm/dstserver/_default.cfg | 2 +- lgsm/config-default/config-lgsm/dysserver/_default.cfg | 2 +- lgsm/config-default/config-lgsm/ecoserver/_default.cfg | 2 +- lgsm/config-default/config-lgsm/emserver/_default.cfg | 2 +- lgsm/config-default/config-lgsm/etlserver/_default.cfg | 2 +- lgsm/config-default/config-lgsm/fctrserver/_default.cfg | 2 +- lgsm/config-default/config-lgsm/fofserver/_default.cfg | 2 +- lgsm/config-default/config-lgsm/gesserver/_default.cfg | 2 +- lgsm/config-default/config-lgsm/gmodserver/_default.cfg | 2 +- lgsm/config-default/config-lgsm/hl2dmserver/_default.cfg | 2 +- lgsm/config-default/config-lgsm/hldmserver/_default.cfg | 2 +- lgsm/config-default/config-lgsm/hldmsserver/_default.cfg | 2 +- lgsm/config-default/config-lgsm/hwserver/_default.cfg | 2 +- lgsm/config-default/config-lgsm/insserver/_default.cfg | 2 +- lgsm/config-default/config-lgsm/inssserver/_default.cfg | 2 +- lgsm/config-default/config-lgsm/iosserver/_default.cfg | 2 +- lgsm/config-default/config-lgsm/jc2server/_default.cfg | 2 +- lgsm/config-default/config-lgsm/jc3server/_default.cfg | 2 +- lgsm/config-default/config-lgsm/kf2server/_default.cfg | 2 +- lgsm/config-default/config-lgsm/kfserver/_default.cfg | 2 +- lgsm/config-default/config-lgsm/l4d2server/_default.cfg | 2 +- lgsm/config-default/config-lgsm/l4dserver/_default.cfg | 2 +- lgsm/config-default/config-lgsm/mcserver/_default.cfg | 2 +- lgsm/config-default/config-lgsm/mhserver/_default.cfg | 2 +- lgsm/config-default/config-lgsm/mohaaserver/_default.cfg | 2 +- lgsm/config-default/config-lgsm/mtaserver/_default.cfg | 2 +- lgsm/config-default/config-lgsm/mumbleserver/_default.cfg | 2 +- lgsm/config-default/config-lgsm/ndserver/_default.cfg | 2 +- lgsm/config-default/config-lgsm/nmrihserver/_default.cfg | 2 +- lgsm/config-default/config-lgsm/ns2cserver/_default.cfg | 2 +- lgsm/config-default/config-lgsm/ns2server/_default.cfg | 2 +- lgsm/config-default/config-lgsm/nsserver/_default.cfg | 2 +- lgsm/config-default/config-lgsm/opforserver/_default.cfg | 2 +- lgsm/config-default/config-lgsm/pcserver/_default.cfg | 2 +- lgsm/config-default/config-lgsm/pstbsserver/_default.cfg | 2 +- lgsm/config-default/config-lgsm/pvkiiserver/_default.cfg | 2 +- lgsm/config-default/config-lgsm/pzserver/_default.cfg | 2 +- lgsm/config-default/config-lgsm/q2server/_default.cfg | 2 +- lgsm/config-default/config-lgsm/q3server/_default.cfg | 2 +- lgsm/config-default/config-lgsm/qlserver/_default.cfg | 2 +- lgsm/config-default/config-lgsm/qwserver/_default.cfg | 2 +- lgsm/config-default/config-lgsm/ricochetserver/_default.cfg | 2 +- lgsm/config-default/config-lgsm/roserver/_default.cfg | 2 +- lgsm/config-default/config-lgsm/rtcwserver/_default.cfg | 2 +- lgsm/config-default/config-lgsm/rustserver/_default.cfg | 2 +- lgsm/config-default/config-lgsm/rwserver/_default.cfg | 2 +- lgsm/config-default/config-lgsm/sampserver/_default.cfg | 2 +- lgsm/config-default/config-lgsm/sbotsserver/_default.cfg | 2 +- lgsm/config-default/config-lgsm/sbserver/_default.cfg | 2 +- lgsm/config-default/config-lgsm/sdtdserver/_default.cfg | 2 +- lgsm/config-default/config-lgsm/sfcserver/_default.cfg | 2 +- lgsm/config-default/config-lgsm/sof2server/_default.cfg | 2 +- lgsm/config-default/config-lgsm/solserver/_default.cfg | 2 +- lgsm/config-default/config-lgsm/squadserver/_default.cfg | 2 +- lgsm/config-default/config-lgsm/ss3server/_default.cfg | 2 +- lgsm/config-default/config-lgsm/stserver/_default.cfg | 2 +- lgsm/config-default/config-lgsm/svenserver/_default.cfg | 2 +- lgsm/config-default/config-lgsm/terrariaserver/_default.cfg | 2 +- lgsm/config-default/config-lgsm/tf2server/_default.cfg | 2 +- lgsm/config-default/config-lgsm/tfcserver/_default.cfg | 2 +- lgsm/config-default/config-lgsm/ts3server/_default.cfg | 2 +- lgsm/config-default/config-lgsm/tsserver/_default.cfg | 2 +- lgsm/config-default/config-lgsm/tuserver/_default.cfg | 2 +- lgsm/config-default/config-lgsm/twserver/_default.cfg | 2 +- lgsm/config-default/config-lgsm/untserver/_default.cfg | 2 +- lgsm/config-default/config-lgsm/ut2k4server/_default.cfg | 2 +- lgsm/config-default/config-lgsm/ut3server/_default.cfg | 2 +- lgsm/config-default/config-lgsm/ut99server/_default.cfg | 2 +- lgsm/config-default/config-lgsm/utserver/_default.cfg | 2 +- lgsm/config-default/config-lgsm/vsserver/_default.cfg | 2 +- lgsm/config-default/config-lgsm/wetserver/_default.cfg | 2 +- lgsm/config-default/config-lgsm/wfserver/_default.cfg | 2 +- lgsm/config-default/config-lgsm/wurmserver/_default.cfg | 2 +- lgsm/config-default/config-lgsm/zmrserver/_default.cfg | 2 +- lgsm/config-default/config-lgsm/zpsserver/_default.cfg | 2 +- tests/tests_defaultcfg/defaultcfg_1.txt | 2 +- 104 files changed, 104 insertions(+), 104 deletions(-) diff --git a/lgsm/config-default/config-lgsm/ahl2server/_default.cfg b/lgsm/config-default/config-lgsm/ahl2server/_default.cfg index f7f637608..e5b68e4e9 100644 --- a/lgsm/config-default/config-lgsm/ahl2server/_default.cfg +++ b/lgsm/config-default/config-lgsm/ahl2server/_default.cfg @@ -1,7 +1,7 @@ ################################## ######## Default Settings ######## ################################## -# DO NOT EDIT ANY CHANGES WILL BE OVERWRITTEN! +# DO NOT EDIT, ANY CHANGES 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. diff --git a/lgsm/config-default/config-lgsm/ahlserver/_default.cfg b/lgsm/config-default/config-lgsm/ahlserver/_default.cfg index 56231c6d5..89c9e8fc8 100644 --- a/lgsm/config-default/config-lgsm/ahlserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/ahlserver/_default.cfg @@ -1,7 +1,7 @@ ################################## ######## Default Settings ######## ################################## -# DO NOT EDIT ANY CHANGES WILL BE OVERWRITTEN! +# DO NOT EDIT, ANY CHANGES 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. diff --git a/lgsm/config-default/config-lgsm/arkserver/_default.cfg b/lgsm/config-default/config-lgsm/arkserver/_default.cfg index e8560b878..fadbde978 100644 --- a/lgsm/config-default/config-lgsm/arkserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/arkserver/_default.cfg @@ -1,7 +1,7 @@ ################################## ######## Default Settings ######## ################################## -# DO NOT EDIT ANY CHANGES WILL BE OVERWRITTEN! +# DO NOT EDIT, ANY CHANGES 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. diff --git a/lgsm/config-default/config-lgsm/arma3server/_default.cfg b/lgsm/config-default/config-lgsm/arma3server/_default.cfg index 58cf35bc1..ac4807675 100644 --- a/lgsm/config-default/config-lgsm/arma3server/_default.cfg +++ b/lgsm/config-default/config-lgsm/arma3server/_default.cfg @@ -1,7 +1,7 @@ ################################## ######## Default Settings ######## ################################## -# DO NOT EDIT ANY CHANGES WILL BE OVERWRITTEN! +# DO NOT EDIT, ANY CHANGES 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. diff --git a/lgsm/config-default/config-lgsm/bb2server/_default.cfg b/lgsm/config-default/config-lgsm/bb2server/_default.cfg index 28b1234b7..0027555dd 100644 --- a/lgsm/config-default/config-lgsm/bb2server/_default.cfg +++ b/lgsm/config-default/config-lgsm/bb2server/_default.cfg @@ -1,7 +1,7 @@ ################################## ######## Default Settings ######## ################################## -# DO NOT EDIT ANY CHANGES WILL BE OVERWRITTEN! +# DO NOT EDIT, ANY CHANGES 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. diff --git a/lgsm/config-default/config-lgsm/bbserver/_default.cfg b/lgsm/config-default/config-lgsm/bbserver/_default.cfg index 6a4ee2d5c..b8e6623c7 100644 --- a/lgsm/config-default/config-lgsm/bbserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/bbserver/_default.cfg @@ -1,7 +1,7 @@ ################################## ######## Default Settings ######## ################################## -# DO NOT EDIT ANY CHANGES WILL BE OVERWRITTEN! +# DO NOT EDIT, ANY CHANGES 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. diff --git a/lgsm/config-default/config-lgsm/bdserver/_default.cfg b/lgsm/config-default/config-lgsm/bdserver/_default.cfg index 7bf53c255..8fc0da936 100644 --- a/lgsm/config-default/config-lgsm/bdserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/bdserver/_default.cfg @@ -1,7 +1,7 @@ ################################## ######## Default Settings ######## ################################## -# DO NOT EDIT ANY CHANGES WILL BE OVERWRITTEN! +# DO NOT EDIT, ANY CHANGES 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. diff --git a/lgsm/config-default/config-lgsm/bf1942server/_default.cfg b/lgsm/config-default/config-lgsm/bf1942server/_default.cfg index a56e0548e..4ee100479 100644 --- a/lgsm/config-default/config-lgsm/bf1942server/_default.cfg +++ b/lgsm/config-default/config-lgsm/bf1942server/_default.cfg @@ -1,7 +1,7 @@ ################################## ######## Default Settings ######## ################################## -# DO NOT EDIT ANY CHANGES WILL BE OVERWRITTEN! +# DO NOT EDIT, ANY CHANGES 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. diff --git a/lgsm/config-default/config-lgsm/bmdmserver/_default.cfg b/lgsm/config-default/config-lgsm/bmdmserver/_default.cfg index a0cd2872d..61a49f31d 100644 --- a/lgsm/config-default/config-lgsm/bmdmserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/bmdmserver/_default.cfg @@ -1,7 +1,7 @@ ################################## ######## Default Settings ######## ################################## -# DO NOT EDIT ANY CHANGES WILL BE OVERWRITTEN! +# DO NOT EDIT, ANY CHANGES 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. diff --git a/lgsm/config-default/config-lgsm/boserver/_default.cfg b/lgsm/config-default/config-lgsm/boserver/_default.cfg index 5c31103a9..d7ab1b8e5 100644 --- a/lgsm/config-default/config-lgsm/boserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/boserver/_default.cfg @@ -1,7 +1,7 @@ ################################## ######## Default Settings ######## ################################## -# DO NOT EDIT ANY CHANGES WILL BE OVERWRITTEN! +# DO NOT EDIT, ANY CHANGES 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. diff --git a/lgsm/config-default/config-lgsm/bsserver/_default.cfg b/lgsm/config-default/config-lgsm/bsserver/_default.cfg index 2a0cfe216..8274ae6b6 100644 --- a/lgsm/config-default/config-lgsm/bsserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/bsserver/_default.cfg @@ -1,7 +1,7 @@ ################################## ######## Default Settings ######## ################################## -# DO NOT EDIT ANY CHANGES WILL BE OVERWRITTEN! +# DO NOT EDIT, ANY CHANGES 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. diff --git a/lgsm/config-default/config-lgsm/bt1944server/_default.cfg b/lgsm/config-default/config-lgsm/bt1944server/_default.cfg index 8a36d1cff..08df70553 100644 --- a/lgsm/config-default/config-lgsm/bt1944server/_default.cfg +++ b/lgsm/config-default/config-lgsm/bt1944server/_default.cfg @@ -1,7 +1,7 @@ ################################## ######## Default Settings ######## ################################## -# DO NOT EDIT ANY CHANGES WILL BE OVERWRITTEN! +# DO NOT EDIT, ANY CHANGES 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. diff --git a/lgsm/config-default/config-lgsm/btserver/_default.cfg b/lgsm/config-default/config-lgsm/btserver/_default.cfg index 1bb23e77c..9e232d531 100644 --- a/lgsm/config-default/config-lgsm/btserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/btserver/_default.cfg @@ -1,7 +1,7 @@ ################################## ######## Default Settings ######## ################################## -# DO NOT EDIT ANY CHANGES WILL BE OVERWRITTEN! +# DO NOT EDIT, ANY CHANGES 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. diff --git a/lgsm/config-default/config-lgsm/ccserver/_default.cfg b/lgsm/config-default/config-lgsm/ccserver/_default.cfg index 79cf4a9de..6f453cceb 100644 --- a/lgsm/config-default/config-lgsm/ccserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/ccserver/_default.cfg @@ -1,7 +1,7 @@ ################################## ######## Default Settings ######## ################################## -# DO NOT EDIT ANY CHANGES WILL BE OVERWRITTEN! +# DO NOT EDIT, ANY CHANGES 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. diff --git a/lgsm/config-default/config-lgsm/cod2server/_default.cfg b/lgsm/config-default/config-lgsm/cod2server/_default.cfg index daf5093cf..e3d381113 100644 --- a/lgsm/config-default/config-lgsm/cod2server/_default.cfg +++ b/lgsm/config-default/config-lgsm/cod2server/_default.cfg @@ -1,7 +1,7 @@ ################################## ######## Default Settings ######## ################################## -# DO NOT EDIT ANY CHANGES WILL BE OVERWRITTEN! +# DO NOT EDIT, ANY CHANGES 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. diff --git a/lgsm/config-default/config-lgsm/cod4server/_default.cfg b/lgsm/config-default/config-lgsm/cod4server/_default.cfg index 9925d3470..5224656b0 100644 --- a/lgsm/config-default/config-lgsm/cod4server/_default.cfg +++ b/lgsm/config-default/config-lgsm/cod4server/_default.cfg @@ -1,7 +1,7 @@ ################################## ######## Default Settings ######## ################################## -# DO NOT EDIT ANY CHANGES WILL BE OVERWRITTEN! +# DO NOT EDIT, ANY CHANGES 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. diff --git a/lgsm/config-default/config-lgsm/codserver/_default.cfg b/lgsm/config-default/config-lgsm/codserver/_default.cfg index 3e14bfc33..609b1d69a 100644 --- a/lgsm/config-default/config-lgsm/codserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/codserver/_default.cfg @@ -1,7 +1,7 @@ ################################## ######## Default Settings ######## ################################## -# DO NOT EDIT ANY CHANGES WILL BE OVERWRITTEN! +# DO NOT EDIT, ANY CHANGES 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. diff --git a/lgsm/config-default/config-lgsm/coduoserver/_default.cfg b/lgsm/config-default/config-lgsm/coduoserver/_default.cfg index 8e52f570d..15c7d8396 100644 --- a/lgsm/config-default/config-lgsm/coduoserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/coduoserver/_default.cfg @@ -1,7 +1,7 @@ ################################## ######## Default Settings ######## ################################## -# DO NOT EDIT ANY CHANGES WILL BE OVERWRITTEN! +# DO NOT EDIT, ANY CHANGES 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. diff --git a/lgsm/config-default/config-lgsm/codwawserver/_default.cfg b/lgsm/config-default/config-lgsm/codwawserver/_default.cfg index fcd502c44..0bea558d2 100644 --- a/lgsm/config-default/config-lgsm/codwawserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/codwawserver/_default.cfg @@ -1,7 +1,7 @@ ################################## ######## Default Settings ######## ################################## -# DO NOT EDIT ANY CHANGES WILL BE OVERWRITTEN! +# DO NOT EDIT, ANY CHANGES 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. diff --git a/lgsm/config-default/config-lgsm/csczserver/_default.cfg b/lgsm/config-default/config-lgsm/csczserver/_default.cfg index 9fb6c696b..6b4dbe86e 100644 --- a/lgsm/config-default/config-lgsm/csczserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/csczserver/_default.cfg @@ -1,7 +1,7 @@ ################################## ######## Default Settings ######## ################################## -# DO NOT EDIT ANY CHANGES WILL BE OVERWRITTEN! +# DO NOT EDIT, ANY CHANGES 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. diff --git a/lgsm/config-default/config-lgsm/csgoserver/_default.cfg b/lgsm/config-default/config-lgsm/csgoserver/_default.cfg index 9aec6066b..b3b792b56 100644 --- a/lgsm/config-default/config-lgsm/csgoserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/csgoserver/_default.cfg @@ -1,7 +1,7 @@ ################################## ######## Default Settings ######## ################################## -# DO NOT EDIT ANY CHANGES WILL BE OVERWRITTEN! +# DO NOT EDIT, ANY CHANGES 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. diff --git a/lgsm/config-default/config-lgsm/csserver/_default.cfg b/lgsm/config-default/config-lgsm/csserver/_default.cfg index f98851c0b..ec54397c8 100644 --- a/lgsm/config-default/config-lgsm/csserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/csserver/_default.cfg @@ -1,7 +1,7 @@ ################################## ######## Default Settings ######## ################################## -# DO NOT EDIT ANY CHANGES WILL BE OVERWRITTEN! +# DO NOT EDIT, ANY CHANGES 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. diff --git a/lgsm/config-default/config-lgsm/cssserver/_default.cfg b/lgsm/config-default/config-lgsm/cssserver/_default.cfg index 36728fc39..a78f09136 100644 --- a/lgsm/config-default/config-lgsm/cssserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/cssserver/_default.cfg @@ -1,7 +1,7 @@ ################################## ######## Default Settings ######## ################################## -# DO NOT EDIT ANY CHANGES WILL BE OVERWRITTEN! +# DO NOT EDIT, ANY CHANGES 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. diff --git a/lgsm/config-default/config-lgsm/dabserver/_default.cfg b/lgsm/config-default/config-lgsm/dabserver/_default.cfg index 2cb7c139b..c8bef4e04 100644 --- a/lgsm/config-default/config-lgsm/dabserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/dabserver/_default.cfg @@ -1,7 +1,7 @@ ################################## ######## Default Settings ######## ################################## -# DO NOT EDIT ANY CHANGES WILL BE OVERWRITTEN! +# DO NOT EDIT, ANY CHANGES 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. diff --git a/lgsm/config-default/config-lgsm/dmcserver/_default.cfg b/lgsm/config-default/config-lgsm/dmcserver/_default.cfg index 7b4a02231..a4126a054 100644 --- a/lgsm/config-default/config-lgsm/dmcserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/dmcserver/_default.cfg @@ -1,7 +1,7 @@ ################################## ######## Default Settings ######## ################################## -# DO NOT EDIT ANY CHANGES WILL BE OVERWRITTEN! +# DO NOT EDIT, ANY CHANGES 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. diff --git a/lgsm/config-default/config-lgsm/dodserver/_default.cfg b/lgsm/config-default/config-lgsm/dodserver/_default.cfg index 57996d3ae..b96d1ab5d 100644 --- a/lgsm/config-default/config-lgsm/dodserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/dodserver/_default.cfg @@ -1,7 +1,7 @@ ################################## ######## Default Settings ######## ################################## -# DO NOT EDIT ANY CHANGES WILL BE OVERWRITTEN! +# DO NOT EDIT, ANY CHANGES 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. diff --git a/lgsm/config-default/config-lgsm/dodsserver/_default.cfg b/lgsm/config-default/config-lgsm/dodsserver/_default.cfg index cda770f33..957cbb176 100644 --- a/lgsm/config-default/config-lgsm/dodsserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/dodsserver/_default.cfg @@ -1,7 +1,7 @@ ################################## ######## Default Settings ######## ################################## -# DO NOT EDIT ANY CHANGES WILL BE OVERWRITTEN! +# DO NOT EDIT, ANY CHANGES 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. diff --git a/lgsm/config-default/config-lgsm/doiserver/_default.cfg b/lgsm/config-default/config-lgsm/doiserver/_default.cfg index 3ffbf2829..cb984dc4a 100644 --- a/lgsm/config-default/config-lgsm/doiserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/doiserver/_default.cfg @@ -1,7 +1,7 @@ ################################## ######## Default Settings ######## ################################## -# DO NOT EDIT ANY CHANGES WILL BE OVERWRITTEN! +# DO NOT EDIT, ANY CHANGES 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. diff --git a/lgsm/config-default/config-lgsm/dstserver/_default.cfg b/lgsm/config-default/config-lgsm/dstserver/_default.cfg index b90e98e6e..5c3aaa738 100644 --- a/lgsm/config-default/config-lgsm/dstserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/dstserver/_default.cfg @@ -1,7 +1,7 @@ ################################## ######## Default Settings ######## ################################## -# DO NOT EDIT ANY CHANGES WILL BE OVERWRITTEN! +# DO NOT EDIT, ANY CHANGES 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. diff --git a/lgsm/config-default/config-lgsm/dysserver/_default.cfg b/lgsm/config-default/config-lgsm/dysserver/_default.cfg index 7b43e81ed..462162afe 100644 --- a/lgsm/config-default/config-lgsm/dysserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/dysserver/_default.cfg @@ -1,7 +1,7 @@ ################################## ######## Default Settings ######## ################################## -# DO NOT EDIT ANY CHANGES WILL BE OVERWRITTEN! +# DO NOT EDIT, ANY CHANGES 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. diff --git a/lgsm/config-default/config-lgsm/ecoserver/_default.cfg b/lgsm/config-default/config-lgsm/ecoserver/_default.cfg index 7123bfab4..098750256 100644 --- a/lgsm/config-default/config-lgsm/ecoserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/ecoserver/_default.cfg @@ -1,7 +1,7 @@ ################################## ######## Default Settings ######## ################################## -# DO NOT EDIT ANY CHANGES WILL BE OVERWRITTEN! +# DO NOT EDIT, ANY CHANGES 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. diff --git a/lgsm/config-default/config-lgsm/emserver/_default.cfg b/lgsm/config-default/config-lgsm/emserver/_default.cfg index 16fa4faae..471be19b2 100644 --- a/lgsm/config-default/config-lgsm/emserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/emserver/_default.cfg @@ -1,7 +1,7 @@ ################################## ######## Default Settings ######## ################################## -# DO NOT EDIT ANY CHANGES WILL BE OVERWRITTEN! +# DO NOT EDIT, ANY CHANGES 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. diff --git a/lgsm/config-default/config-lgsm/etlserver/_default.cfg b/lgsm/config-default/config-lgsm/etlserver/_default.cfg index d0b2653b7..f1986f01a 100644 --- a/lgsm/config-default/config-lgsm/etlserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/etlserver/_default.cfg @@ -1,7 +1,7 @@ ################################## ######## Default Settings ######## ################################## -# DO NOT EDIT ANY CHANGES WILL BE OVERWRITTEN! +# DO NOT EDIT, ANY CHANGES 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. diff --git a/lgsm/config-default/config-lgsm/fctrserver/_default.cfg b/lgsm/config-default/config-lgsm/fctrserver/_default.cfg index 2dfa3ff21..61afb88dd 100644 --- a/lgsm/config-default/config-lgsm/fctrserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/fctrserver/_default.cfg @@ -1,7 +1,7 @@ ################################## ######## Default Settings ######## ################################## -# DO NOT EDIT ANY CHANGES WILL BE OVERWRITTEN! +# DO NOT EDIT, ANY CHANGES 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. diff --git a/lgsm/config-default/config-lgsm/fofserver/_default.cfg b/lgsm/config-default/config-lgsm/fofserver/_default.cfg index 9224a2268..4bc062ed5 100644 --- a/lgsm/config-default/config-lgsm/fofserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/fofserver/_default.cfg @@ -1,7 +1,7 @@ ################################## ######## Default Settings ######## ################################## -# DO NOT EDIT ANY CHANGES WILL BE OVERWRITTEN! +# DO NOT EDIT, ANY CHANGES 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. diff --git a/lgsm/config-default/config-lgsm/gesserver/_default.cfg b/lgsm/config-default/config-lgsm/gesserver/_default.cfg index 52e2c38e5..2b2840172 100644 --- a/lgsm/config-default/config-lgsm/gesserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/gesserver/_default.cfg @@ -1,7 +1,7 @@ ################################## ######## Default Settings ######## ################################## -# DO NOT EDIT ANY CHANGES WILL BE OVERWRITTEN! +# DO NOT EDIT, ANY CHANGES 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. diff --git a/lgsm/config-default/config-lgsm/gmodserver/_default.cfg b/lgsm/config-default/config-lgsm/gmodserver/_default.cfg index 31144cb68..07e003d51 100644 --- a/lgsm/config-default/config-lgsm/gmodserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/gmodserver/_default.cfg @@ -1,7 +1,7 @@ ################################## ######## Default Settings ######## ################################## -# DO NOT EDIT ANY CHANGES WILL BE OVERWRITTEN! +# DO NOT EDIT, ANY CHANGES 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. diff --git a/lgsm/config-default/config-lgsm/hl2dmserver/_default.cfg b/lgsm/config-default/config-lgsm/hl2dmserver/_default.cfg index 94eadaefc..c9b4a6006 100644 --- a/lgsm/config-default/config-lgsm/hl2dmserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/hl2dmserver/_default.cfg @@ -1,7 +1,7 @@ ################################## ######## Default Settings ######## ################################## -# DO NOT EDIT ANY CHANGES WILL BE OVERWRITTEN! +# DO NOT EDIT, ANY CHANGES 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. diff --git a/lgsm/config-default/config-lgsm/hldmserver/_default.cfg b/lgsm/config-default/config-lgsm/hldmserver/_default.cfg index 3d456656b..ecd9db8c4 100644 --- a/lgsm/config-default/config-lgsm/hldmserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/hldmserver/_default.cfg @@ -1,7 +1,7 @@ ################################## ######## Default Settings ######## ################################## -# DO NOT EDIT ANY CHANGES WILL BE OVERWRITTEN! +# DO NOT EDIT, ANY CHANGES 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. diff --git a/lgsm/config-default/config-lgsm/hldmsserver/_default.cfg b/lgsm/config-default/config-lgsm/hldmsserver/_default.cfg index 79c548834..223a53f9a 100644 --- a/lgsm/config-default/config-lgsm/hldmsserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/hldmsserver/_default.cfg @@ -1,7 +1,7 @@ ################################## ######## Default Settings ######## ################################## -# DO NOT EDIT ANY CHANGES WILL BE OVERWRITTEN! +# DO NOT EDIT, ANY CHANGES 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. diff --git a/lgsm/config-default/config-lgsm/hwserver/_default.cfg b/lgsm/config-default/config-lgsm/hwserver/_default.cfg index fc61ba85f..4a1b9e148 100644 --- a/lgsm/config-default/config-lgsm/hwserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/hwserver/_default.cfg @@ -1,7 +1,7 @@ ################################## ######## Default Settings ######## ################################## -# DO NOT EDIT ANY CHANGES WILL BE OVERWRITTEN! +# DO NOT EDIT, ANY CHANGES 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. diff --git a/lgsm/config-default/config-lgsm/insserver/_default.cfg b/lgsm/config-default/config-lgsm/insserver/_default.cfg index 97cb653bb..1793b44dc 100644 --- a/lgsm/config-default/config-lgsm/insserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/insserver/_default.cfg @@ -1,7 +1,7 @@ ################################## ######## Default Settings ######## ################################## -# DO NOT EDIT ANY CHANGES WILL BE OVERWRITTEN! +# DO NOT EDIT, ANY CHANGES 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. diff --git a/lgsm/config-default/config-lgsm/inssserver/_default.cfg b/lgsm/config-default/config-lgsm/inssserver/_default.cfg index c4873777c..a77e2532b 100644 --- a/lgsm/config-default/config-lgsm/inssserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/inssserver/_default.cfg @@ -1,7 +1,7 @@ ################################## ######## Default Settings ######## ################################## -# DO NOT EDIT ANY CHANGES WILL BE OVERWRITTEN! +# DO NOT EDIT, ANY CHANGES 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. diff --git a/lgsm/config-default/config-lgsm/iosserver/_default.cfg b/lgsm/config-default/config-lgsm/iosserver/_default.cfg index f2e7b8261..fb44280d2 100644 --- a/lgsm/config-default/config-lgsm/iosserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/iosserver/_default.cfg @@ -1,7 +1,7 @@ ################################## ######## Default Settings ######## ################################## -# DO NOT EDIT ANY CHANGES WILL BE OVERWRITTEN! +# DO NOT EDIT, ANY CHANGES 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. diff --git a/lgsm/config-default/config-lgsm/jc2server/_default.cfg b/lgsm/config-default/config-lgsm/jc2server/_default.cfg index fc9628231..60a753887 100644 --- a/lgsm/config-default/config-lgsm/jc2server/_default.cfg +++ b/lgsm/config-default/config-lgsm/jc2server/_default.cfg @@ -1,7 +1,7 @@ ################################## ######## Default Settings ######## ################################## -# DO NOT EDIT ANY CHANGES WILL BE OVERWRITTEN! +# DO NOT EDIT, ANY CHANGES 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. diff --git a/lgsm/config-default/config-lgsm/jc3server/_default.cfg b/lgsm/config-default/config-lgsm/jc3server/_default.cfg index 19255c340..80afd275e 100644 --- a/lgsm/config-default/config-lgsm/jc3server/_default.cfg +++ b/lgsm/config-default/config-lgsm/jc3server/_default.cfg @@ -1,7 +1,7 @@ ################################## ######## Default Settings ######## ################################## -# DO NOT EDIT ANY CHANGES WILL BE OVERWRITTEN! +# DO NOT EDIT, ANY CHANGES 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. diff --git a/lgsm/config-default/config-lgsm/kf2server/_default.cfg b/lgsm/config-default/config-lgsm/kf2server/_default.cfg index a40b54b81..e12577f2c 100644 --- a/lgsm/config-default/config-lgsm/kf2server/_default.cfg +++ b/lgsm/config-default/config-lgsm/kf2server/_default.cfg @@ -1,7 +1,7 @@ ################################## ######## Default Settings ######## ################################## -# DO NOT EDIT ANY CHANGES WILL BE OVERWRITTEN! +# DO NOT EDIT, ANY CHANGES 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. diff --git a/lgsm/config-default/config-lgsm/kfserver/_default.cfg b/lgsm/config-default/config-lgsm/kfserver/_default.cfg index dfaca2ec4..350857c6d 100644 --- a/lgsm/config-default/config-lgsm/kfserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/kfserver/_default.cfg @@ -1,7 +1,7 @@ ################################## ######## Default Settings ######## ################################## -# DO NOT EDIT ANY CHANGES WILL BE OVERWRITTEN! +# DO NOT EDIT, ANY CHANGES 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. diff --git a/lgsm/config-default/config-lgsm/l4d2server/_default.cfg b/lgsm/config-default/config-lgsm/l4d2server/_default.cfg index aad9566b8..7aa6328a8 100644 --- a/lgsm/config-default/config-lgsm/l4d2server/_default.cfg +++ b/lgsm/config-default/config-lgsm/l4d2server/_default.cfg @@ -1,7 +1,7 @@ ################################## ######## Default Settings ######## ################################## -# DO NOT EDIT ANY CHANGES WILL BE OVERWRITTEN! +# DO NOT EDIT, ANY CHANGES 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. diff --git a/lgsm/config-default/config-lgsm/l4dserver/_default.cfg b/lgsm/config-default/config-lgsm/l4dserver/_default.cfg index b357e68e0..4093a1a8a 100644 --- a/lgsm/config-default/config-lgsm/l4dserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/l4dserver/_default.cfg @@ -1,7 +1,7 @@ ################################## ######## Default Settings ######## ################################## -# DO NOT EDIT ANY CHANGES WILL BE OVERWRITTEN! +# DO NOT EDIT, ANY CHANGES 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. diff --git a/lgsm/config-default/config-lgsm/mcserver/_default.cfg b/lgsm/config-default/config-lgsm/mcserver/_default.cfg index 3a0a4f50c..8342cf836 100644 --- a/lgsm/config-default/config-lgsm/mcserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/mcserver/_default.cfg @@ -1,7 +1,7 @@ ################################## ######## Default Settings ######## ################################## -# DO NOT EDIT ANY CHANGES WILL BE OVERWRITTEN! +# DO NOT EDIT, ANY CHANGES 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. diff --git a/lgsm/config-default/config-lgsm/mhserver/_default.cfg b/lgsm/config-default/config-lgsm/mhserver/_default.cfg index fa208e628..39ae7b967 100644 --- a/lgsm/config-default/config-lgsm/mhserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/mhserver/_default.cfg @@ -1,7 +1,7 @@ ################################## ######## Default Settings ######## ################################## -# DO NOT EDIT ANY CHANGES WILL BE OVERWRITTEN! +# DO NOT EDIT, ANY CHANGES 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. diff --git a/lgsm/config-default/config-lgsm/mohaaserver/_default.cfg b/lgsm/config-default/config-lgsm/mohaaserver/_default.cfg index 1b3f2c810..71c69ecc4 100644 --- a/lgsm/config-default/config-lgsm/mohaaserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/mohaaserver/_default.cfg @@ -1,7 +1,7 @@ ################################## ######## Default Settings ######## ################################## -# DO NOT EDIT ANY CHANGES WILL BE OVERWRITTEN! +# DO NOT EDIT, ANY CHANGES 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. diff --git a/lgsm/config-default/config-lgsm/mtaserver/_default.cfg b/lgsm/config-default/config-lgsm/mtaserver/_default.cfg index dbff0d959..011aa521b 100644 --- a/lgsm/config-default/config-lgsm/mtaserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/mtaserver/_default.cfg @@ -1,7 +1,7 @@ ################################## ######## Default Settings ######## ################################## -# DO NOT EDIT ANY CHANGES WILL BE OVERWRITTEN! +# DO NOT EDIT, ANY CHANGES 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. diff --git a/lgsm/config-default/config-lgsm/mumbleserver/_default.cfg b/lgsm/config-default/config-lgsm/mumbleserver/_default.cfg index ced8f1ec4..e0d8b6572 100644 --- a/lgsm/config-default/config-lgsm/mumbleserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/mumbleserver/_default.cfg @@ -1,7 +1,7 @@ ################################## ######## Default Settings ######## ################################## -# DO NOT EDIT ANY CHANGES WILL BE OVERWRITTEN! +# DO NOT EDIT, ANY CHANGES 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. diff --git a/lgsm/config-default/config-lgsm/ndserver/_default.cfg b/lgsm/config-default/config-lgsm/ndserver/_default.cfg index 3b360847d..57154df3c 100644 --- a/lgsm/config-default/config-lgsm/ndserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/ndserver/_default.cfg @@ -1,7 +1,7 @@ ################################## ######## Default Settings ######## ################################## -# DO NOT EDIT ANY CHANGES WILL BE OVERWRITTEN! +# DO NOT EDIT, ANY CHANGES 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. diff --git a/lgsm/config-default/config-lgsm/nmrihserver/_default.cfg b/lgsm/config-default/config-lgsm/nmrihserver/_default.cfg index 80fb3b36d..0d281476e 100644 --- a/lgsm/config-default/config-lgsm/nmrihserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/nmrihserver/_default.cfg @@ -1,7 +1,7 @@ ################################## ######## Default Settings ######## ################################## -# DO NOT EDIT ANY CHANGES WILL BE OVERWRITTEN! +# DO NOT EDIT, ANY CHANGES 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. diff --git a/lgsm/config-default/config-lgsm/ns2cserver/_default.cfg b/lgsm/config-default/config-lgsm/ns2cserver/_default.cfg index e538a49c1..99eb1ca12 100644 --- a/lgsm/config-default/config-lgsm/ns2cserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/ns2cserver/_default.cfg @@ -1,7 +1,7 @@ ################################## ######## Default Settings ######## ################################## -# DO NOT EDIT ANY CHANGES WILL BE OVERWRITTEN! +# DO NOT EDIT, ANY CHANGES 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. diff --git a/lgsm/config-default/config-lgsm/ns2server/_default.cfg b/lgsm/config-default/config-lgsm/ns2server/_default.cfg index 3a7a5efe7..6f7fcddbc 100644 --- a/lgsm/config-default/config-lgsm/ns2server/_default.cfg +++ b/lgsm/config-default/config-lgsm/ns2server/_default.cfg @@ -1,7 +1,7 @@ ################################## ######## Default Settings ######## ################################## -# DO NOT EDIT ANY CHANGES WILL BE OVERWRITTEN! +# DO NOT EDIT, ANY CHANGES 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. diff --git a/lgsm/config-default/config-lgsm/nsserver/_default.cfg b/lgsm/config-default/config-lgsm/nsserver/_default.cfg index f5663f514..53c323692 100644 --- a/lgsm/config-default/config-lgsm/nsserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/nsserver/_default.cfg @@ -1,7 +1,7 @@ ################################## ######## Default Settings ######## ################################## -# DO NOT EDIT ANY CHANGES WILL BE OVERWRITTEN! +# DO NOT EDIT, ANY CHANGES 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. diff --git a/lgsm/config-default/config-lgsm/opforserver/_default.cfg b/lgsm/config-default/config-lgsm/opforserver/_default.cfg index befa08b80..220650b97 100644 --- a/lgsm/config-default/config-lgsm/opforserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/opforserver/_default.cfg @@ -1,7 +1,7 @@ ################################## ######## Default Settings ######## ################################## -# DO NOT EDIT ANY CHANGES WILL BE OVERWRITTEN! +# DO NOT EDIT, ANY CHANGES 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. diff --git a/lgsm/config-default/config-lgsm/pcserver/_default.cfg b/lgsm/config-default/config-lgsm/pcserver/_default.cfg index 328eaf685..2221e879f 100644 --- a/lgsm/config-default/config-lgsm/pcserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/pcserver/_default.cfg @@ -1,7 +1,7 @@ ################################## ######## Default Settings ######## ################################## -# DO NOT EDIT ANY CHANGES WILL BE OVERWRITTEN! +# DO NOT EDIT, ANY CHANGES 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. diff --git a/lgsm/config-default/config-lgsm/pstbsserver/_default.cfg b/lgsm/config-default/config-lgsm/pstbsserver/_default.cfg index 648190ccd..839ac15a4 100644 --- a/lgsm/config-default/config-lgsm/pstbsserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/pstbsserver/_default.cfg @@ -1,7 +1,7 @@ ################################## ######## Default Settings ######## ################################## -# DO NOT EDIT ANY CHANGES WILL BE OVERWRITTEN! +# DO NOT EDIT, ANY CHANGES 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. diff --git a/lgsm/config-default/config-lgsm/pvkiiserver/_default.cfg b/lgsm/config-default/config-lgsm/pvkiiserver/_default.cfg index 4afec5c70..d5fd2a1d9 100644 --- a/lgsm/config-default/config-lgsm/pvkiiserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/pvkiiserver/_default.cfg @@ -1,7 +1,7 @@ ################################## ######## Default Settings ######## ################################## -# DO NOT EDIT ANY CHANGES WILL BE OVERWRITTEN! +# DO NOT EDIT, ANY CHANGES 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. diff --git a/lgsm/config-default/config-lgsm/pzserver/_default.cfg b/lgsm/config-default/config-lgsm/pzserver/_default.cfg index e2955c90d..7e0707d49 100644 --- a/lgsm/config-default/config-lgsm/pzserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/pzserver/_default.cfg @@ -1,7 +1,7 @@ ################################## ######## Default Settings ######## ################################## -# DO NOT EDIT ANY CHANGES WILL BE OVERWRITTEN! +# DO NOT EDIT, ANY CHANGES 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. diff --git a/lgsm/config-default/config-lgsm/q2server/_default.cfg b/lgsm/config-default/config-lgsm/q2server/_default.cfg index f4200b816..357ef116f 100644 --- a/lgsm/config-default/config-lgsm/q2server/_default.cfg +++ b/lgsm/config-default/config-lgsm/q2server/_default.cfg @@ -1,7 +1,7 @@ ################################## ######## Default Settings ######## ################################## -# DO NOT EDIT ANY CHANGES WILL BE OVERWRITTEN! +# DO NOT EDIT, ANY CHANGES 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. diff --git a/lgsm/config-default/config-lgsm/q3server/_default.cfg b/lgsm/config-default/config-lgsm/q3server/_default.cfg index b8bb7e0d4..a1cacc938 100644 --- a/lgsm/config-default/config-lgsm/q3server/_default.cfg +++ b/lgsm/config-default/config-lgsm/q3server/_default.cfg @@ -1,7 +1,7 @@ ################################## ######## Default Settings ######## ################################## -# DO NOT EDIT ANY CHANGES WILL BE OVERWRITTEN! +# DO NOT EDIT, ANY CHANGES 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. diff --git a/lgsm/config-default/config-lgsm/qlserver/_default.cfg b/lgsm/config-default/config-lgsm/qlserver/_default.cfg index af316af7c..a6e0d5ea7 100644 --- a/lgsm/config-default/config-lgsm/qlserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/qlserver/_default.cfg @@ -1,7 +1,7 @@ ################################## ######## Default Settings ######## ################################## -# DO NOT EDIT ANY CHANGES WILL BE OVERWRITTEN! +# DO NOT EDIT, ANY CHANGES 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. diff --git a/lgsm/config-default/config-lgsm/qwserver/_default.cfg b/lgsm/config-default/config-lgsm/qwserver/_default.cfg index ef19c7dc2..bac15bd00 100644 --- a/lgsm/config-default/config-lgsm/qwserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/qwserver/_default.cfg @@ -1,7 +1,7 @@ ################################## ######## Default Settings ######## ################################## -# DO NOT EDIT ANY CHANGES WILL BE OVERWRITTEN! +# DO NOT EDIT, ANY CHANGES 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. diff --git a/lgsm/config-default/config-lgsm/ricochetserver/_default.cfg b/lgsm/config-default/config-lgsm/ricochetserver/_default.cfg index c6035eaba..3ee3f944d 100644 --- a/lgsm/config-default/config-lgsm/ricochetserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/ricochetserver/_default.cfg @@ -1,7 +1,7 @@ ################################## ######## Default Settings ######## ################################## -# DO NOT EDIT ANY CHANGES WILL BE OVERWRITTEN! +# DO NOT EDIT, ANY CHANGES 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. diff --git a/lgsm/config-default/config-lgsm/roserver/_default.cfg b/lgsm/config-default/config-lgsm/roserver/_default.cfg index 6fba17ecd..de2b51353 100644 --- a/lgsm/config-default/config-lgsm/roserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/roserver/_default.cfg @@ -1,7 +1,7 @@ ################################## ######## Default Settings ######## ################################## -# DO NOT EDIT ANY CHANGES WILL BE OVERWRITTEN! +# DO NOT EDIT, ANY CHANGES 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. diff --git a/lgsm/config-default/config-lgsm/rtcwserver/_default.cfg b/lgsm/config-default/config-lgsm/rtcwserver/_default.cfg index caddf44ec..27a0f3545 100644 --- a/lgsm/config-default/config-lgsm/rtcwserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/rtcwserver/_default.cfg @@ -1,7 +1,7 @@ ################################## ######## Default Settings ######## ################################## -# DO NOT EDIT ANY CHANGES WILL BE OVERWRITTEN! +# DO NOT EDIT, ANY CHANGES 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. diff --git a/lgsm/config-default/config-lgsm/rustserver/_default.cfg b/lgsm/config-default/config-lgsm/rustserver/_default.cfg index db77df192..1819ddd18 100644 --- a/lgsm/config-default/config-lgsm/rustserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/rustserver/_default.cfg @@ -1,7 +1,7 @@ ################################## ######## Default Settings ######## ################################## -# DO NOT EDIT ANY CHANGES WILL BE OVERWRITTEN! +# DO NOT EDIT, ANY CHANGES 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. diff --git a/lgsm/config-default/config-lgsm/rwserver/_default.cfg b/lgsm/config-default/config-lgsm/rwserver/_default.cfg index 6d6cd7a2e..872ec10e9 100644 --- a/lgsm/config-default/config-lgsm/rwserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/rwserver/_default.cfg @@ -1,7 +1,7 @@ ################################## ######## Default Settings ######## ################################## -# DO NOT EDIT ANY CHANGES WILL BE OVERWRITTEN! +# DO NOT EDIT, ANY CHANGES 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. diff --git a/lgsm/config-default/config-lgsm/sampserver/_default.cfg b/lgsm/config-default/config-lgsm/sampserver/_default.cfg index 94b013172..f6329dc11 100644 --- a/lgsm/config-default/config-lgsm/sampserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/sampserver/_default.cfg @@ -1,7 +1,7 @@ ################################## ######## Default Settings ######## ################################## -# DO NOT EDIT ANY CHANGES WILL BE OVERWRITTEN! +# DO NOT EDIT, ANY CHANGES 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. diff --git a/lgsm/config-default/config-lgsm/sbotsserver/_default.cfg b/lgsm/config-default/config-lgsm/sbotsserver/_default.cfg index 60055d1dc..7a5846f9e 100644 --- a/lgsm/config-default/config-lgsm/sbotsserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/sbotsserver/_default.cfg @@ -1,7 +1,7 @@ ################################## ######## Default Settings ######## ################################## -# DO NOT EDIT ANY CHANGES WILL BE OVERWRITTEN! +# DO NOT EDIT, ANY CHANGES 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. diff --git a/lgsm/config-default/config-lgsm/sbserver/_default.cfg b/lgsm/config-default/config-lgsm/sbserver/_default.cfg index 6bb5e7979..760d8cd78 100644 --- a/lgsm/config-default/config-lgsm/sbserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/sbserver/_default.cfg @@ -1,7 +1,7 @@ ################################## ######## Default Settings ######## ################################## -# DO NOT EDIT ANY CHANGES WILL BE OVERWRITTEN! +# DO NOT EDIT, ANY CHANGES 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. diff --git a/lgsm/config-default/config-lgsm/sdtdserver/_default.cfg b/lgsm/config-default/config-lgsm/sdtdserver/_default.cfg index 0da428304..a928e27e1 100644 --- a/lgsm/config-default/config-lgsm/sdtdserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/sdtdserver/_default.cfg @@ -1,7 +1,7 @@ ################################## ######## Default Settings ######## ################################## -# DO NOT EDIT ANY CHANGES WILL BE OVERWRITTEN! +# DO NOT EDIT, ANY CHANGES 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. diff --git a/lgsm/config-default/config-lgsm/sfcserver/_default.cfg b/lgsm/config-default/config-lgsm/sfcserver/_default.cfg index b1a278dc0..28db4adc4 100644 --- a/lgsm/config-default/config-lgsm/sfcserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/sfcserver/_default.cfg @@ -1,7 +1,7 @@ ################################## ######## Default Settings ######## ################################## -# DO NOT EDIT ANY CHANGES WILL BE OVERWRITTEN! +# DO NOT EDIT, ANY CHANGES 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. diff --git a/lgsm/config-default/config-lgsm/sof2server/_default.cfg b/lgsm/config-default/config-lgsm/sof2server/_default.cfg index 4c3bbe762..d1a502d13 100644 --- a/lgsm/config-default/config-lgsm/sof2server/_default.cfg +++ b/lgsm/config-default/config-lgsm/sof2server/_default.cfg @@ -1,7 +1,7 @@ ################################## ######## Default Settings ######## ################################## -# DO NOT EDIT ANY CHANGES WILL BE OVERWRITTEN! +# DO NOT EDIT, ANY CHANGES 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. diff --git a/lgsm/config-default/config-lgsm/solserver/_default.cfg b/lgsm/config-default/config-lgsm/solserver/_default.cfg index b53933437..04b0e65a9 100644 --- a/lgsm/config-default/config-lgsm/solserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/solserver/_default.cfg @@ -1,7 +1,7 @@ ################################## ######## Default Settings ######## ################################## -# DO NOT EDIT ANY CHANGES WILL BE OVERWRITTEN! +# DO NOT EDIT, ANY CHANGES 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. diff --git a/lgsm/config-default/config-lgsm/squadserver/_default.cfg b/lgsm/config-default/config-lgsm/squadserver/_default.cfg index e8f5c5a78..c4eaa7ae6 100644 --- a/lgsm/config-default/config-lgsm/squadserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/squadserver/_default.cfg @@ -1,7 +1,7 @@ ################################## ######## Default Settings ######## ################################## -# DO NOT EDIT ANY CHANGES WILL BE OVERWRITTEN! +# DO NOT EDIT, ANY CHANGES 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. diff --git a/lgsm/config-default/config-lgsm/ss3server/_default.cfg b/lgsm/config-default/config-lgsm/ss3server/_default.cfg index c4efbdfb9..daa01efea 100644 --- a/lgsm/config-default/config-lgsm/ss3server/_default.cfg +++ b/lgsm/config-default/config-lgsm/ss3server/_default.cfg @@ -1,7 +1,7 @@ ################################## ######## Default Settings ######## ################################## -# DO NOT EDIT ANY CHANGES WILL BE OVERWRITTEN! +# DO NOT EDIT, ANY CHANGES 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. diff --git a/lgsm/config-default/config-lgsm/stserver/_default.cfg b/lgsm/config-default/config-lgsm/stserver/_default.cfg index 3415e7331..0e924c21d 100644 --- a/lgsm/config-default/config-lgsm/stserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/stserver/_default.cfg @@ -1,7 +1,7 @@ ################################## ######## Default Settings ######## ################################## -# DO NOT EDIT ANY CHANGES WILL BE OVERWRITTEN! +# DO NOT EDIT, ANY CHANGES 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. diff --git a/lgsm/config-default/config-lgsm/svenserver/_default.cfg b/lgsm/config-default/config-lgsm/svenserver/_default.cfg index fd9d67995..3d8071605 100644 --- a/lgsm/config-default/config-lgsm/svenserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/svenserver/_default.cfg @@ -1,7 +1,7 @@ ################################## ######## Default Settings ######## ################################## -# DO NOT EDIT ANY CHANGES WILL BE OVERWRITTEN! +# DO NOT EDIT, ANY CHANGES 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. diff --git a/lgsm/config-default/config-lgsm/terrariaserver/_default.cfg b/lgsm/config-default/config-lgsm/terrariaserver/_default.cfg index 5046bb208..156dfb478 100644 --- a/lgsm/config-default/config-lgsm/terrariaserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/terrariaserver/_default.cfg @@ -1,7 +1,7 @@ ################################## ######## Default Settings ######## ################################## -# DO NOT EDIT ANY CHANGES WILL BE OVERWRITTEN! +# DO NOT EDIT, ANY CHANGES 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. diff --git a/lgsm/config-default/config-lgsm/tf2server/_default.cfg b/lgsm/config-default/config-lgsm/tf2server/_default.cfg index 0948c0e9b..03bd33af7 100644 --- a/lgsm/config-default/config-lgsm/tf2server/_default.cfg +++ b/lgsm/config-default/config-lgsm/tf2server/_default.cfg @@ -1,7 +1,7 @@ ################################## ######## Default Settings ######## ################################## -# DO NOT EDIT ANY CHANGES WILL BE OVERWRITTEN! +# DO NOT EDIT, ANY CHANGES 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. diff --git a/lgsm/config-default/config-lgsm/tfcserver/_default.cfg b/lgsm/config-default/config-lgsm/tfcserver/_default.cfg index 548f6d9ff..caf42502a 100644 --- a/lgsm/config-default/config-lgsm/tfcserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/tfcserver/_default.cfg @@ -1,7 +1,7 @@ ################################## ######## Default Settings ######## ################################## -# DO NOT EDIT ANY CHANGES WILL BE OVERWRITTEN! +# DO NOT EDIT, ANY CHANGES 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. diff --git a/lgsm/config-default/config-lgsm/ts3server/_default.cfg b/lgsm/config-default/config-lgsm/ts3server/_default.cfg index fa37e5c64..4ad1321ed 100644 --- a/lgsm/config-default/config-lgsm/ts3server/_default.cfg +++ b/lgsm/config-default/config-lgsm/ts3server/_default.cfg @@ -1,7 +1,7 @@ ################################## ######## Default Settings ######## ################################## -# DO NOT EDIT ANY CHANGES WILL BE OVERWRITTEN! +# DO NOT EDIT, ANY CHANGES 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. diff --git a/lgsm/config-default/config-lgsm/tsserver/_default.cfg b/lgsm/config-default/config-lgsm/tsserver/_default.cfg index 8a44c171d..3a2941ed1 100644 --- a/lgsm/config-default/config-lgsm/tsserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/tsserver/_default.cfg @@ -1,7 +1,7 @@ ################################## ######## Default Settings ######## ################################## -# DO NOT EDIT ANY CHANGES WILL BE OVERWRITTEN! +# DO NOT EDIT, ANY CHANGES 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. diff --git a/lgsm/config-default/config-lgsm/tuserver/_default.cfg b/lgsm/config-default/config-lgsm/tuserver/_default.cfg index 9951585d8..4e34037d5 100644 --- a/lgsm/config-default/config-lgsm/tuserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/tuserver/_default.cfg @@ -1,7 +1,7 @@ ################################## ######## Default Settings ######## ################################## -# DO NOT EDIT ANY CHANGES WILL BE OVERWRITTEN! +# DO NOT EDIT, ANY CHANGES 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. diff --git a/lgsm/config-default/config-lgsm/twserver/_default.cfg b/lgsm/config-default/config-lgsm/twserver/_default.cfg index 7703f02fb..5418c2edd 100644 --- a/lgsm/config-default/config-lgsm/twserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/twserver/_default.cfg @@ -1,7 +1,7 @@ ################################## ######## Default Settings ######## ################################## -# DO NOT EDIT ANY CHANGES WILL BE OVERWRITTEN! +# DO NOT EDIT, ANY CHANGES 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. diff --git a/lgsm/config-default/config-lgsm/untserver/_default.cfg b/lgsm/config-default/config-lgsm/untserver/_default.cfg index 261a98977..706760db8 100644 --- a/lgsm/config-default/config-lgsm/untserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/untserver/_default.cfg @@ -1,7 +1,7 @@ ################################## ######## Default Settings ######## ################################## -# DO NOT EDIT ANY CHANGES WILL BE OVERWRITTEN! +# DO NOT EDIT, ANY CHANGES 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. diff --git a/lgsm/config-default/config-lgsm/ut2k4server/_default.cfg b/lgsm/config-default/config-lgsm/ut2k4server/_default.cfg index db4f67291..4defaefa0 100644 --- a/lgsm/config-default/config-lgsm/ut2k4server/_default.cfg +++ b/lgsm/config-default/config-lgsm/ut2k4server/_default.cfg @@ -1,7 +1,7 @@ ################################## ######## Default Settings ######## ################################## -# DO NOT EDIT ANY CHANGES WILL BE OVERWRITTEN! +# DO NOT EDIT, ANY CHANGES 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. diff --git a/lgsm/config-default/config-lgsm/ut3server/_default.cfg b/lgsm/config-default/config-lgsm/ut3server/_default.cfg index 8d1cf1968..c7a6423f9 100644 --- a/lgsm/config-default/config-lgsm/ut3server/_default.cfg +++ b/lgsm/config-default/config-lgsm/ut3server/_default.cfg @@ -1,7 +1,7 @@ ################################## ######## Default Settings ######## ################################## -# DO NOT EDIT ANY CHANGES WILL BE OVERWRITTEN! +# DO NOT EDIT, ANY CHANGES 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. diff --git a/lgsm/config-default/config-lgsm/ut99server/_default.cfg b/lgsm/config-default/config-lgsm/ut99server/_default.cfg index df198b3af..eebd4740f 100644 --- a/lgsm/config-default/config-lgsm/ut99server/_default.cfg +++ b/lgsm/config-default/config-lgsm/ut99server/_default.cfg @@ -1,7 +1,7 @@ ################################## ######## Default Settings ######## ################################## -# DO NOT EDIT ANY CHANGES WILL BE OVERWRITTEN! +# DO NOT EDIT, ANY CHANGES 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. diff --git a/lgsm/config-default/config-lgsm/utserver/_default.cfg b/lgsm/config-default/config-lgsm/utserver/_default.cfg index 2bc0b3c9c..2e691be36 100644 --- a/lgsm/config-default/config-lgsm/utserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/utserver/_default.cfg @@ -1,7 +1,7 @@ ################################## ######## Default Settings ######## ################################## -# DO NOT EDIT ANY CHANGES WILL BE OVERWRITTEN! +# DO NOT EDIT, ANY CHANGES 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. diff --git a/lgsm/config-default/config-lgsm/vsserver/_default.cfg b/lgsm/config-default/config-lgsm/vsserver/_default.cfg index a7907034f..e28b48862 100644 --- a/lgsm/config-default/config-lgsm/vsserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/vsserver/_default.cfg @@ -1,7 +1,7 @@ ################################## ######## Default Settings ######## ################################## -# DO NOT EDIT ANY CHANGES WILL BE OVERWRITTEN! +# DO NOT EDIT, ANY CHANGES 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. diff --git a/lgsm/config-default/config-lgsm/wetserver/_default.cfg b/lgsm/config-default/config-lgsm/wetserver/_default.cfg index e4a7cd606..732ea5c90 100644 --- a/lgsm/config-default/config-lgsm/wetserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/wetserver/_default.cfg @@ -1,7 +1,7 @@ ################################## ######## Default Settings ######## ################################## -# DO NOT EDIT ANY CHANGES WILL BE OVERWRITTEN! +# DO NOT EDIT, ANY CHANGES 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. diff --git a/lgsm/config-default/config-lgsm/wfserver/_default.cfg b/lgsm/config-default/config-lgsm/wfserver/_default.cfg index 7ca4bdff5..4789bbc3a 100644 --- a/lgsm/config-default/config-lgsm/wfserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/wfserver/_default.cfg @@ -1,7 +1,7 @@ ################################## ######## Default Settings ######## ################################## -# DO NOT EDIT ANY CHANGES WILL BE OVERWRITTEN! +# DO NOT EDIT, ANY CHANGES 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. diff --git a/lgsm/config-default/config-lgsm/wurmserver/_default.cfg b/lgsm/config-default/config-lgsm/wurmserver/_default.cfg index c54055f65..30869ccf3 100644 --- a/lgsm/config-default/config-lgsm/wurmserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/wurmserver/_default.cfg @@ -1,7 +1,7 @@ ################################## ######## Default Settings ######## ################################## -# DO NOT EDIT ANY CHANGES WILL BE OVERWRITTEN! +# DO NOT EDIT, ANY CHANGES 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. diff --git a/lgsm/config-default/config-lgsm/zmrserver/_default.cfg b/lgsm/config-default/config-lgsm/zmrserver/_default.cfg index 57ab9440c..f1c943f6c 100644 --- a/lgsm/config-default/config-lgsm/zmrserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/zmrserver/_default.cfg @@ -1,7 +1,7 @@ ################################## ######## Default Settings ######## ################################## -# DO NOT EDIT ANY CHANGES WILL BE OVERWRITTEN! +# DO NOT EDIT, ANY CHANGES 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. diff --git a/lgsm/config-default/config-lgsm/zpsserver/_default.cfg b/lgsm/config-default/config-lgsm/zpsserver/_default.cfg index c64e12864..300f42338 100644 --- a/lgsm/config-default/config-lgsm/zpsserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/zpsserver/_default.cfg @@ -1,7 +1,7 @@ ################################## ######## Default Settings ######## ################################## -# DO NOT EDIT ANY CHANGES WILL BE OVERWRITTEN! +# DO NOT EDIT, ANY CHANGES 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. diff --git a/tests/tests_defaultcfg/defaultcfg_1.txt b/tests/tests_defaultcfg/defaultcfg_1.txt index 19318d90c..9a4df6c0b 100644 --- a/tests/tests_defaultcfg/defaultcfg_1.txt +++ b/tests/tests_defaultcfg/defaultcfg_1.txt @@ -1,7 +1,7 @@ ################################## ######## Default Settings ######## ################################## -# DO NOT EDIT ANY CHANGES WILL BE OVERWRITTEN! +# DO NOT EDIT, ANY CHANGES 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. From ccab1fa2a5038c1c939ea397a7a7180c1d0e605f Mon Sep 17 00:00:00 2001 From: Tamim Baschour Date: Thu, 14 Nov 2019 10:39:45 +0100 Subject: [PATCH 224/534] fix(ts3server): ts3 version detection when server was started with 'logappend=1' #2584 (#2585) --- lgsm/functions/update_ts3.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lgsm/functions/update_ts3.sh b/lgsm/functions/update_ts3.sh index 18768997c..ce61f59c0 100644 --- a/lgsm/functions/update_ts3.sh +++ b/lgsm/functions/update_ts3.sh @@ -68,7 +68,7 @@ fn_update_ts3_localbuild(){ fi if [ -z "${localbuild}" ]; then - localbuild=$(cat $(find ./* -name "ts3server*_0.log" 2> /dev/null | sort | tail -1) | grep -Eo "TeamSpeak 3 Server ((\.)?[0-9]{1,3}){1,3}\.[0-9]{1,3}" | grep -Eo "((\.)?[0-9]{1,3}){1,3}\.[0-9]{1,3}") + localbuild=$(cat $(find ./* -name "ts3server*_0.log" 2> /dev/null | sort | tail -1) | grep -Eo "TeamSpeak 3 Server ((\.)?[0-9]{1,3}){1,3}\.[0-9]{1,3}" | grep -Eo "((\.)?[0-9]{1,3}){1,3}\.[0-9]{1,3}" | tail -1) fi if [ -z "${localbuild}" ]; then @@ -81,7 +81,7 @@ fn_update_ts3_localbuild(){ loopignore=1 fn_script_log_info "Waiting for local build to generate" fi - localbuild=$(cat $(find ./* -name "ts3server*_0.log" 2> /dev/null | sort | tail -1) | grep -Eo "TeamSpeak 3 Server ((\.)?[0-9]{1,3}){1,3}\.[0-9]{1,3}" | grep -Eo "((\.)?[0-9]{1,3}){1,3}\.[0-9]{1,3}") + localbuild=$(cat $(find ./* -name "ts3server*_0.log" 2> /dev/null | sort | tail -1) | grep -Eo "TeamSpeak 3 Server ((\.)?[0-9]{1,3}){1,3}\.[0-9]{1,3}" | grep -Eo "((\.)?[0-9]{1,3}){1,3}\.[0-9]{1,3}" | tail -1) if [ "${localbuild}" ]; then break fi From 57589fe18848024f408b27d8152916606e214fb3 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Thu, 14 Nov 2019 11:09:26 +0000 Subject: [PATCH 225/534] feat(donate): add GitHub Sponsors --- .github/FUNDING.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/FUNDING.yml b/.github/FUNDING.yml index 79d78730b..7aadcac2a 100644 --- a/.github/FUNDING.yml +++ b/.github/FUNDING.yml @@ -1,6 +1,6 @@ # These are supported funding model platforms -github: # Replace with up to 4 GitHub Sponsors-enabled usernames e.g., [user1, user2] +github: dgibbs64 # Replace with up to 4 GitHub Sponsors-enabled usernames e.g., [user1, user2] patreon: dgibbs # Replace with a single Patreon username open_collective: # Replace with a single Open Collective username ko_fi: dgibbs # Replace with a single Ko-fi username From 7cc45b322924feb643589c9d0d0b32378c8cb46d Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Thu, 14 Nov 2019 11:16:12 +0000 Subject: [PATCH 226/534] updated paypal url --- .github/FUNDING.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/FUNDING.yml b/.github/FUNDING.yml index 7aadcac2a..bb77d9f85 100644 --- a/.github/FUNDING.yml +++ b/.github/FUNDING.yml @@ -9,4 +9,4 @@ community_bridge: # Replace with a single Community Bridge project-name e.g., cl liberapay: # Replace with a single Liberapay username issuehunt: # Replace with a single IssueHunt username otechie: # Replace with a single Otechie username -custom: https://www.paypal.me/dgibbs64 # Replace with a single custom sponsorship URL +custom: ["https://www.paypal.me/dgibbs64", paypal.me/dgibbs64] # Replace with a single custom sponsorship URL From 5322d490776c99efd04b38454b7601284c538969 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Fri, 15 Nov 2019 15:40:46 +0000 Subject: [PATCH 227/534] fix(rustserver): corrected stop mode for Rust (#2588) --- lgsm/config-default/config-lgsm/rustserver/_default.cfg | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lgsm/config-default/config-lgsm/rustserver/_default.cfg b/lgsm/config-default/config-lgsm/rustserver/_default.cfg index 1819ddd18..557ceda89 100644 --- a/lgsm/config-default/config-lgsm/rustserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/rustserver/_default.cfg @@ -144,7 +144,7 @@ steammaster="false" # 8: 7 Days to Die # 9: Gold Source # 10: Teamspeak 3 -stopmode="3" +stopmode="2" ## Game Server Details # Do not edit From b98f160d8a3aba9094c73e1621047c43c1c84db1 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Fri, 15 Nov 2019 15:42:24 +0000 Subject: [PATCH 228/534] minor grammar correction --- .github/pull_request_template.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/pull_request_template.md b/.github/pull_request_template.md index a04f0dc68..8a6a36f65 100644 --- a/.github/pull_request_template.md +++ b/.github/pull_request_template.md @@ -1,6 +1,6 @@ # Description -Please include a summary of the change and which issues is fixed +Please include a summary of the change and which issues are fixed. Fixes #[issue] From 8dd03776d333e2d167f0f2ac6278ef7a94b292cf Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Fri, 15 Nov 2019 17:56:07 +0000 Subject: [PATCH 229/534] feat(stats): add new feature LinuxGSM stat (#2590) --- .../config-lgsm/ahl2server/_default.cfg | 6 ++ .../config-lgsm/ahlserver/_default.cfg | 6 ++ .../config-lgsm/arkserver/_default.cfg | 6 ++ .../config-lgsm/arma3server/_default.cfg | 6 ++ .../config-lgsm/bb2server/_default.cfg | 6 ++ .../config-lgsm/bbserver/_default.cfg | 6 ++ .../config-lgsm/bdserver/_default.cfg | 6 ++ .../config-lgsm/bf1942server/_default.cfg | 6 ++ .../config-lgsm/bmdmserver/_default.cfg | 6 ++ .../config-lgsm/boserver/_default.cfg | 6 ++ .../config-lgsm/bsserver/_default.cfg | 6 ++ .../config-lgsm/bt1944server/_default.cfg | 6 ++ .../config-lgsm/btserver/_default.cfg | 6 ++ .../config-lgsm/ccserver/_default.cfg | 6 ++ .../config-lgsm/cod2server/_default.cfg | 6 ++ .../config-lgsm/cod4server/_default.cfg | 6 ++ .../config-lgsm/codserver/_default.cfg | 6 ++ .../config-lgsm/coduoserver/_default.cfg | 6 ++ .../config-lgsm/codwawserver/_default.cfg | 6 ++ .../config-lgsm/csczserver/_default.cfg | 6 ++ .../config-lgsm/csgoserver/_default.cfg | 6 ++ .../config-lgsm/csserver/_default.cfg | 6 ++ .../config-lgsm/cssserver/_default.cfg | 6 ++ .../config-lgsm/dabserver/_default.cfg | 6 ++ .../config-lgsm/dmcserver/_default.cfg | 6 ++ .../config-lgsm/dodserver/_default.cfg | 6 ++ .../config-lgsm/dodsserver/_default.cfg | 6 ++ .../config-lgsm/doiserver/_default.cfg | 6 ++ .../config-lgsm/dstserver/_default.cfg | 6 ++ .../config-lgsm/dysserver/_default.cfg | 6 ++ .../config-lgsm/ecoserver/_default.cfg | 6 ++ .../config-lgsm/emserver/_default.cfg | 6 ++ .../config-lgsm/etlserver/_default.cfg | 6 ++ .../config-lgsm/fctrserver/_default.cfg | 6 ++ .../config-lgsm/fofserver/_default.cfg | 6 ++ .../config-lgsm/gesserver/_default.cfg | 6 ++ .../config-lgsm/gmodserver/_default.cfg | 6 ++ .../config-lgsm/hl2dmserver/_default.cfg | 6 ++ .../config-lgsm/hldmserver/_default.cfg | 6 ++ .../config-lgsm/hldmsserver/_default.cfg | 6 ++ .../config-lgsm/hwserver/_default.cfg | 6 ++ .../config-lgsm/insserver/_default.cfg | 6 ++ .../config-lgsm/inssserver/_default.cfg | 6 ++ .../config-lgsm/iosserver/_default.cfg | 6 ++ .../config-lgsm/jc2server/_default.cfg | 6 ++ .../config-lgsm/jc3server/_default.cfg | 6 ++ .../config-lgsm/kf2server/_default.cfg | 6 ++ .../config-lgsm/kfserver/_default.cfg | 6 ++ .../config-lgsm/l4d2server/_default.cfg | 6 ++ .../config-lgsm/l4dserver/_default.cfg | 6 ++ .../config-lgsm/mcserver/_default.cfg | 6 ++ .../config-lgsm/mhserver/_default.cfg | 6 ++ .../config-lgsm/mohaaserver/_default.cfg | 6 ++ .../config-lgsm/mtaserver/_default.cfg | 6 ++ .../config-lgsm/mumbleserver/_default.cfg | 6 ++ .../config-lgsm/ndserver/_default.cfg | 6 ++ .../config-lgsm/nmrihserver/_default.cfg | 6 ++ .../config-lgsm/ns2cserver/_default.cfg | 6 ++ .../config-lgsm/ns2server/_default.cfg | 6 ++ .../config-lgsm/nsserver/_default.cfg | 6 ++ .../config-lgsm/opforserver/_default.cfg | 6 ++ .../config-lgsm/pcserver/_default.cfg | 6 ++ .../config-lgsm/pstbsserver/_default.cfg | 6 ++ .../config-lgsm/pvkiiserver/_default.cfg | 6 ++ .../config-lgsm/pzserver/_default.cfg | 6 ++ .../config-lgsm/q2server/_default.cfg | 6 ++ .../config-lgsm/q3server/_default.cfg | 6 ++ .../config-lgsm/qlserver/_default.cfg | 6 ++ .../config-lgsm/qwserver/_default.cfg | 6 ++ .../config-lgsm/ricochetserver/_default.cfg | 6 ++ .../config-lgsm/roserver/_default.cfg | 6 ++ .../config-lgsm/rtcwserver/_default.cfg | 6 ++ .../config-lgsm/rustserver/_default.cfg | 6 ++ .../config-lgsm/rwserver/_default.cfg | 6 ++ .../config-lgsm/sampserver/_default.cfg | 6 ++ .../config-lgsm/sbotsserver/_default.cfg | 6 ++ .../config-lgsm/sbserver/_default.cfg | 6 ++ .../config-lgsm/sdtdserver/_default.cfg | 6 ++ .../config-lgsm/sfcserver/_default.cfg | 6 ++ .../config-lgsm/sof2server/_default.cfg | 6 ++ .../config-lgsm/solserver/_default.cfg | 6 ++ .../config-lgsm/squadserver/_default.cfg | 6 ++ .../config-lgsm/ss3server/_default.cfg | 6 ++ .../config-lgsm/stserver/_default.cfg | 6 ++ .../config-lgsm/svenserver/_default.cfg | 6 ++ .../config-lgsm/terrariaserver/_default.cfg | 6 ++ .../config-lgsm/tf2server/_default.cfg | 6 ++ .../config-lgsm/tfcserver/_default.cfg | 6 ++ .../config-lgsm/ts3server/_default.cfg | 12 ++- .../config-lgsm/tsserver/_default.cfg | 6 ++ .../config-lgsm/tuserver/_default.cfg | 6 ++ .../config-lgsm/twserver/_default.cfg | 6 ++ .../config-lgsm/untserver/_default.cfg | 6 ++ .../config-lgsm/ut2k4server/_default.cfg | 6 ++ .../config-lgsm/ut3server/_default.cfg | 6 ++ .../config-lgsm/ut99server/_default.cfg | 6 ++ .../config-lgsm/utserver/_default.cfg | 6 ++ .../config-lgsm/vsserver/_default.cfg | 6 ++ .../config-lgsm/wetserver/_default.cfg | 6 ++ .../config-lgsm/wfserver/_default.cfg | 6 ++ .../config-lgsm/wurmserver/_default.cfg | 6 ++ .../config-lgsm/zmrserver/_default.cfg | 6 ++ .../config-lgsm/zpsserver/_default.cfg | 6 ++ lgsm/functions/command_install.sh | 1 + lgsm/functions/command_monitor.sh | 4 + lgsm/functions/core_functions.sh | 10 +++ lgsm/functions/info_distro.sh | 7 +- lgsm/functions/info_messages.sh | 4 +- lgsm/functions/info_stats.sh | 74 +++++++++++++++++++ lgsm/functions/install_stats.sh | 29 ++++++++ 110 files changed, 746 insertions(+), 7 deletions(-) create mode 100644 lgsm/functions/info_stats.sh create mode 100644 lgsm/functions/install_stats.sh diff --git a/lgsm/config-default/config-lgsm/ahl2server/_default.cfg b/lgsm/config-default/config-lgsm/ahl2server/_default.cfg index e5b68e4e9..5d1031017 100644 --- a/lgsm/config-default/config-lgsm/ahl2server/_default.cfg +++ b/lgsm/config-default/config-lgsm/ahl2server/_default.cfg @@ -27,6 +27,12 @@ parms="-game ahl2 -strictportbind -ip ${ip} -port ${port} +clientport ${clientpo #### LinuxGSM Settings #### +## LinuxGSM Stats +# Send useful stats to LinuxGSM developers. +# https://docs.linuxgsm.com/configuration/linuxgsm-stats +# (on|off) +stats="off" + ## Notification Alerts # (on|off) diff --git a/lgsm/config-default/config-lgsm/ahlserver/_default.cfg b/lgsm/config-default/config-lgsm/ahlserver/_default.cfg index 89c9e8fc8..8aeab4fcd 100644 --- a/lgsm/config-default/config-lgsm/ahlserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/ahlserver/_default.cfg @@ -22,6 +22,12 @@ parms="-game action -strictportbind +ip ${ip} -port ${port} +clientport ${client #### LinuxGSM Settings #### +## LinuxGSM Stats +# Send useful stats to LinuxGSM developers. +# https://docs.linuxgsm.com/configuration/linuxgsm-stats +# (on|off) +stats="off" + ## Notification Alerts # (on|off) diff --git a/lgsm/config-default/config-lgsm/arkserver/_default.cfg b/lgsm/config-default/config-lgsm/arkserver/_default.cfg index fadbde978..c5ec8b7bc 100644 --- a/lgsm/config-default/config-lgsm/arkserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/arkserver/_default.cfg @@ -24,6 +24,12 @@ parms="\"${defaultmap}?AltSaveDirectoryName=${defaultmap}?listen?MultiHome=${ip} #### LinuxGSM Settings #### +## LinuxGSM Stats +# Send useful stats to LinuxGSM developers. +# https://docs.linuxgsm.com/configuration/linuxgsm-stats +# (on|off) +stats="off" + ## Notification Alerts # (on|off) diff --git a/lgsm/config-default/config-lgsm/arma3server/_default.cfg b/lgsm/config-default/config-lgsm/arma3server/_default.cfg index ac4807675..7f83e8427 100644 --- a/lgsm/config-default/config-lgsm/arma3server/_default.cfg +++ b/lgsm/config-default/config-lgsm/arma3server/_default.cfg @@ -38,6 +38,12 @@ parms="-ip=${ip} -port=${port} -cfg=${networkcfgfullpath} -config=${servercfgful #### LinuxGSM Settings #### +## LinuxGSM Stats +# Send useful stats to LinuxGSM developers. +# https://docs.linuxgsm.com/configuration/linuxgsm-stats +# (on|off) +stats="off" + ## Notification Alerts # (on|off) diff --git a/lgsm/config-default/config-lgsm/bb2server/_default.cfg b/lgsm/config-default/config-lgsm/bb2server/_default.cfg index 0027555dd..c73974c56 100644 --- a/lgsm/config-default/config-lgsm/bb2server/_default.cfg +++ b/lgsm/config-default/config-lgsm/bb2server/_default.cfg @@ -28,6 +28,12 @@ parms="-game brainbread2 -strictportbind -ip ${ip} -port ${port} +clientport ${c #### LinuxGSM Settings #### +## LinuxGSM Stats +# Send useful stats to LinuxGSM developers. +# https://docs.linuxgsm.com/configuration/linuxgsm-stats +# (on|off) +stats="off" + ## Notification Alerts # (on|off) diff --git a/lgsm/config-default/config-lgsm/bbserver/_default.cfg b/lgsm/config-default/config-lgsm/bbserver/_default.cfg index b8e6623c7..63fc1cee2 100644 --- a/lgsm/config-default/config-lgsm/bbserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/bbserver/_default.cfg @@ -22,6 +22,12 @@ parms="-game brainbread -strictportbind +ip ${ip} -port ${port} +clientport ${cl #### LinuxGSM Settings #### +## LinuxGSM Stats +# Send useful stats to LinuxGSM developers. +# https://docs.linuxgsm.com/configuration/linuxgsm-stats +# (on|off) +stats="off" + ## Notification Alerts # (on|off) diff --git a/lgsm/config-default/config-lgsm/bdserver/_default.cfg b/lgsm/config-default/config-lgsm/bdserver/_default.cfg index 8fc0da936..e9a0ccb4a 100644 --- a/lgsm/config-default/config-lgsm/bdserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/bdserver/_default.cfg @@ -22,6 +22,12 @@ parms="-game bdef -strictportbind +ip ${ip} -port ${port} +clientport ${clientpo #### LinuxGSM Settings #### +## LinuxGSM Stats +# Send useful stats to LinuxGSM developers. +# https://docs.linuxgsm.com/configuration/linuxgsm-stats +# (on|off) +stats="off" + ## Notification Alerts # (on|off) diff --git a/lgsm/config-default/config-lgsm/bf1942server/_default.cfg b/lgsm/config-default/config-lgsm/bf1942server/_default.cfg index 4ee100479..1a04f03dd 100644 --- a/lgsm/config-default/config-lgsm/bf1942server/_default.cfg +++ b/lgsm/config-default/config-lgsm/bf1942server/_default.cfg @@ -15,6 +15,12 @@ parms="+hostServer 1 +dedicated 1" #### LinuxGSM Settings #### +## LinuxGSM Stats +# Send useful stats to LinuxGSM developers. +# https://docs.linuxgsm.com/configuration/linuxgsm-stats +# (on|off) +stats="off" + ## Notification Alerts # (on|off) diff --git a/lgsm/config-default/config-lgsm/bmdmserver/_default.cfg b/lgsm/config-default/config-lgsm/bmdmserver/_default.cfg index 61a49f31d..756f7705a 100644 --- a/lgsm/config-default/config-lgsm/bmdmserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/bmdmserver/_default.cfg @@ -28,6 +28,12 @@ parms="-game bms -strictportbind -ip ${ip} -port ${port} +clientport ${clientpor #### LinuxGSM Settings #### +## LinuxGSM Stats +# Send useful stats to LinuxGSM developers. +# https://docs.linuxgsm.com/configuration/linuxgsm-stats +# (on|off) +stats="off" + ## Notification Alerts # (on|off) diff --git a/lgsm/config-default/config-lgsm/boserver/_default.cfg b/lgsm/config-default/config-lgsm/boserver/_default.cfg index d7ab1b8e5..e7d0bf4dd 100644 --- a/lgsm/config-default/config-lgsm/boserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/boserver/_default.cfg @@ -21,6 +21,12 @@ parms="-batchmode -nographics -dedicated -configfile=${servercfgfullpath}" #### LinuxGSM Settings #### +## LinuxGSM Stats +# Send useful stats to LinuxGSM developers. +# https://docs.linuxgsm.com/configuration/linuxgsm-stats +# (on|off) +stats="off" + ## Notification Alerts # (on|off) diff --git a/lgsm/config-default/config-lgsm/bsserver/_default.cfg b/lgsm/config-default/config-lgsm/bsserver/_default.cfg index 8274ae6b6..4eac8cb6e 100644 --- a/lgsm/config-default/config-lgsm/bsserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/bsserver/_default.cfg @@ -32,6 +32,12 @@ parms="-game "${serverfiles}/berimbau" -autoupdate -strictportbind -ip ${ip} -po #### LinuxGSM Settings #### +## LinuxGSM Stats +# Send useful stats to LinuxGSM developers. +# https://docs.linuxgsm.com/configuration/linuxgsm-stats +# (on|off) +stats="off" + ## Notification Alerts # (on|off) diff --git a/lgsm/config-default/config-lgsm/bt1944server/_default.cfg b/lgsm/config-default/config-lgsm/bt1944server/_default.cfg index 08df70553..6629e8263 100644 --- a/lgsm/config-default/config-lgsm/bt1944server/_default.cfg +++ b/lgsm/config-default/config-lgsm/bt1944server/_default.cfg @@ -20,6 +20,12 @@ parms="/Game/Maps/Final_Maps/Derailed?Game=/Script/ShooterGame.WartideGameMode?l #### LinuxGSM Settings #### +## LinuxGSM Stats +# Send useful stats to LinuxGSM developers. +# https://docs.linuxgsm.com/configuration/linuxgsm-stats +# (on|off) +stats="off" + ## Notification Alerts # (on|off) diff --git a/lgsm/config-default/config-lgsm/btserver/_default.cfg b/lgsm/config-default/config-lgsm/btserver/_default.cfg index 9e232d531..c1edf3d34 100644 --- a/lgsm/config-default/config-lgsm/btserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/btserver/_default.cfg @@ -15,6 +15,12 @@ parms="" #### LinuxGSM Settings #### +## LinuxGSM Stats +# Send useful stats to LinuxGSM developers. +# https://docs.linuxgsm.com/configuration/linuxgsm-stats +# (on|off) +stats="off" + ## Notification Alerts # (on|off) diff --git a/lgsm/config-default/config-lgsm/ccserver/_default.cfg b/lgsm/config-default/config-lgsm/ccserver/_default.cfg index 6f453cceb..230c64250 100644 --- a/lgsm/config-default/config-lgsm/ccserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/ccserver/_default.cfg @@ -23,6 +23,12 @@ parms="-game cure -strictportbind -ip ${ip} -port ${port} +clientport ${clientpo #### LinuxGSM Settings #### +## LinuxGSM Stats +# Send useful stats to LinuxGSM developers. +# https://docs.linuxgsm.com/configuration/linuxgsm-stats +# (on|off) +stats="off" + ## Notification Alerts # (on|off) diff --git a/lgsm/config-default/config-lgsm/cod2server/_default.cfg b/lgsm/config-default/config-lgsm/cod2server/_default.cfg index e3d381113..f3b1e48c1 100644 --- a/lgsm/config-default/config-lgsm/cod2server/_default.cfg +++ b/lgsm/config-default/config-lgsm/cod2server/_default.cfg @@ -21,6 +21,12 @@ parms="+set sv_punkbuster 0 +set fs_basepath ${serverfiles} +set dedicated 2 +se #### LinuxGSM Settings #### +## LinuxGSM Stats +# Send useful stats to LinuxGSM developers. +# https://docs.linuxgsm.com/configuration/linuxgsm-stats +# (on|off) +stats="off" + ## Notification Alerts # (on|off) diff --git a/lgsm/config-default/config-lgsm/cod4server/_default.cfg b/lgsm/config-default/config-lgsm/cod4server/_default.cfg index 5224656b0..56d7f4aaf 100644 --- a/lgsm/config-default/config-lgsm/cod4server/_default.cfg +++ b/lgsm/config-default/config-lgsm/cod4server/_default.cfg @@ -21,6 +21,12 @@ parms="+set sv_punkbuster 0 +set fs_basepath ${serverfiles} +set fs_homepath ${s #### LinuxGSM Settings #### +## LinuxGSM Stats +# Send useful stats to LinuxGSM developers. +# https://docs.linuxgsm.com/configuration/linuxgsm-stats +# (on|off) +stats="off" + ## Notification Alerts # (on|off) diff --git a/lgsm/config-default/config-lgsm/codserver/_default.cfg b/lgsm/config-default/config-lgsm/codserver/_default.cfg index 609b1d69a..31fe03d8c 100644 --- a/lgsm/config-default/config-lgsm/codserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/codserver/_default.cfg @@ -21,6 +21,12 @@ parms="+set sv_punkbuster 0 +set fs_basepath ${serverfiles} +set dedicated 2 +se #### LinuxGSM Settings #### +## LinuxGSM Stats +# Send useful stats to LinuxGSM developers. +# https://docs.linuxgsm.com/configuration/linuxgsm-stats +# (on|off) +stats="off" + ## Notification Alerts # (on|off) diff --git a/lgsm/config-default/config-lgsm/coduoserver/_default.cfg b/lgsm/config-default/config-lgsm/coduoserver/_default.cfg index 15c7d8396..c0274d899 100644 --- a/lgsm/config-default/config-lgsm/coduoserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/coduoserver/_default.cfg @@ -21,6 +21,12 @@ parms="+set sv_punkbuster 0 +set fs_basepath ${serverfiles} +set dedicated 2 +se #### LinuxGSM Settings #### +## LinuxGSM Stats +# Send useful stats to LinuxGSM developers. +# https://docs.linuxgsm.com/configuration/linuxgsm-stats +# (on|off) +stats="off" + ## Notification Alerts # (on|off) diff --git a/lgsm/config-default/config-lgsm/codwawserver/_default.cfg b/lgsm/config-default/config-lgsm/codwawserver/_default.cfg index 0bea558d2..751a3bb41 100644 --- a/lgsm/config-default/config-lgsm/codwawserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/codwawserver/_default.cfg @@ -21,6 +21,12 @@ parms="+set sv_punkbuster 0 +set fs_basepath ${serverfiles} +set dedicated 2 +se #### LinuxGSM Settings #### +## LinuxGSM Stats +# Send useful stats to LinuxGSM developers. +# https://docs.linuxgsm.com/configuration/linuxgsm-stats +# (on|off) +stats="off" + ## Notification Alerts # (on|off) diff --git a/lgsm/config-default/config-lgsm/csczserver/_default.cfg b/lgsm/config-default/config-lgsm/csczserver/_default.cfg index 6b4dbe86e..039e0409c 100644 --- a/lgsm/config-default/config-lgsm/csczserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/csczserver/_default.cfg @@ -22,6 +22,12 @@ parms="-game czero -strictportbind +ip ${ip} -port ${port} +clientport ${clientp #### LinuxGSM Settings #### +## LinuxGSM Stats +# Send useful stats to LinuxGSM developers. +# https://docs.linuxgsm.com/configuration/linuxgsm-stats +# (on|off) +stats="off" + ## Notification Alerts # (on|off) diff --git a/lgsm/config-default/config-lgsm/csgoserver/_default.cfg b/lgsm/config-default/config-lgsm/csgoserver/_default.cfg index b3b792b56..db3e27811 100644 --- a/lgsm/config-default/config-lgsm/csgoserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/csgoserver/_default.cfg @@ -48,6 +48,12 @@ parms="-game csgo -usercon -strictportbind -ip ${ip} -port ${port} +clientport $ #### LinuxGSM Settings #### +## LinuxGSM Stats +# Send useful stats to LinuxGSM developers. +# https://docs.linuxgsm.com/configuration/linuxgsm-stats +# (on|off) +stats="off" + ## Notification Alerts # (on|off) diff --git a/lgsm/config-default/config-lgsm/csserver/_default.cfg b/lgsm/config-default/config-lgsm/csserver/_default.cfg index ec54397c8..fef0d8bb9 100644 --- a/lgsm/config-default/config-lgsm/csserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/csserver/_default.cfg @@ -22,6 +22,12 @@ parms="-game cstrike -strictportbind +ip ${ip} -port ${port} +clientport ${clien #### LinuxGSM Settings #### +## LinuxGSM Stats +# Send useful stats to LinuxGSM developers. +# https://docs.linuxgsm.com/configuration/linuxgsm-stats +# (on|off) +stats="off" + ## Notification Alerts # (on|off) diff --git a/lgsm/config-default/config-lgsm/cssserver/_default.cfg b/lgsm/config-default/config-lgsm/cssserver/_default.cfg index a78f09136..2ef39d44c 100644 --- a/lgsm/config-default/config-lgsm/cssserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/cssserver/_default.cfg @@ -28,6 +28,12 @@ parms="-game cstrike -strictportbind -ip ${ip} -port ${port} +clientport ${clien #### LinuxGSM Settings #### +## LinuxGSM Stats +# Send useful stats to LinuxGSM developers. +# https://docs.linuxgsm.com/configuration/linuxgsm-stats +# (on|off) +stats="off" + ## Notification Alerts # (on|off) diff --git a/lgsm/config-default/config-lgsm/dabserver/_default.cfg b/lgsm/config-default/config-lgsm/dabserver/_default.cfg index c8bef4e04..2340eb63a 100644 --- a/lgsm/config-default/config-lgsm/dabserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/dabserver/_default.cfg @@ -23,6 +23,12 @@ parms="-strictportbind -ip ${ip} -port ${port} +clientport ${clientport} +tv_por #### LinuxGSM Settings #### +## LinuxGSM Stats +# Send useful stats to LinuxGSM developers. +# https://docs.linuxgsm.com/configuration/linuxgsm-stats +# (on|off) +stats="off" + ## Notification Alerts # (on|off) diff --git a/lgsm/config-default/config-lgsm/dmcserver/_default.cfg b/lgsm/config-default/config-lgsm/dmcserver/_default.cfg index a4126a054..a9561dc37 100644 --- a/lgsm/config-default/config-lgsm/dmcserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/dmcserver/_default.cfg @@ -22,6 +22,12 @@ parms="-game dmc -strictportbind +ip ${ip} -port ${port} +clientport ${clientpor #### LinuxGSM Settings #### +## LinuxGSM Stats +# Send useful stats to LinuxGSM developers. +# https://docs.linuxgsm.com/configuration/linuxgsm-stats +# (on|off) +stats="off" + ## Notification Alerts # (on|off) diff --git a/lgsm/config-default/config-lgsm/dodserver/_default.cfg b/lgsm/config-default/config-lgsm/dodserver/_default.cfg index b96d1ab5d..3a9afe284 100644 --- a/lgsm/config-default/config-lgsm/dodserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/dodserver/_default.cfg @@ -22,6 +22,12 @@ parms="-game dod -strictportbind +ip ${ip} -port ${port} +clientport ${clientpor #### LinuxGSM Settings #### +## LinuxGSM Stats +# Send useful stats to LinuxGSM developers. +# https://docs.linuxgsm.com/configuration/linuxgsm-stats +# (on|off) +stats="off" + ## Notification Alerts # (on|off) diff --git a/lgsm/config-default/config-lgsm/dodsserver/_default.cfg b/lgsm/config-default/config-lgsm/dodsserver/_default.cfg index 957cbb176..ca6391872 100644 --- a/lgsm/config-default/config-lgsm/dodsserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/dodsserver/_default.cfg @@ -23,6 +23,12 @@ parms="-game dod -strictportbind -ip ${ip} -port ${port} +clientport ${clientpor #### LinuxGSM Settings #### +## LinuxGSM Stats +# Send useful stats to LinuxGSM developers. +# https://docs.linuxgsm.com/configuration/linuxgsm-stats +# (on|off) +stats="off" + ## Notification Alerts # (on|off) diff --git a/lgsm/config-default/config-lgsm/doiserver/_default.cfg b/lgsm/config-default/config-lgsm/doiserver/_default.cfg index cb984dc4a..ac3feb41c 100644 --- a/lgsm/config-default/config-lgsm/doiserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/doiserver/_default.cfg @@ -24,6 +24,12 @@ parms="-game doi -strictportbind -ip ${ip} -port ${port} +clientport ${clientpor #### LinuxGSM Settings #### +## LinuxGSM Stats +# Send useful stats to LinuxGSM developers. +# https://docs.linuxgsm.com/configuration/linuxgsm-stats +# (on|off) +stats="off" + ## Notification Alerts # (on|off) diff --git a/lgsm/config-default/config-lgsm/dstserver/_default.cfg b/lgsm/config-default/config-lgsm/dstserver/_default.cfg index 5c3aaa738..f25a4ff70 100644 --- a/lgsm/config-default/config-lgsm/dstserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/dstserver/_default.cfg @@ -26,6 +26,12 @@ parms="-persistent_storage_root ${persistentstorageroot} -conf_dir ${confdir} -c #### LinuxGSM Settings #### +## LinuxGSM Stats +# Send useful stats to LinuxGSM developers. +# https://docs.linuxgsm.com/configuration/linuxgsm-stats +# (on|off) +stats="off" + ## Notification Alerts # (on|off) diff --git a/lgsm/config-default/config-lgsm/dysserver/_default.cfg b/lgsm/config-default/config-lgsm/dysserver/_default.cfg index 462162afe..fbbc847fd 100644 --- a/lgsm/config-default/config-lgsm/dysserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/dysserver/_default.cfg @@ -28,6 +28,12 @@ parms="-game "${serverfiles}/dystopia" -strictportbind -ip ${ip} -port ${port} + #### LinuxGSM Settings #### +## LinuxGSM Stats +# Send useful stats to LinuxGSM developers. +# https://docs.linuxgsm.com/configuration/linuxgsm-stats +# (on|off) +stats="off" + ## Notification Alerts # (on|off) diff --git a/lgsm/config-default/config-lgsm/ecoserver/_default.cfg b/lgsm/config-default/config-lgsm/ecoserver/_default.cfg index 098750256..145a2a547 100644 --- a/lgsm/config-default/config-lgsm/ecoserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/ecoserver/_default.cfg @@ -15,6 +15,12 @@ fn_parms(){ #### LinuxGSM Settings #### +## LinuxGSM Stats +# Send useful stats to LinuxGSM developers. +# https://docs.linuxgsm.com/configuration/linuxgsm-stats +# (on|off) +stats="off" + ## Notification Alerts # (on|off) diff --git a/lgsm/config-default/config-lgsm/emserver/_default.cfg b/lgsm/config-default/config-lgsm/emserver/_default.cfg index 471be19b2..abd75f12d 100644 --- a/lgsm/config-default/config-lgsm/emserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/emserver/_default.cfg @@ -28,6 +28,12 @@ parms="-game empires -strictportbind -ip ${ip} -port ${port} +clientport ${clien #### LinuxGSM Settings #### +## LinuxGSM Stats +# Send useful stats to LinuxGSM developers. +# https://docs.linuxgsm.com/configuration/linuxgsm-stats +# (on|off) +stats="off" + ## Notification Alerts # (on|off) diff --git a/lgsm/config-default/config-lgsm/etlserver/_default.cfg b/lgsm/config-default/config-lgsm/etlserver/_default.cfg index f1986f01a..3e2cb2bd6 100644 --- a/lgsm/config-default/config-lgsm/etlserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/etlserver/_default.cfg @@ -15,6 +15,12 @@ parms="+set net_strict 1 +set fs_homepath ${serverfiles} +exec ${servercfg}" #### LinuxGSM Settings #### +## LinuxGSM Stats +# Send useful stats to LinuxGSM developers. +# https://docs.linuxgsm.com/configuration/linuxgsm-stats +# (on|off) +stats="off" + ## Notification Alerts # (on|off) diff --git a/lgsm/config-default/config-lgsm/fctrserver/_default.cfg b/lgsm/config-default/config-lgsm/fctrserver/_default.cfg index 61afb88dd..6eb8988c7 100644 --- a/lgsm/config-default/config-lgsm/fctrserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/fctrserver/_default.cfg @@ -23,6 +23,12 @@ parms="--start-server ${serverfiles}/save1.zip --server-settings ${servercfgfull #### LinuxGSM Settings #### +## LinuxGSM Stats +# Send useful stats to LinuxGSM developers. +# https://docs.linuxgsm.com/configuration/linuxgsm-stats +# (on|off) +stats="off" + ## Notification Alerts # (on|off) diff --git a/lgsm/config-default/config-lgsm/fofserver/_default.cfg b/lgsm/config-default/config-lgsm/fofserver/_default.cfg index 4bc062ed5..26a043dcc 100644 --- a/lgsm/config-default/config-lgsm/fofserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/fofserver/_default.cfg @@ -23,6 +23,12 @@ parms="-game fof -strictportbind -ip ${ip} -port ${port} +clientport ${clientpor #### LinuxGSM Settings #### +## LinuxGSM Stats +# Send useful stats to LinuxGSM developers. +# https://docs.linuxgsm.com/configuration/linuxgsm-stats +# (on|off) +stats="off" + ## Notification Alerts # (on|off) diff --git a/lgsm/config-default/config-lgsm/gesserver/_default.cfg b/lgsm/config-default/config-lgsm/gesserver/_default.cfg index 2b2840172..5c91c62cc 100644 --- a/lgsm/config-default/config-lgsm/gesserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/gesserver/_default.cfg @@ -23,6 +23,12 @@ parms="-game gesource -strictportbind -ip ${ip} -port ${port} +clientport ${clie #### LinuxGSM Settings #### +## LinuxGSM Stats +# Send useful stats to LinuxGSM developers. +# https://docs.linuxgsm.com/configuration/linuxgsm-stats +# (on|off) +stats="off" + ## Notification Alerts # (on|off) diff --git a/lgsm/config-default/config-lgsm/gmodserver/_default.cfg b/lgsm/config-default/config-lgsm/gmodserver/_default.cfg index 07e003d51..f0be94ba4 100644 --- a/lgsm/config-default/config-lgsm/gmodserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/gmodserver/_default.cfg @@ -39,6 +39,12 @@ parms="-game garrysmod -strictportbind -ip ${ip} -port ${port} -tickrate ${tickr #### LinuxGSM Settings #### +## LinuxGSM Stats +# Send useful stats to LinuxGSM developers. +# https://docs.linuxgsm.com/configuration/linuxgsm-stats +# (on|off) +stats="off" + ## Notification Alerts # (on|off) diff --git a/lgsm/config-default/config-lgsm/hl2dmserver/_default.cfg b/lgsm/config-default/config-lgsm/hl2dmserver/_default.cfg index c9b4a6006..e3a8827c5 100644 --- a/lgsm/config-default/config-lgsm/hl2dmserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/hl2dmserver/_default.cfg @@ -23,6 +23,12 @@ parms="-game hl2mp -strictportbind -ip ${ip} -port ${port} +clientport ${clientp #### LinuxGSM Settings #### +## LinuxGSM Stats +# Send useful stats to LinuxGSM developers. +# https://docs.linuxgsm.com/configuration/linuxgsm-stats +# (on|off) +stats="off" + ## Notification Alerts # (on|off) diff --git a/lgsm/config-default/config-lgsm/hldmserver/_default.cfg b/lgsm/config-default/config-lgsm/hldmserver/_default.cfg index ecd9db8c4..46ccbe72b 100644 --- a/lgsm/config-default/config-lgsm/hldmserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/hldmserver/_default.cfg @@ -22,6 +22,12 @@ parms="-game valve -strictportbind +ip ${ip} -port ${port} +clientport ${clientp #### LinuxGSM Settings #### +## LinuxGSM Stats +# Send useful stats to LinuxGSM developers. +# https://docs.linuxgsm.com/configuration/linuxgsm-stats +# (on|off) +stats="off" + ## Notification Alerts # (on|off) diff --git a/lgsm/config-default/config-lgsm/hldmsserver/_default.cfg b/lgsm/config-default/config-lgsm/hldmsserver/_default.cfg index 223a53f9a..2faea0e45 100644 --- a/lgsm/config-default/config-lgsm/hldmsserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/hldmsserver/_default.cfg @@ -23,6 +23,12 @@ parms="-game hl1mp -strictportbind -ip ${ip} -port ${port} +clientport ${clientp #### LinuxGSM Settings #### +## LinuxGSM Stats +# Send useful stats to LinuxGSM developers. +# https://docs.linuxgsm.com/configuration/linuxgsm-stats +# (on|off) +stats="off" + ## Notification Alerts # (on|off) diff --git a/lgsm/config-default/config-lgsm/hwserver/_default.cfg b/lgsm/config-default/config-lgsm/hwserver/_default.cfg index 4a1b9e148..08cd3753b 100644 --- a/lgsm/config-default/config-lgsm/hwserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/hwserver/_default.cfg @@ -34,6 +34,12 @@ parms="-batchmode -nographics -exec \"host ${port} ${defaultmap} ${loadsave};que #### LinuxGSM Settings #### +## LinuxGSM Stats +# Send useful stats to LinuxGSM developers. +# https://docs.linuxgsm.com/configuration/linuxgsm-stats +# (on|off) +stats="off" + ## Notification Alerts # (on|off) diff --git a/lgsm/config-default/config-lgsm/insserver/_default.cfg b/lgsm/config-default/config-lgsm/insserver/_default.cfg index 1793b44dc..15a740637 100644 --- a/lgsm/config-default/config-lgsm/insserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/insserver/_default.cfg @@ -29,6 +29,12 @@ parms="-game insurgency -strictportbind -ip ${ip} -port ${port} +clientport ${cl #### LinuxGSM Settings #### +## LinuxGSM Stats +# Send useful stats to LinuxGSM developers. +# https://docs.linuxgsm.com/configuration/linuxgsm-stats +# (on|off) +stats="off" + ## Notification Alerts # (on|off) diff --git a/lgsm/config-default/config-lgsm/inssserver/_default.cfg b/lgsm/config-default/config-lgsm/inssserver/_default.cfg index a77e2532b..80855fc13 100644 --- a/lgsm/config-default/config-lgsm/inssserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/inssserver/_default.cfg @@ -30,6 +30,12 @@ fn_parms(){ #### LinuxGSM Settings #### +## LinuxGSM Stats +# Send useful stats to LinuxGSM developers. +# https://docs.linuxgsm.com/configuration/linuxgsm-stats +# (on|off) +stats="off" + ## Notification Alerts # (on|off) diff --git a/lgsm/config-default/config-lgsm/iosserver/_default.cfg b/lgsm/config-default/config-lgsm/iosserver/_default.cfg index fb44280d2..907ea3c77 100644 --- a/lgsm/config-default/config-lgsm/iosserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/iosserver/_default.cfg @@ -23,6 +23,12 @@ parms="-game iosoccer -strictportbind -ip ${ip} -port ${port} +clientport ${clie #### LinuxGSM Settings #### +## LinuxGSM Stats +# Send useful stats to LinuxGSM developers. +# https://docs.linuxgsm.com/configuration/linuxgsm-stats +# (on|off) +stats="off" + ## Notification Alerts # (on|off) diff --git a/lgsm/config-default/config-lgsm/jc2server/_default.cfg b/lgsm/config-default/config-lgsm/jc2server/_default.cfg index 60a753887..24375440e 100644 --- a/lgsm/config-default/config-lgsm/jc2server/_default.cfg +++ b/lgsm/config-default/config-lgsm/jc2server/_default.cfg @@ -15,6 +15,12 @@ parms="" #### LinuxGSM Settings #### +## LinuxGSM Stats +# Send useful stats to LinuxGSM developers. +# https://docs.linuxgsm.com/configuration/linuxgsm-stats +# (on|off) +stats="off" + ## Notification Alerts # (on|off) diff --git a/lgsm/config-default/config-lgsm/jc3server/_default.cfg b/lgsm/config-default/config-lgsm/jc3server/_default.cfg index 80afd275e..d2c4cffd0 100644 --- a/lgsm/config-default/config-lgsm/jc3server/_default.cfg +++ b/lgsm/config-default/config-lgsm/jc3server/_default.cfg @@ -15,6 +15,12 @@ parms="" #### LinuxGSM Settings #### +## LinuxGSM Stats +# Send useful stats to LinuxGSM developers. +# https://docs.linuxgsm.com/configuration/linuxgsm-stats +# (on|off) +stats="off" + ## Notification Alerts # (on|off) diff --git a/lgsm/config-default/config-lgsm/kf2server/_default.cfg b/lgsm/config-default/config-lgsm/kf2server/_default.cfg index e12577f2c..2f7e596cd 100644 --- a/lgsm/config-default/config-lgsm/kf2server/_default.cfg +++ b/lgsm/config-default/config-lgsm/kf2server/_default.cfg @@ -21,6 +21,12 @@ parms="\"${defaultmap}?Game=${gamemode}?ConfigSubDir=${servicename} -QueryPort=$ #### LinuxGSM Settings #### +## LinuxGSM Stats +# Send useful stats to LinuxGSM developers. +# https://docs.linuxgsm.com/configuration/linuxgsm-stats +# (on|off) +stats="off" + ## Notification Alerts # (on|off) diff --git a/lgsm/config-default/config-lgsm/kfserver/_default.cfg b/lgsm/config-default/config-lgsm/kfserver/_default.cfg index 350857c6d..b39060c77 100644 --- a/lgsm/config-default/config-lgsm/kfserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/kfserver/_default.cfg @@ -27,6 +27,12 @@ parms="server ${defaultmap}?game=KFmod.KFGameType?VACSecured=true -nohomedir ini #### LinuxGSM Settings #### +## LinuxGSM Stats +# Send useful stats to LinuxGSM developers. +# https://docs.linuxgsm.com/configuration/linuxgsm-stats +# (on|off) +stats="off" + ## Notification Alerts # (on|off) diff --git a/lgsm/config-default/config-lgsm/l4d2server/_default.cfg b/lgsm/config-default/config-lgsm/l4d2server/_default.cfg index 7aa6328a8..0f7baddef 100644 --- a/lgsm/config-default/config-lgsm/l4d2server/_default.cfg +++ b/lgsm/config-default/config-lgsm/l4d2server/_default.cfg @@ -22,6 +22,12 @@ parms="-game left4dead2 -strictportbind -ip ${ip} -port ${port} +clientport ${cl #### LinuxGSM Settings #### +## LinuxGSM Stats +# Send useful stats to LinuxGSM developers. +# https://docs.linuxgsm.com/configuration/linuxgsm-stats +# (on|off) +stats="off" + ## Notification Alerts # (on|off) diff --git a/lgsm/config-default/config-lgsm/l4dserver/_default.cfg b/lgsm/config-default/config-lgsm/l4dserver/_default.cfg index 4093a1a8a..ef89de26c 100644 --- a/lgsm/config-default/config-lgsm/l4dserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/l4dserver/_default.cfg @@ -22,6 +22,12 @@ parms="-game left4dead -strictportbind -ip ${ip} -port ${port} +clientport ${cli #### LinuxGSM Settings #### +## LinuxGSM Stats +# Send useful stats to LinuxGSM developers. +# https://docs.linuxgsm.com/configuration/linuxgsm-stats +# (on|off) +stats="off" + ## Notification Alerts # (on|off) diff --git a/lgsm/config-default/config-lgsm/mcserver/_default.cfg b/lgsm/config-default/config-lgsm/mcserver/_default.cfg index 8342cf836..d351d9fc6 100644 --- a/lgsm/config-default/config-lgsm/mcserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/mcserver/_default.cfg @@ -17,6 +17,12 @@ parms="nogui" } #### LinuxGSM Settings #### +## LinuxGSM Stats +# Send useful stats to LinuxGSM developers. +# https://docs.linuxgsm.com/configuration/linuxgsm-stats +# (on|off) +stats="off" + ## Notification Alerts # (on|off) diff --git a/lgsm/config-default/config-lgsm/mhserver/_default.cfg b/lgsm/config-default/config-lgsm/mhserver/_default.cfg index 39ae7b967..72e85d80e 100644 --- a/lgsm/config-default/config-lgsm/mhserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/mhserver/_default.cfg @@ -23,6 +23,12 @@ parms="Mordhau ${defaultmap} -log -MultiHome=${ip} -Port=${port} -BeaconPort=${b #### LinuxGSM Settings #### +## LinuxGSM Stats +# Send useful stats to LinuxGSM developers. +# https://docs.linuxgsm.com/configuration/linuxgsm-stats +# (on|off) +stats="off" + ## Notification Alerts # (on|off) diff --git a/lgsm/config-default/config-lgsm/mohaaserver/_default.cfg b/lgsm/config-default/config-lgsm/mohaaserver/_default.cfg index 71c69ecc4..46c59e4fa 100644 --- a/lgsm/config-default/config-lgsm/mohaaserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/mohaaserver/_default.cfg @@ -20,6 +20,12 @@ parms="+set sv_punkbuster 0 +set fs_basepath ${serverfiles} +set fs_outputpath $ #### LinuxGSM Settings #### +## LinuxGSM Stats +# Send useful stats to LinuxGSM developers. +# https://docs.linuxgsm.com/configuration/linuxgsm-stats +# (on|off) +stats="off" + ## Notification Alerts # (on|off) diff --git a/lgsm/config-default/config-lgsm/mtaserver/_default.cfg b/lgsm/config-default/config-lgsm/mtaserver/_default.cfg index 011aa521b..cc73a9efb 100644 --- a/lgsm/config-default/config-lgsm/mtaserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/mtaserver/_default.cfg @@ -16,6 +16,12 @@ parms="" #### LinuxGSM Settings #### +## LinuxGSM Stats +# Send useful stats to LinuxGSM developers. +# https://docs.linuxgsm.com/configuration/linuxgsm-stats +# (on|off) +stats="off" + ## Notification Alerts # (on|off) diff --git a/lgsm/config-default/config-lgsm/mumbleserver/_default.cfg b/lgsm/config-default/config-lgsm/mumbleserver/_default.cfg index e0d8b6572..91f946aca 100644 --- a/lgsm/config-default/config-lgsm/mumbleserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/mumbleserver/_default.cfg @@ -16,6 +16,12 @@ parms="-fg -ini ${servercfgfullpath}" #### LinuxGSM Settings #### +## LinuxGSM Stats +# Send useful stats to LinuxGSM developers. +# https://docs.linuxgsm.com/configuration/linuxgsm-stats +# (on|off) +stats="off" + ## Notification Alerts # (on|off) diff --git a/lgsm/config-default/config-lgsm/ndserver/_default.cfg b/lgsm/config-default/config-lgsm/ndserver/_default.cfg index 57154df3c..765257bc7 100644 --- a/lgsm/config-default/config-lgsm/ndserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/ndserver/_default.cfg @@ -23,6 +23,12 @@ parms="-game nucleardawn -strictportbind -ip ${ip} -port ${port} +clientport ${c #### LinuxGSM Settings #### +## LinuxGSM Stats +# Send useful stats to LinuxGSM developers. +# https://docs.linuxgsm.com/configuration/linuxgsm-stats +# (on|off) +stats="off" + ## Notification Alerts # (on|off) diff --git a/lgsm/config-default/config-lgsm/nmrihserver/_default.cfg b/lgsm/config-default/config-lgsm/nmrihserver/_default.cfg index 0d281476e..9ca9fb8c6 100644 --- a/lgsm/config-default/config-lgsm/nmrihserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/nmrihserver/_default.cfg @@ -28,6 +28,12 @@ parms="-game nmrih -strictportbind -ip ${ip} -port ${port} +clientport ${clientp #### LinuxGSM Settings #### +## LinuxGSM Stats +# Send useful stats to LinuxGSM developers. +# https://docs.linuxgsm.com/configuration/linuxgsm-stats +# (on|off) +stats="off" + ## Notification Alerts # (on|off) diff --git a/lgsm/config-default/config-lgsm/ns2cserver/_default.cfg b/lgsm/config-default/config-lgsm/ns2cserver/_default.cfg index 99eb1ca12..f48479f70 100644 --- a/lgsm/config-default/config-lgsm/ns2cserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/ns2cserver/_default.cfg @@ -30,6 +30,12 @@ parms="-name \"${servername}\" -port ${port} -webadmin -webdomain ${ip} -webuser #### LinuxGSM Settings #### +## LinuxGSM Stats +# Send useful stats to LinuxGSM developers. +# https://docs.linuxgsm.com/configuration/linuxgsm-stats +# (on|off) +stats="off" + ## Notification Alerts # (on|off) diff --git a/lgsm/config-default/config-lgsm/ns2server/_default.cfg b/lgsm/config-default/config-lgsm/ns2server/_default.cfg index 6f7fcddbc..86e8ab539 100644 --- a/lgsm/config-default/config-lgsm/ns2server/_default.cfg +++ b/lgsm/config-default/config-lgsm/ns2server/_default.cfg @@ -34,6 +34,12 @@ parms="-name \"${servername}\" -port ${port} -webadmin -webdomain ${ip} -webuser #### LinuxGSM Settings #### +## LinuxGSM Stats +# Send useful stats to LinuxGSM developers. +# https://docs.linuxgsm.com/configuration/linuxgsm-stats +# (on|off) +stats="off" + ## Notification Alerts # (on|off) diff --git a/lgsm/config-default/config-lgsm/nsserver/_default.cfg b/lgsm/config-default/config-lgsm/nsserver/_default.cfg index 53c323692..e72834f72 100644 --- a/lgsm/config-default/config-lgsm/nsserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/nsserver/_default.cfg @@ -22,6 +22,12 @@ parms="-game ns -strictportbind +ip ${ip} -port ${port} +clientport ${clientport #### LinuxGSM Settings #### +## LinuxGSM Stats +# Send useful stats to LinuxGSM developers. +# https://docs.linuxgsm.com/configuration/linuxgsm-stats +# (on|off) +stats="off" + ## Notification Alerts # (on|off) diff --git a/lgsm/config-default/config-lgsm/opforserver/_default.cfg b/lgsm/config-default/config-lgsm/opforserver/_default.cfg index 220650b97..687eb4de4 100644 --- a/lgsm/config-default/config-lgsm/opforserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/opforserver/_default.cfg @@ -22,6 +22,12 @@ parms="-game gearbox -strictportbind +ip ${ip} -port ${port} +clientport ${clien #### LinuxGSM Settings #### +## LinuxGSM Stats +# Send useful stats to LinuxGSM developers. +# https://docs.linuxgsm.com/configuration/linuxgsm-stats +# (on|off) +stats="off" + ## Notification Alerts # (on|off) diff --git a/lgsm/config-default/config-lgsm/pcserver/_default.cfg b/lgsm/config-default/config-lgsm/pcserver/_default.cfg index 2221e879f..e6e63d677 100644 --- a/lgsm/config-default/config-lgsm/pcserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/pcserver/_default.cfg @@ -15,6 +15,12 @@ parms="--config ${servercfg}" #### LinuxGSM Settings #### +## LinuxGSM Stats +# Send useful stats to LinuxGSM developers. +# https://docs.linuxgsm.com/configuration/linuxgsm-stats +# (on|off) +stats="off" + ## Notification Alerts # (on|off) diff --git a/lgsm/config-default/config-lgsm/pstbsserver/_default.cfg b/lgsm/config-default/config-lgsm/pstbsserver/_default.cfg index 839ac15a4..f9312a1cf 100644 --- a/lgsm/config-default/config-lgsm/pstbsserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/pstbsserver/_default.cfg @@ -24,6 +24,12 @@ parms="MULTIHOME=${ip}?RANDOM=${randommap}?Port=${port}?QueryPort=${queryport}?M #### LinuxGSM Settings #### +## LinuxGSM Stats +# Send useful stats to LinuxGSM developers. +# https://docs.linuxgsm.com/configuration/linuxgsm-stats +# (on|off) +stats="off" + ## Notification Alerts # (on|off) diff --git a/lgsm/config-default/config-lgsm/pvkiiserver/_default.cfg b/lgsm/config-default/config-lgsm/pvkiiserver/_default.cfg index d5fd2a1d9..2e668ad5f 100644 --- a/lgsm/config-default/config-lgsm/pvkiiserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/pvkiiserver/_default.cfg @@ -23,6 +23,12 @@ parms="-game pvkii -strictportbind -ip ${ip} -port ${port} +clientport ${clientp #### LinuxGSM Settings #### +## LinuxGSM Stats +# Send useful stats to LinuxGSM developers. +# https://docs.linuxgsm.com/configuration/linuxgsm-stats +# (on|off) +stats="off" + ## Notification Alerts # (on|off) diff --git a/lgsm/config-default/config-lgsm/pzserver/_default.cfg b/lgsm/config-default/config-lgsm/pzserver/_default.cfg index 7e0707d49..bd0002893 100644 --- a/lgsm/config-default/config-lgsm/pzserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/pzserver/_default.cfg @@ -18,6 +18,12 @@ parms="-ip ${ip} -adminpassword \"${adminpassword}\" -servername ${servicename}" #### LinuxGSM Settings #### +## LinuxGSM Stats +# Send useful stats to LinuxGSM developers. +# https://docs.linuxgsm.com/configuration/linuxgsm-stats +# (on|off) +stats="off" + ## Notification Alerts # (on|off) diff --git a/lgsm/config-default/config-lgsm/q2server/_default.cfg b/lgsm/config-default/config-lgsm/q2server/_default.cfg index 357ef116f..df37bc470 100644 --- a/lgsm/config-default/config-lgsm/q2server/_default.cfg +++ b/lgsm/config-default/config-lgsm/q2server/_default.cfg @@ -20,6 +20,12 @@ parms="+set dedicated 1 +set ip ${ip} +set port ${port} +exec ${servercfg} +set #### LinuxGSM Settings #### +## LinuxGSM Stats +# Send useful stats to LinuxGSM developers. +# https://docs.linuxgsm.com/configuration/linuxgsm-stats +# (on|off) +stats="off" + ## Notification Alerts # (on|off) diff --git a/lgsm/config-default/config-lgsm/q3server/_default.cfg b/lgsm/config-default/config-lgsm/q3server/_default.cfg index a1cacc938..5ba4134c0 100644 --- a/lgsm/config-default/config-lgsm/q3server/_default.cfg +++ b/lgsm/config-default/config-lgsm/q3server/_default.cfg @@ -20,6 +20,12 @@ parms="+set sv_punkbuster 0 +set fs_basepath ${serverfiles} +set dedicated 2 +se #### LinuxGSM Settings #### +## LinuxGSM Stats +# Send useful stats to LinuxGSM developers. +# https://docs.linuxgsm.com/configuration/linuxgsm-stats +# (on|off) +stats="off" + ## Notification Alerts # (on|off) diff --git a/lgsm/config-default/config-lgsm/qlserver/_default.cfg b/lgsm/config-default/config-lgsm/qlserver/_default.cfg index a6e0d5ea7..3e3c30f80 100644 --- a/lgsm/config-default/config-lgsm/qlserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/qlserver/_default.cfg @@ -17,6 +17,12 @@ parms="+exec ${servercfg}" #### LinuxGSM Settings #### +## LinuxGSM Stats +# Send useful stats to LinuxGSM developers. +# https://docs.linuxgsm.com/configuration/linuxgsm-stats +# (on|off) +stats="off" + ## Notification Alerts # (on|off) diff --git a/lgsm/config-default/config-lgsm/qwserver/_default.cfg b/lgsm/config-default/config-lgsm/qwserver/_default.cfg index bac15bd00..236ad0bb4 100644 --- a/lgsm/config-default/config-lgsm/qwserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/qwserver/_default.cfg @@ -19,6 +19,12 @@ parms="-port ${port} -game ktx +exec ${servercfg}" #### LinuxGSM Settings #### +## LinuxGSM Stats +# Send useful stats to LinuxGSM developers. +# https://docs.linuxgsm.com/configuration/linuxgsm-stats +# (on|off) +stats="off" + ## Notification Alerts # (on|off) diff --git a/lgsm/config-default/config-lgsm/ricochetserver/_default.cfg b/lgsm/config-default/config-lgsm/ricochetserver/_default.cfg index 3ee3f944d..0d6ef56cc 100644 --- a/lgsm/config-default/config-lgsm/ricochetserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/ricochetserver/_default.cfg @@ -22,6 +22,12 @@ parms="-game ricochet -strictportbind +ip ${ip} -port ${port} +clientport ${clie #### LinuxGSM Settings #### +## LinuxGSM Stats +# Send useful stats to LinuxGSM developers. +# https://docs.linuxgsm.com/configuration/linuxgsm-stats +# (on|off) +stats="off" + ## Notification Alerts # (on|off) diff --git a/lgsm/config-default/config-lgsm/roserver/_default.cfg b/lgsm/config-default/config-lgsm/roserver/_default.cfg index de2b51353..a13d199f5 100644 --- a/lgsm/config-default/config-lgsm/roserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/roserver/_default.cfg @@ -23,6 +23,12 @@ parms="server ${defaultmap}?game=ROGame.ROTeamGame?VACSecured=true -nohomedir in #### LinuxGSM Settings #### +## LinuxGSM Stats +# Send useful stats to LinuxGSM developers. +# https://docs.linuxgsm.com/configuration/linuxgsm-stats +# (on|off) +stats="off" + ## Notification Alerts # (on|off) diff --git a/lgsm/config-default/config-lgsm/rtcwserver/_default.cfg b/lgsm/config-default/config-lgsm/rtcwserver/_default.cfg index 27a0f3545..8ded966d0 100644 --- a/lgsm/config-default/config-lgsm/rtcwserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/rtcwserver/_default.cfg @@ -20,6 +20,12 @@ parms="+set sv_punkbuster 0 +set fs_basepath ${serverfiles} +set dedicated 1 +se #### LinuxGSM Settings #### +## LinuxGSM Stats +# Send useful stats to LinuxGSM developers. +# https://docs.linuxgsm.com/configuration/linuxgsm-stats +# (on|off) +stats="off" + ## Notification Alerts # (on|off) diff --git a/lgsm/config-default/config-lgsm/rustserver/_default.cfg b/lgsm/config-default/config-lgsm/rustserver/_default.cfg index 557ceda89..9f4448c29 100644 --- a/lgsm/config-default/config-lgsm/rustserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/rustserver/_default.cfg @@ -47,6 +47,12 @@ parms="-batchmode +server.ip ${ip} +server.port ${port} +server.tickrate ${tickr #### LinuxGSM Settings #### +## LinuxGSM Stats +# Send useful stats to LinuxGSM developers. +# https://docs.linuxgsm.com/configuration/linuxgsm-stats +# (on|off) +stats="off" + ## Notification Alerts # (on|off) diff --git a/lgsm/config-default/config-lgsm/rwserver/_default.cfg b/lgsm/config-default/config-lgsm/rwserver/_default.cfg index 872ec10e9..0e35395d0 100644 --- a/lgsm/config-default/config-lgsm/rwserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/rwserver/_default.cfg @@ -18,6 +18,12 @@ parms="" #### LinuxGSM Settings #### +## LinuxGSM Stats +# Send useful stats to LinuxGSM developers. +# https://docs.linuxgsm.com/configuration/linuxgsm-stats +# (on|off) +stats="off" + ## Notification Alerts # (on|off) diff --git a/lgsm/config-default/config-lgsm/sampserver/_default.cfg b/lgsm/config-default/config-lgsm/sampserver/_default.cfg index f6329dc11..1a56bf6ab 100644 --- a/lgsm/config-default/config-lgsm/sampserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/sampserver/_default.cfg @@ -19,6 +19,12 @@ parms="" #### LinuxGSM Settings #### +## LinuxGSM Stats +# Send useful stats to LinuxGSM developers. +# https://docs.linuxgsm.com/configuration/linuxgsm-stats +# (on|off) +stats="off" + ## Notification Alerts # (on|off) diff --git a/lgsm/config-default/config-lgsm/sbotsserver/_default.cfg b/lgsm/config-default/config-lgsm/sbotsserver/_default.cfg index 7a5846f9e..94acb175d 100644 --- a/lgsm/config-default/config-lgsm/sbotsserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/sbotsserver/_default.cfg @@ -23,6 +23,12 @@ parms="Port=${port}?QueryPort=${queryport} -startup_map ${defaultmap} -server_na #### LinuxGSM Settings #### +## LinuxGSM Stats +# Send useful stats to LinuxGSM developers. +# https://docs.linuxgsm.com/configuration/linuxgsm-stats +# (on|off) +stats="off" + ## Notification Alerts # (on|off) diff --git a/lgsm/config-default/config-lgsm/sbserver/_default.cfg b/lgsm/config-default/config-lgsm/sbserver/_default.cfg index 760d8cd78..61598be97 100644 --- a/lgsm/config-default/config-lgsm/sbserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/sbserver/_default.cfg @@ -22,6 +22,12 @@ parms="" #### LinuxGSM Settings #### +## LinuxGSM Stats +# Send useful stats to LinuxGSM developers. +# https://docs.linuxgsm.com/configuration/linuxgsm-stats +# (on|off) +stats="off" + ## Notification Alerts # (on|off) diff --git a/lgsm/config-default/config-lgsm/sdtdserver/_default.cfg b/lgsm/config-default/config-lgsm/sdtdserver/_default.cfg index a928e27e1..00eaf0fe4 100644 --- a/lgsm/config-default/config-lgsm/sdtdserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/sdtdserver/_default.cfg @@ -18,6 +18,12 @@ parms="-logfile ${gamelogdir}/output_log__$(date +%Y-%m-%d__%H-%M-%S).txt -quit #### LinuxGSM Settings #### +## LinuxGSM Stats +# Send useful stats to LinuxGSM developers. +# https://docs.linuxgsm.com/configuration/linuxgsm-stats +# (on|off) +stats="off" + ## Notification Alerts # (on|off) diff --git a/lgsm/config-default/config-lgsm/sfcserver/_default.cfg b/lgsm/config-default/config-lgsm/sfcserver/_default.cfg index 28db4adc4..798a23858 100644 --- a/lgsm/config-default/config-lgsm/sfcserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/sfcserver/_default.cfg @@ -23,6 +23,12 @@ parms="-game sfclassic -strictportbind -ip ${ip} -port ${port} +clientport ${cli #### LinuxGSM Settings #### +## LinuxGSM Stats +# Send useful stats to LinuxGSM developers. +# https://docs.linuxgsm.com/configuration/linuxgsm-stats +# (on|off) +stats="off" + ## Notification Alerts # (on|off) diff --git a/lgsm/config-default/config-lgsm/sof2server/_default.cfg b/lgsm/config-default/config-lgsm/sof2server/_default.cfg index d1a502d13..4fa965da1 100644 --- a/lgsm/config-default/config-lgsm/sof2server/_default.cfg +++ b/lgsm/config-default/config-lgsm/sof2server/_default.cfg @@ -20,6 +20,12 @@ parms="+set sv_punkbuster 0 +set dedicated 2 +set net_ip ${ip} +set net_port ${p #### LinuxGSM Settings #### +## LinuxGSM Stats +# Send useful stats to LinuxGSM developers. +# https://docs.linuxgsm.com/configuration/linuxgsm-stats +# (on|off) +stats="off" + ## Notification Alerts # (on|off) diff --git a/lgsm/config-default/config-lgsm/solserver/_default.cfg b/lgsm/config-default/config-lgsm/solserver/_default.cfg index 04b0e65a9..beab68507 100644 --- a/lgsm/config-default/config-lgsm/solserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/solserver/_default.cfg @@ -21,6 +21,12 @@ parms="-b ${ip} -p ${port} -l ${maxplayers} -m ${maplist} -c ${servercfg}" #### LinuxGSM Settings #### +## LinuxGSM Stats +# Send useful stats to LinuxGSM developers. +# https://docs.linuxgsm.com/configuration/linuxgsm-stats +# (on|off) +stats="off" + ## Notification Alerts # (on|off) diff --git a/lgsm/config-default/config-lgsm/squadserver/_default.cfg b/lgsm/config-default/config-lgsm/squadserver/_default.cfg index c4eaa7ae6..6c58cee6c 100644 --- a/lgsm/config-default/config-lgsm/squadserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/squadserver/_default.cfg @@ -20,6 +20,12 @@ parms="MULTIHOME=${ip} RANDOM=${randommap} Port=${port} QueryPort=${queryport}" #### LinuxGSM Settings #### +## LinuxGSM Stats +# Send useful stats to LinuxGSM developers. +# https://docs.linuxgsm.com/configuration/linuxgsm-stats +# (on|off) +stats="off" + ## Notification Alerts # (on|off) diff --git a/lgsm/config-default/config-lgsm/ss3server/_default.cfg b/lgsm/config-default/config-lgsm/ss3server/_default.cfg index daa01efea..f0bb3a55c 100644 --- a/lgsm/config-default/config-lgsm/ss3server/_default.cfg +++ b/lgsm/config-default/config-lgsm/ss3server/_default.cfg @@ -19,6 +19,12 @@ parms="+ip ${ip} +logfile ${gamelog} +exec ${servercfgfullpath}" #### LinuxGSM Settings #### +## LinuxGSM Stats +# Send useful stats to LinuxGSM developers. +# https://docs.linuxgsm.com/configuration/linuxgsm-stats +# (on|off) +stats="off" + ## Notification Alerts # (on|off) diff --git a/lgsm/config-default/config-lgsm/stserver/_default.cfg b/lgsm/config-default/config-lgsm/stserver/_default.cfg index 0e924c21d..4c990b3b2 100644 --- a/lgsm/config-default/config-lgsm/stserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/stserver/_default.cfg @@ -25,6 +25,12 @@ parms="-batchmode -nographics -autostart -gameport=${port} -updateport=${querypo #### LinuxGSM Settings #### +## LinuxGSM Stats +# Send useful stats to LinuxGSM developers. +# https://docs.linuxgsm.com/configuration/linuxgsm-stats +# (on|off) +stats="off" + ## Notification Alerts # (on|off) diff --git a/lgsm/config-default/config-lgsm/svenserver/_default.cfg b/lgsm/config-default/config-lgsm/svenserver/_default.cfg index 3d8071605..570af640f 100644 --- a/lgsm/config-default/config-lgsm/svenserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/svenserver/_default.cfg @@ -22,6 +22,12 @@ parms="-game svencoop -strictportbind +ip ${ip} -port ${port} +clientport ${clie #### LinuxGSM Settings #### +## LinuxGSM Stats +# Send useful stats to LinuxGSM developers. +# https://docs.linuxgsm.com/configuration/linuxgsm-stats +# (on|off) +stats="off" + ## Notification Alerts # (on|off) diff --git a/lgsm/config-default/config-lgsm/terrariaserver/_default.cfg b/lgsm/config-default/config-lgsm/terrariaserver/_default.cfg index 156dfb478..dccd03d65 100644 --- a/lgsm/config-default/config-lgsm/terrariaserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/terrariaserver/_default.cfg @@ -22,6 +22,12 @@ parms="-config ${servercfgfullpath}" #### LinuxGSM Settings #### +## LinuxGSM Stats +# Send useful stats to LinuxGSM developers. +# https://docs.linuxgsm.com/configuration/linuxgsm-stats +# (on|off) +stats="off" + ## Notification Alerts # (on|off) diff --git a/lgsm/config-default/config-lgsm/tf2server/_default.cfg b/lgsm/config-default/config-lgsm/tf2server/_default.cfg index 03bd33af7..a7ba38d99 100644 --- a/lgsm/config-default/config-lgsm/tf2server/_default.cfg +++ b/lgsm/config-default/config-lgsm/tf2server/_default.cfg @@ -28,6 +28,12 @@ parms="-game tf -strictportbind -ip ${ip} -port ${port} +clientport ${clientport #### LinuxGSM Settings #### +## LinuxGSM Stats +# Send useful stats to LinuxGSM developers. +# https://docs.linuxgsm.com/configuration/linuxgsm-stats +# (on|off) +stats="off" + ## Notification Alerts # (on|off) diff --git a/lgsm/config-default/config-lgsm/tfcserver/_default.cfg b/lgsm/config-default/config-lgsm/tfcserver/_default.cfg index caf42502a..0f8029e2c 100644 --- a/lgsm/config-default/config-lgsm/tfcserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/tfcserver/_default.cfg @@ -22,6 +22,12 @@ parms="-game tfc -strictportbind _ip ${ip} -port ${port} +clientport ${clientpor #### LinuxGSM Settings #### +## LinuxGSM Stats +# Send useful stats to LinuxGSM developers. +# https://docs.linuxgsm.com/configuration/linuxgsm-stats +# (on|off) +stats="off" + ## Notification Alerts # (on|off) diff --git a/lgsm/config-default/config-lgsm/ts3server/_default.cfg b/lgsm/config-default/config-lgsm/ts3server/_default.cfg index 4ad1321ed..57a421e22 100644 --- a/lgsm/config-default/config-lgsm/ts3server/_default.cfg +++ b/lgsm/config-default/config-lgsm/ts3server/_default.cfg @@ -6,16 +6,24 @@ # common.cfg - applies settings to every instance. # [instance].cfg - applies settings to a specific instance. +#### Server Settings #### + ## Server Start Settings | https://docs.linuxgsm.com/configuration/start-parameters # Edit serverfiles/ts3server.ini after installation -#### LinuxGSM Settings #### - ## Server Start Command | https://docs.linuxgsm.com/configuration/start-parameters#additional-parameters fn_parms(){ parms="inifile=${servercfgfullpath} pid_file=ts3server.pid" } +#### LinuxGSM Settings #### + +## LinuxGSM Stats +# Send useful stats to LinuxGSM developers. +# https://docs.linuxgsm.com/configuration/linuxgsm-stats +# (on|off) +stats="off" + ## Notification Alerts # (on|off) diff --git a/lgsm/config-default/config-lgsm/tsserver/_default.cfg b/lgsm/config-default/config-lgsm/tsserver/_default.cfg index 3a2941ed1..2ef118a13 100644 --- a/lgsm/config-default/config-lgsm/tsserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/tsserver/_default.cfg @@ -22,6 +22,12 @@ parms="-game ts -strictportbind +ip ${ip} -port ${port} +clientport ${clientport #### LinuxGSM Settings #### +## LinuxGSM Stats +# Send useful stats to LinuxGSM developers. +# https://docs.linuxgsm.com/configuration/linuxgsm-stats +# (on|off) +stats="off" + ## Notification Alerts # (on|off) diff --git a/lgsm/config-default/config-lgsm/tuserver/_default.cfg b/lgsm/config-default/config-lgsm/tuserver/_default.cfg index 4e34037d5..ac13bdf46 100644 --- a/lgsm/config-default/config-lgsm/tuserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/tuserver/_default.cfg @@ -25,6 +25,12 @@ parms="-log -MultiHome=${ip} -Port=${port} -QueryPort=${queryport} -TowerServerI #### LinuxGSM Settings #### +## LinuxGSM Stats +# Send useful stats to LinuxGSM developers. +# https://docs.linuxgsm.com/configuration/linuxgsm-stats +# (on|off) +stats="off" + ## Notification Alerts # (on|off) diff --git a/lgsm/config-default/config-lgsm/twserver/_default.cfg b/lgsm/config-default/config-lgsm/twserver/_default.cfg index 5418c2edd..b0d082566 100644 --- a/lgsm/config-default/config-lgsm/twserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/twserver/_default.cfg @@ -22,6 +22,12 @@ parms="-f ${servercfg}" #### LinuxGSM Settings #### +## LinuxGSM Stats +# Send useful stats to LinuxGSM developers. +# https://docs.linuxgsm.com/configuration/linuxgsm-stats +# (on|off) +stats="off" + ## Notification Alerts # (on|off) diff --git a/lgsm/config-default/config-lgsm/untserver/_default.cfg b/lgsm/config-default/config-lgsm/untserver/_default.cfg index 706760db8..b4fc532de 100644 --- a/lgsm/config-default/config-lgsm/untserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/untserver/_default.cfg @@ -25,6 +25,12 @@ parms="-port:${port} -players:${maxplayers} --nographics -${defaultmap} -batchmo #### LinuxGSM Settings #### +## LinuxGSM Stats +# Send useful stats to LinuxGSM developers. +# https://docs.linuxgsm.com/configuration/linuxgsm-stats +# (on|off) +stats="off" + ## Notification Alerts # (on|off) diff --git a/lgsm/config-default/config-lgsm/ut2k4server/_default.cfg b/lgsm/config-default/config-lgsm/ut2k4server/_default.cfg index 4defaefa0..d288c985a 100644 --- a/lgsm/config-default/config-lgsm/ut2k4server/_default.cfg +++ b/lgsm/config-default/config-lgsm/ut2k4server/_default.cfg @@ -19,6 +19,12 @@ parms="server ${defaultmap}?game=XGame.xDeathMatch -nohomedir ini=${servercfg} l #### LinuxGSM Settings #### +## LinuxGSM Stats +# Send useful stats to LinuxGSM developers. +# https://docs.linuxgsm.com/configuration/linuxgsm-stats +# (on|off) +stats="off" + ## Notification Alerts # (on|off) diff --git a/lgsm/config-default/config-lgsm/ut3server/_default.cfg b/lgsm/config-default/config-lgsm/ut3server/_default.cfg index c7a6423f9..831e41699 100644 --- a/lgsm/config-default/config-lgsm/ut3server/_default.cfg +++ b/lgsm/config-default/config-lgsm/ut3server/_default.cfg @@ -30,6 +30,12 @@ parms="server ${defaultmap}?Game=${game}?bIsDedicated=${isdedicated}?bIsLanMatch #### LinuxGSM Settings #### +## LinuxGSM Stats +# Send useful stats to LinuxGSM developers. +# https://docs.linuxgsm.com/configuration/linuxgsm-stats +# (on|off) +stats="off" + ## Notification Alerts # (on|off) diff --git a/lgsm/config-default/config-lgsm/ut99server/_default.cfg b/lgsm/config-default/config-lgsm/ut99server/_default.cfg index eebd4740f..be962bd5f 100644 --- a/lgsm/config-default/config-lgsm/ut99server/_default.cfg +++ b/lgsm/config-default/config-lgsm/ut99server/_default.cfg @@ -19,6 +19,12 @@ parms="server ${defaultmap}.unr ini=${servercfgfullpath}" #### LinuxGSM Settings #### +## LinuxGSM Stats +# Send useful stats to LinuxGSM developers. +# https://docs.linuxgsm.com/configuration/linuxgsm-stats +# (on|off) +stats="off" + ## Notification Alerts # (on|off) diff --git a/lgsm/config-default/config-lgsm/utserver/_default.cfg b/lgsm/config-default/config-lgsm/utserver/_default.cfg index 2e691be36..93da95e79 100644 --- a/lgsm/config-default/config-lgsm/utserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/utserver/_default.cfg @@ -23,6 +23,12 @@ parms="UnrealTournament ${defaultmap}?Game=${gametype}?TimeLimit=${timelimit} -p #### LinuxGSM Settings #### +## LinuxGSM Stats +# Send useful stats to LinuxGSM developers. +# https://docs.linuxgsm.com/configuration/linuxgsm-stats +# (on|off) +stats="off" + ## Notification Alerts # (on|off) diff --git a/lgsm/config-default/config-lgsm/vsserver/_default.cfg b/lgsm/config-default/config-lgsm/vsserver/_default.cfg index e28b48862..5c8d7be3f 100644 --- a/lgsm/config-default/config-lgsm/vsserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/vsserver/_default.cfg @@ -22,6 +22,12 @@ parms="-game vs -strictportbind +ip ${ip} -port ${port} +clientport ${clientport #### LinuxGSM Settings #### +## LinuxGSM Stats +# Send useful stats to LinuxGSM developers. +# https://docs.linuxgsm.com/configuration/linuxgsm-stats +# (on|off) +stats="off" + ## Notification Alerts # (on|off) diff --git a/lgsm/config-default/config-lgsm/wetserver/_default.cfg b/lgsm/config-default/config-lgsm/wetserver/_default.cfg index 732ea5c90..1be0a0eeb 100644 --- a/lgsm/config-default/config-lgsm/wetserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/wetserver/_default.cfg @@ -15,6 +15,12 @@ fn_parms(){ #### LinuxGSM Settings #### +## LinuxGSM Stats +# Send useful stats to LinuxGSM developers. +# https://docs.linuxgsm.com/configuration/linuxgsm-stats +# (on|off) +stats="off" + ## Notification Alerts # (on|off) diff --git a/lgsm/config-default/config-lgsm/wfserver/_default.cfg b/lgsm/config-default/config-lgsm/wfserver/_default.cfg index 4789bbc3a..76711d429 100644 --- a/lgsm/config-default/config-lgsm/wfserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/wfserver/_default.cfg @@ -20,6 +20,12 @@ parms="+exec ${servercfg} +sv_http_ip ${ip} +set sv_http_port ${httpport} +sv_ip #### LinuxGSM Settings #### +## LinuxGSM Stats +# Send useful stats to LinuxGSM developers. +# https://docs.linuxgsm.com/configuration/linuxgsm-stats +# (on|off) +stats="off" + ## Notification Alerts # (on|off) diff --git a/lgsm/config-default/config-lgsm/wurmserver/_default.cfg b/lgsm/config-default/config-lgsm/wurmserver/_default.cfg index 30869ccf3..ccb18181b 100644 --- a/lgsm/config-default/config-lgsm/wurmserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/wurmserver/_default.cfg @@ -17,6 +17,12 @@ fn_parms(){ #### LinuxGSM Settings #### +## LinuxGSM Stats +# Send useful stats to LinuxGSM developers. +# https://docs.linuxgsm.com/configuration/linuxgsm-stats +# (on|off) +stats="off" + ## Notification Alerts # (on|off) diff --git a/lgsm/config-default/config-lgsm/zmrserver/_default.cfg b/lgsm/config-default/config-lgsm/zmrserver/_default.cfg index f1c943f6c..a5f1f83f0 100644 --- a/lgsm/config-default/config-lgsm/zmrserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/zmrserver/_default.cfg @@ -23,6 +23,12 @@ parms="-game zombie_master_reborn -strictportbind -ip ${ip} -port ${port} +clien #### LinuxGSM Settings #### +## LinuxGSM Stats +# Send useful stats to LinuxGSM developers. +# https://docs.linuxgsm.com/configuration/linuxgsm-stats +# (on|off) +stats="off" + ## Notification Alerts # (on|off) diff --git a/lgsm/config-default/config-lgsm/zpsserver/_default.cfg b/lgsm/config-default/config-lgsm/zpsserver/_default.cfg index 300f42338..61991f3b8 100644 --- a/lgsm/config-default/config-lgsm/zpsserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/zpsserver/_default.cfg @@ -28,6 +28,12 @@ parms="-game zps -strictportbind -ip ${ip} -port ${port} +clientport ${clientpor #### LinuxGSM Settings #### +## LinuxGSM Stats +# Send useful stats to LinuxGSM developers. +# https://docs.linuxgsm.com/configuration/linuxgsm-stats +# (on|off) +stats="off" + ## Notification Alerts # (on|off) diff --git a/lgsm/functions/command_install.sh b/lgsm/functions/command_install.sh index 2bc534d69..4be296cfe 100644 --- a/lgsm/functions/command_install.sh +++ b/lgsm/functions/command_install.sh @@ -45,6 +45,7 @@ else fi fix.sh + install_stats.sh install_complete.sh core_exit.sh fi diff --git a/lgsm/functions/command_monitor.sh b/lgsm/functions/command_monitor.sh index 9cbe30069..2e25177f7 100644 --- a/lgsm/functions/command_monitor.sh +++ b/lgsm/functions/command_monitor.sh @@ -188,6 +188,10 @@ logs.sh info_config.sh info_parms.sh +if [ "${stats}" == "on" ]; then + info_stats.sh +fi + fn_monitor_check_lockfile fn_monitor_check_update fn_monitor_check_session diff --git a/lgsm/functions/core_functions.sh b/lgsm/functions/core_functions.sh index f4c973800..fcec931a8 100644 --- a/lgsm/functions/core_functions.sh +++ b/lgsm/functions/core_functions.sh @@ -428,6 +428,11 @@ fn_fetch_function # Info +info_stats.sh(){ +functionfile="${FUNCNAME}" +fn_fetch_function +} + info_config.sh(){ functionfile="${FUNCNAME}" fn_fetch_function @@ -633,6 +638,11 @@ functionfile="${FUNCNAME}" fn_fetch_function } +install_stats.sh(){ +functionfile="${FUNCNAME}" +fn_fetch_function +} + install_steamcmd.sh(){ functionfile="${FUNCNAME}" fn_fetch_function diff --git a/lgsm/functions/info_distro.sh b/lgsm/functions/info_distro.sh index 1da562cff..c20801e9b 100644 --- a/lgsm/functions/info_distro.sh +++ b/lgsm/functions/info_distro.sh @@ -96,17 +96,18 @@ load=$(uptime|awk -F 'load average: ' '{ print $2 }') ## CPU information cpumodel=$(awk -F: '/model name/ {name=$2} END {print name}' /proc/cpuinfo | sed 's/^[ \t]*//;s/[ \t]*$//') cpucores=$(awk -F: '/model name/ {core++} END {print core}' /proc/cpuinfo) -cpufreqency=$(awk -F: ' /cpu MHz/ {freq=$2} END {print freq " MHz"}' /proc/cpuinfo | sed 's/^[ \t]*//;s/[ \t]*$//') +cpufreqency=$(awk -F: '/cpu MHz/ {freq=$2} END {print freq}' /proc/cpuinfo | sed 's/^[ \t]*//;s/[ \t]*$//') # CPU usage of the game server pid if [ "${gameserverpid}" ]; then cpuused=$(ps --forest -o pcpu -g "${gameserverpid}"|awk '{s+=$1} END {print s}') + cpuusedmhz=$(echo "${cpufreqency} * ${cpuused} / 100" | bc ) fi ## Memory information # Available RAM and swap. # Newer distros can use numfmt to give more accurate results. -if [ -n "$(command -v numfmt 2>/dev/null)" ]; then +if [ "$(command -v numfmt 2>/dev/null)" ]; then # Issue #2005 - Kernel 3.14+ contains MemAvailable which should be used. All others will be calculated. # get the raw KB values of these fields. @@ -137,7 +138,7 @@ if [ -n "$(command -v numfmt 2>/dev/null)" ]; then # RAM usage of the game server pid # MB if [ "${gameserverpid}" ]; then - memused=$(ps --forest -o rss -g "${gameserverpid}" | awk '{s+=$1} END {print s}'| awk '{$1/=1024;printf "%.0fMB\t",$1}{print $2}') + memused=$(ps --forest -o rss -g "${gameserverpid}" | awk '{s+=$1} END {print s}'| awk '{$1/=1024;printf "%.0f",$1}{print $2}') # % pmemused=$(ps --forest -o %mem -g "${gameserverpid}" | awk '{s+=$1} END {print s}') fi diff --git a/lgsm/functions/info_messages.sh b/lgsm/functions/info_messages.sh index 63deff33f..bca3c5586 100644 --- a/lgsm/functions/info_messages.sh +++ b/lgsm/functions/info_messages.sh @@ -84,7 +84,7 @@ fn_info_message_server_resource(){ echo -e "${lightyellow}CPU\t${default}" echo -e "${lightblue}Model:\t${default}${cpumodel}" echo -e "${lightblue}Cores:\t${default}${cpucores}" - echo -e "${lightblue}Frequency:\t${default}${cpufreqency}" + echo -e "${lightblue}Frequency:\t${default}${cpufreqency}MHz" echo -e "${lightblue}Avg Load:\t${default}${load}" } | column -s $'\t' -t echo -e "" @@ -135,7 +135,7 @@ fn_info_message_gameserver_resource(){ { if [ "${status}" == "1" ]; then echo -e "${lightblue}CPU Used:\t${default}${cpuused}%${default}" - echo -e "${lightblue}Mem Used:\t${default}${pmemused}%\t${memused}${default}" + echo -e "${lightblue}Mem Used:\t${default}${pmemused}%\t${memused}MB${default}" else echo -e "${lightblue}CPU Used:\t${default}0%${default}" echo -e "${lightblue}Mem Used:\t${default}0%\t0MB${default}" diff --git a/lgsm/functions/info_stats.sh b/lgsm/functions/info_stats.sh new file mode 100644 index 000000000..a222bc40d --- /dev/null +++ b/lgsm/functions/info_stats.sh @@ -0,0 +1,74 @@ +#!/bin/bash +# LinuxGSM info_stats.sh function +# Author: Daniel Gibbs +# Website: https://linuxgsm.com +# Description: Optional Stats to send to LinuxGSM Developer +# Uses Google analytics + +info_distro.sh +# generate uuid +if [ ! -f "${datadir}/uuid.txt" ];then + mkdir -p "${datadir}" + touch "${datadir}/uuid.txt" + if [ "$(command -v uuidgen 2>/dev/null)" ]; then + uuidgen > "${datadir}/uuid.txt" + else + cat /proc/sys/kernel/random/uuid > "${datadir}/uuid.txt" + fi +fi + +uuid=$(cat "${datadir}/uuid.txt") +# results are rounded up to reduce number of different results in analytics +# nearest 100Mhz +cpuusedmhzroundup=$(((${cpuusedmhz} + 99) / 100 * 100)) +# nearest 100MB +memusedroundup=$(((${memused} + 99) / 100 * 100)) + +# https://developers.google.com/analytics/devguides/collection/protocol/v1/parameters + +# Level 1 Stats +## Distro +curl https://www.google-analytics.com/collect -d "tid=UA-655379-31" -d "aip=1" -d "cid=${uuid}" -d "t=event" -d "ec=distro" -d "ea=${gamename}" -d "el=${distroname}" -d "v=1" > /dev/null 2>&1 +## Game Server Name +curl https://www.google-analytics.com/collect -d "tid=UA-655379-31" -d "aip=1" -d "cid=${uuid}" -d "t=event" -d "ec=game" -d "ea=${gamename}" -d "el=${gamename}" -d "v=1" > /dev/null 2>&1 + +# Level 2 Stats +## CPU usage of a game server +if [ "${cpuusedmhzroundup}" ]; then + curl https://www.google-analytics.com/collect -d "tid=UA-655379-31" -d "aip=1" -d "cid=${uuid}" -d "t=event" -d "ec=cpuused" -d "ea=${gamename}" -d "el=${cpuusedmhzroundup}MHz" -d "v=1" > /dev/null 2>&1 +fi +## Ram usage of a game server +if [ "${memusedroundup}" ]; then + curl https://www.google-analytics.com/collect -d "tid=UA-655379-31" -d "aip=1" -d "cid=${uuid}" -d "t=event" -d "ec=ramused" -d "ea=${gamename}" -d "el=${memusedroundup}MB" -d "v=1" > /dev/null 2>&1 +fi +## Disk usage of a game server +if [ "${serverfilesdu}" ]; then + curl https://www.google-analytics.com/collect -d "tid=UA-655379-31" -d "aip=1" -d "cid=${uuid}" -d "t=event" -d "ec=diskused" -d "ea=${gamename}" -d "el=${serverfilesdu}" -d "v=1" > /dev/null 2>&1 +fi + +# Level 3 Stats +## CPU Model +if [ "${cpumodel}" ]; then + curl https://www.google-analytics.com/collect -d "tid=UA-655379-31" -d "aip=1" -d "cid=${uuid}" -d "t=event" -d "ec=servercpu" -d "ea=${gamename}" -d "el=${cpumodel} cores:${cpucores}" -d "v=1" > /dev/null 2>&1 +fi + +## Server RAM +if [ "${physmemtotal}" ]; then + curl https://www.google-analytics.com/collect -d "tid=UA-655379-31" -d "aip=1" -d "cid=${uuid}" -d "t=event" -d "ec=serverram" -d "ea=${gamename}" -d "el=${physmemtotal}" -d "v=1" > /dev/null 2>&1 +fi + +## Server Disk +if [ "${totalspace}" ]; then + curl https://www.google-analytics.com/collect -d "tid=UA-655379-31" -d "aip=1" -d "cid=${uuid}" -d "t=event" -d "ec=serverdisk" -d "ea=${gamename}" -d "el=${totalspace}" -d "v=1" > /dev/null 2>&1 +fi + +fn_script_log_info "Send LinuxGSM stats" +fn_script_log_info "* UUID: ${uuid}" +fn_script_log_info "* Game Name: ${gamename}" +fn_script_log_info "* Distro Name: ${distroname}" +fn_script_log_info "* Game Server CPU Used: ${cpuusedmhzroundup}MHz" +fn_script_log_info "* Game Server RAM Used: ${memusedroundup}MB" +fn_script_log_info "* Game Server Disk Used: ${serverfilesdu}" +fn_script_log_info "* Server CPU Model: ${cpumodel}" +fn_script_log_info "* Server RAM: ${physmemtotal}" +fn_script_log_info "* Server Disk: ${totalspace}" diff --git a/lgsm/functions/install_stats.sh b/lgsm/functions/install_stats.sh new file mode 100644 index 000000000..8bee61c96 --- /dev/null +++ b/lgsm/functions/install_stats.sh @@ -0,0 +1,29 @@ +#!/bin/bash +# LinuxGSM install_stats.sh function +# Author: Daniel Gibbs +# Website: https://linuxgsm.com +# Description: Enabled LinuxGSM Stats. + +local commandname="INSTALL" +local commandaction="Install" +local function_selfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" + +echo -e "" +echo -e "${lightyellow}LinuxGSM Stats${default}" +echo -e "=================================" +fn_sleep_time +echo -e "Assist LinuxGSM development by sending anonymous stats to developers." +echo -e "More info: https://docs.linuxgsm.com/configuration/linuxgsm-stats" +echo -e "The following info will be sent:" +echo -e "* game server" +echo -e "* distro" +echo -e "* game server resource usage" +echo -e "* server hardware info" +if [ -z "${autoinstall}" ]; then + if fn_prompt_yn "Allow anonymous usage statistics?" Y; then + echo "stats=\"y\"" >> "${configdirserver}/common.cfg" + fn_print_information_nl "Stats setting is now enabled in common.cfg." + fi +else + fn_print_information_nl "auto-install leaves stats off by default. Stats can be enabled in common.cfg" +fi From a6552a761e338bebac6a629a061d5de3dae8ebef Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Fri, 15 Nov 2019 17:58:08 +0000 Subject: [PATCH 230/534] added stats --- tests/tests_defaultcfg/defaultcfg_0.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/tests/tests_defaultcfg/defaultcfg_0.txt b/tests/tests_defaultcfg/defaultcfg_0.txt index 82b9b5ca2..ac95a5715 100644 --- a/tests/tests_defaultcfg/defaultcfg_0.txt +++ b/tests/tests_defaultcfg/defaultcfg_0.txt @@ -1,3 +1,4 @@ +stats displayip postalert postdays From 772109a0de3fae9b68ce3a7f502f9f954e73008b Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Fri, 15 Nov 2019 17:59:16 +0000 Subject: [PATCH 231/534] feat(travis): update distro to ubuntu 18.04 bionic (#2587) --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index 78dea169d..bb94b8033 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,5 +1,5 @@ language: node_js -dist: xenial +dist: bionic node_js: - 10 From 264b8200f239f29cd325984c6e2e0d6e192377c7 Mon Sep 17 00:00:00 2001 From: Levi Figueira Date: Mon, 18 Nov 2019 15:21:00 +0000 Subject: [PATCH 232/534] fix(alert): fixed typo in config change alert (#2596) --- lgsm/functions/alert.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lgsm/functions/alert.sh b/lgsm/functions/alert.sh index 8de6b370e..510e47341 100644 --- a/lgsm/functions/alert.sh +++ b/lgsm/functions/alert.sh @@ -76,7 +76,7 @@ fn_alert_config(){ alertemoji="🎮" alertsound="1" alerturl="not enabled" - alertbody="${servicename} has recieved a new _default.cfg. Check file for changes." + alertbody="${servicename} has received a new _default.cfg. Check file for changes." } if [ "${alert}" == "permissions" ]; then @@ -200,4 +200,4 @@ elif [ -z "${slacktoken}" ]&&[ "${function_selfname}" == "command_test_alert.sh" fn_print_error_nl "Slack token not set" echo -e " * https://docs.linuxgsm.com/alerts/slack" fn_script_error "Slack token not set" -fi \ No newline at end of file +fi From 87a3570141611c43317de608cdeeebb9c4884553 Mon Sep 17 00:00:00 2001 From: Frisasky Date: Fri, 22 Nov 2019 18:55:34 +0800 Subject: [PATCH 233/534] feat(mod): Update sourcemod to 1.10 --- 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 19ce5abb0..cfb7fee59 100644 --- a/lgsm/functions/mods_list.sh +++ b/lgsm/functions/mods_list.sh @@ -21,7 +21,7 @@ metamodlatestfile="$(wget "${metamodscrapeurl}" -q -O -)" metamoddownloadurl="https://www.metamodsource.net/latest.php?os=linux&version=${metamodmversion}" metamodurl="${metamoddownloadurl}" # Sourcemod -sourcemodmversion="1.9" +sourcemodmversion="1.10" sourcemodscrapeurl="https://sm.alliedmods.net/smdrop/${sourcemodmversion}/sourcemod-latest-linux" sourcemodlatestfile="$(wget "${sourcemodscrapeurl}" -q -O -)" sourcemoddownloadurl="https://www.sourcemod.net/latest.php?os=linux&version=${sourcemodmversion}" From 56583d2f24634837ad6bcab26ff10ee5ddc0c4c6 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Fri, 22 Nov 2019 22:33:30 +0000 Subject: [PATCH 234/534] fix(install): use http instead of https to improve distro compatability (#2608) --- lgsm/functions/install_server_files.sh | 50 +++++++++++++------------- 1 file changed, 25 insertions(+), 25 deletions(-) diff --git a/lgsm/functions/install_server_files.sh b/lgsm/functions/install_server_files.sh index 87161b04b..07b3241d5 100644 --- a/lgsm/functions/install_server_files.sh +++ b/lgsm/functions/install_server_files.sh @@ -10,61 +10,61 @@ local function_selfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" fn_install_server_files(){ if [ "${shortname}" == "ahl" ]; then - remote_fileurl="https://files.linuxgsm.com/ActionHalfLife/action_halflife-1.0.tar.bz2"; local_filedir="${tmpdir}"; local_filename="action_halflife-1.0.tar.bz2"; chmodx="nochmodx" run="norun"; force="noforce"; md5="31430e670692b2eeaa0d1217db4dcb73" + remote_fileurl="http://files.linuxgsm.com/ActionHalfLife/action_halflife-1.0.tar.bz2"; local_filedir="${tmpdir}"; local_filename="action_halflife-1.0.tar.bz2"; chmodx="nochmodx" run="norun"; force="noforce"; md5="31430e670692b2eeaa0d1217db4dcb73" elif [ "${shortname}" == "bf1942" ]; then - remote_fileurl="https://files.linuxgsm.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" + remote_fileurl="http://files.linuxgsm.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 [ "${shortname}" == "bb" ]; then - remote_fileurl="https://files.linuxgsm.com/BrainBread/brainbread-v1.2-linuxserver.tar.bz2"; local_filedir="${tmpdir}"; local_filename="brainbread-v1.2-linuxserver.tar.bz2"; chmodx="nochmodx" run="norun"; force="noforce"; md5="5c729a7e9eecfa81b71a6a1f7267f0fd" + remote_fileurl="http://files.linuxgsm.com/BrainBread/brainbread-v1.2-linuxserver.tar.bz2"; local_filedir="${tmpdir}"; local_filename="brainbread-v1.2-linuxserver.tar.bz2"; chmodx="nochmodx" run="norun"; force="noforce"; md5="5c729a7e9eecfa81b71a6a1f7267f0fd" elif [ "${shortname}" == "cod" ]; then - remote_fileurl="https://files.linuxgsm.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" + remote_fileurl="http://files.linuxgsm.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 [ "${shortname}" == "coduo" ]; then - remote_fileurl="https://files.linuxgsm.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" + remote_fileurl="http://files.linuxgsm.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 [ "${shortname}" == "cod2" ]; then - remote_fileurl="https://files.linuxgsm.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" + remote_fileurl="http://files.linuxgsm.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 [ "${shortname}" == "cod4" ]; then - remote_fileurl="https://files.linuxgsm.com/CallOfDuty4/cod4x18_1772_dedrun.tar.bz2"; local_filedir="${tmpdir}"; local_filename="cod4x18_1772_dedrun.tar.bz2"; chmodx="nochmodx" run="norun"; force="noforce"; md5="de29f29d79f9cc24574b838daa501e46" + remote_fileurl="http://files.linuxgsm.com/CallOfDuty4/cod4x18_1772_dedrun.tar.bz2"; local_filedir="${tmpdir}"; local_filename="cod4x18_1772_dedrun.tar.bz2"; chmodx="nochmodx" run="norun"; force="noforce"; md5="de29f29d79f9cc24574b838daa501e46" elif [ "${shortname}" == "codwaw" ]; then - remote_fileurl="https://files.linuxgsm.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" + remote_fileurl="http://files.linuxgsm.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 [ "${shortname}" == "etl" ]; then - remote_fileurl="https://files.linuxgsm.com/WolfensteinEnemyTerritory/etlegacy-v2.75-i386-et-260b.tar.bz2"; local_filedir="${tmpdir}"; local_filename="etlegacy-v2.75-i386-et-260b.tar.bz2"; chmodx="nochmodx" run="norun"; force="noforce"; md5="92d7d4c26e0a295daed78cef623eeabb" + remote_fileurl="http://files.linuxgsm.com/WolfensteinEnemyTerritory/etlegacy-v2.75-i386-et-260b.tar.bz2"; local_filedir="${tmpdir}"; local_filename="etlegacy-v2.75-i386-et-260b.tar.bz2"; chmodx="nochmodx" run="norun"; force="noforce"; md5="92d7d4c26e0a295daed78cef623eeabb" elif [ "${shortname}" == "ges" ]; then - remote_fileurl="https://files.linuxgsm.com/GoldenEyeSource/GoldenEye_Source_v5.0.6_full_server.tar.bz2"; local_filedir="${tmpdir}"; local_filename="GoldenEye_Source_v5.0.6_full_server.tar.bz2"; chmodx="nochmodx" run="norun"; force="noforce"; md5="c45c16293096706e8b5e2cd64a6f2931" + remote_fileurl="http://files.linuxgsm.com/GoldenEyeSource/GoldenEye_Source_v5.0.6_full_server.tar.bz2"; local_filedir="${tmpdir}"; local_filename="GoldenEye_Source_v5.0.6_full_server.tar.bz2"; chmodx="nochmodx" run="norun"; force="noforce"; md5="c45c16293096706e8b5e2cd64a6f2931" elif [ "${shortname}" == "mohaa" ]; then - remote_fileurl="https://files.linuxgsm.com/MedalofHonorAlliedAssault/moh_revival_v1.12_RC3.5.1.tar.bz2"; local_filedir="${tmpdir}"; local_filename="moh_revival_v1.12_RC3.5.1.tar.bz2"; chmodx="nochmodx" run="norun"; force="noforce"; md5="9d5924486a0cf5e46dd063216aad05c1" + remote_fileurl="http://files.linuxgsm.com/MedalofHonorAlliedAssault/moh_revival_v1.12_RC3.5.1.tar.bz2"; local_filedir="${tmpdir}"; local_filename="moh_revival_v1.12_RC3.5.1.tar.bz2"; chmodx="nochmodx" run="norun"; force="noforce"; md5="9d5924486a0cf5e46dd063216aad05c1" elif [ "${shortname}" == "ns" ]; then - remote_fileurl="https://files.linuxgsm.com/NaturalSelection/ns_dedicated_server_v32.tar.bz2"; local_filedir="${tmpdir}"; local_filename="ns_dedicated_server_v32.tar.bz2"; chmodx="nochmodx" run="norun"; force="noforce"; md5="499cf63324b76925ada6baf5f2eacd67" + remote_fileurl="http://files.linuxgsm.com/NaturalSelection/ns_dedicated_server_v32.tar.bz2"; local_filedir="${tmpdir}"; local_filename="ns_dedicated_server_v32.tar.bz2"; chmodx="nochmodx" run="norun"; force="noforce"; md5="499cf63324b76925ada6baf5f2eacd67" elif [ "${shortname}" == "q2" ]; then - remote_fileurl="https://files.linuxgsm.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" + remote_fileurl="http://files.linuxgsm.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 [ "${shortname}" == "q3" ]; then - remote_fileurl="https://files.linuxgsm.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" + remote_fileurl="http://files.linuxgsm.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 [ "${shortname}" == "qw" ]; then - remote_fileurl="https://files.linuxgsm.com/QuakeWorld/nquake.server.linux.190506.full.tar.bz2"; local_filedir="${tmpdir}"; local_filename="nquake.server.linux.190506.full.tar.bz2"; chmodx="nochmodx" run="norun"; force="noforce"; md5="74405ec030463c5e1175e776ab572d32" + remote_fileurl="http://files.linuxgsm.com/QuakeWorld/nquake.server.linux.190506.full.tar.bz2"; local_filedir="${tmpdir}"; local_filename="nquake.server.linux.190506.full.tar.bz2"; chmodx="nochmodx" run="norun"; force="noforce"; md5="74405ec030463c5e1175e776ab572d32" elif [ "${shortname}" == "rtcw" ]; then - remote_fileurl="https://files.linuxgsm.com/ReturnToCastleWolfenstein/iortcw-1.51c-x86_64-server-linux-20190507.tar.bz2"; local_filedir="${tmpdir}"; local_filename="iortcw-1.51c-x86_64-server-linux-20190507.tar.bz2"; chmodx="nochmodx" run="norun"; force="noforce"; md5="6a3be9700372b228d1187422464e4212" + remote_fileurl="http://files.linuxgsm.com/ReturnToCastleWolfenstein/iortcw-1.51c-x86_64-server-linux-20190507.tar.bz2"; local_filedir="${tmpdir}"; local_filename="iortcw-1.51c-x86_64-server-linux-20190507.tar.bz2"; chmodx="nochmodx" run="norun"; force="noforce"; md5="6a3be9700372b228d1187422464e4212" elif [ "${shortname}" == "sfc" ]; then - remote_fileurl="https://files.linuxgsm.com/SourceFortsClassic/SFClassic-1.0-RC7-fix.tar.bz2"; local_filedir="${tmpdir}"; local_filename="SFClassic-1.0-RC7-fix.tar.bz2"; chmodx="nochmodx" run="norun"; force="noforce"; md5="e0d4cfd298a8a356053f92b1fa7d1002" + remote_fileurl="http://files.linuxgsm.com/SourceFortsClassic/SFClassic-1.0-RC7-fix.tar.bz2"; local_filedir="${tmpdir}"; local_filename="SFClassic-1.0-RC7-fix.tar.bz2"; chmodx="nochmodx" run="norun"; force="noforce"; md5="e0d4cfd298a8a356053f92b1fa7d1002" elif [ "${shortname}" == "sof2" ]; then - remote_fileurl="https://files.linuxgsm.com/SoldierOfFortune2/sof2gold-1.03.tar.bz2"; local_filedir="${tmpdir}"; local_filename="sof2gold-1.03.tar.bz2"; chmodx="nochmodx" run="norun"; force="noforce"; md5="871b1dc0dafeeace65b198119e8fa200" + remote_fileurl="http://files.linuxgsm.com/SoldierOfFortune2/sof2gold-1.03.tar.bz2"; local_filedir="${tmpdir}"; local_filename="sof2gold-1.03.tar.bz2"; chmodx="nochmodx" run="norun"; force="noforce"; md5="871b1dc0dafeeace65b198119e8fa200" elif [ "${shortname}" == "ts" ]; then - remote_fileurl="https://files.linuxgsm.com/TheSpecialists/ts-3-linux-final.tar.bz2"; local_filedir="${tmpdir}"; local_filename="ts-3-linux-final.tar.bz2"; chmodx="nochmodx" run="norun"; force="noforce"; md5="38e8a8325339f85a7745117802f940b7" + remote_fileurl="http://files.linuxgsm.com/TheSpecialists/ts-3-linux-final.tar.bz2"; local_filedir="${tmpdir}"; local_filename="ts-3-linux-final.tar.bz2"; chmodx="nochmodx" run="norun"; force="noforce"; md5="38e8a8325339f85a7745117802f940b7" elif [ "${shortname}" == "ut2k4" ]; then - remote_fileurl="https://files.linuxgsm.com/UnrealTournament2004/ut2004-server-3369-2-ultimate-linux.tar.bz2"; local_filedir="${tmpdir}"; local_filename="ut2004-server-3369-2-ultimate-linux.tar.bz2"; chmodx="nochmodx" run="norun"; force="noforce"; md5="67c5e2cd9c2a4b04f163962ee41eff54" + remote_fileurl="http://files.linuxgsm.com/UnrealTournament2004/ut2004-server-3369-2-ultimate-linux.tar.bz2"; local_filedir="${tmpdir}"; local_filename="ut2004-server-3369-2-ultimate-linux.tar.bz2"; chmodx="nochmodx" run="norun"; force="noforce"; md5="67c5e2cd9c2a4b04f163962ee41eff54" elif [ "${shortname}" == "ut99" ]; then - remote_fileurl="https://files.linuxgsm.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" + remote_fileurl="http://files.linuxgsm.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 [ "${shortname}" == "ut" ]; then 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 [ "${shortname}" == "ut3" ]; then - remote_fileurl="https://files.linuxgsm.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" + remote_fileurl="http://files.linuxgsm.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 [ "${shortname}" == "vs" ]; then - remote_fileurl="https://files.linuxgsm.com/VampireSlayer/vs_l-6.0_full.tar.bz2"; local_filedir="${tmpdir}"; local_filename="vs_l-6.0_full.tar.bz2"; chmodx="nochmodx" run="norun"; force="noforce"; md5="38a79e44b98578bbdc5b15818493a066" + remote_fileurl="http://files.linuxgsm.com/VampireSlayer/vs_l-6.0_full.tar.bz2"; local_filedir="${tmpdir}"; local_filename="vs_l-6.0_full.tar.bz2"; chmodx="nochmodx" run="norun"; force="noforce"; md5="38a79e44b98578bbdc5b15818493a066" elif [ "${shortname}" == "wet" ]; then - remote_fileurl="https://files.linuxgsm.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" + remote_fileurl="http://files.linuxgsm.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" elif [ "${shortname}" == "samp" ]; then remote_fileurl="https://files.sa-mp.com/samp037svr_R2-1.tar.gz"; local_filedir="${tmpdir}"; local_filename="samp037svr_R2-1.tar.gz"; chmodx="nochmodx" run="norun"; force="noforce"; md5="93705e165550c97484678236749198a4" elif [ "${shortname}" == "sol" ]; then remote_fileurl="https://static.soldat.pl/downloads/soldatserver2.8.1_1.7.1.zip"; local_filedir="${tmpdir}"; local_filename="soldatserver2.8.1_1.7.1.zip"; chmodx="nochmodx" run="norun"; force="noforce"; md5="994409c28520425965dec5c71ccb55e1" elif [ "${shortname}" == "zmr" ]; then - remote_fileurl="https://files.linuxgsm.com/ZombieMasterReborn/zombie_master_reborn_b5_2.tar.bz2"; local_filedir="${tmpdir}"; local_filename="zombie_master_reborn_b5_2.tar.bz2"; chmodx="nochmodx" run="norun"; force="noforce"; md5="d52ef2db376f5d21e3a4ceca85ec8761" + remote_fileurl="http://files.linuxgsm.com/ZombieMasterReborn/zombie_master_reborn_b5_2.tar.bz2"; local_filedir="${tmpdir}"; local_filename="zombie_master_reborn_b5_2.tar.bz2"; chmodx="nochmodx" run="norun"; force="noforce"; md5="d52ef2db376f5d21e3a4ceca85ec8761" fi fn_fetch_file "${remote_fileurl}" "${local_filedir}" "${local_filename}" "${chmodx}" "${run}" "${forcedl}" "${md5}" fn_dl_extract "${local_filedir}" "${local_filename}" "${serverfiles}" From bfa56e6d85aaa61b5a98b479d39915d1e0790503 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Fri, 22 Nov 2019 22:35:03 +0000 Subject: [PATCH 235/534] feat(docs): refactor contributing.md and other templates (#2606) --- .github/ISSUE_TEMPLATE/bug_report.md | 32 ++- .github/ISSUE_TEMPLATE/feature_request.md | 31 ++- .github/ISSUE_TEMPLATE/new-server-request.md | 2 +- .github/pull_request_template.md | 1 + CONTRIBUTING.md | 219 +++++++++++++++++-- 5 files changed, 230 insertions(+), 55 deletions(-) diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md index e6555a40e..db7ccf4f7 100644 --- a/.github/ISSUE_TEMPLATE/bug_report.md +++ b/.github/ISSUE_TEMPLATE/bug_report.md @@ -3,23 +3,20 @@ name: Bug report about: Found a bug? Raise a report --- -Follow **[this guide](https://linuxgsm.com/support/#guide)** to make sure you post the correct info. -For general support visit the **[LinuxGSM-Support](https://github.com/GameServerManagers/LinuxGSM-Support)**. +Issues raised here are **ONLY** for: +* LinuxGSM bugs. +* Feature suggestions. +* Code contributions. -Issues here are **ONLY** for: -* LinuxGSM bugs -* feature suggestions -* code contributions +Issues raised here are **NOT** for: +* General support. +* Specific game server issues (e.g CS:GO, TF2). +* Dedicated server issues (e.g Ubuntu, CentOS). +* Anything not directly related to LinuxGSM development. -Issues here are **NOT** for: -* General support -* Specific game server issues (e.g CS:GO, TF2) -* Dedicated server issues (e.g Ubuntu, CentOS) -* Anything not directly related to LinuxGSM development +For general support visit the **[LinuxGSM-Support](https://linuxgsm.com/support)**. -Any general support issues on GitHub will be migrated to [LinuxGSM-Support](https://github.com/GameServerManagers/LinuxGSM-Support). - -*Please use the template below* +***Please use the template below, deleting the above text*** ## User Story @@ -27,9 +24,10 @@ As a [user description], I want [desired action] so that [desired outcome]. ## Basic info -* Distro: [Ubuntu 18.04] -* Game: [Garry's Mod] -* Command: [Monitor] +* **Distro:** [Ubuntu 18.04] +* **Game:** [Garry's Mod] +* **Command:** [Monitor] +* **LinuxGSM version:** [v12.34.56] ## Further Information diff --git a/.github/ISSUE_TEMPLATE/feature_request.md b/.github/ISSUE_TEMPLATE/feature_request.md index 0f2ccde58..68bdf0ad6 100644 --- a/.github/ISSUE_TEMPLATE/feature_request.md +++ b/.github/ISSUE_TEMPLATE/feature_request.md @@ -3,23 +3,21 @@ name: Feature request about: Suggest an idea for this project --- -Follow **[this guide](https://linuxgsm.com/support/#guide)** to make sure you post the correct info. -For general support visit the **[LinuxGSM-Support](https://github.com/GameServerManagers/LinuxGSM-Support)**. -Issues here are **ONLY** for: -* LinuxGSM bugs -* feature suggestions -* code contributions +Issues raised here are **ONLY** for: +* LinuxGSM bugs. +* Feature suggestions. +* Code contributions. -Issues here are **NOT** for: -* General support -* Specific game server issues (e.g CS:GO, TF2) -* Dedicated server issues (e.g Ubuntu, CentOS) -* Anything not directly related to LinuxGSM development +Issues raised here are **NOT** for: +* General support. +* Specific game server issues (e.g CS:GO, TF2). +* Dedicated server issues (e.g Ubuntu, CentOS). +* Anything not directly related to LinuxGSM development. -Any general support issues on GitHub will be migrated to [LinuxGSM-Support](https://github.com/GameServerManagers/LinuxGSM-Support). +For general support visit the **[LinuxGSM Support](https://linuxgsm.com/support)** page. -*Please use the template below* +***Please use the template below, deleting the above text*** ## User Story @@ -27,9 +25,10 @@ As a [user description], I want [desired action] so that [desired outcome]. ## Basic info -* Distro: [Ubuntu 18.04] -* Game: [Garry's Mod] -* Command: [Monitor] +* **Distro:** [Ubuntu 18.04] +* **Game:** [Garry's Mod] +* **Command:** [Monitor] +* **LinuxGSM version:** [v12.34.56] ## Further Information diff --git a/.github/ISSUE_TEMPLATE/new-server-request.md b/.github/ISSUE_TEMPLATE/new-server-request.md index adb1f5f4f..8101f74f0 100644 --- a/.github/ISSUE_TEMPLATE/new-server-request.md +++ b/.github/ISSUE_TEMPLATE/new-server-request.md @@ -23,7 +23,7 @@ If yes Use SteamDB to get the appid. (https://steamdb.info). ## Is the server supported on Linux? -We only support Linux servers and do not support Wine. +We only support Linux servers and do **not** support Wine. * [ ] Yes * [ ] No diff --git a/.github/pull_request_template.md b/.github/pull_request_template.md index 8a6a36f65..807f3d8bb 100644 --- a/.github/pull_request_template.md +++ b/.github/pull_request_template.md @@ -18,6 +18,7 @@ PR will not be merged until all steps are complete. * [ ] This pull request links to an issue. * [ ] This pull request uses the `develop` branch as its base. +* [ ] This pull request Subject follows the Conventinal Commits standard. * [ ] This code follows the style guidelines of this project. * [ ] I have performed a self-review of my own code. * [ ] I have checked that this code is commented where required. diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 33650771e..2cadd7e54 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -1,36 +1,213 @@ -# How to contribute to LinuxGSM +# Contributing to LinuxGSM -We are really glad you're reading this, because if you are then you have shown an interest in helping make LinuxGSM great. +👍🎉 Thank you for taking the time to contribute! 🎉👍 -If you haven't already, come find us on [Discord](https://linuxgsm.com/discord). From there you will have contact with other contributers of the project. We want you working on things you're excited about. +The following is a set of guidelines for contributing to LinuxGSM, which are hosted in the [GameServerManagers Organization](https://github.com/gameservermanagers) on GitHub. These are mostly guidelines, not rules. Use your best judgment, and feel free to propose changes to this document in a pull request. -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! +## Table of Contents +* [Contributing to LinuxGSM](#contributing-to-linuxgsm) + * [Table of Contents](#table-of-contents) + * [Code of Conduct](#code-of-conduct) + * [Bug/Enhancement Contributions](#---bug-enhancement-contributions---) + * [Reporting Bugs](#--reporting-bugs) + * [Before Submitting A Bug Report](#before-submitting-a-bug-report) + * [How Do I Submit A (Good) Bug Report?](#how-do-i-submit-a--good--bug-report-) + * [Suggesting Features](#--suggesting-features) + * [Before Submitting An Feature Suggestion](#before-submitting-an-feature-suggestion) + * [How Do I Submit A (Good) Feature Suggestion?](#how-do-i-submit-a--good--feature-suggestion-) + * [Game Server Requests](#---game-server-requests) + * [Before Submitting a Game Server Request](#before-submitting-a-game-server-request) + * [How Do I Submit A (Good) Game Server Suggestion?](#how-do-i-submit-a--good--feature-suggestion--1) + * [Game Server Specific Issues](#---game-server-specific-issues) + * [Code Contributions](#---code-contributions) + * [Pull Requests](#pull-requests) + * [Pull Request naming convention](#pull-request-naming-convention) + * [Testing](#testing) + * [Pull Request Status Checks](#pull-request-status-checks) + * [Test Environment](#test-environment) + * [Styleguides](#-wine-glass--styleguides) + * [Git Commit Messages](#git-commit-messages) + * [BASH Styleguide](#bash-styleguide) + * [Document Contributions](#-blue-book--document-contributions) + * [Documentation Styleguide](#documentation-styleguide) + * [Issue and Pull Request Labels](#issue-and-pull-request-labels) +## Code of Conduct -Here are some important resources: +This project and everyone participating in it are governed by the [LinuxGSM Code of Conduct](https://github.com/GameServerManagers/linuxgsm/blob/master/CODE_OF_CONDUCT.md). By participating, you are expected to uphold this code. Please report unacceptable behaviour to [daniel.gibbs@linuxgsm.com](mailto:daniel.gibbs@linuxgsm.com). - * [Issues Page](https://github.com/GameServerManagers/LinuxGSM/issues) provides a list of areas that could use some work, - * [Developer Wiki](https://github.com/GameServerManagers/LinuxGSM/wiki) gives a detailed guide on developing LGSM, +## 🎉 Bug/Enhancement Contributions 🐛 -## Testing +### 🐛Reporting Bugs -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: +This section guides you through submitting a bug report for LinuxGSM. Following these guidelines help maintainers and the community understand your report 📝, reproduce the behaviour💻, and find any related reports 🔎. -[Developer Commands](https://github.com/GameServerManagers/LinuxGSM/wiki/Developer-Commands) +Before creating bug reports, please check [this list](https://github.com/GameServerManagers/linuxgsm/blob/master/CONTRIBUTING.md#before-submitting-a-bug-report) as you might find out that you don’t need to create one. When you are creating a bug report, please [include as many details as possible](https://github.com/atom/atom/blob/master/CONTRIBUTING.md#how-do-i-submit-a-good-bug-report). Fill out [the required template](https://github.com/atom/.github/blob/master/.github/ISSUE_TEMPLATE/bug_report.md), the information it asks for helps us resolve issues faster. -## Submitting changes +#### Before Submitting A Bug Report -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). +* **Check the** [**documentation**](https://docs.linuxgsm.com/%5D(https://docs.linuxgsm.com/))**.** You might be able to find the cause of the problem and fix things yourself. +* **Check that the problem is not related to** [**support page**](https://linuxgsm/com/support) for links to other support options. +* **Check the** [**support page**](https://linuxgsm/com/support) for links to other support options. +* **Perform a** [**cursory search**](https://github.com/search?q=org:GameServerManagers%20type:issues&type=Issues) to see if the problem has already been reported. If it has **and the issue is still open**, add a comment to the existing issue and give it a thumbs up instead of opening a new one. -Always write a clear log message for your commits. One-line messages are fine for small changes, but bigger changes should look like this: +#### How Do I Submit A (Good) Bug Report? - $ 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. +Bugs are tracked as [GitHub issues](https://guides.github.com/features/issues/). Create an issue and provide the following information by filling in [the issues form](https://github.com/GameServerManagers/LinuxGSM/issues/new/choose). -## Coding conventions +* **Use a clear and descriptive title** for the issue to identify the problem. +* **Complete the user story** to give a summary of the issue. +* **Provide basic info** to help us understand the context of the issue. +* **Provide further info** to give specifics and more detail. +* **Give steps to reproduce** the issue, allowing developers to follow steps that lead to the issue. +* **Explain what you expect** to happen, so we know what you think should occur. -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. +### 🎉Suggesting Features -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-and-Conventions) +This section guides you through submitting a feature suggestion for LinuxGSM, including completely new features and minor improvements to existing functionality. Following these guidelines help maintainers and the community understand your suggestion 📝 and find related suggestions 🔎. + +#### Before Submitting An Feature Suggestion + +* **Check the** [**documentation**](https://docs.linuxgsm.com/%5D(https://docs.linuxgsm.com/)) to confirm that the enhancement doesn’t already exist. +* **Check your** [**LinuxGSM version**](https://docs.linuxgsm.com/commands/update-lgsm)**.** A newer version of LinuxGSM may already have your enhancement. +* **Perform a** [**cursory search**](https://github.com/search?q=org:GameServerManagers%20type:issues&type=Issues) to see if the enhancement has already been suggested. If it has **and the enhancement is still open**, add a comment to the existing issue and give it a thumbs up instead of opening a new one. + +#### How Do I Submit A (Good) Feature Suggestion? + +Features are tracked as [GitHub issues](https://guides.github.com/features/issues/). Create an issue and provide the following information by filling in [the issues form](https://github.com/GameServerManagers/LinuxGSM/issues/new/choose). + +* **Use a clear and descriptive title** for the issue to identify the problem. +* **Complete the user story** to give a summary of the issue. +* **Provide basic info** to help us understand the context of the enhancement. +* **Provide further info** to give specifics and more detail. +* **Provide any further reading** materials that might assist in developing the enhancement. + +### 🎮 Game Server Requests + +This section guides you through submitting a game server request for LinuxGSM, Following these guidelines help maintainers and the community understand your game server request 📝 + +#### Before Submitting a Game Server Request + +* **Check for existing** [**game server requests**](https://github.com/GameServerManagers/LinuxGSM/labels/type%3A%20game%20server%20request) to see if the new game server has already been suggested. If it has **and if the new game server is still open**, give it a thumbs up instead of opening a new one. + +### 🎮 Game Server Specific Issues + +LinuxGSM is a management script that acts as a wrapper around game servers. These game servers are developed by different game developers such as Valve, Epic and Facepunch to name a few. + +LinuxGSM has no control over the development and limited knowledge issues directly relating to the game servers themselves. The same also applies for any mods, add-ons, maps etc. + +If there is an issue with a specific game server or mod the best action may be to contact the game/mod developers on there support forums. If it is unclear some community members might be able to help. + +A [list](https://docs.linuxgsm.com/support/game-server) of known game developer forums is available on the [LinuxGSM docs](https://docs.linuxgsm.com/support/game-server). + +## 💻 Code Contributions + +### Pull Requests + +The process described here has several goals: + +* Maintain LinuxGSM quality. +* Fix problems that are important to users. +* Engage the community in working toward the best possible LinuxGSM. +* Enable a sustainable system for LinuxGSM maintainers to review contributions. + +Please follow these steps to have your contribution considered by the maintainers: + +1. Follow all instructions in [the template](https://github.com/GameServerManagers/LinuxGSM/blob/master/.github/pull_request_template.md) +2. Follow the [style guides](#styleguides) +3. After you submit your pull request, verify that all [status checks](https://help.github.com/articles/about-status-checks/) are passing + +What if the status checks are failing? If a status check is failing, and you believe that the failure is unrelated to your change, please leave a comment on the pull request explaining why you believe the failure is unrelated. A maintainer will re-run the status check for you. If we conclude that the failure was a false positive, then we will open an issue to track that problem with our status check suite. + +While the prerequisites above must be satisfied before having your pull request reviewed, the reviewer(s) may ask you to complete additional design work, tests, or other changes before your pull request can be ultimately accepted. + +#### Pull Request naming convention + +When naming a pull request to ensure that it is following [Conventional Commits](https://www.conventionalcommits.org/) standards; as your pull request commits will be squashed, with the PR subject becoming the commit that is used for generating the [changelog](https://github.com/GameServerManagers/LinuxGSM/releases) for the next release. + +The pull request subject line should always be able to complete the following sentence: + +If applied, this commit will _your subject line here_ + +For example: + +* If applied, this commit will _refactor subsystem X for readability_ +* If applied, this commit will _update getting started documentation_ +* If applied, this commit will _remove deprecated methods_ +* If applied, this commit will _release version 1.0.0_ +* If applied, this commit will _merge pull request #123 from user/branch_ + +Notice how this doesn’t work for the other non-imperative forms: + +* If applied, this commit will _fixed bug with Y_ +* If applied, this commit will _change the behaviour of X_ +* If applied, this commit will _more fixes for broken stuff_ +* If applied, this commit will _sweet new API methods_ + +Below is an example of the subject line for a pull request. + +feat(alerts): add slack support to alerts + +fix(csgoserver): remove SteamCMD auth requirement 32-bit workaround + +### Testing + +#### Pull Request Status Checks +When a Pull Request is submitted, a series of status check tests are conducted. These tests will asses the code quality, complete CI tests etc. To get your PR merged these status checks must pass. + +#### Test Environment +It is recommended that you have a testing environment available to test your code during development. To test your own cod you must change some variables within the `linuxgsm.sh` file. This will force the use of your own code branch. +```bash +## GitHub Branch Select +# Allows for the use of different function files +# from a different repo and/or branch. +githubuser="GameServerManagers" +githubrepo="LinuxGSM" +githubbranch="master" +``` + +### :wine_glass: Styleguides + +#### Git Commit Messages + +LinuxGSM uses the Conventional commits standard to allow other developers to get easy to understand, descriptive commit messages as you develop. While it is recommended that you use this standard for your commits, as your commits will eventually be squashed when your PR is merged following this standard is not strictly enforced for commits, however, it is recommended for more complex commits. + +#### BASH Styleguide + +LinuxGSM uses [ShellCheck](https://www.shellcheck.net/) to follow BASH best practices. It is recommended that you make use of linter tools for your text editor such as [linter-shellcheck](https://atom.io/packages/linter-shellcheck). LinuxGSM uses [Codacy](https://app.codacy.com/manual/GameServerManagers/LinuxGSM/dashboard) to analyse any Pull Requests to give you feedback on code standards. + +LinuxGSM also has some of its style standards that should be followed. These are available in the [dev docs](https://dev-docs.linuxgsm.com/) + +## :blue_book: Document Contributions + +As well as code contributions it is possible to contribute by writing and improving documentation. Documents contributions can be submitted similarly by submitting a Pull Request. + +### Documentation Styleguide + +LinuxGSM has various documentation available to assist users and developers. LinuxGSM primarily uses [GitBook](http://gitbook.com/) which uses the [Markdown](https://www.markdownguide.org/) document standard. LinuxGSM uses [Codacy](https://app.codacy.com/manual/GameServerManagers/LinuxGSM/dashboard) to analyse any Pull Requests to give you feedback on markup standards. + +## Issue and Pull Request Labels + +This section lists the labels we use to help us track and manage issues and pull requests. + +[GitHub search](https://help.github.com/articles/searching-issues/) makes it easy to use labels for finding groups of issues or pull requests you're interested in. There are several categories of labels available: + +**command** Labels +Highlights the LinuxGSM command the Issue/PR relates too. + +**info** Labels +Labels to help pinpoint what the issue or PR relates too. + +variants: +* _distro_ +* _engine_ +* _game_ +* _info_ + +**outcome** Labels +Labels that identify why an issue was closed. + +**status** Labels +Labels to update people on the status of the issue. + +**type** Labels +Labels identifying the type of issue, such as a bug, feature, refactor etc. From 108b67cb48b848e52e7ab9f367984d2c746946b3 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Fri, 22 Nov 2019 23:39:13 +0000 Subject: [PATCH 236/534] add version info to stats --- lgsm/functions/info_stats.sh | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/lgsm/functions/info_stats.sh b/lgsm/functions/info_stats.sh index a222bc40d..ebc9a8d6b 100644 --- a/lgsm/functions/info_stats.sh +++ b/lgsm/functions/info_stats.sh @@ -23,7 +23,8 @@ uuid=$(cat "${datadir}/uuid.txt") cpuusedmhzroundup=$(((${cpuusedmhz} + 99) / 100 * 100)) # nearest 100MB memusedroundup=$(((${memused} + 99) / 100 * 100)) - +# nearest 100MB +serverfilesduroundup=$(((${serverfilesdu} + 99) / 100 * 100)) # https://developers.google.com/analytics/devguides/collection/protocol/v1/parameters # Level 1 Stats @@ -31,6 +32,8 @@ memusedroundup=$(((${memused} + 99) / 100 * 100)) curl https://www.google-analytics.com/collect -d "tid=UA-655379-31" -d "aip=1" -d "cid=${uuid}" -d "t=event" -d "ec=distro" -d "ea=${gamename}" -d "el=${distroname}" -d "v=1" > /dev/null 2>&1 ## Game Server Name curl https://www.google-analytics.com/collect -d "tid=UA-655379-31" -d "aip=1" -d "cid=${uuid}" -d "t=event" -d "ec=game" -d "ea=${gamename}" -d "el=${gamename}" -d "v=1" > /dev/null 2>&1 +## Game Server Name +curl https://www.google-analytics.com/collect -d "tid=UA-655379-31" -d "aip=1" -d "cid=${uuid}" -d "t=event" -d "ec=version" -d "ea=${version}" -d "el=${version}" -d "v=1" > /dev/null 2>&1 # Level 2 Stats ## CPU usage of a game server From 728025876afa3e6ce0d4fe6718319752a13bf06e Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Sat, 23 Nov 2019 13:23:22 +0000 Subject: [PATCH 237/534] fix(eco): remove mono 6 as a dependency for eco (mono 5 still required) (#2610) --- lgsm/functions/check_deps.sh | 6 ------ 1 file changed, 6 deletions(-) diff --git a/lgsm/functions/check_deps.sh b/lgsm/functions/check_deps.sh index c88f4de4c..4cabd78a9 100644 --- a/lgsm/functions/check_deps.sh +++ b/lgsm/functions/check_deps.sh @@ -430,9 +430,6 @@ fn_deps_build_debian(){ # Unreal Tournament elif [ "${shortname}" == "ut" ]; then array_deps_required+=( unzip ) - # Eco - elif [ "${shortname}" == "eco" ]; then - array_deps_required+=( mono-complete ) # Wurm: Unlimited elif [ "${shortname}" == "wurm" ]; then array_deps_required+=( xvfb ) @@ -546,9 +543,6 @@ fn_deps_build_redhat(){ # Unreal Tournament elif [ "${shortname}" == "ut" ]; then array_deps_required+=( unzip ) - # Eco - elif [ "${shortname}" == "eco" ]; then - array_deps_required+=( mono-complete ) # Unturned elif [ "${shortname}" == "unt" ]; then array_deps_required+=( mono-complete ) From 351cf4035a75e8ea27f9442b36475d2917120c10 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Mon, 25 Nov 2019 09:50:01 +0000 Subject: [PATCH 238/534] feat(monitor): migrate monitor settings to _default.cfg (#2611) * add mumble query * re-ordered serverlist.csv * gamedig refactor * query raw update * gamedig: changed --query_port to --port * add query data to log * remove UDP query as does not work. * refactor gamedig and gsquery * add missing Factorio rcon port * add fn_monitor_check_queryport * add TCP query to Factorio * add mta query support * MTA IP address must be set. No longer using config * remove mumble and ts3 from bypassing check_ip * update netstat command for Project Zomboid * adde query port to Project Zomboid * update query mode for samp * Update Teeworlds query * add Soldat to TCP query * update ss3 port info * add query details to Serious Sam 3 * add Terraria query port * ts3 now uses tcp query as proper query requires permissions changes * update ut99 query * gsquery add gamespy1 * separate out unreal engine functions * updated ut2k4 query * update Teeworlds query * update Factorio query * change engine if to shortname --- .../config-lgsm/ahl2server/_default.cfg | 9 + .../config-lgsm/ahlserver/_default.cfg | 9 + .../config-lgsm/arkserver/_default.cfg | 9 + .../config-lgsm/arma3server/_default.cfg | 9 + .../config-lgsm/bb2server/_default.cfg | 9 + .../config-lgsm/bbserver/_default.cfg | 9 + .../config-lgsm/bdserver/_default.cfg | 9 + .../config-lgsm/bf1942server/_default.cfg | 9 + .../config-lgsm/bmdmserver/_default.cfg | 9 + .../config-lgsm/boserver/_default.cfg | 9 + .../config-lgsm/bsserver/_default.cfg | 9 + .../config-lgsm/bt1944server/_default.cfg | 9 + .../config-lgsm/btserver/_default.cfg | 9 + .../config-lgsm/ccserver/_default.cfg | 9 + .../config-lgsm/cod2server/_default.cfg | 9 + .../config-lgsm/cod4server/_default.cfg | 9 + .../config-lgsm/codserver/_default.cfg | 9 + .../config-lgsm/coduoserver/_default.cfg | 9 + .../config-lgsm/codwawserver/_default.cfg | 9 + .../config-lgsm/csczserver/_default.cfg | 9 + .../config-lgsm/csgoserver/_default.cfg | 9 + .../config-lgsm/csserver/_default.cfg | 9 + .../config-lgsm/cssserver/_default.cfg | 9 + .../config-lgsm/dabserver/_default.cfg | 9 + .../config-lgsm/dmcserver/_default.cfg | 9 + .../config-lgsm/dodserver/_default.cfg | 9 + .../config-lgsm/dodsserver/_default.cfg | 9 + .../config-lgsm/doiserver/_default.cfg | 9 + .../config-lgsm/dstserver/_default.cfg | 9 + .../config-lgsm/dysserver/_default.cfg | 9 + .../config-lgsm/ecoserver/_default.cfg | 9 + .../config-lgsm/emserver/_default.cfg | 9 + .../config-lgsm/etlserver/_default.cfg | 9 + .../config-lgsm/fctrserver/_default.cfg | 9 + .../config-lgsm/fofserver/_default.cfg | 9 + .../config-lgsm/gesserver/_default.cfg | 9 + .../config-lgsm/gmodserver/_default.cfg | 9 + .../config-lgsm/hl2dmserver/_default.cfg | 9 + .../config-lgsm/hldmserver/_default.cfg | 9 + .../config-lgsm/hldmsserver/_default.cfg | 9 + .../config-lgsm/hwserver/_default.cfg | 9 + .../config-lgsm/insserver/_default.cfg | 9 + .../config-lgsm/inssserver/_default.cfg | 9 + .../config-lgsm/iosserver/_default.cfg | 9 + .../config-lgsm/jc2server/_default.cfg | 9 + .../config-lgsm/jc3server/_default.cfg | 9 + .../config-lgsm/kf2server/_default.cfg | 9 + .../config-lgsm/kfserver/_default.cfg | 9 + .../config-lgsm/l4d2server/_default.cfg | 9 + .../config-lgsm/l4dserver/_default.cfg | 9 + .../config-lgsm/mcserver/_default.cfg | 9 + .../config-lgsm/mhserver/_default.cfg | 9 + .../config-lgsm/mohaaserver/_default.cfg | 9 + .../config-lgsm/mtaserver/_default.cfg | 12 + .../config-lgsm/mumbleserver/_default.cfg | 9 + .../config-lgsm/ndserver/_default.cfg | 9 + .../config-lgsm/nmrihserver/_default.cfg | 9 + .../config-lgsm/ns2cserver/_default.cfg | 9 + .../config-lgsm/ns2server/_default.cfg | 9 + .../config-lgsm/nsserver/_default.cfg | 9 + .../config-lgsm/opforserver/_default.cfg | 9 + .../config-lgsm/pcserver/_default.cfg | 9 + .../config-lgsm/pstbsserver/_default.cfg | 9 + .../config-lgsm/pvkiiserver/_default.cfg | 9 + .../config-lgsm/pzserver/_default.cfg | 9 + .../config-lgsm/q2server/_default.cfg | 9 + .../config-lgsm/q3server/_default.cfg | 9 + .../config-lgsm/qlserver/_default.cfg | 9 + .../config-lgsm/qwserver/_default.cfg | 9 + .../config-lgsm/ricochetserver/_default.cfg | 9 + .../config-lgsm/roserver/_default.cfg | 9 + .../config-lgsm/rtcwserver/_default.cfg | 9 + .../config-lgsm/rustserver/_default.cfg | 11 +- .../config-lgsm/rwserver/_default.cfg | 9 + .../config-lgsm/sampserver/_default.cfg | 10 + .../config-lgsm/sbotsserver/_default.cfg | 9 + .../config-lgsm/sbserver/_default.cfg | 9 + .../config-lgsm/sdtdserver/_default.cfg | 9 + .../config-lgsm/sfcserver/_default.cfg | 9 + .../config-lgsm/sof2server/_default.cfg | 9 + .../config-lgsm/solserver/_default.cfg | 9 + .../config-lgsm/squadserver/_default.cfg | 9 + .../config-lgsm/ss3server/_default.cfg | 9 + .../config-lgsm/stserver/_default.cfg | 9 + .../config-lgsm/svenserver/_default.cfg | 9 + .../config-lgsm/terrariaserver/_default.cfg | 9 + .../config-lgsm/tf2server/_default.cfg | 9 + .../config-lgsm/tfcserver/_default.cfg | 9 + .../config-lgsm/ts3server/_default.cfg | 9 + .../config-lgsm/tsserver/_default.cfg | 9 + .../config-lgsm/tuserver/_default.cfg | 9 + .../config-lgsm/twserver/_default.cfg | 9 + .../config-lgsm/untserver/_default.cfg | 9 + .../config-lgsm/ut2k4server/_default.cfg | 9 + .../config-lgsm/ut3server/_default.cfg | 9 + .../config-lgsm/ut99server/_default.cfg | 9 + .../config-lgsm/utserver/_default.cfg | 9 + .../config-lgsm/vsserver/_default.cfg | 9 + .../config-lgsm/wetserver/_default.cfg | 9 + .../config-lgsm/wfserver/_default.cfg | 9 + .../config-lgsm/wurmserver/_default.cfg | 9 + .../config-lgsm/zmrserver/_default.cfg | 9 + .../config-lgsm/zpsserver/_default.cfg | 9 + lgsm/data/serverlist.csv | 42 +-- lgsm/functions/alert.sh | 2 +- lgsm/functions/check_deps.sh | 16 +- lgsm/functions/check_ip.sh | 2 +- lgsm/functions/command_backup.sh | 1 + lgsm/functions/command_debug.sh | 1 + lgsm/functions/command_details.sh | 1 + lgsm/functions/command_dev_clear_functions.sh | 1 + lgsm/functions/command_dev_debug.sh | 1 + lgsm/functions/command_dev_detect_glibc.sh | 1 + lgsm/functions/command_dev_query_raw.sh | 58 ++-- lgsm/functions/command_donate.sh | 9 +- lgsm/functions/command_fastdl.sh | 1 + lgsm/functions/command_install.sh | 2 +- .../command_install_resources_mta.sh | 2 + lgsm/functions/command_monitor.sh | 295 ++++++++++-------- lgsm/functions/command_postdetails.sh | 4 +- lgsm/functions/command_restart.sh | 2 + lgsm/functions/command_start.sh | 5 +- lgsm/functions/command_stop.sh | 4 +- lgsm/functions/command_test_alert.sh | 1 + lgsm/functions/command_ts3_server_pass.sh | 1 + lgsm/functions/command_update_linuxgsm.sh | 2 +- lgsm/functions/command_validate.sh | 1 + lgsm/functions/compress_unreal2_maps.sh | 1 + lgsm/functions/compress_ut99_maps.sh | 1 + lgsm/functions/core_messages.sh | 4 + lgsm/functions/info_config.sh | 81 +++-- lgsm/functions/info_messages.sh | 160 ++++++---- lgsm/functions/info_parms.sh | 47 ++- lgsm/functions/query_gamedig.sh | 79 +---- lgsm/functions/query_gsquery.py | 23 +- 135 files changed, 1385 insertions(+), 399 deletions(-) diff --git a/lgsm/config-default/config-lgsm/ahl2server/_default.cfg b/lgsm/config-default/config-lgsm/ahl2server/_default.cfg index 5d1031017..1497127b0 100644 --- a/lgsm/config-default/config-lgsm/ahl2server/_default.cfg +++ b/lgsm/config-default/config-lgsm/ahl2server/_default.cfg @@ -124,6 +124,15 @@ sleeptime="0.5" # 10: Teamspeak 3 stopmode="3" +## Query mode +# 1: session only +# 2: gamedig + gsquery +# 3: gamedig +# 4: gsquery +# 5: tcp +querymode="2" +querytype="protocol-valve" + ## SteamCMD Settings | https://docs.linuxgsm.com/steamcmd # Server appid appid="985050" diff --git a/lgsm/config-default/config-lgsm/ahlserver/_default.cfg b/lgsm/config-default/config-lgsm/ahlserver/_default.cfg index 8aeab4fcd..9be4a37f5 100644 --- a/lgsm/config-default/config-lgsm/ahlserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/ahlserver/_default.cfg @@ -128,6 +128,15 @@ steammaster="true" # 10: Teamspeak 3 stopmode="9" +## Query mode +# 1: session only +# 2: gamedig + gsquery +# 3: gamedig +# 4: gsquery +# 5: tcp +querymode="2" +querytype="protocol-valve" + ## Game Server Details # Do not edit gamename="Action half-life" diff --git a/lgsm/config-default/config-lgsm/arkserver/_default.cfg b/lgsm/config-default/config-lgsm/arkserver/_default.cfg index c5ec8b7bc..f2587f978 100644 --- a/lgsm/config-default/config-lgsm/arkserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/arkserver/_default.cfg @@ -129,6 +129,15 @@ steammaster="true" # 10: Teamspeak 3 stopmode="2" +## Query mode +# 1: session only +# 2: gamedig + gsquery +# 3: gamedig +# 4: gsquery +# 5: tcp +querymode="2" +querytype="protocol-valve" + ## Game Server Details # Do not edit gamename="ARK: Survival Evolved" diff --git a/lgsm/config-default/config-lgsm/arma3server/_default.cfg b/lgsm/config-default/config-lgsm/arma3server/_default.cfg index 7f83e8427..4aee5c41d 100644 --- a/lgsm/config-default/config-lgsm/arma3server/_default.cfg +++ b/lgsm/config-default/config-lgsm/arma3server/_default.cfg @@ -143,6 +143,15 @@ steammaster="false" # 10: Teamspeak 3 stopmode="2" +## Query mode +# 1: session only +# 2: gamedig + gsquery +# 3: gamedig +# 4: gsquery +# 5: tcp +querymode="2" +querytype="protocol-valve" + ## Game Server Details # Do not edit gamename="ARMA 3" diff --git a/lgsm/config-default/config-lgsm/bb2server/_default.cfg b/lgsm/config-default/config-lgsm/bb2server/_default.cfg index c73974c56..9dfd3afd7 100644 --- a/lgsm/config-default/config-lgsm/bb2server/_default.cfg +++ b/lgsm/config-default/config-lgsm/bb2server/_default.cfg @@ -133,6 +133,15 @@ steammaster="true" # 10: Teamspeak 3 stopmode="3" +## Query mode +# 1: session only +# 2: gamedig + gsquery +# 3: gamedig +# 4: gsquery +# 5: tcp +querymode="2" +querytype="protocol-valve" + ## Game Server Details # Do not edit gamename="BrainBread 2" diff --git a/lgsm/config-default/config-lgsm/bbserver/_default.cfg b/lgsm/config-default/config-lgsm/bbserver/_default.cfg index 63fc1cee2..aa03073b8 100644 --- a/lgsm/config-default/config-lgsm/bbserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/bbserver/_default.cfg @@ -128,6 +128,15 @@ steammaster="true" # 10: Teamspeak 3 stopmode="9" +## Query mode +# 1: session only +# 2: gamedig + gsquery +# 3: gamedig +# 4: gsquery +# 5: tcp +querymode="2" +querytype="protocol-valve" + ## Game Server Details # Do not edit gamename="BrainBread" diff --git a/lgsm/config-default/config-lgsm/bdserver/_default.cfg b/lgsm/config-default/config-lgsm/bdserver/_default.cfg index e9a0ccb4a..1b12ebb29 100644 --- a/lgsm/config-default/config-lgsm/bdserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/bdserver/_default.cfg @@ -127,6 +127,15 @@ steammaster="true" # 10: Teamspeak 3 stopmode="9" +## Query mode +# 1: session only +# 2: gamedig + gsquery +# 3: gamedig +# 4: gsquery +# 5: tcp +querymode="2" +querytype="protocol-valve" + ## Game Server Details # Do not edit gamename="Base Defense" diff --git a/lgsm/config-default/config-lgsm/bf1942server/_default.cfg b/lgsm/config-default/config-lgsm/bf1942server/_default.cfg index 1a04f03dd..b54c300f8 100644 --- a/lgsm/config-default/config-lgsm/bf1942server/_default.cfg +++ b/lgsm/config-default/config-lgsm/bf1942server/_default.cfg @@ -112,6 +112,15 @@ sleeptime="0.5" # 10: Teamspeak 3 stopmode="2" +## Query mode +# 1: session only +# 2: gamedig + gsquery +# 3: gamedig +# 4: gsquery +# 5: tcp +querymode="2" +querytype="protocol-valve" + ## Game Server Details # Do not edit gamename="Battlefield: 1942" diff --git a/lgsm/config-default/config-lgsm/bmdmserver/_default.cfg b/lgsm/config-default/config-lgsm/bmdmserver/_default.cfg index 756f7705a..8026112ab 100644 --- a/lgsm/config-default/config-lgsm/bmdmserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/bmdmserver/_default.cfg @@ -133,6 +133,15 @@ steammaster="true" # 10: Teamspeak 3 stopmode="3" +## Query mode +# 1: session only +# 2: gamedig + gsquery +# 3: gamedig +# 4: gsquery +# 5: tcp +querymode="2" +querytype="protocol-valve" + ## Game Server Details # Do not edit gamename="Black Mesa: Deathmatch" diff --git a/lgsm/config-default/config-lgsm/boserver/_default.cfg b/lgsm/config-default/config-lgsm/boserver/_default.cfg index e7d0bf4dd..0ab0986e0 100644 --- a/lgsm/config-default/config-lgsm/boserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/boserver/_default.cfg @@ -126,6 +126,15 @@ steammaster="false" # 10: Teamspeak 3 stopmode="2" +## Query mode +# 1: session only +# 2: gamedig + gsquery +# 3: gamedig +# 4: gsquery +# 5: tcp +querymode="2" +querytype="protocol-valve" + ## Game Server Details # Do not edit gamename="Ballistic Overkill" diff --git a/lgsm/config-default/config-lgsm/bsserver/_default.cfg b/lgsm/config-default/config-lgsm/bsserver/_default.cfg index 4eac8cb6e..ceab458a7 100644 --- a/lgsm/config-default/config-lgsm/bsserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/bsserver/_default.cfg @@ -137,6 +137,15 @@ steammaster="true" # 10: Teamspeak 3 stopmode="3" +## Query mode +# 1: session only +# 2: gamedig + gsquery +# 3: gamedig +# 4: gsquery +# 5: tcp +querymode="2" +querytype="protocol-valve" + ## Game Server Details # Do not edit gamename="Blade Symphony" diff --git a/lgsm/config-default/config-lgsm/bt1944server/_default.cfg b/lgsm/config-default/config-lgsm/bt1944server/_default.cfg index 6629e8263..c93336ca9 100644 --- a/lgsm/config-default/config-lgsm/bt1944server/_default.cfg +++ b/lgsm/config-default/config-lgsm/bt1944server/_default.cfg @@ -125,6 +125,15 @@ steammaster="false" # 10: Teamspeak 3 stopmode="2" +## Query mode +# 1: session only +# 2: gamedig + gsquery +# 3: gamedig +# 4: gsquery +# 5: tcp +querymode="2" +querytype="protocol-valve" + ## Game Server Details # Do not edit gamename="Battalion 1944" diff --git a/lgsm/config-default/config-lgsm/btserver/_default.cfg b/lgsm/config-default/config-lgsm/btserver/_default.cfg index c1edf3d34..772a8dfe2 100644 --- a/lgsm/config-default/config-lgsm/btserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/btserver/_default.cfg @@ -120,6 +120,15 @@ steammaster="true" # 10: Teamspeak 3 stopmode="7" +## Query mode +# 1: session only +# 2: gamedig + gsquery +# 3: gamedig +# 4: gsquery +# 5: tcp +querymode="2" +querytype="protocol-valve" + ## Game Server Details # Do not edit gamename="Barotrauma" diff --git a/lgsm/config-default/config-lgsm/ccserver/_default.cfg b/lgsm/config-default/config-lgsm/ccserver/_default.cfg index 230c64250..d2e964299 100644 --- a/lgsm/config-default/config-lgsm/ccserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/ccserver/_default.cfg @@ -128,6 +128,15 @@ steammaster="false" # 10: Teamspeak 3 stopmode="3" +## Query mode +# 1: session only +# 2: gamedig + gsquery +# 3: gamedig +# 4: gsquery +# 5: tcp +querymode="2" +querytype="protocol-valve" + ## Game Server Details # Do not edit gamename="Codename CURE" diff --git a/lgsm/config-default/config-lgsm/cod2server/_default.cfg b/lgsm/config-default/config-lgsm/cod2server/_default.cfg index f3b1e48c1..e3237eb2b 100644 --- a/lgsm/config-default/config-lgsm/cod2server/_default.cfg +++ b/lgsm/config-default/config-lgsm/cod2server/_default.cfg @@ -115,6 +115,15 @@ sleeptime="0.5" # 10: Teamspeak 3 stopmode="3" +## Query mode +# 1: session only +# 2: gamedig + gsquery +# 3: gamedig +# 4: gsquery +# 5: tcp +querymode="2" +querytype="protocol-quake3" + ## Game Server Details # Do not edit gamename="Call of Duty 2" diff --git a/lgsm/config-default/config-lgsm/cod4server/_default.cfg b/lgsm/config-default/config-lgsm/cod4server/_default.cfg index 56d7f4aaf..1cc245ef8 100644 --- a/lgsm/config-default/config-lgsm/cod4server/_default.cfg +++ b/lgsm/config-default/config-lgsm/cod4server/_default.cfg @@ -115,6 +115,15 @@ sleeptime="0.5" # 10: Teamspeak 3 stopmode="3" +## Query mode +# 1: session only +# 2: gamedig + gsquery +# 3: gamedig +# 4: gsquery +# 5: tcp +querymode="2" +querytype="protocol-quake3" + ## Game Server Details # Do not edit gamename="Call of Duty 4" diff --git a/lgsm/config-default/config-lgsm/codserver/_default.cfg b/lgsm/config-default/config-lgsm/codserver/_default.cfg index 31fe03d8c..9ca4a33bd 100644 --- a/lgsm/config-default/config-lgsm/codserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/codserver/_default.cfg @@ -115,6 +115,15 @@ sleeptime="0.5" # 10: Teamspeak 3 stopmode="3" +## Query mode +# 1: session only +# 2: gamedig + gsquery +# 3: gamedig +# 4: gsquery +# 5: tcp +querymode="2" +querytype="protocol-quake3" + ## Game Server Details # Do not edit gamename="Call of Duty" diff --git a/lgsm/config-default/config-lgsm/coduoserver/_default.cfg b/lgsm/config-default/config-lgsm/coduoserver/_default.cfg index c0274d899..86da8fdc2 100644 --- a/lgsm/config-default/config-lgsm/coduoserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/coduoserver/_default.cfg @@ -115,6 +115,15 @@ sleeptime="0.5" # 10: Teamspeak 3 stopmode="3" +## Query mode +# 1: session only +# 2: gamedig + gsquery +# 3: gamedig +# 4: gsquery +# 5: tcp +querymode="2" +querytype="protocol-quake3" + ## Game Server Details # Do not edit gamename="Call of Duty: United Offensive" diff --git a/lgsm/config-default/config-lgsm/codwawserver/_default.cfg b/lgsm/config-default/config-lgsm/codwawserver/_default.cfg index 751a3bb41..81d5bdb68 100644 --- a/lgsm/config-default/config-lgsm/codwawserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/codwawserver/_default.cfg @@ -115,6 +115,15 @@ sleeptime="0.5" # 10: Teamspeak 3 stopmode="3" +## Query mode +# 1: session only +# 2: gamedig + gsquery +# 3: gamedig +# 4: gsquery +# 5: tcp +querymode="2" +querytype="protocol-quake3" + ## Game Server Details # Do not edit gamename="Call of Duty: World at War" diff --git a/lgsm/config-default/config-lgsm/csczserver/_default.cfg b/lgsm/config-default/config-lgsm/csczserver/_default.cfg index 039e0409c..8cf8f7f24 100644 --- a/lgsm/config-default/config-lgsm/csczserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/csczserver/_default.cfg @@ -128,6 +128,15 @@ steammaster="true" # 10: Teamspeak 3 stopmode="9" +## Query mode +# 1: session only +# 2: gamedig + gsquery +# 3: gamedig +# 4: gsquery +# 5: tcp +querymode="2" +querytype="protocol-valve" + ## Game Server Details # Do not edit gamename="Counter-Strike: Condition Zero" diff --git a/lgsm/config-default/config-lgsm/csgoserver/_default.cfg b/lgsm/config-default/config-lgsm/csgoserver/_default.cfg index db3e27811..ac5c9c392 100644 --- a/lgsm/config-default/config-lgsm/csgoserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/csgoserver/_default.cfg @@ -153,6 +153,15 @@ steammaster="true" # 10: Teamspeak 3 stopmode="3" +## Query mode +# 1: session only +# 2: gamedig + gsquery +# 3: gamedig +# 4: gsquery +# 5: tcp +querymode="2" +querytype="protocol-valve" + ## Game Server Details # Do not edit gamename="Counter-Strike: Global Offensive" diff --git a/lgsm/config-default/config-lgsm/csserver/_default.cfg b/lgsm/config-default/config-lgsm/csserver/_default.cfg index fef0d8bb9..107110881 100644 --- a/lgsm/config-default/config-lgsm/csserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/csserver/_default.cfg @@ -128,6 +128,15 @@ steammaster="true" # 10: Teamspeak 3 stopmode="9" +## Query mode +# 1: session only +# 2: gamedig + gsquery +# 3: gamedig +# 4: gsquery +# 5: tcp +querymode="2" +querytype="protocol-valve" + ## Game Server Details # Do not edit gamename="Counter-Strike 1.6" diff --git a/lgsm/config-default/config-lgsm/cssserver/_default.cfg b/lgsm/config-default/config-lgsm/cssserver/_default.cfg index 2ef39d44c..f05845fef 100644 --- a/lgsm/config-default/config-lgsm/cssserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/cssserver/_default.cfg @@ -133,6 +133,15 @@ steammaster="true" # 10: Teamspeak 3 stopmode="3" +## Query mode +# 1: session only +# 2: gamedig + gsquery +# 3: gamedig +# 4: gsquery +# 5: tcp +querymode="2" +querytype="protocol-valve" + ## Game Server Details # Do not edit gamename="Counter-Strike: Source" diff --git a/lgsm/config-default/config-lgsm/dabserver/_default.cfg b/lgsm/config-default/config-lgsm/dabserver/_default.cfg index 2340eb63a..feaa53597 100644 --- a/lgsm/config-default/config-lgsm/dabserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/dabserver/_default.cfg @@ -128,6 +128,15 @@ steammaster="true" # 10: Teamspeak 3 stopmode="3" +## Query mode +# 1: session only +# 2: gamedig + gsquery +# 3: gamedig +# 4: gsquery +# 5: tcp +querymode="2" +querytype="protocol-valve" + ## Game Server Details # Do not edit gamename="Double Action: Boogaloo" diff --git a/lgsm/config-default/config-lgsm/dmcserver/_default.cfg b/lgsm/config-default/config-lgsm/dmcserver/_default.cfg index a9561dc37..5510df840 100644 --- a/lgsm/config-default/config-lgsm/dmcserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/dmcserver/_default.cfg @@ -128,6 +128,15 @@ steammaster="true" # 10: Teamspeak 3 stopmode="9" +## Query mode +# 1: session only +# 2: gamedig + gsquery +# 3: gamedig +# 4: gsquery +# 5: tcp +querymode="2" +querytype="protocol-valve" + ## Game Server Details # Do not edit gamename="Deathmatch Classic" diff --git a/lgsm/config-default/config-lgsm/dodserver/_default.cfg b/lgsm/config-default/config-lgsm/dodserver/_default.cfg index 3a9afe284..d6aae8134 100644 --- a/lgsm/config-default/config-lgsm/dodserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/dodserver/_default.cfg @@ -128,6 +128,15 @@ steammaster="true" # 10: Teamspeak 3 stopmode="9" +## Query mode +# 1: session only +# 2: gamedig + gsquery +# 3: gamedig +# 4: gsquery +# 5: tcp +querymode="2" +querytype="protocol-valve" + ## Game Server Details # Do not edit gamename="Day of Defeat" diff --git a/lgsm/config-default/config-lgsm/dodsserver/_default.cfg b/lgsm/config-default/config-lgsm/dodsserver/_default.cfg index ca6391872..909ee3264 100644 --- a/lgsm/config-default/config-lgsm/dodsserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/dodsserver/_default.cfg @@ -128,6 +128,15 @@ steammaster="true" # 10: Teamspeak 3 stopmode="3" +## Query mode +# 1: session only +# 2: gamedig + gsquery +# 3: gamedig +# 4: gsquery +# 5: tcp +querymode="2" +querytype="protocol-valve" + ## Game Server Details # Do not edit gamename="Day of Defeat: Source" diff --git a/lgsm/config-default/config-lgsm/doiserver/_default.cfg b/lgsm/config-default/config-lgsm/doiserver/_default.cfg index ac3feb41c..cd749eadf 100644 --- a/lgsm/config-default/config-lgsm/doiserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/doiserver/_default.cfg @@ -129,6 +129,15 @@ steammaster="true" # 10: Teamspeak 3 stopmode="3" +## Query mode +# 1: session only +# 2: gamedig + gsquery +# 3: gamedig +# 4: gsquery +# 5: tcp +querymode="2" +querytype="protocol-valve" + ## Game Server Details # Do not edit gamename="Day of Infamy" diff --git a/lgsm/config-default/config-lgsm/dstserver/_default.cfg b/lgsm/config-default/config-lgsm/dstserver/_default.cfg index f25a4ff70..90e2c433d 100644 --- a/lgsm/config-default/config-lgsm/dstserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/dstserver/_default.cfg @@ -131,6 +131,15 @@ steammaster="false" # 10: Teamspeak 3 stopmode="2" +## Query mode +# 1: session only +# 2: gamedig + gsquery +# 3: gamedig +# 4: gsquery +# 5: tcp +querymode="1" +querytype="" + ## Game Server Details # Do not edit gamename="Don't Starve Together" diff --git a/lgsm/config-default/config-lgsm/dysserver/_default.cfg b/lgsm/config-default/config-lgsm/dysserver/_default.cfg index fbbc847fd..c4eca188e 100644 --- a/lgsm/config-default/config-lgsm/dysserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/dysserver/_default.cfg @@ -133,6 +133,15 @@ steammaster="true" # 10: Teamspeak 3 stopmode="3" +## Query mode +# 1: session only +# 2: gamedig + gsquery +# 3: gamedig +# 4: gsquery +# 5: tcp +querymode="2" +querytype="protocol-valve" + ## Game Server Details # Do not edit gamename="Dystopia" diff --git a/lgsm/config-default/config-lgsm/ecoserver/_default.cfg b/lgsm/config-default/config-lgsm/ecoserver/_default.cfg index 145a2a547..509b866d1 100644 --- a/lgsm/config-default/config-lgsm/ecoserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/ecoserver/_default.cfg @@ -120,6 +120,15 @@ steammaster="false" # 10: Teamspeak 3 stopmode="2" +## Query mode +# 1: session only +# 2: gamedig + gsquery +# 3: gamedig +# 4: gsquery +# 5: tcp +querymode="1" +querytype="" + ## Game Server Details # Do not edit gamename="Eco" diff --git a/lgsm/config-default/config-lgsm/emserver/_default.cfg b/lgsm/config-default/config-lgsm/emserver/_default.cfg index abd75f12d..fed82c6d2 100644 --- a/lgsm/config-default/config-lgsm/emserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/emserver/_default.cfg @@ -133,6 +133,15 @@ steammaster="true" # 10: Teamspeak 3 stopmode="3" +## Query mode +# 1: session only +# 2: gamedig + gsquery +# 3: gamedig +# 4: gsquery +# 5: tcp +querymode="2" +querytype="protocol-valve" + ## Game Server Details # Do not edit gamename="Empires Mod" diff --git a/lgsm/config-default/config-lgsm/etlserver/_default.cfg b/lgsm/config-default/config-lgsm/etlserver/_default.cfg index 3e2cb2bd6..e2aa5ced2 100644 --- a/lgsm/config-default/config-lgsm/etlserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/etlserver/_default.cfg @@ -109,6 +109,15 @@ sleeptime="0.5" # 10: Teamspeak 3 stopmode="3" +## Query mode +# 1: session only +# 2: gamedig + gsquery +# 3: gamedig +# 4: gsquery +# 5: tcp +querymode="2" +querytype="protocol-quake3" + ## Game Server Details # Do not edit gamename="ET: Legacy" diff --git a/lgsm/config-default/config-lgsm/fctrserver/_default.cfg b/lgsm/config-default/config-lgsm/fctrserver/_default.cfg index 6eb8988c7..0bccfdd42 100644 --- a/lgsm/config-default/config-lgsm/fctrserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/fctrserver/_default.cfg @@ -120,6 +120,15 @@ sleeptime="0.5" # 10: Teamspeak 3 stopmode="2" +## Query mode +# 1: session only +# 2: gamedig + gsquery +# 3: gamedig +# 4: gsquery +# 5: tcp +querymode="1" +querytype="" + ## Game Server Details # Do not edit gamename="Factorio" diff --git a/lgsm/config-default/config-lgsm/fofserver/_default.cfg b/lgsm/config-default/config-lgsm/fofserver/_default.cfg index 26a043dcc..485259292 100644 --- a/lgsm/config-default/config-lgsm/fofserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/fofserver/_default.cfg @@ -128,6 +128,15 @@ steammaster="true" # 10: Teamspeak 3 stopmode="3" +## Query mode +# 1: session only +# 2: gamedig + gsquery +# 3: gamedig +# 4: gsquery +# 5: tcp +querymode="2" +querytype="protocol-valve" + ## Game Server Details # Do not edit gamename="Fistful of Frags" diff --git a/lgsm/config-default/config-lgsm/gesserver/_default.cfg b/lgsm/config-default/config-lgsm/gesserver/_default.cfg index 5c91c62cc..41282bbc7 100644 --- a/lgsm/config-default/config-lgsm/gesserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/gesserver/_default.cfg @@ -128,6 +128,15 @@ steammaster="true" # 10: Teamspeak 3 stopmode="3" +## Query mode +# 1: session only +# 2: gamedig + gsquery +# 3: gamedig +# 4: gsquery +# 5: tcp +querymode="2" +querytype="protocol-valve" + ## Game Server Details # Do not edit gamename="GoldenEye: Source" diff --git a/lgsm/config-default/config-lgsm/gmodserver/_default.cfg b/lgsm/config-default/config-lgsm/gmodserver/_default.cfg index f0be94ba4..1723df183 100644 --- a/lgsm/config-default/config-lgsm/gmodserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/gmodserver/_default.cfg @@ -144,6 +144,15 @@ steammaster="true" # 10: Teamspeak 3 stopmode="3" +## Query mode +# 1: session only +# 2: gamedig + gsquery +# 3: gamedig +# 4: gsquery +# 5: tcp +querymode="2" +querytype="protocol-valve" + ## Game Server Details # Do not edit gamename="Garry's Mod" diff --git a/lgsm/config-default/config-lgsm/hl2dmserver/_default.cfg b/lgsm/config-default/config-lgsm/hl2dmserver/_default.cfg index e3a8827c5..8fd962136 100644 --- a/lgsm/config-default/config-lgsm/hl2dmserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/hl2dmserver/_default.cfg @@ -128,6 +128,15 @@ steammaster="true" # 10: Teamspeak 3 stopmode="3" +## Query mode +# 1: session only +# 2: gamedig + gsquery +# 3: gamedig +# 4: gsquery +# 5: tcp +querymode="2" +querytype="protocol-valve" + ## Game Server Details # Do not edit gamename="Half Life 2: Deathmatch" diff --git a/lgsm/config-default/config-lgsm/hldmserver/_default.cfg b/lgsm/config-default/config-lgsm/hldmserver/_default.cfg index 46ccbe72b..8e1ddd8e6 100644 --- a/lgsm/config-default/config-lgsm/hldmserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/hldmserver/_default.cfg @@ -127,6 +127,15 @@ steammaster="true" # 10: Teamspeak 3 stopmode="9" +## Query mode +# 1: session only +# 2: gamedig + gsquery +# 3: gamedig +# 4: gsquery +# 5: tcp +querymode="2" +querytype="protocol-valve" + ## Game Server Details # Do not edit gamename="Half Life: Deathmatch" diff --git a/lgsm/config-default/config-lgsm/hldmsserver/_default.cfg b/lgsm/config-default/config-lgsm/hldmsserver/_default.cfg index 2faea0e45..dd7c93012 100644 --- a/lgsm/config-default/config-lgsm/hldmsserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/hldmsserver/_default.cfg @@ -128,6 +128,15 @@ steammaster="true" # 10: Teamspeak 3 stopmode="3" +## Query mode +# 1: session only +# 2: gamedig + gsquery +# 3: gamedig +# 4: gsquery +# 5: tcp +querymode="2" +querytype="protocol-valve" + ## Game Server Details # Do not edit gamename="Half-Life Deathmatch: Source" diff --git a/lgsm/config-default/config-lgsm/hwserver/_default.cfg b/lgsm/config-default/config-lgsm/hwserver/_default.cfg index 08cd3753b..a5010d101 100644 --- a/lgsm/config-default/config-lgsm/hwserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/hwserver/_default.cfg @@ -139,6 +139,15 @@ steammaster="false" # 10: Teamspeak 3 stopmode="2" +## Query mode +# 1: session only +# 2: gamedig + gsquery +# 3: gamedig +# 4: gsquery +# 5: tcp +querymode="2" +querytype="protocol-valve" + ## Game Server Details # Do not edit gamename="Hurtworld" diff --git a/lgsm/config-default/config-lgsm/insserver/_default.cfg b/lgsm/config-default/config-lgsm/insserver/_default.cfg index 15a740637..bedda2359 100644 --- a/lgsm/config-default/config-lgsm/insserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/insserver/_default.cfg @@ -134,6 +134,15 @@ steammaster="false" # 10: Teamspeak 3 stopmode="3" +## Query mode +# 1: session only +# 2: gamedig + gsquery +# 3: gamedig +# 4: gsquery +# 5: tcp +querymode="2" +querytype="protocol-valve" + ## Game Server Details # Do not edit gamename="Insurgency" diff --git a/lgsm/config-default/config-lgsm/inssserver/_default.cfg b/lgsm/config-default/config-lgsm/inssserver/_default.cfg index 80855fc13..fedd3b163 100644 --- a/lgsm/config-default/config-lgsm/inssserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/inssserver/_default.cfg @@ -135,6 +135,15 @@ steammaster="false" # 10: Teamspeak 3 stopmode="2" +## Query mode +# 1: session only +# 2: gamedig + gsquery +# 3: gamedig +# 4: gsquery +# 5: tcp +querymode="2" +querytype="protocol-valve" + ## Game Server Details # Do not edit gamename="Insurgency: Sandstorm" diff --git a/lgsm/config-default/config-lgsm/iosserver/_default.cfg b/lgsm/config-default/config-lgsm/iosserver/_default.cfg index 907ea3c77..94f7a90a2 100644 --- a/lgsm/config-default/config-lgsm/iosserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/iosserver/_default.cfg @@ -128,6 +128,15 @@ steammaster="false" # 10: Teamspeak 3 stopmode="3" +## Query mode +# 1: session only +# 2: gamedig + gsquery +# 3: gamedig +# 4: gsquery +# 5: tcp +querymode="2" +querytype="protocol-valve" + ## Game Server Details # Do not edit gamename="IOSoccer" diff --git a/lgsm/config-default/config-lgsm/jc2server/_default.cfg b/lgsm/config-default/config-lgsm/jc2server/_default.cfg index 24375440e..bf2f16043 100644 --- a/lgsm/config-default/config-lgsm/jc2server/_default.cfg +++ b/lgsm/config-default/config-lgsm/jc2server/_default.cfg @@ -120,6 +120,15 @@ steammaster="true" # 10: Teamspeak 3 stopmode="2" +## Query mode +# 1: session only +# 2: gamedig + gsquery +# 3: gamedig +# 4: gsquery +# 5: tcp +querymode="2" +querytype="jc2mp" + ## Game Server Details # Do not edit gamename="Just Cause 2" diff --git a/lgsm/config-default/config-lgsm/jc3server/_default.cfg b/lgsm/config-default/config-lgsm/jc3server/_default.cfg index d2c4cffd0..4dbbf5752 100644 --- a/lgsm/config-default/config-lgsm/jc3server/_default.cfg +++ b/lgsm/config-default/config-lgsm/jc3server/_default.cfg @@ -120,6 +120,15 @@ steammaster="false" # 10: Teamspeak 3 stopmode="2" +## Query mode +# 1: session only +# 2: gamedig + gsquery +# 3: gamedig +# 4: gsquery +# 5: tcp +querymode="2" +querytype="protocol-valve" + ## Game Server Details # Do not edit gamename="Just Cause 3" diff --git a/lgsm/config-default/config-lgsm/kf2server/_default.cfg b/lgsm/config-default/config-lgsm/kf2server/_default.cfg index 2f7e596cd..76cc4da40 100644 --- a/lgsm/config-default/config-lgsm/kf2server/_default.cfg +++ b/lgsm/config-default/config-lgsm/kf2server/_default.cfg @@ -126,6 +126,15 @@ steammaster="false" # 10: Teamspeak 3 stopmode="2" +## Query mode +# 1: session only +# 2: gamedig + gsquery +# 3: gamedig +# 4: gsquery +# 5: tcp +querymode="2" +querytype="protocol-valve" + ## Game Server Details # Do not edit gamename="Killing Floor 2" diff --git a/lgsm/config-default/config-lgsm/kfserver/_default.cfg b/lgsm/config-default/config-lgsm/kfserver/_default.cfg index b39060c77..53167ac42 100644 --- a/lgsm/config-default/config-lgsm/kfserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/kfserver/_default.cfg @@ -132,6 +132,15 @@ steammaster="false" # 10: Teamspeak 3 stopmode="2" +## Query mode +# 1: session only +# 2: gamedig + gsquery +# 3: gamedig +# 4: gsquery +# 5: tcp +querymode="2" +querytype="protocol-unreal2" + ## Game Server Details # Do not edit gamename="Killing Floor" diff --git a/lgsm/config-default/config-lgsm/l4d2server/_default.cfg b/lgsm/config-default/config-lgsm/l4d2server/_default.cfg index 0f7baddef..fe32362de 100644 --- a/lgsm/config-default/config-lgsm/l4d2server/_default.cfg +++ b/lgsm/config-default/config-lgsm/l4d2server/_default.cfg @@ -127,6 +127,15 @@ steammaster="false" # 10: Teamspeak 3 stopmode="3" +## Query mode +# 1: session only +# 2: gamedig + gsquery +# 3: gamedig +# 4: gsquery +# 5: tcp +querymode="2" +querytype="protocol-valve" + ## Game Server Details # Do not edit gamename="Left 4 Dead 2" diff --git a/lgsm/config-default/config-lgsm/l4dserver/_default.cfg b/lgsm/config-default/config-lgsm/l4dserver/_default.cfg index ef89de26c..333eecff0 100644 --- a/lgsm/config-default/config-lgsm/l4dserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/l4dserver/_default.cfg @@ -127,6 +127,15 @@ steammaster="false" # 10: Teamspeak 3 stopmode="2" +## Query mode +# 1: session only +# 2: gamedig + gsquery +# 3: gamedig +# 4: gsquery +# 5: tcp +querymode="2" +querytype="protocol-valve" + ## Game Server Details # Do not edit gamename="Left 4 Dead" diff --git a/lgsm/config-default/config-lgsm/mcserver/_default.cfg b/lgsm/config-default/config-lgsm/mcserver/_default.cfg index d351d9fc6..2592abae9 100644 --- a/lgsm/config-default/config-lgsm/mcserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/mcserver/_default.cfg @@ -114,6 +114,15 @@ sleeptime="0.5" # 10: Teamspeak 3 stopmode="5" +## Query mode +# 1: session only +# 2: gamedig + gsquery +# 3: gamedig +# 4: gsquery +# 5: tcp +querymode="2" +querytype="minecraft" + ## Game Server Details # Do not edit gamename="Minecraft" diff --git a/lgsm/config-default/config-lgsm/mhserver/_default.cfg b/lgsm/config-default/config-lgsm/mhserver/_default.cfg index 72e85d80e..dcb62846b 100644 --- a/lgsm/config-default/config-lgsm/mhserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/mhserver/_default.cfg @@ -128,6 +128,15 @@ steammaster="false" # 10: Teamspeak 3 stopmode="2" +## Query mode +# 1: session only +# 2: gamedig + gsquery +# 3: gamedig +# 4: gsquery +# 5: tcp +querymode="2" +querytype="protocol-valve" + ## Game Server Details # Do not edit gamename="MORDHAU" diff --git a/lgsm/config-default/config-lgsm/mohaaserver/_default.cfg b/lgsm/config-default/config-lgsm/mohaaserver/_default.cfg index 46c59e4fa..ef694b056 100644 --- a/lgsm/config-default/config-lgsm/mohaaserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/mohaaserver/_default.cfg @@ -114,6 +114,15 @@ sleeptime="0.5" # 10: Teamspeak 3 stopmode="3" +## Query mode +# 1: session only +# 2: gamedig + gsquery +# 3: gamedig +# 4: gsquery +# 5: tcp +querymode="2" +querytype="protocol-quake3" + ## Game Server Details # Do not edit gamename="Medal of Honor: Allied Assault" diff --git a/lgsm/config-default/config-lgsm/mtaserver/_default.cfg b/lgsm/config-default/config-lgsm/mtaserver/_default.cfg index cc73a9efb..6ceacf035 100644 --- a/lgsm/config-default/config-lgsm/mtaserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/mtaserver/_default.cfg @@ -8,6 +8,9 @@ #### Game Server Settings #### +## Server Start Settings | https://docs.linuxgsm.com/configuration/start-parameters +ip="0.0.0.0" + ## Server Start Command | https://docs.linuxgsm.com/configuration/start-parameters#additional-parameters # Edit with care fn_parms(){ @@ -110,6 +113,15 @@ sleeptime="0.5" # 10: Teamspeak 3 stopmode="4" +## Query mode +# 1: session only +# 2: gamedig + gsquery +# 3: gamedig +# 4: gsquery +# 5: tcp +querymode="3" +querytype="protocol-ase" + ## Game Server Details # Do not edit gamename="Multi Theft Auto" diff --git a/lgsm/config-default/config-lgsm/mumbleserver/_default.cfg b/lgsm/config-default/config-lgsm/mumbleserver/_default.cfg index 91f946aca..204099ad9 100644 --- a/lgsm/config-default/config-lgsm/mumbleserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/mumbleserver/_default.cfg @@ -113,6 +113,15 @@ sleeptime="0.5" # 10: Teamspeak 3 stopmode="2" +## Query mode +# 1: session only +# 2: gamedig + gsquery +# 3: gamedig +# 4: gsquery +# 5: tcp +querymode="2" +querytype="mumbleping" + ## Game Server Details # Do not edit gamename="Mumble" diff --git a/lgsm/config-default/config-lgsm/ndserver/_default.cfg b/lgsm/config-default/config-lgsm/ndserver/_default.cfg index 765257bc7..1ce879e7d 100644 --- a/lgsm/config-default/config-lgsm/ndserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/ndserver/_default.cfg @@ -128,6 +128,15 @@ steammaster="true" # 10: Teamspeak 3 stopmode="3" +## Query mode +# 1: session only +# 2: gamedig + gsquery +# 3: gamedig +# 4: gsquery +# 5: tcp +querymode="2" +querytype="protocol-valve" + ## Game Server Details # Do not edit gamename="Nuclear Dawn" diff --git a/lgsm/config-default/config-lgsm/nmrihserver/_default.cfg b/lgsm/config-default/config-lgsm/nmrihserver/_default.cfg index 9ca9fb8c6..1ebf4d83c 100644 --- a/lgsm/config-default/config-lgsm/nmrihserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/nmrihserver/_default.cfg @@ -133,6 +133,15 @@ steammaster="true" # 10: Teamspeak 3 stopmode="3" +## Query mode +# 1: session only +# 2: gamedig + gsquery +# 3: gamedig +# 4: gsquery +# 5: tcp +querymode="2" +querytype="protocol-valve" + ## Game Server Details # Do not edit gamename="No More Room in Hell" diff --git a/lgsm/config-default/config-lgsm/ns2cserver/_default.cfg b/lgsm/config-default/config-lgsm/ns2cserver/_default.cfg index f48479f70..083df023f 100644 --- a/lgsm/config-default/config-lgsm/ns2cserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/ns2cserver/_default.cfg @@ -135,6 +135,15 @@ steammaster="true" # 10: Teamspeak 3 stopmode="6" +## Query mode +# 1: session only +# 2: gamedig + gsquery +# 3: gamedig +# 4: gsquery +# 5: tcp +querymode="2" +querytype="protocol-valve" + ## Game Server Details # Do not edit gamename="NS2: Combat" diff --git a/lgsm/config-default/config-lgsm/ns2server/_default.cfg b/lgsm/config-default/config-lgsm/ns2server/_default.cfg index 86e8ab539..34f1958ae 100644 --- a/lgsm/config-default/config-lgsm/ns2server/_default.cfg +++ b/lgsm/config-default/config-lgsm/ns2server/_default.cfg @@ -139,6 +139,15 @@ steammaster="true" # 10: Teamspeak 3 stopmode="6" +## Query mode +# 1: session only +# 2: gamedig + gsquery +# 3: gamedig +# 4: gsquery +# 5: tcp +querymode="2" +querytype="protocol-valve" + ## Game Server Details # Do not edit gamename="Natural Selection 2" diff --git a/lgsm/config-default/config-lgsm/nsserver/_default.cfg b/lgsm/config-default/config-lgsm/nsserver/_default.cfg index e72834f72..3e02c5f5f 100644 --- a/lgsm/config-default/config-lgsm/nsserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/nsserver/_default.cfg @@ -128,6 +128,15 @@ steammaster="true" # 10: Teamspeak 3 stopmode="9" +## Query mode +# 1: session only +# 2: gamedig + gsquery +# 3: gamedig +# 4: gsquery +# 5: tcp +querymode="2" +querytype="protocol-valve" + ## Game Server Details # Do not edit gamename="Natural Selection" diff --git a/lgsm/config-default/config-lgsm/opforserver/_default.cfg b/lgsm/config-default/config-lgsm/opforserver/_default.cfg index 687eb4de4..9b4d9d9e5 100644 --- a/lgsm/config-default/config-lgsm/opforserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/opforserver/_default.cfg @@ -128,6 +128,15 @@ steammaster="true" # 10: Teamspeak 3 stopmode="9" +## Query mode +# 1: session only +# 2: gamedig + gsquery +# 3: gamedig +# 4: gsquery +# 5: tcp +querymode="2" +querytype="protocol-valve" + ## Game Server Details # Do not edit gamename="Half-Life: Opposing Force" diff --git a/lgsm/config-default/config-lgsm/pcserver/_default.cfg b/lgsm/config-default/config-lgsm/pcserver/_default.cfg index e6e63d677..f1d633e6a 100644 --- a/lgsm/config-default/config-lgsm/pcserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/pcserver/_default.cfg @@ -120,6 +120,15 @@ steammaster="false" # 10: Teamspeak 3 stopmode="2" +## Query mode +# 1: session only +# 2: gamedig + gsquery +# 3: gamedig +# 4: gsquery +# 5: tcp +querymode="2" +querytype="protocol-valve" + ## Game Server Details # Do not edit gamename="Project Cars" diff --git a/lgsm/config-default/config-lgsm/pstbsserver/_default.cfg b/lgsm/config-default/config-lgsm/pstbsserver/_default.cfg index f9312a1cf..ddb0a5da8 100644 --- a/lgsm/config-default/config-lgsm/pstbsserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/pstbsserver/_default.cfg @@ -129,6 +129,15 @@ steammaster="false" # 10: Teamspeak 3 stopmode="2" +## Query mode +# 1: session only +# 2: gamedig + gsquery +# 3: gamedig +# 4: gsquery +# 5: tcp +querymode="2" +querytype="protocol-valve" + ## Game Server Details # Do not edit gamename="pstbsserver" diff --git a/lgsm/config-default/config-lgsm/pvkiiserver/_default.cfg b/lgsm/config-default/config-lgsm/pvkiiserver/_default.cfg index 2e668ad5f..8d4e2105c 100644 --- a/lgsm/config-default/config-lgsm/pvkiiserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/pvkiiserver/_default.cfg @@ -128,6 +128,15 @@ steammaster="true" # 10: Teamspeak 3 stopmode="3" +## Query mode +# 1: session only +# 2: gamedig + gsquery +# 3: gamedig +# 4: gsquery +# 5: tcp +querymode="2" +querytype="protocol-valve" + ## Game Server Details # Do not edit gamename="Pirates, Vikings, and Knights II" diff --git a/lgsm/config-default/config-lgsm/pzserver/_default.cfg b/lgsm/config-default/config-lgsm/pzserver/_default.cfg index bd0002893..756945cf2 100644 --- a/lgsm/config-default/config-lgsm/pzserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/pzserver/_default.cfg @@ -123,6 +123,15 @@ steammaster="false" # 10: Teamspeak 3 stopmode="3" +## Query mode +# 1: session only +# 2: gamedig + gsquery +# 3: gamedig +# 4: gsquery +# 5: tcp +querymode="2" +querytype="protocol-valve" + ## Game Server Details # Do not edit gamename="Project Zomboid" diff --git a/lgsm/config-default/config-lgsm/q2server/_default.cfg b/lgsm/config-default/config-lgsm/q2server/_default.cfg index df37bc470..afe4e0f1e 100644 --- a/lgsm/config-default/config-lgsm/q2server/_default.cfg +++ b/lgsm/config-default/config-lgsm/q2server/_default.cfg @@ -114,6 +114,15 @@ sleeptime="0.5" # 10: Teamspeak 3 stopmode="3" +## Query mode +# 1: session only +# 2: gamedig + gsquery +# 3: gamedig +# 4: gsquery +# 5: tcp +querymode="2" +querytype="protocol-quake2" + ## Game Server Details # Do not edit gamename="Quake 2" diff --git a/lgsm/config-default/config-lgsm/q3server/_default.cfg b/lgsm/config-default/config-lgsm/q3server/_default.cfg index 5ba4134c0..68791bb60 100644 --- a/lgsm/config-default/config-lgsm/q3server/_default.cfg +++ b/lgsm/config-default/config-lgsm/q3server/_default.cfg @@ -114,6 +114,15 @@ sleeptime="0.5" # 10: Teamspeak 3 stopmode="3" +## Query mode +# 1: session only +# 2: gamedig + gsquery +# 3: gamedig +# 4: gsquery +# 5: tcp +querymode="2" +querytype="protocol-quake3" + ## Game Server Details # Do not edit gamename="Quake 3: Arena" diff --git a/lgsm/config-default/config-lgsm/qlserver/_default.cfg b/lgsm/config-default/config-lgsm/qlserver/_default.cfg index 3e3c30f80..5391c5976 100644 --- a/lgsm/config-default/config-lgsm/qlserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/qlserver/_default.cfg @@ -122,6 +122,15 @@ steammaster="true" # 10: Teamspeak 3 stopmode="3" +## Query mode +# 1: session only +# 2: gamedig + gsquery +# 3: gamedig +# 4: gsquery +# 5: tcp +querymode="2" +querytype="protocol-valve" + ## Game Server Details # Do not edit gamename="Quake Live" diff --git a/lgsm/config-default/config-lgsm/qwserver/_default.cfg b/lgsm/config-default/config-lgsm/qwserver/_default.cfg index 236ad0bb4..6f2f41157 100644 --- a/lgsm/config-default/config-lgsm/qwserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/qwserver/_default.cfg @@ -113,6 +113,15 @@ sleeptime="0.5" # 10: Teamspeak 3 stopmode="3" +## Query mode +# 1: session only +# 2: gamedig + gsquery +# 3: gamedig +# 4: gsquery +# 5: tcp +querymode="2" +querytype="protocol-quake1" + ## Game Server Details # Do not edit gamename="QuakeWorld" diff --git a/lgsm/config-default/config-lgsm/ricochetserver/_default.cfg b/lgsm/config-default/config-lgsm/ricochetserver/_default.cfg index 0d6ef56cc..6a688c835 100644 --- a/lgsm/config-default/config-lgsm/ricochetserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/ricochetserver/_default.cfg @@ -128,6 +128,15 @@ steammaster="true" # 10: Teamspeak 3 stopmode="9" +## Query mode +# 1: session only +# 2: gamedig + gsquery +# 3: gamedig +# 4: gsquery +# 5: tcp +querymode="2" +querytype="protocol-valve" + ## Game Server Details # Do not edit gamename="Ricochet" diff --git a/lgsm/config-default/config-lgsm/roserver/_default.cfg b/lgsm/config-default/config-lgsm/roserver/_default.cfg index a13d199f5..7a65a0d67 100644 --- a/lgsm/config-default/config-lgsm/roserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/roserver/_default.cfg @@ -128,6 +128,15 @@ steammaster="false" # 10: Teamspeak 3 stopmode="2" +## Query mode +# 1: session only +# 2: gamedig + gsquery +# 3: gamedig +# 4: gsquery +# 5: tcp +querymode="2" +querytype="protocol-unreal2" + ## Game Server Details # Do not edit gamename="Red Orchestra: Ostfront 41-45" diff --git a/lgsm/config-default/config-lgsm/rtcwserver/_default.cfg b/lgsm/config-default/config-lgsm/rtcwserver/_default.cfg index 8ded966d0..32ce55ab1 100644 --- a/lgsm/config-default/config-lgsm/rtcwserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/rtcwserver/_default.cfg @@ -114,6 +114,15 @@ sleeptime="0.5" # 10: Teamspeak 3 stopmode="3" +## Query mode +# 1: session only +# 2: gamedig + gsquery +# 3: gamedig +# 4: gsquery +# 5: tcp +querymode="2" +querytype="protocol-quake3" + ## Game Server Details # Do not edit gamename="Return to Castle Wolfenstein" diff --git a/lgsm/config-default/config-lgsm/rustserver/_default.cfg b/lgsm/config-default/config-lgsm/rustserver/_default.cfg index 9f4448c29..dff675e15 100644 --- a/lgsm/config-default/config-lgsm/rustserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/rustserver/_default.cfg @@ -121,7 +121,7 @@ logdays="7" ## Monitor | https://docs.linuxgsm.com/commands/monitor # Query delay time -querydelay="1" +querydelay="5" ## ANSI Colors | https://docs.linuxgsm.com/features/ansi-colors ansi="on" @@ -152,6 +152,15 @@ steammaster="false" # 10: Teamspeak 3 stopmode="2" +## Query mode +# 1: session only +# 2: gamedig + gsquery +# 3: gamedig +# 4: gsquery +# 5: tcp +querymode="2" +querytype="protocol-valve" + ## Game Server Details # Do not edit gamename="Rust" diff --git a/lgsm/config-default/config-lgsm/rwserver/_default.cfg b/lgsm/config-default/config-lgsm/rwserver/_default.cfg index 0e35395d0..c4eec91d9 100644 --- a/lgsm/config-default/config-lgsm/rwserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/rwserver/_default.cfg @@ -123,6 +123,15 @@ steammaster="false" # 10: Teamspeak 3 stopmode="3" +## Query mode +# 1: session only +# 2: gamedig + gsquery +# 3: gamedig +# 4: gsquery +# 5: tcp +querymode="1" +querytype="" + ## Game Server Details # Do not edit gamename="Rising World" diff --git a/lgsm/config-default/config-lgsm/sampserver/_default.cfg b/lgsm/config-default/config-lgsm/sampserver/_default.cfg index 1a56bf6ab..c8f90817c 100644 --- a/lgsm/config-default/config-lgsm/sampserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/sampserver/_default.cfg @@ -113,6 +113,15 @@ sleeptime="0.5" # 10: Teamspeak 3 stopmode="2" +## Query mode +# 1: session only +# 2: gamedig + gsquery +# 3: gamedig +# 4: gsquery +# 5: tcp +querymode="3" +querytype="samp" + ## Game Server Details # Do not edit gamename="San Andreas Multiplayer" @@ -127,6 +136,7 @@ systemdir="${serverfiles}" executabledir="${systemdir}/samp03" executable="./samp03svr" servercfg="server.cfg" +servercfgdefault="server.cfg" servercfgdir="${systemdir}/samp03" servercfgfullpath="${servercfgdir}/${servercfg}" diff --git a/lgsm/config-default/config-lgsm/sbotsserver/_default.cfg b/lgsm/config-default/config-lgsm/sbotsserver/_default.cfg index 94acb175d..b71f3aae7 100644 --- a/lgsm/config-default/config-lgsm/sbotsserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/sbotsserver/_default.cfg @@ -125,6 +125,15 @@ steammaster="false" # 10: Teamspeak 3 stopmode="2" +## Query mode +# 1: session only +# 2: gamedig + gsquery +# 3: gamedig +# 4: gsquery +# 5: tcp +querymode="2" +querytype="protocol-valve" + ## Game Server Details # Do not edit gamename="StickyBots" diff --git a/lgsm/config-default/config-lgsm/sbserver/_default.cfg b/lgsm/config-default/config-lgsm/sbserver/_default.cfg index 61598be97..46a671ae6 100644 --- a/lgsm/config-default/config-lgsm/sbserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/sbserver/_default.cfg @@ -126,6 +126,15 @@ steammaster="flase" # 10: Teamspeak 3 stopmode="2" +## Query mode +# 1: session only +# 2: gamedig + gsquery +# 3: gamedig +# 4: gsquery +# 5: tcp +querymode="2" +querytype="protocol-valve" + ## Game Server Details # Do not edit gamename="Starbound" diff --git a/lgsm/config-default/config-lgsm/sdtdserver/_default.cfg b/lgsm/config-default/config-lgsm/sdtdserver/_default.cfg index 00eaf0fe4..edc437b70 100644 --- a/lgsm/config-default/config-lgsm/sdtdserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/sdtdserver/_default.cfg @@ -123,6 +123,15 @@ steammaster="true" # 10: Teamspeak 3 stopmode="8" +## Query mode +# 1: session only +# 2: gamedig + gsquery +# 3: gamedig +# 4: gsquery +# 5: tcp +querymode="2" +querytype="protocol-valve" + ## Game Server Details # Do not edit gamename="7 Days To Die" diff --git a/lgsm/config-default/config-lgsm/sfcserver/_default.cfg b/lgsm/config-default/config-lgsm/sfcserver/_default.cfg index 798a23858..7f9b14dac 100644 --- a/lgsm/config-default/config-lgsm/sfcserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/sfcserver/_default.cfg @@ -128,6 +128,15 @@ steammaster="true" # 10: Teamspeak 3 stopmode="3" +## Query mode +# 1: session only +# 2: gamedig + gsquery +# 3: gamedig +# 4: gsquery +# 5: tcp +querymode="2" +querytype="protocol-valve" + ## Game Server Details # Do not edit gamename="SourceForts Classic" diff --git a/lgsm/config-default/config-lgsm/sof2server/_default.cfg b/lgsm/config-default/config-lgsm/sof2server/_default.cfg index 4fa965da1..5458032c4 100644 --- a/lgsm/config-default/config-lgsm/sof2server/_default.cfg +++ b/lgsm/config-default/config-lgsm/sof2server/_default.cfg @@ -114,6 +114,15 @@ sleeptime="0.5" # 10: Teamspeak 3 stopmode="3" +## Query mode +# 1: session only +# 2: gamedig + gsquery +# 3: gamedig +# 4: gsquery +# 5: tcp +querymode="2" +querytype="protocol-quake3" + ## Game Server Details # Do not edit gamename="Soldier Of Fortune 2: Gold Edition" diff --git a/lgsm/config-default/config-lgsm/solserver/_default.cfg b/lgsm/config-default/config-lgsm/solserver/_default.cfg index beab68507..0090508b5 100644 --- a/lgsm/config-default/config-lgsm/solserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/solserver/_default.cfg @@ -115,6 +115,15 @@ sleeptime="0.5" # 10: Teamspeak 3 stopmode="2" +## Query mode +# 1: session only +# 2: gamedig + gsquery +# 3: gamedig +# 4: gsquery +# 5: tcp +querymode="5" +querytype="" + ## Game Server Details # Do not edit gamename="Soldat" diff --git a/lgsm/config-default/config-lgsm/squadserver/_default.cfg b/lgsm/config-default/config-lgsm/squadserver/_default.cfg index 6c58cee6c..2a37e0ead 100644 --- a/lgsm/config-default/config-lgsm/squadserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/squadserver/_default.cfg @@ -125,6 +125,15 @@ steammaster="false" # 10: Teamspeak 3 stopmode="2" +## Query mode +# 1: session only +# 2: gamedig + gsquery +# 3: gamedig +# 4: gsquery +# 5: tcp +querymode="2" +querytype="protocol-valve" + ## Game Server Details # Do not edit gamename="Squad" diff --git a/lgsm/config-default/config-lgsm/ss3server/_default.cfg b/lgsm/config-default/config-lgsm/ss3server/_default.cfg index f0bb3a55c..ebede1b84 100644 --- a/lgsm/config-default/config-lgsm/ss3server/_default.cfg +++ b/lgsm/config-default/config-lgsm/ss3server/_default.cfg @@ -124,6 +124,15 @@ steammaster="false" # 10: Teamspeak 3 stopmode="2" +## Query mode +# 1: session only +# 2: gamedig + gsquery +# 3: gamedig +# 4: gsquery +# 5: tcp +querymode="2" +querytype="protocol-valve" + ## Game Server Details # Do not edit gamename="Serious Sam 3: BFE" diff --git a/lgsm/config-default/config-lgsm/stserver/_default.cfg b/lgsm/config-default/config-lgsm/stserver/_default.cfg index 4c990b3b2..b5a3e5af0 100644 --- a/lgsm/config-default/config-lgsm/stserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/stserver/_default.cfg @@ -130,6 +130,15 @@ steammaster="false" # 10: Teamspeak 3 stopmode="2" +## Query mode +# 1: session only +# 2: gamedig + gsquery +# 3: gamedig +# 4: gsquery +# 5: tcp +querymode="2" +querytype="protocol-valve" + ## Game Server Details # Do not edit gamename="Stationeers" diff --git a/lgsm/config-default/config-lgsm/svenserver/_default.cfg b/lgsm/config-default/config-lgsm/svenserver/_default.cfg index 570af640f..b495c852a 100644 --- a/lgsm/config-default/config-lgsm/svenserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/svenserver/_default.cfg @@ -127,6 +127,15 @@ steammaster="true" # 10: Teamspeak 3 stopmode="9" +## Query mode +# 1: session only +# 2: gamedig + gsquery +# 3: gamedig +# 4: gsquery +# 5: tcp +querymode="2" +querytype="protocol-valve" + ## Game Server Details # Do not edit gamename="Sven Co-op" diff --git a/lgsm/config-default/config-lgsm/terrariaserver/_default.cfg b/lgsm/config-default/config-lgsm/terrariaserver/_default.cfg index dccd03d65..3dbcaa100 100644 --- a/lgsm/config-default/config-lgsm/terrariaserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/terrariaserver/_default.cfg @@ -127,6 +127,15 @@ steammaster="false" # 10: Teamspeak 3 stopmode="7" +## Query mode +# 1: session only +# 2: gamedig + gsquery +# 3: gamedig +# 4: gsquery +# 5: tcp +querymode="5" +querytype="" + ## Game Server Details # Do not edit gamename="Terraria" diff --git a/lgsm/config-default/config-lgsm/tf2server/_default.cfg b/lgsm/config-default/config-lgsm/tf2server/_default.cfg index a7ba38d99..29ce24de0 100644 --- a/lgsm/config-default/config-lgsm/tf2server/_default.cfg +++ b/lgsm/config-default/config-lgsm/tf2server/_default.cfg @@ -133,6 +133,15 @@ steammaster="true" # 10: Teamspeak 3 stopmode="3" +## Query mode +# 1: session only +# 2: gamedig + gsquery +# 3: gamedig +# 4: gsquery +# 5: tcp +querymode="2" +querytype="protocol-valve" + ## Game Server Details # Do not edit gamename="Team Fortress 2" diff --git a/lgsm/config-default/config-lgsm/tfcserver/_default.cfg b/lgsm/config-default/config-lgsm/tfcserver/_default.cfg index 0f8029e2c..ad7a9dfb1 100644 --- a/lgsm/config-default/config-lgsm/tfcserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/tfcserver/_default.cfg @@ -128,6 +128,15 @@ steammaster="true" # 10: Teamspeak 3 stopmode="9" +## Query mode +# 1: session only +# 2: gamedig + gsquery +# 3: gamedig +# 4: gsquery +# 5: tcp +querymode="2" +querytype="protocol-valve" + ## Game Server Details # Do not edit gamename="Team Fortress Classic" diff --git a/lgsm/config-default/config-lgsm/ts3server/_default.cfg b/lgsm/config-default/config-lgsm/ts3server/_default.cfg index 57a421e22..a92414e54 100644 --- a/lgsm/config-default/config-lgsm/ts3server/_default.cfg +++ b/lgsm/config-default/config-lgsm/ts3server/_default.cfg @@ -115,6 +115,15 @@ sleeptime="0.5" # 10: Teamspeak 3 stopmode="2" +## Query mode +# 1: session only +# 2: gamedig + gsquery +# 3: gamedig +# 4: gsquery +# 5: tcp +querymode="5" +querytype="" + ## Game Server Details # Do not edit gamename="TeamSpeak 3" diff --git a/lgsm/config-default/config-lgsm/tsserver/_default.cfg b/lgsm/config-default/config-lgsm/tsserver/_default.cfg index 2ef118a13..d1b1cc813 100644 --- a/lgsm/config-default/config-lgsm/tsserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/tsserver/_default.cfg @@ -128,6 +128,15 @@ steammaster="true" # 10: Teamspeak 3 stopmode="9" +## Query mode +# 1: session only +# 2: gamedig + gsquery +# 3: gamedig +# 4: gsquery +# 5: tcp +querymode="2" +querytype="protocol-valve" + ## Game Server Details # Do not edit gamename="The Specialists" diff --git a/lgsm/config-default/config-lgsm/tuserver/_default.cfg b/lgsm/config-default/config-lgsm/tuserver/_default.cfg index ac13bdf46..9536d9fe5 100644 --- a/lgsm/config-default/config-lgsm/tuserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/tuserver/_default.cfg @@ -130,6 +130,15 @@ steammaster="false" # 10: Teamspeak 3 stopmode="2" +## Query mode +# 1: session only +# 2: gamedig + gsquery +# 3: gamedig +# 4: gsquery +# 5: tcp +querymode="2" +querytype="protocol-valve" + ## Game Server Details # Do not edit gamename="Tower Unite" diff --git a/lgsm/config-default/config-lgsm/twserver/_default.cfg b/lgsm/config-default/config-lgsm/twserver/_default.cfg index b0d082566..c5be7b248 100644 --- a/lgsm/config-default/config-lgsm/twserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/twserver/_default.cfg @@ -127,6 +127,15 @@ steammaster="false" # 10: Teamspeak 3 stopmode="2" +## Query mode +# 1: session only +# 2: gamedig + gsquery +# 3: gamedig +# 4: gsquery +# 5: tcp +querymode="4" +querytype="teeworlds" + ## Game Server Details # Do not edit gamename="Teeworlds" diff --git a/lgsm/config-default/config-lgsm/untserver/_default.cfg b/lgsm/config-default/config-lgsm/untserver/_default.cfg index b4fc532de..7ab5da558 100644 --- a/lgsm/config-default/config-lgsm/untserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/untserver/_default.cfg @@ -130,6 +130,15 @@ steammaster="false" # 10: Teamspeak 3 stopmode="2" +## Query mode +# 1: session only +# 2: gamedig + gsquery +# 3: gamedig +# 4: gsquery +# 5: tcp +querymode="2" +querytype="protocol-valve" + ## Game Server Details # Do not edit gamename="Unturned" diff --git a/lgsm/config-default/config-lgsm/ut2k4server/_default.cfg b/lgsm/config-default/config-lgsm/ut2k4server/_default.cfg index d288c985a..c8a84bf6a 100644 --- a/lgsm/config-default/config-lgsm/ut2k4server/_default.cfg +++ b/lgsm/config-default/config-lgsm/ut2k4server/_default.cfg @@ -113,6 +113,15 @@ sleeptime="0.5" # 10: Teamspeak 3 stopmode="2" +## Query mode +# 1: session only +# 2: gamedig + gsquery +# 3: gamedig +# 4: gsquery +# 5: tcp +querymode="2" +querytype="protocol-unreal2" + ## Game Server Details # Do not edit gamename="Unreal Tournament 2004" diff --git a/lgsm/config-default/config-lgsm/ut3server/_default.cfg b/lgsm/config-default/config-lgsm/ut3server/_default.cfg index 831e41699..59e714649 100644 --- a/lgsm/config-default/config-lgsm/ut3server/_default.cfg +++ b/lgsm/config-default/config-lgsm/ut3server/_default.cfg @@ -124,6 +124,15 @@ sleeptime="0.5" # 10: Teamspeak 3 stopmode="2" +## Query mode +# 1: session only +# 2: gamedig + gsquery +# 3: gamedig +# 4: gsquery +# 5: tcp +querymode="1" +querytype="" + ## Game Server Details # Do not edit gamename="Unreal Tournament 3" diff --git a/lgsm/config-default/config-lgsm/ut99server/_default.cfg b/lgsm/config-default/config-lgsm/ut99server/_default.cfg index be962bd5f..69e6348ae 100644 --- a/lgsm/config-default/config-lgsm/ut99server/_default.cfg +++ b/lgsm/config-default/config-lgsm/ut99server/_default.cfg @@ -113,6 +113,15 @@ sleeptime="0.5" # 10: Teamspeak 3 stopmode="2" +## Query mode +# 1: session only +# 2: gamedig + gsquery +# 3: gamedig +# 4: gsquery +# 5: tcp +querymode="2" +querytype="protocol-unreal2" + ## Game Server Details # Do not edit gamename="Unreal Tournament 99" diff --git a/lgsm/config-default/config-lgsm/utserver/_default.cfg b/lgsm/config-default/config-lgsm/utserver/_default.cfg index 93da95e79..76e95307a 100644 --- a/lgsm/config-default/config-lgsm/utserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/utserver/_default.cfg @@ -117,6 +117,15 @@ sleeptime="0.5" # 10: Teamspeak 3 stopmode="2" +## Query mode +# 1: session only +# 2: gamedig + gsquery +# 3: gamedig +# 4: gsquery +# 5: tcp +querymode="1" +querytype="" + ## Game Server Details # Do not edit gamename="Unreal Tournament" diff --git a/lgsm/config-default/config-lgsm/vsserver/_default.cfg b/lgsm/config-default/config-lgsm/vsserver/_default.cfg index 5c8d7be3f..aff533e96 100644 --- a/lgsm/config-default/config-lgsm/vsserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/vsserver/_default.cfg @@ -128,6 +128,15 @@ steammaster="true" # 10: Teamspeak 3 stopmode="9" +## Query mode +# 1: session only +# 2: gamedig + gsquery +# 3: gamedig +# 4: gsquery +# 5: tcp +querymode="2" +querytype="protocol-valve" + ## Game Server Details # Do not edit gamename="Vampire Slayer" diff --git a/lgsm/config-default/config-lgsm/wetserver/_default.cfg b/lgsm/config-default/config-lgsm/wetserver/_default.cfg index 1be0a0eeb..15fb9c33a 100644 --- a/lgsm/config-default/config-lgsm/wetserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/wetserver/_default.cfg @@ -109,6 +109,15 @@ sleeptime="0.5" # 10: Teamspeak 3 stopmode="3" +## Query mode +# 1: session only +# 2: gamedig + gsquery +# 3: gamedig +# 4: gsquery +# 5: tcp +querymode="2" +querytype="protocol-quake3" + ## Game Server Details # Do not edit gamename="Wolfenstein: Enemy Territory" diff --git a/lgsm/config-default/config-lgsm/wfserver/_default.cfg b/lgsm/config-default/config-lgsm/wfserver/_default.cfg index 76711d429..416df6bd1 100644 --- a/lgsm/config-default/config-lgsm/wfserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/wfserver/_default.cfg @@ -114,6 +114,15 @@ sleeptime="0.5" # 10: Teamspeak 3 stopmode="3" +## Query mode +# 1: session only +# 2: gamedig + gsquery +# 3: gamedig +# 4: gsquery +# 5: tcp +querymode="2" +querytype="protocol-quake3" + ## SteamCMD Settings | https://docs.linuxgsm.com/steamcmd # Server appid appid="1136510" diff --git a/lgsm/config-default/config-lgsm/wurmserver/_default.cfg b/lgsm/config-default/config-lgsm/wurmserver/_default.cfg index ccb18181b..504b551a3 100644 --- a/lgsm/config-default/config-lgsm/wurmserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/wurmserver/_default.cfg @@ -119,6 +119,15 @@ steammaster="false" # 10: Teamspeak 3 stopmode="2" +## Query mode +# 1: session only +# 2: gamedig + gsquery +# 3: gamedig +# 4: gsquery +# 5: tcp +querymode="2" +querytype="protocol-valve" + ## Game Server Details # Do not edit gamename="Wurm Unlimited" diff --git a/lgsm/config-default/config-lgsm/zmrserver/_default.cfg b/lgsm/config-default/config-lgsm/zmrserver/_default.cfg index a5f1f83f0..b62905205 100644 --- a/lgsm/config-default/config-lgsm/zmrserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/zmrserver/_default.cfg @@ -128,6 +128,15 @@ steammaster="true" # 10: Teamspeak 3 stopmode="3" +## Query mode +# 1: session only +# 2: gamedig + gsquery +# 3: gamedig +# 4: gsquery +# 5: tcp +querymode="2" +querytype="protocol-valve" + ## Game Server Details # Do not edit gamename="Zombie Master: Reborn" diff --git a/lgsm/config-default/config-lgsm/zpsserver/_default.cfg b/lgsm/config-default/config-lgsm/zpsserver/_default.cfg index 61991f3b8..0d216e319 100644 --- a/lgsm/config-default/config-lgsm/zpsserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/zpsserver/_default.cfg @@ -133,6 +133,15 @@ steammaster="true" # 10: Teamspeak 3 stopmode="3" +## Query mode +# 1: session only +# 2: gamedig + gsquery +# 3: gamedig +# 4: gsquery +# 5: tcp +querymode="2" +querytype="protocol-valve" + ## Game Server Details # Do not edit gamename="Zombie Panic! Source" diff --git a/lgsm/data/serverlist.csv b/lgsm/data/serverlist.csv index 60c02feff..278294951 100644 --- a/lgsm/data/serverlist.csv +++ b/lgsm/data/serverlist.csv @@ -1,43 +1,43 @@ ahl,ahlserver,Action half-life ahl2,ahl2server,Action: Source -arma3,arma3server,ARMA 3 -sdtd,sdtdserver,7 Days to Die ark,arkserver,ARK: Survival Evolved -bo,boserver,Ballistic Overkill -bf1942,bf1942server,Battlefield 1942 +arma3,arma3server,ARMA 3 +bb,bbserver,BrainBread +bb2,bb2server,BrainBread 2 bd,bdserver,Base Defense +bf1942,bf1942server,Battlefield 1942 bmdm,bmdmserver,Black Mesa: Deathmatch +bo,boserver,Ballistic Overkill bs,bsserver,Blade Symphony -bb,bbserver,BrainBread -bb2,bb2server,BrainBread 2 bt,btserver,Barotrauma bt1944,bt1944server,Battalion 1944 +cc,ccserver,Codename CURE 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 +dab,dabserver,Double Action: Boogaloo +dmc,dmcserver,Deathmatch Classic 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 dys,dysserver,Dystopia eco,ecoserver,Eco em,emserver,Empires Mod +etl,etlserver,ET: Legacy fctr,fctrserver,Factorio fof,fofserver,Fistful of Frags -gmod,gmodserver,Garrys Mod ges,gesserver,GoldenEye: Source +gmod,gmodserver,Garrys Mod hl2dm,hl2dmserver,Half-Life 2: Deathmatch -hldms,hldmsserver,Half-Life Deathmatch: Source hldm,hldmserver,Half-Life: Deathmatch +hldms,hldmsserver,Half-Life Deathmatch: Source hw,hwserver,Hurtworld ins,insserver,Insurgency inss,inssserver,Insurgency: Sandstorm @@ -59,44 +59,44 @@ ns,nsserver,Natural Selection ns2,ns2server,Natural Selection 2 ns2c,ns2cserver,NS2: Combat opfor,opforserver,Opposing Force +pc,pcserver,Project Cars pstbs,pstbsserver,Post Scriptum: The Bloody Seventh 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 +ro,roserver,Red Orchestra: Ostfront 41-45 rtcw,rtcwserver,Return to Castle Wolfenstein rust,rustserver,Rust -rw,rwserver, Rising World +rw,rwserver,Rising World samp,sampserver,San Andreas Multiplayer -sbots,sbotsserver, StickyBots +sb,sbserver,Starbound +sbots,sbotsserver,StickyBots +sdtd,sdtdserver,7 Days to Die sfc,sfcserver,SourceForts Classic sof2,sof2server,Soldier Of Fortune 2: Gold Edition sol,solserver,Soldat +squad,squadserver,Squad ss3,ss3server,Serious Sam 3: BFE -sb,sbserver,Starbound st,stserver,Stationeers -squad,squadserver,Squad sven,svenserver,Sven Co-op +terraria,terrariaserver,Terraria tf2,tf2server,Team Fortress 2 tfc,tfcserver,Team Fortress Classic ts,tsserver,The Specialists ts3,ts3server,Teamspeak 3 -tw,twserver,Teeworlds -terraria,terrariaserver,Terraria tu,tuserver,Tower Unite +tw,twserver,Teeworlds +unt,untserver,Unturned ut2k4,ut2k4server,Unreal Tournament 2004 ut3,ut3server,Unreal Tournament 3 ut99,ut99server,Unreal Tournament 99 -unt,untserver,Unturned vs,vsserver,Vampire Slayer wet,wetserver,Wolfenstein: Enemy Territory wf,wfserver,Warfork wurm,wurmserver,Wurm Unlimited -etl,etlserver,ET: Legacy zmr,zmrserver,Zombie Master: Reborn zps,zpsserver,Zombie Panic! Source diff --git a/lgsm/functions/alert.sh b/lgsm/functions/alert.sh index 510e47341..cb07a6fdd 100644 --- a/lgsm/functions/alert.sh +++ b/lgsm/functions/alert.sh @@ -98,7 +98,7 @@ fn_alert_log # Generates the more info link. if [ "${postalert}" == "on" ]&&[ -n "${postalert}" ]; then - alertflag=1 + exitbypass=1 command_postdetails.sh elif [ "${postalert}" != "on" ]&&[ "${function_selfname}" == "command_test_alert.sh" ]; then fn_print_warn_nl "More Info not enabled" diff --git a/lgsm/functions/check_deps.sh b/lgsm/functions/check_deps.sh index 4cabd78a9..e2e5d5139 100644 --- a/lgsm/functions/check_deps.sh +++ b/lgsm/functions/check_deps.sh @@ -389,7 +389,7 @@ fn_deps_build_debian(){ elif [ "${shortname}" == "hw" ]||[ "${shortname}" == "rust" ]; then array_deps_required+=( lib32z1 ) # Minecraft - elif [ "${shortname}" == "mc" ]; then + elif [ "${shortname}" == "mc" ]||[ "${shortname}" == "rw" ]||[ "${shortname}" == "pz" ]; then javaversion=$(java -version 2>&1 | grep "version") if [ "${javaversion}" ]; then # Added for users using Oracle JRE to bypass the check. @@ -508,18 +508,8 @@ fn_deps_build_redhat(){ array_deps_required+=( xz ) elif [ "${shortname}" == "hw" ]||[ "${shortname}" == "rust" ]; then array_deps_required+=( zlib-devel ) - # Minecraft - elif [ "${shortname}" == "mc" ]; then - javaversion=$(java -version 2>&1 | grep "version") - if [ "${javaversion}" ]; then - # Added for users using Oracle JRE to bypass the check. - javacheck=1 - array_deps_required+=( rng-tools ) - else - array_deps_required+=( java-1.8.0-openjdk rng-tools ) - fi - # Project Zomboid - elif [ "${shortname}" == "pz" ]; then + # Minecraft, Project Zomboid, Rising World + elif [ "${shortname}" == "mc" ]||[ "${shortname}" == "rw" ]||[ "${shortname}" == "pz" ]; then javaversion=$(java -version 2>&1 | grep "version") if [ "${javaversion}" ]; then # Added for users using Oracle JRE to bypass the check. diff --git a/lgsm/functions/check_ip.sh b/lgsm/functions/check_ip.sh index b54dddd16..646a6899f 100644 --- a/lgsm/functions/check_ip.sh +++ b/lgsm/functions/check_ip.sh @@ -7,7 +7,7 @@ local commandname="CHECK" -if [ "${shortname}" != "ts3" ]&&[ "${shortname}" != "mumble" ]&&[ "${travistest}" != "1" ]; then +if [ "${travistest}" != "1" ]; then if [ ! -f "/bin/ip" ]; then ipcommand="/sbin/ip" else diff --git a/lgsm/functions/command_backup.sh b/lgsm/functions/command_backup.sh index 91f856809..749b024df 100644 --- a/lgsm/functions/command_backup.sh +++ b/lgsm/functions/command_backup.sh @@ -267,4 +267,5 @@ fn_backup_migrate_olddir fn_backup_compression fn_backup_prune fn_backup_start_server + core_exit.sh diff --git a/lgsm/functions/command_debug.sh b/lgsm/functions/command_debug.sh index 5b3629844..74fe7f7b1 100644 --- a/lgsm/functions/command_debug.sh +++ b/lgsm/functions/command_debug.sh @@ -123,4 +123,5 @@ fn_print_dots "Stopping debug" fn_print_ok_nl "Stopping debug" # remove trap. trap - INT + core_exit.sh diff --git a/lgsm/functions/command_details.sh b/lgsm/functions/command_details.sh index 6e4e8fecc..43fc463d8 100644 --- a/lgsm/functions/command_details.sh +++ b/lgsm/functions/command_details.sh @@ -30,4 +30,5 @@ fi fn_info_message_ports fn_info_message_select_engine fn_info_message_statusbottom + core_exit.sh diff --git a/lgsm/functions/command_dev_clear_functions.sh b/lgsm/functions/command_dev_clear_functions.sh index 95f54e842..51878a381 100644 --- a/lgsm/functions/command_dev_clear_functions.sh +++ b/lgsm/functions/command_dev_clear_functions.sh @@ -12,4 +12,5 @@ if fn_prompt_yn "Do you want to delete all functions?" Y; then rm -rfv "${functionsdir:?}/"* rm -rfv "${configdirdefault:?}/"* fi + core_exit.sh diff --git a/lgsm/functions/command_dev_debug.sh b/lgsm/functions/command_dev_debug.sh index 5229d068d..c8c57e995 100644 --- a/lgsm/functions/command_dev_debug.sh +++ b/lgsm/functions/command_dev_debug.sh @@ -17,4 +17,5 @@ else fn_print_ok_nl "Enabled dev-debug" fn_script_log_info "Enabled dev-debug" fi + core_exit.sh diff --git a/lgsm/functions/command_dev_detect_glibc.sh b/lgsm/functions/command_dev_detect_glibc.sh index f8b858dff..e7b3b5e2d 100644 --- a/lgsm/functions/command_dev_detect_glibc.sh +++ b/lgsm/functions/command_dev_detect_glibc.sh @@ -88,4 +88,5 @@ if [ -f "${tmpdir}/detect_glibc_highest.tmp" ]; then else fn_print_information_nl "glibc is not required" fi + core_exit.sh diff --git a/lgsm/functions/command_dev_query_raw.sh b/lgsm/functions/command_dev_query_raw.sh index d927cd61a..483952015 100644 --- a/lgsm/functions/command_dev_query_raw.sh +++ b/lgsm/functions/command_dev_query_raw.sh @@ -7,13 +7,14 @@ local commandname="QUERY-RAW" local commandaction="Query Raw" local function_selfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" + echo -e "" -echo -e "Query Port" +echo -e "Query Port - Raw Output" echo -e "==================================================================" echo -e "" echo -e "Gamedig Raw Output" echo -e "=================================" -echo"" +echo -e "" if [ ! "$(command -v gamedig 2>/dev/null)" ]; then fn_print_failure_nl "gamedig not installed" fi @@ -24,77 +25,54 @@ fi check.sh info_config.sh info_parms.sh -if [ "${engine}" == "idtech3_ql" ]; then - local engine="quakelive" -elif [ "${shortname}" == "kf2" ]; then - local engine="unreal4" -fi query_gamedig.sh echo -e "${gamedigcmd}" echo"" echo -e "${gamedigraw}" | jq -echo"" + +echo -e "" echo -e "gsquery Raw Output" echo -e "=================================" -echo"" -echo -e "./query_gsquery.py -a \"${ip}\" -p \"${queryport}\" -e \"${engine}\"" +echo -e "" +echo -e "./query_gsquery.py -a \"${ip}\" -p \"${queryport}\" -e \"${querytype}\"" +echo -e "" if [ ! -f "${functionsdir}/query_gsquery.py" ]; then fn_fetch_file_github "lgsm/functions" "query_gsquery.py" "${functionsdir}" "chmodx" "norun" "noforce" "nomd5" fi -"${functionsdir}"/query_gsquery.py -a "${ip}" -p "${queryport}" -e "${engine}" +"${functionsdir}"/query_gsquery.py -a "${ip}" -p "${queryport}" -e "${querytype}" -echo"" +echo -e "" echo -e "TCP Raw Output" echo -e "=================================" -echo"" +echo -e "" echo -e "bash -c 'exec 3<> /dev/tcp/'${ip}'/'${queryport}''" +echo -e "" bash -c 'exec 3<> /dev/tcp/'${ip}'/'${queryport}'' querystatus="$?" +echo -e "" if [ "${querystatus}" == "0" ]; then echo -e "TCP query PASS" else echo -e "TCP query FAIL" fi -echo"" -echo -e "UDP Raw Output" -echo -e "=================================" -echo"" -echo -e "bash -c 'exec 3<> /dev/udp/'${ip}'/'${queryport}''" -bash -c 'exec 3<> /dev/udp/'${ip}'/'${queryport}'' -querystatus="$?" -if [ "${querystatus}" == "0" ]; then - echo -e "UPD query PASS" -else - echo -e "UPD query FAIL" -fi echo -e "" -echo -e "Game Port" +echo -e "Game Port - Raw Output" echo -e "==================================================================" echo -e "" -echo"" echo -e "TCP Raw Output" echo -e "=================================" -echo"" +echo -e "" echo -e "bash -c 'exec 3<> /dev/tcp/'${ip}'/'${port}''" +echo -e "" bash -c 'exec 3<> /dev/tcp/'${ip}'/'${port}'' querystatus="$?" +echo -e "" if [ "${querystatus}" == "0" ]; then echo -e "TCP query PASS" else echo -e "TCP query FAIL" fi -echo"" -echo -e "UDP Raw Output" -echo -e "=================================" -echo"" -echo -e "bash -c 'exec 3<> /dev/udp/'${ip}'/'${port}''" -bash -c 'exec 3<> /dev/udp/'${ip}'/'${port}'' -querystatus="$?" -if [ "${querystatus}" == "0" ]; then - echo -e "UDP query PASS" -else - echo -e "UDP query FAIL" -fi +core_exit.sh diff --git a/lgsm/functions/command_donate.sh b/lgsm/functions/command_donate.sh index 036307051..54c46511d 100644 --- a/lgsm/functions/command_donate.sh +++ b/lgsm/functions/command_donate.sh @@ -2,7 +2,12 @@ # LinuxGSM command_donate.sh function # Author: Daniel Gibbs # Website: https://linuxgsm.com -# Description: Shows ways to donate +# Description: Shows ways to donate. + +local commandname="CONSOLE" +local commandaction="Console" +local function_selfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" + fn_print_ascii_logo echo -e "${lightyellow}Support LinuxGSM${default}" echo -e "=================================" @@ -15,3 +20,5 @@ echo -e "* ${lightblue}PayPal:${default} https://linuxgsm.com/paypal" echo -e "* ${lightblue}Ko-Fi:${default} https://linuxgsm.com/ko-fi" echo -e "" echo -e "LinuxGSM est. 2012" + +core_exit.sh diff --git a/lgsm/functions/command_fastdl.sh b/lgsm/functions/command_fastdl.sh index b8b43785c..0eab220e2 100644 --- a/lgsm/functions/command_fastdl.sh +++ b/lgsm/functions/command_fastdl.sh @@ -438,4 +438,5 @@ echo -e "FastDL files are located in:" echo -e "${fastdldir}" echo -e "FastDL completed" fn_script_log_info "FastDL completed" + core_exit.sh diff --git a/lgsm/functions/command_install.sh b/lgsm/functions/command_install.sh index 4be296cfe..b44ec60dc 100644 --- a/lgsm/functions/command_install.sh +++ b/lgsm/functions/command_install.sh @@ -47,5 +47,5 @@ else fix.sh install_stats.sh install_complete.sh - core_exit.sh fi +core_exit.sh diff --git a/lgsm/functions/command_install_resources_mta.sh b/lgsm/functions/command_install_resources_mta.sh index 0eaa378bd..9a3934de3 100644 --- a/lgsm/functions/command_install_resources_mta.sh +++ b/lgsm/functions/command_install_resources_mta.sh @@ -28,3 +28,5 @@ else fn_print_warning_nl "Default resources are not installed when using ./${selfname} auto-install." fn_print_information_nl "To install default resources use ./${selfname} install" fi + +core_exit.sh diff --git a/lgsm/functions/command_monitor.sh b/lgsm/functions/command_monitor.sh index 2e25177f7..cfb8e39a7 100644 --- a/lgsm/functions/command_monitor.sh +++ b/lgsm/functions/command_monitor.sh @@ -10,35 +10,122 @@ local commandname="MONITOR" local commandaction="Monitor" local function_selfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" -fn_monitor_loop(){ -# Monitor will query up to 5 times every 15 seconds. -# Query will wait up to 60 seconds to confirm server is down giving server time if changing map. +fn_monitor_check_lockfile(){ + # Monitor does not run it lockfile is not found. + if [ ! -f "${rootdir}/${lockselfname}" ]; then + fn_print_dots "Checking lockfile: " + fn_print_checking_eol + fn_script_log_info "Checking lockfile: CHECKING" + fn_sleep_time + fn_print_error_nl "Checking lockfile: No lockfile found: " + fn_print_error_eol + fn_script_log_error "Checking lockfile: No lockfile found: ERROR" + fn_sleep_time + echo -e " * Start ${selfname} to run monitor." + core_exit.sh + fi + + # Fix if lockfile is not unix time or contains letters + if [[ "$(cat "${rootdir}/${lockselfname}")" =~ [A-Za-z] ]]; then + date '+%s' > "${rootdir}/${lockselfname}" + fi +} + +fn_monitor_check_update(){ + # Monitor will check if update is already running. + if [ "$(pgrep "${selfname} update" | wc -l)" != "0" ]; then + fn_print_dots "Checking active updates: " + fn_print_checking_eol + fn_script_log_info "Checking active updates: CHECKING" + fn_sleep_time + fn_print_error_nl "Checking active updates: SteamCMD is currently checking for updates: " + fn_print_error_eol + fn_script_log_error "Checking active updates: SteamCMD is currently checking for updates: ERROR" + fn_sleep_time + core_exit.sh + fi +} + +fn_monitor_check_session(){ + fn_print_dots "Checking session: " + fn_print_checking_eol + fn_script_log_info "Checking session: CHECKING" + fn_sleep_time + # uses status var from check_status.sh + if [ "${status}" != "0" ]; then + fn_print_ok "Checking session: " + fn_print_ok_eol_nl + fn_script_log_pass "Checking session: OK" + fn_sleep_time + else + fn_print_error "Checking session: " + fn_print_fail_eol_nl + fn_script_log_fatal "Checking session: FAIL" + fn_sleep_time + alert="restart" + alert.sh + fn_script_log_info "Checking session: Monitor is restarting ${selfname}" + command_restart.sh + core_exit.sh + fi +} + +fn_monitor_check_queryport(){ + # Monitor will check queryport is set before continuing. + if [ -z "${queryport}" ]||[ "${queryport}" == "0" ]; then + fn_print_dots "Checking port: " + fn_print_checking_eol + fn_script_log_info "Checking session: CHECKING" + fn_sleep_time + fn_print_error "Checking port: Unable to query as queryport is not set: " + fn_print_error_eol_nl + fn_script_log_error "Checking port: Unable to query as queryport is not set: ERROR" + fn_sleep_time + core_exit.sh + fi +} + +fn_query_gsquery(){ + if [ ! -f "${functionsdir}/query_gsquery.py" ]; then + fn_fetch_file_github "lgsm/functions" "query_gsquery.py" "${functionsdir}" "chmodx" "norun" "noforce" "nomd5" + fi + "${functionsdir}"/query_gsquery.py -a "${ip}" -p "${queryport}" -e "${querytype}" > /dev/null 2>&1 + querystatus="$?" +} + +fn_query_tcp(){ + bash -c 'exec 3<> /dev/tcp/'${ip}'/'${queryport}'' > /dev/null 2>&1 + querystatus="$?" +} + +fn_monitor_query(){ +# Will loop and query up to 5 times every 15 seconds. +# Query will wait up to 60 seconds to confirm server is down as server can become non-responsive during map changes. totalseconds=0 for queryattempt in {1..5}; do fn_print_dots "Querying port: ${querymethod}: ${ip}:${queryport} : ${totalseconds}/${queryattempt}: " fn_print_querying_eol fn_script_log_info "Querying port: ${querymethod}: ${ip}:${queryport} : ${queryattempt} : QUERYING" + fn_sleep_time + # querydelay if [ "$(cat "${rootdir}/${lockselfname}")" -gt "$(date "+%s" -d "${querydelay} mins ago")" ]; then fn_print_ok "Querying port: ${querymethod}: ${ip}:${queryport} : ${totalseconds}/${queryattempt}: " - fn_print_delay_eol + fn_print_delay_eol_nl fn_script_log_info "Querying port: ${querymethod}: ${ip}:${queryport} : ${queryattempt} : DELAY" - fn_script_log_info "Query bypassed: ${gameservername} started less than ${querydelay} minute ago" + fn_script_log_info "Query bypassed: ${gameservername} started less than ${querydelay} minutes ago" + fn_sleep_time monitorpass=1 core_exit.sh + # will use query method selected in fn_monitor_loop + # gamedig elif [ "${querymethod}" == "gamedig" ]; then query_gamedig.sh + # gsquery elif [ "${querymethod}" == "gsquery" ]; then - if [ ! -f "${functionsdir}/query_gsquery.py" ]; then - fn_fetch_file_github "lgsm/functions" "query_gsquery.py" "${functionsdir}" "chmodx" "norun" "noforce" "nomd5" - fi - "${functionsdir}"/query_gsquery.py -a "${ip}" -p "${queryport}" -e "${engine}" > /dev/null 2>&1 - querystatus="$?" + fn_query_gsquery + #tcp query elif [ "${querymethod}" == "tcp" ]; then - bash -c 'exec 3<> /dev/tcp/'${ip}'/'${queryport}'' - querystatus="$?" - elif [ "${querymethod}" == "udp" ]; then - bash -c 'exec 3<> /dev/udp/'${ip}'/'${queryport}'' - querystatus="$?" + fn_query_tcp fi if [ "${querystatus}" == "0" ]; then @@ -46,21 +133,43 @@ for queryattempt in {1..5}; do fn_print_ok "Querying port: ${querymethod}: ${ip}:${queryport} : ${totalseconds}/${queryattempt}: " fn_print_ok_eol_nl fn_script_log_pass "Querying port: ${querymethod}: ${ip}:${queryport} : ${queryattempt}: OK" + fn_sleep_time monitorpass=1 + # send LinuxGSM stats if monitor is OK. + if [ "${stats}" == "on" ]; then + info_stats.sh + fi + if [ "${querystatus}" == "0" ]; then + # Add query data to log. + if [ -n "${gdname}" ]; then + fn_script_log_info "Server name: ${gdname}" + fi + if [ -n "${gdplayers}" ]; then + fn_script_log_info "Players: ${gdplayers}/${gdmaxplayers}" + fi + if [ -n "${gdmap}" ]; then + fn_script_log_info "Map: ${gdmap}" + fi + if [ -n "${gdgamemode}" ]; then + fn_script_log_info "Game Mode: ${gdgamemode}" + fi + fi core_exit.sh else # Server query FAIL. - fn_script_log_info "Querying port: ${querymethod}: ${ip}:${queryport} : ${queryattempt}: FAIL" fn_print_fail "Querying port: ${querymethod}: ${ip}:${queryport} : ${totalseconds}/${queryattempt}: " fn_print_fail_eol - # Monitor try gamedig first then gsquery before restarting. - if [ "${querymethod}" == "gsquery" ]; then + fn_script_log_warn "Querying port: ${querymethod}: ${ip}:${queryport} : ${queryattempt}: FAIL" + fn_sleep_time + # Monitor will try gamedig (if supported) for first 30s then gsquery before restarting. + if [ "${querymethod}" == "gsquery" ]||[ "${querymethod}" == "tcp" ]; then + # gsquery will fail if longer than 60s if [ "${totalseconds}" -ge "59" ]; then - # Server query FAIL for over 59 seconds reboot server. + # Monitor will FAIL if over 60s and trigger gane server reboot. fn_print_fail "Querying port: ${querymethod}: ${ip}:${queryport} : ${totalseconds}/${queryattempt}: " fn_print_fail_eol_nl - fn_script_log_error "Querying port: ${querymethod}: ${ip}:${queryport} : ${queryattempt}: FAIL" - + fn_script_log_warn "Querying port: ${querymethod}: ${ip}:${queryport} : ${queryattempt}: FAIL" + fn_sleep_time # Send alert if enabled. alert="restartquery" alert.sh @@ -68,12 +177,13 @@ for queryattempt in {1..5}; do core_exit.sh fi elif [ "${querymethod}" == "gamedig" ]; then + # gamedig will fail and try gsquery if longer than 30s if [ "${totalseconds}" -ge "29" ]; then break fi fi - # Seconds counter. + # Second counter will wait for 15s before breaking loop. for seconds in {1..15}; do fn_print_fail "Querying port: ${querymethod}: ${ip}:${queryport} : ${totalseconds}/${queryattempt}: WAIT" totalseconds=$((totalseconds + 1)) @@ -85,139 +195,56 @@ for queryattempt in {1..5}; do done } -fn_monitor_check_lockfile(){ - # Monitor does not run it lockfile is not found. - if [ ! -f "${rootdir}/${lockselfname}" ]; then - fn_print_error_nl "Disabled: No lockfile found" - fn_script_log_error "Disabled: No lockfile found" - echo -e " * To enable monitor run ./${selfname} start" - core_exit.sh - fi -} - -fn_monitor_check_update(){ - # Monitor will check if update is already running. - if [ "$(pgrep "${selfname} update" | wc -l)" != "0" ]; then - fn_print_error_nl "SteamCMD is currently checking for updates" - fn_script_log_error "SteamCMD is currently checking for updates" - core_exit.sh - fi -} - -fn_monitor_check_session(){ - fn_print_dots "Checking session: " - fn_print_checking_eol - fn_script_log_info "Checking session: CHECKING" - if [ "${status}" != "0" ]; then - fn_print_ok "Checking session: " - fn_print_ok_eol_nl - fn_script_log_pass "Checking session: OK" - else - if [ "${shortname}" == "ts3" ]; then - fn_print_error "Checking session: ${ts3error}: " - elif [ "${shortname}" == "mumble" ]; then - fn_print_error "Checking session: Not listening to port ${queryport}" - else - fn_print_error "Checking session: " - fi - fn_print_fail_eol_nl - fn_script_log_error "Checking session: FAIL" - alert="restart" - alert.sh - fn_script_log_info "Monitor is starting ${servername}" - command_restart.sh - core_exit.sh +fn_monitor_loop(){ + # loop though query methods selected by querymode. + totalseconds=0 + if [ "${querymode}" == "2" ]; then + local query_methods_array=( gamedig gsquery ) + elif [ "${querymode}" == "3" ]; then + local query_methods_array=( gamedig ) + elif [ "${querymode}" == "4" ]; then + local query_methods_array=( gsquery ) + elif [ "${querymode}" == "5" ]; then + local query_methods_array=( tcp ) fi -} - -fn_monitor_query(){ - fn_script_log_info "Querying port: query enabled" - # Engines that work with query. - local allowed_engines_array=( avalanche2.0 avalanche3.0 barotrauma goldsource idtech2 idtech3 idtech3_ql ioquake3 iw2.0 iw3.0 lwjgl2 madness quake qfusion refractor realvirtuality source spark starbound unity3d unreal unreal2 unreal4 wurm ) - for allowed_engine in "${allowed_engines_array[@]}" + for querymethod in "${query_methods_array[@]}" do - if [ "${allowed_engine}" == "${engine}" ]; then - if [ "${engine}" == "idtech3_ql" ]; then - local engine="quakelive" - elif [ "${shortname}" == "kf2" ]; then - local engine="unreal4" - fi - - # Will first attempt to use gamedig then gsquery. - totalseconds=0 - if [ "${shortname}" == "wurm" ]; then - local query_methods_array=( gsquery ) + # Will check if gamedig is installed and bypass if not. + if [ "${querymethod}" == "gamedig" ]; then + if [ "$(command -v gamedig 2>/dev/null)" ]&&[ "$(command -v jq 2>/dev/null)" ]; then + if [ -z "${monitorpass}" ]; then + fn_monitor_query + fi else - local query_methods_array=( gamedig gsquery ) + fn_script_log_info "gamedig is not installed" + fn_script_log_info "https://docs.linuxgsm.com/requirements/gamedig" + fi + else + # will not query if query already passed. + if [ -z "${monitorpass}" ]; then + fn_monitor_query fi - for query_method in "${query_methods_array[@]}" - do - if [ "${query_method}" == "gamedig" ]; then - # Will bypass gamedig if not installed. - if [ "$(command -v gamedig 2>/dev/null)" ]&&[ "$(command -v jq 2>/dev/null)" ]; then - if [ -z "${monitorpass}" ]; then - querymethod="${query_method}" - fn_monitor_loop - fi - fi - else - if [ -z "${monitorpass}" ]; then - querymethod="${query_method}" - fn_monitor_loop - fi - fi - done fi done } -fn_monitor_query_tcp(){ - querymethod="tcp" - fn_monitor_loop -} - -fn_monitor_query_udp(){ - querymethod="upd" - fn_monitor_loop -} - monitorflag=1 -fn_print_dots "${servername}" check.sh logs.sh info_config.sh info_parms.sh -if [ "${stats}" == "on" ]; then - info_stats.sh -fi - +# query pre-checks fn_monitor_check_lockfile fn_monitor_check_update fn_monitor_check_session +fn_monitor_check_queryport -# Fix if lockfile is not unix time or contains letters -if [[ "$(cat "${rootdir}/${lockselfname}")" =~ [A-Za-z] ]]; then - date '+%s' > "${rootdir}/${lockselfname}" -fi - -# Add a query bypass if missing +# Add a querydelay of 1 min if var missing. if [ -z "${querydelay}" ]; then querydelay="1" fi -# Query has to be enabled in Starbound config. -if [ "${shortname}" == "sb" ]; then - if [ "${queryenabled}" == "true" ]; then - fn_monitor_query - fi -elif [ "${shortname}" == "ts3" ]||[ "${shortname}" == "eco" ]||[ "${shortname}" == "mumble" ]; then - fn_monitor_query_tcp -elif [ "${shortname}" == "mohaa" ]; then - # prevent game from using query. Only used if specific game server cant query but engine can - : -else - fn_monitor_query -fi +fn_monitor_loop core_exit.sh diff --git a/lgsm/functions/command_postdetails.sh b/lgsm/functions/command_postdetails.sh index 4bede0eb2..02e57fed0 100644 --- a/lgsm/functions/command_postdetails.sh +++ b/lgsm/functions/command_postdetails.sh @@ -48,7 +48,7 @@ if [ -f "${postdetailslog}" ]; then fi # Rather than a one-pass sed parser, default to using a temporary directory. -if [ -n "${alertflag}" ]; then +if [ -n "${exitbypass}" ]; then postdetailslog="${alertlog}" else # Run checks and gathers details to display. @@ -117,7 +117,7 @@ else core_exit.sh fi -if [ -z "${alertflag}" ]; then +if [ -z "${exitbypass}" ]; then core_exit.sh else alerturl="${pdurl}" diff --git a/lgsm/functions/command_restart.sh b/lgsm/functions/command_restart.sh index 2ece0810c..080b3d8e7 100644 --- a/lgsm/functions/command_restart.sh +++ b/lgsm/functions/command_restart.sh @@ -12,3 +12,5 @@ info_config.sh exitbypass=1 command_stop.sh command_start.sh + +core_exit.sh diff --git a/lgsm/functions/command_start.sh b/lgsm/functions/command_start.sh index 7fc8a2987..93385351d 100644 --- a/lgsm/functions/command_start.sh +++ b/lgsm/functions/command_start.sh @@ -163,8 +163,10 @@ fn_sleep_time echo -en "\n" } -fn_print_dots "${servername}" + check.sh + +fn_print_dots "${servername}" # Is the server already started. # $status comes from check_status.sh, which is run by check.sh for this command if [ "${status}" != "0" ]; then @@ -192,4 +194,5 @@ if [ "${shortname}" == "ts3" ]; then else fn_start_tmux fi + core_exit.sh diff --git a/lgsm/functions/command_stop.sh b/lgsm/functions/command_stop.sh index 869e19761..c45ed6b4c 100644 --- a/lgsm/functions/command_stop.sh +++ b/lgsm/functions/command_stop.sh @@ -235,14 +235,16 @@ fn_stop_pre_check(){ fi } -fn_print_dots "${servername}" check.sh +fn_print_dots "${servername}" + info_config.sh fn_stop_pre_check # Remove lockfile. if [ -f "${rootdir}/${lockselfname}" ]; then rm -f "${rootdir}/${lockselfname}" fi + if [ -z "${exitbypass}" ]; then core_exit.sh fi diff --git a/lgsm/functions/command_test_alert.sh b/lgsm/functions/command_test_alert.sh index 014e082b2..82882f9ee 100644 --- a/lgsm/functions/command_test_alert.sh +++ b/lgsm/functions/command_test_alert.sh @@ -13,4 +13,5 @@ check.sh info_config.sh alert="test" alert.sh + core_exit.sh diff --git a/lgsm/functions/command_ts3_server_pass.sh b/lgsm/functions/command_ts3_server_pass.sh index fc242c16e..eee38832a 100644 --- a/lgsm/functions/command_ts3_server_pass.sh +++ b/lgsm/functions/command_ts3_server_pass.sh @@ -47,4 +47,5 @@ else fn_serveradmin_password_set command_stop.sh fi + core_exit.sh diff --git a/lgsm/functions/command_update_linuxgsm.sh b/lgsm/functions/command_update_linuxgsm.sh index 4a70c7748..95d6e8052 100644 --- a/lgsm/functions/command_update_linuxgsm.sh +++ b/lgsm/functions/command_update_linuxgsm.sh @@ -112,5 +112,5 @@ else fn_print_ok "Updating functions" fn_script_log_pass "Updating functions" fi -echo -en "\n" + core_exit.sh diff --git a/lgsm/functions/command_validate.sh b/lgsm/functions/command_validate.sh index 78210ff4b..02ba07271 100644 --- a/lgsm/functions/command_validate.sh +++ b/lgsm/functions/command_validate.sh @@ -51,4 +51,5 @@ if [ "${status}" != "0" ]; then else fn_validation fi + core_exit.sh diff --git a/lgsm/functions/compress_unreal2_maps.sh b/lgsm/functions/compress_unreal2_maps.sh index 3208212f2..3af14d47d 100644 --- a/lgsm/functions/compress_unreal2_maps.sh +++ b/lgsm/functions/compress_unreal2_maps.sh @@ -27,4 +27,5 @@ for map in "${serverfiles}/Maps/"*; do ./ucc-bin compress "${map}" --nohomedir done 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 d52ae01d0..8e2a18f35 100644 --- a/lgsm/functions/compress_ut99_maps.sh +++ b/lgsm/functions/compress_ut99_maps.sh @@ -27,4 +27,5 @@ for map in "${serverfiles}/Maps/"*; do ./ucc-bin compress "${map}" --nohomedir done mv -fv "${serverfiles}/Maps/"*.unr.uz "${compressedmapsdir}" + core_exit.sh diff --git a/lgsm/functions/core_messages.sh b/lgsm/functions/core_messages.sh index e1d394834..6a8ed296a 100644 --- a/lgsm/functions/core_messages.sh +++ b/lgsm/functions/core_messages.sh @@ -351,6 +351,10 @@ fn_print_error_eol(){ echo -en "${red}ERROR${default}" } +fn_print_error_eol_nl(){ + echo -en "${red}ERROR${default}" +} + # WARN fn_print_warn_eol(){ echo -en "${lightyellow}WARN${default}" diff --git a/lgsm/functions/info_config.sh b/lgsm/functions/info_config.sh index 9c12907f8..fce013a28 100644 --- a/lgsm/functions/info_config.sh +++ b/lgsm/functions/info_config.sh @@ -832,12 +832,14 @@ fn_info_config_teeworlds(){ serverpassword="${unavailable}" rconpassword="${unavailable}" port="8303" + queryport="8303" maxplayers="12" else servername=$(grep "sv_name" "${servercfgfullpath}" | sed -e 's/^[ \t]*//g' -e '/^#/d' -e 's/^sv_name//g' | tr -d '=\";,:' | sed -e 's/^[ \t]*//' -e 's/[ \t]*$//') serverpassword=$(grep "password" "${servercfgfullpath}" | sed -e 's/^[ \t]*//g' | grep "^password" | sed -e '/^#/d' -e 's/^password//g' | tr -d '=\";,:' | sed -e 's/^[ \t]*//' -e 's/[ \t]*$//') rconpassword=$(grep "sv_rcon_password" "${servercfgfullpath}" | sed -e 's/^[ \t]*//g' -e '/^#/d' -e 's/^sv_rcon_password//g' | tr -d '=\";,:' | sed -e 's/^[ \t]*//' -e 's/[ \t]*$//') port=$(grep "sv_port" "${servercfgfullpath}" | grep -v "#" | tr -cd '[:digit:]') + queryport="${port}" maxplayers=$(grep "sv_max_clients" "${servercfgfullpath}" | grep -v "#" | tr -cd '[:digit:]') # Not Set @@ -845,6 +847,7 @@ fn_info_config_teeworlds(){ serverpassword=${serverpassword:-"NOT SET"} rconpassword=${rconpassword:-"NOT SET"} port=${port:-"8303"} + queryport=${port:-"8303"} maxplayers=${maxplayers:-"12"} fi } @@ -855,15 +858,18 @@ fn_info_config_terraria(){ port="${zero}" gameworld="${unavailable}" maxplayers="${zero}" + queryport="${zero}" else servername=$(grep "worldname" "${servercfgfullpath}" | sed -e 's/^[ \t]*//g' -e '/^#/d' -e 's/worldname//g' | tr -d '=\";,:' | sed -e 's/^[ \t]*//' -e 's/[ \t]*$//') port=$(grep "port" "${servercfgfullpath}" | tr -cd '[:digit:]') + queryport=${port:-"0"} gameworld=$(grep "world=" "${servercfgfullpath}" | grep -v "//" | sed -e 's/^[ \t]*//g' -e '/^#/d' -e 's/world=//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"} port=${port:-"0"} + queryport=${queryport:-"0"} gameworld=${gameworld:-"NOT SET"} maxplayers=${maxplayers:-"0"} fi @@ -890,7 +896,7 @@ fn_info_config_unreal(){ adminpassword="${unavailable}" port="${zero}" queryport="${zero}" - gsqueryport="${zero}" + queryportgs="${zero}" webadminenabled="${unavailable}" webadminport="${zero}" webadminuser="${unavailable}" @@ -901,16 +907,48 @@ fn_info_config_unreal(){ adminpassword=$(grep "AdminPassword" "${servercfgfullpath}" | sed -e 's/^[ \t]*//g' -e '/^#/d' -e 's/AdminPassword//g' | tr -d '=\";,:' | sed -e 's/^[ \t]*//' -e 's/[ \t]*$//'| sed 's/\r$//') 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:]') + queryportgs=$(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]*$//'| sed 's/\r$//') webadminport=$(grep "ListenPort" "${servercfgfullpath}" | grep -v "#" | tr -cd '[:digit:]') - if [ "${engine}" == "unreal" ]; then - webadminuser=$(grep "AdminUsername" "${servercfgfullpath}" | sed -e 's/^[ \t]*//g' -e '/^#/d' -e 's/AdminUsername//g' | tr -d '=\";,:' | sed -e 's/^[ \t]*//' -e 's/[ \t]*$//'| sed 's/\r$//') - webadminpass=$(grep "UTServerAdmin.UTServerAdmin" "${servercfgfullpath}" -A 4 | grep "AdminPassword" | sed -e 's/^[ \t]*//g' -e '/^#/d' -e 's/AdminPassword//g' | tr -d '=\";,:' | sed -e 's/^[ \t]*//' -e 's/[ \t]*$//'| sed 's/\r$//') - else - webadminuser=$(grep "AdminName" "${servercfgfullpath}" | sed -e 's/^[ \t]*//g' -e '/^#/d' -e 's/AdminName//g' | tr -d '=\";,:' | sed -e 's/^[ \t]*//' -e 's/[ \t]*$//'| sed 's/\r$//') - webadminpass="${adminpassword}" - fi + webadminuser=$(grep "AdminUsername" "${servercfgfullpath}" | sed -e 's/^[ \t]*//g' -e '/^#/d' -e 's/AdminUsername//g' | tr -d '=\";,:' | sed -e 's/^[ \t]*//' -e 's/[ \t]*$//'| sed 's/\r$//') + webadminpass=$(grep "UTServerAdmin.UTServerAdmin" "${servercfgfullpath}" -A 4 | grep "AdminPassword" | sed -e 's/^[ \t]*//g' -e '/^#/d' -e 's/AdminPassword//g' | tr -d '=\";,:' | sed -e 's/^[ \t]*//' -e 's/[ \t]*$//'| sed 's/\r$//') + # Not Set + servername=${servername:-"NOT SET"} + serverpassword=${serverpassword:-"NOT SET"} + adminpassword=${adminpassword:-"NOT SET"} + port=${port:-"0"} + queryport=${queryport:-"0"} + queryportgs=${queryportgs:-"0"} + webadminenabled=${webadminenabled:-"NOT SET"} + webadminport=${webadminport:-"0"} + webadminuser=${webadminuser:-"NOT SET"} + webadminpass=${webadminpass:-"NOT SET"} + fi +} + +fn_info_config_unreal2(){ + if [ ! -f "${servercfgfullpath}" ]; then + servername="${unavailable}" + serverpassword="${unavailable}" + adminpassword="${unavailable}" + port="${zero}" + queryport="${zero}" + queryportgs="${zero}" + webadminenabled="${unavailable}" + webadminport="${zero}" + webadminuser="${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]*$//'| sed 's/\r$//') + serverpassword=$(grep "GamePassword" "${servercfgfullpath}" | sed -e 's/^[ \t]*//g' -e '/^#/d' -e 's/GamePassword//g' | tr -d '=\";,:' | sed -e 's/^[ \t]*//' -e 's/[ \t]*$//'| sed 's/\r$//') + adminpassword=$(grep "AdminPassword" "${servercfgfullpath}" | sed -e 's/^[ \t]*//g' -e '/^#/d' -e 's/AdminPassword//g' | tr -d '=\";,:' | sed -e 's/^[ \t]*//' -e 's/[ \t]*$//'| sed 's/\r$//') + port=$(grep "Port" "${servercfgfullpath}" | sed -e 's/^[ \t]*//g' | grep "^Port" | grep -v "#" | tr -cd '[:digit:]') + queryport=$((port + 1)) + queryportgs=$(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]*$//'| sed 's/\r$//') + webadminport=$(grep "ListenPort" "${servercfgfullpath}" | grep -v "#" | tr -cd '[:digit:]') + webadminuser=$(grep "AdminName" "${servercfgfullpath}" | sed -e 's/^[ \t]*//g' -e '/^#/d' -e 's/AdminName//g' | tr -d '=\";,:' | sed -e 's/^[ \t]*//' -e 's/[ \t]*$//'| sed 's/\r$//') + webadminpass="${adminpassword}" # Not Set servername=${servername:-"NOT SET"} @@ -918,7 +956,7 @@ fn_info_config_unreal(){ adminpassword=${adminpassword:-"NOT SET"} port=${port:-"0"} queryport=${queryport:-"0"} - gsqueryport=${gsqueryport:-"0"} + queryportgs=${queryportgs:-"0"} webadminenabled=${webadminenabled:-"NOT SET"} webadminport=${webadminport:-"0"} webadminuser=${webadminuser:-"NOT SET"} @@ -1067,20 +1105,18 @@ fn_info_config_mta(){ 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:]') - + 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:]') if [ "${ase}" == "1" ]; then ase="Enabled" else 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 "<") - ipsetinconfig=1 - ipinconfigvar="serverip" + # 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" # Not Set port=${port:-"22003"} @@ -1312,7 +1348,7 @@ elif [ "${shortname}" == "kf2" ]; then fn_info_config_kf2 # Medal of Honor: Allied Assault elif [ "${shortname}" == "mohaa" ]; then - fn_info_config_mohaa + fn_info_config_mohaa # QuakeWorld elif [ "${shortname}" == "qw" ]; then fn_info_config_quakeworld @@ -1342,7 +1378,7 @@ elif [ "${shortname}" == "arma3" ]; then fn_info_config_realvirtuality # Return to Castle Wolfenstein elif [ "${shortname}" == "rtcw" ]; then - fn_info_config_rtcw + fn_info_config_rtcw # Rising World elif [ "${shortname}" == "rw" ]; then fn_info_config_risingworld @@ -1354,7 +1390,7 @@ elif [ "${shortname}" == "sol" ]; then fn_info_config_soldat # Soldier Of Fortune 2: Gold Edition elif [ "${shortname}" == "sof2" ]; then - fn_info_config_sof2 + fn_info_config_sof2 # Source Engine Games elif [ "${engine}" == "source" ]||[ "${engine}" == "goldsource" ]; then fn_info_config_source @@ -1382,9 +1418,12 @@ elif [ "${shortname}" == "terraria" ]; then # Tower Unite elif [ "${shortname}" == "tu" ]; then fn_info_config_towerunite -# Unreal/Unreal 2 engine -elif [ "${engine}" == "unreal" ]||[ "${engine}" == "unreal2" ]; then +# Unreal engine +elif [ "${engine}" == "unreal" ]; then fn_info_config_unreal +# Unreal 2 engine +elif [ "${engine}" == "unreal2" ]; then + fn_info_config_unreal2 # Unreal 3 engine elif [ "${engine}" == "unreal3" ]; then fn_info_config_unreal3 diff --git a/lgsm/functions/info_messages.sh b/lgsm/functions/info_messages.sh index bca3c5586..194529d27 100644 --- a/lgsm/functions/info_messages.sh +++ b/lgsm/functions/info_messages.sh @@ -25,9 +25,9 @@ fn_info_message_head(){ echo -e "" echo -e "Server IP" if [ "${multiple_ip}" == "1" ]; then - echo -e "NOT SET" + echo -e "NOT SET" else - echo -e "${ip}:${port}" + echo -e "${ip}:${port}" fi } @@ -160,8 +160,8 @@ fn_info_message_gameserver(){ # Server password: NOT SET # RCON password: adminF54CC0VR # Players: 0/16 - # Current Map: de_mirage - # Default Map: de_mirage + # Current map: de_mirage + # Default map: de_mirage # Game type: 0 # Game mode: 0 # Tick rate: 64 @@ -245,7 +245,6 @@ fn_info_message_gameserver(){ fi # Players - if [ "${querystatus}" != "0" ]; then if [ -n "${maxplayers}" ]; then echo -e "${lightblue}Maxplayers:\t${default}${maxplayers}" @@ -273,31 +272,31 @@ fn_info_message_gameserver(){ echo -e "${lightblue}Bots:\t${default}${gdbots}" fi - # Current Map + # Current map if [ -n "${gdmap}" ]; then - echo -e "${lightblue}Current Map:\t${default}${gdmap}" + echo -e "${lightblue}Current map:\t${default}${gdmap}" + fi + + # Default map + if [ -n "${defaultmap}" ]; then + echo -e "${lightblue}Default map:\t${default}${defaultmap}" fi if [ -n "${defaultscenario}" ]; then - # Current Scenario + # Current scenario if [ -n "${gdgamemode}" ]; then - echo -e "${lightblue}Current Scenario:\t${default}${gdgamemode}" + echo -e "${lightblue}Current scenario:\t${default}${gdgamemode}" fi else - # Current Scenario + # Current game mode if [ -n "${gdgamemode}" ]; then - echo -e "${lightblue}Current Game Mode:\t${default}${gdgamemode}" + echo -e "${lightblue}Current game mode:\t${default}${gdgamemode}" fi fi - # Default Map - if [ -n "${defaultmap}" ]; then - echo -e "${lightblue}Default Map:\t${default}${defaultmap}" - fi - - # Default Scenario + # Default scenario if [ -n "${defaultscenario}" ]; then - echo -e "${lightblue}Default Scenario:\t${default}${defaultscenario}" + echo -e "${lightblue}Default scenario:\t${default}${defaultscenario}" fi # Game type @@ -370,12 +369,12 @@ fn_info_message_gameserver(){ echo -e "${lightblue}Map rotation:\t${default}${randommap}" fi - # Listed on Master Server - if [ "${displaymasterserver}" ];then + # Listed on Master server + if [ -n "${displaymasterserver}" ];then if [ "${displaymasterserver}" == "true" ];then - echo -e "${lightblue}Master Server:\t${green}${displaymasterserver}${default}" + echo -e "${lightblue}Master server:\t${green}${displaymasterserver}${default}" else - echo -e "${lightblue}Master Server:\t${red}${displaymasterserver}${default}" + echo -e "${lightblue}Master server:\t${red}${displaymasterserver}${default}" fi fi @@ -708,7 +707,7 @@ fn_info_message_codwaw(){ } | column -s $'\t' -t } -fn_info_message_dontstarve(){ +fn_info_message_dst(){ echo -e "netstat -atunp | grep dontstarve" echo -e "" { @@ -745,7 +744,8 @@ fn_info_message_factorio(){ echo -e "" { echo -e "${lightblue}DESCRIPTION\tDIRECTION\tPORT\tPROTOCOL${default}" - echo -e "> Game\tINBOUND\t${port}\ttcp" + echo -e "> Game\tINBOUND\t${port}\tudp" + echo -e "> RCON\tINBOUND\t${rconport}\ttcp" } | column -s $'\t' -t } @@ -852,11 +852,11 @@ fn_info_message_projectcars(){ } fn_info_message_projectzomboid(){ - echo -e "netstat -atunp | grep java" + echo -e "netstat -atunp | grep ProjectZomb" echo -e "" { echo -e "${lightblue}DESCRIPTION\tDIRECTION\tPORT\tPROTOCOL${default}" - echo -e "> Game\tINBOUND\t${port}\tudp" + echo -e "> Game/Query\tINBOUND\t${port}\tudp" } | column -s $'\t' -t } @@ -902,7 +902,7 @@ fn_info_message_quakelive(){ } | column -s $'\t' -t } -fn_info_message_realvirtuality(){ +fn_info_message_arma3(){ echo -e "netstat -atunp | grep arma3server" echo -e "" # Default port @@ -914,20 +914,20 @@ fn_info_message_realvirtuality(){ 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 "> Steam: Query\tINBOUND\t$((port+1))\tudp" + echo -e "> Query Steam\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 } -fn_info_message_refractor(){ +fn_info_message_bf1942(){ echo -e "netstat -atunp | grep bf1942_lnxd" echo -e "" { echo -e "${lightblue}DESCRIPTION\tDIRECTION\tPORT\tPROTOCOL${default}" echo -e "> Game/Query\tINBOUND\t${port}\tudp" - echo -e "> Steam: Query\tINBOUND\t${queryport}\tudp" + echo -e "> Query Steam\tINBOUND\t${queryport}\tudp" } | column -s $'\t' -t } @@ -937,7 +937,7 @@ fn_info_message_risingworld(){ { echo -e "${lightblue}DESCRIPTION\tDIRECTION\tPORT\tPROTOCOL${default}" echo -e "> Game/Query\tINBOUND\t${port}\ttcp/udp" - echo -e "> http query\tINBOUND\t${httpqueryport}\ttcp" + echo -e "> Query HTTP\tINBOUND\t${httpqueryport}\ttcp" echo -e "> RCON\tINBOUND\t${rconport}\ttcp" } | column -s $'\t' -t } @@ -956,7 +956,7 @@ fn_info_message_rust(){ echo -e "" { echo -e "${lightblue}DESCRIPTION\tDIRECTION\tPORT\tPROTOCOL${default}" - echo -e "> Game/Query\tINBOUND\t${port}\ttcp/udp" + echo -e "> Game/Query\tINBOUND\t${port}\tudp" echo -e "> RCON\tINBOUND\t${rconport}\ttcp" } | column -s $'\t' -t } @@ -971,8 +971,8 @@ fn_info_message_samp(){ } -fn_info_message_seriousengine35(){ - echo -e "netstat -atunp | grep Sam3_Dedicate" +fn_info_message_ss3(){ + echo -e "netstat -atunp | grep Sam3_Ded" echo -e "" { echo -e "${lightblue}DESCRIPTION\tDIRECTION\tPORT\tPROTOCOL${default}" @@ -1104,16 +1104,16 @@ fn_info_message_teamspeak3(){ } fn_info_message_teeworlds(){ - echo -e "netstat -atunp | grep teeworlds_srv" + echo -e "netstat -atunp | grep teeworlds" echo -e "" { echo -e "${lightblue}DESCRIPTION\tDIRECTION\tPORT\tPROTOCOL${default}" - echo -e "> Game\tINBOUND\t${port}\ttcp" + echo -e "> Game\Query\tINBOUND\t${port}\ttcp" } | column -s $'\t' -t } fn_info_message_terraria(){ - echo -e "netstat -atunp | grep TerrariaServer" + echo -e "netstat -atunp | grep Terraria" echo -e "" { echo -e "${lightblue}DESCRIPTION\tDIRECTION\tPORT\tPROTOCOL${default}" @@ -1147,7 +1147,7 @@ fn_info_message_unreal(){ 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}" + echo -e "> Query (GameSpy)\tINBOUND\t${queryportgs}\tudp\tOldQueryPortNumber=${queryportgs}" fi if [ "${appid}" == "215360" ]; then echo -e "< Master server\tOUTBOUND\t28852\ttcp/udp" @@ -1174,6 +1174,30 @@ fn_info_message_unreal(){ } | column -s $'\t' -t } +fn_info_message_unreal2(){ + fn_info_message_password_strip + 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 [ "${appid}" != "223250" ]; then + echo -e "> Query (GameSpy)\tINBOUND\t${queryportgs}\tudp\tOldQueryPortNumber=${queryportgs}" + fi + echo -e "> WebAdmin\tINBOUND\t${webadminport}\ttcp\tListenPort=${webadminport}" + } | column -s $'\t' -t + echo -e "" + echo -e "${lightgreen}${servername} WebAdmin${default}" + fn_messages_separator + { + echo -e "${lightblue}WebAdmin enabled:\t${default}${webadminenabled}" + echo -e "${lightblue}WebAdmin url:\t${default}http://${ip}:${webadminport}" + echo -e "${lightblue}WebAdmin username:\t${default}${webadminuser}" + echo -e "${lightblue}WebAdmin password:\t${default}${webadminpass}" + } | column -s $'\t' -t +} + fn_info_message_unreal3(){ fn_info_message_password_strip echo -e "netstat -atunp | grep ut3-bin" @@ -1245,19 +1269,19 @@ fn_info_message_wurmunlimited(){ { echo -e "${lightblue}DESCRIPTION\tDIRECTION\tPORT\tPROTOCOL${default}" echo -e "> Game\tINBOUND\t${port}\ttcp" - echo -e "> Game/Query\tINBOUND\t${queryport}\tudp" + echo -e "> Query\tINBOUND\t${queryport}\tudp" } | column -s $'\t' -t } fn_info_message_mta(){ - echo -e "netstat -atunp | grep mta-server64" + echo -e "netstat -atunp | grep mta-server" echo -e "" { echo -e "${lightblue}DESCRIPTION\tDIRECTION\tPORT\tPROTOCOL${default}" - echo -e "> Game\tOUTBOUND\t${port}\tudp" + echo -e "> Game/Query\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" + echo -e "> Query Port\tOUTBOUND\t${queryport}\tudp" fi } | column -s $'\t' -t } @@ -1306,10 +1330,10 @@ fn_info_message_warfork(){ fn_info_message_select_engine(){ # Display details depending on game or engine. - if [ "${shortname}" == "sdtd" ]; then - fn_info_message_sdtd - elif [ "${shortname}" == "ark" ]; then + if [ "${shortname}" == "ark" ]; then fn_info_message_ark + elif [ "${shortname}" == "arma3" ]; then + fn_info_message_arma3 elif [ "${shortname}" == "bo" ]; then fn_info_message_ballisticoverkill elif [ "${shortname}" == "bt" ]; then @@ -1326,6 +1350,8 @@ fn_info_message_select_engine(){ fn_info_message_cod4 elif [ "${shortname}" == "codwaw" ]; then fn_info_message_codwaw + elif [ "${shortname}" == "dst" ]; then + fn_info_message_dst elif [ "${shortname}" == "eco" ]; then fn_info_message_eco elif [ "${shortname}" == "etl" ]; then @@ -1342,6 +1368,8 @@ fn_info_message_select_engine(){ fn_info_message_justcause3 elif [ "${shortname}" == "kf2" ]; then fn_info_message_kf2 + elif [ "${shortname}" == "pz" ]; then + fn_info_message_projectzomboid elif [ "${shortname}" == "pstbs" ]; then fn_info_message_pstbs elif [ "${shortname}" == "pc" ]; then @@ -1356,30 +1384,44 @@ fn_info_message_select_engine(){ fn_info_message_quakelive elif [ "${shortname}" == "samp" ]; then fn_info_message_samp + elif [ "${shortname}" == "sdtd" ]; then + fn_info_message_sdtd elif [ "${shortname}" == "squad" ]; then fn_info_message_squad elif [ "${shortname}" == "st" ]; then fn_info_message_stationeers elif [ "${shortname}" == "sof2" ]; then - fn_info_message_sof2 + fn_info_message_sof2 elif [ "${shortname}" == "sol" ]; then fn_info_message_soldat + elif [ "${shortname}" == "st" ]; then + fn_info_message_starbound elif [ "${shortname}" == "sbots" ]; then fn_info_message_sbots + elif [ "${shortname}" == "ss3" ]; then + fn_info_message_ss3 + elif [ "${shortname}" == "terraria" ]; then + fn_info_message_terraria elif [ "${shortname}" == "ts3" ]; then fn_info_message_teamspeak3 elif [ "${shortname}" == "tu" ]; then fn_info_message_towerunite + elif [ "${shortname}" == "tw" ]; then + fn_info_message_teeworlds elif [ "${shortname}" == "unt" ]; then fn_info_message_unturned - elif [ "${shortname}" == "mohaa" ]; then - fn_info_message_mohaa + elif [ "${shortname}" == "mc" ]; then + fn_info_message_minecraft elif [ "${shortname}" == "mh" ]; then fn_info_message_mordhau + elif [ "${shortname}" == "mohaa" ]; then + fn_info_message_mohaa elif [ "${shortname}" == "mta" ]; then fn_info_message_mta elif [ "${shortname}" == "mumble" ]; then fn_info_message_mumble + elif [ "${engine}" == "bf1942" ]; then + fn_info_message_bf1942 elif [ "${shortname}" == "rtcw" ]; then fn_info_message_rtcw elif [ "${shortname}" == "rust" ]; then @@ -1392,32 +1434,16 @@ fn_info_message_select_engine(){ fn_info_message_risingworld elif [ "${shortname}" == "wet" ]; then fn_info_message_wolfensteinenemyterritory - elif [ "${engine}" == "refractor" ]; then - fn_info_message_refractor - elif [ "${engine}" == "dontstarve" ]; then - fn_info_message_dontstarve elif [ "${engine}" == "goldsource" ]; then fn_info_message_goldsource - elif [ "${engine}" == "lwjgl2" ]; then - fn_info_message_minecraft - elif [ "${engine}" == "projectzomboid" ]; then - fn_info_message_projectzomboid - elif [ "${engine}" == "realvirtuality" ]; then - fn_info_message_realvirtuality - elif [ "${engine}" == "seriousengine35" ]; then - fn_info_message_seriousengine35 elif [ "${engine}" == "source" ]; then fn_info_message_source elif [ "${engine}" == "spark" ]; then fn_info_message_spark - elif [ "${engine}" == "starbound" ]; then - fn_info_message_starbound - elif [ "${engine}" == "teeworlds" ]; then - fn_info_message_teeworlds - elif [ "${engine}" == "terraria" ]; then - fn_info_message_terraria - elif [ "${engine}" == "unreal" ]||[ "${engine}" == "unreal2" ]; then + elif [ "${engine}" == "unreal" ]; then fn_info_message_unreal + elif [ "${engine}" == "unreal2" ]; then + fn_info_message_unreal2 elif [ "${engine}" == "unreal3" ]; then fn_info_message_unreal3 else diff --git a/lgsm/functions/info_parms.sh b/lgsm/functions/info_parms.sh index bcc5a0d9d..b0982b0a4 100644 --- a/lgsm/functions/info_parms.sh +++ b/lgsm/functions/info_parms.sh @@ -43,11 +43,12 @@ fn_info_parms_dst(){ } fn_info_parms_eco(){ - queryport=${webadminport} + queryport=${webadminport:-"0"} } fn_info_parms_factorio(){ port=${port:-"0"} + queryport=${rconport:-"0"} rconport=${rconport:-"0"} rconpassword=${rconpassword:-"NOT SET"} } @@ -89,18 +90,23 @@ fn_info_parms_mohaa(){ defaultmap=${defaultmap:-"NOT SET"} } +fn_info_parms_mta(){ + queryport=$((port + 123)) +} + fn_info_parms_projectzomboid(){ adminpassword=${adminpassword:-"NOT SET"} + queryport=${port:-"0"} } fn_info_parms_quakeworld(){ port=${port:-"0"} - queryport=${port} + queryport=${port:-"0"} } fn_info_parms_quake2(){ port=${port:-"0"} - queryport=${port} + queryport=${port:-"0"} defaultmap=${defaultmap:-"NOT SET"} } @@ -112,20 +118,20 @@ fn_info_parms_realvirtuality(){ fn_info_parms_risingworld(){ servername=${servername:-"NOT SET"} port=${port:-"0"} - queryport=${port} + queryport=${port:-"0"} httpqueryport=$((port - 1)) } fn_info_parms_rtcw(){ port=${port:-"0"} - queryport="${port}" + queryport="${port:-"0"}" defaultmap=${defaultmap:-"NOT SET"} } fn_info_parms_rust(){ servername=${servername:-"NOT SET"} port=${port:-"0"} - queryport=${port} + queryport=${port:-"0"} rconport=${rconport:-"0"} rconpassword=${rconpassword:-"NOT SET"} rconweb=${rconweb:-"NOT SET"} @@ -134,6 +140,10 @@ fn_info_parms_rust(){ tickrate=${tickrate:-"0"} } +fn_info_parms_samp(){ + queryport=${port:-"0"} +} + fn_info_parms_sof2(){ port=${port:-"0"} defaultmap=${defaultmap:-"NOT SET"} @@ -143,7 +153,7 @@ fn_info_parms_source(){ defaultmap=${defaultmap:-"NOT SET"} maxplayers=${maxplayers:-"0"} port=${port:-"0"} - queryport=${port} + queryport=${port:-"0"} clientport=${clientport:-"0"} } @@ -171,24 +181,33 @@ fn_info_parms_stickybots(){ fn_info_parms_sof2(){ port=${port:-"0"} - queryport=${port} + queryport=${port:-"0"} defaultmap=${defaultmap:-"NOT SET"} } fn_info_parms_soldat(){ port=${port:-"0"} - queryport=${port} + queryport=${port:-"0"} servername=${servername:-"NOT SET"} serverpassword=${serverpassword:-"NOT SET"} adminpassword=${adminpassword:-"NOT SET"} maxplayers=${maxplayers:-"0"} } +fn_info_parms_ss3(){ + port=${port:-"0"} + queryport=$((port + 1)) +} + fn_info_parms_towerunite(){ port=${port:-"0"} queryport=${queryport:-"0"} } +fn_info_parms_teeworlds(){ + queryport=${port:-"0"} +} + fn_info_parms_unreal(){ defaultmap=${defaultmap:-"NOT SET"} queryport=$((port + 1)) @@ -215,7 +234,7 @@ fn_info_parms_unturned(){ fn_info_parms_wf(){ port=${port:-"0"} - queryport="${port}" + queryport="${port:-"0"}" webadminport=${webadminport:-"0"} } @@ -255,6 +274,8 @@ elif [ "${shortname}" == "rtcw" ]; then # Rust elif [ "${shortname}" == "rust" ]; then fn_info_parms_rust +elif [ "${shortname}" == "samp" ]; then + fn_info_parms_samp # Rising World elif [ "${shortname}" == "rw" ]; then fn_info_parms_risingworld @@ -268,7 +289,7 @@ elif [ "${shortname}" == "sol" ]; then fn_info_parms_soldat # Serious Sam elif [ "${shortname}" == "ss3" ]; then - fn_info_parms_seriousengine35 + fn_info_parms_ss3 elif [ "${engine}" == "source" ]||[ "${engine}" == "goldsource" ]; then fn_info_parms_source # Spark @@ -276,8 +297,12 @@ elif [ "${engine}" == "spark" ]; then fn_info_parms_spark elif [ "${shortname}" == "tu" ]; then fn_info_parms_towerunite +elif [ "${shortname}" == "tw" ]; then + fn_info_parms_teeworlds elif [ "${shortname}" == "mh" ]; then fn_info_parms_mordhau +elif [ "${shortname}" == "mta" ]; then + fn_info_parms_mta # Unreal/Unreal 2 engine elif [ "${engine}" == "unreal" ]||[ "${engine}" == "unreal2" ]; then fn_info_parms_unreal diff --git a/lgsm/functions/query_gamedig.sh b/lgsm/functions/query_gamedig.sh index 0a256bcab..4f1bc5638 100644 --- a/lgsm/functions/query_gamedig.sh +++ b/lgsm/functions/query_gamedig.sh @@ -8,92 +8,21 @@ # Check if gamedig and jq are installed. if [ "$(command -v gamedig 2>/dev/null)" ]&&[ "$(command -v jq 2>/dev/null)" ]; then - if [ "${engine}" == "idtech3_ql" ]; then - local engine="quakelive" - elif [ "${shortname}" == "kf2" ]; then - local engine="unreal4" - fi - - local engine_query_array=( avalanche3.0 barotrauma madness quakelive realvirtuality refractor source goldsource spark starbound unity3d unreal4 wurm ) - for engine_query in "${engine_query_array[@]}" - do - if [ "${engine_query}" == "${engine}" ]; then - gamedigengine="protocol-valve" - fi - done - - local engine_query_array=( avalanche2.0 ) - for engine_query in "${engine_query_array[@]}" - do - if [ "${engine_query}" == "${engine}" ]; then - gamedigengine="jc2mp" - fi - done - - local engine_query_array=( quake ) - for engine_query in "${engine_query_array[@]}" - do - if [ "${engine_query}" == "${engine}" ]; then - gamedigengine="protocol-quake1" - fi - done - - local engine_query_array=( idtech2 iw2.0 ) - for engine_query in "${engine_query_array[@]}" - do - if [ "${engine_query}" == "${engine}" ]; then - gamedigengine="protocol-quake2" - fi - done - - local engine_query_array=( idtech3 iw3.0 ioquake3 qfusion ) - for engine_query in "${engine_query_array[@]}" - do - if [ "${engine_query}" == "${engine}" ]; then - gamedigengine="protocol-quake3" - fi - done - - local engine_query_array=( lwjgl2 ) - for engine_query in "${engine_query_array[@]}" - do - if [ "${engine_query}" == "${engine}" ]; then - gamedigengine="minecraft" - fi - done - - local shortname_query_array=( ts3 ) - for shortname_query in "${shortname_query_array[@]}" - do - if [ "${shortname_query}" == "${shortname}" ]; then - gamedigengine="teamspeak3" - fi - done - - local engine_query_array=( unreal ) - for engine_query in "${engine_query_array[@]}" - do - if [ "${engine_query}" == "${engine}" ]; then - gamedigengine="ut" - fi - done - # will bypass query if server offline. check_status.sh if [ "${status}" != "0" ]; then # checks if query is working null = pass. - gamedigcmd=$(echo -e "gamedig --type \"${gamedigengine}\" --host \"${ip}\" --query_port \"${queryport}\"|jq") - gamedigraw=$(gamedig --type "${gamedigengine}" --host "${ip}" --query_port "${queryport}") + gamedigcmd=$(echo -e "gamedig --type \"${querytype}\" --host \"${ip}\" --query_port \"${queryport}\"|jq") + gamedigraw=$(gamedig --type "${querytype}" --host "${ip}" --query_port "${queryport}") querystatus=$(echo -e "${gamedigraw}" | jq '.error|length') if [ "${querystatus}" != "null" ]; then - gamedigcmd=$(echo -e "gamedig --type \"${gamedigengine}\" --host \"${ip}\" --port \"${queryport}\"|jq") - gamedigraw=$(gamedig --type "${gamedigengine}" --host "${ip}" --port "${queryport}") + gamedigcmd=$(echo -e "gamedig --type \"${querytype}\" --host \"${ip}\" --port \"${queryport}\"|jq") + gamedigraw=$(gamedig --type "${querytype}" --host "${ip}" --port "${queryport}") querystatus=$(echo -e "${gamedigraw}" | jq '.error|length') fi - # server name. gdname=$(echo -e "${gamedigraw}" | jq -re '.name') if [ "${gdname}" == "null" ]; then diff --git a/lgsm/functions/query_gsquery.py b/lgsm/functions/query_gsquery.py index fcfd4edc3..0a41b495b 100644 --- a/lgsm/functions/query_gsquery.py +++ b/lgsm/functions/query_gsquery.py @@ -17,10 +17,15 @@ class gsquery: self.server_response_timeout = 5 self.default_buffer_length = 1024 # - sourcequery=[ 'avalanche3.0','barotrauma''madness','quakelive','realvirtuality','refractor','source','goldsource','spark','starbound','unity3d', 'unreal4', 'wurm' ] - idtech3query=['idtech3','iw3.0','ioquake3','qfusion'] - idtech2query=['idtech2','quake','iw2.0'] + sourcequery=['protocol-valve','avalanche3.0','barotrauma','madness','quakelive','realvirtuality','refractor','source','goldsource','spark','starbound','unity3d','unreal4','wurm'] + idtech2query=['protocol-quake3','idtech2','quake','iw2.0'] + idtech3query=['protocol-quake3','iw3.0','ioquake3','qfusion'] minecraftquery=['minecraft','lwjgl2'] + jc2mpquery=['jc2mp'] + mumblequery=['mumbleping'] + twquery=['teeworlds'] + unrealquery=['protocol-gamespy1','unreal'] + unreal2query=['protocol-unreal2','unreal2'] if self.option.engine in sourcequery: self.query_prompt_string = b'\xFF\xFF\xFF\xFFTSource Engine Query\0' elif self.option.engine in idtech2query: @@ -29,12 +34,16 @@ class gsquery: self.query_prompt_string = b'\xff\xff\xff\xffgetstatus' elif self.option.engine in minecraftquery: self.query_prompt_string = b'\xFE\xFD\x09\x3d\x54\x1f\x93' - elif self.option.engine == 'avalanche2.0': + elif self.option.engine in jc2mpquery: self.query_prompt_string = b'\xFE\xFD\x09\x10\x20\x30\x40' - elif self.option.engine == 'unreal': + elif self.option.engine in mumblequery: + self.query_prompt_string = b'\x00\x00\x00\x00\x01\x02\x03\x04\x05\x06\x07\x08' + elif self.option.engine in unrealquery: self.query_prompt_string = b'\x5C\x69\x6E\x66\x6F\x5C' - elif self.option.engine == 'unreal2': + elif self.option.engine in unreal2query: self.query_prompt_string = b'\x79\x00\x00\x00\x00' + elif self.option.engine in twquery: + self.query_prompt_string = b"\x04\x00\x00\xff\xff\xff\xff\x05" + bytearray(511) self.connected = False self.response = None @@ -104,7 +113,7 @@ if __name__ == '__main__': action='store', dest='engine', default=False, - help='Engine type: avalanche2.0 avalanche3.0 goldsource idtech2 idtech3 ioquake3 iw2.0 iw3.0 madness quake quakelive realvirtuality refracto source spark starbound unity3d unreal unreal2 unreal4 wurm.' + help='Engine type: protocol-valve protocol-quake3 protocol-quake3 protocol-gamespy1 protocol-unreal2 minecraft jc2mp mumbleping teeworlds' ) parser.add_option( '-v', '--verbose', From b4290a3c9684e54ed91434d6fa8a2e0a1c950aa6 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Mon, 25 Nov 2019 09:55:31 +0000 Subject: [PATCH 239/534] feat(linuxgsm): depricate servicename variable (#2594) servicename has been now completely replaced with selfname --- .../config-lgsm/ahl2server/_default.cfg | 14 +++--- .../config-lgsm/ahlserver/_default.cfg | 14 +++--- .../config-lgsm/arkserver/_default.cfg | 12 ++--- .../config-lgsm/arma3server/_default.cfg | 16 +++---- .../config-lgsm/bb2server/_default.cfg | 14 +++--- .../config-lgsm/bbserver/_default.cfg | 14 +++--- .../config-lgsm/bdserver/_default.cfg | 14 +++--- .../config-lgsm/bf1942server/_default.cfg | 12 ++--- .../config-lgsm/bmdmserver/_default.cfg | 14 +++--- .../config-lgsm/boserver/_default.cfg | 14 +++--- .../config-lgsm/bsserver/_default.cfg | 14 +++--- .../config-lgsm/bt1944server/_default.cfg | 14 +++--- .../config-lgsm/btserver/_default.cfg | 12 ++--- .../config-lgsm/ccserver/_default.cfg | 14 +++--- .../config-lgsm/cod2server/_default.cfg | 14 +++--- .../config-lgsm/cod4server/_default.cfg | 14 +++--- .../config-lgsm/codserver/_default.cfg | 14 +++--- .../config-lgsm/coduoserver/_default.cfg | 14 +++--- .../config-lgsm/codwawserver/_default.cfg | 14 +++--- .../config-lgsm/csczserver/_default.cfg | 14 +++--- .../config-lgsm/csgoserver/_default.cfg | 14 +++--- .../config-lgsm/csserver/_default.cfg | 14 +++--- .../config-lgsm/cssserver/_default.cfg | 14 +++--- .../config-lgsm/dabserver/_default.cfg | 14 +++--- .../config-lgsm/dmcserver/_default.cfg | 14 +++--- .../config-lgsm/dodserver/_default.cfg | 14 +++--- .../config-lgsm/dodsserver/_default.cfg | 14 +++--- .../config-lgsm/doiserver/_default.cfg | 14 +++--- .../config-lgsm/dstserver/_default.cfg | 15 +++--- .../config-lgsm/dysserver/_default.cfg | 14 +++--- .../config-lgsm/ecoserver/_default.cfg | 14 +++--- .../config-lgsm/emserver/_default.cfg | 14 +++--- .../config-lgsm/etlserver/_default.cfg | 14 +++--- .../config-lgsm/fctrserver/_default.cfg | 14 +++--- .../config-lgsm/fofserver/_default.cfg | 14 +++--- .../config-lgsm/gesserver/_default.cfg | 14 +++--- .../config-lgsm/gmodserver/_default.cfg | 14 +++--- .../config-lgsm/hl2dmserver/_default.cfg | 14 +++--- .../config-lgsm/hldmserver/_default.cfg | 14 +++--- .../config-lgsm/hldmsserver/_default.cfg | 14 +++--- .../config-lgsm/hwserver/_default.cfg | 16 +++---- .../config-lgsm/insserver/_default.cfg | 14 +++--- .../config-lgsm/inssserver/_default.cfg | 14 +++--- .../config-lgsm/iosserver/_default.cfg | 14 +++--- .../config-lgsm/jc2server/_default.cfg | 12 ++--- .../config-lgsm/jc3server/_default.cfg | 12 ++--- .../config-lgsm/kf2server/_default.cfg | 16 +++---- .../config-lgsm/kfserver/_default.cfg | 18 +++---- .../config-lgsm/l4d2server/_default.cfg | 14 +++--- .../config-lgsm/l4dserver/_default.cfg | 12 ++--- .../config-lgsm/mcserver/_default.cfg | 12 ++--- .../config-lgsm/mhserver/_default.cfg | 12 ++--- .../config-lgsm/mohaaserver/_default.cfg | 14 +++--- .../config-lgsm/mtaserver/_default.cfg | 12 ++--- .../config-lgsm/mumbleserver/_default.cfg | 14 +++--- .../config-lgsm/ndserver/_default.cfg | 14 +++--- .../config-lgsm/nmrihserver/_default.cfg | 14 +++--- .../config-lgsm/ns2cserver/_default.cfg | 14 +++--- .../config-lgsm/ns2server/_default.cfg | 14 +++--- .../config-lgsm/nsserver/_default.cfg | 14 +++--- .../config-lgsm/opforserver/_default.cfg | 14 +++--- .../config-lgsm/pcserver/_default.cfg | 14 +++--- .../config-lgsm/pstbsserver/_default.cfg | 14 +++--- .../config-lgsm/pvkiiserver/_default.cfg | 14 +++--- .../config-lgsm/pzserver/_default.cfg | 16 +++---- .../config-lgsm/q2server/_default.cfg | 14 +++--- .../config-lgsm/q3server/_default.cfg | 14 +++--- .../config-lgsm/qlserver/_default.cfg | 16 +++---- .../config-lgsm/qwserver/_default.cfg | 14 +++--- .../config-lgsm/ricochetserver/_default.cfg | 14 +++--- .../config-lgsm/roserver/_default.cfg | 18 +++---- .../config-lgsm/rtcwserver/_default.cfg | 14 +++--- .../config-lgsm/rustserver/_default.cfg | 18 +++---- .../config-lgsm/rwserver/_default.cfg | 12 ++--- .../config-lgsm/sampserver/_default.cfg | 12 ++--- .../config-lgsm/sbotsserver/_default.cfg | 12 ++--- .../config-lgsm/sbserver/_default.cfg | 12 ++--- .../config-lgsm/sdtdserver/_default.cfg | 14 +++--- .../config-lgsm/sfcserver/_default.cfg | 14 +++--- .../config-lgsm/sof2server/_default.cfg | 14 +++--- .../config-lgsm/solserver/_default.cfg | 12 ++--- .../config-lgsm/squadserver/_default.cfg | 16 +++---- .../config-lgsm/ss3server/_default.cfg | 18 +++---- .../config-lgsm/stserver/_default.cfg | 12 ++--- .../config-lgsm/svenserver/_default.cfg | 14 +++--- .../config-lgsm/terrariaserver/_default.cfg | 14 +++--- .../config-lgsm/tf2server/_default.cfg | 14 +++--- .../config-lgsm/tfcserver/_default.cfg | 14 +++--- .../config-lgsm/ts3server/_default.cfg | 14 +++--- .../config-lgsm/tsserver/_default.cfg | 14 +++--- .../config-lgsm/tuserver/_default.cfg | 16 +++---- .../config-lgsm/twserver/_default.cfg | 16 +++---- .../config-lgsm/untserver/_default.cfg | 18 +++---- .../config-lgsm/ut2k4server/_default.cfg | 18 +++---- .../config-lgsm/ut3server/_default.cfg | 20 ++++---- .../config-lgsm/ut99server/_default.cfg | 14 +++--- .../config-lgsm/utserver/_default.cfg | 12 ++--- .../config-lgsm/vsserver/_default.cfg | 14 +++--- .../config-lgsm/wetserver/_default.cfg | 14 +++--- .../config-lgsm/wfserver/_default.cfg | 14 +++--- .../config-lgsm/wurmserver/_default.cfg | 14 +++--- .../config-lgsm/zmrserver/_default.cfg | 14 +++--- .../config-lgsm/zpsserver/_default.cfg | 14 +++--- lgsm/functions/alert.sh | 20 ++++---- lgsm/functions/alert_ifttt.sh | 2 +- lgsm/functions/check_status.sh | 2 +- lgsm/functions/command_backup.sh | 16 +++---- lgsm/functions/command_console.sh | 2 +- lgsm/functions/command_debug.sh | 2 +- lgsm/functions/command_start.sh | 16 +++---- lgsm/functions/command_stop.sh | 8 ++-- lgsm/functions/core_messages.sh | 48 +++++++++---------- lgsm/functions/fix_ut3.sh | 2 +- lgsm/functions/info_distro.sh | 2 +- lgsm/functions/info_messages.sh | 4 +- lgsm/functions/info_parms.sh | 2 +- lgsm/functions/install_gslt.sh | 10 ++-- linuxgsm.sh | 11 ++--- tests/tests_fctrserver.sh | 13 +++-- tests/tests_jc2server.sh | 13 +++-- tests/tests_mcserver.sh | 13 +++-- tests/tests_ts3server.sh | 13 +++-- 122 files changed, 824 insertions(+), 832 deletions(-) diff --git a/lgsm/config-default/config-lgsm/ahl2server/_default.cfg b/lgsm/config-default/config-lgsm/ahl2server/_default.cfg index 1497127b0..9db6afe4a 100644 --- a/lgsm/config-default/config-lgsm/ahl2server/_default.cfg +++ b/lgsm/config-default/config-lgsm/ahl2server/_default.cfg @@ -154,7 +154,7 @@ glibc="2.15" systemdir="${serverfiles}/ahl2" executabledir="${serverfiles}" executable="./srcds_run" -servercfg="${servicename}.cfg" +servercfg="${selfname}.cfg" servercfgdefault="server.cfg" servercfgdir="${systemdir}/cfg" servercfgfullpath="${servercfgdir}/${servercfg}" @@ -167,11 +167,11 @@ logdir="${rootdir}/log" gamelogdir="${systemdir}/logs" lgsmlogdir="${logdir}/script" consolelogdir="${logdir}/console" -lgsmlog="${lgsmlogdir}/${servicename}-script.log" -consolelog="${consolelogdir}/${servicename}-console.log" -alertlog="${lgsmlogdir}/${servicename}-alert.log" -postdetailslog="${lgsmlogdir}/${servicename}-postdetails.log" +lgsmlog="${lgsmlogdir}/${selfname}-script.log" +consolelog="${consolelogdir}/${selfname}-console.log" +alertlog="${lgsmlogdir}/${selfname}-alert.log" +postdetailslog="${lgsmlogdir}/${selfname}-postdetails.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" +lgsmlogdate="${lgsmlogdir}/${selfname}-script-$(date '+%Y-%m-%d-%H:%M:%S').log" +consolelogdate="${consolelogdir}/${selfname}-console-$(date '+%Y-%m-%d-%H:%M:%S').log" diff --git a/lgsm/config-default/config-lgsm/ahlserver/_default.cfg b/lgsm/config-default/config-lgsm/ahlserver/_default.cfg index 9be4a37f5..b9d5e36b5 100644 --- a/lgsm/config-default/config-lgsm/ahlserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/ahlserver/_default.cfg @@ -150,7 +150,7 @@ glibc="2.3.4" systemdir="${serverfiles}/action" executabledir="${serverfiles}" executable="./hlds_run" -servercfg="${servicename}.cfg" +servercfg="${selfname}.cfg" servercfgdefault="server.cfg" servercfgdir="${systemdir}" servercfgfullpath="${servercfgdir}/${servercfg}" @@ -163,11 +163,11 @@ logdir="${rootdir}/log" gamelogdir="${systemdir}/logs" lgsmlogdir="${logdir}/script" consolelogdir="${logdir}/console" -lgsmlog="${lgsmlogdir}/${servicename}-script.log" -consolelog="${consolelogdir}/${servicename}-console.log" -alertlog="${lgsmlogdir}/${servicename}-alert.log" -postdetailslog="${lgsmlogdir}/${servicename}-postdetails.log" +lgsmlog="${lgsmlogdir}/${selfname}-script.log" +consolelog="${consolelogdir}/${selfname}-console.log" +alertlog="${lgsmlogdir}/${selfname}-alert.log" +postdetailslog="${lgsmlogdir}/${selfname}-postdetails.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" +lgsmlogdate="${lgsmlogdir}/${selfname}-script-$(date '+%Y-%m-%d-%H:%M:%S').log" +consolelogdate="${consolelogdir}/${selfname}-console-$(date '+%Y-%m-%d-%H:%M:%S').log" diff --git a/lgsm/config-default/config-lgsm/arkserver/_default.cfg b/lgsm/config-default/config-lgsm/arkserver/_default.cfg index f2587f978..8aace7519 100644 --- a/lgsm/config-default/config-lgsm/arkserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/arkserver/_default.cfg @@ -164,11 +164,11 @@ logdir="${rootdir}/log" gamelogdir="${systemdir}/Saved/Logs" lgsmlogdir="${logdir}/script" consolelogdir="${logdir}/console" -lgsmlog="${lgsmlogdir}/${servicename}-script.log" -consolelog="${consolelogdir}/${servicename}-console.log" -alertlog="${lgsmlogdir}/${servicename}-alert.log" -postdetailslog="${lgsmlogdir}/${servicename}-postdetails.log" +lgsmlog="${lgsmlogdir}/${selfname}-script.log" +consolelog="${consolelogdir}/${selfname}-console.log" +alertlog="${lgsmlogdir}/${selfname}-alert.log" +postdetailslog="${lgsmlogdir}/${selfname}-postdetails.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" +lgsmlogdate="${lgsmlogdir}/${selfname}-script-$(date '+%Y-%m-%d-%H:%M:%S').log" +consolelogdate="${consolelogdir}/${selfname}-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 4aee5c41d..b8e8b3db7 100644 --- a/lgsm/config-default/config-lgsm/arma3server/_default.cfg +++ b/lgsm/config-default/config-lgsm/arma3server/_default.cfg @@ -165,8 +165,8 @@ glibc="2.13" systemdir="${serverfiles}" executabledir="${serverfiles}" executable="./arma3server" -servercfg="${servicename}.server.cfg" -networkcfg="${servicename}.network.cfg" +servercfg="${selfname}.server.cfg" +networkcfg="${selfname}.network.cfg" servercfgdefault="server.cfg" networkcfgdefault="network.cfg" servercfgdir="${systemdir}/cfg" @@ -180,11 +180,11 @@ backupdir="${lgsmdir}/backup" logdir="${rootdir}/log" lgsmlogdir="${logdir}/script" consolelogdir="${logdir}/console" -lgsmlog="${lgsmlogdir}/${servicename}-script.log" -consolelog="${consolelogdir}/${servicename}-console.log" -alertlog="${lgsmlogdir}/${servicename}-alert.log" -postdetailslog="${lgsmlogdir}/${servicename}-postdetails.log" +lgsmlog="${lgsmlogdir}/${selfname}-script.log" +consolelog="${consolelogdir}/${selfname}-console.log" +alertlog="${lgsmlogdir}/${selfname}-alert.log" +postdetailslog="${lgsmlogdir}/${selfname}-postdetails.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" +lgsmlogdate="${lgsmlogdir}/${selfname}-script-$(date '+%Y-%m-%d-%H:%M:%S').log" +consolelogdate="${consolelogdir}/${selfname}-console-$(date '+%Y-%m-%d-%H:%M:%S').log" diff --git a/lgsm/config-default/config-lgsm/bb2server/_default.cfg b/lgsm/config-default/config-lgsm/bb2server/_default.cfg index 9dfd3afd7..044dd18a3 100644 --- a/lgsm/config-default/config-lgsm/bb2server/_default.cfg +++ b/lgsm/config-default/config-lgsm/bb2server/_default.cfg @@ -155,7 +155,7 @@ glibc="2.17" systemdir="${serverfiles}/brainbread2" executabledir="${serverfiles}" executable="./srcds_run" -servercfg="${servicename}.cfg" +servercfg="${selfname}.cfg" servercfgdefault="server.cfg" servercfgdir="${systemdir}/cfg" servercfgfullpath="${servercfgdir}/${servercfg}" @@ -168,11 +168,11 @@ logdir="${rootdir}/log" gamelogdir="${systemdir}/logs" lgsmlogdir="${logdir}/script" consolelogdir="${logdir}/console" -lgsmlog="${lgsmlogdir}/${servicename}-script.log" -consolelog="${consolelogdir}/${servicename}-console.log" -alertlog="${lgsmlogdir}/${servicename}-alert.log" -postdetailslog="${lgsmlogdir}/${servicename}-postdetails.log" +lgsmlog="${lgsmlogdir}/${selfname}-script.log" +consolelog="${consolelogdir}/${selfname}-console.log" +alertlog="${lgsmlogdir}/${selfname}-alert.log" +postdetailslog="${lgsmlogdir}/${selfname}-postdetails.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" +lgsmlogdate="${lgsmlogdir}/${selfname}-script-$(date '+%Y-%m-%d-%H:%M:%S').log" +consolelogdate="${consolelogdir}/${selfname}-console-$(date '+%Y-%m-%d-%H:%M:%S').log" diff --git a/lgsm/config-default/config-lgsm/bbserver/_default.cfg b/lgsm/config-default/config-lgsm/bbserver/_default.cfg index aa03073b8..a263486d4 100644 --- a/lgsm/config-default/config-lgsm/bbserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/bbserver/_default.cfg @@ -150,7 +150,7 @@ glibc="2.3.4" systemdir="${serverfiles}/brainbread" executabledir="${serverfiles}" executable="./hlds_run" -servercfg="${servicename}.cfg" +servercfg="${selfname}.cfg" servercfgdefault="server.cfg" servercfgdir="${systemdir}" servercfgfullpath="${servercfgdir}/${servercfg}" @@ -163,11 +163,11 @@ logdir="${rootdir}/log" gamelogdir="${systemdir}/logs" lgsmlogdir="${logdir}/script" consolelogdir="${logdir}/console" -lgsmlog="${lgsmlogdir}/${servicename}-script.log" -consolelog="${consolelogdir}/${servicename}-console.log" -alertlog="${lgsmlogdir}/${servicename}-alert.log" -postdetailslog="${lgsmlogdir}/${servicename}-postdetails.log" +lgsmlog="${lgsmlogdir}/${selfname}-script.log" +consolelog="${consolelogdir}/${selfname}-console.log" +alertlog="${lgsmlogdir}/${selfname}-alert.log" +postdetailslog="${lgsmlogdir}/${selfname}-postdetails.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" +lgsmlogdate="${lgsmlogdir}/${selfname}-script-$(date '+%Y-%m-%d-%H:%M:%S').log" +consolelogdate="${consolelogdir}/${selfname}-console-$(date '+%Y-%m-%d-%H:%M:%S').log" diff --git a/lgsm/config-default/config-lgsm/bdserver/_default.cfg b/lgsm/config-default/config-lgsm/bdserver/_default.cfg index 1b12ebb29..a57e41c12 100644 --- a/lgsm/config-default/config-lgsm/bdserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/bdserver/_default.cfg @@ -149,7 +149,7 @@ glibc="2.14" systemdir="${serverfiles}/bdef" executabledir="${serverfiles}" executable="./hlds_run" -servercfg="${servicename}.cfg" +servercfg="${selfname}.cfg" servercfgdefault="server.cfg" servercfgdir="${systemdir}" servercfgfullpath="${servercfgdir}/${servercfg}" @@ -162,11 +162,11 @@ logdir="${rootdir}/log" gamelogdir="${systemdir}/logs" lgsmlogdir="${logdir}/script" consolelogdir="${logdir}/console" -lgsmlog="${lgsmlogdir}/${servicename}-script.log" -consolelog="${consolelogdir}/${servicename}-console.log" -alertlog="${lgsmlogdir}/${servicename}-alert.log" -postdetailslog="${lgsmlogdir}/${servicename}-postdetails.log" +lgsmlog="${lgsmlogdir}/${selfname}-script.log" +consolelog="${consolelogdir}/${selfname}-console.log" +alertlog="${lgsmlogdir}/${selfname}-alert.log" +postdetailslog="${lgsmlogdir}/${selfname}-postdetails.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" +lgsmlogdate="${lgsmlogdir}/${selfname}-script-$(date '+%Y-%m-%d-%H:%M:%S').log" +consolelogdate="${consolelogdir}/${selfname}-console-$(date '+%Y-%m-%d-%H:%M:%S').log" diff --git a/lgsm/config-default/config-lgsm/bf1942server/_default.cfg b/lgsm/config-default/config-lgsm/bf1942server/_default.cfg index b54c300f8..cd77130db 100644 --- a/lgsm/config-default/config-lgsm/bf1942server/_default.cfg +++ b/lgsm/config-default/config-lgsm/bf1942server/_default.cfg @@ -147,11 +147,11 @@ logdir="${rootdir}/log" gamelogdir="${serverfiles}/Logs" lgsmlogdir="${logdir}/script" consolelogdir="${logdir}/console" -lgsmlog="${lgsmlogdir}/${servicename}-script.log" -consolelog="${consolelogdir}/${servicename}-console.log" -alertlog="${lgsmlogdir}/${servicename}-alert.log" -postdetailslog="${lgsmlogdir}/${servicename}-postdetails.log" +lgsmlog="${lgsmlogdir}/${selfname}-script.log" +consolelog="${consolelogdir}/${selfname}-console.log" +alertlog="${lgsmlogdir}/${selfname}-alert.log" +postdetailslog="${lgsmlogdir}/${selfname}-postdetails.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" +lgsmlogdate="${lgsmlogdir}/${selfname}-script-$(date '+%Y-%m-%d-%H:%M:%S').log" +consolelogdate="${consolelogdir}/${selfname}-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 8026112ab..5b947486b 100644 --- a/lgsm/config-default/config-lgsm/bmdmserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/bmdmserver/_default.cfg @@ -155,7 +155,7 @@ glibc="2.15" systemdir="${serverfiles}/bms" executabledir="${serverfiles}" executable="./srcds_run" -servercfg="${servicename}.cfg" +servercfg="${selfname}.cfg" servercfgdefault="server.cfg" servercfgdir="${systemdir}/cfg" servercfgfullpath="${servercfgdir}/${servercfg}" @@ -168,11 +168,11 @@ logdir="${rootdir}/log" gamelogdir="${systemdir}/logs" lgsmlogdir="${logdir}/script" consolelogdir="${logdir}/console" -lgsmlog="${lgsmlogdir}/${servicename}-script.log" -consolelog="${consolelogdir}/${servicename}-console.log" -alertlog="${lgsmlogdir}/${servicename}-alert.log" -postdetailslog="${lgsmlogdir}/${servicename}-postdetails.log" +lgsmlog="${lgsmlogdir}/${selfname}-script.log" +consolelog="${consolelogdir}/${selfname}-console.log" +alertlog="${lgsmlogdir}/${selfname}-alert.log" +postdetailslog="${lgsmlogdir}/${selfname}-postdetails.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" +lgsmlogdate="${lgsmlogdir}/${selfname}-script-$(date '+%Y-%m-%d-%H:%M:%S').log" +consolelogdate="${consolelogdir}/${selfname}-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 0ab0986e0..da2b4163a 100644 --- a/lgsm/config-default/config-lgsm/boserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/boserver/_default.cfg @@ -148,7 +148,7 @@ glibc="2.15" systemdir="${serverfiles}" executabledir="${serverfiles}" executable="./BODS.x86" -servercfg="${servicename}.txt" +servercfg="${selfname}.txt" servercfgdefault="config.txt" servercfgdir="${systemdir}" servercfgfullpath="${servercfgdir}/${servercfg}" @@ -161,11 +161,11 @@ logdir="${rootdir}/log" gamelogdir="${systemdir}/logs" lgsmlogdir="${logdir}/script" consolelogdir="${logdir}/console" -lgsmlog="${lgsmlogdir}/${servicename}-script.log" -consolelog="${consolelogdir}/${servicename}-console.log" -alertlog="${lgsmlogdir}/${servicename}-alert.log" -postdetailslog="${lgsmlogdir}/${servicename}-postdetails.log" +lgsmlog="${lgsmlogdir}/${selfname}-script.log" +consolelog="${consolelogdir}/${selfname}-console.log" +alertlog="${lgsmlogdir}/${selfname}-alert.log" +postdetailslog="${lgsmlogdir}/${selfname}-postdetails.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" +lgsmlogdate="${lgsmlogdir}/${selfname}-script-$(date '+%Y-%m-%d-%H:%M:%S').log" +consolelogdate="${consolelogdir}/${selfname}-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 ceab458a7..6685734d9 100644 --- a/lgsm/config-default/config-lgsm/bsserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/bsserver/_default.cfg @@ -159,7 +159,7 @@ glibc="2.15" systemdir="${serverfiles}/berimbau" executabledir="${serverfiles}/bin" executable="./srcds_run.sh" -servercfg="${servicename}.cfg" +servercfg="${selfname}.cfg" servercfgdefault="server.cfg" servercfgdir="${systemdir}/cfg" servercfgfullpath="${servercfgdir}/${servercfg}" @@ -172,11 +172,11 @@ logdir="${rootdir}/log" gamelogdir="${systemdir}/logs" lgsmlogdir="${logdir}/script" consolelogdir="${logdir}/console" -lgsmlog="${lgsmlogdir}/${servicename}-script.log" -consolelog="${consolelogdir}/${servicename}-console.log" -alertlog="${lgsmlogdir}/${servicename}-alert.log" -postdetailslog="${lgsmlogdir}/${servicename}-postdetails.log" +lgsmlog="${lgsmlogdir}/${selfname}-script.log" +consolelog="${consolelogdir}/${selfname}-console.log" +alertlog="${lgsmlogdir}/${selfname}-alert.log" +postdetailslog="${lgsmlogdir}/${selfname}-postdetails.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" +lgsmlogdate="${lgsmlogdir}/${selfname}-script-$(date '+%Y-%m-%d-%H:%M:%S').log" +consolelogdate="${consolelogdir}/${selfname}-console-$(date '+%Y-%m-%d-%H:%M:%S').log" diff --git a/lgsm/config-default/config-lgsm/bt1944server/_default.cfg b/lgsm/config-default/config-lgsm/bt1944server/_default.cfg index c93336ca9..3565e3670 100644 --- a/lgsm/config-default/config-lgsm/bt1944server/_default.cfg +++ b/lgsm/config-default/config-lgsm/bt1944server/_default.cfg @@ -147,7 +147,7 @@ glibc="2.17" systemdir="${serverfiles}/Linux/Battalion" executabledir="${systemdir}/Binaries/Linux" executable="./BattalionServer" -servercfg="${servicename}.ini" +servercfg="${selfname}.ini" servercfgdefault="DefaultGame.ini" servercfgdir="${systemdir}/Saved/Config/LinuxServer" servercfgfullpath="${servercfgdir}/${servercfg}" @@ -160,11 +160,11 @@ logdir="${rootdir}/log" gamelogdir="${systemdir}/Saved/Logs" lgsmlogdir="${logdir}/script" consolelogdir="${logdir}/console" -lgsmlog="${lgsmlogdir}/${servicename}-script.log" -consolelog="${consolelogdir}/${servicename}-console.log" -alertlog="${lgsmlogdir}/${servicename}-alert.log" -postdetailslog="${lgsmlogdir}/${servicename}-postdetails.log" +lgsmlog="${lgsmlogdir}/${selfname}-script.log" +consolelog="${consolelogdir}/${selfname}-console.log" +alertlog="${lgsmlogdir}/${selfname}-alert.log" +postdetailslog="${lgsmlogdir}/${selfname}-postdetails.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" +lgsmlogdate="${lgsmlogdir}/${selfname}-script-$(date '+%Y-%m-%d-%H:%M:%S').log" +consolelogdate="${consolelogdir}/${selfname}-console-$(date '+%Y-%m-%d-%H:%M:%S').log" diff --git a/lgsm/config-default/config-lgsm/btserver/_default.cfg b/lgsm/config-default/config-lgsm/btserver/_default.cfg index 772a8dfe2..7825610a9 100644 --- a/lgsm/config-default/config-lgsm/btserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/btserver/_default.cfg @@ -155,11 +155,11 @@ logdir="${rootdir}/log" gamelogdir="${systemdir}/ServerLogs" lgsmlogdir="${logdir}/script" consolelogdir="${logdir}/console" -lgsmlog="${lgsmlogdir}/${servicename}-script.log" -consolelog="${consolelogdir}/${servicename}-console.log" -alertlog="${lgsmlogdir}/${servicename}-alert.log" -postdetailslog="${lgsmlogdir}/${servicename}-postdetails.log" +lgsmlog="${lgsmlogdir}/${selfname}-script.log" +consolelog="${consolelogdir}/${selfname}-console.log" +alertlog="${lgsmlogdir}/${selfname}-alert.log" +postdetailslog="${lgsmlogdir}/${selfname}-postdetails.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" +lgsmlogdate="${lgsmlogdir}/${selfname}-script-$(date '+%Y-%m-%d-%H:%M:%S').log" +consolelogdate="${consolelogdir}/${selfname}-console-$(date '+%Y-%m-%d-%H:%M:%S').log" diff --git a/lgsm/config-default/config-lgsm/ccserver/_default.cfg b/lgsm/config-default/config-lgsm/ccserver/_default.cfg index d2e964299..e6feab660 100644 --- a/lgsm/config-default/config-lgsm/ccserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/ccserver/_default.cfg @@ -150,7 +150,7 @@ glibc="2.15" systemdir="${serverfiles}/cure" executabledir="${serverfiles}" executable="./srcds_run" -servercfg="${servicename}.cfg" +servercfg="${selfname}.cfg" servercfgdefault="server.cfg" servercfgdir="${systemdir}/cfg" servercfgfullpath="${servercfgdir}/${servercfg}" @@ -163,11 +163,11 @@ logdir="${rootdir}/log" gamelogdir="${systemdir}/logs" lgsmlogdir="${logdir}/script" consolelogdir="${logdir}/console" -lgsmlog="${lgsmlogdir}/${servicename}-script.log" -consolelog="${consolelogdir}/${servicename}-console.log" -alertlog="${lgsmlogdir}/${servicename}-alert.log" -postdetailslog="${lgsmlogdir}/${servicename}-postdetails.log" +lgsmlog="${lgsmlogdir}/${selfname}-script.log" +consolelog="${consolelogdir}/${selfname}-console.log" +alertlog="${lgsmlogdir}/${selfname}-alert.log" +postdetailslog="${lgsmlogdir}/${selfname}-postdetails.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" +lgsmlogdate="${lgsmlogdir}/${selfname}-script-$(date '+%Y-%m-%d-%H:%M:%S').log" +consolelogdate="${consolelogdir}/${selfname}-console-$(date '+%Y-%m-%d-%H:%M:%S').log" diff --git a/lgsm/config-default/config-lgsm/cod2server/_default.cfg b/lgsm/config-default/config-lgsm/cod2server/_default.cfg index e3237eb2b..61e2962c3 100644 --- a/lgsm/config-default/config-lgsm/cod2server/_default.cfg +++ b/lgsm/config-default/config-lgsm/cod2server/_default.cfg @@ -137,7 +137,7 @@ glibc="2.1.3" systemdir="${serverfiles}" executabledir="${serverfiles}" executable="./cod2_lnxded" -servercfg="${servicename}.cfg" +servercfg="${selfname}.cfg" servercfgdefault="server.cfg" servercfgdir="${systemdir}/main" servercfgfullpath="${servercfgdir}/${servercfg}" @@ -150,11 +150,11 @@ logdir="${rootdir}/log" gamelogdir="${serverfiles}/Logs" lgsmlogdir="${logdir}/script" consolelogdir="${logdir}/console" -lgsmlog="${lgsmlogdir}/${servicename}-script.log" -consolelog="${consolelogdir}/${servicename}-console.log" -alertlog="${lgsmlogdir}/${servicename}-alert.log" -postdetailslog="${lgsmlogdir}/${servicename}-postdetails.log" +lgsmlog="${lgsmlogdir}/${selfname}-script.log" +consolelog="${consolelogdir}/${selfname}-console.log" +alertlog="${lgsmlogdir}/${selfname}-alert.log" +postdetailslog="${lgsmlogdir}/${selfname}-postdetails.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" +lgsmlogdate="${lgsmlogdir}/${selfname}-script-$(date '+%Y-%m-%d-%H:%M:%S').log" +consolelogdate="${consolelogdir}/${selfname}-console-$(date '+%Y-%m-%d-%H:%M:%S').log" diff --git a/lgsm/config-default/config-lgsm/cod4server/_default.cfg b/lgsm/config-default/config-lgsm/cod4server/_default.cfg index 1cc245ef8..ebf573ac3 100644 --- a/lgsm/config-default/config-lgsm/cod4server/_default.cfg +++ b/lgsm/config-default/config-lgsm/cod4server/_default.cfg @@ -137,7 +137,7 @@ glibc="2.12" systemdir="${serverfiles}" executabledir="${serverfiles}" executable="./cod4x18_dedrun" -servercfg="${servicename}.cfg" +servercfg="${selfname}.cfg" servercfgdefault="server.cfg" servercfgdir="${systemdir}/main" servercfgfullpath="${servercfgdir}/${servercfg}" @@ -150,11 +150,11 @@ logdir="${rootdir}/log" gamelogdir="${serverfiles}/Logs" lgsmlogdir="${logdir}/script" consolelogdir="${logdir}/console" -lgsmlog="${lgsmlogdir}/${servicename}-script.log" -consolelog="${consolelogdir}/${servicename}-console.log" -alertlog="${lgsmlogdir}/${servicename}-alert.log" -postdetailslog="${lgsmlogdir}/${servicename}-postdetails.log" +lgsmlog="${lgsmlogdir}/${selfname}-script.log" +consolelog="${consolelogdir}/${selfname}-console.log" +alertlog="${lgsmlogdir}/${selfname}-alert.log" +postdetailslog="${lgsmlogdir}/${selfname}-postdetails.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" +lgsmlogdate="${lgsmlogdir}/${selfname}-script-$(date '+%Y-%m-%d-%H:%M:%S').log" +consolelogdate="${consolelogdir}/${selfname}-console-$(date '+%Y-%m-%d-%H:%M:%S').log" diff --git a/lgsm/config-default/config-lgsm/codserver/_default.cfg b/lgsm/config-default/config-lgsm/codserver/_default.cfg index 9ca4a33bd..bd783d62c 100644 --- a/lgsm/config-default/config-lgsm/codserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/codserver/_default.cfg @@ -137,7 +137,7 @@ glibc="2.1" systemdir="${serverfiles}" executabledir="${serverfiles}" executable="./cod_lnxded" -servercfg="${servicename}.cfg" +servercfg="${selfname}.cfg" servercfgdefault="server.cfg" servercfgdir="${systemdir}/main" servercfgfullpath="${servercfgdir}/${servercfg}" @@ -150,11 +150,11 @@ logdir="${rootdir}/log" gamelogdir="${serverfiles}/Logs" lgsmlogdir="${logdir}/script" consolelogdir="${logdir}/console" -lgsmlog="${lgsmlogdir}/${servicename}-script.log" -consolelog="${consolelogdir}/${servicename}-console.log" -alertlog="${lgsmlogdir}/${servicename}-alert.log" -postdetailslog="${lgsmlogdir}/${servicename}-postdetails.log" +lgsmlog="${lgsmlogdir}/${selfname}-script.log" +consolelog="${consolelogdir}/${selfname}-console.log" +alertlog="${lgsmlogdir}/${selfname}-alert.log" +postdetailslog="${lgsmlogdir}/${selfname}-postdetails.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" +lgsmlogdate="${lgsmlogdir}/${selfname}-script-$(date '+%Y-%m-%d-%H:%M:%S').log" +consolelogdate="${consolelogdir}/${selfname}-console-$(date '+%Y-%m-%d-%H:%M:%S').log" diff --git a/lgsm/config-default/config-lgsm/coduoserver/_default.cfg b/lgsm/config-default/config-lgsm/coduoserver/_default.cfg index 86da8fdc2..a187cfc99 100644 --- a/lgsm/config-default/config-lgsm/coduoserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/coduoserver/_default.cfg @@ -137,7 +137,7 @@ glibc="2.1" systemdir="${serverfiles}" executabledir="${serverfiles}" executable="./coduo_lnxded" -servercfg="${servicename}.cfg" +servercfg="${selfname}.cfg" servercfgdefault="server.cfg" servercfgdir="${systemdir}/uo" servercfgfullpath="${servercfgdir}/${servercfg}" @@ -150,11 +150,11 @@ logdir="${rootdir}/log" gamelogdir="${serverfiles}/Logs" lgsmlogdir="${logdir}/script" consolelogdir="${logdir}/console" -lgsmlog="${lgsmlogdir}/${servicename}-script.log" -consolelog="${consolelogdir}/${servicename}-console.log" -alertlog="${lgsmlogdir}/${servicename}-alert.log" -postdetailslog="${lgsmlogdir}/${servicename}-postdetails.log" +lgsmlog="${lgsmlogdir}/${selfname}-script.log" +consolelog="${consolelogdir}/${selfname}-console.log" +alertlog="${lgsmlogdir}/${selfname}-alert.log" +postdetailslog="${lgsmlogdir}/${selfname}-postdetails.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" +lgsmlogdate="${lgsmlogdir}/${selfname}-script-$(date '+%Y-%m-%d-%H:%M:%S').log" +consolelogdate="${consolelogdir}/${selfname}-console-$(date '+%Y-%m-%d-%H:%M:%S').log" diff --git a/lgsm/config-default/config-lgsm/codwawserver/_default.cfg b/lgsm/config-default/config-lgsm/codwawserver/_default.cfg index 81d5bdb68..ba9163205 100644 --- a/lgsm/config-default/config-lgsm/codwawserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/codwawserver/_default.cfg @@ -137,7 +137,7 @@ glibc="2.3.2" systemdir="${serverfiles}" executabledir="${serverfiles}" executable="./codwaw_lnxded" -servercfg="${servicename}.cfg" +servercfg="${selfname}.cfg" servercfgdefault="server.cfg" servercfgdir="${systemdir}/main" servercfgfullpath="${servercfgdir}/${servercfg}" @@ -150,11 +150,11 @@ logdir="${rootdir}/log" gamelogdir="${serverfiles}/Logs" lgsmlogdir="${logdir}/script" consolelogdir="${logdir}/console" -lgsmlog="${lgsmlogdir}/${servicename}-script.log" -consolelog="${consolelogdir}/${servicename}-console.log" -alertlog="${lgsmlogdir}/${servicename}-alert.log" -postdetailslog="${lgsmlogdir}/${servicename}-postdetails.log" +lgsmlog="${lgsmlogdir}/${selfname}-script.log" +consolelog="${consolelogdir}/${selfname}-console.log" +alertlog="${lgsmlogdir}/${selfname}-alert.log" +postdetailslog="${lgsmlogdir}/${selfname}-postdetails.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" +lgsmlogdate="${lgsmlogdir}/${selfname}-script-$(date '+%Y-%m-%d-%H:%M:%S').log" +consolelogdate="${consolelogdir}/${selfname}-console-$(date '+%Y-%m-%d-%H:%M:%S').log" diff --git a/lgsm/config-default/config-lgsm/csczserver/_default.cfg b/lgsm/config-default/config-lgsm/csczserver/_default.cfg index 8cf8f7f24..918d78841 100644 --- a/lgsm/config-default/config-lgsm/csczserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/csczserver/_default.cfg @@ -150,7 +150,7 @@ glibc="2.3.6" systemdir="${serverfiles}/czero" executabledir="${serverfiles}" executable="./hlds_run" -servercfg="${servicename}.cfg" +servercfg="${selfname}.cfg" servercfgdefault="server.cfg" servercfgdir="${systemdir}" servercfgfullpath="${servercfgdir}/${servercfg}" @@ -163,11 +163,11 @@ logdir="${rootdir}/log" gamelogdir="${systemdir}/logs" lgsmlogdir="${logdir}/script" consolelogdir="${logdir}/console" -lgsmlog="${lgsmlogdir}/${servicename}-script.log" -consolelog="${consolelogdir}/${servicename}-console.log" -alertlog="${lgsmlogdir}/${servicename}-alert.log" -postdetailslog="${lgsmlogdir}/${servicename}-postdetails.log" +lgsmlog="${lgsmlogdir}/${selfname}-script.log" +consolelog="${consolelogdir}/${selfname}-console.log" +alertlog="${lgsmlogdir}/${selfname}-alert.log" +postdetailslog="${lgsmlogdir}/${selfname}-postdetails.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" +lgsmlogdate="${lgsmlogdir}/${selfname}-script-$(date '+%Y-%m-%d-%H:%M:%S').log" +consolelogdate="${consolelogdir}/${selfname}-console-$(date '+%Y-%m-%d-%H:%M:%S').log" diff --git a/lgsm/config-default/config-lgsm/csgoserver/_default.cfg b/lgsm/config-default/config-lgsm/csgoserver/_default.cfg index ac5c9c392..15f45808b 100644 --- a/lgsm/config-default/config-lgsm/csgoserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/csgoserver/_default.cfg @@ -175,7 +175,7 @@ glibc="2.15" systemdir="${serverfiles}/csgo" executabledir="${serverfiles}" executable="./srcds_run" -servercfg="${servicename}.cfg" +servercfg="${selfname}.cfg" servercfgdefault="server.cfg" servercfgdir="${systemdir}/cfg" servercfgfullpath="${servercfgdir}/${servercfg}" @@ -188,11 +188,11 @@ logdir="${rootdir}/log" gamelogdir="${systemdir}/logs" lgsmlogdir="${logdir}/script" consolelogdir="${logdir}/console" -lgsmlog="${lgsmlogdir}/${servicename}-script.log" -consolelog="${consolelogdir}/${servicename}-console.log" -alertlog="${lgsmlogdir}/${servicename}-alert.log" -postdetailslog="${lgsmlogdir}/${servicename}-postdetails.log" +lgsmlog="${lgsmlogdir}/${selfname}-script.log" +consolelog="${consolelogdir}/${selfname}-console.log" +alertlog="${lgsmlogdir}/${selfname}-alert.log" +postdetailslog="${lgsmlogdir}/${selfname}-postdetails.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" +lgsmlogdate="${lgsmlogdir}/${selfname}-script-$(date '+%Y-%m-%d-%H:%M:%S').log" +consolelogdate="${consolelogdir}/${selfname}-console-$(date '+%Y-%m-%d-%H:%M:%S').log" diff --git a/lgsm/config-default/config-lgsm/csserver/_default.cfg b/lgsm/config-default/config-lgsm/csserver/_default.cfg index 107110881..1c58f0256 100644 --- a/lgsm/config-default/config-lgsm/csserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/csserver/_default.cfg @@ -150,7 +150,7 @@ glibc="2.3.6" systemdir="${serverfiles}/cstrike" executabledir="${serverfiles}" executable="./hlds_run" -servercfg="${servicename}.cfg" +servercfg="${selfname}.cfg" servercfgdefault="server.cfg" servercfgdir="${systemdir}" servercfgfullpath="${servercfgdir}/${servercfg}" @@ -163,11 +163,11 @@ logdir="${rootdir}/log" gamelogdir="${systemdir}/logs" lgsmlogdir="${logdir}/script" consolelogdir="${logdir}/console" -lgsmlog="${lgsmlogdir}/${servicename}-script.log" -consolelog="${consolelogdir}/${servicename}-console.log" -alertlog="${lgsmlogdir}/${servicename}-alert.log" -postdetailslog="${lgsmlogdir}/${servicename}-postdetails.log" +lgsmlog="${lgsmlogdir}/${selfname}-script.log" +consolelog="${consolelogdir}/${selfname}-console.log" +alertlog="${lgsmlogdir}/${selfname}-alert.log" +postdetailslog="${lgsmlogdir}/${selfname}-postdetails.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" +lgsmlogdate="${lgsmlogdir}/${selfname}-script-$(date '+%Y-%m-%d-%H:%M:%S').log" +consolelogdate="${consolelogdir}/${selfname}-console-$(date '+%Y-%m-%d-%H:%M:%S').log" diff --git a/lgsm/config-default/config-lgsm/cssserver/_default.cfg b/lgsm/config-default/config-lgsm/cssserver/_default.cfg index f05845fef..d50676ced 100644 --- a/lgsm/config-default/config-lgsm/cssserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/cssserver/_default.cfg @@ -155,7 +155,7 @@ glibc="2.3.6" systemdir="${serverfiles}/cstrike" executabledir="${serverfiles}" executable="./srcds_run" -servercfg="${servicename}.cfg" +servercfg="${selfname}.cfg" servercfgdefault="server.cfg" servercfgdir="${systemdir}/cfg" servercfgfullpath="${servercfgdir}/${servercfg}" @@ -168,11 +168,11 @@ logdir="${rootdir}/log" gamelogdir="${systemdir}/logs" lgsmlogdir="${logdir}/script" consolelogdir="${logdir}/console" -lgsmlog="${lgsmlogdir}/${servicename}-script.log" -consolelog="${consolelogdir}/${servicename}-console.log" -alertlog="${lgsmlogdir}/${servicename}-alert.log" -postdetailslog="${lgsmlogdir}/${servicename}-postdetails.log" +lgsmlog="${lgsmlogdir}/${selfname}-script.log" +consolelog="${consolelogdir}/${selfname}-console.log" +alertlog="${lgsmlogdir}/${selfname}-alert.log" +postdetailslog="${lgsmlogdir}/${selfname}-postdetails.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" +lgsmlogdate="${lgsmlogdir}/${selfname}-script-$(date '+%Y-%m-%d-%H:%M:%S').log" +consolelogdate="${consolelogdir}/${selfname}-console-$(date '+%Y-%m-%d-%H:%M:%S').log" diff --git a/lgsm/config-default/config-lgsm/dabserver/_default.cfg b/lgsm/config-default/config-lgsm/dabserver/_default.cfg index feaa53597..03d518e06 100644 --- a/lgsm/config-default/config-lgsm/dabserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/dabserver/_default.cfg @@ -150,7 +150,7 @@ glibc="2.15" systemdir="${serverfiles}/dab" executabledir="${serverfiles}" executable="./dabds.sh" -servercfg="${servicename}.cfg" +servercfg="${selfname}.cfg" servercfgdefault="server.cfg" servercfgdir="${systemdir}/cfg" servercfgfullpath="${servercfgdir}/${servercfg}" @@ -163,11 +163,11 @@ logdir="${rootdir}/log" gamelogdir="${systemdir}/logs" lgsmlogdir="${logdir}/script" consolelogdir="${logdir}/console" -lgsmlog="${lgsmlogdir}/${servicename}-script.log" -consolelog="${consolelogdir}/${servicename}-console.log" -alertlog="${lgsmlogdir}/${servicename}-alert.log" -postdetailslog="${lgsmlogdir}/${servicename}-postdetails.log" +lgsmlog="${lgsmlogdir}/${selfname}-script.log" +consolelog="${consolelogdir}/${selfname}-console.log" +alertlog="${lgsmlogdir}/${selfname}-alert.log" +postdetailslog="${lgsmlogdir}/${selfname}-postdetails.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" +lgsmlogdate="${lgsmlogdir}/${selfname}-script-$(date '+%Y-%m-%d-%H:%M:%S').log" +consolelogdate="${consolelogdir}/${selfname}-console-$(date '+%Y-%m-%d-%H:%M:%S').log" diff --git a/lgsm/config-default/config-lgsm/dmcserver/_default.cfg b/lgsm/config-default/config-lgsm/dmcserver/_default.cfg index 5510df840..d2dcee9fa 100644 --- a/lgsm/config-default/config-lgsm/dmcserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/dmcserver/_default.cfg @@ -150,7 +150,7 @@ glibc="2.3.4" systemdir="${serverfiles}/dmc" executabledir="${serverfiles}" executable="./hlds_run" -servercfg="${servicename}.cfg" +servercfg="${selfname}.cfg" servercfgdefault="server.cfg" servercfgdir="${systemdir}" servercfgfullpath="${servercfgdir}/${servercfg}" @@ -163,11 +163,11 @@ logdir="${rootdir}/log" gamelogdir="${systemdir}/logs" lgsmlogdir="${logdir}/script" consolelogdir="${logdir}/console" -lgsmlog="${lgsmlogdir}/${servicename}-script.log" -consolelog="${consolelogdir}/${servicename}-console.log" -alertlog="${lgsmlogdir}/${servicename}-alert.log" -postdetailslog="${lgsmlogdir}/${servicename}-postdetails.log" +lgsmlog="${lgsmlogdir}/${selfname}-script.log" +consolelog="${consolelogdir}/${selfname}-console.log" +alertlog="${lgsmlogdir}/${selfname}-alert.log" +postdetailslog="${lgsmlogdir}/${selfname}-postdetails.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" +lgsmlogdate="${lgsmlogdir}/${selfname}-script-$(date '+%Y-%m-%d-%H:%M:%S').log" +consolelogdate="${consolelogdir}/${selfname}-console-$(date '+%Y-%m-%d-%H:%M:%S').log" diff --git a/lgsm/config-default/config-lgsm/dodserver/_default.cfg b/lgsm/config-default/config-lgsm/dodserver/_default.cfg index d6aae8134..f23ab09b8 100644 --- a/lgsm/config-default/config-lgsm/dodserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/dodserver/_default.cfg @@ -150,7 +150,7 @@ glibc="2.3.4" systemdir="${serverfiles}/dod" executabledir="${serverfiles}" executable="./hlds_run" -servercfg="${servicename}.cfg" +servercfg="${selfname}.cfg" servercfgdefault="server.cfg" servercfgdir="${systemdir}" servercfgfullpath="${servercfgdir}/${servercfg}" @@ -163,11 +163,11 @@ logdir="${rootdir}/log" gamelogdir="${systemdir}/logs" lgsmlogdir="${logdir}/script" consolelogdir="${logdir}/console" -lgsmlog="${lgsmlogdir}/${servicename}-script.log" -consolelog="${consolelogdir}/${servicename}-console.log" -alertlog="${lgsmlogdir}/${servicename}-alert.log" -postdetailslog="${lgsmlogdir}/${servicename}-postdetails.log" +lgsmlog="${lgsmlogdir}/${selfname}-script.log" +consolelog="${consolelogdir}/${selfname}-console.log" +alertlog="${lgsmlogdir}/${selfname}-alert.log" +postdetailslog="${lgsmlogdir}/${selfname}-postdetails.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" +lgsmlogdate="${lgsmlogdir}/${selfname}-script-$(date '+%Y-%m-%d-%H:%M:%S').log" +consolelogdate="${consolelogdir}/${selfname}-console-$(date '+%Y-%m-%d-%H:%M:%S').log" diff --git a/lgsm/config-default/config-lgsm/dodsserver/_default.cfg b/lgsm/config-default/config-lgsm/dodsserver/_default.cfg index 909ee3264..4e1aa6c94 100644 --- a/lgsm/config-default/config-lgsm/dodsserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/dodsserver/_default.cfg @@ -150,7 +150,7 @@ glibc="2.3.6" systemdir="${serverfiles}/dod" executabledir="${serverfiles}" executable="./srcds_run" -servercfg="${servicename}.cfg" +servercfg="${selfname}.cfg" servercfgdefault="server.cfg" servercfgdir="${systemdir}/cfg" servercfgfullpath="${servercfgdir}/${servercfg}" @@ -163,11 +163,11 @@ logdir="${rootdir}/log" gamelogdir="${systemdir}/logs" lgsmlogdir="${logdir}/script" consolelogdir="${logdir}/console" -lgsmlog="${lgsmlogdir}/${servicename}-script.log" -consolelog="${consolelogdir}/${servicename}-console.log" -alertlog="${lgsmlogdir}/${servicename}-alert.log" -postdetailslog="${lgsmlogdir}/${servicename}-postdetails.log" +lgsmlog="${lgsmlogdir}/${selfname}-script.log" +consolelog="${consolelogdir}/${selfname}-console.log" +alertlog="${lgsmlogdir}/${selfname}-alert.log" +postdetailslog="${lgsmlogdir}/${selfname}-postdetails.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" +lgsmlogdate="${lgsmlogdir}/${selfname}-script-$(date '+%Y-%m-%d-%H:%M:%S').log" +consolelogdate="${consolelogdir}/${selfname}-console-$(date '+%Y-%m-%d-%H:%M:%S').log" diff --git a/lgsm/config-default/config-lgsm/doiserver/_default.cfg b/lgsm/config-default/config-lgsm/doiserver/_default.cfg index cd749eadf..6dce5a140 100644 --- a/lgsm/config-default/config-lgsm/doiserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/doiserver/_default.cfg @@ -151,7 +151,7 @@ glibc="2.15" systemdir="${serverfiles}/doi" executabledir="${serverfiles}" executable="./srcds_run" -servercfg="${servicename}.cfg" +servercfg="${selfname}.cfg" servercfgdefault="server.cfg" servercfgdir="${systemdir}/cfg" servercfgfullpath="${servercfgdir}/${servercfg}" @@ -164,11 +164,11 @@ logdir="${rootdir}/log" gamelogdir="${systemdir}/logs" lgsmlogdir="${logdir}/script" consolelogdir="${logdir}/console" -lgsmlog="${lgsmlogdir}/${servicename}-script.log" -consolelog="${consolelogdir}/${servicename}-console.log" -alertlog="${lgsmlogdir}/${servicename}-alert.log" -postdetailslog="${lgsmlogdir}/${servicename}-postdetails.log" +lgsmlog="${lgsmlogdir}/${selfname}-script.log" +consolelog="${consolelogdir}/${selfname}-console.log" +alertlog="${lgsmlogdir}/${selfname}-alert.log" +postdetailslog="${lgsmlogdir}/${selfname}-postdetails.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" +lgsmlogdate="${lgsmlogdir}/${selfname}-script-$(date '+%Y-%m-%d-%H:%M:%S').log" +consolelogdate="${consolelogdir}/${selfname}-console-$(date '+%Y-%m-%d-%H:%M:%S').log" diff --git a/lgsm/config-default/config-lgsm/dstserver/_default.cfg b/lgsm/config-default/config-lgsm/dstserver/_default.cfg index 90e2c433d..3073f2d79 100644 --- a/lgsm/config-default/config-lgsm/dstserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/dstserver/_default.cfg @@ -146,9 +146,6 @@ gamename="Don't Starve Together" engine="dontstarve" glibc="2.15" -## Service Name | https://docs.linuxgsm.com/features/multiple-game-servers -servicename="dst-server-${shard}" - #### Directories #### # Edit with care @@ -173,11 +170,11 @@ logdir="${rootdir}/log" gamelogdir="${systemdir}/logs" lgsmlogdir="${logdir}/script" consolelogdir="${logdir}/console" -lgsmlog="${lgsmlogdir}/${servicename}-script.log" -consolelog="${consolelogdir}/${servicename}-console.log" -alertlog="${lgsmlogdir}/${servicename}-alert.log" -postdetailslog="${lgsmlogdir}/${servicename}-postdetails.log" +lgsmlog="${lgsmlogdir}/${selfname}-script.log" +consolelog="${consolelogdir}/${selfname}-console.log" +alertlog="${lgsmlogdir}/${selfname}-alert.log" +postdetailslog="${lgsmlogdir}/${selfname}-postdetails.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" +lgsmlogdate="${lgsmlogdir}/${selfname}-script-$(date '+%Y-%m-%d-%H:%M:%S').log" +consolelogdate="${consolelogdir}/${selfname}-console-$(date '+%Y-%m-%d-%H:%M:%S').log" diff --git a/lgsm/config-default/config-lgsm/dysserver/_default.cfg b/lgsm/config-default/config-lgsm/dysserver/_default.cfg index c4eca188e..f368fc310 100644 --- a/lgsm/config-default/config-lgsm/dysserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/dysserver/_default.cfg @@ -155,7 +155,7 @@ glibc="2.15" systemdir="${serverfiles}/dystopia" executabledir="${serverfiles}/bin" executable="./srcds_run.sh" -servercfg="${servicename}.cfg" +servercfg="${selfname}.cfg" servercfgdefault="server.cfg" servercfgdir="${systemdir}/cfg" servercfgfullpath="${servercfgdir}/${servercfg}" @@ -168,11 +168,11 @@ logdir="${rootdir}/log" gamelogdir="${systemdir}/logs" lgsmlogdir="${logdir}/script" consolelogdir="${logdir}/console" -lgsmlog="${lgsmlogdir}/${servicename}-script.log" -consolelog="${consolelogdir}/${servicename}-console.log" -alertlog="${lgsmlogdir}/${servicename}-alert.log" -postdetailslog="${lgsmlogdir}/${servicename}-postdetails.log" +lgsmlog="${lgsmlogdir}/${selfname}-script.log" +consolelog="${consolelogdir}/${selfname}-console.log" +alertlog="${lgsmlogdir}/${selfname}-alert.log" +postdetailslog="${lgsmlogdir}/${selfname}-postdetails.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" +lgsmlogdate="${lgsmlogdir}/${selfname}-script-$(date '+%Y-%m-%d-%H:%M:%S').log" +consolelogdate="${consolelogdir}/${selfname}-console-$(date '+%Y-%m-%d-%H:%M:%S').log" diff --git a/lgsm/config-default/config-lgsm/ecoserver/_default.cfg b/lgsm/config-default/config-lgsm/ecoserver/_default.cfg index 509b866d1..c68e15df2 100644 --- a/lgsm/config-default/config-lgsm/ecoserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/ecoserver/_default.cfg @@ -155,12 +155,12 @@ logdir="${rootdir}/log" gamelogdir="${logdir}/server" lgsmlogdir="${logdir}/script" consolelogdir="${logdir}/console" -lgsmlog="${lgsmlogdir}/${servicename}-script.log" -consolelog="${consolelogdir}/${servicename}-console.log" -alertlog="${lgsmlogdir}/${servicename}-alert.log" -postdetailslog="${lgsmlogdir}/${servicename}-postdetails.log" +lgsmlog="${lgsmlogdir}/${selfname}-script.log" +consolelog="${consolelogdir}/${selfname}-console.log" +alertlog="${lgsmlogdir}/${selfname}-alert.log" +postdetailslog="${lgsmlogdir}/${selfname}-postdetails.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" +lgsmlogdate="${lgsmlogdir}/${selfname}-script-$(date '+%Y-%m-%d-%H:%M:%S').log" +consolelogdate="${consolelogdir}/${selfname}-console-$(date '+%Y-%m-%d-%H:%M:%S').log" +gamelogdate="${gamelogdir}/${selfname}-game-$(date '+%Y-%m-%d-%H:%M:%S').log" diff --git a/lgsm/config-default/config-lgsm/emserver/_default.cfg b/lgsm/config-default/config-lgsm/emserver/_default.cfg index fed82c6d2..65fe4d0dc 100644 --- a/lgsm/config-default/config-lgsm/emserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/emserver/_default.cfg @@ -155,7 +155,7 @@ glibc="2.15" systemdir="${serverfiles}/empires" executabledir="${serverfiles}" executable="./srcds_run" -servercfg="${servicename}.cfg" +servercfg="${selfname}.cfg" servercfgdefault="server.cfg" servercfgdir="${systemdir}/cfg" servercfgfullpath="${servercfgdir}/${servercfg}" @@ -168,11 +168,11 @@ logdir="${rootdir}/log" gamelogdir="${systemdir}/logs" lgsmlogdir="${logdir}/script" consolelogdir="${logdir}/console" -lgsmlog="${lgsmlogdir}/${servicename}-script.log" -consolelog="${consolelogdir}/${servicename}-console.log" -alertlog="${lgsmlogdir}/${servicename}-alert.log" -postdetailslog="${lgsmlogdir}/${servicename}-postdetails.log" +lgsmlog="${lgsmlogdir}/${selfname}-script.log" +consolelog="${consolelogdir}/${selfname}-console.log" +alertlog="${lgsmlogdir}/${selfname}-alert.log" +postdetailslog="${lgsmlogdir}/${selfname}-postdetails.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" +lgsmlogdate="${lgsmlogdir}/${selfname}-script-$(date '+%Y-%m-%d-%H:%M:%S').log" +consolelogdate="${consolelogdir}/${selfname}-console-$(date '+%Y-%m-%d-%H:%M:%S').log" diff --git a/lgsm/config-default/config-lgsm/etlserver/_default.cfg b/lgsm/config-default/config-lgsm/etlserver/_default.cfg index e2aa5ced2..ed4759cd2 100644 --- a/lgsm/config-default/config-lgsm/etlserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/etlserver/_default.cfg @@ -131,7 +131,7 @@ glibc="2.7" systemdir="${serverfiles}" executabledir="${systemdir}" executable="./etlded" -servercfg="${servicename}.cfg" +servercfg="${selfname}.cfg" servercfgdefault="server.cfg" servercfgdir="${systemdir}/etmain" servercfgfullpath="${servercfgdir}/${servercfg}" @@ -144,11 +144,11 @@ logdir="${rootdir}/log" gamelogdir="${serverfiles}/Logs" lgsmlogdir="${logdir}/script" consolelogdir="${logdir}/console" -lgsmlog="${lgsmlogdir}/${servicename}-script.log" -consolelog="${consolelogdir}/${servicename}-console.log" -alertlog="${lgsmlogdir}/${servicename}-alert.log" -postdetailslog="${lgsmlogdir}/${servicename}-postdetails.log" +lgsmlog="${lgsmlogdir}/${selfname}-script.log" +consolelog="${consolelogdir}/${selfname}-console.log" +alertlog="${lgsmlogdir}/${selfname}-alert.log" +postdetailslog="${lgsmlogdir}/${selfname}-postdetails.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" +lgsmlogdate="${lgsmlogdir}/${selfname}-script-$(date '+%Y-%m-%d-%H:%M:%S').log" +consolelogdate="${consolelogdir}/${selfname}-console-$(date '+%Y-%m-%d-%H:%M:%S').log" diff --git a/lgsm/config-default/config-lgsm/fctrserver/_default.cfg b/lgsm/config-default/config-lgsm/fctrserver/_default.cfg index 0bccfdd42..15c5bf0cf 100644 --- a/lgsm/config-default/config-lgsm/fctrserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/fctrserver/_default.cfg @@ -142,7 +142,7 @@ glibc="2.18" systemdir="${serverfiles}" executabledir="${serverfiles}/bin/x64" executable="./factorio" -servercfg="${servicename}.json" +servercfg="${selfname}.json" servercfgdefault="server-settings.json" servercfgdir="${serverfiles}/data" servercfgfullpath="${servercfgdir}/${servercfg}" @@ -155,11 +155,11 @@ logdir="${rootdir}/log" gamelogdir="${serverfiles}" lgsmlogdir="${logdir}/script" consolelogdir="${logdir}/console" -lgsmlog="${lgsmlogdir}/${servicename}-script.log" -consolelog="${consolelogdir}/${servicename}-console.log" -alertlog="${lgsmlogdir}/${servicename}-alert.log" -postdetailslog="${lgsmlogdir}/${servicename}-postdetails.log" +lgsmlog="${lgsmlogdir}/${selfname}-script.log" +consolelog="${consolelogdir}/${selfname}-console.log" +alertlog="${lgsmlogdir}/${selfname}-alert.log" +postdetailslog="${lgsmlogdir}/${selfname}-postdetails.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" +lgsmlogdate="${lgsmlogdir}/${selfname}-script-$(date '+%Y-%m-%d-%H:%M:%S').log" +consolelogdate="${consolelogdir}/${selfname}-console-$(date '+%Y-%m-%d-%H:%M:%S').log" diff --git a/lgsm/config-default/config-lgsm/fofserver/_default.cfg b/lgsm/config-default/config-lgsm/fofserver/_default.cfg index 485259292..b2da0ed5b 100644 --- a/lgsm/config-default/config-lgsm/fofserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/fofserver/_default.cfg @@ -150,7 +150,7 @@ glibc="2.15" systemdir="${serverfiles}/fof" executabledir="${serverfiles}" executable="./srcds_run" -servercfg="${servicename}.cfg" +servercfg="${selfname}.cfg" servercfgdefault="server.cfg" servercfgdir="${systemdir}/cfg" servercfgfullpath="${servercfgdir}/${servercfg}" @@ -163,11 +163,11 @@ logdir="${rootdir}/log" gamelogdir="${systemdir}/logs" lgsmlogdir="${logdir}/script" consolelogdir="${logdir}/console" -lgsmlog="${lgsmlogdir}/${servicename}-script.log" -consolelog="${consolelogdir}/${servicename}-console.log" -alertlog="${lgsmlogdir}/${servicename}-alert.log" -postdetailslog="${lgsmlogdir}/${servicename}-postdetails.log" +lgsmlog="${lgsmlogdir}/${selfname}-script.log" +consolelog="${consolelogdir}/${selfname}-console.log" +alertlog="${lgsmlogdir}/${selfname}-alert.log" +postdetailslog="${lgsmlogdir}/${selfname}-postdetails.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" +lgsmlogdate="${lgsmlogdir}/${selfname}-script-$(date '+%Y-%m-%d-%H:%M:%S').log" +consolelogdate="${consolelogdir}/${selfname}-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 index 41282bbc7..00ba0497f 100644 --- a/lgsm/config-default/config-lgsm/gesserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/gesserver/_default.cfg @@ -150,7 +150,7 @@ glibc="2.15" systemdir="${serverfiles}/gesource" executabledir="${serverfiles}" executable="./srcds_run" -servercfg="${servicename}.cfg" +servercfg="${selfname}.cfg" servercfgdefault="server.cfg" servercfgdir="${systemdir}/cfg" servercfgfullpath="${servercfgdir}/${servercfg}" @@ -163,11 +163,11 @@ logdir="${rootdir}/log" gamelogdir="${systemdir}/logs" lgsmlogdir="${logdir}/script" consolelogdir="${logdir}/console" -lgsmlog="${lgsmlogdir}/${servicename}-script.log" -consolelog="${consolelogdir}/${servicename}-console.log" -alertlog="${lgsmlogdir}/${servicename}-alert.log" -postdetailslog="${lgsmlogdir}/${servicename}-postdetails.log" +lgsmlog="${lgsmlogdir}/${selfname}-script.log" +consolelog="${consolelogdir}/${selfname}-console.log" +alertlog="${lgsmlogdir}/${selfname}-alert.log" +postdetailslog="${lgsmlogdir}/${selfname}-postdetails.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" +lgsmlogdate="${lgsmlogdir}/${selfname}-script-$(date '+%Y-%m-%d-%H:%M:%S').log" +consolelogdate="${consolelogdir}/${selfname}-console-$(date '+%Y-%m-%d-%H:%M:%S').log" diff --git a/lgsm/config-default/config-lgsm/gmodserver/_default.cfg b/lgsm/config-default/config-lgsm/gmodserver/_default.cfg index 1723df183..d1501dc71 100644 --- a/lgsm/config-default/config-lgsm/gmodserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/gmodserver/_default.cfg @@ -167,7 +167,7 @@ systemdir="${serverfiles}/garrysmod" addonsdir="${systemdir}/addons" executabledir="${serverfiles}" executable="./srcds_run" -servercfg="${servicename}.cfg" +servercfg="${selfname}.cfg" servercfgdefault="server.cfg" servercfgdir="${systemdir}/cfg" servercfgfullpath="${servercfgdir}/${servercfg}" @@ -180,11 +180,11 @@ logdir="${rootdir}/log" gamelogdir="${systemdir}/logs" lgsmlogdir="${logdir}/script" consolelogdir="${logdir}/console" -lgsmlog="${lgsmlogdir}/${servicename}-script.log" -consolelog="${consolelogdir}/${servicename}-console.log" -alertlog="${lgsmlogdir}/${servicename}-alert.log" -postdetailslog="${lgsmlogdir}/${servicename}-postdetails.log" +lgsmlog="${lgsmlogdir}/${selfname}-script.log" +consolelog="${consolelogdir}/${selfname}-console.log" +alertlog="${lgsmlogdir}/${selfname}-alert.log" +postdetailslog="${lgsmlogdir}/${selfname}-postdetails.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" +lgsmlogdate="${lgsmlogdir}/${selfname}-script-$(date '+%Y-%m-%d-%H:%M:%S').log" +consolelogdate="${consolelogdir}/${selfname}-console-$(date '+%Y-%m-%d-%H:%M:%S').log" diff --git a/lgsm/config-default/config-lgsm/hl2dmserver/_default.cfg b/lgsm/config-default/config-lgsm/hl2dmserver/_default.cfg index 8fd962136..add451f92 100644 --- a/lgsm/config-default/config-lgsm/hl2dmserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/hl2dmserver/_default.cfg @@ -150,7 +150,7 @@ glibc="2.3.6" systemdir="${serverfiles}/hl2mp" executabledir="${serverfiles}" executable="./srcds_run" -servercfg="${servicename}.cfg" +servercfg="${selfname}.cfg" servercfgdefault="server.cfg" servercfgdir="${systemdir}/cfg" servercfgfullpath="${servercfgdir}/${servercfg}" @@ -163,11 +163,11 @@ logdir="${rootdir}/log" gamelogdir="${systemdir}/logs" lgsmlogdir="${logdir}/script" consolelogdir="${logdir}/console" -lgsmlog="${lgsmlogdir}/${servicename}-script.log" -consolelog="${consolelogdir}/${servicename}-console.log" -alertlog="${lgsmlogdir}/${servicename}-alert.log" -postdetailslog="${lgsmlogdir}/${servicename}-postdetails.log" +lgsmlog="${lgsmlogdir}/${selfname}-script.log" +consolelog="${consolelogdir}/${selfname}-console.log" +alertlog="${lgsmlogdir}/${selfname}-alert.log" +postdetailslog="${lgsmlogdir}/${selfname}-postdetails.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" +lgsmlogdate="${lgsmlogdir}/${selfname}-script-$(date '+%Y-%m-%d-%H:%M:%S').log" +consolelogdate="${consolelogdir}/${selfname}-console-$(date '+%Y-%m-%d-%H:%M:%S').log" diff --git a/lgsm/config-default/config-lgsm/hldmserver/_default.cfg b/lgsm/config-default/config-lgsm/hldmserver/_default.cfg index 8e1ddd8e6..279f13b73 100644 --- a/lgsm/config-default/config-lgsm/hldmserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/hldmserver/_default.cfg @@ -149,7 +149,7 @@ glibc="2.3.4" systemdir="${serverfiles}/valve" executabledir="${serverfiles}" executable="./hlds_run" -servercfg="${servicename}.cfg" +servercfg="${selfname}.cfg" servercfgdefault="server.cfg" servercfgdir="${systemdir}" servercfgfullpath="${servercfgdir}/${servercfg}" @@ -162,11 +162,11 @@ logdir="${rootdir}/log" gamelogdir="${systemdir}/logs" lgsmlogdir="${logdir}/script" consolelogdir="${logdir}/console" -lgsmlog="${lgsmlogdir}/${servicename}-script.log" -consolelog="${consolelogdir}/${servicename}-console.log" -alertlog="${lgsmlogdir}/${servicename}-alert.log" -postdetailslog="${lgsmlogdir}/${servicename}-postdetails.log" +lgsmlog="${lgsmlogdir}/${selfname}-script.log" +consolelog="${consolelogdir}/${selfname}-console.log" +alertlog="${lgsmlogdir}/${selfname}-alert.log" +postdetailslog="${lgsmlogdir}/${selfname}-postdetails.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" +lgsmlogdate="${lgsmlogdir}/${selfname}-script-$(date '+%Y-%m-%d-%H:%M:%S').log" +consolelogdate="${consolelogdir}/${selfname}-console-$(date '+%Y-%m-%d-%H:%M:%S').log" diff --git a/lgsm/config-default/config-lgsm/hldmsserver/_default.cfg b/lgsm/config-default/config-lgsm/hldmsserver/_default.cfg index dd7c93012..787e3c32b 100644 --- a/lgsm/config-default/config-lgsm/hldmsserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/hldmsserver/_default.cfg @@ -150,7 +150,7 @@ glibc="2.3.6" systemdir="${serverfiles}/hl1mp" executabledir="${serverfiles}" executable="./srcds_run" -servercfg="${servicename}.cfg" +servercfg="${selfname}.cfg" servercfgdefault="server.cfg" servercfgdir="${systemdir}/cfg" servercfgfullpath="${servercfgdir}/${servercfg}" @@ -163,11 +163,11 @@ logdir="${rootdir}/log" gamelogdir="${systemdir}/logs" lgsmlogdir="${logdir}/script" consolelogdir="${logdir}/console" -lgsmlog="${lgsmlogdir}/${servicename}-script.log" -consolelog="${consolelogdir}/${servicename}-console.log" -alertlog="${lgsmlogdir}/${servicename}-alert.log" -postdetailslog="${lgsmlogdir}/${servicename}-postdetails.log" +lgsmlog="${lgsmlogdir}/${selfname}-script.log" +consolelog="${consolelogdir}/${selfname}-console.log" +alertlog="${lgsmlogdir}/${selfname}-alert.log" +postdetailslog="${lgsmlogdir}/${selfname}-postdetails.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" +lgsmlogdate="${lgsmlogdir}/${selfname}-script-$(date '+%Y-%m-%d-%H:%M:%S').log" +consolelogdate="${consolelogdir}/${selfname}-console-$(date '+%Y-%m-%d-%H:%M:%S').log" diff --git a/lgsm/config-default/config-lgsm/hwserver/_default.cfg b/lgsm/config-default/config-lgsm/hwserver/_default.cfg index a5010d101..facdaea0e 100644 --- a/lgsm/config-default/config-lgsm/hwserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/hwserver/_default.cfg @@ -170,13 +170,13 @@ logdir="${rootdir}/log" gamelogdir="${logdir}/server" lgsmlogdir="${logdir}/script" consolelogdir="${logdir}/console" -gamelog="${gamelogdir}/${servicename}-game.log" -lgsmlog="${lgsmlogdir}/${servicename}-script.log" -consolelog="${consolelogdir}/${servicename}-console.log" -alertlog="${lgsmlogdir}/${servicename}-alert.log" -postdetailslog="${lgsmlogdir}/${servicename}-postdetails.log" +gamelog="${gamelogdir}/${selfname}-game.log" +lgsmlog="${lgsmlogdir}/${selfname}-script.log" +consolelog="${consolelogdir}/${selfname}-console.log" +alertlog="${lgsmlogdir}/${selfname}-alert.log" +postdetailslog="${lgsmlogdir}/${selfname}-postdetails.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" +gamelogdate="${gamelogdir}/${selfname}-game-$(date '+%Y-%m-%d-%H:%M:%S').log" +lgsmlogdate="${lgsmlogdir}/${selfname}-script-$(date '+%Y-%m-%d-%H:%M:%S').log" +consolelogdate="${consolelogdir}/${selfname}-console-$(date '+%Y-%m-%d-%H:%M:%S').log" diff --git a/lgsm/config-default/config-lgsm/insserver/_default.cfg b/lgsm/config-default/config-lgsm/insserver/_default.cfg index bedda2359..a9daf4e86 100644 --- a/lgsm/config-default/config-lgsm/insserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/insserver/_default.cfg @@ -156,7 +156,7 @@ glibc="2.15" systemdir="${serverfiles}/insurgency" executabledir="${serverfiles}" executable="./srcds_run" -servercfg="${servicename}.cfg" +servercfg="${selfname}.cfg" servercfgdefault="server.cfg" servercfgdir="${systemdir}/cfg" servercfgfullpath="${servercfgdir}/${servercfg}" @@ -169,11 +169,11 @@ logdir="${rootdir}/log" gamelogdir="${systemdir}/logs" lgsmlogdir="${logdir}/script" consolelogdir="${logdir}/console" -lgsmlog="${lgsmlogdir}/${servicename}-script.log" -consolelog="${consolelogdir}/${servicename}-console.log" -alertlog="${lgsmlogdir}/${servicename}-alert.log" -postdetailslog="${lgsmlogdir}/${servicename}-postdetails.log" +lgsmlog="${lgsmlogdir}/${selfname}-script.log" +consolelog="${consolelogdir}/${selfname}-console.log" +alertlog="${lgsmlogdir}/${selfname}-alert.log" +postdetailslog="${lgsmlogdir}/${selfname}-postdetails.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" +lgsmlogdate="${lgsmlogdir}/${selfname}-script-$(date '+%Y-%m-%d-%H:%M:%S').log" +consolelogdate="${consolelogdir}/${selfname}-console-$(date '+%Y-%m-%d-%H:%M:%S').log" diff --git a/lgsm/config-default/config-lgsm/inssserver/_default.cfg b/lgsm/config-default/config-lgsm/inssserver/_default.cfg index fedd3b163..014333b6a 100644 --- a/lgsm/config-default/config-lgsm/inssserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/inssserver/_default.cfg @@ -170,12 +170,12 @@ logdir="${rootdir}/log" gamelogdir="${systemdir}/Saved/Logs" lgsmlogdir="${logdir}/script" consolelogdir="${logdir}/console" -gamelog="${gamelogdir}/${servicename}-game.log" -lgsmlog="${lgsmlogdir}/${servicename}-script.log" -consolelog="${consolelogdir}/${servicename}-console.log" -alertlog="${lgsmlogdir}/${servicename}-alert.log" -postdetailslog="${lgsmlogdir}/${servicename}-postdetails.log" +gamelog="${gamelogdir}/${selfname}-game.log" +lgsmlog="${lgsmlogdir}/${selfname}-script.log" +consolelog="${consolelogdir}/${selfname}-console.log" +alertlog="${lgsmlogdir}/${selfname}-alert.log" +postdetailslog="${lgsmlogdir}/${selfname}-postdetails.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" +lgsmlogdate="${lgsmlogdir}/${selfname}-script-$(date '+%Y-%m-%d-%H:%M:%S').log" +consolelogdate="${consolelogdir}/${selfname}-console-$(date '+%Y-%m-%d-%H:%M:%S').log" diff --git a/lgsm/config-default/config-lgsm/iosserver/_default.cfg b/lgsm/config-default/config-lgsm/iosserver/_default.cfg index 94f7a90a2..27f93c29c 100644 --- a/lgsm/config-default/config-lgsm/iosserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/iosserver/_default.cfg @@ -150,7 +150,7 @@ glibc="2.3.6" systemdir="${serverfiles}/iosoccer" executabledir="${serverfiles}" executable="./srcds_run" -servercfg="${servicename}.cfg" +servercfg="${selfname}.cfg" servercfgdefault="server.cfg" servercfgdir="${systemdir}/cfg" servercfgfullpath="${servercfgdir}/${servercfg}" @@ -163,11 +163,11 @@ logdir="${rootdir}/log" gamelogdir="${systemdir}/logs" lgsmlogdir="${logdir}/script" consolelogdir="${logdir}/console" -lgsmlog="${lgsmlogdir}/${servicename}-script.log" -consolelog="${consolelogdir}/${servicename}-console.log" -alertlog="${lgsmlogdir}/${servicename}-alert.log" -postdetailslog="${lgsmlogdir}/${servicename}-postdetails.log" +lgsmlog="${lgsmlogdir}/${selfname}-script.log" +consolelog="${consolelogdir}/${selfname}-console.log" +alertlog="${lgsmlogdir}/${selfname}-alert.log" +postdetailslog="${lgsmlogdir}/${selfname}-postdetails.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" +lgsmlogdate="${lgsmlogdir}/${selfname}-script-$(date '+%Y-%m-%d-%H:%M:%S').log" +consolelogdate="${consolelogdir}/${selfname}-console-$(date '+%Y-%m-%d-%H:%M:%S').log" diff --git a/lgsm/config-default/config-lgsm/jc2server/_default.cfg b/lgsm/config-default/config-lgsm/jc2server/_default.cfg index bf2f16043..2942b0b6c 100644 --- a/lgsm/config-default/config-lgsm/jc2server/_default.cfg +++ b/lgsm/config-default/config-lgsm/jc2server/_default.cfg @@ -155,11 +155,11 @@ logdir="${rootdir}/log" #gamelogdir="" # No server logs available lgsmlogdir="${logdir}/script" consolelogdir="${logdir}/console" -lgsmlog="${lgsmlogdir}/${servicename}-script.log" -consolelog="${consolelogdir}/${servicename}-console.log" -alertlog="${lgsmlogdir}/${servicename}-alert.log" -postdetailslog="${lgsmlogdir}/${servicename}-postdetails.log" +lgsmlog="${lgsmlogdir}/${selfname}-script.log" +consolelog="${consolelogdir}/${selfname}-console.log" +alertlog="${lgsmlogdir}/${selfname}-alert.log" +postdetailslog="${lgsmlogdir}/${selfname}-postdetails.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" +lgsmlogdate="${lgsmlogdir}/${selfname}-script-$(date '+%Y-%m-%d-%H:%M:%S').log" +consolelogdate="${consolelogdir}/${selfname}-console-$(date '+%Y-%m-%d-%H:%M:%S').log" diff --git a/lgsm/config-default/config-lgsm/jc3server/_default.cfg b/lgsm/config-default/config-lgsm/jc3server/_default.cfg index 4dbbf5752..1c88c7de2 100644 --- a/lgsm/config-default/config-lgsm/jc3server/_default.cfg +++ b/lgsm/config-default/config-lgsm/jc3server/_default.cfg @@ -155,11 +155,11 @@ logdir="${rootdir}/log" #gamelogdir="" # No server logs available lgsmlogdir="${logdir}/script" consolelogdir="${logdir}/console" -lgsmlog="${lgsmlogdir}/${servicename}-script.log" -consolelog="${consolelogdir}/${servicename}-console.log" -alertlog="${lgsmlogdir}/${servicename}-alert.log" -postdetailslog="${lgsmlogdir}/${servicename}-postdetails.log" +lgsmlog="${lgsmlogdir}/${selfname}-script.log" +consolelog="${consolelogdir}/${selfname}-console.log" +alertlog="${lgsmlogdir}/${selfname}-alert.log" +postdetailslog="${lgsmlogdir}/${selfname}-postdetails.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" +lgsmlogdate="${lgsmlogdir}/${selfname}-script-$(date '+%Y-%m-%d-%H:%M:%S').log" +consolelogdate="${consolelogdir}/${selfname}-console-$(date '+%Y-%m-%d-%H:%M:%S').log" diff --git a/lgsm/config-default/config-lgsm/kf2server/_default.cfg b/lgsm/config-default/config-lgsm/kf2server/_default.cfg index 76cc4da40..016c28f69 100644 --- a/lgsm/config-default/config-lgsm/kf2server/_default.cfg +++ b/lgsm/config-default/config-lgsm/kf2server/_default.cfg @@ -16,7 +16,7 @@ gamemode="KFGameContent.KFGameInfo_VersusSurvival" ## Server Start Command | https://docs.linuxgsm.com/configuration/start-parameters#additional-parameters fn_parms(){ -parms="\"${defaultmap}?Game=${gamemode}?ConfigSubDir=${servicename} -QueryPort=${queryport}\"" +parms="\"${defaultmap}?Game=${gamemode}?ConfigSubDir=${selfname} -QueryPort=${queryport}\"" } #### LinuxGSM Settings #### @@ -147,7 +147,7 @@ glibc="2.3.2" systemdir="${serverfiles}" executabledir="${systemdir}/Binaries/Win64" executable="./KFGameSteamServer.bin.x86_64" -servercfgdir="${systemdir}/KFGame/Config/${servicename}" +servercfgdir="${systemdir}/KFGame/Config/${selfname}" servercfg="LinuxServer-KFGame.ini" servercfgdefault="LinuxServer-KFGame.ini" servercfgfullpath="${servercfgdir}/${servercfg}" @@ -160,11 +160,11 @@ logdir="${rootdir}/log" gamelogdir="${systemdir}/Saved/Logs" lgsmlogdir="${logdir}/script" consolelogdir="${logdir}/console" -lgsmlog="${lgsmlogdir}/${servicename}-script.log" -consolelog="${consolelogdir}/${servicename}-console.log" -alertlog="${lgsmlogdir}/${servicename}-alert.log" -postdetailslog="${lgsmlogdir}/${servicename}-postdetails.log" +lgsmlog="${lgsmlogdir}/${selfname}-script.log" +consolelog="${consolelogdir}/${selfname}-console.log" +alertlog="${lgsmlogdir}/${selfname}-alert.log" +postdetailslog="${lgsmlogdir}/${selfname}-postdetails.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" +lgsmlogdate="${lgsmlogdir}/${selfname}-script-$(date '+%Y-%m-%d-%H:%M:%S').log" +consolelogdate="${consolelogdir}/${selfname}-console-$(date '+%Y-%m-%d-%H:%M:%S').log" diff --git a/lgsm/config-default/config-lgsm/kfserver/_default.cfg b/lgsm/config-default/config-lgsm/kfserver/_default.cfg index 53167ac42..ee5817909 100644 --- a/lgsm/config-default/config-lgsm/kfserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/kfserver/_default.cfg @@ -155,7 +155,7 @@ serverfiles="${rootdir}/serverfiles" systemdir="${serverfiles}/System" executabledir="${systemdir}" executable="./ucc-bin" -servercfg="${servicename}.ini" +servercfg="${selfname}.ini" servercfgdefault="Default.ini" servercfgdir="${systemdir}" servercfgfullpath="${servercfgdir}/${servercfg}" @@ -169,13 +169,13 @@ logdir="${rootdir}/log" gamelogdir="${logdir}/server" lgsmlogdir="${logdir}/script" consolelogdir="${logdir}/console" -gamelog="${gamelogdir}/${servicename}-game.log" -lgsmlog="${lgsmlogdir}/${servicename}-script.log" -consolelog="${consolelogdir}/${servicename}-console.log" -alertlog="${lgsmlogdir}/${servicename}-alert.log" -postdetailslog="${lgsmlogdir}/${servicename}-postdetails.log" +gamelog="${gamelogdir}/${selfname}-game.log" +lgsmlog="${lgsmlogdir}/${selfname}-script.log" +consolelog="${consolelogdir}/${selfname}-console.log" +alertlog="${lgsmlogdir}/${selfname}-alert.log" +postdetailslog="${lgsmlogdir}/${selfname}-postdetails.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" +lgsmlogdate="${lgsmlogdir}/${selfname}-script-$(date '+%Y-%m-%d-%H:%M:%S').log" +consolelogdate="${consolelogdir}/${selfname}-console-$(date '+%Y-%m-%d-%H:%M:%S').log" +gamelogdate="${gamelogdir}/${selfname}-game-$(date '+%Y-%m-%d-%H:%M:%S').log" diff --git a/lgsm/config-default/config-lgsm/l4d2server/_default.cfg b/lgsm/config-default/config-lgsm/l4d2server/_default.cfg index fe32362de..90c597f9e 100644 --- a/lgsm/config-default/config-lgsm/l4d2server/_default.cfg +++ b/lgsm/config-default/config-lgsm/l4d2server/_default.cfg @@ -149,7 +149,7 @@ glibc="2.3.6" systemdir="${serverfiles}/left4dead2" executabledir="${serverfiles}" executable="./srcds_run" -servercfg="${servicename}.cfg" +servercfg="${selfname}.cfg" servercfgdefault="server.cfg" servercfgdir="${systemdir}/cfg" servercfgfullpath="${servercfgdir}/${servercfg}" @@ -162,11 +162,11 @@ logdir="${rootdir}/log" gamelogdir="${systemdir}/logs" lgsmlogdir="${logdir}/script" consolelogdir="${logdir}/console" -lgsmlog="${lgsmlogdir}/${servicename}-script.log" -consolelog="${consolelogdir}/${servicename}-console.log" -alertlog="${lgsmlogdir}/${servicename}-alert.log" -postdetailslog="${lgsmlogdir}/${servicename}-postdetails.log" +lgsmlog="${lgsmlogdir}/${selfname}-script.log" +consolelog="${consolelogdir}/${selfname}-console.log" +alertlog="${lgsmlogdir}/${selfname}-alert.log" +postdetailslog="${lgsmlogdir}/${selfname}-postdetails.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" +lgsmlogdate="${lgsmlogdir}/${selfname}-script-$(date '+%Y-%m-%d-%H:%M:%S').log" +consolelogdate="${consolelogdir}/${selfname}-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 index 333eecff0..c72d16e14 100644 --- a/lgsm/config-default/config-lgsm/l4dserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/l4dserver/_default.cfg @@ -162,11 +162,11 @@ logdir="${rootdir}/log" gamelogdir="${systemdir}/logs" lgsmlogdir="${logdir}/script" consolelogdir="${logdir}/console" -lgsmlog="${lgsmlogdir}/${servicename}-script.log" -consolelog="${consolelogdir}/${servicename}-console.log" -alertlog="${lgsmlogdir}/${servicename}-alert.log" -postdetailslog="${lgsmlogdir}/${servicename}-postdetails.log" +lgsmlog="${lgsmlogdir}/${selfname}-script.log" +consolelog="${consolelogdir}/${selfname}-console.log" +alertlog="${lgsmlogdir}/${selfname}-alert.log" +postdetailslog="${lgsmlogdir}/${selfname}-postdetails.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" +lgsmlogdate="${lgsmlogdir}/${selfname}-script-$(date '+%Y-%m-%d-%H:%M:%S').log" +consolelogdate="${consolelogdir}/${selfname}-console-$(date '+%Y-%m-%d-%H:%M:%S').log" diff --git a/lgsm/config-default/config-lgsm/mcserver/_default.cfg b/lgsm/config-default/config-lgsm/mcserver/_default.cfg index 2592abae9..28ead92a2 100644 --- a/lgsm/config-default/config-lgsm/mcserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/mcserver/_default.cfg @@ -149,11 +149,11 @@ logdir="${rootdir}/log" gamelogdir="${systemdir}/logs" lgsmlogdir="${logdir}/script" consolelogdir="${logdir}/console" -lgsmlog="${lgsmlogdir}/${servicename}-script.log" -consolelog="${consolelogdir}/${servicename}-console.log" -alertlog="${lgsmlogdir}/${servicename}-alert.log" -postdetailslog="${lgsmlogdir}/${servicename}-postdetails.log" +lgsmlog="${lgsmlogdir}/${selfname}-script.log" +consolelog="${consolelogdir}/${selfname}-console.log" +alertlog="${lgsmlogdir}/${selfname}-alert.log" +postdetailslog="${lgsmlogdir}/${selfname}-postdetails.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" +lgsmlogdate="${lgsmlogdir}/${selfname}-script-$(date '+%Y-%m-%d-%H:%M:%S').log" +consolelogdate="${consolelogdir}/${selfname}-console-$(date '+%Y-%m-%d-%H:%M:%S').log" diff --git a/lgsm/config-default/config-lgsm/mhserver/_default.cfg b/lgsm/config-default/config-lgsm/mhserver/_default.cfg index dcb62846b..cc4de6276 100644 --- a/lgsm/config-default/config-lgsm/mhserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/mhserver/_default.cfg @@ -163,11 +163,11 @@ logdir="${rootdir}/log" gamelogdir="${systemdir}/Saved/Logs" lgsmlogdir="${logdir}/script" consolelogdir="${logdir}/console" -lgsmlog="${lgsmlogdir}/${servicename}-script.log" -consolelog="${consolelogdir}/${servicename}-console.log" -alertlog="${lgsmlogdir}/${servicename}-alert.log" -postdetailslog="${lgsmlogdir}/${servicename}-postdetails.log" +lgsmlog="${lgsmlogdir}/${selfname}-script.log" +consolelog="${consolelogdir}/${selfname}-console.log" +alertlog="${lgsmlogdir}/${selfname}-alert.log" +postdetailslog="${lgsmlogdir}/${selfname}-postdetails.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" +lgsmlogdate="${lgsmlogdir}/${selfname}-script-$(date '+%Y-%m-%d-%H:%M:%S').log" +consolelogdate="${consolelogdir}/${selfname}-console-$(date '+%Y-%m-%d-%H:%M:%S').log" diff --git a/lgsm/config-default/config-lgsm/mohaaserver/_default.cfg b/lgsm/config-default/config-lgsm/mohaaserver/_default.cfg index ef694b056..97fe12dc8 100644 --- a/lgsm/config-default/config-lgsm/mohaaserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/mohaaserver/_default.cfg @@ -136,7 +136,7 @@ glibc="2.3" systemdir="${serverfiles}/main" executabledir="${serverfiles}" executable="./mohaa_lnxded" -servercfg="${servicename}.cfg" +servercfg="${selfname}.cfg" servercfgdefault="server.cfg" servercfgdir="${serverfiles}" servercfgfullpath="${serverfiles}/${servercfg}" @@ -149,11 +149,11 @@ logdir="${rootdir}/log" gamelogdir="${serverfiles}/Logs" lgsmlogdir="${logdir}/script" consolelogdir="${logdir}/console" -lgsmlog="${lgsmlogdir}/${servicename}-script.log" -consolelog="${consolelogdir}/${servicename}-console.log" -alertlog="${lgsmlogdir}/${servicename}-alert.log" -postdetailslog="${lgsmlogdir}/${servicename}-postdetails.log" +lgsmlog="${lgsmlogdir}/${selfname}-script.log" +consolelog="${consolelogdir}/${selfname}-console.log" +alertlog="${lgsmlogdir}/${selfname}-alert.log" +postdetailslog="${lgsmlogdir}/${selfname}-postdetails.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" +lgsmlogdate="${lgsmlogdir}/${selfname}-script-$(date '+%Y-%m-%d-%H:%M:%S').log" +consolelogdate="${consolelogdir}/${selfname}-console-$(date '+%Y-%m-%d-%H:%M:%S').log" diff --git a/lgsm/config-default/config-lgsm/mtaserver/_default.cfg b/lgsm/config-default/config-lgsm/mtaserver/_default.cfg index 6ceacf035..bb1e47762 100644 --- a/lgsm/config-default/config-lgsm/mtaserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/mtaserver/_default.cfg @@ -148,11 +148,11 @@ logdir="${rootdir}/log" gamelogdir="${serverfiles}/mods/deathmatch/logs" lgsmlogdir="${logdir}/script" consolelogdir="${logdir}/console" -lgsmlog="${lgsmlogdir}/${servicename}-script.log" -consolelog="${consolelogdir}/${servicename}-console.log" -alertlog="${lgsmlogdir}/${servicename}-alert.log" -postdetailslog="${lgsmlogdir}/${servicename}-postdetails.log" +lgsmlog="${lgsmlogdir}/${selfname}-script.log" +consolelog="${consolelogdir}/${selfname}-console.log" +alertlog="${lgsmlogdir}/${selfname}-alert.log" +postdetailslog="${lgsmlogdir}/${selfname}-postdetails.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" +lgsmlogdate="${lgsmlogdir}/${selfname}-script-$(date '+%Y-%m-%d-%H:%M:%S').log" +consolelogdate="${consolelogdir}/${selfname}-console-$(date '+%Y-%m-%d-%H:%M:%S').log" diff --git a/lgsm/config-default/config-lgsm/mumbleserver/_default.cfg b/lgsm/config-default/config-lgsm/mumbleserver/_default.cfg index 204099ad9..b722193b2 100644 --- a/lgsm/config-default/config-lgsm/mumbleserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/mumbleserver/_default.cfg @@ -135,7 +135,7 @@ glibc="null" systemdir="${serverfiles}" executabledir="${serverfiles}" executable="./murmur.x86" -servercfg="${servicename}.ini" +servercfg="${selfname}.ini" servercfgdefault="murmur.ini" servercfgdir="${serverfiles}" servercfgfullpath="${servercfgdir}/${servercfg}" @@ -148,11 +148,11 @@ logdir="${rootdir}/log" #gamelogdir="" # No server logs available lgsmlogdir="${logdir}/script" consolelogdir="${logdir}/console" -lgsmlog="${lgsmlogdir}/${servicename}-script.log" -consolelog="${consolelogdir}/${servicename}-console.log" -alertlog="${lgsmlogdir}/${servicename}-alert.log" -postdetailslog="${lgsmlogdir}/${servicename}-postdetails.log" +lgsmlog="${lgsmlogdir}/${selfname}-script.log" +consolelog="${consolelogdir}/${selfname}-console.log" +alertlog="${lgsmlogdir}/${selfname}-alert.log" +postdetailslog="${lgsmlogdir}/${selfname}-postdetails.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" +lgsmlogdate="${lgsmlogdir}/${selfname}-script-$(date '+%Y-%m-%d-%H:%M:%S').log" +consolelogdate="${consolelogdir}/${selfname}-console-$(date '+%Y-%m-%d-%H:%M:%S').log" diff --git a/lgsm/config-default/config-lgsm/ndserver/_default.cfg b/lgsm/config-default/config-lgsm/ndserver/_default.cfg index 1ce879e7d..ab269aaf6 100644 --- a/lgsm/config-default/config-lgsm/ndserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/ndserver/_default.cfg @@ -150,7 +150,7 @@ glibc="2.3.6" systemdir="${serverfiles}/nucleardawn" executabledir="${serverfiles}" executable="./srcds_run" -servercfg="${servicename}.cfg" +servercfg="${selfname}.cfg" servercfgdefault="server.cfg" servercfgdir="${systemdir}/cfg" servercfgfullpath="${servercfgdir}/${servercfg}" @@ -163,11 +163,11 @@ logdir="${rootdir}/log" gamelogdir="${systemdir}/logs" lgsmlogdir="${logdir}/script" consolelogdir="${logdir}/console" -lgsmlog="${lgsmlogdir}/${servicename}-script.log" -consolelog="${consolelogdir}/${servicename}-console.log" -alertlog="${lgsmlogdir}/${servicename}-alert.log" -postdetailslog="${lgsmlogdir}/${servicename}-postdetails.log" +lgsmlog="${lgsmlogdir}/${selfname}-script.log" +consolelog="${consolelogdir}/${selfname}-console.log" +alertlog="${lgsmlogdir}/${selfname}-alert.log" +postdetailslog="${lgsmlogdir}/${selfname}-postdetails.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" +lgsmlogdate="${lgsmlogdir}/${selfname}-script-$(date '+%Y-%m-%d-%H:%M:%S').log" +consolelogdate="${consolelogdir}/${selfname}-console-$(date '+%Y-%m-%d-%H:%M:%S').log" diff --git a/lgsm/config-default/config-lgsm/nmrihserver/_default.cfg b/lgsm/config-default/config-lgsm/nmrihserver/_default.cfg index 1ebf4d83c..4c56f8a8d 100644 --- a/lgsm/config-default/config-lgsm/nmrihserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/nmrihserver/_default.cfg @@ -155,7 +155,7 @@ glibc="2.15" systemdir="${serverfiles}/nmrih" executabledir="${serverfiles}" executable="./srcds_run" -servercfg="${servicename}.cfg" +servercfg="${selfname}.cfg" servercfgdefault="server.cfg" servercfgdir="${systemdir}/cfg" servercfgfullpath="${servercfgdir}/${servercfg}" @@ -168,11 +168,11 @@ logdir="${rootdir}/log" gamelogdir="${systemdir}/logs" lgsmlogdir="${logdir}/script" consolelogdir="${logdir}/console" -lgsmlog="${lgsmlogdir}/${servicename}-script.log" -consolelog="${consolelogdir}/${servicename}-console.log" -alertlog="${lgsmlogdir}/${servicename}-alert.log" -postdetailslog="${lgsmlogdir}/${servicename}-postdetails.log" +lgsmlog="${lgsmlogdir}/${selfname}-script.log" +consolelog="${consolelogdir}/${selfname}-console.log" +alertlog="${lgsmlogdir}/${selfname}-alert.log" +postdetailslog="${lgsmlogdir}/${selfname}-postdetails.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" +lgsmlogdate="${lgsmlogdir}/${selfname}-script-$(date '+%Y-%m-%d-%H:%M:%S').log" +consolelogdate="${consolelogdir}/${selfname}-console-$(date '+%Y-%m-%d-%H:%M:%S').log" diff --git a/lgsm/config-default/config-lgsm/ns2cserver/_default.cfg b/lgsm/config-default/config-lgsm/ns2cserver/_default.cfg index 083df023f..f984d1908 100644 --- a/lgsm/config-default/config-lgsm/ns2cserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/ns2cserver/_default.cfg @@ -157,7 +157,7 @@ glibc="2.15" systemdir="${serverfiles}" executabledir="${serverfiles}/ia32" executable="./ns2combatserver_linux32" -servercfgdir="${serverfiles}/${servicename}" +servercfgdir="${serverfiles}/${selfname}" servercfgfullpath="${servercfgdir}" modstoragedir="${servercfgdir}/Workshop" @@ -169,11 +169,11 @@ logdir="${rootdir}/log" gamelogdir="${systemdir}/logs" lgsmlogdir="${logdir}/script" consolelogdir="${logdir}/console" -lgsmlog="${lgsmlogdir}/${servicename}-script.log" -consolelog="${consolelogdir}/${servicename}-console.log" -alertlog="${lgsmlogdir}/${servicename}-alert.log" -postdetailslog="${lgsmlogdir}/${servicename}-postdetails.log" +lgsmlog="${lgsmlogdir}/${selfname}-script.log" +consolelog="${consolelogdir}/${selfname}-console.log" +alertlog="${lgsmlogdir}/${selfname}-alert.log" +postdetailslog="${lgsmlogdir}/${selfname}-postdetails.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" +lgsmlogdate="${lgsmlogdir}/${selfname}-script-$(date '+%Y-%m-%d-%H:%M:%S').log" +consolelogdate="${consolelogdir}/${selfname}-console-$(date '+%Y-%m-%d-%H:%M:%S').log" diff --git a/lgsm/config-default/config-lgsm/ns2server/_default.cfg b/lgsm/config-default/config-lgsm/ns2server/_default.cfg index 34f1958ae..fbf312222 100644 --- a/lgsm/config-default/config-lgsm/ns2server/_default.cfg +++ b/lgsm/config-default/config-lgsm/ns2server/_default.cfg @@ -161,7 +161,7 @@ glibc="2.17" systemdir="${serverfiles}" executabledir="${serverfiles}/x64" executable="./server_linux" -servercfgdir="${serverfiles}/${servicename}" +servercfgdir="${serverfiles}/${selfname}" servercfgfullpath="${servercfgdir}" modstoragedir="${servercfgdir}/Workshop" @@ -173,11 +173,11 @@ logdir="${rootdir}/log" gamelogdir="${systemdir}/logs" lgsmlogdir="${logdir}/script" consolelogdir="${logdir}/console" -lgsmlog="${lgsmlogdir}/${servicename}-script.log" -consolelog="${consolelogdir}/${servicename}-console.log" -alertlog="${lgsmlogdir}/${servicename}-alert.log" -postdetailslog="${lgsmlogdir}/${servicename}-postdetails.log" +lgsmlog="${lgsmlogdir}/${selfname}-script.log" +consolelog="${consolelogdir}/${selfname}-console.log" +alertlog="${lgsmlogdir}/${selfname}-alert.log" +postdetailslog="${lgsmlogdir}/${selfname}-postdetails.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" +lgsmlogdate="${lgsmlogdir}/${selfname}-script-$(date '+%Y-%m-%d-%H:%M:%S').log" +consolelogdate="${consolelogdir}/${selfname}-console-$(date '+%Y-%m-%d-%H:%M:%S').log" diff --git a/lgsm/config-default/config-lgsm/nsserver/_default.cfg b/lgsm/config-default/config-lgsm/nsserver/_default.cfg index 3e02c5f5f..6654d2e82 100644 --- a/lgsm/config-default/config-lgsm/nsserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/nsserver/_default.cfg @@ -150,7 +150,7 @@ glibc="2.3.4" systemdir="${serverfiles}/ns" executabledir="${serverfiles}" executable="./hlds_run" -servercfg="${servicename}.cfg" +servercfg="${selfname}.cfg" servercfgdefault="server.cfg" servercfgdir="${systemdir}" servercfgfullpath="${servercfgdir}/${servercfg}" @@ -163,11 +163,11 @@ logdir="${rootdir}/log" gamelogdir="${systemdir}/logs" lgsmlogdir="${logdir}/script" consolelogdir="${logdir}/console" -lgsmlog="${lgsmlogdir}/${servicename}-script.log" -consolelog="${consolelogdir}/${servicename}-console.log" -alertlog="${lgsmlogdir}/${servicename}-alert.log" -postdetailslog="${lgsmlogdir}/${servicename}-postdetails.log" +lgsmlog="${lgsmlogdir}/${selfname}-script.log" +consolelog="${consolelogdir}/${selfname}-console.log" +alertlog="${lgsmlogdir}/${selfname}-alert.log" +postdetailslog="${lgsmlogdir}/${selfname}-postdetails.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" +lgsmlogdate="${lgsmlogdir}/${selfname}-script-$(date '+%Y-%m-%d-%H:%M:%S').log" +consolelogdate="${consolelogdir}/${selfname}-console-$(date '+%Y-%m-%d-%H:%M:%S').log" diff --git a/lgsm/config-default/config-lgsm/opforserver/_default.cfg b/lgsm/config-default/config-lgsm/opforserver/_default.cfg index 9b4d9d9e5..5f50583fb 100644 --- a/lgsm/config-default/config-lgsm/opforserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/opforserver/_default.cfg @@ -150,7 +150,7 @@ glibc="2.3.4" systemdir="${serverfiles}/gearbox" executabledir="${serverfiles}" executable="./hlds_run" -servercfg="${servicename}.cfg" +servercfg="${selfname}.cfg" servercfgdefault="server.cfg" servercfgdir="${systemdir}" servercfgfullpath="${servercfgdir}/${servercfg}" @@ -163,11 +163,11 @@ logdir="${rootdir}/log" gamelogdir="${systemdir}/logs" lgsmlogdir="${logdir}/script" consolelogdir="${logdir}/console" -lgsmlog="${lgsmlogdir}/${servicename}-script.log" -consolelog="${consolelogdir}/${servicename}-console.log" -alertlog="${lgsmlogdir}/${servicename}-alert.log" -postdetailslog="${lgsmlogdir}/${servicename}-postdetails.log" +lgsmlog="${lgsmlogdir}/${selfname}-script.log" +consolelog="${consolelogdir}/${selfname}-console.log" +alertlog="${lgsmlogdir}/${selfname}-alert.log" +postdetailslog="${lgsmlogdir}/${selfname}-postdetails.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" +lgsmlogdate="${lgsmlogdir}/${selfname}-script-$(date '+%Y-%m-%d-%H:%M:%S').log" +consolelogdate="${consolelogdir}/${selfname}-console-$(date '+%Y-%m-%d-%H:%M:%S').log" diff --git a/lgsm/config-default/config-lgsm/pcserver/_default.cfg b/lgsm/config-default/config-lgsm/pcserver/_default.cfg index f1d633e6a..a4f7a8942 100644 --- a/lgsm/config-default/config-lgsm/pcserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/pcserver/_default.cfg @@ -142,7 +142,7 @@ glibc="2.4" systemdir="${serverfiles}" executabledir="${serverfiles}" executable="./DedicatedServerCmd" -servercfg="${servicename}.cfg" +servercfg="${selfname}.cfg" servercfgdefault="server.cfg" servercfgdir="${systemdir}" servercfgfullpath="${servercfgdir}/${servercfg}" @@ -155,11 +155,11 @@ logdir="${rootdir}/log" gamelogdir="${systemdir}/logs" lgsmlogdir="${logdir}/script" consolelogdir="${logdir}/console" -lgsmlog="${lgsmlogdir}/${servicename}-script.log" -consolelog="${consolelogdir}/${servicename}-console.log" -alertlog="${lgsmlogdir}/${servicename}-alert.log" -postdetailslog="${lgsmlogdir}/${servicename}-postdetails.log" +lgsmlog="${lgsmlogdir}/${selfname}-script.log" +consolelog="${consolelogdir}/${selfname}-console.log" +alertlog="${lgsmlogdir}/${selfname}-alert.log" +postdetailslog="${lgsmlogdir}/${selfname}-postdetails.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" +lgsmlogdate="${lgsmlogdir}/${selfname}-script-$(date '+%Y-%m-%d-%H:%M:%S').log" +consolelogdate="${consolelogdir}/${selfname}-console-$(date '+%Y-%m-%d-%H:%M:%S').log" diff --git a/lgsm/config-default/config-lgsm/pstbsserver/_default.cfg b/lgsm/config-default/config-lgsm/pstbsserver/_default.cfg index ddb0a5da8..09e357bef 100644 --- a/lgsm/config-default/config-lgsm/pstbsserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/pstbsserver/_default.cfg @@ -164,12 +164,12 @@ logdir="${rootdir}/log" gamelogdir="${systemdir}/Saved/Logs" lgsmlogdir="${logdir}/script" consolelogdir="${logdir}/console" -gamelog="${gamelogdir}/${servicename}-game.log" -lgsmlog="${lgsmlogdir}/${servicename}-script.log" -consolelog="${consolelogdir}/${servicename}-console.log" -alertlog="${lgsmlogdir}/${servicename}-alert.log" -postdetailslog="${lgsmlogdir}/${servicename}-postdetails.log" +gamelog="${gamelogdir}/${selfname}-game.log" +lgsmlog="${lgsmlogdir}/${selfname}-script.log" +consolelog="${consolelogdir}/${selfname}-console.log" +alertlog="${lgsmlogdir}/${selfname}-alert.log" +postdetailslog="${lgsmlogdir}/${selfname}-postdetails.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" +lgsmlogdate="${lgsmlogdir}/${selfname}-script-$(date '+%Y-%m-%d-%H:%M:%S').log" +consolelogdate="${consolelogdir}/${selfname}-console-$(date '+%Y-%m-%d-%H:%M:%S').log" diff --git a/lgsm/config-default/config-lgsm/pvkiiserver/_default.cfg b/lgsm/config-default/config-lgsm/pvkiiserver/_default.cfg index 8d4e2105c..4d6244afd 100644 --- a/lgsm/config-default/config-lgsm/pvkiiserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/pvkiiserver/_default.cfg @@ -150,7 +150,7 @@ glibc="2.15" systemdir="${serverfiles}/pvkii" executabledir="${serverfiles}" executable="./srcds_run" -servercfg="${servicename}.cfg" +servercfg="${selfname}.cfg" servercfgdefault="server.cfg" servercfgdir="${systemdir}/cfg" servercfgfullpath="${servercfgdir}/${servercfg}" @@ -163,11 +163,11 @@ logdir="${rootdir}/log" gamelogdir="${systemdir}/logs" lgsmlogdir="${logdir}/script" consolelogdir="${logdir}/console" -lgsmlog="${lgsmlogdir}/${servicename}-script.log" -consolelog="${consolelogdir}/${servicename}-console.log" -alertlog="${lgsmlogdir}/${servicename}-alert.log" -postdetailslog="${lgsmlogdir}/${servicename}-postdetails.log" +lgsmlog="${lgsmlogdir}/${selfname}-script.log" +consolelog="${consolelogdir}/${selfname}-console.log" +alertlog="${lgsmlogdir}/${selfname}-alert.log" +postdetailslog="${lgsmlogdir}/${selfname}-postdetails.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" +lgsmlogdate="${lgsmlogdir}/${selfname}-script-$(date '+%Y-%m-%d-%H:%M:%S').log" +consolelogdate="${consolelogdir}/${selfname}-console-$(date '+%Y-%m-%d-%H:%M:%S').log" diff --git a/lgsm/config-default/config-lgsm/pzserver/_default.cfg b/lgsm/config-default/config-lgsm/pzserver/_default.cfg index 756945cf2..62862f21f 100644 --- a/lgsm/config-default/config-lgsm/pzserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/pzserver/_default.cfg @@ -13,7 +13,7 @@ ip="0.0.0.0" adminpassword="CHANGE_ME" fn_parms(){ -parms="-ip ${ip} -adminpassword \"${adminpassword}\" -servername ${servicename}" +parms="-ip ${ip} -adminpassword \"${adminpassword}\" -servername ${selfname}" } #### LinuxGSM Settings #### @@ -145,7 +145,7 @@ glibc="2.15" systemdir="${serverfiles}" executabledir="${serverfiles}" executable="./start-server.sh" -servercfg="${servicename}.ini" +servercfg="${selfname}.ini" servercfgdefault="server.ini" servercfgdir="${HOME}/Zomboid/Server" servercfgfullpath="${servercfgdir}/${servercfg}" @@ -158,11 +158,11 @@ logdir="${rootdir}/log" gamelogdir="${HOME}/Zomboid/Logs" lgsmlogdir="${logdir}/script" consolelogdir="${logdir}/console" -lgsmlog="${lgsmlogdir}/${servicename}-script.log" -consolelog="${consolelogdir}/${servicename}-console.log" -alertlog="${lgsmlogdir}/${servicename}-alert.log" -postdetailslog="${lgsmlogdir}/${servicename}-postdetails.log" +lgsmlog="${lgsmlogdir}/${selfname}-script.log" +consolelog="${consolelogdir}/${selfname}-console.log" +alertlog="${lgsmlogdir}/${selfname}-alert.log" +postdetailslog="${lgsmlogdir}/${selfname}-postdetails.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" +lgsmlogdate="${lgsmlogdir}/${selfname}-script-$(date '+%Y-%m-%d-%H:%M:%S').log" +consolelogdate="${consolelogdir}/${selfname}-console-$(date '+%Y-%m-%d-%H:%M:%S').log" diff --git a/lgsm/config-default/config-lgsm/q2server/_default.cfg b/lgsm/config-default/config-lgsm/q2server/_default.cfg index afe4e0f1e..8601a5f8d 100644 --- a/lgsm/config-default/config-lgsm/q2server/_default.cfg +++ b/lgsm/config-default/config-lgsm/q2server/_default.cfg @@ -136,7 +136,7 @@ glibc="null" systemdir="${serverfiles}/baseq2" executabledir="${serverfiles}" executable="./quake2" -servercfg="${servicename}.cfg" +servercfg="${selfname}.cfg" servercfgdefault="server.cfg" servercfgdir="${systemdir}" servercfgfullpath="${servercfgdir}/${servercfg}" @@ -149,11 +149,11 @@ logdir="${rootdir}/log" gamelogdir="${serverfiles}/Logs" lgsmlogdir="${logdir}/script" consolelogdir="${logdir}/console" -lgsmlog="${lgsmlogdir}/${servicename}-script.log" -consolelog="${consolelogdir}/${servicename}-console.log" -alertlog="${lgsmlogdir}/${servicename}-alert.log" -postdetailslog="${lgsmlogdir}/${servicename}-postdetails.log" +lgsmlog="${lgsmlogdir}/${selfname}-script.log" +consolelog="${consolelogdir}/${selfname}-console.log" +alertlog="${lgsmlogdir}/${selfname}-alert.log" +postdetailslog="${lgsmlogdir}/${selfname}-postdetails.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" +lgsmlogdate="${lgsmlogdir}/${selfname}-script-$(date '+%Y-%m-%d-%H:%M:%S').log" +consolelogdate="${consolelogdir}/${selfname}-console-$(date '+%Y-%m-%d-%H:%M:%S').log" diff --git a/lgsm/config-default/config-lgsm/q3server/_default.cfg b/lgsm/config-default/config-lgsm/q3server/_default.cfg index 68791bb60..02d27c9d8 100644 --- a/lgsm/config-default/config-lgsm/q3server/_default.cfg +++ b/lgsm/config-default/config-lgsm/q3server/_default.cfg @@ -136,7 +136,7 @@ glibc="2.1" systemdir="${serverfiles}/baseq3" executabledir="${serverfiles}" executable="./q3ded" -servercfg="${servicename}.cfg" +servercfg="${selfname}.cfg" servercfgdefault="server.cfg" servercfgdir="${systemdir}" servercfgfullpath="${servercfgdir}/${servercfg}" @@ -149,11 +149,11 @@ logdir="${rootdir}/log" gamelogdir="${serverfiles}/Logs" lgsmlogdir="${logdir}/script" consolelogdir="${logdir}/console" -lgsmlog="${lgsmlogdir}/${servicename}-script.log" -consolelog="${consolelogdir}/${servicename}-console.log" -alertlog="${lgsmlogdir}/${servicename}-alert.log" -postdetailslog="${lgsmlogdir}/${servicename}-postdetails.log" +lgsmlog="${lgsmlogdir}/${selfname}-script.log" +consolelog="${consolelogdir}/${selfname}-console.log" +alertlog="${lgsmlogdir}/${selfname}-alert.log" +postdetailslog="${lgsmlogdir}/${selfname}-postdetails.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" +lgsmlogdate="${lgsmlogdir}/${selfname}-script-$(date '+%Y-%m-%d-%H:%M:%S').log" +consolelogdate="${consolelogdir}/${selfname}-console-$(date '+%Y-%m-%d-%H:%M:%S').log" diff --git a/lgsm/config-default/config-lgsm/qlserver/_default.cfg b/lgsm/config-default/config-lgsm/qlserver/_default.cfg index 5391c5976..71f86ac98 100644 --- a/lgsm/config-default/config-lgsm/qlserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/qlserver/_default.cfg @@ -144,7 +144,7 @@ glibc="2.15" systemdir="${serverfiles}" executabledir="${serverfiles}" executable=$([ "$(uname -m)" == "x86_64" ] && echo -e "./run_server_x64.sh" || echo -e "./run_server_x86.sh") -servercfg="${servicename}.cfg" +servercfg="${selfname}.cfg" servercfgdefault="server.cfg" servercfgdir="${serverfiles}/baseq3" servercfgfullpath="${servercfgdir}/${servercfg}" @@ -157,12 +157,12 @@ logdir="${rootdir}/log" gamelogdir="${logdir}/server" lgsmlogdir="${logdir}/script" consolelogdir="${logdir}/console" -gamelog="${gamelogdir}/${servicename}-game.log" -lgsmlog="${lgsmlogdir}/${servicename}-script.log" -consolelog="${consolelogdir}/${servicename}-console.log" -alertlog="${lgsmlogdir}/${servicename}-alert.log" -postdetailslog="${lgsmlogdir}/${servicename}-postdetails.log" +gamelog="${gamelogdir}/${selfname}-game.log" +lgsmlog="${lgsmlogdir}/${selfname}-script.log" +consolelog="${consolelogdir}/${selfname}-console.log" +alertlog="${lgsmlogdir}/${selfname}-alert.log" +postdetailslog="${lgsmlogdir}/${selfname}-postdetails.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" +lgsmlogdate="${lgsmlogdir}/${selfname}-script-$(date '+%Y-%m-%d-%H:%M:%S').log" +consolelogdate="${consolelogdir}/${selfname}-console-$(date '+%Y-%m-%d-%H:%M:%S').log" diff --git a/lgsm/config-default/config-lgsm/qwserver/_default.cfg b/lgsm/config-default/config-lgsm/qwserver/_default.cfg index 6f2f41157..693ffcbdf 100644 --- a/lgsm/config-default/config-lgsm/qwserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/qwserver/_default.cfg @@ -135,7 +135,7 @@ glibc="2.17" systemdir="${serverfiles}/ktx" executabledir="${serverfiles}" executable="./mvdsv" -servercfg="${servicename}.cfg" +servercfg="${selfname}.cfg" servercfgdefault="server.cfg" servercfgdir="${systemdir}" servercfgfullpath="${servercfgdir}/${servercfg}" @@ -148,11 +148,11 @@ logdir="${rootdir}/log" gamelogdir="${systemdir}/logs" lgsmlogdir="${logdir}/script" consolelogdir="${logdir}/console" -lgsmlog="${lgsmlogdir}/${servicename}-script.log" -consolelog="${consolelogdir}/${servicename}-console.log" -alertlog="${lgsmlogdir}/${servicename}-alert.log" -postdetailslog="${lgsmlogdir}/${servicename}-postdetails.log" +lgsmlog="${lgsmlogdir}/${selfname}-script.log" +consolelog="${consolelogdir}/${selfname}-console.log" +alertlog="${lgsmlogdir}/${selfname}-alert.log" +postdetailslog="${lgsmlogdir}/${selfname}-postdetails.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" +lgsmlogdate="${lgsmlogdir}/${selfname}-script-$(date '+%Y-%m-%d-%H:%M:%S').log" +consolelogdate="${consolelogdir}/${selfname}-console-$(date '+%Y-%m-%d-%H:%M:%S').log" diff --git a/lgsm/config-default/config-lgsm/ricochetserver/_default.cfg b/lgsm/config-default/config-lgsm/ricochetserver/_default.cfg index 6a688c835..f62f4ceb1 100644 --- a/lgsm/config-default/config-lgsm/ricochetserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/ricochetserver/_default.cfg @@ -150,7 +150,7 @@ glibc="2.3.4" systemdir="${serverfiles}/ricochet" executabledir="${serverfiles}" executable="./hlds_run" -servercfg="${servicename}.cfg" +servercfg="${selfname}.cfg" servercfgdefault="server.cfg" servercfgdir="${systemdir}" servercfgfullpath="${servercfgdir}/${servercfg}" @@ -163,11 +163,11 @@ logdir="${rootdir}/log" gamelogdir="${systemdir}/logs" lgsmlogdir="${logdir}/script" consolelogdir="${logdir}/console" -lgsmlog="${lgsmlogdir}/${servicename}-script.log" -consolelog="${consolelogdir}/${servicename}-console.log" -alertlog="${lgsmlogdir}/${servicename}-alert.log" -postdetailslog="${lgsmlogdir}/${servicename}-postdetails.log" +lgsmlog="${lgsmlogdir}/${selfname}-script.log" +consolelog="${consolelogdir}/${selfname}-console.log" +alertlog="${lgsmlogdir}/${selfname}-alert.log" +postdetailslog="${lgsmlogdir}/${selfname}-postdetails.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" +lgsmlogdate="${lgsmlogdir}/${selfname}-script-$(date '+%Y-%m-%d-%H:%M:%S').log" +consolelogdate="${consolelogdir}/${selfname}-console-$(date '+%Y-%m-%d-%H:%M:%S').log" diff --git a/lgsm/config-default/config-lgsm/roserver/_default.cfg b/lgsm/config-default/config-lgsm/roserver/_default.cfg index 7a65a0d67..1018f0028 100644 --- a/lgsm/config-default/config-lgsm/roserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/roserver/_default.cfg @@ -151,7 +151,7 @@ serverfiles="${rootdir}/serverfiles" systemdir="${serverfiles}/system" executabledir="${systemdir}" executable="./ucc-bin" -servercfg="${servicename}.ini" +servercfg="${selfname}.ini" servercfgdefault="default.ini" servercfgdir="${systemdir}" servercfgfullpath="${servercfgdir}/${servercfg}" @@ -165,13 +165,13 @@ logdir="${rootdir}/log" gamelogdir="${logdir}/server" lgsmlogdir="${logdir}/script" consolelogdir="${logdir}/console" -gamelog="${gamelogdir}/${servicename}-game.log" -lgsmlog="${lgsmlogdir}/${servicename}-script.log" -consolelog="${consolelogdir}/${servicename}-console.log" -alertlog="${lgsmlogdir}/${servicename}-alert.log" -postdetailslog="${lgsmlogdir}/${servicename}-postdetails.log" +gamelog="${gamelogdir}/${selfname}-game.log" +lgsmlog="${lgsmlogdir}/${selfname}-script.log" +consolelog="${consolelogdir}/${selfname}-console.log" +alertlog="${lgsmlogdir}/${selfname}-alert.log" +postdetailslog="${lgsmlogdir}/${selfname}-postdetails.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" +lgsmlogdate="${lgsmlogdir}/${selfname}-script-$(date '+%Y-%m-%d-%H:%M:%S').log" +consolelogdate="${consolelogdir}/${selfname}-console-$(date '+%Y-%m-%d-%H:%M:%S').log" +gamelogdate="${gamelogdir}/${selfname}-game-$(date '+%Y-%m-%d-%H:%M:%S').log" diff --git a/lgsm/config-default/config-lgsm/rtcwserver/_default.cfg b/lgsm/config-default/config-lgsm/rtcwserver/_default.cfg index 32ce55ab1..1abd2e20d 100644 --- a/lgsm/config-default/config-lgsm/rtcwserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/rtcwserver/_default.cfg @@ -136,7 +136,7 @@ glibc="2.1" systemdir="${serverfiles}/main" executabledir="${serverfiles}" executable="./iowolfded.x86_64" -servercfg="${servicename}.cfg" +servercfg="${selfname}.cfg" servercfgdefault="server.cfg" servercfgdir="${systemdir}" servercfgfullpath="${servercfgdir}/${servercfg}" @@ -149,11 +149,11 @@ logdir="${rootdir}/log" gamelogdir="${serverfiles}/Logs" lgsmlogdir="${logdir}/script" consolelogdir="${logdir}/console" -lgsmlog="${lgsmlogdir}/${servicename}-script.log" -consolelog="${consolelogdir}/${servicename}-console.log" -alertlog="${lgsmlogdir}/${servicename}-alert.log" -postdetailslog="${lgsmlogdir}/${servicename}-postdetails.log" +lgsmlog="${lgsmlogdir}/${selfname}-script.log" +consolelog="${consolelogdir}/${selfname}-console.log" +alertlog="${lgsmlogdir}/${selfname}-alert.log" +postdetailslog="${lgsmlogdir}/${selfname}-postdetails.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" +lgsmlogdate="${lgsmlogdir}/${selfname}-script-$(date '+%Y-%m-%d-%H:%M:%S').log" +consolelogdate="${consolelogdir}/${selfname}-console-$(date '+%Y-%m-%d-%H:%M:%S').log" diff --git a/lgsm/config-default/config-lgsm/rustserver/_default.cfg b/lgsm/config-default/config-lgsm/rustserver/_default.cfg index dff675e15..6835d35d6 100644 --- a/lgsm/config-default/config-lgsm/rustserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/rustserver/_default.cfg @@ -42,7 +42,7 @@ else # Keep randomness of the number if not set conditionalsalt="" fi -parms="-batchmode +server.ip ${ip} +server.port ${port} +server.tickrate ${tickrate} +server.hostname \"${servername}\" +server.identity \"${servicename}\" ${conditionalseed} ${conditionalsalt} +server.maxplayers ${maxplayers} +server.worldsize ${worldsize} +server.saveinterval ${saveinterval} +rcon.web ${rconweb} +rcon.ip ${ip} +rcon.port ${rconport} +rcon.password \"${rconpassword}\" -logfile \"${gamelogdate}\"" +parms="-batchmode +server.ip ${ip} +server.port ${port} +server.tickrate ${tickrate} +server.hostname \"${servername}\" +server.identity \"${selfname}\" ${conditionalseed} ${conditionalsalt} +server.maxplayers ${maxplayers} +server.worldsize ${worldsize} +server.saveinterval ${saveinterval} +rcon.web ${rconweb} +rcon.ip ${ip} +rcon.port ${rconport} +rcon.password \"${rconpassword}\" -logfile \"${gamelogdate}\"" } #### LinuxGSM Settings #### @@ -174,7 +174,7 @@ glibc="2.15" systemdir="${serverfiles}" executabledir="${serverfiles}" executable="./RustDedicated" -serveridentitydir="${systemdir}/server/${servicename}" +serveridentitydir="${systemdir}/server/${selfname}" servercfg="server.cfg" servercfgdefault="server.cfg" servercfgdir="${serveridentitydir}/cfg" @@ -188,12 +188,12 @@ logdir="${rootdir}/log" gamelogdir="${logdir}/server" lgsmlogdir="${logdir}/script" consolelogdir="${logdir}/console" -lgsmlog="${lgsmlogdir}/${servicename}-script.log" -consolelog="${consolelogdir}/${servicename}-console.log" -alertlog="${lgsmlogdir}/${servicename}-alert.log" -postdetailslog="${lgsmlogdir}/${servicename}-postdetails.log" +lgsmlog="${lgsmlogdir}/${selfname}-script.log" +consolelog="${consolelogdir}/${selfname}-console.log" +alertlog="${lgsmlogdir}/${selfname}-alert.log" +postdetailslog="${lgsmlogdir}/${selfname}-postdetails.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" +lgsmlogdate="${lgsmlogdir}/${selfname}-script-$(date '+%Y-%m-%d-%H:%M:%S').log" +consolelogdate="${consolelogdir}/${selfname}-console-$(date '+%Y-%m-%d-%H:%M:%S').log" +gamelogdate="${gamelogdir}/${selfname}-game-$(date '+%Y-%m-%d-%H:%M:%S').log" diff --git a/lgsm/config-default/config-lgsm/rwserver/_default.cfg b/lgsm/config-default/config-lgsm/rwserver/_default.cfg index c4eec91d9..966c473fc 100644 --- a/lgsm/config-default/config-lgsm/rwserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/rwserver/_default.cfg @@ -158,11 +158,11 @@ logdir="${rootdir}/log" gamelogdir="${systemdir}/logs" lgsmlogdir="${logdir}/script" consolelogdir="${logdir}/console" -lgsmlog="${lgsmlogdir}/${servicename}-script.log" -consolelog="${consolelogdir}/${servicename}-console.log" -alertlog="${lgsmlogdir}/${servicename}-alert.log" -postdetailslog="${lgsmlogdir}/${servicename}-postdetails.log" +lgsmlog="${lgsmlogdir}/${selfname}-script.log" +consolelog="${consolelogdir}/${selfname}-console.log" +alertlog="${lgsmlogdir}/${selfname}-alert.log" +postdetailslog="${lgsmlogdir}/${selfname}-postdetails.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" +lgsmlogdate="${lgsmlogdir}/${selfname}-script-$(date '+%Y-%m-%d-%H:%M:%S').log" +consolelogdate="${consolelogdir}/${selfname}-console-$(date '+%Y-%m-%d-%H:%M:%S').log" diff --git a/lgsm/config-default/config-lgsm/sampserver/_default.cfg b/lgsm/config-default/config-lgsm/sampserver/_default.cfg index c8f90817c..50b52ad56 100644 --- a/lgsm/config-default/config-lgsm/sampserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/sampserver/_default.cfg @@ -148,11 +148,11 @@ logdir="${rootdir}/log" gamelogdir="${serverfiles}/samp03" lgsmlogdir="${logdir}/script" consolelogdir="${logdir}/console" -lgsmlog="${lgsmlogdir}/${servicename}-script.log" -consolelog="${consolelogdir}/${servicename}-console.log" -alertlog="${lgsmlogdir}/${servicename}-alert.log" -postdetailslog="${lgsmlogdir}/${servicename}-postdetails.log" +lgsmlog="${lgsmlogdir}/${selfname}-script.log" +consolelog="${consolelogdir}/${selfname}-console.log" +alertlog="${lgsmlogdir}/${selfname}-alert.log" +postdetailslog="${lgsmlogdir}/${selfname}-postdetails.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" +lgsmlogdate="${lgsmlogdir}/${selfname}-script-$(date '+%Y-%m-%d-%H:%M:%S').log" +consolelogdate="${consolelogdir}/${selfname}-console-$(date '+%Y-%m-%d-%H:%M:%S').log" diff --git a/lgsm/config-default/config-lgsm/sbotsserver/_default.cfg b/lgsm/config-default/config-lgsm/sbotsserver/_default.cfg index b71f3aae7..d426769be 100644 --- a/lgsm/config-default/config-lgsm/sbotsserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/sbotsserver/_default.cfg @@ -160,11 +160,11 @@ logdir="${rootdir}/log" gamelogdir="${serverfiles}/Logs" lgsmlogdir="${logdir}/script" consolelogdir="${logdir}/console" -lgsmlog="${lgsmlogdir}/${servicename}-script.log" -consolelog="${consolelogdir}/${servicename}-console.log" -alertlog="${lgsmlogdir}/${servicename}-alert.log" -postdetailslog="${lgsmlogdir}/${servicename}-postdetails.log" +lgsmlog="${lgsmlogdir}/${selfname}-script.log" +consolelog="${consolelogdir}/${selfname}-console.log" +alertlog="${lgsmlogdir}/${selfname}-alert.log" +postdetailslog="${lgsmlogdir}/${selfname}-postdetails.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" +lgsmlogdate="${lgsmlogdir}/${selfname}-script-$(date '+%Y-%m-%d-%H:%M:%S').log" +consolelogdate="${consolelogdir}/${selfname}-console-$(date '+%Y-%m-%d-%H:%M:%S').log" diff --git a/lgsm/config-default/config-lgsm/sbserver/_default.cfg b/lgsm/config-default/config-lgsm/sbserver/_default.cfg index 46a671ae6..cdff1963d 100644 --- a/lgsm/config-default/config-lgsm/sbserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/sbserver/_default.cfg @@ -161,11 +161,11 @@ logdir="${rootdir}/log" gamelogdir="${serverfiles}/storage" lgsmlogdir="${logdir}/script" consolelogdir="${logdir}/console" -lgsmlog="${lgsmlogdir}/${servicename}-script.log" -consolelog="${consolelogdir}/${servicename}-console.log" -alertlog="${lgsmlogdir}/${servicename}-alert.log" -postdetailslog="${lgsmlogdir}/${servicename}-postdetails.log" +lgsmlog="${lgsmlogdir}/${selfname}-script.log" +consolelog="${consolelogdir}/${selfname}-console.log" +alertlog="${lgsmlogdir}/${selfname}-alert.log" +postdetailslog="${lgsmlogdir}/${selfname}-postdetails.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" +lgsmlogdate="${lgsmlogdir}/${selfname}-script-$(date '+%Y-%m-%d-%H:%M:%S').log" +consolelogdate="${consolelogdir}/${selfname}-console-$(date '+%Y-%m-%d-%H:%M:%S').log" diff --git a/lgsm/config-default/config-lgsm/sdtdserver/_default.cfg b/lgsm/config-default/config-lgsm/sdtdserver/_default.cfg index edc437b70..0f56ec19b 100644 --- a/lgsm/config-default/config-lgsm/sdtdserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/sdtdserver/_default.cfg @@ -158,12 +158,12 @@ logdir="${rootdir}/log" gamelogdir="${logdir}/server" lgsmlogdir="${logdir}/script" consolelogdir="${logdir}/console" -gamelog="${gamelogdir}/${servicename}-game.log" -lgsmlog="${lgsmlogdir}/${servicename}-script.log" -consolelog="${consolelogdir}/${servicename}-console.log" -alertlog="${lgsmlogdir}/${servicename}-alert.log" -postdetailslog="${lgsmlogdir}/${servicename}-postdetails.log" +gamelog="${gamelogdir}/${selfname}-game.log" +lgsmlog="${lgsmlogdir}/${selfname}-script.log" +consolelog="${consolelogdir}/${selfname}-console.log" +alertlog="${lgsmlogdir}/${selfname}-alert.log" +postdetailslog="${lgsmlogdir}/${selfname}-postdetails.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" +lgsmlogdate="${lgsmlogdir}/${selfname}-script-$(date '+%Y-%m-%d-%H:%M:%S').log" +consolelogdate="${consolelogdir}/${selfname}-console-$(date '+%Y-%m-%d-%H:%M:%S').log" diff --git a/lgsm/config-default/config-lgsm/sfcserver/_default.cfg b/lgsm/config-default/config-lgsm/sfcserver/_default.cfg index 7f9b14dac..373678cb4 100644 --- a/lgsm/config-default/config-lgsm/sfcserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/sfcserver/_default.cfg @@ -150,7 +150,7 @@ glibc="2.15" systemdir="${serverfiles}/sfclassic" executabledir="${serverfiles}" executable="./srcds_run" -servercfg="${servicename}.cfg" +servercfg="${selfname}.cfg" servercfgdefault="server.cfg" servercfgdir="${systemdir}/cfg" servercfgfullpath="${servercfgdir}/${servercfg}" @@ -163,11 +163,11 @@ logdir="${rootdir}/log" gamelogdir="${systemdir}/logs" lgsmlogdir="${logdir}/script" consolelogdir="${logdir}/console" -lgsmlog="${lgsmlogdir}/${servicename}-script.log" -consolelog="${consolelogdir}/${servicename}-console.log" -alertlog="${lgsmlogdir}/${servicename}-alert.log" -postdetailslog="${lgsmlogdir}/${servicename}-postdetails.log" +lgsmlog="${lgsmlogdir}/${selfname}-script.log" +consolelog="${consolelogdir}/${selfname}-console.log" +alertlog="${lgsmlogdir}/${selfname}-alert.log" +postdetailslog="${lgsmlogdir}/${selfname}-postdetails.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" +lgsmlogdate="${lgsmlogdir}/${selfname}-script-$(date '+%Y-%m-%d-%H:%M:%S').log" +consolelogdate="${consolelogdir}/${selfname}-console-$(date '+%Y-%m-%d-%H:%M:%S').log" diff --git a/lgsm/config-default/config-lgsm/sof2server/_default.cfg b/lgsm/config-default/config-lgsm/sof2server/_default.cfg index 5458032c4..48887e1ce 100644 --- a/lgsm/config-default/config-lgsm/sof2server/_default.cfg +++ b/lgsm/config-default/config-lgsm/sof2server/_default.cfg @@ -136,7 +136,7 @@ glibc="2.1" systemdir="${serverfiles}/main" executabledir="${serverfiles}" executable="./sof2ded" -servercfg="${servicename}.cfg" +servercfg="${selfname}.cfg" servercfgdefault="server.cfg" servercfgdir="${systemdir}" servercfgfullpath="${servercfgdir}/${servercfg}" @@ -149,11 +149,11 @@ logdir="${rootdir}/log" gamelogdir="${serverfiles}/Logs" lgsmlogdir="${logdir}/script" consolelogdir="${logdir}/console" -lgsmlog="${lgsmlogdir}/${servicename}-script.log" -consolelog="${consolelogdir}/${servicename}-console.log" -alertlog="${lgsmlogdir}/${servicename}-alert.log" -postdetailslog="${lgsmlogdir}/${servicename}-postdetails.log" +lgsmlog="${lgsmlogdir}/${selfname}-script.log" +consolelog="${consolelogdir}/${selfname}-console.log" +alertlog="${lgsmlogdir}/${selfname}-alert.log" +postdetailslog="${lgsmlogdir}/${selfname}-postdetails.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" +lgsmlogdate="${lgsmlogdir}/${selfname}-script-$(date '+%Y-%m-%d-%H:%M:%S').log" +consolelogdate="${consolelogdir}/${selfname}-console-$(date '+%Y-%m-%d-%H:%M:%S').log" diff --git a/lgsm/config-default/config-lgsm/solserver/_default.cfg b/lgsm/config-default/config-lgsm/solserver/_default.cfg index 0090508b5..89fe8c4e1 100644 --- a/lgsm/config-default/config-lgsm/solserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/solserver/_default.cfg @@ -151,11 +151,11 @@ logdir="${rootdir}/log" gamelogdir="${serverfiles}/logs" lgsmlogdir="${logdir}/script" consolelogdir="${logdir}/console" -lgsmlog="${lgsmlogdir}/${servicename}-script.log" -consolelog="${consolelogdir}/${servicename}-console.log" -alertlog="${lgsmlogdir}/${servicename}-alert.log" -postdetailslog="${lgsmlogdir}/${servicename}-postdetails.log" +lgsmlog="${lgsmlogdir}/${selfname}-script.log" +consolelog="${consolelogdir}/${selfname}-console.log" +alertlog="${lgsmlogdir}/${selfname}-alert.log" +postdetailslog="${lgsmlogdir}/${selfname}-postdetails.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" +lgsmlogdate="${lgsmlogdir}/${selfname}-script-$(date '+%Y-%m-%d-%H:%M:%S').log" +consolelogdate="${consolelogdir}/${selfname}-console-$(date '+%Y-%m-%d-%H:%M:%S').log" diff --git a/lgsm/config-default/config-lgsm/squadserver/_default.cfg b/lgsm/config-default/config-lgsm/squadserver/_default.cfg index 2a37e0ead..ab8551bcb 100644 --- a/lgsm/config-default/config-lgsm/squadserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/squadserver/_default.cfg @@ -147,7 +147,7 @@ glibc="2.17" systemdir="${serverfiles}/Squad" executabledir="${serverfiles}" executable="./SquadGameServer.sh" -servercfg="${servicename}.cfg" +servercfg="${selfname}.cfg" servercfgdefault="Server.cfg" servercfgdir="${systemdir}/ServerConfig" servercfgfullpath="${servercfgdir}/${servercfg}" @@ -160,12 +160,12 @@ logdir="${rootdir}/log" gamelogdir="${systemdir}/Saved/Logs" lgsmlogdir="${logdir}/script" consolelogdir="${logdir}/console" -gamelog="${gamelogdir}/${servicename}-game.log" -lgsmlog="${lgsmlogdir}/${servicename}-script.log" -consolelog="${consolelogdir}/${servicename}-console.log" -alertlog="${lgsmlogdir}/${servicename}-alert.log" -postdetailslog="${lgsmlogdir}/${servicename}-postdetails.log" +gamelog="${gamelogdir}/${selfname}-game.log" +lgsmlog="${lgsmlogdir}/${selfname}-script.log" +consolelog="${consolelogdir}/${selfname}-console.log" +alertlog="${lgsmlogdir}/${selfname}-alert.log" +postdetailslog="${lgsmlogdir}/${selfname}-postdetails.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" +lgsmlogdate="${lgsmlogdir}/${selfname}-script-$(date '+%Y-%m-%d-%H:%M:%S').log" +consolelogdate="${consolelogdir}/${selfname}-console-$(date '+%Y-%m-%d-%H:%M:%S').log" diff --git a/lgsm/config-default/config-lgsm/ss3server/_default.cfg b/lgsm/config-default/config-lgsm/ss3server/_default.cfg index ebede1b84..606fdb21c 100644 --- a/lgsm/config-default/config-lgsm/ss3server/_default.cfg +++ b/lgsm/config-default/config-lgsm/ss3server/_default.cfg @@ -146,7 +146,7 @@ glibc="2.13" systemdir="${serverfiles}/Bin" executabledir="${systemdir}" executable="./runSam3_DedicatedServer.sh" -servercfg="${servicename}.ini" +servercfg="${selfname}.ini" servercfgdefault="server.ini" servercfgdir="${serverfiles}/Content/SeriousSam3/Config" servercfgfullpath="${servercfgdir}/${servercfg}" @@ -159,13 +159,13 @@ logdir="${rootdir}/log" gamelogdir="${logdir}/server" lgsmlogdir="${logdir}/script" consolelogdir="${logdir}/console" -gamelog="${gamelogdir}/${servicename}-game.log" -lgsmlog="${lgsmlogdir}/${servicename}-script.log" -consolelog="${consolelogdir}/${servicename}-console.log" -alertlog="${lgsmlogdir}/${servicename}-alert.log" -postdetailslog="${lgsmlogdir}/${servicename}-postdetails.log" +gamelog="${gamelogdir}/${selfname}-game.log" +lgsmlog="${lgsmlogdir}/${selfname}-script.log" +consolelog="${consolelogdir}/${selfname}-console.log" +alertlog="${lgsmlogdir}/${selfname}-alert.log" +postdetailslog="${lgsmlogdir}/${selfname}-postdetails.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" +lgsmlogdate="${lgsmlogdir}/${selfname}-script-$(date '+%Y-%m-%d-%H:%M:%S').log" +consolelogdate="${consolelogdir}/${selfname}-console-$(date '+%Y-%m-%d-%H:%M:%S').log" +gamelogdate="${gamelogdir}/${selfname}-game-$(date '+%Y-%m-%d-%H:%M:%S').log" diff --git a/lgsm/config-default/config-lgsm/stserver/_default.cfg b/lgsm/config-default/config-lgsm/stserver/_default.cfg index b5a3e5af0..73883f785 100644 --- a/lgsm/config-default/config-lgsm/stserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/stserver/_default.cfg @@ -165,11 +165,11 @@ logdir="${rootdir}/log" gamelogdir="${HOME}/.config/unity3d/Rocketwerkz/Stationeers" lgsmlogdir="${logdir}/script" consolelogdir="${logdir}/console" -lgsmlog="${lgsmlogdir}/${servicename}-script.log" -consolelog="${consolelogdir}/${servicename}-console.log" -alertlog="${lgsmlogdir}/${servicename}-alert.log" -postdetailslog="${lgsmlogdir}/${servicename}-postdetails.log" +lgsmlog="${lgsmlogdir}/${selfname}-script.log" +consolelog="${consolelogdir}/${selfname}-console.log" +alertlog="${lgsmlogdir}/${selfname}-alert.log" +postdetailslog="${lgsmlogdir}/${selfname}-postdetails.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" +lgsmlogdate="${lgsmlogdir}/${selfname}-script-$(date '+%Y-%m-%d-%H:%M:%S').log" +consolelogdate="${consolelogdir}/${selfname}-console-$(date '+%Y-%m-%d-%H:%M:%S').log" diff --git a/lgsm/config-default/config-lgsm/svenserver/_default.cfg b/lgsm/config-default/config-lgsm/svenserver/_default.cfg index b495c852a..208adad83 100644 --- a/lgsm/config-default/config-lgsm/svenserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/svenserver/_default.cfg @@ -149,7 +149,7 @@ glibc="2.24" systemdir="${serverfiles}/svencoop" executabledir="${serverfiles}" executable="./svends_run" -servercfg="${servicename}.cfg" +servercfg="${selfname}.cfg" servercfgdefault="server.cfg" servercfgdir="${systemdir}" servercfgfullpath="${servercfgdir}/${servercfg}" @@ -162,11 +162,11 @@ logdir="${rootdir}/log" gamelogdir="${systemdir}/logs" lgsmlogdir="${logdir}/script" consolelogdir="${logdir}/console" -lgsmlog="${lgsmlogdir}/${servicename}-script.log" -consolelog="${consolelogdir}/${servicename}-console.log" -alertlog="${lgsmlogdir}/${servicename}-alert.log" -postdetailslog="${lgsmlogdir}/${servicename}-postdetails.log" +lgsmlog="${lgsmlogdir}/${selfname}-script.log" +consolelog="${consolelogdir}/${selfname}-console.log" +alertlog="${lgsmlogdir}/${selfname}-alert.log" +postdetailslog="${lgsmlogdir}/${selfname}-postdetails.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" +lgsmlogdate="${lgsmlogdir}/${selfname}-script-$(date '+%Y-%m-%d-%H:%M:%S').log" +consolelogdate="${consolelogdir}/${selfname}-console-$(date '+%Y-%m-%d-%H:%M:%S').log" diff --git a/lgsm/config-default/config-lgsm/terrariaserver/_default.cfg b/lgsm/config-default/config-lgsm/terrariaserver/_default.cfg index 3dbcaa100..495eaf159 100644 --- a/lgsm/config-default/config-lgsm/terrariaserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/terrariaserver/_default.cfg @@ -149,7 +149,7 @@ glibc="2.7" systemdir="${serverfiles}" executabledir="${serverfiles}" executable="./TerrariaServer" -servercfg="${servicename}.txt" +servercfg="${selfname}.txt" servercfgdefault="serverconfig.txt" servercfgdir="${serverfiles}" servercfgfullpath="${servercfgdir}/${servercfg}" @@ -162,11 +162,11 @@ logdir="${rootdir}/log" #gamelogdir="" # No server logs available lgsmlogdir="${logdir}/script" consolelogdir="${logdir}/console" -lgsmlog="${lgsmlogdir}/${servicename}-script.log" -consolelog="${consolelogdir}/${servicename}-console.log" -alertlog="${lgsmlogdir}/${servicename}-alert.log" -postdetailslog="${lgsmlogdir}/${servicename}-postdetails.log" +lgsmlog="${lgsmlogdir}/${selfname}-script.log" +consolelog="${consolelogdir}/${selfname}-console.log" +alertlog="${lgsmlogdir}/${selfname}-alert.log" +postdetailslog="${lgsmlogdir}/${selfname}-postdetails.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" +lgsmlogdate="${lgsmlogdir}/${selfname}-script-$(date '+%Y-%m-%d-%H:%M:%S').log" +consolelogdate="${consolelogdir}/${selfname}-console-$(date '+%Y-%m-%d-%H:%M:%S').log" diff --git a/lgsm/config-default/config-lgsm/tf2server/_default.cfg b/lgsm/config-default/config-lgsm/tf2server/_default.cfg index 29ce24de0..bcc4585b4 100644 --- a/lgsm/config-default/config-lgsm/tf2server/_default.cfg +++ b/lgsm/config-default/config-lgsm/tf2server/_default.cfg @@ -155,7 +155,7 @@ glibc="2.15" systemdir="${serverfiles}/tf" executabledir="${serverfiles}" executable="./srcds_run" -servercfg="${servicename}.cfg" +servercfg="${selfname}.cfg" servercfgdefault="server.cfg" servercfgdir="${systemdir}/cfg" servercfgfullpath="${servercfgdir}/${servercfg}" @@ -168,11 +168,11 @@ logdir="${rootdir}/log" gamelogdir="${systemdir}/logs" lgsmlogdir="${logdir}/script" consolelogdir="${logdir}/console" -lgsmlog="${lgsmlogdir}/${servicename}-script.log" -consolelog="${consolelogdir}/${servicename}-console.log" -alertlog="${lgsmlogdir}/${servicename}-alert.log" -postdetailslog="${lgsmlogdir}/${servicename}-postdetails.log" +lgsmlog="${lgsmlogdir}/${selfname}-script.log" +consolelog="${consolelogdir}/${selfname}-console.log" +alertlog="${lgsmlogdir}/${selfname}-alert.log" +postdetailslog="${lgsmlogdir}/${selfname}-postdetails.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" +lgsmlogdate="${lgsmlogdir}/${selfname}-script-$(date '+%Y-%m-%d-%H:%M:%S').log" +consolelogdate="${consolelogdir}/${selfname}-console-$(date '+%Y-%m-%d-%H:%M:%S').log" diff --git a/lgsm/config-default/config-lgsm/tfcserver/_default.cfg b/lgsm/config-default/config-lgsm/tfcserver/_default.cfg index ad7a9dfb1..0223c28c4 100644 --- a/lgsm/config-default/config-lgsm/tfcserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/tfcserver/_default.cfg @@ -150,7 +150,7 @@ glibc="2.3.4" systemdir="${serverfiles}/tfc" executabledir="${serverfiles}" executable="./hlds_run" -servercfg="${servicename}.cfg" +servercfg="${selfname}.cfg" servercfgdefault="server.cfg" servercfgdir="${systemdir}" servercfgfullpath="${servercfgdir}/${servercfg}" @@ -163,11 +163,11 @@ logdir="${rootdir}/log" gamelogdir="${systemdir}/logs" lgsmlogdir="${logdir}/script" consolelogdir="${logdir}/console" -lgsmlog="${lgsmlogdir}/${servicename}-script.log" -consolelog="${consolelogdir}/${servicename}-console.log" -alertlog="${lgsmlogdir}/${servicename}-alert.log" -postdetailslog="${lgsmlogdir}/${servicename}-postdetails.log" +lgsmlog="${lgsmlogdir}/${selfname}-script.log" +consolelog="${consolelogdir}/${selfname}-console.log" +alertlog="${lgsmlogdir}/${selfname}-alert.log" +postdetailslog="${lgsmlogdir}/${selfname}-postdetails.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" +lgsmlogdate="${lgsmlogdir}/${selfname}-script-$(date '+%Y-%m-%d-%H:%M:%S').log" +consolelogdate="${consolelogdir}/${selfname}-console-$(date '+%Y-%m-%d-%H:%M:%S').log" diff --git a/lgsm/config-default/config-lgsm/ts3server/_default.cfg b/lgsm/config-default/config-lgsm/ts3server/_default.cfg index a92414e54..2d53a0725 100644 --- a/lgsm/config-default/config-lgsm/ts3server/_default.cfg +++ b/lgsm/config-default/config-lgsm/ts3server/_default.cfg @@ -138,7 +138,7 @@ glibc="2.17" systemdir="${serverfiles}" executabledir="${serverfiles}" executable="./ts3server" -servercfg="${servicename}.ini" +servercfg="${selfname}.ini" servercfgdefault="ts3server.ini" servercfgdir="${serverfiles}" servercfgfullpath="${servercfgdir}/${servercfg}" @@ -151,11 +151,11 @@ logdir="${rootdir}/log" gamelogdir="${serverfiles}/logs" lgsmlogdir="${logdir}/script" consolelogdir="${logdir}/console" -lgsmlog="${lgsmlogdir}/${servicename}-script.log" -consolelog="${consolelogdir}/${servicename}-console.log" -alertlog="${lgsmlogdir}/${servicename}-alert.log" -postdetailslog="${lgsmlogdir}/${servicename}-postdetails.log" +lgsmlog="${lgsmlogdir}/${selfname}-script.log" +consolelog="${consolelogdir}/${selfname}-console.log" +alertlog="${lgsmlogdir}/${selfname}-alert.log" +postdetailslog="${lgsmlogdir}/${selfname}-postdetails.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" +lgsmlogdate="${lgsmlogdir}/${selfname}-script-$(date '+%Y-%m-%d-%H:%M:%S').log" +consolelogdate="${consolelogdir}/${selfname}-console-$(date '+%Y-%m-%d-%H:%M:%S').log" diff --git a/lgsm/config-default/config-lgsm/tsserver/_default.cfg b/lgsm/config-default/config-lgsm/tsserver/_default.cfg index d1b1cc813..be66db897 100644 --- a/lgsm/config-default/config-lgsm/tsserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/tsserver/_default.cfg @@ -150,7 +150,7 @@ glibc="2.3.4" systemdir="${serverfiles}/ts" executabledir="${serverfiles}" executable="./hlds_run" -servercfg="${servicename}.cfg" +servercfg="${selfname}.cfg" servercfgdefault="server.cfg" servercfgdir="${systemdir}" servercfgfullpath="${servercfgdir}/${servercfg}" @@ -163,11 +163,11 @@ logdir="${rootdir}/log" gamelogdir="${systemdir}/logs" lgsmlogdir="${logdir}/script" consolelogdir="${logdir}/console" -lgsmlog="${lgsmlogdir}/${servicename}-script.log" -consolelog="${consolelogdir}/${servicename}-console.log" -alertlog="${lgsmlogdir}/${servicename}-alert.log" -postdetailslog="${lgsmlogdir}/${servicename}-postdetails.log" +lgsmlog="${lgsmlogdir}/${selfname}-script.log" +consolelog="${consolelogdir}/${selfname}-console.log" +alertlog="${lgsmlogdir}/${selfname}-alert.log" +postdetailslog="${lgsmlogdir}/${selfname}-postdetails.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" +lgsmlogdate="${lgsmlogdir}/${selfname}-script-$(date '+%Y-%m-%d-%H:%M:%S').log" +consolelogdate="${consolelogdir}/${selfname}-console-$(date '+%Y-%m-%d-%H:%M:%S').log" diff --git a/lgsm/config-default/config-lgsm/tuserver/_default.cfg b/lgsm/config-default/config-lgsm/tuserver/_default.cfg index 9536d9fe5..2c0b3b445 100644 --- a/lgsm/config-default/config-lgsm/tuserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/tuserver/_default.cfg @@ -20,7 +20,7 @@ gslt="" ## Server Start Command | https://docs.linuxgsm.com/configuration/start-parameters#additional-parameters fn_parms(){ -parms="-log -MultiHome=${ip} -Port=${port} -QueryPort=${queryport} -TowerServerINI=${servicename}.ini" +parms="-log -MultiHome=${ip} -Port=${port} -QueryPort=${queryport} -TowerServerINI=${selfname}.ini" } #### LinuxGSM Settings #### @@ -152,7 +152,7 @@ glibc="2.17" systemdir="${serverfiles}/Tower" executabledir="${systemdir}/Binaries/Linux" executable="./TowerServer-Linux-Shipping" -servercfg="${servicename}.ini" +servercfg="${selfname}.ini" servercfgdefault="TowerServer.ini" servercfgdir="${systemdir}/Binaries/Linux" servercfgfullpath="${servercfgdir}/${servercfg}" @@ -165,11 +165,11 @@ logdir="${rootdir}/log" gamelogdir="${systemdir}/Saved/Logs" lgsmlogdir="${logdir}/script" consolelogdir="${logdir}/console" -lgsmlog="${lgsmlogdir}/${servicename}-script.log" -consolelog="${consolelogdir}/${servicename}-console.log" -alertlog="${lgsmlogdir}/${servicename}-alert.log" -postdetailslog="${lgsmlogdir}/${servicename}-postdetails.log" +lgsmlog="${lgsmlogdir}/${selfname}-script.log" +consolelog="${consolelogdir}/${selfname}-console.log" +alertlog="${lgsmlogdir}/${selfname}-alert.log" +postdetailslog="${lgsmlogdir}/${selfname}-postdetails.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" +lgsmlogdate="${lgsmlogdir}/${selfname}-script-$(date '+%Y-%m-%d-%H:%M:%S').log" +consolelogdate="${consolelogdir}/${selfname}-console-$(date '+%Y-%m-%d-%H:%M:%S').log" diff --git a/lgsm/config-default/config-lgsm/twserver/_default.cfg b/lgsm/config-default/config-lgsm/twserver/_default.cfg index c5be7b248..f9ca0f996 100644 --- a/lgsm/config-default/config-lgsm/twserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/twserver/_default.cfg @@ -149,7 +149,7 @@ glibc="2.14" 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 +servercfg="${selfname}.cfg" # Teeworlds can also auto load any config if an autoexec.cfg file is present in the server dir servercfgdefault="server.cfg" servercfgdir="${serverfiles}/tw" servercfgfullpath="${servercfgdir}/${servercfg}" @@ -162,12 +162,12 @@ logdir="${rootdir}/log" gamelogdir="${logdir}/server" lgsmlogdir="${logdir}/script" consolelogdir="${logdir}/console" -gamelog="${gamelogdir}/${servicename}-game.log" -lgsmlog="${lgsmlogdir}/${servicename}-script.log" -consolelog="${consolelogdir}/${servicename}-console.log" -alertlog="${lgsmlogdir}/${servicename}-alert.log" -postdetailslog="${lgsmlogdir}/${servicename}-postdetails.log" +gamelog="${gamelogdir}/${selfname}-game.log" +lgsmlog="${lgsmlogdir}/${selfname}-script.log" +consolelog="${consolelogdir}/${selfname}-console.log" +alertlog="${lgsmlogdir}/${selfname}-alert.log" +postdetailslog="${lgsmlogdir}/${selfname}-postdetails.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" +lgsmlogdate="${lgsmlogdir}/${selfname}-script-$(date '+%Y-%m-%d-%H:%M:%S').log" +consolelogdate="${consolelogdir}/${selfname}-console-$(date '+%Y-%m-%d-%H:%M:%S').log" diff --git a/lgsm/config-default/config-lgsm/untserver/_default.cfg b/lgsm/config-default/config-lgsm/untserver/_default.cfg index 7ab5da558..e50f032c4 100644 --- a/lgsm/config-default/config-lgsm/untserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/untserver/_default.cfg @@ -20,7 +20,7 @@ defaultmap="pei" # Make sure you change the admin password before launching the server fn_parms(){ -parms="-port:${port} -players:${maxplayers} --nographics -${defaultmap} -batchmode +secureserver/${servicename}" +parms="-port:${port} -players:${maxplayers} --nographics -${defaultmap} -batchmode +secureserver/${selfname}" } #### LinuxGSM Settings #### @@ -152,10 +152,10 @@ glibc="2.15" systemdir="${serverfiles}" executabledir="${serverfiles}" executable="./Unturned_Headless.x86_64" -servercfgdir="${systemdir}/Servers/${servicename}" +servercfgdir="${systemdir}/Servers/${selfname}" servercfg="Config.json" servercfgdefault="Config.json" -servercfgdir="${systemdir}/Servers/${servicename}" +servercfgdir="${systemdir}/Servers/${selfname}" servercfgfullpath="${servercfgdir}/${servercfg}" ## Backup Directory @@ -166,11 +166,11 @@ logdir="${rootdir}/log" gamelogdir="${logdir}/server" lgsmlogdir="${logdir}/script" consolelogdir="${logdir}/console" -lgsmlog="${lgsmlogdir}/${servicename}-script.log" -consolelog="${consolelogdir}/${servicename}-console.log" -alertlog="${lgsmlogdir}/${servicename}-alert.log" -postdetailslog="${lgsmlogdir}/${servicename}-postdetails.log" +lgsmlog="${lgsmlogdir}/${selfname}-script.log" +consolelog="${consolelogdir}/${selfname}-console.log" +alertlog="${lgsmlogdir}/${selfname}-alert.log" +postdetailslog="${lgsmlogdir}/${selfname}-postdetails.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" +lgsmlogdate="${lgsmlogdir}/${selfname}-script-$(date '+%Y-%m-%d-%H:%M:%S').log" +consolelogdate="${consolelogdir}/${selfname}-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 c8a84bf6a..2658f60ca 100644 --- a/lgsm/config-default/config-lgsm/ut2k4server/_default.cfg +++ b/lgsm/config-default/config-lgsm/ut2k4server/_default.cfg @@ -135,7 +135,7 @@ glibc="2.4" systemdir="${serverfiles}/System" executabledir="${systemdir}" executable="./ucc-bin" -servercfg="${servicename}.ini" +servercfg="${selfname}.ini" servercfgdefault="UT2004.ini" servercfgdir="${systemdir}" servercfgfullpath="${servercfgdir}/${servercfg}" @@ -149,13 +149,13 @@ logdir="${rootdir}/log" gamelogdir="${logdir}/server" lgsmlogdir="${logdir}/script" consolelogdir="${logdir}/console" -gamelog="${gamelogdir}/${servicename}-game.log" -lgsmlog="${lgsmlogdir}/${servicename}-script.log" -consolelog="${consolelogdir}/${servicename}-console.log" -alertlog="${lgsmlogdir}/${servicename}-alert.log" -postdetailslog="${lgsmlogdir}/${servicename}-postdetails.log" +gamelog="${gamelogdir}/${selfname}-game.log" +lgsmlog="${lgsmlogdir}/${selfname}-script.log" +consolelog="${consolelogdir}/${selfname}-console.log" +alertlog="${lgsmlogdir}/${selfname}-alert.log" +postdetailslog="${lgsmlogdir}/${selfname}-postdetails.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" +lgsmlogdate="${lgsmlogdir}/${selfname}-script-$(date '+%Y-%m-%d-%H:%M:%S').log" +consolelogdate="${consolelogdir}/${selfname}-console-$(date '+%Y-%m-%d-%H:%M:%S').log" +gamelogdate="${gamelogdir}/${selfname}-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 index 59e714649..6c1db9e1e 100644 --- a/lgsm/config-default/config-lgsm/ut3server/_default.cfg +++ b/lgsm/config-default/config-lgsm/ut3server/_default.cfg @@ -25,7 +25,7 @@ allowjoininprogress="true" ## Server Start Command | https://docs.linuxgsm.com/configuration/start-parameters#additional-parameters # Edit with care | List of game types and mutators : https://docs.linuxgsm.com/game-servers/unreal-tournament-3 fn_parms(){ -parms="server ${defaultmap}?Game=${game}?bIsDedicated=${isdedicated}?bIsLanMatch=${islanmatch}?bUsesStats=${usesstats}?bShouldAdvertise=${shouldadvertise}?PureServer=${pureserver}?bAllowJoinInProgress=${allowjoininprogress}?Mutator=${mutators}?ConfigSubDir=${servicename} -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}?Mutator=${mutators}?ConfigSubDir=${selfname} -port=${port} -queryport=${queryport} -multihome=${ip} -nohomedir -unattended -log=${gamelog}" } #### LinuxGSM Settings #### @@ -148,7 +148,7 @@ executabledir="${systemdir}/Binaries" executable="./ut3" servercfg="UTGame.ini" servercfgdefault="UTGame.ini" -servercfgdir="${systemdir}/UTGame/Config/${servicename}" +servercfgdir="${systemdir}/UTGame/Config/${selfname}" servercfgfullpath="${servercfgdir}/${servercfg}" ## Backup Directory @@ -159,13 +159,13 @@ logdir="${rootdir}/log" gamelogdir="${logdir}/server" lgsmlogdir="${logdir}/script" consolelogdir="${logdir}/console" -gamelog="${gamelogdir}/${servicename}-game.log" -lgsmlog="${lgsmlogdir}/${servicename}-script.log" -consolelog="${consolelogdir}/${servicename}-console.log" -alertlog="${lgsmlogdir}/${servicename}-alert.log" -postdetailslog="${lgsmlogdir}/${servicename}-postdetails.log" +gamelog="${gamelogdir}/${selfname}-game.log" +lgsmlog="${lgsmlogdir}/${selfname}-script.log" +consolelog="${consolelogdir}/${selfname}-console.log" +alertlog="${lgsmlogdir}/${selfname}-alert.log" +postdetailslog="${lgsmlogdir}/${selfname}-postdetails.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" +lgsmlogdate="${lgsmlogdir}/${selfname}-script-$(date '+%Y-%m-%d-%H:%M:%S').log" +consolelogdate="${consolelogdir}/${selfname}-console-$(date '+%Y-%m-%d-%H:%M:%S').log" +gamelogdate="${gamelogdir}/${selfname}-game-$(date '+%Y-%m-%d-%H:%M:%S').log" diff --git a/lgsm/config-default/config-lgsm/ut99server/_default.cfg b/lgsm/config-default/config-lgsm/ut99server/_default.cfg index 69e6348ae..3eb9e8043 100644 --- a/lgsm/config-default/config-lgsm/ut99server/_default.cfg +++ b/lgsm/config-default/config-lgsm/ut99server/_default.cfg @@ -135,7 +135,7 @@ glibc="2.1" systemdir="${serverfiles}/System" executabledir="${systemdir}" executable="./ucc-bin" -servercfg="${servicename}.ini" +servercfg="${selfname}.ini" servercfgdefault="Default.ini" servercfgdir="${systemdir}" servercfgfullpath="${servercfgdir}/${servercfg}" @@ -149,11 +149,11 @@ logdir="${rootdir}/log" gamelogdir="${serverfiles}/Logs" lgsmlogdir="${logdir}/script" consolelogdir="${logdir}/console" -lgsmlog="${lgsmlogdir}/${servicename}-script.log" -consolelog="${consolelogdir}/${servicename}-console.log" -alertlog="${lgsmlogdir}/${servicename}-alert.log" -postdetailslog="${lgsmlogdir}/${servicename}-postdetails.log" +lgsmlog="${lgsmlogdir}/${selfname}-script.log" +consolelog="${consolelogdir}/${selfname}-console.log" +alertlog="${lgsmlogdir}/${selfname}-alert.log" +postdetailslog="${lgsmlogdir}/${selfname}-postdetails.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" +lgsmlogdate="${lgsmlogdir}/${selfname}-script-$(date '+%Y-%m-%d-%H:%M:%S').log" +consolelogdate="${consolelogdir}/${selfname}-console-$(date '+%Y-%m-%d-%H:%M:%S').log" diff --git a/lgsm/config-default/config-lgsm/utserver/_default.cfg b/lgsm/config-default/config-lgsm/utserver/_default.cfg index 76e95307a..5227e99bf 100644 --- a/lgsm/config-default/config-lgsm/utserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/utserver/_default.cfg @@ -151,11 +151,11 @@ logdir="${rootdir}/log" gamelogdir="${serverfiles}/Logs" lgsmlogdir="${logdir}/script" consolelogdir="${logdir}/console" -lgsmlog="${lgsmlogdir}/${servicename}-script.log" -consolelog="${consolelogdir}/${servicename}-console.log" -alertlog="${lgsmlogdir}/${servicename}-alert.log" -postdetailslog="${lgsmlogdir}/${servicename}-postdetails.log" +lgsmlog="${lgsmlogdir}/${selfname}-script.log" +consolelog="${consolelogdir}/${selfname}-console.log" +alertlog="${lgsmlogdir}/${selfname}-alert.log" +postdetailslog="${lgsmlogdir}/${selfname}-postdetails.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" +lgsmlogdate="${lgsmlogdir}/${selfname}-script-$(date '+%Y-%m-%d-%H:%M:%S').log" +consolelogdate="${consolelogdir}/${selfname}-console-$(date '+%Y-%m-%d-%H:%M:%S').log" diff --git a/lgsm/config-default/config-lgsm/vsserver/_default.cfg b/lgsm/config-default/config-lgsm/vsserver/_default.cfg index aff533e96..f1f8f7c4d 100644 --- a/lgsm/config-default/config-lgsm/vsserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/vsserver/_default.cfg @@ -150,7 +150,7 @@ glibc="2.3.4" systemdir="${serverfiles}/vs" executabledir="${serverfiles}" executable="./hlds_run" -servercfg="${servicename}.cfg" +servercfg="${selfname}.cfg" servercfgdefault="server.cfg" servercfgdir="${systemdir}" servercfgfullpath="${servercfgdir}/${servercfg}" @@ -163,11 +163,11 @@ logdir="${rootdir}/log" gamelogdir="${systemdir}/logs" lgsmlogdir="${logdir}/script" consolelogdir="${logdir}/console" -lgsmlog="${lgsmlogdir}/${servicename}-script.log" -consolelog="${consolelogdir}/${servicename}-console.log" -alertlog="${lgsmlogdir}/${servicename}-alert.log" -postdetailslog="${lgsmlogdir}/${servicename}-postdetails.log" +lgsmlog="${lgsmlogdir}/${selfname}-script.log" +consolelog="${consolelogdir}/${selfname}-console.log" +alertlog="${lgsmlogdir}/${selfname}-alert.log" +postdetailslog="${lgsmlogdir}/${selfname}-postdetails.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" +lgsmlogdate="${lgsmlogdir}/${selfname}-script-$(date '+%Y-%m-%d-%H:%M:%S').log" +consolelogdate="${consolelogdir}/${selfname}-console-$(date '+%Y-%m-%d-%H:%M:%S').log" diff --git a/lgsm/config-default/config-lgsm/wetserver/_default.cfg b/lgsm/config-default/config-lgsm/wetserver/_default.cfg index 15fb9c33a..3df5c91dc 100644 --- a/lgsm/config-default/config-lgsm/wetserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/wetserver/_default.cfg @@ -131,7 +131,7 @@ glibc="2.2.4" systemdir="${serverfiles}" executabledir="${systemdir}" executable="./etded" -servercfg="${servicename}.cfg" +servercfg="${selfname}.cfg" servercfgdefault="server.cfg" servercfgdir="${systemdir}/etmain" servercfgfullpath="${servercfgdir}/${servercfg}" @@ -144,11 +144,11 @@ logdir="${rootdir}/log" gamelogdir="${serverfiles}/Logs" lgsmlogdir="${logdir}/script" consolelogdir="${logdir}/console" -lgsmlog="${lgsmlogdir}/${servicename}-script.log" -consolelog="${consolelogdir}/${servicename}-console.log" -alertlog="${lgsmlogdir}/${servicename}-alert.log" -postdetailslog="${lgsmlogdir}/${servicename}-postdetails.log" +lgsmlog="${lgsmlogdir}/${selfname}-script.log" +consolelog="${consolelogdir}/${selfname}-console.log" +alertlog="${lgsmlogdir}/${selfname}-alert.log" +postdetailslog="${lgsmlogdir}/${selfname}-postdetails.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" +lgsmlogdate="${lgsmlogdir}/${selfname}-script-$(date '+%Y-%m-%d-%H:%M:%S').log" +consolelogdate="${consolelogdir}/${selfname}-console-$(date '+%Y-%m-%d-%H:%M:%S').log" diff --git a/lgsm/config-default/config-lgsm/wfserver/_default.cfg b/lgsm/config-default/config-lgsm/wfserver/_default.cfg index 416df6bd1..dacb39aaf 100644 --- a/lgsm/config-default/config-lgsm/wfserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/wfserver/_default.cfg @@ -145,7 +145,7 @@ glibc="2.15" systemdir="${serverfiles}/Warfork.app/Contents/Resources" executabledir="${systemdir}" executable="./wf_server.x86_64" -servercfg="${servicename}.cfg" +servercfg="${selfname}.cfg" servercfgdefault="server.cfg" servercfgdir="${systemdir}/basewf" servercfgfullpath="${servercfgdir}/${servercfg}" @@ -158,11 +158,11 @@ logdir="${rootdir}/log" gamelogdir="${serverfiles}/Logs" lgsmlogdir="${logdir}/script" consolelogdir="${logdir}/console" -lgsmlog="${lgsmlogdir}/${servicename}-script.log" -consolelog="${consolelogdir}/${servicename}-console.log" -alertlog="${lgsmlogdir}/${servicename}-alert.log" -postdetailslog="${lgsmlogdir}/${servicename}-postdetails.log" +lgsmlog="${lgsmlogdir}/${selfname}-script.log" +consolelog="${consolelogdir}/${selfname}-console.log" +alertlog="${lgsmlogdir}/${selfname}-alert.log" +postdetailslog="${lgsmlogdir}/${selfname}-postdetails.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" +lgsmlogdate="${lgsmlogdir}/${selfname}-script-$(date '+%Y-%m-%d-%H:%M:%S').log" +consolelogdate="${consolelogdir}/${selfname}-console-$(date '+%Y-%m-%d-%H:%M:%S').log" diff --git a/lgsm/config-default/config-lgsm/wurmserver/_default.cfg b/lgsm/config-default/config-lgsm/wurmserver/_default.cfg index 504b551a3..08a17c81b 100644 --- a/lgsm/config-default/config-lgsm/wurmserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/wurmserver/_default.cfg @@ -141,7 +141,7 @@ glibc="2.14" systemdir="${serverfiles}" executabledir="${systemdir}" executable="xvfb-run ./WurmServerLauncher" -servercfg="${servicename}.cfg" +servercfg="${selfname}.cfg" servercfgdefault="server.cfg" servercfgdir="${systemdir}" servercfgfullpath="${servercfgdir}/${servercfg}" @@ -154,11 +154,11 @@ logdir="${rootdir}/log" gamelogdir="${serverfiles}/Logs" lgsmlogdir="${logdir}/script" consolelogdir="${logdir}/console" -lgsmlog="${lgsmlogdir}/${servicename}-script.log" -consolelog="${consolelogdir}/${servicename}-console.log" -alertlog="${lgsmlogdir}/${servicename}-alert.log" -postdetailslog="${lgsmlogdir}/${servicename}-postdetails.log" +lgsmlog="${lgsmlogdir}/${selfname}-script.log" +consolelog="${consolelogdir}/${selfname}-console.log" +alertlog="${lgsmlogdir}/${selfname}-alert.log" +postdetailslog="${lgsmlogdir}/${selfname}-postdetails.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" +lgsmlogdate="${lgsmlogdir}/${selfname}-script-$(date '+%Y-%m-%d-%H:%M:%S').log" +consolelogdate="${consolelogdir}/${selfname}-console-$(date '+%Y-%m-%d-%H:%M:%S').log" diff --git a/lgsm/config-default/config-lgsm/zmrserver/_default.cfg b/lgsm/config-default/config-lgsm/zmrserver/_default.cfg index b62905205..7de855e46 100644 --- a/lgsm/config-default/config-lgsm/zmrserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/zmrserver/_default.cfg @@ -150,7 +150,7 @@ glibc="2.15" systemdir="${serverfiles}/zombie_master_reborn" executabledir="${serverfiles}" executable="./srcds_run" -servercfg="${servicename}.cfg" +servercfg="${selfname}.cfg" servercfgdefault="server.cfg" servercfgdir="${systemdir}/cfg" servercfgfullpath="${servercfgdir}/${servercfg}" @@ -163,11 +163,11 @@ logdir="${rootdir}/log" gamelogdir="${systemdir}/logs" lgsmlogdir="${logdir}/script" consolelogdir="${logdir}/console" -lgsmlog="${lgsmlogdir}/${servicename}-script.log" -consolelog="${consolelogdir}/${servicename}-console.log" -alertlog="${lgsmlogdir}/${servicename}-alert.log" -postdetailslog="${lgsmlogdir}/${servicename}-postdetails.log" +lgsmlog="${lgsmlogdir}/${selfname}-script.log" +consolelog="${consolelogdir}/${selfname}-console.log" +alertlog="${lgsmlogdir}/${selfname}-alert.log" +postdetailslog="${lgsmlogdir}/${selfname}-postdetails.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" +lgsmlogdate="${lgsmlogdir}/${selfname}-script-$(date '+%Y-%m-%d-%H:%M:%S').log" +consolelogdate="${consolelogdir}/${selfname}-console-$(date '+%Y-%m-%d-%H:%M:%S').log" diff --git a/lgsm/config-default/config-lgsm/zpsserver/_default.cfg b/lgsm/config-default/config-lgsm/zpsserver/_default.cfg index 0d216e319..5f8d76c23 100644 --- a/lgsm/config-default/config-lgsm/zpsserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/zpsserver/_default.cfg @@ -155,7 +155,7 @@ glibc="2.15" systemdir="${serverfiles}/zps" executabledir="${serverfiles}" executable="./srcds_run" -servercfg="${servicename}.cfg" +servercfg="${selfname}.cfg" servercfgdefault="server.cfg" servercfgdir="${systemdir}/cfg" servercfgfullpath="${servercfgdir}/${servercfg}" @@ -168,11 +168,11 @@ logdir="${rootdir}/log" gamelogdir="${systemdir}/logs" lgsmlogdir="${logdir}/script" consolelogdir="${logdir}/console" -lgsmlog="${lgsmlogdir}/${servicename}-script.log" -consolelog="${consolelogdir}/${servicename}-console.log" -alertlog="${lgsmlogdir}/${servicename}-alert.log" -postdetailslog="${lgsmlogdir}/${servicename}-postdetails.log" +lgsmlog="${lgsmlogdir}/${selfname}-script.log" +consolelog="${consolelogdir}/${selfname}-console.log" +alertlog="${lgsmlogdir}/${selfname}-alert.log" +postdetailslog="${lgsmlogdir}/${selfname}-postdetails.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" +lgsmlogdate="${lgsmlogdir}/${selfname}-script-$(date '+%Y-%m-%d-%H:%M:%S').log" +consolelogdate="${consolelogdir}/${selfname}-console-$(date '+%Y-%m-%d-%H:%M:%S').log" diff --git a/lgsm/functions/alert.sh b/lgsm/functions/alert.sh index cb07a6fdd..c72967ed9 100644 --- a/lgsm/functions/alert.sh +++ b/lgsm/functions/alert.sh @@ -27,7 +27,7 @@ fn_alert_log(){ fn_alert_test(){ fn_script_log_info "Sending test alert" - alertsubject="Alert - ${servicename} - Test" + alertsubject="Alert - ${selfname} - Test" alertemoji="🚧" alertsound="1" alerturl="not enabled" @@ -36,25 +36,25 @@ fn_alert_test(){ fn_alert_restart(){ fn_script_log_info "Sending alert: Restarted: ${executable} not running" - alertsubject="Alert - ${servicename} - Restarted" + alertsubject="Alert - ${selfname} - Restarted" alertemoji="🚨" alertsound="2" alerturl="not enabled" - alertbody="${servicename} ${executable} not running" + alertbody="${selfname} ${executable} not running" } fn_alert_restart_query(){ - fn_script_log_info "Sending alert: Restarted: ${servicename}" - alertsubject="Alert - ${servicename} - Restarted" + fn_script_log_info "Sending alert: Restarted: ${selfname}" + alertsubject="Alert - ${selfname} - Restarted" alertemoji="🚨" alertsound="2" alerturl="not enabled" - alertbody="Unable to query: ${servicename}" + alertbody="Unable to query: ${selfname}" } fn_alert_update(){ fn_script_log_info "Sending alert: Updated" - alertsubject="Alert - ${servicename} - Updated" + alertsubject="Alert - ${selfname} - Updated" alertemoji="🎮" alertsound="1" alerturl="not enabled" @@ -63,16 +63,16 @@ fn_alert_update(){ fn_alert_permissions(){ fn_script_log_info "Sending alert: Permissions error" - alertsubject="Alert - ${servicename}: Permissions error" + alertsubject="Alert - ${selfname}: Permissions error" alertemoji="❗" alertsound="2" alerturl="not enabled" - alertbody="${servicename} has permissions issues" + alertbody="${selfname} has permissions issues" } fn_alert_config(){ fn_script_log_info "Sending alert: New _default.cfg" - alertsubject="Alert - ${servicename} - New _default.cfg" + alertsubject="Alert - ${selfname} - New _default.cfg" alertemoji="🎮" alertsound="1" alerturl="not enabled" diff --git a/lgsm/functions/alert_ifttt.sh b/lgsm/functions/alert_ifttt.sh index a99fd995b..76e933d07 100644 --- a/lgsm/functions/alert_ifttt.sh +++ b/lgsm/functions/alert_ifttt.sh @@ -10,7 +10,7 @@ local function_selfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" json=$(cat </dev/null | grep -Ecx "^${servicename}") +status=$(tmux list-sessions -F "#{session_name}" 2>/dev/null | grep -Ecx "^${selfname}") diff --git a/lgsm/functions/command_backup.sh b/lgsm/functions/command_backup.sh index 749b024df..e2293e34a 100644 --- a/lgsm/functions/command_backup.sh +++ b/lgsm/functions/command_backup.sh @@ -37,8 +37,8 @@ fn_backup_check_lockfile(){ # Initialisation. fn_backup_init(){ - # Backup file name with servicename and current date. - backupname="${servicename}-$(date '+%Y-%m-%d-%H%M%S')" + # Backup file name with selfname and current date. + backupname="${selfname}-$(date '+%Y-%m-%d-%H%M%S')" info_distro.sh fn_print_dots "Backup starting" @@ -67,14 +67,14 @@ fn_backup_stop_server(){ # Server is running and stoponbackup=off. elif [ "${stoponbackup}" == "off" ]; then serverstopped="no" - fn_print_warn_nl "${servicename} is currently running" - echo -e " * Although unlikely; creating a backup while ${servicename} is running might corrupt the backup." - fn_script_log_warn "${servicename} is currently running" - fn_script_log_warn "Although unlikely; creating a backup while ${servicename} is running might corrupt the backup" + fn_print_warn_nl "${selfname} is currently running" + echo -e " * Although unlikely; creating a backup while ${selfname} is running might corrupt the backup." + fn_script_log_warn "${selfname} is currently running" + fn_script_log_warn "Although unlikely; creating a backup while ${selfname} is running might corrupt the backup" # Server is running and will be stopped if stoponbackup=on or unset. else - fn_print_warn_nl "${servicename} will be stopped during the backup" - fn_script_log_warn "${servicename} will be stopped during the backup" + fn_print_warn_nl "${selfname} will be stopped during the backup" + fn_script_log_warn "${selfname} will be stopped during the backup" serverstopped="yes" exitbypass=1 command_stop.sh diff --git a/lgsm/functions/command_console.sh b/lgsm/functions/command_console.sh index 1d08b2c92..0a3638ae8 100644 --- a/lgsm/functions/command_console.sh +++ b/lgsm/functions/command_console.sh @@ -26,7 +26,7 @@ check_status.sh if [ "${status}" != "0" ]; then fn_print_ok_nl "Accessing console" fn_script_log_pass "Console accessed" - tmux attach-session -t "${servicename}" + tmux attach-session -t "${selfname}" fn_print_ok_nl "Closing console" fn_script_log_pass "Console closed" else diff --git a/lgsm/functions/command_debug.sh b/lgsm/functions/command_debug.sh index 74fe7f7b1..144f3ec48 100644 --- a/lgsm/functions/command_debug.sh +++ b/lgsm/functions/command_debug.sh @@ -83,7 +83,7 @@ fi echo -e "" 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." +fn_print_warning_nl "If ${selfname} is already running it will be stopped." echo -e "" if ! fn_prompt_yn "Continue?" Y; then return diff --git a/lgsm/functions/command_start.sh b/lgsm/functions/command_start.sh index 93385351d..2871d4520 100644 --- a/lgsm/functions/command_start.sh +++ b/lgsm/functions/command_start.sh @@ -64,7 +64,7 @@ fn_start_tmux(){ # Create lockfile date > "${rootdir}/${lockselfname}" cd "${executabledir}" || exit - tmux new-session -d -x "${sessionwidth}" -y "${sessionheight}" -s "${servicename}" "${executable} ${parms}" 2> "${lgsmlogdir}/.${servicename}-tmux-error.tmp" + tmux new-session -d -x "${sessionwidth}" -y "${sessionheight}" -s "${selfname}" "${executable} ${parms}" 2> "${lgsmlogdir}/.${selfname}-tmux-error.tmp" # Create logfile. touch "${consolelog}" @@ -76,7 +76,7 @@ fn_start_tmux(){ fn_script_log "Tmux version: master (user compiled)" echo -e "Tmux version: master (user compiled)" >> "${consolelog}" if [ "${consolelogging}" == "on" ]||[ -z "${consolelogging}" ]; then - tmux pipe-pane -o -t "${servicename}" "exec cat >> '${consolelog}'" + tmux pipe-pane -o -t "${selfname}" "exec cat >> '${consolelog}'" fi elif [ -n "${tmuxversion}" ]; then # Get the digit version of tmux. @@ -94,7 +94,7 @@ fn_start_tmux(){ Currently installed: $(tmux -V)" > "${consolelog}" # Console logging enable or not set. elif [ "${consolelogging}" == "on" ]||[ -z "${consolelogging}" ]; then - tmux pipe-pane -o -t "${servicename}" "exec cat >> '${consolelog}'" + tmux pipe-pane -o -t "${selfname}" "exec cat >> '${consolelog}'" fi else echo -e "Unable to detect tmux version" >> "${consolelog}" @@ -113,20 +113,20 @@ fn_sleep_time if [ "${status}" == "0" ]; then fn_print_fail_nl "Unable to start ${servername}" fn_script_log_fatal "Unable to start ${servername}" - if [ -s "${lgsmlogdir}/.${servicename}-tmux-error.tmp" ]; then + if [ -s "${lgsmlogdir}/.${selfname}-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 -e "" echo -e "Command" echo -e "=================================" - echo -e "tmux new-session -d -s \"${servicename}\" \"${executable} ${parms}\"" | tee -a "${lgsmlog}" + echo -e "tmux new-session -d -s \"${selfname}\" \"${executable} ${parms}\"" | tee -a "${lgsmlog}" echo -e "" echo -e "Error" echo -e "=================================" - cat "${lgsmlogdir}/.${servicename}-tmux-error.tmp" | tee -a "${lgsmlog}" + cat "${lgsmlogdir}/.${selfname}-tmux-error.tmp" | tee -a "${lgsmlog}" # Detected error https://linuxgsm.com/support - if grep -c "Operation not permitted" "${lgsmlogdir}/.${servicename}-tmux-error.tmp" + if grep -c "Operation not permitted" "${lgsmlogdir}/.${selfname}-tmux-error.tmp" then echo -e "" echo -e "Fix" @@ -159,7 +159,7 @@ fn_sleep_time fn_print_ok "${servername}" fn_script_log_pass "Started ${servername}" fi - rm "${lgsmlogdir}/.${servicename}-tmux-error.tmp" + rm "${lgsmlogdir}/.${selfname}-tmux-error.tmp" echo -en "\n" } diff --git a/lgsm/functions/command_stop.sh b/lgsm/functions/command_stop.sh index c45ed6b4c..97fa12c2c 100644 --- a/lgsm/functions/command_stop.sh +++ b/lgsm/functions/command_stop.sh @@ -14,7 +14,7 @@ fn_stop_graceful_ctrlc(){ fn_print_dots "Graceful: CTRL+c" fn_script_log_info "Graceful: CTRL+c" # Sends quit. - tmux send-keys -t "${servicename}" C-c > /dev/null 2>&1 + tmux send-keys -t "${selfname}" C-c > /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 @@ -43,7 +43,7 @@ fn_stop_graceful_cmd(){ fn_print_dots "Graceful: sending \"${1}\"" fn_script_log_info "Graceful: sending \"${1}\"" # Sends specific stop command. - tmux send -t "${servicename}" "${1}" ENTER > /dev/null 2>&1 + tmux send -t "${selfname}" "${1}" ENTER > /dev/null 2>&1 # Waits up to ${seconds} seconds giving the server time to shutdown gracefully. for ((seconds=1; seconds<=${2}; seconds++)); do check_status.sh @@ -72,7 +72,7 @@ fn_stop_graceful_goldsource(){ 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 + tmux send -t "${selfname}" 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 @@ -207,7 +207,7 @@ fn_stop_tmux(){ fn_print_dots "${servername}" fn_script_log_info "tmux kill-session: ${servername}" # Kill tmux session. - tmux kill-session -t "${servicename}" > /dev/null 2>&1 + tmux kill-session -t "${selfname}" > /dev/null 2>&1 fn_sleep_time check_status.sh if [ "${status}" == "0" ]; then diff --git a/lgsm/functions/core_messages.sh b/lgsm/functions/core_messages.sh index 6a8ed296a..5d2ed7588 100644 --- a/lgsm/functions/core_messages.sh +++ b/lgsm/functions/core_messages.sh @@ -47,9 +47,9 @@ fn_sleep_time(){ fn_script_log(){ if [ -d "${lgsmlogdir}" ]; then if [ -n "${commandname}" ]; then - echo -e "$(date '+%b %d %H:%M:%S.%3N') ${servicename}: ${commandname}: ${1}" >> "${lgsmlog}" + echo -e "$(date '+%b %d %H:%M:%S.%3N') ${selfname}: ${commandname}: ${1}" >> "${lgsmlog}" else - echo -e "$(date '+%b %d %H:%M:%S.%3N') ${servicename}: ${1}" >> "${lgsmlog}" + echo -e "$(date '+%b %d %H:%M:%S.%3N') ${selfname}: ${1}" >> "${lgsmlog}" fi fi } @@ -58,9 +58,9 @@ fn_script_log(){ fn_script_log_pass(){ if [ -d "${lgsmlogdir}" ]; then if [ -n "${commandname}" ]; then - echo -e "$(date '+%b %d %H:%M:%S.%3N') ${servicename}: ${commandname}: PASS: ${1}" >> "${lgsmlog}" + echo -e "$(date '+%b %d %H:%M:%S.%3N') ${selfname}: ${commandname}: PASS: ${1}" >> "${lgsmlog}" else - echo -e "$(date '+%b %d %H:%M:%S.%3N') ${servicename}: PASS: ${1}" >> "${lgsmlog}" + echo -e "$(date '+%b %d %H:%M:%S.%3N') ${selfname}: PASS: ${1}" >> "${lgsmlog}" fi fi exitcode=0 @@ -70,9 +70,9 @@ fn_script_log_pass(){ fn_script_log_fatal(){ if [ -d "${lgsmlogdir}" ]; then if [ -n "${commandname}" ]; then - echo -e "$(date '+%b %d %H:%M:%S.%3N') ${servicename}: ${commandname}: FATAL: ${1}" >> "${lgsmlog}" + echo -e "$(date '+%b %d %H:%M:%S.%3N') ${selfname}: ${commandname}: FATAL: ${1}" >> "${lgsmlog}" else - echo -e "$(date '+%b %d %H:%M:%S.%3N') ${servicename}: FATAL: ${1}" >> "${lgsmlog}" + echo -e "$(date '+%b %d %H:%M:%S.%3N') ${selfname}: FATAL: ${1}" >> "${lgsmlog}" fi fi exitcode=1 @@ -82,9 +82,9 @@ fn_script_log_fatal(){ fn_script_log_error(){ if [ -d "${lgsmlogdir}" ]; then if [ -n "${commandname}" ]; then - echo -e "$(date '+%b %d %H:%M:%S.%3N') ${servicename}: ${commandname}: ERROR: ${1}" >> "${lgsmlog}" + echo -e "$(date '+%b %d %H:%M:%S.%3N') ${selfname}: ${commandname}: ERROR: ${1}" >> "${lgsmlog}" else - echo -e "$(date '+%b %d %H:%M:%S.%3N') ${servicename}: ERROR: ${1}" >> "${lgsmlog}" + echo -e "$(date '+%b %d %H:%M:%S.%3N') ${selfname}: ERROR: ${1}" >> "${lgsmlog}" fi fi exitcode=2 @@ -94,9 +94,9 @@ fn_script_log_error(){ fn_script_log_warn(){ if [ -d "${lgsmlogdir}" ]; then if [ -n "${commandname}" ]; then - echo -e "$(date '+%b %d %H:%M:%S.%3N') ${servicename}: ${commandname}: WARN: ${1}" >> "${lgsmlog}" + echo -e "$(date '+%b %d %H:%M:%S.%3N') ${selfname}: ${commandname}: WARN: ${1}" >> "${lgsmlog}" else - echo -e "$(date '+%b %d %H:%M:%S.%3N') ${servicename}: WARN: ${1}" >> "${lgsmlog}" + echo -e "$(date '+%b %d %H:%M:%S.%3N') ${selfname}: WARN: ${1}" >> "${lgsmlog}" fi fi exitcode=3 @@ -106,9 +106,9 @@ fn_script_log_warn(){ fn_script_log_info(){ if [ -d "${lgsmlogdir}" ]; then if [ -n "${commandname}" ]; then - echo -e "$(date '+%b %d %H:%M:%S.%3N') ${servicename}: ${commandname}: INFO: ${1}" >> "${lgsmlog}" + echo -e "$(date '+%b %d %H:%M:%S.%3N') ${selfname}: ${commandname}: INFO: ${1}" >> "${lgsmlog}" else - echo -e "$(date '+%b %d %H:%M:%S.%3N') ${servicename}: INFO: ${1}" >> "${lgsmlog}" + echo -e "$(date '+%b %d %H:%M:%S.%3N') ${selfname}: INFO: ${1}" >> "${lgsmlog}" fi fi } @@ -119,7 +119,7 @@ fn_script_log_info(){ # [ .... ] fn_print_dots(){ if [ -n "${commandaction}" ]; then - echo -en "${creeol}[ .... ] ${commandaction} ${servicename}: $@" + echo -en "${creeol}[ .... ] ${commandaction} ${selfname}: $@" else echo -en "${creeol}[ .... ] $@" fi @@ -128,7 +128,7 @@ fn_print_dots(){ fn_print_dots_nl(){ if [ -n "${commandaction}" ]; then - echo -e "${creeol}[ .... ] ${commandaction} ${servicename}: $@" + echo -e "${creeol}[ .... ] ${commandaction} ${selfname}: $@" else echo -e "${creeol}[ .... ] $@" fi @@ -139,7 +139,7 @@ fn_print_dots_nl(){ # [ OK ] fn_print_ok(){ if [ -n "${commandaction}" ]; then - echo -en "${creeol}[${green} OK ${default}] ${commandaction} ${servicename}: $@" + echo -en "${creeol}[${green} OK ${default}] ${commandaction} ${selfname}: $@" else echo -en "${creeol}[${green} OK ${default}] $@" fi @@ -148,7 +148,7 @@ fn_print_ok(){ fn_print_ok_nl(){ if [ -n "${commandaction}" ]; then - echo -en "${creeol}[${green} OK ${default}] ${commandaction} ${servicename}: $@" + echo -en "${creeol}[${green} OK ${default}] ${commandaction} ${selfname}: $@" else echo -en "${creeol}[${green} OK ${default}] $@" fi @@ -159,7 +159,7 @@ fn_print_ok_nl(){ # [ FAIL ] fn_print_fail(){ if [ -n "${commandaction}" ]; then - echo -en "${creeol}[${red} FAIL ${default}] ${commandaction} ${servicename}: $@" + echo -en "${creeol}[${red} FAIL ${default}] ${commandaction} ${selfname}: $@" else echo -en "${creeol}[${red} FAIL ${default}] $@" fi @@ -168,7 +168,7 @@ fn_print_fail(){ fn_print_fail_nl(){ if [ -n "${commandaction}" ]; then - echo -en "${creeol}[${red} FAIL ${default}] ${commandaction} ${servicename}: $@" + echo -en "${creeol}[${red} FAIL ${default}] ${commandaction} ${selfname}: $@" else echo -en "${creeol}[${red} FAIL ${default}] $@" fi @@ -179,7 +179,7 @@ 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} ${selfname}: $@" else echo -en "${creeol}[${red}ERROR ${default}] $@" fi @@ -188,7 +188,7 @@ 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} ${selfname}: $@" else echo -en "${creeol}[${red}ERROR ${default}] $@" fi @@ -199,7 +199,7 @@ fn_print_error_nl(){ # [ WARN ] fn_print_warn(){ if [ -n "${commandaction}" ]; then - echo -en "${creeol}[${lightyellow} WARN ${default}] ${commandaction} ${servicename}: $@" + echo -en "${creeol}[${lightyellow} WARN ${default}] ${commandaction} ${selfname}: $@" else echo -en "${creeol}[${lightyellow} WARN ${default}] $@" fi @@ -208,7 +208,7 @@ fn_print_warn(){ fn_print_warn_nl(){ if [ -n "${commandaction}" ]; then - echo -en "${creeol}[${lightyellow} WARN ${default}] ${commandaction} ${servicename}: $@" + echo -en "${creeol}[${lightyellow} WARN ${default}] ${commandaction} ${selfname}: $@" else echo -en "${creeol}[${lightyellow} WARN ${default}] $@" fi @@ -219,7 +219,7 @@ fn_print_warn_nl(){ # [ INFO ] fn_print_info(){ if [ -n "${commandaction}" ]; then - echo -en "${creeol}[${cyan} INFO ${default}] ${commandaction} ${servicename}: $@" + echo -en "${creeol}[${cyan} INFO ${default}] ${commandaction} ${selfname}: $@" else echo -en "${creeol}[${cyan} INFO ${default}] $@" fi @@ -228,7 +228,7 @@ fn_print_info(){ fn_print_info_nl(){ if [ -n "${commandaction}" ]; then - echo -en "${creeol}[${cyan} INFO ${default}] ${commandaction} ${servicename}: $@" + echo -en "${creeol}[${cyan} INFO ${default}] ${commandaction} ${selfname}: $@" else echo -en "${creeol}[${cyan} INFO ${default}] $@" fi diff --git a/lgsm/functions/fix_ut3.sh b/lgsm/functions/fix_ut3.sh index 53bde310f..4da902e95 100644 --- a/lgsm/functions/fix_ut3.sh +++ b/lgsm/functions/fix_ut3.sh @@ -9,7 +9,7 @@ local commandaction="Fix" local function_selfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" fn_parms(){ -parms="server VCTF-Suspense?Game=UTGameContent.UTVehicleCTFGame_Content?bIsDedicated=true?bIsLanMatch=false?bUsesStats=false?bShouldAdvertise=false?PureServer=1?bAllowJoinInProgress=true?ConfigSubDir=${servicename} -port=${port} -queryport=${queryport} -multihome=${ip} -nohomedir -unattended -log=${gamelog}" +parms="server VCTF-Suspense?Game=UTGameContent.UTVehicleCTFGame_Content?bIsDedicated=true?bIsLanMatch=false?bUsesStats=false?bShouldAdvertise=false?PureServer=1?bAllowJoinInProgress=true?ConfigSubDir=${selfname} -port=${port} -queryport=${queryport} -multihome=${ip} -nohomedir -unattended -log=${gamelog}" } fn_print_information "starting ${gamename} server to generate configs." diff --git a/lgsm/functions/info_distro.sh b/lgsm/functions/info_distro.sh index c20801e9b..ced30a522 100644 --- a/lgsm/functions/info_distro.sh +++ b/lgsm/functions/info_distro.sh @@ -9,7 +9,7 @@ local function_selfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" ### Game Server pid if [ "${status}" == "1" ]; then - gameserverpid=$(tmux list-sessions -F "#{session_name} #{pane_pid}"| grep "^${servicename}"|awk '{print $2}') + gameserverpid=$(tmux list-sessions -F "#{session_name} #{pane_pid}"| grep "^${selfname}"|awk '{print $2}') fi ### Distro information diff --git a/lgsm/functions/info_messages.sh b/lgsm/functions/info_messages.sh index 194529d27..78e850469 100644 --- a/lgsm/functions/info_messages.sh +++ b/lgsm/functions/info_messages.sh @@ -413,7 +413,7 @@ fn_info_message_script(){ fn_messages_separator { # Script name - echo -e "${lightblue}Script name:\t${default}${servicename}" + echo -e "${lightblue}Script name:\t${default}${selfname}" # LinuxGSM version if [ -n "${version}" ]; then @@ -577,7 +577,7 @@ fn_info_message_statusbottom(){ fn_info_logs(){ echo -e "" - echo -e "${servicename} Logs" + echo -e "${selfname} Logs" echo -e "=================================" if [ -n "${lgsmlog}" ]; then diff --git a/lgsm/functions/info_parms.sh b/lgsm/functions/info_parms.sh index b0982b0a4..7b5ddcc53 100644 --- a/lgsm/functions/info_parms.sh +++ b/lgsm/functions/info_parms.sh @@ -227,7 +227,7 @@ fn_info_parms_unreal3(){ } fn_info_parms_unturned(){ - servername=${servicename:-"NOT SET"} + servername=${selfname:-"NOT SET"} port=${port:-"0"} queryport=$((port + 1)) } diff --git a/lgsm/functions/install_gslt.sh b/lgsm/functions/install_gslt.sh index 2fb76e35b..8576f458c 100644 --- a/lgsm/functions/install_gslt.sh +++ b/lgsm/functions/install_gslt.sh @@ -30,10 +30,10 @@ if [ -z "${autoinstall}" ]; then echo -e "Enter token below (Can be blank)." echo -n "GSLT TOKEN: " read -r token - if ! grep -q "^gslt=" "${configdirserver}/${servicename}.cfg" > /dev/null 2>&1; then - echo -e "\ngslt=\"${token}\"" >> "${configdirserver}/${servicename}.cfg" + if ! grep -q "^gslt=" "${configdirserver}/${selfname}.cfg" > /dev/null 2>&1; then + echo -e "\ngslt=\"${token}\"" >> "${configdirserver}/${selfname}.cfg" else - sed -i -e "s/gslt=\"[^\"]*\"/gslt=\"${token}\"/g" "${configdirserver}/${servicename}.cfg" + sed -i -e "s/gslt=\"[^\"]*\"/gslt=\"${token}\"/g" "${configdirserver}/${selfname}.cfg" fi fi fi @@ -42,7 +42,7 @@ if [ "${shortname}" == "tu" ]; then echo -e "The GSLT can be changed by editing ${servercfgdir}/${servercfg}." fn_script_log_info "The GSLT can be changed by editing ${servercfgdir}/${servercfg}." else - echo -e "The GSLT can be changed by editing ${configdirserver}/${servicename}.cfg." - fn_script_log_info "The GSLT can be changed by editing ${configdirserver}/${servicename}.cfg." + echo -e "The GSLT can be changed by editing ${configdirserver}/${selfname}.cfg." + fn_script_log_info "The GSLT can be changed by editing ${configdirserver}/${selfname}.cfg." fi echo -e "" diff --git a/linuxgsm.sh b/linuxgsm.sh index d3e762851..ff54a2887 100755 --- a/linuxgsm.sh +++ b/linuxgsm.sh @@ -25,8 +25,7 @@ shortname="core" gameservername="core" rootdir="$(dirname "$(readlink -f "${BASH_SOURCE[0]}")")" selfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" -servicename="${selfname}" -lockselfname=".${servicename}.lock" +lockselfname=".${selfname}.lock" lgsmdir="${rootdir}/lgsm" logdir="${rootdir}/log" lgsmlogdir="${logdir}/lgsm" @@ -357,11 +356,11 @@ 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" "nochmodx" "norun" "noforcedl" "nomd5" - source "${configdirserver}/${servicename}.cfg" + if [ ! -f "${configdirserver}/${selfname}.cfg" ]; then + fn_fetch_config "lgsm/config-default/config-lgsm" "instance-template.cfg" "${configdirserver}" "${selfname}.cfg" "nochmodx" "norun" "noforcedl" "nomd5" + source "${configdirserver}/${selfname}.cfg" else - source "${configdirserver}/${servicename}.cfg" + source "${configdirserver}/${selfname}.cfg" fi # Load the linuxgsm.sh in to tmpdir. If missing download it. diff --git a/tests/tests_fctrserver.sh b/tests/tests_fctrserver.sh index 2496cbcda..3d5bc59d6 100644 --- a/tests/tests_fctrserver.sh +++ b/tests/tests_fctrserver.sh @@ -25,8 +25,7 @@ shortname="fctr" gameservername="fctrserver" rootdir="$(dirname "$(readlink -f "${BASH_SOURCE[0]}")")" selfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" -servicename="${selfname}" -lockselfname=".${servicename}.lock" +lockselfname=".${selfname}.lock" lgsmdir="${rootdir}/lgsm" logdir="${rootdir}/log" lgsmlogdir="${logdir}/lgsm" @@ -48,7 +47,7 @@ if [ ! -v TRAVIS ]; then TRAVIS_BRANCH="develop" TRAVIS_BUILD_DIR="${rootdir}" else - servicename="travis" + selfname="travis" travistest="1" fi @@ -368,11 +367,11 @@ 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" "nochmodx" "norun" "noforcedl" "nomd5" - source "${configdirserver}/${servicename}.cfg" + if [ ! -f "${configdirserver}/${selfname}.cfg" ]; then + fn_fetch_config "lgsm/config-default/config-lgsm" "instance-template.cfg" "${configdirserver}" "${selfname}.cfg" "nochmodx" "norun" "noforcedl" "nomd5" + source "${configdirserver}/${selfname}.cfg" else - source "${configdirserver}/${servicename}.cfg" + source "${configdirserver}/${selfname}.cfg" fi # Load the linuxgsm.sh in to tmpdir. If missing download it. diff --git a/tests/tests_jc2server.sh b/tests/tests_jc2server.sh index 973ab7eb2..2a4300b86 100644 --- a/tests/tests_jc2server.sh +++ b/tests/tests_jc2server.sh @@ -25,8 +25,7 @@ shortname="jc2" gameservername="jc2server" rootdir="$(dirname "$(readlink -f "${BASH_SOURCE[0]}")")" selfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" -servicename="${selfname}" -lockselfname=".${servicename}.lock" +lockselfname=".${selfname}.lock" lgsmdir="${rootdir}/lgsm" logdir="${rootdir}/log" lgsmlogdir="${logdir}/lgsm" @@ -48,7 +47,7 @@ if [ ! -v TRAVIS ]; then TRAVIS_BRANCH="develop" TRAVIS_BUILD_DIR="${rootdir}" else - servicename="travis" + selfname="travis" travistest="1" fi @@ -366,11 +365,11 @@ 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" "nochmodx" "norun" "noforcedl" "nomd5" - source "${configdirserver}/${servicename}.cfg" + if [ ! -f "${configdirserver}/${selfname}.cfg" ]; then + fn_fetch_config "lgsm/config-default/config-lgsm" "instance-template.cfg" "${configdirserver}" "${selfname}.cfg" "nochmodx" "norun" "noforcedl" "nomd5" + source "${configdirserver}/${selfname}.cfg" else - source "${configdirserver}/${servicename}.cfg" + source "${configdirserver}/${selfname}.cfg" fi # Load the linuxgsm.sh in to tmpdir. If missing download it. diff --git a/tests/tests_mcserver.sh b/tests/tests_mcserver.sh index 0ddb2143b..55ae35db3 100644 --- a/tests/tests_mcserver.sh +++ b/tests/tests_mcserver.sh @@ -25,8 +25,7 @@ shortname="mc" gameservername="mcserver" rootdir="$(dirname "$(readlink -f "${BASH_SOURCE[0]}")")" selfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" -servicename="${selfname}" -lockselfname=".${servicename}.lock" +lockselfname=".${selfname}.lock" lgsmdir="${rootdir}/lgsm" logdir="${rootdir}/log" lgsmlogdir="${logdir}/lgsm" @@ -48,7 +47,7 @@ if [ ! -v TRAVIS ]; then TRAVIS_BRANCH="develop" TRAVIS_BUILD_DIR="${rootdir}" else - servicename="travis" + selfname="travis" travistest="1" fi @@ -366,11 +365,11 @@ 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" "nochmodx" "norun" "noforcedl" "nomd5" - source "${configdirserver}/${servicename}.cfg" + if [ ! -f "${configdirserver}/${selfname}.cfg" ]; then + fn_fetch_config "lgsm/config-default/config-lgsm" "instance-template.cfg" "${configdirserver}" "${selfname}.cfg" "nochmodx" "norun" "noforcedl" "nomd5" + source "${configdirserver}/${selfname}.cfg" else - source "${configdirserver}/${servicename}.cfg" + source "${configdirserver}/${selfname}.cfg" fi # Load the linuxgsm.sh in to tmpdir. If missing download it. diff --git a/tests/tests_ts3server.sh b/tests/tests_ts3server.sh index 3df1b4a96..00204eb35 100644 --- a/tests/tests_ts3server.sh +++ b/tests/tests_ts3server.sh @@ -25,8 +25,7 @@ shortname="ts3" gameservername="ts3server" rootdir="$(dirname "$(readlink -f "${BASH_SOURCE[0]}")")" selfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" -servicename="${selfname}" -lockselfname=".${servicename}.lock" +lockselfname=".${selfname}.lock" lgsmdir="${rootdir}/lgsm" logdir="${rootdir}/log" lgsmlogdir="${logdir}/lgsm" @@ -48,7 +47,7 @@ if [ ! -v TRAVIS ]; then TRAVIS_BRANCH="develop" TRAVIS_BUILD_DIR="${rootdir}" else - servicename="travis" + selfname="travis" travistest="1" fi @@ -366,11 +365,11 @@ 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" "nochmodx" "norun" "noforcedl" "nomd5" - source "${configdirserver}/${servicename}.cfg" + if [ ! -f "${configdirserver}/${selfname}.cfg" ]; then + fn_fetch_config "lgsm/config-default/config-lgsm" "instance-template.cfg" "${configdirserver}" "${selfname}.cfg" "nochmodx" "norun" "noforcedl" "nomd5" + source "${configdirserver}/${selfname}.cfg" else - source "${configdirserver}/${servicename}.cfg" + source "${configdirserver}/${selfname}.cfg" fi # Load the linuxgsm.sh in to tmpdir. If missing download it. From 06554cb3142001b2cc1481b9d39d60b6ff2d78be Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Mon, 25 Nov 2019 10:00:54 +0000 Subject: [PATCH 240/534] code de-lint and bringing up to shellcheck standards (#2613) --- lgsm/functions/alert_telegram.sh | 2 +- lgsm/functions/check_deps.sh | 20 +++---- lgsm/functions/core_dl.sh | 1 + lgsm/functions/core_messages.sh | 68 +++++++++++----------- lgsm/functions/info_distro.sh | 2 +- linuxgsm.sh | 16 +++-- tests/tests_defaultcfg/tests_defaultcfg.sh | 26 ++++----- tests/tests_fctrserver.sh | 3 +- tests/tests_jc2server.sh | 2 +- tests/tests_mcserver.sh | 3 +- tests/tests_ts3server.sh | 3 +- 11 files changed, 78 insertions(+), 68 deletions(-) diff --git a/lgsm/functions/alert_telegram.sh b/lgsm/functions/alert_telegram.sh index b07982bca..fd8d2eef8 100644 --- a/lgsm/functions/alert_telegram.sh +++ b/lgsm/functions/alert_telegram.sh @@ -18,7 +18,7 @@ EOF ) fn_print_dots "Sending Telegram alert" -telegramsend=$(${curlpath} -sSL -H "Content-Type: application/json" -X POST -d """${json}""" "https://api.telegram.org/bot${telegramtoken}/sendMessage" ${curlcustomstring} | grep "error_code") +telegramsend=$(${curlpath} -sSL -H "Content-Type: application/json" -X POST -d """${json}""" "https://api.telegram.org/bot${telegramtoken}/sendMessage" "${curlcustomstring}" | grep "error_code") if [ -n "${telegramsend}" ]; then fn_print_fail_nl "Sending Telegram alert: ${telegramsend}" diff --git a/lgsm/functions/check_deps.sh b/lgsm/functions/check_deps.sh index e2e5d5139..7dc0590a3 100644 --- a/lgsm/functions/check_deps.sh +++ b/lgsm/functions/check_deps.sh @@ -27,13 +27,13 @@ fn_install_mono_repo(){ if [ "${distroid}" == "ubuntu" ]; then if [ "${distroversion}" == "18.04" ]; then cmd="sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys 3FA7E0328081BFF6A14DA29AA6A19B38D3D831EF;echo 'deb https://download.mono-project.com/repo/ubuntu stable-bionic main' | sudo tee /etc/apt/sources.list.d/mono-official-stable.list;sudo apt update" - eval ${cmd} + eval "${cmd}" elif [ "${distroversion}" == "16.04" ]; then cmd="sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys 3FA7E0328081BFF6A14DA29AA6A19B38D3D831EF;sudo apt install apt-transport-https;echo 'deb https://download.mono-project.com/repo/ubuntu stable-xenial main' | sudo tee /etc/apt/sources.list.d/mono-official-stable.list;sudo apt update" - eval ${cmd} + eval "${cmd}" elif [ "${distroversion}" == "14.04" ]; then cmd="sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys 3FA7E0328081BFF6A14DA29AA6A19B38D3D831EF;sudo apt install apt-transport-https;echo 'deb https://download.mono-project.com/repo/ubuntu stable-trusty main' | sudo tee /etc/apt/sources.list.d/mono-official-stable.list;sudo apt update" - eval ${cmd} + eval "${cmd}" else fn_print_warn_nl "Installing Mono repository" echo -e "Mono auto install not available for ${distroname}" @@ -44,13 +44,13 @@ fn_install_mono_repo(){ elif [ "${distroid}" == "debian" ]; then if [ "${distroversion}" == "10" ]; then cmd="sudo apt install apt-transport-https dirmngr;sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys 3FA7E0328081BFF6A14DA29AA6A19B38D3D831EF;echo 'deb https://download.mono-project.com/repo/debian stable-buster main' | sudo tee /etc/apt/sources.list.d/mono-official-stable.list;sudo apt update" - eval ${cmd} + eval "${cmd}" elif [ "${distroversion}" == "9" ]; then cmd="sudo apt install apt-transport-https dirmngr;sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys 3FA7E0328081BFF6A14DA29AA6A19B38D3D831EF;echo 'deb https://download.mono-project.com/repo/debian stable-stretch main' | sudo tee /etc/apt/sources.list.d/mono-official-stable.list;sudo apt update" - eval ${cmd} + eval "${cmd}" elif [ "${distroversion}" == "8" ]; then cmd="sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys 3FA7E0328081BFF6A14DA29AA6A19B38D3D831EF;sudo apt install apt-transport-https;echo 'deb https://download.mono-project.com/repo/debian stable-jessie main' | sudo tee /etc/apt/sources.list.d/mono-official-stable.list;sudo apt update" - eval ${cmd} + eval "${cmd}" else echo -e "Mono auto install not available for ${distroname}" echo -e " Follow instructions on mono site to install the latest version of Mono." @@ -60,13 +60,13 @@ fn_install_mono_repo(){ elif [ "${distroid}" == "centos" ]; then if [ "${distroversion}" == "8" ]; then cmd="rpm --import 'https://keyserver.ubuntu.com/pks/lookup?op=get&search=0x3FA7E0328081BFF6A14DA29AA6A19B38D3D831EF';su -c 'curl https://download.mono-project.com/repo/centos8-stable.repo | tee /etc/yum.repos.d/mono-centos8-stable.repo'" - eval ${cmd} + eval "${cmd}" elif [ "${distroversion}" == "7" ]; then cmd="rpm --import 'https://keyserver.ubuntu.com/pks/lookup?op=get&search=0x3FA7E0328081BFF6A14DA29AA6A19B38D3D831EF';su -c 'curl https://download.mono-project.com/repo/centos7-stable.repo | tee /etc/yum.repos.d/mono-centos7-stable.repo'" - eval ${cmd} + eval "${cmd}" elif [ "${distroversion}" == "6" ]; then cmd="rpm --import 'https://keyserver.ubuntu.com/pks/lookup?op=get&search=0x3FA7E0328081BFF6A14DA29AA6A19B38D3D831EF';su -c 'curl https://download.mono-project.com/repo/centos6-stable.repo | tee /etc/yum.repos.d/mono-centos6-stable.repo'" - eval ${cmd} + eval "${cmd}" else echo -e "Mono auto install not available for ${distroname}" echo -e " Follow instructions on mono site to install the latest version of Mono." @@ -75,7 +75,7 @@ fn_install_mono_repo(){ fi elif [ "${distroid}" == "fedora" ]; then cmd="rpm --import 'https://keyserver.ubuntu.com/pks/lookup?op=get&search=0x3FA7E0328081BFF6A14DA29AA6A19B38D3D831EF'; su -c 'curl https://download.mono-project.com/repo/centos7-stable.repo | tee /etc/yum.repos.d/mono-centos7-stable.repo'; dnf update" - eval ${cmd} + eval "${cmd}" else echo -e "Mono auto install not available for ${distroname}" echo -e " Follow instructions on mono site to install the latest version of Mono." diff --git a/lgsm/functions/core_dl.sh b/lgsm/functions/core_dl.sh index 162f66247..5c9988b0f 100644 --- a/lgsm/functions/core_dl.sh +++ b/lgsm/functions/core_dl.sh @@ -168,6 +168,7 @@ fn_fetch_file(){ fn_dl_md5 # Execute file if run is set. if [ "${run}" == "run" ]; then + # shellcheck source=/dev/null source "${local_filedir}/${local_filename}" fi fi diff --git a/lgsm/functions/core_messages.sh b/lgsm/functions/core_messages.sh index 5d2ed7588..252ef182c 100644 --- a/lgsm/functions/core_messages.sh +++ b/lgsm/functions/core_messages.sh @@ -119,18 +119,18 @@ fn_script_log_info(){ # [ .... ] fn_print_dots(){ if [ -n "${commandaction}" ]; then - echo -en "${creeol}[ .... ] ${commandaction} ${selfname}: $@" + echo -en "${creeol}[ .... ] ${commandaction} ${servicename}: $*" else - echo -en "${creeol}[ .... ] $@" + echo -en "${creeol}[ .... ] $*" fi fn_sleep_time } fn_print_dots_nl(){ if [ -n "${commandaction}" ]; then - echo -e "${creeol}[ .... ] ${commandaction} ${selfname}: $@" + echo -e "${creeol}[ .... ] ${commandaction} ${servicename}: $*" else - echo -e "${creeol}[ .... ] $@" + echo -e "${creeol}[ .... ] $*" fi fn_sleep_time echo -en "\n" @@ -139,18 +139,18 @@ fn_print_dots_nl(){ # [ OK ] fn_print_ok(){ if [ -n "${commandaction}" ]; then - echo -en "${creeol}[${green} OK ${default}] ${commandaction} ${selfname}: $@" + echo -en "${creeol}[${green} OK ${default}] ${commandaction} ${servicename}: $*" else - echo -en "${creeol}[${green} OK ${default}] $@" + echo -en "${creeol}[${green} OK ${default}] $*" fi fn_sleep_time } fn_print_ok_nl(){ if [ -n "${commandaction}" ]; then - echo -en "${creeol}[${green} OK ${default}] ${commandaction} ${selfname}: $@" + echo -en "${creeol}[${green} OK ${default}] ${commandaction} ${servicename}: $*" else - echo -en "${creeol}[${green} OK ${default}] $@" + echo -en "${creeol}[${green} OK ${default}] $*" fi fn_sleep_time echo -en "\n" @@ -159,18 +159,18 @@ fn_print_ok_nl(){ # [ FAIL ] fn_print_fail(){ if [ -n "${commandaction}" ]; then - echo -en "${creeol}[${red} FAIL ${default}] ${commandaction} ${selfname}: $@" + echo -en "${creeol}[${red} FAIL ${default}] ${commandaction} ${servicename}: $*" else - echo -en "${creeol}[${red} FAIL ${default}] $@" + echo -en "${creeol}[${red} FAIL ${default}] $*" fi fn_sleep_time } fn_print_fail_nl(){ if [ -n "${commandaction}" ]; then - echo -en "${creeol}[${red} FAIL ${default}] ${commandaction} ${selfname}: $@" + echo -en "${creeol}[${red} FAIL ${default}] ${commandaction} ${servicename}: $*" else - echo -en "${creeol}[${red} FAIL ${default}] $@" + echo -en "${creeol}[${red} FAIL ${default}] $*" fi fn_sleep_time echo -en "\n" @@ -179,18 +179,18 @@ fn_print_fail_nl(){ # [ ERROR ] fn_print_error(){ if [ -n "${commandaction}" ]; then - echo -en "${creeol}[${red}ERROR ${default}] ${commandaction} ${selfname}: $@" + echo -en "${creeol}[${red}ERROR ${default}] ${commandaction} ${servicename}: $*" else - echo -en "${creeol}[${red}ERROR ${default}] $@" + echo -en "${creeol}[${red}ERROR ${default}] $*" fi fn_sleep_time } fn_print_error_nl(){ if [ -n "${commandaction}" ]; then - echo -en "${creeol}[${red}ERROR ${default}] ${commandaction} ${selfname}: $@" + echo -en "${creeol}[${red}ERROR ${default}] ${commandaction} ${servicename}: $*" else - echo -en "${creeol}[${red}ERROR ${default}] $@" + echo -en "${creeol}[${red}ERROR ${default}] $*" fi fn_sleep_time echo -en "\n" @@ -199,18 +199,18 @@ fn_print_error_nl(){ # [ WARN ] fn_print_warn(){ if [ -n "${commandaction}" ]; then - echo -en "${creeol}[${lightyellow} WARN ${default}] ${commandaction} ${selfname}: $@" + echo -en "${creeol}[${lightyellow} WARN ${default}] ${commandaction} ${servicename}: $*" else - echo -en "${creeol}[${lightyellow} WARN ${default}] $@" + echo -en "${creeol}[${lightyellow} WARN ${default}] $*" fi fn_sleep_time } fn_print_warn_nl(){ if [ -n "${commandaction}" ]; then - echo -en "${creeol}[${lightyellow} WARN ${default}] ${commandaction} ${selfname}: $@" + echo -en "${creeol}[${lightyellow} WARN ${default}] ${commandaction} ${servicename}: $*" else - echo -en "${creeol}[${lightyellow} WARN ${default}] $@" + echo -en "${creeol}[${lightyellow} WARN ${default}] $*" fi fn_sleep_time echo -en "\n" @@ -219,18 +219,18 @@ fn_print_warn_nl(){ # [ INFO ] fn_print_info(){ if [ -n "${commandaction}" ]; then - echo -en "${creeol}[${cyan} INFO ${default}] ${commandaction} ${selfname}: $@" + echo -en "${creeol}[${cyan} INFO ${default}] ${commandaction} ${servicename}: $*" else - echo -en "${creeol}[${cyan} INFO ${default}] $@" + echo -en "${creeol}[${cyan} INFO ${default}] $*" fi fn_sleep_time } fn_print_info_nl(){ if [ -n "${commandaction}" ]; then - echo -en "${creeol}[${cyan} INFO ${default}] ${commandaction} ${selfname}: $@" + echo -en "${creeol}[${cyan} INFO ${default}] ${commandaction} ${servicename}: $*" else - echo -en "${creeol}[${cyan} INFO ${default}] $@" + echo -en "${creeol}[${cyan} INFO ${default}] $*" fi fn_sleep_time echo -en "\n" @@ -249,56 +249,56 @@ fn_print_header(){ # Complete! fn_print_complete(){ - echo -en "${green}Complete!${default} $@" + echo -en "${green}Complete!${default} $*" fn_sleep_time } fn_print_complete_nl(){ - echo -e "${green}Complete!${default} $@" + echo -e "${green}Complete!${default} $*" fn_sleep_time } # Failure! fn_print_failure(){ - echo -en "${red}Failure!${default} $@" + echo -en "${red}Failure!${default} $*" fn_sleep_time } fn_print_failure_nl(){ - echo -e "${red}Failure!${default} $@" + echo -e "${red}Failure!${default} $*" fn_sleep_time } # Error! fn_print_error2(){ - echo -en "${red}Error!${default} $@" + echo -en "${red}Error!${default} $*" fn_sleep_time } fn_print_error2_nl(){ - echo -e "${red}Error!${default} $@" + echo -e "${red}Error!${default} $*" fn_sleep_time } # Warning! fn_print_warning(){ - echo -en "${lightyellow}Warning!${default} $@" + echo -en "${lightyellow}Warning!${default} $*" fn_sleep_time } fn_print_warning_nl(){ - echo -e "${lightyellow}Warning!${default} $@" + echo -e "${lightyellow}Warning!${default} $*" fn_sleep_time } # Information! fn_print_information(){ - echo -en "${cyan}Information!${default} $@" + echo -en "${cyan}Information!${default} $*" fn_sleep_time } fn_print_information_nl(){ - echo -e "${cyan}Information!${default} $@" + echo -e "${cyan}Information!${default} $*" fn_sleep_time } diff --git a/lgsm/functions/info_distro.sh b/lgsm/functions/info_distro.sh index ced30a522..1fce6d391 100644 --- a/lgsm/functions/info_distro.sh +++ b/lgsm/functions/info_distro.sh @@ -235,7 +235,7 @@ if [ -z "${extip}" ]; then echo -e "${extip}" > "${tmpdir}/extip.txt" else if [ -f "${tmpdir}/extip.txt" ]; then - extip=$(cat ${tmpdir}/extip.txt) + extip=$(cat "${tmpdir}/extip.txt") else echo -e "x.x.x.x" fi diff --git a/linuxgsm.sh b/linuxgsm.sh index ff54a2887..53c18b831 100755 --- a/linuxgsm.sh +++ b/linuxgsm.sh @@ -102,6 +102,7 @@ fn_bootstrap_fetch_file(){ if [ -f "${local_filedir}/${local_filename}" ]; then # Run file if run is set. if [ "${run}" == "run" ]; then + # shellcheck source=/dev/null source "${local_filedir}/${local_filename}" fi fi @@ -127,7 +128,7 @@ fn_bootstrap_fetch_file_github(){ fn_print_center() { columns="$(tput cols)" - line="$@" + line="$*" printf "%*s\n" $(( (${#line} + columns) / 2)) "${line}" } @@ -347,20 +348,25 @@ else fi fi fi + # shellcheck source=/dev/null 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" "${chmodx}" "nochmodx" "norun" "noforcedl" "nomd5" + # shellcheck source=/dev/null source "${configdirserver}/common.cfg" else + # shellcheck source=/dev/null source "${configdirserver}/common.cfg" fi # Load the instance.cfg config. If missing download it. - if [ ! -f "${configdirserver}/${selfname}.cfg" ]; then - fn_fetch_config "lgsm/config-default/config-lgsm" "instance-template.cfg" "${configdirserver}" "${selfname}.cfg" "nochmodx" "norun" "noforcedl" "nomd5" - source "${configdirserver}/${selfname}.cfg" + if [ ! -f "${configdirserver}/${servicename}.cfg" ]; then + fn_fetch_config "lgsm/config-default/config-lgsm" "instance-template.cfg" "${configdirserver}" "${servicename}.cfg" "nochmodx" "norun" "noforcedl" "nomd5" + # shellcheck source=/dev/null + source "${configdirserver}/${servicename}.cfg" else - source "${configdirserver}/${selfname}.cfg" + # shellcheck source=/dev/null + source "${configdirserver}/${servicename}.cfg" fi # Load the linuxgsm.sh in to tmpdir. If missing download it. diff --git a/tests/tests_defaultcfg/tests_defaultcfg.sh b/tests/tests_defaultcfg/tests_defaultcfg.sh index d905a0393..5e139fb4d 100644 --- a/tests/tests_defaultcfg/tests_defaultcfg.sh +++ b/tests/tests_defaultcfg/tests_defaultcfg.sh @@ -11,7 +11,7 @@ while IFS= read -r -d $'\0' line; do diffoutput=$(diff tests/tests_defaultcfg/defaultcfg_0.txt defaultcfgtemp.txt) if [ "${diffoutput}" ]; then echo "File with errors:" - echo "${line}" + echo "${line}" echo -e "=================================" echo "${diffoutput}" echo "" @@ -27,11 +27,11 @@ echo -e "test checks that vars present in ALL _default.cfg files are correct." echo -e "" find lgsm/config-default/config-lgsm/ ! -name '*template.cfg' -name "*.cfg" -type f -print0 | while IFS= read -r -d $'\0' line; do - grep = ${line} | cut -f1 -d"=" > defaultcfgtemp.txt + grep "=" "${line}" | cut -f1 -d"=" > defaultcfgtemp.txt diffoutput=$(diff tests/tests_defaultcfg/defaultcfg_0.txt defaultcfgtemp.txt | grep '^<') if [ "${diffoutput}" ]; then echo "File with errors:" - echo "${line}" + echo "${line}" echo -e "=================================" echo "${diffoutput}" echo "" @@ -47,14 +47,14 @@ echo -e "test checks that comments in ALL _default.cfg files are correct." echo -e "" find lgsm/config-default/config-lgsm/ ! -name '*template.cfg' -name "*.cfg" -type f -print0 | while IFS= read -r -d $'\0' line; do - grep "#" ${line} > defaultcfgtemp.txt - diffoutput=$(diff tests/tests_defaultcfg/defaultcfg_1.txt defaultcfgtemp.txt | grep '^<') - if [ "${diffoutput}" ]; then - echo "File with errors:" - echo "${line}" - echo -e "=================================" - echo "${diffoutput}" - echo "" - fi - rm defaultcfgtemp.txt + grep "#" "${line}" > defaultcfgtemp.txt + diffoutput=$(diff tests/tests_defaultcfg/defaultcfg_1.txt defaultcfgtemp.txt | grep '^<') + if [ "${diffoutput}" ]; then + echo "File with errors:" + echo "${line}" + echo -e "=================================" + echo "${diffoutput}" + echo "" + fi + rm defaultcfgtemp.txt done diff --git a/tests/tests_fctrserver.sh b/tests/tests_fctrserver.sh index 3d5bc59d6..8bd5e27f2 100644 --- a/tests/tests_fctrserver.sh +++ b/tests/tests_fctrserver.sh @@ -113,6 +113,7 @@ fn_bootstrap_fetch_file(){ if [ -f "${local_filedir}/${local_filename}" ]; then # Run file if run is set. if [ "${run}" == "run" ]; then + # shellcheck source=/dev/null source "${local_filedir}/${local_filename}" fi fi @@ -138,7 +139,7 @@ fn_bootstrap_fetch_file_github(){ fn_print_center() { columns="$(tput cols)" - line="$@" + line="$*" printf "%*s\n" $(( (${#line} + columns) / 2)) "${line}" } diff --git a/tests/tests_jc2server.sh b/tests/tests_jc2server.sh index 2a4300b86..319b6704a 100644 --- a/tests/tests_jc2server.sh +++ b/tests/tests_jc2server.sh @@ -136,7 +136,7 @@ fn_bootstrap_fetch_file_github(){ fn_print_center() { columns="$(tput cols)" - line="$@" + line="$*" printf "%*s\n" $(( (${#line} + columns) / 2)) "${line}" } diff --git a/tests/tests_mcserver.sh b/tests/tests_mcserver.sh index 55ae35db3..1b4aa74a7 100644 --- a/tests/tests_mcserver.sh +++ b/tests/tests_mcserver.sh @@ -111,6 +111,7 @@ fn_bootstrap_fetch_file(){ if [ -f "${local_filedir}/${local_filename}" ]; then # Run file if run is set. if [ "${run}" == "run" ]; then + # shellcheck source=/dev/null source "${local_filedir}/${local_filename}" fi fi @@ -136,7 +137,7 @@ fn_bootstrap_fetch_file_github(){ fn_print_center() { columns="$(tput cols)" - line="$@" + line="$*" printf "%*s\n" $(( (${#line} + columns) / 2)) "${line}" } diff --git a/tests/tests_ts3server.sh b/tests/tests_ts3server.sh index 00204eb35..16e1ddd88 100644 --- a/tests/tests_ts3server.sh +++ b/tests/tests_ts3server.sh @@ -111,6 +111,7 @@ fn_bootstrap_fetch_file(){ if [ -f "${local_filedir}/${local_filename}" ]; then # Run file if run is set. if [ "${run}" == "run" ]; then + # shellcheck source=/dev/null source "${local_filedir}/${local_filename}" fi fi @@ -136,7 +137,7 @@ fn_bootstrap_fetch_file_github(){ fn_print_center() { columns="$(tput cols)" - line="$@" + line="$*" printf "%*s\n" $(( (${#line} + columns) / 2)) "${line}" } From 835fdee88eeab6ce003fe0ee52c6ac644a18c980 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Mon, 25 Nov 2019 23:11:02 +0000 Subject: [PATCH 241/534] feat(core): convert ${curlpath} to using curl and improve code standards (#2616) --- lgsm/functions/alert_discord.sh | 6 +- lgsm/functions/alert_email.sh | 2 +- lgsm/functions/alert_ifttt.sh | 4 +- lgsm/functions/alert_mailgun.sh | 4 +- lgsm/functions/alert_pushbullet.sh | 4 +- lgsm/functions/alert_pushover.sh | 4 +- lgsm/functions/alert_slack.sh | 2 +- lgsm/functions/alert_telegram.sh | 4 +- lgsm/functions/check_config.sh | 2 +- lgsm/functions/check_deps.sh | 8 +- lgsm/functions/check_executable.sh | 2 +- lgsm/functions/check_logs.sh | 2 +- lgsm/functions/check_permissions.sh | 11 +- lgsm/functions/check_root.sh | 2 +- lgsm/functions/check_status.sh | 2 +- lgsm/functions/check_system_dir.sh | 2 +- lgsm/functions/check_system_requirements.sh | 2 +- lgsm/functions/command_backup.sh | 2 +- lgsm/functions/command_console.sh | 2 +- lgsm/functions/command_debug.sh | 2 +- lgsm/functions/command_details.sh | 2 +- lgsm/functions/command_dev_debug.sh | 2 +- lgsm/functions/command_dev_detect_deps.sh | 6 +- lgsm/functions/command_dev_detect_glibc.sh | 4 +- lgsm/functions/command_dev_detect_ldd.sh | 4 +- lgsm/functions/command_dev_query_raw.sh | 2 +- lgsm/functions/command_donate.sh | 2 +- lgsm/functions/command_fastdl.sh | 18 +- lgsm/functions/command_install.sh | 2 +- .../command_install_resources_mta.sh | 2 +- lgsm/functions/command_mods_install.sh | 2 +- lgsm/functions/command_mods_remove.sh | 4 +- lgsm/functions/command_mods_update.sh | 10 +- lgsm/functions/command_monitor.sh | 4 +- lgsm/functions/command_postdetails.sh | 8 +- lgsm/functions/command_restart.sh | 2 +- lgsm/functions/command_start.sh | 8 +- lgsm/functions/command_stop.sh | 4 +- 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 | 2 +- lgsm/functions/command_update_linuxgsm.sh | 17 +- lgsm/functions/command_validate.sh | 4 +- lgsm/functions/command_wipe.sh | 2 +- lgsm/functions/compress_unreal2_maps.sh | 2 +- lgsm/functions/compress_ut99_maps.sh | 2 +- lgsm/functions/core_dl.sh | 14 +- lgsm/functions/core_functions.sh | 250 +++++++++--------- lgsm/functions/core_getopt.sh | 10 +- lgsm/functions/fix_arma3.sh | 2 +- lgsm/functions/fix_csgo.sh | 2 +- lgsm/functions/fix_dst.sh | 2 +- lgsm/functions/fix_kf.sh | 2 +- lgsm/functions/fix_kf2.sh | 2 +- lgsm/functions/fix_mta.sh | 2 +- lgsm/functions/fix_ro.sh | 2 +- lgsm/functions/fix_sfc.sh | 2 +- lgsm/functions/fix_ss3.sh | 2 +- lgsm/functions/fix_steamcmd.sh | 2 +- lgsm/functions/fix_terraria.sh | 2 +- lgsm/functions/fix_tf2.sh | 2 +- lgsm/functions/fix_ts3.sh | 2 +- lgsm/functions/fix_ut.sh | 2 +- lgsm/functions/fix_ut2k4.sh | 2 +- lgsm/functions/fix_ut3.sh | 2 +- lgsm/functions/fix_zmr.sh | 2 +- lgsm/functions/info_config.sh | 16 +- lgsm/functions/info_distro.sh | 34 +-- lgsm/functions/info_parms.sh | 2 +- lgsm/functions/info_stats.sh | 8 +- lgsm/functions/install_complete.sh | 2 +- lgsm/functions/install_config.sh | 2 +- lgsm/functions/install_dst_token.sh | 2 +- lgsm/functions/install_gslt.sh | 2 +- lgsm/functions/install_header.sh | 2 +- lgsm/functions/install_logs.sh | 14 +- 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 | 4 +- lgsm/functions/install_squad_license.sh | 2 +- lgsm/functions/install_stats.sh | 2 +- lgsm/functions/install_ts3db.sh | 2 +- lgsm/functions/install_ut2k4_key.sh | 2 +- lgsm/functions/logs.sh | 2 +- lgsm/functions/mods_core.sh | 26 +- lgsm/functions/mods_list.sh | 16 +- lgsm/functions/query_gamedig.sh | 2 +- lgsm/functions/update_factorio.sh | 4 +- lgsm/functions/update_minecraft.sh | 8 +- lgsm/functions/update_mta.sh | 8 +- lgsm/functions/update_mumble.sh | 4 +- lgsm/functions/update_steamcmd.sh | 4 +- lgsm/functions/update_ts3.sh | 14 +- linuxgsm.sh | 19 +- tests/tests_fctrserver.sh | 19 +- tests/tests_jc2server.sh | 18 +- tests/tests_mcserver.sh | 19 +- tests/tests_ts3server.sh | 21 +- 100 files changed, 382 insertions(+), 402 deletions(-) diff --git a/lgsm/functions/alert_discord.sh b/lgsm/functions/alert_discord.sh index 0d4b22123..b404b8e0f 100644 --- a/lgsm/functions/alert_discord.sh +++ b/lgsm/functions/alert_discord.sh @@ -10,8 +10,8 @@ if ! command -v jq > /dev/null; then fn_script_log_fatal "Sending Discord alert: jq is missing." fi -escaped_servername="$(echo -n "${servername}" | jq -sRr "@json")" -escaped_alertbody="$(echo -n "${alertbody}" | jq -sRr "@json")" +escaped_servername=$(echo -n "${servername}" | jq -sRr "@json") +escaped_alertbody=$(echo -n "${alertbody}" | jq -sRr "@json") json=$(cat </dev/null)" ]&&[ "$(mono --version 2>&1 | grep -Po '(?<=version )\d')" -ge 5 ]; then + if [ -n "$(command -v mono 2>/dev/null)" ]&&[ "$(mono --version 2>&1 | grep -Po '(?<=version )\d')" -ge 5 ]; then # Mono >= 5.0.0 already installed. depstatus=0 else @@ -337,7 +337,7 @@ fn_deps_build_debian(){ # LinuxGSM requirements. array_deps_required=( curl wget ca-certificates file bsdmainutils util-linux python3 tar bzip2 gzip unzip binutils bc jq ) - if [ "$(command -v tmux 2>/dev/null)" ]; then + if [ -n "$(command -v tmux 2>/dev/null)" ]; then tmuxcheck=1 # Added for users compiling tmux from source to bypass check. else array_deps_required+=( tmux ) @@ -402,7 +402,7 @@ fn_deps_build_debian(){ array_deps_required+=( libstdc++5:i386 ) # Project Zomboid elif [ "${shortname}" == "pz" ]; then - if [ -n "$(java -version 2>&1 | grep "version")" ]; then + if java -version 2>&1 | grep "version"; then # Added for users using Oracle JRE to bypass the check. javacheck=1 array_deps_required+=( rng-tools ) @@ -461,7 +461,7 @@ fn_deps_build_redhat(){ fi # All servers except ts3 require tmux. - if [ "$(command -v tmux 2>/dev/null)" ]; then + if [ -n "$(command -v tmux 2>/dev/null)" ]; then # Added for users compiling tmux from source to bypass check. tmuxcheck=1 else diff --git a/lgsm/functions/check_executable.sh b/lgsm/functions/check_executable.sh index 918043555..88a93ffc5 100644 --- a/lgsm/functions/check_executable.sh +++ b/lgsm/functions/check_executable.sh @@ -5,7 +5,7 @@ # Description: Checks if server executable exists. local commandname="CHECK" -local function_selfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" +local function_selfname=$(basename "$(readlink -f "${BASH_SOURCE[0]}")") # Check if executable exists if [ ! -f "${executabledir}/${execname}" ]; then diff --git a/lgsm/functions/check_logs.sh b/lgsm/functions/check_logs.sh index 61a8f2833..4da3cd057 100644 --- a/lgsm/functions/check_logs.sh +++ b/lgsm/functions/check_logs.sh @@ -5,7 +5,7 @@ # Description: Checks if log files exist. local commandname="CHECK" -local function_selfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" +local function_selfname=$(basename "$(readlink -f "${BASH_SOURCE[0]}")") fn_check_logs(){ fn_print_dots "Checking for log files" diff --git a/lgsm/functions/check_permissions.sh b/lgsm/functions/check_permissions.sh index cb0cc9d5c..4d1e81413 100644 --- a/lgsm/functions/check_permissions.sh +++ b/lgsm/functions/check_permissions.sh @@ -74,7 +74,7 @@ fn_check_permissions(){ # Check rootdir permissions. if [ -n "${rootdir}" ]; then # Get permission numbers on directory under the form 775. - rootdirperm="$(stat -c %a "${rootdir}")" + rootdirperm=$(stat -c %a "${rootdir}") # Grab the first and second digit for user and group permission. userrootdirperm="${rootdirperm:0:1}" grouprootdirperm="${rootdirperm:1:1}" @@ -94,10 +94,10 @@ fn_check_permissions(){ fi # Check if executable is executable and attempt to fix it. # First get executable name. - execname="$(basename "${executable}")" + execname=$(basename "${executable}") if [ -f "${executabledir}/${execname}" ]; then # Get permission numbers on file under the form 775. - execperm="$(stat -c %a "${executabledir}/${execname}")" + execperm=$(stat -c %a "${executabledir}/${execname}") # Grab the first and second digit for user and group permission. userexecperm="${execperm:0:1}" groupexecperm="${execperm:1:1}" @@ -118,7 +118,7 @@ fn_check_permissions(){ chmod u+x,g+x "${executabledir}/${execname}" # Second check to see if it's been successfully applied. # Get permission numbers on file under the form 775. - execperm="$(stat -c %a "${executabledir}/${execname}")" + execperm=$(stat -c %a "${executabledir}/${execname}") # Grab the first and second digit for user and group permission. userexecperm="${execperm:0:1}" groupexecperm="${execperm:1:1}" @@ -181,8 +181,7 @@ fn_sys_perm_fix_manually_msg(){ # Attempt to fix /sys related permission errors if sudo is available, exits otherwise. fn_sys_perm_errors_fix(){ - sudo -n true > /dev/null 2>&1 - if [ $? -eq 0 ]; then + if sudo -n true > /dev/null 2>&1; then fn_print_dots "Automatically fixing /sys permissions" fn_script_log_info "Automatically fixing /sys permissions." if [ "${sysdirpermerror}" == "1" ]; then diff --git a/lgsm/functions/check_root.sh b/lgsm/functions/check_root.sh index b5d20cf24..4200c5dc0 100644 --- a/lgsm/functions/check_root.sh +++ b/lgsm/functions/check_root.sh @@ -5,7 +5,7 @@ # Description: Checks if the user tried to run the script as root. local commandname="CHECK" -local function_selfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" +local function_selfname=$(basename "$(readlink -f "${BASH_SOURCE[0]}")") if [ "$(whoami)" = "root" ]; then if [ "${function_selfname}" != "command_install.sh" ]; then diff --git a/lgsm/functions/check_status.sh b/lgsm/functions/check_status.sh index eb4e60a08..d814197be 100644 --- a/lgsm/functions/check_status.sh +++ b/lgsm/functions/check_status.sh @@ -6,6 +6,6 @@ # Description: Checks the process status of the server. Either online or offline. local commandname="CHECK" -local function_selfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" +local function_selfname=$(basename "$(readlink -f "${BASH_SOURCE[0]}")") status=$(tmux list-sessions -F "#{session_name}" 2>/dev/null | grep -Ecx "^${selfname}") diff --git a/lgsm/functions/check_system_dir.sh b/lgsm/functions/check_system_dir.sh index fd9ff3644..d11b30a20 100644 --- a/lgsm/functions/check_system_dir.sh +++ b/lgsm/functions/check_system_dir.sh @@ -5,7 +5,7 @@ # Description: Checks if systemdir/serverfiles is accessible. local commandname="CHECK" -local function_selfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" +local function_selfname=$(basename "$(readlink -f "${BASH_SOURCE[0]}")") if [ "${function_selfname}" != "command_validate.sh" ]; then checkdir="${serverfiles}" diff --git a/lgsm/functions/check_system_requirements.sh b/lgsm/functions/check_system_requirements.sh index 1493f6b85..3c0345219 100644 --- a/lgsm/functions/check_system_requirements.sh +++ b/lgsm/functions/check_system_requirements.sh @@ -6,7 +6,7 @@ # Description: Checks RAM requirements local commandname="CHECK" -local function_selfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" +local function_selfname=$(basename "$(readlink -f "${BASH_SOURCE[0]}")") info_distro.sh diff --git a/lgsm/functions/command_backup.sh b/lgsm/functions/command_backup.sh index e2293e34a..a7e3e337a 100644 --- a/lgsm/functions/command_backup.sh +++ b/lgsm/functions/command_backup.sh @@ -7,7 +7,7 @@ local commandname="BACKUP" local commandaction="Backup" -local function_selfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" +local function_selfname=$(basename "$(readlink -f "${BASH_SOURCE[0]}")") check.sh diff --git a/lgsm/functions/command_console.sh b/lgsm/functions/command_console.sh index 0a3638ae8..4dfa2a4a3 100644 --- a/lgsm/functions/command_console.sh +++ b/lgsm/functions/command_console.sh @@ -6,7 +6,7 @@ local commandname="CONSOLE" local commandaction="Console" -local function_selfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" +local function_selfname=$(basename "$(readlink -f "${BASH_SOURCE[0]}")") check.sh fn_print_header diff --git a/lgsm/functions/command_debug.sh b/lgsm/functions/command_debug.sh index 144f3ec48..dda8b1170 100644 --- a/lgsm/functions/command_debug.sh +++ b/lgsm/functions/command_debug.sh @@ -6,7 +6,7 @@ local commandname="DEBUG" local commandaction="Debug" -local function_selfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" +local function_selfname=$(basename "$(readlink -f "${BASH_SOURCE[0]}")") # Trap to remove lockfile on quit. fn_lockfile_trap(){ diff --git a/lgsm/functions/command_details.sh b/lgsm/functions/command_details.sh index 43fc463d8..889febbd4 100644 --- a/lgsm/functions/command_details.sh +++ b/lgsm/functions/command_details.sh @@ -7,7 +7,7 @@ local commandname="DETAILS" local commandaction="Details" -local function_selfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" +local function_selfname=$(basename "$(readlink -f "${BASH_SOURCE[0]}")") # Run checks and gathers details to display. check.sh diff --git a/lgsm/functions/command_dev_debug.sh b/lgsm/functions/command_dev_debug.sh index c8c57e995..0cb3e48b5 100644 --- a/lgsm/functions/command_dev_debug.sh +++ b/lgsm/functions/command_dev_debug.sh @@ -6,7 +6,7 @@ local commandname="DEV-DEBUG" local commandaction="Dev-Debug" -local function_selfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" +local function_selfname=$(basename "$(readlink -f "${BASH_SOURCE[0]}")") if [ -f "${rootdir}/.dev-debug" ]; then rm "${rootdir}/.dev-debug" diff --git a/lgsm/functions/command_dev_detect_deps.sh b/lgsm/functions/command_dev_detect_deps.sh index c3b29872e..252b37022 100644 --- a/lgsm/functions/command_dev_detect_deps.sh +++ b/lgsm/functions/command_dev_detect_deps.sh @@ -6,16 +6,16 @@ local commandname="DETECT-DEPS" local commandaction="Detect-Deps" -local function_selfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" +local function_selfname=$(basename "$(readlink -f "${BASH_SOURCE[0]}")") echo -e "=================================" echo -e "Dependencies Checker" echo -e "=================================" echo -e "Checking directory: " echo -e "${serverfiles}" -if [ "$(command -v eu-readelf 2>/dev/null)" ]; then +if [ -n "$(command -v eu-readelf 2>/dev/null)" ]; then readelf=eu-readelf -elif [ "$(command -v readelf 2>/dev/null)" ]; then +elif [ -n "$(command -v readelf 2>/dev/null)" ]; then readelf=readelf else echo -e "readelf/eu-readelf not installed" diff --git a/lgsm/functions/command_dev_detect_glibc.sh b/lgsm/functions/command_dev_detect_glibc.sh index e7b3b5e2d..e86fb05db 100644 --- a/lgsm/functions/command_dev_detect_glibc.sh +++ b/lgsm/functions/command_dev_detect_glibc.sh @@ -7,7 +7,7 @@ local commandname="DETECT-GLIBC" local commandaction="Detect-Glibc" -local function_selfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" +local function_selfname=$(basename "$(readlink -f "${BASH_SOURCE[0]}")") echo -e "=================================" echo -e "glibc Requirements Checker" @@ -20,7 +20,7 @@ if [ -z "$(command -v objdump)" ]; then fi if [ -z "${serverfiles}" ]; then - dir="$(dirname "$(readlink -f "${BASH_SOURCE[0]}")")" + dir=$(dirname "$(readlink -f "${BASH_SOURCE[0]}")") fi if [ -d "${serverfiles}" ]; then diff --git a/lgsm/functions/command_dev_detect_ldd.sh b/lgsm/functions/command_dev_detect_ldd.sh index 394f60db2..3df4b0a58 100644 --- a/lgsm/functions/command_dev_detect_ldd.sh +++ b/lgsm/functions/command_dev_detect_ldd.sh @@ -7,14 +7,14 @@ local commandname="DETECT-LDD" local commandaction="Detect-LDD" -local function_selfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" +local function_selfname=$(basename "$(readlink -f "${BASH_SOURCE[0]}")") echo -e "=================================" echo -e "Shared Object dependencies Checker" echo -e "=================================" if [ -z "${serverfiles}" ]; then - dir="$(dirname "$(readlink -f "${BASH_SOURCE[0]}")")" + dir=$(dirname "$(readlink -f "${BASH_SOURCE[0]}")") fi if [ -d "${serverfiles}" ]; then diff --git a/lgsm/functions/command_dev_query_raw.sh b/lgsm/functions/command_dev_query_raw.sh index 483952015..a0efd2690 100644 --- a/lgsm/functions/command_dev_query_raw.sh +++ b/lgsm/functions/command_dev_query_raw.sh @@ -6,7 +6,7 @@ local commandname="QUERY-RAW" local commandaction="Query Raw" -local function_selfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" +local function_selfname=$(basename "$(readlink -f "${BASH_SOURCE[0]}")") echo -e "" echo -e "Query Port - Raw Output" diff --git a/lgsm/functions/command_donate.sh b/lgsm/functions/command_donate.sh index 54c46511d..15c94fdf3 100644 --- a/lgsm/functions/command_donate.sh +++ b/lgsm/functions/command_donate.sh @@ -6,7 +6,7 @@ local commandname="CONSOLE" local commandaction="Console" -local function_selfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" +local function_selfname=$(basename "$(readlink -f "${BASH_SOURCE[0]}")") fn_print_ascii_logo echo -e "${lightyellow}Support LinuxGSM${default}" diff --git a/lgsm/functions/command_fastdl.sh b/lgsm/functions/command_fastdl.sh index 0eab220e2..81ad55e8a 100644 --- a/lgsm/functions/command_fastdl.sh +++ b/lgsm/functions/command_fastdl.sh @@ -7,7 +7,7 @@ local commandname="FASTDL" local commandaction="FastDL" -local function_selfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" +local function_selfname=$(basename "$(readlink -f "${BASH_SOURCE[0]}")") check.sh @@ -135,7 +135,7 @@ fn_human_readable_file_size(){ local factor="${item%:*}" local abbrev="${item#*:}" if [[ "${bytes}" -ge "${factor}" ]]; then - local size="$(bc -l <<< "${bytes} / ${factor}")" + local size=$(bc -l <<< "${bytes} / ${factor}") printf "%.*f %s\n" "${precision}" "${size}" "${abbrev}" break fi @@ -161,9 +161,9 @@ fn_fastdl_preview(){ while read -r ext; do ((fileswc++)) tput rc; tput el - printf "gathering ${allowed_extention} : ${fileswc}..." + echo -e "gathering ${allowed_extention} : ${fileswc}..." echo -e "${ext}" >> "${tmpdir}/fastdl_files_to_compress.txt" - done < <(find . -type f -iname ${allowed_extention}) + done < <(find . -type f -iname "${allowed_extention}") if [ ${fileswc} != 0 ]; then fn_print_ok_eol_nl else @@ -192,7 +192,7 @@ fn_fastdl_preview(){ while read -r ext; do ((fileswc++)) tput rc; tput el - printf "gathering ${directory} ${allowed_extention} : ${fileswc}..." + echo -e "gathering ${directory} ${allowed_extention} : ${fileswc}..." echo -e "${ext}" >> "${tmpdir}/fastdl_files_to_compress.txt" done < <(find "${systemdir}/${directory}" -type f -iname ${allowed_extention}) tput rc; tput el @@ -305,9 +305,9 @@ fn_fastdl_gmod(){ 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 + while read -r dufile; do filesize=$(du -b "${dufile}" | awk '{ print $1 }') - filesizetotal=$(( ${filesizetotal} + ${filesize} )) + filesizetotal=$((filesizetotal + filesize)) done <"${tmpdir}/fastdl_files_to_compress.txt" fi } @@ -334,7 +334,7 @@ fn_fastdl_source(){ while read -r fastdlfile; do ((fileswc++)) tput rc; tput el - printf "copying ${directory} ${allowed_extention} : ${fileswc}..." + echo -e "copying ${directory} ${allowed_extention} : ${fileswc}..." fn_sleep_time # get relative path of file in the dir tmprelfilepath="${fastdlfile#"${systemdir}/"}" @@ -352,7 +352,7 @@ fn_fastdl_source(){ else fn_script_log_pass "Copying ${fastdlfile} > ${fastdldir}/${copytodir}" fi - done < <(find "${systemdir}/${directory}" -type f -iname ${allowed_extention}) + done < <(find "${systemdir}/${directory}" -type f -iname "${allowed_extention}") if [ ${fileswc} != 0 ]; then fn_print_ok_eol_nl fi diff --git a/lgsm/functions/command_install.sh b/lgsm/functions/command_install.sh index b44ec60dc..4955aab86 100644 --- a/lgsm/functions/command_install.sh +++ b/lgsm/functions/command_install.sh @@ -7,7 +7,7 @@ local commandname="INSTALL" local commandaction="Install" -local function_selfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" +local function_selfname=$(basename "$(readlink -f "${BASH_SOURCE[0]}")") check.sh if [ "$(whoami)" = "root" ]; then diff --git a/lgsm/functions/command_install_resources_mta.sh b/lgsm/functions/command_install_resources_mta.sh index 9a3934de3..c4a555800 100644 --- a/lgsm/functions/command_install_resources_mta.sh +++ b/lgsm/functions/command_install_resources_mta.sh @@ -6,7 +6,7 @@ local commandname="DEFAULT_RESOURCES" local commandaction="Default Resources" -local function_selfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" +local function_selfname=$(basename "$(readlink -f "${BASH_SOURCE[0]}")") fn_install_resources(){ echo -e "" diff --git a/lgsm/functions/command_mods_install.sh b/lgsm/functions/command_mods_install.sh index 58b0dc747..dd6b51de6 100644 --- a/lgsm/functions/command_mods_install.sh +++ b/lgsm/functions/command_mods_install.sh @@ -7,7 +7,7 @@ local commandname="MODS" local commandaction="addons/mods" -local function_selfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" +local function_selfname=$(basename "$(readlink -f "${BASH_SOURCE[0]}")") check.sh mods_core.sh diff --git a/lgsm/functions/command_mods_remove.sh b/lgsm/functions/command_mods_remove.sh index 08d18892f..13516410d 100644 --- a/lgsm/functions/command_mods_remove.sh +++ b/lgsm/functions/command_mods_remove.sh @@ -7,7 +7,7 @@ local commandname="MODS" local commandaction="Mods Remove" -local function_selfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" +local function_selfname=$(basename "$(readlink -f "${BASH_SOURCE[0]}")") check.sh mods_core.sh @@ -64,7 +64,7 @@ modfileline="1" tput sc while [ "${modfileline}" -le "${modsfilelistsize}" ]; do # Current line defines current file to remove. - currentfileremove="$(sed "${modfileline}q;d" "${modsdir}/${modcommand}-files.txt")" + currentfileremove=$(sed "${modfileline}q;d" "${modsdir}/${modcommand}-files.txt") # If file or directory exists, then remove it. if [ -f "${modinstalldir}/${currentfileremove}" ]||[ -d "${modinstalldir}/${currentfileremove}" ]; then diff --git a/lgsm/functions/command_mods_update.sh b/lgsm/functions/command_mods_update.sh index 5faa2f313..ba5708d96 100644 --- a/lgsm/functions/command_mods_update.sh +++ b/lgsm/functions/command_mods_update.sh @@ -7,7 +7,7 @@ local commandname="MODS" local commandaction="Mods Update" -local function_selfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" +local function_selfname=$(basename "$(readlink -f "${BASH_SOURCE[0]}")") check.sh mods_core.sh @@ -19,11 +19,11 @@ fn_remove_cfg_files(){ echo -e "the following files/directories will be preserved:" fn_sleep_time # Count how many files there are to remove. - filestopreserve="$(echo -e "${modkeepfiles}" | awk -F ';' '{ print NF }')" + filestopreserve=$(echo -e "${modkeepfiles}" | awk -F ';' '{ print NF }') # Test all subvalues of "modkeepfiles" using the ";" separator. - for ((preservefilesindex=1; preservefilesindex < ${filestopreserve}; preservefilesindex++)); do + for ((preservefilesindex=1; preservefilesindex < filestopreserve; preservefilesindex++)); do # Put the current file we are looking for into a variable. - filetopreserve="$(echo -e "${modkeepfiles}" | awk -F ';' -v x=${preservefilesindex} '{ print $x }' )" + filetopreserve=$(echo -e "${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}/${filetopreserve}" ]||[ -d "${extractdir}/${filetopreserve}" ]; then @@ -71,7 +71,7 @@ done # Reset line value. installedmodsline="1" while [ "${installedmodsline}" -le "${installedmodscount}" ]; do - currentmod="$(sed "${installedmodsline}q;d" "${modsinstalledlistfullpath}")" + 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". diff --git a/lgsm/functions/command_monitor.sh b/lgsm/functions/command_monitor.sh index cfb8e39a7..610bc5531 100644 --- a/lgsm/functions/command_monitor.sh +++ b/lgsm/functions/command_monitor.sh @@ -8,7 +8,7 @@ local commandname="MONITOR" local commandaction="Monitor" -local function_selfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" +local function_selfname=$(basename "$(readlink -f "${BASH_SOURCE[0]}")") fn_monitor_check_lockfile(){ # Monitor does not run it lockfile is not found. @@ -211,7 +211,7 @@ fn_monitor_loop(){ do # Will check if gamedig is installed and bypass if not. if [ "${querymethod}" == "gamedig" ]; then - if [ "$(command -v gamedig 2>/dev/null)" ]&&[ "$(command -v jq 2>/dev/null)" ]; then + if [ -n "$(command -v gamedig 2>/dev/null)" ]&&[ "$(command -v jq 2>/dev/null)" ]; then if [ -z "${monitorpass}" ]; then fn_monitor_query fi diff --git a/lgsm/functions/command_postdetails.sh b/lgsm/functions/command_postdetails.sh index 02e57fed0..0657a2622 100644 --- a/lgsm/functions/command_postdetails.sh +++ b/lgsm/functions/command_postdetails.sh @@ -7,7 +7,7 @@ local commandname="POSTDETAILS" local commandaction="Postdetails" -local function_selfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" +local function_selfname=$(basename "$(readlink -f "${BASH_SOURCE[0]}")") # Set posttarget to the appropriately-defined post destination. @@ -80,12 +80,12 @@ fi if [ "${posttarget}" == "http://pastebin.com" ] ; then fn_print_dots "Posting details to pastbin.com for ${postexpire}" # grab the return from 'value' from an initial visit to pastebin. - csrftoken=$(${curlpath} -s "${posttarget}" | + csrftoken=$(curl -s "${posttarget}" | sed -n 's/^.*input type="hidden" name="csrf_token_post" value="\(.*\)".*$/\1/p') # # Use the csrftoken to then post the content. # - link=$(${curlpath} -s "${posttarget}/post.php" -D - -F "submit_hidden=submit_hidden" \ + link=$(curl -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" \ @@ -101,7 +101,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=$(${curlpath} -H "HTTP_X_REQUESTED_WITH:XMLHttpRequest" -s -d "$(<${postdetailslog})" "${posttarget}/documents" | cut -d\" -f4) + link=$(curl -H "HTTP_X_REQUESTED_WITH:XMLHttpRequest" -s -d "$(<${postdetailslog})" "${posttarget}/documents" | cut -d\" -f4) fn_print_ok_nl "Posting details to hastebin.com for ${postexpire}" pdurl="${posttarget}/${link}" echo -e "Please share the following url for support: ${pdurl}" diff --git a/lgsm/functions/command_restart.sh b/lgsm/functions/command_restart.sh index 080b3d8e7..76b65b8e5 100644 --- a/lgsm/functions/command_restart.sh +++ b/lgsm/functions/command_restart.sh @@ -6,7 +6,7 @@ local commandname="RESTART" local commandaction="Restarting" -local function_selfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" +local function_selfname=$(basename "$(readlink -f "${BASH_SOURCE[0]}")") info_config.sh exitbypass=1 diff --git a/lgsm/functions/command_start.sh b/lgsm/functions/command_start.sh index 2871d4520..4c9fd20c4 100644 --- a/lgsm/functions/command_start.sh +++ b/lgsm/functions/command_start.sh @@ -7,7 +7,7 @@ local commandname="START" local commandaction="Starting" -local function_selfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" +local function_selfname=$(basename "$(readlink -f "${BASH_SOURCE[0]}")") fn_start_teamspeak3(){ if [ ! -e "${servercfgfullpath}" ]; then @@ -70,7 +70,7 @@ fn_start_tmux(){ touch "${consolelog}" # Get tmux version. - tmuxversion="$(tmux -V | sed "s/tmux //" | sed -n '1 p')" + tmuxversion=$(tmux -V | sed "s/tmux //" | sed -n '1 p') # Tmux compiled from source will return "master", therefore ignore it. if [ "$(tmux -V | sed "s/tmux //" | sed -n '1 p')" == "master" ]; then fn_script_log "Tmux version: master (user compiled)" @@ -80,7 +80,7 @@ fn_start_tmux(){ fi elif [ -n "${tmuxversion}" ]; then # Get the digit version of tmux. - tmuxversion="$(tmux -V | sed "s/tmux //" | sed -n '1 p' | tr -cd '[:digit:]')" + tmuxversion=$(tmux -V | sed "s/tmux //" | sed -n '1 p' | tr -cd '[:digit:]') # tmux pipe-pane not supported in tmux versions < 1.6. if [ "${tmuxversion}" -lt "16" ]; then echo -e "Console logging disabled: Tmux => 1.6 required @@ -131,7 +131,7 @@ fn_sleep_time echo -e "" echo -e "Fix" echo -e "=================================" - if [ ! "$(grep "tty:" /etc/group|grep "$(whoami)")" ]; then + if ! grep "tty:" /etc/group | grep "$(whoami)"; then echo -e "$(whoami) is not part of the tty group." fn_script_log_info "$(whoami) is not part of the tty group." group=$(grep tty /etc/group) diff --git a/lgsm/functions/command_stop.sh b/lgsm/functions/command_stop.sh index 97fa12c2c..f166fa552 100644 --- a/lgsm/functions/command_stop.sh +++ b/lgsm/functions/command_stop.sh @@ -7,7 +7,7 @@ local commandname="STOP" local commandaction="Stopping" -local function_selfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" +local function_selfname=$(basename "$(readlink -f "${BASH_SOURCE[0]}")") # Attempts graceful shutdown by sending 'CTRL+c'. fn_stop_graceful_ctrlc(){ @@ -126,7 +126,7 @@ fn_stop_graceful_sdtd(){ fn_script_log_info "Graceful: telnet" if [ "${telnetenabled}" == "false" ]; then fn_print_info_nl "Graceful: telnet: DISABLED: Enable in ${servercfg}" - elif [ "$(command -v expect 2>/dev/null)" ]; then + elif [ -n "$(command -v expect 2>/dev/null)" ]; 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}:${telnetport}" diff --git a/lgsm/functions/command_test_alert.sh b/lgsm/functions/command_test_alert.sh index 82882f9ee..368a9ab21 100644 --- a/lgsm/functions/command_test_alert.sh +++ b/lgsm/functions/command_test_alert.sh @@ -6,7 +6,7 @@ local commandname="ALERT" local commandaction="Alert" -local function_selfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" +local function_selfname=$(basename "$(readlink -f "${BASH_SOURCE[0]}")") fn_print_dots "${servername}" check.sh diff --git a/lgsm/functions/command_ts3_server_pass.sh b/lgsm/functions/command_ts3_server_pass.sh index eee38832a..4bb3421dc 100644 --- a/lgsm/functions/command_ts3_server_pass.sh +++ b/lgsm/functions/command_ts3_server_pass.sh @@ -7,7 +7,7 @@ local commandname="PASSWORD-CHANGE" local commandaction="Password Change" -local function_selfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" +local function_selfname=$(basename "$(readlink -f "${BASH_SOURCE[0]}")") fn_serveradmin_password_prompt(){ fn_print_header diff --git a/lgsm/functions/command_update.sh b/lgsm/functions/command_update.sh index c3c289d97..3c6db2dad 100644 --- a/lgsm/functions/command_update.sh +++ b/lgsm/functions/command_update.sh @@ -6,7 +6,7 @@ local commandname="UPDATE" local commandaction="Update" -local function_selfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" +local function_selfname=$(basename "$(readlink -f "${BASH_SOURCE[0]}")") fn_print_dots "" check.sh diff --git a/lgsm/functions/command_update_functions.sh b/lgsm/functions/command_update_functions.sh index 4825be027..e325b781a 100644 --- a/lgsm/functions/command_update_functions.sh +++ b/lgsm/functions/command_update_functions.sh @@ -6,7 +6,7 @@ # Legacy Command command_update_linuxgsm.sh(){ -functionfile="${FUNCNAME}" +functionfile="${FUNCNAME[0]}" fn_fetch_function } diff --git a/lgsm/functions/command_update_linuxgsm.sh b/lgsm/functions/command_update_linuxgsm.sh index 95d6e8052..6816a1443 100644 --- a/lgsm/functions/command_update_linuxgsm.sh +++ b/lgsm/functions/command_update_linuxgsm.sh @@ -6,7 +6,7 @@ local commandname="UPDATE LINUXGSM" local commandaction="Update LinuxGSM" -local function_selfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" +local function_selfname=$(basename "$(readlink -f "${BASH_SOURCE[0]}")") fn_print_dots "Updating LinuxGSM" check.sh @@ -16,7 +16,7 @@ echo -en "\n" if [ -z "${legacymode}" ]; then # Check and update _default.cfg. echo -en " checking config _default.cfg...\c" - 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")) + config_file_diff=$(diff "${configdirdefault}/config-lgsm/${gameservername}/_default.cfg" <(curl -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" @@ -30,7 +30,7 @@ if [ -z "${legacymode}" ]; then fi echo -en " 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 "${tmpdir}/linuxgsm.sh" <(curl -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" @@ -56,11 +56,13 @@ if [ -z "${legacymode}" ]; then echo -e " Backup: ${backupdir}/script/${selfname}-$(date +"%m_%d_%Y_%M").bak" fi echo -en " fetching ${selfname}...\c" + exitcode=$? cp "${tmpdir}/linuxgsm.sh" "${rootdir}/${selfname}" sed -i "s/shortname=\"core\"/shortname=\"${shortname}\"/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 + + if [ "${exitcode}" == "0" ]; then fn_print_fail_eol_nl core_exit.sh else @@ -79,15 +81,14 @@ if [ -n "${functionsdir}" ]; then do echo -en " 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}") + get_function_file=$(curl --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}")) + function_file_diff=$(diff "${functionsdir}/${functionfile}" <(curl --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 -en " removing unknown function ${functionfile}...\c" fn_script_log_fatal "removing unknown function ${functionfile}" - rm -f "${functionfile}" - if [ $? -ne 0 ]; then + if ! rm -f "${functionfile}"; then fn_print_fail_eol_nl core_exit.sh else diff --git a/lgsm/functions/command_validate.sh b/lgsm/functions/command_validate.sh index 02ba07271..1c39ed67e 100644 --- a/lgsm/functions/command_validate.sh +++ b/lgsm/functions/command_validate.sh @@ -6,7 +6,7 @@ local commandname="VALIDATE" local commandaction="Validate" -local function_selfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" +local function_selfname=$(basename "$(readlink -f "${BASH_SOURCE[0]}")") fn_validation(){ fn_print_info "Validating files: SteamCMD" @@ -18,7 +18,7 @@ fn_validation(){ cd "${steamcmddir}" || exit # Detects if unbuffer command is available for 32 bit distributions only. info_distro.sh - if [ "$(command -v stdbuf)" ]&&[ "${arch}" != "x86_64" ]; then + if [ -n "$(command -v stdbuf)" ]&&[ "${arch}" != "x86_64" ]; then unbuffer="stdbuf -i0 -o0 -e0" fi diff --git a/lgsm/functions/command_wipe.sh b/lgsm/functions/command_wipe.sh index 423491013..0598699fb 100644 --- a/lgsm/functions/command_wipe.sh +++ b/lgsm/functions/command_wipe.sh @@ -7,7 +7,7 @@ local commandname="WIPE" local commandaction="Wipe" -local function_selfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" +local function_selfname=$(basename "$(readlink -f "${BASH_SOURCE[0]}")") check.sh fn_print_header diff --git a/lgsm/functions/compress_unreal2_maps.sh b/lgsm/functions/compress_unreal2_maps.sh index 3af14d47d..3940e8066 100644 --- a/lgsm/functions/compress_unreal2_maps.sh +++ b/lgsm/functions/compress_unreal2_maps.sh @@ -5,7 +5,7 @@ # Description: Compresses unreal maps. local commandaction="Unreal Map Compressor" -local function_selfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" +local function_selfname=$(basename "$(readlink -f "${BASH_SOURCE[0]}")") check.sh fn_print_header diff --git a/lgsm/functions/compress_ut99_maps.sh b/lgsm/functions/compress_ut99_maps.sh index 8e2a18f35..100740acb 100644 --- a/lgsm/functions/compress_ut99_maps.sh +++ b/lgsm/functions/compress_ut99_maps.sh @@ -5,7 +5,7 @@ # Description: Compresses unreal maps. local commandaction="Unreal Map Compressor" -local function_selfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" +local function_selfname=$(basename "$(readlink -f "${BASH_SOURCE[0]}")") check.sh fn_print_header diff --git a/lgsm/functions/core_dl.sh b/lgsm/functions/core_dl.sh index 5c9988b0f..a01accdf8 100644 --- a/lgsm/functions/core_dl.sh +++ b/lgsm/functions/core_dl.sh @@ -19,7 +19,7 @@ local commandname="DOWNLOAD" local commandaction="Download" -local function_selfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" +local function_selfname=$(basename "$(readlink -f "${BASH_SOURCE[0]}")") # Emptys contents of the LinuxGSM tmpdir. fn_clear_tmp(){ @@ -133,11 +133,11 @@ fn_fetch_file(){ echo -en "downloading ${local_filename}..." fn_sleep_time echo -en "\033[1K" - curlcmd=$(${curlpath} --progress-bar --fail -L -o "${local_filedir}/${local_filename}" "${remote_fileurl}") + curlcmd=$(curl --progress-bar --fail -L -o "${local_filedir}/${local_filename}" "${remote_fileurl}") echo -en "downloading ${local_filename}..." else echo -en " fetching ${local_filename}...\c" - curlcmd=$(${curlpath} -s --fail -L -o "${local_filedir}/${local_filename}" "${remote_fileurl}" 2>&1) + curlcmd=$(curl -s --fail -L -o "${local_filedir}/${local_filename}" "${remote_fileurl}" 2>&1) fi local exitcode=$? if [ ${exitcode} -ne 0 ]; then @@ -168,7 +168,7 @@ fn_fetch_file(){ fn_dl_md5 # Execute file if run is set. if [ "${run}" == "run" ]; then - # shellcheck source=/dev/null + # shellcheck source=/dev/null source "${local_filedir}/${local_filename}" fi fi @@ -255,10 +255,8 @@ fn_update_function(){ fn_fetch_file "${remote_fileurl}" "${local_filedir}" "${local_filename}" "${chmodx}" "${run}" "${forcedl}" "${md5}" } -# Defines curl path. -curlpath=$(command -v curl 2>/dev/null) - -if [ "$(basename "${curlpath}")" != "curl" ]; then +# Check that curl is installed +if [ -z "$(command -v curl 2>/dev/null)" ]; then echo -e "[ FAIL ] Curl is not installed" exit 1 fi diff --git a/lgsm/functions/core_functions.sh b/lgsm/functions/core_functions.sh index fcec931a8..b88f29dd5 100644 --- a/lgsm/functions/core_functions.sh +++ b/lgsm/functions/core_functions.sh @@ -8,7 +8,7 @@ # Core core_dl.sh(){ -functionfile="${FUNCNAME}" +functionfile="${FUNCNAME[0]}" 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 @@ -17,7 +17,7 @@ fi } core_messages.sh(){ -functionfile="${FUNCNAME}" +functionfile="${FUNCNAME[0]}" 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 @@ -26,7 +26,7 @@ fi } core_legacy.sh(){ -functionfile="${FUNCNAME}" +functionfile="${FUNCNAME[0]}" 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 @@ -35,538 +35,538 @@ fi } core_exit.sh(){ -functionfile="${FUNCNAME}" +functionfile="${FUNCNAME[0]}" fn_fetch_function } core_getopt.sh(){ -functionfile="${FUNCNAME}" +functionfile="${FUNCNAME[0]}" fn_fetch_function } core_trap.sh(){ -functionfile="${FUNCNAME}" +functionfile="${FUNCNAME[0]}" fn_fetch_function } # Commands command_backup.sh(){ -functionfile="${FUNCNAME}" +functionfile="${FUNCNAME[0]}" fn_fetch_function } command_console.sh(){ -functionfile="${FUNCNAME}" +functionfile="${FUNCNAME[0]}" fn_fetch_function } command_debug.sh(){ -functionfile="${FUNCNAME}" +functionfile="${FUNCNAME[0]}" fn_fetch_function } command_details.sh(){ -functionfile="${FUNCNAME}" +functionfile="${FUNCNAME[0]}" fn_fetch_function } command_donate.sh(){ -functionfile="${FUNCNAME}" +functionfile="${FUNCNAME[0]}" fn_fetch_function } command_postdetails.sh(){ -functionfile="${FUNCNAME}" +functionfile="${FUNCNAME[0]}" fn_fetch_function } command_test_alert.sh(){ -functionfile="${FUNCNAME}" +functionfile="${FUNCNAME[0]}" fn_fetch_function } command_monitor.sh(){ -functionfile="${FUNCNAME}" +functionfile="${FUNCNAME[0]}" fn_fetch_function } command_start.sh(){ -functionfile="${FUNCNAME}" +functionfile="${FUNCNAME[0]}" fn_fetch_function } command_stop.sh(){ -functionfile="${FUNCNAME}" +functionfile="${FUNCNAME[0]}" fn_fetch_function } command_validate.sh(){ -functionfile="${FUNCNAME}" +functionfile="${FUNCNAME[0]}" fn_fetch_function } command_install.sh(){ -functionfile="${FUNCNAME}" +functionfile="${FUNCNAME[0]}" fn_fetch_function } command_install_resources_mta.sh(){ -functionfile="${FUNCNAME}" +functionfile="${FUNCNAME[0]}" fn_fetch_function } install_squad_license.sh(){ -functionfile="${FUNCNAME}" +functionfile="${FUNCNAME[0]}" fn_fetch_function } command_mods_install.sh(){ -functionfile="${FUNCNAME}" +functionfile="${FUNCNAME[0]}" fn_fetch_function } command_mods_update.sh(){ -functionfile="${FUNCNAME}" +functionfile="${FUNCNAME[0]}" fn_fetch_function } command_mods_remove.sh(){ -functionfile="${FUNCNAME}" +functionfile="${FUNCNAME[0]}" fn_fetch_function } command_fastdl.sh(){ -functionfile="${FUNCNAME}" +functionfile="${FUNCNAME[0]}" fn_fetch_function } command_ts3_server_pass.sh(){ -functionfile="${FUNCNAME}" +functionfile="${FUNCNAME[0]}" fn_fetch_function } command_restart.sh(){ -functionfile="${FUNCNAME}" +functionfile="${FUNCNAME[0]}" fn_fetch_function } command_wipe.sh(){ -functionfile="${FUNCNAME}" +functionfile="${FUNCNAME[0]}" fn_fetch_function } # Checks check.sh(){ -functionfile="${FUNCNAME}" +functionfile="${FUNCNAME[0]}" fn_fetch_function } check_config.sh(){ -functionfile="${FUNCNAME}" +functionfile="${FUNCNAME[0]}" fn_fetch_function } check_deps.sh(){ -functionfile="${FUNCNAME}" +functionfile="${FUNCNAME[0]}" fn_fetch_function } check_executable.sh(){ -functionfile="${FUNCNAME}" +functionfile="${FUNCNAME[0]}" fn_fetch_function } check_glibc.sh(){ -functionfile="${FUNCNAME}" +functionfile="${FUNCNAME[0]}" fn_fetch_function } check_ip.sh(){ -functionfile="${FUNCNAME}" +functionfile="${FUNCNAME[0]}" fn_fetch_function } check_logs.sh(){ -functionfile="${FUNCNAME}" +functionfile="${FUNCNAME[0]}" fn_fetch_function } check_permissions.sh(){ -functionfile="${FUNCNAME}" +functionfile="${FUNCNAME[0]}" fn_fetch_function } check_root.sh(){ -functionfile="${FUNCNAME}" +functionfile="${FUNCNAME[0]}" fn_fetch_function } check_status.sh(){ -functionfile="${FUNCNAME}" +functionfile="${FUNCNAME[0]}" fn_fetch_function } check_steamcmd.sh(){ -functionfile="${FUNCNAME}" +functionfile="${FUNCNAME[0]}" fn_fetch_function } check_system_dir.sh(){ -functionfile="${FUNCNAME}" +functionfile="${FUNCNAME[0]}" fn_fetch_function } check_system_requirements.sh(){ -functionfile="${FUNCNAME}" +functionfile="${FUNCNAME[0]}" fn_fetch_function } check_tmuxception.sh(){ -functionfile="${FUNCNAME}" +functionfile="${FUNCNAME[0]}" fn_fetch_function } # Compress compress_unreal2_maps.sh(){ -functionfile="${FUNCNAME}" +functionfile="${FUNCNAME[0]}" fn_fetch_function } compress_ut99_maps.sh(){ -functionfile="${FUNCNAME}" +functionfile="${FUNCNAME[0]}" fn_fetch_function } # Mods mods_list.sh(){ -functionfile="${FUNCNAME}" +functionfile="${FUNCNAME[0]}" fn_fetch_function } mods_core.sh(){ -functionfile="${FUNCNAME}" +functionfile="${FUNCNAME[0]}" fn_fetch_function } # Dev command_dev_clear_functions.sh(){ -functionfile="${FUNCNAME}" +functionfile="${FUNCNAME[0]}" fn_fetch_function } command_dev_debug.sh(){ -functionfile="${FUNCNAME}" +functionfile="${FUNCNAME[0]}" fn_fetch_function } command_dev_detect_deps.sh(){ -functionfile="${FUNCNAME}" +functionfile="${FUNCNAME[0]}" fn_fetch_function } command_dev_detect_glibc.sh(){ -functionfile="${FUNCNAME}" +functionfile="${FUNCNAME[0]}" fn_fetch_function } command_dev_detect_ldd.sh(){ -functionfile="${FUNCNAME}" +functionfile="${FUNCNAME[0]}" fn_fetch_function } command_dev_query_raw.sh(){ -functionfile="${FUNCNAME}" +functionfile="${FUNCNAME[0]}" fn_fetch_function } # Fix fix.sh(){ -functionfile="${FUNCNAME}" +functionfile="${FUNCNAME[0]}" fn_fetch_function } fix_ark.sh(){ -functionfile="${FUNCNAME}" +functionfile="${FUNCNAME[0]}" fn_fetch_function } fix_arma3.sh(){ -functionfile="${FUNCNAME}" +functionfile="${FUNCNAME[0]}" fn_fetch_function } fix_csgo.sh(){ -functionfile="${FUNCNAME}" +functionfile="${FUNCNAME[0]}" fn_fetch_function } fix_dst.sh(){ -functionfile="${FUNCNAME}" +functionfile="${FUNCNAME[0]}" fn_fetch_function } fix_ges.sh(){ -functionfile="${FUNCNAME}" +functionfile="${FUNCNAME[0]}" fn_fetch_function } fix_ins.sh(){ -functionfile="${FUNCNAME}" +functionfile="${FUNCNAME[0]}" fn_fetch_function } fix_kf.sh(){ -functionfile="${FUNCNAME}" +functionfile="${FUNCNAME[0]}" fn_fetch_function } fix_kf2.sh(){ -functionfile="${FUNCNAME}" +functionfile="${FUNCNAME[0]}" fn_fetch_function } fix_mta.sh(){ -functionfile="${FUNCNAME}" +functionfile="${FUNCNAME[0]}" fn_fetch_function } fix_ro.sh(){ -functionfile="${FUNCNAME}" +functionfile="${FUNCNAME[0]}" fn_fetch_function } fix_rust.sh(){ -functionfile="${FUNCNAME}" +functionfile="${FUNCNAME[0]}" fn_fetch_function } fix_rw.sh(){ -functionfile="${FUNCNAME}" +functionfile="${FUNCNAME[0]}" fn_fetch_function } fix_sfc.sh(){ -functionfile="${FUNCNAME}" +functionfile="${FUNCNAME[0]}" fn_fetch_function } fix_steamcmd.sh(){ -functionfile="${FUNCNAME}" +functionfile="${FUNCNAME[0]}" fn_fetch_function } fix_terraria.sh(){ -functionfile="${FUNCNAME}" +functionfile="${FUNCNAME[0]}" fn_fetch_function } fix_tf2.sh(){ -functionfile="${FUNCNAME}" +functionfile="${FUNCNAME[0]}" fn_fetch_function } fix_ut3.sh(){ -functionfile="${FUNCNAME}" +functionfile="${FUNCNAME[0]}" fn_fetch_function } fix_rust.sh(){ -functionfile="${FUNCNAME}" +functionfile="${FUNCNAME[0]}" fn_fetch_function } fix_sdtd.sh(){ -functionfile="${FUNCNAME}" +functionfile="${FUNCNAME[0]}" fn_fetch_function } fix_sof2.sh(){ -functionfile="${FUNCNAME}" +functionfile="${FUNCNAME[0]}" fn_fetch_function } fix_ss3.sh(){ -functionfile="${FUNCNAME}" +functionfile="${FUNCNAME[0]}" fn_fetch_function } fix_ts3.sh(){ -functionfile="${FUNCNAME}" +functionfile="${FUNCNAME[0]}" fn_fetch_function } fix_ut2k4.sh(){ -functionfile="${FUNCNAME}" +functionfile="${FUNCNAME[0]}" fn_fetch_function } fix_ut.sh(){ -functionfile="${FUNCNAME}" +functionfile="${FUNCNAME[0]}" fn_fetch_function } fix_unt.sh(){ -functionfile="${FUNCNAME}" +functionfile="${FUNCNAME[0]}" fn_fetch_function } fix_wurm.sh(){ -functionfile="${FUNCNAME}" +functionfile="${FUNCNAME[0]}" fn_fetch_function } fix_zmr.sh(){ -functionfile="${FUNCNAME}" +functionfile="${FUNCNAME[0]}" fn_fetch_function } # Info info_stats.sh(){ -functionfile="${FUNCNAME}" +functionfile="${FUNCNAME[0]}" fn_fetch_function } info_config.sh(){ -functionfile="${FUNCNAME}" +functionfile="${FUNCNAME[0]}" fn_fetch_function } info_distro.sh(){ -functionfile="${FUNCNAME}" +functionfile="${FUNCNAME[0]}" fn_fetch_function } info_gamedig.sh(){ -functionfile="${FUNCNAME}" +functionfile="${FUNCNAME[0]}" fn_fetch_function } info_messages.sh(){ -functionfile="${FUNCNAME}" +functionfile="${FUNCNAME[0]}" fn_fetch_function } info_parms.sh(){ -functionfile="${FUNCNAME}" +functionfile="${FUNCNAME[0]}" fn_fetch_function } # Alert alert.sh(){ -functionfile="${FUNCNAME}" +functionfile="${FUNCNAME[0]}" fn_fetch_function } alert_discord.sh(){ -functionfile="${FUNCNAME}" +functionfile="${FUNCNAME[0]}" fn_fetch_function } alert_email.sh(){ -functionfile="${FUNCNAME}" +functionfile="${FUNCNAME[0]}" fn_fetch_function } alert_ifttt.sh(){ -functionfile="${FUNCNAME}" +functionfile="${FUNCNAME[0]}" fn_fetch_function } alert_mailgun.sh(){ -functionfile="${FUNCNAME}" +functionfile="${FUNCNAME[0]}" fn_fetch_function } alert_pushbullet.sh(){ -functionfile="${FUNCNAME}" +functionfile="${FUNCNAME[0]}" fn_fetch_function } alert_pushover.sh(){ -functionfile="${FUNCNAME}" +functionfile="${FUNCNAME[0]}" fn_fetch_function } alert_telegram.sh(){ -functionfile="${FUNCNAME}" +functionfile="${FUNCNAME[0]}" fn_fetch_function } alert_slack.sh(){ -functionfile="${FUNCNAME}" +functionfile="${FUNCNAME[0]}" fn_fetch_function } # Logs logs.sh(){ -functionfile="${FUNCNAME}" +functionfile="${FUNCNAME[0]}" fn_fetch_function } # Query query_gamedig.sh(){ -functionfile="${FUNCNAME}" +functionfile="${FUNCNAME[0]}" fn_fetch_function } # Update command_update_functions.sh(){ -functionfile="${FUNCNAME}" +functionfile="${FUNCNAME[0]}" fn_fetch_function } command_update_linuxgsm.sh(){ -functionfile="${FUNCNAME}" +functionfile="${FUNCNAME[0]}" fn_fetch_function } command_update.sh(){ -functionfile="${FUNCNAME}" +functionfile="${FUNCNAME[0]}" fn_fetch_function } update_ts3.sh(){ -functionfile="${FUNCNAME}" +functionfile="${FUNCNAME[0]}" fn_fetch_function } update_minecraft.sh(){ -functionfile="${FUNCNAME}" +functionfile="${FUNCNAME[0]}" fn_fetch_function } update_mumble.sh(){ -functionfile="${FUNCNAME}" +functionfile="${FUNCNAME[0]}" fn_fetch_function } update_mta.sh(){ -functionfile="${FUNCNAME}" +functionfile="${FUNCNAME[0]}" fn_fetch_function } update_factorio.sh(){ -functionfile="${FUNCNAME}" +functionfile="${FUNCNAME[0]}" fn_fetch_function } update_steamcmd.sh(){ -functionfile="${FUNCNAME}" +functionfile="${FUNCNAME[0]}" fn_fetch_function } fn_update_functions.sh(){ -functionfile="${FUNCNAME}" +functionfile="${FUNCNAME[0]}" fn_fetch_function } @@ -580,96 +580,96 @@ command_install.sh } install_complete.sh(){ -functionfile="${FUNCNAME}" +functionfile="${FUNCNAME[0]}" fn_fetch_function } install_config.sh(){ -functionfile="${FUNCNAME}" +functionfile="${FUNCNAME[0]}" fn_fetch_function } install_factorio_save.sh(){ -functionfile="${FUNCNAME}" +functionfile="${FUNCNAME[0]}" fn_fetch_function } install_dst_token.sh(){ -functionfile="${FUNCNAME}" +functionfile="${FUNCNAME[0]}" fn_fetch_function } install_eula.sh(){ -functionfile="${FUNCNAME}" +functionfile="${FUNCNAME[0]}" fn_fetch_function } install_gsquery.sh(){ -functionfile="${FUNCNAME}" +functionfile="${FUNCNAME[0]}" fn_fetch_function } install_gslt.sh(){ -functionfile="${FUNCNAME}" +functionfile="${FUNCNAME[0]}" fn_fetch_function } install_header.sh(){ -functionfile="${FUNCNAME}" +functionfile="${FUNCNAME[0]}" fn_fetch_function } install_logs.sh(){ -functionfile="${FUNCNAME}" +functionfile="${FUNCNAME[0]}" fn_fetch_function } install_retry.sh(){ -functionfile="${FUNCNAME}" +functionfile="${FUNCNAME[0]}" fn_fetch_function } install_server_dir.sh(){ -functionfile="${FUNCNAME}" +functionfile="${FUNCNAME[0]}" fn_fetch_function } install_server_files.sh(){ -functionfile="${FUNCNAME}" +functionfile="${FUNCNAME[0]}" fn_fetch_function } install_stats.sh(){ -functionfile="${FUNCNAME}" +functionfile="${FUNCNAME[0]}" fn_fetch_function } install_steamcmd.sh(){ -functionfile="${FUNCNAME}" +functionfile="${FUNCNAME[0]}" fn_fetch_function } install_ts3.sh(){ -functionfile="${FUNCNAME}" +functionfile="${FUNCNAME[0]}" fn_fetch_function } install_ts3db.sh(){ -functionfile="${FUNCNAME}" +functionfile="${FUNCNAME[0]}" fn_fetch_function } install_ut2k4.sh(){ -functionfile="${FUNCNAME}" +functionfile="${FUNCNAME[0]}" fn_fetch_function } install_dl_ut2k4.sh(){ -functionfile="${FUNCNAME}" +functionfile="${FUNCNAME[0]}" fn_fetch_function } install_ut2k4_key.sh(){ -functionfile="${FUNCNAME}" +functionfile="${FUNCNAME[0]}" fn_fetch_function } diff --git a/lgsm/functions/core_getopt.sh b/lgsm/functions/core_getopt.sh index 25890b3d5..840ac9a1f 100644 --- a/lgsm/functions/core_getopt.sh +++ b/lgsm/functions/core_getopt.sh @@ -4,7 +4,7 @@ # Website: https://linuxgsm.com # Description: getopt arguments. -local function_selfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" +local function_selfname=$(basename "$(readlink -f "${BASH_SOURCE[0]}")") ### Define all commands here. ## User commands | Trigger commands | Description @@ -143,8 +143,8 @@ currentopt+=( "${cmd_donate[@]}" ) optcommands=() index="0" for ((index="0"; index < ${#currentopt[@]}; index+=3)); do - cmdamount="$(echo -e "${currentopt[index]}" | awk -F ';' '{ print NF }')" - for ((cmdindex=1; cmdindex <= ${cmdamount}; cmdindex++)); do + cmdamount=$(echo -e "${currentopt[index]}" | awk -F ';' '{ print NF }') + for ((cmdindex=1; cmdindex <= cmdamount; cmdindex++)); do optcommands+=( "$(echo -e "${currentopt[index]}" | awk -F ';' -v x=${cmdindex} '{ print $x }')" ) done done @@ -180,8 +180,8 @@ for i in "${optcommands[@]}"; do # Seek and run command. index="0" for ((index="0"; index < ${#currentopt[@]}; index+=3)); do - currcmdamount="$(echo -e "${currentopt[index]}" | awk -F ';' '{ print NF }')" - for ((currcmdindex=1; currcmdindex <= ${currcmdamount}; currcmdindex++)); do + currcmdamount=$(echo -e "${currentopt[index]}" | awk -F ';' '{ print NF }') + for ((currcmdindex=1; currcmdindex <= currcmdamount; currcmdindex++)); do if [ "$(echo -e "${currentopt[index]}" | awk -F ';' -v x=${currcmdindex} '{ print $x }')" == "${getopt}" ]; then # Run command. eval "${currentopt[index+1]}" diff --git a/lgsm/functions/fix_arma3.sh b/lgsm/functions/fix_arma3.sh index ffa3d35e0..eda6dde69 100644 --- a/lgsm/functions/fix_arma3.sh +++ b/lgsm/functions/fix_arma3.sh @@ -6,7 +6,7 @@ local commandname="FIX" local commandaction="Fix" -local function_selfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" +local function_selfname=$(basename "$(readlink -f "${BASH_SOURCE[0]}")") # Fixes: 20150 Segmentation fault (core dumped) error. if [ ! -d "${HOME}/.local/share/Arma 3" ]||[ ! -d "${HOME}/.local/share/Arma 3 - Other Profiles" ]; then diff --git a/lgsm/functions/fix_csgo.sh b/lgsm/functions/fix_csgo.sh index 4cf281851..5e9981e38 100644 --- a/lgsm/functions/fix_csgo.sh +++ b/lgsm/functions/fix_csgo.sh @@ -6,7 +6,7 @@ local commandname="FIX" local commandaction="Fix" -local function_selfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" +local function_selfname=$(basename "$(readlink -f "${BASH_SOURCE[0]}")") # Fixes: server not always creating steam_appid.txt file. if [ ! -f "${serverfiles}/steam_appid.txt" ]; then diff --git a/lgsm/functions/fix_dst.sh b/lgsm/functions/fix_dst.sh index e2850c8b8..3b62be24b 100644 --- a/lgsm/functions/fix_dst.sh +++ b/lgsm/functions/fix_dst.sh @@ -6,7 +6,7 @@ local commandname="FIX" local commandaction="Fix" -local function_selfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" +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. diff --git a/lgsm/functions/fix_kf.sh b/lgsm/functions/fix_kf.sh index 125252f06..0661775d4 100644 --- a/lgsm/functions/fix_kf.sh +++ b/lgsm/functions/fix_kf.sh @@ -6,7 +6,7 @@ local commandname="FIX" local commandaction="Fix" -local function_selfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" +local function_selfname=$(basename "$(readlink -f "${BASH_SOURCE[0]}")") echo -e "Applying WebAdmin ROOst.css fix." echo -e "http://forums.tripwireinteractive.com/showpost.php?p=585435&postcount=13" diff --git a/lgsm/functions/fix_kf2.sh b/lgsm/functions/fix_kf2.sh index e8f3440f0..2909a535f 100644 --- a/lgsm/functions/fix_kf2.sh +++ b/lgsm/functions/fix_kf2.sh @@ -6,7 +6,7 @@ local commandname="FIX" local commandaction="Fix" -local function_selfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" +local function_selfname=$(basename "$(readlink -f "${BASH_SOURCE[0]}")") fn_parms(){ parms="\"${defaultmap}?Game=KFGameContent.KFGameInfo_VersusSurvival\"" diff --git a/lgsm/functions/fix_mta.sh b/lgsm/functions/fix_mta.sh index 4eb4ff900..c8b2ff8b0 100644 --- a/lgsm/functions/fix_mta.sh +++ b/lgsm/functions/fix_mta.sh @@ -6,7 +6,7 @@ # 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]}")")" +local function_selfname=$(basename "$(readlink -f "${BASH_SOURCE[0]}")") if [ ! -f "${lgsmdir}/lib/libmysqlclient.so.16" ]; then fixname="libmysqlclient16" diff --git a/lgsm/functions/fix_ro.sh b/lgsm/functions/fix_ro.sh index e354ce002..1e1da31bc 100644 --- a/lgsm/functions/fix_ro.sh +++ b/lgsm/functions/fix_ro.sh @@ -6,7 +6,7 @@ local commandname="FIX" local commandaction="Fix" -local function_selfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" +local function_selfname=$(basename "$(readlink -f "${BASH_SOURCE[0]}")") echo -e "Applying WebAdmin ROOst.css fix." echo -e "http://forums.tripwireinteractive.com/showpost.php?p=585435&postcount=13" diff --git a/lgsm/functions/fix_sfc.sh b/lgsm/functions/fix_sfc.sh index 060ec4823..a40250083 100644 --- a/lgsm/functions/fix_sfc.sh +++ b/lgsm/functions/fix_sfc.sh @@ -6,7 +6,7 @@ local commandname="FIX" local commandaction="Fix" -local function_selfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" +local function_selfname=$(basename "$(readlink -f "${BASH_SOURCE[0]}")") if [ ! -f "${serverfiles}/bin/datacache.so" ]; then ln -s "${serverfiles}/bin/datacache_srv.so" "${serverfiles}/bin/datacache.so" diff --git a/lgsm/functions/fix_ss3.sh b/lgsm/functions/fix_ss3.sh index 73626f366..c7277ea9d 100644 --- a/lgsm/functions/fix_ss3.sh +++ b/lgsm/functions/fix_ss3.sh @@ -6,7 +6,7 @@ local commandname="FIX" local commandaction="Fix" -local function_selfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" +local function_selfname=$(basename "$(readlink -f "${BASH_SOURCE[0]}")") # Fixes https://steamcommunity.com/app/41070/discussions/0/353916981477716386/ if [ "$(diff "${steamcmddir}/linux32/steamclient.so" "${serverfiles}/Bin/steamclient.so" >/dev/null)" ]; then diff --git a/lgsm/functions/fix_steamcmd.sh b/lgsm/functions/fix_steamcmd.sh index eb1622978..37bd4f61f 100644 --- a/lgsm/functions/fix_steamcmd.sh +++ b/lgsm/functions/fix_steamcmd.sh @@ -6,7 +6,7 @@ local commandname="FIX" local commandaction="Fix" -local function_selfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" +local function_selfname=$(basename "$(readlink -f "${BASH_SOURCE[0]}")") # Fixes: [S_API FAIL] SteamAPI_Init() failed; unable to locate a running instance of Steam,or a local steamclient.so. if [ ! -f "${HOME}/.steam/sdk32/steamclient.so" ]; then diff --git a/lgsm/functions/fix_terraria.sh b/lgsm/functions/fix_terraria.sh index 1a898d046..e3a595029 100644 --- a/lgsm/functions/fix_terraria.sh +++ b/lgsm/functions/fix_terraria.sh @@ -6,6 +6,6 @@ local commandname="FIX" local commandaction="Fix" -local function_selfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" +local function_selfname=$(basename "$(readlink -f "${BASH_SOURCE[0]}")") export TERM=xterm diff --git a/lgsm/functions/fix_tf2.sh b/lgsm/functions/fix_tf2.sh index 26a31846e..5c8cdf6c4 100644 --- a/lgsm/functions/fix_tf2.sh +++ b/lgsm/functions/fix_tf2.sh @@ -6,7 +6,7 @@ local commandname="FIX" local commandaction="Fix" -local function_selfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" +local function_selfname=$(basename "$(readlink -f "${BASH_SOURCE[0]}")") # Fixes: Team Fortress 2 Segmentation fault for Red-Hat Distros #2062. if [ -f "/etc/redhat-release" ]&&[ ! -f "${serverfiles}/bin/libcurl-gnutls.so.4" ]; then diff --git a/lgsm/functions/fix_ts3.sh b/lgsm/functions/fix_ts3.sh index 751b5dbd5..3e3599066 100644 --- a/lgsm/functions/fix_ts3.sh +++ b/lgsm/functions/fix_ts3.sh @@ -6,7 +6,7 @@ local commandname="FIX" local commandaction="Fix" -local function_selfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" +local function_selfname=$(basename "$(readlink -f "${BASH_SOURCE[0]}")") # Fixes: makes libmariadb2 available #1924. if [ ! -f "${serverfiles}/libmariadb.so.2" ]; then diff --git a/lgsm/functions/fix_ut.sh b/lgsm/functions/fix_ut.sh index 4d1b96355..e479e9442 100644 --- a/lgsm/functions/fix_ut.sh +++ b/lgsm/functions/fix_ut.sh @@ -6,7 +6,7 @@ local commandname="FIX" local commandaction="Fix" -local function_selfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" +local function_selfname=$(basename "$(readlink -f "${BASH_SOURCE[0]}")") #Set Binary Executable echo -e "chmod +x ${executabledir}/${executable}" diff --git a/lgsm/functions/fix_ut2k4.sh b/lgsm/functions/fix_ut2k4.sh index 4f966d80b..45ef3dc78 100644 --- a/lgsm/functions/fix_ut2k4.sh +++ b/lgsm/functions/fix_ut2k4.sh @@ -6,7 +6,7 @@ local commandname="FIX" local commandaction="Fix" -local function_selfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" +local function_selfname=$(basename "$(readlink -f "${BASH_SOURCE[0]}")") echo -e "applying WebAdmin ut2003.css fix." echo -e "http://forums.tripwireinteractive.com/showpost.php?p=585435&postcount=13" diff --git a/lgsm/functions/fix_ut3.sh b/lgsm/functions/fix_ut3.sh index 4da902e95..31eb85281 100644 --- a/lgsm/functions/fix_ut3.sh +++ b/lgsm/functions/fix_ut3.sh @@ -6,7 +6,7 @@ local commandname="FIX" local commandaction="Fix" -local function_selfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" +local function_selfname=$(basename "$(readlink -f "${BASH_SOURCE[0]}")") fn_parms(){ parms="server VCTF-Suspense?Game=UTGameContent.UTVehicleCTFGame_Content?bIsDedicated=true?bIsLanMatch=false?bUsesStats=false?bShouldAdvertise=false?PureServer=1?bAllowJoinInProgress=true?ConfigSubDir=${selfname} -port=${port} -queryport=${queryport} -multihome=${ip} -nohomedir -unattended -log=${gamelog}" diff --git a/lgsm/functions/fix_zmr.sh b/lgsm/functions/fix_zmr.sh index 0edfee967..5ed1d8beb 100644 --- a/lgsm/functions/fix_zmr.sh +++ b/lgsm/functions/fix_zmr.sh @@ -6,7 +6,7 @@ local commandname="FIX" local commandaction="Fix" -local function_selfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" +local function_selfname=$(basename "$(readlink -f "${BASH_SOURCE[0]}")") if [ ! -f "${serverfiles}/bin/datacache.so" ]; then ln -s "${serverfiles}/bin/datacache_srv.so" "${serverfiles}/bin/datacache.so" diff --git a/lgsm/functions/info_config.sh b/lgsm/functions/info_config.sh index fce013a28..3a07d78da 100644 --- a/lgsm/functions/info_config.sh +++ b/lgsm/functions/info_config.sh @@ -5,7 +5,7 @@ # Website: https://linuxgsm.com # Description: Gets specific details from config files. -local function_selfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" +local function_selfname=$(basename "$(readlink -f "${BASH_SOURCE[0]}")") ## Examples of filtering to get info from config files. # sed 's/foo//g' - remove foo @@ -413,9 +413,9 @@ fn_info_config_pstbs(){ maxplayers="${unavailable}" reservedslots="${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]*$//')" - maxplayers="$(grep "MaxPlayers=" "${servercfgfullpath}" | tr -cd '[:digit:]')" - reservedslots="$(grep "NumReservedSlots=" "${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]*$//') + maxplayers=$(grep "MaxPlayers=" "${servercfgfullpath}" | tr -cd '[:digit:]') + reservedslots=$(grep "NumReservedSlots=" "${servercfgfullpath}" | tr -cd '[:digit:]') fi if [ ! -f "${servercfgdir}/Rcon.cfg" ]; then @@ -684,8 +684,8 @@ fn_info_config_sbots(){ servername="${unavailable}" 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]*$//')" - maxplayers="$(grep "MaxPlayers=" "${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]*$//') + maxplayers=$(grep "MaxPlayers=" "${servercfgfullpath}" | tr -cd '[:digit:]') fi servername=${servername:-"NOT SET"} @@ -1225,8 +1225,8 @@ fn_info_config_squad(){ servername="${unavailable}" 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]*$//')" - maxplayers="$(grep "MaxPlayers=" "${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]*$//') + maxplayers=$(grep "MaxPlayers=" "${servercfgfullpath}" | tr -cd '[:digit:]') fi if [ ! -f "${servercfgdir}/Rcon.cfg" ]; then diff --git a/lgsm/functions/info_distro.sh b/lgsm/functions/info_distro.sh index 1fce6d391..38305c6e3 100644 --- a/lgsm/functions/info_distro.sh +++ b/lgsm/functions/info_distro.sh @@ -5,7 +5,7 @@ # Description: Variables providing useful info on the Operating System such as disk and performace info. # Used for command_details.sh, command_debug.sh and alert.sh. -local function_selfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" +local function_selfname=$(basename "$(readlink -f "${BASH_SOURCE[0]}")") ### Game Server pid if [ "${status}" == "1" ]; then @@ -34,9 +34,9 @@ do distrocodename=$(grep VERSION_CODENAME /etc/os-release | sed 's/VERSION_CODENAME=//g' | sed 's/\"//g') elif [ -n "$(command -v lsb_release 2>/dev/null)" ]&&[ "${distro_info}" == "lsb_release" ]; then if [ -z "${distroname}" ];then - distroname="$(lsb_release -sd)" + distroname=$(lsb_release -sd) elif [ -z "${distroversion}" ];then - distroversion="$(lsb_release -sr)" + distroversion=$(lsb_release -sr) elif [ -z "${distroid}" ];then distroid=$(lsb_release -si) elif [ -z "${distrocodename}" ];then @@ -44,13 +44,13 @@ do fi elif [ -n "$(command -v hostnamectl 2>/dev/null)" ]&&[ "${distro_info}" == "hostnamectl" ]; then if [ -z "${distroname}" ];then - distroname="$(hostnamectl | grep "Operating System" | sed 's/Operating System: //g')" + distroname=$(hostnamectl | grep "Operating System" | sed 's/Operating System: //g') fi elif [ -f "/etc/debian_version" ]&&[ "${distro_info}" == "debian_version" ]; then if [ -z "${distroname}" ];then distroname="Debian $(cat /etc/debian_version)" elif [ -z "${distroversion}" ];then - distroversion="$(cat /etc/debian_version)" + distroversion=$(cat /etc/debian_version) elif [ -z "${distroid}" ];then distroid="debian" fi @@ -60,21 +60,21 @@ do elif [ -z "${distroversion}" ];then distroversion=$(rpm -qa \*-release | grep -Ei "oracle|redhat|centos|fedora" | cut -d"-" -f3) elif [ -z "${distroid}" ];then - distroid="$(awk '{print $1}' /etc/redhat-release)" + distroid=$(awk '{print $1}' /etc/redhat-release) fi fi done ## Glibc version # e.g: 1.17 -glibcversion="$(ldd --version | sed -n '1s/.* //p')" +glibcversion=$(ldd --version | sed -n '1s/.* //p') ## tmux version # e.g: tmux 1.6 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 + if [ "$(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) @@ -107,7 +107,7 @@ fi # Available RAM and swap. # Newer distros can use numfmt to give more accurate results. -if [ "$(command -v numfmt 2>/dev/null)" ]; then +if [ -n "$(command -v numfmt 2>/dev/null)" ]; then # Issue #2005 - Kernel 3.14+ contains MemAvailable which should be used. All others will be calculated. # get the raw KB values of these fields. @@ -121,16 +121,16 @@ if [ "$(command -v numfmt 2>/dev/null)" ]; then if grep -q ^MemAvailable /proc/meminfo; then physmemactualfreekb=$(grep ^MemAvailable /proc/meminfo | awk '{print $2}') else - physmemactualfreekb=$((${physmemfreekb}+${physmembufferskb}+${physmemcachedkb})) + physmemactualfreekb=$((physmemfreekb+physmembufferskb+physmemcachedkb)) fi # Available RAM and swap. - physmemtotalmb=$((${physmemtotalkb}/1024)) + physmemtotalmb=$((physmemtotalkb/1024)) physmemtotal=$(numfmt --to=iec --from=iec --suffix=B "${physmemtotalkb}K") physmemfree=$(numfmt --to=iec --from=iec --suffix=B "${physmemactualfreekb}K") - physmemused=$(numfmt --to=iec --from=iec --suffix=B "$((${physmemtotalkb}-${physmemfreekb}-${physmembufferskb}-${physmemcachedkb}-${physmemreclaimablekb}))K") + physmemused=$(numfmt --to=iec --from=iec --suffix=B "$((physmemtotalkb-physmemfreekb-physmembufferskb-physmemcachedkb-physmemreclaimablekb))K") physmemavailable=$(numfmt --to=iec --from=iec --suffix=B "${physmemactualfreekb}K") - physmemcached=$(numfmt --to=iec --from=iec --suffix=B "$((${physmemcachedkb}+${physmemreclaimablekb}))K") + physmemcached=$(numfmt --to=iec --from=iec --suffix=B "$((physmemcachedkb+physmemreclaimablekb))K") swaptotal=$(numfmt --to=iec --from=iec --suffix=B "$(grep ^SwapTotal /proc/meminfo | awk '{print $2}')K") swapfree=$(numfmt --to=iec --from=iec --suffix=B "$(grep ^SwapFree /proc/meminfo | awk '{print $2}')K") @@ -228,7 +228,7 @@ netlink=$(ethtool "${netint}" 2>/dev/null| grep Speed | awk '{print $2}') # External IP address if [ -z "${extip}" ]; then - extip=$(${curlpath} -4 -m 3 ifconfig.co 2>/dev/null) + extip=$(curl -4 -m 3 ifconfig.co 2>/dev/null) exitcode=$? # Should ifconfig.co return an error will use last known IP. if [ ${exitcode} -eq 0 ]; then @@ -252,12 +252,12 @@ else fi # Steam Master Server - checks if detected by master server. -if [ "$(command -v jq 2>/dev/null)" ]; then +if [ -n "$(command -v jq 2>/dev/null)" ]; then if [ "${ip}" ]&&[ "${port}" ]; then if [ "${steammaster}" == "true" ]; then - masterserver="$(${curlpath} -m 3 -s 'https://api.steampowered.com/ISteamApps/GetServersAtAddress/v0001?addr='${ip}':'${port}'&format=json' | jq '.response.servers[]|.addr' | wc -l)" + masterserver=$(curl -m 3 -s 'https://api.steampowered.com/ISteamApps/GetServersAtAddress/v0001?addr='${ip}':'${port}'&format=json' | jq '.response.servers[]|.addr' | wc -l) if [ "${masterserver}" == "0" ]; then - masterserver="$(${curlpath} -m 3 -s 'https://api.steampowered.com/ISteamApps/GetServersAtAddress/v0001?addr='${extip}':'${port}'&format=json' | jq '.response.servers[]|.addr' | wc -l)" + masterserver=$(curl -m 3 -s 'https://api.steampowered.com/ISteamApps/GetServersAtAddress/v0001?addr='${extip}':'${port}'&format=json' | jq '.response.servers[]|.addr' | wc -l) fi if [ "${masterserver}" == "0" ]; then displaymasterserver="false" diff --git a/lgsm/functions/info_parms.sh b/lgsm/functions/info_parms.sh index 7b5ddcc53..6cafc86ad 100644 --- a/lgsm/functions/info_parms.sh +++ b/lgsm/functions/info_parms.sh @@ -4,7 +4,7 @@ # Website: https://linuxgsm.com # Description: If specific parms are not set then this will be displayed in details. -local function_selfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" +local function_selfname=$(basename "$(readlink -f "${BASH_SOURCE[0]}")") ## Examples of filtering to get info from config files # sed 's/foo//g' - remove foo diff --git a/lgsm/functions/info_stats.sh b/lgsm/functions/info_stats.sh index ebc9a8d6b..d300c8bec 100644 --- a/lgsm/functions/info_stats.sh +++ b/lgsm/functions/info_stats.sh @@ -10,7 +10,7 @@ info_distro.sh if [ ! -f "${datadir}/uuid.txt" ];then mkdir -p "${datadir}" touch "${datadir}/uuid.txt" - if [ "$(command -v uuidgen 2>/dev/null)" ]; then + if [ -n "$(command -v uuidgen 2>/dev/null)" ]; then uuidgen > "${datadir}/uuid.txt" else cat /proc/sys/kernel/random/uuid > "${datadir}/uuid.txt" @@ -20,11 +20,11 @@ fi uuid=$(cat "${datadir}/uuid.txt") # results are rounded up to reduce number of different results in analytics # nearest 100Mhz -cpuusedmhzroundup=$(((${cpuusedmhz} + 99) / 100 * 100)) +cpuusedmhzroundup=$(((cpuusedmhz + 99) / 100 * 100)) # nearest 100MB -memusedroundup=$(((${memused} + 99) / 100 * 100)) +memusedroundup=$(((memused + 99) / 100 * 100)) # nearest 100MB -serverfilesduroundup=$(((${serverfilesdu} + 99) / 100 * 100)) +serverfilesduroundup=$(((serverfilesdu + 99) / 100 * 100)) # https://developers.google.com/analytics/devguides/collection/protocol/v1/parameters # Level 1 Stats diff --git a/lgsm/functions/install_complete.sh b/lgsm/functions/install_complete.sh index 63ba28d4f..a747438a2 100644 --- a/lgsm/functions/install_complete.sh +++ b/lgsm/functions/install_complete.sh @@ -6,7 +6,7 @@ local commandname="INSTALL" local commandaction="Install" -local function_selfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" +local function_selfname=$(basename "$(readlink -f "${BASH_SOURCE[0]}")") echo -e "" echo -e "=================================" diff --git a/lgsm/functions/install_config.sh b/lgsm/functions/install_config.sh index 7cffbff4e..af8554604 100644 --- a/lgsm/functions/install_config.sh +++ b/lgsm/functions/install_config.sh @@ -6,7 +6,7 @@ local commandname="INSTALL" local commandaction="Install" -local function_selfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" +local function_selfname=$(basename "$(readlink -f "${BASH_SOURCE[0]}")") # Checks if server cfg dir exists, creates it if it doesn't. fn_check_cfgdir(){ diff --git a/lgsm/functions/install_dst_token.sh b/lgsm/functions/install_dst_token.sh index 55e83ffe4..869adde71 100644 --- a/lgsm/functions/install_dst_token.sh +++ b/lgsm/functions/install_dst_token.sh @@ -6,7 +6,7 @@ local commandname="INSTALL" local commandaction="Install" -local function_selfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" +local function_selfname=$(basename "$(readlink -f "${BASH_SOURCE[0]}")") echo -e "" echo -e "${lightyellow}Enter ${gamename} Cluster Token${default}" diff --git a/lgsm/functions/install_gslt.sh b/lgsm/functions/install_gslt.sh index 8576f458c..ddb0ca291 100644 --- a/lgsm/functions/install_gslt.sh +++ b/lgsm/functions/install_gslt.sh @@ -6,7 +6,7 @@ local commandname="INSTALL" local commandaction="Install" -local function_selfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" +local function_selfname=$(basename "$(readlink -f "${BASH_SOURCE[0]}")") echo -e "" echo -e "${lightyellow}Game Server Login Token${default}" diff --git a/lgsm/functions/install_header.sh b/lgsm/functions/install_header.sh index b524fe7ad..1a0c9dc29 100644 --- a/lgsm/functions/install_header.sh +++ b/lgsm/functions/install_header.sh @@ -6,7 +6,7 @@ local commandname="INSTALL" local commandaction="Install" -local function_selfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" +local function_selfname=$(basename "$(readlink -f "${BASH_SOURCE[0]}")") clear fn_print_ascii_logo diff --git a/lgsm/functions/install_logs.sh b/lgsm/functions/install_logs.sh index 996e05f93..1a00bac39 100644 --- a/lgsm/functions/install_logs.sh +++ b/lgsm/functions/install_logs.sh @@ -6,7 +6,7 @@ local commandname="INSTALL" local commandaction="Install" -local function_selfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" +local function_selfname=$(basename "$(readlink -f "${BASH_SOURCE[0]}")") if [ "${checklogs}" != "1" ]; then echo -e "" @@ -51,8 +51,7 @@ if [ -n "${consolelogdir}" ]; then fn_print_ok_eol_nl fi echo -en "creating console log: ${consolelog}..." - touch "${consolelog}" - if [ $? -ne 0 ]; then + if ! touch "${consolelog}"; then fn_print_fail_eol_nl core_exit.sh else @@ -63,8 +62,7 @@ fi # Create Game logs. if [ -n "${gamelogdir}" ]&&[ ! -d "${gamelogdir}" ]; then echo -en "installing game log dir: ${gamelogdir}..." - mkdir -p "${gamelogdir}" - if [ $? -ne 0 ]; then + if ! mkdir -p "${gamelogdir}"; then fn_print_fail_eol_nl core_exit.sh else @@ -79,8 +77,7 @@ fi if [ -n "${gamelogdir}" ]; then if [ "${gamelogdir:0:${#logdir}}" != "${logdir}" ]; then echo -en "creating symlink to game log dir: ${logdir}/server -> ${gamelogdir}..." - ln -nfs "${gamelogdir}" "${logdir}/server" - if [ $? -ne 0 ]; then + if ! ln -nfs "${gamelogdir}" "${logdir}/server"; then fn_print_fail_eol_nl core_exit.sh else @@ -93,8 +90,7 @@ fi if [ -d "${rootdir}/Steam/logs" ]; then if [ ! -L "${logdir}/steamcmd" ]; then echo -en "creating symlink to steam log dir: ${logdir}/steamcmd -> ${rootdir}/Steam/logs..." - ln -nfs "${rootdir}/Steam/logs" "${logdir}/steamcmd" - if [ $? -ne 0 ]; then + if ! ln -nfs "${rootdir}/Steam/logs" "${logdir}/steamcmd"; then fn_print_fail_eol_nl core_exit.sh else diff --git a/lgsm/functions/install_mta_resources.sh b/lgsm/functions/install_mta_resources.sh index d21de7f9c..6d7f14bd1 100644 --- a/lgsm/functions/install_mta_resources.sh +++ b/lgsm/functions/install_mta_resources.sh @@ -7,7 +7,7 @@ local commandname="INSTALL" local commandaction="Install" -local function_selfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" +local function_selfname=$(basename "$(readlink -f "${BASH_SOURCE[0]}")") fn_print_information_nl "${gamename} will not function without resources!" echo -e " * install default resources using ./${selfname} install-default-resources" diff --git a/lgsm/functions/install_retry.sh b/lgsm/functions/install_retry.sh index f5f4462ad..2698b150c 100644 --- a/lgsm/functions/install_retry.sh +++ b/lgsm/functions/install_retry.sh @@ -6,7 +6,7 @@ local commandname="INSTALL" local commandaction="Install" -local function_selfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" +local function_selfname=$(basename "$(readlink -f "${BASH_SOURCE[0]}")") if fn_prompt_yn "Retry install?" Y; then command_install.sh; core_exit.sh diff --git a/lgsm/functions/install_server_dir.sh b/lgsm/functions/install_server_dir.sh index ee918c0e5..894ae060d 100644 --- a/lgsm/functions/install_server_dir.sh +++ b/lgsm/functions/install_server_dir.sh @@ -6,7 +6,7 @@ local commandname="INSTALL" local commandaction="Install" -local function_selfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" +local function_selfname=$(basename "$(readlink -f "${BASH_SOURCE[0]}")") echo -e "" echo -e "${lightyellow}Server Directory${default}" diff --git a/lgsm/functions/install_server_files.sh b/lgsm/functions/install_server_files.sh index 07b3241d5..27ad82e32 100644 --- a/lgsm/functions/install_server_files.sh +++ b/lgsm/functions/install_server_files.sh @@ -6,7 +6,7 @@ local commandname="INSTALL" local commandaction="Install" -local function_selfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" +local function_selfname=$(basename "$(readlink -f "${BASH_SOURCE[0]}")") fn_install_server_files(){ if [ "${shortname}" == "ahl" ]; then @@ -98,7 +98,7 @@ fn_install_server_files_steamcmd(){ # Detects if unbuffer command is available for 32 bit distributions only. info_distro.sh - if [ "$(command -v stdbuf 2>/dev/null)" ]&&[ "${arch}" != "x86_64" ]; then + if [ -n "$(command -v stdbuf 2>/dev/null)" ]&&[ "${arch}" != "x86_64" ]; then unbuffer="stdbuf -i0 -o0 -e0" fi diff --git a/lgsm/functions/install_squad_license.sh b/lgsm/functions/install_squad_license.sh index b1e15e419..0f1528e07 100644 --- a/lgsm/functions/install_squad_license.sh +++ b/lgsm/functions/install_squad_license.sh @@ -6,7 +6,7 @@ local commandname="INSTALL" local commandaction="Install" -local function_selfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" +local function_selfname=$(basename "$(readlink -f "${BASH_SOURCE[0]}")") echo -e "" echo -e "${lightyellow}Squad Server License${default}" diff --git a/lgsm/functions/install_stats.sh b/lgsm/functions/install_stats.sh index 8bee61c96..2d304e447 100644 --- a/lgsm/functions/install_stats.sh +++ b/lgsm/functions/install_stats.sh @@ -6,7 +6,7 @@ local commandname="INSTALL" local commandaction="Install" -local function_selfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" +local function_selfname=$(basename "$(readlink -f "${BASH_SOURCE[0]}")") echo -e "" echo -e "${lightyellow}LinuxGSM Stats${default}" diff --git a/lgsm/functions/install_ts3db.sh b/lgsm/functions/install_ts3db.sh index 744b4bea7..09e16324e 100644 --- a/lgsm/functions/install_ts3db.sh +++ b/lgsm/functions/install_ts3db.sh @@ -7,7 +7,7 @@ local commandname="INSTALL" local commandaction="Install" -local function_selfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" +local function_selfname=$(basename "$(readlink -f "${BASH_SOURCE[0]}")") fn_install_ts3db_mariadb(){ if [ ! -f "${serverfiles}/libts3db_mariadb.so" ]; then diff --git a/lgsm/functions/install_ut2k4_key.sh b/lgsm/functions/install_ut2k4_key.sh index ea9f0ac82..c8d18692e 100644 --- a/lgsm/functions/install_ut2k4_key.sh +++ b/lgsm/functions/install_ut2k4_key.sh @@ -6,7 +6,7 @@ local commandname="INSTALL" local commandaction="Install" -local function_selfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" +local function_selfname=$(basename "$(readlink -f "${BASH_SOURCE[0]}")") echo -e "" echo -e "${lightyellow}Enter ${gamename} CD Key${default}" diff --git a/lgsm/functions/logs.sh b/lgsm/functions/logs.sh index 280b50a92..04f5010e9 100644 --- a/lgsm/functions/logs.sh +++ b/lgsm/functions/logs.sh @@ -98,7 +98,7 @@ if [ "$(find "${lgsmlogdir}"/ -type f -mtime +"${logdays}" | wc -l)" -ne "0" ]; fi # Count total amount of files removed. - countlogs=$((${scriptcount} + ${consolecount} + ${gamecount} + ${srcdscount} + ${smcount} + ${ulxcount} + ${darkrpcount})) + countlogs=$((scriptcount + consolecount + gamecount + srcdscount + smcount + ulxcount + darkrpcount)) # Job done. fn_print_ok_nl "Removed ${countlogs} log files" fn_script_log "Removed ${countlogs} log files" diff --git a/lgsm/functions/mods_core.sh b/lgsm/functions/mods_core.sh index f0b056b28..942012e46 100644 --- a/lgsm/functions/mods_core.sh +++ b/lgsm/functions/mods_core.sh @@ -7,7 +7,7 @@ local commandname="MODS" local commandaction="Mods" -local function_selfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" +local function_selfname=$(basename "$(readlink -f "${BASH_SOURCE[0]}")") # Files and Directories. modsdir="${lgsmdir}/mods" @@ -43,7 +43,7 @@ fn_mod_lowercase(){ fileswc=$(find "${extractdir}" -depth | wc -l) echo -en "\r" while read -r src; do - dst="$(dirname "${src}$(/)basename" "${src}" | tr 'A-Z' 'a-z')" + dst=$(dirname "${src}$(/)basename" "${src}" | tr '[:upper:]' '[:lower:]') if [ "${src}" != "${dst}" ] then [ ! -e "${dst}" ] && mv -T "${src}" "${dst}" || echo -e "${src} was not renamed" @@ -122,11 +122,11 @@ fn_mod_tidy_files_list(){ 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 -e "${removefromlist}" | awk -F ';' '{ print NF }')" + removefromlistamount=$(echo -e "${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 -e "${removefromlist}" | awk -F ';' -v x=${filesindex} '{ print $x }')" + removefilevar=$(echo -e "${removefromlist}" | awk -F ';' -v x=${filesindex} '{ print $x }') # Delete line(s) matching exactly. sed -i "/^${removefilevar}$/d" "${modsdir}/${modcommand}-files.txt" # Exit on error. @@ -259,7 +259,7 @@ fn_mods_installed_list(){ modcommandmaxlength="0" # Loop through every line of the installed mods list ${modsinstalledlistfullpath}. while [ "${installedmodsline}" -le "${installedmodscount}" ]; do - currentmod="$(sed "${installedmodsline}q;d" "${modsinstalledlistfullpath}")" + currentmod=$(sed "${installedmodsline}q;d" "${modsinstalledlistfullpath}") # Get mod info to make sure mod exists. fn_mod_get_info # Add the mod to available commands. @@ -306,11 +306,11 @@ fn_compatible_mod_games(){ # If value is set to GAMES (ignore). if [ "${modgames}" != "GAMES" ]; then # How many games we need to test. - gamesamount="$(echo -e "${modgames}" | awk -F ';' '{ print NF }')" + gamesamount=$(echo -e "${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 -e "${modgames}" | awk -F ';' -v x=${gamevarindex} '{ print $x }' )" + gamemodtest=$( echo -e "${modgames}" | awk -F ';' -v x=${gamevarindex} '{ print $x }' ) # If game name matches. if [ "${gamemodtest}" == "${gamename}" ]; then # Mod is compatible. @@ -327,11 +327,11 @@ fn_compatible_mod_engines(){ # If value is set to ENGINES (ignore). if [ "${modengines}" != "ENGINES" ]; then # How many engines we need to test. - enginesamount="$(echo -e "${modengines}" | awk -F ';' '{ print NF }')" + enginesamount=$(echo -e "${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 -e "${modengines}" | awk -F ';' -v x=${gamevarindex} '{ print $x }' )" + enginemodtest=$( echo -e "${modengines}" | awk -F ';' -v x=${gamevarindex} '{ print $x }' ) # If engine name matches. if [ "${enginemodtest}" == "${engine}" ]; then # Mod is compatible. @@ -348,11 +348,11 @@ fn_not_compatible_mod_games(){ # If value is set to NOTGAMES (ignore). if [ "${modexcludegames}" != "NOTGAMES" ]; then # How many engines we need to test. - excludegamesamount="$(echo -e "${modexcludegames}" | awk -F ';' '{ print NF }')" + excludegamesamount=$(echo -e "${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 -e "${modexcludegames}" | awk -F ';' -v x=${gamevarindex} '{ print $x }' )" + excludegamemodtest=$( echo -e "${modexcludegames}" | awk -F ';' -v x=${gamevarindex} '{ print $x }' ) # If engine name matches. if [ "${excludegamemodtest}" == "${gamename}" ]; then # Mod is compatible. @@ -461,7 +461,7 @@ fn_mods_clear_tmp_dir(){ # Counts how many mods were installed. fn_mods_count_installed(){ if [ -f "${modsinstalledlistfullpath}" ]; then - installedmodscount="$(wc -l < "${modsinstalledlistfullpath}")" + installedmodscount=$(wc -l < "${modsinstalledlistfullpath}") else installedmodscount=0 fi @@ -486,7 +486,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="$(wc -l < "${modsdir}/${modcommand}-files.txt")" + 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" diff --git a/lgsm/functions/mods_list.sh b/lgsm/functions/mods_list.sh index cfb7fee59..67a57463c 100644 --- a/lgsm/functions/mods_list.sh +++ b/lgsm/functions/mods_list.sh @@ -10,36 +10,36 @@ local commandname="MODS" local commandaction="List Mods" -local function_selfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" +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 metamodmversion="1.10" metamodscrapeurl="https://mms.alliedmods.net/mmsdrop/${metamodmversion}/mmsource-latest-linux" -metamodlatestfile="$(wget "${metamodscrapeurl}" -q -O -)" +metamodlatestfile=$(wget "${metamodscrapeurl}" -q -O -) metamoddownloadurl="https://www.metamodsource.net/latest.php?os=linux&version=${metamodmversion}" metamodurl="${metamoddownloadurl}" # Sourcemod sourcemodmversion="1.10" sourcemodscrapeurl="https://sm.alliedmods.net/smdrop/${sourcemodmversion}/sourcemod-latest-linux" -sourcemodlatestfile="$(wget "${sourcemodscrapeurl}" -q -O -)" +sourcemodlatestfile=$(wget "${sourcemodscrapeurl}" -q -O -) sourcemoddownloadurl="https://www.sourcemod.net/latest.php?os=linux&version=${sourcemodmversion}" sourcemodurl="${sourcemoddownloadurl}" # Steamworks steamworksscrapeurl="https://users.alliedmods.net/~kyles/builds/SteamWorks" -steamworkslatestfile="$(curl -sL ${steamworksscrapeurl} | grep -m 1 linux | cut -d '"' -f 4)" +steamworkslatestfile=$(curl -sL ${steamworksscrapeurl} | grep -m 1 linux | cut -d '"' -f 4) steamworksdownloadurl="${steamworksscrapeurl}/${steamworkslatestfile}" steamworksurl="${steamworksdownloadurl}" # CS:GO Mods -get5scrapepath="$(curl -sL https://ci.splewis.net/job/get5/lastSuccessfulBuild/api/xml | grep -oP "\K(.+)(?=)")" -get5latestfile="$(echo -e "${get5scrapepath}" | xargs -n 1 -I @ sh -c "echo -e "basename "@""")" +get5scrapepath=$(curl -sL https://ci.splewis.net/job/get5/lastSuccessfulBuild/api/xml | grep -oP "\K(.+)(?=)") +get5latestfile=$(echo -e "${get5scrapepath}" | xargs -n 1 -I @ sh -c "echo -e "basename "@""") get5downloadurl="https://ci.splewis.net/job/get5/lastSuccessfulBuild/artifact/${get5scrapepath}" get5url="${get5downloadurl}" # Oxide oxiderustlatestlink="https://umod.org/games/rust/download/develop" # fix for linux build 06.09.2019 -oxidehurtworldlatestlink="$(curl -sL https://api.github.com/repos/OxideMod/Oxide.Hurtworld/releases/latest | grep browser_download_url | cut -d '"' -f 4 | grep "Oxide.Hurtworld.zip")" -oxidesdtdlatestlink="$(curl -sL https://api.github.com/repos/OxideMod/Oxide.SevenDaysToDie/releases/latest | grep browser_download_url | cut -d '"' -f 4)" +oxidehurtworldlatestlink=$(curl -sL https://api.github.com/repos/OxideMod/Oxide.Hurtworld/releases/latest | grep browser_download_url | cut -d '"' -f 4 | grep "Oxide.Hurtworld.zip") +oxidesdtdlatestlink=$(curl -sL https://api.github.com/repos/OxideMod/Oxide.SevenDaysToDie/releases/latest | grep browser_download_url | cut -d '"' -f 4) # Define mods information (required) diff --git a/lgsm/functions/query_gamedig.sh b/lgsm/functions/query_gamedig.sh index 4f1bc5638..88e01af5f 100644 --- a/lgsm/functions/query_gamedig.sh +++ b/lgsm/functions/query_gamedig.sh @@ -6,7 +6,7 @@ # https://github.com/sonicsnes/node-gamedig # Check if gamedig and jq are installed. -if [ "$(command -v gamedig 2>/dev/null)" ]&&[ "$(command -v jq 2>/dev/null)" ]; then +if [ -n "$(command -v gamedig 2>/dev/null)" ]&&[ "$(command -v jq 2>/dev/null)" ]; then # will bypass query if server offline. check_status.sh diff --git a/lgsm/functions/update_factorio.sh b/lgsm/functions/update_factorio.sh index fc79cde2d..584fec4ae 100644 --- a/lgsm/functions/update_factorio.sh +++ b/lgsm/functions/update_factorio.sh @@ -6,7 +6,7 @@ local commandname="UPDATE" local commandaction="Update" -local function_selfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" +local function_selfname=$(basename "$(readlink -f "${BASH_SOURCE[0]}")") fn_update_factorio_dl(){ fn_fetch_file "https://factorio.com/get-download/${downloadbranch}/headless/${factorioarch}" "${tmpdir}" "factorio_headless_${factorioarch}-${remotebuild}.tar.xz" @@ -43,7 +43,7 @@ fn_update_factorio_localbuild(){ fn_update_factorio_remotebuild(){ # Gets remote build info. - remotebuild=$(${curlpath} -s "https://factorio.com/get-download/${downloadbranch}/headless/${factorioarch}" | grep -o '[0-9]\.[0-9]\{1,\}\.[0-9]\{1,\}' | head -1) + remotebuild=$(curl -s "https://factorio.com/get-download/${downloadbranch}/headless/${factorioarch}" | grep -o '[0-9]\.[0-9]\{1,\}\.[0-9]\{1,\}' | head -1) if [ "${installer}" != "1" ]; then fn_print_dots "Checking for update: ${remotelocation}: checking remote build" # Checks if remotebuild variable has been set. diff --git a/lgsm/functions/update_minecraft.sh b/lgsm/functions/update_minecraft.sh index e75a38dcc..f27603a42 100644 --- a/lgsm/functions/update_minecraft.sh +++ b/lgsm/functions/update_minecraft.sh @@ -6,11 +6,11 @@ local commandname="UPDATE" local commandaction="Update" -local function_selfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" +local function_selfname=$(basename "$(readlink -f "${BASH_SOURCE[0]}")") fn_update_minecraft_dl(){ - latestmcreleaselink=$(${curlpath} -s "https://launchermeta.mojang.com/mc/game/version_manifest.json" | jq -r '.latest.release as $latest | .versions[] | select(.id == $latest) | .url') - latestmcbuildurl=$(${curlpath} -s "${latestmcreleaselink}" | jq -r '.downloads.server.url') + latestmcreleaselink=$(curl -s "https://launchermeta.mojang.com/mc/game/version_manifest.json" | jq -r '.latest.release as $latest | .versions[] | select(.id == $latest) | .url') + latestmcbuildurl=$(curl -s "${latestmcreleaselink}" | jq -r '.downloads.server.url') fn_fetch_file "${latestmcbuildurl}" "${tmpdir}" "minecraft_server.${remotebuild}.jar" echo -e "copying to ${serverfiles}...\c" cp "${tmpdir}/minecraft_server.${remotebuild}.jar" "${serverfiles}/minecraft_server.jar" @@ -98,7 +98,7 @@ fn_update_minecraft_localbuild(){ fn_update_minecraft_remotebuild(){ # Gets remote build info. - remotebuild=$(${curlpath} -s "https://launchermeta.${remotelocation}/mc/game/version_manifest.json" | jq -r '.latest.release') + remotebuild=$(curl -s "https://launchermeta.${remotelocation}/mc/game/version_manifest.json" | jq -r '.latest.release') if [ "${installer}" != "1" ]; then fn_print_dots "Checking for update: ${remotelocation}: checking remote build" # Checks if remotebuild variable has been set. diff --git a/lgsm/functions/update_mta.sh b/lgsm/functions/update_mta.sh index 95461ab04..879ca1409 100644 --- a/lgsm/functions/update_mta.sh +++ b/lgsm/functions/update_mta.sh @@ -6,7 +6,7 @@ local commandname="UPDATE" local commandaction="Update" -local function_selfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" +local function_selfname=$(basename "$(readlink -f "${BASH_SOURCE[0]}")") fn_update_mta_dl(){ fn_fetch_file "http://linux.mtasa.com/dl/multitheftauto_linux_x64.tar.gz" "${tmpdir}" "multitheftauto_linux_x64.tar.gz" @@ -99,9 +99,9 @@ fn_update_mta_localbuild(){ fn_update_mta_remotebuild(){ # Gets remote build info. - majorversion="$(curl -s https://raw.githubusercontent.com/multitheftauto/mtasa-blue/master/Server/version.h | grep "#define MTASA_VERSION_MAJOR" | awk '{ print $3 }' | sed 's/\r//g')" - minorversion="$(curl -s https://raw.githubusercontent.com/multitheftauto/mtasa-blue/master/Server/version.h | grep "#define MTASA_VERSION_MINOR" | awk '{ print $3 }' | sed 's/\r//g')" - maintenanceversion="$(curl -s https://raw.githubusercontent.com/multitheftauto/mtasa-blue/master/Server/version.h | grep "#define MTASA_VERSION_MAINTENANCE" | awk '{ print $3 }' | sed 's/\r//g')" + majorversion=$(curl -s https://raw.githubusercontent.com/multitheftauto/mtasa-blue/master/Server/version.h | grep "#define MTASA_VERSION_MAJOR" | awk '{ print $3 }' | sed 's/\r//g') + minorversion=$(curl -s https://raw.githubusercontent.com/multitheftauto/mtasa-blue/master/Server/version.h | grep "#define MTASA_VERSION_MINOR" | awk '{ print $3 }' | sed 's/\r//g') + maintenanceversion=$(curl -s https://raw.githubusercontent.com/multitheftauto/mtasa-blue/master/Server/version.h | grep "#define MTASA_VERSION_MAINTENANCE" | awk '{ print $3 }' | sed 's/\r//g') remotebuild="${majorversion}.${minorversion}.${maintenanceversion}" if [ "${installer}" != "1" ]; then fn_print_dots "Checking for update: ${remotelocation}: checking remote build" diff --git a/lgsm/functions/update_mumble.sh b/lgsm/functions/update_mumble.sh index 9dd504ad0..0f33c1900 100644 --- a/lgsm/functions/update_mumble.sh +++ b/lgsm/functions/update_mumble.sh @@ -6,7 +6,7 @@ local commandname="UPDATE" local commandaction="Update" -local function_selfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" +local function_selfname=$(basename "$(readlink -f "${BASH_SOURCE[0]}")") fn_update_mumble_dl(){ fn_fetch_file "https://github.com/mumble-voip/mumble/releases/download/${remotebuild}/murmur-static_${mumblearch}-${remotebuild}.tar.bz2" "${tmpdir}" "murmur-static_${mumblearch}-${remotebuild}.tar.bz2" @@ -43,7 +43,7 @@ fn_update_mumble_localbuild(){ fn_update_mumble_remotebuild(){ # Gets remote build info. - remotebuild=$(${curlpath} -s "https://api.github.com/repos/mumble-voip/mumble/releases/latest" | grep 'murmur-static_x86.*\.bz2"' | tail -1 | awk -F"/" '{ print $8 }') + remotebuild=$(curl -s "https://api.github.com/repos/mumble-voip/mumble/releases/latest" | grep 'murmur-static_x86.*\.bz2"' | tail -1 | awk -F"/" '{ print $8 }') if [ "${installer}" != "1" ]; then fn_print_dots "Checking for update: ${remotelocation}: checking remote build" # Checks if remotebuild variable has been set. diff --git a/lgsm/functions/update_steamcmd.sh b/lgsm/functions/update_steamcmd.sh index b27884513..a53ee04e0 100644 --- a/lgsm/functions/update_steamcmd.sh +++ b/lgsm/functions/update_steamcmd.sh @@ -6,14 +6,14 @@ local commandname="UPDATE" local commandaction="Update" -local function_selfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" +local function_selfname=$(basename "$(readlink -f "${BASH_SOURCE[0]}")") fn_update_steamcmd_dl(){ info_config.sh # Detects if unbuffer command is available for 32 bit distributions only. info_distro.sh - if [ "$(command -v stdbuf)" ]&&[ "${arch}" != "x86_64" ]; then + if [ -n "$(command -v stdbuf)" ]&&[ "${arch}" != "x86_64" ]; then unbuffer="stdbuf -i0 -o0 -e0" fi diff --git a/lgsm/functions/update_ts3.sh b/lgsm/functions/update_ts3.sh index ce61f59c0..798137311 100644 --- a/lgsm/functions/update_ts3.sh +++ b/lgsm/functions/update_ts3.sh @@ -6,13 +6,13 @@ local commandname="UPDATE" local commandaction="Update" -local function_selfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" +local function_selfname=$(basename "$(readlink -f "${BASH_SOURCE[0]}")") fn_update_ts3_dl(){ if [ "${ts3arch}" == "amd64" ]; then - remotebuildurl=$(${curlpath} -s 'https://www.teamspeak.com/versions/server.json' | jq -r '.linux.x86_64.mirrors."teamspeak.com"') + remotebuildurl=$(curl -s 'https://www.teamspeak.com/versions/server.json' | jq -r '.linux.x86_64.mirrors."teamspeak.com"') elif [ "${ts3arch}" == "x86" ]; then - remotebuildurl=$(${curlpath} -s 'https://www.teamspeak.com/versions/server.json' | jq -r '.linux.x86.mirrors."teamspeak.com"') + remotebuildurl=$(curl -s 'https://www.teamspeak.com/versions/server.json' | jq -r '.linux.x86.mirrors."teamspeak.com"') fi fn_fetch_file "${remotebuildurl}" "${tmpdir}" "teamspeak3-server_linux_${ts3arch}-${remotebuild}.tar.bz2" fn_dl_extract "${tmpdir}" "teamspeak3-server_linux_${ts3arch}-${remotebuild}.tar.bz2" "${tmpdir}" @@ -68,7 +68,7 @@ fn_update_ts3_localbuild(){ fi if [ -z "${localbuild}" ]; then - localbuild=$(cat $(find ./* -name "ts3server*_0.log" 2> /dev/null | sort | tail -1) | grep -Eo "TeamSpeak 3 Server ((\.)?[0-9]{1,3}){1,3}\.[0-9]{1,3}" | grep -Eo "((\.)?[0-9]{1,3}){1,3}\.[0-9]{1,3}" | tail -1) + localbuild=$(cat "$(find ./* -name "ts3server*_0.log" 2> /dev/null | sort | tail -1)" | grep -Eo "TeamSpeak 3 Server ((\.)?[0-9]{1,3}){1,3}\.[0-9]{1,3}" | grep -Eo "((\.)?[0-9]{1,3}){1,3}\.[0-9]{1,3}" | tail -1) fi if [ -z "${localbuild}" ]; then @@ -81,7 +81,7 @@ fn_update_ts3_localbuild(){ loopignore=1 fn_script_log_info "Waiting for local build to generate" fi - localbuild=$(cat $(find ./* -name "ts3server*_0.log" 2> /dev/null | sort | tail -1) | grep -Eo "TeamSpeak 3 Server ((\.)?[0-9]{1,3}){1,3}\.[0-9]{1,3}" | grep -Eo "((\.)?[0-9]{1,3}){1,3}\.[0-9]{1,3}" | tail -1) + localbuild=$(cat "$(find ./* -name "ts3server*_0.log" 2> /dev/null | sort | tail -1)" | grep -Eo "TeamSpeak 3 Server ((\.)?[0-9]{1,3}){1,3}\.[0-9]{1,3}" | grep -Eo "((\.)?[0-9]{1,3}){1,3}\.[0-9]{1,3}" | tail -1) if [ "${localbuild}" ]; then break fi @@ -104,9 +104,9 @@ fn_update_ts3_localbuild(){ fn_update_ts3_remotebuild(){ # Gets remote build info. if [ "${arch}" == "x86_64" ]; then - remotebuild="$(${curlpath} -s "https://www.teamspeak.com/versions/server.json" | jq -r '.linux.x86_64.version')" + remotebuild=$(curl -s "https://www.teamspeak.com/versions/server.json" | jq -r '.linux.x86_64.version') elif [ "${arch}" == "x86" ]; then - remotebuild="$(${curlpath} -s "https://www.teamspeak.com/versions/server.json" | jq -r '.linux.x86.version')" + remotebuild=$(curl -s "https://www.teamspeak.com/versions/server.json" | jq -r '.linux.x86.version') fi if [ "${installer}" != "1" ]; then fn_print_dots "Checking for update: ${remotelocation}: checking remote build" diff --git a/linuxgsm.sh b/linuxgsm.sh index 53c18b831..451e0c888 100755 --- a/linuxgsm.sh +++ b/linuxgsm.sh @@ -23,8 +23,8 @@ fi version="v19.11.0" shortname="core" gameservername="core" -rootdir="$(dirname "$(readlink -f "${BASH_SOURCE[0]}")")" -selfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" +rootdir=$(dirname "$(readlink -f "${BASH_SOURCE[0]}")") +selfname=$(basename "$(readlink -f "${BASH_SOURCE[0]}")") lockselfname=".${selfname}.lock" lgsmdir="${rootdir}/lgsm" logdir="${rootdir}/log" @@ -51,7 +51,7 @@ githubbranch="master" # Core function that is required first. core_functions.sh(){ - functionfile="${FUNCNAME}" + functionfile="${FUNCNAME[0]}" fn_bootstrap_fetch_file_github "lgsm/functions" "core_functions.sh" "${functionsdir}" "chmodx" "run" "noforcedl" "nomd5" } @@ -70,14 +70,12 @@ fn_bootstrap_fetch_file(){ if [ ! -d "${local_filedir}" ]; then mkdir -p "${local_filedir}" fi - # Defines curl path. - curlpath=$(command -v curl 2>/dev/null) # If curl exists download file. - if [ "$(basename "${curlpath}")" == "curl" ]; then + if [ -n "$(command -v curl 2>/dev/null)" ]; then # Trap to remove part downloaded files. echo -en " fetching ${local_filename}...\c" - curlcmd=$(${curlpath} -s --fail -L -o "${local_filedir}/${local_filename}" "${remote_fileurl}" 2>&1) + curlcmd=$(curl -s --fail -L -o "${local_filedir}/${local_filename}" "${remote_fileurl}" 2>&1) local exitcode=$? if [ ${exitcode} -ne 0 ]; then echo -e "FAIL" @@ -127,14 +125,13 @@ fn_bootstrap_fetch_file_github(){ # Installer menu. fn_print_center() { - columns="$(tput cols)" + columns=$(tput cols) line="$*" printf "%*s\n" $(( (${#line} + columns) / 2)) "${line}" } fn_print_horizontal(){ - char="${1:-=}" - printf '%*s\n' "${COLUMNS:-$(tput cols)}" '' | tr ' ' "${char}" + printf '%*s\n' "${COLUMNS:-$(tput cols)}" '' | tr ' ' "=" } # Bash menu. @@ -237,7 +234,7 @@ fn_install_file(){ if [ -e "${local_filename}" ]; then i=2 while [ -e "${local_filename}-${i}" ] ; do - let i++ + (( i++ )) done local_filename="${local_filename}-${i}" fi diff --git a/tests/tests_fctrserver.sh b/tests/tests_fctrserver.sh index 8bd5e27f2..1a9fae98b 100644 --- a/tests/tests_fctrserver.sh +++ b/tests/tests_fctrserver.sh @@ -23,8 +23,8 @@ fi version="v19.9.0" shortname="fctr" gameservername="fctrserver" -rootdir="$(dirname "$(readlink -f "${BASH_SOURCE[0]}")")" -selfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" +rootdir=$(dirname "$(readlink -f "${BASH_SOURCE[0]}")") +selfname=$(basename "$(readlink -f "${BASH_SOURCE[0]}")") lockselfname=".${selfname}.lock" lgsmdir="${rootdir}/lgsm" logdir="${rootdir}/log" @@ -60,7 +60,7 @@ githubbranch="${TRAVIS_BRANCH}" # Core function that is required first. core_functions.sh(){ - functionfile="${FUNCNAME}" + functionfile="${FUNCNAME[0]}" fn_bootstrap_fetch_file_github "lgsm/functions" "core_functions.sh" "${functionsdir}" "chmodx" "run" "noforcedl" "nomd5" } @@ -81,14 +81,12 @@ fn_bootstrap_fetch_file(){ if [ ! -d "${local_filedir}" ]; then mkdir -p "${local_filedir}" fi - # Defines curl path. - curlpath=$(command -v curl 2>/dev/null) # If curl exists download file. - if [ "$(basename "${curlpath}")" == "curl" ]; then + if [ -n "$(command -v curl 2>/dev/null)" ]; then # Trap to remove part downloaded files. echo -en " fetching ${local_filename}...\c" - curlcmd=$(${curlpath} -s --fail -L -o "${local_filedir}/${local_filename}" "${remote_fileurl}" 2>&1) + curlcmd=$(curl -s --fail -L -o "${local_filedir}/${local_filename}" "${remote_fileurl}" 2>&1) local exitcode=$? if [ ${exitcode} -ne 0 ]; then echo -e "FAIL" @@ -138,14 +136,13 @@ fn_bootstrap_fetch_file_github(){ # Installer menu. fn_print_center() { - columns="$(tput cols)" + columns=$(tput cols) line="$*" printf "%*s\n" $(( (${#line} + columns) / 2)) "${line}" } fn_print_horizontal(){ - char="${1:-=}" - printf '%*s\n' "${COLUMNS:-$(tput cols)}" '' | tr ' ' "${char}" + printf '%*s\n' "${COLUMNS:-$(tput cols)}" '' | tr ' ' "=" } # Bash menu. @@ -248,7 +245,7 @@ fn_install_file(){ if [ -e "${local_filename}" ]; then i=2 while [ -e "${local_filename}-${i}" ] ; do - let i++ + (( i++ )) done local_filename="${local_filename}-${i}" fi diff --git a/tests/tests_jc2server.sh b/tests/tests_jc2server.sh index 319b6704a..780d01f4f 100644 --- a/tests/tests_jc2server.sh +++ b/tests/tests_jc2server.sh @@ -23,8 +23,8 @@ fi version="v19.9.0" shortname="jc2" gameservername="jc2server" -rootdir="$(dirname "$(readlink -f "${BASH_SOURCE[0]}")")" -selfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" +rootdir=$(dirname "$(readlink -f "${BASH_SOURCE[0]}")") +selfname=$(basename "$(readlink -f "${BASH_SOURCE[0]}")") lockselfname=".${selfname}.lock" lgsmdir="${rootdir}/lgsm" logdir="${rootdir}/log" @@ -60,7 +60,7 @@ githubbranch="${TRAVIS_BRANCH}" # Core function that is required first. core_functions.sh(){ - functionfile="${FUNCNAME}" + functionfile="${FUNCNAME[0]}" fn_bootstrap_fetch_file_github "lgsm/functions" "core_functions.sh" "${functionsdir}" "chmodx" "run" "noforcedl" "nomd5" } @@ -79,14 +79,12 @@ fn_bootstrap_fetch_file(){ if [ ! -d "${local_filedir}" ]; then mkdir -p "${local_filedir}" fi - # Defines curl path. - curlpath=$(command -v curl 2>/dev/null) # If curl exists download file. - if [ "$(basename "${curlpath}")" == "curl" ]; then + if [ "$(command -v curl 2>/dev/null)" ]; then # Trap to remove part downloaded files. echo -en " fetching ${local_filename}...\c" - curlcmd=$(${curlpath} -s --fail -L -o "${local_filedir}/${local_filename}" "${remote_fileurl}" 2>&1) + curlcmd=$(curl -s --fail -L -o "${local_filedir}/${local_filename}" "${remote_fileurl}" 2>&1) local exitcode=$? if [ ${exitcode} -ne 0 ]; then echo -e "FAIL" @@ -111,6 +109,7 @@ fn_bootstrap_fetch_file(){ if [ -f "${local_filedir}/${local_filename}" ]; then # Run file if run is set. if [ "${run}" == "run" ]; then + # shellcheck source=/dev/null source "${local_filedir}/${local_filename}" fi fi @@ -135,14 +134,13 @@ fn_bootstrap_fetch_file_github(){ # Installer menu. fn_print_center() { - columns="$(tput cols)" + columns=$(tput cols) line="$*" printf "%*s\n" $(( (${#line} + columns) / 2)) "${line}" } fn_print_horizontal(){ - char="${1:-=}" - printf '%*s\n' "${COLUMNS:-$(tput cols)}" '' | tr ' ' "${char}" + printf '%*s\n' "${COLUMNS:-$(tput cols)}" '' | tr ' ' "=" } # Bash menu. diff --git a/tests/tests_mcserver.sh b/tests/tests_mcserver.sh index 1b4aa74a7..190612bf3 100644 --- a/tests/tests_mcserver.sh +++ b/tests/tests_mcserver.sh @@ -23,8 +23,8 @@ fi version="v19.9.0" shortname="mc" gameservername="mcserver" -rootdir="$(dirname "$(readlink -f "${BASH_SOURCE[0]}")")" -selfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" +rootdir=$(dirname "$(readlink -f "${BASH_SOURCE[0]}")") +selfname=$(basename "$(readlink -f "${BASH_SOURCE[0]}")") lockselfname=".${selfname}.lock" lgsmdir="${rootdir}/lgsm" logdir="${rootdir}/log" @@ -60,7 +60,7 @@ githubbranch="${TRAVIS_BRANCH}" # Core function that is required first. core_functions.sh(){ - functionfile="${FUNCNAME}" + functionfile="${FUNCNAME[0]}" fn_bootstrap_fetch_file_github "lgsm/functions" "core_functions.sh" "${functionsdir}" "chmodx" "run" "noforcedl" "nomd5" } @@ -79,14 +79,12 @@ fn_bootstrap_fetch_file(){ if [ ! -d "${local_filedir}" ]; then mkdir -p "${local_filedir}" fi - # Defines curl path. - curlpath=$(command -v curl 2>/dev/null) # If curl exists download file. - if [ "$(basename "${curlpath}")" == "curl" ]; then + if [ -n "$(command -v curl 2>/dev/null)" ]; then # Trap to remove part downloaded files. echo -en " fetching ${local_filename}...\c" - curlcmd=$(${curlpath} -s --fail -L -o "${local_filedir}/${local_filename}" "${remote_fileurl}" 2>&1) + curlcmd=$(curl -s --fail -L -o "${local_filedir}/${local_filename}" "${remote_fileurl}" 2>&1) local exitcode=$? if [ ${exitcode} -ne 0 ]; then echo -e "FAIL" @@ -111,7 +109,7 @@ fn_bootstrap_fetch_file(){ if [ -f "${local_filedir}/${local_filename}" ]; then # Run file if run is set. if [ "${run}" == "run" ]; then - # shellcheck source=/dev/null + # shellcheck source=/dev/null source "${local_filedir}/${local_filename}" fi fi @@ -136,14 +134,13 @@ fn_bootstrap_fetch_file_github(){ # Installer menu. fn_print_center() { - columns="$(tput cols)" + columns=$(tput cols) line="$*" printf "%*s\n" $(( (${#line} + columns) / 2)) "${line}" } fn_print_horizontal(){ - char="${1:-=}" - printf '%*s\n' "${COLUMNS:-$(tput cols)}" '' | tr ' ' "${char}" + printf '%*s\n' "${COLUMNS:-$(tput cols)}" '' | tr ' ' "=" } # Bash menu. diff --git a/tests/tests_ts3server.sh b/tests/tests_ts3server.sh index 16e1ddd88..080a2c9a3 100644 --- a/tests/tests_ts3server.sh +++ b/tests/tests_ts3server.sh @@ -23,8 +23,8 @@ fi version="v19.9.0" shortname="ts3" gameservername="ts3server" -rootdir="$(dirname "$(readlink -f "${BASH_SOURCE[0]}")")" -selfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" +rootdir=$(dirname "$(readlink -f "${BASH_SOURCE[0]}")") +selfname=$(basename "$(readlink -f "${BASH_SOURCE[0]}")") lockselfname=".${selfname}.lock" lgsmdir="${rootdir}/lgsm" logdir="${rootdir}/log" @@ -60,7 +60,7 @@ githubbranch="${TRAVIS_BRANCH}" # Core function that is required first. core_functions.sh(){ - functionfile="${FUNCNAME}" + functionfile="${FUNCNAME[0]}" fn_bootstrap_fetch_file_github "lgsm/functions" "core_functions.sh" "${functionsdir}" "chmodx" "run" "noforcedl" "nomd5" } @@ -79,14 +79,12 @@ fn_bootstrap_fetch_file(){ if [ ! -d "${local_filedir}" ]; then mkdir -p "${local_filedir}" fi - # Defines curl path. - curlpath=$(command -v curl 2>/dev/null) # If curl exists download file. - if [ "$(basename "${curlpath}")" == "curl" ]; then + if [ -n "$(command -v curl 2>/dev/null)" ]; then # Trap to remove part downloaded files. echo -en " fetching ${local_filename}...\c" - curlcmd=$(${curlpath} -s --fail -L -o "${local_filedir}/${local_filename}" "${remote_fileurl}" 2>&1) + curlcmd=$(curl -s --fail -L -o "${local_filedir}/${local_filename}" "${remote_fileurl}" 2>&1) local exitcode=$? if [ ${exitcode} -ne 0 ]; then echo -e "FAIL" @@ -111,7 +109,7 @@ fn_bootstrap_fetch_file(){ if [ -f "${local_filedir}/${local_filename}" ]; then # Run file if run is set. if [ "${run}" == "run" ]; then - # shellcheck source=/dev/null + # shellcheck source=/dev/null source "${local_filedir}/${local_filename}" fi fi @@ -136,14 +134,13 @@ fn_bootstrap_fetch_file_github(){ # Installer menu. fn_print_center() { - columns="$(tput cols)" + columns=$(tput cols) line="$*" printf "%*s\n" $(( (${#line} + columns) / 2)) "${line}" } fn_print_horizontal(){ - char="${1:-=}" - printf '%*s\n' "${COLUMNS:-$(tput cols)}" '' | tr ' ' "${char}" + printf '%*s\n' "${COLUMNS:-$(tput cols)}" '' | tr ' ' "=" } # Bash menu. @@ -246,7 +243,7 @@ fn_install_file(){ if [ -e "${local_filename}" ]; then i=2 while [ -e "${local_filename}-${i}" ] ; do - let i++ + (( i++ )) done local_filename="${local_filename}-${i}" fi From fc72caeff78cf071889eef75fc572382f6804c9c Mon Sep 17 00:00:00 2001 From: Frisasky Date: Thu, 28 Nov 2019 05:01:05 +0800 Subject: [PATCH 242/534] feat(refactor): double quote for branch name (#2618) --- lgsm/functions/command_validate.sh | 4 ++-- lgsm/functions/install_server_files.sh | 10 +++++----- lgsm/functions/update_steamcmd.sh | 4 ++-- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/lgsm/functions/command_validate.sh b/lgsm/functions/command_validate.sh index 1c39ed67e..83d9f119b 100644 --- a/lgsm/functions/command_validate.sh +++ b/lgsm/functions/command_validate.sh @@ -23,9 +23,9 @@ fn_validation(){ fi if [ "${appid}" == "90" ]; then - ${unbuffer} ./steamcmd.sh +login "${steamuser}" "${steampass}" +force_install_dir "${serverfiles}" +app_info_print 70 +app_set_config 90 mod "${appidmod}" +app_update "${appid}" ${branch} +app_update "${appid}" -beta ${branch} validate +quit | tee -a "${lgsmlog}" + ${unbuffer} ./steamcmd.sh +login "${steamuser}" "${steampass}" +force_install_dir "${serverfiles}" +app_info_print 70 +app_set_config 90 mod "${appidmod}" +app_update "${appid}" "${branch}" +app_update "${appid}" -beta "${branch}" validate +quit | tee -a "${lgsmlog}" else - ${unbuffer} ./steamcmd.sh +login "${steamuser}" "${steampass}" +force_install_dir "${serverfiles}" +app_update "${appid}" -beta ${branch} validate +quit | tee -a "${lgsmlog}" + ${unbuffer} ./steamcmd.sh +login "${steamuser}" "${steampass}" +force_install_dir "${serverfiles}" +app_update "${appid}" -beta "${branch}" validate +quit | tee -a "${lgsmlog}" 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 27ad82e32..40dfe9ad2 100644 --- a/lgsm/functions/install_server_files.sh +++ b/lgsm/functions/install_server_files.sh @@ -104,18 +104,18 @@ fn_install_server_files_steamcmd(){ if [ "${counter}" -le "4" ]; then if [ "${appid}" == "90" ]; then - ${unbuffer} ./steamcmd.sh +login "${steamuser}" "${steampass}" +force_install_dir "${serverfiles}" +app_set_config 90 mod "${appidmod}" +app_update "${appid}" -beta ${branch} +quit + ${unbuffer} ./steamcmd.sh +login "${steamuser}" "${steampass}" +force_install_dir "${serverfiles}" +app_set_config 90 mod "${appidmod}" +app_update "${appid}" -beta "${branch}" +quit local exitcode=$? else - ${unbuffer} ./steamcmd.sh +login "${steamuser}" "${steampass}" +force_install_dir "${serverfiles}" +app_update "${appid}" -beta ${branch} +quit + ${unbuffer} ./steamcmd.sh +login "${steamuser}" "${steampass}" +force_install_dir "${serverfiles}" +app_update "${appid}" -beta "${branch}" +quit local exitcode=$? 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}" -beta ${branch} validate +quit + ${unbuffer} ./steamcmd.sh +login "${steamuser}" "${steampass}" +force_install_dir "${serverfiles}" +app_set_config 90 mod "${appidmod}" +app_update "${appid}" -beta "${branch}" validate +quit local exitcode=$? else - ${unbuffer} ./steamcmd.sh +login "${steamuser}" "${steampass}" +force_install_dir "${serverfiles}" +app_update "${appid}" -beta ${branch} validate +quit + ${unbuffer} ./steamcmd.sh +login "${steamuser}" "${steampass}" +force_install_dir "${serverfiles}" +app_update "${appid}" -beta "${branch}" validate +quit local exitcode=$? fi fi @@ -133,7 +133,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 "${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=$? done fi diff --git a/lgsm/functions/update_steamcmd.sh b/lgsm/functions/update_steamcmd.sh index a53ee04e0..38b7445de 100644 --- a/lgsm/functions/update_steamcmd.sh +++ b/lgsm/functions/update_steamcmd.sh @@ -19,9 +19,9 @@ fn_update_steamcmd_dl(){ cd "${steamcmddir}" || exit if [ "${appid}" == "90" ]; then - ${unbuffer} ./steamcmd.sh +login "${steamuser}" "${steampass}" +force_install_dir "${serverfiles}" +app_set_config 90 mod "${appidmod}" +app_update "${appid}" -beta ${branch} +quit | tee -a "${lgsmlog}" + ${unbuffer} ./steamcmd.sh +login "${steamuser}" "${steampass}" +force_install_dir "${serverfiles}" +app_set_config 90 mod "${appidmod}" +app_update "${appid}" -beta "${branch}" +quit | tee -a "${lgsmlog}" else - ${unbuffer} ./steamcmd.sh +login "${steamuser}" "${steampass}" +force_install_dir "${serverfiles}" +app_update "${appid}" -beta ${branch} +quit | tee -a "${lgsmlog}" + ${unbuffer} ./steamcmd.sh +login "${steamuser}" "${steampass}" +force_install_dir "${serverfiles}" +app_update "${appid}" -beta "${branch}" +quit | tee -a "${lgsmlog}" fi fix.sh } From 75c32383773bf1baaa9cd851919c4c0f68431b93 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Wed, 27 Nov 2019 21:08:24 +0000 Subject: [PATCH 243/534] feat(testing): add code coverage and streamline unit testing (#2620) --- .travis.yml | 57 +++++++++++++++----------------- README.md | 2 +- lgsm/functions/command_fastdl.sh | 4 +-- tests/tests_fctrserver.sh | 26 ++++++++------- tests/tests_jc2server.sh | 8 +++-- tests/tests_kcov.sh | 14 ++++++++ tests/tests_mcserver.sh | 8 +++-- tests/tests_ts3server.sh | 8 +++-- 8 files changed, 75 insertions(+), 52 deletions(-) create mode 100644 tests/tests_kcov.sh diff --git a/.travis.yml b/.travis.yml index bb94b8033..d3ad78ad8 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,49 +1,44 @@ language: node_js dist: bionic node_js: - - 10 + - "stable" +env: + global: + secure: VsS98cwJ5X/Ev3HEm7KEOPftYay+7jNTHepTS7d+gQNHcDR1UYKTmqlQNSIoUC52Ejs1cHq43jOfle4330zDPOYI0v5BMri6/iZKpmMxAw6KWNiUgSkziTP2kHC4NRLwEoU2WQTI3JZQjrBEfsPmD81+yR/eWXV3rph+YcSOxao= before_script: - - curl -L "https://storage.googleapis.com/google-code-archive-downloads/v2/code.google.com/shunit2/shunit2-2.1.6.tgz" | tar zx + - curl -L "https://storage.googleapis.com/google-code-archive-downloads/v2/code.google.com/shunit2/shunit2-2.1.6.tgz" | tar zx + install: - npm install gamedig + - npm install gamedig + addons: apt: packages: - mailutils - postfix - - curl - - wget - - file - - bzip2 - - gzip - - unzip - - bsdmainutils - - python3 - - util-linux - - ca-certificates - - binutils - - bc - jq - - tmux - lib32gcc1 - - libstdc++6 - libstdc++6:i386 - - net-tools - - iproute2 - shellcheck + - libcurl4-openssl-dev + - libdw-dev + - cmake jobs: include: - - stage: jobs - script: bash tests/tests_jc2server.sh - - # stage name not required - script: bash tests/tests_fctrserver.sh - - # stage name not required - script: bash tests/tests_mcserver.sh - - # stage name not required - script: bash tests/tests_ts3server.sh - - # stage name not required - script: bash tests/tests_defaultcfg/tests_defaultcfg.sh - - # retired as codacy does this check. - # script: bash tests/tests_shellcheck.sh + - stage: "Jobs" + name: "code coverage" + script: bash tests/tests_kcov.sh; kcov --bash-method=DEBUG coverage tests/tests_mcserver.sh + - script: bash tests/tests_mcserver.sh + name: "Minecraft" + - script: bash tests/tests_jc2server.sh + name: "Just Cause 2" + - script: bash tests/tests_fctrserver.sh + name: "Factorio" + - script: bash tests/tests_ts3server.sh + name: "Teamspeak 3" + - script: bash tests/tests_defaultcfg/tests_defaultcfg.sh + name: "_default.cfg checks" +after_success: +- bash <(curl -Ls https://coverage.codacy.com/get.sh) diff --git a/README.md b/README.md index 6c32bab75..25996581a 100644 --- a/README.md +++ b/README.md @@ -3,7 +3,7 @@ LinuxGSM

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

-[![LinuxGSM](https://img.shields.io/badge/-LinuxGSM-2b2b2b.svg?logo=data%3Aimage%2Fpng%3Bbase64%2CiVBORw0KGgoAAAANSUhEUgAAACsAAABACAYAAACDbo5ZAAAGD0lEQVR4AcWYa2wUVRvHz75c2vJ2disXoUBEVIioRAx%2BMIFA1IRwUS6KCCiIKBrvhEYiiGm5iBgk8QOGEgUUDYTttmVZWFr2UmwURS6iYAoCtmisElSsdHdbkT7%2BTzoNy%2BGc2dm54C%2F5Rdkz85x%2FZ86ZOXOYXYhIg3Phx%2FA4PAcv6f%2Btg5vhHJjP3EcZsgsshufJHH%2FAJbDztQ7aG35J1vgCXn%2BtgvrgEbLHYei9FmE3kDOUuh10OGwjZ7gEh7kZ9gNyllK3gnrg7%2BQs56DHjbCDyB0GuRF2ArnDeDfCziF3mO1G2FfJHRa4EXYpuUOxG2GXkzuUuBH2TXKH5W6ELSV3eM%2BNsOUk5yQcAY8p2uvgSPitor3MjbB1UOQXOFBvHwpbhPYWOExvL4SNUOQ7p4P2JTlzhOPmCu0vCu1PQpE2WOhk2MdJjk9y7HNwP1wEPUJbAcmZ6WTYrYolnifbxZBiibnFySHQCkUaLdY7C0V4%2FT5OhF1JcuIW6%2B0lOcvsBi2Ezao3j8Ov7Quwj52w60jNKIs1R5GatVaDDoEXSU4D7GSxbidYT3IuwjusFK0mNUVMwaZNNbl%2B%2F87hoVCom0HthaQmnG3QB0lNPcxlCvz%2B0GtlZTuorCxYYlA%2FDzbY%2FnrAgV3hCVLzCDMgEAi9wMMi9IIM%2FUwnNXWwi5mwRaSmmmXA798xq%2F3Khp420VeE1LyS6eQeBhttSXgzywCCToIUCOyYZvKLOWWwkdfd6ORVpGYJM0F5efDe9mEQHGty2BWTmhVGO4PNBmOoKzMBxmo%2FhD25dWvljSbD5hjMkb9gT9lJq63Mzi1bKkbjloc7xBWtwiRrDASCVRi%2FRxA8if%2BvrawMTzYI%2FACpeUv2KFFtDcUyTKilCHcis8G1Ga7wHpLzG8wVFs1K7jaeUKHZfIxmkj9%2FM4S9x9RGiMEudo0QbCVu9Xqn5PWEwLUk5%2FP0iaXac53I0kAH9Sau4m54lo%2FdTMfyekLYKQZ7ub34AbMMlmw5irC2VYTN0fuVMYMf8JHxJ7L7YYXAlSRnI2%2F8RtH4siTsDMz%2BZ5yS15OEXUxyDjGD1%2BvEq8MG16CDzY6JepKwT6geYbzxb0XjGMl7vwGSgzZIwo4nOa1M8Yr9Afb%2Fj8L21%2FsXaeaNZ2A6KTiEASph%2F0vF80cn4tokqu79fzfCUk2vfF4%2FFdFGEjGPHvg2yWrsDG%2F4%2BqpZB8jPOiXjWk0y5iXdM3XhKUvxBTA9UvHuvNPh%2Bzb%2BWj10z6nwuHWBbQFMvNCjKnn7qd1jS%2Fnx9VX3b6jC%2BbwOr5eMe3%2B83IcW4%2F3qgT%2BUTbA9srGaiHsn8AKiF6Ld%2FxF%2FOx6eeAJXabvK78MTTornNMd6XJTVR7%2Fj9bBjhFxV%2FMc1kJOAy2AeA%2FgrV4mFVDZFCqm8rEJ6qysCAWqK9iaztRJRbWXa4moFTELOav7jY%2FqAvoXp0Gc9NX7bIZl17%2FZl0rC1wRLeno0NvP%2B0CTcYNnS8wW6CtzNANaxzKqo9hRNOQ8rGo7tmSsMe2zWdt2frqVRcm5s2fofCgawDNHRNxnyfqgsYez4y4ADCjRM9H73hsNWafILTQdaFiSTj%2BQ%2FxA6yH7d%2BCmR8XbYr0a7VTF2N4siSsb5qdos3R6%2FjGxpULFfw7EfORnbrI9TAToX0sD40%2F2ylcGdh2Rdhg%2BSf2gka9jRTqK9%2BGwgHz7RTfVbHxirDhivdthYUvMRX8aYAD9lstvi%2B0aDL2DUZ0eCBUNNVG0IP65FLTWqPdiqdC0koHTVXe7iyNRG23QotBEy1RbTAzQyrmnYUT2rLsoA13JpcB4eVC2daBM1g2JGLekmwf5On7EJfngfZTNnVSce8bFjaTmQdvs%2FXmO%2FJVpoXdx3RSUe9O00Fj3nUdy0RLgRHiHXOPGW1h2uKZ07c9rG%2Bxyefp23pQeyBIEQoavYlakrG8fnrY5yHn2fbxXzAgw7m8bT5zkkSk4C7cpmOK21esB%2FXAQ5DzFfTo43%2BF%2FDzf0eZ4wZ3MDSjMcvD6nIeOahGgia%2FyU3HforTPkWkwnakdn0cI9jqfbPjD%2FuQLJr6644snlgX%2FApOMoyd1R5%2FxAAAAAElFTkSuQmCC)](https://linuxgsm.com) [![Build Status](https://travis-ci.com/GameServerManagers/LinuxGSM.svg?branch=master)](https://travis-ci.com/GameServerManagers/LinuxGSM) [![Codacy Badge](https://api.codacy.com/project/badge/Grade/3e98be27840043a090c3ab6e35db44b0)](https://app.codacy.com/app/GameServerManagers/LinuxGSM?utm_source=github.com&utm_medium=referral&utm_content=GameServerManagers/LinuxGSM&utm_campaign=Badge_Grade_Dashboard) [![Discord](https://discordapp.com/api/guilds/127498813903601664/widget.png?style=shield)](https://linuxgsm.com/discord) [![MIT Licence](https://badges.frapsoft.com/os/mit/mit.svg?v=103)](https://github.com/GameServerManagers/LinuxGSM/blob/master/LICENSE) [![made-with-bash](https://img.shields.io/badge/-Made%20with%20Bash-1f425f.svg?logo=image%2Fpng%3Bbase64%2CiVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyZpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw%2FeHBhY2tldCBiZWdpbj0i77u%2FIiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8%2BIDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNi1jMTExIDc5LjE1ODMyNSwgMjAxNS8wOS8xMC0wMToxMDoyMCAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENDIDIwMTUgKFdpbmRvd3MpIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOkE3MDg2QTAyQUZCMzExRTVBMkQxRDMzMkJDMUQ4RDk3IiB4bXBNTTpEb2N1bWVudElEPSJ4bXAuZGlkOkE3MDg2QTAzQUZCMzExRTVBMkQxRDMzMkJDMUQ4RDk3Ij4gPHhtcE1NOkRlcml2ZWRGcm9tIHN0UmVmOmluc3RhbmNlSUQ9InhtcC5paWQ6QTcwODZBMDBBRkIzMTFFNUEyRDFEMzMyQkMxRDhEOTciIHN0UmVmOmRvY3VtZW50SUQ9InhtcC5kaWQ6QTcwODZBMDFBRkIzMTFFNUEyRDFEMzMyQkMxRDhEOTciLz4gPC9yZGY6RGVzY3JpcHRpb24%2BIDwvcmRmOlJERj4gPC94OnhtcG1ldGE%2BIDw%2FeHBhY2tldCBlbmQ9InIiPz6lm45hAAADkklEQVR42qyVa0yTVxzGn7d9Wy03MS2ii8s%2BeokYNQSVhCzOjXZOFNF4jx%2BMRmPUMEUEqVG36jo2thizLSQSMd4N8ZoQ8RKjJtooaCpK6ZoCtRXKpRempbTv5ey83bhkAUphz8fznvP8znn%2B%2F3NeEEJgNBoRRSmz0ub%2FfuxEacBg%2FDmYtiCjgo5NG2mBXq%2BH5I1ogMRk9Zbd%2BQU2e1ML6VPLOyf5tvBQ8yT1lG10imxsABm7SLs898GTpyYynEzP60hO3trHDKvMigUwdeaceacqzp7nOI4n0SSIIjl36ao4Z356OV07fSQAk6xJ3XGg%2BLCr1d1OYlVHp4eUHPnerU79ZA%2F1kuv1JQMAg%2BE4O2P23EumF3VkvHprsZKMzKwbRUXFEyTvSIEmTVbrysp%2BWr8wfQHGK6WChVa3bKUmdWou%2BjpArdGkzZ41c1zG%2Fu5uGH4swzd561F%2BuhIT4%2BLnSuPsv9%2BJKIpjNr9dXYOyk7%2FBZrcjIT4eCnoKgedJP4BEqhG77E3NKP31FO7cfQA5K0dSYuLgz2TwCWJSOBzG6crzKK%2BohNfni%2Bx6OMUMMNe%2Fgf7ocbw0v0acKg6J8Ql0q%2BT%2FAXR5PNi5dz9c71upuQqCKFAD%2BYhrZLEAmpodaHO3Qy6TI3NhBpbrshGtOWKOSMYwYGQM8nJzoFJNxP2HjyIQho4PewK6hBktoDcUwtIln4PjOWzflQ%2Be5yl0yCCYgYikTclGlxadio%2BBQCSiW1UXoVGrKYwH4RgMrjU1HAB4vR6LzWYfFUCKxfS8Ftk5qxHoCUQAUkRJaSEokkV6Y%2F%2BJUOC4hn6A39NVXVBYeNP8piH6HeA4fPbpdBQV5KOx0QaL1YppX3Jgk0TwH2Vg6S3u%2BdB91%2B%2FpuNYPYFl5uP5V7ZqvsrX7jxqMXR6ff3gCQSTzFI0a1TX3wIs8ul%2Bq4HuWAAiM39vhOuR1O1fQ2gT%2F26Z8Z5vrl2OHi9OXZn995nLV9aFfS6UC9JeJPfuK0NBohWpCHMSAAsFe74WWP%2BvT25wtP9Bpob6uGqqyDnOtaeumjRu%2ByFu36VntK%2FPA5umTJeUtPWZSU9BCgud661odVp3DZtkc7AnYR33RRC708PrVi1larW7XwZIjLnd7R6SgSqWSNjU1B3F72pz5TZbXmX5vV81Yb7Lg7XT%2FUXriu8XLVqw6c6XqWnBKiiYU%2BMt3wWF7u7i91XlSEITwSAZ%2FCzAAHsJVbwXYFFEAAAAASUVORK5CYII%3D)](https://www.gnu.org/software/bash/) [![All Contributors](https://img.shields.io/badge/all_contributors-9-orange.svg?style=flat-square)](#contributors) +[![LinuxGSM](https://img.shields.io/badge/-LinuxGSM-2b2b2b.svg?logo=data%3Aimage%2Fpng%3Bbase64%2CiVBORw0KGgoAAAANSUhEUgAAACsAAABACAYAAACDbo5ZAAAGD0lEQVR4AcWYa2wUVRvHz75c2vJ2disXoUBEVIioRAx%2BMIFA1IRwUS6KCCiIKBrvhEYiiGm5iBgk8QOGEgUUDYTttmVZWFr2UmwURS6iYAoCtmisElSsdHdbkT7%2BTzoNy%2BGc2dm54C%2F5Rdkz85x%2FZ86ZOXOYXYhIg3Phx%2FA4PAcv6f%2Btg5vhHJjP3EcZsgsshufJHH%2FAJbDztQ7aG35J1vgCXn%2BtgvrgEbLHYei9FmE3kDOUuh10OGwjZ7gEh7kZ9gNyllK3gnrg7%2BQs56DHjbCDyB0GuRF2ArnDeDfCziF3mO1G2FfJHRa4EXYpuUOxG2GXkzuUuBH2TXKH5W6ELSV3eM%2BNsOUk5yQcAY8p2uvgSPitor3MjbB1UOQXOFBvHwpbhPYWOExvL4SNUOQ7p4P2JTlzhOPmCu0vCu1PQpE2WOhk2MdJjk9y7HNwP1wEPUJbAcmZ6WTYrYolnifbxZBiibnFySHQCkUaLdY7C0V4%2FT5OhF1JcuIW6%2B0lOcvsBi2Ezao3j8Ov7Quwj52w60jNKIs1R5GatVaDDoEXSU4D7GSxbidYT3IuwjusFK0mNUVMwaZNNbl%2B%2F87hoVCom0HthaQmnG3QB0lNPcxlCvz%2B0GtlZTuorCxYYlA%2FDzbY%2FnrAgV3hCVLzCDMgEAi9wMMi9IIM%2FUwnNXWwi5mwRaSmmmXA798xq%2F3Khp420VeE1LyS6eQeBhttSXgzywCCToIUCOyYZvKLOWWwkdfd6ORVpGYJM0F5efDe9mEQHGty2BWTmhVGO4PNBmOoKzMBxmo%2FhD25dWvljSbD5hjMkb9gT9lJq63Mzi1bKkbjloc7xBWtwiRrDASCVRi%2FRxA8if%2BvrawMTzYI%2FACpeUv2KFFtDcUyTKilCHcis8G1Ga7wHpLzG8wVFs1K7jaeUKHZfIxmkj9%2FM4S9x9RGiMEudo0QbCVu9Xqn5PWEwLUk5%2FP0iaXac53I0kAH9Sau4m54lo%2FdTMfyekLYKQZ7ub34AbMMlmw5irC2VYTN0fuVMYMf8JHxJ7L7YYXAlSRnI2%2F8RtH4siTsDMz%2BZ5yS15OEXUxyDjGD1%2BvEq8MG16CDzY6JepKwT6geYbzxb0XjGMl7vwGSgzZIwo4nOa1M8Yr9Afb%2Fj8L21%2FsXaeaNZ2A6KTiEASph%2F0vF80cn4tokqu79fzfCUk2vfF4%2FFdFGEjGPHvg2yWrsDG%2F4%2BqpZB8jPOiXjWk0y5iXdM3XhKUvxBTA9UvHuvNPh%2Bzb%2BWj10z6nwuHWBbQFMvNCjKnn7qd1jS%2Fnx9VX3b6jC%2BbwOr5eMe3%2B83IcW4%2F3qgT%2BUTbA9srGaiHsn8AKiF6Ld%2FxF%2FOx6eeAJXabvK78MTTornNMd6XJTVR7%2Fj9bBjhFxV%2FMc1kJOAy2AeA%2FgrV4mFVDZFCqm8rEJ6qysCAWqK9iaztRJRbWXa4moFTELOav7jY%2FqAvoXp0Gc9NX7bIZl17%2FZl0rC1wRLeno0NvP%2B0CTcYNnS8wW6CtzNANaxzKqo9hRNOQ8rGo7tmSsMe2zWdt2frqVRcm5s2fofCgawDNHRNxnyfqgsYez4y4ADCjRM9H73hsNWafILTQdaFiSTj%2BQ%2FxA6yH7d%2BCmR8XbYr0a7VTF2N4siSsb5qdos3R6%2FjGxpULFfw7EfORnbrI9TAToX0sD40%2F2ylcGdh2Rdhg%2BSf2gka9jRTqK9%2BGwgHz7RTfVbHxirDhivdthYUvMRX8aYAD9lstvi%2B0aDL2DUZ0eCBUNNVG0IP65FLTWqPdiqdC0koHTVXe7iyNRG23QotBEy1RbTAzQyrmnYUT2rLsoA13JpcB4eVC2daBM1g2JGLekmwf5On7EJfngfZTNnVSce8bFjaTmQdvs%2FXmO%2FJVpoXdx3RSUe9O00Fj3nUdy0RLgRHiHXOPGW1h2uKZ07c9rG%2Bxyefp23pQeyBIEQoavYlakrG8fnrY5yHn2fbxXzAgw7m8bT5zkkSk4C7cpmOK21esB%2FXAQ5DzFfTo43%2BF%2FDzf0eZ4wZ3MDSjMcvD6nIeOahGgia%2FyU3HforTPkWkwnakdn0cI9jqfbPjD%2FuQLJr6644snlgX%2FApOMoyd1R5%2FxAAAAAElFTkSuQmCC)](https://linuxgsm.com) [![Build Status](https://travis-ci.com/GameServerManagers/LinuxGSM.svg?branch=master)](https://travis-ci.com/GameServerManagers/LinuxGSM) [![Codacy Badge](https://api.codacy.com/project/badge/Grade/3e98be27840043a090c3ab6e35db44b0)](https://app.codacy.com/app/GameServerManagers/LinuxGSM?utm_source=github.com&utm_medium=referral&utm_content=GameServerManagers/LinuxGSM&utm_campaign=Badge_Grade_Dashboard) [![Codacy Badge](https://api.codacy.com/project/badge/Coverage/9ef77095e98a43618ddd57381f86b4be)](https://www.codacy.com/manual/GameServerManagers/LinuxGSM?utm_source=github.com&utm_medium=referral&utm_content=GameServerManagers/LinuxGSM&utm_campaign=Badge_Coverage) [![Discord](https://discordapp.com/api/guilds/127498813903601664/widget.png?style=shield)](https://linuxgsm.com/discord) [![MIT Licence](https://badges.frapsoft.com/os/mit/mit.svg?v=103)](https://github.com/GameServerManagers/LinuxGSM/blob/master/LICENSE) [![made-with-bash](https://img.shields.io/badge/-Made%20with%20Bash-1f425f.svg?logo=image%2Fpng%3Bbase64%2CiVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyZpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw%2FeHBhY2tldCBiZWdpbj0i77u%2FIiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8%2BIDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNi1jMTExIDc5LjE1ODMyNSwgMjAxNS8wOS8xMC0wMToxMDoyMCAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENDIDIwMTUgKFdpbmRvd3MpIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOkE3MDg2QTAyQUZCMzExRTVBMkQxRDMzMkJDMUQ4RDk3IiB4bXBNTTpEb2N1bWVudElEPSJ4bXAuZGlkOkE3MDg2QTAzQUZCMzExRTVBMkQxRDMzMkJDMUQ4RDk3Ij4gPHhtcE1NOkRlcml2ZWRGcm9tIHN0UmVmOmluc3RhbmNlSUQ9InhtcC5paWQ6QTcwODZBMDBBRkIzMTFFNUEyRDFEMzMyQkMxRDhEOTciIHN0UmVmOmRvY3VtZW50SUQ9InhtcC5kaWQ6QTcwODZBMDFBRkIzMTFFNUEyRDFEMzMyQkMxRDhEOTciLz4gPC9yZGY6RGVzY3JpcHRpb24%2BIDwvcmRmOlJERj4gPC94OnhtcG1ldGE%2BIDw%2FeHBhY2tldCBlbmQ9InIiPz6lm45hAAADkklEQVR42qyVa0yTVxzGn7d9Wy03MS2ii8s%2BeokYNQSVhCzOjXZOFNF4jx%2BMRmPUMEUEqVG36jo2thizLSQSMd4N8ZoQ8RKjJtooaCpK6ZoCtRXKpRempbTv5ey83bhkAUphz8fznvP8znn%2B%2F3NeEEJgNBoRRSmz0ub%2FfuxEacBg%2FDmYtiCjgo5NG2mBXq%2BH5I1ogMRk9Zbd%2BQU2e1ML6VPLOyf5tvBQ8yT1lG10imxsABm7SLs898GTpyYynEzP60hO3trHDKvMigUwdeaceacqzp7nOI4n0SSIIjl36ao4Z356OV07fSQAk6xJ3XGg%2BLCr1d1OYlVHp4eUHPnerU79ZA%2F1kuv1JQMAg%2BE4O2P23EumF3VkvHprsZKMzKwbRUXFEyTvSIEmTVbrysp%2BWr8wfQHGK6WChVa3bKUmdWou%2BjpArdGkzZ41c1zG%2Fu5uGH4swzd561F%2BuhIT4%2BLnSuPsv9%2BJKIpjNr9dXYOyk7%2FBZrcjIT4eCnoKgedJP4BEqhG77E3NKP31FO7cfQA5K0dSYuLgz2TwCWJSOBzG6crzKK%2BohNfni%2Bx6OMUMMNe%2Fgf7ocbw0v0acKg6J8Ql0q%2BT%2FAXR5PNi5dz9c71upuQqCKFAD%2BYhrZLEAmpodaHO3Qy6TI3NhBpbrshGtOWKOSMYwYGQM8nJzoFJNxP2HjyIQho4PewK6hBktoDcUwtIln4PjOWzflQ%2Be5yl0yCCYgYikTclGlxadio%2BBQCSiW1UXoVGrKYwH4RgMrjU1HAB4vR6LzWYfFUCKxfS8Ftk5qxHoCUQAUkRJaSEokkV6Y%2F%2BJUOC4hn6A39NVXVBYeNP8piH6HeA4fPbpdBQV5KOx0QaL1YppX3Jgk0TwH2Vg6S3u%2BdB91%2B%2FpuNYPYFl5uP5V7ZqvsrX7jxqMXR6ff3gCQSTzFI0a1TX3wIs8ul%2Bq4HuWAAiM39vhOuR1O1fQ2gT%2F26Z8Z5vrl2OHi9OXZn995nLV9aFfS6UC9JeJPfuK0NBohWpCHMSAAsFe74WWP%2BvT25wtP9Bpob6uGqqyDnOtaeumjRu%2ByFu36VntK%2FPA5umTJeUtPWZSU9BCgud661odVp3DZtkc7AnYR33RRC708PrVi1larW7XwZIjLnd7R6SgSqWSNjU1B3F72pz5TZbXmX5vV81Yb7Lg7XT%2FUXriu8XLVqw6c6XqWnBKiiYU%2BMt3wWF7u7i91XlSEITwSAZ%2FCzAAHsJVbwXYFFEAAAAASUVORK5CYII%3D)](https://www.gnu.org/software/bash/) [![All Contributors](https://img.shields.io/badge/all_contributors-9-orange.svg?style=flat-square)](#contributors) [LinuxGSM](https://linuxgsm.com) is the command-line tool for quick, simple deployment and management of Linux dedicated game servers. diff --git a/lgsm/functions/command_fastdl.sh b/lgsm/functions/command_fastdl.sh index 81ad55e8a..d862c7ed8 100644 --- a/lgsm/functions/command_fastdl.sh +++ b/lgsm/functions/command_fastdl.sh @@ -194,7 +194,7 @@ fn_fastdl_preview(){ tput rc; tput el echo -e "gathering ${directory} ${allowed_extention} : ${fileswc}..." echo -e "${ext}" >> "${tmpdir}/fastdl_files_to_compress.txt" - done < <(find "${systemdir}/${directory}" -type f -iname ${allowed_extention}) + done < <(find "${systemdir}/${directory}" -type f -iname "${allowed_extention}") tput rc; tput el echo -e "gathering ${directory} ${allowed_extention} : ${fileswc}..." if [ ${fileswc} != 0 ]; then @@ -213,7 +213,7 @@ fn_fastdl_preview(){ # Calculates total file size. while read -r dufile; do filesize=$(stat -c %s "${dufile}") - filesizetotal=$(( ${filesizetotal} + ${filesize} )) + filesizetotal=$(( filesizetotal+filesize )) exitcode=$? if [ "${exitcode}" != 0 ]; then fn_print_fail_eol_nl diff --git a/tests/tests_fctrserver.sh b/tests/tests_fctrserver.sh index 1a9fae98b..97aea9caa 100644 --- a/tests/tests_fctrserver.sh +++ b/tests/tests_fctrserver.sh @@ -66,8 +66,6 @@ core_functions.sh(){ # Bootstrap # Fetches the core functions required before passed off to core_dl.sh. - -# Fetches core functions. fn_bootstrap_fetch_file(){ remote_fileurl="${1}" local_filedir="${2}" @@ -280,15 +278,15 @@ if [ "$(whoami)" == "root" ]; then fi fi -# Download the latest serverlist. This is the complete list of all supported servers. -fn_bootstrap_fetch_file_github "lgsm/data" "serverlist.csv" "${datadir}" "nochmodx" "norun" "forcedl" "nomd5" -if [ ! -f "${serverlist}" ]; then - echo -e "[ FAIL ] serverlist.csv could not be loaded." - exit 1 -fi - # LinuxGSM installer mode. if [ "${shortname}" == "core" ]; then + # Download the latest serverlist. This is the complete list of all supported servers. + fn_bootstrap_fetch_file_github "lgsm/data" "serverlist.csv" "${datadir}" "nochmodx" "norun" "forcedl" "nomd5" + if [ ! -f "${serverlist}" ]; then + echo -e "[ FAIL ] serverlist.csv could not be loaded." + exit 1 + fi + if [ "${userinput}" == "list" ]||[ "${userinput}" == "l" ]; then { tail -n +2 "${serverlist}" | awk -F "," '{print $2 "\t" $3}' @@ -380,7 +378,7 @@ else # Enables ANSI colours from core_messages.sh. Can be disabled with ansi=off. fn_ansi_loader # Prevents running of core_exit.sh for Travis-CI. - if [ -z "${travistest}" ]; then + if [ -z "${travistest}" ]; then getopt=$1 core_getopt.sh fi @@ -480,6 +478,8 @@ fn_test_result_na(){ fn_print_fail_nl "TEST N/A" } +sleeptime="0" + echo -e "=================================" echo -e "Travis CI Tests" echo -e "Linux Game Server Manager" @@ -1011,6 +1011,8 @@ echo -e "Using: ${gamename}" echo -e "=================================" requiredstatus="OFFLINE" fn_setstatus -fn_print_info "Tidying up directories." -rm -rfv "${serverfiles}" +if [ ! -v TRAVIS ]; then + fn_print_info "Tidying up directories." + rm -rfv "${serverfiles}" +fi core_exit.sh diff --git a/tests/tests_jc2server.sh b/tests/tests_jc2server.sh index 780d01f4f..b80af6554 100644 --- a/tests/tests_jc2server.sh +++ b/tests/tests_jc2server.sh @@ -478,6 +478,8 @@ fn_test_result_na(){ fn_print_fail_nl "TEST N/A" } +sleeptime="0" + echo -e "=================================" echo -e "Travis CI Tests" echo -e "Linux Game Server Manager" @@ -1170,6 +1172,8 @@ echo -e "Using: ${gamename}" echo -e "=================================" requiredstatus="OFFLINE" fn_setstatus -fn_print_info "Tidying up directories." -rm -rfv "${serverfiles}" +if [ ! -v TRAVIS ]; then + fn_print_info "Tidying up directories." + rm -rfv "${serverfiles}" +fi core_exit.sh diff --git a/tests/tests_kcov.sh b/tests/tests_kcov.sh new file mode 100644 index 000000000..743e2fda2 --- /dev/null +++ b/tests/tests_kcov.sh @@ -0,0 +1,14 @@ +#!/bin/bash +echo -e "Installing kcov" +curl -L "https://storage.googleapis.com/google-code-archive-downloads/v2/code.google.com/shunit2/shunit2-2.1.6.tgz" | tar zx +wget https://github.com/SimonKagstrom/kcov/archive/master.tar.gz +tar xzf master.tar.gz +cd kcov-master || exit +mkdir build +cd build || exit +cmake .. +make +sudo make install +cd ../.. +rm -rf kcov-master +mkdir -p coverage diff --git a/tests/tests_mcserver.sh b/tests/tests_mcserver.sh index 190612bf3..304e125eb 100644 --- a/tests/tests_mcserver.sh +++ b/tests/tests_mcserver.sh @@ -478,6 +478,8 @@ fn_test_result_na(){ fn_print_fail_nl "TEST N/A" } +sleeptime="0" + echo -e "=================================" echo -e "Travis CI Tests" echo -e "Linux Game Server Manager" @@ -1056,6 +1058,8 @@ echo -e "Using: ${gamename}" echo -e "=================================" requiredstatus="OFFLINE" fn_setstatus -fn_print_info "Tidying up directories." -rm -rfv "${serverfiles}" +if [ ! -v TRAVIS ]; then + fn_print_info "Tidying up directories." + rm -rfv "${serverfiles}" +fi core_exit.sh diff --git a/tests/tests_ts3server.sh b/tests/tests_ts3server.sh index 080a2c9a3..f1544c472 100644 --- a/tests/tests_ts3server.sh +++ b/tests/tests_ts3server.sh @@ -478,6 +478,8 @@ fn_test_result_na(){ fn_print_fail_nl "TEST N/A" } +sleeptime="0" + echo -e "=================================" echo -e "Travis CI Tests" echo -e "Linux Game Server Manager" @@ -1009,6 +1011,8 @@ echo -e "Using: ${gamename}" echo -e "=================================" requiredstatus="OFFLINE" fn_setstatus -fn_print_info "Tidying up directories." -rm -rfv "${serverfiles}" +if [ ! -v TRAVIS ]; then + fn_print_info "Tidying up directories." + rm -rfv "${serverfiles}" +fi core_exit.sh From 86478573d973228c3901b26f7314ed5d3fc859bb Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Fri, 29 Nov 2019 23:37:22 +0000 Subject: [PATCH 244/534] feat(newserver): Minecraft Bedrock (#2626) --- .../config-lgsm/mcbserver/_default.cfg | 157 ++++++++++++++++ .../config-lgsm/mcserver/_default.cfg | 1 + lgsm/data/serverlist.csv | 1 + lgsm/functions/command_monitor.sh | 2 +- lgsm/functions/command_update.sh | 2 + lgsm/functions/core_dl.sh | 2 +- lgsm/functions/core_functions.sh | 10 + lgsm/functions/fix.sh | 2 + lgsm/functions/fix_mcb.sh | 11 ++ lgsm/functions/info_config.sh | 32 ++++ lgsm/functions/info_messages.sh | 14 +- lgsm/functions/install_config.sh | 6 + lgsm/functions/install_server_files.sh | 2 + lgsm/functions/query_gsquery.py | 9 +- lgsm/functions/update_minecraft.sh | 2 +- lgsm/functions/update_minecraft_bedrock.sh | 172 ++++++++++++++++++ 16 files changed, 418 insertions(+), 7 deletions(-) create mode 100644 lgsm/config-default/config-lgsm/mcbserver/_default.cfg create mode 100644 lgsm/functions/fix_mcb.sh create mode 100644 lgsm/functions/update_minecraft_bedrock.sh diff --git a/lgsm/config-default/config-lgsm/mcbserver/_default.cfg b/lgsm/config-default/config-lgsm/mcbserver/_default.cfg new file mode 100644 index 000000000..79a623d61 --- /dev/null +++ b/lgsm/config-default/config-lgsm/mcbserver/_default.cfg @@ -0,0 +1,157 @@ +################################## +######## Default Settings ######## +################################## +# DO NOT EDIT, ANY CHANGES 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. + +#### Game Server Settings #### + +## Server Start Command | https://docs.linuxgsm.com/configuration/start-parameters#additional-parameters +fn_parms(){ +parms="" +} + +#### LinuxGSM Settings #### + +## LinuxGSM Stats +# Send useful stats to LinuxGSM developers. +# https://docs.linuxgsm.com/configuration/linuxgsm-stats +# (on|off) +stats="off" + +## Notification Alerts +# (on|off) + +# Display IP | https://docs.linuxgsm.com/alerts#display-ip +displayip="" + +# More info | https://docs.linuxgsm.com/alerts#more-info +postalert="off" +postdays="7" +posttarget="https://hastebin.com" + +# Discord Alerts | https://docs.linuxgsm.com/alerts/discord +discordalert="off" +discordwebhook="webhook" + +# Email Alerts | https://docs.linuxgsm.com/alerts/email +emailalert="off" +email="email@example.com" +emailfrom="" + +# IFTTT Alerts | https://docs.linuxgsm.com/alerts/ifttt +iftttalert="off" +ifttttoken="accesstoken" +iftttevent="linuxgsm_alert" + +# Mailgun Email Alerts | https://docs.linuxgsm.com/alerts/mailgun +mailgunalert="off" +mailguntoken="accesstoken" +mailgundomain="example.com" +mailgunemailfrom="alert@example.com" +mailgunemail="email@myemail.com" + +# Pushbullet Alerts | https://docs.linuxgsm.com/alerts/pushbullet +pushbulletalert="off" +pushbullettoken="accesstoken" +channeltag="" + +# Pushover Alerts | https://docs.linuxgsm.com/alerts/pushover +pushoveralert="off" +pushovertoken="accesstoken" + +# Slack Alerts | https://docs.linuxgsm.com/alerts/slack +slackalert="off" +slackwebhook="webhook" + +# Telegram Alerts | https://docs.linuxgsm.com/alerts/telegram +# You can add a custom cURL string eg proxy (useful in Russia) or else in "curlcustomstring". +# like a "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help", if you not need +# any custom string in curl - simple ignore this parameter. +telegramalert="off" +telegramtoken="accesstoken" +telegramchatid="" +curlcustomstring="" + +## Updating | https://docs.linuxgsm.com/commands/update +updateonstart="off" + +## Backup | https://docs.linuxgsm.com/commands/backup +maxbackups="4" +maxbackupdays="30" +stoponbackup="on" + +## Logging | https://docs.linuxgsm.com/features/logging +consolelogging="on" +logdays="7" + +## Monitor | https://docs.linuxgsm.com/commands/monitor +# Query delay time +querydelay="1" + +## ANSI Colors | https://docs.linuxgsm.com/features/ansi-colors +ansi="on" + +#### Advanced Settings #### + +## Message Display Time | https://docs.linuxgsm.com/features/message-display-time +sleeptime="0.5" + +## Stop Mode | https://docs.linuxgsm.com/features/stop-mode +# 1: tmux kill +# 2: CTRL+c +# 3: quit +# 4: quit 120s +# 5: stop +# 6: q +# 7: exit +# 8: 7 Days to Die +# 9: Gold Source +# 10: Teamspeak 3 +stopmode="5" + +## Query mode +# 1: session only +# 2: gamedig + gsquery +# 3: gamedig +# 4: gsquery +# 5: tcp +querymode="4" +querytype="minecraftbe" + +## Game Server Details +# Do not edit +gamename="Minecraft Bedrock" +engine="bedrock" +glibc="2.27" + +#### Directories #### +# Edit with care + +## Game Server Directories +systemdir="${serverfiles}" +executabledir="${serverfiles}" +executable="${serverfiles}/bedrock_server" +servercfg="server.properties" +servercfgdefault="server.properties" +servercfgdir="${serverfiles}" +servercfgfullpath="${servercfgdir}/${servercfg}" + +## Backup Directory +backupdir="${lgsmdir}/backup" + +## Logging Directories +logdir="${rootdir}/log" +gamelogdir="${systemdir}" +lgsmlogdir="${logdir}/script" +consolelogdir="${logdir}/console" +lgsmlog="${lgsmlogdir}/${selfname}-script.log" +consolelog="${consolelogdir}/${selfname}-console.log" +alertlog="${lgsmlogdir}/${selfname}-alert.log" +postdetailslog="${lgsmlogdir}/${selfname}-postdetails.log" + +## Logs Naming +lgsmlogdate="${lgsmlogdir}/${selfname}-script-$(date '+%Y-%m-%d-%H:%M:%S').log" +consolelogdate="${consolelogdir}/${selfname}-console-$(date '+%Y-%m-%d-%H:%M:%S').log" diff --git a/lgsm/config-default/config-lgsm/mcserver/_default.cfg b/lgsm/config-default/config-lgsm/mcserver/_default.cfg index 28ead92a2..904a2af88 100644 --- a/lgsm/config-default/config-lgsm/mcserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/mcserver/_default.cfg @@ -15,6 +15,7 @@ javaram="1024" # -Xmx$1024M fn_parms(){ parms="nogui" } + #### LinuxGSM Settings #### ## LinuxGSM Stats diff --git a/lgsm/data/serverlist.csv b/lgsm/data/serverlist.csv index 278294951..5c2e6a6ae 100644 --- a/lgsm/data/serverlist.csv +++ b/lgsm/data/serverlist.csv @@ -49,6 +49,7 @@ kf2,kf2server,Killing Floor 2 l4d,l4dserver,Left 4 Dead l4d2,l4d2server,Left 4 Dead 2 mc,mcserver,Minecraft +mcb,mcbserver,Minecraft Bedrock mh,mhserver,MORDHAU mohaa,mohaaserver,Medal of Honor: Allied Assault mta,mtaserver,Multi Theft Auto diff --git a/lgsm/functions/command_monitor.sh b/lgsm/functions/command_monitor.sh index 610bc5531..387bd8b1c 100644 --- a/lgsm/functions/command_monitor.sh +++ b/lgsm/functions/command_monitor.sh @@ -17,7 +17,7 @@ fn_monitor_check_lockfile(){ fn_print_checking_eol fn_script_log_info "Checking lockfile: CHECKING" fn_sleep_time - fn_print_error_nl "Checking lockfile: No lockfile found: " + fn_print_error "Checking lockfile: No lockfile found: " fn_print_error_eol fn_script_log_error "Checking lockfile: No lockfile found: ERROR" fn_sleep_time diff --git a/lgsm/functions/command_update.sh b/lgsm/functions/command_update.sh index 3c6db2dad..1bc37e7bb 100644 --- a/lgsm/functions/command_update.sh +++ b/lgsm/functions/command_update.sh @@ -16,6 +16,8 @@ if [ "${shortname}" == "ts3" ]; then update_ts3.sh elif [ "${shortname}" == "mc" ]; then update_minecraft.sh +elif [ "${shortname}" == "mcb" ]; then + update_minecraft_bedrock.sh elif [ "${shortname}" == "mumble" ]; then update_mumble.sh elif [ "${shortname}" == "fctr" ]; then diff --git a/lgsm/functions/core_dl.sh b/lgsm/functions/core_dl.sh index a01accdf8..0e215356a 100644 --- a/lgsm/functions/core_dl.sh +++ b/lgsm/functions/core_dl.sh @@ -81,7 +81,7 @@ fn_dl_extract(){ elif [ "${mime}" == "application/x-xz" ]; then tarcmd=$(tar -xf "${local_filedir}/${local_filename}" -C "${extractdir}") elif [ "${mime}" == "application/zip" ]; then - extractcmd=$(unzip -d "${extractdir}" "${local_filedir}/${local_filename}") + extractcmd=$(unzip -dq "${extractdir}" "${local_filedir}/${local_filename}") fi local exitcode=$? if [ ${exitcode} -ne 0 ]; then diff --git a/lgsm/functions/core_functions.sh b/lgsm/functions/core_functions.sh index b88f29dd5..f1632b48a 100644 --- a/lgsm/functions/core_functions.sh +++ b/lgsm/functions/core_functions.sh @@ -331,6 +331,11 @@ functionfile="${FUNCNAME[0]}" fn_fetch_function } +fix_mcb.sh(){ +functionfile="${FUNCNAME[0]}" +fn_fetch_function +} + fix_mta.sh(){ functionfile="${FUNCNAME[0]}" fn_fetch_function @@ -545,6 +550,11 @@ functionfile="${FUNCNAME[0]}" fn_fetch_function } +update_minecraft_bedrock.sh(){ +functionfile="${FUNCNAME[0]}" +fn_fetch_function +} + update_mumble.sh(){ functionfile="${FUNCNAME[0]}" fn_fetch_function diff --git a/lgsm/functions/fix.sh b/lgsm/functions/fix.sh index 04d5c09b5..4b830f62d 100644 --- a/lgsm/functions/fix.sh +++ b/lgsm/functions/fix.sh @@ -67,6 +67,8 @@ if [ "${function_selfname}" != "command_install.sh" ]&&[ -z "${fixbypass}" ]; th fix_terraria.sh elif [ "${shortname}" == "ts3" ]; then fix_ts3.sh + elif [ "${shortname}" == "mcb" ]; then + fix_mcb.sh elif [ "${shortname}" == "mta" ]; then fix_mta.sh elif [ "${shortname}" == "unt" ]; then diff --git a/lgsm/functions/fix_mcb.sh b/lgsm/functions/fix_mcb.sh new file mode 100644 index 000000000..d9cb8073a --- /dev/null +++ b/lgsm/functions/fix_mcb.sh @@ -0,0 +1,11 @@ +#!/bin/bash +# LinuxGSM fix_mcb.sh function +# Author: Daniel Gibbs +# Website: https://linuxgsm.com +# Description: Resolves possible startup issue with Minecraft Bedrock + +local commandname="FIX" +local commandaction="Fix" + +# official docs state that the server should be started with: LD_LIBRARY_PATH=. ./bedrock_server +export LD_LIBRARY_PATH="${serverfiles}:$LD_LIBRARY_PATH" \ No newline at end of file diff --git a/lgsm/functions/info_config.sh b/lgsm/functions/info_config.sh index 3a07d78da..bd511cc69 100644 --- a/lgsm/functions/info_config.sh +++ b/lgsm/functions/info_config.sh @@ -386,6 +386,35 @@ fn_info_config_minecraft(){ fi } +fn_info_config_minecraft_bedrock(){ + if [ ! -f "${servercfgfullpath}" ]; then + servername="${unavailable}" + maxplayers="${zero}" + port="${zero}" + port6="${zero}" + queryport="${zero}" + gamemode="${unavailable}" + gameworld="${unavailable}" + else + servername=$(grep "server-name" "${servercfgfullpath}" | sed -e 's/^[ \t]*//g' -e '/^#/d' -e 's/server-name//g' | tr -d '=\";,:' | sed -e 's/^[ \t]*//' -e 's/[ \t]*$//') + maxplayers=$(grep "max-players" "${servercfgfullpath}" | grep -v "#" | tr -cd '[:digit:]') + port=$(grep "server-port\b" "${servercfgfullpath}" | grep -v "#" | tr -cd '[:digit:]') + port6=$(grep "server-portv6\b" "${servercfgfullpath}" | sed 's/v6//g' | grep -v "#" | tr -cd '[:digit:]') + queryport=${port} + gamemode=$(grep "gamemode" "${servercfgfullpath}" | sed -e 's/^[ \t]*//g' -e '/^#/d' -e 's/gamemode//g' | tr -d '=\";,:' | sed -e 's/^[ \t]*//' -e 's/[ \t]*$//') + gameworld=$(grep "level-name" "${servercfgfullpath}" | sed -e 's/^[ \t]*//g' -e '/^#/d' -e 's/level-name//g' | tr -d '=\";,:' | sed -e 's/^[ \t]*//' -e 's/[ \t]*$//') + + # Not Set + servername=${servername:-"NOT SET"} + maxplayers=${maxplayers:-"NOT SET"} + port=${port:-"NOT SET"} + port6=${port6:-"NOT SET"} + queryport=${queryport:-"NOT SET"} + gamemode=${gamemode:-"NOT SET"} + gameworld=${gameworld:-"NOT SET"} + fi +} + fn_info_config_mohaa(){ if [ ! -f "${servercfgfullpath}" ]; then rconpassword="${unavailable}" @@ -1364,6 +1393,9 @@ elif [ "${shortname}" == "ql" ]; then # Minecraft elif [ "${shortname}" == "mc" ]; then fn_info_config_minecraft +# Minecraft Bedrock +elif [ "${shortname}" == "mcb" ]; then + fn_info_config_minecraft_bedrock # Post Scriptum: The Bloody Seventh elif [ "${shortname}" == "pstbs" ]; then fn_info_config_pstbs diff --git a/lgsm/functions/info_messages.sh b/lgsm/functions/info_messages.sh index 78e850469..291def5a9 100644 --- a/lgsm/functions/info_messages.sh +++ b/lgsm/functions/info_messages.sh @@ -541,7 +541,7 @@ fn_info_message_ports(){ parmslocation="${red}UNKNOWN${default}" # engines/games that require editing in the config file - local ports_edit_array=( "avalanche2.0" "avalanche3.0" "Ballistic Overkill" "dontstarve" "Eco" "idtech2" "idtech3" "idtech3_ql" "lwjgl2" "Project Cars" "projectzomboid" "quake" "refractor" "realvirtuality" "renderware" "seriousengine35" "Stationeers" "teeworlds" "terraria" "unreal" "unreal2" "unreal3" "TeamSpeak 3" "Mumble" "7 Days To Die" "wurm") + local ports_edit_array=( "avalanche2.0" "avalanche3.0" "Ballistic Overkill" "dontstarve" "Eco" "idtech2" "idtech3" "idtech3_ql" "lwjgl2" "Minecraft Bedrock" "Project Cars" "projectzomboid" "quake" "refractor" "realvirtuality" "renderware" "seriousengine35" "Stationeers" "teeworlds" "terraria" "unreal" "unreal2" "unreal3" "TeamSpeak 3" "Mumble" "7 Days To Die" "wurm") for port_edit in "${ports_edit_array[@]}" do if [ "${shortname}" == "ut3" ]; then @@ -811,6 +811,16 @@ fn_info_message_minecraft(){ } | column -s $'\t' -t } +fn_info_message_minecraft_bedrock(){ + echo -e "netstat -atunp | grep bedrock_serv" + echo -e "" + { + echo -e "${lightblue}DESCRIPTION\tDIRECTION\tPORT\tPROTOCOL${default}" + echo -e "> Game\tINBOUND\t${port}\tudp" + echo -e "> Game\tINBOUND\t${port6}\tudp6" + } | column -s $'\t' -t +} + fn_info_message_mohaa(){ echo -e "netstat -atunp | grep mohaa_lnxded" echo -e "" @@ -1368,6 +1378,8 @@ fn_info_message_select_engine(){ fn_info_message_justcause3 elif [ "${shortname}" == "kf2" ]; then fn_info_message_kf2 + elif [ "${shortname}" == "mcb" ]; then + fn_info_message_minecraft_bedrock elif [ "${shortname}" == "pz" ]; then fn_info_message_projectzomboid elif [ "${shortname}" == "pstbs" ]; then diff --git a/lgsm/functions/install_config.sh b/lgsm/functions/install_config.sh index af8554604..92451b5d9 100644 --- a/lgsm/functions/install_config.sh +++ b/lgsm/functions/install_config.sh @@ -440,6 +440,12 @@ elif [ "${shortname}" == "mc" ]; then fn_fetch_default_config fn_default_config_remote fn_set_config_vars +elif [ "${shortname}" == "mcb" ]; then + gamedirname="MinecraftBedrock" + array_configs+=( server.properties ) + fn_fetch_default_config + fn_default_config_remote + fn_set_config_vars elif [ "${shortname}" == "mohaa" ]; then gamedirname="MedalOfHonorAlliedAssault" array_configs+=( server.cfg ) diff --git a/lgsm/functions/install_server_files.sh b/lgsm/functions/install_server_files.sh index 40dfe9ad2..b2158b3e7 100644 --- a/lgsm/functions/install_server_files.sh +++ b/lgsm/functions/install_server_files.sh @@ -153,6 +153,8 @@ if [ "${shortname}" == "ts3" ]; then elif [ "${shortname}" == "mc" ]; then install_eula.sh update_minecraft.sh +elif [ "${shortname}" == "mcb" ]; then + update_minecraft_bedrock.sh elif [ "${shortname}" == "mumble" ]; then update_mumble.sh elif [ "${shortname}" == "mta" ]; then diff --git a/lgsm/functions/query_gsquery.py b/lgsm/functions/query_gsquery.py index 0a41b495b..f6e3ce168 100644 --- a/lgsm/functions/query_gsquery.py +++ b/lgsm/functions/query_gsquery.py @@ -21,6 +21,7 @@ class gsquery: idtech2query=['protocol-quake3','idtech2','quake','iw2.0'] idtech3query=['protocol-quake3','iw3.0','ioquake3','qfusion'] minecraftquery=['minecraft','lwjgl2'] + minecraftbequery=['minecraftbe'] jc2mpquery=['jc2mp'] mumblequery=['mumbleping'] twquery=['teeworlds'] @@ -32,10 +33,12 @@ class gsquery: self.query_prompt_string = b'\xff\xff\xff\xffstatus\x00' elif self.option.engine in idtech3query: self.query_prompt_string = b'\xff\xff\xff\xffgetstatus' - elif self.option.engine in minecraftquery: - self.query_prompt_string = b'\xFE\xFD\x09\x3d\x54\x1f\x93' elif self.option.engine in jc2mpquery: self.query_prompt_string = b'\xFE\xFD\x09\x10\x20\x30\x40' + elif self.option.engine in minecraftquery: + self.query_prompt_string = b'\xFE\xFD\x09\x3d\x54\x1f\x93' + elif self.option.engine in minecraftbequery: + self.query_prompt_string = b'\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\x00\xfe\xfe\xfe\xfe\xfd\xfd\xfd\xfd\x12\x34\x56\x78\x00\x00\x00\x00\x00\x00\x00\x00' elif self.option.engine in mumblequery: self.query_prompt_string = b'\x00\x00\x00\x00\x01\x02\x03\x04\x05\x06\x07\x08' elif self.option.engine in unrealquery: @@ -113,7 +116,7 @@ if __name__ == '__main__': action='store', dest='engine', default=False, - help='Engine type: protocol-valve protocol-quake3 protocol-quake3 protocol-gamespy1 protocol-unreal2 minecraft jc2mp mumbleping teeworlds' + help='Engine type: protocol-valve protocol-quake3 protocol-quake3 protocol-gamespy1 protocol-unreal2 minecraft minecraftbe jc2mp mumbleping teeworlds' ) parser.add_option( '-v', '--verbose', diff --git a/lgsm/functions/update_minecraft.sh b/lgsm/functions/update_minecraft.sh index f27603a42..1676443a1 100644 --- a/lgsm/functions/update_minecraft.sh +++ b/lgsm/functions/update_minecraft.sh @@ -64,7 +64,7 @@ fn_update_minecraft_localbuild(){ fi if [ -z "${localbuild}" ]; then - localbuild=$(cat "${serverfiles}/logs/latest.log" 2> /dev/null | grep version | grep -Eo '((\.)?[0-9]{1,3}){1,3}\.[0-9]{1,3}') + localbuild=$(grep version "${serverfiles}/logs/latest.log" | grep -Eo '((\.)?[0-9]{1,3}){1,3}\.[0-9]{1,3}') fi if [ -z "${localbuild}" ]; then diff --git a/lgsm/functions/update_minecraft_bedrock.sh b/lgsm/functions/update_minecraft_bedrock.sh new file mode 100644 index 000000000..bf4b6f5d1 --- /dev/null +++ b/lgsm/functions/update_minecraft_bedrock.sh @@ -0,0 +1,172 @@ +#!/bin/bash +# LinuxGSM update_minecraft_bedrock.sh function +# Author: Daniel Gibbs +# Website: https://linuxgsm.com +# Description: Handles updating of Minecraft Bedrock servers. + +local commandname="UPDATE" +local commandaction="Update" +local function_selfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" + +fn_update_minecraft_dl(){ + latestmcbuildurl=$(curl -s "https://www.minecraft.net/en-us/download/server/bedrock/" | grep -o 'https://minecraft.azureedge.net/bin-linux/[^"]*zip') + fn_fetch_file "${latestmcbuildurl}" "${tmpdir}" "bedrock_server.${remotebuild}.zip" + echo -e "Extracting to ${serverfiles}...\c" + if [ "${installer}" == "1" ]; then + unzip -oq "${tmpdir}/bedrock_server.${remotebuild}.zip" -x "server.properties" -d "${serverfiles}" + else + unzip -oq "${tmpdir}/bedrock_server.${remotebuild}.zip" -x "permissions.json" "server.properties" "whitelist.json" -d "${serverfiles}" + fi + local exitcode=$? + if [ "${exitcode}" == "0" ]; then + fn_print_ok_eol_nl + fn_script_log_pass "Extracting to ${serverfiles}" + chmod u+x "${serverfiles}/bedrock_server" + fn_clear_tmp + else + fn_print_fail_eol_nl + fn_script_log_fatal "Extracting to ${serverfiles}" + core_exit.sh + fi +} + +fn_update_minecraft_localbuild(){ + # Gets local build info. + fn_print_dots "Checking for update: ${remotelocation}: checking local build" + # Uses log file to gather info. + # Log is generated and cleared on startup but filled on shutdown. + + localbuild=$(grep Version $(ls -tr "${consolelogdir}"/* 2>/dev/null) | tail -1 | sed 's/.*Version //') + + if [ -z "${localbuild}" ]; then + fn_print_error "Checking for update: ${remotelocation}: checking local build" + fn_print_error_nl "Checking for update: ${remotelocation}: checking local build: no log files containing version info" + fn_script_log_error "No log files containing version info" + fn_print_info_nl "Checking for update: ${remotelocation}: checking local build: forcing server restart" + fn_script_log_info "Forcing server restart" + + check_status.sh + if [ "${status}" != "0" ]; then + exitbypass=1 + command_stop.sh + else + exitbypass=1 + command_start.sh + sleep 3 + exitbypass=1 + command_stop.sh + fi + fi + + if [ -z "${localbuild}" ]; then + localbuild=$(grep Version $(ls -tr "${consolelogdir}"/* 2>/dev/null) | tail -1 | sed 's/.*Version //') + fi + + if [ -z "${localbuild}" ]; then + localbuild="0" + fn_print_error "Checking for update: ${remotelocation}: waiting for local build: missing local build info" + fn_script_log_error "Missing local build info" + fn_script_log_error "Set localbuild to 0" + else + fn_print_ok "Checking for update: ${remotelocation}: checking local build" + fn_script_log_pass "Checking local build" + fi +} + +fn_update_minecraft_remotebuild(){ + # Gets remote build info. + remotebuild=$(curl -s "https://www.minecraft.net/en-us/download/server/bedrock/" | grep -o 'https://minecraft.azureedge.net/bin-linux/[^"]*' | sed 's/.*\///' | grep -Eo "[.0-9]+[0-9]") + if [ "${installer}" != "1" ]; then + fn_print_dots "Checking for update: ${remotelocation}: checking remote build" + # Checks if remotebuild variable has been set. + if [ -z "${remotebuild}" ]||[ "${remotebuild}" == "null" ]; then + fn_print_fail "Checking for update: ${remotelocation}: checking remote build" + fn_script_log_fatal "Checking remote build" + core_exit.sh + else + fn_print_ok "Checking for update: ${remotelocation}: checking remote build" + fn_script_log_pass "Checking remote build" + fi + else + # Checks if remotebuild variable has been set. + if [ -z "${remotebuild}" ]||[ "${remotebuild}" == "null" ]; then + fn_print_failure "Unable to get remote build" + fn_script_log_fatal "Unable to get remote build" + core_exit.sh + fi + fi +} + +fn_update_minecraft_compare(){ + # Removes dots so if statement can compare version numbers. + fn_print_dots "Checking for update: ${remotelocation}" + localbuilddigit=$(echo -e "${localbuild}" | tr -cd '[:digit:]') + remotebuilddigit=$(echo -e "${remotebuild}" | tr -cd '[:digit:]') + if [ "${localbuilddigit}" -ne "${remotebuilddigit}" ]||[ "${forceupdate}" == "1" ]; then + fn_print_ok_nl "Checking for update: ${remotelocation}" + echo -en "\n" + echo -e "Update available" + echo -e "* Local build: ${red}${localbuild}${default}" + echo -e "* Remote build: ${green}${remotebuild}${default}" + fn_script_log_info "Update available" + fn_script_log_info "Local build: ${localbuild}" + fn_script_log_info "Remote build: ${remotebuild}" + fn_script_log_info "${localbuild} > ${remotebuild}" + fn_sleep_time + echo -en "\n" + echo -en "applying update.\r" + sleep 1 + echo -en "applying update..\r" + sleep 1 + echo -en "applying update...\r" + sleep 1 + echo -en "\n" + + unset updateonstart + + check_status.sh + # If server stopped. + if [ "${status}" == "0" ]; then + exitbypass=1 + fn_update_minecraft_dl + exitbypass=1 + command_start.sh + exitbypass=1 + command_stop.sh + # If server started. + else + exitbypass=1 + command_stop.sh + exitbypass=1 + fn_update_minecraft_dl + exitbypass=1 + command_start.sh + fi + alert="update" + alert.sh + else + fn_print_ok_nl "Checking for update: ${remotelocation}" + echo -en "\n" + echo -e "No update available" + echo -e "* Local build: ${green}${localbuild}${default}" + echo -e "* Remote build: ${green}${remotebuild}${default}" + fn_script_log_info "No update available" + fn_script_log_info "Local build: ${localbuild}" + fn_script_log_info "Remote build: ${remotebuild}" + fi +} + +# The location where the builds are checked and downloaded. +remotelocation="minecraft.net" + +if [ "${installer}" == "1" ]; then + fn_update_minecraft_remotebuild + fn_update_minecraft_dl +else + check_status.sh + fn_print_dots "Checking for update: ${remotelocation}" + fn_script_log_info "Checking for update: ${remotelocation}" + fn_update_minecraft_localbuild + fn_update_minecraft_remotebuild + fn_update_minecraft_compare +fi From 8f3566bd401a1276fe68f30e0acb093c0c4f19b2 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Fri, 29 Nov 2019 23:40:59 +0000 Subject: [PATCH 245/534] release v19.12.0 --- linuxgsm.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/linuxgsm.sh b/linuxgsm.sh index 451e0c888..60e407776 100755 --- a/linuxgsm.sh +++ b/linuxgsm.sh @@ -20,7 +20,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="v19.11.0" +version="v19.12.0" shortname="core" gameservername="core" rootdir=$(dirname "$(readlink -f "${BASH_SOURCE[0]}")") From adde9929b098233fe05c2a004bbd4845213be35e Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Sat, 30 Nov 2019 13:32:08 +0000 Subject: [PATCH 246/534] correct typo --- .github/pull_request_template.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/pull_request_template.md b/.github/pull_request_template.md index 807f3d8bb..5aa59ce42 100644 --- a/.github/pull_request_template.md +++ b/.github/pull_request_template.md @@ -18,7 +18,7 @@ PR will not be merged until all steps are complete. * [ ] This pull request links to an issue. * [ ] This pull request uses the `develop` branch as its base. -* [ ] This pull request Subject follows the Conventinal Commits standard. +* [ ] This pull request Subject follows the Conventional Commits standard. * [ ] This code follows the style guidelines of this project. * [ ] I have performed a self-review of my own code. * [ ] I have checked that this code is commented where required. From 755c26eaf13faaf37d448840d3fc9731cb3839d6 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Sat, 30 Nov 2019 22:33:07 +0000 Subject: [PATCH 247/534] fix: update some servicename var's that did not get replaced with selfname --- lgsm/functions/alert.sh | 2 +- lgsm/functions/core_messages.sh | 24 ++++++++++++------------ linuxgsm.sh | 8 ++++---- 3 files changed, 17 insertions(+), 17 deletions(-) diff --git a/lgsm/functions/alert.sh b/lgsm/functions/alert.sh index c72967ed9..17f51140e 100644 --- a/lgsm/functions/alert.sh +++ b/lgsm/functions/alert.sh @@ -76,7 +76,7 @@ fn_alert_config(){ alertemoji="🎮" alertsound="1" alerturl="not enabled" - alertbody="${servicename} has received a new _default.cfg. Check file for changes." + alertbody="${selfname} has received a new _default.cfg. Check file for changes." } if [ "${alert}" == "permissions" ]; then diff --git a/lgsm/functions/core_messages.sh b/lgsm/functions/core_messages.sh index 252ef182c..166cca593 100644 --- a/lgsm/functions/core_messages.sh +++ b/lgsm/functions/core_messages.sh @@ -119,7 +119,7 @@ fn_script_log_info(){ # [ .... ] fn_print_dots(){ if [ -n "${commandaction}" ]; then - echo -en "${creeol}[ .... ] ${commandaction} ${servicename}: $*" + echo -en "${creeol}[ .... ] ${commandaction} ${selfname}: $*" else echo -en "${creeol}[ .... ] $*" fi @@ -128,7 +128,7 @@ fn_print_dots(){ fn_print_dots_nl(){ if [ -n "${commandaction}" ]; then - echo -e "${creeol}[ .... ] ${commandaction} ${servicename}: $*" + echo -e "${creeol}[ .... ] ${commandaction} ${selfname}: $*" else echo -e "${creeol}[ .... ] $*" fi @@ -139,7 +139,7 @@ fn_print_dots_nl(){ # [ OK ] fn_print_ok(){ if [ -n "${commandaction}" ]; then - echo -en "${creeol}[${green} OK ${default}] ${commandaction} ${servicename}: $*" + echo -en "${creeol}[${green} OK ${default}] ${commandaction} ${selfname}: $*" else echo -en "${creeol}[${green} OK ${default}] $*" fi @@ -148,7 +148,7 @@ fn_print_ok(){ fn_print_ok_nl(){ if [ -n "${commandaction}" ]; then - echo -en "${creeol}[${green} OK ${default}] ${commandaction} ${servicename}: $*" + echo -en "${creeol}[${green} OK ${default}] ${commandaction} ${selfname}: $*" else echo -en "${creeol}[${green} OK ${default}] $*" fi @@ -159,7 +159,7 @@ fn_print_ok_nl(){ # [ FAIL ] fn_print_fail(){ if [ -n "${commandaction}" ]; then - echo -en "${creeol}[${red} FAIL ${default}] ${commandaction} ${servicename}: $*" + echo -en "${creeol}[${red} FAIL ${default}] ${commandaction} ${selfname}: $*" else echo -en "${creeol}[${red} FAIL ${default}] $*" fi @@ -168,7 +168,7 @@ fn_print_fail(){ fn_print_fail_nl(){ if [ -n "${commandaction}" ]; then - echo -en "${creeol}[${red} FAIL ${default}] ${commandaction} ${servicename}: $*" + echo -en "${creeol}[${red} FAIL ${default}] ${commandaction} ${selfname}: $*" else echo -en "${creeol}[${red} FAIL ${default}] $*" fi @@ -179,7 +179,7 @@ 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} ${selfname}: $*" else echo -en "${creeol}[${red}ERROR ${default}] $*" fi @@ -188,7 +188,7 @@ 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} ${selfname}: $*" else echo -en "${creeol}[${red}ERROR ${default}] $*" fi @@ -199,7 +199,7 @@ fn_print_error_nl(){ # [ WARN ] fn_print_warn(){ if [ -n "${commandaction}" ]; then - echo -en "${creeol}[${lightyellow} WARN ${default}] ${commandaction} ${servicename}: $*" + echo -en "${creeol}[${lightyellow} WARN ${default}] ${commandaction} ${selfname}: $*" else echo -en "${creeol}[${lightyellow} WARN ${default}] $*" fi @@ -208,7 +208,7 @@ fn_print_warn(){ fn_print_warn_nl(){ if [ -n "${commandaction}" ]; then - echo -en "${creeol}[${lightyellow} WARN ${default}] ${commandaction} ${servicename}: $*" + echo -en "${creeol}[${lightyellow} WARN ${default}] ${commandaction} ${selfname}: $*" else echo -en "${creeol}[${lightyellow} WARN ${default}] $*" fi @@ -219,7 +219,7 @@ fn_print_warn_nl(){ # [ INFO ] fn_print_info(){ if [ -n "${commandaction}" ]; then - echo -en "${creeol}[${cyan} INFO ${default}] ${commandaction} ${servicename}: $*" + echo -en "${creeol}[${cyan} INFO ${default}] ${commandaction} ${selfname}: $*" else echo -en "${creeol}[${cyan} INFO ${default}] $*" fi @@ -228,7 +228,7 @@ fn_print_info(){ fn_print_info_nl(){ if [ -n "${commandaction}" ]; then - echo -en "${creeol}[${cyan} INFO ${default}] ${commandaction} ${servicename}: $*" + echo -en "${creeol}[${cyan} INFO ${default}] ${commandaction} ${selfname}: $*" else echo -en "${creeol}[${cyan} INFO ${default}] $*" fi diff --git a/linuxgsm.sh b/linuxgsm.sh index 60e407776..4c7ae764a 100755 --- a/linuxgsm.sh +++ b/linuxgsm.sh @@ -357,13 +357,13 @@ 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" "nochmodx" "norun" "noforcedl" "nomd5" + if [ ! -f "${configdirserver}/${selfname}.cfg" ]; then + fn_fetch_config "lgsm/config-default/config-lgsm" "instance-template.cfg" "${configdirserver}" "${selfname}.cfg" "nochmodx" "norun" "noforcedl" "nomd5" # shellcheck source=/dev/null - source "${configdirserver}/${servicename}.cfg" + source "${configdirserver}/${selfname}.cfg" else # shellcheck source=/dev/null - source "${configdirserver}/${servicename}.cfg" + source "${configdirserver}/${selfname}.cfg" fi # Load the linuxgsm.sh in to tmpdir. If missing download it. From b7fb6a5a9cbf44fae2c0de1e0428bb305b5ac129 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Sat, 30 Nov 2019 22:51:34 +0000 Subject: [PATCH 248/534] fix(stats): remove roundup for serverfiles that is not required --- lgsm/functions/info_stats.sh | 3 --- 1 file changed, 3 deletions(-) diff --git a/lgsm/functions/info_stats.sh b/lgsm/functions/info_stats.sh index d300c8bec..f31db13d7 100644 --- a/lgsm/functions/info_stats.sh +++ b/lgsm/functions/info_stats.sh @@ -23,9 +23,6 @@ uuid=$(cat "${datadir}/uuid.txt") cpuusedmhzroundup=$(((cpuusedmhz + 99) / 100 * 100)) # nearest 100MB memusedroundup=$(((memused + 99) / 100 * 100)) -# nearest 100MB -serverfilesduroundup=$(((serverfilesdu + 99) / 100 * 100)) -# https://developers.google.com/analytics/devguides/collection/protocol/v1/parameters # Level 1 Stats ## Distro From c29604a6486e2309e738b65f005e66f7724396d6 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Sat, 30 Nov 2019 22:53:34 +0000 Subject: [PATCH 249/534] release v19.12.2 --- linuxgsm.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/linuxgsm.sh b/linuxgsm.sh index 4c7ae764a..e6a50fb88 100755 --- a/linuxgsm.sh +++ b/linuxgsm.sh @@ -20,7 +20,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="v19.12.0" +version="v19.12.2" shortname="core" gameservername="core" rootdir=$(dirname "$(readlink -f "${BASH_SOURCE[0]}")") From d888ca37f3a96376ed2a8fec39b6e9e59d240d34 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Sun, 1 Dec 2019 16:24:36 +0000 Subject: [PATCH 250/534] feat(core-dl): improve resilience of large downloads --- lgsm/functions/command_monitor.sh | 2 +- lgsm/functions/command_update_linuxgsm.sh | 3 +-- lgsm/functions/core_dl.sh | 4 ++-- 3 files changed, 4 insertions(+), 5 deletions(-) diff --git a/lgsm/functions/command_monitor.sh b/lgsm/functions/command_monitor.sh index 387bd8b1c..d1b075efe 100644 --- a/lgsm/functions/command_monitor.sh +++ b/lgsm/functions/command_monitor.sh @@ -19,7 +19,7 @@ fn_monitor_check_lockfile(){ fn_sleep_time fn_print_error "Checking lockfile: No lockfile found: " fn_print_error_eol - fn_script_log_error "Checking lockfile: No lockfile found: ERROR" + fn_script_log_error_nl "Checking lockfile: No lockfile found: ERROR" fn_sleep_time echo -e " * Start ${selfname} to run monitor." core_exit.sh diff --git a/lgsm/functions/command_update_linuxgsm.sh b/lgsm/functions/command_update_linuxgsm.sh index 6816a1443..c9ff2f248 100644 --- a/lgsm/functions/command_update_linuxgsm.sh +++ b/lgsm/functions/command_update_linuxgsm.sh @@ -56,12 +56,11 @@ if [ -z "${legacymode}" ]; then echo -e " Backup: ${backupdir}/script/${selfname}-$(date +"%m_%d_%Y_%M").bak" fi echo -en " fetching ${selfname}...\c" - exitcode=$? cp "${tmpdir}/linuxgsm.sh" "${rootdir}/${selfname}" sed -i "s/shortname=\"core\"/shortname=\"${shortname}\"/g" "${rootdir}/${selfname}" sed -i "s/gameservername=\"core\"/gameservername=\"${gameservername}\"/g" "${rootdir}/${selfname}" sed -i "s/gamename=\"core\"/gamename=\"${gamename}\"/g" "${rootdir}/${selfname}" - + exitcode=$? if [ "${exitcode}" == "0" ]; then fn_print_fail_eol_nl core_exit.sh diff --git a/lgsm/functions/core_dl.sh b/lgsm/functions/core_dl.sh index 0e215356a..84768bebb 100644 --- a/lgsm/functions/core_dl.sh +++ b/lgsm/functions/core_dl.sh @@ -133,11 +133,11 @@ fn_fetch_file(){ echo -en "downloading ${local_filename}..." fn_sleep_time echo -en "\033[1K" - curlcmd=$(curl --progress-bar --fail -L -o "${local_filedir}/${local_filename}" "${remote_fileurl}") + curlcmd=$(curl --progress-bar --retry 10 --retry-delay 3 --fail -L -C - -o "${local_filedir}/${local_filename}" "${remote_fileurl}") echo -en "downloading ${local_filename}..." else echo -en " fetching ${local_filename}...\c" - curlcmd=$(curl -s --fail -L -o "${local_filedir}/${local_filename}" "${remote_fileurl}" 2>&1) + curlcmd=$(curl -s --retry 3 --retry-delay 3 --fail -L -C - -o "${local_filedir}/${local_filename}" "${remote_fileurl}" 2>&1) fi local exitcode=$? if [ ${exitcode} -ne 0 ]; then From 42c7f7a6557726fea8ce5c042a26a9a2bed04693 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Sun, 1 Dec 2019 16:27:56 +0000 Subject: [PATCH 251/534] feat(core-dl): improve resilience of large downloads feat(core-dl): improve resilience of large downloads --- lgsm/functions/command_monitor.sh | 2 +- lgsm/functions/command_update_linuxgsm.sh | 5 ++--- lgsm/functions/core_dl.sh | 4 ++-- 3 files changed, 5 insertions(+), 6 deletions(-) diff --git a/lgsm/functions/command_monitor.sh b/lgsm/functions/command_monitor.sh index 387bd8b1c..d1b075efe 100644 --- a/lgsm/functions/command_monitor.sh +++ b/lgsm/functions/command_monitor.sh @@ -19,7 +19,7 @@ fn_monitor_check_lockfile(){ fn_sleep_time fn_print_error "Checking lockfile: No lockfile found: " fn_print_error_eol - fn_script_log_error "Checking lockfile: No lockfile found: ERROR" + fn_script_log_error_nl "Checking lockfile: No lockfile found: ERROR" fn_sleep_time echo -e " * Start ${selfname} to run monitor." core_exit.sh diff --git a/lgsm/functions/command_update_linuxgsm.sh b/lgsm/functions/command_update_linuxgsm.sh index 6816a1443..05069b79c 100644 --- a/lgsm/functions/command_update_linuxgsm.sh +++ b/lgsm/functions/command_update_linuxgsm.sh @@ -56,13 +56,12 @@ if [ -z "${legacymode}" ]; then echo -e " Backup: ${backupdir}/script/${selfname}-$(date +"%m_%d_%Y_%M").bak" fi echo -en " fetching ${selfname}...\c" - exitcode=$? cp "${tmpdir}/linuxgsm.sh" "${rootdir}/${selfname}" sed -i "s/shortname=\"core\"/shortname=\"${shortname}\"/g" "${rootdir}/${selfname}" sed -i "s/gameservername=\"core\"/gameservername=\"${gameservername}\"/g" "${rootdir}/${selfname}" sed -i "s/gamename=\"core\"/gamename=\"${gamename}\"/g" "${rootdir}/${selfname}" - - if [ "${exitcode}" == "0" ]; then + exitcode=$? + if [ "${exitcode}" != "0" ]; then fn_print_fail_eol_nl core_exit.sh else diff --git a/lgsm/functions/core_dl.sh b/lgsm/functions/core_dl.sh index 0e215356a..84768bebb 100644 --- a/lgsm/functions/core_dl.sh +++ b/lgsm/functions/core_dl.sh @@ -133,11 +133,11 @@ fn_fetch_file(){ echo -en "downloading ${local_filename}..." fn_sleep_time echo -en "\033[1K" - curlcmd=$(curl --progress-bar --fail -L -o "${local_filedir}/${local_filename}" "${remote_fileurl}") + curlcmd=$(curl --progress-bar --retry 10 --retry-delay 3 --fail -L -C - -o "${local_filedir}/${local_filename}" "${remote_fileurl}") echo -en "downloading ${local_filename}..." else echo -en " fetching ${local_filename}...\c" - curlcmd=$(curl -s --fail -L -o "${local_filedir}/${local_filename}" "${remote_fileurl}" 2>&1) + curlcmd=$(curl -s --retry 3 --retry-delay 3 --fail -L -C - -o "${local_filedir}/${local_filename}" "${remote_fileurl}" 2>&1) fi local exitcode=$? if [ ${exitcode} -ne 0 ]; then From 9eb0b7a6c779f321bb0fb666e225cfa176a81a66 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Sun, 1 Dec 2019 19:50:54 +0000 Subject: [PATCH 252/534] release v19.12.3 --- linuxgsm.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/linuxgsm.sh b/linuxgsm.sh index e6a50fb88..556cb2e53 100755 --- a/linuxgsm.sh +++ b/linuxgsm.sh @@ -20,7 +20,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="v19.12.2" +version="v19.12.3" shortname="core" gameservername="core" rootdir=$(dirname "$(readlink -f "${BASH_SOURCE[0]}")") From f4078ebe1ecbb322441892209f5146041132ea78 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Sun, 1 Dec 2019 20:05:03 +0000 Subject: [PATCH 253/534] move nl to correct place --- lgsm/functions/command_monitor.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lgsm/functions/command_monitor.sh b/lgsm/functions/command_monitor.sh index d1b075efe..c3147b975 100644 --- a/lgsm/functions/command_monitor.sh +++ b/lgsm/functions/command_monitor.sh @@ -18,8 +18,8 @@ fn_monitor_check_lockfile(){ fn_script_log_info "Checking lockfile: CHECKING" fn_sleep_time fn_print_error "Checking lockfile: No lockfile found: " - fn_print_error_eol - fn_script_log_error_nl "Checking lockfile: No lockfile found: ERROR" + fn_print_error_eol_nl + fn_script_log_error "Checking lockfile: No lockfile found: ERROR" fn_sleep_time echo -e " * Start ${selfname} to run monitor." core_exit.sh From b0c623f3ec2d57ef9c3876ef343c3bffd3c3dd81 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Mon, 2 Dec 2019 07:07:09 +0000 Subject: [PATCH 254/534] Update core_legacy.sh --- 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 1b525b669..c3efe7b63 100644 --- a/lgsm/functions/core_legacy.sh +++ b/lgsm/functions/core_legacy.sh @@ -41,6 +41,10 @@ if [ -z "${alertlog}" ]; then alertlog="${emaillog}" fi +if [ -z "${servicename}" ]; then + servicename="${selfname}" +fi + # Alternations to workshop variables. if [ -z "${wsapikey}" ]; then if [ "${workshopauth}" ]; then From fb69bafcd6b9cb4a7686402c6f9a13c99bb0fffa Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Mon, 2 Dec 2019 18:26:19 +0000 Subject: [PATCH 255/534] fix(legacy): add service name to core_legacy.sh --- 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 1b525b669..c3efe7b63 100644 --- a/lgsm/functions/core_legacy.sh +++ b/lgsm/functions/core_legacy.sh @@ -41,6 +41,10 @@ if [ -z "${alertlog}" ]; then alertlog="${emaillog}" fi +if [ -z "${servicename}" ]; then + servicename="${selfname}" +fi + # Alternations to workshop variables. if [ -z "${wsapikey}" ]; then if [ "${workshopauth}" ]; then From 70e1a82b6618548856bfcf200cb445c8913b4219 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Mon, 2 Dec 2019 20:29:12 +0000 Subject: [PATCH 256/534] fix(ut99server): correct query mode for ut99 --- lgsm/config-default/config-lgsm/ut99server/_default.cfg | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lgsm/config-default/config-lgsm/ut99server/_default.cfg b/lgsm/config-default/config-lgsm/ut99server/_default.cfg index 3eb9e8043..d8d80345d 100644 --- a/lgsm/config-default/config-lgsm/ut99server/_default.cfg +++ b/lgsm/config-default/config-lgsm/ut99server/_default.cfg @@ -120,7 +120,7 @@ stopmode="2" # 4: gsquery # 5: tcp querymode="2" -querytype="protocol-unreal2" +querytype="protocol-gamespy1" ## Game Server Details # Do not edit From 0b9fbfc01e9ffb1bf9fcf3d386b11be730d10bf0 Mon Sep 17 00:00:00 2001 From: Christian Date: Mon, 2 Dec 2019 21:31:35 +0100 Subject: [PATCH 257/534] fix(sdtdserver): restore serverconfig setting (#2640) --- lgsm/config-default/config-lgsm/sdtdserver/_default.cfg | 1 + 1 file changed, 1 insertion(+) diff --git a/lgsm/config-default/config-lgsm/sdtdserver/_default.cfg b/lgsm/config-default/config-lgsm/sdtdserver/_default.cfg index 0f56ec19b..4355298bb 100644 --- a/lgsm/config-default/config-lgsm/sdtdserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/sdtdserver/_default.cfg @@ -148,6 +148,7 @@ executable=$([ "$(uname -m)" == "x86_64" ] && echo -e "./7DaysToDieServer.x86_64 servercfgdefault="serverconfig.xml" servercfgfullpathdefault="${serverfiles}/${servercfgdefault}" servercfgdir="${serverfiles}" +servercfg="${selfname}.xml" servercfgfullpath="${servercfgdir}/${servercfg}" ## Backup Directory From 5808a3d99daf865e7e0b88bdc3db99bf2be62326 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Mon, 2 Dec 2019 21:09:34 +0000 Subject: [PATCH 258/534] fix(core-dl): adjust unzip options and revert curl changes --- lgsm/functions/core_dl.sh | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/lgsm/functions/core_dl.sh b/lgsm/functions/core_dl.sh index 84768bebb..24cff68bf 100644 --- a/lgsm/functions/core_dl.sh +++ b/lgsm/functions/core_dl.sh @@ -81,7 +81,7 @@ fn_dl_extract(){ elif [ "${mime}" == "application/x-xz" ]; then tarcmd=$(tar -xf "${local_filedir}/${local_filename}" -C "${extractdir}") elif [ "${mime}" == "application/zip" ]; then - extractcmd=$(unzip -dq "${extractdir}" "${local_filedir}/${local_filename}") + extractcmd=$(unzip -qo -d "${extractdir}" "${local_filedir}/${local_filename}") fi local exitcode=$? if [ ${exitcode} -ne 0 ]; then @@ -133,11 +133,11 @@ fn_fetch_file(){ echo -en "downloading ${local_filename}..." fn_sleep_time echo -en "\033[1K" - curlcmd=$(curl --progress-bar --retry 10 --retry-delay 3 --fail -L -C - -o "${local_filedir}/${local_filename}" "${remote_fileurl}") + curlcmd=$(curl --progress-bar --fail -L -o "${local_filedir}/${local_filename}" "${remote_fileurl}") echo -en "downloading ${local_filename}..." else echo -en " fetching ${local_filename}...\c" - curlcmd=$(curl -s --retry 3 --retry-delay 3 --fail -L -C - -o "${local_filedir}/${local_filename}" "${remote_fileurl}" 2>&1) + curlcmd=$(curl -s --fail -L -o "${local_filedir}/${local_filename}" "${remote_fileurl}" 2>&1) fi local exitcode=$? if [ ${exitcode} -ne 0 ]; then From e39f262812b108c55bc835ceacd3fabb89fc0190 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Mon, 2 Dec 2019 21:10:12 +0000 Subject: [PATCH 259/534] fix(sbotsserver): add missing setting --- lgsm/config-default/config-lgsm/sbotsserver/_default.cfg | 3 +++ 1 file changed, 3 insertions(+) diff --git a/lgsm/config-default/config-lgsm/sbotsserver/_default.cfg b/lgsm/config-default/config-lgsm/sbotsserver/_default.cfg index d426769be..e5d21ae7e 100644 --- a/lgsm/config-default/config-lgsm/sbotsserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/sbotsserver/_default.cfg @@ -83,6 +83,9 @@ telegramtoken="accesstoken" telegramchatid="" curlcustomstring="" +## Updating | https://docs.linuxgsm.com/commands/update +updateonstart="off" + ## Backup | https://docs.linuxgsm.com/commands/backup maxbackups="4" maxbackupdays="30" From 715367ee8e8387a42a7d2cd5cb8eea66d7dc50c0 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Mon, 2 Dec 2019 22:12:11 +0000 Subject: [PATCH 260/534] release v19.12.4 --- linuxgsm.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/linuxgsm.sh b/linuxgsm.sh index 556cb2e53..e7a7bc67e 100755 --- a/linuxgsm.sh +++ b/linuxgsm.sh @@ -20,7 +20,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="v19.12.3" +version="v19.12.4" shortname="core" gameservername="core" rootdir=$(dirname "$(readlink -f "${BASH_SOURCE[0]}")") From 06670a8c1588631d6c7dfecd282fce2d9065b669 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Wed, 4 Dec 2019 19:22:11 +0000 Subject: [PATCH 261/534] fix(stats): correct setting on install to state on instead of y --- lgsm/functions/command_monitor.sh | 2 +- lgsm/functions/install_stats.sh | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/lgsm/functions/command_monitor.sh b/lgsm/functions/command_monitor.sh index c3147b975..363189098 100644 --- a/lgsm/functions/command_monitor.sh +++ b/lgsm/functions/command_monitor.sh @@ -136,7 +136,7 @@ for queryattempt in {1..5}; do fn_sleep_time monitorpass=1 # send LinuxGSM stats if monitor is OK. - if [ "${stats}" == "on" ]; then + if [ "${stats}" == "on" ]||[ "${stats}" == "y" ]; then info_stats.sh fi if [ "${querystatus}" == "0" ]; then diff --git a/lgsm/functions/install_stats.sh b/lgsm/functions/install_stats.sh index 2d304e447..35a6f608f 100644 --- a/lgsm/functions/install_stats.sh +++ b/lgsm/functions/install_stats.sh @@ -21,7 +21,7 @@ echo -e "* game server resource usage" echo -e "* server hardware info" if [ -z "${autoinstall}" ]; then if fn_prompt_yn "Allow anonymous usage statistics?" Y; then - echo "stats=\"y\"" >> "${configdirserver}/common.cfg" + echo "stats=\"on\"" >> "${configdirserver}/common.cfg" fn_print_information_nl "Stats setting is now enabled in common.cfg." fi else From 05de5efb8332b08be3f55eac9add0425586d3c82 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Thu, 5 Dec 2019 09:01:49 +0000 Subject: [PATCH 262/534] release v19.12.5 --- linuxgsm.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/linuxgsm.sh b/linuxgsm.sh index e7a7bc67e..1a000656c 100755 --- a/linuxgsm.sh +++ b/linuxgsm.sh @@ -20,7 +20,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="v19.12.4" +version="v19.12.5" shortname="core" gameservername="core" rootdir=$(dirname "$(readlink -f "${BASH_SOURCE[0]}")") From 04ea539bcbd6b77ea200df053fe6e86be40347f9 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Thu, 5 Dec 2019 09:02:39 +0000 Subject: [PATCH 263/534] release v19.12.5 --- linuxgsm.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/linuxgsm.sh b/linuxgsm.sh index e7a7bc67e..1a000656c 100755 --- a/linuxgsm.sh +++ b/linuxgsm.sh @@ -20,7 +20,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="v19.12.4" +version="v19.12.5" shortname="core" gameservername="core" rootdir=$(dirname "$(readlink -f "${BASH_SOURCE[0]}")") From d09b2ed1055cd0cea81fc9a1ba717590ba91339a Mon Sep 17 00:00:00 2001 From: Frisasky Date: Thu, 5 Dec 2019 18:14:09 +0800 Subject: [PATCH 264/534] fix(rustserver): fix typo for rust wipe code (#2634) --- 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 0598699fb..97b268e57 100644 --- a/lgsm/functions/command_wipe.sh +++ b/lgsm/functions/command_wipe.sh @@ -124,7 +124,7 @@ fn_wipe_server_remove_files(){ echo -en "Removing server misc srv.files*.db file(s)..." fn_sleep_time fn_script_log "${currentaction}" - find "${serveridentitydir:?}" -type f -name "sv.files.*.d" -delete + find "${serveridentitydir:?}" -type f -name "sv.files.*.db" -delete fn_wipe_exit_code fn_sleep_time # No further information if not found because it should I could not get this file showing up. From 18c6788536ab282cee6b46891fe1fee1ce127240 Mon Sep 17 00:00:00 2001 From: Frisasky Date: Tue, 10 Dec 2019 17:52:12 +0800 Subject: [PATCH 265/534] fix(doiserver): resolve server failing to restart without -norestart (#2651) --- lgsm/config-default/config-lgsm/doiserver/_default.cfg | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lgsm/config-default/config-lgsm/doiserver/_default.cfg b/lgsm/config-default/config-lgsm/doiserver/_default.cfg index 6dce5a140..958e088f2 100644 --- a/lgsm/config-default/config-lgsm/doiserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/doiserver/_default.cfg @@ -19,7 +19,7 @@ tickrate="64" ## Server Start Command | https://docs.linuxgsm.com/configuration/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} -workshop" +parms="-game doi -strictportbind -ip ${ip} -port ${port} +clientport ${clientport} +tv_port ${sourcetvport} -tickrate ${tickrate} +map ${defaultmap} +servercfgfile ${servercfg} -maxplayers ${maxplayers} -workshop -norestart" } #### LinuxGSM Settings #### From ce2005ab6a5dbe42c79602e6c2174d8b9db5286b Mon Sep 17 00:00:00 2001 From: Frisasky Date: Tue, 7 Jan 2020 16:59:58 +0800 Subject: [PATCH 266/534] feat(post-details): change default post target from hastebin to termbin (#2645) --- lgsm/config-default/config-lgsm/ahl2server/_default.cfg | 2 +- lgsm/config-default/config-lgsm/ahlserver/_default.cfg | 2 +- lgsm/config-default/config-lgsm/arkserver/_default.cfg | 2 +- lgsm/config-default/config-lgsm/arma3server/_default.cfg | 2 +- lgsm/config-default/config-lgsm/bb2server/_default.cfg | 2 +- lgsm/config-default/config-lgsm/bbserver/_default.cfg | 2 +- lgsm/config-default/config-lgsm/bdserver/_default.cfg | 2 +- lgsm/config-default/config-lgsm/bf1942server/_default.cfg | 2 +- lgsm/config-default/config-lgsm/bmdmserver/_default.cfg | 2 +- lgsm/config-default/config-lgsm/boserver/_default.cfg | 2 +- lgsm/config-default/config-lgsm/bsserver/_default.cfg | 2 +- lgsm/config-default/config-lgsm/bt1944server/_default.cfg | 2 +- lgsm/config-default/config-lgsm/btserver/_default.cfg | 2 +- lgsm/config-default/config-lgsm/ccserver/_default.cfg | 2 +- lgsm/config-default/config-lgsm/cod2server/_default.cfg | 2 +- lgsm/config-default/config-lgsm/cod4server/_default.cfg | 2 +- lgsm/config-default/config-lgsm/codserver/_default.cfg | 2 +- lgsm/config-default/config-lgsm/coduoserver/_default.cfg | 2 +- lgsm/config-default/config-lgsm/codwawserver/_default.cfg | 2 +- lgsm/config-default/config-lgsm/csczserver/_default.cfg | 2 +- lgsm/config-default/config-lgsm/csgoserver/_default.cfg | 2 +- lgsm/config-default/config-lgsm/csserver/_default.cfg | 2 +- lgsm/config-default/config-lgsm/cssserver/_default.cfg | 2 +- lgsm/config-default/config-lgsm/dabserver/_default.cfg | 2 +- lgsm/config-default/config-lgsm/dmcserver/_default.cfg | 2 +- lgsm/config-default/config-lgsm/dodserver/_default.cfg | 2 +- lgsm/config-default/config-lgsm/dodsserver/_default.cfg | 2 +- lgsm/config-default/config-lgsm/doiserver/_default.cfg | 2 +- lgsm/config-default/config-lgsm/dstserver/_default.cfg | 2 +- lgsm/config-default/config-lgsm/dysserver/_default.cfg | 2 +- lgsm/config-default/config-lgsm/ecoserver/_default.cfg | 2 +- lgsm/config-default/config-lgsm/emserver/_default.cfg | 2 +- lgsm/config-default/config-lgsm/etlserver/_default.cfg | 2 +- lgsm/config-default/config-lgsm/fctrserver/_default.cfg | 2 +- lgsm/config-default/config-lgsm/fofserver/_default.cfg | 2 +- lgsm/config-default/config-lgsm/gesserver/_default.cfg | 2 +- lgsm/config-default/config-lgsm/gmodserver/_default.cfg | 2 +- lgsm/config-default/config-lgsm/hl2dmserver/_default.cfg | 2 +- lgsm/config-default/config-lgsm/hldmserver/_default.cfg | 2 +- lgsm/config-default/config-lgsm/hldmsserver/_default.cfg | 2 +- lgsm/config-default/config-lgsm/hwserver/_default.cfg | 2 +- lgsm/config-default/config-lgsm/insserver/_default.cfg | 2 +- lgsm/config-default/config-lgsm/inssserver/_default.cfg | 2 +- lgsm/config-default/config-lgsm/iosserver/_default.cfg | 2 +- lgsm/config-default/config-lgsm/jc2server/_default.cfg | 2 +- lgsm/config-default/config-lgsm/jc3server/_default.cfg | 2 +- lgsm/config-default/config-lgsm/kf2server/_default.cfg | 2 +- lgsm/config-default/config-lgsm/kfserver/_default.cfg | 2 +- lgsm/config-default/config-lgsm/l4d2server/_default.cfg | 2 +- lgsm/config-default/config-lgsm/l4dserver/_default.cfg | 2 +- lgsm/config-default/config-lgsm/mcbserver/_default.cfg | 2 +- lgsm/config-default/config-lgsm/mcserver/_default.cfg | 2 +- lgsm/config-default/config-lgsm/mhserver/_default.cfg | 2 +- lgsm/config-default/config-lgsm/mohaaserver/_default.cfg | 2 +- lgsm/config-default/config-lgsm/mtaserver/_default.cfg | 2 +- lgsm/config-default/config-lgsm/mumbleserver/_default.cfg | 2 +- lgsm/config-default/config-lgsm/ndserver/_default.cfg | 2 +- lgsm/config-default/config-lgsm/nmrihserver/_default.cfg | 2 +- lgsm/config-default/config-lgsm/ns2cserver/_default.cfg | 2 +- lgsm/config-default/config-lgsm/ns2server/_default.cfg | 2 +- lgsm/config-default/config-lgsm/nsserver/_default.cfg | 2 +- lgsm/config-default/config-lgsm/opforserver/_default.cfg | 2 +- lgsm/config-default/config-lgsm/pcserver/_default.cfg | 2 +- lgsm/config-default/config-lgsm/pstbsserver/_default.cfg | 2 +- lgsm/config-default/config-lgsm/pvkiiserver/_default.cfg | 2 +- lgsm/config-default/config-lgsm/pzserver/_default.cfg | 2 +- lgsm/config-default/config-lgsm/q2server/_default.cfg | 2 +- lgsm/config-default/config-lgsm/q3server/_default.cfg | 2 +- lgsm/config-default/config-lgsm/qlserver/_default.cfg | 2 +- lgsm/config-default/config-lgsm/qwserver/_default.cfg | 2 +- lgsm/config-default/config-lgsm/ricochetserver/_default.cfg | 2 +- lgsm/config-default/config-lgsm/roserver/_default.cfg | 2 +- lgsm/config-default/config-lgsm/rtcwserver/_default.cfg | 2 +- lgsm/config-default/config-lgsm/rustserver/_default.cfg | 2 +- lgsm/config-default/config-lgsm/rwserver/_default.cfg | 2 +- lgsm/config-default/config-lgsm/sampserver/_default.cfg | 2 +- lgsm/config-default/config-lgsm/sbotsserver/_default.cfg | 2 +- lgsm/config-default/config-lgsm/sbserver/_default.cfg | 2 +- lgsm/config-default/config-lgsm/sdtdserver/_default.cfg | 2 +- lgsm/config-default/config-lgsm/sfcserver/_default.cfg | 2 +- lgsm/config-default/config-lgsm/sof2server/_default.cfg | 2 +- lgsm/config-default/config-lgsm/solserver/_default.cfg | 2 +- lgsm/config-default/config-lgsm/squadserver/_default.cfg | 2 +- lgsm/config-default/config-lgsm/ss3server/_default.cfg | 2 +- lgsm/config-default/config-lgsm/stserver/_default.cfg | 2 +- lgsm/config-default/config-lgsm/svenserver/_default.cfg | 2 +- lgsm/config-default/config-lgsm/terrariaserver/_default.cfg | 2 +- lgsm/config-default/config-lgsm/tf2server/_default.cfg | 2 +- lgsm/config-default/config-lgsm/tfcserver/_default.cfg | 2 +- lgsm/config-default/config-lgsm/ts3server/_default.cfg | 2 +- lgsm/config-default/config-lgsm/tsserver/_default.cfg | 2 +- lgsm/config-default/config-lgsm/tuserver/_default.cfg | 2 +- lgsm/config-default/config-lgsm/twserver/_default.cfg | 2 +- lgsm/config-default/config-lgsm/untserver/_default.cfg | 2 +- lgsm/config-default/config-lgsm/ut2k4server/_default.cfg | 2 +- lgsm/config-default/config-lgsm/ut3server/_default.cfg | 2 +- lgsm/config-default/config-lgsm/ut99server/_default.cfg | 2 +- lgsm/config-default/config-lgsm/utserver/_default.cfg | 2 +- lgsm/config-default/config-lgsm/vsserver/_default.cfg | 2 +- lgsm/config-default/config-lgsm/wetserver/_default.cfg | 2 +- lgsm/config-default/config-lgsm/wfserver/_default.cfg | 2 +- lgsm/config-default/config-lgsm/wurmserver/_default.cfg | 2 +- lgsm/config-default/config-lgsm/zmrserver/_default.cfg | 2 +- lgsm/config-default/config-lgsm/zpsserver/_default.cfg | 2 +- lgsm/functions/command_postdetails.sh | 2 +- 105 files changed, 105 insertions(+), 105 deletions(-) diff --git a/lgsm/config-default/config-lgsm/ahl2server/_default.cfg b/lgsm/config-default/config-lgsm/ahl2server/_default.cfg index 9db6afe4a..e9bac4a9c 100644 --- a/lgsm/config-default/config-lgsm/ahl2server/_default.cfg +++ b/lgsm/config-default/config-lgsm/ahl2server/_default.cfg @@ -42,7 +42,7 @@ displayip="" # More info | https://docs.linuxgsm.com/alerts#more-info postalert="off" postdays="7" -posttarget="https://hastebin.com" +posttarget="https://termbin.com" # Discord Alerts | https://docs.linuxgsm.com/alerts/discord discordalert="off" diff --git a/lgsm/config-default/config-lgsm/ahlserver/_default.cfg b/lgsm/config-default/config-lgsm/ahlserver/_default.cfg index b9d5e36b5..35f4d6d01 100644 --- a/lgsm/config-default/config-lgsm/ahlserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/ahlserver/_default.cfg @@ -37,7 +37,7 @@ displayip="" # More info | https://docs.linuxgsm.com/alerts#more-info postalert="off" postdays="7" -posttarget="https://hastebin.com" +posttarget="https://termbin.com" # Discord Alerts | https://docs.linuxgsm.com/alerts/discord discordalert="off" diff --git a/lgsm/config-default/config-lgsm/arkserver/_default.cfg b/lgsm/config-default/config-lgsm/arkserver/_default.cfg index 8aace7519..61c2d456d 100644 --- a/lgsm/config-default/config-lgsm/arkserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/arkserver/_default.cfg @@ -39,7 +39,7 @@ displayip="" # More info | https://docs.linuxgsm.com/alerts#more-info postalert="off" postdays="7" -posttarget="https://hastebin.com" +posttarget="https://termbin.com" # Discord Alerts | https://docs.linuxgsm.com/alerts/discord discordalert="off" diff --git a/lgsm/config-default/config-lgsm/arma3server/_default.cfg b/lgsm/config-default/config-lgsm/arma3server/_default.cfg index b8e8b3db7..0a4f1fbf4 100644 --- a/lgsm/config-default/config-lgsm/arma3server/_default.cfg +++ b/lgsm/config-default/config-lgsm/arma3server/_default.cfg @@ -53,7 +53,7 @@ displayip="" # More info | https://docs.linuxgsm.com/alerts#more-info postalert="off" postdays="7" -posttarget="https://hastebin.com" +posttarget="https://termbin.com" # Discord Alerts | https://docs.linuxgsm.com/alerts/discord discordalert="off" diff --git a/lgsm/config-default/config-lgsm/bb2server/_default.cfg b/lgsm/config-default/config-lgsm/bb2server/_default.cfg index 044dd18a3..976423a1e 100644 --- a/lgsm/config-default/config-lgsm/bb2server/_default.cfg +++ b/lgsm/config-default/config-lgsm/bb2server/_default.cfg @@ -43,7 +43,7 @@ displayip="" # More info | https://docs.linuxgsm.com/alerts#more-info postalert="off" postdays="7" -posttarget="https://hastebin.com" +posttarget="https://termbin.com" # Discord Alerts | https://docs.linuxgsm.com/alerts/discord discordalert="off" diff --git a/lgsm/config-default/config-lgsm/bbserver/_default.cfg b/lgsm/config-default/config-lgsm/bbserver/_default.cfg index a263486d4..64dc10d11 100644 --- a/lgsm/config-default/config-lgsm/bbserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/bbserver/_default.cfg @@ -37,7 +37,7 @@ displayip="" # More info | https://docs.linuxgsm.com/alerts#more-info postalert="off" postdays="7" -posttarget="https://hastebin.com" +posttarget="https://termbin.com" # Discord Alerts | https://docs.linuxgsm.com/alerts/discord discordalert="off" diff --git a/lgsm/config-default/config-lgsm/bdserver/_default.cfg b/lgsm/config-default/config-lgsm/bdserver/_default.cfg index a57e41c12..daaba9f6b 100644 --- a/lgsm/config-default/config-lgsm/bdserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/bdserver/_default.cfg @@ -37,7 +37,7 @@ displayip="" # More info | https://docs.linuxgsm.com/alerts#more-info postalert="off" postdays="7" -posttarget="https://hastebin.com" +posttarget="https://termbin.com" # Discord Alerts | https://docs.linuxgsm.com/alerts/discord discordalert="off" diff --git a/lgsm/config-default/config-lgsm/bf1942server/_default.cfg b/lgsm/config-default/config-lgsm/bf1942server/_default.cfg index cd77130db..69974740e 100644 --- a/lgsm/config-default/config-lgsm/bf1942server/_default.cfg +++ b/lgsm/config-default/config-lgsm/bf1942server/_default.cfg @@ -30,7 +30,7 @@ displayip="" # More info | https://docs.linuxgsm.com/alerts#more-info postalert="off" postdays="7" -posttarget="https://hastebin.com" +posttarget="https://termbin.com" # Discord Alerts | https://docs.linuxgsm.com/alerts/discord discordalert="off" diff --git a/lgsm/config-default/config-lgsm/bmdmserver/_default.cfg b/lgsm/config-default/config-lgsm/bmdmserver/_default.cfg index 5b947486b..45dce5225 100644 --- a/lgsm/config-default/config-lgsm/bmdmserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/bmdmserver/_default.cfg @@ -43,7 +43,7 @@ displayip="" # More info | https://docs.linuxgsm.com/alerts#more-info postalert="off" postdays="7" -posttarget="https://hastebin.com" +posttarget="https://termbin.com" # Discord Alerts | https://docs.linuxgsm.com/alerts/discord discordalert="off" diff --git a/lgsm/config-default/config-lgsm/boserver/_default.cfg b/lgsm/config-default/config-lgsm/boserver/_default.cfg index da2b4163a..3a3f3e5d5 100644 --- a/lgsm/config-default/config-lgsm/boserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/boserver/_default.cfg @@ -36,7 +36,7 @@ displayip="" # More info | https://docs.linuxgsm.com/alerts#more-info postalert="off" postdays="7" -posttarget="https://hastebin.com" +posttarget="https://termbin.com" # Discord Alerts | https://docs.linuxgsm.com/alerts/discord discordalert="off" diff --git a/lgsm/config-default/config-lgsm/bsserver/_default.cfg b/lgsm/config-default/config-lgsm/bsserver/_default.cfg index 6685734d9..9ff4abdb8 100644 --- a/lgsm/config-default/config-lgsm/bsserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/bsserver/_default.cfg @@ -47,7 +47,7 @@ displayip="" # More info | https://docs.linuxgsm.com/alerts#more-info postalert="off" postdays="7" -posttarget="https://hastebin.com" +posttarget="https://termbin.com" # Discord Alerts | https://docs.linuxgsm.com/alerts/discord discordalert="off" diff --git a/lgsm/config-default/config-lgsm/bt1944server/_default.cfg b/lgsm/config-default/config-lgsm/bt1944server/_default.cfg index 3565e3670..22e0f1c3d 100644 --- a/lgsm/config-default/config-lgsm/bt1944server/_default.cfg +++ b/lgsm/config-default/config-lgsm/bt1944server/_default.cfg @@ -35,7 +35,7 @@ displayip="" # More info | https://docs.linuxgsm.com/alerts#more-info postalert="off" postdays="7" -posttarget="https://hastebin.com" +posttarget="https://termbin.com" # Discord Alerts | https://docs.linuxgsm.com/alerts/discord discordalert="off" diff --git a/lgsm/config-default/config-lgsm/btserver/_default.cfg b/lgsm/config-default/config-lgsm/btserver/_default.cfg index 7825610a9..97b4db1c2 100644 --- a/lgsm/config-default/config-lgsm/btserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/btserver/_default.cfg @@ -30,7 +30,7 @@ displayip="" # More info | https://docs.linuxgsm.com/alerts#more-info postalert="off" postdays="7" -posttarget="https://hastebin.com" +posttarget="https://termbin.com" # Discord Alerts | https://docs.linuxgsm.com/alerts/discord discordalert="off" diff --git a/lgsm/config-default/config-lgsm/ccserver/_default.cfg b/lgsm/config-default/config-lgsm/ccserver/_default.cfg index e6feab660..2f1b11818 100644 --- a/lgsm/config-default/config-lgsm/ccserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/ccserver/_default.cfg @@ -38,7 +38,7 @@ displayip="" # More info | https://docs.linuxgsm.com/alerts#more-info postalert="off" postdays="7" -posttarget="https://hastebin.com" +posttarget="https://termbin.com" # Discord Alerts | https://docs.linuxgsm.com/alerts/discord discordalert="off" diff --git a/lgsm/config-default/config-lgsm/cod2server/_default.cfg b/lgsm/config-default/config-lgsm/cod2server/_default.cfg index 61e2962c3..18e0b8678 100644 --- a/lgsm/config-default/config-lgsm/cod2server/_default.cfg +++ b/lgsm/config-default/config-lgsm/cod2server/_default.cfg @@ -36,7 +36,7 @@ displayip="" # More info | https://docs.linuxgsm.com/alerts#more-info postalert="off" postdays="7" -posttarget="https://hastebin.com" +posttarget="https://termbin.com" # Discord Alerts | https://docs.linuxgsm.com/alerts/discord discordalert="off" diff --git a/lgsm/config-default/config-lgsm/cod4server/_default.cfg b/lgsm/config-default/config-lgsm/cod4server/_default.cfg index ebf573ac3..b2efc329c 100644 --- a/lgsm/config-default/config-lgsm/cod4server/_default.cfg +++ b/lgsm/config-default/config-lgsm/cod4server/_default.cfg @@ -36,7 +36,7 @@ displayip="" # More info | https://docs.linuxgsm.com/alerts#more-info postalert="off" postdays="7" -posttarget="https://hastebin.com" +posttarget="https://termbin.com" # Discord Alerts | https://docs.linuxgsm.com/alerts/discord discordalert="off" diff --git a/lgsm/config-default/config-lgsm/codserver/_default.cfg b/lgsm/config-default/config-lgsm/codserver/_default.cfg index bd783d62c..e50e6184b 100644 --- a/lgsm/config-default/config-lgsm/codserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/codserver/_default.cfg @@ -36,7 +36,7 @@ displayip="" # More info | https://docs.linuxgsm.com/alerts#more-info postalert="off" postdays="7" -posttarget="https://hastebin.com" +posttarget="https://termbin.com" # Discord Alerts | https://docs.linuxgsm.com/alerts/discord discordalert="off" diff --git a/lgsm/config-default/config-lgsm/coduoserver/_default.cfg b/lgsm/config-default/config-lgsm/coduoserver/_default.cfg index a187cfc99..7397f8504 100644 --- a/lgsm/config-default/config-lgsm/coduoserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/coduoserver/_default.cfg @@ -36,7 +36,7 @@ displayip="" # More info | https://docs.linuxgsm.com/alerts#more-info postalert="off" postdays="7" -posttarget="https://hastebin.com" +posttarget="https://termbin.com" # Discord Alerts | https://docs.linuxgsm.com/alerts/discord discordalert="off" diff --git a/lgsm/config-default/config-lgsm/codwawserver/_default.cfg b/lgsm/config-default/config-lgsm/codwawserver/_default.cfg index ba9163205..a77fd2dd3 100644 --- a/lgsm/config-default/config-lgsm/codwawserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/codwawserver/_default.cfg @@ -36,7 +36,7 @@ displayip="" # More info | https://docs.linuxgsm.com/alerts#more-info postalert="off" postdays="7" -posttarget="https://hastebin.com" +posttarget="https://termbin.com" # Discord Alerts | https://docs.linuxgsm.com/alerts/discord discordalert="off" diff --git a/lgsm/config-default/config-lgsm/csczserver/_default.cfg b/lgsm/config-default/config-lgsm/csczserver/_default.cfg index 918d78841..4c56cb6e1 100644 --- a/lgsm/config-default/config-lgsm/csczserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/csczserver/_default.cfg @@ -37,7 +37,7 @@ displayip="" # More info | https://docs.linuxgsm.com/alerts#more-info postalert="off" postdays="7" -posttarget="https://hastebin.com" +posttarget="https://termbin.com" # Discord Alerts | https://docs.linuxgsm.com/alerts/discord discordalert="off" diff --git a/lgsm/config-default/config-lgsm/csgoserver/_default.cfg b/lgsm/config-default/config-lgsm/csgoserver/_default.cfg index 15f45808b..f4e242e99 100644 --- a/lgsm/config-default/config-lgsm/csgoserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/csgoserver/_default.cfg @@ -63,7 +63,7 @@ displayip="" # More info | https://docs.linuxgsm.com/alerts#more-info postalert="off" postdays="7" -posttarget="https://hastebin.com" +posttarget="https://termbin.com" # Discord Alerts | https://docs.linuxgsm.com/alerts/discord discordalert="off" diff --git a/lgsm/config-default/config-lgsm/csserver/_default.cfg b/lgsm/config-default/config-lgsm/csserver/_default.cfg index 1c58f0256..bc27a535c 100644 --- a/lgsm/config-default/config-lgsm/csserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/csserver/_default.cfg @@ -37,7 +37,7 @@ displayip="" # More info | https://docs.linuxgsm.com/alerts#more-info postalert="off" postdays="7" -posttarget="https://hastebin.com" +posttarget="https://termbin.com" # Discord Alerts | https://docs.linuxgsm.com/alerts/discord discordalert="off" diff --git a/lgsm/config-default/config-lgsm/cssserver/_default.cfg b/lgsm/config-default/config-lgsm/cssserver/_default.cfg index d50676ced..5388b6123 100644 --- a/lgsm/config-default/config-lgsm/cssserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/cssserver/_default.cfg @@ -43,7 +43,7 @@ displayip="" # More info | https://docs.linuxgsm.com/alerts#more-info postalert="off" postdays="7" -posttarget="https://hastebin.com" +posttarget="https://termbin.com" # Discord Alerts | https://docs.linuxgsm.com/alerts/discord discordalert="off" diff --git a/lgsm/config-default/config-lgsm/dabserver/_default.cfg b/lgsm/config-default/config-lgsm/dabserver/_default.cfg index 03d518e06..c9347d8d4 100644 --- a/lgsm/config-default/config-lgsm/dabserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/dabserver/_default.cfg @@ -38,7 +38,7 @@ displayip="" # More info | https://docs.linuxgsm.com/alerts#more-info postalert="off" postdays="7" -posttarget="https://hastebin.com" +posttarget="https://termbin.com" # Discord Alerts | https://docs.linuxgsm.com/alerts/discord discordalert="off" diff --git a/lgsm/config-default/config-lgsm/dmcserver/_default.cfg b/lgsm/config-default/config-lgsm/dmcserver/_default.cfg index d2dcee9fa..7a11d77a8 100644 --- a/lgsm/config-default/config-lgsm/dmcserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/dmcserver/_default.cfg @@ -37,7 +37,7 @@ displayip="" # More info | https://docs.linuxgsm.com/alerts#more-info postalert="off" postdays="7" -posttarget="https://hastebin.com" +posttarget="https://termbin.com" # Discord Alerts | https://docs.linuxgsm.com/alerts/discord discordalert="off" diff --git a/lgsm/config-default/config-lgsm/dodserver/_default.cfg b/lgsm/config-default/config-lgsm/dodserver/_default.cfg index f23ab09b8..50ea789b1 100644 --- a/lgsm/config-default/config-lgsm/dodserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/dodserver/_default.cfg @@ -37,7 +37,7 @@ displayip="" # More info | https://docs.linuxgsm.com/alerts#more-info postalert="off" postdays="7" -posttarget="https://hastebin.com" +posttarget="https://termbin.com" # Discord Alerts | https://docs.linuxgsm.com/alerts/discord discordalert="off" diff --git a/lgsm/config-default/config-lgsm/dodsserver/_default.cfg b/lgsm/config-default/config-lgsm/dodsserver/_default.cfg index 4e1aa6c94..b967ef72d 100644 --- a/lgsm/config-default/config-lgsm/dodsserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/dodsserver/_default.cfg @@ -38,7 +38,7 @@ displayip="" # More info | https://docs.linuxgsm.com/alerts#more-info postalert="off" postdays="7" -posttarget="https://hastebin.com" +posttarget="https://termbin.com" # Discord Alerts | https://docs.linuxgsm.com/alerts/discord discordalert="off" diff --git a/lgsm/config-default/config-lgsm/doiserver/_default.cfg b/lgsm/config-default/config-lgsm/doiserver/_default.cfg index 958e088f2..eebbdf699 100644 --- a/lgsm/config-default/config-lgsm/doiserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/doiserver/_default.cfg @@ -39,7 +39,7 @@ displayip="" # More info | https://docs.linuxgsm.com/alerts#more-info postalert="off" postdays="7" -posttarget="https://hastebin.com" +posttarget="https://termbin.com" # Discord Alerts | https://docs.linuxgsm.com/alerts/discord discordalert="off" diff --git a/lgsm/config-default/config-lgsm/dstserver/_default.cfg b/lgsm/config-default/config-lgsm/dstserver/_default.cfg index 3073f2d79..a7025a966 100644 --- a/lgsm/config-default/config-lgsm/dstserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/dstserver/_default.cfg @@ -41,7 +41,7 @@ displayip="" # More info | https://docs.linuxgsm.com/alerts#more-info postalert="off" postdays="7" -posttarget="https://hastebin.com" +posttarget="https://termbin.com" # Discord Alerts | https://docs.linuxgsm.com/alerts/discord discordalert="off" diff --git a/lgsm/config-default/config-lgsm/dysserver/_default.cfg b/lgsm/config-default/config-lgsm/dysserver/_default.cfg index f368fc310..501fe475e 100644 --- a/lgsm/config-default/config-lgsm/dysserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/dysserver/_default.cfg @@ -43,7 +43,7 @@ displayip="" # More info | https://docs.linuxgsm.com/alerts#more-info postalert="off" postdays="7" -posttarget="https://hastebin.com" +posttarget="https://termbin.com" # Discord Alerts | https://docs.linuxgsm.com/alerts/discord discordalert="off" diff --git a/lgsm/config-default/config-lgsm/ecoserver/_default.cfg b/lgsm/config-default/config-lgsm/ecoserver/_default.cfg index c68e15df2..fe53ee5f8 100644 --- a/lgsm/config-default/config-lgsm/ecoserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/ecoserver/_default.cfg @@ -30,7 +30,7 @@ displayip="" # More info | https://docs.linuxgsm.com/alerts#more-info postalert="off" postdays="7" -posttarget="https://hastebin.com" +posttarget="https://termbin.com" # Discord Alerts | https://docs.linuxgsm.com/alerts/discord discordalert="off" diff --git a/lgsm/config-default/config-lgsm/emserver/_default.cfg b/lgsm/config-default/config-lgsm/emserver/_default.cfg index 65fe4d0dc..75445659c 100644 --- a/lgsm/config-default/config-lgsm/emserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/emserver/_default.cfg @@ -43,7 +43,7 @@ displayip="" # More info | https://docs.linuxgsm.com/alerts#more-info postalert="off" postdays="7" -posttarget="https://hastebin.com" +posttarget="https://termbin.com" # Discord Alerts | https://docs.linuxgsm.com/alerts/discord discordalert="off" diff --git a/lgsm/config-default/config-lgsm/etlserver/_default.cfg b/lgsm/config-default/config-lgsm/etlserver/_default.cfg index ed4759cd2..7813caa17 100644 --- a/lgsm/config-default/config-lgsm/etlserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/etlserver/_default.cfg @@ -30,7 +30,7 @@ displayip="" # More info | https://docs.linuxgsm.com/alerts#more-info postalert="off" postdays="7" -posttarget="https://hastebin.com" +posttarget="https://termbin.com" # Discord Alerts | https://docs.linuxgsm.com/alerts/discord discordalert="off" diff --git a/lgsm/config-default/config-lgsm/fctrserver/_default.cfg b/lgsm/config-default/config-lgsm/fctrserver/_default.cfg index 15c5bf0cf..c071e01f3 100644 --- a/lgsm/config-default/config-lgsm/fctrserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/fctrserver/_default.cfg @@ -38,7 +38,7 @@ displayip="" # More info | https://docs.linuxgsm.com/alerts#more-info postalert="off" postdays="7" -posttarget="https://hastebin.com" +posttarget="https://termbin.com" # Discord Alerts | https://docs.linuxgsm.com/alerts/discord discordalert="off" diff --git a/lgsm/config-default/config-lgsm/fofserver/_default.cfg b/lgsm/config-default/config-lgsm/fofserver/_default.cfg index b2da0ed5b..5c1e44af6 100644 --- a/lgsm/config-default/config-lgsm/fofserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/fofserver/_default.cfg @@ -38,7 +38,7 @@ displayip="" # More info | https://docs.linuxgsm.com/alerts#more-info postalert="off" postdays="7" -posttarget="https://hastebin.com" +posttarget="https://termbin.com" # Discord Alerts | https://docs.linuxgsm.com/alerts/discord discordalert="off" diff --git a/lgsm/config-default/config-lgsm/gesserver/_default.cfg b/lgsm/config-default/config-lgsm/gesserver/_default.cfg index 00ba0497f..a88fe3cff 100644 --- a/lgsm/config-default/config-lgsm/gesserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/gesserver/_default.cfg @@ -38,7 +38,7 @@ displayip="" # More info | https://docs.linuxgsm.com/alerts#more-info postalert="off" postdays="7" -posttarget="https://hastebin.com" +posttarget="https://termbin.com" # Discord Alerts | https://docs.linuxgsm.com/alerts/discord discordalert="off" diff --git a/lgsm/config-default/config-lgsm/gmodserver/_default.cfg b/lgsm/config-default/config-lgsm/gmodserver/_default.cfg index d1501dc71..b12b1e551 100644 --- a/lgsm/config-default/config-lgsm/gmodserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/gmodserver/_default.cfg @@ -54,7 +54,7 @@ displayip="" # More info | https://docs.linuxgsm.com/alerts#more-info postalert="off" postdays="7" -posttarget="https://hastebin.com" +posttarget="https://termbin.com" # Discord Alerts | https://docs.linuxgsm.com/alerts/discord discordalert="off" diff --git a/lgsm/config-default/config-lgsm/hl2dmserver/_default.cfg b/lgsm/config-default/config-lgsm/hl2dmserver/_default.cfg index add451f92..4ff3998a1 100644 --- a/lgsm/config-default/config-lgsm/hl2dmserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/hl2dmserver/_default.cfg @@ -38,7 +38,7 @@ displayip="" # More info | https://docs.linuxgsm.com/alerts#more-info postalert="off" postdays="7" -posttarget="https://hastebin.com" +posttarget="https://termbin.com" # Discord Alerts | https://docs.linuxgsm.com/alerts/discord discordalert="off" diff --git a/lgsm/config-default/config-lgsm/hldmserver/_default.cfg b/lgsm/config-default/config-lgsm/hldmserver/_default.cfg index 279f13b73..de4ab821d 100644 --- a/lgsm/config-default/config-lgsm/hldmserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/hldmserver/_default.cfg @@ -37,7 +37,7 @@ displayip="" # More info | https://docs.linuxgsm.com/alerts#more-info postalert="off" postdays="7" -posttarget="https://hastebin.com" +posttarget="https://termbin.com" # Discord Alerts | https://docs.linuxgsm.com/alerts/discord discordalert="off" diff --git a/lgsm/config-default/config-lgsm/hldmsserver/_default.cfg b/lgsm/config-default/config-lgsm/hldmsserver/_default.cfg index 787e3c32b..c73331705 100644 --- a/lgsm/config-default/config-lgsm/hldmsserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/hldmsserver/_default.cfg @@ -38,7 +38,7 @@ displayip="" # More info | https://docs.linuxgsm.com/alerts#more-info postalert="off" postdays="7" -posttarget="https://hastebin.com" +posttarget="https://termbin.com" # Discord Alerts | https://docs.linuxgsm.com/alerts/discord discordalert="off" diff --git a/lgsm/config-default/config-lgsm/hwserver/_default.cfg b/lgsm/config-default/config-lgsm/hwserver/_default.cfg index facdaea0e..c934622fb 100644 --- a/lgsm/config-default/config-lgsm/hwserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/hwserver/_default.cfg @@ -49,7 +49,7 @@ displayip="" # More info | https://docs.linuxgsm.com/alerts#more-info postalert="off" postdays="7" -posttarget="https://hastebin.com" +posttarget="https://termbin.com" # Discord Alerts | https://docs.linuxgsm.com/alerts/discord discordalert="off" diff --git a/lgsm/config-default/config-lgsm/insserver/_default.cfg b/lgsm/config-default/config-lgsm/insserver/_default.cfg index a9daf4e86..d595be7ff 100644 --- a/lgsm/config-default/config-lgsm/insserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/insserver/_default.cfg @@ -44,7 +44,7 @@ displayip="" # More info | https://docs.linuxgsm.com/alerts#more-info postalert="off" postdays="7" -posttarget="https://hastebin.com" +posttarget="https://termbin.com" # Discord Alerts | https://docs.linuxgsm.com/alerts/discord discordalert="off" diff --git a/lgsm/config-default/config-lgsm/inssserver/_default.cfg b/lgsm/config-default/config-lgsm/inssserver/_default.cfg index 014333b6a..cd66169d6 100644 --- a/lgsm/config-default/config-lgsm/inssserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/inssserver/_default.cfg @@ -45,7 +45,7 @@ displayip="" # More info | https://docs.linuxgsm.com/alerts#more-info postalert="off" postdays="7" -posttarget="https://hastebin.com" +posttarget="https://termbin.com" # Discord Alerts | https://docs.linuxgsm.com/alerts/discord discordalert="off" diff --git a/lgsm/config-default/config-lgsm/iosserver/_default.cfg b/lgsm/config-default/config-lgsm/iosserver/_default.cfg index 27f93c29c..7e63ed0f2 100644 --- a/lgsm/config-default/config-lgsm/iosserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/iosserver/_default.cfg @@ -38,7 +38,7 @@ displayip="" # More info | https://docs.linuxgsm.com/alerts#more-info postalert="off" postdays="7" -posttarget="https://hastebin.com" +posttarget="https://termbin.com" # Discord Alerts | https://docs.linuxgsm.com/alerts/discord discordalert="off" diff --git a/lgsm/config-default/config-lgsm/jc2server/_default.cfg b/lgsm/config-default/config-lgsm/jc2server/_default.cfg index 2942b0b6c..deccd031d 100644 --- a/lgsm/config-default/config-lgsm/jc2server/_default.cfg +++ b/lgsm/config-default/config-lgsm/jc2server/_default.cfg @@ -30,7 +30,7 @@ displayip="" # More info | https://docs.linuxgsm.com/alerts#more-info postalert="off" postdays="7" -posttarget="https://hastebin.com" +posttarget="https://termbin.com" # Discord Alerts | https://docs.linuxgsm.com/alerts/discord discordalert="off" diff --git a/lgsm/config-default/config-lgsm/jc3server/_default.cfg b/lgsm/config-default/config-lgsm/jc3server/_default.cfg index 1c88c7de2..44d668dda 100644 --- a/lgsm/config-default/config-lgsm/jc3server/_default.cfg +++ b/lgsm/config-default/config-lgsm/jc3server/_default.cfg @@ -30,7 +30,7 @@ displayip="" # More info | https://docs.linuxgsm.com/alerts#more-info postalert="off" postdays="7" -posttarget="https://hastebin.com" +posttarget="https://termbin.com" # Discord Alerts | https://docs.linuxgsm.com/alerts/discord discordalert="off" diff --git a/lgsm/config-default/config-lgsm/kf2server/_default.cfg b/lgsm/config-default/config-lgsm/kf2server/_default.cfg index 016c28f69..6e31023be 100644 --- a/lgsm/config-default/config-lgsm/kf2server/_default.cfg +++ b/lgsm/config-default/config-lgsm/kf2server/_default.cfg @@ -36,7 +36,7 @@ displayip="" # More info | https://docs.linuxgsm.com/alerts#more-info postalert="off" postdays="7" -posttarget="https://hastebin.com" +posttarget="https://termbin.com" # Discord Alerts | https://docs.linuxgsm.com/alerts/discord discordalert="off" diff --git a/lgsm/config-default/config-lgsm/kfserver/_default.cfg b/lgsm/config-default/config-lgsm/kfserver/_default.cfg index ee5817909..ec86c5369 100644 --- a/lgsm/config-default/config-lgsm/kfserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/kfserver/_default.cfg @@ -42,7 +42,7 @@ displayip="" # More info | https://docs.linuxgsm.com/alerts#more-info postalert="off" postdays="7" -posttarget="https://hastebin.com" +posttarget="https://termbin.com" # Discord Alerts | https://docs.linuxgsm.com/alerts/discord discordalert="off" diff --git a/lgsm/config-default/config-lgsm/l4d2server/_default.cfg b/lgsm/config-default/config-lgsm/l4d2server/_default.cfg index 90c597f9e..ca29ca183 100644 --- a/lgsm/config-default/config-lgsm/l4d2server/_default.cfg +++ b/lgsm/config-default/config-lgsm/l4d2server/_default.cfg @@ -37,7 +37,7 @@ displayip="" # More info | https://docs.linuxgsm.com/alerts#more-info postalert="off" postdays="7" -posttarget="https://hastebin.com" +posttarget="https://termbin.com" # Discord Alerts | https://docs.linuxgsm.com/alerts/discord discordalert="off" diff --git a/lgsm/config-default/config-lgsm/l4dserver/_default.cfg b/lgsm/config-default/config-lgsm/l4dserver/_default.cfg index c72d16e14..2181c81f1 100644 --- a/lgsm/config-default/config-lgsm/l4dserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/l4dserver/_default.cfg @@ -37,7 +37,7 @@ displayip="" # More info | https://docs.linuxgsm.com/alerts#more-info postalert="off" postdays="7" -posttarget="https://hastebin.com" +posttarget="https://termbin.com" # Discord Alerts | https://docs.linuxgsm.com/alerts/discord discordalert="off" diff --git a/lgsm/config-default/config-lgsm/mcbserver/_default.cfg b/lgsm/config-default/config-lgsm/mcbserver/_default.cfg index 79a623d61..26d25edf3 100644 --- a/lgsm/config-default/config-lgsm/mcbserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/mcbserver/_default.cfg @@ -30,7 +30,7 @@ displayip="" # More info | https://docs.linuxgsm.com/alerts#more-info postalert="off" postdays="7" -posttarget="https://hastebin.com" +posttarget="https://termbin.com" # Discord Alerts | https://docs.linuxgsm.com/alerts/discord discordalert="off" diff --git a/lgsm/config-default/config-lgsm/mcserver/_default.cfg b/lgsm/config-default/config-lgsm/mcserver/_default.cfg index 904a2af88..efa103c67 100644 --- a/lgsm/config-default/config-lgsm/mcserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/mcserver/_default.cfg @@ -33,7 +33,7 @@ displayip="" # More info | https://docs.linuxgsm.com/alerts#more-info postalert="off" postdays="7" -posttarget="https://hastebin.com" +posttarget="https://termbin.com" # Discord Alerts | https://docs.linuxgsm.com/alerts/discord discordalert="off" diff --git a/lgsm/config-default/config-lgsm/mhserver/_default.cfg b/lgsm/config-default/config-lgsm/mhserver/_default.cfg index cc4de6276..dc80cc318 100644 --- a/lgsm/config-default/config-lgsm/mhserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/mhserver/_default.cfg @@ -38,7 +38,7 @@ displayip="" # More info | https://docs.linuxgsm.com/alerts#more-info postalert="off" postdays="7" -posttarget="https://hastebin.com" +posttarget="https://termbin.com" # Discord Alerts | https://docs.linuxgsm.com/alerts/discord discordalert="off" diff --git a/lgsm/config-default/config-lgsm/mohaaserver/_default.cfg b/lgsm/config-default/config-lgsm/mohaaserver/_default.cfg index 97fe12dc8..ad386e280 100644 --- a/lgsm/config-default/config-lgsm/mohaaserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/mohaaserver/_default.cfg @@ -35,7 +35,7 @@ displayip="" # More info | https://docs.linuxgsm.com/alerts#more-info postalert="off" postdays="7" -posttarget="https://hastebin.com" +posttarget="https://termbin.com" # Discord Alerts | https://docs.linuxgsm.com/alerts/discord discordalert="off" diff --git a/lgsm/config-default/config-lgsm/mtaserver/_default.cfg b/lgsm/config-default/config-lgsm/mtaserver/_default.cfg index bb1e47762..03f6f4321 100644 --- a/lgsm/config-default/config-lgsm/mtaserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/mtaserver/_default.cfg @@ -34,7 +34,7 @@ displayip="" # More info | https://docs.linuxgsm.com/alerts#more-info postalert="off" postdays="7" -posttarget="https://hastebin.com" +posttarget="https://termbin.com" # Discord Alerts | https://docs.linuxgsm.com/alerts/discord discordalert="off" diff --git a/lgsm/config-default/config-lgsm/mumbleserver/_default.cfg b/lgsm/config-default/config-lgsm/mumbleserver/_default.cfg index b722193b2..fffde2f51 100644 --- a/lgsm/config-default/config-lgsm/mumbleserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/mumbleserver/_default.cfg @@ -31,7 +31,7 @@ displayip="" # More info | https://docs.linuxgsm.com/alerts#more-info postalert="off" postdays="7" -posttarget="https://hastebin.com" +posttarget="https://termbin.com" # Discord Alerts | https://docs.linuxgsm.com/alerts/discord discordalert="off" diff --git a/lgsm/config-default/config-lgsm/ndserver/_default.cfg b/lgsm/config-default/config-lgsm/ndserver/_default.cfg index ab269aaf6..d37f44f1f 100644 --- a/lgsm/config-default/config-lgsm/ndserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/ndserver/_default.cfg @@ -38,7 +38,7 @@ displayip="" # More info | https://docs.linuxgsm.com/alerts#more-info postalert="off" postdays="7" -posttarget="https://hastebin.com" +posttarget="https://termbin.com" # Discord Alerts | https://docs.linuxgsm.com/alerts/discord discordalert="off" diff --git a/lgsm/config-default/config-lgsm/nmrihserver/_default.cfg b/lgsm/config-default/config-lgsm/nmrihserver/_default.cfg index 4c56f8a8d..a2aac7eb3 100644 --- a/lgsm/config-default/config-lgsm/nmrihserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/nmrihserver/_default.cfg @@ -43,7 +43,7 @@ displayip="" # More info | https://docs.linuxgsm.com/alerts#more-info postalert="off" postdays="7" -posttarget="https://hastebin.com" +posttarget="https://termbin.com" # Discord Alerts | https://docs.linuxgsm.com/alerts/discord discordalert="off" diff --git a/lgsm/config-default/config-lgsm/ns2cserver/_default.cfg b/lgsm/config-default/config-lgsm/ns2cserver/_default.cfg index f984d1908..9dbb28592 100644 --- a/lgsm/config-default/config-lgsm/ns2cserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/ns2cserver/_default.cfg @@ -45,7 +45,7 @@ displayip="" # More info | https://docs.linuxgsm.com/alerts#more-info postalert="off" postdays="7" -posttarget="https://hastebin.com" +posttarget="https://termbin.com" # Discord Alerts | https://docs.linuxgsm.com/alerts/discord discordalert="off" diff --git a/lgsm/config-default/config-lgsm/ns2server/_default.cfg b/lgsm/config-default/config-lgsm/ns2server/_default.cfg index fbf312222..9b042130f 100644 --- a/lgsm/config-default/config-lgsm/ns2server/_default.cfg +++ b/lgsm/config-default/config-lgsm/ns2server/_default.cfg @@ -49,7 +49,7 @@ displayip="" # More info | https://docs.linuxgsm.com/alerts#more-info postalert="off" postdays="7" -posttarget="https://hastebin.com" +posttarget="https://termbin.com" # Discord Alerts | https://docs.linuxgsm.com/alerts/discord discordalert="off" diff --git a/lgsm/config-default/config-lgsm/nsserver/_default.cfg b/lgsm/config-default/config-lgsm/nsserver/_default.cfg index 6654d2e82..ad85b88c6 100644 --- a/lgsm/config-default/config-lgsm/nsserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/nsserver/_default.cfg @@ -37,7 +37,7 @@ displayip="" # More info | https://docs.linuxgsm.com/alerts#more-info postalert="off" postdays="7" -posttarget="https://hastebin.com" +posttarget="https://termbin.com" # Discord Alerts | https://docs.linuxgsm.com/alerts/discord discordalert="off" diff --git a/lgsm/config-default/config-lgsm/opforserver/_default.cfg b/lgsm/config-default/config-lgsm/opforserver/_default.cfg index 5f50583fb..b5c9a30e5 100644 --- a/lgsm/config-default/config-lgsm/opforserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/opforserver/_default.cfg @@ -37,7 +37,7 @@ displayip="" # More info | https://docs.linuxgsm.com/alerts#more-info postalert="off" postdays="7" -posttarget="https://hastebin.com" +posttarget="https://termbin.com" # Discord Alerts | https://docs.linuxgsm.com/alerts/discord discordalert="off" diff --git a/lgsm/config-default/config-lgsm/pcserver/_default.cfg b/lgsm/config-default/config-lgsm/pcserver/_default.cfg index a4f7a8942..d9c65db4d 100644 --- a/lgsm/config-default/config-lgsm/pcserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/pcserver/_default.cfg @@ -30,7 +30,7 @@ displayip="" # More info | https://docs.linuxgsm.com/alerts#more-info postalert="off" postdays="7" -posttarget="https://hastebin.com" +posttarget="https://termbin.com" # Discord Alerts | https://docs.linuxgsm.com/alerts/discord discordalert="off" diff --git a/lgsm/config-default/config-lgsm/pstbsserver/_default.cfg b/lgsm/config-default/config-lgsm/pstbsserver/_default.cfg index 09e357bef..c8ea594e7 100644 --- a/lgsm/config-default/config-lgsm/pstbsserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/pstbsserver/_default.cfg @@ -39,7 +39,7 @@ displayip="" # More info | https://docs.linuxgsm.com/alerts#more-info postalert="off" postdays="7" -posttarget="https://hastebin.com" +posttarget="https://termbin.com" # Discord Alerts | https://docs.linuxgsm.com/alerts/discord discordalert="off" diff --git a/lgsm/config-default/config-lgsm/pvkiiserver/_default.cfg b/lgsm/config-default/config-lgsm/pvkiiserver/_default.cfg index 4d6244afd..a38ba25cd 100644 --- a/lgsm/config-default/config-lgsm/pvkiiserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/pvkiiserver/_default.cfg @@ -38,7 +38,7 @@ displayip="" # More info | https://docs.linuxgsm.com/alerts#more-info postalert="off" postdays="7" -posttarget="https://hastebin.com" +posttarget="https://termbin.com" # Discord Alerts | https://docs.linuxgsm.com/alerts/discord discordalert="off" diff --git a/lgsm/config-default/config-lgsm/pzserver/_default.cfg b/lgsm/config-default/config-lgsm/pzserver/_default.cfg index 62862f21f..9373f9a0f 100644 --- a/lgsm/config-default/config-lgsm/pzserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/pzserver/_default.cfg @@ -33,7 +33,7 @@ displayip="" # More info | https://docs.linuxgsm.com/alerts#more-info postalert="off" postdays="7" -posttarget="https://hastebin.com" +posttarget="https://termbin.com" # Discord Alerts | https://docs.linuxgsm.com/alerts/discord discordalert="off" diff --git a/lgsm/config-default/config-lgsm/q2server/_default.cfg b/lgsm/config-default/config-lgsm/q2server/_default.cfg index 8601a5f8d..7d28a1cbe 100644 --- a/lgsm/config-default/config-lgsm/q2server/_default.cfg +++ b/lgsm/config-default/config-lgsm/q2server/_default.cfg @@ -35,7 +35,7 @@ displayip="" # More info | https://docs.linuxgsm.com/alerts#more-info postalert="off" postdays="7" -posttarget="https://hastebin.com" +posttarget="https://termbin.com" # Discord Alerts | https://docs.linuxgsm.com/alerts/discord discordalert="off" diff --git a/lgsm/config-default/config-lgsm/q3server/_default.cfg b/lgsm/config-default/config-lgsm/q3server/_default.cfg index 02d27c9d8..b9b9f6b81 100644 --- a/lgsm/config-default/config-lgsm/q3server/_default.cfg +++ b/lgsm/config-default/config-lgsm/q3server/_default.cfg @@ -35,7 +35,7 @@ displayip="" # More info | https://docs.linuxgsm.com/alerts#more-info postalert="off" postdays="7" -posttarget="https://hastebin.com" +posttarget="https://termbin.com" # Discord Alerts | https://docs.linuxgsm.com/alerts/discord discordalert="off" diff --git a/lgsm/config-default/config-lgsm/qlserver/_default.cfg b/lgsm/config-default/config-lgsm/qlserver/_default.cfg index 71f86ac98..2e3597261 100644 --- a/lgsm/config-default/config-lgsm/qlserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/qlserver/_default.cfg @@ -32,7 +32,7 @@ displayip="" # More info | https://docs.linuxgsm.com/alerts#more-info postalert="off" postdays="7" -posttarget="https://hastebin.com" +posttarget="https://termbin.com" # Discord Alerts | https://docs.linuxgsm.com/alerts/discord discordalert="off" diff --git a/lgsm/config-default/config-lgsm/qwserver/_default.cfg b/lgsm/config-default/config-lgsm/qwserver/_default.cfg index 693ffcbdf..ee1d88eef 100644 --- a/lgsm/config-default/config-lgsm/qwserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/qwserver/_default.cfg @@ -34,7 +34,7 @@ displayip="" # More info | https://docs.linuxgsm.com/alerts#more-info postalert="off" postdays="7" -posttarget="https://hastebin.com" +posttarget="https://termbin.com" # Discord Alerts | https://docs.linuxgsm.com/alerts/discord discordalert="off" diff --git a/lgsm/config-default/config-lgsm/ricochetserver/_default.cfg b/lgsm/config-default/config-lgsm/ricochetserver/_default.cfg index f62f4ceb1..0117dbd61 100644 --- a/lgsm/config-default/config-lgsm/ricochetserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/ricochetserver/_default.cfg @@ -37,7 +37,7 @@ displayip="" # More info | https://docs.linuxgsm.com/alerts#more-info postalert="off" postdays="7" -posttarget="https://hastebin.com" +posttarget="https://termbin.com" # Discord Alerts | https://docs.linuxgsm.com/alerts/discord discordalert="off" diff --git a/lgsm/config-default/config-lgsm/roserver/_default.cfg b/lgsm/config-default/config-lgsm/roserver/_default.cfg index 1018f0028..ac2e2d845 100644 --- a/lgsm/config-default/config-lgsm/roserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/roserver/_default.cfg @@ -38,7 +38,7 @@ displayip="" # More info | https://docs.linuxgsm.com/alerts#more-info postalert="off" postdays="7" -posttarget="https://hastebin.com" +posttarget="https://termbin.com" # Discord Alerts | https://docs.linuxgsm.com/alerts/discord discordalert="off" diff --git a/lgsm/config-default/config-lgsm/rtcwserver/_default.cfg b/lgsm/config-default/config-lgsm/rtcwserver/_default.cfg index 1abd2e20d..c54f98369 100644 --- a/lgsm/config-default/config-lgsm/rtcwserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/rtcwserver/_default.cfg @@ -35,7 +35,7 @@ displayip="" # More info | https://docs.linuxgsm.com/alerts#more-info postalert="off" postdays="7" -posttarget="https://hastebin.com" +posttarget="https://termbin.com" # Discord Alerts | https://docs.linuxgsm.com/alerts/discord discordalert="off" diff --git a/lgsm/config-default/config-lgsm/rustserver/_default.cfg b/lgsm/config-default/config-lgsm/rustserver/_default.cfg index 6835d35d6..05d97a267 100644 --- a/lgsm/config-default/config-lgsm/rustserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/rustserver/_default.cfg @@ -62,7 +62,7 @@ displayip="" # More info | https://docs.linuxgsm.com/alerts#more-info postalert="off" postdays="7" -posttarget="https://hastebin.com" +posttarget="https://termbin.com" # Discord Alerts | https://docs.linuxgsm.com/alerts/discord discordalert="off" diff --git a/lgsm/config-default/config-lgsm/rwserver/_default.cfg b/lgsm/config-default/config-lgsm/rwserver/_default.cfg index 966c473fc..89aea7cb2 100644 --- a/lgsm/config-default/config-lgsm/rwserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/rwserver/_default.cfg @@ -33,7 +33,7 @@ displayip="" # More info | https://docs.linuxgsm.com/alerts#more-info postalert="off" postdays="7" -posttarget="https://hastebin.com" +posttarget="https://termbin.com" # Discord Alerts | https://docs.linuxgsm.com/alerts/discord discordalert="off" diff --git a/lgsm/config-default/config-lgsm/sampserver/_default.cfg b/lgsm/config-default/config-lgsm/sampserver/_default.cfg index 50b52ad56..fe7ac9111 100644 --- a/lgsm/config-default/config-lgsm/sampserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/sampserver/_default.cfg @@ -34,7 +34,7 @@ displayip="" # More info | https://docs.linuxgsm.com/alerts#more-info postalert="off" postdays="7" -posttarget="https://hastebin.com" +posttarget="https://termbin.com" # Discord Alerts | https://docs.linuxgsm.com/alerts/discord discordalert="off" diff --git a/lgsm/config-default/config-lgsm/sbotsserver/_default.cfg b/lgsm/config-default/config-lgsm/sbotsserver/_default.cfg index e5d21ae7e..34c05d609 100644 --- a/lgsm/config-default/config-lgsm/sbotsserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/sbotsserver/_default.cfg @@ -38,7 +38,7 @@ displayip="" # More info | https://docs.linuxgsm.com/alerts#more-info postalert="off" postdays="7" -posttarget="https://hastebin.com" +posttarget="https://termbin.com" # Discord Alerts | https://docs.linuxgsm.com/alerts/discord discordalert="off" diff --git a/lgsm/config-default/config-lgsm/sbserver/_default.cfg b/lgsm/config-default/config-lgsm/sbserver/_default.cfg index cdff1963d..4cb4a00aa 100644 --- a/lgsm/config-default/config-lgsm/sbserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/sbserver/_default.cfg @@ -37,7 +37,7 @@ displayip="" # More info | https://docs.linuxgsm.com/alerts#more-info postalert="off" postdays="7" -posttarget="https://hastebin.com" +posttarget="https://termbin.com" # Discord Alerts | https://docs.linuxgsm.com/alerts/discord discordalert="off" diff --git a/lgsm/config-default/config-lgsm/sdtdserver/_default.cfg b/lgsm/config-default/config-lgsm/sdtdserver/_default.cfg index 4355298bb..d6cc4a109 100644 --- a/lgsm/config-default/config-lgsm/sdtdserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/sdtdserver/_default.cfg @@ -33,7 +33,7 @@ displayip="" # More info | https://docs.linuxgsm.com/alerts#more-info postalert="off" postdays="7" -posttarget="https://hastebin.com" +posttarget="https://termbin.com" # Discord Alerts | https://docs.linuxgsm.com/alerts/discord discordalert="off" diff --git a/lgsm/config-default/config-lgsm/sfcserver/_default.cfg b/lgsm/config-default/config-lgsm/sfcserver/_default.cfg index 373678cb4..04743cab2 100644 --- a/lgsm/config-default/config-lgsm/sfcserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/sfcserver/_default.cfg @@ -38,7 +38,7 @@ displayip="" # More info | https://docs.linuxgsm.com/alerts#more-info postalert="off" postdays="7" -posttarget="https://hastebin.com" +posttarget="https://termbin.com" # Discord Alerts | https://docs.linuxgsm.com/alerts/discord discordalert="off" diff --git a/lgsm/config-default/config-lgsm/sof2server/_default.cfg b/lgsm/config-default/config-lgsm/sof2server/_default.cfg index 48887e1ce..36ef2b89b 100644 --- a/lgsm/config-default/config-lgsm/sof2server/_default.cfg +++ b/lgsm/config-default/config-lgsm/sof2server/_default.cfg @@ -35,7 +35,7 @@ displayip="" # More info | https://docs.linuxgsm.com/alerts#more-info postalert="off" postdays="7" -posttarget="https://hastebin.com" +posttarget="https://termbin.com" # Discord Alerts | https://docs.linuxgsm.com/alerts/discord discordalert="off" diff --git a/lgsm/config-default/config-lgsm/solserver/_default.cfg b/lgsm/config-default/config-lgsm/solserver/_default.cfg index 89fe8c4e1..1cf1f3491 100644 --- a/lgsm/config-default/config-lgsm/solserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/solserver/_default.cfg @@ -36,7 +36,7 @@ displayip="" # More info | https://docs.linuxgsm.com/alerts#more-info postalert="off" postdays="7" -posttarget="https://hastebin.com" +posttarget="https://termbin.com" # Discord Alerts | https://docs.linuxgsm.com/alerts/discord discordalert="off" diff --git a/lgsm/config-default/config-lgsm/squadserver/_default.cfg b/lgsm/config-default/config-lgsm/squadserver/_default.cfg index ab8551bcb..633025284 100644 --- a/lgsm/config-default/config-lgsm/squadserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/squadserver/_default.cfg @@ -35,7 +35,7 @@ displayip="" # More info | https://docs.linuxgsm.com/alerts#more-info postalert="off" postdays="7" -posttarget="https://hastebin.com" +posttarget="https://termbin.com" # Discord Alerts | https://docs.linuxgsm.com/alerts/discord discordalert="off" diff --git a/lgsm/config-default/config-lgsm/ss3server/_default.cfg b/lgsm/config-default/config-lgsm/ss3server/_default.cfg index 606fdb21c..349cd6673 100644 --- a/lgsm/config-default/config-lgsm/ss3server/_default.cfg +++ b/lgsm/config-default/config-lgsm/ss3server/_default.cfg @@ -34,7 +34,7 @@ displayip="" # More info | https://docs.linuxgsm.com/alerts#more-info postalert="off" postdays="7" -posttarget="https://hastebin.com" +posttarget="https://termbin.com" # Discord Alerts | https://docs.linuxgsm.com/alerts/discord discordalert="off" diff --git a/lgsm/config-default/config-lgsm/stserver/_default.cfg b/lgsm/config-default/config-lgsm/stserver/_default.cfg index 73883f785..4f1656375 100644 --- a/lgsm/config-default/config-lgsm/stserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/stserver/_default.cfg @@ -40,7 +40,7 @@ displayip="" # More info | https://docs.linuxgsm.com/alerts#more-info postalert="off" postdays="7" -posttarget="https://hastebin.com" +posttarget="https://termbin.com" # Discord Alerts | https://docs.linuxgsm.com/alerts/discord discordalert="off" diff --git a/lgsm/config-default/config-lgsm/svenserver/_default.cfg b/lgsm/config-default/config-lgsm/svenserver/_default.cfg index 208adad83..bf35e6a20 100644 --- a/lgsm/config-default/config-lgsm/svenserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/svenserver/_default.cfg @@ -37,7 +37,7 @@ displayip="" # More info | https://docs.linuxgsm.com/alerts#more-info postalert="off" postdays="7" -posttarget="https://hastebin.com" +posttarget="https://termbin.com" # Discord Alerts | https://docs.linuxgsm.com/alerts/discord discordalert="off" diff --git a/lgsm/config-default/config-lgsm/terrariaserver/_default.cfg b/lgsm/config-default/config-lgsm/terrariaserver/_default.cfg index 495eaf159..54956236c 100644 --- a/lgsm/config-default/config-lgsm/terrariaserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/terrariaserver/_default.cfg @@ -37,7 +37,7 @@ displayip="" # More info | https://docs.linuxgsm.com/alerts#more-info postalert="off" postdays="7" -posttarget="https://hastebin.com" +posttarget="https://termbin.com" # Discord Alerts | https://docs.linuxgsm.com/alerts/discord discordalert="off" diff --git a/lgsm/config-default/config-lgsm/tf2server/_default.cfg b/lgsm/config-default/config-lgsm/tf2server/_default.cfg index bcc4585b4..741f30a75 100644 --- a/lgsm/config-default/config-lgsm/tf2server/_default.cfg +++ b/lgsm/config-default/config-lgsm/tf2server/_default.cfg @@ -43,7 +43,7 @@ displayip="" # More info | https://docs.linuxgsm.com/alerts#more-info postalert="off" postdays="7" -posttarget="https://hastebin.com" +posttarget="https://termbin.com" # Discord Alerts | https://docs.linuxgsm.com/alerts/discord discordalert="off" diff --git a/lgsm/config-default/config-lgsm/tfcserver/_default.cfg b/lgsm/config-default/config-lgsm/tfcserver/_default.cfg index 0223c28c4..3a0d22ea5 100644 --- a/lgsm/config-default/config-lgsm/tfcserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/tfcserver/_default.cfg @@ -37,7 +37,7 @@ displayip="" # More info | https://docs.linuxgsm.com/alerts#more-info postalert="off" postdays="7" -posttarget="https://hastebin.com" +posttarget="https://termbin.com" # Discord Alerts | https://docs.linuxgsm.com/alerts/discord discordalert="off" diff --git a/lgsm/config-default/config-lgsm/ts3server/_default.cfg b/lgsm/config-default/config-lgsm/ts3server/_default.cfg index 2d53a0725..7a721ec01 100644 --- a/lgsm/config-default/config-lgsm/ts3server/_default.cfg +++ b/lgsm/config-default/config-lgsm/ts3server/_default.cfg @@ -33,7 +33,7 @@ displayip="" # More info | https://docs.linuxgsm.com/alerts#more-info postalert="off" postdays="7" -posttarget="https://hastebin.com" +posttarget="https://termbin.com" # Discord Alerts | https://docs.linuxgsm.com/alerts/discord discordalert="off" diff --git a/lgsm/config-default/config-lgsm/tsserver/_default.cfg b/lgsm/config-default/config-lgsm/tsserver/_default.cfg index be66db897..c454e1f15 100644 --- a/lgsm/config-default/config-lgsm/tsserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/tsserver/_default.cfg @@ -37,7 +37,7 @@ displayip="" # More info | https://docs.linuxgsm.com/alerts#more-info postalert="off" postdays="7" -posttarget="https://hastebin.com" +posttarget="https://termbin.com" # Discord Alerts | https://docs.linuxgsm.com/alerts/discord discordalert="off" diff --git a/lgsm/config-default/config-lgsm/tuserver/_default.cfg b/lgsm/config-default/config-lgsm/tuserver/_default.cfg index 2c0b3b445..acc711d2c 100644 --- a/lgsm/config-default/config-lgsm/tuserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/tuserver/_default.cfg @@ -40,7 +40,7 @@ displayip="" # More info | https://docs.linuxgsm.com/alerts#more-info postalert="off" postdays="7" -posttarget="https://hastebin.com" +posttarget="https://termbin.com" # Discord Alerts | https://docs.linuxgsm.com/alerts/discord discordalert="off" diff --git a/lgsm/config-default/config-lgsm/twserver/_default.cfg b/lgsm/config-default/config-lgsm/twserver/_default.cfg index f9ca0f996..e10305a94 100644 --- a/lgsm/config-default/config-lgsm/twserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/twserver/_default.cfg @@ -37,7 +37,7 @@ displayip="" # More info | https://docs.linuxgsm.com/alerts#more-info postalert="off" postdays="7" -posttarget="https://hastebin.com" +posttarget="https://termbin.com" # Discord Alerts | https://docs.linuxgsm.com/alerts/discord discordalert="off" diff --git a/lgsm/config-default/config-lgsm/untserver/_default.cfg b/lgsm/config-default/config-lgsm/untserver/_default.cfg index e50f032c4..1b91ba923 100644 --- a/lgsm/config-default/config-lgsm/untserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/untserver/_default.cfg @@ -40,7 +40,7 @@ displayip="" # More info | https://docs.linuxgsm.com/alerts#more-info postalert="off" postdays="7" -posttarget="https://hastebin.com" +posttarget="https://termbin.com" # Discord Alerts | https://docs.linuxgsm.com/alerts/discord discordalert="off" diff --git a/lgsm/config-default/config-lgsm/ut2k4server/_default.cfg b/lgsm/config-default/config-lgsm/ut2k4server/_default.cfg index 2658f60ca..74f026ea5 100644 --- a/lgsm/config-default/config-lgsm/ut2k4server/_default.cfg +++ b/lgsm/config-default/config-lgsm/ut2k4server/_default.cfg @@ -34,7 +34,7 @@ displayip="" # More info | https://docs.linuxgsm.com/alerts#more-info postalert="off" postdays="7" -posttarget="https://hastebin.com" +posttarget="https://termbin.com" # Discord Alerts | https://docs.linuxgsm.com/alerts/discord discordalert="off" diff --git a/lgsm/config-default/config-lgsm/ut3server/_default.cfg b/lgsm/config-default/config-lgsm/ut3server/_default.cfg index 6c1db9e1e..16998ea6c 100644 --- a/lgsm/config-default/config-lgsm/ut3server/_default.cfg +++ b/lgsm/config-default/config-lgsm/ut3server/_default.cfg @@ -45,7 +45,7 @@ displayip="" # More info | https://docs.linuxgsm.com/alerts#more-info postalert="off" postdays="7" -posttarget="https://hastebin.com" +posttarget="https://termbin.com" # Discord Alerts | https://docs.linuxgsm.com/alerts/discord discordalert="off" diff --git a/lgsm/config-default/config-lgsm/ut99server/_default.cfg b/lgsm/config-default/config-lgsm/ut99server/_default.cfg index d8d80345d..dad542598 100644 --- a/lgsm/config-default/config-lgsm/ut99server/_default.cfg +++ b/lgsm/config-default/config-lgsm/ut99server/_default.cfg @@ -34,7 +34,7 @@ displayip="" # More info | https://docs.linuxgsm.com/alerts#more-info postalert="off" postdays="7" -posttarget="https://hastebin.com" +posttarget="https://termbin.com" # Discord Alerts | https://docs.linuxgsm.com/alerts/discord discordalert="off" diff --git a/lgsm/config-default/config-lgsm/utserver/_default.cfg b/lgsm/config-default/config-lgsm/utserver/_default.cfg index 5227e99bf..b12457c44 100644 --- a/lgsm/config-default/config-lgsm/utserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/utserver/_default.cfg @@ -38,7 +38,7 @@ displayip="" # More info | https://docs.linuxgsm.com/alerts#more-info postalert="off" postdays="7" -posttarget="https://hastebin.com" +posttarget="https://termbin.com" # Discord Alerts | https://docs.linuxgsm.com/alerts/discord discordalert="off" diff --git a/lgsm/config-default/config-lgsm/vsserver/_default.cfg b/lgsm/config-default/config-lgsm/vsserver/_default.cfg index f1f8f7c4d..6da0d9fb1 100644 --- a/lgsm/config-default/config-lgsm/vsserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/vsserver/_default.cfg @@ -37,7 +37,7 @@ displayip="" # More info | https://docs.linuxgsm.com/alerts#more-info postalert="off" postdays="7" -posttarget="https://hastebin.com" +posttarget="https://termbin.com" # Discord Alerts | https://docs.linuxgsm.com/alerts/discord discordalert="off" diff --git a/lgsm/config-default/config-lgsm/wetserver/_default.cfg b/lgsm/config-default/config-lgsm/wetserver/_default.cfg index 3df5c91dc..6cce7a75a 100644 --- a/lgsm/config-default/config-lgsm/wetserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/wetserver/_default.cfg @@ -30,7 +30,7 @@ displayip="" # More info | https://docs.linuxgsm.com/alerts#more-info postalert="off" postdays="7" -posttarget="https://hastebin.com" +posttarget="https://termbin.com" # Discord Alerts | https://docs.linuxgsm.com/alerts/discord discordalert="off" diff --git a/lgsm/config-default/config-lgsm/wfserver/_default.cfg b/lgsm/config-default/config-lgsm/wfserver/_default.cfg index dacb39aaf..b40fcda6d 100644 --- a/lgsm/config-default/config-lgsm/wfserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/wfserver/_default.cfg @@ -35,7 +35,7 @@ displayip="" # More info | https://docs.linuxgsm.com/alerts#more-info postalert="off" postdays="7" -posttarget="https://hastebin.com" +posttarget="https://termbin.com" # Discord Alerts | https://docs.linuxgsm.com/alerts/discord discordalert="off" diff --git a/lgsm/config-default/config-lgsm/wurmserver/_default.cfg b/lgsm/config-default/config-lgsm/wurmserver/_default.cfg index 08a17c81b..a532aa93a 100644 --- a/lgsm/config-default/config-lgsm/wurmserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/wurmserver/_default.cfg @@ -32,7 +32,7 @@ displayip="" # More info | https://docs.linuxgsm.com/alerts#more-info postalert="off" postdays="7" -posttarget="https://hastebin.com" +posttarget="https://termbin.com" # Discord Alerts | https://docs.linuxgsm.com/alerts/discord discordalert="off" diff --git a/lgsm/config-default/config-lgsm/zmrserver/_default.cfg b/lgsm/config-default/config-lgsm/zmrserver/_default.cfg index 7de855e46..7e1c621b0 100644 --- a/lgsm/config-default/config-lgsm/zmrserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/zmrserver/_default.cfg @@ -38,7 +38,7 @@ displayip="" # More info | https://docs.linuxgsm.com/alerts#more-info postalert="off" postdays="7" -posttarget="https://hastebin.com" +posttarget="https://termbin.com" # Discord Alerts | https://docs.linuxgsm.com/alerts/discord discordalert="off" diff --git a/lgsm/config-default/config-lgsm/zpsserver/_default.cfg b/lgsm/config-default/config-lgsm/zpsserver/_default.cfg index 5f8d76c23..8d55e4d44 100644 --- a/lgsm/config-default/config-lgsm/zpsserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/zpsserver/_default.cfg @@ -43,7 +43,7 @@ displayip="" # More info | https://docs.linuxgsm.com/alerts#more-info postalert="off" postdays="7" -posttarget="https://hastebin.com" +posttarget="https://termbin.com" # Discord Alerts | https://docs.linuxgsm.com/alerts/discord discordalert="off" diff --git a/lgsm/functions/command_postdetails.sh b/lgsm/functions/command_postdetails.sh index 0657a2622..083bc7213 100644 --- a/lgsm/functions/command_postdetails.sh +++ b/lgsm/functions/command_postdetails.sh @@ -27,7 +27,7 @@ local function_selfname=$(basename "$(readlink -f "${BASH_SOURCE[0]}")") # to post to pastebin, or # rustserver@gamerig:~$ posttarget= ./rustserver pd # to leave the output on the filesystem. -posttarget=${posttarget="https://hastebin.com"} +posttarget=${posttarget="https://termbin.com"} # For pastebin, you can set the expiration period. # use 1 week as the default, other options are '24h' for a day, etc. From 736e55717f9a789aae783ddf5c74bba5d19ab9bc Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Sun, 16 Feb 2020 01:01:23 +0000 Subject: [PATCH 267/534] standardise command if --- lgsm/functions/check_deps.sh | 36 +++++++++++----------- lgsm/functions/command_dev_detect_deps.sh | 4 +-- lgsm/functions/command_dev_detect_glibc.sh | 2 +- lgsm/functions/command_fastdl.sh | 2 +- lgsm/functions/command_monitor.sh | 2 +- lgsm/functions/command_stop.sh | 2 +- lgsm/functions/command_validate.sh | 2 +- lgsm/functions/core_dl.sh | 2 +- lgsm/functions/info_distro.sh | 10 +++--- lgsm/functions/info_stats.sh | 2 +- lgsm/functions/install_server_files.sh | 2 +- lgsm/functions/query_gamedig.sh | 2 +- lgsm/functions/update_steamcmd.sh | 2 +- linuxgsm.sh | 4 +-- tests/tests_fctrserver.sh | 4 +-- tests/tests_jc2server.sh | 2 +- tests/tests_mcserver.sh | 4 +-- tests/tests_ts3server.sh | 4 +-- 18 files changed, 44 insertions(+), 44 deletions(-) diff --git a/lgsm/functions/check_deps.sh b/lgsm/functions/check_deps.sh index 5362e73b5..c88f2870c 100644 --- a/lgsm/functions/check_deps.sh +++ b/lgsm/functions/check_deps.sh @@ -160,7 +160,7 @@ fn_deps_detector(){ depstatus=1 jquniversemissing=1 elif [ "${deptocheck}" == "mono-complete" ]; then - if [ -n "$(command -v mono 2>/dev/null)" ]&&[ "$(mono --version 2>&1 | grep -Po '(?<=version )\d')" -ge 5 ]; then + if [ "$(command -v mono 2>/dev/null)" ]&&[ "$(mono --version 2>&1 | grep -Po '(?<=version )\d')" -ge 5 ]; then # Mono >= 5.0.0 already installed. depstatus=0 else @@ -168,10 +168,10 @@ fn_deps_detector(){ depstatus=1 monostatus=1 fi - elif [ -n "$(command -v dpkg-query 2>/dev/null)" ]; then + elif [ "$(command -v dpkg-query 2>/dev/null)" ]; then dpkg-query -W -f='${Status}' "${deptocheck}" 2>/dev/null | grep -q -P '^install ok installed' depstatus=$? - elif [ -n "$(command -v rpm 2>/dev/null)" ]; then + elif [ "$(command -v rpm 2>/dev/null)" ]; then rpm -q "${deptocheck}" > /dev/null 2>&1 depstatus=$? fi @@ -212,15 +212,15 @@ fn_deps_email(){ array_deps_required+=( exim4 ) elif [ -d /etc/sendmail ]; then array_deps_required+=( sendmail ) - elif [ -n "$(command -v dpkg-query 2>/dev/null)" ]; then + elif [ "$(command -v dpkg-query 2>/dev/null)" ]; then array_deps_required+=( mailutils postfix ) - elif [ -n "$(command -v rpm 2>/dev/null)" ]; then + elif [ "$(command -v rpm 2>/dev/null)" ]; then array_deps_required+=( mailx postfix ) fi else - if [ -n "$(command -v dpkg-query 2>/dev/null)" ]; then + if [ "$(command -v dpkg-query 2>/dev/null)" ]; then array_deps_required+=( mailutils postfix ) - elif [ -n "$(command -v rpm 2>/dev/null)" ]; then + elif [ "$(command -v rpm 2>/dev/null)" ]; then array_deps_required+=( mailx postfix ) fi fi @@ -255,13 +255,13 @@ fn_found_missing_deps(){ echo -en "...\r" sleep 1 echo -en " \r" - if [ -n "$(command -v dpkg-query 2>/dev/null)" ]; then + if [ "$(command -v dpkg-query 2>/dev/null)" ]; then cmd="sudo dpkg --add-architecture i386; sudo apt update; sudo apt -y install ${array_deps_missing[@]}" eval "${cmd}" - elif [ -n "$(command -v dnf 2>/dev/null)" ]; then + elif [ "$(command -v dnf 2>/dev/null)" ]; then cmd="sudo dnf -y install ${array_deps_missing[@]}" eval "${cmd}" - elif [ -n "$(command -v yum 2>/dev/null)" ]; then + elif [ "$(command -v yum 2>/dev/null)" ]; then cmd="sudo yum -y install ${array_deps_missing[@]}" eval "${cmd}" fi @@ -271,11 +271,11 @@ fn_found_missing_deps(){ echo -e "" fn_print_warning_nl "Manually install dependencies." fn_script_log_warn "Manually install dependencies." - if [ -n "$(command -v dpkg-query 2>/dev/null)" ]; then + if [ "$(command -v dpkg-query 2>/dev/null)" ]; then echo -e " sudo dpkg --add-architecture i386; sudo apt update; sudo apt install ${array_deps_missing[@]}" - elif [ -n "$(command -v dnf 2>/dev/null)" ]; then + elif [ "$(command -v dnf 2>/dev/null)" ]; then echo -e " sudo dnf install ${array_deps_missing[@]}" - elif [ -n "$(command -v yum 2>/dev/null)" ]; then + elif [ "$(command -v yum 2>/dev/null)" ]; then echo -e " sudo yum install ${array_deps_missing[@]}" fi if [ "${steamcmdfail}" ]; then @@ -292,11 +292,11 @@ fn_found_missing_deps(){ echo -e "" 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 2>/dev/null)" ]; then + if [ "$(command -v dpkg-query 2>/dev/null)" ]; then echo -e " sudo dpkg --add-architecture i386; sudo apt update; sudo apt install ${array_deps_missing[@]}" - elif [ -n "$(command -v dnf 2>/dev/null)" ]; then + elif [ "$(command -v dnf 2>/dev/null)" ]; then echo -e " sudo dnf install ${array_deps_missing[@]}" - elif [ -n "$(command -v yum 2>/dev/null)" ]; then + elif [ "$(command -v yum 2>/dev/null)" ]; then echo -e " sudo yum install ${array_deps_missing[@]}" fi if [ "${steamcmdfail}" ]; then @@ -337,7 +337,7 @@ fn_deps_build_debian(){ # LinuxGSM requirements. array_deps_required=( curl wget ca-certificates file bsdmainutils util-linux python3 tar bzip2 gzip unzip binutils bc jq ) - if [ -n "$(command -v tmux 2>/dev/null)" ]; then + if [ "$(command -v tmux 2>/dev/null)" ]; then tmuxcheck=1 # Added for users compiling tmux from source to bypass check. else array_deps_required+=( tmux ) @@ -461,7 +461,7 @@ fn_deps_build_redhat(){ fi # All servers except ts3 require tmux. - if [ -n "$(command -v tmux 2>/dev/null)" ]; then + if [ "$(command -v tmux 2>/dev/null)" ]; then # Added for users compiling tmux from source to bypass check. tmuxcheck=1 else diff --git a/lgsm/functions/command_dev_detect_deps.sh b/lgsm/functions/command_dev_detect_deps.sh index 252b37022..50b9078c8 100644 --- a/lgsm/functions/command_dev_detect_deps.sh +++ b/lgsm/functions/command_dev_detect_deps.sh @@ -13,9 +13,9 @@ echo -e "Dependencies Checker" echo -e "=================================" echo -e "Checking directory: " echo -e "${serverfiles}" -if [ -n "$(command -v eu-readelf 2>/dev/null)" ]; then +if [ "$(command -v eu-readelf 2>/dev/null)" ]; then readelf=eu-readelf -elif [ -n "$(command -v readelf 2>/dev/null)" ]; then +elif [ "$(command -v readelf 2>/dev/null)" ]; then readelf=readelf else echo -e "readelf/eu-readelf not installed" diff --git a/lgsm/functions/command_dev_detect_glibc.sh b/lgsm/functions/command_dev_detect_glibc.sh index e86fb05db..c5c624ed2 100644 --- a/lgsm/functions/command_dev_detect_glibc.sh +++ b/lgsm/functions/command_dev_detect_glibc.sh @@ -13,7 +13,7 @@ echo -e "=================================" echo -e "glibc Requirements Checker" echo -e "=================================" -if [ -z "$(command -v objdump)" ]; then +if [ ! "$(command -v objdump)" ]; then fn_print_failure_nl "objdump is missing" fn_script_log_fatal "objdump is missing" core_exit.sh diff --git a/lgsm/functions/command_fastdl.sh b/lgsm/functions/command_fastdl.sh index d862c7ed8..de74f62f8 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 2>/dev/null)" ]; then +if [ ! "$(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_monitor.sh b/lgsm/functions/command_monitor.sh index 363189098..0dada9464 100644 --- a/lgsm/functions/command_monitor.sh +++ b/lgsm/functions/command_monitor.sh @@ -211,7 +211,7 @@ fn_monitor_loop(){ do # Will check if gamedig is installed and bypass if not. if [ "${querymethod}" == "gamedig" ]; then - if [ -n "$(command -v gamedig 2>/dev/null)" ]&&[ "$(command -v jq 2>/dev/null)" ]; then + if [ "$(command -v gamedig 2>/dev/null)" ]&&[ "$(command -v jq 2>/dev/null)" ]; then if [ -z "${monitorpass}" ]; then fn_monitor_query fi diff --git a/lgsm/functions/command_stop.sh b/lgsm/functions/command_stop.sh index f166fa552..03a3bff18 100644 --- a/lgsm/functions/command_stop.sh +++ b/lgsm/functions/command_stop.sh @@ -126,7 +126,7 @@ fn_stop_graceful_sdtd(){ fn_script_log_info "Graceful: telnet" if [ "${telnetenabled}" == "false" ]; then fn_print_info_nl "Graceful: telnet: DISABLED: Enable in ${servercfg}" - elif [ -n "$(command -v expect 2>/dev/null)" ]; then + elif [ "$(command -v expect 2>/dev/null)" ]; 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}:${telnetport}" diff --git a/lgsm/functions/command_validate.sh b/lgsm/functions/command_validate.sh index 83d9f119b..8ce12b206 100644 --- a/lgsm/functions/command_validate.sh +++ b/lgsm/functions/command_validate.sh @@ -18,7 +18,7 @@ fn_validation(){ cd "${steamcmddir}" || exit # Detects if unbuffer command is available for 32 bit distributions only. info_distro.sh - if [ -n "$(command -v stdbuf)" ]&&[ "${arch}" != "x86_64" ]; then + if [ "$(command -v stdbuf)" ]&&[ "${arch}" != "x86_64" ]; then unbuffer="stdbuf -i0 -o0 -e0" fi diff --git a/lgsm/functions/core_dl.sh b/lgsm/functions/core_dl.sh index 24cff68bf..e4114209f 100644 --- a/lgsm/functions/core_dl.sh +++ b/lgsm/functions/core_dl.sh @@ -256,7 +256,7 @@ fn_update_function(){ } # Check that curl is installed -if [ -z "$(command -v curl 2>/dev/null)" ]; then +if [ ! "$(command -v curl 2>/dev/null)" ]; then echo -e "[ FAIL ] Curl is not installed" exit 1 fi diff --git a/lgsm/functions/info_distro.sh b/lgsm/functions/info_distro.sh index 38305c6e3..9abb31b97 100644 --- a/lgsm/functions/info_distro.sh +++ b/lgsm/functions/info_distro.sh @@ -32,7 +32,7 @@ do distroversion=$(grep VERSION_ID /etc/os-release | sed 's/VERSION_ID=//g' | sed 's/\"//g') distroid=$(grep ID /etc/os-release | grep -v _ID | grep -v ID_ | sed 's/ID=//g' | sed 's/\"//g') distrocodename=$(grep VERSION_CODENAME /etc/os-release | sed 's/VERSION_CODENAME=//g' | sed 's/\"//g') - elif [ -n "$(command -v lsb_release 2>/dev/null)" ]&&[ "${distro_info}" == "lsb_release" ]; then + elif [ "$(command -v lsb_release 2>/dev/null)" ]&&[ "${distro_info}" == "lsb_release" ]; then if [ -z "${distroname}" ];then distroname=$(lsb_release -sd) elif [ -z "${distroversion}" ];then @@ -42,7 +42,7 @@ do elif [ -z "${distrocodename}" ];then distrocodename=$(lsb_release -sc) fi - elif [ -n "$(command -v hostnamectl 2>/dev/null)" ]&&[ "${distro_info}" == "hostnamectl" ]; then + elif [ "$(command -v hostnamectl 2>/dev/null)" ]&&[ "${distro_info}" == "hostnamectl" ]; then if [ -z "${distroname}" ];then distroname=$(hostnamectl | grep "Operating System" | sed 's/Operating System: //g') fi @@ -71,7 +71,7 @@ glibcversion=$(ldd --version | sed -n '1s/.* //p') ## tmux version # e.g: tmux 1.6 -if [ -z "$(command -V tmux 2>/dev/null)" ]; then +if [ ! "$(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" ]; then @@ -107,7 +107,7 @@ fi # Available RAM and swap. # Newer distros can use numfmt to give more accurate results. -if [ -n "$(command -v numfmt 2>/dev/null)" ]; then +if [ "$(command -v numfmt 2>/dev/null)" ]; then # Issue #2005 - Kernel 3.14+ contains MemAvailable which should be used. All others will be calculated. # get the raw KB values of these fields. @@ -252,7 +252,7 @@ else fi # Steam Master Server - checks if detected by master server. -if [ -n "$(command -v jq 2>/dev/null)" ]; then +if [ "$(command -v jq 2>/dev/null)" ]; then if [ "${ip}" ]&&[ "${port}" ]; then if [ "${steammaster}" == "true" ]; then masterserver=$(curl -m 3 -s 'https://api.steampowered.com/ISteamApps/GetServersAtAddress/v0001?addr='${ip}':'${port}'&format=json' | jq '.response.servers[]|.addr' | wc -l) diff --git a/lgsm/functions/info_stats.sh b/lgsm/functions/info_stats.sh index f31db13d7..ef0788fad 100644 --- a/lgsm/functions/info_stats.sh +++ b/lgsm/functions/info_stats.sh @@ -10,7 +10,7 @@ info_distro.sh if [ ! -f "${datadir}/uuid.txt" ];then mkdir -p "${datadir}" touch "${datadir}/uuid.txt" - if [ -n "$(command -v uuidgen 2>/dev/null)" ]; then + if [ "$(command -v uuidgen 2>/dev/null)" ]; then uuidgen > "${datadir}/uuid.txt" else cat /proc/sys/kernel/random/uuid > "${datadir}/uuid.txt" diff --git a/lgsm/functions/install_server_files.sh b/lgsm/functions/install_server_files.sh index b2158b3e7..bb49d0900 100644 --- a/lgsm/functions/install_server_files.sh +++ b/lgsm/functions/install_server_files.sh @@ -98,7 +98,7 @@ fn_install_server_files_steamcmd(){ # Detects if unbuffer command is available for 32 bit distributions only. info_distro.sh - if [ -n "$(command -v stdbuf 2>/dev/null)" ]&&[ "${arch}" != "x86_64" ]; then + if [ "$(command -v stdbuf 2>/dev/null)" ]&&[ "${arch}" != "x86_64" ]; then unbuffer="stdbuf -i0 -o0 -e0" fi diff --git a/lgsm/functions/query_gamedig.sh b/lgsm/functions/query_gamedig.sh index 88e01af5f..4f1bc5638 100644 --- a/lgsm/functions/query_gamedig.sh +++ b/lgsm/functions/query_gamedig.sh @@ -6,7 +6,7 @@ # https://github.com/sonicsnes/node-gamedig # Check if gamedig and jq are installed. -if [ -n "$(command -v gamedig 2>/dev/null)" ]&&[ "$(command -v jq 2>/dev/null)" ]; then +if [ "$(command -v gamedig 2>/dev/null)" ]&&[ "$(command -v jq 2>/dev/null)" ]; then # will bypass query if server offline. check_status.sh diff --git a/lgsm/functions/update_steamcmd.sh b/lgsm/functions/update_steamcmd.sh index 38b7445de..07dbdf9e3 100644 --- a/lgsm/functions/update_steamcmd.sh +++ b/lgsm/functions/update_steamcmd.sh @@ -13,7 +13,7 @@ fn_update_steamcmd_dl(){ # Detects if unbuffer command is available for 32 bit distributions only. info_distro.sh - if [ -n "$(command -v stdbuf)" ]&&[ "${arch}" != "x86_64" ]; then + if [ "$(command -v stdbuf)" ]&&[ "${arch}" != "x86_64" ]; then unbuffer="stdbuf -i0 -o0 -e0" fi diff --git a/linuxgsm.sh b/linuxgsm.sh index 1a000656c..e7afc14b4 100755 --- a/linuxgsm.sh +++ b/linuxgsm.sh @@ -72,7 +72,7 @@ fn_bootstrap_fetch_file(){ fi # If curl exists download file. - if [ -n "$(command -v curl 2>/dev/null)" ]; then + if [ "$(command -v curl 2>/dev/null)" ]; then # Trap to remove part downloaded files. echo -en " fetching ${local_filename}...\c" curlcmd=$(curl -s --fail -L -o "${local_filedir}/${local_filename}" "${remote_fileurl}" 2>&1) @@ -192,7 +192,7 @@ fn_install_menu() { options=$4 # Get menu command. for menucmd in whiptail dialog bash; do - if [ -x "$(command -v "${menucmd}")" ]; then + if [ "$(command -v "${menucmd}")" ]; then menucmd=$(command -v "${menucmd}") break fi diff --git a/tests/tests_fctrserver.sh b/tests/tests_fctrserver.sh index 97aea9caa..6561c7ff4 100644 --- a/tests/tests_fctrserver.sh +++ b/tests/tests_fctrserver.sh @@ -81,7 +81,7 @@ fn_bootstrap_fetch_file(){ fi # If curl exists download file. - if [ -n "$(command -v curl 2>/dev/null)" ]; then + if [ "$(command -v curl 2>/dev/null)" ]; then # Trap to remove part downloaded files. echo -en " fetching ${local_filename}...\c" curlcmd=$(curl -s --fail -L -o "${local_filedir}/${local_filename}" "${remote_fileurl}" 2>&1) @@ -201,7 +201,7 @@ fn_install_menu() { options=$4 # Get menu command. for menucmd in whiptail dialog bash; do - if [ -x "$(command -v "${menucmd}")" ]; then + if [ "$(command -v "${menucmd}")" ]; then menucmd=$(command -v "${menucmd}") break fi diff --git a/tests/tests_jc2server.sh b/tests/tests_jc2server.sh index b80af6554..9478fa638 100644 --- a/tests/tests_jc2server.sh +++ b/tests/tests_jc2server.sh @@ -201,7 +201,7 @@ fn_install_menu() { options=$4 # Get menu command. for menucmd in whiptail dialog bash; do - if [ -x "$(command -v "${menucmd}")" ]; then + if [ "$(command -v "${menucmd}")" ]; then menucmd=$(command -v "${menucmd}") break fi diff --git a/tests/tests_mcserver.sh b/tests/tests_mcserver.sh index 304e125eb..8224c5e8c 100644 --- a/tests/tests_mcserver.sh +++ b/tests/tests_mcserver.sh @@ -81,7 +81,7 @@ fn_bootstrap_fetch_file(){ fi # If curl exists download file. - if [ -n "$(command -v curl 2>/dev/null)" ]; then + if [ "$(command -v curl 2>/dev/null)" ]; then # Trap to remove part downloaded files. echo -en " fetching ${local_filename}...\c" curlcmd=$(curl -s --fail -L -o "${local_filedir}/${local_filename}" "${remote_fileurl}" 2>&1) @@ -201,7 +201,7 @@ fn_install_menu() { options=$4 # Get menu command. for menucmd in whiptail dialog bash; do - if [ -x "$(command -v "${menucmd}")" ]; then + if [ "$(command -v "${menucmd}")" ]; then menucmd=$(command -v "${menucmd}") break fi diff --git a/tests/tests_ts3server.sh b/tests/tests_ts3server.sh index f1544c472..831b1f207 100644 --- a/tests/tests_ts3server.sh +++ b/tests/tests_ts3server.sh @@ -81,7 +81,7 @@ fn_bootstrap_fetch_file(){ fi # If curl exists download file. - if [ -n "$(command -v curl 2>/dev/null)" ]; then + if [ "$(command -v curl 2>/dev/null)" ]; then # Trap to remove part downloaded files. echo -en " fetching ${local_filename}...\c" curlcmd=$(curl -s --fail -L -o "${local_filedir}/${local_filename}" "${remote_fileurl}" 2>&1) @@ -201,7 +201,7 @@ fn_install_menu() { options=$4 # Get menu command. for menucmd in whiptail dialog bash; do - if [ -x "$(command -v "${menucmd}")" ]; then + if [ "$(command -v "${menucmd}")" ]; then menucmd=$(command -v "${menucmd}") break fi From ef7cdb0d9efe3f692666252524dda041e6092b50 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Sun, 16 Feb 2020 23:21:19 +0000 Subject: [PATCH 268/534] feat: debian based distros will now use the steamcmd package --- lgsm/functions/check_deps.sh | 2 +- lgsm/functions/check_steamcmd.sh | 37 ++++++++++++++++++-------- lgsm/functions/command_validate.sh | 8 +++--- lgsm/functions/install_server_files.sh | 14 +++++----- lgsm/functions/update_steamcmd.sh | 15 ++++++----- 5 files changed, 49 insertions(+), 27 deletions(-) diff --git a/lgsm/functions/check_deps.sh b/lgsm/functions/check_deps.sh index c88f2870c..d4ddc8eed 100644 --- a/lgsm/functions/check_deps.sh +++ b/lgsm/functions/check_deps.sh @@ -335,7 +335,7 @@ fn_deps_build_debian(){ array_deps_missing=() # LinuxGSM requirements. - array_deps_required=( curl wget ca-certificates file bsdmainutils util-linux python3 tar bzip2 gzip unzip binutils bc jq ) + array_deps_required=( curl wget ca-certificates file bsdmainutils util-linux python3 tar bzip2 gzip unzip binutils bc jq steamcmd ) if [ "$(command -v tmux 2>/dev/null)" ]; then tmuxcheck=1 # Added for users compiling tmux from source to bypass check. diff --git a/lgsm/functions/check_steamcmd.sh b/lgsm/functions/check_steamcmd.sh index 3f6cd90de..69760f62f 100644 --- a/lgsm/functions/check_steamcmd.sh +++ b/lgsm/functions/check_steamcmd.sh @@ -7,12 +7,13 @@ local commandname="CHECK" fn_install_steamcmd(){ - if [ ! -d "${steamcmddir}" ]; then - mkdir -pv "${steamcmddir}" + if [ ! -d "${steamcmddir}" ]; then + 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}" + chmod +x "${steamcmddir}/steamcmd.sh" 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}" - chmod +x "${steamcmddir}/steamcmd.sh" } fn_check_steamcmd_user(){ @@ -46,13 +47,19 @@ fn_check_steamcmd_user(){ fn_check_steamcmd_sh(){ # Checks if SteamCMD exists when starting or updating a server. # Installs if missing. - if [ ! -f "${steamcmddir}/steamcmd.sh" ]; then - if [ "${function_selfname}" == "command_install.sh" ]; then - fn_install_steamcmd + if [ ! -f "${steamcmddir}/steamcmd.sh" ]||[ ! "$(command -v steamcmd 2>/dev/null)" ]; then + # Debian and Ubuntu uses steamcmd package + if [ -f "/etc/debian_version" ]&&[ ! "$(command -v steamcmd 2>/dev/null)" ]; then + # Install steamcmd with apt + : else - fn_print_error_nl "SteamCMD is missing" - fn_script_log_error "SteamCMD is missing" - fn_install_steamcmd + if [ "${function_selfname}" == "command_install.sh" ]; then + fn_install_steamcmd + else + fn_print_error_nl "SteamCMD is missing" + fn_script_log_error "SteamCMD is missing" + fn_install_steamcmd + fi fi elif [ "${function_selfname}" == "command_install.sh" ]; then fn_print_information "SteamCMD is already installed..." @@ -60,5 +67,13 @@ fn_check_steamcmd_sh(){ fi } +fn_check_steamcmd_check(){ + if [ "$(command -v steamcmd 2>/dev/null)" ]; then + steamcmdcommand="steamcmd" + else + steamcmdcommand="${steamcmdcommand}" +} + fn_check_steamcmd_user fn_check_steamcmd_sh +fn_check_steamcmd_check diff --git a/lgsm/functions/command_validate.sh b/lgsm/functions/command_validate.sh index 8ce12b206..93688892e 100644 --- a/lgsm/functions/command_validate.sh +++ b/lgsm/functions/command_validate.sh @@ -15,7 +15,9 @@ fn_validation(){ echo -e "* https://docs.linuxgsm.com/commands/validate" fn_script_log_info "Validating files: SteamCMD" sleep 3 - cd "${steamcmddir}" || exit + if [ "${steamcmddir}" ]; then + cd "${steamcmddir}" || exit + fi # Detects if unbuffer command is available for 32 bit distributions only. info_distro.sh if [ "$(command -v stdbuf)" ]&&[ "${arch}" != "x86_64" ]; then @@ -23,9 +25,9 @@ fn_validation(){ fi if [ "${appid}" == "90" ]; then - ${unbuffer} ./steamcmd.sh +login "${steamuser}" "${steampass}" +force_install_dir "${serverfiles}" +app_info_print 70 +app_set_config 90 mod "${appidmod}" +app_update "${appid}" "${branch}" +app_update "${appid}" -beta "${branch}" validate +quit | tee -a "${lgsmlog}" + ${unbuffer} ${steamcmdcommand} +login "${steamuser}" "${steampass}" +force_install_dir "${serverfiles}" +app_info_print 70 +app_set_config 90 mod "${appidmod}" +app_update "${appid}" "${branch}" +app_update "${appid}" -beta "${branch}" validate +quit | tee -a "${lgsmlog}" else - ${unbuffer} ./steamcmd.sh +login "${steamuser}" "${steampass}" +force_install_dir "${serverfiles}" +app_update "${appid}" -beta "${branch}" validate +quit | tee -a "${lgsmlog}" + ${unbuffer} ${steamcmdcommand} +login "${steamuser}" "${steampass}" +force_install_dir "${serverfiles}" +app_update "${appid}" -beta "${branch}" validate +quit | tee -a "${lgsmlog}" 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 bb49d0900..553467961 100644 --- a/lgsm/functions/install_server_files.sh +++ b/lgsm/functions/install_server_files.sh @@ -74,7 +74,9 @@ fn_install_server_files_steamcmd(){ counter="0" while [ "${counter}" == "0" ]||[ "${exitcode}" != "0" ]; do counter=$((counter+1)) - cd "${steamcmddir}" || exit + if [ "${steamcmddir}" ]; then + cd "${steamcmddir}" || exit + fi if [ "${counter}" -le "10" ]; then # Attempt 1-4: Standard attempt. # Attempt 5-6: Validate attempt. @@ -104,18 +106,18 @@ fn_install_server_files_steamcmd(){ if [ "${counter}" -le "4" ]; then if [ "${appid}" == "90" ]; then - ${unbuffer} ./steamcmd.sh +login "${steamuser}" "${steampass}" +force_install_dir "${serverfiles}" +app_set_config 90 mod "${appidmod}" +app_update "${appid}" -beta "${branch}" +quit + ${unbuffer} ${steamcmdcommand} +login "${steamuser}" "${steampass}" +force_install_dir "${serverfiles}" +app_set_config 90 mod "${appidmod}" +app_update "${appid}" -beta "${branch}" +quit local exitcode=$? else - ${unbuffer} ./steamcmd.sh +login "${steamuser}" "${steampass}" +force_install_dir "${serverfiles}" +app_update "${appid}" -beta "${branch}" +quit + ${unbuffer} ${steamcmdcommand} +login "${steamuser}" "${steampass}" +force_install_dir "${serverfiles}" +app_update "${appid}" -beta "${branch}" +quit local exitcode=$? 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}" -beta "${branch}" validate +quit + ${unbuffer} ${steamcmdcommand} +login "${steamuser}" "${steampass}" +force_install_dir "${serverfiles}" +app_set_config 90 mod "${appidmod}" +app_update "${appid}" -beta "${branch}" validate +quit local exitcode=$? else - ${unbuffer} ./steamcmd.sh +login "${steamuser}" "${steampass}" +force_install_dir "${serverfiles}" +app_update "${appid}" -beta "${branch}" validate +quit + ${unbuffer} ${steamcmdcommand} +login "${steamuser}" "${steampass}" +force_install_dir "${serverfiles}" +app_update "${appid}" -beta "${branch}" validate +quit local exitcode=$? fi fi @@ -133,7 +135,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 "${serverfiles}" +app_set_config 90 mod "${appidmod}" +app_update "${appid}" "${branch}" validate +quit + ${unbuffer} ${steamcmdcommand} +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/update_steamcmd.sh b/lgsm/functions/update_steamcmd.sh index 07dbdf9e3..4b6b60bc3 100644 --- a/lgsm/functions/update_steamcmd.sh +++ b/lgsm/functions/update_steamcmd.sh @@ -16,12 +16,13 @@ fn_update_steamcmd_dl(){ if [ "$(command -v stdbuf)" ]&&[ "${arch}" != "x86_64" ]; then unbuffer="stdbuf -i0 -o0 -e0" fi - - cd "${steamcmddir}" || exit + if [ "${steamcmddir}" ]; then + cd "${steamcmddir}" || exit + fi if [ "${appid}" == "90" ]; then - ${unbuffer} ./steamcmd.sh +login "${steamuser}" "${steampass}" +force_install_dir "${serverfiles}" +app_set_config 90 mod "${appidmod}" +app_update "${appid}" -beta "${branch}" +quit | tee -a "${lgsmlog}" + ${unbuffer} ${steamcmdcommand} +login "${steamuser}" "${steampass}" +force_install_dir "${serverfiles}" +app_set_config 90 mod "${appidmod}" +app_update "${appid}" -beta "${branch}" +quit | tee -a "${lgsmlog}" else - ${unbuffer} ./steamcmd.sh +login "${steamuser}" "${steampass}" +force_install_dir "${serverfiles}" +app_update "${appid}" -beta "${branch}" +quit | tee -a "${lgsmlog}" + ${unbuffer} ${steamcmdcommand} +login "${steamuser}" "${steampass}" +force_install_dir "${serverfiles}" +app_update "${appid}" -beta "${branch}" +quit | tee -a "${lgsmlog}" fi fix.sh } @@ -50,8 +51,10 @@ fn_update_steamcmd_localbuild(){ fn_update_steamcmd_remotebuild(){ # Gets remote build info. - cd "${steamcmddir}" || exit - remotebuild=$(./steamcmd.sh +login "${steamuser}" "${steampass}" +app_info_update 1 +app_info_print "${appid}" +quit | sed '1,/branches/d' | sed "1,/${branchname}/d" | grep -m 1 buildid | tr -cd '[:digit:]') + if [ "${steamcmddir}" ]; then + cd "${steamcmddir}" || exit + fi + remotebuild=$(${steamcmdcommand} +login "${steamuser}" "${steampass}" +app_info_update 1 +app_info_print "${appid}" +quit | sed '1,/branches/d' | sed "1,/${branchname}/d" | grep -m 1 buildid | tr -cd '[:digit:]') if [ "${installer}" != "1" ]; then fn_print_dots "Checking for update: ${remotelocation}: checking remote build" # Checks if remotebuild variable has been set. From 83e2cbf9be17a5ca01420ed91f1554a42a2d7e18 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Sun, 16 Feb 2020 23:48:12 +0000 Subject: [PATCH 269/534] bugs --- lgsm/functions/check_steamcmd.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lgsm/functions/check_steamcmd.sh b/lgsm/functions/check_steamcmd.sh index 69760f62f..3c7177519 100644 --- a/lgsm/functions/check_steamcmd.sh +++ b/lgsm/functions/check_steamcmd.sh @@ -13,7 +13,6 @@ fn_install_steamcmd(){ 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}" chmod +x "${steamcmddir}/steamcmd.sh" - fi } fn_check_steamcmd_user(){ @@ -71,7 +70,8 @@ fn_check_steamcmd_check(){ if [ "$(command -v steamcmd 2>/dev/null)" ]; then steamcmdcommand="steamcmd" else - steamcmdcommand="${steamcmdcommand}" + steamcmdcommand="./steamcmd.sh" + fi } fn_check_steamcmd_user From 3d43e187420ba4ab23aba19730ed440687b7b3bf Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Mon, 17 Feb 2020 00:15:45 +0000 Subject: [PATCH 270/534] code --- 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 3c7177519..800d737ae 100644 --- a/lgsm/functions/check_steamcmd.sh +++ b/lgsm/functions/check_steamcmd.sh @@ -48,7 +48,7 @@ fn_check_steamcmd_sh(){ # Installs if missing. if [ ! -f "${steamcmddir}/steamcmd.sh" ]||[ ! "$(command -v steamcmd 2>/dev/null)" ]; then # Debian and Ubuntu uses steamcmd package - if [ -f "/etc/debian_version" ]&&[ ! "$(command -v steamcmd 2>/dev/null)" ]; then + if [ -f "/etc/debian_version" ]&&[ "$(command -v steamcmd 2>/dev/null)" ]; then # Install steamcmd with apt : else From 9e811a7ba0ea9cf80d7cda17bf01cd6b02b45b33 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Mon, 17 Feb 2020 00:18:04 +0000 Subject: [PATCH 271/534] code --- lgsm/functions/command_validate.sh | 2 +- lgsm/functions/install_server_files.sh | 2 +- lgsm/functions/update_steamcmd.sh | 4 ++-- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/lgsm/functions/command_validate.sh b/lgsm/functions/command_validate.sh index 93688892e..55a58d266 100644 --- a/lgsm/functions/command_validate.sh +++ b/lgsm/functions/command_validate.sh @@ -15,7 +15,7 @@ fn_validation(){ echo -e "* https://docs.linuxgsm.com/commands/validate" fn_script_log_info "Validating files: SteamCMD" sleep 3 - if [ "${steamcmddir}" ]; then + if [ -d "${steamcmddir}" ]; then cd "${steamcmddir}" || exit fi # Detects if unbuffer command is available for 32 bit distributions only. diff --git a/lgsm/functions/install_server_files.sh b/lgsm/functions/install_server_files.sh index 553467961..2dc224831 100644 --- a/lgsm/functions/install_server_files.sh +++ b/lgsm/functions/install_server_files.sh @@ -74,7 +74,7 @@ fn_install_server_files_steamcmd(){ counter="0" while [ "${counter}" == "0" ]||[ "${exitcode}" != "0" ]; do counter=$((counter+1)) - if [ "${steamcmddir}" ]; then + if [ -d "${steamcmddir}" ]; then cd "${steamcmddir}" || exit fi if [ "${counter}" -le "10" ]; then diff --git a/lgsm/functions/update_steamcmd.sh b/lgsm/functions/update_steamcmd.sh index 4b6b60bc3..fcb289485 100644 --- a/lgsm/functions/update_steamcmd.sh +++ b/lgsm/functions/update_steamcmd.sh @@ -16,7 +16,7 @@ fn_update_steamcmd_dl(){ if [ "$(command -v stdbuf)" ]&&[ "${arch}" != "x86_64" ]; then unbuffer="stdbuf -i0 -o0 -e0" fi - if [ "${steamcmddir}" ]; then + if [ -d "${steamcmddir}" ]; then cd "${steamcmddir}" || exit fi if [ "${appid}" == "90" ]; then @@ -51,7 +51,7 @@ fn_update_steamcmd_localbuild(){ fn_update_steamcmd_remotebuild(){ # Gets remote build info. - if [ "${steamcmddir}" ]; then + if [ -d "${steamcmddir}" ]; then cd "${steamcmddir}" || exit fi remotebuild=$(${steamcmdcommand} +login "${steamuser}" "${steampass}" +app_info_update 1 +app_info_print "${appid}" +quit | sed '1,/branches/d' | sed "1,/${branchname}/d" | grep -m 1 buildid | tr -cd '[:digit:]') From 6a594b4cf8ab2e8c563a344ad72ff893961e6520 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Wed, 19 Feb 2020 22:08:43 +0000 Subject: [PATCH 272/534] code --- lgsm/functions/check_steamcmd.sh | 56 ++++++++++++++++++-------------- 1 file changed, 32 insertions(+), 24 deletions(-) diff --git a/lgsm/functions/check_steamcmd.sh b/lgsm/functions/check_steamcmd.sh index 800d737ae..67fe77642 100644 --- a/lgsm/functions/check_steamcmd.sh +++ b/lgsm/functions/check_steamcmd.sh @@ -7,12 +7,12 @@ local commandname="CHECK" fn_install_steamcmd(){ - if [ ! -d "${steamcmddir}" ]; then - 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}" - chmod +x "${steamcmddir}/steamcmd.sh" + if [ ! -d "${steamcmddir}" ]; then + 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}" + chmod +x "${steamcmddir}/steamcmd.sh" } fn_check_steamcmd_user(){ @@ -43,30 +43,37 @@ fn_check_steamcmd_user(){ fi } -fn_check_steamcmd_sh(){ +fn_check_steamcmd(){ # Checks if SteamCMD exists when starting or updating a server. - # Installs if missing. - if [ ! -f "${steamcmddir}/steamcmd.sh" ]||[ ! "$(command -v steamcmd 2>/dev/null)" ]; then - # Debian and Ubuntu uses steamcmd package - if [ -f "/etc/debian_version" ]&&[ "$(command -v steamcmd 2>/dev/null)" ]; then - # Install steamcmd with apt - : + # Only install if steamcmd package is missing or steamcmd dir is missing. + if [ ! -f "${steamcmddir}/steamcmd.sh" ]&&[ ! "$(command -v steamcmd 2>/dev/null)" ]; then + if [ "${function_selfname}" == "command_install.sh" ]; then + fn_install_steamcmd else - if [ "${function_selfname}" == "command_install.sh" ]; then - fn_install_steamcmd - else - fn_print_error_nl "SteamCMD is missing" - fn_script_log_error "SteamCMD is missing" - fn_install_steamcmd - fi + fn_print_error_nl "SteamCMD is missing" + fn_script_log_error "SteamCMD is missing" + fn_install_steamcmd fi elif [ "${function_selfname}" == "command_install.sh" ]; then - fn_print_information "SteamCMD is already installed..." + fn_print_information "SteamCMD is already installed" fn_print_ok_eol_nl fi } -fn_check_steamcmd_check(){ +fn_check_steamcmd_clear(){ +# Will remove steamcmd dir if steamcmd package is installed. +if [ "$(command -v steamcmd 2>/dev/null)" ]&&[ -d "${steamcmddir}" ]; then + rm -rf "${steamcmddir:?}" + exitcode=$? + if [ ${exitcode} -ne 0 ]; then + fn_script_log_fatal "Removing ${steamcmddir}" + else + fn_script_log_pass "Removing ${steamcmddir}" + fi +fi +} + +fn_check_steamcmd_exec(){ if [ "$(command -v steamcmd 2>/dev/null)" ]; then steamcmdcommand="steamcmd" else @@ -74,6 +81,7 @@ fn_check_steamcmd_check(){ fi } +fn_check_steamcmd +fn_check_steamcmd_clear fn_check_steamcmd_user -fn_check_steamcmd_sh -fn_check_steamcmd_check +fn_check_steamcmd_exec From 4a0c59d2ff7109586efd99fc5f79d5a0a56b5804 Mon Sep 17 00:00:00 2001 From: Stijn Date: Fri, 6 Mar 2020 18:47:02 +0100 Subject: [PATCH 273/534] fix(nmrihserver): add symbolic links to fix the crashes related to missing files (#2668) * Create symlinks after nmrih install * Fixed missing space in nmrih elif statement * Fixed variable assignment in nmrih_symlinks * nmrih_symlinks now use pre-existing location var * Double quotes added in install_nmrih_symlinks * Changed nmrih symlinks from install to fix --- lgsm/functions/core_functions.sh | 5 +++++ lgsm/functions/fix.sh | 2 ++ lgsm/functions/fix_nmrih.sh | 13 +++++++++++++ 3 files changed, 20 insertions(+) create mode 100644 lgsm/functions/fix_nmrih.sh diff --git a/lgsm/functions/core_functions.sh b/lgsm/functions/core_functions.sh index f1632b48a..ef8d21a0c 100644 --- a/lgsm/functions/core_functions.sh +++ b/lgsm/functions/core_functions.sh @@ -341,6 +341,11 @@ functionfile="${FUNCNAME[0]}" fn_fetch_function } +fix_nmrih.sh(){ +functionfile="${FUNCNAME[0]}" +fn_fetch_function +} + fix_ro.sh(){ functionfile="${FUNCNAME[0]}" fn_fetch_function diff --git a/lgsm/functions/fix.sh b/lgsm/functions/fix.sh index 4b830f62d..7c1567eda 100644 --- a/lgsm/functions/fix.sh +++ b/lgsm/functions/fix.sh @@ -49,6 +49,8 @@ if [ "${function_selfname}" != "command_install.sh" ]&&[ -z "${fixbypass}" ]; th fix_ges.sh elif [ "${shortname}" == "ins" ]; then fix_ins.sh + elif [ "${shortname}" == "nmrih" ]; then + fix_nmrih.sh elif [ "${shortname}" == "rust" ]; then fix_rust.sh elif [ "${shortname}" == "rw" ]; then diff --git a/lgsm/functions/fix_nmrih.sh b/lgsm/functions/fix_nmrih.sh new file mode 100644 index 000000000..8dd5f592c --- /dev/null +++ b/lgsm/functions/fix_nmrih.sh @@ -0,0 +1,13 @@ +#!/bin/bash +# LinuxGSM fix_nmrih.sh function +# Author: Denperidge +# Description: Create symlinks for renamed No More Room In Hell serverfiles +# Solution from Steam Community post: https://steamcommunity.com/app/224260/discussions/2/1732089092441769414/ + +ln -s "${serverfiles}/bin/vphysics_srv.so" "${serverfiles}/bin/vphysics.so" +ln -s "${serverfiles}/bin/studiorender_srv.so" "${serverfiles}/bin/studiorender.so" +ln -s "${serverfiles}/bin/soundemittersystem_srv.so" "${serverfiles}/bin/soundemittersystem.so" +ln -s "${serverfiles}/bin/shaderapiempty_srv.so" "${serverfiles}/bin/shaderapiempty.so" +ln -s "${serverfiles}/bin/scenefilecache_srv.so" "${serverfiles}/bin/scenefilecache.so" +ln -s "${serverfiles}/bin/replay_srv.so" "${serverfiles}/bin/replay.so" +ln -s "${serverfiles}/bin/materialsystem_srv.so" "${serverfiles}/bin/materialsystem.so" \ No newline at end of file From df9218df9afe3c6a886526f53ef6322f6fb26e41 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Fri, 6 Mar 2020 22:12:56 +0000 Subject: [PATCH 274/534] changed some ! back to -z --- lgsm/functions/check_steamcmd.sh | 2 +- lgsm/functions/command_dev_detect_glibc.sh | 2 +- lgsm/functions/command_fastdl.sh | 2 +- lgsm/functions/core_dl.sh | 2 +- lgsm/functions/info_distro.sh | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/lgsm/functions/check_steamcmd.sh b/lgsm/functions/check_steamcmd.sh index 67fe77642..77f46033d 100644 --- a/lgsm/functions/check_steamcmd.sh +++ b/lgsm/functions/check_steamcmd.sh @@ -46,7 +46,7 @@ fn_check_steamcmd_user(){ fn_check_steamcmd(){ # Checks if SteamCMD exists when starting or updating a server. # Only install if steamcmd package is missing or steamcmd dir is missing. - if [ ! -f "${steamcmddir}/steamcmd.sh" ]&&[ ! "$(command -v steamcmd 2>/dev/null)" ]; then + if [ ! -f "${steamcmddir}/steamcmd.sh" ]&&[ -z "$(command -v steamcmd 2>/dev/null)" ]; then if [ "${function_selfname}" == "command_install.sh" ]; then fn_install_steamcmd else diff --git a/lgsm/functions/command_dev_detect_glibc.sh b/lgsm/functions/command_dev_detect_glibc.sh index c5c624ed2..e86fb05db 100644 --- a/lgsm/functions/command_dev_detect_glibc.sh +++ b/lgsm/functions/command_dev_detect_glibc.sh @@ -13,7 +13,7 @@ echo -e "=================================" echo -e "glibc Requirements Checker" echo -e "=================================" -if [ ! "$(command -v objdump)" ]; then +if [ -z "$(command -v objdump)" ]; then fn_print_failure_nl "objdump is missing" fn_script_log_fatal "objdump is missing" core_exit.sh diff --git a/lgsm/functions/command_fastdl.sh b/lgsm/functions/command_fastdl.sh index de74f62f8..d862c7ed8 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 [ ! "$(command -v bzip2 2>/dev/null)" ]; 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/core_dl.sh b/lgsm/functions/core_dl.sh index e4114209f..24cff68bf 100644 --- a/lgsm/functions/core_dl.sh +++ b/lgsm/functions/core_dl.sh @@ -256,7 +256,7 @@ fn_update_function(){ } # Check that curl is installed -if [ ! "$(command -v curl 2>/dev/null)" ]; then +if [ -z "$(command -v curl 2>/dev/null)" ]; then echo -e "[ FAIL ] Curl is not installed" exit 1 fi diff --git a/lgsm/functions/info_distro.sh b/lgsm/functions/info_distro.sh index 9abb31b97..f40d5b048 100644 --- a/lgsm/functions/info_distro.sh +++ b/lgsm/functions/info_distro.sh @@ -71,7 +71,7 @@ glibcversion=$(ldd --version | sed -n '1s/.* //p') ## tmux version # e.g: tmux 1.6 -if [ ! "$(command -V tmux 2>/dev/null)" ]; 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" ]; then From e13990694da24ac0c2f773314976383f7e37af87 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Fri, 6 Mar 2020 22:18:13 +0000 Subject: [PATCH 275/534] tabs --- lgsm/functions/install_server_files.sh | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/lgsm/functions/install_server_files.sh b/lgsm/functions/install_server_files.sh index 2dc224831..5c1cfd7fb 100644 --- a/lgsm/functions/install_server_files.sh +++ b/lgsm/functions/install_server_files.sh @@ -9,7 +9,7 @@ local commandaction="Install" local function_selfname=$(basename "$(readlink -f "${BASH_SOURCE[0]}")") fn_install_server_files(){ - if [ "${shortname}" == "ahl" ]; then + if [ "${shortname}" == "ahl" ]; then remote_fileurl="http://files.linuxgsm.com/ActionHalfLife/action_halflife-1.0.tar.bz2"; local_filedir="${tmpdir}"; local_filename="action_halflife-1.0.tar.bz2"; chmodx="nochmodx" run="norun"; force="noforce"; md5="31430e670692b2eeaa0d1217db4dcb73" elif [ "${shortname}" == "bf1942" ]; then remote_fileurl="http://files.linuxgsm.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" @@ -74,9 +74,9 @@ fn_install_server_files_steamcmd(){ counter="0" while [ "${counter}" == "0" ]||[ "${exitcode}" != "0" ]; do counter=$((counter+1)) - if [ -d "${steamcmddir}" ]; then - cd "${steamcmddir}" || exit - fi + if [ -d "${steamcmddir}" ]; then + cd "${steamcmddir}" || exit + fi if [ "${counter}" -le "10" ]; then # Attempt 1-4: Standard attempt. # Attempt 5-6: Validate attempt. From 0ea6a6e6a8b7668cdac56f3641e6928731723994 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Fri, 6 Mar 2020 22:56:34 +0000 Subject: [PATCH 276/534] feat(install): use a new linuxgsm domain linuxgsm.download for files (#2698) This will separate out linuxgsm files from the main domain to reduce the change of an ssl change breaking downloads --- lgsm/functions/install_server_files.sh | 52 +++++++++++++------------- 1 file changed, 26 insertions(+), 26 deletions(-) diff --git a/lgsm/functions/install_server_files.sh b/lgsm/functions/install_server_files.sh index 5c1cfd7fb..b217f0680 100644 --- a/lgsm/functions/install_server_files.sh +++ b/lgsm/functions/install_server_files.sh @@ -9,62 +9,62 @@ local commandaction="Install" local function_selfname=$(basename "$(readlink -f "${BASH_SOURCE[0]}")") fn_install_server_files(){ - if [ "${shortname}" == "ahl" ]; then - remote_fileurl="http://files.linuxgsm.com/ActionHalfLife/action_halflife-1.0.tar.bz2"; local_filedir="${tmpdir}"; local_filename="action_halflife-1.0.tar.bz2"; chmodx="nochmodx" run="norun"; force="noforce"; md5="31430e670692b2eeaa0d1217db4dcb73" + if [ "${shortname}" == "ahl" ]; then + remote_fileurl="http://linuxgsm.download/ActionHalfLife/action_halflife-1.0.tar.bz2"; local_filedir="${tmpdir}"; local_filename="action_halflife-1.0.tar.bz2"; chmodx="nochmodx" run="norun"; force="noforce"; md5="31430e670692b2eeaa0d1217db4dcb73" elif [ "${shortname}" == "bf1942" ]; then - remote_fileurl="http://files.linuxgsm.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" + remote_fileurl="http://linuxgsm.download/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 [ "${shortname}" == "bb" ]; then - remote_fileurl="http://files.linuxgsm.com/BrainBread/brainbread-v1.2-linuxserver.tar.bz2"; local_filedir="${tmpdir}"; local_filename="brainbread-v1.2-linuxserver.tar.bz2"; chmodx="nochmodx" run="norun"; force="noforce"; md5="5c729a7e9eecfa81b71a6a1f7267f0fd" + remote_fileurl="http://linuxgsm.download/BrainBread/brainbread-v1.2-linuxserver.tar.bz2"; local_filedir="${tmpdir}"; local_filename="brainbread-v1.2-linuxserver.tar.bz2"; chmodx="nochmodx" run="norun"; force="noforce"; md5="5c729a7e9eecfa81b71a6a1f7267f0fd" elif [ "${shortname}" == "cod" ]; then - remote_fileurl="http://files.linuxgsm.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" + remote_fileurl="http://linuxgsm.download/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 [ "${shortname}" == "coduo" ]; then - remote_fileurl="http://files.linuxgsm.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" + remote_fileurl="http://linuxgsm.download/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 [ "${shortname}" == "cod2" ]; then - remote_fileurl="http://files.linuxgsm.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" + remote_fileurl="http://linuxgsm.download/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 [ "${shortname}" == "cod4" ]; then - remote_fileurl="http://files.linuxgsm.com/CallOfDuty4/cod4x18_1772_dedrun.tar.bz2"; local_filedir="${tmpdir}"; local_filename="cod4x18_1772_dedrun.tar.bz2"; chmodx="nochmodx" run="norun"; force="noforce"; md5="de29f29d79f9cc24574b838daa501e46" + remote_fileurl="http://linuxgsm.download/CallOfDuty4/cod4x18_1772_dedrun.tar.bz2"; local_filedir="${tmpdir}"; local_filename="cod4x18_1772_dedrun.tar.bz2"; chmodx="nochmodx" run="norun"; force="noforce"; md5="de29f29d79f9cc24574b838daa501e46" elif [ "${shortname}" == "codwaw" ]; then - remote_fileurl="http://files.linuxgsm.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" + remote_fileurl="http://linuxgsm.download/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 [ "${shortname}" == "etl" ]; then - remote_fileurl="http://files.linuxgsm.com/WolfensteinEnemyTerritory/etlegacy-v2.75-i386-et-260b.tar.bz2"; local_filedir="${tmpdir}"; local_filename="etlegacy-v2.75-i386-et-260b.tar.bz2"; chmodx="nochmodx" run="norun"; force="noforce"; md5="92d7d4c26e0a295daed78cef623eeabb" + remote_fileurl="http://linuxgsm.download/WolfensteinEnemyTerritory/etlegacy-v2.75-i386-et-260b.tar.bz2"; local_filedir="${tmpdir}"; local_filename="etlegacy-v2.75-i386-et-260b.tar.bz2"; chmodx="nochmodx" run="norun"; force="noforce"; md5="92d7d4c26e0a295daed78cef623eeabb" elif [ "${shortname}" == "ges" ]; then - remote_fileurl="http://files.linuxgsm.com/GoldenEyeSource/GoldenEye_Source_v5.0.6_full_server.tar.bz2"; local_filedir="${tmpdir}"; local_filename="GoldenEye_Source_v5.0.6_full_server.tar.bz2"; chmodx="nochmodx" run="norun"; force="noforce"; md5="c45c16293096706e8b5e2cd64a6f2931" + remote_fileurl="http://linuxgsm.download/GoldenEyeSource/GoldenEye_Source_v5.0.6_full_server.tar.bz2"; local_filedir="${tmpdir}"; local_filename="GoldenEye_Source_v5.0.6_full_server.tar.bz2"; chmodx="nochmodx" run="norun"; force="noforce"; md5="c45c16293096706e8b5e2cd64a6f2931" elif [ "${shortname}" == "mohaa" ]; then - remote_fileurl="http://files.linuxgsm.com/MedalofHonorAlliedAssault/moh_revival_v1.12_RC3.5.1.tar.bz2"; local_filedir="${tmpdir}"; local_filename="moh_revival_v1.12_RC3.5.1.tar.bz2"; chmodx="nochmodx" run="norun"; force="noforce"; md5="9d5924486a0cf5e46dd063216aad05c1" + remote_fileurl="http://linuxgsm.download/MedalofHonorAlliedAssault/moh_revival_v1.12_RC3.5.1.tar.bz2"; local_filedir="${tmpdir}"; local_filename="moh_revival_v1.12_RC3.5.1.tar.bz2"; chmodx="nochmodx" run="norun"; force="noforce"; md5="9d5924486a0cf5e46dd063216aad05c1" elif [ "${shortname}" == "ns" ]; then - remote_fileurl="http://files.linuxgsm.com/NaturalSelection/ns_dedicated_server_v32.tar.bz2"; local_filedir="${tmpdir}"; local_filename="ns_dedicated_server_v32.tar.bz2"; chmodx="nochmodx" run="norun"; force="noforce"; md5="499cf63324b76925ada6baf5f2eacd67" + remote_fileurl="http://linuxgsm.download/NaturalSelection/ns_dedicated_server_v32.tar.bz2"; local_filedir="${tmpdir}"; local_filename="ns_dedicated_server_v32.tar.bz2"; chmodx="nochmodx" run="norun"; force="noforce"; md5="499cf63324b76925ada6baf5f2eacd67" elif [ "${shortname}" == "q2" ]; then - remote_fileurl="http://files.linuxgsm.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" + remote_fileurl="http://linuxgsm.download/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 [ "${shortname}" == "q3" ]; then - remote_fileurl="http://files.linuxgsm.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" + remote_fileurl="http://linuxgsm.download/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 [ "${shortname}" == "qw" ]; then - remote_fileurl="http://files.linuxgsm.com/QuakeWorld/nquake.server.linux.190506.full.tar.bz2"; local_filedir="${tmpdir}"; local_filename="nquake.server.linux.190506.full.tar.bz2"; chmodx="nochmodx" run="norun"; force="noforce"; md5="74405ec030463c5e1175e776ab572d32" + remote_fileurl="http://linuxgsm.download/QuakeWorld/nquake.server.linux.190506.full.tar.bz2"; local_filedir="${tmpdir}"; local_filename="nquake.server.linux.190506.full.tar.bz2"; chmodx="nochmodx" run="norun"; force="noforce"; md5="74405ec030463c5e1175e776ab572d32" elif [ "${shortname}" == "rtcw" ]; then - remote_fileurl="http://files.linuxgsm.com/ReturnToCastleWolfenstein/iortcw-1.51c-x86_64-server-linux-20190507.tar.bz2"; local_filedir="${tmpdir}"; local_filename="iortcw-1.51c-x86_64-server-linux-20190507.tar.bz2"; chmodx="nochmodx" run="norun"; force="noforce"; md5="6a3be9700372b228d1187422464e4212" + remote_fileurl="http://linuxgsm.download/ReturnToCastleWolfenstein/iortcw-1.51c-x86_64-server-linux-20190507.tar.bz2"; local_filedir="${tmpdir}"; local_filename="iortcw-1.51c-x86_64-server-linux-20190507.tar.bz2"; chmodx="nochmodx" run="norun"; force="noforce"; md5="6a3be9700372b228d1187422464e4212" elif [ "${shortname}" == "sfc" ]; then - remote_fileurl="http://files.linuxgsm.com/SourceFortsClassic/SFClassic-1.0-RC7-fix.tar.bz2"; local_filedir="${tmpdir}"; local_filename="SFClassic-1.0-RC7-fix.tar.bz2"; chmodx="nochmodx" run="norun"; force="noforce"; md5="e0d4cfd298a8a356053f92b1fa7d1002" + remote_fileurl="http://linuxgsm.download/SourceFortsClassic/SFClassic-1.0-RC7-fix.tar.bz2"; local_filedir="${tmpdir}"; local_filename="SFClassic-1.0-RC7-fix.tar.bz2"; chmodx="nochmodx" run="norun"; force="noforce"; md5="e0d4cfd298a8a356053f92b1fa7d1002" elif [ "${shortname}" == "sof2" ]; then - remote_fileurl="http://files.linuxgsm.com/SoldierOfFortune2/sof2gold-1.03.tar.bz2"; local_filedir="${tmpdir}"; local_filename="sof2gold-1.03.tar.bz2"; chmodx="nochmodx" run="norun"; force="noforce"; md5="871b1dc0dafeeace65b198119e8fa200" + remote_fileurl="http://linuxgsm.download/SoldierOfFortune2/sof2gold-1.03.tar.bz2"; local_filedir="${tmpdir}"; local_filename="sof2gold-1.03.tar.bz2"; chmodx="nochmodx" run="norun"; force="noforce"; md5="871b1dc0dafeeace65b198119e8fa200" elif [ "${shortname}" == "ts" ]; then - remote_fileurl="http://files.linuxgsm.com/TheSpecialists/ts-3-linux-final.tar.bz2"; local_filedir="${tmpdir}"; local_filename="ts-3-linux-final.tar.bz2"; chmodx="nochmodx" run="norun"; force="noforce"; md5="38e8a8325339f85a7745117802f940b7" + remote_fileurl="http://linuxgsm.download/TheSpecialists/ts-3-linux-final.tar.bz2"; local_filedir="${tmpdir}"; local_filename="ts-3-linux-final.tar.bz2"; chmodx="nochmodx" run="norun"; force="noforce"; md5="38e8a8325339f85a7745117802f940b7" elif [ "${shortname}" == "ut2k4" ]; then - remote_fileurl="http://files.linuxgsm.com/UnrealTournament2004/ut2004-server-3369-2-ultimate-linux.tar.bz2"; local_filedir="${tmpdir}"; local_filename="ut2004-server-3369-2-ultimate-linux.tar.bz2"; chmodx="nochmodx" run="norun"; force="noforce"; md5="67c5e2cd9c2a4b04f163962ee41eff54" + remote_fileurl="http://linuxgsm.download/UnrealTournament2004/ut2004-server-3369-2-ultimate-linux.tar.bz2"; local_filedir="${tmpdir}"; local_filename="ut2004-server-3369-2-ultimate-linux.tar.bz2"; chmodx="nochmodx" run="norun"; force="noforce"; md5="67c5e2cd9c2a4b04f163962ee41eff54" elif [ "${shortname}" == "ut99" ]; then - remote_fileurl="http://files.linuxgsm.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" + remote_fileurl="http://linuxgsm.download/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 [ "${shortname}" == "ut" ]; then 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 [ "${shortname}" == "ut3" ]; then - remote_fileurl="http://files.linuxgsm.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" + remote_fileurl="http://linuxgsm.download/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 [ "${shortname}" == "vs" ]; then - remote_fileurl="http://files.linuxgsm.com/VampireSlayer/vs_l-6.0_full.tar.bz2"; local_filedir="${tmpdir}"; local_filename="vs_l-6.0_full.tar.bz2"; chmodx="nochmodx" run="norun"; force="noforce"; md5="38a79e44b98578bbdc5b15818493a066" + remote_fileurl="http://linuxgsm.download/VampireSlayer/vs_l-6.0_full.tar.bz2"; local_filedir="${tmpdir}"; local_filename="vs_l-6.0_full.tar.bz2"; chmodx="nochmodx" run="norun"; force="noforce"; md5="38a79e44b98578bbdc5b15818493a066" elif [ "${shortname}" == "wet" ]; then - remote_fileurl="http://files.linuxgsm.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" + remote_fileurl="http://linuxgsm.download/WolfensteinEnemyTerritory/enemy-territory.260b.tar.bz2"; local_filedir="${tmpdir}"; local_filename="enemy-territory.260b.tar.bz2"; chmodx="nochmodx" run="norun"; force="noforce"; md5="f833f514bfcdd46b42c111f83350c5a7" elif [ "${shortname}" == "samp" ]; then remote_fileurl="https://files.sa-mp.com/samp037svr_R2-1.tar.gz"; local_filedir="${tmpdir}"; local_filename="samp037svr_R2-1.tar.gz"; chmodx="nochmodx" run="norun"; force="noforce"; md5="93705e165550c97484678236749198a4" elif [ "${shortname}" == "sol" ]; then remote_fileurl="https://static.soldat.pl/downloads/soldatserver2.8.1_1.7.1.zip"; local_filedir="${tmpdir}"; local_filename="soldatserver2.8.1_1.7.1.zip"; chmodx="nochmodx" run="norun"; force="noforce"; md5="994409c28520425965dec5c71ccb55e1" elif [ "${shortname}" == "zmr" ]; then - remote_fileurl="http://files.linuxgsm.com/ZombieMasterReborn/zombie_master_reborn_b5_2.tar.bz2"; local_filedir="${tmpdir}"; local_filename="zombie_master_reborn_b5_2.tar.bz2"; chmodx="nochmodx" run="norun"; force="noforce"; md5="d52ef2db376f5d21e3a4ceca85ec8761" + remote_fileurl="http://linuxgsm.download/ZombieMasterReborn/zombie_master_reborn_b5_2.tar.bz2"; local_filedir="${tmpdir}"; local_filename="zombie_master_reborn_b5_2.tar.bz2"; chmodx="nochmodx" run="norun"; force="noforce"; md5="d52ef2db376f5d21e3a4ceca85ec8761" fi fn_fetch_file "${remote_fileurl}" "${local_filedir}" "${local_filename}" "${chmodx}" "${run}" "${forcedl}" "${md5}" fn_dl_extract "${local_filedir}" "${local_filename}" "${serverfiles}" From 5d5040b3d6b89e79e20d381fb8a64c2b23dbe646 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Fri, 6 Mar 2020 23:04:44 +0000 Subject: [PATCH 277/534] add steamcmd to packages --- .travis.yml | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/.travis.yml b/.travis.yml index d3ad78ad8..48676a0fe 100644 --- a/.travis.yml +++ b/.travis.yml @@ -24,6 +24,7 @@ addons: - libcurl4-openssl-dev - libdw-dev - cmake + - steamcmd jobs: include: @@ -31,13 +32,13 @@ jobs: name: "code coverage" script: bash tests/tests_kcov.sh; kcov --bash-method=DEBUG coverage tests/tests_mcserver.sh - script: bash tests/tests_mcserver.sh - name: "Minecraft" - - script: bash tests/tests_jc2server.sh + name: "Minecraft" + - script: bash tests/tests_jc2server.sh name: "Just Cause 2" - script: bash tests/tests_fctrserver.sh - name: "Factorio" + name: "Factorio" - script: bash tests/tests_ts3server.sh - name: "Teamspeak 3" + name: "Teamspeak 3" - script: bash tests/tests_defaultcfg/tests_defaultcfg.sh name: "_default.cfg checks" after_success: From 9f91d4ee0100c7ce78352565fa8eec953914c71f Mon Sep 17 00:00:00 2001 From: Frisasky Date: Sat, 7 Mar 2020 07:05:36 +0800 Subject: [PATCH 278/534] feat(newserver): Unreal Tournament 4 (#2644) Co-authored-by: Daniel Gibbs --- lgsm/data/serverlist.csv | 1 + lgsm/functions/info_config.sh | 12 ++++++++++++ lgsm/functions/info_messages.sh | 11 ++++++++++- lgsm/functions/info_parms.sh | 6 ++++++ lgsm/functions/install_server_files.sh | 2 +- 5 files changed, 30 insertions(+), 2 deletions(-) diff --git a/lgsm/data/serverlist.csv b/lgsm/data/serverlist.csv index 5c2e6a6ae..5f4398d28 100644 --- a/lgsm/data/serverlist.csv +++ b/lgsm/data/serverlist.csv @@ -92,6 +92,7 @@ ts3,ts3server,Teamspeak 3 tu,tuserver,Tower Unite tw,twserver,Teeworlds unt,untserver,Unturned +ut,utserver,Unreal Tournament ut2k4,ut2k4server,Unreal Tournament 2004 ut3,ut3server,Unreal Tournament 3 ut99,ut99server,Unreal Tournament 99 diff --git a/lgsm/functions/info_config.sh b/lgsm/functions/info_config.sh index bd511cc69..2ad78197a 100644 --- a/lgsm/functions/info_config.sh +++ b/lgsm/functions/info_config.sh @@ -1022,6 +1022,16 @@ fn_info_config_unreal3(){ fi } +fn_info_config_ut(){ + if [ ! -f "${servercfgfullpath}" ]; then + servername="${unavailable}" + else + servername=$(grep "ServerName" "${servercfgfullpath}" | awk -F '=' '{print $2}') + + # Not set + servername=${servername:-"NOT SET"} + fi +} fn_info_config_warfork(){ if [ ! -f "${servercfgfullpath}" ]; then @@ -1459,6 +1469,8 @@ elif [ "${engine}" == "unreal2" ]; then # Unreal 3 engine elif [ "${engine}" == "unreal3" ]; then fn_info_config_unreal3 +elif [ "${shortname}" == "ut" ]; then + fn_info_config_ut # 7 Day To Die (unity3d) elif [ "${shortname}" == "sdtd" ]; then fn_info_config_sdtd diff --git a/lgsm/functions/info_messages.sh b/lgsm/functions/info_messages.sh index 291def5a9..a8a1042df 100644 --- a/lgsm/functions/info_messages.sh +++ b/lgsm/functions/info_messages.sh @@ -1239,7 +1239,14 @@ fn_info_message_unturned(){ } | column -s $'\t' -t } - +fn_info_message_ut(){ + echo -e "netstat -atunp | grep UE4Server" + echo -e "" + { + echo -e "${lightblue}DESCRIPTION\tDIRECTION\tPORT\tPROTOCOL${default}" + echo -e "> Game\tINBOUND\t${port}\tudp" + } | column -s $'\t' -t +} fn_info_message_kf2(){ fn_info_message_password_strip @@ -1422,6 +1429,8 @@ fn_info_message_select_engine(){ fn_info_message_teeworlds elif [ "${shortname}" == "unt" ]; then fn_info_message_unturned + elif [ "${shortname}" == "ut" ]; then + fn_info_message_ut elif [ "${shortname}" == "mc" ]; then fn_info_message_minecraft elif [ "${shortname}" == "mh" ]; then diff --git a/lgsm/functions/info_parms.sh b/lgsm/functions/info_parms.sh index 6cafc86ad..37bd56416 100644 --- a/lgsm/functions/info_parms.sh +++ b/lgsm/functions/info_parms.sh @@ -232,6 +232,10 @@ fn_info_parms_unturned(){ queryport=$((port + 1)) } +fn_info_parms_ut(){ + port=${port:-"0"} +} + fn_info_parms_wf(){ port=${port:-"0"} queryport="${port:-"0"}" @@ -311,6 +315,8 @@ elif [ "${engine}" == "unreal3" ]; then fn_info_parms_unreal3 elif [ "${shortname}" == "unt" ]; then fn_info_parms_unturned +elif [ "${shortname}" == "ut" ]; then + fn_info_parms_ut # Warfork elif [ "${shortname}" == "wf" ]; then fn_info_parms_wf diff --git a/lgsm/functions/install_server_files.sh b/lgsm/functions/install_server_files.sh index b217f0680..b9069db53 100644 --- a/lgsm/functions/install_server_files.sh +++ b/lgsm/functions/install_server_files.sh @@ -52,7 +52,7 @@ fn_install_server_files(){ elif [ "${shortname}" == "ut99" ]; then remote_fileurl="http://linuxgsm.download/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 [ "${shortname}" == "ut" ]; then - 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" + remote_fileurl="http://linuxgsm.download/UnrealTournament/UnrealTournament-Server-XAN-3525360-Linux.zip"; local_filedir="${tmpdir}"; local_filename="UnrealTournament-Server-XAN-3525360-Linux.zip"; chmodx="noexecute" run="norun"; force="noforce"; md5="cad730ad6793ba6261f9a341ad7396eb" elif [ "${shortname}" == "ut3" ]; then remote_fileurl="http://linuxgsm.download/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 [ "${shortname}" == "vs" ]; then From 8bc25e1c836ef548176b8783d793807fff15fc8c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20C?= Date: Fri, 6 Mar 2020 18:54:51 -0500 Subject: [PATCH 279/534] feat(newserver): Onset (#2682) Co-authored-by: Daniel Gibbs --- .../config-lgsm/onsetserver/_default.cfg | 163 ++++++++++++++++++ lgsm/data/serverlist.csv | 1 + lgsm/functions/check_deps.sh | 6 + lgsm/functions/core_functions.sh | 5 + lgsm/functions/fix.sh | 4 +- lgsm/functions/fix_onset.sh | 20 +++ lgsm/functions/info_config.sh | 26 +++ lgsm/functions/info_messages.sh | 13 ++ 8 files changed, 237 insertions(+), 1 deletion(-) create mode 100644 lgsm/config-default/config-lgsm/onsetserver/_default.cfg create mode 100644 lgsm/functions/fix_onset.sh diff --git a/lgsm/config-default/config-lgsm/onsetserver/_default.cfg b/lgsm/config-default/config-lgsm/onsetserver/_default.cfg new file mode 100644 index 000000000..8b4631616 --- /dev/null +++ b/lgsm/config-default/config-lgsm/onsetserver/_default.cfg @@ -0,0 +1,163 @@ +################################## +######## Default Settings ######## +################################## +# DO NOT EDIT, ANY CHANGES 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 Command | https://docs.linuxgsm.com/configuration/start-parameters#additional-parameters +fn_parms(){ +parms="--config ${servercfgfullpath}" +} + +#### LinuxGSM Settings #### + +## LinuxGSM Stats +# Send useful stats to LinuxGSM developers. +# https://docs.linuxgsm.com/configuration/linuxgsm-stats +# (on|off) +stats="off" + +## Notification Alerts +# (on|off) + +# Display IP | https://docs.linuxgsm.com/alerts#display-ip +displayip="" + +# More info | https://docs.linuxgsm.com/alerts#more-info +postalert="off" +postdays="7" +posttarget="https://hastebin.com" + +# Discord Alerts | https://docs.linuxgsm.com/alerts/discord +discordalert="off" +discordwebhook="webhook" + +# Email Alerts | https://docs.linuxgsm.com/alerts/email +emailalert="off" +email="email@example.com" +emailfrom="" + +# IFTTT Alerts | https://docs.linuxgsm.com/alerts/ifttt +iftttalert="off" +ifttttoken="accesstoken" +iftttevent="linuxgsm_alert" + +# Mailgun Email Alerts | https://docs.linuxgsm.com/alerts/mailgun +mailgunalert="off" +mailguntoken="accesstoken" +mailgundomain="example.com" +mailgunemailfrom="alert@example.com" +mailgunemail="email@myemail.com" + +# Pushbullet Alerts | https://docs.linuxgsm.com/alerts/pushbullet +pushbulletalert="off" +pushbullettoken="accesstoken" +channeltag="" + +# Pushover Alerts | https://docs.linuxgsm.com/alerts/pushover +pushoveralert="off" +pushovertoken="accesstoken" + +# Slack Alerts | https://docs.linuxgsm.com/alerts/slack +slackalert="off" +slackwebhook="webhook" + +# Telegram Alerts | https://docs.linuxgsm.com/alerts/telegram +# You can add a custom cURL string eg proxy (useful in Russia) or else in "curlcustomstring". +# like a "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help", if you not need +# any custom string in curl - simple ignore this parameter. +telegramalert="off" +telegramtoken="accesstoken" +telegramchatid="" +curlcustomstring="" + +## Updating | https://docs.linuxgsm.com/commands/update +updateonstart="off" + +## Backup | https://docs.linuxgsm.com/commands/backup +maxbackups="4" +maxbackupdays="30" +stoponbackup="on" + +## Logging | https://docs.linuxgsm.com/features/logging +consolelogging="on" +logdays="7" + +## Monitor | https://docs.linuxgsm.com/commands/monitor +# Query delay time +querydelay="1" + +## ANSI Colors | https://docs.linuxgsm.com/features/ansi-colors +ansi="on" + +#### Advanced Settings #### + +## Message Display Time | https://docs.linuxgsm.com/features/message-display-time +sleeptime="0.5" + +## SteamCMD Settings | https://docs.linuxgsm.com/steamcmd +# Server appid +appid="1204170" +# SteamCMD Branch | https://docs.linuxgsm.com/steamcmd/branch +branch="" +# Master Server | https://docs.linuxgsm.com/steamcmd/steam-master-server +steammaster="false" + +## Stop Mode | https://docs.linuxgsm.com/features/stop-mode +# 1: tmux kill +# 2: CTRL+c +# 3: quit +# 4: quit 120s +# 5: stop +# 6: q +# 7: exit +# 8: 7 Days to Die +# 9: Gold Source +# 10: Teamspeak 3 +stopmode="2" + +## Query mode +# 1: session only +# 2: gamedig + gsquery +# 3: gamedig +# 4: gsquery +# 5: tcp +querymode="1" +querytype="" + +## Game Server Details +# Do not edit +gamename="Onset" +engine="unreal4" +glibc="2.24" + +#### Directories #### +# Edit with care + +## Game Server Directories +systemdir="${serverfiles}" +executabledir="${serverfiles}" +executable="./OnsetServer" +servercfg="server_config.json" +servercfgdefault="server_config.json" +servercfgdir="${serverfiles}" +servercfgfullpath="${servercfgdir}/${servercfg}" + +## Backup Directory +backupdir="${lgsmdir}/backup" + +## Logging Directories +logdir="${rootdir}/log" +gamelogdir="${systemdir}/logs" +lgsmlogdir="${logdir}/script" +consolelogdir="${logdir}/console" +lgsmlog="${lgsmlogdir}/${selfname}-script.log" +consolelog="${consolelogdir}/${selfname}-console.log" +alertlog="${lgsmlogdir}/${selfname}-alert.log" +postdetailslog="${lgsmlogdir}/${selfname}-postdetails.log" + +## Logs Naming +lgsmlogdate="${lgsmlogdir}/${selfname}-script-$(date '+%Y-%m-%d-%H:%M:%S').log" +consolelogdate="${consolelogdir}/${selfname}-console-$(date '+%Y-%m-%d-%H:%M:%S').log" diff --git a/lgsm/data/serverlist.csv b/lgsm/data/serverlist.csv index 5f4398d28..3cceb1f91 100644 --- a/lgsm/data/serverlist.csv +++ b/lgsm/data/serverlist.csv @@ -59,6 +59,7 @@ nmrih,nmrihserver,No More Room in Hell ns,nsserver,Natural Selection ns2,ns2server,Natural Selection 2 ns2c,ns2cserver,NS2: Combat +onset,onsetserver,Onset opfor,opforserver,Opposing Force pc,pcserver,Project Cars pstbs,pstbsserver,Post Scriptum: The Bloody Seventh diff --git a/lgsm/functions/check_deps.sh b/lgsm/functions/check_deps.sh index d4ddc8eed..c41ada102 100644 --- a/lgsm/functions/check_deps.sh +++ b/lgsm/functions/check_deps.sh @@ -400,6 +400,9 @@ fn_deps_build_debian(){ # Medal of Honor: Allied Assault elif [ "${shortname}" == "mohaa" ]; then array_deps_required+=( libstdc++5:i386 ) + # Onset + elif [ "${shortname}" == "onset" ]; then + array_deps_required+=( libmariadbclient-dev ) # Project Zomboid elif [ "${shortname}" == "pz" ]; then if java -version 2>&1 | grep "version"; then @@ -518,6 +521,9 @@ fn_deps_build_redhat(){ else array_deps_required+=( java-1.8.0-openjdk rng-tools ) fi + # Onset + elif [ "${shortname}" == "onset" ]; then + array_deps_required+=( mariadb-connector-c ) # GoldenEye: Source elif [ "${shortname}" == "ges" ]; then array_deps_required+=( zlib.i686 openldap.i686 ) diff --git a/lgsm/functions/core_functions.sh b/lgsm/functions/core_functions.sh index ef8d21a0c..54d7ec6a2 100644 --- a/lgsm/functions/core_functions.sh +++ b/lgsm/functions/core_functions.sh @@ -346,6 +346,11 @@ functionfile="${FUNCNAME[0]}" fn_fetch_function } +fix_onset.sh(){ +functionfile="${FUNCNAME[0]}" +fn_fetch_function +} + fix_ro.sh(){ functionfile="${FUNCNAME[0]}" fn_fetch_function diff --git a/lgsm/functions/fix.sh b/lgsm/functions/fix.sh index 7c1567eda..864e69f49 100644 --- a/lgsm/functions/fix.sh +++ b/lgsm/functions/fix.sh @@ -51,6 +51,8 @@ if [ "${function_selfname}" != "command_install.sh" ]&&[ -z "${fixbypass}" ]; th fix_ins.sh elif [ "${shortname}" == "nmrih" ]; then fix_nmrih.sh + elif [ "${shortname}" == "onset" ]; then + fix_onset.sh elif [ "${shortname}" == "rust" ]; then fix_rust.sh elif [ "${shortname}" == "rw" ]; then @@ -84,7 +86,7 @@ fi # Fixes that are run on install only. if [ "${function_selfname}" == "command_install.sh" ]; then - if [ "${shortname}" == "kf" ]||[ "${shortname}" == "kf2" ]||[ "${shortname}" == "ro" ]||[ "${shortname}" == "ut2k4" ]||[ "${shortname}" == "ut" ]||[ "${shortname}" == "ut3" ]; then + if [ "${shortname}" == "kf" ]||[ "${shortname}" == "kf2" ]||[ "${shortname}" == "ro" ]||[ "${shortname}" == "ut2k4" ]||[ "${shortname}" == "ut" ]||[ "${shortname}" == "ut3" ]||[ "${shortname}" == "onset" ]; then echo -e "" echo -e "Applying Post-Install Fixes" echo -e "=================================" diff --git a/lgsm/functions/fix_onset.sh b/lgsm/functions/fix_onset.sh new file mode 100644 index 000000000..9fbeddff3 --- /dev/null +++ b/lgsm/functions/fix_onset.sh @@ -0,0 +1,20 @@ +#!/bin/bash +# LinuxGSM fix_onset.sh function +# Author: Frédéric C. +# Website: https://linuxgsm.com +# Description: Resolves various issues with Onset + +local commandname="FIX" +local commandaction="Fix" +local function_selfname=$(basename "$(readlink -f "${BASH_SOURCE[0]}")") + +export LD_LIBRARY_PATH="${serverfiles}:$LD_LIBRARY_PATH" + +# Fixes: Failed loading "mariadb": libmariadbclient.so.18: cannot open shared object file: No such file or directory +# Issue only occures on CentOS as libmariadbclient.so.18 is called libmariadb.so.3 on CentOS. +if [ -f "/etc/redhat-release" ]&&[ ! -f "${serverfiles}/libmariadbclient.so.18" ]&&[ -f "/usr/lib64/libmariadb.so.3" ]; then + fixname="libmariadbclient.so.18" + fn_fix_msg_start + ln -s "/usr/lib64/libmariadb.so.3" "${serverfiles}/libmariadbclient.so.18" + fn_fix_msg_end +fi diff --git a/lgsm/functions/info_config.sh b/lgsm/functions/info_config.sh index 2ad78197a..cc1fcb840 100644 --- a/lgsm/functions/info_config.sh +++ b/lgsm/functions/info_config.sh @@ -415,6 +415,29 @@ fn_info_config_minecraft_bedrock(){ fi } +fn_info_config_onset(){ + if [ ! -f "${servercfgfullpath}" ]; then + servername="${unavailable}" + maxplayers="${zero}" + port="${zero}" + httpport="${zero}" + queryport="${zero}" + else + servername=$(grep -v "servername_short" "${servercfgfullpath}" | grep "servername" | sed -e 's/^[ \t]*//g' -e '/^#/d' -e 's/servername//g' | tr -d '=\";,:' | sed -e 's/^[ \t]*//' -e 's/[ \t]*$//' ) + maxplayers=$(grep "maxplayers" "${servercfgfullpath}" | grep -v "#" | tr -cd '[:digit:]') + port=$(grep "port" "${servercfgfullpath}" | grep -v "#" | tr -cd '[:digit:]') + httpport=$((port-2)) + queryport=$((port-1)) + + # Not Set + servername=${servername:-"NOT SET"} + maxplayers=${maxplayers:-"NOT SET"} + port=${port:-"NOT SET"} + httpport=${httpport:-"NOT SET"} + queryport=${queryport:-"NOT SET"} + fi +} + fn_info_config_mohaa(){ if [ ! -f "${servercfgfullpath}" ]; then rconpassword="${unavailable}" @@ -1406,6 +1429,9 @@ elif [ "${shortname}" == "mc" ]; then # Minecraft Bedrock elif [ "${shortname}" == "mcb" ]; then fn_info_config_minecraft_bedrock +# Onset +elif [ "${shortname}" == "onset" ]; then + fn_info_config_onset # Post Scriptum: The Bloody Seventh elif [ "${shortname}" == "pstbs" ]; then fn_info_config_pstbs diff --git a/lgsm/functions/info_messages.sh b/lgsm/functions/info_messages.sh index a8a1042df..9d22e44d3 100644 --- a/lgsm/functions/info_messages.sh +++ b/lgsm/functions/info_messages.sh @@ -821,6 +821,17 @@ fn_info_message_minecraft_bedrock(){ } | column -s $'\t' -t } +fn_info_message_onset(){ + echo -e "netstat -atunp | grep OnsetServer" + echo -e "" + { + echo -e "${lightblue}DESCRIPTION\tDIRECTION\tPORT\tPROTOCOL${default}" + echo -e "> Game\tINBOUND\t${port}\tudp" + echo -e "> Query\tINBOUND\t${queryport}\tudp" + echo -e "> HTTP\tINBOUND\t${httpport}\ttcp" + } | column -s $'\t' -t +} + fn_info_message_mohaa(){ echo -e "netstat -atunp | grep mohaa_lnxded" echo -e "" @@ -1387,6 +1398,8 @@ fn_info_message_select_engine(){ fn_info_message_kf2 elif [ "${shortname}" == "mcb" ]; then fn_info_message_minecraft_bedrock + elif [ "${shortname}" == "onset" ]; then + fn_info_message_onset elif [ "${shortname}" == "pz" ]; then fn_info_message_projectzomboid elif [ "${shortname}" == "pstbs" ]; then From f2c8501e24e5b60d05aa1eca7bc8541ee00d27b3 Mon Sep 17 00:00:00 2001 From: Daniel Hultgren Date: Mon, 9 Mar 2020 00:20:04 +0100 Subject: [PATCH 280/534] feat(mcserver): update minecraft server to support release branches (#2696) * Updated regex to support grepping pre-release versions and snapshot versions * Minecraft update now downloads the latest release including snapshot versions * Added config for picking release vs snapshot Co-authored-by: Daniel Gibbs --- .../config-lgsm/mcserver/_default.cfg | 3 ++ lgsm/functions/update_minecraft.sh | 31 ++++++++++++++----- 2 files changed, 27 insertions(+), 7 deletions(-) diff --git a/lgsm/config-default/config-lgsm/mcserver/_default.cfg b/lgsm/config-default/config-lgsm/mcserver/_default.cfg index efa103c67..3af034613 100644 --- a/lgsm/config-default/config-lgsm/mcserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/mcserver/_default.cfg @@ -16,6 +16,9 @@ fn_parms(){ parms="nogui" } +## Branch, "snapshot" include snapshot and pre-release versions. | (release|snapshot) +branch="release" + #### LinuxGSM Settings #### ## LinuxGSM Stats diff --git a/lgsm/functions/update_minecraft.sh b/lgsm/functions/update_minecraft.sh index 1676443a1..89cb7e024 100644 --- a/lgsm/functions/update_minecraft.sh +++ b/lgsm/functions/update_minecraft.sh @@ -9,7 +9,12 @@ local commandaction="Update" local function_selfname=$(basename "$(readlink -f "${BASH_SOURCE[0]}")") fn_update_minecraft_dl(){ - latestmcreleaselink=$(curl -s "https://launchermeta.mojang.com/mc/game/version_manifest.json" | jq -r '.latest.release as $latest | .versions[] | select(.id == $latest) | .url') + if [ "${branch}" == "release" ]; then + latestmcreleaselink=$(curl -s "https://launchermeta.${remotelocation}/mc/game/version_manifest.json" | jq -r '.latest.release as $latest | .versions[] | select(.id == $latest) | .url') + else + latestmcreleaselink=$(curl -s "https://launchermeta.${remotelocation}/mc/game/version_manifest.json" | jq -r '.versions[0].url') + fi + latestmcbuildurl=$(curl -s "${latestmcreleaselink}" | jq -r '.downloads.server.url') fn_fetch_file "${latestmcbuildurl}" "${tmpdir}" "minecraft_server.${remotebuild}.jar" echo -e "copying to ${serverfiles}...\c" @@ -64,7 +69,7 @@ fn_update_minecraft_localbuild(){ fi if [ -z "${localbuild}" ]; then - localbuild=$(grep version "${serverfiles}/logs/latest.log" | grep -Eo '((\.)?[0-9]{1,3}){1,3}\.[0-9]{1,3}') + localbuild=$(grep version "${serverfiles}/logs/latest.log" | grep -Eo '((\.)?[0-9]{1,3}){1,3}\.[0-9]{1,3}(-pre[0-9]+)?|([0-9]+w[0-9]+[a-z])') fi if [ -z "${localbuild}" ]; then @@ -76,7 +81,7 @@ fn_update_minecraft_localbuild(){ loopignore=1 fn_script_log_info "Waiting for local build to generate" fi - localbuild=$(cat "${serverfiles}/logs/latest.log" 2> /dev/null | grep version | grep -Eo '((\.)?[0-9]{1,3}){1,3}\.[0-9]{1,3}') + localbuild=$(cat "${serverfiles}/logs/latest.log" 2> /dev/null | grep version | grep -Eo '((\.)?[0-9]{1,3}){1,3}\.[0-9]{1,3}(-pre[0-9]+)?|([0-9]+w[0-9]+[a-z])') if [ "${localbuild}" ]||[ "${seconds}" == "120" ]; then break fi @@ -98,7 +103,12 @@ fn_update_minecraft_localbuild(){ fn_update_minecraft_remotebuild(){ # Gets remote build info. - remotebuild=$(curl -s "https://launchermeta.${remotelocation}/mc/game/version_manifest.json" | jq -r '.latest.release') + if [ "${branch}" == "release" ]; then + remotebuild=$(curl -s "https://launchermeta.${remotelocation}/mc/game/version_manifest.json" | jq -r '.latest.release') + else + remotebuild=$(curl -s "https://launchermeta.${remotelocation}/mc/game/version_manifest.json" | jq -r '.versions[0].id') + fi + if [ "${installer}" != "1" ]; then fn_print_dots "Checking for update: ${remotelocation}: checking remote build" # Checks if remotebuild variable has been set. @@ -123,14 +133,15 @@ fn_update_minecraft_remotebuild(){ fn_update_minecraft_compare(){ # Removes dots so if statement can compare version numbers. fn_print_dots "Checking for update: ${remotelocation}" - localbuilddigit=$(echo -e "${localbuild}" | tr -cd '[:digit:]') - remotebuilddigit=$(echo -e "${remotebuild}" | tr -cd '[:digit:]') - if [ "${localbuilddigit}" -ne "${remotebuilddigit}" ]||[ "${forceupdate}" == "1" ]; then + if [ "${localbuild}" != "${remotebuild}" ]||[ "${forceupdate}" == "1" ]; then fn_print_ok_nl "Checking for update: ${remotelocation}" echo -en "\n" echo -e "Update available" echo -e "* Local build: ${red}${localbuild}${default}" echo -e "* Remote build: ${green}${remotebuild}${default}" + if [ -n "${branch}" ]; then + echo -e "* Branch: ${branch}" + fi fn_script_log_info "Update available" fn_script_log_info "Local build: ${localbuild}" fn_script_log_info "Remote build: ${remotebuild}" @@ -173,9 +184,15 @@ fn_update_minecraft_compare(){ echo -e "No update available" echo -e "* Local build: ${green}${localbuild}${default}" echo -e "* Remote build: ${green}${remotebuild}${default}" + if [ -n "${branch}" ]; then + echo -e "* Branch: ${branch}" + fi fn_script_log_info "No update available" fn_script_log_info "Local build: ${localbuild}" fn_script_log_info "Remote build: ${remotebuild}" + if [ -n "${branch}" ]; then + fn_script_log_info "Branch: ${branch}" + fi fi } From 45b3a4df9e626336fb26ed454dc0f3a9a684aa48 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Mon, 9 Mar 2020 22:06:30 +0000 Subject: [PATCH 281/534] fix(install): add code to auto accept steamcmd deb license (#2705) --- .travis.yml | 1 - lgsm/functions/check_deps.sh | 18 +++++++++--------- 2 files changed, 9 insertions(+), 10 deletions(-) diff --git a/.travis.yml b/.travis.yml index 48676a0fe..cf0bfb9ea 100644 --- a/.travis.yml +++ b/.travis.yml @@ -24,7 +24,6 @@ addons: - libcurl4-openssl-dev - libdw-dev - cmake - - steamcmd jobs: include: diff --git a/lgsm/functions/check_deps.sh b/lgsm/functions/check_deps.sh index c41ada102..30cde7af1 100644 --- a/lgsm/functions/check_deps.sh +++ b/lgsm/functions/check_deps.sh @@ -26,13 +26,13 @@ fn_install_mono_repo(){ echo -en " \r" if [ "${distroid}" == "ubuntu" ]; then if [ "${distroversion}" == "18.04" ]; then - cmd="sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys 3FA7E0328081BFF6A14DA29AA6A19B38D3D831EF;echo 'deb https://download.mono-project.com/repo/ubuntu stable-bionic main' | sudo tee /etc/apt/sources.list.d/mono-official-stable.list;sudo apt update" + cmd="sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys 3FA7E0328081BFF6A14DA29AA6A19B38D3D831EF;echo 'deb https://download.mono-project.com/repo/ubuntu stable-bionic main' | sudo tee /etc/apt/sources.list.d/mono-official-stable.list;sudo apt-get update" eval "${cmd}" elif [ "${distroversion}" == "16.04" ]; then - cmd="sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys 3FA7E0328081BFF6A14DA29AA6A19B38D3D831EF;sudo apt install apt-transport-https;echo 'deb https://download.mono-project.com/repo/ubuntu stable-xenial main' | sudo tee /etc/apt/sources.list.d/mono-official-stable.list;sudo apt update" + cmd="sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys 3FA7E0328081BFF6A14DA29AA6A19B38D3D831EF;sudo apt-get install apt-transport-https;echo 'deb https://download.mono-project.com/repo/ubuntu stable-xenial main' | sudo tee /etc/apt/sources.list.d/mono-official-stable.list;sudo apt-get update" eval "${cmd}" elif [ "${distroversion}" == "14.04" ]; then - cmd="sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys 3FA7E0328081BFF6A14DA29AA6A19B38D3D831EF;sudo apt install apt-transport-https;echo 'deb https://download.mono-project.com/repo/ubuntu stable-trusty main' | sudo tee /etc/apt/sources.list.d/mono-official-stable.list;sudo apt update" + cmd="sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys 3FA7E0328081BFF6A14DA29AA6A19B38D3D831EF;sudo apt-get install apt-transport-https;echo 'deb https://download.mono-project.com/repo/ubuntu stable-trusty main' | sudo tee /etc/apt/sources.list.d/mono-official-stable.list;sudo apt-get update" eval "${cmd}" else fn_print_warn_nl "Installing Mono repository" @@ -43,13 +43,13 @@ fn_install_mono_repo(){ fi elif [ "${distroid}" == "debian" ]; then if [ "${distroversion}" == "10" ]; then - cmd="sudo apt install apt-transport-https dirmngr;sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys 3FA7E0328081BFF6A14DA29AA6A19B38D3D831EF;echo 'deb https://download.mono-project.com/repo/debian stable-buster main' | sudo tee /etc/apt/sources.list.d/mono-official-stable.list;sudo apt update" + cmd="sudo apt-get install apt-transport-https dirmngr;sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys 3FA7E0328081BFF6A14DA29AA6A19B38D3D831EF;echo 'deb https://download.mono-project.com/repo/debian stable-buster main' | sudo tee /etc/apt/sources.list.d/mono-official-stable.list;sudo apt-get update" eval "${cmd}" elif [ "${distroversion}" == "9" ]; then - cmd="sudo apt install apt-transport-https dirmngr;sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys 3FA7E0328081BFF6A14DA29AA6A19B38D3D831EF;echo 'deb https://download.mono-project.com/repo/debian stable-stretch main' | sudo tee /etc/apt/sources.list.d/mono-official-stable.list;sudo apt update" + cmd="sudo apt-get install apt-transport-https dirmngr;sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys 3FA7E0328081BFF6A14DA29AA6A19B38D3D831EF;echo 'deb https://download.mono-project.com/repo/debian stable-stretch main' | sudo tee /etc/apt/sources.list.d/mono-official-stable.list;sudo apt-get update" eval "${cmd}" elif [ "${distroversion}" == "8" ]; then - cmd="sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys 3FA7E0328081BFF6A14DA29AA6A19B38D3D831EF;sudo apt install apt-transport-https;echo 'deb https://download.mono-project.com/repo/debian stable-jessie main' | sudo tee /etc/apt/sources.list.d/mono-official-stable.list;sudo apt update" + cmd="sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys 3FA7E0328081BFF6A14DA29AA6A19B38D3D831EF;sudo apt-get install apt-transport-https;echo 'deb https://download.mono-project.com/repo/debian stable-jessie main' | sudo tee /etc/apt/sources.list.d/mono-official-stable.list;sudo apt-get update" eval "${cmd}" else echo -e "Mono auto install not available for ${distroname}" @@ -256,7 +256,7 @@ fn_found_missing_deps(){ sleep 1 echo -en " \r" if [ "$(command -v dpkg-query 2>/dev/null)" ]; then - cmd="sudo dpkg --add-architecture i386; sudo apt update; sudo apt -y install ${array_deps_missing[@]}" + cmd="echo steamcmd steam/question select \"I AGREE\" | sudo debconf-set-selections; echo steamcmd steam/license note '' | sudo debconf-set-selections; sudo dpkg --add-architecture i386; sudo apt-get update; sudo apt-get -y install ${array_deps_missing[@]}" eval "${cmd}" elif [ "$(command -v dnf 2>/dev/null)" ]; then cmd="sudo dnf -y install ${array_deps_missing[@]}" @@ -272,7 +272,7 @@ fn_found_missing_deps(){ fn_print_warning_nl "Manually install dependencies." fn_script_log_warn "Manually install dependencies." if [ "$(command -v dpkg-query 2>/dev/null)" ]; then - echo -e " sudo dpkg --add-architecture i386; sudo apt update; sudo apt install ${array_deps_missing[@]}" + echo -e " sudo dpkg --add-architecture i386; sudo apt-get update; sudo apt-get install ${array_deps_missing[@]}" elif [ "$(command -v dnf 2>/dev/null)" ]; then echo -e " sudo dnf install ${array_deps_missing[@]}" elif [ "$(command -v yum 2>/dev/null)" ]; then @@ -293,7 +293,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 [ "$(command -v dpkg-query 2>/dev/null)" ]; then - echo -e " sudo dpkg --add-architecture i386; sudo apt update; sudo apt install ${array_deps_missing[@]}" + echo -e " sudo dpkg --add-architecture i386; sudo apt-get update; sudo apt-get install ${array_deps_missing[@]}" elif [ "$(command -v dnf 2>/dev/null)" ]; then echo -e " sudo dnf install ${array_deps_missing[@]}" elif [ "$(command -v yum 2>/dev/null)" ]; then From 8f442559fe6aa55acc1ddf3f008904e32f3e4026 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Mon, 9 Mar 2020 23:59:26 +0000 Subject: [PATCH 282/534] feat(install): deprecate centos6 support and tmux source install detect (#2709) --- lgsm/functions/check_deps.sh | 49 +++++++++--------------------------- 1 file changed, 12 insertions(+), 37 deletions(-) diff --git a/lgsm/functions/check_deps.sh b/lgsm/functions/check_deps.sh index 30cde7af1..0cb0c566d 100644 --- a/lgsm/functions/check_deps.sh +++ b/lgsm/functions/check_deps.sh @@ -64,9 +64,6 @@ fn_install_mono_repo(){ elif [ "${distroversion}" == "7" ]; then cmd="rpm --import 'https://keyserver.ubuntu.com/pks/lookup?op=get&search=0x3FA7E0328081BFF6A14DA29AA6A19B38D3D831EF';su -c 'curl https://download.mono-project.com/repo/centos7-stable.repo | tee /etc/yum.repos.d/mono-centos7-stable.repo'" eval "${cmd}" - elif [ "${distroversion}" == "6" ]; then - cmd="rpm --import 'https://keyserver.ubuntu.com/pks/lookup?op=get&search=0x3FA7E0328081BFF6A14DA29AA6A19B38D3D831EF';su -c 'curl https://download.mono-project.com/repo/centos6-stable.repo | tee /etc/yum.repos.d/mono-centos6-stable.repo'" - eval "${cmd}" else echo -e "Mono auto install not available for ${distroname}" echo -e " Follow instructions on mono site to install the latest version of Mono." @@ -142,18 +139,12 @@ fn_install_universe_repo(){ fn_deps_detector(){ # Checks if dependency is missing. - if [ "${tmuxcheck}" == "1" ]; then - # Added for users compiling tmux from source to bypass check. - depstatus=0 - deptocheck="tmux" - unset tmuxcheck - elif [ "${javacheck}" == "1" ]; then +if [ "${javacheck}" == "1" ]; then # Added for users using Oracle JRE to bypass check. depstatus=0 deptocheck="${javaversion}" unset javacheck - elif [ "${deptocheck}" == "jq" ]&&[ "${distroversion}" == "6" ]; then - jqstatus=1 + elif [ "${deptocheck}" == "jq" ]&&[ "${distroid}" == "ubuntu" ]&&[ "${distroversion}" == "18.04" ]&& ! grep -qE "^deb .*universe" /etc/apt/sources.list; then # #1985 ubuntu 18.04.1 bug does not set sources.list correctly which means universe is not active by default # If the universe repo does not exist, mark as dependency missing and universe missing. @@ -192,7 +183,7 @@ fn_deps_detector(){ fi # Define required dependencies for SteamCMD. if [ -n "${appid}" ]; then - if [ "${deptocheck}" == "glibc.i686" ]||[ "${deptocheck}" == "libstdc++64.i686" ]||[ "${deptocheck}" == "lib32gcc1" ]||[ "${deptocheck}" == "libstdc++6:i386" ]; then + if [ "${deptocheck}" == "glibc.i686" ]||[ "${deptocheck}" == "libstdc++64.i686" ]||[ "${deptocheck}" == "lib32gcc1" ]||[ "${deptocheck}" == "lib32stdc++6" ]; then steamcmdfail=1 fi fi @@ -335,20 +326,14 @@ fn_deps_build_debian(){ array_deps_missing=() # LinuxGSM requirements. - array_deps_required=( curl wget ca-certificates file bsdmainutils util-linux python3 tar bzip2 gzip unzip binutils bc jq steamcmd ) - - if [ "$(command -v tmux 2>/dev/null)" ]; then - tmuxcheck=1 # Added for users compiling tmux from source to bypass check. - else - array_deps_required+=( tmux ) - fi + array_deps_required=( curl wget ca-certificates file bsdmainutils util-linux python3 tar bzip2 gzip unzip binutils bc jq tmux steamcmd ) # All servers except ts3, mumble, GTA and minecraft servers require libstdc++6 and lib32gcc1. if [ "${shortname}" != "ts3" ]&&[ "${shortname}" != "mumble" ]&&[ "${shortname}" != "mc" ]&&[ "${engine}" != "renderware" ]; then if [ "${arch}" == "x86_64" ]; then - array_deps_required+=( lib32gcc1 libstdc++6:i386 ) + array_deps_required+=( lib32gcc1 lib32stdc++6 ) else - array_deps_required+=( libstdc++6:i386 ) + array_deps_required+=( lib32stdc++6 ) fi fi @@ -449,26 +434,16 @@ fn_deps_build_redhat(){ # LinuxGSM requirements. # CentOS - if [ "${distroversion}" == "6" ]; then - array_deps_required=( epel-release curl wget util-linux-ng python file tar gzip bzip2 unzip binutils bc jq ) - elif [ "${distroversion}" == "7" ]; then - array_deps_required=( epel-release curl wget util-linux python3 file tar gzip bzip2 unzip binutils bc jq ) + if [ "${distroversion}" == "7" ]; then + array_deps_required=( epel-release curl wget util-linux python3 file tar gzip bzip2 unzip binutils bc jq tmux ) elif [ "${distroversion}" == "8" ]; then - array_deps_required=( epel-release curl wget util-linux python36 file tar gzip bzip2 unzip binutils bc jq ) + array_deps_required=( epel-release curl wget util-linux python36 file tar gzip bzip2 unzip binutils bc jq tmux ) elif [ "${distroid}" == "fedora" ]; then - array_deps_required=( curl wget util-linux python3 file tar gzip bzip2 unzip binutils bc jq ) + array_deps_required=( curl wget util-linux python3 file tar gzip bzip2 unzip binutils bc jq tmux ) elif [[ "${distroname}" == *"Amazon Linux AMI"* ]]; then - array_deps_required=( curl wget util-linux python3 file tar gzip bzip2 unzip binutils bc jq ) - else - array_deps_required=( curl wget util-linux python3 file tar gzip bzip2 unzip binutils bc jq ) - fi - - # All servers except ts3 require tmux. - if [ "$(command -v tmux 2>/dev/null)" ]; then - # Added for users compiling tmux from source to bypass check. - tmuxcheck=1 + array_deps_required=( curl wget util-linux python3 file tar gzip bzip2 unzip binutils bc jq tmux ) else - array_deps_required+=( tmux ) + array_deps_required=( curl wget util-linux python3 file tar gzip bzip2 unzip binutils bc jq tmux ) fi # All servers except ts3, mumble, multi theft auto and minecraft servers require glibc.i686 and libstdc++.i686. From 4ba7fc072dcc4e611309b616efbdf6d7fdfee4ab Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Tue, 10 Mar 2020 00:07:25 +0000 Subject: [PATCH 283/534] feat(install): convert libstdc++6:i386 to lib32stdc++6 (#2707) * feat(install): convert libstdc++6:i386 to lib32stdc++6 * update the package in travis to lib32stdc++6 --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index cf0bfb9ea..0ea421b0e 100644 --- a/.travis.yml +++ b/.travis.yml @@ -19,7 +19,7 @@ addons: - postfix - jq - lib32gcc1 - - libstdc++6:i386 + - lib32stdc++6 - shellcheck - libcurl4-openssl-dev - libdw-dev From 0af1f5ed4756b75d977e6b0cee071569db69d67a Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Tue, 10 Mar 2020 00:08:37 +0000 Subject: [PATCH 284/534] fix(details): catch error should ifconfig.co fail (#2704) --- lgsm/functions/info_distro.sh | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/lgsm/functions/info_distro.sh b/lgsm/functions/info_distro.sh index f40d5b048..226aa2093 100644 --- a/lgsm/functions/info_distro.sh +++ b/lgsm/functions/info_distro.sh @@ -232,7 +232,15 @@ if [ -z "${extip}" ]; then exitcode=$? # Should ifconfig.co return an error will use last known IP. if [ ${exitcode} -eq 0 ]; then - echo -e "${extip}" > "${tmpdir}/extip.txt" + if [[ "${extip}" != *"DOCTYPE"* ]]; then + echo -e "${extip}" > "${tmpdir}/extip.txt" + else + if [ -f "${tmpdir}/extip.txt" ]; then + extip=$(cat "${tmpdir}/extip.txt") + else + echo -e "x.x.x.x" + fi + fi else if [ -f "${tmpdir}/extip.txt" ]; then extip=$(cat "${tmpdir}/extip.txt") From 4b063636043feb0350da52d65f16b11ab5b2404f Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Tue, 10 Mar 2020 00:13:05 +0000 Subject: [PATCH 285/534] feat(install): refactor check dependencies (#2708) * feat: replace lib32tinfo5 with libtinfo5:i386 * dependency refactor and check refactored check_deps and corrected some incorrect dependencies * dependency refactor and check * apt-get back to apt * further code refactor * improve messages for check_deps --- lgsm/functions/check_deps.sh | 106 +++++++++++++--------- lgsm/functions/command_dev_detect_deps.sh | 29 ++++++ lgsm/functions/command_dev_detect_ldd.sh | 2 + 3 files changed, 92 insertions(+), 45 deletions(-) diff --git a/lgsm/functions/check_deps.sh b/lgsm/functions/check_deps.sh index 0cb0c566d..e29a35a64 100644 --- a/lgsm/functions/check_deps.sh +++ b/lgsm/functions/check_deps.sh @@ -26,16 +26,16 @@ fn_install_mono_repo(){ echo -en " \r" if [ "${distroid}" == "ubuntu" ]; then if [ "${distroversion}" == "18.04" ]; then - cmd="sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys 3FA7E0328081BFF6A14DA29AA6A19B38D3D831EF;echo 'deb https://download.mono-project.com/repo/ubuntu stable-bionic main' | sudo tee /etc/apt/sources.list.d/mono-official-stable.list;sudo apt-get update" + cmd="sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys 3FA7E0328081BFF6A14DA29AA6A19B38D3D831EF;echo 'deb https://download.mono-project.com/repo/ubuntu stable-bionic main' | sudo tee /etc/apt/sources.list.d/mono-official-stable.list;sudo apt update" eval "${cmd}" elif [ "${distroversion}" == "16.04" ]; then - cmd="sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys 3FA7E0328081BFF6A14DA29AA6A19B38D3D831EF;sudo apt-get install apt-transport-https;echo 'deb https://download.mono-project.com/repo/ubuntu stable-xenial main' | sudo tee /etc/apt/sources.list.d/mono-official-stable.list;sudo apt-get update" + cmd="sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys 3FA7E0328081BFF6A14DA29AA6A19B38D3D831EF;sudo apt install apt-transport-https;echo 'deb https://download.mono-project.com/repo/ubuntu stable-xenial main' | sudo tee /etc/apt/sources.list.d/mono-official-stable.list;sudo apt update" eval "${cmd}" elif [ "${distroversion}" == "14.04" ]; then - cmd="sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys 3FA7E0328081BFF6A14DA29AA6A19B38D3D831EF;sudo apt-get install apt-transport-https;echo 'deb https://download.mono-project.com/repo/ubuntu stable-trusty main' | sudo tee /etc/apt/sources.list.d/mono-official-stable.list;sudo apt-get update" + cmd="sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys 3FA7E0328081BFF6A14DA29AA6A19B38D3D831EF;sudo apt install apt-transport-https;echo 'deb https://download.mono-project.com/repo/ubuntu stable-trusty main' | sudo tee /etc/apt/sources.list.d/mono-official-stable.list;sudo apt update" eval "${cmd}" else - fn_print_warn_nl "Installing Mono repository" + fn_print_warn_nl "Installing Mono repository." echo -e "Mono auto install not available for ${distroname}" echo -e " Follow instructions on mono site to install the latest version of Mono." echo -e " https://www.mono-project.com/download/stable/#download-lin" @@ -43,13 +43,13 @@ fn_install_mono_repo(){ fi elif [ "${distroid}" == "debian" ]; then if [ "${distroversion}" == "10" ]; then - cmd="sudo apt-get install apt-transport-https dirmngr;sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys 3FA7E0328081BFF6A14DA29AA6A19B38D3D831EF;echo 'deb https://download.mono-project.com/repo/debian stable-buster main' | sudo tee /etc/apt/sources.list.d/mono-official-stable.list;sudo apt-get update" + cmd="sudo apt install apt-transport-https dirmngr;sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys 3FA7E0328081BFF6A14DA29AA6A19B38D3D831EF;echo 'deb https://download.mono-project.com/repo/debian stable-buster main' | sudo tee /etc/apt/sources.list.d/mono-official-stable.list;sudo apt update" eval "${cmd}" elif [ "${distroversion}" == "9" ]; then - cmd="sudo apt-get install apt-transport-https dirmngr;sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys 3FA7E0328081BFF6A14DA29AA6A19B38D3D831EF;echo 'deb https://download.mono-project.com/repo/debian stable-stretch main' | sudo tee /etc/apt/sources.list.d/mono-official-stable.list;sudo apt-get update" + cmd="sudo apt install apt-transport-https dirmngr;sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys 3FA7E0328081BFF6A14DA29AA6A19B38D3D831EF;echo 'deb https://download.mono-project.com/repo/debian stable-stretch main' | sudo tee /etc/apt/sources.list.d/mono-official-stable.list;sudo apt update" eval "${cmd}" elif [ "${distroversion}" == "8" ]; then - cmd="sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys 3FA7E0328081BFF6A14DA29AA6A19B38D3D831EF;sudo apt-get install apt-transport-https;echo 'deb https://download.mono-project.com/repo/debian stable-jessie main' | sudo tee /etc/apt/sources.list.d/mono-official-stable.list;sudo apt-get update" + cmd="sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys 3FA7E0328081BFF6A14DA29AA6A19B38D3D831EF;sudo apt install apt-transport-https;echo 'deb https://download.mono-project.com/repo/debian stable-jessie main' | sudo tee /etc/apt/sources.list.d/mono-official-stable.list;sudo apt update" eval "${cmd}" else echo -e "Mono auto install not available for ${distroname}" @@ -91,11 +91,11 @@ fn_install_mono_repo(){ fi fi else - fn_print_information_nl "Installing Mono repository" + fn_print_information_nl "Installing Mono repository." echo -e "" fn_print_warning_nl "$(whoami) does not have sudo access. Manually install Mono repository." fn_script_log_warn "$(whoami) does not have sudo access. Manually install Mono repository." - echo -e " Follow instructions on mono site to install the latest version of Mono." + echo -e "* Follow instructions on mono site to install the latest version of Mono." echo -e " https://www.mono-project.com/download/stable/#download-lin" fi fi @@ -105,7 +105,7 @@ fn_install_universe_repo(){ # Defensive coding - As this is an ubuntu only issue then check to make sure this fix is needed, and we are using ubuntu. if [ "${jquniversemissing}" != "0" ]&&[ "${distroid}" == "ubuntu" ]; then fn_print_warning_nl "Ubuntu 18.04.1 contains a bug which means the sources.list file does not populate with the Ubuntu universe repository." - fn_print_information_nl "Attempting to add Universe Repo" + fn_print_information_nl "Attempting to add universe repository." if [ "${autoinstall}" == "1" ]; then sudo -n true > /dev/null 2>&1 else @@ -131,7 +131,8 @@ fn_install_universe_repo(){ else fn_print_warning_nl "$(whoami) does not have sudo access. Manually add Universe repository." fn_script_log_warn "$(whoami) does not have sudo access. Manually add Universe repository." - echo -e " Please run the following command as a user with sudo access, and re-run the installation" + echo -e "* Please run the following command as a user with sudo access, and re-run the installation" + echo -e "" echo -e " sudo apt-add-repository universe" fi fi @@ -228,7 +229,7 @@ fn_found_missing_deps(){ fn_install_mono_repo fi if [ -n "${jqstatus}" ]; then - fn_print_warning_nl "jq is not available in the ${distroname} repository" + fn_print_warning_nl "jq is not available in the ${distroname} repository." echo -e " * https://docs.linuxgsm.com/requirements/jq" fi if [ "${autoinstall}" == "1" ]; then @@ -247,7 +248,7 @@ fn_found_missing_deps(){ sleep 1 echo -en " \r" if [ "$(command -v dpkg-query 2>/dev/null)" ]; then - cmd="echo steamcmd steam/question select \"I AGREE\" | sudo debconf-set-selections; echo steamcmd steam/license note '' | sudo debconf-set-selections; sudo dpkg --add-architecture i386; sudo apt-get update; sudo apt-get -y install ${array_deps_missing[@]}" + cmd="echo steamcmd steam/question select \"I AGREE\" | sudo debconf-set-selections; echo steamcmd steam/license note '' | sudo debconf-set-selections; sudo dpkg --add-architecture i386; sudo apt update; sudo apt -y install ${array_deps_missing[@]}" eval "${cmd}" elif [ "$(command -v dnf 2>/dev/null)" ]; then cmd="sudo dnf -y install ${array_deps_missing[@]}" @@ -257,13 +258,13 @@ fn_found_missing_deps(){ eval "${cmd}" fi if [ $? != 0 ]; then - fn_print_failure_nl "Unable to install dependencies" - fn_script_log_fatal "Unable to install dependencies" + fn_print_failure_nl "Unable to install dependencies." + fn_script_log_fatal "Unable to install dependencies." echo -e "" fn_print_warning_nl "Manually install dependencies." fn_script_log_warn "Manually install dependencies." if [ "$(command -v dpkg-query 2>/dev/null)" ]; then - echo -e " sudo dpkg --add-architecture i386; sudo apt-get update; sudo apt-get install ${array_deps_missing[@]}" + echo -e " sudo dpkg --add-architecture i386; sudo apt update; sudo apt install ${array_deps_missing[@]}" elif [ "$(command -v dnf 2>/dev/null)" ]; then echo -e " sudo dnf install ${array_deps_missing[@]}" elif [ "$(command -v yum 2>/dev/null)" ]; then @@ -276,19 +277,19 @@ fn_found_missing_deps(){ core_exit.sh fi else - fn_print_complete_nl "Install dependencies completed" - fn_script_log_pass "Install dependencies completed" + fn_print_complete_nl "Install dependencies completed." + fn_script_log_pass "Install dependencies completed." fi else - echo -e "" 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." + echo -e "" if [ "$(command -v dpkg-query 2>/dev/null)" ]; then - echo -e " sudo dpkg --add-architecture i386; sudo apt-get update; sudo apt-get install ${array_deps_missing[@]}" + echo -e "sudo dpkg --add-architecture i386; sudo apt update; sudo apt install ${array_deps_missing[@]}" elif [ "$(command -v dnf 2>/dev/null)" ]; then - echo -e " sudo dnf install ${array_deps_missing[@]}" + echo -e "sudo dnf install ${array_deps_missing[@]}" elif [ "$(command -v yum 2>/dev/null)" ]; then - echo -e " sudo yum install ${array_deps_missing[@]}" + echo -e "sudo yum install ${array_deps_missing[@]}" fi if [ "${steamcmdfail}" ]; then echo -e "" @@ -303,8 +304,8 @@ fn_found_missing_deps(){ fi else if [ "${function_selfname}" == "command_install.sh" ]; then - fn_print_information_nl "Required dependencies already installed" - fn_script_log_info "Required dependencies already installed" + fn_print_information_nl "Required dependencies already installed." + fn_script_log_info "Required dependencies already installed." fi fi } @@ -339,7 +340,7 @@ fn_deps_build_debian(){ # Game Specific requirements. - # Natural Selection 2 - x64 only. + # Natural Selection 2 (x64 only) if [ "${shortname}" == "ns2" ]; then array_deps_required+=( speex libtbb2 ) # NS2: Combat @@ -348,14 +349,14 @@ fn_deps_build_debian(){ # 7 Days to Die elif [ "${shortname}" == "sdtd" ]; then array_deps_required+=( telnet expect ) - # No More Room in Hell, Counter-Strike: Source and Garry's Mod + # No More Room in Hell, Counter-Strike: Source, Garry's Mod and Zombie Panic: Source elif [ "${shortname}" == "nmrih" ]||[ "${shortname}" == "css" ]||[ "${shortname}" == "gmod" ]||[ "${shortname}" == "zps" ]; then if [ "${arch}" == "x86_64" ]; then array_deps_required+=( lib32tinfo5 ) else array_deps_required+=( libtinfo5 ) fi - # Brainbread 2 ,Don't Starve Together & Team Fortress 2 + # Brainbread 2, Don't Starve Together & Team Fortress 2 elif [ "${shortname}" == "bb2" ]||[ "${shortname}" == "dst" ]||[ "${shortname}" == "tf2" ]; then array_deps_required+=( libcurl4-gnutls-dev:i386 ) if [ "${shortname}" == "tf2" ]; then @@ -364,8 +365,8 @@ fn_deps_build_debian(){ # Battlefield: 1942 elif [ "${shortname}" == "bf1942" ]; then array_deps_required+=( libncurses5:i386 ) - # Call of Duty - elif [ "${shortname}" == "cod" ]||[ "${shortname}" == "coduo" ]||[ "${shortname}" == "cod2" ]; then + # Call of Duty & Medal of Honor: Allied Assault + elif [ "${shortname}" == "cod" ]||[ "${shortname}" == "coduo" ]||[ "${shortname}" == "cod2" ]||[ "${shortname}" == "mohaa" ]; then array_deps_required+=( libstdc++5:i386 ) # Factorio elif [ "${shortname}" == "fctr" ]; then @@ -373,18 +374,15 @@ fn_deps_build_debian(){ # Hurtword/Rust elif [ "${shortname}" == "hw" ]||[ "${shortname}" == "rust" ]; then array_deps_required+=( lib32z1 ) - # Minecraft - elif [ "${shortname}" == "mc" ]||[ "${shortname}" == "rw" ]||[ "${shortname}" == "pz" ]; then + # Minecraft, Rising World, Wurm + elif [ "${shortname}" == "mc" ]||[ "${shortname}" == "rw" ]||[ "${shortname}" == "wurm" ]; then javaversion=$(java -version 2>&1 | grep "version") if [ "${javaversion}" ]; then # Added for users using Oracle JRE to bypass the check. javacheck=1 else - array_deps_required+=( openjdk-8-jre-headless ) + array_deps_required+=( default-jre ) fi - # Medal of Honor: Allied Assault - elif [ "${shortname}" == "mohaa" ]; then - array_deps_required+=( libstdc++5:i386 ) # Onset elif [ "${shortname}" == "onset" ]; then array_deps_required+=( libmariadbclient-dev ) @@ -418,6 +416,9 @@ fn_deps_build_debian(){ # Unreal Tournament elif [ "${shortname}" == "ut" ]; then array_deps_required+=( unzip ) + # Unturned + elif [ "${shortname}" == "unt" ]; then + array_deps_required+=( mono-complete ) # Wurm: Unlimited elif [ "${shortname}" == "wurm" ]; then array_deps_required+=( xvfb ) @@ -478,36 +479,50 @@ fn_deps_build_redhat(){ # Battlefield: 1942 elif [ "${shortname}" == "bf1942" ]; then array_deps_required+=( ncurses-libs.i686 ) - # Call of Duty - elif [ "${shortname}" == "cod" ]||[ "${shortname}" == "coduo" ]||[ "${shortname}" == "cod2" ]; then + # Call of Duty & Medal of Honor: Allied Assault + elif [ "${shortname}" == "cod" ]||[ "${shortname}" == "coduo" ]||[ "${shortname}" == "cod2" ]||[ "${shortname}" == "mohaa" ]; then array_deps_required+=( compat-libstdc++-33.i686 ) # Factorio elif [ "${shortname}" == "fctr" ]; then array_deps_required+=( xz ) + # Hurtword/Rust elif [ "${shortname}" == "hw" ]||[ "${shortname}" == "rust" ]; then array_deps_required+=( zlib-devel ) - # Minecraft, Project Zomboid, Rising World - elif [ "${shortname}" == "mc" ]||[ "${shortname}" == "rw" ]||[ "${shortname}" == "pz" ]; then + # Minecraft, Rising World, Wurm + elif [ "${shortname}" == "mc" ]||[ "${shortname}" == "rw" ]||[ "${shortname}" == "wurm" ]; then javaversion=$(java -version 2>&1 | grep "version") if [ "${javaversion}" ]; then # Added for users using Oracle JRE to bypass the check. javacheck=1 - array_deps_required+=( rng-tools ) else - array_deps_required+=( java-1.8.0-openjdk rng-tools ) + array_deps_required+=( java-11-openjdk ) fi - # Onset + # Onset elif [ "${shortname}" == "onset" ]; then array_deps_required+=( mariadb-connector-c ) + # Project Zomboid + elif [ "${shortname}" == "pz" ]; then + if java -version 2>&1 | grep "version"; then + # Added for users using Oracle JRE to bypass the check. + javacheck=1 + array_deps_required+=( rng-tools ) + else + array_deps_required+=( java-11-openjdk rng-tools ) + fi # GoldenEye: Source elif [ "${shortname}" == "ges" ]; then array_deps_required+=( zlib.i686 openldap.i686 ) + # Serious Sam 3: BFE + elif [ "${shortname}" == "ss3" ]; then + : # not compatible + elif [ "${shortname}" == "sven" ]; then + : # not compatible # Unreal Engine elif [ "${executable}" == "./ucc-bin" ]; then - #UT2K4 + # UT2K4 if [ -f "${executabledir}/ut2004-bin" ]; then array_deps_required+=( compat-libstdc++-33.i686 SDL.i686 bzip2 ) - #UT99 + # UT99 else array_deps_required+=( SDL.i686 bzip2 ) fi @@ -517,6 +532,7 @@ fn_deps_build_redhat(){ # Unturned elif [ "${shortname}" == "unt" ]; then array_deps_required+=( mono-complete ) + # Wurm: Unlimited elif [ "${shortname}" == "wurm" ]; then array_deps_required+=( xorg-x11-server-Xvfb ) elif [ "${shortname}" == "pstbs" ]; then @@ -548,5 +564,5 @@ if [ -f "/etc/debian_version" ]; then elif [ -f "/etc/redhat-release" ]; then fn_deps_build_redhat else - fn_print_warning_nl "${distroname} dependency checking unavailable" + fn_print_warning_nl "${distroname} dependency checking unavailable." fi diff --git a/lgsm/functions/command_dev_detect_deps.sh b/lgsm/functions/command_dev_detect_deps.sh index 50b9078c8..ff1e797cd 100644 --- a/lgsm/functions/command_dev_detect_deps.sh +++ b/lgsm/functions/command_dev_detect_deps.sh @@ -34,6 +34,10 @@ done sort "${tmpdir}/.depdetect_readelf" |uniq >"${tmpdir}/.depdetect_readelf_uniq" +touch "${tmpdir}/.depdetect_centos_list" +touch "${tmpdir}/.depdetect_ubuntu_list" +touch "${tmpdir}/.depdetect_debian_list" + while read -r lib; do echo -e "${lib}" local libs_array=( libm.so.6 libc.so.6 libtcmalloc_minimal.so.4 libpthread.so.0 libdl.so.2 libnsl.so.1 libgcc_s.so.1 librt.so.1 ld-linux.so.2 libdbus-glib-1.so.2 libgio-2.0.so.0 libglib-2.0.so.0 libGL.so.1 libgobject-2.0.so.0 libnm-glib.so.4 libnm-util.so.2 ) @@ -128,6 +132,31 @@ while read -r lib; do echo -e "libgconf2-4" >> "${tmpdir}/.depdetect_ubuntu_list" echo -e "libgconf2-4" >> "${tmpdir}/.depdetect_debian_list" libdetected=1 + elif [ "${lib}" == "libz.so.1" ]; then + echo -e "zlib" >> "${tmpdir}/.depdetect_centos_list" + echo -e "zlib1g" >> "${tmpdir}/.depdetect_ubuntu_list" + echo -e "zlib1g" >> "${tmpdir}/.depdetect_debian_list" + libdetected=1 + elif [ "${lib}" == "libatk-1.0.so.0" ]; then + echo -e "atk" >> "${tmpdir}/.depdetect_centos_list" + echo -e "libatk1.0-0" >> "${tmpdir}/.depdetect_ubuntu_list" + echo -e "libatk1.0-0" >> "${tmpdir}/.depdetect_debian_list" + libdetected=1 + elif [ "${lib}" == "libcairo.so.2" ]; then + echo -e "cairo" >> "${tmpdir}/.depdetect_centos_list" + echo -e "libcairo2" >> "${tmpdir}/.depdetect_ubuntu_list" + echo -e "libcairo2" >> "${tmpdir}/.depdetect_debian_list" + libdetected=1 + elif [ "${lib}" == "libfontconfig.so.1" ]; then + echo -e "fontconfig" >> "${tmpdir}/.depdetect_centos_list" + echo -e "libfontconfig1" >> "${tmpdir}/.depdetect_ubuntu_list" + echo -e "libfontconfig1" >> "${tmpdir}/.depdetect_debian_list" + libdetected=1 + elif [ "${lib}" == "libfreetype.so.6" ]; then + echo -e "freetype" >> "${tmpdir}/.depdetect_centos_list" + echo -e "libfreetype6" >> "${tmpdir}/.depdetect_ubuntu_list" + echo -e "libfreetype6" >> "${tmpdir}/.depdetect_debian_list" + libdetected=1 fi if [ "${libdetected}" != "1" ]; then diff --git a/lgsm/functions/command_dev_detect_ldd.sh b/lgsm/functions/command_dev_detect_ldd.sh index 3df4b0a58..848489ddf 100644 --- a/lgsm/functions/command_dev_detect_ldd.sh +++ b/lgsm/functions/command_dev_detect_ldd.sh @@ -25,6 +25,8 @@ elif [ -f "${serverfiles}" ]; then echo -e "${serverfiles}" fi echo -e "" +touch "${tmpdir}/detect_ldd.tmp" +touch "${tmpdir}/detect_ldd_not_found.tmp" files=$(find "${serverfiles}" | wc -l) find "${serverfiles}" -type f -print0 | From 8b9038892bb0edf195b77e060fb51fcf7f4dd8b2 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Tue, 10 Mar 2020 20:10:16 +0000 Subject: [PATCH 287/534] Update Licence Date (#2726) --- LICENSE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/LICENSE b/LICENSE index 950cea23a..6fa6c795f 100644 --- a/LICENSE +++ b/LICENSE @@ -1,6 +1,6 @@ -The MIT License (MIT) +MIT License -Copyright (c) 2018 Daniel Gibbs +Copyright (c) 2012-2020 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 From 466bc15e7b0de1359c28fbc492e583b1b5eb6665 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Tue, 10 Mar 2020 20:55:50 +0000 Subject: [PATCH 288/534] fix(stats): fix stats bugs with language and sending stats (#2727) * Update info_stats.sh * added CPU frequency * feat: swapped event label and event action * fix: prevent df from displaying non-english text with disk space vars * fix force English language on df to ensure a point is used --- lgsm/functions/info_distro.sh | 8 +++--- lgsm/functions/info_stats.sh | 52 +++++++++++++++++++---------------- 2 files changed, 33 insertions(+), 27 deletions(-) diff --git a/lgsm/functions/info_distro.sh b/lgsm/functions/info_distro.sh index 226aa2093..bb2501969 100644 --- a/lgsm/functions/info_distro.sh +++ b/lgsm/functions/info_distro.sh @@ -172,10 +172,10 @@ fi ### Disk information ## Available disk space on the partition. -filesystem=$(df -hP "${rootdir}" | grep -v "Filesystem" | awk '{print $1}') -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}') +filesystem=$(LC_ALL=C df -hP "${rootdir}" | tail -n 1 | awk '{print $1}') +totalspace=$(LC_ALL=C df -hP "${rootdir}" | tail -n 1 | awk '{print $2}') +usedspace=$(LC_ALL=C df -hP "${rootdir}" | tail -n 1 | awk '{print $3}') +availspace=$(LC_ALL=C df -hP "${rootdir}" | tail -n 1 | awk '{print $4}') ## LinuxGSM used space total. rootdirdu=$(du -sh "${rootdir}" 2> /dev/null | awk '{print $1}') diff --git a/lgsm/functions/info_stats.sh b/lgsm/functions/info_stats.sh index ef0788fad..c99bdcf27 100644 --- a/lgsm/functions/info_stats.sh +++ b/lgsm/functions/info_stats.sh @@ -14,54 +14,59 @@ if [ ! -f "${datadir}/uuid.txt" ];then uuidgen > "${datadir}/uuid.txt" else cat /proc/sys/kernel/random/uuid > "${datadir}/uuid.txt" - fi + fi fi uuid=$(cat "${datadir}/uuid.txt") -# results are rounded up to reduce number of different results in analytics -# nearest 100Mhz +# results are rounded up to reduce number of different results in analytics. +# nearest 100Mhz. cpuusedmhzroundup=$(((cpuusedmhz + 99) / 100 * 100)) # nearest 100MB memusedroundup=$(((memused + 99) / 100 * 100)) -# Level 1 Stats -## Distro -curl https://www.google-analytics.com/collect -d "tid=UA-655379-31" -d "aip=1" -d "cid=${uuid}" -d "t=event" -d "ec=distro" -d "ea=${gamename}" -d "el=${distroname}" -d "v=1" > /dev/null 2>&1 -## Game Server Name +## Distro. +curl https://www.google-analytics.com/collect -d "tid=UA-655379-31" -d "aip=1" -d "cid=${uuid}" -d "t=event" -d "ec=distro" -d "ea=${distroname}" -d "el=${gamename}" -d "v=1" > /dev/null 2>&1 +## Game Server Name. curl https://www.google-analytics.com/collect -d "tid=UA-655379-31" -d "aip=1" -d "cid=${uuid}" -d "t=event" -d "ec=game" -d "ea=${gamename}" -d "el=${gamename}" -d "v=1" > /dev/null 2>&1 -## Game Server Name -curl https://www.google-analytics.com/collect -d "tid=UA-655379-31" -d "aip=1" -d "cid=${uuid}" -d "t=event" -d "ec=version" -d "ea=${version}" -d "el=${version}" -d "v=1" > /dev/null 2>&1 +## LinuxGSM Version. +curl https://www.google-analytics.com/collect -d "tid=UA-655379-31" -d "aip=1" -d "cid=${uuid}" -d "t=event" -d "ec=version" -d "ea=${version}" -d "el=${gamename}" -d "v=1" > /dev/null 2>&1 -# Level 2 Stats -## CPU usage of a game server +## CPU usage of a game server. if [ "${cpuusedmhzroundup}" ]; then - curl https://www.google-analytics.com/collect -d "tid=UA-655379-31" -d "aip=1" -d "cid=${uuid}" -d "t=event" -d "ec=cpuused" -d "ea=${gamename}" -d "el=${cpuusedmhzroundup}MHz" -d "v=1" > /dev/null 2>&1 + curl https://www.google-analytics.com/collect -d "tid=UA-655379-31" -d "aip=1" -d "cid=${uuid}" -d "t=event" -d "ec=cpuused" -d "ea=${cpuusedmhzroundup}MHz" -d "el=${gamename}" -d "v=1" > /dev/null 2>&1 fi -## Ram usage of a game server +## Ram usage of a game server. if [ "${memusedroundup}" ]; then - curl https://www.google-analytics.com/collect -d "tid=UA-655379-31" -d "aip=1" -d "cid=${uuid}" -d "t=event" -d "ec=ramused" -d "ea=${gamename}" -d "el=${memusedroundup}MB" -d "v=1" > /dev/null 2>&1 + curl https://www.google-analytics.com/collect -d "tid=UA-655379-31" -d "aip=1" -d "cid=${uuid}" -d "t=event" -d "ec=ramused" -d "ea=${memusedroundup}MB" -d "el=${gamename}" -d "v=1" > /dev/null 2>&1 fi -## Disk usage of a game server +## Disk usage of a game server. if [ "${serverfilesdu}" ]; then - curl https://www.google-analytics.com/collect -d "tid=UA-655379-31" -d "aip=1" -d "cid=${uuid}" -d "t=event" -d "ec=diskused" -d "ea=${gamename}" -d "el=${serverfilesdu}" -d "v=1" > /dev/null 2>&1 + curl https://www.google-analytics.com/collect -d "tid=UA-655379-31" -d "aip=1" -d "cid=${uuid}" -d "t=event" -d "ec=diskused" -d "ea=${serverfilesdu}" -d "el=${gamename}" -d "v=1" > /dev/null 2>&1 fi -# Level 3 Stats -## CPU Model +## CPU Model. if [ "${cpumodel}" ]; then - curl https://www.google-analytics.com/collect -d "tid=UA-655379-31" -d "aip=1" -d "cid=${uuid}" -d "t=event" -d "ec=servercpu" -d "ea=${gamename}" -d "el=${cpumodel} cores:${cpucores}" -d "v=1" > /dev/null 2>&1 + curl https://www.google-analytics.com/collect -d "tid=UA-655379-31" -d "aip=1" -d "cid=${uuid}" -d "t=event" -d "ec=servercpu" -d "ea=${cpumodel} ${cpucores} cores" -d "el=${gamename}" -d "v=1" > /dev/null 2>&1 fi -## Server RAM +## CPU Frequency. +if [ "${cpufreqency}" ]; then + curl https://www.google-analytics.com/collect -d "tid=UA-655379-31" -d "aip=1" -d "cid=${uuid}" -d "t=event" -d "ec=servercpufreq" -d "ea=${cpufreqency} x${cpucores}" -d "el=${gamename}" -d "v=1" > /dev/null 2>&1 +fi + +## Server RAM. if [ "${physmemtotal}" ]; then - curl https://www.google-analytics.com/collect -d "tid=UA-655379-31" -d "aip=1" -d "cid=${uuid}" -d "t=event" -d "ec=serverram" -d "ea=${gamename}" -d "el=${physmemtotal}" -d "v=1" > /dev/null 2>&1 + curl https://www.google-analytics.com/collect -d "tid=UA-655379-31" -d "aip=1" -d "cid=${uuid}" -d "t=event" -d "ec=serverram" -d "ea=${physmemtotal}" -d "el=${gamename}" -d "v=1" > /dev/null 2>&1 fi -## Server Disk +## Server Disk. if [ "${totalspace}" ]; then - curl https://www.google-analytics.com/collect -d "tid=UA-655379-31" -d "aip=1" -d "cid=${uuid}" -d "t=event" -d "ec=serverdisk" -d "ea=${gamename}" -d "el=${totalspace}" -d "v=1" > /dev/null 2>&1 + curl https://www.google-analytics.com/collect -d "tid=UA-655379-31" -d "aip=1" -d "cid=${uuid}" -d "t=event" -d "ec=serverdisk" -d "ea=${totalspace}" -d "el=${gamename}" -d "v=1" > /dev/null 2>&1 fi +## Summary Stats +curl https://www.google-analytics.com/collect -d "tid=UA-655379-31" -d "aip=1" -d "cid=${uuid}" -d "t=event" -d "ec=summary" -d "ea=GAME: ${gamename} | DISTRO: ${distroname} | CPU MODEL: ${cpumodel} ${cpucores} cores | RAM: ${physmemtotal} | DISK: ${totalspace}" -d "v=1" > /dev/null 2>&1 + fn_script_log_info "Send LinuxGSM stats" fn_script_log_info "* UUID: ${uuid}" fn_script_log_info "* Game Name: ${gamename}" @@ -70,5 +75,6 @@ fn_script_log_info "* Game Server CPU Used: ${cpuusedmhzroundup}MHz" fn_script_log_info "* Game Server RAM Used: ${memusedroundup}MB" fn_script_log_info "* Game Server Disk Used: ${serverfilesdu}" fn_script_log_info "* Server CPU Model: ${cpumodel}" +fn_script_log_info "* Server CPU Frequency: ${cpufreqency}" fn_script_log_info "* Server RAM: ${physmemtotal}" fn_script_log_info "* Server Disk: ${totalspace}" From 1f4fa0ce13f95d1c7abf0589405103aafbe234bf Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Tue, 10 Mar 2020 21:16:27 +0000 Subject: [PATCH 289/534] added new servers --- lgsm/config-default/config-lgsm/common-template.cfg | 2 +- lgsm/config-default/config-lgsm/instance-template.cfg | 2 +- lgsm/config-default/config-lgsm/onsetserver/_default.cfg | 4 +++- 3 files changed, 5 insertions(+), 3 deletions(-) diff --git a/lgsm/config-default/config-lgsm/common-template.cfg b/lgsm/config-default/config-lgsm/common-template.cfg index ddb1ef233..e050a945e 100644 --- a/lgsm/config-default/config-lgsm/common-template.cfg +++ b/lgsm/config-default/config-lgsm/common-template.cfg @@ -2,4 +2,4 @@ ######## Common Settings ######### ################################## # PLACE GLOBAL SETTINGS HERE -## These settings will apply to all instances +## These settings will apply to all instances. diff --git a/lgsm/config-default/config-lgsm/instance-template.cfg b/lgsm/config-default/config-lgsm/instance-template.cfg index 1f8109ce6..162b176a6 100644 --- a/lgsm/config-default/config-lgsm/instance-template.cfg +++ b/lgsm/config-default/config-lgsm/instance-template.cfg @@ -2,4 +2,4 @@ ####### Instance Settings ######## ################################## # PLACE INSTANCE SETTINGS HERE -## These settings will apply to a specific instance +## These settings will apply to a specific instance. diff --git a/lgsm/config-default/config-lgsm/onsetserver/_default.cfg b/lgsm/config-default/config-lgsm/onsetserver/_default.cfg index 8b4631616..1d80cb85a 100644 --- a/lgsm/config-default/config-lgsm/onsetserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/onsetserver/_default.cfg @@ -6,6 +6,8 @@ # common.cfg - applies settings to every instance. # [instance].cfg - applies settings to a specific instance. +#### Game Server Settings #### + ## Server Start Command | https://docs.linuxgsm.com/configuration/start-parameters#additional-parameters fn_parms(){ parms="--config ${servercfgfullpath}" @@ -28,7 +30,7 @@ displayip="" # More info | https://docs.linuxgsm.com/alerts#more-info postalert="off" postdays="7" -posttarget="https://hastebin.com" +posttarget="https://termbin.com" # Discord Alerts | https://docs.linuxgsm.com/alerts/discord discordalert="off" From d106384e2839d579a1f2aad02e04a7fc457b78e6 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Tue, 10 Mar 2020 21:57:43 +0000 Subject: [PATCH 290/534] feat: convert commandname to modulename (#2728) --- lgsm/functions/alert.sh | 2 +- lgsm/functions/alert_discord.sh | 4 ++++ lgsm/functions/alert_email.sh | 2 +- lgsm/functions/alert_ifttt.sh | 2 +- lgsm/functions/alert_mailgun.sh | 2 +- lgsm/functions/alert_pushbullet.sh | 2 +- lgsm/functions/alert_pushover.sh | 2 +- lgsm/functions/alert_slack.sh | 4 ++++ lgsm/functions/alert_telegram.sh | 2 +- lgsm/functions/check.sh | 2 +- lgsm/functions/check_config.sh | 4 ++-- lgsm/functions/check_deps.sh | 2 +- lgsm/functions/check_executable.sh | 4 ++-- lgsm/functions/check_glibc.sh | 2 +- lgsm/functions/check_ip.sh | 2 +- lgsm/functions/check_logs.sh | 4 ++-- lgsm/functions/check_permissions.sh | 2 +- lgsm/functions/check_root.sh | 4 ++-- lgsm/functions/check_status.sh | 4 ++-- lgsm/functions/check_steamcmd.sh | 2 +- lgsm/functions/check_system_dir.sh | 4 ++-- lgsm/functions/check_system_requirements.sh | 4 ++-- lgsm/functions/check_tmuxception.sh | 2 +- lgsm/functions/command_backup.sh | 2 +- lgsm/functions/command_console.sh | 2 +- lgsm/functions/command_debug.sh | 2 +- lgsm/functions/command_details.sh | 2 +- lgsm/functions/command_dev_debug.sh | 2 +- lgsm/functions/command_dev_detect_deps.sh | 2 +- lgsm/functions/command_dev_detect_glibc.sh | 2 +- lgsm/functions/command_dev_detect_ldd.sh | 2 +- lgsm/functions/command_dev_query_raw.sh | 2 +- lgsm/functions/command_donate.sh | 2 +- lgsm/functions/command_fastdl.sh | 2 +- lgsm/functions/command_install.sh | 2 +- .../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_linuxgsm.sh | 2 +- lgsm/functions/command_validate.sh | 2 +- lgsm/functions/command_wipe.sh | 2 +- lgsm/functions/core_dl.sh | 2 +- lgsm/functions/core_messages.sh | 24 +++++++++---------- lgsm/functions/fix.sh | 2 +- lgsm/functions/fix_arma3.sh | 2 +- lgsm/functions/fix_csgo.sh | 2 +- lgsm/functions/fix_dst.sh | 2 +- lgsm/functions/fix_ges.sh | 2 +- lgsm/functions/fix_ins.sh | 2 +- lgsm/functions/fix_kf.sh | 2 +- lgsm/functions/fix_kf2.sh | 2 +- lgsm/functions/fix_mcb.sh | 4 ++-- lgsm/functions/fix_mta.sh | 2 +- lgsm/functions/fix_onset.sh | 2 +- lgsm/functions/fix_ro.sh | 2 +- lgsm/functions/fix_rust.sh | 2 +- lgsm/functions/fix_rw.sh | 2 +- lgsm/functions/fix_sdtd.sh | 2 +- lgsm/functions/fix_sfc.sh | 2 +- lgsm/functions/fix_sof2.sh | 2 +- lgsm/functions/fix_ss3.sh | 2 +- lgsm/functions/fix_steamcmd.sh | 4 ++-- lgsm/functions/fix_terraria.sh | 2 +- lgsm/functions/fix_tf2.sh | 2 +- lgsm/functions/fix_ts3.sh | 2 +- lgsm/functions/fix_unt.sh | 2 +- lgsm/functions/fix_ut.sh | 2 +- lgsm/functions/fix_ut2k4.sh | 2 +- lgsm/functions/fix_ut3.sh | 2 +- lgsm/functions/fix_zmr.sh | 2 +- lgsm/functions/install_complete.sh | 2 +- lgsm/functions/install_config.sh | 2 +- lgsm/functions/install_dst_token.sh | 2 +- 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_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_squad_license.sh | 2 +- lgsm/functions/install_stats.sh | 2 +- lgsm/functions/install_steamcmd.sh | 2 +- lgsm/functions/install_ts3db.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 | 2 +- lgsm/functions/update_factorio.sh | 2 +- lgsm/functions/update_minecraft.sh | 2 +- lgsm/functions/update_minecraft_bedrock.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 +- 105 files changed, 131 insertions(+), 123 deletions(-) diff --git a/lgsm/functions/alert.sh b/lgsm/functions/alert.sh index 17f51140e..db5fdbc79 100644 --- a/lgsm/functions/alert.sh +++ b/lgsm/functions/alert.sh @@ -4,7 +4,7 @@ # Website: https://linuxgsm.com # Description: Overall function for managing alerts. -local commandname="ALERT" +local modulename="ALERT" local commandaction="Alert" fn_alert_log(){ diff --git a/lgsm/functions/alert_discord.sh b/lgsm/functions/alert_discord.sh index b404b8e0f..6f5793de1 100644 --- a/lgsm/functions/alert_discord.sh +++ b/lgsm/functions/alert_discord.sh @@ -5,6 +5,10 @@ # Website: https://linuxgsm.com # Description: Sends Discord alert. +local modulename="ALERT" +local commandaction="Alert" +local function_selfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" + if ! command -v jq > /dev/null; then fn_print_fail_nl "Sending Discord alert: jq is missing." fn_script_log_fatal "Sending Discord alert: jq is missing." diff --git a/lgsm/functions/alert_email.sh b/lgsm/functions/alert_email.sh index 8b9cef865..727275b35 100644 --- a/lgsm/functions/alert_email.sh +++ b/lgsm/functions/alert_email.sh @@ -4,7 +4,7 @@ # Website: https://linuxgsm.com # Description: Sends email alert. -local commandname="ALERT" +local modulename="ALERT" local commandaction="Alert" local function_selfname=$(basename "$(readlink -f "${BASH_SOURCE[0]}")") diff --git a/lgsm/functions/alert_ifttt.sh b/lgsm/functions/alert_ifttt.sh index 99b564f08..b77fa7c50 100644 --- a/lgsm/functions/alert_ifttt.sh +++ b/lgsm/functions/alert_ifttt.sh @@ -4,7 +4,7 @@ # Website: https://linuxgsm.com # Description: Sends IFTTT alert. -local commandname="ALERT" +local modulename="ALERT" local commandaction="Alert" local function_selfname=$(basename "$(readlink -f "${BASH_SOURCE[0]}")") diff --git a/lgsm/functions/alert_mailgun.sh b/lgsm/functions/alert_mailgun.sh index aa2594823..521a46fb9 100644 --- a/lgsm/functions/alert_mailgun.sh +++ b/lgsm/functions/alert_mailgun.sh @@ -4,7 +4,7 @@ # Website: https://linuxgsm.com # Description: Sends Mailgun Email alert. -local commandname="ALERT" +local modulename="ALERT" local commandaction="Alert" local function_selfname=$(basename "$(readlink -f "${BASH_SOURCE[0]}")") diff --git a/lgsm/functions/alert_pushbullet.sh b/lgsm/functions/alert_pushbullet.sh index 797e987f0..a9b409f10 100644 --- a/lgsm/functions/alert_pushbullet.sh +++ b/lgsm/functions/alert_pushbullet.sh @@ -4,7 +4,7 @@ # Website: https://linuxgsm.com # Description: Sends Pushbullet Messenger alert. -local commandname="ALERT" +local modulename="ALERT" local commandaction="Alert" local function_selfname=$(basename "$(readlink -f "${BASH_SOURCE[0]}")") diff --git a/lgsm/functions/alert_pushover.sh b/lgsm/functions/alert_pushover.sh index 701dca674..0db5d5a0c 100644 --- a/lgsm/functions/alert_pushover.sh +++ b/lgsm/functions/alert_pushover.sh @@ -4,7 +4,7 @@ # Website: https://linuxgsm.com # Description: Sends Pushover alert. -local commandname="ALERT" +local modulename="ALERT" local commandaction="Alert" local function_selfname=$(basename "$(readlink -f "${BASH_SOURCE[0]}")") diff --git a/lgsm/functions/alert_slack.sh b/lgsm/functions/alert_slack.sh index b2345de43..582043f0c 100644 --- a/lgsm/functions/alert_slack.sh +++ b/lgsm/functions/alert_slack.sh @@ -4,6 +4,10 @@ # Website: https://linuxgsm.com # Description: Sends Slack alert. +local modulename="ALERT" +local commandaction="Alert" +local function_selfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" + if ! command -v jq > /dev/null; then fn_print_fail_nl "Sending Slack alert: jq is missing." fn_script_log_fatal "Sending Slack alert: jq is missing." diff --git a/lgsm/functions/alert_telegram.sh b/lgsm/functions/alert_telegram.sh index 3581abf38..21436c340 100644 --- a/lgsm/functions/alert_telegram.sh +++ b/lgsm/functions/alert_telegram.sh @@ -4,7 +4,7 @@ # Website: https://bytegaming.de # Description: Sends Telegram Messenger alert. -local commandname="ALERT" +local modulename="ALERT" local commandaction="Alert" local function_selfname=$(basename "$(readlink -f "${BASH_SOURCE[0]}")") diff --git a/lgsm/functions/check.sh b/lgsm/functions/check.sh index 21e63aca4..838441517 100644 --- a/lgsm/functions/check.sh +++ b/lgsm/functions/check.sh @@ -5,7 +5,7 @@ # Description: Overall function for managing checks. # Runs checks that will either halt on or fix an issue. -local commandname="CHECK" +local modulename="CHECK" # Every command that requires checks just references check.sh. # check.sh selects which checks to run by using arrays. diff --git a/lgsm/functions/check_config.sh b/lgsm/functions/check_config.sh index 7a52ce294..01da2ab24 100644 --- a/lgsm/functions/check_config.sh +++ b/lgsm/functions/check_config.sh @@ -4,8 +4,8 @@ # Website: https://linuxgsm.com # Description: Checks if the server config is missing and warns the user if needed. -local commandname="CHECK" -local function_selfname=$(basename "$(readlink -f "${BASH_SOURCE[0]}")") +local modulename="CHECK" +local function_selfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" if [ ! -e "${servercfgfullpath}" ]; then if [ "${shortname}" != "hw" ]&&[ "${shortname}" != "ut3" ]&&[ "${shortname}" != "kf2" ]; then diff --git a/lgsm/functions/check_deps.sh b/lgsm/functions/check_deps.sh index e29a35a64..fff32f9ff 100644 --- a/lgsm/functions/check_deps.sh +++ b/lgsm/functions/check_deps.sh @@ -4,7 +4,7 @@ # Website: https://linuxgsm.com # Description: Checks if required dependencies are installed for LinuxGSM. -local commandname="CHECK" +local modulename="CHECK" fn_install_mono_repo(){ if [ "${monostatus}" != "0" ]; then diff --git a/lgsm/functions/check_executable.sh b/lgsm/functions/check_executable.sh index 88a93ffc5..3643d3e0d 100644 --- a/lgsm/functions/check_executable.sh +++ b/lgsm/functions/check_executable.sh @@ -4,8 +4,8 @@ # Website: https://linuxgsm.com # Description: Checks if server executable exists. -local commandname="CHECK" -local function_selfname=$(basename "$(readlink -f "${BASH_SOURCE[0]}")") +local modulename="CHECK" +local function_selfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" # Check if executable exists if [ ! -f "${executabledir}/${execname}" ]; then diff --git a/lgsm/functions/check_glibc.sh b/lgsm/functions/check_glibc.sh index 4ff80b84b..0c6e5a70d 100644 --- a/lgsm/functions/check_glibc.sh +++ b/lgsm/functions/check_glibc.sh @@ -4,7 +4,7 @@ # Website: https://linuxgsm.com # Description: Checks if the server has the correct Glibc version. -local commandname="CHECK" +local modulename="CHECK" info_distro.sh diff --git a/lgsm/functions/check_ip.sh b/lgsm/functions/check_ip.sh index 646a6899f..727c6e125 100644 --- a/lgsm/functions/check_ip.sh +++ b/lgsm/functions/check_ip.sh @@ -5,7 +5,7 @@ # Description: Automatically identifies the server interface IP. # If multiple interfaces are detected the user will need to manually set using ip="0.0.0.0". -local commandname="CHECK" +local modulename="CHECK" if [ "${travistest}" != "1" ]; then if [ ! -f "/bin/ip" ]; then diff --git a/lgsm/functions/check_logs.sh b/lgsm/functions/check_logs.sh index 4da3cd057..883337756 100644 --- a/lgsm/functions/check_logs.sh +++ b/lgsm/functions/check_logs.sh @@ -4,8 +4,8 @@ # Website: https://linuxgsm.com # Description: Checks if log files exist. -local commandname="CHECK" -local function_selfname=$(basename "$(readlink -f "${BASH_SOURCE[0]}")") +local modulename="CHECK" +local function_selfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" fn_check_logs(){ fn_print_dots "Checking for log files" diff --git a/lgsm/functions/check_permissions.sh b/lgsm/functions/check_permissions.sh index 4d1e81413..1e81735b4 100644 --- a/lgsm/functions/check_permissions.sh +++ b/lgsm/functions/check_permissions.sh @@ -5,7 +5,7 @@ # Website: https://linuxgsm.com # Description: Checks ownership & permissions of scripts, files and directories. -local commandname="CHECK" +local modulename="CHECK" fn_check_ownership(){ if [ -f "${rootdir}/${selfname}" ]; then diff --git a/lgsm/functions/check_root.sh b/lgsm/functions/check_root.sh index 4200c5dc0..8f62674f7 100644 --- a/lgsm/functions/check_root.sh +++ b/lgsm/functions/check_root.sh @@ -4,8 +4,8 @@ # Website: https://linuxgsm.com # Description: Checks if the user tried to run the script as root. -local commandname="CHECK" -local function_selfname=$(basename "$(readlink -f "${BASH_SOURCE[0]}")") +local modulename="CHECK" +local function_selfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" if [ "$(whoami)" = "root" ]; then if [ "${function_selfname}" != "command_install.sh" ]; then diff --git a/lgsm/functions/check_status.sh b/lgsm/functions/check_status.sh index d814197be..67025a5e7 100644 --- a/lgsm/functions/check_status.sh +++ b/lgsm/functions/check_status.sh @@ -5,7 +5,7 @@ # Website: https://linuxgsm.com # Description: Checks the process status of the server. Either online or offline. -local commandname="CHECK" -local function_selfname=$(basename "$(readlink -f "${BASH_SOURCE[0]}")") +local modulename="CHECK" +local function_selfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" status=$(tmux list-sessions -F "#{session_name}" 2>/dev/null | grep -Ecx "^${selfname}") diff --git a/lgsm/functions/check_steamcmd.sh b/lgsm/functions/check_steamcmd.sh index 77f46033d..e7cafa4a1 100644 --- a/lgsm/functions/check_steamcmd.sh +++ b/lgsm/functions/check_steamcmd.sh @@ -4,7 +4,7 @@ # Website: https://linuxgsm.com # Description: Checks if SteamCMD is installed correctly. -local commandname="CHECK" +local modulename="CHECK" fn_install_steamcmd(){ if [ ! -d "${steamcmddir}" ]; then diff --git a/lgsm/functions/check_system_dir.sh b/lgsm/functions/check_system_dir.sh index d11b30a20..9a4863a5a 100644 --- a/lgsm/functions/check_system_dir.sh +++ b/lgsm/functions/check_system_dir.sh @@ -4,8 +4,8 @@ # Website: https://linuxgsm.com # Description: Checks if systemdir/serverfiles is accessible. -local commandname="CHECK" -local function_selfname=$(basename "$(readlink -f "${BASH_SOURCE[0]}")") +local modulename="CHECK" +local function_selfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" if [ "${function_selfname}" != "command_validate.sh" ]; then checkdir="${serverfiles}" diff --git a/lgsm/functions/check_system_requirements.sh b/lgsm/functions/check_system_requirements.sh index 3c0345219..8b0b5a92b 100644 --- a/lgsm/functions/check_system_requirements.sh +++ b/lgsm/functions/check_system_requirements.sh @@ -5,8 +5,8 @@ # Website: https://linuxgsm.com # Description: Checks RAM requirements -local commandname="CHECK" -local function_selfname=$(basename "$(readlink -f "${BASH_SOURCE[0]}")") +local modulename="CHECK" +local function_selfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" info_distro.sh diff --git a/lgsm/functions/check_tmuxception.sh b/lgsm/functions/check_tmuxception.sh index 7e83cf844..9abf3bb1d 100644 --- a/lgsm/functions/check_tmuxception.sh +++ b/lgsm/functions/check_tmuxception.sh @@ -5,7 +5,7 @@ # Website: https://linuxgsm.com # Description: Checks if run from tmux or screen -local commandname="CHECK" +local modulename="CHECK" fn_check_is_in_tmux(){ if [ -n "${TMUX}" ]; then diff --git a/lgsm/functions/command_backup.sh b/lgsm/functions/command_backup.sh index a7e3e337a..c1da544e2 100644 --- a/lgsm/functions/command_backup.sh +++ b/lgsm/functions/command_backup.sh @@ -5,7 +5,7 @@ # Website: https://linuxgsm.com # Description: Creates a .tar.gz file in the backup directory. -local commandname="BACKUP" +local modulename="BACKUP" local commandaction="Backup" local function_selfname=$(basename "$(readlink -f "${BASH_SOURCE[0]}")") diff --git a/lgsm/functions/command_console.sh b/lgsm/functions/command_console.sh index 4dfa2a4a3..796f24454 100644 --- a/lgsm/functions/command_console.sh +++ b/lgsm/functions/command_console.sh @@ -4,7 +4,7 @@ # Website: https://linuxgsm.com # Description: Gives access to the server tmux console. -local commandname="CONSOLE" +local modulename="CONSOLE" local commandaction="Console" local function_selfname=$(basename "$(readlink -f "${BASH_SOURCE[0]}")") diff --git a/lgsm/functions/command_debug.sh b/lgsm/functions/command_debug.sh index dda8b1170..e50965882 100644 --- a/lgsm/functions/command_debug.sh +++ b/lgsm/functions/command_debug.sh @@ -4,7 +4,7 @@ # Website: https://linuxgsm.com # Description: Runs the server without tmux and directly from the terminal. -local commandname="DEBUG" +local modulename="DEBUG" local commandaction="Debug" local function_selfname=$(basename "$(readlink -f "${BASH_SOURCE[0]}")") diff --git a/lgsm/functions/command_details.sh b/lgsm/functions/command_details.sh index 889febbd4..461dc78f5 100644 --- a/lgsm/functions/command_details.sh +++ b/lgsm/functions/command_details.sh @@ -5,7 +5,7 @@ # Website: https://linuxgsm.com # Description: Displays server information. -local commandname="DETAILS" +local modulename="DETAILS" local commandaction="Details" local function_selfname=$(basename "$(readlink -f "${BASH_SOURCE[0]}")") diff --git a/lgsm/functions/command_dev_debug.sh b/lgsm/functions/command_dev_debug.sh index 0cb3e48b5..61f40c808 100644 --- a/lgsm/functions/command_dev_debug.sh +++ b/lgsm/functions/command_dev_debug.sh @@ -4,7 +4,7 @@ # Website: https://linuxgsm.com # Description: Dev only: Enables debugging log to be saved to dev-debug.log. -local commandname="DEV-DEBUG" +local modulename="DEV-DEBUG" local commandaction="Dev-Debug" local function_selfname=$(basename "$(readlink -f "${BASH_SOURCE[0]}")") diff --git a/lgsm/functions/command_dev_detect_deps.sh b/lgsm/functions/command_dev_detect_deps.sh index ff1e797cd..83476a7bb 100644 --- a/lgsm/functions/command_dev_detect_deps.sh +++ b/lgsm/functions/command_dev_detect_deps.sh @@ -4,7 +4,7 @@ # Website: https://linuxgsm.com # Description: Detects dependencies the server binary requires. -local commandname="DETECT-DEPS" +local modulename="DETECT-DEPS" local commandaction="Detect-Deps" local function_selfname=$(basename "$(readlink -f "${BASH_SOURCE[0]}")") diff --git a/lgsm/functions/command_dev_detect_glibc.sh b/lgsm/functions/command_dev_detect_glibc.sh index e86fb05db..a8b463e2c 100644 --- a/lgsm/functions/command_dev_detect_glibc.sh +++ b/lgsm/functions/command_dev_detect_glibc.sh @@ -5,7 +5,7 @@ # Description: Automatically detects the version of GLIBC that is required. # Can check a file or directory recursively. -local commandname="DETECT-GLIBC" +local modulename="DETECT-GLIBC" local commandaction="Detect-Glibc" local function_selfname=$(basename "$(readlink -f "${BASH_SOURCE[0]}")") diff --git a/lgsm/functions/command_dev_detect_ldd.sh b/lgsm/functions/command_dev_detect_ldd.sh index 848489ddf..7f360fe84 100644 --- a/lgsm/functions/command_dev_detect_ldd.sh +++ b/lgsm/functions/command_dev_detect_ldd.sh @@ -5,7 +5,7 @@ # Description: Automatically detects required deps using ldd. # Can check a file or directory recursively. -local commandname="DETECT-LDD" +local modulename="DETECT-LDD" local commandaction="Detect-LDD" local function_selfname=$(basename "$(readlink -f "${BASH_SOURCE[0]}")") diff --git a/lgsm/functions/command_dev_query_raw.sh b/lgsm/functions/command_dev_query_raw.sh index a0efd2690..78ba80e77 100644 --- a/lgsm/functions/command_dev_query_raw.sh +++ b/lgsm/functions/command_dev_query_raw.sh @@ -4,7 +4,7 @@ # Website: https://linuxgsm.com # Description: Raw gamedig output of the server. -local commandname="QUERY-RAW" +local modulename="QUERY-RAW" local commandaction="Query Raw" local function_selfname=$(basename "$(readlink -f "${BASH_SOURCE[0]}")") diff --git a/lgsm/functions/command_donate.sh b/lgsm/functions/command_donate.sh index 15c94fdf3..e979339f1 100644 --- a/lgsm/functions/command_donate.sh +++ b/lgsm/functions/command_donate.sh @@ -4,7 +4,7 @@ # Website: https://linuxgsm.com # Description: Shows ways to donate. -local commandname="CONSOLE" +local modulename="CONSOLE" local commandaction="Console" local function_selfname=$(basename "$(readlink -f "${BASH_SOURCE[0]}")") diff --git a/lgsm/functions/command_fastdl.sh b/lgsm/functions/command_fastdl.sh index d862c7ed8..54ae7fe94 100644 --- a/lgsm/functions/command_fastdl.sh +++ b/lgsm/functions/command_fastdl.sh @@ -5,7 +5,7 @@ # Website: https://linuxgsm.com # Description: Creates a FastDL directory. -local commandname="FASTDL" +local modulename="FASTDL" local commandaction="FastDL" local function_selfname=$(basename "$(readlink -f "${BASH_SOURCE[0]}")") diff --git a/lgsm/functions/command_install.sh b/lgsm/functions/command_install.sh index 4955aab86..e8d6923de 100644 --- a/lgsm/functions/command_install.sh +++ b/lgsm/functions/command_install.sh @@ -5,7 +5,7 @@ # Website: https://linuxgsm.com # Description: Overall function for the installer. -local commandname="INSTALL" +local modulename="INSTALL" local commandaction="Install" local function_selfname=$(basename "$(readlink -f "${BASH_SOURCE[0]}")") diff --git a/lgsm/functions/command_install_resources_mta.sh b/lgsm/functions/command_install_resources_mta.sh index c4a555800..5874818a6 100644 --- a/lgsm/functions/command_install_resources_mta.sh +++ b/lgsm/functions/command_install_resources_mta.sh @@ -4,7 +4,7 @@ # Website: https://linuxgsm.com # Description: Installs the default resources for Multi Theft Auto. -local commandname="DEFAULT_RESOURCES" +local modulename="DEFAULT_RESOURCES" local commandaction="Default Resources" local function_selfname=$(basename "$(readlink -f "${BASH_SOURCE[0]}")") diff --git a/lgsm/functions/command_mods_install.sh b/lgsm/functions/command_mods_install.sh index dd6b51de6..5cedab62d 100644 --- a/lgsm/functions/command_mods_install.sh +++ b/lgsm/functions/command_mods_install.sh @@ -5,7 +5,7 @@ # Website: https://linuxgsm.com # Description: List and installs available mods along with mods_list.sh and mods_core.sh. -local commandname="MODS" +local modulename="MODS" local commandaction="addons/mods" local function_selfname=$(basename "$(readlink -f "${BASH_SOURCE[0]}")") diff --git a/lgsm/functions/command_mods_remove.sh b/lgsm/functions/command_mods_remove.sh index 13516410d..0c869b88b 100644 --- a/lgsm/functions/command_mods_remove.sh +++ b/lgsm/functions/command_mods_remove.sh @@ -5,7 +5,7 @@ # Website: https://linuxgsm.com # Description: Uninstall mods along with mods_list.sh and mods_core.sh. -local commandname="MODS" +local modulename="MODS" local commandaction="Mods Remove" local function_selfname=$(basename "$(readlink -f "${BASH_SOURCE[0]}")") diff --git a/lgsm/functions/command_mods_update.sh b/lgsm/functions/command_mods_update.sh index ba5708d96..04c482e5c 100644 --- a/lgsm/functions/command_mods_update.sh +++ b/lgsm/functions/command_mods_update.sh @@ -5,7 +5,7 @@ # Website: https://linuxgsm.com # Description: Updates installed mods along with mods_list.sh and mods_core.sh. -local commandname="MODS" +local modulename="MODS" local commandaction="Mods Update" local function_selfname=$(basename "$(readlink -f "${BASH_SOURCE[0]}")") diff --git a/lgsm/functions/command_monitor.sh b/lgsm/functions/command_monitor.sh index 0dada9464..9d9db0ad2 100644 --- a/lgsm/functions/command_monitor.sh +++ b/lgsm/functions/command_monitor.sh @@ -6,7 +6,7 @@ # Description: Monitors server by checking for running processes # then passes to gamedig and gsquery. -local commandname="MONITOR" +local modulename="MONITOR" local commandaction="Monitor" local function_selfname=$(basename "$(readlink -f "${BASH_SOURCE[0]}")") diff --git a/lgsm/functions/command_postdetails.sh b/lgsm/functions/command_postdetails.sh index 083bc7213..7e5d14355 100644 --- a/lgsm/functions/command_postdetails.sh +++ b/lgsm/functions/command_postdetails.sh @@ -5,7 +5,7 @@ # Website: https://linuxgsm.com # Description: Strips sensitive information out of Details output -local commandname="POSTDETAILS" +local modulename="POSTDETAILS" local commandaction="Postdetails" local function_selfname=$(basename "$(readlink -f "${BASH_SOURCE[0]}")") diff --git a/lgsm/functions/command_restart.sh b/lgsm/functions/command_restart.sh index 76b65b8e5..56b6d7872 100644 --- a/lgsm/functions/command_restart.sh +++ b/lgsm/functions/command_restart.sh @@ -4,7 +4,7 @@ # Website: https://linuxgsm.com # Description: Restarts the server. -local commandname="RESTART" +local modulename="RESTART" local commandaction="Restarting" local function_selfname=$(basename "$(readlink -f "${BASH_SOURCE[0]}")") diff --git a/lgsm/functions/command_start.sh b/lgsm/functions/command_start.sh index 4c9fd20c4..80ffdd19a 100644 --- a/lgsm/functions/command_start.sh +++ b/lgsm/functions/command_start.sh @@ -5,7 +5,7 @@ # Website: https://linuxgsm.com # Description: Starts the server. -local commandname="START" +local modulename="START" local commandaction="Starting" local function_selfname=$(basename "$(readlink -f "${BASH_SOURCE[0]}")") diff --git a/lgsm/functions/command_stop.sh b/lgsm/functions/command_stop.sh index 03a3bff18..609425595 100644 --- a/lgsm/functions/command_stop.sh +++ b/lgsm/functions/command_stop.sh @@ -5,7 +5,7 @@ # Website: https://linuxgsm.com # Description: Stops the server. -local commandname="STOP" +local modulename="STOP" local commandaction="Stopping" local function_selfname=$(basename "$(readlink -f "${BASH_SOURCE[0]}")") diff --git a/lgsm/functions/command_test_alert.sh b/lgsm/functions/command_test_alert.sh index 368a9ab21..77ff0d079 100644 --- a/lgsm/functions/command_test_alert.sh +++ b/lgsm/functions/command_test_alert.sh @@ -4,7 +4,7 @@ # Website: https://linuxgsm.com # Description: Sends a test alert. -local commandname="ALERT" +local modulename="ALERT" local commandaction="Alert" local function_selfname=$(basename "$(readlink -f "${BASH_SOURCE[0]}")") diff --git a/lgsm/functions/command_ts3_server_pass.sh b/lgsm/functions/command_ts3_server_pass.sh index 4bb3421dc..dfe9c5824 100644 --- a/lgsm/functions/command_ts3_server_pass.sh +++ b/lgsm/functions/command_ts3_server_pass.sh @@ -5,7 +5,7 @@ # Website: https://linuxgsm.com # Description: Changes TS3 serveradmin password. -local commandname="PASSWORD-CHANGE" +local modulename="PASSWORD-CHANGE" local commandaction="Password Change" local function_selfname=$(basename "$(readlink -f "${BASH_SOURCE[0]}")") diff --git a/lgsm/functions/command_update.sh b/lgsm/functions/command_update.sh index 1bc37e7bb..64cfcb2f5 100644 --- a/lgsm/functions/command_update.sh +++ b/lgsm/functions/command_update.sh @@ -4,7 +4,7 @@ # Website: https://linuxgsm.com # Description: Handles updating of servers. -local commandname="UPDATE" +local modulename="UPDATE" local commandaction="Update" local function_selfname=$(basename "$(readlink -f "${BASH_SOURCE[0]}")") diff --git a/lgsm/functions/command_update_linuxgsm.sh b/lgsm/functions/command_update_linuxgsm.sh index 05069b79c..c2529f43c 100644 --- a/lgsm/functions/command_update_linuxgsm.sh +++ b/lgsm/functions/command_update_linuxgsm.sh @@ -4,7 +4,7 @@ # Website: https://linuxgsm.com # Description: Deletes the functions dir to allow re-downloading of functions from GitHub. -local commandname="UPDATE LINUXGSM" +local modulename="UPDATE LINUXGSM" local commandaction="Update LinuxGSM" local function_selfname=$(basename "$(readlink -f "${BASH_SOURCE[0]}")") diff --git a/lgsm/functions/command_validate.sh b/lgsm/functions/command_validate.sh index 55a58d266..abc59473c 100644 --- a/lgsm/functions/command_validate.sh +++ b/lgsm/functions/command_validate.sh @@ -4,7 +4,7 @@ # Website: https://linuxgsm.com # Description: Runs a server validation. -local commandname="VALIDATE" +local modulename="VALIDATE" local commandaction="Validate" local function_selfname=$(basename "$(readlink -f "${BASH_SOURCE[0]}")") diff --git a/lgsm/functions/command_wipe.sh b/lgsm/functions/command_wipe.sh index 97b268e57..55d0d5d01 100644 --- a/lgsm/functions/command_wipe.sh +++ b/lgsm/functions/command_wipe.sh @@ -5,7 +5,7 @@ # Website: https://linuxgsm.com # Description: Wipes server data, useful after updates for some games like Rust -local commandname="WIPE" +local modulename="WIPE" local commandaction="Wipe" local function_selfname=$(basename "$(readlink -f "${BASH_SOURCE[0]}")") diff --git a/lgsm/functions/core_dl.sh b/lgsm/functions/core_dl.sh index 24cff68bf..3874c8f24 100644 --- a/lgsm/functions/core_dl.sh +++ b/lgsm/functions/core_dl.sh @@ -17,7 +17,7 @@ # 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 modulename="DOWNLOAD" local commandaction="Download" local function_selfname=$(basename "$(readlink -f "${BASH_SOURCE[0]}")") diff --git a/lgsm/functions/core_messages.sh b/lgsm/functions/core_messages.sh index 166cca593..6dadb63c7 100644 --- a/lgsm/functions/core_messages.sh +++ b/lgsm/functions/core_messages.sh @@ -46,8 +46,8 @@ fn_sleep_time(){ ## Feb 28 14:56:58 ut99-server: Monitor: fn_script_log(){ if [ -d "${lgsmlogdir}" ]; then - if [ -n "${commandname}" ]; then - echo -e "$(date '+%b %d %H:%M:%S.%3N') ${selfname}: ${commandname}: ${1}" >> "${lgsmlog}" + if [ -n "${modulename}" ]; then + echo -e "$(date '+%b %d %H:%M:%S.%3N') ${servicename}: ${modulename}: ${1}" >> "${lgsmlog}" else echo -e "$(date '+%b %d %H:%M:%S.%3N') ${selfname}: ${1}" >> "${lgsmlog}" fi @@ -57,8 +57,8 @@ fn_script_log(){ ## Feb 28 14:56:58 ut99-server: Monitor: PASS: fn_script_log_pass(){ if [ -d "${lgsmlogdir}" ]; then - if [ -n "${commandname}" ]; then - echo -e "$(date '+%b %d %H:%M:%S.%3N') ${selfname}: ${commandname}: PASS: ${1}" >> "${lgsmlog}" + if [ -n "${modulename}" ]; then + echo -e "$(date '+%b %d %H:%M:%S.%3N') ${servicename}: ${modulename}: PASS: ${1}" >> "${lgsmlog}" else echo -e "$(date '+%b %d %H:%M:%S.%3N') ${selfname}: PASS: ${1}" >> "${lgsmlog}" fi @@ -69,8 +69,8 @@ fn_script_log_pass(){ ## Feb 28 14:56:58 ut99-server: Monitor: FATAL: fn_script_log_fatal(){ if [ -d "${lgsmlogdir}" ]; then - if [ -n "${commandname}" ]; then - echo -e "$(date '+%b %d %H:%M:%S.%3N') ${selfname}: ${commandname}: FATAL: ${1}" >> "${lgsmlog}" + if [ -n "${modulename}" ]; then + echo -e "$(date '+%b %d %H:%M:%S.%3N') ${servicename}: ${modulename}: FATAL: ${1}" >> "${lgsmlog}" else echo -e "$(date '+%b %d %H:%M:%S.%3N') ${selfname}: FATAL: ${1}" >> "${lgsmlog}" fi @@ -81,8 +81,8 @@ fn_script_log_fatal(){ ## Feb 28 14:56:58 ut99-server: Monitor: ERROR: fn_script_log_error(){ if [ -d "${lgsmlogdir}" ]; then - if [ -n "${commandname}" ]; then - echo -e "$(date '+%b %d %H:%M:%S.%3N') ${selfname}: ${commandname}: ERROR: ${1}" >> "${lgsmlog}" + if [ -n "${modulename}" ]; then + echo -e "$(date '+%b %d %H:%M:%S.%3N') ${servicename}: ${modulename}: ERROR: ${1}" >> "${lgsmlog}" else echo -e "$(date '+%b %d %H:%M:%S.%3N') ${selfname}: ERROR: ${1}" >> "${lgsmlog}" fi @@ -93,8 +93,8 @@ fn_script_log_error(){ ## Feb 28 14:56:58 ut99-server: Monitor: WARN: fn_script_log_warn(){ if [ -d "${lgsmlogdir}" ]; then - if [ -n "${commandname}" ]; then - echo -e "$(date '+%b %d %H:%M:%S.%3N') ${selfname}: ${commandname}: WARN: ${1}" >> "${lgsmlog}" + if [ -n "${modulename}" ]; then + echo -e "$(date '+%b %d %H:%M:%S.%3N') ${servicename}: ${modulename}: WARN: ${1}" >> "${lgsmlog}" else echo -e "$(date '+%b %d %H:%M:%S.%3N') ${selfname}: WARN: ${1}" >> "${lgsmlog}" fi @@ -105,8 +105,8 @@ fn_script_log_warn(){ ## Feb 28 14:56:58 ut99-server: Monitor: INFO: fn_script_log_info(){ if [ -d "${lgsmlogdir}" ]; then - if [ -n "${commandname}" ]; then - echo -e "$(date '+%b %d %H:%M:%S.%3N') ${selfname}: ${commandname}: INFO: ${1}" >> "${lgsmlog}" + if [ -n "${modulename}" ]; then + echo -e "$(date '+%b %d %H:%M:%S.%3N') ${servicename}: ${modulename}: INFO: ${1}" >> "${lgsmlog}" else echo -e "$(date '+%b %d %H:%M:%S.%3N') ${selfname}: INFO: ${1}" >> "${lgsmlog}" fi diff --git a/lgsm/functions/fix.sh b/lgsm/functions/fix.sh index 864e69f49..7585b4348 100644 --- a/lgsm/functions/fix.sh +++ b/lgsm/functions/fix.sh @@ -5,7 +5,7 @@ # Description: Overall function for managing fixes. # Runs functions that will fix an issue. -local commandname="FIX" +local modulename="FIX" local commandaction="Fix" # Messages that are displayed for some fixes. diff --git a/lgsm/functions/fix_arma3.sh b/lgsm/functions/fix_arma3.sh index eda6dde69..de9785e51 100644 --- a/lgsm/functions/fix_arma3.sh +++ b/lgsm/functions/fix_arma3.sh @@ -4,7 +4,7 @@ # Website: https://linuxgsm.com # Description: Resolves an issue with ARMA3. -local commandname="FIX" +local modulename="FIX" local commandaction="Fix" local function_selfname=$(basename "$(readlink -f "${BASH_SOURCE[0]}")") diff --git a/lgsm/functions/fix_csgo.sh b/lgsm/functions/fix_csgo.sh index 5e9981e38..0ea098eed 100644 --- a/lgsm/functions/fix_csgo.sh +++ b/lgsm/functions/fix_csgo.sh @@ -4,7 +4,7 @@ # Website: https://linuxgsm.com # Description: Resolves various issues with CS:GO. -local commandname="FIX" +local modulename="FIX" local commandaction="Fix" local function_selfname=$(basename "$(readlink -f "${BASH_SOURCE[0]}")") diff --git a/lgsm/functions/fix_dst.sh b/lgsm/functions/fix_dst.sh index 3b62be24b..46c17756b 100644 --- a/lgsm/functions/fix_dst.sh +++ b/lgsm/functions/fix_dst.sh @@ -4,7 +4,7 @@ # Website: https://linuxgsm.com # Description: Resolves various issues with Don't Starve Together. -local commandname="FIX" +local modulename="FIX" local commandaction="Fix" local function_selfname=$(basename "$(readlink -f "${BASH_SOURCE[0]}")") diff --git a/lgsm/functions/fix_ges.sh b/lgsm/functions/fix_ges.sh index 35e1411e3..bbd08c645 100644 --- a/lgsm/functions/fix_ges.sh +++ b/lgsm/functions/fix_ges.sh @@ -4,7 +4,7 @@ # Website: https://linuxgsm.com # Description: Resolves various issues with GoldenEye: Source. -local commandname="FIX" +local modulename="FIX" local commandaction="Fix" # Fixes: MALLOC_CHECK_ needing to be set to 0. diff --git a/lgsm/functions/fix_ins.sh b/lgsm/functions/fix_ins.sh index 354401ea5..e26d501da 100644 --- a/lgsm/functions/fix_ins.sh +++ b/lgsm/functions/fix_ins.sh @@ -4,7 +4,7 @@ # Website: https://linuxgsm.com # Description: Resolves various issues with Insurgency. -local commandname="FIX" +local modulename="FIX" local commandaction="Fix" # Fixes: ./srcds_linux: error while loading shared libraries: libtier0.so: cannot open shared object file: No such file or directory. diff --git a/lgsm/functions/fix_kf.sh b/lgsm/functions/fix_kf.sh index 0661775d4..0ce05184b 100644 --- a/lgsm/functions/fix_kf.sh +++ b/lgsm/functions/fix_kf.sh @@ -4,7 +4,7 @@ # Website: https://linuxgsm.com # Description: Resolves various issues with Killing Floor. -local commandname="FIX" +local modulename="FIX" local commandaction="Fix" local function_selfname=$(basename "$(readlink -f "${BASH_SOURCE[0]}")") diff --git a/lgsm/functions/fix_kf2.sh b/lgsm/functions/fix_kf2.sh index 2909a535f..7cc1be568 100644 --- a/lgsm/functions/fix_kf2.sh +++ b/lgsm/functions/fix_kf2.sh @@ -4,7 +4,7 @@ # Website: https://linuxgsm.com # Description: Resolves various issues with Killing Floor 2. -local commandname="FIX" +local modulename="FIX" local commandaction="Fix" local function_selfname=$(basename "$(readlink -f "${BASH_SOURCE[0]}")") diff --git a/lgsm/functions/fix_mcb.sh b/lgsm/functions/fix_mcb.sh index d9cb8073a..e5a919dbc 100644 --- a/lgsm/functions/fix_mcb.sh +++ b/lgsm/functions/fix_mcb.sh @@ -4,8 +4,8 @@ # Website: https://linuxgsm.com # Description: Resolves possible startup issue with Minecraft Bedrock -local commandname="FIX" +local modulename="FIX" local commandaction="Fix" # official docs state that the server should be started with: LD_LIBRARY_PATH=. ./bedrock_server -export LD_LIBRARY_PATH="${serverfiles}:$LD_LIBRARY_PATH" \ No newline at end of file +export LD_LIBRARY_PATH="${serverfiles}:$LD_LIBRARY_PATH" diff --git a/lgsm/functions/fix_mta.sh b/lgsm/functions/fix_mta.sh index c8b2ff8b0..af4d5002f 100644 --- a/lgsm/functions/fix_mta.sh +++ b/lgsm/functions/fix_mta.sh @@ -4,7 +4,7 @@ # Contributor: ChaosMTA # Website: https://linuxgsm.com # Description: Installs the libmysqlclient for database functions on the server -local commandname="FIX" +local modulename="FIX" local commandaction="Fix" local function_selfname=$(basename "$(readlink -f "${BASH_SOURCE[0]}")") diff --git a/lgsm/functions/fix_onset.sh b/lgsm/functions/fix_onset.sh index 9fbeddff3..24ab62132 100644 --- a/lgsm/functions/fix_onset.sh +++ b/lgsm/functions/fix_onset.sh @@ -4,7 +4,7 @@ # Website: https://linuxgsm.com # Description: Resolves various issues with Onset -local commandname="FIX" +local modulename="FIX" local commandaction="Fix" local function_selfname=$(basename "$(readlink -f "${BASH_SOURCE[0]}")") diff --git a/lgsm/functions/fix_ro.sh b/lgsm/functions/fix_ro.sh index 1e1da31bc..e7ced52ad 100644 --- a/lgsm/functions/fix_ro.sh +++ b/lgsm/functions/fix_ro.sh @@ -4,7 +4,7 @@ # Website: https://linuxgsm.com # Description: Resolves various issues with Red Orchestra. -local commandname="FIX" +local modulename="FIX" local commandaction="Fix" local function_selfname=$(basename "$(readlink -f "${BASH_SOURCE[0]}")") diff --git a/lgsm/functions/fix_rust.sh b/lgsm/functions/fix_rust.sh index 854020873..bb70724db 100644 --- a/lgsm/functions/fix_rust.sh +++ b/lgsm/functions/fix_rust.sh @@ -4,7 +4,7 @@ # Website: https://linuxgsm.com # Description: Resolves startup issue with Rust -local commandname="FIX" +local modulename="FIX" local commandaction="Fix" # Fixes: [Raknet] Server Shutting Down (Shutting Down). diff --git a/lgsm/functions/fix_rw.sh b/lgsm/functions/fix_rw.sh index da5fd8286..7cf5a6b12 100644 --- a/lgsm/functions/fix_rw.sh +++ b/lgsm/functions/fix_rw.sh @@ -4,7 +4,7 @@ # Website: https://linuxgsm.com # Description: Resolves startup issue with Rising World -local commandname="FIX" +local modulename="FIX" local commandaction="Fix" export LD_LIBRARY_PATH="${serverfiles}/linux64:${serverfiles}:$LD_LIBRARY_PATH" diff --git a/lgsm/functions/fix_sdtd.sh b/lgsm/functions/fix_sdtd.sh index ca0dc09a1..b04b1fca7 100644 --- a/lgsm/functions/fix_sdtd.sh +++ b/lgsm/functions/fix_sdtd.sh @@ -4,7 +4,7 @@ # Website: https://linuxgsm.com # Description: Resolves startup issue with 7 Days to Die -local commandname="FIX" +local modulename="FIX" local commandaction="Fix" export LD_LIBRARY_PATH="${serverfiles}" diff --git a/lgsm/functions/fix_sfc.sh b/lgsm/functions/fix_sfc.sh index a40250083..ce42211fb 100644 --- a/lgsm/functions/fix_sfc.sh +++ b/lgsm/functions/fix_sfc.sh @@ -4,7 +4,7 @@ # Website: https://linuxgsm.com # Description: Resolves various issues with Source Forts Classic. -local commandname="FIX" +local modulename="FIX" local commandaction="Fix" local function_selfname=$(basename "$(readlink -f "${BASH_SOURCE[0]}")") diff --git a/lgsm/functions/fix_sof2.sh b/lgsm/functions/fix_sof2.sh index 2715f7f8c..3ad769767 100644 --- a/lgsm/functions/fix_sof2.sh +++ b/lgsm/functions/fix_sof2.sh @@ -4,7 +4,7 @@ # Website: https://linuxgsm.com # Description: Resolves startup issue with Soldier of Fortune 2 -local commandname="FIX" +local modulename="FIX" local commandaction="Fix" # Fixes: error while loading shared libraries: libcxa.so.1 diff --git a/lgsm/functions/fix_ss3.sh b/lgsm/functions/fix_ss3.sh index c7277ea9d..3baf5d866 100644 --- a/lgsm/functions/fix_ss3.sh +++ b/lgsm/functions/fix_ss3.sh @@ -4,7 +4,7 @@ # Website: https://linuxgsm.com # Description: Resolves various issues with Serious Sam 3. -local commandname="FIX" +local modulename="FIX" local commandaction="Fix" local function_selfname=$(basename "$(readlink -f "${BASH_SOURCE[0]}")") diff --git a/lgsm/functions/fix_steamcmd.sh b/lgsm/functions/fix_steamcmd.sh index 37bd4f61f..62a3c9fed 100644 --- a/lgsm/functions/fix_steamcmd.sh +++ b/lgsm/functions/fix_steamcmd.sh @@ -4,9 +4,9 @@ # Website: https://linuxgsm.com # Description: Resolves various issues related to SteamCMD. -local commandname="FIX" +local modulename="FIX" local commandaction="Fix" -local function_selfname=$(basename "$(readlink -f "${BASH_SOURCE[0]}")") +function_selfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" # Fixes: [S_API FAIL] SteamAPI_Init() failed; unable to locate a running instance of Steam,or a local steamclient.so. if [ ! -f "${HOME}/.steam/sdk32/steamclient.so" ]; then diff --git a/lgsm/functions/fix_terraria.sh b/lgsm/functions/fix_terraria.sh index e3a595029..8d9af0947 100644 --- a/lgsm/functions/fix_terraria.sh +++ b/lgsm/functions/fix_terraria.sh @@ -4,7 +4,7 @@ # Website: https://linuxgsm.com # Description: Resolves an issue with Terraria. -local commandname="FIX" +local modulename="FIX" local commandaction="Fix" local function_selfname=$(basename "$(readlink -f "${BASH_SOURCE[0]}")") diff --git a/lgsm/functions/fix_tf2.sh b/lgsm/functions/fix_tf2.sh index 5c8cdf6c4..b0e9ce1ce 100644 --- a/lgsm/functions/fix_tf2.sh +++ b/lgsm/functions/fix_tf2.sh @@ -4,7 +4,7 @@ # Website: https://github.com/vectorsigma # Description: Resolves various issues with Team Fortress 2. -local commandname="FIX" +local modulename="FIX" local commandaction="Fix" local function_selfname=$(basename "$(readlink -f "${BASH_SOURCE[0]}")") diff --git a/lgsm/functions/fix_ts3.sh b/lgsm/functions/fix_ts3.sh index 3e3599066..2a921d91d 100644 --- a/lgsm/functions/fix_ts3.sh +++ b/lgsm/functions/fix_ts3.sh @@ -4,7 +4,7 @@ # Website: https://linuxgsm.com # Description: Resolves various issues with Teamspeak 3. -local commandname="FIX" +local modulename="FIX" local commandaction="Fix" local function_selfname=$(basename "$(readlink -f "${BASH_SOURCE[0]}")") diff --git a/lgsm/functions/fix_unt.sh b/lgsm/functions/fix_unt.sh index 3c9c9335a..f040b77c6 100644 --- a/lgsm/functions/fix_unt.sh +++ b/lgsm/functions/fix_unt.sh @@ -4,7 +4,7 @@ # Website: https://linuxgsm.com # Description: Resolves startup issue with Unturned -local commandname="FIX" +local modulename="FIX" local commandaction="Fix" # steamclient.so: cannot open shared object file: No such file or directory diff --git a/lgsm/functions/fix_ut.sh b/lgsm/functions/fix_ut.sh index e479e9442..7c8c12458 100644 --- a/lgsm/functions/fix_ut.sh +++ b/lgsm/functions/fix_ut.sh @@ -4,7 +4,7 @@ # Website: https://linuxgsm.com # Description: Resolves various issues with Unreal Tournament. -local commandname="FIX" +local modulename="FIX" local commandaction="Fix" local function_selfname=$(basename "$(readlink -f "${BASH_SOURCE[0]}")") diff --git a/lgsm/functions/fix_ut2k4.sh b/lgsm/functions/fix_ut2k4.sh index 45ef3dc78..70ed0465d 100644 --- a/lgsm/functions/fix_ut2k4.sh +++ b/lgsm/functions/fix_ut2k4.sh @@ -4,7 +4,7 @@ # Website: https://linuxgsm.com # Description: Resolves various issues with Unreal Tournament 2004. -local commandname="FIX" +local modulename="FIX" local commandaction="Fix" local function_selfname=$(basename "$(readlink -f "${BASH_SOURCE[0]}")") diff --git a/lgsm/functions/fix_ut3.sh b/lgsm/functions/fix_ut3.sh index 31eb85281..3b5537d67 100644 --- a/lgsm/functions/fix_ut3.sh +++ b/lgsm/functions/fix_ut3.sh @@ -4,7 +4,7 @@ # Website: https://linuxgsm.com # Description: Resolves various issues with configs in Unreal Tournament 3. -local commandname="FIX" +local modulename="FIX" local commandaction="Fix" local function_selfname=$(basename "$(readlink -f "${BASH_SOURCE[0]}")") diff --git a/lgsm/functions/fix_zmr.sh b/lgsm/functions/fix_zmr.sh index 5ed1d8beb..25deec45f 100644 --- a/lgsm/functions/fix_zmr.sh +++ b/lgsm/functions/fix_zmr.sh @@ -4,7 +4,7 @@ # Website: https://linuxgsm.com # Description: Resolves various issues with Zombie Master: Reborn. -local commandname="FIX" +local modulename="FIX" local commandaction="Fix" local function_selfname=$(basename "$(readlink -f "${BASH_SOURCE[0]}")") diff --git a/lgsm/functions/install_complete.sh b/lgsm/functions/install_complete.sh index a747438a2..70f4e5345 100644 --- a/lgsm/functions/install_complete.sh +++ b/lgsm/functions/install_complete.sh @@ -4,7 +4,7 @@ # Website: https://linuxgsm.com # Description: Prints installation completion message and hints. -local commandname="INSTALL" +local modulename="INSTALL" local commandaction="Install" local function_selfname=$(basename "$(readlink -f "${BASH_SOURCE[0]}")") diff --git a/lgsm/functions/install_config.sh b/lgsm/functions/install_config.sh index 92451b5d9..77e9433ea 100644 --- a/lgsm/functions/install_config.sh +++ b/lgsm/functions/install_config.sh @@ -4,7 +4,7 @@ # Website: https://linuxgsm.com # Description: Creates default server configs. -local commandname="INSTALL" +local modulename="INSTALL" local commandaction="Install" local function_selfname=$(basename "$(readlink -f "${BASH_SOURCE[0]}")") diff --git a/lgsm/functions/install_dst_token.sh b/lgsm/functions/install_dst_token.sh index 869adde71..247280a56 100644 --- a/lgsm/functions/install_dst_token.sh +++ b/lgsm/functions/install_dst_token.sh @@ -4,7 +4,7 @@ # Website: https://linuxgsm.com # Description: Configures Don't Starve Together cluster with given token. -local commandname="INSTALL" +local modulename="INSTALL" local commandaction="Install" local function_selfname=$(basename "$(readlink -f "${BASH_SOURCE[0]}")") diff --git a/lgsm/functions/install_factorio_save.sh b/lgsm/functions/install_factorio_save.sh index fd9e634a1..5abdc4069 100644 --- a/lgsm/functions/install_factorio_save.sh +++ b/lgsm/functions/install_factorio_save.sh @@ -4,7 +4,7 @@ # Website: https://linuxgsm.com # Description: Creates the initial save file for Factorio -local commandname="INSTALL" +local modulename="INSTALL" local commandaction="Install" echo -e "" diff --git a/lgsm/functions/install_gslt.sh b/lgsm/functions/install_gslt.sh index ddb0ca291..3162f669c 100644 --- a/lgsm/functions/install_gslt.sh +++ b/lgsm/functions/install_gslt.sh @@ -4,7 +4,7 @@ # Website: https://linuxgsm.com # Description: Configures GSLT. -local commandname="INSTALL" +local modulename="INSTALL" local commandaction="Install" local function_selfname=$(basename "$(readlink -f "${BASH_SOURCE[0]}")") diff --git a/lgsm/functions/install_header.sh b/lgsm/functions/install_header.sh index 1a0c9dc29..bd2e4524b 100644 --- a/lgsm/functions/install_header.sh +++ b/lgsm/functions/install_header.sh @@ -4,7 +4,7 @@ # Website: https://linuxgsm.com # Description: Prints installation header. -local commandname="INSTALL" +local modulename="INSTALL" local commandaction="Install" local function_selfname=$(basename "$(readlink -f "${BASH_SOURCE[0]}")") diff --git a/lgsm/functions/install_logs.sh b/lgsm/functions/install_logs.sh index 1a00bac39..e33b2a6af 100644 --- a/lgsm/functions/install_logs.sh +++ b/lgsm/functions/install_logs.sh @@ -4,7 +4,7 @@ # Website: https://linuxgsm.com # Description: Creates log directories. -local commandname="INSTALL" +local modulename="INSTALL" local commandaction="Install" local function_selfname=$(basename "$(readlink -f "${BASH_SOURCE[0]}")") diff --git a/lgsm/functions/install_mta_resources.sh b/lgsm/functions/install_mta_resources.sh index 6d7f14bd1..fb7bb012b 100644 --- a/lgsm/functions/install_mta_resources.sh +++ b/lgsm/functions/install_mta_resources.sh @@ -5,7 +5,7 @@ # Website: https://linuxgsm.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 modulename="INSTALL" local commandaction="Install" local function_selfname=$(basename "$(readlink -f "${BASH_SOURCE[0]}")") diff --git a/lgsm/functions/install_retry.sh b/lgsm/functions/install_retry.sh index 2698b150c..15cbf938e 100644 --- a/lgsm/functions/install_retry.sh +++ b/lgsm/functions/install_retry.sh @@ -4,7 +4,7 @@ # Website: https://linuxgsm.com # Description: Asks for installation retry after failure. -local commandname="INSTALL" +local modulename="INSTALL" local commandaction="Install" local function_selfname=$(basename "$(readlink -f "${BASH_SOURCE[0]}")") diff --git a/lgsm/functions/install_server_dir.sh b/lgsm/functions/install_server_dir.sh index 894ae060d..006264a06 100644 --- a/lgsm/functions/install_server_dir.sh +++ b/lgsm/functions/install_server_dir.sh @@ -4,7 +4,7 @@ # Website: https://linuxgsm.com # Description: Creates the server directory. -local commandname="INSTALL" +local modulename="INSTALL" local commandaction="Install" local function_selfname=$(basename "$(readlink -f "${BASH_SOURCE[0]}")") diff --git a/lgsm/functions/install_server_files.sh b/lgsm/functions/install_server_files.sh index b9069db53..f0ce44d7c 100644 --- a/lgsm/functions/install_server_files.sh +++ b/lgsm/functions/install_server_files.sh @@ -4,7 +4,7 @@ # Website: https://linuxgsm.com # Description: Installs server files. -local commandname="INSTALL" +local modulename="INSTALL" local commandaction="Install" local function_selfname=$(basename "$(readlink -f "${BASH_SOURCE[0]}")") diff --git a/lgsm/functions/install_squad_license.sh b/lgsm/functions/install_squad_license.sh index 0f1528e07..cd8ba87b6 100644 --- a/lgsm/functions/install_squad_license.sh +++ b/lgsm/functions/install_squad_license.sh @@ -4,7 +4,7 @@ # Website: https://linuxgsm.com # Description: Configures the Squad server's license. -local commandname="INSTALL" +local modulename="INSTALL" local commandaction="Install" local function_selfname=$(basename "$(readlink -f "${BASH_SOURCE[0]}")") diff --git a/lgsm/functions/install_stats.sh b/lgsm/functions/install_stats.sh index 35a6f608f..4a00edd49 100644 --- a/lgsm/functions/install_stats.sh +++ b/lgsm/functions/install_stats.sh @@ -4,7 +4,7 @@ # Website: https://linuxgsm.com # Description: Enabled LinuxGSM Stats. -local commandname="INSTALL" +local modulename="INSTALL" local commandaction="Install" local function_selfname=$(basename "$(readlink -f "${BASH_SOURCE[0]}")") diff --git a/lgsm/functions/install_steamcmd.sh b/lgsm/functions/install_steamcmd.sh index e56c9b8aa..9a2415079 100644 --- a/lgsm/functions/install_steamcmd.sh +++ b/lgsm/functions/install_steamcmd.sh @@ -4,7 +4,7 @@ # Website: https://linuxgsm.com # Description: Downloads SteamCMD on install. -local commandname="INSTALL" +local modulename="INSTALL" local commandaction="Install" echo -e "" diff --git a/lgsm/functions/install_ts3db.sh b/lgsm/functions/install_ts3db.sh index 09e16324e..cf8831dd3 100644 --- a/lgsm/functions/install_ts3db.sh +++ b/lgsm/functions/install_ts3db.sh @@ -5,7 +5,7 @@ # Website: https://linuxgsm.com # Description: Installs the database server MariaDB for TeamSpeak 3. -local commandname="INSTALL" +local modulename="INSTALL" local commandaction="Install" local function_selfname=$(basename "$(readlink -f "${BASH_SOURCE[0]}")") diff --git a/lgsm/functions/install_ut2k4_key.sh b/lgsm/functions/install_ut2k4_key.sh index c8d18692e..c5eff82e6 100644 --- a/lgsm/functions/install_ut2k4_key.sh +++ b/lgsm/functions/install_ut2k4_key.sh @@ -4,7 +4,7 @@ # Website: https://linuxgsm.com # Description: Activates ut2k4 server with given key. -local commandname="INSTALL" +local modulename="INSTALL" local commandaction="Install" local function_selfname=$(basename "$(readlink -f "${BASH_SOURCE[0]}")") diff --git a/lgsm/functions/logs.sh b/lgsm/functions/logs.sh index 04f5010e9..199295d46 100644 --- a/lgsm/functions/logs.sh +++ b/lgsm/functions/logs.sh @@ -5,7 +5,7 @@ # Website: https://linuxgsm.com # Description: Acts as a log rotator, removing old logs. -local commandname="LOGS" +local modulename="LOGS" local commandaction="Log-Manager" # Check if logfile variable and file exist, create logfile if it doesn't exist. diff --git a/lgsm/functions/mods_core.sh b/lgsm/functions/mods_core.sh index 942012e46..083b91818 100644 --- a/lgsm/functions/mods_core.sh +++ b/lgsm/functions/mods_core.sh @@ -5,7 +5,7 @@ # Website: https://linuxgsm.com # Description: Core functions for mods list/install/update/remove -local commandname="MODS" +local modulename="MODS" local commandaction="Mods" local function_selfname=$(basename "$(readlink -f "${BASH_SOURCE[0]}")") diff --git a/lgsm/functions/mods_list.sh b/lgsm/functions/mods_list.sh index 67a57463c..8037f1eed 100644 --- a/lgsm/functions/mods_list.sh +++ b/lgsm/functions/mods_list.sh @@ -8,7 +8,7 @@ # Usage: Then add this array to the mods_global_array. # Usage: If needed, you can scrape the download URL first. -local commandname="MODS" +local modulename="MODS" local commandaction="List Mods" local function_selfname=$(basename "$(readlink -f "${BASH_SOURCE[0]}")") diff --git a/lgsm/functions/update_factorio.sh b/lgsm/functions/update_factorio.sh index 584fec4ae..e5a3a4397 100644 --- a/lgsm/functions/update_factorio.sh +++ b/lgsm/functions/update_factorio.sh @@ -4,7 +4,7 @@ # Website: https://linuxgsm.com # Description: Handles updating of Factorio servers. -local commandname="UPDATE" +local modulename="UPDATE" local commandaction="Update" local function_selfname=$(basename "$(readlink -f "${BASH_SOURCE[0]}")") diff --git a/lgsm/functions/update_minecraft.sh b/lgsm/functions/update_minecraft.sh index 89cb7e024..706aa7832 100644 --- a/lgsm/functions/update_minecraft.sh +++ b/lgsm/functions/update_minecraft.sh @@ -4,7 +4,7 @@ # Website: https://linuxgsm.com # Description: Handles updating of Minecraft servers. -local commandname="UPDATE" +local modulename="UPDATE" local commandaction="Update" local function_selfname=$(basename "$(readlink -f "${BASH_SOURCE[0]}")") diff --git a/lgsm/functions/update_minecraft_bedrock.sh b/lgsm/functions/update_minecraft_bedrock.sh index bf4b6f5d1..00989d52c 100644 --- a/lgsm/functions/update_minecraft_bedrock.sh +++ b/lgsm/functions/update_minecraft_bedrock.sh @@ -4,7 +4,7 @@ # Website: https://linuxgsm.com # Description: Handles updating of Minecraft Bedrock servers. -local commandname="UPDATE" +local modulename="UPDATE" local commandaction="Update" local function_selfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" diff --git a/lgsm/functions/update_mta.sh b/lgsm/functions/update_mta.sh index 879ca1409..373b3e823 100644 --- a/lgsm/functions/update_mta.sh +++ b/lgsm/functions/update_mta.sh @@ -4,7 +4,7 @@ # Website: https://linuxgsm.com # Description: Handles updating of Multi Theft Auto servers. -local commandname="UPDATE" +local modulename="UPDATE" local commandaction="Update" local function_selfname=$(basename "$(readlink -f "${BASH_SOURCE[0]}")") diff --git a/lgsm/functions/update_mumble.sh b/lgsm/functions/update_mumble.sh index 0f33c1900..c17bd8036 100644 --- a/lgsm/functions/update_mumble.sh +++ b/lgsm/functions/update_mumble.sh @@ -4,7 +4,7 @@ # Website: https://linuxgsm.com # Description: Handles updating of Mumble servers. -local commandname="UPDATE" +local modulename="UPDATE" local commandaction="Update" local function_selfname=$(basename "$(readlink -f "${BASH_SOURCE[0]}")") diff --git a/lgsm/functions/update_steamcmd.sh b/lgsm/functions/update_steamcmd.sh index fcb289485..c55237c2b 100644 --- a/lgsm/functions/update_steamcmd.sh +++ b/lgsm/functions/update_steamcmd.sh @@ -4,7 +4,7 @@ # Website: https://linuxgsm.com # Description: Handles updating using SteamCMD. -local commandname="UPDATE" +local modulename="UPDATE" local commandaction="Update" local function_selfname=$(basename "$(readlink -f "${BASH_SOURCE[0]}")") diff --git a/lgsm/functions/update_ts3.sh b/lgsm/functions/update_ts3.sh index 798137311..893d34205 100644 --- a/lgsm/functions/update_ts3.sh +++ b/lgsm/functions/update_ts3.sh @@ -4,7 +4,7 @@ # Website: https://linuxgsm.com # Description: Handles updating of Teamspeak 3 servers. -local commandname="UPDATE" +local modulename="UPDATE" local commandaction="Update" local function_selfname=$(basename "$(readlink -f "${BASH_SOURCE[0]}")") From 3a6f7f903485e843dff7a3210fb77f999fbcdea0 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Tue, 10 Mar 2020 21:59:11 +0000 Subject: [PATCH 291/534] feat: rm command best practices (#2729) --- lgsm/functions/alert.sh | 2 +- lgsm/functions/command_backup.sh | 6 ++-- lgsm/functions/command_debug.sh | 2 +- lgsm/functions/command_dev_debug.sh | 2 +- lgsm/functions/command_dev_detect_deps.sh | 32 +++++++++++----------- lgsm/functions/command_dev_detect_glibc.sh | 6 ++-- lgsm/functions/command_dev_detect_ldd.sh | 4 +-- lgsm/functions/command_fastdl.sh | 10 +++---- lgsm/functions/command_mods_remove.sh | 4 +-- lgsm/functions/command_postdetails.sh | 2 +- lgsm/functions/command_start.sh | 2 +- lgsm/functions/command_stop.sh | 2 +- lgsm/functions/command_update_linuxgsm.sh | 6 ++-- lgsm/functions/compress_unreal2_maps.sh | 2 +- lgsm/functions/compress_ut99_maps.sh | 2 +- lgsm/functions/core_dl.sh | 2 +- lgsm/functions/install_server_files.sh | 2 +- lgsm/functions/mods_core.sh | 4 +-- lgsm/functions/update_steamcmd.sh | 2 +- tests/tests_defaultcfg/tests_defaultcfg.sh | 6 ++-- tests/tests_fctrserver.sh | 2 +- tests/tests_jc2server.sh | 4 +-- tests/tests_mcserver.sh | 2 +- tests/tests_ts3server.sh | 2 +- 24 files changed, 55 insertions(+), 55 deletions(-) diff --git a/lgsm/functions/alert.sh b/lgsm/functions/alert.sh index db5fdbc79..d09f9eb93 100644 --- a/lgsm/functions/alert.sh +++ b/lgsm/functions/alert.sh @@ -12,7 +12,7 @@ fn_alert_log(){ info_config.sh info_messages.sh if [ -f "${alertlog}" ]; then - rm "${alertlog}" + rm -f "${alertlog:?}" fi { diff --git a/lgsm/functions/command_backup.sh b/lgsm/functions/command_backup.sh index c1da544e2..46953e1b3 100644 --- a/lgsm/functions/command_backup.sh +++ b/lgsm/functions/command_backup.sh @@ -17,12 +17,12 @@ fn_backup_trap(){ echo -en "backup ${backupname}.tar.gz..." fn_print_canceled_eol_nl fn_script_log_info "Backup ${backupname}.tar.gz: CANCELED" - rm -f "${backupdir}/${backupname}.tar.gz" | tee -a "${lgsmlog}" + rm -f "${backupdir:?}/${backupname}.tar.gz" | tee -a "${lgsmlog}" echo -en "backup ${backupname}.tar.gz..." fn_print_removed_eol_nl fn_script_log_info "Backup ${backupname}.tar.gz: REMOVED" # Remove lock file. - rm -f "${tmpdir}/.backup.lock" + rm -f "${tmpdir:?}/.backup.lock" core_exit.sh } @@ -153,7 +153,7 @@ fn_backup_compression(){ fn_script_log_pass "Backup created: ${backupname}.tar.gz, total size $(du -sh "${backupdir}/${backupname}.tar.gz" | awk '{print $1}')" fi # Remove lock file - rm -f "${tmpdir}/.backup.lock" + rm -f "${tmpdir:?}/.backup.lock" } # Clear old backups according to maxbackups and maxbackupdays variables. diff --git a/lgsm/functions/command_debug.sh b/lgsm/functions/command_debug.sh index e50965882..d80f5e766 100644 --- a/lgsm/functions/command_debug.sh +++ b/lgsm/functions/command_debug.sh @@ -11,7 +11,7 @@ local function_selfname=$(basename "$(readlink -f "${BASH_SOURCE[0]}")") # Trap to remove lockfile on quit. fn_lockfile_trap(){ # Remove lockfile. - rm -f "${rootdir}/${lockselfname}" + rm -f "${rootdir:?}/${lockselfname}" # resets terminal. Servers can sometimes mess up the terminal on exit. reset fn_print_ok_nl "Closing debug" diff --git a/lgsm/functions/command_dev_debug.sh b/lgsm/functions/command_dev_debug.sh index 61f40c808..ba80921c6 100644 --- a/lgsm/functions/command_dev_debug.sh +++ b/lgsm/functions/command_dev_debug.sh @@ -9,7 +9,7 @@ local commandaction="Dev-Debug" local function_selfname=$(basename "$(readlink -f "${BASH_SOURCE[0]}")") if [ -f "${rootdir}/.dev-debug" ]; then - rm "${rootdir}/.dev-debug" + rm "${rootdir:?}/.dev-debug" fn_print_ok_nl "Disabled dev-debug" fn_script_log_info "Disabled dev-debug" else diff --git a/lgsm/functions/command_dev_detect_deps.sh b/lgsm/functions/command_dev_detect_deps.sh index 83476a7bb..b308c3579 100644 --- a/lgsm/functions/command_dev_detect_deps.sh +++ b/lgsm/functions/command_dev_detect_deps.sh @@ -207,21 +207,21 @@ echo -e "Required Librarys" echo -e "=================================" sort "${tmpdir}/.depdetect_readelf" | uniq echo -en "\n" -rm -f "${tmpdir}/.depdetect_centos_line" -rm -f "${tmpdir}/.depdetect_centos_list" -rm -f "${tmpdir}/.depdetect_centos_list_uniq" - -rm -f "${tmpdir}/.depdetect_debian_line" -rm -f "${tmpdir}/.depdetect_debian_list" -rm -f "${tmpdir}/.depdetect_debian_list_uniq" - -rm -f "${tmpdir}/.depdetect_ubuntu_line" -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" +rm -f "${tmpdir:?}/.depdetect_centos_line" +rm -f "${tmpdir:?}/.depdetect_centos_list" +rm -f "${tmpdir:?}/.depdetect_centos_list_uniq" + +rm -f "${tmpdir:?}/.depdetect_debian_line" +rm -f "${tmpdir:?}/.depdetect_debian_list" +rm -f "${tmpdir:?}/.depdetect_debian_list_uniq" + +rm -f "${tmpdir:?}/.depdetect_ubuntu_line" +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" core_exit.sh diff --git a/lgsm/functions/command_dev_detect_glibc.sh b/lgsm/functions/command_dev_detect_glibc.sh index a8b463e2c..add6a05b6 100644 --- a/lgsm/functions/command_dev_detect_glibc.sh +++ b/lgsm/functions/command_dev_detect_glibc.sh @@ -70,8 +70,8 @@ do echo -e "" echo -e "All required GLIBC versions" cat "${tmpdir}/detect_glibc_${glibc_check_var}.tmp" | sort | uniq | sort -r --version-sort - rm "${tmpdir}/detect_glibc_${glibc_check_var}.tmp" - rm "${tmpdir}/detect_glibc_files_${glibc_check_var}.tmp" + rm -f "${tmpdir:?}/detect_glibc_${glibc_check_var}.tmp" + rm -f "${tmpdir:?}/detect_glibc_files_${glibc_check_var}.tmp" else fn_print_information_nl "glibc is not required" fi @@ -84,7 +84,7 @@ echo -e "Final glibc Requirement" echo -e "=================================" if [ -f "${tmpdir}/detect_glibc_highest.tmp" ]; then cat "${tmpdir}/detect_glibc_highest.tmp" | sort | uniq | sort -r --version-sort | head -1 - rm "${tmpdir}/detect_glibc_highest.tmp" + rm -f "${tmpdir:?}/detect_glibc_highest.tmp" else fn_print_information_nl "glibc is not required" fi diff --git a/lgsm/functions/command_dev_detect_ldd.sh b/lgsm/functions/command_dev_detect_ldd.sh index 7f360fe84..f612366bf 100644 --- a/lgsm/functions/command_dev_detect_ldd.sh +++ b/lgsm/functions/command_dev_detect_ldd.sh @@ -55,7 +55,7 @@ echo -e "Not Found" echo -e "=================================" cat "${tmpdir}/detect_ldd_not_found.tmp" -rm "${tmpdir}/detect_ldd.tmp" -rm "${tmpdir}/detect_ldd_not_found.tmp" +rm -f "${tmpdir:?}/detect_ldd.tmp" +rm -f "${tmpdir:?}/detect_ldd_not_found.tmp" core_exit.sh diff --git a/lgsm/functions/command_fastdl.sh b/lgsm/functions/command_fastdl.sh index 54ae7fe94..d6600a7af 100644 --- a/lgsm/functions/command_fastdl.sh +++ b/lgsm/functions/command_fastdl.sh @@ -67,7 +67,7 @@ fn_clear_old_fastdl(){ # Clearing old FastDL. if [ -d "${fastdldir}" ]; then echo -en "clearing existing FastDL directory ${fastdldir}..." - rm -R "${fastdldir:?}" + rm -fR "${fastdldir:?}" exitcode=$? if [ ${exitcode} -ne 0 ]; then fn_print_fail_eol_nl @@ -147,7 +147,7 @@ fn_human_readable_file_size(){ fn_fastdl_preview(){ # Remove any file list. if [ -f "${tmpdir}/fastdl_files_to_compress.txt" ]; then - rm -f "${tmpdir}/fastdl_files_to_compress.txt" + rm -f "${tmpdir:?}/fastdl_files_to_compress.txt" fi echo -e "analysing required files" fn_script_log_info "Analysing required files" @@ -228,7 +228,7 @@ fn_fastdl_preview(){ fi echo -e "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" + rm -f "${tmpdir:?}/fastdl_files_to_compress.txt" if ! fn_prompt_yn "Continue?" Y; then fn_script_log "User exited" core_exit.sh @@ -276,7 +276,7 @@ fn_fastdl_gmod(){ # Clear addons directory in fastdl. echo -en "clearing addons dir from fastdl dir..." fn_sleep_time - rm -R "${fastdldir:?}/addons" + rm -fR "${fastdldir:?}/addons" exitcode=$? if [ ${exitcode} -ne 0 ]; then fn_print_fail_eol_nl @@ -379,7 +379,7 @@ fn_fastdl_gmod_dl_enforcer(){ # Clear old lua file. if [ -f "${luafastdlfullpath}" ]; then echo -en "removing existing download enforcer: ${luafastdlfile}..." - rm "${luafastdlfullpath:?}" + rm -f "${luafastdlfullpath:?}" exitcode=$? if [ ${exitcode} -ne 0 ]; then fn_print_fail_eol_nl diff --git a/lgsm/functions/command_mods_remove.sh b/lgsm/functions/command_mods_remove.sh index 0c869b88b..cec994fea 100644 --- a/lgsm/functions/command_mods_remove.sh +++ b/lgsm/functions/command_mods_remove.sh @@ -68,7 +68,7 @@ while [ "${modfileline}" -le "${modsfilelistsize}" ]; do # If file or directory exists, then remove it. if [ -f "${modinstalldir}/${currentfileremove}" ]||[ -d "${modinstalldir}/${currentfileremove}" ]; then - rm -rf "${modinstalldir:?}/${currentfileremove}" + rm -rf "${modinstalldir:?}/${currentfileremove:?}" ((exitcode=$?)) if [ ${exitcode} -ne 0 ]; then fn_script_log_fatal "Removing ${modinstalldir}/${currentfileremove}" @@ -91,7 +91,7 @@ fn_sleep_time # Remove file list. echo -en "removing ${modcommand}-files.txt..." fn_sleep_time -rm -rf "${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" diff --git a/lgsm/functions/command_postdetails.sh b/lgsm/functions/command_postdetails.sh index 7e5d14355..6bbca3d0a 100644 --- a/lgsm/functions/command_postdetails.sh +++ b/lgsm/functions/command_postdetails.sh @@ -44,7 +44,7 @@ fn_bad_postdetailslog() { # Remove any existing postdetails.log file. if [ -f "${postdetailslog}" ]; then - rm -f "${postdetailslog}" + rm -f "${postdetailslog:?}" fi # Rather than a one-pass sed parser, default to using a temporary directory. diff --git a/lgsm/functions/command_start.sh b/lgsm/functions/command_start.sh index 80ffdd19a..5d440c60c 100644 --- a/lgsm/functions/command_start.sh +++ b/lgsm/functions/command_start.sh @@ -159,7 +159,7 @@ fn_sleep_time fn_print_ok "${servername}" fn_script_log_pass "Started ${servername}" fi - rm "${lgsmlogdir}/.${selfname}-tmux-error.tmp" + rm "${lgsmlogdir:?}/.${selfname}-tmux-error.tmp" echo -en "\n" } diff --git a/lgsm/functions/command_stop.sh b/lgsm/functions/command_stop.sh index 609425595..471be97a5 100644 --- a/lgsm/functions/command_stop.sh +++ b/lgsm/functions/command_stop.sh @@ -242,7 +242,7 @@ info_config.sh fn_stop_pre_check # Remove lockfile. if [ -f "${rootdir}/${lockselfname}" ]; then - rm -f "${rootdir}/${lockselfname}" + rm -f "${rootdir:?}/${lockselfname}" fi if [ -z "${exitbypass}" ]; then diff --git a/lgsm/functions/command_update_linuxgsm.sh b/lgsm/functions/command_update_linuxgsm.sh index c2529f43c..f337ce342 100644 --- a/lgsm/functions/command_update_linuxgsm.sh +++ b/lgsm/functions/command_update_linuxgsm.sh @@ -20,7 +20,7 @@ if [ -z "${legacymode}" ]; then if [ "${config_file_diff}" != "" ]; then fn_print_update_eol_nl fn_script_log_info "checking config _default.cfg: UPDATE" - rm -f "${configdirdefault}/config-lgsm/${gameservername}/_default.cfg" + 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" alert="config" alert.sh @@ -34,7 +34,7 @@ if [ -z "${legacymode}" ]; then if [ "${tmp_script_diff}" != "" ]; then fn_print_update_eol_nl fn_script_log_info "checking linuxgsm.sh: UPDATE" - rm -f "${tmpdir}/linuxgsm.sh" + 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 @@ -87,7 +87,7 @@ if [ -n "${functionsdir}" ]; then fn_print_fail_eol_nl echo -en " removing unknown function ${functionfile}...\c" fn_script_log_fatal "removing unknown function ${functionfile}" - if ! rm -f "${functionfile}"; then + if ! rm -f "${functionfile:?}"; then fn_print_fail_eol_nl core_exit.sh else diff --git a/lgsm/functions/compress_unreal2_maps.sh b/lgsm/functions/compress_unreal2_maps.sh index 3940e8066..bc7a9ffb8 100644 --- a/lgsm/functions/compress_unreal2_maps.sh +++ b/lgsm/functions/compress_unreal2_maps.sh @@ -21,7 +21,7 @@ if ! fn_prompt_yn "Start compression?" Y; then return fi mkdir -pv "${compressedmapsdir}" > /dev/null 2>&1 -rm -rfv "${serverfiles}/Maps/"*.ut2.uz2 +rm -rfv "${serverfiles:?}/Maps/"*.ut2.uz2 cd "${systemdir}" || exit for map in "${serverfiles}/Maps/"*; do ./ucc-bin compress "${map}" --nohomedir diff --git a/lgsm/functions/compress_ut99_maps.sh b/lgsm/functions/compress_ut99_maps.sh index 100740acb..9f24ff9a3 100644 --- a/lgsm/functions/compress_ut99_maps.sh +++ b/lgsm/functions/compress_ut99_maps.sh @@ -21,7 +21,7 @@ if ! fn_prompt_yn "Start compression?" Y; then return fi mkdir -pv "${compressedmapsdir}" > /dev/null 2>&1 -rm -rfv "${serverfiles}/Maps/"*.unr.uz +rm -rfv "${serverfiles:?}/Maps/"*.unr.uz cd "${systemdir}" || exit for map in "${serverfiles}/Maps/"*; do ./ucc-bin compress "${map}" --nohomedir diff --git a/lgsm/functions/core_dl.sh b/lgsm/functions/core_dl.sh index 3874c8f24..9a59d5ab8 100644 --- a/lgsm/functions/core_dl.sh +++ b/lgsm/functions/core_dl.sh @@ -105,7 +105,7 @@ fn_fetch_trap(){ fn_print_canceled_eol_nl fn_script_log_info "Downloading ${local_filename}...CANCELED" fn_sleep_time - rm -f "${local_filedir}/${local_filename}" + rm -f "${local_filedir:?}/${local_filename}" echo -en "downloading ${local_filename}..." fn_print_removed_eol_nl fn_script_log_info "Downloading ${local_filename}...REMOVED" diff --git a/lgsm/functions/install_server_files.sh b/lgsm/functions/install_server_files.sh index f0ce44d7c..2b985569e 100644 --- a/lgsm/functions/install_server_files.sh +++ b/lgsm/functions/install_server_files.sh @@ -94,7 +94,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 "${steamcmddir}" + rm -rf "${steamcmddir:?}" check_steamcmd.sh fi diff --git a/lgsm/functions/mods_core.sh b/lgsm/functions/mods_core.sh index 083b91818..42c19d08d 100644 --- a/lgsm/functions/mods_core.sh +++ b/lgsm/functions/mods_core.sh @@ -440,7 +440,7 @@ fn_mods_create_tmp_dir(){ fn_mods_clear_tmp_dir(){ if [ -d "${modstmpdir}" ]; then echo -en "clearing mod download directory ${modstmpdir}..." - rm -r "${modstmpdir}" + rm -fr "${modstmpdir:?}" exitcode=$? if [ ${exitcode} -ne 0 ]; then fn_print_fail_eol_nl @@ -454,7 +454,7 @@ fn_mods_clear_tmp_dir(){ fi # Clear temp file list as well. if [ -f "${modsdir}/.removedfiles.tmp" ]; then - rm "${modsdir}/.removedfiles.tmp" + rm -f "${modsdir:?}/.removedfiles.tmp" fi } diff --git a/lgsm/functions/update_steamcmd.sh b/lgsm/functions/update_steamcmd.sh index c55237c2b..b1f3b99b2 100644 --- a/lgsm/functions/update_steamcmd.sh +++ b/lgsm/functions/update_steamcmd.sh @@ -156,7 +156,7 @@ fn_appmanifest_check(){ fn_script_log_error "Multiple appmanifest_${appid}.acf files found" fn_print_dots "Removing x${appmanifestfilewc} appmanifest_${appid}.acf files" for appfile in ${appmanifestfile}; do - rm "${appfile}" + rm -f "${appfile:?}" done appmanifestfilewc1="${appmanifestfilewc}" fn_appmanifest_info diff --git a/tests/tests_defaultcfg/tests_defaultcfg.sh b/tests/tests_defaultcfg/tests_defaultcfg.sh index 5e139fb4d..5b9b47f2a 100644 --- a/tests/tests_defaultcfg/tests_defaultcfg.sh +++ b/tests/tests_defaultcfg/tests_defaultcfg.sh @@ -16,7 +16,7 @@ while IFS= read -r -d $'\0' line; do echo "${diffoutput}" echo "" fi - rm defaultcfgtemp.txt + rm -f defaultcfgtemp.txt done echo -e "" @@ -36,7 +36,7 @@ while IFS= read -r -d $'\0' line; do echo "${diffoutput}" echo "" fi - rm defaultcfgtemp.txt + rm -f defaultcfgtemp.txt done echo -e "" @@ -56,5 +56,5 @@ while IFS= read -r -d $'\0' line; do echo "${diffoutput}" echo "" fi - rm defaultcfgtemp.txt + rm -f defaultcfgtemp.txt done diff --git a/tests/tests_fctrserver.sh b/tests/tests_fctrserver.sh index 6561c7ff4..14c111d55 100644 --- a/tests/tests_fctrserver.sh +++ b/tests/tests_fctrserver.sh @@ -1013,6 +1013,6 @@ requiredstatus="OFFLINE" fn_setstatus if [ ! -v TRAVIS ]; then fn_print_info "Tidying up directories." - rm -rfv "${serverfiles}" + rm -rfv "${serverfiles:?}" fi core_exit.sh diff --git a/tests/tests_jc2server.sh b/tests/tests_jc2server.sh index 9478fa638..6887b2d45 100644 --- a/tests/tests_jc2server.sh +++ b/tests/tests_jc2server.sh @@ -829,7 +829,7 @@ echo -e "Command: ./jc2server update" requiredstatus="OFFLINE" fn_setstatus fn_print_info_nl "removed appmanifest_${appid}.acf." -rm --verbose "${serverfiles}/steamapps/appmanifest_${appid}.acf" +rm --verbose "${serverfiles:?}/steamapps/appmanifest_${appid}.acf" ( exec 5>"${TRAVIS_BUILD_DIR}/dev-debug.log" BASH_XTRACEFD="5" @@ -1174,6 +1174,6 @@ requiredstatus="OFFLINE" fn_setstatus if [ ! -v TRAVIS ]; then fn_print_info "Tidying up directories." - rm -rfv "${serverfiles}" + rm -rfv "${serverfiles:?}" fi core_exit.sh diff --git a/tests/tests_mcserver.sh b/tests/tests_mcserver.sh index 8224c5e8c..4d6378d97 100644 --- a/tests/tests_mcserver.sh +++ b/tests/tests_mcserver.sh @@ -1060,6 +1060,6 @@ requiredstatus="OFFLINE" fn_setstatus if [ ! -v TRAVIS ]; then fn_print_info "Tidying up directories." - rm -rfv "${serverfiles}" + rm -rfv "${serverfiles:?}" fi core_exit.sh diff --git a/tests/tests_ts3server.sh b/tests/tests_ts3server.sh index 831b1f207..cd56c456d 100644 --- a/tests/tests_ts3server.sh +++ b/tests/tests_ts3server.sh @@ -1013,6 +1013,6 @@ requiredstatus="OFFLINE" fn_setstatus if [ ! -v TRAVIS ]; then fn_print_info "Tidying up directories." - rm -rfv "${serverfiles}" + rm -rfv "${serverfiles:?}" fi core_exit.sh From abaa614cad3d1e57d6c80fb1ac3496d032b69802 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Tue, 10 Mar 2020 22:02:31 +0000 Subject: [PATCH 292/534] feat: general code standards improvements (#2730) * add missing space in ; then * standardise command if * standardised True if the length of "STRING" is non-zero. * changed -e to -f --- .../config-lgsm/rustserver/_default.cfg | 4 +- lgsm/functions/alert_discord.sh | 2 +- lgsm/functions/alert_email.sh | 2 +- lgsm/functions/alert_ifttt.sh | 2 +- lgsm/functions/alert_pushbullet.sh | 2 +- lgsm/functions/alert_pushover.sh | 2 +- lgsm/functions/alert_telegram.sh | 2 +- lgsm/functions/check.sh | 2 +- lgsm/functions/check_config.sh | 2 +- lgsm/functions/check_deps.sh | 8 +- lgsm/functions/check_ip.sh | 2 +- lgsm/functions/check_logs.sh | 2 +- lgsm/functions/check_permissions.sh | 2 +- lgsm/functions/check_system_requirements.sh | 2 +- lgsm/functions/check_tmuxception.sh | 4 +- lgsm/functions/command_backup.sh | 2 +- lgsm/functions/command_debug.sh | 10 +- lgsm/functions/command_dev_detect_glibc.sh | 2 +- lgsm/functions/command_fastdl.sh | 2 +- lgsm/functions/command_install.sh | 2 +- lgsm/functions/command_mods_install.sh | 2 +- lgsm/functions/command_mods_update.sh | 2 +- lgsm/functions/command_monitor.sh | 8 +- lgsm/functions/command_postdetails.sh | 2 +- lgsm/functions/command_start.sh | 6 +- lgsm/functions/command_stop.sh | 10 +- lgsm/functions/command_update_linuxgsm.sh | 2 +- lgsm/functions/command_wipe.sh | 18 +-- lgsm/functions/core_dl.sh | 2 +- lgsm/functions/core_exit.sh | 4 +- lgsm/functions/core_getopt.sh | 4 +- lgsm/functions/core_messages.sh | 49 ++++---- lgsm/functions/fix.sh | 2 +- lgsm/functions/info_distro.sh | 24 ++-- lgsm/functions/info_messages.sh | 112 +++++++++--------- lgsm/functions/info_stats.sh | 2 +- lgsm/functions/install_logs.sh | 6 +- lgsm/functions/install_server_files.sh | 2 +- lgsm/functions/logs.sh | 8 +- lgsm/functions/mods_core.sh | 4 +- linuxgsm.sh | 4 +- tests/tests_fctrserver.sh | 4 +- tests/tests_jc2server.sh | 4 +- tests/tests_mcserver.sh | 4 +- tests/tests_ts3server.sh | 4 +- 45 files changed, 174 insertions(+), 173 deletions(-) diff --git a/lgsm/config-default/config-lgsm/rustserver/_default.cfg b/lgsm/config-default/config-lgsm/rustserver/_default.cfg index 05d97a267..cf622175c 100644 --- a/lgsm/config-default/config-lgsm/rustserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/rustserver/_default.cfg @@ -28,14 +28,14 @@ tickrate="30" # default 30; range : 15 to 100 ## Server Start Command | https://docs.linuxgsm.com/configuration/start-parameters#additional-parameters fn_parms(){ # Specific to Rust -if [ -n "${seed}" ]; then +if [ "${seed}" ]; then # If set, then add to start parms conditionalseed="+server.seed ${seed}" else # Keep randomness of the number if not set conditionalseed="" fi -if [ -n "${salt}" ]; then +if [ "${salt}" ]; then # If set, then add to start parms conditionalsalt="+server.salt ${salt}" else diff --git a/lgsm/functions/alert_discord.sh b/lgsm/functions/alert_discord.sh index 6f5793de1..c088df281 100644 --- a/lgsm/functions/alert_discord.sh +++ b/lgsm/functions/alert_discord.sh @@ -57,7 +57,7 @@ fn_print_dots "Sending Discord alert" discordsend=$(curl -sSL -H "Content-Type: application/json" -X POST -d "$(echo -n "$json" | jq -c .)" "${discordwebhook}") -if [ -n "${discordsend}" ]; then +if [ "${discordsend}" ]; then fn_print_fail_nl "Sending Discord alert: ${discordsend}" fn_script_log_fatal "Sending Discord alert: ${discordsend}" else diff --git a/lgsm/functions/alert_email.sh b/lgsm/functions/alert_email.sh index 727275b35..43eddfa58 100644 --- a/lgsm/functions/alert_email.sh +++ b/lgsm/functions/alert_email.sh @@ -11,7 +11,7 @@ local function_selfname=$(basename "$(readlink -f "${BASH_SOURCE[0]}")") fn_print_dots "Sending Email alert: ${email}" fn_sleep_time -if [ -n "${emailfrom}" ]; then +if [ "${emailfrom}" ]; then mail -s "${alertsubject}" -r "${emailfrom}" "${email}" < "${alertlog}" else mail -s "${alertsubject}" "${email}" < "${alertlog}" diff --git a/lgsm/functions/alert_ifttt.sh b/lgsm/functions/alert_ifttt.sh index b77fa7c50..26a50114f 100644 --- a/lgsm/functions/alert_ifttt.sh +++ b/lgsm/functions/alert_ifttt.sh @@ -20,7 +20,7 @@ EOF fn_print_dots "Sending IFTTT alert" iftttsend=$(curl -sSL -H "Content-Type: application/json" -X POST -d """${json}""" "https://maker.ifttt.com/trigger/${iftttevent}/with/key/${ifttttoken}" | grep "Bad Request") -if [ -n "${iftttsend}" ]; then +if [ "${iftttsend}" ]; then fn_print_fail_nl "Sending IFTTT alert: ${pushbulletsend}" fn_script_log_fatal "Sending IFTTT alert: ${pushbulletsend}" else diff --git a/lgsm/functions/alert_pushbullet.sh b/lgsm/functions/alert_pushbullet.sh index a9b409f10..2a0947564 100644 --- a/lgsm/functions/alert_pushbullet.sh +++ b/lgsm/functions/alert_pushbullet.sh @@ -21,7 +21,7 @@ EOF fn_print_dots "Sending Pushbullet alert" pushbulletsend=$(curl -sSL -u """${pushbullettoken}"":" -H "Content-Type: application/json" -X POST -d """${json}""" "https://api.pushbullet.com/v2/pushes" | grep "error_code") -if [ -n "${pushbulletsend}" ]; then +if [ "${pushbulletsend}" ]; then fn_print_fail_nl "Sending Pushbullet alert: ${pushbulletsend}" fn_script_log_fatal "Sending Pushbullet alert: ${pushbulletsend}" else diff --git a/lgsm/functions/alert_pushover.sh b/lgsm/functions/alert_pushover.sh index 0db5d5a0c..a57a5f4b5 100644 --- a/lgsm/functions/alert_pushover.sh +++ b/lgsm/functions/alert_pushover.sh @@ -25,7 +25,7 @@ fi pushoversend=$(curl -sS -F token="${pushovertoken}" -F user="${pushoveruserkey}" -F html="1" -F sound="${alertsound}" -F priority="${alertpriority}" -F title="${alertemoji} ${alertsubject} ${alertemoji}" -F message=" Message
${alertbody}

Game
${gamename}

Server name
${servername}

Hostname
${HOSTNAME}

Server IP
${alertip}:${port}

More info
${alerturl}" "https://api.pushover.net/1/messages.json" | grep errors) -if [ -n "${pushoversend}" ]; then +if [ "${pushoversend}" ]; then fn_print_fail_nl "Sending Pushover alert: ${pushoversend}" fn_script_log_fatal "Sending Pushover alert: ${pushoversend}" else diff --git a/lgsm/functions/alert_telegram.sh b/lgsm/functions/alert_telegram.sh index 21436c340..6d7403660 100644 --- a/lgsm/functions/alert_telegram.sh +++ b/lgsm/functions/alert_telegram.sh @@ -20,7 +20,7 @@ EOF fn_print_dots "Sending Telegram alert" telegramsend=$(curl -sSL -H "Content-Type: application/json" -X POST -d """${json}""" "https://api.telegram.org/bot${telegramtoken}/sendMessage" "${curlcustomstring}" | grep "error_code") -if [ -n "${telegramsend}" ]; then +if [ "${telegramsend}" ]; then fn_print_fail_nl "Sending Telegram alert: ${telegramsend}" fn_script_log_fatal "Sending Telegram alert: ${telegramsend}" else diff --git a/lgsm/functions/check.sh b/lgsm/functions/check.sh index 838441517..18d0fa262 100644 --- a/lgsm/functions/check.sh +++ b/lgsm/functions/check.sh @@ -82,7 +82,7 @@ local allowed_commands_array=( update_steamcmd.sh command_debug.sh command_start for allowed_command in "${allowed_commands_array[@]}" do if [ "${allowed_command}" == "${function_selfname}" ]; then - if [ -n "${appid}" ]; then + if [ "${appid}" ]; then check_steamcmd.sh fi fi diff --git a/lgsm/functions/check_config.sh b/lgsm/functions/check_config.sh index 01da2ab24..a4aa11997 100644 --- a/lgsm/functions/check_config.sh +++ b/lgsm/functions/check_config.sh @@ -7,7 +7,7 @@ local modulename="CHECK" local function_selfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" -if [ ! -e "${servercfgfullpath}" ]; then +if [ ! -f "${servercfgfullpath}" ]; then if [ "${shortname}" != "hw" ]&&[ "${shortname}" != "ut3" ]&&[ "${shortname}" != "kf2" ]; then fn_print_dots "" fn_print_warn_nl "Configuration file missing!" diff --git a/lgsm/functions/check_deps.sh b/lgsm/functions/check_deps.sh index fff32f9ff..79f6f76c4 100644 --- a/lgsm/functions/check_deps.sh +++ b/lgsm/functions/check_deps.sh @@ -79,7 +79,7 @@ fn_install_mono_repo(){ echo -e " https://www.mono-project.com/download/stable/#download-lin" monoautoinstall="1" fi - if [ "${monoautoinstall}" != "1" ];then + if [ "${monoautoinstall}" != "1" ]; then if [ $? != 0 ]; then fn_print_failure_nl "Unable to install Mono repository." fn_script_log_fatal "Unable to installMono repository." @@ -183,7 +183,7 @@ if [ "${javacheck}" == "1" ]; then fn_sleep_time fi # Define required dependencies for SteamCMD. - if [ -n "${appid}" ]; then + if [ "${appid}" ]; then if [ "${deptocheck}" == "glibc.i686" ]||[ "${deptocheck}" == "libstdc++64.i686" ]||[ "${deptocheck}" == "lib32gcc1" ]||[ "${deptocheck}" == "lib32stdc++6" ]; then steamcmdfail=1 fi @@ -225,10 +225,10 @@ fn_found_missing_deps(){ fn_print_warning_nl "Missing dependencies: ${red}${array_deps_missing[@]}${default}" fn_script_log_warn "Missing dependencies: ${array_deps_missing[@]}" fn_sleep_time - if [ -n "${monostatus}" ]; then + if [ "${monostatus}" ]; then fn_install_mono_repo fi - if [ -n "${jqstatus}" ]; then + if [ "${jqstatus}" ]; then fn_print_warning_nl "jq is not available in the ${distroname} repository." echo -e " * https://docs.linuxgsm.com/requirements/jq" fi diff --git a/lgsm/functions/check_ip.sh b/lgsm/functions/check_ip.sh index 727c6e125..b421639d3 100644 --- a/lgsm/functions/check_ip.sh +++ b/lgsm/functions/check_ip.sh @@ -76,7 +76,7 @@ if [ "${travistest}" != "1" ]; then fn_script_log_fatal "IP address not set in game config." fn_script_log_fatal "Specify the IP you want to bind within: ${servercfgfullpath}." fn_script_log_fatal "https://linuxgsm.com/network-interfaces\n" - if [ "${function_selfname}" != "command_details.sh" ];then + if [ "${function_selfname}" != "command_details.sh" ]; then core_exit.sh fi else diff --git a/lgsm/functions/check_logs.sh b/lgsm/functions/check_logs.sh index 883337756..9c4b31495 100644 --- a/lgsm/functions/check_logs.sh +++ b/lgsm/functions/check_logs.sh @@ -21,6 +21,6 @@ fi # Create gamelogdir. # If variable exists gamelogdir exists and log/server does not. -if [ -n "${gamelogdir}" ]&&[ -d "${gamelogdir}" ]&&[ ! -d "${logdir}/server" ]; then +if [ "${gamelogdir}" ]&&[ -d "${gamelogdir}" ]&&[ ! -d "${logdir}/server" ]; then fn_check_logs fi diff --git a/lgsm/functions/check_permissions.sh b/lgsm/functions/check_permissions.sh index 1e81735b4..67e586c45 100644 --- a/lgsm/functions/check_permissions.sh +++ b/lgsm/functions/check_permissions.sh @@ -72,7 +72,7 @@ fn_check_permissions(){ fi # Check rootdir permissions. - if [ -n "${rootdir}" ]; then + if [ "${rootdir}" ]; then # Get permission numbers on directory under the form 775. rootdirperm=$(stat -c %a "${rootdir}") # Grab the first and second digit for user and group permission. diff --git a/lgsm/functions/check_system_requirements.sh b/lgsm/functions/check_system_requirements.sh index 8b0b5a92b..139b2b6af 100644 --- a/lgsm/functions/check_system_requirements.sh +++ b/lgsm/functions/check_system_requirements.sh @@ -42,7 +42,7 @@ elif [ "${shortname}" == "st" ]; then fi # If the game or engine has a minimum RAM Requirement, compare it to system's available RAM. -if [ -n "${ramrequirementmb}" ]; then +if [ "${ramrequirementmb}" ]; then if [ "${physmemtotalmb}" -lt "${ramrequirementmb}" ]; then fn_print_dots "Check RAM" # Warn the user. diff --git a/lgsm/functions/check_tmuxception.sh b/lgsm/functions/check_tmuxception.sh index 9abf3bb1d..06cb40de1 100644 --- a/lgsm/functions/check_tmuxception.sh +++ b/lgsm/functions/check_tmuxception.sh @@ -8,7 +8,7 @@ local modulename="CHECK" fn_check_is_in_tmux(){ - if [ -n "${TMUX}" ]; then + if [ "${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." @@ -19,7 +19,7 @@ fn_check_is_in_tmux(){ } fn_check_is_in_screen(){ - if [ -n "${STY}" ]; then + if [ "${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_backup.sh b/lgsm/functions/command_backup.sh index 46953e1b3..d7871a38e 100644 --- a/lgsm/functions/command_backup.sh +++ b/lgsm/functions/command_backup.sh @@ -159,7 +159,7 @@ fn_backup_compression(){ # Clear old backups according to maxbackups and maxbackupdays variables. fn_backup_prune(){ # Clear if backup variables are set. - if [ -n "${maxbackups}" ]&&[ -n "${maxbackupdays}" ]; then + if [ "${maxbackups}" ]&&[ -n "${maxbackupdays}" ]; then # How many backups there are. info_distro.sh # How many backups exceed maxbackups. diff --git a/lgsm/functions/command_debug.sh b/lgsm/functions/command_debug.sh index d80f5e766..f3e2a0cc1 100644 --- a/lgsm/functions/command_debug.sh +++ b/lgsm/functions/command_debug.sh @@ -37,7 +37,7 @@ fn_print_header echo -e "${lightblue}Free Disk:\t\t${default}${availspace}" } | column -s $'\t' -t # glibc required. -if [ -n "${glibc}" ]; then +if [ "${glibc}" ]; then if [ "${glibc}" == "null" ]; then # Glibc is not required. : @@ -57,21 +57,21 @@ else echo -e "${lightblue}Server IP:\t${default}${ip}:${port}" fi # External server IP. -if [ -n "${extip}" ]; then +if [ "${extip}" ]; then if [ "${ip}" != "${extip}" ]; then echo -e "${lightblue}Internet IP:\t${default}${extip}:${port}" fi fi # Listed on Master Server. -if [ "${displaymasterserver}" ];then - if [ "${displaymasterserver}" == "true" ];then +if [ "${displaymasterserver}" ]; then + if [ "${displaymasterserver}" == "true" ]; then echo -e "${lightblue}Master Server:\t${green}${displaymasterserver}${default}" else echo -e "${lightblue}Master Server:\t${red}${displaymasterserver}${default}" fi fi # Server password. -if [ -n "${serverpassword}" ]; then +if [ "${serverpassword}" ]; then echo -e "${lightblue}Server password:\t${default}${serverpassword}" fi echo -e "${lightblue}Start parameters:${default}" diff --git a/lgsm/functions/command_dev_detect_glibc.sh b/lgsm/functions/command_dev_detect_glibc.sh index add6a05b6..0ffc7e0a7 100644 --- a/lgsm/functions/command_dev_detect_glibc.sh +++ b/lgsm/functions/command_dev_detect_glibc.sh @@ -13,7 +13,7 @@ echo -e "=================================" echo -e "glibc Requirements Checker" echo -e "=================================" -if [ -z "$(command -v objdump)" ]; then +if [ ! "$(command -v objdump)" ]; then fn_print_failure_nl "objdump is missing" fn_script_log_fatal "objdump is missing" core_exit.sh diff --git a/lgsm/functions/command_fastdl.sh b/lgsm/functions/command_fastdl.sh index d6600a7af..12a33e8e1 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 2>/dev/null)" ]; then +if [ ! "$(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_install.sh b/lgsm/functions/command_install.sh index e8d6923de..caab4ee89 100644 --- a/lgsm/functions/command_install.sh +++ b/lgsm/functions/command_install.sh @@ -25,7 +25,7 @@ else elif [ -z "${appid}" ]; then installer=1 install_server_files.sh - elif [ -n "${appid}" ]; then + elif [ "${appid}" ]; then install_steamcmd.sh install_server_files.sh fi diff --git a/lgsm/functions/command_mods_install.sh b/lgsm/functions/command_mods_install.sh index 5cedab62d..1bef36c25 100644 --- a/lgsm/functions/command_mods_install.sh +++ b/lgsm/functions/command_mods_install.sh @@ -82,7 +82,7 @@ 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 + if [ "$(sed -n "/^${modcommand}$/p" "${modsinstalledlistfullpath}")" ]; then fn_print_warning_nl "${modprettyname} is already installed" fn_script_log_warn "${modprettyname} is already installed" echo -e " * Any configs may be overwritten." diff --git a/lgsm/functions/command_mods_update.sh b/lgsm/functions/command_mods_update.sh index 04c482e5c..8d0146f09 100644 --- a/lgsm/functions/command_mods_update.sh +++ b/lgsm/functions/command_mods_update.sh @@ -72,7 +72,7 @@ done installedmodsline="1" while [ "${installedmodsline}" -le "${installedmodscount}" ]; do currentmod=$(sed "${installedmodsline}q;d" "${modsinstalledlistfullpath}") - if [ -n "${currentmod}" ]; then + if [ "${currentmod}" ]; then fn_mod_get_info # Don not update mod if the policy is set to "NOUPDATE". if [ "${modkeepfiles}" == "NOUPDATE" ]; then diff --git a/lgsm/functions/command_monitor.sh b/lgsm/functions/command_monitor.sh index 9d9db0ad2..142b5af2e 100644 --- a/lgsm/functions/command_monitor.sh +++ b/lgsm/functions/command_monitor.sh @@ -141,16 +141,16 @@ for queryattempt in {1..5}; do fi if [ "${querystatus}" == "0" ]; then # Add query data to log. - if [ -n "${gdname}" ]; then + if [ "${gdname}" ]; then fn_script_log_info "Server name: ${gdname}" fi - if [ -n "${gdplayers}" ]; then + if [ "${gdplayers}" ]; then fn_script_log_info "Players: ${gdplayers}/${gdmaxplayers}" fi - if [ -n "${gdmap}" ]; then + if [ "${gdmap}" ]; then fn_script_log_info "Map: ${gdmap}" fi - if [ -n "${gdgamemode}" ]; then + if [ "${gdgamemode}" ]; then fn_script_log_info "Game Mode: ${gdgamemode}" fi fi diff --git a/lgsm/functions/command_postdetails.sh b/lgsm/functions/command_postdetails.sh index 6bbca3d0a..12554565f 100644 --- a/lgsm/functions/command_postdetails.sh +++ b/lgsm/functions/command_postdetails.sh @@ -48,7 +48,7 @@ if [ -f "${postdetailslog}" ]; then fi # Rather than a one-pass sed parser, default to using a temporary directory. -if [ -n "${exitbypass}" ]; then +if [ "${exitbypass}" ]; then postdetailslog="${alertlog}" else # Run checks and gathers details to display. diff --git a/lgsm/functions/command_start.sh b/lgsm/functions/command_start.sh index 5d440c60c..bf5c65146 100644 --- a/lgsm/functions/command_start.sh +++ b/lgsm/functions/command_start.sh @@ -10,7 +10,7 @@ local commandaction="Starting" local function_selfname=$(basename "$(readlink -f "${BASH_SOURCE[0]}")") fn_start_teamspeak3(){ - if [ ! -e "${servercfgfullpath}" ]; then + if [ ! -f "${servercfgfullpath}" ]; then fn_print_warn_nl "${servercfgfullpath} is missing" fn_script_log_warn "${servercfgfullpath} is missing" echo " * Creating blank ${servercfg}" @@ -78,7 +78,7 @@ fn_start_tmux(){ if [ "${consolelogging}" == "on" ]||[ -z "${consolelogging}" ]; then tmux pipe-pane -o -t "${selfname}" "exec cat >> '${consolelog}'" fi - elif [ -n "${tmuxversion}" ]; then + elif [ "${tmuxversion}" ]; then # Get the digit version of tmux. tmuxversion=$(tmux -V | sed "s/tmux //" | sed -n '1 p' | tr -cd '[:digit:]') # tmux pipe-pane not supported in tmux versions < 1.6. @@ -176,7 +176,7 @@ if [ "${status}" != "0" ]; then core_exit.sh fi fi -if [ -z "${fixbypass}" ];then +if [ -z "${fixbypass}" ]; then fix.sh fi info_config.sh diff --git a/lgsm/functions/command_stop.sh b/lgsm/functions/command_stop.sh index 471be97a5..40e3f92e3 100644 --- a/lgsm/functions/command_stop.sh +++ b/lgsm/functions/command_stop.sh @@ -134,22 +134,22 @@ fn_stop_graceful_sdtd(){ fn_stop_graceful_sdtd_telnet completed=$(echo -en "\n ${sdtd_telnet_shutdown}" | grep "Completed.") refused=$(echo -en "\n ${sdtd_telnet_shutdown}" | grep "Timeout or EOF") - if [ -n "${refused}" ]; then + if [ "${refused}" ]; then fn_print_error "Graceful: telnet: ${telnetip}:${telnetport} : " fn_print_fail_eol_nl fn_script_log_error "Graceful: telnet: ${telnetip}:${telnetport} : FAIL" - elif [ -n "${completed}" ]; then + elif [ "${completed}" ]; then break fi done # If telnet shutdown was successful will use telnet again to check # the connection has closed, confirming that the tmux session can now be killed. - if [ -n "${completed}" ]; then + if [ "${completed}" ]; then for seconds in {1..30}; do fn_stop_graceful_sdtd_telnet refused=$(echo -en "\n ${sdtd_telnet_shutdown}" | grep "Timeout or EOF") - if [ -n "${refused}" ]; then + if [ "${refused}" ]; then fn_print_ok "Graceful: telnet: ${telnetip}:${telnetport} : " fn_print_ok_eol_nl fn_script_log_pass "Graceful: telnet: ${telnetip}:${telnetport} : ${seconds} seconds" @@ -160,7 +160,7 @@ fn_stop_graceful_sdtd(){ done # If telnet shutdown fails tmux shutdown will be used, this risks loss of world save. else - if [ -n "${refused}" ]; then + if [ "${refused}" ]; then fn_print_error "Graceful: telnet: " fn_print_fail_eol_nl fn_script_log_error "Graceful: telnet: ${telnetip}:${telnetport} : FAIL" diff --git a/lgsm/functions/command_update_linuxgsm.sh b/lgsm/functions/command_update_linuxgsm.sh index f337ce342..ce8864c80 100644 --- a/lgsm/functions/command_update_linuxgsm.sh +++ b/lgsm/functions/command_update_linuxgsm.sh @@ -73,7 +73,7 @@ if [ -z "${legacymode}" ]; then fi # Check and update functions. -if [ -n "${functionsdir}" ]; then +if [ "${functionsdir}" ]; then if [ -d "${functionsdir}" ]; then cd "${functionsdir}" || exit for functionfile in * diff --git a/lgsm/functions/command_wipe.sh b/lgsm/functions/command_wipe.sh index 55d0d5d01..dde48e23a 100644 --- a/lgsm/functions/command_wipe.sh +++ b/lgsm/functions/command_wipe.sh @@ -45,7 +45,7 @@ fn_wipe_server_remove_files(){ # Rust Wipe. if [ "${shortname}" == "rust" ]; then # Wipe pocedural map. - if [ -n "$(find "${serveridentitydir}" -type f -name "proceduralmap.*.map")" ]; then + if [ "$(find "${serveridentitydir}" -type f -name "proceduralmap.*.map")" ]; then currentaction="Removing map file(s): ${serveridentitydir}/proceduralmap.*.map" echo -en "Removing procedural map proceduralmap.*.map file(s)..." fn_sleep_time @@ -58,7 +58,7 @@ fn_wipe_server_remove_files(){ fn_script_log_info "No procedural map file to remove." fi # Wipe procedural map save. - if [ -n "$(find "${serveridentitydir}" -type f -name "proceduralmap.*.sav")" ]; then + if [ "$(find "${serveridentitydir}" -type f -name "proceduralmap.*.sav")" ]; then currentaction="Removing procedural map save(s): ${serveridentitydir}/proceduralmap.*.sav" echo -en "Removing map saves proceduralmap.*.sav file(s)..." fn_sleep_time @@ -71,7 +71,7 @@ fn_wipe_server_remove_files(){ fn_script_log_info "No procedural map save to remove." fi # Wipe Barren map. - if [ -n "$(find "${serveridentitydir}" -type f -name "barren*.map")" ]; then + if [ "$(find "${serveridentitydir}" -type f -name "barren*.map")" ]; then currentaction="Removing map file(s): ${serveridentitydir}/barren*.map" echo -en "Removing barren map barren*.map file(s)..." fn_sleep_time @@ -84,7 +84,7 @@ fn_wipe_server_remove_files(){ fn_script_log_info "No barren map file to remove." fi # Wipe barren map save. - if [ -n "$(find "${serveridentitydir}" -type f -name "barren*.sav")" ]; then + if [ "$(find "${serveridentitydir}" -type f -name "barren*.sav")" ]; then currentaction="Removing barren map save(s): ${serveridentitydir}/barren*.sav" echo -en "Removing barren map saves barren*.sav file(s)..." fn_sleep_time @@ -119,7 +119,7 @@ fn_wipe_server_remove_files(){ # We do not print additional information if there is nothing to remove since this might be obsolete. fi # Wipe sv.files. - if [ -n "$(find "${serveridentitydir}" -type f -name "sv.files.*.db")" ]; then + if [ "$(find "${serveridentitydir}" -type f -name "sv.files.*.db")" ]; then currentaction="Removing server misc files: ${serveridentitydir}/sv.files.*.db" echo -en "Removing server misc srv.files*.db file(s)..." fn_sleep_time @@ -130,7 +130,7 @@ fn_wipe_server_remove_files(){ # No further information if not found because it should I could not get this file showing up. fi # Wipe player death files. - if [ -n "$(find "${serveridentitydir}" -type f -name "player.deaths.*.db")" ]; then + if [ "$(find "${serveridentitydir}" -type f -name "player.deaths.*.db")" ]; then currentaction="Removing player death files: ${serveridentitydir}/player.deaths.*.db" echo -en "Removing player deaths player.deaths.*.db file(s)..." fn_sleep_time @@ -144,7 +144,7 @@ fn_wipe_server_remove_files(){ fi # Wipe blueprints only if wipeall command was used. if [ "${wipeall}" == "1" ]; then - if [ -n "$(find "${serveridentitydir}" -type f -name "player.blueprints.*.db")" ]; then + if [ "$(find "${serveridentitydir}" -type f -name "player.blueprints.*.db")" ]; then currentaction="Removing blueprint file(s): ${serveridentitydir}/player.blueprints.*.db" echo -en "Removing blueprints player.blueprints.*.db file(s)..." fn_sleep_time @@ -156,7 +156,7 @@ fn_wipe_server_remove_files(){ fn_print_information_nl "No blueprint file to remove" fn_script_log_info "No blueprint file to remove." fi - elif [ -n "$(find "${serveridentitydir}" -type f -name "player.blueprints.*.db")" ]; then + elif [ "$(find "${serveridentitydir}" -type f -name "player.blueprints.*.db")" ]; then fn_print_information_nl "Keeping blueprints" fn_script_log_info "Keeping blueprints." else @@ -165,7 +165,7 @@ fn_wipe_server_remove_files(){ fn_sleep_time fi # Wipe some logs that might be there. - if [ -n "$(find "${serveridentitydir}" -type f -name "Log.*.txt")" ]; then + if [ "$(find "${serveridentitydir}" -type f -name "Log.*.txt")" ]; then currentaction="Removing log files: ${serveridentitydir}/Log.*.txt" echo -en "Removing Log files..." fn_sleep_time diff --git a/lgsm/functions/core_dl.sh b/lgsm/functions/core_dl.sh index 9a59d5ab8..c3281505d 100644 --- a/lgsm/functions/core_dl.sh +++ b/lgsm/functions/core_dl.sh @@ -256,7 +256,7 @@ fn_update_function(){ } # Check that curl is installed -if [ -z "$(command -v curl 2>/dev/null)" ]; then +if [ ! "$(command -v curl 2>/dev/null)" ]; then echo -e "[ FAIL ] Curl is not installed" exit 1 fi diff --git a/lgsm/functions/core_exit.sh b/lgsm/functions/core_exit.sh index 8c10d77e0..ee7e9c6c8 100644 --- a/lgsm/functions/core_exit.sh +++ b/lgsm/functions/core_exit.sh @@ -20,9 +20,9 @@ if [ "$(whoami)" == "root" ]; then find "${logdir}"/ -group root -prune -exec rm -rf {} + > /dev/null 2>&1 fi -if [ -n "${exitbypass}" ]; then +if [ "${exitbypass}" ]; then unset exitbypass -elif [ -n "${exitcode}" ]&&[ "${exitcode}" != "0" ]; then +elif [ "${exitcode}" ]&&[ "${exitcode}" != "0" ]; then if [ "${exitcode}" == "1" ]; then fn_script_log_fatal "${function_selfname} exiting with code: ${exitcode}" elif [ "${exitcode}" == "2" ]; then diff --git a/lgsm/functions/core_getopt.sh b/lgsm/functions/core_getopt.sh index 840ac9a1f..7216dc765 100644 --- a/lgsm/functions/core_getopt.sh +++ b/lgsm/functions/core_getopt.sh @@ -64,13 +64,13 @@ currentopt+=( "${cmd_update_linuxgsm[@]}" ) if [ "${engine}" != "quake" ]&&[ "${engine}" != "idtech2" ]&&[ "${engine}" != "idtech3" ]&&[ "${engine}" != "iw2.0" ]&&[ "${engine}" != "iw3.0" ]&&[ "${shortname}" != "bf1942" ]&&[ "${shortname}" != "samp" ]; then currentopt+=( "${cmd_update[@]}" ) # force update for SteamCMD only or MTA. - if [ -n "${appid}" ]||[ "${shortname}" == "mta" ]; then + if [ "${appid}" ]||[ "${shortname}" == "mta" ]; then currentopt+=( "${cmd_force_update[@]}" ) fi fi # Validate command. -if [ -n "${appid}" ]; then +if [ "${appid}" ]; then currentopt+=( "${cmd_validate[@]}" ) fi diff --git a/lgsm/functions/core_messages.sh b/lgsm/functions/core_messages.sh index 6dadb63c7..3ec0fd0ee 100644 --- a/lgsm/functions/core_messages.sh +++ b/lgsm/functions/core_messages.sh @@ -46,8 +46,8 @@ fn_sleep_time(){ ## Feb 28 14:56:58 ut99-server: Monitor: fn_script_log(){ if [ -d "${lgsmlogdir}" ]; then - if [ -n "${modulename}" ]; then - echo -e "$(date '+%b %d %H:%M:%S.%3N') ${servicename}: ${modulename}: ${1}" >> "${lgsmlog}" + if [ "${modulename}" ]; then + echo -e "$(date '+%b %d %H:%M:%S.%3N') ${selfname}: ${commandname}: ${1}" >> "${lgsmlog}" else echo -e "$(date '+%b %d %H:%M:%S.%3N') ${selfname}: ${1}" >> "${lgsmlog}" fi @@ -57,8 +57,9 @@ fn_script_log(){ ## Feb 28 14:56:58 ut99-server: Monitor: PASS: fn_script_log_pass(){ if [ -d "${lgsmlogdir}" ]; then - if [ -n "${modulename}" ]; then - echo -e "$(date '+%b %d %H:%M:%S.%3N') ${servicename}: ${modulename}: PASS: ${1}" >> "${lgsmlog}" + + if [ "${modulename}" ]; then + echo -e "$(date '+%b %d %H:%M:%S.%3N') ${selfname}: ${commandname}: PASS: ${1}" >> "${lgsmlog}" else echo -e "$(date '+%b %d %H:%M:%S.%3N') ${selfname}: PASS: ${1}" >> "${lgsmlog}" fi @@ -69,8 +70,8 @@ fn_script_log_pass(){ ## Feb 28 14:56:58 ut99-server: Monitor: FATAL: fn_script_log_fatal(){ if [ -d "${lgsmlogdir}" ]; then - if [ -n "${modulename}" ]; then - echo -e "$(date '+%b %d %H:%M:%S.%3N') ${servicename}: ${modulename}: FATAL: ${1}" >> "${lgsmlog}" + if [ "${modulename}" ]; then + echo -e "$(date '+%b %d %H:%M:%S.%3N') ${selfname}: ${commandname}: FATAL: ${1}" >> "${lgsmlog}" else echo -e "$(date '+%b %d %H:%M:%S.%3N') ${selfname}: FATAL: ${1}" >> "${lgsmlog}" fi @@ -81,8 +82,8 @@ fn_script_log_fatal(){ ## Feb 28 14:56:58 ut99-server: Monitor: ERROR: fn_script_log_error(){ if [ -d "${lgsmlogdir}" ]; then - if [ -n "${modulename}" ]; then - echo -e "$(date '+%b %d %H:%M:%S.%3N') ${servicename}: ${modulename}: ERROR: ${1}" >> "${lgsmlog}" + if [ "${modulename}" ]; then + echo -e "$(date '+%b %d %H:%M:%S.%3N') ${selfname}: ${commandname}: ERROR: ${1}" >> "${lgsmlog}" else echo -e "$(date '+%b %d %H:%M:%S.%3N') ${selfname}: ERROR: ${1}" >> "${lgsmlog}" fi @@ -93,8 +94,8 @@ fn_script_log_error(){ ## Feb 28 14:56:58 ut99-server: Monitor: WARN: fn_script_log_warn(){ if [ -d "${lgsmlogdir}" ]; then - if [ -n "${modulename}" ]; then - echo -e "$(date '+%b %d %H:%M:%S.%3N') ${servicename}: ${modulename}: WARN: ${1}" >> "${lgsmlog}" + if [ "${modulename}" ]; then + echo -e "$(date '+%b %d %H:%M:%S.%3N') ${selfname}: ${commandname}: WARN: ${1}" >> "${lgsmlog}" else echo -e "$(date '+%b %d %H:%M:%S.%3N') ${selfname}: WARN: ${1}" >> "${lgsmlog}" fi @@ -105,8 +106,8 @@ fn_script_log_warn(){ ## Feb 28 14:56:58 ut99-server: Monitor: INFO: fn_script_log_info(){ if [ -d "${lgsmlogdir}" ]; then - if [ -n "${modulename}" ]; then - echo -e "$(date '+%b %d %H:%M:%S.%3N') ${servicename}: ${modulename}: INFO: ${1}" >> "${lgsmlog}" + if [ "${modulename}" ]; then + echo -e "$(date '+%b %d %H:%M:%S.%3N') ${selfname}: ${commandname}: INFO: ${1}" >> "${lgsmlog}" else echo -e "$(date '+%b %d %H:%M:%S.%3N') ${selfname}: INFO: ${1}" >> "${lgsmlog}" fi @@ -118,7 +119,7 @@ fn_script_log_info(){ # [ .... ] fn_print_dots(){ - if [ -n "${commandaction}" ]; then + if [ "${commandaction}" ]; then echo -en "${creeol}[ .... ] ${commandaction} ${selfname}: $*" else echo -en "${creeol}[ .... ] $*" @@ -127,7 +128,7 @@ fn_print_dots(){ } fn_print_dots_nl(){ - if [ -n "${commandaction}" ]; then + if [ "${commandaction}" ]; then echo -e "${creeol}[ .... ] ${commandaction} ${selfname}: $*" else echo -e "${creeol}[ .... ] $*" @@ -138,7 +139,7 @@ fn_print_dots_nl(){ # [ OK ] fn_print_ok(){ - if [ -n "${commandaction}" ]; then + if [ "${commandaction}" ]; then echo -en "${creeol}[${green} OK ${default}] ${commandaction} ${selfname}: $*" else echo -en "${creeol}[${green} OK ${default}] $*" @@ -147,7 +148,7 @@ fn_print_ok(){ } fn_print_ok_nl(){ - if [ -n "${commandaction}" ]; then + if [ "${commandaction}" ]; then echo -en "${creeol}[${green} OK ${default}] ${commandaction} ${selfname}: $*" else echo -en "${creeol}[${green} OK ${default}] $*" @@ -158,7 +159,7 @@ fn_print_ok_nl(){ # [ FAIL ] fn_print_fail(){ - if [ -n "${commandaction}" ]; then + if [ "${commandaction}" ]; then echo -en "${creeol}[${red} FAIL ${default}] ${commandaction} ${selfname}: $*" else echo -en "${creeol}[${red} FAIL ${default}] $*" @@ -167,7 +168,7 @@ fn_print_fail(){ } fn_print_fail_nl(){ - if [ -n "${commandaction}" ]; then + if [ "${commandaction}" ]; then echo -en "${creeol}[${red} FAIL ${default}] ${commandaction} ${selfname}: $*" else echo -en "${creeol}[${red} FAIL ${default}] $*" @@ -178,7 +179,7 @@ fn_print_fail_nl(){ # [ ERROR ] fn_print_error(){ - if [ -n "${commandaction}" ]; then + if [ "${commandaction}" ]; then echo -en "${creeol}[${red}ERROR ${default}] ${commandaction} ${selfname}: $*" else echo -en "${creeol}[${red}ERROR ${default}] $*" @@ -187,7 +188,7 @@ fn_print_error(){ } fn_print_error_nl(){ - if [ -n "${commandaction}" ]; then + if [ "${commandaction}" ]; then echo -en "${creeol}[${red}ERROR ${default}] ${commandaction} ${selfname}: $*" else echo -en "${creeol}[${red}ERROR ${default}] $*" @@ -198,7 +199,7 @@ fn_print_error_nl(){ # [ WARN ] fn_print_warn(){ - if [ -n "${commandaction}" ]; then + if [ "${commandaction}" ]; then echo -en "${creeol}[${lightyellow} WARN ${default}] ${commandaction} ${selfname}: $*" else echo -en "${creeol}[${lightyellow} WARN ${default}] $*" @@ -207,7 +208,7 @@ fn_print_warn(){ } fn_print_warn_nl(){ - if [ -n "${commandaction}" ]; then + if [ "${commandaction}" ]; then echo -en "${creeol}[${lightyellow} WARN ${default}] ${commandaction} ${selfname}: $*" else echo -en "${creeol}[${lightyellow} WARN ${default}] $*" @@ -218,7 +219,7 @@ fn_print_warn_nl(){ # [ INFO ] fn_print_info(){ - if [ -n "${commandaction}" ]; then + if [ "${commandaction}" ]; then echo -en "${creeol}[${cyan} INFO ${default}] ${commandaction} ${selfname}: $*" else echo -en "${creeol}[${cyan} INFO ${default}] $*" @@ -227,7 +228,7 @@ fn_print_info(){ } fn_print_info_nl(){ - if [ -n "${commandaction}" ]; then + if [ "${commandaction}" ]; then echo -en "${creeol}[${cyan} INFO ${default}] ${commandaction} ${selfname}: $*" else echo -en "${creeol}[${cyan} INFO ${default}] $*" diff --git a/lgsm/functions/fix.sh b/lgsm/functions/fix.sh index 7585b4348..6d8a4515b 100644 --- a/lgsm/functions/fix.sh +++ b/lgsm/functions/fix.sh @@ -33,7 +33,7 @@ fn_fix_msg_end(){ # Fixes that are run on start. if [ "${function_selfname}" != "command_install.sh" ]&&[ -z "${fixbypass}" ]; then - if [ -n "${appid}" ]; then + if [ "${appid}" ]; then fix_steamcmd.sh fi diff --git a/lgsm/functions/info_distro.sh b/lgsm/functions/info_distro.sh index bb2501969..d6cfc95f9 100644 --- a/lgsm/functions/info_distro.sh +++ b/lgsm/functions/info_distro.sh @@ -35,11 +35,11 @@ do elif [ "$(command -v lsb_release 2>/dev/null)" ]&&[ "${distro_info}" == "lsb_release" ]; then if [ -z "${distroname}" ];then distroname=$(lsb_release -sd) - elif [ -z "${distroversion}" ];then + elif [ -z "${distroversion}" ]; then distroversion=$(lsb_release -sr) - elif [ -z "${distroid}" ];then + elif [ -z "${distroid}" ]; then distroid=$(lsb_release -si) - elif [ -z "${distrocodename}" ];then + elif [ -z "${distrocodename}" ]; then distrocodename=$(lsb_release -sc) fi elif [ "$(command -v hostnamectl 2>/dev/null)" ]&&[ "${distro_info}" == "hostnamectl" ]; then @@ -47,19 +47,19 @@ do distroname=$(hostnamectl | grep "Operating System" | sed 's/Operating System: //g') fi elif [ -f "/etc/debian_version" ]&&[ "${distro_info}" == "debian_version" ]; then - if [ -z "${distroname}" ];then + if [ -z "${distroname}" ]; then distroname="Debian $(cat /etc/debian_version)" - elif [ -z "${distroversion}" ];then + elif [ -z "${distroversion}" ]; then distroversion=$(cat /etc/debian_version) - elif [ -z "${distroid}" ];then + elif [ -z "${distroid}" ]; then distroid="debian" fi elif [ -f "/etc/redhat-release" ]&&[ "${distro_info}" == "redhat-release" ]; then - if [ -z "${distroname}" ];then + if [ -z "${distroname}" ]; then distroname=$(cat /etc/redhat-release) - elif [ -z "${distroversion}" ];then + elif [ -z "${distroversion}" ]; then distroversion=$(rpm -qa \*-release | grep -Ei "oracle|redhat|centos|fedora" | cut -d"-" -f3) - elif [ -z "${distroid}" ];then + elif [ -z "${distroid}" ]; then distroid=$(awk '{print $1}' /etc/redhat-release) fi fi @@ -71,7 +71,7 @@ glibcversion=$(ldd --version | sed -n '1s/.* //p') ## tmux version # e.g: tmux 1.6 -if [ -z "$(command -V tmux 2>/dev/null)" ]; then +if [ ! "$(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" ]; then @@ -156,7 +156,7 @@ else physmemused=$(free ${humanreadable} | awk '/Mem:/ {print $3}') oldfree=$(free ${humanreadable} | awk '/cache:/') - if [ -n "${oldfree}" ]; then + if [ "${oldfree}" ]; then physmemavailable="n/a" physmemcached="n/a" else @@ -277,7 +277,7 @@ if [ "$(command -v jq 2>/dev/null)" ]; then fi # Sets the SteamCMD glibc requirement if the game server requirement is less or not required. -if [ -n "${appid}" ]; then +if [ "${appid}" ]; then if [ "${glibc}" = "null" ]||[ -z "${glibc}" ]||[ "$(printf '%s\n'${glibc}'\n' "2.14" | sort -V | head -n 1)" != "2.14" ]; then glibc="2.14" fi diff --git a/lgsm/functions/info_messages.sh b/lgsm/functions/info_messages.sh index 9d22e44d3..b5471e01a 100644 --- a/lgsm/functions/info_messages.sh +++ b/lgsm/functions/info_messages.sh @@ -174,19 +174,19 @@ fn_info_message_gameserver(){ fn_messages_separator { # Server name - if [ -n "${gdname}" ]; then + if [ "${gdname}" ]; then echo -e "${lightblue}Server name:\t${default}${gdname}" - elif [ -n "${servername}" ]; then + elif [ "${servername}" ]; then echo -e "${lightblue}Server name:\t${default}${servername}" fi # Server description - if [ -n "${serverdescription}" ]; then + if [ "${serverdescription}" ]; then echo -e "${lightblue}Server Description:\t${default}${serverdescription}" fi # Branch - if [ -n "${branch}" ]; then + if [ "${branch}" ]; then echo -e "${lightblue}Branch:\t${default}${branch}" fi @@ -198,68 +198,68 @@ fn_info_message_gameserver(){ fi # Internet ip - if [ -n "${extip}" ]; then + if [ "${extip}" ]; then if [ "${ip}" != "${extip}" ]; then echo -e "${lightblue}Internet IP:\t${default}${extip}:${port}" fi fi # Display ip - if [ -n "${displayip}" ]; then + if [ "${displayip}" ]; then echo -e "${lightblue}Display IP:\t${default}${displayip}:${port}" fi # Server password - if [ -n "${serverpassword}" ]; then + if [ "${serverpassword}" ]; then echo -e "${lightblue}Server password:\t${default}${serverpassword}" fi # Query enabled (Starbound) - if [ -n "${queryenabled}" ]; then + if [ "${queryenabled}" ]; then echo -e "${lightblue}Query enabled:\t${default}${queryenabled}" fi # RCON enabled (Starbound) - if [ -n "${rconenabled}" ]; then + if [ "${rconenabled}" ]; then echo -e "${lightblue}RCON enabled:\t${default}${rconpassword}" fi # RCON password - if [ -n "${rconpassword}" ]; then + if [ "${rconpassword}" ]; then echo -e "${lightblue}RCON password:\t${default}${rconpassword}" fi # RCON web (Rust) - if [ -n "${rconweb}" ]; then + if [ "${rconweb}" ]; then echo -e "${lightblue}RCON web:\t${default}${rconweb}" fi # Admin password - if [ -n "${adminpassword}" ]; then + if [ "${adminpassword}" ]; then echo -e "${lightblue}Admin password:\t${default}${adminpassword}" fi # Stats password (Quake Live) - if [ -n "${statspassword}" ]; then + if [ "${statspassword}" ]; then echo -e "${lightblue}Stats password:\t${default}${statspassword}" fi # Players if [ "${querystatus}" != "0" ]; then - if [ -n "${maxplayers}" ]; then + if [ "${maxplayers}" ]; then echo -e "${lightblue}Maxplayers:\t${default}${maxplayers}" fi else - if [ -n "${gdplayers}" ]&&[ -n "${gdmaxplayers}" ]; then + if [ "${gdplayers}" ]&&[ -n "${gdmaxplayers}" ]; then echo -e "${lightblue}Players:\t${default}${gdplayers}/${gdmaxplayers}" - elif [ -n "${gdplayers}" ]&&[ -n "${maxplayers}" ]; then + elif [ "${gdplayers}" ]&&[ -n "${maxplayers}" ]; then echo -e "${lightblue}Players:\t${default}${gdplayers}/${maxplayers}" elif [ -z "${gdplayers}" ]&&[ -n "${gdmaxplayers}" ]; then echo -e "${lightblue}Players:\t${default}0/${gdmaxplayers}" - elif [ -n "${gdplayers}" ]&&[ -z "${gdmaxplayers}" ]; then + elif [ "${gdplayers}" ]&&[ -z "${gdmaxplayers}" ]; then echo -e "${lightblue}Players:\t${default}${gdplayers}|∞" elif [ -z "${gdplayers}" ]&&[ -z "${gdmaxplayers}" ]&&[ -n "${maxplayers}" ]; then @@ -268,110 +268,110 @@ fn_info_message_gameserver(){ fi # Bots - if [ -n "${gdbots}" ]; then + if [ "${gdbots}" ]; then echo -e "${lightblue}Bots:\t${default}${gdbots}" fi # Current map - if [ -n "${gdmap}" ]; then + if [ "${gdmap}" ]; then echo -e "${lightblue}Current map:\t${default}${gdmap}" fi # Default map - if [ -n "${defaultmap}" ]; then + if [ "${defaultmap}" ]; then echo -e "${lightblue}Default map:\t${default}${defaultmap}" fi - if [ -n "${defaultscenario}" ]; then + if [ "${defaultscenario}" ]; then # Current scenario - if [ -n "${gdgamemode}" ]; then + if [ "${gdgamemode}" ]; then echo -e "${lightblue}Current scenario:\t${default}${gdgamemode}" fi else # Current game mode - if [ -n "${gdgamemode}" ]; then + if [ "${gdgamemode}" ]; then echo -e "${lightblue}Current game mode:\t${default}${gdgamemode}" fi fi # Default scenario - if [ -n "${defaultscenario}" ]; then + if [ "${defaultscenario}" ]; then echo -e "${lightblue}Default scenario:\t${default}${defaultscenario}" fi # Game type - if [ -n "${gametype}" ]; then + if [ "${gametype}" ]; then echo -e "${lightblue}Game type:\t${default}${gametype}" fi # Game mode - if [ -n "${gamemode}" ]; then + if [ "${gamemode}" ]; then echo -e "${lightblue}Game mode:\t${default}${gamemode}" fi # Game world - if [ -n "${gameworld}" ]; then + if [ "${gameworld}" ]; then echo -e "${lightblue}Game world:\t${default}${gameworld}" fi # Tick rate - if [ -n "${tickrate}" ]; then + if [ "${tickrate}" ]; then echo -e "${lightblue}Tick rate:\t${default}${tickrate}" fi # Sharding (Don't Starve Together) - if [ -n "${sharding}" ]; then + if [ "${sharding}" ]; then echo -e "${lightblue}Sharding:\t${default}${sharding}" fi # Master (Don't Starve Together) - if [ -n "${master}" ]; then + if [ "${master}" ]; then echo -e "${lightblue}Master:\t${default}${master}" fi # Shard (Don't Starve Together) - if [ -n "${shard}" ]; then + if [ "${shard}" ]; then echo -e "${lightblue}Shard:\t${default}${shard}" fi # Cluster (Don't Starve Together) - if [ -n "${cluster}" ]; then + if [ "${cluster}" ]; then echo -e "${lightblue}Cluster:\t${default}${cluster}" fi # Cave (Don't Starve Together) - if [ -n "${cave}" ]; then + if [ "${cave}" ]; then echo -e "${lightblue}Cave:\t${default}${cave}" fi # Creativemode (Hurtworld) - if [ -n "${creativemode}" ]; then + if [ "${creativemode}" ]; then echo -e "${lightblue}Creativemode:\t${default}${creativemode}" fi # TeamSpeak dbplugin - if [ -n "${dbplugin}" ]; then + if [ "${dbplugin}" ]; then echo -e "${lightblue}dbplugin:\t${default}${dbplugin}" fi # ASE (Multi Theft Auto) - if [ -n "${ase}" ]; then + if [ "${ase}" ]; then echo -e "${lightblue}ASE:\t${default}${ase}" fi # Save interval (Rust) - if [ -n "${saveinterval}" ]; then + if [ "${saveinterval}" ]; then echo -e "${lightblue}ASE:\t${default}${saveinterval} s" fi # Random map rotation mode (Squad and Post Scriptum) - if [ -n "${randommap}" ]; then + if [ "${randommap}" ]; then echo -e "${lightblue}Map rotation:\t${default}${randommap}" fi # Listed on Master server - if [ -n "${displaymasterserver}" ];then - if [ "${displaymasterserver}" == "true" ];then + if [ "${displaymasterserver}" ]; then + if [ "${displaymasterserver}" == "true" ]; then echo -e "${lightblue}Master server:\t${green}${displaymasterserver}${default}" else echo -e "${lightblue}Master server:\t${red}${displaymasterserver}${default}" @@ -416,12 +416,12 @@ fn_info_message_script(){ echo -e "${lightblue}Script name:\t${default}${selfname}" # LinuxGSM version - if [ -n "${version}" ]; then + if [ "${version}" ]; then echo -e "${lightblue}LinuxGSM version:\t${default}${version}" fi # glibc required - if [ -n "${glibc}" ]; then + if [ "${glibc}" ]; then if [ "${glibc}" == "null" ]; then # Glibc is not required. : @@ -451,7 +451,7 @@ fn_info_message_script(){ # Telegram alert echo -e "${lightblue}Telegram alert:\t${default}${telegramalert}" # Update on start - if [ -n "${updateonstart}" ]; then + if [ "${updateonstart}" ]; then echo -e "${lightblue}Update on start:\t${default}${updateonstart}" fi @@ -462,7 +462,7 @@ fn_info_message_script(){ echo -e "${lightblue}Location:\t${default}${rootdir}" # Config file location - if [ -n "${servercfgfullpath}" ]; then + if [ "${servercfgfullpath}" ]; then if [ -f "${servercfgfullpath}" ]; then echo -e "${lightblue}Config file:\t${default}${servercfgfullpath}" elif [ -d "${servercfgfullpath}" ]; then @@ -473,7 +473,7 @@ fn_info_message_script(){ fi # Network config file location (ARMA 3) - if [ -n "${networkcfgfullpath}" ]; then + if [ "${networkcfgfullpath}" ]; then echo -e "${lightblue}Network config file:\t${default}${networkcfgfullpath}" fi } | column -s $'\t' -t @@ -580,7 +580,7 @@ fn_info_logs(){ echo -e "${selfname} Logs" echo -e "=================================" - if [ -n "${lgsmlog}" ]; then + if [ "${lgsmlog}" ]; then echo -e "\nScript log\n===================" if [ ! "$(ls -A "${lgsmlogdir}")" ]; then echo -e "${lgsmlogdir} (NO LOG FILES)" @@ -593,7 +593,7 @@ fn_info_logs(){ echo -e "" fi - if [ -n "${consolelog}" ]; then + if [ "${consolelog}" ]; then echo -e "\nConsole log\n====================" if [ ! "$(ls -A "${consolelogdir}")" ]; then echo -e "${consolelogdir} (NO LOG FILES)" @@ -606,7 +606,7 @@ fn_info_logs(){ echo -e "" fi - if [ -n "${gamelogdir}" ]; then + if [ "${gamelogdir}" ]; then echo -e "\nServer log\n===================" if [ ! "$(ls -A "${gamelogdir}")" ]; then echo -e "${gamelogdir} (NO LOG FILES)" @@ -1497,35 +1497,35 @@ fn_messages_separator(){ # Removes the passwords form all but details fn_info_message_password_strip(){ if [ "${function_selfname}" != "command_details.sh" ]; then - if [ -n "${serverpassword}" ]; then + if [ "${serverpassword}" ]; then serverpassword="********" fi - if [ -n "${rconpassword}" ]; then + if [ "${rconpassword}" ]; then rconpassword="********" fi - if [ -n "${adminpassword}" ]; then + if [ "${adminpassword}" ]; then adminpassword="********" fi - if [ -n "${statspassword}" ]; then + if [ "${statspassword}" ]; then statspassword="********" fi - if [ -n "${webadminpass}" ]; then + if [ "${webadminpass}" ]; then webadminpass="********" fi - if [ -n "${telnetpass}" ]; then + if [ "${telnetpass}" ]; then telnetpass="********" fi - if [ -n "${wsapikey}" ]; then + if [ "${wsapikey}" ]; then wsapikey="********" fi - if [ -n "${gslt}" ]; then + if [ "${gslt}" ]; then gslt="********" fi diff --git a/lgsm/functions/info_stats.sh b/lgsm/functions/info_stats.sh index c99bdcf27..078639fe6 100644 --- a/lgsm/functions/info_stats.sh +++ b/lgsm/functions/info_stats.sh @@ -7,7 +7,7 @@ info_distro.sh # generate uuid -if [ ! -f "${datadir}/uuid.txt" ];then +if [ ! -f "${datadir}/uuid.txt" ]; then mkdir -p "${datadir}" touch "${datadir}/uuid.txt" if [ "$(command -v uuidgen 2>/dev/null)" ]; then diff --git a/lgsm/functions/install_logs.sh b/lgsm/functions/install_logs.sh index e33b2a6af..bb4fdd2b8 100644 --- a/lgsm/functions/install_logs.sh +++ b/lgsm/functions/install_logs.sh @@ -41,7 +41,7 @@ else fn_print_ok_eol_nl fi # Create Console logs. -if [ -n "${consolelogdir}" ]; then +if [ "${consolelogdir}" ]; then echo -en "installing console log dir: ${consolelogdir}..." mkdir -p "${consolelogdir}" if [ $? -ne 0 ]; then @@ -60,7 +60,7 @@ if [ -n "${consolelogdir}" ]; then fi # Create Game logs. -if [ -n "${gamelogdir}" ]&&[ ! -d "${gamelogdir}" ]; then +if [ "${gamelogdir}" ]&&[ ! -d "${gamelogdir}" ]; then echo -en "installing game log dir: ${gamelogdir}..." if ! mkdir -p "${gamelogdir}"; then fn_print_fail_eol_nl @@ -74,7 +74,7 @@ fi # 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 [ "${gamelogdir}" ]; then if [ "${gamelogdir:0:${#logdir}}" != "${logdir}" ]; then echo -en "creating symlink to game log dir: ${logdir}/server -> ${gamelogdir}..." if ! ln -nfs "${gamelogdir}" "${logdir}/server"; then diff --git a/lgsm/functions/install_server_files.sh b/lgsm/functions/install_server_files.sh index 2b985569e..859d69617 100644 --- a/lgsm/functions/install_server_files.sh +++ b/lgsm/functions/install_server_files.sh @@ -146,7 +146,7 @@ echo -e "${lightyellow}Installing ${gamename} Server${default}" echo -e "=================================" fn_sleep_time -if [ -n "${appid}" ]; then +if [ "${appid}" ]; then fn_install_server_files_steamcmd fi diff --git a/lgsm/functions/logs.sh b/lgsm/functions/logs.sh index 199295d46..dc55456ef 100644 --- a/lgsm/functions/logs.sh +++ b/lgsm/functions/logs.sh @@ -9,8 +9,8 @@ local modulename="LOGS" local commandaction="Log-Manager" # Check if logfile variable and file exist, create logfile if it doesn't exist. -if [ -n "${consolelog}" ]; then - if [ ! -e "${consolelog}" ]; then +if [ "${consolelog}" ]; then + if [ ! -f "${consolelog}" ]; then touch "${consolelog}" fi fi @@ -18,7 +18,7 @@ fi # For games not displaying a console, and having logs into their game directory. check_status.sh if [ "${status}" != "0" ]&&[ "${function_selfname}" == "command_start.sh" ]&&[ -n "${gamelogfile}" ]; then - if [ -n "$(find "${systemdir}" -name "gamelog*.log")" ]; then + if [ "$(find "${systemdir}" -name "gamelog*.log")" ]; then fn_print_info "Moving game logs to ${gamelogdir}" fn_script_log_info "Moving game logs to ${gamelogdir}" echo -en "\n" @@ -56,7 +56,7 @@ if [ "$(find "${lgsmlogdir}"/ -type f -mtime +"${logdays}" | wc -l)" -ne "0" ]; find "${gamelogdir}"/ -mtime +"${logdays}" -type f -exec rm -f {} \; fi # Console logfiles. - if [ -n "${consolelog}" ]; then + if [ "${consolelog}" ]; then 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 {} \; diff --git a/lgsm/functions/mods_core.sh b/lgsm/functions/mods_core.sh index 42c19d08d..68f791dbd 100644 --- a/lgsm/functions/mods_core.sh +++ b/lgsm/functions/mods_core.sh @@ -104,7 +104,7 @@ fn_mod_copy_destination(){ # Add the mod to the installed-mods.txt. fn_mod_add_list(){ - if [ ! -n "$(sed -n "/^${modcommand}$/p" "${modsinstalledlistfullpath}")" ]; then + if [ -z "$(sed -n "/^${modcommand}$/p" "${modsinstalledlistfullpath}")" ]; then echo -e "${modcommand}" >> "${modsinstalledlistfullpath}" fn_script_log_info "${modcommand} added to ${modsinstalledlist}" fi @@ -267,7 +267,7 @@ fn_mods_installed_list(){ # Increment line check. ((installedmodsline++)) done - if [ -n "${installedmodscount}" ]; then + if [ "${installedmodscount}" ]; then fn_script_log_info "${installedmodscount} addons/mods are currently installed" fi } diff --git a/linuxgsm.sh b/linuxgsm.sh index e7afc14b4..6668b32be 100755 --- a/linuxgsm.sh +++ b/linuxgsm.sh @@ -151,7 +151,7 @@ fn_install_menu_bash() { done < "${options}" menu_options+=( "Cancel" ) select option in "${menu_options[@]}"; do - if [ -n "${option}" ]&&[ "${option}" != "Cancel" ]; then + if [ "${option}" ]&&[ "${option}" != "Cancel" ]; then eval "$resultvar=\"${option/%\ */}\"" fi break @@ -297,7 +297,7 @@ if [ "${shortname}" == "core" ]; then echo -e "result: ${result}" echo -e "gameservername: ${gameservername}" fi - elif [ -n "${userinput}" ]; then + elif [ "${userinput}" ]; then fn_server_info if [ "${userinput}" == "${gameservername}" ]||[ "${userinput}" == "${gamename}" ]||[ "${userinput}" == "${shortname}" ]; then fn_install_file diff --git a/tests/tests_fctrserver.sh b/tests/tests_fctrserver.sh index 14c111d55..89fdf939a 100644 --- a/tests/tests_fctrserver.sh +++ b/tests/tests_fctrserver.sh @@ -160,7 +160,7 @@ fn_install_menu_bash() { done < "${options}" menu_options+=( "Cancel" ) select option in "${menu_options[@]}"; do - if [ -n "${option}" ]&&[ "${option}" != "Cancel" ]; then + if [ "${option}" ]&&[ "${option}" != "Cancel" ]; then eval "$resultvar=\"${option/%\ */}\"" fi break @@ -306,7 +306,7 @@ if [ "${shortname}" == "core" ]; then echo -e "result: ${result}" echo -e "gameservername: ${gameservername}" fi - elif [ -n "${userinput}" ]; then + elif [ "${userinput}" ]; then fn_server_info if [ "${userinput}" == "${gameservername}" ]||[ "${userinput}" == "${gamename}" ]||[ "${userinput}" == "${shortname}" ]; then fn_install_file diff --git a/tests/tests_jc2server.sh b/tests/tests_jc2server.sh index 6887b2d45..9facae8cb 100644 --- a/tests/tests_jc2server.sh +++ b/tests/tests_jc2server.sh @@ -160,7 +160,7 @@ fn_install_menu_bash() { done < "${options}" menu_options+=( "Cancel" ) select option in "${menu_options[@]}"; do - if [ -n "${option}" ]&&[ "${option}" != "Cancel" ]; then + if [ "${option}" ]&&[ "${option}" != "Cancel" ]; then eval "$resultvar=\"${option/%\ */}\"" fi break @@ -306,7 +306,7 @@ if [ "${shortname}" == "core" ]; then echo -e "result: ${result}" echo -e "gameservername: ${gameservername}" fi - elif [ -n "${userinput}" ]; then + elif [ "${userinput}" ]; then fn_server_info if [ "${userinput}" == "${gameservername}" ]||[ "${userinput}" == "${gamename}" ]||[ "${userinput}" == "${shortname}" ]; then fn_install_file diff --git a/tests/tests_mcserver.sh b/tests/tests_mcserver.sh index 4d6378d97..cb8083d40 100644 --- a/tests/tests_mcserver.sh +++ b/tests/tests_mcserver.sh @@ -160,7 +160,7 @@ fn_install_menu_bash() { done < "${options}" menu_options+=( "Cancel" ) select option in "${menu_options[@]}"; do - if [ -n "${option}" ]&&[ "${option}" != "Cancel" ]; then + if [ "${option}" ]&&[ "${option}" != "Cancel" ]; then eval "$resultvar=\"${option/%\ */}\"" fi break @@ -306,7 +306,7 @@ if [ "${shortname}" == "core" ]; then echo -e "result: ${result}" echo -e "gameservername: ${gameservername}" fi - elif [ -n "${userinput}" ]; then + elif [ "${userinput}" ]; then fn_server_info if [ "${userinput}" == "${gameservername}" ]||[ "${userinput}" == "${gamename}" ]||[ "${userinput}" == "${shortname}" ]; then fn_install_file diff --git a/tests/tests_ts3server.sh b/tests/tests_ts3server.sh index cd56c456d..192bb3524 100644 --- a/tests/tests_ts3server.sh +++ b/tests/tests_ts3server.sh @@ -160,7 +160,7 @@ fn_install_menu_bash() { done < "${options}" menu_options+=( "Cancel" ) select option in "${menu_options[@]}"; do - if [ -n "${option}" ]&&[ "${option}" != "Cancel" ]; then + if [ "${option}" ]&&[ "${option}" != "Cancel" ]; then eval "$resultvar=\"${option/%\ */}\"" fi break @@ -306,7 +306,7 @@ if [ "${shortname}" == "core" ]; then echo -e "result: ${result}" echo -e "gameservername: ${gameservername}" fi - elif [ -n "${userinput}" ]; then + elif [ "${userinput}" ]; then fn_server_info if [ "${userinput}" == "${gameservername}" ]||[ "${userinput}" == "${gamename}" ]||[ "${userinput}" == "${shortname}" ]; then fn_install_file From 8a29dcc7aa6ecf8477406d0d0c61f0d15aa18a90 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Wed, 11 Mar 2020 09:13:29 +0000 Subject: [PATCH 294/534] fix(fix): fix sof2 LD_LIBRARY_PATH and standardise usage (#2731) --- lgsm/functions/fix_ins.sh | 2 +- lgsm/functions/fix_mcb.sh | 2 +- lgsm/functions/fix_onset.sh | 2 +- lgsm/functions/fix_rw.sh | 2 +- lgsm/functions/fix_sdtd.sh | 2 +- lgsm/functions/fix_sof2.sh | 2 +- lgsm/functions/fix_unt.sh | 2 +- 7 files changed, 7 insertions(+), 7 deletions(-) diff --git a/lgsm/functions/fix_ins.sh b/lgsm/functions/fix_ins.sh index e26d501da..8bd3f310b 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=${serverfiles}:${serverfiles}/bin:${LD_LIBRARY_PATH} +export LD_LIBRARY_PATH="$LD_LIBRARY_PATH:${serverfiles}:${serverfiles}/bin" # Fixes: issue #529 - gamemode not passed to debug or start. diff --git a/lgsm/functions/fix_mcb.sh b/lgsm/functions/fix_mcb.sh index e5a919dbc..5352fdee8 100644 --- a/lgsm/functions/fix_mcb.sh +++ b/lgsm/functions/fix_mcb.sh @@ -8,4 +8,4 @@ local modulename="FIX" local commandaction="Fix" # official docs state that the server should be started with: LD_LIBRARY_PATH=. ./bedrock_server -export LD_LIBRARY_PATH="${serverfiles}:$LD_LIBRARY_PATH" +export LD_LIBRARY_PATH="$LD_LIBRARY_PATH:${serverfiles}" diff --git a/lgsm/functions/fix_onset.sh b/lgsm/functions/fix_onset.sh index 24ab62132..299e448fa 100644 --- a/lgsm/functions/fix_onset.sh +++ b/lgsm/functions/fix_onset.sh @@ -8,7 +8,7 @@ local modulename="FIX" local commandaction="Fix" local function_selfname=$(basename "$(readlink -f "${BASH_SOURCE[0]}")") -export LD_LIBRARY_PATH="${serverfiles}:$LD_LIBRARY_PATH" +export LD_LIBRARY_PATH="$LD_LIBRARY_PATH:${serverfiles}" # Fixes: Failed loading "mariadb": libmariadbclient.so.18: cannot open shared object file: No such file or directory # Issue only occures on CentOS as libmariadbclient.so.18 is called libmariadb.so.3 on CentOS. diff --git a/lgsm/functions/fix_rw.sh b/lgsm/functions/fix_rw.sh index 7cf5a6b12..73cafcf2e 100644 --- a/lgsm/functions/fix_rw.sh +++ b/lgsm/functions/fix_rw.sh @@ -7,4 +7,4 @@ local modulename="FIX" local commandaction="Fix" -export LD_LIBRARY_PATH="${serverfiles}/linux64:${serverfiles}:$LD_LIBRARY_PATH" +export LD_LIBRARY_PATH="$LD_LIBRARY_PATH:${serverfiles}:${serverfiles}/linux64" diff --git a/lgsm/functions/fix_sdtd.sh b/lgsm/functions/fix_sdtd.sh index b04b1fca7..005fb8f6c 100644 --- a/lgsm/functions/fix_sdtd.sh +++ b/lgsm/functions/fix_sdtd.sh @@ -7,4 +7,4 @@ local modulename="FIX" local commandaction="Fix" -export LD_LIBRARY_PATH="${serverfiles}" +export LD_LIBRARY_PATH="$LD_LIBRARY_PATH:${serverfiles}" diff --git a/lgsm/functions/fix_sof2.sh b/lgsm/functions/fix_sof2.sh index 3ad769767..11af88522 100644 --- a/lgsm/functions/fix_sof2.sh +++ b/lgsm/functions/fix_sof2.sh @@ -8,4 +8,4 @@ local modulename="FIX" local commandaction="Fix" # Fixes: error while loading shared libraries: libcxa.so.1 -export LD_LIBRARY_PATH=":$LD_LIBRARY_PATH" +export LD_LIBRARY_PATH="$LD_LIBRARY_PATH:${serverfiles}" diff --git a/lgsm/functions/fix_unt.sh b/lgsm/functions/fix_unt.sh index f040b77c6..2c27e2f31 100644 --- a/lgsm/functions/fix_unt.sh +++ b/lgsm/functions/fix_unt.sh @@ -8,4 +8,4 @@ local modulename="FIX" local commandaction="Fix" # steamclient.so: cannot open shared object file: No such file or directory -export LD_LIBRARY_PATH="${serverfiles}/linux64:${serverfiles}:$LD_LIBRARY_PATH" +export LD_LIBRARY_PATH="$LD_LIBRARY_PATH:${serverfiles}:${serverfiles}/linux64" From 260428fe7d107f5db677f615f282d331936cfb87 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Wed, 11 Mar 2020 09:14:47 +0000 Subject: [PATCH 295/534] feat: deprecate servercfgfullpath variable (#2724) * migrating servercfgfullpath * migrated servercfgpath * removed servercfgfullpath from _default.cfg as always the same * removed servercfgfullpathdefault as not needed * re-ordered sdtd --- lgsm/config-default/config-lgsm/ahl2server/_default.cfg | 1 - lgsm/config-default/config-lgsm/ahlserver/_default.cfg | 1 - lgsm/config-default/config-lgsm/arkserver/_default.cfg | 1 - lgsm/config-default/config-lgsm/arma3server/_default.cfg | 1 - lgsm/config-default/config-lgsm/bb2server/_default.cfg | 1 - lgsm/config-default/config-lgsm/bbserver/_default.cfg | 1 - lgsm/config-default/config-lgsm/bdserver/_default.cfg | 1 - lgsm/config-default/config-lgsm/bf1942server/_default.cfg | 1 - lgsm/config-default/config-lgsm/bmdmserver/_default.cfg | 1 - lgsm/config-default/config-lgsm/boserver/_default.cfg | 1 - lgsm/config-default/config-lgsm/bsserver/_default.cfg | 1 - lgsm/config-default/config-lgsm/bt1944server/_default.cfg | 1 - lgsm/config-default/config-lgsm/btserver/_default.cfg | 1 - lgsm/config-default/config-lgsm/ccserver/_default.cfg | 1 - lgsm/config-default/config-lgsm/cod2server/_default.cfg | 1 - lgsm/config-default/config-lgsm/cod4server/_default.cfg | 1 - lgsm/config-default/config-lgsm/codserver/_default.cfg | 1 - lgsm/config-default/config-lgsm/coduoserver/_default.cfg | 1 - lgsm/config-default/config-lgsm/codwawserver/_default.cfg | 1 - lgsm/config-default/config-lgsm/csczserver/_default.cfg | 1 - lgsm/config-default/config-lgsm/csgoserver/_default.cfg | 1 - lgsm/config-default/config-lgsm/csserver/_default.cfg | 1 - lgsm/config-default/config-lgsm/cssserver/_default.cfg | 1 - lgsm/config-default/config-lgsm/dabserver/_default.cfg | 1 - lgsm/config-default/config-lgsm/dmcserver/_default.cfg | 1 - lgsm/config-default/config-lgsm/dodserver/_default.cfg | 1 - lgsm/config-default/config-lgsm/dodsserver/_default.cfg | 1 - lgsm/config-default/config-lgsm/doiserver/_default.cfg | 1 - lgsm/config-default/config-lgsm/dstserver/_default.cfg | 1 - lgsm/config-default/config-lgsm/dysserver/_default.cfg | 1 - lgsm/config-default/config-lgsm/ecoserver/_default.cfg | 1 - lgsm/config-default/config-lgsm/emserver/_default.cfg | 1 - lgsm/config-default/config-lgsm/etlserver/_default.cfg | 1 - lgsm/config-default/config-lgsm/fctrserver/_default.cfg | 1 - lgsm/config-default/config-lgsm/fofserver/_default.cfg | 1 - lgsm/config-default/config-lgsm/gesserver/_default.cfg | 1 - lgsm/config-default/config-lgsm/gmodserver/_default.cfg | 1 - lgsm/config-default/config-lgsm/hl2dmserver/_default.cfg | 1 - lgsm/config-default/config-lgsm/hldmserver/_default.cfg | 1 - lgsm/config-default/config-lgsm/hldmsserver/_default.cfg | 1 - lgsm/config-default/config-lgsm/insserver/_default.cfg | 1 - lgsm/config-default/config-lgsm/inssserver/_default.cfg | 1 - lgsm/config-default/config-lgsm/iosserver/_default.cfg | 1 - lgsm/config-default/config-lgsm/jc2server/_default.cfg | 1 - lgsm/config-default/config-lgsm/jc3server/_default.cfg | 1 - lgsm/config-default/config-lgsm/kf2server/_default.cfg | 1 - lgsm/config-default/config-lgsm/kfserver/_default.cfg | 1 - lgsm/config-default/config-lgsm/l4d2server/_default.cfg | 1 - lgsm/config-default/config-lgsm/l4dserver/_default.cfg | 1 - lgsm/config-default/config-lgsm/mcserver/_default.cfg | 1 - lgsm/config-default/config-lgsm/mhserver/_default.cfg | 1 - lgsm/config-default/config-lgsm/mohaaserver/_default.cfg | 1 - lgsm/config-default/config-lgsm/mtaserver/_default.cfg | 1 - lgsm/config-default/config-lgsm/mumbleserver/_default.cfg | 1 - lgsm/config-default/config-lgsm/ndserver/_default.cfg | 1 - lgsm/config-default/config-lgsm/nmrihserver/_default.cfg | 1 - lgsm/config-default/config-lgsm/ns2cserver/_default.cfg | 1 - lgsm/config-default/config-lgsm/ns2server/_default.cfg | 1 - lgsm/config-default/config-lgsm/nsserver/_default.cfg | 1 - lgsm/config-default/config-lgsm/opforserver/_default.cfg | 1 - lgsm/config-default/config-lgsm/pcserver/_default.cfg | 1 - lgsm/config-default/config-lgsm/pstbsserver/_default.cfg | 1 - lgsm/config-default/config-lgsm/pvkiiserver/_default.cfg | 1 - lgsm/config-default/config-lgsm/pzserver/_default.cfg | 1 - lgsm/config-default/config-lgsm/q2server/_default.cfg | 1 - lgsm/config-default/config-lgsm/q3server/_default.cfg | 1 - lgsm/config-default/config-lgsm/qlserver/_default.cfg | 1 - lgsm/config-default/config-lgsm/qwserver/_default.cfg | 1 - lgsm/config-default/config-lgsm/ricochetserver/_default.cfg | 1 - lgsm/config-default/config-lgsm/roserver/_default.cfg | 1 - lgsm/config-default/config-lgsm/rtcwserver/_default.cfg | 1 - lgsm/config-default/config-lgsm/rustserver/_default.cfg | 1 - lgsm/config-default/config-lgsm/rwserver/_default.cfg | 1 - lgsm/config-default/config-lgsm/sampserver/_default.cfg | 1 - lgsm/config-default/config-lgsm/sbotsserver/_default.cfg | 1 - lgsm/config-default/config-lgsm/sbserver/_default.cfg | 1 - lgsm/config-default/config-lgsm/sdtdserver/_default.cfg | 5 ++--- lgsm/config-default/config-lgsm/sfcserver/_default.cfg | 1 - lgsm/config-default/config-lgsm/sof2server/_default.cfg | 1 - lgsm/config-default/config-lgsm/solserver/_default.cfg | 2 -- lgsm/config-default/config-lgsm/squadserver/_default.cfg | 1 - lgsm/config-default/config-lgsm/ss3server/_default.cfg | 1 - lgsm/config-default/config-lgsm/stserver/_default.cfg | 1 - lgsm/config-default/config-lgsm/svenserver/_default.cfg | 1 - lgsm/config-default/config-lgsm/terrariaserver/_default.cfg | 1 - lgsm/config-default/config-lgsm/tf2server/_default.cfg | 1 - lgsm/config-default/config-lgsm/tfcserver/_default.cfg | 1 - lgsm/config-default/config-lgsm/ts3server/_default.cfg | 1 - lgsm/config-default/config-lgsm/tsserver/_default.cfg | 1 - lgsm/config-default/config-lgsm/tuserver/_default.cfg | 3 ++- lgsm/config-default/config-lgsm/twserver/_default.cfg | 1 - lgsm/config-default/config-lgsm/untserver/_default.cfg | 2 -- lgsm/config-default/config-lgsm/ut2k4server/_default.cfg | 1 - lgsm/config-default/config-lgsm/ut3server/_default.cfg | 1 - lgsm/config-default/config-lgsm/ut99server/_default.cfg | 1 - lgsm/config-default/config-lgsm/utserver/_default.cfg | 1 - lgsm/config-default/config-lgsm/vsserver/_default.cfg | 1 - lgsm/config-default/config-lgsm/wetserver/_default.cfg | 1 - lgsm/config-default/config-lgsm/wfserver/_default.cfg | 1 - lgsm/config-default/config-lgsm/wurmserver/_default.cfg | 1 - lgsm/config-default/config-lgsm/zmrserver/_default.cfg | 1 - lgsm/config-default/config-lgsm/zpsserver/_default.cfg | 1 - lgsm/functions/check_config.sh | 2 ++ lgsm/functions/install_config.sh | 2 +- 104 files changed, 7 insertions(+), 107 deletions(-) diff --git a/lgsm/config-default/config-lgsm/ahl2server/_default.cfg b/lgsm/config-default/config-lgsm/ahl2server/_default.cfg index e9bac4a9c..4536de702 100644 --- a/lgsm/config-default/config-lgsm/ahl2server/_default.cfg +++ b/lgsm/config-default/config-lgsm/ahl2server/_default.cfg @@ -157,7 +157,6 @@ executable="./srcds_run" servercfg="${selfname}.cfg" servercfgdefault="server.cfg" servercfgdir="${systemdir}/cfg" -servercfgfullpath="${servercfgdir}/${servercfg}" ## Backup Directory backupdir="${lgsmdir}/backup" diff --git a/lgsm/config-default/config-lgsm/ahlserver/_default.cfg b/lgsm/config-default/config-lgsm/ahlserver/_default.cfg index 35f4d6d01..89de05540 100644 --- a/lgsm/config-default/config-lgsm/ahlserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/ahlserver/_default.cfg @@ -153,7 +153,6 @@ executable="./hlds_run" servercfg="${selfname}.cfg" servercfgdefault="server.cfg" servercfgdir="${systemdir}" -servercfgfullpath="${servercfgdir}/${servercfg}" ## Backup Directory backupdir="${lgsmdir}/backup" diff --git a/lgsm/config-default/config-lgsm/arkserver/_default.cfg b/lgsm/config-default/config-lgsm/arkserver/_default.cfg index 61c2d456d..e0111e3c5 100644 --- a/lgsm/config-default/config-lgsm/arkserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/arkserver/_default.cfg @@ -154,7 +154,6 @@ executable="./ShooterGameServer" servercfg="GameUserSettings.ini" servercfgdefault="GameUserSettings.ini" servercfgdir="${systemdir}/Saved/Config/LinuxServer" -servercfgfullpath="${servercfgdir}/${servercfg}" ## Backup Directory backupdir="${lgsmdir}/backup" diff --git a/lgsm/config-default/config-lgsm/arma3server/_default.cfg b/lgsm/config-default/config-lgsm/arma3server/_default.cfg index 0a4f1fbf4..f557eead3 100644 --- a/lgsm/config-default/config-lgsm/arma3server/_default.cfg +++ b/lgsm/config-default/config-lgsm/arma3server/_default.cfg @@ -170,7 +170,6 @@ networkcfg="${selfname}.network.cfg" servercfgdefault="server.cfg" networkcfgdefault="network.cfg" servercfgdir="${systemdir}/cfg" -servercfgfullpath="${servercfgdir}/${servercfg}" networkcfgfullpath="${servercfgdir}/${networkcfg}" ## Backup Directory diff --git a/lgsm/config-default/config-lgsm/bb2server/_default.cfg b/lgsm/config-default/config-lgsm/bb2server/_default.cfg index 976423a1e..39a901c06 100644 --- a/lgsm/config-default/config-lgsm/bb2server/_default.cfg +++ b/lgsm/config-default/config-lgsm/bb2server/_default.cfg @@ -158,7 +158,6 @@ executable="./srcds_run" servercfg="${selfname}.cfg" servercfgdefault="server.cfg" servercfgdir="${systemdir}/cfg" -servercfgfullpath="${servercfgdir}/${servercfg}" ## Backup Directory backupdir="${lgsmdir}/backup" diff --git a/lgsm/config-default/config-lgsm/bbserver/_default.cfg b/lgsm/config-default/config-lgsm/bbserver/_default.cfg index 64dc10d11..9327a352e 100644 --- a/lgsm/config-default/config-lgsm/bbserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/bbserver/_default.cfg @@ -153,7 +153,6 @@ executable="./hlds_run" servercfg="${selfname}.cfg" servercfgdefault="server.cfg" servercfgdir="${systemdir}" -servercfgfullpath="${servercfgdir}/${servercfg}" ## Backup Directory backupdir="${lgsmdir}/backup" diff --git a/lgsm/config-default/config-lgsm/bdserver/_default.cfg b/lgsm/config-default/config-lgsm/bdserver/_default.cfg index daaba9f6b..d880d0509 100644 --- a/lgsm/config-default/config-lgsm/bdserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/bdserver/_default.cfg @@ -152,7 +152,6 @@ executable="./hlds_run" servercfg="${selfname}.cfg" servercfgdefault="server.cfg" servercfgdir="${systemdir}" -servercfgfullpath="${servercfgdir}/${servercfg}" ## Backup Directory backupdir="${lgsmdir}/backup" diff --git a/lgsm/config-default/config-lgsm/bf1942server/_default.cfg b/lgsm/config-default/config-lgsm/bf1942server/_default.cfg index 69974740e..f74433d8c 100644 --- a/lgsm/config-default/config-lgsm/bf1942server/_default.cfg +++ b/lgsm/config-default/config-lgsm/bf1942server/_default.cfg @@ -137,7 +137,6 @@ executable="./start.sh" servercfg="serversettings.con" servercfgdefault="serversettings.con" servercfgdir="${systemdir}/mods/bf1942/settings" -servercfgfullpath="${servercfgdir}/${servercfg}" ## Backup Directory backupdir="${lgsmdir}/backup" diff --git a/lgsm/config-default/config-lgsm/bmdmserver/_default.cfg b/lgsm/config-default/config-lgsm/bmdmserver/_default.cfg index 45dce5225..296c5ccf2 100644 --- a/lgsm/config-default/config-lgsm/bmdmserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/bmdmserver/_default.cfg @@ -158,7 +158,6 @@ executable="./srcds_run" servercfg="${selfname}.cfg" servercfgdefault="server.cfg" servercfgdir="${systemdir}/cfg" -servercfgfullpath="${servercfgdir}/${servercfg}" ## Backup Directory backupdir="${lgsmdir}/backup" diff --git a/lgsm/config-default/config-lgsm/boserver/_default.cfg b/lgsm/config-default/config-lgsm/boserver/_default.cfg index 3a3f3e5d5..8d8a1ec87 100644 --- a/lgsm/config-default/config-lgsm/boserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/boserver/_default.cfg @@ -151,7 +151,6 @@ executable="./BODS.x86" servercfg="${selfname}.txt" servercfgdefault="config.txt" servercfgdir="${systemdir}" -servercfgfullpath="${servercfgdir}/${servercfg}" ## Backup Directory backupdir="${lgsmdir}/backup" diff --git a/lgsm/config-default/config-lgsm/bsserver/_default.cfg b/lgsm/config-default/config-lgsm/bsserver/_default.cfg index 9ff4abdb8..31c735009 100644 --- a/lgsm/config-default/config-lgsm/bsserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/bsserver/_default.cfg @@ -162,7 +162,6 @@ executable="./srcds_run.sh" servercfg="${selfname}.cfg" servercfgdefault="server.cfg" servercfgdir="${systemdir}/cfg" -servercfgfullpath="${servercfgdir}/${servercfg}" ## Backup Directory backupdir="${lgsmdir}/backup" diff --git a/lgsm/config-default/config-lgsm/bt1944server/_default.cfg b/lgsm/config-default/config-lgsm/bt1944server/_default.cfg index 22e0f1c3d..4f59bb38c 100644 --- a/lgsm/config-default/config-lgsm/bt1944server/_default.cfg +++ b/lgsm/config-default/config-lgsm/bt1944server/_default.cfg @@ -150,7 +150,6 @@ executable="./BattalionServer" servercfg="${selfname}.ini" servercfgdefault="DefaultGame.ini" servercfgdir="${systemdir}/Saved/Config/LinuxServer" -servercfgfullpath="${servercfgdir}/${servercfg}" ## Backup Directory backupdir="${lgsmdir}/backup" diff --git a/lgsm/config-default/config-lgsm/btserver/_default.cfg b/lgsm/config-default/config-lgsm/btserver/_default.cfg index 97b4db1c2..5e2115d74 100644 --- a/lgsm/config-default/config-lgsm/btserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/btserver/_default.cfg @@ -145,7 +145,6 @@ executable="./DedicatedServer.exe" servercfg="serversettings.xml" servercfgdefault="serversettings.xml" servercfgdir="${systemdir}" -servercfgfullpath="${servercfgdir}/${servercfg}" ## Backup Directory backupdir="${lgsmdir}/backup" diff --git a/lgsm/config-default/config-lgsm/ccserver/_default.cfg b/lgsm/config-default/config-lgsm/ccserver/_default.cfg index 2f1b11818..757361eb5 100644 --- a/lgsm/config-default/config-lgsm/ccserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/ccserver/_default.cfg @@ -153,7 +153,6 @@ executable="./srcds_run" servercfg="${selfname}.cfg" servercfgdefault="server.cfg" servercfgdir="${systemdir}/cfg" -servercfgfullpath="${servercfgdir}/${servercfg}" ## Backup Directory backupdir="${lgsmdir}/backup" diff --git a/lgsm/config-default/config-lgsm/cod2server/_default.cfg b/lgsm/config-default/config-lgsm/cod2server/_default.cfg index 18e0b8678..8184bd7eb 100644 --- a/lgsm/config-default/config-lgsm/cod2server/_default.cfg +++ b/lgsm/config-default/config-lgsm/cod2server/_default.cfg @@ -140,7 +140,6 @@ executable="./cod2_lnxded" servercfg="${selfname}.cfg" servercfgdefault="server.cfg" servercfgdir="${systemdir}/main" -servercfgfullpath="${servercfgdir}/${servercfg}" ## Backup Directory backupdir="${lgsmdir}/backup" diff --git a/lgsm/config-default/config-lgsm/cod4server/_default.cfg b/lgsm/config-default/config-lgsm/cod4server/_default.cfg index b2efc329c..8d4ae0c60 100644 --- a/lgsm/config-default/config-lgsm/cod4server/_default.cfg +++ b/lgsm/config-default/config-lgsm/cod4server/_default.cfg @@ -140,7 +140,6 @@ executable="./cod4x18_dedrun" servercfg="${selfname}.cfg" servercfgdefault="server.cfg" servercfgdir="${systemdir}/main" -servercfgfullpath="${servercfgdir}/${servercfg}" ## Backup Directory backupdir="${lgsmdir}/backup" diff --git a/lgsm/config-default/config-lgsm/codserver/_default.cfg b/lgsm/config-default/config-lgsm/codserver/_default.cfg index e50e6184b..90319da8e 100644 --- a/lgsm/config-default/config-lgsm/codserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/codserver/_default.cfg @@ -140,7 +140,6 @@ executable="./cod_lnxded" servercfg="${selfname}.cfg" servercfgdefault="server.cfg" servercfgdir="${systemdir}/main" -servercfgfullpath="${servercfgdir}/${servercfg}" ## Backup Directory backupdir="${lgsmdir}/backup" diff --git a/lgsm/config-default/config-lgsm/coduoserver/_default.cfg b/lgsm/config-default/config-lgsm/coduoserver/_default.cfg index 7397f8504..154c3eaa7 100644 --- a/lgsm/config-default/config-lgsm/coduoserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/coduoserver/_default.cfg @@ -140,7 +140,6 @@ executable="./coduo_lnxded" servercfg="${selfname}.cfg" servercfgdefault="server.cfg" servercfgdir="${systemdir}/uo" -servercfgfullpath="${servercfgdir}/${servercfg}" ## Backup Directory backupdir="${lgsmdir}/backup" diff --git a/lgsm/config-default/config-lgsm/codwawserver/_default.cfg b/lgsm/config-default/config-lgsm/codwawserver/_default.cfg index a77fd2dd3..805c7d77b 100644 --- a/lgsm/config-default/config-lgsm/codwawserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/codwawserver/_default.cfg @@ -140,7 +140,6 @@ executable="./codwaw_lnxded" servercfg="${selfname}.cfg" servercfgdefault="server.cfg" servercfgdir="${systemdir}/main" -servercfgfullpath="${servercfgdir}/${servercfg}" ## Backup Directory backupdir="${lgsmdir}/backup" diff --git a/lgsm/config-default/config-lgsm/csczserver/_default.cfg b/lgsm/config-default/config-lgsm/csczserver/_default.cfg index 4c56cb6e1..d7b855f95 100644 --- a/lgsm/config-default/config-lgsm/csczserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/csczserver/_default.cfg @@ -153,7 +153,6 @@ executable="./hlds_run" servercfg="${selfname}.cfg" servercfgdefault="server.cfg" servercfgdir="${systemdir}" -servercfgfullpath="${servercfgdir}/${servercfg}" ## Backup Directory backupdir="${lgsmdir}/backup" diff --git a/lgsm/config-default/config-lgsm/csgoserver/_default.cfg b/lgsm/config-default/config-lgsm/csgoserver/_default.cfg index f4e242e99..a0d31cb74 100644 --- a/lgsm/config-default/config-lgsm/csgoserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/csgoserver/_default.cfg @@ -178,7 +178,6 @@ executable="./srcds_run" servercfg="${selfname}.cfg" servercfgdefault="server.cfg" servercfgdir="${systemdir}/cfg" -servercfgfullpath="${servercfgdir}/${servercfg}" ## Backup Directory backupdir="${lgsmdir}/backup" diff --git a/lgsm/config-default/config-lgsm/csserver/_default.cfg b/lgsm/config-default/config-lgsm/csserver/_default.cfg index bc27a535c..cbc140c8a 100644 --- a/lgsm/config-default/config-lgsm/csserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/csserver/_default.cfg @@ -153,7 +153,6 @@ executable="./hlds_run" servercfg="${selfname}.cfg" servercfgdefault="server.cfg" servercfgdir="${systemdir}" -servercfgfullpath="${servercfgdir}/${servercfg}" ## Backup Directory backupdir="${lgsmdir}/backup" diff --git a/lgsm/config-default/config-lgsm/cssserver/_default.cfg b/lgsm/config-default/config-lgsm/cssserver/_default.cfg index 5388b6123..e5fc863c7 100644 --- a/lgsm/config-default/config-lgsm/cssserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/cssserver/_default.cfg @@ -158,7 +158,6 @@ executable="./srcds_run" servercfg="${selfname}.cfg" servercfgdefault="server.cfg" servercfgdir="${systemdir}/cfg" -servercfgfullpath="${servercfgdir}/${servercfg}" ## Backup Directory backupdir="${lgsmdir}/backup" diff --git a/lgsm/config-default/config-lgsm/dabserver/_default.cfg b/lgsm/config-default/config-lgsm/dabserver/_default.cfg index c9347d8d4..76d946aee 100644 --- a/lgsm/config-default/config-lgsm/dabserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/dabserver/_default.cfg @@ -153,7 +153,6 @@ executable="./dabds.sh" servercfg="${selfname}.cfg" servercfgdefault="server.cfg" servercfgdir="${systemdir}/cfg" -servercfgfullpath="${servercfgdir}/${servercfg}" ## Backup Directory backupdir="${lgsmdir}/backup" diff --git a/lgsm/config-default/config-lgsm/dmcserver/_default.cfg b/lgsm/config-default/config-lgsm/dmcserver/_default.cfg index 7a11d77a8..23d322095 100644 --- a/lgsm/config-default/config-lgsm/dmcserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/dmcserver/_default.cfg @@ -153,7 +153,6 @@ executable="./hlds_run" servercfg="${selfname}.cfg" servercfgdefault="server.cfg" servercfgdir="${systemdir}" -servercfgfullpath="${servercfgdir}/${servercfg}" ## Backup Directory backupdir="${lgsmdir}/backup" diff --git a/lgsm/config-default/config-lgsm/dodserver/_default.cfg b/lgsm/config-default/config-lgsm/dodserver/_default.cfg index 50ea789b1..f20658753 100644 --- a/lgsm/config-default/config-lgsm/dodserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/dodserver/_default.cfg @@ -153,7 +153,6 @@ executable="./hlds_run" servercfg="${selfname}.cfg" servercfgdefault="server.cfg" servercfgdir="${systemdir}" -servercfgfullpath="${servercfgdir}/${servercfg}" ## Backup Directory backupdir="${lgsmdir}/backup" diff --git a/lgsm/config-default/config-lgsm/dodsserver/_default.cfg b/lgsm/config-default/config-lgsm/dodsserver/_default.cfg index b967ef72d..351eb76ec 100644 --- a/lgsm/config-default/config-lgsm/dodsserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/dodsserver/_default.cfg @@ -153,7 +153,6 @@ executable="./srcds_run" servercfg="${selfname}.cfg" servercfgdefault="server.cfg" servercfgdir="${systemdir}/cfg" -servercfgfullpath="${servercfgdir}/${servercfg}" ## Backup Directory backupdir="${lgsmdir}/backup" diff --git a/lgsm/config-default/config-lgsm/doiserver/_default.cfg b/lgsm/config-default/config-lgsm/doiserver/_default.cfg index eebbdf699..ae0932f78 100644 --- a/lgsm/config-default/config-lgsm/doiserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/doiserver/_default.cfg @@ -154,7 +154,6 @@ executable="./srcds_run" servercfg="${selfname}.cfg" servercfgdefault="server.cfg" servercfgdir="${systemdir}/cfg" -servercfgfullpath="${servercfgdir}/${servercfg}" ## Backup Directory backupdir="${lgsmdir}/backup" diff --git a/lgsm/config-default/config-lgsm/dstserver/_default.cfg b/lgsm/config-default/config-lgsm/dstserver/_default.cfg index a7025a966..6b96bc7ed 100644 --- a/lgsm/config-default/config-lgsm/dstserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/dstserver/_default.cfg @@ -155,7 +155,6 @@ executabledir="${serverfiles}/bin" executable="./dontstarve_dedicated_server_nullrenderer" servercfg="server.ini" servercfgdir="${clustercfgdir}/${shard}" -servercfgfullpath="${servercfgdir}/${servercfg}" servercfgdefault="server.ini" clustercfg="cluster.ini" clustercfgdir="${persistentstorageroot}/${confdir}/${cluster}" diff --git a/lgsm/config-default/config-lgsm/dysserver/_default.cfg b/lgsm/config-default/config-lgsm/dysserver/_default.cfg index 501fe475e..2ff9654f8 100644 --- a/lgsm/config-default/config-lgsm/dysserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/dysserver/_default.cfg @@ -158,7 +158,6 @@ executable="./srcds_run.sh" servercfg="${selfname}.cfg" servercfgdefault="server.cfg" servercfgdir="${systemdir}/cfg" -servercfgfullpath="${servercfgdir}/${servercfg}" ## Backup Directory backupdir="${lgsmdir}/backup" diff --git a/lgsm/config-default/config-lgsm/ecoserver/_default.cfg b/lgsm/config-default/config-lgsm/ecoserver/_default.cfg index fe53ee5f8..5478d3733 100644 --- a/lgsm/config-default/config-lgsm/ecoserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/ecoserver/_default.cfg @@ -145,7 +145,6 @@ executable="mono ./EcoServer.exe" servercfg="Network.eco" servercfgdefault="Network.eco" servercfgdir="${systemdir}/Configs" -servercfgfullpath="${servercfgdir}/${servercfg}" ## Backup Directory backupdir="${lgsmdir}/backup" diff --git a/lgsm/config-default/config-lgsm/emserver/_default.cfg b/lgsm/config-default/config-lgsm/emserver/_default.cfg index 75445659c..62d8b6eba 100644 --- a/lgsm/config-default/config-lgsm/emserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/emserver/_default.cfg @@ -158,7 +158,6 @@ executable="./srcds_run" servercfg="${selfname}.cfg" servercfgdefault="server.cfg" servercfgdir="${systemdir}/cfg" -servercfgfullpath="${servercfgdir}/${servercfg}" ## Backup Directory backupdir="${lgsmdir}/backup" diff --git a/lgsm/config-default/config-lgsm/etlserver/_default.cfg b/lgsm/config-default/config-lgsm/etlserver/_default.cfg index 7813caa17..4d98e2f87 100644 --- a/lgsm/config-default/config-lgsm/etlserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/etlserver/_default.cfg @@ -134,7 +134,6 @@ executable="./etlded" servercfg="${selfname}.cfg" servercfgdefault="server.cfg" servercfgdir="${systemdir}/etmain" -servercfgfullpath="${servercfgdir}/${servercfg}" ## Backup Directory backupdir="${lgsmdir}/backup" diff --git a/lgsm/config-default/config-lgsm/fctrserver/_default.cfg b/lgsm/config-default/config-lgsm/fctrserver/_default.cfg index c071e01f3..42e8fb77a 100644 --- a/lgsm/config-default/config-lgsm/fctrserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/fctrserver/_default.cfg @@ -145,7 +145,6 @@ executable="./factorio" servercfg="${selfname}.json" servercfgdefault="server-settings.json" servercfgdir="${serverfiles}/data" -servercfgfullpath="${servercfgdir}/${servercfg}" ## Backup Directory backupdir="${lgsmdir}/backup" diff --git a/lgsm/config-default/config-lgsm/fofserver/_default.cfg b/lgsm/config-default/config-lgsm/fofserver/_default.cfg index 5c1e44af6..c7db4f875 100644 --- a/lgsm/config-default/config-lgsm/fofserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/fofserver/_default.cfg @@ -153,7 +153,6 @@ executable="./srcds_run" servercfg="${selfname}.cfg" servercfgdefault="server.cfg" servercfgdir="${systemdir}/cfg" -servercfgfullpath="${servercfgdir}/${servercfg}" ## Backup Directory backupdir="${lgsmdir}/backup" diff --git a/lgsm/config-default/config-lgsm/gesserver/_default.cfg b/lgsm/config-default/config-lgsm/gesserver/_default.cfg index a88fe3cff..aa318ba44 100644 --- a/lgsm/config-default/config-lgsm/gesserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/gesserver/_default.cfg @@ -153,7 +153,6 @@ executable="./srcds_run" servercfg="${selfname}.cfg" servercfgdefault="server.cfg" servercfgdir="${systemdir}/cfg" -servercfgfullpath="${servercfgdir}/${servercfg}" ## Backup Directory backupdir="${lgsmdir}/backup" diff --git a/lgsm/config-default/config-lgsm/gmodserver/_default.cfg b/lgsm/config-default/config-lgsm/gmodserver/_default.cfg index b12b1e551..25624c1f2 100644 --- a/lgsm/config-default/config-lgsm/gmodserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/gmodserver/_default.cfg @@ -170,7 +170,6 @@ executable="./srcds_run" servercfg="${selfname}.cfg" servercfgdefault="server.cfg" servercfgdir="${systemdir}/cfg" -servercfgfullpath="${servercfgdir}/${servercfg}" ## Backup Directory backupdir="${lgsmdir}/backup" diff --git a/lgsm/config-default/config-lgsm/hl2dmserver/_default.cfg b/lgsm/config-default/config-lgsm/hl2dmserver/_default.cfg index 4ff3998a1..5d5f7dd5f 100644 --- a/lgsm/config-default/config-lgsm/hl2dmserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/hl2dmserver/_default.cfg @@ -153,7 +153,6 @@ executable="./srcds_run" servercfg="${selfname}.cfg" servercfgdefault="server.cfg" servercfgdir="${systemdir}/cfg" -servercfgfullpath="${servercfgdir}/${servercfg}" ## Backup Directory backupdir="${lgsmdir}/backup" diff --git a/lgsm/config-default/config-lgsm/hldmserver/_default.cfg b/lgsm/config-default/config-lgsm/hldmserver/_default.cfg index de4ab821d..7eb45b573 100644 --- a/lgsm/config-default/config-lgsm/hldmserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/hldmserver/_default.cfg @@ -152,7 +152,6 @@ executable="./hlds_run" servercfg="${selfname}.cfg" servercfgdefault="server.cfg" servercfgdir="${systemdir}" -servercfgfullpath="${servercfgdir}/${servercfg}" ## Backup Directory backupdir="${lgsmdir}/backup" diff --git a/lgsm/config-default/config-lgsm/hldmsserver/_default.cfg b/lgsm/config-default/config-lgsm/hldmsserver/_default.cfg index c73331705..82bd1e113 100644 --- a/lgsm/config-default/config-lgsm/hldmsserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/hldmsserver/_default.cfg @@ -153,7 +153,6 @@ executable="./srcds_run" servercfg="${selfname}.cfg" servercfgdefault="server.cfg" servercfgdir="${systemdir}/cfg" -servercfgfullpath="${servercfgdir}/${servercfg}" ## Backup Directory backupdir="${lgsmdir}/backup" diff --git a/lgsm/config-default/config-lgsm/insserver/_default.cfg b/lgsm/config-default/config-lgsm/insserver/_default.cfg index d595be7ff..7b0d2d5bb 100644 --- a/lgsm/config-default/config-lgsm/insserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/insserver/_default.cfg @@ -159,7 +159,6 @@ executable="./srcds_run" servercfg="${selfname}.cfg" servercfgdefault="server.cfg" servercfgdir="${systemdir}/cfg" -servercfgfullpath="${servercfgdir}/${servercfg}" ## Backup Directory backupdir="${lgsmdir}/backup" diff --git a/lgsm/config-default/config-lgsm/inssserver/_default.cfg b/lgsm/config-default/config-lgsm/inssserver/_default.cfg index cd66169d6..7c715c54d 100644 --- a/lgsm/config-default/config-lgsm/inssserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/inssserver/_default.cfg @@ -160,7 +160,6 @@ executable="./InsurgencyServer-Linux-Shipping" servercfg="Game.ini" servercfgdefault="Game.ini" servercfgdir="${systemdir}/Saved/Config/LinuxServer" -servercfgfullpath="${servercfgdir}/${servercfg}" ## Backup Directory backupdir="${lgsmdir}/backup" diff --git a/lgsm/config-default/config-lgsm/iosserver/_default.cfg b/lgsm/config-default/config-lgsm/iosserver/_default.cfg index 7e63ed0f2..ee32b013c 100644 --- a/lgsm/config-default/config-lgsm/iosserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/iosserver/_default.cfg @@ -153,7 +153,6 @@ executable="./srcds_run" servercfg="${selfname}.cfg" servercfgdefault="server.cfg" servercfgdir="${systemdir}/cfg" -servercfgfullpath="${servercfgdir}/${servercfg}" ## Backup Directory backupdir="${lgsmdir}/backup" diff --git a/lgsm/config-default/config-lgsm/jc2server/_default.cfg b/lgsm/config-default/config-lgsm/jc2server/_default.cfg index deccd031d..5f0731f1e 100644 --- a/lgsm/config-default/config-lgsm/jc2server/_default.cfg +++ b/lgsm/config-default/config-lgsm/jc2server/_default.cfg @@ -145,7 +145,6 @@ executable="./Jcmp-Server" servercfg="config.lua" servercfgdefault="config.lua" servercfgdir="${serverfiles}" -servercfgfullpath="${servercfgdir}/${servercfg}" ## Backup Directory backupdir="${lgsmdir}/backup" diff --git a/lgsm/config-default/config-lgsm/jc3server/_default.cfg b/lgsm/config-default/config-lgsm/jc3server/_default.cfg index 44d668dda..301453803 100644 --- a/lgsm/config-default/config-lgsm/jc3server/_default.cfg +++ b/lgsm/config-default/config-lgsm/jc3server/_default.cfg @@ -145,7 +145,6 @@ executable="./Server" servercfg="config.json" servercfgdefault="config.json" servercfgdir="${serverfiles}" -servercfgfullpath="${servercfgdir}/${servercfg}" ## Backup Directory backupdir="${lgsmdir}/backup" diff --git a/lgsm/config-default/config-lgsm/kf2server/_default.cfg b/lgsm/config-default/config-lgsm/kf2server/_default.cfg index 6e31023be..5f69d4841 100644 --- a/lgsm/config-default/config-lgsm/kf2server/_default.cfg +++ b/lgsm/config-default/config-lgsm/kf2server/_default.cfg @@ -150,7 +150,6 @@ executable="./KFGameSteamServer.bin.x86_64" servercfgdir="${systemdir}/KFGame/Config/${selfname}" servercfg="LinuxServer-KFGame.ini" servercfgdefault="LinuxServer-KFGame.ini" -servercfgfullpath="${servercfgdir}/${servercfg}" ## Backup Directory backupdir="${lgsmdir}/backup" diff --git a/lgsm/config-default/config-lgsm/kfserver/_default.cfg b/lgsm/config-default/config-lgsm/kfserver/_default.cfg index ec86c5369..4511427fb 100644 --- a/lgsm/config-default/config-lgsm/kfserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/kfserver/_default.cfg @@ -158,7 +158,6 @@ executable="./ucc-bin" servercfg="${selfname}.ini" servercfgdefault="Default.ini" servercfgdir="${systemdir}" -servercfgfullpath="${servercfgdir}/${servercfg}" compressedmapsdir="${rootdir}/Maps-Compressed" ## Backup Directory diff --git a/lgsm/config-default/config-lgsm/l4d2server/_default.cfg b/lgsm/config-default/config-lgsm/l4d2server/_default.cfg index ca29ca183..e02987024 100644 --- a/lgsm/config-default/config-lgsm/l4d2server/_default.cfg +++ b/lgsm/config-default/config-lgsm/l4d2server/_default.cfg @@ -152,7 +152,6 @@ executable="./srcds_run" servercfg="${selfname}.cfg" servercfgdefault="server.cfg" servercfgdir="${systemdir}/cfg" -servercfgfullpath="${servercfgdir}/${servercfg}" ## Backup Directory backupdir="${lgsmdir}/backup" diff --git a/lgsm/config-default/config-lgsm/l4dserver/_default.cfg b/lgsm/config-default/config-lgsm/l4dserver/_default.cfg index 2181c81f1..dbfd0fd47 100644 --- a/lgsm/config-default/config-lgsm/l4dserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/l4dserver/_default.cfg @@ -152,7 +152,6 @@ executable="./srcds_run" servercfg="server.cfg" servercfgdefault="server.cfg" servercfgdir="${systemdir}/cfg" -servercfgfullpath="${servercfgdir}/${servercfg}" ## Backup Directory backupdir="${lgsmdir}/backup" diff --git a/lgsm/config-default/config-lgsm/mcserver/_default.cfg b/lgsm/config-default/config-lgsm/mcserver/_default.cfg index 3af034613..976d6e79b 100644 --- a/lgsm/config-default/config-lgsm/mcserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/mcserver/_default.cfg @@ -143,7 +143,6 @@ executable="java -Xmx${javaram}M -jar ${serverfiles}/minecraft_server.jar" servercfg="server.properties" servercfgdefault="server.properties" servercfgdir="${serverfiles}" -servercfgfullpath="${servercfgdir}/${servercfg}" ## Backup Directory backupdir="${lgsmdir}/backup" diff --git a/lgsm/config-default/config-lgsm/mhserver/_default.cfg b/lgsm/config-default/config-lgsm/mhserver/_default.cfg index dc80cc318..9131331fe 100644 --- a/lgsm/config-default/config-lgsm/mhserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/mhserver/_default.cfg @@ -153,7 +153,6 @@ executable="./MordhauServer-Linux-Shipping" servercfg="Game.ini" servercfgdefault="Game.ini" servercfgdir="${systemdir}/Saved/Config/LinuxServer" -servercfgfullpath="${servercfgdir}/${servercfg}" ## Backup Directory backupdir="${lgsmdir}/backup" diff --git a/lgsm/config-default/config-lgsm/mohaaserver/_default.cfg b/lgsm/config-default/config-lgsm/mohaaserver/_default.cfg index ad386e280..4bad82116 100644 --- a/lgsm/config-default/config-lgsm/mohaaserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/mohaaserver/_default.cfg @@ -139,7 +139,6 @@ executable="./mohaa_lnxded" servercfg="${selfname}.cfg" servercfgdefault="server.cfg" servercfgdir="${serverfiles}" -servercfgfullpath="${serverfiles}/${servercfg}" ## Backup Directory backupdir="${lgsmdir}/backup" diff --git a/lgsm/config-default/config-lgsm/mtaserver/_default.cfg b/lgsm/config-default/config-lgsm/mtaserver/_default.cfg index 03f6f4321..65c7f39fc 100644 --- a/lgsm/config-default/config-lgsm/mtaserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/mtaserver/_default.cfg @@ -138,7 +138,6 @@ executabledir="${systemdir}" executable="./mta-server64" servercfg="mtaserver.conf" servercfgdir="${systemdir}/mods/deathmatch" -servercfgfullpath="${servercfgdir}/${servercfg}" ## Backup Directory backupdir="${lgsmdir}/backup" diff --git a/lgsm/config-default/config-lgsm/mumbleserver/_default.cfg b/lgsm/config-default/config-lgsm/mumbleserver/_default.cfg index fffde2f51..56a146b1f 100644 --- a/lgsm/config-default/config-lgsm/mumbleserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/mumbleserver/_default.cfg @@ -138,7 +138,6 @@ executable="./murmur.x86" servercfg="${selfname}.ini" servercfgdefault="murmur.ini" servercfgdir="${serverfiles}" -servercfgfullpath="${servercfgdir}/${servercfg}" ## Backup Directory backupdir="${lgsmdir}/backup" diff --git a/lgsm/config-default/config-lgsm/ndserver/_default.cfg b/lgsm/config-default/config-lgsm/ndserver/_default.cfg index d37f44f1f..ee31aeffc 100644 --- a/lgsm/config-default/config-lgsm/ndserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/ndserver/_default.cfg @@ -153,7 +153,6 @@ executable="./srcds_run" servercfg="${selfname}.cfg" servercfgdefault="server.cfg" servercfgdir="${systemdir}/cfg" -servercfgfullpath="${servercfgdir}/${servercfg}" ## Backup Directory backupdir="${lgsmdir}/backup" diff --git a/lgsm/config-default/config-lgsm/nmrihserver/_default.cfg b/lgsm/config-default/config-lgsm/nmrihserver/_default.cfg index a2aac7eb3..88b7f7f3b 100644 --- a/lgsm/config-default/config-lgsm/nmrihserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/nmrihserver/_default.cfg @@ -158,7 +158,6 @@ executable="./srcds_run" servercfg="${selfname}.cfg" servercfgdefault="server.cfg" servercfgdir="${systemdir}/cfg" -servercfgfullpath="${servercfgdir}/${servercfg}" ## Backup Directory backupdir="${lgsmdir}/backup" diff --git a/lgsm/config-default/config-lgsm/ns2cserver/_default.cfg b/lgsm/config-default/config-lgsm/ns2cserver/_default.cfg index 9dbb28592..45064800b 100644 --- a/lgsm/config-default/config-lgsm/ns2cserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/ns2cserver/_default.cfg @@ -158,7 +158,6 @@ systemdir="${serverfiles}" executabledir="${serverfiles}/ia32" executable="./ns2combatserver_linux32" servercfgdir="${serverfiles}/${selfname}" -servercfgfullpath="${servercfgdir}" modstoragedir="${servercfgdir}/Workshop" ## Backup Directory diff --git a/lgsm/config-default/config-lgsm/ns2server/_default.cfg b/lgsm/config-default/config-lgsm/ns2server/_default.cfg index 9b042130f..7996fba74 100644 --- a/lgsm/config-default/config-lgsm/ns2server/_default.cfg +++ b/lgsm/config-default/config-lgsm/ns2server/_default.cfg @@ -162,7 +162,6 @@ systemdir="${serverfiles}" executabledir="${serverfiles}/x64" executable="./server_linux" servercfgdir="${serverfiles}/${selfname}" -servercfgfullpath="${servercfgdir}" modstoragedir="${servercfgdir}/Workshop" ## Backup Directory diff --git a/lgsm/config-default/config-lgsm/nsserver/_default.cfg b/lgsm/config-default/config-lgsm/nsserver/_default.cfg index ad85b88c6..e59b8f771 100644 --- a/lgsm/config-default/config-lgsm/nsserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/nsserver/_default.cfg @@ -153,7 +153,6 @@ executable="./hlds_run" servercfg="${selfname}.cfg" servercfgdefault="server.cfg" servercfgdir="${systemdir}" -servercfgfullpath="${servercfgdir}/${servercfg}" ## Backup Directory backupdir="${lgsmdir}/backup" diff --git a/lgsm/config-default/config-lgsm/opforserver/_default.cfg b/lgsm/config-default/config-lgsm/opforserver/_default.cfg index b5c9a30e5..048d09c8d 100644 --- a/lgsm/config-default/config-lgsm/opforserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/opforserver/_default.cfg @@ -153,7 +153,6 @@ executable="./hlds_run" servercfg="${selfname}.cfg" servercfgdefault="server.cfg" servercfgdir="${systemdir}" -servercfgfullpath="${servercfgdir}/${servercfg}" ## Backup Directory backupdir="${lgsmdir}/backup" diff --git a/lgsm/config-default/config-lgsm/pcserver/_default.cfg b/lgsm/config-default/config-lgsm/pcserver/_default.cfg index d9c65db4d..f1dc3d2f0 100644 --- a/lgsm/config-default/config-lgsm/pcserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/pcserver/_default.cfg @@ -145,7 +145,6 @@ executable="./DedicatedServerCmd" servercfg="${selfname}.cfg" servercfgdefault="server.cfg" servercfgdir="${systemdir}" -servercfgfullpath="${servercfgdir}/${servercfg}" ## Backup Directory backupdir="${lgsmdir}/backup" diff --git a/lgsm/config-default/config-lgsm/pstbsserver/_default.cfg b/lgsm/config-default/config-lgsm/pstbsserver/_default.cfg index c8ea594e7..7b113335e 100644 --- a/lgsm/config-default/config-lgsm/pstbsserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/pstbsserver/_default.cfg @@ -154,7 +154,6 @@ executable="./PostScriptumServer.sh" servercfg="Server.cfg" servercfgdefault="Server.cfg" servercfgdir="${systemdir}/ServerConfig" -servercfgfullpath="${servercfgdir}/${servercfg}" ## Backup Directory backupdir="${lgsmdir}/backup" diff --git a/lgsm/config-default/config-lgsm/pvkiiserver/_default.cfg b/lgsm/config-default/config-lgsm/pvkiiserver/_default.cfg index a38ba25cd..17b88e13b 100644 --- a/lgsm/config-default/config-lgsm/pvkiiserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/pvkiiserver/_default.cfg @@ -153,7 +153,6 @@ executable="./srcds_run" servercfg="${selfname}.cfg" servercfgdefault="server.cfg" servercfgdir="${systemdir}/cfg" -servercfgfullpath="${servercfgdir}/${servercfg}" ## Backup Directory backupdir="${lgsmdir}/backup" diff --git a/lgsm/config-default/config-lgsm/pzserver/_default.cfg b/lgsm/config-default/config-lgsm/pzserver/_default.cfg index 9373f9a0f..c7abf6e2b 100644 --- a/lgsm/config-default/config-lgsm/pzserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/pzserver/_default.cfg @@ -148,7 +148,6 @@ executable="./start-server.sh" servercfg="${selfname}.ini" servercfgdefault="server.ini" servercfgdir="${HOME}/Zomboid/Server" -servercfgfullpath="${servercfgdir}/${servercfg}" ## Backup Directory backupdir="${lgsmdir}/backup" diff --git a/lgsm/config-default/config-lgsm/q2server/_default.cfg b/lgsm/config-default/config-lgsm/q2server/_default.cfg index 7d28a1cbe..7d65a83ac 100644 --- a/lgsm/config-default/config-lgsm/q2server/_default.cfg +++ b/lgsm/config-default/config-lgsm/q2server/_default.cfg @@ -139,7 +139,6 @@ executable="./quake2" servercfg="${selfname}.cfg" servercfgdefault="server.cfg" servercfgdir="${systemdir}" -servercfgfullpath="${servercfgdir}/${servercfg}" ## Backup Directory backupdir="${lgsmdir}/backup" diff --git a/lgsm/config-default/config-lgsm/q3server/_default.cfg b/lgsm/config-default/config-lgsm/q3server/_default.cfg index b9b9f6b81..a224a59d0 100644 --- a/lgsm/config-default/config-lgsm/q3server/_default.cfg +++ b/lgsm/config-default/config-lgsm/q3server/_default.cfg @@ -139,7 +139,6 @@ executable="./q3ded" servercfg="${selfname}.cfg" servercfgdefault="server.cfg" servercfgdir="${systemdir}" -servercfgfullpath="${servercfgdir}/${servercfg}" ## Backup Directory backupdir="${lgsmdir}/backup" diff --git a/lgsm/config-default/config-lgsm/qlserver/_default.cfg b/lgsm/config-default/config-lgsm/qlserver/_default.cfg index 2e3597261..c110cac07 100644 --- a/lgsm/config-default/config-lgsm/qlserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/qlserver/_default.cfg @@ -147,7 +147,6 @@ executable=$([ "$(uname -m)" == "x86_64" ] && echo -e "./run_server_x64.sh" || e servercfg="${selfname}.cfg" servercfgdefault="server.cfg" servercfgdir="${serverfiles}/baseq3" -servercfgfullpath="${servercfgdir}/${servercfg}" ## Backup Directory backupdir="${lgsmdir}/backup" diff --git a/lgsm/config-default/config-lgsm/qwserver/_default.cfg b/lgsm/config-default/config-lgsm/qwserver/_default.cfg index ee1d88eef..31a8afb63 100644 --- a/lgsm/config-default/config-lgsm/qwserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/qwserver/_default.cfg @@ -138,7 +138,6 @@ executable="./mvdsv" servercfg="${selfname}.cfg" servercfgdefault="server.cfg" servercfgdir="${systemdir}" -servercfgfullpath="${servercfgdir}/${servercfg}" ## Backup Directory backupdir="${lgsmdir}/backup" diff --git a/lgsm/config-default/config-lgsm/ricochetserver/_default.cfg b/lgsm/config-default/config-lgsm/ricochetserver/_default.cfg index 0117dbd61..2b5a3522c 100644 --- a/lgsm/config-default/config-lgsm/ricochetserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/ricochetserver/_default.cfg @@ -153,7 +153,6 @@ executable="./hlds_run" servercfg="${selfname}.cfg" servercfgdefault="server.cfg" servercfgdir="${systemdir}" -servercfgfullpath="${servercfgdir}/${servercfg}" ## Backup Directory backupdir="${lgsmdir}/backup" diff --git a/lgsm/config-default/config-lgsm/roserver/_default.cfg b/lgsm/config-default/config-lgsm/roserver/_default.cfg index ac2e2d845..15f56c2e5 100644 --- a/lgsm/config-default/config-lgsm/roserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/roserver/_default.cfg @@ -154,7 +154,6 @@ executable="./ucc-bin" servercfg="${selfname}.ini" servercfgdefault="default.ini" servercfgdir="${systemdir}" -servercfgfullpath="${servercfgdir}/${servercfg}" compressedmapsdir="${rootdir}/Maps-Compressed" ## Backup Directory diff --git a/lgsm/config-default/config-lgsm/rtcwserver/_default.cfg b/lgsm/config-default/config-lgsm/rtcwserver/_default.cfg index c54f98369..f16d5c89e 100644 --- a/lgsm/config-default/config-lgsm/rtcwserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/rtcwserver/_default.cfg @@ -139,7 +139,6 @@ executable="./iowolfded.x86_64" servercfg="${selfname}.cfg" servercfgdefault="server.cfg" servercfgdir="${systemdir}" -servercfgfullpath="${servercfgdir}/${servercfg}" ## Backup Directory backupdir="${lgsmdir}/backup" diff --git a/lgsm/config-default/config-lgsm/rustserver/_default.cfg b/lgsm/config-default/config-lgsm/rustserver/_default.cfg index cf622175c..7171bcc2d 100644 --- a/lgsm/config-default/config-lgsm/rustserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/rustserver/_default.cfg @@ -178,7 +178,6 @@ serveridentitydir="${systemdir}/server/${selfname}" servercfg="server.cfg" servercfgdefault="server.cfg" servercfgdir="${serveridentitydir}/cfg" -servercfgfullpath="${servercfgdir}/${servercfg}" ## Backup Directory backupdir="${lgsmdir}/backup" diff --git a/lgsm/config-default/config-lgsm/rwserver/_default.cfg b/lgsm/config-default/config-lgsm/rwserver/_default.cfg index 89aea7cb2..17f06b7be 100644 --- a/lgsm/config-default/config-lgsm/rwserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/rwserver/_default.cfg @@ -148,7 +148,6 @@ executable="java -Xmx${javaram}m -jar ${serverfiles}/server.jar" servercfg="server.properties" servercfgdefault="server.properties" servercfgdir="${serverfiles}" -servercfgfullpath="${servercfgdir}/${servercfg}" ## Backup Directory backupdir="${lgsmdir}/backup" diff --git a/lgsm/config-default/config-lgsm/sampserver/_default.cfg b/lgsm/config-default/config-lgsm/sampserver/_default.cfg index fe7ac9111..4b2d7bf9b 100644 --- a/lgsm/config-default/config-lgsm/sampserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/sampserver/_default.cfg @@ -138,7 +138,6 @@ executable="./samp03svr" servercfg="server.cfg" servercfgdefault="server.cfg" servercfgdir="${systemdir}/samp03" -servercfgfullpath="${servercfgdir}/${servercfg}" ## Backup Directory backupdir="${lgsmdir}/backup" diff --git a/lgsm/config-default/config-lgsm/sbotsserver/_default.cfg b/lgsm/config-default/config-lgsm/sbotsserver/_default.cfg index 34c05d609..507cb8db6 100644 --- a/lgsm/config-default/config-lgsm/sbotsserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/sbotsserver/_default.cfg @@ -153,7 +153,6 @@ executable="./blank1Server-Linux-Shipping" servercfg="Game.ini" servercfgdefault="Game.ini" servercfgdir="${systemdir}/blank1/Saved/Config/LinuxServer" -servercfgfullpath="${servercfgdir}/${servercfg}" ## Backup Directory backupdir="${lgsmdir}/backup" diff --git a/lgsm/config-default/config-lgsm/sbserver/_default.cfg b/lgsm/config-default/config-lgsm/sbserver/_default.cfg index 4cb4a00aa..25e368531 100644 --- a/lgsm/config-default/config-lgsm/sbserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/sbserver/_default.cfg @@ -151,7 +151,6 @@ executable="./starbound_server" servercfg="starbound_server.config" servercfgdefault="starbound_server.config" servercfgdir="${serverfiles}/storage" -servercfgfullpath="${servercfgdir}/${servercfg}" ## Backup Directory backupdir="${lgsmdir}/backup" diff --git a/lgsm/config-default/config-lgsm/sdtdserver/_default.cfg b/lgsm/config-default/config-lgsm/sdtdserver/_default.cfg index d6cc4a109..a82a1884b 100644 --- a/lgsm/config-default/config-lgsm/sdtdserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/sdtdserver/_default.cfg @@ -145,11 +145,10 @@ glibc="2.15" systemdir="${serverfiles}" executabledir="${serverfiles}" executable=$([ "$(uname -m)" == "x86_64" ] && echo -e "./7DaysToDieServer.x86_64" || echo -e "./7DaysToDieServer.x86") +servercfg="${selfname}.xml" servercfgdefault="serverconfig.xml" -servercfgfullpathdefault="${serverfiles}/${servercfgdefault}" servercfgdir="${serverfiles}" -servercfg="${selfname}.xml" -servercfgfullpath="${servercfgdir}/${servercfg}" +servercfgdirdefault="${serverfiles}" ## Backup Directory backupdir="${lgsmdir}/backup" diff --git a/lgsm/config-default/config-lgsm/sfcserver/_default.cfg b/lgsm/config-default/config-lgsm/sfcserver/_default.cfg index 04743cab2..87ceb5ac8 100644 --- a/lgsm/config-default/config-lgsm/sfcserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/sfcserver/_default.cfg @@ -153,7 +153,6 @@ executable="./srcds_run" servercfg="${selfname}.cfg" servercfgdefault="server.cfg" servercfgdir="${systemdir}/cfg" -servercfgfullpath="${servercfgdir}/${servercfg}" ## Backup Directory backupdir="${lgsmdir}/backup" diff --git a/lgsm/config-default/config-lgsm/sof2server/_default.cfg b/lgsm/config-default/config-lgsm/sof2server/_default.cfg index 36ef2b89b..4ed79bd37 100644 --- a/lgsm/config-default/config-lgsm/sof2server/_default.cfg +++ b/lgsm/config-default/config-lgsm/sof2server/_default.cfg @@ -139,7 +139,6 @@ executable="./sof2ded" servercfg="${selfname}.cfg" servercfgdefault="server.cfg" servercfgdir="${systemdir}" -servercfgfullpath="${servercfgdir}/${servercfg}" ## Backup Directory backupdir="${lgsmdir}/backup" diff --git a/lgsm/config-default/config-lgsm/solserver/_default.cfg b/lgsm/config-default/config-lgsm/solserver/_default.cfg index 1cf1f3491..908165bb9 100644 --- a/lgsm/config-default/config-lgsm/solserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/solserver/_default.cfg @@ -141,8 +141,6 @@ servercfgdir="${systemdir}" servercfg="soldat.ini" servercfgdefault="soldat.ini" -servercfgfullpath="${servercfgdir}/${servercfg}" - ## Backup Directory backupdir="${lgsmdir}/backup" diff --git a/lgsm/config-default/config-lgsm/squadserver/_default.cfg b/lgsm/config-default/config-lgsm/squadserver/_default.cfg index 633025284..1ef3b6194 100644 --- a/lgsm/config-default/config-lgsm/squadserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/squadserver/_default.cfg @@ -150,7 +150,6 @@ executable="./SquadGameServer.sh" servercfg="${selfname}.cfg" servercfgdefault="Server.cfg" servercfgdir="${systemdir}/ServerConfig" -servercfgfullpath="${servercfgdir}/${servercfg}" ## Backup Directory backupdir="${lgsmdir}/backup" diff --git a/lgsm/config-default/config-lgsm/ss3server/_default.cfg b/lgsm/config-default/config-lgsm/ss3server/_default.cfg index 349cd6673..11d32ea60 100644 --- a/lgsm/config-default/config-lgsm/ss3server/_default.cfg +++ b/lgsm/config-default/config-lgsm/ss3server/_default.cfg @@ -149,7 +149,6 @@ executable="./runSam3_DedicatedServer.sh" servercfg="${selfname}.ini" servercfgdefault="server.ini" servercfgdir="${serverfiles}/Content/SeriousSam3/Config" -servercfgfullpath="${servercfgdir}/${servercfg}" ## Backup Directory backupdir="${lgsmdir}/backup" diff --git a/lgsm/config-default/config-lgsm/stserver/_default.cfg b/lgsm/config-default/config-lgsm/stserver/_default.cfg index 4f1656375..35d399bcd 100644 --- a/lgsm/config-default/config-lgsm/stserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/stserver/_default.cfg @@ -155,7 +155,6 @@ executable="./rocketstation_DedicatedServer.x86_64" servercfg="default.ini" servercfgdefault="default.ini" servercfgdir="${systemdir}" -servercfgfullpath="${servercfgdir}/${servercfg}" ## Backup Directory backupdir="${lgsmdir}/backup" diff --git a/lgsm/config-default/config-lgsm/svenserver/_default.cfg b/lgsm/config-default/config-lgsm/svenserver/_default.cfg index bf35e6a20..efff4bf99 100644 --- a/lgsm/config-default/config-lgsm/svenserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/svenserver/_default.cfg @@ -152,7 +152,6 @@ executable="./svends_run" servercfg="${selfname}.cfg" servercfgdefault="server.cfg" servercfgdir="${systemdir}" -servercfgfullpath="${servercfgdir}/${servercfg}" ## Backup Directory backupdir="${lgsmdir}/backup" diff --git a/lgsm/config-default/config-lgsm/terrariaserver/_default.cfg b/lgsm/config-default/config-lgsm/terrariaserver/_default.cfg index 54956236c..b7525e35e 100644 --- a/lgsm/config-default/config-lgsm/terrariaserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/terrariaserver/_default.cfg @@ -152,7 +152,6 @@ executable="./TerrariaServer" servercfg="${selfname}.txt" servercfgdefault="serverconfig.txt" servercfgdir="${serverfiles}" -servercfgfullpath="${servercfgdir}/${servercfg}" ## Backup Directory backupdir="${lgsmdir}/backup" diff --git a/lgsm/config-default/config-lgsm/tf2server/_default.cfg b/lgsm/config-default/config-lgsm/tf2server/_default.cfg index 741f30a75..4eecf94c5 100644 --- a/lgsm/config-default/config-lgsm/tf2server/_default.cfg +++ b/lgsm/config-default/config-lgsm/tf2server/_default.cfg @@ -158,7 +158,6 @@ executable="./srcds_run" servercfg="${selfname}.cfg" servercfgdefault="server.cfg" servercfgdir="${systemdir}/cfg" -servercfgfullpath="${servercfgdir}/${servercfg}" ## Backup Directory backupdir="${lgsmdir}/backup" diff --git a/lgsm/config-default/config-lgsm/tfcserver/_default.cfg b/lgsm/config-default/config-lgsm/tfcserver/_default.cfg index 3a0d22ea5..f7d01e2e2 100644 --- a/lgsm/config-default/config-lgsm/tfcserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/tfcserver/_default.cfg @@ -153,7 +153,6 @@ executable="./hlds_run" servercfg="${selfname}.cfg" servercfgdefault="server.cfg" servercfgdir="${systemdir}" -servercfgfullpath="${servercfgdir}/${servercfg}" ## Backup Directory backupdir="${lgsmdir}/backup" diff --git a/lgsm/config-default/config-lgsm/ts3server/_default.cfg b/lgsm/config-default/config-lgsm/ts3server/_default.cfg index 7a721ec01..f1a682f66 100644 --- a/lgsm/config-default/config-lgsm/ts3server/_default.cfg +++ b/lgsm/config-default/config-lgsm/ts3server/_default.cfg @@ -141,7 +141,6 @@ executable="./ts3server" servercfg="${selfname}.ini" servercfgdefault="ts3server.ini" servercfgdir="${serverfiles}" -servercfgfullpath="${servercfgdir}/${servercfg}" ## Backup Directory backupdir="${lgsmdir}/backup" diff --git a/lgsm/config-default/config-lgsm/tsserver/_default.cfg b/lgsm/config-default/config-lgsm/tsserver/_default.cfg index c454e1f15..b3a53d960 100644 --- a/lgsm/config-default/config-lgsm/tsserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/tsserver/_default.cfg @@ -153,7 +153,6 @@ executable="./hlds_run" servercfg="${selfname}.cfg" servercfgdefault="server.cfg" servercfgdir="${systemdir}" -servercfgfullpath="${servercfgdir}/${servercfg}" ## Backup Directory backupdir="${lgsmdir}/backup" diff --git a/lgsm/config-default/config-lgsm/tuserver/_default.cfg b/lgsm/config-default/config-lgsm/tuserver/_default.cfg index acc711d2c..904e483fa 100644 --- a/lgsm/config-default/config-lgsm/tuserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/tuserver/_default.cfg @@ -155,7 +155,8 @@ executable="./TowerServer-Linux-Shipping" servercfg="${selfname}.ini" servercfgdefault="TowerServer.ini" servercfgdir="${systemdir}/Binaries/Linux" -servercfgfullpath="${servercfgdir}/${servercfg}" +servercfg="${servicename}.ini" +servercfgdefault="TowerServer.ini" ## Backup Directory backupdir="${lgsmdir}/backup" diff --git a/lgsm/config-default/config-lgsm/twserver/_default.cfg b/lgsm/config-default/config-lgsm/twserver/_default.cfg index e10305a94..e0720b72d 100644 --- a/lgsm/config-default/config-lgsm/twserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/twserver/_default.cfg @@ -152,7 +152,6 @@ executable="./teeworlds_srv" servercfg="${selfname}.cfg" # Teeworlds can also auto load any config if an autoexec.cfg file is present in the server dir servercfgdefault="server.cfg" servercfgdir="${serverfiles}/tw" -servercfgfullpath="${servercfgdir}/${servercfg}" ## Backup Directory backupdir="${lgsmdir}/backup" diff --git a/lgsm/config-default/config-lgsm/untserver/_default.cfg b/lgsm/config-default/config-lgsm/untserver/_default.cfg index 1b91ba923..78b80f8e1 100644 --- a/lgsm/config-default/config-lgsm/untserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/untserver/_default.cfg @@ -155,8 +155,6 @@ executable="./Unturned_Headless.x86_64" servercfgdir="${systemdir}/Servers/${selfname}" servercfg="Config.json" servercfgdefault="Config.json" -servercfgdir="${systemdir}/Servers/${selfname}" -servercfgfullpath="${servercfgdir}/${servercfg}" ## Backup Directory backupdir="${lgsmdir}/backup" diff --git a/lgsm/config-default/config-lgsm/ut2k4server/_default.cfg b/lgsm/config-default/config-lgsm/ut2k4server/_default.cfg index 74f026ea5..0402273b5 100644 --- a/lgsm/config-default/config-lgsm/ut2k4server/_default.cfg +++ b/lgsm/config-default/config-lgsm/ut2k4server/_default.cfg @@ -138,7 +138,6 @@ executable="./ucc-bin" servercfg="${selfname}.ini" servercfgdefault="UT2004.ini" servercfgdir="${systemdir}" -servercfgfullpath="${servercfgdir}/${servercfg}" compressedmapsdir="${rootdir}/Maps-Compressed" ## Backup Directory diff --git a/lgsm/config-default/config-lgsm/ut3server/_default.cfg b/lgsm/config-default/config-lgsm/ut3server/_default.cfg index 16998ea6c..eb1b49c52 100644 --- a/lgsm/config-default/config-lgsm/ut3server/_default.cfg +++ b/lgsm/config-default/config-lgsm/ut3server/_default.cfg @@ -149,7 +149,6 @@ executable="./ut3" servercfg="UTGame.ini" servercfgdefault="UTGame.ini" servercfgdir="${systemdir}/UTGame/Config/${selfname}" -servercfgfullpath="${servercfgdir}/${servercfg}" ## Backup Directory backupdir="${lgsmdir}/backup" diff --git a/lgsm/config-default/config-lgsm/ut99server/_default.cfg b/lgsm/config-default/config-lgsm/ut99server/_default.cfg index dad542598..bc87f8532 100644 --- a/lgsm/config-default/config-lgsm/ut99server/_default.cfg +++ b/lgsm/config-default/config-lgsm/ut99server/_default.cfg @@ -138,7 +138,6 @@ executable="./ucc-bin" servercfg="${selfname}.ini" servercfgdefault="Default.ini" servercfgdir="${systemdir}" -servercfgfullpath="${servercfgdir}/${servercfg}" compressedmapsdir="${rootdir}/Maps-Compressed" ## Backup Directory diff --git a/lgsm/config-default/config-lgsm/utserver/_default.cfg b/lgsm/config-default/config-lgsm/utserver/_default.cfg index b12457c44..4784f0bcd 100644 --- a/lgsm/config-default/config-lgsm/utserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/utserver/_default.cfg @@ -141,7 +141,6 @@ executabledir="${systemdir}/Engine/Binaries/Linux" executable="./UE4Server-Linux-Shipping" servercfg="Game.ini" servercfgdir="${systemdir}/UnrealTournament/Saved/Config/LinuxServer" -servercfgfullpath="${servercfgdir}/${servercfg}" ## Backup Directory backupdir="${lgsmdir}/backup" diff --git a/lgsm/config-default/config-lgsm/vsserver/_default.cfg b/lgsm/config-default/config-lgsm/vsserver/_default.cfg index 6da0d9fb1..5c64eb494 100644 --- a/lgsm/config-default/config-lgsm/vsserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/vsserver/_default.cfg @@ -153,7 +153,6 @@ executable="./hlds_run" servercfg="${selfname}.cfg" servercfgdefault="server.cfg" servercfgdir="${systemdir}" -servercfgfullpath="${servercfgdir}/${servercfg}" ## Backup Directory backupdir="${lgsmdir}/backup" diff --git a/lgsm/config-default/config-lgsm/wetserver/_default.cfg b/lgsm/config-default/config-lgsm/wetserver/_default.cfg index 6cce7a75a..4105e9290 100644 --- a/lgsm/config-default/config-lgsm/wetserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/wetserver/_default.cfg @@ -134,7 +134,6 @@ executable="./etded" servercfg="${selfname}.cfg" servercfgdefault="server.cfg" servercfgdir="${systemdir}/etmain" -servercfgfullpath="${servercfgdir}/${servercfg}" ## Backup Directory backupdir="${lgsmdir}/backup" diff --git a/lgsm/config-default/config-lgsm/wfserver/_default.cfg b/lgsm/config-default/config-lgsm/wfserver/_default.cfg index b40fcda6d..c9b88997e 100644 --- a/lgsm/config-default/config-lgsm/wfserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/wfserver/_default.cfg @@ -148,7 +148,6 @@ executable="./wf_server.x86_64" servercfg="${selfname}.cfg" servercfgdefault="server.cfg" servercfgdir="${systemdir}/basewf" -servercfgfullpath="${servercfgdir}/${servercfg}" ## Backup Directory backupdir="${lgsmdir}/backup" diff --git a/lgsm/config-default/config-lgsm/wurmserver/_default.cfg b/lgsm/config-default/config-lgsm/wurmserver/_default.cfg index a532aa93a..9240ba2c9 100644 --- a/lgsm/config-default/config-lgsm/wurmserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/wurmserver/_default.cfg @@ -144,7 +144,6 @@ executable="xvfb-run ./WurmServerLauncher" servercfg="${selfname}.cfg" servercfgdefault="server.cfg" servercfgdir="${systemdir}" -servercfgfullpath="${servercfgdir}/${servercfg}" ## Backup Directory backupdir="${lgsmdir}/backup" diff --git a/lgsm/config-default/config-lgsm/zmrserver/_default.cfg b/lgsm/config-default/config-lgsm/zmrserver/_default.cfg index 7e1c621b0..acc06176a 100644 --- a/lgsm/config-default/config-lgsm/zmrserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/zmrserver/_default.cfg @@ -153,7 +153,6 @@ executable="./srcds_run" servercfg="${selfname}.cfg" servercfgdefault="server.cfg" servercfgdir="${systemdir}/cfg" -servercfgfullpath="${servercfgdir}/${servercfg}" ## Backup Directory backupdir="${lgsmdir}/backup" diff --git a/lgsm/config-default/config-lgsm/zpsserver/_default.cfg b/lgsm/config-default/config-lgsm/zpsserver/_default.cfg index 8d55e4d44..6068d091c 100644 --- a/lgsm/config-default/config-lgsm/zpsserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/zpsserver/_default.cfg @@ -158,7 +158,6 @@ executable="./srcds_run" servercfg="${selfname}.cfg" servercfgdefault="server.cfg" servercfgdir="${systemdir}/cfg" -servercfgfullpath="${servercfgdir}/${servercfg}" ## Backup Directory backupdir="${lgsmdir}/backup" diff --git a/lgsm/functions/check_config.sh b/lgsm/functions/check_config.sh index a4aa11997..c66892a2d 100644 --- a/lgsm/functions/check_config.sh +++ b/lgsm/functions/check_config.sh @@ -7,6 +7,8 @@ local modulename="CHECK" local function_selfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" +servercfgfullpath="${servercfgdir}/${servercfg}" + if [ ! -f "${servercfgfullpath}" ]; then if [ "${shortname}" != "hw" ]&&[ "${shortname}" != "ut3" ]&&[ "${shortname}" != "kf2" ]; then fn_print_dots "" diff --git a/lgsm/functions/install_config.sh b/lgsm/functions/install_config.sh index 77e9433ea..e54f6215d 100644 --- a/lgsm/functions/install_config.sh +++ b/lgsm/functions/install_config.sh @@ -56,7 +56,7 @@ fn_default_config_remote(){ # Copys local default config to server config location. fn_default_config_local(){ echo -e "copying ${servercfgdefault} config file." - cp -nv "${servercfgfullpathdefault}" "${servercfgfullpath}" + cp -nv "${servercfgdirdefault}/${servercfgdefault}" "${servercfgfullpath}" fn_sleep_time } From c27a0b3d3476df31fb5d82e6fbb56ee3206d3999 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Wed, 11 Mar 2020 09:15:41 +0000 Subject: [PATCH 296/534] feat: removed libdir as no longer required (#2732) --- lgsm/functions/fix_mta.sh | 4 +--- linuxgsm.sh | 1 - tests/tests_fctrserver.sh | 1 - tests/tests_jc2server.sh | 1 - tests/tests_mcserver.sh | 1 - tests/tests_ts3server.sh | 1 - 6 files changed, 1 insertion(+), 8 deletions(-) diff --git a/lgsm/functions/fix_mta.sh b/lgsm/functions/fix_mta.sh index af4d5002f..236a2336b 100644 --- a/lgsm/functions/fix_mta.sh +++ b/lgsm/functions/fix_mta.sh @@ -4,7 +4,7 @@ # Contributor: ChaosMTA # Website: https://linuxgsm.com # Description: Installs the libmysqlclient for database functions on the server -local modulename="FIX" +local commandname="FIX" local commandaction="Fix" local function_selfname=$(basename "$(readlink -f "${BASH_SOURCE[0]}")") @@ -15,5 +15,3 @@ if [ ! -f "${lgsmdir}/lib/libmysqlclient.so.16" ]; then 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 - -export LD_LIBRARY_PATH=:"${libdir}" diff --git a/linuxgsm.sh b/linuxgsm.sh index 6668b32be..ccfccbce0 100755 --- a/linuxgsm.sh +++ b/linuxgsm.sh @@ -32,7 +32,6 @@ lgsmlogdir="${logdir}/lgsm" steamcmddir="${rootdir}/steamcmd" serverfiles="${rootdir}/serverfiles" functionsdir="${lgsmdir}/functions" -libdir="${lgsmdir}/lib" tmpdir="${lgsmdir}/tmp" datadir="${lgsmdir}/data" serverlist="${datadir}/serverlist.csv" diff --git a/tests/tests_fctrserver.sh b/tests/tests_fctrserver.sh index 89fdf939a..67008f883 100644 --- a/tests/tests_fctrserver.sh +++ b/tests/tests_fctrserver.sh @@ -32,7 +32,6 @@ lgsmlogdir="${logdir}/lgsm" steamcmddir="${rootdir}/steamcmd" serverfiles="${rootdir}/serverfiles" functionsdir="${lgsmdir}/functions" -libdir="${lgsmdir}/lib" tmpdir="${lgsmdir}/tmp" datadir="${lgsmdir}/data" serverlist="${datadir}/serverlist.csv" diff --git a/tests/tests_jc2server.sh b/tests/tests_jc2server.sh index 9facae8cb..949509814 100644 --- a/tests/tests_jc2server.sh +++ b/tests/tests_jc2server.sh @@ -32,7 +32,6 @@ lgsmlogdir="${logdir}/lgsm" steamcmddir="${rootdir}/steamcmd" serverfiles="${rootdir}/serverfiles" functionsdir="${lgsmdir}/functions" -libdir="${lgsmdir}/lib" tmpdir="${lgsmdir}/tmp" datadir="${lgsmdir}/data" serverlist="${datadir}/serverlist.csv" diff --git a/tests/tests_mcserver.sh b/tests/tests_mcserver.sh index cb8083d40..9e8bf266c 100644 --- a/tests/tests_mcserver.sh +++ b/tests/tests_mcserver.sh @@ -32,7 +32,6 @@ lgsmlogdir="${logdir}/lgsm" steamcmddir="${rootdir}/steamcmd" serverfiles="${rootdir}/serverfiles" functionsdir="${lgsmdir}/functions" -libdir="${lgsmdir}/lib" tmpdir="${lgsmdir}/tmp" datadir="${lgsmdir}/data" serverlist="${datadir}/serverlist.csv" diff --git a/tests/tests_ts3server.sh b/tests/tests_ts3server.sh index 192bb3524..a9527b68b 100644 --- a/tests/tests_ts3server.sh +++ b/tests/tests_ts3server.sh @@ -32,7 +32,6 @@ lgsmlogdir="${logdir}/lgsm" steamcmddir="${rootdir}/steamcmd" serverfiles="${rootdir}/serverfiles" functionsdir="${lgsmdir}/functions" -libdir="${lgsmdir}/lib" tmpdir="${lgsmdir}/tmp" datadir="${lgsmdir}/data" serverlist="${datadir}/serverlist.csv" From 47cc808e4aba847f45f1a64efb9db0e9426a51b6 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Wed, 11 Mar 2020 09:27:10 +0000 Subject: [PATCH 297/534] remove unnecessary if --- lgsm/functions/fix.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lgsm/functions/fix.sh b/lgsm/functions/fix.sh index 6d8a4515b..3b5a58965 100644 --- a/lgsm/functions/fix.sh +++ b/lgsm/functions/fix.sh @@ -86,7 +86,7 @@ fi # Fixes that are run on install only. if [ "${function_selfname}" == "command_install.sh" ]; then - if [ "${shortname}" == "kf" ]||[ "${shortname}" == "kf2" ]||[ "${shortname}" == "ro" ]||[ "${shortname}" == "ut2k4" ]||[ "${shortname}" == "ut" ]||[ "${shortname}" == "ut3" ]||[ "${shortname}" == "onset" ]; then + if [ "${shortname}" == "kf" ]||[ "${shortname}" == "kf2" ]||[ "${shortname}" == "ro" ]||[ "${shortname}" == "ut2k4" ]||[ "${shortname}" == "ut" ]||[ "${shortname}" == "ut3" ]; then echo -e "" echo -e "Applying Post-Install Fixes" echo -e "=================================" From 171aace200fbef81ee3d84eb55113ff59b03e603 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Wed, 11 Mar 2020 16:42:13 +0000 Subject: [PATCH 298/534] Create pr_labels.yml --- .github/pr_labels.yml | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 .github/pr_labels.yml diff --git a/.github/pr_labels.yml b/.github/pr_labels.yml new file mode 100644 index 000000000..db1f63f6b --- /dev/null +++ b/.github/pr_labels.yml @@ -0,0 +1,5 @@ +version: '1' +invalidStatus: "pending" +labelRule: + startsWith: + - "type:" From 306faa9e0109cabed2d8c8ec670046efc1a320f4 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Fri, 13 Mar 2020 06:56:18 +0000 Subject: [PATCH 299/534] feat: standardise config vars and fix session only monitor (#2736) * fix(monitor): bypass port query if session only mode selected * removed factorio queryport * remove queryport from servers that do not use them * add check_config to details command * updated eco servercfgdir * update _default.cfg test * update _default.cfg test * update test master config * reordered servercfg vars * re-ordered and standardised config file vars * tidy configs * shellcheck * standardised servercfgdir --- .../config-lgsm/ahl2server/_default.cfg | 3 ++- .../config-lgsm/ahlserver/_default.cfg | 3 ++- .../config-lgsm/arkserver/_default.cfg | 5 +++-- .../config-lgsm/arma3server/_default.cfg | 8 +++++--- .../config-lgsm/bb2server/_default.cfg | 3 ++- .../config-lgsm/bbserver/_default.cfg | 3 ++- .../config-lgsm/bdserver/_default.cfg | 3 ++- .../config-lgsm/bf1942server/_default.cfg | 3 ++- .../config-lgsm/bmdmserver/_default.cfg | 3 ++- .../config-lgsm/boserver/_default.cfg | 3 ++- .../config-lgsm/bsserver/_default.cfg | 3 ++- .../config-lgsm/bt1944server/_default.cfg | 4 ++-- .../config-lgsm/btserver/_default.cfg | 3 ++- .../config-lgsm/ccserver/_default.cfg | 3 ++- .../config-lgsm/cod2server/_default.cfg | 3 ++- .../config-lgsm/cod4server/_default.cfg | 3 ++- .../config-lgsm/codserver/_default.cfg | 3 ++- .../config-lgsm/coduoserver/_default.cfg | 3 ++- .../config-lgsm/codwawserver/_default.cfg | 3 ++- .../config-lgsm/csczserver/_default.cfg | 3 ++- .../config-lgsm/csgoserver/_default.cfg | 3 ++- .../config-lgsm/csserver/_default.cfg | 3 ++- .../config-lgsm/cssserver/_default.cfg | 3 ++- .../config-lgsm/dabserver/_default.cfg | 3 ++- .../config-lgsm/dmcserver/_default.cfg | 3 ++- .../config-lgsm/dodserver/_default.cfg | 3 ++- .../config-lgsm/dodsserver/_default.cfg | 3 ++- .../config-lgsm/doiserver/_default.cfg | 3 ++- .../config-lgsm/dstserver/_default.cfg | 7 ++++--- .../config-lgsm/dysserver/_default.cfg | 3 ++- .../config-lgsm/ecoserver/_default.cfg | 3 ++- .../config-lgsm/emserver/_default.cfg | 3 ++- .../config-lgsm/etlserver/_default.cfg | 3 ++- .../config-lgsm/fctrserver/_default.cfg | 3 ++- .../config-lgsm/fofserver/_default.cfg | 3 ++- .../config-lgsm/gesserver/_default.cfg | 3 ++- .../config-lgsm/gmodserver/_default.cfg | 3 ++- .../config-lgsm/hl2dmserver/_default.cfg | 3 ++- .../config-lgsm/hldmserver/_default.cfg | 3 ++- .../config-lgsm/hldmsserver/_default.cfg | 3 ++- .../config-lgsm/insserver/_default.cfg | 3 ++- .../config-lgsm/inssserver/_default.cfg | 3 ++- .../config-lgsm/iosserver/_default.cfg | 3 ++- .../config-lgsm/jc2server/_default.cfg | 3 ++- .../config-lgsm/jc3server/_default.cfg | 3 ++- .../config-lgsm/kf2server/_default.cfg | 1 + .../config-lgsm/kfserver/_default.cfg | 3 ++- .../config-lgsm/l4d2server/_default.cfg | 3 ++- .../config-lgsm/l4dserver/_default.cfg | 3 ++- .../config-lgsm/mcbserver/_default.cfg | 2 +- .../config-lgsm/mcserver/_default.cfg | 3 ++- .../config-lgsm/mhserver/_default.cfg | 3 ++- .../config-lgsm/mohaaserver/_default.cfg | 3 ++- .../config-lgsm/mtaserver/_default.cfg | 3 ++- .../config-lgsm/mumbleserver/_default.cfg | 3 ++- .../config-lgsm/ndserver/_default.cfg | 3 ++- .../config-lgsm/nmrihserver/_default.cfg | 3 ++- .../config-lgsm/ns2cserver/_default.cfg | 2 +- .../config-lgsm/ns2server/_default.cfg | 2 +- .../config-lgsm/nsserver/_default.cfg | 3 ++- .../config-lgsm/onsetserver/_default.cfg | 2 +- .../config-lgsm/opforserver/_default.cfg | 3 ++- .../config-lgsm/pcserver/_default.cfg | 3 ++- .../config-lgsm/pstbsserver/_default.cfg | 3 ++- .../config-lgsm/pvkiiserver/_default.cfg | 3 ++- .../config-lgsm/pzserver/_default.cfg | 4 +++- .../config-lgsm/q2server/_default.cfg | 3 ++- .../config-lgsm/q3server/_default.cfg | 3 ++- .../config-lgsm/qlserver/_default.cfg | 3 ++- .../config-lgsm/qwserver/_default.cfg | 3 ++- .../config-lgsm/ricochetserver/_default.cfg | 3 ++- .../config-lgsm/roserver/_default.cfg | 5 +++-- .../config-lgsm/rtcwserver/_default.cfg | 3 ++- .../config-lgsm/rustserver/_default.cfg | 3 ++- .../config-lgsm/rwserver/_default.cfg | 3 ++- .../config-lgsm/sampserver/_default.cfg | 3 ++- .../config-lgsm/sbotsserver/_default.cfg | 3 ++- .../config-lgsm/sbserver/_default.cfg | 3 ++- .../config-lgsm/sdtdserver/_default.cfg | 5 +++-- .../config-lgsm/sfcserver/_default.cfg | 3 ++- .../config-lgsm/sof2server/_default.cfg | 3 ++- .../config-lgsm/solserver/_default.cfg | 1 + .../config-lgsm/squadserver/_default.cfg | 3 ++- .../config-lgsm/ss3server/_default.cfg | 3 ++- .../config-lgsm/stserver/_default.cfg | 3 ++- .../config-lgsm/svenserver/_default.cfg | 3 ++- .../config-lgsm/terrariaserver/_default.cfg | 3 ++- .../config-lgsm/tf2server/_default.cfg | 3 ++- .../config-lgsm/tfcserver/_default.cfg | 3 ++- .../config-lgsm/ts3server/_default.cfg | 5 +++-- .../config-lgsm/tsserver/_default.cfg | 3 ++- .../config-lgsm/tuserver/_default.cfg | 5 ++--- .../config-lgsm/twserver/_default.cfg | 3 ++- .../config-lgsm/untserver/_default.cfg | 1 + .../config-lgsm/ut2k4server/_default.cfg | 3 ++- .../config-lgsm/ut3server/_default.cfg | 3 ++- .../config-lgsm/ut99server/_default.cfg | 3 ++- .../config-lgsm/utserver/_default.cfg | 3 ++- .../config-lgsm/vsserver/_default.cfg | 3 ++- .../config-lgsm/wetserver/_default.cfg | 3 ++- .../config-lgsm/wfserver/_default.cfg | 3 ++- .../config-lgsm/wurmserver/_default.cfg | 3 ++- .../config-lgsm/zmrserver/_default.cfg | 3 ++- .../config-lgsm/zpsserver/_default.cfg | 3 ++- lgsm/functions/check_config.sh | 2 -- lgsm/functions/command_monitor.sh | 16 +++++++++------- lgsm/functions/info_config.sh | 6 +++--- lgsm/functions/info_messages.sh | 4 ++-- lgsm/functions/info_parms.sh | 10 ---------- lgsm/functions/install_config.sh | 2 +- tests/tests_defaultcfg/defaultcfg_0.txt | 6 ++++++ tests/tests_defaultcfg/tests_defaultcfg.sh | 7 ++++++- 112 files changed, 238 insertions(+), 138 deletions(-) diff --git a/lgsm/config-default/config-lgsm/ahl2server/_default.cfg b/lgsm/config-default/config-lgsm/ahl2server/_default.cfg index 4536de702..02dd1657a 100644 --- a/lgsm/config-default/config-lgsm/ahl2server/_default.cfg +++ b/lgsm/config-default/config-lgsm/ahl2server/_default.cfg @@ -154,9 +154,10 @@ glibc="2.15" systemdir="${serverfiles}/ahl2" executabledir="${serverfiles}" executable="./srcds_run" +servercfgdir="${systemdir}/cfg" servercfg="${selfname}.cfg" servercfgdefault="server.cfg" -servercfgdir="${systemdir}/cfg" +servercfgfullpath="${servercfgdir}/${servercfg}" ## Backup Directory backupdir="${lgsmdir}/backup" diff --git a/lgsm/config-default/config-lgsm/ahlserver/_default.cfg b/lgsm/config-default/config-lgsm/ahlserver/_default.cfg index 89de05540..4e3039209 100644 --- a/lgsm/config-default/config-lgsm/ahlserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/ahlserver/_default.cfg @@ -150,9 +150,10 @@ glibc="2.3.4" systemdir="${serverfiles}/action" executabledir="${serverfiles}" executable="./hlds_run" +servercfgdir="${systemdir}" servercfg="${selfname}.cfg" servercfgdefault="server.cfg" -servercfgdir="${systemdir}" +servercfgfullpath="${servercfgdir}/${servercfg}" ## Backup Directory backupdir="${lgsmdir}/backup" diff --git a/lgsm/config-default/config-lgsm/arkserver/_default.cfg b/lgsm/config-default/config-lgsm/arkserver/_default.cfg index e0111e3c5..0fd7a0c52 100644 --- a/lgsm/config-default/config-lgsm/arkserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/arkserver/_default.cfg @@ -151,9 +151,10 @@ glibc="2.15" systemdir="${serverfiles}/ShooterGame" executabledir="${systemdir}/Binaries/Linux" executable="./ShooterGameServer" -servercfg="GameUserSettings.ini" -servercfgdefault="GameUserSettings.ini" servercfgdir="${systemdir}/Saved/Config/LinuxServer" +servercfg="GameUserSettngs.ini" +servercfgdefault="GameUserSettings.ini" +servercfgfullpath="${servercfgdir}/${servercfg}" ## Backup Directory backupdir="${lgsmdir}/backup" diff --git a/lgsm/config-default/config-lgsm/arma3server/_default.cfg b/lgsm/config-default/config-lgsm/arma3server/_default.cfg index f557eead3..f56fdac89 100644 --- a/lgsm/config-default/config-lgsm/arma3server/_default.cfg +++ b/lgsm/config-default/config-lgsm/arma3server/_default.cfg @@ -165,12 +165,14 @@ glibc="2.13" systemdir="${serverfiles}" executabledir="${serverfiles}" executable="./arma3server" +servercfgdir="${systemdir}/cfg" servercfg="${selfname}.server.cfg" -networkcfg="${selfname}.network.cfg" servercfgdefault="server.cfg" +servercfgfullpath="${servercfgdir}/${servercfg}" +networkcfgdir="${systemdir}/cfg" +networkcfg="${selfname}.network.cfg" networkcfgdefault="network.cfg" -servercfgdir="${systemdir}/cfg" -networkcfgfullpath="${servercfgdir}/${networkcfg}" +networkcfgfullpath="${networkcfgdir}/${networkcfg}" ## Backup Directory backupdir="${lgsmdir}/backup" diff --git a/lgsm/config-default/config-lgsm/bb2server/_default.cfg b/lgsm/config-default/config-lgsm/bb2server/_default.cfg index 39a901c06..a1a9ae350 100644 --- a/lgsm/config-default/config-lgsm/bb2server/_default.cfg +++ b/lgsm/config-default/config-lgsm/bb2server/_default.cfg @@ -155,9 +155,10 @@ glibc="2.17" systemdir="${serverfiles}/brainbread2" executabledir="${serverfiles}" executable="./srcds_run" +servercfgdir="${systemdir}/cfg" servercfg="${selfname}.cfg" servercfgdefault="server.cfg" -servercfgdir="${systemdir}/cfg" +servercfgfullpath="${servercfgdir}/${servercfg}" ## Backup Directory backupdir="${lgsmdir}/backup" diff --git a/lgsm/config-default/config-lgsm/bbserver/_default.cfg b/lgsm/config-default/config-lgsm/bbserver/_default.cfg index 9327a352e..75da97662 100644 --- a/lgsm/config-default/config-lgsm/bbserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/bbserver/_default.cfg @@ -150,9 +150,10 @@ glibc="2.3.4" systemdir="${serverfiles}/brainbread" executabledir="${serverfiles}" executable="./hlds_run" +servercfgdir="${systemdir}" servercfg="${selfname}.cfg" servercfgdefault="server.cfg" -servercfgdir="${systemdir}" +servercfgfullpath="${servercfgdir}/${servercfg}" ## Backup Directory backupdir="${lgsmdir}/backup" diff --git a/lgsm/config-default/config-lgsm/bdserver/_default.cfg b/lgsm/config-default/config-lgsm/bdserver/_default.cfg index d880d0509..77c169e6a 100644 --- a/lgsm/config-default/config-lgsm/bdserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/bdserver/_default.cfg @@ -149,9 +149,10 @@ glibc="2.14" systemdir="${serverfiles}/bdef" executabledir="${serverfiles}" executable="./hlds_run" +servercfgdir="${systemdir}" servercfg="${selfname}.cfg" servercfgdefault="server.cfg" -servercfgdir="${systemdir}" +servercfgfullpath="${servercfgdir}/${servercfg}" ## Backup Directory backupdir="${lgsmdir}/backup" diff --git a/lgsm/config-default/config-lgsm/bf1942server/_default.cfg b/lgsm/config-default/config-lgsm/bf1942server/_default.cfg index f74433d8c..b6e508e01 100644 --- a/lgsm/config-default/config-lgsm/bf1942server/_default.cfg +++ b/lgsm/config-default/config-lgsm/bf1942server/_default.cfg @@ -134,9 +134,10 @@ glibc="2.0" systemdir="${serverfiles}" executabledir="${systemdir}" executable="./start.sh" +servercfgdir="${systemdir}/mods/bf1942/settings" servercfg="serversettings.con" servercfgdefault="serversettings.con" -servercfgdir="${systemdir}/mods/bf1942/settings" +servercfgfullpath="${servercfgdir}/${servercfg}" ## Backup Directory backupdir="${lgsmdir}/backup" diff --git a/lgsm/config-default/config-lgsm/bmdmserver/_default.cfg b/lgsm/config-default/config-lgsm/bmdmserver/_default.cfg index 296c5ccf2..b92257fff 100644 --- a/lgsm/config-default/config-lgsm/bmdmserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/bmdmserver/_default.cfg @@ -155,9 +155,10 @@ glibc="2.15" systemdir="${serverfiles}/bms" executabledir="${serverfiles}" executable="./srcds_run" +servercfgdir="${systemdir}/cfg" servercfg="${selfname}.cfg" servercfgdefault="server.cfg" -servercfgdir="${systemdir}/cfg" +servercfgfullpath="${servercfgdir}/${servercfg}" ## Backup Directory backupdir="${lgsmdir}/backup" diff --git a/lgsm/config-default/config-lgsm/boserver/_default.cfg b/lgsm/config-default/config-lgsm/boserver/_default.cfg index 8d8a1ec87..73015c2d6 100644 --- a/lgsm/config-default/config-lgsm/boserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/boserver/_default.cfg @@ -148,9 +148,10 @@ glibc="2.15" systemdir="${serverfiles}" executabledir="${serverfiles}" executable="./BODS.x86" +servercfgdir="${systemdir}" servercfg="${selfname}.txt" servercfgdefault="config.txt" -servercfgdir="${systemdir}" +servercfgfullpath="${servercfgdir}/${servercfg}" ## Backup Directory backupdir="${lgsmdir}/backup" diff --git a/lgsm/config-default/config-lgsm/bsserver/_default.cfg b/lgsm/config-default/config-lgsm/bsserver/_default.cfg index 31c735009..612e4cb2b 100644 --- a/lgsm/config-default/config-lgsm/bsserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/bsserver/_default.cfg @@ -159,9 +159,10 @@ glibc="2.15" systemdir="${serverfiles}/berimbau" executabledir="${serverfiles}/bin" executable="./srcds_run.sh" +servercfgdir="${systemdir}/cfg" servercfg="${selfname}.cfg" servercfgdefault="server.cfg" -servercfgdir="${systemdir}/cfg" +servercfgfullpath="${servercfgdir}/${servercfg}" ## Backup Directory backupdir="${lgsmdir}/backup" diff --git a/lgsm/config-default/config-lgsm/bt1944server/_default.cfg b/lgsm/config-default/config-lgsm/bt1944server/_default.cfg index 4f59bb38c..2ca021b27 100644 --- a/lgsm/config-default/config-lgsm/bt1944server/_default.cfg +++ b/lgsm/config-default/config-lgsm/bt1944server/_default.cfg @@ -147,10 +147,10 @@ glibc="2.17" systemdir="${serverfiles}/Linux/Battalion" executabledir="${systemdir}/Binaries/Linux" executable="./BattalionServer" +servercfgdir="${systemdir}/Saved/Config/LinuxServer" servercfg="${selfname}.ini" servercfgdefault="DefaultGame.ini" -servercfgdir="${systemdir}/Saved/Config/LinuxServer" - +servercfgfullpath="${servercfgdir}/${servercfg}" ## Backup Directory backupdir="${lgsmdir}/backup" diff --git a/lgsm/config-default/config-lgsm/btserver/_default.cfg b/lgsm/config-default/config-lgsm/btserver/_default.cfg index 5e2115d74..45d54833a 100644 --- a/lgsm/config-default/config-lgsm/btserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/btserver/_default.cfg @@ -142,9 +142,10 @@ glibc="2.17" systemdir="${serverfiles}" executabledir="${systemdir}" executable="./DedicatedServer.exe" +servercfgdir="${systemdir}" servercfg="serversettings.xml" servercfgdefault="serversettings.xml" -servercfgdir="${systemdir}" +servercfgfullpath="${servercfgdir}/${servercfg}" ## Backup Directory backupdir="${lgsmdir}/backup" diff --git a/lgsm/config-default/config-lgsm/ccserver/_default.cfg b/lgsm/config-default/config-lgsm/ccserver/_default.cfg index 757361eb5..2913a289d 100644 --- a/lgsm/config-default/config-lgsm/ccserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/ccserver/_default.cfg @@ -150,9 +150,10 @@ glibc="2.15" systemdir="${serverfiles}/cure" executabledir="${serverfiles}" executable="./srcds_run" +servercfgdir="${systemdir}/cfg" servercfg="${selfname}.cfg" servercfgdefault="server.cfg" -servercfgdir="${systemdir}/cfg" +servercfgfullpath="${servercfgdir}/${servercfg}" ## Backup Directory backupdir="${lgsmdir}/backup" diff --git a/lgsm/config-default/config-lgsm/cod2server/_default.cfg b/lgsm/config-default/config-lgsm/cod2server/_default.cfg index 8184bd7eb..6c8a31c71 100644 --- a/lgsm/config-default/config-lgsm/cod2server/_default.cfg +++ b/lgsm/config-default/config-lgsm/cod2server/_default.cfg @@ -137,9 +137,10 @@ glibc="2.1.3" systemdir="${serverfiles}" executabledir="${serverfiles}" executable="./cod2_lnxded" +servercfgdir="${systemdir}/main" servercfg="${selfname}.cfg" servercfgdefault="server.cfg" -servercfgdir="${systemdir}/main" +servercfgfullpath="${servercfgdir}/${servercfg}" ## Backup Directory backupdir="${lgsmdir}/backup" diff --git a/lgsm/config-default/config-lgsm/cod4server/_default.cfg b/lgsm/config-default/config-lgsm/cod4server/_default.cfg index 8d4ae0c60..f319c7ae9 100644 --- a/lgsm/config-default/config-lgsm/cod4server/_default.cfg +++ b/lgsm/config-default/config-lgsm/cod4server/_default.cfg @@ -137,9 +137,10 @@ glibc="2.12" systemdir="${serverfiles}" executabledir="${serverfiles}" executable="./cod4x18_dedrun" +servercfgdir="${systemdir}/main" servercfg="${selfname}.cfg" servercfgdefault="server.cfg" -servercfgdir="${systemdir}/main" +servercfgfullpath="${servercfgdir}/${servercfg}" ## Backup Directory backupdir="${lgsmdir}/backup" diff --git a/lgsm/config-default/config-lgsm/codserver/_default.cfg b/lgsm/config-default/config-lgsm/codserver/_default.cfg index 90319da8e..14c2ea889 100644 --- a/lgsm/config-default/config-lgsm/codserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/codserver/_default.cfg @@ -137,9 +137,10 @@ glibc="2.1" systemdir="${serverfiles}" executabledir="${serverfiles}" executable="./cod_lnxded" +servercfgdir="${systemdir}/main" servercfg="${selfname}.cfg" servercfgdefault="server.cfg" -servercfgdir="${systemdir}/main" +servercfgfullpath="${servercfgdir}/${servercfg}" ## Backup Directory backupdir="${lgsmdir}/backup" diff --git a/lgsm/config-default/config-lgsm/coduoserver/_default.cfg b/lgsm/config-default/config-lgsm/coduoserver/_default.cfg index 154c3eaa7..9eb271d27 100644 --- a/lgsm/config-default/config-lgsm/coduoserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/coduoserver/_default.cfg @@ -137,9 +137,10 @@ glibc="2.1" systemdir="${serverfiles}" executabledir="${serverfiles}" executable="./coduo_lnxded" +servercfgdir="${systemdir}/uo" servercfg="${selfname}.cfg" servercfgdefault="server.cfg" -servercfgdir="${systemdir}/uo" +servercfgfullpath="${servercfgdir}/${servercfg}" ## Backup Directory backupdir="${lgsmdir}/backup" diff --git a/lgsm/config-default/config-lgsm/codwawserver/_default.cfg b/lgsm/config-default/config-lgsm/codwawserver/_default.cfg index 805c7d77b..14799814f 100644 --- a/lgsm/config-default/config-lgsm/codwawserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/codwawserver/_default.cfg @@ -137,9 +137,10 @@ glibc="2.3.2" systemdir="${serverfiles}" executabledir="${serverfiles}" executable="./codwaw_lnxded" +servercfgdir="${systemdir}/main" servercfg="${selfname}.cfg" servercfgdefault="server.cfg" -servercfgdir="${systemdir}/main" +servercfgfullpath="${servercfgdir}/${servercfg}" ## Backup Directory backupdir="${lgsmdir}/backup" diff --git a/lgsm/config-default/config-lgsm/csczserver/_default.cfg b/lgsm/config-default/config-lgsm/csczserver/_default.cfg index d7b855f95..0fd33cd68 100644 --- a/lgsm/config-default/config-lgsm/csczserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/csczserver/_default.cfg @@ -150,9 +150,10 @@ glibc="2.3.6" systemdir="${serverfiles}/czero" executabledir="${serverfiles}" executable="./hlds_run" +servercfgdir="${systemdir}" servercfg="${selfname}.cfg" servercfgdefault="server.cfg" -servercfgdir="${systemdir}" +servercfgfullpath="${servercfgdir}/${servercfg}" ## Backup Directory backupdir="${lgsmdir}/backup" diff --git a/lgsm/config-default/config-lgsm/csgoserver/_default.cfg b/lgsm/config-default/config-lgsm/csgoserver/_default.cfg index a0d31cb74..0cabcd249 100644 --- a/lgsm/config-default/config-lgsm/csgoserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/csgoserver/_default.cfg @@ -175,9 +175,10 @@ glibc="2.15" systemdir="${serverfiles}/csgo" executabledir="${serverfiles}" executable="./srcds_run" +servercfgdir="${systemdir}/cfg" servercfg="${selfname}.cfg" servercfgdefault="server.cfg" -servercfgdir="${systemdir}/cfg" +servercfgfullpath="${servercfgdir}/${servercfg}" ## Backup Directory backupdir="${lgsmdir}/backup" diff --git a/lgsm/config-default/config-lgsm/csserver/_default.cfg b/lgsm/config-default/config-lgsm/csserver/_default.cfg index cbc140c8a..36f0d955a 100644 --- a/lgsm/config-default/config-lgsm/csserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/csserver/_default.cfg @@ -150,9 +150,10 @@ glibc="2.3.6" systemdir="${serverfiles}/cstrike" executabledir="${serverfiles}" executable="./hlds_run" +servercfgdir="${systemdir}" servercfg="${selfname}.cfg" servercfgdefault="server.cfg" -servercfgdir="${systemdir}" +servercfgfullpath="${servercfgdir}/${servercfg}" ## Backup Directory backupdir="${lgsmdir}/backup" diff --git a/lgsm/config-default/config-lgsm/cssserver/_default.cfg b/lgsm/config-default/config-lgsm/cssserver/_default.cfg index e5fc863c7..586b6dc18 100644 --- a/lgsm/config-default/config-lgsm/cssserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/cssserver/_default.cfg @@ -155,9 +155,10 @@ glibc="2.3.6" systemdir="${serverfiles}/cstrike" executabledir="${serverfiles}" executable="./srcds_run" +servercfgdir="${systemdir}/cfg" servercfg="${selfname}.cfg" servercfgdefault="server.cfg" -servercfgdir="${systemdir}/cfg" +servercfgfullpath="${servercfgdir}/${servercfg}" ## Backup Directory backupdir="${lgsmdir}/backup" diff --git a/lgsm/config-default/config-lgsm/dabserver/_default.cfg b/lgsm/config-default/config-lgsm/dabserver/_default.cfg index 76d946aee..f03645b95 100644 --- a/lgsm/config-default/config-lgsm/dabserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/dabserver/_default.cfg @@ -150,9 +150,10 @@ glibc="2.15" systemdir="${serverfiles}/dab" executabledir="${serverfiles}" executable="./dabds.sh" +servercfgdir="${systemdir}/cfg" servercfg="${selfname}.cfg" servercfgdefault="server.cfg" -servercfgdir="${systemdir}/cfg" +servercfgfullpath="${servercfgdir}/${servercfg}" ## Backup Directory backupdir="${lgsmdir}/backup" diff --git a/lgsm/config-default/config-lgsm/dmcserver/_default.cfg b/lgsm/config-default/config-lgsm/dmcserver/_default.cfg index 23d322095..3af9ee7d7 100644 --- a/lgsm/config-default/config-lgsm/dmcserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/dmcserver/_default.cfg @@ -150,9 +150,10 @@ glibc="2.3.4" systemdir="${serverfiles}/dmc" executabledir="${serverfiles}" executable="./hlds_run" +servercfgdir="${systemdir}" servercfg="${selfname}.cfg" servercfgdefault="server.cfg" -servercfgdir="${systemdir}" +servercfgfullpath="${servercfgdir}/${servercfg}" ## Backup Directory backupdir="${lgsmdir}/backup" diff --git a/lgsm/config-default/config-lgsm/dodserver/_default.cfg b/lgsm/config-default/config-lgsm/dodserver/_default.cfg index f20658753..79df74acb 100644 --- a/lgsm/config-default/config-lgsm/dodserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/dodserver/_default.cfg @@ -150,9 +150,10 @@ glibc="2.3.4" systemdir="${serverfiles}/dod" executabledir="${serverfiles}" executable="./hlds_run" +servercfgdir="${systemdir}" servercfg="${selfname}.cfg" servercfgdefault="server.cfg" -servercfgdir="${systemdir}" +servercfgfullpath="${servercfgdir}/${servercfg}" ## Backup Directory backupdir="${lgsmdir}/backup" diff --git a/lgsm/config-default/config-lgsm/dodsserver/_default.cfg b/lgsm/config-default/config-lgsm/dodsserver/_default.cfg index 351eb76ec..7ec70a81d 100644 --- a/lgsm/config-default/config-lgsm/dodsserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/dodsserver/_default.cfg @@ -150,9 +150,10 @@ glibc="2.3.6" systemdir="${serverfiles}/dod" executabledir="${serverfiles}" executable="./srcds_run" +servercfgdir="${systemdir}/cfg" servercfg="${selfname}.cfg" servercfgdefault="server.cfg" -servercfgdir="${systemdir}/cfg" +servercfgfullpath="${servercfgdir}/${servercfg}" ## Backup Directory backupdir="${lgsmdir}/backup" diff --git a/lgsm/config-default/config-lgsm/doiserver/_default.cfg b/lgsm/config-default/config-lgsm/doiserver/_default.cfg index ae0932f78..c31bea09f 100644 --- a/lgsm/config-default/config-lgsm/doiserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/doiserver/_default.cfg @@ -151,9 +151,10 @@ glibc="2.15" systemdir="${serverfiles}/doi" executabledir="${serverfiles}" executable="./srcds_run" +servercfgdir="${systemdir}/cfg" servercfg="${selfname}.cfg" servercfgdefault="server.cfg" -servercfgdir="${systemdir}/cfg" +servercfgfullpath="${servercfgdir}/${servercfg}" ## Backup Directory backupdir="${lgsmdir}/backup" diff --git a/lgsm/config-default/config-lgsm/dstserver/_default.cfg b/lgsm/config-default/config-lgsm/dstserver/_default.cfg index 6b96bc7ed..2e9439d06 100644 --- a/lgsm/config-default/config-lgsm/dstserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/dstserver/_default.cfg @@ -153,13 +153,14 @@ glibc="2.15" systemdir="${serverfiles}" executabledir="${serverfiles}/bin" executable="./dontstarve_dedicated_server_nullrenderer" -servercfg="server.ini" servercfgdir="${clustercfgdir}/${shard}" +servercfg="server.ini" servercfgdefault="server.ini" -clustercfg="cluster.ini" +servercfgfullpath="${servercfgdir}/${servercfg}" clustercfgdir="${persistentstorageroot}/${confdir}/${cluster}" -clustercfgfullpath="${clustercfgdir}/${clustercfg}" +clustercfg="cluster.ini" clustercfgdefault="cluster.ini" +clustercfgfullpath="${clustercfgdir}/${clustercfg}" ## Backup Directory backupdir="${lgsmdir}/backup" diff --git a/lgsm/config-default/config-lgsm/dysserver/_default.cfg b/lgsm/config-default/config-lgsm/dysserver/_default.cfg index 2ff9654f8..51c9db8cf 100644 --- a/lgsm/config-default/config-lgsm/dysserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/dysserver/_default.cfg @@ -155,9 +155,10 @@ glibc="2.15" systemdir="${serverfiles}/dystopia" executabledir="${serverfiles}/bin" executable="./srcds_run.sh" +servercfgdir="${systemdir}/cfg" servercfg="${selfname}.cfg" servercfgdefault="server.cfg" -servercfgdir="${systemdir}/cfg" +servercfgfullpath="${servercfgdir}/${servercfg}" ## Backup Directory backupdir="${lgsmdir}/backup" diff --git a/lgsm/config-default/config-lgsm/ecoserver/_default.cfg b/lgsm/config-default/config-lgsm/ecoserver/_default.cfg index 5478d3733..1286860fc 100644 --- a/lgsm/config-default/config-lgsm/ecoserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/ecoserver/_default.cfg @@ -142,9 +142,10 @@ glibc="null" systemdir="${serverfiles}" executabledir="${serverfiles}" executable="mono ./EcoServer.exe" +servercfgdir="${systemdir}/Configs" servercfg="Network.eco" servercfgdefault="Network.eco" -servercfgdir="${systemdir}/Configs" +servercfgfullpath="${servercfgdir}/${servercfg}" ## Backup Directory backupdir="${lgsmdir}/backup" diff --git a/lgsm/config-default/config-lgsm/emserver/_default.cfg b/lgsm/config-default/config-lgsm/emserver/_default.cfg index 62d8b6eba..4d6fc1824 100644 --- a/lgsm/config-default/config-lgsm/emserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/emserver/_default.cfg @@ -155,9 +155,10 @@ glibc="2.15" systemdir="${serverfiles}/empires" executabledir="${serverfiles}" executable="./srcds_run" +servercfgdir="${systemdir}/cfg" servercfg="${selfname}.cfg" servercfgdefault="server.cfg" -servercfgdir="${systemdir}/cfg" +servercfgfullpath="${servercfgdir}/${servercfg}" ## Backup Directory backupdir="${lgsmdir}/backup" diff --git a/lgsm/config-default/config-lgsm/etlserver/_default.cfg b/lgsm/config-default/config-lgsm/etlserver/_default.cfg index 4d98e2f87..ffc85e4b9 100644 --- a/lgsm/config-default/config-lgsm/etlserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/etlserver/_default.cfg @@ -131,9 +131,10 @@ glibc="2.7" systemdir="${serverfiles}" executabledir="${systemdir}" executable="./etlded" +servercfgdir="${systemdir}/etmain" servercfg="${selfname}.cfg" servercfgdefault="server.cfg" -servercfgdir="${systemdir}/etmain" +servercfgfullpath="${servercfgdir}/${servercfg}" ## Backup Directory backupdir="${lgsmdir}/backup" diff --git a/lgsm/config-default/config-lgsm/fctrserver/_default.cfg b/lgsm/config-default/config-lgsm/fctrserver/_default.cfg index 42e8fb77a..711194a84 100644 --- a/lgsm/config-default/config-lgsm/fctrserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/fctrserver/_default.cfg @@ -142,9 +142,10 @@ glibc="2.18" systemdir="${serverfiles}" executabledir="${serverfiles}/bin/x64" executable="./factorio" +servercfgdir="${systemdir}/data" servercfg="${selfname}.json" servercfgdefault="server-settings.json" -servercfgdir="${serverfiles}/data" +servercfgfullpath="${servercfgdir}/${servercfg}" ## Backup Directory backupdir="${lgsmdir}/backup" diff --git a/lgsm/config-default/config-lgsm/fofserver/_default.cfg b/lgsm/config-default/config-lgsm/fofserver/_default.cfg index c7db4f875..0946a0eac 100644 --- a/lgsm/config-default/config-lgsm/fofserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/fofserver/_default.cfg @@ -150,9 +150,10 @@ glibc="2.15" systemdir="${serverfiles}/fof" executabledir="${serverfiles}" executable="./srcds_run" +servercfgdir="${systemdir}/cfg" servercfg="${selfname}.cfg" servercfgdefault="server.cfg" -servercfgdir="${systemdir}/cfg" +servercfgfullpath="${servercfgdir}/${servercfg}" ## Backup Directory backupdir="${lgsmdir}/backup" diff --git a/lgsm/config-default/config-lgsm/gesserver/_default.cfg b/lgsm/config-default/config-lgsm/gesserver/_default.cfg index aa318ba44..d47983a79 100644 --- a/lgsm/config-default/config-lgsm/gesserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/gesserver/_default.cfg @@ -150,9 +150,10 @@ glibc="2.15" systemdir="${serverfiles}/gesource" executabledir="${serverfiles}" executable="./srcds_run" +servercfgdir="${systemdir}/cfg" servercfg="${selfname}.cfg" servercfgdefault="server.cfg" -servercfgdir="${systemdir}/cfg" +servercfgfullpath="${servercfgdir}/${servercfg}" ## Backup Directory backupdir="${lgsmdir}/backup" diff --git a/lgsm/config-default/config-lgsm/gmodserver/_default.cfg b/lgsm/config-default/config-lgsm/gmodserver/_default.cfg index 25624c1f2..66202641c 100644 --- a/lgsm/config-default/config-lgsm/gmodserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/gmodserver/_default.cfg @@ -167,9 +167,10 @@ systemdir="${serverfiles}/garrysmod" addonsdir="${systemdir}/addons" executabledir="${serverfiles}" executable="./srcds_run" +servercfgdir="${systemdir}/cfg" servercfg="${selfname}.cfg" servercfgdefault="server.cfg" -servercfgdir="${systemdir}/cfg" +servercfgfullpath="${servercfgdir}/${servercfg}" ## Backup Directory backupdir="${lgsmdir}/backup" diff --git a/lgsm/config-default/config-lgsm/hl2dmserver/_default.cfg b/lgsm/config-default/config-lgsm/hl2dmserver/_default.cfg index 5d5f7dd5f..a67d26a96 100644 --- a/lgsm/config-default/config-lgsm/hl2dmserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/hl2dmserver/_default.cfg @@ -150,9 +150,10 @@ glibc="2.3.6" systemdir="${serverfiles}/hl2mp" executabledir="${serverfiles}" executable="./srcds_run" +servercfgdir="${systemdir}/cfg" servercfg="${selfname}.cfg" servercfgdefault="server.cfg" -servercfgdir="${systemdir}/cfg" +servercfgfullpath="${servercfgdir}/${servercfg}" ## Backup Directory backupdir="${lgsmdir}/backup" diff --git a/lgsm/config-default/config-lgsm/hldmserver/_default.cfg b/lgsm/config-default/config-lgsm/hldmserver/_default.cfg index 7eb45b573..2e15cea7e 100644 --- a/lgsm/config-default/config-lgsm/hldmserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/hldmserver/_default.cfg @@ -149,9 +149,10 @@ glibc="2.3.4" systemdir="${serverfiles}/valve" executabledir="${serverfiles}" executable="./hlds_run" +servercfgdir="${systemdir}" servercfg="${selfname}.cfg" servercfgdefault="server.cfg" -servercfgdir="${systemdir}" +servercfgfullpath="${servercfgdir}/${servercfg}" ## Backup Directory backupdir="${lgsmdir}/backup" diff --git a/lgsm/config-default/config-lgsm/hldmsserver/_default.cfg b/lgsm/config-default/config-lgsm/hldmsserver/_default.cfg index 82bd1e113..e6d3b0a2a 100644 --- a/lgsm/config-default/config-lgsm/hldmsserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/hldmsserver/_default.cfg @@ -150,9 +150,10 @@ glibc="2.3.6" systemdir="${serverfiles}/hl1mp" executabledir="${serverfiles}" executable="./srcds_run" +servercfgdir="${systemdir}/cfg" servercfg="${selfname}.cfg" servercfgdefault="server.cfg" -servercfgdir="${systemdir}/cfg" +servercfgfullpath="${servercfgdir}/${servercfg}" ## Backup Directory backupdir="${lgsmdir}/backup" diff --git a/lgsm/config-default/config-lgsm/insserver/_default.cfg b/lgsm/config-default/config-lgsm/insserver/_default.cfg index 7b0d2d5bb..9fea80b0d 100644 --- a/lgsm/config-default/config-lgsm/insserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/insserver/_default.cfg @@ -156,9 +156,10 @@ glibc="2.15" systemdir="${serverfiles}/insurgency" executabledir="${serverfiles}" executable="./srcds_run" +servercfgdir="${systemdir}/cfg" servercfg="${selfname}.cfg" servercfgdefault="server.cfg" -servercfgdir="${systemdir}/cfg" +servercfgfullpath="${servercfgdir}/${servercfg}" ## Backup Directory backupdir="${lgsmdir}/backup" diff --git a/lgsm/config-default/config-lgsm/inssserver/_default.cfg b/lgsm/config-default/config-lgsm/inssserver/_default.cfg index 7c715c54d..04becc752 100644 --- a/lgsm/config-default/config-lgsm/inssserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/inssserver/_default.cfg @@ -157,9 +157,10 @@ glibc="2.17" systemdir="${serverfiles}/Insurgency" executabledir="${systemdir}/Binaries/Linux" executable="./InsurgencyServer-Linux-Shipping" +servercfgdir="${systemdir}/Saved/Config/LinuxServer" servercfg="Game.ini" servercfgdefault="Game.ini" -servercfgdir="${systemdir}/Saved/Config/LinuxServer" +servercfgfullpath="${servercfgdir}/${servercfg}" ## Backup Directory backupdir="${lgsmdir}/backup" diff --git a/lgsm/config-default/config-lgsm/iosserver/_default.cfg b/lgsm/config-default/config-lgsm/iosserver/_default.cfg index ee32b013c..bb53acf48 100644 --- a/lgsm/config-default/config-lgsm/iosserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/iosserver/_default.cfg @@ -150,9 +150,10 @@ glibc="2.3.6" systemdir="${serverfiles}/iosoccer" executabledir="${serverfiles}" executable="./srcds_run" +servercfgdir="${systemdir}/cfg" servercfg="${selfname}.cfg" servercfgdefault="server.cfg" -servercfgdir="${systemdir}/cfg" +servercfgfullpath="${servercfgdir}/${servercfg}" ## Backup Directory backupdir="${lgsmdir}/backup" diff --git a/lgsm/config-default/config-lgsm/jc2server/_default.cfg b/lgsm/config-default/config-lgsm/jc2server/_default.cfg index 5f0731f1e..822e860c5 100644 --- a/lgsm/config-default/config-lgsm/jc2server/_default.cfg +++ b/lgsm/config-default/config-lgsm/jc2server/_default.cfg @@ -142,9 +142,10 @@ glibc="2.13" systemdir="${serverfiles}" executabledir="${serverfiles}" executable="./Jcmp-Server" +servercfgdir="${systemdir}" servercfg="config.lua" servercfgdefault="config.lua" -servercfgdir="${serverfiles}" +servercfgfullpath="${servercfgdir}/${servercfg}" ## Backup Directory backupdir="${lgsmdir}/backup" diff --git a/lgsm/config-default/config-lgsm/jc3server/_default.cfg b/lgsm/config-default/config-lgsm/jc3server/_default.cfg index 301453803..dbe9d4616 100644 --- a/lgsm/config-default/config-lgsm/jc3server/_default.cfg +++ b/lgsm/config-default/config-lgsm/jc3server/_default.cfg @@ -142,9 +142,10 @@ glibc="2.17" systemdir="${serverfiles}" executabledir="${serverfiles}" executable="./Server" +servercfgdir="${systemdir}" servercfg="config.json" servercfgdefault="config.json" -servercfgdir="${serverfiles}" +servercfgfullpath="${servercfgdir}/${servercfg}" ## Backup Directory backupdir="${lgsmdir}/backup" diff --git a/lgsm/config-default/config-lgsm/kf2server/_default.cfg b/lgsm/config-default/config-lgsm/kf2server/_default.cfg index 5f69d4841..6e31023be 100644 --- a/lgsm/config-default/config-lgsm/kf2server/_default.cfg +++ b/lgsm/config-default/config-lgsm/kf2server/_default.cfg @@ -150,6 +150,7 @@ executable="./KFGameSteamServer.bin.x86_64" servercfgdir="${systemdir}/KFGame/Config/${selfname}" servercfg="LinuxServer-KFGame.ini" servercfgdefault="LinuxServer-KFGame.ini" +servercfgfullpath="${servercfgdir}/${servercfg}" ## Backup Directory backupdir="${lgsmdir}/backup" diff --git a/lgsm/config-default/config-lgsm/kfserver/_default.cfg b/lgsm/config-default/config-lgsm/kfserver/_default.cfg index 4511427fb..df07967d7 100644 --- a/lgsm/config-default/config-lgsm/kfserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/kfserver/_default.cfg @@ -155,9 +155,10 @@ serverfiles="${rootdir}/serverfiles" systemdir="${serverfiles}/System" executabledir="${systemdir}" executable="./ucc-bin" +servercfgdir="${systemdir}" servercfg="${selfname}.ini" servercfgdefault="Default.ini" -servercfgdir="${systemdir}" +servercfgfullpath="${servercfgdir}/${servercfg}" compressedmapsdir="${rootdir}/Maps-Compressed" ## Backup Directory diff --git a/lgsm/config-default/config-lgsm/l4d2server/_default.cfg b/lgsm/config-default/config-lgsm/l4d2server/_default.cfg index e02987024..c2dd765c2 100644 --- a/lgsm/config-default/config-lgsm/l4d2server/_default.cfg +++ b/lgsm/config-default/config-lgsm/l4d2server/_default.cfg @@ -149,9 +149,10 @@ glibc="2.3.6" systemdir="${serverfiles}/left4dead2" executabledir="${serverfiles}" executable="./srcds_run" +servercfgdir="${systemdir}/cfg" servercfg="${selfname}.cfg" servercfgdefault="server.cfg" -servercfgdir="${systemdir}/cfg" +servercfgfullpath="${servercfgdir}/${servercfg}" ## Backup Directory backupdir="${lgsmdir}/backup" diff --git a/lgsm/config-default/config-lgsm/l4dserver/_default.cfg b/lgsm/config-default/config-lgsm/l4dserver/_default.cfg index dbfd0fd47..c40a1199f 100644 --- a/lgsm/config-default/config-lgsm/l4dserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/l4dserver/_default.cfg @@ -149,9 +149,10 @@ glibc="2.3.6" systemdir="${serverfiles}/left4dead" executabledir="${serverfiles}" executable="./srcds_run" +servercfgdir="${systemdir}/cfg" servercfg="server.cfg" servercfgdefault="server.cfg" -servercfgdir="${systemdir}/cfg" +servercfgfullpath="${servercfgdir}/${servercfg}" ## Backup Directory backupdir="${lgsmdir}/backup" diff --git a/lgsm/config-default/config-lgsm/mcbserver/_default.cfg b/lgsm/config-default/config-lgsm/mcbserver/_default.cfg index 26d25edf3..1a600d821 100644 --- a/lgsm/config-default/config-lgsm/mcbserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/mcbserver/_default.cfg @@ -134,9 +134,9 @@ glibc="2.27" systemdir="${serverfiles}" executabledir="${serverfiles}" executable="${serverfiles}/bedrock_server" +servercfgdir="${systemdir}" servercfg="server.properties" servercfgdefault="server.properties" -servercfgdir="${serverfiles}" servercfgfullpath="${servercfgdir}/${servercfg}" ## Backup Directory diff --git a/lgsm/config-default/config-lgsm/mcserver/_default.cfg b/lgsm/config-default/config-lgsm/mcserver/_default.cfg index 976d6e79b..2bfcb3d1d 100644 --- a/lgsm/config-default/config-lgsm/mcserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/mcserver/_default.cfg @@ -140,9 +140,10 @@ glibc="null" systemdir="${serverfiles}" executabledir="${serverfiles}" executable="java -Xmx${javaram}M -jar ${serverfiles}/minecraft_server.jar" +servercfgdir="${systemdir}" servercfg="server.properties" servercfgdefault="server.properties" -servercfgdir="${serverfiles}" +servercfgfullpath="${servercfgdir}/${servercfg}" ## Backup Directory backupdir="${lgsmdir}/backup" diff --git a/lgsm/config-default/config-lgsm/mhserver/_default.cfg b/lgsm/config-default/config-lgsm/mhserver/_default.cfg index 9131331fe..6a9b9a82e 100644 --- a/lgsm/config-default/config-lgsm/mhserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/mhserver/_default.cfg @@ -150,9 +150,10 @@ glibc="2.17" systemdir="${serverfiles}/Mordhau" executabledir="${systemdir}/Binaries/Linux" executable="./MordhauServer-Linux-Shipping" +servercfgdir="${systemdir}/Saved/Config/LinuxServer" servercfg="Game.ini" servercfgdefault="Game.ini" -servercfgdir="${systemdir}/Saved/Config/LinuxServer" +servercfgfullpath="${servercfgdir}/${servercfg}" ## Backup Directory backupdir="${lgsmdir}/backup" diff --git a/lgsm/config-default/config-lgsm/mohaaserver/_default.cfg b/lgsm/config-default/config-lgsm/mohaaserver/_default.cfg index 4bad82116..22d05c752 100644 --- a/lgsm/config-default/config-lgsm/mohaaserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/mohaaserver/_default.cfg @@ -136,9 +136,10 @@ glibc="2.3" systemdir="${serverfiles}/main" executabledir="${serverfiles}" executable="./mohaa_lnxded" +servercfgdir="${systemdir}" servercfg="${selfname}.cfg" servercfgdefault="server.cfg" -servercfgdir="${serverfiles}" +servercfgfullpath="${servercfgdir}/${servercfg}" ## Backup Directory backupdir="${lgsmdir}/backup" diff --git a/lgsm/config-default/config-lgsm/mtaserver/_default.cfg b/lgsm/config-default/config-lgsm/mtaserver/_default.cfg index 65c7f39fc..944f4ae57 100644 --- a/lgsm/config-default/config-lgsm/mtaserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/mtaserver/_default.cfg @@ -136,8 +136,9 @@ systemdir="${serverfiles}" resourcesdir="${systemdir}/mods/deathmatch/resources" executabledir="${systemdir}" executable="./mta-server64" -servercfg="mtaserver.conf" servercfgdir="${systemdir}/mods/deathmatch" +servercfg="mtaserver.conf" +servercfgfullpath="${servercfgdir}/${servercfg}" ## Backup Directory backupdir="${lgsmdir}/backup" diff --git a/lgsm/config-default/config-lgsm/mumbleserver/_default.cfg b/lgsm/config-default/config-lgsm/mumbleserver/_default.cfg index 56a146b1f..301318217 100644 --- a/lgsm/config-default/config-lgsm/mumbleserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/mumbleserver/_default.cfg @@ -135,9 +135,10 @@ glibc="null" systemdir="${serverfiles}" executabledir="${serverfiles}" executable="./murmur.x86" +servercfgdir="${systemdir}" servercfg="${selfname}.ini" servercfgdefault="murmur.ini" -servercfgdir="${serverfiles}" +servercfgfullpath="${servercfgdir}/${servercfg}" ## Backup Directory backupdir="${lgsmdir}/backup" diff --git a/lgsm/config-default/config-lgsm/ndserver/_default.cfg b/lgsm/config-default/config-lgsm/ndserver/_default.cfg index ee31aeffc..58092d361 100644 --- a/lgsm/config-default/config-lgsm/ndserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/ndserver/_default.cfg @@ -150,9 +150,10 @@ glibc="2.3.6" systemdir="${serverfiles}/nucleardawn" executabledir="${serverfiles}" executable="./srcds_run" +servercfgdir="${systemdir}/cfg" servercfg="${selfname}.cfg" servercfgdefault="server.cfg" -servercfgdir="${systemdir}/cfg" +servercfgfullpath="${servercfgdir}/${servercfg}" ## Backup Directory backupdir="${lgsmdir}/backup" diff --git a/lgsm/config-default/config-lgsm/nmrihserver/_default.cfg b/lgsm/config-default/config-lgsm/nmrihserver/_default.cfg index 88b7f7f3b..621962349 100644 --- a/lgsm/config-default/config-lgsm/nmrihserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/nmrihserver/_default.cfg @@ -155,9 +155,10 @@ glibc="2.15" systemdir="${serverfiles}/nmrih" executabledir="${serverfiles}" executable="./srcds_run" +servercfgdir="${systemdir}/cfg" servercfg="${selfname}.cfg" servercfgdefault="server.cfg" -servercfgdir="${systemdir}/cfg" +servercfgfullpath="${servercfgdir}/${servercfg}" ## Backup Directory backupdir="${lgsmdir}/backup" diff --git a/lgsm/config-default/config-lgsm/ns2cserver/_default.cfg b/lgsm/config-default/config-lgsm/ns2cserver/_default.cfg index 45064800b..01b6bc9b2 100644 --- a/lgsm/config-default/config-lgsm/ns2cserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/ns2cserver/_default.cfg @@ -157,7 +157,7 @@ glibc="2.15" systemdir="${serverfiles}" executabledir="${serverfiles}/ia32" executable="./ns2combatserver_linux32" -servercfgdir="${serverfiles}/${selfname}" +servercfgdir="${systemdir}/${selfname}" modstoragedir="${servercfgdir}/Workshop" ## Backup Directory diff --git a/lgsm/config-default/config-lgsm/ns2server/_default.cfg b/lgsm/config-default/config-lgsm/ns2server/_default.cfg index 7996fba74..acd89375f 100644 --- a/lgsm/config-default/config-lgsm/ns2server/_default.cfg +++ b/lgsm/config-default/config-lgsm/ns2server/_default.cfg @@ -161,7 +161,7 @@ glibc="2.17" systemdir="${serverfiles}" executabledir="${serverfiles}/x64" executable="./server_linux" -servercfgdir="${serverfiles}/${selfname}" +servercfgdir="${systemdir}/${selfname}" modstoragedir="${servercfgdir}/Workshop" ## Backup Directory diff --git a/lgsm/config-default/config-lgsm/nsserver/_default.cfg b/lgsm/config-default/config-lgsm/nsserver/_default.cfg index e59b8f771..1f0ebcb49 100644 --- a/lgsm/config-default/config-lgsm/nsserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/nsserver/_default.cfg @@ -150,9 +150,10 @@ glibc="2.3.4" systemdir="${serverfiles}/ns" executabledir="${serverfiles}" executable="./hlds_run" +servercfgdir="${systemdir}" servercfg="${selfname}.cfg" servercfgdefault="server.cfg" -servercfgdir="${systemdir}" +servercfgfullpath="${servercfgdir}/${servercfg}" ## Backup Directory backupdir="${lgsmdir}/backup" diff --git a/lgsm/config-default/config-lgsm/onsetserver/_default.cfg b/lgsm/config-default/config-lgsm/onsetserver/_default.cfg index 1d80cb85a..bf4576a6d 100644 --- a/lgsm/config-default/config-lgsm/onsetserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/onsetserver/_default.cfg @@ -142,9 +142,9 @@ glibc="2.24" systemdir="${serverfiles}" executabledir="${serverfiles}" executable="./OnsetServer" +servercfgdir="${systemdir}" servercfg="server_config.json" servercfgdefault="server_config.json" -servercfgdir="${serverfiles}" servercfgfullpath="${servercfgdir}/${servercfg}" ## Backup Directory diff --git a/lgsm/config-default/config-lgsm/opforserver/_default.cfg b/lgsm/config-default/config-lgsm/opforserver/_default.cfg index 048d09c8d..87fb58d2f 100644 --- a/lgsm/config-default/config-lgsm/opforserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/opforserver/_default.cfg @@ -150,9 +150,10 @@ glibc="2.3.4" systemdir="${serverfiles}/gearbox" executabledir="${serverfiles}" executable="./hlds_run" +servercfgdir="${systemdir}" servercfg="${selfname}.cfg" servercfgdefault="server.cfg" -servercfgdir="${systemdir}" +servercfgfullpath="${servercfgdir}/${servercfg}" ## Backup Directory backupdir="${lgsmdir}/backup" diff --git a/lgsm/config-default/config-lgsm/pcserver/_default.cfg b/lgsm/config-default/config-lgsm/pcserver/_default.cfg index f1dc3d2f0..8cf6c09ca 100644 --- a/lgsm/config-default/config-lgsm/pcserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/pcserver/_default.cfg @@ -142,9 +142,10 @@ glibc="2.4" systemdir="${serverfiles}" executabledir="${serverfiles}" executable="./DedicatedServerCmd" +servercfgdir="${systemdir}" servercfg="${selfname}.cfg" servercfgdefault="server.cfg" -servercfgdir="${systemdir}" +servercfgfullpath="${servercfgdir}/${servercfg}" ## Backup Directory backupdir="${lgsmdir}/backup" diff --git a/lgsm/config-default/config-lgsm/pstbsserver/_default.cfg b/lgsm/config-default/config-lgsm/pstbsserver/_default.cfg index 7b113335e..54cec9d8d 100644 --- a/lgsm/config-default/config-lgsm/pstbsserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/pstbsserver/_default.cfg @@ -151,9 +151,10 @@ glibc="2.17" systemdir="${serverfiles}/PostScriptum" executabledir="${serverfiles}" executable="./PostScriptumServer.sh" +servercfgdir="${systemdir}/ServerConfig" servercfg="Server.cfg" servercfgdefault="Server.cfg" -servercfgdir="${systemdir}/ServerConfig" +servercfgfullpath="${servercfgdir}/${servercfg}" ## Backup Directory backupdir="${lgsmdir}/backup" diff --git a/lgsm/config-default/config-lgsm/pvkiiserver/_default.cfg b/lgsm/config-default/config-lgsm/pvkiiserver/_default.cfg index 17b88e13b..84e1bd897 100644 --- a/lgsm/config-default/config-lgsm/pvkiiserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/pvkiiserver/_default.cfg @@ -150,9 +150,10 @@ glibc="2.15" systemdir="${serverfiles}/pvkii" executabledir="${serverfiles}" executable="./srcds_run" +servercfgdir="${systemdir}/cfg" servercfg="${selfname}.cfg" servercfgdefault="server.cfg" -servercfgdir="${systemdir}/cfg" +servercfgfullpath="${servercfgdir}/${servercfg}" ## Backup Directory backupdir="${lgsmdir}/backup" diff --git a/lgsm/config-default/config-lgsm/pzserver/_default.cfg b/lgsm/config-default/config-lgsm/pzserver/_default.cfg index c7abf6e2b..68300b0bc 100644 --- a/lgsm/config-default/config-lgsm/pzserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/pzserver/_default.cfg @@ -12,6 +12,7 @@ ip="0.0.0.0" adminpassword="CHANGE_ME" +## Server Start Command | https://docs.linuxgsm.com/configuration/start-parameters#additional-parameters fn_parms(){ parms="-ip ${ip} -adminpassword \"${adminpassword}\" -servername ${selfname}" } @@ -145,9 +146,10 @@ glibc="2.15" systemdir="${serverfiles}" executabledir="${serverfiles}" executable="./start-server.sh" +servercfgdir="${HOME}/Zomboid/Server" servercfg="${selfname}.ini" servercfgdefault="server.ini" -servercfgdir="${HOME}/Zomboid/Server" +servercfgfullpath="${servercfgdir}/${servercfg}" ## Backup Directory backupdir="${lgsmdir}/backup" diff --git a/lgsm/config-default/config-lgsm/q2server/_default.cfg b/lgsm/config-default/config-lgsm/q2server/_default.cfg index 7d65a83ac..1647eab1a 100644 --- a/lgsm/config-default/config-lgsm/q2server/_default.cfg +++ b/lgsm/config-default/config-lgsm/q2server/_default.cfg @@ -136,9 +136,10 @@ glibc="null" systemdir="${serverfiles}/baseq2" executabledir="${serverfiles}" executable="./quake2" +servercfgdir="${systemdir}" servercfg="${selfname}.cfg" servercfgdefault="server.cfg" -servercfgdir="${systemdir}" +servercfgfullpath="${servercfgdir}/${servercfg}" ## Backup Directory backupdir="${lgsmdir}/backup" diff --git a/lgsm/config-default/config-lgsm/q3server/_default.cfg b/lgsm/config-default/config-lgsm/q3server/_default.cfg index a224a59d0..cd6634afb 100644 --- a/lgsm/config-default/config-lgsm/q3server/_default.cfg +++ b/lgsm/config-default/config-lgsm/q3server/_default.cfg @@ -136,9 +136,10 @@ glibc="2.1" systemdir="${serverfiles}/baseq3" executabledir="${serverfiles}" executable="./q3ded" +servercfgdir="${systemdir}" servercfg="${selfname}.cfg" servercfgdefault="server.cfg" -servercfgdir="${systemdir}" +servercfgfullpath="${servercfgdir}/${servercfg}" ## Backup Directory backupdir="${lgsmdir}/backup" diff --git a/lgsm/config-default/config-lgsm/qlserver/_default.cfg b/lgsm/config-default/config-lgsm/qlserver/_default.cfg index c110cac07..89bcb26a3 100644 --- a/lgsm/config-default/config-lgsm/qlserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/qlserver/_default.cfg @@ -144,9 +144,10 @@ glibc="2.15" systemdir="${serverfiles}" executabledir="${serverfiles}" executable=$([ "$(uname -m)" == "x86_64" ] && echo -e "./run_server_x64.sh" || echo -e "./run_server_x86.sh") +servercfgdir="${systemdir}/baseq3" servercfg="${selfname}.cfg" servercfgdefault="server.cfg" -servercfgdir="${serverfiles}/baseq3" +servercfgfullpath="${servercfgdir}/${servercfg}" ## Backup Directory backupdir="${lgsmdir}/backup" diff --git a/lgsm/config-default/config-lgsm/qwserver/_default.cfg b/lgsm/config-default/config-lgsm/qwserver/_default.cfg index 31a8afb63..0bd55debf 100644 --- a/lgsm/config-default/config-lgsm/qwserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/qwserver/_default.cfg @@ -135,9 +135,10 @@ glibc="2.17" systemdir="${serverfiles}/ktx" executabledir="${serverfiles}" executable="./mvdsv" +servercfgdir="${systemdir}" servercfg="${selfname}.cfg" servercfgdefault="server.cfg" -servercfgdir="${systemdir}" +servercfgfullpath="${servercfgdir}/${servercfg}" ## Backup Directory backupdir="${lgsmdir}/backup" diff --git a/lgsm/config-default/config-lgsm/ricochetserver/_default.cfg b/lgsm/config-default/config-lgsm/ricochetserver/_default.cfg index 2b5a3522c..787571afd 100644 --- a/lgsm/config-default/config-lgsm/ricochetserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/ricochetserver/_default.cfg @@ -150,9 +150,10 @@ glibc="2.3.4" systemdir="${serverfiles}/ricochet" executabledir="${serverfiles}" executable="./hlds_run" +servercfgdir="${systemdir}" servercfg="${selfname}.cfg" servercfgdefault="server.cfg" -servercfgdir="${systemdir}" +servercfgfullpath="${servercfgdir}/${servercfg}" ## Backup Directory backupdir="${lgsmdir}/backup" diff --git a/lgsm/config-default/config-lgsm/roserver/_default.cfg b/lgsm/config-default/config-lgsm/roserver/_default.cfg index 15f56c2e5..ab9c1625b 100644 --- a/lgsm/config-default/config-lgsm/roserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/roserver/_default.cfg @@ -150,10 +150,11 @@ glibc="2.4" serverfiles="${rootdir}/serverfiles" systemdir="${serverfiles}/system" executabledir="${systemdir}" -executable="./ucc-bin" +executable="./ucc-bin"servercfgdir="${systemdir}" +servercfgdir="${systemdir}" servercfg="${selfname}.ini" servercfgdefault="default.ini" -servercfgdir="${systemdir}" +servercfgfullpath="${servercfgdir}/${servercfg}" compressedmapsdir="${rootdir}/Maps-Compressed" ## Backup Directory diff --git a/lgsm/config-default/config-lgsm/rtcwserver/_default.cfg b/lgsm/config-default/config-lgsm/rtcwserver/_default.cfg index f16d5c89e..792c1a7f8 100644 --- a/lgsm/config-default/config-lgsm/rtcwserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/rtcwserver/_default.cfg @@ -136,9 +136,10 @@ glibc="2.1" systemdir="${serverfiles}/main" executabledir="${serverfiles}" executable="./iowolfded.x86_64" +servercfgdir="${systemdir}" servercfg="${selfname}.cfg" servercfgdefault="server.cfg" -servercfgdir="${systemdir}" +servercfgfullpath="${servercfgdir}/${servercfg}" ## Backup Directory backupdir="${lgsmdir}/backup" diff --git a/lgsm/config-default/config-lgsm/rustserver/_default.cfg b/lgsm/config-default/config-lgsm/rustserver/_default.cfg index 7171bcc2d..abb9c79df 100644 --- a/lgsm/config-default/config-lgsm/rustserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/rustserver/_default.cfg @@ -175,9 +175,10 @@ systemdir="${serverfiles}" executabledir="${serverfiles}" executable="./RustDedicated" serveridentitydir="${systemdir}/server/${selfname}" +servercfgdir="${serveridentitydir}/cfg" servercfg="server.cfg" servercfgdefault="server.cfg" -servercfgdir="${serveridentitydir}/cfg" +servercfgfullpath="${servercfgdir}/${servercfg}" ## Backup Directory backupdir="${lgsmdir}/backup" diff --git a/lgsm/config-default/config-lgsm/rwserver/_default.cfg b/lgsm/config-default/config-lgsm/rwserver/_default.cfg index 17f06b7be..37e755c29 100644 --- a/lgsm/config-default/config-lgsm/rwserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/rwserver/_default.cfg @@ -145,9 +145,10 @@ glibc="null" systemdir="${serverfiles}" executabledir="${serverfiles}" executable="java -Xmx${javaram}m -jar ${serverfiles}/server.jar" +servercfgdir="${systemdir}" servercfg="server.properties" servercfgdefault="server.properties" -servercfgdir="${serverfiles}" +servercfgfullpath="${servercfgdir}/${servercfg}" ## Backup Directory backupdir="${lgsmdir}/backup" diff --git a/lgsm/config-default/config-lgsm/sampserver/_default.cfg b/lgsm/config-default/config-lgsm/sampserver/_default.cfg index 4b2d7bf9b..a658daa0c 100644 --- a/lgsm/config-default/config-lgsm/sampserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/sampserver/_default.cfg @@ -135,9 +135,10 @@ glibc="2.3" systemdir="${serverfiles}" executabledir="${systemdir}/samp03" executable="./samp03svr" +servercfgdir="${systemdir}/samp03" servercfg="server.cfg" servercfgdefault="server.cfg" -servercfgdir="${systemdir}/samp03" +servercfgfullpath="${servercfgdir}/${servercfg}" ## Backup Directory backupdir="${lgsmdir}/backup" diff --git a/lgsm/config-default/config-lgsm/sbotsserver/_default.cfg b/lgsm/config-default/config-lgsm/sbotsserver/_default.cfg index 507cb8db6..6fb2b3579 100644 --- a/lgsm/config-default/config-lgsm/sbotsserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/sbotsserver/_default.cfg @@ -150,9 +150,10 @@ glibc="2.17" systemdir="${serverfiles}" executabledir="${systemdir}/blank1/Binaries/Linux" executable="./blank1Server-Linux-Shipping" +servercfgdir="${systemdir}/blank1/Saved/Config/LinuxServer" servercfg="Game.ini" servercfgdefault="Game.ini" -servercfgdir="${systemdir}/blank1/Saved/Config/LinuxServer" +servercfgfullpath="${servercfgdir}/${servercfg}" ## Backup Directory backupdir="${lgsmdir}/backup" diff --git a/lgsm/config-default/config-lgsm/sbserver/_default.cfg b/lgsm/config-default/config-lgsm/sbserver/_default.cfg index 25e368531..fa9560f6c 100644 --- a/lgsm/config-default/config-lgsm/sbserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/sbserver/_default.cfg @@ -148,9 +148,10 @@ glibc="2.17" systemdir="${serverfiles}" executabledir="${serverfiles}/linux" executable="./starbound_server" +servercfgdir="${systemdir}/storage" servercfg="starbound_server.config" servercfgdefault="starbound_server.config" -servercfgdir="${serverfiles}/storage" +servercfgfullpath="${servercfgdir}/${servercfg}" ## Backup Directory backupdir="${lgsmdir}/backup" diff --git a/lgsm/config-default/config-lgsm/sdtdserver/_default.cfg b/lgsm/config-default/config-lgsm/sdtdserver/_default.cfg index a82a1884b..a67e5795d 100644 --- a/lgsm/config-default/config-lgsm/sdtdserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/sdtdserver/_default.cfg @@ -145,10 +145,11 @@ glibc="2.15" systemdir="${serverfiles}" executabledir="${serverfiles}" executable=$([ "$(uname -m)" == "x86_64" ] && echo -e "./7DaysToDieServer.x86_64" || echo -e "./7DaysToDieServer.x86") +servercfgdir="${systemdir}" servercfg="${selfname}.xml" -servercfgdefault="serverconfig.xml" -servercfgdir="${serverfiles}" servercfgdirdefault="${serverfiles}" +servercfgdefault="serverconfig.xml" +servercfgfullpath="${servercfgdir}/${servercfg}" ## Backup Directory backupdir="${lgsmdir}/backup" diff --git a/lgsm/config-default/config-lgsm/sfcserver/_default.cfg b/lgsm/config-default/config-lgsm/sfcserver/_default.cfg index 87ceb5ac8..f9d6ad595 100644 --- a/lgsm/config-default/config-lgsm/sfcserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/sfcserver/_default.cfg @@ -150,9 +150,10 @@ glibc="2.15" systemdir="${serverfiles}/sfclassic" executabledir="${serverfiles}" executable="./srcds_run" +servercfgdir="${systemdir}/cfg" servercfg="${selfname}.cfg" servercfgdefault="server.cfg" -servercfgdir="${systemdir}/cfg" +servercfgfullpath="${servercfgdir}/${servercfg}" ## Backup Directory backupdir="${lgsmdir}/backup" diff --git a/lgsm/config-default/config-lgsm/sof2server/_default.cfg b/lgsm/config-default/config-lgsm/sof2server/_default.cfg index 4ed79bd37..bd8110274 100644 --- a/lgsm/config-default/config-lgsm/sof2server/_default.cfg +++ b/lgsm/config-default/config-lgsm/sof2server/_default.cfg @@ -136,9 +136,10 @@ glibc="2.1" systemdir="${serverfiles}/main" executabledir="${serverfiles}" executable="./sof2ded" +servercfgdir="${systemdir}" servercfg="${selfname}.cfg" servercfgdefault="server.cfg" -servercfgdir="${systemdir}" +servercfgfullpath="${servercfgdir}/${servercfg}" ## Backup Directory backupdir="${lgsmdir}/backup" diff --git a/lgsm/config-default/config-lgsm/solserver/_default.cfg b/lgsm/config-default/config-lgsm/solserver/_default.cfg index 908165bb9..2a923d554 100644 --- a/lgsm/config-default/config-lgsm/solserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/solserver/_default.cfg @@ -140,6 +140,7 @@ executable="./soldatserver" servercfgdir="${systemdir}" servercfg="soldat.ini" servercfgdefault="soldat.ini" +servercfgfullpath="${servercfgdir}/${servercfg}" ## Backup Directory backupdir="${lgsmdir}/backup" diff --git a/lgsm/config-default/config-lgsm/squadserver/_default.cfg b/lgsm/config-default/config-lgsm/squadserver/_default.cfg index 1ef3b6194..f75bd2667 100644 --- a/lgsm/config-default/config-lgsm/squadserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/squadserver/_default.cfg @@ -147,9 +147,10 @@ glibc="2.17" systemdir="${serverfiles}/Squad" executabledir="${serverfiles}" executable="./SquadGameServer.sh" +servercfgdir="${systemdir}/ServerConfig" servercfg="${selfname}.cfg" servercfgdefault="Server.cfg" -servercfgdir="${systemdir}/ServerConfig" +servercfgfullpath="${servercfgdir}/${servercfg}" ## Backup Directory backupdir="${lgsmdir}/backup" diff --git a/lgsm/config-default/config-lgsm/ss3server/_default.cfg b/lgsm/config-default/config-lgsm/ss3server/_default.cfg index 11d32ea60..f5ab99168 100644 --- a/lgsm/config-default/config-lgsm/ss3server/_default.cfg +++ b/lgsm/config-default/config-lgsm/ss3server/_default.cfg @@ -146,9 +146,10 @@ glibc="2.13" systemdir="${serverfiles}/Bin" executabledir="${systemdir}" executable="./runSam3_DedicatedServer.sh" +servercfgdir="${serverfiles}/Content/SeriousSam3/Config" servercfg="${selfname}.ini" servercfgdefault="server.ini" -servercfgdir="${serverfiles}/Content/SeriousSam3/Config" +servercfgfullpath="${servercfgdir}/${servercfg}" ## Backup Directory backupdir="${lgsmdir}/backup" diff --git a/lgsm/config-default/config-lgsm/stserver/_default.cfg b/lgsm/config-default/config-lgsm/stserver/_default.cfg index 35d399bcd..60fb0ebfa 100644 --- a/lgsm/config-default/config-lgsm/stserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/stserver/_default.cfg @@ -152,9 +152,10 @@ glibc="2.15" systemdir="${serverfiles}" executabledir="${serverfiles}" executable="./rocketstation_DedicatedServer.x86_64" +servercfgdir="${systemdir}" servercfg="default.ini" servercfgdefault="default.ini" -servercfgdir="${systemdir}" +servercfgfullpath="${servercfgdir}/${servercfg}" ## Backup Directory backupdir="${lgsmdir}/backup" diff --git a/lgsm/config-default/config-lgsm/svenserver/_default.cfg b/lgsm/config-default/config-lgsm/svenserver/_default.cfg index efff4bf99..3036470b7 100644 --- a/lgsm/config-default/config-lgsm/svenserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/svenserver/_default.cfg @@ -149,9 +149,10 @@ glibc="2.24" systemdir="${serverfiles}/svencoop" executabledir="${serverfiles}" executable="./svends_run" +servercfgdir="${systemdir}" servercfg="${selfname}.cfg" servercfgdefault="server.cfg" -servercfgdir="${systemdir}" +servercfgfullpath="${servercfgdir}/${servercfg}" ## Backup Directory backupdir="${lgsmdir}/backup" diff --git a/lgsm/config-default/config-lgsm/terrariaserver/_default.cfg b/lgsm/config-default/config-lgsm/terrariaserver/_default.cfg index b7525e35e..574e18345 100644 --- a/lgsm/config-default/config-lgsm/terrariaserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/terrariaserver/_default.cfg @@ -149,9 +149,10 @@ glibc="2.7" systemdir="${serverfiles}" executabledir="${serverfiles}" executable="./TerrariaServer" +servercfgdir="${systemdir}" servercfg="${selfname}.txt" servercfgdefault="serverconfig.txt" -servercfgdir="${serverfiles}" +servercfgfullpath="${servercfgdir}/${servercfg}" ## Backup Directory backupdir="${lgsmdir}/backup" diff --git a/lgsm/config-default/config-lgsm/tf2server/_default.cfg b/lgsm/config-default/config-lgsm/tf2server/_default.cfg index 4eecf94c5..5655d9c9e 100644 --- a/lgsm/config-default/config-lgsm/tf2server/_default.cfg +++ b/lgsm/config-default/config-lgsm/tf2server/_default.cfg @@ -155,9 +155,10 @@ glibc="2.15" systemdir="${serverfiles}/tf" executabledir="${serverfiles}" executable="./srcds_run" +servercfgdir="${systemdir}/cfg" servercfg="${selfname}.cfg" servercfgdefault="server.cfg" -servercfgdir="${systemdir}/cfg" +servercfgfullpath="${servercfgdir}/${servercfg}" ## Backup Directory backupdir="${lgsmdir}/backup" diff --git a/lgsm/config-default/config-lgsm/tfcserver/_default.cfg b/lgsm/config-default/config-lgsm/tfcserver/_default.cfg index f7d01e2e2..e9158641b 100644 --- a/lgsm/config-default/config-lgsm/tfcserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/tfcserver/_default.cfg @@ -150,9 +150,10 @@ glibc="2.3.4" systemdir="${serverfiles}/tfc" executabledir="${serverfiles}" executable="./hlds_run" +servercfgdir="${systemdir}" servercfg="${selfname}.cfg" servercfgdefault="server.cfg" -servercfgdir="${systemdir}" +servercfgfullpath="${servercfgdir}/${servercfg}" ## Backup Directory backupdir="${lgsmdir}/backup" diff --git a/lgsm/config-default/config-lgsm/ts3server/_default.cfg b/lgsm/config-default/config-lgsm/ts3server/_default.cfg index f1a682f66..54fd8ac0e 100644 --- a/lgsm/config-default/config-lgsm/ts3server/_default.cfg +++ b/lgsm/config-default/config-lgsm/ts3server/_default.cfg @@ -6,7 +6,7 @@ # common.cfg - applies settings to every instance. # [instance].cfg - applies settings to a specific instance. -#### Server Settings #### +#### Game Server Settings #### ## Server Start Settings | https://docs.linuxgsm.com/configuration/start-parameters # Edit serverfiles/ts3server.ini after installation @@ -138,9 +138,10 @@ glibc="2.17" systemdir="${serverfiles}" executabledir="${serverfiles}" executable="./ts3server" +servercfgdir="${systemdir}" servercfg="${selfname}.ini" servercfgdefault="ts3server.ini" -servercfgdir="${serverfiles}" +servercfgfullpath="${servercfgdir}/${servercfg}" ## Backup Directory backupdir="${lgsmdir}/backup" diff --git a/lgsm/config-default/config-lgsm/tsserver/_default.cfg b/lgsm/config-default/config-lgsm/tsserver/_default.cfg index b3a53d960..232087699 100644 --- a/lgsm/config-default/config-lgsm/tsserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/tsserver/_default.cfg @@ -150,9 +150,10 @@ glibc="2.3.4" systemdir="${serverfiles}/ts" executabledir="${serverfiles}" executable="./hlds_run" +servercfgdir="${systemdir}" servercfg="${selfname}.cfg" servercfgdefault="server.cfg" -servercfgdir="${systemdir}" +servercfgfullpath="${servercfgdir}/${servercfg}" ## Backup Directory backupdir="${lgsmdir}/backup" diff --git a/lgsm/config-default/config-lgsm/tuserver/_default.cfg b/lgsm/config-default/config-lgsm/tuserver/_default.cfg index 904e483fa..36521c885 100644 --- a/lgsm/config-default/config-lgsm/tuserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/tuserver/_default.cfg @@ -152,11 +152,10 @@ glibc="2.17" systemdir="${serverfiles}/Tower" executabledir="${systemdir}/Binaries/Linux" executable="./TowerServer-Linux-Shipping" -servercfg="${selfname}.ini" -servercfgdefault="TowerServer.ini" servercfgdir="${systemdir}/Binaries/Linux" -servercfg="${servicename}.ini" +servercfg="${selfname}.ini" servercfgdefault="TowerServer.ini" +servercfgfullpath="${servercfgdir}/${servercfg}" ## Backup Directory backupdir="${lgsmdir}/backup" diff --git a/lgsm/config-default/config-lgsm/twserver/_default.cfg b/lgsm/config-default/config-lgsm/twserver/_default.cfg index e0720b72d..4762f3fdc 100644 --- a/lgsm/config-default/config-lgsm/twserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/twserver/_default.cfg @@ -149,9 +149,10 @@ glibc="2.14" systemdir="${serverfiles}/tw" executabledir="${systemdir}" executable="./teeworlds_srv" +servercfgdir="${systemdir}" servercfg="${selfname}.cfg" # Teeworlds can also auto load any config if an autoexec.cfg file is present in the server dir servercfgdefault="server.cfg" -servercfgdir="${serverfiles}/tw" +servercfgfullpath="${servercfgdir}/${servercfg}" ## Backup Directory backupdir="${lgsmdir}/backup" diff --git a/lgsm/config-default/config-lgsm/untserver/_default.cfg b/lgsm/config-default/config-lgsm/untserver/_default.cfg index 78b80f8e1..713ccb7d2 100644 --- a/lgsm/config-default/config-lgsm/untserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/untserver/_default.cfg @@ -155,6 +155,7 @@ executable="./Unturned_Headless.x86_64" servercfgdir="${systemdir}/Servers/${selfname}" servercfg="Config.json" servercfgdefault="Config.json" +servercfgfullpath="${servercfgdir}/${servercfg}" ## Backup Directory backupdir="${lgsmdir}/backup" diff --git a/lgsm/config-default/config-lgsm/ut2k4server/_default.cfg b/lgsm/config-default/config-lgsm/ut2k4server/_default.cfg index 0402273b5..8e1d6fc55 100644 --- a/lgsm/config-default/config-lgsm/ut2k4server/_default.cfg +++ b/lgsm/config-default/config-lgsm/ut2k4server/_default.cfg @@ -135,9 +135,10 @@ glibc="2.4" systemdir="${serverfiles}/System" executabledir="${systemdir}" executable="./ucc-bin" +servercfgdir="${systemdir}" servercfg="${selfname}.ini" servercfgdefault="UT2004.ini" -servercfgdir="${systemdir}" +servercfgfullpath="${servercfgdir}/${servercfg}" compressedmapsdir="${rootdir}/Maps-Compressed" ## Backup Directory diff --git a/lgsm/config-default/config-lgsm/ut3server/_default.cfg b/lgsm/config-default/config-lgsm/ut3server/_default.cfg index eb1b49c52..421ce42b3 100644 --- a/lgsm/config-default/config-lgsm/ut3server/_default.cfg +++ b/lgsm/config-default/config-lgsm/ut3server/_default.cfg @@ -146,9 +146,10 @@ glibc="2.3.2" systemdir="${serverfiles}" executabledir="${systemdir}/Binaries" executable="./ut3" +servercfgdir="${systemdir}/UTGame/Config/${selfname}" servercfg="UTGame.ini" servercfgdefault="UTGame.ini" -servercfgdir="${systemdir}/UTGame/Config/${selfname}" +servercfgfullpath="${servercfgdir}/${servercfg}" ## Backup Directory backupdir="${lgsmdir}/backup" diff --git a/lgsm/config-default/config-lgsm/ut99server/_default.cfg b/lgsm/config-default/config-lgsm/ut99server/_default.cfg index bc87f8532..b74e0b14e 100644 --- a/lgsm/config-default/config-lgsm/ut99server/_default.cfg +++ b/lgsm/config-default/config-lgsm/ut99server/_default.cfg @@ -135,9 +135,10 @@ glibc="2.1" systemdir="${serverfiles}/System" executabledir="${systemdir}" executable="./ucc-bin" +servercfgdir="${systemdir}" servercfg="${selfname}.ini" servercfgdefault="Default.ini" -servercfgdir="${systemdir}" +servercfgfullpath="${servercfgdir}/${servercfg}" compressedmapsdir="${rootdir}/Maps-Compressed" ## Backup Directory diff --git a/lgsm/config-default/config-lgsm/utserver/_default.cfg b/lgsm/config-default/config-lgsm/utserver/_default.cfg index 4784f0bcd..fe8da5aca 100644 --- a/lgsm/config-default/config-lgsm/utserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/utserver/_default.cfg @@ -139,8 +139,9 @@ glibc="2.17" systemdir="${serverfiles}/LinuxServer" executabledir="${systemdir}/Engine/Binaries/Linux" executable="./UE4Server-Linux-Shipping" -servercfg="Game.ini" servercfgdir="${systemdir}/UnrealTournament/Saved/Config/LinuxServer" +servercfg="Game.ini" +servercfgfullpath="${servercfgdir}/${servercfg}" ## Backup Directory backupdir="${lgsmdir}/backup" diff --git a/lgsm/config-default/config-lgsm/vsserver/_default.cfg b/lgsm/config-default/config-lgsm/vsserver/_default.cfg index 5c64eb494..484929179 100644 --- a/lgsm/config-default/config-lgsm/vsserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/vsserver/_default.cfg @@ -150,9 +150,10 @@ glibc="2.3.4" systemdir="${serverfiles}/vs" executabledir="${serverfiles}" executable="./hlds_run" +servercfgdir="${systemdir}" servercfg="${selfname}.cfg" servercfgdefault="server.cfg" -servercfgdir="${systemdir}" +servercfgfullpath="${servercfgdir}/${servercfg}" ## Backup Directory backupdir="${lgsmdir}/backup" diff --git a/lgsm/config-default/config-lgsm/wetserver/_default.cfg b/lgsm/config-default/config-lgsm/wetserver/_default.cfg index 4105e9290..e52be9249 100644 --- a/lgsm/config-default/config-lgsm/wetserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/wetserver/_default.cfg @@ -131,9 +131,10 @@ glibc="2.2.4" systemdir="${serverfiles}" executabledir="${systemdir}" executable="./etded" +servercfgdir="${systemdir}/etmain" servercfg="${selfname}.cfg" servercfgdefault="server.cfg" -servercfgdir="${systemdir}/etmain" +servercfgfullpath="${servercfgdir}/${servercfg}" ## Backup Directory backupdir="${lgsmdir}/backup" diff --git a/lgsm/config-default/config-lgsm/wfserver/_default.cfg b/lgsm/config-default/config-lgsm/wfserver/_default.cfg index c9b88997e..f5da24af7 100644 --- a/lgsm/config-default/config-lgsm/wfserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/wfserver/_default.cfg @@ -145,9 +145,10 @@ glibc="2.15" systemdir="${serverfiles}/Warfork.app/Contents/Resources" executabledir="${systemdir}" executable="./wf_server.x86_64" +servercfgdir="${systemdir}/basewf" servercfg="${selfname}.cfg" servercfgdefault="server.cfg" -servercfgdir="${systemdir}/basewf" +servercfgfullpath="${servercfgdir}/${servercfg}" ## Backup Directory backupdir="${lgsmdir}/backup" diff --git a/lgsm/config-default/config-lgsm/wurmserver/_default.cfg b/lgsm/config-default/config-lgsm/wurmserver/_default.cfg index 9240ba2c9..47b0fbc0b 100644 --- a/lgsm/config-default/config-lgsm/wurmserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/wurmserver/_default.cfg @@ -141,9 +141,10 @@ glibc="2.14" systemdir="${serverfiles}" executabledir="${systemdir}" executable="xvfb-run ./WurmServerLauncher" +servercfgdir="${systemdir}" servercfg="${selfname}.cfg" servercfgdefault="server.cfg" -servercfgdir="${systemdir}" +servercfgfullpath="${servercfgdir}/${servercfg}" ## Backup Directory backupdir="${lgsmdir}/backup" diff --git a/lgsm/config-default/config-lgsm/zmrserver/_default.cfg b/lgsm/config-default/config-lgsm/zmrserver/_default.cfg index acc06176a..db1853930 100644 --- a/lgsm/config-default/config-lgsm/zmrserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/zmrserver/_default.cfg @@ -150,9 +150,10 @@ glibc="2.15" systemdir="${serverfiles}/zombie_master_reborn" executabledir="${serverfiles}" executable="./srcds_run" +servercfgdir="${systemdir}/cfg" servercfg="${selfname}.cfg" servercfgdefault="server.cfg" -servercfgdir="${systemdir}/cfg" +servercfgfullpath="${servercfgdir}/${servercfg}" ## Backup Directory backupdir="${lgsmdir}/backup" diff --git a/lgsm/config-default/config-lgsm/zpsserver/_default.cfg b/lgsm/config-default/config-lgsm/zpsserver/_default.cfg index 6068d091c..bfeceda7e 100644 --- a/lgsm/config-default/config-lgsm/zpsserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/zpsserver/_default.cfg @@ -155,9 +155,10 @@ glibc="2.15" systemdir="${serverfiles}/zps" executabledir="${serverfiles}" executable="./srcds_run" +servercfgdir="${systemdir}/cfg" servercfg="${selfname}.cfg" servercfgdefault="server.cfg" -servercfgdir="${systemdir}/cfg" +servercfgfullpath="${servercfgdir}/${servercfg}" ## Backup Directory backupdir="${lgsmdir}/backup" diff --git a/lgsm/functions/check_config.sh b/lgsm/functions/check_config.sh index c66892a2d..a4aa11997 100644 --- a/lgsm/functions/check_config.sh +++ b/lgsm/functions/check_config.sh @@ -7,8 +7,6 @@ local modulename="CHECK" local function_selfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" -servercfgfullpath="${servercfgdir}/${servercfg}" - if [ ! -f "${servercfgfullpath}" ]; then if [ "${shortname}" != "hw" ]&&[ "${shortname}" != "ut3" ]&&[ "${shortname}" != "kf2" ]; then fn_print_dots "" diff --git a/lgsm/functions/command_monitor.sh b/lgsm/functions/command_monitor.sh index 142b5af2e..1ec7b194d 100644 --- a/lgsm/functions/command_monitor.sh +++ b/lgsm/functions/command_monitor.sh @@ -238,13 +238,15 @@ info_parms.sh fn_monitor_check_lockfile fn_monitor_check_update fn_monitor_check_session -fn_monitor_check_queryport +# Monitor will not continue if session only check. +if [ "${querymode}" != "1" ]; then + fn_monitor_check_queryport -# Add a querydelay of 1 min if var missing. -if [ -z "${querydelay}" ]; then - querydelay="1" -fi - -fn_monitor_loop + # Add a querydelay of 1 min if var missing. + if [ -z "${querydelay}" ]; then + querydelay="1" + fi + fn_monitor_loop +fi core_exit.sh diff --git a/lgsm/functions/info_config.sh b/lgsm/functions/info_config.sh index cc1fcb840..9618d60c6 100644 --- a/lgsm/functions/info_config.sh +++ b/lgsm/functions/info_config.sh @@ -421,14 +421,14 @@ fn_info_config_onset(){ maxplayers="${zero}" port="${zero}" httpport="${zero}" - queryport="${zero}" + queryport="${zero}" else servername=$(grep -v "servername_short" "${servercfgfullpath}" | grep "servername" | sed -e 's/^[ \t]*//g' -e '/^#/d' -e 's/servername//g' | tr -d '=\";,:' | sed -e 's/^[ \t]*//' -e 's/[ \t]*$//' ) maxplayers=$(grep "maxplayers" "${servercfgfullpath}" | grep -v "#" | tr -cd '[:digit:]') port=$(grep "port" "${servercfgfullpath}" | grep -v "#" | tr -cd '[:digit:]') httpport=$((port-2)) - queryport=$((port-1)) - + queryport=$((port-1)) + # Not Set servername=${servername:-"NOT SET"} maxplayers=${maxplayers:-"NOT SET"} diff --git a/lgsm/functions/info_messages.sh b/lgsm/functions/info_messages.sh index b5471e01a..035cc6abe 100644 --- a/lgsm/functions/info_messages.sh +++ b/lgsm/functions/info_messages.sh @@ -540,7 +540,7 @@ fn_info_message_ports(){ echo -e "${lightblue}Change ports by editing the parameters in:${default}" parmslocation="${red}UNKNOWN${default}" - # engines/games that require editing in the config file + # engines/games that require editing in the config file. local ports_edit_array=( "avalanche2.0" "avalanche3.0" "Ballistic Overkill" "dontstarve" "Eco" "idtech2" "idtech3" "idtech3_ql" "lwjgl2" "Minecraft Bedrock" "Project Cars" "projectzomboid" "quake" "refractor" "realvirtuality" "renderware" "seriousengine35" "Stationeers" "teeworlds" "terraria" "unreal" "unreal2" "unreal3" "TeamSpeak 3" "Mumble" "7 Days To Die" "wurm") for port_edit in "${ports_edit_array[@]}" do @@ -552,7 +552,7 @@ fn_info_message_ports(){ parmslocation="${servercfgfullpath}" fi done - # engines/games that require editing the parms + # engines/games that require editing the parms. local ports_edit_array=( "goldsource" "Factorio" "Hurtworld" "iw3.0" "ioquake3" "qfusion" "Rust" "Soldat" "spark" "source" "starbound" "unreal4" "realvirtuality" "Unturned" ) for port_edit in "${ports_edit_array[@]}" do diff --git a/lgsm/functions/info_parms.sh b/lgsm/functions/info_parms.sh index 37bd56416..a4d483bb3 100644 --- a/lgsm/functions/info_parms.sh +++ b/lgsm/functions/info_parms.sh @@ -42,13 +42,8 @@ fn_info_parms_dst(){ cave=${cave:-"NOT SET"} } -fn_info_parms_eco(){ - queryport=${webadminport:-"0"} -} - fn_info_parms_factorio(){ port=${port:-"0"} - queryport=${rconport:-"0"} rconport=${rconport:-"0"} rconpassword=${rconpassword:-"NOT SET"} } @@ -118,7 +113,6 @@ fn_info_parms_realvirtuality(){ fn_info_parms_risingworld(){ servername=${servername:-"NOT SET"} port=${port:-"0"} - queryport=${port:-"0"} httpqueryport=$((port - 1)) } @@ -229,7 +223,6 @@ fn_info_parms_unreal3(){ fn_info_parms_unturned(){ servername=${selfname:-"NOT SET"} port=${port:-"0"} - queryport=$((port + 1)) } fn_info_parms_ut(){ @@ -254,9 +247,6 @@ elif [ "${shortname}" == "bt" ]; then # Call of Duty elif [ "${shortname}" == "cod" ]||[ "${shortname}" == "coduo" ]||[ "${engine}" == "iw2.0" ]||[ "${engine}" == "iw3.0" ]; then fn_info_parms_cod -# Eco -elif [ "${shortname}" == "eco" ]; then - fn_info_parms_eco # Factorio elif [ "${shortname}" == "fctr" ]; then fn_info_parms_factorio diff --git a/lgsm/functions/install_config.sh b/lgsm/functions/install_config.sh index e54f6215d..f6d08a8d6 100644 --- a/lgsm/functions/install_config.sh +++ b/lgsm/functions/install_config.sh @@ -56,7 +56,7 @@ fn_default_config_remote(){ # Copys local default config to server config location. fn_default_config_local(){ echo -e "copying ${servercfgdefault} config file." - cp -nv "${servercfgdirdefault}/${servercfgdefault}" "${servercfgfullpath}" + cp -nv "${servercfgdir}/${servercfgdefault}" "${servercfgfullpath}" fn_sleep_time } diff --git a/tests/tests_defaultcfg/defaultcfg_0.txt b/tests/tests_defaultcfg/defaultcfg_0.txt index ac95a5715..50c1d0ee6 100644 --- a/tests/tests_defaultcfg/defaultcfg_0.txt +++ b/tests/tests_defaultcfg/defaultcfg_0.txt @@ -36,12 +36,18 @@ querydelay ansi sleeptime stopmode +querymode +querytype gamename engine glibc systemdir executabledir executable +servercfgdir +servercfg +servercfgdefault +servercfgfullpath backupdir logdir lgsmlogdir diff --git a/tests/tests_defaultcfg/tests_defaultcfg.sh b/tests/tests_defaultcfg/tests_defaultcfg.sh index 5b9b47f2a..4039d90e7 100644 --- a/tests/tests_defaultcfg/tests_defaultcfg.sh +++ b/tests/tests_defaultcfg/tests_defaultcfg.sh @@ -5,14 +5,16 @@ echo -e "==================================================================" echo -e "Description:" echo -e "test checks that vars present in ALL _default.cfg files are correct." echo -e "" +echo -e "In master config < | > In game config" find "lgsm/config-default/config-lgsm/" ! -name '*template.cfg' -name "*.cfg" -type f -print0 | while IFS= read -r -d $'\0' line; do - grep = ${line} | cut -f1 -d"=" > defaultcfgtemp.txt + grep "=" "${line}" | cut -f1 -d"=" > defaultcfgtemp.txt diffoutput=$(diff tests/tests_defaultcfg/defaultcfg_0.txt defaultcfgtemp.txt) if [ "${diffoutput}" ]; then echo "File with errors:" echo "${line}" echo -e "=================================" + echo -e "In master config < | > In game config" echo "${diffoutput}" echo "" fi @@ -25,6 +27,7 @@ echo -e "==================================================================" echo -e "Description:" echo -e "test checks that vars present in ALL _default.cfg files are correct." echo -e "" +echo -e "In master config < | > In game config" find lgsm/config-default/config-lgsm/ ! -name '*template.cfg' -name "*.cfg" -type f -print0 | while IFS= read -r -d $'\0' line; do grep "=" "${line}" | cut -f1 -d"=" > defaultcfgtemp.txt @@ -33,6 +36,7 @@ while IFS= read -r -d $'\0' line; do echo "File with errors:" echo "${line}" echo -e "=================================" + echo -e "In master config < | > In game config" echo "${diffoutput}" echo "" fi @@ -45,6 +49,7 @@ echo -e "==================================================================" echo -e "Description:" echo -e "test checks that comments in ALL _default.cfg files are correct." echo -e "" +echo -e "In master config < | > In game config" find lgsm/config-default/config-lgsm/ ! -name '*template.cfg' -name "*.cfg" -type f -print0 | while IFS= read -r -d $'\0' line; do grep "#" "${line}" > defaultcfgtemp.txt From 877d4b7ebe75f0e034c67c2bce45d1aac3f339a3 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Fri, 13 Mar 2020 07:13:37 +0000 Subject: [PATCH 300/534] release v20.1.0 --- linuxgsm.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/linuxgsm.sh b/linuxgsm.sh index ccfccbce0..0d9f6252c 100755 --- a/linuxgsm.sh +++ b/linuxgsm.sh @@ -20,7 +20,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="v19.12.5" +version="v20.1.0" shortname="core" gameservername="core" rootdir=$(dirname "$(readlink -f "${BASH_SOURCE[0]}")") From 022657eba0adee3d0dce865c7354c0e1c62a755c Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Fri, 13 Mar 2020 11:12:31 +0000 Subject: [PATCH 301/534] feat(install): change lib32tinfo5 to libtinfo5:i386 (#2740) --- 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 79f6f76c4..28b2b593c 100644 --- a/lgsm/functions/check_deps.sh +++ b/lgsm/functions/check_deps.sh @@ -352,7 +352,7 @@ fn_deps_build_debian(){ # No More Room in Hell, Counter-Strike: Source, Garry's Mod and Zombie Panic: Source elif [ "${shortname}" == "nmrih" ]||[ "${shortname}" == "css" ]||[ "${shortname}" == "gmod" ]||[ "${shortname}" == "zps" ]; then if [ "${arch}" == "x86_64" ]; then - array_deps_required+=( lib32tinfo5 ) + array_deps_required+=( libtinfo5:i386 ) else array_deps_required+=( libtinfo5 ) fi From f6c332bac01e1df74aed6f816344cfb02c22128d Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Fri, 13 Mar 2020 12:48:20 +0000 Subject: [PATCH 302/534] fix(dstserver): fix config installation (#2742) * fix(dstserver): move cluster configvars --- lgsm/config-default/config-lgsm/dstserver/_default.cfg | 8 ++++---- lgsm/functions/check_deps.sh | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/lgsm/config-default/config-lgsm/dstserver/_default.cfg b/lgsm/config-default/config-lgsm/dstserver/_default.cfg index 2e9439d06..f93bca058 100644 --- a/lgsm/config-default/config-lgsm/dstserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/dstserver/_default.cfg @@ -153,14 +153,14 @@ glibc="2.15" systemdir="${serverfiles}" executabledir="${serverfiles}/bin" executable="./dontstarve_dedicated_server_nullrenderer" -servercfgdir="${clustercfgdir}/${shard}" -servercfg="server.ini" -servercfgdefault="server.ini" -servercfgfullpath="${servercfgdir}/${servercfg}" clustercfgdir="${persistentstorageroot}/${confdir}/${cluster}" clustercfg="cluster.ini" clustercfgdefault="cluster.ini" clustercfgfullpath="${clustercfgdir}/${clustercfg}" +servercfgdir="${clustercfgdir}/${shard}" +servercfg="server.ini" +servercfgdefault="server.ini" +servercfgfullpath="${servercfgdir}/${servercfg}" ## Backup Directory backupdir="${lgsmdir}/backup" diff --git a/lgsm/functions/check_deps.sh b/lgsm/functions/check_deps.sh index 79f6f76c4..28b2b593c 100644 --- a/lgsm/functions/check_deps.sh +++ b/lgsm/functions/check_deps.sh @@ -352,7 +352,7 @@ fn_deps_build_debian(){ # No More Room in Hell, Counter-Strike: Source, Garry's Mod and Zombie Panic: Source elif [ "${shortname}" == "nmrih" ]||[ "${shortname}" == "css" ]||[ "${shortname}" == "gmod" ]||[ "${shortname}" == "zps" ]; then if [ "${arch}" == "x86_64" ]; then - array_deps_required+=( lib32tinfo5 ) + array_deps_required+=( libtinfo5:i386 ) else array_deps_required+=( libtinfo5 ) fi From 402e4a110fda727a409cae337deb8a2e7f3f37e9 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Fri, 13 Mar 2020 15:40:07 +0000 Subject: [PATCH 303/534] add missing dots --- 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 e7cafa4a1..5673e9ee8 100644 --- a/lgsm/functions/check_steamcmd.sh +++ b/lgsm/functions/check_steamcmd.sh @@ -55,7 +55,7 @@ fn_check_steamcmd(){ fn_install_steamcmd fi elif [ "${function_selfname}" == "command_install.sh" ]; then - fn_print_information "SteamCMD is already installed" + fn_print_information "SteamCMD is already installed..." fn_print_ok_eol_nl fi } From 4f383912bed08f81fac84001d16ed27ca0490ce0 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Fri, 13 Mar 2020 22:49:31 +0000 Subject: [PATCH 304/534] fix(steamcmd): update steamcmd symbolic links --- lgsm/functions/fix_ark.sh | 4 ++-- lgsm/functions/fix_ss3.sh | 4 ++-- lgsm/functions/fix_steamcmd.sh | 8 ++++---- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/lgsm/functions/fix_ark.sh b/lgsm/functions/fix_ark.sh index ccb0a93cb..cd7e92163 100644 --- a/lgsm/functions/fix_ark.sh +++ b/lgsm/functions/fix_ark.sh @@ -6,9 +6,9 @@ # Symlinking the SteamCMD directory into the correct ARK directory so that the mods auto-management will work. if [ ! -d "${serverfiles}/Engine/Binaries/ThirdParty/SteamCMD/Linux" ]; then - ln -s "${steamcmddir}" "${serverfiles}/Engine/Binaries/ThirdParty/SteamCMD/Linux" + ln -s "${HOME}/.steam/steamcmd" "${serverfiles}/Engine/Binaries/ThirdParty/SteamCMD/Linux" fi if [ ! -d "${serverfiles}/Engine/Binaries/ThirdParty/SteamCMD/Linux/steamapps" ]; then - ln -s "$HOME/Steam/steamapps/" "${serverfiles}/Engine/Binaries/ThirdParty/SteamCMD/Linux/steamapps" + ln -s "${HOME}/Steam/SteamApps" "${serverfiles}/Engine/Binaries/ThirdParty/SteamCMD/Linux/steamapps" fi diff --git a/lgsm/functions/fix_ss3.sh b/lgsm/functions/fix_ss3.sh index 3baf5d866..1c81f87ae 100644 --- a/lgsm/functions/fix_ss3.sh +++ b/lgsm/functions/fix_ss3.sh @@ -9,9 +9,9 @@ local commandaction="Fix" local function_selfname=$(basename "$(readlink -f "${BASH_SOURCE[0]}")") # Fixes https://steamcommunity.com/app/41070/discussions/0/353916981477716386/ -if [ "$(diff "${steamcmddir}/linux32/steamclient.so" "${serverfiles}/Bin/steamclient.so" >/dev/null)" ]; then +if [ "$(diff "${HOME}/.steam/steamcmd/linux32/steamclient.so" "${serverfiles}/Bin/steamclient.so" >/dev/null)" ]; then fixname="steamclient.so" fn_fix_msg_start - cp -f "${steamcmddir}/linux32/steamclient.so" "${serverfiles}/Bin/steamclient.so" + cp -f "${HOME}/.steam/steamcmd/linux32/steamclient.so" "${serverfiles}/Bin/steamclient.so" fn_fix_msg_end fi diff --git a/lgsm/functions/fix_steamcmd.sh b/lgsm/functions/fix_steamcmd.sh index 62a3c9fed..86cdbf0c4 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" fn_fix_msg_start mkdir -pv "${HOME}/.steam/sdk32" >> "${lgsmlog}" - cp -v "${steamcmddir}/linux32/steamclient.so" "${HOME}/.steam/sdk32/steamclient.so" >> "${lgsmlog}" + cp -v "${HOME}/.steam/steamcmd/linux32/steamclient.so" "${HOME}/.steam/sdk32/steamclient.so" >> "${lgsmlog}" fn_fix_msg_end fi @@ -22,7 +22,7 @@ if [ "${shortname}" == "bt" ]; then if [ ! -L "${executabledir}/lib64/steamclient.so" ]; then fixname="steamclient.so x86_64" fn_fix_msg_start - cp -s -v "${steamcmddir}/linux64/steamclient.so" "${executabledir}/lib64/steamclient.so" >> "${lgsmlog}" + cp -s -v "${HOME}/.steam/steamcmd/linux64/steamclient.so" "${executabledir}/lib64/steamclient.so" >> "${lgsmlog}" fn_fix_msg_end fi elif [ "${shortname}" == "ss3" ]; then @@ -39,13 +39,13 @@ elif [ "${shortname}" == "hw" ]; then if [ ! -f "${serverfiles}/Hurtworld_Data/Plugins/x86/steamclient.so" ]; then fixname="steamclient.so x86" fn_fix_msg_start - cp "${steamcmddir}/linux32/steamclient.so" "${serverfiles}/Hurtworld_Data/Plugins/x86/steamclient.so" >> "${lgsmlog}" + cp "${HOME}/.steam/steamcmd/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 "${steamcmddir}/linux32/steamclient.so" "${serverfiles}/Hurtworld_Data/Plugins/x86_64/steamclient.so" >> "${lgsmlog}" + cp "${HOME}/.steam/steamcmd/linux32/steamclient.so" "${serverfiles}/Hurtworld_Data/Plugins/x86_64/steamclient.so" >> "${lgsmlog}" fn_fix_msg_end fi elif [ "${shortname}" == "tu" ]; then From eb649c3c1e4b8dca55de049261b0b75de44c9efc Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Fri, 13 Mar 2020 23:06:28 +0000 Subject: [PATCH 305/534] steamapps --- lgsm/functions/fix_ark.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lgsm/functions/fix_ark.sh b/lgsm/functions/fix_ark.sh index cd7e92163..3db1d6ef7 100644 --- a/lgsm/functions/fix_ark.sh +++ b/lgsm/functions/fix_ark.sh @@ -10,5 +10,5 @@ if [ ! -d "${serverfiles}/Engine/Binaries/ThirdParty/SteamCMD/Linux" ]; then fi if [ ! -d "${serverfiles}/Engine/Binaries/ThirdParty/SteamCMD/Linux/steamapps" ]; then - ln -s "${HOME}/Steam/SteamApps" "${serverfiles}/Engine/Binaries/ThirdParty/SteamCMD/Linux/steamapps" + ln -s "${HOME}/Steam/steamapps" "${serverfiles}/Engine/Binaries/ThirdParty/SteamCMD/Linux/steamapps" fi From bb9b1758eb9feb87b50e2677b9d6b9b30cca28f2 Mon Sep 17 00:00:00 2001 From: Michael Ambord Date: Sat, 14 Mar 2020 00:12:55 +0100 Subject: [PATCH 306/534] fix(ark): fix typo in servercfgdefault (#2745) --- lgsm/config-default/config-lgsm/arkserver/_default.cfg | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lgsm/config-default/config-lgsm/arkserver/_default.cfg b/lgsm/config-default/config-lgsm/arkserver/_default.cfg index 0fd7a0c52..2bc9894af 100644 --- a/lgsm/config-default/config-lgsm/arkserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/arkserver/_default.cfg @@ -152,7 +152,7 @@ systemdir="${serverfiles}/ShooterGame" executabledir="${systemdir}/Binaries/Linux" executable="./ShooterGameServer" servercfgdir="${systemdir}/Saved/Config/LinuxServer" -servercfg="GameUserSettngs.ini" +servercfg="GameUserSettings.ini" servercfgdefault="GameUserSettings.ini" servercfgfullpath="${servercfgdir}/${servercfg}" From 6e698afb050ff6c409d8b4ecb62c092ad2494024 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Fri, 13 Mar 2020 23:34:58 +0000 Subject: [PATCH 307/534] bypass apt install steamcmd if debian non-free repo is missing --- lgsm/functions/check_deps.sh | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/lgsm/functions/check_deps.sh b/lgsm/functions/check_deps.sh index 28b2b593c..e3bc03634 100644 --- a/lgsm/functions/check_deps.sh +++ b/lgsm/functions/check_deps.sh @@ -327,7 +327,7 @@ fn_deps_build_debian(){ array_deps_missing=() # LinuxGSM requirements. - array_deps_required=( curl wget ca-certificates file bsdmainutils util-linux python3 tar bzip2 gzip unzip binutils bc jq tmux steamcmd ) + array_deps_required=( curl wget ca-certificates file bsdmainutils util-linux python3 tar bzip2 gzip unzip binutils bc jq tmux ) # All servers except ts3, mumble, GTA and minecraft servers require libstdc++6 and lib32gcc1. if [ "${shortname}" != "ts3" ]&&[ "${shortname}" != "mumble" ]&&[ "${shortname}" != "mc" ]&&[ "${engine}" != "renderware" ]; then @@ -337,6 +337,15 @@ fn_deps_build_debian(){ array_deps_required+=( lib32stdc++6 ) fi fi + # If requires steamcmd. + if [ "${appid}" ]; then + # Will not use apt if non-free repo is missing + if [ "${distroid}" == "debian" ]&& ! grep -qE "^deb .*non-free" /etc/apt/sources.list; then + : + else + array_deps_required+=( steamcmd ) + fi + fi # Game Specific requirements. From 0a89292bb4d949d154eab295e227c847d30a8aa5 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Fri, 13 Mar 2020 23:54:53 +0000 Subject: [PATCH 308/534] travis test --- lgsm/functions/check_steamcmd.sh | 3 +++ 1 file changed, 3 insertions(+) diff --git a/lgsm/functions/check_steamcmd.sh b/lgsm/functions/check_steamcmd.sh index 5673e9ee8..5c8621f73 100644 --- a/lgsm/functions/check_steamcmd.sh +++ b/lgsm/functions/check_steamcmd.sh @@ -47,6 +47,9 @@ fn_check_steamcmd(){ # Checks if SteamCMD exists when starting or updating a server. # Only install if steamcmd package is missing or steamcmd dir is missing. if [ ! -f "${steamcmddir}/steamcmd.sh" ]&&[ -z "$(command -v steamcmd 2>/dev/null)" ]; then + echo "#############" + which steamcmd + echo "#############" if [ "${function_selfname}" == "command_install.sh" ]; then fn_install_steamcmd else From 9ab09d9e9df53065d67ac74b35fb17291b6e9030 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Sat, 14 Mar 2020 00:11:54 +0000 Subject: [PATCH 309/534] add alterative location for steamclient.so --- lgsm/functions/fix_steamcmd.sh | 32 ++++++++++++++++++++++++++++---- 1 file changed, 28 insertions(+), 4 deletions(-) diff --git a/lgsm/functions/fix_steamcmd.sh b/lgsm/functions/fix_steamcmd.sh index 86cdbf0c4..3f4907d15 100644 --- a/lgsm/functions/fix_steamcmd.sh +++ b/lgsm/functions/fix_steamcmd.sh @@ -13,7 +13,13 @@ if [ ! -f "${HOME}/.steam/sdk32/steamclient.so" ]; then fixname="steamclient.so" fn_fix_msg_start mkdir -pv "${HOME}/.steam/sdk32" >> "${lgsmlog}" - cp -v "${HOME}/.steam/steamcmd/linux32/steamclient.so" "${HOME}/.steam/sdk32/steamclient.so" >> "${lgsmlog}" + if [ -f "${HOME}/.steam/steamcmd/linux32/steamclient.so" ]; then + cp -v "${HOME}/.steam/steamcmd/linux32/steamclient.so" "${HOME}/.steam/sdk32/steamclient.so" >> "${lgsmlog}" + elif [ -f "${steamcmddir}/linux32/steamclient.so" ]; then + cp -v "${steamcmddir}/linux32/steamclient.so" "${HOME}/.steam/sdk32/steamclient.so" >> "${lgsmlog}" + else + $?=2 + fi fn_fix_msg_end fi @@ -22,7 +28,13 @@ if [ "${shortname}" == "bt" ]; then if [ ! -L "${executabledir}/lib64/steamclient.so" ]; then fixname="steamclient.so x86_64" fn_fix_msg_start - cp -s -v "${HOME}/.steam/steamcmd/linux64/steamclient.so" "${executabledir}/lib64/steamclient.so" >> "${lgsmlog}" + if [ -f "${HOME}/.steam/steamcmd/linux64/steamclient.so" ]; then + cp -v "${HOME}/.steam/steamcmd/linux64/steamclient.so" "${executabledir}/lib64/steamclient.so" >> "${lgsmlog}" + elif [ -f "${steamcmddir}/linux64/steamclient.so" ]; then + cp -v "${steamcmddir}/linux64/steamclient.so" "${executabledir}/lib64/steamclient.so" >> "${lgsmlog}" + else + $?=2 + fi fn_fix_msg_end fi elif [ "${shortname}" == "ss3" ]; then @@ -39,13 +51,25 @@ elif [ "${shortname}" == "hw" ]; then if [ ! -f "${serverfiles}/Hurtworld_Data/Plugins/x86/steamclient.so" ]; then fixname="steamclient.so x86" fn_fix_msg_start - cp "${HOME}/.steam/steamcmd/linux32/steamclient.so" "${serverfiles}/Hurtworld_Data/Plugins/x86/steamclient.so" >> "${lgsmlog}" + if [ -f "${HOME}/.steam/steamcmd/linux32/steamclient.so" ]; then + cp -v "${HOME}/.steam/steamcmd/linux32/steamclient.so" "${serverfiles}/Hurtworld_Data/Plugins/x86/steamclient.so" >> "${lgsmlog}" + elif [ -f "${steamcmddir}/linux32/steamclient.so" ]; then + cp -v "${steamcmddir}/linux32/steamclient.so" "${serverfiles}/Hurtworld_Data/Plugins/x86/steamclient.so" >> "${lgsmlog}" + else + : + fi 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 "${HOME}/.steam/steamcmd/linux32/steamclient.so" "${serverfiles}/Hurtworld_Data/Plugins/x86_64/steamclient.so" >> "${lgsmlog}" + if [ -f "${HOME}/.steam/steamcmd/linux64/steamclient.so" ]; then + cp -v "${HOME}/.steam/steamcmd/linux64/steamclient.so" "${serverfiles}/Hurtworld_Data/Plugins/x86_64/steamclient.so" >> "${lgsmlog}" + elif [ -f "${steamcmddir}/linux64/steamclient.so" ]; then + cp -v "${steamcmddir}/linux64/steamclient.so" "${serverfiles}/Hurtworld_Data/Plugins/x86_64/steamclient.so" >> "${lgsmlog}" + else + : + fi fn_fix_msg_end fi elif [ "${shortname}" == "tu" ]; then From dbf94a6334eaecf53f2a7f7404a94d8ac8b394de Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Sat, 14 Mar 2020 00:32:35 +0000 Subject: [PATCH 310/534] remove unwanted code --- lgsm/functions/check_steamcmd.sh | 3 --- 1 file changed, 3 deletions(-) diff --git a/lgsm/functions/check_steamcmd.sh b/lgsm/functions/check_steamcmd.sh index 5c8621f73..5673e9ee8 100644 --- a/lgsm/functions/check_steamcmd.sh +++ b/lgsm/functions/check_steamcmd.sh @@ -47,9 +47,6 @@ fn_check_steamcmd(){ # Checks if SteamCMD exists when starting or updating a server. # Only install if steamcmd package is missing or steamcmd dir is missing. if [ ! -f "${steamcmddir}/steamcmd.sh" ]&&[ -z "$(command -v steamcmd 2>/dev/null)" ]; then - echo "#############" - which steamcmd - echo "#############" if [ "${function_selfname}" == "command_install.sh" ]; then fn_install_steamcmd else From 77041a52f22a40d178557fef2aad43d54e274699 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Sat, 14 Mar 2020 00:36:13 +0000 Subject: [PATCH 311/534] release v20.1.1 --- linuxgsm.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/linuxgsm.sh b/linuxgsm.sh index 0d9f6252c..421482d9f 100755 --- a/linuxgsm.sh +++ b/linuxgsm.sh @@ -20,7 +20,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="v20.1.0" +version="v20.1.1" shortname="core" gameservername="core" rootdir=$(dirname "$(readlink -f "${BASH_SOURCE[0]}")") From 17efcab6cae52dc903a00f677477ebf6a0175b63 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Sat, 14 Mar 2020 00:56:11 +0000 Subject: [PATCH 312/534] fix: correct error with fn_print_error_eol_nl --- lgsm/functions/command_monitor.sh | 2 +- lgsm/functions/core_messages.sh | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/lgsm/functions/command_monitor.sh b/lgsm/functions/command_monitor.sh index 1ec7b194d..ae7d25388 100644 --- a/lgsm/functions/command_monitor.sh +++ b/lgsm/functions/command_monitor.sh @@ -21,7 +21,7 @@ fn_monitor_check_lockfile(){ fn_print_error_eol_nl fn_script_log_error "Checking lockfile: No lockfile found: ERROR" fn_sleep_time - echo -e " * Start ${selfname} to run monitor." + echo -en "* Start ${selfname} to run monitor." core_exit.sh fi diff --git a/lgsm/functions/core_messages.sh b/lgsm/functions/core_messages.sh index 3ec0fd0ee..dc83f3c57 100644 --- a/lgsm/functions/core_messages.sh +++ b/lgsm/functions/core_messages.sh @@ -353,7 +353,7 @@ fn_print_error_eol(){ } fn_print_error_eol_nl(){ - echo -en "${red}ERROR${default}" + echo -e "${red}ERROR${default}" } # WARN From a15a6a250cd2b7b7eadbe7b01ffa241ab71929b5 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Sun, 15 Mar 2020 22:08:56 +0000 Subject: [PATCH 313/534] fix(steamcmd): failing to start if missing dependencies required to run SteamCMD (#2755) * fix(steamcmd): wont fail to start if steamcmd dependency missing * added netcat to allow termbin.com to work --- lgsm/functions/check_deps.sh | 34 ++++++++++++++++++++++------------ 1 file changed, 22 insertions(+), 12 deletions(-) diff --git a/lgsm/functions/check_deps.sh b/lgsm/functions/check_deps.sh index e3bc03634..f4499a587 100644 --- a/lgsm/functions/check_deps.sh +++ b/lgsm/functions/check_deps.sh @@ -272,9 +272,14 @@ fn_found_missing_deps(){ fi if [ "${steamcmdfail}" ]; then echo -e "" - fn_print_failure_nl "Missing dependencies required to run SteamCMD." - fn_script_log_fatal "Missing dependencies required to run SteamCMD." - core_exit.sh + if [ "${function_selfname}" == "command_install.sh" ]; then + fn_print_failure_nl "Missing dependencies required to run SteamCMD." + fn_script_log_fatal "Missing dependencies required to run SteamCMD." + core_exit.sh + else + fn_print_error_nl "Missing dependencies required to run SteamCMD." + fn_script_log_error "Missing dependencies required to run SteamCMD." + fi fi else fn_print_complete_nl "Install dependencies completed." @@ -293,9 +298,14 @@ fn_found_missing_deps(){ fi if [ "${steamcmdfail}" ]; then echo -e "" - fn_print_failure_nl "Missing dependencies required to run SteamCMD." - fn_script_log_fatal "Missing dependencies required to run SteamCMD." - core_exit.sh + if [ "${function_selfname}" == "command_install.sh" ]; then + fn_print_failure_nl "Missing dependencies required to run SteamCMD." + fn_script_log_fatal "Missing dependencies required to run SteamCMD." + core_exit.sh + else + fn_print_error_nl "Missing dependencies required to run SteamCMD." + fn_script_log_error "Missing dependencies required to run SteamCMD." + fi fi echo -e "" fi @@ -327,7 +337,7 @@ fn_deps_build_debian(){ array_deps_missing=() # LinuxGSM requirements. - array_deps_required=( curl wget ca-certificates file bsdmainutils util-linux python3 tar bzip2 gzip unzip binutils bc jq tmux ) + array_deps_required=( curl wget ca-certificates file bsdmainutils util-linux python3 tar bzip2 gzip unzip binutils bc jq tmux netcat ) # All servers except ts3, mumble, GTA and minecraft servers require libstdc++6 and lib32gcc1. if [ "${shortname}" != "ts3" ]&&[ "${shortname}" != "mumble" ]&&[ "${shortname}" != "mc" ]&&[ "${engine}" != "renderware" ]; then @@ -445,15 +455,15 @@ fn_deps_build_redhat(){ # LinuxGSM requirements. # CentOS if [ "${distroversion}" == "7" ]; then - array_deps_required=( epel-release curl wget util-linux python3 file tar gzip bzip2 unzip binutils bc jq tmux ) + array_deps_required=( epel-release curl wget util-linux python3 file tar gzip bzip2 unzip binutils bc jq tmux nmap-ncat ) elif [ "${distroversion}" == "8" ]; then - array_deps_required=( epel-release curl wget util-linux python36 file tar gzip bzip2 unzip binutils bc jq tmux ) + array_deps_required=( epel-release curl wget util-linux python36 file tar gzip bzip2 unzip binutils bc jq tmux nmap-ncat ) elif [ "${distroid}" == "fedora" ]; then - array_deps_required=( curl wget util-linux python3 file tar gzip bzip2 unzip binutils bc jq tmux ) + array_deps_required=( curl wget util-linux python3 file tar gzip bzip2 unzip binutils bc jq tmux nmap-ncat ) elif [[ "${distroname}" == *"Amazon Linux AMI"* ]]; then - array_deps_required=( curl wget util-linux python3 file tar gzip bzip2 unzip binutils bc jq tmux ) + array_deps_required=( curl wget util-linux python3 file tar gzip bzip2 unzip binutils bc jq tmux nmap-ncat ) else - array_deps_required=( curl wget util-linux python3 file tar gzip bzip2 unzip binutils bc jq tmux ) + array_deps_required=( curl wget util-linux python3 file tar gzip bzip2 unzip binutils bc jq tmux nmap-ncat ) fi # All servers except ts3, mumble, multi theft auto and minecraft servers require glibc.i686 and libstdc++.i686. From 72a439645f13b3121aa38ab3ea0b9502d3b43e70 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Sun, 15 Mar 2020 22:09:33 +0000 Subject: [PATCH 314/534] fix(ark): fix broken steamcmd link preventing mods from working (#2756) * fix(steamcmd): wont fail to start if steamcmd dependency missing removes the symlink if broken. fixes issue with older versions of LinuxGSM linking to /home/arkserver/steamcmd rather than ${HOME}/.steam. --- lgsm/functions/fix_ark.sh | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) diff --git a/lgsm/functions/fix_ark.sh b/lgsm/functions/fix_ark.sh index 3db1d6ef7..1a2bbc5b0 100644 --- a/lgsm/functions/fix_ark.sh +++ b/lgsm/functions/fix_ark.sh @@ -4,11 +4,21 @@ # Website: https://linuxgsm.com # Description: Resolves various issues with ARK: Survival Evolved. -# Symlinking the SteamCMD directory into the correct ARK directory so that the mods auto-management will work. -if [ ! -d "${serverfiles}/Engine/Binaries/ThirdParty/SteamCMD/Linux" ]; then - ln -s "${HOME}/.steam/steamcmd" "${serverfiles}/Engine/Binaries/ThirdParty/SteamCMD/Linux" +# removes the symlink if broken. fixes issue with older versions of LinuxGSM linking to /home/arkserver/steamcmd +# rather than ${HOME}/.steam. This fix could be deprecated eventually. +if [ ! -e "${serverfiles}/Engine/Binaries/ThirdParty/SteamCMD/Linux" ]||[ ! -e "${serverfiles}/Engine/Binaries/ThirdParty/SteamCMD/Linux/steamapps" ]; then + fixname="broken steamcmd symlink" + fn_fix_msg_start + rm -f "${serverfiles:?}/Engine/Binaries/ThirdParty/SteamCMD/Linux" + rm -f "${serverfiles:?}/Engine/Binaries/ThirdParty/SteamCMD/Linux/steamapps" + fn_fix_msg_end fi -if [ ! -d "${serverfiles}/Engine/Binaries/ThirdParty/SteamCMD/Linux/steamapps" ]; then +# Symlinking the SteamCMD directory into the correct ARK directory so that the mods auto-management will work. +if [ ! -d "${serverfiles}/Engine/Binaries/ThirdParty/SteamCMD/Linux" ]||[ ! -d "${serverfiles}/Engine/Binaries/ThirdParty/SteamCMD/Linux/steamapps" ]; then + fixname="steamcmd symlink" + fn_fix_msg_start + ln -s "${HOME}/.steam/steamcmd" "${serverfiles}/Engine/Binaries/ThirdParty/SteamCMD/Linux" ln -s "${HOME}/Steam/steamapps" "${serverfiles}/Engine/Binaries/ThirdParty/SteamCMD/Linux/steamapps" + fn_fix_msg_end fi From e4306dd79b1e2815d28adbda66b8dc7b1b6cff51 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Sun, 15 Mar 2020 22:26:58 +0000 Subject: [PATCH 315/534] release v20.1.2 --- linuxgsm.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/linuxgsm.sh b/linuxgsm.sh index 421482d9f..dcef2be1f 100755 --- a/linuxgsm.sh +++ b/linuxgsm.sh @@ -20,7 +20,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="v20.1.1" +version="v20.1.2" shortname="core" gameservername="core" rootdir=$(dirname "$(readlink -f "${BASH_SOURCE[0]}")") From 80c443928087b872c31253818708947a36bb9223 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Thu, 19 Mar 2020 15:50:11 +0000 Subject: [PATCH 316/534] fix(arkserver): resolve further issues highlighted with ark mod fix (#2766) * fix(arkserver): resolve further issues highlighted with ark mod fix --- lgsm/functions/command_monitor.sh | 2 +- lgsm/functions/core_messages.sh | 2 +- lgsm/functions/fix_ark.sh | 20 ++++++++++++++++---- 3 files changed, 18 insertions(+), 6 deletions(-) diff --git a/lgsm/functions/command_monitor.sh b/lgsm/functions/command_monitor.sh index 1ec7b194d..ae7d25388 100644 --- a/lgsm/functions/command_monitor.sh +++ b/lgsm/functions/command_monitor.sh @@ -21,7 +21,7 @@ fn_monitor_check_lockfile(){ fn_print_error_eol_nl fn_script_log_error "Checking lockfile: No lockfile found: ERROR" fn_sleep_time - echo -e " * Start ${selfname} to run monitor." + echo -en "* Start ${selfname} to run monitor." core_exit.sh fi diff --git a/lgsm/functions/core_messages.sh b/lgsm/functions/core_messages.sh index 3ec0fd0ee..dc83f3c57 100644 --- a/lgsm/functions/core_messages.sh +++ b/lgsm/functions/core_messages.sh @@ -353,7 +353,7 @@ fn_print_error_eol(){ } fn_print_error_eol_nl(){ - echo -en "${red}ERROR${default}" + echo -e "${red}ERROR${default}" } # WARN diff --git a/lgsm/functions/fix_ark.sh b/lgsm/functions/fix_ark.sh index 1a2bbc5b0..d495dfeb7 100644 --- a/lgsm/functions/fix_ark.sh +++ b/lgsm/functions/fix_ark.sh @@ -6,19 +6,31 @@ # removes the symlink if broken. fixes issue with older versions of LinuxGSM linking to /home/arkserver/steamcmd # rather than ${HOME}/.steam. This fix could be deprecated eventually. -if [ ! -e "${serverfiles}/Engine/Binaries/ThirdParty/SteamCMD/Linux" ]||[ ! -e "${serverfiles}/Engine/Binaries/ThirdParty/SteamCMD/Linux/steamapps" ]; then +if [ ! -e "${serverfiles}/Engine/Binaries/ThirdParty/SteamCMD/Linux" ]; then fixname="broken steamcmd symlink" fn_fix_msg_start rm -f "${serverfiles:?}/Engine/Binaries/ThirdParty/SteamCMD/Linux" - rm -f "${serverfiles:?}/Engine/Binaries/ThirdParty/SteamCMD/Linux/steamapps" + fn_fix_msg_end +fi + +if [ ! -e "${HOME}/.steam/steamcmd/steamapps" ]; then + fixname="broken steamcmd symlink" + fn_fix_msg_start + rm -f "${HOME}/.steam/steamcmd/steamapps" fn_fix_msg_end fi # Symlinking the SteamCMD directory into the correct ARK directory so that the mods auto-management will work. -if [ ! -d "${serverfiles}/Engine/Binaries/ThirdParty/SteamCMD/Linux" ]||[ ! -d "${serverfiles}/Engine/Binaries/ThirdParty/SteamCMD/Linux/steamapps" ]; then +if [ ! -d "${serverfiles}/Engine/Binaries/ThirdParty/SteamCMD/Linux" ]; then fixname="steamcmd symlink" fn_fix_msg_start ln -s "${HOME}/.steam/steamcmd" "${serverfiles}/Engine/Binaries/ThirdParty/SteamCMD/Linux" - ln -s "${HOME}/Steam/steamapps" "${serverfiles}/Engine/Binaries/ThirdParty/SteamCMD/Linux/steamapps" + fn_fix_msg_end +fi + +if [ ! -d "${HOME}/.steam/steamcmd/steamapps" ]; then + fixname="steamcmd symlink" + fn_fix_msg_start + ln -s "${HOME}/Steam/steamapps" "${HOME}/.steam/steamcmd/steamapps" fn_fix_msg_end fi From c847ecb4b6048b4654b83b26cc822504897610ec Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Thu, 19 Mar 2020 15:51:22 +0000 Subject: [PATCH 317/534] fix(messages): fix some messages not using newline correctly (#2765) --- lgsm/functions/alert.sh | 22 +++++++++++----------- lgsm/functions/check_deps.sh | 8 ++++---- lgsm/functions/command_backup.sh | 4 ++-- lgsm/functions/command_monitor.sh | 2 +- lgsm/functions/core_messages.sh | 20 ++++++++++---------- 5 files changed, 28 insertions(+), 28 deletions(-) diff --git a/lgsm/functions/alert.sh b/lgsm/functions/alert.sh index d09f9eb93..e47631d4c 100644 --- a/lgsm/functions/alert.sh +++ b/lgsm/functions/alert.sh @@ -104,10 +104,10 @@ elif [ "${postalert}" != "on" ]&&[ "${function_selfname}" == "command_test_alert fn_print_warn_nl "More Info not enabled" fn_script_log_warn "More Info alerts not enabled" elif [ -z "${posttarget}" ]&&[ "${function_selfname}" == "command_test_alert.sh" ]; then - fn_print_error_nl "posttarget not set" + fn_print_error "posttarget not set" fn_script_error "posttarget not set" elif [ -z "${postdays}" ]&&[ "${function_selfname}" == "command_test_alert.sh" ]; then - fn_print_error_nl "postdays not set" + fn_print_error "postdays not set" fn_script_error "postdays not set" fi @@ -117,7 +117,7 @@ elif [ "${discordalert}" != "on" ]&&[ "${function_selfname}" == "command_test_al fn_print_warn_nl "Discord alerts not enabled" fn_script_log_warn "Discord alerts not enabled" elif [ -z "${discordtoken}" ]&&[ "${function_selfname}" == "command_test_alert.sh" ]; then - fn_print_error_nl "Discord token not set" + fn_print_error "Discord token not set" echo -e " * https://docs.linuxgsm.com/alerts/discord" fn_script_error "Discord token not set" fi @@ -128,7 +128,7 @@ elif [ "${emailalert}" != "on" ]&&[ "${function_selfname}" == "command_test_aler fn_print_warn_nl "Email alerts not enabled" fn_script_log_warn "Email alerts not enabled" elif [ -z "${email}" ]&&[ "${function_selfname}" == "command_test_alert.sh" ]; then - fn_print_error_nl "Email not set" + fn_print_error "Email not set" fn_script_log_error "Email not set" fi @@ -138,7 +138,7 @@ elif [ "${iftttalert}" != "on" ]&&[ "${function_selfname}" == "command_test_aler fn_print_warn_nl "IFTTT alerts not enabled" fn_script_log_warn "IFTTT alerts not enabled" elif [ -z "${ifttttoken}" ]&&[ "${function_selfname}" == "command_test_alert.sh" ]; then - fn_print_error_nl "IFTTT token not set" + fn_print_error "IFTTT token not set" echo -e " * https://docs.linuxgsm.com/alerts/ifttt" fn_script_error "IFTTT token not set" fi @@ -149,7 +149,7 @@ elif [ "${mailgunalert}" != "on" ]&&[ "${function_selfname}" == "command_test_al fn_print_warn_nl "Mailgun alerts not enabled" fn_script_log_warn "Mailgun alerts not enabled" elif [ -z "${mailguntoken}" ]&&[ "${function_selfname}" == "command_test_alert.sh" ]; then - fn_print_error_nl "Mailgun token not set" + fn_print_error "Mailgun token not set" echo -e " * https://docs.linuxgsm.com/alerts/mailgun" fn_script_error "Mailgun token not set" fi @@ -160,7 +160,7 @@ elif [ "${pushbulletalert}" != "on" ]&&[ "${function_selfname}" == "command_test fn_print_warn_nl "Pushbullet alerts not enabled" fn_script_log_warn "Pushbullet alerts not enabled" elif [ -z "${pushbullettoken}" ]&&[ "${function_selfname}" == "command_test_alert.sh" ]; then - fn_print_error_nl "Pushbullet token not set" + fn_print_error "Pushbullet token not set" echo -e " * https://docs.linuxgsm.com/alerts/pushbullet" fn_script_error "Pushbullet token not set" fi @@ -171,7 +171,7 @@ elif [ "${pushoveralert}" != "on" ]&&[ "${function_selfname}" == "command_test_a fn_print_warn_nl "Pushover alerts not enabled" fn_script_log_warn "Pushover alerts not enabled" elif [ -z "${pushovertoken}" ]&&[ "${function_selfname}" == "command_test_alert.sh" ]; then - fn_print_error_nl "Pushover token not set" + fn_print_error "Pushover token not set" echo -e " * https://docs.linuxgsm.com/alerts/pushover" fn_script_error "Pushover token not set" fi @@ -182,11 +182,11 @@ elif [ "${telegramalert}" != "on" ]&&[ "${function_selfname}" == "command_test_a fn_print_warn_nl "Telegram Messages not enabled" fn_script_log_warn "Telegram Messages not enabled" elif [ -z "${telegramtoken}" ]&&[ "${function_selfname}" == "command_test_alert.sh" ]; then - fn_print_error_nl "Telegram token not set." + fn_print_error "Telegram token not set." echo -e " * https://docs.linuxgsm.com/alerts/telegram" fn_script_error "Telegram token not set." elif [ -z "${telegramchatid}" ]&&[ "${function_selfname}" == "command_test_alert.sh" ]; then - fn_print_error_nl "Telegram chat id not set." + fn_print_error "Telegram chat id not set." echo -e " * https://docs.linuxgsm.com/alerts/telegram" fn_script_error "Telegram chat id not set." fi @@ -197,7 +197,7 @@ elif [ "${slackalert}" != "on" ]&&[ "${function_selfname}" == "command_test_aler fn_print_warn_nl "Slack alerts not enabled" fn_script_log_warn "Slack alerts not enabled" elif [ -z "${slacktoken}" ]&&[ "${function_selfname}" == "command_test_alert.sh" ]; then - fn_print_error_nl "Slack token not set" + fn_print_error "Slack token not set" echo -e " * https://docs.linuxgsm.com/alerts/slack" fn_script_error "Slack token not set" fi diff --git a/lgsm/functions/check_deps.sh b/lgsm/functions/check_deps.sh index f4499a587..2a8c82ed9 100644 --- a/lgsm/functions/check_deps.sh +++ b/lgsm/functions/check_deps.sh @@ -273,11 +273,11 @@ fn_found_missing_deps(){ if [ "${steamcmdfail}" ]; then echo -e "" if [ "${function_selfname}" == "command_install.sh" ]; then - fn_print_failure_nl "Missing dependencies required to run SteamCMD." + fn_print_failure "Missing dependencies required to run SteamCMD." fn_script_log_fatal "Missing dependencies required to run SteamCMD." core_exit.sh else - fn_print_error_nl "Missing dependencies required to run SteamCMD." + fn_print_error "Missing dependencies required to run SteamCMD." fn_script_log_error "Missing dependencies required to run SteamCMD." fi fi @@ -299,11 +299,11 @@ fn_found_missing_deps(){ if [ "${steamcmdfail}" ]; then echo -e "" if [ "${function_selfname}" == "command_install.sh" ]; then - fn_print_failure_nl "Missing dependencies required to run SteamCMD." + fn_print_failure "Missing dependencies required to run SteamCMD." fn_script_log_fatal "Missing dependencies required to run SteamCMD." core_exit.sh else - fn_print_error_nl "Missing dependencies required to run SteamCMD." + fn_print_error "Missing dependencies required to run SteamCMD." fn_script_log_error "Missing dependencies required to run SteamCMD." fi fi diff --git a/lgsm/functions/command_backup.sh b/lgsm/functions/command_backup.sh index d7871a38e..248604282 100644 --- a/lgsm/functions/command_backup.sh +++ b/lgsm/functions/command_backup.sh @@ -43,9 +43,9 @@ fn_backup_init(){ info_distro.sh fn_print_dots "Backup starting" fn_script_log_info "Backup starting" - fn_print_ok_nl "Backup starting" + fn_print_ok "Backup starting" if [ ! -d "${backupdir}" ]||[ "${backupcount}" == "0" ]; then - fn_print_info_nl "There are no previous backups" + fn_print_info "There are no previous backups" else if [ "${lastbackupdaysago}" == "0" ]; then daysago="less than 1 day ago" diff --git a/lgsm/functions/command_monitor.sh b/lgsm/functions/command_monitor.sh index ae7d25388..a70d185ed 100644 --- a/lgsm/functions/command_monitor.sh +++ b/lgsm/functions/command_monitor.sh @@ -21,7 +21,7 @@ fn_monitor_check_lockfile(){ fn_print_error_eol_nl fn_script_log_error "Checking lockfile: No lockfile found: ERROR" fn_sleep_time - echo -en "* Start ${selfname} to run monitor." + echo -e "* Start ${selfname} to run monitor." core_exit.sh fi diff --git a/lgsm/functions/core_messages.sh b/lgsm/functions/core_messages.sh index dc83f3c57..71c6eff8b 100644 --- a/lgsm/functions/core_messages.sh +++ b/lgsm/functions/core_messages.sh @@ -149,9 +149,9 @@ fn_print_ok(){ fn_print_ok_nl(){ if [ "${commandaction}" ]; then - echo -en "${creeol}[${green} OK ${default}] ${commandaction} ${selfname}: $*" + echo -e "${creeol}[${green} OK ${default}] ${commandaction} ${selfname}: $*" else - echo -en "${creeol}[${green} OK ${default}] $*" + echo -e "${creeol}[${green} OK ${default}] $*" fi fn_sleep_time echo -en "\n" @@ -169,9 +169,9 @@ fn_print_fail(){ fn_print_fail_nl(){ if [ "${commandaction}" ]; then - echo -en "${creeol}[${red} FAIL ${default}] ${commandaction} ${selfname}: $*" + echo -e "${creeol}[${red} FAIL ${default}] ${commandaction} ${selfname}: $*" else - echo -en "${creeol}[${red} FAIL ${default}] $*" + echo -e "${creeol}[${red} FAIL ${default}] $*" fi fn_sleep_time echo -en "\n" @@ -189,9 +189,9 @@ fn_print_error(){ fn_print_error_nl(){ if [ "${commandaction}" ]; then - echo -en "${creeol}[${red}ERROR ${default}] ${commandaction} ${selfname}: $*" + echo -e "${creeol}[${red}ERROR ${default}] ${commandaction} ${selfname}: $*" else - echo -en "${creeol}[${red}ERROR ${default}] $*" + echo -e "${creeol}[${red}ERROR ${default}] $*" fi fn_sleep_time echo -en "\n" @@ -209,9 +209,9 @@ fn_print_warn(){ fn_print_warn_nl(){ if [ "${commandaction}" ]; then - echo -en "${creeol}[${lightyellow} WARN ${default}] ${commandaction} ${selfname}: $*" + echo -e "${creeol}[${lightyellow} WARN ${default}] ${commandaction} ${selfname}: $*" else - echo -en "${creeol}[${lightyellow} WARN ${default}] $*" + echo -e "${creeol}[${lightyellow} WARN ${default}] $*" fi fn_sleep_time echo -en "\n" @@ -229,9 +229,9 @@ fn_print_info(){ fn_print_info_nl(){ if [ "${commandaction}" ]; then - echo -en "${creeol}[${cyan} INFO ${default}] ${commandaction} ${selfname}: $*" + echo -e "${creeol}[${cyan} INFO ${default}] ${commandaction} ${selfname}: $*" else - echo -en "${creeol}[${cyan} INFO ${default}] $*" + echo -e "${creeol}[${cyan} INFO ${default}] $*" fi fn_sleep_time echo -en "\n" From e9d8c9e284689a43c0e32734611da9c53dbd9cc3 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Fri, 20 Mar 2020 07:05:37 +0000 Subject: [PATCH 318/534] release v20.1.3 --- linuxgsm.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/linuxgsm.sh b/linuxgsm.sh index dcef2be1f..35c1fe34c 100755 --- a/linuxgsm.sh +++ b/linuxgsm.sh @@ -20,7 +20,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="v20.1.2" +version="v20.1.3" shortname="core" gameservername="core" rootdir=$(dirname "$(readlink -f "${BASH_SOURCE[0]}")") From bb86a8571999efa2a1a79d5f8bc46e1855b3a1ec Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Sat, 21 Mar 2020 22:23:17 +0000 Subject: [PATCH 319/534] fix(arkserver): refactor and simplify how ark mods work (#2773) --- lgsm/functions/check_steamcmd.sh | 31 ++++++++++++++++++++++++++--- lgsm/functions/fix_ark.sh | 34 ++++++++++++++++++-------------- 2 files changed, 47 insertions(+), 18 deletions(-) diff --git a/lgsm/functions/check_steamcmd.sh b/lgsm/functions/check_steamcmd.sh index 5673e9ee8..e30a9119c 100644 --- a/lgsm/functions/check_steamcmd.sh +++ b/lgsm/functions/check_steamcmd.sh @@ -7,6 +7,9 @@ local modulename="CHECK" fn_install_steamcmd(){ + if [ ${shortname} == "ark" ]&&[ "${installsteamcmd}" == "1" ]; then + steamcmddir="${serverfiles}/Engine/Binaries/ThirdParty/SteamCMD/Linux" + fi if [ ! -d "${steamcmddir}" ]; then mkdir -pv "${steamcmddir}" fi @@ -50,8 +53,8 @@ fn_check_steamcmd(){ if [ "${function_selfname}" == "command_install.sh" ]; then fn_install_steamcmd else - fn_print_error_nl "SteamCMD is missing" - fn_script_log_error "SteamCMD is missing" + fn_print_warn_nl "SteamCMD is missing" + fn_script_log_warn "SteamCMD is missing" fn_install_steamcmd fi elif [ "${function_selfname}" == "command_install.sh" ]; then @@ -60,6 +63,25 @@ fn_check_steamcmd(){ fi } +fn_check_steamcmd_ark(){ + # Checks if SteamCMD exists in + # Engine/Binaries/ThirdParty/SteamCMD/Linux + # to allow ark mods to work + if [ ! -f "${serverfiles}/Engine/Binaries/ThirdParty/SteamCMD/Linux/steamcmd.sh" ]; then + installsteamcmd=1 + if [ "${function_selfname}" == "command_install.sh" ]; then + fn_install_steamcmd + else + fn_print_warn_nl "ARK mods SteamCMD is missing" + fn_script_log_warn "ARK mods SteamCMD is missing" + fn_install_steamcmd + fi + elif [ "${function_selfname}" == "command_install.sh" ]; then + fn_print_information "ARK mods SteamCMD is already installed..." + fn_print_ok_eol_nl + fi +} + fn_check_steamcmd_clear(){ # Will remove steamcmd dir if steamcmd package is installed. if [ "$(command -v steamcmd 2>/dev/null)" ]&&[ -d "${steamcmddir}" ]; then @@ -81,7 +103,10 @@ fn_check_steamcmd_exec(){ fi } -fn_check_steamcmd fn_check_steamcmd_clear +fn_check_steamcmd +if [ ${shortname} == "ark" ]; then + fn_check_steamcmd_ark +fi fn_check_steamcmd_user fn_check_steamcmd_exec diff --git a/lgsm/functions/fix_ark.sh b/lgsm/functions/fix_ark.sh index d495dfeb7..8563a26ff 100644 --- a/lgsm/functions/fix_ark.sh +++ b/lgsm/functions/fix_ark.sh @@ -4,33 +4,37 @@ # Website: https://linuxgsm.com # Description: Resolves various issues with ARK: Survival Evolved. -# removes the symlink if broken. fixes issue with older versions of LinuxGSM linking to /home/arkserver/steamcmd -# rather than ${HOME}/.steam. This fix could be deprecated eventually. -if [ ! -e "${serverfiles}/Engine/Binaries/ThirdParty/SteamCMD/Linux" ]; then - fixname="broken steamcmd symlink" +# removes the symlink if exists. +# fixes issue with older versions of LinuxGSM linking to /home/arkserver/steamcmd +if [ -L "${serverfiles}/Engine/Binaries/ThirdParty/SteamCMD/Linux" ]; then + fixname="broken SteamCMD symlink" fn_fix_msg_start - rm -f "${serverfiles:?}/Engine/Binaries/ThirdParty/SteamCMD/Linux" + unlink "${serverfiles:?}/Engine/Binaries/ThirdParty/SteamCMD/Linux" fn_fix_msg_end + check_steamcmd.sh fi -if [ ! -e "${HOME}/.steam/steamcmd/steamapps" ]; then - fixname="broken steamcmd symlink" +# removed ARK steamcmd directory if steamcmd is missing. +if [ ! -f "${serverfiles}/Engine/Binaries/ThirdParty/SteamCMD/Linux/steamcmd.sh" ]; then + fixname="remove invalid ARK SteamCMD directory" fn_fix_msg_start - rm -f "${HOME}/.steam/steamcmd/steamapps" + rm -rf "${serverfiles:?}/Engine/Binaries/ThirdParty/SteamCMD/Linux" fn_fix_msg_end + check_steamcmd.sh fi -# Symlinking the SteamCMD directory into the correct ARK directory so that the mods auto-management will work. -if [ ! -d "${serverfiles}/Engine/Binaries/ThirdParty/SteamCMD/Linux" ]; then - fixname="steamcmd symlink" +# if the steamapps symlink is incorrect unlink it. +if [ -d "${serverfiles}/Engine/Binaries/ThirdParty/SteamCMD/Linux" ]&&[ -L "${serverfiles}/Engine/Binaries/ThirdParty/SteamCMD/Linux/steamapps" ]&&[ "$(readlink ${serverfiles}/Engine/Binaries/ThirdParty/SteamCMD/Linux/steamapps)" != "${HOME}/Steam/steamapps" ]; then + fixname="incorrect steamapps symlink" fn_fix_msg_start - ln -s "${HOME}/.steam/steamcmd" "${serverfiles}/Engine/Binaries/ThirdParty/SteamCMD/Linux" + unlink "${serverfiles:?}/Engine/Binaries/ThirdParty/SteamCMD/Linux/steamapps" fn_fix_msg_end fi -if [ ! -d "${HOME}/.steam/steamcmd/steamapps" ]; then - fixname="steamcmd symlink" +# Put symlink to steamapps directory into the ARK SteamCMD directory to link the downloaded mods to the correct location. +if [ ! -L "${serverfiles}/Engine/Binaries/ThirdParty/SteamCMD/Linux/steamapps" ]; then + fixname="steamapps symlink" fn_fix_msg_start - ln -s "${HOME}/Steam/steamapps" "${HOME}/.steam/steamcmd/steamapps" + ln -s "${HOME}/Steam/steamapps" "${serverfiles}/Engine/Binaries/ThirdParty/SteamCMD/Linux/steamapps" fn_fix_msg_end fi From 3bd64bbc1330d34d8746db6a2b131b6fd50acbb4 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Sat, 21 Mar 2020 22:23:40 +0000 Subject: [PATCH 320/534] fix(messages): fix some messages not using newline correctly (#2772) * update donate links --- lgsm/functions/alert.sh | 16 +++++++-------- lgsm/functions/alert_discord.sh | 4 ++-- lgsm/functions/alert_email.sh | 4 ++-- lgsm/functions/alert_ifttt.sh | 4 ++-- lgsm/functions/alert_mailgun.sh | 4 ++-- lgsm/functions/alert_pushbullet.sh | 4 ++-- lgsm/functions/alert_pushover.sh | 4 ++-- lgsm/functions/alert_slack.sh | 4 ++-- lgsm/functions/alert_telegram.sh | 4 ++-- lgsm/functions/check_ip.sh | 2 +- lgsm/functions/command_backup.sh | 23 +++++++++++----------- lgsm/functions/command_donate.sh | 2 +- lgsm/functions/command_start.sh | 2 +- lgsm/functions/command_stop.sh | 2 +- lgsm/functions/command_test_alert.sh | 1 - lgsm/functions/command_validate.sh | 4 ++-- lgsm/functions/fix.sh | 2 +- lgsm/functions/update_factorio.sh | 2 -- lgsm/functions/update_minecraft.sh | 2 -- lgsm/functions/update_minecraft_bedrock.sh | 2 -- lgsm/functions/update_mta.sh | 1 - lgsm/functions/update_mumble.sh | 2 -- lgsm/functions/update_steamcmd.sh | 10 ++++------ lgsm/functions/update_ts3.sh | 2 -- 24 files changed, 47 insertions(+), 60 deletions(-) diff --git a/lgsm/functions/alert.sh b/lgsm/functions/alert.sh index e47631d4c..b81cc4d0c 100644 --- a/lgsm/functions/alert.sh +++ b/lgsm/functions/alert.sh @@ -118,7 +118,7 @@ elif [ "${discordalert}" != "on" ]&&[ "${function_selfname}" == "command_test_al fn_script_log_warn "Discord alerts not enabled" elif [ -z "${discordtoken}" ]&&[ "${function_selfname}" == "command_test_alert.sh" ]; then fn_print_error "Discord token not set" - echo -e " * https://docs.linuxgsm.com/alerts/discord" + echo -e "* https://docs.linuxgsm.com/alerts/discord" fn_script_error "Discord token not set" fi @@ -139,7 +139,7 @@ elif [ "${iftttalert}" != "on" ]&&[ "${function_selfname}" == "command_test_aler fn_script_log_warn "IFTTT alerts not enabled" elif [ -z "${ifttttoken}" ]&&[ "${function_selfname}" == "command_test_alert.sh" ]; then fn_print_error "IFTTT token not set" - echo -e " * https://docs.linuxgsm.com/alerts/ifttt" + echo -e "* https://docs.linuxgsm.com/alerts/ifttt" fn_script_error "IFTTT token not set" fi @@ -150,7 +150,7 @@ elif [ "${mailgunalert}" != "on" ]&&[ "${function_selfname}" == "command_test_al fn_script_log_warn "Mailgun alerts not enabled" elif [ -z "${mailguntoken}" ]&&[ "${function_selfname}" == "command_test_alert.sh" ]; then fn_print_error "Mailgun token not set" - echo -e " * https://docs.linuxgsm.com/alerts/mailgun" + echo -e "* https://docs.linuxgsm.com/alerts/mailgun" fn_script_error "Mailgun token not set" fi @@ -161,7 +161,7 @@ elif [ "${pushbulletalert}" != "on" ]&&[ "${function_selfname}" == "command_test fn_script_log_warn "Pushbullet alerts not enabled" elif [ -z "${pushbullettoken}" ]&&[ "${function_selfname}" == "command_test_alert.sh" ]; then fn_print_error "Pushbullet token not set" - echo -e " * https://docs.linuxgsm.com/alerts/pushbullet" + echo -e "* https://docs.linuxgsm.com/alerts/pushbullet" fn_script_error "Pushbullet token not set" fi @@ -172,7 +172,7 @@ elif [ "${pushoveralert}" != "on" ]&&[ "${function_selfname}" == "command_test_a fn_script_log_warn "Pushover alerts not enabled" elif [ -z "${pushovertoken}" ]&&[ "${function_selfname}" == "command_test_alert.sh" ]; then fn_print_error "Pushover token not set" - echo -e " * https://docs.linuxgsm.com/alerts/pushover" + echo -e "* https://docs.linuxgsm.com/alerts/pushover" fn_script_error "Pushover token not set" fi @@ -183,11 +183,11 @@ elif [ "${telegramalert}" != "on" ]&&[ "${function_selfname}" == "command_test_a fn_script_log_warn "Telegram Messages not enabled" elif [ -z "${telegramtoken}" ]&&[ "${function_selfname}" == "command_test_alert.sh" ]; then fn_print_error "Telegram token not set." - echo -e " * https://docs.linuxgsm.com/alerts/telegram" + echo -e "* https://docs.linuxgsm.com/alerts/telegram" fn_script_error "Telegram token not set." elif [ -z "${telegramchatid}" ]&&[ "${function_selfname}" == "command_test_alert.sh" ]; then fn_print_error "Telegram chat id not set." - echo -e " * https://docs.linuxgsm.com/alerts/telegram" + echo -e "* https://docs.linuxgsm.com/alerts/telegram" fn_script_error "Telegram chat id not set." fi @@ -198,6 +198,6 @@ elif [ "${slackalert}" != "on" ]&&[ "${function_selfname}" == "command_test_aler fn_script_log_warn "Slack alerts not enabled" elif [ -z "${slacktoken}" ]&&[ "${function_selfname}" == "command_test_alert.sh" ]; then fn_print_error "Slack token not set" - echo -e " * https://docs.linuxgsm.com/alerts/slack" + echo -e "* https://docs.linuxgsm.com/alerts/slack" fn_script_error "Slack token not set" fi diff --git a/lgsm/functions/alert_discord.sh b/lgsm/functions/alert_discord.sh index c088df281..87ff4ed5f 100644 --- a/lgsm/functions/alert_discord.sh +++ b/lgsm/functions/alert_discord.sh @@ -58,9 +58,9 @@ fn_print_dots "Sending Discord alert" discordsend=$(curl -sSL -H "Content-Type: application/json" -X POST -d "$(echo -n "$json" | jq -c .)" "${discordwebhook}") if [ "${discordsend}" ]; then - fn_print_fail_nl "Sending Discord alert: ${discordsend}" + fn_print_fail "Sending Discord alert: ${discordsend}" fn_script_log_fatal "Sending Discord alert: ${discordsend}" else - fn_print_ok_nl "Sending Discord alert" + fn_print_ok "Sending Discord alert" fn_script_log_pass "Sending Discord alert" fi diff --git a/lgsm/functions/alert_email.sh b/lgsm/functions/alert_email.sh index 43eddfa58..1419af5e4 100644 --- a/lgsm/functions/alert_email.sh +++ b/lgsm/functions/alert_email.sh @@ -18,9 +18,9 @@ else fi exitcode=$? if [ "${exitcode}" == "0" ]; then - fn_print_ok_nl "Sending Email alert: ${email}" + fn_print_ok "Sending Email alert: ${email}" fn_script_log_pass "Sending Email alert: ${email}" else - fn_print_fail_nl "Sending Email alert: ${email}" + fn_print_fail "Sending Email alert: ${email}" fn_script_log_fatal "Sending Email alert: ${email}" fi diff --git a/lgsm/functions/alert_ifttt.sh b/lgsm/functions/alert_ifttt.sh index 26a50114f..ccf334141 100644 --- a/lgsm/functions/alert_ifttt.sh +++ b/lgsm/functions/alert_ifttt.sh @@ -21,9 +21,9 @@ fn_print_dots "Sending IFTTT alert" iftttsend=$(curl -sSL -H "Content-Type: application/json" -X POST -d """${json}""" "https://maker.ifttt.com/trigger/${iftttevent}/with/key/${ifttttoken}" | grep "Bad Request") if [ "${iftttsend}" ]; then - fn_print_fail_nl "Sending IFTTT alert: ${pushbulletsend}" + fn_print_fail "Sending IFTTT alert: ${pushbulletsend}" fn_script_log_fatal "Sending IFTTT alert: ${pushbulletsend}" else - fn_print_ok_nl "Sending IFTTT alert" + fn_print_ok "Sending IFTTT alert" fn_script_log_pass "Sent IFTTT alert" fi diff --git a/lgsm/functions/alert_mailgun.sh b/lgsm/functions/alert_mailgun.sh index 521a46fb9..8e9036ec5 100644 --- a/lgsm/functions/alert_mailgun.sh +++ b/lgsm/functions/alert_mailgun.sh @@ -19,9 +19,9 @@ mailgunsend=$(curl -s --user "api:${mailguntoken}" \ -F text="$(cat "${alertlog}")" "https://api.mailgun.net/v3/${mailgundomain}/messages") if [ -z "${mailgunsend}" ]; then - fn_print_fail_nl "Sending Email alert: Mailgun: ${email}" + fn_print_fail "Sending Email alert: Mailgun: ${email}" fn_script_log_fatal "Sending Email alert: Mailgun: ${email}" else - fn_print_ok_nl "Sending Email alert: Mailgun: ${email}" + fn_print_ok "Sending Email alert: Mailgun: ${email}" fn_script_log_pass "Sending Email alert: Mailgun: ${email}" fi diff --git a/lgsm/functions/alert_pushbullet.sh b/lgsm/functions/alert_pushbullet.sh index 2a0947564..5ae4a5b74 100644 --- a/lgsm/functions/alert_pushbullet.sh +++ b/lgsm/functions/alert_pushbullet.sh @@ -22,9 +22,9 @@ fn_print_dots "Sending Pushbullet alert" pushbulletsend=$(curl -sSL -u """${pushbullettoken}"":" -H "Content-Type: application/json" -X POST -d """${json}""" "https://api.pushbullet.com/v2/pushes" | grep "error_code") if [ "${pushbulletsend}" ]; then - fn_print_fail_nl "Sending Pushbullet alert: ${pushbulletsend}" + fn_print_fail "Sending Pushbullet alert: ${pushbulletsend}" fn_script_log_fatal "Sending Pushbullet alert: ${pushbulletsend}" else - fn_print_ok_nl "Sending Pushbullet alert" + fn_print_ok "Sending Pushbullet alert" fn_script_log_pass "Sent Pushbullet alert" fi diff --git a/lgsm/functions/alert_pushover.sh b/lgsm/functions/alert_pushover.sh index a57a5f4b5..093c4f6a0 100644 --- a/lgsm/functions/alert_pushover.sh +++ b/lgsm/functions/alert_pushover.sh @@ -26,9 +26,9 @@ fi pushoversend=$(curl -sS -F token="${pushovertoken}" -F user="${pushoveruserkey}" -F html="1" -F sound="${alertsound}" -F priority="${alertpriority}" -F title="${alertemoji} ${alertsubject} ${alertemoji}" -F message=" Message
${alertbody}

Game
${gamename}

Server name
${servername}

Hostname
${HOSTNAME}

Server IP
${alertip}:${port}

More info
${alerturl}" "https://api.pushover.net/1/messages.json" | grep errors) if [ "${pushoversend}" ]; then - fn_print_fail_nl "Sending Pushover alert: ${pushoversend}" + fn_print_fail "Sending Pushover alert: ${pushoversend}" fn_script_log_fatal "Sending Pushover alert: ${pushoversend}" else - fn_print_ok_nl "Sending Pushover alert" + fn_print_ok "Sending Pushover alert" fn_script_log_pass "Sent Pushover alert" fi diff --git a/lgsm/functions/alert_slack.sh b/lgsm/functions/alert_slack.sh index 582043f0c..aa3aa6636 100644 --- a/lgsm/functions/alert_slack.sh +++ b/lgsm/functions/alert_slack.sh @@ -72,9 +72,9 @@ fn_print_dots "Sending Slack alert" slacksend=$(curl -sSL -H "Content-Type: application/json" -X POST -d "$(echo -n "$json" | jq -c .)" "${slackwebhook}") if [ "${slacksend}" == "ok" ]; then - fn_print_ok_nl "Sending Slack alert" + fn_print_ok "Sending Slack alert" fn_script_log_pass "Sending Slack alert" else - fn_print_fail_nl "Sending Slack alert: ${slacksend}" + fn_print_fail "Sending Slack alert: ${slacksend}" fn_script_log_fatal "Sending Slack alert: ${slacksend}" fi diff --git a/lgsm/functions/alert_telegram.sh b/lgsm/functions/alert_telegram.sh index 6d7403660..f868430de 100644 --- a/lgsm/functions/alert_telegram.sh +++ b/lgsm/functions/alert_telegram.sh @@ -21,9 +21,9 @@ fn_print_dots "Sending Telegram alert" telegramsend=$(curl -sSL -H "Content-Type: application/json" -X POST -d """${json}""" "https://api.telegram.org/bot${telegramtoken}/sendMessage" "${curlcustomstring}" | grep "error_code") if [ "${telegramsend}" ]; then - fn_print_fail_nl "Sending Telegram alert: ${telegramsend}" + fn_print_fail "Sending Telegram alert: ${telegramsend}" fn_script_log_fatal "Sending Telegram alert: ${telegramsend}" else - fn_print_ok_nl "Sending Telegram alert" + fn_print_ok "Sending Telegram alert" fn_script_log_pass "Sent Telegram alert" fi diff --git a/lgsm/functions/check_ip.sh b/lgsm/functions/check_ip.sh index b421639d3..b89a38f07 100644 --- a/lgsm/functions/check_ip.sh +++ b/lgsm/functions/check_ip.sh @@ -80,7 +80,7 @@ if [ "${travistest}" != "1" ]; then core_exit.sh fi else - fn_print_info_nl "Check IP: ${getip}" + fn_print_info "Check IP: ${getip}" fn_script_log_info "IP automatically set as: ${getip}" ip="${getip}" fi diff --git a/lgsm/functions/command_backup.sh b/lgsm/functions/command_backup.sh index 248604282..6c195f875 100644 --- a/lgsm/functions/command_backup.sh +++ b/lgsm/functions/command_backup.sh @@ -54,7 +54,8 @@ fn_backup_init(){ else daysago="${lastbackupdaysago} days ago" fi - echo -e " * Previous backup was created ${daysago}, total size ${lastbackupsize}" + echo -en "\n" + echo -e "* Previous backup was created ${daysago}, total size ${lastbackupsize}" fi } @@ -68,12 +69,12 @@ fn_backup_stop_server(){ elif [ "${stoponbackup}" == "off" ]; then serverstopped="no" fn_print_warn_nl "${selfname} is currently running" - echo -e " * Although unlikely; creating a backup while ${selfname} is running might corrupt the backup." + echo -e "* Although unlikely; creating a backup while ${selfname} is running might corrupt the backup." fn_script_log_warn "${selfname} is currently running" fn_script_log_warn "Although unlikely; creating a backup while ${selfname} is running might corrupt the backup" # Server is running and will be stopped if stoponbackup=on or unset. else - fn_print_warn_nl "${selfname} will be stopped during the backup" + fn_print_warn "${selfname} will be stopped during the backup" fn_script_log_warn "${selfname} will be stopped during the backup" serverstopped="yes" exitbypass=1 @@ -134,7 +135,7 @@ fn_backup_compression(){ # Check that excludedir is a valid path. if [ ! -d "${excludedir}" ] ; then - fn_print_fail_nl "Problem identifying the previous backup directory for exclusion." + fn_print_fail "Problem identifying the previous backup directory for exclusion." fn_script_log_fatal "Problem identifying the previous backup directory for exclusion" core_exit.sh fi @@ -145,11 +146,11 @@ fn_backup_compression(){ fn_print_fail_eol fn_script_log_fatal "Backup in progress: FAIL" echo -e "${tarcmd}" | tee -a "${lgsmlog}" - fn_print_fail_nl "Starting backup" + fn_print_fail "Starting backup" fn_script_log_fatal "Starting backup" else fn_print_ok_eol - fn_print_ok_nl "Completed: ${backupname}.tar.gz, total size $(du -sh "${backupdir}/${backupname}.tar.gz" | awk '{print $1}')" + fn_print_ok "Completed: ${backupname}.tar.gz, total size $(du -sh "${backupdir}/${backupname}.tar.gz" | awk '{print $1}')" fn_script_log_pass "Backup created: ${backupname}.tar.gz, total size $(du -sh "${backupdir}/${backupname}.tar.gz" | awk '{print $1}')" fi # Remove lock file @@ -170,30 +171,30 @@ fn_backup_prune(){ if [ "${backupquotadiff}" -gt "0" ]||[ "${backupsoudatedcount}" -gt "0" ]; then fn_print_dots "Pruning" fn_script_log_info "Backup pruning activated" - fn_print_ok_nl "Pruning" + fn_print_ok "Pruning" # If maxbackups greater or equal to backupsoutdatedcount, then it is over maxbackupdays. if [ "${backupquotadiff}" -ge "${backupsoudatedcount}" ]; then # Display how many backups will be cleared. - echo -e " * Pruning: ${backupquotadiff} backup(s) has exceeded the ${maxbackups} backups limit" + echo -e "* Pruning: ${backupquotadiff} backup(s) has exceeded the ${maxbackups} backups limit" fn_script_log_info "Pruning: ${backupquotadiff} backup(s) has exceeded the ${maxbackups} backups limit" fn_sleep_time fn_print_dots "Pruning: Clearing ${backupquotadiff} backup(s)" fn_script_log_info "Pruning: Clearing ${backupquotadiff} backup(s)" # Clear backups over quota. find "${backupdir}"/ -type f -name "*.tar.gz" -printf '%T@ %p\n' | sort -rn | tail -${backupquotadiff} | cut -f2- -d" " | xargs rm - fn_print_ok_nl "Pruning: Clearing ${backupquotadiff} backup(s)" + fn_print_ok "Pruning: Clearing ${backupquotadiff} backup(s)" fn_script_log_pass "Pruning: Cleared ${backupquotadiff} backup(s)" # If maxbackupdays is used over maxbackups. elif [ "${backupquotadiff}" -lt "${backupsoudatedcount}" ]; then # Display how many backups will be cleared. - echo -e " * Pruning: ${backupsoudatedcount} backup(s) are older than ${maxbackupdays} days." + echo -e "* Pruning: ${backupsoudatedcount} backup(s) are older than ${maxbackupdays} days." fn_script_log_info "Pruning: ${backupsoudatedcount} backup(s) older than ${maxbackupdays} days." fn_sleep_time fn_print_dots "Pruning: Clearing ${backupquotadiff} backup(s)." fn_script_log_info "Pruning: Clearing ${backupquotadiff} backup(s)" # Clear backups over quota find "${backupdir}"/ -type f -mtime +"${maxbackupdays}" -exec rm -f {} \; - fn_print_ok_nl "Pruning: Clearing ${backupquotadiff} backup(s)" + fn_print_ok "Pruning: Clearing ${backupquotadiff} backup(s)" fn_script_log_pass "Pruning: Cleared ${backupquotadiff} backup(s)" fi fi diff --git a/lgsm/functions/command_donate.sh b/lgsm/functions/command_donate.sh index e979339f1..726ac1b60 100644 --- a/lgsm/functions/command_donate.sh +++ b/lgsm/functions/command_donate.sh @@ -16,8 +16,8 @@ echo -e "Been using LinuxGSM?" echo -e "Consider donating to support development." echo -e "" echo -e "* ${lightblue}Patreon:${default} https://linuxgsm.com/patreon" +echo -e "* ${lightblue}GitHub:${default} https://github.com/sponsors/dgibbs64" echo -e "* ${lightblue}PayPal:${default} https://linuxgsm.com/paypal" -echo -e "* ${lightblue}Ko-Fi:${default} https://linuxgsm.com/ko-fi" echo -e "" echo -e "LinuxGSM est. 2012" diff --git a/lgsm/functions/command_start.sh b/lgsm/functions/command_start.sh index bf5c65146..8f60a7314 100644 --- a/lgsm/functions/command_start.sh +++ b/lgsm/functions/command_start.sh @@ -170,7 +170,7 @@ fn_print_dots "${servername}" # Is the server already started. # $status comes from check_status.sh, which is run by check.sh for this command if [ "${status}" != "0" ]; then - fn_print_info_nl "${servername} is already running" + fn_print_info "${servername} is already running" fn_script_log_error "${servername} is already running" if [ -z "${exitbypass}" ]; then core_exit.sh diff --git a/lgsm/functions/command_stop.sh b/lgsm/functions/command_stop.sh index 40e3f92e3..c7c6ebf3b 100644 --- a/lgsm/functions/command_stop.sh +++ b/lgsm/functions/command_stop.sh @@ -211,7 +211,7 @@ fn_stop_tmux(){ fn_sleep_time check_status.sh if [ "${status}" == "0" ]; then - fn_print_ok_nl "${servername}" + fn_print_ok "${servername}" fn_script_log_pass "Stopped ${servername}" else fn_print_fail_nl "Unable to stop ${servername}" diff --git a/lgsm/functions/command_test_alert.sh b/lgsm/functions/command_test_alert.sh index 77ff0d079..3bc975949 100644 --- a/lgsm/functions/command_test_alert.sh +++ b/lgsm/functions/command_test_alert.sh @@ -13,5 +13,4 @@ check.sh info_config.sh alert="test" alert.sh - core_exit.sh diff --git a/lgsm/functions/command_validate.sh b/lgsm/functions/command_validate.sh index abc59473c..6764831f4 100644 --- a/lgsm/functions/command_validate.sh +++ b/lgsm/functions/command_validate.sh @@ -30,10 +30,10 @@ fn_validation(){ ${unbuffer} ${steamcmdcommand} +login "${steamuser}" "${steampass}" +force_install_dir "${serverfiles}" +app_update "${appid}" -beta "${branch}" validate +quit | tee -a "${lgsmlog}" fi if [ $? != 0 ]; then - fn_print_fail_nl "Validating files: SteamCMD" + fn_print_fail "Validating files: SteamCMD" fn_script_log_fatal "Validating files: SteamCMD: FAIL" else - fn_print_ok_nl "Validating files: SteamCMD" + fn_print_ok "Validating files: SteamCMD" fn_script_log_pass "Validating files: SteamCMD: OK" fi fix.sh diff --git a/lgsm/functions/fix.sh b/lgsm/functions/fix.sh index 3b5a58965..7533590de 100644 --- a/lgsm/functions/fix.sh +++ b/lgsm/functions/fix.sh @@ -17,7 +17,7 @@ fn_fix_msg_start(){ fn_fix_msg_start_nl(){ fn_print_dots "Applying ${fixname} fix: ${gamename}" - fn_print_info "Applying ${fixname} fix: ${gamename}" + fn_print_info_nl "Applying ${fixname} fix: ${gamename}" fn_script_log_info "Applying ${fixname} fix: ${gamename}" } diff --git a/lgsm/functions/update_factorio.sh b/lgsm/functions/update_factorio.sh index e5a3a4397..6d520bacf 100644 --- a/lgsm/functions/update_factorio.sh +++ b/lgsm/functions/update_factorio.sh @@ -72,7 +72,6 @@ fn_update_factorio_compare(){ remotebuilddigit=$(echo -e "${remotebuild}" | tr -cd '[:digit:]') if [ "${localbuilddigit}" -ne "${remotebuilddigit}" ]||[ "${forceupdate}" == "1" ]; then fn_print_ok_nl "Checking for update: ${remotelocation}" - echo -en "\n" echo -e "Update available" echo -e "* Local build: ${red}${localbuild} ${factorioarch}${default}" echo -e "* Remote build: ${green}${remotebuild} ${factorioarch}${default}" @@ -120,7 +119,6 @@ fn_update_factorio_compare(){ alert.sh else fn_print_ok_nl "Checking for update: ${remotelocation}" - echo -en "\n" echo -e "No update available" echo -e "* Local build: ${green}${localbuild} ${factorioarch}${default}" echo -e "* Remote build: ${green}${remotebuild} ${factorioarch}${default}" diff --git a/lgsm/functions/update_minecraft.sh b/lgsm/functions/update_minecraft.sh index 706aa7832..d404cb046 100644 --- a/lgsm/functions/update_minecraft.sh +++ b/lgsm/functions/update_minecraft.sh @@ -135,7 +135,6 @@ fn_update_minecraft_compare(){ fn_print_dots "Checking for update: ${remotelocation}" if [ "${localbuild}" != "${remotebuild}" ]||[ "${forceupdate}" == "1" ]; then fn_print_ok_nl "Checking for update: ${remotelocation}" - echo -en "\n" echo -e "Update available" echo -e "* Local build: ${red}${localbuild}${default}" echo -e "* Remote build: ${green}${remotebuild}${default}" @@ -180,7 +179,6 @@ fn_update_minecraft_compare(){ alert.sh else fn_print_ok_nl "Checking for update: ${remotelocation}" - echo -en "\n" echo -e "No update available" echo -e "* Local build: ${green}${localbuild}${default}" echo -e "* Remote build: ${green}${remotebuild}${default}" diff --git a/lgsm/functions/update_minecraft_bedrock.sh b/lgsm/functions/update_minecraft_bedrock.sh index 00989d52c..2dadec7c2 100644 --- a/lgsm/functions/update_minecraft_bedrock.sh +++ b/lgsm/functions/update_minecraft_bedrock.sh @@ -104,7 +104,6 @@ fn_update_minecraft_compare(){ remotebuilddigit=$(echo -e "${remotebuild}" | tr -cd '[:digit:]') if [ "${localbuilddigit}" -ne "${remotebuilddigit}" ]||[ "${forceupdate}" == "1" ]; then fn_print_ok_nl "Checking for update: ${remotelocation}" - echo -en "\n" echo -e "Update available" echo -e "* Local build: ${red}${localbuild}${default}" echo -e "* Remote build: ${green}${remotebuild}${default}" @@ -146,7 +145,6 @@ fn_update_minecraft_compare(){ alert.sh else fn_print_ok_nl "Checking for update: ${remotelocation}" - echo -en "\n" echo -e "No update available" echo -e "* Local build: ${green}${localbuild}${default}" echo -e "* Remote build: ${green}${remotebuild}${default}" diff --git a/lgsm/functions/update_mta.sh b/lgsm/functions/update_mta.sh index 373b3e823..da0d16fdb 100644 --- a/lgsm/functions/update_mta.sh +++ b/lgsm/functions/update_mta.sh @@ -179,7 +179,6 @@ fn_update_mta_compare(){ alert.sh else fn_print_ok_nl "Checking for update: ${remotelocation}" - echo -en "\n" echo -e "No update available" echo -e "* Local build: ${green}${localbuild}${default}" echo -e "* Remote build: ${green}${remotebuild}${default}" diff --git a/lgsm/functions/update_mumble.sh b/lgsm/functions/update_mumble.sh index c17bd8036..097e3c158 100644 --- a/lgsm/functions/update_mumble.sh +++ b/lgsm/functions/update_mumble.sh @@ -72,7 +72,6 @@ fn_update_mumble_compare(){ remotebuilddigit=$(echo -e "${remotebuild}" | tr -cd '[:digit:]') if [ "${localbuilddigit}" -ne "${remotebuilddigit}" ]||[ "${forceupdate}" == "1" ]; then fn_print_ok_nl "Checking for update: ${remotelocation}" - echo -en "\n" echo -e "Update available" echo -e "* Local build: ${red}${localbuild} ${mumblearch}${default}" echo -e "* Remote build: ${green}${remotebuild} ${mumblearch}${default}" @@ -114,7 +113,6 @@ fn_update_mumble_compare(){ alert.sh else fn_print_ok_nl "Checking for update: ${remotelocation}" - echo -en "\n" echo -e "No update available" echo -e "* Local build: ${green}${localbuild} ${mumblearch}${default}" echo -e "* Remote build: ${green}${remotebuild} ${mumblearch}${default}" diff --git a/lgsm/functions/update_steamcmd.sh b/lgsm/functions/update_steamcmd.sh index b1f3b99b2..17006a909 100644 --- a/lgsm/functions/update_steamcmd.sh +++ b/lgsm/functions/update_steamcmd.sh @@ -80,7 +80,6 @@ fn_update_steamcmd_compare(){ fn_print_dots "Checking for update: ${remotelocation}" if [ "${localbuild}" != "${remotebuild}" ]; then fn_print_ok_nl "Checking for update: ${remotelocation}" - echo -en "\n" echo -e "Update available" echo -e "* Local build: ${red}${localbuild}${default}" echo -e "* Remote build: ${green}${remotebuild}${default}" @@ -124,7 +123,6 @@ fn_update_steamcmd_compare(){ alert.sh else fn_print_ok_nl "Checking for update: ${remotelocation}" - echo -en "\n" echo -e "No update available" echo -e "* Local build: ${green}${localbuild}${default}" echo -e "* Remote build: ${green}${remotebuild}${default}" @@ -171,19 +169,19 @@ fn_appmanifest_check(){ else fn_print_ok "Removed x${appmanifestfilewc1} appmanifest_${appid}.acf files" fn_script_log_pass "Removed x${appmanifestfilewc1} appmanifest_${appid}.acf files" - fn_print_info_nl "Forcing update to correct issue" + fn_print_info "Forcing update to correct issue" fn_script_log_info "Forcing update to correct issue" fn_update_steamcmd_dl fi elif [ "${appmanifestfilewc}" -eq "0" ]; then - fn_print_error_nl "No appmanifest_${appid}.acf found" + fn_print_error "No appmanifest_${appid}.acf found" fn_script_log_error "No appmanifest_${appid}.acf found" - fn_print_info_nl "Forcing update to correct issue" + fn_print_info "Forcing update to correct issue" fn_script_log_info "Forcing update to correct issue" fn_update_steamcmd_dl fn_appmanifest_info if [ "${appmanifestfilewc}" -eq "0" ]; then - fn_print_fail_nl "Still no appmanifest_${appid}.acf found" + fn_print_fail "Still no appmanifest_${appid}.acf found" fn_script_log_fatal "Still no appmanifest_${appid}.acf found" core_exit.sh fi diff --git a/lgsm/functions/update_ts3.sh b/lgsm/functions/update_ts3.sh index 893d34205..3c8837214 100644 --- a/lgsm/functions/update_ts3.sh +++ b/lgsm/functions/update_ts3.sh @@ -136,7 +136,6 @@ fn_update_ts3_compare(){ remotebuilddigit=$(echo -e "${remotebuild}" | tr -cd '[:digit:]') if [ "${localbuilddigit}" -ne "${remotebuilddigit}" ]||[ "${forceupdate}" == "1" ]; then fn_print_ok_nl "Checking for update: ${remotelocation}" - echo -en "\n" echo -e "Update available" echo -e "* Local build: ${red}${localbuild}${default}" echo -e "* Remote build: ${green}${remotebuild}${default}" @@ -178,7 +177,6 @@ fn_update_ts3_compare(){ alert.sh else fn_print_ok_nl "Checking for update: ${remotelocation}" - echo -en "\n" echo -e "No update available" echo -e "* Local build: ${green}${localbuild}${default}" echo -e "* Remote build: ${green}${remotebuild}${default}" From 623bc833046415004144ffa3c193fd9118cffab2 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Sat, 21 Mar 2020 22:25:52 +0000 Subject: [PATCH 321/534] release v20.1.4 --- linuxgsm.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/linuxgsm.sh b/linuxgsm.sh index 35c1fe34c..c98d5ed3a 100755 --- a/linuxgsm.sh +++ b/linuxgsm.sh @@ -20,7 +20,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="v20.1.3" +version="v20.1.4" shortname="core" gameservername="core" rootdir=$(dirname "$(readlink -f "${BASH_SOURCE[0]}")") From 420f4a5184b5477eace20ab19c0a0005c4e65fe3 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Tue, 24 Mar 2020 21:53:23 +0000 Subject: [PATCH 322/534] fix(arkserver): allow auto selecting of correct steamapps dir (#2781) * fix: correct error with fn_print_error_eol_nl * fix(arkserver): allow selecting of correct steamapps dir * added else * fix(arkserver): allow selecting of correct steamapps dir steamcmd has two directorys for steamapps based on unknown reasons. fix now allows LinuxGSM to select which ever one is available * now uses find to locate steamapps dir * bug --- lgsm/functions/fix_ark.sh | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/lgsm/functions/fix_ark.sh b/lgsm/functions/fix_ark.sh index 8563a26ff..b9cc17e9a 100644 --- a/lgsm/functions/fix_ark.sh +++ b/lgsm/functions/fix_ark.sh @@ -4,6 +4,13 @@ # Website: https://linuxgsm.com # Description: Resolves various issues with ARK: Survival Evolved. +# Steam mods directory selecter +# This allows LinxuGSM to select either ~/.steam or ~/Steam. depending on what is being used + +steamappsfile=$(find ${HOME} -name appworkshop_346110.acf) +steamappsdir=$(dirname "${steamappsfile}") +steamappspath=$(cd ${steamappsdir};cd ../;pwd) + # removes the symlink if exists. # fixes issue with older versions of LinuxGSM linking to /home/arkserver/steamcmd if [ -L "${serverfiles}/Engine/Binaries/ThirdParty/SteamCMD/Linux" ]; then @@ -24,7 +31,7 @@ if [ ! -f "${serverfiles}/Engine/Binaries/ThirdParty/SteamCMD/Linux/steamcmd.sh" fi # if the steamapps symlink is incorrect unlink it. -if [ -d "${serverfiles}/Engine/Binaries/ThirdParty/SteamCMD/Linux" ]&&[ -L "${serverfiles}/Engine/Binaries/ThirdParty/SteamCMD/Linux/steamapps" ]&&[ "$(readlink ${serverfiles}/Engine/Binaries/ThirdParty/SteamCMD/Linux/steamapps)" != "${HOME}/Steam/steamapps" ]; then +if [ -d "${serverfiles}/Engine/Binaries/ThirdParty/SteamCMD/Linux" ]&&[ -L "${serverfiles}/Engine/Binaries/ThirdParty/SteamCMD/Linux/steamapps" ]&&[ "$(readlink ${serverfiles}/Engine/Binaries/ThirdParty/SteamCMD/Linux/steamapps)" != "${steamappspath}" ]; then fixname="incorrect steamapps symlink" fn_fix_msg_start unlink "${serverfiles:?}/Engine/Binaries/ThirdParty/SteamCMD/Linux/steamapps" @@ -35,6 +42,6 @@ fi if [ ! -L "${serverfiles}/Engine/Binaries/ThirdParty/SteamCMD/Linux/steamapps" ]; then fixname="steamapps symlink" fn_fix_msg_start - ln -s "${HOME}/Steam/steamapps" "${serverfiles}/Engine/Binaries/ThirdParty/SteamCMD/Linux/steamapps" + ln -s "${steamappspath}" "${serverfiles}/Engine/Binaries/ThirdParty/SteamCMD/Linux/steamapps" fn_fix_msg_end fi From 0257457409a25c5800afb9738d4f79ddee1d47c4 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Tue, 24 Mar 2020 22:06:58 +0000 Subject: [PATCH 323/534] release v20.1.5 --- linuxgsm.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/linuxgsm.sh b/linuxgsm.sh index c98d5ed3a..9e5a5b685 100755 --- a/linuxgsm.sh +++ b/linuxgsm.sh @@ -20,7 +20,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="v20.1.4" +version="v20.1.5" shortname="core" gameservername="core" rootdir=$(dirname "$(readlink -f "${BASH_SOURCE[0]}")") From fed59c941e224f462f609b7c50d3ab73b7fb3ee3 Mon Sep 17 00:00:00 2001 From: GrillGuth <2031292+GrillGuth@users.noreply.github.com> Date: Fri, 27 Mar 2020 20:01:15 +0100 Subject: [PATCH 324/534] fix(ts3server): improve ts3 ip parsing (#2789) For Teamspeak3-Servers: Only use the first IP specified within the ts3server.ini file. The IP string is cut off after the first appearance of a comma (IP separator within ts3server.ini files). --- 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 9618d60c6..ef461041a 100644 --- a/lgsm/functions/info_config.sh +++ b/lgsm/functions/info_config.sh @@ -826,7 +826,7 @@ fn_info_config_teamspeak3(){ queryport=$(grep "query_port" "${servercfgfullpath}" | grep -v "#" | tr -cd '[:digit:]') fileport=$(grep "filetransfer_port" "${servercfgfullpath}" | grep -v "#" | tr -cd '[:digit:]') - ip=$(grep "voice_ip" "${servercfgfullpath}" | sed -e 's/^[ \t]*//g' -e '/^#/d' -e 's/voice_ip//g' | tr -d '=\";,:' | sed -e 's/^[ \t]*//' -e 's/[ \t]*$//') + ip=$(grep "voice_ip" "${servercfgfullpath}" | sed -e 's/^[ \t]*//g' -e '/^#/d' -e 's/voice_ip//g' | sed 's/,.*//' | tr -d '=\";,:' | sed -e 's/^[ \t]*//' -e 's/[ \t]*$//') ipsetinconfig=1 ipinconfigvar="voice_ip" From a3e1b53b02458aff352b5b73d3b48f706e6717fa Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Tue, 31 Mar 2020 22:26:51 +0100 Subject: [PATCH 325/534] fix(messages): improvements to messaging (#2792) * Revert "fix(messages): fix some messages not using newline correctly (#2772)" This reverts commit 3bd64bbc1330d34d8746db6a2b131b6fd50acbb4. * Revert "fix(messages): fix some messages not using newline correctly (#2765)" This reverts commit c847ecb4b6048b4654b83b26cc822504897610ec. * added new [ START ] message * various messages improvements made --- lgsm/functions/alert.sh | 22 +++---- lgsm/functions/alert_discord.sh | 4 +- lgsm/functions/alert_email.sh | 4 +- lgsm/functions/alert_ifttt.sh | 4 +- lgsm/functions/alert_mailgun.sh | 4 +- lgsm/functions/alert_pushbullet.sh | 4 +- lgsm/functions/alert_pushover.sh | 4 +- lgsm/functions/alert_slack.sh | 4 +- lgsm/functions/alert_telegram.sh | 4 +- lgsm/functions/check_deps.sh | 8 +-- lgsm/functions/check_ip.sh | 2 +- lgsm/functions/command_backup.sh | 75 +++++++++++++--------- lgsm/functions/command_debug.sh | 8 --- lgsm/functions/command_monitor.sh | 2 +- lgsm/functions/command_postdetails.sh | 15 +++-- lgsm/functions/command_start.sh | 2 +- lgsm/functions/command_stop.sh | 2 +- lgsm/functions/command_test_alert.sh | 1 + lgsm/functions/command_validate.sh | 60 +++++++++++------ lgsm/functions/core_getopt.sh | 2 +- lgsm/functions/core_messages.sh | 44 +++++++++---- lgsm/functions/fix.sh | 2 +- lgsm/functions/update_factorio.sh | 39 ++++++----- lgsm/functions/update_minecraft.sh | 54 +++++++++------- lgsm/functions/update_minecraft_bedrock.sh | 65 ++++++++++--------- lgsm/functions/update_mta.sh | 56 ++++++++-------- lgsm/functions/update_mumble.sh | 40 +++++++----- lgsm/functions/update_steamcmd.sh | 65 ++++++++++++------- lgsm/functions/update_ts3.sh | 60 +++++++++-------- 29 files changed, 383 insertions(+), 273 deletions(-) diff --git a/lgsm/functions/alert.sh b/lgsm/functions/alert.sh index b81cc4d0c..f76500105 100644 --- a/lgsm/functions/alert.sh +++ b/lgsm/functions/alert.sh @@ -104,10 +104,10 @@ elif [ "${postalert}" != "on" ]&&[ "${function_selfname}" == "command_test_alert fn_print_warn_nl "More Info not enabled" fn_script_log_warn "More Info alerts not enabled" elif [ -z "${posttarget}" ]&&[ "${function_selfname}" == "command_test_alert.sh" ]; then - fn_print_error "posttarget not set" + fn_print_error_nl "posttarget not set" fn_script_error "posttarget not set" elif [ -z "${postdays}" ]&&[ "${function_selfname}" == "command_test_alert.sh" ]; then - fn_print_error "postdays not set" + fn_print_error_nl "postdays not set" fn_script_error "postdays not set" fi @@ -117,7 +117,7 @@ elif [ "${discordalert}" != "on" ]&&[ "${function_selfname}" == "command_test_al fn_print_warn_nl "Discord alerts not enabled" fn_script_log_warn "Discord alerts not enabled" elif [ -z "${discordtoken}" ]&&[ "${function_selfname}" == "command_test_alert.sh" ]; then - fn_print_error "Discord token not set" + fn_print_error_nl "Discord token not set" echo -e "* https://docs.linuxgsm.com/alerts/discord" fn_script_error "Discord token not set" fi @@ -128,7 +128,7 @@ elif [ "${emailalert}" != "on" ]&&[ "${function_selfname}" == "command_test_aler fn_print_warn_nl "Email alerts not enabled" fn_script_log_warn "Email alerts not enabled" elif [ -z "${email}" ]&&[ "${function_selfname}" == "command_test_alert.sh" ]; then - fn_print_error "Email not set" + fn_print_error_nl "Email not set" fn_script_log_error "Email not set" fi @@ -138,7 +138,7 @@ elif [ "${iftttalert}" != "on" ]&&[ "${function_selfname}" == "command_test_aler fn_print_warn_nl "IFTTT alerts not enabled" fn_script_log_warn "IFTTT alerts not enabled" elif [ -z "${ifttttoken}" ]&&[ "${function_selfname}" == "command_test_alert.sh" ]; then - fn_print_error "IFTTT token not set" + fn_print_error_nl "IFTTT token not set" echo -e "* https://docs.linuxgsm.com/alerts/ifttt" fn_script_error "IFTTT token not set" fi @@ -149,7 +149,7 @@ elif [ "${mailgunalert}" != "on" ]&&[ "${function_selfname}" == "command_test_al fn_print_warn_nl "Mailgun alerts not enabled" fn_script_log_warn "Mailgun alerts not enabled" elif [ -z "${mailguntoken}" ]&&[ "${function_selfname}" == "command_test_alert.sh" ]; then - fn_print_error "Mailgun token not set" + fn_print_error_nl "Mailgun token not set" echo -e "* https://docs.linuxgsm.com/alerts/mailgun" fn_script_error "Mailgun token not set" fi @@ -160,7 +160,7 @@ elif [ "${pushbulletalert}" != "on" ]&&[ "${function_selfname}" == "command_test fn_print_warn_nl "Pushbullet alerts not enabled" fn_script_log_warn "Pushbullet alerts not enabled" elif [ -z "${pushbullettoken}" ]&&[ "${function_selfname}" == "command_test_alert.sh" ]; then - fn_print_error "Pushbullet token not set" + fn_print_error_nl "Pushbullet token not set" echo -e "* https://docs.linuxgsm.com/alerts/pushbullet" fn_script_error "Pushbullet token not set" fi @@ -171,7 +171,7 @@ elif [ "${pushoveralert}" != "on" ]&&[ "${function_selfname}" == "command_test_a fn_print_warn_nl "Pushover alerts not enabled" fn_script_log_warn "Pushover alerts not enabled" elif [ -z "${pushovertoken}" ]&&[ "${function_selfname}" == "command_test_alert.sh" ]; then - fn_print_error "Pushover token not set" + fn_print_error_nl "Pushover token not set" echo -e "* https://docs.linuxgsm.com/alerts/pushover" fn_script_error "Pushover token not set" fi @@ -182,11 +182,11 @@ elif [ "${telegramalert}" != "on" ]&&[ "${function_selfname}" == "command_test_a fn_print_warn_nl "Telegram Messages not enabled" fn_script_log_warn "Telegram Messages not enabled" elif [ -z "${telegramtoken}" ]&&[ "${function_selfname}" == "command_test_alert.sh" ]; then - fn_print_error "Telegram token not set." + fn_print_error_nl "Telegram token not set." echo -e "* https://docs.linuxgsm.com/alerts/telegram" fn_script_error "Telegram token not set." elif [ -z "${telegramchatid}" ]&&[ "${function_selfname}" == "command_test_alert.sh" ]; then - fn_print_error "Telegram chat id not set." + fn_print_error_nl "Telegram chat id not set." echo -e "* https://docs.linuxgsm.com/alerts/telegram" fn_script_error "Telegram chat id not set." fi @@ -197,7 +197,7 @@ elif [ "${slackalert}" != "on" ]&&[ "${function_selfname}" == "command_test_aler fn_print_warn_nl "Slack alerts not enabled" fn_script_log_warn "Slack alerts not enabled" elif [ -z "${slacktoken}" ]&&[ "${function_selfname}" == "command_test_alert.sh" ]; then - fn_print_error "Slack token not set" + fn_print_error_nl "Slack token not set" echo -e "* https://docs.linuxgsm.com/alerts/slack" fn_script_error "Slack token not set" fi diff --git a/lgsm/functions/alert_discord.sh b/lgsm/functions/alert_discord.sh index 87ff4ed5f..c088df281 100644 --- a/lgsm/functions/alert_discord.sh +++ b/lgsm/functions/alert_discord.sh @@ -58,9 +58,9 @@ fn_print_dots "Sending Discord alert" discordsend=$(curl -sSL -H "Content-Type: application/json" -X POST -d "$(echo -n "$json" | jq -c .)" "${discordwebhook}") if [ "${discordsend}" ]; then - fn_print_fail "Sending Discord alert: ${discordsend}" + fn_print_fail_nl "Sending Discord alert: ${discordsend}" fn_script_log_fatal "Sending Discord alert: ${discordsend}" else - fn_print_ok "Sending Discord alert" + fn_print_ok_nl "Sending Discord alert" fn_script_log_pass "Sending Discord alert" fi diff --git a/lgsm/functions/alert_email.sh b/lgsm/functions/alert_email.sh index 1419af5e4..43eddfa58 100644 --- a/lgsm/functions/alert_email.sh +++ b/lgsm/functions/alert_email.sh @@ -18,9 +18,9 @@ else fi exitcode=$? if [ "${exitcode}" == "0" ]; then - fn_print_ok "Sending Email alert: ${email}" + fn_print_ok_nl "Sending Email alert: ${email}" fn_script_log_pass "Sending Email alert: ${email}" else - fn_print_fail "Sending Email alert: ${email}" + fn_print_fail_nl "Sending Email alert: ${email}" fn_script_log_fatal "Sending Email alert: ${email}" fi diff --git a/lgsm/functions/alert_ifttt.sh b/lgsm/functions/alert_ifttt.sh index ccf334141..26a50114f 100644 --- a/lgsm/functions/alert_ifttt.sh +++ b/lgsm/functions/alert_ifttt.sh @@ -21,9 +21,9 @@ fn_print_dots "Sending IFTTT alert" iftttsend=$(curl -sSL -H "Content-Type: application/json" -X POST -d """${json}""" "https://maker.ifttt.com/trigger/${iftttevent}/with/key/${ifttttoken}" | grep "Bad Request") if [ "${iftttsend}" ]; then - fn_print_fail "Sending IFTTT alert: ${pushbulletsend}" + fn_print_fail_nl "Sending IFTTT alert: ${pushbulletsend}" fn_script_log_fatal "Sending IFTTT alert: ${pushbulletsend}" else - fn_print_ok "Sending IFTTT alert" + fn_print_ok_nl "Sending IFTTT alert" fn_script_log_pass "Sent IFTTT alert" fi diff --git a/lgsm/functions/alert_mailgun.sh b/lgsm/functions/alert_mailgun.sh index 8e9036ec5..521a46fb9 100644 --- a/lgsm/functions/alert_mailgun.sh +++ b/lgsm/functions/alert_mailgun.sh @@ -19,9 +19,9 @@ mailgunsend=$(curl -s --user "api:${mailguntoken}" \ -F text="$(cat "${alertlog}")" "https://api.mailgun.net/v3/${mailgundomain}/messages") if [ -z "${mailgunsend}" ]; then - fn_print_fail "Sending Email alert: Mailgun: ${email}" + fn_print_fail_nl "Sending Email alert: Mailgun: ${email}" fn_script_log_fatal "Sending Email alert: Mailgun: ${email}" else - fn_print_ok "Sending Email alert: Mailgun: ${email}" + fn_print_ok_nl "Sending Email alert: Mailgun: ${email}" fn_script_log_pass "Sending Email alert: Mailgun: ${email}" fi diff --git a/lgsm/functions/alert_pushbullet.sh b/lgsm/functions/alert_pushbullet.sh index 5ae4a5b74..2a0947564 100644 --- a/lgsm/functions/alert_pushbullet.sh +++ b/lgsm/functions/alert_pushbullet.sh @@ -22,9 +22,9 @@ fn_print_dots "Sending Pushbullet alert" pushbulletsend=$(curl -sSL -u """${pushbullettoken}"":" -H "Content-Type: application/json" -X POST -d """${json}""" "https://api.pushbullet.com/v2/pushes" | grep "error_code") if [ "${pushbulletsend}" ]; then - fn_print_fail "Sending Pushbullet alert: ${pushbulletsend}" + fn_print_fail_nl "Sending Pushbullet alert: ${pushbulletsend}" fn_script_log_fatal "Sending Pushbullet alert: ${pushbulletsend}" else - fn_print_ok "Sending Pushbullet alert" + fn_print_ok_nl "Sending Pushbullet alert" fn_script_log_pass "Sent Pushbullet alert" fi diff --git a/lgsm/functions/alert_pushover.sh b/lgsm/functions/alert_pushover.sh index 093c4f6a0..a57a5f4b5 100644 --- a/lgsm/functions/alert_pushover.sh +++ b/lgsm/functions/alert_pushover.sh @@ -26,9 +26,9 @@ fi pushoversend=$(curl -sS -F token="${pushovertoken}" -F user="${pushoveruserkey}" -F html="1" -F sound="${alertsound}" -F priority="${alertpriority}" -F title="${alertemoji} ${alertsubject} ${alertemoji}" -F message=" Message
${alertbody}

Game
${gamename}

Server name
${servername}

Hostname
${HOSTNAME}

Server IP
${alertip}:${port}

More info
${alerturl}" "https://api.pushover.net/1/messages.json" | grep errors) if [ "${pushoversend}" ]; then - fn_print_fail "Sending Pushover alert: ${pushoversend}" + fn_print_fail_nl "Sending Pushover alert: ${pushoversend}" fn_script_log_fatal "Sending Pushover alert: ${pushoversend}" else - fn_print_ok "Sending Pushover alert" + fn_print_ok_nl "Sending Pushover alert" fn_script_log_pass "Sent Pushover alert" fi diff --git a/lgsm/functions/alert_slack.sh b/lgsm/functions/alert_slack.sh index aa3aa6636..582043f0c 100644 --- a/lgsm/functions/alert_slack.sh +++ b/lgsm/functions/alert_slack.sh @@ -72,9 +72,9 @@ fn_print_dots "Sending Slack alert" slacksend=$(curl -sSL -H "Content-Type: application/json" -X POST -d "$(echo -n "$json" | jq -c .)" "${slackwebhook}") if [ "${slacksend}" == "ok" ]; then - fn_print_ok "Sending Slack alert" + fn_print_ok_nl "Sending Slack alert" fn_script_log_pass "Sending Slack alert" else - fn_print_fail "Sending Slack alert: ${slacksend}" + fn_print_fail_nl "Sending Slack alert: ${slacksend}" fn_script_log_fatal "Sending Slack alert: ${slacksend}" fi diff --git a/lgsm/functions/alert_telegram.sh b/lgsm/functions/alert_telegram.sh index f868430de..6d7403660 100644 --- a/lgsm/functions/alert_telegram.sh +++ b/lgsm/functions/alert_telegram.sh @@ -21,9 +21,9 @@ fn_print_dots "Sending Telegram alert" telegramsend=$(curl -sSL -H "Content-Type: application/json" -X POST -d """${json}""" "https://api.telegram.org/bot${telegramtoken}/sendMessage" "${curlcustomstring}" | grep "error_code") if [ "${telegramsend}" ]; then - fn_print_fail "Sending Telegram alert: ${telegramsend}" + fn_print_fail_nl "Sending Telegram alert: ${telegramsend}" fn_script_log_fatal "Sending Telegram alert: ${telegramsend}" else - fn_print_ok "Sending Telegram alert" + fn_print_ok_nl "Sending Telegram alert" fn_script_log_pass "Sent Telegram alert" fi diff --git a/lgsm/functions/check_deps.sh b/lgsm/functions/check_deps.sh index 2a8c82ed9..f4499a587 100644 --- a/lgsm/functions/check_deps.sh +++ b/lgsm/functions/check_deps.sh @@ -273,11 +273,11 @@ fn_found_missing_deps(){ if [ "${steamcmdfail}" ]; then echo -e "" if [ "${function_selfname}" == "command_install.sh" ]; then - fn_print_failure "Missing dependencies required to run SteamCMD." + fn_print_failure_nl "Missing dependencies required to run SteamCMD." fn_script_log_fatal "Missing dependencies required to run SteamCMD." core_exit.sh else - fn_print_error "Missing dependencies required to run SteamCMD." + fn_print_error_nl "Missing dependencies required to run SteamCMD." fn_script_log_error "Missing dependencies required to run SteamCMD." fi fi @@ -299,11 +299,11 @@ fn_found_missing_deps(){ if [ "${steamcmdfail}" ]; then echo -e "" if [ "${function_selfname}" == "command_install.sh" ]; then - fn_print_failure "Missing dependencies required to run SteamCMD." + fn_print_failure_nl "Missing dependencies required to run SteamCMD." fn_script_log_fatal "Missing dependencies required to run SteamCMD." core_exit.sh else - fn_print_error "Missing dependencies required to run SteamCMD." + fn_print_error_nl "Missing dependencies required to run SteamCMD." fn_script_log_error "Missing dependencies required to run SteamCMD." fi fi diff --git a/lgsm/functions/check_ip.sh b/lgsm/functions/check_ip.sh index b89a38f07..b421639d3 100644 --- a/lgsm/functions/check_ip.sh +++ b/lgsm/functions/check_ip.sh @@ -80,7 +80,7 @@ if [ "${travistest}" != "1" ]; then core_exit.sh fi else - fn_print_info "Check IP: ${getip}" + fn_print_info_nl "Check IP: ${getip}" fn_script_log_info "IP automatically set as: ${getip}" ip="${getip}" fi diff --git a/lgsm/functions/command_backup.sh b/lgsm/functions/command_backup.sh index 6c195f875..724954a2d 100644 --- a/lgsm/functions/command_backup.sh +++ b/lgsm/functions/command_backup.sh @@ -43,9 +43,9 @@ fn_backup_init(){ info_distro.sh fn_print_dots "Backup starting" fn_script_log_info "Backup starting" - fn_print_ok "Backup starting" + fn_print_ok_nl "Backup starting" if [ ! -d "${backupdir}" ]||[ "${backupcount}" == "0" ]; then - fn_print_info "There are no previous backups" + fn_print_info_nl "There are no previous backups" else if [ "${lastbackupdaysago}" == "0" ]; then daysago="less than 1 day ago" @@ -54,7 +54,6 @@ fn_backup_init(){ else daysago="${lastbackupdaysago} days ago" fi - echo -en "\n" echo -e "* Previous backup was created ${daysago}, total size ${lastbackupsize}" fi } @@ -74,8 +73,7 @@ fn_backup_stop_server(){ fn_script_log_warn "Although unlikely; creating a backup while ${selfname} is running might corrupt the backup" # Server is running and will be stopped if stoponbackup=on or unset. else - fn_print_warn "${selfname} will be stopped during the backup" - fn_script_log_warn "${selfname} will be stopped during the backup" + fn_stop_warning serverstopped="yes" exitbypass=1 command_stop.sh @@ -135,7 +133,7 @@ fn_backup_compression(){ # Check that excludedir is a valid path. if [ ! -d "${excludedir}" ] ; then - fn_print_fail "Problem identifying the previous backup directory for exclusion." + fn_print_fail_nl "Problem identifying the previous backup directory for exclusion." fn_script_log_fatal "Problem identifying the previous backup directory for exclusion" core_exit.sh fi @@ -146,11 +144,11 @@ fn_backup_compression(){ fn_print_fail_eol fn_script_log_fatal "Backup in progress: FAIL" echo -e "${tarcmd}" | tee -a "${lgsmlog}" - fn_print_fail "Starting backup" + fn_print_fail_nl "Starting backup" fn_script_log_fatal "Starting backup" else fn_print_ok_eol - fn_print_ok "Completed: ${backupname}.tar.gz, total size $(du -sh "${backupdir}/${backupname}.tar.gz" | awk '{print $1}')" + fn_print_ok_nl "Completed: ${backupname}.tar.gz, total size $(du -sh "${backupdir}/${backupname}.tar.gz" | awk '{print $1}')" fn_script_log_pass "Backup created: ${backupname}.tar.gz, total size $(du -sh "${backupdir}/${backupname}.tar.gz" | awk '{print $1}')" fi # Remove lock file @@ -171,7 +169,7 @@ fn_backup_prune(){ if [ "${backupquotadiff}" -gt "0" ]||[ "${backupsoudatedcount}" -gt "0" ]; then fn_print_dots "Pruning" fn_script_log_info "Backup pruning activated" - fn_print_ok "Pruning" + fn_print_ok_nl "Pruning" # If maxbackups greater or equal to backupsoutdatedcount, then it is over maxbackupdays. if [ "${backupquotadiff}" -ge "${backupsoudatedcount}" ]; then # Display how many backups will be cleared. @@ -182,7 +180,7 @@ fn_backup_prune(){ fn_script_log_info "Pruning: Clearing ${backupquotadiff} backup(s)" # Clear backups over quota. find "${backupdir}"/ -type f -name "*.tar.gz" -printf '%T@ %p\n' | sort -rn | tail -${backupquotadiff} | cut -f2- -d" " | xargs rm - fn_print_ok "Pruning: Clearing ${backupquotadiff} backup(s)" + fn_print_ok_nl "Pruning: Clearing ${backupquotadiff} backup(s)" fn_script_log_pass "Pruning: Cleared ${backupquotadiff} backup(s)" # If maxbackupdays is used over maxbackups. elif [ "${backupquotadiff}" -lt "${backupsoudatedcount}" ]; then @@ -194,7 +192,7 @@ fn_backup_prune(){ fn_script_log_info "Pruning: Clearing ${backupquotadiff} backup(s)" # Clear backups over quota find "${backupdir}"/ -type f -mtime +"${maxbackupdays}" -exec rm -f {} \; - fn_print_ok "Pruning: Clearing ${backupquotadiff} backup(s)" + fn_print_ok_nl "Pruning: Clearing ${backupquotadiff} backup(s)" fn_script_log_pass "Pruning: Cleared ${backupquotadiff} backup(s)" fi fi @@ -202,11 +200,9 @@ fn_backup_prune(){ } fn_backup_relpath() { - # Written by CedarLUG as a "realpath --relative-to" alternative in bash. - + # Written by CedarLUG as a "realpath --relative-to" alternative in bash. # Populate an array of tokens initialized from the rootdir components. - declare -a rdirtoks=($(readlink -f "${rootdir}" | sed "s/\// /g")) - + declare -a rdirtoks=($(readlink -f "${rootdir}" | sed "s/\// /g")) if [ ${#rdirtoks[@]} -eq 0 ]; then fn_print_fail_nl "Problem assessing rootdir during relative path assessment" fn_script_log_fatal "Problem assessing rootdir during relative path assessment: ${rootdir}" @@ -214,7 +210,7 @@ fn_backup_relpath() { fi # Populate an array of tokens initialized from the backupdir components. - declare -a bdirtoks=($(readlink -f "${backupdir}" | sed "s/\// /g")) + declare -a bdirtoks=($(readlink -f "${backupdir}" | sed "s/\// /g")) if [ ${#bdirtoks[@]} -eq 0 ]; then fn_print_fail_nl "Problem assessing backupdir during relative path assessment" fn_script_log_fatal "Problem assessing backupdir during relative path assessment: ${rootdir}" @@ -223,31 +219,46 @@ fn_backup_relpath() { # Compare the leading entries of each array. These common elements will be clipped off. # for the relative path output. - for ((base=0; base<${#rdirtoks[@]}; base++)) - do - [[ "${rdirtoks[$base]}" != "${bdirtoks[$base]}" ]] && break - done + for ((base=0; base<${#rdirtoks[@]}; base++)) + do + [[ "${rdirtoks[$base]}" != "${bdirtoks[$base]}" ]] && break + done # Next, climb out of the remaining rootdir location with updir references. - for ((x=base;x<${#rdirtoks[@]};x++)) - do - echo -n "../" - done + for ((x=base;x<${#rdirtoks[@]};x++)) + do + echo -n "../" + done # Climb down the remaining components of the backupdir location. - for ((x=base;x<$(( ${#bdirtoks[@]} - 1 ));x++)) - do - echo -n "${bdirtoks[$x]}/" - done + for ((x=base;x<$(( ${#bdirtoks[@]} - 1 ));x++)) + do + echo -n "${bdirtoks[$x]}/" + done # In the event there were no directories left in the backupdir above to # traverse down, just add a newline. Otherwise at this point, there is # one remaining directory component in the backupdir to navigate. - if (( "$base" < "${#bdirtoks[@]}" )) ; then - echo -e "${bdirtoks[ $(( ${#bdirtoks[@]} - 1)) ]}" - else - echo + if (( "$base" < "${#bdirtoks[@]}" )) ; then + echo -e "${bdirtoks[ $(( ${#bdirtoks[@]} - 1)) ]}" + else + echo + fi +} + +fn_stop_warning(){ + fn_print_warn "Updating server: SteamCMD: ${selfname} will be stopped during backup" + fn_script_log_warn "Updating server: SteamCMD: ${selfname} will be stopped during backup" + totalseconds=3 + for seconds in {3..1}; do + fn_print_warn "Updating server: SteamCMD: ${selfname} will be stopped during backup: ${totalseconds}" + totalseconds=$((totalseconds - 1)) + sleep 1 + if [ "${seconds}" == "0" ]; then + break fi + done + fn_print_warn_nl "Updating server: SteamCMD: ${selfname} will be stopped during backup" } # Restart the server if it was stopped for the backup. diff --git a/lgsm/functions/command_debug.sh b/lgsm/functions/command_debug.sh index f3e2a0cc1..1427403ec 100644 --- a/lgsm/functions/command_debug.sh +++ b/lgsm/functions/command_debug.sh @@ -62,14 +62,6 @@ if [ "${extip}" ]; then echo -e "${lightblue}Internet IP:\t${default}${extip}:${port}" fi fi -# Listed on Master Server. -if [ "${displaymasterserver}" ]; then - if [ "${displaymasterserver}" == "true" ]; then - echo -e "${lightblue}Master Server:\t${green}${displaymasterserver}${default}" - else - echo -e "${lightblue}Master Server:\t${red}${displaymasterserver}${default}" - fi -fi # Server password. if [ "${serverpassword}" ]; then echo -e "${lightblue}Server password:\t${default}${serverpassword}" diff --git a/lgsm/functions/command_monitor.sh b/lgsm/functions/command_monitor.sh index a70d185ed..ae7d25388 100644 --- a/lgsm/functions/command_monitor.sh +++ b/lgsm/functions/command_monitor.sh @@ -21,7 +21,7 @@ fn_monitor_check_lockfile(){ fn_print_error_eol_nl fn_script_log_error "Checking lockfile: No lockfile found: ERROR" fn_sleep_time - echo -e "* Start ${selfname} to run monitor." + echo -en "* Start ${selfname} to run monitor." core_exit.sh fi diff --git a/lgsm/functions/command_postdetails.sh b/lgsm/functions/command_postdetails.sh index 12554565f..e6cbcba60 100644 --- a/lgsm/functions/command_postdetails.sh +++ b/lgsm/functions/command_postdetails.sh @@ -78,7 +78,7 @@ else fi if [ "${posttarget}" == "http://pastebin.com" ] ; then - fn_print_dots "Posting details to pastbin.com for ${postexpire}" + fn_print_dots "pastbin.com for ${postexpire}" # grab the return from 'value' from an initial visit to pastebin. csrftoken=$(curl -s "${posttarget}" | sed -n 's/^.*input type="hidden" name="csrf_token_post" value="\(.*\)".*$/\1/p') @@ -93,23 +93,26 @@ if [ "${posttarget}" == "http://pastebin.com" ] ; then awk '/^location: / { print $2 }' | sed "s/\n//g") # Output the resulting link. - fn_print_ok_nl "Posting details to pastbin.com for ${postexpire}" + fn_print_ok_nl "pastbin.com for ${postexpire}" pdurl="${posttarget}${link}" + echo -e "" echo -e " Please share the following url for support: ${pdurl}" elif [ "${posttarget}" == "https://hastebin.com" ] ; then - fn_print_dots "Posting details to hastebin.com" + fn_print_dots "hastebin.com" # 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 "$(<${postdetailslog})" "${posttarget}/documents" | cut -d\" -f4) - fn_print_ok_nl "Posting details to hastebin.com for ${postexpire}" + fn_print_ok_nl "hastebin.com for ${postexpire}" pdurl="${posttarget}/${link}" + echo -e "" echo -e "Please share the following url for support: ${pdurl}" elif [ "${posttarget}" == "https://termbin.com" ] ; then - fn_print_dots "Posting details to termbin.com" + fn_print_dots "termbin.com" link=$(cat "${postdetailslog}" | nc termbin.com 9999 | tr -d '\n\0') - fn_print_ok_nl "Posting details to termbin.com" + fn_print_ok_nl "termbin.com" pdurl="${link}" + echo -e "" echo -e "Please share the following url for support: " echo -e "${pdurl}" else diff --git a/lgsm/functions/command_start.sh b/lgsm/functions/command_start.sh index 8f60a7314..bf5c65146 100644 --- a/lgsm/functions/command_start.sh +++ b/lgsm/functions/command_start.sh @@ -170,7 +170,7 @@ fn_print_dots "${servername}" # Is the server already started. # $status comes from check_status.sh, which is run by check.sh for this command if [ "${status}" != "0" ]; then - fn_print_info "${servername} is already running" + fn_print_info_nl "${servername} is already running" fn_script_log_error "${servername} is already running" if [ -z "${exitbypass}" ]; then core_exit.sh diff --git a/lgsm/functions/command_stop.sh b/lgsm/functions/command_stop.sh index c7c6ebf3b..40e3f92e3 100644 --- a/lgsm/functions/command_stop.sh +++ b/lgsm/functions/command_stop.sh @@ -211,7 +211,7 @@ fn_stop_tmux(){ fn_sleep_time check_status.sh if [ "${status}" == "0" ]; then - fn_print_ok "${servername}" + fn_print_ok_nl "${servername}" fn_script_log_pass "Stopped ${servername}" else fn_print_fail_nl "Unable to stop ${servername}" diff --git a/lgsm/functions/command_test_alert.sh b/lgsm/functions/command_test_alert.sh index 3bc975949..77ff0d079 100644 --- a/lgsm/functions/command_test_alert.sh +++ b/lgsm/functions/command_test_alert.sh @@ -13,4 +13,5 @@ check.sh info_config.sh alert="test" alert.sh + core_exit.sh diff --git a/lgsm/functions/command_validate.sh b/lgsm/functions/command_validate.sh index 6764831f4..6c0684a3b 100644 --- a/lgsm/functions/command_validate.sh +++ b/lgsm/functions/command_validate.sh @@ -8,13 +8,20 @@ local modulename="VALIDATE" local commandaction="Validate" local function_selfname=$(basename "$(readlink -f "${BASH_SOURCE[0]}")") -fn_validation(){ - fn_print_info "Validating files: SteamCMD" - echo -e "" - echo -e "* Validating may overwrite some customised files." - echo -e "* https://docs.linuxgsm.com/commands/validate" - fn_script_log_info "Validating files: SteamCMD" - sleep 3 +fn_validate(){ + fn_script_log_warn "Validating server: SteamCMD: Validate might overwrite some customised files" + totalseconds=3 + for seconds in {3..1}; do + fn_print_warn "Validating server: SteamCMD: Validate might overwrite some customised files: ${totalseconds}" + totalseconds=$((totalseconds - 1)) + sleep 1 + if [ "${seconds}" == "0" ]; then + break + fi + done + fn_print_warn_nl "Validating server: SteamCMD: Validate might overwrite some customised files" + fn_print_start_nl "Validating server: SteamCMD" + fn_script_log_info "Validating server: SteamCMD" if [ -d "${steamcmddir}" ]; then cd "${steamcmddir}" || exit fi @@ -29,29 +36,44 @@ fn_validation(){ else ${unbuffer} ${steamcmdcommand} +login "${steamuser}" "${steampass}" +force_install_dir "${serverfiles}" +app_update "${appid}" -beta "${branch}" validate +quit | tee -a "${lgsmlog}" fi - if [ $? != 0 ]; then - fn_print_fail "Validating files: SteamCMD" - fn_script_log_fatal "Validating files: SteamCMD: FAIL" + exitcode=$? + fn_print_dots "Validating server: SteamCMD" + if [ "${exitcode}" != "0" ]; then + fn_print_fail_nl "Validating server: SteamCMD" + fn_script_log_fatal "Validating server: SteamCMD: FAIL" else - fn_print_ok "Validating files: SteamCMD" - fn_script_log_pass "Validating files: SteamCMD: OK" + fn_print_ok_nl "Validating server: SteamCMD" + fn_script_log_pass "Validating server: SteamCMD: OK" fi - fix.sh + core_exit.sh +} +fn_stop_warning(){ + fn_print_warn "Validating server: SteamCMD: ${selfname} will be stopped during validation" + fn_script_log_warn "Validating server: SteamCMD: ${selfname} will be stopped during validation" + totalseconds=3 + for seconds in {3..1}; do + fn_print_warn "Validating server: SteamCMD: ${selfname} will be stopped during validation: ${totalseconds}" + totalseconds=$((totalseconds - 1)) + sleep 1 + if [ "${seconds}" == "0" ]; then + break + fi + done + fn_print_warn_nl "Validating server: SteamCMD: ${selfname} will be stopped during validation" } -fn_print_dots "Validating files:" -fn_print_dots "Validating files: SteamCMD" +fn_print_dots "Validating server" +fn_print_dots "Validating server: SteamCMD" check.sh check_status.sh if [ "${status}" != "0" ]; then + fn_stop_warning exitbypass=1 command_stop.sh - fn_validation "${appid}" + fn_validate exitbypass=1 command_start.sh else - fn_validation + fn_validate fi - -core_exit.sh diff --git a/lgsm/functions/core_getopt.sh b/lgsm/functions/core_getopt.sh index 7216dc765..477cd59fc 100644 --- a/lgsm/functions/core_getopt.sh +++ b/lgsm/functions/core_getopt.sh @@ -15,7 +15,7 @@ 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 server information." ) -cmd_postdetails=( "pd;postdetails" "command_postdetails.sh" "Post details to hastebin (removing passwords)." ) +cmd_postdetails=( "pd;postdetails" "command_postdetails.sh" "Post details to termbin.com (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" "Check and apply any LinuxGSM updates." ) cmd_test_alert=( "ta;test-alert" "command_test_alert.sh" "Send a test alert." ) diff --git a/lgsm/functions/core_messages.sh b/lgsm/functions/core_messages.sh index 71c6eff8b..da90ebc43 100644 --- a/lgsm/functions/core_messages.sh +++ b/lgsm/functions/core_messages.sh @@ -149,9 +149,9 @@ fn_print_ok(){ fn_print_ok_nl(){ if [ "${commandaction}" ]; then - echo -e "${creeol}[${green} OK ${default}] ${commandaction} ${selfname}: $*" + echo -en "${creeol}[${green} OK ${default}] ${commandaction} ${selfname}: $*" else - echo -e "${creeol}[${green} OK ${default}] $*" + echo -en "${creeol}[${green} OK ${default}] $*" fi fn_sleep_time echo -en "\n" @@ -169,9 +169,9 @@ fn_print_fail(){ fn_print_fail_nl(){ if [ "${commandaction}" ]; then - echo -e "${creeol}[${red} FAIL ${default}] ${commandaction} ${selfname}: $*" + echo -en "${creeol}[${red} FAIL ${default}] ${commandaction} ${selfname}: $*" else - echo -e "${creeol}[${red} FAIL ${default}] $*" + echo -en "${creeol}[${red} FAIL ${default}] $*" fi fn_sleep_time echo -en "\n" @@ -180,18 +180,18 @@ fn_print_fail_nl(){ # [ ERROR ] fn_print_error(){ if [ "${commandaction}" ]; then - echo -en "${creeol}[${red}ERROR ${default}] ${commandaction} ${selfname}: $*" + echo -en "${creeol}[${red} ERROR ${default}] ${commandaction} ${selfname}: $*" else - echo -en "${creeol}[${red}ERROR ${default}] $*" + echo -en "${creeol}[${red} ERROR ${default}] $*" fi fn_sleep_time } fn_print_error_nl(){ if [ "${commandaction}" ]; then - echo -e "${creeol}[${red}ERROR ${default}] ${commandaction} ${selfname}: $*" + echo -en "${creeol}[${red} ERROR ${default}] ${commandaction} ${selfname}: $*" else - echo -e "${creeol}[${red}ERROR ${default}] $*" + echo -en "${creeol}[${red} ERROR ${default}] $*" fi fn_sleep_time echo -en "\n" @@ -209,9 +209,9 @@ fn_print_warn(){ fn_print_warn_nl(){ if [ "${commandaction}" ]; then - echo -e "${creeol}[${lightyellow} WARN ${default}] ${commandaction} ${selfname}: $*" + echo -en "${creeol}[${lightyellow} WARN ${default}] ${commandaction} ${selfname}: $*" else - echo -e "${creeol}[${lightyellow} WARN ${default}] $*" + echo -en "${creeol}[${lightyellow} WARN ${default}] $*" fi fn_sleep_time echo -en "\n" @@ -229,9 +229,29 @@ fn_print_info(){ fn_print_info_nl(){ if [ "${commandaction}" ]; then - echo -e "${creeol}[${cyan} INFO ${default}] ${commandaction} ${selfname}: $*" + echo -en "${creeol}[${cyan} INFO ${default}] ${commandaction} ${selfname}: $*" + else + echo -en "${creeol}[${cyan} INFO ${default}] $*" + fi + fn_sleep_time + echo -en "\n" +} + +# [ START ] +fn_print_start(){ + if [ "${commandaction}" ]; then + echo -en "${creeol}[${lightgreen} START ${default}] ${commandaction} ${selfname}: $*" + else + echo -en "${creeol}[${lightgreen} START ${default}] $*" + fi + fn_sleep_time +} + +fn_print_start_nl(){ + if [ "${commandaction}" ]; then + echo -en "${creeol}[${lightgreen} START ${default}] ${commandaction} ${selfname}: $*" else - echo -e "${creeol}[${cyan} INFO ${default}] $*" + echo -en "${creeol}[${lightgreen} START ${default}] $*" fi fn_sleep_time echo -en "\n" diff --git a/lgsm/functions/fix.sh b/lgsm/functions/fix.sh index 7533590de..3b5a58965 100644 --- a/lgsm/functions/fix.sh +++ b/lgsm/functions/fix.sh @@ -17,7 +17,7 @@ fn_fix_msg_start(){ fn_fix_msg_start_nl(){ fn_print_dots "Applying ${fixname} fix: ${gamename}" - fn_print_info_nl "Applying ${fixname} fix: ${gamename}" + fn_print_info "Applying ${fixname} fix: ${gamename}" fn_script_log_info "Applying ${fixname} fix: ${gamename}" } diff --git a/lgsm/functions/update_factorio.sh b/lgsm/functions/update_factorio.sh index 6d520bacf..c6a0383ab 100644 --- a/lgsm/functions/update_factorio.sh +++ b/lgsm/functions/update_factorio.sh @@ -27,7 +27,7 @@ fn_update_factorio_dl(){ fn_update_factorio_localbuild(){ # Gets local build info. - fn_print_dots "Checking for update: ${remotelocation}: checking local build" + fn_print_dots "Checking local build: ${remotelocation}" # Uses executable to find local build. cd "${executabledir}" || exit if [ -f "${executable}" ]; then @@ -45,14 +45,14 @@ fn_update_factorio_remotebuild(){ # Gets remote build info. remotebuild=$(curl -s "https://factorio.com/get-download/${downloadbranch}/headless/${factorioarch}" | grep -o '[0-9]\.[0-9]\{1,\}\.[0-9]\{1,\}' | head -1) if [ "${installer}" != "1" ]; then - fn_print_dots "Checking for update: ${remotelocation}: checking remote build" + fn_print_dots "Checking remote build: ${remotelocation}" # Checks if remotebuild variable has been set. if [ -z "${remotebuild}" ]||[ "${remotebuild}" == "null" ]; then - fn_print_fail "Checking for update: ${remotelocation}: checking remote build" + fn_print_fail "Checking remote build: ${remotelocation}" fn_script_log_fatal "Checking remote build" core_exit.sh else - fn_print_ok "Checking for update: ${remotelocation}: checking remote build" + fn_print_ok "Checking remote build: ${remotelocation}" fn_script_log_pass "Checking remote build" fi else @@ -68,14 +68,16 @@ fn_update_factorio_remotebuild(){ fn_update_factorio_compare(){ fn_print_dots "Checking for update: ${remotelocation}" # Removes dots so if statement can compare version numbers. + fn_print_dots "Checking for update: ${remotelocation}" localbuilddigit=$(echo -e "${localbuild}" | tr -cd '[:digit:]') remotebuilddigit=$(echo -e "${remotebuild}" | tr -cd '[:digit:]') if [ "${localbuilddigit}" -ne "${remotebuilddigit}" ]||[ "${forceupdate}" == "1" ]; then fn_print_ok_nl "Checking for update: ${remotelocation}" + echo -en "\n" echo -e "Update available" echo -e "* Local build: ${red}${localbuild} ${factorioarch}${default}" echo -e "* Remote build: ${green}${remotebuild} ${factorioarch}${default}" - if [ -v "${branch}" ]; then + if [ -n "${branch}" ]; then echo -e "* Branch: ${branch}" fi fn_script_log_info "Update available" @@ -85,18 +87,8 @@ fn_update_factorio_compare(){ fn_script_log_info "Branch: ${branch}" fi fn_script_log_info "${localbuild} > ${remotebuild}" - fn_sleep_time - echo -en "\n" - echo -en "applying update.\r" - sleep 1 - echo -en "applying update..\r" - sleep 1 - echo -en "applying update...\r" - sleep 1 - echo -en "\n" unset updateonstart - check_status.sh # If server stopped. if [ "${status}" == "0" ]; then @@ -108,6 +100,7 @@ fn_update_factorio_compare(){ command_stop.sh # If server started. else + fn_stop_warning exitbypass=1 command_stop.sh exitbypass=1 @@ -119,6 +112,7 @@ fn_update_factorio_compare(){ alert.sh else fn_print_ok_nl "Checking for update: ${remotelocation}" + echo -en "\n" echo -e "No update available" echo -e "* Local build: ${green}${localbuild} ${factorioarch}${default}" echo -e "* Remote build: ${green}${remotebuild} ${factorioarch}${default}" @@ -134,6 +128,21 @@ fn_update_factorio_compare(){ fi } +fn_stop_warning(){ + fn_print_warn "Updating server: SteamCMD: ${selfname} will be stopped during update" + fn_script_log_warn "Updating server: SteamCMD: ${selfname} will be stopped during update" + totalseconds=3 + for seconds in {3..1}; do + fn_print_warn "Updating server: SteamCMD: ${selfname} will be stopped during update: ${totalseconds}" + totalseconds=$((totalseconds - 1)) + sleep 1 + if [ "${seconds}" == "0" ]; then + break + fi + done + fn_print_warn_nl "Updating server: SteamCMD: ${selfname} will be stopped during update" +} + # The location where the builds are checked and downloaded. remotelocation="factorio.com" diff --git a/lgsm/functions/update_minecraft.sh b/lgsm/functions/update_minecraft.sh index d404cb046..f24d44df8 100644 --- a/lgsm/functions/update_minecraft.sh +++ b/lgsm/functions/update_minecraft.sh @@ -34,14 +34,14 @@ fn_update_minecraft_dl(){ fn_update_minecraft_localbuild(){ # Gets local build info. - fn_print_dots "Checking for update: ${remotelocation}: checking local build" + fn_print_dots "Checking local build: ${remotelocation}" # Uses log file to gather info. # Gives time for log file to generate. if [ ! -f "${serverfiles}/logs/latest.log" ]; then - fn_print_error "Checking for update: ${remotelocation}: checking local build" - fn_print_error_nl "Checking for update: ${remotelocation}: checking local build: no log files" - fn_script_log_error "No log file found" - fn_print_info_nl "Checking for update: ${remotelocation}: checking local build: forcing server restart" + fn_print_error "Checking local build: ${remotelocation}" + fn_print_error_nl "Checking local build: ${remotelocation}: no log files containing version info" + fn_print_info_nl "Checking local build: ${remotelocation}: forcing server restart" + fn_script_log_error "No log files containing version info" fn_script_log_info "Forcing server restart" exitbypass=1 command_stop.sh @@ -51,7 +51,7 @@ fn_update_minecraft_localbuild(){ # Check again, allow time to generate logs. while [ ! -f "${serverfiles}/logs/latest.log" ]; do sleep 1 - fn_print_info "Checking for update: ${remotelocation}: checking local build: waiting for log file: ${totalseconds}" + fn_print_info "Checking local build: ${remotelocation}: waiting for log file: ${totalseconds}" if [ -v "${loopignore}" ]; then loopignore=1 fn_script_log_info "Waiting for log file to generate" @@ -59,7 +59,7 @@ fn_update_minecraft_localbuild(){ if [ "${totalseconds}" -gt "120" ]; then localbuild="0" - fn_print_error "Checking for update: ${remotelocation}: waiting for log file: missing log file" + fn_print_error "Checking local build: ${remotelocation}: waiting for log file: missing log file" fn_script_log_error "Missing log file" fn_script_log_error "Set localbuild to 0" fi @@ -76,7 +76,7 @@ fn_update_minecraft_localbuild(){ # Gives time for var to generate. totalseconds=0 for seconds in {1..120}; do - fn_print_info "Checking for update: ${remotelocation}: checking local build: waiting for local build: ${totalseconds}" + fn_print_info "Checking local build: ${remotelocation}: waiting for local build: ${totalseconds}" if [ -z "${loopignore}" ]; then loopignore=1 fn_script_log_info "Waiting for local build to generate" @@ -92,11 +92,11 @@ fn_update_minecraft_localbuild(){ if [ -z "${localbuild}" ]; then localbuild="0" - fn_print_error "Checking for update: ${remotelocation}: waiting for local build: missing local build info" + fn_print_error "Checking local build: ${remotelocation}: waiting for local build: missing local build info" fn_script_log_error "Missing local build info" fn_script_log_error "Set localbuild to 0" else - fn_print_ok "Checking for update: ${remotelocation}: checking local build" + fn_print_ok "Checking local build: ${remotelocation}" fn_script_log_pass "Checking local build" fi } @@ -110,14 +110,14 @@ fn_update_minecraft_remotebuild(){ fi if [ "${installer}" != "1" ]; then - fn_print_dots "Checking for update: ${remotelocation}: checking remote build" + fn_print_dots "Checking remote build: ${remotelocation}" # Checks if remotebuild variable has been set. if [ -z "${remotebuild}" ]||[ "${remotebuild}" == "null" ]; then - fn_print_fail "Checking for update: ${remotelocation}: checking remote build" + fn_print_fail "Checking remote build: ${remotelocation}" fn_script_log_fatal "Checking remote build" core_exit.sh else - fn_print_ok "Checking for update: ${remotelocation}: checking remote build" + fn_print_ok "Checking remote build: ${remotelocation}" fn_script_log_pass "Checking remote build" fi else @@ -135,6 +135,7 @@ fn_update_minecraft_compare(){ fn_print_dots "Checking for update: ${remotelocation}" if [ "${localbuild}" != "${remotebuild}" ]||[ "${forceupdate}" == "1" ]; then fn_print_ok_nl "Checking for update: ${remotelocation}" + echo -en "\n" echo -e "Update available" echo -e "* Local build: ${red}${localbuild}${default}" echo -e "* Remote build: ${green}${remotebuild}${default}" @@ -145,18 +146,8 @@ fn_update_minecraft_compare(){ fn_script_log_info "Local build: ${localbuild}" fn_script_log_info "Remote build: ${remotebuild}" fn_script_log_info "${localbuild} > ${remotebuild}" - fn_sleep_time - echo -en "\n" - echo -en "applying update.\r" - sleep 1 - echo -en "applying update..\r" - sleep 1 - echo -en "applying update...\r" - sleep 1 - echo -en "\n" unset updateonstart - check_status.sh # If server stopped. if [ "${status}" == "0" ]; then @@ -168,6 +159,7 @@ fn_update_minecraft_compare(){ command_stop.sh # If server started. else + fn_stop_warning exitbypass=1 command_stop.sh exitbypass=1 @@ -179,6 +171,7 @@ fn_update_minecraft_compare(){ alert.sh else fn_print_ok_nl "Checking for update: ${remotelocation}" + echo -en "\n" echo -e "No update available" echo -e "* Local build: ${green}${localbuild}${default}" echo -e "* Remote build: ${green}${remotebuild}${default}" @@ -194,6 +187,21 @@ fn_update_minecraft_compare(){ fi } +fn_stop_warning(){ + fn_print_warn "Updating server: SteamCMD: ${selfname} will be stopped during update" + fn_script_log_warn "Updating server: SteamCMD: ${selfname} will be stopped during update" + totalseconds=3 + for seconds in {3..1}; do + fn_print_warn "Updating server: SteamCMD: ${selfname} will be stopped during update: ${totalseconds}" + totalseconds=$((totalseconds - 1)) + sleep 1 + if [ "${seconds}" == "0" ]; then + break + fi + done + fn_print_warn_nl "Updating server: SteamCMD: ${selfname} will be stopped during update" +} + # The location where the builds are checked and downloaded. remotelocation="mojang.com" diff --git a/lgsm/functions/update_minecraft_bedrock.sh b/lgsm/functions/update_minecraft_bedrock.sh index 2dadec7c2..57306f063 100644 --- a/lgsm/functions/update_minecraft_bedrock.sh +++ b/lgsm/functions/update_minecraft_bedrock.sh @@ -6,7 +6,7 @@ local modulename="UPDATE" local commandaction="Update" -local function_selfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" +local function_selfname=$(basename "$(readlink -f "${BASH_SOURCE[0]}")") fn_update_minecraft_dl(){ latestmcbuildurl=$(curl -s "https://www.minecraft.net/en-us/download/server/bedrock/" | grep -o 'https://minecraft.azureedge.net/bin-linux/[^"]*zip') @@ -32,43 +32,43 @@ fn_update_minecraft_dl(){ fn_update_minecraft_localbuild(){ # Gets local build info. - fn_print_dots "Checking for update: ${remotelocation}: checking local build" + fn_print_dots "Checking local build: ${remotelocation}" # Uses log file to gather info. # Log is generated and cleared on startup but filled on shutdown. - - localbuild=$(grep Version $(ls -tr "${consolelogdir}"/* 2>/dev/null) | tail -1 | sed 's/.*Version //') - + localbuild=$(grep Version "$(ls -tr "${consolelogdir}"/* 2>/dev/null)" | tail -1 | sed 's/.*Version //') if [ -z "${localbuild}" ]; then - fn_print_error "Checking for update: ${remotelocation}: checking local build" - fn_print_error_nl "Checking for update: ${remotelocation}: checking local build: no log files containing version info" + fn_print_error "Checking local build: ${remotelocation}" + fn_print_error_nl "Checking local build: ${remotelocation}: no log files containing version info" + fn_print_info_nl "Checking local build: ${remotelocation}: forcing server restart" fn_script_log_error "No log files containing version info" - fn_print_info_nl "Checking for update: ${remotelocation}: checking local build: forcing server restart" fn_script_log_info "Forcing server restart" check_status.sh - if [ "${status}" != "0" ]; then - exitbypass=1 - command_stop.sh - else + # If server stopped. + if [ "${status}" == "0" ]; then exitbypass=1 command_start.sh sleep 3 exitbypass=1 command_stop.sh + # If server started. + else + exitbypass=1 + command_stop.sh fi fi if [ -z "${localbuild}" ]; then - localbuild=$(grep Version $(ls -tr "${consolelogdir}"/* 2>/dev/null) | tail -1 | sed 's/.*Version //') + localbuild=$(grep Version "$(ls -tr "${consolelogdir}"/* 2>/dev/null)" | tail -1 | sed 's/.*Version //') fi if [ -z "${localbuild}" ]; then localbuild="0" - fn_print_error "Checking for update: ${remotelocation}: waiting for local build: missing local build info" + fn_print_error "Checking local build: ${remotelocation}: waiting for local build: missing local build info" fn_script_log_error "Missing local build info" fn_script_log_error "Set localbuild to 0" else - fn_print_ok "Checking for update: ${remotelocation}: checking local build" + fn_print_ok "Checking local build: ${remotelocation}: checking local build" fn_script_log_pass "Checking local build" fi } @@ -77,14 +77,14 @@ fn_update_minecraft_remotebuild(){ # Gets remote build info. remotebuild=$(curl -s "https://www.minecraft.net/en-us/download/server/bedrock/" | grep -o 'https://minecraft.azureedge.net/bin-linux/[^"]*' | sed 's/.*\///' | grep -Eo "[.0-9]+[0-9]") if [ "${installer}" != "1" ]; then - fn_print_dots "Checking for update: ${remotelocation}: checking remote build" + fn_print_dots "Checking remote build: ${remotelocation}" # Checks if remotebuild variable has been set. if [ -z "${remotebuild}" ]||[ "${remotebuild}" == "null" ]; then - fn_print_fail "Checking for update: ${remotelocation}: checking remote build" + fn_print_fail "Checking remote build: ${remotelocation}" fn_script_log_fatal "Checking remote build" core_exit.sh else - fn_print_ok "Checking for update: ${remotelocation}: checking remote build" + fn_print_ok "Checking remote build: ${remotelocation}" fn_script_log_pass "Checking remote build" fi else @@ -104,6 +104,7 @@ fn_update_minecraft_compare(){ remotebuilddigit=$(echo -e "${remotebuild}" | tr -cd '[:digit:]') if [ "${localbuilddigit}" -ne "${remotebuilddigit}" ]||[ "${forceupdate}" == "1" ]; then fn_print_ok_nl "Checking for update: ${remotelocation}" + echo -en "\n" echo -e "Update available" echo -e "* Local build: ${red}${localbuild}${default}" echo -e "* Remote build: ${green}${remotebuild}${default}" @@ -111,18 +112,8 @@ fn_update_minecraft_compare(){ fn_script_log_info "Local build: ${localbuild}" fn_script_log_info "Remote build: ${remotebuild}" fn_script_log_info "${localbuild} > ${remotebuild}" - fn_sleep_time - echo -en "\n" - echo -en "applying update.\r" - sleep 1 - echo -en "applying update..\r" - sleep 1 - echo -en "applying update...\r" - sleep 1 - echo -en "\n" unset updateonstart - check_status.sh # If server stopped. if [ "${status}" == "0" ]; then @@ -134,6 +125,7 @@ fn_update_minecraft_compare(){ command_stop.sh # If server started. else + fn_stop_warning exitbypass=1 command_stop.sh exitbypass=1 @@ -145,6 +137,7 @@ fn_update_minecraft_compare(){ alert.sh else fn_print_ok_nl "Checking for update: ${remotelocation}" + echo -en "\n" echo -e "No update available" echo -e "* Local build: ${green}${localbuild}${default}" echo -e "* Remote build: ${green}${remotebuild}${default}" @@ -154,6 +147,21 @@ fn_update_minecraft_compare(){ fi } +fn_stop_warning(){ + fn_print_warn "Updating server: SteamCMD: ${selfname} will be stopped during update" + fn_script_log_warn "Updating server: SteamCMD: ${selfname} will be stopped during update" + totalseconds=3 + for seconds in {3..1}; do + fn_print_warn "Updating server: SteamCMD: ${selfname} will be stopped during update: ${totalseconds}" + totalseconds=$((totalseconds - 1)) + sleep 1 + if [ "${seconds}" == "0" ]; then + break + fi + done + fn_print_warn_nl "Updating server: SteamCMD: ${selfname} will be stopped during update" +} + # The location where the builds are checked and downloaded. remotelocation="minecraft.net" @@ -161,7 +169,6 @@ if [ "${installer}" == "1" ]; then fn_update_minecraft_remotebuild fn_update_minecraft_dl else - check_status.sh fn_print_dots "Checking for update: ${remotelocation}" fn_script_log_info "Checking for update: ${remotelocation}" fn_update_minecraft_localbuild diff --git a/lgsm/functions/update_mta.sh b/lgsm/functions/update_mta.sh index da0d16fdb..1b8e5304d 100644 --- a/lgsm/functions/update_mta.sh +++ b/lgsm/functions/update_mta.sh @@ -29,14 +29,14 @@ fn_update_mta_dl(){ fn_update_mta_localbuild(){ # Gets local build info. - fn_print_dots "Checking for update: ${remotelocation}: checking local build" + fn_print_dots "Checking local build: ${remotelocation}" # Uses log file to gather info. # Gives time for log file to generate. if [ ! -f "${serverfiles}/mods/deathmatch/logs/server.log" ]; then - fn_print_error "Checking for update: ${remotelocation}: checking local build" - fn_print_error_nl "Checking for update: ${remotelocation}: checking local build: no log files" - fn_script_log_error "No log file found" - fn_print_info_nl "Checking for update: ${remotelocation}: checking local build: forcing server restart" + fn_print_error "Checking local build: ${remotelocation}" + fn_print_error_nl "Checking local build: ${remotelocation}: no log files containing version info" + fn_print_info_nl "Checking local build: ${remotelocation}: forcing server restart" + fn_script_log_error "No log files containing version info" fn_script_log_info "Forcing server restart" exitbypass=1 command_stop.sh @@ -46,7 +46,7 @@ fn_update_mta_localbuild(){ # Check again, allow time to generate logs. while [ ! -f "${serverfiles}/mods/deathmatch/logs/server.log" ]; do sleep 1 - fn_print_info "Checking for update: ${remotelocation}: checking local build: waiting for log file: ${totalseconds}" + fn_print_info "Checking local build: ${remotelocation}: waiting for log file: ${totalseconds}" if [ -v "${loopignore}" ]; then loopignore=1 fn_script_log_info "Waiting for log file to generate" @@ -54,7 +54,7 @@ fn_update_mta_localbuild(){ if [ "${totalseconds}" -gt "120" ]; then localbuild="0" - fn_print_error "Checking for update: ${remotelocation}: waiting for log file: missing log file" + fn_print_error "Checking local build: ${remotelocation}: waiting for log file: missing log file" fn_script_log_error "Missing log file" fn_script_log_error "Set localbuild to 0" fi @@ -69,10 +69,9 @@ fn_update_mta_localbuild(){ if [ -z "${localbuild}" ]; then # Gives time for var to generate. - end=$((SECONDS+120)) totalseconds=0 - while [ "${SECONDS}" -lt "${end}" ]; do - fn_print_info "Checking for update: ${remotelocation}: checking local build: waiting for local build: ${totalseconds}" + for seconds in {1..120}; do + fn_print_info "Checking local build: ${remotelocation}: waiting for local build: ${totalseconds}" if [ -z "${loopignore}" ]; then loopignore=1 fn_script_log_info "Waiting for local build to generate" @@ -88,11 +87,11 @@ fn_update_mta_localbuild(){ if [ -z "${localbuild}" ]; then localbuild="0" - fn_print_error "Checking for update: ${remotelocation}: waiting for local build: missing local build info" + fn_print_error "Checking local build: ${remotelocation}: waiting for local build: missing local build info" fn_script_log_error "Missing local build info" fn_script_log_error "Set localbuild to 0" else - fn_print_ok "Checking for update: ${remotelocation}: checking local build" + fn_print_ok "Checking local build: ${remotelocation}" fn_script_log_pass "Checking local build" fi } @@ -104,14 +103,14 @@ fn_update_mta_remotebuild(){ maintenanceversion=$(curl -s https://raw.githubusercontent.com/multitheftauto/mtasa-blue/master/Server/version.h | grep "#define MTASA_VERSION_MAINTENANCE" | awk '{ print $3 }' | sed 's/\r//g') remotebuild="${majorversion}.${minorversion}.${maintenanceversion}" if [ "${installer}" != "1" ]; then - fn_print_dots "Checking for update: ${remotelocation}: checking remote build" + fn_print_dots "Checking remote build: ${remotelocation}" # Checks if remotebuild variable has been set. if [ -z "${remotebuild}" ]||[ "${remotebuild}" == "null" ]; then - fn_print_fail "Checking for update: ${remotelocation}: checking remote build" + fn_print_fail "Checking remote build: ${remotelocation}" fn_script_log_fatal "Checking remote build" core_exit.sh else - fn_print_ok "Checking for update: ${remotelocation}: checking remote build" + fn_print_ok "Checking remote build: ${remotelocation}" fn_script_log_pass "Checking remote build" fi else @@ -145,18 +144,8 @@ fn_update_mta_compare(){ fn_script_log_info "Local build: ${localbuild}" fn_script_log_info "Remote build: ${remotebuild}" fn_script_log_info "${localbuild} > ${remotebuild}" - fn_sleep_time - echo -en "\n" - echo -en "applying update.\r" - sleep 1 - echo -en "applying update..\r" - sleep 1 - echo -en "applying update...\r" - sleep 1 - echo -en "\n" unset updateonstart - check_status.sh # If server stopped. if [ "${status}" == "0" ]; then @@ -168,6 +157,7 @@ fn_update_mta_compare(){ command_stop.sh # If server started. else + fn_stop_warning exitbypass=1 command_stop.sh exitbypass=1 @@ -179,6 +169,7 @@ fn_update_mta_compare(){ alert.sh else fn_print_ok_nl "Checking for update: ${remotelocation}" + echo -en "\n" echo -e "No update available" echo -e "* Local build: ${green}${localbuild}${default}" echo -e "* Remote build: ${green}${remotebuild}${default}" @@ -188,6 +179,21 @@ fn_update_mta_compare(){ fi } +fn_stop_warning(){ + fn_print_warn "Updating server: SteamCMD: ${selfname} will be stopped during update" + fn_script_log_warn "Updating server: SteamCMD: ${selfname} will be stopped during update" + totalseconds=3 + for seconds in {3..1}; do + fn_print_warn "Updating server: SteamCMD: ${selfname} will be stopped during update: ${totalseconds}" + totalseconds=$((totalseconds - 1)) + sleep 1 + if [ "${seconds}" == "0" ]; then + break + fi + done + fn_print_warn_nl "Updating server: SteamCMD: ${selfname} will be stopped during update" +} + # The location where the builds are checked and downloaded. remotelocation="linux.mtasa.com" diff --git a/lgsm/functions/update_mumble.sh b/lgsm/functions/update_mumble.sh index 097e3c158..7bbfb134b 100644 --- a/lgsm/functions/update_mumble.sh +++ b/lgsm/functions/update_mumble.sh @@ -27,16 +27,16 @@ fn_update_mumble_dl(){ fn_update_mumble_localbuild(){ # Gets local build info. - fn_print_dots "Checking for update: ${remotelocation}: checking local build" + fn_print_dots "Checking local build: ${remotelocation}" # Uses executable to find local build. cd "${executabledir}" || exit if [ -f "${executable}" ]; then localbuild=$(${executable} -version 2>&1 >/dev/null | awk '{print $5}') - fn_print_ok "Checking for update: ${remotelocation}: checking local build" + fn_print_ok "Checking local build: ${remotelocation}" fn_script_log_pass "Checking local build" else localbuild="0" - fn_print_error "Checking for update: ${remotelocation}: checking local build" + fn_print_error "Checking local build: ${remotelocation}" fn_script_log_error "Checking local build" fi } @@ -45,14 +45,14 @@ fn_update_mumble_remotebuild(){ # Gets remote build info. remotebuild=$(curl -s "https://api.github.com/repos/mumble-voip/mumble/releases/latest" | grep 'murmur-static_x86.*\.bz2"' | tail -1 | awk -F"/" '{ print $8 }') if [ "${installer}" != "1" ]; then - fn_print_dots "Checking for update: ${remotelocation}: checking remote build" + fn_print_dots "Checking remote build: ${remotelocation}" # Checks if remotebuild variable has been set. if [ -z "${remotebuild}" ]||[ "${remotebuild}" == "null" ]; then - fn_print_fail "Checking for update: ${remotelocation}: checking remote build" + fn_print_fail "Checking remote build: ${remotelocation}" fn_script_log_fatal "Checking remote build" core_exit.sh else - fn_print_ok "Checking for update: ${remotelocation}: checking remote build" + fn_print_ok "Checking remote build: ${remotelocation}" fn_script_log_pass "Checking remote build" fi else @@ -72,6 +72,7 @@ fn_update_mumble_compare(){ remotebuilddigit=$(echo -e "${remotebuild}" | tr -cd '[:digit:]') if [ "${localbuilddigit}" -ne "${remotebuilddigit}" ]||[ "${forceupdate}" == "1" ]; then fn_print_ok_nl "Checking for update: ${remotelocation}" + echo -en "\n" echo -e "Update available" echo -e "* Local build: ${red}${localbuild} ${mumblearch}${default}" echo -e "* Remote build: ${green}${remotebuild} ${mumblearch}${default}" @@ -79,18 +80,8 @@ fn_update_mumble_compare(){ fn_script_log_info "Local build: ${localbuild} ${mumblearch}" fn_script_log_info "Remote build: ${remotebuild} ${mumblearch}" fn_script_log_info "${localbuild} > ${remotebuild}" - fn_sleep_time - echo -en "\n" - echo -en "applying update.\r" - sleep 1 - echo -en "applying update..\r" - sleep 1 - echo -en "applying update...\r" - sleep 1 - echo -en "\n" unset updateonstart - check_status.sh # If server stopped. if [ "${status}" == "0" ]; then @@ -102,6 +93,7 @@ fn_update_mumble_compare(){ command_stop.sh # If server started. else + fn_stop_warning exitbypass=1 command_stop.sh exitbypass=1 @@ -113,6 +105,7 @@ fn_update_mumble_compare(){ alert.sh else fn_print_ok_nl "Checking for update: ${remotelocation}" + echo -en "\n" echo -e "No update available" echo -e "* Local build: ${green}${localbuild} ${mumblearch}${default}" echo -e "* Remote build: ${green}${remotebuild} ${mumblearch}${default}" @@ -122,6 +115,21 @@ fn_update_mumble_compare(){ fi } +fn_stop_warning(){ + fn_print_warn "Updating server: SteamCMD: ${selfname} will be stopped during update" + fn_script_log_warn "Updating server: SteamCMD: ${selfname} will be stopped during update" + totalseconds=3 + for seconds in {3..1}; do + fn_print_warn "Updating server: SteamCMD: ${selfname} will be stopped during update: ${totalseconds}" + totalseconds=$((totalseconds - 1)) + sleep 1 + if [ "${seconds}" == "0" ]; then + break + fi + done + fn_print_warn_nl "Updating server: SteamCMD: ${selfname} will be stopped during update" +} + # The location where the builds are checked and downloaded. remotelocation="mumble.info" diff --git a/lgsm/functions/update_steamcmd.sh b/lgsm/functions/update_steamcmd.sh index 17006a909..3715ff993 100644 --- a/lgsm/functions/update_steamcmd.sh +++ b/lgsm/functions/update_steamcmd.sh @@ -10,7 +10,6 @@ local function_selfname=$(basename "$(readlink -f "${BASH_SOURCE[0]}")") fn_update_steamcmd_dl(){ info_config.sh - # Detects if unbuffer command is available for 32 bit distributions only. info_distro.sh if [ "$(command -v stdbuf)" ]&&[ "${arch}" != "x86_64" ]; then @@ -29,7 +28,7 @@ fn_update_steamcmd_dl(){ fn_update_steamcmd_localbuild(){ # Gets local build info. - fn_print_dots "Checking for update: ${remotelocation}: checking local build" + fn_print_dots "Checking local build: ${remotelocation}" fn_appmanifest_check # Uses appmanifest to find local build. localbuild=$(grep buildid "${appmanifestfile}" | tr '[:blank:]"' ' ' | tr -s ' ' | cut -d\ -f3) @@ -46,7 +45,16 @@ fn_update_steamcmd_localbuild(){ else branchname="public" fi - fn_sleep_time + + # Checks if localbuild variable has been set. + if [ -z "${localbuild}" ]||[ "${localbuild}" == "null" ]; then + fn_print_fail "Checking local build: ${remotelocation}" + fn_script_log_fatal "Checking local build" + core_exit.sh + else + fn_print_ok "Checking local build: ${remotelocation}" + fn_script_log_pass "Checking local build" + fi } fn_update_steamcmd_remotebuild(){ @@ -56,14 +64,14 @@ fn_update_steamcmd_remotebuild(){ fi remotebuild=$(${steamcmdcommand} +login "${steamuser}" "${steampass}" +app_info_update 1 +app_info_print "${appid}" +quit | sed '1,/branches/d' | sed "1,/${branchname}/d" | grep -m 1 buildid | tr -cd '[:digit:]') if [ "${installer}" != "1" ]; then - fn_print_dots "Checking for update: ${remotelocation}: checking remote build" + fn_print_dots "Checking remote build: ${remotelocation}" # Checks if remotebuild variable has been set. if [ -z "${remotebuild}" ]||[ "${remotebuild}" == "null" ]; then - fn_print_fail "Checking for update: ${remotelocation}: checking remote build" + fn_print_fail "Checking remote build: ${remotelocation}" fn_script_log_fatal "Checking remote build" core_exit.sh else - fn_print_ok "Checking for update: ${remotelocation}: checking remote build" + fn_print_ok "Checking remote build: ${remotelocation}" fn_script_log_pass "Checking remote build" fi else @@ -80,6 +88,7 @@ fn_update_steamcmd_compare(){ fn_print_dots "Checking for update: ${remotelocation}" if [ "${localbuild}" != "${remotebuild}" ]; then fn_print_ok_nl "Checking for update: ${remotelocation}" + echo -en "\n" echo -e "Update available" echo -e "* Local build: ${red}${localbuild}${default}" echo -e "* Remote build: ${green}${remotebuild}${default}" @@ -94,24 +103,15 @@ fn_update_steamcmd_compare(){ fn_script_log_info "Branch: ${branch}" fi fn_script_log_info "${localbuild} > ${remotebuild}" - fn_sleep_time - echo -en "\n" - echo -en "applying update.\r" - sleep 1 - echo -en "applying update..\r" - sleep 1 - echo -en "applying update...\r" - sleep 1 - echo -en "\n" unset updateonstart - check_status.sh # If server stopped. if [ "${status}" == "0" ]; then fn_update_steamcmd_dl # If server started. else + fn_stop_warning exitbypass=1 command_stop.sh exitbypass=1 @@ -123,6 +123,7 @@ fn_update_steamcmd_compare(){ alert.sh else fn_print_ok_nl "Checking for update: ${remotelocation}" + echo -en "\n" echo -e "No update available" echo -e "* Local build: ${green}${localbuild}${default}" echo -e "* Remote build: ${green}${remotebuild}${default}" @@ -149,7 +150,6 @@ fn_appmanifest_check(){ # Multiple or no matching appmanifest files may sometimes be present. # This error is corrected if required. if [ "${appmanifestfilewc}" -ge "2" ]; then - fn_sleep_time fn_print_error "Multiple appmanifest_${appid}.acf files found" fn_script_log_error "Multiple appmanifest_${appid}.acf files found" fn_print_dots "Removing x${appmanifestfilewc} appmanifest_${appid}.acf files" @@ -158,10 +158,11 @@ fn_appmanifest_check(){ done appmanifestfilewc1="${appmanifestfilewc}" fn_appmanifest_info + # if error can not be resolved. if [ "${appmanifestfilewc}" -ge "2" ]; then fn_print_fail "Unable to remove x${appmanifestfilewc} appmanifest_${appid}.acf files" fn_script_log_fatal "Unable to remove x${appmanifestfilewc} appmanifest_${appid}.acf files" - echo -e " * Check user permissions" + echo -e "* Check user permissions" for appfile in ${appmanifestfile}; do echo -e " ${appfile}" done @@ -169,34 +170,48 @@ fn_appmanifest_check(){ else fn_print_ok "Removed x${appmanifestfilewc1} appmanifest_${appid}.acf files" fn_script_log_pass "Removed x${appmanifestfilewc1} appmanifest_${appid}.acf files" - fn_print_info "Forcing update to correct issue" + fn_print_info_nl "Forcing update to correct issue" fn_script_log_info "Forcing update to correct issue" fn_update_steamcmd_dl fi elif [ "${appmanifestfilewc}" -eq "0" ]; then - fn_print_error "No appmanifest_${appid}.acf found" + fn_print_error_nl "No appmanifest_${appid}.acf found" fn_script_log_error "No appmanifest_${appid}.acf found" - fn_print_info "Forcing update to correct issue" + fn_print_info_nl "Forcing update to correct issue" fn_script_log_info "Forcing update to correct issue" fn_update_steamcmd_dl fn_appmanifest_info if [ "${appmanifestfilewc}" -eq "0" ]; then - fn_print_fail "Still no appmanifest_${appid}.acf found" + fn_print_fail_nl "Still no appmanifest_${appid}.acf found" fn_script_log_fatal "Still no appmanifest_${appid}.acf found" core_exit.sh fi fi } +fn_stop_warning(){ + fn_print_warn "Updating server: SteamCMD: ${selfname} will be stopped during update" + fn_script_log_warn "Updating server: SteamCMD: ${selfname} will be stopped during update" + totalseconds=3 + for seconds in {3..1}; do + fn_print_warn "Updating server: SteamCMD: ${selfname} will be stopped during update: ${totalseconds}" + totalseconds=$((totalseconds - 1)) + sleep 1 + if [ "${seconds}" == "0" ]; then + break + fi + done + fn_print_warn_nl "Updating server: SteamCMD: ${selfname} will be stopped during update" +} + # The location where the builds are checked and downloaded. remotelocation="SteamCMD" - check.sh - if [ "${forceupdate}" == "1" ]; then # forceupdate bypasses update checks. check_status.sh if [ "${status}" != "0" ]; then + fn_stop_warning exitbypass=1 command_stop.sh fn_update_steamcmd_dl @@ -206,6 +221,8 @@ if [ "${forceupdate}" == "1" ]; then fn_update_steamcmd_dl fi else + fn_print_dots "Checking for update" + fn_print_dots "Checking for update: ${remotelocation}" fn_update_steamcmd_localbuild fn_update_steamcmd_remotebuild fn_update_steamcmd_compare diff --git a/lgsm/functions/update_ts3.sh b/lgsm/functions/update_ts3.sh index 3c8837214..0ca4b0842 100644 --- a/lgsm/functions/update_ts3.sh +++ b/lgsm/functions/update_ts3.sh @@ -32,15 +32,14 @@ fn_update_ts3_dl(){ fn_update_ts3_localbuild(){ # Gets local build info. - fn_print_dots "Checking for update: ${remotelocation}: checking local build" - fn_sleep_time + fn_print_dots "Checking local build: ${remotelocation}" # Uses log file to gather info. # Gives time for log file to generate. if [ ! -d "${serverfiles}/logs" ]||[ -z "$(find "${serverfiles}/logs/"* -name 'ts3server*_0.log' 2> /dev/null)" ]; then - fn_print_error "Checking for update: ${remotelocation}: checking local build" - fn_print_error_nl "Checking for update: ${remotelocation}: checking local build: no log files" - fn_script_log_error "No log file found" - fn_print_info_nl "Checking for update: ${remotelocation}: checking local build: forcing server restart" + fn_print_error "Checking local build: ${remotelocation}" + fn_print_error_nl "Checking local build: ${remotelocation}: no log files containing version info" + fn_print_info_nl "Checking local build: ${remotelocation}: forcing server restart" + fn_script_log_error "No log files containing version info" fn_script_log_info "Forcing server restart" exitbypass=1 command_stop.sh @@ -50,7 +49,7 @@ fn_update_ts3_localbuild(){ # Check again, allow time to generate logs. while [ ! -d "${serverfiles}/logs" ]||[ -z "$(find "${serverfiles}/logs/"* -name 'ts3server*_0.log' 2> /dev/null)" ]; do sleep 1 - fn_print_info "Checking for update: ${remotelocation}: checking local build: waiting for log file: ${totalseconds}" + fn_print_info "Checking local build: ${remotelocation}: waiting for log file: ${totalseconds}" if [ -v "${loopignore}" ]; then loopignore=1 fn_script_log_info "Waiting for log file to generate" @@ -58,7 +57,7 @@ fn_update_ts3_localbuild(){ if [ "${totalseconds}" -gt "120" ]; then localbuild="0" - fn_print_error "Checking for update: ${remotelocation}: waiting for log file: missing log file" + fn_print_error "Checking local build: ${remotelocation}: waiting for log file: missing log file" fn_script_log_error "Missing log file" fn_script_log_error "Set localbuild to 0" fi @@ -73,16 +72,15 @@ fn_update_ts3_localbuild(){ if [ -z "${localbuild}" ]; then # Gives time for var to generate. - end=$((SECONDS+120)) totalseconds=0 - while [ "${SECONDS}" -lt "${end}" ]; do - fn_print_info "Checking for update: ${remotelocation}: checking local build: waiting for local build: ${totalseconds}" + for seconds in {1..120}; do + fn_print_info "Checking local build: ${remotelocation}: waiting for local build: ${totalseconds}" if [ -z "${loopignore}" ]; then loopignore=1 fn_script_log_info "Waiting for local build to generate" fi localbuild=$(cat "$(find ./* -name "ts3server*_0.log" 2> /dev/null | sort | tail -1)" | grep -Eo "TeamSpeak 3 Server ((\.)?[0-9]{1,3}){1,3}\.[0-9]{1,3}" | grep -Eo "((\.)?[0-9]{1,3}){1,3}\.[0-9]{1,3}" | tail -1) - if [ "${localbuild}" ]; then + if [ "${localbuild}" ]||[ "${seconds}" == "120" ]; then break fi sleep 1 @@ -92,11 +90,11 @@ fn_update_ts3_localbuild(){ if [ -z "${localbuild}" ]; then localbuild="0" - fn_print_error "Checking for update: ${remotelocation}: waiting for local build: missing local build info" + fn_print_error "Checking local build: ${remotelocation}: waiting for local build: missing local build info" fn_script_log_error "Missing local build info" fn_script_log_error "Set localbuild to 0" else - fn_print_ok "Checking for update: ${remotelocation}: checking local build" + fn_print_ok "Checking local build: ${remotelocation}" fn_script_log_pass "Checking local build" fi } @@ -109,14 +107,14 @@ fn_update_ts3_remotebuild(){ remotebuild=$(curl -s "https://www.teamspeak.com/versions/server.json" | jq -r '.linux.x86.version') fi if [ "${installer}" != "1" ]; then - fn_print_dots "Checking for update: ${remotelocation}: checking remote build" + fn_print_dots "Checking remote build: ${remotelocation}" # Checks if remotebuild variable has been set. if [ -z "${remotebuild}" ]||[ "${remotebuild}" == "null" ]; then - fn_print_fail "Checking for update: ${remotelocation}: checking remote build" + fn_print_fail "Checking remote build: ${remotelocation}" fn_script_log_fatal "Checking remote build" core_exit.sh else - fn_print_ok "Checking for update: ${remotelocation}: checking remote build" + fn_print_ok "Checking remote build: ${remotelocation}" fn_script_log_pass "Checking remote build" fi else @@ -136,6 +134,7 @@ fn_update_ts3_compare(){ remotebuilddigit=$(echo -e "${remotebuild}" | tr -cd '[:digit:]') if [ "${localbuilddigit}" -ne "${remotebuilddigit}" ]||[ "${forceupdate}" == "1" ]; then fn_print_ok_nl "Checking for update: ${remotelocation}" + echo -en "\n" echo -e "Update available" echo -e "* Local build: ${red}${localbuild}${default}" echo -e "* Remote build: ${green}${remotebuild}${default}" @@ -143,18 +142,8 @@ fn_update_ts3_compare(){ fn_script_log_info "Local build: ${localbuild}" fn_script_log_info "Remote build: ${remotebuild}" fn_script_log_info "${localbuild} > ${remotebuild}" - fn_sleep_time - echo -en "\n" - echo -en "applying update.\r" - sleep 1 - echo -en "applying update..\r" - sleep 1 - echo -en "applying update...\r" - sleep 1 - echo -en "\n" unset updateonstart - check_status.sh # If server stopped. if [ "${status}" == "0" ]; then @@ -166,6 +155,7 @@ fn_update_ts3_compare(){ command_stop.sh # If server started. else + fn_stop_warning exitbypass=1 command_stop.sh exitbypass=1 @@ -177,6 +167,7 @@ fn_update_ts3_compare(){ alert.sh else fn_print_ok_nl "Checking for update: ${remotelocation}" + echo -en "\n" echo -e "No update available" echo -e "* Local build: ${green}${localbuild}${default}" echo -e "* Remote build: ${green}${remotebuild}${default}" @@ -198,6 +189,21 @@ else core_exit.sh fi +fn_stop_warning(){ + fn_print_warn "Updating server: SteamCMD: ${selfname} will be stopped during update" + fn_script_log_warn "Updating server: SteamCMD: ${selfname} will be stopped during update" + totalseconds=3 + for seconds in {3..1}; do + fn_print_warn "Updating server: SteamCMD: ${selfname} will be stopped during update: ${totalseconds}" + totalseconds=$((totalseconds - 1)) + sleep 1 + if [ "${seconds}" == "0" ]; then + break + fi + done + fn_print_warn_nl "Updating server: SteamCMD: ${selfname} will be stopped during update" +} + # The location where the builds are checked and downloaded. remotelocation="teamspeak.com" From 25cfd3b8c443b5af97f33a8355c982674ccb703c Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Fri, 3 Apr 2020 23:01:16 +0100 Subject: [PATCH 326/534] fix: correct and standardise name of goldsrc engine (#2803) GoldSrc servers were named variants of Gold Source. Using correct engine name GoldSrc --- .../config-default/config-lgsm/ahl2server/_default.cfg | 2 +- lgsm/config-default/config-lgsm/ahlserver/_default.cfg | 4 ++-- lgsm/config-default/config-lgsm/arkserver/_default.cfg | 2 +- .../config-lgsm/arma3server/_default.cfg | 2 +- lgsm/config-default/config-lgsm/bb2server/_default.cfg | 2 +- lgsm/config-default/config-lgsm/bbserver/_default.cfg | 4 ++-- lgsm/config-default/config-lgsm/bdserver/_default.cfg | 4 ++-- .../config-lgsm/bf1942server/_default.cfg | 2 +- .../config-default/config-lgsm/bmdmserver/_default.cfg | 2 +- lgsm/config-default/config-lgsm/boserver/_default.cfg | 2 +- lgsm/config-default/config-lgsm/bsserver/_default.cfg | 2 +- .../config-lgsm/bt1944server/_default.cfg | 2 +- lgsm/config-default/config-lgsm/btserver/_default.cfg | 2 +- lgsm/config-default/config-lgsm/ccserver/_default.cfg | 2 +- .../config-default/config-lgsm/cod2server/_default.cfg | 2 +- .../config-default/config-lgsm/cod4server/_default.cfg | 2 +- lgsm/config-default/config-lgsm/codserver/_default.cfg | 2 +- .../config-lgsm/coduoserver/_default.cfg | 2 +- .../config-lgsm/codwawserver/_default.cfg | 2 +- .../config-default/config-lgsm/csczserver/_default.cfg | 4 ++-- .../config-default/config-lgsm/csgoserver/_default.cfg | 2 +- lgsm/config-default/config-lgsm/csserver/_default.cfg | 4 ++-- lgsm/config-default/config-lgsm/cssserver/_default.cfg | 2 +- lgsm/config-default/config-lgsm/dabserver/_default.cfg | 2 +- 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 | 2 +- lgsm/config-default/config-lgsm/doiserver/_default.cfg | 2 +- lgsm/config-default/config-lgsm/dstserver/_default.cfg | 2 +- lgsm/config-default/config-lgsm/dysserver/_default.cfg | 2 +- lgsm/config-default/config-lgsm/ecoserver/_default.cfg | 2 +- lgsm/config-default/config-lgsm/emserver/_default.cfg | 2 +- lgsm/config-default/config-lgsm/etlserver/_default.cfg | 2 +- .../config-default/config-lgsm/fctrserver/_default.cfg | 2 +- lgsm/config-default/config-lgsm/fofserver/_default.cfg | 2 +- lgsm/config-default/config-lgsm/gesserver/_default.cfg | 2 +- .../config-default/config-lgsm/gmodserver/_default.cfg | 2 +- .../config-lgsm/hl2dmserver/_default.cfg | 2 +- .../config-default/config-lgsm/hldmserver/_default.cfg | 4 ++-- .../config-lgsm/hldmsserver/_default.cfg | 2 +- lgsm/config-default/config-lgsm/hwserver/_default.cfg | 2 +- lgsm/config-default/config-lgsm/insserver/_default.cfg | 2 +- .../config-default/config-lgsm/inssserver/_default.cfg | 2 +- lgsm/config-default/config-lgsm/iosserver/_default.cfg | 2 +- lgsm/config-default/config-lgsm/jc2server/_default.cfg | 2 +- lgsm/config-default/config-lgsm/jc3server/_default.cfg | 2 +- lgsm/config-default/config-lgsm/kf2server/_default.cfg | 2 +- lgsm/config-default/config-lgsm/kfserver/_default.cfg | 2 +- .../config-default/config-lgsm/l4d2server/_default.cfg | 2 +- lgsm/config-default/config-lgsm/l4dserver/_default.cfg | 2 +- lgsm/config-default/config-lgsm/mcbserver/_default.cfg | 2 +- lgsm/config-default/config-lgsm/mcserver/_default.cfg | 2 +- lgsm/config-default/config-lgsm/mhserver/_default.cfg | 2 +- .../config-lgsm/mohaaserver/_default.cfg | 2 +- lgsm/config-default/config-lgsm/mtaserver/_default.cfg | 2 +- .../config-lgsm/mumbleserver/_default.cfg | 2 +- lgsm/config-default/config-lgsm/ndserver/_default.cfg | 2 +- .../config-lgsm/nmrihserver/_default.cfg | 2 +- .../config-default/config-lgsm/ns2cserver/_default.cfg | 2 +- lgsm/config-default/config-lgsm/ns2server/_default.cfg | 2 +- lgsm/config-default/config-lgsm/nsserver/_default.cfg | 4 ++-- .../config-lgsm/onsetserver/_default.cfg | 2 +- .../config-lgsm/opforserver/_default.cfg | 4 ++-- lgsm/config-default/config-lgsm/pcserver/_default.cfg | 2 +- .../config-lgsm/pstbsserver/_default.cfg | 2 +- .../config-lgsm/pvkiiserver/_default.cfg | 2 +- lgsm/config-default/config-lgsm/pzserver/_default.cfg | 2 +- lgsm/config-default/config-lgsm/q2server/_default.cfg | 2 +- lgsm/config-default/config-lgsm/q3server/_default.cfg | 2 +- lgsm/config-default/config-lgsm/qlserver/_default.cfg | 2 +- lgsm/config-default/config-lgsm/qwserver/_default.cfg | 2 +- .../config-lgsm/ricochetserver/_default.cfg | 4 ++-- lgsm/config-default/config-lgsm/roserver/_default.cfg | 2 +- .../config-default/config-lgsm/rtcwserver/_default.cfg | 2 +- .../config-default/config-lgsm/rustserver/_default.cfg | 2 +- lgsm/config-default/config-lgsm/rwserver/_default.cfg | 2 +- .../config-default/config-lgsm/sampserver/_default.cfg | 2 +- .../config-lgsm/sbotsserver/_default.cfg | 2 +- lgsm/config-default/config-lgsm/sbserver/_default.cfg | 2 +- .../config-default/config-lgsm/sdtdserver/_default.cfg | 2 +- lgsm/config-default/config-lgsm/sfcserver/_default.cfg | 2 +- .../config-default/config-lgsm/sof2server/_default.cfg | 2 +- lgsm/config-default/config-lgsm/solserver/_default.cfg | 2 +- .../config-lgsm/squadserver/_default.cfg | 2 +- lgsm/config-default/config-lgsm/ss3server/_default.cfg | 2 +- lgsm/config-default/config-lgsm/stserver/_default.cfg | 2 +- .../config-default/config-lgsm/svenserver/_default.cfg | 4 ++-- .../config-lgsm/terrariaserver/_default.cfg | 2 +- lgsm/config-default/config-lgsm/tf2server/_default.cfg | 2 +- lgsm/config-default/config-lgsm/tfcserver/_default.cfg | 4 ++-- lgsm/config-default/config-lgsm/ts3server/_default.cfg | 2 +- lgsm/config-default/config-lgsm/tsserver/_default.cfg | 4 ++-- lgsm/config-default/config-lgsm/tuserver/_default.cfg | 2 +- lgsm/config-default/config-lgsm/twserver/_default.cfg | 2 +- lgsm/config-default/config-lgsm/untserver/_default.cfg | 2 +- .../config-lgsm/ut2k4server/_default.cfg | 2 +- lgsm/config-default/config-lgsm/ut3server/_default.cfg | 2 +- .../config-default/config-lgsm/ut99server/_default.cfg | 2 +- lgsm/config-default/config-lgsm/utserver/_default.cfg | 2 +- lgsm/config-default/config-lgsm/vsserver/_default.cfg | 4 ++-- lgsm/config-default/config-lgsm/wetserver/_default.cfg | 2 +- lgsm/config-default/config-lgsm/wfserver/_default.cfg | 2 +- .../config-default/config-lgsm/wurmserver/_default.cfg | 2 +- lgsm/config-default/config-lgsm/zmrserver/_default.cfg | 2 +- lgsm/config-default/config-lgsm/zpsserver/_default.cfg | 2 +- lgsm/functions/command_debug.sh | 4 ++-- lgsm/functions/command_stop.sh | 10 +++++----- lgsm/functions/info_config.sh | 2 +- lgsm/functions/info_messages.sh | 8 ++++---- lgsm/functions/info_parms.sh | 2 +- lgsm/functions/install_server_files.sh | 8 ++++---- lgsm/functions/query_gsquery.py | 2 +- tests/tests_defaultcfg/defaultcfg_1.txt | 2 +- 113 files changed, 139 insertions(+), 139 deletions(-) diff --git a/lgsm/config-default/config-lgsm/ahl2server/_default.cfg b/lgsm/config-default/config-lgsm/ahl2server/_default.cfg index 02dd1657a..0701594d7 100644 --- a/lgsm/config-default/config-lgsm/ahl2server/_default.cfg +++ b/lgsm/config-default/config-lgsm/ahl2server/_default.cfg @@ -120,7 +120,7 @@ sleeptime="0.5" # 6: q # 7: exit # 8: 7 Days to Die -# 9: Gold Source +# 9: GoldSrc # 10: Teamspeak 3 stopmode="3" diff --git a/lgsm/config-default/config-lgsm/ahlserver/_default.cfg b/lgsm/config-default/config-lgsm/ahlserver/_default.cfg index 4e3039209..18e60def5 100644 --- a/lgsm/config-default/config-lgsm/ahlserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/ahlserver/_default.cfg @@ -124,7 +124,7 @@ steammaster="true" # 6: q # 7: exit # 8: 7 Days to Die -# 9: Gold Source +# 9: GoldSrc # 10: Teamspeak 3 stopmode="9" @@ -140,7 +140,7 @@ querytype="protocol-valve" ## Game Server Details # Do not edit gamename="Action half-life" -engine="goldsource" +engine="goldsrc" glibc="2.3.4" #### Directories #### diff --git a/lgsm/config-default/config-lgsm/arkserver/_default.cfg b/lgsm/config-default/config-lgsm/arkserver/_default.cfg index 2bc9894af..60061c177 100644 --- a/lgsm/config-default/config-lgsm/arkserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/arkserver/_default.cfg @@ -125,7 +125,7 @@ steammaster="true" # 6: q # 7: exit # 8: 7 Days to Die -# 9: Gold Source +# 9: GoldSrc # 10: Teamspeak 3 stopmode="2" diff --git a/lgsm/config-default/config-lgsm/arma3server/_default.cfg b/lgsm/config-default/config-lgsm/arma3server/_default.cfg index f56fdac89..51e06e85d 100644 --- a/lgsm/config-default/config-lgsm/arma3server/_default.cfg +++ b/lgsm/config-default/config-lgsm/arma3server/_default.cfg @@ -139,7 +139,7 @@ steammaster="false" # 6: q # 7: exit # 8: 7 Days to Die -# 9: Gold Source +# 9: GoldSrc # 10: Teamspeak 3 stopmode="2" diff --git a/lgsm/config-default/config-lgsm/bb2server/_default.cfg b/lgsm/config-default/config-lgsm/bb2server/_default.cfg index a1a9ae350..364215629 100644 --- a/lgsm/config-default/config-lgsm/bb2server/_default.cfg +++ b/lgsm/config-default/config-lgsm/bb2server/_default.cfg @@ -129,7 +129,7 @@ steammaster="true" # 6: q # 7: exit # 8: 7 Days to Die -# 9: Gold Source +# 9: GoldSrc # 10: Teamspeak 3 stopmode="3" diff --git a/lgsm/config-default/config-lgsm/bbserver/_default.cfg b/lgsm/config-default/config-lgsm/bbserver/_default.cfg index 75da97662..82e59ccfd 100644 --- a/lgsm/config-default/config-lgsm/bbserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/bbserver/_default.cfg @@ -124,7 +124,7 @@ steammaster="true" # 6: q # 7: exit # 8: 7 Days to Die -# 9: Gold Source +# 9: GoldSrc # 10: Teamspeak 3 stopmode="9" @@ -140,7 +140,7 @@ querytype="protocol-valve" ## Game Server Details # Do not edit gamename="BrainBread" -engine="goldsource" +engine="goldsrc" glibc="2.3.4" #### Directories #### diff --git a/lgsm/config-default/config-lgsm/bdserver/_default.cfg b/lgsm/config-default/config-lgsm/bdserver/_default.cfg index 77c169e6a..3770f5b34 100644 --- a/lgsm/config-default/config-lgsm/bdserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/bdserver/_default.cfg @@ -123,7 +123,7 @@ steammaster="true" # 6: q # 7: exit # 8: 7 Days to Die -# 9: Gold Source +# 9: GoldSrc # 10: Teamspeak 3 stopmode="9" @@ -139,7 +139,7 @@ querytype="protocol-valve" ## Game Server Details # Do not edit gamename="Base Defense" -engine="goldsource" +engine="goldsrc" glibc="2.14" #### Directories #### diff --git a/lgsm/config-default/config-lgsm/bf1942server/_default.cfg b/lgsm/config-default/config-lgsm/bf1942server/_default.cfg index b6e508e01..fca0a01b8 100644 --- a/lgsm/config-default/config-lgsm/bf1942server/_default.cfg +++ b/lgsm/config-default/config-lgsm/bf1942server/_default.cfg @@ -108,7 +108,7 @@ sleeptime="0.5" # 6: q # 7: exit # 8: 7 Days to Die -# 9: Gold Source +# 9: GoldSrc # 10: Teamspeak 3 stopmode="2" diff --git a/lgsm/config-default/config-lgsm/bmdmserver/_default.cfg b/lgsm/config-default/config-lgsm/bmdmserver/_default.cfg index b92257fff..a82bc74e7 100644 --- a/lgsm/config-default/config-lgsm/bmdmserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/bmdmserver/_default.cfg @@ -129,7 +129,7 @@ steammaster="true" # 6: q # 7: exit # 8: 7 Days to Die -# 9: Gold Source +# 9: GoldSrc # 10: Teamspeak 3 stopmode="3" diff --git a/lgsm/config-default/config-lgsm/boserver/_default.cfg b/lgsm/config-default/config-lgsm/boserver/_default.cfg index 73015c2d6..ec8f8df14 100644 --- a/lgsm/config-default/config-lgsm/boserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/boserver/_default.cfg @@ -122,7 +122,7 @@ steammaster="false" # 6: q # 7: exit # 8: 7 Days to Die -# 9: Gold Source +# 9: GoldSrc # 10: Teamspeak 3 stopmode="2" diff --git a/lgsm/config-default/config-lgsm/bsserver/_default.cfg b/lgsm/config-default/config-lgsm/bsserver/_default.cfg index 612e4cb2b..5d5477d4f 100644 --- a/lgsm/config-default/config-lgsm/bsserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/bsserver/_default.cfg @@ -133,7 +133,7 @@ steammaster="true" # 6: q # 7: exit # 8: 7 Days to Die -# 9: Gold Source +# 9: GoldSrc # 10: Teamspeak 3 stopmode="3" diff --git a/lgsm/config-default/config-lgsm/bt1944server/_default.cfg b/lgsm/config-default/config-lgsm/bt1944server/_default.cfg index 2ca021b27..7f7026b58 100644 --- a/lgsm/config-default/config-lgsm/bt1944server/_default.cfg +++ b/lgsm/config-default/config-lgsm/bt1944server/_default.cfg @@ -121,7 +121,7 @@ steammaster="false" # 6: q # 7: exit # 8: 7 Days to Die -# 9: Gold Source +# 9: GoldSrc # 10: Teamspeak 3 stopmode="2" diff --git a/lgsm/config-default/config-lgsm/btserver/_default.cfg b/lgsm/config-default/config-lgsm/btserver/_default.cfg index 45d54833a..9e58dddc3 100644 --- a/lgsm/config-default/config-lgsm/btserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/btserver/_default.cfg @@ -116,7 +116,7 @@ steammaster="true" # 6: q # 7: exit # 8: 7 Days to Die -# 9: Gold Source +# 9: GoldSrc # 10: Teamspeak 3 stopmode="7" diff --git a/lgsm/config-default/config-lgsm/ccserver/_default.cfg b/lgsm/config-default/config-lgsm/ccserver/_default.cfg index 2913a289d..8525f13ed 100644 --- a/lgsm/config-default/config-lgsm/ccserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/ccserver/_default.cfg @@ -124,7 +124,7 @@ steammaster="false" # 6: q # 7: exit # 8: 7 Days to Die -# 9: Gold Source +# 9: GoldSrc # 10: Teamspeak 3 stopmode="3" diff --git a/lgsm/config-default/config-lgsm/cod2server/_default.cfg b/lgsm/config-default/config-lgsm/cod2server/_default.cfg index 6c8a31c71..1ac29768b 100644 --- a/lgsm/config-default/config-lgsm/cod2server/_default.cfg +++ b/lgsm/config-default/config-lgsm/cod2server/_default.cfg @@ -111,7 +111,7 @@ sleeptime="0.5" # 6: q # 7: exit # 8: 7 Days to Die -# 9: Gold Source +# 9: GoldSrc # 10: Teamspeak 3 stopmode="3" diff --git a/lgsm/config-default/config-lgsm/cod4server/_default.cfg b/lgsm/config-default/config-lgsm/cod4server/_default.cfg index f319c7ae9..265891d3b 100644 --- a/lgsm/config-default/config-lgsm/cod4server/_default.cfg +++ b/lgsm/config-default/config-lgsm/cod4server/_default.cfg @@ -111,7 +111,7 @@ sleeptime="0.5" # 6: q # 7: exit # 8: 7 Days to Die -# 9: Gold Source +# 9: GoldSrc # 10: Teamspeak 3 stopmode="3" diff --git a/lgsm/config-default/config-lgsm/codserver/_default.cfg b/lgsm/config-default/config-lgsm/codserver/_default.cfg index 14c2ea889..6892d780e 100644 --- a/lgsm/config-default/config-lgsm/codserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/codserver/_default.cfg @@ -111,7 +111,7 @@ sleeptime="0.5" # 6: q # 7: exit # 8: 7 Days to Die -# 9: Gold Source +# 9: GoldSrc # 10: Teamspeak 3 stopmode="3" diff --git a/lgsm/config-default/config-lgsm/coduoserver/_default.cfg b/lgsm/config-default/config-lgsm/coduoserver/_default.cfg index 9eb271d27..a140d50a6 100644 --- a/lgsm/config-default/config-lgsm/coduoserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/coduoserver/_default.cfg @@ -111,7 +111,7 @@ sleeptime="0.5" # 6: q # 7: exit # 8: 7 Days to Die -# 9: Gold Source +# 9: GoldSrc # 10: Teamspeak 3 stopmode="3" diff --git a/lgsm/config-default/config-lgsm/codwawserver/_default.cfg b/lgsm/config-default/config-lgsm/codwawserver/_default.cfg index 14799814f..358947fbf 100644 --- a/lgsm/config-default/config-lgsm/codwawserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/codwawserver/_default.cfg @@ -111,7 +111,7 @@ sleeptime="0.5" # 6: q # 7: exit # 8: 7 Days to Die -# 9: Gold Source +# 9: GoldSrc # 10: Teamspeak 3 stopmode="3" diff --git a/lgsm/config-default/config-lgsm/csczserver/_default.cfg b/lgsm/config-default/config-lgsm/csczserver/_default.cfg index 0fd33cd68..4d2777c2d 100644 --- a/lgsm/config-default/config-lgsm/csczserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/csczserver/_default.cfg @@ -124,7 +124,7 @@ steammaster="true" # 6: q # 7: exit # 8: 7 Days to Die -# 9: Gold Source +# 9: GoldSrc # 10: Teamspeak 3 stopmode="9" @@ -140,7 +140,7 @@ querytype="protocol-valve" ## Game Server Details # Do not edit gamename="Counter-Strike: Condition Zero" -engine="goldsource" +engine="goldsrc" glibc="2.3.6" #### Directories #### diff --git a/lgsm/config-default/config-lgsm/csgoserver/_default.cfg b/lgsm/config-default/config-lgsm/csgoserver/_default.cfg index 0cabcd249..dbce043fa 100644 --- a/lgsm/config-default/config-lgsm/csgoserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/csgoserver/_default.cfg @@ -149,7 +149,7 @@ steammaster="true" # 6: q # 7: exit # 8: 7 Days to Die -# 9: Gold Source +# 9: GoldSrc # 10: Teamspeak 3 stopmode="3" diff --git a/lgsm/config-default/config-lgsm/csserver/_default.cfg b/lgsm/config-default/config-lgsm/csserver/_default.cfg index 36f0d955a..1956888cd 100644 --- a/lgsm/config-default/config-lgsm/csserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/csserver/_default.cfg @@ -124,7 +124,7 @@ steammaster="true" # 6: q # 7: exit # 8: 7 Days to Die -# 9: Gold Source +# 9: GoldSrc # 10: Teamspeak 3 stopmode="9" @@ -140,7 +140,7 @@ querytype="protocol-valve" ## Game Server Details # Do not edit gamename="Counter-Strike 1.6" -engine="goldsource" +engine="goldsrc" glibc="2.3.6" #### Directories #### diff --git a/lgsm/config-default/config-lgsm/cssserver/_default.cfg b/lgsm/config-default/config-lgsm/cssserver/_default.cfg index 586b6dc18..23321a0ef 100644 --- a/lgsm/config-default/config-lgsm/cssserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/cssserver/_default.cfg @@ -129,7 +129,7 @@ steammaster="true" # 6: q # 7: exit # 8: 7 Days to Die -# 9: Gold Source +# 9: GoldSrc # 10: Teamspeak 3 stopmode="3" diff --git a/lgsm/config-default/config-lgsm/dabserver/_default.cfg b/lgsm/config-default/config-lgsm/dabserver/_default.cfg index f03645b95..778514cbe 100644 --- a/lgsm/config-default/config-lgsm/dabserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/dabserver/_default.cfg @@ -124,7 +124,7 @@ steammaster="true" # 6: q # 7: exit # 8: 7 Days to Die -# 9: Gold Source +# 9: GoldSrc # 10: Teamspeak 3 stopmode="3" diff --git a/lgsm/config-default/config-lgsm/dmcserver/_default.cfg b/lgsm/config-default/config-lgsm/dmcserver/_default.cfg index 3af9ee7d7..b21595c4e 100644 --- a/lgsm/config-default/config-lgsm/dmcserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/dmcserver/_default.cfg @@ -124,7 +124,7 @@ steammaster="true" # 6: q # 7: exit # 8: 7 Days to Die -# 9: Gold Source +# 9: GoldSrc # 10: Teamspeak 3 stopmode="9" @@ -140,7 +140,7 @@ querytype="protocol-valve" ## Game Server Details # Do not edit gamename="Deathmatch Classic" -engine="goldsource" +engine="goldsrc" glibc="2.3.4" #### Directories #### diff --git a/lgsm/config-default/config-lgsm/dodserver/_default.cfg b/lgsm/config-default/config-lgsm/dodserver/_default.cfg index 79df74acb..28f14f2ae 100644 --- a/lgsm/config-default/config-lgsm/dodserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/dodserver/_default.cfg @@ -124,7 +124,7 @@ steammaster="true" # 6: q # 7: exit # 8: 7 Days to Die -# 9: Gold Source +# 9: GoldSrc # 10: Teamspeak 3 stopmode="9" @@ -140,7 +140,7 @@ querytype="protocol-valve" ## Game Server Details # Do not edit gamename="Day of Defeat" -engine="goldsource" +engine="goldsrc" glibc="2.3.4" #### Directories #### diff --git a/lgsm/config-default/config-lgsm/dodsserver/_default.cfg b/lgsm/config-default/config-lgsm/dodsserver/_default.cfg index 7ec70a81d..0c75e7d21 100644 --- a/lgsm/config-default/config-lgsm/dodsserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/dodsserver/_default.cfg @@ -124,7 +124,7 @@ steammaster="true" # 6: q # 7: exit # 8: 7 Days to Die -# 9: Gold Source +# 9: GoldSrc # 10: Teamspeak 3 stopmode="3" diff --git a/lgsm/config-default/config-lgsm/doiserver/_default.cfg b/lgsm/config-default/config-lgsm/doiserver/_default.cfg index c31bea09f..dcee95d58 100644 --- a/lgsm/config-default/config-lgsm/doiserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/doiserver/_default.cfg @@ -125,7 +125,7 @@ steammaster="true" # 6: q # 7: exit # 8: 7 Days to Die -# 9: Gold Source +# 9: GoldSrc # 10: Teamspeak 3 stopmode="3" diff --git a/lgsm/config-default/config-lgsm/dstserver/_default.cfg b/lgsm/config-default/config-lgsm/dstserver/_default.cfg index f93bca058..d1997586c 100644 --- a/lgsm/config-default/config-lgsm/dstserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/dstserver/_default.cfg @@ -127,7 +127,7 @@ steammaster="false" # 6: q # 7: exit # 8: 7 Days to Die -# 9: Gold Source +# 9: GoldSrc # 10: Teamspeak 3 stopmode="2" diff --git a/lgsm/config-default/config-lgsm/dysserver/_default.cfg b/lgsm/config-default/config-lgsm/dysserver/_default.cfg index 51c9db8cf..3790dc837 100644 --- a/lgsm/config-default/config-lgsm/dysserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/dysserver/_default.cfg @@ -129,7 +129,7 @@ steammaster="true" # 6: q # 7: exit # 8: 7 Days to Die -# 9: Gold Source +# 9: GoldSrc # 10: Teamspeak 3 stopmode="3" diff --git a/lgsm/config-default/config-lgsm/ecoserver/_default.cfg b/lgsm/config-default/config-lgsm/ecoserver/_default.cfg index 1286860fc..e4bc46da3 100644 --- a/lgsm/config-default/config-lgsm/ecoserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/ecoserver/_default.cfg @@ -116,7 +116,7 @@ steammaster="false" # 6: q # 7: exit # 8: 7 Days to Die -# 9: Gold Source +# 9: GoldSrc # 10: Teamspeak 3 stopmode="2" diff --git a/lgsm/config-default/config-lgsm/emserver/_default.cfg b/lgsm/config-default/config-lgsm/emserver/_default.cfg index 4d6fc1824..0b9efd818 100644 --- a/lgsm/config-default/config-lgsm/emserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/emserver/_default.cfg @@ -129,7 +129,7 @@ steammaster="true" # 6: q # 7: exit # 8: 7 Days to Die -# 9: Gold Source +# 9: GoldSrc # 10: Teamspeak 3 stopmode="3" diff --git a/lgsm/config-default/config-lgsm/etlserver/_default.cfg b/lgsm/config-default/config-lgsm/etlserver/_default.cfg index ffc85e4b9..d2b5448e3 100644 --- a/lgsm/config-default/config-lgsm/etlserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/etlserver/_default.cfg @@ -105,7 +105,7 @@ sleeptime="0.5" # 6: q # 7: exit # 8: 7 Days to Die -# 9: Gold Source +# 9: GoldSrc # 10: Teamspeak 3 stopmode="3" diff --git a/lgsm/config-default/config-lgsm/fctrserver/_default.cfg b/lgsm/config-default/config-lgsm/fctrserver/_default.cfg index 711194a84..beca898b1 100644 --- a/lgsm/config-default/config-lgsm/fctrserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/fctrserver/_default.cfg @@ -116,7 +116,7 @@ sleeptime="0.5" # 6: q # 7: exit # 8: 7 Days to Die -# 9: Gold Source +# 9: GoldSrc # 10: Teamspeak 3 stopmode="2" diff --git a/lgsm/config-default/config-lgsm/fofserver/_default.cfg b/lgsm/config-default/config-lgsm/fofserver/_default.cfg index 0946a0eac..ea1a5d9f3 100644 --- a/lgsm/config-default/config-lgsm/fofserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/fofserver/_default.cfg @@ -124,7 +124,7 @@ steammaster="true" # 6: q # 7: exit # 8: 7 Days to Die -# 9: Gold Source +# 9: GoldSrc # 10: Teamspeak 3 stopmode="3" diff --git a/lgsm/config-default/config-lgsm/gesserver/_default.cfg b/lgsm/config-default/config-lgsm/gesserver/_default.cfg index d47983a79..ecdc7d602 100644 --- a/lgsm/config-default/config-lgsm/gesserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/gesserver/_default.cfg @@ -124,7 +124,7 @@ steammaster="true" # 6: q # 7: exit # 8: 7 Days to Die -# 9: Gold Source +# 9: GoldSrc # 10: Teamspeak 3 stopmode="3" diff --git a/lgsm/config-default/config-lgsm/gmodserver/_default.cfg b/lgsm/config-default/config-lgsm/gmodserver/_default.cfg index 66202641c..b15314016 100644 --- a/lgsm/config-default/config-lgsm/gmodserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/gmodserver/_default.cfg @@ -140,7 +140,7 @@ steammaster="true" # 6: q # 7: exit # 8: 7 Days to Die -# 9: Gold Source +# 9: GoldSrc # 10: Teamspeak 3 stopmode="3" diff --git a/lgsm/config-default/config-lgsm/hl2dmserver/_default.cfg b/lgsm/config-default/config-lgsm/hl2dmserver/_default.cfg index a67d26a96..842fd4778 100644 --- a/lgsm/config-default/config-lgsm/hl2dmserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/hl2dmserver/_default.cfg @@ -124,7 +124,7 @@ steammaster="true" # 6: q # 7: exit # 8: 7 Days to Die -# 9: Gold Source +# 9: GoldSrc # 10: Teamspeak 3 stopmode="3" diff --git a/lgsm/config-default/config-lgsm/hldmserver/_default.cfg b/lgsm/config-default/config-lgsm/hldmserver/_default.cfg index 2e15cea7e..f3b8aa074 100644 --- a/lgsm/config-default/config-lgsm/hldmserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/hldmserver/_default.cfg @@ -123,7 +123,7 @@ steammaster="true" # 6: q # 7: exit # 8: 7 Days to Die -# 9: Gold Source +# 9: GoldSrc # 10: Teamspeak 3 stopmode="9" @@ -139,7 +139,7 @@ querytype="protocol-valve" ## Game Server Details # Do not edit gamename="Half Life: Deathmatch" -engine="goldsource" +engine="goldsrc" glibc="2.3.4" #### Directories #### diff --git a/lgsm/config-default/config-lgsm/hldmsserver/_default.cfg b/lgsm/config-default/config-lgsm/hldmsserver/_default.cfg index e6d3b0a2a..71baee83f 100644 --- a/lgsm/config-default/config-lgsm/hldmsserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/hldmsserver/_default.cfg @@ -124,7 +124,7 @@ steammaster="true" # 6: q # 7: exit # 8: 7 Days to Die -# 9: Gold Source +# 9: GoldSrc # 10: Teamspeak 3 stopmode="3" diff --git a/lgsm/config-default/config-lgsm/hwserver/_default.cfg b/lgsm/config-default/config-lgsm/hwserver/_default.cfg index c934622fb..7c112c636 100644 --- a/lgsm/config-default/config-lgsm/hwserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/hwserver/_default.cfg @@ -135,7 +135,7 @@ steammaster="false" # 6: q # 7: exit # 8: 7 Days to Die -# 9: Gold Source +# 9: GoldSrc # 10: Teamspeak 3 stopmode="2" diff --git a/lgsm/config-default/config-lgsm/insserver/_default.cfg b/lgsm/config-default/config-lgsm/insserver/_default.cfg index 9fea80b0d..c2279ce42 100644 --- a/lgsm/config-default/config-lgsm/insserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/insserver/_default.cfg @@ -130,7 +130,7 @@ steammaster="false" # 6: q # 7: exit # 8: 7 Days to Die -# 9: Gold Source +# 9: GoldSrc # 10: Teamspeak 3 stopmode="3" diff --git a/lgsm/config-default/config-lgsm/inssserver/_default.cfg b/lgsm/config-default/config-lgsm/inssserver/_default.cfg index 04becc752..0b36880f8 100644 --- a/lgsm/config-default/config-lgsm/inssserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/inssserver/_default.cfg @@ -131,7 +131,7 @@ steammaster="false" # 6: q # 7: exit # 8: 7 Days to Die -# 9: Gold Source +# 9: GoldSrc # 10: Teamspeak 3 stopmode="2" diff --git a/lgsm/config-default/config-lgsm/iosserver/_default.cfg b/lgsm/config-default/config-lgsm/iosserver/_default.cfg index bb53acf48..cb3249d6f 100644 --- a/lgsm/config-default/config-lgsm/iosserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/iosserver/_default.cfg @@ -124,7 +124,7 @@ steammaster="false" # 6: q # 7: exit # 8: 7 Days to Die -# 9: Gold Source +# 9: GoldSrc # 10: Teamspeak 3 stopmode="3" diff --git a/lgsm/config-default/config-lgsm/jc2server/_default.cfg b/lgsm/config-default/config-lgsm/jc2server/_default.cfg index 822e860c5..2b4167172 100644 --- a/lgsm/config-default/config-lgsm/jc2server/_default.cfg +++ b/lgsm/config-default/config-lgsm/jc2server/_default.cfg @@ -116,7 +116,7 @@ steammaster="true" # 6: q # 7: exit # 8: 7 Days to Die -# 9: Gold Source +# 9: GoldSrc # 10: Teamspeak 3 stopmode="2" diff --git a/lgsm/config-default/config-lgsm/jc3server/_default.cfg b/lgsm/config-default/config-lgsm/jc3server/_default.cfg index dbe9d4616..e33061f71 100644 --- a/lgsm/config-default/config-lgsm/jc3server/_default.cfg +++ b/lgsm/config-default/config-lgsm/jc3server/_default.cfg @@ -116,7 +116,7 @@ steammaster="false" # 6: q # 7: exit # 8: 7 Days to Die -# 9: Gold Source +# 9: GoldSrc # 10: Teamspeak 3 stopmode="2" diff --git a/lgsm/config-default/config-lgsm/kf2server/_default.cfg b/lgsm/config-default/config-lgsm/kf2server/_default.cfg index 6e31023be..c3f6aaf01 100644 --- a/lgsm/config-default/config-lgsm/kf2server/_default.cfg +++ b/lgsm/config-default/config-lgsm/kf2server/_default.cfg @@ -122,7 +122,7 @@ steammaster="false" # 6: q # 7: exit # 8: 7 Days to Die -# 9: Gold Source +# 9: GoldSrc # 10: Teamspeak 3 stopmode="2" diff --git a/lgsm/config-default/config-lgsm/kfserver/_default.cfg b/lgsm/config-default/config-lgsm/kfserver/_default.cfg index df07967d7..b0de2b29e 100644 --- a/lgsm/config-default/config-lgsm/kfserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/kfserver/_default.cfg @@ -128,7 +128,7 @@ steammaster="false" # 6: q # 7: exit # 8: 7 Days to Die -# 9: Gold Source +# 9: GoldSrc # 10: Teamspeak 3 stopmode="2" diff --git a/lgsm/config-default/config-lgsm/l4d2server/_default.cfg b/lgsm/config-default/config-lgsm/l4d2server/_default.cfg index c2dd765c2..bfaaca623 100644 --- a/lgsm/config-default/config-lgsm/l4d2server/_default.cfg +++ b/lgsm/config-default/config-lgsm/l4d2server/_default.cfg @@ -123,7 +123,7 @@ steammaster="false" # 6: q # 7: exit # 8: 7 Days to Die -# 9: Gold Source +# 9: GoldSrc # 10: Teamspeak 3 stopmode="3" diff --git a/lgsm/config-default/config-lgsm/l4dserver/_default.cfg b/lgsm/config-default/config-lgsm/l4dserver/_default.cfg index c40a1199f..365bf7505 100644 --- a/lgsm/config-default/config-lgsm/l4dserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/l4dserver/_default.cfg @@ -123,7 +123,7 @@ steammaster="false" # 6: q # 7: exit # 8: 7 Days to Die -# 9: Gold Source +# 9: GoldSrc # 10: Teamspeak 3 stopmode="2" diff --git a/lgsm/config-default/config-lgsm/mcbserver/_default.cfg b/lgsm/config-default/config-lgsm/mcbserver/_default.cfg index 1a600d821..3501928bc 100644 --- a/lgsm/config-default/config-lgsm/mcbserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/mcbserver/_default.cfg @@ -108,7 +108,7 @@ sleeptime="0.5" # 6: q # 7: exit # 8: 7 Days to Die -# 9: Gold Source +# 9: GoldSrc # 10: Teamspeak 3 stopmode="5" diff --git a/lgsm/config-default/config-lgsm/mcserver/_default.cfg b/lgsm/config-default/config-lgsm/mcserver/_default.cfg index 2bfcb3d1d..664796cbc 100644 --- a/lgsm/config-default/config-lgsm/mcserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/mcserver/_default.cfg @@ -114,7 +114,7 @@ sleeptime="0.5" # 6: q # 7: exit # 8: 7 Days to Die -# 9: Gold Source +# 9: GoldSrc # 10: Teamspeak 3 stopmode="5" diff --git a/lgsm/config-default/config-lgsm/mhserver/_default.cfg b/lgsm/config-default/config-lgsm/mhserver/_default.cfg index 6a9b9a82e..d3b98a081 100644 --- a/lgsm/config-default/config-lgsm/mhserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/mhserver/_default.cfg @@ -124,7 +124,7 @@ steammaster="false" # 6: q # 7: exit # 8: 7 Days to Die -# 9: Gold Source +# 9: GoldSrc # 10: Teamspeak 3 stopmode="2" diff --git a/lgsm/config-default/config-lgsm/mohaaserver/_default.cfg b/lgsm/config-default/config-lgsm/mohaaserver/_default.cfg index 22d05c752..49eaa189f 100644 --- a/lgsm/config-default/config-lgsm/mohaaserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/mohaaserver/_default.cfg @@ -110,7 +110,7 @@ sleeptime="0.5" # 6: q # 7: exit # 8: 7 Days to Die -# 9: Gold Source +# 9: GoldSrc # 10: Teamspeak 3 stopmode="3" diff --git a/lgsm/config-default/config-lgsm/mtaserver/_default.cfg b/lgsm/config-default/config-lgsm/mtaserver/_default.cfg index 944f4ae57..ac0812cfc 100644 --- a/lgsm/config-default/config-lgsm/mtaserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/mtaserver/_default.cfg @@ -109,7 +109,7 @@ sleeptime="0.5" # 6: q # 7: exit # 8: 7 Days to Die -# 9: Gold Source +# 9: GoldSrc # 10: Teamspeak 3 stopmode="4" diff --git a/lgsm/config-default/config-lgsm/mumbleserver/_default.cfg b/lgsm/config-default/config-lgsm/mumbleserver/_default.cfg index 301318217..83ecb5eb0 100644 --- a/lgsm/config-default/config-lgsm/mumbleserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/mumbleserver/_default.cfg @@ -109,7 +109,7 @@ sleeptime="0.5" # 6: q # 7: exit # 8: 7 Days to Die -# 9: Gold Source +# 9: GoldSrc # 10: Teamspeak 3 stopmode="2" diff --git a/lgsm/config-default/config-lgsm/ndserver/_default.cfg b/lgsm/config-default/config-lgsm/ndserver/_default.cfg index 58092d361..46ff6b63b 100644 --- a/lgsm/config-default/config-lgsm/ndserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/ndserver/_default.cfg @@ -124,7 +124,7 @@ steammaster="true" # 6: q # 7: exit # 8: 7 Days to Die -# 9: Gold Source +# 9: GoldSrc # 10: Teamspeak 3 stopmode="3" diff --git a/lgsm/config-default/config-lgsm/nmrihserver/_default.cfg b/lgsm/config-default/config-lgsm/nmrihserver/_default.cfg index 621962349..3fb1cae94 100644 --- a/lgsm/config-default/config-lgsm/nmrihserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/nmrihserver/_default.cfg @@ -129,7 +129,7 @@ steammaster="true" # 6: q # 7: exit # 8: 7 Days to Die -# 9: Gold Source +# 9: GoldSrc # 10: Teamspeak 3 stopmode="3" diff --git a/lgsm/config-default/config-lgsm/ns2cserver/_default.cfg b/lgsm/config-default/config-lgsm/ns2cserver/_default.cfg index 01b6bc9b2..ea1cebd3f 100644 --- a/lgsm/config-default/config-lgsm/ns2cserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/ns2cserver/_default.cfg @@ -131,7 +131,7 @@ steammaster="true" # 6: q # 7: exit # 8: 7 Days to Die -# 9: Gold Source +# 9: GoldSrc # 10: Teamspeak 3 stopmode="6" diff --git a/lgsm/config-default/config-lgsm/ns2server/_default.cfg b/lgsm/config-default/config-lgsm/ns2server/_default.cfg index acd89375f..4e05e2cf7 100644 --- a/lgsm/config-default/config-lgsm/ns2server/_default.cfg +++ b/lgsm/config-default/config-lgsm/ns2server/_default.cfg @@ -135,7 +135,7 @@ steammaster="true" # 6: q # 7: exit # 8: 7 Days to Die -# 9: Gold Source +# 9: GoldSrc # 10: Teamspeak 3 stopmode="6" diff --git a/lgsm/config-default/config-lgsm/nsserver/_default.cfg b/lgsm/config-default/config-lgsm/nsserver/_default.cfg index 1f0ebcb49..7457a8161 100644 --- a/lgsm/config-default/config-lgsm/nsserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/nsserver/_default.cfg @@ -124,7 +124,7 @@ steammaster="true" # 6: q # 7: exit # 8: 7 Days to Die -# 9: Gold Source +# 9: GoldSrc # 10: Teamspeak 3 stopmode="9" @@ -140,7 +140,7 @@ querytype="protocol-valve" ## Game Server Details # Do not edit gamename="Natural Selection" -engine="goldsource" +engine="goldsrc" glibc="2.3.4" #### Directories #### diff --git a/lgsm/config-default/config-lgsm/onsetserver/_default.cfg b/lgsm/config-default/config-lgsm/onsetserver/_default.cfg index bf4576a6d..389b1411c 100644 --- a/lgsm/config-default/config-lgsm/onsetserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/onsetserver/_default.cfg @@ -116,7 +116,7 @@ steammaster="false" # 6: q # 7: exit # 8: 7 Days to Die -# 9: Gold Source +# 9: GoldSrc # 10: Teamspeak 3 stopmode="2" diff --git a/lgsm/config-default/config-lgsm/opforserver/_default.cfg b/lgsm/config-default/config-lgsm/opforserver/_default.cfg index 87fb58d2f..60cff0eab 100644 --- a/lgsm/config-default/config-lgsm/opforserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/opforserver/_default.cfg @@ -124,7 +124,7 @@ steammaster="true" # 6: q # 7: exit # 8: 7 Days to Die -# 9: Gold Source +# 9: GoldSrc # 10: Teamspeak 3 stopmode="9" @@ -140,7 +140,7 @@ querytype="protocol-valve" ## Game Server Details # Do not edit gamename="Half-Life: Opposing Force" -engine="goldsource" +engine="goldsrc" glibc="2.3.4" #### Directories #### diff --git a/lgsm/config-default/config-lgsm/pcserver/_default.cfg b/lgsm/config-default/config-lgsm/pcserver/_default.cfg index 8cf6c09ca..2f73299f5 100644 --- a/lgsm/config-default/config-lgsm/pcserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/pcserver/_default.cfg @@ -116,7 +116,7 @@ steammaster="false" # 6: q # 7: exit # 8: 7 Days to Die -# 9: Gold Source +# 9: GoldSrc # 10: Teamspeak 3 stopmode="2" diff --git a/lgsm/config-default/config-lgsm/pstbsserver/_default.cfg b/lgsm/config-default/config-lgsm/pstbsserver/_default.cfg index 54cec9d8d..d9ba14c4c 100644 --- a/lgsm/config-default/config-lgsm/pstbsserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/pstbsserver/_default.cfg @@ -125,7 +125,7 @@ steammaster="false" # 6: q # 7: exit # 8: 7 Days to Die -# 9: Gold Source +# 9: GoldSrc # 10: Teamspeak 3 stopmode="2" diff --git a/lgsm/config-default/config-lgsm/pvkiiserver/_default.cfg b/lgsm/config-default/config-lgsm/pvkiiserver/_default.cfg index 84e1bd897..5971d6bbb 100644 --- a/lgsm/config-default/config-lgsm/pvkiiserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/pvkiiserver/_default.cfg @@ -124,7 +124,7 @@ steammaster="true" # 6: q # 7: exit # 8: 7 Days to Die -# 9: Gold Source +# 9: GoldSrc # 10: Teamspeak 3 stopmode="3" diff --git a/lgsm/config-default/config-lgsm/pzserver/_default.cfg b/lgsm/config-default/config-lgsm/pzserver/_default.cfg index 68300b0bc..8c3d198db 100644 --- a/lgsm/config-default/config-lgsm/pzserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/pzserver/_default.cfg @@ -120,7 +120,7 @@ steammaster="false" # 6: q # 7: exit # 8: 7 Days to Die -# 9: Gold Source +# 9: GoldSrc # 10: Teamspeak 3 stopmode="3" diff --git a/lgsm/config-default/config-lgsm/q2server/_default.cfg b/lgsm/config-default/config-lgsm/q2server/_default.cfg index 1647eab1a..9dfa92158 100644 --- a/lgsm/config-default/config-lgsm/q2server/_default.cfg +++ b/lgsm/config-default/config-lgsm/q2server/_default.cfg @@ -110,7 +110,7 @@ sleeptime="0.5" # 6: q # 7: exit # 8: 7 Days to Die -# 9: Gold Source +# 9: GoldSrc # 10: Teamspeak 3 stopmode="3" diff --git a/lgsm/config-default/config-lgsm/q3server/_default.cfg b/lgsm/config-default/config-lgsm/q3server/_default.cfg index cd6634afb..b4f96b023 100644 --- a/lgsm/config-default/config-lgsm/q3server/_default.cfg +++ b/lgsm/config-default/config-lgsm/q3server/_default.cfg @@ -110,7 +110,7 @@ sleeptime="0.5" # 6: q # 7: exit # 8: 7 Days to Die -# 9: Gold Source +# 9: GoldSrc # 10: Teamspeak 3 stopmode="3" diff --git a/lgsm/config-default/config-lgsm/qlserver/_default.cfg b/lgsm/config-default/config-lgsm/qlserver/_default.cfg index 89bcb26a3..656287080 100644 --- a/lgsm/config-default/config-lgsm/qlserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/qlserver/_default.cfg @@ -118,7 +118,7 @@ steammaster="true" # 6: q # 7: exit # 8: 7 Days to Die -# 9: Gold Source +# 9: GoldSrc # 10: Teamspeak 3 stopmode="3" diff --git a/lgsm/config-default/config-lgsm/qwserver/_default.cfg b/lgsm/config-default/config-lgsm/qwserver/_default.cfg index 0bd55debf..4f35f05be 100644 --- a/lgsm/config-default/config-lgsm/qwserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/qwserver/_default.cfg @@ -109,7 +109,7 @@ sleeptime="0.5" # 6: q # 7: exit # 8: 7 Days to Die -# 9: Gold Source +# 9: GoldSrc # 10: Teamspeak 3 stopmode="3" diff --git a/lgsm/config-default/config-lgsm/ricochetserver/_default.cfg b/lgsm/config-default/config-lgsm/ricochetserver/_default.cfg index 787571afd..10bec3c12 100644 --- a/lgsm/config-default/config-lgsm/ricochetserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/ricochetserver/_default.cfg @@ -124,7 +124,7 @@ steammaster="true" # 6: q # 7: exit # 8: 7 Days to Die -# 9: Gold Source +# 9: GoldSrc # 10: Teamspeak 3 stopmode="9" @@ -140,7 +140,7 @@ querytype="protocol-valve" ## Game Server Details # Do not edit gamename="Ricochet" -engine="goldsource" +engine="goldsrc" glibc="2.3.4" #### Directories #### diff --git a/lgsm/config-default/config-lgsm/roserver/_default.cfg b/lgsm/config-default/config-lgsm/roserver/_default.cfg index ab9c1625b..7d6fcc5a6 100644 --- a/lgsm/config-default/config-lgsm/roserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/roserver/_default.cfg @@ -124,7 +124,7 @@ steammaster="false" # 6: q # 7: exit # 8: 7 Days to Die -# 9: Gold Source +# 9: GoldSrc # 10: Teamspeak 3 stopmode="2" diff --git a/lgsm/config-default/config-lgsm/rtcwserver/_default.cfg b/lgsm/config-default/config-lgsm/rtcwserver/_default.cfg index 792c1a7f8..996848ee9 100644 --- a/lgsm/config-default/config-lgsm/rtcwserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/rtcwserver/_default.cfg @@ -110,7 +110,7 @@ sleeptime="0.5" # 6: q # 7: exit # 8: 7 Days to Die -# 9: Gold Source +# 9: GoldSrc # 10: Teamspeak 3 stopmode="3" diff --git a/lgsm/config-default/config-lgsm/rustserver/_default.cfg b/lgsm/config-default/config-lgsm/rustserver/_default.cfg index abb9c79df..7fb73f6d4 100644 --- a/lgsm/config-default/config-lgsm/rustserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/rustserver/_default.cfg @@ -148,7 +148,7 @@ steammaster="false" # 6: q # 7: exit # 8: 7 Days to Die -# 9: Gold Source +# 9: GoldSrc # 10: Teamspeak 3 stopmode="2" diff --git a/lgsm/config-default/config-lgsm/rwserver/_default.cfg b/lgsm/config-default/config-lgsm/rwserver/_default.cfg index 37e755c29..ffa882164 100644 --- a/lgsm/config-default/config-lgsm/rwserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/rwserver/_default.cfg @@ -119,7 +119,7 @@ steammaster="false" # 6: q # 7: exit # 8: 7 Days to Die -# 9: Gold Source +# 9: GoldSrc # 10: Teamspeak 3 stopmode="3" diff --git a/lgsm/config-default/config-lgsm/sampserver/_default.cfg b/lgsm/config-default/config-lgsm/sampserver/_default.cfg index a658daa0c..b04e487ad 100644 --- a/lgsm/config-default/config-lgsm/sampserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/sampserver/_default.cfg @@ -109,7 +109,7 @@ sleeptime="0.5" # 6: q # 7: exit # 8: 7 Days to Die -# 9: Gold Source +# 9: GoldSrc # 10: Teamspeak 3 stopmode="2" diff --git a/lgsm/config-default/config-lgsm/sbotsserver/_default.cfg b/lgsm/config-default/config-lgsm/sbotsserver/_default.cfg index 6fb2b3579..23bcee08b 100644 --- a/lgsm/config-default/config-lgsm/sbotsserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/sbotsserver/_default.cfg @@ -124,7 +124,7 @@ steammaster="false" # 6: q # 7: exit # 8: 7 Days to Die -# 9: Gold Source +# 9: GoldSrc # 10: Teamspeak 3 stopmode="2" diff --git a/lgsm/config-default/config-lgsm/sbserver/_default.cfg b/lgsm/config-default/config-lgsm/sbserver/_default.cfg index fa9560f6c..460407b4e 100644 --- a/lgsm/config-default/config-lgsm/sbserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/sbserver/_default.cfg @@ -122,7 +122,7 @@ steammaster="flase" # 6: q # 7: exit # 8: 7 Days to Die -# 9: Gold Source +# 9: GoldSrc # 10: Teamspeak 3 stopmode="2" diff --git a/lgsm/config-default/config-lgsm/sdtdserver/_default.cfg b/lgsm/config-default/config-lgsm/sdtdserver/_default.cfg index a67e5795d..748d57499 100644 --- a/lgsm/config-default/config-lgsm/sdtdserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/sdtdserver/_default.cfg @@ -119,7 +119,7 @@ steammaster="true" # 6: q # 7: exit # 8: 7 Days to Die -# 9: Gold Source +# 9: GoldSrc # 10: Teamspeak 3 stopmode="8" diff --git a/lgsm/config-default/config-lgsm/sfcserver/_default.cfg b/lgsm/config-default/config-lgsm/sfcserver/_default.cfg index f9d6ad595..bc76cf097 100644 --- a/lgsm/config-default/config-lgsm/sfcserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/sfcserver/_default.cfg @@ -124,7 +124,7 @@ steammaster="true" # 6: q # 7: exit # 8: 7 Days to Die -# 9: Gold Source +# 9: GoldSrc # 10: Teamspeak 3 stopmode="3" diff --git a/lgsm/config-default/config-lgsm/sof2server/_default.cfg b/lgsm/config-default/config-lgsm/sof2server/_default.cfg index bd8110274..0c3036039 100644 --- a/lgsm/config-default/config-lgsm/sof2server/_default.cfg +++ b/lgsm/config-default/config-lgsm/sof2server/_default.cfg @@ -110,7 +110,7 @@ sleeptime="0.5" # 6: q # 7: exit # 8: 7 Days to Die -# 9: Gold Source +# 9: GoldSrc # 10: Teamspeak 3 stopmode="3" diff --git a/lgsm/config-default/config-lgsm/solserver/_default.cfg b/lgsm/config-default/config-lgsm/solserver/_default.cfg index 2a923d554..96fed3f00 100644 --- a/lgsm/config-default/config-lgsm/solserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/solserver/_default.cfg @@ -111,7 +111,7 @@ sleeptime="0.5" # 6: q # 7: exit # 8: 7 Days to Die -# 9: Gold Source +# 9: GoldSrc # 10: Teamspeak 3 stopmode="2" diff --git a/lgsm/config-default/config-lgsm/squadserver/_default.cfg b/lgsm/config-default/config-lgsm/squadserver/_default.cfg index f75bd2667..9fbef2101 100644 --- a/lgsm/config-default/config-lgsm/squadserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/squadserver/_default.cfg @@ -121,7 +121,7 @@ steammaster="false" # 6: q # 7: exit # 8: 7 Days to Die -# 9: Gold Source +# 9: GoldSrc # 10: Teamspeak 3 stopmode="2" diff --git a/lgsm/config-default/config-lgsm/ss3server/_default.cfg b/lgsm/config-default/config-lgsm/ss3server/_default.cfg index f5ab99168..159a054db 100644 --- a/lgsm/config-default/config-lgsm/ss3server/_default.cfg +++ b/lgsm/config-default/config-lgsm/ss3server/_default.cfg @@ -120,7 +120,7 @@ steammaster="false" # 6: q # 7: exit # 8: 7 Days to Die -# 9: Gold Source +# 9: GoldSrc # 10: Teamspeak 3 stopmode="2" diff --git a/lgsm/config-default/config-lgsm/stserver/_default.cfg b/lgsm/config-default/config-lgsm/stserver/_default.cfg index 60fb0ebfa..9c8587035 100644 --- a/lgsm/config-default/config-lgsm/stserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/stserver/_default.cfg @@ -126,7 +126,7 @@ steammaster="false" # 6: q # 7: exit # 8: 7 Days to Die -# 9: Gold Source +# 9: GoldSrc # 10: Teamspeak 3 stopmode="2" diff --git a/lgsm/config-default/config-lgsm/svenserver/_default.cfg b/lgsm/config-default/config-lgsm/svenserver/_default.cfg index 3036470b7..2e3f5cd7f 100644 --- a/lgsm/config-default/config-lgsm/svenserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/svenserver/_default.cfg @@ -123,7 +123,7 @@ steammaster="true" # 6: q # 7: exit # 8: 7 Days to Die -# 9: Gold Source +# 9: GoldSrc # 10: Teamspeak 3 stopmode="9" @@ -139,7 +139,7 @@ querytype="protocol-valve" ## Game Server Details # Do not edit gamename="Sven Co-op" -engine="goldsource" +engine="goldsrc" glibc="2.24" #### Directories #### diff --git a/lgsm/config-default/config-lgsm/terrariaserver/_default.cfg b/lgsm/config-default/config-lgsm/terrariaserver/_default.cfg index 574e18345..b6cd00d28 100644 --- a/lgsm/config-default/config-lgsm/terrariaserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/terrariaserver/_default.cfg @@ -123,7 +123,7 @@ steammaster="false" # 6: q # 7: exit # 8: 7 Days to Die -# 9: Gold Source +# 9: GoldSrc # 10: Teamspeak 3 stopmode="7" diff --git a/lgsm/config-default/config-lgsm/tf2server/_default.cfg b/lgsm/config-default/config-lgsm/tf2server/_default.cfg index 5655d9c9e..f5a8579b3 100644 --- a/lgsm/config-default/config-lgsm/tf2server/_default.cfg +++ b/lgsm/config-default/config-lgsm/tf2server/_default.cfg @@ -129,7 +129,7 @@ steammaster="true" # 6: q # 7: exit # 8: 7 Days to Die -# 9: Gold Source +# 9: GoldSrc # 10: Teamspeak 3 stopmode="3" diff --git a/lgsm/config-default/config-lgsm/tfcserver/_default.cfg b/lgsm/config-default/config-lgsm/tfcserver/_default.cfg index e9158641b..4111b82be 100644 --- a/lgsm/config-default/config-lgsm/tfcserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/tfcserver/_default.cfg @@ -124,7 +124,7 @@ steammaster="true" # 6: q # 7: exit # 8: 7 Days to Die -# 9: Gold Source +# 9: GoldSrc # 10: Teamspeak 3 stopmode="9" @@ -140,7 +140,7 @@ querytype="protocol-valve" ## Game Server Details # Do not edit gamename="Team Fortress Classic" -engine="goldsource" +engine="goldsrc" glibc="2.3.4" #### Directories #### diff --git a/lgsm/config-default/config-lgsm/ts3server/_default.cfg b/lgsm/config-default/config-lgsm/ts3server/_default.cfg index 54fd8ac0e..fe42acd96 100644 --- a/lgsm/config-default/config-lgsm/ts3server/_default.cfg +++ b/lgsm/config-default/config-lgsm/ts3server/_default.cfg @@ -111,7 +111,7 @@ sleeptime="0.5" # 6: q # 7: exit # 8: 7 Days to Die -# 9: Gold Source +# 9: GoldSrc # 10: Teamspeak 3 stopmode="2" diff --git a/lgsm/config-default/config-lgsm/tsserver/_default.cfg b/lgsm/config-default/config-lgsm/tsserver/_default.cfg index 232087699..cd2cb7cdd 100644 --- a/lgsm/config-default/config-lgsm/tsserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/tsserver/_default.cfg @@ -124,7 +124,7 @@ steammaster="true" # 6: q # 7: exit # 8: 7 Days to Die -# 9: Gold Source +# 9: GoldSrc # 10: Teamspeak 3 stopmode="9" @@ -140,7 +140,7 @@ querytype="protocol-valve" ## Game Server Details # Do not edit gamename="The Specialists" -engine="goldsource" +engine="goldsrc" glibc="2.3.4" #### Directories #### diff --git a/lgsm/config-default/config-lgsm/tuserver/_default.cfg b/lgsm/config-default/config-lgsm/tuserver/_default.cfg index 36521c885..cb8f38541 100644 --- a/lgsm/config-default/config-lgsm/tuserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/tuserver/_default.cfg @@ -126,7 +126,7 @@ steammaster="false" # 6: q # 7: exit # 8: 7 Days to Die -# 9: Gold Source +# 9: GoldSrc # 10: Teamspeak 3 stopmode="2" diff --git a/lgsm/config-default/config-lgsm/twserver/_default.cfg b/lgsm/config-default/config-lgsm/twserver/_default.cfg index 4762f3fdc..fd6424783 100644 --- a/lgsm/config-default/config-lgsm/twserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/twserver/_default.cfg @@ -123,7 +123,7 @@ steammaster="false" # 6: q # 7: exit # 8: 7 Days to Die -# 9: Gold Source +# 9: GoldSrc # 10: Teamspeak 3 stopmode="2" diff --git a/lgsm/config-default/config-lgsm/untserver/_default.cfg b/lgsm/config-default/config-lgsm/untserver/_default.cfg index 713ccb7d2..cee9b4867 100644 --- a/lgsm/config-default/config-lgsm/untserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/untserver/_default.cfg @@ -126,7 +126,7 @@ steammaster="false" # 6: q # 7: exit # 8: 7 Days to Die -# 9: Gold Source +# 9: GoldSrc # 10: Teamspeak 3 stopmode="2" diff --git a/lgsm/config-default/config-lgsm/ut2k4server/_default.cfg b/lgsm/config-default/config-lgsm/ut2k4server/_default.cfg index 8e1d6fc55..f317b6126 100644 --- a/lgsm/config-default/config-lgsm/ut2k4server/_default.cfg +++ b/lgsm/config-default/config-lgsm/ut2k4server/_default.cfg @@ -109,7 +109,7 @@ sleeptime="0.5" # 6: q # 7: exit # 8: 7 Days to Die -# 9: Gold Source +# 9: GoldSrc # 10: Teamspeak 3 stopmode="2" diff --git a/lgsm/config-default/config-lgsm/ut3server/_default.cfg b/lgsm/config-default/config-lgsm/ut3server/_default.cfg index 421ce42b3..d785d753c 100644 --- a/lgsm/config-default/config-lgsm/ut3server/_default.cfg +++ b/lgsm/config-default/config-lgsm/ut3server/_default.cfg @@ -120,7 +120,7 @@ sleeptime="0.5" # 6: q # 7: exit # 8: 7 Days to Die -# 9: Gold Source +# 9: GoldSrc # 10: Teamspeak 3 stopmode="2" diff --git a/lgsm/config-default/config-lgsm/ut99server/_default.cfg b/lgsm/config-default/config-lgsm/ut99server/_default.cfg index b74e0b14e..b099f3088 100644 --- a/lgsm/config-default/config-lgsm/ut99server/_default.cfg +++ b/lgsm/config-default/config-lgsm/ut99server/_default.cfg @@ -109,7 +109,7 @@ sleeptime="0.5" # 6: q # 7: exit # 8: 7 Days to Die -# 9: Gold Source +# 9: GoldSrc # 10: Teamspeak 3 stopmode="2" diff --git a/lgsm/config-default/config-lgsm/utserver/_default.cfg b/lgsm/config-default/config-lgsm/utserver/_default.cfg index fe8da5aca..4612d9dc1 100644 --- a/lgsm/config-default/config-lgsm/utserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/utserver/_default.cfg @@ -113,7 +113,7 @@ sleeptime="0.5" # 6: q # 7: exit # 8: 7 Days to Die -# 9: Gold Source +# 9: GoldSrc # 10: Teamspeak 3 stopmode="2" diff --git a/lgsm/config-default/config-lgsm/vsserver/_default.cfg b/lgsm/config-default/config-lgsm/vsserver/_default.cfg index 484929179..9e4467ae8 100644 --- a/lgsm/config-default/config-lgsm/vsserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/vsserver/_default.cfg @@ -124,7 +124,7 @@ steammaster="true" # 6: q # 7: exit # 8: 7 Days to Die -# 9: Gold Source +# 9: GoldSrc # 10: Teamspeak 3 stopmode="9" @@ -140,7 +140,7 @@ querytype="protocol-valve" ## Game Server Details # Do not edit gamename="Vampire Slayer" -engine="goldsource" +engine="goldsrc" glibc="2.3.4" #### Directories #### diff --git a/lgsm/config-default/config-lgsm/wetserver/_default.cfg b/lgsm/config-default/config-lgsm/wetserver/_default.cfg index e52be9249..3074dec92 100644 --- a/lgsm/config-default/config-lgsm/wetserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/wetserver/_default.cfg @@ -105,7 +105,7 @@ sleeptime="0.5" # 6: q # 7: exit # 8: 7 Days to Die -# 9: Gold Source +# 9: GoldSrc # 10: Teamspeak 3 stopmode="3" diff --git a/lgsm/config-default/config-lgsm/wfserver/_default.cfg b/lgsm/config-default/config-lgsm/wfserver/_default.cfg index f5da24af7..a4860de5d 100644 --- a/lgsm/config-default/config-lgsm/wfserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/wfserver/_default.cfg @@ -110,7 +110,7 @@ sleeptime="0.5" # 6: q # 7: exit # 8: 7 Days to Die -# 9: Gold Source +# 9: GoldSrc # 10: Teamspeak 3 stopmode="3" diff --git a/lgsm/config-default/config-lgsm/wurmserver/_default.cfg b/lgsm/config-default/config-lgsm/wurmserver/_default.cfg index 47b0fbc0b..cb22a8494 100644 --- a/lgsm/config-default/config-lgsm/wurmserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/wurmserver/_default.cfg @@ -115,7 +115,7 @@ steammaster="false" # 6: q # 7: exit # 8: 7 Days to Die -# 9: Gold Source +# 9: GoldSrc # 10: Teamspeak 3 stopmode="2" diff --git a/lgsm/config-default/config-lgsm/zmrserver/_default.cfg b/lgsm/config-default/config-lgsm/zmrserver/_default.cfg index db1853930..4a99b33e4 100644 --- a/lgsm/config-default/config-lgsm/zmrserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/zmrserver/_default.cfg @@ -124,7 +124,7 @@ steammaster="true" # 6: q # 7: exit # 8: 7 Days to Die -# 9: Gold Source +# 9: GoldSrc # 10: Teamspeak 3 stopmode="3" diff --git a/lgsm/config-default/config-lgsm/zpsserver/_default.cfg b/lgsm/config-default/config-lgsm/zpsserver/_default.cfg index bfeceda7e..6662da3c7 100644 --- a/lgsm/config-default/config-lgsm/zpsserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/zpsserver/_default.cfg @@ -129,7 +129,7 @@ steammaster="true" # 6: q # 7: exit # 8: 7 Days to Die -# 9: Gold Source +# 9: GoldSrc # 10: Teamspeak 3 stopmode="3" diff --git a/lgsm/functions/command_debug.sh b/lgsm/functions/command_debug.sh index 1427403ec..9d8110c50 100644 --- a/lgsm/functions/command_debug.sh +++ b/lgsm/functions/command_debug.sh @@ -67,7 +67,7 @@ if [ "${serverpassword}" ]; then echo -e "${lightblue}Server password:\t${default}${serverpassword}" fi echo -e "${lightblue}Start parameters:${default}" -if [ "${engine}" == "source" ]||[ "${engine}" == "goldsource" ]; then +if [ "${engine}" == "source" ]||[ "${engine}" == "goldsrc" ]; then echo -e "${executable} ${parms} -debug" else echo -e "${executable} ${parms}" @@ -98,7 +98,7 @@ trap fn_lockfile_trap INT cd "${executabledir}" || exit # Note: do not add double quotes to ${executable} ${parms}. -if [ "${engine}" == "source" ]||[ "${engine}" == "goldsource" ]; then +if [ "${engine}" == "source" ]||[ "${engine}" == "goldsrc" ]; then ${executable} ${parms} -debug elif [ "${engine}" == "realvirtuality" ]; then # Arma3 requires semicolons in the module list, which need to diff --git a/lgsm/functions/command_stop.sh b/lgsm/functions/command_stop.sh index 40e3f92e3..98f41b487 100644 --- a/lgsm/functions/command_stop.sh +++ b/lgsm/functions/command_stop.sh @@ -65,15 +65,15 @@ fn_stop_graceful_cmd(){ fn_sleep_time } -# Attempts graceful shutdown of goldsource using rcon 'quit' command. +# Attempts graceful shutdown of goldsrc using rcon 'quit' command. # There is only a 3 second delay before a forced a tmux shutdown -# as Goldsource servers 'quit' command does a restart rather than shutdown. -fn_stop_graceful_goldsource(){ +# as GoldSrc servers 'quit' command does a restart rather than shutdown. +fn_stop_graceful_goldsrc(){ fn_print_dots "Graceful: sending \"quit\"" fn_script_log_info "Graceful: sending \"quit\"" # sends quit tmux send -t "${selfname}" quit ENTER > /dev/null 2>&1 - # Waits 3 seconds as goldsource servers restart with the quit command. + # Waits 3 seconds as goldsrc servers restart with the quit command. for seconds in {1..3}; do sleep 1 fn_print_dots "Graceful: sending \"quit\": ${seconds}" @@ -199,7 +199,7 @@ fn_stop_graceful_select(){ elif [ "${stopmode}" == "8" ]; then fn_stop_graceful_sdtd elif [ "${stopmode}" == "9" ]; then - fn_stop_graceful_goldsource + fn_stop_graceful_goldsrc fi } diff --git a/lgsm/functions/info_config.sh b/lgsm/functions/info_config.sh index ef461041a..485893399 100644 --- a/lgsm/functions/info_config.sh +++ b/lgsm/functions/info_config.sh @@ -1460,7 +1460,7 @@ elif [ "${shortname}" == "sol" ]; then elif [ "${shortname}" == "sof2" ]; then fn_info_config_sof2 # Source Engine Games -elif [ "${engine}" == "source" ]||[ "${engine}" == "goldsource" ]; then +elif [ "${engine}" == "source" ]||[ "${engine}" == "goldsrc" ]; then fn_info_config_source # Starbound elif [ "${shortname}" == "sb" ]; then diff --git a/lgsm/functions/info_messages.sh b/lgsm/functions/info_messages.sh index 035cc6abe..8f27ff06a 100644 --- a/lgsm/functions/info_messages.sh +++ b/lgsm/functions/info_messages.sh @@ -553,7 +553,7 @@ fn_info_message_ports(){ fi done # engines/games that require editing the parms. - local ports_edit_array=( "goldsource" "Factorio" "Hurtworld" "iw3.0" "ioquake3" "qfusion" "Rust" "Soldat" "spark" "source" "starbound" "unreal4" "realvirtuality" "Unturned" ) + local ports_edit_array=( "goldsrc" "Factorio" "Hurtworld" "iw3.0" "ioquake3" "qfusion" "Rust" "Soldat" "spark" "source" "starbound" "unreal4" "realvirtuality" "Unturned" ) for port_edit in "${ports_edit_array[@]}" do if [ "${engine}" == "${port_edit}" ]||[ "${gamename}" == "${port_edit}" ]||[ "${shortname}" == "${port_edit}" ]; then @@ -749,7 +749,7 @@ fn_info_message_factorio(){ } | column -s $'\t' -t } -fn_info_message_goldsource(){ +fn_info_message_goldsrc(){ echo -e "netstat -atunp | grep hlds_linux" echo -e "" { @@ -1468,8 +1468,8 @@ fn_info_message_select_engine(){ fn_info_message_risingworld elif [ "${shortname}" == "wet" ]; then fn_info_message_wolfensteinenemyterritory - elif [ "${engine}" == "goldsource" ]; then - fn_info_message_goldsource + elif [ "${engine}" == "goldsrc" ]; then + fn_info_message_goldsrc elif [ "${engine}" == "source" ]; then fn_info_message_source elif [ "${engine}" == "spark" ]; then diff --git a/lgsm/functions/info_parms.sh b/lgsm/functions/info_parms.sh index a4d483bb3..620abf3ec 100644 --- a/lgsm/functions/info_parms.sh +++ b/lgsm/functions/info_parms.sh @@ -284,7 +284,7 @@ elif [ "${shortname}" == "sol" ]; then # Serious Sam elif [ "${shortname}" == "ss3" ]; then fn_info_parms_ss3 -elif [ "${engine}" == "source" ]||[ "${engine}" == "goldsource" ]; then +elif [ "${engine}" == "source" ]||[ "${engine}" == "goldsrc" ]; then fn_info_parms_source # Spark elif [ "${engine}" == "spark" ]; then diff --git a/lgsm/functions/install_server_files.sh b/lgsm/functions/install_server_files.sh index 859d69617..d4a46718b 100644 --- a/lgsm/functions/install_server_files.sh +++ b/lgsm/functions/install_server_files.sh @@ -113,7 +113,7 @@ fn_install_server_files_steamcmd(){ local exitcode=$? fi elif [ "${counter}" -ge "5" ]; then - if [ "${engine}" == "goldsource" ]; then + if [ "${engine}" == "goldsrc" ]; then ${unbuffer} ${steamcmdcommand} +login "${steamuser}" "${steampass}" +force_install_dir "${serverfiles}" +app_set_config 90 mod "${appidmod}" +app_update "${appid}" -beta "${branch}" validate +quit local exitcode=$? else @@ -128,10 +128,10 @@ fn_install_server_files_steamcmd(){ fi done - # Goldsource servers commonly fail to download all the server files required. + # GoldSrc servers commonly fail to download all the server files required. # Validating a few of times may reduce the chance of this issue. - if [ "${engine}" == "goldsource" ]; then - fn_print_information_nl "Goldsource servers commonly fail to download all the server files required. Validating a few of times may reduce the chance of this issue." + if [ "${engine}" == "goldsrc" ]; then + fn_print_information_nl "GoldSrc servers commonly fail to download all the server files required. Validating a few of times may reduce the chance of this issue." counter="0" while [ "${counter}" -le "4" ]; do counter=$((counter+1)) diff --git a/lgsm/functions/query_gsquery.py b/lgsm/functions/query_gsquery.py index f6e3ce168..419edddda 100644 --- a/lgsm/functions/query_gsquery.py +++ b/lgsm/functions/query_gsquery.py @@ -17,7 +17,7 @@ class gsquery: self.server_response_timeout = 5 self.default_buffer_length = 1024 # - sourcequery=['protocol-valve','avalanche3.0','barotrauma','madness','quakelive','realvirtuality','refractor','source','goldsource','spark','starbound','unity3d','unreal4','wurm'] + sourcequery=['protocol-valve','avalanche3.0','barotrauma','madness','quakelive','realvirtuality','refractor','source','goldsrc','spark','starbound','unity3d','unreal4','wurm'] idtech2query=['protocol-quake3','idtech2','quake','iw2.0'] idtech3query=['protocol-quake3','iw3.0','ioquake3','qfusion'] minecraftquery=['minecraft','lwjgl2'] diff --git a/tests/tests_defaultcfg/defaultcfg_1.txt b/tests/tests_defaultcfg/defaultcfg_1.txt index 9a4df6c0b..7bd9963c6 100644 --- a/tests/tests_defaultcfg/defaultcfg_1.txt +++ b/tests/tests_defaultcfg/defaultcfg_1.txt @@ -39,7 +39,7 @@ # 6: q # 7: exit # 8: 7 Days to Die -# 9: Gold Source +# 9: GoldSrc # 10: Teamspeak 3 ## Game Server Details # Do not edit From 147057e23ad9ccd3a392fd784f6be312d0c62969 Mon Sep 17 00:00:00 2001 From: RuioWolf Date: Sun, 5 Apr 2020 04:55:57 +0800 Subject: [PATCH 327/534] fix(alert): resolve bug with telegram curlcustomstring error I'm getting this error while trying to use `curlcustomstring="--socks5 192.168.191.1:6080"` as proxy: ```shell [ .... ] Alert tf2server: Sending Telegram alertcurl: option --socks5 192.168.191.1:6080 : is unknown curl: try 'curl --help' or 'curl --manual' for more information ``` So I make a fix for it. As far as I'm concerned, if `curlcustomstring` contains multiple options it should not use that *quotes*. --- lgsm/functions/alert_telegram.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lgsm/functions/alert_telegram.sh b/lgsm/functions/alert_telegram.sh index 6d7403660..ca48f32be 100644 --- a/lgsm/functions/alert_telegram.sh +++ b/lgsm/functions/alert_telegram.sh @@ -18,7 +18,7 @@ EOF ) fn_print_dots "Sending Telegram alert" -telegramsend=$(curl -sSL -H "Content-Type: application/json" -X POST -d """${json}""" "https://api.telegram.org/bot${telegramtoken}/sendMessage" "${curlcustomstring}" | grep "error_code") +telegramsend=$(curl -sSL -H "Content-Type: application/json" -X POST -d """${json}""" ${curlcustomstring} "https://api.telegram.org/bot${telegramtoken}/sendMessage" | grep "error_code") if [ "${telegramsend}" ]; then fn_print_fail_nl "Sending Telegram alert: ${telegramsend}" From 390fc2326523bf639966b6874ac5f995a8d285cd Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Sat, 4 Apr 2020 21:56:36 +0100 Subject: [PATCH 328/534] fix(validate): resolve validate not functioning for non branch (#2802) --- lgsm/functions/command_validate.sh | 16 +++++++-- lgsm/functions/info_messages.sh | 2 +- lgsm/functions/install_server_files.sh | 47 ++++++++++++++++++++------ lgsm/functions/update_steamcmd.sh | 16 +++++++-- 4 files changed, 64 insertions(+), 17 deletions(-) diff --git a/lgsm/functions/command_validate.sh b/lgsm/functions/command_validate.sh index 6c0684a3b..c48b7e16a 100644 --- a/lgsm/functions/command_validate.sh +++ b/lgsm/functions/command_validate.sh @@ -25,17 +25,27 @@ fn_validate(){ if [ -d "${steamcmddir}" ]; then cd "${steamcmddir}" || exit fi - # Detects if unbuffer command is available for 32 bit distributions only. + # 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 + # If GoldSrc (appid 90) servers. GoldSrc (appid 90) require extra commands. if [ "${appid}" == "90" ]; then - ${unbuffer} ${steamcmdcommand} +login "${steamuser}" "${steampass}" +force_install_dir "${serverfiles}" +app_info_print 70 +app_set_config 90 mod "${appidmod}" +app_update "${appid}" "${branch}" +app_update "${appid}" -beta "${branch}" validate +quit | tee -a "${lgsmlog}" - else + # If using a specific branch. + if [ -n "${branch}" ]; then + ${unbuffer} ${steamcmdcommand} +login "${steamuser}" "${steampass}" +force_install_dir "${serverfiles}" +app_info_print 70 +app_set_config 90 mod "${appidmod}" +app_update "${appid}" "${branch}" +app_update "${appid}" -beta "${branch}" validate +quit | tee -a "${lgsmlog}" + else + ${unbuffer} ${steamcmdcommand} +login "${steamuser}" "${steampass}" +force_install_dir "${serverfiles}" +app_info_print 70 +app_set_config 90 mod "${appidmod}" +app_update "${appid}" "${branch}" +app_update "${appid}" validate +quit | tee -a "${lgsmlog}" + fi + # All other servers. + elif [ -n "${branch}" ]; then ${unbuffer} ${steamcmdcommand} +login "${steamuser}" "${steampass}" +force_install_dir "${serverfiles}" +app_update "${appid}" -beta "${branch}" validate +quit | tee -a "${lgsmlog}" + else + ${unbuffer} ${steamcmdcommand} +login "${steamuser}" "${steampass}" +force_install_dir "${serverfiles}" +app_update "${appid}" validate +quit | tee -a "${lgsmlog}" fi + exitcode=$? fn_print_dots "Validating server: SteamCMD" if [ "${exitcode}" != "0" ]; then diff --git a/lgsm/functions/info_messages.sh b/lgsm/functions/info_messages.sh index 8f27ff06a..87d66fb5e 100644 --- a/lgsm/functions/info_messages.sh +++ b/lgsm/functions/info_messages.sh @@ -186,7 +186,7 @@ fn_info_message_gameserver(){ fi # Branch - if [ "${branch}" ]; then + if [ -n "${branch}" ]; then echo -e "${lightblue}Branch:\t${default}${branch}" fi diff --git a/lgsm/functions/install_server_files.sh b/lgsm/functions/install_server_files.sh index d4a46718b..3ee515dbc 100644 --- a/lgsm/functions/install_server_files.sh +++ b/lgsm/functions/install_server_files.sh @@ -105,19 +105,40 @@ fn_install_server_files_steamcmd(){ fi if [ "${counter}" -le "4" ]; then + # If GoldSrc (appid 90) servers. GoldSrc (appid 90) require extra commands. if [ "${appid}" == "90" ]; then - ${unbuffer} ${steamcmdcommand} +login "${steamuser}" "${steampass}" +force_install_dir "${serverfiles}" +app_set_config 90 mod "${appidmod}" +app_update "${appid}" -beta "${branch}" +quit - local exitcode=$? + # If using a specific branch. + if [ -n "${branch}" ]; then + ${unbuffer} ${steamcmdcommand} +login "${steamuser}" "${steampass}" +force_install_dir "${serverfiles}" +app_set_config 90 mod "${appidmod}" +app_update "${appid}" -beta "${branch}" +quit + else + ${unbuffer} ${steamcmdcommand} +login "${steamuser}" "${steampass}" +force_install_dir "${serverfiles}" +app_set_config 90 mod "${appidmod}" +app_update "${appid}" +quit + fi + # All other servers. else - ${unbuffer} ${steamcmdcommand} +login "${steamuser}" "${steampass}" +force_install_dir "${serverfiles}" +app_update "${appid}" -beta "${branch}" +quit - local exitcode=$? + if [ -n "${branch}" ]; then + ${unbuffer} ${steamcmdcommand} +login "${steamuser}" "${steampass}" +force_install_dir "${serverfiles}" +app_update -beta "${branch}" +quit + else + ${unbuffer} ${steamcmdcommand} +login "${steamuser}" "${steampass}" +force_install_dir "${serverfiles}" +app_update "${appid}" +quit + fi fi + local exitcode=$? elif [ "${counter}" -ge "5" ]; then - if [ "${engine}" == "goldsrc" ]; then - ${unbuffer} ${steamcmdcommand} +login "${steamuser}" "${steampass}" +force_install_dir "${serverfiles}" +app_set_config 90 mod "${appidmod}" +app_update "${appid}" -beta "${branch}" validate +quit + # If GoldSrc (appid 90) servers. GoldSrc (appid 90) require extra commands. + if [ "${appid}" == "90" ]; then + # If using a specific branch. + if [ -n "${branch}" ]; then + ${unbuffer} ${steamcmdcommand} +login "${steamuser}" "${steampass}" +force_install_dir "${serverfiles}" +app_set_config 90 mod "${appidmod}" +app_update "${appid}" -beta "${branch}" validate +quit + else + ${unbuffer} ${steamcmdcommand} +login "${steamuser}" "${steampass}" +force_install_dir "${serverfiles}" +app_set_config 90 mod "${appidmod}" +app_update "${appid}" validate +quit + fi local exitcode=$? + # All other servers. else - ${unbuffer} ${steamcmdcommand} +login "${steamuser}" "${steampass}" +force_install_dir "${serverfiles}" +app_update "${appid}" -beta "${branch}" validate +quit + if [ -n "${branch}" ]; then + ${unbuffer} ${steamcmdcommand} +login "${steamuser}" "${steampass}" +force_install_dir "${serverfiles}" +app_update "${appid}" -beta "${branch}" validate +quit + else + ${unbuffer} ${steamcmdcommand} +login "${steamuser}" "${steampass}" +force_install_dir "${serverfiles}" +app_update "${appid}" validate +quit + fi local exitcode=$? fi fi @@ -128,14 +149,18 @@ fn_install_server_files_steamcmd(){ fi done - # GoldSrc servers commonly fail to download all the server files required. + # GoldSrc (appid 90) servers commonly fail to download all the server files required. # Validating a few of times may reduce the chance of this issue. - if [ "${engine}" == "goldsrc" ]; then - fn_print_information_nl "GoldSrc servers commonly fail to download all the server files required. Validating a few of times may reduce the chance of this issue." + if [ "${appid}" == "90" ]; then + fn_print_information_nl "GoldSrc servers commonly fail to download all the server files required. Validating a few of times may reduce the chance of this issue." counter="0" while [ "${counter}" -le "4" ]; do counter=$((counter+1)) - ${unbuffer} ${steamcmdcommand} +login "${steamuser}" "${steampass}" +force_install_dir "${serverfiles}" +app_set_config 90 mod "${appidmod}" +app_update "${appid}" "${branch}" validate +quit + if [ -n "${branch}" ]; then + ${unbuffer} ${steamcmdcommand} +login "${steamuser}" "${steampass}" +force_install_dir "${serverfiles}" +app_set_config 90 mod "${appidmod}" +app_update "${appid}" "${branch}" validate +quit + else + ${unbuffer} ${steamcmdcommand} +login "${steamuser}" "${steampass}" +force_install_dir "${serverfiles}" +app_set_config 90 mod "${appidmod}" +app_update "${appid}" validate +quit + fi local exitcode=$? done fi diff --git a/lgsm/functions/update_steamcmd.sh b/lgsm/functions/update_steamcmd.sh index 3715ff993..8e4918494 100644 --- a/lgsm/functions/update_steamcmd.sh +++ b/lgsm/functions/update_steamcmd.sh @@ -18,10 +18,22 @@ fn_update_steamcmd_dl(){ if [ -d "${steamcmddir}" ]; then cd "${steamcmddir}" || exit fi + + # If GoldSrc (appid 90) servers. GoldSrc (appid 90) require extra commands. if [ "${appid}" == "90" ]; then - ${unbuffer} ${steamcmdcommand} +login "${steamuser}" "${steampass}" +force_install_dir "${serverfiles}" +app_set_config 90 mod "${appidmod}" +app_update "${appid}" -beta "${branch}" +quit | tee -a "${lgsmlog}" + # If using a specific branch. + if [ -n "${branch}" ]; then + ${unbuffer} ${steamcmdcommand} +login "${steamuser}" "${steampass}" +force_install_dir "${serverfiles}" +app_set_config 90 mod "${appidmod}" +app_update "${appid}" -beta "${branch}" +quit | tee -a "${lgsmlog}" + else + ${unbuffer} ${steamcmdcommand} +login "${steamuser}" "${steampass}" +force_install_dir "${serverfiles}" +app_set_config 90 mod "${appidmod}" +app_update "${appid}" +quit | tee -a "${lgsmlog}" + fi + # All other servers. else - ${unbuffer} ${steamcmdcommand} +login "${steamuser}" "${steampass}" +force_install_dir "${serverfiles}" +app_update "${appid}" -beta "${branch}" +quit | tee -a "${lgsmlog}" + if [ -n "${branch}" ]; then + ${unbuffer} ${steamcmdcommand} +login "${steamuser}" "${steampass}" +force_install_dir "${serverfiles}" +app_update "${appid}" -beta "${branch}" +quit | tee -a "${lgsmlog}" + else + ${unbuffer} ${steamcmdcommand} +login "${steamuser}" "${steampass}" +force_install_dir "${serverfiles}" +app_update "${appid}" +quit | tee -a "${lgsmlog}" + fi fi fix.sh } From ed536eade6df23e9e04b31fb58cb5f63aca9eb5c Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Mon, 6 Apr 2020 21:31:22 +0100 Subject: [PATCH 329/534] feat(update): multi instance servers will reboot automatically on update (#2800) --- lgsm/functions/check_last_update.sh | 19 +++++++++++++++++++ lgsm/functions/command_backup.sh | 12 ++++++------ lgsm/functions/command_debug.sh | 6 +++--- lgsm/functions/command_monitor.sh | 9 +++++---- lgsm/functions/command_start.sh | 5 ++++- lgsm/functions/command_stop.sh | 4 ++-- lgsm/functions/command_update.sh | 1 + lgsm/functions/core_functions.sh | 10 ++++++++++ lgsm/functions/logs.sh | 5 ++--- lgsm/functions/update_factorio.sh | 1 + lgsm/functions/update_minecraft.sh | 1 + lgsm/functions/update_minecraft_bedrock.sh | 1 + lgsm/functions/update_mta.sh | 1 + lgsm/functions/update_mumble.sh | 1 + lgsm/functions/update_steamcmd.sh | 7 +++++++ linuxgsm.sh | 4 ++-- tests/tests_fctrserver.sh | 8 ++++---- tests/tests_jc2server.sh | 8 ++++---- tests/tests_mcserver.sh | 8 ++++---- tests/tests_shellcheck.sh | 2 +- tests/tests_ts3server.sh | 8 ++++---- 21 files changed, 83 insertions(+), 38 deletions(-) create mode 100644 lgsm/functions/check_last_update.sh diff --git a/lgsm/functions/check_last_update.sh b/lgsm/functions/check_last_update.sh new file mode 100644 index 000000000..55e9f21d2 --- /dev/null +++ b/lgsm/functions/check_last_update.sh @@ -0,0 +1,19 @@ +#!/bin/bash +# LinuxGSM check_last_update.sh function +# Author: Daniel Gibbs +# Website: https://linuxgsm.com +# Description: Checks lock file to see when last update happened. +# Will reboot server if instance not rebooted since update. + +if [ -f "${lockdir}/${selfname}-laststart.lock" ]; then + laststart=$(cat "${lockdir}/${selfname}-laststart.lock") +fi +if [ -f "${lockdir}/lastupdate.lock" ]; then + lastupdate=$(cat "${lockdir}/lastupdate.lock") +fi + +if [ ! -f "${lockdir}/${selfname}-laststart.lock" ]||[ "${laststart}" -lt "${lastupdate}" ]; then + fn_print_info "${selfname} has not been restarted since last update" + fn_script_log_info "${selfname} has not been restarted since last update" + command_restart.sh +fi diff --git a/lgsm/functions/command_backup.sh b/lgsm/functions/command_backup.sh index 724954a2d..a11753127 100644 --- a/lgsm/functions/command_backup.sh +++ b/lgsm/functions/command_backup.sh @@ -22,13 +22,13 @@ fn_backup_trap(){ fn_print_removed_eol_nl fn_script_log_info "Backup ${backupname}.tar.gz: REMOVED" # Remove lock file. - rm -f "${tmpdir:?}/.backup.lock" + rm -f "${lockdir:?}/.backup.lock" core_exit.sh } # Check if a backup is pending or has been aborted using .backup.lock. fn_backup_check_lockfile(){ - if [ -f "${tmpdir}/.backup.lock" ]; then + if [ -f "${lockdir}/.backup.lock" ]; then fn_print_info_nl "Lock file found: Backup is currently running" fn_script_log_error "Lock file found: Backup is currently running: ${tmpdir}/.backup.lock" core_exit.sh @@ -115,9 +115,9 @@ fn_backup_migrate_olddir(){ fn_backup_create_lockfile(){ # Create lockfile. - date '+%s' > "${tmpdir}/.backup.lock" + date '+%s' > "${lockdir}/.backup.lock" fn_script_log_info "Lockfile generated" - fn_script_log_info "${tmpdir}/.backup.lock" + fn_script_log_info "${lockdir}/.backup.lock" # trap to remove lockfile on quit. trap fn_backup_trap INT } @@ -138,7 +138,7 @@ fn_backup_compression(){ core_exit.sh fi - tar -czf "${backupdir}/${backupname}.tar.gz" -C "${rootdir}" --exclude "${excludedir}" --exclude "${tmpdir}/.backup.lock" ./. + tar -czf "${backupdir}/${backupname}.tar.gz" -C "${rootdir}" --exclude "${excludedir}" --exclude "${lockdir}/.backup.lock" ./. local exitcode=$? if [ ${exitcode} -ne 0 ]; then fn_print_fail_eol @@ -152,7 +152,7 @@ fn_backup_compression(){ fn_script_log_pass "Backup created: ${backupname}.tar.gz, total size $(du -sh "${backupdir}/${backupname}.tar.gz" | awk '{print $1}')" fi # Remove lock file - rm -f "${tmpdir:?}/.backup.lock" + rm -f "${lockdir:?}/.backup.lock" } # Clear old backups according to maxbackups and maxbackupdays variables. diff --git a/lgsm/functions/command_debug.sh b/lgsm/functions/command_debug.sh index 9d8110c50..4140ddcdd 100644 --- a/lgsm/functions/command_debug.sh +++ b/lgsm/functions/command_debug.sh @@ -11,7 +11,7 @@ local function_selfname=$(basename "$(readlink -f "${BASH_SOURCE[0]}")") # Trap to remove lockfile on quit. fn_lockfile_trap(){ # Remove lockfile. - rm -f "${rootdir:?}/${lockselfname}" + rm -f "${lockdir:?}/${selfname}.lock" # resets terminal. Servers can sometimes mess up the terminal on exit. reset fn_print_ok_nl "Closing debug" @@ -90,9 +90,9 @@ fn_script_log_info "Starting debug" fn_print_ok_nl "Starting debug" # Create lockfile. -date '+%s' > "${rootdir}/${lockselfname}" +date '+%s' > "${lockdir}/${selfname}.lock" fn_script_log_info "Lockfile generated" -fn_script_log_info "${rootdir}/${lockselfname}" +fn_script_log_info "${lockdir}/${selfname}.lock" # trap to remove lockfile on quit. trap fn_lockfile_trap INT diff --git a/lgsm/functions/command_monitor.sh b/lgsm/functions/command_monitor.sh index ae7d25388..5c4ead99a 100644 --- a/lgsm/functions/command_monitor.sh +++ b/lgsm/functions/command_monitor.sh @@ -12,7 +12,7 @@ local function_selfname=$(basename "$(readlink -f "${BASH_SOURCE[0]}")") fn_monitor_check_lockfile(){ # Monitor does not run it lockfile is not found. - if [ ! -f "${rootdir}/${lockselfname}" ]; then + if [ ! -f "${lockdir}/${selfname}.lock" ]; then fn_print_dots "Checking lockfile: " fn_print_checking_eol fn_script_log_info "Checking lockfile: CHECKING" @@ -26,8 +26,8 @@ fn_monitor_check_lockfile(){ fi # Fix if lockfile is not unix time or contains letters - if [[ "$(cat "${rootdir}/${lockselfname}")" =~ [A-Za-z] ]]; then - date '+%s' > "${rootdir}/${lockselfname}" + if [[ "$(cat "${lockdir}/${selfname}.lock")" =~ [A-Za-z] ]]; then + date '+%s' > "${lockdir}/${selfname}.lock" fi } @@ -108,7 +108,7 @@ for queryattempt in {1..5}; do fn_script_log_info "Querying port: ${querymethod}: ${ip}:${queryport} : ${queryattempt} : QUERYING" fn_sleep_time # querydelay - if [ "$(cat "${rootdir}/${lockselfname}")" -gt "$(date "+%s" -d "${querydelay} mins ago")" ]; then + if [ "$(cat "${lockdir}/${selfname}.lock")" -gt "$(date "+%s" -d "${querydelay} mins ago")" ]; then fn_print_ok "Querying port: ${querymethod}: ${ip}:${queryport} : ${totalseconds}/${queryattempt}: " fn_print_delay_eol_nl fn_script_log_info "Querying port: ${querymethod}: ${ip}:${queryport} : ${queryattempt} : DELAY" @@ -236,6 +236,7 @@ info_parms.sh # query pre-checks fn_monitor_check_lockfile +check_last_update.sh fn_monitor_check_update fn_monitor_check_session # Monitor will not continue if session only check. diff --git a/lgsm/functions/command_start.sh b/lgsm/functions/command_start.sh index bf5c65146..be230c26b 100644 --- a/lgsm/functions/command_start.sh +++ b/lgsm/functions/command_start.sh @@ -62,13 +62,16 @@ fn_start_tmux(){ fi # Create lockfile - date > "${rootdir}/${lockselfname}" + date > "${lockdir}/${selfname}.lock" cd "${executabledir}" || exit tmux new-session -d -x "${sessionwidth}" -y "${sessionheight}" -s "${selfname}" "${executable} ${parms}" 2> "${lgsmlogdir}/.${selfname}-tmux-error.tmp" # Create logfile. touch "${consolelog}" + # Create last start lock file + date +%s > "${lockdir}/${selfname}-laststart.lock" + # Get tmux version. tmuxversion=$(tmux -V | sed "s/tmux //" | sed -n '1 p') # Tmux compiled from source will return "master", therefore ignore it. diff --git a/lgsm/functions/command_stop.sh b/lgsm/functions/command_stop.sh index 98f41b487..fecd0fac5 100644 --- a/lgsm/functions/command_stop.sh +++ b/lgsm/functions/command_stop.sh @@ -241,8 +241,8 @@ fn_print_dots "${servername}" info_config.sh fn_stop_pre_check # Remove lockfile. -if [ -f "${rootdir}/${lockselfname}" ]; then - rm -f "${rootdir:?}/${lockselfname}" +if [ -f "${lockdir}/${selfname}.lock" ]; then + rm -f "${lockdir:?}/${selfname}.lock" fi if [ -z "${exitbypass}" ]; then diff --git a/lgsm/functions/command_update.sh b/lgsm/functions/command_update.sh index 64cfcb2f5..86a9a1cc4 100644 --- a/lgsm/functions/command_update.sh +++ b/lgsm/functions/command_update.sh @@ -11,6 +11,7 @@ local function_selfname=$(basename "$(readlink -f "${BASH_SOURCE[0]}")") fn_print_dots "" check.sh logs.sh +check_last_update.sh if [ "${shortname}" == "ts3" ]; then update_ts3.sh diff --git a/lgsm/functions/core_functions.sh b/lgsm/functions/core_functions.sh index 54d7ec6a2..d1969c920 100644 --- a/lgsm/functions/core_functions.sh +++ b/lgsm/functions/core_functions.sh @@ -188,6 +188,11 @@ functionfile="${FUNCNAME[0]}" fn_fetch_function } +check_last_update.sh(){ +functionfile="${FUNCNAME[0]}" +fn_fetch_function +} + check_logs.sh(){ functionfile="${FUNCNAME[0]}" fn_fetch_function @@ -701,6 +706,11 @@ if [ ! -d "${tmpdir}" ]; then mkdir -p "${tmpdir}" fi +# Creates lock dir if missing +if [ ! -d "${lockdir}" ]; then + mkdir -p "${lockdir}" +fi + # Calls on-screen messages (bootstrap) core_messages.sh diff --git a/lgsm/functions/logs.sh b/lgsm/functions/logs.sh index dc55456ef..001391778 100644 --- a/lgsm/functions/logs.sh +++ b/lgsm/functions/logs.sh @@ -41,8 +41,7 @@ if [ "$(find "${lgsmlogdir}"/ -type f -mtime +"${logdays}" | wc -l)" -ne "0" ]; # Setting up counting variables scriptcount="0" ; consolecount="0" ; gamecount="0" ; srcdscount="0" ; smcount="0" ; ulxcount="0" ; darkrpcount="0" ; legacycount="0" fn_sleep_time - fn_print_ok_nl "Starting" - fn_print_info_nl "Removing logs older than ${logdays} days" + fn_print_info "Removing logs older than ${logdays} days" fn_script_log_info "Removing logs older than ${logdays} days" # Logging logfiles to be removed according to "${logdays}", counting and removing them. # Script logfiles. @@ -100,6 +99,6 @@ if [ "$(find "${lgsmlogdir}"/ -type f -mtime +"${logdays}" | wc -l)" -ne "0" ]; # Count total amount of files removed. countlogs=$((scriptcount + consolecount + gamecount + srcdscount + smcount + ulxcount + darkrpcount)) # Job done. - fn_print_ok_nl "Removed ${countlogs} log files" + fn_print_ok "Removed ${countlogs} log files" fn_script_log "Removed ${countlogs} log files" fi diff --git a/lgsm/functions/update_factorio.sh b/lgsm/functions/update_factorio.sh index c6a0383ab..b6700f66c 100644 --- a/lgsm/functions/update_factorio.sh +++ b/lgsm/functions/update_factorio.sh @@ -108,6 +108,7 @@ fn_update_factorio_compare(){ exitbypass=1 command_start.sh fi + date +%s > "${lockdir}/lastupdate.lock" alert="update" alert.sh else diff --git a/lgsm/functions/update_minecraft.sh b/lgsm/functions/update_minecraft.sh index f24d44df8..361867467 100644 --- a/lgsm/functions/update_minecraft.sh +++ b/lgsm/functions/update_minecraft.sh @@ -167,6 +167,7 @@ fn_update_minecraft_compare(){ exitbypass=1 command_start.sh fi + date +%s > "${lockdir}/lastupdate.lock" alert="update" alert.sh else diff --git a/lgsm/functions/update_minecraft_bedrock.sh b/lgsm/functions/update_minecraft_bedrock.sh index 57306f063..2cb29930f 100644 --- a/lgsm/functions/update_minecraft_bedrock.sh +++ b/lgsm/functions/update_minecraft_bedrock.sh @@ -133,6 +133,7 @@ fn_update_minecraft_compare(){ exitbypass=1 command_start.sh fi + date +%s > "${lockdir}/lastupdate.lock" alert="update" alert.sh else diff --git a/lgsm/functions/update_mta.sh b/lgsm/functions/update_mta.sh index 1b8e5304d..5c5824983 100644 --- a/lgsm/functions/update_mta.sh +++ b/lgsm/functions/update_mta.sh @@ -165,6 +165,7 @@ fn_update_mta_compare(){ exitbypass=1 command_start.sh fi + date +%s > "${lockdir}/lastupdate.lock" alert="update" alert.sh else diff --git a/lgsm/functions/update_mumble.sh b/lgsm/functions/update_mumble.sh index 7bbfb134b..af320079d 100644 --- a/lgsm/functions/update_mumble.sh +++ b/lgsm/functions/update_mumble.sh @@ -101,6 +101,7 @@ fn_update_mumble_compare(){ exitbypass=1 command_start.sh fi + date +%s > "${lockdir}/lastupdate.lock" alert="update" alert.sh else diff --git a/lgsm/functions/update_steamcmd.sh b/lgsm/functions/update_steamcmd.sh index 8e4918494..f2651b3de 100644 --- a/lgsm/functions/update_steamcmd.sh +++ b/lgsm/functions/update_steamcmd.sh @@ -108,6 +108,7 @@ fn_update_steamcmd_compare(){ echo -e "* Branch: ${branch}" fi echo -e "https://steamdb.info/app/${appid}/" + echo -en "\n" fn_script_log_info "Update available" fn_script_log_info "Local build: ${localbuild}" fn_script_log_info "Remote build: ${remotebuild}" @@ -128,9 +129,11 @@ fn_update_steamcmd_compare(){ command_stop.sh exitbypass=1 fn_update_steamcmd_dl + date +%s > "${lockdir}/lastupdate.lock" exitbypass=1 command_start.sh fi + alert="update" alert.sh else @@ -143,6 +146,7 @@ fn_update_steamcmd_compare(){ echo -e "* Branch: ${branch}" fi echo -e "https://steamdb.info/app/${appid}/" + echo -en "\n" fn_script_log_info "No update available" fn_script_log_info "Local build: ${localbuild}" fn_script_log_info "Remote build: ${remotebuild}" @@ -219,6 +223,7 @@ fn_stop_warning(){ # The location where the builds are checked and downloaded. remotelocation="SteamCMD" check.sh + if [ "${forceupdate}" == "1" ]; then # forceupdate bypasses update checks. check_status.sh @@ -227,10 +232,12 @@ if [ "${forceupdate}" == "1" ]; then exitbypass=1 command_stop.sh fn_update_steamcmd_dl + date +%s > "${lockdir}/lastupdate.lock" exitbypass=1 command_start.sh else fn_update_steamcmd_dl + date +%s > "${lockdir}/lastupdate.lock" fi else fn_print_dots "Checking for update" diff --git a/linuxgsm.sh b/linuxgsm.sh index 9e5a5b685..eb9368997 100755 --- a/linuxgsm.sh +++ b/linuxgsm.sh @@ -1,7 +1,7 @@ #!/bin/bash # Project: Game Server Managers - LinuxGSM # Author: Daniel Gibbs -# License: MIT License, Copyright (c) 2019 Daniel Gibbs +# License: MIT License, Copyright (c) 2020 Daniel Gibbs # Purpose: Linux Game Server Management Script # Contributors: https://linuxgsm.com/contrib # Documentation: https://docs.linuxgsm.com @@ -25,7 +25,6 @@ shortname="core" gameservername="core" rootdir=$(dirname "$(readlink -f "${BASH_SOURCE[0]}")") selfname=$(basename "$(readlink -f "${BASH_SOURCE[0]}")") -lockselfname=".${selfname}.lock" lgsmdir="${rootdir}/lgsm" logdir="${rootdir}/log" lgsmlogdir="${logdir}/lgsm" @@ -34,6 +33,7 @@ serverfiles="${rootdir}/serverfiles" functionsdir="${lgsmdir}/functions" tmpdir="${lgsmdir}/tmp" datadir="${lgsmdir}/data" +lockdir="${lgsmdir}/lock" serverlist="${datadir}/serverlist.csv" serverlistmenu="${datadir}/serverlistmenu.csv" configdir="${lgsmdir}/config-lgsm" diff --git a/tests/tests_fctrserver.sh b/tests/tests_fctrserver.sh index 67008f883..8e80ee5f6 100644 --- a/tests/tests_fctrserver.sh +++ b/tests/tests_fctrserver.sh @@ -1,7 +1,7 @@ #!/bin/bash # Project: Game Server Managers - LinuxGSM # Author: Daniel Gibbs -# License: MIT License, Copyright (c) 2019 Daniel Gibbs +# License: MIT License, Copyright (c) 2020 Daniel Gibbs # Purpose: Travis CI Tests: Factorio | Linux Game Server Management Script # Contributors: https://linuxgsm.com/contrib # Documentation: https://docs.linuxgsm.com @@ -20,12 +20,11 @@ if [ -f ".dev-debug" ]; then set -x fi -version="v19.9.0" +version="v20.1.5" shortname="fctr" gameservername="fctrserver" rootdir=$(dirname "$(readlink -f "${BASH_SOURCE[0]}")") selfname=$(basename "$(readlink -f "${BASH_SOURCE[0]}")") -lockselfname=".${selfname}.lock" lgsmdir="${rootdir}/lgsm" logdir="${rootdir}/log" lgsmlogdir="${logdir}/lgsm" @@ -34,6 +33,7 @@ serverfiles="${rootdir}/serverfiles" functionsdir="${lgsmdir}/functions" tmpdir="${lgsmdir}/tmp" datadir="${lgsmdir}/data" +lockdir="${lgsmdir}/lock" serverlist="${datadir}/serverlist.csv" serverlistmenu="${datadir}/serverlistmenu.csv" configdir="${lgsmdir}/config-lgsm" @@ -812,7 +812,7 @@ echo -e "Command: ./${gameservername} monitor" requiredstatus="OFFLINE" fn_setstatus fn_print_info_nl "creating lockfile." -date '+%s' > "${rootdir}/${lockselfname}" +date '+%s' > "${lockdir}/${selfname}.lock" ( exec 5>"${TRAVIS_BUILD_DIR}/dev-debug.log" BASH_XTRACEFD="5" diff --git a/tests/tests_jc2server.sh b/tests/tests_jc2server.sh index 949509814..56fc47808 100644 --- a/tests/tests_jc2server.sh +++ b/tests/tests_jc2server.sh @@ -1,7 +1,7 @@ #!/bin/bash # Project: Game Server Managers - LinuxGSM # Author: Daniel Gibbs -# License: MIT License, Copyright (c) 2019 Daniel Gibbs +# License: MIT License, Copyright (c) 2020 Daniel Gibbs # Purpose: Travis CI Tests: Just Cause 2 | Linux Game Server Management Script # Contributors: https://linuxgsm.com/contrib # Documentation: https://docs.linuxgsm.com @@ -20,12 +20,11 @@ if [ -f ".dev-debug" ]; then set -x fi -version="v19.9.0" +version="v20.1.5" shortname="jc2" gameservername="jc2server" rootdir=$(dirname "$(readlink -f "${BASH_SOURCE[0]}")") selfname=$(basename "$(readlink -f "${BASH_SOURCE[0]}")") -lockselfname=".${selfname}.lock" lgsmdir="${rootdir}/lgsm" logdir="${rootdir}/log" lgsmlogdir="${logdir}/lgsm" @@ -34,6 +33,7 @@ serverfiles="${rootdir}/serverfiles" functionsdir="${lgsmdir}/functions" tmpdir="${lgsmdir}/tmp" datadir="${lgsmdir}/data" +lockdir="${lgsmdir}/lock" serverlist="${datadir}/serverlist.csv" serverlistmenu="${datadir}/serverlistmenu.csv" configdir="${lgsmdir}/config-lgsm" @@ -966,7 +966,7 @@ echo -e "Command: ./${gameservername} monitor" requiredstatus="OFFLINE" fn_setstatus fn_print_info_nl "creating lockfile." -date '+%s' > "${rootdir}/${lockselfname}" +date '+%s' > "${lockdir}/${selfname}.lock" ( exec 5>"${TRAVIS_BUILD_DIR}/dev-debug.log" BASH_XTRACEFD="5" diff --git a/tests/tests_mcserver.sh b/tests/tests_mcserver.sh index 9e8bf266c..c34d26edf 100644 --- a/tests/tests_mcserver.sh +++ b/tests/tests_mcserver.sh @@ -1,7 +1,7 @@ #!/bin/bash # Project: Game Server Managers - LinuxGSM # Author: Daniel Gibbs -# License: MIT License, Copyright (c) 2019 Daniel Gibbs +# License: MIT License, Copyright (c) 2020 Daniel Gibbs # Purpose: Travis CI Tests: Minecraft | Linux Game Server Management Script # Contributors: https://linuxgsm.com/contrib # Documentation: https://docs.linuxgsm.com @@ -20,12 +20,11 @@ if [ -f ".dev-debug" ]; then set -x fi -version="v19.9.0" +version="v20.1.5" shortname="mc" gameservername="mcserver" rootdir=$(dirname "$(readlink -f "${BASH_SOURCE[0]}")") selfname=$(basename "$(readlink -f "${BASH_SOURCE[0]}")") -lockselfname=".${selfname}.lock" lgsmdir="${rootdir}/lgsm" logdir="${rootdir}/log" lgsmlogdir="${logdir}/lgsm" @@ -34,6 +33,7 @@ serverfiles="${rootdir}/serverfiles" functionsdir="${lgsmdir}/functions" tmpdir="${lgsmdir}/tmp" datadir="${lgsmdir}/data" +lockdir="${lgsmdir}/lock" serverlist="${datadir}/serverlist.csv" serverlistmenu="${datadir}/serverlistmenu.csv" configdir="${lgsmdir}/config-lgsm" @@ -845,7 +845,7 @@ echo -e "Command: ./${gameservername} monitor" requiredstatus="OFFLINE" fn_setstatus fn_print_info_nl "creating lockfile." -date '+%s' > "${rootdir}/${lockselfname}" +date '+%s' > "${lockdir}/${selfname}.lock" ( exec 5>"${TRAVIS_BUILD_DIR}/dev-debug.log" BASH_XTRACEFD="5" diff --git a/tests/tests_shellcheck.sh b/tests/tests_shellcheck.sh index 51784906c..f4bbf4868 100644 --- a/tests/tests_shellcheck.sh +++ b/tests/tests_shellcheck.sh @@ -1,7 +1,7 @@ #!/bin/bash # Project: Game Server Managers - LinuxGSM # Author: Daniel Gibbs -# License: MIT License, Copyright (c) 2019 Daniel Gibbs +# License: MIT License, Copyright (c) 2020 Daniel Gibbs # Purpose: Travis CI Tests: Shellcheck | Linux Game Server Management Script # Contributors: https://github.com/GameServerManagers/LinuxGSM/graphs/contributors # Documentation: https://docs.linuxgsm.com/ diff --git a/tests/tests_ts3server.sh b/tests/tests_ts3server.sh index a9527b68b..b51411a3b 100644 --- a/tests/tests_ts3server.sh +++ b/tests/tests_ts3server.sh @@ -1,7 +1,7 @@ #!/bin/bash # Project: Game Server Managers - LinuxGSM # Author: Daniel Gibbs -# License: MIT License, Copyright (c) 2019 Daniel Gibbs +# License: MIT License, Copyright (c) 2020 Daniel Gibbs # Purpose: Travis CI Tests: Teamspeak 3 | Linux Game Server Management Script # Contributors: https://linuxgsm.com/contrib # Documentation: https://docs.linuxgsm.com @@ -20,12 +20,11 @@ if [ -f ".dev-debug" ]; then set -x fi -version="v19.9.0" +version="v20.1.5" shortname="ts3" gameservername="ts3server" rootdir=$(dirname "$(readlink -f "${BASH_SOURCE[0]}")") selfname=$(basename "$(readlink -f "${BASH_SOURCE[0]}")") -lockselfname=".${selfname}.lock" lgsmdir="${rootdir}/lgsm" logdir="${rootdir}/log" lgsmlogdir="${logdir}/lgsm" @@ -34,6 +33,7 @@ serverfiles="${rootdir}/serverfiles" functionsdir="${lgsmdir}/functions" tmpdir="${lgsmdir}/tmp" datadir="${lgsmdir}/data" +lockdir="${lgsmdir}/lock" serverlist="${datadir}/serverlist.csv" serverlistmenu="${datadir}/serverlistmenu.csv" configdir="${lgsmdir}/config-lgsm" @@ -812,7 +812,7 @@ echo -e "Command: ./${gameservername} monitor" requiredstatus="OFFLINE" fn_setstatus fn_print_info_nl "creating lockfile." -date '+%s' > "${rootdir}/${lockselfname}" +date '+%s' > "${lockdir}/${selfname}.lock" ( exec 5>"${TRAVIS_BUILD_DIR}/dev-debug.log" BASH_XTRACEFD="5" From 824b42566433b3f0d6c0544734e528e79d56e633 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Wed, 8 Apr 2020 08:20:22 +0100 Subject: [PATCH 330/534] fix(roserver): fix bug in _default.cfg --- lgsm/config-default/config-lgsm/roserver/_default.cfg | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lgsm/config-default/config-lgsm/roserver/_default.cfg b/lgsm/config-default/config-lgsm/roserver/_default.cfg index 7d6fcc5a6..18b352c9c 100644 --- a/lgsm/config-default/config-lgsm/roserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/roserver/_default.cfg @@ -150,7 +150,7 @@ glibc="2.4" serverfiles="${rootdir}/serverfiles" systemdir="${serverfiles}/system" executabledir="${systemdir}" -executable="./ucc-bin"servercfgdir="${systemdir}" +executable="./ucc-bin" servercfgdir="${systemdir}" servercfg="${selfname}.ini" servercfgdefault="default.ini" From 773812a6c7e0de74fb95af55e8a6d8da4f262a1c Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Thu, 9 Apr 2020 20:54:54 +0100 Subject: [PATCH 332/534] fix: correct and standardise name of goldsrc engine (#2814) GoldSrc servers were names variants of Gold Source. Using correct engine name GoldSrc --- 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 3ee515dbc..a015d32e0 100644 --- a/lgsm/functions/install_server_files.sh +++ b/lgsm/functions/install_server_files.sh @@ -152,7 +152,7 @@ fn_install_server_files_steamcmd(){ # GoldSrc (appid 90) servers commonly fail to download all the server files required. # Validating a few of times may reduce the chance of this issue. if [ "${appid}" == "90" ]; then - fn_print_information_nl "GoldSrc servers commonly fail to download all the server files required. Validating a few of times may reduce the chance of this issue." + fn_print_information_nl "GoldSrc servers commonly fail to download all the server files required. Validating a few of times may reduce the chance of this issue." counter="0" while [ "${counter}" -le "4" ]; do counter=$((counter+1)) From 8034566617786bbccb4d1998ef0be832b2e59719 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Sat, 11 Apr 2020 22:09:56 +0100 Subject: [PATCH 333/534] prevent last update check running if lock file last update lock missing --- lgsm/functions/check_last_update.sh | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/lgsm/functions/check_last_update.sh b/lgsm/functions/check_last_update.sh index 55e9f21d2..52b8ef5a8 100644 --- a/lgsm/functions/check_last_update.sh +++ b/lgsm/functions/check_last_update.sh @@ -12,8 +12,10 @@ if [ -f "${lockdir}/lastupdate.lock" ]; then lastupdate=$(cat "${lockdir}/lastupdate.lock") fi -if [ ! -f "${lockdir}/${selfname}-laststart.lock" ]||[ "${laststart}" -lt "${lastupdate}" ]; then - fn_print_info "${selfname} has not been restarted since last update" - fn_script_log_info "${selfname} has not been restarted since last update" - command_restart.sh +if [ -f "${lockdir}/lastupdate.lock" ]; then + if [ ! -f "${lockdir}/${selfname}-laststart.lock" ]||[ "${laststart}" -lt "${lastupdate}" ]; then + fn_print_info "${selfname} has not been restarted since last update" + fn_script_log_info "${selfname} has not been restarted since last update" + command_restart.sh + fi fi From b30b36fd6df919c7815deca8a01bd47289838fb6 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Mon, 13 Apr 2020 12:39:50 +0100 Subject: [PATCH 334/534] fix(install): will not use apt steamcmd package if ubuntu 14.04 (#2820) --- 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 f4499a587..a0188e9e2 100644 --- a/lgsm/functions/check_deps.sh +++ b/lgsm/functions/check_deps.sh @@ -349,8 +349,8 @@ fn_deps_build_debian(){ fi # If requires steamcmd. if [ "${appid}" ]; then - # Will not use apt if non-free repo is missing - if [ "${distroid}" == "debian" ]&& ! grep -qE "^deb .*non-free" /etc/apt/sources.list; then + # Will not use apt if non-free repo is missing or Ubuntu 14.04 + if [ "${distroversion}" == "14.04" ]||[ "${distroid}" == "debian" ]&& ! grep -qE "^deb .*non-free" /etc/apt/sources.list; then : else array_deps_required+=( steamcmd ) From f76cd6b26620ba8b5c086d61896925aaef880368 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Mon, 13 Apr 2020 13:13:36 +0100 Subject: [PATCH 335/534] fix(logs): resolve modulename not showing in logs (#2818) --- lgsm/functions/alert_email.sh | 2 +- lgsm/functions/alert_ifttt.sh | 2 +- lgsm/functions/alert_mailgun.sh | 2 +- lgsm/functions/alert_pushbullet.sh | 2 +- lgsm/functions/alert_pushover.sh | 2 +- lgsm/functions/alert_telegram.sh | 2 +- lgsm/functions/command_backup.sh | 2 +- lgsm/functions/command_console.sh | 2 +- lgsm/functions/command_debug.sh | 2 +- lgsm/functions/command_details.sh | 2 +- lgsm/functions/command_dev_debug.sh | 4 ++-- lgsm/functions/command_dev_detect_deps.sh | 4 ++-- lgsm/functions/command_dev_detect_glibc.sh | 4 ++-- lgsm/functions/command_dev_detect_ldd.sh | 4 ++-- lgsm/functions/command_dev_query_raw.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_linuxgsm.sh | 2 +- lgsm/functions/command_validate.sh | 2 +- lgsm/functions/command_wipe.sh | 2 +- lgsm/functions/compress_unreal2_maps.sh | 2 +- lgsm/functions/compress_ut99_maps.sh | 2 +- lgsm/functions/core_dl.sh | 2 +- lgsm/functions/core_exit.sh | 15 ++++++++++++++- lgsm/functions/core_getopt.sh | 15 +++++++++------ lgsm/functions/core_messages.sh | 12 ++++++------ lgsm/functions/fix_arma3.sh | 2 +- lgsm/functions/fix_csgo.sh | 2 +- lgsm/functions/fix_dst.sh | 2 +- lgsm/functions/fix_kf.sh | 2 +- lgsm/functions/fix_kf2.sh | 2 +- lgsm/functions/fix_mta.sh | 5 +++-- lgsm/functions/fix_nmrih.sh | 5 ++++- lgsm/functions/fix_onset.sh | 2 +- lgsm/functions/fix_ro.sh | 2 +- lgsm/functions/fix_sfc.sh | 2 +- lgsm/functions/fix_ss3.sh | 2 +- lgsm/functions/fix_steamcmd.sh | 2 +- lgsm/functions/fix_terraria.sh | 2 +- lgsm/functions/fix_tf2.sh | 2 +- lgsm/functions/fix_ts3.sh | 2 +- lgsm/functions/fix_ut.sh | 2 +- lgsm/functions/fix_ut2k4.sh | 2 +- lgsm/functions/fix_ut3.sh | 2 +- lgsm/functions/fix_wurm.sh | 3 +++ lgsm/functions/fix_zmr.sh | 2 +- lgsm/functions/info_config.sh | 2 +- lgsm/functions/info_distro.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 | 2 +- lgsm/functions/install_gslt.sh | 2 +- lgsm/functions/install_header.sh | 2 +- lgsm/functions/install_logs.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_squad_license.sh | 2 +- lgsm/functions/install_stats.sh | 2 +- lgsm/functions/install_ts3db.sh | 2 +- lgsm/functions/install_ut2k4_key.sh | 2 +- lgsm/functions/mods_core.sh | 2 +- lgsm/functions/mods_list.sh | 2 +- lgsm/functions/update_factorio.sh | 2 +- lgsm/functions/update_minecraft.sh | 2 +- lgsm/functions/update_minecraft_bedrock.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 +- 84 files changed, 121 insertions(+), 98 deletions(-) diff --git a/lgsm/functions/alert_email.sh b/lgsm/functions/alert_email.sh index 43eddfa58..398ecc3e8 100644 --- a/lgsm/functions/alert_email.sh +++ b/lgsm/functions/alert_email.sh @@ -6,7 +6,7 @@ local modulename="ALERT" local commandaction="Alert" -local function_selfname=$(basename "$(readlink -f "${BASH_SOURCE[0]}")") +local function_selfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" fn_print_dots "Sending Email alert: ${email}" fn_sleep_time diff --git a/lgsm/functions/alert_ifttt.sh b/lgsm/functions/alert_ifttt.sh index 26a50114f..0e983e2dc 100644 --- a/lgsm/functions/alert_ifttt.sh +++ b/lgsm/functions/alert_ifttt.sh @@ -6,7 +6,7 @@ local modulename="ALERT" local commandaction="Alert" -local function_selfname=$(basename "$(readlink -f "${BASH_SOURCE[0]}")") +local function_selfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" json=$(cat <> "${lgsmlog}" + echo -e "$(date '+%b %d %H:%M:%S.%3N') ${selfname}: ${modulename}: ${1}" >> "${lgsmlog}" else echo -e "$(date '+%b %d %H:%M:%S.%3N') ${selfname}: ${1}" >> "${lgsmlog}" fi @@ -59,7 +59,7 @@ fn_script_log_pass(){ if [ -d "${lgsmlogdir}" ]; then if [ "${modulename}" ]; then - echo -e "$(date '+%b %d %H:%M:%S.%3N') ${selfname}: ${commandname}: PASS: ${1}" >> "${lgsmlog}" + echo -e "$(date '+%b %d %H:%M:%S.%3N') ${selfname}: ${modulename}: PASS: ${1}" >> "${lgsmlog}" else echo -e "$(date '+%b %d %H:%M:%S.%3N') ${selfname}: PASS: ${1}" >> "${lgsmlog}" fi @@ -71,7 +71,7 @@ fn_script_log_pass(){ fn_script_log_fatal(){ if [ -d "${lgsmlogdir}" ]; then if [ "${modulename}" ]; then - echo -e "$(date '+%b %d %H:%M:%S.%3N') ${selfname}: ${commandname}: FATAL: ${1}" >> "${lgsmlog}" + echo -e "$(date '+%b %d %H:%M:%S.%3N') ${selfname}: ${modulename}: FATAL: ${1}" >> "${lgsmlog}" else echo -e "$(date '+%b %d %H:%M:%S.%3N') ${selfname}: FATAL: ${1}" >> "${lgsmlog}" fi @@ -83,7 +83,7 @@ fn_script_log_fatal(){ fn_script_log_error(){ if [ -d "${lgsmlogdir}" ]; then if [ "${modulename}" ]; then - echo -e "$(date '+%b %d %H:%M:%S.%3N') ${selfname}: ${commandname}: ERROR: ${1}" >> "${lgsmlog}" + echo -e "$(date '+%b %d %H:%M:%S.%3N') ${selfname}: ${modulename}: ERROR: ${1}" >> "${lgsmlog}" else echo -e "$(date '+%b %d %H:%M:%S.%3N') ${selfname}: ERROR: ${1}" >> "${lgsmlog}" fi @@ -95,7 +95,7 @@ fn_script_log_error(){ fn_script_log_warn(){ if [ -d "${lgsmlogdir}" ]; then if [ "${modulename}" ]; then - echo -e "$(date '+%b %d %H:%M:%S.%3N') ${selfname}: ${commandname}: WARN: ${1}" >> "${lgsmlog}" + echo -e "$(date '+%b %d %H:%M:%S.%3N') ${selfname}: ${modulename}: WARN: ${1}" >> "${lgsmlog}" else echo -e "$(date '+%b %d %H:%M:%S.%3N') ${selfname}: WARN: ${1}" >> "${lgsmlog}" fi @@ -107,7 +107,7 @@ fn_script_log_warn(){ fn_script_log_info(){ if [ -d "${lgsmlogdir}" ]; then if [ "${modulename}" ]; then - echo -e "$(date '+%b %d %H:%M:%S.%3N') ${selfname}: ${commandname}: INFO: ${1}" >> "${lgsmlog}" + echo -e "$(date '+%b %d %H:%M:%S.%3N') ${selfname}: ${modulename}: INFO: ${1}" >> "${lgsmlog}" else echo -e "$(date '+%b %d %H:%M:%S.%3N') ${selfname}: INFO: ${1}" >> "${lgsmlog}" fi diff --git a/lgsm/functions/fix_arma3.sh b/lgsm/functions/fix_arma3.sh index de9785e51..4e496250c 100644 --- a/lgsm/functions/fix_arma3.sh +++ b/lgsm/functions/fix_arma3.sh @@ -6,7 +6,7 @@ local modulename="FIX" local commandaction="Fix" -local function_selfname=$(basename "$(readlink -f "${BASH_SOURCE[0]}")") +local function_selfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" # Fixes: 20150 Segmentation fault (core dumped) error. if [ ! -d "${HOME}/.local/share/Arma 3" ]||[ ! -d "${HOME}/.local/share/Arma 3 - Other Profiles" ]; then diff --git a/lgsm/functions/fix_csgo.sh b/lgsm/functions/fix_csgo.sh index 0ea098eed..f1f9c9241 100644 --- a/lgsm/functions/fix_csgo.sh +++ b/lgsm/functions/fix_csgo.sh @@ -6,7 +6,7 @@ local modulename="FIX" local commandaction="Fix" -local function_selfname=$(basename "$(readlink -f "${BASH_SOURCE[0]}")") +local function_selfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" # Fixes: server not always creating steam_appid.txt file. if [ ! -f "${serverfiles}/steam_appid.txt" ]; then diff --git a/lgsm/functions/fix_dst.sh b/lgsm/functions/fix_dst.sh index 46c17756b..ca86bdd4f 100644 --- a/lgsm/functions/fix_dst.sh +++ b/lgsm/functions/fix_dst.sh @@ -6,7 +6,7 @@ local modulename="FIX" local commandaction="Fix" -local function_selfname=$(basename "$(readlink -f "${BASH_SOURCE[0]}")") +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. diff --git a/lgsm/functions/fix_kf.sh b/lgsm/functions/fix_kf.sh index 0ce05184b..f1b6d7b89 100644 --- a/lgsm/functions/fix_kf.sh +++ b/lgsm/functions/fix_kf.sh @@ -6,7 +6,7 @@ local modulename="FIX" local commandaction="Fix" -local function_selfname=$(basename "$(readlink -f "${BASH_SOURCE[0]}")") +local function_selfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" echo -e "Applying WebAdmin ROOst.css fix." echo -e "http://forums.tripwireinteractive.com/showpost.php?p=585435&postcount=13" diff --git a/lgsm/functions/fix_kf2.sh b/lgsm/functions/fix_kf2.sh index 7cc1be568..2e54f1133 100644 --- a/lgsm/functions/fix_kf2.sh +++ b/lgsm/functions/fix_kf2.sh @@ -6,7 +6,7 @@ local modulename="FIX" local commandaction="Fix" -local function_selfname=$(basename "$(readlink -f "${BASH_SOURCE[0]}")") +local function_selfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" fn_parms(){ parms="\"${defaultmap}?Game=KFGameContent.KFGameInfo_VersusSurvival\"" diff --git a/lgsm/functions/fix_mta.sh b/lgsm/functions/fix_mta.sh index 236a2336b..6cb6a6c72 100644 --- a/lgsm/functions/fix_mta.sh +++ b/lgsm/functions/fix_mta.sh @@ -4,9 +4,10 @@ # Contributor: ChaosMTA # Website: https://linuxgsm.com # Description: Installs the libmysqlclient for database functions on the server -local commandname="FIX" + +local modulename="FIX" local commandaction="Fix" -local function_selfname=$(basename "$(readlink -f "${BASH_SOURCE[0]}")") +local function_selfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" if [ ! -f "${lgsmdir}/lib/libmysqlclient.so.16" ]; then fixname="libmysqlclient16" diff --git a/lgsm/functions/fix_nmrih.sh b/lgsm/functions/fix_nmrih.sh index 8dd5f592c..7b27441d4 100644 --- a/lgsm/functions/fix_nmrih.sh +++ b/lgsm/functions/fix_nmrih.sh @@ -4,10 +4,13 @@ # Description: Create symlinks for renamed No More Room In Hell serverfiles # Solution from Steam Community post: https://steamcommunity.com/app/224260/discussions/2/1732089092441769414/ +local modulename="FIX" +local commandaction="Fix" + ln -s "${serverfiles}/bin/vphysics_srv.so" "${serverfiles}/bin/vphysics.so" ln -s "${serverfiles}/bin/studiorender_srv.so" "${serverfiles}/bin/studiorender.so" ln -s "${serverfiles}/bin/soundemittersystem_srv.so" "${serverfiles}/bin/soundemittersystem.so" ln -s "${serverfiles}/bin/shaderapiempty_srv.so" "${serverfiles}/bin/shaderapiempty.so" ln -s "${serverfiles}/bin/scenefilecache_srv.so" "${serverfiles}/bin/scenefilecache.so" ln -s "${serverfiles}/bin/replay_srv.so" "${serverfiles}/bin/replay.so" -ln -s "${serverfiles}/bin/materialsystem_srv.so" "${serverfiles}/bin/materialsystem.so" \ No newline at end of file +ln -s "${serverfiles}/bin/materialsystem_srv.so" "${serverfiles}/bin/materialsystem.so" diff --git a/lgsm/functions/fix_onset.sh b/lgsm/functions/fix_onset.sh index 299e448fa..dd7ce5b4e 100644 --- a/lgsm/functions/fix_onset.sh +++ b/lgsm/functions/fix_onset.sh @@ -6,7 +6,7 @@ local modulename="FIX" local commandaction="Fix" -local function_selfname=$(basename "$(readlink -f "${BASH_SOURCE[0]}")") +local function_selfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" export LD_LIBRARY_PATH="$LD_LIBRARY_PATH:${serverfiles}" diff --git a/lgsm/functions/fix_ro.sh b/lgsm/functions/fix_ro.sh index e7ced52ad..f07581ae2 100644 --- a/lgsm/functions/fix_ro.sh +++ b/lgsm/functions/fix_ro.sh @@ -6,7 +6,7 @@ local modulename="FIX" local commandaction="Fix" -local function_selfname=$(basename "$(readlink -f "${BASH_SOURCE[0]}")") +local function_selfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" echo -e "Applying WebAdmin ROOst.css fix." echo -e "http://forums.tripwireinteractive.com/showpost.php?p=585435&postcount=13" diff --git a/lgsm/functions/fix_sfc.sh b/lgsm/functions/fix_sfc.sh index ce42211fb..f74984753 100644 --- a/lgsm/functions/fix_sfc.sh +++ b/lgsm/functions/fix_sfc.sh @@ -6,7 +6,7 @@ local modulename="FIX" local commandaction="Fix" -local function_selfname=$(basename "$(readlink -f "${BASH_SOURCE[0]}")") +local function_selfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" if [ ! -f "${serverfiles}/bin/datacache.so" ]; then ln -s "${serverfiles}/bin/datacache_srv.so" "${serverfiles}/bin/datacache.so" diff --git a/lgsm/functions/fix_ss3.sh b/lgsm/functions/fix_ss3.sh index 1c81f87ae..c83c5bb9c 100644 --- a/lgsm/functions/fix_ss3.sh +++ b/lgsm/functions/fix_ss3.sh @@ -6,7 +6,7 @@ local modulename="FIX" local commandaction="Fix" -local function_selfname=$(basename "$(readlink -f "${BASH_SOURCE[0]}")") +local function_selfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" # Fixes https://steamcommunity.com/app/41070/discussions/0/353916981477716386/ if [ "$(diff "${HOME}/.steam/steamcmd/linux32/steamclient.so" "${serverfiles}/Bin/steamclient.so" >/dev/null)" ]; then diff --git a/lgsm/functions/fix_steamcmd.sh b/lgsm/functions/fix_steamcmd.sh index 3f4907d15..4cb846944 100644 --- a/lgsm/functions/fix_steamcmd.sh +++ b/lgsm/functions/fix_steamcmd.sh @@ -6,7 +6,7 @@ local modulename="FIX" local commandaction="Fix" -function_selfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" +local function_selfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" # Fixes: [S_API FAIL] SteamAPI_Init() failed; unable to locate a running instance of Steam,or a local steamclient.so. if [ ! -f "${HOME}/.steam/sdk32/steamclient.so" ]; then diff --git a/lgsm/functions/fix_terraria.sh b/lgsm/functions/fix_terraria.sh index 8d9af0947..bce7d44f8 100644 --- a/lgsm/functions/fix_terraria.sh +++ b/lgsm/functions/fix_terraria.sh @@ -6,6 +6,6 @@ local modulename="FIX" local commandaction="Fix" -local function_selfname=$(basename "$(readlink -f "${BASH_SOURCE[0]}")") +local function_selfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" export TERM=xterm diff --git a/lgsm/functions/fix_tf2.sh b/lgsm/functions/fix_tf2.sh index b0e9ce1ce..72c5b53ab 100644 --- a/lgsm/functions/fix_tf2.sh +++ b/lgsm/functions/fix_tf2.sh @@ -6,7 +6,7 @@ local modulename="FIX" local commandaction="Fix" -local function_selfname=$(basename "$(readlink -f "${BASH_SOURCE[0]}")") +local function_selfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" # Fixes: Team Fortress 2 Segmentation fault for Red-Hat Distros #2062. if [ -f "/etc/redhat-release" ]&&[ ! -f "${serverfiles}/bin/libcurl-gnutls.so.4" ]; then diff --git a/lgsm/functions/fix_ts3.sh b/lgsm/functions/fix_ts3.sh index 2a921d91d..5b4c010c7 100644 --- a/lgsm/functions/fix_ts3.sh +++ b/lgsm/functions/fix_ts3.sh @@ -6,7 +6,7 @@ local modulename="FIX" local commandaction="Fix" -local function_selfname=$(basename "$(readlink -f "${BASH_SOURCE[0]}")") +local function_selfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" # Fixes: makes libmariadb2 available #1924. if [ ! -f "${serverfiles}/libmariadb.so.2" ]; then diff --git a/lgsm/functions/fix_ut.sh b/lgsm/functions/fix_ut.sh index 7c8c12458..e3e004be4 100644 --- a/lgsm/functions/fix_ut.sh +++ b/lgsm/functions/fix_ut.sh @@ -6,7 +6,7 @@ local modulename="FIX" local commandaction="Fix" -local function_selfname=$(basename "$(readlink -f "${BASH_SOURCE[0]}")") +local function_selfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" #Set Binary Executable echo -e "chmod +x ${executabledir}/${executable}" diff --git a/lgsm/functions/fix_ut2k4.sh b/lgsm/functions/fix_ut2k4.sh index 70ed0465d..8dfb33432 100644 --- a/lgsm/functions/fix_ut2k4.sh +++ b/lgsm/functions/fix_ut2k4.sh @@ -6,7 +6,7 @@ local modulename="FIX" local commandaction="Fix" -local function_selfname=$(basename "$(readlink -f "${BASH_SOURCE[0]}")") +local function_selfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" echo -e "applying WebAdmin ut2003.css fix." echo -e "http://forums.tripwireinteractive.com/showpost.php?p=585435&postcount=13" diff --git a/lgsm/functions/fix_ut3.sh b/lgsm/functions/fix_ut3.sh index 3b5537d67..3595cb898 100644 --- a/lgsm/functions/fix_ut3.sh +++ b/lgsm/functions/fix_ut3.sh @@ -6,7 +6,7 @@ local modulename="FIX" local commandaction="Fix" -local function_selfname=$(basename "$(readlink -f "${BASH_SOURCE[0]}")") +local function_selfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" fn_parms(){ parms="server VCTF-Suspense?Game=UTGameContent.UTVehicleCTFGame_Content?bIsDedicated=true?bIsLanMatch=false?bUsesStats=false?bShouldAdvertise=false?PureServer=1?bAllowJoinInProgress=true?ConfigSubDir=${selfname} -port=${port} -queryport=${queryport} -multihome=${ip} -nohomedir -unattended -log=${gamelog}" diff --git a/lgsm/functions/fix_wurm.sh b/lgsm/functions/fix_wurm.sh index 756636cac..f127ef142 100644 --- a/lgsm/functions/fix_wurm.sh +++ b/lgsm/functions/fix_wurm.sh @@ -4,6 +4,9 @@ # Website: https://linuxgsm.com # Description: Resolves various issues with ARK: Survival Evolved. +local modulename="FIX" +local commandaction="Fix" + # Copies steamclient.so to correct location. if [ ! -f "${serverfiles}/nativelibs" ]; then cp -f "${serverfiles}/linux64/steamclient.so" "${serverfiles}/nativelibs" diff --git a/lgsm/functions/fix_zmr.sh b/lgsm/functions/fix_zmr.sh index 25deec45f..dade0ee1d 100644 --- a/lgsm/functions/fix_zmr.sh +++ b/lgsm/functions/fix_zmr.sh @@ -6,7 +6,7 @@ local modulename="FIX" local commandaction="Fix" -local function_selfname=$(basename "$(readlink -f "${BASH_SOURCE[0]}")") +local function_selfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" if [ ! -f "${serverfiles}/bin/datacache.so" ]; then ln -s "${serverfiles}/bin/datacache_srv.so" "${serverfiles}/bin/datacache.so" diff --git a/lgsm/functions/info_config.sh b/lgsm/functions/info_config.sh index 485893399..b657e80ac 100644 --- a/lgsm/functions/info_config.sh +++ b/lgsm/functions/info_config.sh @@ -5,7 +5,7 @@ # Website: https://linuxgsm.com # Description: Gets specific details from config files. -local function_selfname=$(basename "$(readlink -f "${BASH_SOURCE[0]}")") +local function_selfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" ## Examples of filtering to get info from config files. # sed 's/foo//g' - remove foo diff --git a/lgsm/functions/info_distro.sh b/lgsm/functions/info_distro.sh index d6cfc95f9..d3761b3d0 100644 --- a/lgsm/functions/info_distro.sh +++ b/lgsm/functions/info_distro.sh @@ -5,7 +5,7 @@ # Description: Variables providing useful info on the Operating System such as disk and performace info. # Used for command_details.sh, command_debug.sh and alert.sh. -local function_selfname=$(basename "$(readlink -f "${BASH_SOURCE[0]}")") +local function_selfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" ### Game Server pid if [ "${status}" == "1" ]; then diff --git a/lgsm/functions/info_parms.sh b/lgsm/functions/info_parms.sh index 620abf3ec..10b06c03a 100644 --- a/lgsm/functions/info_parms.sh +++ b/lgsm/functions/info_parms.sh @@ -4,7 +4,7 @@ # Website: https://linuxgsm.com # Description: If specific parms are not set then this will be displayed in details. -local function_selfname=$(basename "$(readlink -f "${BASH_SOURCE[0]}")") +local function_selfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" ## Examples of filtering to get info from config files # sed 's/foo//g' - remove foo diff --git a/lgsm/functions/install_complete.sh b/lgsm/functions/install_complete.sh index 70f4e5345..03beeddd5 100644 --- a/lgsm/functions/install_complete.sh +++ b/lgsm/functions/install_complete.sh @@ -6,7 +6,7 @@ local modulename="INSTALL" local commandaction="Install" -local function_selfname=$(basename "$(readlink -f "${BASH_SOURCE[0]}")") +local function_selfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" echo -e "" echo -e "=================================" diff --git a/lgsm/functions/install_config.sh b/lgsm/functions/install_config.sh index f6d08a8d6..2f5cde136 100644 --- a/lgsm/functions/install_config.sh +++ b/lgsm/functions/install_config.sh @@ -6,7 +6,7 @@ local modulename="INSTALL" local commandaction="Install" -local function_selfname=$(basename "$(readlink -f "${BASH_SOURCE[0]}")") +local function_selfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" # Checks if server cfg dir exists, creates it if it doesn't. fn_check_cfgdir(){ diff --git a/lgsm/functions/install_dst_token.sh b/lgsm/functions/install_dst_token.sh index 247280a56..b1fec01c3 100644 --- a/lgsm/functions/install_dst_token.sh +++ b/lgsm/functions/install_dst_token.sh @@ -6,7 +6,7 @@ local modulename="INSTALL" local commandaction="Install" -local function_selfname=$(basename "$(readlink -f "${BASH_SOURCE[0]}")") +local function_selfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" echo -e "" echo -e "${lightyellow}Enter ${gamename} Cluster Token${default}" diff --git a/lgsm/functions/install_gslt.sh b/lgsm/functions/install_gslt.sh index 3162f669c..ae10508b5 100644 --- a/lgsm/functions/install_gslt.sh +++ b/lgsm/functions/install_gslt.sh @@ -6,7 +6,7 @@ local modulename="INSTALL" local commandaction="Install" -local function_selfname=$(basename "$(readlink -f "${BASH_SOURCE[0]}")") +local function_selfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" echo -e "" echo -e "${lightyellow}Game Server Login Token${default}" diff --git a/lgsm/functions/install_header.sh b/lgsm/functions/install_header.sh index bd2e4524b..8a63fb289 100644 --- a/lgsm/functions/install_header.sh +++ b/lgsm/functions/install_header.sh @@ -6,7 +6,7 @@ local modulename="INSTALL" local commandaction="Install" -local function_selfname=$(basename "$(readlink -f "${BASH_SOURCE[0]}")") +local function_selfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" clear fn_print_ascii_logo diff --git a/lgsm/functions/install_logs.sh b/lgsm/functions/install_logs.sh index bb4fdd2b8..98057df6f 100644 --- a/lgsm/functions/install_logs.sh +++ b/lgsm/functions/install_logs.sh @@ -6,7 +6,7 @@ local modulename="INSTALL" local commandaction="Install" -local function_selfname=$(basename "$(readlink -f "${BASH_SOURCE[0]}")") +local function_selfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" if [ "${checklogs}" != "1" ]; then echo -e "" diff --git a/lgsm/functions/install_mta_resources.sh b/lgsm/functions/install_mta_resources.sh index fb7bb012b..01ceeeb80 100644 --- a/lgsm/functions/install_mta_resources.sh +++ b/lgsm/functions/install_mta_resources.sh @@ -7,7 +7,7 @@ local modulename="INSTALL" local commandaction="Install" -local function_selfname=$(basename "$(readlink -f "${BASH_SOURCE[0]}")") +local function_selfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" fn_print_information_nl "${gamename} will not function without resources!" echo -e " * install default resources using ./${selfname} install-default-resources" diff --git a/lgsm/functions/install_retry.sh b/lgsm/functions/install_retry.sh index 15cbf938e..3a65049ce 100644 --- a/lgsm/functions/install_retry.sh +++ b/lgsm/functions/install_retry.sh @@ -6,7 +6,7 @@ local modulename="INSTALL" local commandaction="Install" -local function_selfname=$(basename "$(readlink -f "${BASH_SOURCE[0]}")") +local function_selfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" if fn_prompt_yn "Retry install?" Y; then command_install.sh; core_exit.sh diff --git a/lgsm/functions/install_server_dir.sh b/lgsm/functions/install_server_dir.sh index 006264a06..71f2aa4c4 100644 --- a/lgsm/functions/install_server_dir.sh +++ b/lgsm/functions/install_server_dir.sh @@ -6,7 +6,7 @@ local modulename="INSTALL" local commandaction="Install" -local function_selfname=$(basename "$(readlink -f "${BASH_SOURCE[0]}")") +local function_selfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" echo -e "" echo -e "${lightyellow}Server Directory${default}" diff --git a/lgsm/functions/install_server_files.sh b/lgsm/functions/install_server_files.sh index a015d32e0..9cc0e91c9 100644 --- a/lgsm/functions/install_server_files.sh +++ b/lgsm/functions/install_server_files.sh @@ -6,7 +6,7 @@ local modulename="INSTALL" local commandaction="Install" -local function_selfname=$(basename "$(readlink -f "${BASH_SOURCE[0]}")") +local function_selfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" fn_install_server_files(){ if [ "${shortname}" == "ahl" ]; then diff --git a/lgsm/functions/install_squad_license.sh b/lgsm/functions/install_squad_license.sh index cd8ba87b6..accb3021e 100644 --- a/lgsm/functions/install_squad_license.sh +++ b/lgsm/functions/install_squad_license.sh @@ -6,7 +6,7 @@ local modulename="INSTALL" local commandaction="Install" -local function_selfname=$(basename "$(readlink -f "${BASH_SOURCE[0]}")") +local function_selfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" echo -e "" echo -e "${lightyellow}Squad Server License${default}" diff --git a/lgsm/functions/install_stats.sh b/lgsm/functions/install_stats.sh index 4a00edd49..2d44706e8 100644 --- a/lgsm/functions/install_stats.sh +++ b/lgsm/functions/install_stats.sh @@ -6,7 +6,7 @@ local modulename="INSTALL" local commandaction="Install" -local function_selfname=$(basename "$(readlink -f "${BASH_SOURCE[0]}")") +local function_selfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" echo -e "" echo -e "${lightyellow}LinuxGSM Stats${default}" diff --git a/lgsm/functions/install_ts3db.sh b/lgsm/functions/install_ts3db.sh index cf8831dd3..7cc448d7b 100644 --- a/lgsm/functions/install_ts3db.sh +++ b/lgsm/functions/install_ts3db.sh @@ -7,7 +7,7 @@ local modulename="INSTALL" local commandaction="Install" -local function_selfname=$(basename "$(readlink -f "${BASH_SOURCE[0]}")") +local function_selfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" fn_install_ts3db_mariadb(){ if [ ! -f "${serverfiles}/libts3db_mariadb.so" ]; then diff --git a/lgsm/functions/install_ut2k4_key.sh b/lgsm/functions/install_ut2k4_key.sh index c5eff82e6..cb02829d2 100644 --- a/lgsm/functions/install_ut2k4_key.sh +++ b/lgsm/functions/install_ut2k4_key.sh @@ -6,7 +6,7 @@ local modulename="INSTALL" local commandaction="Install" -local function_selfname=$(basename "$(readlink -f "${BASH_SOURCE[0]}")") +local function_selfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" echo -e "" echo -e "${lightyellow}Enter ${gamename} CD Key${default}" diff --git a/lgsm/functions/mods_core.sh b/lgsm/functions/mods_core.sh index 68f791dbd..ff088653b 100644 --- a/lgsm/functions/mods_core.sh +++ b/lgsm/functions/mods_core.sh @@ -7,7 +7,7 @@ local modulename="MODS" local commandaction="Mods" -local function_selfname=$(basename "$(readlink -f "${BASH_SOURCE[0]}")") +local function_selfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" # Files and Directories. modsdir="${lgsmdir}/mods" diff --git a/lgsm/functions/mods_list.sh b/lgsm/functions/mods_list.sh index 8037f1eed..ed354d153 100644 --- a/lgsm/functions/mods_list.sh +++ b/lgsm/functions/mods_list.sh @@ -10,7 +10,7 @@ local modulename="MODS" local commandaction="List Mods" -local function_selfname=$(basename "$(readlink -f "${BASH_SOURCE[0]}")") +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" diff --git a/lgsm/functions/update_factorio.sh b/lgsm/functions/update_factorio.sh index b6700f66c..1fcfe9bf9 100644 --- a/lgsm/functions/update_factorio.sh +++ b/lgsm/functions/update_factorio.sh @@ -6,7 +6,7 @@ local modulename="UPDATE" local commandaction="Update" -local function_selfname=$(basename "$(readlink -f "${BASH_SOURCE[0]}")") +local function_selfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" fn_update_factorio_dl(){ fn_fetch_file "https://factorio.com/get-download/${downloadbranch}/headless/${factorioarch}" "${tmpdir}" "factorio_headless_${factorioarch}-${remotebuild}.tar.xz" diff --git a/lgsm/functions/update_minecraft.sh b/lgsm/functions/update_minecraft.sh index 361867467..a8f97dd17 100644 --- a/lgsm/functions/update_minecraft.sh +++ b/lgsm/functions/update_minecraft.sh @@ -6,7 +6,7 @@ local modulename="UPDATE" local commandaction="Update" -local function_selfname=$(basename "$(readlink -f "${BASH_SOURCE[0]}")") +local function_selfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" fn_update_minecraft_dl(){ if [ "${branch}" == "release" ]; then diff --git a/lgsm/functions/update_minecraft_bedrock.sh b/lgsm/functions/update_minecraft_bedrock.sh index 2cb29930f..d9d875c45 100644 --- a/lgsm/functions/update_minecraft_bedrock.sh +++ b/lgsm/functions/update_minecraft_bedrock.sh @@ -6,7 +6,7 @@ local modulename="UPDATE" local commandaction="Update" -local function_selfname=$(basename "$(readlink -f "${BASH_SOURCE[0]}")") +local function_selfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" fn_update_minecraft_dl(){ latestmcbuildurl=$(curl -s "https://www.minecraft.net/en-us/download/server/bedrock/" | grep -o 'https://minecraft.azureedge.net/bin-linux/[^"]*zip') diff --git a/lgsm/functions/update_mta.sh b/lgsm/functions/update_mta.sh index 5c5824983..db3080b17 100644 --- a/lgsm/functions/update_mta.sh +++ b/lgsm/functions/update_mta.sh @@ -6,7 +6,7 @@ local modulename="UPDATE" local commandaction="Update" -local function_selfname=$(basename "$(readlink -f "${BASH_SOURCE[0]}")") +local function_selfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" fn_update_mta_dl(){ fn_fetch_file "http://linux.mtasa.com/dl/multitheftauto_linux_x64.tar.gz" "${tmpdir}" "multitheftauto_linux_x64.tar.gz" diff --git a/lgsm/functions/update_mumble.sh b/lgsm/functions/update_mumble.sh index af320079d..88a7102c8 100644 --- a/lgsm/functions/update_mumble.sh +++ b/lgsm/functions/update_mumble.sh @@ -6,7 +6,7 @@ local modulename="UPDATE" local commandaction="Update" -local function_selfname=$(basename "$(readlink -f "${BASH_SOURCE[0]}")") +local function_selfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" fn_update_mumble_dl(){ fn_fetch_file "https://github.com/mumble-voip/mumble/releases/download/${remotebuild}/murmur-static_${mumblearch}-${remotebuild}.tar.bz2" "${tmpdir}" "murmur-static_${mumblearch}-${remotebuild}.tar.bz2" diff --git a/lgsm/functions/update_steamcmd.sh b/lgsm/functions/update_steamcmd.sh index f2651b3de..ef2a3f9ad 100644 --- a/lgsm/functions/update_steamcmd.sh +++ b/lgsm/functions/update_steamcmd.sh @@ -6,7 +6,7 @@ local modulename="UPDATE" local commandaction="Update" -local function_selfname=$(basename "$(readlink -f "${BASH_SOURCE[0]}")") +local function_selfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" fn_update_steamcmd_dl(){ info_config.sh diff --git a/lgsm/functions/update_ts3.sh b/lgsm/functions/update_ts3.sh index 0ca4b0842..593183f6f 100644 --- a/lgsm/functions/update_ts3.sh +++ b/lgsm/functions/update_ts3.sh @@ -6,7 +6,7 @@ local modulename="UPDATE" local commandaction="Update" -local function_selfname=$(basename "$(readlink -f "${BASH_SOURCE[0]}")") +local function_selfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" fn_update_ts3_dl(){ if [ "${ts3arch}" == "amd64" ]; then From 7a38c17186e969145a2ebcdc4b270f7ec05d0e31 Mon Sep 17 00:00:00 2001 From: Jimmy Maple <38733055+jimmyatSplunk@users.noreply.github.com> Date: Thu, 16 Apr 2020 10:02:34 -0400 Subject: [PATCH 336/534] fix(bug): gamedig not using the correct JSON object (#2821) --- README.md | 1 + lgsm/functions/command_monitor.sh | 14 ++++++++------ lgsm/functions/query_gamedig.sh | 2 +- 3 files changed, 10 insertions(+), 7 deletions(-) diff --git a/README.md b/README.md index 25996581a..6fecaea1a 100644 --- a/README.md +++ b/README.md @@ -60,3 +60,4 @@ Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/d This project follows the [all-contributors](https://github.com/all-contributors/all-contributors) specification. Contributions of any kind welcome! + diff --git a/lgsm/functions/command_monitor.sh b/lgsm/functions/command_monitor.sh index 6d78e75da..f538c7073 100644 --- a/lgsm/functions/command_monitor.sh +++ b/lgsm/functions/command_monitor.sh @@ -12,7 +12,7 @@ local function_selfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" fn_monitor_check_lockfile(){ # Monitor does not run it lockfile is not found. - if [ ! -f "${lockdir}/${selfname}.lock" ]; then + if [ ! -f "${rootdir}/${lockselfname}" ]; then fn_print_dots "Checking lockfile: " fn_print_checking_eol fn_script_log_info "Checking lockfile: CHECKING" @@ -21,13 +21,13 @@ fn_monitor_check_lockfile(){ fn_print_error_eol_nl fn_script_log_error "Checking lockfile: No lockfile found: ERROR" fn_sleep_time - echo -en "* Start ${selfname} to run monitor." + echo -e "* Start ${selfname} to run monitor." core_exit.sh fi # Fix if lockfile is not unix time or contains letters - if [[ "$(cat "${lockdir}/${selfname}.lock")" =~ [A-Za-z] ]]; then - date '+%s' > "${lockdir}/${selfname}.lock" + if [[ "$(cat "${rootdir}/${lockselfname}")" =~ [A-Za-z] ]]; then + date '+%s' > "${rootdir}/${lockselfname}" fi } @@ -108,7 +108,7 @@ for queryattempt in {1..5}; do fn_script_log_info "Querying port: ${querymethod}: ${ip}:${queryport} : ${queryattempt} : QUERYING" fn_sleep_time # querydelay - if [ "$(cat "${lockdir}/${selfname}.lock")" -gt "$(date "+%s" -d "${querydelay} mins ago")" ]; then + if [ "$(cat "${rootdir}/${lockselfname}")" -gt "$(date "+%s" -d "${querydelay} mins ago")" ]; then fn_print_ok "Querying port: ${querymethod}: ${ip}:${queryport} : ${totalseconds}/${queryattempt}: " fn_print_delay_eol_nl fn_script_log_info "Querying port: ${querymethod}: ${ip}:${queryport} : ${queryattempt} : DELAY" @@ -147,6 +147,9 @@ for queryattempt in {1..5}; do if [ "${gdplayers}" ]; then fn_script_log_info "Players: ${gdplayers}/${gdmaxplayers}" fi + if [ "${gdbots}" ]; then + fn_script_log_info "Bots: ${gdbots}" + fi if [ "${gdmap}" ]; then fn_script_log_info "Map: ${gdmap}" fi @@ -236,7 +239,6 @@ info_parms.sh # query pre-checks fn_monitor_check_lockfile -check_last_update.sh fn_monitor_check_update fn_monitor_check_session # Monitor will not continue if session only check. diff --git a/lgsm/functions/query_gamedig.sh b/lgsm/functions/query_gamedig.sh index 4f1bc5638..bfe38b937 100644 --- a/lgsm/functions/query_gamedig.sh +++ b/lgsm/functions/query_gamedig.sh @@ -30,7 +30,7 @@ if [ "$(command -v gamedig 2>/dev/null)" ]&&[ "$(command -v jq 2>/dev/null)" ]; fi # numplayers. - gdplayers=$(echo -e "${gamedigraw}" | jq -re '.players') + gdplayers=$(echo -e "${gamedigraw}" | jq -re '.raw.vanilla.raw.players.online') if [ "${gdplayers}" == "null" ]; then unset gdplayers elif [ "${gdplayers}" == "[]" ]; then From cf776ba8915efeb916d5220444f3f2c3e41f583f Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Fri, 17 Apr 2020 00:21:50 +0100 Subject: [PATCH 337/534] info_config --- tests/tests_jc2server.sh | 1 + 1 file changed, 1 insertion(+) diff --git a/tests/tests_jc2server.sh b/tests/tests_jc2server.sh index 56fc47808..012d90f27 100644 --- a/tests/tests_jc2server.sh +++ b/tests/tests_jc2server.sh @@ -935,6 +935,7 @@ echo -e "" echo -e "5.0 - Monitor Tests" echo -e "==================================================================" echo -e "" +info_config.sh echo -e "Server IP - Port: ${ip}:${port}" echo -e "Server IP - Query Port: ${ip}:${queryport}" From 8f14f97ec5ce6084adb984c4429a440451a1096f Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Fri, 17 Apr 2020 18:25:34 +0100 Subject: [PATCH 338/534] feat(steamcmd): move steamcmd dir to standard location (#2822) * improvements to steamclient.so fix * added fix to install inconsistent location across distros * added dev/null for master server * XDG_DATA_HOME * prevent check_last_update from restarting server if stopped --- lgsm/functions/check_last_update.sh | 3 +- lgsm/functions/check_steamcmd.sh | 45 ++++++++++++++++- lgsm/functions/core_functions.sh | 10 ++++ lgsm/functions/core_legacy.sh | 2 +- lgsm/functions/fix.sh | 4 ++ lgsm/functions/fix_arma3.sh | 4 +- lgsm/functions/fix_hw.sh | 33 ++++++++++++ lgsm/functions/fix_mcb.sh | 2 +- lgsm/functions/fix_mta.sh | 2 +- lgsm/functions/fix_nmrih.sh | 2 +- lgsm/functions/fix_onset.sh | 2 +- lgsm/functions/fix_rust.sh | 2 +- lgsm/functions/fix_rw.sh | 2 +- lgsm/functions/fix_sdtd.sh | 2 +- lgsm/functions/fix_sof2.sh | 2 +- lgsm/functions/fix_ss3.sh | 13 ++++- lgsm/functions/fix_steamcmd.sh | 78 +++++++---------------------- lgsm/functions/fix_tu.sh | 15 ++++++ lgsm/functions/fix_unt.sh | 2 +- lgsm/functions/fix_ut3.sh | 2 +- lgsm/functions/fix_wurm.sh | 5 +- lgsm/functions/info_distro.sh | 4 +- linuxgsm.sh | 2 +- tests/tests_fctrserver.sh | 4 +- tests/tests_jc2server.sh | 4 +- tests/tests_mcserver.sh | 4 +- tests/tests_ts3server.sh | 4 +- 27 files changed, 164 insertions(+), 90 deletions(-) create mode 100644 lgsm/functions/fix_hw.sh create mode 100644 lgsm/functions/fix_tu.sh diff --git a/lgsm/functions/check_last_update.sh b/lgsm/functions/check_last_update.sh index 52b8ef5a8..f77cee3c4 100644 --- a/lgsm/functions/check_last_update.sh +++ b/lgsm/functions/check_last_update.sh @@ -12,7 +12,8 @@ if [ -f "${lockdir}/lastupdate.lock" ]; then lastupdate=$(cat "${lockdir}/lastupdate.lock") fi -if [ -f "${lockdir}/lastupdate.lock" ]; then +check_status.sh +if [ -f "${lockdir}/lastupdate.lock" ]&&[ "${status}" != "0" ]; then if [ ! -f "${lockdir}/${selfname}-laststart.lock" ]||[ "${laststart}" -lt "${lastupdate}" ]; then fn_print_info "${selfname} has not been restarted since last update" fn_script_log_info "${selfname} has not been restarted since last update" diff --git a/lgsm/functions/check_steamcmd.sh b/lgsm/functions/check_steamcmd.sh index e30a9119c..437541d25 100644 --- a/lgsm/functions/check_steamcmd.sh +++ b/lgsm/functions/check_steamcmd.sh @@ -11,7 +11,7 @@ fn_install_steamcmd(){ steamcmddir="${serverfiles}/Engine/Binaries/ThirdParty/SteamCMD/Linux" fi if [ ! -d "${steamcmddir}" ]; then - mkdir -pv "${steamcmddir}" + mkdir -p "${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}" @@ -63,6 +63,47 @@ fn_check_steamcmd(){ fi } +fn_check_steamcmd_dir(){ + # Worksround that pre-installs the correct steam directories to ensure all packages use the correct Standard. + # https://github.com/ValveSoftware/steam-for-linux/issues/6976#issuecomment-610446347 + + # Create Steam installation directory. + if [ ! -d "${XDG_DATA_HOME:="${HOME}/.local/share"}/Steam" ]; then + mkdir -p "${XDG_DATA_HOME:="${HOME}/.local/share"}/Steam" + fi + + # Create common Steam directory. + if [ ! -d "${HOME}/.steam" ]; then + mkdir -p "${HOME}/.steam" + fi + + # Symbolic links to Steam installation directory. + if [ ! -L "${HOME}/.steam/root" ]; then + if [ -d "${HOME}/.steam/root" ]; then + rm "${HOME}/.steam/root" + fi + ln -s "${XDG_DATA_HOME:="${HOME}/.local/share"}/Steam" "${HOME}/.steam/root" + fi + + if [ ! -L "${HOME}/.steam/steam" ]; then + if [ -d "${HOME}/.steam/steam" ]; then + rm -rf "${HOME}/.steam/steam" + fi + ln -s "${XDG_DATA_HOME:="${HOME}/.local/share"}/Steam" "${HOME}/.steam/steam" + fi +} + +fn_check_steamcmd_dir_legacy(){ + # Remove old Steam installation directories ~/Steam and ${rootdir}/steamcmd + if [ -d "${rootdir}/steamcmd" ]&&[ "${steamcmddir}" == "${XDG_DATA_HOME:="${HOME}/.local/share"}/Steam" ]; then + rm -rf "${rootdir:?}/steamcmd" + fi + + if [ -d "${HOME}/Steam" ]&&[ "${steamcmddir}" == "${XDG_DATA_HOME:="${HOME}/.local/share"}/Steam" ]; then + rm -rf "${HOME}/Steam" + fi +} + fn_check_steamcmd_ark(){ # Checks if SteamCMD exists in # Engine/Binaries/ThirdParty/SteamCMD/Linux @@ -108,5 +149,7 @@ fn_check_steamcmd if [ ${shortname} == "ark" ]; then fn_check_steamcmd_ark fi +fn_check_steamcmd_dir +fn_check_steamcmd_dir_legacy fn_check_steamcmd_user fn_check_steamcmd_exec diff --git a/lgsm/functions/core_functions.sh b/lgsm/functions/core_functions.sh index d1969c920..e8cb4be06 100644 --- a/lgsm/functions/core_functions.sh +++ b/lgsm/functions/core_functions.sh @@ -321,6 +321,11 @@ functionfile="${FUNCNAME[0]}" fn_fetch_function } +fix_hw.sh(){ +functionfile="${FUNCNAME[0]}" +fn_fetch_function +} + fix_ins.sh(){ functionfile="${FUNCNAME[0]}" fn_fetch_function @@ -391,6 +396,11 @@ functionfile="${FUNCNAME[0]}" fn_fetch_function } +fix_tu.sh(){ +functionfile="${FUNCNAME[0]}" +fn_fetch_function +} + fix_ut3.sh(){ functionfile="${FUNCNAME[0]}" fn_fetch_function diff --git a/lgsm/functions/core_legacy.sh b/lgsm/functions/core_legacy.sh index c3efe7b63..e0ea7f9b3 100644 --- a/lgsm/functions/core_legacy.sh +++ b/lgsm/functions/core_legacy.sh @@ -26,7 +26,7 @@ if [ -z "${lgsmlogdate}" ]; then fi if [ -z "${steamcmddir}" ]; then - steamcmddir="${rootdir}/steamcmd" + steamcmddir="${HOME}/.steam/steamcmd" fi if [ -z "${lgsmdir}" ]; then diff --git a/lgsm/functions/fix.sh b/lgsm/functions/fix.sh index 3b5a58965..7d03bca99 100644 --- a/lgsm/functions/fix.sh +++ b/lgsm/functions/fix.sh @@ -47,6 +47,8 @@ if [ "${function_selfname}" != "command_install.sh" ]&&[ -z "${fixbypass}" ]; th fix_dst.sh elif [ "${shortname}" == "ges" ]; then fix_ges.sh + elif [ "${shortname}" == "hw" ]; then + fix_hw.sh elif [ "${shortname}" == "ins" ]; then fix_ins.sh elif [ "${shortname}" == "nmrih" ]; then @@ -71,6 +73,8 @@ if [ "${function_selfname}" != "command_install.sh" ]&&[ -z "${fixbypass}" ]; th fix_terraria.sh elif [ "${shortname}" == "ts3" ]; then fix_ts3.sh + elif [ "${shortname}" == "tu" ]; then + fix_tu.sh elif [ "${shortname}" == "mcb" ]; then fix_mcb.sh elif [ "${shortname}" == "mta" ]; then diff --git a/lgsm/functions/fix_arma3.sh b/lgsm/functions/fix_arma3.sh index 4e496250c..60dd4db25 100644 --- a/lgsm/functions/fix_arma3.sh +++ b/lgsm/functions/fix_arma3.sh @@ -9,9 +9,9 @@ local commandaction="Fix" local function_selfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" # Fixes: 20150 Segmentation fault (core dumped) error. -if [ ! -d "${HOME}/.local/share/Arma 3" ]||[ ! -d "${HOME}/.local/share/Arma 3 - Other Profiles" ]; then +if [ ! -d "${XDG_DATA_HOME:="${HOME}/.local/share"}/Arma 3" ]||[ ! -d "${XDG_DATA_HOME:="${HOME}/.local/share"}/Arma 3 - Other Profiles" ]; then fixname="20150 Segmentation fault (core dumped)" fn_fix_msg_start - mkdir -p "${HOME}/.local/share/Arma 3 - Other Profiles" + mkdir -p "${XDG_DATA_HOME:="${HOME}/.local/share"}/Arma 3 - Other Profiles" fn_fix_msg_end fi diff --git a/lgsm/functions/fix_hw.sh b/lgsm/functions/fix_hw.sh new file mode 100644 index 000000000..8b5844f52 --- /dev/null +++ b/lgsm/functions/fix_hw.sh @@ -0,0 +1,33 @@ +#!/bin/bash +# LinuxGSM fix_hw.sh function +# Author: Daniel Gibbs +# Website: https://linuxgsm.com +# Description: Resolves various issues with Hurtworld. + +if [ "${shortname}" == "hw" ]; then + # Fixes: [S_API FAIL] SteamAPI_Init() failed; unable to locate a running instance of Steam, or a local steamclient.so. + if [ ! -f "${serverfiles}/Hurtworld_Data/Plugins/x86/steamclient.so" ]; then + fixname="steamclient.so x86" + fn_fix_msg_start + if [ -f "${HOME}/.steam/steamcmd/linux32/steamclient.so" ]; then + cp -v "${HOME}/.steam/steamcmd/linux32/steamclient.so" "${serverfiles}/Hurtworld_Data/Plugins/x86/steamclient.so" >> "${lgsmlog}" + elif [ -f "${steamcmddir}/linux32/steamclient.so" ]; then + cp -v "${steamcmddir}/linux32/steamclient.so" "${serverfiles}/Hurtworld_Data/Plugins/x86/steamclient.so" >> "${lgsmlog}" + else + : + fi + 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 + if [ -f "${HOME}/.steam/steamcmd/linux64/steamclient.so" ]; then + cp -v "${HOME}/.steam/steamcmd/linux64/steamclient.so" "${serverfiles}/Hurtworld_Data/Plugins/x86_64/steamclient.so" >> "${lgsmlog}" + elif [ -f "${steamcmddir}/linux64/steamclient.so" ]; then + cp -v "${steamcmddir}/linux64/steamclient.so" "${serverfiles}/Hurtworld_Data/Plugins/x86_64/steamclient.so" >> "${lgsmlog}" + else + : + fi + fn_fix_msg_end + fi +fi diff --git a/lgsm/functions/fix_mcb.sh b/lgsm/functions/fix_mcb.sh index 5352fdee8..c417a8a39 100644 --- a/lgsm/functions/fix_mcb.sh +++ b/lgsm/functions/fix_mcb.sh @@ -2,7 +2,7 @@ # LinuxGSM fix_mcb.sh function # Author: Daniel Gibbs # Website: https://linuxgsm.com -# Description: Resolves possible startup issue with Minecraft Bedrock +# Description: Resolves possible startup issue with Minecraft Bedrock. local modulename="FIX" local commandaction="Fix" diff --git a/lgsm/functions/fix_mta.sh b/lgsm/functions/fix_mta.sh index 6cb6a6c72..662a1df00 100644 --- a/lgsm/functions/fix_mta.sh +++ b/lgsm/functions/fix_mta.sh @@ -3,7 +3,7 @@ # Author: Daniel Gibbs # Contributor: ChaosMTA # Website: https://linuxgsm.com -# Description: Installs the libmysqlclient for database functions on the server +# Description: Installs the libmysqlclient for database functions on the server. local modulename="FIX" local commandaction="Fix" diff --git a/lgsm/functions/fix_nmrih.sh b/lgsm/functions/fix_nmrih.sh index 7b27441d4..62ba20c21 100644 --- a/lgsm/functions/fix_nmrih.sh +++ b/lgsm/functions/fix_nmrih.sh @@ -1,7 +1,7 @@ #!/bin/bash # LinuxGSM fix_nmrih.sh function # Author: Denperidge -# Description: Create symlinks for renamed No More Room In Hell serverfiles +# Description: Create symlinks for renamed No More Room In Hell serverfiles. # Solution from Steam Community post: https://steamcommunity.com/app/224260/discussions/2/1732089092441769414/ local modulename="FIX" diff --git a/lgsm/functions/fix_onset.sh b/lgsm/functions/fix_onset.sh index dd7ce5b4e..59f7783ed 100644 --- a/lgsm/functions/fix_onset.sh +++ b/lgsm/functions/fix_onset.sh @@ -2,7 +2,7 @@ # LinuxGSM fix_onset.sh function # Author: Frédéric C. # Website: https://linuxgsm.com -# Description: Resolves various issues with Onset +# Description: Resolves various issues with Onset. local modulename="FIX" local commandaction="Fix" diff --git a/lgsm/functions/fix_rust.sh b/lgsm/functions/fix_rust.sh index bb70724db..29f2299c6 100644 --- a/lgsm/functions/fix_rust.sh +++ b/lgsm/functions/fix_rust.sh @@ -2,7 +2,7 @@ # LinuxGSM fix_rust.sh function # Author: Daniel Gibbs # Website: https://linuxgsm.com -# Description: Resolves startup issue with Rust +# Description: Resolves startup issue with Rust. local modulename="FIX" local commandaction="Fix" diff --git a/lgsm/functions/fix_rw.sh b/lgsm/functions/fix_rw.sh index 73cafcf2e..650d3b231 100644 --- a/lgsm/functions/fix_rw.sh +++ b/lgsm/functions/fix_rw.sh @@ -2,7 +2,7 @@ # LinuxGSM fix_rw.sh function # Author: Daniel Gibbs # Website: https://linuxgsm.com -# Description: Resolves startup issue with Rising World +# Description: Resolves various issues with Rising World. local modulename="FIX" local commandaction="Fix" diff --git a/lgsm/functions/fix_sdtd.sh b/lgsm/functions/fix_sdtd.sh index 005fb8f6c..acb1d9891 100644 --- a/lgsm/functions/fix_sdtd.sh +++ b/lgsm/functions/fix_sdtd.sh @@ -2,7 +2,7 @@ # LinuxGSM fix_sdtd.sh function # Author: Daniel Gibbs # Website: https://linuxgsm.com -# Description: Resolves startup issue with 7 Days to Die +# Description: Resolves various issues with 7 Days to Die. local modulename="FIX" local commandaction="Fix" diff --git a/lgsm/functions/fix_sof2.sh b/lgsm/functions/fix_sof2.sh index 11af88522..cdffa6c7f 100644 --- a/lgsm/functions/fix_sof2.sh +++ b/lgsm/functions/fix_sof2.sh @@ -2,7 +2,7 @@ # LinuxGSM fix_rust.sh function # Author: Daniel Gibbs # Website: https://linuxgsm.com -# Description: Resolves startup issue with Soldier of Fortune 2 +# Description: Resolves various issues with Soldier of Fortune 2. local modulename="FIX" local commandaction="Fix" diff --git a/lgsm/functions/fix_ss3.sh b/lgsm/functions/fix_ss3.sh index c83c5bb9c..1a5b22d7f 100644 --- a/lgsm/functions/fix_ss3.sh +++ b/lgsm/functions/fix_ss3.sh @@ -8,10 +8,19 @@ local modulename="FIX" local commandaction="Fix" local function_selfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" -# Fixes https://steamcommunity.com/app/41070/discussions/0/353916981477716386/ -if [ "$(diff "${HOME}/.steam/steamcmd/linux32/steamclient.so" "${serverfiles}/Bin/steamclient.so" >/dev/null)" ]; then +# Fixes: https://steamcommunity.com/app/41070/discussions/0/353916981477716386/ +if [ ! -f "${serverfiles}/Bin/steamclient.so" ]||[ "$(diff "${HOME}/.steam/steamcmd/linux32/steamclient.so" "${serverfiles}/Bin/steamclient.so" 2>/dev/null)" ]; then fixname="steamclient.so" fn_fix_msg_start cp -f "${HOME}/.steam/steamcmd/linux32/steamclient.so" "${serverfiles}/Bin/steamclient.so" fn_fix_msg_end fi + +# Fixes: .steam/bin32/libsteam.so: cannot open shared object file: No such file or directory +if [ ! -f "${HOME}/.steam/bin32/libsteam.so" ]; then + fixname="libsteam.so" + fn_fix_msg_start + mkdir -pv "${HOME}/.steam/bin32" >> "${lgsmlog}" + cp "${serverfiles}/Bin/libsteam.so" "${HOME}/.steam/bin32/libsteam.so" >> "${lgsmlog}" + fn_fix_msg_end +fi diff --git a/lgsm/functions/fix_steamcmd.sh b/lgsm/functions/fix_steamcmd.sh index 4cb846944..aba06461c 100644 --- a/lgsm/functions/fix_steamcmd.sh +++ b/lgsm/functions/fix_steamcmd.sh @@ -8,9 +8,24 @@ local modulename="FIX" local commandaction="Fix" local function_selfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" -# Fixes: [S_API FAIL] SteamAPI_Init() failed; unable to locate a running instance of Steam,or a local steamclient.so. +# Helps fix: [S_API FAIL] SteamAPI_Init() failed; unable to locate a running instance of Steam,or a local steamclient.so. +if [ ! -f "${HOME}/.steam/sdk64/steamclient.so" ]; then + fixname="steamclient.so sdk64" + fn_fix_msg_start + mkdir -pv "${HOME}/.steam/sdk64" >> "${lgsmlog}" + if [ -f "${HOME}/.steam/steamcmd/linux64/steamclient.so" ]; then + cp -v "${HOME}/.steam/steamcmd/linux64/steamclient.so" "${HOME}/.steam/sdk64/steamclient.so" >> "${lgsmlog}" + elif [ -f "${steamcmddir}/linux64/steamclient.so" ]; then + cp -v "${steamcmddir}/linux64/steamclient.so" "${HOME}/.steam/sdk64/steamclient.so" >> "${lgsmlog}" + else + $?=2 + fi + fn_fix_msg_end +fi + +# Helps fix: [S_API FAIL] SteamAPI_Init() failed; unable to locate a running instance of Steam,or a local steamclient.so. if [ ! -f "${HOME}/.steam/sdk32/steamclient.so" ]; then - fixname="steamclient.so" + fixname="steamclient.so sdk32" fn_fix_msg_start mkdir -pv "${HOME}/.steam/sdk32" >> "${lgsmlog}" if [ -f "${HOME}/.steam/steamcmd/linux32/steamclient.so" ]; then @@ -22,62 +37,3 @@ if [ ! -f "${HOME}/.steam/sdk32/steamclient.so" ]; then fi fn_fix_msg_end fi - -if [ "${shortname}" == "bt" ]; then - # Fixes: [S_API FAIL] SteamAPI_Init() failed; SteamAPI_IsSteamRunning() failed. - if [ ! -L "${executabledir}/lib64/steamclient.so" ]; then - fixname="steamclient.so x86_64" - fn_fix_msg_start - if [ -f "${HOME}/.steam/steamcmd/linux64/steamclient.so" ]; then - cp -v "${HOME}/.steam/steamcmd/linux64/steamclient.so" "${executabledir}/lib64/steamclient.so" >> "${lgsmlog}" - elif [ -f "${steamcmddir}/linux64/steamclient.so" ]; then - cp -v "${steamcmddir}/linux64/steamclient.so" "${executabledir}/lib64/steamclient.so" >> "${lgsmlog}" - else - $?=2 - fi - fn_fix_msg_end - fi -elif [ "${shortname}" == "ss3" ]; then - # Fixes: .steam/bin32/libsteam.so: cannot open shared object file: No such file or directory - if [ ! -f "${HOME}/.steam/bin32/libsteam.so" ]; then - fixname="libsteam.so" - fn_fix_msg_start - mkdir -pv "${HOME}/.steam/bin32" >> "${lgsmlog}" - cp "${serverfiles}/Bin/libsteam.so" "${HOME}/.steam/bin32/libsteam.so" >> "${lgsmlog}" - fn_fix_msg_end - fi -elif [ "${shortname}" == "hw" ]; then - # Fixes: [S_API FAIL] SteamAPI_Init() failed; unable to locate a running instance of Steam, or a local steamclient.so. - if [ ! -f "${serverfiles}/Hurtworld_Data/Plugins/x86/steamclient.so" ]; then - fixname="steamclient.so x86" - fn_fix_msg_start - if [ -f "${HOME}/.steam/steamcmd/linux32/steamclient.so" ]; then - cp -v "${HOME}/.steam/steamcmd/linux32/steamclient.so" "${serverfiles}/Hurtworld_Data/Plugins/x86/steamclient.so" >> "${lgsmlog}" - elif [ -f "${steamcmddir}/linux32/steamclient.so" ]; then - cp -v "${steamcmddir}/linux32/steamclient.so" "${serverfiles}/Hurtworld_Data/Plugins/x86/steamclient.so" >> "${lgsmlog}" - else - : - fi - 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 - if [ -f "${HOME}/.steam/steamcmd/linux64/steamclient.so" ]; then - cp -v "${HOME}/.steam/steamcmd/linux64/steamclient.so" "${serverfiles}/Hurtworld_Data/Plugins/x86_64/steamclient.so" >> "${lgsmlog}" - elif [ -f "${steamcmddir}/linux64/steamclient.so" ]; then - cp -v "${steamcmddir}/linux64/steamclient.so" "${serverfiles}/Hurtworld_Data/Plugins/x86_64/steamclient.so" >> "${lgsmlog}" - else - : - fi - fn_fix_msg_end - fi -elif [ "${shortname}" == "tu" ]; 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 "${serverfiles}/linux64/steamclient.so" "${executabledir}/steamclient.so" >> "${lgsmlog}" - fn_fix_msg_end - fi -fi diff --git a/lgsm/functions/fix_tu.sh b/lgsm/functions/fix_tu.sh new file mode 100644 index 000000000..24bae047a --- /dev/null +++ b/lgsm/functions/fix_tu.sh @@ -0,0 +1,15 @@ +#!/bin/bash +# LinuxGSM fix_tu.sh function +# Author: Daniel Gibbs +# Website: https://linuxgsm.com +# Description: Resolves various issues with Tower Unite. + +if [ "${shortname}" == "tu" ]; 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 "${serverfiles}/linux64/steamclient.so" "${executabledir}/steamclient.so" >> "${lgsmlog}" + fn_fix_msg_end + fi +fi diff --git a/lgsm/functions/fix_unt.sh b/lgsm/functions/fix_unt.sh index 2c27e2f31..f55be43a9 100644 --- a/lgsm/functions/fix_unt.sh +++ b/lgsm/functions/fix_unt.sh @@ -2,7 +2,7 @@ # LinuxGSM fix_rust.sh function # Author: Daniel Gibbs # Website: https://linuxgsm.com -# Description: Resolves startup issue with Unturned +# Description: Resolves startup issue with Unturned. local modulename="FIX" local commandaction="Fix" diff --git a/lgsm/functions/fix_ut3.sh b/lgsm/functions/fix_ut3.sh index 3595cb898..4c099294f 100644 --- a/lgsm/functions/fix_ut3.sh +++ b/lgsm/functions/fix_ut3.sh @@ -2,7 +2,7 @@ # LinuxGSM fix_ut2.sh function # Author: Daniel Gibbs # Website: https://linuxgsm.com -# Description: Resolves various issues with configs in Unreal Tournament 3. +# Description: Resolves various issues with Unreal Tournament 3. local modulename="FIX" local commandaction="Fix" diff --git a/lgsm/functions/fix_wurm.sh b/lgsm/functions/fix_wurm.sh index f127ef142..8ee907103 100644 --- a/lgsm/functions/fix_wurm.sh +++ b/lgsm/functions/fix_wurm.sh @@ -2,7 +2,10 @@ # LinuxGSM fix_wurm.sh function # Author: Daniel Gibbs # Website: https://linuxgsm.com -# Description: Resolves various issues with ARK: Survival Evolved. +# Description: Resolves various issues with Wurm Unlimited. + +local modulename="FIX" +local commandaction="Fix" local modulename="FIX" local commandaction="Fix" diff --git a/lgsm/functions/info_distro.sh b/lgsm/functions/info_distro.sh index d3761b3d0..de35150ac 100644 --- a/lgsm/functions/info_distro.sh +++ b/lgsm/functions/info_distro.sh @@ -263,9 +263,9 @@ fi if [ "$(command -v jq 2>/dev/null)" ]; then if [ "${ip}" ]&&[ "${port}" ]; then if [ "${steammaster}" == "true" ]; then - masterserver=$(curl -m 3 -s 'https://api.steampowered.com/ISteamApps/GetServersAtAddress/v0001?addr='${ip}':'${port}'&format=json' | jq '.response.servers[]|.addr' | wc -l) + masterserver=$(curl -m 3 -s 'https://api.steampowered.com/ISteamApps/GetServersAtAddress/v0001?addr='${ip}':'${port}'&format=json' | jq '.response.servers[]|.addr' | wc -l 2>/dev/null) if [ "${masterserver}" == "0" ]; then - masterserver=$(curl -m 3 -s 'https://api.steampowered.com/ISteamApps/GetServersAtAddress/v0001?addr='${extip}':'${port}'&format=json' | jq '.response.servers[]|.addr' | wc -l) + masterserver=$(curl -m 3 -s 'https://api.steampowered.com/ISteamApps/GetServersAtAddress/v0001?addr='${extip}':'${port}'&format=json' | jq '.response.servers[]|.addr' | wc -l 2>/dev/null) fi if [ "${masterserver}" == "0" ]; then displaymasterserver="false" diff --git a/linuxgsm.sh b/linuxgsm.sh index eb9368997..d11617fc3 100755 --- a/linuxgsm.sh +++ b/linuxgsm.sh @@ -28,7 +28,7 @@ selfname=$(basename "$(readlink -f "${BASH_SOURCE[0]}")") lgsmdir="${rootdir}/lgsm" logdir="${rootdir}/log" lgsmlogdir="${logdir}/lgsm" -steamcmddir="${rootdir}/steamcmd" +steamcmddir="${HOME}/.steam/steamcmd" serverfiles="${rootdir}/serverfiles" functionsdir="${lgsmdir}/functions" tmpdir="${lgsmdir}/tmp" diff --git a/tests/tests_fctrserver.sh b/tests/tests_fctrserver.sh index 8e80ee5f6..7e477a095 100644 --- a/tests/tests_fctrserver.sh +++ b/tests/tests_fctrserver.sh @@ -28,7 +28,7 @@ selfname=$(basename "$(readlink -f "${BASH_SOURCE[0]}")") lgsmdir="${rootdir}/lgsm" logdir="${rootdir}/log" lgsmlogdir="${logdir}/lgsm" -steamcmddir="${rootdir}/steamcmd" +steamcmddir="${HOME}/.steam/steamcmd" serverfiles="${rootdir}/serverfiles" functionsdir="${lgsmdir}/functions" tmpdir="${lgsmdir}/tmp" @@ -591,7 +591,7 @@ getopt="abc123" set -x core_getopt.sh ) -fn_test_result_fail +fn_test_result_pass echo -e "run order" echo -e "=================" grep functionfile= "${TRAVIS_BUILD_DIR}/dev-debug.log" | sed 's/functionfile=//g' diff --git a/tests/tests_jc2server.sh b/tests/tests_jc2server.sh index 012d90f27..f6bf0816b 100644 --- a/tests/tests_jc2server.sh +++ b/tests/tests_jc2server.sh @@ -28,7 +28,7 @@ selfname=$(basename "$(readlink -f "${BASH_SOURCE[0]}")") lgsmdir="${rootdir}/lgsm" logdir="${rootdir}/log" lgsmlogdir="${logdir}/lgsm" -steamcmddir="${rootdir}/steamcmd" +steamcmddir="${HOME}/.steam/steamcmd" serverfiles="${rootdir}/serverfiles" functionsdir="${lgsmdir}/functions" tmpdir="${lgsmdir}/tmp" @@ -591,7 +591,7 @@ getopt="abc123" set -x core_getopt.sh ) -fn_test_result_fail +fn_test_result_pass echo -e "run order" echo -e "=================" grep functionfile= "${TRAVIS_BUILD_DIR}/dev-debug.log" | sed 's/functionfile=//g' diff --git a/tests/tests_mcserver.sh b/tests/tests_mcserver.sh index c34d26edf..e6b5d94fc 100644 --- a/tests/tests_mcserver.sh +++ b/tests/tests_mcserver.sh @@ -28,7 +28,7 @@ selfname=$(basename "$(readlink -f "${BASH_SOURCE[0]}")") lgsmdir="${rootdir}/lgsm" logdir="${rootdir}/log" lgsmlogdir="${logdir}/lgsm" -steamcmddir="${rootdir}/steamcmd" +steamcmddir="${HOME}/.steam/steamcmd" serverfiles="${rootdir}/serverfiles" functionsdir="${lgsmdir}/functions" tmpdir="${lgsmdir}/tmp" @@ -591,7 +591,7 @@ getopt="abc123" set -x core_getopt.sh ) -fn_test_result_fail +fn_test_result_pass echo -e "run order" echo -e "=================" grep functionfile= "${TRAVIS_BUILD_DIR}/dev-debug.log" | sed 's/functionfile=//g' diff --git a/tests/tests_ts3server.sh b/tests/tests_ts3server.sh index b51411a3b..756fdcd2d 100644 --- a/tests/tests_ts3server.sh +++ b/tests/tests_ts3server.sh @@ -28,7 +28,7 @@ selfname=$(basename "$(readlink -f "${BASH_SOURCE[0]}")") lgsmdir="${rootdir}/lgsm" logdir="${rootdir}/log" lgsmlogdir="${logdir}/lgsm" -steamcmddir="${rootdir}/steamcmd" +steamcmddir="${HOME}/.steam/steamcmd" serverfiles="${rootdir}/serverfiles" functionsdir="${lgsmdir}/functions" tmpdir="${lgsmdir}/tmp" @@ -591,7 +591,7 @@ getopt="abc123" set -x core_getopt.sh ) -fn_test_result_fail +fn_test_result_pass echo -e "run order" echo -e "=================" grep functionfile= "${TRAVIS_BUILD_DIR}/dev-debug.log" | sed 's/functionfile=//g' From b88f8d2981d16eedd137fb04fdadee96804194c4 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Fri, 17 Apr 2020 23:28:14 +0100 Subject: [PATCH 339/534] fix(travis): add various fixes to travis tests (#2827) --- lgsm/functions/command_backup.sh | 2 +- lgsm/functions/command_monitor.sh | 8 +- tests/tests_fctrserver.sh | 136 ++++++++++++++++++++++++----- tests/tests_jc2server.sh | 140 +++++++++++++++++++++++++----- tests/tests_mcserver.sh | 135 +++++++++++++++++++++++----- tests/tests_ts3server.sh | 137 ++++++++++++++++++++++++----- 6 files changed, 460 insertions(+), 98 deletions(-) diff --git a/lgsm/functions/command_backup.sh b/lgsm/functions/command_backup.sh index 5e84d76d1..1f9a2cae7 100644 --- a/lgsm/functions/command_backup.sh +++ b/lgsm/functions/command_backup.sh @@ -30,7 +30,7 @@ fn_backup_trap(){ fn_backup_check_lockfile(){ if [ -f "${lockdir}/.backup.lock" ]; then fn_print_info_nl "Lock file found: Backup is currently running" - fn_script_log_error "Lock file found: Backup is currently running: ${tmpdir}/.backup.lock" + fn_script_log_error "Lock file found: Backup is currently running: ${lockdir}/.backup.lock" core_exit.sh fi } diff --git a/lgsm/functions/command_monitor.sh b/lgsm/functions/command_monitor.sh index f538c7073..893ba992f 100644 --- a/lgsm/functions/command_monitor.sh +++ b/lgsm/functions/command_monitor.sh @@ -12,7 +12,7 @@ local function_selfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" fn_monitor_check_lockfile(){ # Monitor does not run it lockfile is not found. - if [ ! -f "${rootdir}/${lockselfname}" ]; then + if [ ! -f "${lockdir}/${selfname}.lock" ]; then fn_print_dots "Checking lockfile: " fn_print_checking_eol fn_script_log_info "Checking lockfile: CHECKING" @@ -26,8 +26,8 @@ fn_monitor_check_lockfile(){ fi # Fix if lockfile is not unix time or contains letters - if [[ "$(cat "${rootdir}/${lockselfname}")" =~ [A-Za-z] ]]; then - date '+%s' > "${rootdir}/${lockselfname}" + if [[ "$(cat "${lockdir}/${selfname}.lock")" =~ [A-Za-z] ]]; then + date '+%s' > "${lockdir}/${selfname}.lock" fi } @@ -108,7 +108,7 @@ for queryattempt in {1..5}; do fn_script_log_info "Querying port: ${querymethod}: ${ip}:${queryport} : ${queryattempt} : QUERYING" fn_sleep_time # querydelay - if [ "$(cat "${rootdir}/${lockselfname}")" -gt "$(date "+%s" -d "${querydelay} mins ago")" ]; then + if [ "$(cat "${lockdir}/${selfname}.lock")" -gt "$(date "+%s" -d "${querydelay} mins ago")" ]; then fn_print_ok "Querying port: ${querymethod}: ${ip}:${queryport} : ${totalseconds}/${queryattempt}: " fn_print_delay_eol_nl fn_script_log_info "Querying port: ${querymethod}: ${ip}:${queryport} : ${queryattempt} : DELAY" diff --git a/tests/tests_fctrserver.sh b/tests/tests_fctrserver.sh index 7e477a095..c7bf9192a 100644 --- a/tests/tests_fctrserver.sh +++ b/tests/tests_fctrserver.sh @@ -41,14 +41,17 @@ configdirserver="${configdir}/${gameservername}" configdirdefault="${lgsmdir}/config-default" userinput="${1}" -# Allows for testing not on Travis CI -if [ ! -v TRAVIS ]; then +# Allows for testing not on Travis CI. +# if using travis for tests +if [ -n "${TRAVIS}" ]; then + selfname="travis" +# if not using travis for tests +else TRAVIS_BRANCH="develop" TRAVIS_BUILD_DIR="${rootdir}" -else - selfname="travis" - travistest="1" + fi +travistest="1" ## GitHub Branch Select # Allows for the use of different function files @@ -353,19 +356,24 @@ else fi fi fi + # shellcheck source=/dev/null 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" "${chmodx}" "nochmodx" "norun" "noforcedl" "nomd5" + # shellcheck source=/dev/null source "${configdirserver}/common.cfg" else + # shellcheck source=/dev/null source "${configdirserver}/common.cfg" fi # Load the instance.cfg config. If missing download it. if [ ! -f "${configdirserver}/${selfname}.cfg" ]; then fn_fetch_config "lgsm/config-default/config-lgsm" "instance-template.cfg" "${configdirserver}" "${selfname}.cfg" "nochmodx" "norun" "noforcedl" "nomd5" + # shellcheck source=/dev/null source "${configdirserver}/${selfname}.cfg" else + # shellcheck source=/dev/null source "${configdirserver}/${selfname}.cfg" fi @@ -377,7 +385,7 @@ else # Enables ANSI colours from core_messages.sh. Can be disabled with ansi=off. fn_ansi_loader # Prevents running of core_exit.sh for Travis-CI. - if [ -z "${travistest}" ]; then + if [ "${travistest}" != "1" ]; then getopt=$1 core_getopt.sh fi @@ -392,15 +400,6 @@ fn_currentstatus_tmux(){ fi } -fn_currentstatus_ts3(){ - check_status.sh - if [ "${status}" != "0" ]; then - currentstatus="ONLINE" - else - currentstatus="OFFLINE" - fi -} - fn_setstatus(){ fn_currentstatus_tmux echo"" @@ -490,10 +489,61 @@ echo -e "" echo -e "=================================" echo -e "Server Tests" echo -e "Using: ${gamename}" -echo -e "Testing Branch: $TRAVIS_BRANCH" +echo -e "Testing Branch: ${TRAVIS_BRANCH}" echo -e "=================================" echo -e "" +echo -e "Tests Summary" +echo -e "=================================" +echo -e "0.0 - Pre-test Tasks" +echo -e "0.1 - Create log dir's" +echo -e "0.2 - Enable dev-debug" +echo -e "" +echo -e "1.0 - Pre-install tests" +echo -e "1.1 - start - no files" +echo -e "1.2 - getopt" +echo -e "1.3 - getopt with incorrect args" +echo -e "" +echo -e "2.0 - Installation" +echo -e "2.1 - install" +echo -e "" +echo -e "3.0 - Start/Stop/Restart Tests" +echo -e "3.1 - start" +echo -e "3.2 - start - online" +echo -e "3.3 - start - updateonstart" +echo -e "3.4 - stop" +echo -e "3.5 - stop - offline" +echo -e "3.6 - restart" +echo -e "3.7 - restart - offline" +echo -e "" +echo -e "4.0 - Update Tests" +echo -e "4.1 - update" +echo -e "4.2 - update-lgsm" +echo -e "" +echo -e "5.0 - Monitor Tests" +echo -e "5.1 - monitor - online" +echo -e "5.2 - monitor - offline - with lockfile" +echo -e "5.3 - monitor - offline - no lockfile" +echo -e "5.4 - test-alert" +echo -e "" +echo -e "6.0 - Details Tests" +echo -e "6.1 - details" +echo -e "6.2 - postdetails" +echo -e "" +echo -e "7.0 - Backup Tests" +echo -e "7.1 - backup" +echo -e "" +echo -e "8.0 - Development Tools Tests" +echo -e "8.1 - dev - detect glibc" +echo -e "8.2 - dev - detect ldd" +echo -e "8.3 - dev - detect deps" +echo -e "8.4 - dev - query-raw" + +echo -e "" +echo -e "9.0 - Donate" +echo -e "9.1 - donate" +echo -e "" + echo -e "0.0 - Pre-test Tasks" echo -e "==================================================================" echo -e "Description:" @@ -543,7 +593,7 @@ echo -e "test script reaction to missing server files." echo -e "Command: ./${gameservername} start" echo -e "" # Allows for testing not on Travis CI -if [ ! -v TRAVIS ]; then +if [ -z "${TRAVIS}" ]; then ( exec 5>"${TRAVIS_BUILD_DIR}/dev-debug.log" BASH_XTRACEFD="5" @@ -601,7 +651,7 @@ echo -e "2.0 - Installation" echo -e "==================================================================" echo -e "" -echo -e "2.0 - install" +echo -e "2.1 - install" echo -e "=================================" echo -e "Description:" echo -e "install ${gamename} server." @@ -777,10 +827,31 @@ echo -e "run order" echo -e "=================" grep functionfile= "${TRAVIS_BUILD_DIR}/dev-debug.log" | sed 's/functionfile=//g' +echo -e "" +echo -e "4.2 - update-lgsm" +echo -e "=================================" +echo -e "Description:" +echo -e "update LinuxGSM." +echo -e "" +echo -e "Command: ./jc2server update-lgam" +requiredstatus="ONLINE" +fn_setstatus +( + exec 5>"${TRAVIS_BUILD_DIR}/dev-debug.log" + BASH_XTRACEFD="5" + set -x + command_update_linuxgsm.sh +) +fn_test_result_pass +echo -e "run order" +echo -e "=================" +grep functionfile= "${TRAVIS_BUILD_DIR}/dev-debug.log" | sed 's/functionfile=//g' + echo -e "" echo -e "5.0 - Monitor Tests" echo -e "==================================================================" echo -e "" +info_config.sh echo -e "Server IP - Port: ${ip}:${port}" echo -e "Server IP - Query Port: ${ip}:${queryport}" @@ -1003,6 +1074,30 @@ echo -e "run order" echo -e "=================" grep functionfile= "${TRAVIS_BUILD_DIR}/dev-debug.log" | sed 's/functionfile=//g' +echo -e "" + +echo -e "9.0 - Donate" +echo -e "==================================================================" + +echo -e "" +echo -e "9.1 - donate" +echo -e "=================================" +echo -e "Description:" +echo -e "donate." +echo -e "Command: ./${gameservername} donate" +requiredstatus="ONLINE" +fn_setstatus +( + exec 5>"${TRAVIS_BUILD_DIR}/dev-debug.log" + BASH_XTRACEFD="5" + set -x + command_donate.sh +) +fn_test_result_pass +echo -e "run order" +echo -e "=================" +grep functionfile= "${TRAVIS_BUILD_DIR}/dev-debug.log" | sed 's/functionfile=//g' + echo -e "" echo -e "=================================" echo -e "Server Tests - Complete!" @@ -1010,8 +1105,5 @@ echo -e "Using: ${gamename}" echo -e "=================================" requiredstatus="OFFLINE" fn_setstatus -if [ ! -v TRAVIS ]; then - fn_print_info "Tidying up directories." - rm -rfv "${serverfiles:?}" -fi + core_exit.sh diff --git a/tests/tests_jc2server.sh b/tests/tests_jc2server.sh index f6bf0816b..3f9b49e4a 100644 --- a/tests/tests_jc2server.sh +++ b/tests/tests_jc2server.sh @@ -41,14 +41,16 @@ configdirserver="${configdir}/${gameservername}" configdirdefault="${lgsmdir}/config-default" userinput="${1}" -# Allows for testing not on Travis CI -if [ ! -v TRAVIS ]; then +# Allows for testing not on Travis CI. +# if using travis for tests +if [ -n "${TRAVIS}" ]; then + selfname="travis" +# if not using travis for tests +else TRAVIS_BRANCH="develop" TRAVIS_BUILD_DIR="${rootdir}" -else - selfname="travis" - travistest="1" fi +travistest="1" ## GitHub Branch Select # Allows for the use of different function files @@ -242,7 +244,7 @@ fn_install_file(){ if [ -e "${local_filename}" ]; then i=2 while [ -e "${local_filename}-${i}" ] ; do - let i++ + (( i++ )) done local_filename="${local_filename}-${i}" fi @@ -353,19 +355,24 @@ else fi fi fi + # shellcheck source=/dev/null 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" "${chmodx}" "nochmodx" "norun" "noforcedl" "nomd5" + # shellcheck source=/dev/null source "${configdirserver}/common.cfg" else + # shellcheck source=/dev/null source "${configdirserver}/common.cfg" fi # Load the instance.cfg config. If missing download it. if [ ! -f "${configdirserver}/${selfname}.cfg" ]; then fn_fetch_config "lgsm/config-default/config-lgsm" "instance-template.cfg" "${configdirserver}" "${selfname}.cfg" "nochmodx" "norun" "noforcedl" "nomd5" + # shellcheck source=/dev/null source "${configdirserver}/${selfname}.cfg" else + # shellcheck source=/dev/null source "${configdirserver}/${selfname}.cfg" fi @@ -377,7 +384,7 @@ else # Enables ANSI colours from core_messages.sh. Can be disabled with ansi=off. fn_ansi_loader # Prevents running of core_exit.sh for Travis-CI. - if [ -z "${travistest}" ]; then + if [ "${travistest}" != "1" ]; then getopt=$1 core_getopt.sh fi @@ -392,15 +399,6 @@ fn_currentstatus_tmux(){ fi } -fn_currentstatus_ts3(){ - check_status.sh - if [ "${status}" != "0" ]; then - currentstatus="ONLINE" - else - currentstatus="OFFLINE" - fi -} - fn_setstatus(){ fn_currentstatus_tmux echo"" @@ -490,9 +488,64 @@ echo -e "" echo -e "=================================" echo -e "Server Tests" echo -e "Using: ${gamename}" -echo -e "Testing Branch: $TRAVIS_BRANCH" +echo -e "Testing Branch: ${TRAVIS_BRANCH}" echo -e "=================================" - +echo -e "" +echo -e "Tests Summary" +echo -e "=================================" +echo -e "0.0 - Pre-test Tasks" +echo -e "0.1 - Create log dir's" +echo -e "0.2 - Enable dev-debug" +echo -e "" +echo -e "1.0 - Pre-install tests" +echo -e "1.1 - start - no files" +echo -e "1.2 - getopt" +echo -e "1.3 - getopt with incorrect args" +echo -e "" +echo -e "2.0 - Installation" +echo -e "2.1 - install" +echo -e "" +echo -e "3.0 - Start/Stop/Restart Tests" +echo -e "3.1 - start" +echo -e "3.2 - start - online" +echo -e "3.3 - start - updateonstart" +echo -e "3.4 - stop" +echo -e "3.5 - stop - offline" +echo -e "3.6 - restart" +echo -e "3.7 - restart - offline" +echo -e "" +echo -e "4.0 - Update Tests" +echo -e "4.1 - update" +echo -e "4.2 - update - change buildid" +echo -e "4.3 - update - change buildid - online" +echo -e "4.4 - update - remove appmanifest file" +echo -e "4.5 - force-update" +echo -e "4.6 - force-update - online" +echo -e "4.7 - validate" +echo -e "4.8 - validate - online" +echo -e "4.9 - update-lgsm" +echo -e "" +echo -e "5.0 - Monitor Tests" +echo -e "5.1 - monitor - online" +echo -e "5.2 - monitor - offline - with lockfile" +echo -e "5.3 - monitor - offline - no lockfile" +echo -e "5.4 - test-alert" +echo -e "" +echo -e "6.0 - Details Tests" +echo -e "6.1 - details" +echo -e "6.2 - postdetails" +echo -e "" +echo -e "7.0 - Backup Tests" +echo -e "7.1 - backup" +echo -e "" +echo -e "8.0 - Development Tools Tests" +echo -e "8.1 - dev - detect glibc" +echo -e "8.2 - dev - detect ldd" +echo -e "8.3 - dev - detect deps" +echo -e "8.4 - dev - query-raw" +echo -e "" +echo -e "9.0 - Donate" +echo -e "9.1 - donate" echo -e "" echo -e "0.0 - Pre-test Tasks" echo -e "==================================================================" @@ -543,7 +596,7 @@ echo -e "test script reaction to missing server files." echo -e "Command: ./${gameservername} start" echo -e "" # Allows for testing not on Travis CI -if [ ! -v TRAVIS ]; then +if [ -z "${TRAVIS}" ]; then ( exec 5>"${TRAVIS_BUILD_DIR}/dev-debug.log" BASH_XTRACEFD="5" @@ -601,7 +654,7 @@ echo -e "2.0 - Installation" echo -e "==================================================================" echo -e "" -echo -e "2.0 - install" +echo -e "2.1 - install" echo -e "=================================" echo -e "Description:" echo -e "install ${gamename} server." @@ -917,6 +970,26 @@ echo -e "run order" echo -e "=================" grep functionfile= "${TRAVIS_BUILD_DIR}/dev-debug.log" | sed 's/functionfile=//g' +echo -e "" +echo -e "4.9 - update-lgsm" +echo -e "=================================" +echo -e "Description:" +echo -e "update LinuxGSM." +echo -e "" +echo -e "Command: ./jc2server update-lgam" +requiredstatus="ONLINE" +fn_setstatus +( + exec 5>"${TRAVIS_BUILD_DIR}/dev-debug.log" + BASH_XTRACEFD="5" + set -x + command_update_linuxgsm.sh +) +fn_test_result_pass +echo -e "run order" +echo -e "=================" +grep functionfile= "${TRAVIS_BUILD_DIR}/dev-debug.log" | sed 's/functionfile=//g' + echo -e "" echo -e "Inserting IP address" echo -e "=================================" @@ -1165,6 +1238,29 @@ echo -e "run order" echo -e "=================" grep functionfile= "${TRAVIS_BUILD_DIR}/dev-debug.log" | sed 's/functionfile=//g' +echo -e "" +echo -e "9.0 - Donate" +echo -e "==================================================================" + +echo -e "" +echo -e "9.1 - donate" +echo -e "=================================" +echo -e "Description:" +echo -e "donate." +echo -e "Command: ./${gameservername} donate" +requiredstatus="ONLINE" +fn_setstatus +( + exec 5>"${TRAVIS_BUILD_DIR}/dev-debug.log" + BASH_XTRACEFD="5" + set -x + command_donate.sh +) +fn_test_result_pass +echo -e "run order" +echo -e "=================" +grep functionfile= "${TRAVIS_BUILD_DIR}/dev-debug.log" | sed 's/functionfile=//g' + echo -e "" echo -e "=================================" echo -e "Server Tests - Complete!" @@ -1172,8 +1268,4 @@ echo -e "Using: ${gamename}" echo -e "=================================" requiredstatus="OFFLINE" fn_setstatus -if [ ! -v TRAVIS ]; then - fn_print_info "Tidying up directories." - rm -rfv "${serverfiles:?}" -fi core_exit.sh diff --git a/tests/tests_mcserver.sh b/tests/tests_mcserver.sh index e6b5d94fc..605613c46 100644 --- a/tests/tests_mcserver.sh +++ b/tests/tests_mcserver.sh @@ -41,14 +41,17 @@ configdirserver="${configdir}/${gameservername}" configdirdefault="${lgsmdir}/config-default" userinput="${1}" -# Allows for testing not on Travis CI -if [ ! -v TRAVIS ]; then +# Allows for testing not on Travis CI. +# if using travis for tests +if [ -n "${TRAVIS}" ]; then + selfname="travis" +# if not using travis for tests +else TRAVIS_BRANCH="develop" TRAVIS_BUILD_DIR="${rootdir}" -else - selfname="travis" - travistest="1" + fi +travistest="1" ## GitHub Branch Select # Allows for the use of different function files @@ -242,7 +245,7 @@ fn_install_file(){ if [ -e "${local_filename}" ]; then i=2 while [ -e "${local_filename}-${i}" ] ; do - let i++ + (( i++ )) done local_filename="${local_filename}-${i}" fi @@ -353,19 +356,24 @@ else fi fi fi + # shellcheck source=/dev/null 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" "${chmodx}" "nochmodx" "norun" "noforcedl" "nomd5" + # shellcheck source=/dev/null source "${configdirserver}/common.cfg" else + # shellcheck source=/dev/null source "${configdirserver}/common.cfg" fi # Load the instance.cfg config. If missing download it. if [ ! -f "${configdirserver}/${selfname}.cfg" ]; then fn_fetch_config "lgsm/config-default/config-lgsm" "instance-template.cfg" "${configdirserver}" "${selfname}.cfg" "nochmodx" "norun" "noforcedl" "nomd5" + # shellcheck source=/dev/null source "${configdirserver}/${selfname}.cfg" else + # shellcheck source=/dev/null source "${configdirserver}/${selfname}.cfg" fi @@ -377,7 +385,7 @@ else # Enables ANSI colours from core_messages.sh. Can be disabled with ansi=off. fn_ansi_loader # Prevents running of core_exit.sh for Travis-CI. - if [ -z "${travistest}" ]; then + if [ "${travistest}" != "1" ]; then getopt=$1 core_getopt.sh fi @@ -392,15 +400,6 @@ fn_currentstatus_tmux(){ fi } -fn_currentstatus_ts3(){ - check_status.sh - if [ "${status}" != "0" ]; then - currentstatus="ONLINE" - else - currentstatus="OFFLINE" - fi -} - fn_setstatus(){ fn_currentstatus_tmux echo"" @@ -490,8 +489,57 @@ echo -e "" echo -e "=================================" echo -e "Server Tests" echo -e "Using: ${gamename}" -echo -e "Testing Branch: $TRAVIS_BRANCH" +echo -e "Testing Branch: ${TRAVIS_BRANCH}" +echo -e "=================================" +echo -e "" +echo -e "Tests Summary" echo -e "=================================" +echo -e "0.0 - Pre-test Tasks" +echo -e "0.1 - Create log dir's" +echo -e "0.2 - Enable dev-debug" +echo -e "" +echo -e "1.0 - Pre-install tests" +echo -e "1.1 - start - no files" +echo -e "1.2 - getopt" +echo -e "1.3 - getopt with incorrect args" +echo -e "" +echo -e "2.0 - Installation" +echo -e "2.1 - install" +echo -e "" +echo -e "3.0 - Start/Stop/Restart Tests" +echo -e "3.1 - start" +echo -e "3.2 - start - online" +echo -e "3.3 - start - updateonstart" +echo -e "3.4 - stop" +echo -e "3.5 - stop - offline" +echo -e "3.6 - restart" +echo -e "3.7 - restart - offline" +echo -e "" +echo -e "4.0 - Update Tests" +echo -e "4.1 - update" +echo -e "4.2 - update-lgsm" +echo -e "" +echo -e "5.0 - Monitor Tests" +echo -e "5.1 - monitor - online" +echo -e "5.2 - monitor - offline - with lockfile" +echo -e "5.3 - monitor - offline - no lockfile" +echo -e "5.4 - test-alert" +echo -e "" +echo -e "6.0 - Details Tests" +echo -e "6.1 - details" +echo -e "6.2 - postdetails" +echo -e "" +echo -e "7.0 - Backup Tests" +echo -e "7.1 - backup" +echo -e "" +echo -e "8.0 - Development Tools Tests" +echo -e "8.1 - dev - detect glibc" +echo -e "8.2 - dev - detect ldd" +echo -e "8.3 - dev - detect deps" +echo -e "8.4 - dev - query-raw" +echo -e "" +echo -e "9.0 - Donate" +echo -e "9.1 - donate" echo -e "" echo -e "0.0 - Pre-test Tasks" @@ -543,7 +591,7 @@ echo -e "test script reaction to missing server files." echo -e "Command: ./${gameservername} start" echo -e "" # Allows for testing not on Travis CI -if [ ! -v TRAVIS ]; then +if [ -z "${TRAVIS}" ]; then ( exec 5>"${TRAVIS_BUILD_DIR}/dev-debug.log" BASH_XTRACEFD="5" @@ -601,7 +649,7 @@ echo -e "2.0 - Installation" echo -e "==================================================================" echo -e "" -echo -e "2.0 - install" +echo -e "2.1 - install" echo -e "=================================" echo -e "Description:" echo -e "install ${gamename} server." @@ -786,6 +834,26 @@ echo -e "run order" echo -e "=================" grep functionfile= "${TRAVIS_BUILD_DIR}/dev-debug.log" | sed 's/functionfile=//g' +echo -e "" +echo -e "4.2 - update-lgsm" +echo -e "=================================" +echo -e "Description:" +echo -e "update LinuxGSM." +echo -e "" +echo -e "Command: ./jc2server update-lgam" +requiredstatus="ONLINE" +fn_setstatus +( + exec 5>"${TRAVIS_BUILD_DIR}/dev-debug.log" + BASH_XTRACEFD="5" + set -x + command_update_linuxgsm.sh +) +fn_test_result_pass +echo -e "run order" +echo -e "=================" +grep functionfile= "${TRAVIS_BUILD_DIR}/dev-debug.log" | sed 's/functionfile=//g' + echo -e "" echo -e "Inserting IP address" echo -e "=================================" @@ -804,6 +872,7 @@ echo -e "" echo -e "5.0 - Monitor Tests" echo -e "==================================================================" echo -e "" +info_config.sh echo -e "Server IP - Port: ${ip}:${port}" echo -e "Server IP - Query Port: ${ip}:${queryport}" @@ -1050,6 +1119,29 @@ echo -e "run order" echo -e "=================" grep functionfile= "${TRAVIS_BUILD_DIR}/dev-debug.log" | sed 's/functionfile=//g' +echo -e "" +echo -e "9.0 - Donate" +echo -e "==================================================================" + +echo -e "" +echo -e "9.1 - donate" +echo -e "=================================" +echo -e "Description:" +echo -e "donate." +echo -e "Command: ./${gameservername} donate" +requiredstatus="ONLINE" +fn_setstatus +( + exec 5>"${TRAVIS_BUILD_DIR}/dev-debug.log" + BASH_XTRACEFD="5" + set -x + command_donate.sh +) +fn_test_result_pass +echo -e "run order" +echo -e "=================" +grep functionfile= "${TRAVIS_BUILD_DIR}/dev-debug.log" | sed 's/functionfile=//g' + echo -e "" echo -e "=================================" echo -e "Server Tests - Complete!" @@ -1057,8 +1149,5 @@ echo -e "Using: ${gamename}" echo -e "=================================" requiredstatus="OFFLINE" fn_setstatus -if [ ! -v TRAVIS ]; then - fn_print_info "Tidying up directories." - rm -rfv "${serverfiles:?}" -fi + core_exit.sh diff --git a/tests/tests_ts3server.sh b/tests/tests_ts3server.sh index 756fdcd2d..a4049a138 100644 --- a/tests/tests_ts3server.sh +++ b/tests/tests_ts3server.sh @@ -41,14 +41,17 @@ configdirserver="${configdir}/${gameservername}" configdirdefault="${lgsmdir}/config-default" userinput="${1}" -# Allows for testing not on Travis CI -if [ ! -v TRAVIS ]; then +# Allows for testing not on Travis CI. +# if using travis for tests +if [ -n "${TRAVIS}" ]; then + selfname="travis" +# if not using travis for tests +else TRAVIS_BRANCH="develop" TRAVIS_BUILD_DIR="${rootdir}" -else - selfname="travis" - travistest="1" + fi +travistest="1" ## GitHub Branch Select # Allows for the use of different function files @@ -353,19 +356,24 @@ else fi fi fi + # shellcheck source=/dev/null 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" "${chmodx}" "nochmodx" "norun" "noforcedl" "nomd5" + # shellcheck source=/dev/null source "${configdirserver}/common.cfg" else + # shellcheck source=/dev/null source "${configdirserver}/common.cfg" fi # Load the instance.cfg config. If missing download it. if [ ! -f "${configdirserver}/${selfname}.cfg" ]; then fn_fetch_config "lgsm/config-default/config-lgsm" "instance-template.cfg" "${configdirserver}" "${selfname}.cfg" "nochmodx" "norun" "noforcedl" "nomd5" + # shellcheck source=/dev/null source "${configdirserver}/${selfname}.cfg" else + # shellcheck source=/dev/null source "${configdirserver}/${selfname}.cfg" fi @@ -377,7 +385,7 @@ else # Enables ANSI colours from core_messages.sh. Can be disabled with ansi=off. fn_ansi_loader # Prevents running of core_exit.sh for Travis-CI. - if [ -z "${travistest}" ]; then + if [ "${travistest}" != "1" ]; then getopt=$1 core_getopt.sh fi @@ -392,24 +400,15 @@ fn_currentstatus_tmux(){ fi } -fn_currentstatus_ts3(){ - check_status.sh - if [ "${status}" != "0" ]; then - currentstatus="ONLINE" - else - currentstatus="OFFLINE" - fi -} - fn_setstatus(){ - fn_currentstatus_ts3 + fn_currentstatus_tmux echo"" echo -e "Required status: ${requiredstatus}" counter=0 echo -e "Current status: ${currentstatus}" while [ "${requiredstatus}" != "${currentstatus}" ]; do counter=$((counter+1)) - fn_currentstatus_ts3 + fn_currentstatus_tmux echo -en "New status: ${currentstatus}\\r" if [ "${requiredstatus}" == "ONLINE" ]; then @@ -490,9 +489,58 @@ echo -e "" echo -e "=================================" echo -e "Server Tests" echo -e "Using: ${gamename}" -echo -e "Testing Branch: $TRAVIS_BRANCH" +echo -e "Testing Branch: ${TRAVIS_BRANCH}" echo -e "=================================" +echo -e "" +echo -e "Tests Summary" +echo -e "=================================" +echo -e "0.0 - Pre-test Tasks" +echo -e "0.1 - Create log dir's" +echo -e "0.2 - Enable dev-debug" +echo -e "" +echo -e "1.0 - Pre-install tests" +echo -e "1.1 - start - no files" +echo -e "1.2 - getopt" +echo -e "1.3 - getopt with incorrect args" +echo -e "" +echo -e "2.0 - Installation" +echo -e "2.1 - install" +echo -e "" +echo -e "3.0 - Start/Stop/Restart Tests" +echo -e "3.1 - start" +echo -e "3.2 - start - online" +echo -e "3.3 - start - updateonstart" +echo -e "3.4 - stop" +echo -e "3.5 - stop - offline" +echo -e "3.6 - restart" +echo -e "3.7 - restart - offline" +echo -e "" +echo -e "4.0 - Update Tests" +echo -e "4.1 - update" +echo -e "4.2 - update-lgsm" +echo -e "" +echo -e "5.0 - Monitor Tests" +echo -e "5.1 - monitor - online" +echo -e "5.2 - monitor - offline - with lockfile" +echo -e "5.3 - monitor - offline - no lockfile" +echo -e "5.4 - test-alert" +echo -e "" +echo -e "6.0 - Details Tests" +echo -e "6.1 - details" +echo -e "6.2 - postdetails" +echo -e "" +echo -e "7.0 - Backup Tests" +echo -e "7.1 - backup" +echo -e "" +echo -e "8.0 - Development Tools Tests" +echo -e "8.1 - dev - detect glibc" +echo -e "8.2 - dev - detect ldd" +echo -e "8.3 - dev - detect deps" +echo -e "8.4 - dev - query-raw" +echo -e "" +echo -e "9.0 - Donate" +echo -e "9.1 - donate" echo -e "" echo -e "0.0 - Pre-test Tasks" echo -e "==================================================================" @@ -543,7 +591,7 @@ echo -e "test script reaction to missing server files." echo -e "Command: ./${gameservername} start" echo -e "" # Allows for testing not on Travis CI -if [ ! -v TRAVIS ]; then +if [ -z "${TRAVIS}" ]; then ( exec 5>"${TRAVIS_BUILD_DIR}/dev-debug.log" BASH_XTRACEFD="5" @@ -601,7 +649,7 @@ echo -e "2.0 - Installation" echo -e "==================================================================" echo -e "" -echo -e "2.0 - install" +echo -e "2.1 - install" echo -e "=================================" echo -e "Description:" echo -e "install ${gamename} server." @@ -777,10 +825,31 @@ echo -e "run order" echo -e "=================" grep functionfile= "${TRAVIS_BUILD_DIR}/dev-debug.log" | sed 's/functionfile=//g' +echo -e "" +echo -e "4.2 - update-lgsm" +echo -e "=================================" +echo -e "Description:" +echo -e "update LinuxGSM." +echo -e "" +echo -e "Command: ./jc2server update-lgam" +requiredstatus="ONLINE" +fn_setstatus +( + exec 5>"${TRAVIS_BUILD_DIR}/dev-debug.log" + BASH_XTRACEFD="5" + set -x + command_update_linuxgsm.sh +) +fn_test_result_pass +echo -e "run order" +echo -e "=================" +grep functionfile= "${TRAVIS_BUILD_DIR}/dev-debug.log" | sed 's/functionfile=//g' + echo -e "" echo -e "5.0 - Monitor Tests" echo -e "==================================================================" echo -e "" +info_config.sh echo -e "Server IP - Port: ${ip}:${port}" echo -e "Server IP - Query Port: ${ip}:${queryport}" @@ -1003,6 +1072,29 @@ echo -e "run order" echo -e "=================" grep functionfile= "${TRAVIS_BUILD_DIR}/dev-debug.log" | sed 's/functionfile=//g' +echo -e "" +echo -e "9.0 - Donate" +echo -e "==================================================================" + +echo -e "" +echo -e "9.1 - donate" +echo -e "=================================" +echo -e "Description:" +echo -e "donate." +echo -e "Command: ./${gameservername} donate" +requiredstatus="ONLINE" +fn_setstatus +( + exec 5>"${TRAVIS_BUILD_DIR}/dev-debug.log" + BASH_XTRACEFD="5" + set -x + command_donate.sh +) +fn_test_result_pass +echo -e "run order" +echo -e "=================" +grep functionfile= "${TRAVIS_BUILD_DIR}/dev-debug.log" | sed 's/functionfile=//g' + echo -e "" echo -e "=================================" echo -e "Server Tests - Complete!" @@ -1010,8 +1102,5 @@ echo -e "Using: ${gamename}" echo -e "=================================" requiredstatus="OFFLINE" fn_setstatus -if [ ! -v TRAVIS ]; then - fn_print_info "Tidying up directories." - rm -rfv "${serverfiles:?}" -fi + core_exit.sh From b194aebb1e540e649142de1e992f047674292ae1 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Fri, 17 Apr 2020 23:30:23 +0100 Subject: [PATCH 340/534] fix(ss3server): resolve ss3 dependency issues (#2823) --- lgsm/functions/check_deps.sh | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/lgsm/functions/check_deps.sh b/lgsm/functions/check_deps.sh index a0188e9e2..5c830b048 100644 --- a/lgsm/functions/check_deps.sh +++ b/lgsm/functions/check_deps.sh @@ -417,9 +417,6 @@ fn_deps_build_debian(){ # GoldenEye: Source elif [ "${shortname}" == "ges" ]; then array_deps_required+=( zlib1g:i386 libldap-2.4-2:i386 ) - # Serious Sam 3: BFE - elif [ "${shortname}" == "ss3" ]; 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 ) # Sven Co-op elif [ "${shortname}" == "sven" ]; then array_deps_required+=( libssl1.1:i386 zlib1g:i386 ) @@ -531,9 +528,7 @@ fn_deps_build_redhat(){ # GoldenEye: Source elif [ "${shortname}" == "ges" ]; then array_deps_required+=( zlib.i686 openldap.i686 ) - # Serious Sam 3: BFE - elif [ "${shortname}" == "ss3" ]; then - : # not compatible + # Sven Co-op elif [ "${shortname}" == "sven" ]; then : # not compatible # Unreal Engine From f355275cdfe0565e651541f4511742457f30bd93 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Sat, 18 Apr 2020 20:59:53 +0100 Subject: [PATCH 341/534] feat(solserver): migrate to steamcmd and improve monitor (#2829) * convert to SteamCMD * add soldat query * Added display ports in query raw --- .../config-lgsm/solserver/_default.cfg | 14 +++++++----- lgsm/functions/command_dev_query_raw.sh | 14 ++++++++---- lgsm/functions/info_config.sh | 22 +++++++++++++++---- lgsm/functions/info_messages.sh | 2 +- lgsm/functions/info_parms.sh | 11 ---------- lgsm/functions/install_server_files.sh | 2 -- lgsm/functions/query_gsquery.py | 13 ++++++----- 7 files changed, 46 insertions(+), 32 deletions(-) diff --git a/lgsm/config-default/config-lgsm/solserver/_default.cfg b/lgsm/config-default/config-lgsm/solserver/_default.cfg index 96fed3f00..47a08ddf0 100644 --- a/lgsm/config-default/config-lgsm/solserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/solserver/_default.cfg @@ -10,13 +10,11 @@ ## Server Start Settings | https://docs.linuxgsm.com/configuration/start-parameters ip="0.0.0.0" -port="23073" -maxplayers="32" maplist="mapslist.txt" ## Server Start Command | https://docs.linuxgsm.com/configuration/start-parameters#additional-parameters fn_parms(){ -parms="-b ${ip} -p ${port} -l ${maxplayers} -m ${maplist} -c ${servercfg}" +parms="-b ${ip} -m ${maplist} -c ${servercfg}" } #### LinuxGSM Settings #### @@ -102,6 +100,12 @@ ansi="on" ## Message Display Time | https://docs.linuxgsm.com/features/message-display-time sleeptime="0.5" +## SteamCMD Settings | https://docs.linuxgsm.com/steamcmd +# Server appid +appid="638500" +# SteamCMD Branch | https://docs.linuxgsm.com/steamcmd/branch +branch="" + ## Stop Mode | https://docs.linuxgsm.com/features/stop-mode # 1: tmux kill # 2: CTRL+c @@ -121,8 +125,8 @@ stopmode="2" # 3: gamedig # 4: gsquery # 5: tcp -querymode="5" -querytype="" +querymode="4" +querytype="soldat" ## Game Server Details # Do not edit diff --git a/lgsm/functions/command_dev_query_raw.sh b/lgsm/functions/command_dev_query_raw.sh index 829acdc31..4375b731e 100644 --- a/lgsm/functions/command_dev_query_raw.sh +++ b/lgsm/functions/command_dev_query_raw.sh @@ -8,10 +8,20 @@ local modulename="QUERY-RAW" local commandaction="Query Raw" local function_selfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" +check.sh +info_config.sh +info_parms.sh + echo -e "" echo -e "Query Port - Raw Output" echo -e "==================================================================" echo -e "" +echo -e "Ports" +echo -e "=================================" +echo -e "" +echo -e "PORT: ${port}" +echo -e "QUERY PORT: ${queryport}" +echo -e "" echo -e "Gamedig Raw Output" echo -e "=================================" echo -e "" @@ -22,10 +32,6 @@ if [ ! "$(command -v jq 2>/dev/null)" ]; then fn_print_failure_nl "jq not installed" fi -check.sh -info_config.sh -info_parms.sh - query_gamedig.sh echo -e "${gamedigcmd}" echo"" diff --git a/lgsm/functions/info_config.sh b/lgsm/functions/info_config.sh index b657e80ac..f1dd0d71e 100644 --- a/lgsm/functions/info_config.sh +++ b/lgsm/functions/info_config.sh @@ -1350,13 +1350,27 @@ fn_info_config_mordhau(){ fn_info_config_soldat(){ if [ ! -f "${servercfgfullpath}" ]; then + adminpassword="${unavailable}" + maxplayers="${unavailable}" + port="${zero}" + queryport="${zero}" servername="${unavailable}" serverpassword="${unavailable}" - adminpassword="${unavailable}" else - servername=$(grep "Server_Name" "${servercfgfullpath}" | awk -F '=' '{print $2}') - serverpassword=$(grep "Game_Password" "${servercfgfullpath}" | awk -F '=' '{print $2}') - adminpassword=$(grep "Admin_Password" "${servercfgfullpath}" | awk -F '=' '{print $2}') + adminpassword=$(grep "Admin_Password=" "${servercfgfullpath}" | awk -F '=' '{print $2}') + maxplayers=$(grep "Max_Players=" "${servercfgfullpath}" | tr -cd '[:digit:]') + port=$(grep "Port=" "${servercfgfullpath}" | tr -cd '[:digit:]') + queryport="${port}" + servername=$(grep "Server_Name=" "${servercfgfullpath}" | awk -F '=' '{print $2}') + serverpassword=$(grep "Game_Password=" "${servercfgfullpath}" | awk -F '=' '{print $2}') + + # Not set + adminpassword=${adminpassword:-"NOT SET"} + maxplayers=${maxplayers:-"0"} + port=${port:-"23073"} + queryport=${queryport:-"23083"} + servername=${servername:-"NOT SET"} + serverpassword=${serverpassword:-"NOT SET"} fi } diff --git a/lgsm/functions/info_messages.sh b/lgsm/functions/info_messages.sh index 87d66fb5e..81df0ae2a 100644 --- a/lgsm/functions/info_messages.sh +++ b/lgsm/functions/info_messages.sh @@ -1341,7 +1341,7 @@ fn_info_message_soldat() { { echo -e "${lightblue}DESCRIPTION\tDIRECTION\tPORT\tPROTOCOL${default}" echo -e "> Game\tINBOUND\t${port}\tudp" - echo -e "> RCON\tINBOUND\t${port}\ttcp" + echo -e "> Query\tINBOUND\t${queryport}\tudp" echo -e "> FILES\tINBOUND\t$((port+10))\ttcp" } | column -s $'\t' -t } diff --git a/lgsm/functions/info_parms.sh b/lgsm/functions/info_parms.sh index 10b06c03a..9cb56bb58 100644 --- a/lgsm/functions/info_parms.sh +++ b/lgsm/functions/info_parms.sh @@ -179,15 +179,6 @@ fn_info_parms_sof2(){ defaultmap=${defaultmap:-"NOT SET"} } -fn_info_parms_soldat(){ - port=${port:-"0"} - queryport=${port:-"0"} - servername=${servername:-"NOT SET"} - serverpassword=${serverpassword:-"NOT SET"} - adminpassword=${adminpassword:-"NOT SET"} - maxplayers=${maxplayers:-"0"} -} - fn_info_parms_ss3(){ port=${port:-"0"} queryport=$((port + 1)) @@ -279,8 +270,6 @@ elif [ "${shortname}" == "sof2" ]; then # Sticky Bots elif [ "${shortname}" == "sbots" ]; then fn_info_parms_stickybots -elif [ "${shortname}" == "sol" ]; then - fn_info_parms_soldat # Serious Sam elif [ "${shortname}" == "ss3" ]; then fn_info_parms_ss3 diff --git a/lgsm/functions/install_server_files.sh b/lgsm/functions/install_server_files.sh index 9cc0e91c9..1c5a31abb 100644 --- a/lgsm/functions/install_server_files.sh +++ b/lgsm/functions/install_server_files.sh @@ -61,8 +61,6 @@ fn_install_server_files(){ remote_fileurl="http://linuxgsm.download/WolfensteinEnemyTerritory/enemy-territory.260b.tar.bz2"; local_filedir="${tmpdir}"; local_filename="enemy-territory.260b.tar.bz2"; chmodx="nochmodx" run="norun"; force="noforce"; md5="f833f514bfcdd46b42c111f83350c5a7" elif [ "${shortname}" == "samp" ]; then remote_fileurl="https://files.sa-mp.com/samp037svr_R2-1.tar.gz"; local_filedir="${tmpdir}"; local_filename="samp037svr_R2-1.tar.gz"; chmodx="nochmodx" run="norun"; force="noforce"; md5="93705e165550c97484678236749198a4" - elif [ "${shortname}" == "sol" ]; then - remote_fileurl="https://static.soldat.pl/downloads/soldatserver2.8.1_1.7.1.zip"; local_filedir="${tmpdir}"; local_filename="soldatserver2.8.1_1.7.1.zip"; chmodx="nochmodx" run="norun"; force="noforce"; md5="994409c28520425965dec5c71ccb55e1" elif [ "${shortname}" == "zmr" ]; then remote_fileurl="http://linuxgsm.download/ZombieMasterReborn/zombie_master_reborn_b5_2.tar.bz2"; local_filedir="${tmpdir}"; local_filename="zombie_master_reborn_b5_2.tar.bz2"; chmodx="nochmodx" run="norun"; force="noforce"; md5="d52ef2db376f5d21e3a4ceca85ec8761" fi diff --git a/lgsm/functions/query_gsquery.py b/lgsm/functions/query_gsquery.py index 419edddda..8df1474a1 100644 --- a/lgsm/functions/query_gsquery.py +++ b/lgsm/functions/query_gsquery.py @@ -24,6 +24,7 @@ class gsquery: minecraftbequery=['minecraftbe'] jc2mpquery=['jc2mp'] mumblequery=['mumbleping'] + soldatquery=['soldat'] twquery=['teeworlds'] unrealquery=['protocol-gamespy1','unreal'] unreal2query=['protocol-unreal2','unreal2'] @@ -41,12 +42,14 @@ class gsquery: self.query_prompt_string = b'\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\x00\xfe\xfe\xfe\xfe\xfd\xfd\xfd\xfd\x12\x34\x56\x78\x00\x00\x00\x00\x00\x00\x00\x00' elif self.option.engine in mumblequery: self.query_prompt_string = b'\x00\x00\x00\x00\x01\x02\x03\x04\x05\x06\x07\x08' + elif self.option.engine in soldatquery: + self.query_prompt_string = b'\x69\x00' + elif self.option.engine in twquery: + self.query_prompt_string = b"\x04\x00\x00\xff\xff\xff\xff\x05" + bytearray(511) elif self.option.engine in unrealquery: self.query_prompt_string = b'\x5C\x69\x6E\x66\x6F\x5C' elif self.option.engine in unreal2query: self.query_prompt_string = b'\x79\x00\x00\x00\x00' - elif self.option.engine in twquery: - self.query_prompt_string = b"\x04\x00\x00\xff\xff\xff\xff\x05" + bytearray(511) self.connected = False self.response = None @@ -81,8 +84,8 @@ class gsquery: # Response. if self.response is None: self.fatal_error('No response', 3) - if len(self.response) < 10: - sys.exit('Short response.', 3) + if len(self.response) < 2: + sys.exit('Short response.', 5) else: self.exit_success(str(self.response)) @@ -116,7 +119,7 @@ if __name__ == '__main__': action='store', dest='engine', default=False, - help='Engine type: protocol-valve protocol-quake3 protocol-quake3 protocol-gamespy1 protocol-unreal2 minecraft minecraftbe jc2mp mumbleping teeworlds' + help='Engine type: protocol-valve protocol-quake3 protocol-quake3 protocol-gamespy1 protocol-unreal2 minecraft minecraftbe jc2mp mumbleping soldat teeworlds' ) parser.add_option( '-v', '--verbose', From f0729fc33090f57eaddb208d8219f2d074f93a8e Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Sat, 18 Apr 2020 22:42:46 +0100 Subject: [PATCH 342/534] feat(newserver): Assetto Corsa (#2830) --- .../config-lgsm/acserver/_default.cfg | 169 ++++++++++++++++++ lgsm/data/serverlist.csv | 1 + lgsm/functions/check_steamcmd.sh | 6 +- lgsm/functions/command_validate.sh | 3 + lgsm/functions/info_config.sh | 30 +++- lgsm/functions/info_messages.sh | 14 +- lgsm/functions/install_config.sh | 6 + lgsm/functions/install_server_files.sh | 7 +- lgsm/functions/update_steamcmd.sh | 2 + 9 files changed, 232 insertions(+), 6 deletions(-) create mode 100644 lgsm/config-default/config-lgsm/acserver/_default.cfg diff --git a/lgsm/config-default/config-lgsm/acserver/_default.cfg b/lgsm/config-default/config-lgsm/acserver/_default.cfg new file mode 100644 index 000000000..43fea751b --- /dev/null +++ b/lgsm/config-default/config-lgsm/acserver/_default.cfg @@ -0,0 +1,169 @@ +################################## +######## Default Settings ######## +################################## +# DO NOT EDIT, ANY CHANGES 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. + +#### Game Server Settings #### + +## SteamCMD Login | https://docs.linuxgsm.com/steamcmd#steamcmd-login +steamuser="username" +steampass='password' + +## Server Start Settings | https://docs.linuxgsm.com/configuration/start-parameters + +## Server Start Command | https://docs.linuxgsm.com/configuration/start-parameters#additional-parameters +fn_parms(){ +parms="-c ${servercfgfullpath}" +} + +#### LinuxGSM Settings #### + +## LinuxGSM Stats +# Send useful stats to LinuxGSM developers. +# https://docs.linuxgsm.com/configuration/linuxgsm-stats +# (on|off) +stats="off" + +## Notification Alerts +# (on|off) + +# Display IP | https://docs.linuxgsm.com/alerts#display-ip +displayip="" + +# More info | https://docs.linuxgsm.com/alerts#more-info +postalert="off" +postdays="7" +posttarget="https://termbin.com" + +# Discord Alerts | https://docs.linuxgsm.com/alerts/discord +discordalert="off" +discordwebhook="webhook" + +# Email Alerts | https://docs.linuxgsm.com/alerts/email +emailalert="off" +email="email@example.com" +emailfrom="" + +# IFTTT Alerts | https://docs.linuxgsm.com/alerts/ifttt +iftttalert="off" +ifttttoken="accesstoken" +iftttevent="linuxgsm_alert" + +# Mailgun Email Alerts | https://docs.linuxgsm.com/alerts/mailgun +mailgunalert="off" +mailguntoken="accesstoken" +mailgundomain="example.com" +mailgunemailfrom="alert@example.com" +mailgunemail="email@myemail.com" + +# Pushbullet Alerts | https://docs.linuxgsm.com/alerts/pushbullet +pushbulletalert="off" +pushbullettoken="accesstoken" +channeltag="" + +# Pushover Alerts | https://docs.linuxgsm.com/alerts/pushover +pushoveralert="off" +pushovertoken="accesstoken" + +# Slack Alerts | https://docs.linuxgsm.com/alerts/slack +slackalert="off" +slackwebhook="webhook" + +# Telegram Alerts | https://docs.linuxgsm.com/alerts/telegram +# You can add a custom cURL string eg proxy (useful in Russia) or else in "curlcustomstring". +# like a "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help", if you not need +# any custom string in curl - simple ignore this parameter. +telegramalert="off" +telegramtoken="accesstoken" +telegramchatid="" +curlcustomstring="" + +## Updating | https://docs.linuxgsm.com/commands/update +updateonstart="off" + +## Backup | https://docs.linuxgsm.com/commands/backup +maxbackups="4" +maxbackupdays="30" +stoponbackup="on" + +## Logging | https://docs.linuxgsm.com/features/logging +consolelogging="on" +logdays="7" + +## Monitor | https://docs.linuxgsm.com/commands/monitor +# Query delay time +querydelay="1" + +## ANSI Colors | https://docs.linuxgsm.com/features/ansi-colors +ansi="on" + +#### Advanced Settings #### + +## Message Display Time | https://docs.linuxgsm.com/features/message-display-time +sleeptime="0.5" + +## SteamCMD Settings | https://docs.linuxgsm.com/steamcmd +# Server appid +appid="302550" +# SteamCMD Branch | https://docs.linuxgsm.com/steamcmd/branch +branch="" + +## Stop Mode | https://docs.linuxgsm.com/features/stop-mode +# 1: tmux kill +# 2: CTRL+c +# 3: quit +# 4: quit 120s +# 5: stop +# 6: q +# 7: exit +# 8: 7 Days to Die +# 9: GoldSrc +# 10: Teamspeak 3 +stopmode="2" + +## Query mode +# 1: session only +# 2: gamedig + gsquery +# 3: gamedig +# 4: gsquery +# 5: tcp +querymode="5" +querytype="" + +## Game Server Details +# Do not edit +gamename="Assetto Corsa" +engine="unity3d" +glibc="" + +#### Directories #### +# Edit with care + +## Game Server Directories +systemdir="${serverfiles}" +executabledir="${systemdir}" +executable="./acServer" +servercfgdir="${systemdir}/cfg" +servercfg="${selfname}.cfg" +servercfgdefault="server_cfg.ini" +servercfgfullpath="${servercfgdir}/${servercfg}" + +## Backup Directory +backupdir="${lgsmdir}/backup" + +## Logging Directories +logdir="${rootdir}/log" +gamelogdir="${systemdir}/logs" +lgsmlogdir="${logdir}/script" +consolelogdir="${logdir}/console" +lgsmlog="${lgsmlogdir}/${selfname}-script.log" +consolelog="${consolelogdir}/${selfname}-console.log" +alertlog="${lgsmlogdir}/${selfname}-alert.log" +postdetailslog="${lgsmlogdir}/${selfname}-postdetails.log" + +## Logs Naming +lgsmlogdate="${lgsmlogdir}/${selfname}-script-$(date '+%Y-%m-%d-%H:%M:%S').log" +consolelogdate="${consolelogdir}/${selfname}-console-$(date '+%Y-%m-%d-%H:%M:%S').log" diff --git a/lgsm/data/serverlist.csv b/lgsm/data/serverlist.csv index 3cceb1f91..1fd2562d8 100644 --- a/lgsm/data/serverlist.csv +++ b/lgsm/data/serverlist.csv @@ -1,3 +1,4 @@ +ac,acserver,Assetto Corsa ahl,ahlserver,Action half-life ahl2,ahl2server,Action: Source ark,arkserver,ARK: Survival Evolved diff --git a/lgsm/functions/check_steamcmd.sh b/lgsm/functions/check_steamcmd.sh index 437541d25..1c99e282e 100644 --- a/lgsm/functions/check_steamcmd.sh +++ b/lgsm/functions/check_steamcmd.sh @@ -125,13 +125,13 @@ fn_check_steamcmd_ark(){ fn_check_steamcmd_clear(){ # Will remove steamcmd dir if steamcmd package is installed. -if [ "$(command -v steamcmd 2>/dev/null)" ]&&[ -d "${steamcmddir}" ]; then +if [ "$(command -v steamcmd 2>/dev/null)" ]&&[ -d "${rootdir}/steamcmd" ]; then rm -rf "${steamcmddir:?}" exitcode=$? if [ ${exitcode} -ne 0 ]; then - fn_script_log_fatal "Removing ${steamcmddir}" + fn_script_log_fatal "Removing ${rootdir}/steamcmd" else - fn_script_log_pass "Removing ${steamcmddir}" + fn_script_log_pass "Removing ${rootdir}/steamcmd" fi fi } diff --git a/lgsm/functions/command_validate.sh b/lgsm/functions/command_validate.sh index d1ec24971..410d1eb4d 100644 --- a/lgsm/functions/command_validate.sh +++ b/lgsm/functions/command_validate.sh @@ -39,6 +39,9 @@ fn_validate(){ else ${unbuffer} ${steamcmdcommand} +login "${steamuser}" "${steampass}" +force_install_dir "${serverfiles}" +app_info_print 70 +app_set_config 90 mod "${appidmod}" +app_update "${appid}" "${branch}" +app_update "${appid}" validate +quit | tee -a "${lgsmlog}" fi + elif [ "${shortname}" == "ac" ]; then + ${unbuffer} ${steamcmdcommand} +@sSteamCmdForcePlatformType windows +login "${steamuser}" "${steampass}" +force_install_dir "${serverfiles}" +app_update "${appid}" validate +quit + local exitcode=$? # All other servers. elif [ -n "${branch}" ]; then ${unbuffer} ${steamcmdcommand} +login "${steamuser}" "${steampass}" +force_install_dir "${serverfiles}" +app_update "${appid}" -beta "${branch}" validate +quit | tee -a "${lgsmlog}" diff --git a/lgsm/functions/info_config.sh b/lgsm/functions/info_config.sh index f1dd0d71e..c37582b59 100644 --- a/lgsm/functions/info_config.sh +++ b/lgsm/functions/info_config.sh @@ -14,6 +14,31 @@ local function_selfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" # grep -v "foo" filter out lines that contain foo # cut -f1 -d "/" remove everything after / + +fn_info_config_assettocorsa(){ + if [ ! -f "${servercfgfullpath}" ]; then + httpport="${zero}" + port="${zero}" + queryport="${zero}" + servername="${unavailable}" + adminpassword="${unavailable}" + else + httpport=$(grep "HTTP_PORT" "${servercfgfullpath}" | tr -cd '[:digit:]') + port=$(grep "TCP_PORT" "${servercfgfullpath}" | tr -cd '[:digit:]') + queryport="${port}" + servername=$(grep "NAME" "${servercfgfullpath}" | sed -e 's/^[ \t]*//g' -e '/^\//d' -e 's/NAME//g' | tr -d '=\";,:' | sed -e 's/^[ \t]*//' -e 's/[ \t]*$//'| head -n 1) + adminpassword=$(grep "ADMIN_PASSWORD" "${servercfgfullpath}" | sed -e 's/^[ \t]*//g' -e '/^\//d' -e 's/ADMIN_PASSWORD//g' | tr -d '=\";,:' | sed -e 's/^[ \t]*//' -e 's/[ \t]*$//') + + # Not Set + httpport=${httpport:-"0"} + port=${port:-"0"} + queryport=${queryport:-"0"} + servername=${servername:-"NOT SET"} + adminpassword=${adminpassword:-"NOT SET"} + + fi +} + fn_info_config_justcause2(){ if [ ! -f "${servercfgfullpath}" ]; then servername="${unavailable}" @@ -1374,8 +1399,11 @@ fn_info_config_soldat(){ fi } +# Assetto Corsa +if [ "${shortname}" == "ac" ]; then + fn_info_config_assettocorsa # ARK: Survival Evolved -if [ "${shortname}" == "ark" ]; then +elif [ "${shortname}" == "ark" ]; then fn_info_config_ark # Ballistic Overkill elif [ "${shortname}" == "bo" ]; then diff --git a/lgsm/functions/info_messages.sh b/lgsm/functions/info_messages.sh index 81df0ae2a..00a6dd1d9 100644 --- a/lgsm/functions/info_messages.sh +++ b/lgsm/functions/info_messages.sh @@ -621,6 +621,16 @@ fn_info_logs(){ # Engine/Game Specific details +fn_info_message_assettocorsa(){ + echo -e "netstat -atunp| grep acServer" + echo -e "" + { + echo -e "${lightblue}DESCRIPTION\tDIRECTION\tPORT\tPROTOCOL${default}" + echo -e "> Game\tINBOUND\t${port}\tudp" + echo -e "> HTTP\tINBOUND\t${port}\tudp" + } | column -s $'\t' -t +} + fn_info_message_ark(){ echo -e "netstat -atunp | grep ShooterGame" echo -e "" @@ -1358,7 +1368,9 @@ fn_info_message_warfork(){ fn_info_message_select_engine(){ # Display details depending on game or engine. - if [ "${shortname}" == "ark" ]; then + if [ "${shortname}" == "ac" ]; then + fn_info_message_assettocorsa + elif [ "${shortname}" == "ark" ]; then fn_info_message_ark elif [ "${shortname}" == "arma3" ]; then fn_info_message_arma3 diff --git a/lgsm/functions/install_config.sh b/lgsm/functions/install_config.sh index 2f5cde136..0322be9fb 100644 --- a/lgsm/functions/install_config.sh +++ b/lgsm/functions/install_config.sh @@ -147,6 +147,12 @@ fn_set_dst_config_vars(){ if [ "${shortname}" == "sdtd" ]; then gamedirname="7DaysToDie" fn_default_config_local +elif [ "${shortname}" == "ac" ]; then + gamedirname="AssettoCorsa" + array_configs+=( server_cfg.ini ) + fn_fetch_default_config + fn_default_config_remote + fn_set_config_vars elif [ "${shortname}" == "ahl" ]; then gamedirname="ActionHalfLife" array_configs+=( server.cfg ) diff --git a/lgsm/functions/install_server_files.sh b/lgsm/functions/install_server_files.sh index 1c5a31abb..75aefccc5 100644 --- a/lgsm/functions/install_server_files.sh +++ b/lgsm/functions/install_server_files.sh @@ -111,6 +111,8 @@ fn_install_server_files_steamcmd(){ else ${unbuffer} ${steamcmdcommand} +login "${steamuser}" "${steampass}" +force_install_dir "${serverfiles}" +app_set_config 90 mod "${appidmod}" +app_update "${appid}" +quit fi + elif [ "${shortname}" == "ac" ]; then + ${unbuffer} ${steamcmdcommand} +@sSteamCmdForcePlatformType windows +login "${steamuser}" "${steampass}" +force_install_dir "${serverfiles}" +app_update "${appid}" +quit # All other servers. else if [ -n "${branch}" ]; then @@ -130,6 +132,9 @@ fn_install_server_files_steamcmd(){ ${unbuffer} ${steamcmdcommand} +login "${steamuser}" "${steampass}" +force_install_dir "${serverfiles}" +app_set_config 90 mod "${appidmod}" +app_update "${appid}" validate +quit fi local exitcode=$? + elif [ "${shortname}" == "ac" ]; then + ${unbuffer} ${steamcmdcommand} +@sSteamCmdForcePlatformType windows +login "${steamuser}" "${steampass}" +force_install_dir "${serverfiles}" +app_update "${appid}" +quit + local exitcode=$? # All other servers. else if [ -n "${branch}" ]; then @@ -150,7 +155,7 @@ fn_install_server_files_steamcmd(){ # GoldSrc (appid 90) servers commonly fail to download all the server files required. # Validating a few of times may reduce the chance of this issue. if [ "${appid}" == "90" ]; then - fn_print_information_nl "GoldSrc servers commonly fail to download all the server files required. Validating a few of times may reduce the chance of this issue." + fn_print_information_nl "GoldSrc servers commonly fail to download all the server files required. Validating a few of times may reduce the chance of this issue." counter="0" while [ "${counter}" -le "4" ]; do counter=$((counter+1)) diff --git a/lgsm/functions/update_steamcmd.sh b/lgsm/functions/update_steamcmd.sh index ef2a3f9ad..6ac489042 100644 --- a/lgsm/functions/update_steamcmd.sh +++ b/lgsm/functions/update_steamcmd.sh @@ -27,6 +27,8 @@ fn_update_steamcmd_dl(){ else ${unbuffer} ${steamcmdcommand} +login "${steamuser}" "${steampass}" +force_install_dir "${serverfiles}" +app_set_config 90 mod "${appidmod}" +app_update "${appid}" +quit | tee -a "${lgsmlog}" fi + elif [ "${shortname}" == "ac" ]; then + ${unbuffer} ${steamcmdcommand} +@sSteamCmdForcePlatformType windows +login "${steamuser}" "${steampass}" +force_install_dir "${serverfiles}" +app_update "${appid}" +quit # All other servers. else if [ -n "${branch}" ]; then From 88ff70bf32eccea57d2ad7e1872186a40841c4c4 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Mon, 20 Apr 2020 11:32:44 +0100 Subject: [PATCH 343/534] remove duplicate code --- lgsm/functions/fix_wurm.sh | 3 --- 1 file changed, 3 deletions(-) diff --git a/lgsm/functions/fix_wurm.sh b/lgsm/functions/fix_wurm.sh index 8ee907103..79babb65e 100644 --- a/lgsm/functions/fix_wurm.sh +++ b/lgsm/functions/fix_wurm.sh @@ -7,9 +7,6 @@ local modulename="FIX" local commandaction="Fix" -local modulename="FIX" -local commandaction="Fix" - # Copies steamclient.so to correct location. if [ ! -f "${serverfiles}/nativelibs" ]; then cp -f "${serverfiles}/linux64/steamclient.so" "${serverfiles}/nativelibs" From 7ef53a5bb20f710edc0868ed3fc8d9a0bf1a358f Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Mon, 20 Apr 2020 13:41:30 +0100 Subject: [PATCH 344/534] corrected short response error code --- lgsm/functions/query_gsquery.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lgsm/functions/query_gsquery.py b/lgsm/functions/query_gsquery.py index 8df1474a1..fea94dc6b 100644 --- a/lgsm/functions/query_gsquery.py +++ b/lgsm/functions/query_gsquery.py @@ -84,8 +84,8 @@ class gsquery: # Response. if self.response is None: self.fatal_error('No response', 3) - if len(self.response) < 2: - sys.exit('Short response.', 5) + if len(self.response) < 5: + sys.exit('Short response.', 3) else: self.exit_success(str(self.response)) From 2f9800e13c324494df96b711c6151e0a56dfd0f9 Mon Sep 17 00:00:00 2001 From: Christian Date: Wed, 22 Apr 2020 23:12:47 +0200 Subject: [PATCH 345/534] feat(newserver): Avorion (#2476) Co-authored-by: Daniel Gibbs --- .../config-lgsm/acserver/_default.cfg | 2 +- .../config-lgsm/ahl2server/_default.cfg | 2 +- .../config-lgsm/ahlserver/_default.cfg | 2 +- .../config-lgsm/arkserver/_default.cfg | 2 +- .../config-lgsm/arma3server/_default.cfg | 2 +- .../config-lgsm/avserver/_default.cfg | 173 ++++++++++++++++++ .../config-lgsm/bb2server/_default.cfg | 2 +- .../config-lgsm/bbserver/_default.cfg | 2 +- .../config-lgsm/bdserver/_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/bt1944server/_default.cfg | 2 +- .../config-lgsm/btserver/_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 | 2 +- .../config-lgsm/coduoserver/_default.cfg | 2 +- .../config-lgsm/codwawserver/_default.cfg | 2 +- .../config-lgsm/csczserver/_default.cfg | 2 +- .../config-lgsm/csgoserver/_default.cfg | 2 +- .../config-lgsm/csserver/_default.cfg | 2 +- .../config-lgsm/cssserver/_default.cfg | 2 +- .../config-lgsm/dabserver/_default.cfg | 2 +- .../config-lgsm/dmcserver/_default.cfg | 2 +- .../config-lgsm/dodserver/_default.cfg | 2 +- .../config-lgsm/dodsserver/_default.cfg | 2 +- .../config-lgsm/doiserver/_default.cfg | 2 +- .../config-lgsm/dstserver/_default.cfg | 2 +- .../config-lgsm/dysserver/_default.cfg | 2 +- .../config-lgsm/ecoserver/_default.cfg | 2 +- .../config-lgsm/emserver/_default.cfg | 2 +- .../config-lgsm/etlserver/_default.cfg | 2 +- .../config-lgsm/fctrserver/_default.cfg | 2 +- .../config-lgsm/fofserver/_default.cfg | 2 +- .../config-lgsm/gesserver/_default.cfg | 2 +- .../config-lgsm/gmodserver/_default.cfg | 2 +- .../config-lgsm/hl2dmserver/_default.cfg | 2 +- .../config-lgsm/hldmserver/_default.cfg | 2 +- .../config-lgsm/hldmsserver/_default.cfg | 2 +- .../config-lgsm/hwserver/_default.cfg | 2 +- .../config-lgsm/insserver/_default.cfg | 2 +- .../config-lgsm/inssserver/_default.cfg | 2 +- .../config-lgsm/iosserver/_default.cfg | 2 +- .../config-lgsm/jc2server/_default.cfg | 2 +- .../config-lgsm/jc3server/_default.cfg | 2 +- .../config-lgsm/kf2server/_default.cfg | 2 +- .../config-lgsm/kfserver/_default.cfg | 2 +- .../config-lgsm/l4d2server/_default.cfg | 2 +- .../config-lgsm/l4dserver/_default.cfg | 2 +- .../config-lgsm/mcbserver/_default.cfg | 2 +- .../config-lgsm/mcserver/_default.cfg | 2 +- .../config-lgsm/mhserver/_default.cfg | 2 +- .../config-lgsm/mohaaserver/_default.cfg | 2 +- .../config-lgsm/mtaserver/_default.cfg | 2 +- .../config-lgsm/mumbleserver/_default.cfg | 2 +- .../config-lgsm/ndserver/_default.cfg | 2 +- .../config-lgsm/nmrihserver/_default.cfg | 2 +- .../config-lgsm/ns2cserver/_default.cfg | 2 +- .../config-lgsm/ns2server/_default.cfg | 2 +- .../config-lgsm/nsserver/_default.cfg | 2 +- .../config-lgsm/onsetserver/_default.cfg | 2 +- .../config-lgsm/opforserver/_default.cfg | 2 +- .../config-lgsm/pcserver/_default.cfg | 2 +- .../config-lgsm/pstbsserver/_default.cfg | 2 +- .../config-lgsm/pvkiiserver/_default.cfg | 2 +- .../config-lgsm/pzserver/_default.cfg | 2 +- .../config-lgsm/q2server/_default.cfg | 2 +- .../config-lgsm/q3server/_default.cfg | 2 +- .../config-lgsm/qlserver/_default.cfg | 2 +- .../config-lgsm/qwserver/_default.cfg | 2 +- .../config-lgsm/ricochetserver/_default.cfg | 2 +- .../config-lgsm/roserver/_default.cfg | 2 +- .../config-lgsm/rtcwserver/_default.cfg | 2 +- .../config-lgsm/rustserver/_default.cfg | 2 +- .../config-lgsm/rwserver/_default.cfg | 2 +- .../config-lgsm/sampserver/_default.cfg | 2 +- .../config-lgsm/sbotsserver/_default.cfg | 2 +- .../config-lgsm/sbserver/_default.cfg | 2 +- .../config-lgsm/sdtdserver/_default.cfg | 2 +- .../config-lgsm/sfcserver/_default.cfg | 2 +- .../config-lgsm/sof2server/_default.cfg | 2 +- .../config-lgsm/solserver/_default.cfg | 2 +- .../config-lgsm/squadserver/_default.cfg | 2 +- .../config-lgsm/ss3server/_default.cfg | 2 +- .../config-lgsm/stserver/_default.cfg | 2 +- .../config-lgsm/svenserver/_default.cfg | 2 +- .../config-lgsm/terrariaserver/_default.cfg | 2 +- .../config-lgsm/tf2server/_default.cfg | 2 +- .../config-lgsm/tfcserver/_default.cfg | 2 +- .../config-lgsm/ts3server/_default.cfg | 2 +- .../config-lgsm/tsserver/_default.cfg | 2 +- .../config-lgsm/tuserver/_default.cfg | 2 +- .../config-lgsm/twserver/_default.cfg | 2 +- .../config-lgsm/untserver/_default.cfg | 2 +- .../config-lgsm/ut2k4server/_default.cfg | 2 +- .../config-lgsm/ut3server/_default.cfg | 2 +- .../config-lgsm/ut99server/_default.cfg | 2 +- .../config-lgsm/utserver/_default.cfg | 2 +- .../config-lgsm/vsserver/_default.cfg | 2 +- .../config-lgsm/wetserver/_default.cfg | 2 +- .../config-lgsm/wfserver/_default.cfg | 2 +- .../config-lgsm/wurmserver/_default.cfg | 2 +- .../config-lgsm/zmrserver/_default.cfg | 2 +- .../config-lgsm/zpsserver/_default.cfg | 2 +- lgsm/data/serverlist.csv | 3 +- lgsm/functions/command_details.sh | 4 +- lgsm/functions/command_dev_query_raw.sh | 1 + lgsm/functions/command_monitor.sh | 14 +- lgsm/functions/command_stop.sh | 32 ++++ lgsm/functions/core_functions.sh | 5 + lgsm/functions/fix.sh | 7 +- lgsm/functions/fix_av.sh | 23 +++ lgsm/functions/info_config.sh | 47 ++++- lgsm/functions/info_messages.sh | 118 ++++++------ tests/tests_defaultcfg/defaultcfg_1.txt | 2 +- 118 files changed, 465 insertions(+), 176 deletions(-) create mode 100644 lgsm/config-default/config-lgsm/avserver/_default.cfg create mode 100644 lgsm/functions/fix_av.sh diff --git a/lgsm/config-default/config-lgsm/acserver/_default.cfg b/lgsm/config-default/config-lgsm/acserver/_default.cfg index 43fea751b..b9436fb3f 100644 --- a/lgsm/config-default/config-lgsm/acserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/acserver/_default.cfg @@ -121,7 +121,7 @@ branch="" # 7: exit # 8: 7 Days to Die # 9: GoldSrc -# 10: Teamspeak 3 +# 10: Avorion stopmode="2" ## Query mode diff --git a/lgsm/config-default/config-lgsm/ahl2server/_default.cfg b/lgsm/config-default/config-lgsm/ahl2server/_default.cfg index 0701594d7..c41d0c8f9 100644 --- a/lgsm/config-default/config-lgsm/ahl2server/_default.cfg +++ b/lgsm/config-default/config-lgsm/ahl2server/_default.cfg @@ -121,7 +121,7 @@ sleeptime="0.5" # 7: exit # 8: 7 Days to Die # 9: GoldSrc -# 10: Teamspeak 3 +# 10: Avorion stopmode="3" ## Query mode diff --git a/lgsm/config-default/config-lgsm/ahlserver/_default.cfg b/lgsm/config-default/config-lgsm/ahlserver/_default.cfg index 18e60def5..69fc33e0c 100644 --- a/lgsm/config-default/config-lgsm/ahlserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/ahlserver/_default.cfg @@ -125,7 +125,7 @@ steammaster="true" # 7: exit # 8: 7 Days to Die # 9: GoldSrc -# 10: Teamspeak 3 +# 10: Avorion stopmode="9" ## Query mode diff --git a/lgsm/config-default/config-lgsm/arkserver/_default.cfg b/lgsm/config-default/config-lgsm/arkserver/_default.cfg index 60061c177..a657d6273 100644 --- a/lgsm/config-default/config-lgsm/arkserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/arkserver/_default.cfg @@ -126,7 +126,7 @@ steammaster="true" # 7: exit # 8: 7 Days to Die # 9: GoldSrc -# 10: Teamspeak 3 +# 10: Avorion stopmode="2" ## Query mode diff --git a/lgsm/config-default/config-lgsm/arma3server/_default.cfg b/lgsm/config-default/config-lgsm/arma3server/_default.cfg index 51e06e85d..628634140 100644 --- a/lgsm/config-default/config-lgsm/arma3server/_default.cfg +++ b/lgsm/config-default/config-lgsm/arma3server/_default.cfg @@ -140,7 +140,7 @@ steammaster="false" # 7: exit # 8: 7 Days to Die # 9: GoldSrc -# 10: Teamspeak 3 +# 10: Avorion stopmode="2" ## Query mode diff --git a/lgsm/config-default/config-lgsm/avserver/_default.cfg b/lgsm/config-default/config-lgsm/avserver/_default.cfg new file mode 100644 index 000000000..4b53d68d2 --- /dev/null +++ b/lgsm/config-default/config-lgsm/avserver/_default.cfg @@ -0,0 +1,173 @@ +################################## +######## Default Settings ######## +################################## +# DO NOT EDIT, ANY CHANGES 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. + +#### Game Server Settings #### +## Server Start Settings | https://docs.linuxgsm.com/configuration/start-parameters +port="27000" +# https://steamidfinder.com +adminsteamid="" +avgalaxy="avgalaxy" + +## Server Start Command | https://docs.linuxgsm.com/configuration/start-parameters#additional-parameters +fn_parms(){ +if [ ! -z "${adminsteamid}" ]; then + admincmd="--admin ${adminsteamid}" +fi +parms="--galaxy-name ${avgalaxy} --ip ${ip} --datapath ${avdatapath} ${admincmd}" +} + +#### LinuxGSM Settings #### + +## LinuxGSM Stats +# Send useful stats to LinuxGSM developers. +# https://docs.linuxgsm.com/configuration/linuxgsm-stats +# (on|off) +stats="off" +## Notification Alerts +# (on|off) + +# Display IP | https://docs.linuxgsm.com/alerts#display-ip +displayip="" + +# More info | https://docs.linuxgsm.com/alerts#more-info +postalert="off" +postdays="7" +posttarget="https://termbin.com" + +# Discord Alerts | https://docs.linuxgsm.com/alerts/discord +discordalert="off" +discordwebhook="webhook" + +# Email Alerts | https://docs.linuxgsm.com/alerts/email +emailalert="off" +email="email@example.com" +emailfrom="" + +# IFTTT Alerts | https://docs.linuxgsm.com/alerts/ifttt +iftttalert="off" +ifttttoken="accesstoken" +iftttevent="linuxgsm_alert" + +# Mailgun Email Alerts | https://docs.linuxgsm.com/alerts/mailgun +mailgunalert="off" +mailguntoken="accesstoken" +mailgundomain="example.com" +mailgunemailfrom="alert@example.com" +mailgunemail="email@myemail.com" + +# Pushbullet Alerts | https://docs.linuxgsm.com/alerts/pushbullet +pushbulletalert="off" +pushbullettoken="accesstoken" +channeltag="" + +# Pushover Alerts | https://docs.linuxgsm.com/alerts/pushover +pushoveralert="off" +pushovertoken="accesstoken" + +# Slack Alerts | https://docs.linuxgsm.com/alerts/slack +slackalert="off" +slackwebhook="webhook" + +# Telegram Alerts | https://docs.linuxgsm.com/alerts/telegram +# You can add a custom cURL string eg proxy (useful in Russia) or else in "curlcustomstring". +# like a "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help", if you not need +# any custom string in curl - simple ignore this parameter. +telegramalert="off" +telegramtoken="accesstoken" +telegramchatid="" +curlcustomstring="" + +## Updating | https://docs.linuxgsm.com/commands/update +updateonstart="off" + +## Backup | https://docs.linuxgsm.com/commands/backup +maxbackups="4" +maxbackupdays="30" +stoponbackup="on" + +## Logging | https://docs.linuxgsm.com/features/logging +consolelogging="on" +logdays="7" + +## Monitor | https://docs.linuxgsm.com/commands/monitor +# Query delay time +querydelay="1" + +## ANSI Colors | https://docs.linuxgsm.com/features/ansi-colors +ansi="on" + +#### Advanced Settings #### + +## Message Display Time | https://docs.linuxgsm.com/features/message-display-time +sleeptime="0.5" +## SteamCMD Settings | https://docs.linuxgsm.com/steamcmd +# Server appid +appid="565060" +# SteamCMD Branch | https://docs.linuxgsm.com/steamcmd/branch +branch="" +# Master Server | https://docs.linuxgsm.com/steamcmd/steam-master-server +steammaster="false" + +## Stop Mode | https://docs.linuxgsm.com/features/stop-mode +# 1: tmux kill +# 2: CTRL+c +# 3: quit +# 4: quit 120s +# 5: stop +# 6: q +# 7: exit +# 8: 7 Days to Die +# 9: GoldSrc +# 10: Avorion +stopmode="10" + +## Query mode +# 1: session only +# 2: gamedig + gsquery +# 3: gamedig +# 4: gsquery +# 5: tcp +querymode="5" +querytype="" + +## Game Server Details +# Do not edit +gamename="Avorion" +engine="avorion" +glibc="2.15" + +#### Directories #### +# Edit with care + +## Game Server Directories +avdatapath="${serverfiles}/galaxy" +avgalaxypath="${avdatapath}/${avgalaxy}" +systemdir="${serverfiles}" +executabledir="${systemdir}" +executable="./server.sh" +servercfgdir="${avgalaxypath}" +servercfg="server.ini" +servercfgdefault="server.ini" +servercfgfullpath="${servercfgdir}/${servercfg}" + +## Backup Directory +backupdir="${lgsmdir}/backup" + +## Logging Directories +logdir="${rootdir}/log" +gamelogdir="${systemdir}/ServerLogs" +lgsmlogdir="${logdir}/script" +consolelogdir="${logdir}/console" +lgsmlog="${lgsmlogdir}/${selfname}-script.log" +consolelog="${consolelogdir}/${selfname}-console.log" +alertlog="${lgsmlogdir}/${selfname}-alert.log" +postdetailslog="${lgsmlogdir}/${selfname}-postdetails.log" + +## Logs Naming +lgsmlogdate="${lgsmlogdir}/${selfname}-script-$(date '+%Y-%m-%d-%H:%M:%S').log" +consolelogdate="${consolelogdir}/${selfname}-console-$(date '+%Y-%m-%d-%H:%M:%S').log" diff --git a/lgsm/config-default/config-lgsm/bb2server/_default.cfg b/lgsm/config-default/config-lgsm/bb2server/_default.cfg index 364215629..e361cb9dc 100644 --- a/lgsm/config-default/config-lgsm/bb2server/_default.cfg +++ b/lgsm/config-default/config-lgsm/bb2server/_default.cfg @@ -130,7 +130,7 @@ steammaster="true" # 7: exit # 8: 7 Days to Die # 9: GoldSrc -# 10: Teamspeak 3 +# 10: Avorion stopmode="3" ## Query mode diff --git a/lgsm/config-default/config-lgsm/bbserver/_default.cfg b/lgsm/config-default/config-lgsm/bbserver/_default.cfg index 82e59ccfd..3fdb866c3 100644 --- a/lgsm/config-default/config-lgsm/bbserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/bbserver/_default.cfg @@ -125,7 +125,7 @@ steammaster="true" # 7: exit # 8: 7 Days to Die # 9: GoldSrc -# 10: Teamspeak 3 +# 10: Avorion stopmode="9" ## Query mode diff --git a/lgsm/config-default/config-lgsm/bdserver/_default.cfg b/lgsm/config-default/config-lgsm/bdserver/_default.cfg index 3770f5b34..ec408753e 100644 --- a/lgsm/config-default/config-lgsm/bdserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/bdserver/_default.cfg @@ -124,7 +124,7 @@ steammaster="true" # 7: exit # 8: 7 Days to Die # 9: GoldSrc -# 10: Teamspeak 3 +# 10: Avorion stopmode="9" ## Query mode diff --git a/lgsm/config-default/config-lgsm/bf1942server/_default.cfg b/lgsm/config-default/config-lgsm/bf1942server/_default.cfg index fca0a01b8..ebb977a92 100644 --- a/lgsm/config-default/config-lgsm/bf1942server/_default.cfg +++ b/lgsm/config-default/config-lgsm/bf1942server/_default.cfg @@ -109,7 +109,7 @@ sleeptime="0.5" # 7: exit # 8: 7 Days to Die # 9: GoldSrc -# 10: Teamspeak 3 +# 10: Avorion stopmode="2" ## Query mode diff --git a/lgsm/config-default/config-lgsm/bmdmserver/_default.cfg b/lgsm/config-default/config-lgsm/bmdmserver/_default.cfg index a82bc74e7..61d4c3e4c 100644 --- a/lgsm/config-default/config-lgsm/bmdmserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/bmdmserver/_default.cfg @@ -130,7 +130,7 @@ steammaster="true" # 7: exit # 8: 7 Days to Die # 9: GoldSrc -# 10: Teamspeak 3 +# 10: Avorion stopmode="3" ## Query mode diff --git a/lgsm/config-default/config-lgsm/boserver/_default.cfg b/lgsm/config-default/config-lgsm/boserver/_default.cfg index ec8f8df14..698667c10 100644 --- a/lgsm/config-default/config-lgsm/boserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/boserver/_default.cfg @@ -123,7 +123,7 @@ steammaster="false" # 7: exit # 8: 7 Days to Die # 9: GoldSrc -# 10: Teamspeak 3 +# 10: Avorion stopmode="2" ## Query mode diff --git a/lgsm/config-default/config-lgsm/bsserver/_default.cfg b/lgsm/config-default/config-lgsm/bsserver/_default.cfg index 5d5477d4f..69094f8ef 100644 --- a/lgsm/config-default/config-lgsm/bsserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/bsserver/_default.cfg @@ -134,7 +134,7 @@ steammaster="true" # 7: exit # 8: 7 Days to Die # 9: GoldSrc -# 10: Teamspeak 3 +# 10: Avorion stopmode="3" ## Query mode diff --git a/lgsm/config-default/config-lgsm/bt1944server/_default.cfg b/lgsm/config-default/config-lgsm/bt1944server/_default.cfg index 7f7026b58..d90b94523 100644 --- a/lgsm/config-default/config-lgsm/bt1944server/_default.cfg +++ b/lgsm/config-default/config-lgsm/bt1944server/_default.cfg @@ -122,7 +122,7 @@ steammaster="false" # 7: exit # 8: 7 Days to Die # 9: GoldSrc -# 10: Teamspeak 3 +# 10: Avorion stopmode="2" ## Query mode diff --git a/lgsm/config-default/config-lgsm/btserver/_default.cfg b/lgsm/config-default/config-lgsm/btserver/_default.cfg index 9e58dddc3..416e77c09 100644 --- a/lgsm/config-default/config-lgsm/btserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/btserver/_default.cfg @@ -117,7 +117,7 @@ steammaster="true" # 7: exit # 8: 7 Days to Die # 9: GoldSrc -# 10: Teamspeak 3 +# 10: Avorion stopmode="7" ## Query mode diff --git a/lgsm/config-default/config-lgsm/ccserver/_default.cfg b/lgsm/config-default/config-lgsm/ccserver/_default.cfg index 8525f13ed..e9f0a70dd 100644 --- a/lgsm/config-default/config-lgsm/ccserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/ccserver/_default.cfg @@ -125,7 +125,7 @@ steammaster="false" # 7: exit # 8: 7 Days to Die # 9: GoldSrc -# 10: Teamspeak 3 +# 10: Avorion stopmode="3" ## Query mode diff --git a/lgsm/config-default/config-lgsm/cod2server/_default.cfg b/lgsm/config-default/config-lgsm/cod2server/_default.cfg index 1ac29768b..a686ea45f 100644 --- a/lgsm/config-default/config-lgsm/cod2server/_default.cfg +++ b/lgsm/config-default/config-lgsm/cod2server/_default.cfg @@ -112,7 +112,7 @@ sleeptime="0.5" # 7: exit # 8: 7 Days to Die # 9: GoldSrc -# 10: Teamspeak 3 +# 10: Avorion stopmode="3" ## Query mode diff --git a/lgsm/config-default/config-lgsm/cod4server/_default.cfg b/lgsm/config-default/config-lgsm/cod4server/_default.cfg index 265891d3b..027c52509 100644 --- a/lgsm/config-default/config-lgsm/cod4server/_default.cfg +++ b/lgsm/config-default/config-lgsm/cod4server/_default.cfg @@ -112,7 +112,7 @@ sleeptime="0.5" # 7: exit # 8: 7 Days to Die # 9: GoldSrc -# 10: Teamspeak 3 +# 10: Avorion stopmode="3" ## Query mode diff --git a/lgsm/config-default/config-lgsm/codserver/_default.cfg b/lgsm/config-default/config-lgsm/codserver/_default.cfg index 6892d780e..74e186466 100644 --- a/lgsm/config-default/config-lgsm/codserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/codserver/_default.cfg @@ -112,7 +112,7 @@ sleeptime="0.5" # 7: exit # 8: 7 Days to Die # 9: GoldSrc -# 10: Teamspeak 3 +# 10: Avorion stopmode="3" ## Query mode diff --git a/lgsm/config-default/config-lgsm/coduoserver/_default.cfg b/lgsm/config-default/config-lgsm/coduoserver/_default.cfg index a140d50a6..b4e16cfff 100644 --- a/lgsm/config-default/config-lgsm/coduoserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/coduoserver/_default.cfg @@ -112,7 +112,7 @@ sleeptime="0.5" # 7: exit # 8: 7 Days to Die # 9: GoldSrc -# 10: Teamspeak 3 +# 10: Avorion stopmode="3" ## Query mode diff --git a/lgsm/config-default/config-lgsm/codwawserver/_default.cfg b/lgsm/config-default/config-lgsm/codwawserver/_default.cfg index 358947fbf..aeecf8f7b 100644 --- a/lgsm/config-default/config-lgsm/codwawserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/codwawserver/_default.cfg @@ -112,7 +112,7 @@ sleeptime="0.5" # 7: exit # 8: 7 Days to Die # 9: GoldSrc -# 10: Teamspeak 3 +# 10: Avorion stopmode="3" ## Query mode diff --git a/lgsm/config-default/config-lgsm/csczserver/_default.cfg b/lgsm/config-default/config-lgsm/csczserver/_default.cfg index 4d2777c2d..8065dbba2 100644 --- a/lgsm/config-default/config-lgsm/csczserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/csczserver/_default.cfg @@ -125,7 +125,7 @@ steammaster="true" # 7: exit # 8: 7 Days to Die # 9: GoldSrc -# 10: Teamspeak 3 +# 10: Avorion stopmode="9" ## Query mode diff --git a/lgsm/config-default/config-lgsm/csgoserver/_default.cfg b/lgsm/config-default/config-lgsm/csgoserver/_default.cfg index dbce043fa..963f873c5 100644 --- a/lgsm/config-default/config-lgsm/csgoserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/csgoserver/_default.cfg @@ -150,7 +150,7 @@ steammaster="true" # 7: exit # 8: 7 Days to Die # 9: GoldSrc -# 10: Teamspeak 3 +# 10: Avorion stopmode="3" ## Query mode diff --git a/lgsm/config-default/config-lgsm/csserver/_default.cfg b/lgsm/config-default/config-lgsm/csserver/_default.cfg index 1956888cd..584e0ad77 100644 --- a/lgsm/config-default/config-lgsm/csserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/csserver/_default.cfg @@ -125,7 +125,7 @@ steammaster="true" # 7: exit # 8: 7 Days to Die # 9: GoldSrc -# 10: Teamspeak 3 +# 10: Avorion stopmode="9" ## Query mode diff --git a/lgsm/config-default/config-lgsm/cssserver/_default.cfg b/lgsm/config-default/config-lgsm/cssserver/_default.cfg index 23321a0ef..316eb26f8 100644 --- a/lgsm/config-default/config-lgsm/cssserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/cssserver/_default.cfg @@ -130,7 +130,7 @@ steammaster="true" # 7: exit # 8: 7 Days to Die # 9: GoldSrc -# 10: Teamspeak 3 +# 10: Avorion stopmode="3" ## Query mode diff --git a/lgsm/config-default/config-lgsm/dabserver/_default.cfg b/lgsm/config-default/config-lgsm/dabserver/_default.cfg index 778514cbe..612ea671f 100644 --- a/lgsm/config-default/config-lgsm/dabserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/dabserver/_default.cfg @@ -125,7 +125,7 @@ steammaster="true" # 7: exit # 8: 7 Days to Die # 9: GoldSrc -# 10: Teamspeak 3 +# 10: Avorion stopmode="3" ## Query mode diff --git a/lgsm/config-default/config-lgsm/dmcserver/_default.cfg b/lgsm/config-default/config-lgsm/dmcserver/_default.cfg index b21595c4e..43fe8e8f1 100644 --- a/lgsm/config-default/config-lgsm/dmcserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/dmcserver/_default.cfg @@ -125,7 +125,7 @@ steammaster="true" # 7: exit # 8: 7 Days to Die # 9: GoldSrc -# 10: Teamspeak 3 +# 10: Avorion stopmode="9" ## Query mode diff --git a/lgsm/config-default/config-lgsm/dodserver/_default.cfg b/lgsm/config-default/config-lgsm/dodserver/_default.cfg index 28f14f2ae..0d1b447c3 100644 --- a/lgsm/config-default/config-lgsm/dodserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/dodserver/_default.cfg @@ -125,7 +125,7 @@ steammaster="true" # 7: exit # 8: 7 Days to Die # 9: GoldSrc -# 10: Teamspeak 3 +# 10: Avorion stopmode="9" ## Query mode diff --git a/lgsm/config-default/config-lgsm/dodsserver/_default.cfg b/lgsm/config-default/config-lgsm/dodsserver/_default.cfg index 0c75e7d21..572046108 100644 --- a/lgsm/config-default/config-lgsm/dodsserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/dodsserver/_default.cfg @@ -125,7 +125,7 @@ steammaster="true" # 7: exit # 8: 7 Days to Die # 9: GoldSrc -# 10: Teamspeak 3 +# 10: Avorion stopmode="3" ## Query mode diff --git a/lgsm/config-default/config-lgsm/doiserver/_default.cfg b/lgsm/config-default/config-lgsm/doiserver/_default.cfg index dcee95d58..d7916e2b5 100644 --- a/lgsm/config-default/config-lgsm/doiserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/doiserver/_default.cfg @@ -126,7 +126,7 @@ steammaster="true" # 7: exit # 8: 7 Days to Die # 9: GoldSrc -# 10: Teamspeak 3 +# 10: Avorion stopmode="3" ## Query mode diff --git a/lgsm/config-default/config-lgsm/dstserver/_default.cfg b/lgsm/config-default/config-lgsm/dstserver/_default.cfg index d1997586c..7491e7e55 100644 --- a/lgsm/config-default/config-lgsm/dstserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/dstserver/_default.cfg @@ -128,7 +128,7 @@ steammaster="false" # 7: exit # 8: 7 Days to Die # 9: GoldSrc -# 10: Teamspeak 3 +# 10: Avorion stopmode="2" ## Query mode diff --git a/lgsm/config-default/config-lgsm/dysserver/_default.cfg b/lgsm/config-default/config-lgsm/dysserver/_default.cfg index 3790dc837..28cc7fb98 100644 --- a/lgsm/config-default/config-lgsm/dysserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/dysserver/_default.cfg @@ -130,7 +130,7 @@ steammaster="true" # 7: exit # 8: 7 Days to Die # 9: GoldSrc -# 10: Teamspeak 3 +# 10: Avorion stopmode="3" ## Query mode diff --git a/lgsm/config-default/config-lgsm/ecoserver/_default.cfg b/lgsm/config-default/config-lgsm/ecoserver/_default.cfg index e4bc46da3..b4a4b92eb 100644 --- a/lgsm/config-default/config-lgsm/ecoserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/ecoserver/_default.cfg @@ -117,7 +117,7 @@ steammaster="false" # 7: exit # 8: 7 Days to Die # 9: GoldSrc -# 10: Teamspeak 3 +# 10: Avorion stopmode="2" ## Query mode diff --git a/lgsm/config-default/config-lgsm/emserver/_default.cfg b/lgsm/config-default/config-lgsm/emserver/_default.cfg index 0b9efd818..8ab7aefe1 100644 --- a/lgsm/config-default/config-lgsm/emserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/emserver/_default.cfg @@ -130,7 +130,7 @@ steammaster="true" # 7: exit # 8: 7 Days to Die # 9: GoldSrc -# 10: Teamspeak 3 +# 10: Avorion stopmode="3" ## Query mode diff --git a/lgsm/config-default/config-lgsm/etlserver/_default.cfg b/lgsm/config-default/config-lgsm/etlserver/_default.cfg index d2b5448e3..add0f74b6 100644 --- a/lgsm/config-default/config-lgsm/etlserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/etlserver/_default.cfg @@ -106,7 +106,7 @@ sleeptime="0.5" # 7: exit # 8: 7 Days to Die # 9: GoldSrc -# 10: Teamspeak 3 +# 10: Avorion stopmode="3" ## Query mode diff --git a/lgsm/config-default/config-lgsm/fctrserver/_default.cfg b/lgsm/config-default/config-lgsm/fctrserver/_default.cfg index beca898b1..fddab05ee 100644 --- a/lgsm/config-default/config-lgsm/fctrserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/fctrserver/_default.cfg @@ -117,7 +117,7 @@ sleeptime="0.5" # 7: exit # 8: 7 Days to Die # 9: GoldSrc -# 10: Teamspeak 3 +# 10: Avorion stopmode="2" ## Query mode diff --git a/lgsm/config-default/config-lgsm/fofserver/_default.cfg b/lgsm/config-default/config-lgsm/fofserver/_default.cfg index ea1a5d9f3..49105660c 100644 --- a/lgsm/config-default/config-lgsm/fofserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/fofserver/_default.cfg @@ -125,7 +125,7 @@ steammaster="true" # 7: exit # 8: 7 Days to Die # 9: GoldSrc -# 10: Teamspeak 3 +# 10: Avorion stopmode="3" ## Query mode diff --git a/lgsm/config-default/config-lgsm/gesserver/_default.cfg b/lgsm/config-default/config-lgsm/gesserver/_default.cfg index ecdc7d602..a26a5df39 100644 --- a/lgsm/config-default/config-lgsm/gesserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/gesserver/_default.cfg @@ -125,7 +125,7 @@ steammaster="true" # 7: exit # 8: 7 Days to Die # 9: GoldSrc -# 10: Teamspeak 3 +# 10: Avorion stopmode="3" ## Query mode diff --git a/lgsm/config-default/config-lgsm/gmodserver/_default.cfg b/lgsm/config-default/config-lgsm/gmodserver/_default.cfg index b15314016..bd254e8b1 100644 --- a/lgsm/config-default/config-lgsm/gmodserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/gmodserver/_default.cfg @@ -141,7 +141,7 @@ steammaster="true" # 7: exit # 8: 7 Days to Die # 9: GoldSrc -# 10: Teamspeak 3 +# 10: Avorion stopmode="3" ## Query mode diff --git a/lgsm/config-default/config-lgsm/hl2dmserver/_default.cfg b/lgsm/config-default/config-lgsm/hl2dmserver/_default.cfg index 842fd4778..22c3da329 100644 --- a/lgsm/config-default/config-lgsm/hl2dmserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/hl2dmserver/_default.cfg @@ -125,7 +125,7 @@ steammaster="true" # 7: exit # 8: 7 Days to Die # 9: GoldSrc -# 10: Teamspeak 3 +# 10: Avorion stopmode="3" ## Query mode diff --git a/lgsm/config-default/config-lgsm/hldmserver/_default.cfg b/lgsm/config-default/config-lgsm/hldmserver/_default.cfg index f3b8aa074..1a17fdd91 100644 --- a/lgsm/config-default/config-lgsm/hldmserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/hldmserver/_default.cfg @@ -124,7 +124,7 @@ steammaster="true" # 7: exit # 8: 7 Days to Die # 9: GoldSrc -# 10: Teamspeak 3 +# 10: Avorion stopmode="9" ## Query mode diff --git a/lgsm/config-default/config-lgsm/hldmsserver/_default.cfg b/lgsm/config-default/config-lgsm/hldmsserver/_default.cfg index 71baee83f..0036ec7e1 100644 --- a/lgsm/config-default/config-lgsm/hldmsserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/hldmsserver/_default.cfg @@ -125,7 +125,7 @@ steammaster="true" # 7: exit # 8: 7 Days to Die # 9: GoldSrc -# 10: Teamspeak 3 +# 10: Avorion stopmode="3" ## Query mode diff --git a/lgsm/config-default/config-lgsm/hwserver/_default.cfg b/lgsm/config-default/config-lgsm/hwserver/_default.cfg index 7c112c636..426d2d250 100644 --- a/lgsm/config-default/config-lgsm/hwserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/hwserver/_default.cfg @@ -136,7 +136,7 @@ steammaster="false" # 7: exit # 8: 7 Days to Die # 9: GoldSrc -# 10: Teamspeak 3 +# 10: Avorion stopmode="2" ## Query mode diff --git a/lgsm/config-default/config-lgsm/insserver/_default.cfg b/lgsm/config-default/config-lgsm/insserver/_default.cfg index c2279ce42..98817e908 100644 --- a/lgsm/config-default/config-lgsm/insserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/insserver/_default.cfg @@ -131,7 +131,7 @@ steammaster="false" # 7: exit # 8: 7 Days to Die # 9: GoldSrc -# 10: Teamspeak 3 +# 10: Avorion stopmode="3" ## Query mode diff --git a/lgsm/config-default/config-lgsm/inssserver/_default.cfg b/lgsm/config-default/config-lgsm/inssserver/_default.cfg index 0b36880f8..605a95fbb 100644 --- a/lgsm/config-default/config-lgsm/inssserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/inssserver/_default.cfg @@ -132,7 +132,7 @@ steammaster="false" # 7: exit # 8: 7 Days to Die # 9: GoldSrc -# 10: Teamspeak 3 +# 10: Avorion stopmode="2" ## Query mode diff --git a/lgsm/config-default/config-lgsm/iosserver/_default.cfg b/lgsm/config-default/config-lgsm/iosserver/_default.cfg index cb3249d6f..acf13f368 100644 --- a/lgsm/config-default/config-lgsm/iosserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/iosserver/_default.cfg @@ -125,7 +125,7 @@ steammaster="false" # 7: exit # 8: 7 Days to Die # 9: GoldSrc -# 10: Teamspeak 3 +# 10: Avorion stopmode="3" ## Query mode diff --git a/lgsm/config-default/config-lgsm/jc2server/_default.cfg b/lgsm/config-default/config-lgsm/jc2server/_default.cfg index 2b4167172..81cd0ff5b 100644 --- a/lgsm/config-default/config-lgsm/jc2server/_default.cfg +++ b/lgsm/config-default/config-lgsm/jc2server/_default.cfg @@ -117,7 +117,7 @@ steammaster="true" # 7: exit # 8: 7 Days to Die # 9: GoldSrc -# 10: Teamspeak 3 +# 10: Avorion stopmode="2" ## Query mode diff --git a/lgsm/config-default/config-lgsm/jc3server/_default.cfg b/lgsm/config-default/config-lgsm/jc3server/_default.cfg index e33061f71..e3793f805 100644 --- a/lgsm/config-default/config-lgsm/jc3server/_default.cfg +++ b/lgsm/config-default/config-lgsm/jc3server/_default.cfg @@ -117,7 +117,7 @@ steammaster="false" # 7: exit # 8: 7 Days to Die # 9: GoldSrc -# 10: Teamspeak 3 +# 10: Avorion stopmode="2" ## Query mode diff --git a/lgsm/config-default/config-lgsm/kf2server/_default.cfg b/lgsm/config-default/config-lgsm/kf2server/_default.cfg index c3f6aaf01..7ad9fc930 100644 --- a/lgsm/config-default/config-lgsm/kf2server/_default.cfg +++ b/lgsm/config-default/config-lgsm/kf2server/_default.cfg @@ -123,7 +123,7 @@ steammaster="false" # 7: exit # 8: 7 Days to Die # 9: GoldSrc -# 10: Teamspeak 3 +# 10: Avorion stopmode="2" ## Query mode diff --git a/lgsm/config-default/config-lgsm/kfserver/_default.cfg b/lgsm/config-default/config-lgsm/kfserver/_default.cfg index b0de2b29e..f4ef0a7f7 100644 --- a/lgsm/config-default/config-lgsm/kfserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/kfserver/_default.cfg @@ -129,7 +129,7 @@ steammaster="false" # 7: exit # 8: 7 Days to Die # 9: GoldSrc -# 10: Teamspeak 3 +# 10: Avorion stopmode="2" ## Query mode diff --git a/lgsm/config-default/config-lgsm/l4d2server/_default.cfg b/lgsm/config-default/config-lgsm/l4d2server/_default.cfg index bfaaca623..4852b2231 100644 --- a/lgsm/config-default/config-lgsm/l4d2server/_default.cfg +++ b/lgsm/config-default/config-lgsm/l4d2server/_default.cfg @@ -124,7 +124,7 @@ steammaster="false" # 7: exit # 8: 7 Days to Die # 9: GoldSrc -# 10: Teamspeak 3 +# 10: Avorion stopmode="3" ## Query mode diff --git a/lgsm/config-default/config-lgsm/l4dserver/_default.cfg b/lgsm/config-default/config-lgsm/l4dserver/_default.cfg index 365bf7505..158605d2f 100644 --- a/lgsm/config-default/config-lgsm/l4dserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/l4dserver/_default.cfg @@ -124,7 +124,7 @@ steammaster="false" # 7: exit # 8: 7 Days to Die # 9: GoldSrc -# 10: Teamspeak 3 +# 10: Avorion stopmode="2" ## Query mode diff --git a/lgsm/config-default/config-lgsm/mcbserver/_default.cfg b/lgsm/config-default/config-lgsm/mcbserver/_default.cfg index 3501928bc..839f5a9af 100644 --- a/lgsm/config-default/config-lgsm/mcbserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/mcbserver/_default.cfg @@ -109,7 +109,7 @@ sleeptime="0.5" # 7: exit # 8: 7 Days to Die # 9: GoldSrc -# 10: Teamspeak 3 +# 10: Avorion stopmode="5" ## Query mode diff --git a/lgsm/config-default/config-lgsm/mcserver/_default.cfg b/lgsm/config-default/config-lgsm/mcserver/_default.cfg index 664796cbc..a49465f45 100644 --- a/lgsm/config-default/config-lgsm/mcserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/mcserver/_default.cfg @@ -115,7 +115,7 @@ sleeptime="0.5" # 7: exit # 8: 7 Days to Die # 9: GoldSrc -# 10: Teamspeak 3 +# 10: Avorion stopmode="5" ## Query mode diff --git a/lgsm/config-default/config-lgsm/mhserver/_default.cfg b/lgsm/config-default/config-lgsm/mhserver/_default.cfg index d3b98a081..255ecdd04 100644 --- a/lgsm/config-default/config-lgsm/mhserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/mhserver/_default.cfg @@ -125,7 +125,7 @@ steammaster="false" # 7: exit # 8: 7 Days to Die # 9: GoldSrc -# 10: Teamspeak 3 +# 10: Avorion stopmode="2" ## Query mode diff --git a/lgsm/config-default/config-lgsm/mohaaserver/_default.cfg b/lgsm/config-default/config-lgsm/mohaaserver/_default.cfg index 49eaa189f..1f82fe0c4 100644 --- a/lgsm/config-default/config-lgsm/mohaaserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/mohaaserver/_default.cfg @@ -111,7 +111,7 @@ sleeptime="0.5" # 7: exit # 8: 7 Days to Die # 9: GoldSrc -# 10: Teamspeak 3 +# 10: Avorion stopmode="3" ## Query mode diff --git a/lgsm/config-default/config-lgsm/mtaserver/_default.cfg b/lgsm/config-default/config-lgsm/mtaserver/_default.cfg index ac0812cfc..dc6aac282 100644 --- a/lgsm/config-default/config-lgsm/mtaserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/mtaserver/_default.cfg @@ -110,7 +110,7 @@ sleeptime="0.5" # 7: exit # 8: 7 Days to Die # 9: GoldSrc -# 10: Teamspeak 3 +# 10: Avorion stopmode="4" ## Query mode diff --git a/lgsm/config-default/config-lgsm/mumbleserver/_default.cfg b/lgsm/config-default/config-lgsm/mumbleserver/_default.cfg index 83ecb5eb0..6afe760ae 100644 --- a/lgsm/config-default/config-lgsm/mumbleserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/mumbleserver/_default.cfg @@ -110,7 +110,7 @@ sleeptime="0.5" # 7: exit # 8: 7 Days to Die # 9: GoldSrc -# 10: Teamspeak 3 +# 10: Avorion stopmode="2" ## Query mode diff --git a/lgsm/config-default/config-lgsm/ndserver/_default.cfg b/lgsm/config-default/config-lgsm/ndserver/_default.cfg index 46ff6b63b..084bcc20b 100644 --- a/lgsm/config-default/config-lgsm/ndserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/ndserver/_default.cfg @@ -125,7 +125,7 @@ steammaster="true" # 7: exit # 8: 7 Days to Die # 9: GoldSrc -# 10: Teamspeak 3 +# 10: Avorion stopmode="3" ## Query mode diff --git a/lgsm/config-default/config-lgsm/nmrihserver/_default.cfg b/lgsm/config-default/config-lgsm/nmrihserver/_default.cfg index 3fb1cae94..261d74fed 100644 --- a/lgsm/config-default/config-lgsm/nmrihserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/nmrihserver/_default.cfg @@ -130,7 +130,7 @@ steammaster="true" # 7: exit # 8: 7 Days to Die # 9: GoldSrc -# 10: Teamspeak 3 +# 10: Avorion stopmode="3" ## Query mode diff --git a/lgsm/config-default/config-lgsm/ns2cserver/_default.cfg b/lgsm/config-default/config-lgsm/ns2cserver/_default.cfg index ea1cebd3f..6e857c346 100644 --- a/lgsm/config-default/config-lgsm/ns2cserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/ns2cserver/_default.cfg @@ -132,7 +132,7 @@ steammaster="true" # 7: exit # 8: 7 Days to Die # 9: GoldSrc -# 10: Teamspeak 3 +# 10: Avorion stopmode="6" ## Query mode diff --git a/lgsm/config-default/config-lgsm/ns2server/_default.cfg b/lgsm/config-default/config-lgsm/ns2server/_default.cfg index 4e05e2cf7..01cb086f9 100644 --- a/lgsm/config-default/config-lgsm/ns2server/_default.cfg +++ b/lgsm/config-default/config-lgsm/ns2server/_default.cfg @@ -136,7 +136,7 @@ steammaster="true" # 7: exit # 8: 7 Days to Die # 9: GoldSrc -# 10: Teamspeak 3 +# 10: Avorion stopmode="6" ## Query mode diff --git a/lgsm/config-default/config-lgsm/nsserver/_default.cfg b/lgsm/config-default/config-lgsm/nsserver/_default.cfg index 7457a8161..446e8ab8a 100644 --- a/lgsm/config-default/config-lgsm/nsserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/nsserver/_default.cfg @@ -125,7 +125,7 @@ steammaster="true" # 7: exit # 8: 7 Days to Die # 9: GoldSrc -# 10: Teamspeak 3 +# 10: Avorion stopmode="9" ## Query mode diff --git a/lgsm/config-default/config-lgsm/onsetserver/_default.cfg b/lgsm/config-default/config-lgsm/onsetserver/_default.cfg index 389b1411c..7401de91a 100644 --- a/lgsm/config-default/config-lgsm/onsetserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/onsetserver/_default.cfg @@ -117,7 +117,7 @@ steammaster="false" # 7: exit # 8: 7 Days to Die # 9: GoldSrc -# 10: Teamspeak 3 +# 10: Avorion stopmode="2" ## Query mode diff --git a/lgsm/config-default/config-lgsm/opforserver/_default.cfg b/lgsm/config-default/config-lgsm/opforserver/_default.cfg index 60cff0eab..a341627a9 100644 --- a/lgsm/config-default/config-lgsm/opforserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/opforserver/_default.cfg @@ -125,7 +125,7 @@ steammaster="true" # 7: exit # 8: 7 Days to Die # 9: GoldSrc -# 10: Teamspeak 3 +# 10: Avorion stopmode="9" ## Query mode diff --git a/lgsm/config-default/config-lgsm/pcserver/_default.cfg b/lgsm/config-default/config-lgsm/pcserver/_default.cfg index 2f73299f5..fc74fbe5e 100644 --- a/lgsm/config-default/config-lgsm/pcserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/pcserver/_default.cfg @@ -117,7 +117,7 @@ steammaster="false" # 7: exit # 8: 7 Days to Die # 9: GoldSrc -# 10: Teamspeak 3 +# 10: Avorion stopmode="2" ## Query mode diff --git a/lgsm/config-default/config-lgsm/pstbsserver/_default.cfg b/lgsm/config-default/config-lgsm/pstbsserver/_default.cfg index d9ba14c4c..9c60c53bc 100644 --- a/lgsm/config-default/config-lgsm/pstbsserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/pstbsserver/_default.cfg @@ -126,7 +126,7 @@ steammaster="false" # 7: exit # 8: 7 Days to Die # 9: GoldSrc -# 10: Teamspeak 3 +# 10: Avorion stopmode="2" ## Query mode diff --git a/lgsm/config-default/config-lgsm/pvkiiserver/_default.cfg b/lgsm/config-default/config-lgsm/pvkiiserver/_default.cfg index 5971d6bbb..0118ecaa4 100644 --- a/lgsm/config-default/config-lgsm/pvkiiserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/pvkiiserver/_default.cfg @@ -125,7 +125,7 @@ steammaster="true" # 7: exit # 8: 7 Days to Die # 9: GoldSrc -# 10: Teamspeak 3 +# 10: Avorion stopmode="3" ## Query mode diff --git a/lgsm/config-default/config-lgsm/pzserver/_default.cfg b/lgsm/config-default/config-lgsm/pzserver/_default.cfg index 8c3d198db..da9ae479d 100644 --- a/lgsm/config-default/config-lgsm/pzserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/pzserver/_default.cfg @@ -121,7 +121,7 @@ steammaster="false" # 7: exit # 8: 7 Days to Die # 9: GoldSrc -# 10: Teamspeak 3 +# 10: Avorion stopmode="3" ## Query mode diff --git a/lgsm/config-default/config-lgsm/q2server/_default.cfg b/lgsm/config-default/config-lgsm/q2server/_default.cfg index 9dfa92158..832f641c7 100644 --- a/lgsm/config-default/config-lgsm/q2server/_default.cfg +++ b/lgsm/config-default/config-lgsm/q2server/_default.cfg @@ -111,7 +111,7 @@ sleeptime="0.5" # 7: exit # 8: 7 Days to Die # 9: GoldSrc -# 10: Teamspeak 3 +# 10: Avorion stopmode="3" ## Query mode diff --git a/lgsm/config-default/config-lgsm/q3server/_default.cfg b/lgsm/config-default/config-lgsm/q3server/_default.cfg index b4f96b023..6d28f4caf 100644 --- a/lgsm/config-default/config-lgsm/q3server/_default.cfg +++ b/lgsm/config-default/config-lgsm/q3server/_default.cfg @@ -111,7 +111,7 @@ sleeptime="0.5" # 7: exit # 8: 7 Days to Die # 9: GoldSrc -# 10: Teamspeak 3 +# 10: Avorion stopmode="3" ## Query mode diff --git a/lgsm/config-default/config-lgsm/qlserver/_default.cfg b/lgsm/config-default/config-lgsm/qlserver/_default.cfg index 656287080..3a5471ad6 100644 --- a/lgsm/config-default/config-lgsm/qlserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/qlserver/_default.cfg @@ -119,7 +119,7 @@ steammaster="true" # 7: exit # 8: 7 Days to Die # 9: GoldSrc -# 10: Teamspeak 3 +# 10: Avorion stopmode="3" ## Query mode diff --git a/lgsm/config-default/config-lgsm/qwserver/_default.cfg b/lgsm/config-default/config-lgsm/qwserver/_default.cfg index 4f35f05be..59cdcc0f1 100644 --- a/lgsm/config-default/config-lgsm/qwserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/qwserver/_default.cfg @@ -110,7 +110,7 @@ sleeptime="0.5" # 7: exit # 8: 7 Days to Die # 9: GoldSrc -# 10: Teamspeak 3 +# 10: Avorion stopmode="3" ## Query mode diff --git a/lgsm/config-default/config-lgsm/ricochetserver/_default.cfg b/lgsm/config-default/config-lgsm/ricochetserver/_default.cfg index 10bec3c12..b825fb75b 100644 --- a/lgsm/config-default/config-lgsm/ricochetserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/ricochetserver/_default.cfg @@ -125,7 +125,7 @@ steammaster="true" # 7: exit # 8: 7 Days to Die # 9: GoldSrc -# 10: Teamspeak 3 +# 10: Avorion stopmode="9" ## Query mode diff --git a/lgsm/config-default/config-lgsm/roserver/_default.cfg b/lgsm/config-default/config-lgsm/roserver/_default.cfg index 18b352c9c..3cbfd5888 100644 --- a/lgsm/config-default/config-lgsm/roserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/roserver/_default.cfg @@ -125,7 +125,7 @@ steammaster="false" # 7: exit # 8: 7 Days to Die # 9: GoldSrc -# 10: Teamspeak 3 +# 10: Avorion stopmode="2" ## Query mode diff --git a/lgsm/config-default/config-lgsm/rtcwserver/_default.cfg b/lgsm/config-default/config-lgsm/rtcwserver/_default.cfg index 996848ee9..93b9ce3fe 100644 --- a/lgsm/config-default/config-lgsm/rtcwserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/rtcwserver/_default.cfg @@ -111,7 +111,7 @@ sleeptime="0.5" # 7: exit # 8: 7 Days to Die # 9: GoldSrc -# 10: Teamspeak 3 +# 10: Avorion stopmode="3" ## Query mode diff --git a/lgsm/config-default/config-lgsm/rustserver/_default.cfg b/lgsm/config-default/config-lgsm/rustserver/_default.cfg index 7fb73f6d4..cf70cdae7 100644 --- a/lgsm/config-default/config-lgsm/rustserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/rustserver/_default.cfg @@ -149,7 +149,7 @@ steammaster="false" # 7: exit # 8: 7 Days to Die # 9: GoldSrc -# 10: Teamspeak 3 +# 10: Avorion stopmode="2" ## Query mode diff --git a/lgsm/config-default/config-lgsm/rwserver/_default.cfg b/lgsm/config-default/config-lgsm/rwserver/_default.cfg index ffa882164..95c37ef2d 100644 --- a/lgsm/config-default/config-lgsm/rwserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/rwserver/_default.cfg @@ -120,7 +120,7 @@ steammaster="false" # 7: exit # 8: 7 Days to Die # 9: GoldSrc -# 10: Teamspeak 3 +# 10: Avorion stopmode="3" ## Query mode diff --git a/lgsm/config-default/config-lgsm/sampserver/_default.cfg b/lgsm/config-default/config-lgsm/sampserver/_default.cfg index b04e487ad..67331ee39 100644 --- a/lgsm/config-default/config-lgsm/sampserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/sampserver/_default.cfg @@ -110,7 +110,7 @@ sleeptime="0.5" # 7: exit # 8: 7 Days to Die # 9: GoldSrc -# 10: Teamspeak 3 +# 10: Avorion stopmode="2" ## Query mode diff --git a/lgsm/config-default/config-lgsm/sbotsserver/_default.cfg b/lgsm/config-default/config-lgsm/sbotsserver/_default.cfg index 23bcee08b..6145c9905 100644 --- a/lgsm/config-default/config-lgsm/sbotsserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/sbotsserver/_default.cfg @@ -125,7 +125,7 @@ steammaster="false" # 7: exit # 8: 7 Days to Die # 9: GoldSrc -# 10: Teamspeak 3 +# 10: Avorion stopmode="2" ## Query mode diff --git a/lgsm/config-default/config-lgsm/sbserver/_default.cfg b/lgsm/config-default/config-lgsm/sbserver/_default.cfg index 460407b4e..f9ae836d1 100644 --- a/lgsm/config-default/config-lgsm/sbserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/sbserver/_default.cfg @@ -123,7 +123,7 @@ steammaster="flase" # 7: exit # 8: 7 Days to Die # 9: GoldSrc -# 10: Teamspeak 3 +# 10: Avorion stopmode="2" ## Query mode diff --git a/lgsm/config-default/config-lgsm/sdtdserver/_default.cfg b/lgsm/config-default/config-lgsm/sdtdserver/_default.cfg index 748d57499..6269e6150 100644 --- a/lgsm/config-default/config-lgsm/sdtdserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/sdtdserver/_default.cfg @@ -120,7 +120,7 @@ steammaster="true" # 7: exit # 8: 7 Days to Die # 9: GoldSrc -# 10: Teamspeak 3 +# 10: Avorion stopmode="8" ## Query mode diff --git a/lgsm/config-default/config-lgsm/sfcserver/_default.cfg b/lgsm/config-default/config-lgsm/sfcserver/_default.cfg index bc76cf097..2203ba14b 100644 --- a/lgsm/config-default/config-lgsm/sfcserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/sfcserver/_default.cfg @@ -125,7 +125,7 @@ steammaster="true" # 7: exit # 8: 7 Days to Die # 9: GoldSrc -# 10: Teamspeak 3 +# 10: Avorion stopmode="3" ## Query mode diff --git a/lgsm/config-default/config-lgsm/sof2server/_default.cfg b/lgsm/config-default/config-lgsm/sof2server/_default.cfg index 0c3036039..090330f49 100644 --- a/lgsm/config-default/config-lgsm/sof2server/_default.cfg +++ b/lgsm/config-default/config-lgsm/sof2server/_default.cfg @@ -111,7 +111,7 @@ sleeptime="0.5" # 7: exit # 8: 7 Days to Die # 9: GoldSrc -# 10: Teamspeak 3 +# 10: Avorion stopmode="3" ## Query mode diff --git a/lgsm/config-default/config-lgsm/solserver/_default.cfg b/lgsm/config-default/config-lgsm/solserver/_default.cfg index 47a08ddf0..d1f853dca 100644 --- a/lgsm/config-default/config-lgsm/solserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/solserver/_default.cfg @@ -116,7 +116,7 @@ branch="" # 7: exit # 8: 7 Days to Die # 9: GoldSrc -# 10: Teamspeak 3 +# 10: Avorion stopmode="2" ## Query mode diff --git a/lgsm/config-default/config-lgsm/squadserver/_default.cfg b/lgsm/config-default/config-lgsm/squadserver/_default.cfg index 9fbef2101..81eb50c01 100644 --- a/lgsm/config-default/config-lgsm/squadserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/squadserver/_default.cfg @@ -122,7 +122,7 @@ steammaster="false" # 7: exit # 8: 7 Days to Die # 9: GoldSrc -# 10: Teamspeak 3 +# 10: Avorion stopmode="2" ## Query mode diff --git a/lgsm/config-default/config-lgsm/ss3server/_default.cfg b/lgsm/config-default/config-lgsm/ss3server/_default.cfg index 159a054db..9032678a4 100644 --- a/lgsm/config-default/config-lgsm/ss3server/_default.cfg +++ b/lgsm/config-default/config-lgsm/ss3server/_default.cfg @@ -121,7 +121,7 @@ steammaster="false" # 7: exit # 8: 7 Days to Die # 9: GoldSrc -# 10: Teamspeak 3 +# 10: Avorion stopmode="2" ## Query mode diff --git a/lgsm/config-default/config-lgsm/stserver/_default.cfg b/lgsm/config-default/config-lgsm/stserver/_default.cfg index 9c8587035..581c1481a 100644 --- a/lgsm/config-default/config-lgsm/stserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/stserver/_default.cfg @@ -127,7 +127,7 @@ steammaster="false" # 7: exit # 8: 7 Days to Die # 9: GoldSrc -# 10: Teamspeak 3 +# 10: Avorion stopmode="2" ## Query mode diff --git a/lgsm/config-default/config-lgsm/svenserver/_default.cfg b/lgsm/config-default/config-lgsm/svenserver/_default.cfg index 2e3f5cd7f..72b3acadd 100644 --- a/lgsm/config-default/config-lgsm/svenserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/svenserver/_default.cfg @@ -124,7 +124,7 @@ steammaster="true" # 7: exit # 8: 7 Days to Die # 9: GoldSrc -# 10: Teamspeak 3 +# 10: Avorion stopmode="9" ## Query mode diff --git a/lgsm/config-default/config-lgsm/terrariaserver/_default.cfg b/lgsm/config-default/config-lgsm/terrariaserver/_default.cfg index b6cd00d28..3f941122f 100644 --- a/lgsm/config-default/config-lgsm/terrariaserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/terrariaserver/_default.cfg @@ -124,7 +124,7 @@ steammaster="false" # 7: exit # 8: 7 Days to Die # 9: GoldSrc -# 10: Teamspeak 3 +# 10: Avorion stopmode="7" ## Query mode diff --git a/lgsm/config-default/config-lgsm/tf2server/_default.cfg b/lgsm/config-default/config-lgsm/tf2server/_default.cfg index f5a8579b3..31eefeb12 100644 --- a/lgsm/config-default/config-lgsm/tf2server/_default.cfg +++ b/lgsm/config-default/config-lgsm/tf2server/_default.cfg @@ -130,7 +130,7 @@ steammaster="true" # 7: exit # 8: 7 Days to Die # 9: GoldSrc -# 10: Teamspeak 3 +# 10: Avorion stopmode="3" ## Query mode diff --git a/lgsm/config-default/config-lgsm/tfcserver/_default.cfg b/lgsm/config-default/config-lgsm/tfcserver/_default.cfg index 4111b82be..ccd4988e0 100644 --- a/lgsm/config-default/config-lgsm/tfcserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/tfcserver/_default.cfg @@ -125,7 +125,7 @@ steammaster="true" # 7: exit # 8: 7 Days to Die # 9: GoldSrc -# 10: Teamspeak 3 +# 10: Avorion stopmode="9" ## Query mode diff --git a/lgsm/config-default/config-lgsm/ts3server/_default.cfg b/lgsm/config-default/config-lgsm/ts3server/_default.cfg index fe42acd96..3a511b394 100644 --- a/lgsm/config-default/config-lgsm/ts3server/_default.cfg +++ b/lgsm/config-default/config-lgsm/ts3server/_default.cfg @@ -112,7 +112,7 @@ sleeptime="0.5" # 7: exit # 8: 7 Days to Die # 9: GoldSrc -# 10: Teamspeak 3 +# 10: Avorion stopmode="2" ## Query mode diff --git a/lgsm/config-default/config-lgsm/tsserver/_default.cfg b/lgsm/config-default/config-lgsm/tsserver/_default.cfg index cd2cb7cdd..f73622b42 100644 --- a/lgsm/config-default/config-lgsm/tsserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/tsserver/_default.cfg @@ -125,7 +125,7 @@ steammaster="true" # 7: exit # 8: 7 Days to Die # 9: GoldSrc -# 10: Teamspeak 3 +# 10: Avorion stopmode="9" ## Query mode diff --git a/lgsm/config-default/config-lgsm/tuserver/_default.cfg b/lgsm/config-default/config-lgsm/tuserver/_default.cfg index cb8f38541..ff4165e45 100644 --- a/lgsm/config-default/config-lgsm/tuserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/tuserver/_default.cfg @@ -127,7 +127,7 @@ steammaster="false" # 7: exit # 8: 7 Days to Die # 9: GoldSrc -# 10: Teamspeak 3 +# 10: Avorion stopmode="2" ## Query mode diff --git a/lgsm/config-default/config-lgsm/twserver/_default.cfg b/lgsm/config-default/config-lgsm/twserver/_default.cfg index fd6424783..461c97059 100644 --- a/lgsm/config-default/config-lgsm/twserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/twserver/_default.cfg @@ -124,7 +124,7 @@ steammaster="false" # 7: exit # 8: 7 Days to Die # 9: GoldSrc -# 10: Teamspeak 3 +# 10: Avorion stopmode="2" ## Query mode diff --git a/lgsm/config-default/config-lgsm/untserver/_default.cfg b/lgsm/config-default/config-lgsm/untserver/_default.cfg index cee9b4867..ef0fe4c24 100644 --- a/lgsm/config-default/config-lgsm/untserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/untserver/_default.cfg @@ -127,7 +127,7 @@ steammaster="false" # 7: exit # 8: 7 Days to Die # 9: GoldSrc -# 10: Teamspeak 3 +# 10: Avorion stopmode="2" ## Query mode diff --git a/lgsm/config-default/config-lgsm/ut2k4server/_default.cfg b/lgsm/config-default/config-lgsm/ut2k4server/_default.cfg index f317b6126..9c4164c72 100644 --- a/lgsm/config-default/config-lgsm/ut2k4server/_default.cfg +++ b/lgsm/config-default/config-lgsm/ut2k4server/_default.cfg @@ -110,7 +110,7 @@ sleeptime="0.5" # 7: exit # 8: 7 Days to Die # 9: GoldSrc -# 10: Teamspeak 3 +# 10: Avorion stopmode="2" ## Query mode diff --git a/lgsm/config-default/config-lgsm/ut3server/_default.cfg b/lgsm/config-default/config-lgsm/ut3server/_default.cfg index d785d753c..2a2c8a518 100644 --- a/lgsm/config-default/config-lgsm/ut3server/_default.cfg +++ b/lgsm/config-default/config-lgsm/ut3server/_default.cfg @@ -121,7 +121,7 @@ sleeptime="0.5" # 7: exit # 8: 7 Days to Die # 9: GoldSrc -# 10: Teamspeak 3 +# 10: Avorion stopmode="2" ## Query mode diff --git a/lgsm/config-default/config-lgsm/ut99server/_default.cfg b/lgsm/config-default/config-lgsm/ut99server/_default.cfg index b099f3088..caab7ffea 100644 --- a/lgsm/config-default/config-lgsm/ut99server/_default.cfg +++ b/lgsm/config-default/config-lgsm/ut99server/_default.cfg @@ -110,7 +110,7 @@ sleeptime="0.5" # 7: exit # 8: 7 Days to Die # 9: GoldSrc -# 10: Teamspeak 3 +# 10: Avorion stopmode="2" ## Query mode diff --git a/lgsm/config-default/config-lgsm/utserver/_default.cfg b/lgsm/config-default/config-lgsm/utserver/_default.cfg index 4612d9dc1..40d6cc526 100644 --- a/lgsm/config-default/config-lgsm/utserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/utserver/_default.cfg @@ -114,7 +114,7 @@ sleeptime="0.5" # 7: exit # 8: 7 Days to Die # 9: GoldSrc -# 10: Teamspeak 3 +# 10: Avorion stopmode="2" ## Query mode diff --git a/lgsm/config-default/config-lgsm/vsserver/_default.cfg b/lgsm/config-default/config-lgsm/vsserver/_default.cfg index 9e4467ae8..1eaa9ff86 100644 --- a/lgsm/config-default/config-lgsm/vsserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/vsserver/_default.cfg @@ -125,7 +125,7 @@ steammaster="true" # 7: exit # 8: 7 Days to Die # 9: GoldSrc -# 10: Teamspeak 3 +# 10: Avorion stopmode="9" ## Query mode diff --git a/lgsm/config-default/config-lgsm/wetserver/_default.cfg b/lgsm/config-default/config-lgsm/wetserver/_default.cfg index 3074dec92..54ee3d25b 100644 --- a/lgsm/config-default/config-lgsm/wetserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/wetserver/_default.cfg @@ -106,7 +106,7 @@ sleeptime="0.5" # 7: exit # 8: 7 Days to Die # 9: GoldSrc -# 10: Teamspeak 3 +# 10: Avorion stopmode="3" ## Query mode diff --git a/lgsm/config-default/config-lgsm/wfserver/_default.cfg b/lgsm/config-default/config-lgsm/wfserver/_default.cfg index a4860de5d..1ddbd7746 100644 --- a/lgsm/config-default/config-lgsm/wfserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/wfserver/_default.cfg @@ -111,7 +111,7 @@ sleeptime="0.5" # 7: exit # 8: 7 Days to Die # 9: GoldSrc -# 10: Teamspeak 3 +# 10: Avorion stopmode="3" ## Query mode diff --git a/lgsm/config-default/config-lgsm/wurmserver/_default.cfg b/lgsm/config-default/config-lgsm/wurmserver/_default.cfg index cb22a8494..e131fc28b 100644 --- a/lgsm/config-default/config-lgsm/wurmserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/wurmserver/_default.cfg @@ -116,7 +116,7 @@ steammaster="false" # 7: exit # 8: 7 Days to Die # 9: GoldSrc -# 10: Teamspeak 3 +# 10: Avorion stopmode="2" ## Query mode diff --git a/lgsm/config-default/config-lgsm/zmrserver/_default.cfg b/lgsm/config-default/config-lgsm/zmrserver/_default.cfg index 4a99b33e4..b22f79fc2 100644 --- a/lgsm/config-default/config-lgsm/zmrserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/zmrserver/_default.cfg @@ -125,7 +125,7 @@ steammaster="true" # 7: exit # 8: 7 Days to Die # 9: GoldSrc -# 10: Teamspeak 3 +# 10: Avorion stopmode="3" ## Query mode diff --git a/lgsm/config-default/config-lgsm/zpsserver/_default.cfg b/lgsm/config-default/config-lgsm/zpsserver/_default.cfg index 6662da3c7..279f7258a 100644 --- a/lgsm/config-default/config-lgsm/zpsserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/zpsserver/_default.cfg @@ -130,7 +130,7 @@ steammaster="true" # 7: exit # 8: 7 Days to Die # 9: GoldSrc -# 10: Teamspeak 3 +# 10: Avorion stopmode="3" ## Query mode diff --git a/lgsm/data/serverlist.csv b/lgsm/data/serverlist.csv index 1fd2562d8..f3b13a7fc 100644 --- a/lgsm/data/serverlist.csv +++ b/lgsm/data/serverlist.csv @@ -3,6 +3,7 @@ ahl,ahlserver,Action half-life ahl2,ahl2server,Action: Source ark,arkserver,ARK: Survival Evolved arma3,arma3server,ARMA 3 +av,avserver,Avorion bb,bbserver,BrainBread bb2,bb2server,BrainBread 2 bd,bdserver,Base Defense @@ -103,4 +104,4 @@ wet,wetserver,Wolfenstein: Enemy Territory wf,wfserver,Warfork wurm,wurmserver,Wurm Unlimited zmr,zmrserver,Zombie Master: Reborn -zps,zpsserver,Zombie Panic! Source +zps,zpsserver,Zombie Panic! Source \ No newline at end of file diff --git a/lgsm/functions/command_details.sh b/lgsm/functions/command_details.sh index 0551e2442..d2673e27c 100644 --- a/lgsm/functions/command_details.sh +++ b/lgsm/functions/command_details.sh @@ -15,7 +15,9 @@ info_config.sh info_parms.sh info_distro.sh info_messages.sh -query_gamedig.sh +if [ "${querymode}" == "2" ]|| [ "${querymode}" == "3" ]; then + query_gamedig.sh +fi fn_info_message_distro fn_info_message_server_resource fn_info_message_gameserver_resource diff --git a/lgsm/functions/command_dev_query_raw.sh b/lgsm/functions/command_dev_query_raw.sh index 4375b731e..0f5e5c8e2 100644 --- a/lgsm/functions/command_dev_query_raw.sh +++ b/lgsm/functions/command_dev_query_raw.sh @@ -81,4 +81,5 @@ else echo -e "TCP query FAIL" fi +exitcode=0 core_exit.sh diff --git a/lgsm/functions/command_monitor.sh b/lgsm/functions/command_monitor.sh index 893ba992f..98f018cf4 100644 --- a/lgsm/functions/command_monitor.sh +++ b/lgsm/functions/command_monitor.sh @@ -75,11 +75,17 @@ fn_monitor_check_queryport(){ if [ -z "${queryport}" ]||[ "${queryport}" == "0" ]; then fn_print_dots "Checking port: " fn_print_checking_eol - fn_script_log_info "Checking session: CHECKING" + fn_script_log_info "Checking port: CHECKING" fn_sleep_time - fn_print_error "Checking port: Unable to query as queryport is not set: " - fn_print_error_eol_nl - fn_script_log_error "Checking port: Unable to query as queryport is not set: ERROR" + if [ -n "${rconenabled}" ]&&[ "${rconenabled}" != "true" ]&&[ ${shortname} == "av" ]; then + fn_print_warn "Checking port: Unable to query as rconport, rcon not enabled: " + fn_print_warn_eol_nl + fn_script_log_warn "Checking port: Unable to query rconport, rcon not enabled: WARN" + else + fn_print_error "Checking port: Unable to query queryport is not set: " + fn_print_error_eol_nl + fn_script_log_error "Checking port: Unable to query as queryport is not set: ERROR" + fi fn_sleep_time core_exit.sh fi diff --git a/lgsm/functions/command_stop.sh b/lgsm/functions/command_stop.sh index 956f41537..c25714de2 100644 --- a/lgsm/functions/command_stop.sh +++ b/lgsm/functions/command_stop.sh @@ -181,6 +181,36 @@ fn_stop_graceful_sdtd(){ fn_sleep_time } +# Attempts graceful shutdown by sending /save /stop. +fn_stop_graceful_avorion(){ + fn_print_dots "Graceful: /save /stop" + fn_script_log_info "Graceful: /save /stop" + # Sends /save. + tmux send-keys -t "${selfname}" /save ENTER > /dev/null 2>&1 + sleep 5 + # Sends /quit. + tmux send-keys -t "${selfname}" /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: /save /stop: ${seconds}: " + fn_print_ok_eol_nl + fn_script_log_pass "Graceful: /save /stop: OK: ${seconds} seconds" + break + fi + sleep 1 + fn_print_dots "Graceful: /save /stop: ${seconds}" + done + check_status.sh + if [ "${status}" != "0" ]; then + fn_print_error "Graceful: /save /stop: " + fn_print_fail_eol_nl + fn_script_log_error "Graceful: /save /stop: FAIL" + fi + fn_sleep_time +} + fn_stop_graceful_select(){ if [ "${stopmode}" == "1" ]; then fn_stop_tmux @@ -200,6 +230,8 @@ fn_stop_graceful_select(){ fn_stop_graceful_sdtd elif [ "${stopmode}" == "9" ]; then fn_stop_graceful_goldsrc + elif [ "${stopmode}" == "10" ]; then + fn_stop_graceful_avorion fi } diff --git a/lgsm/functions/core_functions.sh b/lgsm/functions/core_functions.sh index e8cb4be06..29bc46f56 100644 --- a/lgsm/functions/core_functions.sh +++ b/lgsm/functions/core_functions.sh @@ -301,6 +301,11 @@ functionfile="${FUNCNAME[0]}" fn_fetch_function } +fix_av.sh(){ +functionfile="${FUNCNAME[0]}" +fn_fetch_function +} + fix_arma3.sh(){ functionfile="${FUNCNAME[0]}" fn_fetch_function diff --git a/lgsm/functions/fix.sh b/lgsm/functions/fix.sh index 7d03bca99..b5c278847 100644 --- a/lgsm/functions/fix.sh +++ b/lgsm/functions/fix.sh @@ -90,12 +90,15 @@ fi # Fixes that are run on install only. if [ "${function_selfname}" == "command_install.sh" ]; then - if [ "${shortname}" == "kf" ]||[ "${shortname}" == "kf2" ]||[ "${shortname}" == "ro" ]||[ "${shortname}" == "ut2k4" ]||[ "${shortname}" == "ut" ]||[ "${shortname}" == "ut3" ]; then + if [ "${shortname}" == "av" ]||[ "${shortname}" == "kf" ]||[ "${shortname}" == "kf2" ]||[ "${shortname}" == "onset" ]||[ "${shortname}" == "ro" ]||[ "${shortname}" == "ut2k4" ]||[ "${shortname}" == "ut" ]||[ "${shortname}" == "ut3" ]; then echo -e "" echo -e "Applying Post-Install Fixes" echo -e "=================================" fn_sleep_time - if [ "${shortname}" == "kf" ]; then + postinstall=1 + if [ "${shortname}" == "av" ]; then + fix_av.sh + elif [ "${shortname}" == "kf" ]; then fix_kf.sh elif [ "${shortname}" == "kf2" ]; then fix_kf2.sh diff --git a/lgsm/functions/fix_av.sh b/lgsm/functions/fix_av.sh new file mode 100644 index 000000000..fcbab6b13 --- /dev/null +++ b/lgsm/functions/fix_av.sh @@ -0,0 +1,23 @@ +#!/bin/bash +# LinuxGSM fix_av.sh function +# Author: Christian Birk +# Website: https://linuxgsm.com +# Description: Resolves startup issue with Avorion + +local commandname="FIX" +local commandaction="Fix" + +export LD_LIBRARY_PATH="$LD_LIBRARY_PATH:${serverfiles}:${serverfiles}/linux64" + +if [ "${postinstall}" == "1" ]; then + fn_parms(){ + parms="--datapath ${avdatapath} --galaxy-name ${avgalaxy} --init-folders-only" + } + + fn_print_information "starting ${gamename} server to generate configs." + fn_sleep_time + # go to the executeable dir and start the init of the server + cd "${systemdir}" || return 2 + fn_parms + "${executabledir}/${executable}" ${parms} +fi diff --git a/lgsm/functions/info_config.sh b/lgsm/functions/info_config.sh index c37582b59..2a7391739 100644 --- a/lgsm/functions/info_config.sh +++ b/lgsm/functions/info_config.sh @@ -417,7 +417,7 @@ fn_info_config_minecraft_bedrock(){ maxplayers="${zero}" port="${zero}" port6="${zero}" - queryport="${zero}" + queryport="${zero}" gamemode="${unavailable}" gameworld="${unavailable}" else @@ -425,7 +425,7 @@ fn_info_config_minecraft_bedrock(){ maxplayers=$(grep "max-players" "${servercfgfullpath}" | grep -v "#" | tr -cd '[:digit:]') port=$(grep "server-port\b" "${servercfgfullpath}" | grep -v "#" | tr -cd '[:digit:]') port6=$(grep "server-portv6\b" "${servercfgfullpath}" | sed 's/v6//g' | grep -v "#" | tr -cd '[:digit:]') - queryport=${port} + queryport=${port} gamemode=$(grep "gamemode" "${servercfgfullpath}" | sed -e 's/^[ \t]*//g' -e '/^#/d' -e 's/gamemode//g' | tr -d '=\";,:' | sed -e 's/^[ \t]*//' -e 's/[ \t]*$//') gameworld=$(grep "level-name" "${servercfgfullpath}" | sed -e 's/^[ \t]*//g' -e '/^#/d' -e 's/level-name//g' | tr -d '=\";,:' | sed -e 's/^[ \t]*//' -e 's/[ \t]*$//') @@ -434,7 +434,7 @@ fn_info_config_minecraft_bedrock(){ maxplayers=${maxplayers:-"NOT SET"} port=${port:-"NOT SET"} port6=${port6:-"NOT SET"} - queryport=${queryport:-"NOT SET"} + queryport=${queryport:-"NOT SET"} gamemode=${gamemode:-"NOT SET"} gameworld=${gameworld:-"NOT SET"} fi @@ -459,7 +459,7 @@ fn_info_config_onset(){ maxplayers=${maxplayers:-"NOT SET"} port=${port:-"NOT SET"} httpport=${httpport:-"NOT SET"} - queryport=${queryport:-"NOT SET"} + queryport=${queryport:-"NOT SET"} fi } @@ -1078,7 +1078,7 @@ fn_info_config_ut(){ # Not set servername=${servername:-"NOT SET"} - fi + fi } fn_info_config_warfork(){ @@ -1373,6 +1373,38 @@ fn_info_config_mordhau(){ fi } + +fn_info_config_avorion() { + if [ ! -f "${servercfgfullpath}" ]; then + maxplayers="${unavailable}" + servername="${unavailable}" + serverpassword="${unavailable}" + rconpassword="${unavailable}" + rconport="${unavailable}" + rconenabled="${unavailable}" + queryport="${unavailable}" + else + maxplayers=$(grep "maxPlayers=" "${servercfgfullpath}" | sed 's/maxPlayers=//') + servername=$(grep "name=" "${servercfgfullpath}" | sed 's/name=//') + serverpassword=$(grep "password=" "${servercfgfullpath}" | sed 's/password=//') + rconpassword=$(grep "rconPassword=" "${servercfgfullpath}" | sed 's/rconPassword=//') + rconport=$(grep "rconPort=" "${servercfgfullpath}" | sed 's/rconPort=//') + if [ -n "${rconpassword}" ]; then + rconenabled="true" + queryport="${rconport}" + fi + + # Not set + maxplayers=${maxplayers:-"NOT SET"} + servername=${servername:-"NOT SET"} + serverpassword=${serverpassword:-"NOT SET"} + rconpassword=${rconpassword:-"NOT SET"} + rconport=${rconport:-"0"} + rconenabled=${rconenabled:-"false"} + queryport=${queryport:-"0"} + fi +} + fn_info_config_soldat(){ if [ ! -f "${servercfgfullpath}" ]; then adminpassword="${unavailable}" @@ -1405,6 +1437,9 @@ if [ "${shortname}" == "ac" ]; then # ARK: Survival Evolved elif [ "${shortname}" == "ark" ]; then fn_info_config_ark +# Avorion +elif [ "${shortname}" == "av" ]; then + fn_info_config_avorion # Ballistic Overkill elif [ "${shortname}" == "bo" ]; then fn_info_config_ballistic_overkill @@ -1533,7 +1568,7 @@ elif [ "${engine}" == "unreal" ]; then fn_info_config_unreal # Unreal 2 engine elif [ "${engine}" == "unreal2" ]; then - fn_info_config_unreal2 + fn_info_config_unreal2 # Unreal 3 engine elif [ "${engine}" == "unreal3" ]; then fn_info_config_unreal3 diff --git a/lgsm/functions/info_messages.sh b/lgsm/functions/info_messages.sh index 00a6dd1d9..07bbaa7f7 100644 --- a/lgsm/functions/info_messages.sh +++ b/lgsm/functions/info_messages.sh @@ -105,10 +105,10 @@ fn_info_message_server_resource(){ echo -e "" { echo -e "${lightyellow}Network${default}" - if [ "${netint}" ]; then + if [ -n "${netint}" ]; then echo -e "${lightblue}Interface:\t${default}${netint}" fi - if [ "${netlink}" ]; then + if [ -n "${netlink}" ]; then echo -e "${lightblue}Link Speed:\t${default}${netlink}" fi echo -e "${lightblue}IP:\t${default}${ip}" @@ -174,14 +174,14 @@ fn_info_message_gameserver(){ fn_messages_separator { # Server name - if [ "${gdname}" ]; then + if [ -n "${gdname}" ]; then echo -e "${lightblue}Server name:\t${default}${gdname}" - elif [ "${servername}" ]; then + elif [ -n "${servername}" ]; then echo -e "${lightblue}Server name:\t${default}${servername}" fi # Server description - if [ "${serverdescription}" ]; then + if [ -n "${serverdescription}" ]; then echo -e "${lightblue}Server Description:\t${default}${serverdescription}" fi @@ -198,179 +198,175 @@ fn_info_message_gameserver(){ fi # Internet ip - if [ "${extip}" ]; then + if [ -n "${extip}" ]; then if [ "${ip}" != "${extip}" ]; then echo -e "${lightblue}Internet IP:\t${default}${extip}:${port}" fi fi # Display ip - if [ "${displayip}" ]; then + if [ -n "${displayip}" ]; then echo -e "${lightblue}Display IP:\t${default}${displayip}:${port}" fi # Server password - if [ "${serverpassword}" ]; then + if [ -n "${serverpassword}" ]; then echo -e "${lightblue}Server password:\t${default}${serverpassword}" fi # Query enabled (Starbound) - if [ "${queryenabled}" ]; then + if [ -n "${queryenabled}" ]; then echo -e "${lightblue}Query enabled:\t${default}${queryenabled}" fi # RCON enabled (Starbound) - if [ "${rconenabled}" ]; then - echo -e "${lightblue}RCON enabled:\t${default}${rconpassword}" + if [ -n "${rconenabled}" ]; then + echo -e "${lightblue}RCON enabled:\t${default}${rconenabled}" fi # RCON password - if [ "${rconpassword}" ]; then + if [ -n "${rconpassword}" ]; then echo -e "${lightblue}RCON password:\t${default}${rconpassword}" fi # RCON web (Rust) - if [ "${rconweb}" ]; then + if [ -n "${rconweb}" ]; then echo -e "${lightblue}RCON web:\t${default}${rconweb}" fi # Admin password - if [ "${adminpassword}" ]; then + if [ -n "${adminpassword}" ]; then echo -e "${lightblue}Admin password:\t${default}${adminpassword}" fi # Stats password (Quake Live) - if [ "${statspassword}" ]; then + if [ -n "${statspassword}" ]; then echo -e "${lightblue}Stats password:\t${default}${statspassword}" fi # Players if [ "${querystatus}" != "0" ]; then - if [ "${maxplayers}" ]; then + if [ -n "${maxplayers}" ]; then echo -e "${lightblue}Maxplayers:\t${default}${maxplayers}" fi else - if [ "${gdplayers}" ]&&[ -n "${gdmaxplayers}" ]; then + if [ -n "${gdplayers}" ]&&[ -n "${gdmaxplayers}" ]; then echo -e "${lightblue}Players:\t${default}${gdplayers}/${gdmaxplayers}" - - elif [ "${gdplayers}" ]&&[ -n "${maxplayers}" ]; then + elif [ -n "${gdplayers}" ]&&[ -n "${maxplayers}" ]; then echo -e "${lightblue}Players:\t${default}${gdplayers}/${maxplayers}" - elif [ -z "${gdplayers}" ]&&[ -n "${gdmaxplayers}" ]; then echo -e "${lightblue}Players:\t${default}0/${gdmaxplayers}" - - elif [ "${gdplayers}" ]&&[ -z "${gdmaxplayers}" ]; then - echo -e "${lightblue}Players:\t${default}${gdplayers}|∞" - + elif [ -n "${gdplayers}" ]&&[ -z "${gdmaxplayers}" ]; then + echo -e "${lightblue}Players:\t${default}${gdplayers}/∞" elif [ -z "${gdplayers}" ]&&[ -z "${gdmaxplayers}" ]&&[ -n "${maxplayers}" ]; then echo -e "${lightblue}Maxplayers:\t${default}${maxplayers}" fi fi # Bots - if [ "${gdbots}" ]; then + if [ -n "${gdbots}" ]; then echo -e "${lightblue}Bots:\t${default}${gdbots}" fi # Current map - if [ "${gdmap}" ]; then + if [ -n "${gdmap}" ]; then echo -e "${lightblue}Current map:\t${default}${gdmap}" fi # Default map - if [ "${defaultmap}" ]; then + if [ -n "${defaultmap}" ]; then echo -e "${lightblue}Default map:\t${default}${defaultmap}" fi - if [ "${defaultscenario}" ]; then + if [ -n "${defaultscenario}" ]; then # Current scenario - if [ "${gdgamemode}" ]; then + if [ -n "${gdgamemode}" ]; then echo -e "${lightblue}Current scenario:\t${default}${gdgamemode}" fi else # Current game mode - if [ "${gdgamemode}" ]; then + if [ -n "${gdgamemode}" ]; then echo -e "${lightblue}Current game mode:\t${default}${gdgamemode}" fi fi # Default scenario - if [ "${defaultscenario}" ]; then + if [ -n "${defaultscenario}" ]; then echo -e "${lightblue}Default scenario:\t${default}${defaultscenario}" fi # Game type - if [ "${gametype}" ]; then + if [ -n "${gametype}" ]; then echo -e "${lightblue}Game type:\t${default}${gametype}" fi # Game mode - if [ "${gamemode}" ]; then + if [ -n "${gamemode}" ]; then echo -e "${lightblue}Game mode:\t${default}${gamemode}" fi # Game world - if [ "${gameworld}" ]; then + if [ -n "${gameworld}" ]; then echo -e "${lightblue}Game world:\t${default}${gameworld}" fi # Tick rate - if [ "${tickrate}" ]; then + if [ -n "${tickrate}" ]; then echo -e "${lightblue}Tick rate:\t${default}${tickrate}" fi # Sharding (Don't Starve Together) - if [ "${sharding}" ]; then + if [ -n "${sharding}" ]; then echo -e "${lightblue}Sharding:\t${default}${sharding}" fi # Master (Don't Starve Together) - if [ "${master}" ]; then + if [ -n "${master}" ]; then echo -e "${lightblue}Master:\t${default}${master}" fi # Shard (Don't Starve Together) - if [ "${shard}" ]; then + if [ -n "${shard}" ]; then echo -e "${lightblue}Shard:\t${default}${shard}" fi # Cluster (Don't Starve Together) - if [ "${cluster}" ]; then + if [ -n "${cluster}" ]; then echo -e "${lightblue}Cluster:\t${default}${cluster}" fi # Cave (Don't Starve Together) - if [ "${cave}" ]; then + if [ -n "${cave}" ]; then echo -e "${lightblue}Cave:\t${default}${cave}" fi # Creativemode (Hurtworld) - if [ "${creativemode}" ]; then + if [ -n "${creativemode}" ]; then echo -e "${lightblue}Creativemode:\t${default}${creativemode}" fi # TeamSpeak dbplugin - if [ "${dbplugin}" ]; then + if [ -n "${dbplugin}" ]; then echo -e "${lightblue}dbplugin:\t${default}${dbplugin}" fi # ASE (Multi Theft Auto) - if [ "${ase}" ]; then + if [ -n "${ase}" ]; then echo -e "${lightblue}ASE:\t${default}${ase}" fi # Save interval (Rust) - if [ "${saveinterval}" ]; then + if [ -n "${saveinterval}" ]; then echo -e "${lightblue}ASE:\t${default}${saveinterval} s" fi # Random map rotation mode (Squad and Post Scriptum) - if [ "${randommap}" ]; then + if [ -n "${randommap}" ]; then echo -e "${lightblue}Map rotation:\t${default}${randommap}" fi # Listed on Master server - if [ "${displaymasterserver}" ]; then + if [ -n "${displaymasterserver}" ]; then if [ "${displaymasterserver}" == "true" ]; then echo -e "${lightblue}Master server:\t${green}${displaymasterserver}${default}" else @@ -416,12 +412,12 @@ fn_info_message_script(){ echo -e "${lightblue}Script name:\t${default}${selfname}" # LinuxGSM version - if [ "${version}" ]; then + if [ -n "${version}" ]; then echo -e "${lightblue}LinuxGSM version:\t${default}${version}" fi # glibc required - if [ "${glibc}" ]; then + if [ -n "${glibc}" ]; then if [ "${glibc}" == "null" ]; then # Glibc is not required. : @@ -451,7 +447,7 @@ fn_info_message_script(){ # Telegram alert echo -e "${lightblue}Telegram alert:\t${default}${telegramalert}" # Update on start - if [ "${updateonstart}" ]; then + if [ -n "${updateonstart}" ]; then echo -e "${lightblue}Update on start:\t${default}${updateonstart}" fi @@ -462,7 +458,7 @@ fn_info_message_script(){ echo -e "${lightblue}Location:\t${default}${rootdir}" # Config file location - if [ "${servercfgfullpath}" ]; then + if [ -n "${servercfgfullpath}" ]; then if [ -f "${servercfgfullpath}" ]; then echo -e "${lightblue}Config file:\t${default}${servercfgfullpath}" elif [ -d "${servercfgfullpath}" ]; then @@ -473,7 +469,7 @@ fn_info_message_script(){ fi # Network config file location (ARMA 3) - if [ "${networkcfgfullpath}" ]; then + if [ -n "${networkcfgfullpath}" ]; then echo -e "${lightblue}Network config file:\t${default}${networkcfgfullpath}" fi } | column -s $'\t' -t @@ -553,7 +549,7 @@ fn_info_message_ports(){ fi done # engines/games that require editing the parms. - local ports_edit_array=( "goldsrc" "Factorio" "Hurtworld" "iw3.0" "ioquake3" "qfusion" "Rust" "Soldat" "spark" "source" "starbound" "unreal4" "realvirtuality" "Unturned" ) + local ports_edit_array=( "Avorion" "goldsrc" "Factorio" "Hurtworld" "iw3.0" "ioquake3" "qfusion" "Rust" "Soldat" "spark" "source" "starbound" "unreal4" "realvirtuality" "Unturned" ) for port_edit in "${ports_edit_array[@]}" do if [ "${engine}" == "${port_edit}" ]||[ "${gamename}" == "${port_edit}" ]||[ "${shortname}" == "${port_edit}" ]; then @@ -580,7 +576,7 @@ fn_info_logs(){ echo -e "${selfname} Logs" echo -e "=================================" - if [ "${lgsmlog}" ]; then + if [ -n "${lgsmlog}" ]; then echo -e "\nScript log\n===================" if [ ! "$(ls -A "${lgsmlogdir}")" ]; then echo -e "${lgsmlogdir} (NO LOG FILES)" @@ -593,7 +589,7 @@ fn_info_logs(){ echo -e "" fi - if [ "${consolelog}" ]; then + if [ -n "${consolelog}" ]; then echo -e "\nConsole log\n====================" if [ ! "$(ls -A "${consolelogdir}")" ]; then echo -e "${consolelogdir} (NO LOG FILES)" @@ -606,7 +602,7 @@ fn_info_logs(){ echo -e "" fi - if [ "${gamelogdir}" ]; then + if [ -n "${gamelogdir}" ]; then echo -e "\nServer log\n===================" if [ ! "$(ls -A "${gamelogdir}")" ]; then echo -e "${gamelogdir} (NO LOG FILES)" @@ -646,6 +642,16 @@ fn_info_message_ark(){ } | column -s $'\t' -t } +fn_info_message_avorion() { + echo "netstat -atunp | grep Avorion" + echo -e "" + { + echo -e "DESCRIPTION\tDIRECTION\tPORT\tPROTOCOL" + echo -e "> Game\tINBOUND\t${port}\tudp" + echo -e "> RCON\tINBOUND\t${rconport}\ttcp" + } | column -s $'\t' -t +} + fn_info_message_ballisticoverkill(){ echo -e "netstat -atunp | grep BODS.x86" echo -e "" @@ -1372,6 +1378,8 @@ fn_info_message_select_engine(){ fn_info_message_assettocorsa elif [ "${shortname}" == "ark" ]; then fn_info_message_ark + elif [ "${shortname}" == "av" ]; then + fn_info_message_avorion elif [ "${shortname}" == "arma3" ]; then fn_info_message_arma3 elif [ "${shortname}" == "bo" ]; then diff --git a/tests/tests_defaultcfg/defaultcfg_1.txt b/tests/tests_defaultcfg/defaultcfg_1.txt index 7bd9963c6..505b6b1f0 100644 --- a/tests/tests_defaultcfg/defaultcfg_1.txt +++ b/tests/tests_defaultcfg/defaultcfg_1.txt @@ -40,7 +40,7 @@ # 7: exit # 8: 7 Days to Die # 9: GoldSrc -# 10: Teamspeak 3 +# 10: Avorion ## Game Server Details # Do not edit #### Directories #### From d706ec3b3a519e963c270cf12bdd74badbcbcc7d Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Wed, 22 Apr 2020 22:13:49 +0100 Subject: [PATCH 346/534] remove 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 d2673e27c..02726f197 100644 --- a/lgsm/functions/command_details.sh +++ b/lgsm/functions/command_details.sh @@ -15,7 +15,7 @@ info_config.sh info_parms.sh info_distro.sh info_messages.sh -if [ "${querymode}" == "2" ]|| [ "${querymode}" == "3" ]; then +if [ "${querymode}" == "2" ]||[ "${querymode}" == "3" ]; then query_gamedig.sh fi fn_info_message_distro From 0ff1e428be9e15cbdadeecba1375c467c21f0853 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Thu, 23 Apr 2020 07:49:45 +0100 Subject: [PATCH 347/534] release v20.2.0 --- linuxgsm.sh | 2 +- tests/tests_fctrserver.sh | 2 +- tests/tests_jc2server.sh | 2 +- tests/tests_mcserver.sh | 2 +- tests/tests_ts3server.sh | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/linuxgsm.sh b/linuxgsm.sh index d11617fc3..19ebb01af 100755 --- a/linuxgsm.sh +++ b/linuxgsm.sh @@ -20,7 +20,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="v20.1.5" +version="v20.2.0" shortname="core" gameservername="core" rootdir=$(dirname "$(readlink -f "${BASH_SOURCE[0]}")") diff --git a/tests/tests_fctrserver.sh b/tests/tests_fctrserver.sh index c7bf9192a..235d1bd93 100644 --- a/tests/tests_fctrserver.sh +++ b/tests/tests_fctrserver.sh @@ -20,7 +20,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="v20.1.5" +version="v20.2.0" shortname="fctr" gameservername="fctrserver" rootdir=$(dirname "$(readlink -f "${BASH_SOURCE[0]}")") diff --git a/tests/tests_jc2server.sh b/tests/tests_jc2server.sh index 3f9b49e4a..65e8acaef 100644 --- a/tests/tests_jc2server.sh +++ b/tests/tests_jc2server.sh @@ -20,7 +20,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="v20.1.5" +version="v20.2.0" shortname="jc2" gameservername="jc2server" rootdir=$(dirname "$(readlink -f "${BASH_SOURCE[0]}")") diff --git a/tests/tests_mcserver.sh b/tests/tests_mcserver.sh index 605613c46..1a3f86802 100644 --- a/tests/tests_mcserver.sh +++ b/tests/tests_mcserver.sh @@ -20,7 +20,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="v20.1.5" +version="v20.2.0" shortname="mc" gameservername="mcserver" rootdir=$(dirname "$(readlink -f "${BASH_SOURCE[0]}")") diff --git a/tests/tests_ts3server.sh b/tests/tests_ts3server.sh index a4049a138..01c195ce3 100644 --- a/tests/tests_ts3server.sh +++ b/tests/tests_ts3server.sh @@ -20,7 +20,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="v20.1.5" +version="v20.2.0" shortname="ts3" gameservername="ts3server" rootdir=$(dirname "$(readlink -f "${BASH_SOURCE[0]}")") From b69d8a89173271dd5750b71531e21d6821e6c44f Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Fri, 24 Apr 2020 09:07:23 +0100 Subject: [PATCH 348/534] added missing glibc requirment to Assetto Corsa --- lgsm/config-default/config-lgsm/acserver/_default.cfg | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lgsm/config-default/config-lgsm/acserver/_default.cfg b/lgsm/config-default/config-lgsm/acserver/_default.cfg index b9436fb3f..7bc9de9d1 100644 --- a/lgsm/config-default/config-lgsm/acserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/acserver/_default.cfg @@ -137,7 +137,7 @@ querytype="" # Do not edit gamename="Assetto Corsa" engine="unity3d" -glibc="" +glibc="2.15" #### Directories #### # Edit with care From 57243aae9a9ebf47c82979919646ea2da11ea9b2 Mon Sep 17 00:00:00 2001 From: PwnK <22644348+PwnK@users.noreply.github.com> Date: Sat, 25 Apr 2020 23:01:13 +0300 Subject: [PATCH 349/534] remove appinfo.vdf correctly (#2841) --- lgsm/config-default/config-lgsm/acserver/_default.cfg | 2 +- lgsm/functions/update_steamcmd.sh | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/lgsm/config-default/config-lgsm/acserver/_default.cfg b/lgsm/config-default/config-lgsm/acserver/_default.cfg index b9436fb3f..7bc9de9d1 100644 --- a/lgsm/config-default/config-lgsm/acserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/acserver/_default.cfg @@ -137,7 +137,7 @@ querytype="" # Do not edit gamename="Assetto Corsa" engine="unity3d" -glibc="" +glibc="2.15" #### Directories #### # Edit with care diff --git a/lgsm/functions/update_steamcmd.sh b/lgsm/functions/update_steamcmd.sh index 6ac489042..ed809451a 100644 --- a/lgsm/functions/update_steamcmd.sh +++ b/lgsm/functions/update_steamcmd.sh @@ -48,8 +48,8 @@ fn_update_steamcmd_localbuild(){ localbuild=$(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. - if [ -f "${HOME}/Steam/appcache/appinfo.vdf" ]; then - rm -f "${HOME}/Steam/appcache/appinfo.vdf" + if [ -f "${HOME}/.steam/appcache/appinfo.vdf" ]; then + rm -f "${HOME}/.steam/appcache/appinfo.vdf" fi # Set branch for updateinfo. From 560c4d2dba63f4a8d9ab4eda72f3fcd81468f5cb Mon Sep 17 00:00:00 2001 From: nero82 Date: Mon, 27 Apr 2020 12:36:44 +0200 Subject: [PATCH 350/534] fix(ts3server): improve ts3 ip parsing (#2843) --- 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 2a7391739..452a0620a 100644 --- a/lgsm/functions/info_config.sh +++ b/lgsm/functions/info_config.sh @@ -851,7 +851,7 @@ fn_info_config_teamspeak3(){ queryport=$(grep "query_port" "${servercfgfullpath}" | grep -v "#" | tr -cd '[:digit:]') fileport=$(grep "filetransfer_port" "${servercfgfullpath}" | grep -v "#" | tr -cd '[:digit:]') - ip=$(grep "voice_ip" "${servercfgfullpath}" | sed -e 's/^[ \t]*//g' -e '/^#/d' -e 's/voice_ip//g' | sed 's/,.*//' | tr -d '=\";,:' | sed -e 's/^[ \t]*//' -e 's/[ \t]*$//') + ip=$(grep "voice_ip" "${servercfgfullpath}" | sed -e 's/^[ \t]*//g' -e '/^#/d' -e 's/voice_ip//g' | sed 's/,.*//' | tr -d '=\";,' | sed -e 's/^[ \t]*//' -e 's/[ \t]*$//') ipsetinconfig=1 ipinconfigvar="voice_ip" From bd408a1250487f0a40aa660df5c3ea6c3cb3b14e Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Tue, 28 Apr 2020 21:46:19 +0100 Subject: [PATCH 351/534] fix(debug): correct command not exiting correctly fix(debug): correct command not exiting correctly --- lgsm/functions/command_debug.sh | 19 +++++++++++-------- 1 file changed, 11 insertions(+), 8 deletions(-) diff --git a/lgsm/functions/command_debug.sh b/lgsm/functions/command_debug.sh index 5a681c4a2..9da7ae95c 100644 --- a/lgsm/functions/command_debug.sh +++ b/lgsm/functions/command_debug.sh @@ -14,8 +14,11 @@ fn_lockfile_trap(){ rm -f "${lockdir:?}/${selfname}.lock" # resets terminal. Servers can sometimes mess up the terminal on exit. reset - fn_print_ok_nl "Closing debug" - fn_script_log_pass "Debug closed" + fn_print_dots "Stopping debug" + fn_print_ok_nl "Stopping debug" + fn_script_log_pass "Stopping debug" + # remove trap. + trap - INT core_exit.sh } @@ -85,6 +88,7 @@ fn_print_info_nl "Stopping any running servers" fn_script_log_info "Stopping any running servers" exitbypass=1 command_stop.sh +unset exitbypass fn_print_dots "Starting debug" fn_script_log_info "Starting debug" fn_print_ok_nl "Starting debug" @@ -93,27 +97,26 @@ fn_print_ok_nl "Starting debug" date '+%s' > "${lockdir}/${selfname}.lock" fn_script_log_info "Lockfile generated" fn_script_log_info "${lockdir}/${selfname}.lock" -# trap to remove lockfile on quit. -trap fn_lockfile_trap INT cd "${executabledir}" || exit # Note: do not add double quotes to ${executable} ${parms}. if [ "${engine}" == "source" ]||[ "${engine}" == "goldsrc" ]; then ${executable} ${parms} -debug -elif [ "${engine}" == "realvirtuality" ]; then +elif [ "${shortname}" == "arma3" ]; then # Arma3 requires semicolons in the module list, which need to # be escaped for regular (tmux) loading, but need to be # stripped when loading straight from the console. ${executable} ${parms//\\;/;} elif [ "${engine}" == "quake" ]; then - ${executable} ${parms} -condebug + ${executable} ${parms} -condebug else ${executable} ${parms} fi +fn_lockfile_trap + fn_print_dots "Stopping debug" fn_print_ok_nl "Stopping debug" -# remove trap. -trap - INT +fn_script_log_info "Stopping debug" core_exit.sh From c8848891befbe0f75eabbc21ca47d850aa520655 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Wed, 29 Apr 2020 20:14:37 +0100 Subject: [PATCH 352/534] feat(install): convert non-steamcmd game srvers to use tar.xz (#2851) * converted to xz * added source forts dependencies and merged bf1942 * update zmr dependencies --- lgsm/functions/check_deps.sh | 40 +++++++++----------- lgsm/functions/command_backup.sh | 2 +- lgsm/functions/core_dl.sh | 4 +- lgsm/functions/install_server_files.sh | 52 +++++++++++++------------- 4 files changed, 46 insertions(+), 52 deletions(-) diff --git a/lgsm/functions/check_deps.sh b/lgsm/functions/check_deps.sh index 5c830b048..9c92ffbef 100644 --- a/lgsm/functions/check_deps.sh +++ b/lgsm/functions/check_deps.sh @@ -220,10 +220,10 @@ fn_deps_email(){ } fn_found_missing_deps(){ - if [ "${#array_deps_missing[@]}" != "0" ]; then + if [ "${#array_deps_missing[*]}" != "0" ]; then - fn_print_warning_nl "Missing dependencies: ${red}${array_deps_missing[@]}${default}" - fn_script_log_warn "Missing dependencies: ${array_deps_missing[@]}" + fn_print_warning_nl "Missing dependencies: ${red}${array_deps_missing[*]}${default}" + fn_script_log_warn "Missing dependencies: ${array_deps_missing[*]}" fn_sleep_time if [ "${monostatus}" ]; then fn_install_mono_repo @@ -248,13 +248,13 @@ fn_found_missing_deps(){ sleep 1 echo -en " \r" if [ "$(command -v dpkg-query 2>/dev/null)" ]; then - cmd="echo steamcmd steam/question select \"I AGREE\" | sudo debconf-set-selections; echo steamcmd steam/license note '' | sudo debconf-set-selections; sudo dpkg --add-architecture i386; sudo apt update; sudo apt -y install ${array_deps_missing[@]}" + cmd="echo steamcmd steam/question select \"I AGREE\" | sudo debconf-set-selections; echo steamcmd steam/license note '' | sudo debconf-set-selections; sudo dpkg --add-architecture i386; sudo apt update; sudo apt -y install ${array_deps_missing[*]}" eval "${cmd}" elif [ "$(command -v dnf 2>/dev/null)" ]; then - cmd="sudo dnf -y install ${array_deps_missing[@]}" + cmd="sudo dnf -y install ${array_deps_missing[*]}" eval "${cmd}" elif [ "$(command -v yum 2>/dev/null)" ]; then - cmd="sudo yum -y install ${array_deps_missing[@]}" + cmd="sudo yum -y install ${array_deps_missing[*]}" eval "${cmd}" fi if [ $? != 0 ]; then @@ -264,11 +264,11 @@ fn_found_missing_deps(){ fn_print_warning_nl "Manually install dependencies." fn_script_log_warn "Manually install dependencies." if [ "$(command -v dpkg-query 2>/dev/null)" ]; then - echo -e " sudo dpkg --add-architecture i386; sudo apt update; sudo apt install ${array_deps_missing[@]}" + echo -e " sudo dpkg --add-architecture i386; sudo apt update; sudo apt install ${array_deps_missing[*]}" elif [ "$(command -v dnf 2>/dev/null)" ]; then - echo -e " sudo dnf install ${array_deps_missing[@]}" + echo -e " sudo dnf install ${array_deps_missing[*]}" elif [ "$(command -v yum 2>/dev/null)" ]; then - echo -e " sudo yum install ${array_deps_missing[@]}" + echo -e " sudo yum install ${array_deps_missing[*]}" fi if [ "${steamcmdfail}" ]; then echo -e "" @@ -290,11 +290,11 @@ fn_found_missing_deps(){ fn_script_log_warn "$(whoami) does not have sudo access. Manually install dependencies." echo -e "" if [ "$(command -v dpkg-query 2>/dev/null)" ]; then - echo -e "sudo dpkg --add-architecture i386; sudo apt update; sudo apt install ${array_deps_missing[@]}" + echo -e "sudo dpkg --add-architecture i386; sudo apt update; sudo apt install ${array_deps_missing[*]}" elif [ "$(command -v dnf 2>/dev/null)" ]; then - echo -e "sudo dnf install ${array_deps_missing[@]}" + echo -e "sudo dnf install ${array_deps_missing[*]}" elif [ "$(command -v yum 2>/dev/null)" ]; then - echo -e "sudo yum install ${array_deps_missing[@]}" + echo -e "sudo yum install ${array_deps_missing[*]}" fi if [ "${steamcmdfail}" ]; then echo -e "" @@ -322,7 +322,7 @@ fn_found_missing_deps(){ fn_check_loop(){ # Loop though required depenencies. - for deptocheck in "${array_deps_required[@]}" + for deptocheck in ${array_deps_required[*]} do fn_deps_detector done @@ -368,8 +368,8 @@ fn_deps_build_debian(){ # 7 Days to Die elif [ "${shortname}" == "sdtd" ]; then array_deps_required+=( telnet expect ) - # No More Room in Hell, Counter-Strike: Source, Garry's Mod and Zombie Panic: Source - elif [ "${shortname}" == "nmrih" ]||[ "${shortname}" == "css" ]||[ "${shortname}" == "gmod" ]||[ "${shortname}" == "zps" ]; then + # Battlefield 1942, Counter-Strike: Source, Garry's Mod, No More Room in Hell, Source Forts Classic, Zombie Master Reborn and Zombie Panic: Source + elif [ "${shortname}" == "bf1942" ]||[ "${shortname}" == "css" ]||[ "${shortname}" == "gmod" ]||[ "${shortname}" == "nmrih" ]||[ "${shortname}" == "sfc" ]||[ "${shortname}" == "zmr" ]||[ "${shortname}" == "zps" ]; then if [ "${arch}" == "x86_64" ]; then array_deps_required+=( libtinfo5:i386 ) else @@ -381,9 +381,6 @@ fn_deps_build_debian(){ if [ "${shortname}" == "tf2" ]; then array_deps_required+=( libtcmalloc-minimal4:i386 ) fi - # Battlefield: 1942 - elif [ "${shortname}" == "bf1942" ]; then - array_deps_required+=( libncurses5:i386 ) # Call of Duty & Medal of Honor: Allied Assault elif [ "${shortname}" == "cod" ]||[ "${shortname}" == "coduo" ]||[ "${shortname}" == "cod2" ]||[ "${shortname}" == "mohaa" ]; then array_deps_required+=( libstdc++5:i386 ) @@ -483,8 +480,8 @@ fn_deps_build_redhat(){ # 7 Days to Die elif [ "${shortname}" == "sdtd" ]; then array_deps_required+=( telnet expect ) - # No More Room in Hell, Counter-Strike: Source, Garry's Mod and Zombie Panic: Source - elif [ "${shortname}" == "nmrih" ]||[ "${shortname}" == "css" ]||[ "${shortname}" == "gmod" ]||[ "${shortname}" == "zps" ]; then + # Battlefield 1942, Counter-Strike: Source, Garry's Mod, No More Room in Hell, Source Forts Classic, Zombie Master Reborn and Zombie Panic: Source + elif [ "${shortname}" == "bf1942" ]||[ "${shortname}" == "css" ]||[ "${shortname}" == "gmod" ]||[ "${shortname}" == "nmrih" ]||[ "${shortname}" == "sfc" ]||[ "${shortname}" == "zmr" ]||[ "${shortname}" == "zps" ]; then array_deps_required+=( ncurses-libs.i686 ) # Brainbread 2, Don't Starve Together & Team Fortress 2 elif [ "${shortname}" == "bb2" ]||[ "${shortname}" == "dst" ]||[ "${shortname}" == "tf2" ]; then @@ -492,9 +489,6 @@ fn_deps_build_redhat(){ if [ "${shortname}" == "tf2" ]; then array_deps_required+=( gperftools-libs.i686 ) fi - # Battlefield: 1942 - elif [ "${shortname}" == "bf1942" ]; then - array_deps_required+=( ncurses-libs.i686 ) # Call of Duty & Medal of Honor: Allied Assault elif [ "${shortname}" == "cod" ]||[ "${shortname}" == "coduo" ]||[ "${shortname}" == "cod2" ]||[ "${shortname}" == "mohaa" ]; then array_deps_required+=( compat-libstdc++-33.i686 ) diff --git a/lgsm/functions/command_backup.sh b/lgsm/functions/command_backup.sh index 1f9a2cae7..d4befa46c 100644 --- a/lgsm/functions/command_backup.sh +++ b/lgsm/functions/command_backup.sh @@ -143,7 +143,7 @@ fn_backup_compression(){ if [ ${exitcode} -ne 0 ]; then fn_print_fail_eol fn_script_log_fatal "Backup in progress: FAIL" - echo -e "${tarcmd}" | tee -a "${lgsmlog}" + echo -e "${extractcmd}" | tee -a "${lgsmlog}" fn_print_fail_nl "Starting backup" fn_script_log_fatal "Starting backup" else diff --git a/lgsm/functions/core_dl.sh b/lgsm/functions/core_dl.sh index 244ccb9f9..ff428a909 100644 --- a/lgsm/functions/core_dl.sh +++ b/lgsm/functions/core_dl.sh @@ -77,9 +77,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 "${local_filedir}/${local_filename}" -C "${extractdir}") + extractcmd=$(tar -jxf "${local_filedir}/${local_filename}" -C "${extractdir}") elif [ "${mime}" == "application/x-xz" ]; then - tarcmd=$(tar -xf "${local_filedir}/${local_filename}" -C "${extractdir}") + extractcmd=$(tar -xf "${local_filedir}/${local_filename}" -C "${extractdir}") elif [ "${mime}" == "application/zip" ]; then extractcmd=$(unzip -qo -d "${extractdir}" "${local_filedir}/${local_filename}") fi diff --git a/lgsm/functions/install_server_files.sh b/lgsm/functions/install_server_files.sh index 75aefccc5..8cb203bac 100644 --- a/lgsm/functions/install_server_files.sh +++ b/lgsm/functions/install_server_files.sh @@ -10,59 +10,59 @@ local function_selfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" fn_install_server_files(){ if [ "${shortname}" == "ahl" ]; then - remote_fileurl="http://linuxgsm.download/ActionHalfLife/action_halflife-1.0.tar.bz2"; local_filedir="${tmpdir}"; local_filename="action_halflife-1.0.tar.bz2"; chmodx="nochmodx" run="norun"; force="noforce"; md5="31430e670692b2eeaa0d1217db4dcb73" + remote_fileurl="http://linuxgsm.download/ActionHalfLife/action_halflife-1.0.tar.xz"; local_filedir="${tmpdir}"; local_filename="action_halflife-1.0.tar.xz"; chmodx="nochmodx" run="norun"; force="noforce"; md5="61d7b79fd714888b6d65944fdaafa94a" elif [ "${shortname}" == "bf1942" ]; then - remote_fileurl="http://linuxgsm.download/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" + remote_fileurl="http://linuxgsm.download/BattleField1942/bf1942_lnxded-1.61-hacked-to-1.612.full.tar.xz"; local_filedir="${tmpdir}"; local_filename="bf1942_lnxded-1.61-hacked-to-1.612.full.tar.xz"; chmodx="nochmodx" run="norun"; force="noforce"; md5="4223bf4ed85f5162c24b2cba51249b9e" elif [ "${shortname}" == "bb" ]; then - remote_fileurl="http://linuxgsm.download/BrainBread/brainbread-v1.2-linuxserver.tar.bz2"; local_filedir="${tmpdir}"; local_filename="brainbread-v1.2-linuxserver.tar.bz2"; chmodx="nochmodx" run="norun"; force="noforce"; md5="5c729a7e9eecfa81b71a6a1f7267f0fd" + remote_fileurl="http://linuxgsm.download/BrainBread/brainbread-v1.2-linuxserver.tar.xz"; local_filedir="${tmpdir}"; local_filename="brainbread-v1.2-linuxserver.tar.xz"; chmodx="nochmodx" run="norun"; force="noforce"; md5="55f227183b736397806d5b6db6143f15" elif [ "${shortname}" == "cod" ]; then - remote_fileurl="http://linuxgsm.download/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" + remote_fileurl="http://linuxgsm.download/CallOfDuty/cod-lnxded-1.5b-full.tar.xz"; local_filedir="${tmpdir}"; local_filename="cod-lnxded-1.5-large.tar.xz"; chmodx="nochmodx" run="norun"; force="noforce"; md5="ee0ad1ccbfa1fd27fde01a4a431a5c2f" elif [ "${shortname}" == "coduo" ]; then - remote_fileurl="http://linuxgsm.download/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" + remote_fileurl="http://linuxgsm.download/CallOfDutyUnitedOffensive/coduo-lnxded-1.51b-full.tar.xz"; local_filedir="${tmpdir}"; local_filename="coduo-lnxded-1.51b-full.tar.xz"; chmodx="nochmodx" run="norun"; force="noforce"; md5="35cabccd67adcda44aaebc59405915b9" elif [ "${shortname}" == "cod2" ]; then - remote_fileurl="http://linuxgsm.download/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" + remote_fileurl="http://linuxgsm.download/CallOfDuty2/cod2-lnxded-1.3-full.tar.xz"; local_filedir="${tmpdir}"; local_filename="cod2-lnxded-1.3-full.tar.xz"; chmodx="nochmodx" run="norun"; force="noforce"; md5="b8c4c611f01627dd43348e78478a3d41" elif [ "${shortname}" == "cod4" ]; then - remote_fileurl="http://linuxgsm.download/CallOfDuty4/cod4x18_1772_dedrun.tar.bz2"; local_filedir="${tmpdir}"; local_filename="cod4x18_1772_dedrun.tar.bz2"; chmodx="nochmodx" run="norun"; force="noforce"; md5="de29f29d79f9cc24574b838daa501e46" + remote_fileurl="http://linuxgsm.download/CallOfDuty4/cod4x18_1790_lnxded.tar.xz"; local_filedir="${tmpdir}"; local_filename="cod4x18_1790_lnxded.tar.xz"; chmodx="nochmodx" run="norun"; force="noforce"; md5="30609db2afde09d22498fbab3a427d11" elif [ "${shortname}" == "codwaw" ]; then - remote_fileurl="http://linuxgsm.download/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" + remote_fileurl="http://linuxgsm.download/CallOfDutyWorldAtWar/codwaw-lnxded-1.7-full.tar.xz"; local_filedir="${tmpdir}"; local_filename="codwaw-lnxded-1.7-full.tar.xz"; chmodx="nochmodx" run="norun"; force="noforce"; md5="2c6be1bb66ea631b9b2e7ae6216c6680" elif [ "${shortname}" == "etl" ]; then - remote_fileurl="http://linuxgsm.download/WolfensteinEnemyTerritory/etlegacy-v2.75-i386-et-260b.tar.bz2"; local_filedir="${tmpdir}"; local_filename="etlegacy-v2.75-i386-et-260b.tar.bz2"; chmodx="nochmodx" run="norun"; force="noforce"; md5="92d7d4c26e0a295daed78cef623eeabb" + remote_fileurl="http://linuxgsm.download/WolfensteinEnemyTerritory/etlegacy-v2.76-i386-et-260b.tar.xz"; local_filedir="${tmpdir}"; local_filename="etlegacy-v2.75-i386-et-260b.tar.bz2"; chmodx="nochmodx" run="norun"; force="noforce"; md5="178a00233cec1e25b69d130107ce1a79" elif [ "${shortname}" == "ges" ]; then - remote_fileurl="http://linuxgsm.download/GoldenEyeSource/GoldenEye_Source_v5.0.6_full_server.tar.bz2"; local_filedir="${tmpdir}"; local_filename="GoldenEye_Source_v5.0.6_full_server.tar.bz2"; chmodx="nochmodx" run="norun"; force="noforce"; md5="c45c16293096706e8b5e2cd64a6f2931" + remote_fileurl="http://linuxgsm.download/GoldenEyeSource/GoldenEye_Source_v5.0.6_full_server.tar.xz"; local_filedir="${tmpdir}"; local_filename="GoldenEye_Source_v5.0.6_full_server.tar.xz"; chmodx="nochmodx" run="norun"; force="noforce"; md5="e31481f280eed40c9145816bd4f6dc45" elif [ "${shortname}" == "mohaa" ]; then - remote_fileurl="http://linuxgsm.download/MedalofHonorAlliedAssault/moh_revival_v1.12_RC3.5.1.tar.bz2"; local_filedir="${tmpdir}"; local_filename="moh_revival_v1.12_RC3.5.1.tar.bz2"; chmodx="nochmodx" run="norun"; force="noforce"; md5="9d5924486a0cf5e46dd063216aad05c1" + remote_fileurl="http://linuxgsm.download/MedalofHonorAlliedAssault/moh_revival_v1.12_RC3.5.1.tar.xz"; local_filedir="${tmpdir}"; local_filename="moh_revival_v1.12_RC3.5.1.tar.xz"; chmodx="nochmodx" run="norun"; force="noforce"; md5="7c664538999252eeaf2b6d9949416480" elif [ "${shortname}" == "ns" ]; then - remote_fileurl="http://linuxgsm.download/NaturalSelection/ns_dedicated_server_v32.tar.bz2"; local_filedir="${tmpdir}"; local_filename="ns_dedicated_server_v32.tar.bz2"; chmodx="nochmodx" run="norun"; force="noforce"; md5="499cf63324b76925ada6baf5f2eacd67" + remote_fileurl="http://linuxgsm.download/NaturalSelection/ns_dedicated_server_v32.tar.xz"; local_filedir="${tmpdir}"; local_filename="ns_dedicated_server_v32.tar.xz"; chmodx="nochmodx" run="norun"; force="noforce"; md5="23ec3cadd93d8bb1c475bad5b9cce370" elif [ "${shortname}" == "q2" ]; then - remote_fileurl="http://linuxgsm.download/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" + remote_fileurl="http://linuxgsm.download/Quake2/quake2-3.20-glibc-i386-full-linux2.0.tar.xz"; local_filedir="${tmpdir}"; local_filename="quake2-3.20-glibc-i386-full-linux2.0.tar.xz"; chmodx="nochmodx" run="norun"; force="noforce"; md5="2908164a32d4808bb720f2161f6b0c82" elif [ "${shortname}" == "q3" ]; then - remote_fileurl="http://linuxgsm.download/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" + remote_fileurl="http://linuxgsm.download/Quake3/quake3-1.32c-x86-full-linux.tar.xz"; local_filedir="${tmpdir}"; local_filename="quake3-1.32c-x86-full-linux.tar.xz"; chmodx="nochmodx" run="norun"; force="noforce"; md5="b0e26d8919fe9313fb9d8ded2360f3db" elif [ "${shortname}" == "qw" ]; then - remote_fileurl="http://linuxgsm.download/QuakeWorld/nquake.server.linux.190506.full.tar.bz2"; local_filedir="${tmpdir}"; local_filename="nquake.server.linux.190506.full.tar.bz2"; chmodx="nochmodx" run="norun"; force="noforce"; md5="74405ec030463c5e1175e776ab572d32" + remote_fileurl="http://linuxgsm.download/QuakeWorld/nquake.server.linux.190506.full.tar.xz"; local_filedir="${tmpdir}"; local_filename="nquake.server.linux.190506.full.tar.xz"; chmodx="nochmodx" run="norun"; force="noforce"; md5="82055b7d973206c13a606db8ba288d03" elif [ "${shortname}" == "rtcw" ]; then - remote_fileurl="http://linuxgsm.download/ReturnToCastleWolfenstein/iortcw-1.51c-x86_64-server-linux-20190507.tar.bz2"; local_filedir="${tmpdir}"; local_filename="iortcw-1.51c-x86_64-server-linux-20190507.tar.bz2"; chmodx="nochmodx" run="norun"; force="noforce"; md5="6a3be9700372b228d1187422464e4212" + remote_fileurl="http://linuxgsm.download/ReturnToCastleWolfenstein/iortcw-1.51c-x86_64-server-linux-20190507.tar.xz"; local_filedir="${tmpdir}"; local_filename="iortcw-1.51c-x86_64-server-linux-20190507.tar.xz"; chmodx="nochmodx" run="norun"; force="noforce"; md5="df6ff664d37dd0d22787848bdb3cac5f" elif [ "${shortname}" == "sfc" ]; then - remote_fileurl="http://linuxgsm.download/SourceFortsClassic/SFClassic-1.0-RC7-fix.tar.bz2"; local_filedir="${tmpdir}"; local_filename="SFClassic-1.0-RC7-fix.tar.bz2"; chmodx="nochmodx" run="norun"; force="noforce"; md5="e0d4cfd298a8a356053f92b1fa7d1002" + remote_fileurl="http://linuxgsm.download/SourceFortsClassic/SFClassic-1.0-RC7-fix.tar.xz"; local_filedir="${tmpdir}"; local_filename="SFClassic-1.0-RC7-fix.tar.xz"; chmodx="nochmodx" run="norun"; force="noforce"; md5="70077137185700e28fe6bbb6021d12bc" elif [ "${shortname}" == "sof2" ]; then - remote_fileurl="http://linuxgsm.download/SoldierOfFortune2/sof2gold-1.03.tar.bz2"; local_filedir="${tmpdir}"; local_filename="sof2gold-1.03.tar.bz2"; chmodx="nochmodx" run="norun"; force="noforce"; md5="871b1dc0dafeeace65b198119e8fa200" + remote_fileurl="http://linuxgsm.download/SoldierOfFortune2/sof2gold-1.03.tar.xz"; local_filedir="${tmpdir}"; local_filename="sof2gold-1.03.tar.xz"; chmodx="nochmodx" run="norun"; force="noforce"; md5="201e23bab04207d00ce813d001c483d9" elif [ "${shortname}" == "ts" ]; then - remote_fileurl="http://linuxgsm.download/TheSpecialists/ts-3-linux-final.tar.bz2"; local_filedir="${tmpdir}"; local_filename="ts-3-linux-final.tar.bz2"; chmodx="nochmodx" run="norun"; force="noforce"; md5="38e8a8325339f85a7745117802f940b7" + remote_fileurl="http://linuxgsm.download/TheSpecialists/ts-3-linux-final.tar.xz"; local_filedir="${tmpdir}"; local_filename="ts-3-linux-final.tar.xz"; chmodx="nochmodx" run="norun"; force="noforce"; md5="3c66ecff6e3644f7ac88015732a0fb93" elif [ "${shortname}" == "ut2k4" ]; then - remote_fileurl="http://linuxgsm.download/UnrealTournament2004/ut2004-server-3369-2-ultimate-linux.tar.bz2"; local_filedir="${tmpdir}"; local_filename="ut2004-server-3369-2-ultimate-linux.tar.bz2"; chmodx="nochmodx" run="norun"; force="noforce"; md5="67c5e2cd9c2a4b04f163962ee41eff54" + remote_fileurl="http://linuxgsm.download/UnrealTournament2004/ut2004-server-3369-2-ultimate-linux.tar.xz"; local_filedir="${tmpdir}"; local_filename="ut2004-server-3369-2-ultimate-linux.tar.xz"; chmodx="nochmodx" run="norun"; force="noforce"; md5="8ebcb9b8f703905053d13a35c3af3e79" elif [ "${shortname}" == "ut99" ]; then - remote_fileurl="http://linuxgsm.download/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" + remote_fileurl="http://linuxgsm.download/UnrealTournament99/ut99-server-451-ultimate-linux.tar.xz"; local_filedir="${tmpdir}"; local_filename="ut99-server-451-ultimate-linux.tar.xz"; chmodx="nochmodx" run="norun"; force="noforce"; md5="42c6839f8cb95907eeef71a1838aa1f7" elif [ "${shortname}" == "ut" ]; then - remote_fileurl="http://linuxgsm.download/UnrealTournament/UnrealTournament-Server-XAN-3525360-Linux.zip"; local_filedir="${tmpdir}"; local_filename="UnrealTournament-Server-XAN-3525360-Linux.zip"; chmodx="noexecute" run="norun"; force="noforce"; md5="cad730ad6793ba6261f9a341ad7396eb" + remote_fileurl="http://linuxgsm.download/UnrealTournament/UnrealTournament-Server-XAN-3525360-Linux.tar.xz"; local_filedir="${tmpdir}"; local_filename="UnrealTournament-Server-XAN-3525360-Linux.tar.xz"; chmodx="noexecute" run="norun"; force="noforce"; md5="41dd92015713a78211eaccf503b72393" elif [ "${shortname}" == "ut3" ]; then - remote_fileurl="http://linuxgsm.download/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" + remote_fileurl="http://linuxgsm.download/UnrealTournament3/UT3-linux-server-2.1.tar.xz"; local_filedir="${tmpdir}"; local_filename="UT3-linux-server-2.1.tar.xz"; chmodx="nochmodx" run="norun"; force="noforce"; md5="6b92b083c7ab416399e2183a22fda1df" elif [ "${shortname}" == "vs" ]; then - remote_fileurl="http://linuxgsm.download/VampireSlayer/vs_l-6.0_full.tar.bz2"; local_filedir="${tmpdir}"; local_filename="vs_l-6.0_full.tar.bz2"; chmodx="nochmodx" run="norun"; force="noforce"; md5="38a79e44b98578bbdc5b15818493a066" + remote_fileurl="http://linuxgsm.download/VampireSlayer/vs_l-6.0_full.tar.xz"; local_filedir="${tmpdir}"; local_filename="vs_l-6.0_full.tar.xz"; chmodx="nochmodx" run="norun"; force="noforce"; md5="b322f79e0abd31847493c52acf802667" elif [ "${shortname}" == "wet" ]; then - remote_fileurl="http://linuxgsm.download/WolfensteinEnemyTerritory/enemy-territory.260b.tar.bz2"; local_filedir="${tmpdir}"; local_filename="enemy-territory.260b.tar.bz2"; chmodx="nochmodx" run="norun"; force="noforce"; md5="f833f514bfcdd46b42c111f83350c5a7" + remote_fileurl="http://linuxgsm.download/WolfensteinEnemyTerritory/enemy-territory.260b.tar.xz"; local_filedir="${tmpdir}"; local_filename="enemy-territory.260b.tar.xz"; chmodx="nochmodx" run="norun"; force="noforce"; md5="581a333cc7eacda2f56d5a00fe11eafa" elif [ "${shortname}" == "samp" ]; then remote_fileurl="https://files.sa-mp.com/samp037svr_R2-1.tar.gz"; local_filedir="${tmpdir}"; local_filename="samp037svr_R2-1.tar.gz"; chmodx="nochmodx" run="norun"; force="noforce"; md5="93705e165550c97484678236749198a4" elif [ "${shortname}" == "zmr" ]; then - remote_fileurl="http://linuxgsm.download/ZombieMasterReborn/zombie_master_reborn_b5_2.tar.bz2"; local_filedir="${tmpdir}"; local_filename="zombie_master_reborn_b5_2.tar.bz2"; chmodx="nochmodx" run="norun"; force="noforce"; md5="d52ef2db376f5d21e3a4ceca85ec8761" + remote_fileurl="http://linuxgsm.download/ZombieMasterReborn/zombie_master_reborn_b5_2.tar.xz"; local_filedir="${tmpdir}"; local_filename="zombie_master_reborn_b5_2.tar.xz"; chmodx="nochmodx" run="norun"; force="noforce"; md5="4b9b9832e863d03981a40c26065792a6" fi fn_fetch_file "${remote_fileurl}" "${local_filedir}" "${local_filename}" "${chmodx}" "${run}" "${forcedl}" "${md5}" fn_dl_extract "${local_filedir}" "${local_filename}" "${serverfiles}" From 216c29d0e5a68b6de87965571ebf645201faa22b Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Wed, 29 Apr 2020 22:35:11 +0100 Subject: [PATCH 353/534] fix(arkserver): remove all appworkshop_346110.acf if multiple exist (#2852) --- lgsm/functions/command_validate.sh | 2 + lgsm/functions/fix_ark.sh | 78 ++++++++++++++++-------------- 2 files changed, 45 insertions(+), 35 deletions(-) diff --git a/lgsm/functions/command_validate.sh b/lgsm/functions/command_validate.sh index 410d1eb4d..09b7f23b7 100644 --- a/lgsm/functions/command_validate.sh +++ b/lgsm/functions/command_validate.sh @@ -90,3 +90,5 @@ if [ "${status}" != "0" ]; then else fn_validate fi + +core_exit.sh diff --git a/lgsm/functions/fix_ark.sh b/lgsm/functions/fix_ark.sh index b9cc17e9a..67e20d495 100644 --- a/lgsm/functions/fix_ark.sh +++ b/lgsm/functions/fix_ark.sh @@ -4,44 +4,52 @@ # Website: https://linuxgsm.com # Description: Resolves various issues with ARK: Survival Evolved. -# Steam mods directory selecter -# This allows LinxuGSM to select either ~/.steam or ~/Steam. depending on what is being used - -steamappsfile=$(find ${HOME} -name appworkshop_346110.acf) -steamappsdir=$(dirname "${steamappsfile}") -steamappspath=$(cd ${steamappsdir};cd ../;pwd) - -# removes the symlink if exists. -# fixes issue with older versions of LinuxGSM linking to /home/arkserver/steamcmd -if [ -L "${serverfiles}/Engine/Binaries/ThirdParty/SteamCMD/Linux" ]; then - fixname="broken SteamCMD symlink" +# removes mulitple appworkshop_346110.acf if found. +steamappsfilewc=$(find ${HOME} -name appworkshop_346110.acf | wc -l) +if [ "${steamappsfilewc}" -gt "1" ]; then + fixname="multiple appworkshop acf files" fn_fix_msg_start - unlink "${serverfiles:?}/Engine/Binaries/ThirdParty/SteamCMD/Linux" + find ${HOME} -name appworkshop_346110.acf -exec rm -f {} \; fn_fix_msg_end - check_steamcmd.sh -fi +elif [ "${steamappsfilewc}" -eq "1" ]; then + # Steam mods directory selecter + # This allows LinxuGSM to select either ~/.steam or ~/Steam. depending on what is being used + steamappsfile=$(find ${HOME} -name appworkshop_346110.acf) + steamappsdir=$(dirname "${steamappsfile}") + steamappspath=$(cd "${steamappsdir}"|| return; cd ../;pwd) -# removed ARK steamcmd directory if steamcmd is missing. -if [ ! -f "${serverfiles}/Engine/Binaries/ThirdParty/SteamCMD/Linux/steamcmd.sh" ]; then - fixname="remove invalid ARK SteamCMD directory" - fn_fix_msg_start - rm -rf "${serverfiles:?}/Engine/Binaries/ThirdParty/SteamCMD/Linux" - fn_fix_msg_end - check_steamcmd.sh -fi + # removes the symlink if exists. + # fixes issue with older versions of LinuxGSM linking to /home/arkserver/steamcmd + if [ -L "${serverfiles}/Engine/Binaries/ThirdParty/SteamCMD/Linux" ]; then + fixname="broken SteamCMD symlink" + fn_fix_msg_start + unlink "${serverfiles:?}/Engine/Binaries/ThirdParty/SteamCMD/Linux" + fn_fix_msg_end + check_steamcmd.sh + fi -# if the steamapps symlink is incorrect unlink it. -if [ -d "${serverfiles}/Engine/Binaries/ThirdParty/SteamCMD/Linux" ]&&[ -L "${serverfiles}/Engine/Binaries/ThirdParty/SteamCMD/Linux/steamapps" ]&&[ "$(readlink ${serverfiles}/Engine/Binaries/ThirdParty/SteamCMD/Linux/steamapps)" != "${steamappspath}" ]; then - fixname="incorrect steamapps symlink" - fn_fix_msg_start - unlink "${serverfiles:?}/Engine/Binaries/ThirdParty/SteamCMD/Linux/steamapps" - fn_fix_msg_end -fi + # removed ARK steamcmd directory if steamcmd is missing. + if [ ! -f "${serverfiles}/Engine/Binaries/ThirdParty/SteamCMD/Linux/steamcmd.sh" ]; then + fixname="remove invalid ARK SteamCMD directory" + fn_fix_msg_start + rm -rf "${serverfiles:?}/Engine/Binaries/ThirdParty/SteamCMD/Linux" + fn_fix_msg_end + check_steamcmd.sh + fi -# Put symlink to steamapps directory into the ARK SteamCMD directory to link the downloaded mods to the correct location. -if [ ! -L "${serverfiles}/Engine/Binaries/ThirdParty/SteamCMD/Linux/steamapps" ]; then - fixname="steamapps symlink" - fn_fix_msg_start - ln -s "${steamappspath}" "${serverfiles}/Engine/Binaries/ThirdParty/SteamCMD/Linux/steamapps" - fn_fix_msg_end + # if the steamapps symlink is incorrect unlink it. + if [ -d "${serverfiles}/Engine/Binaries/ThirdParty/SteamCMD/Linux" ]&&[ -L "${serverfiles}/Engine/Binaries/ThirdParty/SteamCMD/Linux/steamapps" ]&&[ "$(readlink ${serverfiles}/Engine/Binaries/ThirdParty/SteamCMD/Linux/steamapps)" != "${steamappspath}" ]; then + fixname="incorrect steamapps symlink" + fn_fix_msg_start + unlink "${serverfiles:?}/Engine/Binaries/ThirdParty/SteamCMD/Linux/steamapps" + fn_fix_msg_end + fi + + # Put symlink to steamapps directory into the ARK SteamCMD directory to link the downloaded mods to the correct location. + if [ ! -L "${serverfiles}/Engine/Binaries/ThirdParty/SteamCMD/Linux/steamapps" ]; then + fixname="steamapps symlink" + fn_fix_msg_start + ln -s "${steamappspath}" "${serverfiles}/Engine/Binaries/ThirdParty/SteamCMD/Linux/steamapps" + fn_fix_msg_end + fi fi From 0af223d4367faa39588267cea63134fe566c666f Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Thu, 30 Apr 2020 07:22:44 +0100 Subject: [PATCH 354/534] feat(ut3server): add monitor query and add minor ut3 improvements (#2853) * added ut3 to gsquery * updated details * added gamespy login information * corrected maxplayers --- .../config-lgsm/ut3server/_default.cfg | 15 ++++++++++----- lgsm/functions/info_config.sh | 5 ++++- lgsm/functions/info_parms.sh | 2 -- lgsm/functions/query_gsquery.py | 5 ++++- 4 files changed, 18 insertions(+), 9 deletions(-) diff --git a/lgsm/config-default/config-lgsm/ut3server/_default.cfg b/lgsm/config-default/config-lgsm/ut3server/_default.cfg index 2a2c8a518..b42227859 100644 --- a/lgsm/config-default/config-lgsm/ut3server/_default.cfg +++ b/lgsm/config-default/config-lgsm/ut3server/_default.cfg @@ -14,18 +14,23 @@ port="7777" queryport="6500" defaultmap="VCTF-Suspense" game="UTGameContent.UTVehicleCTFGame_Content" -mutators="" #"UTGame.UTMutator_Instagib,UTGame.UTMutator_LowGrav" +# Example: mutators="UTGame.UTMutator_Instagib,UTGame.UTMutator_LowGrav" +mutators="" isdedicated="true" islanmatch="false" usesstats="false" shouldadvertise="true" pureserver="1" allowjoininprogress="true" +# Required: GameSpy Username and password +# https://docs.linuxgsm.com/game-servers/unreal-tournament-3#server-gamespy-login +gsusername="" +gspassword="" ## Server Start Command | https://docs.linuxgsm.com/configuration/start-parameters#additional-parameters -# Edit with care | List of game types and mutators : https://docs.linuxgsm.com/game-servers/unreal-tournament-3 +# Edit with care | List of game types and mutators: https://docs.linuxgsm.com/game-servers/unreal-tournament-3 fn_parms(){ -parms="server ${defaultmap}?Game=${game}?bIsDedicated=${isdedicated}?bIsLanMatch=${islanmatch}?bUsesStats=${usesstats}?bShouldAdvertise=${shouldadvertise}?PureServer=${pureserver}?bAllowJoinInProgress=${allowjoininprogress}?Mutator=${mutators}?ConfigSubDir=${selfname} -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}?Mutator=${mutators}?ConfigSubDir=${selfname} -login=${gsusername} -password=${gspassword} -port=${port} -queryport=${queryport} -multihome=${ip} -nohomedir -unattended -log=${gamelog}" } #### LinuxGSM Settings #### @@ -130,8 +135,8 @@ stopmode="2" # 3: gamedig # 4: gsquery # 5: tcp -querymode="1" -querytype="" +querymode="2" +querytype="ut3" ## Game Server Details # Do not edit diff --git a/lgsm/functions/info_config.sh b/lgsm/functions/info_config.sh index 452a0620a..75d248ba4 100644 --- a/lgsm/functions/info_config.sh +++ b/lgsm/functions/info_config.sh @@ -1046,13 +1046,16 @@ fn_info_config_unreal3(){ servername="${unavailable}" serverpassword="${unavailable}" adminpassword="${unavailable}" + maxplayers="${unavailable}" webadminenabled="${unavailable}" webadminport="${zero}" webadminuser="${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]*$//') + 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]*$//') + maxplayers=$(grep "MaxPlayers" "${servercfgfullpath}" | grep -v "#" | tr -cd '[:digit:]') webadminenabled=$(grep "bEnabled" "${servercfgdir}/UTWeb.ini" | sed -e 's/^[ \t]*//g' -e '/^#/d' -e 's/bEnabled//g' | tr -d '=\";,:' | sed -e 's/^[ \t]*//' -e 's/[ \t]*$//') webadminport=$(grep "ListenPort" "${servercfgdir}/UTWeb.ini" | grep -v "#" | tr -cd '[:digit:]') webadminuser="Admin" @@ -1062,7 +1065,7 @@ fn_info_config_unreal3(){ servername=${servername:-"NOT SET"} serverpassword=${serverpassword:-"NOT SET"} adminpassword=${adminpassword:-"NOT SET"} - port=${port:-"0"} + maxplayers=${maxplayers:-"NOT SET"} webadminenabled=${webadminenabled:-"NOT SET"} webadminport=${webadminport:-"0"} webadminuser=${webadminuser:-"NOT SET"} diff --git a/lgsm/functions/info_parms.sh b/lgsm/functions/info_parms.sh index 9cb56bb58..870cffd2a 100644 --- a/lgsm/functions/info_parms.sh +++ b/lgsm/functions/info_parms.sh @@ -207,8 +207,6 @@ fn_info_parms_unreal3(){ port=${port:-"0"} queryport=${queryport:-"0"} defaultmap=${defaultmap:-"NOT SET"} - serverpassword=${serverpassword:-"NOT SET"} - adminpassword=${adminpassword:-"NOT SET"} } fn_info_parms_unturned(){ diff --git a/lgsm/functions/query_gsquery.py b/lgsm/functions/query_gsquery.py index fea94dc6b..376f704b7 100644 --- a/lgsm/functions/query_gsquery.py +++ b/lgsm/functions/query_gsquery.py @@ -28,6 +28,7 @@ class gsquery: twquery=['teeworlds'] unrealquery=['protocol-gamespy1','unreal'] unreal2query=['protocol-unreal2','unreal2'] + unreal3query=['ut3','unreal3'] if self.option.engine in sourcequery: self.query_prompt_string = b'\xFF\xFF\xFF\xFFTSource Engine Query\0' elif self.option.engine in idtech2query: @@ -50,6 +51,8 @@ class gsquery: self.query_prompt_string = b'\x5C\x69\x6E\x66\x6F\x5C' elif self.option.engine in unreal2query: self.query_prompt_string = b'\x79\x00\x00\x00\x00' + elif self.option.engine in unreal3query: + self.query_prompt_string = b'\xFE\xFD\x09\x00\x00\x00\x00' self.connected = False self.response = None @@ -119,7 +122,7 @@ if __name__ == '__main__': action='store', dest='engine', default=False, - help='Engine type: protocol-valve protocol-quake3 protocol-quake3 protocol-gamespy1 protocol-unreal2 minecraft minecraftbe jc2mp mumbleping soldat teeworlds' + help='Engine type: protocol-valve protocol-quake3 protocol-quake3 protocol-gamespy1 protocol-unreal2 ut3 minecraft minecraftbe jc2mp mumbleping soldat teeworlds' ) parser.add_option( '-v', '--verbose', From 66bf5e059e96ec8445fa5ee877c525292364b5cb Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Sun, 3 May 2020 00:02:21 +0100 Subject: [PATCH 355/534] feat(log): refactor log handling (#2859) * standardise module identifiers * renamed logs.sh to core_logs.sh * improve stats log * remove local * functionselfname rename --- lgsm/functions/alert.sh | 43 +++++++++--------- lgsm/functions/alert_discord.sh | 4 +- lgsm/functions/alert_email.sh | 4 +- lgsm/functions/alert_ifttt.sh | 4 +- lgsm/functions/alert_mailgun.sh | 4 +- lgsm/functions/alert_pushbullet.sh | 4 +- lgsm/functions/alert_pushover.sh | 4 +- lgsm/functions/alert_slack.sh | 4 +- lgsm/functions/alert_telegram.sh | 4 +- lgsm/functions/check.sh | 44 +++++++++---------- lgsm/functions/check_config.sh | 3 +- lgsm/functions/check_deps.sh | 16 +++---- lgsm/functions/check_executable.sh | 3 +- lgsm/functions/check_glibc.sh | 2 +- lgsm/functions/check_ip.sh | 14 +++--- lgsm/functions/check_last_update.sh | 2 + lgsm/functions/check_logs.sh | 3 +- lgsm/functions/check_permissions.sh | 4 +- lgsm/functions/check_root.sh | 5 +-- lgsm/functions/check_status.sh | 3 +- lgsm/functions/check_steamcmd.sh | 10 ++--- lgsm/functions/check_system_dir.sh | 5 +-- lgsm/functions/check_system_requirements.sh | 3 +- lgsm/functions/check_tmuxception.sh | 2 +- lgsm/functions/command_backup.sh | 6 +-- lgsm/functions/command_console.sh | 6 +-- lgsm/functions/command_debug.sh | 6 +-- lgsm/functions/command_details.sh | 6 +-- lgsm/functions/command_dev_clear_functions.sh | 6 +++ lgsm/functions/command_dev_debug.sh | 6 +-- lgsm/functions/command_dev_detect_deps.sh | 12 ++--- lgsm/functions/command_dev_detect_glibc.sh | 8 ++-- lgsm/functions/command_dev_detect_ldd.sh | 6 +-- lgsm/functions/command_dev_query_raw.sh | 6 +-- lgsm/functions/command_donate.sh | 6 +-- lgsm/functions/command_fastdl.sh | 8 ++-- lgsm/functions/command_install.sh | 6 +-- .../command_install_resources_mta.sh | 6 +-- lgsm/functions/command_mods_install.sh | 6 +-- lgsm/functions/command_mods_remove.sh | 6 +-- lgsm/functions/command_mods_update.sh | 6 +-- lgsm/functions/command_monitor.sh | 23 +++++----- lgsm/functions/command_postdetails.sh | 34 +++++++------- lgsm/functions/command_restart.sh | 6 +-- lgsm/functions/command_start.sh | 8 ++-- lgsm/functions/command_stop.sh | 6 +-- lgsm/functions/command_test_alert.sh | 6 +-- lgsm/functions/command_ts3_server_pass.sh | 6 +-- lgsm/functions/command_update.sh | 8 ++-- lgsm/functions/command_update_functions.sh | 13 ------ lgsm/functions/command_update_linuxgsm.sh | 6 +-- lgsm/functions/command_validate.sh | 6 +-- lgsm/functions/command_wipe.sh | 6 +-- lgsm/functions/compress_unreal2_maps.sh | 5 ++- lgsm/functions/compress_ut99_maps.sh | 5 ++- lgsm/functions/core_dl.sh | 6 +-- lgsm/functions/core_exit.sh | 16 ++++--- lgsm/functions/core_functions.sh | 4 +- lgsm/functions/core_getopt.sh | 2 +- lgsm/functions/core_legacy.sh | 2 + lgsm/functions/{logs.sh => core_logs.sh} | 7 ++- lgsm/functions/core_messages.sh | 26 ++++++----- lgsm/functions/core_trap.sh | 2 + lgsm/functions/fix.sh | 7 ++- lgsm/functions/fix_ark.sh | 2 + lgsm/functions/fix_arma3.sh | 4 +- lgsm/functions/fix_av.sh | 3 +- lgsm/functions/fix_csgo.sh | 4 +- lgsm/functions/fix_dst.sh | 4 +- lgsm/functions/fix_ges.sh | 3 +- lgsm/functions/fix_hw.sh | 2 + lgsm/functions/fix_ins.sh | 5 +-- lgsm/functions/fix_kf.sh | 4 +- lgsm/functions/fix_kf2.sh | 4 +- lgsm/functions/fix_mcb.sh | 3 +- lgsm/functions/fix_mta.sh | 4 +- lgsm/functions/fix_nmrih.sh | 3 +- lgsm/functions/fix_onset.sh | 4 +- lgsm/functions/fix_ro.sh | 4 +- lgsm/functions/fix_rust.sh | 3 +- lgsm/functions/fix_rw.sh | 3 +- lgsm/functions/fix_sdtd.sh | 3 +- lgsm/functions/fix_sfc.sh | 4 +- lgsm/functions/fix_sof2.sh | 4 +- lgsm/functions/fix_ss3.sh | 4 +- lgsm/functions/fix_steamcmd.sh | 4 +- lgsm/functions/fix_terraria.sh | 4 +- lgsm/functions/fix_tf2.sh | 4 +- lgsm/functions/fix_ts3.sh | 4 +- lgsm/functions/fix_tu.sh | 2 + lgsm/functions/fix_unt.sh | 3 +- lgsm/functions/fix_ut.sh | 4 +- lgsm/functions/fix_ut2k4.sh | 4 +- lgsm/functions/fix_ut3.sh | 4 +- lgsm/functions/fix_wurm.sh | 3 +- lgsm/functions/fix_zmr.sh | 4 +- lgsm/functions/info_config.sh | 2 +- lgsm/functions/info_distro.sh | 2 +- lgsm/functions/info_messages.sh | 6 ++- lgsm/functions/info_parms.sh | 2 +- lgsm/functions/install_complete.sh | 4 +- lgsm/functions/install_config.sh | 4 +- lgsm/functions/install_dst_token.sh | 4 +- lgsm/functions/install_eula.sh | 4 +- lgsm/functions/install_factorio_save.sh | 3 +- lgsm/functions/install_gslt.sh | 4 +- lgsm/functions/install_header.sh | 4 +- lgsm/functions/install_logs.sh | 4 +- lgsm/functions/install_mta_resources.sh | 4 +- lgsm/functions/install_retry.sh | 4 +- lgsm/functions/install_server_dir.sh | 4 +- lgsm/functions/install_server_files.sh | 4 +- lgsm/functions/install_squad_license.sh | 4 +- lgsm/functions/install_stats.sh | 4 +- lgsm/functions/install_steamcmd.sh | 3 +- lgsm/functions/install_ts3db.sh | 4 +- lgsm/functions/install_ut2k4_key.sh | 4 +- lgsm/functions/mods_core.sh | 4 +- lgsm/functions/mods_list.sh | 4 +- lgsm/functions/query_gamedig.sh | 2 + lgsm/functions/update_factorio.sh | 4 +- lgsm/functions/update_minecraft.sh | 4 +- lgsm/functions/update_minecraft_bedrock.sh | 4 +- lgsm/functions/update_mta.sh | 4 +- lgsm/functions/update_mumble.sh | 4 +- lgsm/functions/update_steamcmd.sh | 6 +-- lgsm/functions/update_ts3.sh | 4 +- linuxgsm.sh | 1 + 128 files changed, 322 insertions(+), 427 deletions(-) rename lgsm/functions/{logs.sh => core_logs.sh} (95%) diff --git a/lgsm/functions/alert.sh b/lgsm/functions/alert.sh index f76500105..5f8fe156e 100644 --- a/lgsm/functions/alert.sh +++ b/lgsm/functions/alert.sh @@ -4,8 +4,7 @@ # Website: https://linuxgsm.com # Description: Overall function for managing alerts. -local modulename="ALERT" -local commandaction="Alert" +functionselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" fn_alert_log(){ info_distro.sh @@ -100,23 +99,23 @@ fn_alert_log if [ "${postalert}" == "on" ]&&[ -n "${postalert}" ]; then exitbypass=1 command_postdetails.sh -elif [ "${postalert}" != "on" ]&&[ "${function_selfname}" == "command_test_alert.sh" ]; then +elif [ "${postalert}" != "on" ]&&[ "${commandname}" == "TEST-ALERT" ]; then fn_print_warn_nl "More Info not enabled" fn_script_log_warn "More Info alerts not enabled" -elif [ -z "${posttarget}" ]&&[ "${function_selfname}" == "command_test_alert.sh" ]; then +elif [ -z "${posttarget}" ]&&[ "${commandname}" == "TEST-ALERT" ]; then fn_print_error_nl "posttarget not set" fn_script_error "posttarget not set" -elif [ -z "${postdays}" ]&&[ "${function_selfname}" == "command_test_alert.sh" ]; then +elif [ -z "${postdays}" ]&&[ "${commandname}" == "TEST-ALERT" ]; then fn_print_error_nl "postdays not set" fn_script_error "postdays not set" fi if [ "${discordalert}" == "on" ]&&[ -n "${discordalert}" ]; then alert_discord.sh -elif [ "${discordalert}" != "on" ]&&[ "${function_selfname}" == "command_test_alert.sh" ]; then +elif [ "${discordalert}" != "on" ]&&[ "${commandname}" == "TEST-ALERT" ]; then fn_print_warn_nl "Discord alerts not enabled" fn_script_log_warn "Discord alerts not enabled" -elif [ -z "${discordtoken}" ]&&[ "${function_selfname}" == "command_test_alert.sh" ]; then +elif [ -z "${discordtoken}" ]&&[ "${commandname}" == "TEST-ALERT" ]; then fn_print_error_nl "Discord token not set" echo -e "* https://docs.linuxgsm.com/alerts/discord" fn_script_error "Discord token not set" @@ -124,20 +123,20 @@ fi if [ "${emailalert}" == "on" ]&&[ -n "${email}" ]; then alert_email.sh -elif [ "${emailalert}" != "on" ]&&[ "${function_selfname}" == "command_test_alert.sh" ]; then +elif [ "${emailalert}" != "on" ]&&[ "${commandname}" == "TEST-ALERT" ]; then fn_print_warn_nl "Email alerts not enabled" fn_script_log_warn "Email alerts not enabled" -elif [ -z "${email}" ]&&[ "${function_selfname}" == "command_test_alert.sh" ]; then +elif [ -z "${email}" ]&&[ "${commandname}" == "TEST-ALERT" ]; then fn_print_error_nl "Email not set" fn_script_log_error "Email not set" fi if [ "${iftttalert}" == "on" ]&&[ -n "${iftttalert}" ]; then alert_ifttt.sh -elif [ "${iftttalert}" != "on" ]&&[ "${function_selfname}" == "command_test_alert.sh" ]; then +elif [ "${iftttalert}" != "on" ]&&[ "${commandname}" == "TEST-ALERT" ]; then fn_print_warn_nl "IFTTT alerts not enabled" fn_script_log_warn "IFTTT alerts not enabled" -elif [ -z "${ifttttoken}" ]&&[ "${function_selfname}" == "command_test_alert.sh" ]; then +elif [ -z "${ifttttoken}" ]&&[ "${commandname}" == "TEST-ALERT" ]; then fn_print_error_nl "IFTTT token not set" echo -e "* https://docs.linuxgsm.com/alerts/ifttt" fn_script_error "IFTTT token not set" @@ -145,10 +144,10 @@ fi if [ "${mailgunalert}" == "on" ]&&[ -n "${mailgunalert}" ]; then alert_mailgun.sh -elif [ "${mailgunalert}" != "on" ]&&[ "${function_selfname}" == "command_test_alert.sh" ]; then +elif [ "${mailgunalert}" != "on" ]&&[ "${commandname}" == "TEST-ALERT" ]; then fn_print_warn_nl "Mailgun alerts not enabled" fn_script_log_warn "Mailgun alerts not enabled" -elif [ -z "${mailguntoken}" ]&&[ "${function_selfname}" == "command_test_alert.sh" ]; then +elif [ -z "${mailguntoken}" ]&&[ "${commandname}" == "TEST-ALERT" ]; then fn_print_error_nl "Mailgun token not set" echo -e "* https://docs.linuxgsm.com/alerts/mailgun" fn_script_error "Mailgun token not set" @@ -156,10 +155,10 @@ fi if [ "${pushbulletalert}" == "on" ]&&[ -n "${pushbullettoken}" ]; then alert_pushbullet.sh -elif [ "${pushbulletalert}" != "on" ]&&[ "${function_selfname}" == "command_test_alert.sh" ]; then +elif [ "${pushbulletalert}" != "on" ]&&[ "${commandname}" == "TEST-ALERT" ]; then fn_print_warn_nl "Pushbullet alerts not enabled" fn_script_log_warn "Pushbullet alerts not enabled" -elif [ -z "${pushbullettoken}" ]&&[ "${function_selfname}" == "command_test_alert.sh" ]; then +elif [ -z "${pushbullettoken}" ]&&[ "${commandname}" == "TEST-ALERT" ]; then fn_print_error_nl "Pushbullet token not set" echo -e "* https://docs.linuxgsm.com/alerts/pushbullet" fn_script_error "Pushbullet token not set" @@ -167,10 +166,10 @@ fi if [ "${pushoveralert}" == "on" ]&&[ -n "${pushoveralert}" ]; then alert_pushover.sh -elif [ "${pushoveralert}" != "on" ]&&[ "${function_selfname}" == "command_test_alert.sh" ]; then +elif [ "${pushoveralert}" != "on" ]&&[ "${commandname}" == "TEST-ALERT" ]; then fn_print_warn_nl "Pushover alerts not enabled" fn_script_log_warn "Pushover alerts not enabled" -elif [ -z "${pushovertoken}" ]&&[ "${function_selfname}" == "command_test_alert.sh" ]; then +elif [ -z "${pushovertoken}" ]&&[ "${commandname}" == "TEST-ALERT" ]; then fn_print_error_nl "Pushover token not set" echo -e "* https://docs.linuxgsm.com/alerts/pushover" fn_script_error "Pushover token not set" @@ -178,14 +177,14 @@ fi if [ "${telegramalert}" == "on" ]&&[ -n "${telegramtoken}" ]; then alert_telegram.sh -elif [ "${telegramalert}" != "on" ]&&[ "${function_selfname}" == "command_test_alert.sh" ]; then +elif [ "${telegramalert}" != "on" ]&&[ "${commandname}" == "TEST-ALERT" ]; then fn_print_warn_nl "Telegram Messages not enabled" fn_script_log_warn "Telegram Messages not enabled" -elif [ -z "${telegramtoken}" ]&&[ "${function_selfname}" == "command_test_alert.sh" ]; then +elif [ -z "${telegramtoken}" ]&&[ "${commandname}" == "TEST-ALERT" ]; then fn_print_error_nl "Telegram token not set." echo -e "* https://docs.linuxgsm.com/alerts/telegram" fn_script_error "Telegram token not set." -elif [ -z "${telegramchatid}" ]&&[ "${function_selfname}" == "command_test_alert.sh" ]; then +elif [ -z "${telegramchatid}" ]&&[ "${commandname}" == "TEST-ALERT" ]; then fn_print_error_nl "Telegram chat id not set." echo -e "* https://docs.linuxgsm.com/alerts/telegram" fn_script_error "Telegram chat id not set." @@ -193,10 +192,10 @@ fi if [ "${slackalert}" == "on" ]&&[ -n "${slackalert}" ]; then alert_slack.sh -elif [ "${slackalert}" != "on" ]&&[ "${function_selfname}" == "command_test_alert.sh" ]; then +elif [ "${slackalert}" != "on" ]&&[ "${commandname}" == "TEST-ALERT" ]; then fn_print_warn_nl "Slack alerts not enabled" fn_script_log_warn "Slack alerts not enabled" -elif [ -z "${slacktoken}" ]&&[ "${function_selfname}" == "command_test_alert.sh" ]; then +elif [ -z "${slacktoken}" ]&&[ "${commandname}" == "TEST-ALERT" ]; then fn_print_error_nl "Slack token not set" echo -e "* https://docs.linuxgsm.com/alerts/slack" fn_script_error "Slack token not set" diff --git a/lgsm/functions/alert_discord.sh b/lgsm/functions/alert_discord.sh index c088df281..3ed12fe97 100644 --- a/lgsm/functions/alert_discord.sh +++ b/lgsm/functions/alert_discord.sh @@ -5,9 +5,7 @@ # Website: https://linuxgsm.com # Description: Sends Discord alert. -local modulename="ALERT" -local commandaction="Alert" -local function_selfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" +functionselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" if ! command -v jq > /dev/null; then fn_print_fail_nl "Sending Discord alert: jq is missing." diff --git a/lgsm/functions/alert_email.sh b/lgsm/functions/alert_email.sh index 398ecc3e8..f69f8f408 100644 --- a/lgsm/functions/alert_email.sh +++ b/lgsm/functions/alert_email.sh @@ -4,9 +4,7 @@ # Website: https://linuxgsm.com # Description: Sends email alert. -local modulename="ALERT" -local commandaction="Alert" -local function_selfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" +functionselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" fn_print_dots "Sending Email alert: ${email}" fn_sleep_time diff --git a/lgsm/functions/alert_ifttt.sh b/lgsm/functions/alert_ifttt.sh index 0e983e2dc..376dfed3a 100644 --- a/lgsm/functions/alert_ifttt.sh +++ b/lgsm/functions/alert_ifttt.sh @@ -4,9 +4,7 @@ # Website: https://linuxgsm.com # Description: Sends IFTTT alert. -local modulename="ALERT" -local commandaction="Alert" -local function_selfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" +functionselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" json=$(cat < /dev/null; then fn_print_fail_nl "Sending Slack alert: jq is missing." diff --git a/lgsm/functions/alert_telegram.sh b/lgsm/functions/alert_telegram.sh index 90e2708f3..33662b756 100644 --- a/lgsm/functions/alert_telegram.sh +++ b/lgsm/functions/alert_telegram.sh @@ -4,9 +4,7 @@ # Website: https://bytegaming.de # Description: Sends Telegram Messenger alert. -local modulename="ALERT" -local commandaction="Alert" -local function_selfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" +functionselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" json=$(cat </dev/null | grep -Ecx "^${selfname}") diff --git a/lgsm/functions/check_steamcmd.sh b/lgsm/functions/check_steamcmd.sh index 1c99e282e..b8dbffd87 100644 --- a/lgsm/functions/check_steamcmd.sh +++ b/lgsm/functions/check_steamcmd.sh @@ -4,7 +4,7 @@ # Website: https://linuxgsm.com # Description: Checks if SteamCMD is installed correctly. -local modulename="CHECK" +functionselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" fn_install_steamcmd(){ if [ ${shortname} == "ark" ]&&[ "${installsteamcmd}" == "1" ]; then @@ -50,14 +50,14 @@ fn_check_steamcmd(){ # Checks if SteamCMD exists when starting or updating a server. # Only install if steamcmd package is missing or steamcmd dir is missing. if [ ! -f "${steamcmddir}/steamcmd.sh" ]&&[ -z "$(command -v steamcmd 2>/dev/null)" ]; then - if [ "${function_selfname}" == "command_install.sh" ]; then + if [ "${commandname}" == "INSTALL" ]; then fn_install_steamcmd else fn_print_warn_nl "SteamCMD is missing" fn_script_log_warn "SteamCMD is missing" fn_install_steamcmd fi - elif [ "${function_selfname}" == "command_install.sh" ]; then + elif [ "${commandname}" == "INSTALL" ]; then fn_print_information "SteamCMD is already installed..." fn_print_ok_eol_nl fi @@ -110,14 +110,14 @@ fn_check_steamcmd_ark(){ # to allow ark mods to work if [ ! -f "${serverfiles}/Engine/Binaries/ThirdParty/SteamCMD/Linux/steamcmd.sh" ]; then installsteamcmd=1 - if [ "${function_selfname}" == "command_install.sh" ]; then + if [ "${commandname}" == "INSTALL" ]; then fn_install_steamcmd else fn_print_warn_nl "ARK mods SteamCMD is missing" fn_script_log_warn "ARK mods SteamCMD is missing" fn_install_steamcmd fi - elif [ "${function_selfname}" == "command_install.sh" ]; then + elif [ "${commandname}" == "INSTALL" ]; then fn_print_information "ARK mods SteamCMD is already installed..." fn_print_ok_eol_nl fi diff --git a/lgsm/functions/check_system_dir.sh b/lgsm/functions/check_system_dir.sh index 9a4863a5a..ce7ff5ba5 100644 --- a/lgsm/functions/check_system_dir.sh +++ b/lgsm/functions/check_system_dir.sh @@ -4,10 +4,9 @@ # Website: https://linuxgsm.com # Description: Checks if systemdir/serverfiles is accessible. -local modulename="CHECK" -local function_selfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" +functionselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" -if [ "${function_selfname}" != "command_validate.sh" ]; then +if [ "${commandname}" != "VALIDATE" ]; then checkdir="${serverfiles}" else checkdir="${systemdir}" diff --git a/lgsm/functions/check_system_requirements.sh b/lgsm/functions/check_system_requirements.sh index 139b2b6af..8b7db5a3c 100644 --- a/lgsm/functions/check_system_requirements.sh +++ b/lgsm/functions/check_system_requirements.sh @@ -5,8 +5,7 @@ # Website: https://linuxgsm.com # Description: Checks RAM requirements -local modulename="CHECK" -local function_selfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" +functionselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" info_distro.sh diff --git a/lgsm/functions/check_tmuxception.sh b/lgsm/functions/check_tmuxception.sh index 06cb40de1..4f5fd2e29 100644 --- a/lgsm/functions/check_tmuxception.sh +++ b/lgsm/functions/check_tmuxception.sh @@ -5,7 +5,7 @@ # Website: https://linuxgsm.com # Description: Checks if run from tmux or screen -local modulename="CHECK" +functionselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" fn_check_is_in_tmux(){ if [ "${TMUX}" ]; then diff --git a/lgsm/functions/command_backup.sh b/lgsm/functions/command_backup.sh index d4befa46c..7666156d4 100644 --- a/lgsm/functions/command_backup.sh +++ b/lgsm/functions/command_backup.sh @@ -5,9 +5,9 @@ # Website: https://linuxgsm.com # Description: Creates a .tar.gz file in the backup directory. -local modulename="BACKUP" -local commandaction="Backup" -local function_selfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" +commandname="BACKUP" +commandaction="Backing up" +functionselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" check.sh diff --git a/lgsm/functions/command_console.sh b/lgsm/functions/command_console.sh index 16578600c..c3e3257be 100644 --- a/lgsm/functions/command_console.sh +++ b/lgsm/functions/command_console.sh @@ -4,9 +4,9 @@ # Website: https://linuxgsm.com # Description: Gives access to the server tmux console. -local modulename="CONSOLE" -local commandaction="Console" -local function_selfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" +commandname="CONSOLE" +commandaction="Access console" +functionselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" check.sh fn_print_header diff --git a/lgsm/functions/command_debug.sh b/lgsm/functions/command_debug.sh index 9da7ae95c..5aeb0d5e1 100644 --- a/lgsm/functions/command_debug.sh +++ b/lgsm/functions/command_debug.sh @@ -4,9 +4,9 @@ # Website: https://linuxgsm.com # Description: Runs the server without tmux and directly from the terminal. -local modulename="DEBUG" -local commandaction="Debug" -local function_selfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" +commandname="DEBUG" +commandaction="Debuging" +functionselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" # Trap to remove lockfile on quit. fn_lockfile_trap(){ diff --git a/lgsm/functions/command_details.sh b/lgsm/functions/command_details.sh index 02726f197..c2abc0ba0 100644 --- a/lgsm/functions/command_details.sh +++ b/lgsm/functions/command_details.sh @@ -5,9 +5,9 @@ # Website: https://linuxgsm.com # Description: Displays server information. -local modulename="DETAILS" -local commandaction="Details" -local function_selfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" +commandname="DETAILS" +commandaction="Viewing details" +functionselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" # Run checks and gathers details to display. check.sh diff --git a/lgsm/functions/command_dev_clear_functions.sh b/lgsm/functions/command_dev_clear_functions.sh index 51878a381..0c2faa375 100644 --- a/lgsm/functions/command_dev_clear_functions.sh +++ b/lgsm/functions/command_dev_clear_functions.sh @@ -4,6 +4,10 @@ # Website: https://linuxgsm.com # Description: Deletes the contents of the functions dir. +commandname="DEV-CLEAR-MODULES" +commandaction="Clearing modules" +functionselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" + echo -e "=================================" echo -e "Clear Functions" echo -e "=================================" @@ -11,6 +15,8 @@ echo -e "" if fn_prompt_yn "Do you want to delete all functions?" Y; then rm -rfv "${functionsdir:?}/"* rm -rfv "${configdirdefault:?}/"* + fn_script_log_info "Cleared modules directory" + fn_script_log_info "Cleared default config directory" fi core_exit.sh diff --git a/lgsm/functions/command_dev_debug.sh b/lgsm/functions/command_dev_debug.sh index f17b67fe2..962b01e7f 100644 --- a/lgsm/functions/command_dev_debug.sh +++ b/lgsm/functions/command_dev_debug.sh @@ -4,9 +4,9 @@ # Website: https://linuxgsm.com # Description: Dev only: Enables debugging log to be saved to dev-debug.log. -local modulename="DEV-DEBUG" -local commandaction="Dev Debug" -local function_selfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" +commandname="DEV-DEBUG" +commandaction="Developer debug" +functionselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" if [ -f "${rootdir}/.dev-debug" ]; then rm "${rootdir:?}/.dev-debug" diff --git a/lgsm/functions/command_dev_detect_deps.sh b/lgsm/functions/command_dev_detect_deps.sh index 79770044d..04f37d696 100644 --- a/lgsm/functions/command_dev_detect_deps.sh +++ b/lgsm/functions/command_dev_detect_deps.sh @@ -4,9 +4,9 @@ # Website: https://linuxgsm.com # Description: Detects dependencies the server binary requires. -local modulename="DETECT-DEPS" -local commandaction="Detect Deps" -local function_selfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" +commandname="DEV-DETECT-DEPS" +commandaction="Developer detect deps" +functionselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" echo -e "=================================" echo -e "Dependencies Checker" @@ -40,7 +40,7 @@ touch "${tmpdir}/.depdetect_debian_list" while read -r lib; do echo -e "${lib}" - local libs_array=( libm.so.6 libc.so.6 libtcmalloc_minimal.so.4 libpthread.so.0 libdl.so.2 libnsl.so.1 libgcc_s.so.1 librt.so.1 ld-linux.so.2 libdbus-glib-1.so.2 libgio-2.0.so.0 libglib-2.0.so.0 libGL.so.1 libgobject-2.0.so.0 libnm-glib.so.4 libnm-util.so.2 ) + libs_array=( libm.so.6 libc.so.6 libtcmalloc_minimal.so.4 libpthread.so.0 libdl.so.2 libnsl.so.1 libgcc_s.so.1 librt.so.1 ld-linux.so.2 libdbus-glib-1.so.2 libgio-2.0.so.0 libglib-2.0.so.0 libGL.so.1 libgobject-2.0.so.0 libnm-glib.so.4 libnm-util.so.2 ) for lib_file in "${libs_array[@]}" do if [ "${lib}" == "${lib_file}" ]; then @@ -51,7 +51,7 @@ while read -r lib; do fi done - local libs_array=( libawt.so libjava.so libjli.so libjvm.so libnet.so libnio.so libverify.so ) + libs_array=( libawt.so libjava.so libjli.so libjvm.so libnet.so libnio.so libverify.so ) for lib_file in "${libs_array[@]}" do if [ "${lib}" == "${lib_file}" ]; then @@ -62,7 +62,7 @@ while read -r lib; do fi done - local libs_array=( libtier0.so libtier0_srv.so libvstdlib_srv.so Core.so libvstdlib.so libtier0_s.so Editor.so Engine.so liblua.so libsteam_api.so ld-linux-x86-64.so.2 libPhysX3_x86.so libPhysX3Common_x86.so libPhysX3Cooking_x86.so) + libs_array=( libtier0.so libtier0_srv.so libvstdlib_srv.so Core.so libvstdlib.so libtier0_s.so Editor.so Engine.so liblua.so libsteam_api.so ld-linux-x86-64.so.2 libPhysX3_x86.so libPhysX3Common_x86.so libPhysX3Cooking_x86.so) for lib_file in "${libs_array[@]}" do # Known shared libs what dont requires dependencies. diff --git a/lgsm/functions/command_dev_detect_glibc.sh b/lgsm/functions/command_dev_detect_glibc.sh index 49d7cc55a..2289bb818 100644 --- a/lgsm/functions/command_dev_detect_glibc.sh +++ b/lgsm/functions/command_dev_detect_glibc.sh @@ -5,9 +5,9 @@ # Description: Automatically detects the version of GLIBC that is required. # Can check a file or directory recursively. -local modulename="DETECT-GLIBC" -local commandaction="Detect Glibc" -local function_selfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" +commandname="DEV-DETECT-GLIBC" +commandaction="Developer detect glibc" +functionselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" echo -e "=================================" echo -e "glibc Requirements Checker" @@ -33,7 +33,7 @@ fi echo -e "" -local glibc_check_dir_array=( steamcmddir serverfiles ) +glibc_check_dir_array=( steamcmddir serverfiles ) for glibc_check_var in "${glibc_check_dir_array[@]}" do if [ "${glibc_check_var}" == "serverfiles" ]; then diff --git a/lgsm/functions/command_dev_detect_ldd.sh b/lgsm/functions/command_dev_detect_ldd.sh index 919900de1..850845179 100644 --- a/lgsm/functions/command_dev_detect_ldd.sh +++ b/lgsm/functions/command_dev_detect_ldd.sh @@ -5,9 +5,9 @@ # Description: Automatically detects required deps using ldd. # Can check a file or directory recursively. -local modulename="DETECT-LDD" -local commandaction="Detect LDD" -local function_selfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" +commandname="DEV-DETECT-LDD" +commandaction="Developer detect ldd" +functionselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" echo -e "=================================" echo -e "Shared Object dependencies Checker" diff --git a/lgsm/functions/command_dev_query_raw.sh b/lgsm/functions/command_dev_query_raw.sh index 0f5e5c8e2..cdd539ce9 100644 --- a/lgsm/functions/command_dev_query_raw.sh +++ b/lgsm/functions/command_dev_query_raw.sh @@ -4,9 +4,9 @@ # Website: https://linuxgsm.com # Description: Raw gamedig output of the server. -local modulename="QUERY-RAW" -local commandaction="Query Raw" -local function_selfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" +commandname="DEV-QUERY-RAW" +commandaction="Developer query raw" +functionselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" check.sh info_config.sh diff --git a/lgsm/functions/command_donate.sh b/lgsm/functions/command_donate.sh index 726ac1b60..9bb7f2faf 100644 --- a/lgsm/functions/command_donate.sh +++ b/lgsm/functions/command_donate.sh @@ -4,9 +4,9 @@ # Website: https://linuxgsm.com # Description: Shows ways to donate. -local modulename="CONSOLE" -local commandaction="Console" -local function_selfname=$(basename "$(readlink -f "${BASH_SOURCE[0]}")") +commandname="DONATE" +commandaction="Donate" +functionselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" fn_print_ascii_logo echo -e "${lightyellow}Support LinuxGSM${default}" diff --git a/lgsm/functions/command_fastdl.sh b/lgsm/functions/command_fastdl.sh index 4e0007fd8..335d02d9d 100644 --- a/lgsm/functions/command_fastdl.sh +++ b/lgsm/functions/command_fastdl.sh @@ -5,9 +5,9 @@ # Website: https://linuxgsm.com # Description: Creates a FastDL directory. -local modulename="FASTDL" -local commandaction="FastDL" -local function_selfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" +commandname="FASTDL" +commandaction="Fastdl" +functionselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" check.sh @@ -135,7 +135,7 @@ fn_human_readable_file_size(){ local factor="${item%:*}" local abbrev="${item#*:}" if [[ "${bytes}" -ge "${factor}" ]]; then - local size=$(bc -l <<< "${bytes} / ${factor}") + size=$(bc -l <<< "${bytes} / ${factor}") printf "%.*f %s\n" "${precision}" "${size}" "${abbrev}" break fi diff --git a/lgsm/functions/command_install.sh b/lgsm/functions/command_install.sh index 65b22de70..9a6b64e98 100644 --- a/lgsm/functions/command_install.sh +++ b/lgsm/functions/command_install.sh @@ -5,9 +5,9 @@ # Website: https://linuxgsm.com # Description: Overall function for the installer. -local modulename="INSTALL" -local commandaction="Install" -local function_selfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" +commandname="INSTALL" +commandaction="Installing" +functionselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" check.sh if [ "$(whoami)" = "root" ]; then diff --git a/lgsm/functions/command_install_resources_mta.sh b/lgsm/functions/command_install_resources_mta.sh index 3d75824f7..0a9ac7806 100644 --- a/lgsm/functions/command_install_resources_mta.sh +++ b/lgsm/functions/command_install_resources_mta.sh @@ -4,9 +4,9 @@ # Website: https://linuxgsm.com # Description: Installs the default resources for Multi Theft Auto. -local modulename="DEFAULT_RESOURCES" -local commandaction="Default Resources" -local function_selfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" +commandname="DEFAULT-RESOURCES" +commandaction="Default Resources" +functionselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" fn_install_resources(){ echo -e "" diff --git a/lgsm/functions/command_mods_install.sh b/lgsm/functions/command_mods_install.sh index 971db3314..d3c517461 100644 --- a/lgsm/functions/command_mods_install.sh +++ b/lgsm/functions/command_mods_install.sh @@ -5,9 +5,9 @@ # Website: https://linuxgsm.com # Description: List and installs available mods along with mods_list.sh and mods_core.sh. -local modulename="MODS" -local commandaction="addons/mods" -local function_selfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" +commandname="MODS-INSTALL" +commandaction="Installing mods" +functionselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" check.sh mods_core.sh diff --git a/lgsm/functions/command_mods_remove.sh b/lgsm/functions/command_mods_remove.sh index 61289b60e..a8149e07b 100644 --- a/lgsm/functions/command_mods_remove.sh +++ b/lgsm/functions/command_mods_remove.sh @@ -5,9 +5,9 @@ # Website: https://linuxgsm.com # Description: Uninstall mods along with mods_list.sh and mods_core.sh. -local modulename="MODS" -local commandaction="Mods Remove" -local function_selfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" +commandname="MODS-REMOVE" +commandaction="Removing mods" +functionselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" check.sh mods_core.sh diff --git a/lgsm/functions/command_mods_update.sh b/lgsm/functions/command_mods_update.sh index 44ff4d9b4..165b4ea98 100644 --- a/lgsm/functions/command_mods_update.sh +++ b/lgsm/functions/command_mods_update.sh @@ -5,9 +5,9 @@ # Website: https://linuxgsm.com # Description: Updates installed mods along with mods_list.sh and mods_core.sh. -local modulename="MODS" -local commandaction="Mods Update" -local function_selfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" +commandname="MODS-UPDATE" +commandaction="Updating mods" +functionselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" check.sh mods_core.sh diff --git a/lgsm/functions/command_monitor.sh b/lgsm/functions/command_monitor.sh index 98f018cf4..1df51768f 100644 --- a/lgsm/functions/command_monitor.sh +++ b/lgsm/functions/command_monitor.sh @@ -6,9 +6,9 @@ # Description: Monitors server by checking for running processes # then passes to gamedig and gsquery. -local modulename="MONITOR" -local commandaction="Monitor" -local function_selfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" +commandname="MONITOR" +commandaction="Monitoring" +functionselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" fn_monitor_check_lockfile(){ # Monitor does not run it lockfile is not found. @@ -141,11 +141,7 @@ for queryattempt in {1..5}; do fn_script_log_pass "Querying port: ${querymethod}: ${ip}:${queryport} : ${queryattempt}: OK" fn_sleep_time monitorpass=1 - # send LinuxGSM stats if monitor is OK. - if [ "${stats}" == "on" ]||[ "${stats}" == "y" ]; then - info_stats.sh - fi - if [ "${querystatus}" == "0" ]; then + if [ "${querystatus}" == "0" ]; then # Add query data to log. if [ "${gdname}" ]; then fn_script_log_info "Server name: ${gdname}" @@ -154,14 +150,19 @@ for queryattempt in {1..5}; do fn_script_log_info "Players: ${gdplayers}/${gdmaxplayers}" fi if [ "${gdbots}" ]; then - fn_script_log_info "Bots: ${gdbots}" - fi + fn_script_log_info "Bots: ${gdbots}" + fi if [ "${gdmap}" ]; then fn_script_log_info "Map: ${gdmap}" fi if [ "${gdgamemode}" ]; then fn_script_log_info "Game Mode: ${gdgamemode}" fi + + # send LinuxGSM stats if monitor is OK. + if [ "${stats}" == "on" ]||[ "${stats}" == "y" ]; then + info_stats.sh + fi fi core_exit.sh else @@ -239,7 +240,7 @@ fn_monitor_loop(){ monitorflag=1 check.sh -logs.sh +core_logs.sh info_config.sh info_parms.sh diff --git a/lgsm/functions/command_postdetails.sh b/lgsm/functions/command_postdetails.sh index b62cc708a..a0afa2905 100644 --- a/lgsm/functions/command_postdetails.sh +++ b/lgsm/functions/command_postdetails.sh @@ -5,9 +5,9 @@ # Website: https://linuxgsm.com # Description: Strips sensitive information out of Details output -local modulename="POSTDETAILS" -local commandaction="Postdetails" -local function_selfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" +commandname="POST-DETAILS" +commandaction="Posting details" +functionselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" # Set posttarget to the appropriately-defined post destination. @@ -74,14 +74,13 @@ else fn_info_message_ports fn_info_message_select_engine fn_info_message_statusbottom - } | sed -r "s/\x1B\[([0-9]{1,2}(;[0-9]{1,2})?)?[m|K]//g"| tee -a "${postdetailslog}" > /dev/null 2>&1 + } | sed -r "s/\x1B\[([0-9]{1,2}(;[0-9]{1,2})?)?[m|K]//g" | tee -a "${postdetailslog}" > /dev/null 2>&1 fi - +# Pastebin if [ "${posttarget}" == "http://pastebin.com" ] ; then fn_print_dots "pastbin.com for ${postexpire}" # grab the return from 'value' from an initial visit to pastebin. - csrftoken=$(curl -s "${posttarget}" | - sed -n 's/^.*input type="hidden" name="csrf_token_post" value="\(.*\)".*$/\1/p') + csrftoken=$(curl -s "${posttarget}" | sed -n 's/^.*input type="hidden" name="csrf_token_post" value="\(.*\)".*$/\1/p') # # Use the csrftoken to then post the content. # @@ -94,9 +93,9 @@ if [ "${posttarget}" == "http://pastebin.com" ] ; then # Output the resulting link. fn_print_ok_nl "pastbin.com for ${postexpire}" + fn_script_log_pass "pastbin.com for ${postexpire}" pdurl="${posttarget}${link}" - echo -e "" - echo -e " Please share the following url for support: ${pdurl}" +# Hastebin elif [ "${posttarget}" == "https://hastebin.com" ] ; then fn_print_dots "hastebin.com" # hastebin is a bit simpler. If successful, the returned result @@ -104,21 +103,20 @@ elif [ "${posttarget}" == "https://hastebin.com" ] ; then # we need in "key". TODO - error handling. -CedarLUG link=$(curl -H "HTTP_X_REQUESTED_WITH:XMLHttpRequest" -s -d "$(<${postdetailslog})" "${posttarget}/documents" | cut -d\" -f4) fn_print_ok_nl "hastebin.com for ${postexpire}" + fn_script_log_pass "hastebin.com for ${postexpire}" pdurl="${posttarget}/${link}" - echo -e "" - echo -e "Please share the following url for support: ${pdurl}" +# Termbin elif [ "${posttarget}" == "https://termbin.com" ] ; then fn_print_dots "termbin.com" link=$(cat "${postdetailslog}" | nc termbin.com 9999 | tr -d '\n\0') - fn_print_ok_nl "termbin.com" + fn_print_ok_nl "termbin.com for 30D" + fn_script_log_pass "termbin.com for 30D" pdurl="${link}" - echo -e "" - echo -e "Please share the following url for support: " - echo -e "${pdurl}" -else - fn_print_warn_nl "Review output in: ${postdetailslog}" - core_exit.sh fi +echo -e "" +echo -e "Please share the following url for support: " +echo -e "${pdurl}" +fn_script_log_info "${pdurl}" if [ -z "${exitbypass}" ]; then core_exit.sh diff --git a/lgsm/functions/command_restart.sh b/lgsm/functions/command_restart.sh index c127d21b4..8a08c04ff 100644 --- a/lgsm/functions/command_restart.sh +++ b/lgsm/functions/command_restart.sh @@ -4,9 +4,9 @@ # Website: https://linuxgsm.com # Description: Restarts the server. -local modulename="RESTART" -local commandaction="Restarting" -local function_selfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" +commandname="MODS-INSTALL" +commandaction="Restarting" +functionselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" info_config.sh exitbypass=1 diff --git a/lgsm/functions/command_start.sh b/lgsm/functions/command_start.sh index d1ee21e42..497ca215a 100644 --- a/lgsm/functions/command_start.sh +++ b/lgsm/functions/command_start.sh @@ -5,9 +5,9 @@ # Website: https://linuxgsm.com # Description: Starts the server. -local modulename="START" -local commandaction="Starting" -local function_selfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" +commandname="START" +commandaction="Starting" +functionselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" fn_start_teamspeak3(){ if [ ! -f "${servercfgfullpath}" ]; then @@ -183,7 +183,7 @@ if [ -z "${fixbypass}" ]; then fix.sh fi info_config.sh -logs.sh +core_logs.sh # Will check for updates is updateonstart is yes. if [ "${updateonstart}" == "yes" ]||[ "${updateonstart}" == "1" ]||[ "${updateonstart}" == "on" ]; then diff --git a/lgsm/functions/command_stop.sh b/lgsm/functions/command_stop.sh index c25714de2..3a27ba8d8 100644 --- a/lgsm/functions/command_stop.sh +++ b/lgsm/functions/command_stop.sh @@ -5,9 +5,9 @@ # Website: https://linuxgsm.com # Description: Stops the server. -local modulename="STOP" -local commandaction="Stopping" -local function_selfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" +commandname="STOP" +commandaction="Stopping" +functionselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" # Attempts graceful shutdown by sending 'CTRL+c'. fn_stop_graceful_ctrlc(){ diff --git a/lgsm/functions/command_test_alert.sh b/lgsm/functions/command_test_alert.sh index b921babe1..5d1c11885 100644 --- a/lgsm/functions/command_test_alert.sh +++ b/lgsm/functions/command_test_alert.sh @@ -4,9 +4,9 @@ # Website: https://linuxgsm.com # Description: Sends a test alert. -local modulename="ALERT" -local commandaction="Alert" -local function_selfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" +commandname="TEST-ALERT" +commandaction="Sending Alert" +functionselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" fn_print_dots "${servername}" check.sh diff --git a/lgsm/functions/command_ts3_server_pass.sh b/lgsm/functions/command_ts3_server_pass.sh index 91d19afeb..8ff799e6e 100644 --- a/lgsm/functions/command_ts3_server_pass.sh +++ b/lgsm/functions/command_ts3_server_pass.sh @@ -5,9 +5,9 @@ # Website: https://linuxgsm.com # Description: Changes TS3 serveradmin password. -local modulename="PASSWORD-CHANGE" -local commandaction="Password Change" -local function_selfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" +commandname="CHANGE-PASSWORD" +commandaction="Changing password" +functionselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" fn_serveradmin_password_prompt(){ fn_print_header diff --git a/lgsm/functions/command_update.sh b/lgsm/functions/command_update.sh index f54423be4..88109a147 100644 --- a/lgsm/functions/command_update.sh +++ b/lgsm/functions/command_update.sh @@ -4,13 +4,13 @@ # Website: https://linuxgsm.com # Description: Handles updating of servers. -local modulename="UPDATE" -local commandaction="Update" -local function_selfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" +commandname="UPDATE" +commandaction="Updating" +functionselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" fn_print_dots "" check.sh -logs.sh +core_logs.sh check_last_update.sh if [ "${shortname}" == "ts3" ]; then diff --git a/lgsm/functions/command_update_functions.sh b/lgsm/functions/command_update_functions.sh index e325b781a..e69de29bb 100644 --- a/lgsm/functions/command_update_functions.sh +++ b/lgsm/functions/command_update_functions.sh @@ -1,13 +0,0 @@ -#!/bin/bash -# LinuxGSM command_update_functions.sh function -# Author: Daniel Gibbs -# Website: https://linuxgsm.com -# Description: Deletes the functions dir to allow re-downloading of functions from GitHub. -# Legacy Command - -command_update_linuxgsm.sh(){ -functionfile="${FUNCNAME[0]}" -fn_fetch_function -} - -command_update_linuxgsm.sh diff --git a/lgsm/functions/command_update_linuxgsm.sh b/lgsm/functions/command_update_linuxgsm.sh index d141c0659..90c2f0446 100644 --- a/lgsm/functions/command_update_linuxgsm.sh +++ b/lgsm/functions/command_update_linuxgsm.sh @@ -4,9 +4,9 @@ # Website: https://linuxgsm.com # Description: Deletes the functions dir to allow re-downloading of functions from GitHub. -local modulename="UPDATE LINUXGSM" -local commandaction="Update LinuxGSM" -local function_selfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" +commandname="UPDATE-LGSM" +commandaction="Updating LinuxGSM" +functionselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" fn_print_dots "Updating LinuxGSM" check.sh diff --git a/lgsm/functions/command_validate.sh b/lgsm/functions/command_validate.sh index 09b7f23b7..5ddf5ffde 100644 --- a/lgsm/functions/command_validate.sh +++ b/lgsm/functions/command_validate.sh @@ -4,9 +4,9 @@ # Website: https://linuxgsm.com # Description: Runs a server validation. -local modulename="VALIDATE" -local commandaction="Validate" -local function_selfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" +commandname="VALIDATE" +commandaction="Validating" +functionselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" fn_validate(){ fn_script_log_warn "Validating server: SteamCMD: Validate might overwrite some customised files" diff --git a/lgsm/functions/command_wipe.sh b/lgsm/functions/command_wipe.sh index 55e636b07..5b5abf552 100644 --- a/lgsm/functions/command_wipe.sh +++ b/lgsm/functions/command_wipe.sh @@ -5,9 +5,9 @@ # Website: https://linuxgsm.com # Description: Wipes server data, useful after updates for some games like Rust -local modulename="WIPE" -local commandaction="Wipe" -local function_selfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" +commandname="WIPE" +commandaction="Wiping" +functionselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" check.sh fn_print_header diff --git a/lgsm/functions/compress_unreal2_maps.sh b/lgsm/functions/compress_unreal2_maps.sh index 99078bfc7..3580c20c9 100644 --- a/lgsm/functions/compress_unreal2_maps.sh +++ b/lgsm/functions/compress_unreal2_maps.sh @@ -4,8 +4,9 @@ # Website: https://linuxgsm.com # Description: Compresses unreal maps. -local commandaction="Unreal Map Compressor" -local function_selfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" +commandname="MAP-COMPRESSOR" +commandaction="Compressing maps" +functionselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" check.sh fn_print_header diff --git a/lgsm/functions/compress_ut99_maps.sh b/lgsm/functions/compress_ut99_maps.sh index 94b3119ab..677f5aaa2 100644 --- a/lgsm/functions/compress_ut99_maps.sh +++ b/lgsm/functions/compress_ut99_maps.sh @@ -4,8 +4,9 @@ # Website: https://linuxgsm.com # Description: Compresses unreal maps. -local commandaction="Unreal Map Compressor" -local function_selfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" +commandname="MAP-COMPRESSOR" +commandaction="Compressing maps" +functionselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" check.sh fn_print_header diff --git a/lgsm/functions/core_dl.sh b/lgsm/functions/core_dl.sh index ff428a909..5294b8a9d 100644 --- a/lgsm/functions/core_dl.sh +++ b/lgsm/functions/core_dl.sh @@ -17,9 +17,7 @@ # 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 modulename="DOWNLOAD" -local commandaction="Download" -local function_selfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" +functionselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" # Emptys contents of the LinuxGSM tmpdir. fn_clear_tmp(){ @@ -42,7 +40,7 @@ fn_dl_md5(){ if [ "${md5}" != "0" ]&&[ "${md5}" != "nomd5" ]; then echo -en "verifying ${local_filename} with MD5..." fn_sleep_time - local md5sumcmd=$(md5sum "${local_filedir}/${local_filename}"|awk '{print $1;}') + md5sumcmd=$(md5sum "${local_filedir}/${local_filename}"|awk '{print $1;}') if [ "${md5sumcmd}" != "${md5}" ]; then fn_print_fail_eol_nl echo -e "${local_filename} returned MD5 checksum: ${md5sumcmd}" diff --git a/lgsm/functions/core_exit.sh b/lgsm/functions/core_exit.sh index 5d242816c..e2b439abd 100644 --- a/lgsm/functions/core_exit.sh +++ b/lgsm/functions/core_exit.sh @@ -4,10 +4,12 @@ # Website: https://linuxgsm.com # Description: Handles exiting of LinuxGSM by running and reporting an exit code. +functionselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" + fn_exit_dev_debug(){ if [ -f "${rootdir}/.dev-debug" ]; then echo -e "" - echo -e "${function_selfname} exiting with code: ${exitcode}" + echo -e "${functionselfname} exiting with code: ${exitcode}" if [ -f "${rootdir}/dev-debug.log" ]; then grep "functionfile=" "${rootdir}/dev-debug.log" | sed 's/functionfile=//g' > "${rootdir}/dev-debug-function-order.log" fi @@ -26,13 +28,13 @@ elif [ "${exitcode}" ]&&[ "${exitcode}" != "0" ]; then # List LinuxGSM version in logs fn_script_log_info "LinuxGSM version: ${version}" if [ "${exitcode}" == "1" ]; then - fn_script_log_fatal "${function_selfname} exiting with code: ${exitcode}" + fn_script_log_fatal "${functionselfname} exiting with code: ${exitcode}" elif [ "${exitcode}" == "2" ]; then - fn_script_log_error "${function_selfname} exiting with code: ${exitcode}" + fn_script_log_error "${functionselfname} exiting with code: ${exitcode}" elif [ "${exitcode}" == "3" ]; then - fn_script_log_warn "${function_selfname} exiting with code: ${exitcode}" + fn_script_log_warn "${functionselfname} exiting with code: ${exitcode}" else - fn_script_log_warn "${function_selfname} exiting with code: ${exitcode}" + fn_script_log_warn "${functionselfname} exiting with code: ${exitcode}" fi fn_exit_dev_debug # remove trap. @@ -41,7 +43,7 @@ elif [ "${exitcode}" ]&&[ "${exitcode}" != "0" ]; then elif [ "${exitcode}" ]&&[ "${exitcode}" == "0" ]; then # List LinuxGSM version in logs fn_script_log_info "LinuxGSM version: ${version}" - fn_script_log_pass "${function_selfname} exiting with code: ${exitcode}" + fn_script_log_pass "${functionselfname} exiting with code: ${exitcode}" fn_exit_dev_debug # remove trap. trap - INT @@ -50,7 +52,7 @@ else # List LinuxGSM version in logs fn_script_log_info "LinuxGSM version: ${version}" fn_print_error "No exit code set" - fn_script_log_pass "${function_selfname} exiting with code: NOT SET" + fn_script_log_pass "${functionselfname} exiting with code: NOT SET" fn_exit_dev_debug # remove trap. trap - INT diff --git a/lgsm/functions/core_functions.sh b/lgsm/functions/core_functions.sh index 29bc46f56..9a7f30e98 100644 --- a/lgsm/functions/core_functions.sh +++ b/lgsm/functions/core_functions.sh @@ -5,6 +5,8 @@ # 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. +functionselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" + # Core core_dl.sh(){ @@ -541,7 +543,7 @@ fn_fetch_function } # Logs -logs.sh(){ +core_logs.sh(){ functionfile="${FUNCNAME[0]}" fn_fetch_function } diff --git a/lgsm/functions/core_getopt.sh b/lgsm/functions/core_getopt.sh index 2eccb56cb..1ddc15ce2 100644 --- a/lgsm/functions/core_getopt.sh +++ b/lgsm/functions/core_getopt.sh @@ -4,7 +4,7 @@ # Website: https://linuxgsm.com # Description: getopt arguments. -local function_selfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" +functionselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" ### Define all commands here. ## User commands | Trigger commands | Description diff --git a/lgsm/functions/core_legacy.sh b/lgsm/functions/core_legacy.sh index e0ea7f9b3..520287ec8 100644 --- a/lgsm/functions/core_legacy.sh +++ b/lgsm/functions/core_legacy.sh @@ -4,6 +4,8 @@ # Website: https://linuxgsm.com # Description: Code for backwards compatability with older versions of LinuxGSM. +functionselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" + if [ -z "${serverfiles}" ]; then legacymode=1 serverfiles="${filesdir}" diff --git a/lgsm/functions/logs.sh b/lgsm/functions/core_logs.sh similarity index 95% rename from lgsm/functions/logs.sh rename to lgsm/functions/core_logs.sh index 001391778..00c4d0662 100644 --- a/lgsm/functions/logs.sh +++ b/lgsm/functions/core_logs.sh @@ -1,12 +1,11 @@ #!/bin/bash -# LinuxGSM logs.sh function +# LinuxGSM core_logs.sh function # Author: Daniel Gibbs # Contributor: UltimateByte # Website: https://linuxgsm.com # Description: Acts as a log rotator, removing old logs. -local modulename="LOGS" -local commandaction="Log-Manager" +functionselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" # Check if logfile variable and file exist, create logfile if it doesn't exist. if [ "${consolelog}" ]; then @@ -17,7 +16,7 @@ fi # For games not displaying a console, and having logs into their game directory. check_status.sh -if [ "${status}" != "0" ]&&[ "${function_selfname}" == "command_start.sh" ]&&[ -n "${gamelogfile}" ]; then +if [ "${status}" != "0" ]&&[ "${commandname}" == "START" ]&&[ -n "${gamelogfile}" ]; then if [ "$(find "${systemdir}" -name "gamelog*.log")" ]; then fn_print_info "Moving game logs to ${gamelogdir}" fn_script_log_info "Moving game logs to ${gamelogdir}" diff --git a/lgsm/functions/core_messages.sh b/lgsm/functions/core_messages.sh index 59814f62f..fd7a4b2e4 100644 --- a/lgsm/functions/core_messages.sh +++ b/lgsm/functions/core_messages.sh @@ -5,6 +5,8 @@ # Website: https://linuxgsm.com # Description: Defines on-screen messages such as [ OK ] and how script logs look. +functionselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" + # nl: new line: message is following by a new line. # eol: end of line: message is placed at the end of the current line. fn_ansi_loader(){ @@ -46,8 +48,8 @@ fn_sleep_time(){ ## Feb 28 14:56:58 ut99-server: Monitor: fn_script_log(){ if [ -d "${lgsmlogdir}" ]; then - if [ "${modulename}" ]; then - echo -e "$(date '+%b %d %H:%M:%S.%3N') ${selfname}: ${modulename}: ${1}" >> "${lgsmlog}" + if [ -n "${commandname}" ]; then + echo -e "$(date '+%b %d %H:%M:%S.%3N') ${selfname}: ${commandname}: ${1}" >> "${lgsmlog}" else echo -e "$(date '+%b %d %H:%M:%S.%3N') ${selfname}: ${1}" >> "${lgsmlog}" fi @@ -58,8 +60,8 @@ fn_script_log(){ fn_script_log_pass(){ if [ -d "${lgsmlogdir}" ]; then - if [ "${modulename}" ]; then - echo -e "$(date '+%b %d %H:%M:%S.%3N') ${selfname}: ${modulename}: PASS: ${1}" >> "${lgsmlog}" + if [ -n "${commandname}" ]; then + echo -e "$(date '+%b %d %H:%M:%S.%3N') ${selfname}: ${commandname}: PASS: ${1}" >> "${lgsmlog}" else echo -e "$(date '+%b %d %H:%M:%S.%3N') ${selfname}: PASS: ${1}" >> "${lgsmlog}" fi @@ -70,8 +72,8 @@ fn_script_log_pass(){ ## Feb 28 14:56:58 ut99-server: Monitor: FATAL: fn_script_log_fatal(){ if [ -d "${lgsmlogdir}" ]; then - if [ "${modulename}" ]; then - echo -e "$(date '+%b %d %H:%M:%S.%3N') ${selfname}: ${modulename}: FATAL: ${1}" >> "${lgsmlog}" + if [ -n "${commandname}" ]; then + echo -e "$(date '+%b %d %H:%M:%S.%3N') ${selfname}: ${commandname}: FATAL: ${1}" >> "${lgsmlog}" else echo -e "$(date '+%b %d %H:%M:%S.%3N') ${selfname}: FATAL: ${1}" >> "${lgsmlog}" fi @@ -82,8 +84,8 @@ fn_script_log_fatal(){ ## Feb 28 14:56:58 ut99-server: Monitor: ERROR: fn_script_log_error(){ if [ -d "${lgsmlogdir}" ]; then - if [ "${modulename}" ]; then - echo -e "$(date '+%b %d %H:%M:%S.%3N') ${selfname}: ${modulename}: ERROR: ${1}" >> "${lgsmlog}" + if [ -n "${commandname}" ]; then + echo -e "$(date '+%b %d %H:%M:%S.%3N') ${selfname}: ${commandname}: ERROR: ${1}" >> "${lgsmlog}" else echo -e "$(date '+%b %d %H:%M:%S.%3N') ${selfname}: ERROR: ${1}" >> "${lgsmlog}" fi @@ -94,8 +96,8 @@ fn_script_log_error(){ ## Feb 28 14:56:58 ut99-server: Monitor: WARN: fn_script_log_warn(){ if [ -d "${lgsmlogdir}" ]; then - if [ "${modulename}" ]; then - echo -e "$(date '+%b %d %H:%M:%S.%3N') ${selfname}: ${modulename}: WARN: ${1}" >> "${lgsmlog}" + if [ -n "${commandname}" ]; then + echo -e "$(date '+%b %d %H:%M:%S.%3N') ${selfname}: ${commandname}: WARN: ${1}" >> "${lgsmlog}" else echo -e "$(date '+%b %d %H:%M:%S.%3N') ${selfname}: WARN: ${1}" >> "${lgsmlog}" fi @@ -106,8 +108,8 @@ fn_script_log_warn(){ ## Feb 28 14:56:58 ut99-server: Monitor: INFO: fn_script_log_info(){ if [ -d "${lgsmlogdir}" ]; then - if [ "${modulename}" ]; then - echo -e "$(date '+%b %d %H:%M:%S.%3N') ${selfname}: ${modulename}: INFO: ${1}" >> "${lgsmlog}" + if [ -n "${commandname}" ]; then + echo -e "$(date '+%b %d %H:%M:%S.%3N') ${selfname}: ${commandname}: INFO: ${1}" >> "${lgsmlog}" else echo -e "$(date '+%b %d %H:%M:%S.%3N') ${selfname}: INFO: ${1}" >> "${lgsmlog}" fi diff --git a/lgsm/functions/core_trap.sh b/lgsm/functions/core_trap.sh index 4c9db3579..f943c5c33 100644 --- a/lgsm/functions/core_trap.sh +++ b/lgsm/functions/core_trap.sh @@ -4,6 +4,8 @@ # Website: https://linuxgsm.com # Description: Handles CTRL-C trap to give an exit code. +functionselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" + fn_exit_trap(){ echo -e "" core_exit.sh diff --git a/lgsm/functions/fix.sh b/lgsm/functions/fix.sh index b5c278847..74523ee5c 100644 --- a/lgsm/functions/fix.sh +++ b/lgsm/functions/fix.sh @@ -5,8 +5,7 @@ # Description: Overall function for managing fixes. # Runs functions that will fix an issue. -local modulename="FIX" -local commandaction="Fix" +functionselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" # Messages that are displayed for some fixes. fn_fix_msg_start(){ @@ -32,7 +31,7 @@ fn_fix_msg_end(){ } # Fixes that are run on start. -if [ "${function_selfname}" != "command_install.sh" ]&&[ -z "${fixbypass}" ]; then +if [ "${commandname}" != "INSTALL" ]&&[ -z "${fixbypass}" ]; then if [ "${appid}" ]; then fix_steamcmd.sh fi @@ -89,7 +88,7 @@ if [ "${function_selfname}" != "command_install.sh" ]&&[ -z "${fixbypass}" ]; th fi # Fixes that are run on install only. -if [ "${function_selfname}" == "command_install.sh" ]; then +if [ "${commandname}" == "INSTALL" ]; then if [ "${shortname}" == "av" ]||[ "${shortname}" == "kf" ]||[ "${shortname}" == "kf2" ]||[ "${shortname}" == "onset" ]||[ "${shortname}" == "ro" ]||[ "${shortname}" == "ut2k4" ]||[ "${shortname}" == "ut" ]||[ "${shortname}" == "ut3" ]; then echo -e "" echo -e "Applying Post-Install Fixes" diff --git a/lgsm/functions/fix_ark.sh b/lgsm/functions/fix_ark.sh index 67e20d495..3c1355b1e 100644 --- a/lgsm/functions/fix_ark.sh +++ b/lgsm/functions/fix_ark.sh @@ -4,6 +4,8 @@ # Website: https://linuxgsm.com # Description: Resolves various issues with ARK: Survival Evolved. +functionselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" + # removes mulitple appworkshop_346110.acf if found. steamappsfilewc=$(find ${HOME} -name appworkshop_346110.acf | wc -l) if [ "${steamappsfilewc}" -gt "1" ]; then diff --git a/lgsm/functions/fix_arma3.sh b/lgsm/functions/fix_arma3.sh index 60dd4db25..f71fcde7b 100644 --- a/lgsm/functions/fix_arma3.sh +++ b/lgsm/functions/fix_arma3.sh @@ -4,9 +4,7 @@ # Website: https://linuxgsm.com # Description: Resolves an issue with ARMA3. -local modulename="FIX" -local commandaction="Fix" -local function_selfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" +functionselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" # Fixes: 20150 Segmentation fault (core dumped) error. if [ ! -d "${XDG_DATA_HOME:="${HOME}/.local/share"}/Arma 3" ]||[ ! -d "${XDG_DATA_HOME:="${HOME}/.local/share"}/Arma 3 - Other Profiles" ]; then diff --git a/lgsm/functions/fix_av.sh b/lgsm/functions/fix_av.sh index fcbab6b13..bf9ff2b4b 100644 --- a/lgsm/functions/fix_av.sh +++ b/lgsm/functions/fix_av.sh @@ -4,8 +4,7 @@ # Website: https://linuxgsm.com # Description: Resolves startup issue with Avorion -local commandname="FIX" -local commandaction="Fix" +functionselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" export LD_LIBRARY_PATH="$LD_LIBRARY_PATH:${serverfiles}:${serverfiles}/linux64" diff --git a/lgsm/functions/fix_csgo.sh b/lgsm/functions/fix_csgo.sh index f1f9c9241..6b213d388 100644 --- a/lgsm/functions/fix_csgo.sh +++ b/lgsm/functions/fix_csgo.sh @@ -4,9 +4,7 @@ # Website: https://linuxgsm.com # Description: Resolves various issues with CS:GO. -local modulename="FIX" -local commandaction="Fix" -local function_selfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" +functionselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" # Fixes: server not always creating steam_appid.txt file. if [ ! -f "${serverfiles}/steam_appid.txt" ]; then diff --git a/lgsm/functions/fix_dst.sh b/lgsm/functions/fix_dst.sh index ca86bdd4f..b203e1cd8 100644 --- a/lgsm/functions/fix_dst.sh +++ b/lgsm/functions/fix_dst.sh @@ -4,9 +4,7 @@ # Website: https://linuxgsm.com # Description: Resolves various issues with Don't Starve Together. -local modulename="FIX" -local commandaction="Fix" -local function_selfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" +functionselfname="$(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. diff --git a/lgsm/functions/fix_ges.sh b/lgsm/functions/fix_ges.sh index bbd08c645..6065f9ba8 100644 --- a/lgsm/functions/fix_ges.sh +++ b/lgsm/functions/fix_ges.sh @@ -4,8 +4,7 @@ # Website: https://linuxgsm.com # Description: Resolves various issues with GoldenEye: Source. -local modulename="FIX" -local commandaction="Fix" +functionselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" # Fixes: MALLOC_CHECK_ needing to be set to 0. export MALLOC_CHECK_=0 diff --git a/lgsm/functions/fix_hw.sh b/lgsm/functions/fix_hw.sh index 8b5844f52..954a834a0 100644 --- a/lgsm/functions/fix_hw.sh +++ b/lgsm/functions/fix_hw.sh @@ -4,6 +4,8 @@ # Website: https://linuxgsm.com # Description: Resolves various issues with Hurtworld. +functionselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" + if [ "${shortname}" == "hw" ]; then # Fixes: [S_API FAIL] SteamAPI_Init() failed; unable to locate a running instance of Steam, or a local steamclient.so. if [ ! -f "${serverfiles}/Hurtworld_Data/Plugins/x86/steamclient.so" ]; then diff --git a/lgsm/functions/fix_ins.sh b/lgsm/functions/fix_ins.sh index 8bd3f310b..f41dffbd4 100644 --- a/lgsm/functions/fix_ins.sh +++ b/lgsm/functions/fix_ins.sh @@ -4,8 +4,7 @@ # Website: https://linuxgsm.com # Description: Resolves various issues with Insurgency. -local modulename="FIX" -local commandaction="Fix" +functionselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" # Fixes: ./srcds_linux: error while loading shared libraries: libtier0.so: cannot open shared object file: No such file or directory. @@ -13,7 +12,7 @@ export LD_LIBRARY_PATH="$LD_LIBRARY_PATH:${serverfiles}:${serverfiles}/bin" # Fixes: issue #529 - gamemode not passed to debug or start. -if [ "${function_selfname}" == "command_debug.sh" ]; then +if [ "${commandname}" == "DEBUG" ]; then defaultmap="\"${defaultmap}\"" else defaultmap="\\\"${defaultmap}\\\"" diff --git a/lgsm/functions/fix_kf.sh b/lgsm/functions/fix_kf.sh index f1b6d7b89..f0c29ee6f 100644 --- a/lgsm/functions/fix_kf.sh +++ b/lgsm/functions/fix_kf.sh @@ -4,9 +4,7 @@ # Website: https://linuxgsm.com # Description: Resolves various issues with Killing Floor. -local modulename="FIX" -local commandaction="Fix" -local function_selfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" +functionselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" echo -e "Applying WebAdmin ROOst.css fix." echo -e "http://forums.tripwireinteractive.com/showpost.php?p=585435&postcount=13" diff --git a/lgsm/functions/fix_kf2.sh b/lgsm/functions/fix_kf2.sh index 2e54f1133..77edd77e8 100644 --- a/lgsm/functions/fix_kf2.sh +++ b/lgsm/functions/fix_kf2.sh @@ -4,9 +4,7 @@ # Website: https://linuxgsm.com # Description: Resolves various issues with Killing Floor 2. -local modulename="FIX" -local commandaction="Fix" -local function_selfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" +functionselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" fn_parms(){ parms="\"${defaultmap}?Game=KFGameContent.KFGameInfo_VersusSurvival\"" diff --git a/lgsm/functions/fix_mcb.sh b/lgsm/functions/fix_mcb.sh index c417a8a39..691647fb7 100644 --- a/lgsm/functions/fix_mcb.sh +++ b/lgsm/functions/fix_mcb.sh @@ -4,8 +4,7 @@ # Website: https://linuxgsm.com # Description: Resolves possible startup issue with Minecraft Bedrock. -local modulename="FIX" -local commandaction="Fix" +functionselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" # official docs state that the server should be started with: LD_LIBRARY_PATH=. ./bedrock_server export LD_LIBRARY_PATH="$LD_LIBRARY_PATH:${serverfiles}" diff --git a/lgsm/functions/fix_mta.sh b/lgsm/functions/fix_mta.sh index 662a1df00..d57e04f3a 100644 --- a/lgsm/functions/fix_mta.sh +++ b/lgsm/functions/fix_mta.sh @@ -5,9 +5,7 @@ # Website: https://linuxgsm.com # Description: Installs the libmysqlclient for database functions on the server. -local modulename="FIX" -local commandaction="Fix" -local function_selfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" +functionselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" if [ ! -f "${lgsmdir}/lib/libmysqlclient.so.16" ]; then fixname="libmysqlclient16" diff --git a/lgsm/functions/fix_nmrih.sh b/lgsm/functions/fix_nmrih.sh index 62ba20c21..2c9d8c743 100644 --- a/lgsm/functions/fix_nmrih.sh +++ b/lgsm/functions/fix_nmrih.sh @@ -4,8 +4,7 @@ # Description: Create symlinks for renamed No More Room In Hell serverfiles. # Solution from Steam Community post: https://steamcommunity.com/app/224260/discussions/2/1732089092441769414/ -local modulename="FIX" -local commandaction="Fix" +functionselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" ln -s "${serverfiles}/bin/vphysics_srv.so" "${serverfiles}/bin/vphysics.so" ln -s "${serverfiles}/bin/studiorender_srv.so" "${serverfiles}/bin/studiorender.so" diff --git a/lgsm/functions/fix_onset.sh b/lgsm/functions/fix_onset.sh index 59f7783ed..630245844 100644 --- a/lgsm/functions/fix_onset.sh +++ b/lgsm/functions/fix_onset.sh @@ -4,9 +4,7 @@ # Website: https://linuxgsm.com # Description: Resolves various issues with Onset. -local modulename="FIX" -local commandaction="Fix" -local function_selfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" +functionselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" export LD_LIBRARY_PATH="$LD_LIBRARY_PATH:${serverfiles}" diff --git a/lgsm/functions/fix_ro.sh b/lgsm/functions/fix_ro.sh index f07581ae2..9f08d56d7 100644 --- a/lgsm/functions/fix_ro.sh +++ b/lgsm/functions/fix_ro.sh @@ -4,9 +4,7 @@ # Website: https://linuxgsm.com # Description: Resolves various issues with Red Orchestra. -local modulename="FIX" -local commandaction="Fix" -local function_selfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" +functionselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" echo -e "Applying WebAdmin ROOst.css fix." echo -e "http://forums.tripwireinteractive.com/showpost.php?p=585435&postcount=13" diff --git a/lgsm/functions/fix_rust.sh b/lgsm/functions/fix_rust.sh index 29f2299c6..9ceff7b29 100644 --- a/lgsm/functions/fix_rust.sh +++ b/lgsm/functions/fix_rust.sh @@ -4,8 +4,7 @@ # Website: https://linuxgsm.com # Description: Resolves startup issue with Rust. -local modulename="FIX" -local commandaction="Fix" +functionselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" # Fixes: [Raknet] Server Shutting Down (Shutting Down). export LD_LIBRARY_PATH="$LD_LIBRARY_PATH:${systemdir}/RustDedicated_Data/Plugins/x86_64" diff --git a/lgsm/functions/fix_rw.sh b/lgsm/functions/fix_rw.sh index 650d3b231..b02ec343e 100644 --- a/lgsm/functions/fix_rw.sh +++ b/lgsm/functions/fix_rw.sh @@ -4,7 +4,6 @@ # Website: https://linuxgsm.com # Description: Resolves various issues with Rising World. -local modulename="FIX" -local commandaction="Fix" +functionselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" export LD_LIBRARY_PATH="$LD_LIBRARY_PATH:${serverfiles}:${serverfiles}/linux64" diff --git a/lgsm/functions/fix_sdtd.sh b/lgsm/functions/fix_sdtd.sh index acb1d9891..91c94897a 100644 --- a/lgsm/functions/fix_sdtd.sh +++ b/lgsm/functions/fix_sdtd.sh @@ -4,7 +4,6 @@ # Website: https://linuxgsm.com # Description: Resolves various issues with 7 Days to Die. -local modulename="FIX" -local commandaction="Fix" +functionselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" export LD_LIBRARY_PATH="$LD_LIBRARY_PATH:${serverfiles}" diff --git a/lgsm/functions/fix_sfc.sh b/lgsm/functions/fix_sfc.sh index f74984753..874d6eca7 100644 --- a/lgsm/functions/fix_sfc.sh +++ b/lgsm/functions/fix_sfc.sh @@ -4,9 +4,7 @@ # Website: https://linuxgsm.com # Description: Resolves various issues with Source Forts Classic. -local modulename="FIX" -local commandaction="Fix" -local function_selfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" +functionselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" if [ ! -f "${serverfiles}/bin/datacache.so" ]; then ln -s "${serverfiles}/bin/datacache_srv.so" "${serverfiles}/bin/datacache.so" diff --git a/lgsm/functions/fix_sof2.sh b/lgsm/functions/fix_sof2.sh index cdffa6c7f..51224c8e0 100644 --- a/lgsm/functions/fix_sof2.sh +++ b/lgsm/functions/fix_sof2.sh @@ -4,8 +4,6 @@ # Website: https://linuxgsm.com # Description: Resolves various issues with Soldier of Fortune 2. -local modulename="FIX" -local commandaction="Fix" - +functionselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" # Fixes: error while loading shared libraries: libcxa.so.1 export LD_LIBRARY_PATH="$LD_LIBRARY_PATH:${serverfiles}" diff --git a/lgsm/functions/fix_ss3.sh b/lgsm/functions/fix_ss3.sh index 1a5b22d7f..6bea53861 100644 --- a/lgsm/functions/fix_ss3.sh +++ b/lgsm/functions/fix_ss3.sh @@ -4,9 +4,7 @@ # Website: https://linuxgsm.com # Description: Resolves various issues with Serious Sam 3. -local modulename="FIX" -local commandaction="Fix" -local function_selfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" +functionselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" # Fixes: https://steamcommunity.com/app/41070/discussions/0/353916981477716386/ if [ ! -f "${serverfiles}/Bin/steamclient.so" ]||[ "$(diff "${HOME}/.steam/steamcmd/linux32/steamclient.so" "${serverfiles}/Bin/steamclient.so" 2>/dev/null)" ]; then diff --git a/lgsm/functions/fix_steamcmd.sh b/lgsm/functions/fix_steamcmd.sh index aba06461c..be5197b9d 100644 --- a/lgsm/functions/fix_steamcmd.sh +++ b/lgsm/functions/fix_steamcmd.sh @@ -4,9 +4,7 @@ # Website: https://linuxgsm.com # Description: Resolves various issues related to SteamCMD. -local modulename="FIX" -local commandaction="Fix" -local function_selfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" +functionselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" # Helps fix: [S_API FAIL] SteamAPI_Init() failed; unable to locate a running instance of Steam,or a local steamclient.so. if [ ! -f "${HOME}/.steam/sdk64/steamclient.so" ]; then diff --git a/lgsm/functions/fix_terraria.sh b/lgsm/functions/fix_terraria.sh index bce7d44f8..712416bd8 100644 --- a/lgsm/functions/fix_terraria.sh +++ b/lgsm/functions/fix_terraria.sh @@ -4,8 +4,6 @@ # Website: https://linuxgsm.com # Description: Resolves an issue with Terraria. -local modulename="FIX" -local commandaction="Fix" -local function_selfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" +functionselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" export TERM=xterm diff --git a/lgsm/functions/fix_tf2.sh b/lgsm/functions/fix_tf2.sh index 72c5b53ab..59b841226 100644 --- a/lgsm/functions/fix_tf2.sh +++ b/lgsm/functions/fix_tf2.sh @@ -4,9 +4,7 @@ # Website: https://github.com/vectorsigma # Description: Resolves various issues with Team Fortress 2. -local modulename="FIX" -local commandaction="Fix" -local function_selfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" +functionselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" # Fixes: Team Fortress 2 Segmentation fault for Red-Hat Distros #2062. if [ -f "/etc/redhat-release" ]&&[ ! -f "${serverfiles}/bin/libcurl-gnutls.so.4" ]; then diff --git a/lgsm/functions/fix_ts3.sh b/lgsm/functions/fix_ts3.sh index 5b4c010c7..b019012f7 100644 --- a/lgsm/functions/fix_ts3.sh +++ b/lgsm/functions/fix_ts3.sh @@ -4,9 +4,7 @@ # Website: https://linuxgsm.com # Description: Resolves various issues with Teamspeak 3. -local modulename="FIX" -local commandaction="Fix" -local function_selfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" +functionselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" # Fixes: makes libmariadb2 available #1924. if [ ! -f "${serverfiles}/libmariadb.so.2" ]; then diff --git a/lgsm/functions/fix_tu.sh b/lgsm/functions/fix_tu.sh index 24bae047a..1f01fd7b3 100644 --- a/lgsm/functions/fix_tu.sh +++ b/lgsm/functions/fix_tu.sh @@ -4,6 +4,8 @@ # Website: https://linuxgsm.com # Description: Resolves various issues with Tower Unite. +functionselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" + if [ "${shortname}" == "tu" ]; 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 diff --git a/lgsm/functions/fix_unt.sh b/lgsm/functions/fix_unt.sh index f55be43a9..60f3d2edf 100644 --- a/lgsm/functions/fix_unt.sh +++ b/lgsm/functions/fix_unt.sh @@ -4,8 +4,7 @@ # Website: https://linuxgsm.com # Description: Resolves startup issue with Unturned. -local modulename="FIX" -local commandaction="Fix" +functionselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" # steamclient.so: cannot open shared object file: No such file or directory export LD_LIBRARY_PATH="$LD_LIBRARY_PATH:${serverfiles}:${serverfiles}/linux64" diff --git a/lgsm/functions/fix_ut.sh b/lgsm/functions/fix_ut.sh index e3e004be4..f9c81348a 100644 --- a/lgsm/functions/fix_ut.sh +++ b/lgsm/functions/fix_ut.sh @@ -4,9 +4,7 @@ # Website: https://linuxgsm.com # Description: Resolves various issues with Unreal Tournament. -local modulename="FIX" -local commandaction="Fix" -local function_selfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" +functionselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" #Set Binary Executable echo -e "chmod +x ${executabledir}/${executable}" diff --git a/lgsm/functions/fix_ut2k4.sh b/lgsm/functions/fix_ut2k4.sh index 8dfb33432..fa2d29bf5 100644 --- a/lgsm/functions/fix_ut2k4.sh +++ b/lgsm/functions/fix_ut2k4.sh @@ -4,9 +4,7 @@ # Website: https://linuxgsm.com # Description: Resolves various issues with Unreal Tournament 2004. -local modulename="FIX" -local commandaction="Fix" -local function_selfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" +functionselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" echo -e "applying WebAdmin ut2003.css fix." echo -e "http://forums.tripwireinteractive.com/showpost.php?p=585435&postcount=13" diff --git a/lgsm/functions/fix_ut3.sh b/lgsm/functions/fix_ut3.sh index 4c099294f..e6c018d00 100644 --- a/lgsm/functions/fix_ut3.sh +++ b/lgsm/functions/fix_ut3.sh @@ -4,9 +4,7 @@ # Website: https://linuxgsm.com # Description: Resolves various issues with Unreal Tournament 3. -local modulename="FIX" -local commandaction="Fix" -local function_selfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" +functionselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" fn_parms(){ parms="server VCTF-Suspense?Game=UTGameContent.UTVehicleCTFGame_Content?bIsDedicated=true?bIsLanMatch=false?bUsesStats=false?bShouldAdvertise=false?PureServer=1?bAllowJoinInProgress=true?ConfigSubDir=${selfname} -port=${port} -queryport=${queryport} -multihome=${ip} -nohomedir -unattended -log=${gamelog}" diff --git a/lgsm/functions/fix_wurm.sh b/lgsm/functions/fix_wurm.sh index 79babb65e..809651d55 100644 --- a/lgsm/functions/fix_wurm.sh +++ b/lgsm/functions/fix_wurm.sh @@ -4,8 +4,7 @@ # Website: https://linuxgsm.com # Description: Resolves various issues with Wurm Unlimited. -local modulename="FIX" -local commandaction="Fix" +functionselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" # Copies steamclient.so to correct location. if [ ! -f "${serverfiles}/nativelibs" ]; then diff --git a/lgsm/functions/fix_zmr.sh b/lgsm/functions/fix_zmr.sh index dade0ee1d..1825fa327 100644 --- a/lgsm/functions/fix_zmr.sh +++ b/lgsm/functions/fix_zmr.sh @@ -4,9 +4,7 @@ # Website: https://linuxgsm.com # Description: Resolves various issues with Zombie Master: Reborn. -local modulename="FIX" -local commandaction="Fix" -local function_selfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" +functionselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" if [ ! -f "${serverfiles}/bin/datacache.so" ]; then ln -s "${serverfiles}/bin/datacache_srv.so" "${serverfiles}/bin/datacache.so" diff --git a/lgsm/functions/info_config.sh b/lgsm/functions/info_config.sh index 75d248ba4..282559deb 100644 --- a/lgsm/functions/info_config.sh +++ b/lgsm/functions/info_config.sh @@ -5,7 +5,7 @@ # Website: https://linuxgsm.com # Description: Gets specific details from config files. -local function_selfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" +functionselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" ## Examples of filtering to get info from config files. # sed 's/foo//g' - remove foo diff --git a/lgsm/functions/info_distro.sh b/lgsm/functions/info_distro.sh index de35150ac..0316e25a3 100644 --- a/lgsm/functions/info_distro.sh +++ b/lgsm/functions/info_distro.sh @@ -5,7 +5,7 @@ # Description: Variables providing useful info on the Operating System such as disk and performace info. # Used for command_details.sh, command_debug.sh and alert.sh. -local function_selfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" +functionselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" ### Game Server pid if [ "${status}" == "1" ]; then diff --git a/lgsm/functions/info_messages.sh b/lgsm/functions/info_messages.sh index 07bbaa7f7..6d46d1b22 100644 --- a/lgsm/functions/info_messages.sh +++ b/lgsm/functions/info_messages.sh @@ -4,6 +4,8 @@ # Website: https://linuxgsm.com # Description: Defines server info messages for details and alerts. +functionselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" + # Standard Details # This applies to all engines @@ -1507,7 +1509,7 @@ fn_info_message_select_engine(){ # Separator is different for details fn_messages_separator(){ - if [ "${function_selfname}" == "command_details.sh" ]; then + if [ "${commandname}" == "details" ]; then printf '%*s\n' "${COLUMNS:-$(tput cols)}" '' | tr ' ' = else echo -e "=================================" @@ -1516,7 +1518,7 @@ fn_messages_separator(){ # Removes the passwords form all but details fn_info_message_password_strip(){ - if [ "${function_selfname}" != "command_details.sh" ]; then + if [ "${commandname}" != "DETAILS" ]; then if [ "${serverpassword}" ]; then serverpassword="********" fi diff --git a/lgsm/functions/info_parms.sh b/lgsm/functions/info_parms.sh index 870cffd2a..1a6a42bb8 100644 --- a/lgsm/functions/info_parms.sh +++ b/lgsm/functions/info_parms.sh @@ -4,7 +4,7 @@ # Website: https://linuxgsm.com # Description: If specific parms are not set then this will be displayed in details. -local function_selfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" +functionselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" ## Examples of filtering to get info from config files # sed 's/foo//g' - remove foo diff --git a/lgsm/functions/install_complete.sh b/lgsm/functions/install_complete.sh index 03beeddd5..62eec08a2 100644 --- a/lgsm/functions/install_complete.sh +++ b/lgsm/functions/install_complete.sh @@ -4,9 +4,7 @@ # Website: https://linuxgsm.com # Description: Prints installation completion message and hints. -local modulename="INSTALL" -local commandaction="Install" -local function_selfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" +functionselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" echo -e "" echo -e "=================================" diff --git a/lgsm/functions/install_config.sh b/lgsm/functions/install_config.sh index 0322be9fb..13558e4da 100644 --- a/lgsm/functions/install_config.sh +++ b/lgsm/functions/install_config.sh @@ -4,9 +4,7 @@ # Website: https://linuxgsm.com # Description: Creates default server configs. -local modulename="INSTALL" -local commandaction="Install" -local function_selfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" +functionselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" # Checks if server cfg dir exists, creates it if it doesn't. fn_check_cfgdir(){ diff --git a/lgsm/functions/install_dst_token.sh b/lgsm/functions/install_dst_token.sh index b1fec01c3..7eab2a153 100644 --- a/lgsm/functions/install_dst_token.sh +++ b/lgsm/functions/install_dst_token.sh @@ -4,9 +4,7 @@ # Website: https://linuxgsm.com # Description: Configures Don't Starve Together cluster with given token. -local modulename="INSTALL" -local commandaction="Install" -local function_selfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" +functionselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" echo -e "" echo -e "${lightyellow}Enter ${gamename} Cluster Token${default}" diff --git a/lgsm/functions/install_eula.sh b/lgsm/functions/install_eula.sh index d7893b16c..cd51954d0 100644 --- a/lgsm/functions/install_eula.sh +++ b/lgsm/functions/install_eula.sh @@ -4,6 +4,8 @@ # Website: https://linuxgsm.com # Description: Gets user to accept the EULA. +functionselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" + if [ "${shortname}" == "ts3" ]; then eulaurl="https://www.teamspeak.com/en/privacy-and-terms" elif [ "${shortname}" == "mc" ]; then @@ -25,7 +27,7 @@ if [ -z "${autoinstall}" ]; then if ! fn_prompt_yn "Continue?" Y; then core_exit.sh fi -elif [ "${function_selfname}" == "command_start.sh" ]; then +elif [ "${commandname}" == "START" ]; then fn_print_info "By continuing you are indicating your agreement to the EULA." echo -e "" sleep 5 diff --git a/lgsm/functions/install_factorio_save.sh b/lgsm/functions/install_factorio_save.sh index 5abdc4069..71690a7a7 100644 --- a/lgsm/functions/install_factorio_save.sh +++ b/lgsm/functions/install_factorio_save.sh @@ -4,8 +4,7 @@ # Website: https://linuxgsm.com # Description: Creates the initial save file for Factorio -local modulename="INSTALL" -local commandaction="Install" +functionselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" echo -e "" echo -e "${lightyellow}Creating initial Factorio savefile${default}" diff --git a/lgsm/functions/install_gslt.sh b/lgsm/functions/install_gslt.sh index ae10508b5..27d384936 100644 --- a/lgsm/functions/install_gslt.sh +++ b/lgsm/functions/install_gslt.sh @@ -4,9 +4,7 @@ # Website: https://linuxgsm.com # Description: Configures GSLT. -local modulename="INSTALL" -local commandaction="Install" -local function_selfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" +functionselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" echo -e "" echo -e "${lightyellow}Game Server Login Token${default}" diff --git a/lgsm/functions/install_header.sh b/lgsm/functions/install_header.sh index 8a63fb289..f67860dd4 100644 --- a/lgsm/functions/install_header.sh +++ b/lgsm/functions/install_header.sh @@ -4,9 +4,7 @@ # Website: https://linuxgsm.com # Description: Prints installation header. -local modulename="INSTALL" -local commandaction="Install" -local function_selfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" +functionselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" clear fn_print_ascii_logo diff --git a/lgsm/functions/install_logs.sh b/lgsm/functions/install_logs.sh index 98057df6f..be54eb42d 100644 --- a/lgsm/functions/install_logs.sh +++ b/lgsm/functions/install_logs.sh @@ -4,9 +4,7 @@ # Website: https://linuxgsm.com # Description: Creates log directories. -local modulename="INSTALL" -local commandaction="Install" -local function_selfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" +functionselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" if [ "${checklogs}" != "1" ]; then echo -e "" diff --git a/lgsm/functions/install_mta_resources.sh b/lgsm/functions/install_mta_resources.sh index 01ceeeb80..194d9f546 100644 --- a/lgsm/functions/install_mta_resources.sh +++ b/lgsm/functions/install_mta_resources.sh @@ -5,9 +5,7 @@ # Website: https://linuxgsm.com # Description: Installs the libmysqlclient for database functions on the server and optionally installs default resources required to run the server -local modulename="INSTALL" -local commandaction="Install" -local function_selfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" +functionselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" fn_print_information_nl "${gamename} will not function without resources!" echo -e " * install default resources using ./${selfname} install-default-resources" diff --git a/lgsm/functions/install_retry.sh b/lgsm/functions/install_retry.sh index 3a65049ce..2d6e3df7b 100644 --- a/lgsm/functions/install_retry.sh +++ b/lgsm/functions/install_retry.sh @@ -4,9 +4,7 @@ # Website: https://linuxgsm.com # Description: Asks for installation retry after failure. -local modulename="INSTALL" -local commandaction="Install" -local function_selfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" +functionselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" if fn_prompt_yn "Retry install?" Y; then command_install.sh; core_exit.sh diff --git a/lgsm/functions/install_server_dir.sh b/lgsm/functions/install_server_dir.sh index 71f2aa4c4..cfd586dc4 100644 --- a/lgsm/functions/install_server_dir.sh +++ b/lgsm/functions/install_server_dir.sh @@ -4,9 +4,7 @@ # Website: https://linuxgsm.com # Description: Creates the server directory. -local modulename="INSTALL" -local commandaction="Install" -local function_selfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" +functionselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" echo -e "" echo -e "${lightyellow}Server Directory${default}" diff --git a/lgsm/functions/install_server_files.sh b/lgsm/functions/install_server_files.sh index 8cb203bac..a3ddd435a 100644 --- a/lgsm/functions/install_server_files.sh +++ b/lgsm/functions/install_server_files.sh @@ -4,9 +4,7 @@ # Website: https://linuxgsm.com # Description: Installs server files. -local modulename="INSTALL" -local commandaction="Install" -local function_selfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" +functionselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" fn_install_server_files(){ if [ "${shortname}" == "ahl" ]; then diff --git a/lgsm/functions/install_squad_license.sh b/lgsm/functions/install_squad_license.sh index accb3021e..b17b1ab7e 100644 --- a/lgsm/functions/install_squad_license.sh +++ b/lgsm/functions/install_squad_license.sh @@ -4,9 +4,7 @@ # Website: https://linuxgsm.com # Description: Configures the Squad server's license. -local modulename="INSTALL" -local commandaction="Install" -local function_selfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" +functionselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" echo -e "" echo -e "${lightyellow}Squad Server License${default}" diff --git a/lgsm/functions/install_stats.sh b/lgsm/functions/install_stats.sh index 2d44706e8..355b7fa67 100644 --- a/lgsm/functions/install_stats.sh +++ b/lgsm/functions/install_stats.sh @@ -4,9 +4,7 @@ # Website: https://linuxgsm.com # Description: Enabled LinuxGSM Stats. -local modulename="INSTALL" -local commandaction="Install" -local function_selfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" +functionselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" echo -e "" echo -e "${lightyellow}LinuxGSM Stats${default}" diff --git a/lgsm/functions/install_steamcmd.sh b/lgsm/functions/install_steamcmd.sh index 9a2415079..40acf435b 100644 --- a/lgsm/functions/install_steamcmd.sh +++ b/lgsm/functions/install_steamcmd.sh @@ -4,8 +4,7 @@ # Website: https://linuxgsm.com # Description: Downloads SteamCMD on install. -local modulename="INSTALL" -local commandaction="Install" +functionselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" echo -e "" echo -e "${lightyellow}Installing SteamCMD${default}" diff --git a/lgsm/functions/install_ts3db.sh b/lgsm/functions/install_ts3db.sh index 7cc448d7b..a77a0ea38 100644 --- a/lgsm/functions/install_ts3db.sh +++ b/lgsm/functions/install_ts3db.sh @@ -5,9 +5,7 @@ # Website: https://linuxgsm.com # Description: Installs the database server MariaDB for TeamSpeak 3. -local modulename="INSTALL" -local commandaction="Install" -local function_selfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" +functionselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" fn_install_ts3db_mariadb(){ if [ ! -f "${serverfiles}/libts3db_mariadb.so" ]; then diff --git a/lgsm/functions/install_ut2k4_key.sh b/lgsm/functions/install_ut2k4_key.sh index cb02829d2..144ac278e 100644 --- a/lgsm/functions/install_ut2k4_key.sh +++ b/lgsm/functions/install_ut2k4_key.sh @@ -4,9 +4,7 @@ # Website: https://linuxgsm.com # Description: Activates ut2k4 server with given key. -local modulename="INSTALL" -local commandaction="Install" -local function_selfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" +functionselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" echo -e "" echo -e "${lightyellow}Enter ${gamename} CD Key${default}" diff --git a/lgsm/functions/mods_core.sh b/lgsm/functions/mods_core.sh index ff088653b..7fc030210 100644 --- a/lgsm/functions/mods_core.sh +++ b/lgsm/functions/mods_core.sh @@ -5,9 +5,7 @@ # Website: https://linuxgsm.com # Description: Core functions for mods list/install/update/remove -local modulename="MODS" -local commandaction="Mods" -local function_selfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" +functionselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" # Files and Directories. modsdir="${lgsmdir}/mods" diff --git a/lgsm/functions/mods_list.sh b/lgsm/functions/mods_list.sh index ed354d153..e47f3f909 100644 --- a/lgsm/functions/mods_list.sh +++ b/lgsm/functions/mods_list.sh @@ -8,9 +8,7 @@ # Usage: Then add this array to the mods_global_array. # Usage: If needed, you can scrape the download URL first. -local modulename="MODS" -local commandaction="List Mods" -local function_selfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" +functionselfname="$(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" diff --git a/lgsm/functions/query_gamedig.sh b/lgsm/functions/query_gamedig.sh index bfe38b937..fca71c57c 100644 --- a/lgsm/functions/query_gamedig.sh +++ b/lgsm/functions/query_gamedig.sh @@ -5,6 +5,8 @@ # Description: Querys a gameserver using node-gamedig. # https://github.com/sonicsnes/node-gamedig +functionselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" + # Check if gamedig and jq are installed. if [ "$(command -v gamedig 2>/dev/null)" ]&&[ "$(command -v jq 2>/dev/null)" ]; then diff --git a/lgsm/functions/update_factorio.sh b/lgsm/functions/update_factorio.sh index 1fcfe9bf9..e45a75c8c 100644 --- a/lgsm/functions/update_factorio.sh +++ b/lgsm/functions/update_factorio.sh @@ -4,9 +4,7 @@ # Website: https://linuxgsm.com # Description: Handles updating of Factorio servers. -local modulename="UPDATE" -local commandaction="Update" -local function_selfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" +functionselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" fn_update_factorio_dl(){ fn_fetch_file "https://factorio.com/get-download/${downloadbranch}/headless/${factorioarch}" "${tmpdir}" "factorio_headless_${factorioarch}-${remotebuild}.tar.xz" diff --git a/lgsm/functions/update_minecraft.sh b/lgsm/functions/update_minecraft.sh index a8f97dd17..d74586143 100644 --- a/lgsm/functions/update_minecraft.sh +++ b/lgsm/functions/update_minecraft.sh @@ -4,9 +4,7 @@ # Website: https://linuxgsm.com # Description: Handles updating of Minecraft servers. -local modulename="UPDATE" -local commandaction="Update" -local function_selfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" +functionselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" fn_update_minecraft_dl(){ if [ "${branch}" == "release" ]; then diff --git a/lgsm/functions/update_minecraft_bedrock.sh b/lgsm/functions/update_minecraft_bedrock.sh index d9d875c45..3336d13ff 100644 --- a/lgsm/functions/update_minecraft_bedrock.sh +++ b/lgsm/functions/update_minecraft_bedrock.sh @@ -4,9 +4,7 @@ # Website: https://linuxgsm.com # Description: Handles updating of Minecraft Bedrock servers. -local modulename="UPDATE" -local commandaction="Update" -local function_selfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" +functionselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" fn_update_minecraft_dl(){ latestmcbuildurl=$(curl -s "https://www.minecraft.net/en-us/download/server/bedrock/" | grep -o 'https://minecraft.azureedge.net/bin-linux/[^"]*zip') diff --git a/lgsm/functions/update_mta.sh b/lgsm/functions/update_mta.sh index db3080b17..57c452d8a 100644 --- a/lgsm/functions/update_mta.sh +++ b/lgsm/functions/update_mta.sh @@ -4,9 +4,7 @@ # Website: https://linuxgsm.com # Description: Handles updating of Multi Theft Auto servers. -local modulename="UPDATE" -local commandaction="Update" -local function_selfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" +functionselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" fn_update_mta_dl(){ fn_fetch_file "http://linux.mtasa.com/dl/multitheftauto_linux_x64.tar.gz" "${tmpdir}" "multitheftauto_linux_x64.tar.gz" diff --git a/lgsm/functions/update_mumble.sh b/lgsm/functions/update_mumble.sh index 88a7102c8..38fc78aa3 100644 --- a/lgsm/functions/update_mumble.sh +++ b/lgsm/functions/update_mumble.sh @@ -4,9 +4,7 @@ # Website: https://linuxgsm.com # Description: Handles updating of Mumble servers. -local modulename="UPDATE" -local commandaction="Update" -local function_selfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" +functionselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" fn_update_mumble_dl(){ fn_fetch_file "https://github.com/mumble-voip/mumble/releases/download/${remotebuild}/murmur-static_${mumblearch}-${remotebuild}.tar.bz2" "${tmpdir}" "murmur-static_${mumblearch}-${remotebuild}.tar.bz2" diff --git a/lgsm/functions/update_steamcmd.sh b/lgsm/functions/update_steamcmd.sh index ed809451a..1ab93ad53 100644 --- a/lgsm/functions/update_steamcmd.sh +++ b/lgsm/functions/update_steamcmd.sh @@ -4,9 +4,7 @@ # Website: https://linuxgsm.com # Description: Handles updating using SteamCMD. -local modulename="UPDATE" -local commandaction="Update" -local function_selfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" +functionselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" fn_update_steamcmd_dl(){ info_config.sh @@ -224,7 +222,7 @@ fn_stop_warning(){ # The location where the builds are checked and downloaded. remotelocation="SteamCMD" -check.sh +check_steamcmd.sh if [ "${forceupdate}" == "1" ]; then # forceupdate bypasses update checks. diff --git a/lgsm/functions/update_ts3.sh b/lgsm/functions/update_ts3.sh index 593183f6f..e50590087 100644 --- a/lgsm/functions/update_ts3.sh +++ b/lgsm/functions/update_ts3.sh @@ -4,9 +4,7 @@ # Website: https://linuxgsm.com # Description: Handles updating of Teamspeak 3 servers. -local modulename="UPDATE" -local commandaction="Update" -local function_selfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" +functionselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" fn_update_ts3_dl(){ if [ "${ts3arch}" == "amd64" ]; then diff --git a/linuxgsm.sh b/linuxgsm.sh index 19ebb01af..ca9d38852 100755 --- a/linuxgsm.sh +++ b/linuxgsm.sh @@ -23,6 +23,7 @@ fi version="v20.2.0" shortname="core" gameservername="core" +commandname="CORE" rootdir=$(dirname "$(readlink -f "${BASH_SOURCE[0]}")") selfname=$(basename "$(readlink -f "${BASH_SOURCE[0]}")") lgsmdir="${rootdir}/lgsm" From d96507ac640929d47e5f191d4567f23ee90e1731 Mon Sep 17 00:00:00 2001 From: Kenneth Lorthioir Date: Sat, 2 May 2020 19:04:10 -0400 Subject: [PATCH 356/534] feat(pstbsserver): update Post Scriptum _default.cfg (#2848) Game server uses regular spacing not "?" between commands. Changed reservedslots to 0 as this is a saner default. Change MaxPlayers to FIXEDMAXPLAYERS. Added RCON port. --- lgsm/config-default/config-lgsm/pstbsserver/_default.cfg | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/lgsm/config-default/config-lgsm/pstbsserver/_default.cfg b/lgsm/config-default/config-lgsm/pstbsserver/_default.cfg index 9c60c53bc..1a80e7a02 100644 --- a/lgsm/config-default/config-lgsm/pstbsserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/pstbsserver/_default.cfg @@ -12,14 +12,15 @@ ip="0.0.0.0" port="10027" queryport="10037" -randommap="ALWAYS" +rconport="21114" +randommap="NONE" #servername="LinuxGSM Server" maxplayers="40" -reservedslots="2" +reservedslots="0" ## Server Start Command | https://docs.linuxgsm.com/configuration/start-parameters#additional-parameters fn_parms(){ -parms="MULTIHOME=${ip}?RANDOM=${randommap}?Port=${port}?QueryPort=${queryport}?MaxPlayers=${maxplayers}?NumReservedSlots=${reservedslots}" +parms="MULTIHOME=${ip} RANDOM=${randommap} Port=${port} QueryPort=${queryport} RCONPORT=${rconport} FIXEDMAXPLAYERS=${maxplayers} NumReservedSlots=${reservedslots}" } #### LinuxGSM Settings #### From 30bb11bb94fce8c5ded74c93d8275f50c9637287 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Mon, 4 May 2020 19:33:58 +0100 Subject: [PATCH 357/534] feat(stats): provide more accurate server numbers (#2864) --- lgsm/data/name-left.csv | 108 ++++++++++++++++ lgsm/data/name-right.csv | 237 +++++++++++++++++++++++++++++++++++ lgsm/functions/info_stats.sh | 137 +++++++++++++++----- 3 files changed, 451 insertions(+), 31 deletions(-) create mode 100644 lgsm/data/name-left.csv create mode 100644 lgsm/data/name-right.csv diff --git a/lgsm/data/name-left.csv b/lgsm/data/name-left.csv new file mode 100644 index 000000000..9a47b4baf --- /dev/null +++ b/lgsm/data/name-left.csv @@ -0,0 +1,108 @@ +admiring +adoring +affectionate +agitated +amazing +angry +awesome +beautiful +blissful +bold +boring +brave +busy +charming +clever +cool +compassionate +competent +condescending +confident +cranky +crazy +dazzling +determined +distracted +dreamy +eager +ecstatic +elastic +elated +elegant +eloquent +epic +exciting +fervent +festive +flamboyant +focused +friendly +frosty +funny +gallant +gifted +goofy +gracious +great +happy +hardcore +heuristic +hopeful +hungry +infallible +inspiring +interesting +intelligent +jolly +jovial +keen +kind +laughing +loving +lucid +magical +mystifying +modest +musing +naughty +nervous +nice +nifty +nostalgic +objective +optimistic +peaceful +pedantic +pensive +practical +priceless +quirky +quizzical +recursing +relaxed +reverent +romantic +sad +serene +sharp +silly +sleepy +stoic +strange +stupefied +suspicious +sweet +tender +thirsty +trusting +unruffled +upbeat +vibrant +vigilant +vigorous +wizardly +wonderful +xenodochial +youthful +zealous +zen \ No newline at end of file diff --git a/lgsm/data/name-right.csv b/lgsm/data/name-right.csv new file mode 100644 index 000000000..8e04d85b4 --- /dev/null +++ b/lgsm/data/name-right.csv @@ -0,0 +1,237 @@ +albattani +allen +almeida +antonelli +agnesi +archimedes +ardinghelli +aryabhata +austin +babbage +banach +banzai +bardeen +bartik +bassi +beaver +bell +benz +bhabha +bhaskara +black +blackburn +blackwell +bohr +booth +borg +bose +bouman +boyd +brahmagupta +brattain +brown +buck +burnell +cannon +carson +cartwright +carver +cerf +chandrasekhar +chaplygin +chatelet +chatterjee +chebyshev +cohen +chaum +clarke +colden +cori +cray +curran +curie +darwin +davinci +dewdney +dhawan +diffie +dijkstra +dirac +driscoll +dubinsky +easley +edison +einstein +elbakyan +elgamal +elion +ellis +engelbart +euclid +euler +faraday +feistel +fermat +fermi +feynman +franklin +gagarin +galileo +galois +ganguly +gates +gauss +germain +goldberg +goldstine +goldwasser +golick +goodall +gould +greider +grothendieck +haibt +hamilton +haslett +hawking +hellman +heisenberg +hermann +herschel +hertz +heyrovsky +hodgkin +hofstadter +hoover +hopper +hugle +hypatia +ishizaka +jackson +jang +jemison +jennings +jepsen +johnson +joliot +jones +kalam +kapitsa +kare +keldysh +keller +kepler +khayyam +khorana +kilby +kirch +knuth +kowalevski +lalande +lamarr +lamport +leakey +leavitt +lederberg +lehmann +lewin +lichterman +liskov +lovelace +lumiere +mahavira +margulis +matsumoto +maxwell +mayer +mccarthy +mcclintock +mclaren +mclean +mcnulty +mendel +mendeleev +meitner +meninsky +merkle +mestorf +mirzakhani +moore +morse +murdock +moser +napier +nash +neumann +newton +nightingale +nobel +noether +northcutt +noyce +panini +pare +pascal +pasteur +payne +perlman +pike +poincare +poitras +proskuriakova +ptolemy +raman +ramanujan +ride +montalcini +ritchie +rhodes +robinson +roentgen +rosalind +rubin +saha +sammet +sanderson +satoshi +shamir +shannon +shaw +shirley +shockley +shtern +sinoussi +snyder +solomon +spence +stonebraker +sutherland +swanson +swartz +swirles +taussig +tereshkova +tesla +tharp +thompson +torvalds +tu +turing +varahamihira +vaughan +visvesvaraya +volhard +villani +wescoff +wilbur +wiles +williams +williamson +wilson +wing +wozniak +wright +wu +yalow +yonath +zhukovsky \ No newline at end of file diff --git a/lgsm/functions/info_stats.sh b/lgsm/functions/info_stats.sh index 078639fe6..9bdee07fd 100644 --- a/lgsm/functions/info_stats.sh +++ b/lgsm/functions/info_stats.sh @@ -2,73 +2,148 @@ # LinuxGSM info_stats.sh function # Author: Daniel Gibbs # Website: https://linuxgsm.com -# Description: Optional Stats to send to LinuxGSM Developer -# Uses Google analytics +# Description: Collect optional Stats sent to LinuxGSM project. +# Uses Google analytics. + +local modulegroup="INFO" +local function_selfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" info_distro.sh -# generate uuid -if [ ! -f "${datadir}/uuid.txt" ]; then - mkdir -p "${datadir}" - touch "${datadir}/uuid.txt" - if [ "$(command -v uuidgen 2>/dev/null)" ]; then - uuidgen > "${datadir}/uuid.txt" + +# remove uuid that was used in v20.2.0 and below +if [ -f "${datadir}/uuid.txt" ]; then + rm "${datadir:?}/uuid.txt" +fi + +# generate uuid's +# this consists of a standard uuid and a docker style name +# to allow human readable uuid's. +# e.g angry_proskuriakova_38a9ef76-4ae3-46a6-a895-7af474831eba + +if [ ! -f "${datadir}/uuid-${selfname}.txt" ]||[ ! -f "${datadir}/uuid-install.txt" ]; then + # download dictionary words + if [ ! -f "${datadir}/name-left.csv" ]; then + fn_fetch_file_github "lgsm/data" "name-left.csv" "${datadir}" "nochmodx" "norun" "forcedl" "nomd5" + fi + if [ ! -f "${datadir}/name-right.csv" ]; then + fn_fetch_file_github "lgsm/data" "name-right.csv" "${datadir}" "nochmodx" "norun" "forcedl" "nomd5" + fi + + # generate instance uuid + if [ -n "$(command -v uuidgen 2>/dev/null)" ]; then + uuid="$(uuidgen)" else - cat /proc/sys/kernel/random/uuid > "${datadir}/uuid.txt" + uuid="$(cat /proc/sys/kernel/random/uuid)" + fi + + nameleft="$(shuf -n 1 "${datadir}/name-left.csv")" + nameright="$(shuf -n 1 "${datadir}/name-right.csv")" + echo "instance_${nameleft}_${nameright}_${uuid}" > "${datadir}/uuid-${selfname}.txt" + # generate install uuid if missing + if [ ! -f "${datadir}/uuid-install.txt" ];then + echo "${nameleft}_${nameright}_${uuid}" > "${datadir}/uuid-install.txt" fi fi -uuid=$(cat "${datadir}/uuid.txt") +uuidinstance=$(cat "${datadir}/uuid-${selfname}.txt") +uuidinstall=$(cat "${datadir}/uuid-install.txt") +# machine-id is a unique id set on OS install +uuidhardware=$(cat "/etc/machine-id") + # results are rounded up to reduce number of different results in analytics. # nearest 100Mhz. -cpuusedmhzroundup=$(((cpuusedmhz + 99) / 100 * 100)) +cpuusedmhzroundup="$(((cpuusedmhz + 99) / 100 * 100))" # nearest 100MB -memusedroundup=$(((memused + 99) / 100 * 100)) +memusedroundup="$(((memused + 99) / 100 * 100))" + +# Spliting the metrics in to 3 propertys allows more accurate metrics on numbers of invidual instances, installs and hardware. +# Instance Property - UA-165287622-1 +# Install Property - UA-165287622-2 +# Hardware Property - UA-165287622-3 ## Distro. -curl https://www.google-analytics.com/collect -d "tid=UA-655379-31" -d "aip=1" -d "cid=${uuid}" -d "t=event" -d "ec=distro" -d "ea=${distroname}" -d "el=${gamename}" -d "v=1" > /dev/null 2>&1 +curl https://www.google-analytics.com/collect -d "tid=UA-655379-31" -d "aip=1" -d "cid=${uuidinstance}" -d "t=event" -d "ec=distro" -d "ea=${distroname}" -d "el=${gamename}" -d "v=1" > /dev/null 2>&1 +curl https://www.google-analytics.com/collect -d "tid=UA-165287622-1" -d "aip=1" -d "cid=${uuidinstance}" -d "t=event" -d "ec=distro" -d "ea=${distroname}" -d "el=${gamename}" -d "v=1" > /dev/null 2>&1 +curl https://www.google-analytics.com/collect -d "tid=UA-165287622-2" -d "aip=1" -d "cid=${uuidinstall}" -d "t=event" -d "ec=distro" -d "ea=${distroname}" -d "el=${gamename}" -d "v=1" > /dev/null 2>&1 +curl https://www.google-analytics.com/collect -d "tid=UA-165287622-3" -d "aip=1" -d "cid=${uuidhardware}" -d "t=event" -d "ec=distro" -d "ea=${distroname}" -d "el=${gamename}" -d "v=1" > /dev/null 2>&1 + ## Game Server Name. -curl https://www.google-analytics.com/collect -d "tid=UA-655379-31" -d "aip=1" -d "cid=${uuid}" -d "t=event" -d "ec=game" -d "ea=${gamename}" -d "el=${gamename}" -d "v=1" > /dev/null 2>&1 +curl https://www.google-analytics.com/collect -d "tid=UA-655379-31" -d "aip=1" -d "cid=${uuidinstance}" -d "t=event" -d "ec=game" -d "ea=${gamename}" -d "el=${gamename}" -d "v=1" > /dev/null 2>&1 +curl https://www.google-analytics.com/collect -d "tid=UA-165287622-1" -d "aip=1" -d "cid=${uuidinstance}" -d "t=event" -d "ec=game" -d "ea=${gamename}" -d "el=${gamename}" -d "v=1" > /dev/null 2>&1 +curl https://www.google-analytics.com/collect -d "tid=UA-165287622-2" -d "aip=1" -d "cid=${uuidinstall}" -d "t=event" -d "ec=game" -d "ea=${gamename}" -d "el=${gamename}" -d "v=1" > /dev/null 2>&1 +curl https://www.google-analytics.com/collect -d "tid=UA-165287622-3" -d "aip=1" -d "cid=${uuidhardware}" -d "t=event" -d "ec=game" -d "ea=${gamename}" -d "el=${gamename}" -d "v=1" > /dev/null 2>&1 + ## LinuxGSM Version. -curl https://www.google-analytics.com/collect -d "tid=UA-655379-31" -d "aip=1" -d "cid=${uuid}" -d "t=event" -d "ec=version" -d "ea=${version}" -d "el=${gamename}" -d "v=1" > /dev/null 2>&1 +curl https://www.google-analytics.com/collect -d "tid=UA-655379-31" -d "aip=1" -d "cid=${uuidinstance}" -d "t=event" -d "ec=version" -d "ea=${version}" -d "el=${gamename}" -d "v=1" > /dev/null 2>&1 +curl https://www.google-analytics.com/collect -d "tid=UA-165287622-1" -d "aip=1" -d "cid=${uuidinstance}" -d "t=event" -d "ec=version" -d "ea=${version}" -d "el=${gamename}" -d "v=1" > /dev/null 2>&1 +curl https://www.google-analytics.com/collect -d "tid=UA-165287622-2" -d "aip=1" -d "cid=${uuidinstall}" -d "t=event" -d "ec=version" -d "ea=${version}" -d "el=${gamename}" -d "v=1" > /dev/null 2>&1 +curl https://www.google-analytics.com/collect -d "tid=UA-165287622-3" -d "aip=1" -d "cid=${uuidhardware}" -d "t=event" -d "ec=version" -d "ea=${version}" -d "el=${gamename}" -d "v=1" > /dev/null 2>&1 ## CPU usage of a game server. -if [ "${cpuusedmhzroundup}" ]; then - curl https://www.google-analytics.com/collect -d "tid=UA-655379-31" -d "aip=1" -d "cid=${uuid}" -d "t=event" -d "ec=cpuused" -d "ea=${cpuusedmhzroundup}MHz" -d "el=${gamename}" -d "v=1" > /dev/null 2>&1 +if [ -n "${cpuusedmhzroundup}" ]; then + curl https://www.google-analytics.com/collect -d "tid=UA-655379-31" -d "aip=1" -d "cid=${uuidinstance}" -d "t=event" -d "ec=cpuused" -d "ea=${cpuusedmhzroundup}MHz" -d "el=${gamename}" -d "v=1" > /dev/null 2>&1 + curl https://www.google-analytics.com/collect -d "tid=UA-165287622-1" -d "aip=1" -d "cid=${uuidinstance}" -d "t=event" -d "ec=cpuused" -d "ea=${cpuusedmhzroundup}MHz" -d "el=${gamename}" -d "v=1" > /dev/null 2>&1 + curl https://www.google-analytics.com/collect -d "tid=UA-165287622-2" -d "aip=1" -d "cid=${uuidinstall}" -d "t=event" -d "ec=cpuused" -d "ea=${cpuusedmhzroundup}MHz" -d "el=${gamename}" -d "v=1" > /dev/null 2>&1 + curl https://www.google-analytics.com/collect -d "tid=UA-165287622-3" -d "aip=1" -d "cid=${uuidhardware}" -d "t=event" -d "ec=cpuused" -d "ea=${cpuusedmhzroundup}MHz" -d "el=${gamename}" -d "v=1" > /dev/null 2>&1 fi ## Ram usage of a game server. -if [ "${memusedroundup}" ]; then - curl https://www.google-analytics.com/collect -d "tid=UA-655379-31" -d "aip=1" -d "cid=${uuid}" -d "t=event" -d "ec=ramused" -d "ea=${memusedroundup}MB" -d "el=${gamename}" -d "v=1" > /dev/null 2>&1 +if [ -n "${memusedroundup}" ]; then + curl https://www.google-analytics.com/collect -d "tid=UA-655379-31" -d "aip=1" -d "cid=${uuidinstance}" -d "t=event" -d "ec=ramused" -d "ea=${memusedroundup}MB" -d "el=${gamename}" -d "v=1" > /dev/null 2>&1 + curl https://www.google-analytics.com/collect -d "tid=UA-165287622-1" -d "aip=1" -d "cid=${uuidinstance}" -d "t=event" -d "ec=ramused" -d "ea=${memusedroundup}MB" -d "el=${gamename}" -d "v=1" > /dev/null 2>&1 + curl https://www.google-analytics.com/collect -d "tid=UA-165287622-2" -d "aip=1" -d "cid=${uuidinstall}" -d "t=event" -d "ec=ramused" -d "ea=${memusedroundup}MB" -d "el=${gamename}" -d "v=1" > /dev/null 2>&1 + curl https://www.google-analytics.com/collect -d "tid=UA-165287622-3" -d "aip=1" -d "cid=${uuidhardware}" -d "t=event" -d "ec=ramused" -d "ea=${memusedroundup}MB" -d "el=${gamename}" -d "v=1" > /dev/null 2>&1 fi ## Disk usage of a game server. -if [ "${serverfilesdu}" ]; then - curl https://www.google-analytics.com/collect -d "tid=UA-655379-31" -d "aip=1" -d "cid=${uuid}" -d "t=event" -d "ec=diskused" -d "ea=${serverfilesdu}" -d "el=${gamename}" -d "v=1" > /dev/null 2>&1 +if [ -n "${serverfilesdu}" ]; then + curl https://www.google-analytics.com/collect -d "tid=UA-655379-31" -d "aip=1" -d "cid=${uuidinstance}" -d "t=event" -d "ec=diskused" -d "ea=${serverfilesdu}" -d "el=${gamename}" -d "v=1" > /dev/null 2>&1 + curl https://www.google-analytics.com/collect -d "tid=UA-165287622-1" -d "aip=1" -d "cid=${uuidinstance}" -d "t=event" -d "ec=diskused" -d "ea=${serverfilesdu}" -d "el=${gamename}" -d "v=1" > /dev/null 2>&1 + curl https://www.google-analytics.com/collect -d "tid=UA-165287622-2" -d "aip=1" -d "cid=${uuidinstall}" -d "t=event" -d "ec=diskused" -d "ea=${serverfilesdu}" -d "el=${gamename}" -d "v=1" > /dev/null 2>&1 + curl https://www.google-analytics.com/collect -d "tid=UA-165287622-3" -d "aip=1" -d "cid=${uuidhardware}" -d "t=event" -d "ec=diskused" -d "ea=${serverfilesdu}" -d "el=${gamename}" -d "v=1" > /dev/null 2>&1 fi ## CPU Model. -if [ "${cpumodel}" ]; then - curl https://www.google-analytics.com/collect -d "tid=UA-655379-31" -d "aip=1" -d "cid=${uuid}" -d "t=event" -d "ec=servercpu" -d "ea=${cpumodel} ${cpucores} cores" -d "el=${gamename}" -d "v=1" > /dev/null 2>&1 +if [ -n "${cpumodel}" ]; then + curl https://www.google-analytics.com/collect -d "tid=UA-655379-31" -d "aip=1" -d "cid=${uuidinstance}" -d "t=event" -d "ec=servercpu" -d "ea=${cpumodel} ${cpucores} cores" -d "el=${gamename}" -d "v=1" > /dev/null 2>&1 + curl https://www.google-analytics.com/collect -d "tid=UA-165287622-1" -d "aip=1" -d "cid=${uuidinstance}" -d "t=event" -d "ec=servercpu" -d "ea=${cpumodel} ${cpucores} cores" -d "el=${gamename}" -d "v=1" > /dev/null 2>&1 + curl https://www.google-analytics.com/collect -d "tid=UA-165287622-2" -d "aip=1" -d "cid=${uuidinstall}" -d "t=event" -d "ec=servercpu" -d "ea=${cpumodel} ${cpucores} cores" -d "el=${gamename}" -d "v=1" > /dev/null 2>&1 + curl https://www.google-analytics.com/collect -d "tid=UA-165287622-3" -d "aip=1" -d "cid=${uuidhardware}" -d "t=event" -d "ec=servercpu" -d "ea=${cpumodel} ${cpucores} cores" -d "el=${gamename}" -d "v=1" > /dev/null 2>&1 + fi ## CPU Frequency. -if [ "${cpufreqency}" ]; then - curl https://www.google-analytics.com/collect -d "tid=UA-655379-31" -d "aip=1" -d "cid=${uuid}" -d "t=event" -d "ec=servercpufreq" -d "ea=${cpufreqency} x${cpucores}" -d "el=${gamename}" -d "v=1" > /dev/null 2>&1 +if [ -n "${cpufreqency}" ]; then + curl https://www.google-analytics.com/collect -d "tid=UA-655379-31" -d "aip=1" -d "cid=${uuidinstance}" -d "t=event" -d "ec=servercpufreq" -d "ea=${cpufreqency} x${cpucores}" -d "el=${gamename}" -d "v=1" > /dev/null 2>&1 + curl https://www.google-analytics.com/collect -d "tid=UA-165287622-1" -d "aip=1" -d "cid=${uuidinstance}" -d "t=event" -d "ec=servercpufreq" -d "ea=${cpufreqency} x${cpucores}" -d "el=${gamename}" -d "v=1" > /dev/null 2>&1 + curl https://www.google-analytics.com/collect -d "tid=UA-165287622-2" -d "aip=1" -d "cid=${uuidinstall}" -d "t=event" -d "ec=servercpufreq" -d "ea=${cpufreqency} x${cpucores}" -d "el=${gamename}" -d "v=1" > /dev/null 2>&1 + curl https://www.google-analytics.com/collect -d "tid=UA-165287622-3" -d "aip=1" -d "cid=${uuidhardware}" -d "t=event" -d "ec=servercpufreq" -d "ea=${cpufreqency} x${cpucores}" -d "el=${gamename}" -d "v=1" > /dev/null 2>&1 fi ## Server RAM. -if [ "${physmemtotal}" ]; then - curl https://www.google-analytics.com/collect -d "tid=UA-655379-31" -d "aip=1" -d "cid=${uuid}" -d "t=event" -d "ec=serverram" -d "ea=${physmemtotal}" -d "el=${gamename}" -d "v=1" > /dev/null 2>&1 +if [ -n "${physmemtotal}" ]; then + curl https://www.google-analytics.com/collect -d "tid=UA-655379-31" -d "aip=1" -d "cid=${uuidinstance}" -d "t=event" -d "ec=serverram" -d "ea=${physmemtotal}" -d "el=${gamename}" -d "v=1" > /dev/null 2>&1 + curl https://www.google-analytics.com/collect -d "tid=UA-165287622-1" -d "aip=1" -d "cid=${uuidinstance}" -d "t=event" -d "ec=serverram" -d "ea=${physmemtotal}" -d "el=${gamename}" -d "v=1" > /dev/null 2>&1 + curl https://www.google-analytics.com/collect -d "tid=UA-165287622-2" -d "aip=1" -d "cid=${uuidinstall}" -d "t=event" -d "ec=serverram" -d "ea=${physmemtotal}" -d "el=${gamename}" -d "v=1" > /dev/null 2>&1 + curl https://www.google-analytics.com/collect -d "tid=UA-165287622-3" -d "aip=1" -d "cid=${uuidhardware}" -d "t=event" -d "ec=serverram" -d "ea=${physmemtotal}" -d "el=${gamename}" -d "v=1" > /dev/null 2>&1 fi ## Server Disk. -if [ "${totalspace}" ]; then - curl https://www.google-analytics.com/collect -d "tid=UA-655379-31" -d "aip=1" -d "cid=${uuid}" -d "t=event" -d "ec=serverdisk" -d "ea=${totalspace}" -d "el=${gamename}" -d "v=1" > /dev/null 2>&1 +if [ -n "${totalspace}" ]; then + curl https://www.google-analytics.com/collect -d "tid=UA-655379-31" -d "aip=1" -d "cid=${uuidinstance}" -d "t=event" -d "ec=serverdisk" -d "ea=${totalspace}" -d "el=${gamename}" -d "v=1" > /dev/null 2>&1 + curl https://www.google-analytics.com/collect -d "tid=UA-165287622-1" -d "aip=1" -d "cid=${uuidinstance}" -d "t=event" -d "ec=serverdisk" -d "ea=${totalspace}" -d "el=${gamename}" -d "v=1" > /dev/null 2>&1 + curl https://www.google-analytics.com/collect -d "tid=UA-165287622-2" -d "aip=1" -d "cid=${uuidinstall}" -d "t=event" -d "ec=serverdisk" -d "ea=${totalspace}" -d "el=${gamename}" -d "v=1" > /dev/null 2>&1 + curl https://www.google-analytics.com/collect -d "tid=UA-165287622-3" -d "aip=1" -d "cid=${uuidhardware}" -d "t=event" -d "ec=serverdisk" -d "ea=${totalspace}" -d "el=${gamename}" -d "v=1" > /dev/null 2>&1 fi ## Summary Stats -curl https://www.google-analytics.com/collect -d "tid=UA-655379-31" -d "aip=1" -d "cid=${uuid}" -d "t=event" -d "ec=summary" -d "ea=GAME: ${gamename} | DISTRO: ${distroname} | CPU MODEL: ${cpumodel} ${cpucores} cores | RAM: ${physmemtotal} | DISK: ${totalspace}" -d "v=1" > /dev/null 2>&1 +curl https://www.google-analytics.com/collect -d "tid=UA-655379-31" -d "aip=1" -d "cid=${uuidinstance}" -d "t=event" -d "ec=summary" -d "ea=GAME: ${gamename} | DISTRO: ${distroname} | CPU MODEL: ${cpumodel} ${cpucores} cores | RAM: ${physmemtotal} | DISK: ${totalspace}" -d "v=1" > /dev/null 2>&1 +curl https://www.google-analytics.com/collect -d "tid=UA-165287622-1" -d "aip=1" -d "cid=${uuidinstance}" -d "t=event" -d "ec=summary" -d "ea=GAME: ${gamename} | DISTRO: ${distroname} | CPU MODEL: ${cpumodel} ${cpucores} cores | RAM: ${physmemtotal} | DISK: ${totalspace}" -d "v=1" > /dev/null 2>&1 +curl https://www.google-analytics.com/collect -d "tid=UA-165287622-2" -d "aip=1" -d "cid=${uuidinstall}" -d "t=event" -d "ec=summary" -d "ea=GAME: ${gamename} | DISTRO: ${distroname} | CPU MODEL: ${cpumodel} ${cpucores} cores | RAM: ${physmemtotal} | DISK: ${totalspace}" -d "v=1" > /dev/null 2>&1 +curl https://www.google-analytics.com/collect -d "tid=UA-165287622-3" -d "aip=1" -d "cid=${uuidhardware}" -d "t=event" -d "ec=summary" -d "ea=GAME: ${gamename} | DISTRO: ${distroname} | CPU MODEL: ${cpumodel} ${cpucores} cores | RAM: ${physmemtotal} | DISK: ${totalspace}" -d "v=1" > /dev/null 2>&1 fn_script_log_info "Send LinuxGSM stats" -fn_script_log_info "* UUID: ${uuid}" +fn_script_log_info "* uuid-${selfname}: ${uuidinstance}" +fn_script_log_info "* uuid-install: ${uuidinstall}" +fn_script_log_info "* uuid-hardware: ${uuidhardware}" fn_script_log_info "* Game Name: ${gamename}" fn_script_log_info "* Distro Name: ${distroname}" fn_script_log_info "* Game Server CPU Used: ${cpuusedmhzroundup}MHz" From 4ec92fc43f58a37e842b5512671643e98608422a Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Wed, 6 May 2020 11:21:35 +0100 Subject: [PATCH 358/534] release v20.2.1 --- linuxgsm.sh | 2 +- tests/tests_fctrserver.sh | 2 +- tests/tests_jc2server.sh | 2 +- tests/tests_mcserver.sh | 2 +- tests/tests_ts3server.sh | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/linuxgsm.sh b/linuxgsm.sh index 19ebb01af..5d26a8672 100755 --- a/linuxgsm.sh +++ b/linuxgsm.sh @@ -20,7 +20,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="v20.2.0" +version="v20.2.1" shortname="core" gameservername="core" rootdir=$(dirname "$(readlink -f "${BASH_SOURCE[0]}")") diff --git a/tests/tests_fctrserver.sh b/tests/tests_fctrserver.sh index 235d1bd93..7881ad8d6 100644 --- a/tests/tests_fctrserver.sh +++ b/tests/tests_fctrserver.sh @@ -20,7 +20,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="v20.2.0" +version="v20.2.1" shortname="fctr" gameservername="fctrserver" rootdir=$(dirname "$(readlink -f "${BASH_SOURCE[0]}")") diff --git a/tests/tests_jc2server.sh b/tests/tests_jc2server.sh index 65e8acaef..dd39ce047 100644 --- a/tests/tests_jc2server.sh +++ b/tests/tests_jc2server.sh @@ -20,7 +20,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="v20.2.0" +version="v20.2.1" shortname="jc2" gameservername="jc2server" rootdir=$(dirname "$(readlink -f "${BASH_SOURCE[0]}")") diff --git a/tests/tests_mcserver.sh b/tests/tests_mcserver.sh index 1a3f86802..a8f16a22a 100644 --- a/tests/tests_mcserver.sh +++ b/tests/tests_mcserver.sh @@ -20,7 +20,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="v20.2.0" +version="v20.2.1" shortname="mc" gameservername="mcserver" rootdir=$(dirname "$(readlink -f "${BASH_SOURCE[0]}")") diff --git a/tests/tests_ts3server.sh b/tests/tests_ts3server.sh index 01c195ce3..af50e3805 100644 --- a/tests/tests_ts3server.sh +++ b/tests/tests_ts3server.sh @@ -20,7 +20,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="v20.2.0" +version="v20.2.1" shortname="ts3" gameservername="ts3server" rootdir=$(dirname "$(readlink -f "${BASH_SOURCE[0]}")") From 458fec5782b380fbf1c2f2e643dd426e3e606b32 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Wed, 6 May 2020 11:35:31 +0100 Subject: [PATCH 359/534] fix(update): resolve issue with steamcmd update not getting latest build --- lgsm/functions/update_steamcmd.sh | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/lgsm/functions/update_steamcmd.sh b/lgsm/functions/update_steamcmd.sh index ed809451a..1e9679f9d 100644 --- a/lgsm/functions/update_steamcmd.sh +++ b/lgsm/functions/update_steamcmd.sh @@ -47,11 +47,6 @@ fn_update_steamcmd_localbuild(){ # Uses appmanifest to find local build. localbuild=$(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. - if [ -f "${HOME}/.steam/appcache/appinfo.vdf" ]; then - rm -f "${HOME}/.steam/appcache/appinfo.vdf" - fi - # Set branch for updateinfo. IFS=' ' read -ra branchsplits <<< "${branch}" if [ "${#branchsplits[@]}" -gt 1 ]; then @@ -76,6 +71,12 @@ fn_update_steamcmd_remotebuild(){ if [ -d "${steamcmddir}" ]; then cd "${steamcmddir}" || exit fi + + # Removes appinfo.vdf as a fix for not always getting up to date version info from SteamCMD. + if [ "$(find "${HOME}" -type f -name "appinfo.vdf" | wc -l)" -ne "0" ]; then + find "${HOME}" -type f -name "appinfo.vdf" -exec rm -f {} \; + fi + remotebuild=$(${steamcmdcommand} +login "${steamuser}" "${steampass}" +app_info_update 1 +app_info_print "${appid}" +quit | sed '1,/branches/d' | sed "1,/${branchname}/d" | grep -m 1 buildid | tr -cd '[:digit:]') if [ "${installer}" != "1" ]; then fn_print_dots "Checking remote build: ${remotelocation}" From 34b2c83882161f0aa3ce39fe7879a87afbc4d543 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Thu, 7 May 2020 14:14:12 +0100 Subject: [PATCH 360/534] tidied up bots and templates --- .github/FUNDING.yml | 2 +- .github/ISSUE_TEMPLATE/bug_report.md | 4 ++-- .github/ISSUE_TEMPLATE/feature_request.md | 6 +++--- .github/ISSUE_TEMPLATE/new-server-request.md | 2 +- .github/pr_labels.yml | 5 ----- .github/pull_request_template.md | 6 +++--- .github/request-info.yml | 17 ---------------- .github/support.yml | 15 -------------- .github/welcome.yml | 21 -------------------- 9 files changed, 10 insertions(+), 68 deletions(-) delete mode 100644 .github/pr_labels.yml delete mode 100644 .github/request-info.yml delete mode 100644 .github/support.yml delete mode 100644 .github/welcome.yml diff --git a/.github/FUNDING.yml b/.github/FUNDING.yml index bb77d9f85..ee85cb782 100644 --- a/.github/FUNDING.yml +++ b/.github/FUNDING.yml @@ -3,7 +3,7 @@ github: dgibbs64 # Replace with up to 4 GitHub Sponsors-enabled usernames e.g., [user1, user2] patreon: dgibbs # Replace with a single Patreon username open_collective: # Replace with a single Open Collective username -ko_fi: dgibbs # Replace with a single Ko-fi username +ko_fi: # Replace with a single Ko-fi username tidelift: # Replace with a single Tidelift platform-name/package-name e.g., npm/babel community_bridge: # Replace with a single Community Bridge project-name e.g., cloud-foundry liberapay: # Replace with a single Liberapay username diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md index db7ccf4f7..d3c1adfbb 100644 --- a/.github/ISSUE_TEMPLATE/bug_report.md +++ b/.github/ISSUE_TEMPLATE/bug_report.md @@ -1,6 +1,6 @@ --- name: Bug report -about: Found a bug? Raise a report +about: Found a bug? Raise a report. --- Issues raised here are **ONLY** for: @@ -27,7 +27,7 @@ As a [user description], I want [desired action] so that [desired outcome]. * **Distro:** [Ubuntu 18.04] * **Game:** [Garry's Mod] * **Command:** [Monitor] -* **LinuxGSM version:** [v12.34.56] +* **LinuxGSM version:** [v20.1.3] ## Further Information diff --git a/.github/ISSUE_TEMPLATE/feature_request.md b/.github/ISSUE_TEMPLATE/feature_request.md index 68bdf0ad6..dc51fe40e 100644 --- a/.github/ISSUE_TEMPLATE/feature_request.md +++ b/.github/ISSUE_TEMPLATE/feature_request.md @@ -1,6 +1,6 @@ --- name: Feature request -about: Suggest an idea for this project +about: Suggest an idea for LinuxGSM. --- @@ -25,10 +25,10 @@ As a [user description], I want [desired action] so that [desired outcome]. ## Basic info -* **Distro:** [Ubuntu 18.04] +* **Distro:** [Ubuntu 20.04] * **Game:** [Garry's Mod] * **Command:** [Monitor] -* **LinuxGSM version:** [v12.34.56] +* **LinuxGSM version:** [v20.1.3] ## Further Information diff --git a/.github/ISSUE_TEMPLATE/new-server-request.md b/.github/ISSUE_TEMPLATE/new-server-request.md index 8101f74f0..ada8638cc 100644 --- a/.github/ISSUE_TEMPLATE/new-server-request.md +++ b/.github/ISSUE_TEMPLATE/new-server-request.md @@ -1,6 +1,6 @@ --- name: New server request -about: Suggest a new game server to be added +about: Suggest a new game server to be added. --- diff --git a/.github/pr_labels.yml b/.github/pr_labels.yml deleted file mode 100644 index db1f63f6b..000000000 --- a/.github/pr_labels.yml +++ /dev/null @@ -1,5 +0,0 @@ -version: '1' -invalidStatus: "pending" -labelRule: - startsWith: - - "type:" diff --git a/.github/pull_request_template.md b/.github/pull_request_template.md index 5aa59ce42..af1c7faba 100644 --- a/.github/pull_request_template.md +++ b/.github/pull_request_template.md @@ -6,7 +6,7 @@ Fixes #[issue] ## Type of change -* [ ] Bug fix (change which fixes an issue). +* [ ] Bug fix (a change which fixes an issue). * [ ] New feature (change which adds functionality). * [ ] New Server (new server added). * [ ] Refactor (restructures existing code). @@ -20,9 +20,9 @@ PR will not be merged until all steps are complete. * [ ] This pull request uses the `develop` branch as its base. * [ ] This pull request Subject follows the Conventional Commits standard. * [ ] This code follows the style guidelines of this project. -* [ ] I have performed a self-review of my own code. +* [ ] I have performed a self-review of my code. * [ ] I have checked that this code is commented where required. -* [ ] I have provided a detailed enough description of this PR. +* [ ] I have provided a detailed with enough description of this PR. * [ ] I have checked If documentation needs updating. ## Documentation diff --git a/.github/request-info.yml b/.github/request-info.yml deleted file mode 100644 index ed407c3b5..000000000 --- a/.github/request-info.yml +++ /dev/null @@ -1,17 +0,0 @@ -# Configuration for request-info - https://github.com/behaviorbot/request-info - -# *Required* Comment to reply with -requestInfoReplyComment: > - ![More Data required](https://i.imgur.com/yS9cecv.png) - More data is required to assist with this issue - or issue template was not used correctly. - https://linuxgsm.com/support/#guide - -# *OPTIONAL* default titles to check against for lack of descriptiveness -# MUST BE ALL LOWERCASE -#requestInfoDefaultTitles: -# - update readme.md -# - updates - -# *OPTIONAL* Label to be added to Issues and Pull Requests with insufficient information given -requestInfoLabelToAdd: "needs more info" diff --git a/.github/support.yml b/.github/support.yml deleted file mode 100644 index 2f45e92ec..000000000 --- a/.github/support.yml +++ /dev/null @@ -1,15 +0,0 @@ -# Configuration for support-requests - https://github.com/dessant/support-requests - -# Label used to mark issues as support requests -supportLabel: "Outcome: wrong forum" -# Comment to post on issues marked as support requests. Add a link -# to a support page, or set to `false` to disable -supportComment: > - We use the issue tracker exclusively for bug reports and feature requests. - However, this issue appears to be a support request. Please use our - support channels to get help with the project. - https://linuxgsm.com/support -# Whether to close issues marked as support requests -close: true -# Whether to lock issues marked as support requests -lock: false diff --git a/.github/welcome.yml b/.github/welcome.yml deleted file mode 100644 index 7d0cb281b..000000000 --- a/.github/welcome.yml +++ /dev/null @@ -1,21 +0,0 @@ -# Configuration for welcome - https://github.com/behaviorbot/welcome - -# Configuration for new-issue-welcome - https://github.com/behaviorbot/new-issue-welcome - -# Comment to be posted to on first time issues -newIssueWelcomeComment: > - Thank you for opening your first issue. Be sure to follow the issue template! and guide for posting. https://linuxgsm.com/support/#guide - -# Configuration for new-pr-welcome - https://github.com/behaviorbot/new-pr-welcome - -# Comment to be posted to on PRs from first time contributors in your repository -newPRWelcomeComment: > - Thank you for opening this pull request! Please check out our contributing guidelines. - -# Configuration for first-pr-merge - https://github.com/behaviorbot/first-pr-merge - -# Comment to be posted to on pull requests merged by a first time user -firstPRMergeComment: > - Congratulations on merging your first pull request! Thank you for supporting LinuxGSM! - -# It is recommend to include as many gifs and emojis as possible From 894ead178e6fbc6c993140bb482435f4f6b7ced4 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Thu, 7 May 2020 14:22:19 +0100 Subject: [PATCH 361/534] add bitbucket sync and tidied up bots --- .github/FUNDING.yml | 2 +- .github/ISSUE_TEMPLATE/bug_report.md | 4 ++-- .github/ISSUE_TEMPLATE/feature_request.md | 6 +++--- .github/ISSUE_TEMPLATE/new-server-request.md | 2 +- .github/pull_request_template.md | 6 +++--- .github/workflows/git-sync.yml | 22 ++++++++++++++++++++ 6 files changed, 32 insertions(+), 10 deletions(-) create mode 100644 .github/workflows/git-sync.yml diff --git a/.github/FUNDING.yml b/.github/FUNDING.yml index bb77d9f85..ee85cb782 100644 --- a/.github/FUNDING.yml +++ b/.github/FUNDING.yml @@ -3,7 +3,7 @@ github: dgibbs64 # Replace with up to 4 GitHub Sponsors-enabled usernames e.g., [user1, user2] patreon: dgibbs # Replace with a single Patreon username open_collective: # Replace with a single Open Collective username -ko_fi: dgibbs # Replace with a single Ko-fi username +ko_fi: # Replace with a single Ko-fi username tidelift: # Replace with a single Tidelift platform-name/package-name e.g., npm/babel community_bridge: # Replace with a single Community Bridge project-name e.g., cloud-foundry liberapay: # Replace with a single Liberapay username diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md index db7ccf4f7..d3c1adfbb 100644 --- a/.github/ISSUE_TEMPLATE/bug_report.md +++ b/.github/ISSUE_TEMPLATE/bug_report.md @@ -1,6 +1,6 @@ --- name: Bug report -about: Found a bug? Raise a report +about: Found a bug? Raise a report. --- Issues raised here are **ONLY** for: @@ -27,7 +27,7 @@ As a [user description], I want [desired action] so that [desired outcome]. * **Distro:** [Ubuntu 18.04] * **Game:** [Garry's Mod] * **Command:** [Monitor] -* **LinuxGSM version:** [v12.34.56] +* **LinuxGSM version:** [v20.1.3] ## Further Information diff --git a/.github/ISSUE_TEMPLATE/feature_request.md b/.github/ISSUE_TEMPLATE/feature_request.md index 68bdf0ad6..dc51fe40e 100644 --- a/.github/ISSUE_TEMPLATE/feature_request.md +++ b/.github/ISSUE_TEMPLATE/feature_request.md @@ -1,6 +1,6 @@ --- name: Feature request -about: Suggest an idea for this project +about: Suggest an idea for LinuxGSM. --- @@ -25,10 +25,10 @@ As a [user description], I want [desired action] so that [desired outcome]. ## Basic info -* **Distro:** [Ubuntu 18.04] +* **Distro:** [Ubuntu 20.04] * **Game:** [Garry's Mod] * **Command:** [Monitor] -* **LinuxGSM version:** [v12.34.56] +* **LinuxGSM version:** [v20.1.3] ## Further Information diff --git a/.github/ISSUE_TEMPLATE/new-server-request.md b/.github/ISSUE_TEMPLATE/new-server-request.md index 8101f74f0..ada8638cc 100644 --- a/.github/ISSUE_TEMPLATE/new-server-request.md +++ b/.github/ISSUE_TEMPLATE/new-server-request.md @@ -1,6 +1,6 @@ --- name: New server request -about: Suggest a new game server to be added +about: Suggest a new game server to be added. --- diff --git a/.github/pull_request_template.md b/.github/pull_request_template.md index 5aa59ce42..af1c7faba 100644 --- a/.github/pull_request_template.md +++ b/.github/pull_request_template.md @@ -6,7 +6,7 @@ Fixes #[issue] ## Type of change -* [ ] Bug fix (change which fixes an issue). +* [ ] Bug fix (a change which fixes an issue). * [ ] New feature (change which adds functionality). * [ ] New Server (new server added). * [ ] Refactor (restructures existing code). @@ -20,9 +20,9 @@ PR will not be merged until all steps are complete. * [ ] This pull request uses the `develop` branch as its base. * [ ] This pull request Subject follows the Conventional Commits standard. * [ ] This code follows the style guidelines of this project. -* [ ] I have performed a self-review of my own code. +* [ ] I have performed a self-review of my code. * [ ] I have checked that this code is commented where required. -* [ ] I have provided a detailed enough description of this PR. +* [ ] I have provided a detailed with enough description of this PR. * [ ] I have checked If documentation needs updating. ## Documentation diff --git a/.github/workflows/git-sync.yml b/.github/workflows/git-sync.yml new file mode 100644 index 000000000..f4936486d --- /dev/null +++ b/.github/workflows/git-sync.yml @@ -0,0 +1,22 @@ +name: Github to Bitbucket sync +# This action will sync the github repo with a backup bitbucket repo. +# This will allow LinuxGSM to use Bitbucket as and alternative download if github fails. +on: push +jobs: + repo-sync: + runs-on: ubuntu-latest + steps: + - name: ssh + uses: webfactory/ssh-agent@v0.2.0 + with: + ssh-private-key: ${{ secrets.BITBUCKET_SECRET }} + ssh_private_key: ${{ secrets.BITBUCKET_SECRET }} + + - name: repo-sync + uses: wei/git-sync@v2 + with: + source_repo: "https://github.com/GameServerManagers/LinuxGSM" + source_branch: "refs/heads/*" + destination_repo: "git@bitbucket.org:dgibbs64/linuxgsm.git" + destination_branch: "refs/heads/*" + ssh_private_key: ${{ secrets.BITBUCKET_SECRET }} From b79927768e6cfd49d7ebd6100602428cd7b624e9 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Mon, 11 May 2020 22:26:20 +0100 Subject: [PATCH 362/534] Update git-sync.yml --- .github/workflows/git-sync.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/git-sync.yml b/.github/workflows/git-sync.yml index f4936486d..a6cbe003a 100644 --- a/.github/workflows/git-sync.yml +++ b/.github/workflows/git-sync.yml @@ -17,6 +17,6 @@ jobs: with: source_repo: "https://github.com/GameServerManagers/LinuxGSM" source_branch: "refs/heads/*" - destination_repo: "git@bitbucket.org:dgibbs64/linuxgsm.git" + destination_repo: "git@bitbucket.org:GameServerManagers/linuxgsm.git" destination_branch: "refs/heads/*" ssh_private_key: ${{ secrets.BITBUCKET_SECRET }} From 539b806f6d92c5f74c97b26218aebf583ccdd909 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Mon, 11 May 2020 22:35:21 +0100 Subject: [PATCH 363/534] Update git-sync.yml --- .github/workflows/git-sync.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/git-sync.yml b/.github/workflows/git-sync.yml index a6cbe003a..b3d5ea171 100644 --- a/.github/workflows/git-sync.yml +++ b/.github/workflows/git-sync.yml @@ -1,4 +1,4 @@ -name: Github to Bitbucket sync +name: Backup Repo # This action will sync the github repo with a backup bitbucket repo. # This will allow LinuxGSM to use Bitbucket as and alternative download if github fails. on: push From 9233f4888f742acd697f6ec6a55916a76169d65e Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Mon, 11 May 2020 22:51:57 +0100 Subject: [PATCH 364/534] Update README.md --- README.md | 14 +++----------- 1 file changed, 3 insertions(+), 11 deletions(-) diff --git a/README.md b/README.md index 6fecaea1a..7491edbde 100644 --- a/README.md +++ b/README.md @@ -3,7 +3,7 @@ LinuxGSM -[![LinuxGSM](https://img.shields.io/badge/-LinuxGSM-2b2b2b.svg?logo=data%3Aimage%2Fpng%3Bbase64%2CiVBORw0KGgoAAAANSUhEUgAAACsAAABACAYAAACDbo5ZAAAGD0lEQVR4AcWYa2wUVRvHz75c2vJ2disXoUBEVIioRAx%2BMIFA1IRwUS6KCCiIKBrvhEYiiGm5iBgk8QOGEgUUDYTttmVZWFr2UmwURS6iYAoCtmisElSsdHdbkT7%2BTzoNy%2BGc2dm54C%2F5Rdkz85x%2FZ86ZOXOYXYhIg3Phx%2FA4PAcv6f%2Btg5vhHJjP3EcZsgsshufJHH%2FAJbDztQ7aG35J1vgCXn%2BtgvrgEbLHYei9FmE3kDOUuh10OGwjZ7gEh7kZ9gNyllK3gnrg7%2BQs56DHjbCDyB0GuRF2ArnDeDfCziF3mO1G2FfJHRa4EXYpuUOxG2GXkzuUuBH2TXKH5W6ELSV3eM%2BNsOUk5yQcAY8p2uvgSPitor3MjbB1UOQXOFBvHwpbhPYWOExvL4SNUOQ7p4P2JTlzhOPmCu0vCu1PQpE2WOhk2MdJjk9y7HNwP1wEPUJbAcmZ6WTYrYolnifbxZBiibnFySHQCkUaLdY7C0V4%2FT5OhF1JcuIW6%2B0lOcvsBi2Ezao3j8Ov7Quwj52w60jNKIs1R5GatVaDDoEXSU4D7GSxbidYT3IuwjusFK0mNUVMwaZNNbl%2B%2F87hoVCom0HthaQmnG3QB0lNPcxlCvz%2B0GtlZTuorCxYYlA%2FDzbY%2FnrAgV3hCVLzCDMgEAi9wMMi9IIM%2FUwnNXWwi5mwRaSmmmXA798xq%2F3Khp420VeE1LyS6eQeBhttSXgzywCCToIUCOyYZvKLOWWwkdfd6ORVpGYJM0F5efDe9mEQHGty2BWTmhVGO4PNBmOoKzMBxmo%2FhD25dWvljSbD5hjMkb9gT9lJq63Mzi1bKkbjloc7xBWtwiRrDASCVRi%2FRxA8if%2BvrawMTzYI%2FACpeUv2KFFtDcUyTKilCHcis8G1Ga7wHpLzG8wVFs1K7jaeUKHZfIxmkj9%2FM4S9x9RGiMEudo0QbCVu9Xqn5PWEwLUk5%2FP0iaXac53I0kAH9Sau4m54lo%2FdTMfyekLYKQZ7ub34AbMMlmw5irC2VYTN0fuVMYMf8JHxJ7L7YYXAlSRnI2%2F8RtH4siTsDMz%2BZ5yS15OEXUxyDjGD1%2BvEq8MG16CDzY6JepKwT6geYbzxb0XjGMl7vwGSgzZIwo4nOa1M8Yr9Afb%2Fj8L21%2FsXaeaNZ2A6KTiEASph%2F0vF80cn4tokqu79fzfCUk2vfF4%2FFdFGEjGPHvg2yWrsDG%2F4%2BqpZB8jPOiXjWk0y5iXdM3XhKUvxBTA9UvHuvNPh%2Bzb%2BWj10z6nwuHWBbQFMvNCjKnn7qd1jS%2Fnx9VX3b6jC%2BbwOr5eMe3%2B83IcW4%2F3qgT%2BUTbA9srGaiHsn8AKiF6Ld%2FxF%2FOx6eeAJXabvK78MTTornNMd6XJTVR7%2Fj9bBjhFxV%2FMc1kJOAy2AeA%2FgrV4mFVDZFCqm8rEJ6qysCAWqK9iaztRJRbWXa4moFTELOav7jY%2FqAvoXp0Gc9NX7bIZl17%2FZl0rC1wRLeno0NvP%2B0CTcYNnS8wW6CtzNANaxzKqo9hRNOQ8rGo7tmSsMe2zWdt2frqVRcm5s2fofCgawDNHRNxnyfqgsYez4y4ADCjRM9H73hsNWafILTQdaFiSTj%2BQ%2FxA6yH7d%2BCmR8XbYr0a7VTF2N4siSsb5qdos3R6%2FjGxpULFfw7EfORnbrI9TAToX0sD40%2F2ylcGdh2Rdhg%2BSf2gka9jRTqK9%2BGwgHz7RTfVbHxirDhivdthYUvMRX8aYAD9lstvi%2B0aDL2DUZ0eCBUNNVG0IP65FLTWqPdiqdC0koHTVXe7iyNRG23QotBEy1RbTAzQyrmnYUT2rLsoA13JpcB4eVC2daBM1g2JGLekmwf5On7EJfngfZTNnVSce8bFjaTmQdvs%2FXmO%2FJVpoXdx3RSUe9O00Fj3nUdy0RLgRHiHXOPGW1h2uKZ07c9rG%2Bxyefp23pQeyBIEQoavYlakrG8fnrY5yHn2fbxXzAgw7m8bT5zkkSk4C7cpmOK21esB%2FXAQ5DzFfTo43%2BF%2FDzf0eZ4wZ3MDSjMcvD6nIeOahGgia%2FyU3HforTPkWkwnakdn0cI9jqfbPjD%2FuQLJr6644snlgX%2FApOMoyd1R5%2FxAAAAAElFTkSuQmCC)](https://linuxgsm.com) [![Build Status](https://travis-ci.com/GameServerManagers/LinuxGSM.svg?branch=master)](https://travis-ci.com/GameServerManagers/LinuxGSM) [![Codacy Badge](https://api.codacy.com/project/badge/Grade/3e98be27840043a090c3ab6e35db44b0)](https://app.codacy.com/app/GameServerManagers/LinuxGSM?utm_source=github.com&utm_medium=referral&utm_content=GameServerManagers/LinuxGSM&utm_campaign=Badge_Grade_Dashboard) [![Codacy Badge](https://api.codacy.com/project/badge/Coverage/9ef77095e98a43618ddd57381f86b4be)](https://www.codacy.com/manual/GameServerManagers/LinuxGSM?utm_source=github.com&utm_medium=referral&utm_content=GameServerManagers/LinuxGSM&utm_campaign=Badge_Coverage) [![Discord](https://discordapp.com/api/guilds/127498813903601664/widget.png?style=shield)](https://linuxgsm.com/discord) [![MIT Licence](https://badges.frapsoft.com/os/mit/mit.svg?v=103)](https://github.com/GameServerManagers/LinuxGSM/blob/master/LICENSE) [![made-with-bash](https://img.shields.io/badge/-Made%20with%20Bash-1f425f.svg?logo=image%2Fpng%3Bbase64%2CiVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyZpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw%2FeHBhY2tldCBiZWdpbj0i77u%2FIiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8%2BIDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNi1jMTExIDc5LjE1ODMyNSwgMjAxNS8wOS8xMC0wMToxMDoyMCAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENDIDIwMTUgKFdpbmRvd3MpIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOkE3MDg2QTAyQUZCMzExRTVBMkQxRDMzMkJDMUQ4RDk3IiB4bXBNTTpEb2N1bWVudElEPSJ4bXAuZGlkOkE3MDg2QTAzQUZCMzExRTVBMkQxRDMzMkJDMUQ4RDk3Ij4gPHhtcE1NOkRlcml2ZWRGcm9tIHN0UmVmOmluc3RhbmNlSUQ9InhtcC5paWQ6QTcwODZBMDBBRkIzMTFFNUEyRDFEMzMyQkMxRDhEOTciIHN0UmVmOmRvY3VtZW50SUQ9InhtcC5kaWQ6QTcwODZBMDFBRkIzMTFFNUEyRDFEMzMyQkMxRDhEOTciLz4gPC9yZGY6RGVzY3JpcHRpb24%2BIDwvcmRmOlJERj4gPC94OnhtcG1ldGE%2BIDw%2FeHBhY2tldCBlbmQ9InIiPz6lm45hAAADkklEQVR42qyVa0yTVxzGn7d9Wy03MS2ii8s%2BeokYNQSVhCzOjXZOFNF4jx%2BMRmPUMEUEqVG36jo2thizLSQSMd4N8ZoQ8RKjJtooaCpK6ZoCtRXKpRempbTv5ey83bhkAUphz8fznvP8znn%2B%2F3NeEEJgNBoRRSmz0ub%2FfuxEacBg%2FDmYtiCjgo5NG2mBXq%2BH5I1ogMRk9Zbd%2BQU2e1ML6VPLOyf5tvBQ8yT1lG10imxsABm7SLs898GTpyYynEzP60hO3trHDKvMigUwdeaceacqzp7nOI4n0SSIIjl36ao4Z356OV07fSQAk6xJ3XGg%2BLCr1d1OYlVHp4eUHPnerU79ZA%2F1kuv1JQMAg%2BE4O2P23EumF3VkvHprsZKMzKwbRUXFEyTvSIEmTVbrysp%2BWr8wfQHGK6WChVa3bKUmdWou%2BjpArdGkzZ41c1zG%2Fu5uGH4swzd561F%2BuhIT4%2BLnSuPsv9%2BJKIpjNr9dXYOyk7%2FBZrcjIT4eCnoKgedJP4BEqhG77E3NKP31FO7cfQA5K0dSYuLgz2TwCWJSOBzG6crzKK%2BohNfni%2Bx6OMUMMNe%2Fgf7ocbw0v0acKg6J8Ql0q%2BT%2FAXR5PNi5dz9c71upuQqCKFAD%2BYhrZLEAmpodaHO3Qy6TI3NhBpbrshGtOWKOSMYwYGQM8nJzoFJNxP2HjyIQho4PewK6hBktoDcUwtIln4PjOWzflQ%2Be5yl0yCCYgYikTclGlxadio%2BBQCSiW1UXoVGrKYwH4RgMrjU1HAB4vR6LzWYfFUCKxfS8Ftk5qxHoCUQAUkRJaSEokkV6Y%2F%2BJUOC4hn6A39NVXVBYeNP8piH6HeA4fPbpdBQV5KOx0QaL1YppX3Jgk0TwH2Vg6S3u%2BdB91%2B%2FpuNYPYFl5uP5V7ZqvsrX7jxqMXR6ff3gCQSTzFI0a1TX3wIs8ul%2Bq4HuWAAiM39vhOuR1O1fQ2gT%2F26Z8Z5vrl2OHi9OXZn995nLV9aFfS6UC9JeJPfuK0NBohWpCHMSAAsFe74WWP%2BvT25wtP9Bpob6uGqqyDnOtaeumjRu%2ByFu36VntK%2FPA5umTJeUtPWZSU9BCgud661odVp3DZtkc7AnYR33RRC708PrVi1larW7XwZIjLnd7R6SgSqWSNjU1B3F72pz5TZbXmX5vV81Yb7Lg7XT%2FUXriu8XLVqw6c6XqWnBKiiYU%2BMt3wWF7u7i91XlSEITwSAZ%2FCzAAHsJVbwXYFFEAAAAASUVORK5CYII%3D)](https://www.gnu.org/software/bash/) [![All Contributors](https://img.shields.io/badge/all_contributors-9-orange.svg?style=flat-square)](#contributors) +[![LinuxGSM](https://img.shields.io/badge/-LinuxGSM-2b2b2b.svg?logo=data%3Aimage%2Fpng%3Bbase64%2CiVBORw0KGgoAAAANSUhEUgAAACsAAABACAYAAACDbo5ZAAAGD0lEQVR4AcWYa2wUVRvHz75c2vJ2disXoUBEVIioRAx%2BMIFA1IRwUS6KCCiIKBrvhEYiiGm5iBgk8QOGEgUUDYTttmVZWFr2UmwURS6iYAoCtmisElSsdHdbkT7%2BTzoNy%2BGc2dm54C%2F5Rdkz85x%2FZ86ZOXOYXYhIg3Phx%2FA4PAcv6f%2Btg5vhHJjP3EcZsgsshufJHH%2FAJbDztQ7aG35J1vgCXn%2BtgvrgEbLHYei9FmE3kDOUuh10OGwjZ7gEh7kZ9gNyllK3gnrg7%2BQs56DHjbCDyB0GuRF2ArnDeDfCziF3mO1G2FfJHRa4EXYpuUOxG2GXkzuUuBH2TXKH5W6ELSV3eM%2BNsOUk5yQcAY8p2uvgSPitor3MjbB1UOQXOFBvHwpbhPYWOExvL4SNUOQ7p4P2JTlzhOPmCu0vCu1PQpE2WOhk2MdJjk9y7HNwP1wEPUJbAcmZ6WTYrYolnifbxZBiibnFySHQCkUaLdY7C0V4%2FT5OhF1JcuIW6%2B0lOcvsBi2Ezao3j8Ov7Quwj52w60jNKIs1R5GatVaDDoEXSU4D7GSxbidYT3IuwjusFK0mNUVMwaZNNbl%2B%2F87hoVCom0HthaQmnG3QB0lNPcxlCvz%2B0GtlZTuorCxYYlA%2FDzbY%2FnrAgV3hCVLzCDMgEAi9wMMi9IIM%2FUwnNXWwi5mwRaSmmmXA798xq%2F3Khp420VeE1LyS6eQeBhttSXgzywCCToIUCOyYZvKLOWWwkdfd6ORVpGYJM0F5efDe9mEQHGty2BWTmhVGO4PNBmOoKzMBxmo%2FhD25dWvljSbD5hjMkb9gT9lJq63Mzi1bKkbjloc7xBWtwiRrDASCVRi%2FRxA8if%2BvrawMTzYI%2FACpeUv2KFFtDcUyTKilCHcis8G1Ga7wHpLzG8wVFs1K7jaeUKHZfIxmkj9%2FM4S9x9RGiMEudo0QbCVu9Xqn5PWEwLUk5%2FP0iaXac53I0kAH9Sau4m54lo%2FdTMfyekLYKQZ7ub34AbMMlmw5irC2VYTN0fuVMYMf8JHxJ7L7YYXAlSRnI2%2F8RtH4siTsDMz%2BZ5yS15OEXUxyDjGD1%2BvEq8MG16CDzY6JepKwT6geYbzxb0XjGMl7vwGSgzZIwo4nOa1M8Yr9Afb%2Fj8L21%2FsXaeaNZ2A6KTiEASph%2F0vF80cn4tokqu79fzfCUk2vfF4%2FFdFGEjGPHvg2yWrsDG%2F4%2BqpZB8jPOiXjWk0y5iXdM3XhKUvxBTA9UvHuvNPh%2Bzb%2BWj10z6nwuHWBbQFMvNCjKnn7qd1jS%2Fnx9VX3b6jC%2BbwOr5eMe3%2B83IcW4%2F3qgT%2BUTbA9srGaiHsn8AKiF6Ld%2FxF%2FOx6eeAJXabvK78MTTornNMd6XJTVR7%2Fj9bBjhFxV%2FMc1kJOAy2AeA%2FgrV4mFVDZFCqm8rEJ6qysCAWqK9iaztRJRbWXa4moFTELOav7jY%2FqAvoXp0Gc9NX7bIZl17%2FZl0rC1wRLeno0NvP%2B0CTcYNnS8wW6CtzNANaxzKqo9hRNOQ8rGo7tmSsMe2zWdt2frqVRcm5s2fofCgawDNHRNxnyfqgsYez4y4ADCjRM9H73hsNWafILTQdaFiSTj%2BQ%2FxA6yH7d%2BCmR8XbYr0a7VTF2N4siSsb5qdos3R6%2FjGxpULFfw7EfORnbrI9TAToX0sD40%2F2ylcGdh2Rdhg%2BSf2gka9jRTqK9%2BGwgHz7RTfVbHxirDhivdthYUvMRX8aYAD9lstvi%2B0aDL2DUZ0eCBUNNVG0IP65FLTWqPdiqdC0koHTVXe7iyNRG23QotBEy1RbTAzQyrmnYUT2rLsoA13JpcB4eVC2daBM1g2JGLekmwf5On7EJfngfZTNnVSce8bFjaTmQdvs%2FXmO%2FJVpoXdx3RSUe9O00Fj3nUdy0RLgRHiHXOPGW1h2uKZ07c9rG%2Bxyefp23pQeyBIEQoavYlakrG8fnrY5yHn2fbxXzAgw7m8bT5zkkSk4C7cpmOK21esB%2FXAQ5DzFfTo43%2BF%2FDzf0eZ4wZ3MDSjMcvD6nIeOahGgia%2FyU3HforTPkWkwnakdn0cI9jqfbPjD%2FuQLJr6644snlgX%2FApOMoyd1R5%2FxAAAAAElFTkSuQmCC)](https://linuxgsm.com) [![Build Status](https://travis-ci.com/GameServerManagers/LinuxGSM.svg?branch=master)](https://travis-ci.com/GameServerManagers/LinuxGSM) [![Codacy Badge](https://api.codacy.com/project/badge/Grade/3e98be27840043a090c3ab6e35db44b0)](https://app.codacy.com/app/GameServerManagers/LinuxGSM?utm_source=github.com&utm_medium=referral&utm_content=GameServerManagers/LinuxGSM&utm_campaign=Badge_Grade_Dashboard) [![Codacy Badge](https://api.codacy.com/project/badge/Coverage/9ef77095e98a43618ddd57381f86b4be)](https://www.codacy.com/manual/GameServerManagers/LinuxGSM?utm_source=github.com&utm_medium=referral&utm_content=GameServerManagers/LinuxGSM&utm_campaign=Badge_Coverage) [![Backup Repo](https://github.com/GameServerManagers/LinuxGSM/workflows/Backup%20Repo/badge.svg)](https://bitbucket.org/GameServerManagers/linuxgsm) [![Discord](https://discordapp.com/api/guilds/127498813903601664/widget.png?style=shield)](https://linuxgsm.com/discord) [![MIT Licence](https://badges.frapsoft.com/os/mit/mit.svg?v=103)](https://github.com/GameServerManagers/LinuxGSM/blob/master/LICENSE) [![made-with-bash](https://img.shields.io/badge/-Made%20with%20Bash-1f425f.svg?logo=image%2Fpng%3Bbase64%2CiVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyZpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw%2FeHBhY2tldCBiZWdpbj0i77u%2FIiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8%2BIDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNi1jMTExIDc5LjE1ODMyNSwgMjAxNS8wOS8xMC0wMToxMDoyMCAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENDIDIwMTUgKFdpbmRvd3MpIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOkE3MDg2QTAyQUZCMzExRTVBMkQxRDMzMkJDMUQ4RDk3IiB4bXBNTTpEb2N1bWVudElEPSJ4bXAuZGlkOkE3MDg2QTAzQUZCMzExRTVBMkQxRDMzMkJDMUQ4RDk3Ij4gPHhtcE1NOkRlcml2ZWRGcm9tIHN0UmVmOmluc3RhbmNlSUQ9InhtcC5paWQ6QTcwODZBMDBBRkIzMTFFNUEyRDFEMzMyQkMxRDhEOTciIHN0UmVmOmRvY3VtZW50SUQ9InhtcC5kaWQ6QTcwODZBMDFBRkIzMTFFNUEyRDFEMzMyQkMxRDhEOTciLz4gPC9yZGY6RGVzY3JpcHRpb24%2BIDwvcmRmOlJERj4gPC94OnhtcG1ldGE%2BIDw%2FeHBhY2tldCBlbmQ9InIiPz6lm45hAAADkklEQVR42qyVa0yTVxzGn7d9Wy03MS2ii8s%2BeokYNQSVhCzOjXZOFNF4jx%2BMRmPUMEUEqVG36jo2thizLSQSMd4N8ZoQ8RKjJtooaCpK6ZoCtRXKpRempbTv5ey83bhkAUphz8fznvP8znn%2B%2F3NeEEJgNBoRRSmz0ub%2FfuxEacBg%2FDmYtiCjgo5NG2mBXq%2BH5I1ogMRk9Zbd%2BQU2e1ML6VPLOyf5tvBQ8yT1lG10imxsABm7SLs898GTpyYynEzP60hO3trHDKvMigUwdeaceacqzp7nOI4n0SSIIjl36ao4Z356OV07fSQAk6xJ3XGg%2BLCr1d1OYlVHp4eUHPnerU79ZA%2F1kuv1JQMAg%2BE4O2P23EumF3VkvHprsZKMzKwbRUXFEyTvSIEmTVbrysp%2BWr8wfQHGK6WChVa3bKUmdWou%2BjpArdGkzZ41c1zG%2Fu5uGH4swzd561F%2BuhIT4%2BLnSuPsv9%2BJKIpjNr9dXYOyk7%2FBZrcjIT4eCnoKgedJP4BEqhG77E3NKP31FO7cfQA5K0dSYuLgz2TwCWJSOBzG6crzKK%2BohNfni%2Bx6OMUMMNe%2Fgf7ocbw0v0acKg6J8Ql0q%2BT%2FAXR5PNi5dz9c71upuQqCKFAD%2BYhrZLEAmpodaHO3Qy6TI3NhBpbrshGtOWKOSMYwYGQM8nJzoFJNxP2HjyIQho4PewK6hBktoDcUwtIln4PjOWzflQ%2Be5yl0yCCYgYikTclGlxadio%2BBQCSiW1UXoVGrKYwH4RgMrjU1HAB4vR6LzWYfFUCKxfS8Ftk5qxHoCUQAUkRJaSEokkV6Y%2F%2BJUOC4hn6A39NVXVBYeNP8piH6HeA4fPbpdBQV5KOx0QaL1YppX3Jgk0TwH2Vg6S3u%2BdB91%2B%2FpuNYPYFl5uP5V7ZqvsrX7jxqMXR6ff3gCQSTzFI0a1TX3wIs8ul%2Bq4HuWAAiM39vhOuR1O1fQ2gT%2F26Z8Z5vrl2OHi9OXZn995nLV9aFfS6UC9JeJPfuK0NBohWpCHMSAAsFe74WWP%2BvT25wtP9Bpob6uGqqyDnOtaeumjRu%2ByFu36VntK%2FPA5umTJeUtPWZSU9BCgud661odVp3DZtkc7AnYR33RRC708PrVi1larW7XwZIjLnd7R6SgSqWSNjU1B3F72pz5TZbXmX5vV81Yb7Lg7XT%2FUXriu8XLVqw6c6XqWnBKiiYU%2BMt3wWF7u7i91XlSEITwSAZ%2FCzAAHsJVbwXYFFEAAAAASUVORK5CYII%3D)](https://www.gnu.org/software/bash/) [LinuxGSM](https://linuxgsm.com) is the command-line tool for quick, simple deployment and management of Linux dedicated game servers. @@ -47,17 +47,9 @@ There are a various ways to get support, check out the [support](https://linuxgs ## :heart: Donate -If you would like to [donate](https://linuxgsm.com/donate) to the project there are several ways you can, via [Patreon](https://www.patreon.com/dgibbs), [Ko-Fi](https://ko-fi.com/dgibbs) and [PayPal](https://www.paypal.me/dgibbs64). I would like to thank everyone who has previously sent a donation. Since 2012 LinuxGSM has been steadily growing with new servers, features and improvements added regularly. +If you would like to [donate](https://linuxgsm.com/donate) to the project there are several ways you can, via [GitHub Sponsors](https://github.com/sponsors/dgibbs64), [Patreon](https://www.patreon.com/dgibbs) and [PayPal](https://www.paypal.me/dgibbs64). I would like to thank everyone who has previously sent a donation. Since 2012 LinuxGSM has been steadily growing with new servers, features and improvements added regularly. ## Contributors -Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/docs/en/emoji-key)): - - - -
Daniel Gibbs
Daniel Gibbs

🐛 💻 🤔 💬 👀 🖋 📖 🚇
Frisasky
Frisasky

💬 🐛 💻
Kenny Lindelof
Kenny Lindelof

💬
Austin Shapiro
Austin Shapiro

🐛 💻
Marvin Lehmann
Marvin Lehmann

🐛 💻
Bourne-ID
Bourne-ID

👀 🖋 📖 🚇 👀
CedarLUG
CedarLUG

🐛 💻 🤔 💬 👀
UltimateByte
UltimateByte

🐛 💻 📖 🤔 👀
Attila
Attila

💻 🐛
- - - -This project follows the [all-contributors](https://github.com/all-contributors/all-contributors) specification. Contributions of any kind welcome! +A big thank you goes to all the wonderful people who contribute ideas, code, docs and support to this project. From e7e26317f3121c6cd5ce83288337e174ee263265 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Mon, 11 May 2020 23:24:51 +0100 Subject: [PATCH 365/534] Update README.md --- README.md | 1 - 1 file changed, 1 deletion(-) diff --git a/README.md b/README.md index 7491edbde..2b0f05ec1 100644 --- a/README.md +++ b/README.md @@ -52,4 +52,3 @@ If you would like to [donate](https://linuxgsm.com/donate) to the project there ## Contributors A big thank you goes to all the wonderful people who contribute ideas, code, docs and support to this project. - From fba832c3ea9946ffc81b41f19912c37e5cb3ed22 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Wed, 13 May 2020 23:45:39 +0100 Subject: [PATCH 366/534] Update git-sync.yml --- .github/workflows/git-sync.yml | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/.github/workflows/git-sync.yml b/.github/workflows/git-sync.yml index b3d5ea171..69f9ae146 100644 --- a/.github/workflows/git-sync.yml +++ b/.github/workflows/git-sync.yml @@ -1,7 +1,11 @@ name: Backup Repo # This action will sync the github repo with a backup bitbucket repo. # This will allow LinuxGSM to use Bitbucket as and alternative download if github fails. -on: push +on: + push: + branches: + - master + - 'develop' jobs: repo-sync: runs-on: ubuntu-latest From b769f2c6cbea40656242de5a6a516d5985df5e1e Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Thu, 14 May 2020 00:28:53 +0100 Subject: [PATCH 367/534] fix(monitor): fix monitor timings and lockfile bug (#2882) * adjusting timings and fix lockfile bug * added sleep time to eol messages --- lgsm/functions/command_backup.sh | 16 +++++------ lgsm/functions/command_fastdl.sh | 3 -- lgsm/functions/command_mods_remove.sh | 1 - lgsm/functions/command_monitor.sh | 21 ++++---------- lgsm/functions/command_start.sh | 2 +- lgsm/functions/command_stop.sh | 6 +--- lgsm/functions/core_messages.sh | 41 ++++++++++++++++++++++++--- lgsm/functions/install_logs.sh | 1 - lgsm/functions/mods_core.sh | 4 --- 9 files changed, 52 insertions(+), 43 deletions(-) diff --git a/lgsm/functions/command_backup.sh b/lgsm/functions/command_backup.sh index 7666156d4..537e86f1c 100644 --- a/lgsm/functions/command_backup.sh +++ b/lgsm/functions/command_backup.sh @@ -22,15 +22,15 @@ fn_backup_trap(){ fn_print_removed_eol_nl fn_script_log_info "Backup ${backupname}.tar.gz: REMOVED" # Remove lock file. - rm -f "${lockdir:?}/.backup.lock" + rm -f "${lockdir:?}/backup.lock" core_exit.sh } -# Check if a backup is pending or has been aborted using .backup.lock. +# Check if a backup is pending or has been aborted using backup.lock. fn_backup_check_lockfile(){ - if [ -f "${lockdir}/.backup.lock" ]; then + if [ -f "${lockdir}/backup.lock" ]; then fn_print_info_nl "Lock file found: Backup is currently running" - fn_script_log_error "Lock file found: Backup is currently running: ${lockdir}/.backup.lock" + fn_script_log_error "Lock file found: Backup is currently running: ${lockdir}/backup.lock" core_exit.sh fi } @@ -115,9 +115,9 @@ fn_backup_migrate_olddir(){ fn_backup_create_lockfile(){ # Create lockfile. - date '+%s' > "${lockdir}/.backup.lock" + date '+%s' > "${lockdir}/backup.lock" fn_script_log_info "Lockfile generated" - fn_script_log_info "${lockdir}/.backup.lock" + fn_script_log_info "${lockdir}/backup.lock" # trap to remove lockfile on quit. trap fn_backup_trap INT } @@ -138,7 +138,7 @@ fn_backup_compression(){ core_exit.sh fi - tar -czf "${backupdir}/${backupname}.tar.gz" -C "${rootdir}" --exclude "${excludedir}" --exclude "${lockdir}/.backup.lock" ./. + tar -czf "${backupdir}/${backupname}.tar.gz" -C "${rootdir}" --exclude "${excludedir}" --exclude "${lockdir}/backup.lock" ./. local exitcode=$? if [ ${exitcode} -ne 0 ]; then fn_print_fail_eol @@ -152,7 +152,7 @@ fn_backup_compression(){ fn_script_log_pass "Backup created: ${backupname}.tar.gz, total size $(du -sh "${backupdir}/${backupname}.tar.gz" | awk '{print $1}')" fi # Remove lock file - rm -f "${lockdir:?}/.backup.lock" + rm -f "${lockdir:?}/backup.lock" } # Clear old backups according to maxbackups and maxbackupdays variables. diff --git a/lgsm/functions/command_fastdl.sh b/lgsm/functions/command_fastdl.sh index 335d02d9d..f6a5897db 100644 --- a/lgsm/functions/command_fastdl.sh +++ b/lgsm/functions/command_fastdl.sh @@ -77,7 +77,6 @@ fn_clear_old_fastdl(){ fn_print_ok_eol_nl fn_script_log_pass "Clearing existing FastDL directory ${fastdldir}" fi - fn_sleep_time fi } @@ -95,7 +94,6 @@ fn_fastdl_dirs(){ fn_print_ok_eol_nl fn_script_log_pass "Creating web directory ${webdir}" fi - fn_sleep_time fi if [ ! -d "${fastdldir}" ]; then echo -en "creating fastdl directory ${fastdldir}..." @@ -109,7 +107,6 @@ fn_fastdl_dirs(){ fn_print_ok_eol_nl fn_script_log_pass "Creating fastdl directory ${fastdldir}" fi - fn_sleep_time fi } diff --git a/lgsm/functions/command_mods_remove.sh b/lgsm/functions/command_mods_remove.sh index a8149e07b..35fd41d5f 100644 --- a/lgsm/functions/command_mods_remove.sh +++ b/lgsm/functions/command_mods_remove.sh @@ -87,7 +87,6 @@ if [ ${exitcode} -ne 0 ]; then else fn_print_ok_eol_nl fi -fn_sleep_time # Remove file list. echo -en "removing ${modcommand}-files.txt..." fn_sleep_time diff --git a/lgsm/functions/command_monitor.sh b/lgsm/functions/command_monitor.sh index 1df51768f..4b621c0d5 100644 --- a/lgsm/functions/command_monitor.sh +++ b/lgsm/functions/command_monitor.sh @@ -16,17 +16,15 @@ fn_monitor_check_lockfile(){ fn_print_dots "Checking lockfile: " fn_print_checking_eol fn_script_log_info "Checking lockfile: CHECKING" - fn_sleep_time fn_print_error "Checking lockfile: No lockfile found: " fn_print_error_eol_nl fn_script_log_error "Checking lockfile: No lockfile found: ERROR" - fn_sleep_time echo -e "* Start ${selfname} to run monitor." core_exit.sh fi # Fix if lockfile is not unix time or contains letters - if [[ "$(cat "${lockdir}/${selfname}.lock")" =~ [A-Za-z] ]]; then + if [ -f "${lockdir}/${selfname}.lock" ]&&[[ "$(cat "${lockdir}/${selfname}.lock")" =~ [A-Za-z] ]]; then date '+%s' > "${lockdir}/${selfname}.lock" fi } @@ -37,11 +35,9 @@ fn_monitor_check_update(){ fn_print_dots "Checking active updates: " fn_print_checking_eol fn_script_log_info "Checking active updates: CHECKING" - fn_sleep_time fn_print_error_nl "Checking active updates: SteamCMD is currently checking for updates: " fn_print_error_eol fn_script_log_error "Checking active updates: SteamCMD is currently checking for updates: ERROR" - fn_sleep_time core_exit.sh fi } @@ -50,18 +46,15 @@ fn_monitor_check_session(){ fn_print_dots "Checking session: " fn_print_checking_eol fn_script_log_info "Checking session: CHECKING" - fn_sleep_time # uses status var from check_status.sh if [ "${status}" != "0" ]; then fn_print_ok "Checking session: " fn_print_ok_eol_nl fn_script_log_pass "Checking session: OK" - fn_sleep_time else fn_print_error "Checking session: " fn_print_fail_eol_nl fn_script_log_fatal "Checking session: FAIL" - fn_sleep_time alert="restart" alert.sh fn_script_log_info "Checking session: Monitor is restarting ${selfname}" @@ -76,7 +69,6 @@ fn_monitor_check_queryport(){ fn_print_dots "Checking port: " fn_print_checking_eol fn_script_log_info "Checking port: CHECKING" - fn_sleep_time if [ -n "${rconenabled}" ]&&[ "${rconenabled}" != "true" ]&&[ ${shortname} == "av" ]; then fn_print_warn "Checking port: Unable to query as rconport, rcon not enabled: " fn_print_warn_eol_nl @@ -86,7 +78,6 @@ fn_monitor_check_queryport(){ fn_print_error_eol_nl fn_script_log_error "Checking port: Unable to query as queryport is not set: ERROR" fi - fn_sleep_time core_exit.sh fi } @@ -112,14 +103,14 @@ for queryattempt in {1..5}; do fn_print_dots "Querying port: ${querymethod}: ${ip}:${queryport} : ${totalseconds}/${queryattempt}: " fn_print_querying_eol fn_script_log_info "Querying port: ${querymethod}: ${ip}:${queryport} : ${queryattempt} : QUERYING" - fn_sleep_time # querydelay if [ "$(cat "${lockdir}/${selfname}.lock")" -gt "$(date "+%s" -d "${querydelay} mins ago")" ]; then fn_print_ok "Querying port: ${querymethod}: ${ip}:${queryport} : ${totalseconds}/${queryattempt}: " fn_print_delay_eol_nl fn_script_log_info "Querying port: ${querymethod}: ${ip}:${queryport} : ${queryattempt} : DELAY" fn_script_log_info "Query bypassed: ${gameservername} started less than ${querydelay} minutes ago" - fn_sleep_time + fn_script_log_info "Server started: $(date -d @$(cat lgsm/lock/bmdmserver.lock))" + fn_script_log_info "Current time: $(date)" monitorpass=1 core_exit.sh # will use query method selected in fn_monitor_loop @@ -139,7 +130,6 @@ for queryattempt in {1..5}; do fn_print_ok "Querying port: ${querymethod}: ${ip}:${queryport} : ${totalseconds}/${queryattempt}: " fn_print_ok_eol_nl fn_script_log_pass "Querying port: ${querymethod}: ${ip}:${queryport} : ${queryattempt}: OK" - fn_sleep_time monitorpass=1 if [ "${querystatus}" == "0" ]; then # Add query data to log. @@ -170,7 +160,6 @@ for queryattempt in {1..5}; do fn_print_fail "Querying port: ${querymethod}: ${ip}:${queryport} : ${totalseconds}/${queryattempt}: " fn_print_fail_eol fn_script_log_warn "Querying port: ${querymethod}: ${ip}:${queryport} : ${queryattempt}: FAIL" - fn_sleep_time # Monitor will try gamedig (if supported) for first 30s then gsquery before restarting. if [ "${querymethod}" == "gsquery" ]||[ "${querymethod}" == "tcp" ]; then # gsquery will fail if longer than 60s @@ -179,7 +168,6 @@ for queryattempt in {1..5}; do fn_print_fail "Querying port: ${querymethod}: ${ip}:${queryport} : ${totalseconds}/${queryattempt}: " fn_print_fail_eol_nl fn_script_log_warn "Querying port: ${querymethod}: ${ip}:${queryport} : ${queryattempt}: FAIL" - fn_sleep_time # Send alert if enabled. alert="restartquery" alert.sh @@ -195,7 +183,8 @@ for queryattempt in {1..5}; do # Second counter will wait for 15s before breaking loop. for seconds in {1..15}; do - fn_print_fail "Querying port: ${querymethod}: ${ip}:${queryport} : ${totalseconds}/${queryattempt}: WAIT" + fn_print_fail "Querying port: ${querymethod}: ${ip}:${queryport} : ${totalseconds}/${queryattempt}: ${cyan}WAIT${default}" + sleep 0.5 totalseconds=$((totalseconds + 1)) if [ "${seconds}" == "15" ]; then break diff --git a/lgsm/functions/command_start.sh b/lgsm/functions/command_start.sh index 497ca215a..6e4b445e8 100644 --- a/lgsm/functions/command_start.sh +++ b/lgsm/functions/command_start.sh @@ -62,7 +62,7 @@ fn_start_tmux(){ fi # Create lockfile - date > "${lockdir}/${selfname}.lock" + date '+%s' > "${lockdir}/${selfname}.lock" cd "${executabledir}" || exit tmux new-session -d -x "${sessionwidth}" -y "${sessionheight}" -s "${selfname}" "${executable} ${parms}" 2> "${lgsmlogdir}/.${selfname}-tmux-error.tmp" diff --git a/lgsm/functions/command_stop.sh b/lgsm/functions/command_stop.sh index 3a27ba8d8..e8ef68fa4 100644 --- a/lgsm/functions/command_stop.sh +++ b/lgsm/functions/command_stop.sh @@ -33,7 +33,6 @@ fn_stop_graceful_ctrlc(){ fn_print_fail_eol_nl fn_script_log_error "Graceful: CTRL+c: FAIL" fi - fn_sleep_time } # Attempts graceful shutdown by sending a specified command. @@ -62,7 +61,6 @@ fn_stop_graceful_cmd(){ fn_print_fail_eol_nl fn_script_log_error "Graceful: sending \"${1}\": FAIL" fi - fn_sleep_time } # Attempts graceful shutdown of goldsrc using rcon 'quit' command. @@ -178,7 +176,6 @@ fn_stop_graceful_sdtd(){ fn_print_fail_eol_nl fn_script_log_warn "Graceful: telnet: expect not installed: FAIL" fi - fn_sleep_time } # Attempts graceful shutdown by sending /save /stop. @@ -208,7 +205,6 @@ fn_stop_graceful_avorion(){ fn_print_fail_eol_nl fn_script_log_error "Graceful: /save /stop: FAIL" fi - fn_sleep_time } fn_stop_graceful_select(){ @@ -240,7 +236,7 @@ fn_stop_tmux(){ fn_script_log_info "tmux kill-session: ${servername}" # Kill tmux session. tmux kill-session -t "${selfname}" > /dev/null 2>&1 - fn_sleep_time + sleep 0.5 check_status.sh if [ "${status}" == "0" ]; then fn_print_ok_nl "${servername}" diff --git a/lgsm/functions/core_messages.sh b/lgsm/functions/core_messages.sh index fd7a4b2e4..a4914bdd9 100644 --- a/lgsm/functions/core_messages.sh +++ b/lgsm/functions/core_messages.sh @@ -354,100 +354,133 @@ fn_prompt_yn(){ # OK fn_print_ok_eol(){ echo -en "${green}OK${default}" + fn_sleep_time } fn_print_ok_eol_nl(){ echo -e "${green}OK${default}" + fn_sleep_time } # FAIL fn_print_fail_eol(){ echo -en "${red}FAIL${default}" + fn_sleep_time } fn_print_fail_eol_nl(){ echo -e "${red}FAIL${default}" + fn_sleep_time } # ERROR fn_print_error_eol(){ echo -en "${red}ERROR${default}" + fn_sleep_time } fn_print_error_eol_nl(){ echo -e "${red}ERROR${default}" + fn_sleep_time +} + +# WAIT +fn_print_wait_eol(){ + echo -en "${cyan}WAIT${default}" + fn_sleep_time +} + +fn_print_wait_eol_nl(){ + echo -e "${cyan}WAIT${default}" + fn_sleep_time } # WARN fn_print_warn_eol(){ echo -en "${lightyellow}WARN${default}" + fn_sleep_time } fn_print_warn_eol_nl(){ echo -e "${lightyellow}WARN${default}" + fn_sleep_time } # INFO fn_print_info_eol(){ - echo -en "${red}INFO${default}" + echo -en "${cyan}INFO${default}" + fn_sleep_time } fn_print_info_eol_nl(){ - echo -e "${red}INFO${default}" + echo -e "${cyan}INFO${default}" + fn_sleep_time } # QUERYING fn_print_querying_eol(){ echo -en "${cyan}QUERYING${default}" + fn_sleep_time } fn_print_querying_eol_nl(){ echo -e "${cyan}QUERYING${default}" + fn_sleep_time } # CHECKING fn_print_checking_eol(){ echo -en "${cyan}CHECKING${default}" + fn_sleep_time } fn_print_checking_eol_nl(){ echo -e "${cyan}CHECKING${default}" + fn_sleep_time } # DELAY fn_print_delay_eol(){ echo -en "${green}DELAY${default}" + fn_sleep_time } fn_print_delay_eol_nl(){ echo -e "${green}DELAY${default}" + fn_sleep_time } # CANCELED fn_print_canceled_eol(){ - echo -en "${yellow}CANCELED${default}" + echo -en "${lightyellow}CANCELED${default}" + fn_sleep_time } fn_print_canceled_eol_nl(){ - echo -e "${yellow}CANCELED${default}" + echo -e "${lightyellow}CANCELED${default}" + fn_sleep_time } # REMOVED fn_print_removed_eol(){ echo -en "${red}REMOVED${default}" + fn_sleep_time } fn_print_removed_eol_nl(){ echo -e "${red}REMOVED${default}" + fn_sleep_time } # UPDATE fn_print_update_eol(){ echo -en "${cyan}UPDATE${default}" + fn_sleep_time } fn_print_update_eol_nl(){ echo -e "${cyan}UPDATE${default}" + fn_sleep_time } fn_print_ascii_logo(){ diff --git a/lgsm/functions/install_logs.sh b/lgsm/functions/install_logs.sh index be54eb42d..21c63ccbb 100644 --- a/lgsm/functions/install_logs.sh +++ b/lgsm/functions/install_logs.sh @@ -96,5 +96,4 @@ if [ -d "${rootdir}/Steam/logs" ]; then fi fi fi -fn_sleep_time fn_script_log_info "Logs installed" diff --git a/lgsm/functions/mods_core.sh b/lgsm/functions/mods_core.sh index 7fc030210..8108e0d0e 100644 --- a/lgsm/functions/mods_core.sh +++ b/lgsm/functions/mods_core.sh @@ -59,7 +59,6 @@ fn_mod_lowercase(){ else fn_print_ok_eol_nl fi - fn_sleep_time fi } @@ -82,7 +81,6 @@ fn_mod_create_filelist(){ if [ -f "${modsdir}/.removedfiles.tmp" ]; then cat "${modsdir}/.removedfiles.tmp" >> "${modsdir}/${modcommand}-files.txt" fi - fn_sleep_time } # Copy the mod into serverfiles. @@ -392,7 +390,6 @@ fn_create_mods_dir(){ fn_print_ok_eol_nl fn_script_log_pass "Creating mod download dir ${modsdir}" fi - fn_sleep_time fi # Create mod install directory. if [ ! -d "${modinstalldir}" ]; then @@ -407,7 +404,6 @@ fn_create_mods_dir(){ fn_print_ok_eol_nl fn_script_log_pass "Creating mod install directory ${modinstalldir}" fi - fn_sleep_time fi # Create lgsm/data/${modsinstalledlist}. From c712dee139bb6dabb41da5c7dd70f9e618212679 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Fri, 15 May 2020 23:02:51 +0100 Subject: [PATCH 368/534] Update git-sync.yml --- .github/workflows/git-sync.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/git-sync.yml b/.github/workflows/git-sync.yml index 69f9ae146..addbba773 100644 --- a/.github/workflows/git-sync.yml +++ b/.github/workflows/git-sync.yml @@ -6,6 +6,7 @@ on: branches: - master - 'develop' + - 'feature/update-lgsm' jobs: repo-sync: runs-on: ubuntu-latest From 1c6c6112e143c189946fe799f5f4cd46786488ab Mon Sep 17 00:00:00 2001 From: n8rade <65125624+n8rade@users.noreply.github.com> Date: Tue, 19 May 2020 03:35:52 -0500 Subject: [PATCH 369/534] fix(update): Minecraft Bedrock issue causing update to not grab the version from logs --- lgsm/functions/update_minecraft_bedrock.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lgsm/functions/update_minecraft_bedrock.sh b/lgsm/functions/update_minecraft_bedrock.sh index 3336d13ff..564fb5c7b 100644 --- a/lgsm/functions/update_minecraft_bedrock.sh +++ b/lgsm/functions/update_minecraft_bedrock.sh @@ -33,7 +33,7 @@ fn_update_minecraft_localbuild(){ fn_print_dots "Checking local build: ${remotelocation}" # Uses log file to gather info. # Log is generated and cleared on startup but filled on shutdown. - localbuild=$(grep Version "$(ls -tr "${consolelogdir}"/* 2>/dev/null)" | tail -1 | sed 's/.*Version //') + localbuild=$(grep Version "${consolelogdir}"/* 2>/dev/null | tail -1 | sed 's/.*Version //') if [ -z "${localbuild}" ]; then fn_print_error "Checking local build: ${remotelocation}" fn_print_error_nl "Checking local build: ${remotelocation}: no log files containing version info" From 523daebd71cecfe3b785db3f4641ab0692c24676 Mon Sep 17 00:00:00 2001 From: WorthlessJ <43921046+WorthlessJ@users.noreply.github.com> Date: Tue, 19 May 2020 03:41:06 -0500 Subject: [PATCH 370/534] feat(install):Add config locations to install text (#2872) --- lgsm/functions/install_config.sh | 113 +++++++++++++++++++++++++++++++ 1 file changed, 113 insertions(+) diff --git a/lgsm/functions/install_config.sh b/lgsm/functions/install_config.sh index 13558e4da..8851a2e70 100644 --- a/lgsm/functions/install_config.sh +++ b/lgsm/functions/install_config.sh @@ -142,27 +142,50 @@ fn_set_dst_config_vars(){ echo -e "" } +# Lists local config file locations +fn_list_config_locations(){ + echo -e "" + echo -e "${lightyellow}Config File Locations${default}" + echo -e "=================================" + if [ -n "${servercfgfullpath}" ]; then + if [ -f "${servercfgfullpath}" ]; then + echo -e "Game Server Config File: ${servercfgfullpath}" + elif [ -d "${servercfgfullpath}" ]; then + echo -e "Game Server Config Dir: ${servercfgfullpath}" + else + echo -e "Config file: ${red}${servercfgfullpath} (${red}FILE MISSING${default})" + fi + fi + echo -e "LinuxGSM Config: ${lgsmdir}/config-lgsm/${gameservername}" + echo -e "Documentation: https://docs.linuxgsm.com/configuration/game-server-config" + echo -e "" +} + if [ "${shortname}" == "sdtd" ]; then gamedirname="7DaysToDie" fn_default_config_local + fn_list_config_locations elif [ "${shortname}" == "ac" ]; then gamedirname="AssettoCorsa" array_configs+=( server_cfg.ini ) fn_fetch_default_config fn_default_config_remote fn_set_config_vars + fn_list_config_locations elif [ "${shortname}" == "ahl" ]; then gamedirname="ActionHalfLife" array_configs+=( server.cfg ) fn_fetch_default_config fn_default_config_remote fn_set_config_vars + fn_list_config_locations elif [ "${shortname}" == "ahl2" ]; then gamedirname="ActionSource" array_configs+=( server.cfg ) fn_fetch_default_config fn_default_config_remote fn_set_config_vars + fn_list_config_locations elif [ "${shortname}" == "ark" ]; then gamedirname="ARKSurvivalEvolved" fn_check_cfgdir @@ -170,6 +193,7 @@ elif [ "${shortname}" == "ark" ]; then fn_fetch_default_config fn_default_config_remote fn_set_config_vars + fn_list_config_locations elif [ "${shortname}" == "arma3" ]; then gamedirname="Arma3" fn_check_cfgdir @@ -177,18 +201,21 @@ elif [ "${shortname}" == "arma3" ]; then fn_fetch_default_config fn_default_config_remote fn_set_config_vars + fn_list_config_locations elif [ "${shortname}" == "bo" ]; then gamedirname="BallisticOverkill" array_configs+=( config.txt ) fn_fetch_default_config fn_default_config_remote fn_set_config_vars + fn_list_config_locations elif [ "${shortname}" == "bo" ]; then gamedirname="BaseDefense" array_configs+=( server.cfg ) fn_fetch_default_config fn_default_config_remote fn_set_config_vars + fn_list_config_locations elif [ "${shortname}" == "bt" ]; then gamedirname="Barotrauma" fn_check_cfgdir @@ -196,6 +223,7 @@ elif [ "${shortname}" == "bt" ]; then fn_fetch_default_config fn_default_config_remote fn_set_config_vars + fn_list_config_locations elif [ "${shortname}" == "bt1944" ]; then gamedirname="Battalion1944" fn_check_cfgdir @@ -203,120 +231,140 @@ elif [ "${shortname}" == "bt1944" ]; then fn_fetch_default_config fn_default_config_remote fn_set_config_vars + fn_list_config_locations elif [ "${shortname}" == "bf1942" ]; then gamedirname="Battlefield1942" array_configs+=( serversettings.con ) fn_fetch_default_config fn_default_config_remote fn_set_config_vars + fn_list_config_locations elif [ "${shortname}" == "bs" ]; then gamedirname="BladeSymphony" array_configs+=( server.cfg ) fn_fetch_default_config fn_default_config_remote fn_set_config_vars + fn_list_config_locations elif [ "${shortname}" == "bb" ]; then gamedirname="BrainBread" array_configs+=( server.cfg ) fn_fetch_default_config fn_default_config_remote fn_set_config_vars + fn_list_config_locations elif [ "${shortname}" == "bb2" ]; then gamedirname="BrainBread2" array_configs+=( server.cfg ) fn_fetch_default_config fn_default_config_remote fn_set_config_vars + fn_list_config_locations elif [ "${shortname}" == "bmdm" ]; then gamedirname="BlackMesa" array_configs+=( server.cfg ) fn_fetch_default_config fn_default_config_remote fn_set_config_vars + fn_list_config_locations elif [ "${shortname}" == "cod" ]; then gamedirname="CallOfDuty" array_configs+=( server.cfg ) fn_fetch_default_config fn_default_config_remote fn_set_config_vars + fn_list_config_locations elif [ "${shortname}" == "coduo" ]; then gamedirname="CallOfDutyUnitedOffensive" array_configs+=( server.cfg ) fn_fetch_default_config fn_default_config_remote fn_set_config_vars + fn_list_config_locations elif [ "${shortname}" == "cod2" ]; then gamedirname="CallOfDuty2" array_configs+=( server.cfg ) fn_fetch_default_config fn_default_config_remote fn_set_config_vars + fn_list_config_locations elif [ "${shortname}" == "cod4" ]; then gamedirname="CallOfDuty4" array_configs+=( server.cfg ) fn_fetch_default_config fn_default_config_remote fn_set_config_vars + fn_list_config_locations elif [ "${shortname}" == "codwaw" ]; then gamedirname="CallOfDutyWorldAtWar" array_configs+=( server.cfg ) fn_fetch_default_config fn_default_config_remote fn_set_config_vars + fn_list_config_locations elif [ "${shortname}" == "cc" ]; then gamedirname="CodenameCURE" array_configs+=( server.cfg ) fn_fetch_default_config fn_default_config_remote fn_set_config_vars + fn_list_config_locations elif [ "${shortname}" == "cs" ]; then gamedirname="CounterStrike" array_configs+=( server.cfg ) fn_fetch_default_config fn_default_config_remote fn_set_config_vars + fn_list_config_locations elif [ "${shortname}" == "cscz" ]; then gamedirname="CounterStrikeConditionZero" array_configs+=( server.cfg ) fn_fetch_default_config fn_default_config_remote fn_set_config_vars + fn_list_config_locations elif [ "${shortname}" == "csgo" ]; then gamedirname="CounterStrikeGlobalOffensive" array_configs+=( server.cfg ) fn_fetch_default_config fn_default_config_remote fn_set_config_vars + fn_list_config_locations elif [ "${shortname}" == "css" ]; then gamedirname="CounterStrikeSource" array_configs+=( server.cfg ) fn_fetch_default_config fn_default_config_remote fn_set_config_vars + fn_list_config_locations elif [ "${shortname}" == "dod" ]; then gamedirname="DayOfDefeat" array_configs+=( server.cfg ) fn_fetch_default_config fn_default_config_remote fn_set_config_vars + fn_list_config_locations elif [ "${shortname}" == "dods" ]; then gamedirname="DayOfDefeatSource" array_configs+=( server.cfg ) fn_fetch_default_config fn_default_config_remote fn_set_config_vars + fn_list_config_locations elif [ "${shortname}" == "doi" ]; then gamedirname="DayOfInfamy" array_configs+=( server.cfg ) fn_fetch_default_config fn_default_config_remote fn_set_config_vars + fn_list_config_locations elif [ "${shortname}" == "dmc" ]; then gamedirname="DeathmatchClassic" array_configs+=( server.cfg ) fn_fetch_default_config fn_default_config_remote fn_set_config_vars + fn_list_config_locations elif [ "${shortname}" == "dst" ]; then gamedirname="DontStarveTogether" fn_check_cfgdir @@ -324,138 +372,161 @@ elif [ "${shortname}" == "dst" ]; then fn_fetch_default_config fn_default_config_remote fn_set_dst_config_vars + fn_list_config_locations elif [ "${shortname}" == "dab" ]; then gamedirname="DoubleActionBoogaloo" array_configs+=( server.cfg ) fn_fetch_default_config fn_default_config_remote fn_set_config_vars + fn_list_config_locations elif [ "${shortname}" == "dys" ]; then gamedirname="Dystopia" array_configs+=( server.cfg ) fn_fetch_default_config fn_default_config_remote fn_set_config_vars + fn_list_config_locations elif [ "${shortname}" == "eco" ]; then gamedirname="Eco" array_configs+=( Network.eco ) fn_fetch_default_config fn_default_config_remote fn_set_config_vars + fn_list_config_locations elif [ "${shortname}" == "etl" ]; then gamedirname="ETLegacy" array_configs+=( server.cfg ) fn_fetch_default_config fn_default_config_remote fn_set_config_vars + fn_list_config_locations elif [ "${shortname}" == "fctr" ]; then gamedirname="Factorio" array_configs+=( server-settings.json ) fn_fetch_default_config fn_default_config_remote fn_set_config_vars + fn_list_config_locations elif [ "${shortname}" == "fof" ]; then gamedirname="FistfulofFrags" array_configs+=( server.cfg ) fn_fetch_default_config fn_default_config_remote fn_set_config_vars + fn_list_config_locations elif [ "${shortname}" == "gmod" ]; then gamedirname="GarrysMod" array_configs+=( server.cfg ) fn_fetch_default_config fn_default_config_remote fn_set_config_vars + fn_list_config_locations elif [ "${shortname}" == "ges" ]; then gamedirname="GoldenEyeSource" array_configs+=( server.cfg ) fn_fetch_default_config fn_default_config_remote fn_set_config_vars + fn_list_config_locations elif [ "${shortname}" == "hldm" ]; then gamedirname="HalfLifeDeathmatch" array_configs+=( server.cfg ) fn_fetch_default_config fn_default_config_remote fn_set_config_vars + fn_list_config_locations elif [ "${shortname}" == "hldms" ]; then gamedirname="HalfLifeDeathmatchSource" array_configs+=( server.cfg ) fn_fetch_default_config fn_default_config_remote fn_set_config_vars + fn_list_config_locations elif [ "${shortname}" == "opfor" ]; then gamedirname="OpposingForce" array_configs+=( server.cfg ) fn_fetch_default_config fn_default_config_remote fn_set_config_vars + fn_list_config_locations elif [ "${shortname}" == "hl2dm" ]; then gamedirname="HalfLife2Deathmatch" array_configs+=( server.cfg ) fn_fetch_default_config fn_default_config_remote fn_set_config_vars + fn_list_config_locations elif [ "${shortname}" == "ins" ]; then gamedirname="Insurgency" array_configs+=( server.cfg ) fn_fetch_default_config fn_default_config_remote fn_set_config_vars + fn_list_config_locations elif [ "${shortname}" == "ios" ]; then gamedirname="IOSoccer" array_configs+=( server.cfg ) fn_fetch_default_config fn_default_config_remote fn_set_config_vars + fn_list_config_locations elif [ "${shortname}" == "jc2" ]; then gamedirname="JustCause2" array_configs+=( config.lua ) fn_fetch_default_config fn_default_config_remote fn_set_config_vars + fn_list_config_locations elif [ "${shortname}" == "jc3" ]; then gamedirname="JustCause3" array_configs+=( config.json ) fn_fetch_default_config fn_default_config_remote fn_set_config_vars + fn_list_config_locations elif [ "${shortname}" == "kf" ]; then gamedirname="KillingFloor" array_configs+=( Default.ini ) fn_fetch_default_config fn_default_config_remote fn_set_config_vars + fn_list_config_locations elif [ "${shortname}" == "l4d" ]; then gamedirname="Left4Dead" array_configs+=( server.cfg ) fn_fetch_default_config fn_default_config_remote fn_set_config_vars + fn_list_config_locations elif [ "${shortname}" == "l4d2" ]; then gamedirname="Left4Dead2" array_configs+=( server.cfg ) fn_fetch_default_config fn_default_config_remote fn_set_config_vars + fn_list_config_locations elif [ "${shortname}" == "mc" ]; then gamedirname="Minecraft" array_configs+=( server.properties ) fn_fetch_default_config fn_default_config_remote fn_set_config_vars + fn_list_config_locations elif [ "${shortname}" == "mcb" ]; then gamedirname="MinecraftBedrock" array_configs+=( server.properties ) fn_fetch_default_config fn_default_config_remote fn_set_config_vars + fn_list_config_locations elif [ "${shortname}" == "mohaa" ]; then gamedirname="MedalOfHonorAlliedAssault" array_configs+=( server.cfg ) fn_fetch_default_config fn_default_config_remote fn_set_config_vars + fn_list_config_locations elif [ "${shortname}" == "mh" ]; then gamedirname="Mordhau" fn_check_cfgdir @@ -463,41 +534,48 @@ elif [ "${shortname}" == "mh" ]; then fn_fetch_default_config fn_default_config_remote fn_set_config_vars + fn_list_config_locations elif [ "${shortname}" == "ns" ]; then gamedirname="NaturalSelection" array_configs+=( server.cfg ) fn_fetch_default_config fn_default_config_remote fn_set_config_vars + fn_list_config_locations elif [ "${shortname}" == "nmrih" ]; then gamedirname="NoMoreRoominHell" array_configs+=( server.cfg ) fn_fetch_default_config fn_default_config_remote fn_set_config_vars + fn_list_config_locations elif [ "${shortname}" == "nd" ]; then gamedirname="NuclearDawn" array_configs+=( server.cfg ) fn_fetch_default_config fn_default_config_remote fn_set_config_vars + fn_list_config_locations elif [ "${shortname}" == "mta" ]; then gamedirname="MultiTheftAuto" fn_check_cfgdir array_configs+=( acl.xml mtaserver.conf vehiclecolors.conf ) fn_fetch_default_config fn_default_config_remote + fn_list_config_locations elif [ "${shortname}" == "mumble" ]; then gamedirname="Mumble" array_configs+=( murmur.ini ) fn_fetch_default_config fn_default_config_remote + fn_list_config_locations elif [ "${shortname}" == "pvkii" ]; then gamedirname="PiratesVikingandKnightsII" array_configs+=( server.cfg ) fn_fetch_default_config fn_default_config_remote fn_set_config_vars + fn_list_config_locations elif [ "${shortname}" == "pz" ]; then gamedirname="ProjectZomboid" fn_check_cfgdir @@ -505,143 +583,167 @@ elif [ "${shortname}" == "pz" ]; then fn_fetch_default_config fn_default_config_remote fn_set_config_vars + fn_list_config_locations elif [ "${shortname}" == "pc" ]; then gamedirname="ProjectCars" array_configs+=( server.cfg ) fn_fetch_default_config fn_default_config_remote fn_set_config_vars + fn_list_config_locations elif [ "${shortname}" == "q2" ]; then gamedirname="Quake2" array_configs+=( server.cfg ) fn_fetch_default_config fn_default_config_remote fn_set_config_vars + fn_list_config_locations elif [ "${shortname}" == "q3" ]; then gamedirname="Quake3Arena" array_configs+=( server.cfg ) fn_fetch_default_config fn_default_config_remote fn_set_config_vars + fn_list_config_locations elif [ "${shortname}" == "ql" ]; then gamedirname="QuakeLive" array_configs+=( server.cfg ) fn_fetch_default_config fn_default_config_remote fn_set_config_vars + fn_list_config_locations elif [ "${shortname}" == "qw" ]; then gamedirname="QuakeWorld" array_configs+=( server.cfg ) fn_fetch_default_config fn_default_config_remote fn_set_config_vars + fn_list_config_locations elif [ "${shortname}" == "ricochet" ]; then gamedirname="Ricochet" array_configs+=( server.cfg ) fn_fetch_default_config fn_default_config_remote fn_set_config_vars + fn_list_config_locations elif [ "${shortname}" == "rtcw" ]; then gamedirname="ReturnToCastleWolfenstein" array_configs+=( server.cfg ) fn_fetch_default_config fn_default_config_remote fn_set_config_vars + fn_list_config_locations elif [ "${shortname}" == "rust" ]; then gamedirname="Rust" fn_check_cfgdir array_configs+=( server.cfg ) fn_fetch_default_config fn_default_config_remote + fn_list_config_locations elif [ "${shortname}" == "samp" ]; then gamedirname="SanAndreasMultiplayer" array_configs+=( server.cfg ) fn_fetch_default_config fn_default_config_remote fn_set_config_vars + fn_list_config_locations elif [ "${shortname}" == "ss3" ]; then gamedirname="SeriousSam3BFE" array_configs+=( server.ini ) fn_fetch_default_config fn_default_config_remote fn_set_config_vars + fn_list_config_locations elif [ "${shortname}" == "sol" ]; then gamedirname="Soldat" array_configs+=( soldat.ini ) fn_fetch_default_config fn_default_config_remote fn_set_config_vars + fn_list_config_locations elif [ "${shortname}" == "sof2" ]; then gamedirname="SoldierOfFortune2Gold" array_configs+=( server.cfg mapcycle.txt) fn_fetch_default_config fn_default_config_remote fn_set_config_vars + fn_list_config_locations elif [ "${shortname}" == "sfc" ]; then gamedirname="SourceFortsClassic" array_configs+=( server.cfg ) fn_fetch_default_config fn_default_config_remote fn_set_config_vars + fn_list_config_locations elif [ "${shortname}" == "squad" ]; then gamedirname="Squad" array_configs+=( Admins.cfg Bans.cfg License.cfg Server.cfg Rcon.cfg ) fn_fetch_default_config fn_default_config_remote fn_set_config_vars + fn_list_config_locations elif [ "${shortname}" == "sb" ]; then gamedirname="Starbound" array_configs+=( starbound_server.config ) fn_fetch_default_config fn_default_config_remote fn_set_config_vars + fn_list_config_locations elif [ "${shortname}" == "st" ]; then gamedirname="Stationeers" array_configs+=( default.ini ) fn_fetch_default_config fn_default_config_remote fn_set_config_vars + fn_list_config_locations elif [ "${shortname}" == "sven" ]; then gamedirname="SvenCoop" array_configs+=( server.cfg ) fn_fetch_default_config fn_default_config_remote fn_set_config_vars + fn_list_config_locations elif [ "${shortname}" == "tf2" ]; then gamedirname="TeamFortress2" array_configs+=( server.cfg ) fn_fetch_default_config fn_default_config_remote fn_set_config_vars + fn_list_config_locations elif [ "${shortname}" == "tfc" ]; then gamedirname="TeamFortressClassic" array_configs+=( server.cfg ) fn_fetch_default_config fn_default_config_remote fn_set_config_vars + fn_list_config_locations elif [ "${shortname}" == "ts" ]; then gamedirname="TheSpecialists" array_configs+=( server.cfg ) fn_fetch_default_config fn_default_config_remote fn_set_config_vars + fn_list_config_locations elif [ "${shortname}" == "ts3" ]; then gamedirname="TeamSpeak3" array_configs+=( ts3server.ini ) fn_fetch_default_config fn_default_config_remote + fn_list_config_locations elif [ "${shortname}" == "tw" ]; then gamedirname="Teeworlds" array_configs+=( server.cfg ctf.cfg dm.cfg duel.cfg tdm.cfg ) fn_fetch_default_config fn_default_config_remote fn_set_config_vars + fn_list_config_locations elif [ "${shortname}" == "terraria" ]; then gamedirname="Terraria" array_configs+=( serverconfig.txt ) fn_fetch_default_config fn_default_config_remote fn_set_config_vars + fn_list_config_locations elif [ "${shortname}" == "tu" ]; then gamedirname="TowerUnite" fn_check_cfgdir @@ -649,64 +751,75 @@ elif [ "${shortname}" == "tu" ]; then fn_fetch_default_config fn_default_config_remote fn_set_config_vars + fn_list_config_locations elif [ "${shortname}" == "ut" ]; then gamedirname="UnrealTournament" array_configs+=( Game.ini Engine.ini ) fn_fetch_default_config fn_default_config_remote fn_set_config_vars + fn_list_config_locations elif [ "${shortname}" == "ut2k4" ]; then gamedirname="UnrealTournament2004" array_configs+=( UT2004.ini ) fn_fetch_default_config fn_default_config_remote fn_set_config_vars + fn_list_config_locations elif [ "${shortname}" == "ut99" ]; then gamedirname="UnrealTournament99" array_configs+=( Default.ini ) fn_fetch_default_config fn_default_config_remote fn_set_config_vars + fn_list_config_locations elif [ "${shortname}" == "unt" ]; then gamedirname="Unturned" array_configs+=( Config.json ) fn_fetch_default_config fn_default_config_remote fn_set_config_vars + fn_list_config_locations elif [ "${shortname}" == "vs" ]; then gamedirname="VampireSlayer" array_configs+=( server.cfg ) fn_fetch_default_config fn_default_config_remote fn_set_config_vars + fn_list_config_locations elif [ "${shortname}" == "wet" ]; then gamedirname="WolfensteinEnemyTerritory" array_configs+=( server.cfg ) fn_fetch_default_config fn_default_config_remote fn_set_config_vars + fn_list_config_locations elif [ "${shortname}" == "wf" ]; then gamedirname="Warfork" array_configs+=( server.cfg ) fn_fetch_default_config fn_default_config_remote fn_set_config_vars + fn_list_config_locations elif [ "${shortname}" == "wurm" ]; then gamedirname="WurmUnlimited" array_configs+=( server.cfg ) fn_fetch_default_config fn_default_config_remote fn_set_config_vars + fn_list_config_locations elif [ "${shortname}" == "zmr" ]; then gamedirname="ZombieMasterReborn" array_configs+=( server.cfg ) fn_fetch_default_config fn_default_config_remote fn_set_config_vars + fn_list_config_locations elif [ "${shortname}" == "zps" ]; then gamedirname="ZombiePanicSource" array_configs+=( server.cfg ) fn_fetch_default_config fn_default_config_remote fn_set_config_vars + fn_list_config_locations fi From a76cd3f7b3955f27cd5cdc34461c129ade8fb8d1 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Tue, 19 May 2020 09:53:48 +0100 Subject: [PATCH 371/534] feat(update-lgsm): LinuxGSM update refactor (#2884) This update is a major refactor of how LinuxGSM updates itself. * will now use a version tag if downloading module for the first time. * added backup repo (Bitbucket) that will be used if Github is unavailable. * added ./gameserver and module version comparison this will allow instances to be correctly updated if there is a version mismatch. * UI changes when modules are fetched for the first time * added sessionname to fix broken tmux session is ./gameserver is called ./gameserver.sh * change apt to apt-get as recommended by the apt packages when dealing with scripts. --- lgsm/functions/check.sh | 4 + lgsm/functions/check_deps.sh | 14 +- lgsm/functions/check_status.sh | 2 +- lgsm/functions/check_steamcmd.sh | 12 +- lgsm/functions/check_version.sh | 19 ++ lgsm/functions/command_console.sh | 2 +- lgsm/functions/command_dev_query_raw.sh | 2 +- lgsm/functions/command_monitor.sh | 2 +- lgsm/functions/command_start.sh | 21 +- lgsm/functions/command_stop.sh | 14 +- lgsm/functions/command_update_linuxgsm.sh | 232 +++++++++++++++------- lgsm/functions/command_validate.sh | 1 - lgsm/functions/core_dl.sh | 192 ++++++++++++------ lgsm/functions/core_functions.sh | 12 ++ lgsm/functions/core_messages.sh | 11 + lgsm/functions/info_distro.sh | 2 +- lgsm/functions/info_stats.sh | 4 +- lgsm/functions/install_config.sh | 2 +- lgsm/functions/install_modules.sh | 16 ++ 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_ts3.sh | 2 +- linuxgsm.sh | 134 +++++++++---- tests/tests_fctrserver.sh | 134 +++++++++---- tests/tests_jc2server.sh | 132 ++++++++---- tests/tests_mcserver.sh | 133 +++++++++---- tests/tests_ts3server.sh | 133 +++++++++---- 29 files changed, 873 insertions(+), 367 deletions(-) create mode 100644 lgsm/functions/check_version.sh create mode 100644 lgsm/functions/install_modules.sh diff --git a/lgsm/functions/check.sh b/lgsm/functions/check.sh index f56828561..3e8fa90a2 100644 --- a/lgsm/functions/check.sh +++ b/lgsm/functions/check.sh @@ -14,6 +14,10 @@ if [ "${commandname}" != "INSTALL" ]; then check_root.sh fi +if [ "${commandname}" != "UPDATE-LGSM" ]; then + check_version.sh +fi + check_tmuxception.sh if [ "$(whoami)" != "root" ]; then diff --git a/lgsm/functions/check_deps.sh b/lgsm/functions/check_deps.sh index ecfb28e6d..52f651e1b 100644 --- a/lgsm/functions/check_deps.sh +++ b/lgsm/functions/check_deps.sh @@ -26,13 +26,13 @@ fn_install_mono_repo(){ echo -en " \r" if [ "${distroid}" == "ubuntu" ]; then if [ "${distroversion}" == "18.04" ]; then - cmd="sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys 3FA7E0328081BFF6A14DA29AA6A19B38D3D831EF;echo 'deb https://download.mono-project.com/repo/ubuntu stable-bionic main' | sudo tee /etc/apt/sources.list.d/mono-official-stable.list;sudo apt update" + cmd="sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys 3FA7E0328081BFF6A14DA29AA6A19B38D3D831EF;echo 'deb https://download.mono-project.com/repo/ubuntu stable-bionic main' | sudo tee /etc/apt/sources.list.d/mono-official-stable.list;sudo apt-get update" eval "${cmd}" elif [ "${distroversion}" == "16.04" ]; then - cmd="sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys 3FA7E0328081BFF6A14DA29AA6A19B38D3D831EF;sudo apt install apt-transport-https;echo 'deb https://download.mono-project.com/repo/ubuntu stable-xenial main' | sudo tee /etc/apt/sources.list.d/mono-official-stable.list;sudo apt update" + cmd="sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys 3FA7E0328081BFF6A14DA29AA6A19B38D3D831EF;sudo apt-get install apt-transport-https;echo 'deb https://download.mono-project.com/repo/ubuntu stable-xenial main' | sudo tee /etc/apt/sources.list.d/mono-official-stable.list;sudo apt-get update" eval "${cmd}" elif [ "${distroversion}" == "14.04" ]; then - cmd="sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys 3FA7E0328081BFF6A14DA29AA6A19B38D3D831EF;sudo apt install apt-transport-https;echo 'deb https://download.mono-project.com/repo/ubuntu stable-trusty main' | sudo tee /etc/apt/sources.list.d/mono-official-stable.list;sudo apt update" + cmd="sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys 3FA7E0328081BFF6A14DA29AA6A19B38D3D831EF;sudo apt-get install apt-transport-https;echo 'deb https://download.mono-project.com/repo/ubuntu stable-trusty main' | sudo tee /etc/apt/sources.list.d/mono-official-stable.list;sudo apt-get update" eval "${cmd}" else fn_print_warn_nl "Installing Mono repository." @@ -43,13 +43,13 @@ fn_install_mono_repo(){ fi elif [ "${distroid}" == "debian" ]; then if [ "${distroversion}" == "10" ]; then - cmd="sudo apt install apt-transport-https dirmngr;sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys 3FA7E0328081BFF6A14DA29AA6A19B38D3D831EF;echo 'deb https://download.mono-project.com/repo/debian stable-buster main' | sudo tee /etc/apt/sources.list.d/mono-official-stable.list;sudo apt update" + cmd="sudo apt-get install apt-transport-https dirmngr;sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys 3FA7E0328081BFF6A14DA29AA6A19B38D3D831EF;echo 'deb https://download.mono-project.com/repo/debian stable-buster main' | sudo tee /etc/apt/sources.list.d/mono-official-stable.list;sudo apt-get update" eval "${cmd}" elif [ "${distroversion}" == "9" ]; then - cmd="sudo apt install apt-transport-https dirmngr;sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys 3FA7E0328081BFF6A14DA29AA6A19B38D3D831EF;echo 'deb https://download.mono-project.com/repo/debian stable-stretch main' | sudo tee /etc/apt/sources.list.d/mono-official-stable.list;sudo apt update" + cmd="sudo apt-get install apt-transport-https dirmngr;sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys 3FA7E0328081BFF6A14DA29AA6A19B38D3D831EF;echo 'deb https://download.mono-project.com/repo/debian stable-stretch main' | sudo tee /etc/apt/sources.list.d/mono-official-stable.list;sudo apt-get update" eval "${cmd}" elif [ "${distroversion}" == "8" ]; then - cmd="sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys 3FA7E0328081BFF6A14DA29AA6A19B38D3D831EF;sudo apt install apt-transport-https;echo 'deb https://download.mono-project.com/repo/debian stable-jessie main' | sudo tee /etc/apt/sources.list.d/mono-official-stable.list;sudo apt update" + cmd="sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys 3FA7E0328081BFF6A14DA29AA6A19B38D3D831EF;sudo apt-get install apt-transport-https;echo 'deb https://download.mono-project.com/repo/debian stable-jessie main' | sudo tee /etc/apt/sources.list.d/mono-official-stable.list;sudo apt-get update" eval "${cmd}" else echo -e "Mono auto install not available for ${distroname}" @@ -248,7 +248,7 @@ fn_found_missing_deps(){ sleep 1 echo -en " \r" if [ "$(command -v dpkg-query 2>/dev/null)" ]; then - cmd="echo steamcmd steam/question select \"I AGREE\" | sudo debconf-set-selections; echo steamcmd steam/license note '' | sudo debconf-set-selections; sudo dpkg --add-architecture i386; sudo apt update; sudo apt -y install ${array_deps_missing[*]}" + cmd="echo steamcmd steam/question select \"I AGREE\" | sudo debconf-set-selections; echo steamcmd steam/license note '' | sudo debconf-set-selections; sudo dpkg --add-architecture i386; sudo apt-get update; sudo apt-get -y install ${array_deps_missing[*]}" eval "${cmd}" elif [ "$(command -v dnf 2>/dev/null)" ]; then cmd="sudo dnf -y install ${array_deps_missing[*]}" diff --git a/lgsm/functions/check_status.sh b/lgsm/functions/check_status.sh index 8e4c20bb1..178adcf6b 100644 --- a/lgsm/functions/check_status.sh +++ b/lgsm/functions/check_status.sh @@ -7,4 +7,4 @@ functionselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" -status=$(tmux list-sessions -F "#{session_name}" 2>/dev/null | grep -Ecx "^${selfname}") +status=$(tmux list-sessions -F "#{session_name}" 2>/dev/null | grep -Ecx "^${sessionname}") diff --git a/lgsm/functions/check_steamcmd.sh b/lgsm/functions/check_steamcmd.sh index b8dbffd87..b42d581df 100644 --- a/lgsm/functions/check_steamcmd.sh +++ b/lgsm/functions/check_steamcmd.sh @@ -13,7 +13,17 @@ fn_install_steamcmd(){ if [ ! -d "${steamcmddir}" ]; then mkdir -p "${steamcmddir}" fi - fn_fetch_file "http://media.steampowered.com/client/steamcmd_linux.tar.gz" "${tmpdir}" "steamcmd_linux.tar.gz" + remote_fileurl="${1}" + remote_fileurl_backup="${2}" + remote_fileurl_name="${3}" + remote_fileurl_backup_name="${4}" + local_filedir="${5}" + local_filename="${6}" + chmodx="${7:-0}" + run="${8:-0}" + forcedl="${9:-0}" + md5="${10:-0}" + fn_fetch_file "http://media.steampowered.com/client/steamcmd_linux.tar.gz" "" "" "" "${tmpdir}" "steamcmd_linux.tar.gz" "" "norun" "noforce" "nomd5" fn_dl_extract "${tmpdir}" "steamcmd_linux.tar.gz" "${steamcmddir}" chmod +x "${steamcmddir}/steamcmd.sh" } diff --git a/lgsm/functions/check_version.sh b/lgsm/functions/check_version.sh new file mode 100644 index 000000000..6db78091d --- /dev/null +++ b/lgsm/functions/check_version.sh @@ -0,0 +1,19 @@ +#!/bin/bash +# LinuxGSM command_version.sh function +# Author: Daniel Gibbs +# Website: https://linuxgsm.com +# Description: Will run update-lgsm if gameserver.sh and modules version does not match +# this will allow gameserver.sh to update - useful for multi instance servers. + +if [ -n "${modulesversion}" ]&&[ -n "${version}" ]&&[ "${version}" != "${modulesversion}" ]; then + exitbypass=1 + echo -e "" + fn_print_error_nl "LinuxGSM version mismatch" + echo -e "" + echo -e "* ${selfname}: ${version}" + echo -e "* modules: ${modulesversion}" + echo -e "" + fn_sleep_time + fn_script_log_error "LinuxGSM Version mismatch: ${selfname}: ${version}: modules: ${modulesversion}" + command_update_linuxgsm.sh +fi diff --git a/lgsm/functions/command_console.sh b/lgsm/functions/command_console.sh index c3e3257be..18e674652 100644 --- a/lgsm/functions/command_console.sh +++ b/lgsm/functions/command_console.sh @@ -26,7 +26,7 @@ check_status.sh if [ "${status}" != "0" ]; then fn_print_ok_nl "Accessing console" fn_script_log_pass "Console accessed" - tmux attach-session -t "${selfname}" + tmux attach-session -t "${sessionname}" fn_print_ok_nl "Closing console" fn_script_log_pass "Console closed" else diff --git a/lgsm/functions/command_dev_query_raw.sh b/lgsm/functions/command_dev_query_raw.sh index cdd539ce9..b96036c2f 100644 --- a/lgsm/functions/command_dev_query_raw.sh +++ b/lgsm/functions/command_dev_query_raw.sh @@ -44,7 +44,7 @@ echo -e "" echo -e "./query_gsquery.py -a \"${ip}\" -p \"${queryport}\" -e \"${querytype}\"" echo -e "" if [ ! -f "${functionsdir}/query_gsquery.py" ]; then - fn_fetch_file_github "lgsm/functions" "query_gsquery.py" "${functionsdir}" "chmodx" "norun" "noforce" "nomd5" + fn_fetch_file_git "lgsm/functions" "query_gsquery.py" "${functionsdir}" "chmodx" "norun" "noforce" "nomd5" fi "${functionsdir}"/query_gsquery.py -a "${ip}" -p "${queryport}" -e "${querytype}" diff --git a/lgsm/functions/command_monitor.sh b/lgsm/functions/command_monitor.sh index 4b621c0d5..a66c362b4 100644 --- a/lgsm/functions/command_monitor.sh +++ b/lgsm/functions/command_monitor.sh @@ -84,7 +84,7 @@ fn_monitor_check_queryport(){ fn_query_gsquery(){ if [ ! -f "${functionsdir}/query_gsquery.py" ]; then - fn_fetch_file_github "lgsm/functions" "query_gsquery.py" "${functionsdir}" "chmodx" "norun" "noforce" "nomd5" + fn_fetch_file_git "lgsm/functions" "query_gsquery.py" "${functionsdir}" "chmodx" "norun" "noforce" "nomd5" fi "${functionsdir}"/query_gsquery.py -a "${ip}" -p "${queryport}" -e "${querytype}" > /dev/null 2>&1 querystatus="$?" diff --git a/lgsm/functions/command_start.sh b/lgsm/functions/command_start.sh index 6e4b445e8..7ba90159d 100644 --- a/lgsm/functions/command_start.sh +++ b/lgsm/functions/command_start.sh @@ -64,7 +64,7 @@ fn_start_tmux(){ # Create lockfile date '+%s' > "${lockdir}/${selfname}.lock" cd "${executabledir}" || exit - tmux new-session -d -x "${sessionwidth}" -y "${sessionheight}" -s "${selfname}" "${executable} ${parms}" 2> "${lgsmlogdir}/.${selfname}-tmux-error.tmp" + tmux new-session -d -x "${sessionwidth}" -y "${sessionheight}" -s "${sessionname}" "${executable} ${parms}" 2> "${lgsmlogdir}/.${selfname}-tmux-error.tmp" # Create logfile. touch "${consolelog}" @@ -79,7 +79,7 @@ fn_start_tmux(){ fn_script_log "Tmux version: master (user compiled)" echo -e "Tmux version: master (user compiled)" >> "${consolelog}" if [ "${consolelogging}" == "on" ]||[ -z "${consolelogging}" ]; then - tmux pipe-pane -o -t "${selfname}" "exec cat >> '${consolelog}'" + tmux pipe-pane -o -t "${sessionname}" "exec cat >> '${consolelog}'" fi elif [ "${tmuxversion}" ]; then # Get the digit version of tmux. @@ -97,19 +97,19 @@ fn_start_tmux(){ Currently installed: $(tmux -V)" > "${consolelog}" # Console logging enable or not set. elif [ "${consolelogging}" == "on" ]||[ -z "${consolelogging}" ]; then - tmux pipe-pane -o -t "${selfname}" "exec cat >> '${consolelog}'" + tmux pipe-pane -o -t "${sessionname}" "exec cat >> '${consolelog}'" fi else echo -e "Unable to detect tmux version" >> "${consolelog}" fn_script_log_warn "Unable to detect tmux version" fi -# Console logging disabled. -if [ "${consolelogging}" == "off" ]; then - echo -e "Console logging disabled by user" >> "${consolelog}" - fn_script_log_info "Console logging disabled by user" -fi -fn_sleep_time + # Console logging disabled. + if [ "${consolelogging}" == "off" ]; then + echo -e "Console logging disabled by user" >> "${consolelog}" + fn_script_log_info "Console logging disabled by user" + fi + fn_sleep_time # If the server fails to start. check_status.sh @@ -122,7 +122,7 @@ fn_sleep_time echo -e "" echo -e "Command" echo -e "=================================" - echo -e "tmux new-session -d -s \"${selfname}\" \"${executable} ${parms}\"" | tee -a "${lgsmlog}" + echo -e "tmux new-session -d -s \"${sessionname}\" \"${executable} ${parms}\"" | tee -a "${lgsmlog}" echo -e "" echo -e "Error" echo -e "=================================" @@ -156,7 +156,6 @@ fn_sleep_time fi fi fi - core_exit.sh else fn_print_ok "${servername}" diff --git a/lgsm/functions/command_stop.sh b/lgsm/functions/command_stop.sh index e8ef68fa4..6ea4f4d7a 100644 --- a/lgsm/functions/command_stop.sh +++ b/lgsm/functions/command_stop.sh @@ -14,7 +14,7 @@ fn_stop_graceful_ctrlc(){ fn_print_dots "Graceful: CTRL+c" fn_script_log_info "Graceful: CTRL+c" # Sends quit. - tmux send-keys -t "${selfname}" C-c > /dev/null 2>&1 + tmux send-keys -t "${sessionname}" C-c > /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 @@ -42,7 +42,7 @@ fn_stop_graceful_cmd(){ fn_print_dots "Graceful: sending \"${1}\"" fn_script_log_info "Graceful: sending \"${1}\"" # Sends specific stop command. - tmux send -t "${selfname}" "${1}" ENTER > /dev/null 2>&1 + tmux send -t "${sessionname}" "${1}" ENTER > /dev/null 2>&1 # Waits up to ${seconds} seconds giving the server time to shutdown gracefully. for ((seconds=1; seconds<=${2}; seconds++)); do check_status.sh @@ -70,7 +70,7 @@ fn_stop_graceful_goldsrc(){ fn_print_dots "Graceful: sending \"quit\"" fn_script_log_info "Graceful: sending \"quit\"" # sends quit - tmux send -t "${selfname}" quit ENTER > /dev/null 2>&1 + tmux send -t "${sessionname}" quit ENTER > /dev/null 2>&1 # Waits 3 seconds as goldsrc servers restart with the quit command. for seconds in {1..3}; do sleep 1 @@ -183,10 +183,10 @@ fn_stop_graceful_avorion(){ fn_print_dots "Graceful: /save /stop" fn_script_log_info "Graceful: /save /stop" # Sends /save. - tmux send-keys -t "${selfname}" /save ENTER > /dev/null 2>&1 + tmux send-keys -t "${sessionname}" /save ENTER > /dev/null 2>&1 sleep 5 # Sends /quit. - tmux send-keys -t "${selfname}" /stop ENTER > /dev/null 2>&1 + tmux send-keys -t "${sessionname}" /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 @@ -233,9 +233,9 @@ fn_stop_graceful_select(){ fn_stop_tmux(){ fn_print_dots "${servername}" - fn_script_log_info "tmux kill-session: ${servername}" + fn_script_log_info "tmux kill-session: ${sessionname}: ${servername}" # Kill tmux session. - tmux kill-session -t "${selfname}" > /dev/null 2>&1 + tmux kill-session -t "${sessionname}" > /dev/null 2>&1 sleep 0.5 check_status.sh if [ "${status}" == "0" ]; then diff --git a/lgsm/functions/command_update_linuxgsm.sh b/lgsm/functions/command_update_linuxgsm.sh index 90c2f0446..1fe1e39fa 100644 --- a/lgsm/functions/command_update_linuxgsm.sh +++ b/lgsm/functions/command_update_linuxgsm.sh @@ -8,109 +8,197 @@ commandname="UPDATE-LGSM" commandaction="Updating LinuxGSM" functionselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" -fn_print_dots "Updating LinuxGSM" check.sh + +fn_print_dots "" fn_script_log_info "Updating LinuxGSM" -echo -en "\n" -if [ -z "${legacymode}" ]; then - # Check and update _default.cfg. - echo -en " checking config _default.cfg...\c" - config_file_diff=$(diff "${configdirdefault}/config-lgsm/${gameservername}/_default.cfg" <(curl -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/${gameservername}/_default.cfg" - fn_fetch_config "lgsm/config-default/config-lgsm/${gameservername}" "_default.cfg" "${configdirdefault}/config-lgsm/${gameservername}" "_default.cfg" "nochmodx" "norun" "noforce" "nomd5" - alert="config" - alert.sh +fn_print_dots "Selecting repo" +fn_script_log_info "Selecting repo" +# Select remotereponame +curl -IsfL "https://raw.githubusercontent.com/${githubuser}/${githubrepo}/${githubbranch}/linuxgsm.sh" 1>/dev/null +if [ $? != "0" ]; then + curl -IsfL "https://bitbucket.org/${githubuser}/${githubrepo}/raw/${githubbranch}/linuxgsm.sh" 1>/dev/null + if [ $? != "0" ]; then + fn_print_fail_nl "Selecting repo: Unable to to access GitHub or Bitbucket repositories" + fn_script_log_fatal "Selecting repo: Unable to to access GitHub or Bitbucket repositories" + core_exit.sh else - fn_print_ok_eol_nl - fn_script_log_info "checking config _default.cfg: OK" + remotereponame="Bitbucket" + fn_print_ok_nl "Selecting repo: ${remotereponame}" fi +else + remotereponame="GitHub" + fn_print_ok_nl "Selecting repo: ${remotereponame}" +fi + +# Check _default.cfg. +echo -en "checking ${remotereponame} config _default.cfg...\c" +fn_script_log_info "Checking ${remotereponame} config _default.cfg" +if [ "${remotereponame}" == "GitHub" ]; then + curl -IsfL "https://raw.githubusercontent.com/${githubuser}/${githubrepo}/${githubbranch}/lgsm/config-default/config-lgsm/${gameservername}/_default.cfg" 1>/dev/null +else + curl -IsfL "https://bitbucket.org/${githubuser}/${githubrepo}/raw/${githubbranch}/lgsm/config-default/config-lgsm/${gameservername}/_default.cfg" 1>/dev/null +fi +if [ $? != "0" ]; then + fn_print_fail_eol_nl + fn_script_log_fatal "Checking ${remotereponame} config _default.cfg" + fn_script_log_fatal "Curl returned error: $?" + core_exit.sh +fi + +if [ "${remotereponame}" == "GitHub" ]; then + config_file_diff=$(diff "${configdirdefault}/config-lgsm/${gameservername}/_default.cfg" <(curl -s "https://raw.githubusercontent.com/${githubuser}/${githubrepo}/${githubbranch}/lgsm/config-default/config-lgsm/${gameservername}/_default.cfg")) +else + config_file_diff=$(diff "${configdirdefault}/config-lgsm/${gameservername}/_default.cfg" <(curl -s "https://bitbucket.org/${githubuser}/${githubrepo}/raw/${githubbranch}/lgsm/config-default/config-lgsm/${gameservername}/_default.cfg")) +fi + +if [ "${config_file_diff}" != "" ]; then + fn_print_update_eol_nl + fn_script_log_update "Checking ${remotereponame} config _default.cfg" + rm -f "${configdirdefault:?}/config-lgsm/${gameservername:?}/_default.cfg" + fn_fetch_file_github "lgsm/config-default/config-lgsm/${gameservername}" "_default.cfg" "${configdirdefault}/config-lgsm/${gameservername}" "nochmodx" "norun" "noforce" "nomd5" + alert="config" + alert.sh +else + fn_print_ok_eol_nl + fn_script_log_pass "Checking ${remotereponame} config _default.cfg" +fi + +# Check linuxsm.sh +echo -en "checking ${remotereponame} linuxgsm.sh...\c" +if [ "${remotereponame}" == "GitHub" ]; then + curl -IsfL "https://raw.githubusercontent.com/${githubuser}/${githubrepo}/${githubbranch}/linuxgsm.sh" 1>/dev/null +else + curl -IsfL "https://bitbucket.org/${githubuser}/${githubrepo}/raw/${githubbranch}/linuxgsm.sh" 1>/dev/null +fi +if [ $? != "0" ]; then + fn_print_fail_eol_nl + fn_script_log_fatal "Checking ${remotereponame} linuxgsm.sh" + fn_script_log_fatal "Curl returned error: $?" + core_exit.sh +fi - echo -en " checking linuxgsm.sh...\c" +if [ "${remotereponame}" == "GitHub" ]; then tmp_script_diff=$(diff "${tmpdir}/linuxgsm.sh" <(curl -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 + tmp_script_diff=$(diff "${tmpdir}/linuxgsm.sh" <(curl -s "https://bitbucket.org/${githubuser}/${githubrepo}/raw/${githubbranch}/linuxgsm.sh")) +fi + +if [ "${tmp_script_diff}" != "" ]; then + fn_print_update_eol_nl + fn_script_log_update "Checking ${remotereponame} linuxgsm.sh" + rm -f "${tmpdir:?}/linuxgsm.sh" + fn_fetch_file_github "" "linuxgsm.sh" "${tmpdir}" "nochmodx" "norun" "noforcedl" "nomd5" +else + fn_print_ok_eol_nl + fn_script_log_pass "Checking ${remotereponame} linuxgsm.sh" +fi + +# Check gameserver.sh +# Compare gameserver.sh against linuxgsm.sh in the tmp dir. +# Ignoring server specific vars. +echo -en "checking ${selfname}...\c" +fn_script_log_info "Checking ${selfname}" +echo "TMPDIR: ${tmpdir}" +echo "ROOTDIR: ${rootdir}" +echo "SELFNAME: ${selfname}" +script_diff=$(diff <(sed '\/shortname/d;\/gameservername/d;\/gamename/d;\/githubuser/d;\/githubrepo/d;\/githubbranch/d' "${tmpdir}/linuxgsm.sh") <(sed '\/shortname/d;\/gameservername/d;\/gamename/d;\/githubuser/d;\/githubrepo/d;\/githubbranch/d' "${rootdir}/${selfname}")) +echo "==========================================" +if [ "${script_diff}" != "" ]; then + fn_print_update_eol_nl + fn_script_log_update "Checking ${selfname}" + echo -en "backup ${selfname}...\c" + fn_script_log_info "Backup ${selfname}" + if [ ! -d "${backupdir}/script" ]; then + mkdir -p "${backupdir}/script" + fi + cp "${rootdir}/${selfname}" "${backupdir}/script/${selfname}-$(date +"%m_%d_%Y_%M").bak" + if [ $? -ne 0 ]; then + fn_print_fail_eol_nl + fn_script_log_fatal "Backup ${selfname}" + core_exit.sh else - fn_script_log_info "checking linuxgsm.sh: OK" fn_print_ok_eol_nl + fn_script_log_pass "Backup ${selfname}" + echo -e "backup location ${backupdir}/script/${selfname}-$(date +"%m_%d_%Y_%M").bak" + fn_script_log_pass "Backup location ${backupdir}/script/${selfname}-$(date +"%m_%d_%Y_%M").bak" fi - echo -en " checking ${selfname}...\c" - script_diff=$(diff <(sed '\/shortname/d;\/gameservername/d;\/gamename/d;\/githubuser/d;\/githubrepo/d;\/githubbranch/d' "${tmpdir}/linuxgsm.sh") <(sed '\/shortname/d;\/gameservername/d;\/gamename/d;\/githubuser/d;\/githubrepo/d;\/githubbranch/d' "${rootdir}/${selfname}")) - if [ "${script_diff}" != "" ]; then - fn_print_update_eol_nl - echo -en " 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: ${backupdir}/script/${selfname}-$(date +"%m_%d_%Y_%M").bak" - fi - echo -en " fetching ${selfname}...\c" - cp "${tmpdir}/linuxgsm.sh" "${rootdir}/${selfname}" - sed -i "s/shortname=\"core\"/shortname=\"${shortname}\"/g" "${rootdir}/${selfname}" - sed -i "s/gameservername=\"core\"/gameservername=\"${gameservername}\"/g" "${rootdir}/${selfname}" - sed -i "s/gamename=\"core\"/gamename=\"${gamename}\"/g" "${rootdir}/${selfname}" - exitcode=$? - if [ "${exitcode}" != "0" ]; then - fn_print_fail_eol_nl - core_exit.sh - else - fn_print_ok_eol_nl - fi + + echo -en "copying ${selfname}...\c" + fn_script_log_info "copying ${selfname}" + cp "${tmpdir}/linuxgsm.sh" "${rootdir}/${selfname}" + sed -i "s+shortname=\"core\"+shortname=\"${shortname}\"+g" "${rootdir}/${selfname}" + sed -i "s+gameservername=\"core\"+gameservername=\"${gameservername}\"+g" "${rootdir}/${selfname}" + sed -i "s+gamename=\"core\"+gamename=\"${gamename}\"+g" "${rootdir}/${selfname}" + sed -i "s+githubuser=\"GameServerManagers\"+githubuser=\"${githubuser}\"+g" "${rootdir}/${selfname}" + sed -i "s+githubrepo=\"LinuxGSM\"+githubrepo=\"${githubrepo}\"+g" "${rootdir}/${selfname}" + sed -i "s+githubbranch=\"master\"+githubbranch=\"${githubbranch}\"+g" "${rootdir}/${selfname}" + + if [ $? != "0" ]; then + fn_print_fail_eol_nl + fn_script_log_fatal "copying ${selfname}" + core_exit.sh else fn_print_ok_eol_nl + fn_script_log_pass "copying ${selfname}" fi +else + fn_print_ok_eol_nl + fn_script_log_info "Checking ${selfname}" fi -# Check and update functions. -if [ "${functionsdir}" ]; then +# Check and update modules. +if [ -n "${functionsdir}" ]; then if [ -d "${functionsdir}" ]; then cd "${functionsdir}" || exit for functionfile in * do - echo -en " checking function ${functionfile}...\c" + # check if module exists in the repo and remove if missing. + # commonly used if module names change. + echo -en "checking ${remotereponame} module ${functionfile}...\c" github_file_url_dir="lgsm/functions" - get_function_file=$(curl --fail -s "https://raw.githubusercontent.com/${githubuser}/${githubrepo}/${githubbranch}/${github_file_url_dir}/${functionfile}") - exitcode=$? - function_file_diff=$(diff "${functionsdir}/${functionfile}" <(curl --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 -en " removing unknown function ${functionfile}...\c" - fn_script_log_fatal "removing unknown function ${functionfile}" + if [ "${remotereponame}" == "GitHub" ]; then + curl -IsfL "https://raw.githubusercontent.com/${githubuser}/${githubrepo}/${githubbranch}/${github_file_url_dir}/${functionfile}" 1>/dev/null + else + curl -IsfL "https://bitbucket.org/${githubuser}/${githubrepo}/raw/${githubbranch}/${github_file_url_dir}/${functionfile}" 1>/dev/null + fi + if [ $? -ne 0 ]; then + fn_print_error_eol_nl + fn_script_log_error "Checking ${remotereponame} module ${functionfile}" + echo -en "removing module ${functionfile}...\c" if ! rm -f "${functionfile:?}"; then fn_print_fail_eol_nl + fn_script_log_fatal "Removing module ${functionfile}" core_exit.sh else fn_print_ok_eol_nl + fn_script_log_pass "Removing module ${functionfile}" fi - elif [ "${function_file_diff}" != "" ]; then - fn_print_update_eol_nl - fn_script_log_info "checking function ${functionfile}: UPDATE" - rm -rf "${functionsdir:?}/${functionfile}" - fn_update_function else - fn_print_ok_eol_nl + # compare file + if [ "${remotereponame}" == "GitHub" ]; then + function_file_diff=$(diff "${functionsdir}/${functionfile}" <(curl -s "https://raw.githubusercontent.com/${githubuser}/${githubrepo}/${githubbranch}/${github_file_url_dir}/${functionfile}")) + else + function_file_diff=$(diff "${functionsdir}/${functionfile}" <(curl -s "https://bitbucket.org/${githubuser}/${githubrepo}/raw/${githubbranch}/${github_file_url_dir}/${functionfile}")) + fi + + # results + if [ "${function_file_diff}" != "" ]; then + fn_print_update_eol_nl + fn_script_log_update "Checking ${remotereponame} module ${functionfile}" + rm -rf "${functionsdir:?}/${functionfile}" + fn_update_function + else + fn_print_ok_eol_nl + fn_script_log_pass "Checking ${remotereponame} module ${functionfile}" + fi fi done fi fi -if [ "${exitcode}" != "0" ]&&[ -n "${exitcode}" ]; then - fn_print_fail "Updating functions" - fn_script_log_fatal "Updating functions" -else - fn_print_ok "Updating functions" - fn_script_log_pass "Updating functions" -fi +fn_print_ok "Updating functions" +fn_script_log_pass "Updating functions" core_exit.sh diff --git a/lgsm/functions/command_validate.sh b/lgsm/functions/command_validate.sh index 5ddf5ffde..276458e48 100644 --- a/lgsm/functions/command_validate.sh +++ b/lgsm/functions/command_validate.sh @@ -79,7 +79,6 @@ fn_stop_warning(){ fn_print_dots "Validating server" fn_print_dots "Validating server: SteamCMD" check.sh -check_status.sh if [ "${status}" != "0" ]; then fn_stop_warning exitbypass=1 diff --git a/lgsm/functions/core_dl.sh b/lgsm/functions/core_dl.sh index 5294b8a9d..8e2888add 100644 --- a/lgsm/functions/core_dl.sh +++ b/lgsm/functions/core_dl.sh @@ -112,54 +112,99 @@ fn_fetch_trap(){ fn_fetch_file(){ remote_fileurl="${1}" - local_filedir="${2}" - local_filename="${3}" - chmodx="${4:-0}" - run="${5:-0}" - forcedl="${6:-0}" - md5="${7:-0}" + remote_fileurl_backup="${2}" + remote_fileurl_name="${3}" + remote_fileurl_backup_name="${4}" + local_filedir="${5}" + local_filename="${6}" + chmodx="${7:-0}" + run="${8:-0}" + forcedl="${9:-0}" + md5="${10:-0}" # Download file if missing or download forced. if [ ! -f "${local_filedir}/${local_filename}" ]||[ "${forcedl}" == "forcedl" ]; then - if [ ! -d "${local_filedir}" ]; then - mkdir -p "${local_filedir}" - fi - # Trap will remove part downloaded files if canceled. - trap fn_fetch_trap INT - # Larger files show a progress bar. - if [ "${local_filename##*.}" == "bz2" ]||[ "${local_filename##*.}" == "gz" ]||[ "${local_filename##*.}" == "zip" ]||[ "${local_filename##*.}" == "jar" ]||[ "${local_filename##*.}" == "xz" ]; then - echo -en "downloading ${local_filename}..." - fn_sleep_time - echo -en "\033[1K" - curlcmd=$(curl --progress-bar --fail -L -o "${local_filedir}/${local_filename}" "${remote_fileurl}") - echo -en "downloading ${local_filename}..." + # If backup fileurl exists include it. + if [ -n "${remote_fileurl_backup}" ]; then + # counter set to 0 to allow second try + counter=0 + remote_fileurls_array=( remote_fileurl remote_fileurl_backup ) else - echo -en " fetching ${local_filename}...\c" - curlcmd=$(curl -s --fail -L -o "${local_filedir}/${local_filename}" "${remote_fileurl}" 2>&1) + # counter set to 1 to not allow second try + counter=1 + remote_fileurls_array=( remote_fileurl ) fi - local exitcode=$? - if [ ${exitcode} -ne 0 ]; then - fn_print_fail_eol_nl - if [ -f "${lgsmlog}" ]; then - fn_script_log_fatal "Downloading ${local_filename}" - echo -e "${remote_fileurl}" >> "${lgsmlog}" - echo -e "${curlcmd}" >> "${lgsmlog}" + for remote_fileurl_array in "${remote_fileurls_array[@]}" + do + if [ "${remote_fileurl_array}" == "remote_fileurl" ]; then + fileurl="${remote_fileurl}" + fileurl_name="${remote_fileurl_name}" + elif [ "${remote_fileurl_array}" == "remote_fileurl_backup" ]; then + fileurl="${remote_fileurl_backup}" + fileurl_name="${remote_fileurl_backup_name}" fi - echo -e "${remote_fileurl}" - echo -e "${curlcmd}" - core_exit.sh - else - fn_print_ok_eol_nl - if [ -f "${lgsmlog}" ]; then - fn_script_log_pass "Downloading ${local_filename}" + counter=$((counter+1)) + if [ ! -d "${local_filedir}" ]; then + mkdir -p "${local_filedir}" fi - fi - # Remove trap. - trap - INT - # Make file executable if chmodx is set. - if [ "${chmodx}" == "chmodx" ]; then - chmod +x "${local_filedir}/${local_filename}" - fi + # Trap will remove part downloaded files if canceled. + trap fn_fetch_trap INT + # Larger files show a progress bar. + if [ "${local_filename##*.}" == "bz2" ]||[ "${local_filename##*.}" == "gz" ]||[ "${local_filename##*.}" == "zip" ]||[ "${local_filename##*.}" == "jar" ]||[ "${local_filename##*.}" == "xz" ]; then + echo -en "downloading ${local_filename}..." + fn_sleep_time + echo -en "\033[1K" + curlcmd=$(curl --progress-bar --fail -L -o "${local_filedir}/${local_filename}" "${fileurl}") + echo -en "downloading ${local_filename}..." + else + echo -en "fetching ${fileurl_name} ${local_filename}...\c" + curlcmd=$(curl -s --fail -L -o "${local_filedir}/${local_filename}" "${fileurl}" 2>&1) + fi + local exitcode=$? + + # Download will fail if downloads a html file. + if [ -f "${local_filedir}/${local_filename}" ]; then + if [ -n "$(head "${local_filedir}/${local_filename}" | grep "DOCTYPE" )" ]; then + rm "${local_filedir:?}/${local_filename:?}" + local exitcode=2 + fi + fi + + # On first try will error. On second try will fail. + if [ ${exitcode} -ne 0 ]; then + if [ ${counter} -ge 2 ]; then + fn_print_fail_eol_nl + if [ -f "${lgsmlog}" ]; then + fn_script_log_fatal "Downloading ${local_filename}" + fn_script_log_fatal "${fileurl}" + fi + core_exit.sh + else + fn_print_error_eol_nl + if [ -f "${lgsmlog}" ]; then + fn_script_log_error "Downloading ${local_filename}" + fn_script_log_error "${fileurl}" + fi + fi + else + fn_print_ok_eol + sleep 0.3 + echo -en "\033[2K\\r" + if [ -f "${lgsmlog}" ]; then + fn_script_log_pass "Downloading ${local_filename}" + fi + + # Make file executable if chmodx is set. + if [ "${chmodx}" == "chmodx" ]; then + chmod +x "${local_filedir}/${local_filename}" + fi + + # Remove trap. + trap - INT + + break + fi + done fi if [ -f "${local_filedir}/${local_filename}" ]; then @@ -187,13 +232,19 @@ fn_fetch_file(){ # forcedl: Optional, force re-download of file even if exists # md5: Optional, set an md5 sum and will compare it against the file. -# Fetches any files from the GitHub repo. +# Fetches files from the Git 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}" - - remote_fileurl="${githuburl}" + if [ "${githubbranch}" == "master" ]&&[ "${commandname}" != "UPDATE-LGSM" ]; then + remote_fileurl="https://raw.githubusercontent.com/${githubuser}/${githubrepo}/${version}/${github_file_url_dir}/${github_file_url_name}" + remote_fileurl_backup="https://bitbucket.org/${githubuser}/${githubrepo}/raw/${version}/${github_file_url_dir}/${github_file_url_name}" + else + remote_fileurl="https://raw.githubusercontent.com/${githubuser}/${githubrepo}/${githubbranch}/${github_file_url_dir}/${github_file_url_name}" + remote_fileurl_backup="https://bitbucket.org/${githubuser}/${githubrepo}/raw/${githubbranch}/${github_file_url_dir}/${github_file_url_name}" + fi + remote_fileurl_name="GitHub" + remote_fileurl_backup_name="Bitbucket" local_filedir="${3}" local_filename="${github_file_url_name}" chmodx="${4:-0}" @@ -201,15 +252,22 @@ fn_fetch_file_github(){ forcedl="${6:-0}" md5="${7:-0}" # Passes vars to the file download function. - fn_fetch_file "${remote_fileurl}" "${local_filedir}" "${local_filename}" "${chmodx}" "${run}" "${forcedl}" "${md5}" + fn_fetch_file "${remote_fileurl}" "${remote_fileurl_backup}" "${remote_fileurl_name}" "${remote_fileurl_backup_name}" "${local_filedir}" "${local_filename}" "${chmodx}" "${run}" "${forcedl}" "${md5}" } +# Fetches config files from the Git repo. 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}" + if [ "${githubbranch}" == "master" ]&&[ "${commandname}" != "UPDATE-LGSM" ]; then + remote_fileurl="https://raw.githubusercontent.com/${githubuser}/${githubrepo}/${version}/${github_file_url_dir}/${github_file_url_name}" + remote_fileurl_backup="https://bitbucket.org/${githubuser}/${githubrepo}/raw/${version}/${github_file_url_dir}/${github_file_url_name}" + else + remote_fileurl="https://raw.githubusercontent.com/${githubuser}/${githubrepo}/${githubbranch}/${github_file_url_dir}/${github_file_url_name}" + remote_fileurl_backup="https://bitbucket.org/${githubuser}/${githubrepo}/raw/${githubbranch}/${github_file_url_dir}/${github_file_url_name}" + fi + remote_fileurl_name="GitHub" + remote_fileurl_backup_name="Bitbucket" local_filedir="${3}" local_filename="${4}" chmodx="nochmodx" @@ -217,16 +275,22 @@ fn_fetch_config(){ forcedl="noforce" md5="nomd5" # Passes vars to the file download function. - fn_fetch_file "${remote_fileurl}" "${local_filedir}" "${local_filename}" "${chmodx}" "${run}" "${forcedl}" "${md5}" + fn_fetch_file "${remote_fileurl}" "${remote_fileurl_backup}" "${remote_fileurl_name}" "${remote_fileurl_backup_name}" "${local_filedir}" "${local_filename}" "${chmodx}" "${run}" "${forcedl}" "${md5}" } -# Fetches functions. +# Fetches modules from the Git repo during first download. fn_fetch_function(){ 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}" - - remote_fileurl="${githuburl}" + if [ "${githubbranch}" == "master" ]&&[ "${commandname}" != "UPDATE-LGSM" ]; then + remote_fileurl="https://raw.githubusercontent.com/${githubuser}/${githubrepo}/${version}/${github_file_url_dir}/${github_file_url_name}" + remote_fileurl_backup="https://bitbucket.org/${githubuser}/${githubrepo}/raw/${version}/${github_file_url_dir}/${github_file_url_name}" + else + remote_fileurl="https://raw.githubusercontent.com/${githubuser}/${githubrepo}/${githubbranch}/${github_file_url_dir}/${github_file_url_name}" + remote_fileurl_backup="https://bitbucket.org/${githubuser}/${githubrepo}/raw/${githubbranch}/${github_file_url_dir}/${github_file_url_name}" + fi + remote_fileurl_name="GitHub" + remote_fileurl_backup_name="Bitbucket" local_filedir="${functionsdir}" local_filename="${github_file_url_name}" chmodx="chmodx" @@ -234,23 +298,31 @@ fn_fetch_function(){ forcedl="noforce" md5="nomd5" # Passes vars to the file download function. - fn_fetch_file "${remote_fileurl}" "${local_filedir}" "${local_filename}" "${chmodx}" "${run}" "${forcedl}" "${md5}" + fn_fetch_file "${remote_fileurl}" "${remote_fileurl_backup}" "${remote_fileurl_name}" "${remote_fileurl_backup_name}" "${local_filedir}" "${local_filename}" "${chmodx}" "${run}" "${forcedl}" "${md5}" } +# Fetches modules from the Git repo during update-lgsm. fn_update_function(){ - exitbypass=1 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}" - - remote_fileurl="${githuburl}" + if [ "${githubbranch}" == "master" ]&&[ "${commandname}" != "UPDATE-LGSM" ]; then + remote_fileurl="https://raw.githubusercontent.com/${githubuser}/${githubrepo}/${version}/${github_file_url_dir}/${github_file_url_name}" + remote_fileurl_backup="https://bitbucket.org/${githubuser}/${githubrepo}/raw/${version}/${github_file_url_dir}/${github_file_url_name}" + else + remote_fileurl="https://raw.githubusercontent.com/${githubuser}/${githubrepo}/${githubbranch}/${github_file_url_dir}/${github_file_url_name}" + remote_fileurl_backup="https://bitbucket.org/${githubuser}/${githubrepo}/raw/${githubbranch}/${github_file_url_dir}/${github_file_url_name}" + fi + remote_fileurl_name="GitHub" + remote_fileurl_backup_name="Bitbucket" local_filedir="${functionsdir}" local_filename="${github_file_url_name}" chmodx="chmodx" run="norun" forcedl="noforce" md5="nomd5" - fn_fetch_file "${remote_fileurl}" "${local_filedir}" "${local_filename}" "${chmodx}" "${run}" "${forcedl}" "${md5}" + # Passes vars to the file download function. + fn_fetch_file "${remote_fileurl}" "${remote_fileurl_backup}" "${remote_fileurl_name}" "${remote_fileurl_backup_name}" "${local_filedir}" "${local_filename}" "${chmodx}" "${run}" "${forcedl}" "${md5}" + } # Check that curl is installed diff --git a/lgsm/functions/core_functions.sh b/lgsm/functions/core_functions.sh index 9a7f30e98..56060e49e 100644 --- a/lgsm/functions/core_functions.sh +++ b/lgsm/functions/core_functions.sh @@ -7,6 +7,8 @@ functionselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" +modulesversion="v20.2.1" + # Core core_dl.sh(){ @@ -235,6 +237,11 @@ functionfile="${FUNCNAME[0]}" fn_fetch_function } +check_version.sh(){ +functionfile="${FUNCNAME[0]}" +fn_fetch_function +} + # Compress compress_unreal2_maps.sh(){ @@ -666,6 +673,11 @@ functionfile="${FUNCNAME[0]}" fn_fetch_function } +install_modules.sh(){ +functionfile="${FUNCNAME[0]}" +fn_fetch_function +} + install_retry.sh(){ functionfile="${FUNCNAME[0]}" fn_fetch_function diff --git a/lgsm/functions/core_messages.sh b/lgsm/functions/core_messages.sh index a4914bdd9..8a13cc6ea 100644 --- a/lgsm/functions/core_messages.sh +++ b/lgsm/functions/core_messages.sh @@ -116,6 +116,17 @@ fn_script_log_info(){ fi } +## Feb 28 14:56:58 ut99-server: Monitor: INFO: +fn_script_log_update(){ + if [ -d "${lgsmlogdir}" ]; then + if [ -n "${commandname}" ]; then + echo -e "$(date '+%b %d %H:%M:%S.%3N') ${selfname}: ${commandname}: UPDATE: ${1}" >> "${lgsmlog}" + else + echo -e "$(date '+%b %d %H:%M:%S.%3N') ${selfname}: UPDATE: ${1}" >> "${lgsmlog}" + fi + fi +} + # On-Screen - Automated functions ################################## diff --git a/lgsm/functions/info_distro.sh b/lgsm/functions/info_distro.sh index 0316e25a3..7f1ea12c1 100644 --- a/lgsm/functions/info_distro.sh +++ b/lgsm/functions/info_distro.sh @@ -9,7 +9,7 @@ functionselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" ### Game Server pid if [ "${status}" == "1" ]; then - gameserverpid=$(tmux list-sessions -F "#{session_name} #{pane_pid}"| grep "^${selfname}"|awk '{print $2}') + gameserverpid=$(tmux list-sessions -F "#{session_name} #{pane_pid}"| grep "^${sessionname}"|awk '{print $2}') fi ### Distro information diff --git a/lgsm/functions/info_stats.sh b/lgsm/functions/info_stats.sh index 9bdee07fd..a99f877af 100644 --- a/lgsm/functions/info_stats.sh +++ b/lgsm/functions/info_stats.sh @@ -23,10 +23,10 @@ fi if [ ! -f "${datadir}/uuid-${selfname}.txt" ]||[ ! -f "${datadir}/uuid-install.txt" ]; then # download dictionary words if [ ! -f "${datadir}/name-left.csv" ]; then - fn_fetch_file_github "lgsm/data" "name-left.csv" "${datadir}" "nochmodx" "norun" "forcedl" "nomd5" + fn_fetch_file_git "lgsm/data" "name-left.csv" "${datadir}" "nochmodx" "norun" "forcedl" "nomd5" fi if [ ! -f "${datadir}/name-right.csv" ]; then - fn_fetch_file_github "lgsm/data" "name-right.csv" "${datadir}" "nochmodx" "norun" "forcedl" "nomd5" + fn_fetch_file_git "lgsm/data" "name-right.csv" "${datadir}" "nochmodx" "norun" "forcedl" "nomd5" fi # generate instance uuid diff --git a/lgsm/functions/install_config.sh b/lgsm/functions/install_config.sh index 8851a2e70..ced111afb 100644 --- a/lgsm/functions/install_config.sh +++ b/lgsm/functions/install_config.sh @@ -25,7 +25,7 @@ fn_fetch_default_config(){ mkdir -p "${lgsmdir}/config-default/config-game" githuburl="https://raw.githubusercontent.com/GameServerManagers/Game-Server-Configs/master" for config in "${array_configs[@]}"; do - fn_fetch_file "${githuburl}/${gamedirname}/${config}" "${lgsmdir}/config-default/config-game" "${config}" "nochmodx" "norun" "forcedl" "nomd5" + fn_fetch_file "${githuburl}/${gamedirname}/${config}" "${remote_fileurl_backup}" "GitHub" "Bitbucket" "${lgsmdir}/config-default/config-game" "${config}" "nochmodx" "norun" "forcedl" "nomd5" done } diff --git a/lgsm/functions/install_modules.sh b/lgsm/functions/install_modules.sh new file mode 100644 index 000000000..c512b69a3 --- /dev/null +++ b/lgsm/functions/install_modules.sh @@ -0,0 +1,16 @@ +#!/bin/bash +# LinuxGSM install_modules.sh function +# Author: Daniel Gibbs +# Website: https://linuxgsm.com +# Description: Downloads all modules on install + +echo -e "" +echo -e "${lightyellow}Downloading LinuxGSM Modules${default}" +echo -e "=================================" + +fn_fetch_file "https://github.com/GameServerManagers/LinuxGSM/archive/master.tar.gz" "${tmpdir}" "master.tar.gz" "nochmodx" "norun" "noforce" "nomd5" +fn_dl_extract "${tmpdir}" "master.tar.gz" "${tmpdir}" +cp "${tmpdir}/LinuxGSM-master/lgsm/functions"/*.sh "${functionsdir}" +cp "${tmpdir}/LinuxGSM-master/lgsm/functions"/*.py "${functionsdir}" +chmod +x "${functionsdir}"/* +command_update_linuxgsm.sh diff --git a/lgsm/functions/update_factorio.sh b/lgsm/functions/update_factorio.sh index e45a75c8c..8110e882f 100644 --- a/lgsm/functions/update_factorio.sh +++ b/lgsm/functions/update_factorio.sh @@ -7,7 +7,7 @@ functionselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" fn_update_factorio_dl(){ - fn_fetch_file "https://factorio.com/get-download/${downloadbranch}/headless/${factorioarch}" "${tmpdir}" "factorio_headless_${factorioarch}-${remotebuild}.tar.xz" + fn_fetch_file "https://factorio.com/get-download/${downloadbranch}/headless/${factorioarch}" "" "" "" "${tmpdir}" "factorio_headless_${factorioarch}-${remotebuild}.tar.xz" "" "norun" "noforce" "nomd5" fn_dl_extract "${tmpdir}" "factorio_headless_${factorioarch}-${remotebuild}.tar.xz" "${tmpdir}" echo -e "copying to ${serverfiles}...\c" cp -R "${tmpdir}/factorio/"* "${serverfiles}" diff --git a/lgsm/functions/update_minecraft.sh b/lgsm/functions/update_minecraft.sh index d74586143..b9db53ec0 100644 --- a/lgsm/functions/update_minecraft.sh +++ b/lgsm/functions/update_minecraft.sh @@ -14,7 +14,7 @@ fn_update_minecraft_dl(){ fi latestmcbuildurl=$(curl -s "${latestmcreleaselink}" | jq -r '.downloads.server.url') - fn_fetch_file "${latestmcbuildurl}" "${tmpdir}" "minecraft_server.${remotebuild}.jar" + fn_fetch_file "${latestmcbuildurl}" "" "" "" "${tmpdir}" "minecraft_server.${remotebuild}.jar" "" "norun" "noforce" "nomd5" echo -e "copying to ${serverfiles}...\c" cp "${tmpdir}/minecraft_server.${remotebuild}.jar" "${serverfiles}/minecraft_server.jar" local exitcode=$? diff --git a/lgsm/functions/update_mta.sh b/lgsm/functions/update_mta.sh index 57c452d8a..0fe79ebff 100644 --- a/lgsm/functions/update_mta.sh +++ b/lgsm/functions/update_mta.sh @@ -7,7 +7,7 @@ functionselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" fn_update_mta_dl(){ - fn_fetch_file "http://linux.mtasa.com/dl/multitheftauto_linux_x64.tar.gz" "${tmpdir}" "multitheftauto_linux_x64.tar.gz" + fn_fetch_file "http://linux.mtasa.com/dl/multitheftauto_linux_x64.tar.gz" "" "" "" "${tmpdir}" "multitheftauto_linux_x64.tar.gz" "" "norun" "noforce" "nomd5" mkdir "${tmpdir}/multitheftauto_linux_x64" fn_dl_extract "${tmpdir}" "multitheftauto_linux_x64.tar.gz" "${tmpdir}/multitheftauto_linux_x64" echo -e "copying to ${serverfiles}...\c" diff --git a/lgsm/functions/update_mumble.sh b/lgsm/functions/update_mumble.sh index 38fc78aa3..652db5b89 100644 --- a/lgsm/functions/update_mumble.sh +++ b/lgsm/functions/update_mumble.sh @@ -7,7 +7,7 @@ functionselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" fn_update_mumble_dl(){ - fn_fetch_file "https://github.com/mumble-voip/mumble/releases/download/${remotebuild}/murmur-static_${mumblearch}-${remotebuild}.tar.bz2" "${tmpdir}" "murmur-static_${mumblearch}-${remotebuild}.tar.bz2" + fn_fetch_file "https://github.com/mumble-voip/mumble/releases/download/${remotebuild}/murmur-static_${mumblearch}-${remotebuild}.tar.bz2" "" "" "" "${tmpdir}" "murmur-static_${mumblearch}-${remotebuild}.tar.bz2" "" "norun" "noforce" "nomd5" fn_dl_extract "${tmpdir}" "murmur-static_${mumblearch}-${remotebuild}.tar.bz2" "${tmpdir}" echo -e "copying to ${serverfiles}...\c" cp -R "${tmpdir}/murmur-static_${mumblearch}-${remotebuild}/"* "${serverfiles}" diff --git a/lgsm/functions/update_ts3.sh b/lgsm/functions/update_ts3.sh index e50590087..fbabd3d83 100644 --- a/lgsm/functions/update_ts3.sh +++ b/lgsm/functions/update_ts3.sh @@ -12,7 +12,7 @@ fn_update_ts3_dl(){ elif [ "${ts3arch}" == "x86" ]; then remotebuildurl=$(curl -s 'https://www.teamspeak.com/versions/server.json' | jq -r '.linux.x86.mirrors."teamspeak.com"') fi - fn_fetch_file "${remotebuildurl}" "${tmpdir}" "teamspeak3-server_linux_${ts3arch}-${remotebuild}.tar.bz2" + fn_fetch_file "${remotebuildurl}" "" "" "" "${tmpdir}" "teamspeak3-server_linux_${ts3arch}-${remotebuild}.tar.bz2" "" "norun" "noforce" "nomd5" fn_dl_extract "${tmpdir}" "teamspeak3-server_linux_${ts3arch}-${remotebuild}.tar.bz2" "${tmpdir}" echo -e "copying to ${serverfiles}...\c" cp -R "${tmpdir}/teamspeak3-server_linux_${ts3arch}/"* "${serverfiles}" diff --git a/linuxgsm.sh b/linuxgsm.sh index 983df7271..f4b8c8607 100755 --- a/linuxgsm.sh +++ b/linuxgsm.sh @@ -26,6 +26,7 @@ gameservername="core" commandname="CORE" rootdir=$(dirname "$(readlink -f "${BASH_SOURCE[0]}")") selfname=$(basename "$(readlink -f "${BASH_SOURCE[0]}")") +sessionname=$(echo "${selfname}" | cut -f1 -d".") lgsmdir="${rootdir}/lgsm" logdir="${rootdir}/log" lgsmlogdir="${logdir}/lgsm" @@ -59,46 +60,97 @@ core_functions.sh(){ # Fetches the core functions required before passed off to core_dl.sh. fn_bootstrap_fetch_file(){ remote_fileurl="${1}" - local_filedir="${2}" - local_filename="${3}" - chmodx="${4:-0}" - run="${5:-0}" - forcedl="${6:-0}" - md5="${7:-0}" + remote_fileurl_backup="${2}" + remote_fileurl_name="${3}" + remote_fileurl_backup_name="${4}" + local_filedir="${5}" + local_filename="${6}" + chmodx="${7:-0}" + run="${8:-0}" + forcedl="${9:-0}" + md5="${10:-0}" # Download file if missing or download forced. if [ ! -f "${local_filedir}/${local_filename}" ]||[ "${forcedl}" == "forcedl" ]; then - if [ ! -d "${local_filedir}" ]; then - mkdir -p "${local_filedir}" + # If backup fileurl exists include it. + if [ -n "${remote_fileurl_backup}" ]; then + # counter set to 0 to allow second try + counter=0 + remote_fileurls_array=( remote_fileurl remote_fileurl_backup ) + else + # counter set to 1 to not allow second try + counter=1 + remote_fileurls_array=( remote_fileurl ) fi - # If curl exists download file. - if [ "$(command -v curl 2>/dev/null)" ]; then - # Trap to remove part downloaded files. - echo -en " fetching ${local_filename}...\c" - curlcmd=$(curl -s --fail -L -o "${local_filedir}/${local_filename}" "${remote_fileurl}" 2>&1) + for remote_fileurl_array in "${remote_fileurls_array[@]}" + do + if [ "${remote_fileurl_array}" == "remote_fileurl" ]; then + fileurl="${remote_fileurl}" + fileurl_name="${remote_fileurl_name}" + elif [ "${remote_fileurl_array}" == "remote_fileurl_backup" ]; then + fileurl="${remote_fileurl_backup}" + fileurl_name="${remote_fileurl_backup_name}" + fi + counter=$((counter+1)) + if [ ! -d "${local_filedir}" ]; then + mkdir -p "${local_filedir}" + fi + # Trap will remove part downloaded files if canceled. + trap fn_fetch_trap INT + # Larger files show a progress bar. + + echo -en "fetching ${fileurl_name} ${local_filename}...\c" + curlcmd=$(curl -s --fail -L -o "${local_filedir}/${local_filename}" "${fileurl}" 2>&1) + local exitcode=$? + + # Download will fail if downloads a html file. + if [ -f "${local_filedir}/${local_filename}" ]; then + if [ -n "$(head "${local_filedir}/${local_filename}" | grep "DOCTYPE" )" ]; then + rm "${local_filedir:?}/${local_filename:?}" + local exitcode=2 + fi + fi + + # On first try will error. On second try will fail. if [ ${exitcode} -ne 0 ]; then - echo -e "FAIL" - if [ -f "${lgsmlog}" ]; then - echo -e "${remote_fileurl}" | tee -a "${lgsmlog}" - echo -e "${curlcmd}" | tee -a "${lgsmlog}" + if [ ${counter} -ge 2 ]; then + echo -e "FAIL" + if [ -f "${lgsmlog}" ]; then + fn_script_log_fatal "Downloading ${local_filename}" + fn_script_log_fatal "${fileurl}" + fi + core_exit.sh + else + echo -e "ERROR" + if [ -f "${lgsmlog}" ]; then + fn_script_log_error "Downloading ${local_filename}" + fn_script_log_error "${fileurl}" + fi fi - exit 1 else - echo -e "OK" + echo -en "OK" + sleep 0.3 + echo -en "\033[2K\\r" + if [ -f "${lgsmlog}" ]; then + fn_script_log_pass "Downloading ${local_filename}" + fi + + # Make file executable if chmodx is set. + if [ "${chmodx}" == "chmodx" ]; then + chmod +x "${local_filedir}/${local_filename}" + fi + + # Remove trap. + trap - INT + + break fi - else - echo -e "[ FAIL ] Curl is not installed" - exit 1 - fi - # Make file chmodx if chmodx is set. - if [ "${chmodx}" == "chmodx" ]; then - chmod +x "${local_filedir}/${local_filename}" - fi + done fi if [ -f "${local_filedir}/${local_filename}" ]; then - # Run file if run is set. + # Execute file if run is set. if [ "${run}" == "run" ]; then # shellcheck source=/dev/null source "${local_filedir}/${local_filename}" @@ -109,9 +161,15 @@ fn_bootstrap_fetch_file(){ 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}" + if [ "${githubbranch}" == "master" ]&&[ "${commandname}" != "UPDATE-LGSM" ]; then + remote_fileurl="https://raw.githubusercontent.com/${githubuser}/${githubrepo}/${version}/${github_file_url_dir}/${github_file_url_name}" + remote_fileurl_backup="https://bitbucket.org/${githubuser}/${githubrepo}/raw/${version}/${github_file_url_dir}/${github_file_url_name}" + else + remote_fileurl="https://raw.githubusercontent.com/${githubuser}/${githubrepo}/${githubbranch}/${github_file_url_dir}/${github_file_url_name}" + remote_fileurl_backup="https://bitbucket.org/${githubuser}/${githubrepo}/raw/${githubbranch}/${github_file_url_dir}/${github_file_url_name}" + fi + remote_fileurl_name="GitHub" + remote_fileurl_backup_name="Bitbucket" local_filedir="${3}" local_filename="${github_file_url_name}" chmodx="${4:-0}" @@ -119,7 +177,7 @@ fn_bootstrap_fetch_file_github(){ 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}" + fn_bootstrap_fetch_file "${remote_fileurl}" "${remote_fileurl_backup}" "${remote_fileurl_name}" "${remote_fileurl_backup_name}" "${local_filedir}" "${local_filename}" "${chmodx}" "${run}" "${forcedl}" "${md5}" } # Installer menu. @@ -321,10 +379,9 @@ else fi if [ ! -f "${configdirserver}/_default.cfg" ]; then mkdir -p "${configdirserver}" - echo -en " copying _default.cfg...\c" + echo -en "copying _default.cfg...\c" cp -R "${configdirdefault}/config-lgsm/${gameservername}/_default.cfg" "${configdirserver}/_default.cfg" - exitcode=$? - if [ ${exitcode} -ne 0 ]; then + if [ $? -ne 0 ]; then echo -e "FAIL" exit 1 else @@ -333,11 +390,10 @@ else else 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 -en " copying _default.cfg...\c" + fn_print_warn_nl "_default.cfg has altered. reloading config." + echo -en "copying _default.cfg...\c" cp -R "${configdirdefault}/config-lgsm/${gameservername}/_default.cfg" "${configdirserver}/_default.cfg" - exitcode=$? - if [ ${exitcode} -ne 0 ]; then + if [ $? -ne 0 ]; then echo -e "FAIL" exit 1 else diff --git a/tests/tests_fctrserver.sh b/tests/tests_fctrserver.sh index 7881ad8d6..4bee74eae 100644 --- a/tests/tests_fctrserver.sh +++ b/tests/tests_fctrserver.sh @@ -23,8 +23,10 @@ fi version="v20.2.1" shortname="fctr" gameservername="fctrserver" +commandname="CORE" rootdir=$(dirname "$(readlink -f "${BASH_SOURCE[0]}")") selfname=$(basename "$(readlink -f "${BASH_SOURCE[0]}")") +sessionname=$(echo "${selfname}" | cut -f1 -d".") lgsmdir="${rootdir}/lgsm" logdir="${rootdir}/log" lgsmlogdir="${logdir}/lgsm" @@ -43,16 +45,11 @@ userinput="${1}" # Allows for testing not on Travis CI. # if using travis for tests -if [ -n "${TRAVIS}" ]; then - selfname="travis" -# if not using travis for tests -else +if [ -z "${TRAVIS}" ]; then TRAVIS_BRANCH="develop" TRAVIS_BUILD_DIR="${rootdir}" - fi travistest="1" - ## GitHub Branch Select # Allows for the use of different function files # from a different repo and/or branch. @@ -70,46 +67,97 @@ core_functions.sh(){ # Fetches the core functions required before passed off to core_dl.sh. fn_bootstrap_fetch_file(){ remote_fileurl="${1}" - local_filedir="${2}" - local_filename="${3}" - chmodx="${4:-0}" - run="${5:-0}" - forcedl="${6:-0}" - md5="${7:-0}" + remote_fileurl_backup="${2}" + remote_fileurl_name="${3}" + remote_fileurl_backup_name="${4}" + local_filedir="${5}" + local_filename="${6}" + chmodx="${7:-0}" + run="${8:-0}" + forcedl="${9:-0}" + md5="${10:-0}" # Download file if missing or download forced. if [ ! -f "${local_filedir}/${local_filename}" ]||[ "${forcedl}" == "forcedl" ]; then - if [ ! -d "${local_filedir}" ]; then - mkdir -p "${local_filedir}" + # If backup fileurl exists include it. + if [ -n "${remote_fileurl_backup}" ]; then + # counter set to 0 to allow second try + counter=0 + remote_fileurls_array=( remote_fileurl remote_fileurl_backup ) + else + # counter set to 1 to not allow second try + counter=1 + remote_fileurls_array=( remote_fileurl ) fi - # If curl exists download file. - if [ "$(command -v curl 2>/dev/null)" ]; then - # Trap to remove part downloaded files. - echo -en " fetching ${local_filename}...\c" - curlcmd=$(curl -s --fail -L -o "${local_filedir}/${local_filename}" "${remote_fileurl}" 2>&1) + for remote_fileurl_array in "${remote_fileurls_array[@]}" + do + if [ "${remote_fileurl_array}" == "remote_fileurl" ]; then + fileurl="${remote_fileurl}" + fileurl_name="${remote_fileurl_name}" + elif [ "${remote_fileurl_array}" == "remote_fileurl_backup" ]; then + fileurl="${remote_fileurl_backup}" + fileurl_name="${remote_fileurl_backup_name}" + fi + counter=$((counter+1)) + if [ ! -d "${local_filedir}" ]; then + mkdir -p "${local_filedir}" + fi + # Trap will remove part downloaded files if canceled. + trap fn_fetch_trap INT + # Larger files show a progress bar. + + echo -en "fetching ${fileurl_name} ${local_filename}...\c" + curlcmd=$(curl -s --fail -L -o "${local_filedir}/${local_filename}" "${fileurl}" 2>&1) + local exitcode=$? + # Download will fail if downloads a html file. + if [ -f "${local_filedir}/${local_filename}" ]; then + if [ -n "$(head "${local_filedir}/${local_filename}" | grep "DOCTYPE" )" ]; then + rm "${local_filedir:?}/${local_filename:?}" + local exitcode=2 + fi + fi + + # On first try will error. On second try will fail. if [ ${exitcode} -ne 0 ]; then - echo -e "FAIL" - if [ -f "${lgsmlog}" ]; then - echo -e "${remote_fileurl}" | tee -a "${lgsmlog}" - echo -e "${curlcmd}" | tee -a "${lgsmlog}" + if [ ${counter} -ge 2 ]; then + echo -e "FAIL" + if [ -f "${lgsmlog}" ]; then + fn_script_log_fatal "Downloading ${local_filename}" + fn_script_log_fatal "${fileurl}" + fi + core_exit.sh + else + echo -e "ERROR" + if [ -f "${lgsmlog}" ]; then + fn_script_log_error "Downloading ${local_filename}" + fn_script_log_error "${fileurl}" + fi fi - exit 1 + else - echo -e "OK" + echo -en "OK" + sleep 0.3 + echo -en "\033[2K\\r" + if [ -f "${lgsmlog}" ]; then + fn_script_log_pass "Downloading ${local_filename}" + fi + + # Make file executable if chmodx is set. + if [ "${chmodx}" == "chmodx" ]; then + chmod +x "${local_filedir}/${local_filename}" + fi + + # Remove trap. + trap - INT + + break fi - else - echo -e "[ FAIL ] Curl is not installed" - exit 1 - fi - # Make file chmodx if chmodx is set. - if [ "${chmodx}" == "chmodx" ]; then - chmod +x "${local_filedir}/${local_filename}" - fi + done fi if [ -f "${local_filedir}/${local_filename}" ]; then - # Run file if run is set. + # Execute file if run is set. if [ "${run}" == "run" ]; then # shellcheck source=/dev/null source "${local_filedir}/${local_filename}" @@ -120,9 +168,15 @@ fn_bootstrap_fetch_file(){ 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}" + if [ "${githubbranch}" == "master" ]&&[ "${commandname}" != "UPDATE-LGSM" ]; then + remote_fileurl="https://raw.githubusercontent.com/${githubuser}/${githubrepo}/${version}/${github_file_url_dir}/${github_file_url_name}" + remote_fileurl_backup="https://bitbucket.org/${githubuser}/${githubrepo}/raw/${version}/${github_file_url_dir}/${github_file_url_name}" + else + remote_fileurl="https://raw.githubusercontent.com/${githubuser}/${githubrepo}/${githubbranch}/${github_file_url_dir}/${github_file_url_name}" + remote_fileurl_backup="https://bitbucket.org/${githubuser}/${githubrepo}/raw/${githubbranch}/${github_file_url_dir}/${github_file_url_name}" + fi + remote_fileurl_name="GitHub" + remote_fileurl_backup_name="Bitbucket" local_filedir="${3}" local_filename="${github_file_url_name}" chmodx="${4:-0}" @@ -130,7 +184,7 @@ fn_bootstrap_fetch_file_github(){ 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}" + fn_bootstrap_fetch_file "${remote_fileurl}" "${remote_fileurl_backup}" "${remote_fileurl_name}" "${remote_fileurl_backup_name}" "${local_filedir}" "${local_filename}" "${chmodx}" "${run}" "${forcedl}" "${md5}" } # Installer menu. @@ -332,7 +386,7 @@ else fi if [ ! -f "${configdirserver}/_default.cfg" ]; then mkdir -p "${configdirserver}" - echo -en " copying _default.cfg...\c" + echo -en "copying _default.cfg...\c" cp -R "${configdirdefault}/config-lgsm/${gameservername}/_default.cfg" "${configdirserver}/_default.cfg" exitcode=$? if [ ${exitcode} -ne 0 ]; then @@ -345,7 +399,7 @@ else 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 -en " copying _default.cfg...\c" + echo -en "copying _default.cfg...\c" cp -R "${configdirdefault}/config-lgsm/${gameservername}/_default.cfg" "${configdirserver}/_default.cfg" exitcode=$? if [ ${exitcode} -ne 0 ]; then diff --git a/tests/tests_jc2server.sh b/tests/tests_jc2server.sh index dd39ce047..1cc6143cb 100644 --- a/tests/tests_jc2server.sh +++ b/tests/tests_jc2server.sh @@ -23,8 +23,10 @@ fi version="v20.2.1" shortname="jc2" gameservername="jc2server" +commandname="CORE" rootdir=$(dirname "$(readlink -f "${BASH_SOURCE[0]}")") selfname=$(basename "$(readlink -f "${BASH_SOURCE[0]}")") +sessionname=$(echo "${selfname}" | cut -f1 -d".") lgsmdir="${rootdir}/lgsm" logdir="${rootdir}/log" lgsmlogdir="${logdir}/lgsm" @@ -43,10 +45,7 @@ userinput="${1}" # Allows for testing not on Travis CI. # if using travis for tests -if [ -n "${TRAVIS}" ]; then - selfname="travis" -# if not using travis for tests -else +if [ -z "${TRAVIS}" ]; then TRAVIS_BRANCH="develop" TRAVIS_BUILD_DIR="${rootdir}" fi @@ -69,46 +68,97 @@ core_functions.sh(){ # Fetches the core functions required before passed off to core_dl.sh. fn_bootstrap_fetch_file(){ remote_fileurl="${1}" - local_filedir="${2}" - local_filename="${3}" - chmodx="${4:-0}" - run="${5:-0}" - forcedl="${6:-0}" - md5="${7:-0}" + remote_fileurl_backup="${2}" + remote_fileurl_name="${3}" + remote_fileurl_backup_name="${4}" + local_filedir="${5}" + local_filename="${6}" + chmodx="${7:-0}" + run="${8:-0}" + forcedl="${9:-0}" + md5="${10:-0}" # Download file if missing or download forced. if [ ! -f "${local_filedir}/${local_filename}" ]||[ "${forcedl}" == "forcedl" ]; then - if [ ! -d "${local_filedir}" ]; then - mkdir -p "${local_filedir}" + # If backup fileurl exists include it. + if [ -n "${remote_fileurl_backup}" ]; then + # counter set to 0 to allow second try + counter=0 + remote_fileurls_array=( remote_fileurl remote_fileurl_backup ) + else + # counter set to 1 to not allow second try + counter=1 + remote_fileurls_array=( remote_fileurl ) fi - # If curl exists download file. - if [ "$(command -v curl 2>/dev/null)" ]; then - # Trap to remove part downloaded files. - echo -en " fetching ${local_filename}...\c" - curlcmd=$(curl -s --fail -L -o "${local_filedir}/${local_filename}" "${remote_fileurl}" 2>&1) + for remote_fileurl_array in "${remote_fileurls_array[@]}" + do + if [ "${remote_fileurl_array}" == "remote_fileurl" ]; then + fileurl="${remote_fileurl}" + fileurl_name="${remote_fileurl_name}" + elif [ "${remote_fileurl_array}" == "remote_fileurl_backup" ]; then + fileurl="${remote_fileurl_backup}" + fileurl_name="${remote_fileurl_backup_name}" + fi + counter=$((counter+1)) + if [ ! -d "${local_filedir}" ]; then + mkdir -p "${local_filedir}" + fi + # Trap will remove part downloaded files if canceled. + trap fn_fetch_trap INT + # Larger files show a progress bar. + + echo -en "fetching ${fileurl_name} ${local_filename}...\c" + curlcmd=$(curl -s --fail -L -o "${local_filedir}/${local_filename}" "${fileurl}" 2>&1) + local exitcode=$? + # Download will fail if downloads a html file. + if [ -f "${local_filedir}/${local_filename}" ]; then + if [ -n "$(head "${local_filedir}/${local_filename}" | grep "DOCTYPE" )" ]; then + rm "${local_filedir:?}/${local_filename:?}" + local exitcode=2 + fi + fi + + # On first try will error. On second try will fail. if [ ${exitcode} -ne 0 ]; then - echo -e "FAIL" - if [ -f "${lgsmlog}" ]; then - echo -e "${remote_fileurl}" | tee -a "${lgsmlog}" - echo -e "${curlcmd}" | tee -a "${lgsmlog}" + if [ ${counter} -ge 2 ]; then + echo -e "FAIL" + if [ -f "${lgsmlog}" ]; then + fn_script_log_fatal "Downloading ${local_filename}" + fn_script_log_fatal "${fileurl}" + fi + core_exit.sh + else + echo -e "ERROR" + if [ -f "${lgsmlog}" ]; then + fn_script_log_error "Downloading ${local_filename}" + fn_script_log_error "${fileurl}" + fi fi - exit 1 + else - echo -e "OK" + echo -en "OK" + sleep 0.3 + echo -en "\033[2K\\r" + if [ -f "${lgsmlog}" ]; then + fn_script_log_pass "Downloading ${local_filename}" + fi + + # Make file executable if chmodx is set. + if [ "${chmodx}" == "chmodx" ]; then + chmod +x "${local_filedir}/${local_filename}" + fi + + # Remove trap. + trap - INT + + break fi - else - echo -e "[ FAIL ] Curl is not installed" - exit 1 - fi - # Make file chmodx if chmodx is set. - if [ "${chmodx}" == "chmodx" ]; then - chmod +x "${local_filedir}/${local_filename}" - fi + done fi if [ -f "${local_filedir}/${local_filename}" ]; then - # Run file if run is set. + # Execute file if run is set. if [ "${run}" == "run" ]; then # shellcheck source=/dev/null source "${local_filedir}/${local_filename}" @@ -119,9 +169,15 @@ fn_bootstrap_fetch_file(){ 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}" + if [ "${githubbranch}" == "master" ]&&[ "${commandname}" != "UPDATE-LGSM" ]; then + remote_fileurl="https://raw.githubusercontent.com/${githubuser}/${githubrepo}/${version}/${github_file_url_dir}/${github_file_url_name}" + remote_fileurl_backup="https://bitbucket.org/${githubuser}/${githubrepo}/raw/${version}/${github_file_url_dir}/${github_file_url_name}" + else + remote_fileurl="https://raw.githubusercontent.com/${githubuser}/${githubrepo}/${githubbranch}/${github_file_url_dir}/${github_file_url_name}" + remote_fileurl_backup="https://bitbucket.org/${githubuser}/${githubrepo}/raw/${githubbranch}/${github_file_url_dir}/${github_file_url_name}" + fi + remote_fileurl_name="GitHub" + remote_fileurl_backup_name="Bitbucket" local_filedir="${3}" local_filename="${github_file_url_name}" chmodx="${4:-0}" @@ -129,7 +185,7 @@ fn_bootstrap_fetch_file_github(){ 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}" + fn_bootstrap_fetch_file "${remote_fileurl}" "${remote_fileurl_backup}" "${remote_fileurl_name}" "${remote_fileurl_backup_name}" "${local_filedir}" "${local_filename}" "${chmodx}" "${run}" "${forcedl}" "${md5}" } # Installer menu. @@ -331,7 +387,7 @@ else fi if [ ! -f "${configdirserver}/_default.cfg" ]; then mkdir -p "${configdirserver}" - echo -en " copying _default.cfg...\c" + echo -en "copying _default.cfg...\c" cp -R "${configdirdefault}/config-lgsm/${gameservername}/_default.cfg" "${configdirserver}/_default.cfg" exitcode=$? if [ ${exitcode} -ne 0 ]; then @@ -344,7 +400,7 @@ else 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 -en " copying _default.cfg...\c" + echo -en "copying _default.cfg...\c" cp -R "${configdirdefault}/config-lgsm/${gameservername}/_default.cfg" "${configdirserver}/_default.cfg" exitcode=$? if [ ${exitcode} -ne 0 ]; then diff --git a/tests/tests_mcserver.sh b/tests/tests_mcserver.sh index a8f16a22a..2138b8faf 100644 --- a/tests/tests_mcserver.sh +++ b/tests/tests_mcserver.sh @@ -23,8 +23,10 @@ fi version="v20.2.1" shortname="mc" gameservername="mcserver" +commandname="CORE" rootdir=$(dirname "$(readlink -f "${BASH_SOURCE[0]}")") selfname=$(basename "$(readlink -f "${BASH_SOURCE[0]}")") +sessionname=$(echo "${selfname}" | cut -f1 -d".") lgsmdir="${rootdir}/lgsm" logdir="${rootdir}/log" lgsmlogdir="${logdir}/lgsm" @@ -43,13 +45,9 @@ userinput="${1}" # Allows for testing not on Travis CI. # if using travis for tests -if [ -n "${TRAVIS}" ]; then - selfname="travis" -# if not using travis for tests -else +if [ -z "${TRAVIS}" ]; then TRAVIS_BRANCH="develop" TRAVIS_BUILD_DIR="${rootdir}" - fi travistest="1" @@ -70,46 +68,97 @@ core_functions.sh(){ # Fetches the core functions required before passed off to core_dl.sh. fn_bootstrap_fetch_file(){ remote_fileurl="${1}" - local_filedir="${2}" - local_filename="${3}" - chmodx="${4:-0}" - run="${5:-0}" - forcedl="${6:-0}" - md5="${7:-0}" + remote_fileurl_backup="${2}" + remote_fileurl_name="${3}" + remote_fileurl_backup_name="${4}" + local_filedir="${5}" + local_filename="${6}" + chmodx="${7:-0}" + run="${8:-0}" + forcedl="${9:-0}" + md5="${10:-0}" # Download file if missing or download forced. if [ ! -f "${local_filedir}/${local_filename}" ]||[ "${forcedl}" == "forcedl" ]; then - if [ ! -d "${local_filedir}" ]; then - mkdir -p "${local_filedir}" + # If backup fileurl exists include it. + if [ -n "${remote_fileurl_backup}" ]; then + # counter set to 0 to allow second try + counter=0 + remote_fileurls_array=( remote_fileurl remote_fileurl_backup ) + else + # counter set to 1 to not allow second try + counter=1 + remote_fileurls_array=( remote_fileurl ) fi - # If curl exists download file. - if [ "$(command -v curl 2>/dev/null)" ]; then - # Trap to remove part downloaded files. - echo -en " fetching ${local_filename}...\c" - curlcmd=$(curl -s --fail -L -o "${local_filedir}/${local_filename}" "${remote_fileurl}" 2>&1) + for remote_fileurl_array in "${remote_fileurls_array[@]}" + do + if [ "${remote_fileurl_array}" == "remote_fileurl" ]; then + fileurl="${remote_fileurl}" + fileurl_name="${remote_fileurl_name}" + elif [ "${remote_fileurl_array}" == "remote_fileurl_backup" ]; then + fileurl="${remote_fileurl_backup}" + fileurl_name="${remote_fileurl_backup_name}" + fi + counter=$((counter+1)) + if [ ! -d "${local_filedir}" ]; then + mkdir -p "${local_filedir}" + fi + # Trap will remove part downloaded files if canceled. + trap fn_fetch_trap INT + # Larger files show a progress bar. + + echo -en "fetching ${fileurl_name} ${local_filename}...\c" + curlcmd=$(curl -s --fail -L -o "${local_filedir}/${local_filename}" "${fileurl}" 2>&1) + local exitcode=$? + # Download will fail if downloads a html file. + if [ -f "${local_filedir}/${local_filename}" ]; then + if [ -n "$(head "${local_filedir}/${local_filename}" | grep "DOCTYPE" )" ]; then + rm "${local_filedir:?}/${local_filename:?}" + local exitcode=2 + fi + fi + + # On first try will error. On second try will fail. if [ ${exitcode} -ne 0 ]; then - echo -e "FAIL" - if [ -f "${lgsmlog}" ]; then - echo -e "${remote_fileurl}" | tee -a "${lgsmlog}" - echo -e "${curlcmd}" | tee -a "${lgsmlog}" + if [ ${counter} -ge 2 ]; then + echo -e "FAIL" + if [ -f "${lgsmlog}" ]; then + fn_script_log_fatal "Downloading ${local_filename}" + fn_script_log_fatal "${fileurl}" + fi + core_exit.sh + else + echo -e "ERROR" + if [ -f "${lgsmlog}" ]; then + fn_script_log_error "Downloading ${local_filename}" + fn_script_log_error "${fileurl}" + fi fi - exit 1 + else - echo -e "OK" + echo -en "OK" + sleep 0.3 + echo -en "\033[2K\\r" + if [ -f "${lgsmlog}" ]; then + fn_script_log_pass "Downloading ${local_filename}" + fi + + # Make file executable if chmodx is set. + if [ "${chmodx}" == "chmodx" ]; then + chmod +x "${local_filedir}/${local_filename}" + fi + + # Remove trap. + trap - INT + + break fi - else - echo -e "[ FAIL ] Curl is not installed" - exit 1 - fi - # Make file chmodx if chmodx is set. - if [ "${chmodx}" == "chmodx" ]; then - chmod +x "${local_filedir}/${local_filename}" - fi + done fi if [ -f "${local_filedir}/${local_filename}" ]; then - # Run file if run is set. + # Execute file if run is set. if [ "${run}" == "run" ]; then # shellcheck source=/dev/null source "${local_filedir}/${local_filename}" @@ -120,9 +169,15 @@ fn_bootstrap_fetch_file(){ 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}" + if [ "${githubbranch}" == "master" ]&&[ "${commandname}" != "UPDATE-LGSM" ]; then + remote_fileurl="https://raw.githubusercontent.com/${githubuser}/${githubrepo}/${version}/${github_file_url_dir}/${github_file_url_name}" + remote_fileurl_backup="https://bitbucket.org/${githubuser}/${githubrepo}/raw/${version}/${github_file_url_dir}/${github_file_url_name}" + else + remote_fileurl="https://raw.githubusercontent.com/${githubuser}/${githubrepo}/${githubbranch}/${github_file_url_dir}/${github_file_url_name}" + remote_fileurl_backup="https://bitbucket.org/${githubuser}/${githubrepo}/raw/${githubbranch}/${github_file_url_dir}/${github_file_url_name}" + fi + remote_fileurl_name="GitHub" + remote_fileurl_backup_name="Bitbucket" local_filedir="${3}" local_filename="${github_file_url_name}" chmodx="${4:-0}" @@ -130,7 +185,7 @@ fn_bootstrap_fetch_file_github(){ 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}" + fn_bootstrap_fetch_file "${remote_fileurl}" "${remote_fileurl_backup}" "${remote_fileurl_name}" "${remote_fileurl_backup_name}" "${local_filedir}" "${local_filename}" "${chmodx}" "${run}" "${forcedl}" "${md5}" } # Installer menu. @@ -332,7 +387,7 @@ else fi if [ ! -f "${configdirserver}/_default.cfg" ]; then mkdir -p "${configdirserver}" - echo -en " copying _default.cfg...\c" + echo -en "copying _default.cfg...\c" cp -R "${configdirdefault}/config-lgsm/${gameservername}/_default.cfg" "${configdirserver}/_default.cfg" exitcode=$? if [ ${exitcode} -ne 0 ]; then @@ -345,7 +400,7 @@ else 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 -en " copying _default.cfg...\c" + echo -en "copying _default.cfg...\c" cp -R "${configdirdefault}/config-lgsm/${gameservername}/_default.cfg" "${configdirserver}/_default.cfg" exitcode=$? if [ ${exitcode} -ne 0 ]; then diff --git a/tests/tests_ts3server.sh b/tests/tests_ts3server.sh index af50e3805..6f393ad84 100644 --- a/tests/tests_ts3server.sh +++ b/tests/tests_ts3server.sh @@ -23,8 +23,10 @@ fi version="v20.2.1" shortname="ts3" gameservername="ts3server" +commandname="CORE" rootdir=$(dirname "$(readlink -f "${BASH_SOURCE[0]}")") selfname=$(basename "$(readlink -f "${BASH_SOURCE[0]}")") +sessionname=$(echo "${selfname}" | cut -f1 -d".") lgsmdir="${rootdir}/lgsm" logdir="${rootdir}/log" lgsmlogdir="${logdir}/lgsm" @@ -43,13 +45,9 @@ userinput="${1}" # Allows for testing not on Travis CI. # if using travis for tests -if [ -n "${TRAVIS}" ]; then - selfname="travis" -# if not using travis for tests -else +if [ -z "${TRAVIS}" ]; then TRAVIS_BRANCH="develop" TRAVIS_BUILD_DIR="${rootdir}" - fi travistest="1" @@ -70,46 +68,97 @@ core_functions.sh(){ # Fetches the core functions required before passed off to core_dl.sh. fn_bootstrap_fetch_file(){ remote_fileurl="${1}" - local_filedir="${2}" - local_filename="${3}" - chmodx="${4:-0}" - run="${5:-0}" - forcedl="${6:-0}" - md5="${7:-0}" + remote_fileurl_backup="${2}" + remote_fileurl_name="${3}" + remote_fileurl_backup_name="${4}" + local_filedir="${5}" + local_filename="${6}" + chmodx="${7:-0}" + run="${8:-0}" + forcedl="${9:-0}" + md5="${10:-0}" # Download file if missing or download forced. if [ ! -f "${local_filedir}/${local_filename}" ]||[ "${forcedl}" == "forcedl" ]; then - if [ ! -d "${local_filedir}" ]; then - mkdir -p "${local_filedir}" + # If backup fileurl exists include it. + if [ -n "${remote_fileurl_backup}" ]; then + # counter set to 0 to allow second try + counter=0 + remote_fileurls_array=( remote_fileurl remote_fileurl_backup ) + else + # counter set to 1 to not allow second try + counter=1 + remote_fileurls_array=( remote_fileurl ) fi - # If curl exists download file. - if [ "$(command -v curl 2>/dev/null)" ]; then - # Trap to remove part downloaded files. - echo -en " fetching ${local_filename}...\c" - curlcmd=$(curl -s --fail -L -o "${local_filedir}/${local_filename}" "${remote_fileurl}" 2>&1) + for remote_fileurl_array in "${remote_fileurls_array[@]}" + do + if [ "${remote_fileurl_array}" == "remote_fileurl" ]; then + fileurl="${remote_fileurl}" + fileurl_name="${remote_fileurl_name}" + elif [ "${remote_fileurl_array}" == "remote_fileurl_backup" ]; then + fileurl="${remote_fileurl_backup}" + fileurl_name="${remote_fileurl_backup_name}" + fi + counter=$((counter+1)) + if [ ! -d "${local_filedir}" ]; then + mkdir -p "${local_filedir}" + fi + # Trap will remove part downloaded files if canceled. + trap fn_fetch_trap INT + # Larger files show a progress bar. + + echo -en "fetching ${fileurl_name} ${local_filename}...\c" + curlcmd=$(curl -s --fail -L -o "${local_filedir}/${local_filename}" "${fileurl}" 2>&1) + local exitcode=$? + # Download will fail if downloads a html file. + if [ -f "${local_filedir}/${local_filename}" ]; then + if [ -n "$(head "${local_filedir}/${local_filename}" | grep "DOCTYPE" )" ]; then + rm "${local_filedir:?}/${local_filename:?}" + local exitcode=2 + fi + fi + + # On first try will error. On second try will fail. if [ ${exitcode} -ne 0 ]; then - echo -e "FAIL" - if [ -f "${lgsmlog}" ]; then - echo -e "${remote_fileurl}" | tee -a "${lgsmlog}" - echo -e "${curlcmd}" | tee -a "${lgsmlog}" + if [ ${counter} -ge 2 ]; then + echo -e "FAIL" + if [ -f "${lgsmlog}" ]; then + fn_script_log_fatal "Downloading ${local_filename}" + fn_script_log_fatal "${fileurl}" + fi + core_exit.sh + else + echo -e "ERROR" + if [ -f "${lgsmlog}" ]; then + fn_script_log_error "Downloading ${local_filename}" + fn_script_log_error "${fileurl}" + fi fi - exit 1 + else - echo -e "OK" + echo -en "OK" + sleep 0.3 + echo -en "\033[2K\\r" + if [ -f "${lgsmlog}" ]; then + fn_script_log_pass "Downloading ${local_filename}" + fi + + # Make file executable if chmodx is set. + if [ "${chmodx}" == "chmodx" ]; then + chmod +x "${local_filedir}/${local_filename}" + fi + + # Remove trap. + trap - INT + + break fi - else - echo -e "[ FAIL ] Curl is not installed" - exit 1 - fi - # Make file chmodx if chmodx is set. - if [ "${chmodx}" == "chmodx" ]; then - chmod +x "${local_filedir}/${local_filename}" - fi + done fi if [ -f "${local_filedir}/${local_filename}" ]; then - # Run file if run is set. + # Execute file if run is set. if [ "${run}" == "run" ]; then # shellcheck source=/dev/null source "${local_filedir}/${local_filename}" @@ -120,9 +169,15 @@ fn_bootstrap_fetch_file(){ 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}" + if [ "${githubbranch}" == "master" ]&&[ "${commandname}" != "UPDATE-LGSM" ]; then + remote_fileurl="https://raw.githubusercontent.com/${githubuser}/${githubrepo}/${version}/${github_file_url_dir}/${github_file_url_name}" + remote_fileurl_backup="https://bitbucket.org/${githubuser}/${githubrepo}/raw/${version}/${github_file_url_dir}/${github_file_url_name}" + else + remote_fileurl="https://raw.githubusercontent.com/${githubuser}/${githubrepo}/${githubbranch}/${github_file_url_dir}/${github_file_url_name}" + remote_fileurl_backup="https://bitbucket.org/${githubuser}/${githubrepo}/raw/${githubbranch}/${github_file_url_dir}/${github_file_url_name}" + fi + remote_fileurl_name="GitHub" + remote_fileurl_backup_name="Bitbucket" local_filedir="${3}" local_filename="${github_file_url_name}" chmodx="${4:-0}" @@ -130,7 +185,7 @@ fn_bootstrap_fetch_file_github(){ 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}" + fn_bootstrap_fetch_file "${remote_fileurl}" "${remote_fileurl_backup}" "${remote_fileurl_name}" "${remote_fileurl_backup_name}" "${local_filedir}" "${local_filename}" "${chmodx}" "${run}" "${forcedl}" "${md5}" } # Installer menu. @@ -332,7 +387,7 @@ else fi if [ ! -f "${configdirserver}/_default.cfg" ]; then mkdir -p "${configdirserver}" - echo -en " copying _default.cfg...\c" + echo -en "copying _default.cfg...\c" cp -R "${configdirdefault}/config-lgsm/${gameservername}/_default.cfg" "${configdirserver}/_default.cfg" exitcode=$? if [ ${exitcode} -ne 0 ]; then @@ -345,7 +400,7 @@ else 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 -en " copying _default.cfg...\c" + echo -en "copying _default.cfg...\c" cp -R "${configdirdefault}/config-lgsm/${gameservername}/_default.cfg" "${configdirserver}/_default.cfg" exitcode=$? if [ ${exitcode} -ne 0 ]; then From 7a6b9f3294feea549052e25a19c7bf6f1e0f5fc9 Mon Sep 17 00:00:00 2001 From: Christian Date: Tue, 19 May 2020 10:56:27 +0200 Subject: [PATCH 372/534] fix(mods): sdtd oxide url parsing from github with jq (#2883) --- 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 e47f3f909..6485faa45 100644 --- a/lgsm/functions/mods_list.sh +++ b/lgsm/functions/mods_list.sh @@ -37,7 +37,7 @@ get5url="${get5downloadurl}" # Oxide oxiderustlatestlink="https://umod.org/games/rust/download/develop" # fix for linux build 06.09.2019 oxidehurtworldlatestlink=$(curl -sL https://api.github.com/repos/OxideMod/Oxide.Hurtworld/releases/latest | grep browser_download_url | cut -d '"' -f 4 | grep "Oxide.Hurtworld.zip") -oxidesdtdlatestlink=$(curl -sL https://api.github.com/repos/OxideMod/Oxide.SevenDaysToDie/releases/latest | grep browser_download_url | cut -d '"' -f 4) +oxidesdtdlatestlink=$(curl -sL https://api.github.com/repos/OxideMod/Oxide.SevenDaysToDie/releases/latest | jq -r '.assets[]|select(.browser_download_url | contains("linux")) | .browser_download_url' ) # Define mods information (required) From b4c6f561ebbba5bcc22ebc616852da2b96a1b467 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Tue, 19 May 2020 11:27:58 +0100 Subject: [PATCH 373/534] remove dev code --- lgsm/functions/command_update_linuxgsm.sh | 4 ---- 1 file changed, 4 deletions(-) diff --git a/lgsm/functions/command_update_linuxgsm.sh b/lgsm/functions/command_update_linuxgsm.sh index 1fe1e39fa..05397692f 100644 --- a/lgsm/functions/command_update_linuxgsm.sh +++ b/lgsm/functions/command_update_linuxgsm.sh @@ -100,11 +100,7 @@ fi # Ignoring server specific vars. echo -en "checking ${selfname}...\c" fn_script_log_info "Checking ${selfname}" -echo "TMPDIR: ${tmpdir}" -echo "ROOTDIR: ${rootdir}" -echo "SELFNAME: ${selfname}" script_diff=$(diff <(sed '\/shortname/d;\/gameservername/d;\/gamename/d;\/githubuser/d;\/githubrepo/d;\/githubbranch/d' "${tmpdir}/linuxgsm.sh") <(sed '\/shortname/d;\/gameservername/d;\/gamename/d;\/githubuser/d;\/githubrepo/d;\/githubbranch/d' "${rootdir}/${selfname}")) -echo "==========================================" if [ "${script_diff}" != "" ]; then fn_print_update_eol_nl fn_script_log_update "Checking ${selfname}" From 6fcd8d78f4b9d42109b6a524df32d4eb6a8c1059 Mon Sep 17 00:00:00 2001 From: Christian Date: Wed, 20 May 2020 09:18:35 +0200 Subject: [PATCH 374/534] feat(newserver): Chivalry: Medieval Warfare (#2880) Co-authored-by: Daniel Gibbs --- .../config-lgsm/cmwserver/_default.cfg | 175 ++++++++++++++++++ lgsm/data/serverlist.csv | 1 + lgsm/functions/command_dev_query_raw.sh | 4 +- lgsm/functions/command_monitor.sh | 2 +- lgsm/functions/command_update_linuxgsm.sh | 2 +- lgsm/functions/core_functions.sh | 5 + lgsm/functions/fix.sh | 4 +- lgsm/functions/fix_cmw.sh | 33 ++++ lgsm/functions/fix_hw.sh | 8 +- lgsm/functions/fix_steamcmd.sh | 12 +- lgsm/functions/info_config.sh | 20 ++ lgsm/functions/info_messages.sh | 14 ++ lgsm/functions/info_stats.sh | 4 +- lgsm/functions/query_gamedig.sh | 16 +- 14 files changed, 273 insertions(+), 27 deletions(-) create mode 100644 lgsm/config-default/config-lgsm/cmwserver/_default.cfg create mode 100644 lgsm/functions/fix_cmw.sh diff --git a/lgsm/config-default/config-lgsm/cmwserver/_default.cfg b/lgsm/config-default/config-lgsm/cmwserver/_default.cfg new file mode 100644 index 000000000..155ef0c17 --- /dev/null +++ b/lgsm/config-default/config-lgsm/cmwserver/_default.cfg @@ -0,0 +1,175 @@ +################################## +######## Default Settings ######## +################################## +# DO NOT EDIT, ANY CHANGES 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. + +#### Game Server Settings #### + +## Server Start Settings | https://docs.linuxgsm.com/configuration/start-parameters +ip="0.0.0.0" +port="7777" +queryport="7779" +defaultmap="AOCTD-Frigid_p" + + +## Server Start Command | https://docs.linuxgsm.com/configuration/start-parameters#additional-parameters +fn_parms(){ + +parms="${defaultmap}?steamsockets -multihome=${ip} -Port=${port} -QueryPort=${queryport} -seekfreeloadingserver -configsubdir=${gamelogdir} -log=${gamelog}" + +} + +#### LinuxGSM Settings #### + +## LinuxGSM Stats +# Send useful stats to LinuxGSM developers. +# https://docs.linuxgsm.com/configuration/linuxgsm-stats +# (on|off) +stats="off" + +## Notification Alerts +# (on|off) + +# Display IP | https://docs.linuxgsm.com/alerts#display-ip +displayip="" + +# More info | https://docs.linuxgsm.com/alerts#more-info +postalert="off" +postdays="7" +posttarget="https://termbin.com" + +# Discord Alerts | https://docs.linuxgsm.com/alerts/discord +discordalert="off" +discordwebhook="webhook" + +# Email Alerts | https://docs.linuxgsm.com/alerts/email +emailalert="off" +email="email@example.com" +emailfrom="" + +# IFTTT Alerts | https://docs.linuxgsm.com/alerts/ifttt +iftttalert="off" +ifttttoken="accesstoken" +iftttevent="linuxgsm_alert" + +# Mailgun Email Alerts | https://docs.linuxgsm.com/alerts/mailgun +mailgunalert="off" +mailguntoken="accesstoken" +mailgundomain="example.com" +mailgunemailfrom="alert@example.com" +mailgunemail="email@myemail.com" + +# Pushbullet Alerts | https://docs.linuxgsm.com/alerts/pushbullet +pushbulletalert="off" +pushbullettoken="accesstoken" +channeltag="" + +# Pushover Alerts | https://docs.linuxgsm.com/alerts/pushover +pushoveralert="off" +pushovertoken="accesstoken" + +# Slack Alerts | https://docs.linuxgsm.com/alerts/slack +slackalert="off" +slackwebhook="webhook" + +# Telegram Alerts | https://docs.linuxgsm.com/alerts/telegram +# You can add a custom cURL string eg proxy (useful in Russia) or else in "curlcustomstring". +# like a "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help", if you not need +# any custom string in curl - simple ignore this parameter. +telegramalert="off" +telegramtoken="accesstoken" +telegramchatid="" +curlcustomstring="" + +## Updating | https://docs.linuxgsm.com/commands/update +updateonstart="off" + +## Backup | https://docs.linuxgsm.com/commands/backup +maxbackups="4" +maxbackupdays="30" +stoponbackup="on" + +## Logging | https://docs.linuxgsm.com/features/logging +consolelogging="on" +logdays="7" + +## Monitor | https://docs.linuxgsm.com/commands/monitor +# Query delay time +querydelay="1" + +## ANSI Colors | https://docs.linuxgsm.com/features/ansi-colors +ansi="on" + +#### Advanced Settings #### + +## Message Display Time | https://docs.linuxgsm.com/features/message-display-time +sleeptime="0.5" + +## SteamCMD Settings | https://docs.linuxgsm.com/steamcmd +# Server appid +appid="220070" +# SteamCMD Branch | https://docs.linuxgsm.com/steamcmd/branch +branch="" +# Master Server | https://docs.linuxgsm.com/steamcmd/steam-master-server +steammaster="false" + +## Stop Mode | https://docs.linuxgsm.com/features/stop-mode +# 1: tmux kill +# 2: CTRL+c +# 3: quit +# 4: quit 120s +# 5: stop +# 6: q +# 7: exit +# 8: 7 Days to Die +# 9: GoldSrc +# 10: Avorion +stopmode="2" + +## Query mode +# 1: session only +# 2: gamedig + gsquery +# 3: gamedig +# 4: gsquery +# 5: tcp +querymode="2" +querytype="protocol-valve" + +## Game Server Details +# Do not edit +gamename="Chivalry: Medieval Warfare" +engine="unreal3" +glibc="2.15" + +#### Directories #### +# Edit with care +## Game Server Directories +systemdir="${serverfiles}" +executabledir="${systemdir}/Binaries/Linux" +executable="./UDKGameServer-Linux" +servercfgdir="${systemdir}/UDKGame/Config/${selfname}" +servercfg="PCServer-UDKGame.ini" +servercfgdefault="PCServer-UDKGame.ini" +servercfgfullpath="${servercfgdir}/${servercfg}" + +## Backup Directory +backupdir="${lgsmdir}/backup" + +## Logging Directories +logdir="${rootdir}/log" +gamelogdir="${systemdir}/Saved/Logs" +lgsmlogdir="${logdir}/script" +consolelogdir="${logdir}/console" +gamelog="${gamelogdir}/${selfname}-game.log" +lgsmlog="${lgsmlogdir}/${selfname}-script.log" +consolelog="${consolelogdir}/${selfname}-console.log" +alertlog="${lgsmlogdir}/${selfname}-alert.log" +postdetailslog="${lgsmlogdir}/${selfname}-postdetails.log" + +## Logs Naming +lgsmlogdate="${lgsmlogdir}/${selfname}-script-$(date '+%Y-%m-%d-%H:%M:%S').log" +consolelogdate="${consolelogdir}/${selfname}-console-$(date '+%Y-%m-%d-%H:%M:%S').log" +gamelogdate="${gamelogdir}/${selfname}-game-$(date '+%Y-%m-%d-%H:%M:%S').log" diff --git a/lgsm/data/serverlist.csv b/lgsm/data/serverlist.csv index f3b13a7fc..ac703ffe9 100644 --- a/lgsm/data/serverlist.csv +++ b/lgsm/data/serverlist.csv @@ -14,6 +14,7 @@ bs,bsserver,Blade Symphony bt,btserver,Barotrauma bt1944,bt1944server,Battalion 1944 cc,ccserver,Codename CURE +cmw,cmwserver,Chivalry: Medieval Warfare cod,codserver,Call of Duty cod2,cod2server,Call of Duty 2 cod4,cod4server,Call of Duty 4 diff --git a/lgsm/functions/command_dev_query_raw.sh b/lgsm/functions/command_dev_query_raw.sh index b96036c2f..22ed232ec 100644 --- a/lgsm/functions/command_dev_query_raw.sh +++ b/lgsm/functions/command_dev_query_raw.sh @@ -35,7 +35,7 @@ fi query_gamedig.sh echo -e "${gamedigcmd}" echo"" -echo -e "${gamedigraw}" | jq +echo "${gamedigraw}" | jq echo -e "" echo -e "gsquery Raw Output" @@ -44,7 +44,7 @@ echo -e "" echo -e "./query_gsquery.py -a \"${ip}\" -p \"${queryport}\" -e \"${querytype}\"" echo -e "" if [ ! -f "${functionsdir}/query_gsquery.py" ]; then - fn_fetch_file_git "lgsm/functions" "query_gsquery.py" "${functionsdir}" "chmodx" "norun" "noforce" "nomd5" + fn_fetch_file_github "lgsm/functions" "query_gsquery.py" "${functionsdir}" "chmodx" "norun" "noforce" "nomd5" fi "${functionsdir}"/query_gsquery.py -a "${ip}" -p "${queryport}" -e "${querytype}" diff --git a/lgsm/functions/command_monitor.sh b/lgsm/functions/command_monitor.sh index a66c362b4..4b621c0d5 100644 --- a/lgsm/functions/command_monitor.sh +++ b/lgsm/functions/command_monitor.sh @@ -84,7 +84,7 @@ fn_monitor_check_queryport(){ fn_query_gsquery(){ if [ ! -f "${functionsdir}/query_gsquery.py" ]; then - fn_fetch_file_git "lgsm/functions" "query_gsquery.py" "${functionsdir}" "chmodx" "norun" "noforce" "nomd5" + fn_fetch_file_github "lgsm/functions" "query_gsquery.py" "${functionsdir}" "chmodx" "norun" "noforce" "nomd5" fi "${functionsdir}"/query_gsquery.py -a "${ip}" -p "${queryport}" -e "${querytype}" > /dev/null 2>&1 querystatus="$?" diff --git a/lgsm/functions/command_update_linuxgsm.sh b/lgsm/functions/command_update_linuxgsm.sh index 05397692f..9e778c9ee 100644 --- a/lgsm/functions/command_update_linuxgsm.sh +++ b/lgsm/functions/command_update_linuxgsm.sh @@ -194,7 +194,7 @@ if [ -n "${functionsdir}" ]; then fi fi -fn_print_ok "Updating functions" +fn_print_ok_nl "Updating functions" fn_script_log_pass "Updating functions" core_exit.sh diff --git a/lgsm/functions/core_functions.sh b/lgsm/functions/core_functions.sh index 56060e49e..a5e1cce44 100644 --- a/lgsm/functions/core_functions.sh +++ b/lgsm/functions/core_functions.sh @@ -320,6 +320,11 @@ functionfile="${FUNCNAME[0]}" fn_fetch_function } +fix_cmw.sh(){ +functionfile="${FUNCNAME[0]}" +fn_fetch_function +} + fix_csgo.sh(){ functionfile="${FUNCNAME[0]}" fn_fetch_function diff --git a/lgsm/functions/fix.sh b/lgsm/functions/fix.sh index 74523ee5c..a42f0e51d 100644 --- a/lgsm/functions/fix.sh +++ b/lgsm/functions/fix.sh @@ -42,6 +42,8 @@ if [ "${commandname}" != "INSTALL" ]&&[ -z "${fixbypass}" ]; then fix_ark.sh elif [ "${shortname}" == "csgo" ]; then fix_csgo.sh + elif [ "${shortname}" == "cmw" ]; then + fix_cmw.sh elif [ "${shortname}" == "dst" ]; then fix_dst.sh elif [ "${shortname}" == "ges" ]; then @@ -89,7 +91,7 @@ fi # Fixes that are run on install only. if [ "${commandname}" == "INSTALL" ]; then - if [ "${shortname}" == "av" ]||[ "${shortname}" == "kf" ]||[ "${shortname}" == "kf2" ]||[ "${shortname}" == "onset" ]||[ "${shortname}" == "ro" ]||[ "${shortname}" == "ut2k4" ]||[ "${shortname}" == "ut" ]||[ "${shortname}" == "ut3" ]; then + if [ "${shortname}" == "av" ]||[ "${shortname}" == "cmw" ]||[ "${shortname}" == "kf" ]||[ "${shortname}" == "kf2" ]||[ "${shortname}" == "onset" ]||[ "${shortname}" == "ro" ]||[ "${shortname}" == "ut2k4" ]||[ "${shortname}" == "ut" ]||[ "${shortname}" == "ut3" ]; then echo -e "" echo -e "Applying Post-Install Fixes" echo -e "=================================" diff --git a/lgsm/functions/fix_cmw.sh b/lgsm/functions/fix_cmw.sh new file mode 100644 index 000000000..7dc502be6 --- /dev/null +++ b/lgsm/functions/fix_cmw.sh @@ -0,0 +1,33 @@ +#!/bin/bash +# LinuxGSM fix_cmw.sh function +# Author: Christian Birk +# Website: https://linuxgsm.com +# Description: Resolves the issue of the not starting server on linux + +fixname="steam_appid.txt" + +if [ ! -f "${executabledir}/steam_appid.txt" ]; then + fn_fix_msg_start + echo 219640 > "${executabledir}/steam_appid.txt" + fn_fix_msg_end +fi + + +if [ ! -f "${executabledir}/lib/steamclient.so" ]; then + fixname="steamclient.so" + fn_fix_msg_start + if [ -f "${HOME}/.steam/steamcmd/linux32/steamclient.so" ]; then + cp "${steamcmddir}/linux32/steamclient.so" "${executabledir}/lib/steamclient.so" + elif [ -f "${steamcmddir}/linux32/steamclient.so" ]; then + cp "${steamcmddir}/linux32/steamclient.so" "${executabledir}/lib/steamclient.so" + fi + fn_fix_msg_end +fi + +if [ ! -f "${servercfgfullpath}" ]; then + fn_fix_msg_start + fixname="copy config" + mkdir "${servercfgdir}" + cp "${systemdir}/UDKGame/Config/"*.ini "${servercfgdir}" + fn_fix_msg_end +fi diff --git a/lgsm/functions/fix_hw.sh b/lgsm/functions/fix_hw.sh index 954a834a0..6230f7b46 100644 --- a/lgsm/functions/fix_hw.sh +++ b/lgsm/functions/fix_hw.sh @@ -12,9 +12,9 @@ if [ "${shortname}" == "hw" ]; then fixname="steamclient.so x86" fn_fix_msg_start if [ -f "${HOME}/.steam/steamcmd/linux32/steamclient.so" ]; then - cp -v "${HOME}/.steam/steamcmd/linux32/steamclient.so" "${serverfiles}/Hurtworld_Data/Plugins/x86/steamclient.so" >> "${lgsmlog}" + cp "${steamcmddir}/linux32/steamclient.so" "${serverfiles}/Hurtworld_Data/Plugins/x86/steamclient.so" >> "${lgsmlog}" elif [ -f "${steamcmddir}/linux32/steamclient.so" ]; then - cp -v "${steamcmddir}/linux32/steamclient.so" "${serverfiles}/Hurtworld_Data/Plugins/x86/steamclient.so" >> "${lgsmlog}" + cp "${steamcmddir}/linux32/steamclient.so" "${serverfiles}/Hurtworld_Data/Plugins/x86/steamclient.so" >> "${lgsmlog}" else : fi @@ -24,9 +24,9 @@ if [ "${shortname}" == "hw" ]; then fixname="steamclient.so x86_64" fn_fix_msg_start if [ -f "${HOME}/.steam/steamcmd/linux64/steamclient.so" ]; then - cp -v "${HOME}/.steam/steamcmd/linux64/steamclient.so" "${serverfiles}/Hurtworld_Data/Plugins/x86_64/steamclient.so" >> "${lgsmlog}" + cp "${steamcmddir}/linux64/steamclient.so" "${serverfiles}/Hurtworld_Data/Plugins/x86_64/steamclient.so" >> "${lgsmlog}" elif [ -f "${steamcmddir}/linux64/steamclient.so" ]; then - cp -v "${steamcmddir}/linux64/steamclient.so" "${serverfiles}/Hurtworld_Data/Plugins/x86_64/steamclient.so" >> "${lgsmlog}" + cp "${steamcmddir}/linux64/steamclient.so" "${serverfiles}/Hurtworld_Data/Plugins/x86_64/steamclient.so" >> "${lgsmlog}" else : fi diff --git a/lgsm/functions/fix_steamcmd.sh b/lgsm/functions/fix_steamcmd.sh index be5197b9d..0a2f774f1 100644 --- a/lgsm/functions/fix_steamcmd.sh +++ b/lgsm/functions/fix_steamcmd.sh @@ -12,11 +12,9 @@ if [ ! -f "${HOME}/.steam/sdk64/steamclient.so" ]; then fn_fix_msg_start mkdir -pv "${HOME}/.steam/sdk64" >> "${lgsmlog}" if [ -f "${HOME}/.steam/steamcmd/linux64/steamclient.so" ]; then - cp -v "${HOME}/.steam/steamcmd/linux64/steamclient.so" "${HOME}/.steam/sdk64/steamclient.so" >> "${lgsmlog}" + cp "${steamcmddir}/linux64/steamclient.so" "${HOME}/.steam/sdk64/steamclient.so" >> "${lgsmlog}" elif [ -f "${steamcmddir}/linux64/steamclient.so" ]; then - cp -v "${steamcmddir}/linux64/steamclient.so" "${HOME}/.steam/sdk64/steamclient.so" >> "${lgsmlog}" - else - $?=2 + cp "${steamcmddir}/linux64/steamclient.so" "${HOME}/.steam/sdk64/steamclient.so" >> "${lgsmlog}" fi fn_fix_msg_end fi @@ -27,11 +25,9 @@ if [ ! -f "${HOME}/.steam/sdk32/steamclient.so" ]; then fn_fix_msg_start mkdir -pv "${HOME}/.steam/sdk32" >> "${lgsmlog}" if [ -f "${HOME}/.steam/steamcmd/linux32/steamclient.so" ]; then - cp -v "${HOME}/.steam/steamcmd/linux32/steamclient.so" "${HOME}/.steam/sdk32/steamclient.so" >> "${lgsmlog}" + cp "${steamcmddir}/linux32/steamclient.so" "${HOME}/.steam/sdk32/steamclient.so" >> "${lgsmlog}" elif [ -f "${steamcmddir}/linux32/steamclient.so" ]; then - cp -v "${steamcmddir}/linux32/steamclient.so" "${HOME}/.steam/sdk32/steamclient.so" >> "${lgsmlog}" - else - $?=2 + cp "${steamcmddir}/linux32/steamclient.so" "${HOME}/.steam/sdk32/steamclient.so" >> "${lgsmlog}" fi fn_fix_msg_end fi diff --git a/lgsm/functions/info_config.sh b/lgsm/functions/info_config.sh index 282559deb..743c657e0 100644 --- a/lgsm/functions/info_config.sh +++ b/lgsm/functions/info_config.sh @@ -199,6 +199,23 @@ fn_info_config_bf1942(){ fi } +fn_info_config_chivalry(){ + if [ ! -f "${servercfgfullpath}" ]; then + servername="${unavailable}" + serverpassword="${unavailable}" + adminpassword="${unavailable}" + else + servername=$(egrep "^ServerName" "${servercfgfullpath}" | sed 's/^ServerName=//') + adminpassword=$(egrep "^AdminPassword" "${servercfgfullpath}" | sed 's/^AdminPassword=//') + + # Not Set + servername=${servername:-"NOT SET"} + serverpassword=${serverpassword:-"NOT SET"} + adminpassword=${adminpassword:-"NOT SET"} + port=${port:-"0"} + fi +} + fn_info_config_cod(){ if [ ! -f "${servercfgfullpath}" ]; then servername="${unavailable}" @@ -1455,6 +1472,9 @@ elif [ "${shortname}" == "bt1944" ]; then # Battlefield: 1942 elif [ "${shortname}" == "bf1942" ]; then fn_info_config_bf1942 +# Chivalry: Medieval Warfare +elif [ "${shortname}" == "cmw" ]; then + fn_info_config_chivalry # Call of Duty elif [ "${shortname}" == "cod" ]||[ "${shortname}" == "coduo" ]; then fn_info_config_cod diff --git a/lgsm/functions/info_messages.sh b/lgsm/functions/info_messages.sh index 6d46d1b22..e5a8ec364 100644 --- a/lgsm/functions/info_messages.sh +++ b/lgsm/functions/info_messages.sh @@ -698,6 +698,18 @@ fn_info_message_coduo(){ } | column -s $'\t' -t } +fn_info_message_chivalry(){ + fn_info_message_password_strip + echo -e "netstat -atunp | grep UDKGame" + echo -e "" + { + echo -e "${lightblue}DESCRIPTION\tDIRECTION\tPORT\tPROTOCOL${default}" + echo -e "> Game\tINBOUND\t${port}\tudp" + echo -e "> Query\tINBOUND\t${queryport}\tudp" + echo -e "> RCON\tINBOUND\t27960\ttcp" + } | column -s $'\t' -t +} + fn_info_message_cod2(){ echo -e "netstat -atunp | grep cod2_lnxded" echo -e "" @@ -1390,6 +1402,8 @@ fn_info_message_select_engine(){ fn_info_message_barotrauma elif [ "${shortname}" == "bt1944" ]; then fn_info_message_battalion1944 + elif [ "${shortname}" == "cmw" ]; then + fn_info_message_chivalry elif [ "${shortname}" == "cod" ]; then fn_info_message_cod elif [ "${shortname}" == "coduo" ]; then diff --git a/lgsm/functions/info_stats.sh b/lgsm/functions/info_stats.sh index a99f877af..9bdee07fd 100644 --- a/lgsm/functions/info_stats.sh +++ b/lgsm/functions/info_stats.sh @@ -23,10 +23,10 @@ fi if [ ! -f "${datadir}/uuid-${selfname}.txt" ]||[ ! -f "${datadir}/uuid-install.txt" ]; then # download dictionary words if [ ! -f "${datadir}/name-left.csv" ]; then - fn_fetch_file_git "lgsm/data" "name-left.csv" "${datadir}" "nochmodx" "norun" "forcedl" "nomd5" + fn_fetch_file_github "lgsm/data" "name-left.csv" "${datadir}" "nochmodx" "norun" "forcedl" "nomd5" fi if [ ! -f "${datadir}/name-right.csv" ]; then - fn_fetch_file_git "lgsm/data" "name-right.csv" "${datadir}" "nochmodx" "norun" "forcedl" "nomd5" + fn_fetch_file_github "lgsm/data" "name-right.csv" "${datadir}" "nochmodx" "norun" "forcedl" "nomd5" fi # generate instance uuid diff --git a/lgsm/functions/query_gamedig.sh b/lgsm/functions/query_gamedig.sh index fca71c57c..285cf0805 100644 --- a/lgsm/functions/query_gamedig.sh +++ b/lgsm/functions/query_gamedig.sh @@ -16,23 +16,23 @@ if [ "$(command -v gamedig 2>/dev/null)" ]&&[ "$(command -v jq 2>/dev/null)" ]; # checks if query is working null = pass. gamedigcmd=$(echo -e "gamedig --type \"${querytype}\" --host \"${ip}\" --query_port \"${queryport}\"|jq") gamedigraw=$(gamedig --type "${querytype}" --host "${ip}" --query_port "${queryport}") - querystatus=$(echo -e "${gamedigraw}" | jq '.error|length') + querystatus=$(echo "${gamedigraw}" | jq '.error|length') if [ "${querystatus}" != "null" ]; then gamedigcmd=$(echo -e "gamedig --type \"${querytype}\" --host \"${ip}\" --port \"${queryport}\"|jq") gamedigraw=$(gamedig --type "${querytype}" --host "${ip}" --port "${queryport}") - querystatus=$(echo -e "${gamedigraw}" | jq '.error|length') + querystatus=$(echo "${gamedigraw}" | jq '.error|length') fi # server name. - gdname=$(echo -e "${gamedigraw}" | jq -re '.name') + gdname=$(echo "${gamedigraw}" | jq -re '.name') if [ "${gdname}" == "null" ]; then unset gdname fi # numplayers. - gdplayers=$(echo -e "${gamedigraw}" | jq -re '.raw.vanilla.raw.players.online') + gdplayers=$(echo "${gamedigraw}" | jq -re '.raw.vanilla.raw.players.online') if [ "${gdplayers}" == "null" ]; then unset gdplayers elif [ "${gdplayers}" == "[]" ]; then @@ -40,7 +40,7 @@ if [ "$(command -v gamedig 2>/dev/null)" ]&&[ "$(command -v jq 2>/dev/null)" ]; fi # maxplayers. - gdmaxplayers=$(echo -e "${gamedigraw}" | jq -re '.maxplayers') + gdmaxplayers=$(echo "${gamedigraw}" | jq -re '.maxplayers') if [ "${gdmaxplayers}" == "null" ]; then unset maxplayers elif [ "${gdmaxplayers}" == "[]" ]; then @@ -48,19 +48,19 @@ if [ "$(command -v gamedig 2>/dev/null)" ]&&[ "$(command -v jq 2>/dev/null)" ]; fi # current map. - gdmap=$(echo -e "${gamedigraw}" | jq -re '.map') + gdmap=$(echo "${gamedigraw}" | jq -re '.map') if [ "${gdmap}" == "null" ]; then unset gdmap fi # current gamemode. - gdgamemode=$(echo -e "${gamedigraw}" | jq -re '.raw.rules.GameMode_s') + gdgamemode=$(echo "${gamedigraw}" | jq -re '.raw.rules.GameMode_s') if [ "${gdgamemode}" == "null" ]; then unset gdgamemode fi # numbots. - gdbots=$(echo -e "${gamedigraw}" | jq -re '.raw.numbots') + gdbots=$(echo "${gamedigraw}" | jq -re '.raw.numbots') if [ "${gdbots}" == "null" ]||[ "${gdbots}" == "0" ]; then unset gdbots fi From f40ad7dd6ae7d7257e3e6b6ef27a608fcd7c390a Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Wed, 20 May 2020 12:45:58 +0100 Subject: [PATCH 375/534] fix(update): ensure that tmpdir is cleared when update is found (#2890) --- lgsm/functions/update_factorio.sh | 5 +++++ lgsm/functions/update_minecraft.sh | 5 +++++ lgsm/functions/update_minecraft_bedrock.sh | 7 ++++++- lgsm/functions/update_mta.sh | 6 +++++- lgsm/functions/update_mumble.sh | 4 ++++ lgsm/functions/update_steamcmd.sh | 4 ++-- lgsm/functions/update_ts3.sh | 5 +++++ 7 files changed, 32 insertions(+), 4 deletions(-) diff --git a/lgsm/functions/update_factorio.sh b/lgsm/functions/update_factorio.sh index 8110e882f..f7436d58d 100644 --- a/lgsm/functions/update_factorio.sh +++ b/lgsm/functions/update_factorio.sh @@ -20,6 +20,7 @@ fn_update_factorio_dl(){ fn_print_fail_eol_nl fn_script_log_fatal "Copying to ${serverfiles}" core_exit.sh + fn_clear_tmp fi } @@ -78,6 +79,7 @@ fn_update_factorio_compare(){ if [ -n "${branch}" ]; then echo -e "* Branch: ${branch}" fi + echo -en "\n" fn_script_log_info "Update available" fn_script_log_info "Local build: ${localbuild} ${factorioarch}" fn_script_log_info "Remote build: ${remotebuild} ${factorioarch}" @@ -118,6 +120,7 @@ fn_update_factorio_compare(){ if [ -v "${branch}" ]; then echo -e "* Branch: ${branch}" fi + echo -en "\n" fn_script_log_info "No update available" fn_script_log_info "Local build: ${localbuild} ${factorioarch}" fn_script_log_info "Remote build: ${remotebuild} ${factorioarch}" @@ -160,9 +163,11 @@ if [ "${installer}" == "1" ]; then fn_update_factorio_remotebuild fn_update_factorio_dl else + fn_print_dots "Checking for update" fn_print_dots "Checking for update: ${remotelocation}" fn_script_log_info "Checking for update: ${remotelocation}" fn_update_factorio_localbuild fn_update_factorio_remotebuild fn_update_factorio_compare fi +core_exit.sh diff --git a/lgsm/functions/update_minecraft.sh b/lgsm/functions/update_minecraft.sh index b9db53ec0..8a81e0ad6 100644 --- a/lgsm/functions/update_minecraft.sh +++ b/lgsm/functions/update_minecraft.sh @@ -26,6 +26,7 @@ fn_update_minecraft_dl(){ else fn_print_fail_eol_nl fn_script_log_fatal "Copying to ${serverfiles}" + fn_clear_tmp core_exit.sh fi } @@ -137,6 +138,7 @@ fn_update_minecraft_compare(){ echo -e "Update available" echo -e "* Local build: ${red}${localbuild}${default}" echo -e "* Remote build: ${green}${remotebuild}${default}" + echo -en "\n" if [ -n "${branch}" ]; then echo -e "* Branch: ${branch}" fi @@ -177,6 +179,7 @@ fn_update_minecraft_compare(){ if [ -n "${branch}" ]; then echo -e "* Branch: ${branch}" fi + echo -en "\n" fn_script_log_info "No update available" fn_script_log_info "Local build: ${localbuild}" fn_script_log_info "Remote build: ${remotebuild}" @@ -208,9 +211,11 @@ if [ "${installer}" == "1" ]; then fn_update_minecraft_remotebuild fn_update_minecraft_dl else + fn_print_dots "Checking for update" fn_print_dots "Checking for update: ${remotelocation}" fn_script_log_info "Checking for update: ${remotelocation}" fn_update_minecraft_localbuild fn_update_minecraft_remotebuild fn_update_minecraft_compare fi +core_exit.sh diff --git a/lgsm/functions/update_minecraft_bedrock.sh b/lgsm/functions/update_minecraft_bedrock.sh index 564fb5c7b..e439adcb5 100644 --- a/lgsm/functions/update_minecraft_bedrock.sh +++ b/lgsm/functions/update_minecraft_bedrock.sh @@ -24,6 +24,7 @@ fn_update_minecraft_dl(){ else fn_print_fail_eol_nl fn_script_log_fatal "Extracting to ${serverfiles}" + fn_clear_tmp core_exit.sh fi } @@ -66,7 +67,7 @@ fn_update_minecraft_localbuild(){ fn_script_log_error "Missing local build info" fn_script_log_error "Set localbuild to 0" else - fn_print_ok "Checking local build: ${remotelocation}: checking local build" + fn_print_ok "Checking local build: ${remotelocation}" fn_script_log_pass "Checking local build" fi } @@ -106,6 +107,7 @@ fn_update_minecraft_compare(){ echo -e "Update available" echo -e "* Local build: ${red}${localbuild}${default}" echo -e "* Remote build: ${green}${remotebuild}${default}" + echo -en "\n" fn_script_log_info "Update available" fn_script_log_info "Local build: ${localbuild}" fn_script_log_info "Remote build: ${remotebuild}" @@ -140,6 +142,7 @@ fn_update_minecraft_compare(){ echo -e "No update available" echo -e "* Local build: ${green}${localbuild}${default}" echo -e "* Remote build: ${green}${remotebuild}${default}" + echo -en "\n" fn_script_log_info "No update available" fn_script_log_info "Local build: ${localbuild}" fn_script_log_info "Remote build: ${remotebuild}" @@ -168,9 +171,11 @@ if [ "${installer}" == "1" ]; then fn_update_minecraft_remotebuild fn_update_minecraft_dl else + fn_print_dots "Checking for update" fn_print_dots "Checking for update: ${remotelocation}" fn_script_log_info "Checking for update: ${remotelocation}" fn_update_minecraft_localbuild fn_update_minecraft_remotebuild fn_update_minecraft_compare fi +core_exit.sh diff --git a/lgsm/functions/update_mta.sh b/lgsm/functions/update_mta.sh index 0fe79ebff..c8fad55ea 100644 --- a/lgsm/functions/update_mta.sh +++ b/lgsm/functions/update_mta.sh @@ -13,11 +13,11 @@ fn_update_mta_dl(){ echo -e "copying to ${serverfiles}...\c" cp -R "${tmpdir}/multitheftauto_linux_x64/multitheftauto_linux_x64/"* "${serverfiles}" local exitcode=$? + fn_clear_tmp if [ "${exitcode}" == "0" ]; then fn_print_ok_eol_nl fn_script_log_pass "Copying to ${serverfiles}" chmod u+x "${serverfiles}/mta-server64" - fn_clear_tmp else fn_print_fail_eol_nl fn_script_log_fatal "Copying to ${serverfiles}" @@ -138,6 +138,7 @@ fn_update_mta_compare(){ echo -e "Update ${mtaupdatestatus}:" echo -e "* Local build: ${red}${localbuild}${default}" echo -e "* Remote build: ${green}${remotebuild}${default}" + echo -en "\n" fn_script_log_info "Update available" fn_script_log_info "Local build: ${localbuild}" fn_script_log_info "Remote build: ${remotebuild}" @@ -172,6 +173,7 @@ fn_update_mta_compare(){ echo -e "No update available" echo -e "* Local build: ${green}${localbuild}${default}" echo -e "* Remote build: ${green}${remotebuild}${default}" + echo -en "\n" fn_script_log_info "No update available" fn_script_log_info "Local build: ${localbuild}" fn_script_log_info "Remote build: ${remotebuild}" @@ -200,9 +202,11 @@ if [ "${installer}" == "1" ]; then fn_update_mta_remotebuild fn_update_mta_dl else + fn_print_dots "Checking for update" fn_print_dots "Checking for update: ${remotelocation}" fn_script_log_info "Checking for update: ${remotelocation}" fn_update_mta_localbuild fn_update_mta_remotebuild fn_update_mta_compare fi +core_exit.sh diff --git a/lgsm/functions/update_mumble.sh b/lgsm/functions/update_mumble.sh index 652db5b89..9fe9e2596 100644 --- a/lgsm/functions/update_mumble.sh +++ b/lgsm/functions/update_mumble.sh @@ -19,6 +19,7 @@ fn_update_mumble_dl(){ else fn_print_fail_eol_nl fn_script_log_fatal "Copying to ${serverfiles}" + fn_clear_tmp core_exit.sh fi } @@ -74,6 +75,7 @@ fn_update_mumble_compare(){ echo -e "Update available" echo -e "* Local build: ${red}${localbuild} ${mumblearch}${default}" echo -e "* Remote build: ${green}${remotebuild} ${mumblearch}${default}" + echo -en "\n" fn_script_log_info "Update available" fn_script_log_info "Local build: ${localbuild} ${mumblearch}" fn_script_log_info "Remote build: ${remotebuild} ${mumblearch}" @@ -108,6 +110,7 @@ fn_update_mumble_compare(){ echo -e "No update available" echo -e "* Local build: ${green}${localbuild} ${mumblearch}${default}" echo -e "* Remote build: ${green}${remotebuild} ${mumblearch}${default}" + echo -en "\n" fn_script_log_info "No update available" fn_script_log_info "Local build: ${localbuild} ${mumblearch}" fn_script_log_info "Remote build: ${remotebuild} ${mumblearch}" @@ -145,3 +148,4 @@ else fn_update_mumble_remotebuild fn_update_mumble_compare fi +core_exit.sh diff --git a/lgsm/functions/update_steamcmd.sh b/lgsm/functions/update_steamcmd.sh index 5000b5e3d..b22569d1a 100644 --- a/lgsm/functions/update_steamcmd.sh +++ b/lgsm/functions/update_steamcmd.sh @@ -130,11 +130,10 @@ fn_update_steamcmd_compare(){ command_stop.sh exitbypass=1 fn_update_steamcmd_dl - date +%s > "${lockdir}/lastupdate.lock" exitbypass=1 command_start.sh fi - + date +%s > "${lockdir}/lastupdate.lock" alert="update" alert.sh else @@ -247,3 +246,4 @@ else fn_update_steamcmd_remotebuild fn_update_steamcmd_compare fi +core_exit.sh diff --git a/lgsm/functions/update_ts3.sh b/lgsm/functions/update_ts3.sh index fbabd3d83..87c8a86da 100644 --- a/lgsm/functions/update_ts3.sh +++ b/lgsm/functions/update_ts3.sh @@ -24,6 +24,7 @@ fn_update_ts3_dl(){ else fn_print_fail_eol_nl fn_script_log_fatal "Copying to ${serverfiles}" + fn_clear_tmp core_exit.sh fi } @@ -161,6 +162,7 @@ fn_update_ts3_compare(){ exitbypass=1 command_start.sh fi + date +%s > "${lockdir}/lastupdate.lock" alert="update" alert.sh else @@ -169,6 +171,7 @@ fn_update_ts3_compare(){ echo -e "No update available" echo -e "* Local build: ${green}${localbuild}${default}" echo -e "* Remote build: ${green}${remotebuild}${default}" + echo -en "\n" fn_script_log_info "No update available" fn_script_log_info "Local build: ${localbuild}" fn_script_log_info "Remote build: ${remotebuild}" @@ -209,9 +212,11 @@ if [ "${installer}" == "1" ]; then fn_update_ts3_remotebuild fn_update_ts3_dl else + fn_print_dots "Checking for update" fn_print_dots "Checking for update: ${remotelocation}" fn_script_log_info "Checking for update: ${remotelocation}" fn_update_ts3_localbuild fn_update_ts3_remotebuild fn_update_ts3_compare fi +core_exit.sh From 2b9df619e235195e484f5fe192746d394ced1157 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Wed, 20 May 2020 13:03:02 +0100 Subject: [PATCH 376/534] fix(details): correct if for bf1942 details (#2891) --- lgsm/functions/info_messages.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lgsm/functions/info_messages.sh b/lgsm/functions/info_messages.sh index e5a8ec364..063914497 100644 --- a/lgsm/functions/info_messages.sh +++ b/lgsm/functions/info_messages.sh @@ -1490,7 +1490,7 @@ fn_info_message_select_engine(){ fn_info_message_mta elif [ "${shortname}" == "mumble" ]; then fn_info_message_mumble - elif [ "${engine}" == "bf1942" ]; then + elif [ "${shortname}" == "bf1942" ]; then fn_info_message_bf1942 elif [ "${shortname}" == "rtcw" ]; then fn_info_message_rtcw From 13b3acbb4518871bb9b3bfa2c0742b733e525e41 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Wed, 20 May 2020 13:31:01 +0100 Subject: [PATCH 377/534] release v20.3.0 --- lgsm/functions/core_functions.sh | 2 +- linuxgsm.sh | 2 +- tests/tests_fctrserver.sh | 2 +- tests/tests_jc2server.sh | 2 +- tests/tests_mcserver.sh | 2 +- tests/tests_ts3server.sh | 2 +- 6 files changed, 6 insertions(+), 6 deletions(-) diff --git a/lgsm/functions/core_functions.sh b/lgsm/functions/core_functions.sh index a5e1cce44..ae1b860a7 100644 --- a/lgsm/functions/core_functions.sh +++ b/lgsm/functions/core_functions.sh @@ -7,7 +7,7 @@ functionselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" -modulesversion="v20.2.1" +modulesversion="v20.3.0" # Core diff --git a/linuxgsm.sh b/linuxgsm.sh index f4b8c8607..eaa2b31b7 100755 --- a/linuxgsm.sh +++ b/linuxgsm.sh @@ -20,7 +20,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="v20.2.1" +version="v20.3.0" shortname="core" gameservername="core" commandname="CORE" diff --git a/tests/tests_fctrserver.sh b/tests/tests_fctrserver.sh index 4bee74eae..50f2a1b15 100644 --- a/tests/tests_fctrserver.sh +++ b/tests/tests_fctrserver.sh @@ -20,7 +20,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="v20.2.1" +version="v20.3.0" shortname="fctr" gameservername="fctrserver" commandname="CORE" diff --git a/tests/tests_jc2server.sh b/tests/tests_jc2server.sh index 1cc6143cb..831b3a549 100644 --- a/tests/tests_jc2server.sh +++ b/tests/tests_jc2server.sh @@ -20,7 +20,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="v20.2.1" +version="v20.2.0" shortname="jc2" gameservername="jc2server" commandname="CORE" diff --git a/tests/tests_mcserver.sh b/tests/tests_mcserver.sh index 2138b8faf..8c3c6c267 100644 --- a/tests/tests_mcserver.sh +++ b/tests/tests_mcserver.sh @@ -20,7 +20,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="v20.2.1" +version="v20.3.0" shortname="mc" gameservername="mcserver" commandname="CORE" diff --git a/tests/tests_ts3server.sh b/tests/tests_ts3server.sh index 6f393ad84..6b398364b 100644 --- a/tests/tests_ts3server.sh +++ b/tests/tests_ts3server.sh @@ -20,7 +20,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="v20.2.1" +version="v20.3.0" shortname="ts3" gameservername="ts3server" commandname="CORE" From 57c7156d32e2ddfe2322a895e0440faccba3694a Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Wed, 20 May 2020 14:25:36 +0100 Subject: [PATCH 378/534] release v30.3.0 --- 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 831b3a549..61793bca0 100644 --- a/tests/tests_jc2server.sh +++ b/tests/tests_jc2server.sh @@ -20,7 +20,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="v20.2.0" +version="v20.3.0" shortname="jc2" gameservername="jc2server" commandname="CORE" From 95ce894f10b1d84c88c48ee6504eed4644978653 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Wed, 20 May 2020 15:39:35 +0100 Subject: [PATCH 379/534] fix resolving update not running on install (#2893) --- lgsm/functions/update_factorio.sh | 5 ++++- lgsm/functions/update_minecraft.sh | 5 ++++- lgsm/functions/update_minecraft_bedrock.sh | 5 ++++- lgsm/functions/update_mta.sh | 5 ++++- lgsm/functions/update_mumble.sh | 5 ++++- lgsm/functions/update_steamcmd.sh | 5 ++++- lgsm/functions/update_ts3.sh | 5 ++++- 7 files changed, 28 insertions(+), 7 deletions(-) diff --git a/lgsm/functions/update_factorio.sh b/lgsm/functions/update_factorio.sh index f7436d58d..7d12c0f58 100644 --- a/lgsm/functions/update_factorio.sh +++ b/lgsm/functions/update_factorio.sh @@ -170,4 +170,7 @@ else fn_update_factorio_remotebuild fn_update_factorio_compare fi -core_exit.sh + +if [ "${commandname}" != "INSTALL" ]; then + core_exit.sh +fi diff --git a/lgsm/functions/update_minecraft.sh b/lgsm/functions/update_minecraft.sh index 8a81e0ad6..8741db01d 100644 --- a/lgsm/functions/update_minecraft.sh +++ b/lgsm/functions/update_minecraft.sh @@ -218,4 +218,7 @@ else fn_update_minecraft_remotebuild fn_update_minecraft_compare fi -core_exit.sh + +if [ "${commandname}" != "INSTALL" ]; then + core_exit.sh +fi diff --git a/lgsm/functions/update_minecraft_bedrock.sh b/lgsm/functions/update_minecraft_bedrock.sh index e439adcb5..b560f3672 100644 --- a/lgsm/functions/update_minecraft_bedrock.sh +++ b/lgsm/functions/update_minecraft_bedrock.sh @@ -178,4 +178,7 @@ else fn_update_minecraft_remotebuild fn_update_minecraft_compare fi -core_exit.sh + +if [ "${commandname}" != "INSTALL" ]; then + core_exit.sh +fi diff --git a/lgsm/functions/update_mta.sh b/lgsm/functions/update_mta.sh index c8fad55ea..c37c5ba81 100644 --- a/lgsm/functions/update_mta.sh +++ b/lgsm/functions/update_mta.sh @@ -209,4 +209,7 @@ else fn_update_mta_remotebuild fn_update_mta_compare fi -core_exit.sh + +if [ "${commandname}" != "INSTALL" ]; then + core_exit.sh +fi diff --git a/lgsm/functions/update_mumble.sh b/lgsm/functions/update_mumble.sh index 9fe9e2596..00fbade5e 100644 --- a/lgsm/functions/update_mumble.sh +++ b/lgsm/functions/update_mumble.sh @@ -148,4 +148,7 @@ else fn_update_mumble_remotebuild fn_update_mumble_compare fi -core_exit.sh + +if [ "${commandname}" != "INSTALL" ]; then + core_exit.sh +fi diff --git a/lgsm/functions/update_steamcmd.sh b/lgsm/functions/update_steamcmd.sh index b22569d1a..e7d018d19 100644 --- a/lgsm/functions/update_steamcmd.sh +++ b/lgsm/functions/update_steamcmd.sh @@ -246,4 +246,7 @@ else fn_update_steamcmd_remotebuild fn_update_steamcmd_compare fi -core_exit.sh + +if [ "${commandname}" != "INSTALL" ]; then + core_exit.sh +fi diff --git a/lgsm/functions/update_ts3.sh b/lgsm/functions/update_ts3.sh index 87c8a86da..ec921b3f0 100644 --- a/lgsm/functions/update_ts3.sh +++ b/lgsm/functions/update_ts3.sh @@ -219,4 +219,7 @@ else fn_update_ts3_remotebuild fn_update_ts3_compare fi -core_exit.sh + +if [ "${commandname}" != "INSTALL" ]; then + core_exit.sh +fi From f05eab26330150891ae2b412c5baf2970744e9bb Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Wed, 20 May 2020 17:42:04 +0100 Subject: [PATCH 380/534] feat(avorion): remove avgalaxy variable and replace with selfname --- lgsm/config-default/config-lgsm/avserver/_default.cfg | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/lgsm/config-default/config-lgsm/avserver/_default.cfg b/lgsm/config-default/config-lgsm/avserver/_default.cfg index 4b53d68d2..f4f430e16 100644 --- a/lgsm/config-default/config-lgsm/avserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/avserver/_default.cfg @@ -11,14 +11,13 @@ port="27000" # https://steamidfinder.com adminsteamid="" -avgalaxy="avgalaxy" ## Server Start Command | https://docs.linuxgsm.com/configuration/start-parameters#additional-parameters fn_parms(){ if [ ! -z "${adminsteamid}" ]; then admincmd="--admin ${adminsteamid}" fi -parms="--galaxy-name ${avgalaxy} --ip ${ip} --datapath ${avdatapath} ${admincmd}" +parms="--galaxy-name ${selfname} --ip ${ip} --datapath ${avdatapath} ${admincmd}" } #### LinuxGSM Settings #### @@ -146,7 +145,7 @@ glibc="2.15" ## Game Server Directories avdatapath="${serverfiles}/galaxy" -avgalaxypath="${avdatapath}/${avgalaxy}" +avgalaxypath="${avdatapath}/${selfname}" systemdir="${serverfiles}" executabledir="${systemdir}" executable="./server.sh" From 2e548b4fed25aa8a496df6ff41c9dc11e4748eec Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Thu, 21 May 2020 00:06:01 +0100 Subject: [PATCH 381/534] Delete .all-contributorsrc --- .all-contributorsrc | 119 -------------------------------------------- 1 file changed, 119 deletions(-) delete mode 100644 .all-contributorsrc diff --git a/.all-contributorsrc b/.all-contributorsrc deleted file mode 100644 index 9e4a36a51..000000000 --- a/.all-contributorsrc +++ /dev/null @@ -1,119 +0,0 @@ -{ - "files": [ - "README.md" - ], - "imageSize": 100, - "commit": false, - "contributors": [ - { - "login": "dgibbs64", - "name": "Daniel Gibbs", - "avatar_url": "https://avatars2.githubusercontent.com/u/4478206?v=4", - "profile": "https://danielgibbs.co.uk", - "contributions": [ - "bug", - "code", - "ideas", - "question", - "review", - "content", - "doc", - "infra" - ] - }, - { - "login": "Frisasky", - "name": "Frisasky", - "avatar_url": "https://avatars2.githubusercontent.com/u/26865851?v=4", - "profile": "https://github.com/Frisasky", - "contributions": [ - "question", - "bug", - "code" - ] - }, - { - "login": "kennyLtv", - "name": "Kenny Lindelof", - "avatar_url": "https://avatars2.githubusercontent.com/u/6133325?v=4", - "profile": "https://kennyl.design", - "contributions": [ - "question" - ] - }, - { - "login": "Scarsz", - "name": "Austin Shapiro", - "avatar_url": "https://avatars1.githubusercontent.com/u/7691988?v=4", - "profile": "https://scarsz.me", - "contributions": [ - "bug", - "code" - ] - }, - { - "login": "marvinlehmann", - "name": "Marvin Lehmann", - "avatar_url": "https://avatars2.githubusercontent.com/u/4151266?v=4", - "profile": "https://github.com/marvinlehmann", - "contributions": [ - "bug", - "code" - ] - }, - { - "login": "Bourne-ID", - "name": "Bourne-ID", - "avatar_url": "https://avatars1.githubusercontent.com/u/7073616?v=4", - "profile": "https://github.com/Bourne-ID", - "contributions": [ - "review", - "content", - "doc", - "infra", - "review" - ] - }, - { - "login": "cedarlug", - "name": "CedarLUG", - "avatar_url": "https://avatars2.githubusercontent.com/u/19336442?v=4", - "profile": "http://cedarlug.org", - "contributions": [ - "bug", - "code", - "ideas", - "question", - "review" - ] - }, - { - "login": "UltimateByte", - "name": "UltimateByte", - "avatar_url": "https://avatars3.githubusercontent.com/u/8805941?v=4", - "profile": "https://www.terageek.org | https://www.haisoft.fr", - "contributions": [ - "bug", - "code", - "doc", - "ideas", - "review" - ] - }, - { - "login": "borzaka", - "name": "Attila", - "avatar_url": "https://avatars0.githubusercontent.com/u/1230402?v=4", - "profile": "https://github.com/borzaka", - "contributions": [ - "code", - "bug" - ] - } - ], - "contributorsPerLine": 7, - "projectName": "LinuxGSM", - "projectOwner": "GameServerManagers", - "repoType": "github", - "repoHost": "https://github.com" -} From d9b26ff0cac178151df081a12c958b00c254d228 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Thu, 21 May 2020 00:06:57 +0100 Subject: [PATCH 382/534] Update git-sync.yml --- .github/workflows/git-sync.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/git-sync.yml b/.github/workflows/git-sync.yml index addbba773..31946495f 100644 --- a/.github/workflows/git-sync.yml +++ b/.github/workflows/git-sync.yml @@ -6,7 +6,7 @@ on: branches: - master - 'develop' - - 'feature/update-lgsm' + jobs: repo-sync: runs-on: ubuntu-latest From d9086379651dd5a82fe2f36a6698a4e4eb1944d4 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Thu, 21 May 2020 12:14:45 +0100 Subject: [PATCH 383/534] fix(update-lgsm): will force check_version.sh to download this fix will help older versions of LinuxGSM transition to v20.3.0 and above by forcing check_version.sh to download if missing --- lgsm/functions/core_dl.sh | 7 ++++++- lgsm/functions/core_legacy.sh | 13 +++++++++++++ 2 files changed, 19 insertions(+), 1 deletion(-) diff --git a/lgsm/functions/core_dl.sh b/lgsm/functions/core_dl.sh index 8e2888add..ea0f6d8cc 100644 --- a/lgsm/functions/core_dl.sh +++ b/lgsm/functions/core_dl.sh @@ -236,7 +236,12 @@ fn_fetch_file(){ fn_fetch_file_github(){ github_file_url_dir="${1}" github_file_url_name="${2}" - if [ "${githubbranch}" == "master" ]&&[ "${commandname}" != "UPDATE-LGSM" ]; then + + if [ "${legacycheckversionfix}" == "1" ]; then + # For legacy versions - code can be removed at a future date + remote_fileurl="https://raw.githubusercontent.com/${githubuser}/${githubrepo}/${githubbranch}/${github_file_url_dir}/${github_file_url_name}" + remote_fileurl_backup="https://bitbucket.org/${githubuser}/${githubrepo}/raw/${githubbranch}/${github_file_url_dir}/${github_file_url_name}" + elif [ "${githubbranch}" == "master" ]&&[ "${commandname}" != "UPDATE-LGSM" ]; then remote_fileurl="https://raw.githubusercontent.com/${githubuser}/${githubrepo}/${version}/${github_file_url_dir}/${github_file_url_name}" remote_fileurl_backup="https://bitbucket.org/${githubuser}/${githubrepo}/raw/${version}/${github_file_url_dir}/${github_file_url_name}" else diff --git a/lgsm/functions/core_legacy.sh b/lgsm/functions/core_legacy.sh index 520287ec8..4e1418fd7 100644 --- a/lgsm/functions/core_legacy.sh +++ b/lgsm/functions/core_legacy.sh @@ -6,6 +6,19 @@ functionselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" +# This is to help the transition to v20.3.0 and above +if [ ! -f "${functionsdir}/check_version.sh" ]; then + legacy_versions_array=( v20.2.1 v20.2.0 v20.1.5 v20.1.4 v20.1.3 v20.1.2 v20.1.1 v20.1.0 v19.12.5 v19.12.4 v19.12.3 v19.12.2 v19.12.1 v19.12.0 ) + for legacy_version in "${legacy_versions_array[@]}" + do + if [ "${version}" == "${legacy_version}" ]; then + legacycheckversionfix=1 + github_file_url_dir="lgsm/functions" + fn_fetch_file_github "${github_file_url_dir}" "check_version.sh" "${functionsdir}" "nochmodx" "norun" "noforce" "nomd5" + fi + done +fi + if [ -z "${serverfiles}" ]; then legacymode=1 serverfiles="${filesdir}" From efdc0d75395503e055a477a17d641099f4d2e640 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Thu, 21 May 2020 13:32:24 +0100 Subject: [PATCH 384/534] will now check linuxgsm.sh first --- lgsm/functions/command_update_linuxgsm.sh | 98 +++++++++++------------ 1 file changed, 49 insertions(+), 49 deletions(-) diff --git a/lgsm/functions/command_update_linuxgsm.sh b/lgsm/functions/command_update_linuxgsm.sh index 9e778c9ee..e13438f19 100644 --- a/lgsm/functions/command_update_linuxgsm.sh +++ b/lgsm/functions/command_update_linuxgsm.sh @@ -32,6 +32,55 @@ else fn_print_ok_nl "Selecting repo: ${remotereponame}" fi +# Check gameserver.sh +# Compare gameserver.sh against linuxgsm.sh in the tmp dir. +# Ignoring server specific vars. +echo -en "checking ${selfname}...\c" +fn_script_log_info "Checking ${selfname}" +script_diff=$(diff <(sed '\/shortname/d;\/gameservername/d;\/gamename/d;\/githubuser/d;\/githubrepo/d;\/githubbranch/d' "${tmpdir}/linuxgsm.sh") <(sed '\/shortname/d;\/gameservername/d;\/gamename/d;\/githubuser/d;\/githubrepo/d;\/githubbranch/d' "${rootdir}/${selfname}")) +if [ "${script_diff}" != "" ]; then + fn_print_update_eol_nl + fn_script_log_update "Checking ${selfname}" + echo -en "backup ${selfname}...\c" + fn_script_log_info "Backup ${selfname}" + if [ ! -d "${backupdir}/script" ]; then + mkdir -p "${backupdir}/script" + fi + cp "${rootdir}/${selfname}" "${backupdir}/script/${selfname}-$(date +"%m_%d_%Y_%M").bak" + if [ $? -ne 0 ]; then + fn_print_fail_eol_nl + fn_script_log_fatal "Backup ${selfname}" + core_exit.sh + else + fn_print_ok_eol_nl + fn_script_log_pass "Backup ${selfname}" + echo -e "backup location ${backupdir}/script/${selfname}-$(date +"%m_%d_%Y_%M").bak" + fn_script_log_pass "Backup location ${backupdir}/script/${selfname}-$(date +"%m_%d_%Y_%M").bak" + fi + + echo -en "copying ${selfname}...\c" + fn_script_log_info "copying ${selfname}" + cp "${tmpdir}/linuxgsm.sh" "${rootdir}/${selfname}" + sed -i "s+shortname=\"core\"+shortname=\"${shortname}\"+g" "${rootdir}/${selfname}" + sed -i "s+gameservername=\"core\"+gameservername=\"${gameservername}\"+g" "${rootdir}/${selfname}" + sed -i "s+gamename=\"core\"+gamename=\"${gamename}\"+g" "${rootdir}/${selfname}" + sed -i "s+githubuser=\"GameServerManagers\"+githubuser=\"${githubuser}\"+g" "${rootdir}/${selfname}" + sed -i "s+githubrepo=\"LinuxGSM\"+githubrepo=\"${githubrepo}\"+g" "${rootdir}/${selfname}" + sed -i "s+githubbranch=\"master\"+githubbranch=\"${githubbranch}\"+g" "${rootdir}/${selfname}" + + if [ $? != "0" ]; then + fn_print_fail_eol_nl + fn_script_log_fatal "copying ${selfname}" + core_exit.sh + else + fn_print_ok_eol_nl + fn_script_log_pass "copying ${selfname}" + fi +else + fn_print_ok_eol_nl + fn_script_log_info "Checking ${selfname}" +fi + # Check _default.cfg. echo -en "checking ${remotereponame} config _default.cfg...\c" fn_script_log_info "Checking ${remotereponame} config _default.cfg" @@ -95,55 +144,6 @@ else fn_script_log_pass "Checking ${remotereponame} linuxgsm.sh" fi -# Check gameserver.sh -# Compare gameserver.sh against linuxgsm.sh in the tmp dir. -# Ignoring server specific vars. -echo -en "checking ${selfname}...\c" -fn_script_log_info "Checking ${selfname}" -script_diff=$(diff <(sed '\/shortname/d;\/gameservername/d;\/gamename/d;\/githubuser/d;\/githubrepo/d;\/githubbranch/d' "${tmpdir}/linuxgsm.sh") <(sed '\/shortname/d;\/gameservername/d;\/gamename/d;\/githubuser/d;\/githubrepo/d;\/githubbranch/d' "${rootdir}/${selfname}")) -if [ "${script_diff}" != "" ]; then - fn_print_update_eol_nl - fn_script_log_update "Checking ${selfname}" - echo -en "backup ${selfname}...\c" - fn_script_log_info "Backup ${selfname}" - if [ ! -d "${backupdir}/script" ]; then - mkdir -p "${backupdir}/script" - fi - cp "${rootdir}/${selfname}" "${backupdir}/script/${selfname}-$(date +"%m_%d_%Y_%M").bak" - if [ $? -ne 0 ]; then - fn_print_fail_eol_nl - fn_script_log_fatal "Backup ${selfname}" - core_exit.sh - else - fn_print_ok_eol_nl - fn_script_log_pass "Backup ${selfname}" - echo -e "backup location ${backupdir}/script/${selfname}-$(date +"%m_%d_%Y_%M").bak" - fn_script_log_pass "Backup location ${backupdir}/script/${selfname}-$(date +"%m_%d_%Y_%M").bak" - fi - - echo -en "copying ${selfname}...\c" - fn_script_log_info "copying ${selfname}" - cp "${tmpdir}/linuxgsm.sh" "${rootdir}/${selfname}" - sed -i "s+shortname=\"core\"+shortname=\"${shortname}\"+g" "${rootdir}/${selfname}" - sed -i "s+gameservername=\"core\"+gameservername=\"${gameservername}\"+g" "${rootdir}/${selfname}" - sed -i "s+gamename=\"core\"+gamename=\"${gamename}\"+g" "${rootdir}/${selfname}" - sed -i "s+githubuser=\"GameServerManagers\"+githubuser=\"${githubuser}\"+g" "${rootdir}/${selfname}" - sed -i "s+githubrepo=\"LinuxGSM\"+githubrepo=\"${githubrepo}\"+g" "${rootdir}/${selfname}" - sed -i "s+githubbranch=\"master\"+githubbranch=\"${githubbranch}\"+g" "${rootdir}/${selfname}" - - if [ $? != "0" ]; then - fn_print_fail_eol_nl - fn_script_log_fatal "copying ${selfname}" - core_exit.sh - else - fn_print_ok_eol_nl - fn_script_log_pass "copying ${selfname}" - fi -else - fn_print_ok_eol_nl - fn_script_log_info "Checking ${selfname}" -fi - # Check and update modules. if [ -n "${functionsdir}" ]; then if [ -d "${functionsdir}" ]; then From 707a546078a1b1a9e549766eb58162d2c68de845 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Thu, 21 May 2020 13:33:47 +0100 Subject: [PATCH 386/534] Auto stash before cherry pick of "versions before v20.3.0 will not use version tags" --- lgsm/functions/check_ip.sh | 5 +---- lgsm/functions/check_steamcmd.sh | 12 ++---------- lgsm/functions/core_dl.sh | 2 +- lgsm/functions/core_legacy.sh | 19 +++++++------------ 4 files changed, 11 insertions(+), 27 deletions(-) diff --git a/lgsm/functions/check_ip.sh b/lgsm/functions/check_ip.sh index 0e027953c..7f007b94b 100644 --- a/lgsm/functions/check_ip.sh +++ b/lgsm/functions/check_ip.sh @@ -44,10 +44,7 @@ if [ "${travistest}" != "1" ]; then echo -en "\n" echo -en "Set ip=\"0.0.0.0\" to one of the following:\n" fn_script_log_fatal "Multiple IP addresses found." - if [ "${legacymode}" == "1" ]; then - fn_script_log_fatal "Specify the IP you want to bind within the ${selfname} script." - else - fn_script_log_fatal "Specify the IP you want to bind within: ${configdirserver}." + fn_script_log_fatal "Specify the IP you want to bind within: ${configdirserver}." fi fi echo -en "${getip}\n" diff --git a/lgsm/functions/check_steamcmd.sh b/lgsm/functions/check_steamcmd.sh index b42d581df..aa4140bbe 100644 --- a/lgsm/functions/check_steamcmd.sh +++ b/lgsm/functions/check_steamcmd.sh @@ -31,18 +31,10 @@ fn_install_steamcmd(){ fn_check_steamcmd_user(){ # Checks if steamuser is setup. if [ "${steamuser}" == "username" ]; then - if [ "${legacymode}" == "1" ]; then - fn_print_fail_nl "Steam login not set. Update steamuser in ${selfname}" - else - fn_print_fail_nl "Steam login not set. Update steamuser in ${configdirserver}" - fi + fn_print_fail_nl "Steam login not set. Update steamuser in ${configdirserver}" echo -e " * Change steamuser=\"username\" to a valid steam login." if [ -d "${lgsmlogdir}" ]; then - if [ "${legacymode}" == "1" ]; then - fn_script_log_fatal "Steam login not set. Update steamuser in ${selfname}" - else - fn_script_log_fatal "Steam login not set. Update steamuser in ${configdirserver}" - fi + fn_script_log_fatal "Steam login not set. Update steamuser in ${configdirserver}" fi core_exit.sh fi diff --git a/lgsm/functions/core_dl.sh b/lgsm/functions/core_dl.sh index ea0f6d8cc..47b8e6cd9 100644 --- a/lgsm/functions/core_dl.sh +++ b/lgsm/functions/core_dl.sh @@ -237,7 +237,7 @@ fn_fetch_file_github(){ github_file_url_dir="${1}" github_file_url_name="${2}" - if [ "${legacycheckversionfix}" == "1" ]; then + if [ "${legacymode}" == "1" ]; then # For legacy versions - code can be removed at a future date remote_fileurl="https://raw.githubusercontent.com/${githubuser}/${githubrepo}/${githubbranch}/${github_file_url_dir}/${github_file_url_name}" remote_fileurl_backup="https://bitbucket.org/${githubuser}/${githubrepo}/raw/${githubbranch}/${github_file_url_dir}/${github_file_url_name}" diff --git a/lgsm/functions/core_legacy.sh b/lgsm/functions/core_legacy.sh index 4e1418fd7..3450d5842 100644 --- a/lgsm/functions/core_legacy.sh +++ b/lgsm/functions/core_legacy.sh @@ -7,20 +7,15 @@ functionselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" # This is to help the transition to v20.3.0 and above -if [ ! -f "${functionsdir}/check_version.sh" ]; then - legacy_versions_array=( v20.2.1 v20.2.0 v20.1.5 v20.1.4 v20.1.3 v20.1.2 v20.1.1 v20.1.0 v19.12.5 v19.12.4 v19.12.3 v19.12.2 v19.12.1 v19.12.0 ) - for legacy_version in "${legacy_versions_array[@]}" - do - if [ "${version}" == "${legacy_version}" ]; then - legacycheckversionfix=1 - github_file_url_dir="lgsm/functions" - fn_fetch_file_github "${github_file_url_dir}" "check_version.sh" "${functionsdir}" "nochmodx" "norun" "noforce" "nomd5" - fi - done -fi +legacy_versions_array=( v20.2.1 v20.2.0 v20.1.5 v20.1.4 v20.1.3 v20.1.2 v20.1.1 v20.1.0 v19.12.5 v19.12.4 v19.12.3 v19.12.2 v19.12.1 v19.12.0 ) +for legacy_version in "${legacy_versions_array[@]}" +do + if [ "${version}" == "${legacy_version}" ]; then + legacymode=1 + fi +done if [ -z "${serverfiles}" ]; then - legacymode=1 serverfiles="${filesdir}" fi From 05f3d2d3b4156f39cdb90befadd3c747eee42b74 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Thu, 21 May 2020 13:40:15 +0100 Subject: [PATCH 387/534] messages --- lgsm/functions/command_monitor.sh | 2 -- 1 file changed, 2 deletions(-) diff --git a/lgsm/functions/command_monitor.sh b/lgsm/functions/command_monitor.sh index 4b621c0d5..3a333a578 100644 --- a/lgsm/functions/command_monitor.sh +++ b/lgsm/functions/command_monitor.sh @@ -71,11 +71,9 @@ fn_monitor_check_queryport(){ fn_script_log_info "Checking port: CHECKING" if [ -n "${rconenabled}" ]&&[ "${rconenabled}" != "true" ]&&[ ${shortname} == "av" ]; then fn_print_warn "Checking port: Unable to query as rconport, rcon not enabled: " - fn_print_warn_eol_nl fn_script_log_warn "Checking port: Unable to query rconport, rcon not enabled: WARN" else fn_print_error "Checking port: Unable to query queryport is not set: " - fn_print_error_eol_nl fn_script_log_error "Checking port: Unable to query as queryport is not set: ERROR" fi core_exit.sh From 51a4c75ea58937471e3c569e68199f30e28d2b7b Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Thu, 21 May 2020 13:42:22 +0100 Subject: [PATCH 388/534] linuxgsm.sh check first --- lgsm/functions/command_update_linuxgsm.sh | 60 +++++++++++------------ 1 file changed, 30 insertions(+), 30 deletions(-) diff --git a/lgsm/functions/command_update_linuxgsm.sh b/lgsm/functions/command_update_linuxgsm.sh index e13438f19..c32bf321f 100644 --- a/lgsm/functions/command_update_linuxgsm.sh +++ b/lgsm/functions/command_update_linuxgsm.sh @@ -32,6 +32,36 @@ else fn_print_ok_nl "Selecting repo: ${remotereponame}" fi +# Check linuxsm.sh +echo -en "checking ${remotereponame} linuxgsm.sh...\c" +if [ "${remotereponame}" == "GitHub" ]; then + curl -IsfL "https://raw.githubusercontent.com/${githubuser}/${githubrepo}/${githubbranch}/linuxgsm.sh" 1>/dev/null +else + curl -IsfL "https://bitbucket.org/${githubuser}/${githubrepo}/raw/${githubbranch}/linuxgsm.sh" 1>/dev/null +fi +if [ $? != "0" ]; then + fn_print_fail_eol_nl + fn_script_log_fatal "Checking ${remotereponame} linuxgsm.sh" + fn_script_log_fatal "Curl returned error: $?" + core_exit.sh +fi + +if [ "${remotereponame}" == "GitHub" ]; then + tmp_script_diff=$(diff "${tmpdir}/linuxgsm.sh" <(curl -s "https://raw.githubusercontent.com/${githubuser}/${githubrepo}/${githubbranch}/linuxgsm.sh")) +else + tmp_script_diff=$(diff "${tmpdir}/linuxgsm.sh" <(curl -s "https://bitbucket.org/${githubuser}/${githubrepo}/raw/${githubbranch}/linuxgsm.sh")) +fi + +if [ "${tmp_script_diff}" != "" ]; then + fn_print_update_eol_nl + fn_script_log_update "Checking ${remotereponame} linuxgsm.sh" + rm -f "${tmpdir:?}/linuxgsm.sh" + fn_fetch_file_github "" "linuxgsm.sh" "${tmpdir}" "nochmodx" "norun" "noforcedl" "nomd5" +else + fn_print_ok_eol_nl + fn_script_log_pass "Checking ${remotereponame} linuxgsm.sh" +fi + # Check gameserver.sh # Compare gameserver.sh against linuxgsm.sh in the tmp dir. # Ignoring server specific vars. @@ -114,36 +144,6 @@ else fn_script_log_pass "Checking ${remotereponame} config _default.cfg" fi -# Check linuxsm.sh -echo -en "checking ${remotereponame} linuxgsm.sh...\c" -if [ "${remotereponame}" == "GitHub" ]; then - curl -IsfL "https://raw.githubusercontent.com/${githubuser}/${githubrepo}/${githubbranch}/linuxgsm.sh" 1>/dev/null -else - curl -IsfL "https://bitbucket.org/${githubuser}/${githubrepo}/raw/${githubbranch}/linuxgsm.sh" 1>/dev/null -fi -if [ $? != "0" ]; then - fn_print_fail_eol_nl - fn_script_log_fatal "Checking ${remotereponame} linuxgsm.sh" - fn_script_log_fatal "Curl returned error: $?" - core_exit.sh -fi - -if [ "${remotereponame}" == "GitHub" ]; then - tmp_script_diff=$(diff "${tmpdir}/linuxgsm.sh" <(curl -s "https://raw.githubusercontent.com/${githubuser}/${githubrepo}/${githubbranch}/linuxgsm.sh")) -else - tmp_script_diff=$(diff "${tmpdir}/linuxgsm.sh" <(curl -s "https://bitbucket.org/${githubuser}/${githubrepo}/raw/${githubbranch}/linuxgsm.sh")) -fi - -if [ "${tmp_script_diff}" != "" ]; then - fn_print_update_eol_nl - fn_script_log_update "Checking ${remotereponame} linuxgsm.sh" - rm -f "${tmpdir:?}/linuxgsm.sh" - fn_fetch_file_github "" "linuxgsm.sh" "${tmpdir}" "nochmodx" "norun" "noforcedl" "nomd5" -else - fn_print_ok_eol_nl - fn_script_log_pass "Checking ${remotereponame} linuxgsm.sh" -fi - # Check and update modules. if [ -n "${functionsdir}" ]; then if [ -d "${functionsdir}" ]; then From a752554290413ced40be788c91b52c151f9bef42 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Thu, 21 May 2020 13:45:18 +0100 Subject: [PATCH 389/534] space --- lgsm/functions/core_dl.sh | 1 - 1 file changed, 1 deletion(-) diff --git a/lgsm/functions/core_dl.sh b/lgsm/functions/core_dl.sh index 47b8e6cd9..89ee784db 100644 --- a/lgsm/functions/core_dl.sh +++ b/lgsm/functions/core_dl.sh @@ -236,7 +236,6 @@ fn_fetch_file(){ fn_fetch_file_github(){ github_file_url_dir="${1}" github_file_url_name="${2}" - if [ "${legacymode}" == "1" ]; then # For legacy versions - code can be removed at a future date remote_fileurl="https://raw.githubusercontent.com/${githubuser}/${githubrepo}/${githubbranch}/${github_file_url_dir}/${github_file_url_name}" From 0fa77403cde67e74c1b84444c77dc333d6f38ad8 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Thu, 21 May 2020 13:56:41 +0100 Subject: [PATCH 390/534] stray fi --- lgsm/functions/check_ip.sh | 1 - 1 file changed, 1 deletion(-) diff --git a/lgsm/functions/check_ip.sh b/lgsm/functions/check_ip.sh index 7f007b94b..d8c4f3ed5 100644 --- a/lgsm/functions/check_ip.sh +++ b/lgsm/functions/check_ip.sh @@ -45,7 +45,6 @@ if [ "${travistest}" != "1" ]; then echo -en "Set ip=\"0.0.0.0\" to one of the following:\n" fn_script_log_fatal "Multiple IP addresses found." fn_script_log_fatal "Specify the IP you want to bind within: ${configdirserver}." - fi fi echo -en "${getip}\n" echo -en "\n" From 81e23c729e1f0667eaeb689406085b49580d5ef4 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Thu, 21 May 2020 17:21:37 +0100 Subject: [PATCH 391/534] fix(mods): resolve broken downloader for mods (#2899) --- 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 8108e0d0e..da2576207 100644 --- a/lgsm/functions/mods_core.sh +++ b/lgsm/functions/mods_core.sh @@ -18,7 +18,7 @@ modsinstalledlistfullpath="${modsdir}/${modsinstalledlist}" # Download management. fn_mod_install_files(){ - fn_fetch_file "${modurl}" "${modstmpdir}" "${modfilename}" + 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 downloading ${modprettyname}" From 04bb8485b805fad4c87dd2e33b21dfee7a38b8d3 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Thu, 21 May 2020 17:22:04 +0100 Subject: [PATCH 392/534] fix(update): fix update on start not working (#2901) * add space to grep to get accurate session name * move messages to get proper output --- lgsm/functions/command_start.sh | 7 +++++-- lgsm/functions/info_distro.sh | 2 +- lgsm/functions/update_factorio.sh | 4 ---- lgsm/functions/update_minecraft.sh | 4 ---- lgsm/functions/update_minecraft_bedrock.sh | 4 ---- lgsm/functions/update_mta.sh | 4 ---- lgsm/functions/update_mumble.sh | 4 ---- lgsm/functions/update_steamcmd.sh | 4 ---- lgsm/functions/update_ts3.sh | 4 ---- 9 files changed, 6 insertions(+), 31 deletions(-) diff --git a/lgsm/functions/command_start.sh b/lgsm/functions/command_start.sh index 7ba90159d..d0487e5d4 100644 --- a/lgsm/functions/command_start.sh +++ b/lgsm/functions/command_start.sh @@ -165,13 +165,12 @@ fn_start_tmux(){ echo -en "\n" } - check.sh -fn_print_dots "${servername}" # Is the server already started. # $status comes from check_status.sh, which is run by check.sh for this command if [ "${status}" != "0" ]; then + fn_print_dots "${servername}" fn_print_info_nl "${servername} is already running" fn_script_log_error "${servername} is already running" if [ -z "${exitbypass}" ]; then @@ -189,8 +188,12 @@ if [ "${updateonstart}" == "yes" ]||[ "${updateonstart}" == "1" ]||[ "${updateon exitbypass=1 unset updateonstart command_update.sh + commandname="START" + commandaction="Starting" fi +fn_print_dots "${servername}" + if [ "${shortname}" == "ts3" ]; then fn_start_teamspeak3 else diff --git a/lgsm/functions/info_distro.sh b/lgsm/functions/info_distro.sh index 7f1ea12c1..1e2a519f4 100644 --- a/lgsm/functions/info_distro.sh +++ b/lgsm/functions/info_distro.sh @@ -9,7 +9,7 @@ functionselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" ### Game Server pid if [ "${status}" == "1" ]; then - gameserverpid=$(tmux list-sessions -F "#{session_name} #{pane_pid}"| grep "^${sessionname}"|awk '{print $2}') + gameserverpid=$(tmux list-sessions -F "#{session_name} #{pane_pid}" | grep "^${sessionname} " | awk '{print $2}') fi ### Distro information diff --git a/lgsm/functions/update_factorio.sh b/lgsm/functions/update_factorio.sh index 7d12c0f58..5ff67c448 100644 --- a/lgsm/functions/update_factorio.sh +++ b/lgsm/functions/update_factorio.sh @@ -170,7 +170,3 @@ else fn_update_factorio_remotebuild fn_update_factorio_compare fi - -if [ "${commandname}" != "INSTALL" ]; then - core_exit.sh -fi diff --git a/lgsm/functions/update_minecraft.sh b/lgsm/functions/update_minecraft.sh index 8741db01d..556097bd6 100644 --- a/lgsm/functions/update_minecraft.sh +++ b/lgsm/functions/update_minecraft.sh @@ -218,7 +218,3 @@ else fn_update_minecraft_remotebuild fn_update_minecraft_compare fi - -if [ "${commandname}" != "INSTALL" ]; then - core_exit.sh -fi diff --git a/lgsm/functions/update_minecraft_bedrock.sh b/lgsm/functions/update_minecraft_bedrock.sh index b560f3672..8f408bf29 100644 --- a/lgsm/functions/update_minecraft_bedrock.sh +++ b/lgsm/functions/update_minecraft_bedrock.sh @@ -178,7 +178,3 @@ else fn_update_minecraft_remotebuild fn_update_minecraft_compare fi - -if [ "${commandname}" != "INSTALL" ]; then - core_exit.sh -fi diff --git a/lgsm/functions/update_mta.sh b/lgsm/functions/update_mta.sh index c37c5ba81..5aaecc122 100644 --- a/lgsm/functions/update_mta.sh +++ b/lgsm/functions/update_mta.sh @@ -209,7 +209,3 @@ else fn_update_mta_remotebuild fn_update_mta_compare fi - -if [ "${commandname}" != "INSTALL" ]; then - core_exit.sh -fi diff --git a/lgsm/functions/update_mumble.sh b/lgsm/functions/update_mumble.sh index 00fbade5e..ee6a2b0ad 100644 --- a/lgsm/functions/update_mumble.sh +++ b/lgsm/functions/update_mumble.sh @@ -148,7 +148,3 @@ else fn_update_mumble_remotebuild fn_update_mumble_compare fi - -if [ "${commandname}" != "INSTALL" ]; then - core_exit.sh -fi diff --git a/lgsm/functions/update_steamcmd.sh b/lgsm/functions/update_steamcmd.sh index e7d018d19..8a089c7f7 100644 --- a/lgsm/functions/update_steamcmd.sh +++ b/lgsm/functions/update_steamcmd.sh @@ -246,7 +246,3 @@ else fn_update_steamcmd_remotebuild fn_update_steamcmd_compare fi - -if [ "${commandname}" != "INSTALL" ]; then - core_exit.sh -fi diff --git a/lgsm/functions/update_ts3.sh b/lgsm/functions/update_ts3.sh index ec921b3f0..a5cc0dd60 100644 --- a/lgsm/functions/update_ts3.sh +++ b/lgsm/functions/update_ts3.sh @@ -219,7 +219,3 @@ else fn_update_ts3_remotebuild fn_update_ts3_compare fi - -if [ "${commandname}" != "INSTALL" ]; then - core_exit.sh -fi From eb3807464099752cca05ed43d91470dd192a9e14 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Thu, 21 May 2020 17:22:23 +0100 Subject: [PATCH 393/534] fix(update-lgsm): versions before v20.3.0 will not use version tags (#2900) --- lgsm/functions/check_ip.sh | 6 +-- lgsm/functions/check_steamcmd.sh | 12 +---- lgsm/functions/command_monitor.sh | 2 - lgsm/functions/command_update_linuxgsm.sh | 66 +++++++++++------------ lgsm/functions/core_dl.sh | 6 ++- lgsm/functions/core_legacy.sh | 10 +++- 6 files changed, 50 insertions(+), 52 deletions(-) diff --git a/lgsm/functions/check_ip.sh b/lgsm/functions/check_ip.sh index 0e027953c..d8c4f3ed5 100644 --- a/lgsm/functions/check_ip.sh +++ b/lgsm/functions/check_ip.sh @@ -44,11 +44,7 @@ if [ "${travistest}" != "1" ]; then echo -en "\n" echo -en "Set ip=\"0.0.0.0\" to one of the following:\n" fn_script_log_fatal "Multiple IP addresses found." - if [ "${legacymode}" == "1" ]; then - fn_script_log_fatal "Specify the IP you want to bind within the ${selfname} script." - else - fn_script_log_fatal "Specify the IP you want to bind within: ${configdirserver}." - fi + fn_script_log_fatal "Specify the IP you want to bind within: ${configdirserver}." fi echo -en "${getip}\n" echo -en "\n" diff --git a/lgsm/functions/check_steamcmd.sh b/lgsm/functions/check_steamcmd.sh index b42d581df..aa4140bbe 100644 --- a/lgsm/functions/check_steamcmd.sh +++ b/lgsm/functions/check_steamcmd.sh @@ -31,18 +31,10 @@ fn_install_steamcmd(){ fn_check_steamcmd_user(){ # Checks if steamuser is setup. if [ "${steamuser}" == "username" ]; then - if [ "${legacymode}" == "1" ]; then - fn_print_fail_nl "Steam login not set. Update steamuser in ${selfname}" - else - fn_print_fail_nl "Steam login not set. Update steamuser in ${configdirserver}" - fi + fn_print_fail_nl "Steam login not set. Update steamuser in ${configdirserver}" echo -e " * Change steamuser=\"username\" to a valid steam login." if [ -d "${lgsmlogdir}" ]; then - if [ "${legacymode}" == "1" ]; then - fn_script_log_fatal "Steam login not set. Update steamuser in ${selfname}" - else - fn_script_log_fatal "Steam login not set. Update steamuser in ${configdirserver}" - fi + fn_script_log_fatal "Steam login not set. Update steamuser in ${configdirserver}" fi core_exit.sh fi diff --git a/lgsm/functions/command_monitor.sh b/lgsm/functions/command_monitor.sh index 4b621c0d5..3a333a578 100644 --- a/lgsm/functions/command_monitor.sh +++ b/lgsm/functions/command_monitor.sh @@ -71,11 +71,9 @@ fn_monitor_check_queryport(){ fn_script_log_info "Checking port: CHECKING" if [ -n "${rconenabled}" ]&&[ "${rconenabled}" != "true" ]&&[ ${shortname} == "av" ]; then fn_print_warn "Checking port: Unable to query as rconport, rcon not enabled: " - fn_print_warn_eol_nl fn_script_log_warn "Checking port: Unable to query rconport, rcon not enabled: WARN" else fn_print_error "Checking port: Unable to query queryport is not set: " - fn_print_error_eol_nl fn_script_log_error "Checking port: Unable to query as queryport is not set: ERROR" fi core_exit.sh diff --git a/lgsm/functions/command_update_linuxgsm.sh b/lgsm/functions/command_update_linuxgsm.sh index 9e778c9ee..c32bf321f 100644 --- a/lgsm/functions/command_update_linuxgsm.sh +++ b/lgsm/functions/command_update_linuxgsm.sh @@ -32,39 +32,6 @@ else fn_print_ok_nl "Selecting repo: ${remotereponame}" fi -# Check _default.cfg. -echo -en "checking ${remotereponame} config _default.cfg...\c" -fn_script_log_info "Checking ${remotereponame} config _default.cfg" -if [ "${remotereponame}" == "GitHub" ]; then - curl -IsfL "https://raw.githubusercontent.com/${githubuser}/${githubrepo}/${githubbranch}/lgsm/config-default/config-lgsm/${gameservername}/_default.cfg" 1>/dev/null -else - curl -IsfL "https://bitbucket.org/${githubuser}/${githubrepo}/raw/${githubbranch}/lgsm/config-default/config-lgsm/${gameservername}/_default.cfg" 1>/dev/null -fi -if [ $? != "0" ]; then - fn_print_fail_eol_nl - fn_script_log_fatal "Checking ${remotereponame} config _default.cfg" - fn_script_log_fatal "Curl returned error: $?" - core_exit.sh -fi - -if [ "${remotereponame}" == "GitHub" ]; then - config_file_diff=$(diff "${configdirdefault}/config-lgsm/${gameservername}/_default.cfg" <(curl -s "https://raw.githubusercontent.com/${githubuser}/${githubrepo}/${githubbranch}/lgsm/config-default/config-lgsm/${gameservername}/_default.cfg")) -else - config_file_diff=$(diff "${configdirdefault}/config-lgsm/${gameservername}/_default.cfg" <(curl -s "https://bitbucket.org/${githubuser}/${githubrepo}/raw/${githubbranch}/lgsm/config-default/config-lgsm/${gameservername}/_default.cfg")) -fi - -if [ "${config_file_diff}" != "" ]; then - fn_print_update_eol_nl - fn_script_log_update "Checking ${remotereponame} config _default.cfg" - rm -f "${configdirdefault:?}/config-lgsm/${gameservername:?}/_default.cfg" - fn_fetch_file_github "lgsm/config-default/config-lgsm/${gameservername}" "_default.cfg" "${configdirdefault}/config-lgsm/${gameservername}" "nochmodx" "norun" "noforce" "nomd5" - alert="config" - alert.sh -else - fn_print_ok_eol_nl - fn_script_log_pass "Checking ${remotereponame} config _default.cfg" -fi - # Check linuxsm.sh echo -en "checking ${remotereponame} linuxgsm.sh...\c" if [ "${remotereponame}" == "GitHub" ]; then @@ -144,6 +111,39 @@ else fn_script_log_info "Checking ${selfname}" fi +# Check _default.cfg. +echo -en "checking ${remotereponame} config _default.cfg...\c" +fn_script_log_info "Checking ${remotereponame} config _default.cfg" +if [ "${remotereponame}" == "GitHub" ]; then + curl -IsfL "https://raw.githubusercontent.com/${githubuser}/${githubrepo}/${githubbranch}/lgsm/config-default/config-lgsm/${gameservername}/_default.cfg" 1>/dev/null +else + curl -IsfL "https://bitbucket.org/${githubuser}/${githubrepo}/raw/${githubbranch}/lgsm/config-default/config-lgsm/${gameservername}/_default.cfg" 1>/dev/null +fi +if [ $? != "0" ]; then + fn_print_fail_eol_nl + fn_script_log_fatal "Checking ${remotereponame} config _default.cfg" + fn_script_log_fatal "Curl returned error: $?" + core_exit.sh +fi + +if [ "${remotereponame}" == "GitHub" ]; then + config_file_diff=$(diff "${configdirdefault}/config-lgsm/${gameservername}/_default.cfg" <(curl -s "https://raw.githubusercontent.com/${githubuser}/${githubrepo}/${githubbranch}/lgsm/config-default/config-lgsm/${gameservername}/_default.cfg")) +else + config_file_diff=$(diff "${configdirdefault}/config-lgsm/${gameservername}/_default.cfg" <(curl -s "https://bitbucket.org/${githubuser}/${githubrepo}/raw/${githubbranch}/lgsm/config-default/config-lgsm/${gameservername}/_default.cfg")) +fi + +if [ "${config_file_diff}" != "" ]; then + fn_print_update_eol_nl + fn_script_log_update "Checking ${remotereponame} config _default.cfg" + rm -f "${configdirdefault:?}/config-lgsm/${gameservername:?}/_default.cfg" + fn_fetch_file_github "lgsm/config-default/config-lgsm/${gameservername}" "_default.cfg" "${configdirdefault}/config-lgsm/${gameservername}" "nochmodx" "norun" "noforce" "nomd5" + alert="config" + alert.sh +else + fn_print_ok_eol_nl + fn_script_log_pass "Checking ${remotereponame} config _default.cfg" +fi + # Check and update modules. if [ -n "${functionsdir}" ]; then if [ -d "${functionsdir}" ]; then diff --git a/lgsm/functions/core_dl.sh b/lgsm/functions/core_dl.sh index 8e2888add..89ee784db 100644 --- a/lgsm/functions/core_dl.sh +++ b/lgsm/functions/core_dl.sh @@ -236,7 +236,11 @@ fn_fetch_file(){ fn_fetch_file_github(){ github_file_url_dir="${1}" github_file_url_name="${2}" - if [ "${githubbranch}" == "master" ]&&[ "${commandname}" != "UPDATE-LGSM" ]; then + if [ "${legacymode}" == "1" ]; then + # For legacy versions - code can be removed at a future date + remote_fileurl="https://raw.githubusercontent.com/${githubuser}/${githubrepo}/${githubbranch}/${github_file_url_dir}/${github_file_url_name}" + remote_fileurl_backup="https://bitbucket.org/${githubuser}/${githubrepo}/raw/${githubbranch}/${github_file_url_dir}/${github_file_url_name}" + elif [ "${githubbranch}" == "master" ]&&[ "${commandname}" != "UPDATE-LGSM" ]; then remote_fileurl="https://raw.githubusercontent.com/${githubuser}/${githubrepo}/${version}/${github_file_url_dir}/${github_file_url_name}" remote_fileurl_backup="https://bitbucket.org/${githubuser}/${githubrepo}/raw/${version}/${github_file_url_dir}/${github_file_url_name}" else diff --git a/lgsm/functions/core_legacy.sh b/lgsm/functions/core_legacy.sh index 520287ec8..3450d5842 100644 --- a/lgsm/functions/core_legacy.sh +++ b/lgsm/functions/core_legacy.sh @@ -6,8 +6,16 @@ functionselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" +# This is to help the transition to v20.3.0 and above +legacy_versions_array=( v20.2.1 v20.2.0 v20.1.5 v20.1.4 v20.1.3 v20.1.2 v20.1.1 v20.1.0 v19.12.5 v19.12.4 v19.12.3 v19.12.2 v19.12.1 v19.12.0 ) +for legacy_version in "${legacy_versions_array[@]}" +do + if [ "${version}" == "${legacy_version}" ]; then + legacymode=1 + fi +done + if [ -z "${serverfiles}" ]; then - legacymode=1 serverfiles="${filesdir}" fi From 498cb6714603fc5c1efd5d729fefd4ef46cdc0ea Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Thu, 21 May 2020 17:42:23 +0100 Subject: [PATCH 394/534] release v20.3.1 --- lgsm/functions/core_functions.sh | 2 +- linuxgsm.sh | 2 +- tests/tests_fctrserver.sh | 2 +- tests/tests_jc2server.sh | 2 +- tests/tests_mcserver.sh | 2 +- tests/tests_ts3server.sh | 2 +- 6 files changed, 6 insertions(+), 6 deletions(-) diff --git a/lgsm/functions/core_functions.sh b/lgsm/functions/core_functions.sh index ae1b860a7..8eb248388 100644 --- a/lgsm/functions/core_functions.sh +++ b/lgsm/functions/core_functions.sh @@ -7,7 +7,7 @@ functionselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" -modulesversion="v20.3.0" +modulesversion="v20.3.1" # Core diff --git a/linuxgsm.sh b/linuxgsm.sh index eaa2b31b7..3edbb0948 100755 --- a/linuxgsm.sh +++ b/linuxgsm.sh @@ -20,7 +20,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="v20.3.0" +version="v20.3.1" shortname="core" gameservername="core" commandname="CORE" diff --git a/tests/tests_fctrserver.sh b/tests/tests_fctrserver.sh index 50f2a1b15..9d56e36ef 100644 --- a/tests/tests_fctrserver.sh +++ b/tests/tests_fctrserver.sh @@ -20,7 +20,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="v20.3.0" +version="v20.3.1" shortname="fctr" gameservername="fctrserver" commandname="CORE" diff --git a/tests/tests_jc2server.sh b/tests/tests_jc2server.sh index 61793bca0..9ab94578b 100644 --- a/tests/tests_jc2server.sh +++ b/tests/tests_jc2server.sh @@ -20,7 +20,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="v20.3.0" +version="v20.3.1" shortname="jc2" gameservername="jc2server" commandname="CORE" diff --git a/tests/tests_mcserver.sh b/tests/tests_mcserver.sh index 8c3c6c267..6e651b2ac 100644 --- a/tests/tests_mcserver.sh +++ b/tests/tests_mcserver.sh @@ -20,7 +20,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="v20.3.0" +version="v20.3.1" shortname="mc" gameservername="mcserver" commandname="CORE" diff --git a/tests/tests_ts3server.sh b/tests/tests_ts3server.sh index 6b398364b..003813835 100644 --- a/tests/tests_ts3server.sh +++ b/tests/tests_ts3server.sh @@ -20,7 +20,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="v20.3.0" +version="v20.3.1" shortname="ts3" gameservername="ts3server" commandname="CORE" From 755907a7a64040dcd6240aaa7834789a253295d5 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Fri, 22 May 2020 19:03:50 +0100 Subject: [PATCH 395/534] Update FUNDING.yml --- .github/FUNDING.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/FUNDING.yml b/.github/FUNDING.yml index ee85cb782..357dfdf6e 100644 --- a/.github/FUNDING.yml +++ b/.github/FUNDING.yml @@ -9,4 +9,4 @@ community_bridge: # Replace with a single Community Bridge project-name e.g., cl liberapay: # Replace with a single Liberapay username issuehunt: # Replace with a single IssueHunt username otechie: # Replace with a single Otechie username -custom: ["https://www.paypal.me/dgibbs64", paypal.me/dgibbs64] # Replace with a single custom sponsorship URL +custom: [paypal.me/dgibbs64] # Replace with a single custom sponsorship URL From 3ae3d89bf745bb21bac637a452cc96fef5991100 Mon Sep 17 00:00:00 2001 From: Christian Date: Sun, 24 May 2020 15:26:45 +0200 Subject: [PATCH 396/534] fix(download): fix some files not downloading (#2904) --- lgsm/functions/command_install_resources_mta.sh | 2 +- lgsm/functions/fix_mta.sh | 2 +- lgsm/functions/install_server_files.sh | 2 +- lgsm/functions/update_minecraft_bedrock.sh | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/lgsm/functions/command_install_resources_mta.sh b/lgsm/functions/command_install_resources_mta.sh index 0a9ac7806..053982e0b 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 -e "" echo -e "Installing Default Resources" echo -e "=================================" - fn_fetch_file "http://mirror.mtasa.com/mtasa/resources/mtasa-resources-latest.zip" "${tmpdir}" "mtasa-resources-latest.zip" "nochmodx" "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 -e "Default Resources Installed." } diff --git a/lgsm/functions/fix_mta.sh b/lgsm/functions/fix_mta.sh index d57e04f3a..549101a68 100644 --- a/lgsm/functions/fix_mta.sh +++ b/lgsm/functions/fix_mta.sh @@ -11,6 +11,6 @@ if [ ! -f "${lgsmdir}/lib/libmysqlclient.so.16" ]; then fixname="libmysqlclient16" fn_fix_msg_start_nl fn_sleep_time - fn_fetch_file "https://nightly.mtasa.com/files/modules/64/libmysqlclient.so.16" "${lgsmdir}/lib" "libmysqlclient.so.16" "chmodx" "norun" "noforce" "6c188e0f8fb5d7a29f4bc413b9fed6c2" + 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_server_files.sh b/lgsm/functions/install_server_files.sh index a3ddd435a..f6c48c3dd 100644 --- a/lgsm/functions/install_server_files.sh +++ b/lgsm/functions/install_server_files.sh @@ -62,7 +62,7 @@ fn_install_server_files(){ elif [ "${shortname}" == "zmr" ]; then remote_fileurl="http://linuxgsm.download/ZombieMasterReborn/zombie_master_reborn_b5_2.tar.xz"; local_filedir="${tmpdir}"; local_filename="zombie_master_reborn_b5_2.tar.xz"; chmodx="nochmodx" run="norun"; force="noforce"; md5="4b9b9832e863d03981a40c26065792a6" fi - fn_fetch_file "${remote_fileurl}" "${local_filedir}" "${local_filename}" "${chmodx}" "${run}" "${forcedl}" "${md5}" + fn_fetch_file "${remote_fileurl}" "" "" "" "${local_filedir}" "${local_filename}" "${chmodx}" "${run}" "${forcedl}" "${md5}" fn_dl_extract "${local_filedir}" "${local_filename}" "${serverfiles}" } diff --git a/lgsm/functions/update_minecraft_bedrock.sh b/lgsm/functions/update_minecraft_bedrock.sh index 8f408bf29..61cad6854 100644 --- a/lgsm/functions/update_minecraft_bedrock.sh +++ b/lgsm/functions/update_minecraft_bedrock.sh @@ -8,7 +8,7 @@ functionselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" fn_update_minecraft_dl(){ latestmcbuildurl=$(curl -s "https://www.minecraft.net/en-us/download/server/bedrock/" | grep -o 'https://minecraft.azureedge.net/bin-linux/[^"]*zip') - fn_fetch_file "${latestmcbuildurl}" "${tmpdir}" "bedrock_server.${remotebuild}.zip" + fn_fetch_file "${latestmcbuildurl}" "" "" "" "${tmpdir}" "bedrock_server.${remotebuild}.zip" echo -e "Extracting to ${serverfiles}...\c" if [ "${installer}" == "1" ]; then unzip -oq "${tmpdir}/bedrock_server.${remotebuild}.zip" -x "server.properties" -d "${serverfiles}" From ff4d037da3a46b0ba07baa0b0d043ebdb1d6583d Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Sun, 24 May 2020 14:33:20 +0100 Subject: [PATCH 397/534] remove install_modules --- lgsm/functions/core_functions.sh | 5 ----- 1 file changed, 5 deletions(-) diff --git a/lgsm/functions/core_functions.sh b/lgsm/functions/core_functions.sh index 8eb248388..9555a4fa3 100644 --- a/lgsm/functions/core_functions.sh +++ b/lgsm/functions/core_functions.sh @@ -678,11 +678,6 @@ functionfile="${FUNCNAME[0]}" fn_fetch_function } -install_modules.sh(){ -functionfile="${FUNCNAME[0]}" -fn_fetch_function -} - install_retry.sh(){ functionfile="${FUNCNAME[0]}" fn_fetch_function From 58956fab3cba11f7827c35ac946c05d0e92c18ff Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Sun, 24 May 2020 14:37:41 +0100 Subject: [PATCH 398/534] release v20.3.2 release v30.3.2 --- lgsm/functions/core_functions.sh | 2 +- linuxgsm.sh | 2 +- tests/tests_fctrserver.sh | 2 +- tests/tests_jc2server.sh | 2 +- tests/tests_mcserver.sh | 2 +- tests/tests_ts3server.sh | 2 +- 6 files changed, 6 insertions(+), 6 deletions(-) diff --git a/lgsm/functions/core_functions.sh b/lgsm/functions/core_functions.sh index 9555a4fa3..4e87d494b 100644 --- a/lgsm/functions/core_functions.sh +++ b/lgsm/functions/core_functions.sh @@ -7,7 +7,7 @@ functionselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" -modulesversion="v20.3.1" +modulesversion="v20.3.2" # Core diff --git a/linuxgsm.sh b/linuxgsm.sh index 3edbb0948..83e8f4b86 100755 --- a/linuxgsm.sh +++ b/linuxgsm.sh @@ -20,7 +20,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="v20.3.1" +version="v20.3.2" shortname="core" gameservername="core" commandname="CORE" diff --git a/tests/tests_fctrserver.sh b/tests/tests_fctrserver.sh index 9d56e36ef..a828ba750 100644 --- a/tests/tests_fctrserver.sh +++ b/tests/tests_fctrserver.sh @@ -20,7 +20,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="v20.3.1" +version="v20.3.2" shortname="fctr" gameservername="fctrserver" commandname="CORE" diff --git a/tests/tests_jc2server.sh b/tests/tests_jc2server.sh index 9ab94578b..d23eaf48c 100644 --- a/tests/tests_jc2server.sh +++ b/tests/tests_jc2server.sh @@ -20,7 +20,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="v20.3.1" +version="v20.3.2" shortname="jc2" gameservername="jc2server" commandname="CORE" diff --git a/tests/tests_mcserver.sh b/tests/tests_mcserver.sh index 6e651b2ac..f2962c035 100644 --- a/tests/tests_mcserver.sh +++ b/tests/tests_mcserver.sh @@ -20,7 +20,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="v20.3.1" +version="v20.3.2" shortname="mc" gameservername="mcserver" commandname="CORE" diff --git a/tests/tests_ts3server.sh b/tests/tests_ts3server.sh index 003813835..5de30cda4 100644 --- a/tests/tests_ts3server.sh +++ b/tests/tests_ts3server.sh @@ -20,7 +20,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="v20.3.1" +version="v20.3.2" shortname="ts3" gameservername="ts3server" commandname="CORE" From b52dc9af8eb1d912e33826f9c776126ca6808c09 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Fri, 29 May 2020 18:45:08 +0100 Subject: [PATCH 399/534] fix(ut3server): correct md5sum for ut3server download --- .github/workflows/git-sync.yml | 2 +- lgsm/functions/install_server_files.sh | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/git-sync.yml b/.github/workflows/git-sync.yml index 31946495f..9fc886b4e 100644 --- a/.github/workflows/git-sync.yml +++ b/.github/workflows/git-sync.yml @@ -3,7 +3,7 @@ name: Backup Repo # This will allow LinuxGSM to use Bitbucket as and alternative download if github fails. on: push: - branches: + branches: - master - 'develop' diff --git a/lgsm/functions/install_server_files.sh b/lgsm/functions/install_server_files.sh index f6c48c3dd..9593401ce 100644 --- a/lgsm/functions/install_server_files.sh +++ b/lgsm/functions/install_server_files.sh @@ -52,7 +52,7 @@ fn_install_server_files(){ elif [ "${shortname}" == "ut" ]; then remote_fileurl="http://linuxgsm.download/UnrealTournament/UnrealTournament-Server-XAN-3525360-Linux.tar.xz"; local_filedir="${tmpdir}"; local_filename="UnrealTournament-Server-XAN-3525360-Linux.tar.xz"; chmodx="noexecute" run="norun"; force="noforce"; md5="41dd92015713a78211eaccf503b72393" elif [ "${shortname}" == "ut3" ]; then - remote_fileurl="http://linuxgsm.download/UnrealTournament3/UT3-linux-server-2.1.tar.xz"; local_filedir="${tmpdir}"; local_filename="UT3-linux-server-2.1.tar.xz"; chmodx="nochmodx" run="norun"; force="noforce"; md5="6b92b083c7ab416399e2183a22fda1df" + remote_fileurl="http://linuxgsm.download/UnrealTournament3/UT3-linux-server-2.1.tar.xz"; local_filedir="${tmpdir}"; local_filename="UT3-linux-server-2.1.tar.xz"; chmodx="nochmodx" run="norun"; force="noforce"; md5="8876cca61e3f83ea08db25208bde6ac6" elif [ "${shortname}" == "vs" ]; then remote_fileurl="http://linuxgsm.download/VampireSlayer/vs_l-6.0_full.tar.xz"; local_filedir="${tmpdir}"; local_filename="vs_l-6.0_full.tar.xz"; chmodx="nochmodx" run="norun"; force="noforce"; md5="b322f79e0abd31847493c52acf802667" elif [ "${shortname}" == "wet" ]; then From 363c5ab1f341815c4129d21c2034ff9a499ba5fe Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Fri, 29 May 2020 18:46:27 +0100 Subject: [PATCH 400/534] release v20.3.3 --- lgsm/functions/core_functions.sh | 2 +- linuxgsm.sh | 2 +- tests/tests_fctrserver.sh | 2 +- tests/tests_jc2server.sh | 2 +- tests/tests_mcserver.sh | 2 +- tests/tests_ts3server.sh | 2 +- 6 files changed, 6 insertions(+), 6 deletions(-) diff --git a/lgsm/functions/core_functions.sh b/lgsm/functions/core_functions.sh index 4e87d494b..4b0387194 100644 --- a/lgsm/functions/core_functions.sh +++ b/lgsm/functions/core_functions.sh @@ -7,7 +7,7 @@ functionselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" -modulesversion="v20.3.2" +modulesversion="v20.3.3" # Core diff --git a/linuxgsm.sh b/linuxgsm.sh index 83e8f4b86..aececaed8 100755 --- a/linuxgsm.sh +++ b/linuxgsm.sh @@ -20,7 +20,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="v20.3.2" +version="v20.3.3" shortname="core" gameservername="core" commandname="CORE" diff --git a/tests/tests_fctrserver.sh b/tests/tests_fctrserver.sh index a828ba750..da71c2b5a 100644 --- a/tests/tests_fctrserver.sh +++ b/tests/tests_fctrserver.sh @@ -20,7 +20,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="v20.3.2" +version="v20.3.3" shortname="fctr" gameservername="fctrserver" commandname="CORE" diff --git a/tests/tests_jc2server.sh b/tests/tests_jc2server.sh index d23eaf48c..b52cf1f1b 100644 --- a/tests/tests_jc2server.sh +++ b/tests/tests_jc2server.sh @@ -20,7 +20,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="v20.3.2" +version="v20.3.3" shortname="jc2" gameservername="jc2server" commandname="CORE" diff --git a/tests/tests_mcserver.sh b/tests/tests_mcserver.sh index f2962c035..8d7bab6b6 100644 --- a/tests/tests_mcserver.sh +++ b/tests/tests_mcserver.sh @@ -20,7 +20,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="v20.3.2" +version="v20.3.3" shortname="mc" gameservername="mcserver" commandname="CORE" diff --git a/tests/tests_ts3server.sh b/tests/tests_ts3server.sh index 5de30cda4..fb4f889bf 100644 --- a/tests/tests_ts3server.sh +++ b/tests/tests_ts3server.sh @@ -20,7 +20,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="v20.3.2" +version="v20.3.3" shortname="ts3" gameservername="ts3server" commandname="CORE" From 56b87ef23177a695c3e71a1971fca75818c6ae77 Mon Sep 17 00:00:00 2001 From: ttocszed00 Date: Thu, 18 Jun 2020 04:53:20 +0900 Subject: [PATCH 401/534] fix(details): fix if typo in starbound details (#2929) --- lgsm/functions/info_messages.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lgsm/functions/info_messages.sh b/lgsm/functions/info_messages.sh index 063914497..eb0ed43cf 100644 --- a/lgsm/functions/info_messages.sh +++ b/lgsm/functions/info_messages.sh @@ -1462,7 +1462,7 @@ fn_info_message_select_engine(){ fn_info_message_sof2 elif [ "${shortname}" == "sol" ]; then fn_info_message_soldat - elif [ "${shortname}" == "st" ]; then + elif [ "${shortname}" == "sb" ]; then fn_info_message_starbound elif [ "${shortname}" == "sbots" ]; then fn_info_message_sbots From 8ebeac900cf436ac6b43e66b630cdf9524a09bbb Mon Sep 17 00:00:00 2001 From: Christian Date: Wed, 17 Jun 2020 21:54:49 +0200 Subject: [PATCH 402/534] fix(av): fix post install for Avorion #2925 (#2928) --- lgsm/functions/fix_av.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lgsm/functions/fix_av.sh b/lgsm/functions/fix_av.sh index bf9ff2b4b..3edf7862b 100644 --- a/lgsm/functions/fix_av.sh +++ b/lgsm/functions/fix_av.sh @@ -10,7 +10,7 @@ export LD_LIBRARY_PATH="$LD_LIBRARY_PATH:${serverfiles}:${serverfiles}/linux64" if [ "${postinstall}" == "1" ]; then fn_parms(){ - parms="--datapath ${avdatapath} --galaxy-name ${avgalaxy} --init-folders-only" + parms="--datapath ${avdatapath} --galaxy-name ${selfname} --init-folders-only" } fn_print_information "starting ${gamename} server to generate configs." From dc70753ead2e47106cc19deeffc6d69428d5ead3 Mon Sep 17 00:00:00 2001 From: Jimmy Maple <38733055+jimmyatSplunk@users.noreply.github.com> Date: Wed, 17 Jun 2020 16:08:41 -0400 Subject: [PATCH 403/534] fix(query): query_gamedig.sh tuning for correct player count (#2913) * fix(bug): gamedig not using correct JSON object Command to output the results for player count was looking at the wrong object in the tree. This change corrects it to the right objects. * feat(monitor): Include bot count in monitor output Update to include bot count in monitor output from Gamedig. * fix(messages): Fix to set proper component logging Fixed issue where messages from different actions weren't logging correctly due to using the wrong variable in when crafting the log message * Confirm commit for changes made Commit changes made after pull change submiited. * fix(command_backup): Correct path for exludedir variable The current implementation doesn't use the full file path to determine the existence of the backup directory in relation to the server which means the current stats just looks for the "lgsm/backup" directory. That may work if you're already in the root directory for the server but if you're scripting the backups via cron, you're not likely going to be invoking the backup from the root directory. * fix: query_gamedig.sh tuning for correct player count Reworked the jq flags to produce a count of players based on the length of the original JSON key used. However, I've found that while things like TF2 will produce the proper value, the Minecraft plugin will have an extra user online that is empty. See example below: "players": [ { "id": "81eeda65-9002-4f0d-9d3f-b4872e2a2042", "name": "iamjack1221" }, {} ] * correct else * space Co-authored-by: Daniel Gibbs --- lgsm/functions/query_gamedig.sh | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/lgsm/functions/query_gamedig.sh b/lgsm/functions/query_gamedig.sh index 285cf0805..071645b49 100644 --- a/lgsm/functions/query_gamedig.sh +++ b/lgsm/functions/query_gamedig.sh @@ -22,7 +22,6 @@ if [ "$(command -v gamedig 2>/dev/null)" ]&&[ "$(command -v jq 2>/dev/null)" ]; gamedigcmd=$(echo -e "gamedig --type \"${querytype}\" --host \"${ip}\" --port \"${queryport}\"|jq") gamedigraw=$(gamedig --type "${querytype}" --host "${ip}" --port "${queryport}") querystatus=$(echo "${gamedigraw}" | jq '.error|length') - fi # server name. @@ -32,10 +31,14 @@ if [ "$(command -v gamedig 2>/dev/null)" ]&&[ "$(command -v jq 2>/dev/null)" ]; fi # numplayers. - gdplayers=$(echo "${gamedigraw}" | jq -re '.raw.vanilla.raw.players.online') + if [ "${querytype}" == "minecraft" ]; then + gdplayers=$(echo "${gamedigraw}" | jq -re '.players | length-1') + else + gdplayers=$(echo "${gamedigraw}" | jq -re '.players | length') + fi if [ "${gdplayers}" == "null" ]; then unset gdplayers - elif [ "${gdplayers}" == "[]" ]; then + elif [ "${gdplayers}" == "[]" ] || [ "${gdplayers}" == "-1" ]; then gdplayers=0 fi @@ -60,7 +63,7 @@ if [ "$(command -v gamedig 2>/dev/null)" ]&&[ "$(command -v jq 2>/dev/null)" ]; fi # numbots. - gdbots=$(echo "${gamedigraw}" | jq -re '.raw.numbots') + gdbots=$(echo "${gamedigraw}" | jq -re '.bots | length') if [ "${gdbots}" == "null" ]||[ "${gdbots}" == "0" ]; then unset gdbots fi From f2f8063b1179133868987fdc9c028e36d7e654ff Mon Sep 17 00:00:00 2001 From: ttocszed00 Date: Thu, 18 Jun 2020 07:19:27 +0900 Subject: [PATCH 404/534] feat(new server): Battlefield: Vietnam (#2909) --- .../config-lgsm/bfvserver/_default.cfg | 157 ++++++++++++++++++ lgsm/data/serverlist.csv | 1 + lgsm/functions/check_deps.sh | 6 + lgsm/functions/core_getopt.sh | 2 +- lgsm/functions/info_config.sh | 30 ++++ lgsm/functions/info_messages.sh | 12 ++ lgsm/functions/install_config.sh | 7 + lgsm/functions/install_server_files.sh | 2 + 8 files changed, 216 insertions(+), 1 deletion(-) create mode 100644 lgsm/config-default/config-lgsm/bfvserver/_default.cfg diff --git a/lgsm/config-default/config-lgsm/bfvserver/_default.cfg b/lgsm/config-default/config-lgsm/bfvserver/_default.cfg new file mode 100644 index 000000000..d0b7215c5 --- /dev/null +++ b/lgsm/config-default/config-lgsm/bfvserver/_default.cfg @@ -0,0 +1,157 @@ +################################## +######## Default Settings ######## +################################## +# DO NOT EDIT, ANY CHANGES 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. + +#### Game Server Settings #### + +## Server Start Command | https://docs.linuxgsm.com/configuration/start-parameters#additional-parameters +fn_parms(){ +parms="+statusMonitor 1" +} + +#### LinuxGSM Settings #### + +## LinuxGSM Stats +# Send useful stats to LinuxGSM developers. +# https://docs.linuxgsm.com/configuration/linuxgsm-stats +# (on|off) +stats="off" + +## Notification Alerts +# (on|off) + +# Display IP | https://docs.linuxgsm.com/alerts#display-ip +displayip="" + +# More info | https://docs.linuxgsm.com/alerts#more-info +postalert="off" +postdays="7" +posttarget="https://termbin.com" + +# Discord Alerts | https://docs.linuxgsm.com/alerts/discord +discordalert="off" +discordwebhook="webhook" + +# Email Alerts | https://docs.linuxgsm.com/alerts/email +emailalert="off" +email="email@example.com" +emailfrom="" + +# IFTTT Alerts | https://docs.linuxgsm.com/alerts/ifttt +iftttalert="off" +ifttttoken="accesstoken" +iftttevent="linuxgsm_alert" + +# Mailgun Email Alerts | https://docs.linuxgsm.com/alerts/mailgun +mailgunalert="off" +mailguntoken="accesstoken" +mailgundomain="example.com" +mailgunemailfrom="alert@example.com" +mailgunemail="email@myemail.com" + +# Pushbullet Alerts | https://docs.linuxgsm.com/alerts/pushbullet +pushbulletalert="off" +pushbullettoken="accesstoken" +channeltag="" + +# Pushover Alerts | https://docs.linuxgsm.com/alerts/pushover +pushoveralert="off" +pushovertoken="accesstoken" + +# Slack Alerts | https://docs.linuxgsm.com/alerts/slack +slackalert="off" +slackwebhook="webhook" + +# Telegram Alerts | https://docs.linuxgsm.com/alerts/telegram +# You can add a custom cURL string eg proxy (useful in Russia) or else in "curlcustomstring". +# like a "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help", if you not need +# any custom string in curl - simple ignore this parameter. +telegramalert="off" +telegramtoken="accesstoken" +telegramchatid="" +curlcustomstring="" + +## Updating | https://docs.linuxgsm.com/commands/update +updateonstart="off" + +## Backup | https://docs.linuxgsm.com/commands/backup +maxbackups="4" +maxbackupdays="30" +stoponbackup="on" + +## Logging | https://docs.linuxgsm.com/features/logging +consolelogging="on" +logdays="7" + +## Monitor | https://docs.linuxgsm.com/commands/monitor +# Query delay time +querydelay="1" + +## ANSI Colors | https://docs.linuxgsm.com/features/ansi-colors +ansi="on" + +#### Advanced Settings #### + +## Message Display Time | https://docs.linuxgsm.com/features/message-display-time +sleeptime="0.5" + +## Stop Mode | https://docs.linuxgsm.com/features/stop-mode +# 1: tmux kill +# 2: CTRL+c +# 3: quit +# 4: quit 120s +# 5: stop +# 6: q +# 7: exit +# 8: 7 Days to Die +# 9: GoldSrc +# 10: Avorion +stopmode="3" + +## Query mode +# 1: session only +# 2: gamedig + gsquery +# 3: gamedig +# 4: gsquery +# 5: tcp +querymode="1" +querytype="" + +## Game Server Details +# Do not edit +gamename="Battlefield: Vietnam" +engine="refractor" +glibc="2.2.4" + +#### Directories #### +# Edit with care + +## Game Server Directories +systemdir="${serverfiles}" +executabledir="${systemdir}" +executable="./start.sh" +servercfgdir="${systemdir}/mods/bfvietnam/settings" +servercfg="serversettings.con" +servercfgdefault="serversettings.con" +servercfgfullpath="${servercfgdir}/${servercfg}" + +## Backup Directory +backupdir="${lgsmdir}/backup" + +## Logging Directories +logdir="${rootdir}/log" +gamelogdir="${serverfiles}/mods/bfvietnam/logs" +lgsmlogdir="${logdir}/script" +consolelogdir="${logdir}/console" +lgsmlog="${lgsmlogdir}/${selfname}-script.log" +consolelog="${consolelogdir}/${selfname}-console.log" +alertlog="${lgsmlogdir}/${selfname}-alert.log" +postdetailslog="${lgsmlogdir}/${selfname}-postdetails.log" + +## Logs Naming +lgsmlogdate="${lgsmlogdir}/${selfname}-script-$(date '+%Y-%m-%d-%H:%M:%S').log" +consolelogdate="${consolelogdir}/${selfname}-console-$(date '+%Y-%m-%d-%H:%M:%S').log" diff --git a/lgsm/data/serverlist.csv b/lgsm/data/serverlist.csv index ac703ffe9..469ec6509 100644 --- a/lgsm/data/serverlist.csv +++ b/lgsm/data/serverlist.csv @@ -8,6 +8,7 @@ bb,bbserver,BrainBread bb2,bb2server,BrainBread 2 bd,bdserver,Base Defense bf1942,bf1942server,Battlefield 1942 +bfv,bfvserver,Battlefield: Vietnam bmdm,bmdmserver,Black Mesa: Deathmatch bo,boserver,Ballistic Overkill bs,bsserver,Blade Symphony diff --git a/lgsm/functions/check_deps.sh b/lgsm/functions/check_deps.sh index 52f651e1b..cb1720a20 100644 --- a/lgsm/functions/check_deps.sh +++ b/lgsm/functions/check_deps.sh @@ -368,6 +368,9 @@ fn_deps_build_debian(){ # 7 Days to Die elif [ "${shortname}" == "sdtd" ]; then array_deps_required+=( telnet expect ) + # Battlefield: Vietnam + elif [ "${shortname}" == "bfv" ]; then + array_deps_required+=( libncurses5:i386 libstdc++5:i386 ) # Battlefield 1942, Counter-Strike: Source, Garry's Mod, No More Room in Hell, Source Forts Classic, Zombie Master Reborn and Zombie Panic: Source elif [ "${shortname}" == "bf1942" ]||[ "${shortname}" == "css" ]||[ "${shortname}" == "gmod" ]||[ "${shortname}" == "nmrih" ]||[ "${shortname}" == "sfc" ]||[ "${shortname}" == "zmr" ]||[ "${shortname}" == "zps" ]; then if [ "${arch}" == "x86_64" ]; then @@ -480,6 +483,9 @@ fn_deps_build_redhat(){ # 7 Days to Die elif [ "${shortname}" == "sdtd" ]; then array_deps_required+=( telnet expect ) + # Battlefield: Vietnam + elif [ "${shortname}" == "bfv" ]; then + array_deps_required+=( compat-libstdc++-33.i686 glibc.i686 ) # Battlefield 1942, Counter-Strike: Source, Garry's Mod, No More Room in Hell, Source Forts Classic, Zombie Master Reborn and Zombie Panic: Source elif [ "${shortname}" == "bf1942" ]||[ "${shortname}" == "css" ]||[ "${shortname}" == "gmod" ]||[ "${shortname}" == "nmrih" ]||[ "${shortname}" == "sfc" ]||[ "${shortname}" == "zmr" ]||[ "${shortname}" == "zps" ]; then array_deps_required+=( ncurses-libs.i686 ) diff --git a/lgsm/functions/core_getopt.sh b/lgsm/functions/core_getopt.sh index 1ddc15ce2..fe31f488f 100644 --- a/lgsm/functions/core_getopt.sh +++ b/lgsm/functions/core_getopt.sh @@ -61,7 +61,7 @@ currentopt=( "${cmd_start[@]}" "${cmd_stop[@]}" "${cmd_restart[@]}" "${cmd_monit currentopt+=( "${cmd_update_linuxgsm[@]}" ) # Exclude noupdate games here. -if [ "${engine}" != "quake" ]&&[ "${engine}" != "idtech2" ]&&[ "${engine}" != "idtech3" ]&&[ "${engine}" != "iw2.0" ]&&[ "${engine}" != "iw3.0" ]&&[ "${shortname}" != "bf1942" ]&&[ "${shortname}" != "samp" ]; then +if [ "${engine}" != "quake" ]&&[ "${engine}" != "idtech2" ]&&[ "${engine}" != "idtech3" ]&&[ "${engine}" != "iw2.0" ]&&[ "${engine}" != "iw3.0" ]&&[ "${shortname}" != "bf1942" ]&&[ "${shortname}" != "bfv" ]&&[ "${shortname}" != "samp" ]; then currentopt+=( "${cmd_update[@]}" ) # force update for SteamCMD only or MTA. if [ "${appid}" ]||[ "${shortname}" == "mta" ]; then diff --git a/lgsm/functions/info_config.sh b/lgsm/functions/info_config.sh index 743c657e0..d16180027 100644 --- a/lgsm/functions/info_config.sh +++ b/lgsm/functions/info_config.sh @@ -199,6 +199,33 @@ fn_info_config_bf1942(){ fi } +fn_info_config_bfv(){ + if [ ! -f "${servercfgfullpath}" ]; then + servername="${unavailable}" + serverpassword="${unavailable}" + maxplayers="${zero}" + port="${zero}" + queryport="${zero}" + else + + servername=$(grep "game.serverName" "${servercfgfullpath}" | sed -e 's/^[ \t]*//g' -e '/^--/d' -e 's/game.serverName//g' | tr -d '=\";,:' | xargs) + serverpassword=$(grep "game.serverPassword" "${servercfgfullpath}" | sed -e 's/^ *//g' -e '/^--/d' -e 's/game.serverPassword//g' | tr -d '=\";,:' | xargs) + maxplayers=$(grep "game.serverMaxPlayers" "${servercfgfullpath}" | grep -v "\--" | tr -cd '[:digit:]') + port=$(grep "game.serverPort" "${servercfgfullpath}" | grep -v "\--" | tr -cd '[:digit:]') + queryport="23000" + + ip=$(grep "game.serverIP" "${servercfgfullpath}" | sed -e 's/^[ \t]*//g' -e '/^--/d' -e 's/game.serverIP//g' | tr -d '=\";,:' | xargs) + ipsetinconfig=1 + ipinconfigvar="game.serverIP" + + # Not Set + servername=${servername:-"NOT SET"} + serverpassword=${serverpassword:-"NOT SET"} + maxplayers=${maxplayers:-"0"} + port=${port:-"0"} + fi +} + fn_info_config_chivalry(){ if [ ! -f "${servercfgfullpath}" ]; then servername="${unavailable}" @@ -1472,6 +1499,9 @@ elif [ "${shortname}" == "bt1944" ]; then # Battlefield: 1942 elif [ "${shortname}" == "bf1942" ]; then fn_info_config_bf1942 +# Battlefield: Vietnam +elif [ "${shortname}" == "bfv" ]; then + fn_info_config_bfv # Chivalry: Medieval Warfare elif [ "${shortname}" == "cmw" ]; then fn_info_config_chivalry diff --git a/lgsm/functions/info_messages.sh b/lgsm/functions/info_messages.sh index eb0ed43cf..0f416b573 100644 --- a/lgsm/functions/info_messages.sh +++ b/lgsm/functions/info_messages.sh @@ -982,6 +982,16 @@ fn_info_message_bf1942(){ } | column -s $'\t' -t } +fn_info_message_bfv(){ + echo -e "netstat -atunp | grep bfv_linded" + echo -e "" + { + echo -e "${lightblue}DESCRIPTION\tDIRECTION\tPORT\tPROTOCOL${default}" + echo -e "> Game\tINBOUND\t${port}\tudp" + echo -e "> Query\tINBOUND\t${queryport}\tudp" + } | column -s $'\t' -t +} + fn_info_message_risingworld(){ echo -e "netstat -atunp | grep java" echo -e "" @@ -1492,6 +1502,8 @@ fn_info_message_select_engine(){ fn_info_message_mumble elif [ "${shortname}" == "bf1942" ]; then fn_info_message_bf1942 + elif [ "${shortname}" == "bfv" ]; then + fn_info_message_bfv elif [ "${shortname}" == "rtcw" ]; then fn_info_message_rtcw elif [ "${shortname}" == "rust" ]; then diff --git a/lgsm/functions/install_config.sh b/lgsm/functions/install_config.sh index ced111afb..066ecc6d3 100644 --- a/lgsm/functions/install_config.sh +++ b/lgsm/functions/install_config.sh @@ -239,6 +239,13 @@ elif [ "${shortname}" == "bf1942" ]; then fn_default_config_remote fn_set_config_vars fn_list_config_locations +elif [ "${shortname}" == "bfv" ]; then + gamedirname="BattlefieldVietnam" + array_configs+=( serversettings.con ) + fn_fetch_default_config + fn_default_config_remote + fn_set_config_vars + fn_list_config_locations elif [ "${shortname}" == "bs" ]; then gamedirname="BladeSymphony" array_configs+=( server.cfg ) diff --git a/lgsm/functions/install_server_files.sh b/lgsm/functions/install_server_files.sh index 9593401ce..a7b9c544c 100644 --- a/lgsm/functions/install_server_files.sh +++ b/lgsm/functions/install_server_files.sh @@ -11,6 +11,8 @@ fn_install_server_files(){ remote_fileurl="http://linuxgsm.download/ActionHalfLife/action_halflife-1.0.tar.xz"; local_filedir="${tmpdir}"; local_filename="action_halflife-1.0.tar.xz"; chmodx="nochmodx" run="norun"; force="noforce"; md5="61d7b79fd714888b6d65944fdaafa94a" elif [ "${shortname}" == "bf1942" ]; then remote_fileurl="http://linuxgsm.download/BattleField1942/bf1942_lnxded-1.61-hacked-to-1.612.full.tar.xz"; local_filedir="${tmpdir}"; local_filename="bf1942_lnxded-1.61-hacked-to-1.612.full.tar.xz"; chmodx="nochmodx" run="norun"; force="noforce"; md5="4223bf4ed85f5162c24b2cba51249b9e" + elif [ "${shortname}" == "bfv" ];then + remote_fileurl="http://linuxgsm.download/BattlefieldVietnam/bfv_linded-v1.21-20041207_patch.tar.xz"; local_filedir="${tmpdir}"; local_filename="bfv_linded-v1.21-20041207_patch.tar.xz"; chmodx="nochmodx" run="norun"; force="noforce"; md5="e3b4962cdd9d41e23c6fed65101bccde" elif [ "${shortname}" == "bb" ]; then remote_fileurl="http://linuxgsm.download/BrainBread/brainbread-v1.2-linuxserver.tar.xz"; local_filedir="${tmpdir}"; local_filename="brainbread-v1.2-linuxserver.tar.xz"; chmodx="nochmodx" run="norun"; force="noforce"; md5="55f227183b736397806d5b6db6143f15" elif [ "${shortname}" == "cod" ]; then From 555030384737eaddb8b1a7f509c971c6dabf1872 Mon Sep 17 00:00:00 2001 From: ttocszed00 Date: Thu, 18 Jun 2020 18:48:47 +0900 Subject: [PATCH 405/534] feat(newserver): Memories of Mars (#2911) --- .../config-lgsm/momserver/_default.cfg | 171 ++++++++++++++++++ lgsm/data/serverlist.csv | 1 + lgsm/functions/info_config.sh | 17 ++ lgsm/functions/info_messages.sh | 12 ++ lgsm/functions/info_parms.sh | 8 + lgsm/functions/install_config.sh | 7 + 6 files changed, 216 insertions(+) create mode 100644 lgsm/config-default/config-lgsm/momserver/_default.cfg diff --git a/lgsm/config-default/config-lgsm/momserver/_default.cfg b/lgsm/config-default/config-lgsm/momserver/_default.cfg new file mode 100644 index 000000000..7e89d5b9f --- /dev/null +++ b/lgsm/config-default/config-lgsm/momserver/_default.cfg @@ -0,0 +1,171 @@ +################################## +######## Default Settings ######## +################################## +# DO NOT EDIT, ANY CHANGES 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. + +#### Game Server Settings #### + +## Server Start Settings | https://docs.linuxgsm.com/configuration/start-parameters +ip="0.0.0.0" +port="7777" +beaconport="15000" +maxplayers="32" + +## Server Start Command | https://docs.linuxgsm.com/configuration/start-parameters#additional-parameters +fn_parms(){ +parms="-port=${port} -beaconport=${beaconport} -MULTIHOME="${ip}" -maxplayers=${maxplayers}" +} + +#### LinuxGSM Settings #### + +## LinuxGSM Stats +# Send useful stats to LinuxGSM developers. +# https://docs.linuxgsm.com/configuration/linuxgsm-stats +# (on|off) +stats="off" + +## Notification Alerts +# (on|off) + +# Display IP | https://docs.linuxgsm.com/alerts#display-ip +displayip="" + +# More info | https://docs.linuxgsm.com/alerts#more-info +postalert="off" +postdays="7" +posttarget="https://termbin.com" + +# Discord Alerts | https://docs.linuxgsm.com/alerts/discord +discordalert="off" +discordwebhook="webhook" + +# Email Alerts | https://docs.linuxgsm.com/alerts/email +emailalert="off" +email="email@example.com" +emailfrom="" + +# IFTTT Alerts | https://docs.linuxgsm.com/alerts/ifttt +iftttalert="off" +ifttttoken="accesstoken" +iftttevent="linuxgsm_alert" + +# Mailgun Email Alerts | https://docs.linuxgsm.com/alerts/mailgun +mailgunalert="off" +mailguntoken="accesstoken" +mailgundomain="example.com" +mailgunemailfrom="alert@example.com" +mailgunemail="email@myemail.com" + +# Pushbullet Alerts | https://docs.linuxgsm.com/alerts/pushbullet +pushbulletalert="off" +pushbullettoken="accesstoken" +channeltag="" + +# Pushover Alerts | https://docs.linuxgsm.com/alerts/pushover +pushoveralert="off" +pushovertoken="accesstoken" + +# Slack Alerts | https://docs.linuxgsm.com/alerts/slack +slackalert="off" +slackwebhook="webhook" + +# Telegram Alerts | https://docs.linuxgsm.com/alerts/telegram +# You can add a custom cURL string eg proxy (useful in Russia) or else in "curlcustomstring". +# like a "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help", if you not need +# any custom string in curl - simple ignore this parameter. +telegramalert="off" +telegramtoken="accesstoken" +telegramchatid="" +curlcustomstring="" + +## Updating | https://docs.linuxgsm.com/commands/update +updateonstart="off" + +## Backup | https://docs.linuxgsm.com/commands/backup +maxbackups="4" +maxbackupdays="30" +stoponbackup="on" + +## Logging | https://docs.linuxgsm.com/features/logging +consolelogging="on" +logdays="7" + +## Monitor | https://docs.linuxgsm.com/commands/monitor +# Query delay time +querydelay="1" + +## ANSI Colors | https://docs.linuxgsm.com/features/ansi-colors +ansi="on" + +#### Advanced Settings #### + +## Message Display Time | https://docs.linuxgsm.com/features/message-display-time +sleeptime="0.5" + +## SteamCMD Settings | https://docs.linuxgsm.com/steamcmd +# Server appid +appid="897590" +# SteamCMD Branch | https://docs.linuxgsm.com/steamcmd/branch +branch="" +# Master Server | https://docs.linuxgsm.com/steamcmd/steam-master-server +steammaster="false" + +## Stop Mode | https://docs.linuxgsm.com/features/stop-mode +# 1: tmux kill +# 2: CTRL+c +# 3: quit +# 4: quit 120s +# 5: stop +# 6: q +# 7: exit +# 8: 7 Days to Die +# 9: GoldSrc +# 10: Avorion +stopmode="2" + +## Query mode +# 1: session only +# 2: gamedig + gsquery +# 3: gamedig +# 4: gsquery +# 5: tcp +querymode="1" +querytype="" + +## Game Server Details +# Do not edit +gamename="Memories of Mars" +engine="unreal4" +glibc="2.17" + +#### Directories #### +# Edit with care + +## Game Server Directories +systemdir="${serverfiles}/Game" +executabledir="${systemdir}/Binaries/Linux" +executable="./MemoriesOfMarsServer" +servercfgdir="${serverfiles}" +servercfg="DedicatedServerConfig.cfg" +servercfgdefault="DedicatedServerConfig.cfg" +servercfgfullpath="${servercfgdir}/${servercfg}" + +## Backup Directory +backupdir="${lgsmdir}/backup" + +## Logging Directories +logdir="${rootdir}/log" +gamelogdir="${serverfiles}/Game/Saved/Logs" +lgsmlogdir="${logdir}/script" +consolelogdir="${logdir}/console" +lgsmlog="${lgsmlogdir}/${selfname}-script.log" +consolelog="${consolelogdir}/${selfname}-console.log" +alertlog="${lgsmlogdir}/${selfname}-alert.log" +postdetailslog="${lgsmlogdir}/${selfname}-postdetails.log" + +## Logs Naming +lgsmlogdate="${lgsmlogdir}/${selfname}-script-$(date '+%Y-%m-%d-%H:%M:%S').log" +consolelogdate="${consolelogdir}/${selfname}-console-$(date '+%Y-%m-%d-%H:%M:%S').log" diff --git a/lgsm/data/serverlist.csv b/lgsm/data/serverlist.csv index 469ec6509..f294906bb 100644 --- a/lgsm/data/serverlist.csv +++ b/lgsm/data/serverlist.csv @@ -56,6 +56,7 @@ mc,mcserver,Minecraft mcb,mcbserver,Minecraft Bedrock mh,mhserver,MORDHAU mohaa,mohaaserver,Medal of Honor: Allied Assault +mom,momserver,Memories of Mars mta,mtaserver,Multi Theft Auto mumble,mumbleserver,Mumble nd,ndserver,Nuclear Dawn diff --git a/lgsm/functions/info_config.sh b/lgsm/functions/info_config.sh index d16180027..1e9992db6 100644 --- a/lgsm/functions/info_config.sh +++ b/lgsm/functions/info_config.sh @@ -484,6 +484,20 @@ fn_info_config_minecraft_bedrock(){ fi } +fn_info_config_mofm(){ + if [ ! -f "${servercfgfullpath}" ]; then + servername="${unavailable}" + serverpassword="${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 "ServerPassword" "${servercfgfullpath}" | sed -e 's/^ *//g' -e '/^--/d' -e 's/ServerPassword//g' | tr -d '=\";,:' | sed -e 's/^[ \t]*//' -e 's/[ \t]*$//') + + # Not Set + servername=${servername:-"NOT SET"} + serverpassword=${serverpassword:-"NOT SET"} + fi +} + fn_info_config_onset(){ if [ ! -f "${servercfgfullpath}" ]; then servername="${unavailable}" @@ -1541,6 +1555,9 @@ elif [ "${shortname}" == "kf2" ]; then # Medal of Honor: Allied Assault elif [ "${shortname}" == "mohaa" ]; then fn_info_config_mohaa +# Memories of Mars +elif [ "${shortname}" == "mofm" ]; then + fn_info_config_mofm # QuakeWorld elif [ "${shortname}" == "qw" ]; then fn_info_config_quakeworld diff --git a/lgsm/functions/info_messages.sh b/lgsm/functions/info_messages.sh index 0f416b573..843dc26a1 100644 --- a/lgsm/functions/info_messages.sh +++ b/lgsm/functions/info_messages.sh @@ -871,6 +871,16 @@ fn_info_message_mohaa(){ } | column -s $'\t' -t } +fn_info_message_mom(){ + echo -e "netstat -atunp | grep MemoriesOfMar" + echo -e "" + { + echo -e "${lightblue}DESCRIPTION\tDIRECTION\tPORT\tPROTOCOL${default}" + echo -e "> Game\tINBOUND\t${port}\tudp" + echo -e "> BeaconPort\tINBOUND\t${beaconport}\tudp" + } | column -s $'\t' -t +} + fn_info_message_mumble(){ echo -e "netstat -atunp | grep murmur" echo -e "" @@ -1446,6 +1456,8 @@ fn_info_message_select_engine(){ fn_info_message_minecraft_bedrock elif [ "${shortname}" == "onset" ]; then fn_info_message_onset + elif [ "${shortname}" == "mom" ]; then + fn_info_message_mom elif [ "${shortname}" == "pz" ]; then fn_info_message_projectzomboid elif [ "${shortname}" == "pstbs" ]; then diff --git a/lgsm/functions/info_parms.sh b/lgsm/functions/info_parms.sh index 1a6a42bb8..f30d90020 100644 --- a/lgsm/functions/info_parms.sh +++ b/lgsm/functions/info_parms.sh @@ -85,6 +85,11 @@ fn_info_parms_mohaa(){ defaultmap=${defaultmap:-"NOT SET"} } +fn_info_parms_mom(){ + port=${port:-"7777"} + beaconport=${queryport:-"15000"} +} + fn_info_parms_mta(){ queryport=$((port + 123)) } @@ -245,6 +250,9 @@ elif [ "${shortname}" == "kf2" ]; then fn_info_parms_kf2 elif [ "${shortname}" == "mohaa" ]; then fn_info_parms_mohaa +#Memories of Mars +elif [ "${shortname}" == "mom" ]; then + fn_info_parms_mom # Project Zomboid elif [ "${shortname}" == "pz" ]; then fn_info_parms_projectzomboid diff --git a/lgsm/functions/install_config.sh b/lgsm/functions/install_config.sh index 066ecc6d3..e57b2daac 100644 --- a/lgsm/functions/install_config.sh +++ b/lgsm/functions/install_config.sh @@ -570,6 +570,13 @@ elif [ "${shortname}" == "mta" ]; then fn_fetch_default_config fn_default_config_remote fn_list_config_locations +elif [ "${shotname}" == "mom" ];then + gamedirname="MemoriesofMars" + array_configs+=( DedicatedServerConfig.cfg) + fn_fetch_default_config + fn_default_config_remote + fn_set_config_vars + fn_list_config_locations elif [ "${shortname}" == "mumble" ]; then gamedirname="Mumble" array_configs+=( murmur.ini ) From a40bdf3b8064240ac3e185b3c450b77ef9e7a21a Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Thu, 18 Jun 2020 21:36:35 +0100 Subject: [PATCH 406/534] fix(bf1942server): alter query type to protocol-gamespy1 (#2932) --- lgsm/config-default/config-lgsm/bf1942server/_default.cfg | 2 +- lgsm/functions/info_config.sh | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/lgsm/config-default/config-lgsm/bf1942server/_default.cfg b/lgsm/config-default/config-lgsm/bf1942server/_default.cfg index ebb977a92..04bcef9b3 100644 --- a/lgsm/config-default/config-lgsm/bf1942server/_default.cfg +++ b/lgsm/config-default/config-lgsm/bf1942server/_default.cfg @@ -119,7 +119,7 @@ stopmode="2" # 4: gsquery # 5: tcp querymode="2" -querytype="protocol-valve" +querytype="protocol-gamespy1" ## Game Server Details # Do not edit diff --git a/lgsm/functions/info_config.sh b/lgsm/functions/info_config.sh index 1e9992db6..a59f96d79 100644 --- a/lgsm/functions/info_config.sh +++ b/lgsm/functions/info_config.sh @@ -181,7 +181,7 @@ fn_info_config_bf1942(){ queryport="${zero}" else - servername=$(grep "game.serverName " "${servercfgfullpath}" | sed -e 's/^[ \t]*//g' -e '/^--/d' -e 's/game.serverName //g' | tr -d '=\";,:' | xargs) + servername=$(grep "game.serverName" "${servercfgfullpath}" | sed -e 's/^[ \t]*//g' -e '/^--/d' -e 's/game.serverName //g' | tr -d '=\";,:' | xargs) serverpassword=$(grep "game.serverPassword" "${servercfgfullpath}" | sed -e 's/^ *//g' -e '/^--/d' -e 's/game.serverPassword//g' | tr -d '=\";,:' | xargs) maxplayers=$(grep "game.serverMaxPlayers" "${servercfgfullpath}" | grep -v "\--" | tr -cd '[:digit:]') port=$(grep "game.serverPort" "${servercfgfullpath}" | grep -v "\--" | tr -cd '[:digit:]') From dcbe35b23c2acd8b70e2338d39b4b07d46a08a4e Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Mon, 22 Jun 2020 08:45:46 +0100 Subject: [PATCH 407/534] Remove Patreon Link --- .github/FUNDING.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/FUNDING.yml b/.github/FUNDING.yml index 357dfdf6e..5712ac3e7 100644 --- a/.github/FUNDING.yml +++ b/.github/FUNDING.yml @@ -1,7 +1,7 @@ # These are supported funding model platforms github: dgibbs64 # Replace with up to 4 GitHub Sponsors-enabled usernames e.g., [user1, user2] -patreon: dgibbs # Replace with a single Patreon username +patreon: # Replace with a single Patreon username open_collective: # Replace with a single Open Collective username ko_fi: # Replace with a single Ko-fi username tidelift: # Replace with a single Tidelift platform-name/package-name e.g., npm/babel From 276419fff52d196d39d522b78311e3689f7dfd82 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Fri, 3 Jul 2020 22:19:15 +0100 Subject: [PATCH 408/534] feat(arkserver): add support for epic store players. (#2947) --- lgsm/config-default/config-lgsm/arkserver/_default.cfg | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lgsm/config-default/config-lgsm/arkserver/_default.cfg b/lgsm/config-default/config-lgsm/arkserver/_default.cfg index a657d6273..f7c3ad573 100644 --- a/lgsm/config-default/config-lgsm/arkserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/arkserver/_default.cfg @@ -19,7 +19,7 @@ maxplayers="70" ## Server Start Command | https://docs.linuxgsm.com/configuration/start-parameters#additional-parameters fn_parms(){ -parms="\"${defaultmap}?AltSaveDirectoryName=${defaultmap}?listen?MultiHome=${ip}?MaxPlayers=${maxplayers}?QueryPort=${queryport}?RCONPort=${rconport}?Port=${port} -automanagedmods\"" +parms="${defaultmap}?AltSaveDirectoryName=${defaultmap}?listen?MultiHome=${ip}?MaxPlayers=${maxplayers}?QueryPort=${queryport}?RCONPort=${rconport}?Port=${port} -automanagedmods -crossplay -PublicIPForEpic=${ip}" } #### LinuxGSM Settings #### From af4e07e9d41a39495916003d472d4ede2e31c43d Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Sat, 4 Jul 2020 16:20:17 +0100 Subject: [PATCH 409/534] feat(arkserver): add altsavedirectoryname to allow custom save location (#2948) --- lgsm/config-default/config-lgsm/arkserver/_default.cfg | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/lgsm/config-default/config-lgsm/arkserver/_default.cfg b/lgsm/config-default/config-lgsm/arkserver/_default.cfg index f7c3ad573..11f29d17b 100644 --- a/lgsm/config-default/config-lgsm/arkserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/arkserver/_default.cfg @@ -15,11 +15,12 @@ queryport="27015" rconport="27020" # Default Map: TheIsland, Ragnarok, CrystalIsles, Aberration_P, ScorchedEarth_P defaultmap="TheIsland" +altsavedirectoryname="${defaultmap}" maxplayers="70" ## Server Start Command | https://docs.linuxgsm.com/configuration/start-parameters#additional-parameters fn_parms(){ -parms="${defaultmap}?AltSaveDirectoryName=${defaultmap}?listen?MultiHome=${ip}?MaxPlayers=${maxplayers}?QueryPort=${queryport}?RCONPort=${rconport}?Port=${port} -automanagedmods -crossplay -PublicIPForEpic=${ip}" +parms="${defaultmap}?AltSaveDirectoryName=${altsavedirectoryname}?listen?MultiHome=${ip}?MaxPlayers=${maxplayers}?QueryPort=${queryport}?RCONPort=${rconport}?Port=${port} -automanagedmods -crossplay -PublicIPForEpic=${ip}" } #### LinuxGSM Settings #### From bf4eb65ab3081304b5926a26389e2f3b69ffa9d6 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Sat, 4 Jul 2020 17:23:16 +0100 Subject: [PATCH 410/534] comment update --- 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 cb1720a20..c7d0ed06f 100644 --- a/lgsm/functions/check_deps.sh +++ b/lgsm/functions/check_deps.sh @@ -339,7 +339,7 @@ fn_deps_build_debian(){ # LinuxGSM requirements. array_deps_required=( curl wget ca-certificates file bsdmainutils util-linux python3 tar bzip2 gzip unzip binutils bc jq tmux netcat ) - # All servers except ts3, mumble, GTA and minecraft servers require libstdc++6 and lib32gcc1. + # All servers except ts3, mumble, GTA and minecraft servers require lib32stdc++6 and lib32gcc1. if [ "${shortname}" != "ts3" ]&&[ "${shortname}" != "mumble" ]&&[ "${shortname}" != "mc" ]&&[ "${engine}" != "renderware" ]; then if [ "${arch}" == "x86_64" ]; then array_deps_required+=( lib32gcc1 lib32stdc++6 ) @@ -370,7 +370,7 @@ fn_deps_build_debian(){ array_deps_required+=( telnet expect ) # Battlefield: Vietnam elif [ "${shortname}" == "bfv" ]; then - array_deps_required+=( libncurses5:i386 libstdc++5:i386 ) + array_deps_required+=( libncurses5:i386 libstdc++5:i386 ) # Battlefield 1942, Counter-Strike: Source, Garry's Mod, No More Room in Hell, Source Forts Classic, Zombie Master Reborn and Zombie Panic: Source elif [ "${shortname}" == "bf1942" ]||[ "${shortname}" == "css" ]||[ "${shortname}" == "gmod" ]||[ "${shortname}" == "nmrih" ]||[ "${shortname}" == "sfc" ]||[ "${shortname}" == "zmr" ]||[ "${shortname}" == "zps" ]; then if [ "${arch}" == "x86_64" ]; then @@ -485,7 +485,7 @@ fn_deps_build_redhat(){ array_deps_required+=( telnet expect ) # Battlefield: Vietnam elif [ "${shortname}" == "bfv" ]; then - array_deps_required+=( compat-libstdc++-33.i686 glibc.i686 ) + array_deps_required+=( compat-libstdc++-33.i686 glibc.i686 ) # Battlefield 1942, Counter-Strike: Source, Garry's Mod, No More Room in Hell, Source Forts Classic, Zombie Master Reborn and Zombie Panic: Source elif [ "${shortname}" == "bf1942" ]||[ "${shortname}" == "css" ]||[ "${shortname}" == "gmod" ]||[ "${shortname}" == "nmrih" ]||[ "${shortname}" == "sfc" ]||[ "${shortname}" == "zmr" ]||[ "${shortname}" == "zps" ]; then array_deps_required+=( ncurses-libs.i686 ) From 7208626e878f6279164521b6b52d34dffbb9f2be Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Sun, 5 Jul 2020 15:30:28 +0100 Subject: [PATCH 411/534] fix(tf2server): remove libtcmalloc-minimal4:i386 and gperftools-libs.i686 (#2950) --- lgsm/functions/check_deps.sh | 6 ------ 1 file changed, 6 deletions(-) diff --git a/lgsm/functions/check_deps.sh b/lgsm/functions/check_deps.sh index c7d0ed06f..9c6481803 100644 --- a/lgsm/functions/check_deps.sh +++ b/lgsm/functions/check_deps.sh @@ -381,9 +381,6 @@ fn_deps_build_debian(){ # Brainbread 2, Don't Starve Together & Team Fortress 2 elif [ "${shortname}" == "bb2" ]||[ "${shortname}" == "dst" ]||[ "${shortname}" == "tf2" ]; then array_deps_required+=( libcurl4-gnutls-dev:i386 ) - if [ "${shortname}" == "tf2" ]; then - array_deps_required+=( libtcmalloc-minimal4:i386 ) - fi # Call of Duty & Medal of Honor: Allied Assault elif [ "${shortname}" == "cod" ]||[ "${shortname}" == "coduo" ]||[ "${shortname}" == "cod2" ]||[ "${shortname}" == "mohaa" ]; then array_deps_required+=( libstdc++5:i386 ) @@ -492,9 +489,6 @@ fn_deps_build_redhat(){ # Brainbread 2, Don't Starve Together & Team Fortress 2 elif [ "${shortname}" == "bb2" ]||[ "${shortname}" == "dst" ]||[ "${shortname}" == "tf2" ]; then array_deps_required+=( libcurl.i686 ) - if [ "${shortname}" == "tf2" ]; then - array_deps_required+=( gperftools-libs.i686 ) - fi # Call of Duty & Medal of Honor: Allied Assault elif [ "${shortname}" == "cod" ]||[ "${shortname}" == "coduo" ]||[ "${shortname}" == "cod2" ]||[ "${shortname}" == "mohaa" ]; then array_deps_required+=( compat-libstdc++-33.i686 ) From f6a907054f8c612514f228ecdf90622d23d08a3b Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Sun, 5 Jul 2020 22:12:40 +0100 Subject: [PATCH 412/534] feat(ut2k4server): update release to 3369.3 (#2952) --- 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 a7b9c544c..ec5c60989 100644 --- a/lgsm/functions/install_server_files.sh +++ b/lgsm/functions/install_server_files.sh @@ -48,7 +48,7 @@ fn_install_server_files(){ elif [ "${shortname}" == "ts" ]; then remote_fileurl="http://linuxgsm.download/TheSpecialists/ts-3-linux-final.tar.xz"; local_filedir="${tmpdir}"; local_filename="ts-3-linux-final.tar.xz"; chmodx="nochmodx" run="norun"; force="noforce"; md5="3c66ecff6e3644f7ac88015732a0fb93" elif [ "${shortname}" == "ut2k4" ]; then - remote_fileurl="http://linuxgsm.download/UnrealTournament2004/ut2004-server-3369-2-ultimate-linux.tar.xz"; local_filedir="${tmpdir}"; local_filename="ut2004-server-3369-2-ultimate-linux.tar.xz"; chmodx="nochmodx" run="norun"; force="noforce"; md5="8ebcb9b8f703905053d13a35c3af3e79" + remote_fileurl="http://linuxgsm.download/UnrealTournament2004/ut2004-server-3369-3-ultimate-linux.tar.xz"; local_filedir="${tmpdir}"; local_filename="ut2004-server-3369-3-ultimate-linux.tar.xz"; chmodx="nochmodx" run="norun"; force="noforce"; md5="9fceaab68554749f4b45be66613b9a15" elif [ "${shortname}" == "ut99" ]; then remote_fileurl="http://linuxgsm.download/UnrealTournament99/ut99-server-451-ultimate-linux.tar.xz"; local_filedir="${tmpdir}"; local_filename="ut99-server-451-ultimate-linux.tar.xz"; chmodx="nochmodx" run="norun"; force="noforce"; md5="42c6839f8cb95907eeef71a1838aa1f7" elif [ "${shortname}" == "ut" ]; then From 1d57607a3f53c5cfd1df2f18c63692382dde578a Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Sun, 5 Jul 2020 22:13:13 +0100 Subject: [PATCH 413/534] fix(debian 11): change name of lib32gcc1 to lib32gcc-s1 for debian 11 (#2951) --- lgsm/functions/check_deps.sh | 18 +++++++++++++++--- 1 file changed, 15 insertions(+), 3 deletions(-) diff --git a/lgsm/functions/check_deps.sh b/lgsm/functions/check_deps.sh index 9c6481803..17a2c4ada 100644 --- a/lgsm/functions/check_deps.sh +++ b/lgsm/functions/check_deps.sh @@ -184,8 +184,15 @@ if [ "${javacheck}" == "1" ]; then fi # Define required dependencies for SteamCMD. if [ "${appid}" ]; then - if [ "${deptocheck}" == "glibc.i686" ]||[ "${deptocheck}" == "libstdc++64.i686" ]||[ "${deptocheck}" == "lib32gcc1" ]||[ "${deptocheck}" == "lib32stdc++6" ]; then - steamcmdfail=1 + # lib32gcc1 is now called lib32gcc-s1 in debian 11 + if [ "${distroid}" == "debian" ]&&[ "${distroversion}" == "11" ]; then + if [ "${deptocheck}" == "glibc.i686" ]||[ "${deptocheck}" == "libstdc++64.i686" ]||[ "${deptocheck}" == "lib32gcc-s1" ]||[ "${deptocheck}" == "lib32stdc++6" ]; then + steamcmdfail=1 + fi + else + if [ "${deptocheck}" == "glibc.i686" ]||[ "${deptocheck}" == "libstdc++64.i686" ]||[ "${deptocheck}" == "lib32gcc1" ]||[ "${deptocheck}" == "lib32stdc++6" ]; then + steamcmdfail=1 + fi fi fi fi @@ -342,7 +349,12 @@ fn_deps_build_debian(){ # All servers except ts3, mumble, GTA and minecraft servers require lib32stdc++6 and lib32gcc1. if [ "${shortname}" != "ts3" ]&&[ "${shortname}" != "mumble" ]&&[ "${shortname}" != "mc" ]&&[ "${engine}" != "renderware" ]; then if [ "${arch}" == "x86_64" ]; then - array_deps_required+=( lib32gcc1 lib32stdc++6 ) + # lib32gcc1 is now called lib32gcc-s1 in debian 11 + if [ "${distroid}" == "debian" ]&&[ "${distroversion}" == "11" ]; then + array_deps_required+=( lib32gcc-s1 lib32stdc++6 ) + else + array_deps_required+=( lib32gcc1 lib32stdc++6 ) + fi else array_deps_required+=( lib32stdc++6 ) fi From 8462086922d570f8f19997330b366b2cfbe78291 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Wed, 8 Jul 2020 21:42:16 +0100 Subject: [PATCH 414/534] fix(info): gather external ip from ipify.org instead of ifconfig.co (#2953) --- lgsm/functions/info_distro.sh | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/lgsm/functions/info_distro.sh b/lgsm/functions/info_distro.sh index 1e2a519f4..c50953cdc 100644 --- a/lgsm/functions/info_distro.sh +++ b/lgsm/functions/info_distro.sh @@ -228,7 +228,7 @@ netlink=$(ethtool "${netint}" 2>/dev/null| grep Speed | awk '{print $2}') # External IP address if [ -z "${extip}" ]; then - extip=$(curl -4 -m 3 ifconfig.co 2>/dev/null) + extip=$(curl -s https://api.ipify.org 2>/dev/null) exitcode=$? # Should ifconfig.co return an error will use last known IP. if [ ${exitcode} -eq 0 ]; then @@ -238,14 +238,14 @@ if [ -z "${extip}" ]; then if [ -f "${tmpdir}/extip.txt" ]; then extip=$(cat "${tmpdir}/extip.txt") else - echo -e "x.x.x.x" + fn_print_error_nl "Unable to get external IP" fi fi else if [ -f "${tmpdir}/extip.txt" ]; then extip=$(cat "${tmpdir}/extip.txt") else - echo -e "x.x.x.x" + fn_print_error_nl "Unable to get external IP" fi fi fi From a41f38801ebbf66dc68c6b1a3de12e3d8057b305 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Wed, 8 Jul 2020 21:49:29 +0100 Subject: [PATCH 415/534] fix: hard lock reference (#2956) --- lgsm/functions/command_monitor.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lgsm/functions/command_monitor.sh b/lgsm/functions/command_monitor.sh index 3a333a578..691fd5f7c 100644 --- a/lgsm/functions/command_monitor.sh +++ b/lgsm/functions/command_monitor.sh @@ -107,7 +107,7 @@ for queryattempt in {1..5}; do fn_print_delay_eol_nl fn_script_log_info "Querying port: ${querymethod}: ${ip}:${queryport} : ${queryattempt} : DELAY" fn_script_log_info "Query bypassed: ${gameservername} started less than ${querydelay} minutes ago" - fn_script_log_info "Server started: $(date -d @$(cat lgsm/lock/bmdmserver.lock))" + fn_script_log_info "Server started: $(date -d @$(cat "${lockdir}/${selfname}.lock"))" fn_script_log_info "Current time: $(date)" monitorpass=1 core_exit.sh From c94b8fac754a2ae8daac075219b04e2215416fa8 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Thu, 9 Jul 2020 09:58:05 +0100 Subject: [PATCH 416/534] Update no-response.yml --- .github/no-response.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/no-response.yml b/.github/no-response.yml index 34cf8d447..432ff0cd1 100644 --- a/.github/no-response.yml +++ b/.github/no-response.yml @@ -3,8 +3,8 @@ # Number of days of inactivity before an Issue is closed for lack of response daysUntilClose: 60 # Label requiring a response -responseRequiredLabel: "needs more info" +responseRequiredLabel: "status: waiting response" # Comment to post when closing an Issue for lack of response. Set to `false` to disable closeComment: > This issue has been automatically closed because there has been no response - to this issue and is now stale. \ No newline at end of file + to this issue and is now stale. From 8316d878531c35f2f96d6e1697ae21944916aaa5 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Sun, 12 Jul 2020 23:16:22 +0100 Subject: [PATCH 417/534] fix(log): allow logs to correctly display primary command (#2958) --- lgsm/functions/alert.sh | 1 + lgsm/functions/check_last_update.sh | 1 + lgsm/functions/check_steamcmd.sh | 2 +- lgsm/functions/check_version.sh | 1 + lgsm/functions/command_backup.sh | 38 +- lgsm/functions/command_console.sh | 10 +- lgsm/functions/command_debug.sh | 10 +- lgsm/functions/command_details.sh | 9 +- lgsm/functions/command_dev_clear_functions.sh | 9 +- lgsm/functions/command_dev_debug.sh | 9 +- lgsm/functions/command_dev_detect_deps.sh | 9 +- lgsm/functions/command_dev_detect_glibc.sh | 9 +- lgsm/functions/command_dev_detect_ldd.sh | 9 +- lgsm/functions/command_dev_query_raw.sh | 9 +- lgsm/functions/command_donate.sh | 9 +- lgsm/functions/command_fastdl.sh | 31 +- lgsm/functions/command_install.sh | 10 +- .../command_install_resources_mta.sh | 9 +- lgsm/functions/command_mods_install.sh | 9 +- lgsm/functions/command_mods_remove.sh | 18 +- lgsm/functions/command_mods_update.sh | 9 +- lgsm/functions/command_monitor.sh | 10 +- lgsm/functions/command_postdetails.sh | 9 +- lgsm/functions/command_restart.sh | 11 +- lgsm/functions/command_start.sh | 12 +- lgsm/functions/command_stop.sh | 9 +- lgsm/functions/command_test_alert.sh | 9 +- lgsm/functions/command_ts3_server_pass.sh | 13 +- lgsm/functions/command_update.sh | 9 +- lgsm/functions/command_update_linuxgsm.sh | 9 +- lgsm/functions/command_validate.sh | 39 +- lgsm/functions/command_wipe.sh | 339 +++++++++--------- lgsm/functions/compress_unreal2_maps.sh | 9 +- lgsm/functions/compress_ut99_maps.sh | 9 +- lgsm/functions/core_dl.sh | 6 +- lgsm/functions/fix_kf.sh | 4 + lgsm/functions/fix_kf2.sh | 2 + lgsm/functions/fix_ro.sh | 4 + lgsm/functions/fix_ut2k4.sh | 4 + lgsm/functions/fix_ut3.sh | 2 + lgsm/functions/fix_wurm.sh | 2 + lgsm/functions/info_messages.sh | 4 +- lgsm/functions/install_modules.sh | 1 + lgsm/functions/mods_core.sh | 16 +- lgsm/functions/update_factorio.sh | 12 +- lgsm/functions/update_minecraft.sh | 13 +- lgsm/functions/update_minecraft_bedrock.sh | 14 +- lgsm/functions/update_mta.sh | 12 +- lgsm/functions/update_mumble.sh | 11 +- lgsm/functions/update_steamcmd.sh | 11 +- lgsm/functions/update_ts3.sh | 4 + linuxgsm.sh | 2 +- tests/tests_fctrserver.sh | 6 +- tests/tests_jc2server.sh | 6 +- tests/tests_mcserver.sh | 6 +- tests/tests_ts3server.sh | 6 +- 56 files changed, 504 insertions(+), 352 deletions(-) diff --git a/lgsm/functions/alert.sh b/lgsm/functions/alert.sh index 5f8fe156e..236ca6461 100644 --- a/lgsm/functions/alert.sh +++ b/lgsm/functions/alert.sh @@ -99,6 +99,7 @@ fn_alert_log if [ "${postalert}" == "on" ]&&[ -n "${postalert}" ]; then exitbypass=1 command_postdetails.sh + fn_commandname elif [ "${postalert}" != "on" ]&&[ "${commandname}" == "TEST-ALERT" ]; then fn_print_warn_nl "More Info not enabled" fn_script_log_warn "More Info alerts not enabled" diff --git a/lgsm/functions/check_last_update.sh b/lgsm/functions/check_last_update.sh index 52e4cfce0..08343e560 100644 --- a/lgsm/functions/check_last_update.sh +++ b/lgsm/functions/check_last_update.sh @@ -20,5 +20,6 @@ if [ -f "${lockdir}/lastupdate.lock" ]&&[ "${status}" != "0" ]; then fn_print_info "${selfname} has not been restarted since last update" fn_script_log_info "${selfname} has not been restarted since last update" command_restart.sh + fn_commandname fi fi diff --git a/lgsm/functions/check_steamcmd.sh b/lgsm/functions/check_steamcmd.sh index aa4140bbe..456870054 100644 --- a/lgsm/functions/check_steamcmd.sh +++ b/lgsm/functions/check_steamcmd.sh @@ -130,7 +130,7 @@ fn_check_steamcmd_clear(){ if [ "$(command -v steamcmd 2>/dev/null)" ]&&[ -d "${rootdir}/steamcmd" ]; then rm -rf "${steamcmddir:?}" exitcode=$? - if [ ${exitcode} -ne 0 ]; then + if [ "${exitcode}" != 0 ]; then fn_script_log_fatal "Removing ${rootdir}/steamcmd" else fn_script_log_pass "Removing ${rootdir}/steamcmd" diff --git a/lgsm/functions/check_version.sh b/lgsm/functions/check_version.sh index 6db78091d..a0b0bc50c 100644 --- a/lgsm/functions/check_version.sh +++ b/lgsm/functions/check_version.sh @@ -16,4 +16,5 @@ if [ -n "${modulesversion}" ]&&[ -n "${version}" ]&&[ "${version}" != "${modules fn_sleep_time fn_script_log_error "LinuxGSM Version mismatch: ${selfname}: ${version}: modules: ${modulesversion}" command_update_linuxgsm.sh + fn_commandname fi diff --git a/lgsm/functions/command_backup.sh b/lgsm/functions/command_backup.sh index 537e86f1c..7d62e965b 100644 --- a/lgsm/functions/command_backup.sh +++ b/lgsm/functions/command_backup.sh @@ -5,9 +5,12 @@ # Website: https://linuxgsm.com # Description: Creates a .tar.gz file in the backup directory. -commandname="BACKUP" -commandaction="Backing up" -functionselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" +fn_commandname(){ + commandname="BACKUP" + commandaction="Backing up" + functionselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" +} +fn_commandname check.sh @@ -61,22 +64,20 @@ fn_backup_init(){ # Check if server is started and whether to stop it. fn_backup_stop_server(){ check_status.sh - # Server is stopped. - if [ "${status}" == "0" ]; then - serverstopped="no" - # Server is running and stoponbackup=off. - elif [ "${stoponbackup}" == "off" ]; then - serverstopped="no" + # Server is running but will not be stopped. + if [ "${stoponbackup}" == "off" ]; then fn_print_warn_nl "${selfname} is currently running" echo -e "* Although unlikely; creating a backup while ${selfname} is running might corrupt the backup." fn_script_log_warn "${selfname} is currently running" fn_script_log_warn "Although unlikely; creating a backup while ${selfname} is running might corrupt the backup" # Server is running and will be stopped if stoponbackup=on or unset. - else + # If server is started + elif [ "${status}" != "0" ]; then fn_stop_warning - serverstopped="yes" + startserver="1" exitbypass=1 command_stop.sh + fn_commandname fi } @@ -140,7 +141,7 @@ fn_backup_compression(){ tar -czf "${backupdir}/${backupname}.tar.gz" -C "${rootdir}" --exclude "${excludedir}" --exclude "${lockdir}/backup.lock" ./. local exitcode=$? - if [ ${exitcode} -ne 0 ]; then + if [ "${exitcode}" != 0 ]; then fn_print_fail_eol fn_script_log_fatal "Backup in progress: FAIL" echo -e "${extractcmd}" | tee -a "${lgsmlog}" @@ -247,25 +248,26 @@ fn_backup_relpath() { } fn_stop_warning(){ - fn_print_warn "Updating server: SteamCMD: ${selfname} will be stopped during backup" - fn_script_log_warn "Updating server: SteamCMD: ${selfname} will be stopped during backup" + fn_print_warn "this game server will be stopped during backup" + fn_script_log_warn "this game server will be stopped during backup" totalseconds=3 for seconds in {3..1}; do - fn_print_warn "Updating server: SteamCMD: ${selfname} will be stopped during backup: ${totalseconds}" + fn_print_warn "this game server will be stopped during backup: ${totalseconds}" totalseconds=$((totalseconds - 1)) sleep 1 if [ "${seconds}" == "0" ]; then break fi done - fn_print_warn_nl "Updating server: SteamCMD: ${selfname} will be stopped during backup" + fn_print_warn_nl "this game server will be stopped during backup" } -# Restart the server if it was stopped for the backup. +# Start the server if it was stopped for the backup. fn_backup_start_server(){ - if [ "${serverstopped}" == "yes" ]; then + if [ -n "${startserver}" ]; then exitbypass=1 command_start.sh + fn_commandname fi } diff --git a/lgsm/functions/command_console.sh b/lgsm/functions/command_console.sh index 18e674652..02040d5c5 100644 --- a/lgsm/functions/command_console.sh +++ b/lgsm/functions/command_console.sh @@ -4,9 +4,12 @@ # Website: https://linuxgsm.com # Description: Gives access to the server tmux console. -commandname="CONSOLE" -commandaction="Access console" -functionselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" +fn_commandname(){ + commandname="CONSOLE" + commandaction="Access console" + functionselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" +} +fn_commandname check.sh fn_print_header @@ -35,6 +38,7 @@ else if fn_prompt_yn "Do you want to start the server?" Y; then exitbypass=1 command_start.sh + fn_commandname fi fi diff --git a/lgsm/functions/command_debug.sh b/lgsm/functions/command_debug.sh index 5aeb0d5e1..4addb86b5 100644 --- a/lgsm/functions/command_debug.sh +++ b/lgsm/functions/command_debug.sh @@ -4,9 +4,12 @@ # Website: https://linuxgsm.com # Description: Runs the server without tmux and directly from the terminal. -commandname="DEBUG" -commandaction="Debuging" -functionselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" +fn_commandname(){ + commandname="DEBUG" + commandaction="Debuging" + functionselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" +} +fn_commandname # Trap to remove lockfile on quit. fn_lockfile_trap(){ @@ -88,6 +91,7 @@ fn_print_info_nl "Stopping any running servers" fn_script_log_info "Stopping any running servers" exitbypass=1 command_stop.sh +fn_commandname unset exitbypass fn_print_dots "Starting debug" fn_script_log_info "Starting debug" diff --git a/lgsm/functions/command_details.sh b/lgsm/functions/command_details.sh index c2abc0ba0..b90f8a6f5 100644 --- a/lgsm/functions/command_details.sh +++ b/lgsm/functions/command_details.sh @@ -5,9 +5,12 @@ # Website: https://linuxgsm.com # Description: Displays server information. -commandname="DETAILS" -commandaction="Viewing details" -functionselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" +fn_commandname(){ + commandname="DETAILS" + commandaction="Viewing details" + functionselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" +} +fn_commandname # Run checks and gathers details to display. check.sh diff --git a/lgsm/functions/command_dev_clear_functions.sh b/lgsm/functions/command_dev_clear_functions.sh index 0c2faa375..935ebb4ef 100644 --- a/lgsm/functions/command_dev_clear_functions.sh +++ b/lgsm/functions/command_dev_clear_functions.sh @@ -4,9 +4,12 @@ # Website: https://linuxgsm.com # Description: Deletes the contents of the functions dir. -commandname="DEV-CLEAR-MODULES" -commandaction="Clearing modules" -functionselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" +fn_commandname(){ + commandname="DEV-CLEAR-MODULES" + commandaction="Clearing modules" + functionselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" +} +fn_commandname echo -e "=================================" echo -e "Clear Functions" diff --git a/lgsm/functions/command_dev_debug.sh b/lgsm/functions/command_dev_debug.sh index 962b01e7f..4a076df9e 100644 --- a/lgsm/functions/command_dev_debug.sh +++ b/lgsm/functions/command_dev_debug.sh @@ -4,9 +4,12 @@ # Website: https://linuxgsm.com # Description: Dev only: Enables debugging log to be saved to dev-debug.log. -commandname="DEV-DEBUG" -commandaction="Developer debug" -functionselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" +fn_commandname(){ + commandname="DEV-DEBUG" + commandaction="Developer debug" + functionselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" +} +fn_commandname if [ -f "${rootdir}/.dev-debug" ]; then rm "${rootdir:?}/.dev-debug" diff --git a/lgsm/functions/command_dev_detect_deps.sh b/lgsm/functions/command_dev_detect_deps.sh index 04f37d696..089aa9af3 100644 --- a/lgsm/functions/command_dev_detect_deps.sh +++ b/lgsm/functions/command_dev_detect_deps.sh @@ -4,9 +4,12 @@ # Website: https://linuxgsm.com # Description: Detects dependencies the server binary requires. -commandname="DEV-DETECT-DEPS" -commandaction="Developer detect deps" -functionselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" +fn_commandname(){ + commandname="DEV-DETECT-DEPS" + commandaction="Developer detect deps" + functionselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" +} +fn_commandname echo -e "=================================" echo -e "Dependencies Checker" diff --git a/lgsm/functions/command_dev_detect_glibc.sh b/lgsm/functions/command_dev_detect_glibc.sh index 2289bb818..c2feae0c9 100644 --- a/lgsm/functions/command_dev_detect_glibc.sh +++ b/lgsm/functions/command_dev_detect_glibc.sh @@ -5,9 +5,12 @@ # Description: Automatically detects the version of GLIBC that is required. # Can check a file or directory recursively. -commandname="DEV-DETECT-GLIBC" -commandaction="Developer detect glibc" -functionselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" +fn_commandname(){ + commandname="DEV-DETECT-GLIBC" + commandaction="Developer detect glibc" + functionselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" +} +fn_commandname echo -e "=================================" echo -e "glibc Requirements Checker" diff --git a/lgsm/functions/command_dev_detect_ldd.sh b/lgsm/functions/command_dev_detect_ldd.sh index 850845179..60766cce5 100644 --- a/lgsm/functions/command_dev_detect_ldd.sh +++ b/lgsm/functions/command_dev_detect_ldd.sh @@ -5,9 +5,12 @@ # Description: Automatically detects required deps using ldd. # Can check a file or directory recursively. -commandname="DEV-DETECT-LDD" -commandaction="Developer detect ldd" -functionselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" +fn_commandname(){ + commandname="DEV-DETECT-LDD" + commandaction="Developer detect ldd" + functionselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" +} +fn_commandname echo -e "=================================" echo -e "Shared Object dependencies Checker" diff --git a/lgsm/functions/command_dev_query_raw.sh b/lgsm/functions/command_dev_query_raw.sh index 22ed232ec..00005c22c 100644 --- a/lgsm/functions/command_dev_query_raw.sh +++ b/lgsm/functions/command_dev_query_raw.sh @@ -4,9 +4,12 @@ # Website: https://linuxgsm.com # Description: Raw gamedig output of the server. -commandname="DEV-QUERY-RAW" -commandaction="Developer query raw" -functionselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" +fn_commandname(){ + commandname="DEV-QUERY-RAW" + commandaction="Developer query raw" + functionselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" +} +fn_commandname check.sh info_config.sh diff --git a/lgsm/functions/command_donate.sh b/lgsm/functions/command_donate.sh index 9bb7f2faf..0483e4aa1 100644 --- a/lgsm/functions/command_donate.sh +++ b/lgsm/functions/command_donate.sh @@ -4,9 +4,12 @@ # Website: https://linuxgsm.com # Description: Shows ways to donate. -commandname="DONATE" -commandaction="Donate" -functionselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" +fn_commandname(){ + commandname="DONATE" + commandaction="Donate" + functionselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" +} +fn_commandname fn_print_ascii_logo echo -e "${lightyellow}Support LinuxGSM${default}" diff --git a/lgsm/functions/command_fastdl.sh b/lgsm/functions/command_fastdl.sh index f6a5897db..a4d06d5e6 100644 --- a/lgsm/functions/command_fastdl.sh +++ b/lgsm/functions/command_fastdl.sh @@ -5,9 +5,12 @@ # Website: https://linuxgsm.com # Description: Creates a FastDL directory. -commandname="FASTDL" -commandaction="Fastdl" -functionselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" +fn_commandname(){ + commandname="FASTDL" + commandaction="Fastdl" + functionselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" +} +fn_commandname check.sh @@ -69,7 +72,7 @@ fn_clear_old_fastdl(){ echo -en "clearing existing FastDL directory ${fastdldir}..." rm -fR "${fastdldir:?}" exitcode=$? - if [ ${exitcode} -ne 0 ]; then + if [ "${exitcode}" != 0 ]; then fn_print_fail_eol_nl fn_script_log_fatal "Clearing existing FastDL directory ${fastdldir}" core_exit.sh @@ -86,7 +89,7 @@ fn_fastdl_dirs(){ echo -en "creating web directory ${webdir}..." mkdir -p "${webdir}" exitcode=$? - if [ ${exitcode} -ne 0 ]; then + if [ "${exitcode}" != 0 ]; then fn_print_fail_eol_nl fn_script_log_fatal "Creating web directory ${webdir}" core_exit.sh @@ -99,7 +102,7 @@ fn_fastdl_dirs(){ echo -en "creating fastdl directory ${fastdldir}..." mkdir -p "${fastdldir}" exitcode=$? - if [ ${exitcode} -ne 0 ]; then + if [ "${exitcode}" != 0 ]; then fn_print_fail_eol_nl fn_script_log_fatal "Creating fastdl directory ${fastdldir}" core_exit.sh @@ -245,7 +248,7 @@ fn_fastdl_gmod(){ echo -e "copying ${allowed_extention} : ${fileswc}..." cp --parents "${fastdlfile}" "${fastdldir}" exitcode=$? - if [ ${exitcode} -ne 0 ]; then + if [ "${exitcode}" != 0 ]; then fn_print_fail_eol_nl fn_script_log_fatal "Copying ${fastdlfile} > ${fastdldir}" core_exit.sh @@ -262,7 +265,7 @@ fn_fastdl_gmod(){ echo -en "updating addons file structure..." cp -Rf "${fastdldir}"/addons/*/* "${fastdldir}" exitcode=$? - if [ ${exitcode} -ne 0 ]; then + if [ "${exitcode}" != 0 ]; then fn_print_fail_eol_nl fn_script_log_fatal "Updating addons file structure" core_exit.sh @@ -275,7 +278,7 @@ fn_fastdl_gmod(){ fn_sleep_time rm -fR "${fastdldir:?}/addons" exitcode=$? - if [ ${exitcode} -ne 0 ]; then + if [ "${exitcode}" != 0 ]; then fn_print_fail_eol_nl fn_script_log_fatal "Clearing addons dir from fastdl dir" core_exit.sh @@ -290,7 +293,7 @@ fn_fastdl_gmod(){ fn_sleep_time cp -Rf "${fastdldir}/lua/"* "${fastdldir}" exitcode=$? - if [ ${exitcode} -ne 0 ]; then + if [ "${exitcode}" != 0 ]; then fn_print_fail_eol_nl fn_script_log_fatal "Correcting DarkRP files" core_exit.sh @@ -342,7 +345,7 @@ fn_fastdl_source(){ fi cp "${fastdlfile}" "${fastdldir}/${copytodir}" exitcode=$? - if [ ${exitcode} -ne 0 ]; then + if [ "${exitcode}" != 0 ]; then fn_print_fail_eol_nl fn_script_log_fatal "Copying ${fastdlfile} > ${fastdldir}/${copytodir}" core_exit.sh @@ -378,7 +381,7 @@ fn_fastdl_gmod_dl_enforcer(){ echo -en "removing existing download enforcer: ${luafastdlfile}..." rm -f "${luafastdlfullpath:?}" exitcode=$? - if [ ${exitcode} -ne 0 ]; then + if [ "${exitcode}" != 0 ]; then fn_print_fail_eol_nl fn_script_log_fatal "Removing existing download enforcer ${luafastdlfullpath}" core_exit.sh @@ -396,7 +399,7 @@ fn_fastdl_gmod_dl_enforcer(){ echo -e "resource.AddFile( \"${line}\" )" >> "${luafastdlfullpath}" done < <(find "${fastdldir:?}" \( -type f ! -name "*.bz2" \) -printf '%P\n') exitcode=$? - if [ ${exitcode} -ne 0 ]; then + if [ "${exitcode}" != 0 ]; then fn_print_fail_eol_nl fn_script_log_fatal "Creating new download enforcer ${luafastdlfullpath}" core_exit.sh @@ -413,7 +416,7 @@ fn_fastdl_bzip2(){ echo -en "\r\033[Kcompressing ${filetocompress}..." bzip2 -f "${filetocompress}" exitcode=$? - if [ ${exitcode} -ne 0 ]; then + if [ "${exitcode}" != 0 ]; then fn_print_fail_eol_nl fn_script_log_fatal "Compressing ${filetocompress}" core_exit.sh diff --git a/lgsm/functions/command_install.sh b/lgsm/functions/command_install.sh index 9a6b64e98..23fdd3179 100644 --- a/lgsm/functions/command_install.sh +++ b/lgsm/functions/command_install.sh @@ -5,9 +5,12 @@ # Website: https://linuxgsm.com # Description: Overall function for the installer. -commandname="INSTALL" -commandaction="Installing" -functionselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" +fn_commandname(){ + commandname="INSTALL" + commandaction="Installing" + functionselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" +} +fn_commandname check.sh if [ "$(whoami)" = "root" ]; then @@ -42,6 +45,7 @@ else install_ts3db.sh elif [ "${shortname}" == "mta" ]; then command_install_resources_mta.sh + fn_commandname fi fix.sh diff --git a/lgsm/functions/command_install_resources_mta.sh b/lgsm/functions/command_install_resources_mta.sh index 053982e0b..4c641dcef 100644 --- a/lgsm/functions/command_install_resources_mta.sh +++ b/lgsm/functions/command_install_resources_mta.sh @@ -4,9 +4,12 @@ # Website: https://linuxgsm.com # Description: Installs the default resources for Multi Theft Auto. -commandname="DEFAULT-RESOURCES" -commandaction="Default Resources" -functionselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" +fn_commandname(){ + commandname="DEFAULT-RESOURCES" + commandaction="Default Resources" + functionselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" +} +fn_commandname fn_install_resources(){ echo -e "" diff --git a/lgsm/functions/command_mods_install.sh b/lgsm/functions/command_mods_install.sh index d3c517461..48bf116b3 100644 --- a/lgsm/functions/command_mods_install.sh +++ b/lgsm/functions/command_mods_install.sh @@ -5,9 +5,12 @@ # Website: https://linuxgsm.com # Description: List and installs available mods along with mods_list.sh and mods_core.sh. -commandname="MODS-INSTALL" -commandaction="Installing mods" -functionselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" +fn_commandname(){ + commandname="MODS-INSTALL" + commandaction="Installing mods" + functionselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" +} +fn_commandname check.sh mods_core.sh diff --git a/lgsm/functions/command_mods_remove.sh b/lgsm/functions/command_mods_remove.sh index 35fd41d5f..b2062333e 100644 --- a/lgsm/functions/command_mods_remove.sh +++ b/lgsm/functions/command_mods_remove.sh @@ -5,9 +5,12 @@ # Website: https://linuxgsm.com # Description: Uninstall mods along with mods_list.sh and mods_core.sh. -commandname="MODS-REMOVE" -commandaction="Removing mods" -functionselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" +fn_commandname(){ + commandname="MODS-REMOVE" + commandaction="Removing mods" + functionselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" +} +fn_commandname check.sh mods_core.sh @@ -70,7 +73,7 @@ while [ "${modfileline}" -le "${modsfilelistsize}" ]; do if [ -f "${modinstalldir}/${currentfileremove}" ]||[ -d "${modinstalldir}/${currentfileremove}" ]; then rm -rf "${modinstalldir:?}/${currentfileremove:?}" ((exitcode=$?)) - if [ ${exitcode} -ne 0 ]; then + if [ "${exitcode}" != 0 ]; then fn_script_log_fatal "Removing ${modinstalldir}/${currentfileremove}" break else @@ -81,7 +84,7 @@ while [ "${modfileline}" -le "${modsfilelistsize}" ]; do echo -e "removing ${modprettyname} ${modfileline} / ${modsfilelistsize} : ${currentfileremove}..." ((modfileline++)) done -if [ ${exitcode} -ne 0 ]; then +if [ "${exitcode}" != 0 ]; then fn_print_fail_eol_nl core_exit.sh else @@ -92,7 +95,7 @@ echo -en "removing ${modcommand}-files.txt..." fn_sleep_time rm -rf "${modsdir:?}/${modcommand}-files.txt" local exitcode=$? -if [ ${exitcode} -ne 0 ]; then +if [ "${exitcode}" != 0 ]; then fn_script_log_fatal "Removing ${modsdir}/${modcommand}-files.txt" fn_print_fail_eol_nl core_exit.sh @@ -107,7 +110,7 @@ fn_sleep_time sed -i "/^${modcommand}$/d" "${modsinstalledlistfullpath}" local exitcode=$? -if [ ${exitcode} -ne 0 ]; then +if [ "${exitcode}" != 0 ]; then fn_script_log_fatal "Removing ${modcommand} from ${modsinstalledlist}" fn_print_fail_eol_nl core_exit.sh @@ -123,6 +126,7 @@ if [ "${engine}" == "unity3d" ]&&[[ "${modprettyname}" == *"Oxide"* ]]; then fn_script_log "Validating to restore original ${gamename} files replaced by Oxide" exitbypass="1" command_validate.sh + fn_commandname unset exitbypass fi echo -e "${modprettyname} removed" diff --git a/lgsm/functions/command_mods_update.sh b/lgsm/functions/command_mods_update.sh index 165b4ea98..d6cd15e70 100644 --- a/lgsm/functions/command_mods_update.sh +++ b/lgsm/functions/command_mods_update.sh @@ -5,9 +5,12 @@ # Website: https://linuxgsm.com # Description: Updates installed mods along with mods_list.sh and mods_core.sh. -commandname="MODS-UPDATE" -commandaction="Updating mods" -functionselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" +fn_commandname(){ + commandname="MODS-UPDATE" + commandaction="Updating mods" + functionselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" +} +fn_commandname check.sh mods_core.sh diff --git a/lgsm/functions/command_monitor.sh b/lgsm/functions/command_monitor.sh index 691fd5f7c..adc2be363 100644 --- a/lgsm/functions/command_monitor.sh +++ b/lgsm/functions/command_monitor.sh @@ -6,9 +6,12 @@ # Description: Monitors server by checking for running processes # then passes to gamedig and gsquery. -commandname="MONITOR" -commandaction="Monitoring" -functionselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" +fn_commandname(){ + commandname="MONITOR" + commandaction="Monitoring" + functionselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" +} +fn_commandname fn_monitor_check_lockfile(){ # Monitor does not run it lockfile is not found. @@ -170,6 +173,7 @@ for queryattempt in {1..5}; do alert="restartquery" alert.sh command_restart.sh + fn_commandname core_exit.sh fi elif [ "${querymethod}" == "gamedig" ]; then diff --git a/lgsm/functions/command_postdetails.sh b/lgsm/functions/command_postdetails.sh index a0afa2905..0d40b6a0b 100644 --- a/lgsm/functions/command_postdetails.sh +++ b/lgsm/functions/command_postdetails.sh @@ -5,9 +5,12 @@ # Website: https://linuxgsm.com # Description: Strips sensitive information out of Details output -commandname="POST-DETAILS" -commandaction="Posting details" -functionselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" +fn_commandname(){ + commandname="POST-DETAILS" + commandaction="Posting details" + functionselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" +} +fn_commandname # Set posttarget to the appropriately-defined post destination. diff --git a/lgsm/functions/command_restart.sh b/lgsm/functions/command_restart.sh index 8a08c04ff..47fa163a8 100644 --- a/lgsm/functions/command_restart.sh +++ b/lgsm/functions/command_restart.sh @@ -4,13 +4,16 @@ # Website: https://linuxgsm.com # Description: Restarts the server. -commandname="MODS-INSTALL" -commandaction="Restarting" -functionselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" +fn_commandname(){ + commandname="MODS-INSTALL" + commandaction="Restarting" + functionselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" +} +fn_commandname info_config.sh exitbypass=1 command_stop.sh command_start.sh - +fn_commandname core_exit.sh diff --git a/lgsm/functions/command_start.sh b/lgsm/functions/command_start.sh index d0487e5d4..c78bcc158 100644 --- a/lgsm/functions/command_start.sh +++ b/lgsm/functions/command_start.sh @@ -5,9 +5,12 @@ # Website: https://linuxgsm.com # Description: Starts the server. -commandname="START" -commandaction="Starting" -functionselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" +fn_commandname(){ + commandname="START" + commandaction="Starting" + functionselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" +} +fn_commandname fn_start_teamspeak3(){ if [ ! -f "${servercfgfullpath}" ]; then @@ -188,8 +191,7 @@ if [ "${updateonstart}" == "yes" ]||[ "${updateonstart}" == "1" ]||[ "${updateon exitbypass=1 unset updateonstart command_update.sh - commandname="START" - commandaction="Starting" + fn_commandname fi fn_print_dots "${servername}" diff --git a/lgsm/functions/command_stop.sh b/lgsm/functions/command_stop.sh index 6ea4f4d7a..085f9996a 100644 --- a/lgsm/functions/command_stop.sh +++ b/lgsm/functions/command_stop.sh @@ -5,9 +5,12 @@ # Website: https://linuxgsm.com # Description: Stops the server. -commandname="STOP" -commandaction="Stopping" -functionselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" +fn_commandname(){ + commandname="STOP" + commandaction="Stopping" + functionselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" +} +fn_commandname # Attempts graceful shutdown by sending 'CTRL+c'. fn_stop_graceful_ctrlc(){ diff --git a/lgsm/functions/command_test_alert.sh b/lgsm/functions/command_test_alert.sh index 5d1c11885..969c648ca 100644 --- a/lgsm/functions/command_test_alert.sh +++ b/lgsm/functions/command_test_alert.sh @@ -4,9 +4,12 @@ # Website: https://linuxgsm.com # Description: Sends a test alert. -commandname="TEST-ALERT" -commandaction="Sending Alert" -functionselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" +fn_commandname(){ + commandname="TEST-ALERT" + commandaction="Sending Alert" + functionselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" +} +fn_commandname fn_print_dots "${servername}" check.sh diff --git a/lgsm/functions/command_ts3_server_pass.sh b/lgsm/functions/command_ts3_server_pass.sh index 8ff799e6e..ba25747cc 100644 --- a/lgsm/functions/command_ts3_server_pass.sh +++ b/lgsm/functions/command_ts3_server_pass.sh @@ -5,9 +5,12 @@ # Website: https://linuxgsm.com # Description: Changes TS3 serveradmin password. -commandname="CHANGE-PASSWORD" -commandaction="Changing password" -functionselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" +fn_commandname(){ + commandname="CHANGE-PASSWORD" + commandaction="Changing password" + functionselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" +} +fn_commandname fn_serveradmin_password_prompt(){ fn_print_header @@ -28,6 +31,7 @@ fn_serveradmin_password_set(){ ts3serverpass="1" exitbypass="1" command_start.sh + fn_commandname fn_print_ok_nl "New password applied" fn_script_log_pass "New ServerAdmin password applied" } @@ -39,13 +43,16 @@ if [ "${status}" != "0" ]; then # Stop any running server. exitbypass="1" command_stop.sh + fn_commandname fn_serveradmin_password_set parms="serveradmin_password=\"${newpassword}\" inifile=\"${servercfgfullpath}\" > /dev/null 2>&1" ts3serverpass="0" command_restart.sh + fn_commandname else fn_serveradmin_password_set command_stop.sh + fn_commandname fi core_exit.sh diff --git a/lgsm/functions/command_update.sh b/lgsm/functions/command_update.sh index 88109a147..b6254937a 100644 --- a/lgsm/functions/command_update.sh +++ b/lgsm/functions/command_update.sh @@ -4,9 +4,12 @@ # Website: https://linuxgsm.com # Description: Handles updating of servers. -commandname="UPDATE" -commandaction="Updating" -functionselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" +fn_commandname(){ + commandname="UPDATE" + commandaction="Updating" + functionselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" +} +fn_commandname fn_print_dots "" check.sh diff --git a/lgsm/functions/command_update_linuxgsm.sh b/lgsm/functions/command_update_linuxgsm.sh index c32bf321f..e4028cf18 100644 --- a/lgsm/functions/command_update_linuxgsm.sh +++ b/lgsm/functions/command_update_linuxgsm.sh @@ -4,9 +4,12 @@ # Website: https://linuxgsm.com # Description: Deletes the functions dir to allow re-downloading of functions from GitHub. -commandname="UPDATE-LGSM" -commandaction="Updating LinuxGSM" -functionselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" +fn_commandname(){ + commandname="UPDATE-LGSM" + commandaction="Updating LinuxGSM" + functionselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" +} +fn_commandname check.sh diff --git a/lgsm/functions/command_validate.sh b/lgsm/functions/command_validate.sh index 276458e48..a00fb99ce 100644 --- a/lgsm/functions/command_validate.sh +++ b/lgsm/functions/command_validate.sh @@ -4,23 +4,26 @@ # Website: https://linuxgsm.com # Description: Runs a server validation. -commandname="VALIDATE" -commandaction="Validating" -functionselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" +fn_commandname(){ + commandname="VALIDATE" + commandaction="Validating" + functionselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" +} +fn_commandname fn_validate(){ - fn_script_log_warn "Validating server: SteamCMD: Validate might overwrite some customised files" + fn_script_log_warn "SteamCMD: Validate might overwrite some customised files" totalseconds=3 for seconds in {3..1}; do - fn_print_warn "Validating server: SteamCMD: Validate might overwrite some customised files: ${totalseconds}" + fn_print_warn "SteamCMD: Validate might overwrite some customised files: ${totalseconds}" totalseconds=$((totalseconds - 1)) sleep 1 if [ "${seconds}" == "0" ]; then break fi done - fn_print_warn_nl "Validating server: SteamCMD: Validate might overwrite some customised files" - fn_print_start_nl "Validating server: SteamCMD" + fn_print_warn_nl "SteamCMD: Validate might overwrite some customised files" + fn_print_start_nl "SteamCMD" fn_script_log_info "Validating server: SteamCMD" if [ -d "${steamcmddir}" ]; then cd "${steamcmddir}" || exit @@ -40,8 +43,7 @@ fn_validate(){ ${unbuffer} ${steamcmdcommand} +login "${steamuser}" "${steampass}" +force_install_dir "${serverfiles}" +app_info_print 70 +app_set_config 90 mod "${appidmod}" +app_update "${appid}" "${branch}" +app_update "${appid}" validate +quit | tee -a "${lgsmlog}" fi elif [ "${shortname}" == "ac" ]; then - ${unbuffer} ${steamcmdcommand} +@sSteamCmdForcePlatformType windows +login "${steamuser}" "${steampass}" +force_install_dir "${serverfiles}" +app_update "${appid}" validate +quit - local exitcode=$? + ${unbuffer} ${steamcmdcommand} +@sSteamCmdForcePlatformType windows +login "${steamuser}" "${steampass}" +force_install_dir "${serverfiles}" +app_update "${appid}" validate +quit | tee -a "${lgsmlog}" # All other servers. elif [ -n "${branch}" ]; then ${unbuffer} ${steamcmdcommand} +login "${steamuser}" "${steampass}" +force_install_dir "${serverfiles}" +app_update "${appid}" -beta "${branch}" validate +quit | tee -a "${lgsmlog}" @@ -50,42 +52,43 @@ fn_validate(){ fi exitcode=$? - fn_print_dots "Validating server: SteamCMD" + fn_print_dots "SteamCMD" if [ "${exitcode}" != "0" ]; then - fn_print_fail_nl "Validating server: SteamCMD" + fn_print_fail_nl "SteamCMD" fn_script_log_fatal "Validating server: SteamCMD: FAIL" else - fn_print_ok_nl "Validating server: SteamCMD" + fn_print_ok_nl "SteamCMD" fn_script_log_pass "Validating server: SteamCMD: OK" fi core_exit.sh } fn_stop_warning(){ - fn_print_warn "Validating server: SteamCMD: ${selfname} will be stopped during validation" - fn_script_log_warn "Validating server: SteamCMD: ${selfname} will be stopped during validation" + fn_print_warn "this game server will be stopped during validate" + fn_script_log_warn "this game server will be stopped during validate" totalseconds=3 for seconds in {3..1}; do - fn_print_warn "Validating server: SteamCMD: ${selfname} will be stopped during validation: ${totalseconds}" + fn_print_warn "this game server will be stopped during validate: ${totalseconds}" totalseconds=$((totalseconds - 1)) sleep 1 if [ "${seconds}" == "0" ]; then break fi done - fn_print_warn_nl "Validating server: SteamCMD: ${selfname} will be stopped during validation" + fn_print_warn_nl "this game server will be stopped during validate" } -fn_print_dots "Validating server" -fn_print_dots "Validating server: SteamCMD" +fn_print_dots "SteamCMD" check.sh if [ "${status}" != "0" ]; then fn_stop_warning exitbypass=1 command_stop.sh + fn_commandname fn_validate exitbypass=1 command_start.sh + fn_commandname else fn_validate fi diff --git a/lgsm/functions/command_wipe.sh b/lgsm/functions/command_wipe.sh index 5b5abf552..96e10a98f 100644 --- a/lgsm/functions/command_wipe.sh +++ b/lgsm/functions/command_wipe.sh @@ -5,34 +5,17 @@ # Website: https://linuxgsm.com # Description: Wipes server data, useful after updates for some games like Rust -commandname="WIPE" -commandaction="Wiping" -functionselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" - -check.sh -fn_print_header -fn_script_log "Entering ${gamename} ${commandaction}" - -# 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 - fi - echo -e "server data wiped" - fn_script_log "server data wiped." +fn_commandname(){ + commandname="WIPE" + commandaction="Wiping" + functionselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" } +fn_commandname # Provides an exit code upon error. fn_wipe_exit_code(){ ((exitcode=$?)) - if [ ${exitcode} -ne 0 ]; then + if [ "${exitcode}" != 0 ]; then fn_script_log_fatal "${currentaction}" core_exit.sh else @@ -41,166 +24,190 @@ fn_wipe_exit_code(){ } # Removes files to wipe server. -fn_wipe_server_remove_files(){ - # Rust Wipe. - if [ "${shortname}" == "rust" ]; then - # Wipe pocedural map. - if [ "$(find "${serveridentitydir}" -type f -name "proceduralmap.*.map")" ]; then - currentaction="Removing map file(s): ${serveridentitydir}/proceduralmap.*.map" - echo -en "Removing procedural map proceduralmap.*.map file(s)..." - fn_sleep_time - fn_script_log "${currentaction}" - find "${serveridentitydir:?}" -type f -name "proceduralmap.*.map" -delete - fn_wipe_exit_code - fn_sleep_time - else - fn_print_information_nl "No procedural map file to remove" - fn_script_log_info "No procedural map file to remove." - fi - # Wipe procedural map save. - if [ "$(find "${serveridentitydir}" -type f -name "proceduralmap.*.sav")" ]; then - currentaction="Removing procedural map save(s): ${serveridentitydir}/proceduralmap.*.sav" - echo -en "Removing map saves proceduralmap.*.sav file(s)..." - fn_sleep_time - fn_script_log "${currentaction}" - find "${serveridentitydir:?}" -type f -name "proceduralmap.*.sav" -delete - fn_wipe_exit_code - fn_sleep_time - else - fn_print_information_nl "No procedural map save to remove" - fn_script_log_info "No procedural map save to remove." - fi - # Wipe Barren map. - if [ "$(find "${serveridentitydir}" -type f -name "barren*.map")" ]; then - currentaction="Removing map file(s): ${serveridentitydir}/barren*.map" - echo -en "Removing barren map barren*.map file(s)..." - fn_sleep_time - fn_script_log "${currentaction}" - find "${serveridentitydir:?}" -type f -name "barren*.map" -delete - fn_wipe_exit_code - fn_sleep_time - else - fn_print_information_nl "No barren map file to remove" - fn_script_log_info "No barren map file to remove." - fi - # Wipe barren map save. - if [ "$(find "${serveridentitydir}" -type f -name "barren*.sav")" ]; then - currentaction="Removing barren map save(s): ${serveridentitydir}/barren*.sav" - echo -en "Removing barren map saves barren*.sav file(s)..." - fn_sleep_time - fn_script_log "${currentaction}" - find "${serveridentitydir:?}" -type f -name "barren*.sav" -delete - fn_wipe_exit_code - fn_sleep_time - else - fn_print_information_nl "No barren map save to remove" - fn_script_log_info "No barren map save to remove." - fi - # Wipe user dir, might be a legacy thing, maybe to be removed. - if [ -d "${serveridentitydir}/user" ]; then - currentaction="Removing user directory: ${serveridentitydir}/user" - echo -en "Removing user directory..." - fn_sleep_time - fn_script_log "${currentaction}" - rm -rf "${serveridentitydir:?}/user" - fn_wipe_exit_code - fn_sleep_time +fn_wipe_server_files(){ + fn_print_start_nl "Wiping server" + fn_script_log_info "Wiping server" + # Wipe procedural map. + if [ "$(find "${serveridentitydir}" -type f -name "proceduralmap.*.map")" ]; then + echo -en "removing procedural map proceduralmap.*.map file(s)..." + fn_sleep_time + fn_script_log_info "Removing procedural map file(s): ${serveridentitydir}/proceduralmap.*.map" + find "${serveridentitydir:?}" -type f -name "proceduralmap.*.map" -delete | tee -a "${lgsmlog}" + fn_wipe_exit_code + fn_sleep_time + else + echo -e "no procedural map file to remove" + fn_sleep_time + fn_script_log_pass "No procedural map file to remove" + fi + # Wipe procedural map save. + if [ "$(find "${serveridentitydir}" -type f -name "proceduralmap.*.sav")" ]; then + echo -en "removing map saves proceduralmap.*.sav file(s)..." + fn_sleep_time + fn_script_log_info "Removing procedural map save(s): ${serveridentitydir}/proceduralmap.*.sav" + find "${serveridentitydir:?}" -type f -name "proceduralmap.*.sav" -delete | tee -a "${lgsmlog}" + fn_wipe_exit_code + fn_sleep_time + else + echo -e "no procedural map save to remove" + fn_sleep_time + fn_script_log_pass "No procedural map save to remove" + fi + # Wipe Barren map. + if [ "$(find "${serveridentitydir}" -type f -name "barren*.map")" ]; then + echo -en "removing barren map barren*.map file(s)..." + fn_sleep_time + fn_script_log_info "Removing map file(s): ${serveridentitydir}/barren*.map" + find "${serveridentitydir:?}" -type f -name "barren*.map" -delete | tee -a "${lgsmlog}" + fn_wipe_exit_code + fn_sleep_time + else + echo -e "no barren map file to remove" + fn_sleep_time + fn_script_log_pass "No barren map file to remove" + fi + # Wipe barren map save. + if [ "$(find "${serveridentitydir}" -type f -name "barren*.sav")" ]; then + echo -en "removing barren map saves barren*.sav file(s)..." + fn_sleep_time + fn_script_log_info "Removing barren map save(s): ${serveridentitydir}/barren*.sav" + find "${serveridentitydir:?}" -type f -name "barren*.sav" -delete | tee -a "${lgsmlog}" + fn_wipe_exit_code + fn_sleep_time + else + echo -e "no barren map save to remove" + fn_sleep_time + fn_script_log_pass "No barren map save to remove." + fi + # Wipe user dir, might be a legacy thing, maybe to be removed. + if [ -d "${serveridentitydir}/user" ]; then + echo -en "removing user directory..." + fn_sleep_time + fn_script_log_info "removing user directory: ${serveridentitydir}/user" + rm -rf "${serveridentitydir:?}/user" + fn_wipe_exit_code + fn_sleep_time # We do not print additional information if there is nothing to remove since this might be obsolete. - fi - # Wipe storage dir, might be a legacy thing, maybe to be removed. - if [ -d "${serveridentitydir}/storage" ]; then - currentaction="Removing storage directory: ${serveridentitydir}/storage" - echo -en "Removing storage directory..." - fn_sleep_time - fn_script_log "${currentaction}" - rm -rf "${serveridentitydir:?}/storage" - fn_wipe_exit_code - fn_sleep_time + fi + # Wipe storage dir, might be a legacy thing, maybe to be removed. + if [ -d "${serveridentitydir}/storage" ]; then + echo -en "removing storage directory..." + fn_sleep_time + fn_script_log_info "removing storage directory: ${serveridentitydir}/storage" + rm -rf "${serveridentitydir:?}/storage" + fn_wipe_exit_code + fn_sleep_time # We do not print additional information if there is nothing to remove since this might be obsolete. - fi - # Wipe sv.files. - if [ "$(find "${serveridentitydir}" -type f -name "sv.files.*.db")" ]; then - currentaction="Removing server misc files: ${serveridentitydir}/sv.files.*.db" - echo -en "Removing server misc srv.files*.db file(s)..." - fn_sleep_time - fn_script_log "${currentaction}" - find "${serveridentitydir:?}" -type f -name "sv.files.*.db" -delete - fn_wipe_exit_code - fn_sleep_time + fi + # Wipe sv.files. + if [ "$(find "${serveridentitydir}" -type f -name "sv.files.*.db")" ]; then + echo -en "removing server misc srv.files*.db file(s)..." + fn_sleep_time + fn_script_log_info "Removing server misc files: ${serveridentitydir}/sv.files.*.db" + find "${serveridentitydir:?}" -type f -name "sv.files.*.db" -delete | tee -a "${lgsmlog}" + fn_wipe_exit_code + fn_sleep_time # No further information if not found because it should I could not get this file showing up. - fi - # Wipe player death files. - if [ "$(find "${serveridentitydir}" -type f -name "player.deaths.*.db")" ]; then - currentaction="Removing player death files: ${serveridentitydir}/player.deaths.*.db" - echo -en "Removing player deaths player.deaths.*.db file(s)..." + fi + # Wipe player death files. + if [ "$(find "${serveridentitydir}" -type f -name "player.deaths.*.db")" ]; then + echo -en "removing player deaths player.deaths.*.db file(s)..." + fn_sleep_time + fn_script_log_info "Removing player death files: ${serveridentitydir}/player.deaths.*.db" + find "${serveridentitydir:?}" -type f -name "player.deaths.*.db" -delete | tee -a "${lgsmlog}" + fn_wipe_exit_code + fn_sleep_time + else + echo -e "no player death to remove" + fn_sleep_time + fn_script_log_pass "No player death to remove" + fi + # Wipe blueprints only if full-wipe command was used. + if [ "${fullwipe}" == "1" ]; then + if [ "$(find "${serveridentitydir}" -type f -name "player.blueprints.*.db")" ]; then + echo -en "removing blueprints player.blueprints.*.db file(s)..." fn_sleep_time - fn_script_log "${currentaction}" - find "${serveridentitydir:?}" -type f -name "player.deaths.*.db" -delete + fn_script_log_info "Removing blueprint file(s): ${serveridentitydir}/player.blueprints.*.db" + find "${serveridentitydir:?}" -type f -name "player.blueprints.*.db" -delete | tee -a "${lgsmlog}" fn_wipe_exit_code fn_sleep_time else - fn_print_information_nl "No player death to remove" - fn_script_log_info "No player death to remove." - fi - # Wipe blueprints only if wipeall command was used. - if [ "${wipeall}" == "1" ]; then - if [ "$(find "${serveridentitydir}" -type f -name "player.blueprints.*.db")" ]; then - currentaction="Removing blueprint file(s): ${serveridentitydir}/player.blueprints.*.db" - echo -en "Removing blueprints player.blueprints.*.db file(s)..." - fn_sleep_time - fn_script_log "${currentaction}" - find "${serveridentitydir:?}" -type f -name "player.blueprints.*.db" -delete - fn_wipe_exit_code - fn_sleep_time - else - fn_print_information_nl "No blueprint file to remove" - fn_script_log_info "No blueprint file to remove." - fi - elif [ "$(find "${serveridentitydir}" -type f -name "player.blueprints.*.db")" ]; then - fn_print_information_nl "Keeping blueprints" - fn_script_log_info "Keeping blueprints." - else - fn_print_information_nl "No blueprints found" - fn_script_log_info "No blueprints found." - fn_sleep_time + echo -e "no blueprint file to remove" + fn_sleep_time + fn_script_log_pass "No blueprint file to remove" fi - # Wipe some logs that might be there. - if [ "$(find "${serveridentitydir}" -type f -name "Log.*.txt")" ]; then - currentaction="Removing log files: ${serveridentitydir}/Log.*.txt" - echo -en "Removing Log files..." + elif [ "$(find "${serveridentitydir}" -type f -name "player.blueprints.*.db")" ]; then + echo -e "keeping blueprints" fn_sleep_time - fn_script_log "${currentaction}" - find "${serveridentitydir:?}" -type f -name "Log.*.txt" -delete - fn_wipe_exit_code + fn_script_log_info "Keeping blueprints" + else + echo -e "no blueprints found" fn_sleep_time + fn_script_log_pass "No blueprints found" + fi + # Wipe some logs that might be there. + if [ "$(find "${serveridentitydir}" -type f -name "Log.*.txt")" ]; then + echo -en "removing Log files..." + fn_sleep_time + fn_script_log_info "Removing log files: ${serveridentitydir}/Log.*.txt" + find "${serveridentitydir:?}" -type f -name "Log.*.txt" -delete + fn_wipe_exit_code + fn_sleep_time # We do not print additional information if there are no logs to remove. - fi - # You can add an "elif" here to add another game or engine. fi } -# Check if there is something to wipe, prompt the user, and call appropriate functions. -# Rust Wipe. -if [ "${shortname}" == "rust" ]; then - if [ -d "${serveridentitydir}/storage" ]||[ -d "${serveridentitydir}/user" ]||[ -n "$(find "${serveridentitydir}" -type f -name "proceduralmap*.sav")" ]||[ -n "$(find "${serveridentitydir}" -type f -name "barren*.sav")" ]||[ -n "$(find "${serveridentitydir}" -type f -name "Log.*.txt")" ]||[ -n "$(find "${serveridentitydir}" -type f -name "player.deaths.*.db")" ]||[ -n "$(find "${serveridentitydir}" -type f -name "player.blueprints.*.db")" ]||[ -n "$(find "${serveridentitydir}" -type f -name "sv.files.*.db")" ]; then - fn_print_warning_nl "Any user, storage, log and map data from ${serveridentitydir} will be erased." - if ! fn_prompt_yn "Continue?" Y; then - core_exit.sh +fn_stop_warning(){ + fn_print_warn "this game server will be stopped during wipe" + fn_script_log_warn "this game server will be stopped during wipe" + totalseconds=3 + for seconds in {3..1}; do + fn_print_warn "this game server will be stopped during wipe: ${totalseconds}" + totalseconds=$((totalseconds - 1)) + sleep 1 + if [ "${seconds}" == "0" ]; then + break fi - fn_script_log_info "User selects to erase any user, storage, log and map data from ${serveridentitydir}" - fn_sleep_time - fn_wipe_server_process + done + fn_print_warn_nl "this game server will be stopped during wipe" +} + +fn_wipe_warning(){ + fn_print_warn "wipe is about to start" + fn_script_log_warn "wipe is about to start" + totalseconds=3 + for seconds in {3..1}; do + fn_print_warn "wipe is about to start: ${totalseconds}" + totalseconds=$((totalseconds - 1)) + sleep 1 + if [ "${seconds}" == "0" ]; then + break + fi + done + fn_print_warn "wipe is about to start" +} + +fn_print_dots "" +check.sh + +# Check if there is something to wipe. +if [ -d "${serveridentitydir}/storage" ]||[ -d "${serveridentitydir}/user" ]||[ -n "$(find "${serveridentitydir}" -type f -name "proceduralmap*.sav")" ]||[ -n "$(find "${serveridentitydir}" -type f -name "barren*.sav")" ]||[ -n "$(find "${serveridentitydir}" -type f -name "Log.*.txt")" ]||[ -n "$(find "${serveridentitydir}" -type f -name "player.deaths.*.db")" ]||[ -n "$(find "${serveridentitydir}" -type f -name "player.blueprints.*.db")" ]||[ -n "$(find "${serveridentitydir}" -type f -name "sv.files.*.db")" ]; then + fn_wipe_warning + check_status.sh + if [ "${status}" != "0" ]; then + fn_stop_warning + exitbypass=1 + command_stop.sh + fn_commandname + fn_wipe_server_files + exitbypass=1 + command_start.sh + fn_commandname else - fn_print_information_nl "No data to wipe was found" - fn_script_log_info "No data to wipe was found." - core_exit.sh + fn_wipe_server_files fi -# You can add an "elif" here to add another game or engine. -else - # Game not listed. - fn_print_information_nl "Wipe is not available for this game" - fn_script_log_info "Wipe is not available for this game." - core_exit.sh + fn_print_ok_nl "" + fn_script_log_pass "Wiping server" fi core_exit.sh diff --git a/lgsm/functions/compress_unreal2_maps.sh b/lgsm/functions/compress_unreal2_maps.sh index 3580c20c9..e08dd666f 100644 --- a/lgsm/functions/compress_unreal2_maps.sh +++ b/lgsm/functions/compress_unreal2_maps.sh @@ -4,9 +4,12 @@ # Website: https://linuxgsm.com # Description: Compresses unreal maps. -commandname="MAP-COMPRESSOR" -commandaction="Compressing maps" -functionselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" +fn_commandname(){ + commandname="MAP-COMPRESSOR" + commandaction="Compressing maps" + functionselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" +} +fn_commandname check.sh fn_print_header diff --git a/lgsm/functions/compress_ut99_maps.sh b/lgsm/functions/compress_ut99_maps.sh index 677f5aaa2..e475c466b 100644 --- a/lgsm/functions/compress_ut99_maps.sh +++ b/lgsm/functions/compress_ut99_maps.sh @@ -4,9 +4,12 @@ # Website: https://linuxgsm.com # Description: Compresses unreal maps. -commandname="MAP-COMPRESSOR" -commandaction="Compressing maps" -functionselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" +fn_commandname(){ + commandname="MAP-COMPRESSOR" + commandaction="Compressing maps" + functionselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" +} +fn_commandname check.sh fn_print_header diff --git a/lgsm/functions/core_dl.sh b/lgsm/functions/core_dl.sh index 89ee784db..514eb3da8 100644 --- a/lgsm/functions/core_dl.sh +++ b/lgsm/functions/core_dl.sh @@ -25,7 +25,7 @@ fn_clear_tmp(){ if [ -d "${tmpdir}" ]; then rm -rf "${tmpdir:?}/"* local exitcode=$? - if [ ${exitcode} -eq 0 ]; then + if [ "${exitcode}" == 0 ]; then fn_print_ok_eol_nl fn_script_log_pass "clearing LinuxGSM tmp directory" else @@ -82,7 +82,7 @@ fn_dl_extract(){ extractcmd=$(unzip -qo -d "${extractdir}" "${local_filedir}/${local_filename}") fi local exitcode=$? - if [ ${exitcode} -ne 0 ]; then + if [ "${exitcode}" != 0 ]; then fn_print_fail_eol_nl fn_script_log_fatal "Extracting download" if [ -f "${lgsmlog}" ]; then @@ -171,7 +171,7 @@ fn_fetch_file(){ fi # On first try will error. On second try will fail. - if [ ${exitcode} -ne 0 ]; then + if [ "${exitcode}" != 0 ]; then if [ ${counter} -ge 2 ]; then fn_print_fail_eol_nl if [ -f "${lgsmlog}" ]; then diff --git a/lgsm/functions/fix_kf.sh b/lgsm/functions/fix_kf.sh index f0c29ee6f..a745094b0 100644 --- a/lgsm/functions/fix_kf.sh +++ b/lgsm/functions/fix_kf.sh @@ -21,11 +21,15 @@ echo -e "forcing server restart..." fn_sleep_time exitbypass=1 command_start.sh +fn_commandname sleep 5 exitbypass=1 command_stop.sh +fn_commandname exitbypass=1 command_start.sh +fn_commandname sleep 5 exitbypass=1 command_stop.sh +fn_commandname diff --git a/lgsm/functions/fix_kf2.sh b/lgsm/functions/fix_kf2.sh index 77edd77e8..99e96543a 100644 --- a/lgsm/functions/fix_kf2.sh +++ b/lgsm/functions/fix_kf2.sh @@ -14,6 +14,8 @@ fn_print_information "starting ${gamename} server to generate configs." fn_sleep_time exitbypass=1 command_start.sh +fn_commandname sleep 10 exitbypass=1 command_stop.sh +fn_commandname diff --git a/lgsm/functions/fix_ro.sh b/lgsm/functions/fix_ro.sh index 9f08d56d7..902fed7fe 100644 --- a/lgsm/functions/fix_ro.sh +++ b/lgsm/functions/fix_ro.sh @@ -24,11 +24,15 @@ echo -e "forcing server restart..." fn_sleep_time exitbypass=1 command_start.sh +fn_commandname sleep 5 exitbypass=1 command_stop.sh +fn_commandname exitbypass=1 command_start.sh +fn_commandname sleep 5 exitbypass=1 command_stop.sh +fn_commandname diff --git a/lgsm/functions/fix_ut2k4.sh b/lgsm/functions/fix_ut2k4.sh index fa2d29bf5..07805d42b 100644 --- a/lgsm/functions/fix_ut2k4.sh +++ b/lgsm/functions/fix_ut2k4.sh @@ -21,11 +21,15 @@ echo -e "forcing server restart." fn_sleep_time exitbypass=1 command_start.sh +fn_commandname sleep 5 exitbypass=1 command_stop.sh +fn_commandname exitbypass=1 command_start.sh +fn_commandname sleep 5 exitbypass=1 command_stop.sh +fn_commandname diff --git a/lgsm/functions/fix_ut3.sh b/lgsm/functions/fix_ut3.sh index e6c018d00..ad9b3db4e 100644 --- a/lgsm/functions/fix_ut3.sh +++ b/lgsm/functions/fix_ut3.sh @@ -14,6 +14,8 @@ fn_print_information "starting ${gamename} server to generate configs." fn_sleep_time exitbypass=1 command_start.sh +fn_commandname sleep 10 exitbypass=1 command_stop.sh +fn_commandname diff --git a/lgsm/functions/fix_wurm.sh b/lgsm/functions/fix_wurm.sh index 809651d55..40325d729 100644 --- a/lgsm/functions/fix_wurm.sh +++ b/lgsm/functions/fix_wurm.sh @@ -18,8 +18,10 @@ if [ ! -d "${serverfiles}/Creative" ]; then fixbypass=1 exitbypass=1 command_start.sh + fn_commandname sleep 10 exitbypass=1 command_stop.sh + fn_commandname unset parmsbypass fi diff --git a/lgsm/functions/info_messages.sh b/lgsm/functions/info_messages.sh index 843dc26a1..d423e0f4a 100644 --- a/lgsm/functions/info_messages.sh +++ b/lgsm/functions/info_messages.sh @@ -135,7 +135,7 @@ fn_info_message_gameserver_resource(){ echo -e "${lightyellow}Game Server Resource Usage${default}" fn_messages_separator { - if [ "${status}" == "1" ]; then + if [ "${status}" != "0" ]; then echo -e "${lightblue}CPU Used:\t${default}${cpuused}%${default}" echo -e "${lightblue}Mem Used:\t${default}${pmemused}%\t${memused}MB${default}" else @@ -1515,7 +1515,7 @@ fn_info_message_select_engine(){ elif [ "${shortname}" == "bf1942" ]; then fn_info_message_bf1942 elif [ "${shortname}" == "bfv" ]; then - fn_info_message_bfv + fn_info_message_bfv elif [ "${shortname}" == "rtcw" ]; then fn_info_message_rtcw elif [ "${shortname}" == "rust" ]; then diff --git a/lgsm/functions/install_modules.sh b/lgsm/functions/install_modules.sh index c512b69a3..39729fd23 100644 --- a/lgsm/functions/install_modules.sh +++ b/lgsm/functions/install_modules.sh @@ -14,3 +14,4 @@ cp "${tmpdir}/LinuxGSM-master/lgsm/functions"/*.sh "${functionsdir}" cp "${tmpdir}/LinuxGSM-master/lgsm/functions"/*.py "${functionsdir}" chmod +x "${functionsdir}"/* command_update_linuxgsm.sh +fn_commandname diff --git a/lgsm/functions/mods_core.sh b/lgsm/functions/mods_core.sh index da2576207..bd6b6275c 100644 --- a/lgsm/functions/mods_core.sh +++ b/lgsm/functions/mods_core.sh @@ -53,7 +53,7 @@ fn_mod_lowercase(){ done < <(find "${extractdir}" -depth) echo -en "${renamedwc} / ${totalfileswc} / ${fileswc} converting ${modprettyname} files to lowercase..." - if [ ${exitcode} -ne 0 ]; then + if [ "${exitcode}" != 0 ]; then fn_print_fail_eol_nl core_exit.sh else @@ -69,7 +69,7 @@ fn_mod_create_filelist(){ # ${modsdir}/${modcommand}-files.txt. find "${extractdir}" -mindepth 1 -printf '%P\n' > "${modsdir}/${modcommand}-files.txt" local exitcode=$? - if [ ${exitcode} -ne 0 ]; then + if [ "${exitcode}" != 0 ]; then fn_print_fail_eol_nl fn_script_log_fatal "Building ${modsdir}/${modcommand}-files.txt" core_exit.sh @@ -89,7 +89,7 @@ fn_mod_copy_destination(){ fn_sleep_time cp -Rf "${extractdir}/." "${modinstalldir}/" local exitcode=$? - if [ ${exitcode} -ne 0 ]; then + if [ "${exitcode}" != 0 ]; then fn_print_fail_eol_nl fn_script_log_fatal "Copying ${modprettyname} to ${modinstalldir}" else @@ -127,7 +127,7 @@ fn_mod_tidy_files_list(){ sed -i "/^${removefilevar}$/d" "${modsdir}/${modcommand}-files.txt" # Exit on error. local exitcode=$? - if [ ${exitcode} -ne 0 ]; then + if [ "${exitcode}" != 0 ]; then fn_print_fail_eol_nl fn_script_log_fatal "Error while tidying line: ${removefilevar} from: ${modsdir}/${modcommand}-files.txt" core_exit.sh @@ -382,7 +382,7 @@ fn_create_mods_dir(){ echo -en "creating LinuxGSM mods data directory ${modsdir}..." mkdir -p "${modsdir}" exitcode=$? - if [ ${exitcode} -ne 0 ]; then + if [ "${exitcode}" != 0 ]; then fn_print_fail_eol_nl fn_script_log_fatal "Creating mod download dir ${modsdir}" core_exit.sh @@ -396,7 +396,7 @@ fn_create_mods_dir(){ echo -en "creating mods install directory ${modinstalldir}..." mkdir -p "${modinstalldir}" exitcode=$? - if [ ${exitcode} -ne 0 ]; then + if [ "${exitcode}" != 0 ]; then fn_print_fail_eol_nl fn_script_log_fatal "Creating mod install directory ${modinstalldir}" core_exit.sh @@ -419,7 +419,7 @@ fn_mods_create_tmp_dir(){ mkdir -p "${modstmpdir}" exitcode=$? echo -en "creating mod download directory ${modstmpdir}..." - if [ ${exitcode} -ne 0 ]; then + if [ "${exitcode}" != 0 ]; then fn_print_fail_eol_nl fn_script_log_fatal "Creating mod download directory ${modstmpdir}" core_exit.sh @@ -436,7 +436,7 @@ fn_mods_clear_tmp_dir(){ echo -en "clearing mod download directory ${modstmpdir}..." rm -fr "${modstmpdir:?}" exitcode=$? - if [ ${exitcode} -ne 0 ]; then + if [ "${exitcode}" != 0 ]; then fn_print_fail_eol_nl fn_script_log_fatal "Clearing mod download directory ${modstmpdir}" core_exit.sh diff --git a/lgsm/functions/update_factorio.sh b/lgsm/functions/update_factorio.sh index 5ff67c448..869314d60 100644 --- a/lgsm/functions/update_factorio.sh +++ b/lgsm/functions/update_factorio.sh @@ -96,17 +96,21 @@ fn_update_factorio_compare(){ fn_update_factorio_dl exitbypass=1 command_start.sh + fn_commandname exitbypass=1 command_stop.sh + fn_commandname # If server started. else fn_stop_warning exitbypass=1 command_stop.sh + fn_commandname exitbypass=1 fn_update_factorio_dl exitbypass=1 command_start.sh + fn_commandname fi date +%s > "${lockdir}/lastupdate.lock" alert="update" @@ -131,18 +135,18 @@ fn_update_factorio_compare(){ } fn_stop_warning(){ - fn_print_warn "Updating server: SteamCMD: ${selfname} will be stopped during update" - fn_script_log_warn "Updating server: SteamCMD: ${selfname} will be stopped during update" + fn_print_warn "this game server will be stopped during update" + fn_script_log_warn "this game server will be stopped during update" totalseconds=3 for seconds in {3..1}; do - fn_print_warn "Updating server: SteamCMD: ${selfname} will be stopped during update: ${totalseconds}" + fn_print_warn "this game server will be stopped during update: ${totalseconds}" totalseconds=$((totalseconds - 1)) sleep 1 if [ "${seconds}" == "0" ]; then break fi done - fn_print_warn_nl "Updating server: SteamCMD: ${selfname} will be stopped during update" + fn_print_warn_nl "this game server will be stopped during update" } # The location where the builds are checked and downloaded. diff --git a/lgsm/functions/update_minecraft.sh b/lgsm/functions/update_minecraft.sh index 556097bd6..62cf6a80c 100644 --- a/lgsm/functions/update_minecraft.sh +++ b/lgsm/functions/update_minecraft.sh @@ -44,8 +44,10 @@ fn_update_minecraft_localbuild(){ fn_script_log_info "Forcing server restart" exitbypass=1 command_stop.sh + fn_commandname exitbypass=1 command_start.sh + fn_commandname totalseconds=0 # Check again, allow time to generate logs. while [ ! -f "${serverfiles}/logs/latest.log" ]; do @@ -157,15 +159,18 @@ fn_update_minecraft_compare(){ command_start.sh exitbypass=1 command_stop.sh + fn_commandname # If server started. else fn_stop_warning exitbypass=1 command_stop.sh + fn_commandname exitbypass=1 fn_update_minecraft_dl exitbypass=1 command_start.sh + fn_commandname fi date +%s > "${lockdir}/lastupdate.lock" alert="update" @@ -190,18 +195,18 @@ fn_update_minecraft_compare(){ } fn_stop_warning(){ - fn_print_warn "Updating server: SteamCMD: ${selfname} will be stopped during update" - fn_script_log_warn "Updating server: SteamCMD: ${selfname} will be stopped during update" + fn_print_warn "this game server will be stopped during update" + fn_script_log_warn "this game server will be stopped during update" totalseconds=3 for seconds in {3..1}; do - fn_print_warn "Updating server: SteamCMD: ${selfname} will be stopped during update: ${totalseconds}" + fn_print_warn "this game server will be stopped during update: ${totalseconds}" totalseconds=$((totalseconds - 1)) sleep 1 if [ "${seconds}" == "0" ]; then break fi done - fn_print_warn_nl "Updating server: SteamCMD: ${selfname} will be stopped during update" + fn_print_warn_nl "this game server will be stopped during update" } # The location where the builds are checked and downloaded. diff --git a/lgsm/functions/update_minecraft_bedrock.sh b/lgsm/functions/update_minecraft_bedrock.sh index 61cad6854..1e22053a1 100644 --- a/lgsm/functions/update_minecraft_bedrock.sh +++ b/lgsm/functions/update_minecraft_bedrock.sh @@ -47,13 +47,16 @@ fn_update_minecraft_localbuild(){ if [ "${status}" == "0" ]; then exitbypass=1 command_start.sh + fn_commandname sleep 3 exitbypass=1 command_stop.sh + fn_commandname # If server started. else exitbypass=1 command_stop.sh + fn_commandname fi fi @@ -123,15 +126,18 @@ fn_update_minecraft_compare(){ command_start.sh exitbypass=1 command_stop.sh + fn_commandname # If server started. else fn_stop_warning exitbypass=1 command_stop.sh + fn_commandname exitbypass=1 fn_update_minecraft_dl exitbypass=1 command_start.sh + fn_commandname fi date +%s > "${lockdir}/lastupdate.lock" alert="update" @@ -150,18 +156,18 @@ fn_update_minecraft_compare(){ } fn_stop_warning(){ - fn_print_warn "Updating server: SteamCMD: ${selfname} will be stopped during update" - fn_script_log_warn "Updating server: SteamCMD: ${selfname} will be stopped during update" + fn_print_warn "this game server will be stopped during update" + fn_script_log_warn "this game server will be stopped during update" totalseconds=3 for seconds in {3..1}; do - fn_print_warn "Updating server: SteamCMD: ${selfname} will be stopped during update: ${totalseconds}" + fn_print_warn "this game server will be stopped during update: ${totalseconds}" totalseconds=$((totalseconds - 1)) sleep 1 if [ "${seconds}" == "0" ]; then break fi done - fn_print_warn_nl "Updating server: SteamCMD: ${selfname} will be stopped during update" + fn_print_warn_nl "this game server will be stopped during update" } # The location where the builds are checked and downloaded. diff --git a/lgsm/functions/update_mta.sh b/lgsm/functions/update_mta.sh index 5aaecc122..caf6bc57b 100644 --- a/lgsm/functions/update_mta.sh +++ b/lgsm/functions/update_mta.sh @@ -40,6 +40,7 @@ fn_update_mta_localbuild(){ command_stop.sh exitbypass=1 command_start.sh + fn_commandname totalseconds=0 # Check again, allow time to generate logs. while [ ! -f "${serverfiles}/mods/deathmatch/logs/server.log" ]; do @@ -154,15 +155,18 @@ fn_update_mta_compare(){ command_start.sh exitbypass=1 command_stop.sh + fn_commandname # If server started. else fn_stop_warning exitbypass=1 command_stop.sh + fn_commandname exitbypass=1 fn_update_mta_dl exitbypass=1 command_start.sh + fn_commandname fi date +%s > "${lockdir}/lastupdate.lock" alert="update" @@ -181,18 +185,18 @@ fn_update_mta_compare(){ } fn_stop_warning(){ - fn_print_warn "Updating server: SteamCMD: ${selfname} will be stopped during update" - fn_script_log_warn "Updating server: SteamCMD: ${selfname} will be stopped during update" + fn_print_warn "this game server will be stopped during update" + fn_script_log_warn "this game server will be stopped during update" totalseconds=3 for seconds in {3..1}; do - fn_print_warn "Updating server: SteamCMD: ${selfname} will be stopped during update: ${totalseconds}" + fn_print_warn "this game server will be stopped during update: ${totalseconds}" totalseconds=$((totalseconds - 1)) sleep 1 if [ "${seconds}" == "0" ]; then break fi done - fn_print_warn_nl "Updating server: SteamCMD: ${selfname} will be stopped during update" + fn_print_warn_nl "this game server will be stopped during update" } # The location where the builds are checked and downloaded. diff --git a/lgsm/functions/update_mumble.sh b/lgsm/functions/update_mumble.sh index ee6a2b0ad..969913ba3 100644 --- a/lgsm/functions/update_mumble.sh +++ b/lgsm/functions/update_mumble.sh @@ -91,15 +91,18 @@ fn_update_mumble_compare(){ command_start.sh exitbypass=1 command_stop.sh + fn_commandname # If server started. else fn_stop_warning exitbypass=1 command_stop.sh + fn_commandname exitbypass=1 fn_update_mumble_dl exitbypass=1 command_start.sh + fn_commandname fi date +%s > "${lockdir}/lastupdate.lock" alert="update" @@ -118,18 +121,18 @@ fn_update_mumble_compare(){ } fn_stop_warning(){ - fn_print_warn "Updating server: SteamCMD: ${selfname} will be stopped during update" - fn_script_log_warn "Updating server: SteamCMD: ${selfname} will be stopped during update" + fn_print_warn "this game server will be stopped during update" + fn_script_log_warn "this game server will be stopped during update" totalseconds=3 for seconds in {3..1}; do - fn_print_warn "Updating server: SteamCMD: ${selfname} will be stopped during update: ${totalseconds}" + fn_print_warn "this game server will be stopped during update: ${totalseconds}" totalseconds=$((totalseconds - 1)) sleep 1 if [ "${seconds}" == "0" ]; then break fi done - fn_print_warn_nl "Updating server: SteamCMD: ${selfname} will be stopped during update" + fn_print_warn_nl "this game server will be stopped during update" } # The location where the builds are checked and downloaded. diff --git a/lgsm/functions/update_steamcmd.sh b/lgsm/functions/update_steamcmd.sh index 8a089c7f7..cfa6d6aa2 100644 --- a/lgsm/functions/update_steamcmd.sh +++ b/lgsm/functions/update_steamcmd.sh @@ -128,10 +128,12 @@ fn_update_steamcmd_compare(){ fn_stop_warning exitbypass=1 command_stop.sh + fn_commandname exitbypass=1 fn_update_steamcmd_dl exitbypass=1 command_start.sh + fn_commandname fi date +%s > "${lockdir}/lastupdate.lock" alert="update" @@ -206,18 +208,18 @@ fn_appmanifest_check(){ } fn_stop_warning(){ - fn_print_warn "Updating server: SteamCMD: ${selfname} will be stopped during update" - fn_script_log_warn "Updating server: SteamCMD: ${selfname} will be stopped during update" + fn_print_warn "this game server will be stopped during update" + fn_script_log_warn "this game server will be stopped during update" totalseconds=3 for seconds in {3..1}; do - fn_print_warn "Updating server: SteamCMD: ${selfname} will be stopped during update: ${totalseconds}" + fn_print_warn "this game server will be stopped during update: ${totalseconds}" totalseconds=$((totalseconds - 1)) sleep 1 if [ "${seconds}" == "0" ]; then break fi done - fn_print_warn_nl "Updating server: SteamCMD: ${selfname} will be stopped during update" + fn_print_warn_nl "this game server will be stopped during update" } # The location where the builds are checked and downloaded. @@ -235,6 +237,7 @@ if [ "${forceupdate}" == "1" ]; then date +%s > "${lockdir}/lastupdate.lock" exitbypass=1 command_start.sh + fn_commandname else fn_update_steamcmd_dl date +%s > "${lockdir}/lastupdate.lock" diff --git a/lgsm/functions/update_ts3.sh b/lgsm/functions/update_ts3.sh index a5cc0dd60..5bcf14bff 100644 --- a/lgsm/functions/update_ts3.sh +++ b/lgsm/functions/update_ts3.sh @@ -44,6 +44,7 @@ fn_update_ts3_localbuild(){ command_stop.sh exitbypass=1 command_start.sh + fn_commandname totalseconds=0 # Check again, allow time to generate logs. while [ ! -d "${serverfiles}/logs" ]||[ -z "$(find "${serverfiles}/logs/"* -name 'ts3server*_0.log' 2> /dev/null)" ]; do @@ -152,15 +153,18 @@ fn_update_ts3_compare(){ command_start.sh exitbypass=1 command_stop.sh + fn_commandname # If server started. else fn_stop_warning exitbypass=1 command_stop.sh + fn_commandname exitbypass=1 fn_update_ts3_dl exitbypass=1 command_start.sh + fn_commandname fi date +%s > "${lockdir}/lastupdate.lock" alert="update" diff --git a/linuxgsm.sh b/linuxgsm.sh index aececaed8..849c76472 100755 --- a/linuxgsm.sh +++ b/linuxgsm.sh @@ -113,7 +113,7 @@ fn_bootstrap_fetch_file(){ fi # On first try will error. On second try will fail. - if [ ${exitcode} -ne 0 ]; then + if [ "${exitcode}" != 0 ]; then if [ ${counter} -ge 2 ]; then echo -e "FAIL" if [ -f "${lgsmlog}" ]; then diff --git a/tests/tests_fctrserver.sh b/tests/tests_fctrserver.sh index da71c2b5a..adb465b1a 100644 --- a/tests/tests_fctrserver.sh +++ b/tests/tests_fctrserver.sh @@ -119,7 +119,7 @@ fn_bootstrap_fetch_file(){ fi # On first try will error. On second try will fail. - if [ ${exitcode} -ne 0 ]; then + if [ "${exitcode}" != 0 ]; then if [ ${counter} -ge 2 ]; then echo -e "FAIL" if [ -f "${lgsmlog}" ]; then @@ -389,7 +389,7 @@ else echo -en "copying _default.cfg...\c" cp -R "${configdirdefault}/config-lgsm/${gameservername}/_default.cfg" "${configdirserver}/_default.cfg" exitcode=$? - if [ ${exitcode} -ne 0 ]; then + if [ "${exitcode}" != 0 ]; then echo -e "FAIL" exit 1 else @@ -402,7 +402,7 @@ else echo -en "copying _default.cfg...\c" cp -R "${configdirdefault}/config-lgsm/${gameservername}/_default.cfg" "${configdirserver}/_default.cfg" exitcode=$? - if [ ${exitcode} -ne 0 ]; then + if [ "${exitcode}" != 0 ]; then echo -e "FAIL" exit 1 else diff --git a/tests/tests_jc2server.sh b/tests/tests_jc2server.sh index b52cf1f1b..eaf7047e9 100644 --- a/tests/tests_jc2server.sh +++ b/tests/tests_jc2server.sh @@ -120,7 +120,7 @@ fn_bootstrap_fetch_file(){ fi # On first try will error. On second try will fail. - if [ ${exitcode} -ne 0 ]; then + if [ "${exitcode}" != 0 ]; then if [ ${counter} -ge 2 ]; then echo -e "FAIL" if [ -f "${lgsmlog}" ]; then @@ -390,7 +390,7 @@ else echo -en "copying _default.cfg...\c" cp -R "${configdirdefault}/config-lgsm/${gameservername}/_default.cfg" "${configdirserver}/_default.cfg" exitcode=$? - if [ ${exitcode} -ne 0 ]; then + if [ "${exitcode}" != 0 ]; then echo -e "FAIL" exit 1 else @@ -403,7 +403,7 @@ else echo -en "copying _default.cfg...\c" cp -R "${configdirdefault}/config-lgsm/${gameservername}/_default.cfg" "${configdirserver}/_default.cfg" exitcode=$? - if [ ${exitcode} -ne 0 ]; then + if [ "${exitcode}" != 0 ]; then echo -e "FAIL" exit 1 else diff --git a/tests/tests_mcserver.sh b/tests/tests_mcserver.sh index 8d7bab6b6..74b86b0d6 100644 --- a/tests/tests_mcserver.sh +++ b/tests/tests_mcserver.sh @@ -120,7 +120,7 @@ fn_bootstrap_fetch_file(){ fi # On first try will error. On second try will fail. - if [ ${exitcode} -ne 0 ]; then + if [ "${exitcode}" != 0 ]; then if [ ${counter} -ge 2 ]; then echo -e "FAIL" if [ -f "${lgsmlog}" ]; then @@ -390,7 +390,7 @@ else echo -en "copying _default.cfg...\c" cp -R "${configdirdefault}/config-lgsm/${gameservername}/_default.cfg" "${configdirserver}/_default.cfg" exitcode=$? - if [ ${exitcode} -ne 0 ]; then + if [ "${exitcode}" != 0 ]; then echo -e "FAIL" exit 1 else @@ -403,7 +403,7 @@ else echo -en "copying _default.cfg...\c" cp -R "${configdirdefault}/config-lgsm/${gameservername}/_default.cfg" "${configdirserver}/_default.cfg" exitcode=$? - if [ ${exitcode} -ne 0 ]; then + if [ "${exitcode}" != 0 ]; then echo -e "FAIL" exit 1 else diff --git a/tests/tests_ts3server.sh b/tests/tests_ts3server.sh index fb4f889bf..d785fa0b5 100644 --- a/tests/tests_ts3server.sh +++ b/tests/tests_ts3server.sh @@ -120,7 +120,7 @@ fn_bootstrap_fetch_file(){ fi # On first try will error. On second try will fail. - if [ ${exitcode} -ne 0 ]; then + if [ "${exitcode}" != 0 ]; then if [ ${counter} -ge 2 ]; then echo -e "FAIL" if [ -f "${lgsmlog}" ]; then @@ -390,7 +390,7 @@ else echo -en "copying _default.cfg...\c" cp -R "${configdirdefault}/config-lgsm/${gameservername}/_default.cfg" "${configdirserver}/_default.cfg" exitcode=$? - if [ ${exitcode} -ne 0 ]; then + if [ "${exitcode}" != 0 ]; then echo -e "FAIL" exit 1 else @@ -403,7 +403,7 @@ else echo -en "copying _default.cfg...\c" cp -R "${configdirdefault}/config-lgsm/${gameservername}/_default.cfg" "${configdirserver}/_default.cfg" exitcode=$? - if [ ${exitcode} -ne 0 ]; then + if [ "${exitcode}" != 0 ]; then echo -e "FAIL" exit 1 else From be0c4488962e4b060cea93ec704d87d1500ef7bf Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Mon, 13 Jul 2020 00:28:05 +0100 Subject: [PATCH 418/534] feat(steamcmd): refactor how SteamCMD server downloads are handled (#2959) Handling of SteamCMD and error checking --- lgsm/functions/check.sh | 4 +- lgsm/functions/command_backup.sh | 17 +--- lgsm/functions/command_validate.sh | 68 +++----------- lgsm/functions/core_dl.sh | 96 +++++++++++++++++++ lgsm/functions/core_messages.sh | 15 +++ lgsm/functions/core_trap.sh | 3 + lgsm/functions/install_server_files.sh | 103 +-------------------- lgsm/functions/update_factorio.sh | 17 +--- lgsm/functions/update_minecraft.sh | 17 +--- lgsm/functions/update_minecraft_bedrock.sh | 17 +--- lgsm/functions/update_mta.sh | 17 +--- lgsm/functions/update_mumble.sh | 17 +--- lgsm/functions/update_steamcmd.sh | 71 +++----------- lgsm/functions/update_ts3.sh | 17 +--- 14 files changed, 147 insertions(+), 332 deletions(-) diff --git a/lgsm/functions/check.sh b/lgsm/functions/check.sh index 3e8fa90a2..b50754e3d 100644 --- a/lgsm/functions/check.sh +++ b/lgsm/functions/check.sh @@ -48,7 +48,7 @@ if [ "$(whoami)" != "root" ]; then done fi -allowed_commands_array=( BACKUP CONSOLE DEBUG DETAILS MAP-COMPRESSOR FASTDL MODS-INSTALL MODS-REMOVE MODS-UPDATE MONITOR POST-DETAILS RESTART START STOP TEST-ALERT CHANGE-PASSWORD UPDATE UPDATE-LGSM VALIDATE WIPW ) +allowed_commands_array=( BACKUP CONSOLE DEBUG DETAILS MAP-COMPRESSOR FASTDL MODS-INSTALL MODS-REMOVE MODS-UPDATE MONITOR POST-DETAILS RESTART START STOP TEST-ALERT CHANGE-PASSWORD UPDATE UPDATE-LGSM VALIDATE WIPE ) for allowed_command in "${allowed_commands_array[@]}" do if [ "${allowed_command}" == "${commandname}" ]; then @@ -82,7 +82,7 @@ do fi done -allowed_commands_array=( DEBUG START VALIDATE ) +allowed_commands_array=( DEBUG START UPDATE VALIDATE ) for allowed_command in "${allowed_commands_array[@]}" do if [ "${allowed_command}" == "${commandname}" ]; then diff --git a/lgsm/functions/command_backup.sh b/lgsm/functions/command_backup.sh index 7d62e965b..620820932 100644 --- a/lgsm/functions/command_backup.sh +++ b/lgsm/functions/command_backup.sh @@ -73,7 +73,7 @@ fn_backup_stop_server(){ # Server is running and will be stopped if stoponbackup=on or unset. # If server is started elif [ "${status}" != "0" ]; then - fn_stop_warning + fn_print_restart_warning startserver="1" exitbypass=1 command_stop.sh @@ -247,21 +247,6 @@ fn_backup_relpath() { fi } -fn_stop_warning(){ - fn_print_warn "this game server will be stopped during backup" - fn_script_log_warn "this game server will be stopped during backup" - totalseconds=3 - for seconds in {3..1}; do - fn_print_warn "this game server will be stopped during backup: ${totalseconds}" - totalseconds=$((totalseconds - 1)) - sleep 1 - if [ "${seconds}" == "0" ]; then - break - fi - done - fn_print_warn_nl "this game server will be stopped during backup" -} - # Start the server if it was stopped for the backup. fn_backup_start_server(){ if [ -n "${startserver}" ]; then diff --git a/lgsm/functions/command_validate.sh b/lgsm/functions/command_validate.sh index a00fb99ce..1ddded9c0 100644 --- a/lgsm/functions/command_validate.sh +++ b/lgsm/functions/command_validate.sh @@ -12,76 +12,30 @@ fn_commandname(){ fn_commandname fn_validate(){ - fn_script_log_warn "SteamCMD: Validate might overwrite some customised files" + fn_print_warn "Validate might overwrite some customised files" + fn_script_log_warn "${commandaction} server: Validate might overwrite some customised files" totalseconds=3 for seconds in {3..1}; do - fn_print_warn "SteamCMD: Validate might overwrite some customised files: ${totalseconds}" + fn_print_warn "Validate might overwrite some customised files: ${totalseconds}" totalseconds=$((totalseconds - 1)) sleep 1 if [ "${seconds}" == "0" ]; then break fi done - fn_print_warn_nl "SteamCMD: Validate might overwrite some customised files" - fn_print_start_nl "SteamCMD" - fn_script_log_info "Validating server: SteamCMD" - if [ -d "${steamcmddir}" ]; then - cd "${steamcmddir}" || exit - fi - # 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 + fn_print_warn_nl "Validate might overwrite some customised files" - # If GoldSrc (appid 90) servers. GoldSrc (appid 90) require extra commands. - if [ "${appid}" == "90" ]; then - # If using a specific branch. - if [ -n "${branch}" ]; then - ${unbuffer} ${steamcmdcommand} +login "${steamuser}" "${steampass}" +force_install_dir "${serverfiles}" +app_info_print 70 +app_set_config 90 mod "${appidmod}" +app_update "${appid}" "${branch}" +app_update "${appid}" -beta "${branch}" validate +quit | tee -a "${lgsmlog}" - else - ${unbuffer} ${steamcmdcommand} +login "${steamuser}" "${steampass}" +force_install_dir "${serverfiles}" +app_info_print 70 +app_set_config 90 mod "${appidmod}" +app_update "${appid}" "${branch}" +app_update "${appid}" validate +quit | tee -a "${lgsmlog}" - fi - elif [ "${shortname}" == "ac" ]; then - ${unbuffer} ${steamcmdcommand} +@sSteamCmdForcePlatformType windows +login "${steamuser}" "${steampass}" +force_install_dir "${serverfiles}" +app_update "${appid}" validate +quit | tee -a "${lgsmlog}" - # All other servers. - elif [ -n "${branch}" ]; then - ${unbuffer} ${steamcmdcommand} +login "${steamuser}" "${steampass}" +force_install_dir "${serverfiles}" +app_update "${appid}" -beta "${branch}" validate +quit | tee -a "${lgsmlog}" - else - ${unbuffer} ${steamcmdcommand} +login "${steamuser}" "${steampass}" +force_install_dir "${serverfiles}" +app_update "${appid}" validate +quit | tee -a "${lgsmlog}" - fi - - exitcode=$? - fn_print_dots "SteamCMD" - if [ "${exitcode}" != "0" ]; then - fn_print_fail_nl "SteamCMD" - fn_script_log_fatal "Validating server: SteamCMD: FAIL" - else - fn_print_ok_nl "SteamCMD" - fn_script_log_pass "Validating server: SteamCMD: OK" - fi - core_exit.sh -} - -fn_stop_warning(){ - fn_print_warn "this game server will be stopped during validate" - fn_script_log_warn "this game server will be stopped during validate" - totalseconds=3 - for seconds in {3..1}; do - fn_print_warn "this game server will be stopped during validate: ${totalseconds}" - totalseconds=$((totalseconds - 1)) - sleep 1 - if [ "${seconds}" == "0" ]; then - break - fi - done - fn_print_warn_nl "this game server will be stopped during validate" + fn_dl_steamcmd } -fn_print_dots "SteamCMD" +# The location where the builds are checked and downloaded. +remotelocation="SteamCMD" check.sh + +fn_print_dots "${remotelocation}" + if [ "${status}" != "0" ]; then - fn_stop_warning + fn_print_restart_warning exitbypass=1 command_stop.sh fn_commandname diff --git a/lgsm/functions/core_dl.sh b/lgsm/functions/core_dl.sh index 514eb3da8..6cd481506 100644 --- a/lgsm/functions/core_dl.sh +++ b/lgsm/functions/core_dl.sh @@ -19,6 +19,102 @@ functionselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" +fn_dl_steamcmd(){ + fn_print_start_nl "${remotelocation}" + fn_script_log_info "${commandaction} server: ${remotelocation}" + + if [ -d "${steamcmddir}" ]; then + cd "${steamcmddir}" || exit + fi + + # Unbuffer will allow the output of steamcmd not buffer allowing a smooth output. + # unbuffer us part of the expect package. + if [ "$(command -v unbuffer)" ]; then + unbuffer="unbuffer" + fi + + # Validate will be added as a parameter if required. + if [ "${commandname}" == "VALIDATE" ]||[ "${commandname}" == "INSTALL" ]; then + validate="validate" + fi + + # To do error checking for SteamCMD the output of steamcmd will be saved to a log. + steamcmdlog="${lgsmlogdir}/${selfname}-steamcmd.log" + + # clear previous steamcmd log + if [ -f "${steamcmdlog}" ]; then + rm -f "${steamcmdlog:?}" + fi + counter=0 + while [ "${counter}" == "0" ]||[ "${exitcode}" != "0" ]; do + counter=$((counter+1)) + # Select SteamCMD parameters + # If GoldSrc (appid 90) servers. GoldSrc (appid 90) require extra commands. + if [ "${appid}" == "90" ]; then + # If using a specific branch. + if [ -n "${branch}" ]; then + ${unbuffer} ${steamcmdcommand} +login "${steamuser}" "${steampass}" +force_install_dir "${serverfiles}" +app_set_config 90 mod "${appidmod}" +app_update "${appid}" -beta "${branch}" ${validate} +quit | tee -a "${lgsmlog}" "${steamcmdlog}" + else + ${unbuffer} ${steamcmdcommand} +login "${steamuser}" "${steampass}" +force_install_dir "${serverfiles}" +app_set_config 90 mod "${appidmod}" +app_update "${appid}" ${validate} +quit | tee -a "${lgsmlog}" "${steamcmdlog}" + fi + # Force Windows Platform type. + elif [ "${shortname}" == "ac" ]; then + if [ -n "${branch}" ]; then + ${unbuffer} ${steamcmdcommand} +@sSteamCmdForcePlatformType windows +login "${steamuser}" "${steampass}" +force_install_dir "${serverfiles}" +app_update "${appid}" -beta "${branch}" ${validate} +quit | tee -a "${lgsmlog}" "${steamcmdlog}" + else + ${unbuffer} ${steamcmdcommand} +@sSteamCmdForcePlatformType windows +login "${steamuser}" "${steampass}" +force_install_dir "${serverfiles}" +app_update "${appid}" ${validate} +quit | tee -a "${lgsmlog}" "${steamcmdlog}" + fi + # All other servers. + else + if [ -n "${branch}" ]; then + ${unbuffer} ${steamcmdcommand} +login "${steamuser}" "${steampass}" +force_install_dir "${serverfiles}" +app_update "${appid}" -beta "${branch}" ${validate} +quit | tee -a "${lgsmlog}" "${steamcmdlog}" + else + ${unbuffer} ${steamcmdcommand} +login "${steamuser}" "${steampass}" +force_install_dir "${serverfiles}" +app_update "${appid}" ${validate} +quit | tee -a "${lgsmlog}" "${steamcmdlog}" + fi + fi + + # Error checking for SteamCMD. Some errors will loop to try again and some will just exit. + exitcode=$? + if [ -n "$(grep "Error!" "${steamcmdlog}" | tail -1)" ]||[ -n "$(grep "ERROR!" "${steamcmdlog}" | tail -1)" ]; then + # Not enough space. + if [ -n "$(grep "0x202" "${steamcmdlog}" | tail -1)" ]; then + fn_print_failure_nl "${commandaction} server: ${remotelocation}: Not enough space to download server files" + fn_script_log_fatal "${commandaction} server: ${remotelocation}: Not enough space to download server files" + core_exit.sh + # Need tp purchase game. + elif [ -n "$(grep "No subscription" "${steamcmdlog}" | tail -1)" ]; then + fn_print_failure_nl "${commandaction} server: ${remotelocation}: Steam account does not have a license for the required game" + fn_script_log_fatal "${commandaction} server: ${remotelocation}: Steam account does not have a license for the required game" + core_exit.sh + # Two-factor authentication failure + elif [ -n "$(grep "Two-factor code mismatch" "${steamcmdlog}" | tail -1)" ]; then + fn_print_failure_nl "${commandaction} server: ${remotelocation}: Two-factor authentication failure" + fn_script_log_fatal "${commandaction} server: ${remotelocation}: Two-factor authentication failure" + core_exit.sh + # Update did not finish. + elif [ -n "$(grep "0x402" "${steamcmdlog}" | tail -1)" ]||[ -n "$(grep "0x602" "${steamcmdlog}" | tail -1)" ]; then + fn_print_error2_nl "${commandaction} server: ${remotelocation}: Update required but not completed - check network" + fn_script_log_error "${commandaction} server: ${remotelocation}: Update required but not completed - check network" + else + fn_print_error2_nl "${commandaction} server: ${remotelocation}: Unknown error occured" + fn_script_log_error "${commandaction} server: ${remotelocation}: Unknown error occured" + fi + elif [ "${exitcode}" != "0" ]; then + fn_print_error2_nl "${commandaction} server: ${remotelocation}: Exit code: ${exitcode}" + fn_script_log_error "${commandaction} server: ${remotelocation}: Exit code: ${exitcode}" + else + fn_print_complete_nl "${commandaction} server: ${remotelocation}" + fn_script_log_pass "${commandaction} server: ${remotelocation}" + fi + + if [ "${counter}" -gt "10" ]; then + fn_print_failure_nl "${commandaction} server: ${remotelocation}: Did not complete the download, too many retrys" + fn_script_log_fatal "${commandaction} server: ${remotelocation}: Did not complete the download, too many retrys" + core_exit.sh + fi + done +} + # Emptys contents of the LinuxGSM tmpdir. fn_clear_tmp(){ echo -en "clearing LinuxGSM tmp directory..." diff --git a/lgsm/functions/core_messages.sh b/lgsm/functions/core_messages.sh index 8a13cc6ea..ee4807bd5 100644 --- a/lgsm/functions/core_messages.sh +++ b/lgsm/functions/core_messages.sh @@ -529,3 +529,18 @@ fn_print_ascii_logo(){ echo -e "${lightyellow}LinuxGSM${default} ${lightyellow}888${default} ${lightyellow}888${default} ${lightyellow}888${default} ${lightyellow}Y8888Y${default} ${lightyellow}888${default} ${lightyellow}888${default} Y2012P88 Y8888P 888 888" echo -e "" } + +fn_print_restart_warning(){ + fn_print_warn "${selfname} will be restarted" + fn_script_log_warn "${selfname} will be restarted" + totalseconds=3 + for seconds in {3..1}; do + fn_print_warn "${selfname} will be restarted: ${totalseconds}" + totalseconds=$((totalseconds - 1)) + sleep 1 + if [ "${seconds}" == "0" ]; then + break + fi + done + fn_print_warn_nl "${selfname} will be restarted" +} diff --git a/lgsm/functions/core_trap.sh b/lgsm/functions/core_trap.sh index f943c5c33..52c00b107 100644 --- a/lgsm/functions/core_trap.sh +++ b/lgsm/functions/core_trap.sh @@ -7,6 +7,9 @@ functionselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" fn_exit_trap(){ + if [ -z "${exitcode}" ]; then + exitcode=$? + fi echo -e "" core_exit.sh } diff --git a/lgsm/functions/install_server_files.sh b/lgsm/functions/install_server_files.sh index ec5c60989..0264a7f11 100644 --- a/lgsm/functions/install_server_files.sh +++ b/lgsm/functions/install_server_files.sh @@ -68,114 +68,13 @@ fn_install_server_files(){ fn_dl_extract "${local_filedir}" "${local_filename}" "${serverfiles}" } -fn_install_server_files_steamcmd(){ - counter="0" - while [ "${counter}" == "0" ]||[ "${exitcode}" != "0" ]; do - counter=$((counter+1)) - if [ -d "${steamcmddir}" ]; then - cd "${steamcmddir}" || exit - fi - if [ "${counter}" -le "10" ]; then - # Attempt 1-4: Standard attempt. - # Attempt 5-6: Validate attempt. - # Attempt 7-8: Validate, delete long name dir. - # Attempt 9-10: Validate, delete long name dir, re-download SteamCMD. - # Attempt 11: Failure. - - if [ "${counter}" -ge "2" ]; then - fn_print_warning_nl "SteamCMD did not complete the download, retrying: Attempt ${counter}" - fn_script_log "SteamCMD did not complete the download, retrying: Attempt ${counter}" - fi - - if [ "${counter}" -ge "7" ]; then - echo -e "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 "${steamcmddir:?}" - check_steamcmd.sh - fi - - # Detects if unbuffer command is available for 32 bit distributions only. - info_distro.sh - if [ "$(command -v stdbuf 2>/dev/null)" ]&&[ "${arch}" != "x86_64" ]; then - unbuffer="stdbuf -i0 -o0 -e0" - fi - - if [ "${counter}" -le "4" ]; then - # If GoldSrc (appid 90) servers. GoldSrc (appid 90) require extra commands. - if [ "${appid}" == "90" ]; then - # If using a specific branch. - if [ -n "${branch}" ]; then - ${unbuffer} ${steamcmdcommand} +login "${steamuser}" "${steampass}" +force_install_dir "${serverfiles}" +app_set_config 90 mod "${appidmod}" +app_update "${appid}" -beta "${branch}" +quit - else - ${unbuffer} ${steamcmdcommand} +login "${steamuser}" "${steampass}" +force_install_dir "${serverfiles}" +app_set_config 90 mod "${appidmod}" +app_update "${appid}" +quit - fi - elif [ "${shortname}" == "ac" ]; then - ${unbuffer} ${steamcmdcommand} +@sSteamCmdForcePlatformType windows +login "${steamuser}" "${steampass}" +force_install_dir "${serverfiles}" +app_update "${appid}" +quit - # All other servers. - else - if [ -n "${branch}" ]; then - ${unbuffer} ${steamcmdcommand} +login "${steamuser}" "${steampass}" +force_install_dir "${serverfiles}" +app_update -beta "${branch}" +quit - else - ${unbuffer} ${steamcmdcommand} +login "${steamuser}" "${steampass}" +force_install_dir "${serverfiles}" +app_update "${appid}" +quit - fi - fi - local exitcode=$? - elif [ "${counter}" -ge "5" ]; then - # If GoldSrc (appid 90) servers. GoldSrc (appid 90) require extra commands. - if [ "${appid}" == "90" ]; then - # If using a specific branch. - if [ -n "${branch}" ]; then - ${unbuffer} ${steamcmdcommand} +login "${steamuser}" "${steampass}" +force_install_dir "${serverfiles}" +app_set_config 90 mod "${appidmod}" +app_update "${appid}" -beta "${branch}" validate +quit - else - ${unbuffer} ${steamcmdcommand} +login "${steamuser}" "${steampass}" +force_install_dir "${serverfiles}" +app_set_config 90 mod "${appidmod}" +app_update "${appid}" validate +quit - fi - local exitcode=$? - elif [ "${shortname}" == "ac" ]; then - ${unbuffer} ${steamcmdcommand} +@sSteamCmdForcePlatformType windows +login "${steamuser}" "${steampass}" +force_install_dir "${serverfiles}" +app_update "${appid}" +quit - local exitcode=$? - # All other servers. - else - if [ -n "${branch}" ]; then - ${unbuffer} ${steamcmdcommand} +login "${steamuser}" "${steampass}" +force_install_dir "${serverfiles}" +app_update "${appid}" -beta "${branch}" validate +quit - else - ${unbuffer} ${steamcmdcommand} +login "${steamuser}" "${steampass}" +force_install_dir "${serverfiles}" +app_update "${appid}" validate +quit - fi - local exitcode=$? - fi - fi - elif [ "${counter}" -ge "11" ]; then - fn_print_failure_nl "SteamCMD did not complete the download, too many retrys" - fn_script_log "SteamCMD did not complete the download, too many retrys" - break - fi - done - - # GoldSrc (appid 90) servers commonly fail to download all the server files required. - # Validating a few of times may reduce the chance of this issue. - if [ "${appid}" == "90" ]; then - fn_print_information_nl "GoldSrc servers commonly fail to download all the server files required. Validating a few of times may reduce the chance of this issue." - counter="0" - while [ "${counter}" -le "4" ]; do - counter=$((counter+1)) - if [ -n "${branch}" ]; then - ${unbuffer} ${steamcmdcommand} +login "${steamuser}" "${steampass}" +force_install_dir "${serverfiles}" +app_set_config 90 mod "${appidmod}" +app_update "${appid}" "${branch}" validate +quit - else - ${unbuffer} ${steamcmdcommand} +login "${steamuser}" "${steampass}" +force_install_dir "${serverfiles}" +app_set_config 90 mod "${appidmod}" +app_update "${appid}" validate +quit - fi - local exitcode=$? - done - fi -} - echo -e "" echo -e "${lightyellow}Installing ${gamename} Server${default}" echo -e "=================================" fn_sleep_time if [ "${appid}" ]; then - fn_install_server_files_steamcmd + fn_dl_steamcmd fi if [ "${shortname}" == "ts3" ]; then diff --git a/lgsm/functions/update_factorio.sh b/lgsm/functions/update_factorio.sh index 869314d60..e8b5c5e5c 100644 --- a/lgsm/functions/update_factorio.sh +++ b/lgsm/functions/update_factorio.sh @@ -102,7 +102,7 @@ fn_update_factorio_compare(){ fn_commandname # If server started. else - fn_stop_warning + fn_print_restart_warning exitbypass=1 command_stop.sh fn_commandname @@ -134,21 +134,6 @@ fn_update_factorio_compare(){ fi } -fn_stop_warning(){ - fn_print_warn "this game server will be stopped during update" - fn_script_log_warn "this game server will be stopped during update" - totalseconds=3 - for seconds in {3..1}; do - fn_print_warn "this game server will be stopped during update: ${totalseconds}" - totalseconds=$((totalseconds - 1)) - sleep 1 - if [ "${seconds}" == "0" ]; then - break - fi - done - fn_print_warn_nl "this game server will be stopped during update" -} - # The location where the builds are checked and downloaded. remotelocation="factorio.com" diff --git a/lgsm/functions/update_minecraft.sh b/lgsm/functions/update_minecraft.sh index 62cf6a80c..fad5d903f 100644 --- a/lgsm/functions/update_minecraft.sh +++ b/lgsm/functions/update_minecraft.sh @@ -162,7 +162,7 @@ fn_update_minecraft_compare(){ fn_commandname # If server started. else - fn_stop_warning + fn_print_restart_warning exitbypass=1 command_stop.sh fn_commandname @@ -194,21 +194,6 @@ fn_update_minecraft_compare(){ fi } -fn_stop_warning(){ - fn_print_warn "this game server will be stopped during update" - fn_script_log_warn "this game server will be stopped during update" - totalseconds=3 - for seconds in {3..1}; do - fn_print_warn "this game server will be stopped during update: ${totalseconds}" - totalseconds=$((totalseconds - 1)) - sleep 1 - if [ "${seconds}" == "0" ]; then - break - fi - done - fn_print_warn_nl "this game server will be stopped during update" -} - # The location where the builds are checked and downloaded. remotelocation="mojang.com" diff --git a/lgsm/functions/update_minecraft_bedrock.sh b/lgsm/functions/update_minecraft_bedrock.sh index 1e22053a1..8f6193302 100644 --- a/lgsm/functions/update_minecraft_bedrock.sh +++ b/lgsm/functions/update_minecraft_bedrock.sh @@ -129,7 +129,7 @@ fn_update_minecraft_compare(){ fn_commandname # If server started. else - fn_stop_warning + fn_print_restart_warning exitbypass=1 command_stop.sh fn_commandname @@ -155,21 +155,6 @@ fn_update_minecraft_compare(){ fi } -fn_stop_warning(){ - fn_print_warn "this game server will be stopped during update" - fn_script_log_warn "this game server will be stopped during update" - totalseconds=3 - for seconds in {3..1}; do - fn_print_warn "this game server will be stopped during update: ${totalseconds}" - totalseconds=$((totalseconds - 1)) - sleep 1 - if [ "${seconds}" == "0" ]; then - break - fi - done - fn_print_warn_nl "this game server will be stopped during update" -} - # The location where the builds are checked and downloaded. remotelocation="minecraft.net" diff --git a/lgsm/functions/update_mta.sh b/lgsm/functions/update_mta.sh index caf6bc57b..6f1250d6c 100644 --- a/lgsm/functions/update_mta.sh +++ b/lgsm/functions/update_mta.sh @@ -158,7 +158,7 @@ fn_update_mta_compare(){ fn_commandname # If server started. else - fn_stop_warning + fn_print_restart_warning exitbypass=1 command_stop.sh fn_commandname @@ -184,21 +184,6 @@ fn_update_mta_compare(){ fi } -fn_stop_warning(){ - fn_print_warn "this game server will be stopped during update" - fn_script_log_warn "this game server will be stopped during update" - totalseconds=3 - for seconds in {3..1}; do - fn_print_warn "this game server will be stopped during update: ${totalseconds}" - totalseconds=$((totalseconds - 1)) - sleep 1 - if [ "${seconds}" == "0" ]; then - break - fi - done - fn_print_warn_nl "this game server will be stopped during update" -} - # The location where the builds are checked and downloaded. remotelocation="linux.mtasa.com" diff --git a/lgsm/functions/update_mumble.sh b/lgsm/functions/update_mumble.sh index 969913ba3..4b60b0cae 100644 --- a/lgsm/functions/update_mumble.sh +++ b/lgsm/functions/update_mumble.sh @@ -94,7 +94,7 @@ fn_update_mumble_compare(){ fn_commandname # If server started. else - fn_stop_warning + fn_print_restart_warning exitbypass=1 command_stop.sh fn_commandname @@ -120,21 +120,6 @@ fn_update_mumble_compare(){ fi } -fn_stop_warning(){ - fn_print_warn "this game server will be stopped during update" - fn_script_log_warn "this game server will be stopped during update" - totalseconds=3 - for seconds in {3..1}; do - fn_print_warn "this game server will be stopped during update: ${totalseconds}" - totalseconds=$((totalseconds - 1)) - sleep 1 - if [ "${seconds}" == "0" ]; then - break - fi - done - fn_print_warn_nl "this game server will be stopped during update" -} - # The location where the builds are checked and downloaded. remotelocation="mumble.info" diff --git a/lgsm/functions/update_steamcmd.sh b/lgsm/functions/update_steamcmd.sh index cfa6d6aa2..1a3a1cfb3 100644 --- a/lgsm/functions/update_steamcmd.sh +++ b/lgsm/functions/update_steamcmd.sh @@ -6,38 +6,6 @@ functionselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" -fn_update_steamcmd_dl(){ - info_config.sh - # 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 - if [ -d "${steamcmddir}" ]; then - cd "${steamcmddir}" || exit - fi - - # If GoldSrc (appid 90) servers. GoldSrc (appid 90) require extra commands. - if [ "${appid}" == "90" ]; then - # If using a specific branch. - if [ -n "${branch}" ]; then - ${unbuffer} ${steamcmdcommand} +login "${steamuser}" "${steampass}" +force_install_dir "${serverfiles}" +app_set_config 90 mod "${appidmod}" +app_update "${appid}" -beta "${branch}" +quit | tee -a "${lgsmlog}" - else - ${unbuffer} ${steamcmdcommand} +login "${steamuser}" "${steampass}" +force_install_dir "${serverfiles}" +app_set_config 90 mod "${appidmod}" +app_update "${appid}" +quit | tee -a "${lgsmlog}" - fi - elif [ "${shortname}" == "ac" ]; then - ${unbuffer} ${steamcmdcommand} +@sSteamCmdForcePlatformType windows +login "${steamuser}" "${steampass}" +force_install_dir "${serverfiles}" +app_update "${appid}" +quit - # All other servers. - else - if [ -n "${branch}" ]; then - ${unbuffer} ${steamcmdcommand} +login "${steamuser}" "${steampass}" +force_install_dir "${serverfiles}" +app_update "${appid}" -beta "${branch}" +quit | tee -a "${lgsmlog}" - else - ${unbuffer} ${steamcmdcommand} +login "${steamuser}" "${steampass}" +force_install_dir "${serverfiles}" +app_update "${appid}" +quit | tee -a "${lgsmlog}" - fi - fi - fix.sh -} - fn_update_steamcmd_localbuild(){ # Gets local build info. fn_print_dots "Checking local build: ${remotelocation}" @@ -122,15 +90,15 @@ fn_update_steamcmd_compare(){ check_status.sh # If server stopped. if [ "${status}" == "0" ]; then - fn_update_steamcmd_dl + fn_dl_steamcmd # If server started. else - fn_stop_warning + fn_print_restart_warning exitbypass=1 command_stop.sh fn_commandname exitbypass=1 - fn_update_steamcmd_dl + fn_dl_steamcmd exitbypass=1 command_start.sh fn_commandname @@ -190,14 +158,14 @@ fn_appmanifest_check(){ fn_script_log_pass "Removed x${appmanifestfilewc1} appmanifest_${appid}.acf files" fn_print_info_nl "Forcing update to correct issue" fn_script_log_info "Forcing update to correct issue" - fn_update_steamcmd_dl + fn_dl_steamcmd fi elif [ "${appmanifestfilewc}" -eq "0" ]; then fn_print_error_nl "No appmanifest_${appid}.acf found" fn_script_log_error "No appmanifest_${appid}.acf found" fn_print_info_nl "Forcing update to correct issue" fn_script_log_info "Forcing update to correct issue" - fn_update_steamcmd_dl + fn_dl_steamcmd fn_appmanifest_info if [ "${appmanifestfilewc}" -eq "0" ]; then fn_print_fail_nl "Still no appmanifest_${appid}.acf found" @@ -207,44 +175,29 @@ fn_appmanifest_check(){ fi } -fn_stop_warning(){ - fn_print_warn "this game server will be stopped during update" - fn_script_log_warn "this game server will be stopped during update" - totalseconds=3 - for seconds in {3..1}; do - fn_print_warn "this game server will be stopped during update: ${totalseconds}" - totalseconds=$((totalseconds - 1)) - sleep 1 - if [ "${seconds}" == "0" ]; then - break - fi - done - fn_print_warn_nl "this game server will be stopped during update" -} - # The location where the builds are checked and downloaded. remotelocation="SteamCMD" -check_steamcmd.sh +check.sh + +fn_print_dots "${remotelocation}" if [ "${forceupdate}" == "1" ]; then # forceupdate bypasses update checks. - check_status.sh if [ "${status}" != "0" ]; then - fn_stop_warning + fn_print_restart_warning exitbypass=1 command_stop.sh - fn_update_steamcmd_dl + fn_commandname + fn_dl_steamcmd date +%s > "${lockdir}/lastupdate.lock" exitbypass=1 command_start.sh fn_commandname else - fn_update_steamcmd_dl + fn_dl_steamcmd date +%s > "${lockdir}/lastupdate.lock" fi else - fn_print_dots "Checking for update" - fn_print_dots "Checking for update: ${remotelocation}" fn_update_steamcmd_localbuild fn_update_steamcmd_remotebuild fn_update_steamcmd_compare diff --git a/lgsm/functions/update_ts3.sh b/lgsm/functions/update_ts3.sh index 5bcf14bff..4f1168bb0 100644 --- a/lgsm/functions/update_ts3.sh +++ b/lgsm/functions/update_ts3.sh @@ -156,7 +156,7 @@ fn_update_ts3_compare(){ fn_commandname # If server started. else - fn_stop_warning + fn_print_restart_warning exitbypass=1 command_stop.sh fn_commandname @@ -194,21 +194,6 @@ else core_exit.sh fi -fn_stop_warning(){ - fn_print_warn "Updating server: SteamCMD: ${selfname} will be stopped during update" - fn_script_log_warn "Updating server: SteamCMD: ${selfname} will be stopped during update" - totalseconds=3 - for seconds in {3..1}; do - fn_print_warn "Updating server: SteamCMD: ${selfname} will be stopped during update: ${totalseconds}" - totalseconds=$((totalseconds - 1)) - sleep 1 - if [ "${seconds}" == "0" ]; then - break - fi - done - fn_print_warn_nl "Updating server: SteamCMD: ${selfname} will be stopped during update" -} - # The location where the builds are checked and downloaded. remotelocation="teamspeak.com" From edacc33618766921a14f1e103268835c5c76c12d Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Mon, 13 Jul 2020 14:05:03 +0100 Subject: [PATCH 419/534] fix(update): allow steamcmd to check for update on beta branches (#2960) --- lgsm/functions/update_steamcmd.sh | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/lgsm/functions/update_steamcmd.sh b/lgsm/functions/update_steamcmd.sh index 1a3a1cfb3..3b01ff4b9 100644 --- a/lgsm/functions/update_steamcmd.sh +++ b/lgsm/functions/update_steamcmd.sh @@ -43,7 +43,12 @@ fn_update_steamcmd_remotebuild(){ find "${HOME}" -type f -name "appinfo.vdf" -exec rm -f {} \; fi - remotebuild=$(${steamcmdcommand} +login "${steamuser}" "${steampass}" +app_info_update 1 +app_info_print "${appid}" +quit | sed '1,/branches/d' | sed "1,/${branchname}/d" | grep -m 1 buildid | tr -cd '[:digit:]') + if [ -n "${branch}" ]; then + remotebuild=$(${steamcmdcommand} +login "${steamuser}" "${steampass}" +app_info_update 1 +app_info_print "${appid}" -beta "${branch}" +quit | sed '1,/branches/d' | sed "1,/${branchname}/d" | grep -m 1 buildid | tr -cd '[:digit:]') + else + remotebuild=$(${steamcmdcommand} +login "${steamuser}" "${steampass}" +app_info_update 1 +app_info_print "${appid}" +quit | sed '1,/branches/d' | sed "1,/${branchname}/d" | grep -m 1 buildid | tr -cd '[:digit:]') + fi + if [ "${installer}" != "1" ]; then fn_print_dots "Checking remote build: ${remotelocation}" # Checks if remotebuild variable has been set. From e5ee945480788c17ee76444b042cb914ba29a8c2 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Mon, 13 Jul 2020 22:50:52 +0100 Subject: [PATCH 420/534] feat(update): add betapassword option for custom steamcmd branches (#2962) --- .../config-lgsm/acserver/_default.cfg | 3 ++ .../config-lgsm/ahl2server/_default.cfg | 1 + .../config-lgsm/ahlserver/_default.cfg | 1 + .../config-lgsm/arkserver/_default.cfg | 1 + .../config-lgsm/arma3server/_default.cfg | 1 + .../config-lgsm/avserver/_default.cfg | 1 + .../config-lgsm/bb2server/_default.cfg | 1 + .../config-lgsm/bbserver/_default.cfg | 1 + .../config-lgsm/bdserver/_default.cfg | 1 + .../config-lgsm/bmdmserver/_default.cfg | 1 + .../config-lgsm/boserver/_default.cfg | 1 + .../config-lgsm/bsserver/_default.cfg | 1 + .../config-lgsm/bt1944server/_default.cfg | 1 + .../config-lgsm/btserver/_default.cfg | 1 + .../config-lgsm/ccserver/_default.cfg | 1 + .../config-lgsm/cmwserver/_default.cfg | 1 + .../config-lgsm/csczserver/_default.cfg | 1 + .../config-lgsm/csgoserver/_default.cfg | 1 + .../config-lgsm/csserver/_default.cfg | 1 + .../config-lgsm/cssserver/_default.cfg | 1 + .../config-lgsm/dabserver/_default.cfg | 1 + .../config-lgsm/dmcserver/_default.cfg | 1 + .../config-lgsm/dodserver/_default.cfg | 1 + .../config-lgsm/dodsserver/_default.cfg | 1 + .../config-lgsm/doiserver/_default.cfg | 1 + .../config-lgsm/dstserver/_default.cfg | 1 + .../config-lgsm/dysserver/_default.cfg | 1 + .../config-lgsm/ecoserver/_default.cfg | 1 + .../config-lgsm/emserver/_default.cfg | 1 + .../config-lgsm/fofserver/_default.cfg | 1 + .../config-lgsm/gesserver/_default.cfg | 1 + .../config-lgsm/gmodserver/_default.cfg | 1 + .../config-lgsm/hl2dmserver/_default.cfg | 1 + .../config-lgsm/hldmserver/_default.cfg | 1 + .../config-lgsm/hldmsserver/_default.cfg | 1 + .../config-lgsm/hwserver/_default.cfg | 1 + .../config-lgsm/insserver/_default.cfg | 1 + .../config-lgsm/inssserver/_default.cfg | 1 + .../config-lgsm/iosserver/_default.cfg | 1 + .../config-lgsm/jc2server/_default.cfg | 1 + .../config-lgsm/jc3server/_default.cfg | 1 + .../config-lgsm/kf2server/_default.cfg | 1 + .../config-lgsm/kfserver/_default.cfg | 1 + .../config-lgsm/l4d2server/_default.cfg | 1 + .../config-lgsm/l4dserver/_default.cfg | 1 + .../config-lgsm/mhserver/_default.cfg | 1 + .../config-lgsm/momserver/_default.cfg | 1 + .../config-lgsm/ndserver/_default.cfg | 1 + .../config-lgsm/nmrihserver/_default.cfg | 1 + .../config-lgsm/ns2cserver/_default.cfg | 1 + .../config-lgsm/ns2server/_default.cfg | 1 + .../config-lgsm/nsserver/_default.cfg | 1 + .../config-lgsm/onsetserver/_default.cfg | 1 + .../config-lgsm/opforserver/_default.cfg | 1 + .../config-lgsm/pcserver/_default.cfg | 1 + .../config-lgsm/pstbsserver/_default.cfg | 1 + .../config-lgsm/pvkiiserver/_default.cfg | 1 + .../config-lgsm/pzserver/_default.cfg | 1 + .../config-lgsm/qlserver/_default.cfg | 1 + .../config-lgsm/ricochetserver/_default.cfg | 1 + .../config-lgsm/roserver/_default.cfg | 1 + .../config-lgsm/rustserver/_default.cfg | 1 + .../config-lgsm/rwserver/_default.cfg | 1 + .../config-lgsm/sbotsserver/_default.cfg | 1 + .../config-lgsm/sbserver/_default.cfg | 4 +- .../config-lgsm/sdtdserver/_default.cfg | 1 + .../config-lgsm/sfcserver/_default.cfg | 1 + .../config-lgsm/solserver/_default.cfg | 1 + .../config-lgsm/squadserver/_default.cfg | 1 + .../config-lgsm/ss3server/_default.cfg | 1 + .../config-lgsm/stserver/_default.cfg | 1 + .../config-lgsm/svenserver/_default.cfg | 1 + .../config-lgsm/terrariaserver/_default.cfg | 1 + .../config-lgsm/tf2server/_default.cfg | 1 + .../config-lgsm/tfcserver/_default.cfg | 1 + .../config-lgsm/tsserver/_default.cfg | 1 + .../config-lgsm/tuserver/_default.cfg | 1 + .../config-lgsm/twserver/_default.cfg | 1 + .../config-lgsm/untserver/_default.cfg | 1 + .../config-lgsm/vsserver/_default.cfg | 1 + .../config-lgsm/wfserver/_default.cfg | 1 + .../config-lgsm/wurmserver/_default.cfg | 1 + .../config-lgsm/zmrserver/_default.cfg | 1 + .../config-lgsm/zpsserver/_default.cfg | 1 + lgsm/functions/core_dl.sh | 26 +++++++++++-- lgsm/functions/update_steamcmd.sh | 37 ++++++++++++------- 86 files changed, 134 insertions(+), 18 deletions(-) diff --git a/lgsm/config-default/config-lgsm/acserver/_default.cfg b/lgsm/config-default/config-lgsm/acserver/_default.cfg index 7bc9de9d1..9780bac87 100644 --- a/lgsm/config-default/config-lgsm/acserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/acserver/_default.cfg @@ -110,6 +110,9 @@ sleeptime="0.5" appid="302550" # SteamCMD Branch | https://docs.linuxgsm.com/steamcmd/branch branch="" +betapassword="" +# Master Server | https://docs.linuxgsm.com/steamcmd/steam-master-server +steammaster="false" ## Stop Mode | https://docs.linuxgsm.com/features/stop-mode # 1: tmux kill diff --git a/lgsm/config-default/config-lgsm/ahl2server/_default.cfg b/lgsm/config-default/config-lgsm/ahl2server/_default.cfg index c41d0c8f9..9fea1e890 100644 --- a/lgsm/config-default/config-lgsm/ahl2server/_default.cfg +++ b/lgsm/config-default/config-lgsm/ahl2server/_default.cfg @@ -138,6 +138,7 @@ querytype="protocol-valve" appid="985050" # SteamCMD Branch | https://docs.linuxgsm.com/steamcmd/branch branch="" +betapassword="" # Master Server | https://docs.linuxgsm.com/steamcmd/steam-master-server steammaster="true" diff --git a/lgsm/config-default/config-lgsm/ahlserver/_default.cfg b/lgsm/config-default/config-lgsm/ahlserver/_default.cfg index 69fc33e0c..77ffdd106 100644 --- a/lgsm/config-default/config-lgsm/ahlserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/ahlserver/_default.cfg @@ -112,6 +112,7 @@ appid="90" appidmod="cstrike" # SteamCMD Branch | https://docs.linuxgsm.com/steamcmd/branch branch="" +betapassword="" # Master Server | https://docs.linuxgsm.com/steamcmd/steam-master-server steammaster="true" diff --git a/lgsm/config-default/config-lgsm/arkserver/_default.cfg b/lgsm/config-default/config-lgsm/arkserver/_default.cfg index 11f29d17b..de68135c7 100644 --- a/lgsm/config-default/config-lgsm/arkserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/arkserver/_default.cfg @@ -114,6 +114,7 @@ sleeptime="0.5" appid="376030" # SteamCMD Branch | https://docs.linuxgsm.com/steamcmd/branch branch="" +betapassword="" # Master Server | https://docs.linuxgsm.com/steamcmd/steam-master-server steammaster="true" diff --git a/lgsm/config-default/config-lgsm/arma3server/_default.cfg b/lgsm/config-default/config-lgsm/arma3server/_default.cfg index 628634140..b67726fa8 100644 --- a/lgsm/config-default/config-lgsm/arma3server/_default.cfg +++ b/lgsm/config-default/config-lgsm/arma3server/_default.cfg @@ -127,6 +127,7 @@ sleeptime="0.5" appid="233780" # SteamCMD Branch | https://docs.linuxgsm.com/steamcmd/branch branch="" +betapassword="" # Master Server | https://docs.linuxgsm.com/steamcmd/steam-master-server steammaster="false" diff --git a/lgsm/config-default/config-lgsm/avserver/_default.cfg b/lgsm/config-default/config-lgsm/avserver/_default.cfg index f4f430e16..06274f8fa 100644 --- a/lgsm/config-default/config-lgsm/avserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/avserver/_default.cfg @@ -109,6 +109,7 @@ sleeptime="0.5" appid="565060" # SteamCMD Branch | https://docs.linuxgsm.com/steamcmd/branch branch="" +betapassword="" # Master Server | https://docs.linuxgsm.com/steamcmd/steam-master-server steammaster="false" diff --git a/lgsm/config-default/config-lgsm/bb2server/_default.cfg b/lgsm/config-default/config-lgsm/bb2server/_default.cfg index e361cb9dc..26410664b 100644 --- a/lgsm/config-default/config-lgsm/bb2server/_default.cfg +++ b/lgsm/config-default/config-lgsm/bb2server/_default.cfg @@ -117,6 +117,7 @@ sleeptime="0.5" appid="475370" # SteamCMD Branch | https://docs.linuxgsm.com/steamcmd/branch branch="" +betapassword="" # Master Server | https://docs.linuxgsm.com/steamcmd/steam-master-server steammaster="true" diff --git a/lgsm/config-default/config-lgsm/bbserver/_default.cfg b/lgsm/config-default/config-lgsm/bbserver/_default.cfg index 3fdb866c3..a66b1ddd5 100644 --- a/lgsm/config-default/config-lgsm/bbserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/bbserver/_default.cfg @@ -112,6 +112,7 @@ appid="90" appidmod="cstrike" # SteamCMD Branch | https://docs.linuxgsm.com/steamcmd/branch branch="" +betapassword="" # Master Server | https://docs.linuxgsm.com/steamcmd/steam-master-server steammaster="true" diff --git a/lgsm/config-default/config-lgsm/bdserver/_default.cfg b/lgsm/config-default/config-lgsm/bdserver/_default.cfg index ec408753e..1c1a43e40 100644 --- a/lgsm/config-default/config-lgsm/bdserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/bdserver/_default.cfg @@ -111,6 +111,7 @@ sleeptime="0.5" appid="817300" # SteamCMD Branch | https://docs.linuxgsm.com/steamcmd/branch branch="" +betapassword="" # Master Server | https://docs.linuxgsm.com/steamcmd/steam-master-server steammaster="true" diff --git a/lgsm/config-default/config-lgsm/bmdmserver/_default.cfg b/lgsm/config-default/config-lgsm/bmdmserver/_default.cfg index 61d4c3e4c..91dcd6162 100644 --- a/lgsm/config-default/config-lgsm/bmdmserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/bmdmserver/_default.cfg @@ -117,6 +117,7 @@ sleeptime="0.5" appid="346680" # SteamCMD Branch | https://docs.linuxgsm.com/steamcmd/branch branch="" +betapassword="" # Master Server | https://docs.linuxgsm.com/steamcmd/steam-master-server steammaster="true" diff --git a/lgsm/config-default/config-lgsm/boserver/_default.cfg b/lgsm/config-default/config-lgsm/boserver/_default.cfg index 698667c10..ec6169a74 100644 --- a/lgsm/config-default/config-lgsm/boserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/boserver/_default.cfg @@ -110,6 +110,7 @@ sleeptime="0.5" appid="416880" # SteamCMD Branch | https://docs.linuxgsm.com/steamcmd/branch branch="" +betapassword="" # Master Server | https://docs.linuxgsm.com/steamcmd/steam-master-server steammaster="false" diff --git a/lgsm/config-default/config-lgsm/bsserver/_default.cfg b/lgsm/config-default/config-lgsm/bsserver/_default.cfg index 69094f8ef..286b552d7 100644 --- a/lgsm/config-default/config-lgsm/bsserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/bsserver/_default.cfg @@ -121,6 +121,7 @@ sleeptime="0.5" appid="228780" # SteamCMD Branch | https://docs.linuxgsm.com/steamcmd/branch branch="" +betapassword="" # Master Server | https://docs.linuxgsm.com/steamcmd/steam-master-server steammaster="true" diff --git a/lgsm/config-default/config-lgsm/bt1944server/_default.cfg b/lgsm/config-default/config-lgsm/bt1944server/_default.cfg index d90b94523..db5f9fec8 100644 --- a/lgsm/config-default/config-lgsm/bt1944server/_default.cfg +++ b/lgsm/config-default/config-lgsm/bt1944server/_default.cfg @@ -109,6 +109,7 @@ sleeptime="0.5" appid="805140" # SteamCMD Branch | https://docs.linuxgsm.com/steamcmd/branch branch="" +betapassword="" # Master Server | https://docs.linuxgsm.com/steamcmd/steam-master-server steammaster="false" diff --git a/lgsm/config-default/config-lgsm/btserver/_default.cfg b/lgsm/config-default/config-lgsm/btserver/_default.cfg index 416e77c09..c11530de5 100644 --- a/lgsm/config-default/config-lgsm/btserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/btserver/_default.cfg @@ -104,6 +104,7 @@ sleeptime="0.5" appid="1026340" # SteamCMD Branch | https://docs.linuxgsm.com/steamcmd/branch branch="" +betapassword="" # Master Server | https://docs.linuxgsm.com/steamcmd/steam-master-server steammaster="true" diff --git a/lgsm/config-default/config-lgsm/ccserver/_default.cfg b/lgsm/config-default/config-lgsm/ccserver/_default.cfg index e9f0a70dd..f084a92ac 100644 --- a/lgsm/config-default/config-lgsm/ccserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/ccserver/_default.cfg @@ -112,6 +112,7 @@ sleeptime="0.5" appid="383410" # SteamCMD Branch | https://docs.linuxgsm.com/steamcmd/branch branch="" +betapassword="" # Master Server | https://docs.linuxgsm.com/steamcmd/steam-master-server steammaster="false" diff --git a/lgsm/config-default/config-lgsm/cmwserver/_default.cfg b/lgsm/config-default/config-lgsm/cmwserver/_default.cfg index 155ef0c17..301226304 100644 --- a/lgsm/config-default/config-lgsm/cmwserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/cmwserver/_default.cfg @@ -113,6 +113,7 @@ sleeptime="0.5" appid="220070" # SteamCMD Branch | https://docs.linuxgsm.com/steamcmd/branch branch="" +betapassword="" # Master Server | https://docs.linuxgsm.com/steamcmd/steam-master-server steammaster="false" diff --git a/lgsm/config-default/config-lgsm/csczserver/_default.cfg b/lgsm/config-default/config-lgsm/csczserver/_default.cfg index 8065dbba2..7f30de9f6 100644 --- a/lgsm/config-default/config-lgsm/csczserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/csczserver/_default.cfg @@ -112,6 +112,7 @@ appid="90" appidmod="czero" # SteamCMD Branch | https://docs.linuxgsm.com/steamcmd/branch branch="" +betapassword="" # Master Server | https://docs.linuxgsm.com/steamcmd/steam-master-server steammaster="true" diff --git a/lgsm/config-default/config-lgsm/csgoserver/_default.cfg b/lgsm/config-default/config-lgsm/csgoserver/_default.cfg index 963f873c5..08675ea98 100644 --- a/lgsm/config-default/config-lgsm/csgoserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/csgoserver/_default.cfg @@ -137,6 +137,7 @@ sleeptime="0.5" appid="740" # SteamCMD Branch | https://docs.linuxgsm.com/steamcmd/branch branch="" +betapassword="" # Master Server | https://docs.linuxgsm.com/steamcmd/steam-master-server steammaster="true" diff --git a/lgsm/config-default/config-lgsm/csserver/_default.cfg b/lgsm/config-default/config-lgsm/csserver/_default.cfg index 584e0ad77..932d8313b 100644 --- a/lgsm/config-default/config-lgsm/csserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/csserver/_default.cfg @@ -112,6 +112,7 @@ appid="90" appidmod="cstrike" # SteamCMD Branch | https://docs.linuxgsm.com/steamcmd/branch branch="" +betapassword="" # Master Server | https://docs.linuxgsm.com/steamcmd/steam-master-server steammaster="true" diff --git a/lgsm/config-default/config-lgsm/cssserver/_default.cfg b/lgsm/config-default/config-lgsm/cssserver/_default.cfg index 316eb26f8..241180118 100644 --- a/lgsm/config-default/config-lgsm/cssserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/cssserver/_default.cfg @@ -117,6 +117,7 @@ sleeptime="0.5" appid="232330" # SteamCMD Branch | https://docs.linuxgsm.com/steamcmd/branch branch="" +betapassword="" # Master Server | https://docs.linuxgsm.com/steamcmd/steam-master-server steammaster="true" diff --git a/lgsm/config-default/config-lgsm/dabserver/_default.cfg b/lgsm/config-default/config-lgsm/dabserver/_default.cfg index 612ea671f..61fc76d60 100644 --- a/lgsm/config-default/config-lgsm/dabserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/dabserver/_default.cfg @@ -112,6 +112,7 @@ sleeptime="0.5" appid="317800" # SteamCMD Branch | https://docs.linuxgsm.com/steamcmd/branch branch="" +betapassword="" # Master Server | https://docs.linuxgsm.com/steamcmd/steam-master-server steammaster="true" diff --git a/lgsm/config-default/config-lgsm/dmcserver/_default.cfg b/lgsm/config-default/config-lgsm/dmcserver/_default.cfg index 43fe8e8f1..e49c15fd3 100644 --- a/lgsm/config-default/config-lgsm/dmcserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/dmcserver/_default.cfg @@ -112,6 +112,7 @@ appid="90" appidmod="dmc" # SteamCMD Branch | https://docs.linuxgsm.com/steamcmd/branch branch="" +betapassword="" # Master Server | https://docs.linuxgsm.com/steamcmd/steam-master-server steammaster="true" diff --git a/lgsm/config-default/config-lgsm/dodserver/_default.cfg b/lgsm/config-default/config-lgsm/dodserver/_default.cfg index 0d1b447c3..cbdb2eb2e 100644 --- a/lgsm/config-default/config-lgsm/dodserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/dodserver/_default.cfg @@ -112,6 +112,7 @@ appid="90" appidmod="dod" # SteamCMD Branch | https://docs.linuxgsm.com/steamcmd/branch branch="" +betapassword="" # Master Server | https://docs.linuxgsm.com/steamcmd/steam-master-server steammaster="true" diff --git a/lgsm/config-default/config-lgsm/dodsserver/_default.cfg b/lgsm/config-default/config-lgsm/dodsserver/_default.cfg index 572046108..217ee6d2f 100644 --- a/lgsm/config-default/config-lgsm/dodsserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/dodsserver/_default.cfg @@ -112,6 +112,7 @@ sleeptime="0.5" appid="232290" # SteamCMD Branch | https://docs.linuxgsm.com/steamcmd/branch branch="" +betapassword="" # Master Server | https://docs.linuxgsm.com/steamcmd/steam-master-server steammaster="true" diff --git a/lgsm/config-default/config-lgsm/doiserver/_default.cfg b/lgsm/config-default/config-lgsm/doiserver/_default.cfg index d7916e2b5..1efbeaaf0 100644 --- a/lgsm/config-default/config-lgsm/doiserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/doiserver/_default.cfg @@ -113,6 +113,7 @@ sleeptime="0.5" appid="462310" # SteamCMD Branch | https://docs.linuxgsm.com/steamcmd/branch branch="" +betapassword="" # Master Server | https://docs.linuxgsm.com/steamcmd/steam-master-server steammaster="true" diff --git a/lgsm/config-default/config-lgsm/dstserver/_default.cfg b/lgsm/config-default/config-lgsm/dstserver/_default.cfg index 7491e7e55..70115d23a 100644 --- a/lgsm/config-default/config-lgsm/dstserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/dstserver/_default.cfg @@ -115,6 +115,7 @@ sleeptime="0.5" appid="343050" # SteamCMD Branch | https://docs.linuxgsm.com/steamcmd/branch branch="" +betapassword="" # Master Server | https://docs.linuxgsm.com/steamcmd/steam-master-server steammaster="false" diff --git a/lgsm/config-default/config-lgsm/dysserver/_default.cfg b/lgsm/config-default/config-lgsm/dysserver/_default.cfg index 28cc7fb98..17745b42a 100644 --- a/lgsm/config-default/config-lgsm/dysserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/dysserver/_default.cfg @@ -117,6 +117,7 @@ sleeptime="0.5" appid="17585" # SteamCMD Branch | https://docs.linuxgsm.com/steamcmd/branch branch="" +betapassword="" # Master Server | https://docs.linuxgsm.com/steamcmd/steam-master-server steammaster="true" diff --git a/lgsm/config-default/config-lgsm/ecoserver/_default.cfg b/lgsm/config-default/config-lgsm/ecoserver/_default.cfg index b4a4b92eb..6bb4f5a42 100644 --- a/lgsm/config-default/config-lgsm/ecoserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/ecoserver/_default.cfg @@ -104,6 +104,7 @@ sleeptime="0.5" appid="739590" # SteamCMD Branch | https://docs.linuxgsm.com/steamcmd/branch branch="" +betapassword="" # Master Server | https://docs.linuxgsm.com/steamcmd/steam-master-server steammaster="false" diff --git a/lgsm/config-default/config-lgsm/emserver/_default.cfg b/lgsm/config-default/config-lgsm/emserver/_default.cfg index 8ab7aefe1..1fd957731 100644 --- a/lgsm/config-default/config-lgsm/emserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/emserver/_default.cfg @@ -117,6 +117,7 @@ sleeptime="0.5" appid="460040" # SteamCMD Branch | https://docs.linuxgsm.com/steamcmd/branch branch="" +betapassword="" # Master Server | https://docs.linuxgsm.com/steamcmd/steam-master-server steammaster="true" diff --git a/lgsm/config-default/config-lgsm/fofserver/_default.cfg b/lgsm/config-default/config-lgsm/fofserver/_default.cfg index 49105660c..2eca809ca 100644 --- a/lgsm/config-default/config-lgsm/fofserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/fofserver/_default.cfg @@ -112,6 +112,7 @@ sleeptime="0.5" appid="295230" # SteamCMD Branch | https://docs.linuxgsm.com/steamcmd/branch branch="" +betapassword="" # Master Server | https://docs.linuxgsm.com/steamcmd/steam-master-server steammaster="true" diff --git a/lgsm/config-default/config-lgsm/gesserver/_default.cfg b/lgsm/config-default/config-lgsm/gesserver/_default.cfg index a26a5df39..f7dbe2a2f 100644 --- a/lgsm/config-default/config-lgsm/gesserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/gesserver/_default.cfg @@ -112,6 +112,7 @@ sleeptime="0.5" appid="310" # Source 2007 SDK # SteamCMD Branch | https://docs.linuxgsm.com/steamcmd/branch branch="" +betapassword="" # Master Server | https://docs.linuxgsm.com/steamcmd/steam-master-server steammaster="true" diff --git a/lgsm/config-default/config-lgsm/gmodserver/_default.cfg b/lgsm/config-default/config-lgsm/gmodserver/_default.cfg index bd254e8b1..b41c31594 100644 --- a/lgsm/config-default/config-lgsm/gmodserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/gmodserver/_default.cfg @@ -128,6 +128,7 @@ sleeptime="0.5" appid="4020" # SteamCMD Branch | https://docs.linuxgsm.com/steamcmd/branch branch="" +betapassword="" # Master Server | https://docs.linuxgsm.com/steamcmd/steam-master-server steammaster="true" diff --git a/lgsm/config-default/config-lgsm/hl2dmserver/_default.cfg b/lgsm/config-default/config-lgsm/hl2dmserver/_default.cfg index 22c3da329..c62752607 100644 --- a/lgsm/config-default/config-lgsm/hl2dmserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/hl2dmserver/_default.cfg @@ -112,6 +112,7 @@ sleeptime="0.5" appid="232370" # SteamCMD Branch | https://docs.linuxgsm.com/steamcmd/branch branch="" +betapassword="" # Master Server | https://docs.linuxgsm.com/steamcmd/steam-master-server steammaster="true" diff --git a/lgsm/config-default/config-lgsm/hldmserver/_default.cfg b/lgsm/config-default/config-lgsm/hldmserver/_default.cfg index 1a17fdd91..3cd16edba 100644 --- a/lgsm/config-default/config-lgsm/hldmserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/hldmserver/_default.cfg @@ -111,6 +111,7 @@ sleeptime="0.5" appid="90" # SteamCMD Branch | https://docs.linuxgsm.com/steamcmd/branch branch="" +betapassword="" # Master Server | https://docs.linuxgsm.com/steamcmd/steam-master-server steammaster="true" diff --git a/lgsm/config-default/config-lgsm/hldmsserver/_default.cfg b/lgsm/config-default/config-lgsm/hldmsserver/_default.cfg index 0036ec7e1..e213d2923 100644 --- a/lgsm/config-default/config-lgsm/hldmsserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/hldmsserver/_default.cfg @@ -112,6 +112,7 @@ sleeptime="0.5" appid="255470" # SteamCMD Branch | https://docs.linuxgsm.com/steamcmd/branch branch="" +betapassword="" # Master Server | https://docs.linuxgsm.com/steamcmd/steam-master-server steammaster="true" diff --git a/lgsm/config-default/config-lgsm/hwserver/_default.cfg b/lgsm/config-default/config-lgsm/hwserver/_default.cfg index 426d2d250..b3a3b1e71 100644 --- a/lgsm/config-default/config-lgsm/hwserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/hwserver/_default.cfg @@ -123,6 +123,7 @@ sleeptime="0.5" appid="405100" # SteamCMD Branch | https://docs.linuxgsm.com/steamcmd/branch branch="" +betapassword="" # Master Server | https://docs.linuxgsm.com/steamcmd/steam-master-server steammaster="false" diff --git a/lgsm/config-default/config-lgsm/insserver/_default.cfg b/lgsm/config-default/config-lgsm/insserver/_default.cfg index 98817e908..e5446b6a6 100644 --- a/lgsm/config-default/config-lgsm/insserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/insserver/_default.cfg @@ -118,6 +118,7 @@ sleeptime="0.5" appid="237410" # SteamCMD Branch | https://docs.linuxgsm.com/steamcmd/branch branch="" +betapassword="" # Master Server | https://docs.linuxgsm.com/steamcmd/steam-master-server steammaster="false" diff --git a/lgsm/config-default/config-lgsm/inssserver/_default.cfg b/lgsm/config-default/config-lgsm/inssserver/_default.cfg index 605a95fbb..1e74410e8 100644 --- a/lgsm/config-default/config-lgsm/inssserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/inssserver/_default.cfg @@ -119,6 +119,7 @@ sleeptime="0.5" appid="581330" # SteamCMD Branch | https://docs.linuxgsm.com/steamcmd/branch branch="" +betapassword="" # Master Server | https://docs.linuxgsm.com/steamcmd/steam-master-server steammaster="false" diff --git a/lgsm/config-default/config-lgsm/iosserver/_default.cfg b/lgsm/config-default/config-lgsm/iosserver/_default.cfg index acf13f368..dbd190bd2 100644 --- a/lgsm/config-default/config-lgsm/iosserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/iosserver/_default.cfg @@ -112,6 +112,7 @@ sleeptime="0.5" appid="673990" # SteamCMD Branch | https://docs.linuxgsm.com/steamcmd/branch branch="" +betapassword="" # Master Server | https://docs.linuxgsm.com/steamcmd/steam-master-server steammaster="false" diff --git a/lgsm/config-default/config-lgsm/jc2server/_default.cfg b/lgsm/config-default/config-lgsm/jc2server/_default.cfg index 81cd0ff5b..276b73d41 100644 --- a/lgsm/config-default/config-lgsm/jc2server/_default.cfg +++ b/lgsm/config-default/config-lgsm/jc2server/_default.cfg @@ -104,6 +104,7 @@ sleeptime="0.5" appid="261140" # SteamCMD Branch | https://docs.linuxgsm.com/steamcmd/branch branch="" +betapassword="" # Master Server | https://docs.linuxgsm.com/steamcmd/steam-master-server steammaster="true" diff --git a/lgsm/config-default/config-lgsm/jc3server/_default.cfg b/lgsm/config-default/config-lgsm/jc3server/_default.cfg index e3793f805..6c876ab3e 100644 --- a/lgsm/config-default/config-lgsm/jc3server/_default.cfg +++ b/lgsm/config-default/config-lgsm/jc3server/_default.cfg @@ -104,6 +104,7 @@ sleeptime="0.5" appid="619960" # SteamCMD Branch | https://docs.linuxgsm.com/steamcmd/branch branch="" +betapassword="" # Master Server | https://docs.linuxgsm.com/steamcmd/steam-master-server steammaster="false" diff --git a/lgsm/config-default/config-lgsm/kf2server/_default.cfg b/lgsm/config-default/config-lgsm/kf2server/_default.cfg index 7ad9fc930..dbf80751f 100644 --- a/lgsm/config-default/config-lgsm/kf2server/_default.cfg +++ b/lgsm/config-default/config-lgsm/kf2server/_default.cfg @@ -110,6 +110,7 @@ sleeptime="0.5" appid="232130" # SteamCMD Branch | https://docs.linuxgsm.com/steamcmd/branch branch="" +betapassword="" # Master Server | https://docs.linuxgsm.com/steamcmd/steam-master-server steammaster="false" diff --git a/lgsm/config-default/config-lgsm/kfserver/_default.cfg b/lgsm/config-default/config-lgsm/kfserver/_default.cfg index f4ef0a7f7..83d253d58 100644 --- a/lgsm/config-default/config-lgsm/kfserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/kfserver/_default.cfg @@ -116,6 +116,7 @@ sleeptime="0.5" appid="215360" # SteamCMD Branch | https://docs.linuxgsm.com/steamcmd/branch branch="" +betapassword="" # Master Server | https://docs.linuxgsm.com/steamcmd/steam-master-server steammaster="false" diff --git a/lgsm/config-default/config-lgsm/l4d2server/_default.cfg b/lgsm/config-default/config-lgsm/l4d2server/_default.cfg index 4852b2231..425b5ff28 100644 --- a/lgsm/config-default/config-lgsm/l4d2server/_default.cfg +++ b/lgsm/config-default/config-lgsm/l4d2server/_default.cfg @@ -111,6 +111,7 @@ sleeptime="0.5" appid="222860" # SteamCMD Branch | https://docs.linuxgsm.com/steamcmd/branch branch="" +betapassword="" # Master Server | https://docs.linuxgsm.com/steamcmd/steam-master-server steammaster="false" diff --git a/lgsm/config-default/config-lgsm/l4dserver/_default.cfg b/lgsm/config-default/config-lgsm/l4dserver/_default.cfg index 158605d2f..e31ad4cb7 100644 --- a/lgsm/config-default/config-lgsm/l4dserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/l4dserver/_default.cfg @@ -111,6 +111,7 @@ sleeptime="0.5" appid="222840" # SteamCMD Branch | https://docs.linuxgsm.com/steamcmd/branch branch="" +betapassword="" # Master Server | https://docs.linuxgsm.com/steamcmd/steam-master-server steammaster="false" diff --git a/lgsm/config-default/config-lgsm/mhserver/_default.cfg b/lgsm/config-default/config-lgsm/mhserver/_default.cfg index 255ecdd04..e5cbea076 100644 --- a/lgsm/config-default/config-lgsm/mhserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/mhserver/_default.cfg @@ -112,6 +112,7 @@ sleeptime="0.5" appid="629800" # SteamCMD Branch | https://docs.linuxgsm.com/steamcmd/branch branch="" +betapassword="" # Master Server | https://docs.linuxgsm.com/steamcmd/steam-master-server steammaster="false" diff --git a/lgsm/config-default/config-lgsm/momserver/_default.cfg b/lgsm/config-default/config-lgsm/momserver/_default.cfg index 7e89d5b9f..2e5a42a98 100644 --- a/lgsm/config-default/config-lgsm/momserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/momserver/_default.cfg @@ -110,6 +110,7 @@ sleeptime="0.5" appid="897590" # SteamCMD Branch | https://docs.linuxgsm.com/steamcmd/branch branch="" +betapassword="" # Master Server | https://docs.linuxgsm.com/steamcmd/steam-master-server steammaster="false" diff --git a/lgsm/config-default/config-lgsm/ndserver/_default.cfg b/lgsm/config-default/config-lgsm/ndserver/_default.cfg index 084bcc20b..f7c168a2f 100644 --- a/lgsm/config-default/config-lgsm/ndserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/ndserver/_default.cfg @@ -112,6 +112,7 @@ sleeptime="0.5" appid="111710" # SteamCMD Branch | https://docs.linuxgsm.com/steamcmd/branch branch="" +betapassword="" # Master Server | https://docs.linuxgsm.com/steamcmd/steam-master-server steammaster="true" diff --git a/lgsm/config-default/config-lgsm/nmrihserver/_default.cfg b/lgsm/config-default/config-lgsm/nmrihserver/_default.cfg index 261d74fed..94dd089a7 100644 --- a/lgsm/config-default/config-lgsm/nmrihserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/nmrihserver/_default.cfg @@ -117,6 +117,7 @@ sleeptime="0.5" appid="317670" # SteamCMD Branch | https://docs.linuxgsm.com/steamcmd/branch branch="" +betapassword="" # Master Server | https://docs.linuxgsm.com/steamcmd/steam-master-server steammaster="true" diff --git a/lgsm/config-default/config-lgsm/ns2cserver/_default.cfg b/lgsm/config-default/config-lgsm/ns2cserver/_default.cfg index 6e857c346..b2db90679 100644 --- a/lgsm/config-default/config-lgsm/ns2cserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/ns2cserver/_default.cfg @@ -119,6 +119,7 @@ sleeptime="0.5" appid="313900" # SteamCMD Branch | https://docs.linuxgsm.com/steamcmd/branch branch="" +betapassword="" # Master Server | https://docs.linuxgsm.com/steamcmd/steam-master-server steammaster="true" diff --git a/lgsm/config-default/config-lgsm/ns2server/_default.cfg b/lgsm/config-default/config-lgsm/ns2server/_default.cfg index 01cb086f9..f6d6fbf77 100644 --- a/lgsm/config-default/config-lgsm/ns2server/_default.cfg +++ b/lgsm/config-default/config-lgsm/ns2server/_default.cfg @@ -123,6 +123,7 @@ sleeptime="0.5" appid="4940" # SteamCMD Branch | https://docs.linuxgsm.com/steamcmd/branch branch="" +betapassword="" # Master Server | https://docs.linuxgsm.com/steamcmd/steam-master-server steammaster="true" diff --git a/lgsm/config-default/config-lgsm/nsserver/_default.cfg b/lgsm/config-default/config-lgsm/nsserver/_default.cfg index 446e8ab8a..ef3f33c32 100644 --- a/lgsm/config-default/config-lgsm/nsserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/nsserver/_default.cfg @@ -112,6 +112,7 @@ appid="90" appidmod="cstrike" # SteamCMD Branch | https://docs.linuxgsm.com/steamcmd/branch branch="" +betapassword="" # Master Server | https://docs.linuxgsm.com/steamcmd/steam-master-server steammaster="true" diff --git a/lgsm/config-default/config-lgsm/onsetserver/_default.cfg b/lgsm/config-default/config-lgsm/onsetserver/_default.cfg index 7401de91a..dbe7f5bfa 100644 --- a/lgsm/config-default/config-lgsm/onsetserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/onsetserver/_default.cfg @@ -104,6 +104,7 @@ sleeptime="0.5" appid="1204170" # SteamCMD Branch | https://docs.linuxgsm.com/steamcmd/branch branch="" +betapassword="" # Master Server | https://docs.linuxgsm.com/steamcmd/steam-master-server steammaster="false" diff --git a/lgsm/config-default/config-lgsm/opforserver/_default.cfg b/lgsm/config-default/config-lgsm/opforserver/_default.cfg index a341627a9..a5953dca2 100644 --- a/lgsm/config-default/config-lgsm/opforserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/opforserver/_default.cfg @@ -112,6 +112,7 @@ appid="90" appidmod="gearbox" # SteamCMD Branch | https://docs.linuxgsm.com/steamcmd/branch branch="" +betapassword="" # Master Server | https://docs.linuxgsm.com/steamcmd/steam-master-server steammaster="true" diff --git a/lgsm/config-default/config-lgsm/pcserver/_default.cfg b/lgsm/config-default/config-lgsm/pcserver/_default.cfg index fc74fbe5e..4ebe2e469 100644 --- a/lgsm/config-default/config-lgsm/pcserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/pcserver/_default.cfg @@ -104,6 +104,7 @@ sleeptime="0.5" appid="332670" # SteamCMD Branch | https://docs.linuxgsm.com/steamcmd/branch branch="" +betapassword="" # Master Server | https://docs.linuxgsm.com/steamcmd/steam-master-server steammaster="false" diff --git a/lgsm/config-default/config-lgsm/pstbsserver/_default.cfg b/lgsm/config-default/config-lgsm/pstbsserver/_default.cfg index 1a80e7a02..736d83ddf 100644 --- a/lgsm/config-default/config-lgsm/pstbsserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/pstbsserver/_default.cfg @@ -114,6 +114,7 @@ sleeptime="0.5" appid="746200" # SteamCMD Branch | https://docs.linuxgsm.com/steamcmd/branch branch="" +betapassword="" # Master Server | https://docs.linuxgsm.com/steamcmd/steam-master-server steammaster="false" diff --git a/lgsm/config-default/config-lgsm/pvkiiserver/_default.cfg b/lgsm/config-default/config-lgsm/pvkiiserver/_default.cfg index 0118ecaa4..7064ce1cc 100644 --- a/lgsm/config-default/config-lgsm/pvkiiserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/pvkiiserver/_default.cfg @@ -112,6 +112,7 @@ sleeptime="0.5" appid="17575" # SteamCMD Branch | https://docs.linuxgsm.com/steamcmd/branch branch="" +betapassword="" # Master Server | https://docs.linuxgsm.com/steamcmd/steam-master-server steammaster="true" diff --git a/lgsm/config-default/config-lgsm/pzserver/_default.cfg b/lgsm/config-default/config-lgsm/pzserver/_default.cfg index da9ae479d..e0a8c90bc 100644 --- a/lgsm/config-default/config-lgsm/pzserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/pzserver/_default.cfg @@ -108,6 +108,7 @@ sleeptime="0.5" appid="380870" # SteamCMD Branch | https://docs.linuxgsm.com/steamcmd/branch branch="" +betapassword="" # Master Server | https://docs.linuxgsm.com/steamcmd/steam-master-server steammaster="false" diff --git a/lgsm/config-default/config-lgsm/qlserver/_default.cfg b/lgsm/config-default/config-lgsm/qlserver/_default.cfg index 3a5471ad6..60f588d0c 100644 --- a/lgsm/config-default/config-lgsm/qlserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/qlserver/_default.cfg @@ -106,6 +106,7 @@ sleeptime="0.5" appid="349090" # SteamCMD Branch | https://docs.linuxgsm.com/steamcmd/branch branch="" +betapassword="" # Master Server | https://docs.linuxgsm.com/steamcmd/steam-master-server steammaster="true" diff --git a/lgsm/config-default/config-lgsm/ricochetserver/_default.cfg b/lgsm/config-default/config-lgsm/ricochetserver/_default.cfg index b825fb75b..7a49e0bd8 100644 --- a/lgsm/config-default/config-lgsm/ricochetserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/ricochetserver/_default.cfg @@ -112,6 +112,7 @@ appid="90" appidmod="ricochet" # SteamCMD Branch | https://docs.linuxgsm.com/steamcmd/branch branch="" +betapassword="" # Master Server | https://docs.linuxgsm.com/steamcmd/steam-master-server steammaster="true" diff --git a/lgsm/config-default/config-lgsm/roserver/_default.cfg b/lgsm/config-default/config-lgsm/roserver/_default.cfg index 3cbfd5888..19b96eecb 100644 --- a/lgsm/config-default/config-lgsm/roserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/roserver/_default.cfg @@ -112,6 +112,7 @@ sleeptime="0.5" appid="223250" # SteamCMD Branch | https://docs.linuxgsm.com/steamcmd/branch branch="" +betapassword="" # Master Server | https://docs.linuxgsm.com/steamcmd/steam-master-server steammaster="false" diff --git a/lgsm/config-default/config-lgsm/rustserver/_default.cfg b/lgsm/config-default/config-lgsm/rustserver/_default.cfg index cf70cdae7..ce86abd7a 100644 --- a/lgsm/config-default/config-lgsm/rustserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/rustserver/_default.cfg @@ -136,6 +136,7 @@ sleeptime="0.5" appid="258550" # SteamCMD Branch | https://docs.linuxgsm.com/steamcmd/branch branch="" +betapassword="" # Master Server | https://docs.linuxgsm.com/steamcmd/steam-master-server steammaster="false" diff --git a/lgsm/config-default/config-lgsm/rwserver/_default.cfg b/lgsm/config-default/config-lgsm/rwserver/_default.cfg index 95c37ef2d..36fdd4210 100644 --- a/lgsm/config-default/config-lgsm/rwserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/rwserver/_default.cfg @@ -107,6 +107,7 @@ sleeptime="0.5" appid="339010" # SteamCMD Branch | https://docs.linuxgsm.com/steamcmd/branch branch="" +betapassword="" # Master Server | https://docs.linuxgsm.com/steamcmd/steam-master-server steammaster="false" diff --git a/lgsm/config-default/config-lgsm/sbotsserver/_default.cfg b/lgsm/config-default/config-lgsm/sbotsserver/_default.cfg index 6145c9905..072036513 100644 --- a/lgsm/config-default/config-lgsm/sbotsserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/sbotsserver/_default.cfg @@ -112,6 +112,7 @@ sleeptime="0.5" appid="974130" # SteamCMD Branch | https://docs.linuxgsm.com/steamcmd/branch branch="" +betapassword="" # Master Server | https://docs.linuxgsm.com/steamcmd/steam-master-server steammaster="false" diff --git a/lgsm/config-default/config-lgsm/sbserver/_default.cfg b/lgsm/config-default/config-lgsm/sbserver/_default.cfg index f9ae836d1..aff6f3558 100644 --- a/lgsm/config-default/config-lgsm/sbserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/sbserver/_default.cfg @@ -111,7 +111,9 @@ sleeptime="0.5" appid="211820" # SteamCMD Branch | https://docs.linuxgsm.com/steamcmd/branch branch="" -steammaster="flase" +betapassword="" +# Master Server | https://docs.linuxgsm.com/steamcmd/steam-master-server +steammaster="false" ## Stop Mode | https://docs.linuxgsm.com/features/stop-mode # 1: tmux kill diff --git a/lgsm/config-default/config-lgsm/sdtdserver/_default.cfg b/lgsm/config-default/config-lgsm/sdtdserver/_default.cfg index 6269e6150..ba1449654 100644 --- a/lgsm/config-default/config-lgsm/sdtdserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/sdtdserver/_default.cfg @@ -107,6 +107,7 @@ sleeptime="0.5" appid="294420" # SteamCMD Branch | https://docs.linuxgsm.com/steamcmd/branch branch="" +betapassword="" # Master Server | https://docs.linuxgsm.com/steamcmd/steam-master-server steammaster="true" diff --git a/lgsm/config-default/config-lgsm/sfcserver/_default.cfg b/lgsm/config-default/config-lgsm/sfcserver/_default.cfg index 2203ba14b..736aac82a 100644 --- a/lgsm/config-default/config-lgsm/sfcserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/sfcserver/_default.cfg @@ -112,6 +112,7 @@ sleeptime="0.5" appid="244310" # Source 2013 SDK # SteamCMD Branch | https://docs.linuxgsm.com/steamcmd/branch branch="" +betapassword="" # Master Server | https://docs.linuxgsm.com/steamcmd/steam-master-server steammaster="true" diff --git a/lgsm/config-default/config-lgsm/solserver/_default.cfg b/lgsm/config-default/config-lgsm/solserver/_default.cfg index d1f853dca..9f34b9732 100644 --- a/lgsm/config-default/config-lgsm/solserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/solserver/_default.cfg @@ -105,6 +105,7 @@ sleeptime="0.5" appid="638500" # SteamCMD Branch | https://docs.linuxgsm.com/steamcmd/branch branch="" +betapassword="" ## Stop Mode | https://docs.linuxgsm.com/features/stop-mode # 1: tmux kill diff --git a/lgsm/config-default/config-lgsm/squadserver/_default.cfg b/lgsm/config-default/config-lgsm/squadserver/_default.cfg index 81eb50c01..5e5e6bbfa 100644 --- a/lgsm/config-default/config-lgsm/squadserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/squadserver/_default.cfg @@ -109,6 +109,7 @@ sleeptime="0.5" appid="403240" # SteamCMD Branch | https://docs.linuxgsm.com/steamcmd/branch branch="" +betapassword="" # Master Server | https://docs.linuxgsm.com/steamcmd/steam-master-server steammaster="false" diff --git a/lgsm/config-default/config-lgsm/ss3server/_default.cfg b/lgsm/config-default/config-lgsm/ss3server/_default.cfg index 9032678a4..f4f355ea5 100644 --- a/lgsm/config-default/config-lgsm/ss3server/_default.cfg +++ b/lgsm/config-default/config-lgsm/ss3server/_default.cfg @@ -108,6 +108,7 @@ sleeptime="0.5" appid="41080" # SteamCMD Branch | https://docs.linuxgsm.com/steamcmd/branch branch="" +betapassword="" # Master Server | https://docs.linuxgsm.com/steamcmd/steam-master-server steammaster="false" diff --git a/lgsm/config-default/config-lgsm/stserver/_default.cfg b/lgsm/config-default/config-lgsm/stserver/_default.cfg index 581c1481a..f1dff6076 100644 --- a/lgsm/config-default/config-lgsm/stserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/stserver/_default.cfg @@ -114,6 +114,7 @@ sleeptime="0.5" appid="600760" # SteamCMD Branch | https://docs.linuxgsm.com/steamcmd/branch branch="" +betapassword="" # Master Server | https://docs.linuxgsm.com/steamcmd/steam-master-server steammaster="false" diff --git a/lgsm/config-default/config-lgsm/svenserver/_default.cfg b/lgsm/config-default/config-lgsm/svenserver/_default.cfg index 72b3acadd..c6f83597e 100644 --- a/lgsm/config-default/config-lgsm/svenserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/svenserver/_default.cfg @@ -111,6 +111,7 @@ sleeptime="0.5" appid="276060" # SteamCMD Branch | https://docs.linuxgsm.com/steamcmd/branch branch="" +betapassword="" # Master Server | https://docs.linuxgsm.com/steamcmd/steam-master-server steammaster="true" diff --git a/lgsm/config-default/config-lgsm/terrariaserver/_default.cfg b/lgsm/config-default/config-lgsm/terrariaserver/_default.cfg index 3f941122f..4f8d9b871 100644 --- a/lgsm/config-default/config-lgsm/terrariaserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/terrariaserver/_default.cfg @@ -111,6 +111,7 @@ sleeptime="0.5" appid="105600" # SteamCMD Branch | https://docs.linuxgsm.com/steamcmd/branch branch="" +betapassword="" # Master Server | https://docs.linuxgsm.com/steamcmd/steam-master-server steammaster="false" diff --git a/lgsm/config-default/config-lgsm/tf2server/_default.cfg b/lgsm/config-default/config-lgsm/tf2server/_default.cfg index 31eefeb12..cc0da1d9b 100644 --- a/lgsm/config-default/config-lgsm/tf2server/_default.cfg +++ b/lgsm/config-default/config-lgsm/tf2server/_default.cfg @@ -117,6 +117,7 @@ sleeptime="0.5" appid="232250" # SteamCMD Branch | https://docs.linuxgsm.com/steamcmd/branch branch="" +betapassword="" # Master Server | https://docs.linuxgsm.com/steamcmd/steam-master-server steammaster="true" diff --git a/lgsm/config-default/config-lgsm/tfcserver/_default.cfg b/lgsm/config-default/config-lgsm/tfcserver/_default.cfg index ccd4988e0..d0cdd1a9d 100644 --- a/lgsm/config-default/config-lgsm/tfcserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/tfcserver/_default.cfg @@ -112,6 +112,7 @@ appid="90" appidmod="tfc" # SteamCMD Branch | https://docs.linuxgsm.com/steamcmd/branch branch="" +betapassword="" # Master Server | https://docs.linuxgsm.com/steamcmd/steam-master-server steammaster="true" diff --git a/lgsm/config-default/config-lgsm/tsserver/_default.cfg b/lgsm/config-default/config-lgsm/tsserver/_default.cfg index f73622b42..e52209385 100644 --- a/lgsm/config-default/config-lgsm/tsserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/tsserver/_default.cfg @@ -112,6 +112,7 @@ appid="90" appidmod="cstrike" # SteamCMD Branch | https://docs.linuxgsm.com/steamcmd/branch branch="" +betapassword="" # Master Server | https://docs.linuxgsm.com/steamcmd/steam-master-server steammaster="true" diff --git a/lgsm/config-default/config-lgsm/tuserver/_default.cfg b/lgsm/config-default/config-lgsm/tuserver/_default.cfg index ff4165e45..ba17f9e13 100644 --- a/lgsm/config-default/config-lgsm/tuserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/tuserver/_default.cfg @@ -114,6 +114,7 @@ sleeptime="0.5" appid="439660" # SteamCMD Branch | https://docs.linuxgsm.com/steamcmd/branch branch="" +betapassword="" # Master Server | https://docs.linuxgsm.com/steamcmd/steam-master-server steammaster="false" diff --git a/lgsm/config-default/config-lgsm/twserver/_default.cfg b/lgsm/config-default/config-lgsm/twserver/_default.cfg index 461c97059..8448da0f8 100644 --- a/lgsm/config-default/config-lgsm/twserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/twserver/_default.cfg @@ -111,6 +111,7 @@ sleeptime="0.5" appid="380840" # SteamCMD Branch | https://docs.linuxgsm.com/steamcmd/branch branch="" +betapassword="" # Master Server | https://docs.linuxgsm.com/steamcmd/steam-master-server steammaster="false" diff --git a/lgsm/config-default/config-lgsm/untserver/_default.cfg b/lgsm/config-default/config-lgsm/untserver/_default.cfg index ef0fe4c24..f7cc5d989 100644 --- a/lgsm/config-default/config-lgsm/untserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/untserver/_default.cfg @@ -114,6 +114,7 @@ sleeptime="0.5" appid="1110390" # SteamCMD Branch | https://docs.linuxgsm.com/steamcmd/branch branch="" +betapassword="" # Master Server | https://docs.linuxgsm.com/steamcmd/steam-master-server steammaster="false" diff --git a/lgsm/config-default/config-lgsm/vsserver/_default.cfg b/lgsm/config-default/config-lgsm/vsserver/_default.cfg index 1eaa9ff86..5f28ad5c9 100644 --- a/lgsm/config-default/config-lgsm/vsserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/vsserver/_default.cfg @@ -112,6 +112,7 @@ appid="90" appidmod="cstrike" # SteamCMD Branch | https://docs.linuxgsm.com/steamcmd/branch branch="" +betapassword="" # Master Server | https://docs.linuxgsm.com/steamcmd/steam-master-server steammaster="true" diff --git a/lgsm/config-default/config-lgsm/wfserver/_default.cfg b/lgsm/config-default/config-lgsm/wfserver/_default.cfg index 1ddbd7746..c518fde43 100644 --- a/lgsm/config-default/config-lgsm/wfserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/wfserver/_default.cfg @@ -129,6 +129,7 @@ appid="1136510" appidmod="warfork" # SteamCMD Branch | https://docs.linuxgsm.com/steamcmd/branch branch="" +betapassword="" # Master Server | https://docs.linuxgsm.com/steamcmd/steam-master-server steammaster="true" diff --git a/lgsm/config-default/config-lgsm/wurmserver/_default.cfg b/lgsm/config-default/config-lgsm/wurmserver/_default.cfg index e131fc28b..dcf980984 100644 --- a/lgsm/config-default/config-lgsm/wurmserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/wurmserver/_default.cfg @@ -103,6 +103,7 @@ sleeptime="0.5" appid="402370" # SteamCMD Branch | https://docs.linuxgsm.com/steamcmd/branch branch="" +betapassword="" # Master Server | https://docs.linuxgsm.com/steamcmd/steam-master-server steammaster="false" diff --git a/lgsm/config-default/config-lgsm/zmrserver/_default.cfg b/lgsm/config-default/config-lgsm/zmrserver/_default.cfg index b22f79fc2..b2271daad 100644 --- a/lgsm/config-default/config-lgsm/zmrserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/zmrserver/_default.cfg @@ -112,6 +112,7 @@ sleeptime="0.5" appid="244310" # Source 2013 SDK # SteamCMD Branch | https://docs.linuxgsm.com/steamcmd/branch branch="" +betapassword="" # Master Server | https://docs.linuxgsm.com/steamcmd/steam-master-server steammaster="true" diff --git a/lgsm/config-default/config-lgsm/zpsserver/_default.cfg b/lgsm/config-default/config-lgsm/zpsserver/_default.cfg index 279f7258a..41cea0c00 100644 --- a/lgsm/config-default/config-lgsm/zpsserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/zpsserver/_default.cfg @@ -117,6 +117,7 @@ sleeptime="0.5" appid="17505" # SteamCMD Branch | https://docs.linuxgsm.com/steamcmd/branch branch="" +betapassword="" # Master Server | https://docs.linuxgsm.com/steamcmd/steam-master-server steammaster="true" diff --git a/lgsm/functions/core_dl.sh b/lgsm/functions/core_dl.sh index 6cd481506..a6521ac03 100644 --- a/lgsm/functions/core_dl.sh +++ b/lgsm/functions/core_dl.sh @@ -22,7 +22,14 @@ functionselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" fn_dl_steamcmd(){ fn_print_start_nl "${remotelocation}" fn_script_log_info "${commandaction} server: ${remotelocation}" - + if [ -n "${branch}" ]; then + echo -e "Branch: ${branch}" + fn_script_log_info "Branch: ${branch}" + fi + if [ -n "${betapassword}" ]; then + echo -e "Branch password: ${betapassword}" + fn_script_log_info "Branch password: ${betapassword}" + fi if [ -d "${steamcmddir}" ]; then cd "${steamcmddir}" || exit fi @@ -52,21 +59,27 @@ fn_dl_steamcmd(){ # If GoldSrc (appid 90) servers. GoldSrc (appid 90) require extra commands. if [ "${appid}" == "90" ]; then # If using a specific branch. - if [ -n "${branch}" ]; then + if [ -n "${branch}" ]&&[ -n "${betapassword}" ]; then + ${unbuffer} ${steamcmdcommand} +login "${steamuser}" "${steampass}" +force_install_dir "${serverfiles}" +app_set_config 90 mod "${appidmod}" +app_update "${appid}" -beta "${branch}" -betapassword "${betapassword}" ${validate} +quit | tee -a "${lgsmlog}" "${steamcmdlog}" + elif [ -n "${branch}" ]; then ${unbuffer} ${steamcmdcommand} +login "${steamuser}" "${steampass}" +force_install_dir "${serverfiles}" +app_set_config 90 mod "${appidmod}" +app_update "${appid}" -beta "${branch}" ${validate} +quit | tee -a "${lgsmlog}" "${steamcmdlog}" else ${unbuffer} ${steamcmdcommand} +login "${steamuser}" "${steampass}" +force_install_dir "${serverfiles}" +app_set_config 90 mod "${appidmod}" +app_update "${appid}" ${validate} +quit | tee -a "${lgsmlog}" "${steamcmdlog}" fi # Force Windows Platform type. elif [ "${shortname}" == "ac" ]; then - if [ -n "${branch}" ]; then + if [ -n "${branch}" ]&&[ -n "${betapassword}" ]; then + ${unbuffer} ${steamcmdcommand} +@sSteamCmdForcePlatformType windows +login "${steamuser}" "${steampass}" +force_install_dir "${serverfiles}" +app_update "${appid}" -beta "${branch}" -betapassword "${betapassword}" ${validate} +quit | tee -a "${lgsmlog}" "${steamcmdlog}" + elif [ -n "${branch}" ]; then ${unbuffer} ${steamcmdcommand} +@sSteamCmdForcePlatformType windows +login "${steamuser}" "${steampass}" +force_install_dir "${serverfiles}" +app_update "${appid}" -beta "${branch}" ${validate} +quit | tee -a "${lgsmlog}" "${steamcmdlog}" else ${unbuffer} ${steamcmdcommand} +@sSteamCmdForcePlatformType windows +login "${steamuser}" "${steampass}" +force_install_dir "${serverfiles}" +app_update "${appid}" ${validate} +quit | tee -a "${lgsmlog}" "${steamcmdlog}" fi # All other servers. else - if [ -n "${branch}" ]; then + if [ -n "${branch}" ]&&[ -n "${betapassword}" ]; then + ${unbuffer} ${steamcmdcommand} +login "${steamuser}" "${steampass}" +force_install_dir "${serverfiles}" +app_update "${appid}" -beta "${branch}" -betapassword "${betapassword}" ${validate} +quit | tee -a "${lgsmlog}" "${steamcmdlog}" + elif [ -n "${branch}" ]; then ${unbuffer} ${steamcmdcommand} +login "${steamuser}" "${steampass}" +force_install_dir "${serverfiles}" +app_update "${appid}" -beta "${branch}" ${validate} +quit | tee -a "${lgsmlog}" "${steamcmdlog}" else ${unbuffer} ${steamcmdcommand} +login "${steamuser}" "${steampass}" +force_install_dir "${serverfiles}" +app_update "${appid}" ${validate} +quit | tee -a "${lgsmlog}" "${steamcmdlog}" @@ -91,6 +104,11 @@ fn_dl_steamcmd(){ fn_print_failure_nl "${commandaction} server: ${remotelocation}: Two-factor authentication failure" fn_script_log_fatal "${commandaction} server: ${remotelocation}: Two-factor authentication failure" core_exit.sh + # Incorrect Branch password + elif [ -n "$(grep "Password check for AppId" "${steamcmdlog}" | tail -1)" ]; then + fn_print_failure_nl "${commandaction} server: ${remotelocation}: betapassword is incorrect" + fn_script_log_fatal "${commandaction} server: ${remotelocation}: betapassword is incorrect" + core_exit.sh # Update did not finish. elif [ -n "$(grep "0x402" "${steamcmdlog}" | tail -1)" ]||[ -n "$(grep "0x602" "${steamcmdlog}" | tail -1)" ]; then fn_print_error2_nl "${commandaction} server: ${remotelocation}: Update required but not completed - check network" diff --git a/lgsm/functions/update_steamcmd.sh b/lgsm/functions/update_steamcmd.sh index 3b01ff4b9..7543e3443 100644 --- a/lgsm/functions/update_steamcmd.sh +++ b/lgsm/functions/update_steamcmd.sh @@ -13,12 +13,9 @@ fn_update_steamcmd_localbuild(){ # Uses appmanifest to find local build. localbuild=$(grep buildid "${appmanifestfile}" | tr '[:blank:]"' ' ' | tr -s ' ' | cut -d\ -f3) - # Set branch for updateinfo. - IFS=' ' read -ra branchsplits <<< "${branch}" - if [ "${#branchsplits[@]}" -gt 1 ]; then - branchname="${branchsplits[1]}" - else - branchname="public" + # Set branch to public if no custom branch. + if [ -z "${branch}" ]; then + branch="public" fi # Checks if localbuild variable has been set. @@ -43,10 +40,12 @@ fn_update_steamcmd_remotebuild(){ find "${HOME}" -type f -name "appinfo.vdf" -exec rm -f {} \; fi - if [ -n "${branch}" ]; then - remotebuild=$(${steamcmdcommand} +login "${steamuser}" "${steampass}" +app_info_update 1 +app_info_print "${appid}" -beta "${branch}" +quit | sed '1,/branches/d' | sed "1,/${branchname}/d" | grep -m 1 buildid | tr -cd '[:digit:]') + if [ -n "${branch}" ]&&[ -n "${betapassword}" ]; then + remotebuild=$(${steamcmdcommand} +login "${steamuser}" "${steampass}" +app_info_update 1 +app_info_print "${appid}" -beta "${branch}" -betapassword "${betapassword}" +quit | sed '1,/branches/d' | sed "1,/${branch}/d" | grep -m 1 buildid | tr -cd '[:digit:]') + elif [ -n "${branch}" ]; then + remotebuild=$(${steamcmdcommand} +login "${steamuser}" "${steampass}" +app_info_update 1 +app_info_print "${appid}" -beta "${branch}" +quit | sed '1,/branches/d' | sed "1,/${branch}/d" | grep -m 1 buildid | tr -cd '[:digit:]') else - remotebuild=$(${steamcmdcommand} +login "${steamuser}" "${steampass}" +app_info_update 1 +app_info_print "${appid}" +quit | sed '1,/branches/d' | sed "1,/${branchname}/d" | grep -m 1 buildid | tr -cd '[:digit:]') + remotebuild=$(${steamcmdcommand} +login "${steamuser}" "${steampass}" +app_info_update 1 +app_info_print "${appid}" +quit | sed '1,/branches/d' | sed "1,/${branch}/d" | grep -m 1 buildid | tr -cd '[:digit:]') fi if [ "${installer}" != "1" ]; then @@ -78,17 +77,23 @@ fn_update_steamcmd_compare(){ echo -e "Update available" echo -e "* Local build: ${red}${localbuild}${default}" echo -e "* Remote build: ${green}${remotebuild}${default}" - if [ -v "${branch}" ]; then + if [ -n "${branch}" ]; then echo -e "* Branch: ${branch}" fi + if [ -n "${betapassword}" ]; then + echo -e "* Branch password: ${betapassword}" + fi echo -e "https://steamdb.info/app/${appid}/" echo -en "\n" fn_script_log_info "Update available" fn_script_log_info "Local build: ${localbuild}" fn_script_log_info "Remote build: ${remotebuild}" - if [ -v "${branch}" ]; then + if [ -n "${branch}" ]; then fn_script_log_info "Branch: ${branch}" fi + if [ -n "${betapassword}" ]; then + fn_script_log_info "Branch password: ${betapassword}" + fi fn_script_log_info "${localbuild} > ${remotebuild}" unset updateonstart @@ -117,17 +122,23 @@ fn_update_steamcmd_compare(){ echo -e "No update available" echo -e "* Local build: ${green}${localbuild}${default}" echo -e "* Remote build: ${green}${remotebuild}${default}" - if [ -v "${branch}" ]; then + if [ -n "${branch}" ]; then echo -e "* Branch: ${branch}" fi + if [ -n "${betapassword}" ]; then + echo -e "* Branch password: ${betapassword}" + fi echo -e "https://steamdb.info/app/${appid}/" echo -en "\n" fn_script_log_info "No update available" fn_script_log_info "Local build: ${localbuild}" fn_script_log_info "Remote build: ${remotebuild}" - if [ -v "${branch}" ]; then + if [ -n "${branch}" ]; then fn_script_log_info "Branch: ${branch}" fi + if [ -n "${betapassword}" ]; then + fn_script_log_info "Branch password: ${betapassword}" + fi fi } From a3da62fb1a6d963dd4df5c9a7c5d00a1e21773f2 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Mon, 13 Jul 2020 23:04:18 +0100 Subject: [PATCH 421/534] feat(stop): add end option to graceful stop (#2963) --- lgsm/config-default/config-lgsm/acserver/_default.cfg | 1 + lgsm/config-default/config-lgsm/ahl2server/_default.cfg | 1 + lgsm/config-default/config-lgsm/ahlserver/_default.cfg | 1 + lgsm/config-default/config-lgsm/arkserver/_default.cfg | 1 + lgsm/config-default/config-lgsm/arma3server/_default.cfg | 1 + lgsm/config-default/config-lgsm/avserver/_default.cfg | 1 + lgsm/config-default/config-lgsm/bb2server/_default.cfg | 1 + lgsm/config-default/config-lgsm/bbserver/_default.cfg | 1 + lgsm/config-default/config-lgsm/bdserver/_default.cfg | 1 + lgsm/config-default/config-lgsm/bf1942server/_default.cfg | 1 + lgsm/config-default/config-lgsm/bfvserver/_default.cfg | 1 + lgsm/config-default/config-lgsm/bmdmserver/_default.cfg | 1 + lgsm/config-default/config-lgsm/boserver/_default.cfg | 1 + lgsm/config-default/config-lgsm/bsserver/_default.cfg | 1 + lgsm/config-default/config-lgsm/bt1944server/_default.cfg | 1 + lgsm/config-default/config-lgsm/btserver/_default.cfg | 1 + lgsm/config-default/config-lgsm/ccserver/_default.cfg | 1 + lgsm/config-default/config-lgsm/cmwserver/_default.cfg | 1 + lgsm/config-default/config-lgsm/cod2server/_default.cfg | 1 + lgsm/config-default/config-lgsm/cod4server/_default.cfg | 1 + lgsm/config-default/config-lgsm/codserver/_default.cfg | 1 + lgsm/config-default/config-lgsm/coduoserver/_default.cfg | 1 + lgsm/config-default/config-lgsm/codwawserver/_default.cfg | 1 + lgsm/config-default/config-lgsm/csczserver/_default.cfg | 1 + lgsm/config-default/config-lgsm/csgoserver/_default.cfg | 1 + lgsm/config-default/config-lgsm/csserver/_default.cfg | 1 + lgsm/config-default/config-lgsm/cssserver/_default.cfg | 1 + lgsm/config-default/config-lgsm/dabserver/_default.cfg | 1 + lgsm/config-default/config-lgsm/dmcserver/_default.cfg | 1 + lgsm/config-default/config-lgsm/dodserver/_default.cfg | 1 + lgsm/config-default/config-lgsm/dodsserver/_default.cfg | 1 + lgsm/config-default/config-lgsm/doiserver/_default.cfg | 1 + lgsm/config-default/config-lgsm/dstserver/_default.cfg | 1 + lgsm/config-default/config-lgsm/dysserver/_default.cfg | 1 + lgsm/config-default/config-lgsm/ecoserver/_default.cfg | 1 + lgsm/config-default/config-lgsm/emserver/_default.cfg | 1 + lgsm/config-default/config-lgsm/etlserver/_default.cfg | 1 + lgsm/config-default/config-lgsm/fctrserver/_default.cfg | 1 + lgsm/config-default/config-lgsm/fofserver/_default.cfg | 1 + lgsm/config-default/config-lgsm/gesserver/_default.cfg | 1 + lgsm/config-default/config-lgsm/gmodserver/_default.cfg | 1 + lgsm/config-default/config-lgsm/hl2dmserver/_default.cfg | 1 + lgsm/config-default/config-lgsm/hldmserver/_default.cfg | 1 + lgsm/config-default/config-lgsm/hldmsserver/_default.cfg | 1 + lgsm/config-default/config-lgsm/hwserver/_default.cfg | 1 + lgsm/config-default/config-lgsm/insserver/_default.cfg | 1 + lgsm/config-default/config-lgsm/inssserver/_default.cfg | 1 + lgsm/config-default/config-lgsm/iosserver/_default.cfg | 1 + lgsm/config-default/config-lgsm/jc2server/_default.cfg | 1 + lgsm/config-default/config-lgsm/jc3server/_default.cfg | 1 + lgsm/config-default/config-lgsm/kf2server/_default.cfg | 1 + lgsm/config-default/config-lgsm/kfserver/_default.cfg | 1 + lgsm/config-default/config-lgsm/l4d2server/_default.cfg | 1 + lgsm/config-default/config-lgsm/l4dserver/_default.cfg | 1 + lgsm/config-default/config-lgsm/mcbserver/_default.cfg | 1 + lgsm/config-default/config-lgsm/mcserver/_default.cfg | 1 + lgsm/config-default/config-lgsm/mhserver/_default.cfg | 1 + lgsm/config-default/config-lgsm/mohaaserver/_default.cfg | 1 + lgsm/config-default/config-lgsm/momserver/_default.cfg | 1 + lgsm/config-default/config-lgsm/mtaserver/_default.cfg | 1 + lgsm/config-default/config-lgsm/mumbleserver/_default.cfg | 1 + lgsm/config-default/config-lgsm/ndserver/_default.cfg | 1 + lgsm/config-default/config-lgsm/nmrihserver/_default.cfg | 1 + lgsm/config-default/config-lgsm/ns2cserver/_default.cfg | 1 + lgsm/config-default/config-lgsm/ns2server/_default.cfg | 1 + lgsm/config-default/config-lgsm/nsserver/_default.cfg | 1 + lgsm/config-default/config-lgsm/onsetserver/_default.cfg | 1 + lgsm/config-default/config-lgsm/opforserver/_default.cfg | 1 + lgsm/config-default/config-lgsm/pcserver/_default.cfg | 1 + lgsm/config-default/config-lgsm/pstbsserver/_default.cfg | 1 + lgsm/config-default/config-lgsm/pvkiiserver/_default.cfg | 1 + lgsm/config-default/config-lgsm/pzserver/_default.cfg | 1 + lgsm/config-default/config-lgsm/q2server/_default.cfg | 1 + lgsm/config-default/config-lgsm/q3server/_default.cfg | 1 + lgsm/config-default/config-lgsm/qlserver/_default.cfg | 1 + lgsm/config-default/config-lgsm/qwserver/_default.cfg | 1 + lgsm/config-default/config-lgsm/ricochetserver/_default.cfg | 1 + lgsm/config-default/config-lgsm/roserver/_default.cfg | 1 + lgsm/config-default/config-lgsm/rtcwserver/_default.cfg | 1 + lgsm/config-default/config-lgsm/rustserver/_default.cfg | 1 + lgsm/config-default/config-lgsm/rwserver/_default.cfg | 1 + lgsm/config-default/config-lgsm/sampserver/_default.cfg | 1 + lgsm/config-default/config-lgsm/sbotsserver/_default.cfg | 1 + lgsm/config-default/config-lgsm/sbserver/_default.cfg | 1 + lgsm/config-default/config-lgsm/sdtdserver/_default.cfg | 1 + lgsm/config-default/config-lgsm/sfcserver/_default.cfg | 1 + lgsm/config-default/config-lgsm/sof2server/_default.cfg | 1 + lgsm/config-default/config-lgsm/solserver/_default.cfg | 1 + lgsm/config-default/config-lgsm/squadserver/_default.cfg | 1 + lgsm/config-default/config-lgsm/ss3server/_default.cfg | 1 + lgsm/config-default/config-lgsm/stserver/_default.cfg | 1 + lgsm/config-default/config-lgsm/svenserver/_default.cfg | 1 + lgsm/config-default/config-lgsm/terrariaserver/_default.cfg | 1 + lgsm/config-default/config-lgsm/tf2server/_default.cfg | 1 + lgsm/config-default/config-lgsm/tfcserver/_default.cfg | 1 + lgsm/config-default/config-lgsm/ts3server/_default.cfg | 1 + lgsm/config-default/config-lgsm/tsserver/_default.cfg | 1 + lgsm/config-default/config-lgsm/tuserver/_default.cfg | 1 + lgsm/config-default/config-lgsm/twserver/_default.cfg | 1 + lgsm/config-default/config-lgsm/untserver/_default.cfg | 1 + lgsm/config-default/config-lgsm/ut2k4server/_default.cfg | 1 + lgsm/config-default/config-lgsm/ut3server/_default.cfg | 1 + lgsm/config-default/config-lgsm/ut99server/_default.cfg | 1 + lgsm/config-default/config-lgsm/utserver/_default.cfg | 1 + lgsm/config-default/config-lgsm/vsserver/_default.cfg | 1 + lgsm/config-default/config-lgsm/wetserver/_default.cfg | 1 + lgsm/config-default/config-lgsm/wfserver/_default.cfg | 1 + lgsm/config-default/config-lgsm/wurmserver/_default.cfg | 1 + lgsm/config-default/config-lgsm/zmrserver/_default.cfg | 1 + lgsm/config-default/config-lgsm/zpsserver/_default.cfg | 1 + lgsm/functions/command_stop.sh | 2 ++ tests/tests_defaultcfg/defaultcfg_1.txt | 1 + 112 files changed, 113 insertions(+) diff --git a/lgsm/config-default/config-lgsm/acserver/_default.cfg b/lgsm/config-default/config-lgsm/acserver/_default.cfg index 9780bac87..0faa375da 100644 --- a/lgsm/config-default/config-lgsm/acserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/acserver/_default.cfg @@ -125,6 +125,7 @@ steammaster="false" # 8: 7 Days to Die # 9: GoldSrc # 10: Avorion +# 11: end stopmode="2" ## Query mode diff --git a/lgsm/config-default/config-lgsm/ahl2server/_default.cfg b/lgsm/config-default/config-lgsm/ahl2server/_default.cfg index 9fea1e890..39d99e9e5 100644 --- a/lgsm/config-default/config-lgsm/ahl2server/_default.cfg +++ b/lgsm/config-default/config-lgsm/ahl2server/_default.cfg @@ -122,6 +122,7 @@ sleeptime="0.5" # 8: 7 Days to Die # 9: GoldSrc # 10: Avorion +# 11: end stopmode="3" ## Query mode diff --git a/lgsm/config-default/config-lgsm/ahlserver/_default.cfg b/lgsm/config-default/config-lgsm/ahlserver/_default.cfg index 77ffdd106..2a611c2e6 100644 --- a/lgsm/config-default/config-lgsm/ahlserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/ahlserver/_default.cfg @@ -127,6 +127,7 @@ steammaster="true" # 8: 7 Days to Die # 9: GoldSrc # 10: Avorion +# 11: end stopmode="9" ## Query mode diff --git a/lgsm/config-default/config-lgsm/arkserver/_default.cfg b/lgsm/config-default/config-lgsm/arkserver/_default.cfg index de68135c7..9dc41afc2 100644 --- a/lgsm/config-default/config-lgsm/arkserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/arkserver/_default.cfg @@ -129,6 +129,7 @@ steammaster="true" # 8: 7 Days to Die # 9: GoldSrc # 10: Avorion +# 11: end stopmode="2" ## Query mode diff --git a/lgsm/config-default/config-lgsm/arma3server/_default.cfg b/lgsm/config-default/config-lgsm/arma3server/_default.cfg index b67726fa8..3c57f1ff2 100644 --- a/lgsm/config-default/config-lgsm/arma3server/_default.cfg +++ b/lgsm/config-default/config-lgsm/arma3server/_default.cfg @@ -142,6 +142,7 @@ steammaster="false" # 8: 7 Days to Die # 9: GoldSrc # 10: Avorion +# 11: end stopmode="2" ## Query mode diff --git a/lgsm/config-default/config-lgsm/avserver/_default.cfg b/lgsm/config-default/config-lgsm/avserver/_default.cfg index 06274f8fa..c3cce8c2b 100644 --- a/lgsm/config-default/config-lgsm/avserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/avserver/_default.cfg @@ -124,6 +124,7 @@ steammaster="false" # 8: 7 Days to Die # 9: GoldSrc # 10: Avorion +# 11: end stopmode="10" ## Query mode diff --git a/lgsm/config-default/config-lgsm/bb2server/_default.cfg b/lgsm/config-default/config-lgsm/bb2server/_default.cfg index 26410664b..0c8ef08fa 100644 --- a/lgsm/config-default/config-lgsm/bb2server/_default.cfg +++ b/lgsm/config-default/config-lgsm/bb2server/_default.cfg @@ -132,6 +132,7 @@ steammaster="true" # 8: 7 Days to Die # 9: GoldSrc # 10: Avorion +# 11: end stopmode="3" ## Query mode diff --git a/lgsm/config-default/config-lgsm/bbserver/_default.cfg b/lgsm/config-default/config-lgsm/bbserver/_default.cfg index a66b1ddd5..6397af14c 100644 --- a/lgsm/config-default/config-lgsm/bbserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/bbserver/_default.cfg @@ -127,6 +127,7 @@ steammaster="true" # 8: 7 Days to Die # 9: GoldSrc # 10: Avorion +# 11: end stopmode="9" ## Query mode diff --git a/lgsm/config-default/config-lgsm/bdserver/_default.cfg b/lgsm/config-default/config-lgsm/bdserver/_default.cfg index 1c1a43e40..d4bfabb8e 100644 --- a/lgsm/config-default/config-lgsm/bdserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/bdserver/_default.cfg @@ -126,6 +126,7 @@ steammaster="true" # 8: 7 Days to Die # 9: GoldSrc # 10: Avorion +# 11: end stopmode="9" ## Query mode diff --git a/lgsm/config-default/config-lgsm/bf1942server/_default.cfg b/lgsm/config-default/config-lgsm/bf1942server/_default.cfg index 04bcef9b3..2bf084b18 100644 --- a/lgsm/config-default/config-lgsm/bf1942server/_default.cfg +++ b/lgsm/config-default/config-lgsm/bf1942server/_default.cfg @@ -110,6 +110,7 @@ sleeptime="0.5" # 8: 7 Days to Die # 9: GoldSrc # 10: Avorion +# 11: end stopmode="2" ## Query mode diff --git a/lgsm/config-default/config-lgsm/bfvserver/_default.cfg b/lgsm/config-default/config-lgsm/bfvserver/_default.cfg index d0b7215c5..99d1555d8 100644 --- a/lgsm/config-default/config-lgsm/bfvserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/bfvserver/_default.cfg @@ -110,6 +110,7 @@ sleeptime="0.5" # 8: 7 Days to Die # 9: GoldSrc # 10: Avorion +# 11: end stopmode="3" ## Query mode diff --git a/lgsm/config-default/config-lgsm/bmdmserver/_default.cfg b/lgsm/config-default/config-lgsm/bmdmserver/_default.cfg index 91dcd6162..12cabed62 100644 --- a/lgsm/config-default/config-lgsm/bmdmserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/bmdmserver/_default.cfg @@ -132,6 +132,7 @@ steammaster="true" # 8: 7 Days to Die # 9: GoldSrc # 10: Avorion +# 11: end stopmode="3" ## Query mode diff --git a/lgsm/config-default/config-lgsm/boserver/_default.cfg b/lgsm/config-default/config-lgsm/boserver/_default.cfg index ec6169a74..9e8e28000 100644 --- a/lgsm/config-default/config-lgsm/boserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/boserver/_default.cfg @@ -125,6 +125,7 @@ steammaster="false" # 8: 7 Days to Die # 9: GoldSrc # 10: Avorion +# 11: end stopmode="2" ## Query mode diff --git a/lgsm/config-default/config-lgsm/bsserver/_default.cfg b/lgsm/config-default/config-lgsm/bsserver/_default.cfg index 286b552d7..81111150b 100644 --- a/lgsm/config-default/config-lgsm/bsserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/bsserver/_default.cfg @@ -136,6 +136,7 @@ steammaster="true" # 8: 7 Days to Die # 9: GoldSrc # 10: Avorion +# 11: end stopmode="3" ## Query mode diff --git a/lgsm/config-default/config-lgsm/bt1944server/_default.cfg b/lgsm/config-default/config-lgsm/bt1944server/_default.cfg index db5f9fec8..50d397812 100644 --- a/lgsm/config-default/config-lgsm/bt1944server/_default.cfg +++ b/lgsm/config-default/config-lgsm/bt1944server/_default.cfg @@ -124,6 +124,7 @@ steammaster="false" # 8: 7 Days to Die # 9: GoldSrc # 10: Avorion +# 11: end stopmode="2" ## Query mode diff --git a/lgsm/config-default/config-lgsm/btserver/_default.cfg b/lgsm/config-default/config-lgsm/btserver/_default.cfg index c11530de5..f10520f31 100644 --- a/lgsm/config-default/config-lgsm/btserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/btserver/_default.cfg @@ -119,6 +119,7 @@ steammaster="true" # 8: 7 Days to Die # 9: GoldSrc # 10: Avorion +# 11: end stopmode="7" ## Query mode diff --git a/lgsm/config-default/config-lgsm/ccserver/_default.cfg b/lgsm/config-default/config-lgsm/ccserver/_default.cfg index f084a92ac..bd9eb1c5d 100644 --- a/lgsm/config-default/config-lgsm/ccserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/ccserver/_default.cfg @@ -127,6 +127,7 @@ steammaster="false" # 8: 7 Days to Die # 9: GoldSrc # 10: Avorion +# 11: end stopmode="3" ## Query mode diff --git a/lgsm/config-default/config-lgsm/cmwserver/_default.cfg b/lgsm/config-default/config-lgsm/cmwserver/_default.cfg index 301226304..36d9555ce 100644 --- a/lgsm/config-default/config-lgsm/cmwserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/cmwserver/_default.cfg @@ -128,6 +128,7 @@ steammaster="false" # 8: 7 Days to Die # 9: GoldSrc # 10: Avorion +# 11: end stopmode="2" ## Query mode diff --git a/lgsm/config-default/config-lgsm/cod2server/_default.cfg b/lgsm/config-default/config-lgsm/cod2server/_default.cfg index a686ea45f..6ec7c17d3 100644 --- a/lgsm/config-default/config-lgsm/cod2server/_default.cfg +++ b/lgsm/config-default/config-lgsm/cod2server/_default.cfg @@ -113,6 +113,7 @@ sleeptime="0.5" # 8: 7 Days to Die # 9: GoldSrc # 10: Avorion +# 11: end stopmode="3" ## Query mode diff --git a/lgsm/config-default/config-lgsm/cod4server/_default.cfg b/lgsm/config-default/config-lgsm/cod4server/_default.cfg index 027c52509..3ca19c411 100644 --- a/lgsm/config-default/config-lgsm/cod4server/_default.cfg +++ b/lgsm/config-default/config-lgsm/cod4server/_default.cfg @@ -113,6 +113,7 @@ sleeptime="0.5" # 8: 7 Days to Die # 9: GoldSrc # 10: Avorion +# 11: end stopmode="3" ## Query mode diff --git a/lgsm/config-default/config-lgsm/codserver/_default.cfg b/lgsm/config-default/config-lgsm/codserver/_default.cfg index 74e186466..a9e97f086 100644 --- a/lgsm/config-default/config-lgsm/codserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/codserver/_default.cfg @@ -113,6 +113,7 @@ sleeptime="0.5" # 8: 7 Days to Die # 9: GoldSrc # 10: Avorion +# 11: end stopmode="3" ## Query mode diff --git a/lgsm/config-default/config-lgsm/coduoserver/_default.cfg b/lgsm/config-default/config-lgsm/coduoserver/_default.cfg index b4e16cfff..390a92c25 100644 --- a/lgsm/config-default/config-lgsm/coduoserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/coduoserver/_default.cfg @@ -113,6 +113,7 @@ sleeptime="0.5" # 8: 7 Days to Die # 9: GoldSrc # 10: Avorion +# 11: end stopmode="3" ## Query mode diff --git a/lgsm/config-default/config-lgsm/codwawserver/_default.cfg b/lgsm/config-default/config-lgsm/codwawserver/_default.cfg index aeecf8f7b..3906ee496 100644 --- a/lgsm/config-default/config-lgsm/codwawserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/codwawserver/_default.cfg @@ -113,6 +113,7 @@ sleeptime="0.5" # 8: 7 Days to Die # 9: GoldSrc # 10: Avorion +# 11: end stopmode="3" ## Query mode diff --git a/lgsm/config-default/config-lgsm/csczserver/_default.cfg b/lgsm/config-default/config-lgsm/csczserver/_default.cfg index 7f30de9f6..90e1eb623 100644 --- a/lgsm/config-default/config-lgsm/csczserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/csczserver/_default.cfg @@ -127,6 +127,7 @@ steammaster="true" # 8: 7 Days to Die # 9: GoldSrc # 10: Avorion +# 11: end stopmode="9" ## Query mode diff --git a/lgsm/config-default/config-lgsm/csgoserver/_default.cfg b/lgsm/config-default/config-lgsm/csgoserver/_default.cfg index 08675ea98..d4071272a 100644 --- a/lgsm/config-default/config-lgsm/csgoserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/csgoserver/_default.cfg @@ -152,6 +152,7 @@ steammaster="true" # 8: 7 Days to Die # 9: GoldSrc # 10: Avorion +# 11: end stopmode="3" ## Query mode diff --git a/lgsm/config-default/config-lgsm/csserver/_default.cfg b/lgsm/config-default/config-lgsm/csserver/_default.cfg index 932d8313b..c41093ddf 100644 --- a/lgsm/config-default/config-lgsm/csserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/csserver/_default.cfg @@ -127,6 +127,7 @@ steammaster="true" # 8: 7 Days to Die # 9: GoldSrc # 10: Avorion +# 11: end stopmode="9" ## Query mode diff --git a/lgsm/config-default/config-lgsm/cssserver/_default.cfg b/lgsm/config-default/config-lgsm/cssserver/_default.cfg index 241180118..4e911f857 100644 --- a/lgsm/config-default/config-lgsm/cssserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/cssserver/_default.cfg @@ -132,6 +132,7 @@ steammaster="true" # 8: 7 Days to Die # 9: GoldSrc # 10: Avorion +# 11: end stopmode="3" ## Query mode diff --git a/lgsm/config-default/config-lgsm/dabserver/_default.cfg b/lgsm/config-default/config-lgsm/dabserver/_default.cfg index 61fc76d60..9074e5f78 100644 --- a/lgsm/config-default/config-lgsm/dabserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/dabserver/_default.cfg @@ -127,6 +127,7 @@ steammaster="true" # 8: 7 Days to Die # 9: GoldSrc # 10: Avorion +# 11: end stopmode="3" ## Query mode diff --git a/lgsm/config-default/config-lgsm/dmcserver/_default.cfg b/lgsm/config-default/config-lgsm/dmcserver/_default.cfg index e49c15fd3..6e2ce40af 100644 --- a/lgsm/config-default/config-lgsm/dmcserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/dmcserver/_default.cfg @@ -127,6 +127,7 @@ steammaster="true" # 8: 7 Days to Die # 9: GoldSrc # 10: Avorion +# 11: end stopmode="9" ## Query mode diff --git a/lgsm/config-default/config-lgsm/dodserver/_default.cfg b/lgsm/config-default/config-lgsm/dodserver/_default.cfg index cbdb2eb2e..499c029a5 100644 --- a/lgsm/config-default/config-lgsm/dodserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/dodserver/_default.cfg @@ -127,6 +127,7 @@ steammaster="true" # 8: 7 Days to Die # 9: GoldSrc # 10: Avorion +# 11: end stopmode="9" ## Query mode diff --git a/lgsm/config-default/config-lgsm/dodsserver/_default.cfg b/lgsm/config-default/config-lgsm/dodsserver/_default.cfg index 217ee6d2f..10a1e8cf3 100644 --- a/lgsm/config-default/config-lgsm/dodsserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/dodsserver/_default.cfg @@ -127,6 +127,7 @@ steammaster="true" # 8: 7 Days to Die # 9: GoldSrc # 10: Avorion +# 11: end stopmode="3" ## Query mode diff --git a/lgsm/config-default/config-lgsm/doiserver/_default.cfg b/lgsm/config-default/config-lgsm/doiserver/_default.cfg index 1efbeaaf0..436221dfb 100644 --- a/lgsm/config-default/config-lgsm/doiserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/doiserver/_default.cfg @@ -128,6 +128,7 @@ steammaster="true" # 8: 7 Days to Die # 9: GoldSrc # 10: Avorion +# 11: end stopmode="3" ## Query mode diff --git a/lgsm/config-default/config-lgsm/dstserver/_default.cfg b/lgsm/config-default/config-lgsm/dstserver/_default.cfg index 70115d23a..1d49c64e1 100644 --- a/lgsm/config-default/config-lgsm/dstserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/dstserver/_default.cfg @@ -130,6 +130,7 @@ steammaster="false" # 8: 7 Days to Die # 9: GoldSrc # 10: Avorion +# 11: end stopmode="2" ## Query mode diff --git a/lgsm/config-default/config-lgsm/dysserver/_default.cfg b/lgsm/config-default/config-lgsm/dysserver/_default.cfg index 17745b42a..bd33808b9 100644 --- a/lgsm/config-default/config-lgsm/dysserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/dysserver/_default.cfg @@ -132,6 +132,7 @@ steammaster="true" # 8: 7 Days to Die # 9: GoldSrc # 10: Avorion +# 11: end stopmode="3" ## Query mode diff --git a/lgsm/config-default/config-lgsm/ecoserver/_default.cfg b/lgsm/config-default/config-lgsm/ecoserver/_default.cfg index 6bb4f5a42..714731b65 100644 --- a/lgsm/config-default/config-lgsm/ecoserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/ecoserver/_default.cfg @@ -119,6 +119,7 @@ steammaster="false" # 8: 7 Days to Die # 9: GoldSrc # 10: Avorion +# 11: end stopmode="2" ## Query mode diff --git a/lgsm/config-default/config-lgsm/emserver/_default.cfg b/lgsm/config-default/config-lgsm/emserver/_default.cfg index 1fd957731..15ccbb9a1 100644 --- a/lgsm/config-default/config-lgsm/emserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/emserver/_default.cfg @@ -132,6 +132,7 @@ steammaster="true" # 8: 7 Days to Die # 9: GoldSrc # 10: Avorion +# 11: end stopmode="3" ## Query mode diff --git a/lgsm/config-default/config-lgsm/etlserver/_default.cfg b/lgsm/config-default/config-lgsm/etlserver/_default.cfg index add0f74b6..126eb855b 100644 --- a/lgsm/config-default/config-lgsm/etlserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/etlserver/_default.cfg @@ -107,6 +107,7 @@ sleeptime="0.5" # 8: 7 Days to Die # 9: GoldSrc # 10: Avorion +# 11: end stopmode="3" ## Query mode diff --git a/lgsm/config-default/config-lgsm/fctrserver/_default.cfg b/lgsm/config-default/config-lgsm/fctrserver/_default.cfg index fddab05ee..6ba03ee02 100644 --- a/lgsm/config-default/config-lgsm/fctrserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/fctrserver/_default.cfg @@ -118,6 +118,7 @@ sleeptime="0.5" # 8: 7 Days to Die # 9: GoldSrc # 10: Avorion +# 11: end stopmode="2" ## Query mode diff --git a/lgsm/config-default/config-lgsm/fofserver/_default.cfg b/lgsm/config-default/config-lgsm/fofserver/_default.cfg index 2eca809ca..3438cb5d0 100644 --- a/lgsm/config-default/config-lgsm/fofserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/fofserver/_default.cfg @@ -127,6 +127,7 @@ steammaster="true" # 8: 7 Days to Die # 9: GoldSrc # 10: Avorion +# 11: end stopmode="3" ## Query mode diff --git a/lgsm/config-default/config-lgsm/gesserver/_default.cfg b/lgsm/config-default/config-lgsm/gesserver/_default.cfg index f7dbe2a2f..db7889630 100644 --- a/lgsm/config-default/config-lgsm/gesserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/gesserver/_default.cfg @@ -127,6 +127,7 @@ steammaster="true" # 8: 7 Days to Die # 9: GoldSrc # 10: Avorion +# 11: end stopmode="3" ## Query mode diff --git a/lgsm/config-default/config-lgsm/gmodserver/_default.cfg b/lgsm/config-default/config-lgsm/gmodserver/_default.cfg index b41c31594..3b5026350 100644 --- a/lgsm/config-default/config-lgsm/gmodserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/gmodserver/_default.cfg @@ -143,6 +143,7 @@ steammaster="true" # 8: 7 Days to Die # 9: GoldSrc # 10: Avorion +# 11: end stopmode="3" ## Query mode diff --git a/lgsm/config-default/config-lgsm/hl2dmserver/_default.cfg b/lgsm/config-default/config-lgsm/hl2dmserver/_default.cfg index c62752607..0e60c1662 100644 --- a/lgsm/config-default/config-lgsm/hl2dmserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/hl2dmserver/_default.cfg @@ -127,6 +127,7 @@ steammaster="true" # 8: 7 Days to Die # 9: GoldSrc # 10: Avorion +# 11: end stopmode="3" ## Query mode diff --git a/lgsm/config-default/config-lgsm/hldmserver/_default.cfg b/lgsm/config-default/config-lgsm/hldmserver/_default.cfg index 3cd16edba..67cf1f0c8 100644 --- a/lgsm/config-default/config-lgsm/hldmserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/hldmserver/_default.cfg @@ -126,6 +126,7 @@ steammaster="true" # 8: 7 Days to Die # 9: GoldSrc # 10: Avorion +# 11: end stopmode="9" ## Query mode diff --git a/lgsm/config-default/config-lgsm/hldmsserver/_default.cfg b/lgsm/config-default/config-lgsm/hldmsserver/_default.cfg index e213d2923..6ec069c74 100644 --- a/lgsm/config-default/config-lgsm/hldmsserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/hldmsserver/_default.cfg @@ -127,6 +127,7 @@ steammaster="true" # 8: 7 Days to Die # 9: GoldSrc # 10: Avorion +# 11: end stopmode="3" ## Query mode diff --git a/lgsm/config-default/config-lgsm/hwserver/_default.cfg b/lgsm/config-default/config-lgsm/hwserver/_default.cfg index b3a3b1e71..bc832521a 100644 --- a/lgsm/config-default/config-lgsm/hwserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/hwserver/_default.cfg @@ -138,6 +138,7 @@ steammaster="false" # 8: 7 Days to Die # 9: GoldSrc # 10: Avorion +# 11: end stopmode="2" ## Query mode diff --git a/lgsm/config-default/config-lgsm/insserver/_default.cfg b/lgsm/config-default/config-lgsm/insserver/_default.cfg index e5446b6a6..78c789a4d 100644 --- a/lgsm/config-default/config-lgsm/insserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/insserver/_default.cfg @@ -133,6 +133,7 @@ steammaster="false" # 8: 7 Days to Die # 9: GoldSrc # 10: Avorion +# 11: end stopmode="3" ## Query mode diff --git a/lgsm/config-default/config-lgsm/inssserver/_default.cfg b/lgsm/config-default/config-lgsm/inssserver/_default.cfg index 1e74410e8..41c7a4810 100644 --- a/lgsm/config-default/config-lgsm/inssserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/inssserver/_default.cfg @@ -134,6 +134,7 @@ steammaster="false" # 8: 7 Days to Die # 9: GoldSrc # 10: Avorion +# 11: end stopmode="2" ## Query mode diff --git a/lgsm/config-default/config-lgsm/iosserver/_default.cfg b/lgsm/config-default/config-lgsm/iosserver/_default.cfg index dbd190bd2..0c935b5ad 100644 --- a/lgsm/config-default/config-lgsm/iosserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/iosserver/_default.cfg @@ -127,6 +127,7 @@ steammaster="false" # 8: 7 Days to Die # 9: GoldSrc # 10: Avorion +# 11: end stopmode="3" ## Query mode diff --git a/lgsm/config-default/config-lgsm/jc2server/_default.cfg b/lgsm/config-default/config-lgsm/jc2server/_default.cfg index 276b73d41..f593f28bc 100644 --- a/lgsm/config-default/config-lgsm/jc2server/_default.cfg +++ b/lgsm/config-default/config-lgsm/jc2server/_default.cfg @@ -119,6 +119,7 @@ steammaster="true" # 8: 7 Days to Die # 9: GoldSrc # 10: Avorion +# 11: end stopmode="2" ## Query mode diff --git a/lgsm/config-default/config-lgsm/jc3server/_default.cfg b/lgsm/config-default/config-lgsm/jc3server/_default.cfg index 6c876ab3e..cdfb17e54 100644 --- a/lgsm/config-default/config-lgsm/jc3server/_default.cfg +++ b/lgsm/config-default/config-lgsm/jc3server/_default.cfg @@ -119,6 +119,7 @@ steammaster="false" # 8: 7 Days to Die # 9: GoldSrc # 10: Avorion +# 11: end stopmode="2" ## Query mode diff --git a/lgsm/config-default/config-lgsm/kf2server/_default.cfg b/lgsm/config-default/config-lgsm/kf2server/_default.cfg index dbf80751f..2cd1e0cca 100644 --- a/lgsm/config-default/config-lgsm/kf2server/_default.cfg +++ b/lgsm/config-default/config-lgsm/kf2server/_default.cfg @@ -125,6 +125,7 @@ steammaster="false" # 8: 7 Days to Die # 9: GoldSrc # 10: Avorion +# 11: end stopmode="2" ## Query mode diff --git a/lgsm/config-default/config-lgsm/kfserver/_default.cfg b/lgsm/config-default/config-lgsm/kfserver/_default.cfg index 83d253d58..1332c3ebb 100644 --- a/lgsm/config-default/config-lgsm/kfserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/kfserver/_default.cfg @@ -131,6 +131,7 @@ steammaster="false" # 8: 7 Days to Die # 9: GoldSrc # 10: Avorion +# 11: end stopmode="2" ## Query mode diff --git a/lgsm/config-default/config-lgsm/l4d2server/_default.cfg b/lgsm/config-default/config-lgsm/l4d2server/_default.cfg index 425b5ff28..e877ea0b1 100644 --- a/lgsm/config-default/config-lgsm/l4d2server/_default.cfg +++ b/lgsm/config-default/config-lgsm/l4d2server/_default.cfg @@ -126,6 +126,7 @@ steammaster="false" # 8: 7 Days to Die # 9: GoldSrc # 10: Avorion +# 11: end stopmode="3" ## Query mode diff --git a/lgsm/config-default/config-lgsm/l4dserver/_default.cfg b/lgsm/config-default/config-lgsm/l4dserver/_default.cfg index e31ad4cb7..1b8cd88ba 100644 --- a/lgsm/config-default/config-lgsm/l4dserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/l4dserver/_default.cfg @@ -126,6 +126,7 @@ steammaster="false" # 8: 7 Days to Die # 9: GoldSrc # 10: Avorion +# 11: end stopmode="2" ## Query mode diff --git a/lgsm/config-default/config-lgsm/mcbserver/_default.cfg b/lgsm/config-default/config-lgsm/mcbserver/_default.cfg index 839f5a9af..df50e3af1 100644 --- a/lgsm/config-default/config-lgsm/mcbserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/mcbserver/_default.cfg @@ -110,6 +110,7 @@ sleeptime="0.5" # 8: 7 Days to Die # 9: GoldSrc # 10: Avorion +# 11: end stopmode="5" ## Query mode diff --git a/lgsm/config-default/config-lgsm/mcserver/_default.cfg b/lgsm/config-default/config-lgsm/mcserver/_default.cfg index a49465f45..788bbab2b 100644 --- a/lgsm/config-default/config-lgsm/mcserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/mcserver/_default.cfg @@ -116,6 +116,7 @@ sleeptime="0.5" # 8: 7 Days to Die # 9: GoldSrc # 10: Avorion +# 11: end stopmode="5" ## Query mode diff --git a/lgsm/config-default/config-lgsm/mhserver/_default.cfg b/lgsm/config-default/config-lgsm/mhserver/_default.cfg index e5cbea076..9791aee22 100644 --- a/lgsm/config-default/config-lgsm/mhserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/mhserver/_default.cfg @@ -127,6 +127,7 @@ steammaster="false" # 8: 7 Days to Die # 9: GoldSrc # 10: Avorion +# 11: end stopmode="2" ## Query mode diff --git a/lgsm/config-default/config-lgsm/mohaaserver/_default.cfg b/lgsm/config-default/config-lgsm/mohaaserver/_default.cfg index 1f82fe0c4..010b97ab2 100644 --- a/lgsm/config-default/config-lgsm/mohaaserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/mohaaserver/_default.cfg @@ -112,6 +112,7 @@ sleeptime="0.5" # 8: 7 Days to Die # 9: GoldSrc # 10: Avorion +# 11: end stopmode="3" ## Query mode diff --git a/lgsm/config-default/config-lgsm/momserver/_default.cfg b/lgsm/config-default/config-lgsm/momserver/_default.cfg index 2e5a42a98..1ebe2f227 100644 --- a/lgsm/config-default/config-lgsm/momserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/momserver/_default.cfg @@ -125,6 +125,7 @@ steammaster="false" # 8: 7 Days to Die # 9: GoldSrc # 10: Avorion +# 11: end stopmode="2" ## Query mode diff --git a/lgsm/config-default/config-lgsm/mtaserver/_default.cfg b/lgsm/config-default/config-lgsm/mtaserver/_default.cfg index dc6aac282..111a1b350 100644 --- a/lgsm/config-default/config-lgsm/mtaserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/mtaserver/_default.cfg @@ -111,6 +111,7 @@ sleeptime="0.5" # 8: 7 Days to Die # 9: GoldSrc # 10: Avorion +# 11: end stopmode="4" ## Query mode diff --git a/lgsm/config-default/config-lgsm/mumbleserver/_default.cfg b/lgsm/config-default/config-lgsm/mumbleserver/_default.cfg index 6afe760ae..341177009 100644 --- a/lgsm/config-default/config-lgsm/mumbleserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/mumbleserver/_default.cfg @@ -111,6 +111,7 @@ sleeptime="0.5" # 8: 7 Days to Die # 9: GoldSrc # 10: Avorion +# 11: end stopmode="2" ## Query mode diff --git a/lgsm/config-default/config-lgsm/ndserver/_default.cfg b/lgsm/config-default/config-lgsm/ndserver/_default.cfg index f7c168a2f..df0201849 100644 --- a/lgsm/config-default/config-lgsm/ndserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/ndserver/_default.cfg @@ -127,6 +127,7 @@ steammaster="true" # 8: 7 Days to Die # 9: GoldSrc # 10: Avorion +# 11: end stopmode="3" ## Query mode diff --git a/lgsm/config-default/config-lgsm/nmrihserver/_default.cfg b/lgsm/config-default/config-lgsm/nmrihserver/_default.cfg index 94dd089a7..160c4d58f 100644 --- a/lgsm/config-default/config-lgsm/nmrihserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/nmrihserver/_default.cfg @@ -132,6 +132,7 @@ steammaster="true" # 8: 7 Days to Die # 9: GoldSrc # 10: Avorion +# 11: end stopmode="3" ## Query mode diff --git a/lgsm/config-default/config-lgsm/ns2cserver/_default.cfg b/lgsm/config-default/config-lgsm/ns2cserver/_default.cfg index b2db90679..a778aded5 100644 --- a/lgsm/config-default/config-lgsm/ns2cserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/ns2cserver/_default.cfg @@ -134,6 +134,7 @@ steammaster="true" # 8: 7 Days to Die # 9: GoldSrc # 10: Avorion +# 11: end stopmode="6" ## Query mode diff --git a/lgsm/config-default/config-lgsm/ns2server/_default.cfg b/lgsm/config-default/config-lgsm/ns2server/_default.cfg index f6d6fbf77..d4340a0fa 100644 --- a/lgsm/config-default/config-lgsm/ns2server/_default.cfg +++ b/lgsm/config-default/config-lgsm/ns2server/_default.cfg @@ -138,6 +138,7 @@ steammaster="true" # 8: 7 Days to Die # 9: GoldSrc # 10: Avorion +# 11: end stopmode="6" ## Query mode diff --git a/lgsm/config-default/config-lgsm/nsserver/_default.cfg b/lgsm/config-default/config-lgsm/nsserver/_default.cfg index ef3f33c32..a53da058d 100644 --- a/lgsm/config-default/config-lgsm/nsserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/nsserver/_default.cfg @@ -127,6 +127,7 @@ steammaster="true" # 8: 7 Days to Die # 9: GoldSrc # 10: Avorion +# 11: end stopmode="9" ## Query mode diff --git a/lgsm/config-default/config-lgsm/onsetserver/_default.cfg b/lgsm/config-default/config-lgsm/onsetserver/_default.cfg index dbe7f5bfa..247bf3fbe 100644 --- a/lgsm/config-default/config-lgsm/onsetserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/onsetserver/_default.cfg @@ -119,6 +119,7 @@ steammaster="false" # 8: 7 Days to Die # 9: GoldSrc # 10: Avorion +# 11: end stopmode="2" ## Query mode diff --git a/lgsm/config-default/config-lgsm/opforserver/_default.cfg b/lgsm/config-default/config-lgsm/opforserver/_default.cfg index a5953dca2..45a7347ab 100644 --- a/lgsm/config-default/config-lgsm/opforserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/opforserver/_default.cfg @@ -127,6 +127,7 @@ steammaster="true" # 8: 7 Days to Die # 9: GoldSrc # 10: Avorion +# 11: end stopmode="9" ## Query mode diff --git a/lgsm/config-default/config-lgsm/pcserver/_default.cfg b/lgsm/config-default/config-lgsm/pcserver/_default.cfg index 4ebe2e469..6496cf1be 100644 --- a/lgsm/config-default/config-lgsm/pcserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/pcserver/_default.cfg @@ -119,6 +119,7 @@ steammaster="false" # 8: 7 Days to Die # 9: GoldSrc # 10: Avorion +# 11: end stopmode="2" ## Query mode diff --git a/lgsm/config-default/config-lgsm/pstbsserver/_default.cfg b/lgsm/config-default/config-lgsm/pstbsserver/_default.cfg index 736d83ddf..d8dc2888d 100644 --- a/lgsm/config-default/config-lgsm/pstbsserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/pstbsserver/_default.cfg @@ -129,6 +129,7 @@ steammaster="false" # 8: 7 Days to Die # 9: GoldSrc # 10: Avorion +# 11: end stopmode="2" ## Query mode diff --git a/lgsm/config-default/config-lgsm/pvkiiserver/_default.cfg b/lgsm/config-default/config-lgsm/pvkiiserver/_default.cfg index 7064ce1cc..3294b2043 100644 --- a/lgsm/config-default/config-lgsm/pvkiiserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/pvkiiserver/_default.cfg @@ -127,6 +127,7 @@ steammaster="true" # 8: 7 Days to Die # 9: GoldSrc # 10: Avorion +# 11: end stopmode="3" ## Query mode diff --git a/lgsm/config-default/config-lgsm/pzserver/_default.cfg b/lgsm/config-default/config-lgsm/pzserver/_default.cfg index e0a8c90bc..a823e14d1 100644 --- a/lgsm/config-default/config-lgsm/pzserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/pzserver/_default.cfg @@ -123,6 +123,7 @@ steammaster="false" # 8: 7 Days to Die # 9: GoldSrc # 10: Avorion +# 11: end stopmode="3" ## Query mode diff --git a/lgsm/config-default/config-lgsm/q2server/_default.cfg b/lgsm/config-default/config-lgsm/q2server/_default.cfg index 832f641c7..0d28d1155 100644 --- a/lgsm/config-default/config-lgsm/q2server/_default.cfg +++ b/lgsm/config-default/config-lgsm/q2server/_default.cfg @@ -112,6 +112,7 @@ sleeptime="0.5" # 8: 7 Days to Die # 9: GoldSrc # 10: Avorion +# 11: end stopmode="3" ## Query mode diff --git a/lgsm/config-default/config-lgsm/q3server/_default.cfg b/lgsm/config-default/config-lgsm/q3server/_default.cfg index 6d28f4caf..115a093aa 100644 --- a/lgsm/config-default/config-lgsm/q3server/_default.cfg +++ b/lgsm/config-default/config-lgsm/q3server/_default.cfg @@ -112,6 +112,7 @@ sleeptime="0.5" # 8: 7 Days to Die # 9: GoldSrc # 10: Avorion +# 11: end stopmode="3" ## Query mode diff --git a/lgsm/config-default/config-lgsm/qlserver/_default.cfg b/lgsm/config-default/config-lgsm/qlserver/_default.cfg index 60f588d0c..ffe409802 100644 --- a/lgsm/config-default/config-lgsm/qlserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/qlserver/_default.cfg @@ -121,6 +121,7 @@ steammaster="true" # 8: 7 Days to Die # 9: GoldSrc # 10: Avorion +# 11: end stopmode="3" ## Query mode diff --git a/lgsm/config-default/config-lgsm/qwserver/_default.cfg b/lgsm/config-default/config-lgsm/qwserver/_default.cfg index 59cdcc0f1..db81ef4d4 100644 --- a/lgsm/config-default/config-lgsm/qwserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/qwserver/_default.cfg @@ -111,6 +111,7 @@ sleeptime="0.5" # 8: 7 Days to Die # 9: GoldSrc # 10: Avorion +# 11: end stopmode="3" ## Query mode diff --git a/lgsm/config-default/config-lgsm/ricochetserver/_default.cfg b/lgsm/config-default/config-lgsm/ricochetserver/_default.cfg index 7a49e0bd8..8ab59f487 100644 --- a/lgsm/config-default/config-lgsm/ricochetserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/ricochetserver/_default.cfg @@ -127,6 +127,7 @@ steammaster="true" # 8: 7 Days to Die # 9: GoldSrc # 10: Avorion +# 11: end stopmode="9" ## Query mode diff --git a/lgsm/config-default/config-lgsm/roserver/_default.cfg b/lgsm/config-default/config-lgsm/roserver/_default.cfg index 19b96eecb..c87fcb7a7 100644 --- a/lgsm/config-default/config-lgsm/roserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/roserver/_default.cfg @@ -127,6 +127,7 @@ steammaster="false" # 8: 7 Days to Die # 9: GoldSrc # 10: Avorion +# 11: end stopmode="2" ## Query mode diff --git a/lgsm/config-default/config-lgsm/rtcwserver/_default.cfg b/lgsm/config-default/config-lgsm/rtcwserver/_default.cfg index 93b9ce3fe..c73ae99cb 100644 --- a/lgsm/config-default/config-lgsm/rtcwserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/rtcwserver/_default.cfg @@ -112,6 +112,7 @@ sleeptime="0.5" # 8: 7 Days to Die # 9: GoldSrc # 10: Avorion +# 11: end stopmode="3" ## Query mode diff --git a/lgsm/config-default/config-lgsm/rustserver/_default.cfg b/lgsm/config-default/config-lgsm/rustserver/_default.cfg index ce86abd7a..93771879d 100644 --- a/lgsm/config-default/config-lgsm/rustserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/rustserver/_default.cfg @@ -151,6 +151,7 @@ steammaster="false" # 8: 7 Days to Die # 9: GoldSrc # 10: Avorion +# 11: end stopmode="2" ## Query mode diff --git a/lgsm/config-default/config-lgsm/rwserver/_default.cfg b/lgsm/config-default/config-lgsm/rwserver/_default.cfg index 36fdd4210..e771ca8e2 100644 --- a/lgsm/config-default/config-lgsm/rwserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/rwserver/_default.cfg @@ -122,6 +122,7 @@ steammaster="false" # 8: 7 Days to Die # 9: GoldSrc # 10: Avorion +# 11: end stopmode="3" ## Query mode diff --git a/lgsm/config-default/config-lgsm/sampserver/_default.cfg b/lgsm/config-default/config-lgsm/sampserver/_default.cfg index 67331ee39..7d3c5bde9 100644 --- a/lgsm/config-default/config-lgsm/sampserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/sampserver/_default.cfg @@ -111,6 +111,7 @@ sleeptime="0.5" # 8: 7 Days to Die # 9: GoldSrc # 10: Avorion +# 11: end stopmode="2" ## Query mode diff --git a/lgsm/config-default/config-lgsm/sbotsserver/_default.cfg b/lgsm/config-default/config-lgsm/sbotsserver/_default.cfg index 072036513..095f54417 100644 --- a/lgsm/config-default/config-lgsm/sbotsserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/sbotsserver/_default.cfg @@ -127,6 +127,7 @@ steammaster="false" # 8: 7 Days to Die # 9: GoldSrc # 10: Avorion +# 11: end stopmode="2" ## Query mode diff --git a/lgsm/config-default/config-lgsm/sbserver/_default.cfg b/lgsm/config-default/config-lgsm/sbserver/_default.cfg index aff6f3558..2476ddf0f 100644 --- a/lgsm/config-default/config-lgsm/sbserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/sbserver/_default.cfg @@ -126,6 +126,7 @@ steammaster="false" # 8: 7 Days to Die # 9: GoldSrc # 10: Avorion +# 11: end stopmode="2" ## Query mode diff --git a/lgsm/config-default/config-lgsm/sdtdserver/_default.cfg b/lgsm/config-default/config-lgsm/sdtdserver/_default.cfg index ba1449654..5067aae26 100644 --- a/lgsm/config-default/config-lgsm/sdtdserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/sdtdserver/_default.cfg @@ -122,6 +122,7 @@ steammaster="true" # 8: 7 Days to Die # 9: GoldSrc # 10: Avorion +# 11: end stopmode="8" ## Query mode diff --git a/lgsm/config-default/config-lgsm/sfcserver/_default.cfg b/lgsm/config-default/config-lgsm/sfcserver/_default.cfg index 736aac82a..866194cc9 100644 --- a/lgsm/config-default/config-lgsm/sfcserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/sfcserver/_default.cfg @@ -127,6 +127,7 @@ steammaster="true" # 8: 7 Days to Die # 9: GoldSrc # 10: Avorion +# 11: end stopmode="3" ## Query mode diff --git a/lgsm/config-default/config-lgsm/sof2server/_default.cfg b/lgsm/config-default/config-lgsm/sof2server/_default.cfg index 090330f49..408497753 100644 --- a/lgsm/config-default/config-lgsm/sof2server/_default.cfg +++ b/lgsm/config-default/config-lgsm/sof2server/_default.cfg @@ -112,6 +112,7 @@ sleeptime="0.5" # 8: 7 Days to Die # 9: GoldSrc # 10: Avorion +# 11: end stopmode="3" ## Query mode diff --git a/lgsm/config-default/config-lgsm/solserver/_default.cfg b/lgsm/config-default/config-lgsm/solserver/_default.cfg index 9f34b9732..4a80b1634 100644 --- a/lgsm/config-default/config-lgsm/solserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/solserver/_default.cfg @@ -118,6 +118,7 @@ betapassword="" # 8: 7 Days to Die # 9: GoldSrc # 10: Avorion +# 11: end stopmode="2" ## Query mode diff --git a/lgsm/config-default/config-lgsm/squadserver/_default.cfg b/lgsm/config-default/config-lgsm/squadserver/_default.cfg index 5e5e6bbfa..c0ef25dea 100644 --- a/lgsm/config-default/config-lgsm/squadserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/squadserver/_default.cfg @@ -124,6 +124,7 @@ steammaster="false" # 8: 7 Days to Die # 9: GoldSrc # 10: Avorion +# 11: end stopmode="2" ## Query mode diff --git a/lgsm/config-default/config-lgsm/ss3server/_default.cfg b/lgsm/config-default/config-lgsm/ss3server/_default.cfg index f4f355ea5..ec008dd8d 100644 --- a/lgsm/config-default/config-lgsm/ss3server/_default.cfg +++ b/lgsm/config-default/config-lgsm/ss3server/_default.cfg @@ -123,6 +123,7 @@ steammaster="false" # 8: 7 Days to Die # 9: GoldSrc # 10: Avorion +# 11: end stopmode="2" ## Query mode diff --git a/lgsm/config-default/config-lgsm/stserver/_default.cfg b/lgsm/config-default/config-lgsm/stserver/_default.cfg index f1dff6076..e0210738d 100644 --- a/lgsm/config-default/config-lgsm/stserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/stserver/_default.cfg @@ -129,6 +129,7 @@ steammaster="false" # 8: 7 Days to Die # 9: GoldSrc # 10: Avorion +# 11: end stopmode="2" ## Query mode diff --git a/lgsm/config-default/config-lgsm/svenserver/_default.cfg b/lgsm/config-default/config-lgsm/svenserver/_default.cfg index c6f83597e..a422cda8d 100644 --- a/lgsm/config-default/config-lgsm/svenserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/svenserver/_default.cfg @@ -126,6 +126,7 @@ steammaster="true" # 8: 7 Days to Die # 9: GoldSrc # 10: Avorion +# 11: end stopmode="9" ## Query mode diff --git a/lgsm/config-default/config-lgsm/terrariaserver/_default.cfg b/lgsm/config-default/config-lgsm/terrariaserver/_default.cfg index 4f8d9b871..1ec6f491a 100644 --- a/lgsm/config-default/config-lgsm/terrariaserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/terrariaserver/_default.cfg @@ -126,6 +126,7 @@ steammaster="false" # 8: 7 Days to Die # 9: GoldSrc # 10: Avorion +# 11: end stopmode="7" ## Query mode diff --git a/lgsm/config-default/config-lgsm/tf2server/_default.cfg b/lgsm/config-default/config-lgsm/tf2server/_default.cfg index cc0da1d9b..97748938a 100644 --- a/lgsm/config-default/config-lgsm/tf2server/_default.cfg +++ b/lgsm/config-default/config-lgsm/tf2server/_default.cfg @@ -132,6 +132,7 @@ steammaster="true" # 8: 7 Days to Die # 9: GoldSrc # 10: Avorion +# 11: end stopmode="3" ## Query mode diff --git a/lgsm/config-default/config-lgsm/tfcserver/_default.cfg b/lgsm/config-default/config-lgsm/tfcserver/_default.cfg index d0cdd1a9d..2c1a1d4a5 100644 --- a/lgsm/config-default/config-lgsm/tfcserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/tfcserver/_default.cfg @@ -127,6 +127,7 @@ steammaster="true" # 8: 7 Days to Die # 9: GoldSrc # 10: Avorion +# 11: end stopmode="9" ## Query mode diff --git a/lgsm/config-default/config-lgsm/ts3server/_default.cfg b/lgsm/config-default/config-lgsm/ts3server/_default.cfg index 3a511b394..4f604d700 100644 --- a/lgsm/config-default/config-lgsm/ts3server/_default.cfg +++ b/lgsm/config-default/config-lgsm/ts3server/_default.cfg @@ -113,6 +113,7 @@ sleeptime="0.5" # 8: 7 Days to Die # 9: GoldSrc # 10: Avorion +# 11: end stopmode="2" ## Query mode diff --git a/lgsm/config-default/config-lgsm/tsserver/_default.cfg b/lgsm/config-default/config-lgsm/tsserver/_default.cfg index e52209385..150d9ad46 100644 --- a/lgsm/config-default/config-lgsm/tsserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/tsserver/_default.cfg @@ -127,6 +127,7 @@ steammaster="true" # 8: 7 Days to Die # 9: GoldSrc # 10: Avorion +# 11: end stopmode="9" ## Query mode diff --git a/lgsm/config-default/config-lgsm/tuserver/_default.cfg b/lgsm/config-default/config-lgsm/tuserver/_default.cfg index ba17f9e13..555ccc397 100644 --- a/lgsm/config-default/config-lgsm/tuserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/tuserver/_default.cfg @@ -129,6 +129,7 @@ steammaster="false" # 8: 7 Days to Die # 9: GoldSrc # 10: Avorion +# 11: end stopmode="2" ## Query mode diff --git a/lgsm/config-default/config-lgsm/twserver/_default.cfg b/lgsm/config-default/config-lgsm/twserver/_default.cfg index 8448da0f8..2be04f44b 100644 --- a/lgsm/config-default/config-lgsm/twserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/twserver/_default.cfg @@ -126,6 +126,7 @@ steammaster="false" # 8: 7 Days to Die # 9: GoldSrc # 10: Avorion +# 11: end stopmode="2" ## Query mode diff --git a/lgsm/config-default/config-lgsm/untserver/_default.cfg b/lgsm/config-default/config-lgsm/untserver/_default.cfg index f7cc5d989..92fc25b4a 100644 --- a/lgsm/config-default/config-lgsm/untserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/untserver/_default.cfg @@ -129,6 +129,7 @@ steammaster="false" # 8: 7 Days to Die # 9: GoldSrc # 10: Avorion +# 11: end stopmode="2" ## Query mode diff --git a/lgsm/config-default/config-lgsm/ut2k4server/_default.cfg b/lgsm/config-default/config-lgsm/ut2k4server/_default.cfg index 9c4164c72..91bad0924 100644 --- a/lgsm/config-default/config-lgsm/ut2k4server/_default.cfg +++ b/lgsm/config-default/config-lgsm/ut2k4server/_default.cfg @@ -111,6 +111,7 @@ sleeptime="0.5" # 8: 7 Days to Die # 9: GoldSrc # 10: Avorion +# 11: end stopmode="2" ## Query mode diff --git a/lgsm/config-default/config-lgsm/ut3server/_default.cfg b/lgsm/config-default/config-lgsm/ut3server/_default.cfg index b42227859..b9015d5de 100644 --- a/lgsm/config-default/config-lgsm/ut3server/_default.cfg +++ b/lgsm/config-default/config-lgsm/ut3server/_default.cfg @@ -127,6 +127,7 @@ sleeptime="0.5" # 8: 7 Days to Die # 9: GoldSrc # 10: Avorion +# 11: end stopmode="2" ## Query mode diff --git a/lgsm/config-default/config-lgsm/ut99server/_default.cfg b/lgsm/config-default/config-lgsm/ut99server/_default.cfg index caab7ffea..713623690 100644 --- a/lgsm/config-default/config-lgsm/ut99server/_default.cfg +++ b/lgsm/config-default/config-lgsm/ut99server/_default.cfg @@ -111,6 +111,7 @@ sleeptime="0.5" # 8: 7 Days to Die # 9: GoldSrc # 10: Avorion +# 11: end stopmode="2" ## Query mode diff --git a/lgsm/config-default/config-lgsm/utserver/_default.cfg b/lgsm/config-default/config-lgsm/utserver/_default.cfg index 40d6cc526..c60cb1a50 100644 --- a/lgsm/config-default/config-lgsm/utserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/utserver/_default.cfg @@ -115,6 +115,7 @@ sleeptime="0.5" # 8: 7 Days to Die # 9: GoldSrc # 10: Avorion +# 11: end stopmode="2" ## Query mode diff --git a/lgsm/config-default/config-lgsm/vsserver/_default.cfg b/lgsm/config-default/config-lgsm/vsserver/_default.cfg index 5f28ad5c9..7f2ef3b3b 100644 --- a/lgsm/config-default/config-lgsm/vsserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/vsserver/_default.cfg @@ -127,6 +127,7 @@ steammaster="true" # 8: 7 Days to Die # 9: GoldSrc # 10: Avorion +# 11: end stopmode="9" ## Query mode diff --git a/lgsm/config-default/config-lgsm/wetserver/_default.cfg b/lgsm/config-default/config-lgsm/wetserver/_default.cfg index 54ee3d25b..67a3ceff0 100644 --- a/lgsm/config-default/config-lgsm/wetserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/wetserver/_default.cfg @@ -107,6 +107,7 @@ sleeptime="0.5" # 8: 7 Days to Die # 9: GoldSrc # 10: Avorion +# 11: end stopmode="3" ## Query mode diff --git a/lgsm/config-default/config-lgsm/wfserver/_default.cfg b/lgsm/config-default/config-lgsm/wfserver/_default.cfg index c518fde43..8fa5ec1f8 100644 --- a/lgsm/config-default/config-lgsm/wfserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/wfserver/_default.cfg @@ -112,6 +112,7 @@ sleeptime="0.5" # 8: 7 Days to Die # 9: GoldSrc # 10: Avorion +# 11: end stopmode="3" ## Query mode diff --git a/lgsm/config-default/config-lgsm/wurmserver/_default.cfg b/lgsm/config-default/config-lgsm/wurmserver/_default.cfg index dcf980984..4c95a5409 100644 --- a/lgsm/config-default/config-lgsm/wurmserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/wurmserver/_default.cfg @@ -118,6 +118,7 @@ steammaster="false" # 8: 7 Days to Die # 9: GoldSrc # 10: Avorion +# 11: end stopmode="2" ## Query mode diff --git a/lgsm/config-default/config-lgsm/zmrserver/_default.cfg b/lgsm/config-default/config-lgsm/zmrserver/_default.cfg index b2271daad..e0204ff07 100644 --- a/lgsm/config-default/config-lgsm/zmrserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/zmrserver/_default.cfg @@ -127,6 +127,7 @@ steammaster="true" # 8: 7 Days to Die # 9: GoldSrc # 10: Avorion +# 11: end stopmode="3" ## Query mode diff --git a/lgsm/config-default/config-lgsm/zpsserver/_default.cfg b/lgsm/config-default/config-lgsm/zpsserver/_default.cfg index 41cea0c00..69d5383f5 100644 --- a/lgsm/config-default/config-lgsm/zpsserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/zpsserver/_default.cfg @@ -132,6 +132,7 @@ steammaster="true" # 8: 7 Days to Die # 9: GoldSrc # 10: Avorion +# 11: end stopmode="3" ## Query mode diff --git a/lgsm/functions/command_stop.sh b/lgsm/functions/command_stop.sh index 085f9996a..58e28a9ca 100644 --- a/lgsm/functions/command_stop.sh +++ b/lgsm/functions/command_stop.sh @@ -231,6 +231,8 @@ fn_stop_graceful_select(){ fn_stop_graceful_goldsrc elif [ "${stopmode}" == "10" ]; then fn_stop_graceful_avorion + elif [ "${stopmode}" == "11" ]; then + fn_stop_graceful_cmd "end" 30 fi } diff --git a/tests/tests_defaultcfg/defaultcfg_1.txt b/tests/tests_defaultcfg/defaultcfg_1.txt index 505b6b1f0..88f6adf5c 100644 --- a/tests/tests_defaultcfg/defaultcfg_1.txt +++ b/tests/tests_defaultcfg/defaultcfg_1.txt @@ -41,6 +41,7 @@ # 8: 7 Days to Die # 9: GoldSrc # 10: Avorion +# 11: end ## Game Server Details # Do not edit #### Directories #### From f020669697c3982f559b7edb96babff74ec4b090 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Mon, 13 Jul 2020 23:34:33 +0100 Subject: [PATCH 422/534] feat(details): add appid and branch password to details (#2964) --- lgsm/functions/info_messages.sh | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/lgsm/functions/info_messages.sh b/lgsm/functions/info_messages.sh index d423e0f4a..cde94d319 100644 --- a/lgsm/functions/info_messages.sh +++ b/lgsm/functions/info_messages.sh @@ -187,11 +187,21 @@ fn_info_message_gameserver(){ echo -e "${lightblue}Server Description:\t${default}${serverdescription}" fi + # Appid + if [ -n "${appid}" ]; then + echo -e "${lightblue}App ID:\t${default}${appid}" + fi + # Branch if [ -n "${branch}" ]; then echo -e "${lightblue}Branch:\t${default}${branch}" fi + # Beta Password + if [ -n "${betapassword}" ]; then + echo -e "${lightblue}Beta Password:\t${default}${betapassword}" + fi + # Server ip if [ "${multiple_ip}" == "1" ]; then echo -e "${lightblue}Server IP:\t${default}NOT SET" From 0573131baa1e85b2d21c4cad3f3a4175ab948352 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Tue, 14 Jul 2020 11:18:51 +0100 Subject: [PATCH 423/534] resolve some bugs in CONTRIBUTING.md --- CONTRIBUTING.md | 54 ++++++++++++++++++++++++++----------------------- 1 file changed, 29 insertions(+), 25 deletions(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 2cadd7e54..7a48eef1b 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -6,9 +6,9 @@ The following is a set of guidelines for contributing to LinuxGSM, which are hos ## Table of Contents * [Contributing to LinuxGSM](#contributing-to-linuxgsm) - * [Table of Contents](#table-of-contents) - * [Code of Conduct](#code-of-conduct) - * [Bug/Enhancement Contributions](#---bug-enhancement-contributions---) +* [Table of Contents](#table-of-contents) +* [Code of Conduct](#code-of-conduct) +* [Bug/Enhancement Contributions](#---bug-enhancement-contributions---) * [Reporting Bugs](#--reporting-bugs) * [Before Submitting A Bug Report](#before-submitting-a-bug-report) * [How Do I Submit A (Good) Bug Report?](#how-do-i-submit-a--good--bug-report-) @@ -41,11 +41,11 @@ This project and everyone participating in it are governed by the [LinuxGSM Code This section guides you through submitting a bug report for LinuxGSM. Following these guidelines help maintainers and the community understand your report 📝, reproduce the behaviour💻, and find any related reports 🔎. -Before creating bug reports, please check [this list](https://github.com/GameServerManagers/linuxgsm/blob/master/CONTRIBUTING.md#before-submitting-a-bug-report) as you might find out that you don’t need to create one. When you are creating a bug report, please [include as many details as possible](https://github.com/atom/atom/blob/master/CONTRIBUTING.md#how-do-i-submit-a-good-bug-report). Fill out [the required template](https://github.com/atom/.github/blob/master/.github/ISSUE_TEMPLATE/bug_report.md), the information it asks for helps us resolve issues faster. +Before creating bug reports, please check [this list](https://github.com/GameServerManagers/linuxgsm/blob/master/CONTRIBUTING.md#before-submitting-a-bug-report) as you might find out that you don’t need to create one. When you are creating a bug report, please [include as many details as possible](https://github.com/GameServerManagers/linuxgsm/blob/master/CONTRIBUTING.md#how-do-i-submit-a-good-bug-report). Fill out [the required template]([https://github.com/GameServerManagers/LinuxGSM/issues/new/choose](https://github.com/GameServerManagers/LinuxGSM/issues/new/choose)), the information it asks for helps us resolve issues faster. #### Before Submitting A Bug Report -* **Check the** [**documentation**](https://docs.linuxgsm.com/%5D(https://docs.linuxgsm.com/))**.** You might be able to find the cause of the problem and fix things yourself. +* **Check the [documentation](https://docs.linuxgsm.com).** You might be able to find the cause of the problem and fix things yourself. * **Check that the problem is not related to** [**support page**](https://linuxgsm/com/support) for links to other support options. * **Check the** [**support page**](https://linuxgsm/com/support) for links to other support options. * **Perform a** [**cursory search**](https://github.com/search?q=org:GameServerManagers%20type:issues&type=Issues) to see if the problem has already been reported. If it has **and the issue is still open**, add a comment to the existing issue and give it a thumbs up instead of opening a new one. @@ -83,19 +83,23 @@ Features are tracked as [GitHub issues](https://guides.github.com/features/issue ### 🎮 Game Server Requests -This section guides you through submitting a game server request for LinuxGSM, Following these guidelines help maintainers and the community understand your game server request 📝 - +This section guides you through submitting a game server request for LinuxGSM, Following these guidelines help maintainers and the community understand your game server request 📝. #### Before Submitting a Game Server Request -* **Check for existing** [**game server requests**](https://github.com/GameServerManagers/LinuxGSM/labels/type%3A%20game%20server%20request) to see if the new game server has already been suggested. If it has **and if the new game server is still open**, give it a thumbs up instead of opening a new one. +* **Check for existing** [**game server requests**](https://github.com/GameServerManagers/LinuxGSM/labels/type%3A%20game%20server%20request) to see if the new game server has already been suggested. If it has **and if the new game server is still open**, give it a thumbs. +* **Check the game server is supported on Linux**, this does not include Wine servers which we do not support. +#### How Do I Submit A (Good) Game Server Request? +* The title should be as follows: **[Server Request] Game Name** +* **Provide Steam App ID** if applicable +* **Supply any documentation/how-to guides** for the game server. ### 🎮 Game Server Specific Issues LinuxGSM is a management script that acts as a wrapper around game servers. These game servers are developed by different game developers such as Valve, Epic and Facepunch to name a few. -LinuxGSM has no control over the development and limited knowledge issues directly relating to the game servers themselves. The same also applies for any mods, add-ons, maps etc. +LinuxGSM has no control over the development and limited knowledge of issues directly relating to the game servers themselves. The same also applies for any mods, add-ons, maps etc. -If there is an issue with a specific game server or mod the best action may be to contact the game/mod developers on there support forums. If it is unclear some community members might be able to help. +If there is an issue with a specific game server or mod the best action may be to contact the game/mod developers on there support forums. If it is unclear some community members should be able to help. A [list](https://docs.linuxgsm.com/support/game-server) of known game developer forums is available on the [LinuxGSM docs](https://docs.linuxgsm.com/support/game-server). @@ -112,7 +116,7 @@ The process described here has several goals: Please follow these steps to have your contribution considered by the maintainers: -1. Follow all instructions in [the template](https://github.com/GameServerManagers/LinuxGSM/blob/master/.github/pull_request_template.md) +1. Follow all check-list in [the template](https://github.com/GameServerManagers/LinuxGSM/blob/master/.github/pull_request_template.md) 2. Follow the [style guides](#styleguides) 3. After you submit your pull request, verify that all [status checks](https://help.github.com/articles/about-status-checks/) are passing @@ -130,24 +134,24 @@ If applied, this commit will _your subject line here_ For example: -* If applied, this commit will _refactor subsystem X for readability_ -* If applied, this commit will _update getting started documentation_ -* If applied, this commit will _remove deprecated methods_ -* If applied, this commit will _release version 1.0.0_ -* If applied, this commit will _merge pull request #123 from user/branch_ +* If applied, this commit will **refactor subsystem X for readability** +* If applied, this commit will **update getting started documentation** +* If applied, this commit will **remove deprecated methods** +* If applied, this commit will **release version 1.0.0** +* If applied, this commit will **merge pull request #123 from user/branch** Notice how this doesn’t work for the other non-imperative forms: -* If applied, this commit will _fixed bug with Y_ -* If applied, this commit will _change the behaviour of X_ -* If applied, this commit will _more fixes for broken stuff_ -* If applied, this commit will _sweet new API methods_ +* If applied, this commit will **fixed bug with Y** +* If applied, this commit will **change the behaviour of X** +* If applied, this commit will **more fixes for broken stuff** +* If applied, this commit will **sweet new API methods** -Below is an example of the subject line for a pull request. +Below is an example of the subject line for a pull request: -feat(alerts): add slack support to alerts +**feat(alerts): add slack support to alerts** -fix(csgoserver): remove SteamCMD auth requirement 32-bit workaround +**fix(csgoserver): remove SteamCMD auth requirement 32-bit workaround** ### Testing @@ -155,7 +159,7 @@ fix(csgoserver): remove SteamCMD auth requirement 32-bit workaround When a Pull Request is submitted, a series of status check tests are conducted. These tests will asses the code quality, complete CI tests etc. To get your PR merged these status checks must pass. #### Test Environment -It is recommended that you have a testing environment available to test your code during development. To test your own cod you must change some variables within the `linuxgsm.sh` file. This will force the use of your own code branch. +It is recommended that you have a testing environment available to test your code during development. To test your own code you must change some variables within the `linuxgsm.sh` file. This will force the use of your own code branch. ```bash ## GitHub Branch Select # Allows for the use of different function files @@ -183,7 +187,7 @@ As well as code contributions it is possible to contribute by writing and improv ### Documentation Styleguide -LinuxGSM has various documentation available to assist users and developers. LinuxGSM primarily uses [GitBook](http://gitbook.com/) which uses the [Markdown](https://www.markdownguide.org/) document standard. LinuxGSM uses [Codacy](https://app.codacy.com/manual/GameServerManagers/LinuxGSM/dashboard) to analyse any Pull Requests to give you feedback on markup standards. +LinuxGSM has various documentation available to assist [users](https://docs.linuxgsm.com) and [developers](dev-docs.linuxgsm.com). LinuxGSM primarily uses [GitBook](http://gitbook.com/) which uses the [Markdown](https://www.markdownguide.org/) document standard. LinuxGSM uses [Codacy](https://app.codacy.com/manual/GameServerManagers/LinuxGSM/dashboard) to analyse any Pull Requests to give you feedback on markup standards. ## Issue and Pull Request Labels From b6eacc5620e0cb424b437dcbf4142e5dc457138f Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Tue, 14 Jul 2020 11:27:37 +0100 Subject: [PATCH 424/534] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 2b0f05ec1..554cec031 100644 --- a/README.md +++ b/README.md @@ -47,7 +47,7 @@ There are a various ways to get support, check out the [support](https://linuxgs ## :heart: Donate -If you would like to [donate](https://linuxgsm.com/donate) to the project there are several ways you can, via [GitHub Sponsors](https://github.com/sponsors/dgibbs64), [Patreon](https://www.patreon.com/dgibbs) and [PayPal](https://www.paypal.me/dgibbs64). I would like to thank everyone who has previously sent a donation. Since 2012 LinuxGSM has been steadily growing with new servers, features and improvements added regularly. +If you would like to [donate](https://linuxgsm.com/donate) to the project there are several ways you can, via [GitHub Sponsors](https://github.com/sponsors/dgibbs64) and [PayPal](https://www.paypal.me/dgibbs64). I would like to thank everyone who has previously sent a donation. Since 2012 LinuxGSM has been steadily growing with new servers, features and improvements added regularly. ## Contributors From 69c8550c13749bac3e6d55b36252e472637f9bad Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Tue, 14 Jul 2020 11:32:07 +0100 Subject: [PATCH 425/534] Update table of contents --- CONTRIBUTING.md | 52 +++++++++++++++++++++++++------------------------ 1 file changed, 27 insertions(+), 25 deletions(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 7a48eef1b..3310ea3c6 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -5,32 +5,34 @@ The following is a set of guidelines for contributing to LinuxGSM, which are hosted in the [GameServerManagers Organization](https://github.com/gameservermanagers) on GitHub. These are mostly guidelines, not rules. Use your best judgment, and feel free to propose changes to this document in a pull request. ## Table of Contents -* [Contributing to LinuxGSM](#contributing-to-linuxgsm) -* [Table of Contents](#table-of-contents) -* [Code of Conduct](#code-of-conduct) -* [Bug/Enhancement Contributions](#---bug-enhancement-contributions---) - * [Reporting Bugs](#--reporting-bugs) - * [Before Submitting A Bug Report](#before-submitting-a-bug-report) - * [How Do I Submit A (Good) Bug Report?](#how-do-i-submit-a--good--bug-report-) - * [Suggesting Features](#--suggesting-features) - * [Before Submitting An Feature Suggestion](#before-submitting-an-feature-suggestion) - * [How Do I Submit A (Good) Feature Suggestion?](#how-do-i-submit-a--good--feature-suggestion-) - * [Game Server Requests](#---game-server-requests) - * [Before Submitting a Game Server Request](#before-submitting-a-game-server-request) - * [How Do I Submit A (Good) Game Server Suggestion?](#how-do-i-submit-a--good--feature-suggestion--1) - * [Game Server Specific Issues](#---game-server-specific-issues) - * [Code Contributions](#---code-contributions) - * [Pull Requests](#pull-requests) - * [Pull Request naming convention](#pull-request-naming-convention) - * [Testing](#testing) - * [Pull Request Status Checks](#pull-request-status-checks) - * [Test Environment](#test-environment) - * [Styleguides](#-wine-glass--styleguides) - * [Git Commit Messages](#git-commit-messages) - * [BASH Styleguide](#bash-styleguide) - * [Document Contributions](#-blue-book--document-contributions) - * [Documentation Styleguide](#documentation-styleguide) + + [Contributing to LinuxGSM](#contributing-to-linuxgsm) + * [Table of Contents](#table-of-contents) + * [Code of Conduct](#code-of-conduct) + * [🎉 Bug/Enhancement Contributions 🐛](#---bug-enhancement-contributions---) + + [🐛Reporting Bugs](#--reporting-bugs) + - [Before Submitting A Bug Report](#before-submitting-a-bug-report) + - [How Do I Submit A (Good) Bug Report?](#how-do-i-submit-a--good--bug-report-) + + [🎉Suggesting Features](#--suggesting-features) + - [Before Submitting An Feature Suggestion](#before-submitting-an-feature-suggestion) + - [How Do I Submit A (Good) Feature Suggestion?](#how-do-i-submit-a--good--feature-suggestion-) + + [🎮 Game Server Requests](#---game-server-requests) + - [Before Submitting a Game Server Request](#before-submitting-a-game-server-request) + - [How Do I Submit A (Good) Game Server Request?](#how-do-i-submit-a--good--game-server-request-) + + [🎮 Game Server Specific Issues](#---game-server-specific-issues) + * [💻 Code Contributions](#---code-contributions) + + [Pull Requests](#pull-requests) + - [Pull Request naming convention](#pull-request-naming-convention) + + [Testing](#testing) + - [Pull Request Status Checks](#pull-request-status-checks) + - [Test Environment](#test-environment) + + [:wine_glass: Styleguides](#-wine-glass--styleguides) + - [Git Commit Messages](#git-commit-messages) + - [BASH Styleguide](#bash-styleguide) + * [:blue_book: Document Contributions](#-blue-book--document-contributions) + + [Documentation Styleguide](#documentation-styleguide) * [Issue and Pull Request Labels](#issue-and-pull-request-labels) + ## Code of Conduct This project and everyone participating in it are governed by the [LinuxGSM Code of Conduct](https://github.com/GameServerManagers/linuxgsm/blob/master/CODE_OF_CONDUCT.md). By participating, you are expected to uphold this code. Please report unacceptable behaviour to [daniel.gibbs@linuxgsm.com](mailto:daniel.gibbs@linuxgsm.com). From 97e794430145e21666663c0fc169b729f02f0066 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Tue, 14 Jul 2020 11:36:53 +0100 Subject: [PATCH 426/534] Update CONTRIBUTING.md --- CONTRIBUTING.md | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 3310ea3c6..bcb1caf7f 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -9,18 +9,18 @@ The following is a set of guidelines for contributing to LinuxGSM, which are hos [Contributing to LinuxGSM](#contributing-to-linuxgsm) * [Table of Contents](#table-of-contents) * [Code of Conduct](#code-of-conduct) - * [🎉 Bug/Enhancement Contributions 🐛](#---bug-enhancement-contributions---) - + [🐛Reporting Bugs](#--reporting-bugs) + * [🎉 Bug/Enhancement Contributions 🐛](#bug-enhancement-contributions) + + [🐛Reporting Bugs](#reporting-bugs) - [Before Submitting A Bug Report](#before-submitting-a-bug-report) - [How Do I Submit A (Good) Bug Report?](#how-do-i-submit-a--good--bug-report-) - + [🎉Suggesting Features](#--suggesting-features) + + [🎉Suggesting Features](#suggesting-features) - [Before Submitting An Feature Suggestion](#before-submitting-an-feature-suggestion) - [How Do I Submit A (Good) Feature Suggestion?](#how-do-i-submit-a--good--feature-suggestion-) - + [🎮 Game Server Requests](#---game-server-requests) + + [🎮 Game Server Requests](#game-server-requests) - [Before Submitting a Game Server Request](#before-submitting-a-game-server-request) - [How Do I Submit A (Good) Game Server Request?](#how-do-i-submit-a--good--game-server-request-) - + [🎮 Game Server Specific Issues](#---game-server-specific-issues) - * [💻 Code Contributions](#---code-contributions) + + [🎮 Game Server Specific Issues](#game-server-specific-issues) + * [💻 Code Contributions](#code-contributions) + [Pull Requests](#pull-requests) - [Pull Request naming convention](#pull-request-naming-convention) + [Testing](#testing) From 70ab6667c6d42c385efeca3667e90edfbf256680 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Wed, 15 Jul 2020 21:19:46 +0100 Subject: [PATCH 427/534] New README.md header logo --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 554cec031..7e8c789d3 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@


- LinuxGSM + LinuxGSM

[![LinuxGSM](https://img.shields.io/badge/-LinuxGSM-2b2b2b.svg?logo=data%3Aimage%2Fpng%3Bbase64%2CiVBORw0KGgoAAAANSUhEUgAAACsAAABACAYAAACDbo5ZAAAGD0lEQVR4AcWYa2wUVRvHz75c2vJ2disXoUBEVIioRAx%2BMIFA1IRwUS6KCCiIKBrvhEYiiGm5iBgk8QOGEgUUDYTttmVZWFr2UmwURS6iYAoCtmisElSsdHdbkT7%2BTzoNy%2BGc2dm54C%2F5Rdkz85x%2FZ86ZOXOYXYhIg3Phx%2FA4PAcv6f%2Btg5vhHJjP3EcZsgsshufJHH%2FAJbDztQ7aG35J1vgCXn%2BtgvrgEbLHYei9FmE3kDOUuh10OGwjZ7gEh7kZ9gNyllK3gnrg7%2BQs56DHjbCDyB0GuRF2ArnDeDfCziF3mO1G2FfJHRa4EXYpuUOxG2GXkzuUuBH2TXKH5W6ELSV3eM%2BNsOUk5yQcAY8p2uvgSPitor3MjbB1UOQXOFBvHwpbhPYWOExvL4SNUOQ7p4P2JTlzhOPmCu0vCu1PQpE2WOhk2MdJjk9y7HNwP1wEPUJbAcmZ6WTYrYolnifbxZBiibnFySHQCkUaLdY7C0V4%2FT5OhF1JcuIW6%2B0lOcvsBi2Ezao3j8Ov7Quwj52w60jNKIs1R5GatVaDDoEXSU4D7GSxbidYT3IuwjusFK0mNUVMwaZNNbl%2B%2F87hoVCom0HthaQmnG3QB0lNPcxlCvz%2B0GtlZTuorCxYYlA%2FDzbY%2FnrAgV3hCVLzCDMgEAi9wMMi9IIM%2FUwnNXWwi5mwRaSmmmXA798xq%2F3Khp420VeE1LyS6eQeBhttSXgzywCCToIUCOyYZvKLOWWwkdfd6ORVpGYJM0F5efDe9mEQHGty2BWTmhVGO4PNBmOoKzMBxmo%2FhD25dWvljSbD5hjMkb9gT9lJq63Mzi1bKkbjloc7xBWtwiRrDASCVRi%2FRxA8if%2BvrawMTzYI%2FACpeUv2KFFtDcUyTKilCHcis8G1Ga7wHpLzG8wVFs1K7jaeUKHZfIxmkj9%2FM4S9x9RGiMEudo0QbCVu9Xqn5PWEwLUk5%2FP0iaXac53I0kAH9Sau4m54lo%2FdTMfyekLYKQZ7ub34AbMMlmw5irC2VYTN0fuVMYMf8JHxJ7L7YYXAlSRnI2%2F8RtH4siTsDMz%2BZ5yS15OEXUxyDjGD1%2BvEq8MG16CDzY6JepKwT6geYbzxb0XjGMl7vwGSgzZIwo4nOa1M8Yr9Afb%2Fj8L21%2FsXaeaNZ2A6KTiEASph%2F0vF80cn4tokqu79fzfCUk2vfF4%2FFdFGEjGPHvg2yWrsDG%2F4%2BqpZB8jPOiXjWk0y5iXdM3XhKUvxBTA9UvHuvNPh%2Bzb%2BWj10z6nwuHWBbQFMvNCjKnn7qd1jS%2Fnx9VX3b6jC%2BbwOr5eMe3%2B83IcW4%2F3qgT%2BUTbA9srGaiHsn8AKiF6Ld%2FxF%2FOx6eeAJXabvK78MTTornNMd6XJTVR7%2Fj9bBjhFxV%2FMc1kJOAy2AeA%2FgrV4mFVDZFCqm8rEJ6qysCAWqK9iaztRJRbWXa4moFTELOav7jY%2FqAvoXp0Gc9NX7bIZl17%2FZl0rC1wRLeno0NvP%2B0CTcYNnS8wW6CtzNANaxzKqo9hRNOQ8rGo7tmSsMe2zWdt2frqVRcm5s2fofCgawDNHRNxnyfqgsYez4y4ADCjRM9H73hsNWafILTQdaFiSTj%2BQ%2FxA6yH7d%2BCmR8XbYr0a7VTF2N4siSsb5qdos3R6%2FjGxpULFfw7EfORnbrI9TAToX0sD40%2F2ylcGdh2Rdhg%2BSf2gka9jRTqK9%2BGwgHz7RTfVbHxirDhivdthYUvMRX8aYAD9lstvi%2B0aDL2DUZ0eCBUNNVG0IP65FLTWqPdiqdC0koHTVXe7iyNRG23QotBEy1RbTAzQyrmnYUT2rLsoA13JpcB4eVC2daBM1g2JGLekmwf5On7EJfngfZTNnVSce8bFjaTmQdvs%2FXmO%2FJVpoXdx3RSUe9O00Fj3nUdy0RLgRHiHXOPGW1h2uKZ07c9rG%2Bxyefp23pQeyBIEQoavYlakrG8fnrY5yHn2fbxXzAgw7m8bT5zkkSk4C7cpmOK21esB%2FXAQ5DzFfTo43%2BF%2FDzf0eZ4wZ3MDSjMcvD6nIeOahGgia%2FyU3HforTPkWkwnakdn0cI9jqfbPjD%2FuQLJr6644snlgX%2FApOMoyd1R5%2FxAAAAAElFTkSuQmCC)](https://linuxgsm.com) [![Build Status](https://travis-ci.com/GameServerManagers/LinuxGSM.svg?branch=master)](https://travis-ci.com/GameServerManagers/LinuxGSM) [![Codacy Badge](https://api.codacy.com/project/badge/Grade/3e98be27840043a090c3ab6e35db44b0)](https://app.codacy.com/app/GameServerManagers/LinuxGSM?utm_source=github.com&utm_medium=referral&utm_content=GameServerManagers/LinuxGSM&utm_campaign=Badge_Grade_Dashboard) [![Codacy Badge](https://api.codacy.com/project/badge/Coverage/9ef77095e98a43618ddd57381f86b4be)](https://www.codacy.com/manual/GameServerManagers/LinuxGSM?utm_source=github.com&utm_medium=referral&utm_content=GameServerManagers/LinuxGSM&utm_campaign=Badge_Coverage) [![Backup Repo](https://github.com/GameServerManagers/LinuxGSM/workflows/Backup%20Repo/badge.svg)](https://bitbucket.org/GameServerManagers/linuxgsm) [![Discord](https://discordapp.com/api/guilds/127498813903601664/widget.png?style=shield)](https://linuxgsm.com/discord) [![MIT Licence](https://badges.frapsoft.com/os/mit/mit.svg?v=103)](https://github.com/GameServerManagers/LinuxGSM/blob/master/LICENSE) [![made-with-bash](https://img.shields.io/badge/-Made%20with%20Bash-1f425f.svg?logo=image%2Fpng%3Bbase64%2CiVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyZpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw%2FeHBhY2tldCBiZWdpbj0i77u%2FIiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8%2BIDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNi1jMTExIDc5LjE1ODMyNSwgMjAxNS8wOS8xMC0wMToxMDoyMCAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENDIDIwMTUgKFdpbmRvd3MpIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOkE3MDg2QTAyQUZCMzExRTVBMkQxRDMzMkJDMUQ4RDk3IiB4bXBNTTpEb2N1bWVudElEPSJ4bXAuZGlkOkE3MDg2QTAzQUZCMzExRTVBMkQxRDMzMkJDMUQ4RDk3Ij4gPHhtcE1NOkRlcml2ZWRGcm9tIHN0UmVmOmluc3RhbmNlSUQ9InhtcC5paWQ6QTcwODZBMDBBRkIzMTFFNUEyRDFEMzMyQkMxRDhEOTciIHN0UmVmOmRvY3VtZW50SUQ9InhtcC5kaWQ6QTcwODZBMDFBRkIzMTFFNUEyRDFEMzMyQkMxRDhEOTciLz4gPC9yZGY6RGVzY3JpcHRpb24%2BIDwvcmRmOlJERj4gPC94OnhtcG1ldGE%2BIDw%2FeHBhY2tldCBlbmQ9InIiPz6lm45hAAADkklEQVR42qyVa0yTVxzGn7d9Wy03MS2ii8s%2BeokYNQSVhCzOjXZOFNF4jx%2BMRmPUMEUEqVG36jo2thizLSQSMd4N8ZoQ8RKjJtooaCpK6ZoCtRXKpRempbTv5ey83bhkAUphz8fznvP8znn%2B%2F3NeEEJgNBoRRSmz0ub%2FfuxEacBg%2FDmYtiCjgo5NG2mBXq%2BH5I1ogMRk9Zbd%2BQU2e1ML6VPLOyf5tvBQ8yT1lG10imxsABm7SLs898GTpyYynEzP60hO3trHDKvMigUwdeaceacqzp7nOI4n0SSIIjl36ao4Z356OV07fSQAk6xJ3XGg%2BLCr1d1OYlVHp4eUHPnerU79ZA%2F1kuv1JQMAg%2BE4O2P23EumF3VkvHprsZKMzKwbRUXFEyTvSIEmTVbrysp%2BWr8wfQHGK6WChVa3bKUmdWou%2BjpArdGkzZ41c1zG%2Fu5uGH4swzd561F%2BuhIT4%2BLnSuPsv9%2BJKIpjNr9dXYOyk7%2FBZrcjIT4eCnoKgedJP4BEqhG77E3NKP31FO7cfQA5K0dSYuLgz2TwCWJSOBzG6crzKK%2BohNfni%2Bx6OMUMMNe%2Fgf7ocbw0v0acKg6J8Ql0q%2BT%2FAXR5PNi5dz9c71upuQqCKFAD%2BYhrZLEAmpodaHO3Qy6TI3NhBpbrshGtOWKOSMYwYGQM8nJzoFJNxP2HjyIQho4PewK6hBktoDcUwtIln4PjOWzflQ%2Be5yl0yCCYgYikTclGlxadio%2BBQCSiW1UXoVGrKYwH4RgMrjU1HAB4vR6LzWYfFUCKxfS8Ftk5qxHoCUQAUkRJaSEokkV6Y%2F%2BJUOC4hn6A39NVXVBYeNP8piH6HeA4fPbpdBQV5KOx0QaL1YppX3Jgk0TwH2Vg6S3u%2BdB91%2B%2FpuNYPYFl5uP5V7ZqvsrX7jxqMXR6ff3gCQSTzFI0a1TX3wIs8ul%2Bq4HuWAAiM39vhOuR1O1fQ2gT%2F26Z8Z5vrl2OHi9OXZn995nLV9aFfS6UC9JeJPfuK0NBohWpCHMSAAsFe74WWP%2BvT25wtP9Bpob6uGqqyDnOtaeumjRu%2ByFu36VntK%2FPA5umTJeUtPWZSU9BCgud661odVp3DZtkc7AnYR33RRC708PrVi1larW7XwZIjLnd7R6SgSqWSNjU1B3F72pz5TZbXmX5vV81Yb7Lg7XT%2FUXriu8XLVqw6c6XqWnBKiiYU%2BMt3wWF7u7i91XlSEITwSAZ%2FCzAAHsJVbwXYFFEAAAAASUVORK5CYII%3D)](https://www.gnu.org/software/bash/) From a941499479a291247b8690e0bebe8f287a939c17 Mon Sep 17 00:00:00 2001 From: Nathan <4490380+Grimston@users.noreply.github.com> Date: Fri, 17 Jul 2020 03:09:50 +0800 Subject: [PATCH 428/534] feat(rustserver): add support for Rust + app (#2965) --- lgsm/config-default/config-lgsm/rustserver/_default.cfg | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/lgsm/config-default/config-lgsm/rustserver/_default.cfg b/lgsm/config-default/config-lgsm/rustserver/_default.cfg index 93771879d..46192dddb 100644 --- a/lgsm/config-default/config-lgsm/rustserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/rustserver/_default.cfg @@ -13,6 +13,7 @@ ip="0.0.0.0" port="28015" rconport="28016" +appport=28082 rconpassword="CHANGE_ME" rconweb="1" # Value is: 1 for Facepunch's web panel; 0 for RCON tools like Rusty or Rustadmin servername="Rust" @@ -42,7 +43,7 @@ else # Keep randomness of the number if not set conditionalsalt="" fi -parms="-batchmode +server.ip ${ip} +server.port ${port} +server.tickrate ${tickrate} +server.hostname \"${servername}\" +server.identity \"${selfname}\" ${conditionalseed} ${conditionalsalt} +server.maxplayers ${maxplayers} +server.worldsize ${worldsize} +server.saveinterval ${saveinterval} +rcon.web ${rconweb} +rcon.ip ${ip} +rcon.port ${rconport} +rcon.password \"${rconpassword}\" -logfile \"${gamelogdate}\"" +parms="-batchmode +server.ip ${ip} +server.port ${port} +app.port ${appport} +server.tickrate ${tickrate} +server.hostname \"${servername}\" +server.identity \"${selfname}\" ${conditionalseed} ${conditionalsalt} +server.maxplayers ${maxplayers} +server.worldsize ${worldsize} +server.saveinterval ${saveinterval} +rcon.web ${rconweb} +rcon.ip ${ip} +rcon.port ${rconport} +rcon.password \"${rconpassword}\" -logfile \"${gamelogdate}\"" } #### LinuxGSM Settings #### From 4861d1374d5506ec28b631926d14ec5c30ce1e59 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Thu, 16 Jul 2020 21:29:15 +0100 Subject: [PATCH 429/534] feat(rustserver): console now has an output (#2966) --- lgsm/config-default/config-lgsm/rustserver/_default.cfg | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lgsm/config-default/config-lgsm/rustserver/_default.cfg b/lgsm/config-default/config-lgsm/rustserver/_default.cfg index 46192dddb..595cf3864 100644 --- a/lgsm/config-default/config-lgsm/rustserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/rustserver/_default.cfg @@ -43,7 +43,7 @@ else # Keep randomness of the number if not set conditionalsalt="" fi -parms="-batchmode +server.ip ${ip} +server.port ${port} +app.port ${appport} +server.tickrate ${tickrate} +server.hostname \"${servername}\" +server.identity \"${selfname}\" ${conditionalseed} ${conditionalsalt} +server.maxplayers ${maxplayers} +server.worldsize ${worldsize} +server.saveinterval ${saveinterval} +rcon.web ${rconweb} +rcon.ip ${ip} +rcon.port ${rconport} +rcon.password \"${rconpassword}\" -logfile \"${gamelogdate}\"" +parms="-batchmode +app.listenip ${ip} +app.port ${appport} +server.ip ${ip} +server.port ${port} +server.tickrate ${tickrate} +server.hostname \"${servername}\" +server.identity \"${selfname}\" ${conditionalseed} ${conditionalsalt} +server.maxplayers ${maxplayers} +server.worldsize ${worldsize} +server.saveinterval ${saveinterval} +rcon.web ${rconweb} +rcon.ip ${ip} +rcon.port ${rconport} +rcon.password \"${rconpassword}\" -logfile" } #### LinuxGSM Settings #### From c35ba0179b0d9f18ea4ca656653eacf19dd85e96 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Thu, 16 Jul 2020 22:22:34 +0100 Subject: [PATCH 430/534] Release v20.4.0 --- linuxgsm.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/linuxgsm.sh b/linuxgsm.sh index 849c76472..b832a8e1b 100755 --- a/linuxgsm.sh +++ b/linuxgsm.sh @@ -20,7 +20,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="v20.3.3" +version="v20.4.0" shortname="core" gameservername="core" commandname="CORE" From f4b2e8b4fd21fb409af59786de887b407efce56f Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Thu, 16 Jul 2020 22:26:23 +0100 Subject: [PATCH 431/534] Release v20.4.0 Release v20.4.0 --- lgsm/functions/core_functions.sh | 2 +- linuxgsm.sh | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/lgsm/functions/core_functions.sh b/lgsm/functions/core_functions.sh index 4b0387194..c0be8d8cc 100644 --- a/lgsm/functions/core_functions.sh +++ b/lgsm/functions/core_functions.sh @@ -7,7 +7,7 @@ functionselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" -modulesversion="v20.3.3" +modulesversion="v20.4.0" # Core diff --git a/linuxgsm.sh b/linuxgsm.sh index 849c76472..b832a8e1b 100755 --- a/linuxgsm.sh +++ b/linuxgsm.sh @@ -20,7 +20,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="v20.3.3" +version="v20.4.0" shortname="core" gameservername="core" commandname="CORE" From 6508caad67a68d936fdf0bc2131143793f8c029a Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Thu, 16 Jul 2020 23:16:52 +0100 Subject: [PATCH 432/534] fix(details): suppress jq error --- lgsm/functions/info_distro.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lgsm/functions/info_distro.sh b/lgsm/functions/info_distro.sh index c50953cdc..87c73aa3e 100644 --- a/lgsm/functions/info_distro.sh +++ b/lgsm/functions/info_distro.sh @@ -263,9 +263,9 @@ fi if [ "$(command -v jq 2>/dev/null)" ]; then if [ "${ip}" ]&&[ "${port}" ]; then if [ "${steammaster}" == "true" ]; then - masterserver=$(curl -m 3 -s 'https://api.steampowered.com/ISteamApps/GetServersAtAddress/v0001?addr='${ip}':'${port}'&format=json' | jq '.response.servers[]|.addr' | wc -l 2>/dev/null) + masterserver=$(curl -m 3 -s 'https://api.steampowered.com/ISteamApps/GetServersAtAddress/v0001?addr='${ip}':'${port}'&format=json' | jq '.response.servers[]?|.addr' | wc -l 2>/dev/null) if [ "${masterserver}" == "0" ]; then - masterserver=$(curl -m 3 -s 'https://api.steampowered.com/ISteamApps/GetServersAtAddress/v0001?addr='${extip}':'${port}'&format=json' | jq '.response.servers[]|.addr' | wc -l 2>/dev/null) + masterserver=$(curl -m 3 -s 'https://api.steampowered.com/ISteamApps/GetServersAtAddress/v0001?addr='${extip}':'${port}'&format=json' | jq '.response.servers[]?|.addr' | wc -l 2>/dev/null) fi if [ "${masterserver}" == "0" ]; then displaymasterserver="false" From 64e06d37064dea91cb77b0b2ee32222bc81ad148 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Fri, 17 Jul 2020 10:20:31 +0100 Subject: [PATCH 433/534] update sponsor url --- lgsm/functions/install_header.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lgsm/functions/install_header.sh b/lgsm/functions/install_header.sh index f67860dd4..dae205018 100644 --- a/lgsm/functions/install_header.sh +++ b/lgsm/functions/install_header.sh @@ -15,6 +15,6 @@ echo -e "by Daniel Gibbs" echo -e "${lightblue}Game:${default} ${gamename}" echo -e "${lightblue}Website:${default} https://linuxgsm.com" echo -e "${lightblue}Contributors:${default} https://linuxgsm.com/contrib" -echo -e "${lightblue}Donate:${default} https://linuxgsm.com/donate" +echo -e "${lightblue}Sponsor:${default} https://linuxgsm.com/sponsor" echo -e "=================================" fn_sleep_time From d327e93880fa5a2edf643514b6132805c0df1cec Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Fri, 17 Jul 2020 22:45:03 +0100 Subject: [PATCH 434/534] fix(log): allow logs to correctly display primary command (#2969) --- lgsm/functions/alert.sh | 2 +- lgsm/functions/check_last_update.sh | 2 +- lgsm/functions/check_version.sh | 2 +- lgsm/functions/command_backup.sh | 14 ++++++-------- lgsm/functions/command_console.sh | 13 ++++++------- lgsm/functions/command_debug.sh | 12 +++++------- lgsm/functions/command_details.sh | 10 ++++------ lgsm/functions/command_dev_clear_functions.sh | 10 ++++------ lgsm/functions/command_dev_debug.sh | 10 ++++------ lgsm/functions/command_dev_detect_deps.sh | 10 ++++------ lgsm/functions/command_dev_detect_glibc.sh | 10 ++++------ lgsm/functions/command_dev_detect_ldd.sh | 10 ++++------ lgsm/functions/command_dev_query_raw.sh | 10 ++++------ lgsm/functions/command_donate.sh | 10 ++++------ lgsm/functions/command_fastdl.sh | 10 ++++------ lgsm/functions/command_install.sh | 12 +++++------- .../functions/command_install_resources_mta.sh | 10 ++++------ lgsm/functions/command_mods_install.sh | 10 ++++------ lgsm/functions/command_mods_remove.sh | 12 +++++------- lgsm/functions/command_mods_update.sh | 10 ++++------ lgsm/functions/command_monitor.sh | 12 +++++------- lgsm/functions/command_postdetails.sh | 10 ++++------ lgsm/functions/command_restart.sh | 12 +++++------- lgsm/functions/command_start.sh | 12 +++++------- lgsm/functions/command_stop.sh | 10 ++++------ lgsm/functions/command_test_alert.sh | 10 ++++------ lgsm/functions/command_ts3_server_pass.sh | 18 ++++++++---------- lgsm/functions/command_update.sh | 10 ++++------ lgsm/functions/command_update_linuxgsm.sh | 10 ++++------ lgsm/functions/command_validate.sh | 14 ++++++-------- lgsm/functions/command_wipe.sh | 14 ++++++-------- lgsm/functions/compress_unreal2_maps.sh | 10 ++++------ lgsm/functions/compress_ut99_maps.sh | 10 ++++------ lgsm/functions/core_messages.sh | 17 +++++++++++++++++ lgsm/functions/fix_kf.sh | 8 ++++---- lgsm/functions/fix_kf2.sh | 4 ++-- lgsm/functions/fix_ro.sh | 8 ++++---- lgsm/functions/fix_ut2k4.sh | 8 ++++---- lgsm/functions/fix_ut3.sh | 4 ++-- lgsm/functions/fix_wurm.sh | 4 ++-- lgsm/functions/install_modules.sh | 2 +- lgsm/functions/update_factorio.sh | 8 ++++---- lgsm/functions/update_minecraft.sh | 10 +++++----- lgsm/functions/update_minecraft_bedrock.sh | 12 ++++++------ lgsm/functions/update_mta.sh | 8 ++++---- lgsm/functions/update_mumble.sh | 6 +++--- lgsm/functions/update_steamcmd.sh | 8 ++++---- lgsm/functions/update_ts3.sh | 8 ++++---- 48 files changed, 207 insertions(+), 249 deletions(-) diff --git a/lgsm/functions/alert.sh b/lgsm/functions/alert.sh index 236ca6461..704a3f3eb 100644 --- a/lgsm/functions/alert.sh +++ b/lgsm/functions/alert.sh @@ -99,7 +99,7 @@ fn_alert_log if [ "${postalert}" == "on" ]&&[ -n "${postalert}" ]; then exitbypass=1 command_postdetails.sh - fn_commandname + fn_firstcommand_reset elif [ "${postalert}" != "on" ]&&[ "${commandname}" == "TEST-ALERT" ]; then fn_print_warn_nl "More Info not enabled" fn_script_log_warn "More Info alerts not enabled" diff --git a/lgsm/functions/check_last_update.sh b/lgsm/functions/check_last_update.sh index 08343e560..99253d749 100644 --- a/lgsm/functions/check_last_update.sh +++ b/lgsm/functions/check_last_update.sh @@ -20,6 +20,6 @@ if [ -f "${lockdir}/lastupdate.lock" ]&&[ "${status}" != "0" ]; then fn_print_info "${selfname} has not been restarted since last update" fn_script_log_info "${selfname} has not been restarted since last update" command_restart.sh - fn_commandname + fn_firstcommand_reset fi fi diff --git a/lgsm/functions/check_version.sh b/lgsm/functions/check_version.sh index a0b0bc50c..15f0284bb 100644 --- a/lgsm/functions/check_version.sh +++ b/lgsm/functions/check_version.sh @@ -16,5 +16,5 @@ if [ -n "${modulesversion}" ]&&[ -n "${version}" ]&&[ "${version}" != "${modules fn_sleep_time fn_script_log_error "LinuxGSM Version mismatch: ${selfname}: ${version}: modules: ${modulesversion}" command_update_linuxgsm.sh - fn_commandname + fn_firstcommand_reset fi diff --git a/lgsm/functions/command_backup.sh b/lgsm/functions/command_backup.sh index 620820932..dbf97a857 100644 --- a/lgsm/functions/command_backup.sh +++ b/lgsm/functions/command_backup.sh @@ -5,12 +5,10 @@ # Website: https://linuxgsm.com # Description: Creates a .tar.gz file in the backup directory. -fn_commandname(){ - commandname="BACKUP" - commandaction="Backing up" - functionselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" -} -fn_commandname +commandname="BACKUP" +commandaction="Backing up" +functionselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" +fn_firstcommand_set check.sh @@ -77,7 +75,7 @@ fn_backup_stop_server(){ startserver="1" exitbypass=1 command_stop.sh - fn_commandname + fn_firstcommand_reset fi } @@ -252,7 +250,7 @@ fn_backup_start_server(){ if [ -n "${startserver}" ]; then exitbypass=1 command_start.sh - fn_commandname + fn_firstcommand_reset fi } diff --git a/lgsm/functions/command_console.sh b/lgsm/functions/command_console.sh index 02040d5c5..d998e594d 100644 --- a/lgsm/functions/command_console.sh +++ b/lgsm/functions/command_console.sh @@ -4,12 +4,11 @@ # Website: https://linuxgsm.com # Description: Gives access to the server tmux console. -fn_commandname(){ - commandname="CONSOLE" - commandaction="Access console" - functionselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" -} -fn_commandname + +commandname="CONSOLE" +commandaction="Access console" +functionselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" +fn_firstcommand_set check.sh fn_print_header @@ -38,7 +37,7 @@ else if fn_prompt_yn "Do you want to start the server?" Y; then exitbypass=1 command_start.sh - fn_commandname + fn_firstcommand_reset fi fi diff --git a/lgsm/functions/command_debug.sh b/lgsm/functions/command_debug.sh index 4addb86b5..d8a8a1cba 100644 --- a/lgsm/functions/command_debug.sh +++ b/lgsm/functions/command_debug.sh @@ -4,12 +4,10 @@ # Website: https://linuxgsm.com # Description: Runs the server without tmux and directly from the terminal. -fn_commandname(){ - commandname="DEBUG" - commandaction="Debuging" - functionselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" -} -fn_commandname +commandname="DEBUG" +commandaction="Debuging" +functionselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" +fn_firstcommand_set # Trap to remove lockfile on quit. fn_lockfile_trap(){ @@ -91,7 +89,7 @@ fn_print_info_nl "Stopping any running servers" fn_script_log_info "Stopping any running servers" exitbypass=1 command_stop.sh -fn_commandname +fn_firstcommand_reset unset exitbypass fn_print_dots "Starting debug" fn_script_log_info "Starting debug" diff --git a/lgsm/functions/command_details.sh b/lgsm/functions/command_details.sh index b90f8a6f5..9680255f4 100644 --- a/lgsm/functions/command_details.sh +++ b/lgsm/functions/command_details.sh @@ -5,12 +5,10 @@ # Website: https://linuxgsm.com # Description: Displays server information. -fn_commandname(){ - commandname="DETAILS" - commandaction="Viewing details" - functionselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" -} -fn_commandname +commandname="DETAILS" +commandaction="Viewing details" +functionselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" +fn_firstcommand_set # Run checks and gathers details to display. check.sh diff --git a/lgsm/functions/command_dev_clear_functions.sh b/lgsm/functions/command_dev_clear_functions.sh index 935ebb4ef..96a637c52 100644 --- a/lgsm/functions/command_dev_clear_functions.sh +++ b/lgsm/functions/command_dev_clear_functions.sh @@ -4,12 +4,10 @@ # Website: https://linuxgsm.com # Description: Deletes the contents of the functions dir. -fn_commandname(){ - commandname="DEV-CLEAR-MODULES" - commandaction="Clearing modules" - functionselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" -} -fn_commandname +commandname="DEV-CLEAR-MODULES" +commandaction="Clearing modules" +functionselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" +fn_firstcommand_set echo -e "=================================" echo -e "Clear Functions" diff --git a/lgsm/functions/command_dev_debug.sh b/lgsm/functions/command_dev_debug.sh index 4a076df9e..e959509cd 100644 --- a/lgsm/functions/command_dev_debug.sh +++ b/lgsm/functions/command_dev_debug.sh @@ -4,12 +4,10 @@ # Website: https://linuxgsm.com # Description: Dev only: Enables debugging log to be saved to dev-debug.log. -fn_commandname(){ - commandname="DEV-DEBUG" - commandaction="Developer debug" - functionselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" -} -fn_commandname +commandname="DEV-DEBUG" +commandaction="Developer debug" +functionselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" +fn_firstcommand_reset if [ -f "${rootdir}/.dev-debug" ]; then rm "${rootdir:?}/.dev-debug" diff --git a/lgsm/functions/command_dev_detect_deps.sh b/lgsm/functions/command_dev_detect_deps.sh index 089aa9af3..d2fa00fcc 100644 --- a/lgsm/functions/command_dev_detect_deps.sh +++ b/lgsm/functions/command_dev_detect_deps.sh @@ -4,12 +4,10 @@ # Website: https://linuxgsm.com # Description: Detects dependencies the server binary requires. -fn_commandname(){ - commandname="DEV-DETECT-DEPS" - commandaction="Developer detect deps" - functionselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" -} -fn_commandname +commandname="DEV-DETECT-DEPS" +commandaction="Developer detect deps" +functionselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" +fn_firstcommand_set echo -e "=================================" echo -e "Dependencies Checker" diff --git a/lgsm/functions/command_dev_detect_glibc.sh b/lgsm/functions/command_dev_detect_glibc.sh index c2feae0c9..8f5d6e5a8 100644 --- a/lgsm/functions/command_dev_detect_glibc.sh +++ b/lgsm/functions/command_dev_detect_glibc.sh @@ -5,12 +5,10 @@ # Description: Automatically detects the version of GLIBC that is required. # Can check a file or directory recursively. -fn_commandname(){ - commandname="DEV-DETECT-GLIBC" - commandaction="Developer detect glibc" - functionselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" -} -fn_commandname +commandname="DEV-DETECT-GLIBC" +commandaction="Developer detect glibc" +functionselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" +fn_firstcommand_set echo -e "=================================" echo -e "glibc Requirements Checker" diff --git a/lgsm/functions/command_dev_detect_ldd.sh b/lgsm/functions/command_dev_detect_ldd.sh index 60766cce5..e6ddfb09f 100644 --- a/lgsm/functions/command_dev_detect_ldd.sh +++ b/lgsm/functions/command_dev_detect_ldd.sh @@ -5,12 +5,10 @@ # Description: Automatically detects required deps using ldd. # Can check a file or directory recursively. -fn_commandname(){ - commandname="DEV-DETECT-LDD" - commandaction="Developer detect ldd" - functionselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" -} -fn_commandname +commandname="DEV-DETECT-LDD" +commandaction="Developer detect ldd" +functionselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" +fn_firstcommand_set echo -e "=================================" echo -e "Shared Object dependencies Checker" diff --git a/lgsm/functions/command_dev_query_raw.sh b/lgsm/functions/command_dev_query_raw.sh index 00005c22c..84efe0da9 100644 --- a/lgsm/functions/command_dev_query_raw.sh +++ b/lgsm/functions/command_dev_query_raw.sh @@ -4,12 +4,10 @@ # Website: https://linuxgsm.com # Description: Raw gamedig output of the server. -fn_commandname(){ - commandname="DEV-QUERY-RAW" - commandaction="Developer query raw" - functionselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" -} -fn_commandname +commandname="DEV-QUERY-RAW" +commandaction="Developer query raw" +functionselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" +fn_firstcommand_set check.sh info_config.sh diff --git a/lgsm/functions/command_donate.sh b/lgsm/functions/command_donate.sh index 0483e4aa1..18e6dce5a 100644 --- a/lgsm/functions/command_donate.sh +++ b/lgsm/functions/command_donate.sh @@ -4,12 +4,10 @@ # Website: https://linuxgsm.com # Description: Shows ways to donate. -fn_commandname(){ - commandname="DONATE" - commandaction="Donate" - functionselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" -} -fn_commandname +commandname="DONATE" +commandaction="Donate" +functionselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" +fn_firstcommand_set fn_print_ascii_logo echo -e "${lightyellow}Support LinuxGSM${default}" diff --git a/lgsm/functions/command_fastdl.sh b/lgsm/functions/command_fastdl.sh index a4d06d5e6..19ffb79fd 100644 --- a/lgsm/functions/command_fastdl.sh +++ b/lgsm/functions/command_fastdl.sh @@ -5,12 +5,10 @@ # Website: https://linuxgsm.com # Description: Creates a FastDL directory. -fn_commandname(){ - commandname="FASTDL" - commandaction="Fastdl" - functionselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" -} -fn_commandname +commandname="FASTDL" +commandaction="Fastdl" +functionselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" +fn_firstcommand_set check.sh diff --git a/lgsm/functions/command_install.sh b/lgsm/functions/command_install.sh index 23fdd3179..2437116d3 100644 --- a/lgsm/functions/command_install.sh +++ b/lgsm/functions/command_install.sh @@ -5,12 +5,10 @@ # Website: https://linuxgsm.com # Description: Overall function for the installer. -fn_commandname(){ - commandname="INSTALL" - commandaction="Installing" - functionselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" -} -fn_commandname +commandname="INSTALL" +commandaction="Installing" +functionselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" +fn_firstcommand_set check.sh if [ "$(whoami)" = "root" ]; then @@ -45,7 +43,7 @@ else install_ts3db.sh elif [ "${shortname}" == "mta" ]; then command_install_resources_mta.sh - fn_commandname + fn_firstcommand_reset fi fix.sh diff --git a/lgsm/functions/command_install_resources_mta.sh b/lgsm/functions/command_install_resources_mta.sh index 4c641dcef..503948a3c 100644 --- a/lgsm/functions/command_install_resources_mta.sh +++ b/lgsm/functions/command_install_resources_mta.sh @@ -4,12 +4,10 @@ # Website: https://linuxgsm.com # Description: Installs the default resources for Multi Theft Auto. -fn_commandname(){ - commandname="DEFAULT-RESOURCES" - commandaction="Default Resources" - functionselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" -} -fn_commandname +commandname="DEFAULT-RESOURCES" +commandaction="Default Resources" +functionselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" +fn_firstcommand_set fn_install_resources(){ echo -e "" diff --git a/lgsm/functions/command_mods_install.sh b/lgsm/functions/command_mods_install.sh index 48bf116b3..369f5f967 100644 --- a/lgsm/functions/command_mods_install.sh +++ b/lgsm/functions/command_mods_install.sh @@ -5,12 +5,10 @@ # Website: https://linuxgsm.com # Description: List and installs available mods along with mods_list.sh and mods_core.sh. -fn_commandname(){ - commandname="MODS-INSTALL" - commandaction="Installing mods" - functionselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" -} -fn_commandname +commandname="MODS-INSTALL" +commandaction="Installing mods" +functionselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" +fn_firstcommand_set check.sh mods_core.sh diff --git a/lgsm/functions/command_mods_remove.sh b/lgsm/functions/command_mods_remove.sh index b2062333e..7cbba8a71 100644 --- a/lgsm/functions/command_mods_remove.sh +++ b/lgsm/functions/command_mods_remove.sh @@ -5,12 +5,10 @@ # Website: https://linuxgsm.com # Description: Uninstall mods along with mods_list.sh and mods_core.sh. -fn_commandname(){ - commandname="MODS-REMOVE" - commandaction="Removing mods" - functionselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" -} -fn_commandname +commandname="MODS-REMOVE" +commandaction="Removing mods" +functionselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" +fn_firstcommand_set check.sh mods_core.sh @@ -126,7 +124,7 @@ if [ "${engine}" == "unity3d" ]&&[[ "${modprettyname}" == *"Oxide"* ]]; then fn_script_log "Validating to restore original ${gamename} files replaced by Oxide" exitbypass="1" command_validate.sh - fn_commandname + fn_firstcommand_reset unset exitbypass fi echo -e "${modprettyname} removed" diff --git a/lgsm/functions/command_mods_update.sh b/lgsm/functions/command_mods_update.sh index d6cd15e70..9328a493d 100644 --- a/lgsm/functions/command_mods_update.sh +++ b/lgsm/functions/command_mods_update.sh @@ -5,12 +5,10 @@ # Website: https://linuxgsm.com # Description: Updates installed mods along with mods_list.sh and mods_core.sh. -fn_commandname(){ - commandname="MODS-UPDATE" - commandaction="Updating mods" - functionselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" -} -fn_commandname +commandname="MODS-UPDATE" +commandaction="Updating mods" +functionselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" +fn_firstcommand_set check.sh mods_core.sh diff --git a/lgsm/functions/command_monitor.sh b/lgsm/functions/command_monitor.sh index adc2be363..89524ab91 100644 --- a/lgsm/functions/command_monitor.sh +++ b/lgsm/functions/command_monitor.sh @@ -6,12 +6,10 @@ # Description: Monitors server by checking for running processes # then passes to gamedig and gsquery. -fn_commandname(){ - commandname="MONITOR" - commandaction="Monitoring" - functionselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" -} -fn_commandname +commandname="MONITOR" +commandaction="Monitoring" +functionselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" +fn_firstcommand_set fn_monitor_check_lockfile(){ # Monitor does not run it lockfile is not found. @@ -173,7 +171,7 @@ for queryattempt in {1..5}; do alert="restartquery" alert.sh command_restart.sh - fn_commandname + fn_firstcommand_reset core_exit.sh fi elif [ "${querymethod}" == "gamedig" ]; then diff --git a/lgsm/functions/command_postdetails.sh b/lgsm/functions/command_postdetails.sh index 0d40b6a0b..11ac44649 100644 --- a/lgsm/functions/command_postdetails.sh +++ b/lgsm/functions/command_postdetails.sh @@ -5,12 +5,10 @@ # Website: https://linuxgsm.com # Description: Strips sensitive information out of Details output -fn_commandname(){ - commandname="POST-DETAILS" - commandaction="Posting details" - functionselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" -} -fn_commandname +commandname="POST-DETAILS" +commandaction="Posting details" +functionselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" +fn_firstcommand_set # Set posttarget to the appropriately-defined post destination. diff --git a/lgsm/functions/command_restart.sh b/lgsm/functions/command_restart.sh index 47fa163a8..9498c618c 100644 --- a/lgsm/functions/command_restart.sh +++ b/lgsm/functions/command_restart.sh @@ -4,16 +4,14 @@ # Website: https://linuxgsm.com # Description: Restarts the server. -fn_commandname(){ - commandname="MODS-INSTALL" - commandaction="Restarting" - functionselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" -} -fn_commandname +commandname="MODS-INSTALL" +commandaction="Restarting" +functionselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" +fn_firstcommand_set info_config.sh exitbypass=1 command_stop.sh command_start.sh -fn_commandname +fn_firstcommand_reset core_exit.sh diff --git a/lgsm/functions/command_start.sh b/lgsm/functions/command_start.sh index c78bcc158..48cb02e12 100644 --- a/lgsm/functions/command_start.sh +++ b/lgsm/functions/command_start.sh @@ -5,12 +5,10 @@ # Website: https://linuxgsm.com # Description: Starts the server. -fn_commandname(){ - commandname="START" - commandaction="Starting" - functionselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" -} -fn_commandname +commandname="START" +commandaction="Starting" +functionselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" +fn_firstcommand_set fn_start_teamspeak3(){ if [ ! -f "${servercfgfullpath}" ]; then @@ -191,7 +189,7 @@ if [ "${updateonstart}" == "yes" ]||[ "${updateonstart}" == "1" ]||[ "${updateon exitbypass=1 unset updateonstart command_update.sh - fn_commandname + fn_firstcommand_reset fi fn_print_dots "${servername}" diff --git a/lgsm/functions/command_stop.sh b/lgsm/functions/command_stop.sh index 58e28a9ca..439967fd0 100644 --- a/lgsm/functions/command_stop.sh +++ b/lgsm/functions/command_stop.sh @@ -5,12 +5,10 @@ # Website: https://linuxgsm.com # Description: Stops the server. -fn_commandname(){ - commandname="STOP" - commandaction="Stopping" - functionselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" -} -fn_commandname +commandname="STOP" +commandaction="Stopping" +functionselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" +fn_firstcommand_set # Attempts graceful shutdown by sending 'CTRL+c'. fn_stop_graceful_ctrlc(){ diff --git a/lgsm/functions/command_test_alert.sh b/lgsm/functions/command_test_alert.sh index 969c648ca..625d5c6c2 100644 --- a/lgsm/functions/command_test_alert.sh +++ b/lgsm/functions/command_test_alert.sh @@ -4,12 +4,10 @@ # Website: https://linuxgsm.com # Description: Sends a test alert. -fn_commandname(){ - commandname="TEST-ALERT" - commandaction="Sending Alert" - functionselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" -} -fn_commandname +commandname="TEST-ALERT" +commandaction="Sending Alert" +functionselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" +fn_firstcommand_set fn_print_dots "${servername}" check.sh diff --git a/lgsm/functions/command_ts3_server_pass.sh b/lgsm/functions/command_ts3_server_pass.sh index ba25747cc..c97d98805 100644 --- a/lgsm/functions/command_ts3_server_pass.sh +++ b/lgsm/functions/command_ts3_server_pass.sh @@ -5,12 +5,10 @@ # Website: https://linuxgsm.com # Description: Changes TS3 serveradmin password. -fn_commandname(){ - commandname="CHANGE-PASSWORD" - commandaction="Changing password" - functionselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" -} -fn_commandname +commandname="CHANGE-PASSWORD" +commandaction="Changing password" +functionselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" +fn_firstcommand_set fn_serveradmin_password_prompt(){ fn_print_header @@ -31,7 +29,7 @@ fn_serveradmin_password_set(){ ts3serverpass="1" exitbypass="1" command_start.sh - fn_commandname + fn_firstcommand_reset fn_print_ok_nl "New password applied" fn_script_log_pass "New ServerAdmin password applied" } @@ -43,16 +41,16 @@ if [ "${status}" != "0" ]; then # Stop any running server. exitbypass="1" command_stop.sh - fn_commandname + fn_firstcommand_reset fn_serveradmin_password_set parms="serveradmin_password=\"${newpassword}\" inifile=\"${servercfgfullpath}\" > /dev/null 2>&1" ts3serverpass="0" command_restart.sh - fn_commandname + fn_firstcommand_reset else fn_serveradmin_password_set command_stop.sh - fn_commandname + fn_firstcommand_reset fi core_exit.sh diff --git a/lgsm/functions/command_update.sh b/lgsm/functions/command_update.sh index b6254937a..2a6c23d57 100644 --- a/lgsm/functions/command_update.sh +++ b/lgsm/functions/command_update.sh @@ -4,12 +4,10 @@ # Website: https://linuxgsm.com # Description: Handles updating of servers. -fn_commandname(){ - commandname="UPDATE" - commandaction="Updating" - functionselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" -} -fn_commandname +commandname="UPDATE" +commandaction="Updating" +functionselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" +fn_firstcommand_set fn_print_dots "" check.sh diff --git a/lgsm/functions/command_update_linuxgsm.sh b/lgsm/functions/command_update_linuxgsm.sh index e4028cf18..072fc8817 100644 --- a/lgsm/functions/command_update_linuxgsm.sh +++ b/lgsm/functions/command_update_linuxgsm.sh @@ -4,12 +4,10 @@ # Website: https://linuxgsm.com # Description: Deletes the functions dir to allow re-downloading of functions from GitHub. -fn_commandname(){ - commandname="UPDATE-LGSM" - commandaction="Updating LinuxGSM" - functionselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" -} -fn_commandname +commandname="UPDATE-LGSM" +commandaction="Updating LinuxGSM" +functionselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" +fn_firstcommand_set check.sh diff --git a/lgsm/functions/command_validate.sh b/lgsm/functions/command_validate.sh index 1ddded9c0..690a86b43 100644 --- a/lgsm/functions/command_validate.sh +++ b/lgsm/functions/command_validate.sh @@ -4,12 +4,10 @@ # Website: https://linuxgsm.com # Description: Runs a server validation. -fn_commandname(){ - commandname="VALIDATE" - commandaction="Validating" - functionselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" -} -fn_commandname +commandname="VALIDATE" +commandaction="Validating" +functionselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" +fn_firstcommand_set fn_validate(){ fn_print_warn "Validate might overwrite some customised files" @@ -38,11 +36,11 @@ if [ "${status}" != "0" ]; then fn_print_restart_warning exitbypass=1 command_stop.sh - fn_commandname + fn_firstcommand_reset fn_validate exitbypass=1 command_start.sh - fn_commandname + fn_firstcommand_reset else fn_validate fi diff --git a/lgsm/functions/command_wipe.sh b/lgsm/functions/command_wipe.sh index 96e10a98f..5c17d6d5f 100644 --- a/lgsm/functions/command_wipe.sh +++ b/lgsm/functions/command_wipe.sh @@ -5,12 +5,10 @@ # Website: https://linuxgsm.com # Description: Wipes server data, useful after updates for some games like Rust -fn_commandname(){ - commandname="WIPE" - commandaction="Wiping" - functionselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" -} -fn_commandname +commandname="WIPE" +commandaction="Wiping" +functionselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" +fn_firstcommand_set # Provides an exit code upon error. fn_wipe_exit_code(){ @@ -198,11 +196,11 @@ if [ -d "${serveridentitydir}/storage" ]||[ -d "${serveridentitydir}/user" ]||[ fn_stop_warning exitbypass=1 command_stop.sh - fn_commandname + fn_firstcommand_reset fn_wipe_server_files exitbypass=1 command_start.sh - fn_commandname + fn_firstcommand_reset else fn_wipe_server_files fi diff --git a/lgsm/functions/compress_unreal2_maps.sh b/lgsm/functions/compress_unreal2_maps.sh index e08dd666f..82d94d4d8 100644 --- a/lgsm/functions/compress_unreal2_maps.sh +++ b/lgsm/functions/compress_unreal2_maps.sh @@ -4,12 +4,10 @@ # Website: https://linuxgsm.com # Description: Compresses unreal maps. -fn_commandname(){ - commandname="MAP-COMPRESSOR" - commandaction="Compressing maps" - functionselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" -} -fn_commandname +commandname="MAP-COMPRESSOR" +commandaction="Compressing maps" +functionselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" +fn_firstcommand_set check.sh fn_print_header diff --git a/lgsm/functions/compress_ut99_maps.sh b/lgsm/functions/compress_ut99_maps.sh index e475c466b..39153ba3e 100644 --- a/lgsm/functions/compress_ut99_maps.sh +++ b/lgsm/functions/compress_ut99_maps.sh @@ -4,12 +4,10 @@ # Website: https://linuxgsm.com # Description: Compresses unreal maps. -fn_commandname(){ - commandname="MAP-COMPRESSOR" - commandaction="Compressing maps" - functionselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" -} -fn_commandname +commandname="MAP-COMPRESSOR" +commandaction="Compressing maps" +functionselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" +fn_firstcommand_set check.sh fn_print_header diff --git a/lgsm/functions/core_messages.sh b/lgsm/functions/core_messages.sh index ee4807bd5..c467c2a4d 100644 --- a/lgsm/functions/core_messages.sh +++ b/lgsm/functions/core_messages.sh @@ -544,3 +544,20 @@ fn_print_restart_warning(){ done fn_print_warn_nl "${selfname} will be restarted" } + +# Functions below are used to ensure that logs and UI correctly reflect the command it is actually running. +# Useful when a command has to call upon another command causing the other command to overrite commandname variables + +# Used to remember the command that ran first. +fn_firstcommand_set(){ + if [ -z "${firstcommandname}" ]; then + firstcommandname="${commandname}" + firstcommandaction="${commandaction}" + fi +} + +# Used to reset commandname variables to the command the script ran first. +fn_firstcommand_reset(){ + commandname="${firstcommandname}" + commandaction="${firstcommandaction}" +} diff --git a/lgsm/functions/fix_kf.sh b/lgsm/functions/fix_kf.sh index a745094b0..c4a294515 100644 --- a/lgsm/functions/fix_kf.sh +++ b/lgsm/functions/fix_kf.sh @@ -21,15 +21,15 @@ echo -e "forcing server restart..." fn_sleep_time exitbypass=1 command_start.sh -fn_commandname +fn_firstcommand_reset sleep 5 exitbypass=1 command_stop.sh -fn_commandname +fn_firstcommand_reset exitbypass=1 command_start.sh -fn_commandname +fn_firstcommand_reset sleep 5 exitbypass=1 command_stop.sh -fn_commandname +fn_firstcommand_reset diff --git a/lgsm/functions/fix_kf2.sh b/lgsm/functions/fix_kf2.sh index 99e96543a..e826dea2a 100644 --- a/lgsm/functions/fix_kf2.sh +++ b/lgsm/functions/fix_kf2.sh @@ -14,8 +14,8 @@ fn_print_information "starting ${gamename} server to generate configs." fn_sleep_time exitbypass=1 command_start.sh -fn_commandname +fn_firstcommand_reset sleep 10 exitbypass=1 command_stop.sh -fn_commandname +fn_firstcommand_reset diff --git a/lgsm/functions/fix_ro.sh b/lgsm/functions/fix_ro.sh index 902fed7fe..c9254aa64 100644 --- a/lgsm/functions/fix_ro.sh +++ b/lgsm/functions/fix_ro.sh @@ -24,15 +24,15 @@ echo -e "forcing server restart..." fn_sleep_time exitbypass=1 command_start.sh -fn_commandname +fn_firstcommand_reset sleep 5 exitbypass=1 command_stop.sh -fn_commandname +fn_firstcommand_reset exitbypass=1 command_start.sh -fn_commandname +fn_firstcommand_reset sleep 5 exitbypass=1 command_stop.sh -fn_commandname +fn_firstcommand_reset diff --git a/lgsm/functions/fix_ut2k4.sh b/lgsm/functions/fix_ut2k4.sh index 07805d42b..cc1621815 100644 --- a/lgsm/functions/fix_ut2k4.sh +++ b/lgsm/functions/fix_ut2k4.sh @@ -21,15 +21,15 @@ echo -e "forcing server restart." fn_sleep_time exitbypass=1 command_start.sh -fn_commandname +fn_firstcommand_reset sleep 5 exitbypass=1 command_stop.sh -fn_commandname +fn_firstcommand_reset exitbypass=1 command_start.sh -fn_commandname +fn_firstcommand_reset sleep 5 exitbypass=1 command_stop.sh -fn_commandname +fn_firstcommand_reset diff --git a/lgsm/functions/fix_ut3.sh b/lgsm/functions/fix_ut3.sh index ad9b3db4e..402683bf1 100644 --- a/lgsm/functions/fix_ut3.sh +++ b/lgsm/functions/fix_ut3.sh @@ -14,8 +14,8 @@ fn_print_information "starting ${gamename} server to generate configs." fn_sleep_time exitbypass=1 command_start.sh -fn_commandname +fn_firstcommand_reset sleep 10 exitbypass=1 command_stop.sh -fn_commandname +fn_firstcommand_reset diff --git a/lgsm/functions/fix_wurm.sh b/lgsm/functions/fix_wurm.sh index 40325d729..dfba3afdc 100644 --- a/lgsm/functions/fix_wurm.sh +++ b/lgsm/functions/fix_wurm.sh @@ -18,10 +18,10 @@ if [ ! -d "${serverfiles}/Creative" ]; then fixbypass=1 exitbypass=1 command_start.sh - fn_commandname + fn_firstcommand_reset sleep 10 exitbypass=1 command_stop.sh - fn_commandname + fn_firstcommand_reset unset parmsbypass fi diff --git a/lgsm/functions/install_modules.sh b/lgsm/functions/install_modules.sh index 39729fd23..cc516bea0 100644 --- a/lgsm/functions/install_modules.sh +++ b/lgsm/functions/install_modules.sh @@ -14,4 +14,4 @@ cp "${tmpdir}/LinuxGSM-master/lgsm/functions"/*.sh "${functionsdir}" cp "${tmpdir}/LinuxGSM-master/lgsm/functions"/*.py "${functionsdir}" chmod +x "${functionsdir}"/* command_update_linuxgsm.sh -fn_commandname +fn_firstcommand_reset diff --git a/lgsm/functions/update_factorio.sh b/lgsm/functions/update_factorio.sh index e8b5c5e5c..ae4bdbaa5 100644 --- a/lgsm/functions/update_factorio.sh +++ b/lgsm/functions/update_factorio.sh @@ -96,21 +96,21 @@ fn_update_factorio_compare(){ fn_update_factorio_dl exitbypass=1 command_start.sh - fn_commandname + fn_firstcommand_reset exitbypass=1 command_stop.sh - fn_commandname + fn_firstcommand_reset # If server started. else fn_print_restart_warning exitbypass=1 command_stop.sh - fn_commandname + fn_firstcommand_reset exitbypass=1 fn_update_factorio_dl exitbypass=1 command_start.sh - fn_commandname + fn_firstcommand_reset fi date +%s > "${lockdir}/lastupdate.lock" alert="update" diff --git a/lgsm/functions/update_minecraft.sh b/lgsm/functions/update_minecraft.sh index fad5d903f..b74b71aab 100644 --- a/lgsm/functions/update_minecraft.sh +++ b/lgsm/functions/update_minecraft.sh @@ -44,10 +44,10 @@ fn_update_minecraft_localbuild(){ fn_script_log_info "Forcing server restart" exitbypass=1 command_stop.sh - fn_commandname + fn_firstcommand_reset exitbypass=1 command_start.sh - fn_commandname + fn_firstcommand_reset totalseconds=0 # Check again, allow time to generate logs. while [ ! -f "${serverfiles}/logs/latest.log" ]; do @@ -159,18 +159,18 @@ fn_update_minecraft_compare(){ command_start.sh exitbypass=1 command_stop.sh - fn_commandname + fn_firstcommand_reset # If server started. else fn_print_restart_warning exitbypass=1 command_stop.sh - fn_commandname + fn_firstcommand_reset exitbypass=1 fn_update_minecraft_dl exitbypass=1 command_start.sh - fn_commandname + fn_firstcommand_reset fi date +%s > "${lockdir}/lastupdate.lock" alert="update" diff --git a/lgsm/functions/update_minecraft_bedrock.sh b/lgsm/functions/update_minecraft_bedrock.sh index 8f6193302..8c90d5efb 100644 --- a/lgsm/functions/update_minecraft_bedrock.sh +++ b/lgsm/functions/update_minecraft_bedrock.sh @@ -47,16 +47,16 @@ fn_update_minecraft_localbuild(){ if [ "${status}" == "0" ]; then exitbypass=1 command_start.sh - fn_commandname + fn_firstcommand_reset sleep 3 exitbypass=1 command_stop.sh - fn_commandname + fn_firstcommand_reset # If server started. else exitbypass=1 command_stop.sh - fn_commandname + fn_firstcommand_reset fi fi @@ -126,18 +126,18 @@ fn_update_minecraft_compare(){ command_start.sh exitbypass=1 command_stop.sh - fn_commandname + fn_firstcommand_reset # If server started. else fn_print_restart_warning exitbypass=1 command_stop.sh - fn_commandname + fn_firstcommand_reset exitbypass=1 fn_update_minecraft_dl exitbypass=1 command_start.sh - fn_commandname + fn_firstcommand_reset fi date +%s > "${lockdir}/lastupdate.lock" alert="update" diff --git a/lgsm/functions/update_mta.sh b/lgsm/functions/update_mta.sh index 6f1250d6c..d15d9457b 100644 --- a/lgsm/functions/update_mta.sh +++ b/lgsm/functions/update_mta.sh @@ -40,7 +40,7 @@ fn_update_mta_localbuild(){ command_stop.sh exitbypass=1 command_start.sh - fn_commandname + fn_firstcommand_reset totalseconds=0 # Check again, allow time to generate logs. while [ ! -f "${serverfiles}/mods/deathmatch/logs/server.log" ]; do @@ -155,18 +155,18 @@ fn_update_mta_compare(){ command_start.sh exitbypass=1 command_stop.sh - fn_commandname + fn_firstcommand_reset # If server started. else fn_print_restart_warning exitbypass=1 command_stop.sh - fn_commandname + fn_firstcommand_reset exitbypass=1 fn_update_mta_dl exitbypass=1 command_start.sh - fn_commandname + fn_firstcommand_reset fi date +%s > "${lockdir}/lastupdate.lock" alert="update" diff --git a/lgsm/functions/update_mumble.sh b/lgsm/functions/update_mumble.sh index 4b60b0cae..6b3fd19d0 100644 --- a/lgsm/functions/update_mumble.sh +++ b/lgsm/functions/update_mumble.sh @@ -91,18 +91,18 @@ fn_update_mumble_compare(){ command_start.sh exitbypass=1 command_stop.sh - fn_commandname + fn_firstcommand_reset # If server started. else fn_print_restart_warning exitbypass=1 command_stop.sh - fn_commandname + fn_firstcommand_reset exitbypass=1 fn_update_mumble_dl exitbypass=1 command_start.sh - fn_commandname + fn_firstcommand_reset fi date +%s > "${lockdir}/lastupdate.lock" alert="update" diff --git a/lgsm/functions/update_steamcmd.sh b/lgsm/functions/update_steamcmd.sh index 7543e3443..348147b03 100644 --- a/lgsm/functions/update_steamcmd.sh +++ b/lgsm/functions/update_steamcmd.sh @@ -106,12 +106,12 @@ fn_update_steamcmd_compare(){ fn_print_restart_warning exitbypass=1 command_stop.sh - fn_commandname + fn_firstcommand_reset exitbypass=1 fn_dl_steamcmd exitbypass=1 command_start.sh - fn_commandname + fn_firstcommand_reset fi date +%s > "${lockdir}/lastupdate.lock" alert="update" @@ -203,12 +203,12 @@ if [ "${forceupdate}" == "1" ]; then fn_print_restart_warning exitbypass=1 command_stop.sh - fn_commandname + fn_firstcommand_reset fn_dl_steamcmd date +%s > "${lockdir}/lastupdate.lock" exitbypass=1 command_start.sh - fn_commandname + fn_firstcommand_reset else fn_dl_steamcmd date +%s > "${lockdir}/lastupdate.lock" diff --git a/lgsm/functions/update_ts3.sh b/lgsm/functions/update_ts3.sh index 4f1168bb0..290ddf4d0 100644 --- a/lgsm/functions/update_ts3.sh +++ b/lgsm/functions/update_ts3.sh @@ -44,7 +44,7 @@ fn_update_ts3_localbuild(){ command_stop.sh exitbypass=1 command_start.sh - fn_commandname + fn_firstcommand_reset totalseconds=0 # Check again, allow time to generate logs. while [ ! -d "${serverfiles}/logs" ]||[ -z "$(find "${serverfiles}/logs/"* -name 'ts3server*_0.log' 2> /dev/null)" ]; do @@ -153,18 +153,18 @@ fn_update_ts3_compare(){ command_start.sh exitbypass=1 command_stop.sh - fn_commandname + fn_firstcommand_reset # If server started. else fn_print_restart_warning exitbypass=1 command_stop.sh - fn_commandname + fn_firstcommand_reset exitbypass=1 fn_update_ts3_dl exitbypass=1 command_start.sh - fn_commandname + fn_firstcommand_reset fi date +%s > "${lockdir}/lastupdate.lock" alert="update" From 167cf43e5bc207f551446a8a7681cec52a15e2f3 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Fri, 17 Jul 2020 23:56:35 +0100 Subject: [PATCH 435/534] codacy --- .../config-lgsm/inssserver/_default.cfg | 4 ++-- .../config-lgsm/momserver/_default.cfg | 2 +- .../config-lgsm/mtaserver/_default.cfg | 1 + .../config-default/config-lgsm/utserver/_default.cfg | 1 + lgsm/functions/check_deps.sh | 6 ++++-- lgsm/functions/check_steamcmd.sh | 2 +- lgsm/functions/command_console.sh | 1 - lgsm/functions/command_update_linuxgsm.sh | 4 ++-- lgsm/functions/command_wipe.sh | 12 ++++++------ lgsm/functions/fix.sh | 2 +- lgsm/functions/fix_ark.sh | 10 +++++----- lgsm/functions/info_config.sh | 4 ++-- lgsm/functions/info_distro.sh | 4 ++-- lgsm/functions/install_logs.sh | 8 ++++---- linuxgsm.sh | 4 ++-- 15 files changed, 34 insertions(+), 31 deletions(-) diff --git a/lgsm/config-default/config-lgsm/inssserver/_default.cfg b/lgsm/config-default/config-lgsm/inssserver/_default.cfg index 41c7a4810..1201e7036 100644 --- a/lgsm/config-default/config-lgsm/inssserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/inssserver/_default.cfg @@ -22,9 +22,9 @@ maxplayers="28" fn_parms(){ # Allows serverpassword to work with parameters if [ "${serverpassword}" != "NOT SET" ]; then - parms="${defaultmap}?Scenario=${defaultscenario}?MaxPlayers=${maxplayers}?Port=${port}?QueryPort=${queryport}?password="${serverpassword}" -hostname='${servername}' -log" + parms="${defaultmap}?Scenario=${defaultscenario}?MaxPlayers=${maxplayers}?Port=${port}?QueryPort=${queryport}?password="${serverpassword}" -hostname="${servername}" -log" else - parms="${defaultmap}?Scenario=${defaultscenario}?MaxPlayers=${maxplayers}?Port=${port}?QueryPort=${queryport} -hostname='${servername}' -log" + parms="${defaultmap}?Scenario=${defaultscenario}?MaxPlayers=${maxplayers}?Port=${port}?QueryPort=${queryport} -hostname="${servername}" -log" fi } diff --git a/lgsm/config-default/config-lgsm/momserver/_default.cfg b/lgsm/config-default/config-lgsm/momserver/_default.cfg index 1ebe2f227..02565f473 100644 --- a/lgsm/config-default/config-lgsm/momserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/momserver/_default.cfg @@ -16,7 +16,7 @@ maxplayers="32" ## Server Start Command | https://docs.linuxgsm.com/configuration/start-parameters#additional-parameters fn_parms(){ -parms="-port=${port} -beaconport=${beaconport} -MULTIHOME="${ip}" -maxplayers=${maxplayers}" +parms="-port="${port}" -beaconport="${beaconport}" -MULTIHOME="${ip}" -maxplayers=${maxplayers}" } #### LinuxGSM Settings #### diff --git a/lgsm/config-default/config-lgsm/mtaserver/_default.cfg b/lgsm/config-default/config-lgsm/mtaserver/_default.cfg index 111a1b350..28887e4d3 100644 --- a/lgsm/config-default/config-lgsm/mtaserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/mtaserver/_default.cfg @@ -139,6 +139,7 @@ executabledir="${systemdir}" executable="./mta-server64" servercfgdir="${systemdir}/mods/deathmatch" servercfg="mtaserver.conf" +servercfgdefault="mtaserver.conf" servercfgfullpath="${servercfgdir}/${servercfg}" ## Backup Directory diff --git a/lgsm/config-default/config-lgsm/utserver/_default.cfg b/lgsm/config-default/config-lgsm/utserver/_default.cfg index c60cb1a50..244e86ad6 100644 --- a/lgsm/config-default/config-lgsm/utserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/utserver/_default.cfg @@ -142,6 +142,7 @@ executabledir="${systemdir}/Engine/Binaries/Linux" executable="./UE4Server-Linux-Shipping" servercfgdir="${systemdir}/UnrealTournament/Saved/Config/LinuxServer" servercfg="Game.ini" +servercfgdefault"Game.ini" servercfgfullpath="${servercfgdir}/${servercfg}" ## Backup Directory diff --git a/lgsm/functions/check_deps.sh b/lgsm/functions/check_deps.sh index 17a2c4ada..0d4555e53 100644 --- a/lgsm/functions/check_deps.sh +++ b/lgsm/functions/check_deps.sh @@ -383,7 +383,7 @@ fn_deps_build_debian(){ # Battlefield: Vietnam elif [ "${shortname}" == "bfv" ]; then array_deps_required+=( libncurses5:i386 libstdc++5:i386 ) - # Battlefield 1942, Counter-Strike: Source, Garry's Mod, No More Room in Hell, Source Forts Classic, Zombie Master Reborn and Zombie Panic: Source + # Battlefield 1942, Counter-Strike: Source, Garry's Mod, No More Room in Hell, Source Forts Classic, Zombie Master Reborn and Zombie Panic: Source elif [ "${shortname}" == "bf1942" ]||[ "${shortname}" == "css" ]||[ "${shortname}" == "gmod" ]||[ "${shortname}" == "nmrih" ]||[ "${shortname}" == "sfc" ]||[ "${shortname}" == "zmr" ]||[ "${shortname}" == "zps" ]; then if [ "${arch}" == "x86_64" ]; then array_deps_required+=( libtinfo5:i386 ) @@ -447,6 +447,7 @@ fn_deps_build_debian(){ # Wurm: Unlimited elif [ "${shortname}" == "wurm" ]; then array_deps_required+=( xvfb ) + # Post Scriptum elif [ "${shortname}" == "pstbs" ]; then array_deps_required+=( libgconf-2-4 ) fi @@ -495,7 +496,7 @@ fn_deps_build_redhat(){ # Battlefield: Vietnam elif [ "${shortname}" == "bfv" ]; then array_deps_required+=( compat-libstdc++-33.i686 glibc.i686 ) - # Battlefield 1942, Counter-Strike: Source, Garry's Mod, No More Room in Hell, Source Forts Classic, Zombie Master Reborn and Zombie Panic: Source + # Battlefield 1942, Counter-Strike: Source, Garry's Mod, No More Room in Hell, Source Forts Classic, Zombie Master Reborn and Zombie Panic: Source elif [ "${shortname}" == "bf1942" ]||[ "${shortname}" == "css" ]||[ "${shortname}" == "gmod" ]||[ "${shortname}" == "nmrih" ]||[ "${shortname}" == "sfc" ]||[ "${shortname}" == "zmr" ]||[ "${shortname}" == "zps" ]; then array_deps_required+=( ncurses-libs.i686 ) # Brainbread 2, Don't Starve Together & Team Fortress 2 @@ -555,6 +556,7 @@ fn_deps_build_redhat(){ # Wurm: Unlimited elif [ "${shortname}" == "wurm" ]; then array_deps_required+=( xorg-x11-server-Xvfb ) + # Post Scriptum elif [ "${shortname}" == "pstbs" ]; then array_deps_required+=( GConf2 ) fi diff --git a/lgsm/functions/check_steamcmd.sh b/lgsm/functions/check_steamcmd.sh index 456870054..647ee7525 100644 --- a/lgsm/functions/check_steamcmd.sh +++ b/lgsm/functions/check_steamcmd.sh @@ -7,7 +7,7 @@ functionselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" fn_install_steamcmd(){ - if [ ${shortname} == "ark" ]&&[ "${installsteamcmd}" == "1" ]; then + if [ "${shortname}" == "ark" ]&&[ "${installsteamcmd}" == "1" ]; then steamcmddir="${serverfiles}/Engine/Binaries/ThirdParty/SteamCMD/Linux" fi if [ ! -d "${steamcmddir}" ]; then diff --git a/lgsm/functions/command_console.sh b/lgsm/functions/command_console.sh index d998e594d..338ea19c2 100644 --- a/lgsm/functions/command_console.sh +++ b/lgsm/functions/command_console.sh @@ -4,7 +4,6 @@ # Website: https://linuxgsm.com # Description: Gives access to the server tmux console. - commandname="CONSOLE" commandaction="Access console" functionselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" diff --git a/lgsm/functions/command_update_linuxgsm.sh b/lgsm/functions/command_update_linuxgsm.sh index 072fc8817..56391409c 100644 --- a/lgsm/functions/command_update_linuxgsm.sh +++ b/lgsm/functions/command_update_linuxgsm.sh @@ -78,7 +78,7 @@ if [ "${script_diff}" != "" ]; then mkdir -p "${backupdir}/script" fi cp "${rootdir}/${selfname}" "${backupdir}/script/${selfname}-$(date +"%m_%d_%Y_%M").bak" - if [ $? -ne 0 ]; then + if [ $? != 0 ]; then fn_print_fail_eol_nl fn_script_log_fatal "Backup ${selfname}" core_exit.sh @@ -160,7 +160,7 @@ if [ -n "${functionsdir}" ]; then else curl -IsfL "https://bitbucket.org/${githubuser}/${githubrepo}/raw/${githubbranch}/${github_file_url_dir}/${functionfile}" 1>/dev/null fi - if [ $? -ne 0 ]; then + if [ $? != 0 ]; then fn_print_error_eol_nl fn_script_log_error "Checking ${remotereponame} module ${functionfile}" echo -en "removing module ${functionfile}...\c" diff --git a/lgsm/functions/command_wipe.sh b/lgsm/functions/command_wipe.sh index 5c17d6d5f..342a38658 100644 --- a/lgsm/functions/command_wipe.sh +++ b/lgsm/functions/command_wipe.sh @@ -135,13 +135,13 @@ fn_wipe_server_files(){ fn_script_log_pass "No blueprint file to remove" fi elif [ "$(find "${serveridentitydir}" -type f -name "player.blueprints.*.db")" ]; then - echo -e "keeping blueprints" - fn_sleep_time - fn_script_log_info "Keeping blueprints" + echo -e "keeping blueprints" + fn_sleep_time + fn_script_log_info "Keeping blueprints" else - echo -e "no blueprints found" - fn_sleep_time - fn_script_log_pass "No blueprints found" + echo -e "no blueprints found" + fn_sleep_time + fn_script_log_pass "No blueprints found" fi # Wipe some logs that might be there. if [ "$(find "${serveridentitydir}" -type f -name "Log.*.txt")" ]; then diff --git a/lgsm/functions/fix.sh b/lgsm/functions/fix.sh index a42f0e51d..74d6fb00b 100644 --- a/lgsm/functions/fix.sh +++ b/lgsm/functions/fix.sh @@ -21,7 +21,7 @@ fn_fix_msg_start_nl(){ } fn_fix_msg_end(){ - if [ $? -ne 0 ]; then + if [ $? != 0 ]; then fn_print_error_nl "Applying ${fixname} fix: ${gamename}" fn_script_log_error "Applying ${fixname} fix: ${gamename}" else diff --git a/lgsm/functions/fix_ark.sh b/lgsm/functions/fix_ark.sh index 3c1355b1e..4c4cf3f32 100644 --- a/lgsm/functions/fix_ark.sh +++ b/lgsm/functions/fix_ark.sh @@ -7,18 +7,18 @@ functionselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" # removes mulitple appworkshop_346110.acf if found. -steamappsfilewc=$(find ${HOME} -name appworkshop_346110.acf | wc -l) +steamappsfilewc="$(find "${HOME}" -name appworkshop_346110.acf | wc -l)" if [ "${steamappsfilewc}" -gt "1" ]; then fixname="multiple appworkshop acf files" fn_fix_msg_start - find ${HOME} -name appworkshop_346110.acf -exec rm -f {} \; + find "${HOME}" -name appworkshop_346110.acf -exec rm -f {} \; fn_fix_msg_end elif [ "${steamappsfilewc}" -eq "1" ]; then # Steam mods directory selecter # This allows LinxuGSM to select either ~/.steam or ~/Steam. depending on what is being used - steamappsfile=$(find ${HOME} -name appworkshop_346110.acf) + steamappsfile=$(find "${HOME}" -name appworkshop_346110.acf) steamappsdir=$(dirname "${steamappsfile}") - steamappspath=$(cd "${steamappsdir}"|| return; cd ../;pwd) + steamappspath=$(cd "${steamappsdir}" || return; cd ../;pwd) # removes the symlink if exists. # fixes issue with older versions of LinuxGSM linking to /home/arkserver/steamcmd @@ -40,7 +40,7 @@ elif [ "${steamappsfilewc}" -eq "1" ]; then fi # if the steamapps symlink is incorrect unlink it. - if [ -d "${serverfiles}/Engine/Binaries/ThirdParty/SteamCMD/Linux" ]&&[ -L "${serverfiles}/Engine/Binaries/ThirdParty/SteamCMD/Linux/steamapps" ]&&[ "$(readlink ${serverfiles}/Engine/Binaries/ThirdParty/SteamCMD/Linux/steamapps)" != "${steamappspath}" ]; then + if [ -d "${serverfiles}/Engine/Binaries/ThirdParty/SteamCMD/Linux" ]&&[ -L "${serverfiles}/Engine/Binaries/ThirdParty/SteamCMD/Linux/steamapps" ]&&[ "$(readlink "${serverfiles}/Engine/Binaries/ThirdParty/SteamCMD/Linux/steamapps")" != "${steamappspath}" ]; then fixname="incorrect steamapps symlink" fn_fix_msg_start unlink "${serverfiles:?}/Engine/Binaries/ThirdParty/SteamCMD/Linux/steamapps" diff --git a/lgsm/functions/info_config.sh b/lgsm/functions/info_config.sh index a59f96d79..14319b9bf 100644 --- a/lgsm/functions/info_config.sh +++ b/lgsm/functions/info_config.sh @@ -232,8 +232,8 @@ fn_info_config_chivalry(){ serverpassword="${unavailable}" adminpassword="${unavailable}" else - servername=$(egrep "^ServerName" "${servercfgfullpath}" | sed 's/^ServerName=//') - adminpassword=$(egrep "^AdminPassword" "${servercfgfullpath}" | sed 's/^AdminPassword=//') + servername=$(grep -E "^ServerName" "${servercfgfullpath}" | sed 's/^ServerName=//') + adminpassword=$(grep -E "^AdminPassword" "${servercfgfullpath}" | sed 's/^AdminPassword=//') # Not Set servername=${servername:-"NOT SET"} diff --git a/lgsm/functions/info_distro.sh b/lgsm/functions/info_distro.sh index 87c73aa3e..c50953cdc 100644 --- a/lgsm/functions/info_distro.sh +++ b/lgsm/functions/info_distro.sh @@ -263,9 +263,9 @@ fi if [ "$(command -v jq 2>/dev/null)" ]; then if [ "${ip}" ]&&[ "${port}" ]; then if [ "${steammaster}" == "true" ]; then - masterserver=$(curl -m 3 -s 'https://api.steampowered.com/ISteamApps/GetServersAtAddress/v0001?addr='${ip}':'${port}'&format=json' | jq '.response.servers[]?|.addr' | wc -l 2>/dev/null) + masterserver=$(curl -m 3 -s 'https://api.steampowered.com/ISteamApps/GetServersAtAddress/v0001?addr='${ip}':'${port}'&format=json' | jq '.response.servers[]|.addr' | wc -l 2>/dev/null) if [ "${masterserver}" == "0" ]; then - masterserver=$(curl -m 3 -s 'https://api.steampowered.com/ISteamApps/GetServersAtAddress/v0001?addr='${extip}':'${port}'&format=json' | jq '.response.servers[]?|.addr' | wc -l 2>/dev/null) + masterserver=$(curl -m 3 -s 'https://api.steampowered.com/ISteamApps/GetServersAtAddress/v0001?addr='${extip}':'${port}'&format=json' | jq '.response.servers[]|.addr' | wc -l 2>/dev/null) fi if [ "${masterserver}" == "0" ]; then displaymasterserver="false" diff --git a/lgsm/functions/install_logs.sh b/lgsm/functions/install_logs.sh index 21c63ccbb..6a272f2ef 100644 --- a/lgsm/functions/install_logs.sh +++ b/lgsm/functions/install_logs.sh @@ -15,7 +15,7 @@ fn_sleep_time # Create LinuxGSM logs. echo -en "installing log dir: ${logdir}..." mkdir -p "${logdir}" -if [ $? -ne 0 ]; then +if [ $? != 0 ]; then fn_print_fail_eol_nl core_exit.sh else @@ -24,7 +24,7 @@ fi echo -en "installing LinuxGSM log dir: ${lgsmlogdir}..." mkdir -p "${lgsmlogdir}" -if [ $? -ne 0 ]; then +if [ $? != 0 ]; then fn_print_fail_eol_nl core_exit.sh else @@ -32,7 +32,7 @@ else fi echo -en "creating LinuxGSM log: ${lgsmlog}..." touch "${lgsmlog}" -if [ $? -ne 0 ]; then +if [ $? != 0 ]; then fn_print_fail_eol_nl core_exit.sh else @@ -42,7 +42,7 @@ fi if [ "${consolelogdir}" ]; then echo -en "installing console log dir: ${consolelogdir}..." mkdir -p "${consolelogdir}" - if [ $? -ne 0 ]; then + if [ $? != 0 ]; then fn_print_fail_eol_nl core_exit.sh else diff --git a/linuxgsm.sh b/linuxgsm.sh index b832a8e1b..7f588937b 100755 --- a/linuxgsm.sh +++ b/linuxgsm.sh @@ -381,7 +381,7 @@ else mkdir -p "${configdirserver}" echo -en "copying _default.cfg...\c" cp -R "${configdirdefault}/config-lgsm/${gameservername}/_default.cfg" "${configdirserver}/_default.cfg" - if [ $? -ne 0 ]; then + if [ $? != 0 ]; then echo -e "FAIL" exit 1 else @@ -393,7 +393,7 @@ else fn_print_warn_nl "_default.cfg has altered. reloading config." echo -en "copying _default.cfg...\c" cp -R "${configdirdefault}/config-lgsm/${gameservername}/_default.cfg" "${configdirserver}/_default.cfg" - if [ $? -ne 0 ]; then + if [ $? != 0 ]; then echo -e "FAIL" exit 1 else From 8121080aee9da1b79a82b41081ae06fbd9ac4d09 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Sat, 18 Jul 2020 00:11:46 +0100 Subject: [PATCH 436/534] Release v20.4.0 --- tests/tests_fctrserver.sh | 2 +- tests/tests_jc2server.sh | 2 +- tests/tests_mcserver.sh | 2 +- tests/tests_ts3server.sh | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/tests/tests_fctrserver.sh b/tests/tests_fctrserver.sh index adb465b1a..4bdbd5c48 100644 --- a/tests/tests_fctrserver.sh +++ b/tests/tests_fctrserver.sh @@ -20,7 +20,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="v20.3.3" +version="v20.4.0" shortname="fctr" gameservername="fctrserver" commandname="CORE" diff --git a/tests/tests_jc2server.sh b/tests/tests_jc2server.sh index eaf7047e9..dced37f74 100644 --- a/tests/tests_jc2server.sh +++ b/tests/tests_jc2server.sh @@ -20,7 +20,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="v20.3.3" +version="v20.4.0" shortname="jc2" gameservername="jc2server" commandname="CORE" diff --git a/tests/tests_mcserver.sh b/tests/tests_mcserver.sh index 74b86b0d6..4837c4594 100644 --- a/tests/tests_mcserver.sh +++ b/tests/tests_mcserver.sh @@ -20,7 +20,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="v20.3.3" +version="v20.4.0" shortname="mc" gameservername="mcserver" commandname="CORE" diff --git a/tests/tests_ts3server.sh b/tests/tests_ts3server.sh index d785fa0b5..b4d0a4563 100644 --- a/tests/tests_ts3server.sh +++ b/tests/tests_ts3server.sh @@ -20,7 +20,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="v20.3.3" +version="v20.4.0" shortname="ts3" gameservername="ts3server" commandname="CORE" From 8673d9b7941ccb70e14f33cce9bee830dec77030 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Tue, 21 Jul 2020 12:09:30 +0100 Subject: [PATCH 437/534] fix(rustserver): fix blueprint not being wiped (#2972) Fix blueprint not being wiped on full-wipe Removed reference to random seeds as this feature doesn't exist yet updated command name from wipeall to full-wipe (old commands will still work but are now hidden) --- .../config-lgsm/rustserver/_default.cfg | 32 ++++------------ lgsm/functions/check_config.sh | 7 +--- lgsm/functions/command_wipe.sh | 28 +++++++------- lgsm/functions/core_dl.sh | 38 +++++++++---------- lgsm/functions/core_getopt.sh | 6 +-- 5 files changed, 46 insertions(+), 65 deletions(-) diff --git a/lgsm/config-default/config-lgsm/rustserver/_default.cfg b/lgsm/config-default/config-lgsm/rustserver/_default.cfg index 595cf3864..280b03033 100644 --- a/lgsm/config-default/config-lgsm/rustserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/rustserver/_default.cfg @@ -9,41 +9,23 @@ #### Game Server Settings #### ## Server Start Settings | https://docs.linuxgsm.com/configuration/start-parameters -# More settings available after install in serverfiles/server/rust-server/server.cfg ip="0.0.0.0" port="28015" rconport="28016" appport=28082 rconpassword="CHANGE_ME" -rconweb="1" # Value is: 1 for Facepunch's web panel; 0 for RCON tools like Rusty or Rustadmin +rconweb="1" # Value is: 1 for the Facepunch 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 -salt="" # default random; range : unknown range ; used to recover a known setting from an existing 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 +seed="" # range: 1-2147483647, used to reproduce a procedural map. +salt="" # range: unknown, used to recover a known setting from an existing map. +worldsize="3000" # default: 3000, range: 1000-6000, map size in meters. +saveinterval="300" # Auto-save in seconds. +tickrate="30" # default: 30, range: 15-100. ## Server Start Command | https://docs.linuxgsm.com/configuration/start-parameters#additional-parameters fn_parms(){ -# Specific to Rust -if [ "${seed}" ]; then - # If set, then add to start parms - conditionalseed="+server.seed ${seed}" -else - # Keep randomness of the number if not set - conditionalseed="" -fi -if [ "${salt}" ]; then - # If set, then add to start parms - conditionalsalt="+server.salt ${salt}" -else - # Keep randomness of the number if not set - conditionalsalt="" -fi -parms="-batchmode +app.listenip ${ip} +app.port ${appport} +server.ip ${ip} +server.port ${port} +server.tickrate ${tickrate} +server.hostname \"${servername}\" +server.identity \"${selfname}\" ${conditionalseed} ${conditionalsalt} +server.maxplayers ${maxplayers} +server.worldsize ${worldsize} +server.saveinterval ${saveinterval} +rcon.web ${rconweb} +rcon.ip ${ip} +rcon.port ${rconport} +rcon.password \"${rconpassword}\" -logfile" +parms="-batchmode +app.listenip ${ip} +app.port ${appport} +server.ip ${ip} +server.port ${port} +server.tickrate ${tickrate} +server.hostname \"${servername}\" +server.identity \"${selfname}\" +server.seed ${seed} +server.salt ${salt} +server.maxplayers ${maxplayers} +server.worldsize ${worldsize} +server.saveinterval ${saveinterval} +rcon.web ${rconweb} +rcon.ip ${ip} +rcon.port ${rconport} +rcon.password \"${rconpassword}\" -logfile" } #### LinuxGSM Settings #### diff --git a/lgsm/functions/check_config.sh b/lgsm/functions/check_config.sh index c799904f2..2b4443cb3 100644 --- a/lgsm/functions/check_config.sh +++ b/lgsm/functions/check_config.sh @@ -20,15 +20,12 @@ fi if [ "${shortname}" == "rust" ]; then if [ -z "${rconpassword}" ]; then fn_print_dots "" - fn_print_fail_nl "RCON password is not set!" - echo -e " * Not setting an RCON password causes issues with ${gamename}" + fn_print_fail_nl "RCON password is not set" fn_script_log_fatal "RCON password is not set" - fn_script_log_fatal "Not setting an RCON password causes issues with ${gamename}" core_exit.sh elif [ "${rconpassword}" == "CHANGE_ME" ]; then fn_print_dots "" - fn_print_warn_nl "Default RCON Password detected!" - echo -e " * Having ${rconpassword} as a password is not very safe." + fn_print_warn_nl "Default RCON Password detected" fn_script_log_warn "Default RCON Password detected" fi fi diff --git a/lgsm/functions/command_wipe.sh b/lgsm/functions/command_wipe.sh index 342a38658..66b335446 100644 --- a/lgsm/functions/command_wipe.sh +++ b/lgsm/functions/command_wipe.sh @@ -26,7 +26,7 @@ fn_wipe_server_files(){ fn_print_start_nl "Wiping server" fn_script_log_info "Wiping server" # Wipe procedural map. - if [ "$(find "${serveridentitydir}" -type f -name "proceduralmap.*.map")" ]; then + if [ -n "$(find "${serveridentitydir}" -type f -name "proceduralmap.*.map")" ]; then echo -en "removing procedural map proceduralmap.*.map file(s)..." fn_sleep_time fn_script_log_info "Removing procedural map file(s): ${serveridentitydir}/proceduralmap.*.map" @@ -39,7 +39,7 @@ fn_wipe_server_files(){ fn_script_log_pass "No procedural map file to remove" fi # Wipe procedural map save. - if [ "$(find "${serveridentitydir}" -type f -name "proceduralmap.*.sav")" ]; then + if [ -n "$(find "${serveridentitydir}" -type f -name "proceduralmap.*.sav")" ]; then echo -en "removing map saves proceduralmap.*.sav file(s)..." fn_sleep_time fn_script_log_info "Removing procedural map save(s): ${serveridentitydir}/proceduralmap.*.sav" @@ -52,7 +52,7 @@ fn_wipe_server_files(){ fn_script_log_pass "No procedural map save to remove" fi # Wipe Barren map. - if [ "$(find "${serveridentitydir}" -type f -name "barren*.map")" ]; then + if [ -n "$(find "${serveridentitydir}" -type f -name "barren*.map")" ]; then echo -en "removing barren map barren*.map file(s)..." fn_sleep_time fn_script_log_info "Removing map file(s): ${serveridentitydir}/barren*.map" @@ -65,7 +65,7 @@ fn_wipe_server_files(){ fn_script_log_pass "No barren map file to remove" fi # Wipe barren map save. - if [ "$(find "${serveridentitydir}" -type f -name "barren*.sav")" ]; then + if [ -n "$(find "${serveridentitydir}" -type f -name "barren*.sav")" ]; then echo -en "removing barren map saves barren*.sav file(s)..." fn_sleep_time fn_script_log_info "Removing barren map save(s): ${serveridentitydir}/barren*.sav" @@ -98,7 +98,7 @@ fn_wipe_server_files(){ # We do not print additional information if there is nothing to remove since this might be obsolete. fi # Wipe sv.files. - if [ "$(find "${serveridentitydir}" -type f -name "sv.files.*.db")" ]; then + if [ -n "$(find "${serveridentitydir}" -type f -name "sv.files.*.db")" ]; then echo -en "removing server misc srv.files*.db file(s)..." fn_sleep_time fn_script_log_info "Removing server misc files: ${serveridentitydir}/sv.files.*.db" @@ -108,7 +108,7 @@ fn_wipe_server_files(){ # No further information if not found because it should I could not get this file showing up. fi # Wipe player death files. - if [ "$(find "${serveridentitydir}" -type f -name "player.deaths.*.db")" ]; then + if [ -n "$(find "${serveridentitydir}" -type f -name "player.deaths.*.db")" ]; then echo -en "removing player deaths player.deaths.*.db file(s)..." fn_sleep_time fn_script_log_info "Removing player death files: ${serveridentitydir}/player.deaths.*.db" @@ -122,7 +122,7 @@ fn_wipe_server_files(){ fi # Wipe blueprints only if full-wipe command was used. if [ "${fullwipe}" == "1" ]; then - if [ "$(find "${serveridentitydir}" -type f -name "player.blueprints.*.db")" ]; then + if [ -n "$(find "${serveridentitydir}" -type f -name "player.blueprints.*.db")" ]; then echo -en "removing blueprints player.blueprints.*.db file(s)..." fn_sleep_time fn_script_log_info "Removing blueprint file(s): ${serveridentitydir}/player.blueprints.*.db" @@ -134,7 +134,7 @@ fn_wipe_server_files(){ fn_sleep_time fn_script_log_pass "No blueprint file to remove" fi - elif [ "$(find "${serveridentitydir}" -type f -name "player.blueprints.*.db")" ]; then + elif [ -n "$(find "${serveridentitydir}" -type f -name "player.blueprints.*.db")" ]; then echo -e "keeping blueprints" fn_sleep_time fn_script_log_info "Keeping blueprints" @@ -144,8 +144,8 @@ fn_wipe_server_files(){ fn_script_log_pass "No blueprints found" fi # Wipe some logs that might be there. - if [ "$(find "${serveridentitydir}" -type f -name "Log.*.txt")" ]; then - echo -en "removing Log files..." + if [ -n "$(find "${serveridentitydir}" -type f -name "Log.*.txt")" ]; then + echo -en "removing log files..." fn_sleep_time fn_script_log_info "Removing log files: ${serveridentitydir}/Log.*.txt" find "${serveridentitydir:?}" -type f -name "Log.*.txt" -delete @@ -204,8 +204,10 @@ if [ -d "${serveridentitydir}/storage" ]||[ -d "${serveridentitydir}/user" ]||[ else fn_wipe_server_files fi - fn_print_ok_nl "" - fn_script_log_pass "Wiping server" + fn_print_complete_nl "Wiping ${selfname}" + fn_script_log_pass "Wiping ${selfname}" +else + fn_print_ok_nl "Wipe not required" + fn_script_log_pass "Wipe not required" fi - core_exit.sh diff --git a/lgsm/functions/core_dl.sh b/lgsm/functions/core_dl.sh index a6521ac03..ae11c4156 100644 --- a/lgsm/functions/core_dl.sh +++ b/lgsm/functions/core_dl.sh @@ -21,7 +21,7 @@ functionselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" fn_dl_steamcmd(){ fn_print_start_nl "${remotelocation}" - fn_script_log_info "${commandaction} server: ${remotelocation}" + fn_script_log_info "${commandaction} ${selfname}: ${remotelocation}" if [ -n "${branch}" ]; then echo -e "Branch: ${branch}" fn_script_log_info "Branch: ${branch}" @@ -91,43 +91,43 @@ fn_dl_steamcmd(){ if [ -n "$(grep "Error!" "${steamcmdlog}" | tail -1)" ]||[ -n "$(grep "ERROR!" "${steamcmdlog}" | tail -1)" ]; then # Not enough space. if [ -n "$(grep "0x202" "${steamcmdlog}" | tail -1)" ]; then - fn_print_failure_nl "${commandaction} server: ${remotelocation}: Not enough space to download server files" - fn_script_log_fatal "${commandaction} server: ${remotelocation}: Not enough space to download server files" + fn_print_failure_nl "${commandaction} ${selfname}: ${remotelocation}: Not enough space to download server files" + fn_script_log_fatal "${commandaction} ${selfname}: ${remotelocation}: Not enough space to download server files" core_exit.sh # Need tp purchase game. elif [ -n "$(grep "No subscription" "${steamcmdlog}" | tail -1)" ]; then - fn_print_failure_nl "${commandaction} server: ${remotelocation}: Steam account does not have a license for the required game" - fn_script_log_fatal "${commandaction} server: ${remotelocation}: Steam account does not have a license for the required game" + fn_print_failure_nl "${commandaction} ${selfname}: ${remotelocation}: Steam account does not have a license for the required game" + fn_script_log_fatal "${commandaction} ${selfname}: ${remotelocation}: Steam account does not have a license for the required game" core_exit.sh # Two-factor authentication failure elif [ -n "$(grep "Two-factor code mismatch" "${steamcmdlog}" | tail -1)" ]; then - fn_print_failure_nl "${commandaction} server: ${remotelocation}: Two-factor authentication failure" - fn_script_log_fatal "${commandaction} server: ${remotelocation}: Two-factor authentication failure" + fn_print_failure_nl "${commandaction} ${selfname}: ${remotelocation}: Two-factor authentication failure" + fn_script_log_fatal "${commandaction} ${selfname}: ${remotelocation}: Two-factor authentication failure" core_exit.sh # Incorrect Branch password elif [ -n "$(grep "Password check for AppId" "${steamcmdlog}" | tail -1)" ]; then - fn_print_failure_nl "${commandaction} server: ${remotelocation}: betapassword is incorrect" - fn_script_log_fatal "${commandaction} server: ${remotelocation}: betapassword is incorrect" + fn_print_failure_nl "${commandaction} ${selfname}: ${remotelocation}: betapassword is incorrect" + fn_script_log_fatal "${commandaction} ${selfname}: ${remotelocation}: betapassword is incorrect" core_exit.sh # Update did not finish. elif [ -n "$(grep "0x402" "${steamcmdlog}" | tail -1)" ]||[ -n "$(grep "0x602" "${steamcmdlog}" | tail -1)" ]; then - fn_print_error2_nl "${commandaction} server: ${remotelocation}: Update required but not completed - check network" - fn_script_log_error "${commandaction} server: ${remotelocation}: Update required but not completed - check network" + fn_print_error2_nl "${commandaction} ${selfname}: ${remotelocation}: Update required but not completed - check network" + fn_script_log_error "${commandaction} ${selfname}: ${remotelocation}: Update required but not completed - check network" else - fn_print_error2_nl "${commandaction} server: ${remotelocation}: Unknown error occured" - fn_script_log_error "${commandaction} server: ${remotelocation}: Unknown error occured" + fn_print_error2_nl "${commandaction} ${selfname}: ${remotelocation}: Unknown error occured" + fn_script_log_error "${commandaction} ${selfname}: ${remotelocation}: Unknown error occured" fi elif [ "${exitcode}" != "0" ]; then - fn_print_error2_nl "${commandaction} server: ${remotelocation}: Exit code: ${exitcode}" - fn_script_log_error "${commandaction} server: ${remotelocation}: Exit code: ${exitcode}" + fn_print_error2_nl "${commandaction} ${selfname}: ${remotelocation}: Exit code: ${exitcode}" + fn_script_log_error "${commandaction} ${selfname}: ${remotelocation}: Exit code: ${exitcode}" else - fn_print_complete_nl "${commandaction} server: ${remotelocation}" - fn_script_log_pass "${commandaction} server: ${remotelocation}" + fn_print_complete_nl "${commandaction} ${selfname}: ${remotelocation}" + fn_script_log_pass "${commandaction} ${selfname}: ${remotelocation}" fi if [ "${counter}" -gt "10" ]; then - fn_print_failure_nl "${commandaction} server: ${remotelocation}: Did not complete the download, too many retrys" - fn_script_log_fatal "${commandaction} server: ${remotelocation}: Did not complete the download, too many retrys" + fn_print_failure_nl "${commandaction} ${selfname}: ${remotelocation}: Did not complete the download, too many retrys" + fn_script_log_fatal "${commandaction} ${selfname}: ${remotelocation}: Did not complete the download, too many retrys" core_exit.sh fi done diff --git a/lgsm/functions/core_getopt.sh b/lgsm/functions/core_getopt.sh index fe31f488f..bca60d5d9 100644 --- a/lgsm/functions/core_getopt.sh +++ b/lgsm/functions/core_getopt.sh @@ -36,8 +36,8 @@ cmd_mods_update=( "mu;mods-update" "command_mods_update.sh" "Update installed mo # Server specific. cmd_change_password=( "pw;change-password" "command_ts3_server_pass.sh" "Change TS3 serveradmin password." ) 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 main game server data." ) -cmd_wipeall=( "wa;wipeall" "wipeall=1; command_wipe.sh" "Wipe your game server data and blueprints." ) +cmd_wipe=( "w;wipe;wi" "command_wipe.sh" "Map assets are wiped and blueprints are kept." ) +cmd_full_wipe=( "fw;full-wipe;wa;wipeall" "fullwipe=1; command_wipe.sh" "Map assets and blueprints are wiped." ) 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." ) @@ -94,7 +94,7 @@ fi # Unreal exclusive. if [ "${shortname}" == "rust" ]; then - currentopt+=( "${cmd_wipe[@]}" "${cmd_wipeall[@]}" ) + currentopt+=( "${cmd_wipe[@]}" "${cmd_full_wipe[@]}" ) fi if [ "${engine}" == "unreal2" ]; then if [ "${shortname}" == "ut2k4" ]; then From bb01afafc8b3e8e2ae2275a65ad498e72c8ce165 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Tue, 21 Jul 2020 12:13:02 +0100 Subject: [PATCH 438/534] Release v20.4.1 --- lgsm/functions/core_functions.sh | 2 +- linuxgsm.sh | 2 +- tests/tests_fctrserver.sh | 2 +- tests/tests_jc2server.sh | 2 +- tests/tests_mcserver.sh | 2 +- tests/tests_ts3server.sh | 2 +- 6 files changed, 6 insertions(+), 6 deletions(-) diff --git a/lgsm/functions/core_functions.sh b/lgsm/functions/core_functions.sh index c0be8d8cc..08b21f8c0 100644 --- a/lgsm/functions/core_functions.sh +++ b/lgsm/functions/core_functions.sh @@ -7,7 +7,7 @@ functionselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" -modulesversion="v20.4.0" +modulesversion="v20.4.1" # Core diff --git a/linuxgsm.sh b/linuxgsm.sh index 7f588937b..dc197210d 100755 --- a/linuxgsm.sh +++ b/linuxgsm.sh @@ -20,7 +20,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="v20.4.0" +version="v20.4.1" shortname="core" gameservername="core" commandname="CORE" diff --git a/tests/tests_fctrserver.sh b/tests/tests_fctrserver.sh index 4bdbd5c48..6510c82b5 100644 --- a/tests/tests_fctrserver.sh +++ b/tests/tests_fctrserver.sh @@ -20,7 +20,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="v20.4.0" +version="v20.4.1" shortname="fctr" gameservername="fctrserver" commandname="CORE" diff --git a/tests/tests_jc2server.sh b/tests/tests_jc2server.sh index dced37f74..e546b74e9 100644 --- a/tests/tests_jc2server.sh +++ b/tests/tests_jc2server.sh @@ -20,7 +20,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="v20.4.0" +version="v20.4.1" shortname="jc2" gameservername="jc2server" commandname="CORE" diff --git a/tests/tests_mcserver.sh b/tests/tests_mcserver.sh index 4837c4594..8c52e05e4 100644 --- a/tests/tests_mcserver.sh +++ b/tests/tests_mcserver.sh @@ -20,7 +20,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="v20.4.0" +version="v20.4.1" shortname="mc" gameservername="mcserver" commandname="CORE" diff --git a/tests/tests_ts3server.sh b/tests/tests_ts3server.sh index b4d0a4563..8a6d38e18 100644 --- a/tests/tests_ts3server.sh +++ b/tests/tests_ts3server.sh @@ -20,7 +20,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="v20.4.0" +version="v20.4.1" shortname="ts3" gameservername="ts3server" commandname="CORE" From 448efc9effe3fab8f48d903a2f87dfc65699430e Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Wed, 22 Jul 2020 21:22:04 +0100 Subject: [PATCH 439/534] add LinuxGSM version to install header --- lgsm/functions/install_header.sh | 1 + 1 file changed, 1 insertion(+) diff --git a/lgsm/functions/install_header.sh b/lgsm/functions/install_header.sh index dae205018..420b827f8 100644 --- a/lgsm/functions/install_header.sh +++ b/lgsm/functions/install_header.sh @@ -12,6 +12,7 @@ fn_sleep_time echo -e "=================================" echo -e "${lightyellow}Linux${default}GSM_" echo -e "by Daniel Gibbs" +echo -e "${lightblue}Version:${default} ${version}" echo -e "${lightblue}Game:${default} ${gamename}" echo -e "${lightblue}Website:${default} https://linuxgsm.com" echo -e "${lightblue}Contributors:${default} https://linuxgsm.com/contrib" From 17a07e2d9c410f99e390c4520d86ccafec5e6caa Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Mon, 3 Aug 2020 09:33:10 +0100 Subject: [PATCH 440/534] feat(details): change master server to state listed or not listed not listed --- lgsm/functions/info_messages.sh | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/lgsm/functions/info_messages.sh b/lgsm/functions/info_messages.sh index cde94d319..4dcd5aae3 100644 --- a/lgsm/functions/info_messages.sh +++ b/lgsm/functions/info_messages.sh @@ -167,7 +167,7 @@ fn_info_message_gameserver(){ # Game type: 0 # Game mode: 0 # Tick rate: 64 - # Master Server: true + # Master Server: listed # Status: ONLINE echo -e "" @@ -380,9 +380,9 @@ fn_info_message_gameserver(){ # Listed on Master server if [ -n "${displaymasterserver}" ]; then if [ "${displaymasterserver}" == "true" ]; then - echo -e "${lightblue}Master server:\t${green}${displaymasterserver}${default}" + echo -e "${lightblue}Master server:\t${green}listed${default}" else - echo -e "${lightblue}Master server:\t${red}${displaymasterserver}${default}" + echo -e "${lightblue}Master server:\t${red}not listed${default}" fi fi From 424af4fd4551be9913fa7a1d9aceeaef48e5d52e Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Mon, 3 Aug 2020 15:53:28 +0100 Subject: [PATCH 441/534] fix(solserver): resolve install infinite loop (#2990) --- 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 0264a7f11..4f651c2e1 100644 --- a/lgsm/functions/install_server_files.sh +++ b/lgsm/functions/install_server_files.sh @@ -91,7 +91,7 @@ elif [ "${shortname}" == "mta" ]; then elif [ "${shortname}" == "fctr" ]; then update_factorio.sh install_factorio_save.sh -elif [ -z "${appid}" ]||[ "${shortname}" == "ahl" ]||[ "${shortname}" == "bd" ]||[ "${shortname}" == "bb" ]||[ "${shortname}" == "ges" ]||[ "${shortname}" == "ns" ]||[ "${shortname}" == "sfc" ]||[ "${shortname}" == "sol" ]||[ "${shortname}" == "ts" ]||[ "${shortname}" == "vs" ]||[ "${shortname}" == "zmr" ]; then +elif [ -z "${appid}" ]||[ "${shortname}" == "ahl" ]||[ "${shortname}" == "bd" ]||[ "${shortname}" == "bb" ]||[ "${shortname}" == "ges" ]||[ "${shortname}" == "ns" ]||[ "${shortname}" == "sfc" ]||[ "${shortname}" == "ts" ]||[ "${shortname}" == "vs" ]||[ "${shortname}" == "zmr" ]; then if [ "${shortname}" == "ut" ]; then install_eula.sh fi From 67333ffeb970e15cb716777b682dd26e6bd46f88 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Sun, 9 Aug 2020 20:30:52 +0100 Subject: [PATCH 442/534] feat(console): allow console to state if verbose and/or interactive (#3000) --- .../config-lgsm/acserver/_default.cfg | 8 +++++-- .../config-lgsm/ahl2server/_default.cfg | 8 +++++-- .../config-lgsm/ahlserver/_default.cfg | 8 +++++-- .../config-lgsm/arkserver/_default.cfg | 8 +++++-- .../config-lgsm/arma3server/_default.cfg | 8 +++++-- .../config-lgsm/avserver/_default.cfg | 5 ++-- .../config-lgsm/bb2server/_default.cfg | 8 +++++-- .../config-lgsm/bbserver/_default.cfg | 8 +++++-- .../config-lgsm/bdserver/_default.cfg | 8 +++++-- .../config-lgsm/bf1942server/_default.cfg | 6 ++++- .../config-lgsm/bfvserver/_default.cfg | 6 ++++- .../config-lgsm/bmdmserver/_default.cfg | 8 +++++-- .../config-lgsm/boserver/_default.cfg | 6 ++++- .../config-lgsm/bsserver/_default.cfg | 8 +++++-- .../config-lgsm/bt1944server/_default.cfg | 8 +++++-- .../config-lgsm/btserver/_default.cfg | 6 ++++- .../config-lgsm/ccserver/_default.cfg | 8 +++++-- .../config-lgsm/cmwserver/_default.cfg | 8 +++++-- .../config-lgsm/cod2server/_default.cfg | 8 +++++-- .../config-lgsm/cod4server/_default.cfg | 8 +++++-- .../config-lgsm/codserver/_default.cfg | 8 +++++-- .../config-lgsm/coduoserver/_default.cfg | 8 +++++-- .../config-lgsm/codwawserver/_default.cfg | 8 +++++-- .../config-lgsm/csczserver/_default.cfg | 8 +++++-- .../config-lgsm/csgoserver/_default.cfg | 8 +++++-- .../config-lgsm/csserver/_default.cfg | 8 +++++-- .../config-lgsm/cssserver/_default.cfg | 8 +++++-- .../config-lgsm/dabserver/_default.cfg | 8 +++++-- .../config-lgsm/dmcserver/_default.cfg | 8 +++++-- .../config-lgsm/dodserver/_default.cfg | 8 +++++-- .../config-lgsm/dodsserver/_default.cfg | 8 +++++-- .../config-lgsm/doiserver/_default.cfg | 8 +++++-- .../config-lgsm/dstserver/_default.cfg | 8 +++++-- .../config-lgsm/dysserver/_default.cfg | 8 +++++-- .../config-lgsm/ecoserver/_default.cfg | 8 +++++-- .../config-lgsm/emserver/_default.cfg | 8 +++++-- .../config-lgsm/etlserver/_default.cfg | 6 ++++- .../config-lgsm/fctrserver/_default.cfg | 8 +++++-- .../config-lgsm/fofserver/_default.cfg | 8 +++++-- .../config-lgsm/gesserver/_default.cfg | 8 +++++-- .../config-lgsm/gmodserver/_default.cfg | 8 +++++-- .../config-lgsm/hl2dmserver/_default.cfg | 8 +++++-- .../config-lgsm/hldmserver/_default.cfg | 8 +++++-- .../config-lgsm/hldmsserver/_default.cfg | 8 +++++-- .../config-lgsm/hwserver/_default.cfg | 14 +++++++---- .../config-lgsm/insserver/_default.cfg | 8 +++++-- .../config-lgsm/inssserver/_default.cfg | 8 +++++-- .../config-lgsm/iosserver/_default.cfg | 8 +++++-- .../config-lgsm/jc2server/_default.cfg | 6 ++++- .../config-lgsm/jc3server/_default.cfg | 6 ++++- .../config-lgsm/kf2server/_default.cfg | 8 +++++-- .../config-lgsm/kfserver/_default.cfg | 10 +++++--- .../config-lgsm/l4d2server/_default.cfg | 8 +++++-- .../config-lgsm/l4dserver/_default.cfg | 8 +++++-- .../config-lgsm/mcbserver/_default.cfg | 6 ++++- .../config-lgsm/mcserver/_default.cfg | 8 +++++-- .../config-lgsm/mhserver/_default.cfg | 8 +++++-- .../config-lgsm/mohaaserver/_default.cfg | 8 +++++-- .../config-lgsm/momserver/_default.cfg | 4 ++-- .../config-lgsm/mtaserver/_default.cfg | 8 +++++-- .../config-lgsm/mumbleserver/_default.cfg | 7 ++++-- .../config-lgsm/ndserver/_default.cfg | 8 +++++-- .../config-lgsm/nmrihserver/_default.cfg | 8 +++++-- .../config-lgsm/ns2cserver/_default.cfg | 8 +++++-- .../config-lgsm/ns2server/_default.cfg | 8 +++++-- .../config-lgsm/nsserver/_default.cfg | 8 +++++-- .../config-lgsm/onsetserver/_default.cfg | 6 ++++- .../config-lgsm/opforserver/_default.cfg | 8 +++++-- .../config-lgsm/pcserver/_default.cfg | 6 ++++- .../config-lgsm/pstbsserver/_default.cfg | 8 +++++-- .../config-lgsm/pvkiiserver/_default.cfg | 8 +++++-- .../config-lgsm/pzserver/_default.cfg | 8 +++++-- .../config-lgsm/q2server/_default.cfg | 8 +++++-- .../config-lgsm/q3server/_default.cfg | 8 +++++-- .../config-lgsm/qlserver/_default.cfg | 8 ++++--- .../config-lgsm/qwserver/_default.cfg | 8 +++++-- .../config-lgsm/ricochetserver/_default.cfg | 8 +++++-- .../config-lgsm/roserver/_default.cfg | 8 +++++-- .../config-lgsm/rtcwserver/_default.cfg | 8 +++++-- .../config-lgsm/rustserver/_default.cfg | 8 +++++-- .../config-lgsm/rwserver/_default.cfg | 8 +++++-- .../config-lgsm/sampserver/_default.cfg | 8 +++++-- .../config-lgsm/sbotsserver/_default.cfg | 8 +++++-- .../config-lgsm/sbserver/_default.cfg | 8 +++++-- .../config-lgsm/sdtdserver/_default.cfg | 8 +++++-- .../config-lgsm/sfcserver/_default.cfg | 8 +++++-- .../config-lgsm/sof2server/_default.cfg | 8 +++++-- .../config-lgsm/solserver/_default.cfg | 8 +++++-- .../config-lgsm/squadserver/_default.cfg | 8 +++++-- .../config-lgsm/ss3server/_default.cfg | 8 +++++-- .../config-lgsm/stserver/_default.cfg | 8 +++++-- .../config-lgsm/svenserver/_default.cfg | 8 +++++-- .../config-lgsm/terrariaserver/_default.cfg | 8 +++++-- .../config-lgsm/tf2server/_default.cfg | 8 +++++-- .../config-lgsm/tfcserver/_default.cfg | 8 +++++-- .../config-lgsm/ts3server/_default.cfg | 9 +++---- .../config-lgsm/tsserver/_default.cfg | 8 +++++-- .../config-lgsm/tuserver/_default.cfg | 8 +++++-- .../config-lgsm/twserver/_default.cfg | 8 +++++-- .../config-lgsm/untserver/_default.cfg | 12 +++++----- .../config-lgsm/ut2k4server/_default.cfg | 8 +++++-- .../config-lgsm/ut3server/_default.cfg | 8 +++++-- .../config-lgsm/ut99server/_default.cfg | 8 +++++-- .../config-lgsm/utserver/_default.cfg | 10 +++++--- .../config-lgsm/vsserver/_default.cfg | 8 +++++-- .../config-lgsm/wetserver/_default.cfg | 8 +++++-- .../config-lgsm/wfserver/_default.cfg | 8 +++++-- .../config-lgsm/wurmserver/_default.cfg | 12 ++++++---- .../config-lgsm/zmrserver/_default.cfg | 8 +++++-- .../config-lgsm/zpsserver/_default.cfg | 8 +++++-- lgsm/functions/command_console.sh | 24 +++++++++++++++---- lgsm/functions/command_debug.sh | 3 ++- lgsm/functions/command_ts3_server_pass.sh | 3 ++- lgsm/functions/compress_unreal2_maps.sh | 3 ++- lgsm/functions/compress_ut99_maps.sh | 3 ++- lgsm/functions/core_trap.sh | 3 +++ lgsm/functions/info_config.sh | 8 +++---- lgsm/functions/install_eula.sh | 1 + lgsm/functions/install_retry.sh | 1 + lgsm/functions/install_server_dir.sh | 3 ++- tests/tests_defaultcfg/defaultcfg_1.txt | 5 +++- 121 files changed, 689 insertions(+), 239 deletions(-) diff --git a/lgsm/config-default/config-lgsm/acserver/_default.cfg b/lgsm/config-default/config-lgsm/acserver/_default.cfg index 0faa375da..acf67e9a9 100644 --- a/lgsm/config-default/config-lgsm/acserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/acserver/_default.cfg @@ -12,9 +12,9 @@ steamuser="username" steampass='password' -## Server Start Settings | https://docs.linuxgsm.com/configuration/start-parameters +## Predefined Parameters | https://docs.linuxgsm.com/configuration/start-parameters -## Server Start Command | https://docs.linuxgsm.com/configuration/start-parameters#additional-parameters +## Server Parameters | https://docs.linuxgsm.com/configuration/start-parameters#additional-parameters fn_parms(){ parms="-c ${servercfgfullpath}" } @@ -137,6 +137,10 @@ stopmode="2" querymode="5" querytype="" +## Console type +consoleverbose="yes" +consoleinteract="no" + ## Game Server Details # Do not edit gamename="Assetto Corsa" diff --git a/lgsm/config-default/config-lgsm/ahl2server/_default.cfg b/lgsm/config-default/config-lgsm/ahl2server/_default.cfg index 39d99e9e5..64575486e 100644 --- a/lgsm/config-default/config-lgsm/ahl2server/_default.cfg +++ b/lgsm/config-default/config-lgsm/ahl2server/_default.cfg @@ -12,7 +12,7 @@ steamuser="username" steampass='password' -## Server Start Settings | https://docs.linuxgsm.com/configuration/start-parameters +## Predefined Parameters | https://docs.linuxgsm.com/configuration/start-parameters ip="0.0.0.0" port="27015" clientport="27005" @@ -20,7 +20,7 @@ sourcetvport="27020" defaultmap="act_airport" maxplayers="20" -## Server Start Command | https://docs.linuxgsm.com/configuration/start-parameters#additional-parameters +## Server Parameters | https://docs.linuxgsm.com/configuration/start-parameters#additional-parameters fn_parms(){ parms="-game ahl2 -strictportbind -ip ${ip} -port ${port} +clientport ${clientport} +tv_port ${sourcetvport} +map ${defaultmap} +servercfgfile ${servercfg} -maxplayers ${maxplayers}" } @@ -143,6 +143,10 @@ betapassword="" # Master Server | https://docs.linuxgsm.com/steamcmd/steam-master-server steammaster="true" +## Console type +consoleverbose="yes" +consoleinteract="yes" + ## Game Server Details # Do not edit gamename="Action: Source" diff --git a/lgsm/config-default/config-lgsm/ahlserver/_default.cfg b/lgsm/config-default/config-lgsm/ahlserver/_default.cfg index 2a611c2e6..723c8b2c7 100644 --- a/lgsm/config-default/config-lgsm/ahlserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/ahlserver/_default.cfg @@ -8,14 +8,14 @@ #### Game Server Settings #### -## Server Start Settings | https://docs.linuxgsm.com/configuration/start-parameters +## Predefined Parameters | https://docs.linuxgsm.com/configuration/start-parameters ip="0.0.0.0" port="27015" clientport="27005" defaultmap="ahl_hydro" maxplayers="16" -## Server Start Command | https://docs.linuxgsm.com/configuration/start-parameters#additional-parameters +## Server Parameters | https://docs.linuxgsm.com/configuration/start-parameters#additional-parameters fn_parms(){ parms="-game action -strictportbind +ip ${ip} -port ${port} +clientport ${clientport} +map ${defaultmap} +servercfgfile ${servercfg} -maxplayers ${maxplayers} " } @@ -139,6 +139,10 @@ stopmode="9" querymode="2" querytype="protocol-valve" +## Console type +consoleverbose="yes" +consoleinteract="yes" + ## Game Server Details # Do not edit gamename="Action half-life" diff --git a/lgsm/config-default/config-lgsm/arkserver/_default.cfg b/lgsm/config-default/config-lgsm/arkserver/_default.cfg index 9dc41afc2..f604e1c87 100644 --- a/lgsm/config-default/config-lgsm/arkserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/arkserver/_default.cfg @@ -8,7 +8,7 @@ #### Game Server Settings #### -## Server Start Settings | https://docs.linuxgsm.com/configuration/start-parameters +## Predefined Parameters | https://docs.linuxgsm.com/configuration/start-parameters ip="0.0.0.0" port="7777" queryport="27015" @@ -18,7 +18,7 @@ defaultmap="TheIsland" altsavedirectoryname="${defaultmap}" maxplayers="70" -## Server Start Command | https://docs.linuxgsm.com/configuration/start-parameters#additional-parameters +## Server Parameters | https://docs.linuxgsm.com/configuration/start-parameters#additional-parameters fn_parms(){ parms="${defaultmap}?AltSaveDirectoryName=${altsavedirectoryname}?listen?MultiHome=${ip}?MaxPlayers=${maxplayers}?QueryPort=${queryport}?RCONPort=${rconport}?Port=${port} -automanagedmods -crossplay -PublicIPForEpic=${ip}" } @@ -141,6 +141,10 @@ stopmode="2" querymode="2" querytype="protocol-valve" +## Console type +consoleverbose="no" +consoleinteract="no" + ## Game Server Details # Do not edit gamename="ARK: Survival Evolved" diff --git a/lgsm/config-default/config-lgsm/arma3server/_default.cfg b/lgsm/config-default/config-lgsm/arma3server/_default.cfg index 3c57f1ff2..7a200ed62 100644 --- a/lgsm/config-default/config-lgsm/arma3server/_default.cfg +++ b/lgsm/config-default/config-lgsm/arma3server/_default.cfg @@ -12,7 +12,7 @@ steamuser="username" steampass='password' -## Server Start Settings | https://docs.linuxgsm.com/configuration/start-parameters +## Predefined Parameters | https://docs.linuxgsm.com/configuration/start-parameters ip="0.0.0.0" port="2302" @@ -31,7 +31,7 @@ servermods="" # Leave empty for default bepath="" -## Server Start Command | https://docs.linuxgsm.com/configuration/start-parameters#additional-parameters +## Server Parameters | https://docs.linuxgsm.com/configuration/start-parameters#additional-parameters fn_parms(){ parms="-ip=${ip} -port=${port} -cfg=${networkcfgfullpath} -config=${servercfgfullpath} -mod=${mods} -servermod=${servermods} -bepath=${bepath} -autoinit -loadmissiontomemory" } @@ -154,6 +154,10 @@ stopmode="2" querymode="2" querytype="protocol-valve" +## Console type +consoleverbose="yes" +consoleinteract="no" + ## Game Server Details # Do not edit gamename="ARMA 3" diff --git a/lgsm/config-default/config-lgsm/avserver/_default.cfg b/lgsm/config-default/config-lgsm/avserver/_default.cfg index c3cce8c2b..88a79d8ae 100644 --- a/lgsm/config-default/config-lgsm/avserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/avserver/_default.cfg @@ -7,12 +7,13 @@ # [instance].cfg - applies settings to a specific instance. #### Game Server Settings #### -## Server Start Settings | https://docs.linuxgsm.com/configuration/start-parameters + +## Predefined Parameters | https://docs.linuxgsm.com/configuration/start-parameters port="27000" # https://steamidfinder.com adminsteamid="" -## Server Start Command | https://docs.linuxgsm.com/configuration/start-parameters#additional-parameters +## Server Parameters | https://docs.linuxgsm.com/configuration/start-parameters#additional-parameters fn_parms(){ if [ ! -z "${adminsteamid}" ]; then admincmd="--admin ${adminsteamid}" diff --git a/lgsm/config-default/config-lgsm/bb2server/_default.cfg b/lgsm/config-default/config-lgsm/bb2server/_default.cfg index 0c8ef08fa..92c29ea53 100644 --- a/lgsm/config-default/config-lgsm/bb2server/_default.cfg +++ b/lgsm/config-default/config-lgsm/bb2server/_default.cfg @@ -8,7 +8,7 @@ #### Game Server Settings #### -## Server Start Settings | https://docs.linuxgsm.com/configuration/start-parameters +## Predefined Parameters | https://docs.linuxgsm.com/configuration/start-parameters ip="0.0.0.0" port="27015" clientport="27005" @@ -21,7 +21,7 @@ maxplayers="20" # More info: https://docs.linuxgsm.com/steamcmd/gslt gslt="" -## Server Start Command | https://docs.linuxgsm.com/configuration/start-parameters#additional-parameters +## Server Parameters | https://docs.linuxgsm.com/configuration/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}" } @@ -144,6 +144,10 @@ stopmode="3" querymode="2" querytype="protocol-valve" +## Console type +consoleverbose="yes" +consoleinteract="yes" + ## Game Server Details # Do not edit gamename="BrainBread 2" diff --git a/lgsm/config-default/config-lgsm/bbserver/_default.cfg b/lgsm/config-default/config-lgsm/bbserver/_default.cfg index 6397af14c..8db5ec125 100644 --- a/lgsm/config-default/config-lgsm/bbserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/bbserver/_default.cfg @@ -8,14 +8,14 @@ #### Game Server Settings #### -## Server Start Settings | https://docs.linuxgsm.com/configuration/start-parameters +## Predefined Parameters | https://docs.linuxgsm.com/configuration/start-parameters ip="0.0.0.0" port="27015" clientport="27005" defaultmap="bb_chp4_slaywatch" maxplayers="16" -## Server Start Command | https://docs.linuxgsm.com/configuration/start-parameters#additional-parameters +## Server Parameters | https://docs.linuxgsm.com/configuration/start-parameters#additional-parameters fn_parms(){ parms="-game brainbread -strictportbind +ip ${ip} -port ${port} +clientport ${clientport} +map ${defaultmap} +servercfgfile ${servercfg} -maxplayers ${maxplayers}" } @@ -139,6 +139,10 @@ stopmode="9" querymode="2" querytype="protocol-valve" +## Console type +consoleverbose="yes" +consoleinteract="yes" + ## Game Server Details # Do not edit gamename="BrainBread" diff --git a/lgsm/config-default/config-lgsm/bdserver/_default.cfg b/lgsm/config-default/config-lgsm/bdserver/_default.cfg index d4bfabb8e..33c08a930 100644 --- a/lgsm/config-default/config-lgsm/bdserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/bdserver/_default.cfg @@ -8,14 +8,14 @@ #### Game Server Settings #### -## Server Start Settings | https://docs.linuxgsm.com/configuration/start-parameters +## Predefined Parameters | https://docs.linuxgsm.com/configuration/start-parameters ip="0.0.0.0" port="27015" clientport="27005" defaultmap="pve_tomb" maxplayers="3" -## Server Start Command | https://docs.linuxgsm.com/configuration/start-parameters#additional-parameters +## Server Parameters | https://docs.linuxgsm.com/configuration/start-parameters#additional-parameters fn_parms(){ parms="-game bdef -strictportbind +ip ${ip} -port ${port} +clientport ${clientport} +map ${defaultmap} +servercfgfile ${servercfg} -maxplayers ${maxplayers}" } @@ -138,6 +138,10 @@ stopmode="9" querymode="2" querytype="protocol-valve" +## Console type +consoleverbose="yes" +consoleinteract="yes" + ## Game Server Details # Do not edit gamename="Base Defense" diff --git a/lgsm/config-default/config-lgsm/bf1942server/_default.cfg b/lgsm/config-default/config-lgsm/bf1942server/_default.cfg index 2bf084b18..b80448fec 100644 --- a/lgsm/config-default/config-lgsm/bf1942server/_default.cfg +++ b/lgsm/config-default/config-lgsm/bf1942server/_default.cfg @@ -8,7 +8,7 @@ #### Game Server Settings #### -## Server Start Command | https://docs.linuxgsm.com/configuration/start-parameters#additional-parameters +## Server Parameters | https://docs.linuxgsm.com/configuration/start-parameters#additional-parameters fn_parms(){ parms="+hostServer 1 +dedicated 1" } @@ -122,6 +122,10 @@ stopmode="2" querymode="2" querytype="protocol-gamespy1" +## Console type +consoleverbose="no" +consoleinteract="no" + ## Game Server Details # Do not edit gamename="Battlefield: 1942" diff --git a/lgsm/config-default/config-lgsm/bfvserver/_default.cfg b/lgsm/config-default/config-lgsm/bfvserver/_default.cfg index 99d1555d8..f3a969f23 100644 --- a/lgsm/config-default/config-lgsm/bfvserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/bfvserver/_default.cfg @@ -8,7 +8,7 @@ #### Game Server Settings #### -## Server Start Command | https://docs.linuxgsm.com/configuration/start-parameters#additional-parameters +## Server Parameters | https://docs.linuxgsm.com/configuration/start-parameters#additional-parameters fn_parms(){ parms="+statusMonitor 1" } @@ -122,6 +122,10 @@ stopmode="3" querymode="1" querytype="" +## Console type +consoleverbose="yes" +consoleinteract="no" + ## Game Server Details # Do not edit gamename="Battlefield: Vietnam" diff --git a/lgsm/config-default/config-lgsm/bmdmserver/_default.cfg b/lgsm/config-default/config-lgsm/bmdmserver/_default.cfg index 12cabed62..ded8adcaa 100644 --- a/lgsm/config-default/config-lgsm/bmdmserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/bmdmserver/_default.cfg @@ -8,7 +8,7 @@ #### Game Server Settings #### -## Server Start Settings | https://docs.linuxgsm.com/configuration/start-parameters +## Predefined Parameters | https://docs.linuxgsm.com/configuration/start-parameters ip="0.0.0.0" port="27015" clientport="27005" @@ -21,7 +21,7 @@ maxplayers="16" # More info: https://docs.linuxgsm.com/steamcmd/gslt gslt="" -## Server Start Command | https://docs.linuxgsm.com/configuration/start-parameters#additional-parameters +## Server Parameters | https://docs.linuxgsm.com/configuration/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}" } @@ -144,6 +144,10 @@ stopmode="3" querymode="2" querytype="protocol-valve" +## Console type +consoleverbose="yes" +consoleinteract="yes" + ## Game Server Details # Do not edit gamename="Black Mesa: Deathmatch" diff --git a/lgsm/config-default/config-lgsm/boserver/_default.cfg b/lgsm/config-default/config-lgsm/boserver/_default.cfg index 9e8e28000..fed729193 100644 --- a/lgsm/config-default/config-lgsm/boserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/boserver/_default.cfg @@ -14,7 +14,7 @@ gslt="" ip="" -## Server Start Command | https://docs.linuxgsm.com/configuration/start-parameters#additional-parameters +## Server Parameters | https://docs.linuxgsm.com/configuration/start-parameters#additional-parameters fn_parms(){ parms="-batchmode -nographics -dedicated -configfile=${servercfgfullpath}" } @@ -137,6 +137,10 @@ stopmode="2" querymode="2" querytype="protocol-valve" +## Console type +consoleverbose="yes" +consoleinteract="no" + ## Game Server Details # Do not edit gamename="Ballistic Overkill" diff --git a/lgsm/config-default/config-lgsm/bsserver/_default.cfg b/lgsm/config-default/config-lgsm/bsserver/_default.cfg index 81111150b..8e5ba4e99 100644 --- a/lgsm/config-default/config-lgsm/bsserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/bsserver/_default.cfg @@ -12,7 +12,7 @@ steamuser="username" steampass='password' -## Server Start Settings | https://docs.linuxgsm.com/configuration/start-parameters +## Predefined Parameters | https://docs.linuxgsm.com/configuration/start-parameters ip="0.0.0.0" port="27015" clientport="27005" @@ -25,7 +25,7 @@ maxplayers="16" # More info: https://docs.linuxgsm.com/steamcmd/gslt gslt="" -## Server Start Command | https://docs.linuxgsm.com/configuration/start-parameters#additional-parameters +## Server Parameters | https://docs.linuxgsm.com/configuration/start-parameters#additional-parameters fn_parms(){ parms="-game "${serverfiles}/berimbau" -autoupdate -strictportbind -ip ${ip} -port ${port} +clientport ${clientport} +tv_port ${sourcetvport} +sv_setsteamaccount ${gslt} +map ${defaultmap} +servercfgfile ${servercfg} -maxplayers ${maxplayers}" } @@ -148,6 +148,10 @@ stopmode="3" querymode="2" querytype="protocol-valve" +## Console type +consoleverbose="yes" +consoleinteract="yes" + ## Game Server Details # Do not edit gamename="Blade Symphony" diff --git a/lgsm/config-default/config-lgsm/bt1944server/_default.cfg b/lgsm/config-default/config-lgsm/bt1944server/_default.cfg index 50d397812..c9ce30d64 100644 --- a/lgsm/config-default/config-lgsm/bt1944server/_default.cfg +++ b/lgsm/config-default/config-lgsm/bt1944server/_default.cfg @@ -8,12 +8,12 @@ #### Game Server Settings #### -## Server Start Settings | https://docs.linuxgsm.com/configuration/start-parameters +## Predefined Parameters | https://docs.linuxgsm.com/configuration/start-parameters ip="0.0.0.0" port="7777" queryport="7780" -## Server Start Command | https://docs.linuxgsm.com/configuration/start-parameters#additional-parameters +## Server Parameters | https://docs.linuxgsm.com/configuration/start-parameters#additional-parameters fn_parms(){ parms="/Game/Maps/Final_Maps/Derailed?Game=/Script/ShooterGame.WartideGameMode?listen -log -broadcastip=\"${extip}\" -PORT=${port} -QueryPort=${queryport} -defgameini=\"${servercfgfullpath}\"" } @@ -136,6 +136,10 @@ stopmode="2" querymode="2" querytype="protocol-valve" +## Console type +consoleverbose="no" +consoleinteract="no" + ## Game Server Details # Do not edit gamename="Battalion 1944" diff --git a/lgsm/config-default/config-lgsm/btserver/_default.cfg b/lgsm/config-default/config-lgsm/btserver/_default.cfg index f10520f31..171ef438b 100644 --- a/lgsm/config-default/config-lgsm/btserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/btserver/_default.cfg @@ -8,7 +8,7 @@ #### Game Server Settings #### -## Server Start Command | https://docs.linuxgsm.com/configuration/start-parameters#additional-parameters +## Server Parameters | https://docs.linuxgsm.com/configuration/start-parameters#additional-parameters fn_parms(){ parms="" } @@ -131,6 +131,10 @@ stopmode="7" querymode="2" querytype="protocol-valve" +## Console type +consoleverbose="yes" +consoleinteract="yes" + ## Game Server Details # Do not edit gamename="Barotrauma" diff --git a/lgsm/config-default/config-lgsm/ccserver/_default.cfg b/lgsm/config-default/config-lgsm/ccserver/_default.cfg index bd9eb1c5d..492cba01c 100644 --- a/lgsm/config-default/config-lgsm/ccserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/ccserver/_default.cfg @@ -8,7 +8,7 @@ #### Game Server Settings #### -## Server Start Settings | https://docs.linuxgsm.com/configuration/start-parameters +## Predefined Parameters | https://docs.linuxgsm.com/configuration/start-parameters ip="0.0.0.0" port="27015" clientport="27005" @@ -16,7 +16,7 @@ sourcetvport="27020" defaultmap="cbe_bunker" maxplayers="6" -## Server Start Command | https://docs.linuxgsm.com/configuration/start-parameters#additional-parameters +## Server Parameters | https://docs.linuxgsm.com/configuration/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}" } @@ -139,6 +139,10 @@ stopmode="3" querymode="2" querytype="protocol-valve" +## Console type +consoleverbose="yes" +consoleinteract="yes" + ## Game Server Details # Do not edit gamename="Codename CURE" diff --git a/lgsm/config-default/config-lgsm/cmwserver/_default.cfg b/lgsm/config-default/config-lgsm/cmwserver/_default.cfg index 36d9555ce..8ef4dd04c 100644 --- a/lgsm/config-default/config-lgsm/cmwserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/cmwserver/_default.cfg @@ -8,14 +8,14 @@ #### Game Server Settings #### -## Server Start Settings | https://docs.linuxgsm.com/configuration/start-parameters +## Predefined Parameters | https://docs.linuxgsm.com/configuration/start-parameters ip="0.0.0.0" port="7777" queryport="7779" defaultmap="AOCTD-Frigid_p" -## Server Start Command | https://docs.linuxgsm.com/configuration/start-parameters#additional-parameters +## Server Parameters | https://docs.linuxgsm.com/configuration/start-parameters#additional-parameters fn_parms(){ parms="${defaultmap}?steamsockets -multihome=${ip} -Port=${port} -QueryPort=${queryport} -seekfreeloadingserver -configsubdir=${gamelogdir} -log=${gamelog}" @@ -140,6 +140,10 @@ stopmode="2" querymode="2" querytype="protocol-valve" +## Console type +consoleverbose="yes" +consoleinteract="no" + ## Game Server Details # Do not edit gamename="Chivalry: Medieval Warfare" diff --git a/lgsm/config-default/config-lgsm/cod2server/_default.cfg b/lgsm/config-default/config-lgsm/cod2server/_default.cfg index 6ec7c17d3..120f803b7 100644 --- a/lgsm/config-default/config-lgsm/cod2server/_default.cfg +++ b/lgsm/config-default/config-lgsm/cod2server/_default.cfg @@ -8,13 +8,13 @@ #### Game Server Settings #### -## Server Start Settings | https://docs.linuxgsm.com/configuration/start-parameters +## Predefined Parameters | https://docs.linuxgsm.com/configuration/start-parameters ip="0.0.0.0" port="28960" defaultmap="mp_leningrad" maxplayers="20" -## Server Start Command | https://docs.linuxgsm.com/configuration/start-parameters#additional-parameters +## Server Parameters | https://docs.linuxgsm.com/configuration/start-parameters#additional-parameters fn_parms(){ parms="+set sv_punkbuster 0 +set fs_basepath ${serverfiles} +set dedicated 2 +set net_ip ${ip} +set net_port ${port} +set sv_maxclients ${maxplayers} +exec ${servercfg} +map ${defaultmap}" } @@ -125,6 +125,10 @@ stopmode="3" querymode="2" querytype="protocol-quake3" +## Console type +consoleverbose="yes" +consoleinteract="no" + ## Game Server Details # Do not edit gamename="Call of Duty 2" diff --git a/lgsm/config-default/config-lgsm/cod4server/_default.cfg b/lgsm/config-default/config-lgsm/cod4server/_default.cfg index 3ca19c411..acdfa5b95 100644 --- a/lgsm/config-default/config-lgsm/cod4server/_default.cfg +++ b/lgsm/config-default/config-lgsm/cod4server/_default.cfg @@ -8,13 +8,13 @@ #### Game Server Settings #### -## Server Start Settings | https://docs.linuxgsm.com/configuration/start-parameters +## Predefined Parameters | https://docs.linuxgsm.com/configuration/start-parameters ip="0.0.0.0" port="28960" defaultmap="mp_crossfire" maxplayers="32" -## Server Start Command | https://docs.linuxgsm.com/configuration/start-parameters#additional-parameters +## Server Parameters | https://docs.linuxgsm.com/configuration/start-parameters#additional-parameters fn_parms(){ parms="+set sv_punkbuster 0 +set fs_basepath ${serverfiles} +set fs_homepath ${serverfiles} +set sv_authorizemode "-1" +set dedicated 2 +set net_ip ${ip} +set net_port ${port} +set sv_maxclients ${maxplayers} +exec ${servercfg} +map ${defaultmap}" } @@ -125,6 +125,10 @@ stopmode="3" querymode="2" querytype="protocol-quake3" +## Console type +consoleverbose="yes" +consoleinteract="no" + ## Game Server Details # Do not edit gamename="Call of Duty 4" diff --git a/lgsm/config-default/config-lgsm/codserver/_default.cfg b/lgsm/config-default/config-lgsm/codserver/_default.cfg index a9e97f086..c3b9c4f77 100644 --- a/lgsm/config-default/config-lgsm/codserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/codserver/_default.cfg @@ -8,13 +8,13 @@ #### Game Server Settings #### -## Server Start Settings | https://docs.linuxgsm.com/configuration/start-parameters +## Predefined Parameters | https://docs.linuxgsm.com/configuration/start-parameters ip="0.0.0.0" port="28960" defaultmap="mp_neuville" maxplayers="20" -## Server Start Command | https://docs.linuxgsm.com/configuration/start-parameters#additional-parameters +## Server Parameters | https://docs.linuxgsm.com/configuration/start-parameters#additional-parameters fn_parms(){ parms="+set sv_punkbuster 0 +set fs_basepath ${serverfiles} +set dedicated 2 +set net_ip ${ip} +set net_port ${port} +set sv_maxclients ${maxplayers} +exec ${servercfg} +map ${defaultmap}" } @@ -125,6 +125,10 @@ stopmode="3" querymode="2" querytype="protocol-quake3" +## Console type +consoleverbose="yes" +consoleinteract="no" + ## Game Server Details # Do not edit gamename="Call of Duty" diff --git a/lgsm/config-default/config-lgsm/coduoserver/_default.cfg b/lgsm/config-default/config-lgsm/coduoserver/_default.cfg index 390a92c25..55a52c111 100644 --- a/lgsm/config-default/config-lgsm/coduoserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/coduoserver/_default.cfg @@ -8,13 +8,13 @@ #### Game Server Settings #### -## Server Start Settings | https://docs.linuxgsm.com/configuration/start-parameters +## Predefined Parameters | https://docs.linuxgsm.com/configuration/start-parameters ip="0.0.0.0" port="28960" defaultmap="mp_cassino" maxplayers="20" -## Server Start Command | https://docs.linuxgsm.com/configuration/start-parameters#additional-parameters +## Server Parameters | https://docs.linuxgsm.com/configuration/start-parameters#additional-parameters fn_parms(){ parms="+set sv_punkbuster 0 +set fs_basepath ${serverfiles} +set dedicated 2 +set net_ip ${ip} +set net_port ${port} +set sv_maxclients ${maxplayers} +exec ${servercfg} +map ${defaultmap}" } @@ -125,6 +125,10 @@ stopmode="3" querymode="2" querytype="protocol-quake3" +## Console type +consoleverbose="yes" +consoleinteract="no" + ## Game Server Details # Do not edit gamename="Call of Duty: United Offensive" diff --git a/lgsm/config-default/config-lgsm/codwawserver/_default.cfg b/lgsm/config-default/config-lgsm/codwawserver/_default.cfg index 3906ee496..e79aa1d29 100644 --- a/lgsm/config-default/config-lgsm/codwawserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/codwawserver/_default.cfg @@ -8,13 +8,13 @@ #### Game Server Settings #### -## Server Start Settings | https://docs.linuxgsm.com/configuration/start-parameters +## Predefined Parameters | https://docs.linuxgsm.com/configuration/start-parameters ip="0.0.0.0" port="28960" defaultmap="mp_castle" maxplayers="20" -## Server Start Command | https://docs.linuxgsm.com/configuration/start-parameters#additional-parameters +## Server Parameters | https://docs.linuxgsm.com/configuration/start-parameters#additional-parameters fn_parms(){ parms="+set sv_punkbuster 0 +set fs_basepath ${serverfiles} +set dedicated 2 +set net_ip ${ip} +set net_port ${port} +set sv_maxclients ${maxplayers} +exec ${servercfg} +map ${defaultmap}" } @@ -125,6 +125,10 @@ stopmode="3" querymode="2" querytype="protocol-quake3" +## Console type +consoleverbose="yes" +consoleinteract="no" + ## Game Server Details # Do not edit gamename="Call of Duty: World at War" diff --git a/lgsm/config-default/config-lgsm/csczserver/_default.cfg b/lgsm/config-default/config-lgsm/csczserver/_default.cfg index 90e1eb623..50e6d2c4f 100644 --- a/lgsm/config-default/config-lgsm/csczserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/csczserver/_default.cfg @@ -8,14 +8,14 @@ #### Game Server Settings #### -## Server Start Settings | https://docs.linuxgsm.com/configuration/start-parameters +## Predefined Parameters | https://docs.linuxgsm.com/configuration/start-parameters ip="0.0.0.0" port="27015" clientport="27005" defaultmap="de_dust2" maxplayers="16" -## Server Start Command | https://docs.linuxgsm.com/configuration/start-parameters#additional-parameters +## Server Parameters | https://docs.linuxgsm.com/configuration/start-parameters#additional-parameters fn_parms(){ parms="-game czero -strictportbind +ip ${ip} -port ${port} +clientport ${clientport} +map ${defaultmap} +servercfgfile ${servercfg} -maxplayers ${maxplayers}" } @@ -139,6 +139,10 @@ stopmode="9" querymode="2" querytype="protocol-valve" +## Console type +consoleverbose="yes" +consoleinteract="yes" + ## Game Server Details # Do not edit gamename="Counter-Strike: Condition Zero" diff --git a/lgsm/config-default/config-lgsm/csgoserver/_default.cfg b/lgsm/config-default/config-lgsm/csgoserver/_default.cfg index d4071272a..a69aa9c29 100644 --- a/lgsm/config-default/config-lgsm/csgoserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/csgoserver/_default.cfg @@ -8,7 +8,7 @@ #### Game Server Settings #### -## Server Start Settings | https://docs.linuxgsm.com/configuration/start-parameters +## Predefined Parameters | https://docs.linuxgsm.com/configuration/start-parameters # https://docs.linuxgsm.com/game-servers/counter-strike-global-offensive # [Game Modes] gametype gamemode mapgroup (you can mix these across all Game Modes except Danger Zone, but use only one) # Arms Race 1 0 mg_armsrace @@ -41,7 +41,7 @@ wsapikey="" wscollectionid="" wsstartmap="" -## Server Start Command | https://docs.linuxgsm.com/configuration/start-parameters#additional-parameters +## Server Parameters | https://docs.linuxgsm.com/configuration/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_type ${gametype} +game_mode ${gamemode} +host_workshop_collection ${wscollectionid} +workshop_start_map ${wsstartmap} -authkey ${wsapikey} -nobreakpad" } @@ -164,6 +164,10 @@ stopmode="3" querymode="2" querytype="protocol-valve" +## Console type +consoleverbose="yes" +consoleinteract="yes" + ## Game Server Details # Do not edit gamename="Counter-Strike: Global Offensive" diff --git a/lgsm/config-default/config-lgsm/csserver/_default.cfg b/lgsm/config-default/config-lgsm/csserver/_default.cfg index c41093ddf..4191fb93b 100644 --- a/lgsm/config-default/config-lgsm/csserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/csserver/_default.cfg @@ -8,14 +8,14 @@ #### Game Server Settings #### -## Server Start Settings | https://docs.linuxgsm.com/configuration/start-parameters +## Predefined Parameters | https://docs.linuxgsm.com/configuration/start-parameters ip="0.0.0.0" port="27015" clientport="27005" defaultmap="de_dust2" maxplayers="16" -## Server Start Command | https://docs.linuxgsm.com/configuration/start-parameters#additional-parameters +## Server Parameters | https://docs.linuxgsm.com/configuration/start-parameters#additional-parameters fn_parms(){ parms="-game cstrike -strictportbind +ip ${ip} -port ${port} +clientport ${clientport} +map ${defaultmap} +servercfgfile ${servercfg} -maxplayers ${maxplayers}" } @@ -139,6 +139,10 @@ stopmode="9" querymode="2" querytype="protocol-valve" +## Console type +consoleverbose="yes" +consoleinteract="yes" + ## Game Server Details # Do not edit gamename="Counter-Strike 1.6" diff --git a/lgsm/config-default/config-lgsm/cssserver/_default.cfg b/lgsm/config-default/config-lgsm/cssserver/_default.cfg index 4e911f857..b17697cc8 100644 --- a/lgsm/config-default/config-lgsm/cssserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/cssserver/_default.cfg @@ -8,7 +8,7 @@ #### Game Server Settings #### -## Server Start Settings | https://docs.linuxgsm.com/configuration/start-parameters +## Predefined Parameters | https://docs.linuxgsm.com/configuration/start-parameters ip="0.0.0.0" port="27015" clientport="27005" @@ -21,7 +21,7 @@ maxplayers="16" # More info: https://docs.linuxgsm.com/steamcmd/gslt gslt="" -## Server Start Command | https://docs.linuxgsm.com/configuration/start-parameters#additional-parameters +## Server Parameters | https://docs.linuxgsm.com/configuration/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}" } @@ -144,6 +144,10 @@ stopmode="3" querymode="2" querytype="protocol-valve" +## Console type +consoleverbose="yes" +consoleinteract="yes" + ## Game Server Details # Do not edit gamename="Counter-Strike: Source" diff --git a/lgsm/config-default/config-lgsm/dabserver/_default.cfg b/lgsm/config-default/config-lgsm/dabserver/_default.cfg index 9074e5f78..fa7fedc6c 100644 --- a/lgsm/config-default/config-lgsm/dabserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/dabserver/_default.cfg @@ -8,7 +8,7 @@ #### Game Server Settings #### -## Server Start Settings | https://docs.linuxgsm.com/configuration/start-parameters +## Predefined Parameters | https://docs.linuxgsm.com/configuration/start-parameters ip="0.0.0.0" port="27015" clientport="27005" @@ -16,7 +16,7 @@ sourcetvport="27020" defaultmap="da_rooftops" maxplayers="10" -## Server Start Command | https://docs.linuxgsm.com/configuration/start-parameters#additional-parameters +## Server Parameters | https://docs.linuxgsm.com/configuration/start-parameters#additional-parameters fn_parms(){ parms="-strictportbind -ip ${ip} -port ${port} +clientport ${clientport} +tv_port ${sourcetvport} +map ${defaultmap} +servercfgfile ${servercfg} -maxplayers ${maxplayers}" } @@ -139,6 +139,10 @@ stopmode="3" querymode="2" querytype="protocol-valve" +## Console type +consoleverbose="yes" +consoleinteract="yes" + ## Game Server Details # Do not edit gamename="Double Action: Boogaloo" diff --git a/lgsm/config-default/config-lgsm/dmcserver/_default.cfg b/lgsm/config-default/config-lgsm/dmcserver/_default.cfg index 6e2ce40af..857bf11eb 100644 --- a/lgsm/config-default/config-lgsm/dmcserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/dmcserver/_default.cfg @@ -8,14 +8,14 @@ #### Game Server Settings #### -## Server Start Settings | https://docs.linuxgsm.com/configuration/start-parameters +## Predefined Parameters | https://docs.linuxgsm.com/configuration/start-parameters ip="0.0.0.0" port="27015" clientport="27005" defaultmap="dcdm5" maxplayers="16" -## Server Start Command | https://docs.linuxgsm.com/configuration/start-parameters#additional-parameters +## Server Parameters | https://docs.linuxgsm.com/configuration/start-parameters#additional-parameters fn_parms(){ parms="-game dmc -strictportbind +ip ${ip} -port ${port} +clientport ${clientport} +map ${defaultmap} +servercfgfile ${servercfg} -maxplayers ${maxplayers}" } @@ -139,6 +139,10 @@ stopmode="9" querymode="2" querytype="protocol-valve" +## Console type +consoleverbose="yes" +consoleinteract="yes" + ## Game Server Details # Do not edit gamename="Deathmatch Classic" diff --git a/lgsm/config-default/config-lgsm/dodserver/_default.cfg b/lgsm/config-default/config-lgsm/dodserver/_default.cfg index 499c029a5..0b2344325 100644 --- a/lgsm/config-default/config-lgsm/dodserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/dodserver/_default.cfg @@ -8,14 +8,14 @@ #### Game Server Settings #### -## Server Start Settings | https://docs.linuxgsm.com/configuration/start-parameters +## Predefined Parameters | https://docs.linuxgsm.com/configuration/start-parameters ip="0.0.0.0" port="27015" clientport="27005" defaultmap="dod_Anzio" maxplayers="16" -## Server Start Command | https://docs.linuxgsm.com/configuration/start-parameters#additional-parameters +## Server Parameters | https://docs.linuxgsm.com/configuration/start-parameters#additional-parameters fn_parms(){ parms="-game dod -strictportbind +ip ${ip} -port ${port} +clientport ${clientport} +map ${defaultmap} +servercfgfile ${servercfg} -maxplayers ${maxplayers}" } @@ -139,6 +139,10 @@ stopmode="9" querymode="2" querytype="protocol-valve" +## Console type +consoleverbose="yes" +consoleinteract="yes" + ## Game Server Details # Do not edit gamename="Day of Defeat" diff --git a/lgsm/config-default/config-lgsm/dodsserver/_default.cfg b/lgsm/config-default/config-lgsm/dodsserver/_default.cfg index 10a1e8cf3..8d87cc99f 100644 --- a/lgsm/config-default/config-lgsm/dodsserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/dodsserver/_default.cfg @@ -8,7 +8,7 @@ #### Game Server Settings #### -## Server Start Settings | https://docs.linuxgsm.com/configuration/start-parameters +## Predefined Parameters | https://docs.linuxgsm.com/configuration/start-parameters ip="0.0.0.0" port="27015" clientport="27005" @@ -16,7 +16,7 @@ sourcetvport="27020" defaultmap="dod_Anzio" maxplayers="16" -## Server Start Command | https://docs.linuxgsm.com/configuration/start-parameters#additional-parameters +## Server Parameters | https://docs.linuxgsm.com/configuration/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}" } @@ -139,6 +139,10 @@ stopmode="3" querymode="2" querytype="protocol-valve" +## Console type +consoleverbose="yes" +consoleinteract="yes" + ## Game Server Details # Do not edit gamename="Day of Defeat: Source" diff --git a/lgsm/config-default/config-lgsm/doiserver/_default.cfg b/lgsm/config-default/config-lgsm/doiserver/_default.cfg index 436221dfb..feac609b0 100644 --- a/lgsm/config-default/config-lgsm/doiserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/doiserver/_default.cfg @@ -8,7 +8,7 @@ #### Game Server Settings #### -## Server Start Settings | https://docs.linuxgsm.com/configuration/start-parameters +## Predefined Parameters | https://docs.linuxgsm.com/configuration/start-parameters ip="0.0.0.0" port="27015" clientport="27005" @@ -17,7 +17,7 @@ defaultmap="bastogne stronghold" maxplayers="32" tickrate="64" -## Server Start Command | https://docs.linuxgsm.com/configuration/start-parameters#additional-parameters +## Server Parameters | https://docs.linuxgsm.com/configuration/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} -workshop -norestart" } @@ -140,6 +140,10 @@ stopmode="3" querymode="2" querytype="protocol-valve" +## Console type +consoleverbose="yes" +consoleinteract="yes" + ## Game Server Details # Do not edit gamename="Day of Infamy" diff --git a/lgsm/config-default/config-lgsm/dstserver/_default.cfg b/lgsm/config-default/config-lgsm/dstserver/_default.cfg index 1d49c64e1..8fd61ce69 100644 --- a/lgsm/config-default/config-lgsm/dstserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/dstserver/_default.cfg @@ -8,7 +8,7 @@ #### Game Server Settings #### -## Installation Variables | https://docs.linuxgsm.com/game-servers/dont-starve-together +## Predefined Parameters | https://docs.linuxgsm.com/configuration/start-parameters sharding="false" master="true" shard="Master" @@ -19,7 +19,7 @@ cave="false" persistentstorageroot="${HOME}/.klei" confdir="DoNotStarveTogether" -## Server Start Command | https://docs.linuxgsm.com/configuration/start-parameters#additional-parameters +## Server Parameters | https://docs.linuxgsm.com/configuration/start-parameters#additional-parameters fn_parms(){ parms="-persistent_storage_root ${persistentstorageroot} -conf_dir ${confdir} -cluster ${cluster} -shard ${shard}" } @@ -142,6 +142,10 @@ stopmode="2" querymode="1" querytype="" +## Console type +consoleverbose="yes" +consoleinteract="yes" + ## Game Server Details # Do not edit gamename="Don't Starve Together" diff --git a/lgsm/config-default/config-lgsm/dysserver/_default.cfg b/lgsm/config-default/config-lgsm/dysserver/_default.cfg index bd33808b9..7f598f0dd 100644 --- a/lgsm/config-default/config-lgsm/dysserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/dysserver/_default.cfg @@ -8,7 +8,7 @@ #### Game Server Settings #### -## Server Start Settings | https://docs.linuxgsm.com/configuration/start-parameters +## Predefined Parameters | https://docs.linuxgsm.com/configuration/start-parameters ip="0.0.0.0" port="27015" clientport="27005" @@ -21,7 +21,7 @@ maxplayers="16" # More info: https://docs.linuxgsm.com/steamcmd/gslt gslt="" -## Server Start Command | https://docs.linuxgsm.com/configuration/start-parameters#additional-parameters +## Server Parameters | https://docs.linuxgsm.com/configuration/start-parameters#additional-parameters fn_parms(){ parms="-game "${serverfiles}/dystopia" -strictportbind -ip ${ip} -port ${port} +clientport ${clientport} +tv_port ${sourcetvport} +map ${defaultmap} +sv_setsteamaccount ${gslt} +servercfgfile ${servercfg} -maxplayers ${maxplayers}" } @@ -144,6 +144,10 @@ stopmode="3" querymode="2" querytype="protocol-valve" +## Console type +consoleverbose="yes" +consoleinteract="yes" + ## Game Server Details # Do not edit gamename="Dystopia" diff --git a/lgsm/config-default/config-lgsm/ecoserver/_default.cfg b/lgsm/config-default/config-lgsm/ecoserver/_default.cfg index 714731b65..de041ca44 100644 --- a/lgsm/config-default/config-lgsm/ecoserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/ecoserver/_default.cfg @@ -8,9 +8,9 @@ #### Game Server Settings #### -## Server Start Command | https://docs.linuxgsm.com/configuration/start-parameters#additional-parameters +## Server Parameters | https://docs.linuxgsm.com/configuration/start-parameters#additional-parameters fn_parms(){ - parms="-nogui" +parms="-nogui" } #### LinuxGSM Settings #### @@ -131,6 +131,10 @@ stopmode="2" querymode="1" querytype="" +## Console type +consoleverbose="" +consoleinteract="" + ## Game Server Details # Do not edit gamename="Eco" diff --git a/lgsm/config-default/config-lgsm/emserver/_default.cfg b/lgsm/config-default/config-lgsm/emserver/_default.cfg index 15ccbb9a1..d74435af7 100644 --- a/lgsm/config-default/config-lgsm/emserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/emserver/_default.cfg @@ -8,7 +8,7 @@ #### Game Server Settings #### -## Server Start Settings | https://docs.linuxgsm.com/configuration/start-parameters +## Predefined Parameters | https://docs.linuxgsm.com/configuration/start-parameters ip="0.0.0.0" port="27015" clientport="27005" @@ -21,7 +21,7 @@ maxplayers="62" # More info: https://docs.linuxgsm.com/steamcmd/gslt gslt="" -## Server Start Command | https://docs.linuxgsm.com/configuration/start-parameters#additional-parameters +## Server Parameters | https://docs.linuxgsm.com/configuration/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}" } @@ -144,6 +144,10 @@ stopmode="3" querymode="2" querytype="protocol-valve" +## Console type +consoleverbose="yes" +consoleinteract="yes" + ## Game Server Details # Do not edit gamename="Empires Mod" diff --git a/lgsm/config-default/config-lgsm/etlserver/_default.cfg b/lgsm/config-default/config-lgsm/etlserver/_default.cfg index 126eb855b..27c48d8e0 100644 --- a/lgsm/config-default/config-lgsm/etlserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/etlserver/_default.cfg @@ -8,7 +8,7 @@ #### Game Server Settings #### -## Server Start Command | https://docs.linuxgsm.com/configuration/start-parameters#additional-parameters +## Server Parameters | https://docs.linuxgsm.com/configuration/start-parameters#additional-parameters fn_parms(){ parms="+set net_strict 1 +set fs_homepath ${serverfiles} +exec ${servercfg}" } @@ -119,6 +119,10 @@ stopmode="3" querymode="2" querytype="protocol-quake3" +## Console type +consoleverbose="yes" +consoleinteract="yes" + ## Game Server Details # Do not edit gamename="ET: Legacy" diff --git a/lgsm/config-default/config-lgsm/fctrserver/_default.cfg b/lgsm/config-default/config-lgsm/fctrserver/_default.cfg index 6ba03ee02..75f8aba67 100644 --- a/lgsm/config-default/config-lgsm/fctrserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/fctrserver/_default.cfg @@ -8,7 +8,7 @@ #### Game Server Settings #### -## Server Start Settings | https://docs.linuxgsm.com/configuration/start-parameters +## Predefined Parameters | https://docs.linuxgsm.com/configuration/start-parameters ip="0.0.0.0" port="34197" rconport="34198" @@ -16,7 +16,7 @@ rconpassword="CHANGE_ME" # (stable|experimental) branch="stable" -## Server Start Command | https://docs.linuxgsm.com/configuration/start-parameters#additional-parameters +## Server Parameters | https://docs.linuxgsm.com/configuration/start-parameters#additional-parameters fn_parms(){ parms="--start-server ${serverfiles}/save1.zip --server-settings ${servercfgfullpath} --port ${port} --rcon-port ${rconport} --rcon-password ${rconpassword}" } @@ -130,6 +130,10 @@ stopmode="2" querymode="1" querytype="" +## Console type +consoleverbose="yes" +consoleinteract="yes" + ## Game Server Details # Do not edit gamename="Factorio" diff --git a/lgsm/config-default/config-lgsm/fofserver/_default.cfg b/lgsm/config-default/config-lgsm/fofserver/_default.cfg index 3438cb5d0..244272169 100644 --- a/lgsm/config-default/config-lgsm/fofserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/fofserver/_default.cfg @@ -8,7 +8,7 @@ #### Game Server Settings #### -## Server Start Settings | https://docs.linuxgsm.com/configuration/start-parameters +## Predefined Parameters | https://docs.linuxgsm.com/configuration/start-parameters ip="0.0.0.0" port="27015" clientport="27005" @@ -16,7 +16,7 @@ sourcetvport="27020" defaultmap="fof_depot" maxplayers="20" -## Server Start Command | https://docs.linuxgsm.com/configuration/start-parameters#additional-parameters +## Server Parameters | https://docs.linuxgsm.com/configuration/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}" } @@ -139,6 +139,10 @@ stopmode="3" querymode="2" querytype="protocol-valve" +## Console type +consoleverbose="yes" +consoleinteract="yes" + ## Game Server Details # Do not edit gamename="Fistful of Frags" diff --git a/lgsm/config-default/config-lgsm/gesserver/_default.cfg b/lgsm/config-default/config-lgsm/gesserver/_default.cfg index db7889630..3c61a70a7 100644 --- a/lgsm/config-default/config-lgsm/gesserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/gesserver/_default.cfg @@ -8,7 +8,7 @@ #### Game Server Settings #### -## Server Start Settings | https://docs.linuxgsm.com/configuration/start-parameters +## Predefined Parameters | https://docs.linuxgsm.com/configuration/start-parameters ip="0.0.0.0" port="27015" clientport="27005" @@ -16,7 +16,7 @@ sourcetvport="27020" defaultmap="ge_archives" maxplayers="16" -## Server Start Command | https://docs.linuxgsm.com/configuration/start-parameters#additional-parameters +## Server Parameters | https://docs.linuxgsm.com/configuration/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}" } @@ -139,6 +139,10 @@ stopmode="3" querymode="2" querytype="protocol-valve" +## Console type +consoleverbose="yes" +consoleinteract="yes" + ## Game Server Details # Do not edit gamename="GoldenEye: Source" diff --git a/lgsm/config-default/config-lgsm/gmodserver/_default.cfg b/lgsm/config-default/config-lgsm/gmodserver/_default.cfg index 3b5026350..1b38d03c8 100644 --- a/lgsm/config-default/config-lgsm/gmodserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/gmodserver/_default.cfg @@ -8,7 +8,7 @@ #### Game Server Settings #### -## Server Start Settings | https://docs.linuxgsm.com/configuration/start-parameters +## Predefined Parameters | https://docs.linuxgsm.com/configuration/start-parameters ip="0.0.0.0" port="27015" clientport="27005" @@ -32,7 +32,7 @@ customparms="-disableluarefresh" # More info: https://docs.linuxgsm.com/steamcmd/gslt gslt="" -## Server Start Command | https://docs.linuxgsm.com/configuration/start-parameters#additional-parameters +## Server Parameters | https://docs.linuxgsm.com/configuration/start-parameters#additional-parameters fn_parms(){ parms="-game garrysmod -strictportbind -ip ${ip} -port ${port} -tickrate ${tickrate} +host_workshop_collection ${wscollectionid} -authkey ${wsapikey} +clientport ${clientport} +tv_port ${sourcetvport} +gamemode ${gamemode} +map ${defaultmap} +sv_setsteamaccount ${gslt} +servercfgfile ${servercfg} -maxplayers ${maxplayers} ${customparms}" } @@ -155,6 +155,10 @@ stopmode="3" querymode="2" querytype="protocol-valve" +## Console type +consoleverbose="yes" +consoleinteract="yes" + ## Game Server Details # Do not edit gamename="Garry's Mod" diff --git a/lgsm/config-default/config-lgsm/hl2dmserver/_default.cfg b/lgsm/config-default/config-lgsm/hl2dmserver/_default.cfg index 0e60c1662..0f5af7833 100644 --- a/lgsm/config-default/config-lgsm/hl2dmserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/hl2dmserver/_default.cfg @@ -8,7 +8,7 @@ #### Game Server Settings #### -## Server Start Settings | https://docs.linuxgsm.com/configuration/start-parameters +## Predefined Parameters | https://docs.linuxgsm.com/configuration/start-parameters ip="0.0.0.0" port="27015" clientport="27005" @@ -16,7 +16,7 @@ sourcetvport="27020" defaultmap="dm_lockdown" maxplayers="16" -## Server Start Command | https://docs.linuxgsm.com/configuration/start-parameters#additional-parameters +## Server Parameters | https://docs.linuxgsm.com/configuration/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}" } @@ -139,6 +139,10 @@ stopmode="3" querymode="2" querytype="protocol-valve" +## Console type +consoleverbose="yes" +consoleinteract="yes" + ## Game Server Details # Do not edit gamename="Half Life 2: Deathmatch" diff --git a/lgsm/config-default/config-lgsm/hldmserver/_default.cfg b/lgsm/config-default/config-lgsm/hldmserver/_default.cfg index 67cf1f0c8..4824e8a91 100644 --- a/lgsm/config-default/config-lgsm/hldmserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/hldmserver/_default.cfg @@ -8,14 +8,14 @@ #### Game Server Settings #### -## Server Start Settings | https://docs.linuxgsm.com/configuration/start-parameters +## Predefined Parameters | https://docs.linuxgsm.com/configuration/start-parameters ip="0.0.0.0" port="27015" clientport="27005" defaultmap="crossfire" maxplayers="16" -## Server Start Command | https://docs.linuxgsm.com/configuration/start-parameters#additional-parameters +## Server Parameters | https://docs.linuxgsm.com/configuration/start-parameters#additional-parameters fn_parms(){ parms="-game valve -strictportbind +ip ${ip} -port ${port} +clientport ${clientport} +map ${defaultmap} +servercfgfile ${servercfg} -maxplayers ${maxplayers}" } @@ -138,6 +138,10 @@ stopmode="9" querymode="2" querytype="protocol-valve" +## Console type +consoleverbose="yes" +consoleinteract="yes" + ## Game Server Details # Do not edit gamename="Half Life: Deathmatch" diff --git a/lgsm/config-default/config-lgsm/hldmsserver/_default.cfg b/lgsm/config-default/config-lgsm/hldmsserver/_default.cfg index 6ec069c74..fdf37bfab 100644 --- a/lgsm/config-default/config-lgsm/hldmsserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/hldmsserver/_default.cfg @@ -8,7 +8,7 @@ #### Game Server Settings #### -## Server Start Settings | https://docs.linuxgsm.com/configuration/start-parameters +## Predefined Parameters | https://docs.linuxgsm.com/configuration/start-parameters ip="0.0.0.0" port="27015" clientport="27005" @@ -16,7 +16,7 @@ sourcetvport="27020" defaultmap="crossfire" maxplayers="16" -## Server Start Command | https://docs.linuxgsm.com/configuration/start-parameters#additional-parameters +## Server Parameters | https://docs.linuxgsm.com/configuration/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}" } @@ -139,6 +139,10 @@ stopmode="3" querymode="2" querytype="protocol-valve" +## Console type +consoleverbose="yes" +consoleinteract="yes" + ## Game Server Details # Do not edit gamename="Half-Life Deathmatch: Source" diff --git a/lgsm/config-default/config-lgsm/hwserver/_default.cfg b/lgsm/config-default/config-lgsm/hwserver/_default.cfg index bc832521a..29cb35f23 100644 --- a/lgsm/config-default/config-lgsm/hwserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/hwserver/_default.cfg @@ -8,17 +8,17 @@ #### Game Server Settings #### -## Server Start Settings | https://docs.linuxgsm.com/configuration/start-parameters +## Predefined Parameters | https://docs.linuxgsm.com/configuration/start-parameters servername="LinuxGSM Server" ip="0.0.0.0" port="12871" queryport="12881" maxplayers="20" -defaultmap="" #Optional -creativemode="0" #Free Build: creativemode="1" +defaultmap="" # Optional +creativemode="0" # Free Build: creativemode="1" gamelog="gamelog.txt" -## Adding admins using STEAMID64 +## Add admins using STEAMID64 # Example : addadmin 012345678901234567; addadmin 987654321098765432 admins="" @@ -26,7 +26,7 @@ admins="" # Rollback server state (remove after start command) loadsave="" -## Server Start Command | https://docs.linuxgsm.com/configuration/start-parameters#additional-parameters +## Server Parameters | https://docs.linuxgsm.com/configuration/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 \"${gamelog}\" " @@ -150,6 +150,10 @@ stopmode="2" querymode="2" querytype="protocol-valve" +## Console type +consoleverbose="no" +consoleinteract="no" + ## Game Server Details # Do not edit gamename="Hurtworld" diff --git a/lgsm/config-default/config-lgsm/insserver/_default.cfg b/lgsm/config-default/config-lgsm/insserver/_default.cfg index 78c789a4d..acef3ddee 100644 --- a/lgsm/config-default/config-lgsm/insserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/insserver/_default.cfg @@ -8,7 +8,7 @@ #### Game Server Settings #### -## Server Start Settings | https://docs.linuxgsm.com/configuration/start-parameters +## Predefined Parameters | https://docs.linuxgsm.com/configuration/start-parameters ip="0.0.0.0" port="27015" clientport="27005" @@ -22,7 +22,7 @@ tickrate="64" # More info: https://docs.linuxgsm.com/steamcmd/gslt gslt="" -## Server Start Command | https://docs.linuxgsm.com/configuration/start-parameters#additional-parameters +## Server Parameters | https://docs.linuxgsm.com/configuration/start-parameters#additional-parameters fn_parms(){ parms="-game insurgency -strictportbind -ip ${ip} -port ${port} +clientport ${clientport} +tv_port ${sourcetvport} -tickrate ${tickrate} +sv_setsteamaccount ${gslt} +map ${defaultmap} +servercfgfile ${servercfg} -maxplayers ${maxplayers} -workshop -norestart" } @@ -145,6 +145,10 @@ stopmode="3" querymode="2" querytype="protocol-valve" +## Console type +consoleverbose="yes" +consoleinteract="yes" + ## Game Server Details # Do not edit gamename="Insurgency" diff --git a/lgsm/config-default/config-lgsm/inssserver/_default.cfg b/lgsm/config-default/config-lgsm/inssserver/_default.cfg index 1201e7036..b21ed6691 100644 --- a/lgsm/config-default/config-lgsm/inssserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/inssserver/_default.cfg @@ -8,7 +8,7 @@ #### Game Server Settings #### -## Server Start Settings | https://docs.linuxgsm.com/configuration/start-parameters +## Predefined Parameters | https://docs.linuxgsm.com/configuration/start-parameters ip="0.0.0.0" port="27102" queryport="27131" @@ -18,7 +18,7 @@ defaultmap="Canyon" defaultscenario="Scenario_Crossing_Push_Security" maxplayers="28" -## Server Start Command | https://docs.linuxgsm.com/configuration/start-parameters#additional-parameters +## Server Parameters | https://docs.linuxgsm.com/configuration/start-parameters#additional-parameters fn_parms(){ # Allows serverpassword to work with parameters if [ "${serverpassword}" != "NOT SET" ]; then @@ -146,6 +146,10 @@ stopmode="2" querymode="2" querytype="protocol-valve" +## Console type +consoleverbose="yes" +consoleinteract="no" + ## Game Server Details # Do not edit gamename="Insurgency: Sandstorm" diff --git a/lgsm/config-default/config-lgsm/iosserver/_default.cfg b/lgsm/config-default/config-lgsm/iosserver/_default.cfg index 0c935b5ad..e2c135933 100644 --- a/lgsm/config-default/config-lgsm/iosserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/iosserver/_default.cfg @@ -8,7 +8,7 @@ #### Game Server Settings #### -## Server Start Settings | https://docs.linuxgsm.com/configuration/start-parameters +## Predefined Parameters | https://docs.linuxgsm.com/configuration/start-parameters ip="0.0.0.0" port="27015" clientport="27005" @@ -16,7 +16,7 @@ sourcetvport="27020" defaultmap="8v8_vienna" maxplayers="32" -## Server Start Command | https://docs.linuxgsm.com/configuration/start-parameters#additional-parameters +## Server Parameters | https://docs.linuxgsm.com/configuration/start-parameters#additional-parameters fn_parms(){ parms="-game iosoccer -strictportbind -ip ${ip} -port ${port} +clientport ${clientport} +tv_port ${sourcetvport} +map ${defaultmap} +servercfgfile ${servercfg} -maxplayers ${maxplayers}" } @@ -139,6 +139,10 @@ stopmode="3" querymode="2" querytype="protocol-valve" +## Console type +consoleverbose="yes" +consoleinteract="yes" + ## Game Server Details # Do not edit gamename="IOSoccer" diff --git a/lgsm/config-default/config-lgsm/jc2server/_default.cfg b/lgsm/config-default/config-lgsm/jc2server/_default.cfg index f593f28bc..caf009a16 100644 --- a/lgsm/config-default/config-lgsm/jc2server/_default.cfg +++ b/lgsm/config-default/config-lgsm/jc2server/_default.cfg @@ -8,7 +8,7 @@ #### Game Server Settings #### -## Server Start Command | https://docs.linuxgsm.com/configuration/start-parameters#additional-parameters +## Server Parameters | https://docs.linuxgsm.com/configuration/start-parameters#additional-parameters fn_parms(){ parms="" } @@ -131,6 +131,10 @@ stopmode="2" querymode="2" querytype="jc2mp" +## Console type +consoleverbose="yes" +consoleinteract="no" + ## Game Server Details # Do not edit gamename="Just Cause 2" diff --git a/lgsm/config-default/config-lgsm/jc3server/_default.cfg b/lgsm/config-default/config-lgsm/jc3server/_default.cfg index cdfb17e54..80f02dba3 100644 --- a/lgsm/config-default/config-lgsm/jc3server/_default.cfg +++ b/lgsm/config-default/config-lgsm/jc3server/_default.cfg @@ -8,7 +8,7 @@ #### Game Server Settings #### -## Server Start Command | https://docs.linuxgsm.com/configuration/start-parameters#additional-parameters +## Server Parameters | https://docs.linuxgsm.com/configuration/start-parameters#additional-parameters fn_parms(){ parms="" } @@ -131,6 +131,10 @@ stopmode="2" querymode="2" querytype="protocol-valve" +## Console type +consoleverbose="yes" +consoleinteract="yes" + ## Game Server Details # Do not edit gamename="Just Cause 3" diff --git a/lgsm/config-default/config-lgsm/kf2server/_default.cfg b/lgsm/config-default/config-lgsm/kf2server/_default.cfg index 2cd1e0cca..f0c546f6b 100644 --- a/lgsm/config-default/config-lgsm/kf2server/_default.cfg +++ b/lgsm/config-default/config-lgsm/kf2server/_default.cfg @@ -8,13 +8,13 @@ #### Game Server Settings #### -## Server Start Settings | https://docs.linuxgsm.com/configuration/start-parameters +## Predefined Parameters | https://docs.linuxgsm.com/configuration/start-parameters ip="0.0.0.0" queryport="27015" defaultmap="KF-BioticsLab" gamemode="KFGameContent.KFGameInfo_VersusSurvival" -## Server Start Command | https://docs.linuxgsm.com/configuration/start-parameters#additional-parameters +## Server Parameters | https://docs.linuxgsm.com/configuration/start-parameters#additional-parameters fn_parms(){ parms="\"${defaultmap}?Game=${gamemode}?ConfigSubDir=${selfname} -QueryPort=${queryport}\"" } @@ -137,6 +137,10 @@ stopmode="2" querymode="2" querytype="protocol-valve" +## Console type +consoleverbose="yes" +consoleinteract="no" + ## Game Server Details # Do not edit gamename="Killing Floor 2" diff --git a/lgsm/config-default/config-lgsm/kfserver/_default.cfg b/lgsm/config-default/config-lgsm/kfserver/_default.cfg index 1332c3ebb..38964223b 100644 --- a/lgsm/config-default/config-lgsm/kfserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/kfserver/_default.cfg @@ -12,15 +12,15 @@ steamuser="username" steampass='password' -## Server Start Settings | https://docs.linuxgsm.com/configuration/start-parameters +## Predefined Parameters | https://docs.linuxgsm.com/configuration/start-parameters ip="0.0.0.0" defaultmap="KF-BioticsLab.rom" -## Server Start Command | https://docs.linuxgsm.com/configuration/start-parameters#additional-parameters +## Server Parameters | https://docs.linuxgsm.com/configuration/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 +## Server Parameters for Objective mode #defaultmap="KFO-Steamland" #parms="server ${defaultmap}?Game=KFStoryGame.KFStoryGame?VACSecured=true -nohomedir ini=${servercfg} log=${gamelog}" } @@ -143,6 +143,10 @@ stopmode="2" querymode="2" querytype="protocol-unreal2" +## Console type +consoleverbose="yes" +consoleinteract="no" + ## Game Server Details # Do not edit gamename="Killing Floor" diff --git a/lgsm/config-default/config-lgsm/l4d2server/_default.cfg b/lgsm/config-default/config-lgsm/l4d2server/_default.cfg index e877ea0b1..2a0c0b5bb 100644 --- a/lgsm/config-default/config-lgsm/l4d2server/_default.cfg +++ b/lgsm/config-default/config-lgsm/l4d2server/_default.cfg @@ -8,14 +8,14 @@ #### Game Server Settings #### -## Server Start Settings | https://docs.linuxgsm.com/configuration/start-parameters +## Predefined Parameters | https://docs.linuxgsm.com/configuration/start-parameters ip="0.0.0.0" port="27015" clientport="27005" defaultmap="c5m1_waterfront" maxplayers="8" -## Server Start Command | https://docs.linuxgsm.com/configuration/start-parameters#additional-parameters +## Server Parameters | https://docs.linuxgsm.com/configuration/start-parameters#additional-parameters fn_parms(){ parms="-game left4dead2 -strictportbind -ip ${ip} -port ${port} +clientport ${clientport} +map ${defaultmap} +servercfgfile ${servercfg} -maxplayers ${maxplayers}" } @@ -138,6 +138,10 @@ stopmode="3" querymode="2" querytype="protocol-valve" +## Console type +consoleverbose="yes" +consoleinteract="yes" + ## Game Server Details # Do not edit gamename="Left 4 Dead 2" diff --git a/lgsm/config-default/config-lgsm/l4dserver/_default.cfg b/lgsm/config-default/config-lgsm/l4dserver/_default.cfg index 1b8cd88ba..e31e6f7f1 100644 --- a/lgsm/config-default/config-lgsm/l4dserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/l4dserver/_default.cfg @@ -8,14 +8,14 @@ #### Game Server Settings #### -## Server Start Settings | https://docs.linuxgsm.com/configuration/start-parameters +## Predefined Parameters | https://docs.linuxgsm.com/configuration/start-parameters ip="0.0.0.0" port="27015" clientport="27005" defaultmap="l4d_hospital01_apartment" maxplayers="8" -## Server Start Command | https://docs.linuxgsm.com/configuration/start-parameters#additional-parameters +## Server Parameters | https://docs.linuxgsm.com/configuration/start-parameters#additional-parameters fn_parms(){ parms="-game left4dead -strictportbind -ip ${ip} -port ${port} +clientport ${clientport} +map ${defaultmap} -maxplayers ${maxplayers}" } @@ -138,6 +138,10 @@ stopmode="2" querymode="2" querytype="protocol-valve" +## Console type +consoleverbose="yes" +consoleinteract="yes" + ## Game Server Details # Do not edit gamename="Left 4 Dead" diff --git a/lgsm/config-default/config-lgsm/mcbserver/_default.cfg b/lgsm/config-default/config-lgsm/mcbserver/_default.cfg index df50e3af1..bbbea20ea 100644 --- a/lgsm/config-default/config-lgsm/mcbserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/mcbserver/_default.cfg @@ -8,7 +8,7 @@ #### Game Server Settings #### -## Server Start Command | https://docs.linuxgsm.com/configuration/start-parameters#additional-parameters +## Server Parameters | https://docs.linuxgsm.com/configuration/start-parameters#additional-parameters fn_parms(){ parms="" } @@ -122,6 +122,10 @@ stopmode="5" querymode="4" querytype="minecraftbe" +## Console type +consoleverbose="yes" +consoleinteract="yes" + ## Game Server Details # Do not edit gamename="Minecraft Bedrock" diff --git a/lgsm/config-default/config-lgsm/mcserver/_default.cfg b/lgsm/config-default/config-lgsm/mcserver/_default.cfg index 788bbab2b..094ef98bc 100644 --- a/lgsm/config-default/config-lgsm/mcserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/mcserver/_default.cfg @@ -8,10 +8,10 @@ #### Game Server Settings #### -## Server Start Settings | https://docs.linuxgsm.com/configuration/start-parameters +## Predefined Parameters | https://docs.linuxgsm.com/configuration/start-parameters javaram="1024" # -Xmx$1024M -## Server Start Command | https://docs.linuxgsm.com/configuration/start-parameters#additional-parameters +## Server Parameters | https://docs.linuxgsm.com/configuration/start-parameters#additional-parameters fn_parms(){ parms="nogui" } @@ -128,6 +128,10 @@ stopmode="5" querymode="2" querytype="minecraft" +## Console type +consoleverbose="yes" +consoleinteract="yes" + ## Game Server Details # Do not edit gamename="Minecraft" diff --git a/lgsm/config-default/config-lgsm/mhserver/_default.cfg b/lgsm/config-default/config-lgsm/mhserver/_default.cfg index 9791aee22..7c8163bed 100644 --- a/lgsm/config-default/config-lgsm/mhserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/mhserver/_default.cfg @@ -8,7 +8,7 @@ #### Game Server Settings #### -## Server Start Settings | https://docs.linuxgsm.com/configuration/start-parameters +## Predefined Parameters | https://docs.linuxgsm.com/configuration/start-parameters ip="0.0.0.0" port="7777" beaconport="15000" @@ -16,7 +16,7 @@ queryport="27015" # Maps: FFA_Camp, FFA_Contraband, FFA_Grad, FFA_MountainPeak, FFA_Taiga, FFA_ThePit, FFA_Tourney, SKM_Camp, SKM_Contraband, SKM_Grad, SKM_MountainPeak, SKM_Taiga, SKM_ThePit, SKM_Tourney, TDM_Camp, TDM_Contraband, TDM_Grad, TDM_MountainPeak, TDM_Taiga, TDM_ThePit, TDM_Tourney defaultmap="FFA_ThePit" -## Server Start Command | https://docs.linuxgsm.com/configuration/start-parameters#additional-parameters +## Server Parameters | https://docs.linuxgsm.com/configuration/start-parameters#additional-parameters fn_parms(){ parms="Mordhau ${defaultmap} -log -MultiHome=${ip} -Port=${port} -BeaconPort=${beaconport} -QueryPort=${queryport}" } @@ -139,6 +139,10 @@ stopmode="2" querymode="2" querytype="protocol-valve" +## Console type +consoleverbose="yes" +consoleinteract="no" + ## Game Server Details # Do not edit gamename="MORDHAU" diff --git a/lgsm/config-default/config-lgsm/mohaaserver/_default.cfg b/lgsm/config-default/config-lgsm/mohaaserver/_default.cfg index 010b97ab2..b625221fe 100644 --- a/lgsm/config-default/config-lgsm/mohaaserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/mohaaserver/_default.cfg @@ -8,12 +8,12 @@ #### Game Server Settings #### -## Server Start Settings | https://docs.linuxgsm.com/configuration/start-parameters +## Predefined Parameters | https://docs.linuxgsm.com/configuration/start-parameters ip="0.0.0.0" port="12203" defaultmap="dm/mohdm1" -## Server Start Command | https://docs.linuxgsm.com/configuration/start-parameters#additional-parameters +## Server Parameters | https://docs.linuxgsm.com/configuration/start-parameters#additional-parameters fn_parms(){ parms="+set sv_punkbuster 0 +set fs_basepath ${serverfiles} +set fs_outputpath ${gamelogdir} +set dedicated 2 +set net_ip ${ip} +set net_port ${port} +exec ${servercfg} +map ${defaultmap}" } @@ -124,6 +124,10 @@ stopmode="3" querymode="2" querytype="protocol-quake3" +## Console type +consoleverbose="yes" +consoleinteract="no" + ## Game Server Details # Do not edit gamename="Medal of Honor: Allied Assault" diff --git a/lgsm/config-default/config-lgsm/momserver/_default.cfg b/lgsm/config-default/config-lgsm/momserver/_default.cfg index 02565f473..059f9a257 100644 --- a/lgsm/config-default/config-lgsm/momserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/momserver/_default.cfg @@ -8,13 +8,13 @@ #### Game Server Settings #### -## Server Start Settings | https://docs.linuxgsm.com/configuration/start-parameters +## Predefined Parameters | https://docs.linuxgsm.com/configuration/start-parameters ip="0.0.0.0" port="7777" beaconport="15000" maxplayers="32" -## Server Start Command | https://docs.linuxgsm.com/configuration/start-parameters#additional-parameters +## Server Parameters | https://docs.linuxgsm.com/configuration/start-parameters#additional-parameters fn_parms(){ parms="-port="${port}" -beaconport="${beaconport}" -MULTIHOME="${ip}" -maxplayers=${maxplayers}" } diff --git a/lgsm/config-default/config-lgsm/mtaserver/_default.cfg b/lgsm/config-default/config-lgsm/mtaserver/_default.cfg index 28887e4d3..9c25257a5 100644 --- a/lgsm/config-default/config-lgsm/mtaserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/mtaserver/_default.cfg @@ -8,10 +8,10 @@ #### Game Server Settings #### -## Server Start Settings | https://docs.linuxgsm.com/configuration/start-parameters +## Predefined Parameters | https://docs.linuxgsm.com/configuration/start-parameters ip="0.0.0.0" -## Server Start Command | https://docs.linuxgsm.com/configuration/start-parameters#additional-parameters +## Server Parameters | https://docs.linuxgsm.com/configuration/start-parameters#additional-parameters # Edit with care fn_parms(){ parms="" @@ -123,6 +123,10 @@ stopmode="4" querymode="3" querytype="protocol-ase" +## Console type +consoleverbose="yes" +consoleinteract="yes" + ## Game Server Details # Do not edit gamename="Multi Theft Auto" diff --git a/lgsm/config-default/config-lgsm/mumbleserver/_default.cfg b/lgsm/config-default/config-lgsm/mumbleserver/_default.cfg index 341177009..4c581f6a6 100644 --- a/lgsm/config-default/config-lgsm/mumbleserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/mumbleserver/_default.cfg @@ -7,9 +7,8 @@ # [instance].cfg - applies settings to a specific instance. #### Game Server Settings #### -# Use .ini config file for Mumble (Murmur) server. -## Server Start Command | https://docs.linuxgsm.com/configuration/start-parameters#additional-parameters +## Server Parameters | https://docs.linuxgsm.com/configuration/start-parameters#additional-parameters fn_parms(){ parms="-fg -ini ${servercfgfullpath}" } @@ -123,6 +122,10 @@ stopmode="2" querymode="2" querytype="mumbleping" +## Console type +consoleverbose="yes" +consoleinteract="no" + ## Game Server Details # Do not edit gamename="Mumble" diff --git a/lgsm/config-default/config-lgsm/ndserver/_default.cfg b/lgsm/config-default/config-lgsm/ndserver/_default.cfg index df0201849..2e5054c6a 100644 --- a/lgsm/config-default/config-lgsm/ndserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/ndserver/_default.cfg @@ -8,7 +8,7 @@ #### Game Server Settings #### -## Server Start Settings | https://docs.linuxgsm.com/configuration/start-parameters +## Predefined Parameters | https://docs.linuxgsm.com/configuration/start-parameters ip="0.0.0.0" port="27015" clientport="27005" @@ -16,7 +16,7 @@ sourcetvport="27020" defaultmap="hydro" maxplayers="32" -## Server Start Command | https://docs.linuxgsm.com/configuration/start-parameters#additional-parameters +## Server Parameters | https://docs.linuxgsm.com/configuration/start-parameters#additional-parameters fn_parms(){ parms="-game nucleardawn -strictportbind -ip ${ip} -port ${port} +clientport ${clientport} +tv_port ${sourcetvport} +map ${defaultmap} +servercfgfile ${servercfg} -maxplayers ${maxplayers}" } @@ -139,6 +139,10 @@ stopmode="3" querymode="2" querytype="protocol-valve" +## Console type +consoleverbose="yes" +consoleinteract="yes" + ## Game Server Details # Do not edit gamename="Nuclear Dawn" diff --git a/lgsm/config-default/config-lgsm/nmrihserver/_default.cfg b/lgsm/config-default/config-lgsm/nmrihserver/_default.cfg index 160c4d58f..181d0517a 100644 --- a/lgsm/config-default/config-lgsm/nmrihserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/nmrihserver/_default.cfg @@ -8,7 +8,7 @@ #### Game Server Settings #### -## Server Start Settings | https://docs.linuxgsm.com/configuration/start-parameters +## Predefined Parameters | https://docs.linuxgsm.com/configuration/start-parameters ip="0.0.0.0" port="27015" clientport="27005" @@ -21,7 +21,7 @@ maxplayers="8" # More info: https://docs.linuxgsm.com/steamcmd/gslt gslt="" -## Server Start Command | https://docs.linuxgsm.com/configuration/start-parameters#additional-parameters +## Server Parameters | https://docs.linuxgsm.com/configuration/start-parameters#additional-parameters fn_parms(){ parms="-game nmrih -strictportbind -ip ${ip} -port ${port} +clientport ${clientport} +tv_port ${sourcetvport} +map ${defaultmap} +sv_setsteamaccount ${gslt} +servercfgfile ${servercfg} -maxplayers ${maxplayers}" } @@ -144,6 +144,10 @@ stopmode="3" querymode="2" querytype="protocol-valve" +## Console type +consoleverbose="yes" +consoleinteract="yes" + ## Game Server Details # Do not edit gamename="No More Room in Hell" diff --git a/lgsm/config-default/config-lgsm/ns2cserver/_default.cfg b/lgsm/config-default/config-lgsm/ns2cserver/_default.cfg index a778aded5..74b00b848 100644 --- a/lgsm/config-default/config-lgsm/ns2cserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/ns2cserver/_default.cfg @@ -8,7 +8,7 @@ #### Game Server Settings #### -## Server Start Settings | https://docs.linuxgsm.com/configuration/start-parameters +## Predefined Parameters | https://docs.linuxgsm.com/configuration/start-parameters ip="0.0.0.0" port="27015" defaultmap="co_core" @@ -23,7 +23,7 @@ serverpassword="" # that the password variable above is not left empty. # -password \"${serverpassword}\" -## Server Start Command | https://docs.linuxgsm.com/configuration/start-parameters#additional-parameters +## Server Parameters | https://docs.linuxgsm.com/configuration/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}\"" } @@ -146,6 +146,10 @@ stopmode="6" querymode="2" querytype="protocol-valve" +## Console type +consoleverbose="yes" +consoleinteract="no" + ## Game Server Details # Do not edit gamename="NS2: Combat" diff --git a/lgsm/config-default/config-lgsm/ns2server/_default.cfg b/lgsm/config-default/config-lgsm/ns2server/_default.cfg index d4340a0fa..2b5f3c1dd 100644 --- a/lgsm/config-default/config-lgsm/ns2server/_default.cfg +++ b/lgsm/config-default/config-lgsm/ns2server/_default.cfg @@ -12,7 +12,7 @@ steamuser="username" steampass='password' -## Server Start Settings | https://docs.linuxgsm.com/configuration/start-parameters +## Predefined Parameters | https://docs.linuxgsm.com/configuration/start-parameters ip="0.0.0.0" port="27015" defaultmap="ns2_summit" @@ -27,7 +27,7 @@ serverpassword="" # that the password variable above is not left empty. # -password \"${serverpassword}\" -## Server Start Command | https://docs.linuxgsm.com/configuration/start-parameters#additional-parameters +## Server Parameters | https://docs.linuxgsm.com/configuration/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}\"" } @@ -150,6 +150,10 @@ stopmode="6" querymode="2" querytype="protocol-valve" +## Console type +consoleverbose="yes" +consoleinteract="no" + ## Game Server Details # Do not edit gamename="Natural Selection 2" diff --git a/lgsm/config-default/config-lgsm/nsserver/_default.cfg b/lgsm/config-default/config-lgsm/nsserver/_default.cfg index a53da058d..34ff1af69 100644 --- a/lgsm/config-default/config-lgsm/nsserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/nsserver/_default.cfg @@ -8,14 +8,14 @@ #### Game Server Settings #### -## Server Start Settings | https://docs.linuxgsm.com/configuration/start-parameters +## Predefined Parameters | https://docs.linuxgsm.com/configuration/start-parameters ip="0.0.0.0" port="27015" clientport="27005" defaultmap="ns_hera" maxplayers="16" -## Server Start Command | https://docs.linuxgsm.com/configuration/start-parameters#additional-parameters +## Server Parameters | https://docs.linuxgsm.com/configuration/start-parameters#additional-parameters fn_parms(){ parms="-game ns -strictportbind +ip ${ip} -port ${port} +clientport ${clientport} +map ${defaultmap} +servercfgfile ${servercfg} -maxplayers ${maxplayers}" } @@ -139,6 +139,10 @@ stopmode="9" querymode="2" querytype="protocol-valve" +## Console type +consoleverbose="yes" +consoleinteract="yes" + ## Game Server Details # Do not edit gamename="Natural Selection" diff --git a/lgsm/config-default/config-lgsm/onsetserver/_default.cfg b/lgsm/config-default/config-lgsm/onsetserver/_default.cfg index 247bf3fbe..bccd2bc4d 100644 --- a/lgsm/config-default/config-lgsm/onsetserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/onsetserver/_default.cfg @@ -8,7 +8,7 @@ #### Game Server Settings #### -## Server Start Command | https://docs.linuxgsm.com/configuration/start-parameters#additional-parameters +## Server Parameters | https://docs.linuxgsm.com/configuration/start-parameters#additional-parameters fn_parms(){ parms="--config ${servercfgfullpath}" } @@ -131,6 +131,10 @@ stopmode="2" querymode="1" querytype="" +## Console type +consoleverbose="yes" +consoleinteract="no" + ## Game Server Details # Do not edit gamename="Onset" diff --git a/lgsm/config-default/config-lgsm/opforserver/_default.cfg b/lgsm/config-default/config-lgsm/opforserver/_default.cfg index 45a7347ab..dbcaf4361 100644 --- a/lgsm/config-default/config-lgsm/opforserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/opforserver/_default.cfg @@ -8,14 +8,14 @@ #### Game Server Settings #### -## Server Start Settings | https://docs.linuxgsm.com/configuration/start-parameters +## Predefined Parameters | https://docs.linuxgsm.com/configuration/start-parameters ip="0.0.0.0" port="27015" clientport="27005" defaultmap="op4_bootcamp" maxplayers="16" -## Server Start Command | https://docs.linuxgsm.com/configuration/start-parameters#additional-parameters +## Server Parameters | https://docs.linuxgsm.com/configuration/start-parameters#additional-parameters fn_parms(){ parms="-game gearbox -strictportbind +ip ${ip} -port ${port} +clientport ${clientport} +map ${defaultmap} +servercfgfile ${servercfg} -maxplayers ${maxplayers}" } @@ -139,6 +139,10 @@ stopmode="9" querymode="2" querytype="protocol-valve" +## Console type +consoleverbose="yes" +consoleinteract="yes" + ## Game Server Details # Do not edit gamename="Half-Life: Opposing Force" diff --git a/lgsm/config-default/config-lgsm/pcserver/_default.cfg b/lgsm/config-default/config-lgsm/pcserver/_default.cfg index 6496cf1be..3febc720f 100644 --- a/lgsm/config-default/config-lgsm/pcserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/pcserver/_default.cfg @@ -8,7 +8,7 @@ #### Game Server Settings #### -## Server Start Command | https://docs.linuxgsm.com/configuration/start-parameters#additional-parameters +## Server Parameters | https://docs.linuxgsm.com/configuration/start-parameters#additional-parameters fn_parms(){ parms="--config ${servercfg}" } @@ -131,6 +131,10 @@ stopmode="2" querymode="2" querytype="protocol-valve" +## Console type +consoleverbose="yes" +consoleinteract="no" + ## Game Server Details # Do not edit gamename="Project Cars" diff --git a/lgsm/config-default/config-lgsm/pstbsserver/_default.cfg b/lgsm/config-default/config-lgsm/pstbsserver/_default.cfg index d8dc2888d..45e57a515 100644 --- a/lgsm/config-default/config-lgsm/pstbsserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/pstbsserver/_default.cfg @@ -8,7 +8,7 @@ #### Game Server Settings #### -## Server Start Settings | https://docs.linuxgsm.com/configuration/start-parameters +## Predefined Parameters | https://docs.linuxgsm.com/configuration/start-parameters ip="0.0.0.0" port="10027" queryport="10037" @@ -18,7 +18,7 @@ randommap="NONE" maxplayers="40" reservedslots="0" -## Server Start Command | https://docs.linuxgsm.com/configuration/start-parameters#additional-parameters +## Server Parameters | https://docs.linuxgsm.com/configuration/start-parameters#additional-parameters fn_parms(){ parms="MULTIHOME=${ip} RANDOM=${randommap} Port=${port} QueryPort=${queryport} RCONPORT=${rconport} FIXEDMAXPLAYERS=${maxplayers} NumReservedSlots=${reservedslots}" } @@ -141,6 +141,10 @@ stopmode="2" querymode="2" querytype="protocol-valve" +## Console type +consoleverbose="yes" +consoleinteract="no" + ## Game Server Details # Do not edit gamename="pstbsserver" diff --git a/lgsm/config-default/config-lgsm/pvkiiserver/_default.cfg b/lgsm/config-default/config-lgsm/pvkiiserver/_default.cfg index 3294b2043..76ab134e5 100644 --- a/lgsm/config-default/config-lgsm/pvkiiserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/pvkiiserver/_default.cfg @@ -8,7 +8,7 @@ #### Game Server Settings #### -## Server Start Settings | https://docs.linuxgsm.com/configuration/start-parameters +## Predefined Parameters | https://docs.linuxgsm.com/configuration/start-parameters ip="0.0.0.0" port="27015" clientport="27005" @@ -16,7 +16,7 @@ sourcetvport="27020" defaultmap="bt_island" maxplayers="24" -## Server Start Command | https://docs.linuxgsm.com/configuration/start-parameters#additional-parameters +## Server Parameters | https://docs.linuxgsm.com/configuration/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}" } @@ -139,6 +139,10 @@ stopmode="3" querymode="2" querytype="protocol-valve" +## Console type +consoleverbose="yes" +consoleinteract="yes" + ## Game Server Details # Do not edit gamename="Pirates, Vikings, and Knights II" diff --git a/lgsm/config-default/config-lgsm/pzserver/_default.cfg b/lgsm/config-default/config-lgsm/pzserver/_default.cfg index a823e14d1..36fe3df0b 100644 --- a/lgsm/config-default/config-lgsm/pzserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/pzserver/_default.cfg @@ -8,11 +8,11 @@ #### Game Server Settings #### -## Server Start Settings | https://docs.linuxgsm.com/configuration/start-parameters +## Predefined Parameters | https://docs.linuxgsm.com/configuration/start-parameters ip="0.0.0.0" adminpassword="CHANGE_ME" -## Server Start Command | https://docs.linuxgsm.com/configuration/start-parameters#additional-parameters +## Server Parameters | https://docs.linuxgsm.com/configuration/start-parameters#additional-parameters fn_parms(){ parms="-ip ${ip} -adminpassword \"${adminpassword}\" -servername ${selfname}" } @@ -135,6 +135,10 @@ stopmode="3" querymode="2" querytype="protocol-valve" +## Console type +consoleverbose="yes" +consoleinteract="yes" + ## Game Server Details # Do not edit gamename="Project Zomboid" diff --git a/lgsm/config-default/config-lgsm/q2server/_default.cfg b/lgsm/config-default/config-lgsm/q2server/_default.cfg index 0d28d1155..a653278c0 100644 --- a/lgsm/config-default/config-lgsm/q2server/_default.cfg +++ b/lgsm/config-default/config-lgsm/q2server/_default.cfg @@ -8,12 +8,12 @@ #### Game Server Settings #### -## Server Start Settings | https://docs.linuxgsm.com/configuration/start-parameters +## Predefined Parameters | https://docs.linuxgsm.com/configuration/start-parameters ip="0.0.0.0" port="27910" defaultmap="q2dm1" -## Server Start Command | https://docs.linuxgsm.com/configuration/start-parameters#additional-parameters +## Server Parameters | https://docs.linuxgsm.com/configuration/start-parameters#additional-parameters fn_parms(){ parms="+set dedicated 1 +set ip ${ip} +set port ${port} +exec ${servercfg} +set deathmatch 1 +map ${defaultmap}" } @@ -124,6 +124,10 @@ stopmode="3" querymode="2" querytype="protocol-quake2" +## Console type +consoleverbose="yes" +consoleinteract="yes" + ## Game Server Details # Do not edit gamename="Quake 2" diff --git a/lgsm/config-default/config-lgsm/q3server/_default.cfg b/lgsm/config-default/config-lgsm/q3server/_default.cfg index 115a093aa..33b0e1c84 100644 --- a/lgsm/config-default/config-lgsm/q3server/_default.cfg +++ b/lgsm/config-default/config-lgsm/q3server/_default.cfg @@ -8,12 +8,12 @@ #### Game Server Settings #### -## Server Start Settings | https://docs.linuxgsm.com/configuration/start-parameters +## Predefined Parameters | https://docs.linuxgsm.com/configuration/start-parameters ip="0.0.0.0" port="27960" defaultmap="q3dm17" -## Server Start Command | https://docs.linuxgsm.com/configuration/start-parameters#additional-parameters +## Server Parameters | https://docs.linuxgsm.com/configuration/start-parameters#additional-parameters fn_parms(){ parms="+set sv_punkbuster 0 +set fs_basepath ${serverfiles} +set dedicated 2 +set com_hunkMegs 32 +set net_ip ${ip} +set net_port ${port} +exec ${servercfg} +map ${defaultmap}" } @@ -124,6 +124,10 @@ stopmode="3" querymode="2" querytype="protocol-quake3" +## Console type +consoleverbose="yes" +consoleinteract="yes" + ## Game Server Details # Do not edit gamename="Quake 3: Arena" diff --git a/lgsm/config-default/config-lgsm/qlserver/_default.cfg b/lgsm/config-default/config-lgsm/qlserver/_default.cfg index ffe409802..49b8c1e0e 100644 --- a/lgsm/config-default/config-lgsm/qlserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/qlserver/_default.cfg @@ -8,9 +8,7 @@ #### Game Server Settings #### -## Server Start Command | https://docs.linuxgsm.com/configuration/start-parameters#additional-parameters -# Edit with care | Install/Config Guide : https://steamcommunity.com/sharedfiles/filedetails/?id=542966946 -# Console Commands : http://www.regurge.at/ql +## Server Parameters | https://docs.linuxgsm.com/configuration/start-parameters#additional-parameters fn_parms(){ parms="+exec ${servercfg}" } @@ -133,6 +131,10 @@ stopmode="3" querymode="2" querytype="protocol-valve" +## Console type +consoleverbose="yes" +consoleinteract="yes" + ## Game Server Details # Do not edit gamename="Quake Live" diff --git a/lgsm/config-default/config-lgsm/qwserver/_default.cfg b/lgsm/config-default/config-lgsm/qwserver/_default.cfg index db81ef4d4..f040b1aa5 100644 --- a/lgsm/config-default/config-lgsm/qwserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/qwserver/_default.cfg @@ -8,11 +8,11 @@ #### Game Server Settings #### -## Server Start Settings | https://docs.linuxgsm.com/configuration/start-parameters +## Predefined Parameters | https://docs.linuxgsm.com/configuration/start-parameters ip="0.0.0.0" port="27500" -## Server Start Command | https://docs.linuxgsm.com/configuration/start-parameters#additional-parameters +## Server Parameters | https://docs.linuxgsm.com/configuration/start-parameters#additional-parameters fn_parms(){ parms="-port ${port} -game ktx +exec ${servercfg}" } @@ -123,6 +123,10 @@ stopmode="3" querymode="2" querytype="protocol-quake1" +## Console type +consoleverbose="yes" +consoleinteract="yes" + ## Game Server Details # Do not edit gamename="QuakeWorld" diff --git a/lgsm/config-default/config-lgsm/ricochetserver/_default.cfg b/lgsm/config-default/config-lgsm/ricochetserver/_default.cfg index 8ab59f487..99da25df5 100644 --- a/lgsm/config-default/config-lgsm/ricochetserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/ricochetserver/_default.cfg @@ -8,14 +8,14 @@ #### Game Server Settings #### -## Server Start Settings | https://docs.linuxgsm.com/configuration/start-parameters +## Predefined Parameters | https://docs.linuxgsm.com/configuration/start-parameters ip="0.0.0.0" port="27015" clientport="27005" defaultmap="rc_arena" maxplayers="16" -## Server Start Command | https://docs.linuxgsm.com/configuration/start-parameters#additional-parameters +## Server Parameters | https://docs.linuxgsm.com/configuration/start-parameters#additional-parameters fn_parms(){ parms="-game ricochet -strictportbind +ip ${ip} -port ${port} +clientport ${clientport} +map ${defaultmap} +servercfgfile ${servercfg} -maxplayers ${maxplayers}" } @@ -139,6 +139,10 @@ stopmode="9" querymode="2" querytype="protocol-valve" +## Console type +consoleverbose="yes" +consoleinteract="yes" + ## Game Server Details # Do not edit gamename="Ricochet" diff --git a/lgsm/config-default/config-lgsm/roserver/_default.cfg b/lgsm/config-default/config-lgsm/roserver/_default.cfg index c87fcb7a7..03d819bcd 100644 --- a/lgsm/config-default/config-lgsm/roserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/roserver/_default.cfg @@ -12,11 +12,11 @@ steamuser="username" steampass='password' -## Server Start Settings | https://docs.linuxgsm.com/configuration/start-parameters +## Predefined Parameters | https://docs.linuxgsm.com/configuration/start-parameters ip="0.0.0.0" defaultmap="RO-Arad.rom" -## Server Start Command | https://docs.linuxgsm.com/configuration/start-parameters#additional-parameters +## Server Parameters | https://docs.linuxgsm.com/configuration/start-parameters#additional-parameters fn_parms(){ parms="server ${defaultmap}?game=ROGame.ROTeamGame?VACSecured=true -nohomedir ini=${servercfg} log=${gamelog}" } @@ -139,6 +139,10 @@ stopmode="2" querymode="2" querytype="protocol-unreal2" +## Console type +consoleverbose="yes" +consoleinteract="no" + ## Game Server Details # Do not edit gamename="Red Orchestra: Ostfront 41-45" diff --git a/lgsm/config-default/config-lgsm/rtcwserver/_default.cfg b/lgsm/config-default/config-lgsm/rtcwserver/_default.cfg index c73ae99cb..06133d695 100644 --- a/lgsm/config-default/config-lgsm/rtcwserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/rtcwserver/_default.cfg @@ -8,12 +8,12 @@ #### Game Server Settings #### -## Server Start Settings | https://docs.linuxgsm.com/configuration/start-parameters +## Predefined Parameters | https://docs.linuxgsm.com/configuration/start-parameters ip="0.0.0.0" port="27960" defaultmap="mp_beach" -## Server Start Command | https://docs.linuxgsm.com/configuration/start-parameters#additional-parameters +## Server Parameters | https://docs.linuxgsm.com/configuration/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} +exec ${servercfg} +map ${defaultmap}" } @@ -124,6 +124,10 @@ stopmode="3" querymode="2" querytype="protocol-quake3" +## Console type +consoleverbose="yes" +consoleinteract="no" + ## Game Server Details # Do not edit gamename="Return to Castle Wolfenstein" diff --git a/lgsm/config-default/config-lgsm/rustserver/_default.cfg b/lgsm/config-default/config-lgsm/rustserver/_default.cfg index 280b03033..6e7ca328d 100644 --- a/lgsm/config-default/config-lgsm/rustserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/rustserver/_default.cfg @@ -8,7 +8,7 @@ #### Game Server Settings #### -## Server Start Settings | https://docs.linuxgsm.com/configuration/start-parameters +## Predefined Parameters | https://docs.linuxgsm.com/configuration/start-parameters ip="0.0.0.0" port="28015" rconport="28016" @@ -23,7 +23,7 @@ worldsize="3000" # default: 3000, range: 1000-6000, map size in meters. saveinterval="300" # Auto-save in seconds. tickrate="30" # default: 30, range: 15-100. -## Server Start Command | https://docs.linuxgsm.com/configuration/start-parameters#additional-parameters +## Server Parameters | https://docs.linuxgsm.com/configuration/start-parameters#additional-parameters fn_parms(){ parms="-batchmode +app.listenip ${ip} +app.port ${appport} +server.ip ${ip} +server.port ${port} +server.tickrate ${tickrate} +server.hostname \"${servername}\" +server.identity \"${selfname}\" +server.seed ${seed} +server.salt ${salt} +server.maxplayers ${maxplayers} +server.worldsize ${worldsize} +server.saveinterval ${saveinterval} +rcon.web ${rconweb} +rcon.ip ${ip} +rcon.port ${rconport} +rcon.password \"${rconpassword}\" -logfile" } @@ -146,6 +146,10 @@ stopmode="2" querymode="2" querytype="protocol-valve" +## Console type +consoleverbose="yes" +consoleinteract="no" + ## Game Server Details # Do not edit gamename="Rust" diff --git a/lgsm/config-default/config-lgsm/rwserver/_default.cfg b/lgsm/config-default/config-lgsm/rwserver/_default.cfg index e771ca8e2..041dc0107 100644 --- a/lgsm/config-default/config-lgsm/rwserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/rwserver/_default.cfg @@ -8,10 +8,10 @@ #### Game Server Settings #### -## Server Start Settings | https://docs.linuxgsm.com/configuration/start-parameters +## Predefined Parameters | https://docs.linuxgsm.com/configuration/start-parameters javaram="2048" # -Xmx$2048M -## Server Start Command | https://docs.linuxgsm.com/configuration/start-parameters#additional-parameters +## Server Parameters | https://docs.linuxgsm.com/configuration/start-parameters#additional-parameters fn_parms(){ parms="" } @@ -134,6 +134,10 @@ stopmode="3" querymode="1" querytype="" +## Console type +consoleverbose="yes" +consoleinteract="no" + ## Game Server Details # Do not edit gamename="Rising World" diff --git a/lgsm/config-default/config-lgsm/sampserver/_default.cfg b/lgsm/config-default/config-lgsm/sampserver/_default.cfg index 7d3c5bde9..a669e8882 100644 --- a/lgsm/config-default/config-lgsm/sampserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/sampserver/_default.cfg @@ -8,11 +8,11 @@ #### Game Server Settings #### -## Server Start Settings | https://docs.linuxgsm.com/configuration/start-parameters +## Predefined Parameters | https://docs.linuxgsm.com/configuration/start-parameters ip="0.0.0.0" port="7777" -## Server Start Command | https://docs.linuxgsm.com/configuration/start-parameters#additional-parameters +## Server Parameters | https://docs.linuxgsm.com/configuration/start-parameters#additional-parameters fn_parms(){ parms="" } @@ -123,6 +123,10 @@ stopmode="2" querymode="3" querytype="samp" +## Console type +consoleverbose="" +consoleinteract="" + ## Game Server Details # Do not edit gamename="San Andreas Multiplayer" diff --git a/lgsm/config-default/config-lgsm/sbotsserver/_default.cfg b/lgsm/config-default/config-lgsm/sbotsserver/_default.cfg index 095f54417..ae1d16c4b 100644 --- a/lgsm/config-default/config-lgsm/sbotsserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/sbotsserver/_default.cfg @@ -8,7 +8,7 @@ #### Game Server Settings #### -## Server Start Settings | https://docs.linuxgsm.com/configuration/start-parameters +## Predefined Parameters | https://docs.linuxgsm.com/configuration/start-parameters port="7777" queryport="27015" defaultmap="StationKappa" @@ -16,7 +16,7 @@ servername="LinuxGSM Server" serverpassword="NOT SET" # Can't be adjusted currently maxplayers="8" # Can't be adjusted currently -## Server Start Command | https://docs.linuxgsm.com/configuration/start-parameters#additional-parameters +## Server Parameters | https://docs.linuxgsm.com/configuration/start-parameters#additional-parameters fn_parms(){ parms="Port=${port}?QueryPort=${queryport} -startup_map ${defaultmap} -server_name \"${servername}\"" } @@ -139,6 +139,10 @@ stopmode="2" querymode="2" querytype="protocol-valve" +## Console type +consoleverbose="yes" +consoleinteract="no" + ## Game Server Details # Do not edit gamename="StickyBots" diff --git a/lgsm/config-default/config-lgsm/sbserver/_default.cfg b/lgsm/config-default/config-lgsm/sbserver/_default.cfg index 2476ddf0f..14bb93600 100644 --- a/lgsm/config-default/config-lgsm/sbserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/sbserver/_default.cfg @@ -12,10 +12,10 @@ steamuser="username" steampass='password' -## Server Start Settings | https://docs.linuxgsm.com/configuration/start-parameters +## Predefined Parameters | https://docs.linuxgsm.com/configuration/start-parameters ip="0.0.0.0" -## Server Start Command | https://docs.linuxgsm.com/configuration/start-parameters#additional-parameters +## Server Parameters | https://docs.linuxgsm.com/configuration/start-parameters#additional-parameters fn_parms(){ parms="" } @@ -138,6 +138,10 @@ stopmode="2" querymode="2" querytype="protocol-valve" +## Console type +consoleverbose="yes" +consoleinteract="no" + ## Game Server Details # Do not edit gamename="Starbound" diff --git a/lgsm/config-default/config-lgsm/sdtdserver/_default.cfg b/lgsm/config-default/config-lgsm/sdtdserver/_default.cfg index 5067aae26..2eb5e007e 100644 --- a/lgsm/config-default/config-lgsm/sdtdserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/sdtdserver/_default.cfg @@ -8,10 +8,10 @@ #### Game Server Settings #### -## Server Start Settings | https://docs.linuxgsm.com/configuration/start-parameters +## Predefined Parameters | https://docs.linuxgsm.com/configuration/start-parameters ip="0.0.0.0" -## Server Start Command | https://docs.linuxgsm.com/configuration/start-parameters#additional-parameters +## Server Parameters | https://docs.linuxgsm.com/configuration/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}" } @@ -134,6 +134,10 @@ stopmode="8" querymode="2" querytype="protocol-valve" +## Console type +consoleverbose="yes" +consoleinteract="yes" + ## Game Server Details # Do not edit gamename="7 Days To Die" diff --git a/lgsm/config-default/config-lgsm/sfcserver/_default.cfg b/lgsm/config-default/config-lgsm/sfcserver/_default.cfg index 866194cc9..5d3d83edb 100644 --- a/lgsm/config-default/config-lgsm/sfcserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/sfcserver/_default.cfg @@ -8,7 +8,7 @@ #### Game Server Settings #### -## Server Start Settings | https://docs.linuxgsm.com/configuration/start-parameters +## Predefined Parameters | https://docs.linuxgsm.com/configuration/start-parameters ip="0.0.0.0" port="27015" clientport="27005" @@ -16,7 +16,7 @@ sourcetvport="27020" defaultmap="sf_astrodome" maxplayers="32" -## Server Start Command | https://docs.linuxgsm.com/configuration/start-parameters#additional-parameters +## Server Parameters | https://docs.linuxgsm.com/configuration/start-parameters#additional-parameters fn_parms(){ parms="-game sfclassic -strictportbind -ip ${ip} -port ${port} +clientport ${clientport} +tv_port ${sourcetvport} +map ${defaultmap} +servercfgfile ${servercfg} -maxplayers ${maxplayers}" } @@ -139,6 +139,10 @@ stopmode="3" querymode="2" querytype="protocol-valve" +## Console type +consoleverbose="yes" +consoleinteract="yes" + ## Game Server Details # Do not edit gamename="SourceForts Classic" diff --git a/lgsm/config-default/config-lgsm/sof2server/_default.cfg b/lgsm/config-default/config-lgsm/sof2server/_default.cfg index 408497753..6919bbbf7 100644 --- a/lgsm/config-default/config-lgsm/sof2server/_default.cfg +++ b/lgsm/config-default/config-lgsm/sof2server/_default.cfg @@ -8,12 +8,12 @@ #### Game Server Settings #### -## Server Start Settings | https://docs.linuxgsm.com/configuration/start-parameters +## Predefined Parameters | https://docs.linuxgsm.com/configuration/start-parameters ip="0.0.0.0" port="20100" defaultmap="mp_shop" -## Server Start Command | https://docs.linuxgsm.com/configuration/start-parameters#additional-parameters +## Server Parameters | https://docs.linuxgsm.com/configuration/start-parameters#additional-parameters fn_parms(){ parms="+set sv_punkbuster 0 +set dedicated 2 +set net_ip ${ip} +set net_port ${port} +exec ${servercfg} +map ${defaultmap}" } @@ -124,6 +124,10 @@ stopmode="3" querymode="2" querytype="protocol-quake3" +## Console type +consoleverbose="yes" +consoleinteract="yes" + ## Game Server Details # Do not edit gamename="Soldier Of Fortune 2: Gold Edition" diff --git a/lgsm/config-default/config-lgsm/solserver/_default.cfg b/lgsm/config-default/config-lgsm/solserver/_default.cfg index 4a80b1634..fa5bfa59f 100644 --- a/lgsm/config-default/config-lgsm/solserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/solserver/_default.cfg @@ -8,11 +8,11 @@ #### Game Server Settings #### -## Server Start Settings | https://docs.linuxgsm.com/configuration/start-parameters +## Predefined Parameters | https://docs.linuxgsm.com/configuration/start-parameters ip="0.0.0.0" maplist="mapslist.txt" -## Server Start Command | https://docs.linuxgsm.com/configuration/start-parameters#additional-parameters +## Server Parameters | https://docs.linuxgsm.com/configuration/start-parameters#additional-parameters fn_parms(){ parms="-b ${ip} -m ${maplist} -c ${servercfg}" } @@ -130,6 +130,10 @@ stopmode="2" querymode="4" querytype="soldat" +## Console type +consoleverbose="yes" +consoleinteract="no" + ## Game Server Details # Do not edit gamename="Soldat" diff --git a/lgsm/config-default/config-lgsm/squadserver/_default.cfg b/lgsm/config-default/config-lgsm/squadserver/_default.cfg index c0ef25dea..42832bb53 100644 --- a/lgsm/config-default/config-lgsm/squadserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/squadserver/_default.cfg @@ -8,12 +8,12 @@ #### Game Server Settings #### -## Server Start Settings | https://docs.linuxgsm.com/configuration/start-parameters +## Predefined Parameters | https://docs.linuxgsm.com/configuration/start-parameters port="7787" queryport="27165" randommap="ALWAYS" -## Server Start Command | https://docs.linuxgsm.com/configuration/start-parameters#additional-parameters +## Server Parameters | https://docs.linuxgsm.com/configuration/start-parameters#additional-parameters fn_parms(){ parms="MULTIHOME=${ip} RANDOM=${randommap} Port=${port} QueryPort=${queryport}" } @@ -136,6 +136,10 @@ stopmode="2" querymode="2" querytype="protocol-valve" +## Console type +consoleverbose="yes" +consoleinteract="no" + ## Game Server Details # Do not edit gamename="Squad" diff --git a/lgsm/config-default/config-lgsm/ss3server/_default.cfg b/lgsm/config-default/config-lgsm/ss3server/_default.cfg index ec008dd8d..f4b8c6e25 100644 --- a/lgsm/config-default/config-lgsm/ss3server/_default.cfg +++ b/lgsm/config-default/config-lgsm/ss3server/_default.cfg @@ -8,10 +8,10 @@ #### Game Server Settings #### -## Server Start Settings | https://docs.linuxgsm.com/configuration/start-parameters +## Predefined Parameters | https://docs.linuxgsm.com/configuration/start-parameters ip="0.0.0.0" -## Server Start Command | https://docs.linuxgsm.com/configuration/start-parameters#additional-parameters +## Server Parameters | https://docs.linuxgsm.com/configuration/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}" @@ -135,6 +135,10 @@ stopmode="2" querymode="2" querytype="protocol-valve" +## Console type +consoleverbose="" +consoleinteract="" + ## Game Server Details # Do not edit gamename="Serious Sam 3: BFE" diff --git a/lgsm/config-default/config-lgsm/stserver/_default.cfg b/lgsm/config-default/config-lgsm/stserver/_default.cfg index e0210738d..598c20a9d 100644 --- a/lgsm/config-default/config-lgsm/stserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/stserver/_default.cfg @@ -8,7 +8,7 @@ #### Game Server Settings #### -## Server Start Settings | https://docs.linuxgsm.com/configuration/start-parameters +## Predefined Parameters | https://docs.linuxgsm.com/configuration/start-parameters ip="0.0.0.0" port="27500" queryport="27015" @@ -17,7 +17,7 @@ autosaveinterval=300 clearinterval=60 worldname="moon_save" -## Server Start Command | https://docs.linuxgsm.com/configuration/start-parameters#additional-parameters +## Server Parameters | https://docs.linuxgsm.com/configuration/start-parameters#additional-parameters # Edit with care fn_parms(){ parms="-batchmode -nographics -autostart -gameport=${port} -updateport=${queryport} -worldtype=${worldtype} -loadworld=${worldname} -worldname=${worldname} -autosaveinterval=${autosaveinterval} -clearallinterval=${clearinterval}" @@ -141,6 +141,10 @@ stopmode="2" querymode="2" querytype="protocol-valve" +## Console type +consoleverbose="yes" +consoleinteract="vo" + ## Game Server Details # Do not edit gamename="Stationeers" diff --git a/lgsm/config-default/config-lgsm/svenserver/_default.cfg b/lgsm/config-default/config-lgsm/svenserver/_default.cfg index a422cda8d..31d967d69 100644 --- a/lgsm/config-default/config-lgsm/svenserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/svenserver/_default.cfg @@ -8,14 +8,14 @@ #### Game Server Settings #### -## Server Start Settings | https://docs.linuxgsm.com/configuration/start-parameters +## Predefined Parameters | https://docs.linuxgsm.com/configuration/start-parameters ip="0.0.0.0" port="27015" clientport="27005" defaultmap="svencoop1" maxplayers="16" -## Server Start Command | https://docs.linuxgsm.com/configuration/start-parameters#additional-parameters +## Server Parameters | https://docs.linuxgsm.com/configuration/start-parameters#additional-parameters fn_parms(){ parms="-game svencoop -strictportbind +ip ${ip} -port ${port} +clientport ${clientport} +map ${defaultmap} +servercfgfile ${servercfg} +maxplayers ${maxplayers}" } @@ -138,6 +138,10 @@ stopmode="9" querymode="2" querytype="protocol-valve" +## Console type +consoleverbose="yes" +consoleinteract="yes" + ## Game Server Details # Do not edit gamename="Sven Co-op" diff --git a/lgsm/config-default/config-lgsm/terrariaserver/_default.cfg b/lgsm/config-default/config-lgsm/terrariaserver/_default.cfg index 1ec6f491a..49dc74a35 100644 --- a/lgsm/config-default/config-lgsm/terrariaserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/terrariaserver/_default.cfg @@ -12,10 +12,10 @@ steamuser="username" steampass='password' -## Server Start Settings | https://docs.linuxgsm.com/configuration/start-parameters +## Predefined Parameters | https://docs.linuxgsm.com/configuration/start-parameters ip="0.0.0.0" -## Server Start Command | https://docs.linuxgsm.com/configuration/start-parameters#additional-parameters +## Server Parameters | https://docs.linuxgsm.com/configuration/start-parameters#additional-parameters fn_parms(){ parms="-config ${servercfgfullpath}" } @@ -138,6 +138,10 @@ stopmode="7" querymode="5" querytype="" +## Console type +consoleverbose="yes" +consoleinteract="yes" + ## Game Server Details # Do not edit gamename="Terraria" diff --git a/lgsm/config-default/config-lgsm/tf2server/_default.cfg b/lgsm/config-default/config-lgsm/tf2server/_default.cfg index 97748938a..e1fb148ed 100644 --- a/lgsm/config-default/config-lgsm/tf2server/_default.cfg +++ b/lgsm/config-default/config-lgsm/tf2server/_default.cfg @@ -8,7 +8,7 @@ #### Game Server Settings #### -## Server Start Settings | https://docs.linuxgsm.com/configuration/start-parameters +## Predefined Parameters | https://docs.linuxgsm.com/configuration/start-parameters ip="0.0.0.0" port="27015" clientport="27005" @@ -21,7 +21,7 @@ maxplayers="16" # More info: https://docs.linuxgsm.com/steamcmd/gslt gslt="" -## Server Start Command | https://docs.linuxgsm.com/configuration/start-parameters#additional-parameters +## Server Parameters | https://docs.linuxgsm.com/configuration/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}" } @@ -144,6 +144,10 @@ stopmode="3" querymode="2" querytype="protocol-valve" +## Console type +consoleverbose="yes" +consoleinteract="yes" + ## Game Server Details # Do not edit gamename="Team Fortress 2" diff --git a/lgsm/config-default/config-lgsm/tfcserver/_default.cfg b/lgsm/config-default/config-lgsm/tfcserver/_default.cfg index 2c1a1d4a5..8fccb16e3 100644 --- a/lgsm/config-default/config-lgsm/tfcserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/tfcserver/_default.cfg @@ -8,14 +8,14 @@ #### Game Server Settings #### -## Server Start Settings | https://docs.linuxgsm.com/configuration/start-parameters +## Predefined Parameters | https://docs.linuxgsm.com/configuration/start-parameters ip="0.0.0.0" port="27015" clientport="27005" defaultmap="dustbowl" maxplayers="16" -## Server Start Command | https://docs.linuxgsm.com/configuration/start-parameters#additional-parameters +## Server Parameters | https://docs.linuxgsm.com/configuration/start-parameters#additional-parameters fn_parms(){ parms="-game tfc -strictportbind _ip ${ip} -port ${port} +clientport ${clientport} +map ${defaultmap} +servercfgfile ${servercfg} -maxplayers ${maxplayers}" } @@ -139,6 +139,10 @@ stopmode="9" querymode="2" querytype="protocol-valve" +## Console type +consoleverbose="yes" +consoleinteract="yes" + ## Game Server Details # Do not edit gamename="Team Fortress Classic" diff --git a/lgsm/config-default/config-lgsm/ts3server/_default.cfg b/lgsm/config-default/config-lgsm/ts3server/_default.cfg index 4f604d700..55dee80aa 100644 --- a/lgsm/config-default/config-lgsm/ts3server/_default.cfg +++ b/lgsm/config-default/config-lgsm/ts3server/_default.cfg @@ -8,10 +8,7 @@ #### Game Server Settings #### -## Server Start Settings | https://docs.linuxgsm.com/configuration/start-parameters -# Edit serverfiles/ts3server.ini after installation - -## Server Start Command | https://docs.linuxgsm.com/configuration/start-parameters#additional-parameters +## Server Parameters | https://docs.linuxgsm.com/configuration/start-parameters#additional-parameters fn_parms(){ parms="inifile=${servercfgfullpath} pid_file=ts3server.pid" } @@ -125,6 +122,10 @@ stopmode="2" querymode="5" querytype="" +## Console type +consoleverbose="yes" +consoleinteract="no" + ## Game Server Details # Do not edit gamename="TeamSpeak 3" diff --git a/lgsm/config-default/config-lgsm/tsserver/_default.cfg b/lgsm/config-default/config-lgsm/tsserver/_default.cfg index 150d9ad46..f15f41b39 100644 --- a/lgsm/config-default/config-lgsm/tsserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/tsserver/_default.cfg @@ -8,14 +8,14 @@ #### Game Server Settings #### -## Server Start Settings | https://docs.linuxgsm.com/configuration/start-parameters +## Predefined Parameters | https://docs.linuxgsm.com/configuration/start-parameters ip="0.0.0.0" port="27015" clientport="27005" defaultmap="ts_neobaroque" maxplayers="32" -## Server Start Command | https://docs.linuxgsm.com/configuration/start-parameters#additional-parameters +## Server Parameters | https://docs.linuxgsm.com/configuration/start-parameters#additional-parameters fn_parms(){ parms="-game ts -strictportbind +ip ${ip} -port ${port} +clientport ${clientport} +map ${defaultmap} +servercfgfile ${servercfg} -maxplayers ${maxplayers} " } @@ -139,6 +139,10 @@ stopmode="9" querymode="2" querytype="protocol-valve" +## Console type +consoleverbose="yes" +consoleinteract="yes" + ## Game Server Details # Do not edit gamename="The Specialists" diff --git a/lgsm/config-default/config-lgsm/tuserver/_default.cfg b/lgsm/config-default/config-lgsm/tuserver/_default.cfg index 555ccc397..d75e95f3c 100644 --- a/lgsm/config-default/config-lgsm/tuserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/tuserver/_default.cfg @@ -8,7 +8,7 @@ #### Game Server Settings #### -## Server Start Settings | https://docs.linuxgsm.com/configuration/start-parameters +## Predefined Parameters | https://docs.linuxgsm.com/configuration/start-parameters ip="0.0.0.0" port="7777" queryport="27015" @@ -18,7 +18,7 @@ queryport="27015" # More info: https://docs.linuxgsm.com/steamcmd/gslt gslt="" -## Server Start Command | https://docs.linuxgsm.com/configuration/start-parameters#additional-parameters +## Server Parameters | https://docs.linuxgsm.com/configuration/start-parameters#additional-parameters fn_parms(){ parms="-log -MultiHome=${ip} -Port=${port} -QueryPort=${queryport} -TowerServerINI=${selfname}.ini" } @@ -141,6 +141,10 @@ stopmode="2" querymode="2" querytype="protocol-valve" +## Console type +consoleverbose="yes" +consoleinteract="no" + ## Game Server Details # Do not edit gamename="Tower Unite" diff --git a/lgsm/config-default/config-lgsm/twserver/_default.cfg b/lgsm/config-default/config-lgsm/twserver/_default.cfg index 2be04f44b..c2696ae4e 100644 --- a/lgsm/config-default/config-lgsm/twserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/twserver/_default.cfg @@ -12,10 +12,10 @@ steamuser="username" steampass='password' -## Server Start Settings | https://docs.linuxgsm.com/configuration/start-parameters +## Predefined Parameters | https://docs.linuxgsm.com/configuration/start-parameters ip="0.0.0.0" -## Server Start Command | https://docs.linuxgsm.com/configuration/start-parameters#additional-parameters +## Server Parameters | https://docs.linuxgsm.com/configuration/start-parameters#additional-parameters fn_parms(){ parms="-f ${servercfg}" } @@ -138,6 +138,10 @@ stopmode="2" querymode="4" querytype="teeworlds" +## Console type +consoleverbose="yes" +consoleinteract="no" + ## Game Server Details # Do not edit gamename="Teeworlds" diff --git a/lgsm/config-default/config-lgsm/untserver/_default.cfg b/lgsm/config-default/config-lgsm/untserver/_default.cfg index 92fc25b4a..8cee6f923 100644 --- a/lgsm/config-default/config-lgsm/untserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/untserver/_default.cfg @@ -8,17 +8,13 @@ #### Game Server Settings #### -## Server Start Settings | https://docs.linuxgsm.com/configuration/start-parameters +## Predefined Parameters | https://docs.linuxgsm.com/configuration/start-parameters ip="0.0.0.0" port="27015" maxplayers="20" defaultmap="pei" -## Server Start Command | https://docs.linuxgsm.com/configuration/start-parameters#additional-parameters - -# Parameters are changed in game.ini and engine.ini (Location: ${systemdir}/Saved/Config/LinuxServer) -# Make sure you change the admin password before launching the server - +## Server Parameters | https://docs.linuxgsm.com/configuration/start-parameters#additional-parameters fn_parms(){ parms="-port:${port} -players:${maxplayers} --nographics -${defaultmap} -batchmode +secureserver/${selfname}" } @@ -141,6 +137,10 @@ stopmode="2" querymode="2" querytype="protocol-valve" +## Console type +consoleverbose="yes" +consoleinteract="yes" + ## Game Server Details # Do not edit gamename="Unturned" diff --git a/lgsm/config-default/config-lgsm/ut2k4server/_default.cfg b/lgsm/config-default/config-lgsm/ut2k4server/_default.cfg index 91bad0924..dcd0d4211 100644 --- a/lgsm/config-default/config-lgsm/ut2k4server/_default.cfg +++ b/lgsm/config-default/config-lgsm/ut2k4server/_default.cfg @@ -8,11 +8,11 @@ #### Game Server Settings #### -## Server Start Settings | https://docs.linuxgsm.com/configuration/start-parameters +## Predefined Parameters | https://docs.linuxgsm.com/configuration/start-parameters defaultmap="DM-Rankin" ip="0.0.0.0" -## Server Start Command | https://docs.linuxgsm.com/configuration/start-parameters#additional-parameters +## Server Parameters | https://docs.linuxgsm.com/configuration/start-parameters#additional-parameters fn_parms(){ parms="server ${defaultmap}?game=XGame.xDeathMatch -nohomedir ini=${servercfg} log=${gamelog}" } @@ -123,6 +123,10 @@ stopmode="2" querymode="2" querytype="protocol-unreal2" +## Console type +consoleverbose="yes" +consoleinteract="no" + ## Game Server Details # Do not edit gamename="Unreal Tournament 2004" diff --git a/lgsm/config-default/config-lgsm/ut3server/_default.cfg b/lgsm/config-default/config-lgsm/ut3server/_default.cfg index b9015d5de..f268631b1 100644 --- a/lgsm/config-default/config-lgsm/ut3server/_default.cfg +++ b/lgsm/config-default/config-lgsm/ut3server/_default.cfg @@ -8,7 +8,7 @@ #### Game Server Settings #### -## Server Start Settings | https://docs.linuxgsm.com/configuration/start-parameters +## Predefined Parameters | https://docs.linuxgsm.com/configuration/start-parameters ip="0.0.0.0" port="7777" queryport="6500" @@ -27,7 +27,7 @@ allowjoininprogress="true" gsusername="" gspassword="" -## Server Start Command | https://docs.linuxgsm.com/configuration/start-parameters#additional-parameters +## Server Parameters | https://docs.linuxgsm.com/configuration/start-parameters#additional-parameters # Edit with care | List of game types and mutators: https://docs.linuxgsm.com/game-servers/unreal-tournament-3 fn_parms(){ parms="server ${defaultmap}?Game=${game}?bIsDedicated=${isdedicated}?bIsLanMatch=${islanmatch}?bUsesStats=${usesstats}?bShouldAdvertise=${shouldadvertise}?PureServer=${pureserver}?bAllowJoinInProgress=${allowjoininprogress}?Mutator=${mutators}?ConfigSubDir=${selfname} -login=${gsusername} -password=${gspassword} -port=${port} -queryport=${queryport} -multihome=${ip} -nohomedir -unattended -log=${gamelog}" @@ -139,6 +139,10 @@ stopmode="2" querymode="2" querytype="ut3" +## Console type +consoleverbose="yes" +consoleinteract="no" + ## Game Server Details # Do not edit gamename="Unreal Tournament 3" diff --git a/lgsm/config-default/config-lgsm/ut99server/_default.cfg b/lgsm/config-default/config-lgsm/ut99server/_default.cfg index 713623690..ab74b3f0b 100644 --- a/lgsm/config-default/config-lgsm/ut99server/_default.cfg +++ b/lgsm/config-default/config-lgsm/ut99server/_default.cfg @@ -8,11 +8,11 @@ #### Game Server Settings #### -## Server Start Settings | https://docs.linuxgsm.com/configuration/start-parameters +## Predefined Parameters | https://docs.linuxgsm.com/configuration/start-parameters defaultmap="DM-Deck16][" ip="0.0.0.0" -## Server Start Command | https://docs.linuxgsm.com/configuration/start-parameters#additional-parameters +## Server Parameters | https://docs.linuxgsm.com/configuration/start-parameters#additional-parameters fn_parms(){ parms="server ${defaultmap}.unr ini=${servercfgfullpath}" } @@ -123,6 +123,10 @@ stopmode="2" querymode="2" querytype="protocol-gamespy1" +## Console type +consoleverbose="yes" +consoleinteract="no" + ## Game Server Details # Do not edit gamename="Unreal Tournament 99" diff --git a/lgsm/config-default/config-lgsm/utserver/_default.cfg b/lgsm/config-default/config-lgsm/utserver/_default.cfg index 244e86ad6..09ca4f523 100644 --- a/lgsm/config-default/config-lgsm/utserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/utserver/_default.cfg @@ -8,7 +8,7 @@ #### Game Server Settings #### -## Server Start Settings | https://docs.linuxgsm.com/configuration/start-parameters +## Predefined Parameters | https://docs.linuxgsm.com/configuration/start-parameters # For CTF: defaultmap="CTF-Face" gametype="CTF" ip="0.0.0.0" port="7777" @@ -16,7 +16,7 @@ defaultmap="DM-Underland" gametype="DM" timelimit="10" -## Server Start Command | https://docs.linuxgsm.com/configuration/start-parameters#additional-parameters +## Server Parameters | https://docs.linuxgsm.com/configuration/start-parameters#additional-parameters fn_parms(){ parms="UnrealTournament ${defaultmap}?Game=${gametype}?TimeLimit=${timelimit} -port=${port}" } @@ -127,6 +127,10 @@ stopmode="2" querymode="1" querytype="" +## Console type +consoleverbose="yes" +consoleinteract="no" + ## Game Server Details # Do not edit gamename="Unreal Tournament" @@ -142,7 +146,7 @@ executabledir="${systemdir}/Engine/Binaries/Linux" executable="./UE4Server-Linux-Shipping" servercfgdir="${systemdir}/UnrealTournament/Saved/Config/LinuxServer" servercfg="Game.ini" -servercfgdefault"Game.ini" +servercfgdefault="Game.ini" servercfgfullpath="${servercfgdir}/${servercfg}" ## Backup Directory diff --git a/lgsm/config-default/config-lgsm/vsserver/_default.cfg b/lgsm/config-default/config-lgsm/vsserver/_default.cfg index 7f2ef3b3b..b8f44317e 100644 --- a/lgsm/config-default/config-lgsm/vsserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/vsserver/_default.cfg @@ -8,14 +8,14 @@ #### Game Server Settings #### -## Server Start Settings | https://docs.linuxgsm.com/configuration/start-parameters +## Predefined Parameters | https://docs.linuxgsm.com/configuration/start-parameters ip="0.0.0.0" port="27015" clientport="27005" defaultmap="vs_frost" maxplayers="16" -## Server Start Command | https://docs.linuxgsm.com/configuration/start-parameters#additional-parameters +## Server Parameters | https://docs.linuxgsm.com/configuration/start-parameters#additional-parameters fn_parms(){ parms="-game vs -strictportbind +ip ${ip} -port ${port} +clientport ${clientport} +map ${defaultmap} +servercfgfile ${servercfg} -maxplayers ${maxplayers}" } @@ -139,6 +139,10 @@ stopmode="9" querymode="2" querytype="protocol-valve" +## Console type +consoleverbose="yes" +consoleinteract="yes" + ## Game Server Details # Do not edit gamename="Vampire Slayer" diff --git a/lgsm/config-default/config-lgsm/wetserver/_default.cfg b/lgsm/config-default/config-lgsm/wetserver/_default.cfg index 67a3ceff0..16ddab532 100644 --- a/lgsm/config-default/config-lgsm/wetserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/wetserver/_default.cfg @@ -8,9 +8,9 @@ #### Game Server Settings #### -## Server Start Command | https://docs.linuxgsm.com/configuration/start-parameters#additional-parameters +## Server Parameters | https://docs.linuxgsm.com/configuration/start-parameters#additional-parameters fn_parms(){ - parms="+set net_strict 1 +set fs_homepath ${serverfiles} +exec ${servercfg}" +parms="+set net_strict 1 +set fs_homepath ${serverfiles} +exec ${servercfg}" } #### LinuxGSM Settings #### @@ -119,6 +119,10 @@ stopmode="3" querymode="2" querytype="protocol-quake3" +## Console type +consoleverbose="yes" +consoleinteract="no" + ## Game Server Details # Do not edit gamename="Wolfenstein: Enemy Territory" diff --git a/lgsm/config-default/config-lgsm/wfserver/_default.cfg b/lgsm/config-default/config-lgsm/wfserver/_default.cfg index 8fa5ec1f8..b79a165b1 100644 --- a/lgsm/config-default/config-lgsm/wfserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/wfserver/_default.cfg @@ -8,12 +8,12 @@ #### Game Server Settings #### -## Server Start Settings | https://docs.linuxgsm.com/configuration/start-parameters +## Predefined Parameters | https://docs.linuxgsm.com/configuration/start-parameters ip="0.0.0.0" port="44400" httpport="44444" -## Server Start Command | https://docs.linuxgsm.com/configuration/start-parameters#additional-parameters +## Server Parameters | https://docs.linuxgsm.com/configuration/start-parameters#additional-parameters fn_parms(){ parms="+exec ${servercfg} +sv_http_ip ${ip} +set sv_http_port ${httpport} +sv_ip ${ip} +sv_port ${port}" } @@ -134,6 +134,10 @@ betapassword="" # Master Server | https://docs.linuxgsm.com/steamcmd/steam-master-server steammaster="true" +## Console type +consoleverbose="yes" +consoleinteract="yes" + ## Game Server Details # Do not edit gamename="Warfork" diff --git a/lgsm/config-default/config-lgsm/wurmserver/_default.cfg b/lgsm/config-default/config-lgsm/wurmserver/_default.cfg index 4c95a5409..bce9433a2 100644 --- a/lgsm/config-default/config-lgsm/wurmserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/wurmserver/_default.cfg @@ -8,11 +8,11 @@ #### Game Server Settings #### -## Server Start Command | https://docs.linuxgsm.com/configuration/start-parameters#additional-parameters +## Server Parameters | https://docs.linuxgsm.com/configuration/start-parameters#additional-parameters fn_parms(){ - # Note Parameters are editing in the game server config file. - source "${servercfgfullpath}" - parms="ADMINPWD=\"$ADMINPWD\" EPICSETTINGS=\"$EPICSETTINGS\" EXTERNALPORT=\"$EXTERNALPORT\" HOMESERVER=\"$HOMESERVER\" HOMEKINGDOM=\"$HOMEKINGDOM\" LOGINSERVER=\"$LOGINSERVER\" MAXPLAYERS=\"$MAXPLAYERS\" QUERYPORT=\"$QUERYPORT\" SERVERNAME=\"$SERVERNAME\" SERVERPASSWORD=\"$SERVERPASSWORD\" START=\"$START\" IP=\"$IP\"" +# Parameters are editing in the game server config file. +source "${servercfgfullpath}" +parms="ADMINPWD=\"$ADMINPWD\" EPICSETTINGS=\"$EPICSETTINGS\" EXTERNALPORT=\"$EXTERNALPORT\" HOMESERVER=\"$HOMESERVER\" HOMEKINGDOM=\"$HOMEKINGDOM\" LOGINSERVER=\"$LOGINSERVER\" MAXPLAYERS=\"$MAXPLAYERS\" QUERYPORT=\"$QUERYPORT\" SERVERNAME=\"$SERVERNAME\" SERVERPASSWORD=\"$SERVERPASSWORD\" START=\"$START\" IP=\"$IP\"" } #### LinuxGSM Settings #### @@ -130,6 +130,10 @@ stopmode="2" querymode="2" querytype="protocol-valve" +## Console type +consoleverbose="" +consoleinteract="" + ## Game Server Details # Do not edit gamename="Wurm Unlimited" diff --git a/lgsm/config-default/config-lgsm/zmrserver/_default.cfg b/lgsm/config-default/config-lgsm/zmrserver/_default.cfg index e0204ff07..63e43f98e 100644 --- a/lgsm/config-default/config-lgsm/zmrserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/zmrserver/_default.cfg @@ -8,7 +8,7 @@ #### Game Server Settings #### -## Server Start Settings | https://docs.linuxgsm.com/configuration/start-parameters +## Predefined Parameters | https://docs.linuxgsm.com/configuration/start-parameters ip="0.0.0.0" port="27015" clientport="27005" @@ -16,7 +16,7 @@ sourcetvport="27020" defaultmap="zm_docksofthedead" maxplayers="16" -## Server Start Command | https://docs.linuxgsm.com/configuration/start-parameters#additional-parameters +## Server Parameters | https://docs.linuxgsm.com/configuration/start-parameters#additional-parameters fn_parms(){ parms="-game zombie_master_reborn -strictportbind -ip ${ip} -port ${port} +clientport ${clientport} +tv_port ${sourcetvport} +map ${defaultmap} +servercfgfile ${servercfg} -maxplayers ${maxplayers}" } @@ -139,6 +139,10 @@ stopmode="3" querymode="2" querytype="protocol-valve" +## Console type +consoleverbose="yes" +consoleinteract="yes" + ## Game Server Details # Do not edit gamename="Zombie Master: Reborn" diff --git a/lgsm/config-default/config-lgsm/zpsserver/_default.cfg b/lgsm/config-default/config-lgsm/zpsserver/_default.cfg index 69d5383f5..61bcc8741 100644 --- a/lgsm/config-default/config-lgsm/zpsserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/zpsserver/_default.cfg @@ -8,7 +8,7 @@ #### Game Server Settings #### -## Server Start Settings | https://docs.linuxgsm.com/configuration/start-parameters +## Predefined Parameters | https://docs.linuxgsm.com/configuration/start-parameters ip="0.0.0.0" port="27015" clientport="27005" @@ -21,7 +21,7 @@ maxplayers="20" # More info: https://docs.linuxgsm.com/steamcmd/gslt gslt="" -## Server Start Command | https://docs.linuxgsm.com/configuration/start-parameters#additional-parameters +## Server Parameters | https://docs.linuxgsm.com/configuration/start-parameters#additional-parameters fn_parms(){ parms="-game zps -strictportbind -ip ${ip} -port ${port} +clientport ${clientport} +tv_port ${sourcetvport} +map ${defaultmap} +servercfgfile ${servercfg} -maxplayers ${maxplayers}" } @@ -144,6 +144,10 @@ stopmode="3" querymode="2" querytype="protocol-valve" +## Console type +consoleverbose="yes" +consoleinteract="yes" + ## Game Server Details # Do not edit gamename="Zombie Panic! Source" diff --git a/lgsm/functions/command_console.sh b/lgsm/functions/command_console.sh index 338ea19c2..a97d7f4fc 100644 --- a/lgsm/functions/command_console.sh +++ b/lgsm/functions/command_console.sh @@ -11,16 +11,30 @@ fn_firstcommand_set check.sh fn_print_header -if [ "${shortname}" == "rust" ]||[ "${shortname}" == "hw" ]||[ "${shortname}" == "ark" ]; then - fn_print_information_nl "${gamename} does not produce a verbose output to the console" - fn_print_information_nl "${gamename} does not allow server commands to be entered in to the console" + +if [ "${consoleverbose}" == "yes" ]; then + echo "* Verbose output: ${lightgreen}yes${default}" +elif [ "${consoleverbose}" == "no" ]; then + echo "* Verbose output: ${red}no${default}" +else + echo "* Verbose output: ${red}unknown${default}" +fi + +if [ "${consoleinteract}" == "yes" ]; then + echo "* Interactive output: ${lightgreen}yes${default}" +elif [ "${consoleinteract}" == "no" ]; then + echo "* Interactive output: ${red}no${default}" +else + echo "* Interactive output: ${red}unknown${default}" fi +echo "" fn_print_information_nl "Press \"CTRL+b\" then \"d\" to exit console." fn_print_warning_nl "Do NOT press CTRL+c to exit." -echo -e " * https://docs.linuxgsm.com/commands/console" +echo -e "* https://docs.linuxgsm.com/commands/console" echo -e "" if ! fn_prompt_yn "Continue?" Y; then - return + exitcode=0 + core_exit.sh fi fn_print_dots "Accessing console" check_status.sh diff --git a/lgsm/functions/command_debug.sh b/lgsm/functions/command_debug.sh index d8a8a1cba..cbd42d287 100644 --- a/lgsm/functions/command_debug.sh +++ b/lgsm/functions/command_debug.sh @@ -82,7 +82,8 @@ echo -e "Press CTRL+c to drop out of debug mode." fn_print_warning_nl "If ${selfname} is already running it will be stopped." echo -e "" if ! fn_prompt_yn "Continue?" Y; then - return + exitcode=0 + core_exit.sh fi fn_print_info_nl "Stopping any running servers" diff --git a/lgsm/functions/command_ts3_server_pass.sh b/lgsm/functions/command_ts3_server_pass.sh index c97d98805..ff75b71d2 100644 --- a/lgsm/functions/command_ts3_server_pass.sh +++ b/lgsm/functions/command_ts3_server_pass.sh @@ -16,7 +16,8 @@ fn_serveradmin_password_prompt(){ fn_print_warning_nl "${gamename} will restart during this process." echo -e "" if ! fn_prompt_yn "Continue?" Y; then - echo Exiting; exit + exitcode=0 + core_exit.sh fi fn_script_log_info "Initiating ${gamename} ServerAdmin password change" read -rp "Enter new password: " newpassword diff --git a/lgsm/functions/compress_unreal2_maps.sh b/lgsm/functions/compress_unreal2_maps.sh index 82d94d4d8..7169c9612 100644 --- a/lgsm/functions/compress_unreal2_maps.sh +++ b/lgsm/functions/compress_unreal2_maps.sh @@ -20,7 +20,8 @@ echo -e "" echo -e "${compressedmapsdir}" echo -e "" if ! fn_prompt_yn "Start compression?" Y; then - return + exitcode=0 + core_exit.sh fi mkdir -pv "${compressedmapsdir}" > /dev/null 2>&1 rm -rfv "${serverfiles:?}/Maps/"*.ut2.uz2 diff --git a/lgsm/functions/compress_ut99_maps.sh b/lgsm/functions/compress_ut99_maps.sh index 39153ba3e..3239837a0 100644 --- a/lgsm/functions/compress_ut99_maps.sh +++ b/lgsm/functions/compress_ut99_maps.sh @@ -20,7 +20,8 @@ echo -e "" echo -e "${compressedmapsdir}" echo -e "" if ! fn_prompt_yn "Start compression?" Y; then - return + exitcode=0 + core_exit.sh fi mkdir -pv "${compressedmapsdir}" > /dev/null 2>&1 rm -rfv "${serverfiles:?}/Maps/"*.unr.uz diff --git a/lgsm/functions/core_trap.sh b/lgsm/functions/core_trap.sh index 52c00b107..769c27c96 100644 --- a/lgsm/functions/core_trap.sh +++ b/lgsm/functions/core_trap.sh @@ -11,6 +11,9 @@ fn_exit_trap(){ exitcode=$? fi echo -e "" + if [ -z "${exitcode}" ]; then + exitcode=0 + fi core_exit.sh } diff --git a/lgsm/functions/info_config.sh b/lgsm/functions/info_config.sh index 14319b9bf..f07293ae3 100644 --- a/lgsm/functions/info_config.sh +++ b/lgsm/functions/info_config.sh @@ -491,7 +491,7 @@ fn_info_config_mofm(){ 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 "ServerPassword" "${servercfgfullpath}" | sed -e 's/^ *//g' -e '/^--/d' -e 's/ServerPassword//g' | tr -d '=\";,:' | sed -e 's/^[ \t]*//' -e 's/[ \t]*$//') - + # Not Set servername=${servername:-"NOT SET"} serverpassword=${serverpassword:-"NOT SET"} @@ -631,8 +631,8 @@ fn_info_config_quakeworld(){ 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]*$//') + 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]*$//' | cut -f1 -d "/") + 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]*$//' | cut -f1 -d "/") maxplayers=$(grep "maxclients" "${servercfgfullpath}" | grep -v "#" | tr -cd '[:digit:]') # Not Set @@ -1515,7 +1515,7 @@ elif [ "${shortname}" == "bf1942" ]; then fn_info_config_bf1942 # Battlefield: Vietnam elif [ "${shortname}" == "bfv" ]; then - fn_info_config_bfv + fn_info_config_bfv # Chivalry: Medieval Warfare elif [ "${shortname}" == "cmw" ]; then fn_info_config_chivalry diff --git a/lgsm/functions/install_eula.sh b/lgsm/functions/install_eula.sh index cd51954d0..1f50007f2 100644 --- a/lgsm/functions/install_eula.sh +++ b/lgsm/functions/install_eula.sh @@ -25,6 +25,7 @@ if [ -z "${autoinstall}" ]; then echo -e "By continuing you are indicating your agreement to the EULA." echo -e "" if ! fn_prompt_yn "Continue?" Y; then + exitcode=0 core_exit.sh fi elif [ "${commandname}" == "START" ]; then diff --git a/lgsm/functions/install_retry.sh b/lgsm/functions/install_retry.sh index 2d6e3df7b..070a4a816 100644 --- a/lgsm/functions/install_retry.sh +++ b/lgsm/functions/install_retry.sh @@ -9,5 +9,6 @@ functionselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" if fn_prompt_yn "Retry install?" Y; then command_install.sh; core_exit.sh else + exitcode=0 core_exit.sh fi diff --git a/lgsm/functions/install_server_dir.sh b/lgsm/functions/install_server_dir.sh index cfd586dc4..77c5ab138 100644 --- a/lgsm/functions/install_server_dir.sh +++ b/lgsm/functions/install_server_dir.sh @@ -17,7 +17,8 @@ pwd echo -e "" if [ -z "${autoinstall}" ]; then if ! fn_prompt_yn "Continue?" Y; then - exit + exitcode=0 + core_exit.sh fi fi if [ ! -d "${serverfiles}" ]; then diff --git a/tests/tests_defaultcfg/defaultcfg_1.txt b/tests/tests_defaultcfg/defaultcfg_1.txt index 88f6adf5c..ca8fa2a8e 100644 --- a/tests/tests_defaultcfg/defaultcfg_1.txt +++ b/tests/tests_defaultcfg/defaultcfg_1.txt @@ -6,7 +6,7 @@ # common.cfg - applies settings to every instance. # [instance].cfg - applies settings to a specific instance. #### Game Server Settings #### -## Server Start Command | https://docs.linuxgsm.com/configuration/start-parameters#additional-parameters +## Server Parameters | https://docs.linuxgsm.com/configuration/start-parameters#additional-parameters #### LinuxGSM Settings #### ## Notification Alerts # (on|off) @@ -42,6 +42,9 @@ # 9: GoldSrc # 10: Avorion # 11: end +## Console type +consoleverbose="" +consoleinteract="" ## Game Server Details # Do not edit #### Directories #### From db4d3ccef4719d786d922dcbeff442710e1c51a9 Mon Sep 17 00:00:00 2001 From: Ryan Walters Date: Sun, 9 Aug 2020 14:32:50 -0500 Subject: [PATCH 443/534] fix: awk to properly grab the server pid when spaces are present in the session name (#2997) --- lgsm/functions/info_distro.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lgsm/functions/info_distro.sh b/lgsm/functions/info_distro.sh index c50953cdc..a8d61ce7e 100644 --- a/lgsm/functions/info_distro.sh +++ b/lgsm/functions/info_distro.sh @@ -9,7 +9,7 @@ functionselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" ### Game Server pid if [ "${status}" == "1" ]; then - gameserverpid=$(tmux list-sessions -F "#{session_name} #{pane_pid}" | grep "^${sessionname} " | awk '{print $2}') + gameserverpid=$(tmux list-sessions -F "#{session_name} #{pane_pid}" | grep "^${sessionname} " | awk '{print $NF}') fi ### Distro information From 364a1a9e6dd7e0903e92ce5b2b771d24734b5813 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Sun, 9 Aug 2020 20:42:34 +0100 Subject: [PATCH 444/534] correct echo for console message --- lgsm/functions/command_console.sh | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/lgsm/functions/command_console.sh b/lgsm/functions/command_console.sh index a97d7f4fc..0de924ea6 100644 --- a/lgsm/functions/command_console.sh +++ b/lgsm/functions/command_console.sh @@ -13,19 +13,19 @@ check.sh fn_print_header if [ "${consoleverbose}" == "yes" ]; then - echo "* Verbose output: ${lightgreen}yes${default}" + echo -e "* Verbose output: ${lightgreen}yes${default}" elif [ "${consoleverbose}" == "no" ]; then - echo "* Verbose output: ${red}no${default}" + echo -e "* Verbose output: ${red}no${default}" else - echo "* Verbose output: ${red}unknown${default}" + echo -e "* Verbose output: ${red}unknown${default}" fi if [ "${consoleinteract}" == "yes" ]; then - echo "* Interactive output: ${lightgreen}yes${default}" + echo -e "* Interactive output: ${lightgreen}yes${default}" elif [ "${consoleinteract}" == "no" ]; then - echo "* Interactive output: ${red}no${default}" + echo -e "* Interactive output: ${red}no${default}" else - echo "* Interactive output: ${red}unknown${default}" + echo -e "* Interactive output: ${red}unknown${default}" fi echo "" fn_print_information_nl "Press \"CTRL+b\" then \"d\" to exit console." From f3b6d56eace9cdb02ecc1d17a973e2cef1a255b6 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Sun, 9 Aug 2020 21:16:03 +0100 Subject: [PATCH 445/534] fix(ahlserver): correct game name to use capitals --- lgsm/config-default/config-lgsm/ahlserver/_default.cfg | 2 +- lgsm/data/serverlist.csv | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/lgsm/config-default/config-lgsm/ahlserver/_default.cfg b/lgsm/config-default/config-lgsm/ahlserver/_default.cfg index 723c8b2c7..63a7079c5 100644 --- a/lgsm/config-default/config-lgsm/ahlserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/ahlserver/_default.cfg @@ -145,7 +145,7 @@ consoleinteract="yes" ## Game Server Details # Do not edit -gamename="Action half-life" +gamename="Action Half-Life" engine="goldsrc" glibc="2.3.4" diff --git a/lgsm/data/serverlist.csv b/lgsm/data/serverlist.csv index f294906bb..d85a68011 100644 --- a/lgsm/data/serverlist.csv +++ b/lgsm/data/serverlist.csv @@ -1,5 +1,5 @@ ac,acserver,Assetto Corsa -ahl,ahlserver,Action half-life +ahl,ahlserver,Action Half-Life ahl2,ahl2server,Action: Source ark,arkserver,ARK: Survival Evolved arma3,arma3server,ARMA 3 From eb9e5a940f221fb7cb654095892dc9473c8ad3a9 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Mon, 10 Aug 2020 20:15:39 +0100 Subject: [PATCH 446/534] feat(newserver): Jedi Knight II: Jedi Outcast (#3002) Co-authored-by: Nate Berkopec Co-authored-by: Frisasky --- .../config-lgsm/jk2server/_default.cfg | 172 ++++++++++++++++++ lgsm/data/serverlist.csv | 3 +- lgsm/functions/command_install.sh | 1 - lgsm/functions/command_start.sh | 9 + lgsm/functions/command_update.sh | 2 + lgsm/functions/core_dl.sh | 2 +- lgsm/functions/core_functions.sh | 5 + lgsm/functions/core_getopt.sh | 12 +- lgsm/functions/info_config.sh | 24 +++ lgsm/functions/info_messages.sh | 16 ++ lgsm/functions/info_parms.sh | 7 +- lgsm/functions/install_config.sh | 6 + lgsm/functions/install_server_files.sh | 2 + lgsm/functions/update_factorio.sh | 4 +- lgsm/functions/update_jediknight2.sh | 171 +++++++++++++++++ lgsm/functions/update_minecraft.sh | 51 ++---- lgsm/functions/update_minecraft_bedrock.sh | 6 +- lgsm/functions/update_mta.sh | 4 +- lgsm/functions/update_mumble.sh | 4 +- lgsm/functions/update_steamcmd.sh | 2 +- lgsm/functions/update_ts3.sh | 4 +- 21 files changed, 447 insertions(+), 60 deletions(-) create mode 100644 lgsm/config-default/config-lgsm/jk2server/_default.cfg create mode 100644 lgsm/functions/update_jediknight2.sh diff --git a/lgsm/config-default/config-lgsm/jk2server/_default.cfg b/lgsm/config-default/config-lgsm/jk2server/_default.cfg new file mode 100644 index 000000000..b7bc6b307 --- /dev/null +++ b/lgsm/config-default/config-lgsm/jk2server/_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 #### + +## SteamCMD Login | https://docs.linuxgsm.com/steamcmd#steamcmd-login +steamuser="username" +steampass='password' + +## Server Start Settings | https://docs.linuxgsm.com/configuration/start-parameters +ip="0.0.0.0" +port="27960" +defaultmap="ffa_bespin" + +## Server Start Command | https://docs.linuxgsm.com/configuration/start-parameters#additional-parameters +fn_parms(){ +parms="+set sv_punkbuster 0 +set fs_basepath ${serverfiles} +set net_ip ${ip} +set net_port ${port} +exec ${servercfg} +map ${defaultmap}" +} + +#### LinuxGSM Settings #### + +## Notification Alerts +# (on|off) + +# Display IP | https://docs.linuxgsm.com/alerts#display-ip +displayip="" + +# More info | https://docs.linuxgsm.com/alerts#more-info +postalert="off" +postdays="7" +posttarget="https://hastebin.com" + +# Discord Alerts | https://docs.linuxgsm.com/alerts/discord +discordalert="off" +discordwebhook="webhook" + +# Slack Alerts | https://docs.linuxgsm.com/alerts/slack +slackalert="off" +slackwebhook="webhook" + +# Email Alerts | https://docs.linuxgsm.com/alerts/email +emailalert="off" +email="email@example.com" +emailfrom="" + +# IFTTT Alerts | https://docs.linuxgsm.com/alerts/ifttt +iftttalert="off" +ifttttoken="accesstoken" +iftttevent="linuxgsm_alert" + +# Mailgun Email Alerts | https://docs.linuxgsm.com/alerts/mailgun +mailgunalert="off" +mailguntoken="accesstoken" +mailgundomain="example.com" +mailgunemailfrom="alert@example.com" +mailgunemail="email@myemail.com" + +# Pushbullet Alerts | https://docs.linuxgsm.com/alerts/pushbullet +pushbulletalert="off" +pushbullettoken="accesstoken" +channeltag="" + +# Pushover Alerts | https://docs.linuxgsm.com/alerts/pushover +pushoveralert="off" +pushovertoken="accesstoken" + +# Telegram Alerts | https://docs.linuxgsm.com/alerts/telegram +# You can add a custom cURL string eg proxy (useful in Russia) or else in "curlcustomstring". +# like a "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help", if you not need +# any custom string in curl - simple ignore this parameter. +telegramalert="off" +telegramtoken="accesstoken" +telegramchatid="" +curlcustomstring="" + +## Updating | https://docs.linuxgsm.com/commands/update +updateonstart="off" + +## Backup | https://docs.linuxgsm.com/commands/backup +maxbackups="4" +maxbackupdays="30" +stoponbackup="on" + +## Logging | https://docs.linuxgsm.com/features/logging +consolelogging="on" +logdays="7" + +## Monitor | https://docs.linuxgsm.com/commands/monitor +# Query delay time +querydelay="1" + +#### LinuxGSM Advanced Settings #### + +# ANSI Colors +ansi="on" + +# Message Display Time +sleeptime="0.5" + +# Stop Mode | https://docs.linuxgsm.com/steamcmd/stopmode +# 1: tmux kill +# 2: CTRL+c +# 3: quit +# 4: quit 120s +# 5: stop +# 6: q +# 7: exit +# 8: 7 Days to Die +# 9: Gold Source +# 10: Teamspeak 3 +stopmode="3" + +## Query mode +# 1: session only +# 2: gamedig + gsquery +# 3: gamedig +# 4: gsquery +# 5: tcp +querymode="2" +querytype="protocol-quake3" + +## Console type +consoleverbose="yes" +consoleinteract="yes" + +## SteamCMD Settings +# Server appid +appid="6030" +# SteamCMD Branch | https://docs.linuxgsm.com/steamcmd/branch +branch="" +# Master Server | https://docs.linuxgsm.com/steamcmd/steam-master-server +steammaster="true" + +## LinuxGSM Server Details +# Do not edit +gamename="Jedi Knight II: Jedi Outcast" +engine="idtech3" +glibc="2.15" + +#### Directories #### +# Edit with care + +## Server Specific Directories +systemdir="${serverfiles}/GameData" +executabledir="${systemdir}" +executable="./jk2mvded" +servercfg="${selfname}.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}/${selfname}-script.log" +consolelog="${consolelogdir}/${selfname}-console.log" +alertlog="${lgsmlogdir}/${selfname}-alert.log" +postdetailslog="${lgsmlogdir}/${selfname}-postdetails.log" + +## Logs Naming +lgsmlogdate="${lgsmlogdir}/${selfname}-script-$(date '+%Y-%m-%d-%H:%M:%S').log" +consolelogdate="${consolelogdir}/${selfname}-console-$(date '+%Y-%m-%d-%H:%M:%S').log" diff --git a/lgsm/data/serverlist.csv b/lgsm/data/serverlist.csv index d85a68011..8a71858fe 100644 --- a/lgsm/data/serverlist.csv +++ b/lgsm/data/serverlist.csv @@ -48,6 +48,7 @@ inss,inssserver,Insurgency: Sandstorm ios,iosserver,IOSoccer jc2,jc2server,Just Cause 2 jc3,jc3server,Just Cause 3 +jk2,jk2server,Jedi Knight II: Jedi Outcast kf,kfserver,Killing Floor kf2,kf2server,Killing Floor 2 l4d,l4dserver,Left 4 Dead @@ -107,4 +108,4 @@ wet,wetserver,Wolfenstein: Enemy Territory wf,wfserver,Warfork wurm,wurmserver,Wurm Unlimited zmr,zmrserver,Zombie Master: Reborn -zps,zpsserver,Zombie Panic! Source \ No newline at end of file +zps,zpsserver,Zombie Panic! Source diff --git a/lgsm/functions/command_install.sh b/lgsm/functions/command_install.sh index 2437116d3..3e5d27872 100644 --- a/lgsm/functions/command_install.sh +++ b/lgsm/functions/command_install.sh @@ -24,7 +24,6 @@ else install_server_files.sh install_ut2k4_key.sh elif [ -z "${appid}" ]; then - installer=1 install_server_files.sh elif [ "${appid}" ]; then install_steamcmd.sh diff --git a/lgsm/functions/command_start.sh b/lgsm/functions/command_start.sh index 48cb02e12..62160e187 100644 --- a/lgsm/functions/command_start.sh +++ b/lgsm/functions/command_start.sh @@ -32,6 +32,13 @@ fn_start_teamspeak3(){ fn_start_tmux } +# This will allow the Jedi Knight 2 version to be printed in console on start. +# Used to allow update to detect JK2MV server version. +fn_start_jk2(){ + fn_start_tmux + tmux send -t "${sessionname}" version ENTER > /dev/null 2>&1 +} + fn_start_tmux(){ if [ "${parmsbypass}" ]; then parms="" @@ -196,6 +203,8 @@ fn_print_dots "${servername}" if [ "${shortname}" == "ts3" ]; then fn_start_teamspeak3 +elif [ "${shortname}" == "jk2" ]; then + fn_start_jk2 else fn_start_tmux fi diff --git a/lgsm/functions/command_update.sh b/lgsm/functions/command_update.sh index 2a6c23d57..d4804edef 100644 --- a/lgsm/functions/command_update.sh +++ b/lgsm/functions/command_update.sh @@ -26,6 +26,8 @@ elif [ "${shortname}" == "fctr" ]; then update_factorio.sh elif [ "${shortname}" == "mta" ]; then update_mta.sh +elif [ "${shortname}" == "jk2" ]; then + update_jediknight2.sh else update_steamcmd.sh fi diff --git a/lgsm/functions/core_dl.sh b/lgsm/functions/core_dl.sh index ae11c4156..a5c187df3 100644 --- a/lgsm/functions/core_dl.sh +++ b/lgsm/functions/core_dl.sh @@ -67,7 +67,7 @@ fn_dl_steamcmd(){ ${unbuffer} ${steamcmdcommand} +login "${steamuser}" "${steampass}" +force_install_dir "${serverfiles}" +app_set_config 90 mod "${appidmod}" +app_update "${appid}" ${validate} +quit | tee -a "${lgsmlog}" "${steamcmdlog}" fi # Force Windows Platform type. - elif [ "${shortname}" == "ac" ]; then + elif [ "${shortname}" == "ac" ]||[ "${shortname}" == "jk2" ]; then if [ -n "${branch}" ]&&[ -n "${betapassword}" ]; then ${unbuffer} ${steamcmdcommand} +@sSteamCmdForcePlatformType windows +login "${steamuser}" "${steampass}" +force_install_dir "${serverfiles}" +app_update "${appid}" -beta "${branch}" -betapassword "${betapassword}" ${validate} +quit | tee -a "${lgsmlog}" "${steamcmdlog}" elif [ -n "${branch}" ]; then diff --git a/lgsm/functions/core_functions.sh b/lgsm/functions/core_functions.sh index 08b21f8c0..2057caf94 100644 --- a/lgsm/functions/core_functions.sh +++ b/lgsm/functions/core_functions.sh @@ -614,6 +614,11 @@ functionfile="${FUNCNAME[0]}" fn_fetch_function } +update_jediknight2.sh(){ +functionfile="${FUNCNAME[0]}" +fn_fetch_function +} + update_steamcmd.sh(){ functionfile="${FUNCNAME[0]}" fn_fetch_function diff --git a/lgsm/functions/core_getopt.sh b/lgsm/functions/core_getopt.sh index bca60d5d9..47071bc24 100644 --- a/lgsm/functions/core_getopt.sh +++ b/lgsm/functions/core_getopt.sh @@ -61,11 +61,13 @@ currentopt=( "${cmd_start[@]}" "${cmd_stop[@]}" "${cmd_restart[@]}" "${cmd_monit currentopt+=( "${cmd_update_linuxgsm[@]}" ) # Exclude noupdate games here. -if [ "${engine}" != "quake" ]&&[ "${engine}" != "idtech2" ]&&[ "${engine}" != "idtech3" ]&&[ "${engine}" != "iw2.0" ]&&[ "${engine}" != "iw3.0" ]&&[ "${shortname}" != "bf1942" ]&&[ "${shortname}" != "bfv" ]&&[ "${shortname}" != "samp" ]; then - currentopt+=( "${cmd_update[@]}" ) - # force update for SteamCMD only or MTA. - if [ "${appid}" ]||[ "${shortname}" == "mta" ]; then - currentopt+=( "${cmd_force_update[@]}" ) +if [ "${shortname}" == "jk2" ]||[ "${engine}" != "idtech3" ];then + if [ "${engine}" != "quake" ]&&[ "${engine}" != "idtech2" ]&&[ "${engine}" != "iw2.0" ]&&[ "${engine}" != "iw3.0" ]&&[ "${shortname}" != "bf1942" ]&&[ "${shortname}" != "bfv" ]&&[ "${shortname}" != "samp" ]; then + currentopt+=( "${cmd_update[@]}" ) + # force update for SteamCMD only or MTA. + if [ "${appid}" ]||[ "${shortname}" == "mta" ]; then + currentopt+=( "${cmd_force_update[@]}" ) + fi fi fi diff --git a/lgsm/functions/info_config.sh b/lgsm/functions/info_config.sh index f07293ae3..25984997d 100644 --- a/lgsm/functions/info_config.sh +++ b/lgsm/functions/info_config.sh @@ -680,6 +680,27 @@ fn_info_config_quake3(){ fi } +fn_info_config_jk2(){ + if [ ! -f "${servercfgfullpath}" ]; then + rconpassword="${unavailable}" + servername="${unavailable}" + serverpassword="${unavailable}" + maxplayers="${zero}" + else + rconpassword=$(grep "seta rconpassword" "${servercfgfullpath}" | sed -e 's/^[ \t]*//g' -e '/^\//d' -e 's/seta rconpassword//g' | tr -d '=\";,:' | sed -e 's/^[ \t]*//' -e 's/[ \t]*$//') + servername=$(grep "seta sv_hostname" "${servercfgfullpath}" | sed -e 's/^[ \t]*//g' -e '/^\//d' -e 's/seta sv_hostname//g' | tr -d '=\";,:' | sed -e 's/^[ \t]*//' -e 's/[ \t]*$//') + serverpassword=$(grep "seta g_password" "${servercfgfullpath}" | sed -e 's/^[ \t]*//g' -e '/^\//d' -e 's/seta g_password//g' | tr -d '=\";,:' | sed -e 's/^[ \t]*//' -e 's/[ \t]*$//') + maxplayers=$(grep "seta sv_maxclients" "${servercfgfullpath}" | grep -v "#" | tr -cd '[:digit:]') + serverversion=$(grep "seta mv_serverversion" "${servercfgfullpath}" | sed -e 's/^[ \t]*//g' -e '/^\//d' -e 's/seta mv_serverversion//g' | tr -d '=\";,:' | sed -e 's/^[ \t]*//' -e 's/[ \t]*$//') + + # Not Set + rconpassword=${rconpassword:-"NOT SET"} + servername=${servername:-"NOT SET"} + serverpassword=${serverpassword:-"NOT SET"} + maxplayers=${maxplayers:-"0"} + fi +} + fn_info_config_quakelive(){ if [ ! -f "${servercfgfullpath}" ]; then rconpassword="${unavailable}" @@ -1570,6 +1591,9 @@ elif [ "${shortname}" == "q3" ]; then # Quake Live elif [ "${shortname}" == "ql" ]; then fn_info_config_quakelive +# Jedi Knight II: Jedi Outcast +elif [ "${shortname}" == "jk2" ]; then + fn_info_config_jk2 # Minecraft elif [ "${shortname}" == "mc" ]; then fn_info_config_minecraft diff --git a/lgsm/functions/info_messages.sh b/lgsm/functions/info_messages.sh index 4dcd5aae3..d82462314 100644 --- a/lgsm/functions/info_messages.sh +++ b/lgsm/functions/info_messages.sh @@ -377,6 +377,11 @@ fn_info_message_gameserver(){ echo -e "${lightblue}Map rotation:\t${default}${randommap}" fi + # Server Version (Jedi Knight II: Jedi Outcast) + if [ -n "${serverversion}" ]; then + echo -e "${lightblue}Server Version:\t${default}${serverversion}" + fi + # Listed on Master server if [ -n "${displaymasterserver}" ]; then if [ "${displaymasterserver}" == "true" ]; then @@ -820,6 +825,15 @@ fn_info_message_inss(){ } | column -s $'\t' -t } + fn_info_message_jk2(){ + echo -e "netstat -atunp | grep jk2mvded" + echo -e "" + { + echo -e "DESCRIPTION\tDIRECTION\tPORT\tPROTOCOL" + echo -e "> Game\tINBOUND\t${port}\tudp" + } | column -s $'\t' -t + } + fn_info_message_justcause2(){ echo -e "netstat -atunp | grep Jcmp-Server" echo -e "" @@ -1456,6 +1470,8 @@ fn_info_message_select_engine(){ fn_info_message_hurtworld elif [ "${shortname}" == "inss" ]; then fn_info_message_inss + elif [ "${shortname}" == "jk2" ]; then + fn_info_message_jk2 elif [ "${shortname}" == "jc2" ]; then fn_info_message_justcause2 elif [ "${shortname}" == "jc3" ]; then diff --git a/lgsm/functions/info_parms.sh b/lgsm/functions/info_parms.sh index f30d90020..809d2cfc6 100644 --- a/lgsm/functions/info_parms.sh +++ b/lgsm/functions/info_parms.sh @@ -67,12 +67,15 @@ fn_info_parms_inss(){ maxplayers=${maxplayers:-"0"} } +fn_info_parms_jk2(){ + queryport=${port} +} + fn_info_parms_kf2(){ queryport=${queryport:-"0"} defaultmap=${defaultmap:-"NOT SET"} } - fn_info_parms_mordhau(){ port=${port:-"0"} queryport=${queryport:-"0"} @@ -246,6 +249,8 @@ elif [ "${shortname}" == "fctr" ]; then fn_info_parms_factorio elif [ "${shortname}" == "inss" ]; then fn_info_parms_inss +elif [ "${shortname}" == "jk2" ]; then + fn_info_parms_jk2 elif [ "${shortname}" == "kf2" ]; then fn_info_parms_kf2 elif [ "${shortname}" == "mohaa" ]; then diff --git a/lgsm/functions/install_config.sh b/lgsm/functions/install_config.sh index e57b2daac..63589b81c 100644 --- a/lgsm/functions/install_config.sh +++ b/lgsm/functions/install_config.sh @@ -626,6 +626,12 @@ elif [ "${shortname}" == "ql" ]; then fn_default_config_remote fn_set_config_vars fn_list_config_locations +elif [ "${shortname}" == "jk2" ]; then + gamedirname="JediKnightIIJediOutcast" + array_configs+=( server.cfg ) + fn_fetch_default_config + fn_default_config_remote + fn_set_config_vars elif [ "${shortname}" == "qw" ]; then gamedirname="QuakeWorld" array_configs+=( server.cfg ) diff --git a/lgsm/functions/install_server_files.sh b/lgsm/functions/install_server_files.sh index 4f651c2e1..979a32805 100644 --- a/lgsm/functions/install_server_files.sh +++ b/lgsm/functions/install_server_files.sh @@ -91,6 +91,8 @@ elif [ "${shortname}" == "mta" ]; then elif [ "${shortname}" == "fctr" ]; then update_factorio.sh install_factorio_save.sh +elif [ "${shortname}" == "jk2" ]; then + update_jediknight2.sh elif [ -z "${appid}" ]||[ "${shortname}" == "ahl" ]||[ "${shortname}" == "bd" ]||[ "${shortname}" == "bb" ]||[ "${shortname}" == "ges" ]||[ "${shortname}" == "ns" ]||[ "${shortname}" == "sfc" ]||[ "${shortname}" == "ts" ]||[ "${shortname}" == "vs" ]||[ "${shortname}" == "zmr" ]; then if [ "${shortname}" == "ut" ]; then install_eula.sh diff --git a/lgsm/functions/update_factorio.sh b/lgsm/functions/update_factorio.sh index ae4bdbaa5..ded4d8206 100644 --- a/lgsm/functions/update_factorio.sh +++ b/lgsm/functions/update_factorio.sh @@ -43,7 +43,7 @@ fn_update_factorio_localbuild(){ fn_update_factorio_remotebuild(){ # Gets remote build info. remotebuild=$(curl -s "https://factorio.com/get-download/${downloadbranch}/headless/${factorioarch}" | grep -o '[0-9]\.[0-9]\{1,\}\.[0-9]\{1,\}' | head -1) - if [ "${installer}" != "1" ]; then + if [ "${firstcommandname}" != "INSTALL" ]; then fn_print_dots "Checking remote build: ${remotelocation}" # Checks if remotebuild variable has been set. if [ -z "${remotebuild}" ]||[ "${remotebuild}" == "null" ]; then @@ -148,7 +148,7 @@ else downloadbranch="${branch}" fi -if [ "${installer}" == "1" ]; then +if [ "${firstcommandname}" == "INSTALL" ]; then fn_update_factorio_remotebuild fn_update_factorio_dl else diff --git a/lgsm/functions/update_jediknight2.sh b/lgsm/functions/update_jediknight2.sh new file mode 100644 index 000000000..c2bdca1b6 --- /dev/null +++ b/lgsm/functions/update_jediknight2.sh @@ -0,0 +1,171 @@ +#!/bin/bash +# LinuxGSM update_jk2.sh function +# Author: Daniel Gibbs +# Website: https://linuxgsm.com +# Description: Handles updating of jk2 servers. + +local commandname="UPDATE" +local commandaction="Update" +local function_selfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" + +fn_update_jk2_dl(){ + fn_fetch_file "https://github.com/mvdevs/jk2mv/releases/download/${remotebuild}/jk2mv-v${remotebuild}-dedicated.zip" "" "" "" "${tmpdir}" "jk2mv-${remotebuild}-dedicated.zip" "" "norun" "noforce" "nomd5" + fn_dl_extract "${tmpdir}" "jk2mv-${remotebuild}-dedicated.zip" "${tmpdir}/jk2mv-v${remotebuild}-dedicated" + echo -e "copying to ${serverfiles}...\c" + cp -R "${tmpdir}/jk2mv-v${remotebuild}-dedicated/linux-amd64/jk2mvded"* "${serverfiles}/GameData" + local exitcode=$? + if [ "${exitcode}" == "0" ]; then + fn_print_ok_eol_nl + fn_script_log_pass "Copying to ${serverfiles}" + fn_clear_tmp + else + fn_print_fail_eol_nl + fn_script_log_fatal "Copying to ${serverfiles}" + core_exit.sh + fi +} + +fn_update_jk2_localbuild(){ + # Gets local build info. + fn_print_dots "Checking local build: ${remotelocation}" + # Uses log file to gather info. + # Log is generated and cleared on startup but filled on shutdown. + localbuild=$(grep "\"version\"" "${consolelogdir}"/* 2>/dev/null | sed 's/.*://' | awk '{print $1}' | head -n 1) + if [ -z "${localbuild}" ]; then + fn_print_error "Checking local build: ${remotelocation}" + fn_print_error_nl "Checking local build: ${remotelocation}: no log files containing version info" + fn_print_info_nl "Checking local build: ${remotelocation}: forcing server restart" + fn_script_log_error "No log files containing version info" + fn_script_log_info "Forcing server restart" + + check_status.sh + # If server stopped. + if [ "${status}" == "0" ]; then + exitbypass=1 + command_start.sh + fn_firstcommand_reset + sleep 3 + exitbypass=1 + command_stop.sh + fn_firstcommand_reset + # If server started. + else + exitbypass=1 + command_stop.sh + fn_firstcommand_reset + fi + fi + + if [ -z "${localbuild}" ]; then + localbuild=$(grep Version "$(ls -tr "${consolelogdir}"/* 2>/dev/null)" | tail -1 | sed 's/.*Version //') + fi + + if [ -z "${localbuild}" ]; then + localbuild="0" + fn_print_error "Checking local build: ${remotelocation}: waiting for local build: missing local build info" + fn_script_log_error "Missing local build info" + fn_script_log_error "Set localbuild to 0" + else + fn_print_ok "Checking local build: ${remotelocation}" + fn_script_log_pass "Checking local build" + fi +} + +fn_update_jk2_remotebuild(){ + # Gets remote build info. + remotebuild=$(curl -s "https://api.github.com/repos/mvdevs/jk2mv/releases/latest" | grep dedicated.zip | tail -1 | awk -F"/" '{ print $8 }') + if [ "${firstcommandname}" != "INSTALL" ]; then + fn_print_dots "Checking remote build: ${remotelocation}" + # Checks if remotebuild variable has been set. + if [ -z "${remotebuild}" ]||[ "${remotebuild}" == "null" ]; then + fn_print_fail "Checking remote build: ${remotelocation}" + fn_script_log_fatal "Checking remote build" + core_exit.sh + else + fn_print_ok "Checking remote build: ${remotelocation}" + fn_script_log_pass "Checking remote build" + fi + else + # Checks if remotebuild variable has been set. + if [ -z "${remotebuild}" ]||[ "${remotebuild}" == "null" ]; then + fn_print_failure "Unable to get remote build" + fn_script_log_fatal "Unable to get remote build" + core_exit.sh + fi + fi +} + +fn_update_jk2_compare(){ + # Removes dots so if statement can compare version numbers. + fn_print_dots "Checking for update: ${remotelocation}" + localbuilddigit=$(echo -e "${localbuild}" | tr -cd '[:digit:]') + remotebuilddigit=$(echo -e "${remotebuild}" | tr -cd '[:digit:]') + if [ "${localbuilddigit}" -ne "${remotebuilddigit}" ]||[ "${forceupdate}" == "1" ]; then + fn_print_ok_nl "Checking for update: ${remotelocation}" + echo -en "\n" + echo -e "Update available" + echo -e "* Local build: ${red}${localbuild} ${jk2arch}${default}" + echo -e "* Remote build: ${green}${remotebuild} ${jk2arch}${default}" + echo -en "\n" + fn_script_log_info "Update available" + fn_script_log_info "Local build: ${localbuild} ${jk2arch}" + fn_script_log_info "Remote build: ${remotebuild} ${jk2arch}" + fn_script_log_info "${localbuild} > ${remotebuild}" + + unset updateonstart + check_status.sh + # If server stopped. + if [ "${status}" == "0" ]; then + exitbypass=1 + fn_update_jk2_dl + exitbypass=1 + command_start.sh + exitbypass=1 + command_stop.sh + fn_firstcommand_reset + # If server started. + else + fn_print_restart_warning + exitbypass=1 + command_stop.sh + fn_firstcommand_reset + exitbypass=1 + fn_update_jk2_dl + exitbypass=1 + command_start.sh + fn_firstcommand_reset + fi + date +%s > "${lockdir}/lastupdate.lock" + alert="update" + alert.sh + else + fn_print_ok_nl "Checking for update: ${remotelocation}" + echo -en "\n" + echo -e "No update available" + echo -e "* Local build: ${green}${localbuild} ${jk2arch}${default}" + echo -e "* Remote build: ${green}${remotebuild} ${jk2arch}${default}" + echo -en "\n" + fn_script_log_info "No update available" + fn_script_log_info "Local build: ${localbuild} ${jk2arch}" + fn_script_log_info "Remote build: ${remotebuild} ${jk2arch}" + fi +} + +# The location where the builds are checked and downloaded. +remotelocation="jk2mv.org" + +# Game server architecture. +jk2arch="x64" + +if [ "${firstcommandname}" == "INSTALL" ]; then + fn_update_jk2_remotebuild + fn_update_jk2_dl +else + update_steamcmd.sh + fn_print_dots "Checking for update" + fn_print_dots "Checking for update: ${remotelocation}" + fn_script_log_info "Checking for update: ${remotelocation}" + fn_update_jk2_localbuild + fn_update_jk2_remotebuild + fn_update_jk2_compare +fi diff --git a/lgsm/functions/update_minecraft.sh b/lgsm/functions/update_minecraft.sh index b74b71aab..9915f39b3 100644 --- a/lgsm/functions/update_minecraft.sh +++ b/lgsm/functions/update_minecraft.sh @@ -35,8 +35,8 @@ fn_update_minecraft_localbuild(){ # Gets local build info. fn_print_dots "Checking local build: ${remotelocation}" # Uses log file to gather info. - # Gives time for log file to generate. - if [ ! -f "${serverfiles}/logs/latest.log" ]; then + localbuild=$(grep Version "${consolelogdir}"/* 2>/dev/null | tail -1 | sed 's/.*Version //') + if [ -z "${localbuild}" ]; then fn_print_error "Checking local build: ${remotelocation}" fn_print_error_nl "Checking local build: ${remotelocation}: no log files containing version info" fn_print_info_nl "Checking local build: ${remotelocation}: forcing server restart" @@ -49,8 +49,8 @@ fn_update_minecraft_localbuild(){ command_start.sh fn_firstcommand_reset totalseconds=0 - # Check again, allow time to generate logs. - while [ ! -f "${serverfiles}/logs/latest.log" ]; do + localbuild=$(grep Version "${consolelogdir}"/* 2>/dev/null | tail -1 | sed 's/.*Version //') + while [ -z "${localbuild}" ]; do sleep 1 fn_print_info "Checking local build: ${remotelocation}: waiting for log file: ${totalseconds}" if [ -v "${loopignore}" ]; then @@ -58,45 +58,18 @@ fn_update_minecraft_localbuild(){ fn_script_log_info "Waiting for log file to generate" fi + localbuild=$(grep Version "$(ls -tr "${consolelogdir}"/* 2>/dev/null)" | tail -1 | sed 's/.*Version //') if [ "${totalseconds}" -gt "120" ]; then localbuild="0" - fn_print_error "Checking local build: ${remotelocation}: waiting for log file: missing log file" - fn_script_log_error "Missing log file" - fn_script_log_error "Set localbuild to 0" - fi - - totalseconds=$((totalseconds + 1)) - done - fi - - if [ -z "${localbuild}" ]; then - localbuild=$(grep version "${serverfiles}/logs/latest.log" | grep -Eo '((\.)?[0-9]{1,3}){1,3}\.[0-9]{1,3}(-pre[0-9]+)?|([0-9]+w[0-9]+[a-z])') - fi - - if [ -z "${localbuild}" ]; then - # Gives time for var to generate. - totalseconds=0 - for seconds in {1..120}; do - fn_print_info "Checking local build: ${remotelocation}: waiting for local build: ${totalseconds}" - if [ -z "${loopignore}" ]; then - loopignore=1 - fn_script_log_info "Waiting for local build to generate" - fi - localbuild=$(cat "${serverfiles}/logs/latest.log" 2> /dev/null | grep version | grep -Eo '((\.)?[0-9]{1,3}){1,3}\.[0-9]{1,3}(-pre[0-9]+)?|([0-9]+w[0-9]+[a-z])') - if [ "${localbuild}" ]||[ "${seconds}" == "120" ]; then - break + fn_print_error "Checking local build: ${remotelocation}: waiting for log file" + fn_script_log_error "Local build did not generate" + fn_script_log_error "Required log file may be missing" + fn_script_log_error "Local build set to 0" fi - sleep 1 totalseconds=$((totalseconds + 1)) done fi - - if [ -z "${localbuild}" ]; then - localbuild="0" - fn_print_error "Checking local build: ${remotelocation}: waiting for local build: missing local build info" - fn_script_log_error "Missing local build info" - fn_script_log_error "Set localbuild to 0" - else + if [ "${localbuild}" != "0" ]; then fn_print_ok "Checking local build: ${remotelocation}" fn_script_log_pass "Checking local build" fi @@ -110,7 +83,7 @@ fn_update_minecraft_remotebuild(){ remotebuild=$(curl -s "https://launchermeta.${remotelocation}/mc/game/version_manifest.json" | jq -r '.versions[0].id') fi - if [ "${installer}" != "1" ]; then + if [ "${firstcommandname}" != "INSTALL" ]; then fn_print_dots "Checking remote build: ${remotelocation}" # Checks if remotebuild variable has been set. if [ -z "${remotebuild}" ]||[ "${remotebuild}" == "null" ]; then @@ -197,7 +170,7 @@ fn_update_minecraft_compare(){ # The location where the builds are checked and downloaded. remotelocation="mojang.com" -if [ "${installer}" == "1" ]; then +if [ "${firstcommandname}" == "INSTALL" ]; then fn_update_minecraft_remotebuild fn_update_minecraft_dl else diff --git a/lgsm/functions/update_minecraft_bedrock.sh b/lgsm/functions/update_minecraft_bedrock.sh index 8c90d5efb..925e85635 100644 --- a/lgsm/functions/update_minecraft_bedrock.sh +++ b/lgsm/functions/update_minecraft_bedrock.sh @@ -10,7 +10,7 @@ fn_update_minecraft_dl(){ latestmcbuildurl=$(curl -s "https://www.minecraft.net/en-us/download/server/bedrock/" | grep -o 'https://minecraft.azureedge.net/bin-linux/[^"]*zip') fn_fetch_file "${latestmcbuildurl}" "" "" "" "${tmpdir}" "bedrock_server.${remotebuild}.zip" echo -e "Extracting to ${serverfiles}...\c" - if [ "${installer}" == "1" ]; then + if [ "${firstcommandname}" == "INSTALL" ]; then unzip -oq "${tmpdir}/bedrock_server.${remotebuild}.zip" -x "server.properties" -d "${serverfiles}" else unzip -oq "${tmpdir}/bedrock_server.${remotebuild}.zip" -x "permissions.json" "server.properties" "whitelist.json" -d "${serverfiles}" @@ -78,7 +78,7 @@ fn_update_minecraft_localbuild(){ fn_update_minecraft_remotebuild(){ # Gets remote build info. remotebuild=$(curl -s "https://www.minecraft.net/en-us/download/server/bedrock/" | grep -o 'https://minecraft.azureedge.net/bin-linux/[^"]*' | sed 's/.*\///' | grep -Eo "[.0-9]+[0-9]") - if [ "${installer}" != "1" ]; then + if [ "${firstcommandname}" != "INSTALL" ]; then fn_print_dots "Checking remote build: ${remotelocation}" # Checks if remotebuild variable has been set. if [ -z "${remotebuild}" ]||[ "${remotebuild}" == "null" ]; then @@ -158,7 +158,7 @@ fn_update_minecraft_compare(){ # The location where the builds are checked and downloaded. remotelocation="minecraft.net" -if [ "${installer}" == "1" ]; then +if [ "${firstcommandname}" == "INSTALL" ]; then fn_update_minecraft_remotebuild fn_update_minecraft_dl else diff --git a/lgsm/functions/update_mta.sh b/lgsm/functions/update_mta.sh index d15d9457b..bb5f744ea 100644 --- a/lgsm/functions/update_mta.sh +++ b/lgsm/functions/update_mta.sh @@ -101,7 +101,7 @@ fn_update_mta_remotebuild(){ minorversion=$(curl -s https://raw.githubusercontent.com/multitheftauto/mtasa-blue/master/Server/version.h | grep "#define MTASA_VERSION_MINOR" | awk '{ print $3 }' | sed 's/\r//g') maintenanceversion=$(curl -s https://raw.githubusercontent.com/multitheftauto/mtasa-blue/master/Server/version.h | grep "#define MTASA_VERSION_MAINTENANCE" | awk '{ print $3 }' | sed 's/\r//g') remotebuild="${majorversion}.${minorversion}.${maintenanceversion}" - if [ "${installer}" != "1" ]; then + if [ "${firstcommandname}" != "INSTALL" ]; then fn_print_dots "Checking remote build: ${remotelocation}" # Checks if remotebuild variable has been set. if [ -z "${remotebuild}" ]||[ "${remotebuild}" == "null" ]; then @@ -187,7 +187,7 @@ fn_update_mta_compare(){ # The location where the builds are checked and downloaded. remotelocation="linux.mtasa.com" -if [ "${installer}" == "1" ]; then +if [ "${firstcommandname}" == "INSTALL" ]; then fn_update_mta_remotebuild fn_update_mta_dl else diff --git a/lgsm/functions/update_mumble.sh b/lgsm/functions/update_mumble.sh index 6b3fd19d0..dfe8b317a 100644 --- a/lgsm/functions/update_mumble.sh +++ b/lgsm/functions/update_mumble.sh @@ -43,7 +43,7 @@ fn_update_mumble_localbuild(){ fn_update_mumble_remotebuild(){ # Gets remote build info. remotebuild=$(curl -s "https://api.github.com/repos/mumble-voip/mumble/releases/latest" | grep 'murmur-static_x86.*\.bz2"' | tail -1 | awk -F"/" '{ print $8 }') - if [ "${installer}" != "1" ]; then + if [ "${firstcommandname}" != "INSTALL" ]; then fn_print_dots "Checking remote build: ${remotelocation}" # Checks if remotebuild variable has been set. if [ -z "${remotebuild}" ]||[ "${remotebuild}" == "null" ]; then @@ -126,7 +126,7 @@ remotelocation="mumble.info" # Game server architecture. mumblearch="x86" -if [ "${installer}" == "1" ]; then +if [ "${firstcommandname}" == "INSTALL" ]; then fn_update_mumble_remotebuild fn_update_mumble_dl else diff --git a/lgsm/functions/update_steamcmd.sh b/lgsm/functions/update_steamcmd.sh index 348147b03..11ad0598c 100644 --- a/lgsm/functions/update_steamcmd.sh +++ b/lgsm/functions/update_steamcmd.sh @@ -48,7 +48,7 @@ fn_update_steamcmd_remotebuild(){ remotebuild=$(${steamcmdcommand} +login "${steamuser}" "${steampass}" +app_info_update 1 +app_info_print "${appid}" +quit | sed '1,/branches/d' | sed "1,/${branch}/d" | grep -m 1 buildid | tr -cd '[:digit:]') fi - if [ "${installer}" != "1" ]; then + if [ "${firstcommandname}" != "INSTALL" ]; then fn_print_dots "Checking remote build: ${remotelocation}" # Checks if remotebuild variable has been set. if [ -z "${remotebuild}" ]||[ "${remotebuild}" == "null" ]; then diff --git a/lgsm/functions/update_ts3.sh b/lgsm/functions/update_ts3.sh index 290ddf4d0..b4fc5d692 100644 --- a/lgsm/functions/update_ts3.sh +++ b/lgsm/functions/update_ts3.sh @@ -106,7 +106,7 @@ fn_update_ts3_remotebuild(){ elif [ "${arch}" == "x86" ]; then remotebuild=$(curl -s "https://www.teamspeak.com/versions/server.json" | jq -r '.linux.x86.version') fi - if [ "${installer}" != "1" ]; then + if [ "${firstcommandname}" != "INSTALL" ]; then fn_print_dots "Checking remote build: ${remotelocation}" # Checks if remotebuild variable has been set. if [ -z "${remotebuild}" ]||[ "${remotebuild}" == "null" ]; then @@ -197,7 +197,7 @@ fi # The location where the builds are checked and downloaded. remotelocation="teamspeak.com" -if [ "${installer}" == "1" ]; then +if [ "${firstcommandname}" == "INSTALL" ]; then fn_update_ts3_remotebuild fn_update_ts3_dl else From 527b74f024645cc84a4b1d9d0b497f94108e5612 Mon Sep 17 00:00:00 2001 From: DrPsychick Date: Sat, 29 Aug 2020 19:39:56 +0200 Subject: [PATCH 447/534] workaround for steamcmd console spam --- lgsm/functions/core_dl.sh | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/lgsm/functions/core_dl.sh b/lgsm/functions/core_dl.sh index a5c187df3..0493b8a86 100644 --- a/lgsm/functions/core_dl.sh +++ b/lgsm/functions/core_dl.sh @@ -60,29 +60,29 @@ fn_dl_steamcmd(){ if [ "${appid}" == "90" ]; then # If using a specific branch. if [ -n "${branch}" ]&&[ -n "${betapassword}" ]; then - ${unbuffer} ${steamcmdcommand} +login "${steamuser}" "${steampass}" +force_install_dir "${serverfiles}" +app_set_config 90 mod "${appidmod}" +app_update "${appid}" -beta "${branch}" -betapassword "${betapassword}" ${validate} +quit | tee -a "${lgsmlog}" "${steamcmdlog}" + ${unbuffer} ${steamcmdcommand} +login "${steamuser}" "${steampass}" +force_install_dir "${serverfiles}" +app_set_config 90 mod "${appidmod}" +app_update "${appid}" -beta "${branch}" -betapassword "${betapassword}" ${validate} +quit | uniq | tee -a "${lgsmlog}" "${steamcmdlog}" elif [ -n "${branch}" ]; then - ${unbuffer} ${steamcmdcommand} +login "${steamuser}" "${steampass}" +force_install_dir "${serverfiles}" +app_set_config 90 mod "${appidmod}" +app_update "${appid}" -beta "${branch}" ${validate} +quit | tee -a "${lgsmlog}" "${steamcmdlog}" + ${unbuffer} ${steamcmdcommand} +login "${steamuser}" "${steampass}" +force_install_dir "${serverfiles}" +app_set_config 90 mod "${appidmod}" +app_update "${appid}" -beta "${branch}" ${validate} +quit | uniq | tee -a "${lgsmlog}" "${steamcmdlog}" else - ${unbuffer} ${steamcmdcommand} +login "${steamuser}" "${steampass}" +force_install_dir "${serverfiles}" +app_set_config 90 mod "${appidmod}" +app_update "${appid}" ${validate} +quit | tee -a "${lgsmlog}" "${steamcmdlog}" + ${unbuffer} ${steamcmdcommand} +login "${steamuser}" "${steampass}" +force_install_dir "${serverfiles}" +app_set_config 90 mod "${appidmod}" +app_update "${appid}" ${validate} +quit | uniq | tee -a "${lgsmlog}" "${steamcmdlog}" fi # Force Windows Platform type. elif [ "${shortname}" == "ac" ]||[ "${shortname}" == "jk2" ]; then if [ -n "${branch}" ]&&[ -n "${betapassword}" ]; then - ${unbuffer} ${steamcmdcommand} +@sSteamCmdForcePlatformType windows +login "${steamuser}" "${steampass}" +force_install_dir "${serverfiles}" +app_update "${appid}" -beta "${branch}" -betapassword "${betapassword}" ${validate} +quit | tee -a "${lgsmlog}" "${steamcmdlog}" + ${unbuffer} ${steamcmdcommand} +@sSteamCmdForcePlatformType windows +login "${steamuser}" "${steampass}" +force_install_dir "${serverfiles}" +app_update "${appid}" -beta "${branch}" -betapassword "${betapassword}" ${validate} +quit | uniq | tee -a "${lgsmlog}" "${steamcmdlog}" elif [ -n "${branch}" ]; then - ${unbuffer} ${steamcmdcommand} +@sSteamCmdForcePlatformType windows +login "${steamuser}" "${steampass}" +force_install_dir "${serverfiles}" +app_update "${appid}" -beta "${branch}" ${validate} +quit | tee -a "${lgsmlog}" "${steamcmdlog}" + ${unbuffer} ${steamcmdcommand} +@sSteamCmdForcePlatformType windows +login "${steamuser}" "${steampass}" +force_install_dir "${serverfiles}" +app_update "${appid}" -beta "${branch}" ${validate} +quit | uniq | tee -a "${lgsmlog}" "${steamcmdlog}" else - ${unbuffer} ${steamcmdcommand} +@sSteamCmdForcePlatformType windows +login "${steamuser}" "${steampass}" +force_install_dir "${serverfiles}" +app_update "${appid}" ${validate} +quit | tee -a "${lgsmlog}" "${steamcmdlog}" + ${unbuffer} ${steamcmdcommand} +@sSteamCmdForcePlatformType windows +login "${steamuser}" "${steampass}" +force_install_dir "${serverfiles}" +app_update "${appid}" ${validate} +quit | uniq | tee -a "${lgsmlog}" "${steamcmdlog}" fi # All other servers. else if [ -n "${branch}" ]&&[ -n "${betapassword}" ]; then - ${unbuffer} ${steamcmdcommand} +login "${steamuser}" "${steampass}" +force_install_dir "${serverfiles}" +app_update "${appid}" -beta "${branch}" -betapassword "${betapassword}" ${validate} +quit | tee -a "${lgsmlog}" "${steamcmdlog}" + ${unbuffer} ${steamcmdcommand} +login "${steamuser}" "${steampass}" +force_install_dir "${serverfiles}" +app_update "${appid}" -beta "${branch}" -betapassword "${betapassword}" ${validate} +quit | uniq | tee -a "${lgsmlog}" "${steamcmdlog}" elif [ -n "${branch}" ]; then - ${unbuffer} ${steamcmdcommand} +login "${steamuser}" "${steampass}" +force_install_dir "${serverfiles}" +app_update "${appid}" -beta "${branch}" ${validate} +quit | tee -a "${lgsmlog}" "${steamcmdlog}" + ${unbuffer} ${steamcmdcommand} +login "${steamuser}" "${steampass}" +force_install_dir "${serverfiles}" +app_update "${appid}" -beta "${branch}" ${validate} +quit | uniq | tee -a "${lgsmlog}" "${steamcmdlog}" else - ${unbuffer} ${steamcmdcommand} +login "${steamuser}" "${steampass}" +force_install_dir "${serverfiles}" +app_update "${appid}" ${validate} +quit | tee -a "${lgsmlog}" "${steamcmdlog}" + ${unbuffer} ${steamcmdcommand} +login "${steamuser}" "${steampass}" +force_install_dir "${serverfiles}" +app_update "${appid}" ${validate} +quit | uniq | tee -a "${lgsmlog}" "${steamcmdlog}" fi fi From 33eb01b387e36067471171655aeed939fd1df671 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Sat, 12 Sep 2020 21:53:45 +0100 Subject: [PATCH 448/534] feat: remove requirement to input IP (#3015) Removes a long time annoyance for any users who have servers with multiple IP addresses. Now if the server has more than one IP address LinuxGSM will automatically try query all IP's until it gets a response. The default IP in settings will now be 0.0.0.0 this also helps resolve issues with source servers and LAN browser #2534 If required it is still possible to manually enter the IP address you want to use. Also, displayip setting is useful if you want your alert to specify an IP address IP variables for reference ip the default IP for the server if using 0.0.0.0 LinuxGSM will query all available IP addresses queryips a list of the ip addresses that will be queried queryip the ip address that is being queried displayip the ip/hostname you want to show up in alerts. if unset the internet-facing IP will be used extip the external internet-facing IP address --- .../config-lgsm/acserver/_default.cfg | 2 +- .../config-lgsm/ahl2server/_default.cfg | 2 +- .../config-lgsm/ahlserver/_default.cfg | 2 +- .../config-lgsm/arkserver/_default.cfg | 2 +- .../config-lgsm/arma3server/_default.cfg | 2 +- .../config-lgsm/avserver/_default.cfg | 2 +- .../config-lgsm/bb2server/_default.cfg | 2 +- .../config-lgsm/bbserver/_default.cfg | 2 +- .../config-lgsm/bdserver/_default.cfg | 2 +- .../config-lgsm/bf1942server/_default.cfg | 2 +- .../config-lgsm/bfvserver/_default.cfg | 2 +- .../config-lgsm/bmdmserver/_default.cfg | 2 +- .../config-lgsm/boserver/_default.cfg | 2 +- .../config-lgsm/bsserver/_default.cfg | 2 +- .../config-lgsm/bt1944server/_default.cfg | 2 +- .../config-lgsm/btserver/_default.cfg | 2 +- .../config-lgsm/ccserver/_default.cfg | 2 +- .../config-lgsm/cmwserver/_default.cfg | 2 +- .../config-lgsm/cod2server/_default.cfg | 2 +- .../config-lgsm/cod4server/_default.cfg | 2 +- .../config-lgsm/codserver/_default.cfg | 2 +- .../config-lgsm/coduoserver/_default.cfg | 2 +- .../config-lgsm/codwawserver/_default.cfg | 2 +- .../config-lgsm/csczserver/_default.cfg | 2 +- .../config-lgsm/csgoserver/_default.cfg | 2 +- .../config-lgsm/csserver/_default.cfg | 2 +- .../config-lgsm/cssserver/_default.cfg | 2 +- .../config-lgsm/dabserver/_default.cfg | 2 +- .../config-lgsm/dmcserver/_default.cfg | 2 +- .../config-lgsm/dodserver/_default.cfg | 2 +- .../config-lgsm/dodsserver/_default.cfg | 2 +- .../config-lgsm/doiserver/_default.cfg | 2 +- .../config-lgsm/dstserver/_default.cfg | 2 +- .../config-lgsm/dysserver/_default.cfg | 2 +- .../config-lgsm/ecoserver/_default.cfg | 2 +- .../config-lgsm/emserver/_default.cfg | 2 +- .../config-lgsm/etlserver/_default.cfg | 2 +- .../config-lgsm/fctrserver/_default.cfg | 2 +- .../config-lgsm/fofserver/_default.cfg | 2 +- .../config-lgsm/gesserver/_default.cfg | 2 +- .../config-lgsm/gmodserver/_default.cfg | 2 +- .../config-lgsm/hl2dmserver/_default.cfg | 2 +- .../config-lgsm/hldmserver/_default.cfg | 2 +- .../config-lgsm/hldmsserver/_default.cfg | 2 +- .../config-lgsm/hwserver/_default.cfg | 2 +- .../config-lgsm/insserver/_default.cfg | 2 +- .../config-lgsm/inssserver/_default.cfg | 2 +- .../config-lgsm/iosserver/_default.cfg | 2 +- .../config-lgsm/jc2server/_default.cfg | 2 +- .../config-lgsm/jc3server/_default.cfg | 2 +- .../config-lgsm/jk2server/_default.cfg | 2 +- .../config-lgsm/kf2server/_default.cfg | 2 +- .../config-lgsm/kfserver/_default.cfg | 2 +- .../config-lgsm/l4d2server/_default.cfg | 2 +- .../config-lgsm/l4dserver/_default.cfg | 2 +- .../config-lgsm/mcbserver/_default.cfg | 2 +- .../config-lgsm/mcserver/_default.cfg | 2 +- .../config-lgsm/mhserver/_default.cfg | 2 +- .../config-lgsm/mohaaserver/_default.cfg | 2 +- .../config-lgsm/momserver/_default.cfg | 2 +- .../config-lgsm/mtaserver/_default.cfg | 2 +- .../config-lgsm/mumbleserver/_default.cfg | 2 +- .../config-lgsm/ndserver/_default.cfg | 2 +- .../config-lgsm/nmrihserver/_default.cfg | 2 +- .../config-lgsm/ns2cserver/_default.cfg | 2 +- .../config-lgsm/ns2server/_default.cfg | 2 +- .../config-lgsm/nsserver/_default.cfg | 2 +- .../config-lgsm/onsetserver/_default.cfg | 2 +- .../config-lgsm/opforserver/_default.cfg | 2 +- .../config-lgsm/pcserver/_default.cfg | 2 +- .../config-lgsm/pstbsserver/_default.cfg | 2 +- .../config-lgsm/pvkiiserver/_default.cfg | 2 +- .../config-lgsm/pzserver/_default.cfg | 2 +- .../config-lgsm/q2server/_default.cfg | 2 +- .../config-lgsm/q3server/_default.cfg | 2 +- .../config-lgsm/qlserver/_default.cfg | 2 +- .../config-lgsm/qwserver/_default.cfg | 2 +- .../config-lgsm/ricochetserver/_default.cfg | 2 +- .../config-lgsm/roserver/_default.cfg | 2 +- .../config-lgsm/rtcwserver/_default.cfg | 2 +- .../config-lgsm/rustserver/_default.cfg | 2 +- .../config-lgsm/rwserver/_default.cfg | 2 +- .../config-lgsm/sampserver/_default.cfg | 2 +- .../config-lgsm/sbotsserver/_default.cfg | 2 +- .../config-lgsm/sbserver/_default.cfg | 2 +- .../config-lgsm/sdtdserver/_default.cfg | 2 +- .../config-lgsm/sfcserver/_default.cfg | 2 +- .../config-lgsm/sof2server/_default.cfg | 2 +- .../config-lgsm/solserver/_default.cfg | 2 +- .../config-lgsm/squadserver/_default.cfg | 2 +- .../config-lgsm/ss3server/_default.cfg | 2 +- .../config-lgsm/stserver/_default.cfg | 2 +- .../config-lgsm/svenserver/_default.cfg | 2 +- .../config-lgsm/terrariaserver/_default.cfg | 2 +- .../config-lgsm/tf2server/_default.cfg | 2 +- .../config-lgsm/tfcserver/_default.cfg | 2 +- .../config-lgsm/ts3server/_default.cfg | 2 +- .../config-lgsm/tsserver/_default.cfg | 2 +- .../config-lgsm/tuserver/_default.cfg | 2 +- .../config-lgsm/twserver/_default.cfg | 2 +- .../config-lgsm/untserver/_default.cfg | 2 +- .../config-lgsm/ut2k4server/_default.cfg | 2 +- .../config-lgsm/ut3server/_default.cfg | 2 +- .../config-lgsm/ut99server/_default.cfg | 2 +- .../config-lgsm/utserver/_default.cfg | 2 +- .../config-lgsm/vsserver/_default.cfg | 2 +- .../config-lgsm/wetserver/_default.cfg | 2 +- .../config-lgsm/wfserver/_default.cfg | 2 +- .../config-lgsm/wurmserver/_default.cfg | 2 +- .../config-lgsm/zmrserver/_default.cfg | 2 +- .../config-lgsm/zpsserver/_default.cfg | 2 +- lgsm/functions/check.sh | 27 ++-- lgsm/functions/check_deps.sh | 3 +- lgsm/functions/check_ip.sh | 97 +++--------- lgsm/functions/command_backup.sh | 11 +- lgsm/functions/command_debug.sh | 7 +- lgsm/functions/command_details.sh | 7 +- lgsm/functions/command_dev_detect_deps.sh | 9 +- lgsm/functions/command_dev_detect_glibc.sh | 3 +- lgsm/functions/command_dev_query_raw.sh | 78 +++++----- lgsm/functions/command_fastdl.sh | 9 +- lgsm/functions/command_monitor.sh | 145 +++++++++--------- lgsm/functions/command_postdetails.sh | 8 +- lgsm/functions/command_update_linuxgsm.sh | 3 +- lgsm/functions/core_dl.sh | 3 +- lgsm/functions/core_getopt.sh | 4 +- lgsm/functions/core_legacy.sh | 3 +- lgsm/functions/info_config.sh | 30 ++-- lgsm/functions/info_distro.sh | 3 +- lgsm/functions/info_messages.sh | 8 +- lgsm/functions/query_gamedig.sh | 8 +- linuxgsm.sh | 3 +- tests/tests_fctrserver.sh | 3 +- tests/tests_jc2server.sh | 3 +- tests/tests_mcserver.sh | 3 +- tests/tests_ts3server.sh | 3 +- 136 files changed, 317 insertions(+), 386 deletions(-) diff --git a/lgsm/config-default/config-lgsm/acserver/_default.cfg b/lgsm/config-default/config-lgsm/acserver/_default.cfg index acf67e9a9..cdb1ae59b 100644 --- a/lgsm/config-default/config-lgsm/acserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/acserver/_default.cfg @@ -130,7 +130,7 @@ stopmode="2" ## Query mode # 1: session only -# 2: gamedig + gsquery +# 2: gamedig (gsquery fallback) # 3: gamedig # 4: gsquery # 5: tcp diff --git a/lgsm/config-default/config-lgsm/ahl2server/_default.cfg b/lgsm/config-default/config-lgsm/ahl2server/_default.cfg index 64575486e..9eac5f899 100644 --- a/lgsm/config-default/config-lgsm/ahl2server/_default.cfg +++ b/lgsm/config-default/config-lgsm/ahl2server/_default.cfg @@ -127,7 +127,7 @@ stopmode="3" ## Query mode # 1: session only -# 2: gamedig + gsquery +# 2: gamedig (gsquery fallback) # 3: gamedig # 4: gsquery # 5: tcp diff --git a/lgsm/config-default/config-lgsm/ahlserver/_default.cfg b/lgsm/config-default/config-lgsm/ahlserver/_default.cfg index 63a7079c5..b7409c8b6 100644 --- a/lgsm/config-default/config-lgsm/ahlserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/ahlserver/_default.cfg @@ -132,7 +132,7 @@ stopmode="9" ## Query mode # 1: session only -# 2: gamedig + gsquery +# 2: gamedig (gsquery fallback) # 3: gamedig # 4: gsquery # 5: tcp diff --git a/lgsm/config-default/config-lgsm/arkserver/_default.cfg b/lgsm/config-default/config-lgsm/arkserver/_default.cfg index f604e1c87..c83a5f28e 100644 --- a/lgsm/config-default/config-lgsm/arkserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/arkserver/_default.cfg @@ -134,7 +134,7 @@ stopmode="2" ## Query mode # 1: session only -# 2: gamedig + gsquery +# 2: gamedig (gsquery fallback) # 3: gamedig # 4: gsquery # 5: tcp diff --git a/lgsm/config-default/config-lgsm/arma3server/_default.cfg b/lgsm/config-default/config-lgsm/arma3server/_default.cfg index 7a200ed62..cc5830610 100644 --- a/lgsm/config-default/config-lgsm/arma3server/_default.cfg +++ b/lgsm/config-default/config-lgsm/arma3server/_default.cfg @@ -147,7 +147,7 @@ stopmode="2" ## Query mode # 1: session only -# 2: gamedig + gsquery +# 2: gamedig (gsquery fallback) # 3: gamedig # 4: gsquery # 5: tcp diff --git a/lgsm/config-default/config-lgsm/avserver/_default.cfg b/lgsm/config-default/config-lgsm/avserver/_default.cfg index 88a79d8ae..78cde5552 100644 --- a/lgsm/config-default/config-lgsm/avserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/avserver/_default.cfg @@ -130,7 +130,7 @@ stopmode="10" ## Query mode # 1: session only -# 2: gamedig + gsquery +# 2: gamedig (gsquery fallback) # 3: gamedig # 4: gsquery # 5: tcp diff --git a/lgsm/config-default/config-lgsm/bb2server/_default.cfg b/lgsm/config-default/config-lgsm/bb2server/_default.cfg index 92c29ea53..4709e8ebc 100644 --- a/lgsm/config-default/config-lgsm/bb2server/_default.cfg +++ b/lgsm/config-default/config-lgsm/bb2server/_default.cfg @@ -137,7 +137,7 @@ stopmode="3" ## Query mode # 1: session only -# 2: gamedig + gsquery +# 2: gamedig (gsquery fallback) # 3: gamedig # 4: gsquery # 5: tcp diff --git a/lgsm/config-default/config-lgsm/bbserver/_default.cfg b/lgsm/config-default/config-lgsm/bbserver/_default.cfg index 8db5ec125..4cc8a01c0 100644 --- a/lgsm/config-default/config-lgsm/bbserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/bbserver/_default.cfg @@ -132,7 +132,7 @@ stopmode="9" ## Query mode # 1: session only -# 2: gamedig + gsquery +# 2: gamedig (gsquery fallback) # 3: gamedig # 4: gsquery # 5: tcp diff --git a/lgsm/config-default/config-lgsm/bdserver/_default.cfg b/lgsm/config-default/config-lgsm/bdserver/_default.cfg index 33c08a930..e9ee37c35 100644 --- a/lgsm/config-default/config-lgsm/bdserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/bdserver/_default.cfg @@ -131,7 +131,7 @@ stopmode="9" ## Query mode # 1: session only -# 2: gamedig + gsquery +# 2: gamedig (gsquery fallback) # 3: gamedig # 4: gsquery # 5: tcp diff --git a/lgsm/config-default/config-lgsm/bf1942server/_default.cfg b/lgsm/config-default/config-lgsm/bf1942server/_default.cfg index b80448fec..8ea237c41 100644 --- a/lgsm/config-default/config-lgsm/bf1942server/_default.cfg +++ b/lgsm/config-default/config-lgsm/bf1942server/_default.cfg @@ -115,7 +115,7 @@ stopmode="2" ## Query mode # 1: session only -# 2: gamedig + gsquery +# 2: gamedig (gsquery fallback) # 3: gamedig # 4: gsquery # 5: tcp diff --git a/lgsm/config-default/config-lgsm/bfvserver/_default.cfg b/lgsm/config-default/config-lgsm/bfvserver/_default.cfg index f3a969f23..d38d13fcd 100644 --- a/lgsm/config-default/config-lgsm/bfvserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/bfvserver/_default.cfg @@ -115,7 +115,7 @@ stopmode="3" ## Query mode # 1: session only -# 2: gamedig + gsquery +# 2: gamedig (gsquery fallback) # 3: gamedig # 4: gsquery # 5: tcp diff --git a/lgsm/config-default/config-lgsm/bmdmserver/_default.cfg b/lgsm/config-default/config-lgsm/bmdmserver/_default.cfg index ded8adcaa..f9c08c2fd 100644 --- a/lgsm/config-default/config-lgsm/bmdmserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/bmdmserver/_default.cfg @@ -137,7 +137,7 @@ stopmode="3" ## Query mode # 1: session only -# 2: gamedig + gsquery +# 2: gamedig (gsquery fallback) # 3: gamedig # 4: gsquery # 5: tcp diff --git a/lgsm/config-default/config-lgsm/boserver/_default.cfg b/lgsm/config-default/config-lgsm/boserver/_default.cfg index fed729193..0c8d8aa3f 100644 --- a/lgsm/config-default/config-lgsm/boserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/boserver/_default.cfg @@ -130,7 +130,7 @@ stopmode="2" ## Query mode # 1: session only -# 2: gamedig + gsquery +# 2: gamedig (gsquery fallback) # 3: gamedig # 4: gsquery # 5: tcp diff --git a/lgsm/config-default/config-lgsm/bsserver/_default.cfg b/lgsm/config-default/config-lgsm/bsserver/_default.cfg index 8e5ba4e99..566ba4549 100644 --- a/lgsm/config-default/config-lgsm/bsserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/bsserver/_default.cfg @@ -141,7 +141,7 @@ stopmode="3" ## Query mode # 1: session only -# 2: gamedig + gsquery +# 2: gamedig (gsquery fallback) # 3: gamedig # 4: gsquery # 5: tcp diff --git a/lgsm/config-default/config-lgsm/bt1944server/_default.cfg b/lgsm/config-default/config-lgsm/bt1944server/_default.cfg index c9ce30d64..51611e63e 100644 --- a/lgsm/config-default/config-lgsm/bt1944server/_default.cfg +++ b/lgsm/config-default/config-lgsm/bt1944server/_default.cfg @@ -129,7 +129,7 @@ stopmode="2" ## Query mode # 1: session only -# 2: gamedig + gsquery +# 2: gamedig (gsquery fallback) # 3: gamedig # 4: gsquery # 5: tcp diff --git a/lgsm/config-default/config-lgsm/btserver/_default.cfg b/lgsm/config-default/config-lgsm/btserver/_default.cfg index 171ef438b..434e96fd8 100644 --- a/lgsm/config-default/config-lgsm/btserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/btserver/_default.cfg @@ -124,7 +124,7 @@ stopmode="7" ## Query mode # 1: session only -# 2: gamedig + gsquery +# 2: gamedig (gsquery fallback) # 3: gamedig # 4: gsquery # 5: tcp diff --git a/lgsm/config-default/config-lgsm/ccserver/_default.cfg b/lgsm/config-default/config-lgsm/ccserver/_default.cfg index 492cba01c..9ceaccefa 100644 --- a/lgsm/config-default/config-lgsm/ccserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/ccserver/_default.cfg @@ -132,7 +132,7 @@ stopmode="3" ## Query mode # 1: session only -# 2: gamedig + gsquery +# 2: gamedig (gsquery fallback) # 3: gamedig # 4: gsquery # 5: tcp diff --git a/lgsm/config-default/config-lgsm/cmwserver/_default.cfg b/lgsm/config-default/config-lgsm/cmwserver/_default.cfg index 8ef4dd04c..279db1e8e 100644 --- a/lgsm/config-default/config-lgsm/cmwserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/cmwserver/_default.cfg @@ -133,7 +133,7 @@ stopmode="2" ## Query mode # 1: session only -# 2: gamedig + gsquery +# 2: gamedig (gsquery fallback) # 3: gamedig # 4: gsquery # 5: tcp diff --git a/lgsm/config-default/config-lgsm/cod2server/_default.cfg b/lgsm/config-default/config-lgsm/cod2server/_default.cfg index 120f803b7..78721d3b2 100644 --- a/lgsm/config-default/config-lgsm/cod2server/_default.cfg +++ b/lgsm/config-default/config-lgsm/cod2server/_default.cfg @@ -118,7 +118,7 @@ stopmode="3" ## Query mode # 1: session only -# 2: gamedig + gsquery +# 2: gamedig (gsquery fallback) # 3: gamedig # 4: gsquery # 5: tcp diff --git a/lgsm/config-default/config-lgsm/cod4server/_default.cfg b/lgsm/config-default/config-lgsm/cod4server/_default.cfg index acdfa5b95..33397cc8c 100644 --- a/lgsm/config-default/config-lgsm/cod4server/_default.cfg +++ b/lgsm/config-default/config-lgsm/cod4server/_default.cfg @@ -118,7 +118,7 @@ stopmode="3" ## Query mode # 1: session only -# 2: gamedig + gsquery +# 2: gamedig (gsquery fallback) # 3: gamedig # 4: gsquery # 5: tcp diff --git a/lgsm/config-default/config-lgsm/codserver/_default.cfg b/lgsm/config-default/config-lgsm/codserver/_default.cfg index c3b9c4f77..383ff13a1 100644 --- a/lgsm/config-default/config-lgsm/codserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/codserver/_default.cfg @@ -118,7 +118,7 @@ stopmode="3" ## Query mode # 1: session only -# 2: gamedig + gsquery +# 2: gamedig (gsquery fallback) # 3: gamedig # 4: gsquery # 5: tcp diff --git a/lgsm/config-default/config-lgsm/coduoserver/_default.cfg b/lgsm/config-default/config-lgsm/coduoserver/_default.cfg index 55a52c111..6b597d709 100644 --- a/lgsm/config-default/config-lgsm/coduoserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/coduoserver/_default.cfg @@ -118,7 +118,7 @@ stopmode="3" ## Query mode # 1: session only -# 2: gamedig + gsquery +# 2: gamedig (gsquery fallback) # 3: gamedig # 4: gsquery # 5: tcp diff --git a/lgsm/config-default/config-lgsm/codwawserver/_default.cfg b/lgsm/config-default/config-lgsm/codwawserver/_default.cfg index e79aa1d29..36488256c 100644 --- a/lgsm/config-default/config-lgsm/codwawserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/codwawserver/_default.cfg @@ -118,7 +118,7 @@ stopmode="3" ## Query mode # 1: session only -# 2: gamedig + gsquery +# 2: gamedig (gsquery fallback) # 3: gamedig # 4: gsquery # 5: tcp diff --git a/lgsm/config-default/config-lgsm/csczserver/_default.cfg b/lgsm/config-default/config-lgsm/csczserver/_default.cfg index 50e6d2c4f..714e57a3c 100644 --- a/lgsm/config-default/config-lgsm/csczserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/csczserver/_default.cfg @@ -132,7 +132,7 @@ stopmode="9" ## Query mode # 1: session only -# 2: gamedig + gsquery +# 2: gamedig (gsquery fallback) # 3: gamedig # 4: gsquery # 5: tcp diff --git a/lgsm/config-default/config-lgsm/csgoserver/_default.cfg b/lgsm/config-default/config-lgsm/csgoserver/_default.cfg index a69aa9c29..ba0f6b891 100644 --- a/lgsm/config-default/config-lgsm/csgoserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/csgoserver/_default.cfg @@ -157,7 +157,7 @@ stopmode="3" ## Query mode # 1: session only -# 2: gamedig + gsquery +# 2: gamedig (gsquery fallback) # 3: gamedig # 4: gsquery # 5: tcp diff --git a/lgsm/config-default/config-lgsm/csserver/_default.cfg b/lgsm/config-default/config-lgsm/csserver/_default.cfg index 4191fb93b..9194e3c56 100644 --- a/lgsm/config-default/config-lgsm/csserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/csserver/_default.cfg @@ -132,7 +132,7 @@ stopmode="9" ## Query mode # 1: session only -# 2: gamedig + gsquery +# 2: gamedig (gsquery fallback) # 3: gamedig # 4: gsquery # 5: tcp diff --git a/lgsm/config-default/config-lgsm/cssserver/_default.cfg b/lgsm/config-default/config-lgsm/cssserver/_default.cfg index b17697cc8..0ab7d6b80 100644 --- a/lgsm/config-default/config-lgsm/cssserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/cssserver/_default.cfg @@ -137,7 +137,7 @@ stopmode="3" ## Query mode # 1: session only -# 2: gamedig + gsquery +# 2: gamedig (gsquery fallback) # 3: gamedig # 4: gsquery # 5: tcp diff --git a/lgsm/config-default/config-lgsm/dabserver/_default.cfg b/lgsm/config-default/config-lgsm/dabserver/_default.cfg index fa7fedc6c..04d09847a 100644 --- a/lgsm/config-default/config-lgsm/dabserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/dabserver/_default.cfg @@ -132,7 +132,7 @@ stopmode="3" ## Query mode # 1: session only -# 2: gamedig + gsquery +# 2: gamedig (gsquery fallback) # 3: gamedig # 4: gsquery # 5: tcp diff --git a/lgsm/config-default/config-lgsm/dmcserver/_default.cfg b/lgsm/config-default/config-lgsm/dmcserver/_default.cfg index 857bf11eb..e13f21166 100644 --- a/lgsm/config-default/config-lgsm/dmcserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/dmcserver/_default.cfg @@ -132,7 +132,7 @@ stopmode="9" ## Query mode # 1: session only -# 2: gamedig + gsquery +# 2: gamedig (gsquery fallback) # 3: gamedig # 4: gsquery # 5: tcp diff --git a/lgsm/config-default/config-lgsm/dodserver/_default.cfg b/lgsm/config-default/config-lgsm/dodserver/_default.cfg index 0b2344325..db82ec029 100644 --- a/lgsm/config-default/config-lgsm/dodserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/dodserver/_default.cfg @@ -132,7 +132,7 @@ stopmode="9" ## Query mode # 1: session only -# 2: gamedig + gsquery +# 2: gamedig (gsquery fallback) # 3: gamedig # 4: gsquery # 5: tcp diff --git a/lgsm/config-default/config-lgsm/dodsserver/_default.cfg b/lgsm/config-default/config-lgsm/dodsserver/_default.cfg index 8d87cc99f..cd06a0684 100644 --- a/lgsm/config-default/config-lgsm/dodsserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/dodsserver/_default.cfg @@ -132,7 +132,7 @@ stopmode="3" ## Query mode # 1: session only -# 2: gamedig + gsquery +# 2: gamedig (gsquery fallback) # 3: gamedig # 4: gsquery # 5: tcp diff --git a/lgsm/config-default/config-lgsm/doiserver/_default.cfg b/lgsm/config-default/config-lgsm/doiserver/_default.cfg index feac609b0..1f0554002 100644 --- a/lgsm/config-default/config-lgsm/doiserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/doiserver/_default.cfg @@ -133,7 +133,7 @@ stopmode="3" ## Query mode # 1: session only -# 2: gamedig + gsquery +# 2: gamedig (gsquery fallback) # 3: gamedig # 4: gsquery # 5: tcp diff --git a/lgsm/config-default/config-lgsm/dstserver/_default.cfg b/lgsm/config-default/config-lgsm/dstserver/_default.cfg index 8fd61ce69..a120e2373 100644 --- a/lgsm/config-default/config-lgsm/dstserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/dstserver/_default.cfg @@ -135,7 +135,7 @@ stopmode="2" ## Query mode # 1: session only -# 2: gamedig + gsquery +# 2: gamedig (gsquery fallback) # 3: gamedig # 4: gsquery # 5: tcp diff --git a/lgsm/config-default/config-lgsm/dysserver/_default.cfg b/lgsm/config-default/config-lgsm/dysserver/_default.cfg index 7f598f0dd..458a6665e 100644 --- a/lgsm/config-default/config-lgsm/dysserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/dysserver/_default.cfg @@ -137,7 +137,7 @@ stopmode="3" ## Query mode # 1: session only -# 2: gamedig + gsquery +# 2: gamedig (gsquery fallback) # 3: gamedig # 4: gsquery # 5: tcp diff --git a/lgsm/config-default/config-lgsm/ecoserver/_default.cfg b/lgsm/config-default/config-lgsm/ecoserver/_default.cfg index de041ca44..ceb0540cf 100644 --- a/lgsm/config-default/config-lgsm/ecoserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/ecoserver/_default.cfg @@ -124,7 +124,7 @@ stopmode="2" ## Query mode # 1: session only -# 2: gamedig + gsquery +# 2: gamedig (gsquery fallback) # 3: gamedig # 4: gsquery # 5: tcp diff --git a/lgsm/config-default/config-lgsm/emserver/_default.cfg b/lgsm/config-default/config-lgsm/emserver/_default.cfg index d74435af7..df8bef8b3 100644 --- a/lgsm/config-default/config-lgsm/emserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/emserver/_default.cfg @@ -137,7 +137,7 @@ stopmode="3" ## Query mode # 1: session only -# 2: gamedig + gsquery +# 2: gamedig (gsquery fallback) # 3: gamedig # 4: gsquery # 5: tcp diff --git a/lgsm/config-default/config-lgsm/etlserver/_default.cfg b/lgsm/config-default/config-lgsm/etlserver/_default.cfg index 27c48d8e0..11d5fc2d8 100644 --- a/lgsm/config-default/config-lgsm/etlserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/etlserver/_default.cfg @@ -112,7 +112,7 @@ stopmode="3" ## Query mode # 1: session only -# 2: gamedig + gsquery +# 2: gamedig (gsquery fallback) # 3: gamedig # 4: gsquery # 5: tcp diff --git a/lgsm/config-default/config-lgsm/fctrserver/_default.cfg b/lgsm/config-default/config-lgsm/fctrserver/_default.cfg index 75f8aba67..4f12c83b6 100644 --- a/lgsm/config-default/config-lgsm/fctrserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/fctrserver/_default.cfg @@ -123,7 +123,7 @@ stopmode="2" ## Query mode # 1: session only -# 2: gamedig + gsquery +# 2: gamedig (gsquery fallback) # 3: gamedig # 4: gsquery # 5: tcp diff --git a/lgsm/config-default/config-lgsm/fofserver/_default.cfg b/lgsm/config-default/config-lgsm/fofserver/_default.cfg index 244272169..4f4b907eb 100644 --- a/lgsm/config-default/config-lgsm/fofserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/fofserver/_default.cfg @@ -132,7 +132,7 @@ stopmode="3" ## Query mode # 1: session only -# 2: gamedig + gsquery +# 2: gamedig (gsquery fallback) # 3: gamedig # 4: gsquery # 5: tcp diff --git a/lgsm/config-default/config-lgsm/gesserver/_default.cfg b/lgsm/config-default/config-lgsm/gesserver/_default.cfg index 3c61a70a7..700a71ad1 100644 --- a/lgsm/config-default/config-lgsm/gesserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/gesserver/_default.cfg @@ -132,7 +132,7 @@ stopmode="3" ## Query mode # 1: session only -# 2: gamedig + gsquery +# 2: gamedig (gsquery fallback) # 3: gamedig # 4: gsquery # 5: tcp diff --git a/lgsm/config-default/config-lgsm/gmodserver/_default.cfg b/lgsm/config-default/config-lgsm/gmodserver/_default.cfg index 1b38d03c8..45fc88590 100644 --- a/lgsm/config-default/config-lgsm/gmodserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/gmodserver/_default.cfg @@ -148,7 +148,7 @@ stopmode="3" ## Query mode # 1: session only -# 2: gamedig + gsquery +# 2: gamedig (gsquery fallback) # 3: gamedig # 4: gsquery # 5: tcp diff --git a/lgsm/config-default/config-lgsm/hl2dmserver/_default.cfg b/lgsm/config-default/config-lgsm/hl2dmserver/_default.cfg index 0f5af7833..5f207ff02 100644 --- a/lgsm/config-default/config-lgsm/hl2dmserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/hl2dmserver/_default.cfg @@ -132,7 +132,7 @@ stopmode="3" ## Query mode # 1: session only -# 2: gamedig + gsquery +# 2: gamedig (gsquery fallback) # 3: gamedig # 4: gsquery # 5: tcp diff --git a/lgsm/config-default/config-lgsm/hldmserver/_default.cfg b/lgsm/config-default/config-lgsm/hldmserver/_default.cfg index 4824e8a91..c6fba105d 100644 --- a/lgsm/config-default/config-lgsm/hldmserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/hldmserver/_default.cfg @@ -131,7 +131,7 @@ stopmode="9" ## Query mode # 1: session only -# 2: gamedig + gsquery +# 2: gamedig (gsquery fallback) # 3: gamedig # 4: gsquery # 5: tcp diff --git a/lgsm/config-default/config-lgsm/hldmsserver/_default.cfg b/lgsm/config-default/config-lgsm/hldmsserver/_default.cfg index fdf37bfab..7aa944ee5 100644 --- a/lgsm/config-default/config-lgsm/hldmsserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/hldmsserver/_default.cfg @@ -132,7 +132,7 @@ stopmode="3" ## Query mode # 1: session only -# 2: gamedig + gsquery +# 2: gamedig (gsquery fallback) # 3: gamedig # 4: gsquery # 5: tcp diff --git a/lgsm/config-default/config-lgsm/hwserver/_default.cfg b/lgsm/config-default/config-lgsm/hwserver/_default.cfg index 29cb35f23..8ee43603a 100644 --- a/lgsm/config-default/config-lgsm/hwserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/hwserver/_default.cfg @@ -143,7 +143,7 @@ stopmode="2" ## Query mode # 1: session only -# 2: gamedig + gsquery +# 2: gamedig (gsquery fallback) # 3: gamedig # 4: gsquery # 5: tcp diff --git a/lgsm/config-default/config-lgsm/insserver/_default.cfg b/lgsm/config-default/config-lgsm/insserver/_default.cfg index acef3ddee..be88ff8ae 100644 --- a/lgsm/config-default/config-lgsm/insserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/insserver/_default.cfg @@ -138,7 +138,7 @@ stopmode="3" ## Query mode # 1: session only -# 2: gamedig + gsquery +# 2: gamedig (gsquery fallback) # 3: gamedig # 4: gsquery # 5: tcp diff --git a/lgsm/config-default/config-lgsm/inssserver/_default.cfg b/lgsm/config-default/config-lgsm/inssserver/_default.cfg index b21ed6691..5fbe96d8f 100644 --- a/lgsm/config-default/config-lgsm/inssserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/inssserver/_default.cfg @@ -139,7 +139,7 @@ stopmode="2" ## Query mode # 1: session only -# 2: gamedig + gsquery +# 2: gamedig (gsquery fallback) # 3: gamedig # 4: gsquery # 5: tcp diff --git a/lgsm/config-default/config-lgsm/iosserver/_default.cfg b/lgsm/config-default/config-lgsm/iosserver/_default.cfg index e2c135933..b7c731780 100644 --- a/lgsm/config-default/config-lgsm/iosserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/iosserver/_default.cfg @@ -132,7 +132,7 @@ stopmode="3" ## Query mode # 1: session only -# 2: gamedig + gsquery +# 2: gamedig (gsquery fallback) # 3: gamedig # 4: gsquery # 5: tcp diff --git a/lgsm/config-default/config-lgsm/jc2server/_default.cfg b/lgsm/config-default/config-lgsm/jc2server/_default.cfg index caf009a16..7a6338127 100644 --- a/lgsm/config-default/config-lgsm/jc2server/_default.cfg +++ b/lgsm/config-default/config-lgsm/jc2server/_default.cfg @@ -124,7 +124,7 @@ stopmode="2" ## Query mode # 1: session only -# 2: gamedig + gsquery +# 2: gamedig (gsquery fallback) # 3: gamedig # 4: gsquery # 5: tcp diff --git a/lgsm/config-default/config-lgsm/jc3server/_default.cfg b/lgsm/config-default/config-lgsm/jc3server/_default.cfg index 80f02dba3..ca219b745 100644 --- a/lgsm/config-default/config-lgsm/jc3server/_default.cfg +++ b/lgsm/config-default/config-lgsm/jc3server/_default.cfg @@ -124,7 +124,7 @@ stopmode="2" ## Query mode # 1: session only -# 2: gamedig + gsquery +# 2: gamedig (gsquery fallback) # 3: gamedig # 4: gsquery # 5: tcp diff --git a/lgsm/config-default/config-lgsm/jk2server/_default.cfg b/lgsm/config-default/config-lgsm/jk2server/_default.cfg index b7bc6b307..31d405cbf 100644 --- a/lgsm/config-default/config-lgsm/jk2server/_default.cfg +++ b/lgsm/config-default/config-lgsm/jk2server/_default.cfg @@ -117,7 +117,7 @@ stopmode="3" ## Query mode # 1: session only -# 2: gamedig + gsquery +# 2: gamedig (gsquery fallback) # 3: gamedig # 4: gsquery # 5: tcp diff --git a/lgsm/config-default/config-lgsm/kf2server/_default.cfg b/lgsm/config-default/config-lgsm/kf2server/_default.cfg index f0c546f6b..cb9794682 100644 --- a/lgsm/config-default/config-lgsm/kf2server/_default.cfg +++ b/lgsm/config-default/config-lgsm/kf2server/_default.cfg @@ -130,7 +130,7 @@ stopmode="2" ## Query mode # 1: session only -# 2: gamedig + gsquery +# 2: gamedig (gsquery fallback) # 3: gamedig # 4: gsquery # 5: tcp diff --git a/lgsm/config-default/config-lgsm/kfserver/_default.cfg b/lgsm/config-default/config-lgsm/kfserver/_default.cfg index 38964223b..98378fe2c 100644 --- a/lgsm/config-default/config-lgsm/kfserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/kfserver/_default.cfg @@ -136,7 +136,7 @@ stopmode="2" ## Query mode # 1: session only -# 2: gamedig + gsquery +# 2: gamedig (gsquery fallback) # 3: gamedig # 4: gsquery # 5: tcp diff --git a/lgsm/config-default/config-lgsm/l4d2server/_default.cfg b/lgsm/config-default/config-lgsm/l4d2server/_default.cfg index 2a0c0b5bb..541edf1bb 100644 --- a/lgsm/config-default/config-lgsm/l4d2server/_default.cfg +++ b/lgsm/config-default/config-lgsm/l4d2server/_default.cfg @@ -131,7 +131,7 @@ stopmode="3" ## Query mode # 1: session only -# 2: gamedig + gsquery +# 2: gamedig (gsquery fallback) # 3: gamedig # 4: gsquery # 5: tcp diff --git a/lgsm/config-default/config-lgsm/l4dserver/_default.cfg b/lgsm/config-default/config-lgsm/l4dserver/_default.cfg index e31e6f7f1..6904523e6 100644 --- a/lgsm/config-default/config-lgsm/l4dserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/l4dserver/_default.cfg @@ -131,7 +131,7 @@ stopmode="2" ## Query mode # 1: session only -# 2: gamedig + gsquery +# 2: gamedig (gsquery fallback) # 3: gamedig # 4: gsquery # 5: tcp diff --git a/lgsm/config-default/config-lgsm/mcbserver/_default.cfg b/lgsm/config-default/config-lgsm/mcbserver/_default.cfg index bbbea20ea..e450f1821 100644 --- a/lgsm/config-default/config-lgsm/mcbserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/mcbserver/_default.cfg @@ -115,7 +115,7 @@ stopmode="5" ## Query mode # 1: session only -# 2: gamedig + gsquery +# 2: gamedig (gsquery fallback) # 3: gamedig # 4: gsquery # 5: tcp diff --git a/lgsm/config-default/config-lgsm/mcserver/_default.cfg b/lgsm/config-default/config-lgsm/mcserver/_default.cfg index 094ef98bc..e1fb0e89e 100644 --- a/lgsm/config-default/config-lgsm/mcserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/mcserver/_default.cfg @@ -121,7 +121,7 @@ stopmode="5" ## Query mode # 1: session only -# 2: gamedig + gsquery +# 2: gamedig (gsquery fallback) # 3: gamedig # 4: gsquery # 5: tcp diff --git a/lgsm/config-default/config-lgsm/mhserver/_default.cfg b/lgsm/config-default/config-lgsm/mhserver/_default.cfg index 7c8163bed..feef4cd62 100644 --- a/lgsm/config-default/config-lgsm/mhserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/mhserver/_default.cfg @@ -132,7 +132,7 @@ stopmode="2" ## Query mode # 1: session only -# 2: gamedig + gsquery +# 2: gamedig (gsquery fallback) # 3: gamedig # 4: gsquery # 5: tcp diff --git a/lgsm/config-default/config-lgsm/mohaaserver/_default.cfg b/lgsm/config-default/config-lgsm/mohaaserver/_default.cfg index b625221fe..2819fea66 100644 --- a/lgsm/config-default/config-lgsm/mohaaserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/mohaaserver/_default.cfg @@ -117,7 +117,7 @@ stopmode="3" ## Query mode # 1: session only -# 2: gamedig + gsquery +# 2: gamedig (gsquery fallback) # 3: gamedig # 4: gsquery # 5: tcp diff --git a/lgsm/config-default/config-lgsm/momserver/_default.cfg b/lgsm/config-default/config-lgsm/momserver/_default.cfg index 059f9a257..f702289b0 100644 --- a/lgsm/config-default/config-lgsm/momserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/momserver/_default.cfg @@ -130,7 +130,7 @@ stopmode="2" ## Query mode # 1: session only -# 2: gamedig + gsquery +# 2: gamedig (gsquery fallback) # 3: gamedig # 4: gsquery # 5: tcp diff --git a/lgsm/config-default/config-lgsm/mtaserver/_default.cfg b/lgsm/config-default/config-lgsm/mtaserver/_default.cfg index 9c25257a5..f8c4017b6 100644 --- a/lgsm/config-default/config-lgsm/mtaserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/mtaserver/_default.cfg @@ -116,7 +116,7 @@ stopmode="4" ## Query mode # 1: session only -# 2: gamedig + gsquery +# 2: gamedig (gsquery fallback) # 3: gamedig # 4: gsquery # 5: tcp diff --git a/lgsm/config-default/config-lgsm/mumbleserver/_default.cfg b/lgsm/config-default/config-lgsm/mumbleserver/_default.cfg index 4c581f6a6..cabe64504 100644 --- a/lgsm/config-default/config-lgsm/mumbleserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/mumbleserver/_default.cfg @@ -115,7 +115,7 @@ stopmode="2" ## Query mode # 1: session only -# 2: gamedig + gsquery +# 2: gamedig (gsquery fallback) # 3: gamedig # 4: gsquery # 5: tcp diff --git a/lgsm/config-default/config-lgsm/ndserver/_default.cfg b/lgsm/config-default/config-lgsm/ndserver/_default.cfg index 2e5054c6a..1ece1feba 100644 --- a/lgsm/config-default/config-lgsm/ndserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/ndserver/_default.cfg @@ -132,7 +132,7 @@ stopmode="3" ## Query mode # 1: session only -# 2: gamedig + gsquery +# 2: gamedig (gsquery fallback) # 3: gamedig # 4: gsquery # 5: tcp diff --git a/lgsm/config-default/config-lgsm/nmrihserver/_default.cfg b/lgsm/config-default/config-lgsm/nmrihserver/_default.cfg index 181d0517a..8a24983f3 100644 --- a/lgsm/config-default/config-lgsm/nmrihserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/nmrihserver/_default.cfg @@ -137,7 +137,7 @@ stopmode="3" ## Query mode # 1: session only -# 2: gamedig + gsquery +# 2: gamedig (gsquery fallback) # 3: gamedig # 4: gsquery # 5: tcp diff --git a/lgsm/config-default/config-lgsm/ns2cserver/_default.cfg b/lgsm/config-default/config-lgsm/ns2cserver/_default.cfg index 74b00b848..320f0e09b 100644 --- a/lgsm/config-default/config-lgsm/ns2cserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/ns2cserver/_default.cfg @@ -139,7 +139,7 @@ stopmode="6" ## Query mode # 1: session only -# 2: gamedig + gsquery +# 2: gamedig (gsquery fallback) # 3: gamedig # 4: gsquery # 5: tcp diff --git a/lgsm/config-default/config-lgsm/ns2server/_default.cfg b/lgsm/config-default/config-lgsm/ns2server/_default.cfg index 2b5f3c1dd..3b8c313f0 100644 --- a/lgsm/config-default/config-lgsm/ns2server/_default.cfg +++ b/lgsm/config-default/config-lgsm/ns2server/_default.cfg @@ -143,7 +143,7 @@ stopmode="6" ## Query mode # 1: session only -# 2: gamedig + gsquery +# 2: gamedig (gsquery fallback) # 3: gamedig # 4: gsquery # 5: tcp diff --git a/lgsm/config-default/config-lgsm/nsserver/_default.cfg b/lgsm/config-default/config-lgsm/nsserver/_default.cfg index 34ff1af69..a508339b3 100644 --- a/lgsm/config-default/config-lgsm/nsserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/nsserver/_default.cfg @@ -132,7 +132,7 @@ stopmode="9" ## Query mode # 1: session only -# 2: gamedig + gsquery +# 2: gamedig (gsquery fallback) # 3: gamedig # 4: gsquery # 5: tcp diff --git a/lgsm/config-default/config-lgsm/onsetserver/_default.cfg b/lgsm/config-default/config-lgsm/onsetserver/_default.cfg index bccd2bc4d..77f9cb4f0 100644 --- a/lgsm/config-default/config-lgsm/onsetserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/onsetserver/_default.cfg @@ -124,7 +124,7 @@ stopmode="2" ## Query mode # 1: session only -# 2: gamedig + gsquery +# 2: gamedig (gsquery fallback) # 3: gamedig # 4: gsquery # 5: tcp diff --git a/lgsm/config-default/config-lgsm/opforserver/_default.cfg b/lgsm/config-default/config-lgsm/opforserver/_default.cfg index dbcaf4361..80e76e5ea 100644 --- a/lgsm/config-default/config-lgsm/opforserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/opforserver/_default.cfg @@ -132,7 +132,7 @@ stopmode="9" ## Query mode # 1: session only -# 2: gamedig + gsquery +# 2: gamedig (gsquery fallback) # 3: gamedig # 4: gsquery # 5: tcp diff --git a/lgsm/config-default/config-lgsm/pcserver/_default.cfg b/lgsm/config-default/config-lgsm/pcserver/_default.cfg index 3febc720f..ff85ac259 100644 --- a/lgsm/config-default/config-lgsm/pcserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/pcserver/_default.cfg @@ -124,7 +124,7 @@ stopmode="2" ## Query mode # 1: session only -# 2: gamedig + gsquery +# 2: gamedig (gsquery fallback) # 3: gamedig # 4: gsquery # 5: tcp diff --git a/lgsm/config-default/config-lgsm/pstbsserver/_default.cfg b/lgsm/config-default/config-lgsm/pstbsserver/_default.cfg index 45e57a515..8edf26d9a 100644 --- a/lgsm/config-default/config-lgsm/pstbsserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/pstbsserver/_default.cfg @@ -134,7 +134,7 @@ stopmode="2" ## Query mode # 1: session only -# 2: gamedig + gsquery +# 2: gamedig (gsquery fallback) # 3: gamedig # 4: gsquery # 5: tcp diff --git a/lgsm/config-default/config-lgsm/pvkiiserver/_default.cfg b/lgsm/config-default/config-lgsm/pvkiiserver/_default.cfg index 76ab134e5..ccc3d85ed 100644 --- a/lgsm/config-default/config-lgsm/pvkiiserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/pvkiiserver/_default.cfg @@ -132,7 +132,7 @@ stopmode="3" ## Query mode # 1: session only -# 2: gamedig + gsquery +# 2: gamedig (gsquery fallback) # 3: gamedig # 4: gsquery # 5: tcp diff --git a/lgsm/config-default/config-lgsm/pzserver/_default.cfg b/lgsm/config-default/config-lgsm/pzserver/_default.cfg index 36fe3df0b..c1c6f7954 100644 --- a/lgsm/config-default/config-lgsm/pzserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/pzserver/_default.cfg @@ -128,7 +128,7 @@ stopmode="3" ## Query mode # 1: session only -# 2: gamedig + gsquery +# 2: gamedig (gsquery fallback) # 3: gamedig # 4: gsquery # 5: tcp diff --git a/lgsm/config-default/config-lgsm/q2server/_default.cfg b/lgsm/config-default/config-lgsm/q2server/_default.cfg index a653278c0..9c867f99c 100644 --- a/lgsm/config-default/config-lgsm/q2server/_default.cfg +++ b/lgsm/config-default/config-lgsm/q2server/_default.cfg @@ -117,7 +117,7 @@ stopmode="3" ## Query mode # 1: session only -# 2: gamedig + gsquery +# 2: gamedig (gsquery fallback) # 3: gamedig # 4: gsquery # 5: tcp diff --git a/lgsm/config-default/config-lgsm/q3server/_default.cfg b/lgsm/config-default/config-lgsm/q3server/_default.cfg index 33b0e1c84..402331066 100644 --- a/lgsm/config-default/config-lgsm/q3server/_default.cfg +++ b/lgsm/config-default/config-lgsm/q3server/_default.cfg @@ -117,7 +117,7 @@ stopmode="3" ## Query mode # 1: session only -# 2: gamedig + gsquery +# 2: gamedig (gsquery fallback) # 3: gamedig # 4: gsquery # 5: tcp diff --git a/lgsm/config-default/config-lgsm/qlserver/_default.cfg b/lgsm/config-default/config-lgsm/qlserver/_default.cfg index 49b8c1e0e..6290a2276 100644 --- a/lgsm/config-default/config-lgsm/qlserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/qlserver/_default.cfg @@ -124,7 +124,7 @@ stopmode="3" ## Query mode # 1: session only -# 2: gamedig + gsquery +# 2: gamedig (gsquery fallback) # 3: gamedig # 4: gsquery # 5: tcp diff --git a/lgsm/config-default/config-lgsm/qwserver/_default.cfg b/lgsm/config-default/config-lgsm/qwserver/_default.cfg index f040b1aa5..33c34fb66 100644 --- a/lgsm/config-default/config-lgsm/qwserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/qwserver/_default.cfg @@ -116,7 +116,7 @@ stopmode="3" ## Query mode # 1: session only -# 2: gamedig + gsquery +# 2: gamedig (gsquery fallback) # 3: gamedig # 4: gsquery # 5: tcp diff --git a/lgsm/config-default/config-lgsm/ricochetserver/_default.cfg b/lgsm/config-default/config-lgsm/ricochetserver/_default.cfg index 99da25df5..e458fa153 100644 --- a/lgsm/config-default/config-lgsm/ricochetserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/ricochetserver/_default.cfg @@ -132,7 +132,7 @@ stopmode="9" ## Query mode # 1: session only -# 2: gamedig + gsquery +# 2: gamedig (gsquery fallback) # 3: gamedig # 4: gsquery # 5: tcp diff --git a/lgsm/config-default/config-lgsm/roserver/_default.cfg b/lgsm/config-default/config-lgsm/roserver/_default.cfg index 03d819bcd..d778b3252 100644 --- a/lgsm/config-default/config-lgsm/roserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/roserver/_default.cfg @@ -132,7 +132,7 @@ stopmode="2" ## Query mode # 1: session only -# 2: gamedig + gsquery +# 2: gamedig (gsquery fallback) # 3: gamedig # 4: gsquery # 5: tcp diff --git a/lgsm/config-default/config-lgsm/rtcwserver/_default.cfg b/lgsm/config-default/config-lgsm/rtcwserver/_default.cfg index 06133d695..55669f43a 100644 --- a/lgsm/config-default/config-lgsm/rtcwserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/rtcwserver/_default.cfg @@ -117,7 +117,7 @@ stopmode="3" ## Query mode # 1: session only -# 2: gamedig + gsquery +# 2: gamedig (gsquery fallback) # 3: gamedig # 4: gsquery # 5: tcp diff --git a/lgsm/config-default/config-lgsm/rustserver/_default.cfg b/lgsm/config-default/config-lgsm/rustserver/_default.cfg index 6e7ca328d..daa1e0551 100644 --- a/lgsm/config-default/config-lgsm/rustserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/rustserver/_default.cfg @@ -139,7 +139,7 @@ stopmode="2" ## Query mode # 1: session only -# 2: gamedig + gsquery +# 2: gamedig (gsquery fallback) # 3: gamedig # 4: gsquery # 5: tcp diff --git a/lgsm/config-default/config-lgsm/rwserver/_default.cfg b/lgsm/config-default/config-lgsm/rwserver/_default.cfg index 041dc0107..37284fd3e 100644 --- a/lgsm/config-default/config-lgsm/rwserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/rwserver/_default.cfg @@ -127,7 +127,7 @@ stopmode="3" ## Query mode # 1: session only -# 2: gamedig + gsquery +# 2: gamedig (gsquery fallback) # 3: gamedig # 4: gsquery # 5: tcp diff --git a/lgsm/config-default/config-lgsm/sampserver/_default.cfg b/lgsm/config-default/config-lgsm/sampserver/_default.cfg index a669e8882..fed8d87b8 100644 --- a/lgsm/config-default/config-lgsm/sampserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/sampserver/_default.cfg @@ -116,7 +116,7 @@ stopmode="2" ## Query mode # 1: session only -# 2: gamedig + gsquery +# 2: gamedig (gsquery fallback) # 3: gamedig # 4: gsquery # 5: tcp diff --git a/lgsm/config-default/config-lgsm/sbotsserver/_default.cfg b/lgsm/config-default/config-lgsm/sbotsserver/_default.cfg index ae1d16c4b..d5baffafb 100644 --- a/lgsm/config-default/config-lgsm/sbotsserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/sbotsserver/_default.cfg @@ -132,7 +132,7 @@ stopmode="2" ## Query mode # 1: session only -# 2: gamedig + gsquery +# 2: gamedig (gsquery fallback) # 3: gamedig # 4: gsquery # 5: tcp diff --git a/lgsm/config-default/config-lgsm/sbserver/_default.cfg b/lgsm/config-default/config-lgsm/sbserver/_default.cfg index 14bb93600..d3773e02d 100644 --- a/lgsm/config-default/config-lgsm/sbserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/sbserver/_default.cfg @@ -131,7 +131,7 @@ stopmode="2" ## Query mode # 1: session only -# 2: gamedig + gsquery +# 2: gamedig (gsquery fallback) # 3: gamedig # 4: gsquery # 5: tcp diff --git a/lgsm/config-default/config-lgsm/sdtdserver/_default.cfg b/lgsm/config-default/config-lgsm/sdtdserver/_default.cfg index 2eb5e007e..62d2779be 100644 --- a/lgsm/config-default/config-lgsm/sdtdserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/sdtdserver/_default.cfg @@ -127,7 +127,7 @@ stopmode="8" ## Query mode # 1: session only -# 2: gamedig + gsquery +# 2: gamedig (gsquery fallback) # 3: gamedig # 4: gsquery # 5: tcp diff --git a/lgsm/config-default/config-lgsm/sfcserver/_default.cfg b/lgsm/config-default/config-lgsm/sfcserver/_default.cfg index 5d3d83edb..ec99587b8 100644 --- a/lgsm/config-default/config-lgsm/sfcserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/sfcserver/_default.cfg @@ -132,7 +132,7 @@ stopmode="3" ## Query mode # 1: session only -# 2: gamedig + gsquery +# 2: gamedig (gsquery fallback) # 3: gamedig # 4: gsquery # 5: tcp diff --git a/lgsm/config-default/config-lgsm/sof2server/_default.cfg b/lgsm/config-default/config-lgsm/sof2server/_default.cfg index 6919bbbf7..a49704b3e 100644 --- a/lgsm/config-default/config-lgsm/sof2server/_default.cfg +++ b/lgsm/config-default/config-lgsm/sof2server/_default.cfg @@ -117,7 +117,7 @@ stopmode="3" ## Query mode # 1: session only -# 2: gamedig + gsquery +# 2: gamedig (gsquery fallback) # 3: gamedig # 4: gsquery # 5: tcp diff --git a/lgsm/config-default/config-lgsm/solserver/_default.cfg b/lgsm/config-default/config-lgsm/solserver/_default.cfg index fa5bfa59f..9fc313fbe 100644 --- a/lgsm/config-default/config-lgsm/solserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/solserver/_default.cfg @@ -123,7 +123,7 @@ stopmode="2" ## Query mode # 1: session only -# 2: gamedig + gsquery +# 2: gamedig (gsquery fallback) # 3: gamedig # 4: gsquery # 5: tcp diff --git a/lgsm/config-default/config-lgsm/squadserver/_default.cfg b/lgsm/config-default/config-lgsm/squadserver/_default.cfg index 42832bb53..eb37382c9 100644 --- a/lgsm/config-default/config-lgsm/squadserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/squadserver/_default.cfg @@ -129,7 +129,7 @@ stopmode="2" ## Query mode # 1: session only -# 2: gamedig + gsquery +# 2: gamedig (gsquery fallback) # 3: gamedig # 4: gsquery # 5: tcp diff --git a/lgsm/config-default/config-lgsm/ss3server/_default.cfg b/lgsm/config-default/config-lgsm/ss3server/_default.cfg index f4b8c6e25..ff8f810f4 100644 --- a/lgsm/config-default/config-lgsm/ss3server/_default.cfg +++ b/lgsm/config-default/config-lgsm/ss3server/_default.cfg @@ -128,7 +128,7 @@ stopmode="2" ## Query mode # 1: session only -# 2: gamedig + gsquery +# 2: gamedig (gsquery fallback) # 3: gamedig # 4: gsquery # 5: tcp diff --git a/lgsm/config-default/config-lgsm/stserver/_default.cfg b/lgsm/config-default/config-lgsm/stserver/_default.cfg index 598c20a9d..13527e213 100644 --- a/lgsm/config-default/config-lgsm/stserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/stserver/_default.cfg @@ -134,7 +134,7 @@ stopmode="2" ## Query mode # 1: session only -# 2: gamedig + gsquery +# 2: gamedig (gsquery fallback) # 3: gamedig # 4: gsquery # 5: tcp diff --git a/lgsm/config-default/config-lgsm/svenserver/_default.cfg b/lgsm/config-default/config-lgsm/svenserver/_default.cfg index 31d967d69..34be57330 100644 --- a/lgsm/config-default/config-lgsm/svenserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/svenserver/_default.cfg @@ -131,7 +131,7 @@ stopmode="9" ## Query mode # 1: session only -# 2: gamedig + gsquery +# 2: gamedig (gsquery fallback) # 3: gamedig # 4: gsquery # 5: tcp diff --git a/lgsm/config-default/config-lgsm/terrariaserver/_default.cfg b/lgsm/config-default/config-lgsm/terrariaserver/_default.cfg index 49dc74a35..5750b2875 100644 --- a/lgsm/config-default/config-lgsm/terrariaserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/terrariaserver/_default.cfg @@ -131,7 +131,7 @@ stopmode="7" ## Query mode # 1: session only -# 2: gamedig + gsquery +# 2: gamedig (gsquery fallback) # 3: gamedig # 4: gsquery # 5: tcp diff --git a/lgsm/config-default/config-lgsm/tf2server/_default.cfg b/lgsm/config-default/config-lgsm/tf2server/_default.cfg index e1fb148ed..24b18bdd0 100644 --- a/lgsm/config-default/config-lgsm/tf2server/_default.cfg +++ b/lgsm/config-default/config-lgsm/tf2server/_default.cfg @@ -137,7 +137,7 @@ stopmode="3" ## Query mode # 1: session only -# 2: gamedig + gsquery +# 2: gamedig (gsquery fallback) # 3: gamedig # 4: gsquery # 5: tcp diff --git a/lgsm/config-default/config-lgsm/tfcserver/_default.cfg b/lgsm/config-default/config-lgsm/tfcserver/_default.cfg index 8fccb16e3..1255b20de 100644 --- a/lgsm/config-default/config-lgsm/tfcserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/tfcserver/_default.cfg @@ -132,7 +132,7 @@ stopmode="9" ## Query mode # 1: session only -# 2: gamedig + gsquery +# 2: gamedig (gsquery fallback) # 3: gamedig # 4: gsquery # 5: tcp diff --git a/lgsm/config-default/config-lgsm/ts3server/_default.cfg b/lgsm/config-default/config-lgsm/ts3server/_default.cfg index 55dee80aa..147d4c94c 100644 --- a/lgsm/config-default/config-lgsm/ts3server/_default.cfg +++ b/lgsm/config-default/config-lgsm/ts3server/_default.cfg @@ -115,7 +115,7 @@ stopmode="2" ## Query mode # 1: session only -# 2: gamedig + gsquery +# 2: gamedig (gsquery fallback) # 3: gamedig # 4: gsquery # 5: tcp diff --git a/lgsm/config-default/config-lgsm/tsserver/_default.cfg b/lgsm/config-default/config-lgsm/tsserver/_default.cfg index f15f41b39..f712b43f8 100644 --- a/lgsm/config-default/config-lgsm/tsserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/tsserver/_default.cfg @@ -132,7 +132,7 @@ stopmode="9" ## Query mode # 1: session only -# 2: gamedig + gsquery +# 2: gamedig (gsquery fallback) # 3: gamedig # 4: gsquery # 5: tcp diff --git a/lgsm/config-default/config-lgsm/tuserver/_default.cfg b/lgsm/config-default/config-lgsm/tuserver/_default.cfg index d75e95f3c..63aec6f0f 100644 --- a/lgsm/config-default/config-lgsm/tuserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/tuserver/_default.cfg @@ -134,7 +134,7 @@ stopmode="2" ## Query mode # 1: session only -# 2: gamedig + gsquery +# 2: gamedig (gsquery fallback) # 3: gamedig # 4: gsquery # 5: tcp diff --git a/lgsm/config-default/config-lgsm/twserver/_default.cfg b/lgsm/config-default/config-lgsm/twserver/_default.cfg index c2696ae4e..cdbf5e98f 100644 --- a/lgsm/config-default/config-lgsm/twserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/twserver/_default.cfg @@ -131,7 +131,7 @@ stopmode="2" ## Query mode # 1: session only -# 2: gamedig + gsquery +# 2: gamedig (gsquery fallback) # 3: gamedig # 4: gsquery # 5: tcp diff --git a/lgsm/config-default/config-lgsm/untserver/_default.cfg b/lgsm/config-default/config-lgsm/untserver/_default.cfg index 8cee6f923..be683d7a3 100644 --- a/lgsm/config-default/config-lgsm/untserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/untserver/_default.cfg @@ -130,7 +130,7 @@ stopmode="2" ## Query mode # 1: session only -# 2: gamedig + gsquery +# 2: gamedig (gsquery fallback) # 3: gamedig # 4: gsquery # 5: tcp diff --git a/lgsm/config-default/config-lgsm/ut2k4server/_default.cfg b/lgsm/config-default/config-lgsm/ut2k4server/_default.cfg index dcd0d4211..c72e868b2 100644 --- a/lgsm/config-default/config-lgsm/ut2k4server/_default.cfg +++ b/lgsm/config-default/config-lgsm/ut2k4server/_default.cfg @@ -116,7 +116,7 @@ stopmode="2" ## Query mode # 1: session only -# 2: gamedig + gsquery +# 2: gamedig (gsquery fallback) # 3: gamedig # 4: gsquery # 5: tcp diff --git a/lgsm/config-default/config-lgsm/ut3server/_default.cfg b/lgsm/config-default/config-lgsm/ut3server/_default.cfg index f268631b1..8d420353f 100644 --- a/lgsm/config-default/config-lgsm/ut3server/_default.cfg +++ b/lgsm/config-default/config-lgsm/ut3server/_default.cfg @@ -132,7 +132,7 @@ stopmode="2" ## Query mode # 1: session only -# 2: gamedig + gsquery +# 2: gamedig (gsquery fallback) # 3: gamedig # 4: gsquery # 5: tcp diff --git a/lgsm/config-default/config-lgsm/ut99server/_default.cfg b/lgsm/config-default/config-lgsm/ut99server/_default.cfg index ab74b3f0b..fa34161e7 100644 --- a/lgsm/config-default/config-lgsm/ut99server/_default.cfg +++ b/lgsm/config-default/config-lgsm/ut99server/_default.cfg @@ -116,7 +116,7 @@ stopmode="2" ## Query mode # 1: session only -# 2: gamedig + gsquery +# 2: gamedig (gsquery fallback) # 3: gamedig # 4: gsquery # 5: tcp diff --git a/lgsm/config-default/config-lgsm/utserver/_default.cfg b/lgsm/config-default/config-lgsm/utserver/_default.cfg index 09ca4f523..f0f57c96e 100644 --- a/lgsm/config-default/config-lgsm/utserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/utserver/_default.cfg @@ -120,7 +120,7 @@ stopmode="2" ## Query mode # 1: session only -# 2: gamedig + gsquery +# 2: gamedig (gsquery fallback) # 3: gamedig # 4: gsquery # 5: tcp diff --git a/lgsm/config-default/config-lgsm/vsserver/_default.cfg b/lgsm/config-default/config-lgsm/vsserver/_default.cfg index b8f44317e..08df081f0 100644 --- a/lgsm/config-default/config-lgsm/vsserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/vsserver/_default.cfg @@ -132,7 +132,7 @@ stopmode="9" ## Query mode # 1: session only -# 2: gamedig + gsquery +# 2: gamedig (gsquery fallback) # 3: gamedig # 4: gsquery # 5: tcp diff --git a/lgsm/config-default/config-lgsm/wetserver/_default.cfg b/lgsm/config-default/config-lgsm/wetserver/_default.cfg index 16ddab532..122aa2345 100644 --- a/lgsm/config-default/config-lgsm/wetserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/wetserver/_default.cfg @@ -112,7 +112,7 @@ stopmode="3" ## Query mode # 1: session only -# 2: gamedig + gsquery +# 2: gamedig (gsquery fallback) # 3: gamedig # 4: gsquery # 5: tcp diff --git a/lgsm/config-default/config-lgsm/wfserver/_default.cfg b/lgsm/config-default/config-lgsm/wfserver/_default.cfg index b79a165b1..5c6342026 100644 --- a/lgsm/config-default/config-lgsm/wfserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/wfserver/_default.cfg @@ -117,7 +117,7 @@ stopmode="3" ## Query mode # 1: session only -# 2: gamedig + gsquery +# 2: gamedig (gsquery fallback) # 3: gamedig # 4: gsquery # 5: tcp diff --git a/lgsm/config-default/config-lgsm/wurmserver/_default.cfg b/lgsm/config-default/config-lgsm/wurmserver/_default.cfg index bce9433a2..8048687cf 100644 --- a/lgsm/config-default/config-lgsm/wurmserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/wurmserver/_default.cfg @@ -123,7 +123,7 @@ stopmode="2" ## Query mode # 1: session only -# 2: gamedig + gsquery +# 2: gamedig (gsquery fallback) # 3: gamedig # 4: gsquery # 5: tcp diff --git a/lgsm/config-default/config-lgsm/zmrserver/_default.cfg b/lgsm/config-default/config-lgsm/zmrserver/_default.cfg index 63e43f98e..134b19072 100644 --- a/lgsm/config-default/config-lgsm/zmrserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/zmrserver/_default.cfg @@ -132,7 +132,7 @@ stopmode="3" ## Query mode # 1: session only -# 2: gamedig + gsquery +# 2: gamedig (gsquery fallback) # 3: gamedig # 4: gsquery # 5: tcp diff --git a/lgsm/config-default/config-lgsm/zpsserver/_default.cfg b/lgsm/config-default/config-lgsm/zpsserver/_default.cfg index 61bcc8741..8412173c1 100644 --- a/lgsm/config-default/config-lgsm/zpsserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/zpsserver/_default.cfg @@ -137,7 +137,7 @@ stopmode="3" ## Query mode # 1: session only -# 2: gamedig + gsquery +# 2: gamedig (gsquery fallback) # 3: gamedig # 4: gsquery # 5: tcp diff --git a/lgsm/functions/check.sh b/lgsm/functions/check.sh index b50754e3d..d5e7df939 100644 --- a/lgsm/functions/check.sh +++ b/lgsm/functions/check.sh @@ -31,8 +31,7 @@ if [ "${commandname}" != "INSTALL" ]&&[ "${commandname}" != "UPDATE-LGSM" ]&&[ " fi allowed_commands_array=( START DEBUG ) -for allowed_command in "${allowed_commands_array[@]}" -do +for allowed_command in "${allowed_commands_array[@]}"; do if [ "${allowed_command}" == "${commandname}" ]; then check_executable.sh fi @@ -40,8 +39,7 @@ done if [ "$(whoami)" != "root" ]; then allowed_commands_array=( DEBUG START INSTALL ) - for allowed_command in "${allowed_commands_array[@]}" - do + for allowed_command in "${allowed_commands_array[@]}"; do if [ "${allowed_command}" == "${commandname}" ]; then check_glibc.sh fi @@ -49,32 +47,28 @@ if [ "$(whoami)" != "root" ]; then fi allowed_commands_array=( BACKUP CONSOLE DEBUG DETAILS MAP-COMPRESSOR FASTDL MODS-INSTALL MODS-REMOVE MODS-UPDATE MONITOR POST-DETAILS RESTART START STOP TEST-ALERT CHANGE-PASSWORD UPDATE UPDATE-LGSM VALIDATE WIPE ) -for allowed_command in "${allowed_commands_array[@]}" -do +for allowed_command in "${allowed_commands_array[@]}"; do if [ "${allowed_command}" == "${commandname}" ]; then check_logs.sh fi done allowed_commands_array=( DEBUG START STOP ) -for allowed_command in "${allowed_commands_array[@]}" -do +for allowed_command in "${allowed_commands_array[@]}"; do if [ "${allowed_command}" == "${commandname}" ]; then check_deps.sh fi done allowed_commands_array=( CONSOLE DEBUG MONITOR START STOP ) -for allowed_command in "${allowed_commands_array[@]}" -do +for allowed_command in "${allowed_commands_array[@]}"; do if [ "${allowed_command}" == "${commandname}" ]; then check_config.sh fi done allowed_commands_array=( DEBUG DETAILS POST_DETAILS MONITOR START STOP DEV-QUERY-RAW ) -for allowed_command in "${allowed_commands_array[@]}" -do +for allowed_command in "${allowed_commands_array[@]}"; do if [ "${allowed_command}" == "${commandname}" ]; then if [ -z "${installflag}" ]; then check_ip.sh @@ -83,8 +77,7 @@ do done allowed_commands_array=( DEBUG START UPDATE VALIDATE ) -for allowed_command in "${allowed_commands_array[@]}" -do +for allowed_command in "${allowed_commands_array[@]}"; do if [ "${allowed_command}" == "${commandname}" ]; then if [ "${appid}" ]; then check_steamcmd.sh @@ -93,16 +86,14 @@ do done allowed_commands_array=( DETAILS MONITOR START STOP CHANGE-PASSWORD UPDATE VALIDATE ) -for allowed_command in "${allowed_commands_array[@]}" -do +for allowed_command in "${allowed_commands_array[@]}"; do if [ "${allowed_command}" == "${commandname}" ]; then check_status.sh fi done allowed_commands_array=( DEBUG START INSTALL ) -for allowed_command in "${allowed_commands_array[@]}" -do +for allowed_command in "${allowed_commands_array[@]}"; do if [ "${allowed_command}" == "${commandname}" ]; then check_system_requirements.sh fi diff --git a/lgsm/functions/check_deps.sh b/lgsm/functions/check_deps.sh index 0d4555e53..a133c8486 100644 --- a/lgsm/functions/check_deps.sh +++ b/lgsm/functions/check_deps.sh @@ -329,8 +329,7 @@ fn_found_missing_deps(){ fn_check_loop(){ # Loop though required depenencies. - for deptocheck in ${array_deps_required[*]} - do + for deptocheck in ${array_deps_required[*]}; do fn_deps_detector done diff --git a/lgsm/functions/check_ip.sh b/lgsm/functions/check_ip.sh index d8c4f3ed5..b953a3125 100644 --- a/lgsm/functions/check_ip.sh +++ b/lgsm/functions/check_ip.sh @@ -7,78 +7,29 @@ functionselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" -if [ "${travistest}" != "1" ]; then - if [ ! -f "/bin/ip" ]; then - ipcommand="/sbin/ip" - else - ipcommand="ip" - fi - getip=$(${ipcommand} -o -4 addr | awk '{print $4}' | grep -oe '\([0-9]\{1,3\}\.\?\)\{4\}'|sort -u|grep -v 127.0.0) - getipwc=$(${ipcommand} -o -4 addr | awk '{print $4}' | grep -oe '\([0-9]\{1,3\}\.\?\)\{4\}'|sort -u|grep -vc 127.0.0) - info_config.sh - info_parms.sh +info_config.sh +info_parms.sh - # IP is not set to specific IP. - if [ "${ip}" == "0.0.0.0" ]||[ "${ip}" == "" ]; then - fn_print_dots "Check IP" - # Multiple interfaces. - if [ "${getipwc}" -ge "2" ]; then - if [ "${commandname}" == "details" ]; then - fn_print_warn "Check IP: Multiple IP addresses found." - else - fn_print_fail "Check IP: Multiple IP addresses found." - fi - echo -en "\n" - # IP is set within game config. - if [ "${ipsetinconfig}" == "1" ]; then - fn_print_information "Specify the IP you want to bind within ${servercfg}.\n" - echo -en " * location: ${servercfgfullpath}\n" - echo -en "\n" - echo -en "Set ${ipinconfigvar} to one of the following:\n" - fn_script_log_fatal "Multiple IP addresses found." - fn_script_log_fatal "Specify the IP you want to bind within: ${servercfgfullpath}." - # IP is set within LinuxGSM config. - else - fn_print_information_nl "Specify the IP you want to bind within a LinuxGSM config file.\n" - echo -en " * location: ${configdirserver}\n" - echo -en "\n" - echo -en "Set ip=\"0.0.0.0\" to one of the following:\n" - fn_script_log_fatal "Multiple IP addresses found." - fn_script_log_fatal "Specify the IP you want to bind within: ${configdirserver}." - fi - echo -en "${getip}\n" - echo -en "\n" - echo -en "https://linuxgsm.com/network-interfaces\n" - echo -en "" - # Do not exit for details and postdetails commands. - if [ "${commandname}" != "DETAILS" ]||[ "${commandname}" != "POST-DETAILS" ]; then - fn_script_log_fatal "https://linuxgsm.com/network-interfaces\n" - core_exit.sh - else - ip="NOT SET" - fi - # Single interface. - elif [ "${ipsetinconfig}" == "1" ]; then - fn_print_fail "Check IP: IP address not set in game config." - echo -en "\n" - fn_print_information "Specify the IP you want to bind within ${servercfg}.\n" - echo -en " * location: ${servercfgfullpath}\n" - echo -en "\n" - echo -en "Set ${ipinconfigvar} to the following:\n" - echo -en "${getip}\n" - echo -en "\n" - echo -en "https://linuxgsm.com/network-interfaces\n" - echo -en "" - fn_script_log_fatal "IP address not set in game config." - fn_script_log_fatal "Specify the IP you want to bind within: ${servercfgfullpath}." - fn_script_log_fatal "https://linuxgsm.com/network-interfaces\n" - if [ "${commandname}" != "DETAILS" ]; then - core_exit.sh - fi - else - fn_print_info_nl "Check IP: ${getip}" - fn_script_log_info "IP automatically set as: ${getip}" - ip="${getip}" - fi - fi +if [ ! -f "/bin/ip" ]; then + ipcommand="/sbin/ip" +else + ipcommand="ip" +fi +getip=$(${ipcommand} -o -4 addr | awk '{print $4}' | grep -oe '\([0-9]\{1,3\}\.\?\)\{4\}' | sort -u | grep -v 127.0.0) +getipwc=$(${ipcommand} -o -4 addr | awk '{print $4}' | grep -oe '\([0-9]\{1,3\}\.\?\)\{4\}' | sort -u | grep -vc 127.0.0) + +# Check if server has multiple IP addresses + +# If the IP variable has been set by user. +if [ -n "${ip}" ]&&[ "${ip}" != "0.0.0.0" ]; then + queryips=( "${ip}" ) + # If game config does have an IP set. +elif [ -n "${configip}" ]&&[ "${configip}" != "0.0.0.0" ];then + queryips=( "${configip}" ) + ip="${configip}" + # If no ip is set by the user. +else + queryips=( $(echo "${getip}") ) + ip="0.0.0.0" +# If IP has not been set by user. fi diff --git a/lgsm/functions/command_backup.sh b/lgsm/functions/command_backup.sh index dbf97a857..e778cb8a6 100644 --- a/lgsm/functions/command_backup.sh +++ b/lgsm/functions/command_backup.sh @@ -218,21 +218,18 @@ fn_backup_relpath() { # Compare the leading entries of each array. These common elements will be clipped off. # for the relative path output. - for ((base=0; base<${#rdirtoks[@]}; base++)) - do + for ((base=0; base<${#rdirtoks[@]}; base++)); do [[ "${rdirtoks[$base]}" != "${bdirtoks[$base]}" ]] && break done # Next, climb out of the remaining rootdir location with updir references. - for ((x=base;x<${#rdirtoks[@]};x++)) - do + for ((x=base;x<${#rdirtoks[@]};x++)); do echo -n "../" done # Climb down the remaining components of the backupdir location. - for ((x=base;x<$(( ${#bdirtoks[@]} - 1 ));x++)) - do - echo -n "${bdirtoks[$x]}/" + for ((x=base;x<$(( ${#bdirtoks[@]} - 1 ));x++)); do + echo -n "${bdirtoks[$x]}/" done # In the event there were no directories left in the backupdir above to diff --git a/lgsm/functions/command_debug.sh b/lgsm/functions/command_debug.sh index cbd42d287..a48975d0d 100644 --- a/lgsm/functions/command_debug.sh +++ b/lgsm/functions/command_debug.sh @@ -55,11 +55,8 @@ if [ "${glibc}" ]; then fi # Server IP -if [ "${multiple_ip}" == "1" ]; then - echo -e "${lightblue}Server IP:\t${default}NOT SET" -else - echo -e "${lightblue}Server IP:\t${default}${ip}:${port}" -fi +server echo -e "${lightblue}Game Server IP:\t${default}${ip}:${port}" + # External server IP. if [ "${extip}" ]; then if [ "${ip}" != "${extip}" ]; then diff --git a/lgsm/functions/command_details.sh b/lgsm/functions/command_details.sh index 9680255f4..2db605656 100644 --- a/lgsm/functions/command_details.sh +++ b/lgsm/functions/command_details.sh @@ -17,7 +17,12 @@ info_parms.sh info_distro.sh info_messages.sh if [ "${querymode}" == "2" ]||[ "${querymode}" == "3" ]; then - query_gamedig.sh + for queryip in "${queryips[@]}"; do + query_gamedig.sh + if [ "${querystatus}" == "0" ]; then + break + fi + done fi fn_info_message_distro fn_info_message_server_resource diff --git a/lgsm/functions/command_dev_detect_deps.sh b/lgsm/functions/command_dev_detect_deps.sh index d2fa00fcc..2a620fd66 100644 --- a/lgsm/functions/command_dev_detect_deps.sh +++ b/lgsm/functions/command_dev_detect_deps.sh @@ -42,8 +42,7 @@ touch "${tmpdir}/.depdetect_debian_list" while read -r lib; do echo -e "${lib}" libs_array=( libm.so.6 libc.so.6 libtcmalloc_minimal.so.4 libpthread.so.0 libdl.so.2 libnsl.so.1 libgcc_s.so.1 librt.so.1 ld-linux.so.2 libdbus-glib-1.so.2 libgio-2.0.so.0 libglib-2.0.so.0 libGL.so.1 libgobject-2.0.so.0 libnm-glib.so.4 libnm-util.so.2 ) - for lib_file in "${libs_array[@]}" - do + for lib_file in "${libs_array[@]}"; do if [ "${lib}" == "${lib_file}" ]; then echo -e "glibc.i686" >> "${tmpdir}/.depdetect_centos_list" echo -e "lib32gcc1" >> "${tmpdir}/.depdetect_ubuntu_list" @@ -53,8 +52,7 @@ while read -r lib; do done libs_array=( libawt.so libjava.so libjli.so libjvm.so libnet.so libnio.so libverify.so ) - for lib_file in "${libs_array[@]}" - do + for lib_file in "${libs_array[@]}"; do if [ "${lib}" == "${lib_file}" ]; then echo -e "java-1.8.0-openjdk" >> "${tmpdir}/.depdetect_centos_list" echo -e "default-jre" >> "${tmpdir}/.depdetect_ubuntu_list" @@ -64,8 +62,7 @@ while read -r lib; do done libs_array=( libtier0.so libtier0_srv.so libvstdlib_srv.so Core.so libvstdlib.so libtier0_s.so Editor.so Engine.so liblua.so libsteam_api.so ld-linux-x86-64.so.2 libPhysX3_x86.so libPhysX3Common_x86.so libPhysX3Cooking_x86.so) - for lib_file in "${libs_array[@]}" - do + for lib_file in "${libs_array[@]}"; do # Known shared libs what dont requires dependencies. if [ "${lib}" == "${lib_file}" ]; then libdetected=1 diff --git a/lgsm/functions/command_dev_detect_glibc.sh b/lgsm/functions/command_dev_detect_glibc.sh index 8f5d6e5a8..e538c456e 100644 --- a/lgsm/functions/command_dev_detect_glibc.sh +++ b/lgsm/functions/command_dev_detect_glibc.sh @@ -35,8 +35,7 @@ echo -e "" glibc_check_dir_array=( steamcmddir serverfiles ) -for glibc_check_var in "${glibc_check_dir_array[@]}" -do +for glibc_check_var in "${glibc_check_dir_array[@]}"; do if [ "${glibc_check_var}" == "serverfiles" ]; then glibc_check_dir="${serverfiles}" glibc_check_name="${gamename}" diff --git a/lgsm/functions/command_dev_query_raw.sh b/lgsm/functions/command_dev_query_raw.sh index 84efe0da9..ac1e9f688 100644 --- a/lgsm/functions/command_dev_query_raw.sh +++ b/lgsm/functions/command_dev_query_raw.sh @@ -17,6 +17,11 @@ echo -e "" echo -e "Query Port - Raw Output" echo -e "==================================================================" echo -e "" +echo -e "QUERY IP" +for queryip in "${queryips[@]}"; do + echo -e "${queryip}" +done +echo -e "=================================" echo -e "Ports" echo -e "=================================" echo -e "" @@ -32,38 +37,40 @@ fi if [ ! "$(command -v jq 2>/dev/null)" ]; then fn_print_failure_nl "jq not installed" fi - -query_gamedig.sh -echo -e "${gamedigcmd}" -echo"" -echo "${gamedigraw}" | jq - +for queryip in "${queryips[@]}"; do + query_gamedig.sh + echo -e "${gamedigcmd}" + echo"" + echo "${gamedigraw}" | jq +done echo -e "" echo -e "gsquery Raw Output" echo -e "=================================" echo -e "" -echo -e "./query_gsquery.py -a \"${ip}\" -p \"${queryport}\" -e \"${querytype}\"" -echo -e "" -if [ ! -f "${functionsdir}/query_gsquery.py" ]; then - fn_fetch_file_github "lgsm/functions" "query_gsquery.py" "${functionsdir}" "chmodx" "norun" "noforce" "nomd5" -fi -"${functionsdir}"/query_gsquery.py -a "${ip}" -p "${queryport}" -e "${querytype}" - +for queryip in "${queryips[@]}"; do + echo -e "./query_gsquery.py -a \"${queryip}\" -p \"${queryport}\" -e \"${querytype}\"" + echo -e "" + if [ ! -f "${functionsdir}/query_gsquery.py" ]; then + fn_fetch_file_github "lgsm/functions" "query_gsquery.py" "${functionsdir}" "chmodx" "norun" "noforce" "nomd5" + fi + "${functionsdir}"/query_gsquery.py -a "${queryip}" -p "${queryport}" -e "${querytype}" +done echo -e "" echo -e "TCP Raw Output" echo -e "=================================" echo -e "" -echo -e "bash -c 'exec 3<> /dev/tcp/'${ip}'/'${queryport}''" -echo -e "" -bash -c 'exec 3<> /dev/tcp/'${ip}'/'${queryport}'' -querystatus="$?" -echo -e "" -if [ "${querystatus}" == "0" ]; then - echo -e "TCP query PASS" -else - echo -e "TCP query FAIL" -fi - +for queryip in "${queryips[@]}"; do + echo -e "bash -c 'exec 3<> /dev/tcp/'${queryip}'/'${queryport}''" + echo -e "" + timeout 3 bash -c 'exec 3<> /dev/tcp/'${queryip}'/'${queryport}'' + querystatus="$?" + echo -e "" + if [ "${querystatus}" == "0" ]; then + echo -e "TCP query PASS" + else + echo -e "TCP query FAIL" + fi +done echo -e "" echo -e "Game Port - Raw Output" echo -e "==================================================================" @@ -71,16 +78,17 @@ echo -e "" echo -e "TCP Raw Output" echo -e "=================================" echo -e "" -echo -e "bash -c 'exec 3<> /dev/tcp/'${ip}'/'${port}''" -echo -e "" -bash -c 'exec 3<> /dev/tcp/'${ip}'/'${port}'' -querystatus="$?" -echo -e "" -if [ "${querystatus}" == "0" ]; then - echo -e "TCP query PASS" -else - echo -e "TCP query FAIL" -fi - +for queryip in "${queryips[@]}"; do + echo -e "bash -c 'exec 3<> /dev/tcp/'${queryip}'/'${port}''" + echo -e "" + timeout 3 bash -c 'exec 3<> /dev/tcp/'${queryip}'/'${port}'' + querystatus="$?" + echo -e "" + if [ "${querystatus}" == "0" ]; then + echo -e "TCP query PASS" + else + echo -e "TCP query FAIL" + fi +done exitcode=0 core_exit.sh diff --git a/lgsm/functions/command_fastdl.sh b/lgsm/functions/command_fastdl.sh index 19ffb79fd..4f8ebd863 100644 --- a/lgsm/functions/command_fastdl.sh +++ b/lgsm/functions/command_fastdl.sh @@ -236,8 +236,7 @@ fn_fastdl_preview(){ # Builds Garry's Mod fastdl directory content. fn_fastdl_gmod(){ cd "${systemdir}" || exit - for allowed_extention in "${allowed_extentions_array[@]}" - do + for allowed_extention in "${allowed_extentions_array[@]}"; do fileswc=0 tput sc while read -r fastdlfile; do @@ -311,8 +310,7 @@ fn_fastdl_gmod(){ } fn_fastdl_source(){ - for directory in "${fastdl_directories_array[@]}" - do + 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" ) @@ -325,8 +323,7 @@ fn_fastdl_source(){ elif [ "${directory}" == "sound" ]; then local allowed_extentions_array=( "*.wav" "*.mp3" "*.ogg" ) fi - for allowed_extention in "${allowed_extentions_array[@]}" - do + for allowed_extention in "${allowed_extentions_array[@]}"; do fileswc=0 tput sc while read -r fastdlfile; do diff --git a/lgsm/functions/command_monitor.sh b/lgsm/functions/command_monitor.sh index 89524ab91..80d3f43f0 100644 --- a/lgsm/functions/command_monitor.sh +++ b/lgsm/functions/command_monitor.sh @@ -71,11 +71,13 @@ fn_monitor_check_queryport(){ fn_print_checking_eol fn_script_log_info "Checking port: CHECKING" if [ -n "${rconenabled}" ]&&[ "${rconenabled}" != "true" ]&&[ ${shortname} == "av" ]; then - fn_print_warn "Checking port: Unable to query as rconport, rcon not enabled: " - fn_script_log_warn "Checking port: Unable to query rconport, rcon not enabled: WARN" + fn_print_warn "Checking port: Unable to query, rcon is not enabled" + fn_print_warn_eol_nl + fn_script_log_warn "Checking port: Unable to query, rcon is not enabled" else - fn_print_error "Checking port: Unable to query queryport is not set: " - fn_script_log_error "Checking port: Unable to query as queryport is not set: ERROR" + fn_print_error "Checking port: Unable to query, queryport is not set" + fn_script_log_error "Checking port: Unable to query, queryport is not set" + fn_print_error_eol_nl fi core_exit.sh fi @@ -85,12 +87,12 @@ fn_query_gsquery(){ if [ ! -f "${functionsdir}/query_gsquery.py" ]; then fn_fetch_file_github "lgsm/functions" "query_gsquery.py" "${functionsdir}" "chmodx" "norun" "noforce" "nomd5" fi - "${functionsdir}"/query_gsquery.py -a "${ip}" -p "${queryport}" -e "${querytype}" > /dev/null 2>&1 + "${functionsdir}"/query_gsquery.py -a "${queryip}" -p "${queryport}" -e "${querytype}" > /dev/null 2>&1 querystatus="$?" } fn_query_tcp(){ - bash -c 'exec 3<> /dev/tcp/'${ip}'/'${queryport}'' > /dev/null 2>&1 + bash -c 'exec 3<> /dev/tcp/'${queryip}'/'${queryport}'' > /dev/null 2>&1 querystatus="$?" } @@ -99,74 +101,74 @@ fn_monitor_query(){ # Query will wait up to 60 seconds to confirm server is down as server can become non-responsive during map changes. totalseconds=0 for queryattempt in {1..5}; do - fn_print_dots "Querying port: ${querymethod}: ${ip}:${queryport} : ${totalseconds}/${queryattempt}: " - fn_print_querying_eol - fn_script_log_info "Querying port: ${querymethod}: ${ip}:${queryport} : ${queryattempt} : QUERYING" - # querydelay - if [ "$(cat "${lockdir}/${selfname}.lock")" -gt "$(date "+%s" -d "${querydelay} mins ago")" ]; then - fn_print_ok "Querying port: ${querymethod}: ${ip}:${queryport} : ${totalseconds}/${queryattempt}: " - fn_print_delay_eol_nl - fn_script_log_info "Querying port: ${querymethod}: ${ip}:${queryport} : ${queryattempt} : DELAY" - fn_script_log_info "Query bypassed: ${gameservername} started less than ${querydelay} minutes ago" - fn_script_log_info "Server started: $(date -d @$(cat "${lockdir}/${selfname}.lock"))" - fn_script_log_info "Current time: $(date)" - monitorpass=1 - core_exit.sh - # will use query method selected in fn_monitor_loop - # gamedig - elif [ "${querymethod}" == "gamedig" ]; then - query_gamedig.sh - # gsquery - elif [ "${querymethod}" == "gsquery" ]; then - fn_query_gsquery - #tcp query - elif [ "${querymethod}" == "tcp" ]; then - fn_query_tcp - fi + for queryip in "${queryips[@]}"; do + fn_print_dots "Querying port: ${querymethod}: ${queryip}:${queryport} : ${totalseconds}/${queryattempt}: " + fn_print_querying_eol + fn_script_log_info "Querying port: ${querymethod}: ${queryip}:${queryport} : ${queryattempt} : QUERYING" + # querydelay + if [ "$(cat "${lockdir}/${selfname}.lock")" -gt "$(date "+%s" -d "${querydelay} mins ago")" ]; then + fn_print_ok "Querying port: ${querymethod}: ${ip}:${queryport} : ${totalseconds}/${queryattempt}: " + fn_print_delay_eol_nl + fn_script_log_info "Querying port: ${querymethod}: ${ip}:${queryport} : ${queryattempt} : DELAY" + fn_script_log_info "Query bypassed: ${gameservername} started less than ${querydelay} minutes ago" + fn_script_log_info "Server started: $(date -d @$(cat "${lockdir}/${selfname}.lock"))" + fn_script_log_info "Current time: $(date)" + monitorpass=1 + core_exit.sh + # will use query method selected in fn_monitor_loop + # gamedig + elif [ "${querymethod}" == "gamedig" ]; then + query_gamedig.sh + # gsquery + elif [ "${querymethod}" == "gsquery" ]; then + fn_query_gsquery + #tcp query + elif [ "${querymethod}" == "tcp" ]; then + fn_query_tcp + fi - if [ "${querystatus}" == "0" ]; then - # Server query OK. - fn_print_ok "Querying port: ${querymethod}: ${ip}:${queryport} : ${totalseconds}/${queryattempt}: " - fn_print_ok_eol_nl - fn_script_log_pass "Querying port: ${querymethod}: ${ip}:${queryport} : ${queryattempt}: OK" - monitorpass=1 if [ "${querystatus}" == "0" ]; then - # Add query data to log. - if [ "${gdname}" ]; then - fn_script_log_info "Server name: ${gdname}" - fi - if [ "${gdplayers}" ]; then - fn_script_log_info "Players: ${gdplayers}/${gdmaxplayers}" - fi - if [ "${gdbots}" ]; then - fn_script_log_info "Bots: ${gdbots}" - fi - if [ "${gdmap}" ]; then - fn_script_log_info "Map: ${gdmap}" - fi - if [ "${gdgamemode}" ]; then - fn_script_log_info "Game Mode: ${gdgamemode}" - fi + # Server query OK. + fn_print_ok "Querying port: ${querymethod}: ${queryip}:${queryport} : ${totalseconds}/${queryattempt}: " + fn_print_ok_eol_nl + fn_script_log_pass "Querying port: ${querymethod}: ${queryip}:${queryport} : ${queryattempt}: OK" + monitorpass=1 + if [ "${querystatus}" == "0" ]; then + # Add query data to log. + if [ "${gdname}" ]; then + fn_script_log_info "Server name: ${gdname}" + fi + if [ "${gdplayers}" ]; then + fn_script_log_info "Players: ${gdplayers}/${gdmaxplayers}" + fi + if [ "${gdbots}" ]; then + fn_script_log_info "Bots: ${gdbots}" + fi + if [ "${gdmap}" ]; then + fn_script_log_info "Map: ${gdmap}" + fi + if [ "${gdgamemode}" ]; then + fn_script_log_info "Game Mode: ${gdgamemode}" + fi - # send LinuxGSM stats if monitor is OK. - if [ "${stats}" == "on" ]||[ "${stats}" == "y" ]; then - info_stats.sh + # send LinuxGSM stats if monitor is OK. + if [ "${stats}" == "on" ]||[ "${stats}" == "y" ]; then + info_stats.sh + fi fi - fi - core_exit.sh - else - # Server query FAIL. - fn_print_fail "Querying port: ${querymethod}: ${ip}:${queryport} : ${totalseconds}/${queryattempt}: " - fn_print_fail_eol - fn_script_log_warn "Querying port: ${querymethod}: ${ip}:${queryport} : ${queryattempt}: FAIL" - # Monitor will try gamedig (if supported) for first 30s then gsquery before restarting. - if [ "${querymethod}" == "gsquery" ]||[ "${querymethod}" == "tcp" ]; then + core_exit.sh + else + # Server query FAIL. + fn_print_fail "Querying port: ${querymethod}: ${queryip}:${queryport} : ${totalseconds}/${queryattempt}: " + fn_print_fail_eol + fn_script_log_warn "Querying port: ${querymethod}: ${queryip}:${queryport} : ${queryattempt}: FAIL" + # Monitor will try gamedig (if supported) for first 30s then gsquery before restarting. # gsquery will fail if longer than 60s if [ "${totalseconds}" -ge "59" ]; then # Monitor will FAIL if over 60s and trigger gane server reboot. - fn_print_fail "Querying port: ${querymethod}: ${ip}:${queryport} : ${totalseconds}/${queryattempt}: " + fn_print_fail "Querying port: ${querymethod}: ${queryip}:${queryport} : ${totalseconds}/${queryattempt}: " fn_print_fail_eol_nl - fn_script_log_warn "Querying port: ${querymethod}: ${ip}:${queryport} : ${queryattempt}: FAIL" + fn_script_log_warn "Querying port: ${querymethod}: ${queryip}:${queryport} : ${queryattempt}: FAIL" # Send alert if enabled. alert="restartquery" alert.sh @@ -174,13 +176,8 @@ for queryattempt in {1..5}; do fn_firstcommand_reset core_exit.sh fi - elif [ "${querymethod}" == "gamedig" ]; then - # gamedig will fail and try gsquery if longer than 30s - if [ "${totalseconds}" -ge "29" ]; then - break - fi fi - + done # Second counter will wait for 15s before breaking loop. for seconds in {1..15}; do fn_print_fail "Querying port: ${querymethod}: ${ip}:${queryport} : ${totalseconds}/${queryattempt}: ${cyan}WAIT${default}" @@ -190,7 +187,6 @@ for queryattempt in {1..5}; do break fi done - fi done } @@ -206,8 +202,7 @@ fn_monitor_loop(){ elif [ "${querymode}" == "5" ]; then local query_methods_array=( tcp ) fi - for querymethod in "${query_methods_array[@]}" - do + for querymethod in "${query_methods_array[@]}"; do # Will check if gamedig is installed and bypass if not. if [ "${querymethod}" == "gamedig" ]; then if [ "$(command -v gamedig 2>/dev/null)" ]&&[ "$(command -v jq 2>/dev/null)" ]; then diff --git a/lgsm/functions/command_postdetails.sh b/lgsm/functions/command_postdetails.sh index 11ac44649..3cb4c5852 100644 --- a/lgsm/functions/command_postdetails.sh +++ b/lgsm/functions/command_postdetails.sh @@ -58,7 +58,13 @@ else info_parms.sh info_distro.sh info_messages.sh - query_gamedig.sh + for queryip in "${queryips[@]}" + do + query_gamedig.sh + if [ "${querystatus}" == "0" ]; then + break + fi + done touch "${postdetailslog}" || fn_bad_postdetailslog { fn_info_message_distro diff --git a/lgsm/functions/command_update_linuxgsm.sh b/lgsm/functions/command_update_linuxgsm.sh index 56391409c..37918be2d 100644 --- a/lgsm/functions/command_update_linuxgsm.sh +++ b/lgsm/functions/command_update_linuxgsm.sh @@ -149,8 +149,7 @@ fi if [ -n "${functionsdir}" ]; then if [ -d "${functionsdir}" ]; then cd "${functionsdir}" || exit - for functionfile in * - do + for functionfile in *; do # check if module exists in the repo and remove if missing. # commonly used if module names change. echo -en "checking ${remotereponame} module ${functionfile}...\c" diff --git a/lgsm/functions/core_dl.sh b/lgsm/functions/core_dl.sh index 0493b8a86..b8e1b2b86 100644 --- a/lgsm/functions/core_dl.sh +++ b/lgsm/functions/core_dl.sh @@ -248,8 +248,7 @@ fn_fetch_file(){ counter=1 remote_fileurls_array=( remote_fileurl ) fi - for remote_fileurl_array in "${remote_fileurls_array[@]}" - do + for remote_fileurl_array in "${remote_fileurls_array[@]}"; do if [ "${remote_fileurl_array}" == "remote_fileurl" ]; then fileurl="${remote_fileurl}" fileurl_name="${remote_fileurl_name}" diff --git a/lgsm/functions/core_getopt.sh b/lgsm/functions/core_getopt.sh index 47071bc24..82eb77691 100644 --- a/lgsm/functions/core_getopt.sh +++ b/lgsm/functions/core_getopt.sh @@ -62,9 +62,9 @@ currentopt+=( "${cmd_update_linuxgsm[@]}" ) # Exclude noupdate games here. if [ "${shortname}" == "jk2" ]||[ "${engine}" != "idtech3" ];then - if [ "${engine}" != "quake" ]&&[ "${engine}" != "idtech2" ]&&[ "${engine}" != "iw2.0" ]&&[ "${engine}" != "iw3.0" ]&&[ "${shortname}" != "bf1942" ]&&[ "${shortname}" != "bfv" ]&&[ "${shortname}" != "samp" ]; then + if [ "${shortname}" != "bf1942" ]&&[ "${shortname}" != "bfv" ]&&[ "${engine}" != "idtech2" ]&&[ "${engine}" != "iw2.0" ]&&[ "${engine}" != "iw3.0" ]&&[ "${engine}" != "quake" ]&&[ "${shortname}" != "samp" ]&&[ "${shortname}" != "ut2k4" ]&&[ "${shortname}" != "ut99" ]; then currentopt+=( "${cmd_update[@]}" ) - # force update for SteamCMD only or MTA. + # force update for SteamCMD or Multi Theft Auto only. if [ "${appid}" ]||[ "${shortname}" == "mta" ]; then currentopt+=( "${cmd_force_update[@]}" ) fi diff --git a/lgsm/functions/core_legacy.sh b/lgsm/functions/core_legacy.sh index 3450d5842..9c95adcaf 100644 --- a/lgsm/functions/core_legacy.sh +++ b/lgsm/functions/core_legacy.sh @@ -8,8 +8,7 @@ functionselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" # This is to help the transition to v20.3.0 and above legacy_versions_array=( v20.2.1 v20.2.0 v20.1.5 v20.1.4 v20.1.3 v20.1.2 v20.1.1 v20.1.0 v19.12.5 v19.12.4 v19.12.3 v19.12.2 v19.12.1 v19.12.0 ) -for legacy_version in "${legacy_versions_array[@]}" -do +for legacy_version in "${legacy_versions_array[@]}"; do if [ "${version}" == "${legacy_version}" ]; then legacymode=1 fi diff --git a/lgsm/functions/info_config.sh b/lgsm/functions/info_config.sh index 25984997d..a04dd1ac7 100644 --- a/lgsm/functions/info_config.sh +++ b/lgsm/functions/info_config.sh @@ -53,7 +53,7 @@ fn_info_config_justcause2(){ maxplayers=$(grep "MaxPlayers" "${servercfgfullpath}" | grep -v "\--" | tr -cd '[:digit:]') port=$(grep "BindPort" "${servercfgfullpath}" | grep -v "\--" | tr -cd '[:digit:]') queryport="${port}" - ip=$(grep "BindIP" "${servercfgfullpath}" | sed -e 's/^[ \t]*//g' -e '/^--/d' -e 's/BindIP//g' | tr -d '=\";,:' | sed -e 's/^[ \t]*//' -e 's/[ \t]*$//') + configip=$(grep "BindIP" "${servercfgfullpath}" | sed -e 's/^[ \t]*//g' -e '/^--/d' -e 's/BindIP//g' | tr -d '=\";,:' | sed -e 's/^[ \t]*//' -e 's/[ \t]*$//') ipsetinconfig=1 ipinconfigvar="BindIP" @@ -86,7 +86,7 @@ fn_info_config_justcause3(){ steamport=$(grep "\"steamPort\"" "${servercfgfullpath}" | tr -cd '[:digit:]') tickrate=$(grep "\"maxTickRate\"" "${servercfgfullpath}" | tr -cd '[:digit:]') - ip=$(grep "host" "${servercfgfullpath}" | sed -e 's/^[ \t]*//g' -e '/^#/d' -e 's/host//g' | tr -d '=\";,:' | sed -e 's/^[ \t]*//' -e 's/[ \t]*$//') + configip=$(grep "host" "${servercfgfullpath}" | sed -e 's/^[ \t]*//g' -e '/^#/d' -e 's/host//g' | tr -d '=\";,:' | sed -e 's/^[ \t]*//' -e 's/[ \t]*$//') ipsetinconfig=1 ipinconfigvar="host" @@ -187,7 +187,7 @@ fn_info_config_bf1942(){ port=$(grep "game.serverPort" "${servercfgfullpath}" | grep -v "\--" | tr -cd '[:digit:]') queryport="22000" - ip=$(grep "game.serverIP" "${servercfgfullpath}" | sed -e 's/^[ \t]*//g' -e '/^--/d' -e 's/game.serverIP//g' | tr -d '=\";,:' | xargs) + configip=$(grep "game.serverIP" "${servercfgfullpath}" | sed -e 's/^[ \t]*//g' -e '/^--/d' -e 's/game.serverIP//g' | tr -d '=\";,:' | xargs) ipsetinconfig=1 ipinconfigvar="game.serverIP" @@ -214,7 +214,7 @@ fn_info_config_bfv(){ port=$(grep "game.serverPort" "${servercfgfullpath}" | grep -v "\--" | tr -cd '[:digit:]') queryport="23000" - ip=$(grep "game.serverIP" "${servercfgfullpath}" | sed -e 's/^[ \t]*//g' -e '/^--/d' -e 's/game.serverIP//g' | tr -d '=\";,:' | xargs) + configip=$(grep "game.serverIP" "${servercfgfullpath}" | sed -e 's/^[ \t]*//g' -e '/^--/d' -e 's/game.serverIP//g' | tr -d '=\";,:' | xargs) ipsetinconfig=1 ipinconfigvar="game.serverIP" @@ -315,7 +315,7 @@ fn_info_config_dontstarve(){ 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]*$//') + configip=$(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" @@ -438,7 +438,7 @@ fn_info_config_minecraft(){ gamemode=$(grep "gamemode" "${servercfgfullpath}" | grep -v "#" | tr -cd '[:digit:]') gameworld=$(grep "level-name" "${servercfgfullpath}" | sed -e 's/^[ \t]*//g' -e '/^#/d' -e 's/level-name//g' | tr -d '=\";,:' | sed -e 's/^[ \t]*//' -e 's/[ \t]*$//') - ip=$(grep "server-ip" "${servercfgfullpath}" | sed -e 's/^[ \t]*//g' -e '/^--/d' -e 's/server-ip//g' | tr -d '=\";,:' | sed -e 's/^[ \t]*//' -e 's/[ \t]*$//') + configip=$(grep "server-ip" "${servercfgfullpath}" | sed -e 's/^[ \t]*//g' -e '/^--/d' -e 's/server-ip//g' | tr -d '=\";,:' | sed -e 's/^[ \t]*//' -e 's/[ \t]*$//') ipsetinconfig=1 ipinconfigvar="server-ip" @@ -721,7 +721,7 @@ fn_info_config_quakelive(){ 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]*$//') + configip=$(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" @@ -776,7 +776,7 @@ fn_info_config_risingworld(){ gamemode=$(grep "gamemode" "${servercfgfullpath}" | grep -v "#" | tr -cd '[:digit:]') gameworld=$(grep "server_world_name" "${servercfgfullpath}" | sed -e 's/^[ \t]*//g' -e '/^#/d' -e 's/server_world_name//g' | tr -d '=\";,:' | sed -e 's/^[ \t]*//' -e 's/[ \t]*$//') javaram=$(grep "server_memory" "${servercfgfullpath}" | sed -e 's/^[ \t]*//g' -e '/^#/d' -e 's/server_memory//g' | tr -d '=\";,:' | sed -e 's/^[ \t]*//' -e 's/[ \t]*$//') - ip=$(grep "server_ip" "${servercfgfullpath}" | grep -v "database_mysql_server_ip" | sed -e 's/^[ \t]*//g' -e '/^--/d' -e 's/server_ip//g' | tr -d '=\";,:' | sed -e 's/^[ \t]*//' -e 's/[ \t]*$//') + configip=$(grep "server_ip" "${servercfgfullpath}" | grep -v "database_mysql_server_ip" | sed -e 's/^[ \t]*//g' -e '/^--/d' -e 's/server_ip//g' | tr -d '=\";,:' | sed -e 's/^[ \t]*//' -e 's/[ \t]*$//') ipsetinconfig=1 ipinconfigvar="server-ip" @@ -930,7 +930,7 @@ fn_info_config_teamspeak3(){ queryport=$(grep "query_port" "${servercfgfullpath}" | grep -v "#" | tr -cd '[:digit:]') fileport=$(grep "filetransfer_port" "${servercfgfullpath}" | grep -v "#" | tr -cd '[:digit:]') - ip=$(grep "voice_ip" "${servercfgfullpath}" | sed -e 's/^[ \t]*//g' -e '/^#/d' -e 's/voice_ip//g' | sed 's/,.*//' | tr -d '=\";,' | sed -e 's/^[ \t]*//' -e 's/[ \t]*$//') + configip=$(grep "voice_ip" "${servercfgfullpath}" | sed -e 's/^[ \t]*//g' -e '/^#/d' -e 's/voice_ip//g' | sed 's/,.*//' | tr -d '=\";,' | sed -e 's/^[ \t]*//' -e 's/[ \t]*$//') ipsetinconfig=1 ipinconfigvar="voice_ip" @@ -950,7 +950,7 @@ fn_info_config_mumble(){ port=$(grep "port" "${servercfgfullpath}" | sed -e 's/^[ \t]*//g' -e '/^;/d' -e 's/port//g' | tr -d '=\";,:' | sed -e 's/^[ \t]*//' -e 's/[ \t]*$//') queryport="${port}" - ip=$(grep "host=" "${servercfgfullpath}" | sed -e 's/^[ \t]*//g' -e '/^;/d' -e 's/host=//g' | tr -d '=\";,:' | sed -e 's/^[ \t]*//' -e 's/[ \t]*$//') + configip=$(grep "host=" "${servercfgfullpath}" | sed -e 's/^[ \t]*//g' -e '/^;/d' -e 's/host=//g' | tr -d '=\";,:' | sed -e 's/^[ \t]*//' -e 's/[ \t]*$//') ipsetinconfig=1 ipinconfigvar="voice_ip" @@ -1264,7 +1264,7 @@ fn_info_config_sdtd(){ fn_info_config_mta(){ if [ ! -f "${servercfgfullpath}" ]; then - ip="${zero}" + configip="${zero}" port="${unavailable}" httpport="${unavailable}" ase="${unavailable}" @@ -1283,7 +1283,7 @@ fn_info_config_mta(){ else 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 "<") + # configip=$(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" @@ -1313,7 +1313,7 @@ fn_info_config_wolfensteinenemyterritory(){ 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]*$//') + configip=$(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" @@ -1343,7 +1343,7 @@ fn_info_config_etlegacy(){ 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]*$//') + configip=$(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" @@ -1375,7 +1375,7 @@ fn_info_config_wurmunlimited(){ adminpassword=$(grep "ADMINPWD=" "${servercfgfullpath}" | sed -e 's/^[ \t]*//g' -e '/^\//d' -e 's/ADMINPWD//g' | tr -d '=\";,:' | sed -e 's/^[ \t]*//' -e 's/[ \t]*$//') maxplayers=$(grep "MAXPLAYERS=" "${servercfgfullpath}" | grep -v "#" | tr -cd '[:digit:]') - ip=$(grep "IP" "${servercfgfullpath}" | sed -e 's/^[ \t]*//g' -e '/^#/d' -e 's/IP//g' | tr -d '=\";,:' | sed -e 's/^[ \t]*//' -e 's/[ \t]*$//') + configip=$(grep "IP" "${servercfgfullpath}" | sed -e 's/^[ \t]*//g' -e '/^#/d' -e 's/IP//g' | tr -d '=\";,:' | sed -e 's/^[ \t]*//' -e 's/[ \t]*$//') ipsetinconfig=1 ipinconfigvar="IP" diff --git a/lgsm/functions/info_distro.sh b/lgsm/functions/info_distro.sh index a8d61ce7e..7815e05fe 100644 --- a/lgsm/functions/info_distro.sh +++ b/lgsm/functions/info_distro.sh @@ -25,8 +25,7 @@ kernel=$(uname -r) # Gathers distro info from various sources filling in missing gaps. distro_info_array=( os-release lsb_release hostnamectl debian_version redhat-release ) -for distro_info in "${distro_info_array[@]}" -do +for distro_info in "${distro_info_array[@]}"; do if [ -f "/etc/os-release" ]&&[ "${distro_info}" == "os-release" ]; then distroname=$(grep PRETTY_NAME /etc/os-release | sed 's/PRETTY_NAME=//g' | tr -d '="' | sed 's/\"//g') distroversion=$(grep VERSION_ID /etc/os-release | sed 's/VERSION_ID=//g' | sed 's/\"//g') diff --git a/lgsm/functions/info_messages.sh b/lgsm/functions/info_messages.sh index d82462314..862673be4 100644 --- a/lgsm/functions/info_messages.sh +++ b/lgsm/functions/info_messages.sh @@ -555,8 +555,7 @@ fn_info_message_ports(){ parmslocation="${red}UNKNOWN${default}" # engines/games that require editing in the config file. local ports_edit_array=( "avalanche2.0" "avalanche3.0" "Ballistic Overkill" "dontstarve" "Eco" "idtech2" "idtech3" "idtech3_ql" "lwjgl2" "Minecraft Bedrock" "Project Cars" "projectzomboid" "quake" "refractor" "realvirtuality" "renderware" "seriousengine35" "Stationeers" "teeworlds" "terraria" "unreal" "unreal2" "unreal3" "TeamSpeak 3" "Mumble" "7 Days To Die" "wurm") - for port_edit in "${ports_edit_array[@]}" - do + for port_edit in "${ports_edit_array[@]}"; do if [ "${shortname}" == "ut3" ]; then parmslocation="${servercfgdir}/UTWeb.ini" elif [ "${shortname}" == "kf2" ]; then @@ -567,8 +566,7 @@ fn_info_message_ports(){ done # engines/games that require editing the parms. local ports_edit_array=( "Avorion" "goldsrc" "Factorio" "Hurtworld" "iw3.0" "ioquake3" "qfusion" "Rust" "Soldat" "spark" "source" "starbound" "unreal4" "realvirtuality" "Unturned" ) - for port_edit in "${ports_edit_array[@]}" - do + for port_edit in "${ports_edit_array[@]}"; do if [ "${engine}" == "${port_edit}" ]||[ "${gamename}" == "${port_edit}" ]||[ "${shortname}" == "${port_edit}" ]; then parmslocation="${configdirserver}" fi @@ -765,7 +763,7 @@ fn_info_message_dst(){ } fn_info_message_eco(){ - echo -e "netstat -atunp | grep mono" + echo -e "netstat -atunp | grep EcoServer" echo -e "" { echo -e "${lightblue}DESCRIPTION\tDIRECTION\tPORT\tPROTOCOL${default}" diff --git a/lgsm/functions/query_gamedig.sh b/lgsm/functions/query_gamedig.sh index 071645b49..3c5ff38bf 100644 --- a/lgsm/functions/query_gamedig.sh +++ b/lgsm/functions/query_gamedig.sh @@ -14,13 +14,13 @@ if [ "$(command -v gamedig 2>/dev/null)" ]&&[ "$(command -v jq 2>/dev/null)" ]; check_status.sh if [ "${status}" != "0" ]; then # checks if query is working null = pass. - gamedigcmd=$(echo -e "gamedig --type \"${querytype}\" --host \"${ip}\" --query_port \"${queryport}\"|jq") - gamedigraw=$(gamedig --type "${querytype}" --host "${ip}" --query_port "${queryport}") + gamedigcmd=$(echo -e "gamedig --type \"${querytype}\" --host \"${queryip}\" --query_port \"${queryport}\"|jq") + gamedigraw=$(gamedig --type "${querytype}" --host "${queryip}" --query_port "${queryport}") querystatus=$(echo "${gamedigraw}" | jq '.error|length') if [ "${querystatus}" != "null" ]; then - gamedigcmd=$(echo -e "gamedig --type \"${querytype}\" --host \"${ip}\" --port \"${queryport}\"|jq") - gamedigraw=$(gamedig --type "${querytype}" --host "${ip}" --port "${queryport}") + gamedigcmd=$(echo -e "gamedig --type \"${querytype}\" --host \"${queryip}\" --port \"${queryport}\"|jq") + gamedigraw=$(gamedig --type "${querytype}" --host "${queryip}" --port "${queryport}") querystatus=$(echo "${gamedigraw}" | jq '.error|length') fi diff --git a/linuxgsm.sh b/linuxgsm.sh index dc197210d..8e8c14dcc 100755 --- a/linuxgsm.sh +++ b/linuxgsm.sh @@ -82,8 +82,7 @@ fn_bootstrap_fetch_file(){ remote_fileurls_array=( remote_fileurl ) fi - for remote_fileurl_array in "${remote_fileurls_array[@]}" - do + for remote_fileurl_array in "${remote_fileurls_array[@]}"; do if [ "${remote_fileurl_array}" == "remote_fileurl" ]; then fileurl="${remote_fileurl}" fileurl_name="${remote_fileurl_name}" diff --git a/tests/tests_fctrserver.sh b/tests/tests_fctrserver.sh index 6510c82b5..3d98b862f 100644 --- a/tests/tests_fctrserver.sh +++ b/tests/tests_fctrserver.sh @@ -89,8 +89,7 @@ fn_bootstrap_fetch_file(){ remote_fileurls_array=( remote_fileurl ) fi - for remote_fileurl_array in "${remote_fileurls_array[@]}" - do + for remote_fileurl_array in "${remote_fileurls_array[@]}"; do if [ "${remote_fileurl_array}" == "remote_fileurl" ]; then fileurl="${remote_fileurl}" fileurl_name="${remote_fileurl_name}" diff --git a/tests/tests_jc2server.sh b/tests/tests_jc2server.sh index e546b74e9..35316674f 100644 --- a/tests/tests_jc2server.sh +++ b/tests/tests_jc2server.sh @@ -90,8 +90,7 @@ fn_bootstrap_fetch_file(){ remote_fileurls_array=( remote_fileurl ) fi - for remote_fileurl_array in "${remote_fileurls_array[@]}" - do + for remote_fileurl_array in "${remote_fileurls_array[@]}"; do if [ "${remote_fileurl_array}" == "remote_fileurl" ]; then fileurl="${remote_fileurl}" fileurl_name="${remote_fileurl_name}" diff --git a/tests/tests_mcserver.sh b/tests/tests_mcserver.sh index 8c52e05e4..8b8cae16c 100644 --- a/tests/tests_mcserver.sh +++ b/tests/tests_mcserver.sh @@ -90,8 +90,7 @@ fn_bootstrap_fetch_file(){ remote_fileurls_array=( remote_fileurl ) fi - for remote_fileurl_array in "${remote_fileurls_array[@]}" - do + for remote_fileurl_array in "${remote_fileurls_array[@]}"; do if [ "${remote_fileurl_array}" == "remote_fileurl" ]; then fileurl="${remote_fileurl}" fileurl_name="${remote_fileurl_name}" diff --git a/tests/tests_ts3server.sh b/tests/tests_ts3server.sh index 8a6d38e18..ff296e160 100644 --- a/tests/tests_ts3server.sh +++ b/tests/tests_ts3server.sh @@ -90,8 +90,7 @@ fn_bootstrap_fetch_file(){ remote_fileurls_array=( remote_fileurl ) fi - for remote_fileurl_array in "${remote_fileurls_array[@]}" - do + for remote_fileurl_array in "${remote_fileurls_array[@]}"; do if [ "${remote_fileurl_array}" == "remote_fileurl" ]; then fileurl="${remote_fileurl}" fileurl_name="${remote_fileurl_name}" From fa5a6689972b24e51b8da1ab094546a13c733432 Mon Sep 17 00:00:00 2001 From: Christian Date: Sun, 13 Sep 2020 22:41:01 +0200 Subject: [PATCH 449/534] fix(csserver): fix missing steamclient.so (#3030) Co-authored-by: Daniel Gibbs --- lgsm/functions/core_functions.sh | 5 +++++ lgsm/functions/fix.sh | 2 ++ lgsm/functions/fix_cs.sh | 21 +++++++++++++++++++++ lgsm/functions/fix_hw.sh | 4 ---- 4 files changed, 28 insertions(+), 4 deletions(-) create mode 100644 lgsm/functions/fix_cs.sh diff --git a/lgsm/functions/core_functions.sh b/lgsm/functions/core_functions.sh index 2057caf94..c11253717 100644 --- a/lgsm/functions/core_functions.sh +++ b/lgsm/functions/core_functions.sh @@ -325,6 +325,11 @@ functionfile="${FUNCNAME[0]}" fn_fetch_function } +fix_cs.sh(){ +functionfile="${FUNCNAME[0]}" +fn_fetch_function +} + fix_csgo.sh(){ functionfile="${FUNCNAME[0]}" fn_fetch_function diff --git a/lgsm/functions/fix.sh b/lgsm/functions/fix.sh index 74d6fb00b..a3c8afe39 100644 --- a/lgsm/functions/fix.sh +++ b/lgsm/functions/fix.sh @@ -40,6 +40,8 @@ if [ "${commandname}" != "INSTALL" ]&&[ -z "${fixbypass}" ]; then fix_arma3.sh elif [ "${shortname}" == "ark" ]; then fix_ark.sh + elif [ "${shortname}" == "cs" ]; then + fix_cs.sh elif [ "${shortname}" == "csgo" ]; then fix_csgo.sh elif [ "${shortname}" == "cmw" ]; then diff --git a/lgsm/functions/fix_cs.sh b/lgsm/functions/fix_cs.sh new file mode 100644 index 000000000..de1fa175b --- /dev/null +++ b/lgsm/functions/fix_cs.sh @@ -0,0 +1,21 @@ +#!/bin/bash +# LinuxGSM fix_cs.sh function +# Author: Christian Birk +# Website: https://linuxgsm.com +# Description: Resolves various issues with Counter Strike. + +functionselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" + +if [ "${shortname}" == "cs" ]; then + # Fixes: steamclient.so: cannot open shared object file: No such file or directory + if [ ! -f "${serverfiles}/steamclient.so" ]; then + fixname="steamclient.so x86" + fn_fix_msg_start + if [ -f "${HOME}/.steam/steamcmd/linux32/steamclient.so" ]; then + cp "${steamcmddir}/linux32/steamclient.so" "${serverfiles}/steamclient.so" >> "${lgsmlog}" + elif [ -f "${steamcmddir}/linux32/steamclient.so" ]; then + cp "${steamcmddir}/linux32/steamclient.so" "${serverfiles}/steamclient.so" >> "${lgsmlog}" + fi + fn_fix_msg_end + fi +fi diff --git a/lgsm/functions/fix_hw.sh b/lgsm/functions/fix_hw.sh index 6230f7b46..00b9d675d 100644 --- a/lgsm/functions/fix_hw.sh +++ b/lgsm/functions/fix_hw.sh @@ -15,8 +15,6 @@ if [ "${shortname}" == "hw" ]; then cp "${steamcmddir}/linux32/steamclient.so" "${serverfiles}/Hurtworld_Data/Plugins/x86/steamclient.so" >> "${lgsmlog}" elif [ -f "${steamcmddir}/linux32/steamclient.so" ]; then cp "${steamcmddir}/linux32/steamclient.so" "${serverfiles}/Hurtworld_Data/Plugins/x86/steamclient.so" >> "${lgsmlog}" - else - : fi fn_fix_msg_end fi @@ -27,8 +25,6 @@ if [ "${shortname}" == "hw" ]; then cp "${steamcmddir}/linux64/steamclient.so" "${serverfiles}/Hurtworld_Data/Plugins/x86_64/steamclient.so" >> "${lgsmlog}" elif [ -f "${steamcmddir}/linux64/steamclient.so" ]; then cp "${steamcmddir}/linux64/steamclient.so" "${serverfiles}/Hurtworld_Data/Plugins/x86_64/steamclient.so" >> "${lgsmlog}" - else - : fi fn_fix_msg_end fi From 37fda0ff7ea7315009d2a335f72b7b7ef9e926bc Mon Sep 17 00:00:00 2001 From: Christian Date: Sun, 13 Sep 2020 22:45:08 +0200 Subject: [PATCH 450/534] fix(fctrserver): fix and improve fetching info from config file (#3031) --- lgsm/functions/info_config.sh | 17 +++++++++++++---- lgsm/functions/info_messages.sh | 15 +++++++++++++++ 2 files changed, 28 insertions(+), 4 deletions(-) diff --git a/lgsm/functions/info_config.sh b/lgsm/functions/info_config.sh index a04dd1ac7..fd7ea988e 100644 --- a/lgsm/functions/info_config.sh +++ b/lgsm/functions/info_config.sh @@ -377,15 +377,24 @@ fn_info_config_factorio(){ servername="Factorio Server" serverpassword="${unavailable}" maxplayers="${zero}" + authtoken=${authtoken:-"NOT SET"} + savegameinterval="${unavailable}" + versioncount="${unavailable}" else - servername="Factorio Server" - 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:]') + servername=$(jq -r '.name' "${servercfgfullpath}") + serverpassword=$(jq -r '.game_password' "${servercfgfullpath}") + maxplayers=$(jq -r '.max_players' "${servercfgfullpath}") + authtoken=$(jq -r '.token' "${servercfgfullpath}") + savegameinterval=$(jq -r '.autosave_interval' "${servercfgfullpath}") + versioncount=$(jq -r '.autosave_slots' "${servercfgfullpath}") # Not Set servername=${servername:-"NOT SET"} serverpassword=${serverpassword:-"NOT SET"} - maxplayers=${maxplayers=:-"0"} + maxplayers=${maxplayers:-"0"} + authtoken=${authtoken:-"NOT SET"} + savegameinterval=${savegameinterval:-"0"} + versioncount=${versioncount:-"0"} fi } diff --git a/lgsm/functions/info_messages.sh b/lgsm/functions/info_messages.sh index 862673be4..a7d6a1261 100644 --- a/lgsm/functions/info_messages.sh +++ b/lgsm/functions/info_messages.sh @@ -382,6 +382,21 @@ fn_info_message_gameserver(){ echo -e "${lightblue}Server Version:\t${default}${serverversion}" fi + # authentication token (Factorio) + if [ -n "${authtoken}" ]; then + echo -e "${lightblue}Auth Token:\t${default}${authtoken}" + fi + + # savegameinterval (Factorio) + if [ -n "${savegameinterval}" ]; then + echo -e "${lightblue}Savegame Interval:\t${default}${savegameinterval}" + fi + + # versioncount (Factorio) + if [ -n "${versioncount}" ]; then + echo -e "${lightblue}Version Count:\t${default}${versioncount}" + fi + # Listed on Master server if [ -n "${displaymasterserver}" ]; then if [ "${displaymasterserver}" == "true" ]; then From cb03c1653983079d52e261dc70533656c4fe72bd Mon Sep 17 00:00:00 2001 From: Christian Date: Sun, 13 Sep 2020 23:34:46 +0200 Subject: [PATCH 451/534] fix(pzserver): fix missing steamclient.so (#3029) * further standardisation of steamclient.so fixes Co-authored-by: Daniel Gibbs --- lgsm/functions/core_functions.sh | 5 +++++ lgsm/functions/fix.sh | 2 ++ lgsm/functions/fix_cmw.sh | 5 ++--- lgsm/functions/fix_cs.sh | 20 +++++++++----------- lgsm/functions/fix_hw.sh | 4 ++-- lgsm/functions/fix_pz.sh | 30 ++++++++++++++++++++++++++++++ lgsm/functions/fix_steamcmd.sh | 4 ++-- lgsm/functions/fix_tu.sh | 16 +++++++++------- lgsm/functions/fix_wurm.sh | 10 ++++++++-- 9 files changed, 69 insertions(+), 27 deletions(-) create mode 100644 lgsm/functions/fix_pz.sh diff --git a/lgsm/functions/core_functions.sh b/lgsm/functions/core_functions.sh index c11253717..9b79fae06 100644 --- a/lgsm/functions/core_functions.sh +++ b/lgsm/functions/core_functions.sh @@ -385,6 +385,11 @@ functionfile="${FUNCNAME[0]}" fn_fetch_function } +fix_pz.sh(){ +functionfile="${FUNCNAME[0]}" +fn_fetch_function +} + fix_ro.sh(){ functionfile="${FUNCNAME[0]}" fn_fetch_function diff --git a/lgsm/functions/fix.sh b/lgsm/functions/fix.sh index a3c8afe39..9c773523a 100644 --- a/lgsm/functions/fix.sh +++ b/lgsm/functions/fix.sh @@ -58,6 +58,8 @@ if [ "${commandname}" != "INSTALL" ]&&[ -z "${fixbypass}" ]; then fix_nmrih.sh elif [ "${shortname}" == "onset" ]; then fix_onset.sh + elif [ "${shortname}" == "pz" ]; then + fix_pz.sh elif [ "${shortname}" == "rust" ]; then fix_rust.sh elif [ "${shortname}" == "rw" ]; then diff --git a/lgsm/functions/fix_cmw.sh b/lgsm/functions/fix_cmw.sh index 7dc502be6..ac1e3d089 100644 --- a/lgsm/functions/fix_cmw.sh +++ b/lgsm/functions/fix_cmw.sh @@ -12,12 +12,11 @@ if [ ! -f "${executabledir}/steam_appid.txt" ]; then fn_fix_msg_end fi - if [ ! -f "${executabledir}/lib/steamclient.so" ]; then - fixname="steamclient.so" + fixname="steamclient.so x86" fn_fix_msg_start if [ -f "${HOME}/.steam/steamcmd/linux32/steamclient.so" ]; then - cp "${steamcmddir}/linux32/steamclient.so" "${executabledir}/lib/steamclient.so" + cp "${HOME}/.steam/steamcmd/linux32/steamclient.so" "${executabledir}/lib/steamclient.so" elif [ -f "${steamcmddir}/linux32/steamclient.so" ]; then cp "${steamcmddir}/linux32/steamclient.so" "${executabledir}/lib/steamclient.so" fi diff --git a/lgsm/functions/fix_cs.sh b/lgsm/functions/fix_cs.sh index de1fa175b..6f1f1eca7 100644 --- a/lgsm/functions/fix_cs.sh +++ b/lgsm/functions/fix_cs.sh @@ -6,16 +6,14 @@ functionselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" -if [ "${shortname}" == "cs" ]; then - # Fixes: steamclient.so: cannot open shared object file: No such file or directory - if [ ! -f "${serverfiles}/steamclient.so" ]; then - fixname="steamclient.so x86" - fn_fix_msg_start - if [ -f "${HOME}/.steam/steamcmd/linux32/steamclient.so" ]; then - cp "${steamcmddir}/linux32/steamclient.so" "${serverfiles}/steamclient.so" >> "${lgsmlog}" - elif [ -f "${steamcmddir}/linux32/steamclient.so" ]; then - cp "${steamcmddir}/linux32/steamclient.so" "${serverfiles}/steamclient.so" >> "${lgsmlog}" - fi - fn_fix_msg_end +# Fixes: steamclient.so: cannot open shared object file: No such file or directory +if [ ! -f "${serverfiles}/steamclient.so" ]; then + fixname="steamclient.so x86" + fn_fix_msg_start + if [ -f "${HOME}/.steam/steamcmd/linux32/steamclient.so" ]; then + cp "${HOME}/.steam/steamcmd/linux32/steamclient.so" "${serverfiles}/steamclient.so" + elif [ -f "${steamcmddir}/linux32/steamclient.so" ]; then + cp "${steamcmddir}/linux32/steamclient.so" "${serverfiles}/steamclient.so" fi + fn_fix_msg_end fi diff --git a/lgsm/functions/fix_hw.sh b/lgsm/functions/fix_hw.sh index 00b9d675d..cccc9d0ed 100644 --- a/lgsm/functions/fix_hw.sh +++ b/lgsm/functions/fix_hw.sh @@ -12,7 +12,7 @@ if [ "${shortname}" == "hw" ]; then fixname="steamclient.so x86" fn_fix_msg_start if [ -f "${HOME}/.steam/steamcmd/linux32/steamclient.so" ]; then - cp "${steamcmddir}/linux32/steamclient.so" "${serverfiles}/Hurtworld_Data/Plugins/x86/steamclient.so" >> "${lgsmlog}" + cp "${HOME}/.steam/steamcmd/linux32/steamclient.so" "${serverfiles}/Hurtworld_Data/Plugins/x86/steamclient.so" >> "${lgsmlog}" elif [ -f "${steamcmddir}/linux32/steamclient.so" ]; then cp "${steamcmddir}/linux32/steamclient.so" "${serverfiles}/Hurtworld_Data/Plugins/x86/steamclient.so" >> "${lgsmlog}" fi @@ -22,7 +22,7 @@ if [ "${shortname}" == "hw" ]; then fixname="steamclient.so x86_64" fn_fix_msg_start if [ -f "${HOME}/.steam/steamcmd/linux64/steamclient.so" ]; then - cp "${steamcmddir}/linux64/steamclient.so" "${serverfiles}/Hurtworld_Data/Plugins/x86_64/steamclient.so" >> "${lgsmlog}" + cp "${HOME}/.steam/steamcmd/linux64/steamclient.so" "${serverfiles}/Hurtworld_Data/Plugins/x86_64/steamclient.so" >> "${lgsmlog}" elif [ -f "${steamcmddir}/linux64/steamclient.so" ]; then cp "${steamcmddir}/linux64/steamclient.so" "${serverfiles}/Hurtworld_Data/Plugins/x86_64/steamclient.so" >> "${lgsmlog}" fi diff --git a/lgsm/functions/fix_pz.sh b/lgsm/functions/fix_pz.sh new file mode 100644 index 000000000..c49a624ba --- /dev/null +++ b/lgsm/functions/fix_pz.sh @@ -0,0 +1,30 @@ +#!/bin/bash +# LinuxGSM fix_pz.sh function +# Author: Christian Birk +# Website: https://linuxgsm.com +# Description: Resolves various issues with Project Zomboid. + +functionselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" + +# Fixes: [S_API FAIL] SteamAPI_Init() failed; unable to locate a running instance of Steam, or a local steamclient.so. +if [ ! -f "${serverfiles}/linux32/steamclient.so" ]; then + fixname="steamclient.so x86" + fn_fix_msg_start + if [ -f "${HOME}/.steam/steamcmd/linux32/steamclient.so" ]; then + cp "${HOME}/.steam/steamcmd/linux32/steamclient.so" "${serverfiles}/linux32/steamclient.so" >> "${lgsmlog}" + elif [ -f "${steamcmddir}/linux32/steamclient.so" ]; then + cp "${steamcmddir}/linux32/steamclient.so" "${serverfiles}/linux32/steamclient.so" >> "${lgsmlog}" + fi + fn_fix_msg_end +fi + +if [ ! -f "${serverfiles}/linux64/steamclient.so" ]; then + fixname="steamclient.so x86_64" + fn_fix_msg_start + if [ -f "${HOME}/.steam/steamcmd/linux64/steamclient.so" ]; then + cp "${HOME}/.steam/steamcmd/linux64/steamclient.so" "${serverfiles}/linux64/steamclient.so" >> "${lgsmlog}" + elif [ -f "${steamcmddir}/linux64/steamclient.so" ]; then + cp "${steamcmddir}/linux64/steamclient.so" "${serverfiles}/linux64/steamclient.so" >> "${lgsmlog}" + fi + fn_fix_msg_end +fi diff --git a/lgsm/functions/fix_steamcmd.sh b/lgsm/functions/fix_steamcmd.sh index 0a2f774f1..fc02dd60e 100644 --- a/lgsm/functions/fix_steamcmd.sh +++ b/lgsm/functions/fix_steamcmd.sh @@ -12,7 +12,7 @@ if [ ! -f "${HOME}/.steam/sdk64/steamclient.so" ]; then fn_fix_msg_start mkdir -pv "${HOME}/.steam/sdk64" >> "${lgsmlog}" if [ -f "${HOME}/.steam/steamcmd/linux64/steamclient.so" ]; then - cp "${steamcmddir}/linux64/steamclient.so" "${HOME}/.steam/sdk64/steamclient.so" >> "${lgsmlog}" + cp "${HOME}/.steam/steamcmd/linux64/steamclient.so" "${HOME}/.steam/sdk64/steamclient.so" >> "${lgsmlog}" elif [ -f "${steamcmddir}/linux64/steamclient.so" ]; then cp "${steamcmddir}/linux64/steamclient.so" "${HOME}/.steam/sdk64/steamclient.so" >> "${lgsmlog}" fi @@ -25,7 +25,7 @@ if [ ! -f "${HOME}/.steam/sdk32/steamclient.so" ]; then fn_fix_msg_start mkdir -pv "${HOME}/.steam/sdk32" >> "${lgsmlog}" if [ -f "${HOME}/.steam/steamcmd/linux32/steamclient.so" ]; then - cp "${steamcmddir}/linux32/steamclient.so" "${HOME}/.steam/sdk32/steamclient.so" >> "${lgsmlog}" + cp "${HOME}/.steam/steamcmd/linux32/steamclient.so" "${HOME}/.steam/sdk32/steamclient.so" >> "${lgsmlog}" elif [ -f "${steamcmddir}/linux32/steamclient.so" ]; then cp "${steamcmddir}/linux32/steamclient.so" "${HOME}/.steam/sdk32/steamclient.so" >> "${lgsmlog}" fi diff --git a/lgsm/functions/fix_tu.sh b/lgsm/functions/fix_tu.sh index 1f01fd7b3..5d09bf3c2 100644 --- a/lgsm/functions/fix_tu.sh +++ b/lgsm/functions/fix_tu.sh @@ -6,12 +6,14 @@ functionselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" -if [ "${shortname}" == "tu" ]; 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 "${serverfiles}/linux64/steamclient.so" "${executabledir}/steamclient.so" >> "${lgsmlog}" - fn_fix_msg_end +# 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 x86_64" + fn_fix_msg_start + if [ -f "${HOME}/.steam/steamcmd/linux64/steamclient.so" ]; then + cp "${HOME}/.steam/steamcmd/linux64/steamclient.so" "${executabledir}/steamclient.so" >> "${lgsmlog}" + elif [ -f "${steamcmddir}/linux64/steamclient.so" ]; then + cp "${steamcmddir}/linux64/steamclient.so" "${executabledir}/steamclient.so" >> "${lgsmlog}" fi + fn_fix_msg_end fi diff --git a/lgsm/functions/fix_wurm.sh b/lgsm/functions/fix_wurm.sh index dfba3afdc..1285fb54e 100644 --- a/lgsm/functions/fix_wurm.sh +++ b/lgsm/functions/fix_wurm.sh @@ -6,9 +6,15 @@ functionselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" -# Copies steamclient.so to correct location. if [ ! -f "${serverfiles}/nativelibs" ]; then - cp -f "${serverfiles}/linux64/steamclient.so" "${serverfiles}/nativelibs" + fixname="steamclient.so x86" + fn_fix_msg_start + if [ -f "${HOME}/.steam/steamcmd/linux32/steamclient.so" ]; then + cp "${HOME}/.steam/steamcmd/linux32/steamclient.so" "${serverfiles}/nativelibs" >> "${lgsmlog}" + elif [ -f "${steamcmddir}/linux32/steamclient.so" ]; then + cp "${steamcmddir}/linux32/steamclient.so" "${serverfiles}/nativelibs" >> "${lgsmlog}" + fi + fn_fix_msg_end fi # First run requires start with no parms. From 6102c28fd51cedf0a8362b935e83c8006fec6e23 Mon Sep 17 00:00:00 2001 From: Christian Date: Sun, 13 Sep 2020 23:40:21 +0200 Subject: [PATCH 452/534] fix(config): add pushoveruserkey to all configs (#3028) --- lgsm/config-default/config-lgsm/acserver/_default.cfg | 1 + lgsm/config-default/config-lgsm/ahl2server/_default.cfg | 1 + lgsm/config-default/config-lgsm/ahlserver/_default.cfg | 1 + lgsm/config-default/config-lgsm/arkserver/_default.cfg | 1 + lgsm/config-default/config-lgsm/arma3server/_default.cfg | 1 + lgsm/config-default/config-lgsm/avserver/_default.cfg | 1 + lgsm/config-default/config-lgsm/bb2server/_default.cfg | 1 + lgsm/config-default/config-lgsm/bbserver/_default.cfg | 1 + lgsm/config-default/config-lgsm/bdserver/_default.cfg | 1 + lgsm/config-default/config-lgsm/bf1942server/_default.cfg | 1 + lgsm/config-default/config-lgsm/bfvserver/_default.cfg | 1 + lgsm/config-default/config-lgsm/bmdmserver/_default.cfg | 1 + lgsm/config-default/config-lgsm/boserver/_default.cfg | 1 + lgsm/config-default/config-lgsm/bsserver/_default.cfg | 1 + lgsm/config-default/config-lgsm/bt1944server/_default.cfg | 1 + lgsm/config-default/config-lgsm/btserver/_default.cfg | 1 + lgsm/config-default/config-lgsm/ccserver/_default.cfg | 1 + lgsm/config-default/config-lgsm/cmwserver/_default.cfg | 1 + lgsm/config-default/config-lgsm/cod2server/_default.cfg | 1 + lgsm/config-default/config-lgsm/cod4server/_default.cfg | 1 + lgsm/config-default/config-lgsm/codserver/_default.cfg | 1 + lgsm/config-default/config-lgsm/coduoserver/_default.cfg | 1 + lgsm/config-default/config-lgsm/codwawserver/_default.cfg | 1 + lgsm/config-default/config-lgsm/csczserver/_default.cfg | 1 + lgsm/config-default/config-lgsm/csgoserver/_default.cfg | 1 + lgsm/config-default/config-lgsm/csserver/_default.cfg | 1 + lgsm/config-default/config-lgsm/cssserver/_default.cfg | 1 + lgsm/config-default/config-lgsm/dabserver/_default.cfg | 1 + lgsm/config-default/config-lgsm/dmcserver/_default.cfg | 1 + lgsm/config-default/config-lgsm/dodserver/_default.cfg | 1 + lgsm/config-default/config-lgsm/dodsserver/_default.cfg | 1 + lgsm/config-default/config-lgsm/doiserver/_default.cfg | 1 + lgsm/config-default/config-lgsm/dstserver/_default.cfg | 1 + lgsm/config-default/config-lgsm/dysserver/_default.cfg | 1 + lgsm/config-default/config-lgsm/ecoserver/_default.cfg | 1 + lgsm/config-default/config-lgsm/emserver/_default.cfg | 1 + lgsm/config-default/config-lgsm/etlserver/_default.cfg | 1 + lgsm/config-default/config-lgsm/fctrserver/_default.cfg | 1 + lgsm/config-default/config-lgsm/fofserver/_default.cfg | 1 + lgsm/config-default/config-lgsm/gesserver/_default.cfg | 1 + lgsm/config-default/config-lgsm/gmodserver/_default.cfg | 1 + lgsm/config-default/config-lgsm/hl2dmserver/_default.cfg | 1 + lgsm/config-default/config-lgsm/hldmserver/_default.cfg | 1 + lgsm/config-default/config-lgsm/hldmsserver/_default.cfg | 1 + lgsm/config-default/config-lgsm/hwserver/_default.cfg | 1 + lgsm/config-default/config-lgsm/insserver/_default.cfg | 1 + lgsm/config-default/config-lgsm/inssserver/_default.cfg | 1 + lgsm/config-default/config-lgsm/iosserver/_default.cfg | 1 + lgsm/config-default/config-lgsm/jc2server/_default.cfg | 1 + lgsm/config-default/config-lgsm/jc3server/_default.cfg | 1 + lgsm/config-default/config-lgsm/jk2server/_default.cfg | 1 + lgsm/config-default/config-lgsm/kf2server/_default.cfg | 1 + lgsm/config-default/config-lgsm/kfserver/_default.cfg | 1 + lgsm/config-default/config-lgsm/l4d2server/_default.cfg | 1 + lgsm/config-default/config-lgsm/l4dserver/_default.cfg | 1 + lgsm/config-default/config-lgsm/mcbserver/_default.cfg | 1 + lgsm/config-default/config-lgsm/mcserver/_default.cfg | 1 + lgsm/config-default/config-lgsm/mhserver/_default.cfg | 1 + lgsm/config-default/config-lgsm/mohaaserver/_default.cfg | 1 + lgsm/config-default/config-lgsm/momserver/_default.cfg | 1 + lgsm/config-default/config-lgsm/mtaserver/_default.cfg | 1 + lgsm/config-default/config-lgsm/mumbleserver/_default.cfg | 1 + lgsm/config-default/config-lgsm/ndserver/_default.cfg | 1 + lgsm/config-default/config-lgsm/nmrihserver/_default.cfg | 1 + lgsm/config-default/config-lgsm/ns2cserver/_default.cfg | 1 + lgsm/config-default/config-lgsm/ns2server/_default.cfg | 1 + lgsm/config-default/config-lgsm/nsserver/_default.cfg | 1 + lgsm/config-default/config-lgsm/onsetserver/_default.cfg | 1 + lgsm/config-default/config-lgsm/opforserver/_default.cfg | 1 + lgsm/config-default/config-lgsm/pcserver/_default.cfg | 1 + lgsm/config-default/config-lgsm/pstbsserver/_default.cfg | 1 + lgsm/config-default/config-lgsm/pvkiiserver/_default.cfg | 1 + lgsm/config-default/config-lgsm/pzserver/_default.cfg | 1 + lgsm/config-default/config-lgsm/q2server/_default.cfg | 1 + lgsm/config-default/config-lgsm/q3server/_default.cfg | 1 + lgsm/config-default/config-lgsm/qlserver/_default.cfg | 1 + lgsm/config-default/config-lgsm/qwserver/_default.cfg | 1 + lgsm/config-default/config-lgsm/ricochetserver/_default.cfg | 1 + lgsm/config-default/config-lgsm/roserver/_default.cfg | 1 + lgsm/config-default/config-lgsm/rtcwserver/_default.cfg | 1 + lgsm/config-default/config-lgsm/rustserver/_default.cfg | 1 + lgsm/config-default/config-lgsm/rwserver/_default.cfg | 1 + lgsm/config-default/config-lgsm/sampserver/_default.cfg | 1 + lgsm/config-default/config-lgsm/sbotsserver/_default.cfg | 1 + lgsm/config-default/config-lgsm/sbserver/_default.cfg | 1 + lgsm/config-default/config-lgsm/sdtdserver/_default.cfg | 1 + lgsm/config-default/config-lgsm/sfcserver/_default.cfg | 1 + lgsm/config-default/config-lgsm/sof2server/_default.cfg | 1 + lgsm/config-default/config-lgsm/solserver/_default.cfg | 1 + lgsm/config-default/config-lgsm/squadserver/_default.cfg | 1 + lgsm/config-default/config-lgsm/ss3server/_default.cfg | 1 + lgsm/config-default/config-lgsm/stserver/_default.cfg | 1 + lgsm/config-default/config-lgsm/svenserver/_default.cfg | 1 + lgsm/config-default/config-lgsm/terrariaserver/_default.cfg | 1 + lgsm/config-default/config-lgsm/tf2server/_default.cfg | 1 + lgsm/config-default/config-lgsm/tfcserver/_default.cfg | 1 + lgsm/config-default/config-lgsm/ts3server/_default.cfg | 1 + lgsm/config-default/config-lgsm/tsserver/_default.cfg | 1 + lgsm/config-default/config-lgsm/tuserver/_default.cfg | 1 + lgsm/config-default/config-lgsm/twserver/_default.cfg | 1 + lgsm/config-default/config-lgsm/untserver/_default.cfg | 1 + lgsm/config-default/config-lgsm/ut2k4server/_default.cfg | 1 + lgsm/config-default/config-lgsm/ut3server/_default.cfg | 1 + lgsm/config-default/config-lgsm/ut99server/_default.cfg | 1 + lgsm/config-default/config-lgsm/utserver/_default.cfg | 1 + lgsm/config-default/config-lgsm/vsserver/_default.cfg | 1 + lgsm/config-default/config-lgsm/wetserver/_default.cfg | 1 + lgsm/config-default/config-lgsm/wfserver/_default.cfg | 1 + lgsm/config-default/config-lgsm/wurmserver/_default.cfg | 1 + lgsm/config-default/config-lgsm/zmrserver/_default.cfg | 1 + lgsm/config-default/config-lgsm/zpsserver/_default.cfg | 1 + 111 files changed, 111 insertions(+) diff --git a/lgsm/config-default/config-lgsm/acserver/_default.cfg b/lgsm/config-default/config-lgsm/acserver/_default.cfg index cdb1ae59b..ad98300fe 100644 --- a/lgsm/config-default/config-lgsm/acserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/acserver/_default.cfg @@ -67,6 +67,7 @@ channeltag="" # Pushover Alerts | https://docs.linuxgsm.com/alerts/pushover pushoveralert="off" pushovertoken="accesstoken" +pushoveruserkey="userkey" # Slack Alerts | https://docs.linuxgsm.com/alerts/slack slackalert="off" diff --git a/lgsm/config-default/config-lgsm/ahl2server/_default.cfg b/lgsm/config-default/config-lgsm/ahl2server/_default.cfg index 9eac5f899..212d9ca01 100644 --- a/lgsm/config-default/config-lgsm/ahl2server/_default.cfg +++ b/lgsm/config-default/config-lgsm/ahl2server/_default.cfg @@ -73,6 +73,7 @@ channeltag="" # Pushover Alerts | https://docs.linuxgsm.com/alerts/pushover pushoveralert="off" pushovertoken="accesstoken" +pushoveruserkey="userkey" # Slack Alerts | https://docs.linuxgsm.com/alerts/slack slackalert="off" diff --git a/lgsm/config-default/config-lgsm/ahlserver/_default.cfg b/lgsm/config-default/config-lgsm/ahlserver/_default.cfg index b7409c8b6..b19364cee 100644 --- a/lgsm/config-default/config-lgsm/ahlserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/ahlserver/_default.cfg @@ -68,6 +68,7 @@ channeltag="" # Pushover Alerts | https://docs.linuxgsm.com/alerts/pushover pushoveralert="off" pushovertoken="accesstoken" +pushoveruserkey="userkey" # Slack Alerts | https://docs.linuxgsm.com/alerts/slack slackalert="off" diff --git a/lgsm/config-default/config-lgsm/arkserver/_default.cfg b/lgsm/config-default/config-lgsm/arkserver/_default.cfg index c83a5f28e..e2620b1c4 100644 --- a/lgsm/config-default/config-lgsm/arkserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/arkserver/_default.cfg @@ -71,6 +71,7 @@ channeltag="" # Pushover Alerts | https://docs.linuxgsm.com/alerts/pushover pushoveralert="off" pushovertoken="accesstoken" +pushoveruserkey="userkey" # Slack Alerts | https://docs.linuxgsm.com/alerts/slack slackalert="off" diff --git a/lgsm/config-default/config-lgsm/arma3server/_default.cfg b/lgsm/config-default/config-lgsm/arma3server/_default.cfg index cc5830610..349b44a2c 100644 --- a/lgsm/config-default/config-lgsm/arma3server/_default.cfg +++ b/lgsm/config-default/config-lgsm/arma3server/_default.cfg @@ -84,6 +84,7 @@ channeltag="" # Pushover Alerts | https://docs.linuxgsm.com/alerts/pushover pushoveralert="off" pushovertoken="accesstoken" +pushoveruserkey="userkey" # Slack Alerts | https://docs.linuxgsm.com/alerts/slack slackalert="off" diff --git a/lgsm/config-default/config-lgsm/avserver/_default.cfg b/lgsm/config-default/config-lgsm/avserver/_default.cfg index 78cde5552..82fd225cc 100644 --- a/lgsm/config-default/config-lgsm/avserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/avserver/_default.cfg @@ -68,6 +68,7 @@ channeltag="" # Pushover Alerts | https://docs.linuxgsm.com/alerts/pushover pushoveralert="off" pushovertoken="accesstoken" +pushoveruserkey="userkey" # Slack Alerts | https://docs.linuxgsm.com/alerts/slack slackalert="off" diff --git a/lgsm/config-default/config-lgsm/bb2server/_default.cfg b/lgsm/config-default/config-lgsm/bb2server/_default.cfg index 4709e8ebc..4da63f06a 100644 --- a/lgsm/config-default/config-lgsm/bb2server/_default.cfg +++ b/lgsm/config-default/config-lgsm/bb2server/_default.cfg @@ -74,6 +74,7 @@ channeltag="" # Pushover Alerts | https://docs.linuxgsm.com/alerts/pushover pushoveralert="off" pushovertoken="accesstoken" +pushoveruserkey="userkey" # Slack Alerts | https://docs.linuxgsm.com/alerts/slack slackalert="off" diff --git a/lgsm/config-default/config-lgsm/bbserver/_default.cfg b/lgsm/config-default/config-lgsm/bbserver/_default.cfg index 4cc8a01c0..2b8b4112a 100644 --- a/lgsm/config-default/config-lgsm/bbserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/bbserver/_default.cfg @@ -68,6 +68,7 @@ channeltag="" # Pushover Alerts | https://docs.linuxgsm.com/alerts/pushover pushoveralert="off" pushovertoken="accesstoken" +pushoveruserkey="userkey" # Slack Alerts | https://docs.linuxgsm.com/alerts/slack slackalert="off" diff --git a/lgsm/config-default/config-lgsm/bdserver/_default.cfg b/lgsm/config-default/config-lgsm/bdserver/_default.cfg index e9ee37c35..0fcce8213 100644 --- a/lgsm/config-default/config-lgsm/bdserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/bdserver/_default.cfg @@ -68,6 +68,7 @@ channeltag="" # Pushover Alerts | https://docs.linuxgsm.com/alerts/pushover pushoveralert="off" pushovertoken="accesstoken" +pushoveruserkey="userkey" # Slack Alerts | https://docs.linuxgsm.com/alerts/slack slackalert="off" diff --git a/lgsm/config-default/config-lgsm/bf1942server/_default.cfg b/lgsm/config-default/config-lgsm/bf1942server/_default.cfg index 8ea237c41..d44f2631e 100644 --- a/lgsm/config-default/config-lgsm/bf1942server/_default.cfg +++ b/lgsm/config-default/config-lgsm/bf1942server/_default.cfg @@ -61,6 +61,7 @@ channeltag="" # Pushover Alerts | https://docs.linuxgsm.com/alerts/pushover pushoveralert="off" pushovertoken="accesstoken" +pushoveruserkey="userkey" # Slack Alerts | https://docs.linuxgsm.com/alerts/slack slackalert="off" diff --git a/lgsm/config-default/config-lgsm/bfvserver/_default.cfg b/lgsm/config-default/config-lgsm/bfvserver/_default.cfg index d38d13fcd..50c7a37d3 100644 --- a/lgsm/config-default/config-lgsm/bfvserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/bfvserver/_default.cfg @@ -61,6 +61,7 @@ channeltag="" # Pushover Alerts | https://docs.linuxgsm.com/alerts/pushover pushoveralert="off" pushovertoken="accesstoken" +pushoveruserkey="userkey" # Slack Alerts | https://docs.linuxgsm.com/alerts/slack slackalert="off" diff --git a/lgsm/config-default/config-lgsm/bmdmserver/_default.cfg b/lgsm/config-default/config-lgsm/bmdmserver/_default.cfg index f9c08c2fd..c92b26f90 100644 --- a/lgsm/config-default/config-lgsm/bmdmserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/bmdmserver/_default.cfg @@ -74,6 +74,7 @@ channeltag="" # Pushover Alerts | https://docs.linuxgsm.com/alerts/pushover pushoveralert="off" pushovertoken="accesstoken" +pushoveruserkey="userkey" # Slack Alerts | https://docs.linuxgsm.com/alerts/slack slackalert="off" diff --git a/lgsm/config-default/config-lgsm/boserver/_default.cfg b/lgsm/config-default/config-lgsm/boserver/_default.cfg index 0c8d8aa3f..5f79119a4 100644 --- a/lgsm/config-default/config-lgsm/boserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/boserver/_default.cfg @@ -67,6 +67,7 @@ channeltag="" # Pushover Alerts | https://docs.linuxgsm.com/alerts/pushover pushoveralert="off" pushovertoken="accesstoken" +pushoveruserkey="userkey" # Slack Alerts | https://docs.linuxgsm.com/alerts/slack slackalert="off" diff --git a/lgsm/config-default/config-lgsm/bsserver/_default.cfg b/lgsm/config-default/config-lgsm/bsserver/_default.cfg index 566ba4549..575c79ab8 100644 --- a/lgsm/config-default/config-lgsm/bsserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/bsserver/_default.cfg @@ -78,6 +78,7 @@ channeltag="" # Pushover Alerts | https://docs.linuxgsm.com/alerts/pushover pushoveralert="off" pushovertoken="accesstoken" +pushoveruserkey="userkey" # Slack Alerts | https://docs.linuxgsm.com/alerts/slack slackalert="off" diff --git a/lgsm/config-default/config-lgsm/bt1944server/_default.cfg b/lgsm/config-default/config-lgsm/bt1944server/_default.cfg index 51611e63e..eaaaad8d4 100644 --- a/lgsm/config-default/config-lgsm/bt1944server/_default.cfg +++ b/lgsm/config-default/config-lgsm/bt1944server/_default.cfg @@ -66,6 +66,7 @@ channeltag="" # Pushover Alerts | https://docs.linuxgsm.com/alerts/pushover pushoveralert="off" pushovertoken="accesstoken" +pushoveruserkey="userkey" # Slack Alerts | https://docs.linuxgsm.com/alerts/slack slackalert="off" diff --git a/lgsm/config-default/config-lgsm/btserver/_default.cfg b/lgsm/config-default/config-lgsm/btserver/_default.cfg index 434e96fd8..99f092625 100644 --- a/lgsm/config-default/config-lgsm/btserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/btserver/_default.cfg @@ -61,6 +61,7 @@ channeltag="" # Pushover Alerts | https://docs.linuxgsm.com/alerts/pushover pushoveralert="off" pushovertoken="accesstoken" +pushoveruserkey="userkey" # Slack Alerts | https://docs.linuxgsm.com/alerts/slack slackalert="off" diff --git a/lgsm/config-default/config-lgsm/ccserver/_default.cfg b/lgsm/config-default/config-lgsm/ccserver/_default.cfg index 9ceaccefa..73ed33297 100644 --- a/lgsm/config-default/config-lgsm/ccserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/ccserver/_default.cfg @@ -69,6 +69,7 @@ channeltag="" # Pushover Alerts | https://docs.linuxgsm.com/alerts/pushover pushoveralert="off" pushovertoken="accesstoken" +pushoveruserkey="userkey" # Slack Alerts | https://docs.linuxgsm.com/alerts/slack slackalert="off" diff --git a/lgsm/config-default/config-lgsm/cmwserver/_default.cfg b/lgsm/config-default/config-lgsm/cmwserver/_default.cfg index 279db1e8e..f1887490e 100644 --- a/lgsm/config-default/config-lgsm/cmwserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/cmwserver/_default.cfg @@ -70,6 +70,7 @@ channeltag="" # Pushover Alerts | https://docs.linuxgsm.com/alerts/pushover pushoveralert="off" pushovertoken="accesstoken" +pushoveruserkey="userkey" # Slack Alerts | https://docs.linuxgsm.com/alerts/slack slackalert="off" diff --git a/lgsm/config-default/config-lgsm/cod2server/_default.cfg b/lgsm/config-default/config-lgsm/cod2server/_default.cfg index 78721d3b2..9be748a8d 100644 --- a/lgsm/config-default/config-lgsm/cod2server/_default.cfg +++ b/lgsm/config-default/config-lgsm/cod2server/_default.cfg @@ -67,6 +67,7 @@ channeltag="" # Pushover Alerts | https://docs.linuxgsm.com/alerts/pushover pushoveralert="off" pushovertoken="accesstoken" +pushoveruserkey="userkey" # Slack Alerts | https://docs.linuxgsm.com/alerts/slack slackalert="off" diff --git a/lgsm/config-default/config-lgsm/cod4server/_default.cfg b/lgsm/config-default/config-lgsm/cod4server/_default.cfg index 33397cc8c..37090ae31 100644 --- a/lgsm/config-default/config-lgsm/cod4server/_default.cfg +++ b/lgsm/config-default/config-lgsm/cod4server/_default.cfg @@ -67,6 +67,7 @@ channeltag="" # Pushover Alerts | https://docs.linuxgsm.com/alerts/pushover pushoveralert="off" pushovertoken="accesstoken" +pushoveruserkey="userkey" # Slack Alerts | https://docs.linuxgsm.com/alerts/slack slackalert="off" diff --git a/lgsm/config-default/config-lgsm/codserver/_default.cfg b/lgsm/config-default/config-lgsm/codserver/_default.cfg index 383ff13a1..edf409687 100644 --- a/lgsm/config-default/config-lgsm/codserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/codserver/_default.cfg @@ -67,6 +67,7 @@ channeltag="" # Pushover Alerts | https://docs.linuxgsm.com/alerts/pushover pushoveralert="off" pushovertoken="accesstoken" +pushoveruserkey="userkey" # Slack Alerts | https://docs.linuxgsm.com/alerts/slack slackalert="off" diff --git a/lgsm/config-default/config-lgsm/coduoserver/_default.cfg b/lgsm/config-default/config-lgsm/coduoserver/_default.cfg index 6b597d709..9a33cde3e 100644 --- a/lgsm/config-default/config-lgsm/coduoserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/coduoserver/_default.cfg @@ -67,6 +67,7 @@ channeltag="" # Pushover Alerts | https://docs.linuxgsm.com/alerts/pushover pushoveralert="off" pushovertoken="accesstoken" +pushoveruserkey="userkey" # Slack Alerts | https://docs.linuxgsm.com/alerts/slack slackalert="off" diff --git a/lgsm/config-default/config-lgsm/codwawserver/_default.cfg b/lgsm/config-default/config-lgsm/codwawserver/_default.cfg index 36488256c..443e8713d 100644 --- a/lgsm/config-default/config-lgsm/codwawserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/codwawserver/_default.cfg @@ -67,6 +67,7 @@ channeltag="" # Pushover Alerts | https://docs.linuxgsm.com/alerts/pushover pushoveralert="off" pushovertoken="accesstoken" +pushoveruserkey="userkey" # Slack Alerts | https://docs.linuxgsm.com/alerts/slack slackalert="off" diff --git a/lgsm/config-default/config-lgsm/csczserver/_default.cfg b/lgsm/config-default/config-lgsm/csczserver/_default.cfg index 714e57a3c..ef0499706 100644 --- a/lgsm/config-default/config-lgsm/csczserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/csczserver/_default.cfg @@ -68,6 +68,7 @@ channeltag="" # Pushover Alerts | https://docs.linuxgsm.com/alerts/pushover pushoveralert="off" pushovertoken="accesstoken" +pushoveruserkey="userkey" # Slack Alerts | https://docs.linuxgsm.com/alerts/slack slackalert="off" diff --git a/lgsm/config-default/config-lgsm/csgoserver/_default.cfg b/lgsm/config-default/config-lgsm/csgoserver/_default.cfg index ba0f6b891..05932036a 100644 --- a/lgsm/config-default/config-lgsm/csgoserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/csgoserver/_default.cfg @@ -94,6 +94,7 @@ channeltag="" # Pushover Alerts | https://docs.linuxgsm.com/alerts/pushover pushoveralert="off" pushovertoken="accesstoken" +pushoveruserkey="userkey" # Slack Alerts | https://docs.linuxgsm.com/alerts/slack slackalert="off" diff --git a/lgsm/config-default/config-lgsm/csserver/_default.cfg b/lgsm/config-default/config-lgsm/csserver/_default.cfg index 9194e3c56..a2389d083 100644 --- a/lgsm/config-default/config-lgsm/csserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/csserver/_default.cfg @@ -68,6 +68,7 @@ channeltag="" # Pushover Alerts | https://docs.linuxgsm.com/alerts/pushover pushoveralert="off" pushovertoken="accesstoken" +pushoveruserkey="userkey" # Slack Alerts | https://docs.linuxgsm.com/alerts/slack slackalert="off" diff --git a/lgsm/config-default/config-lgsm/cssserver/_default.cfg b/lgsm/config-default/config-lgsm/cssserver/_default.cfg index 0ab7d6b80..56793e8c3 100644 --- a/lgsm/config-default/config-lgsm/cssserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/cssserver/_default.cfg @@ -74,6 +74,7 @@ channeltag="" # Pushover Alerts | https://docs.linuxgsm.com/alerts/pushover pushoveralert="off" pushovertoken="accesstoken" +pushoveruserkey="userkey" # Slack Alerts | https://docs.linuxgsm.com/alerts/slack slackalert="off" diff --git a/lgsm/config-default/config-lgsm/dabserver/_default.cfg b/lgsm/config-default/config-lgsm/dabserver/_default.cfg index 04d09847a..d8430dbe0 100644 --- a/lgsm/config-default/config-lgsm/dabserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/dabserver/_default.cfg @@ -69,6 +69,7 @@ channeltag="" # Pushover Alerts | https://docs.linuxgsm.com/alerts/pushover pushoveralert="off" pushovertoken="accesstoken" +pushoveruserkey="userkey" # Slack Alerts | https://docs.linuxgsm.com/alerts/slack slackalert="off" diff --git a/lgsm/config-default/config-lgsm/dmcserver/_default.cfg b/lgsm/config-default/config-lgsm/dmcserver/_default.cfg index e13f21166..533285093 100644 --- a/lgsm/config-default/config-lgsm/dmcserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/dmcserver/_default.cfg @@ -68,6 +68,7 @@ channeltag="" # Pushover Alerts | https://docs.linuxgsm.com/alerts/pushover pushoveralert="off" pushovertoken="accesstoken" +pushoveruserkey="userkey" # Slack Alerts | https://docs.linuxgsm.com/alerts/slack slackalert="off" diff --git a/lgsm/config-default/config-lgsm/dodserver/_default.cfg b/lgsm/config-default/config-lgsm/dodserver/_default.cfg index db82ec029..3bbb01646 100644 --- a/lgsm/config-default/config-lgsm/dodserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/dodserver/_default.cfg @@ -68,6 +68,7 @@ channeltag="" # Pushover Alerts | https://docs.linuxgsm.com/alerts/pushover pushoveralert="off" pushovertoken="accesstoken" +pushoveruserkey="userkey" # Slack Alerts | https://docs.linuxgsm.com/alerts/slack slackalert="off" diff --git a/lgsm/config-default/config-lgsm/dodsserver/_default.cfg b/lgsm/config-default/config-lgsm/dodsserver/_default.cfg index cd06a0684..ae7c441a6 100644 --- a/lgsm/config-default/config-lgsm/dodsserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/dodsserver/_default.cfg @@ -69,6 +69,7 @@ channeltag="" # Pushover Alerts | https://docs.linuxgsm.com/alerts/pushover pushoveralert="off" pushovertoken="accesstoken" +pushoveruserkey="userkey" # Slack Alerts | https://docs.linuxgsm.com/alerts/slack slackalert="off" diff --git a/lgsm/config-default/config-lgsm/doiserver/_default.cfg b/lgsm/config-default/config-lgsm/doiserver/_default.cfg index 1f0554002..7090436a9 100644 --- a/lgsm/config-default/config-lgsm/doiserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/doiserver/_default.cfg @@ -70,6 +70,7 @@ channeltag="" # Pushover Alerts | https://docs.linuxgsm.com/alerts/pushover pushoveralert="off" pushovertoken="accesstoken" +pushoveruserkey="userkey" # Slack Alerts | https://docs.linuxgsm.com/alerts/slack slackalert="off" diff --git a/lgsm/config-default/config-lgsm/dstserver/_default.cfg b/lgsm/config-default/config-lgsm/dstserver/_default.cfg index a120e2373..4472545fb 100644 --- a/lgsm/config-default/config-lgsm/dstserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/dstserver/_default.cfg @@ -72,6 +72,7 @@ channeltag="" # Pushover Alerts | https://docs.linuxgsm.com/alerts/pushover pushoveralert="off" pushovertoken="accesstoken" +pushoveruserkey="userkey" # Slack Alerts | https://docs.linuxgsm.com/alerts/slack slackalert="off" diff --git a/lgsm/config-default/config-lgsm/dysserver/_default.cfg b/lgsm/config-default/config-lgsm/dysserver/_default.cfg index 458a6665e..d2d11d5c1 100644 --- a/lgsm/config-default/config-lgsm/dysserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/dysserver/_default.cfg @@ -74,6 +74,7 @@ channeltag="" # Pushover Alerts | https://docs.linuxgsm.com/alerts/pushover pushoveralert="off" pushovertoken="accesstoken" +pushoveruserkey="userkey" # Slack Alerts | https://docs.linuxgsm.com/alerts/slack slackalert="off" diff --git a/lgsm/config-default/config-lgsm/ecoserver/_default.cfg b/lgsm/config-default/config-lgsm/ecoserver/_default.cfg index ceb0540cf..e5d817d4a 100644 --- a/lgsm/config-default/config-lgsm/ecoserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/ecoserver/_default.cfg @@ -61,6 +61,7 @@ channeltag="" # Pushover Alerts | https://docs.linuxgsm.com/alerts/pushover pushoveralert="off" pushovertoken="accesstoken" +pushoveruserkey="userkey" # Slack Alerts | https://docs.linuxgsm.com/alerts/slack slackalert="off" diff --git a/lgsm/config-default/config-lgsm/emserver/_default.cfg b/lgsm/config-default/config-lgsm/emserver/_default.cfg index df8bef8b3..dfbce8ddd 100644 --- a/lgsm/config-default/config-lgsm/emserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/emserver/_default.cfg @@ -74,6 +74,7 @@ channeltag="" # Pushover Alerts | https://docs.linuxgsm.com/alerts/pushover pushoveralert="off" pushovertoken="accesstoken" +pushoveruserkey="userkey" # Slack Alerts | https://docs.linuxgsm.com/alerts/slack slackalert="off" diff --git a/lgsm/config-default/config-lgsm/etlserver/_default.cfg b/lgsm/config-default/config-lgsm/etlserver/_default.cfg index 11d5fc2d8..85c1c4f35 100644 --- a/lgsm/config-default/config-lgsm/etlserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/etlserver/_default.cfg @@ -61,6 +61,7 @@ channeltag="" # Pushover Alerts | https://docs.linuxgsm.com/alerts/pushover pushoveralert="off" pushovertoken="accesstoken" +pushoveruserkey="userkey" # Slack Alerts | https://docs.linuxgsm.com/alerts/slack slackalert="off" diff --git a/lgsm/config-default/config-lgsm/fctrserver/_default.cfg b/lgsm/config-default/config-lgsm/fctrserver/_default.cfg index 4f12c83b6..f728a3113 100644 --- a/lgsm/config-default/config-lgsm/fctrserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/fctrserver/_default.cfg @@ -69,6 +69,7 @@ channeltag="" # Pushover Alerts | https://docs.linuxgsm.com/alerts/pushover pushoveralert="off" pushovertoken="accesstoken" +pushoveruserkey="userkey" # Slack Alerts | https://docs.linuxgsm.com/alerts/slack slackalert="off" diff --git a/lgsm/config-default/config-lgsm/fofserver/_default.cfg b/lgsm/config-default/config-lgsm/fofserver/_default.cfg index 4f4b907eb..cd56a2e54 100644 --- a/lgsm/config-default/config-lgsm/fofserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/fofserver/_default.cfg @@ -69,6 +69,7 @@ channeltag="" # Pushover Alerts | https://docs.linuxgsm.com/alerts/pushover pushoveralert="off" pushovertoken="accesstoken" +pushoveruserkey="userkey" # Slack Alerts | https://docs.linuxgsm.com/alerts/slack slackalert="off" diff --git a/lgsm/config-default/config-lgsm/gesserver/_default.cfg b/lgsm/config-default/config-lgsm/gesserver/_default.cfg index 700a71ad1..956f90508 100644 --- a/lgsm/config-default/config-lgsm/gesserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/gesserver/_default.cfg @@ -69,6 +69,7 @@ channeltag="" # Pushover Alerts | https://docs.linuxgsm.com/alerts/pushover pushoveralert="off" pushovertoken="accesstoken" +pushoveruserkey="userkey" # Slack Alerts | https://docs.linuxgsm.com/alerts/slack slackalert="off" diff --git a/lgsm/config-default/config-lgsm/gmodserver/_default.cfg b/lgsm/config-default/config-lgsm/gmodserver/_default.cfg index 45fc88590..15a48a972 100644 --- a/lgsm/config-default/config-lgsm/gmodserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/gmodserver/_default.cfg @@ -85,6 +85,7 @@ channeltag="" # Pushover Alerts | https://docs.linuxgsm.com/alerts/pushover pushoveralert="off" pushovertoken="accesstoken" +pushoveruserkey="userkey" # Slack Alerts | https://docs.linuxgsm.com/alerts/slack slackalert="off" diff --git a/lgsm/config-default/config-lgsm/hl2dmserver/_default.cfg b/lgsm/config-default/config-lgsm/hl2dmserver/_default.cfg index 5f207ff02..b53bc4336 100644 --- a/lgsm/config-default/config-lgsm/hl2dmserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/hl2dmserver/_default.cfg @@ -69,6 +69,7 @@ channeltag="" # Pushover Alerts | https://docs.linuxgsm.com/alerts/pushover pushoveralert="off" pushovertoken="accesstoken" +pushoveruserkey="userkey" # Slack Alerts | https://docs.linuxgsm.com/alerts/slack slackalert="off" diff --git a/lgsm/config-default/config-lgsm/hldmserver/_default.cfg b/lgsm/config-default/config-lgsm/hldmserver/_default.cfg index c6fba105d..51bf83c21 100644 --- a/lgsm/config-default/config-lgsm/hldmserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/hldmserver/_default.cfg @@ -68,6 +68,7 @@ channeltag="" # Pushover Alerts | https://docs.linuxgsm.com/alerts/pushover pushoveralert="off" pushovertoken="accesstoken" +pushoveruserkey="userkey" # Slack Alerts | https://docs.linuxgsm.com/alerts/slack slackalert="off" diff --git a/lgsm/config-default/config-lgsm/hldmsserver/_default.cfg b/lgsm/config-default/config-lgsm/hldmsserver/_default.cfg index 7aa944ee5..df436368f 100644 --- a/lgsm/config-default/config-lgsm/hldmsserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/hldmsserver/_default.cfg @@ -69,6 +69,7 @@ channeltag="" # Pushover Alerts | https://docs.linuxgsm.com/alerts/pushover pushoveralert="off" pushovertoken="accesstoken" +pushoveruserkey="userkey" # Slack Alerts | https://docs.linuxgsm.com/alerts/slack slackalert="off" diff --git a/lgsm/config-default/config-lgsm/hwserver/_default.cfg b/lgsm/config-default/config-lgsm/hwserver/_default.cfg index 8ee43603a..f312383ba 100644 --- a/lgsm/config-default/config-lgsm/hwserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/hwserver/_default.cfg @@ -80,6 +80,7 @@ channeltag="" # Pushover Alerts | https://docs.linuxgsm.com/alerts/pushover pushoveralert="off" pushovertoken="accesstoken" +pushoveruserkey="userkey" # Slack Alerts | https://docs.linuxgsm.com/alerts/slack slackalert="off" diff --git a/lgsm/config-default/config-lgsm/insserver/_default.cfg b/lgsm/config-default/config-lgsm/insserver/_default.cfg index be88ff8ae..9f6c49f13 100644 --- a/lgsm/config-default/config-lgsm/insserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/insserver/_default.cfg @@ -75,6 +75,7 @@ channeltag="" # Pushover Alerts | https://docs.linuxgsm.com/alerts/pushover pushoveralert="off" pushovertoken="accesstoken" +pushoveruserkey="userkey" # Slack Alerts | https://docs.linuxgsm.com/alerts/slack slackalert="off" diff --git a/lgsm/config-default/config-lgsm/inssserver/_default.cfg b/lgsm/config-default/config-lgsm/inssserver/_default.cfg index 5fbe96d8f..65736bf97 100644 --- a/lgsm/config-default/config-lgsm/inssserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/inssserver/_default.cfg @@ -76,6 +76,7 @@ channeltag="" # Pushover Alerts | https://docs.linuxgsm.com/alerts/pushover pushoveralert="off" pushovertoken="accesstoken" +pushoveruserkey="userkey" # Slack Alerts | https://docs.linuxgsm.com/alerts/slack slackalert="off" diff --git a/lgsm/config-default/config-lgsm/iosserver/_default.cfg b/lgsm/config-default/config-lgsm/iosserver/_default.cfg index b7c731780..e32a6f02b 100644 --- a/lgsm/config-default/config-lgsm/iosserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/iosserver/_default.cfg @@ -69,6 +69,7 @@ channeltag="" # Pushover Alerts | https://docs.linuxgsm.com/alerts/pushover pushoveralert="off" pushovertoken="accesstoken" +pushoveruserkey="userkey" # Slack Alerts | https://docs.linuxgsm.com/alerts/slack slackalert="off" diff --git a/lgsm/config-default/config-lgsm/jc2server/_default.cfg b/lgsm/config-default/config-lgsm/jc2server/_default.cfg index 7a6338127..dd3227ba8 100644 --- a/lgsm/config-default/config-lgsm/jc2server/_default.cfg +++ b/lgsm/config-default/config-lgsm/jc2server/_default.cfg @@ -61,6 +61,7 @@ channeltag="" # Pushover Alerts | https://docs.linuxgsm.com/alerts/pushover pushoveralert="off" pushovertoken="accesstoken" +pushoveruserkey="userkey" # Slack Alerts | https://docs.linuxgsm.com/alerts/slack slackalert="off" diff --git a/lgsm/config-default/config-lgsm/jc3server/_default.cfg b/lgsm/config-default/config-lgsm/jc3server/_default.cfg index ca219b745..4fc274c5c 100644 --- a/lgsm/config-default/config-lgsm/jc3server/_default.cfg +++ b/lgsm/config-default/config-lgsm/jc3server/_default.cfg @@ -61,6 +61,7 @@ channeltag="" # Pushover Alerts | https://docs.linuxgsm.com/alerts/pushover pushoveralert="off" pushovertoken="accesstoken" +pushoveruserkey="userkey" # Slack Alerts | https://docs.linuxgsm.com/alerts/slack slackalert="off" diff --git a/lgsm/config-default/config-lgsm/jk2server/_default.cfg b/lgsm/config-default/config-lgsm/jk2server/_default.cfg index 31d405cbf..42bd79beb 100644 --- a/lgsm/config-default/config-lgsm/jk2server/_default.cfg +++ b/lgsm/config-default/config-lgsm/jk2server/_default.cfg @@ -68,6 +68,7 @@ channeltag="" # Pushover Alerts | https://docs.linuxgsm.com/alerts/pushover pushoveralert="off" pushovertoken="accesstoken" +pushoveruserkey="userkey" # Telegram Alerts | https://docs.linuxgsm.com/alerts/telegram # You can add a custom cURL string eg proxy (useful in Russia) or else in "curlcustomstring". diff --git a/lgsm/config-default/config-lgsm/kf2server/_default.cfg b/lgsm/config-default/config-lgsm/kf2server/_default.cfg index cb9794682..3e1f8eae6 100644 --- a/lgsm/config-default/config-lgsm/kf2server/_default.cfg +++ b/lgsm/config-default/config-lgsm/kf2server/_default.cfg @@ -67,6 +67,7 @@ channeltag="" # Pushover Alerts | https://docs.linuxgsm.com/alerts/pushover pushoveralert="off" pushovertoken="accesstoken" +pushoveruserkey="userkey" # Slack Alerts | https://docs.linuxgsm.com/alerts/slack slackalert="off" diff --git a/lgsm/config-default/config-lgsm/kfserver/_default.cfg b/lgsm/config-default/config-lgsm/kfserver/_default.cfg index 98378fe2c..88b8c0673 100644 --- a/lgsm/config-default/config-lgsm/kfserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/kfserver/_default.cfg @@ -73,6 +73,7 @@ channeltag="" # Pushover Alerts | https://docs.linuxgsm.com/alerts/pushover pushoveralert="off" pushovertoken="accesstoken" +pushoveruserkey="userkey" # Slack Alerts | https://docs.linuxgsm.com/alerts/slack slackalert="off" diff --git a/lgsm/config-default/config-lgsm/l4d2server/_default.cfg b/lgsm/config-default/config-lgsm/l4d2server/_default.cfg index 541edf1bb..13e701f86 100644 --- a/lgsm/config-default/config-lgsm/l4d2server/_default.cfg +++ b/lgsm/config-default/config-lgsm/l4d2server/_default.cfg @@ -68,6 +68,7 @@ channeltag="" # Pushover Alerts | https://docs.linuxgsm.com/alerts/pushover pushoveralert="off" pushovertoken="accesstoken" +pushoveruserkey="userkey" # Slack Alerts | https://docs.linuxgsm.com/alerts/slack slackalert="off" diff --git a/lgsm/config-default/config-lgsm/l4dserver/_default.cfg b/lgsm/config-default/config-lgsm/l4dserver/_default.cfg index 6904523e6..f0de75779 100644 --- a/lgsm/config-default/config-lgsm/l4dserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/l4dserver/_default.cfg @@ -68,6 +68,7 @@ channeltag="" # Pushover Alerts | https://docs.linuxgsm.com/alerts/pushover pushoveralert="off" pushovertoken="accesstoken" +pushoveruserkey="userkey" # Slack Alerts | https://docs.linuxgsm.com/alerts/slack slackalert="off" diff --git a/lgsm/config-default/config-lgsm/mcbserver/_default.cfg b/lgsm/config-default/config-lgsm/mcbserver/_default.cfg index e450f1821..c02c78466 100644 --- a/lgsm/config-default/config-lgsm/mcbserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/mcbserver/_default.cfg @@ -61,6 +61,7 @@ channeltag="" # Pushover Alerts | https://docs.linuxgsm.com/alerts/pushover pushoveralert="off" pushovertoken="accesstoken" +pushoveruserkey="userkey" # Slack Alerts | https://docs.linuxgsm.com/alerts/slack slackalert="off" diff --git a/lgsm/config-default/config-lgsm/mcserver/_default.cfg b/lgsm/config-default/config-lgsm/mcserver/_default.cfg index e1fb0e89e..927801557 100644 --- a/lgsm/config-default/config-lgsm/mcserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/mcserver/_default.cfg @@ -67,6 +67,7 @@ channeltag="" # Pushover Alerts | https://docs.linuxgsm.com/alerts/pushover pushoveralert="off" pushovertoken="accesstoken" +pushoveruserkey="userkey" # Slack Alerts | https://docs.linuxgsm.com/alerts/slack slackalert="off" diff --git a/lgsm/config-default/config-lgsm/mhserver/_default.cfg b/lgsm/config-default/config-lgsm/mhserver/_default.cfg index feef4cd62..04aadb369 100644 --- a/lgsm/config-default/config-lgsm/mhserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/mhserver/_default.cfg @@ -69,6 +69,7 @@ channeltag="" # Pushover Alerts | https://docs.linuxgsm.com/alerts/pushover pushoveralert="off" pushovertoken="accesstoken" +pushoveruserkey="userkey" # Slack Alerts | https://docs.linuxgsm.com/alerts/slack slackalert="off" diff --git a/lgsm/config-default/config-lgsm/mohaaserver/_default.cfg b/lgsm/config-default/config-lgsm/mohaaserver/_default.cfg index 2819fea66..4899dbc4d 100644 --- a/lgsm/config-default/config-lgsm/mohaaserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/mohaaserver/_default.cfg @@ -66,6 +66,7 @@ channeltag="" # Pushover Alerts | https://docs.linuxgsm.com/alerts/pushover pushoveralert="off" pushovertoken="accesstoken" +pushoveruserkey="userkey" # Slack Alerts | https://docs.linuxgsm.com/alerts/slack slackalert="off" diff --git a/lgsm/config-default/config-lgsm/momserver/_default.cfg b/lgsm/config-default/config-lgsm/momserver/_default.cfg index f702289b0..f9a7a62f6 100644 --- a/lgsm/config-default/config-lgsm/momserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/momserver/_default.cfg @@ -67,6 +67,7 @@ channeltag="" # Pushover Alerts | https://docs.linuxgsm.com/alerts/pushover pushoveralert="off" pushovertoken="accesstoken" +pushoveruserkey="userkey" # Slack Alerts | https://docs.linuxgsm.com/alerts/slack slackalert="off" diff --git a/lgsm/config-default/config-lgsm/mtaserver/_default.cfg b/lgsm/config-default/config-lgsm/mtaserver/_default.cfg index f8c4017b6..f5ecdb63a 100644 --- a/lgsm/config-default/config-lgsm/mtaserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/mtaserver/_default.cfg @@ -65,6 +65,7 @@ channeltag="" # Pushover Alerts | https://docs.linuxgsm.com/alerts/pushover pushoveralert="off" pushovertoken="accesstoken" +pushoveruserkey="userkey" # Slack Alerts | https://docs.linuxgsm.com/alerts/slack slackalert="off" diff --git a/lgsm/config-default/config-lgsm/mumbleserver/_default.cfg b/lgsm/config-default/config-lgsm/mumbleserver/_default.cfg index cabe64504..5431a903b 100644 --- a/lgsm/config-default/config-lgsm/mumbleserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/mumbleserver/_default.cfg @@ -61,6 +61,7 @@ channeltag="" # Pushover Alerts | https://docs.linuxgsm.com/alerts/pushover pushoveralert="off" pushovertoken="accesstoken" +pushoveruserkey="userkey" # Slack Alerts | https://docs.linuxgsm.com/alerts/slack slackalert="off" diff --git a/lgsm/config-default/config-lgsm/ndserver/_default.cfg b/lgsm/config-default/config-lgsm/ndserver/_default.cfg index 1ece1feba..e72274c04 100644 --- a/lgsm/config-default/config-lgsm/ndserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/ndserver/_default.cfg @@ -69,6 +69,7 @@ channeltag="" # Pushover Alerts | https://docs.linuxgsm.com/alerts/pushover pushoveralert="off" pushovertoken="accesstoken" +pushoveruserkey="userkey" # Slack Alerts | https://docs.linuxgsm.com/alerts/slack slackalert="off" diff --git a/lgsm/config-default/config-lgsm/nmrihserver/_default.cfg b/lgsm/config-default/config-lgsm/nmrihserver/_default.cfg index 8a24983f3..a14969949 100644 --- a/lgsm/config-default/config-lgsm/nmrihserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/nmrihserver/_default.cfg @@ -74,6 +74,7 @@ channeltag="" # Pushover Alerts | https://docs.linuxgsm.com/alerts/pushover pushoveralert="off" pushovertoken="accesstoken" +pushoveruserkey="userkey" # Slack Alerts | https://docs.linuxgsm.com/alerts/slack slackalert="off" diff --git a/lgsm/config-default/config-lgsm/ns2cserver/_default.cfg b/lgsm/config-default/config-lgsm/ns2cserver/_default.cfg index 320f0e09b..90b1e90f2 100644 --- a/lgsm/config-default/config-lgsm/ns2cserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/ns2cserver/_default.cfg @@ -76,6 +76,7 @@ channeltag="" # Pushover Alerts | https://docs.linuxgsm.com/alerts/pushover pushoveralert="off" pushovertoken="accesstoken" +pushoveruserkey="userkey" # Slack Alerts | https://docs.linuxgsm.com/alerts/slack slackalert="off" diff --git a/lgsm/config-default/config-lgsm/ns2server/_default.cfg b/lgsm/config-default/config-lgsm/ns2server/_default.cfg index 3b8c313f0..5ae21561b 100644 --- a/lgsm/config-default/config-lgsm/ns2server/_default.cfg +++ b/lgsm/config-default/config-lgsm/ns2server/_default.cfg @@ -80,6 +80,7 @@ channeltag="" # Pushover Alerts | https://docs.linuxgsm.com/alerts/pushover pushoveralert="off" pushovertoken="accesstoken" +pushoveruserkey="userkey" # Slack Alerts | https://docs.linuxgsm.com/alerts/slack slackalert="off" diff --git a/lgsm/config-default/config-lgsm/nsserver/_default.cfg b/lgsm/config-default/config-lgsm/nsserver/_default.cfg index a508339b3..c5f85d986 100644 --- a/lgsm/config-default/config-lgsm/nsserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/nsserver/_default.cfg @@ -68,6 +68,7 @@ channeltag="" # Pushover Alerts | https://docs.linuxgsm.com/alerts/pushover pushoveralert="off" pushovertoken="accesstoken" +pushoveruserkey="userkey" # Slack Alerts | https://docs.linuxgsm.com/alerts/slack slackalert="off" diff --git a/lgsm/config-default/config-lgsm/onsetserver/_default.cfg b/lgsm/config-default/config-lgsm/onsetserver/_default.cfg index 77f9cb4f0..7e3a72dbd 100644 --- a/lgsm/config-default/config-lgsm/onsetserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/onsetserver/_default.cfg @@ -61,6 +61,7 @@ channeltag="" # Pushover Alerts | https://docs.linuxgsm.com/alerts/pushover pushoveralert="off" pushovertoken="accesstoken" +pushoveruserkey="userkey" # Slack Alerts | https://docs.linuxgsm.com/alerts/slack slackalert="off" diff --git a/lgsm/config-default/config-lgsm/opforserver/_default.cfg b/lgsm/config-default/config-lgsm/opforserver/_default.cfg index 80e76e5ea..54643ff56 100644 --- a/lgsm/config-default/config-lgsm/opforserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/opforserver/_default.cfg @@ -68,6 +68,7 @@ channeltag="" # Pushover Alerts | https://docs.linuxgsm.com/alerts/pushover pushoveralert="off" pushovertoken="accesstoken" +pushoveruserkey="userkey" # Slack Alerts | https://docs.linuxgsm.com/alerts/slack slackalert="off" diff --git a/lgsm/config-default/config-lgsm/pcserver/_default.cfg b/lgsm/config-default/config-lgsm/pcserver/_default.cfg index ff85ac259..440234e76 100644 --- a/lgsm/config-default/config-lgsm/pcserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/pcserver/_default.cfg @@ -61,6 +61,7 @@ channeltag="" # Pushover Alerts | https://docs.linuxgsm.com/alerts/pushover pushoveralert="off" pushovertoken="accesstoken" +pushoveruserkey="userkey" # Slack Alerts | https://docs.linuxgsm.com/alerts/slack slackalert="off" diff --git a/lgsm/config-default/config-lgsm/pstbsserver/_default.cfg b/lgsm/config-default/config-lgsm/pstbsserver/_default.cfg index 8edf26d9a..6985ef4b0 100644 --- a/lgsm/config-default/config-lgsm/pstbsserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/pstbsserver/_default.cfg @@ -71,6 +71,7 @@ channeltag="" # Pushover Alerts | https://docs.linuxgsm.com/alerts/pushover pushoveralert="off" pushovertoken="accesstoken" +pushoveruserkey="userkey" # Slack Alerts | https://docs.linuxgsm.com/alerts/slack slackalert="off" diff --git a/lgsm/config-default/config-lgsm/pvkiiserver/_default.cfg b/lgsm/config-default/config-lgsm/pvkiiserver/_default.cfg index ccc3d85ed..13611f4bc 100644 --- a/lgsm/config-default/config-lgsm/pvkiiserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/pvkiiserver/_default.cfg @@ -69,6 +69,7 @@ channeltag="" # Pushover Alerts | https://docs.linuxgsm.com/alerts/pushover pushoveralert="off" pushovertoken="accesstoken" +pushoveruserkey="userkey" # Slack Alerts | https://docs.linuxgsm.com/alerts/slack slackalert="off" diff --git a/lgsm/config-default/config-lgsm/pzserver/_default.cfg b/lgsm/config-default/config-lgsm/pzserver/_default.cfg index c1c6f7954..5b24bc4a5 100644 --- a/lgsm/config-default/config-lgsm/pzserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/pzserver/_default.cfg @@ -65,6 +65,7 @@ channeltag="" # Pushover Alerts | https://docs.linuxgsm.com/alerts/pushover pushoveralert="off" pushovertoken="accesstoken" +pushoveruserkey="userkey" # Slack Alerts | https://docs.linuxgsm.com/alerts/slack slackalert="off" diff --git a/lgsm/config-default/config-lgsm/q2server/_default.cfg b/lgsm/config-default/config-lgsm/q2server/_default.cfg index 9c867f99c..58005339c 100644 --- a/lgsm/config-default/config-lgsm/q2server/_default.cfg +++ b/lgsm/config-default/config-lgsm/q2server/_default.cfg @@ -66,6 +66,7 @@ channeltag="" # Pushover Alerts | https://docs.linuxgsm.com/alerts/pushover pushoveralert="off" pushovertoken="accesstoken" +pushoveruserkey="userkey" # Slack Alerts | https://docs.linuxgsm.com/alerts/slack slackalert="off" diff --git a/lgsm/config-default/config-lgsm/q3server/_default.cfg b/lgsm/config-default/config-lgsm/q3server/_default.cfg index 402331066..d928cf7b9 100644 --- a/lgsm/config-default/config-lgsm/q3server/_default.cfg +++ b/lgsm/config-default/config-lgsm/q3server/_default.cfg @@ -66,6 +66,7 @@ channeltag="" # Pushover Alerts | https://docs.linuxgsm.com/alerts/pushover pushoveralert="off" pushovertoken="accesstoken" +pushoveruserkey="userkey" # Slack Alerts | https://docs.linuxgsm.com/alerts/slack slackalert="off" diff --git a/lgsm/config-default/config-lgsm/qlserver/_default.cfg b/lgsm/config-default/config-lgsm/qlserver/_default.cfg index 6290a2276..5dc643980 100644 --- a/lgsm/config-default/config-lgsm/qlserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/qlserver/_default.cfg @@ -61,6 +61,7 @@ channeltag="" # Pushover Alerts | https://docs.linuxgsm.com/alerts/pushover pushoveralert="off" pushovertoken="accesstoken" +pushoveruserkey="userkey" # Slack Alerts | https://docs.linuxgsm.com/alerts/slack slackalert="off" diff --git a/lgsm/config-default/config-lgsm/qwserver/_default.cfg b/lgsm/config-default/config-lgsm/qwserver/_default.cfg index 33c34fb66..e751679ba 100644 --- a/lgsm/config-default/config-lgsm/qwserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/qwserver/_default.cfg @@ -65,6 +65,7 @@ channeltag="" # Pushover Alerts | https://docs.linuxgsm.com/alerts/pushover pushoveralert="off" pushovertoken="accesstoken" +pushoveruserkey="userkey" # Slack Alerts | https://docs.linuxgsm.com/alerts/slack slackalert="off" diff --git a/lgsm/config-default/config-lgsm/ricochetserver/_default.cfg b/lgsm/config-default/config-lgsm/ricochetserver/_default.cfg index e458fa153..f8bfc9549 100644 --- a/lgsm/config-default/config-lgsm/ricochetserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/ricochetserver/_default.cfg @@ -68,6 +68,7 @@ channeltag="" # Pushover Alerts | https://docs.linuxgsm.com/alerts/pushover pushoveralert="off" pushovertoken="accesstoken" +pushoveruserkey="userkey" # Slack Alerts | https://docs.linuxgsm.com/alerts/slack slackalert="off" diff --git a/lgsm/config-default/config-lgsm/roserver/_default.cfg b/lgsm/config-default/config-lgsm/roserver/_default.cfg index d778b3252..a296c4e74 100644 --- a/lgsm/config-default/config-lgsm/roserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/roserver/_default.cfg @@ -69,6 +69,7 @@ channeltag="" # Pushover Alerts | https://docs.linuxgsm.com/alerts/pushover pushoveralert="off" pushovertoken="accesstoken" +pushoveruserkey="userkey" # Slack Alerts | https://docs.linuxgsm.com/alerts/slack slackalert="off" diff --git a/lgsm/config-default/config-lgsm/rtcwserver/_default.cfg b/lgsm/config-default/config-lgsm/rtcwserver/_default.cfg index 55669f43a..797a345f7 100644 --- a/lgsm/config-default/config-lgsm/rtcwserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/rtcwserver/_default.cfg @@ -66,6 +66,7 @@ channeltag="" # Pushover Alerts | https://docs.linuxgsm.com/alerts/pushover pushoveralert="off" pushovertoken="accesstoken" +pushoveruserkey="userkey" # Slack Alerts | https://docs.linuxgsm.com/alerts/slack slackalert="off" diff --git a/lgsm/config-default/config-lgsm/rustserver/_default.cfg b/lgsm/config-default/config-lgsm/rustserver/_default.cfg index daa1e0551..3312db810 100644 --- a/lgsm/config-default/config-lgsm/rustserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/rustserver/_default.cfg @@ -76,6 +76,7 @@ channeltag="" # Pushover Alerts | https://docs.linuxgsm.com/alerts/pushover pushoveralert="off" pushovertoken="accesstoken" +pushoveruserkey="userkey" # Slack Alerts | https://docs.linuxgsm.com/alerts/slack slackalert="off" diff --git a/lgsm/config-default/config-lgsm/rwserver/_default.cfg b/lgsm/config-default/config-lgsm/rwserver/_default.cfg index 37284fd3e..574ed88e6 100644 --- a/lgsm/config-default/config-lgsm/rwserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/rwserver/_default.cfg @@ -64,6 +64,7 @@ channeltag="" # Pushover Alerts | https://docs.linuxgsm.com/alerts/pushover pushoveralert="off" pushovertoken="accesstoken" +pushoveruserkey="userkey" # Slack Alerts | https://docs.linuxgsm.com/alerts/slack slackalert="off" diff --git a/lgsm/config-default/config-lgsm/sampserver/_default.cfg b/lgsm/config-default/config-lgsm/sampserver/_default.cfg index fed8d87b8..82f1c5651 100644 --- a/lgsm/config-default/config-lgsm/sampserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/sampserver/_default.cfg @@ -65,6 +65,7 @@ channeltag="" # Pushover Alerts | https://docs.linuxgsm.com/alerts/pushover pushoveralert="off" pushovertoken="accesstoken" +pushoveruserkey="userkey" # Slack Alerts | https://docs.linuxgsm.com/alerts/slack slackalert="off" diff --git a/lgsm/config-default/config-lgsm/sbotsserver/_default.cfg b/lgsm/config-default/config-lgsm/sbotsserver/_default.cfg index d5baffafb..6e465fe5d 100644 --- a/lgsm/config-default/config-lgsm/sbotsserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/sbotsserver/_default.cfg @@ -69,6 +69,7 @@ channeltag="" # Pushover Alerts | https://docs.linuxgsm.com/alerts/pushover pushoveralert="off" pushovertoken="accesstoken" +pushoveruserkey="userkey" # Slack Alerts | https://docs.linuxgsm.com/alerts/slack slackalert="off" diff --git a/lgsm/config-default/config-lgsm/sbserver/_default.cfg b/lgsm/config-default/config-lgsm/sbserver/_default.cfg index d3773e02d..3cc0f90f5 100644 --- a/lgsm/config-default/config-lgsm/sbserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/sbserver/_default.cfg @@ -68,6 +68,7 @@ channeltag="" # Pushover Alerts | https://docs.linuxgsm.com/alerts/pushover pushoveralert="off" pushovertoken="accesstoken" +pushoveruserkey="userkey" # Slack Alerts | https://docs.linuxgsm.com/alerts/slack slackalert="off" diff --git a/lgsm/config-default/config-lgsm/sdtdserver/_default.cfg b/lgsm/config-default/config-lgsm/sdtdserver/_default.cfg index 62d2779be..4f3289cca 100644 --- a/lgsm/config-default/config-lgsm/sdtdserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/sdtdserver/_default.cfg @@ -64,6 +64,7 @@ channeltag="" # Pushover Alerts | https://docs.linuxgsm.com/alerts/pushover pushoveralert="off" pushovertoken="accesstoken" +pushoveruserkey="userkey" # Slack Alerts | https://docs.linuxgsm.com/alerts/slack slackalert="off" diff --git a/lgsm/config-default/config-lgsm/sfcserver/_default.cfg b/lgsm/config-default/config-lgsm/sfcserver/_default.cfg index ec99587b8..20e47430c 100644 --- a/lgsm/config-default/config-lgsm/sfcserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/sfcserver/_default.cfg @@ -69,6 +69,7 @@ channeltag="" # Pushover Alerts | https://docs.linuxgsm.com/alerts/pushover pushoveralert="off" pushovertoken="accesstoken" +pushoveruserkey="userkey" # Slack Alerts | https://docs.linuxgsm.com/alerts/slack slackalert="off" diff --git a/lgsm/config-default/config-lgsm/sof2server/_default.cfg b/lgsm/config-default/config-lgsm/sof2server/_default.cfg index a49704b3e..68dd7104a 100644 --- a/lgsm/config-default/config-lgsm/sof2server/_default.cfg +++ b/lgsm/config-default/config-lgsm/sof2server/_default.cfg @@ -66,6 +66,7 @@ channeltag="" # Pushover Alerts | https://docs.linuxgsm.com/alerts/pushover pushoveralert="off" pushovertoken="accesstoken" +pushoveruserkey="userkey" # Slack Alerts | https://docs.linuxgsm.com/alerts/slack slackalert="off" diff --git a/lgsm/config-default/config-lgsm/solserver/_default.cfg b/lgsm/config-default/config-lgsm/solserver/_default.cfg index 9fc313fbe..7b1164ca4 100644 --- a/lgsm/config-default/config-lgsm/solserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/solserver/_default.cfg @@ -65,6 +65,7 @@ channeltag="" # Pushover Alerts | https://docs.linuxgsm.com/alerts/pushover pushoveralert="off" pushovertoken="accesstoken" +pushoveruserkey="userkey" # Slack Alerts | https://docs.linuxgsm.com/alerts/slack slackalert="off" diff --git a/lgsm/config-default/config-lgsm/squadserver/_default.cfg b/lgsm/config-default/config-lgsm/squadserver/_default.cfg index eb37382c9..40a7bf5d6 100644 --- a/lgsm/config-default/config-lgsm/squadserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/squadserver/_default.cfg @@ -66,6 +66,7 @@ channeltag="" # Pushover Alerts | https://docs.linuxgsm.com/alerts/pushover pushoveralert="off" pushovertoken="accesstoken" +pushoveruserkey="userkey" # Slack Alerts | https://docs.linuxgsm.com/alerts/slack slackalert="off" diff --git a/lgsm/config-default/config-lgsm/ss3server/_default.cfg b/lgsm/config-default/config-lgsm/ss3server/_default.cfg index ff8f810f4..18f83c6b4 100644 --- a/lgsm/config-default/config-lgsm/ss3server/_default.cfg +++ b/lgsm/config-default/config-lgsm/ss3server/_default.cfg @@ -65,6 +65,7 @@ channeltag="" # Pushover Alerts | https://docs.linuxgsm.com/alerts/pushover pushoveralert="off" pushovertoken="accesstoken" +pushoveruserkey="userkey" # Slack Alerts | https://docs.linuxgsm.com/alerts/slack slackalert="off" diff --git a/lgsm/config-default/config-lgsm/stserver/_default.cfg b/lgsm/config-default/config-lgsm/stserver/_default.cfg index 13527e213..8a52dc51f 100644 --- a/lgsm/config-default/config-lgsm/stserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/stserver/_default.cfg @@ -71,6 +71,7 @@ channeltag="" # Pushover Alerts | https://docs.linuxgsm.com/alerts/pushover pushoveralert="off" pushovertoken="accesstoken" +pushoveruserkey="userkey" # Slack Alerts | https://docs.linuxgsm.com/alerts/slack slackalert="off" diff --git a/lgsm/config-default/config-lgsm/svenserver/_default.cfg b/lgsm/config-default/config-lgsm/svenserver/_default.cfg index 34be57330..9737d5804 100644 --- a/lgsm/config-default/config-lgsm/svenserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/svenserver/_default.cfg @@ -68,6 +68,7 @@ channeltag="" # Pushover Alerts | https://docs.linuxgsm.com/alerts/pushover pushoveralert="off" pushovertoken="accesstoken" +pushoveruserkey="userkey" # Slack Alerts | https://docs.linuxgsm.com/alerts/slack slackalert="off" diff --git a/lgsm/config-default/config-lgsm/terrariaserver/_default.cfg b/lgsm/config-default/config-lgsm/terrariaserver/_default.cfg index 5750b2875..19e71bda5 100644 --- a/lgsm/config-default/config-lgsm/terrariaserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/terrariaserver/_default.cfg @@ -68,6 +68,7 @@ channeltag="" # Pushover Alerts | https://docs.linuxgsm.com/alerts/pushover pushoveralert="off" pushovertoken="accesstoken" +pushoveruserkey="userkey" # Slack Alerts | https://docs.linuxgsm.com/alerts/slack slackalert="off" diff --git a/lgsm/config-default/config-lgsm/tf2server/_default.cfg b/lgsm/config-default/config-lgsm/tf2server/_default.cfg index 24b18bdd0..a017a3dbf 100644 --- a/lgsm/config-default/config-lgsm/tf2server/_default.cfg +++ b/lgsm/config-default/config-lgsm/tf2server/_default.cfg @@ -74,6 +74,7 @@ channeltag="" # Pushover Alerts | https://docs.linuxgsm.com/alerts/pushover pushoveralert="off" pushovertoken="accesstoken" +pushoveruserkey="userkey" # Slack Alerts | https://docs.linuxgsm.com/alerts/slack slackalert="off" diff --git a/lgsm/config-default/config-lgsm/tfcserver/_default.cfg b/lgsm/config-default/config-lgsm/tfcserver/_default.cfg index 1255b20de..ecc614b98 100644 --- a/lgsm/config-default/config-lgsm/tfcserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/tfcserver/_default.cfg @@ -68,6 +68,7 @@ channeltag="" # Pushover Alerts | https://docs.linuxgsm.com/alerts/pushover pushoveralert="off" pushovertoken="accesstoken" +pushoveruserkey="userkey" # Slack Alerts | https://docs.linuxgsm.com/alerts/slack slackalert="off" diff --git a/lgsm/config-default/config-lgsm/ts3server/_default.cfg b/lgsm/config-default/config-lgsm/ts3server/_default.cfg index 147d4c94c..71952c0d9 100644 --- a/lgsm/config-default/config-lgsm/ts3server/_default.cfg +++ b/lgsm/config-default/config-lgsm/ts3server/_default.cfg @@ -61,6 +61,7 @@ channeltag="" # Pushover Alerts | https://docs.linuxgsm.com/alerts/pushover pushoveralert="off" pushovertoken="accesstoken" +pushoveruserkey="userkey" # Slack Alerts | https://docs.linuxgsm.com/alerts/slack slackalert="off" diff --git a/lgsm/config-default/config-lgsm/tsserver/_default.cfg b/lgsm/config-default/config-lgsm/tsserver/_default.cfg index f712b43f8..4e44830d3 100644 --- a/lgsm/config-default/config-lgsm/tsserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/tsserver/_default.cfg @@ -68,6 +68,7 @@ channeltag="" # Pushover Alerts | https://docs.linuxgsm.com/alerts/pushover pushoveralert="off" pushovertoken="accesstoken" +pushoveruserkey="userkey" # Slack Alerts | https://docs.linuxgsm.com/alerts/slack slackalert="off" diff --git a/lgsm/config-default/config-lgsm/tuserver/_default.cfg b/lgsm/config-default/config-lgsm/tuserver/_default.cfg index 63aec6f0f..accdfd52a 100644 --- a/lgsm/config-default/config-lgsm/tuserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/tuserver/_default.cfg @@ -71,6 +71,7 @@ channeltag="" # Pushover Alerts | https://docs.linuxgsm.com/alerts/pushover pushoveralert="off" pushovertoken="accesstoken" +pushoveruserkey="userkey" # Slack Alerts | https://docs.linuxgsm.com/alerts/slack slackalert="off" diff --git a/lgsm/config-default/config-lgsm/twserver/_default.cfg b/lgsm/config-default/config-lgsm/twserver/_default.cfg index cdbf5e98f..a5c0feb40 100644 --- a/lgsm/config-default/config-lgsm/twserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/twserver/_default.cfg @@ -68,6 +68,7 @@ channeltag="" # Pushover Alerts | https://docs.linuxgsm.com/alerts/pushover pushoveralert="off" pushovertoken="accesstoken" +pushoveruserkey="userkey" # Slack Alerts | https://docs.linuxgsm.com/alerts/slack slackalert="off" diff --git a/lgsm/config-default/config-lgsm/untserver/_default.cfg b/lgsm/config-default/config-lgsm/untserver/_default.cfg index be683d7a3..27a952695 100644 --- a/lgsm/config-default/config-lgsm/untserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/untserver/_default.cfg @@ -67,6 +67,7 @@ channeltag="" # Pushover Alerts | https://docs.linuxgsm.com/alerts/pushover pushoveralert="off" pushovertoken="accesstoken" +pushoveruserkey="userkey" # Slack Alerts | https://docs.linuxgsm.com/alerts/slack slackalert="off" diff --git a/lgsm/config-default/config-lgsm/ut2k4server/_default.cfg b/lgsm/config-default/config-lgsm/ut2k4server/_default.cfg index c72e868b2..e0cb639b8 100644 --- a/lgsm/config-default/config-lgsm/ut2k4server/_default.cfg +++ b/lgsm/config-default/config-lgsm/ut2k4server/_default.cfg @@ -65,6 +65,7 @@ channeltag="" # Pushover Alerts | https://docs.linuxgsm.com/alerts/pushover pushoveralert="off" pushovertoken="accesstoken" +pushoveruserkey="userkey" # Slack Alerts | https://docs.linuxgsm.com/alerts/slack slackalert="off" diff --git a/lgsm/config-default/config-lgsm/ut3server/_default.cfg b/lgsm/config-default/config-lgsm/ut3server/_default.cfg index 8d420353f..7b992dc6f 100644 --- a/lgsm/config-default/config-lgsm/ut3server/_default.cfg +++ b/lgsm/config-default/config-lgsm/ut3server/_default.cfg @@ -81,6 +81,7 @@ channeltag="" # Pushover Alerts | https://docs.linuxgsm.com/alerts/pushover pushoveralert="off" pushovertoken="accesstoken" +pushoveruserkey="userkey" # Slack Alerts | https://docs.linuxgsm.com/alerts/slack slackalert="off" diff --git a/lgsm/config-default/config-lgsm/ut99server/_default.cfg b/lgsm/config-default/config-lgsm/ut99server/_default.cfg index fa34161e7..e2483283b 100644 --- a/lgsm/config-default/config-lgsm/ut99server/_default.cfg +++ b/lgsm/config-default/config-lgsm/ut99server/_default.cfg @@ -65,6 +65,7 @@ channeltag="" # Pushover Alerts | https://docs.linuxgsm.com/alerts/pushover pushoveralert="off" pushovertoken="accesstoken" +pushoveruserkey="userkey" # Slack Alerts | https://docs.linuxgsm.com/alerts/slack slackalert="off" diff --git a/lgsm/config-default/config-lgsm/utserver/_default.cfg b/lgsm/config-default/config-lgsm/utserver/_default.cfg index f0f57c96e..6f5778f95 100644 --- a/lgsm/config-default/config-lgsm/utserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/utserver/_default.cfg @@ -69,6 +69,7 @@ channeltag="" # Pushover Alerts | https://docs.linuxgsm.com/alerts/pushover pushoveralert="off" pushovertoken="accesstoken" +pushoveruserkey="userkey" # Slack Alerts | https://docs.linuxgsm.com/alerts/slack slackalert="off" diff --git a/lgsm/config-default/config-lgsm/vsserver/_default.cfg b/lgsm/config-default/config-lgsm/vsserver/_default.cfg index 08df081f0..5c106befe 100644 --- a/lgsm/config-default/config-lgsm/vsserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/vsserver/_default.cfg @@ -68,6 +68,7 @@ channeltag="" # Pushover Alerts | https://docs.linuxgsm.com/alerts/pushover pushoveralert="off" pushovertoken="accesstoken" +pushoveruserkey="userkey" # Slack Alerts | https://docs.linuxgsm.com/alerts/slack slackalert="off" diff --git a/lgsm/config-default/config-lgsm/wetserver/_default.cfg b/lgsm/config-default/config-lgsm/wetserver/_default.cfg index 122aa2345..9c49e9ff6 100644 --- a/lgsm/config-default/config-lgsm/wetserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/wetserver/_default.cfg @@ -61,6 +61,7 @@ channeltag="" # Pushover Alerts | https://docs.linuxgsm.com/alerts/pushover pushoveralert="off" pushovertoken="accesstoken" +pushoveruserkey="userkey" # Slack Alerts | https://docs.linuxgsm.com/alerts/slack slackalert="off" diff --git a/lgsm/config-default/config-lgsm/wfserver/_default.cfg b/lgsm/config-default/config-lgsm/wfserver/_default.cfg index 5c6342026..2d7991ffd 100644 --- a/lgsm/config-default/config-lgsm/wfserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/wfserver/_default.cfg @@ -66,6 +66,7 @@ channeltag="" # Pushover Alerts | https://docs.linuxgsm.com/alerts/pushover pushoveralert="off" pushovertoken="accesstoken" +pushoveruserkey="userkey" # Slack Alerts | https://docs.linuxgsm.com/alerts/slack slackalert="off" diff --git a/lgsm/config-default/config-lgsm/wurmserver/_default.cfg b/lgsm/config-default/config-lgsm/wurmserver/_default.cfg index 8048687cf..66c1b6494 100644 --- a/lgsm/config-default/config-lgsm/wurmserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/wurmserver/_default.cfg @@ -63,6 +63,7 @@ channeltag="" # Pushover Alerts | https://docs.linuxgsm.com/alerts/pushover pushoveralert="off" pushovertoken="accesstoken" +pushoveruserkey="userkey" # Slack Alerts | https://docs.linuxgsm.com/alerts/slack slackalert="off" diff --git a/lgsm/config-default/config-lgsm/zmrserver/_default.cfg b/lgsm/config-default/config-lgsm/zmrserver/_default.cfg index 134b19072..3a9192b1d 100644 --- a/lgsm/config-default/config-lgsm/zmrserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/zmrserver/_default.cfg @@ -69,6 +69,7 @@ channeltag="" # Pushover Alerts | https://docs.linuxgsm.com/alerts/pushover pushoveralert="off" pushovertoken="accesstoken" +pushoveruserkey="userkey" # Slack Alerts | https://docs.linuxgsm.com/alerts/slack slackalert="off" diff --git a/lgsm/config-default/config-lgsm/zpsserver/_default.cfg b/lgsm/config-default/config-lgsm/zpsserver/_default.cfg index 8412173c1..61f538247 100644 --- a/lgsm/config-default/config-lgsm/zpsserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/zpsserver/_default.cfg @@ -74,6 +74,7 @@ channeltag="" # Pushover Alerts | https://docs.linuxgsm.com/alerts/pushover pushoveralert="off" pushovertoken="accesstoken" +pushoveruserkey="userkey" # Slack Alerts | https://docs.linuxgsm.com/alerts/slack slackalert="off" From 2c4e41417dea6b11f532243a1946c4dba5a383b8 Mon Sep 17 00:00:00 2001 From: Christian Date: Sun, 13 Sep 2020 23:46:31 +0200 Subject: [PATCH 453/534] fix(ecoserver): updates for Eco 0.9.0 (#3024) * server executable change to new name * change glibc version to 2.15 * add missing dependency libgdiplus for eco * updated and converted to using jq to gather server config details Co-authored-by: Daniel Gibbs --- .../config-lgsm/ecoserver/_default.cfg | 4 ++-- lgsm/functions/check_deps.sh | 6 ++++++ lgsm/functions/info_config.sh | 15 ++++++--------- 3 files changed, 14 insertions(+), 11 deletions(-) diff --git a/lgsm/config-default/config-lgsm/ecoserver/_default.cfg b/lgsm/config-default/config-lgsm/ecoserver/_default.cfg index e5d817d4a..90e5ed665 100644 --- a/lgsm/config-default/config-lgsm/ecoserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/ecoserver/_default.cfg @@ -140,7 +140,7 @@ consoleinteract="" # Do not edit gamename="Eco" engine="unity3d" -glibc="null" +glibc="2.15" #### Directories #### # Edit with care @@ -148,7 +148,7 @@ glibc="null" ## Game Server Directories systemdir="${serverfiles}" executabledir="${serverfiles}" -executable="mono ./EcoServer.exe" +executable="./EcoServer" servercfgdir="${systemdir}/Configs" servercfg="Network.eco" servercfgdefault="Network.eco" diff --git a/lgsm/functions/check_deps.sh b/lgsm/functions/check_deps.sh index a133c8486..3bc89b2e0 100644 --- a/lgsm/functions/check_deps.sh +++ b/lgsm/functions/check_deps.sh @@ -395,6 +395,9 @@ fn_deps_build_debian(){ # Call of Duty & Medal of Honor: Allied Assault elif [ "${shortname}" == "cod" ]||[ "${shortname}" == "coduo" ]||[ "${shortname}" == "cod2" ]||[ "${shortname}" == "mohaa" ]; then array_deps_required+=( libstdc++5:i386 ) + # Ecoserver + elif [ "${shortname}" == "eco" ]; then + array_deps_required+=( libgdiplus ) # Factorio elif [ "${shortname}" == "fctr" ]; then array_deps_required+=( xz-utils ) @@ -504,6 +507,9 @@ fn_deps_build_redhat(){ # Call of Duty & Medal of Honor: Allied Assault elif [ "${shortname}" == "cod" ]||[ "${shortname}" == "coduo" ]||[ "${shortname}" == "cod2" ]||[ "${shortname}" == "mohaa" ]; then array_deps_required+=( compat-libstdc++-33.i686 ) + # Ecoserver + elif [ "${shortname}" == "eco" ]; then + array_deps_required+=( libgdiplus ) # Factorio elif [ "${shortname}" == "fctr" ]; then array_deps_required+=( xz ) diff --git a/lgsm/functions/info_config.sh b/lgsm/functions/info_config.sh index fd7ea988e..1421cba2b 100644 --- a/lgsm/functions/info_config.sh +++ b/lgsm/functions/info_config.sh @@ -349,18 +349,16 @@ fn_info_config_eco(){ servername="${unavailable}" serverpassword="${unavailable}" maxplayers="${zero}" - gamemode="${unavailable}" tickrate="${zero}" port="${zero}" webadminport="${zero}" - public="" else - servername=$(grep "Description" "${servercfgdir}/Network.eco" | sed -e 's/^[ \t]*//g' -e '/^#/d' -e 's/Description//g' | tr -d '=\";,:' | sed -e 's/^[ \t]*//' -e 's/[ \t]*$//') - serverpassword=$(grep "Password" "${servercfgdir}/Network.eco" | sed -e 's/^[ \t]*//g' -e '/^#/d' -e 's/Password//g' | tr -d '=\";,:' | sed -e 's/^[ \t]*//' -e 's/[ \t]*$//') - maxplayers=$(grep "MaxConnections" "${servercfgdir}/Network.eco" | sed -e 's/^[ \t]*//g' -e '/^#/d' -e 's/MaxConnections//g' | tr -d '=\";,:' | sed -e 's/^[ \t]*//' -e 's/[ \t]*$//') - port=$(grep "\"GameServerPort\"" "${servercfgdir}/Network.eco" | tr -cd '[:digit:]') - webadminport=$(grep "\"WebServerPort\"" "${servercfgdir}/Network.eco" | tr -cd '[:digit:]') - public=$(grep "PublicServer" "${servercfgdir}/Network.eco" | sed -e 's/^[ \t]*//g' -e '/^#/d' -e 's/PublicServer//g' | tr -d '=\";,:' | sed -e 's/^[ \t]*//' -e 's/[ \t]*$//') + servername=$(jq -r .Description "${servercfgdir}/Network.eco") + serverpassword=$(jq -r .Password "${servercfgdir}/Network.eco") + maxplayers=$(jq -r .MaxConnections "${servercfgdir}/Network.eco") + tickrate=$(jq -r .MaxConnections "${servercfgdir}/Network.eco") + port=$(jq -r .Rate "${servercfgdir}/Network.eco") + webadminport=$(jq -r .WebServerPort "${servercfgdir}/Network.eco") # Not Set servername=${servername:-"NOT SET"} @@ -368,7 +366,6 @@ fn_info_config_eco(){ maxplayers=${maxplayers=:-"0"} port=${port=:-"0"} webadminport=${webadminport=:-"0"} - public=${public=:-"NOT SET"} fi } From c267953da793e3bd8d68b3a2730713d63ca3a57b Mon Sep 17 00:00:00 2001 From: P4R4NORM4L Date: Sun, 13 Sep 2020 15:50:32 -0600 Subject: [PATCH 454/534] feat(rustserver): add rust custom map support (#3017) --- lgsm/functions/command_wipe.sh | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/lgsm/functions/command_wipe.sh b/lgsm/functions/command_wipe.sh index 66b335446..7ebf2aa9d 100644 --- a/lgsm/functions/command_wipe.sh +++ b/lgsm/functions/command_wipe.sh @@ -77,6 +77,32 @@ fn_wipe_server_files(){ fn_sleep_time fn_script_log_pass "No barren map save to remove." fi + # Wipe custom map. + if [ -n "$(find "${serveridentitydir}" -type f -name "*.map")" ]; then + echo -en "removing custom map file(s)..." + fn_sleep_time + fn_script_log_info "Removing map file(s): ${serveridentitydir}/*.map" + find "${serveridentitydir:?}" -type f -name "*.map" -delete | tee -a "${lgsmlog}" + fn_wipe_exit_code + fn_sleep_time + else + echo -e "no map file to remove" + fn_sleep_time + fn_script_log_pass "No map file to remove" + fi + # Wipe custom map save. + if [ -n "$(find "${serveridentitydir}" -type f -name "*.sav")" ]; then + echo -en "removing map save *.sav file(s)..." + fn_sleep_time + fn_script_log_info "Removing map save(s): ${serveridentitydir}/*.sav" + find "${serveridentitydir:?}" -type f -name "*.sav" -delete | tee -a "${lgsmlog}" + fn_wipe_exit_code + fn_sleep_time + else + echo -e "no map save to remove" + fn_sleep_time + fn_script_log_pass "No map save to remove." + fi # Wipe user dir, might be a legacy thing, maybe to be removed. if [ -d "${serveridentitydir}/user" ]; then echo -en "removing user directory..." From 54b20d53df80792dffa1670f4e31b331d6133445 Mon Sep 17 00:00:00 2001 From: Christian Date: Mon, 14 Sep 2020 15:18:52 +0200 Subject: [PATCH 455/534] fix(arkserver): add admin and connect password to details (#3033) --- lgsm/functions/info_config.sh | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/lgsm/functions/info_config.sh b/lgsm/functions/info_config.sh index 1421cba2b..f6456d574 100644 --- a/lgsm/functions/info_config.sh +++ b/lgsm/functions/info_config.sh @@ -105,10 +105,17 @@ fn_info_config_justcause3(){ fn_info_config_ark(){ if [ ! -f "${servercfgfullpath}" ]; then servername="${unavailable}" + adminpassword="${unavailable}" + serverpassword="${unavailable}" else servername=$(grep "SessionName" "${servercfgfullpath}" | sed -e 's/^[ \t]*//g' -e '/^--/d' -e 's/SessionName//g' | tr -d '=\";,:' | sed -e 's/^[ \t]*//' -e 's/[ \t]*$//') + adminpassword=$(grep "ServerAdminPassword" "${servercfgfullpath}" | sed -e 's/^[ \t]*//g' -e '/^--/d' -e 's/ServerAdminPassword//g' | tr -d '=\";,:' | sed -e 's/^[ \t]*//' -e 's/[ \t]*$//' ) + serverpassword=$( grep "ServerPassword" "${servercfgfullpath}" | sed -e 's/^[ \t]*//g' -e '/^--/d' -e 's/ServerPassword//g' | tr -d '=\";,:' | sed -e 's/^[ \t]*//' -e 's/[ \t]*$//') + # Not Set servername=${servername:-"NOT SET"} + adminpassword=${adminpassword:-"NOT SET"} + serverpassword=${serverpassword:-"NOT SET"} fi } From 4d587e3bc699367316d9a1017cc5f92718dfd987 Mon Sep 17 00:00:00 2001 From: Christian Date: Tue, 15 Sep 2020 09:52:58 +0200 Subject: [PATCH 456/534] fix(eco): display correct values in display and fixup (#3034) --- lgsm/functions/info_config.sh | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/lgsm/functions/info_config.sh b/lgsm/functions/info_config.sh index f6456d574..4804207aa 100644 --- a/lgsm/functions/info_config.sh +++ b/lgsm/functions/info_config.sh @@ -353,6 +353,7 @@ fn_info_config_dontstarve(){ fn_info_config_eco(){ if [ ! -f "${servercfgfullpath}" ]; then + configip="${unavailable}" servername="${unavailable}" serverpassword="${unavailable}" maxplayers="${zero}" @@ -360,14 +361,16 @@ fn_info_config_eco(){ port="${zero}" webadminport="${zero}" else - servername=$(jq -r .Description "${servercfgdir}/Network.eco") - serverpassword=$(jq -r .Password "${servercfgdir}/Network.eco") - maxplayers=$(jq -r .MaxConnections "${servercfgdir}/Network.eco") - tickrate=$(jq -r .MaxConnections "${servercfgdir}/Network.eco") - port=$(jq -r .Rate "${servercfgdir}/Network.eco") - webadminport=$(jq -r .WebServerPort "${servercfgdir}/Network.eco") + configip=$(jq -r '.IPAddress' "${servercfgfullpath}") + servername=$(jq -r '.Description' "${servercfgfullpath}") + serverpassword=$(jq -r '.Password' "${servercfgfullpath}") + maxplayers=$(jq -r '.MaxConnections' "${servercfgfullpath}") + tickrate=$(jq -r '.Rate' "${servercfgfullpath}") + port=$(jq -r '.GameServerPort' "${servercfgfullpath}") + webadminport=$(jq -r '.WebServerPort' "${servercfgfullpath}") # Not Set + configip=${configip:-"NOT SET"} servername=${servername:-"NOT SET"} serverpassword=${serverpassword:-"NOT SET"} maxplayers=${maxplayers=:-"0"} From a9b3352e0fc1f145eeef97d357abb7c3c4db1ef0 Mon Sep 17 00:00:00 2001 From: Christian Date: Tue, 15 Sep 2020 09:54:14 +0200 Subject: [PATCH 457/534] feature(alert): add mailgun api eu support (#3035) --- lgsm/config-default/config-lgsm/acserver/_default.cfg | 1 + lgsm/config-default/config-lgsm/ahl2server/_default.cfg | 1 + lgsm/config-default/config-lgsm/ahlserver/_default.cfg | 1 + lgsm/config-default/config-lgsm/arkserver/_default.cfg | 1 + lgsm/config-default/config-lgsm/arma3server/_default.cfg | 1 + lgsm/config-default/config-lgsm/avserver/_default.cfg | 1 + lgsm/config-default/config-lgsm/bb2server/_default.cfg | 1 + lgsm/config-default/config-lgsm/bbserver/_default.cfg | 1 + lgsm/config-default/config-lgsm/bdserver/_default.cfg | 1 + lgsm/config-default/config-lgsm/bf1942server/_default.cfg | 1 + lgsm/config-default/config-lgsm/bfvserver/_default.cfg | 1 + lgsm/config-default/config-lgsm/bmdmserver/_default.cfg | 1 + lgsm/config-default/config-lgsm/boserver/_default.cfg | 1 + lgsm/config-default/config-lgsm/bsserver/_default.cfg | 1 + lgsm/config-default/config-lgsm/bt1944server/_default.cfg | 1 + lgsm/config-default/config-lgsm/btserver/_default.cfg | 1 + lgsm/config-default/config-lgsm/ccserver/_default.cfg | 1 + lgsm/config-default/config-lgsm/cmwserver/_default.cfg | 1 + lgsm/config-default/config-lgsm/cod2server/_default.cfg | 1 + lgsm/config-default/config-lgsm/cod4server/_default.cfg | 1 + lgsm/config-default/config-lgsm/codserver/_default.cfg | 1 + lgsm/config-default/config-lgsm/coduoserver/_default.cfg | 1 + lgsm/config-default/config-lgsm/codwawserver/_default.cfg | 1 + lgsm/config-default/config-lgsm/csczserver/_default.cfg | 1 + lgsm/config-default/config-lgsm/csgoserver/_default.cfg | 1 + lgsm/config-default/config-lgsm/csserver/_default.cfg | 1 + lgsm/config-default/config-lgsm/cssserver/_default.cfg | 1 + lgsm/config-default/config-lgsm/dabserver/_default.cfg | 1 + lgsm/config-default/config-lgsm/dmcserver/_default.cfg | 1 + lgsm/config-default/config-lgsm/dodserver/_default.cfg | 1 + lgsm/config-default/config-lgsm/dodsserver/_default.cfg | 1 + lgsm/config-default/config-lgsm/doiserver/_default.cfg | 1 + lgsm/config-default/config-lgsm/dstserver/_default.cfg | 1 + lgsm/config-default/config-lgsm/dysserver/_default.cfg | 1 + lgsm/config-default/config-lgsm/ecoserver/_default.cfg | 1 + lgsm/config-default/config-lgsm/emserver/_default.cfg | 1 + lgsm/config-default/config-lgsm/etlserver/_default.cfg | 1 + lgsm/config-default/config-lgsm/fctrserver/_default.cfg | 1 + lgsm/config-default/config-lgsm/fofserver/_default.cfg | 1 + lgsm/config-default/config-lgsm/gesserver/_default.cfg | 1 + lgsm/config-default/config-lgsm/gmodserver/_default.cfg | 1 + lgsm/config-default/config-lgsm/hl2dmserver/_default.cfg | 1 + lgsm/config-default/config-lgsm/hldmserver/_default.cfg | 1 + lgsm/config-default/config-lgsm/hldmsserver/_default.cfg | 1 + lgsm/config-default/config-lgsm/hwserver/_default.cfg | 1 + lgsm/config-default/config-lgsm/insserver/_default.cfg | 1 + lgsm/config-default/config-lgsm/inssserver/_default.cfg | 1 + lgsm/config-default/config-lgsm/iosserver/_default.cfg | 1 + lgsm/config-default/config-lgsm/jc2server/_default.cfg | 1 + lgsm/config-default/config-lgsm/jc3server/_default.cfg | 1 + lgsm/config-default/config-lgsm/jk2server/_default.cfg | 1 + lgsm/config-default/config-lgsm/kf2server/_default.cfg | 1 + lgsm/config-default/config-lgsm/kfserver/_default.cfg | 1 + lgsm/config-default/config-lgsm/l4d2server/_default.cfg | 1 + lgsm/config-default/config-lgsm/l4dserver/_default.cfg | 1 + lgsm/config-default/config-lgsm/mcbserver/_default.cfg | 1 + lgsm/config-default/config-lgsm/mcserver/_default.cfg | 1 + lgsm/config-default/config-lgsm/mhserver/_default.cfg | 1 + lgsm/config-default/config-lgsm/mohaaserver/_default.cfg | 1 + lgsm/config-default/config-lgsm/momserver/_default.cfg | 1 + lgsm/config-default/config-lgsm/mtaserver/_default.cfg | 1 + lgsm/config-default/config-lgsm/mumbleserver/_default.cfg | 1 + lgsm/config-default/config-lgsm/ndserver/_default.cfg | 1 + lgsm/config-default/config-lgsm/nmrihserver/_default.cfg | 1 + lgsm/config-default/config-lgsm/ns2cserver/_default.cfg | 1 + lgsm/config-default/config-lgsm/ns2server/_default.cfg | 1 + lgsm/config-default/config-lgsm/nsserver/_default.cfg | 1 + lgsm/config-default/config-lgsm/onsetserver/_default.cfg | 1 + lgsm/config-default/config-lgsm/opforserver/_default.cfg | 1 + lgsm/config-default/config-lgsm/pcserver/_default.cfg | 1 + lgsm/config-default/config-lgsm/pstbsserver/_default.cfg | 1 + lgsm/config-default/config-lgsm/pvkiiserver/_default.cfg | 1 + lgsm/config-default/config-lgsm/pzserver/_default.cfg | 1 + lgsm/config-default/config-lgsm/q2server/_default.cfg | 1 + lgsm/config-default/config-lgsm/q3server/_default.cfg | 1 + lgsm/config-default/config-lgsm/qlserver/_default.cfg | 1 + lgsm/config-default/config-lgsm/qwserver/_default.cfg | 1 + .../config-lgsm/ricochetserver/_default.cfg | 1 + lgsm/config-default/config-lgsm/roserver/_default.cfg | 1 + lgsm/config-default/config-lgsm/rtcwserver/_default.cfg | 1 + lgsm/config-default/config-lgsm/rustserver/_default.cfg | 1 + lgsm/config-default/config-lgsm/rwserver/_default.cfg | 1 + lgsm/config-default/config-lgsm/sampserver/_default.cfg | 1 + lgsm/config-default/config-lgsm/sbotsserver/_default.cfg | 1 + lgsm/config-default/config-lgsm/sbserver/_default.cfg | 1 + lgsm/config-default/config-lgsm/sdtdserver/_default.cfg | 1 + lgsm/config-default/config-lgsm/sfcserver/_default.cfg | 1 + lgsm/config-default/config-lgsm/sof2server/_default.cfg | 1 + lgsm/config-default/config-lgsm/solserver/_default.cfg | 1 + lgsm/config-default/config-lgsm/squadserver/_default.cfg | 1 + lgsm/config-default/config-lgsm/ss3server/_default.cfg | 1 + lgsm/config-default/config-lgsm/stserver/_default.cfg | 1 + lgsm/config-default/config-lgsm/svenserver/_default.cfg | 1 + .../config-lgsm/terrariaserver/_default.cfg | 1 + lgsm/config-default/config-lgsm/tf2server/_default.cfg | 1 + lgsm/config-default/config-lgsm/tfcserver/_default.cfg | 1 + lgsm/config-default/config-lgsm/ts3server/_default.cfg | 1 + lgsm/config-default/config-lgsm/tsserver/_default.cfg | 1 + lgsm/config-default/config-lgsm/tuserver/_default.cfg | 1 + lgsm/config-default/config-lgsm/twserver/_default.cfg | 1 + lgsm/config-default/config-lgsm/untserver/_default.cfg | 1 + lgsm/config-default/config-lgsm/ut2k4server/_default.cfg | 1 + lgsm/config-default/config-lgsm/ut3server/_default.cfg | 1 + lgsm/config-default/config-lgsm/ut99server/_default.cfg | 1 + lgsm/config-default/config-lgsm/utserver/_default.cfg | 1 + lgsm/config-default/config-lgsm/vsserver/_default.cfg | 1 + lgsm/config-default/config-lgsm/wetserver/_default.cfg | 1 + lgsm/config-default/config-lgsm/wfserver/_default.cfg | 1 + lgsm/config-default/config-lgsm/wurmserver/_default.cfg | 1 + lgsm/config-default/config-lgsm/zmrserver/_default.cfg | 1 + lgsm/config-default/config-lgsm/zpsserver/_default.cfg | 1 + lgsm/functions/alert_mailgun.sh | 8 +++++++- 112 files changed, 118 insertions(+), 1 deletion(-) diff --git a/lgsm/config-default/config-lgsm/acserver/_default.cfg b/lgsm/config-default/config-lgsm/acserver/_default.cfg index ad98300fe..f5d713d11 100644 --- a/lgsm/config-default/config-lgsm/acserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/acserver/_default.cfg @@ -54,6 +54,7 @@ iftttevent="linuxgsm_alert" # Mailgun Email Alerts | https://docs.linuxgsm.com/alerts/mailgun mailgunalert="off" +mailgunapiregion="us" mailguntoken="accesstoken" mailgundomain="example.com" mailgunemailfrom="alert@example.com" diff --git a/lgsm/config-default/config-lgsm/ahl2server/_default.cfg b/lgsm/config-default/config-lgsm/ahl2server/_default.cfg index 212d9ca01..11640872b 100644 --- a/lgsm/config-default/config-lgsm/ahl2server/_default.cfg +++ b/lgsm/config-default/config-lgsm/ahl2server/_default.cfg @@ -60,6 +60,7 @@ iftttevent="linuxgsm_alert" # Mailgun Email Alerts | https://docs.linuxgsm.com/alerts/mailgun mailgunalert="off" +mailgunapiregion="us" mailguntoken="accesstoken" mailgundomain="example.com" mailgunemailfrom="alert@example.com" diff --git a/lgsm/config-default/config-lgsm/ahlserver/_default.cfg b/lgsm/config-default/config-lgsm/ahlserver/_default.cfg index b19364cee..692557c81 100644 --- a/lgsm/config-default/config-lgsm/ahlserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/ahlserver/_default.cfg @@ -55,6 +55,7 @@ iftttevent="linuxgsm_alert" # Mailgun Email Alerts | https://docs.linuxgsm.com/alerts/mailgun mailgunalert="off" +mailgunapiregion="us" mailguntoken="accesstoken" mailgundomain="example.com" mailgunemailfrom="alert@example.com" diff --git a/lgsm/config-default/config-lgsm/arkserver/_default.cfg b/lgsm/config-default/config-lgsm/arkserver/_default.cfg index e2620b1c4..54d2ef29c 100644 --- a/lgsm/config-default/config-lgsm/arkserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/arkserver/_default.cfg @@ -58,6 +58,7 @@ iftttevent="linuxgsm_alert" # Mailgun Email Alerts | https://docs.linuxgsm.com/alerts/mailgun mailgunalert="off" +mailgunapiregion="us" mailguntoken="accesstoken" mailgundomain="example.com" mailgunemailfrom="alert@example.com" diff --git a/lgsm/config-default/config-lgsm/arma3server/_default.cfg b/lgsm/config-default/config-lgsm/arma3server/_default.cfg index 349b44a2c..08d9afa3b 100644 --- a/lgsm/config-default/config-lgsm/arma3server/_default.cfg +++ b/lgsm/config-default/config-lgsm/arma3server/_default.cfg @@ -71,6 +71,7 @@ iftttevent="linuxgsm_alert" # Mailgun Email Alerts | https://docs.linuxgsm.com/alerts/mailgun mailgunalert="off" +mailgunapiregion="us" mailguntoken="accesstoken" mailgundomain="example.com" mailgunemailfrom="alert@example.com" diff --git a/lgsm/config-default/config-lgsm/avserver/_default.cfg b/lgsm/config-default/config-lgsm/avserver/_default.cfg index 82fd225cc..047fbe8b0 100644 --- a/lgsm/config-default/config-lgsm/avserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/avserver/_default.cfg @@ -55,6 +55,7 @@ iftttevent="linuxgsm_alert" # Mailgun Email Alerts | https://docs.linuxgsm.com/alerts/mailgun mailgunalert="off" +mailgunapiregion="us" mailguntoken="accesstoken" mailgundomain="example.com" mailgunemailfrom="alert@example.com" diff --git a/lgsm/config-default/config-lgsm/bb2server/_default.cfg b/lgsm/config-default/config-lgsm/bb2server/_default.cfg index 4da63f06a..a71b69bd1 100644 --- a/lgsm/config-default/config-lgsm/bb2server/_default.cfg +++ b/lgsm/config-default/config-lgsm/bb2server/_default.cfg @@ -61,6 +61,7 @@ iftttevent="linuxgsm_alert" # Mailgun Email Alerts | https://docs.linuxgsm.com/alerts/mailgun mailgunalert="off" +mailgunapiregion="us" mailguntoken="accesstoken" mailgundomain="example.com" mailgunemailfrom="alert@example.com" diff --git a/lgsm/config-default/config-lgsm/bbserver/_default.cfg b/lgsm/config-default/config-lgsm/bbserver/_default.cfg index 2b8b4112a..ae207ff1b 100644 --- a/lgsm/config-default/config-lgsm/bbserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/bbserver/_default.cfg @@ -55,6 +55,7 @@ iftttevent="linuxgsm_alert" # Mailgun Email Alerts | https://docs.linuxgsm.com/alerts/mailgun mailgunalert="off" +mailgunapiregion="us" mailguntoken="accesstoken" mailgundomain="example.com" mailgunemailfrom="alert@example.com" diff --git a/lgsm/config-default/config-lgsm/bdserver/_default.cfg b/lgsm/config-default/config-lgsm/bdserver/_default.cfg index 0fcce8213..d4f0fc913 100644 --- a/lgsm/config-default/config-lgsm/bdserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/bdserver/_default.cfg @@ -55,6 +55,7 @@ iftttevent="linuxgsm_alert" # Mailgun Email Alerts | https://docs.linuxgsm.com/alerts/mailgun mailgunalert="off" +mailgunapiregion="us" mailguntoken="accesstoken" mailgundomain="example.com" mailgunemailfrom="alert@example.com" diff --git a/lgsm/config-default/config-lgsm/bf1942server/_default.cfg b/lgsm/config-default/config-lgsm/bf1942server/_default.cfg index d44f2631e..435a5d8c7 100644 --- a/lgsm/config-default/config-lgsm/bf1942server/_default.cfg +++ b/lgsm/config-default/config-lgsm/bf1942server/_default.cfg @@ -48,6 +48,7 @@ iftttevent="linuxgsm_alert" # Mailgun Email Alerts | https://docs.linuxgsm.com/alerts/mailgun mailgunalert="off" +mailgunapiregion="us" mailguntoken="accesstoken" mailgundomain="example.com" mailgunemailfrom="alert@example.com" diff --git a/lgsm/config-default/config-lgsm/bfvserver/_default.cfg b/lgsm/config-default/config-lgsm/bfvserver/_default.cfg index 50c7a37d3..69b6d5f1e 100644 --- a/lgsm/config-default/config-lgsm/bfvserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/bfvserver/_default.cfg @@ -48,6 +48,7 @@ iftttevent="linuxgsm_alert" # Mailgun Email Alerts | https://docs.linuxgsm.com/alerts/mailgun mailgunalert="off" +mailgunapiregion="us" mailguntoken="accesstoken" mailgundomain="example.com" mailgunemailfrom="alert@example.com" diff --git a/lgsm/config-default/config-lgsm/bmdmserver/_default.cfg b/lgsm/config-default/config-lgsm/bmdmserver/_default.cfg index c92b26f90..e6b7ef772 100644 --- a/lgsm/config-default/config-lgsm/bmdmserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/bmdmserver/_default.cfg @@ -61,6 +61,7 @@ iftttevent="linuxgsm_alert" # Mailgun Email Alerts | https://docs.linuxgsm.com/alerts/mailgun mailgunalert="off" +mailgunapiregion="us" mailguntoken="accesstoken" mailgundomain="example.com" mailgunemailfrom="alert@example.com" diff --git a/lgsm/config-default/config-lgsm/boserver/_default.cfg b/lgsm/config-default/config-lgsm/boserver/_default.cfg index 5f79119a4..73f4cfedc 100644 --- a/lgsm/config-default/config-lgsm/boserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/boserver/_default.cfg @@ -54,6 +54,7 @@ iftttevent="linuxgsm_alert" # Mailgun Email Alerts | https://docs.linuxgsm.com/alerts/mailgun mailgunalert="off" +mailgunapiregion="us" mailguntoken="accesstoken" mailgundomain="example.com" mailgunemailfrom="alert@example.com" diff --git a/lgsm/config-default/config-lgsm/bsserver/_default.cfg b/lgsm/config-default/config-lgsm/bsserver/_default.cfg index 575c79ab8..cf08b5161 100644 --- a/lgsm/config-default/config-lgsm/bsserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/bsserver/_default.cfg @@ -65,6 +65,7 @@ iftttevent="linuxgsm_alert" # Mailgun Email Alerts | https://docs.linuxgsm.com/alerts/mailgun mailgunalert="off" +mailgunapiregion="us" mailguntoken="accesstoken" mailgundomain="example.com" mailgunemailfrom="alert@example.com" diff --git a/lgsm/config-default/config-lgsm/bt1944server/_default.cfg b/lgsm/config-default/config-lgsm/bt1944server/_default.cfg index eaaaad8d4..d91e8a011 100644 --- a/lgsm/config-default/config-lgsm/bt1944server/_default.cfg +++ b/lgsm/config-default/config-lgsm/bt1944server/_default.cfg @@ -53,6 +53,7 @@ iftttevent="linuxgsm_alert" # Mailgun Email Alerts | https://docs.linuxgsm.com/alerts/mailgun mailgunalert="off" +mailgunapiregion="us" mailguntoken="accesstoken" mailgundomain="example.com" mailgunemailfrom="alert@example.com" diff --git a/lgsm/config-default/config-lgsm/btserver/_default.cfg b/lgsm/config-default/config-lgsm/btserver/_default.cfg index 99f092625..b18c5cf47 100644 --- a/lgsm/config-default/config-lgsm/btserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/btserver/_default.cfg @@ -48,6 +48,7 @@ iftttevent="linuxgsm_alert" # Mailgun Email Alerts | https://docs.linuxgsm.com/alerts/mailgun mailgunalert="off" +mailgunapiregion="us" mailguntoken="accesstoken" mailgundomain="example.com" mailgunemailfrom="alert@example.com" diff --git a/lgsm/config-default/config-lgsm/ccserver/_default.cfg b/lgsm/config-default/config-lgsm/ccserver/_default.cfg index 73ed33297..6779aa7f3 100644 --- a/lgsm/config-default/config-lgsm/ccserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/ccserver/_default.cfg @@ -56,6 +56,7 @@ iftttevent="linuxgsm_alert" # Mailgun Email Alerts | https://docs.linuxgsm.com/alerts/mailgun mailgunalert="off" +mailgunapiregion="us" mailguntoken="accesstoken" mailgundomain="example.com" mailgunemailfrom="alert@example.com" diff --git a/lgsm/config-default/config-lgsm/cmwserver/_default.cfg b/lgsm/config-default/config-lgsm/cmwserver/_default.cfg index f1887490e..dd86deeef 100644 --- a/lgsm/config-default/config-lgsm/cmwserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/cmwserver/_default.cfg @@ -57,6 +57,7 @@ iftttevent="linuxgsm_alert" # Mailgun Email Alerts | https://docs.linuxgsm.com/alerts/mailgun mailgunalert="off" +mailgunapiregion="us" mailguntoken="accesstoken" mailgundomain="example.com" mailgunemailfrom="alert@example.com" diff --git a/lgsm/config-default/config-lgsm/cod2server/_default.cfg b/lgsm/config-default/config-lgsm/cod2server/_default.cfg index 9be748a8d..f2f0d465a 100644 --- a/lgsm/config-default/config-lgsm/cod2server/_default.cfg +++ b/lgsm/config-default/config-lgsm/cod2server/_default.cfg @@ -54,6 +54,7 @@ iftttevent="linuxgsm_alert" # Mailgun Email Alerts | https://docs.linuxgsm.com/alerts/mailgun mailgunalert="off" +mailgunapiregion="us" mailguntoken="accesstoken" mailgundomain="example.com" mailgunemailfrom="alert@example.com" diff --git a/lgsm/config-default/config-lgsm/cod4server/_default.cfg b/lgsm/config-default/config-lgsm/cod4server/_default.cfg index 37090ae31..cdda7d813 100644 --- a/lgsm/config-default/config-lgsm/cod4server/_default.cfg +++ b/lgsm/config-default/config-lgsm/cod4server/_default.cfg @@ -54,6 +54,7 @@ iftttevent="linuxgsm_alert" # Mailgun Email Alerts | https://docs.linuxgsm.com/alerts/mailgun mailgunalert="off" +mailgunapiregion="us" mailguntoken="accesstoken" mailgundomain="example.com" mailgunemailfrom="alert@example.com" diff --git a/lgsm/config-default/config-lgsm/codserver/_default.cfg b/lgsm/config-default/config-lgsm/codserver/_default.cfg index edf409687..0eeb9e724 100644 --- a/lgsm/config-default/config-lgsm/codserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/codserver/_default.cfg @@ -54,6 +54,7 @@ iftttevent="linuxgsm_alert" # Mailgun Email Alerts | https://docs.linuxgsm.com/alerts/mailgun mailgunalert="off" +mailgunapiregion="us" mailguntoken="accesstoken" mailgundomain="example.com" mailgunemailfrom="alert@example.com" diff --git a/lgsm/config-default/config-lgsm/coduoserver/_default.cfg b/lgsm/config-default/config-lgsm/coduoserver/_default.cfg index 9a33cde3e..cd053b8a6 100644 --- a/lgsm/config-default/config-lgsm/coduoserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/coduoserver/_default.cfg @@ -54,6 +54,7 @@ iftttevent="linuxgsm_alert" # Mailgun Email Alerts | https://docs.linuxgsm.com/alerts/mailgun mailgunalert="off" +mailgunapiregion="us" mailguntoken="accesstoken" mailgundomain="example.com" mailgunemailfrom="alert@example.com" diff --git a/lgsm/config-default/config-lgsm/codwawserver/_default.cfg b/lgsm/config-default/config-lgsm/codwawserver/_default.cfg index 443e8713d..84b3ebfb0 100644 --- a/lgsm/config-default/config-lgsm/codwawserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/codwawserver/_default.cfg @@ -54,6 +54,7 @@ iftttevent="linuxgsm_alert" # Mailgun Email Alerts | https://docs.linuxgsm.com/alerts/mailgun mailgunalert="off" +mailgunapiregion="us" mailguntoken="accesstoken" mailgundomain="example.com" mailgunemailfrom="alert@example.com" diff --git a/lgsm/config-default/config-lgsm/csczserver/_default.cfg b/lgsm/config-default/config-lgsm/csczserver/_default.cfg index ef0499706..1db105d3c 100644 --- a/lgsm/config-default/config-lgsm/csczserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/csczserver/_default.cfg @@ -55,6 +55,7 @@ iftttevent="linuxgsm_alert" # Mailgun Email Alerts | https://docs.linuxgsm.com/alerts/mailgun mailgunalert="off" +mailgunapiregion="us" mailguntoken="accesstoken" mailgundomain="example.com" mailgunemailfrom="alert@example.com" diff --git a/lgsm/config-default/config-lgsm/csgoserver/_default.cfg b/lgsm/config-default/config-lgsm/csgoserver/_default.cfg index 05932036a..12ef8aa90 100644 --- a/lgsm/config-default/config-lgsm/csgoserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/csgoserver/_default.cfg @@ -81,6 +81,7 @@ iftttevent="linuxgsm_alert" # Mailgun Email Alerts | https://docs.linuxgsm.com/alerts/mailgun mailgunalert="off" +mailgunapiregion="us" mailguntoken="accesstoken" mailgundomain="example.com" mailgunemailfrom="alert@example.com" diff --git a/lgsm/config-default/config-lgsm/csserver/_default.cfg b/lgsm/config-default/config-lgsm/csserver/_default.cfg index a2389d083..924c88539 100644 --- a/lgsm/config-default/config-lgsm/csserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/csserver/_default.cfg @@ -55,6 +55,7 @@ iftttevent="linuxgsm_alert" # Mailgun Email Alerts | https://docs.linuxgsm.com/alerts/mailgun mailgunalert="off" +mailgunapiregion="us" mailguntoken="accesstoken" mailgundomain="example.com" mailgunemailfrom="alert@example.com" diff --git a/lgsm/config-default/config-lgsm/cssserver/_default.cfg b/lgsm/config-default/config-lgsm/cssserver/_default.cfg index 56793e8c3..1ca7dffa6 100644 --- a/lgsm/config-default/config-lgsm/cssserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/cssserver/_default.cfg @@ -61,6 +61,7 @@ iftttevent="linuxgsm_alert" # Mailgun Email Alerts | https://docs.linuxgsm.com/alerts/mailgun mailgunalert="off" +mailgunapiregion="us" mailguntoken="accesstoken" mailgundomain="example.com" mailgunemailfrom="alert@example.com" diff --git a/lgsm/config-default/config-lgsm/dabserver/_default.cfg b/lgsm/config-default/config-lgsm/dabserver/_default.cfg index d8430dbe0..b45dfe281 100644 --- a/lgsm/config-default/config-lgsm/dabserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/dabserver/_default.cfg @@ -56,6 +56,7 @@ iftttevent="linuxgsm_alert" # Mailgun Email Alerts | https://docs.linuxgsm.com/alerts/mailgun mailgunalert="off" +mailgunapiregion="us" mailguntoken="accesstoken" mailgundomain="example.com" mailgunemailfrom="alert@example.com" diff --git a/lgsm/config-default/config-lgsm/dmcserver/_default.cfg b/lgsm/config-default/config-lgsm/dmcserver/_default.cfg index 533285093..c0b668901 100644 --- a/lgsm/config-default/config-lgsm/dmcserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/dmcserver/_default.cfg @@ -55,6 +55,7 @@ iftttevent="linuxgsm_alert" # Mailgun Email Alerts | https://docs.linuxgsm.com/alerts/mailgun mailgunalert="off" +mailgunapiregion="us" mailguntoken="accesstoken" mailgundomain="example.com" mailgunemailfrom="alert@example.com" diff --git a/lgsm/config-default/config-lgsm/dodserver/_default.cfg b/lgsm/config-default/config-lgsm/dodserver/_default.cfg index 3bbb01646..34aff2abf 100644 --- a/lgsm/config-default/config-lgsm/dodserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/dodserver/_default.cfg @@ -55,6 +55,7 @@ iftttevent="linuxgsm_alert" # Mailgun Email Alerts | https://docs.linuxgsm.com/alerts/mailgun mailgunalert="off" +mailgunapiregion="us" mailguntoken="accesstoken" mailgundomain="example.com" mailgunemailfrom="alert@example.com" diff --git a/lgsm/config-default/config-lgsm/dodsserver/_default.cfg b/lgsm/config-default/config-lgsm/dodsserver/_default.cfg index ae7c441a6..95d47a168 100644 --- a/lgsm/config-default/config-lgsm/dodsserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/dodsserver/_default.cfg @@ -56,6 +56,7 @@ iftttevent="linuxgsm_alert" # Mailgun Email Alerts | https://docs.linuxgsm.com/alerts/mailgun mailgunalert="off" +mailgunapiregion="us" mailguntoken="accesstoken" mailgundomain="example.com" mailgunemailfrom="alert@example.com" diff --git a/lgsm/config-default/config-lgsm/doiserver/_default.cfg b/lgsm/config-default/config-lgsm/doiserver/_default.cfg index 7090436a9..d27bd20a8 100644 --- a/lgsm/config-default/config-lgsm/doiserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/doiserver/_default.cfg @@ -57,6 +57,7 @@ iftttevent="linuxgsm_alert" # Mailgun Email Alerts | https://docs.linuxgsm.com/alerts/mailgun mailgunalert="off" +mailgunapiregion="us" mailguntoken="accesstoken" mailgundomain="example.com" mailgunemailfrom="alert@example.com" diff --git a/lgsm/config-default/config-lgsm/dstserver/_default.cfg b/lgsm/config-default/config-lgsm/dstserver/_default.cfg index 4472545fb..f31a0ea63 100644 --- a/lgsm/config-default/config-lgsm/dstserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/dstserver/_default.cfg @@ -59,6 +59,7 @@ iftttevent="linuxgsm_alert" # Mailgun Email Alerts | https://docs.linuxgsm.com/alerts/mailgun mailgunalert="off" +mailgunapiregion="us" mailguntoken="accesstoken" mailgundomain="example.com" mailgunemailfrom="alert@example.com" diff --git a/lgsm/config-default/config-lgsm/dysserver/_default.cfg b/lgsm/config-default/config-lgsm/dysserver/_default.cfg index d2d11d5c1..13f841240 100644 --- a/lgsm/config-default/config-lgsm/dysserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/dysserver/_default.cfg @@ -61,6 +61,7 @@ iftttevent="linuxgsm_alert" # Mailgun Email Alerts | https://docs.linuxgsm.com/alerts/mailgun mailgunalert="off" +mailgunapiregion="us" mailguntoken="accesstoken" mailgundomain="example.com" mailgunemailfrom="alert@example.com" diff --git a/lgsm/config-default/config-lgsm/ecoserver/_default.cfg b/lgsm/config-default/config-lgsm/ecoserver/_default.cfg index 90e5ed665..0d2f56a3c 100644 --- a/lgsm/config-default/config-lgsm/ecoserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/ecoserver/_default.cfg @@ -48,6 +48,7 @@ iftttevent="linuxgsm_alert" # Mailgun Email Alerts | https://docs.linuxgsm.com/alerts/mailgun mailgunalert="off" +mailgunapiregion="us" mailguntoken="accesstoken" mailgundomain="example.com" mailgunemailfrom="alert@example.com" diff --git a/lgsm/config-default/config-lgsm/emserver/_default.cfg b/lgsm/config-default/config-lgsm/emserver/_default.cfg index dfbce8ddd..1282de234 100644 --- a/lgsm/config-default/config-lgsm/emserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/emserver/_default.cfg @@ -61,6 +61,7 @@ iftttevent="linuxgsm_alert" # Mailgun Email Alerts | https://docs.linuxgsm.com/alerts/mailgun mailgunalert="off" +mailgunapiregion="us" mailguntoken="accesstoken" mailgundomain="example.com" mailgunemailfrom="alert@example.com" diff --git a/lgsm/config-default/config-lgsm/etlserver/_default.cfg b/lgsm/config-default/config-lgsm/etlserver/_default.cfg index 85c1c4f35..2f95fc37c 100644 --- a/lgsm/config-default/config-lgsm/etlserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/etlserver/_default.cfg @@ -48,6 +48,7 @@ iftttevent="linuxgsm_alert" # Mailgun Email Alerts | https://docs.linuxgsm.com/alerts/mailgun mailgunalert="off" +mailgunapiregion="us" mailguntoken="accesstoken" mailgundomain="example.com" mailgunemailfrom="alert@example.com" diff --git a/lgsm/config-default/config-lgsm/fctrserver/_default.cfg b/lgsm/config-default/config-lgsm/fctrserver/_default.cfg index f728a3113..c3eb1c962 100644 --- a/lgsm/config-default/config-lgsm/fctrserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/fctrserver/_default.cfg @@ -56,6 +56,7 @@ iftttevent="linuxgsm_alert" # Mailgun Email Alerts | https://docs.linuxgsm.com/alerts/mailgun mailgunalert="off" +mailgunapiregion="us" mailguntoken="accesstoken" mailgundomain="example.com" mailgunemailfrom="alert@example.com" diff --git a/lgsm/config-default/config-lgsm/fofserver/_default.cfg b/lgsm/config-default/config-lgsm/fofserver/_default.cfg index cd56a2e54..41d3cd444 100644 --- a/lgsm/config-default/config-lgsm/fofserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/fofserver/_default.cfg @@ -56,6 +56,7 @@ iftttevent="linuxgsm_alert" # Mailgun Email Alerts | https://docs.linuxgsm.com/alerts/mailgun mailgunalert="off" +mailgunapiregion="us" mailguntoken="accesstoken" mailgundomain="example.com" mailgunemailfrom="alert@example.com" diff --git a/lgsm/config-default/config-lgsm/gesserver/_default.cfg b/lgsm/config-default/config-lgsm/gesserver/_default.cfg index 956f90508..bb80be779 100644 --- a/lgsm/config-default/config-lgsm/gesserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/gesserver/_default.cfg @@ -56,6 +56,7 @@ iftttevent="linuxgsm_alert" # Mailgun Email Alerts | https://docs.linuxgsm.com/alerts/mailgun mailgunalert="off" +mailgunapiregion="us" mailguntoken="accesstoken" mailgundomain="example.com" mailgunemailfrom="alert@example.com" diff --git a/lgsm/config-default/config-lgsm/gmodserver/_default.cfg b/lgsm/config-default/config-lgsm/gmodserver/_default.cfg index 15a48a972..ee50916aa 100644 --- a/lgsm/config-default/config-lgsm/gmodserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/gmodserver/_default.cfg @@ -72,6 +72,7 @@ iftttevent="linuxgsm_alert" # Mailgun Email Alerts | https://docs.linuxgsm.com/alerts/mailgun mailgunalert="off" +mailgunapiregion="us" mailguntoken="accesstoken" mailgundomain="example.com" mailgunemailfrom="alert@example.com" diff --git a/lgsm/config-default/config-lgsm/hl2dmserver/_default.cfg b/lgsm/config-default/config-lgsm/hl2dmserver/_default.cfg index b53bc4336..814ccc2e1 100644 --- a/lgsm/config-default/config-lgsm/hl2dmserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/hl2dmserver/_default.cfg @@ -56,6 +56,7 @@ iftttevent="linuxgsm_alert" # Mailgun Email Alerts | https://docs.linuxgsm.com/alerts/mailgun mailgunalert="off" +mailgunapiregion="us" mailguntoken="accesstoken" mailgundomain="example.com" mailgunemailfrom="alert@example.com" diff --git a/lgsm/config-default/config-lgsm/hldmserver/_default.cfg b/lgsm/config-default/config-lgsm/hldmserver/_default.cfg index 51bf83c21..b8e912f29 100644 --- a/lgsm/config-default/config-lgsm/hldmserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/hldmserver/_default.cfg @@ -55,6 +55,7 @@ iftttevent="linuxgsm_alert" # Mailgun Email Alerts | https://docs.linuxgsm.com/alerts/mailgun mailgunalert="off" +mailgunapiregion="us" mailguntoken="accesstoken" mailgundomain="example.com" mailgunemailfrom="alert@example.com" diff --git a/lgsm/config-default/config-lgsm/hldmsserver/_default.cfg b/lgsm/config-default/config-lgsm/hldmsserver/_default.cfg index df436368f..10217a7a0 100644 --- a/lgsm/config-default/config-lgsm/hldmsserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/hldmsserver/_default.cfg @@ -56,6 +56,7 @@ iftttevent="linuxgsm_alert" # Mailgun Email Alerts | https://docs.linuxgsm.com/alerts/mailgun mailgunalert="off" +mailgunapiregion="us" mailguntoken="accesstoken" mailgundomain="example.com" mailgunemailfrom="alert@example.com" diff --git a/lgsm/config-default/config-lgsm/hwserver/_default.cfg b/lgsm/config-default/config-lgsm/hwserver/_default.cfg index f312383ba..a68fb7e59 100644 --- a/lgsm/config-default/config-lgsm/hwserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/hwserver/_default.cfg @@ -67,6 +67,7 @@ iftttevent="linuxgsm_alert" # Mailgun Email Alerts | https://docs.linuxgsm.com/alerts/mailgun mailgunalert="off" +mailgunapiregion="us" mailguntoken="accesstoken" mailgundomain="example.com" mailgunemailfrom="alert@example.com" diff --git a/lgsm/config-default/config-lgsm/insserver/_default.cfg b/lgsm/config-default/config-lgsm/insserver/_default.cfg index 9f6c49f13..246e04c6c 100644 --- a/lgsm/config-default/config-lgsm/insserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/insserver/_default.cfg @@ -62,6 +62,7 @@ iftttevent="linuxgsm_alert" # Mailgun Email Alerts | https://docs.linuxgsm.com/alerts/mailgun mailgunalert="off" +mailgunapiregion="us" mailguntoken="accesstoken" mailgundomain="example.com" mailgunemailfrom="alert@example.com" diff --git a/lgsm/config-default/config-lgsm/inssserver/_default.cfg b/lgsm/config-default/config-lgsm/inssserver/_default.cfg index 65736bf97..087b82696 100644 --- a/lgsm/config-default/config-lgsm/inssserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/inssserver/_default.cfg @@ -63,6 +63,7 @@ iftttevent="linuxgsm_alert" # Mailgun Email Alerts | https://docs.linuxgsm.com/alerts/mailgun mailgunalert="off" +mailgunapiregion="us" mailguntoken="accesstoken" mailgundomain="example.com" mailgunemailfrom="alert@example.com" diff --git a/lgsm/config-default/config-lgsm/iosserver/_default.cfg b/lgsm/config-default/config-lgsm/iosserver/_default.cfg index e32a6f02b..35a245e24 100644 --- a/lgsm/config-default/config-lgsm/iosserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/iosserver/_default.cfg @@ -56,6 +56,7 @@ iftttevent="linuxgsm_alert" # Mailgun Email Alerts | https://docs.linuxgsm.com/alerts/mailgun mailgunalert="off" +mailgunapiregion="us" mailguntoken="accesstoken" mailgundomain="example.com" mailgunemailfrom="alert@example.com" diff --git a/lgsm/config-default/config-lgsm/jc2server/_default.cfg b/lgsm/config-default/config-lgsm/jc2server/_default.cfg index dd3227ba8..d0de94c49 100644 --- a/lgsm/config-default/config-lgsm/jc2server/_default.cfg +++ b/lgsm/config-default/config-lgsm/jc2server/_default.cfg @@ -48,6 +48,7 @@ iftttevent="linuxgsm_alert" # Mailgun Email Alerts | https://docs.linuxgsm.com/alerts/mailgun mailgunalert="off" +mailgunapiregion="us" mailguntoken="accesstoken" mailgundomain="example.com" mailgunemailfrom="alert@example.com" diff --git a/lgsm/config-default/config-lgsm/jc3server/_default.cfg b/lgsm/config-default/config-lgsm/jc3server/_default.cfg index 4fc274c5c..ada06087a 100644 --- a/lgsm/config-default/config-lgsm/jc3server/_default.cfg +++ b/lgsm/config-default/config-lgsm/jc3server/_default.cfg @@ -48,6 +48,7 @@ iftttevent="linuxgsm_alert" # Mailgun Email Alerts | https://docs.linuxgsm.com/alerts/mailgun mailgunalert="off" +mailgunapiregion="us" mailguntoken="accesstoken" mailgundomain="example.com" mailgunemailfrom="alert@example.com" diff --git a/lgsm/config-default/config-lgsm/jk2server/_default.cfg b/lgsm/config-default/config-lgsm/jk2server/_default.cfg index 42bd79beb..0933c8cba 100644 --- a/lgsm/config-default/config-lgsm/jk2server/_default.cfg +++ b/lgsm/config-default/config-lgsm/jk2server/_default.cfg @@ -55,6 +55,7 @@ iftttevent="linuxgsm_alert" # Mailgun Email Alerts | https://docs.linuxgsm.com/alerts/mailgun mailgunalert="off" +mailgunapiregion="us" mailguntoken="accesstoken" mailgundomain="example.com" mailgunemailfrom="alert@example.com" diff --git a/lgsm/config-default/config-lgsm/kf2server/_default.cfg b/lgsm/config-default/config-lgsm/kf2server/_default.cfg index 3e1f8eae6..6271a75ad 100644 --- a/lgsm/config-default/config-lgsm/kf2server/_default.cfg +++ b/lgsm/config-default/config-lgsm/kf2server/_default.cfg @@ -54,6 +54,7 @@ iftttevent="linuxgsm_alert" # Mailgun Email Alerts | https://docs.linuxgsm.com/alerts/mailgun mailgunalert="off" +mailgunapiregion="us" mailguntoken="accesstoken" mailgundomain="example.com" mailgunemailfrom="alert@example.com" diff --git a/lgsm/config-default/config-lgsm/kfserver/_default.cfg b/lgsm/config-default/config-lgsm/kfserver/_default.cfg index 88b8c0673..9e45c4f16 100644 --- a/lgsm/config-default/config-lgsm/kfserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/kfserver/_default.cfg @@ -60,6 +60,7 @@ iftttevent="linuxgsm_alert" # Mailgun Email Alerts | https://docs.linuxgsm.com/alerts/mailgun mailgunalert="off" +mailgunapiregion="us" mailguntoken="accesstoken" mailgundomain="example.com" mailgunemailfrom="alert@example.com" diff --git a/lgsm/config-default/config-lgsm/l4d2server/_default.cfg b/lgsm/config-default/config-lgsm/l4d2server/_default.cfg index 13e701f86..1241957f1 100644 --- a/lgsm/config-default/config-lgsm/l4d2server/_default.cfg +++ b/lgsm/config-default/config-lgsm/l4d2server/_default.cfg @@ -55,6 +55,7 @@ iftttevent="linuxgsm_alert" # Mailgun Email Alerts | https://docs.linuxgsm.com/alerts/mailgun mailgunalert="off" +mailgunapiregion="us" mailguntoken="accesstoken" mailgundomain="example.com" mailgunemailfrom="alert@example.com" diff --git a/lgsm/config-default/config-lgsm/l4dserver/_default.cfg b/lgsm/config-default/config-lgsm/l4dserver/_default.cfg index f0de75779..f855de34e 100644 --- a/lgsm/config-default/config-lgsm/l4dserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/l4dserver/_default.cfg @@ -55,6 +55,7 @@ iftttevent="linuxgsm_alert" # Mailgun Email Alerts | https://docs.linuxgsm.com/alerts/mailgun mailgunalert="off" +mailgunapiregion="us" mailguntoken="accesstoken" mailgundomain="example.com" mailgunemailfrom="alert@example.com" diff --git a/lgsm/config-default/config-lgsm/mcbserver/_default.cfg b/lgsm/config-default/config-lgsm/mcbserver/_default.cfg index c02c78466..e357cf273 100644 --- a/lgsm/config-default/config-lgsm/mcbserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/mcbserver/_default.cfg @@ -48,6 +48,7 @@ iftttevent="linuxgsm_alert" # Mailgun Email Alerts | https://docs.linuxgsm.com/alerts/mailgun mailgunalert="off" +mailgunapiregion="us" mailguntoken="accesstoken" mailgundomain="example.com" mailgunemailfrom="alert@example.com" diff --git a/lgsm/config-default/config-lgsm/mcserver/_default.cfg b/lgsm/config-default/config-lgsm/mcserver/_default.cfg index 927801557..7727afbec 100644 --- a/lgsm/config-default/config-lgsm/mcserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/mcserver/_default.cfg @@ -54,6 +54,7 @@ iftttevent="linuxgsm_alert" # Mailgun Email Alerts | https://docs.linuxgsm.com/alerts/mailgun mailgunalert="off" +mailgunapiregion="us" mailguntoken="accesstoken" mailgundomain="example.com" mailgunemailfrom="alert@example.com" diff --git a/lgsm/config-default/config-lgsm/mhserver/_default.cfg b/lgsm/config-default/config-lgsm/mhserver/_default.cfg index 04aadb369..4be0c811e 100644 --- a/lgsm/config-default/config-lgsm/mhserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/mhserver/_default.cfg @@ -56,6 +56,7 @@ iftttevent="linuxgsm_alert" # Mailgun Email Alerts | https://docs.linuxgsm.com/alerts/mailgun mailgunalert="off" +mailgunapiregion="us" mailguntoken="accesstoken" mailgundomain="example.com" mailgunemailfrom="alert@example.com" diff --git a/lgsm/config-default/config-lgsm/mohaaserver/_default.cfg b/lgsm/config-default/config-lgsm/mohaaserver/_default.cfg index 4899dbc4d..f6901c811 100644 --- a/lgsm/config-default/config-lgsm/mohaaserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/mohaaserver/_default.cfg @@ -53,6 +53,7 @@ iftttevent="linuxgsm_alert" # Mailgun Email Alerts | https://docs.linuxgsm.com/alerts/mailgun mailgunalert="off" +mailgunapiregion="us" mailguntoken="accesstoken" mailgundomain="example.com" mailgunemailfrom="alert@example.com" diff --git a/lgsm/config-default/config-lgsm/momserver/_default.cfg b/lgsm/config-default/config-lgsm/momserver/_default.cfg index f9a7a62f6..02640a7d3 100644 --- a/lgsm/config-default/config-lgsm/momserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/momserver/_default.cfg @@ -54,6 +54,7 @@ iftttevent="linuxgsm_alert" # Mailgun Email Alerts | https://docs.linuxgsm.com/alerts/mailgun mailgunalert="off" +mailgunapiregion="us" mailguntoken="accesstoken" mailgundomain="example.com" mailgunemailfrom="alert@example.com" diff --git a/lgsm/config-default/config-lgsm/mtaserver/_default.cfg b/lgsm/config-default/config-lgsm/mtaserver/_default.cfg index f5ecdb63a..b1c739510 100644 --- a/lgsm/config-default/config-lgsm/mtaserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/mtaserver/_default.cfg @@ -52,6 +52,7 @@ iftttevent="linuxgsm_alert" # Mailgun Email Alerts | https://docs.linuxgsm.com/alerts/mailgun mailgunalert="off" +mailgunapiregion="us" mailguntoken="accesstoken" mailgundomain="example.com" mailgunemailfrom="alert@example.com" diff --git a/lgsm/config-default/config-lgsm/mumbleserver/_default.cfg b/lgsm/config-default/config-lgsm/mumbleserver/_default.cfg index 5431a903b..b0c105385 100644 --- a/lgsm/config-default/config-lgsm/mumbleserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/mumbleserver/_default.cfg @@ -48,6 +48,7 @@ iftttevent="linuxgsm_alert" # Mailgun Email Alerts | https://docs.linuxgsm.com/alerts/mailgun mailgunalert="off" +mailgunapiregion="us" mailguntoken="accesstoken" mailgundomain="example.com" mailgunemailfrom="alert@example.com" diff --git a/lgsm/config-default/config-lgsm/ndserver/_default.cfg b/lgsm/config-default/config-lgsm/ndserver/_default.cfg index e72274c04..52c7c9490 100644 --- a/lgsm/config-default/config-lgsm/ndserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/ndserver/_default.cfg @@ -56,6 +56,7 @@ iftttevent="linuxgsm_alert" # Mailgun Email Alerts | https://docs.linuxgsm.com/alerts/mailgun mailgunalert="off" +mailgunapiregion="us" mailguntoken="accesstoken" mailgundomain="example.com" mailgunemailfrom="alert@example.com" diff --git a/lgsm/config-default/config-lgsm/nmrihserver/_default.cfg b/lgsm/config-default/config-lgsm/nmrihserver/_default.cfg index a14969949..c3a60a36e 100644 --- a/lgsm/config-default/config-lgsm/nmrihserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/nmrihserver/_default.cfg @@ -61,6 +61,7 @@ iftttevent="linuxgsm_alert" # Mailgun Email Alerts | https://docs.linuxgsm.com/alerts/mailgun mailgunalert="off" +mailgunapiregion="us" mailguntoken="accesstoken" mailgundomain="example.com" mailgunemailfrom="alert@example.com" diff --git a/lgsm/config-default/config-lgsm/ns2cserver/_default.cfg b/lgsm/config-default/config-lgsm/ns2cserver/_default.cfg index 90b1e90f2..3d6490232 100644 --- a/lgsm/config-default/config-lgsm/ns2cserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/ns2cserver/_default.cfg @@ -63,6 +63,7 @@ iftttevent="linuxgsm_alert" # Mailgun Email Alerts | https://docs.linuxgsm.com/alerts/mailgun mailgunalert="off" +mailgunapiregion="us" mailguntoken="accesstoken" mailgundomain="example.com" mailgunemailfrom="alert@example.com" diff --git a/lgsm/config-default/config-lgsm/ns2server/_default.cfg b/lgsm/config-default/config-lgsm/ns2server/_default.cfg index 5ae21561b..187ae85d9 100644 --- a/lgsm/config-default/config-lgsm/ns2server/_default.cfg +++ b/lgsm/config-default/config-lgsm/ns2server/_default.cfg @@ -67,6 +67,7 @@ iftttevent="linuxgsm_alert" # Mailgun Email Alerts | https://docs.linuxgsm.com/alerts/mailgun mailgunalert="off" +mailgunapiregion="us" mailguntoken="accesstoken" mailgundomain="example.com" mailgunemailfrom="alert@example.com" diff --git a/lgsm/config-default/config-lgsm/nsserver/_default.cfg b/lgsm/config-default/config-lgsm/nsserver/_default.cfg index c5f85d986..909817bd2 100644 --- a/lgsm/config-default/config-lgsm/nsserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/nsserver/_default.cfg @@ -55,6 +55,7 @@ iftttevent="linuxgsm_alert" # Mailgun Email Alerts | https://docs.linuxgsm.com/alerts/mailgun mailgunalert="off" +mailgunapiregion="us" mailguntoken="accesstoken" mailgundomain="example.com" mailgunemailfrom="alert@example.com" diff --git a/lgsm/config-default/config-lgsm/onsetserver/_default.cfg b/lgsm/config-default/config-lgsm/onsetserver/_default.cfg index 7e3a72dbd..5815e70a7 100644 --- a/lgsm/config-default/config-lgsm/onsetserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/onsetserver/_default.cfg @@ -48,6 +48,7 @@ iftttevent="linuxgsm_alert" # Mailgun Email Alerts | https://docs.linuxgsm.com/alerts/mailgun mailgunalert="off" +mailgunapiregion="us" mailguntoken="accesstoken" mailgundomain="example.com" mailgunemailfrom="alert@example.com" diff --git a/lgsm/config-default/config-lgsm/opforserver/_default.cfg b/lgsm/config-default/config-lgsm/opforserver/_default.cfg index 54643ff56..67b28e43d 100644 --- a/lgsm/config-default/config-lgsm/opforserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/opforserver/_default.cfg @@ -55,6 +55,7 @@ iftttevent="linuxgsm_alert" # Mailgun Email Alerts | https://docs.linuxgsm.com/alerts/mailgun mailgunalert="off" +mailgunapiregion="us" mailguntoken="accesstoken" mailgundomain="example.com" mailgunemailfrom="alert@example.com" diff --git a/lgsm/config-default/config-lgsm/pcserver/_default.cfg b/lgsm/config-default/config-lgsm/pcserver/_default.cfg index 440234e76..b5fba3b56 100644 --- a/lgsm/config-default/config-lgsm/pcserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/pcserver/_default.cfg @@ -48,6 +48,7 @@ iftttevent="linuxgsm_alert" # Mailgun Email Alerts | https://docs.linuxgsm.com/alerts/mailgun mailgunalert="off" +mailgunapiregion="us" mailguntoken="accesstoken" mailgundomain="example.com" mailgunemailfrom="alert@example.com" diff --git a/lgsm/config-default/config-lgsm/pstbsserver/_default.cfg b/lgsm/config-default/config-lgsm/pstbsserver/_default.cfg index 6985ef4b0..4d57c9923 100644 --- a/lgsm/config-default/config-lgsm/pstbsserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/pstbsserver/_default.cfg @@ -58,6 +58,7 @@ iftttevent="linuxgsm_alert" # Mailgun Email Alerts | https://docs.linuxgsm.com/alerts/mailgun mailgunalert="off" +mailgunapiregion="us" mailguntoken="accesstoken" mailgundomain="example.com" mailgunemailfrom="alert@example.com" diff --git a/lgsm/config-default/config-lgsm/pvkiiserver/_default.cfg b/lgsm/config-default/config-lgsm/pvkiiserver/_default.cfg index 13611f4bc..db4762421 100644 --- a/lgsm/config-default/config-lgsm/pvkiiserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/pvkiiserver/_default.cfg @@ -56,6 +56,7 @@ iftttevent="linuxgsm_alert" # Mailgun Email Alerts | https://docs.linuxgsm.com/alerts/mailgun mailgunalert="off" +mailgunapiregion="us" mailguntoken="accesstoken" mailgundomain="example.com" mailgunemailfrom="alert@example.com" diff --git a/lgsm/config-default/config-lgsm/pzserver/_default.cfg b/lgsm/config-default/config-lgsm/pzserver/_default.cfg index 5b24bc4a5..7bf604b06 100644 --- a/lgsm/config-default/config-lgsm/pzserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/pzserver/_default.cfg @@ -52,6 +52,7 @@ iftttevent="linuxgsm_alert" # Mailgun Email Alerts | https://docs.linuxgsm.com/alerts/mailgun mailgunalert="off" +mailgunapiregion="us" mailguntoken="accesstoken" mailgundomain="example.com" mailgunemailfrom="alert@example.com" diff --git a/lgsm/config-default/config-lgsm/q2server/_default.cfg b/lgsm/config-default/config-lgsm/q2server/_default.cfg index 58005339c..b86447af3 100644 --- a/lgsm/config-default/config-lgsm/q2server/_default.cfg +++ b/lgsm/config-default/config-lgsm/q2server/_default.cfg @@ -53,6 +53,7 @@ iftttevent="linuxgsm_alert" # Mailgun Email Alerts | https://docs.linuxgsm.com/alerts/mailgun mailgunalert="off" +mailgunapiregion="us" mailguntoken="accesstoken" mailgundomain="example.com" mailgunemailfrom="alert@example.com" diff --git a/lgsm/config-default/config-lgsm/q3server/_default.cfg b/lgsm/config-default/config-lgsm/q3server/_default.cfg index d928cf7b9..065558109 100644 --- a/lgsm/config-default/config-lgsm/q3server/_default.cfg +++ b/lgsm/config-default/config-lgsm/q3server/_default.cfg @@ -53,6 +53,7 @@ iftttevent="linuxgsm_alert" # Mailgun Email Alerts | https://docs.linuxgsm.com/alerts/mailgun mailgunalert="off" +mailgunapiregion="us" mailguntoken="accesstoken" mailgundomain="example.com" mailgunemailfrom="alert@example.com" diff --git a/lgsm/config-default/config-lgsm/qlserver/_default.cfg b/lgsm/config-default/config-lgsm/qlserver/_default.cfg index 5dc643980..c4cd8671f 100644 --- a/lgsm/config-default/config-lgsm/qlserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/qlserver/_default.cfg @@ -48,6 +48,7 @@ iftttevent="linuxgsm_alert" # Mailgun Email Alerts | https://docs.linuxgsm.com/alerts/mailgun mailgunalert="off" +mailgunapiregion="us" mailguntoken="accesstoken" mailgundomain="example.com" mailgunemailfrom="alert@example.com" diff --git a/lgsm/config-default/config-lgsm/qwserver/_default.cfg b/lgsm/config-default/config-lgsm/qwserver/_default.cfg index e751679ba..7835e2a2c 100644 --- a/lgsm/config-default/config-lgsm/qwserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/qwserver/_default.cfg @@ -52,6 +52,7 @@ iftttevent="linuxgsm_alert" # Mailgun Email Alerts | https://docs.linuxgsm.com/alerts/mailgun mailgunalert="off" +mailgunapiregion="us" mailguntoken="accesstoken" mailgundomain="example.com" mailgunemailfrom="alert@example.com" diff --git a/lgsm/config-default/config-lgsm/ricochetserver/_default.cfg b/lgsm/config-default/config-lgsm/ricochetserver/_default.cfg index f8bfc9549..d640c1cec 100644 --- a/lgsm/config-default/config-lgsm/ricochetserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/ricochetserver/_default.cfg @@ -55,6 +55,7 @@ iftttevent="linuxgsm_alert" # Mailgun Email Alerts | https://docs.linuxgsm.com/alerts/mailgun mailgunalert="off" +mailgunapiregion="us" mailguntoken="accesstoken" mailgundomain="example.com" mailgunemailfrom="alert@example.com" diff --git a/lgsm/config-default/config-lgsm/roserver/_default.cfg b/lgsm/config-default/config-lgsm/roserver/_default.cfg index a296c4e74..c60b0317d 100644 --- a/lgsm/config-default/config-lgsm/roserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/roserver/_default.cfg @@ -56,6 +56,7 @@ iftttevent="linuxgsm_alert" # Mailgun Email Alerts | https://docs.linuxgsm.com/alerts/mailgun mailgunalert="off" +mailgunapiregion="us" mailguntoken="accesstoken" mailgundomain="example.com" mailgunemailfrom="alert@example.com" diff --git a/lgsm/config-default/config-lgsm/rtcwserver/_default.cfg b/lgsm/config-default/config-lgsm/rtcwserver/_default.cfg index 797a345f7..ca9ab10ee 100644 --- a/lgsm/config-default/config-lgsm/rtcwserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/rtcwserver/_default.cfg @@ -53,6 +53,7 @@ iftttevent="linuxgsm_alert" # Mailgun Email Alerts | https://docs.linuxgsm.com/alerts/mailgun mailgunalert="off" +mailgunapiregion="us" mailguntoken="accesstoken" mailgundomain="example.com" mailgunemailfrom="alert@example.com" diff --git a/lgsm/config-default/config-lgsm/rustserver/_default.cfg b/lgsm/config-default/config-lgsm/rustserver/_default.cfg index 3312db810..f75a1f614 100644 --- a/lgsm/config-default/config-lgsm/rustserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/rustserver/_default.cfg @@ -63,6 +63,7 @@ iftttevent="linuxgsm_alert" # Mailgun Email Alerts | https://docs.linuxgsm.com/alerts/mailgun mailgunalert="off" +mailgunapiregion="us" mailguntoken="accesstoken" mailgundomain="example.com" mailgunemailfrom="alert@example.com" diff --git a/lgsm/config-default/config-lgsm/rwserver/_default.cfg b/lgsm/config-default/config-lgsm/rwserver/_default.cfg index 574ed88e6..ebdf0d691 100644 --- a/lgsm/config-default/config-lgsm/rwserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/rwserver/_default.cfg @@ -51,6 +51,7 @@ iftttevent="linuxgsm_alert" # Mailgun Email Alerts | https://docs.linuxgsm.com/alerts/mailgun mailgunalert="off" +mailgunapiregion="us" mailguntoken="accesstoken" mailgundomain="example.com" mailgunemailfrom="alert@example.com" diff --git a/lgsm/config-default/config-lgsm/sampserver/_default.cfg b/lgsm/config-default/config-lgsm/sampserver/_default.cfg index 82f1c5651..057f42776 100644 --- a/lgsm/config-default/config-lgsm/sampserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/sampserver/_default.cfg @@ -52,6 +52,7 @@ iftttevent="linuxgsm_alert" # Mailgun Email Alerts | https://docs.linuxgsm.com/alerts/mailgun mailgunalert="off" +mailgunapiregion="us" mailguntoken="accesstoken" mailgundomain="example.com" mailgunemailfrom="alert@example.com" diff --git a/lgsm/config-default/config-lgsm/sbotsserver/_default.cfg b/lgsm/config-default/config-lgsm/sbotsserver/_default.cfg index 6e465fe5d..edbbe9905 100644 --- a/lgsm/config-default/config-lgsm/sbotsserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/sbotsserver/_default.cfg @@ -56,6 +56,7 @@ iftttevent="linuxgsm_alert" # Mailgun Email Alerts | https://docs.linuxgsm.com/alerts/mailgun mailgunalert="off" +mailgunapiregion="us" mailguntoken="accesstoken" mailgundomain="example.com" mailgunemailfrom="alert@example.com" diff --git a/lgsm/config-default/config-lgsm/sbserver/_default.cfg b/lgsm/config-default/config-lgsm/sbserver/_default.cfg index 3cc0f90f5..f96d8e29b 100644 --- a/lgsm/config-default/config-lgsm/sbserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/sbserver/_default.cfg @@ -55,6 +55,7 @@ iftttevent="linuxgsm_alert" # Mailgun Email Alerts | https://docs.linuxgsm.com/alerts/mailgun mailgunalert="off" +mailgunapiregion="us" mailguntoken="accesstoken" mailgundomain="example.com" mailgunemailfrom="alert@example.com" diff --git a/lgsm/config-default/config-lgsm/sdtdserver/_default.cfg b/lgsm/config-default/config-lgsm/sdtdserver/_default.cfg index 4f3289cca..9818387f2 100644 --- a/lgsm/config-default/config-lgsm/sdtdserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/sdtdserver/_default.cfg @@ -51,6 +51,7 @@ iftttevent="linuxgsm_alert" # Mailgun Email Alerts | https://docs.linuxgsm.com/alerts/mailgun mailgunalert="off" +mailgunapiregion="us" mailguntoken="accesstoken" mailgundomain="example.com" mailgunemailfrom="alert@example.com" diff --git a/lgsm/config-default/config-lgsm/sfcserver/_default.cfg b/lgsm/config-default/config-lgsm/sfcserver/_default.cfg index 20e47430c..aa3a386a8 100644 --- a/lgsm/config-default/config-lgsm/sfcserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/sfcserver/_default.cfg @@ -56,6 +56,7 @@ iftttevent="linuxgsm_alert" # Mailgun Email Alerts | https://docs.linuxgsm.com/alerts/mailgun mailgunalert="off" +mailgunapiregion="us" mailguntoken="accesstoken" mailgundomain="example.com" mailgunemailfrom="alert@example.com" diff --git a/lgsm/config-default/config-lgsm/sof2server/_default.cfg b/lgsm/config-default/config-lgsm/sof2server/_default.cfg index 68dd7104a..572933cef 100644 --- a/lgsm/config-default/config-lgsm/sof2server/_default.cfg +++ b/lgsm/config-default/config-lgsm/sof2server/_default.cfg @@ -53,6 +53,7 @@ iftttevent="linuxgsm_alert" # Mailgun Email Alerts | https://docs.linuxgsm.com/alerts/mailgun mailgunalert="off" +mailgunapiregion="us" mailguntoken="accesstoken" mailgundomain="example.com" mailgunemailfrom="alert@example.com" diff --git a/lgsm/config-default/config-lgsm/solserver/_default.cfg b/lgsm/config-default/config-lgsm/solserver/_default.cfg index 7b1164ca4..c543c49fb 100644 --- a/lgsm/config-default/config-lgsm/solserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/solserver/_default.cfg @@ -52,6 +52,7 @@ iftttevent="linuxgsm_alert" # Mailgun Email Alerts | https://docs.linuxgsm.com/alerts/mailgun mailgunalert="off" +mailgunapiregion="us" mailguntoken="accesstoken" mailgundomain="example.com" mailgunemailfrom="alert@example.com" diff --git a/lgsm/config-default/config-lgsm/squadserver/_default.cfg b/lgsm/config-default/config-lgsm/squadserver/_default.cfg index 40a7bf5d6..284f1094d 100644 --- a/lgsm/config-default/config-lgsm/squadserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/squadserver/_default.cfg @@ -53,6 +53,7 @@ iftttevent="linuxgsm_alert" # Mailgun Email Alerts | https://docs.linuxgsm.com/alerts/mailgun mailgunalert="off" +mailgunapiregion="us" mailguntoken="accesstoken" mailgundomain="example.com" mailgunemailfrom="alert@example.com" diff --git a/lgsm/config-default/config-lgsm/ss3server/_default.cfg b/lgsm/config-default/config-lgsm/ss3server/_default.cfg index 18f83c6b4..87f5d2eb3 100644 --- a/lgsm/config-default/config-lgsm/ss3server/_default.cfg +++ b/lgsm/config-default/config-lgsm/ss3server/_default.cfg @@ -52,6 +52,7 @@ iftttevent="linuxgsm_alert" # Mailgun Email Alerts | https://docs.linuxgsm.com/alerts/mailgun mailgunalert="off" +mailgunapiregion="us" mailguntoken="accesstoken" mailgundomain="example.com" mailgunemailfrom="alert@example.com" diff --git a/lgsm/config-default/config-lgsm/stserver/_default.cfg b/lgsm/config-default/config-lgsm/stserver/_default.cfg index 8a52dc51f..bed1f3477 100644 --- a/lgsm/config-default/config-lgsm/stserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/stserver/_default.cfg @@ -58,6 +58,7 @@ iftttevent="linuxgsm_alert" # Mailgun Email Alerts | https://docs.linuxgsm.com/alerts/mailgun mailgunalert="off" +mailgunapiregion="us" mailguntoken="accesstoken" mailgundomain="example.com" mailgunemailfrom="alert@example.com" diff --git a/lgsm/config-default/config-lgsm/svenserver/_default.cfg b/lgsm/config-default/config-lgsm/svenserver/_default.cfg index 9737d5804..e469e9c8b 100644 --- a/lgsm/config-default/config-lgsm/svenserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/svenserver/_default.cfg @@ -55,6 +55,7 @@ iftttevent="linuxgsm_alert" # Mailgun Email Alerts | https://docs.linuxgsm.com/alerts/mailgun mailgunalert="off" +mailgunapiregion="us" mailguntoken="accesstoken" mailgundomain="example.com" mailgunemailfrom="alert@example.com" diff --git a/lgsm/config-default/config-lgsm/terrariaserver/_default.cfg b/lgsm/config-default/config-lgsm/terrariaserver/_default.cfg index 19e71bda5..015a117c5 100644 --- a/lgsm/config-default/config-lgsm/terrariaserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/terrariaserver/_default.cfg @@ -55,6 +55,7 @@ iftttevent="linuxgsm_alert" # Mailgun Email Alerts | https://docs.linuxgsm.com/alerts/mailgun mailgunalert="off" +mailgunapiregion="us" mailguntoken="accesstoken" mailgundomain="example.com" mailgunemailfrom="alert@example.com" diff --git a/lgsm/config-default/config-lgsm/tf2server/_default.cfg b/lgsm/config-default/config-lgsm/tf2server/_default.cfg index a017a3dbf..19df009cc 100644 --- a/lgsm/config-default/config-lgsm/tf2server/_default.cfg +++ b/lgsm/config-default/config-lgsm/tf2server/_default.cfg @@ -61,6 +61,7 @@ iftttevent="linuxgsm_alert" # Mailgun Email Alerts | https://docs.linuxgsm.com/alerts/mailgun mailgunalert="off" +mailgunapiregion="us" mailguntoken="accesstoken" mailgundomain="example.com" mailgunemailfrom="alert@example.com" diff --git a/lgsm/config-default/config-lgsm/tfcserver/_default.cfg b/lgsm/config-default/config-lgsm/tfcserver/_default.cfg index ecc614b98..0d8697c45 100644 --- a/lgsm/config-default/config-lgsm/tfcserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/tfcserver/_default.cfg @@ -55,6 +55,7 @@ iftttevent="linuxgsm_alert" # Mailgun Email Alerts | https://docs.linuxgsm.com/alerts/mailgun mailgunalert="off" +mailgunapiregion="us" mailguntoken="accesstoken" mailgundomain="example.com" mailgunemailfrom="alert@example.com" diff --git a/lgsm/config-default/config-lgsm/ts3server/_default.cfg b/lgsm/config-default/config-lgsm/ts3server/_default.cfg index 71952c0d9..4c83b6146 100644 --- a/lgsm/config-default/config-lgsm/ts3server/_default.cfg +++ b/lgsm/config-default/config-lgsm/ts3server/_default.cfg @@ -48,6 +48,7 @@ iftttevent="linuxgsm_alert" # Mailgun Email Alerts | https://docs.linuxgsm.com/alerts/mailgun mailgunalert="off" +mailgunapiregion="us" mailguntoken="accesstoken" mailgundomain="example.com" mailgunemailfrom="alert@example.com" diff --git a/lgsm/config-default/config-lgsm/tsserver/_default.cfg b/lgsm/config-default/config-lgsm/tsserver/_default.cfg index 4e44830d3..d02b649d4 100644 --- a/lgsm/config-default/config-lgsm/tsserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/tsserver/_default.cfg @@ -55,6 +55,7 @@ iftttevent="linuxgsm_alert" # Mailgun Email Alerts | https://docs.linuxgsm.com/alerts/mailgun mailgunalert="off" +mailgunapiregion="us" mailguntoken="accesstoken" mailgundomain="example.com" mailgunemailfrom="alert@example.com" diff --git a/lgsm/config-default/config-lgsm/tuserver/_default.cfg b/lgsm/config-default/config-lgsm/tuserver/_default.cfg index accdfd52a..f93e99607 100644 --- a/lgsm/config-default/config-lgsm/tuserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/tuserver/_default.cfg @@ -58,6 +58,7 @@ iftttevent="linuxgsm_alert" # Mailgun Email Alerts | https://docs.linuxgsm.com/alerts/mailgun mailgunalert="off" +mailgunapiregion="us" mailguntoken="accesstoken" mailgundomain="example.com" mailgunemailfrom="alert@example.com" diff --git a/lgsm/config-default/config-lgsm/twserver/_default.cfg b/lgsm/config-default/config-lgsm/twserver/_default.cfg index a5c0feb40..5f907e86a 100644 --- a/lgsm/config-default/config-lgsm/twserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/twserver/_default.cfg @@ -55,6 +55,7 @@ iftttevent="linuxgsm_alert" # Mailgun Email Alerts | https://docs.linuxgsm.com/alerts/mailgun mailgunalert="off" +mailgunapiregion="us" mailguntoken="accesstoken" mailgundomain="example.com" mailgunemailfrom="alert@example.com" diff --git a/lgsm/config-default/config-lgsm/untserver/_default.cfg b/lgsm/config-default/config-lgsm/untserver/_default.cfg index 27a952695..0137f19d3 100644 --- a/lgsm/config-default/config-lgsm/untserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/untserver/_default.cfg @@ -54,6 +54,7 @@ iftttevent="linuxgsm_alert" # Mailgun Email Alerts | https://docs.linuxgsm.com/alerts/mailgun mailgunalert="off" +mailgunapiregion="us" mailguntoken="accesstoken" mailgundomain="example.com" mailgunemailfrom="alert@example.com" diff --git a/lgsm/config-default/config-lgsm/ut2k4server/_default.cfg b/lgsm/config-default/config-lgsm/ut2k4server/_default.cfg index e0cb639b8..01407b510 100644 --- a/lgsm/config-default/config-lgsm/ut2k4server/_default.cfg +++ b/lgsm/config-default/config-lgsm/ut2k4server/_default.cfg @@ -52,6 +52,7 @@ iftttevent="linuxgsm_alert" # Mailgun Email Alerts | https://docs.linuxgsm.com/alerts/mailgun mailgunalert="off" +mailgunapiregion="us" mailguntoken="accesstoken" mailgundomain="example.com" mailgunemailfrom="alert@example.com" diff --git a/lgsm/config-default/config-lgsm/ut3server/_default.cfg b/lgsm/config-default/config-lgsm/ut3server/_default.cfg index 7b992dc6f..bdebcfdbb 100644 --- a/lgsm/config-default/config-lgsm/ut3server/_default.cfg +++ b/lgsm/config-default/config-lgsm/ut3server/_default.cfg @@ -68,6 +68,7 @@ iftttevent="linuxgsm_alert" # Mailgun Email Alerts | https://docs.linuxgsm.com/alerts/mailgun mailgunalert="off" +mailgunapiregion="us" mailguntoken="accesstoken" mailgundomain="example.com" mailgunemailfrom="alert@example.com" diff --git a/lgsm/config-default/config-lgsm/ut99server/_default.cfg b/lgsm/config-default/config-lgsm/ut99server/_default.cfg index e2483283b..901b02d22 100644 --- a/lgsm/config-default/config-lgsm/ut99server/_default.cfg +++ b/lgsm/config-default/config-lgsm/ut99server/_default.cfg @@ -52,6 +52,7 @@ iftttevent="linuxgsm_alert" # Mailgun Email Alerts | https://docs.linuxgsm.com/alerts/mailgun mailgunalert="off" +mailgunapiregion="us" mailguntoken="accesstoken" mailgundomain="example.com" mailgunemailfrom="alert@example.com" diff --git a/lgsm/config-default/config-lgsm/utserver/_default.cfg b/lgsm/config-default/config-lgsm/utserver/_default.cfg index 6f5778f95..45d6e1c32 100644 --- a/lgsm/config-default/config-lgsm/utserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/utserver/_default.cfg @@ -56,6 +56,7 @@ iftttevent="linuxgsm_alert" # Mailgun Email Alerts | https://docs.linuxgsm.com/alerts/mailgun mailgunalert="off" +mailgunapiregion="us" mailguntoken="accesstoken" mailgundomain="example.com" mailgunemailfrom="alert@example.com" diff --git a/lgsm/config-default/config-lgsm/vsserver/_default.cfg b/lgsm/config-default/config-lgsm/vsserver/_default.cfg index 5c106befe..2228e8cbb 100644 --- a/lgsm/config-default/config-lgsm/vsserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/vsserver/_default.cfg @@ -55,6 +55,7 @@ iftttevent="linuxgsm_alert" # Mailgun Email Alerts | https://docs.linuxgsm.com/alerts/mailgun mailgunalert="off" +mailgunapiregion="us" mailguntoken="accesstoken" mailgundomain="example.com" mailgunemailfrom="alert@example.com" diff --git a/lgsm/config-default/config-lgsm/wetserver/_default.cfg b/lgsm/config-default/config-lgsm/wetserver/_default.cfg index 9c49e9ff6..63c5e49db 100644 --- a/lgsm/config-default/config-lgsm/wetserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/wetserver/_default.cfg @@ -48,6 +48,7 @@ iftttevent="linuxgsm_alert" # Mailgun Email Alerts | https://docs.linuxgsm.com/alerts/mailgun mailgunalert="off" +mailgunapiregion="us" mailguntoken="accesstoken" mailgundomain="example.com" mailgunemailfrom="alert@example.com" diff --git a/lgsm/config-default/config-lgsm/wfserver/_default.cfg b/lgsm/config-default/config-lgsm/wfserver/_default.cfg index 2d7991ffd..7a09021f6 100644 --- a/lgsm/config-default/config-lgsm/wfserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/wfserver/_default.cfg @@ -53,6 +53,7 @@ iftttevent="linuxgsm_alert" # Mailgun Email Alerts | https://docs.linuxgsm.com/alerts/mailgun mailgunalert="off" +mailgunapiregion="us" mailguntoken="accesstoken" mailgundomain="example.com" mailgunemailfrom="alert@example.com" diff --git a/lgsm/config-default/config-lgsm/wurmserver/_default.cfg b/lgsm/config-default/config-lgsm/wurmserver/_default.cfg index 66c1b6494..61a68a70b 100644 --- a/lgsm/config-default/config-lgsm/wurmserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/wurmserver/_default.cfg @@ -50,6 +50,7 @@ iftttevent="linuxgsm_alert" # Mailgun Email Alerts | https://docs.linuxgsm.com/alerts/mailgun mailgunalert="off" +mailgunapiregion="us" mailguntoken="accesstoken" mailgundomain="example.com" mailgunemailfrom="alert@example.com" diff --git a/lgsm/config-default/config-lgsm/zmrserver/_default.cfg b/lgsm/config-default/config-lgsm/zmrserver/_default.cfg index 3a9192b1d..8e9a09505 100644 --- a/lgsm/config-default/config-lgsm/zmrserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/zmrserver/_default.cfg @@ -56,6 +56,7 @@ iftttevent="linuxgsm_alert" # Mailgun Email Alerts | https://docs.linuxgsm.com/alerts/mailgun mailgunalert="off" +mailgunapiregion="us" mailguntoken="accesstoken" mailgundomain="example.com" mailgunemailfrom="alert@example.com" diff --git a/lgsm/config-default/config-lgsm/zpsserver/_default.cfg b/lgsm/config-default/config-lgsm/zpsserver/_default.cfg index 61f538247..a4f71fcb8 100644 --- a/lgsm/config-default/config-lgsm/zpsserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/zpsserver/_default.cfg @@ -61,6 +61,7 @@ iftttevent="linuxgsm_alert" # Mailgun Email Alerts | https://docs.linuxgsm.com/alerts/mailgun mailgunalert="off" +mailgunapiregion="us" mailguntoken="accesstoken" mailgundomain="example.com" mailgunemailfrom="alert@example.com" diff --git a/lgsm/functions/alert_mailgun.sh b/lgsm/functions/alert_mailgun.sh index 19314679a..0c5aef4b6 100644 --- a/lgsm/functions/alert_mailgun.sh +++ b/lgsm/functions/alert_mailgun.sh @@ -6,6 +6,12 @@ functionselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" +if [ "${mailgunapiregion}" == "eu" ]; then + mailgunapiurl="https://api.eu.mailgun.net" +else + mailgunapiurl="https://api.mailgun.net" +fi + fn_print_dots "Sending Email alert: Mailgun: ${email}" mailgunsend=$(curl -s --user "api:${mailguntoken}" \ @@ -14,7 +20,7 @@ mailgunsend=$(curl -s --user "api:${mailguntoken}" \ -F subject="${alertemoji} ${alertsubject} ${alertemoji}" \ -F o:tag='alert' \ -F o:tag='LinuxGSM' \ --F text="$(cat "${alertlog}")" "https://api.mailgun.net/v3/${mailgundomain}/messages") +-F text="$(cat "${alertlog}")" "${mailgunapiurl}/v3/${mailgundomain}/messages") if [ -z "${mailgunsend}" ]; then fn_print_fail_nl "Sending Email alert: Mailgun: ${email}" From 9e7ce431b207ab921a5f154fbf5997768fe92e3a Mon Sep 17 00:00:00 2001 From: Christian Date: Tue, 15 Sep 2020 09:55:49 +0200 Subject: [PATCH 458/534] fix(squad): move systemdir to new location (#3036) --- .../config-lgsm/squadserver/_default.cfg | 2 +- lgsm/functions/core_functions.sh | 5 ++++ lgsm/functions/fix.sh | 2 ++ lgsm/functions/fix_squad.sh | 23 +++++++++++++++++++ 4 files changed, 31 insertions(+), 1 deletion(-) create mode 100644 lgsm/functions/fix_squad.sh diff --git a/lgsm/config-default/config-lgsm/squadserver/_default.cfg b/lgsm/config-default/config-lgsm/squadserver/_default.cfg index 284f1094d..14e5862a3 100644 --- a/lgsm/config-default/config-lgsm/squadserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/squadserver/_default.cfg @@ -152,7 +152,7 @@ glibc="2.17" # Edit with care ## Game Server Directories -systemdir="${serverfiles}/Squad" +systemdir="${serverfiles}/SquadGame" executabledir="${serverfiles}" executable="./SquadGameServer.sh" servercfgdir="${systemdir}/ServerConfig" diff --git a/lgsm/functions/core_functions.sh b/lgsm/functions/core_functions.sh index 9b79fae06..081626065 100644 --- a/lgsm/functions/core_functions.sh +++ b/lgsm/functions/core_functions.sh @@ -450,6 +450,11 @@ functionfile="${FUNCNAME[0]}" fn_fetch_function } +fix_squad.sh(){ +functionfile="${FUNCNAME[0]}" +fn_fetch_function +} + fix_ss3.sh(){ functionfile="${FUNCNAME[0]}" fn_fetch_function diff --git a/lgsm/functions/fix.sh b/lgsm/functions/fix.sh index 9c773523a..9d970064b 100644 --- a/lgsm/functions/fix.sh +++ b/lgsm/functions/fix.sh @@ -70,6 +70,8 @@ if [ "${commandname}" != "INSTALL" ]&&[ -z "${fixbypass}" ]; then fix_sfc.sh elif [ "${shortname}" == "sof2" ]; then fix_sof2.sh + elif [ "${shortname}" == "squad" ]; then + fix_squad.sh elif [ "${shortname}" == "ss3" ]; then fix_ss3.sh elif [ "${shortname}" == "tf2" ]; then diff --git a/lgsm/functions/fix_squad.sh b/lgsm/functions/fix_squad.sh new file mode 100644 index 000000000..199070af0 --- /dev/null +++ b/lgsm/functions/fix_squad.sh @@ -0,0 +1,23 @@ +#!/bin/bash +# LinuxGSM fix_squad.sh function +# Author: Christian Birk +# Website: https://linuxgsm.com +# Description: Resolves various issues with Squad. + +# As the server base dir changed for the game, we need to migrate the default config from the old to the new location +oldservercfg="${serverfiles}/Squad/ServerConfig/${servercfg}" +if [ -f "${oldservercfg}" ] && [ -f "${servercfgfullpath}" ]; then + # diff old and new config - if it is different move the old config over the new one + if [ $(diff -c "${oldservercfg}" "${servercfgfullpath}" | wc -l) -gt 0 ]; then + fixname="Migrate server config to new Game folder" + fn_fix_msg_start + mv -v "${oldservercfg}" "${servercfgfullpath}" + fn_fix_msg_end + else + fixname="remove the same config from old configdir" + fn_fix_msg_start + rm -f "${oldservercfg}" + fn_fix_msg_end + + fi +fi From a99cc53529abccefc89bae067bf2e896fcc897b8 Mon Sep 17 00:00:00 2001 From: Christian Date: Tue, 15 Sep 2020 09:56:40 +0200 Subject: [PATCH 459/534] fix(mods): change url to new domain for oxide + redo last version fetch (#3037) --- 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 6485faa45..2244a104c 100644 --- a/lgsm/functions/mods_list.sh +++ b/lgsm/functions/mods_list.sh @@ -35,8 +35,8 @@ get5latestfile=$(echo -e "${get5scrapepath}" | xargs -n 1 -I @ sh -c "echo -e "b get5downloadurl="https://ci.splewis.net/job/get5/lastSuccessfulBuild/artifact/${get5scrapepath}" get5url="${get5downloadurl}" # Oxide -oxiderustlatestlink="https://umod.org/games/rust/download/develop" # fix for linux build 06.09.2019 -oxidehurtworldlatestlink=$(curl -sL https://api.github.com/repos/OxideMod/Oxide.Hurtworld/releases/latest | grep browser_download_url | cut -d '"' -f 4 | grep "Oxide.Hurtworld.zip") +oxiderustlatestlink=$(curl -sL https://api.github.com/repos/OxideMod/Oxide.Rust/releases/latest | jq -r '.assets[]|select(.browser_download_url | contains("linux")) | .browser_download_url') +oxidehurtworldlatestlink=$(curl -sL https://api.github.com/repos/OxideMod/Oxide.Hurtworld/releases/latest | jq -r '.assets[].browser_download_url') oxidesdtdlatestlink=$(curl -sL https://api.github.com/repos/OxideMod/Oxide.SevenDaysToDie/releases/latest | jq -r '.assets[]|select(.browser_download_url | contains("linux")) | .browser_download_url' ) # Define mods information (required) @@ -90,9 +90,9 @@ mod_info_darkrpmodification=( MOD "darkrpmodification" "DarkRP Modification" "ht # Oxidemod -mod_info_rustoxide=( MOD "rustoxide" "Oxide for Rust" "${oxiderustlatestlink}" "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" "${oxidehurtworldlatestlink}" "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" "${oxidesdtdlatestlink}" "Oxide.SevenDaysToDie.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" "${oxiderustlatestlink}" "Oxide.Rust-linux.zip" "0" "LowercaseOff" "${systemdir}" "OVERWRITE" "ENGINES" "Rust;" "NOTGAMES" "https://umod.org/games/rust" "Allows for the use of plugins" ) +mod_info_hwoxide=( MOD "hwoxide" "Oxide for Hurtworld" "${oxidehurtworldlatestlink}" "Oxide.Hurtworld.zip" "0" "LowercaseOff" "${systemdir}" "OVERWRITE" "ENGINES" "Hurtworld;" "NOTGAMES" "https://umod.org/games/hurtworld" "Allows for the use of plugins" ) +mod_info_sdtdoxide=( MOD "sdtdoxide" "Oxide for 7 Days To Die" "${oxidesdtdlatestlink}" "Oxide.SevenDaysToDie.zip" "0" "LowercaseOff" "${systemdir}" "OVERWRITE" "ENGINES" "7 Days To Die;" "NOTGAMES" "https://umod.org/games/7-days-to-die" "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_steamworks[@]}" "${mod_info_gokz[@]}" "${mod_info_ttt[@]}" "${mod_info_get5[@]}" "${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_pac3[@]}" "${mod_info_wiremod[@]}" "${mod_info_wiremodextras[@]}" "${mod_info_darkrp[@]}" "${mod_info_darkrpmodification[@]}" "${mod_info_rustoxide[@]}" "${mod_info_hwoxide[@]}" "${mod_info_sdtdoxide[@]}" ) From 1bd8194a6e12ca6a5f8746623f4947fb58f37dfb Mon Sep 17 00:00:00 2001 From: Christian Date: Tue, 15 Sep 2020 21:31:29 +0200 Subject: [PATCH 460/534] fix(sdtdserver): config parsing for the port (#3007) --- 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 4804207aa..2a002f523 100644 --- a/lgsm/functions/info_config.sh +++ b/lgsm/functions/info_config.sh @@ -1247,7 +1247,7 @@ fn_info_config_sdtd(){ 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:]') + port=$(grep "ServerPort" "${servercfgfullpath}" | egrep -o 'value="[0-9]+"' | tr -cd '[:digit:]') queryport=${port:-"0"} webadminenabled=$(grep "ControlPanelEnabled" "${servercfgfullpath}" | sed 's/^.*value="//' | cut -f1 -d"\"") From c205e26faf16ae66c433ac043bee26fd03329325 Mon Sep 17 00:00:00 2001 From: Christian Date: Wed, 16 Sep 2020 00:04:20 +0200 Subject: [PATCH 461/534] fix(untserver): fix steamclient.so issue (#3038) --- lgsm/functions/fix_unt.sh | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/lgsm/functions/fix_unt.sh b/lgsm/functions/fix_unt.sh index 60f3d2edf..eee816bfc 100644 --- a/lgsm/functions/fix_unt.sh +++ b/lgsm/functions/fix_unt.sh @@ -6,5 +6,17 @@ functionselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" +# copy steamclient to server dir to fix the below +if [ ! -f "${serverfiles}/steamclient.so" ]; then + fixname="steamclient.so x86_64" + fn_fix_msg_start + if [ -f "${HOME}/.steam/steamcmd/linux64/steamclient.so" ]; then + cp "${HOME}/.steam/steamcmd/linux64/steamclient.so" "${serverfiles}/steamclient.so" >> "${lgsmlog}" + elif [ -f "${steamcmddir}/linux64/steamclient.so" ]; then + cp "${steamcmddir}/linux64/steamclient.so" "${serverfiles}/steamclient.so" >> "${lgsmlog}" + fi + fn_fix_msg_end +fi + # steamclient.so: cannot open shared object file: No such file or directory -export LD_LIBRARY_PATH="$LD_LIBRARY_PATH:${serverfiles}:${serverfiles}/linux64" +export LD_LIBRARY_PATH="$LD_LIBRARY_PATH:${serverfiles}" From d9690f85a85095b4dddd06d7c0793023733805d8 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Wed, 16 Sep 2020 22:02:46 +0100 Subject: [PATCH 462/534] fix(untserver): remove mono-complete requirement and fix query port (#3039) * mono-complete no longer required for unturned * added query port for unturned --- lgsm/functions/check_deps.sh | 6 ------ lgsm/functions/info_parms.sh | 3 ++- 2 files changed, 2 insertions(+), 7 deletions(-) diff --git a/lgsm/functions/check_deps.sh b/lgsm/functions/check_deps.sh index 3bc89b2e0..3e3990a44 100644 --- a/lgsm/functions/check_deps.sh +++ b/lgsm/functions/check_deps.sh @@ -443,9 +443,6 @@ fn_deps_build_debian(){ # Unreal Tournament elif [ "${shortname}" == "ut" ]; then array_deps_required+=( unzip ) - # Unturned - elif [ "${shortname}" == "unt" ]; then - array_deps_required+=( mono-complete ) # Wurm: Unlimited elif [ "${shortname}" == "wurm" ]; then array_deps_required+=( xvfb ) @@ -555,9 +552,6 @@ fn_deps_build_redhat(){ # Unreal Tournament elif [ "${shortname}" == "ut" ]; then array_deps_required+=( unzip ) - # Unturned - elif [ "${shortname}" == "unt" ]; then - array_deps_required+=( mono-complete ) # Wurm: Unlimited elif [ "${shortname}" == "wurm" ]; then array_deps_required+=( xorg-x11-server-Xvfb ) diff --git a/lgsm/functions/info_parms.sh b/lgsm/functions/info_parms.sh index 809d2cfc6..93df0309f 100644 --- a/lgsm/functions/info_parms.sh +++ b/lgsm/functions/info_parms.sh @@ -220,6 +220,7 @@ fn_info_parms_unreal3(){ fn_info_parms_unturned(){ servername=${selfname:-"NOT SET"} port=${port:-"0"} + queryport=$((port + 1)) } fn_info_parms_ut(){ @@ -250,7 +251,7 @@ elif [ "${shortname}" == "fctr" ]; then elif [ "${shortname}" == "inss" ]; then fn_info_parms_inss elif [ "${shortname}" == "jk2" ]; then - fn_info_parms_jk2 + fn_info_parms_jk2 elif [ "${shortname}" == "kf2" ]; then fn_info_parms_kf2 elif [ "${shortname}" == "mohaa" ]; then From d961b05de3306b7ad49bab3e769208c6337bb897 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Wed, 16 Sep 2020 22:35:36 +0100 Subject: [PATCH 463/534] fix(sdtdserver): fixes to sdtd (#3041) * fix sdtd config handling for the port * add steamclient.so fix to sdtd * removed logfile from parameters to allow console display * steamclient.so bug fix * allow accurate ip to be set for webadminip in most cases * master server query will loop through server ip addresses * more accurate details on telnet IP address * minor tidy up of details web admin and telnet * sdtd does not have an interactive console * correct steamclient.so fix * remove x86 binary as no longer present * more changes to steamclient.so Co-authored-by: H3o66 --- .../config-lgsm/sdtdserver/_default.cfg | 6 +- lgsm/functions/check_ip.sh | 18 ++++- lgsm/functions/command_debug.sh | 2 +- lgsm/functions/fix_cmw.sh | 1 + lgsm/functions/fix_cs.sh | 1 + lgsm/functions/fix_hw.sh | 40 +++++----- lgsm/functions/fix_pz.sh | 10 ++- lgsm/functions/fix_rust.sh | 2 +- lgsm/functions/fix_sdtd.sh | 2 +- lgsm/functions/fix_ss3.sh | 5 +- lgsm/functions/fix_steamcmd.sh | 12 +-- lgsm/functions/fix_tu.sh | 5 +- lgsm/functions/fix_wurm.sh | 5 +- lgsm/functions/info_config.sh | 7 +- lgsm/functions/info_distro.sh | 6 +- lgsm/functions/info_messages.sh | 74 +++++++++---------- 16 files changed, 112 insertions(+), 84 deletions(-) diff --git a/lgsm/config-default/config-lgsm/sdtdserver/_default.cfg b/lgsm/config-default/config-lgsm/sdtdserver/_default.cfg index 9818387f2..ba5d22059 100644 --- a/lgsm/config-default/config-lgsm/sdtdserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/sdtdserver/_default.cfg @@ -13,7 +13,7 @@ ip="0.0.0.0" ## Server Parameters | https://docs.linuxgsm.com/configuration/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}" +parms="-quit -batchmode -nographics -dedicated -configfile=${servercfgfullpath}" } #### LinuxGSM Settings #### @@ -138,7 +138,7 @@ querytype="protocol-valve" ## Console type consoleverbose="yes" -consoleinteract="yes" +consoleinteract="no" ## Game Server Details # Do not edit @@ -152,7 +152,7 @@ glibc="2.15" ## Game Server Directories systemdir="${serverfiles}" executabledir="${serverfiles}" -executable=$([ "$(uname -m)" == "x86_64" ] && echo -e "./7DaysToDieServer.x86_64" || echo -e "./7DaysToDieServer.x86") +executable="./7DaysToDieServer.x86_64" servercfgdir="${systemdir}" servercfg="${selfname}.xml" servercfgdirdefault="${serverfiles}" diff --git a/lgsm/functions/check_ip.sh b/lgsm/functions/check_ip.sh index b953a3125..bf7ea226c 100644 --- a/lgsm/functions/check_ip.sh +++ b/lgsm/functions/check_ip.sh @@ -23,13 +23,25 @@ getipwc=$(${ipcommand} -o -4 addr | awk '{print $4}' | grep -oe '\([0-9]\{1,3\}\ # If the IP variable has been set by user. if [ -n "${ip}" ]&&[ "${ip}" != "0.0.0.0" ]; then queryips=( "${ip}" ) - # If game config does have an IP set. + webadminip=( "${ip}" ) + telnetip=( "${ip}" ) +# If game config does have an IP set. elif [ -n "${configip}" ]&&[ "${configip}" != "0.0.0.0" ];then queryips=( "${configip}" ) ip="${configip}" - # If no ip is set by the user. + webadminip=( "${configip}" ) + telnetip=( "${configip}" ) +# If there is only 1 server IP address. +# Some IP details can automaticly use the one IP +elif [ "${getipwc}" == "1" ]; then + queryips=( $(echo "${getip}") ) + ip="0.0.0.0" + webadminip=( "${getip}" ) + telnetip=( "${getip}" ) +# If no ip is set by the user and server has more than one IP. else queryips=( $(echo "${getip}") ) ip="0.0.0.0" -# If IP has not been set by user. + webadminip=( "${ip}" ) + telnetip=( "${ip}" ) fi diff --git a/lgsm/functions/command_debug.sh b/lgsm/functions/command_debug.sh index a48975d0d..059cf539a 100644 --- a/lgsm/functions/command_debug.sh +++ b/lgsm/functions/command_debug.sh @@ -55,7 +55,7 @@ if [ "${glibc}" ]; then fi # Server IP -server echo -e "${lightblue}Game Server IP:\t${default}${ip}:${port}" +echo -e "${lightblue}Game Server IP:\t${default}${ip}:${port}" # External server IP. if [ "${extip}" ]; then diff --git a/lgsm/functions/fix_cmw.sh b/lgsm/functions/fix_cmw.sh index ac1e3d089..3a463b0b2 100644 --- a/lgsm/functions/fix_cmw.sh +++ b/lgsm/functions/fix_cmw.sh @@ -15,6 +15,7 @@ fi if [ ! -f "${executabledir}/lib/steamclient.so" ]; then fixname="steamclient.so x86" fn_fix_msg_start + mkdir -p "${executabledir}/lib" if [ -f "${HOME}/.steam/steamcmd/linux32/steamclient.so" ]; then cp "${HOME}/.steam/steamcmd/linux32/steamclient.so" "${executabledir}/lib/steamclient.so" elif [ -f "${steamcmddir}/linux32/steamclient.so" ]; then diff --git a/lgsm/functions/fix_cs.sh b/lgsm/functions/fix_cs.sh index 6f1f1eca7..fe18ea9f5 100644 --- a/lgsm/functions/fix_cs.sh +++ b/lgsm/functions/fix_cs.sh @@ -10,6 +10,7 @@ functionselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" if [ ! -f "${serverfiles}/steamclient.so" ]; then fixname="steamclient.so x86" fn_fix_msg_start + mkdir -p "${serverfiles}" if [ -f "${HOME}/.steam/steamcmd/linux32/steamclient.so" ]; then cp "${HOME}/.steam/steamcmd/linux32/steamclient.so" "${serverfiles}/steamclient.so" elif [ -f "${steamcmddir}/linux32/steamclient.so" ]; then diff --git a/lgsm/functions/fix_hw.sh b/lgsm/functions/fix_hw.sh index cccc9d0ed..f888748ca 100644 --- a/lgsm/functions/fix_hw.sh +++ b/lgsm/functions/fix_hw.sh @@ -6,26 +6,26 @@ functionselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" -if [ "${shortname}" == "hw" ]; then - # Fixes: [S_API FAIL] SteamAPI_Init() failed; unable to locate a running instance of Steam, or a local steamclient.so. - if [ ! -f "${serverfiles}/Hurtworld_Data/Plugins/x86/steamclient.so" ]; then - fixname="steamclient.so x86" - fn_fix_msg_start - if [ -f "${HOME}/.steam/steamcmd/linux32/steamclient.so" ]; then - cp "${HOME}/.steam/steamcmd/linux32/steamclient.so" "${serverfiles}/Hurtworld_Data/Plugins/x86/steamclient.so" >> "${lgsmlog}" - elif [ -f "${steamcmddir}/linux32/steamclient.so" ]; then - cp "${steamcmddir}/linux32/steamclient.so" "${serverfiles}/Hurtworld_Data/Plugins/x86/steamclient.so" >> "${lgsmlog}" - fi - fn_fix_msg_end +# Fixes: [S_API FAIL] SteamAPI_Init() failed; unable to locate a running instance of Steam, or a local steamclient.so. +if [ ! -f "${serverfiles}/Hurtworld_Data/Plugins/x86/steamclient.so" ]; then + fixname="steamclient.so x86" + fn_fix_msg_start + mkdir -p "${serverfiles}/Hurtworld_Data/Plugins/x86" + if [ -f "${HOME}/.steam/steamcmd/linux32/steamclient.so" ]; then + cp "${HOME}/.steam/steamcmd/linux32/steamclient.so" "${serverfiles}/Hurtworld_Data/Plugins/x86/steamclient.so" + elif [ -f "${steamcmddir}/linux32/steamclient.so" ]; then + cp "${steamcmddir}/linux32/steamclient.so" "${serverfiles}/Hurtworld_Data/Plugins/x86/steamclient.so" fi - if [ ! -f "${serverfiles}/Hurtworld_Data/Plugins/x86_64/steamclient.so" ]; then - fixname="steamclient.so x86_64" - fn_fix_msg_start - if [ -f "${HOME}/.steam/steamcmd/linux64/steamclient.so" ]; then - cp "${HOME}/.steam/steamcmd/linux64/steamclient.so" "${serverfiles}/Hurtworld_Data/Plugins/x86_64/steamclient.so" >> "${lgsmlog}" - elif [ -f "${steamcmddir}/linux64/steamclient.so" ]; then - cp "${steamcmddir}/linux64/steamclient.so" "${serverfiles}/Hurtworld_Data/Plugins/x86_64/steamclient.so" >> "${lgsmlog}" - fi - fn_fix_msg_end + 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 + mkdir -p "${serverfiles}/Hurtworld_Data/Plugins/x86_64" + if [ -f "${HOME}/.steam/steamcmd/linux64/steamclient.so" ]; then + cp "${HOME}/.steam/steamcmd/linux64/steamclient.so" "${serverfiles}/Hurtworld_Data/Plugins/x86_64/steamclient.so" + elif [ -f "${steamcmddir}/linux64/steamclient.so" ]; then + cp "${steamcmddir}/linux64/steamclient.so" "${serverfiles}/Hurtworld_Data/Plugins/x86_64/steamclient.so" fi + fn_fix_msg_end fi diff --git a/lgsm/functions/fix_pz.sh b/lgsm/functions/fix_pz.sh index c49a624ba..f59116d75 100644 --- a/lgsm/functions/fix_pz.sh +++ b/lgsm/functions/fix_pz.sh @@ -10,10 +10,11 @@ functionselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" if [ ! -f "${serverfiles}/linux32/steamclient.so" ]; then fixname="steamclient.so x86" fn_fix_msg_start + mkdir -p "${serverfiles}/linux32" if [ -f "${HOME}/.steam/steamcmd/linux32/steamclient.so" ]; then - cp "${HOME}/.steam/steamcmd/linux32/steamclient.so" "${serverfiles}/linux32/steamclient.so" >> "${lgsmlog}" + cp "${HOME}/.steam/steamcmd/linux32/steamclient.so" "${serverfiles}/linux32/steamclient.so" elif [ -f "${steamcmddir}/linux32/steamclient.so" ]; then - cp "${steamcmddir}/linux32/steamclient.so" "${serverfiles}/linux32/steamclient.so" >> "${lgsmlog}" + cp "${steamcmddir}/linux32/steamclient.so" "${serverfiles}/linux32/steamclient.so" fi fn_fix_msg_end fi @@ -21,10 +22,11 @@ fi if [ ! -f "${serverfiles}/linux64/steamclient.so" ]; then fixname="steamclient.so x86_64" fn_fix_msg_start + mkdir -p "${serverfiles}/linux64" if [ -f "${HOME}/.steam/steamcmd/linux64/steamclient.so" ]; then - cp "${HOME}/.steam/steamcmd/linux64/steamclient.so" "${serverfiles}/linux64/steamclient.so" >> "${lgsmlog}" + cp "${HOME}/.steam/steamcmd/linux64/steamclient.so" "${serverfiles}/linux64/steamclient.so" elif [ -f "${steamcmddir}/linux64/steamclient.so" ]; then - cp "${steamcmddir}/linux64/steamclient.so" "${serverfiles}/linux64/steamclient.so" >> "${lgsmlog}" + cp "${steamcmddir}/linux64/steamclient.so" "${serverfiles}/linux64/steamclient.so" fi fn_fix_msg_end fi diff --git a/lgsm/functions/fix_rust.sh b/lgsm/functions/fix_rust.sh index 9ceff7b29..607af491b 100644 --- a/lgsm/functions/fix_rust.sh +++ b/lgsm/functions/fix_rust.sh @@ -7,4 +7,4 @@ functionselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" # Fixes: [Raknet] Server Shutting Down (Shutting Down). -export LD_LIBRARY_PATH="$LD_LIBRARY_PATH:${systemdir}/RustDedicated_Data/Plugins/x86_64" +export LD_LIBRARY_PATH="$LD_LIBRARY_PATH:${serverfiles}:${serverfiles}/RustDedicated_Data/Plugins/x86_64" diff --git a/lgsm/functions/fix_sdtd.sh b/lgsm/functions/fix_sdtd.sh index 91c94897a..2709102c4 100644 --- a/lgsm/functions/fix_sdtd.sh +++ b/lgsm/functions/fix_sdtd.sh @@ -6,4 +6,4 @@ functionselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" -export LD_LIBRARY_PATH="$LD_LIBRARY_PATH:${serverfiles}" +export LD_LIBRARY_PATH="$LD_LIBRARY_PATH:${serverfiles}/7DaysToDieServer_Data/Plugins/x86_64" diff --git a/lgsm/functions/fix_ss3.sh b/lgsm/functions/fix_ss3.sh index 6bea53861..76de64471 100644 --- a/lgsm/functions/fix_ss3.sh +++ b/lgsm/functions/fix_ss3.sh @@ -10,6 +10,7 @@ functionselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" if [ ! -f "${serverfiles}/Bin/steamclient.so" ]||[ "$(diff "${HOME}/.steam/steamcmd/linux32/steamclient.so" "${serverfiles}/Bin/steamclient.so" 2>/dev/null)" ]; then fixname="steamclient.so" fn_fix_msg_start + mkdir -p "${serverfiles}/Bin" cp -f "${HOME}/.steam/steamcmd/linux32/steamclient.so" "${serverfiles}/Bin/steamclient.so" fn_fix_msg_end fi @@ -18,7 +19,7 @@ fi if [ ! -f "${HOME}/.steam/bin32/libsteam.so" ]; then fixname="libsteam.so" fn_fix_msg_start - mkdir -pv "${HOME}/.steam/bin32" >> "${lgsmlog}" - cp "${serverfiles}/Bin/libsteam.so" "${HOME}/.steam/bin32/libsteam.so" >> "${lgsmlog}" + mkdir -p "${HOME}/.steam/bin32" + cp "${serverfiles}/Bin/libsteam.so" "${HOME}/.steam/bin32/libsteam.so" fn_fix_msg_end fi diff --git a/lgsm/functions/fix_steamcmd.sh b/lgsm/functions/fix_steamcmd.sh index fc02dd60e..6080c2065 100644 --- a/lgsm/functions/fix_steamcmd.sh +++ b/lgsm/functions/fix_steamcmd.sh @@ -10,11 +10,11 @@ functionselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" if [ ! -f "${HOME}/.steam/sdk64/steamclient.so" ]; then fixname="steamclient.so sdk64" fn_fix_msg_start - mkdir -pv "${HOME}/.steam/sdk64" >> "${lgsmlog}" + mkdir -p "${HOME}/.steam/sdk64" if [ -f "${HOME}/.steam/steamcmd/linux64/steamclient.so" ]; then - cp "${HOME}/.steam/steamcmd/linux64/steamclient.so" "${HOME}/.steam/sdk64/steamclient.so" >> "${lgsmlog}" + cp "${HOME}/.steam/steamcmd/linux64/steamclient.so" "${HOME}/.steam/sdk64/steamclient.so" elif [ -f "${steamcmddir}/linux64/steamclient.so" ]; then - cp "${steamcmddir}/linux64/steamclient.so" "${HOME}/.steam/sdk64/steamclient.so" >> "${lgsmlog}" + cp "${steamcmddir}/linux64/steamclient.so" "${HOME}/.steam/sdk64/steamclient.so" fi fn_fix_msg_end fi @@ -23,11 +23,11 @@ fi if [ ! -f "${HOME}/.steam/sdk32/steamclient.so" ]; then fixname="steamclient.so sdk32" fn_fix_msg_start - mkdir -pv "${HOME}/.steam/sdk32" >> "${lgsmlog}" + mkdir -p "${HOME}/.steam/sdk32" if [ -f "${HOME}/.steam/steamcmd/linux32/steamclient.so" ]; then - cp "${HOME}/.steam/steamcmd/linux32/steamclient.so" "${HOME}/.steam/sdk32/steamclient.so" >> "${lgsmlog}" + cp "${HOME}/.steam/steamcmd/linux32/steamclient.so" "${HOME}/.steam/sdk32/steamclient.so" elif [ -f "${steamcmddir}/linux32/steamclient.so" ]; then - cp "${steamcmddir}/linux32/steamclient.so" "${HOME}/.steam/sdk32/steamclient.so" >> "${lgsmlog}" + cp "${steamcmddir}/linux32/steamclient.so" "${HOME}/.steam/sdk32/steamclient.so" fi fn_fix_msg_end fi diff --git a/lgsm/functions/fix_tu.sh b/lgsm/functions/fix_tu.sh index 5d09bf3c2..9f8197b63 100644 --- a/lgsm/functions/fix_tu.sh +++ b/lgsm/functions/fix_tu.sh @@ -10,10 +10,11 @@ functionselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" if [ ! -f "${executabledir}/steamclient.so" ]; then fixname="steamclient.so x86_64" fn_fix_msg_start + mkdir -p "${executabledir}" if [ -f "${HOME}/.steam/steamcmd/linux64/steamclient.so" ]; then - cp "${HOME}/.steam/steamcmd/linux64/steamclient.so" "${executabledir}/steamclient.so" >> "${lgsmlog}" + cp "${HOME}/.steam/steamcmd/linux64/steamclient.so" "${executabledir}/steamclient.so" elif [ -f "${steamcmddir}/linux64/steamclient.so" ]; then - cp "${steamcmddir}/linux64/steamclient.so" "${executabledir}/steamclient.so" >> "${lgsmlog}" + cp "${steamcmddir}/linux64/steamclient.so" "${executabledir}/steamclient.so" fi fn_fix_msg_end fi diff --git a/lgsm/functions/fix_wurm.sh b/lgsm/functions/fix_wurm.sh index 1285fb54e..d43373cfe 100644 --- a/lgsm/functions/fix_wurm.sh +++ b/lgsm/functions/fix_wurm.sh @@ -9,10 +9,11 @@ functionselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" if [ ! -f "${serverfiles}/nativelibs" ]; then fixname="steamclient.so x86" fn_fix_msg_start + mkdir -p "${serverfiles}/nativelibs" if [ -f "${HOME}/.steam/steamcmd/linux32/steamclient.so" ]; then - cp "${HOME}/.steam/steamcmd/linux32/steamclient.so" "${serverfiles}/nativelibs" >> "${lgsmlog}" + cp "${HOME}/.steam/steamcmd/linux32/steamclient.so" "${serverfiles}/nativelibs/steamclient.so" elif [ -f "${steamcmddir}/linux32/steamclient.so" ]; then - cp "${steamcmddir}/linux32/steamclient.so" "${serverfiles}/nativelibs" >> "${lgsmlog}" + cp "${steamcmddir}/linux32/steamclient.so" "${serverfiles}/nativelibs/steamclient.so" fi fn_fix_msg_end fi diff --git a/lgsm/functions/info_config.sh b/lgsm/functions/info_config.sh index 2a002f523..c38e3e155 100644 --- a/lgsm/functions/info_config.sh +++ b/lgsm/functions/info_config.sh @@ -1241,6 +1241,7 @@ fn_info_config_sdtd(){ telnetenabled="${unavailable}" telnetport="${zero}" telnetpass="${unavailable}" + telnetip="${unavailable}" maxplayers="${unavailable}" gamemode="${unavailable}" gameworld="${unavailable}" @@ -1256,7 +1257,11 @@ fn_info_config_sdtd(){ telnetenabled=$(grep "TelnetEnabled" "${servercfgfullpath}" | sed 's/^.*value="//' | cut -f1 -d"\"") telnetport=$(grep "TelnetPort" "${servercfgfullpath}" | tr -cd '[:digit:]') telnetpass=$(grep "TelnetPassword" "${servercfgfullpath}" | sed 's/^.*value="//' | cut -f1 -d"\"") - + # Telnet IP will be localhost if no password is set + # check_ip will set the IP first. This will overwrite it. + if [ -z "${telnetpass}" ]; then + telnetip="127.0.0.1" + fi 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"\"") diff --git a/lgsm/functions/info_distro.sh b/lgsm/functions/info_distro.sh index 7815e05fe..f7500b695 100644 --- a/lgsm/functions/info_distro.sh +++ b/lgsm/functions/info_distro.sh @@ -262,7 +262,11 @@ fi if [ "$(command -v jq 2>/dev/null)" ]; then if [ "${ip}" ]&&[ "${port}" ]; then if [ "${steammaster}" == "true" ]; then - masterserver=$(curl -m 3 -s 'https://api.steampowered.com/ISteamApps/GetServersAtAddress/v0001?addr='${ip}':'${port}'&format=json' | jq '.response.servers[]|.addr' | wc -l 2>/dev/null) + # Will query server IP addresses first. + for queryip in "${queryips[@]}"; do + masterserver=$(curl -m 3 -s 'https://api.steampowered.com/ISteamApps/GetServersAtAddress/v0001?addr='${queryip}':'${port}'&format=json' | jq '.response.servers[]|.addr' | wc -l 2>/dev/null) + done + # Should that not work it will try the external IP. if [ "${masterserver}" == "0" ]; then masterserver=$(curl -m 3 -s 'https://api.steampowered.com/ISteamApps/GetServersAtAddress/v0001?addr='${extip}':'${port}'&format=json' | jq '.response.servers[]|.addr' | wc -l 2>/dev/null) fi diff --git a/lgsm/functions/info_messages.sh b/lgsm/functions/info_messages.sh index a7d6a1261..7c70b57a6 100644 --- a/lgsm/functions/info_messages.sh +++ b/lgsm/functions/info_messages.sh @@ -783,7 +783,7 @@ fn_info_message_eco(){ { echo -e "${lightblue}DESCRIPTION\tDIRECTION\tPORT\tPROTOCOL${default}" echo -e "> Game\tINBOUND\t${port}\tudp" - echo -e "> WebAdmin\tINBOUND\t${webadminport}\ttcp" + echo -e "> Web Admin\tINBOUND\t${webadminport}\ttcp" } | column -s $'\t' -t } @@ -1107,23 +1107,23 @@ fn_info_message_sdtd(){ echo -e "${lightblue}DESCRIPTION\tDIRECTION\tPORT\tPROTOCOL${default}" echo -e "> Game/RCON\tINBOUND\t${port}\tudp" echo -e "> Query\tINBOUND\t${queryport}\tudp" - echo -e "> WebAdmin\tINBOUND\t${webadminport}\ttcp" + echo -e "> Web Admin\tINBOUND\t${webadminport}\ttcp" echo -e "> Telnet\tINBOUND\t${telnetport}\ttcp" } | column -s $'\t' -t echo -e "" - echo -e "${lightgreen}${servername} WebAdmin${default}" + echo -e "${lightgreen}${gamename} Web Admin${default}" fn_messages_separator { - echo -e "${lightblue}WebAdmin enabled:\t${default}${webadminenabled}" - echo -e "${lightblue}WebAdmin url:\t${default}http://${ip}:${webadminport}" - echo -e "${lightblue}WebAdmin password:\t${default}${webadminpass}" + echo -e "${lightblue}Web Admin enabled:\t${default}${webadminenabled}" + echo -e "${lightblue}Web Admin url:\t${default}http://${webadminip}:${webadminport}" + echo -e "${lightblue}Web Admin password:\t${default}${webadminpass}" } | column -s $'\t' -t echo -e "" - echo -e "${lightgreen}${servername} Telnet${default}" + echo -e "${lightgreen}${gamename} Telnet${default}" fn_messages_separator { echo -e "${lightblue}Telnet enabled:\t${default}${telnetenabled}" - echo -e "${lightblue}Telnet address:\t${default}${ip} ${telnetport}" + echo -e "${lightblue}Telnet address:\t${default}${telnetip} ${telnetport}" echo -e "${lightblue}Telnet password:\t${default}${telnetpass}" } | column -s $'\t' -t } @@ -1156,15 +1156,15 @@ fn_info_message_spark(){ echo -e "${lightblue}DESCRIPTION\tDIRECTION\tPORT\tPROTOCOL${default}" echo -e "> Game/RCON\tINBOUND\t${port}\tudp" echo -e "> Query\tINBOUND\t${queryport}\tudp" - echo -e "> WebAdmin\tINBOUND\t${webadminport}\ttcp" + echo -e "> Web Admin\tINBOUND\t${webadminport}\ttcp" } | column -s $'\t' -t echo -e "" - echo -e "${lightgreen}${servername} WebAdmin${default}" + echo -e "${lightgreen}${servername} Web Admin${default}" fn_messages_separator { - echo -e "${lightblue}WebAdmin url:\t${default}http://${ip}:${webadminport}/index.html" - echo -e "${lightblue}WebAdmin username:\t${default}${webadminuser}" - echo -e "${lightblue}WebAdmin password:\t${default}${webadminpass}" + echo -e "${lightblue}Web Admin url:\t${default}http://${webadminip}:${webadminport}/index.html" + echo -e "${lightblue}Web Admin username:\t${default}${webadminuser}" + echo -e "${lightblue}Web Admin password:\t${default}${webadminpass}" } | column -s $'\t' -t } @@ -1269,16 +1269,16 @@ fn_info_message_unreal(){ echo -e "< Steam\tINBOUND\t20660\tudp" fi fi - echo -e "> WebAdmin\tINBOUND\t${webadminport}\ttcp\tListenPort=${webadminport}" + echo -e "> Web Admin\tINBOUND\t${webadminport}\ttcp\tListenPort=${webadminport}" } | column -s $'\t' -t echo -e "" - echo -e "${lightgreen}${servername} WebAdmin${default}" + echo -e "${lightgreen}${servername} Web Admin${default}" fn_messages_separator { - echo -e "${lightblue}WebAdmin enabled:\t${default}${webadminenabled}" - echo -e "${lightblue}WebAdmin url:\t${default}http://${ip}:${webadminport}" - echo -e "${lightblue}WebAdmin username:\t${default}${webadminuser}" - echo -e "${lightblue}WebAdmin password:\t${default}${webadminpass}" + echo -e "${lightblue}Web Admin enabled:\t${default}${webadminenabled}" + echo -e "${lightblue}Web Admin url:\t${default}http://${webadminip}:${webadminport}" + echo -e "${lightblue}Web Admin username:\t${default}${webadminuser}" + echo -e "${lightblue}Web Admin password:\t${default}${webadminpass}" } | column -s $'\t' -t } @@ -1293,16 +1293,16 @@ fn_info_message_unreal2(){ if [ "${appid}" != "223250" ]; then echo -e "> Query (GameSpy)\tINBOUND\t${queryportgs}\tudp\tOldQueryPortNumber=${queryportgs}" fi - echo -e "> WebAdmin\tINBOUND\t${webadminport}\ttcp\tListenPort=${webadminport}" + echo -e "> Web Admin\tINBOUND\t${webadminport}\ttcp\tListenPort=${webadminport}" } | column -s $'\t' -t echo -e "" - echo -e "${lightgreen}${servername} WebAdmin${default}" + echo -e "${lightgreen}${servername} Web Admin${default}" fn_messages_separator { - echo -e "${lightblue}WebAdmin enabled:\t${default}${webadminenabled}" - echo -e "${lightblue}WebAdmin url:\t${default}http://${ip}:${webadminport}" - echo -e "${lightblue}WebAdmin username:\t${default}${webadminuser}" - echo -e "${lightblue}WebAdmin password:\t${default}${webadminpass}" + echo -e "${lightblue}Web Admin enabled:\t${default}${webadminenabled}" + echo -e "${lightblue}Web Admin url:\t${default}http://${webadminip}:${webadminport}" + echo -e "${lightblue}Web Admin username:\t${default}${webadminuser}" + echo -e "${lightblue}Web Admin password:\t${default}${webadminpass}" } | column -s $'\t' -t } @@ -1314,16 +1314,16 @@ fn_info_message_unreal3(){ echo -e "${lightblue}DESCRIPTION\tDIRECTION\tPORT\tPROTOCOL${default}" echo -e "> Game\tINBOUND\t${port}\tudp" echo -e "> Query\tINBOUND\t${queryport}\tudp" - echo -e "> WebAdmin\tINBOUND\t${webadminport}\ttcp\tListenPort=${webadminport}" + echo -e "> Web Admin\tINBOUND\t${webadminport}\ttcp\tListenPort=${webadminport}" } | column -s $'\t' -t echo -e "" - echo -e "${lightgreen}${servername} WebAdmin${default}" + echo -e "${lightgreen}${servername} Web Admin${default}" fn_messages_separator { - echo -e "${lightblue}WebAdmin enabled:\t${default}${webadminenabled}" - echo -e "${lightblue}WebAdmin url:\t${default}http://${ip}:${webadminport}" - echo -e "${lightblue}WebAdmin username:\t${default}${webadminuser}" - echo -e "${lightblue}WebAdmin password:\t${default}${webadminpass}" + echo -e "${lightblue}Web Admin enabled:\t${default}${webadminenabled}" + echo -e "${lightblue}Web Admin url:\t${default}http://${webadminip}:${webadminport}" + echo -e "${lightblue}Web Admin username:\t${default}${webadminuser}" + echo -e "${lightblue}Web Admin password:\t${default}${webadminpass}" } | column -s $'\t' -t } @@ -1355,16 +1355,16 @@ fn_info_message_kf2(){ echo -e "> Game\tINBOUND\t${port}\ttcp\tPort=${port}" echo -e "> Query\tINBOUND\t${queryport}\tudp" echo -e "> Steam\tINBOUND\t20560\tudp" - echo -e "> WebAdmin\tINBOUND\t${webadminport}\ttcp\tListenPort=${webadminport}" + echo -e "> Web Admin\tINBOUND\t${webadminport}\ttcp\tListenPort=${webadminport}" } | column -s $'\t' -t echo -e "" - echo -e "${lightgreen}${servername} WebAdmin${default}" + echo -e "${lightgreen}${servername} Web Admin${default}" fn_messages_separator { - echo -e "${lightblue}WebAdmin enabled:\t${default}${webadminenabled}" - echo -e "${lightblue}WebAdmin url:\t${default}http://${ip}:${webadminport}" - echo -e "${lightblue}WebAdmin username:\t${default}${webadminuser}" - echo -e "${lightblue}WebAdmin password:\t${default}${webadminpass}" + echo -e "${lightblue}Web Admin enabled:\t${default}${webadminenabled}" + echo -e "${lightblue}Web Admin url:\t${default}http://${webadminip}:${webadminport}" + echo -e "${lightblue}Web Admin username:\t${default}${webadminuser}" + echo -e "${lightblue}Web Admin password:\t${default}${webadminpass}" } | column -s $'\t' -t } From 358e34dc0f61df80f5a41c25c4172e963c4b485b Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Thu, 17 Sep 2020 10:06:14 +0100 Subject: [PATCH 464/534] feat: various improvements to steamclient.so related messages and issues (#3040) converted ballistic overkill to 64-bit removed log parameter from hurtworld to enable verbose console converted Huttworld to 64-bit only add steamclient.so fixes for all unity3d servers standardise steamclient.so fixes mainly for unity3d servers --- .../config-lgsm/boserver/_default.cfg | 2 +- .../config-lgsm/hwserver/_default.cfg | 4 +-- lgsm/functions/core_functions.sh | 10 ++++++ lgsm/functions/fix.sh | 4 +++ lgsm/functions/fix_bo.sh | 35 +++++++++++++++++++ lgsm/functions/fix_cmw.sh | 1 + lgsm/functions/fix_cs.sh | 2 +- lgsm/functions/fix_hw.sh | 24 +------------ lgsm/functions/fix_pz.sh | 3 +- lgsm/functions/fix_st.sh | 10 ++++++ lgsm/functions/fix_tu.sh | 2 +- lgsm/functions/fix_unt.sh | 12 +++---- 12 files changed, 74 insertions(+), 35 deletions(-) create mode 100644 lgsm/functions/fix_bo.sh create mode 100644 lgsm/functions/fix_st.sh diff --git a/lgsm/config-default/config-lgsm/boserver/_default.cfg b/lgsm/config-default/config-lgsm/boserver/_default.cfg index 73f4cfedc..e7de73d0f 100644 --- a/lgsm/config-default/config-lgsm/boserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/boserver/_default.cfg @@ -155,7 +155,7 @@ glibc="2.15" ## Game Server Directories systemdir="${serverfiles}" executabledir="${serverfiles}" -executable="./BODS.x86" +executable="./BODS.x86_64" servercfgdir="${systemdir}" servercfg="${selfname}.txt" servercfgdefault="config.txt" diff --git a/lgsm/config-default/config-lgsm/hwserver/_default.cfg b/lgsm/config-default/config-lgsm/hwserver/_default.cfg index a68fb7e59..7e62fdc6b 100644 --- a/lgsm/config-default/config-lgsm/hwserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/hwserver/_default.cfg @@ -29,7 +29,7 @@ loadsave="" ## Server Parameters | https://docs.linuxgsm.com/configuration/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 \"${gamelog}\" " +parms="-batchmode -nographics -exec \"host ${port} ${defaultmap} ${loadsave};queryport ${queryport};maxplayers ${maxplayers};servername ${servername};creativemode ${creativemode};${admins}\"" } #### LinuxGSM Settings #### @@ -168,7 +168,7 @@ glibc="2.15" ## Game Server Directories systemdir="${serverfiles}" executabledir="${serverfiles}" -executable=$([ "$(uname -m)" == "x86_64" ] && echo -e "./Hurtworld.x86_64" || echo -e "./Hurtworld.x86") +executable="./Hurtworld.x86_64" ## Backup Directory backupdir="${lgsmdir}/backup" diff --git a/lgsm/functions/core_functions.sh b/lgsm/functions/core_functions.sh index 081626065..a1ee7fe26 100644 --- a/lgsm/functions/core_functions.sh +++ b/lgsm/functions/core_functions.sh @@ -320,6 +320,11 @@ functionfile="${FUNCNAME[0]}" fn_fetch_function } +fix_bo.sh(){ +functionfile="${FUNCNAME[0]}" +fn_fetch_function +} + fix_cmw.sh(){ functionfile="${FUNCNAME[0]}" fn_fetch_function @@ -410,6 +415,11 @@ functionfile="${FUNCNAME[0]}" fn_fetch_function } +fix_st.sh(){ +functionfile="${FUNCNAME[0]}" +fn_fetch_function +} + fix_steamcmd.sh(){ functionfile="${FUNCNAME[0]}" fn_fetch_function diff --git a/lgsm/functions/fix.sh b/lgsm/functions/fix.sh index 9d970064b..eac243075 100644 --- a/lgsm/functions/fix.sh +++ b/lgsm/functions/fix.sh @@ -40,6 +40,8 @@ if [ "${commandname}" != "INSTALL" ]&&[ -z "${fixbypass}" ]; then fix_arma3.sh elif [ "${shortname}" == "ark" ]; then fix_ark.sh + elif [ "${shortname}" == "bo" ]; then + fix_bo.sh elif [ "${shortname}" == "cs" ]; then fix_cs.sh elif [ "${shortname}" == "csgo" ]; then @@ -74,6 +76,8 @@ if [ "${commandname}" != "INSTALL" ]&&[ -z "${fixbypass}" ]; then fix_squad.sh elif [ "${shortname}" == "ss3" ]; then fix_ss3.sh + elif [ "${shortname}" == "st" ]; then + fix_st.sh elif [ "${shortname}" == "tf2" ]; then fix_tf2.sh elif [ "${shortname}" == "terraria" ]; then diff --git a/lgsm/functions/fix_bo.sh b/lgsm/functions/fix_bo.sh new file mode 100644 index 000000000..23c9179a2 --- /dev/null +++ b/lgsm/functions/fix_bo.sh @@ -0,0 +1,35 @@ +#!/bin/bash +# LinuxGSM fix_hw.sh function +# Author: Daniel Gibbs +# Website: https://linuxgsm.com +# Description: Resolves various issues with Ballistic Overkill. + +functionselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" + +export LD_LIBRARY_PATH="$LD_LIBRARY_PATH:${serverfiles}:${serverfiles}/BODS_Data/Plugins/x86_64" + +# steamclient.so x86 fix for unity3d game server +if [ ! -f "${serverfiles}/BODS_Data/Plugins/x86/steamclient.so" ]; then + fixname="steamclient.so x86" + fn_fix_msg_start + mkdir -p "${serverfiles}/BODS_Data/Plugins/x86" + if [ -f "${HOME}/.steam/steamcmd/linux32/steamclient.so" ]; then + cp "${HOME}/.steam/steamcmd/linux32/steamclient.so" "${serverfiles}/BODS_Data/Plugins/x86/steamclient.so" + elif [ -f "${steamcmddir}/linux32/steamclient.so" ]; then + cp "${steamcmddir}/linux32/steamclient.so" "${serverfiles}/BODS_Data/Plugins/x86/steamclient.so" + fi + fn_fix_msg_end +fi + +# steamclient.so x86_64 fix for unity3d game server +if [ ! -f "${serverfiles}/BODS_Data/Plugins/x86_64/steamclient.so" ]; then + fixname="steamclient.so x86_64" + fn_fix_msg_start + mkdir -p "${serverfiles}/BODS_Data/Plugins/x86_64" + if [ -f "${HOME}/.steam/steamcmd/linux64/steamclient.so" ]; then + cp "${HOME}/.steam/steamcmd/linux64/steamclient.so" "${serverfiles}/BODS_Data/Plugins/x86_64/steamclient.so" + elif [ -f "${steamcmddir}/linux64/steamclient.so" ]; then + cp "${steamcmddir}/linux64/steamclient.so" "${serverfiles}/BODS_Data/Plugins/x86_64/steamclient.so" + fi + fn_fix_msg_end +fi diff --git a/lgsm/functions/fix_cmw.sh b/lgsm/functions/fix_cmw.sh index 3a463b0b2..df80e1ee9 100644 --- a/lgsm/functions/fix_cmw.sh +++ b/lgsm/functions/fix_cmw.sh @@ -12,6 +12,7 @@ if [ ! -f "${executabledir}/steam_appid.txt" ]; then fn_fix_msg_end fi +# steamclient.so x86 fix. if [ ! -f "${executabledir}/lib/steamclient.so" ]; then fixname="steamclient.so x86" fn_fix_msg_start diff --git a/lgsm/functions/fix_cs.sh b/lgsm/functions/fix_cs.sh index fe18ea9f5..ea18702b3 100644 --- a/lgsm/functions/fix_cs.sh +++ b/lgsm/functions/fix_cs.sh @@ -6,7 +6,7 @@ functionselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" -# Fixes: steamclient.so: cannot open shared object file: No such file or directory +# steamclient.so x86 fix. if [ ! -f "${serverfiles}/steamclient.so" ]; then fixname="steamclient.so x86" fn_fix_msg_start diff --git a/lgsm/functions/fix_hw.sh b/lgsm/functions/fix_hw.sh index f888748ca..4fc3dcd0d 100644 --- a/lgsm/functions/fix_hw.sh +++ b/lgsm/functions/fix_hw.sh @@ -6,26 +6,4 @@ functionselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" -# Fixes: [S_API FAIL] SteamAPI_Init() failed; unable to locate a running instance of Steam, or a local steamclient.so. -if [ ! -f "${serverfiles}/Hurtworld_Data/Plugins/x86/steamclient.so" ]; then - fixname="steamclient.so x86" - fn_fix_msg_start - mkdir -p "${serverfiles}/Hurtworld_Data/Plugins/x86" - if [ -f "${HOME}/.steam/steamcmd/linux32/steamclient.so" ]; then - cp "${HOME}/.steam/steamcmd/linux32/steamclient.so" "${serverfiles}/Hurtworld_Data/Plugins/x86/steamclient.so" - elif [ -f "${steamcmddir}/linux32/steamclient.so" ]; then - cp "${steamcmddir}/linux32/steamclient.so" "${serverfiles}/Hurtworld_Data/Plugins/x86/steamclient.so" - fi - 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 - mkdir -p "${serverfiles}/Hurtworld_Data/Plugins/x86_64" - if [ -f "${HOME}/.steam/steamcmd/linux64/steamclient.so" ]; then - cp "${HOME}/.steam/steamcmd/linux64/steamclient.so" "${serverfiles}/Hurtworld_Data/Plugins/x86_64/steamclient.so" - elif [ -f "${steamcmddir}/linux64/steamclient.so" ]; then - cp "${steamcmddir}/linux64/steamclient.so" "${serverfiles}/Hurtworld_Data/Plugins/x86_64/steamclient.so" - fi - fn_fix_msg_end -fi +export LD_LIBRARY_PATH="$LD_LIBRARY_PATH:${serverfiles}:${serverfiles}/Hurtworld_Data/Plugins/x86_64" diff --git a/lgsm/functions/fix_pz.sh b/lgsm/functions/fix_pz.sh index f59116d75..0215a390f 100644 --- a/lgsm/functions/fix_pz.sh +++ b/lgsm/functions/fix_pz.sh @@ -6,7 +6,7 @@ functionselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" -# Fixes: [S_API FAIL] SteamAPI_Init() failed; unable to locate a running instance of Steam, or a local steamclient.so. +# steamclient.so x86 fix. if [ ! -f "${serverfiles}/linux32/steamclient.so" ]; then fixname="steamclient.so x86" fn_fix_msg_start @@ -19,6 +19,7 @@ if [ ! -f "${serverfiles}/linux32/steamclient.so" ]; then fn_fix_msg_end fi +# steamclient.so x86_64 fix. if [ ! -f "${serverfiles}/linux64/steamclient.so" ]; then fixname="steamclient.so x86_64" fn_fix_msg_start diff --git a/lgsm/functions/fix_st.sh b/lgsm/functions/fix_st.sh new file mode 100644 index 000000000..2495264da --- /dev/null +++ b/lgsm/functions/fix_st.sh @@ -0,0 +1,10 @@ +#!/bin/bash +# LinuxGSM fix_rust.sh function +# Author: Daniel Gibbs +# Website: https://linuxgsm.com +# Description: Resolves startup issue with Stationeers. + +functionselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" + +# Fixes: [Raknet] Server Shutting Down (Shutting Down). +export LD_LIBRARY_PATH="$LD_LIBRARY_PATH:${serverfiles}:${serverfiles}/rocketstation_DedicatedServer_Data/Plugins/x86_64" diff --git a/lgsm/functions/fix_tu.sh b/lgsm/functions/fix_tu.sh index 9f8197b63..96fec4b52 100644 --- a/lgsm/functions/fix_tu.sh +++ b/lgsm/functions/fix_tu.sh @@ -6,7 +6,7 @@ functionselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" -# Fixes: [S_API FAIL] SteamAPI_Init() failed; unable to locate a running instance of Steam, or a local steamclient.so. +# steamclient.so x86_64 fix. if [ ! -f "${executabledir}/steamclient.so" ]; then fixname="steamclient.so x86_64" fn_fix_msg_start diff --git a/lgsm/functions/fix_unt.sh b/lgsm/functions/fix_unt.sh index eee816bfc..a46cbf847 100644 --- a/lgsm/functions/fix_unt.sh +++ b/lgsm/functions/fix_unt.sh @@ -6,17 +6,17 @@ functionselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" -# copy steamclient to server dir to fix the below +export LD_LIBRARY_PATH="$LD_LIBRARY_PATH:${serverfiles}:${serverfiles}/Unturned_Headless_Data/Plugins/x86_64" + +# steamclient.so x86_64 fix. if [ ! -f "${serverfiles}/steamclient.so" ]; then fixname="steamclient.so x86_64" fn_fix_msg_start + mkdir -p "${serverfiles}" if [ -f "${HOME}/.steam/steamcmd/linux64/steamclient.so" ]; then - cp "${HOME}/.steam/steamcmd/linux64/steamclient.so" "${serverfiles}/steamclient.so" >> "${lgsmlog}" + cp "${HOME}/.steam/steamcmd/linux64/steamclient.so" "${serverfiles}/steamclient.so" elif [ -f "${steamcmddir}/linux64/steamclient.so" ]; then - cp "${steamcmddir}/linux64/steamclient.so" "${serverfiles}/steamclient.so" >> "${lgsmlog}" + cp "${steamcmddir}/linux64/steamclient.so" "${serverfiles}/steamclient.so" fi fn_fix_msg_end fi - -# steamclient.so: cannot open shared object file: No such file or directory -export LD_LIBRARY_PATH="$LD_LIBRARY_PATH:${serverfiles}" From e4db2a6c5a407e25ddf2673a27b932728f3a10e3 Mon Sep 17 00:00:00 2001 From: H3o66 Date: Sat, 19 Sep 2020 21:55:30 +0200 Subject: [PATCH 465/534] fix(mods): fix csgo get5 fetching for the latest version --- lgsm/functions/mods_list.sh | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/lgsm/functions/mods_list.sh b/lgsm/functions/mods_list.sh index 2244a104c..9f1fdddb6 100644 --- a/lgsm/functions/mods_list.sh +++ b/lgsm/functions/mods_list.sh @@ -30,10 +30,10 @@ steamworkslatestfile=$(curl -sL ${steamworksscrapeurl} | grep -m 1 linux | cut - steamworksdownloadurl="${steamworksscrapeurl}/${steamworkslatestfile}" steamworksurl="${steamworksdownloadurl}" # CS:GO Mods -get5scrapepath=$(curl -sL https://ci.splewis.net/job/get5/lastSuccessfulBuild/api/xml | grep -oP "\K(.+)(?=)") -get5latestfile=$(echo -e "${get5scrapepath}" | xargs -n 1 -I @ sh -c "echo -e "basename "@""") -get5downloadurl="https://ci.splewis.net/job/get5/lastSuccessfulBuild/artifact/${get5scrapepath}" -get5url="${get5downloadurl}" +get5lastbuild=$(curl -sL https://ci.splewis.net/job/get5/lastSuccessfulBuild/api/json | jq -r '.artifacts[]') +get5latestfile=$(echo -e "${get5lastbuild}" | jq -r '.fileName') +get5latestfilepath=$(echo -e "${get5lastbuild}" | jq -r '.relativePath') +get5url="https://ci.splewis.net/job/get5/lastSuccessfulBuild/artifact/${get5latestfilepath}" # Oxide oxiderustlatestlink=$(curl -sL https://api.github.com/repos/OxideMod/Oxide.Rust/releases/latest | jq -r '.assets[]|select(.browser_download_url | contains("linux")) | .browser_download_url') oxidehurtworldlatestlink=$(curl -sL https://api.github.com/repos/OxideMod/Oxide.Hurtworld/releases/latest | jq -r '.assets[].browser_download_url') From 647beb58352bf0a03fe17dd233cbd3475bb7e3d5 Mon Sep 17 00:00:00 2001 From: Christian Date: Sun, 20 Sep 2020 10:59:27 +0200 Subject: [PATCH 466/534] feature(mods): add csgo pug to the modlist (#3044) --- lgsm/functions/mods_list.sh | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/lgsm/functions/mods_list.sh b/lgsm/functions/mods_list.sh index 2244a104c..d719f0b33 100644 --- a/lgsm/functions/mods_list.sh +++ b/lgsm/functions/mods_list.sh @@ -34,6 +34,9 @@ get5scrapepath=$(curl -sL https://ci.splewis.net/job/get5/lastSuccessfulBuild/ap get5latestfile=$(echo -e "${get5scrapepath}" | xargs -n 1 -I @ sh -c "echo -e "basename "@""") get5downloadurl="https://ci.splewis.net/job/get5/lastSuccessfulBuild/artifact/${get5scrapepath}" get5url="${get5downloadurl}" +csgopuglatest=$(curl -sL https://api.github.com/repos/splewis/csgo-pug-setup/releases/latest | jq '.assets[]') +csgopuglatestfile=$(echo -e "${}" | jq -r '.name') +csgopuglatestlink=$(echo -e "${}" | jq -r '.browser_download_url') # Oxide oxiderustlatestlink=$(curl -sL https://api.github.com/repos/OxideMod/Oxide.Rust/releases/latest | jq -r '.assets[]|select(.browser_download_url | contains("linux")) | .browser_download_url') oxidehurtworldlatestlink=$(curl -sL https://api.github.com/repos/OxideMod/Oxide.Hurtworld/releases/latest | jq -r '.assets[].browser_download_url') @@ -73,6 +76,7 @@ mod_info_steamworks=( MOD "steamworks" "SteamWorks" "${steamworksurl}" "${steamw mod_info_gokz=( MOD "gokz" "GOKZ" "https://bitbucket.org/kztimerglobalteam/gokz/downloads/GOKZ-latest.zip" "gokz-latest.zip" "0" "LowercaseOff" "${systemdir}" "cfg;addons/sourcemod/configs;" "ENGINES" "Counter-Strike: Global Offensive;" "NOTGAMES" "https://bitbucket.org/kztimerglobalteam/gokz/src/master/" "Implements the KZ game mode (requires SourceMod and MetaMod)" ) mod_info_ttt=( MOD "ttt" "Trouble in Terrorist Town" "https://csgottt.com/downloads/ttt-latest-dev-${sourcemodmversion}.zip" "ttt-latest.zip" "0" "LowercaseOff" "${systemdir}" "cfg;addons/sourcemod/configs;" "ENGINES" "Counter-Strike: Global Offensive;" "NOTGAMES" "https://github.com/Bara/TroubleinTerroristTown" "Implements the TTT game mode (requires SourceMod and MetaMod)" ) mod_info_get5=( MOD "get5" "Get 5" "${get5url}" "${get5latestfile}" "0" "LowercaseOff" "${systemdir}" "cfg;addons/sourcemod/configs;" "ENGINES" "Counter-Strike: Global Offensive;" "NOTGAMES" "https://github.com/splewis/get5" "Plugin for competitive matches/scrims (requires SourceMod and MetaMod)" ) +mod_info_pug=( MOD "pug" "PUG" "${csgopuglatestlink}" "${csgopuglatestfile}" "0" "LowercaseOff" "${systemdir}" "cfg;addons/sourcemod/configs;" "ENGINES" "Counter-Strike: Global Offensive;" "NOTGAMES" "https://github.com/splewis/csgo-pug-setup" "plugin for setting up private pug/10man games" ) # 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" ) @@ -95,4 +99,4 @@ mod_info_hwoxide=( MOD "hwoxide" "Oxide for Hurtworld" "${oxidehurtworldlatestli mod_info_sdtdoxide=( MOD "sdtdoxide" "Oxide for 7 Days To Die" "${oxidesdtdlatestlink}" "Oxide.SevenDaysToDie.zip" "0" "LowercaseOff" "${systemdir}" "OVERWRITE" "ENGINES" "7 Days To Die;" "NOTGAMES" "https://umod.org/games/7-days-to-die" "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_steamworks[@]}" "${mod_info_gokz[@]}" "${mod_info_ttt[@]}" "${mod_info_get5[@]}" "${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_pac3[@]}" "${mod_info_wiremod[@]}" "${mod_info_wiremodextras[@]}" "${mod_info_darkrp[@]}" "${mod_info_darkrpmodification[@]}" "${mod_info_rustoxide[@]}" "${mod_info_hwoxide[@]}" "${mod_info_sdtdoxide[@]}" ) +mods_global_array=( "${mod_info_metamod[@]}" "${mod_info_sourcemod[@]}" "${mod_info_steamworks[@]}" "${mod_info_gokz[@]}" "${mod_info_ttt[@]}" "${mod_info_get5[@]}" "${mod_info_pug[@]}" "${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_pac3[@]}" "${mod_info_wiremod[@]}" "${mod_info_wiremodextras[@]}" "${mod_info_darkrp[@]}" "${mod_info_darkrpmodification[@]}" "${mod_info_rustoxide[@]}" "${mod_info_hwoxide[@]}" "${mod_info_sdtdoxide[@]}" ) From 4f42e7026c75cce1ebed56d1b03047f7ec05727d Mon Sep 17 00:00:00 2001 From: Christian Date: Sun, 20 Sep 2020 11:00:11 +0200 Subject: [PATCH 467/534] fix(fctrserver): add bind parameter for Factorio server (#3045) --- lgsm/config-default/config-lgsm/fctrserver/_default.cfg | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lgsm/config-default/config-lgsm/fctrserver/_default.cfg b/lgsm/config-default/config-lgsm/fctrserver/_default.cfg index c3eb1c962..c2ce4cc7f 100644 --- a/lgsm/config-default/config-lgsm/fctrserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/fctrserver/_default.cfg @@ -18,7 +18,7 @@ branch="stable" ## Server Parameters | https://docs.linuxgsm.com/configuration/start-parameters#additional-parameters fn_parms(){ -parms="--start-server ${serverfiles}/save1.zip --server-settings ${servercfgfullpath} --port ${port} --rcon-port ${rconport} --rcon-password ${rconpassword}" +parms="--bind ${ip} --start-server ${serverfiles}/save1.zip --server-settings ${servercfgfullpath} --port ${port} --rcon-port ${rconport} --rcon-password ${rconpassword}" } #### LinuxGSM Settings #### From 7fe992920c0591810cd162bfda6da363806f6889 Mon Sep 17 00:00:00 2001 From: Christian Date: Sun, 20 Sep 2020 11:07:21 +0200 Subject: [PATCH 468/534] fix(wurm): fix server startup for wurm and dependency (#3046) --- lgsm/functions/check_deps.sh | 4 ++-- lgsm/functions/fix_bo.sh | 4 ++-- lgsm/functions/fix_wurm.sh | 13 +++++++------ 3 files changed, 11 insertions(+), 10 deletions(-) diff --git a/lgsm/functions/check_deps.sh b/lgsm/functions/check_deps.sh index 3e3990a44..18548e156 100644 --- a/lgsm/functions/check_deps.sh +++ b/lgsm/functions/check_deps.sh @@ -405,7 +405,7 @@ fn_deps_build_debian(){ elif [ "${shortname}" == "hw" ]||[ "${shortname}" == "rust" ]; then array_deps_required+=( lib32z1 ) # Minecraft, Rising World, Wurm - elif [ "${shortname}" == "mc" ]||[ "${shortname}" == "rw" ]||[ "${shortname}" == "wurm" ]; then + elif [ "${shortname}" == "mc" ]||[ "${shortname}" == "rw" ]; then javaversion=$(java -version 2>&1 | grep "version") if [ "${javaversion}" ]; then # Added for users using Oracle JRE to bypass the check. @@ -514,7 +514,7 @@ fn_deps_build_redhat(){ elif [ "${shortname}" == "hw" ]||[ "${shortname}" == "rust" ]; then array_deps_required+=( zlib-devel ) # Minecraft, Rising World, Wurm - elif [ "${shortname}" == "mc" ]||[ "${shortname}" == "rw" ]||[ "${shortname}" == "wurm" ]; then + elif [ "${shortname}" == "mc" ]||[ "${shortname}" == "rw" ]; then javaversion=$(java -version 2>&1 | grep "version") if [ "${javaversion}" ]; then # Added for users using Oracle JRE to bypass the check. diff --git a/lgsm/functions/fix_bo.sh b/lgsm/functions/fix_bo.sh index 23c9179a2..13071036e 100644 --- a/lgsm/functions/fix_bo.sh +++ b/lgsm/functions/fix_bo.sh @@ -8,7 +8,7 @@ functionselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" export LD_LIBRARY_PATH="$LD_LIBRARY_PATH:${serverfiles}:${serverfiles}/BODS_Data/Plugins/x86_64" -# steamclient.so x86 fix for unity3d game server +# steamclient.so x86 fix. if [ ! -f "${serverfiles}/BODS_Data/Plugins/x86/steamclient.so" ]; then fixname="steamclient.so x86" fn_fix_msg_start @@ -21,7 +21,7 @@ if [ ! -f "${serverfiles}/BODS_Data/Plugins/x86/steamclient.so" ]; then fn_fix_msg_end fi -# steamclient.so x86_64 fix for unity3d game server +# steamclient.so x86_64 fix. if [ ! -f "${serverfiles}/BODS_Data/Plugins/x86_64/steamclient.so" ]; then fixname="steamclient.so x86_64" fn_fix_msg_start diff --git a/lgsm/functions/fix_wurm.sh b/lgsm/functions/fix_wurm.sh index d43373cfe..713b32853 100644 --- a/lgsm/functions/fix_wurm.sh +++ b/lgsm/functions/fix_wurm.sh @@ -6,14 +6,15 @@ functionselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" -if [ ! -f "${serverfiles}/nativelibs" ]; then - fixname="steamclient.so x86" +# steamclient.so x86_64 fix. +if [ ! -f "${serverfiles}/nativelibs/steamclient.so" ]; then + fixname="steamclient.so x86_64" fn_fix_msg_start mkdir -p "${serverfiles}/nativelibs" - if [ -f "${HOME}/.steam/steamcmd/linux32/steamclient.so" ]; then - cp "${HOME}/.steam/steamcmd/linux32/steamclient.so" "${serverfiles}/nativelibs/steamclient.so" - elif [ -f "${steamcmddir}/linux32/steamclient.so" ]; then - cp "${steamcmddir}/linux32/steamclient.so" "${serverfiles}/nativelibs/steamclient.so" + if [ -f "${HOME}/.steam/steamcmd/linux64/steamclient.so" ]; then + cp "${HOME}/.steam/steamcmd/linux64/steamclient.so" "${serverfiles}/nativelibs/steamclient.so" + elif [ -f "${steamcmddir}/linux64/steamclient.so" ]; then + cp "${steamcmddir}/linux64/steamclient.so" "${serverfiles}/nativelibs/steamclient.so" fi fn_fix_msg_end fi From 8e4d7ae97979c28b11c141afa7c02f2036386f1c Mon Sep 17 00:00:00 2001 From: Christian Date: Sun, 20 Sep 2020 11:10:23 +0200 Subject: [PATCH 469/534] fix(mcb): update fails, as the site does a redirect and does not follow (#3047) --- lgsm/functions/update_minecraft_bedrock.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lgsm/functions/update_minecraft_bedrock.sh b/lgsm/functions/update_minecraft_bedrock.sh index 925e85635..d980ff289 100644 --- a/lgsm/functions/update_minecraft_bedrock.sh +++ b/lgsm/functions/update_minecraft_bedrock.sh @@ -7,7 +7,7 @@ functionselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" fn_update_minecraft_dl(){ - latestmcbuildurl=$(curl -s "https://www.minecraft.net/en-us/download/server/bedrock/" | grep -o 'https://minecraft.azureedge.net/bin-linux/[^"]*zip') + latestmcbuildurl=$(curl -Ls "https://www.minecraft.net/en-us/download/server/bedrock/" | grep -o 'https://minecraft.azureedge.net/bin-linux/[^"]*zip') fn_fetch_file "${latestmcbuildurl}" "" "" "" "${tmpdir}" "bedrock_server.${remotebuild}.zip" echo -e "Extracting to ${serverfiles}...\c" if [ "${firstcommandname}" == "INSTALL" ]; then @@ -77,7 +77,7 @@ fn_update_minecraft_localbuild(){ fn_update_minecraft_remotebuild(){ # Gets remote build info. - remotebuild=$(curl -s "https://www.minecraft.net/en-us/download/server/bedrock/" | grep -o 'https://minecraft.azureedge.net/bin-linux/[^"]*' | sed 's/.*\///' | grep -Eo "[.0-9]+[0-9]") + remotebuild=$(curl -Ls "https://www.minecraft.net/en-us/download/server/bedrock/" | grep -o 'https://minecraft.azureedge.net/bin-linux/[^"]*' | sed 's/.*\///' | grep -Eo "[.0-9]+[0-9]") if [ "${firstcommandname}" != "INSTALL" ]; then fn_print_dots "Checking remote build: ${remotelocation}" # Checks if remotebuild variable has been set. From a6d564ccbe9f192624b1b5d10f5dbbe8a54ccd8c Mon Sep 17 00:00:00 2001 From: H3o66 Date: Sun, 20 Sep 2020 13:32:30 +0200 Subject: [PATCH 470/534] refactor(fix): move steamclient.so fix to a seperate function --- lgsm/functions/core_functions.sh | 15 -------- lgsm/functions/fix.sh | 6 ---- lgsm/functions/fix_bo.sh | 26 -------------- lgsm/functions/fix_cmw.sh | 16 +-------- lgsm/functions/fix_cs.sh | 20 ----------- lgsm/functions/fix_pz.sh | 33 ------------------ lgsm/functions/fix_ss3.sh | 10 +++--- lgsm/functions/fix_steamcmd.sh | 60 ++++++++++++++++++++++++++++++++ lgsm/functions/fix_tu.sh | 20 ----------- lgsm/functions/fix_unt.sh | 13 ------- lgsm/functions/fix_wurm.sh | 13 ------- 11 files changed, 65 insertions(+), 167 deletions(-) delete mode 100644 lgsm/functions/fix_cs.sh delete mode 100644 lgsm/functions/fix_pz.sh delete mode 100644 lgsm/functions/fix_tu.sh diff --git a/lgsm/functions/core_functions.sh b/lgsm/functions/core_functions.sh index a1ee7fe26..14789a90f 100644 --- a/lgsm/functions/core_functions.sh +++ b/lgsm/functions/core_functions.sh @@ -330,11 +330,6 @@ functionfile="${FUNCNAME[0]}" fn_fetch_function } -fix_cs.sh(){ -functionfile="${FUNCNAME[0]}" -fn_fetch_function -} - fix_csgo.sh(){ functionfile="${FUNCNAME[0]}" fn_fetch_function @@ -390,11 +385,6 @@ functionfile="${FUNCNAME[0]}" fn_fetch_function } -fix_pz.sh(){ -functionfile="${FUNCNAME[0]}" -fn_fetch_function -} - fix_ro.sh(){ functionfile="${FUNCNAME[0]}" fn_fetch_function @@ -435,11 +425,6 @@ functionfile="${FUNCNAME[0]}" fn_fetch_function } -fix_tu.sh(){ -functionfile="${FUNCNAME[0]}" -fn_fetch_function -} - fix_ut3.sh(){ functionfile="${FUNCNAME[0]}" fn_fetch_function diff --git a/lgsm/functions/fix.sh b/lgsm/functions/fix.sh index eac243075..ad5209747 100644 --- a/lgsm/functions/fix.sh +++ b/lgsm/functions/fix.sh @@ -42,8 +42,6 @@ if [ "${commandname}" != "INSTALL" ]&&[ -z "${fixbypass}" ]; then fix_ark.sh elif [ "${shortname}" == "bo" ]; then fix_bo.sh - elif [ "${shortname}" == "cs" ]; then - fix_cs.sh elif [ "${shortname}" == "csgo" ]; then fix_csgo.sh elif [ "${shortname}" == "cmw" ]; then @@ -60,8 +58,6 @@ if [ "${commandname}" != "INSTALL" ]&&[ -z "${fixbypass}" ]; then fix_nmrih.sh elif [ "${shortname}" == "onset" ]; then fix_onset.sh - elif [ "${shortname}" == "pz" ]; then - fix_pz.sh elif [ "${shortname}" == "rust" ]; then fix_rust.sh elif [ "${shortname}" == "rw" ]; then @@ -84,8 +80,6 @@ if [ "${commandname}" != "INSTALL" ]&&[ -z "${fixbypass}" ]; then fix_terraria.sh elif [ "${shortname}" == "ts3" ]; then fix_ts3.sh - elif [ "${shortname}" == "tu" ]; then - fix_tu.sh elif [ "${shortname}" == "mcb" ]; then fix_mcb.sh elif [ "${shortname}" == "mta" ]; then diff --git a/lgsm/functions/fix_bo.sh b/lgsm/functions/fix_bo.sh index 13071036e..545504f63 100644 --- a/lgsm/functions/fix_bo.sh +++ b/lgsm/functions/fix_bo.sh @@ -7,29 +7,3 @@ functionselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" export LD_LIBRARY_PATH="$LD_LIBRARY_PATH:${serverfiles}:${serverfiles}/BODS_Data/Plugins/x86_64" - -# steamclient.so x86 fix. -if [ ! -f "${serverfiles}/BODS_Data/Plugins/x86/steamclient.so" ]; then - fixname="steamclient.so x86" - fn_fix_msg_start - mkdir -p "${serverfiles}/BODS_Data/Plugins/x86" - if [ -f "${HOME}/.steam/steamcmd/linux32/steamclient.so" ]; then - cp "${HOME}/.steam/steamcmd/linux32/steamclient.so" "${serverfiles}/BODS_Data/Plugins/x86/steamclient.so" - elif [ -f "${steamcmddir}/linux32/steamclient.so" ]; then - cp "${steamcmddir}/linux32/steamclient.so" "${serverfiles}/BODS_Data/Plugins/x86/steamclient.so" - fi - fn_fix_msg_end -fi - -# steamclient.so x86_64 fix. -if [ ! -f "${serverfiles}/BODS_Data/Plugins/x86_64/steamclient.so" ]; then - fixname="steamclient.so x86_64" - fn_fix_msg_start - mkdir -p "${serverfiles}/BODS_Data/Plugins/x86_64" - if [ -f "${HOME}/.steam/steamcmd/linux64/steamclient.so" ]; then - cp "${HOME}/.steam/steamcmd/linux64/steamclient.so" "${serverfiles}/BODS_Data/Plugins/x86_64/steamclient.so" - elif [ -f "${steamcmddir}/linux64/steamclient.so" ]; then - cp "${steamcmddir}/linux64/steamclient.so" "${serverfiles}/BODS_Data/Plugins/x86_64/steamclient.so" - fi - fn_fix_msg_end -fi diff --git a/lgsm/functions/fix_cmw.sh b/lgsm/functions/fix_cmw.sh index df80e1ee9..2f517b1b7 100644 --- a/lgsm/functions/fix_cmw.sh +++ b/lgsm/functions/fix_cmw.sh @@ -4,27 +4,13 @@ # Website: https://linuxgsm.com # Description: Resolves the issue of the not starting server on linux -fixname="steam_appid.txt" - if [ ! -f "${executabledir}/steam_appid.txt" ]; then + fixname="steam_appid.txt" fn_fix_msg_start echo 219640 > "${executabledir}/steam_appid.txt" fn_fix_msg_end fi -# steamclient.so x86 fix. -if [ ! -f "${executabledir}/lib/steamclient.so" ]; then - fixname="steamclient.so x86" - fn_fix_msg_start - mkdir -p "${executabledir}/lib" - if [ -f "${HOME}/.steam/steamcmd/linux32/steamclient.so" ]; then - cp "${HOME}/.steam/steamcmd/linux32/steamclient.so" "${executabledir}/lib/steamclient.so" - elif [ -f "${steamcmddir}/linux32/steamclient.so" ]; then - cp "${steamcmddir}/linux32/steamclient.so" "${executabledir}/lib/steamclient.so" - fi - fn_fix_msg_end -fi - if [ ! -f "${servercfgfullpath}" ]; then fn_fix_msg_start fixname="copy config" diff --git a/lgsm/functions/fix_cs.sh b/lgsm/functions/fix_cs.sh deleted file mode 100644 index ea18702b3..000000000 --- a/lgsm/functions/fix_cs.sh +++ /dev/null @@ -1,20 +0,0 @@ -#!/bin/bash -# LinuxGSM fix_cs.sh function -# Author: Christian Birk -# Website: https://linuxgsm.com -# Description: Resolves various issues with Counter Strike. - -functionselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" - -# steamclient.so x86 fix. -if [ ! -f "${serverfiles}/steamclient.so" ]; then - fixname="steamclient.so x86" - fn_fix_msg_start - mkdir -p "${serverfiles}" - if [ -f "${HOME}/.steam/steamcmd/linux32/steamclient.so" ]; then - cp "${HOME}/.steam/steamcmd/linux32/steamclient.so" "${serverfiles}/steamclient.so" - elif [ -f "${steamcmddir}/linux32/steamclient.so" ]; then - cp "${steamcmddir}/linux32/steamclient.so" "${serverfiles}/steamclient.so" - fi - fn_fix_msg_end -fi diff --git a/lgsm/functions/fix_pz.sh b/lgsm/functions/fix_pz.sh deleted file mode 100644 index 0215a390f..000000000 --- a/lgsm/functions/fix_pz.sh +++ /dev/null @@ -1,33 +0,0 @@ -#!/bin/bash -# LinuxGSM fix_pz.sh function -# Author: Christian Birk -# Website: https://linuxgsm.com -# Description: Resolves various issues with Project Zomboid. - -functionselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" - -# steamclient.so x86 fix. -if [ ! -f "${serverfiles}/linux32/steamclient.so" ]; then - fixname="steamclient.so x86" - fn_fix_msg_start - mkdir -p "${serverfiles}/linux32" - if [ -f "${HOME}/.steam/steamcmd/linux32/steamclient.so" ]; then - cp "${HOME}/.steam/steamcmd/linux32/steamclient.so" "${serverfiles}/linux32/steamclient.so" - elif [ -f "${steamcmddir}/linux32/steamclient.so" ]; then - cp "${steamcmddir}/linux32/steamclient.so" "${serverfiles}/linux32/steamclient.so" - fi - fn_fix_msg_end -fi - -# steamclient.so x86_64 fix. -if [ ! -f "${serverfiles}/linux64/steamclient.so" ]; then - fixname="steamclient.so x86_64" - fn_fix_msg_start - mkdir -p "${serverfiles}/linux64" - if [ -f "${HOME}/.steam/steamcmd/linux64/steamclient.so" ]; then - cp "${HOME}/.steam/steamcmd/linux64/steamclient.so" "${serverfiles}/linux64/steamclient.so" - elif [ -f "${steamcmddir}/linux64/steamclient.so" ]; then - cp "${steamcmddir}/linux64/steamclient.so" "${serverfiles}/linux64/steamclient.so" - fi - fn_fix_msg_end -fi diff --git a/lgsm/functions/fix_ss3.sh b/lgsm/functions/fix_ss3.sh index 76de64471..b19ba6f17 100644 --- a/lgsm/functions/fix_ss3.sh +++ b/lgsm/functions/fix_ss3.sh @@ -7,12 +7,10 @@ functionselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" # Fixes: https://steamcommunity.com/app/41070/discussions/0/353916981477716386/ -if [ ! -f "${serverfiles}/Bin/steamclient.so" ]||[ "$(diff "${HOME}/.steam/steamcmd/linux32/steamclient.so" "${serverfiles}/Bin/steamclient.so" 2>/dev/null)" ]; then - fixname="steamclient.so" - fn_fix_msg_start - mkdir -p "${serverfiles}/Bin" - cp -f "${HOME}/.steam/steamcmd/linux32/steamclient.so" "${serverfiles}/Bin/steamclient.so" - fn_fix_msg_end +if [ -f "${serverfiles}/Bin/steamclient.so" ] && [ "$(diff "${HOME}/.steam/steamcmd/linux32/steamclient.so" "${serverfiles}/Bin/steamclient.so" 2>/dev/null)" ]; then + # delete old steamclient.so file + rm -f "${serverfiles}/Bin/steamclient.so" + fn_fix_steamclient_so "32" "${serverfiles}/Bin" fi # Fixes: .steam/bin32/libsteam.so: cannot open shared object file: No such file or directory diff --git a/lgsm/functions/fix_steamcmd.sh b/lgsm/functions/fix_steamcmd.sh index 6080c2065..62245127b 100644 --- a/lgsm/functions/fix_steamcmd.sh +++ b/lgsm/functions/fix_steamcmd.sh @@ -6,6 +6,45 @@ functionselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" +# function to simplify the steamclient.so fix +# example +# fn_fix_steamclient_so 32|64 (bit) "${serverfiles}/linux32/" +fn_fix_steamclient_so(){ + # $1 type of fix 32 or 64 as possible values + # $2 as destination where the lib will be copied to + if [ "$1" == "32" ]; then + # steamclient.so x86 fix. + if [ ! -f "${2}/steamclient.so" ]; then + fixname="steamclient.so x86" + fn_fix_msg_start + if [ ! -d "${2}" ]; then + mkdir -p "${2}" + fi + if [ -f "${HOME}/.steam/steamcmd/linux32/steamclient.so" ]; then + cp "${HOME}/.steam/steamcmd/linux32/steamclient.so" "${2}/steamclient.so" + elif [ -f "${steamcmddir}/linux32/steamclient.so" ]; then + cp "${steamcmddir}/linux32/steamclient.so" "${2}/steamclient.so" + fi + fn_fix_msg_end + fi + elif [ "$1" == "64" ]; then + # steamclient.so x86_64 fix. + if [ ! -f "${2}/steamclient.so" ]; then + fixname="steamclient.so x86_64" + fn_fix_msg_start + if [ ! -d "${2}" ]; then + mkdir -p "${2}" + fi + if [ -f "${HOME}/.steam/steamcmd/linux64/steamclient.so" ]; then + cp "${HOME}/.steam/steamcmd/linux64/steamclient.so" "${2}/steamclient.so" + elif [ -f "${steamcmddir}/linux64/steamclient.so" ]; then + cp "${steamcmddir}/linux64/steamclient.so" "${2}/steamclient.so" + fi + fn_fix_msg_end + fi + fi +} + # Helps fix: [S_API FAIL] SteamAPI_Init() failed; unable to locate a running instance of Steam,or a local steamclient.so. if [ ! -f "${HOME}/.steam/sdk64/steamclient.so" ]; then fixname="steamclient.so sdk64" @@ -31,3 +70,24 @@ if [ ! -f "${HOME}/.steam/sdk32/steamclient.so" ]; then fi fn_fix_msg_end fi + +# steamclient.so fixes +if [ "${shortname}" == "bo" ]; then + fn_fix_steamclient_so "32" "${serverfiles}/BODS_Data/Plugins/x86" + fn_fix_steamclient_so "64" "${serverfiles}/BODS_Data/Plugins/x86_64" +elif [ "${shortname}" == "cmw" ]; then + fn_fix_steamclient_so "32" "${executabledir}/lib" +elif [ "${shortname}" == "cs" ]; then + fn_fix_steamclient_so "32" "${serverfiles}" +elif [ "${shortname}" == "pz" ]; then + fn_fix_steamclient_so "32" "${serverfiles}/linux32" + fn_fix_steamclient_so "64" "${serverfiles}/linux64" +elif [ "${shortname}" == "ss3" ]; then + fn_fix_steamclient_so "32" "${serverfiles}/Bin" +elif [ "${shortname}" == "tu" ];then + fn_fix_steamclient_so "64" "${executabledir}" +elif [ "${shortname}" == "unt" ]; then + fn_fix_steamclient_so "64" "${serverfiles}" +elif [ "${shortname}" == "wurm" ]; then + fn_fix_steamclient_so "64" "${serverfiles}/nativelibs" +fi diff --git a/lgsm/functions/fix_tu.sh b/lgsm/functions/fix_tu.sh deleted file mode 100644 index 96fec4b52..000000000 --- a/lgsm/functions/fix_tu.sh +++ /dev/null @@ -1,20 +0,0 @@ -#!/bin/bash -# LinuxGSM fix_tu.sh function -# Author: Daniel Gibbs -# Website: https://linuxgsm.com -# Description: Resolves various issues with Tower Unite. - -functionselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" - -# steamclient.so x86_64 fix. -if [ ! -f "${executabledir}/steamclient.so" ]; then - fixname="steamclient.so x86_64" - fn_fix_msg_start - mkdir -p "${executabledir}" - if [ -f "${HOME}/.steam/steamcmd/linux64/steamclient.so" ]; then - cp "${HOME}/.steam/steamcmd/linux64/steamclient.so" "${executabledir}/steamclient.so" - elif [ -f "${steamcmddir}/linux64/steamclient.so" ]; then - cp "${steamcmddir}/linux64/steamclient.so" "${executabledir}/steamclient.so" - fi - fn_fix_msg_end -fi diff --git a/lgsm/functions/fix_unt.sh b/lgsm/functions/fix_unt.sh index a46cbf847..d030ef318 100644 --- a/lgsm/functions/fix_unt.sh +++ b/lgsm/functions/fix_unt.sh @@ -7,16 +7,3 @@ functionselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" export LD_LIBRARY_PATH="$LD_LIBRARY_PATH:${serverfiles}:${serverfiles}/Unturned_Headless_Data/Plugins/x86_64" - -# steamclient.so x86_64 fix. -if [ ! -f "${serverfiles}/steamclient.so" ]; then - fixname="steamclient.so x86_64" - fn_fix_msg_start - mkdir -p "${serverfiles}" - if [ -f "${HOME}/.steam/steamcmd/linux64/steamclient.so" ]; then - cp "${HOME}/.steam/steamcmd/linux64/steamclient.so" "${serverfiles}/steamclient.so" - elif [ -f "${steamcmddir}/linux64/steamclient.so" ]; then - cp "${steamcmddir}/linux64/steamclient.so" "${serverfiles}/steamclient.so" - fi - fn_fix_msg_end -fi diff --git a/lgsm/functions/fix_wurm.sh b/lgsm/functions/fix_wurm.sh index 713b32853..bf53e35b0 100644 --- a/lgsm/functions/fix_wurm.sh +++ b/lgsm/functions/fix_wurm.sh @@ -6,19 +6,6 @@ functionselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" -# steamclient.so x86_64 fix. -if [ ! -f "${serverfiles}/nativelibs/steamclient.so" ]; then - fixname="steamclient.so x86_64" - fn_fix_msg_start - mkdir -p "${serverfiles}/nativelibs" - if [ -f "${HOME}/.steam/steamcmd/linux64/steamclient.so" ]; then - cp "${HOME}/.steam/steamcmd/linux64/steamclient.so" "${serverfiles}/nativelibs/steamclient.so" - elif [ -f "${steamcmddir}/linux64/steamclient.so" ]; then - cp "${steamcmddir}/linux64/steamclient.so" "${serverfiles}/nativelibs/steamclient.so" - fi - fn_fix_msg_end -fi - # First run requires start with no parms. # After first run new dirs are created. if [ ! -d "${serverfiles}/Creative" ]; then From ee515b7786642ad20ba09a0a22a5bbe6c18a6b4c Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Sun, 20 Sep 2020 14:58:28 +0100 Subject: [PATCH 471/534] feat(alerts): add rocket.chat and alerts refactor (#3051) * update linuxgsm alert logo * add Rocket.chat alert option * Refactor of post details by removing pastebin and hastebin * Improved alert standardisation Co-authored-by: Alasdair Haig Co-authored-by: Alasdair Haig Co-authored-by: AlasdairHaig --- .../config-lgsm/acserver/_default.cfg | 12 +- .../config-lgsm/ahl2server/_default.cfg | 12 +- .../config-lgsm/ahlserver/_default.cfg | 12 +- .../config-lgsm/arkserver/_default.cfg | 12 +- .../config-lgsm/arma3server/_default.cfg | 12 +- .../config-lgsm/avserver/_default.cfg | 12 +- .../config-lgsm/bb2server/_default.cfg | 12 +- .../config-lgsm/bbserver/_default.cfg | 12 +- .../config-lgsm/bdserver/_default.cfg | 12 +- .../config-lgsm/bf1942server/_default.cfg | 12 +- .../config-lgsm/bfvserver/_default.cfg | 12 +- .../config-lgsm/bmdmserver/_default.cfg | 12 +- .../config-lgsm/boserver/_default.cfg | 12 +- .../config-lgsm/bsserver/_default.cfg | 12 +- .../config-lgsm/bt1944server/_default.cfg | 12 +- .../config-lgsm/btserver/_default.cfg | 12 +- .../config-lgsm/ccserver/_default.cfg | 12 +- .../config-lgsm/cmwserver/_default.cfg | 12 +- .../config-lgsm/cod2server/_default.cfg | 12 +- .../config-lgsm/cod4server/_default.cfg | 12 +- .../config-lgsm/codserver/_default.cfg | 12 +- .../config-lgsm/coduoserver/_default.cfg | 12 +- .../config-lgsm/codwawserver/_default.cfg | 12 +- .../config-lgsm/csczserver/_default.cfg | 12 +- .../config-lgsm/csgoserver/_default.cfg | 12 +- .../config-lgsm/csserver/_default.cfg | 12 +- .../config-lgsm/cssserver/_default.cfg | 12 +- .../config-lgsm/dabserver/_default.cfg | 12 +- .../config-lgsm/dmcserver/_default.cfg | 12 +- .../config-lgsm/dodserver/_default.cfg | 12 +- .../config-lgsm/dodsserver/_default.cfg | 12 +- .../config-lgsm/doiserver/_default.cfg | 12 +- .../config-lgsm/dstserver/_default.cfg | 12 +- .../config-lgsm/dysserver/_default.cfg | 12 +- .../config-lgsm/ecoserver/_default.cfg | 12 +- .../config-lgsm/emserver/_default.cfg | 12 +- .../config-lgsm/etlserver/_default.cfg | 12 +- .../config-lgsm/fctrserver/_default.cfg | 12 +- .../config-lgsm/fofserver/_default.cfg | 12 +- .../config-lgsm/gesserver/_default.cfg | 12 +- .../config-lgsm/gmodserver/_default.cfg | 12 +- .../config-lgsm/hl2dmserver/_default.cfg | 12 +- .../config-lgsm/hldmserver/_default.cfg | 12 +- .../config-lgsm/hldmsserver/_default.cfg | 12 +- .../config-lgsm/hwserver/_default.cfg | 12 +- .../config-lgsm/insserver/_default.cfg | 12 +- .../config-lgsm/inssserver/_default.cfg | 12 +- .../config-lgsm/iosserver/_default.cfg | 12 +- .../config-lgsm/jc2server/_default.cfg | 12 +- .../config-lgsm/jc3server/_default.cfg | 12 +- .../config-lgsm/jk2server/_default.cfg | 12 +- .../config-lgsm/kf2server/_default.cfg | 12 +- .../config-lgsm/kfserver/_default.cfg | 12 +- .../config-lgsm/l4d2server/_default.cfg | 12 +- .../config-lgsm/l4dserver/_default.cfg | 12 +- .../config-lgsm/mcbserver/_default.cfg | 12 +- .../config-lgsm/mcserver/_default.cfg | 12 +- .../config-lgsm/mhserver/_default.cfg | 12 +- .../config-lgsm/mohaaserver/_default.cfg | 12 +- .../config-lgsm/momserver/_default.cfg | 12 +- .../config-lgsm/mtaserver/_default.cfg | 12 +- .../config-lgsm/mumbleserver/_default.cfg | 12 +- .../config-lgsm/ndserver/_default.cfg | 12 +- .../config-lgsm/nmrihserver/_default.cfg | 12 +- .../config-lgsm/ns2cserver/_default.cfg | 12 +- .../config-lgsm/ns2server/_default.cfg | 12 +- .../config-lgsm/nsserver/_default.cfg | 12 +- .../config-lgsm/onsetserver/_default.cfg | 12 +- .../config-lgsm/opforserver/_default.cfg | 12 +- .../config-lgsm/pcserver/_default.cfg | 12 +- .../config-lgsm/pstbsserver/_default.cfg | 12 +- .../config-lgsm/pvkiiserver/_default.cfg | 12 +- .../config-lgsm/pzserver/_default.cfg | 12 +- .../config-lgsm/q2server/_default.cfg | 12 +- .../config-lgsm/q3server/_default.cfg | 12 +- .../config-lgsm/qlserver/_default.cfg | 12 +- .../config-lgsm/qwserver/_default.cfg | 12 +- .../config-lgsm/ricochetserver/_default.cfg | 12 +- .../config-lgsm/roserver/_default.cfg | 12 +- .../config-lgsm/rtcwserver/_default.cfg | 12 +- .../config-lgsm/rustserver/_default.cfg | 12 +- .../config-lgsm/rwserver/_default.cfg | 12 +- .../config-lgsm/sampserver/_default.cfg | 12 +- .../config-lgsm/sbotsserver/_default.cfg | 12 +- .../config-lgsm/sbserver/_default.cfg | 12 +- .../config-lgsm/sdtdserver/_default.cfg | 12 +- .../config-lgsm/sfcserver/_default.cfg | 12 +- .../config-lgsm/sof2server/_default.cfg | 12 +- .../config-lgsm/solserver/_default.cfg | 12 +- .../config-lgsm/squadserver/_default.cfg | 12 +- .../config-lgsm/ss3server/_default.cfg | 12 +- .../config-lgsm/stserver/_default.cfg | 12 +- .../config-lgsm/svenserver/_default.cfg | 12 +- .../config-lgsm/terrariaserver/_default.cfg | 12 +- .../config-lgsm/tf2server/_default.cfg | 12 +- .../config-lgsm/tfcserver/_default.cfg | 12 +- .../config-lgsm/ts3server/_default.cfg | 12 +- .../config-lgsm/tsserver/_default.cfg | 12 +- .../config-lgsm/tuserver/_default.cfg | 12 +- .../config-lgsm/twserver/_default.cfg | 12 +- .../config-lgsm/untserver/_default.cfg | 12 +- .../config-lgsm/ut2k4server/_default.cfg | 12 +- .../config-lgsm/ut3server/_default.cfg | 12 +- .../config-lgsm/ut99server/_default.cfg | 12 +- .../config-lgsm/utserver/_default.cfg | 12 +- .../config-lgsm/vsserver/_default.cfg | 12 +- .../config-lgsm/wetserver/_default.cfg | 12 +- .../config-lgsm/wfserver/_default.cfg | 12 +- .../config-lgsm/wurmserver/_default.cfg | 12 +- .../config-lgsm/zmrserver/_default.cfg | 12 +- .../config-lgsm/zpsserver/_default.cfg | 12 +- lgsm/data/alert_discord_logo.jpg | Bin 0 -> 34529 bytes lgsm/data/alert_discord_logo.png | Bin 22166 -> 0 bytes lgsm/functions/README.md | 0 lgsm/functions/alert.sh | 12 ++ lgsm/functions/alert_discord.sh | 18 ++- lgsm/functions/alert_email.sh | 2 +- lgsm/functions/alert_ifttt.sh | 6 +- lgsm/functions/alert_mailgun.sh | 0 lgsm/functions/alert_pushbullet.sh | 4 +- lgsm/functions/alert_pushover.sh | 4 +- lgsm/functions/alert_rocketchat.sh | 53 +++++++++ lgsm/functions/alert_slack.sh | 103 +++++++++--------- lgsm/functions/alert_telegram.sh | 4 +- lgsm/functions/check.sh | 4 +- lgsm/functions/check_config.sh | 0 lgsm/functions/check_deps.sh | 0 lgsm/functions/check_executable.sh | 0 lgsm/functions/check_glibc.sh | 0 lgsm/functions/check_ip.sh | 0 lgsm/functions/check_last_update.sh | 0 lgsm/functions/check_logs.sh | 0 lgsm/functions/check_permissions.sh | 0 lgsm/functions/check_root.sh | 0 lgsm/functions/check_status.sh | 0 lgsm/functions/check_steamcmd.sh | 0 lgsm/functions/check_system_dir.sh | 0 lgsm/functions/check_system_requirements.sh | 0 lgsm/functions/check_tmuxception.sh | 0 lgsm/functions/check_version.sh | 0 lgsm/functions/command_backup.sh | 0 lgsm/functions/command_console.sh | 0 lgsm/functions/command_debug.sh | 0 lgsm/functions/command_details.sh | 0 lgsm/functions/command_dev_clear_functions.sh | 0 lgsm/functions/command_dev_debug.sh | 0 lgsm/functions/command_dev_detect_deps.sh | 0 lgsm/functions/command_dev_detect_glibc.sh | 0 lgsm/functions/command_dev_detect_ldd.sh | 0 lgsm/functions/command_dev_query_raw.sh | 0 lgsm/functions/command_donate.sh | 0 lgsm/functions/command_fastdl.sh | 0 lgsm/functions/command_install.sh | 0 .../command_install_resources_mta.sh | 0 lgsm/functions/command_mods_install.sh | 0 lgsm/functions/command_mods_remove.sh | 0 lgsm/functions/command_mods_update.sh | 0 lgsm/functions/command_monitor.sh | 0 lgsm/functions/command_postdetails.sh | 76 ++----------- lgsm/functions/command_restart.sh | 0 lgsm/functions/command_start.sh | 0 lgsm/functions/command_test_alert.sh | 0 lgsm/functions/command_ts3_server_pass.sh | 0 lgsm/functions/command_update.sh | 0 lgsm/functions/command_update_functions.sh | 0 lgsm/functions/command_update_linuxgsm.sh | 0 lgsm/functions/command_validate.sh | 0 lgsm/functions/command_wipe.sh | 0 lgsm/functions/compress_unreal2_maps.sh | 0 lgsm/functions/compress_ut99_maps.sh | 0 lgsm/functions/core_dl.sh | 0 lgsm/functions/core_exit.sh | 0 lgsm/functions/core_functions.sh | 5 + lgsm/functions/core_getopt.sh | 0 lgsm/functions/core_legacy.sh | 0 lgsm/functions/core_logs.sh | 0 lgsm/functions/core_messages.sh | 0 lgsm/functions/core_trap.sh | 0 lgsm/functions/fix.sh | 0 lgsm/functions/fix_ark.sh | 0 lgsm/functions/fix_arma3.sh | 0 lgsm/functions/fix_av.sh | 0 lgsm/functions/fix_cmw.sh | 0 lgsm/functions/fix_csgo.sh | 0 lgsm/functions/fix_dst.sh | 0 lgsm/functions/fix_ges.sh | 0 lgsm/functions/fix_hw.sh | 0 lgsm/functions/fix_ins.sh | 0 lgsm/functions/fix_kf.sh | 0 lgsm/functions/fix_kf2.sh | 0 lgsm/functions/fix_mcb.sh | 0 lgsm/functions/fix_mta.sh | 0 lgsm/functions/fix_nmrih.sh | 0 lgsm/functions/fix_onset.sh | 0 lgsm/functions/fix_ro.sh | 0 lgsm/functions/fix_rust.sh | 0 lgsm/functions/fix_rw.sh | 0 lgsm/functions/fix_sdtd.sh | 0 lgsm/functions/fix_sfc.sh | 0 lgsm/functions/fix_sof2.sh | 0 lgsm/functions/fix_ss3.sh | 0 lgsm/functions/fix_steamcmd.sh | 0 lgsm/functions/fix_terraria.sh | 0 lgsm/functions/fix_tf2.sh | 0 lgsm/functions/fix_ts3.sh | 0 lgsm/functions/fix_tu.sh | 0 lgsm/functions/fix_unt.sh | 0 lgsm/functions/fix_ut.sh | 0 lgsm/functions/fix_ut2k4.sh | 0 lgsm/functions/fix_ut3.sh | 0 lgsm/functions/fix_wurm.sh | 0 lgsm/functions/fix_zmr.sh | 0 lgsm/functions/info_config.sh | 0 lgsm/functions/info_distro.sh | 2 +- lgsm/functions/info_messages.sh | 17 +-- lgsm/functions/info_parms.sh | 0 lgsm/functions/info_stats.sh | 0 lgsm/functions/install_complete.sh | 0 lgsm/functions/install_config.sh | 0 lgsm/functions/install_dst_token.sh | 0 lgsm/functions/install_eula.sh | 0 lgsm/functions/install_factorio_save.sh | 0 lgsm/functions/install_gslt.sh | 0 lgsm/functions/install_header.sh | 0 lgsm/functions/install_logs.sh | 0 lgsm/functions/install_modules.sh | 0 lgsm/functions/install_mta_resources.sh | 0 lgsm/functions/install_retry.sh | 0 lgsm/functions/install_server_dir.sh | 0 lgsm/functions/install_server_files.sh | 0 lgsm/functions/install_squad_license.sh | 0 lgsm/functions/install_stats.sh | 0 lgsm/functions/install_steamcmd.sh | 0 lgsm/functions/install_ts3db.sh | 0 lgsm/functions/install_ut2k4_key.sh | 0 lgsm/functions/mods_core.sh | 0 lgsm/functions/mods_list.sh | 0 lgsm/functions/query_gamedig.sh | 0 lgsm/functions/query_gsquery.py | 0 lgsm/functions/update_factorio.sh | 0 lgsm/functions/update_minecraft.sh | 0 lgsm/functions/update_minecraft_bedrock.sh | 0 lgsm/functions/update_mta.sh | 0 lgsm/functions/update_mumble.sh | 0 lgsm/functions/update_ts3.sh | 0 tests/tests_defaultcfg/defaultcfg_1.txt | 5 +- 246 files changed, 946 insertions(+), 701 deletions(-) create mode 100644 lgsm/data/alert_discord_logo.jpg delete mode 100644 lgsm/data/alert_discord_logo.png mode change 100644 => 100755 lgsm/functions/README.md mode change 100644 => 100755 lgsm/functions/alert.sh mode change 100644 => 100755 lgsm/functions/alert_discord.sh mode change 100644 => 100755 lgsm/functions/alert_email.sh mode change 100644 => 100755 lgsm/functions/alert_ifttt.sh mode change 100644 => 100755 lgsm/functions/alert_mailgun.sh mode change 100644 => 100755 lgsm/functions/alert_pushbullet.sh mode change 100644 => 100755 lgsm/functions/alert_pushover.sh create mode 100755 lgsm/functions/alert_rocketchat.sh mode change 100644 => 100755 lgsm/functions/alert_slack.sh mode change 100644 => 100755 lgsm/functions/alert_telegram.sh mode change 100644 => 100755 lgsm/functions/check.sh mode change 100644 => 100755 lgsm/functions/check_config.sh mode change 100644 => 100755 lgsm/functions/check_deps.sh mode change 100644 => 100755 lgsm/functions/check_executable.sh mode change 100644 => 100755 lgsm/functions/check_glibc.sh mode change 100644 => 100755 lgsm/functions/check_ip.sh mode change 100644 => 100755 lgsm/functions/check_last_update.sh mode change 100644 => 100755 lgsm/functions/check_logs.sh mode change 100644 => 100755 lgsm/functions/check_permissions.sh mode change 100644 => 100755 lgsm/functions/check_root.sh mode change 100644 => 100755 lgsm/functions/check_status.sh mode change 100644 => 100755 lgsm/functions/check_steamcmd.sh mode change 100644 => 100755 lgsm/functions/check_system_dir.sh mode change 100644 => 100755 lgsm/functions/check_system_requirements.sh mode change 100644 => 100755 lgsm/functions/check_tmuxception.sh mode change 100644 => 100755 lgsm/functions/check_version.sh mode change 100644 => 100755 lgsm/functions/command_backup.sh mode change 100644 => 100755 lgsm/functions/command_console.sh mode change 100644 => 100755 lgsm/functions/command_debug.sh mode change 100644 => 100755 lgsm/functions/command_details.sh mode change 100644 => 100755 lgsm/functions/command_dev_clear_functions.sh mode change 100644 => 100755 lgsm/functions/command_dev_debug.sh mode change 100644 => 100755 lgsm/functions/command_dev_detect_deps.sh mode change 100644 => 100755 lgsm/functions/command_dev_detect_glibc.sh mode change 100644 => 100755 lgsm/functions/command_dev_detect_ldd.sh mode change 100644 => 100755 lgsm/functions/command_dev_query_raw.sh mode change 100644 => 100755 lgsm/functions/command_donate.sh mode change 100644 => 100755 lgsm/functions/command_fastdl.sh mode change 100644 => 100755 lgsm/functions/command_install.sh mode change 100644 => 100755 lgsm/functions/command_install_resources_mta.sh mode change 100644 => 100755 lgsm/functions/command_mods_install.sh mode change 100644 => 100755 lgsm/functions/command_mods_remove.sh mode change 100644 => 100755 lgsm/functions/command_mods_update.sh mode change 100644 => 100755 lgsm/functions/command_monitor.sh mode change 100644 => 100755 lgsm/functions/command_postdetails.sh mode change 100644 => 100755 lgsm/functions/command_restart.sh mode change 100644 => 100755 lgsm/functions/command_start.sh mode change 100644 => 100755 lgsm/functions/command_test_alert.sh mode change 100644 => 100755 lgsm/functions/command_ts3_server_pass.sh mode change 100644 => 100755 lgsm/functions/command_update.sh mode change 100644 => 100755 lgsm/functions/command_update_functions.sh mode change 100644 => 100755 lgsm/functions/command_update_linuxgsm.sh mode change 100644 => 100755 lgsm/functions/command_validate.sh mode change 100644 => 100755 lgsm/functions/command_wipe.sh mode change 100644 => 100755 lgsm/functions/compress_unreal2_maps.sh mode change 100644 => 100755 lgsm/functions/compress_ut99_maps.sh mode change 100644 => 100755 lgsm/functions/core_dl.sh mode change 100644 => 100755 lgsm/functions/core_exit.sh mode change 100644 => 100755 lgsm/functions/core_functions.sh mode change 100644 => 100755 lgsm/functions/core_getopt.sh mode change 100644 => 100755 lgsm/functions/core_legacy.sh mode change 100644 => 100755 lgsm/functions/core_logs.sh mode change 100644 => 100755 lgsm/functions/core_messages.sh mode change 100644 => 100755 lgsm/functions/core_trap.sh mode change 100644 => 100755 lgsm/functions/fix.sh mode change 100644 => 100755 lgsm/functions/fix_ark.sh mode change 100644 => 100755 lgsm/functions/fix_arma3.sh mode change 100644 => 100755 lgsm/functions/fix_av.sh mode change 100644 => 100755 lgsm/functions/fix_cmw.sh mode change 100644 => 100755 lgsm/functions/fix_csgo.sh mode change 100644 => 100755 lgsm/functions/fix_dst.sh mode change 100644 => 100755 lgsm/functions/fix_ges.sh mode change 100644 => 100755 lgsm/functions/fix_hw.sh mode change 100644 => 100755 lgsm/functions/fix_ins.sh mode change 100644 => 100755 lgsm/functions/fix_kf.sh mode change 100644 => 100755 lgsm/functions/fix_kf2.sh mode change 100644 => 100755 lgsm/functions/fix_mcb.sh mode change 100644 => 100755 lgsm/functions/fix_mta.sh mode change 100644 => 100755 lgsm/functions/fix_nmrih.sh mode change 100644 => 100755 lgsm/functions/fix_onset.sh mode change 100644 => 100755 lgsm/functions/fix_ro.sh mode change 100644 => 100755 lgsm/functions/fix_rust.sh mode change 100644 => 100755 lgsm/functions/fix_rw.sh mode change 100644 => 100755 lgsm/functions/fix_sdtd.sh mode change 100644 => 100755 lgsm/functions/fix_sfc.sh mode change 100644 => 100755 lgsm/functions/fix_sof2.sh mode change 100644 => 100755 lgsm/functions/fix_ss3.sh mode change 100644 => 100755 lgsm/functions/fix_steamcmd.sh mode change 100644 => 100755 lgsm/functions/fix_terraria.sh mode change 100644 => 100755 lgsm/functions/fix_tf2.sh mode change 100644 => 100755 lgsm/functions/fix_ts3.sh mode change 100644 => 100755 lgsm/functions/fix_tu.sh mode change 100644 => 100755 lgsm/functions/fix_unt.sh mode change 100644 => 100755 lgsm/functions/fix_ut.sh mode change 100644 => 100755 lgsm/functions/fix_ut2k4.sh mode change 100644 => 100755 lgsm/functions/fix_ut3.sh mode change 100644 => 100755 lgsm/functions/fix_wurm.sh mode change 100644 => 100755 lgsm/functions/fix_zmr.sh mode change 100644 => 100755 lgsm/functions/info_config.sh mode change 100644 => 100755 lgsm/functions/info_distro.sh mode change 100644 => 100755 lgsm/functions/info_messages.sh mode change 100644 => 100755 lgsm/functions/info_parms.sh mode change 100644 => 100755 lgsm/functions/info_stats.sh mode change 100644 => 100755 lgsm/functions/install_complete.sh mode change 100644 => 100755 lgsm/functions/install_config.sh mode change 100644 => 100755 lgsm/functions/install_dst_token.sh mode change 100644 => 100755 lgsm/functions/install_eula.sh mode change 100644 => 100755 lgsm/functions/install_factorio_save.sh mode change 100644 => 100755 lgsm/functions/install_gslt.sh mode change 100644 => 100755 lgsm/functions/install_header.sh mode change 100644 => 100755 lgsm/functions/install_logs.sh mode change 100644 => 100755 lgsm/functions/install_modules.sh mode change 100644 => 100755 lgsm/functions/install_mta_resources.sh mode change 100644 => 100755 lgsm/functions/install_retry.sh mode change 100644 => 100755 lgsm/functions/install_server_dir.sh mode change 100644 => 100755 lgsm/functions/install_server_files.sh mode change 100644 => 100755 lgsm/functions/install_squad_license.sh mode change 100644 => 100755 lgsm/functions/install_stats.sh mode change 100644 => 100755 lgsm/functions/install_steamcmd.sh mode change 100644 => 100755 lgsm/functions/install_ts3db.sh mode change 100644 => 100755 lgsm/functions/install_ut2k4_key.sh mode change 100644 => 100755 lgsm/functions/mods_core.sh mode change 100644 => 100755 lgsm/functions/mods_list.sh mode change 100644 => 100755 lgsm/functions/query_gamedig.sh mode change 100644 => 100755 lgsm/functions/query_gsquery.py mode change 100644 => 100755 lgsm/functions/update_factorio.sh mode change 100644 => 100755 lgsm/functions/update_minecraft.sh mode change 100644 => 100755 lgsm/functions/update_minecraft_bedrock.sh mode change 100644 => 100755 lgsm/functions/update_mta.sh mode change 100644 => 100755 lgsm/functions/update_mumble.sh mode change 100644 => 100755 lgsm/functions/update_ts3.sh diff --git a/lgsm/config-default/config-lgsm/acserver/_default.cfg b/lgsm/config-default/config-lgsm/acserver/_default.cfg index f5d713d11..f64c34ac3 100644 --- a/lgsm/config-default/config-lgsm/acserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/acserver/_default.cfg @@ -35,8 +35,6 @@ displayip="" # More info | https://docs.linuxgsm.com/alerts#more-info postalert="off" -postdays="7" -posttarget="https://termbin.com" # Discord Alerts | https://docs.linuxgsm.com/alerts/discord discordalert="off" @@ -70,14 +68,18 @@ pushoveralert="off" pushovertoken="accesstoken" pushoveruserkey="userkey" +# Rocket.Chat Alerts | https://docs.linuxgsm.com/alerts/rocket.chat +rocketchatalert="off" +rocketchatwebhook="webhook" +rocketchattoken="" + # Slack Alerts | https://docs.linuxgsm.com/alerts/slack slackalert="off" slackwebhook="webhook" # Telegram Alerts | https://docs.linuxgsm.com/alerts/telegram -# You can add a custom cURL string eg proxy (useful in Russia) or else in "curlcustomstring". -# like a "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help", if you not need -# any custom string in curl - simple ignore this parameter. +# You can add a custom cURL string eg proxy (useful in Russia) in "curlcustomstring". +# For example "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help". telegramalert="off" telegramtoken="accesstoken" telegramchatid="" diff --git a/lgsm/config-default/config-lgsm/ahl2server/_default.cfg b/lgsm/config-default/config-lgsm/ahl2server/_default.cfg index 11640872b..505076703 100644 --- a/lgsm/config-default/config-lgsm/ahl2server/_default.cfg +++ b/lgsm/config-default/config-lgsm/ahl2server/_default.cfg @@ -41,8 +41,6 @@ displayip="" # More info | https://docs.linuxgsm.com/alerts#more-info postalert="off" -postdays="7" -posttarget="https://termbin.com" # Discord Alerts | https://docs.linuxgsm.com/alerts/discord discordalert="off" @@ -76,14 +74,18 @@ pushoveralert="off" pushovertoken="accesstoken" pushoveruserkey="userkey" +# Rocket.Chat Alerts | https://docs.linuxgsm.com/alerts/rocket.chat +rocketchatalert="off" +rocketchatwebhook="webhook" +rocketchattoken="" + # Slack Alerts | https://docs.linuxgsm.com/alerts/slack slackalert="off" slackwebhook="webhook" # Telegram Alerts | https://docs.linuxgsm.com/alerts/telegram -# You can add a custom cURL string eg proxy (useful in Russia) or else in "curlcustomstring". -# like a "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help", if you not need -# any custom string in curl - simple ignore this parameter. +# You can add a custom cURL string eg proxy (useful in Russia) in "curlcustomstring". +# For example "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help". telegramalert="off" telegramtoken="accesstoken" telegramchatid="" diff --git a/lgsm/config-default/config-lgsm/ahlserver/_default.cfg b/lgsm/config-default/config-lgsm/ahlserver/_default.cfg index 692557c81..9e52094a0 100644 --- a/lgsm/config-default/config-lgsm/ahlserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/ahlserver/_default.cfg @@ -36,8 +36,6 @@ displayip="" # More info | https://docs.linuxgsm.com/alerts#more-info postalert="off" -postdays="7" -posttarget="https://termbin.com" # Discord Alerts | https://docs.linuxgsm.com/alerts/discord discordalert="off" @@ -71,14 +69,18 @@ pushoveralert="off" pushovertoken="accesstoken" pushoveruserkey="userkey" +# Rocket.Chat Alerts | https://docs.linuxgsm.com/alerts/rocket.chat +rocketchatalert="off" +rocketchatwebhook="webhook" +rocketchattoken="" + # Slack Alerts | https://docs.linuxgsm.com/alerts/slack slackalert="off" slackwebhook="webhook" # Telegram Alerts | https://docs.linuxgsm.com/alerts/telegram -# You can add a custom cURL string eg proxy (useful in Russia) or else in "curlcustomstring". -# like a "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help", if you not need -# any custom string in curl - simple ignore this parameter. +# You can add a custom cURL string eg proxy (useful in Russia) in "curlcustomstring". +# For example "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help". telegramalert="off" telegramtoken="accesstoken" telegramchatid="" diff --git a/lgsm/config-default/config-lgsm/arkserver/_default.cfg b/lgsm/config-default/config-lgsm/arkserver/_default.cfg index 54d2ef29c..f289cd1fb 100644 --- a/lgsm/config-default/config-lgsm/arkserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/arkserver/_default.cfg @@ -39,8 +39,6 @@ displayip="" # More info | https://docs.linuxgsm.com/alerts#more-info postalert="off" -postdays="7" -posttarget="https://termbin.com" # Discord Alerts | https://docs.linuxgsm.com/alerts/discord discordalert="off" @@ -74,14 +72,18 @@ pushoveralert="off" pushovertoken="accesstoken" pushoveruserkey="userkey" +# Rocket.Chat Alerts | https://docs.linuxgsm.com/alerts/rocket.chat +rocketchatalert="off" +rocketchatwebhook="webhook" +rocketchattoken="" + # Slack Alerts | https://docs.linuxgsm.com/alerts/slack slackalert="off" slackwebhook="webhook" # Telegram Alerts | https://docs.linuxgsm.com/alerts/telegram -# You can add a custom cURL string eg proxy (useful in Russia) or else in "curlcustomstring". -# like a "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help", if you not need -# any custom string in curl - simple ignore this parameter. +# You can add a custom cURL string eg proxy (useful in Russia) in "curlcustomstring". +# For example "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help". telegramalert="off" telegramtoken="accesstoken" telegramchatid="" diff --git a/lgsm/config-default/config-lgsm/arma3server/_default.cfg b/lgsm/config-default/config-lgsm/arma3server/_default.cfg index 08d9afa3b..acdbedb59 100644 --- a/lgsm/config-default/config-lgsm/arma3server/_default.cfg +++ b/lgsm/config-default/config-lgsm/arma3server/_default.cfg @@ -52,8 +52,6 @@ displayip="" # More info | https://docs.linuxgsm.com/alerts#more-info postalert="off" -postdays="7" -posttarget="https://termbin.com" # Discord Alerts | https://docs.linuxgsm.com/alerts/discord discordalert="off" @@ -87,14 +85,18 @@ pushoveralert="off" pushovertoken="accesstoken" pushoveruserkey="userkey" +# Rocket.Chat Alerts | https://docs.linuxgsm.com/alerts/rocket.chat +rocketchatalert="off" +rocketchatwebhook="webhook" +rocketchattoken="" + # Slack Alerts | https://docs.linuxgsm.com/alerts/slack slackalert="off" slackwebhook="webhook" # Telegram Alerts | https://docs.linuxgsm.com/alerts/telegram -# You can add a custom cURL string eg proxy (useful in Russia) or else in "curlcustomstring". -# like a "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help", if you not need -# any custom string in curl - simple ignore this parameter. +# You can add a custom cURL string eg proxy (useful in Russia) in "curlcustomstring". +# For example "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help". telegramalert="off" telegramtoken="accesstoken" telegramchatid="" diff --git a/lgsm/config-default/config-lgsm/avserver/_default.cfg b/lgsm/config-default/config-lgsm/avserver/_default.cfg index 047fbe8b0..a8e6fb049 100644 --- a/lgsm/config-default/config-lgsm/avserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/avserver/_default.cfg @@ -36,8 +36,6 @@ displayip="" # More info | https://docs.linuxgsm.com/alerts#more-info postalert="off" -postdays="7" -posttarget="https://termbin.com" # Discord Alerts | https://docs.linuxgsm.com/alerts/discord discordalert="off" @@ -71,14 +69,18 @@ pushoveralert="off" pushovertoken="accesstoken" pushoveruserkey="userkey" +# Rocket.Chat Alerts | https://docs.linuxgsm.com/alerts/rocket.chat +rocketchatalert="off" +rocketchatwebhook="webhook" +rocketchattoken="" + # Slack Alerts | https://docs.linuxgsm.com/alerts/slack slackalert="off" slackwebhook="webhook" # Telegram Alerts | https://docs.linuxgsm.com/alerts/telegram -# You can add a custom cURL string eg proxy (useful in Russia) or else in "curlcustomstring". -# like a "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help", if you not need -# any custom string in curl - simple ignore this parameter. +# You can add a custom cURL string eg proxy (useful in Russia) in "curlcustomstring". +# For example "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help". telegramalert="off" telegramtoken="accesstoken" telegramchatid="" diff --git a/lgsm/config-default/config-lgsm/bb2server/_default.cfg b/lgsm/config-default/config-lgsm/bb2server/_default.cfg index a71b69bd1..2f35f1c9d 100644 --- a/lgsm/config-default/config-lgsm/bb2server/_default.cfg +++ b/lgsm/config-default/config-lgsm/bb2server/_default.cfg @@ -42,8 +42,6 @@ displayip="" # More info | https://docs.linuxgsm.com/alerts#more-info postalert="off" -postdays="7" -posttarget="https://termbin.com" # Discord Alerts | https://docs.linuxgsm.com/alerts/discord discordalert="off" @@ -77,14 +75,18 @@ pushoveralert="off" pushovertoken="accesstoken" pushoveruserkey="userkey" +# Rocket.Chat Alerts | https://docs.linuxgsm.com/alerts/rocket.chat +rocketchatalert="off" +rocketchatwebhook="webhook" +rocketchattoken="" + # Slack Alerts | https://docs.linuxgsm.com/alerts/slack slackalert="off" slackwebhook="webhook" # Telegram Alerts | https://docs.linuxgsm.com/alerts/telegram -# You can add a custom cURL string eg proxy (useful in Russia) or else in "curlcustomstring". -# like a "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help", if you not need -# any custom string in curl - simple ignore this parameter. +# You can add a custom cURL string eg proxy (useful in Russia) in "curlcustomstring". +# For example "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help". telegramalert="off" telegramtoken="accesstoken" telegramchatid="" diff --git a/lgsm/config-default/config-lgsm/bbserver/_default.cfg b/lgsm/config-default/config-lgsm/bbserver/_default.cfg index ae207ff1b..573c9964b 100644 --- a/lgsm/config-default/config-lgsm/bbserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/bbserver/_default.cfg @@ -36,8 +36,6 @@ displayip="" # More info | https://docs.linuxgsm.com/alerts#more-info postalert="off" -postdays="7" -posttarget="https://termbin.com" # Discord Alerts | https://docs.linuxgsm.com/alerts/discord discordalert="off" @@ -71,14 +69,18 @@ pushoveralert="off" pushovertoken="accesstoken" pushoveruserkey="userkey" +# Rocket.Chat Alerts | https://docs.linuxgsm.com/alerts/rocket.chat +rocketchatalert="off" +rocketchatwebhook="webhook" +rocketchattoken="" + # Slack Alerts | https://docs.linuxgsm.com/alerts/slack slackalert="off" slackwebhook="webhook" # Telegram Alerts | https://docs.linuxgsm.com/alerts/telegram -# You can add a custom cURL string eg proxy (useful in Russia) or else in "curlcustomstring". -# like a "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help", if you not need -# any custom string in curl - simple ignore this parameter. +# You can add a custom cURL string eg proxy (useful in Russia) in "curlcustomstring". +# For example "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help". telegramalert="off" telegramtoken="accesstoken" telegramchatid="" diff --git a/lgsm/config-default/config-lgsm/bdserver/_default.cfg b/lgsm/config-default/config-lgsm/bdserver/_default.cfg index d4f0fc913..746169c5b 100644 --- a/lgsm/config-default/config-lgsm/bdserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/bdserver/_default.cfg @@ -36,8 +36,6 @@ displayip="" # More info | https://docs.linuxgsm.com/alerts#more-info postalert="off" -postdays="7" -posttarget="https://termbin.com" # Discord Alerts | https://docs.linuxgsm.com/alerts/discord discordalert="off" @@ -71,14 +69,18 @@ pushoveralert="off" pushovertoken="accesstoken" pushoveruserkey="userkey" +# Rocket.Chat Alerts | https://docs.linuxgsm.com/alerts/rocket.chat +rocketchatalert="off" +rocketchatwebhook="webhook" +rocketchattoken="" + # Slack Alerts | https://docs.linuxgsm.com/alerts/slack slackalert="off" slackwebhook="webhook" # Telegram Alerts | https://docs.linuxgsm.com/alerts/telegram -# You can add a custom cURL string eg proxy (useful in Russia) or else in "curlcustomstring". -# like a "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help", if you not need -# any custom string in curl - simple ignore this parameter. +# You can add a custom cURL string eg proxy (useful in Russia) in "curlcustomstring". +# For example "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help". telegramalert="off" telegramtoken="accesstoken" telegramchatid="" diff --git a/lgsm/config-default/config-lgsm/bf1942server/_default.cfg b/lgsm/config-default/config-lgsm/bf1942server/_default.cfg index 435a5d8c7..6a498aaaf 100644 --- a/lgsm/config-default/config-lgsm/bf1942server/_default.cfg +++ b/lgsm/config-default/config-lgsm/bf1942server/_default.cfg @@ -29,8 +29,6 @@ displayip="" # More info | https://docs.linuxgsm.com/alerts#more-info postalert="off" -postdays="7" -posttarget="https://termbin.com" # Discord Alerts | https://docs.linuxgsm.com/alerts/discord discordalert="off" @@ -64,14 +62,18 @@ pushoveralert="off" pushovertoken="accesstoken" pushoveruserkey="userkey" +# Rocket.Chat Alerts | https://docs.linuxgsm.com/alerts/rocket.chat +rocketchatalert="off" +rocketchatwebhook="webhook" +rocketchattoken="" + # Slack Alerts | https://docs.linuxgsm.com/alerts/slack slackalert="off" slackwebhook="webhook" # Telegram Alerts | https://docs.linuxgsm.com/alerts/telegram -# You can add a custom cURL string eg proxy (useful in Russia) or else in "curlcustomstring". -# like a "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help", if you not need -# any custom string in curl - simple ignore this parameter. +# You can add a custom cURL string eg proxy (useful in Russia) in "curlcustomstring". +# For example "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help". telegramalert="off" telegramtoken="accesstoken" telegramchatid="" diff --git a/lgsm/config-default/config-lgsm/bfvserver/_default.cfg b/lgsm/config-default/config-lgsm/bfvserver/_default.cfg index 69b6d5f1e..a62b9cdcd 100644 --- a/lgsm/config-default/config-lgsm/bfvserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/bfvserver/_default.cfg @@ -29,8 +29,6 @@ displayip="" # More info | https://docs.linuxgsm.com/alerts#more-info postalert="off" -postdays="7" -posttarget="https://termbin.com" # Discord Alerts | https://docs.linuxgsm.com/alerts/discord discordalert="off" @@ -64,14 +62,18 @@ pushoveralert="off" pushovertoken="accesstoken" pushoveruserkey="userkey" +# Rocket.Chat Alerts | https://docs.linuxgsm.com/alerts/rocket.chat +rocketchatalert="off" +rocketchatwebhook="webhook" +rocketchattoken="" + # Slack Alerts | https://docs.linuxgsm.com/alerts/slack slackalert="off" slackwebhook="webhook" # Telegram Alerts | https://docs.linuxgsm.com/alerts/telegram -# You can add a custom cURL string eg proxy (useful in Russia) or else in "curlcustomstring". -# like a "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help", if you not need -# any custom string in curl - simple ignore this parameter. +# You can add a custom cURL string eg proxy (useful in Russia) in "curlcustomstring". +# For example "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help". telegramalert="off" telegramtoken="accesstoken" telegramchatid="" diff --git a/lgsm/config-default/config-lgsm/bmdmserver/_default.cfg b/lgsm/config-default/config-lgsm/bmdmserver/_default.cfg index e6b7ef772..b9ebbce02 100644 --- a/lgsm/config-default/config-lgsm/bmdmserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/bmdmserver/_default.cfg @@ -42,8 +42,6 @@ displayip="" # More info | https://docs.linuxgsm.com/alerts#more-info postalert="off" -postdays="7" -posttarget="https://termbin.com" # Discord Alerts | https://docs.linuxgsm.com/alerts/discord discordalert="off" @@ -77,14 +75,18 @@ pushoveralert="off" pushovertoken="accesstoken" pushoveruserkey="userkey" +# Rocket.Chat Alerts | https://docs.linuxgsm.com/alerts/rocket.chat +rocketchatalert="off" +rocketchatwebhook="webhook" +rocketchattoken="" + # Slack Alerts | https://docs.linuxgsm.com/alerts/slack slackalert="off" slackwebhook="webhook" # Telegram Alerts | https://docs.linuxgsm.com/alerts/telegram -# You can add a custom cURL string eg proxy (useful in Russia) or else in "curlcustomstring". -# like a "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help", if you not need -# any custom string in curl - simple ignore this parameter. +# You can add a custom cURL string eg proxy (useful in Russia) in "curlcustomstring". +# For example "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help". telegramalert="off" telegramtoken="accesstoken" telegramchatid="" diff --git a/lgsm/config-default/config-lgsm/boserver/_default.cfg b/lgsm/config-default/config-lgsm/boserver/_default.cfg index e7de73d0f..907f72a4c 100644 --- a/lgsm/config-default/config-lgsm/boserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/boserver/_default.cfg @@ -35,8 +35,6 @@ displayip="" # More info | https://docs.linuxgsm.com/alerts#more-info postalert="off" -postdays="7" -posttarget="https://termbin.com" # Discord Alerts | https://docs.linuxgsm.com/alerts/discord discordalert="off" @@ -70,14 +68,18 @@ pushoveralert="off" pushovertoken="accesstoken" pushoveruserkey="userkey" +# Rocket.Chat Alerts | https://docs.linuxgsm.com/alerts/rocket.chat +rocketchatalert="off" +rocketchatwebhook="webhook" +rocketchattoken="" + # Slack Alerts | https://docs.linuxgsm.com/alerts/slack slackalert="off" slackwebhook="webhook" # Telegram Alerts | https://docs.linuxgsm.com/alerts/telegram -# You can add a custom cURL string eg proxy (useful in Russia) or else in "curlcustomstring". -# like a "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help", if you not need -# any custom string in curl - simple ignore this parameter. +# You can add a custom cURL string eg proxy (useful in Russia) in "curlcustomstring". +# For example "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help". telegramalert="off" telegramtoken="accesstoken" telegramchatid="" diff --git a/lgsm/config-default/config-lgsm/bsserver/_default.cfg b/lgsm/config-default/config-lgsm/bsserver/_default.cfg index cf08b5161..f23980d49 100644 --- a/lgsm/config-default/config-lgsm/bsserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/bsserver/_default.cfg @@ -46,8 +46,6 @@ displayip="" # More info | https://docs.linuxgsm.com/alerts#more-info postalert="off" -postdays="7" -posttarget="https://termbin.com" # Discord Alerts | https://docs.linuxgsm.com/alerts/discord discordalert="off" @@ -81,14 +79,18 @@ pushoveralert="off" pushovertoken="accesstoken" pushoveruserkey="userkey" +# Rocket.Chat Alerts | https://docs.linuxgsm.com/alerts/rocket.chat +rocketchatalert="off" +rocketchatwebhook="webhook" +rocketchattoken="" + # Slack Alerts | https://docs.linuxgsm.com/alerts/slack slackalert="off" slackwebhook="webhook" # Telegram Alerts | https://docs.linuxgsm.com/alerts/telegram -# You can add a custom cURL string eg proxy (useful in Russia) or else in "curlcustomstring". -# like a "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help", if you not need -# any custom string in curl - simple ignore this parameter. +# You can add a custom cURL string eg proxy (useful in Russia) in "curlcustomstring". +# For example "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help". telegramalert="off" telegramtoken="accesstoken" telegramchatid="" diff --git a/lgsm/config-default/config-lgsm/bt1944server/_default.cfg b/lgsm/config-default/config-lgsm/bt1944server/_default.cfg index d91e8a011..84b059dbe 100644 --- a/lgsm/config-default/config-lgsm/bt1944server/_default.cfg +++ b/lgsm/config-default/config-lgsm/bt1944server/_default.cfg @@ -34,8 +34,6 @@ displayip="" # More info | https://docs.linuxgsm.com/alerts#more-info postalert="off" -postdays="7" -posttarget="https://termbin.com" # Discord Alerts | https://docs.linuxgsm.com/alerts/discord discordalert="off" @@ -69,14 +67,18 @@ pushoveralert="off" pushovertoken="accesstoken" pushoveruserkey="userkey" +# Rocket.Chat Alerts | https://docs.linuxgsm.com/alerts/rocket.chat +rocketchatalert="off" +rocketchatwebhook="webhook" +rocketchattoken="" + # Slack Alerts | https://docs.linuxgsm.com/alerts/slack slackalert="off" slackwebhook="webhook" # Telegram Alerts | https://docs.linuxgsm.com/alerts/telegram -# You can add a custom cURL string eg proxy (useful in Russia) or else in "curlcustomstring". -# like a "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help", if you not need -# any custom string in curl - simple ignore this parameter. +# You can add a custom cURL string eg proxy (useful in Russia) in "curlcustomstring". +# For example "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help". telegramalert="off" telegramtoken="accesstoken" telegramchatid="" diff --git a/lgsm/config-default/config-lgsm/btserver/_default.cfg b/lgsm/config-default/config-lgsm/btserver/_default.cfg index b18c5cf47..c22a70533 100644 --- a/lgsm/config-default/config-lgsm/btserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/btserver/_default.cfg @@ -29,8 +29,6 @@ displayip="" # More info | https://docs.linuxgsm.com/alerts#more-info postalert="off" -postdays="7" -posttarget="https://termbin.com" # Discord Alerts | https://docs.linuxgsm.com/alerts/discord discordalert="off" @@ -64,14 +62,18 @@ pushoveralert="off" pushovertoken="accesstoken" pushoveruserkey="userkey" +# Rocket.Chat Alerts | https://docs.linuxgsm.com/alerts/rocket.chat +rocketchatalert="off" +rocketchatwebhook="webhook" +rocketchattoken="" + # Slack Alerts | https://docs.linuxgsm.com/alerts/slack slackalert="off" slackwebhook="webhook" # Telegram Alerts | https://docs.linuxgsm.com/alerts/telegram -# You can add a custom cURL string eg proxy (useful in Russia) or else in "curlcustomstring". -# like a "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help", if you not need -# any custom string in curl - simple ignore this parameter. +# You can add a custom cURL string eg proxy (useful in Russia) in "curlcustomstring". +# For example "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help". telegramalert="off" telegramtoken="accesstoken" telegramchatid="" diff --git a/lgsm/config-default/config-lgsm/ccserver/_default.cfg b/lgsm/config-default/config-lgsm/ccserver/_default.cfg index 6779aa7f3..202535ce1 100644 --- a/lgsm/config-default/config-lgsm/ccserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/ccserver/_default.cfg @@ -37,8 +37,6 @@ displayip="" # More info | https://docs.linuxgsm.com/alerts#more-info postalert="off" -postdays="7" -posttarget="https://termbin.com" # Discord Alerts | https://docs.linuxgsm.com/alerts/discord discordalert="off" @@ -72,14 +70,18 @@ pushoveralert="off" pushovertoken="accesstoken" pushoveruserkey="userkey" +# Rocket.Chat Alerts | https://docs.linuxgsm.com/alerts/rocket.chat +rocketchatalert="off" +rocketchatwebhook="webhook" +rocketchattoken="" + # Slack Alerts | https://docs.linuxgsm.com/alerts/slack slackalert="off" slackwebhook="webhook" # Telegram Alerts | https://docs.linuxgsm.com/alerts/telegram -# You can add a custom cURL string eg proxy (useful in Russia) or else in "curlcustomstring". -# like a "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help", if you not need -# any custom string in curl - simple ignore this parameter. +# You can add a custom cURL string eg proxy (useful in Russia) in "curlcustomstring". +# For example "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help". telegramalert="off" telegramtoken="accesstoken" telegramchatid="" diff --git a/lgsm/config-default/config-lgsm/cmwserver/_default.cfg b/lgsm/config-default/config-lgsm/cmwserver/_default.cfg index dd86deeef..3f3e29c8b 100644 --- a/lgsm/config-default/config-lgsm/cmwserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/cmwserver/_default.cfg @@ -38,8 +38,6 @@ displayip="" # More info | https://docs.linuxgsm.com/alerts#more-info postalert="off" -postdays="7" -posttarget="https://termbin.com" # Discord Alerts | https://docs.linuxgsm.com/alerts/discord discordalert="off" @@ -73,14 +71,18 @@ pushoveralert="off" pushovertoken="accesstoken" pushoveruserkey="userkey" +# Rocket.Chat Alerts | https://docs.linuxgsm.com/alerts/rocket.chat +rocketchatalert="off" +rocketchatwebhook="webhook" +rocketchattoken="" + # Slack Alerts | https://docs.linuxgsm.com/alerts/slack slackalert="off" slackwebhook="webhook" # Telegram Alerts | https://docs.linuxgsm.com/alerts/telegram -# You can add a custom cURL string eg proxy (useful in Russia) or else in "curlcustomstring". -# like a "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help", if you not need -# any custom string in curl - simple ignore this parameter. +# You can add a custom cURL string eg proxy (useful in Russia) in "curlcustomstring". +# For example "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help". telegramalert="off" telegramtoken="accesstoken" telegramchatid="" diff --git a/lgsm/config-default/config-lgsm/cod2server/_default.cfg b/lgsm/config-default/config-lgsm/cod2server/_default.cfg index f2f0d465a..9dfb852e5 100644 --- a/lgsm/config-default/config-lgsm/cod2server/_default.cfg +++ b/lgsm/config-default/config-lgsm/cod2server/_default.cfg @@ -35,8 +35,6 @@ displayip="" # More info | https://docs.linuxgsm.com/alerts#more-info postalert="off" -postdays="7" -posttarget="https://termbin.com" # Discord Alerts | https://docs.linuxgsm.com/alerts/discord discordalert="off" @@ -70,14 +68,18 @@ pushoveralert="off" pushovertoken="accesstoken" pushoveruserkey="userkey" +# Rocket.Chat Alerts | https://docs.linuxgsm.com/alerts/rocket.chat +rocketchatalert="off" +rocketchatwebhook="webhook" +rocketchattoken="" + # Slack Alerts | https://docs.linuxgsm.com/alerts/slack slackalert="off" slackwebhook="webhook" # Telegram Alerts | https://docs.linuxgsm.com/alerts/telegram -# You can add a custom cURL string eg proxy (useful in Russia) or else in "curlcustomstring". -# like a "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help", if you not need -# any custom string in curl - simple ignore this parameter. +# You can add a custom cURL string eg proxy (useful in Russia) in "curlcustomstring". +# For example "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help". telegramalert="off" telegramtoken="accesstoken" telegramchatid="" diff --git a/lgsm/config-default/config-lgsm/cod4server/_default.cfg b/lgsm/config-default/config-lgsm/cod4server/_default.cfg index cdda7d813..b5ee4bc63 100644 --- a/lgsm/config-default/config-lgsm/cod4server/_default.cfg +++ b/lgsm/config-default/config-lgsm/cod4server/_default.cfg @@ -35,8 +35,6 @@ displayip="" # More info | https://docs.linuxgsm.com/alerts#more-info postalert="off" -postdays="7" -posttarget="https://termbin.com" # Discord Alerts | https://docs.linuxgsm.com/alerts/discord discordalert="off" @@ -70,14 +68,18 @@ pushoveralert="off" pushovertoken="accesstoken" pushoveruserkey="userkey" +# Rocket.Chat Alerts | https://docs.linuxgsm.com/alerts/rocket.chat +rocketchatalert="off" +rocketchatwebhook="webhook" +rocketchattoken="" + # Slack Alerts | https://docs.linuxgsm.com/alerts/slack slackalert="off" slackwebhook="webhook" # Telegram Alerts | https://docs.linuxgsm.com/alerts/telegram -# You can add a custom cURL string eg proxy (useful in Russia) or else in "curlcustomstring". -# like a "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help", if you not need -# any custom string in curl - simple ignore this parameter. +# You can add a custom cURL string eg proxy (useful in Russia) in "curlcustomstring". +# For example "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help". telegramalert="off" telegramtoken="accesstoken" telegramchatid="" diff --git a/lgsm/config-default/config-lgsm/codserver/_default.cfg b/lgsm/config-default/config-lgsm/codserver/_default.cfg index 0eeb9e724..377c2e6e4 100644 --- a/lgsm/config-default/config-lgsm/codserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/codserver/_default.cfg @@ -35,8 +35,6 @@ displayip="" # More info | https://docs.linuxgsm.com/alerts#more-info postalert="off" -postdays="7" -posttarget="https://termbin.com" # Discord Alerts | https://docs.linuxgsm.com/alerts/discord discordalert="off" @@ -70,14 +68,18 @@ pushoveralert="off" pushovertoken="accesstoken" pushoveruserkey="userkey" +# Rocket.Chat Alerts | https://docs.linuxgsm.com/alerts/rocket.chat +rocketchatalert="off" +rocketchatwebhook="webhook" +rocketchattoken="" + # Slack Alerts | https://docs.linuxgsm.com/alerts/slack slackalert="off" slackwebhook="webhook" # Telegram Alerts | https://docs.linuxgsm.com/alerts/telegram -# You can add a custom cURL string eg proxy (useful in Russia) or else in "curlcustomstring". -# like a "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help", if you not need -# any custom string in curl - simple ignore this parameter. +# You can add a custom cURL string eg proxy (useful in Russia) in "curlcustomstring". +# For example "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help". telegramalert="off" telegramtoken="accesstoken" telegramchatid="" diff --git a/lgsm/config-default/config-lgsm/coduoserver/_default.cfg b/lgsm/config-default/config-lgsm/coduoserver/_default.cfg index cd053b8a6..0f179903a 100644 --- a/lgsm/config-default/config-lgsm/coduoserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/coduoserver/_default.cfg @@ -35,8 +35,6 @@ displayip="" # More info | https://docs.linuxgsm.com/alerts#more-info postalert="off" -postdays="7" -posttarget="https://termbin.com" # Discord Alerts | https://docs.linuxgsm.com/alerts/discord discordalert="off" @@ -70,14 +68,18 @@ pushoveralert="off" pushovertoken="accesstoken" pushoveruserkey="userkey" +# Rocket.Chat Alerts | https://docs.linuxgsm.com/alerts/rocket.chat +rocketchatalert="off" +rocketchatwebhook="webhook" +rocketchattoken="" + # Slack Alerts | https://docs.linuxgsm.com/alerts/slack slackalert="off" slackwebhook="webhook" # Telegram Alerts | https://docs.linuxgsm.com/alerts/telegram -# You can add a custom cURL string eg proxy (useful in Russia) or else in "curlcustomstring". -# like a "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help", if you not need -# any custom string in curl - simple ignore this parameter. +# You can add a custom cURL string eg proxy (useful in Russia) in "curlcustomstring". +# For example "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help". telegramalert="off" telegramtoken="accesstoken" telegramchatid="" diff --git a/lgsm/config-default/config-lgsm/codwawserver/_default.cfg b/lgsm/config-default/config-lgsm/codwawserver/_default.cfg index 84b3ebfb0..1430387bc 100644 --- a/lgsm/config-default/config-lgsm/codwawserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/codwawserver/_default.cfg @@ -35,8 +35,6 @@ displayip="" # More info | https://docs.linuxgsm.com/alerts#more-info postalert="off" -postdays="7" -posttarget="https://termbin.com" # Discord Alerts | https://docs.linuxgsm.com/alerts/discord discordalert="off" @@ -70,14 +68,18 @@ pushoveralert="off" pushovertoken="accesstoken" pushoveruserkey="userkey" +# Rocket.Chat Alerts | https://docs.linuxgsm.com/alerts/rocket.chat +rocketchatalert="off" +rocketchatwebhook="webhook" +rocketchattoken="" + # Slack Alerts | https://docs.linuxgsm.com/alerts/slack slackalert="off" slackwebhook="webhook" # Telegram Alerts | https://docs.linuxgsm.com/alerts/telegram -# You can add a custom cURL string eg proxy (useful in Russia) or else in "curlcustomstring". -# like a "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help", if you not need -# any custom string in curl - simple ignore this parameter. +# You can add a custom cURL string eg proxy (useful in Russia) in "curlcustomstring". +# For example "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help". telegramalert="off" telegramtoken="accesstoken" telegramchatid="" diff --git a/lgsm/config-default/config-lgsm/csczserver/_default.cfg b/lgsm/config-default/config-lgsm/csczserver/_default.cfg index 1db105d3c..a0fb7fea8 100644 --- a/lgsm/config-default/config-lgsm/csczserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/csczserver/_default.cfg @@ -36,8 +36,6 @@ displayip="" # More info | https://docs.linuxgsm.com/alerts#more-info postalert="off" -postdays="7" -posttarget="https://termbin.com" # Discord Alerts | https://docs.linuxgsm.com/alerts/discord discordalert="off" @@ -71,14 +69,18 @@ pushoveralert="off" pushovertoken="accesstoken" pushoveruserkey="userkey" +# Rocket.Chat Alerts | https://docs.linuxgsm.com/alerts/rocket.chat +rocketchatalert="off" +rocketchatwebhook="webhook" +rocketchattoken="" + # Slack Alerts | https://docs.linuxgsm.com/alerts/slack slackalert="off" slackwebhook="webhook" # Telegram Alerts | https://docs.linuxgsm.com/alerts/telegram -# You can add a custom cURL string eg proxy (useful in Russia) or else in "curlcustomstring". -# like a "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help", if you not need -# any custom string in curl - simple ignore this parameter. +# You can add a custom cURL string eg proxy (useful in Russia) in "curlcustomstring". +# For example "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help". telegramalert="off" telegramtoken="accesstoken" telegramchatid="" diff --git a/lgsm/config-default/config-lgsm/csgoserver/_default.cfg b/lgsm/config-default/config-lgsm/csgoserver/_default.cfg index 12ef8aa90..2ed74049e 100644 --- a/lgsm/config-default/config-lgsm/csgoserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/csgoserver/_default.cfg @@ -62,8 +62,6 @@ displayip="" # More info | https://docs.linuxgsm.com/alerts#more-info postalert="off" -postdays="7" -posttarget="https://termbin.com" # Discord Alerts | https://docs.linuxgsm.com/alerts/discord discordalert="off" @@ -97,14 +95,18 @@ pushoveralert="off" pushovertoken="accesstoken" pushoveruserkey="userkey" +# Rocket.Chat Alerts | https://docs.linuxgsm.com/alerts/rocket.chat +rocketchatalert="off" +rocketchatwebhook="webhook" +rocketchattoken="" + # Slack Alerts | https://docs.linuxgsm.com/alerts/slack slackalert="off" slackwebhook="webhook" # Telegram Alerts | https://docs.linuxgsm.com/alerts/telegram -# You can add a custom cURL string eg proxy (useful in Russia) or else in "curlcustomstring". -# like a "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help", if you not need -# any custom string in curl - simple ignore this parameter. +# You can add a custom cURL string eg proxy (useful in Russia) in "curlcustomstring". +# For example "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help". telegramalert="off" telegramtoken="accesstoken" telegramchatid="" diff --git a/lgsm/config-default/config-lgsm/csserver/_default.cfg b/lgsm/config-default/config-lgsm/csserver/_default.cfg index 924c88539..a5661c890 100644 --- a/lgsm/config-default/config-lgsm/csserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/csserver/_default.cfg @@ -36,8 +36,6 @@ displayip="" # More info | https://docs.linuxgsm.com/alerts#more-info postalert="off" -postdays="7" -posttarget="https://termbin.com" # Discord Alerts | https://docs.linuxgsm.com/alerts/discord discordalert="off" @@ -71,14 +69,18 @@ pushoveralert="off" pushovertoken="accesstoken" pushoveruserkey="userkey" +# Rocket.Chat Alerts | https://docs.linuxgsm.com/alerts/rocket.chat +rocketchatalert="off" +rocketchatwebhook="webhook" +rocketchattoken="" + # Slack Alerts | https://docs.linuxgsm.com/alerts/slack slackalert="off" slackwebhook="webhook" # Telegram Alerts | https://docs.linuxgsm.com/alerts/telegram -# You can add a custom cURL string eg proxy (useful in Russia) or else in "curlcustomstring". -# like a "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help", if you not need -# any custom string in curl - simple ignore this parameter. +# You can add a custom cURL string eg proxy (useful in Russia) in "curlcustomstring". +# For example "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help". telegramalert="off" telegramtoken="accesstoken" telegramchatid="" diff --git a/lgsm/config-default/config-lgsm/cssserver/_default.cfg b/lgsm/config-default/config-lgsm/cssserver/_default.cfg index 1ca7dffa6..56f430bb6 100644 --- a/lgsm/config-default/config-lgsm/cssserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/cssserver/_default.cfg @@ -42,8 +42,6 @@ displayip="" # More info | https://docs.linuxgsm.com/alerts#more-info postalert="off" -postdays="7" -posttarget="https://termbin.com" # Discord Alerts | https://docs.linuxgsm.com/alerts/discord discordalert="off" @@ -77,14 +75,18 @@ pushoveralert="off" pushovertoken="accesstoken" pushoveruserkey="userkey" +# Rocket.Chat Alerts | https://docs.linuxgsm.com/alerts/rocket.chat +rocketchatalert="off" +rocketchatwebhook="webhook" +rocketchattoken="" + # Slack Alerts | https://docs.linuxgsm.com/alerts/slack slackalert="off" slackwebhook="webhook" # Telegram Alerts | https://docs.linuxgsm.com/alerts/telegram -# You can add a custom cURL string eg proxy (useful in Russia) or else in "curlcustomstring". -# like a "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help", if you not need -# any custom string in curl - simple ignore this parameter. +# You can add a custom cURL string eg proxy (useful in Russia) in "curlcustomstring". +# For example "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help". telegramalert="off" telegramtoken="accesstoken" telegramchatid="" diff --git a/lgsm/config-default/config-lgsm/dabserver/_default.cfg b/lgsm/config-default/config-lgsm/dabserver/_default.cfg index b45dfe281..ea6bcf390 100644 --- a/lgsm/config-default/config-lgsm/dabserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/dabserver/_default.cfg @@ -37,8 +37,6 @@ displayip="" # More info | https://docs.linuxgsm.com/alerts#more-info postalert="off" -postdays="7" -posttarget="https://termbin.com" # Discord Alerts | https://docs.linuxgsm.com/alerts/discord discordalert="off" @@ -72,14 +70,18 @@ pushoveralert="off" pushovertoken="accesstoken" pushoveruserkey="userkey" +# Rocket.Chat Alerts | https://docs.linuxgsm.com/alerts/rocket.chat +rocketchatalert="off" +rocketchatwebhook="webhook" +rocketchattoken="" + # Slack Alerts | https://docs.linuxgsm.com/alerts/slack slackalert="off" slackwebhook="webhook" # Telegram Alerts | https://docs.linuxgsm.com/alerts/telegram -# You can add a custom cURL string eg proxy (useful in Russia) or else in "curlcustomstring". -# like a "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help", if you not need -# any custom string in curl - simple ignore this parameter. +# You can add a custom cURL string eg proxy (useful in Russia) in "curlcustomstring". +# For example "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help". telegramalert="off" telegramtoken="accesstoken" telegramchatid="" diff --git a/lgsm/config-default/config-lgsm/dmcserver/_default.cfg b/lgsm/config-default/config-lgsm/dmcserver/_default.cfg index c0b668901..8babab1dd 100644 --- a/lgsm/config-default/config-lgsm/dmcserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/dmcserver/_default.cfg @@ -36,8 +36,6 @@ displayip="" # More info | https://docs.linuxgsm.com/alerts#more-info postalert="off" -postdays="7" -posttarget="https://termbin.com" # Discord Alerts | https://docs.linuxgsm.com/alerts/discord discordalert="off" @@ -71,14 +69,18 @@ pushoveralert="off" pushovertoken="accesstoken" pushoveruserkey="userkey" +# Rocket.Chat Alerts | https://docs.linuxgsm.com/alerts/rocket.chat +rocketchatalert="off" +rocketchatwebhook="webhook" +rocketchattoken="" + # Slack Alerts | https://docs.linuxgsm.com/alerts/slack slackalert="off" slackwebhook="webhook" # Telegram Alerts | https://docs.linuxgsm.com/alerts/telegram -# You can add a custom cURL string eg proxy (useful in Russia) or else in "curlcustomstring". -# like a "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help", if you not need -# any custom string in curl - simple ignore this parameter. +# You can add a custom cURL string eg proxy (useful in Russia) in "curlcustomstring". +# For example "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help". telegramalert="off" telegramtoken="accesstoken" telegramchatid="" diff --git a/lgsm/config-default/config-lgsm/dodserver/_default.cfg b/lgsm/config-default/config-lgsm/dodserver/_default.cfg index 34aff2abf..83b051930 100644 --- a/lgsm/config-default/config-lgsm/dodserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/dodserver/_default.cfg @@ -36,8 +36,6 @@ displayip="" # More info | https://docs.linuxgsm.com/alerts#more-info postalert="off" -postdays="7" -posttarget="https://termbin.com" # Discord Alerts | https://docs.linuxgsm.com/alerts/discord discordalert="off" @@ -71,14 +69,18 @@ pushoveralert="off" pushovertoken="accesstoken" pushoveruserkey="userkey" +# Rocket.Chat Alerts | https://docs.linuxgsm.com/alerts/rocket.chat +rocketchatalert="off" +rocketchatwebhook="webhook" +rocketchattoken="" + # Slack Alerts | https://docs.linuxgsm.com/alerts/slack slackalert="off" slackwebhook="webhook" # Telegram Alerts | https://docs.linuxgsm.com/alerts/telegram -# You can add a custom cURL string eg proxy (useful in Russia) or else in "curlcustomstring". -# like a "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help", if you not need -# any custom string in curl - simple ignore this parameter. +# You can add a custom cURL string eg proxy (useful in Russia) in "curlcustomstring". +# For example "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help". telegramalert="off" telegramtoken="accesstoken" telegramchatid="" diff --git a/lgsm/config-default/config-lgsm/dodsserver/_default.cfg b/lgsm/config-default/config-lgsm/dodsserver/_default.cfg index 95d47a168..3af945122 100644 --- a/lgsm/config-default/config-lgsm/dodsserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/dodsserver/_default.cfg @@ -37,8 +37,6 @@ displayip="" # More info | https://docs.linuxgsm.com/alerts#more-info postalert="off" -postdays="7" -posttarget="https://termbin.com" # Discord Alerts | https://docs.linuxgsm.com/alerts/discord discordalert="off" @@ -72,14 +70,18 @@ pushoveralert="off" pushovertoken="accesstoken" pushoveruserkey="userkey" +# Rocket.Chat Alerts | https://docs.linuxgsm.com/alerts/rocket.chat +rocketchatalert="off" +rocketchatwebhook="webhook" +rocketchattoken="" + # Slack Alerts | https://docs.linuxgsm.com/alerts/slack slackalert="off" slackwebhook="webhook" # Telegram Alerts | https://docs.linuxgsm.com/alerts/telegram -# You can add a custom cURL string eg proxy (useful in Russia) or else in "curlcustomstring". -# like a "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help", if you not need -# any custom string in curl - simple ignore this parameter. +# You can add a custom cURL string eg proxy (useful in Russia) in "curlcustomstring". +# For example "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help". telegramalert="off" telegramtoken="accesstoken" telegramchatid="" diff --git a/lgsm/config-default/config-lgsm/doiserver/_default.cfg b/lgsm/config-default/config-lgsm/doiserver/_default.cfg index d27bd20a8..deb15b2dc 100644 --- a/lgsm/config-default/config-lgsm/doiserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/doiserver/_default.cfg @@ -38,8 +38,6 @@ displayip="" # More info | https://docs.linuxgsm.com/alerts#more-info postalert="off" -postdays="7" -posttarget="https://termbin.com" # Discord Alerts | https://docs.linuxgsm.com/alerts/discord discordalert="off" @@ -73,14 +71,18 @@ pushoveralert="off" pushovertoken="accesstoken" pushoveruserkey="userkey" +# Rocket.Chat Alerts | https://docs.linuxgsm.com/alerts/rocket.chat +rocketchatalert="off" +rocketchatwebhook="webhook" +rocketchattoken="" + # Slack Alerts | https://docs.linuxgsm.com/alerts/slack slackalert="off" slackwebhook="webhook" # Telegram Alerts | https://docs.linuxgsm.com/alerts/telegram -# You can add a custom cURL string eg proxy (useful in Russia) or else in "curlcustomstring". -# like a "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help", if you not need -# any custom string in curl - simple ignore this parameter. +# You can add a custom cURL string eg proxy (useful in Russia) in "curlcustomstring". +# For example "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help". telegramalert="off" telegramtoken="accesstoken" telegramchatid="" diff --git a/lgsm/config-default/config-lgsm/dstserver/_default.cfg b/lgsm/config-default/config-lgsm/dstserver/_default.cfg index f31a0ea63..6e746fb83 100644 --- a/lgsm/config-default/config-lgsm/dstserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/dstserver/_default.cfg @@ -40,8 +40,6 @@ displayip="" # More info | https://docs.linuxgsm.com/alerts#more-info postalert="off" -postdays="7" -posttarget="https://termbin.com" # Discord Alerts | https://docs.linuxgsm.com/alerts/discord discordalert="off" @@ -75,14 +73,18 @@ pushoveralert="off" pushovertoken="accesstoken" pushoveruserkey="userkey" +# Rocket.Chat Alerts | https://docs.linuxgsm.com/alerts/rocket.chat +rocketchatalert="off" +rocketchatwebhook="webhook" +rocketchattoken="" + # Slack Alerts | https://docs.linuxgsm.com/alerts/slack slackalert="off" slackwebhook="webhook" # Telegram Alerts | https://docs.linuxgsm.com/alerts/telegram -# You can add a custom cURL string eg proxy (useful in Russia) or else in "curlcustomstring". -# like a "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help", if you not need -# any custom string in curl - simple ignore this parameter. +# You can add a custom cURL string eg proxy (useful in Russia) in "curlcustomstring". +# For example "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help". telegramalert="off" telegramtoken="accesstoken" telegramchatid="" diff --git a/lgsm/config-default/config-lgsm/dysserver/_default.cfg b/lgsm/config-default/config-lgsm/dysserver/_default.cfg index 13f841240..c45a12bee 100644 --- a/lgsm/config-default/config-lgsm/dysserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/dysserver/_default.cfg @@ -42,8 +42,6 @@ displayip="" # More info | https://docs.linuxgsm.com/alerts#more-info postalert="off" -postdays="7" -posttarget="https://termbin.com" # Discord Alerts | https://docs.linuxgsm.com/alerts/discord discordalert="off" @@ -77,14 +75,18 @@ pushoveralert="off" pushovertoken="accesstoken" pushoveruserkey="userkey" +# Rocket.Chat Alerts | https://docs.linuxgsm.com/alerts/rocket.chat +rocketchatalert="off" +rocketchatwebhook="webhook" +rocketchattoken="" + # Slack Alerts | https://docs.linuxgsm.com/alerts/slack slackalert="off" slackwebhook="webhook" # Telegram Alerts | https://docs.linuxgsm.com/alerts/telegram -# You can add a custom cURL string eg proxy (useful in Russia) or else in "curlcustomstring". -# like a "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help", if you not need -# any custom string in curl - simple ignore this parameter. +# You can add a custom cURL string eg proxy (useful in Russia) in "curlcustomstring". +# For example "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help". telegramalert="off" telegramtoken="accesstoken" telegramchatid="" diff --git a/lgsm/config-default/config-lgsm/ecoserver/_default.cfg b/lgsm/config-default/config-lgsm/ecoserver/_default.cfg index 0d2f56a3c..c515595e2 100644 --- a/lgsm/config-default/config-lgsm/ecoserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/ecoserver/_default.cfg @@ -29,8 +29,6 @@ displayip="" # More info | https://docs.linuxgsm.com/alerts#more-info postalert="off" -postdays="7" -posttarget="https://termbin.com" # Discord Alerts | https://docs.linuxgsm.com/alerts/discord discordalert="off" @@ -64,14 +62,18 @@ pushoveralert="off" pushovertoken="accesstoken" pushoveruserkey="userkey" +# Rocket.Chat Alerts | https://docs.linuxgsm.com/alerts/rocket.chat +rocketchatalert="off" +rocketchatwebhook="webhook" +rocketchattoken="" + # Slack Alerts | https://docs.linuxgsm.com/alerts/slack slackalert="off" slackwebhook="webhook" # Telegram Alerts | https://docs.linuxgsm.com/alerts/telegram -# You can add a custom cURL string eg proxy (useful in Russia) or else in "curlcustomstring". -# like a "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help", if you not need -# any custom string in curl - simple ignore this parameter. +# You can add a custom cURL string eg proxy (useful in Russia) in "curlcustomstring". +# For example "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help". telegramalert="off" telegramtoken="accesstoken" telegramchatid="" diff --git a/lgsm/config-default/config-lgsm/emserver/_default.cfg b/lgsm/config-default/config-lgsm/emserver/_default.cfg index 1282de234..be13dac6b 100644 --- a/lgsm/config-default/config-lgsm/emserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/emserver/_default.cfg @@ -42,8 +42,6 @@ displayip="" # More info | https://docs.linuxgsm.com/alerts#more-info postalert="off" -postdays="7" -posttarget="https://termbin.com" # Discord Alerts | https://docs.linuxgsm.com/alerts/discord discordalert="off" @@ -77,14 +75,18 @@ pushoveralert="off" pushovertoken="accesstoken" pushoveruserkey="userkey" +# Rocket.Chat Alerts | https://docs.linuxgsm.com/alerts/rocket.chat +rocketchatalert="off" +rocketchatwebhook="webhook" +rocketchattoken="" + # Slack Alerts | https://docs.linuxgsm.com/alerts/slack slackalert="off" slackwebhook="webhook" # Telegram Alerts | https://docs.linuxgsm.com/alerts/telegram -# You can add a custom cURL string eg proxy (useful in Russia) or else in "curlcustomstring". -# like a "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help", if you not need -# any custom string in curl - simple ignore this parameter. +# You can add a custom cURL string eg proxy (useful in Russia) in "curlcustomstring". +# For example "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help". telegramalert="off" telegramtoken="accesstoken" telegramchatid="" diff --git a/lgsm/config-default/config-lgsm/etlserver/_default.cfg b/lgsm/config-default/config-lgsm/etlserver/_default.cfg index 2f95fc37c..0d2bf1a8c 100644 --- a/lgsm/config-default/config-lgsm/etlserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/etlserver/_default.cfg @@ -29,8 +29,6 @@ displayip="" # More info | https://docs.linuxgsm.com/alerts#more-info postalert="off" -postdays="7" -posttarget="https://termbin.com" # Discord Alerts | https://docs.linuxgsm.com/alerts/discord discordalert="off" @@ -64,14 +62,18 @@ pushoveralert="off" pushovertoken="accesstoken" pushoveruserkey="userkey" +# Rocket.Chat Alerts | https://docs.linuxgsm.com/alerts/rocket.chat +rocketchatalert="off" +rocketchatwebhook="webhook" +rocketchattoken="" + # Slack Alerts | https://docs.linuxgsm.com/alerts/slack slackalert="off" slackwebhook="webhook" # Telegram Alerts | https://docs.linuxgsm.com/alerts/telegram -# You can add a custom cURL string eg proxy (useful in Russia) or else in "curlcustomstring". -# like a "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help", if you not need -# any custom string in curl - simple ignore this parameter. +# You can add a custom cURL string eg proxy (useful in Russia) in "curlcustomstring". +# For example "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help". telegramalert="off" telegramtoken="accesstoken" telegramchatid="" diff --git a/lgsm/config-default/config-lgsm/fctrserver/_default.cfg b/lgsm/config-default/config-lgsm/fctrserver/_default.cfg index c2ce4cc7f..8a808f7f3 100644 --- a/lgsm/config-default/config-lgsm/fctrserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/fctrserver/_default.cfg @@ -37,8 +37,6 @@ displayip="" # More info | https://docs.linuxgsm.com/alerts#more-info postalert="off" -postdays="7" -posttarget="https://termbin.com" # Discord Alerts | https://docs.linuxgsm.com/alerts/discord discordalert="off" @@ -72,14 +70,18 @@ pushoveralert="off" pushovertoken="accesstoken" pushoveruserkey="userkey" +# Rocket.Chat Alerts | https://docs.linuxgsm.com/alerts/rocket.chat +rocketchatalert="off" +rocketchatwebhook="webhook" +rocketchattoken="" + # Slack Alerts | https://docs.linuxgsm.com/alerts/slack slackalert="off" slackwebhook="webhook" # Telegram Alerts | https://docs.linuxgsm.com/alerts/telegram -# You can add a custom cURL string eg proxy (useful in Russia) or else in "curlcustomstring". -# like a "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help", if you not need -# any custom string in curl - simple ignore this parameter. +# You can add a custom cURL string eg proxy (useful in Russia) in "curlcustomstring". +# For example "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help". telegramalert="off" telegramtoken="accesstoken" telegramchatid="" diff --git a/lgsm/config-default/config-lgsm/fofserver/_default.cfg b/lgsm/config-default/config-lgsm/fofserver/_default.cfg index 41d3cd444..1452805b8 100644 --- a/lgsm/config-default/config-lgsm/fofserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/fofserver/_default.cfg @@ -37,8 +37,6 @@ displayip="" # More info | https://docs.linuxgsm.com/alerts#more-info postalert="off" -postdays="7" -posttarget="https://termbin.com" # Discord Alerts | https://docs.linuxgsm.com/alerts/discord discordalert="off" @@ -72,14 +70,18 @@ pushoveralert="off" pushovertoken="accesstoken" pushoveruserkey="userkey" +# Rocket.Chat Alerts | https://docs.linuxgsm.com/alerts/rocket.chat +rocketchatalert="off" +rocketchatwebhook="webhook" +rocketchattoken="" + # Slack Alerts | https://docs.linuxgsm.com/alerts/slack slackalert="off" slackwebhook="webhook" # Telegram Alerts | https://docs.linuxgsm.com/alerts/telegram -# You can add a custom cURL string eg proxy (useful in Russia) or else in "curlcustomstring". -# like a "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help", if you not need -# any custom string in curl - simple ignore this parameter. +# You can add a custom cURL string eg proxy (useful in Russia) in "curlcustomstring". +# For example "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help". telegramalert="off" telegramtoken="accesstoken" telegramchatid="" diff --git a/lgsm/config-default/config-lgsm/gesserver/_default.cfg b/lgsm/config-default/config-lgsm/gesserver/_default.cfg index bb80be779..24f5f65bf 100644 --- a/lgsm/config-default/config-lgsm/gesserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/gesserver/_default.cfg @@ -37,8 +37,6 @@ displayip="" # More info | https://docs.linuxgsm.com/alerts#more-info postalert="off" -postdays="7" -posttarget="https://termbin.com" # Discord Alerts | https://docs.linuxgsm.com/alerts/discord discordalert="off" @@ -72,14 +70,18 @@ pushoveralert="off" pushovertoken="accesstoken" pushoveruserkey="userkey" +# Rocket.Chat Alerts | https://docs.linuxgsm.com/alerts/rocket.chat +rocketchatalert="off" +rocketchatwebhook="webhook" +rocketchattoken="" + # Slack Alerts | https://docs.linuxgsm.com/alerts/slack slackalert="off" slackwebhook="webhook" # Telegram Alerts | https://docs.linuxgsm.com/alerts/telegram -# You can add a custom cURL string eg proxy (useful in Russia) or else in "curlcustomstring". -# like a "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help", if you not need -# any custom string in curl - simple ignore this parameter. +# You can add a custom cURL string eg proxy (useful in Russia) in "curlcustomstring". +# For example "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help". telegramalert="off" telegramtoken="accesstoken" telegramchatid="" diff --git a/lgsm/config-default/config-lgsm/gmodserver/_default.cfg b/lgsm/config-default/config-lgsm/gmodserver/_default.cfg index ee50916aa..1e8fb92aa 100644 --- a/lgsm/config-default/config-lgsm/gmodserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/gmodserver/_default.cfg @@ -53,8 +53,6 @@ displayip="" # More info | https://docs.linuxgsm.com/alerts#more-info postalert="off" -postdays="7" -posttarget="https://termbin.com" # Discord Alerts | https://docs.linuxgsm.com/alerts/discord discordalert="off" @@ -88,14 +86,18 @@ pushoveralert="off" pushovertoken="accesstoken" pushoveruserkey="userkey" +# Rocket.Chat Alerts | https://docs.linuxgsm.com/alerts/rocket.chat +rocketchatalert="off" +rocketchatwebhook="webhook" +rocketchattoken="" + # Slack Alerts | https://docs.linuxgsm.com/alerts/slack slackalert="off" slackwebhook="webhook" # Telegram Alerts | https://docs.linuxgsm.com/alerts/telegram -# You can add a custom cURL string eg proxy (useful in Russia) or else in "curlcustomstring". -# like a "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help", if you not need -# any custom string in curl - simple ignore this parameter. +# You can add a custom cURL string eg proxy (useful in Russia) in "curlcustomstring". +# For example "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help". telegramalert="off" telegramtoken="accesstoken" telegramchatid="" diff --git a/lgsm/config-default/config-lgsm/hl2dmserver/_default.cfg b/lgsm/config-default/config-lgsm/hl2dmserver/_default.cfg index 814ccc2e1..f356b1238 100644 --- a/lgsm/config-default/config-lgsm/hl2dmserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/hl2dmserver/_default.cfg @@ -37,8 +37,6 @@ displayip="" # More info | https://docs.linuxgsm.com/alerts#more-info postalert="off" -postdays="7" -posttarget="https://termbin.com" # Discord Alerts | https://docs.linuxgsm.com/alerts/discord discordalert="off" @@ -72,14 +70,18 @@ pushoveralert="off" pushovertoken="accesstoken" pushoveruserkey="userkey" +# Rocket.Chat Alerts | https://docs.linuxgsm.com/alerts/rocket.chat +rocketchatalert="off" +rocketchatwebhook="webhook" +rocketchattoken="" + # Slack Alerts | https://docs.linuxgsm.com/alerts/slack slackalert="off" slackwebhook="webhook" # Telegram Alerts | https://docs.linuxgsm.com/alerts/telegram -# You can add a custom cURL string eg proxy (useful in Russia) or else in "curlcustomstring". -# like a "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help", if you not need -# any custom string in curl - simple ignore this parameter. +# You can add a custom cURL string eg proxy (useful in Russia) in "curlcustomstring". +# For example "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help". telegramalert="off" telegramtoken="accesstoken" telegramchatid="" diff --git a/lgsm/config-default/config-lgsm/hldmserver/_default.cfg b/lgsm/config-default/config-lgsm/hldmserver/_default.cfg index b8e912f29..41b702789 100644 --- a/lgsm/config-default/config-lgsm/hldmserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/hldmserver/_default.cfg @@ -36,8 +36,6 @@ displayip="" # More info | https://docs.linuxgsm.com/alerts#more-info postalert="off" -postdays="7" -posttarget="https://termbin.com" # Discord Alerts | https://docs.linuxgsm.com/alerts/discord discordalert="off" @@ -71,14 +69,18 @@ pushoveralert="off" pushovertoken="accesstoken" pushoveruserkey="userkey" +# Rocket.Chat Alerts | https://docs.linuxgsm.com/alerts/rocket.chat +rocketchatalert="off" +rocketchatwebhook="webhook" +rocketchattoken="" + # Slack Alerts | https://docs.linuxgsm.com/alerts/slack slackalert="off" slackwebhook="webhook" # Telegram Alerts | https://docs.linuxgsm.com/alerts/telegram -# You can add a custom cURL string eg proxy (useful in Russia) or else in "curlcustomstring". -# like a "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help", if you not need -# any custom string in curl - simple ignore this parameter. +# You can add a custom cURL string eg proxy (useful in Russia) in "curlcustomstring". +# For example "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help". telegramalert="off" telegramtoken="accesstoken" telegramchatid="" diff --git a/lgsm/config-default/config-lgsm/hldmsserver/_default.cfg b/lgsm/config-default/config-lgsm/hldmsserver/_default.cfg index 10217a7a0..7c04267ad 100644 --- a/lgsm/config-default/config-lgsm/hldmsserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/hldmsserver/_default.cfg @@ -37,8 +37,6 @@ displayip="" # More info | https://docs.linuxgsm.com/alerts#more-info postalert="off" -postdays="7" -posttarget="https://termbin.com" # Discord Alerts | https://docs.linuxgsm.com/alerts/discord discordalert="off" @@ -72,14 +70,18 @@ pushoveralert="off" pushovertoken="accesstoken" pushoveruserkey="userkey" +# Rocket.Chat Alerts | https://docs.linuxgsm.com/alerts/rocket.chat +rocketchatalert="off" +rocketchatwebhook="webhook" +rocketchattoken="" + # Slack Alerts | https://docs.linuxgsm.com/alerts/slack slackalert="off" slackwebhook="webhook" # Telegram Alerts | https://docs.linuxgsm.com/alerts/telegram -# You can add a custom cURL string eg proxy (useful in Russia) or else in "curlcustomstring". -# like a "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help", if you not need -# any custom string in curl - simple ignore this parameter. +# You can add a custom cURL string eg proxy (useful in Russia) in "curlcustomstring". +# For example "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help". telegramalert="off" telegramtoken="accesstoken" telegramchatid="" diff --git a/lgsm/config-default/config-lgsm/hwserver/_default.cfg b/lgsm/config-default/config-lgsm/hwserver/_default.cfg index 7e62fdc6b..eda9972d3 100644 --- a/lgsm/config-default/config-lgsm/hwserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/hwserver/_default.cfg @@ -48,8 +48,6 @@ displayip="" # More info | https://docs.linuxgsm.com/alerts#more-info postalert="off" -postdays="7" -posttarget="https://termbin.com" # Discord Alerts | https://docs.linuxgsm.com/alerts/discord discordalert="off" @@ -83,14 +81,18 @@ pushoveralert="off" pushovertoken="accesstoken" pushoveruserkey="userkey" +# Rocket.Chat Alerts | https://docs.linuxgsm.com/alerts/rocket.chat +rocketchatalert="off" +rocketchatwebhook="webhook" +rocketchattoken="" + # Slack Alerts | https://docs.linuxgsm.com/alerts/slack slackalert="off" slackwebhook="webhook" # Telegram Alerts | https://docs.linuxgsm.com/alerts/telegram -# You can add a custom cURL string eg proxy (useful in Russia) or else in "curlcustomstring". -# like a "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help", if you not need -# any custom string in curl - simple ignore this parameter. +# You can add a custom cURL string eg proxy (useful in Russia) in "curlcustomstring". +# For example "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help". telegramalert="off" telegramtoken="accesstoken" telegramchatid="" diff --git a/lgsm/config-default/config-lgsm/insserver/_default.cfg b/lgsm/config-default/config-lgsm/insserver/_default.cfg index 246e04c6c..50e3e8721 100644 --- a/lgsm/config-default/config-lgsm/insserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/insserver/_default.cfg @@ -43,8 +43,6 @@ displayip="" # More info | https://docs.linuxgsm.com/alerts#more-info postalert="off" -postdays="7" -posttarget="https://termbin.com" # Discord Alerts | https://docs.linuxgsm.com/alerts/discord discordalert="off" @@ -78,14 +76,18 @@ pushoveralert="off" pushovertoken="accesstoken" pushoveruserkey="userkey" +# Rocket.Chat Alerts | https://docs.linuxgsm.com/alerts/rocket.chat +rocketchatalert="off" +rocketchatwebhook="webhook" +rocketchattoken="" + # Slack Alerts | https://docs.linuxgsm.com/alerts/slack slackalert="off" slackwebhook="webhook" # Telegram Alerts | https://docs.linuxgsm.com/alerts/telegram -# You can add a custom cURL string eg proxy (useful in Russia) or else in "curlcustomstring". -# like a "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help", if you not need -# any custom string in curl - simple ignore this parameter. +# You can add a custom cURL string eg proxy (useful in Russia) in "curlcustomstring". +# For example "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help". telegramalert="off" telegramtoken="accesstoken" telegramchatid="" diff --git a/lgsm/config-default/config-lgsm/inssserver/_default.cfg b/lgsm/config-default/config-lgsm/inssserver/_default.cfg index 087b82696..07bc89a60 100644 --- a/lgsm/config-default/config-lgsm/inssserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/inssserver/_default.cfg @@ -44,8 +44,6 @@ displayip="" # More info | https://docs.linuxgsm.com/alerts#more-info postalert="off" -postdays="7" -posttarget="https://termbin.com" # Discord Alerts | https://docs.linuxgsm.com/alerts/discord discordalert="off" @@ -79,14 +77,18 @@ pushoveralert="off" pushovertoken="accesstoken" pushoveruserkey="userkey" +# Rocket.Chat Alerts | https://docs.linuxgsm.com/alerts/rocket.chat +rocketchatalert="off" +rocketchatwebhook="webhook" +rocketchattoken="" + # Slack Alerts | https://docs.linuxgsm.com/alerts/slack slackalert="off" slackwebhook="webhook" # Telegram Alerts | https://docs.linuxgsm.com/alerts/telegram -# You can add a custom cURL string eg proxy (useful in Russia) or else in "curlcustomstring". -# like a "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help", if you not need -# any custom string in curl - simple ignore this parameter. +# You can add a custom cURL string eg proxy (useful in Russia) in "curlcustomstring". +# For example "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help". telegramalert="off" telegramtoken="accesstoken" telegramchatid="" diff --git a/lgsm/config-default/config-lgsm/iosserver/_default.cfg b/lgsm/config-default/config-lgsm/iosserver/_default.cfg index 35a245e24..c322ed383 100644 --- a/lgsm/config-default/config-lgsm/iosserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/iosserver/_default.cfg @@ -37,8 +37,6 @@ displayip="" # More info | https://docs.linuxgsm.com/alerts#more-info postalert="off" -postdays="7" -posttarget="https://termbin.com" # Discord Alerts | https://docs.linuxgsm.com/alerts/discord discordalert="off" @@ -72,14 +70,18 @@ pushoveralert="off" pushovertoken="accesstoken" pushoveruserkey="userkey" +# Rocket.Chat Alerts | https://docs.linuxgsm.com/alerts/rocket.chat +rocketchatalert="off" +rocketchatwebhook="webhook" +rocketchattoken="" + # Slack Alerts | https://docs.linuxgsm.com/alerts/slack slackalert="off" slackwebhook="webhook" # Telegram Alerts | https://docs.linuxgsm.com/alerts/telegram -# You can add a custom cURL string eg proxy (useful in Russia) or else in "curlcustomstring". -# like a "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help", if you not need -# any custom string in curl - simple ignore this parameter. +# You can add a custom cURL string eg proxy (useful in Russia) in "curlcustomstring". +# For example "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help". telegramalert="off" telegramtoken="accesstoken" telegramchatid="" diff --git a/lgsm/config-default/config-lgsm/jc2server/_default.cfg b/lgsm/config-default/config-lgsm/jc2server/_default.cfg index d0de94c49..c57af02ea 100644 --- a/lgsm/config-default/config-lgsm/jc2server/_default.cfg +++ b/lgsm/config-default/config-lgsm/jc2server/_default.cfg @@ -29,8 +29,6 @@ displayip="" # More info | https://docs.linuxgsm.com/alerts#more-info postalert="off" -postdays="7" -posttarget="https://termbin.com" # Discord Alerts | https://docs.linuxgsm.com/alerts/discord discordalert="off" @@ -64,14 +62,18 @@ pushoveralert="off" pushovertoken="accesstoken" pushoveruserkey="userkey" +# Rocket.Chat Alerts | https://docs.linuxgsm.com/alerts/rocket.chat +rocketchatalert="off" +rocketchatwebhook="webhook" +rocketchattoken="" + # Slack Alerts | https://docs.linuxgsm.com/alerts/slack slackalert="off" slackwebhook="webhook" # Telegram Alerts | https://docs.linuxgsm.com/alerts/telegram -# You can add a custom cURL string eg proxy (useful in Russia) or else in "curlcustomstring". -# like a "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help", if you not need -# any custom string in curl - simple ignore this parameter. +# You can add a custom cURL string eg proxy (useful in Russia) in "curlcustomstring". +# For example "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help". telegramalert="off" telegramtoken="accesstoken" telegramchatid="" diff --git a/lgsm/config-default/config-lgsm/jc3server/_default.cfg b/lgsm/config-default/config-lgsm/jc3server/_default.cfg index ada06087a..e208a42f4 100644 --- a/lgsm/config-default/config-lgsm/jc3server/_default.cfg +++ b/lgsm/config-default/config-lgsm/jc3server/_default.cfg @@ -29,8 +29,6 @@ displayip="" # More info | https://docs.linuxgsm.com/alerts#more-info postalert="off" -postdays="7" -posttarget="https://termbin.com" # Discord Alerts | https://docs.linuxgsm.com/alerts/discord discordalert="off" @@ -64,14 +62,18 @@ pushoveralert="off" pushovertoken="accesstoken" pushoveruserkey="userkey" +# Rocket.Chat Alerts | https://docs.linuxgsm.com/alerts/rocket.chat +rocketchatalert="off" +rocketchatwebhook="webhook" +rocketchattoken="" + # Slack Alerts | https://docs.linuxgsm.com/alerts/slack slackalert="off" slackwebhook="webhook" # Telegram Alerts | https://docs.linuxgsm.com/alerts/telegram -# You can add a custom cURL string eg proxy (useful in Russia) or else in "curlcustomstring". -# like a "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help", if you not need -# any custom string in curl - simple ignore this parameter. +# You can add a custom cURL string eg proxy (useful in Russia) in "curlcustomstring". +# For example "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help". telegramalert="off" telegramtoken="accesstoken" telegramchatid="" diff --git a/lgsm/config-default/config-lgsm/jk2server/_default.cfg b/lgsm/config-default/config-lgsm/jk2server/_default.cfg index 0933c8cba..cb42989a7 100644 --- a/lgsm/config-default/config-lgsm/jk2server/_default.cfg +++ b/lgsm/config-default/config-lgsm/jk2server/_default.cfg @@ -32,8 +32,6 @@ displayip="" # More info | https://docs.linuxgsm.com/alerts#more-info postalert="off" -postdays="7" -posttarget="https://hastebin.com" # Discord Alerts | https://docs.linuxgsm.com/alerts/discord discordalert="off" @@ -71,10 +69,14 @@ pushoveralert="off" pushovertoken="accesstoken" pushoveruserkey="userkey" +# Rocket.Chat Alerts | https://docs.linuxgsm.com/alerts/rocket.chat +rocketchatalert="off" +rocketchatwebhook="webhook" +rocketchattoken="" + # Telegram Alerts | https://docs.linuxgsm.com/alerts/telegram -# You can add a custom cURL string eg proxy (useful in Russia) or else in "curlcustomstring". -# like a "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help", if you not need -# any custom string in curl - simple ignore this parameter. +# You can add a custom cURL string eg proxy (useful in Russia) in "curlcustomstring". +# For example "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help". telegramalert="off" telegramtoken="accesstoken" telegramchatid="" diff --git a/lgsm/config-default/config-lgsm/kf2server/_default.cfg b/lgsm/config-default/config-lgsm/kf2server/_default.cfg index 6271a75ad..175e082ab 100644 --- a/lgsm/config-default/config-lgsm/kf2server/_default.cfg +++ b/lgsm/config-default/config-lgsm/kf2server/_default.cfg @@ -35,8 +35,6 @@ displayip="" # More info | https://docs.linuxgsm.com/alerts#more-info postalert="off" -postdays="7" -posttarget="https://termbin.com" # Discord Alerts | https://docs.linuxgsm.com/alerts/discord discordalert="off" @@ -70,14 +68,18 @@ pushoveralert="off" pushovertoken="accesstoken" pushoveruserkey="userkey" +# Rocket.Chat Alerts | https://docs.linuxgsm.com/alerts/rocket.chat +rocketchatalert="off" +rocketchatwebhook="webhook" +rocketchattoken="" + # Slack Alerts | https://docs.linuxgsm.com/alerts/slack slackalert="off" slackwebhook="webhook" # Telegram Alerts | https://docs.linuxgsm.com/alerts/telegram -# You can add a custom cURL string eg proxy (useful in Russia) or else in "curlcustomstring". -# like a "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help", if you not need -# any custom string in curl - simple ignore this parameter. +# You can add a custom cURL string eg proxy (useful in Russia) in "curlcustomstring". +# For example "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help". telegramalert="off" telegramtoken="accesstoken" telegramchatid="" diff --git a/lgsm/config-default/config-lgsm/kfserver/_default.cfg b/lgsm/config-default/config-lgsm/kfserver/_default.cfg index 9e45c4f16..0169f48d0 100644 --- a/lgsm/config-default/config-lgsm/kfserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/kfserver/_default.cfg @@ -41,8 +41,6 @@ displayip="" # More info | https://docs.linuxgsm.com/alerts#more-info postalert="off" -postdays="7" -posttarget="https://termbin.com" # Discord Alerts | https://docs.linuxgsm.com/alerts/discord discordalert="off" @@ -76,14 +74,18 @@ pushoveralert="off" pushovertoken="accesstoken" pushoveruserkey="userkey" +# Rocket.Chat Alerts | https://docs.linuxgsm.com/alerts/rocket.chat +rocketchatalert="off" +rocketchatwebhook="webhook" +rocketchattoken="" + # Slack Alerts | https://docs.linuxgsm.com/alerts/slack slackalert="off" slackwebhook="webhook" # Telegram Alerts | https://docs.linuxgsm.com/alerts/telegram -# You can add a custom cURL string eg proxy (useful in Russia) or else in "curlcustomstring". -# like a "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help", if you not need -# any custom string in curl - simple ignore this parameter. +# You can add a custom cURL string eg proxy (useful in Russia) in "curlcustomstring". +# For example "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help". telegramalert="off" telegramtoken="accesstoken" telegramchatid="" diff --git a/lgsm/config-default/config-lgsm/l4d2server/_default.cfg b/lgsm/config-default/config-lgsm/l4d2server/_default.cfg index 1241957f1..718432852 100644 --- a/lgsm/config-default/config-lgsm/l4d2server/_default.cfg +++ b/lgsm/config-default/config-lgsm/l4d2server/_default.cfg @@ -36,8 +36,6 @@ displayip="" # More info | https://docs.linuxgsm.com/alerts#more-info postalert="off" -postdays="7" -posttarget="https://termbin.com" # Discord Alerts | https://docs.linuxgsm.com/alerts/discord discordalert="off" @@ -71,14 +69,18 @@ pushoveralert="off" pushovertoken="accesstoken" pushoveruserkey="userkey" +# Rocket.Chat Alerts | https://docs.linuxgsm.com/alerts/rocket.chat +rocketchatalert="off" +rocketchatwebhook="webhook" +rocketchattoken="" + # Slack Alerts | https://docs.linuxgsm.com/alerts/slack slackalert="off" slackwebhook="webhook" # Telegram Alerts | https://docs.linuxgsm.com/alerts/telegram -# You can add a custom cURL string eg proxy (useful in Russia) or else in "curlcustomstring". -# like a "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help", if you not need -# any custom string in curl - simple ignore this parameter. +# You can add a custom cURL string eg proxy (useful in Russia) in "curlcustomstring". +# For example "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help". telegramalert="off" telegramtoken="accesstoken" telegramchatid="" diff --git a/lgsm/config-default/config-lgsm/l4dserver/_default.cfg b/lgsm/config-default/config-lgsm/l4dserver/_default.cfg index f855de34e..beacac9bb 100644 --- a/lgsm/config-default/config-lgsm/l4dserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/l4dserver/_default.cfg @@ -36,8 +36,6 @@ displayip="" # More info | https://docs.linuxgsm.com/alerts#more-info postalert="off" -postdays="7" -posttarget="https://termbin.com" # Discord Alerts | https://docs.linuxgsm.com/alerts/discord discordalert="off" @@ -71,14 +69,18 @@ pushoveralert="off" pushovertoken="accesstoken" pushoveruserkey="userkey" +# Rocket.Chat Alerts | https://docs.linuxgsm.com/alerts/rocket.chat +rocketchatalert="off" +rocketchatwebhook="webhook" +rocketchattoken="" + # Slack Alerts | https://docs.linuxgsm.com/alerts/slack slackalert="off" slackwebhook="webhook" # Telegram Alerts | https://docs.linuxgsm.com/alerts/telegram -# You can add a custom cURL string eg proxy (useful in Russia) or else in "curlcustomstring". -# like a "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help", if you not need -# any custom string in curl - simple ignore this parameter. +# You can add a custom cURL string eg proxy (useful in Russia) in "curlcustomstring". +# For example "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help". telegramalert="off" telegramtoken="accesstoken" telegramchatid="" diff --git a/lgsm/config-default/config-lgsm/mcbserver/_default.cfg b/lgsm/config-default/config-lgsm/mcbserver/_default.cfg index e357cf273..b894ade1d 100644 --- a/lgsm/config-default/config-lgsm/mcbserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/mcbserver/_default.cfg @@ -29,8 +29,6 @@ displayip="" # More info | https://docs.linuxgsm.com/alerts#more-info postalert="off" -postdays="7" -posttarget="https://termbin.com" # Discord Alerts | https://docs.linuxgsm.com/alerts/discord discordalert="off" @@ -64,14 +62,18 @@ pushoveralert="off" pushovertoken="accesstoken" pushoveruserkey="userkey" +# Rocket.Chat Alerts | https://docs.linuxgsm.com/alerts/rocket.chat +rocketchatalert="off" +rocketchatwebhook="webhook" +rocketchattoken="" + # Slack Alerts | https://docs.linuxgsm.com/alerts/slack slackalert="off" slackwebhook="webhook" # Telegram Alerts | https://docs.linuxgsm.com/alerts/telegram -# You can add a custom cURL string eg proxy (useful in Russia) or else in "curlcustomstring". -# like a "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help", if you not need -# any custom string in curl - simple ignore this parameter. +# You can add a custom cURL string eg proxy (useful in Russia) in "curlcustomstring". +# For example "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help". telegramalert="off" telegramtoken="accesstoken" telegramchatid="" diff --git a/lgsm/config-default/config-lgsm/mcserver/_default.cfg b/lgsm/config-default/config-lgsm/mcserver/_default.cfg index 7727afbec..92f25294c 100644 --- a/lgsm/config-default/config-lgsm/mcserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/mcserver/_default.cfg @@ -35,8 +35,6 @@ displayip="" # More info | https://docs.linuxgsm.com/alerts#more-info postalert="off" -postdays="7" -posttarget="https://termbin.com" # Discord Alerts | https://docs.linuxgsm.com/alerts/discord discordalert="off" @@ -70,14 +68,18 @@ pushoveralert="off" pushovertoken="accesstoken" pushoveruserkey="userkey" +# Rocket.Chat Alerts | https://docs.linuxgsm.com/alerts/rocket.chat +rocketchatalert="off" +rocketchatwebhook="webhook" +rocketchattoken="" + # Slack Alerts | https://docs.linuxgsm.com/alerts/slack slackalert="off" slackwebhook="webhook" # Telegram Alerts | https://docs.linuxgsm.com/alerts/telegram -# You can add a custom cURL string eg proxy (useful in Russia) or else in "curlcustomstring". -# like a "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help", if you not need -# any custom string in curl - simple ignore this parameter. +# You can add a custom cURL string eg proxy (useful in Russia) in "curlcustomstring". +# For example "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help". telegramalert="off" telegramtoken="accesstoken" telegramchatid="" diff --git a/lgsm/config-default/config-lgsm/mhserver/_default.cfg b/lgsm/config-default/config-lgsm/mhserver/_default.cfg index 4be0c811e..c71081b89 100644 --- a/lgsm/config-default/config-lgsm/mhserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/mhserver/_default.cfg @@ -37,8 +37,6 @@ displayip="" # More info | https://docs.linuxgsm.com/alerts#more-info postalert="off" -postdays="7" -posttarget="https://termbin.com" # Discord Alerts | https://docs.linuxgsm.com/alerts/discord discordalert="off" @@ -72,14 +70,18 @@ pushoveralert="off" pushovertoken="accesstoken" pushoveruserkey="userkey" +# Rocket.Chat Alerts | https://docs.linuxgsm.com/alerts/rocket.chat +rocketchatalert="off" +rocketchatwebhook="webhook" +rocketchattoken="" + # Slack Alerts | https://docs.linuxgsm.com/alerts/slack slackalert="off" slackwebhook="webhook" # Telegram Alerts | https://docs.linuxgsm.com/alerts/telegram -# You can add a custom cURL string eg proxy (useful in Russia) or else in "curlcustomstring". -# like a "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help", if you not need -# any custom string in curl - simple ignore this parameter. +# You can add a custom cURL string eg proxy (useful in Russia) in "curlcustomstring". +# For example "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help". telegramalert="off" telegramtoken="accesstoken" telegramchatid="" diff --git a/lgsm/config-default/config-lgsm/mohaaserver/_default.cfg b/lgsm/config-default/config-lgsm/mohaaserver/_default.cfg index f6901c811..54bdb5a06 100644 --- a/lgsm/config-default/config-lgsm/mohaaserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/mohaaserver/_default.cfg @@ -34,8 +34,6 @@ displayip="" # More info | https://docs.linuxgsm.com/alerts#more-info postalert="off" -postdays="7" -posttarget="https://termbin.com" # Discord Alerts | https://docs.linuxgsm.com/alerts/discord discordalert="off" @@ -69,14 +67,18 @@ pushoveralert="off" pushovertoken="accesstoken" pushoveruserkey="userkey" +# Rocket.Chat Alerts | https://docs.linuxgsm.com/alerts/rocket.chat +rocketchatalert="off" +rocketchatwebhook="webhook" +rocketchattoken="" + # Slack Alerts | https://docs.linuxgsm.com/alerts/slack slackalert="off" slackwebhook="webhook" # Telegram Alerts | https://docs.linuxgsm.com/alerts/telegram -# You can add a custom cURL string eg proxy (useful in Russia) or else in "curlcustomstring". -# like a "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help", if you not need -# any custom string in curl - simple ignore this parameter. +# You can add a custom cURL string eg proxy (useful in Russia) in "curlcustomstring". +# For example "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help". telegramalert="off" telegramtoken="accesstoken" telegramchatid="" diff --git a/lgsm/config-default/config-lgsm/momserver/_default.cfg b/lgsm/config-default/config-lgsm/momserver/_default.cfg index 02640a7d3..7909b67e2 100644 --- a/lgsm/config-default/config-lgsm/momserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/momserver/_default.cfg @@ -35,8 +35,6 @@ displayip="" # More info | https://docs.linuxgsm.com/alerts#more-info postalert="off" -postdays="7" -posttarget="https://termbin.com" # Discord Alerts | https://docs.linuxgsm.com/alerts/discord discordalert="off" @@ -70,14 +68,18 @@ pushoveralert="off" pushovertoken="accesstoken" pushoveruserkey="userkey" +# Rocket.Chat Alerts | https://docs.linuxgsm.com/alerts/rocket.chat +rocketchatalert="off" +rocketchatwebhook="webhook" +rocketchattoken="" + # Slack Alerts | https://docs.linuxgsm.com/alerts/slack slackalert="off" slackwebhook="webhook" # Telegram Alerts | https://docs.linuxgsm.com/alerts/telegram -# You can add a custom cURL string eg proxy (useful in Russia) or else in "curlcustomstring". -# like a "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help", if you not need -# any custom string in curl - simple ignore this parameter. +# You can add a custom cURL string eg proxy (useful in Russia) in "curlcustomstring". +# For example "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help". telegramalert="off" telegramtoken="accesstoken" telegramchatid="" diff --git a/lgsm/config-default/config-lgsm/mtaserver/_default.cfg b/lgsm/config-default/config-lgsm/mtaserver/_default.cfg index b1c739510..3a97169f8 100644 --- a/lgsm/config-default/config-lgsm/mtaserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/mtaserver/_default.cfg @@ -33,8 +33,6 @@ displayip="" # More info | https://docs.linuxgsm.com/alerts#more-info postalert="off" -postdays="7" -posttarget="https://termbin.com" # Discord Alerts | https://docs.linuxgsm.com/alerts/discord discordalert="off" @@ -68,14 +66,18 @@ pushoveralert="off" pushovertoken="accesstoken" pushoveruserkey="userkey" +# Rocket.Chat Alerts | https://docs.linuxgsm.com/alerts/rocket.chat +rocketchatalert="off" +rocketchatwebhook="webhook" +rocketchattoken="" + # Slack Alerts | https://docs.linuxgsm.com/alerts/slack slackalert="off" slackwebhook="webhook" # Telegram Alerts | https://docs.linuxgsm.com/alerts/telegram -# You can add a custom cURL string eg proxy (useful in Russia) or else in "curlcustomstring". -# like a "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help", if you not need -# any custom string in curl - simple ignore this parameter. +# You can add a custom cURL string eg proxy (useful in Russia) in "curlcustomstring". +# For example "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help". telegramalert="off" telegramtoken="accesstoken" telegramchatid="" diff --git a/lgsm/config-default/config-lgsm/mumbleserver/_default.cfg b/lgsm/config-default/config-lgsm/mumbleserver/_default.cfg index b0c105385..3e798e2ee 100644 --- a/lgsm/config-default/config-lgsm/mumbleserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/mumbleserver/_default.cfg @@ -29,8 +29,6 @@ displayip="" # More info | https://docs.linuxgsm.com/alerts#more-info postalert="off" -postdays="7" -posttarget="https://termbin.com" # Discord Alerts | https://docs.linuxgsm.com/alerts/discord discordalert="off" @@ -64,14 +62,18 @@ pushoveralert="off" pushovertoken="accesstoken" pushoveruserkey="userkey" +# Rocket.Chat Alerts | https://docs.linuxgsm.com/alerts/rocket.chat +rocketchatalert="off" +rocketchatwebhook="webhook" +rocketchattoken="" + # Slack Alerts | https://docs.linuxgsm.com/alerts/slack slackalert="off" slackwebhook="webhook" # Telegram Alerts | https://docs.linuxgsm.com/alerts/telegram -# You can add a custom cURL string eg proxy (useful in Russia) or else in "curlcustomstring". -# like a "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help", if you not need -# any custom string in curl - simple ignore this parameter. +# You can add a custom cURL string eg proxy (useful in Russia) in "curlcustomstring". +# For example "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help". telegramalert="off" telegramtoken="accesstoken" telegramchatid="" diff --git a/lgsm/config-default/config-lgsm/ndserver/_default.cfg b/lgsm/config-default/config-lgsm/ndserver/_default.cfg index 52c7c9490..7ef270919 100644 --- a/lgsm/config-default/config-lgsm/ndserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/ndserver/_default.cfg @@ -37,8 +37,6 @@ displayip="" # More info | https://docs.linuxgsm.com/alerts#more-info postalert="off" -postdays="7" -posttarget="https://termbin.com" # Discord Alerts | https://docs.linuxgsm.com/alerts/discord discordalert="off" @@ -72,14 +70,18 @@ pushoveralert="off" pushovertoken="accesstoken" pushoveruserkey="userkey" +# Rocket.Chat Alerts | https://docs.linuxgsm.com/alerts/rocket.chat +rocketchatalert="off" +rocketchatwebhook="webhook" +rocketchattoken="" + # Slack Alerts | https://docs.linuxgsm.com/alerts/slack slackalert="off" slackwebhook="webhook" # Telegram Alerts | https://docs.linuxgsm.com/alerts/telegram -# You can add a custom cURL string eg proxy (useful in Russia) or else in "curlcustomstring". -# like a "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help", if you not need -# any custom string in curl - simple ignore this parameter. +# You can add a custom cURL string eg proxy (useful in Russia) in "curlcustomstring". +# For example "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help". telegramalert="off" telegramtoken="accesstoken" telegramchatid="" diff --git a/lgsm/config-default/config-lgsm/nmrihserver/_default.cfg b/lgsm/config-default/config-lgsm/nmrihserver/_default.cfg index c3a60a36e..41c057356 100644 --- a/lgsm/config-default/config-lgsm/nmrihserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/nmrihserver/_default.cfg @@ -42,8 +42,6 @@ displayip="" # More info | https://docs.linuxgsm.com/alerts#more-info postalert="off" -postdays="7" -posttarget="https://termbin.com" # Discord Alerts | https://docs.linuxgsm.com/alerts/discord discordalert="off" @@ -77,14 +75,18 @@ pushoveralert="off" pushovertoken="accesstoken" pushoveruserkey="userkey" +# Rocket.Chat Alerts | https://docs.linuxgsm.com/alerts/rocket.chat +rocketchatalert="off" +rocketchatwebhook="webhook" +rocketchattoken="" + # Slack Alerts | https://docs.linuxgsm.com/alerts/slack slackalert="off" slackwebhook="webhook" # Telegram Alerts | https://docs.linuxgsm.com/alerts/telegram -# You can add a custom cURL string eg proxy (useful in Russia) or else in "curlcustomstring". -# like a "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help", if you not need -# any custom string in curl - simple ignore this parameter. +# You can add a custom cURL string eg proxy (useful in Russia) in "curlcustomstring". +# For example "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help". telegramalert="off" telegramtoken="accesstoken" telegramchatid="" diff --git a/lgsm/config-default/config-lgsm/ns2cserver/_default.cfg b/lgsm/config-default/config-lgsm/ns2cserver/_default.cfg index 3d6490232..1ccb9706e 100644 --- a/lgsm/config-default/config-lgsm/ns2cserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/ns2cserver/_default.cfg @@ -44,8 +44,6 @@ displayip="" # More info | https://docs.linuxgsm.com/alerts#more-info postalert="off" -postdays="7" -posttarget="https://termbin.com" # Discord Alerts | https://docs.linuxgsm.com/alerts/discord discordalert="off" @@ -79,14 +77,18 @@ pushoveralert="off" pushovertoken="accesstoken" pushoveruserkey="userkey" +# Rocket.Chat Alerts | https://docs.linuxgsm.com/alerts/rocket.chat +rocketchatalert="off" +rocketchatwebhook="webhook" +rocketchattoken="" + # Slack Alerts | https://docs.linuxgsm.com/alerts/slack slackalert="off" slackwebhook="webhook" # Telegram Alerts | https://docs.linuxgsm.com/alerts/telegram -# You can add a custom cURL string eg proxy (useful in Russia) or else in "curlcustomstring". -# like a "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help", if you not need -# any custom string in curl - simple ignore this parameter. +# You can add a custom cURL string eg proxy (useful in Russia) in "curlcustomstring". +# For example "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help". telegramalert="off" telegramtoken="accesstoken" telegramchatid="" diff --git a/lgsm/config-default/config-lgsm/ns2server/_default.cfg b/lgsm/config-default/config-lgsm/ns2server/_default.cfg index 187ae85d9..c132d539d 100644 --- a/lgsm/config-default/config-lgsm/ns2server/_default.cfg +++ b/lgsm/config-default/config-lgsm/ns2server/_default.cfg @@ -48,8 +48,6 @@ displayip="" # More info | https://docs.linuxgsm.com/alerts#more-info postalert="off" -postdays="7" -posttarget="https://termbin.com" # Discord Alerts | https://docs.linuxgsm.com/alerts/discord discordalert="off" @@ -83,14 +81,18 @@ pushoveralert="off" pushovertoken="accesstoken" pushoveruserkey="userkey" +# Rocket.Chat Alerts | https://docs.linuxgsm.com/alerts/rocket.chat +rocketchatalert="off" +rocketchatwebhook="webhook" +rocketchattoken="" + # Slack Alerts | https://docs.linuxgsm.com/alerts/slack slackalert="off" slackwebhook="webhook" # Telegram Alerts | https://docs.linuxgsm.com/alerts/telegram -# You can add a custom cURL string eg proxy (useful in Russia) or else in "curlcustomstring". -# like a "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help", if you not need -# any custom string in curl - simple ignore this parameter. +# You can add a custom cURL string eg proxy (useful in Russia) in "curlcustomstring". +# For example "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help". telegramalert="off" telegramtoken="accesstoken" telegramchatid="" diff --git a/lgsm/config-default/config-lgsm/nsserver/_default.cfg b/lgsm/config-default/config-lgsm/nsserver/_default.cfg index 909817bd2..2a2425f73 100644 --- a/lgsm/config-default/config-lgsm/nsserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/nsserver/_default.cfg @@ -36,8 +36,6 @@ displayip="" # More info | https://docs.linuxgsm.com/alerts#more-info postalert="off" -postdays="7" -posttarget="https://termbin.com" # Discord Alerts | https://docs.linuxgsm.com/alerts/discord discordalert="off" @@ -71,14 +69,18 @@ pushoveralert="off" pushovertoken="accesstoken" pushoveruserkey="userkey" +# Rocket.Chat Alerts | https://docs.linuxgsm.com/alerts/rocket.chat +rocketchatalert="off" +rocketchatwebhook="webhook" +rocketchattoken="" + # Slack Alerts | https://docs.linuxgsm.com/alerts/slack slackalert="off" slackwebhook="webhook" # Telegram Alerts | https://docs.linuxgsm.com/alerts/telegram -# You can add a custom cURL string eg proxy (useful in Russia) or else in "curlcustomstring". -# like a "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help", if you not need -# any custom string in curl - simple ignore this parameter. +# You can add a custom cURL string eg proxy (useful in Russia) in "curlcustomstring". +# For example "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help". telegramalert="off" telegramtoken="accesstoken" telegramchatid="" diff --git a/lgsm/config-default/config-lgsm/onsetserver/_default.cfg b/lgsm/config-default/config-lgsm/onsetserver/_default.cfg index 5815e70a7..d564020ed 100644 --- a/lgsm/config-default/config-lgsm/onsetserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/onsetserver/_default.cfg @@ -29,8 +29,6 @@ displayip="" # More info | https://docs.linuxgsm.com/alerts#more-info postalert="off" -postdays="7" -posttarget="https://termbin.com" # Discord Alerts | https://docs.linuxgsm.com/alerts/discord discordalert="off" @@ -64,14 +62,18 @@ pushoveralert="off" pushovertoken="accesstoken" pushoveruserkey="userkey" +# Rocket.Chat Alerts | https://docs.linuxgsm.com/alerts/rocket.chat +rocketchatalert="off" +rocketchatwebhook="webhook" +rocketchattoken="" + # Slack Alerts | https://docs.linuxgsm.com/alerts/slack slackalert="off" slackwebhook="webhook" # Telegram Alerts | https://docs.linuxgsm.com/alerts/telegram -# You can add a custom cURL string eg proxy (useful in Russia) or else in "curlcustomstring". -# like a "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help", if you not need -# any custom string in curl - simple ignore this parameter. +# You can add a custom cURL string eg proxy (useful in Russia) in "curlcustomstring". +# For example "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help". telegramalert="off" telegramtoken="accesstoken" telegramchatid="" diff --git a/lgsm/config-default/config-lgsm/opforserver/_default.cfg b/lgsm/config-default/config-lgsm/opforserver/_default.cfg index 67b28e43d..f0e54f511 100644 --- a/lgsm/config-default/config-lgsm/opforserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/opforserver/_default.cfg @@ -36,8 +36,6 @@ displayip="" # More info | https://docs.linuxgsm.com/alerts#more-info postalert="off" -postdays="7" -posttarget="https://termbin.com" # Discord Alerts | https://docs.linuxgsm.com/alerts/discord discordalert="off" @@ -71,14 +69,18 @@ pushoveralert="off" pushovertoken="accesstoken" pushoveruserkey="userkey" +# Rocket.Chat Alerts | https://docs.linuxgsm.com/alerts/rocket.chat +rocketchatalert="off" +rocketchatwebhook="webhook" +rocketchattoken="" + # Slack Alerts | https://docs.linuxgsm.com/alerts/slack slackalert="off" slackwebhook="webhook" # Telegram Alerts | https://docs.linuxgsm.com/alerts/telegram -# You can add a custom cURL string eg proxy (useful in Russia) or else in "curlcustomstring". -# like a "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help", if you not need -# any custom string in curl - simple ignore this parameter. +# You can add a custom cURL string eg proxy (useful in Russia) in "curlcustomstring". +# For example "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help". telegramalert="off" telegramtoken="accesstoken" telegramchatid="" diff --git a/lgsm/config-default/config-lgsm/pcserver/_default.cfg b/lgsm/config-default/config-lgsm/pcserver/_default.cfg index b5fba3b56..c02992f92 100644 --- a/lgsm/config-default/config-lgsm/pcserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/pcserver/_default.cfg @@ -29,8 +29,6 @@ displayip="" # More info | https://docs.linuxgsm.com/alerts#more-info postalert="off" -postdays="7" -posttarget="https://termbin.com" # Discord Alerts | https://docs.linuxgsm.com/alerts/discord discordalert="off" @@ -64,14 +62,18 @@ pushoveralert="off" pushovertoken="accesstoken" pushoveruserkey="userkey" +# Rocket.Chat Alerts | https://docs.linuxgsm.com/alerts/rocket.chat +rocketchatalert="off" +rocketchatwebhook="webhook" +rocketchattoken="" + # Slack Alerts | https://docs.linuxgsm.com/alerts/slack slackalert="off" slackwebhook="webhook" # Telegram Alerts | https://docs.linuxgsm.com/alerts/telegram -# You can add a custom cURL string eg proxy (useful in Russia) or else in "curlcustomstring". -# like a "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help", if you not need -# any custom string in curl - simple ignore this parameter. +# You can add a custom cURL string eg proxy (useful in Russia) in "curlcustomstring". +# For example "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help". telegramalert="off" telegramtoken="accesstoken" telegramchatid="" diff --git a/lgsm/config-default/config-lgsm/pstbsserver/_default.cfg b/lgsm/config-default/config-lgsm/pstbsserver/_default.cfg index 4d57c9923..62a8af0ba 100644 --- a/lgsm/config-default/config-lgsm/pstbsserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/pstbsserver/_default.cfg @@ -39,8 +39,6 @@ displayip="" # More info | https://docs.linuxgsm.com/alerts#more-info postalert="off" -postdays="7" -posttarget="https://termbin.com" # Discord Alerts | https://docs.linuxgsm.com/alerts/discord discordalert="off" @@ -74,14 +72,18 @@ pushoveralert="off" pushovertoken="accesstoken" pushoveruserkey="userkey" +# Rocket.Chat Alerts | https://docs.linuxgsm.com/alerts/rocket.chat +rocketchatalert="off" +rocketchatwebhook="webhook" +rocketchattoken="" + # Slack Alerts | https://docs.linuxgsm.com/alerts/slack slackalert="off" slackwebhook="webhook" # Telegram Alerts | https://docs.linuxgsm.com/alerts/telegram -# You can add a custom cURL string eg proxy (useful in Russia) or else in "curlcustomstring". -# like a "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help", if you not need -# any custom string in curl - simple ignore this parameter. +# You can add a custom cURL string eg proxy (useful in Russia) in "curlcustomstring". +# For example "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help". telegramalert="off" telegramtoken="accesstoken" telegramchatid="" diff --git a/lgsm/config-default/config-lgsm/pvkiiserver/_default.cfg b/lgsm/config-default/config-lgsm/pvkiiserver/_default.cfg index db4762421..96442da3d 100644 --- a/lgsm/config-default/config-lgsm/pvkiiserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/pvkiiserver/_default.cfg @@ -37,8 +37,6 @@ displayip="" # More info | https://docs.linuxgsm.com/alerts#more-info postalert="off" -postdays="7" -posttarget="https://termbin.com" # Discord Alerts | https://docs.linuxgsm.com/alerts/discord discordalert="off" @@ -72,14 +70,18 @@ pushoveralert="off" pushovertoken="accesstoken" pushoveruserkey="userkey" +# Rocket.Chat Alerts | https://docs.linuxgsm.com/alerts/rocket.chat +rocketchatalert="off" +rocketchatwebhook="webhook" +rocketchattoken="" + # Slack Alerts | https://docs.linuxgsm.com/alerts/slack slackalert="off" slackwebhook="webhook" # Telegram Alerts | https://docs.linuxgsm.com/alerts/telegram -# You can add a custom cURL string eg proxy (useful in Russia) or else in "curlcustomstring". -# like a "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help", if you not need -# any custom string in curl - simple ignore this parameter. +# You can add a custom cURL string eg proxy (useful in Russia) in "curlcustomstring". +# For example "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help". telegramalert="off" telegramtoken="accesstoken" telegramchatid="" diff --git a/lgsm/config-default/config-lgsm/pzserver/_default.cfg b/lgsm/config-default/config-lgsm/pzserver/_default.cfg index 7bf604b06..ab22be682 100644 --- a/lgsm/config-default/config-lgsm/pzserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/pzserver/_default.cfg @@ -33,8 +33,6 @@ displayip="" # More info | https://docs.linuxgsm.com/alerts#more-info postalert="off" -postdays="7" -posttarget="https://termbin.com" # Discord Alerts | https://docs.linuxgsm.com/alerts/discord discordalert="off" @@ -68,14 +66,18 @@ pushoveralert="off" pushovertoken="accesstoken" pushoveruserkey="userkey" +# Rocket.Chat Alerts | https://docs.linuxgsm.com/alerts/rocket.chat +rocketchatalert="off" +rocketchatwebhook="webhook" +rocketchattoken="" + # Slack Alerts | https://docs.linuxgsm.com/alerts/slack slackalert="off" slackwebhook="webhook" # Telegram Alerts | https://docs.linuxgsm.com/alerts/telegram -# You can add a custom cURL string eg proxy (useful in Russia) or else in "curlcustomstring". -# like a "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help", if you not need -# any custom string in curl - simple ignore this parameter. +# You can add a custom cURL string eg proxy (useful in Russia) in "curlcustomstring". +# For example "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help". telegramalert="off" telegramtoken="accesstoken" telegramchatid="" diff --git a/lgsm/config-default/config-lgsm/q2server/_default.cfg b/lgsm/config-default/config-lgsm/q2server/_default.cfg index b86447af3..63306512d 100644 --- a/lgsm/config-default/config-lgsm/q2server/_default.cfg +++ b/lgsm/config-default/config-lgsm/q2server/_default.cfg @@ -34,8 +34,6 @@ displayip="" # More info | https://docs.linuxgsm.com/alerts#more-info postalert="off" -postdays="7" -posttarget="https://termbin.com" # Discord Alerts | https://docs.linuxgsm.com/alerts/discord discordalert="off" @@ -69,14 +67,18 @@ pushoveralert="off" pushovertoken="accesstoken" pushoveruserkey="userkey" +# Rocket.Chat Alerts | https://docs.linuxgsm.com/alerts/rocket.chat +rocketchatalert="off" +rocketchatwebhook="webhook" +rocketchattoken="" + # Slack Alerts | https://docs.linuxgsm.com/alerts/slack slackalert="off" slackwebhook="webhook" # Telegram Alerts | https://docs.linuxgsm.com/alerts/telegram -# You can add a custom cURL string eg proxy (useful in Russia) or else in "curlcustomstring". -# like a "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help", if you not need -# any custom string in curl - simple ignore this parameter. +# You can add a custom cURL string eg proxy (useful in Russia) in "curlcustomstring". +# For example "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help". telegramalert="off" telegramtoken="accesstoken" telegramchatid="" diff --git a/lgsm/config-default/config-lgsm/q3server/_default.cfg b/lgsm/config-default/config-lgsm/q3server/_default.cfg index 065558109..8ff151fc0 100644 --- a/lgsm/config-default/config-lgsm/q3server/_default.cfg +++ b/lgsm/config-default/config-lgsm/q3server/_default.cfg @@ -34,8 +34,6 @@ displayip="" # More info | https://docs.linuxgsm.com/alerts#more-info postalert="off" -postdays="7" -posttarget="https://termbin.com" # Discord Alerts | https://docs.linuxgsm.com/alerts/discord discordalert="off" @@ -69,14 +67,18 @@ pushoveralert="off" pushovertoken="accesstoken" pushoveruserkey="userkey" +# Rocket.Chat Alerts | https://docs.linuxgsm.com/alerts/rocket.chat +rocketchatalert="off" +rocketchatwebhook="webhook" +rocketchattoken="" + # Slack Alerts | https://docs.linuxgsm.com/alerts/slack slackalert="off" slackwebhook="webhook" # Telegram Alerts | https://docs.linuxgsm.com/alerts/telegram -# You can add a custom cURL string eg proxy (useful in Russia) or else in "curlcustomstring". -# like a "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help", if you not need -# any custom string in curl - simple ignore this parameter. +# You can add a custom cURL string eg proxy (useful in Russia) in "curlcustomstring". +# For example "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help". telegramalert="off" telegramtoken="accesstoken" telegramchatid="" diff --git a/lgsm/config-default/config-lgsm/qlserver/_default.cfg b/lgsm/config-default/config-lgsm/qlserver/_default.cfg index c4cd8671f..25d1f43bc 100644 --- a/lgsm/config-default/config-lgsm/qlserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/qlserver/_default.cfg @@ -29,8 +29,6 @@ displayip="" # More info | https://docs.linuxgsm.com/alerts#more-info postalert="off" -postdays="7" -posttarget="https://termbin.com" # Discord Alerts | https://docs.linuxgsm.com/alerts/discord discordalert="off" @@ -64,14 +62,18 @@ pushoveralert="off" pushovertoken="accesstoken" pushoveruserkey="userkey" +# Rocket.Chat Alerts | https://docs.linuxgsm.com/alerts/rocket.chat +rocketchatalert="off" +rocketchatwebhook="webhook" +rocketchattoken="" + # Slack Alerts | https://docs.linuxgsm.com/alerts/slack slackalert="off" slackwebhook="webhook" # Telegram Alerts | https://docs.linuxgsm.com/alerts/telegram -# You can add a custom cURL string eg proxy (useful in Russia) or else in "curlcustomstring". -# like a "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help", if you not need -# any custom string in curl - simple ignore this parameter. +# You can add a custom cURL string eg proxy (useful in Russia) in "curlcustomstring". +# For example "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help". telegramalert="off" telegramtoken="accesstoken" telegramchatid="" diff --git a/lgsm/config-default/config-lgsm/qwserver/_default.cfg b/lgsm/config-default/config-lgsm/qwserver/_default.cfg index 7835e2a2c..e4541086c 100644 --- a/lgsm/config-default/config-lgsm/qwserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/qwserver/_default.cfg @@ -33,8 +33,6 @@ displayip="" # More info | https://docs.linuxgsm.com/alerts#more-info postalert="off" -postdays="7" -posttarget="https://termbin.com" # Discord Alerts | https://docs.linuxgsm.com/alerts/discord discordalert="off" @@ -68,14 +66,18 @@ pushoveralert="off" pushovertoken="accesstoken" pushoveruserkey="userkey" +# Rocket.Chat Alerts | https://docs.linuxgsm.com/alerts/rocket.chat +rocketchatalert="off" +rocketchatwebhook="webhook" +rocketchattoken="" + # Slack Alerts | https://docs.linuxgsm.com/alerts/slack slackalert="off" slackwebhook="webhook" # Telegram Alerts | https://docs.linuxgsm.com/alerts/telegram -# You can add a custom cURL string eg proxy (useful in Russia) or else in "curlcustomstring". -# like a "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help", if you not need -# any custom string in curl - simple ignore this parameter. +# You can add a custom cURL string eg proxy (useful in Russia) in "curlcustomstring". +# For example "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help". telegramalert="off" telegramtoken="accesstoken" telegramchatid="" diff --git a/lgsm/config-default/config-lgsm/ricochetserver/_default.cfg b/lgsm/config-default/config-lgsm/ricochetserver/_default.cfg index d640c1cec..c443cbb47 100644 --- a/lgsm/config-default/config-lgsm/ricochetserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/ricochetserver/_default.cfg @@ -36,8 +36,6 @@ displayip="" # More info | https://docs.linuxgsm.com/alerts#more-info postalert="off" -postdays="7" -posttarget="https://termbin.com" # Discord Alerts | https://docs.linuxgsm.com/alerts/discord discordalert="off" @@ -71,14 +69,18 @@ pushoveralert="off" pushovertoken="accesstoken" pushoveruserkey="userkey" +# Rocket.Chat Alerts | https://docs.linuxgsm.com/alerts/rocket.chat +rocketchatalert="off" +rocketchatwebhook="webhook" +rocketchattoken="" + # Slack Alerts | https://docs.linuxgsm.com/alerts/slack slackalert="off" slackwebhook="webhook" # Telegram Alerts | https://docs.linuxgsm.com/alerts/telegram -# You can add a custom cURL string eg proxy (useful in Russia) or else in "curlcustomstring". -# like a "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help", if you not need -# any custom string in curl - simple ignore this parameter. +# You can add a custom cURL string eg proxy (useful in Russia) in "curlcustomstring". +# For example "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help". telegramalert="off" telegramtoken="accesstoken" telegramchatid="" diff --git a/lgsm/config-default/config-lgsm/roserver/_default.cfg b/lgsm/config-default/config-lgsm/roserver/_default.cfg index c60b0317d..f5659b550 100644 --- a/lgsm/config-default/config-lgsm/roserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/roserver/_default.cfg @@ -37,8 +37,6 @@ displayip="" # More info | https://docs.linuxgsm.com/alerts#more-info postalert="off" -postdays="7" -posttarget="https://termbin.com" # Discord Alerts | https://docs.linuxgsm.com/alerts/discord discordalert="off" @@ -72,14 +70,18 @@ pushoveralert="off" pushovertoken="accesstoken" pushoveruserkey="userkey" +# Rocket.Chat Alerts | https://docs.linuxgsm.com/alerts/rocket.chat +rocketchatalert="off" +rocketchatwebhook="webhook" +rocketchattoken="" + # Slack Alerts | https://docs.linuxgsm.com/alerts/slack slackalert="off" slackwebhook="webhook" # Telegram Alerts | https://docs.linuxgsm.com/alerts/telegram -# You can add a custom cURL string eg proxy (useful in Russia) or else in "curlcustomstring". -# like a "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help", if you not need -# any custom string in curl - simple ignore this parameter. +# You can add a custom cURL string eg proxy (useful in Russia) in "curlcustomstring". +# For example "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help". telegramalert="off" telegramtoken="accesstoken" telegramchatid="" diff --git a/lgsm/config-default/config-lgsm/rtcwserver/_default.cfg b/lgsm/config-default/config-lgsm/rtcwserver/_default.cfg index ca9ab10ee..f2647542b 100644 --- a/lgsm/config-default/config-lgsm/rtcwserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/rtcwserver/_default.cfg @@ -34,8 +34,6 @@ displayip="" # More info | https://docs.linuxgsm.com/alerts#more-info postalert="off" -postdays="7" -posttarget="https://termbin.com" # Discord Alerts | https://docs.linuxgsm.com/alerts/discord discordalert="off" @@ -69,14 +67,18 @@ pushoveralert="off" pushovertoken="accesstoken" pushoveruserkey="userkey" +# Rocket.Chat Alerts | https://docs.linuxgsm.com/alerts/rocket.chat +rocketchatalert="off" +rocketchatwebhook="webhook" +rocketchattoken="" + # Slack Alerts | https://docs.linuxgsm.com/alerts/slack slackalert="off" slackwebhook="webhook" # Telegram Alerts | https://docs.linuxgsm.com/alerts/telegram -# You can add a custom cURL string eg proxy (useful in Russia) or else in "curlcustomstring". -# like a "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help", if you not need -# any custom string in curl - simple ignore this parameter. +# You can add a custom cURL string eg proxy (useful in Russia) in "curlcustomstring". +# For example "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help". telegramalert="off" telegramtoken="accesstoken" telegramchatid="" diff --git a/lgsm/config-default/config-lgsm/rustserver/_default.cfg b/lgsm/config-default/config-lgsm/rustserver/_default.cfg index f75a1f614..b518b00ba 100644 --- a/lgsm/config-default/config-lgsm/rustserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/rustserver/_default.cfg @@ -44,8 +44,6 @@ displayip="" # More info | https://docs.linuxgsm.com/alerts#more-info postalert="off" -postdays="7" -posttarget="https://termbin.com" # Discord Alerts | https://docs.linuxgsm.com/alerts/discord discordalert="off" @@ -79,14 +77,18 @@ pushoveralert="off" pushovertoken="accesstoken" pushoveruserkey="userkey" +# Rocket.Chat Alerts | https://docs.linuxgsm.com/alerts/rocket.chat +rocketchatalert="off" +rocketchatwebhook="webhook" +rocketchattoken="" + # Slack Alerts | https://docs.linuxgsm.com/alerts/slack slackalert="off" slackwebhook="webhook" # Telegram Alerts | https://docs.linuxgsm.com/alerts/telegram -# You can add a custom cURL string eg proxy (useful in Russia) or else in "curlcustomstring". -# like a "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help", if you not need -# any custom string in curl - simple ignore this parameter. +# You can add a custom cURL string eg proxy (useful in Russia) in "curlcustomstring". +# For example "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help". telegramalert="off" telegramtoken="accesstoken" telegramchatid="" diff --git a/lgsm/config-default/config-lgsm/rwserver/_default.cfg b/lgsm/config-default/config-lgsm/rwserver/_default.cfg index ebdf0d691..cddf99818 100644 --- a/lgsm/config-default/config-lgsm/rwserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/rwserver/_default.cfg @@ -32,8 +32,6 @@ displayip="" # More info | https://docs.linuxgsm.com/alerts#more-info postalert="off" -postdays="7" -posttarget="https://termbin.com" # Discord Alerts | https://docs.linuxgsm.com/alerts/discord discordalert="off" @@ -67,14 +65,18 @@ pushoveralert="off" pushovertoken="accesstoken" pushoveruserkey="userkey" +# Rocket.Chat Alerts | https://docs.linuxgsm.com/alerts/rocket.chat +rocketchatalert="off" +rocketchatwebhook="webhook" +rocketchattoken="" + # Slack Alerts | https://docs.linuxgsm.com/alerts/slack slackalert="off" slackwebhook="webhook" # Telegram Alerts | https://docs.linuxgsm.com/alerts/telegram -# You can add a custom cURL string eg proxy (useful in Russia) or else in "curlcustomstring". -# like a "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help", if you not need -# any custom string in curl - simple ignore this parameter. +# You can add a custom cURL string eg proxy (useful in Russia) in "curlcustomstring". +# For example "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help". telegramalert="off" telegramtoken="accesstoken" telegramchatid="" diff --git a/lgsm/config-default/config-lgsm/sampserver/_default.cfg b/lgsm/config-default/config-lgsm/sampserver/_default.cfg index 057f42776..4f88ee743 100644 --- a/lgsm/config-default/config-lgsm/sampserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/sampserver/_default.cfg @@ -33,8 +33,6 @@ displayip="" # More info | https://docs.linuxgsm.com/alerts#more-info postalert="off" -postdays="7" -posttarget="https://termbin.com" # Discord Alerts | https://docs.linuxgsm.com/alerts/discord discordalert="off" @@ -68,14 +66,18 @@ pushoveralert="off" pushovertoken="accesstoken" pushoveruserkey="userkey" +# Rocket.Chat Alerts | https://docs.linuxgsm.com/alerts/rocket.chat +rocketchatalert="off" +rocketchatwebhook="webhook" +rocketchattoken="" + # Slack Alerts | https://docs.linuxgsm.com/alerts/slack slackalert="off" slackwebhook="webhook" # Telegram Alerts | https://docs.linuxgsm.com/alerts/telegram -# You can add a custom cURL string eg proxy (useful in Russia) or else in "curlcustomstring". -# like a "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help", if you not need -# any custom string in curl - simple ignore this parameter. +# You can add a custom cURL string eg proxy (useful in Russia) in "curlcustomstring". +# For example "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help". telegramalert="off" telegramtoken="accesstoken" telegramchatid="" diff --git a/lgsm/config-default/config-lgsm/sbotsserver/_default.cfg b/lgsm/config-default/config-lgsm/sbotsserver/_default.cfg index edbbe9905..c0867e1c8 100644 --- a/lgsm/config-default/config-lgsm/sbotsserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/sbotsserver/_default.cfg @@ -37,8 +37,6 @@ displayip="" # More info | https://docs.linuxgsm.com/alerts#more-info postalert="off" -postdays="7" -posttarget="https://termbin.com" # Discord Alerts | https://docs.linuxgsm.com/alerts/discord discordalert="off" @@ -72,14 +70,18 @@ pushoveralert="off" pushovertoken="accesstoken" pushoveruserkey="userkey" +# Rocket.Chat Alerts | https://docs.linuxgsm.com/alerts/rocket.chat +rocketchatalert="off" +rocketchatwebhook="webhook" +rocketchattoken="" + # Slack Alerts | https://docs.linuxgsm.com/alerts/slack slackalert="off" slackwebhook="webhook" # Telegram Alerts | https://docs.linuxgsm.com/alerts/telegram -# You can add a custom cURL string eg proxy (useful in Russia) or else in "curlcustomstring". -# like a "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help", if you not need -# any custom string in curl - simple ignore this parameter. +# You can add a custom cURL string eg proxy (useful in Russia) in "curlcustomstring". +# For example "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help". telegramalert="off" telegramtoken="accesstoken" telegramchatid="" diff --git a/lgsm/config-default/config-lgsm/sbserver/_default.cfg b/lgsm/config-default/config-lgsm/sbserver/_default.cfg index f96d8e29b..b3bffbcad 100644 --- a/lgsm/config-default/config-lgsm/sbserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/sbserver/_default.cfg @@ -36,8 +36,6 @@ displayip="" # More info | https://docs.linuxgsm.com/alerts#more-info postalert="off" -postdays="7" -posttarget="https://termbin.com" # Discord Alerts | https://docs.linuxgsm.com/alerts/discord discordalert="off" @@ -71,14 +69,18 @@ pushoveralert="off" pushovertoken="accesstoken" pushoveruserkey="userkey" +# Rocket.Chat Alerts | https://docs.linuxgsm.com/alerts/rocket.chat +rocketchatalert="off" +rocketchatwebhook="webhook" +rocketchattoken="" + # Slack Alerts | https://docs.linuxgsm.com/alerts/slack slackalert="off" slackwebhook="webhook" # Telegram Alerts | https://docs.linuxgsm.com/alerts/telegram -# You can add a custom cURL string eg proxy (useful in Russia) or else in "curlcustomstring". -# like a "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help", if you not need -# any custom string in curl - simple ignore this parameter. +# You can add a custom cURL string eg proxy (useful in Russia) in "curlcustomstring". +# For example "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help". telegramalert="off" telegramtoken="accesstoken" telegramchatid="" diff --git a/lgsm/config-default/config-lgsm/sdtdserver/_default.cfg b/lgsm/config-default/config-lgsm/sdtdserver/_default.cfg index ba5d22059..3dad1f106 100644 --- a/lgsm/config-default/config-lgsm/sdtdserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/sdtdserver/_default.cfg @@ -32,8 +32,6 @@ displayip="" # More info | https://docs.linuxgsm.com/alerts#more-info postalert="off" -postdays="7" -posttarget="https://termbin.com" # Discord Alerts | https://docs.linuxgsm.com/alerts/discord discordalert="off" @@ -67,14 +65,18 @@ pushoveralert="off" pushovertoken="accesstoken" pushoveruserkey="userkey" +# Rocket.Chat Alerts | https://docs.linuxgsm.com/alerts/rocket.chat +rocketchatalert="off" +rocketchatwebhook="webhook" +rocketchattoken="" + # Slack Alerts | https://docs.linuxgsm.com/alerts/slack slackalert="off" slackwebhook="webhook" # Telegram Alerts | https://docs.linuxgsm.com/alerts/telegram -# You can add a custom cURL string eg proxy (useful in Russia) or else in "curlcustomstring". -# like a "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help", if you not need -# any custom string in curl - simple ignore this parameter. +# You can add a custom cURL string eg proxy (useful in Russia) in "curlcustomstring". +# For example "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help". telegramalert="off" telegramtoken="accesstoken" telegramchatid="" diff --git a/lgsm/config-default/config-lgsm/sfcserver/_default.cfg b/lgsm/config-default/config-lgsm/sfcserver/_default.cfg index aa3a386a8..746b9e84c 100644 --- a/lgsm/config-default/config-lgsm/sfcserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/sfcserver/_default.cfg @@ -37,8 +37,6 @@ displayip="" # More info | https://docs.linuxgsm.com/alerts#more-info postalert="off" -postdays="7" -posttarget="https://termbin.com" # Discord Alerts | https://docs.linuxgsm.com/alerts/discord discordalert="off" @@ -72,14 +70,18 @@ pushoveralert="off" pushovertoken="accesstoken" pushoveruserkey="userkey" +# Rocket.Chat Alerts | https://docs.linuxgsm.com/alerts/rocket.chat +rocketchatalert="off" +rocketchatwebhook="webhook" +rocketchattoken="" + # Slack Alerts | https://docs.linuxgsm.com/alerts/slack slackalert="off" slackwebhook="webhook" # Telegram Alerts | https://docs.linuxgsm.com/alerts/telegram -# You can add a custom cURL string eg proxy (useful in Russia) or else in "curlcustomstring". -# like a "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help", if you not need -# any custom string in curl - simple ignore this parameter. +# You can add a custom cURL string eg proxy (useful in Russia) in "curlcustomstring". +# For example "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help". telegramalert="off" telegramtoken="accesstoken" telegramchatid="" diff --git a/lgsm/config-default/config-lgsm/sof2server/_default.cfg b/lgsm/config-default/config-lgsm/sof2server/_default.cfg index 572933cef..79b6ff01b 100644 --- a/lgsm/config-default/config-lgsm/sof2server/_default.cfg +++ b/lgsm/config-default/config-lgsm/sof2server/_default.cfg @@ -34,8 +34,6 @@ displayip="" # More info | https://docs.linuxgsm.com/alerts#more-info postalert="off" -postdays="7" -posttarget="https://termbin.com" # Discord Alerts | https://docs.linuxgsm.com/alerts/discord discordalert="off" @@ -69,14 +67,18 @@ pushoveralert="off" pushovertoken="accesstoken" pushoveruserkey="userkey" +# Rocket.Chat Alerts | https://docs.linuxgsm.com/alerts/rocket.chat +rocketchatalert="off" +rocketchatwebhook="webhook" +rocketchattoken="" + # Slack Alerts | https://docs.linuxgsm.com/alerts/slack slackalert="off" slackwebhook="webhook" # Telegram Alerts | https://docs.linuxgsm.com/alerts/telegram -# You can add a custom cURL string eg proxy (useful in Russia) or else in "curlcustomstring". -# like a "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help", if you not need -# any custom string in curl - simple ignore this parameter. +# You can add a custom cURL string eg proxy (useful in Russia) in "curlcustomstring". +# For example "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help". telegramalert="off" telegramtoken="accesstoken" telegramchatid="" diff --git a/lgsm/config-default/config-lgsm/solserver/_default.cfg b/lgsm/config-default/config-lgsm/solserver/_default.cfg index c543c49fb..b0fda3b81 100644 --- a/lgsm/config-default/config-lgsm/solserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/solserver/_default.cfg @@ -33,8 +33,6 @@ displayip="" # More info | https://docs.linuxgsm.com/alerts#more-info postalert="off" -postdays="7" -posttarget="https://termbin.com" # Discord Alerts | https://docs.linuxgsm.com/alerts/discord discordalert="off" @@ -68,14 +66,18 @@ pushoveralert="off" pushovertoken="accesstoken" pushoveruserkey="userkey" +# Rocket.Chat Alerts | https://docs.linuxgsm.com/alerts/rocket.chat +rocketchatalert="off" +rocketchatwebhook="webhook" +rocketchattoken="" + # Slack Alerts | https://docs.linuxgsm.com/alerts/slack slackalert="off" slackwebhook="webhook" # Telegram Alerts | https://docs.linuxgsm.com/alerts/telegram -# You can add a custom cURL string eg proxy (useful in Russia) or else in "curlcustomstring". -# like a "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help", if you not need -# any custom string in curl - simple ignore this parameter. +# You can add a custom cURL string eg proxy (useful in Russia) in "curlcustomstring". +# For example "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help". telegramalert="off" telegramtoken="accesstoken" telegramchatid="" diff --git a/lgsm/config-default/config-lgsm/squadserver/_default.cfg b/lgsm/config-default/config-lgsm/squadserver/_default.cfg index 14e5862a3..c329b06b4 100644 --- a/lgsm/config-default/config-lgsm/squadserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/squadserver/_default.cfg @@ -34,8 +34,6 @@ displayip="" # More info | https://docs.linuxgsm.com/alerts#more-info postalert="off" -postdays="7" -posttarget="https://termbin.com" # Discord Alerts | https://docs.linuxgsm.com/alerts/discord discordalert="off" @@ -69,14 +67,18 @@ pushoveralert="off" pushovertoken="accesstoken" pushoveruserkey="userkey" +# Rocket.Chat Alerts | https://docs.linuxgsm.com/alerts/rocket.chat +rocketchatalert="off" +rocketchatwebhook="webhook" +rocketchattoken="" + # Slack Alerts | https://docs.linuxgsm.com/alerts/slack slackalert="off" slackwebhook="webhook" # Telegram Alerts | https://docs.linuxgsm.com/alerts/telegram -# You can add a custom cURL string eg proxy (useful in Russia) or else in "curlcustomstring". -# like a "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help", if you not need -# any custom string in curl - simple ignore this parameter. +# You can add a custom cURL string eg proxy (useful in Russia) in "curlcustomstring". +# For example "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help". telegramalert="off" telegramtoken="accesstoken" telegramchatid="" diff --git a/lgsm/config-default/config-lgsm/ss3server/_default.cfg b/lgsm/config-default/config-lgsm/ss3server/_default.cfg index 87f5d2eb3..9cb3f5601 100644 --- a/lgsm/config-default/config-lgsm/ss3server/_default.cfg +++ b/lgsm/config-default/config-lgsm/ss3server/_default.cfg @@ -33,8 +33,6 @@ displayip="" # More info | https://docs.linuxgsm.com/alerts#more-info postalert="off" -postdays="7" -posttarget="https://termbin.com" # Discord Alerts | https://docs.linuxgsm.com/alerts/discord discordalert="off" @@ -68,14 +66,18 @@ pushoveralert="off" pushovertoken="accesstoken" pushoveruserkey="userkey" +# Rocket.Chat Alerts | https://docs.linuxgsm.com/alerts/rocket.chat +rocketchatalert="off" +rocketchatwebhook="webhook" +rocketchattoken="" + # Slack Alerts | https://docs.linuxgsm.com/alerts/slack slackalert="off" slackwebhook="webhook" # Telegram Alerts | https://docs.linuxgsm.com/alerts/telegram -# You can add a custom cURL string eg proxy (useful in Russia) or else in "curlcustomstring". -# like a "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help", if you not need -# any custom string in curl - simple ignore this parameter. +# You can add a custom cURL string eg proxy (useful in Russia) in "curlcustomstring". +# For example "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help". telegramalert="off" telegramtoken="accesstoken" telegramchatid="" diff --git a/lgsm/config-default/config-lgsm/stserver/_default.cfg b/lgsm/config-default/config-lgsm/stserver/_default.cfg index bed1f3477..d7caf33e6 100644 --- a/lgsm/config-default/config-lgsm/stserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/stserver/_default.cfg @@ -39,8 +39,6 @@ displayip="" # More info | https://docs.linuxgsm.com/alerts#more-info postalert="off" -postdays="7" -posttarget="https://termbin.com" # Discord Alerts | https://docs.linuxgsm.com/alerts/discord discordalert="off" @@ -74,14 +72,18 @@ pushoveralert="off" pushovertoken="accesstoken" pushoveruserkey="userkey" +# Rocket.Chat Alerts | https://docs.linuxgsm.com/alerts/rocket.chat +rocketchatalert="off" +rocketchatwebhook="webhook" +rocketchattoken="" + # Slack Alerts | https://docs.linuxgsm.com/alerts/slack slackalert="off" slackwebhook="webhook" # Telegram Alerts | https://docs.linuxgsm.com/alerts/telegram -# You can add a custom cURL string eg proxy (useful in Russia) or else in "curlcustomstring". -# like a "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help", if you not need -# any custom string in curl - simple ignore this parameter. +# You can add a custom cURL string eg proxy (useful in Russia) in "curlcustomstring". +# For example "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help". telegramalert="off" telegramtoken="accesstoken" telegramchatid="" diff --git a/lgsm/config-default/config-lgsm/svenserver/_default.cfg b/lgsm/config-default/config-lgsm/svenserver/_default.cfg index e469e9c8b..908dd046d 100644 --- a/lgsm/config-default/config-lgsm/svenserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/svenserver/_default.cfg @@ -36,8 +36,6 @@ displayip="" # More info | https://docs.linuxgsm.com/alerts#more-info postalert="off" -postdays="7" -posttarget="https://termbin.com" # Discord Alerts | https://docs.linuxgsm.com/alerts/discord discordalert="off" @@ -71,14 +69,18 @@ pushoveralert="off" pushovertoken="accesstoken" pushoveruserkey="userkey" +# Rocket.Chat Alerts | https://docs.linuxgsm.com/alerts/rocket.chat +rocketchatalert="off" +rocketchatwebhook="webhook" +rocketchattoken="" + # Slack Alerts | https://docs.linuxgsm.com/alerts/slack slackalert="off" slackwebhook="webhook" # Telegram Alerts | https://docs.linuxgsm.com/alerts/telegram -# You can add a custom cURL string eg proxy (useful in Russia) or else in "curlcustomstring". -# like a "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help", if you not need -# any custom string in curl - simple ignore this parameter. +# You can add a custom cURL string eg proxy (useful in Russia) in "curlcustomstring". +# For example "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help". telegramalert="off" telegramtoken="accesstoken" telegramchatid="" diff --git a/lgsm/config-default/config-lgsm/terrariaserver/_default.cfg b/lgsm/config-default/config-lgsm/terrariaserver/_default.cfg index 015a117c5..79e683f65 100644 --- a/lgsm/config-default/config-lgsm/terrariaserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/terrariaserver/_default.cfg @@ -36,8 +36,6 @@ displayip="" # More info | https://docs.linuxgsm.com/alerts#more-info postalert="off" -postdays="7" -posttarget="https://termbin.com" # Discord Alerts | https://docs.linuxgsm.com/alerts/discord discordalert="off" @@ -71,14 +69,18 @@ pushoveralert="off" pushovertoken="accesstoken" pushoveruserkey="userkey" +# Rocket.Chat Alerts | https://docs.linuxgsm.com/alerts/rocket.chat +rocketchatalert="off" +rocketchatwebhook="webhook" +rocketchattoken="" + # Slack Alerts | https://docs.linuxgsm.com/alerts/slack slackalert="off" slackwebhook="webhook" # Telegram Alerts | https://docs.linuxgsm.com/alerts/telegram -# You can add a custom cURL string eg proxy (useful in Russia) or else in "curlcustomstring". -# like a "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help", if you not need -# any custom string in curl - simple ignore this parameter. +# You can add a custom cURL string eg proxy (useful in Russia) in "curlcustomstring". +# For example "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help". telegramalert="off" telegramtoken="accesstoken" telegramchatid="" diff --git a/lgsm/config-default/config-lgsm/tf2server/_default.cfg b/lgsm/config-default/config-lgsm/tf2server/_default.cfg index 19df009cc..3aa580d39 100644 --- a/lgsm/config-default/config-lgsm/tf2server/_default.cfg +++ b/lgsm/config-default/config-lgsm/tf2server/_default.cfg @@ -42,8 +42,6 @@ displayip="" # More info | https://docs.linuxgsm.com/alerts#more-info postalert="off" -postdays="7" -posttarget="https://termbin.com" # Discord Alerts | https://docs.linuxgsm.com/alerts/discord discordalert="off" @@ -77,14 +75,18 @@ pushoveralert="off" pushovertoken="accesstoken" pushoveruserkey="userkey" +# Rocket.Chat Alerts | https://docs.linuxgsm.com/alerts/rocket.chat +rocketchatalert="off" +rocketchatwebhook="webhook" +rocketchattoken="" + # Slack Alerts | https://docs.linuxgsm.com/alerts/slack slackalert="off" slackwebhook="webhook" # Telegram Alerts | https://docs.linuxgsm.com/alerts/telegram -# You can add a custom cURL string eg proxy (useful in Russia) or else in "curlcustomstring". -# like a "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help", if you not need -# any custom string in curl - simple ignore this parameter. +# You can add a custom cURL string eg proxy (useful in Russia) in "curlcustomstring". +# For example "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help". telegramalert="off" telegramtoken="accesstoken" telegramchatid="" diff --git a/lgsm/config-default/config-lgsm/tfcserver/_default.cfg b/lgsm/config-default/config-lgsm/tfcserver/_default.cfg index 0d8697c45..c29b43642 100644 --- a/lgsm/config-default/config-lgsm/tfcserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/tfcserver/_default.cfg @@ -36,8 +36,6 @@ displayip="" # More info | https://docs.linuxgsm.com/alerts#more-info postalert="off" -postdays="7" -posttarget="https://termbin.com" # Discord Alerts | https://docs.linuxgsm.com/alerts/discord discordalert="off" @@ -71,14 +69,18 @@ pushoveralert="off" pushovertoken="accesstoken" pushoveruserkey="userkey" +# Rocket.Chat Alerts | https://docs.linuxgsm.com/alerts/rocket.chat +rocketchatalert="off" +rocketchatwebhook="webhook" +rocketchattoken="" + # Slack Alerts | https://docs.linuxgsm.com/alerts/slack slackalert="off" slackwebhook="webhook" # Telegram Alerts | https://docs.linuxgsm.com/alerts/telegram -# You can add a custom cURL string eg proxy (useful in Russia) or else in "curlcustomstring". -# like a "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help", if you not need -# any custom string in curl - simple ignore this parameter. +# You can add a custom cURL string eg proxy (useful in Russia) in "curlcustomstring". +# For example "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help". telegramalert="off" telegramtoken="accesstoken" telegramchatid="" diff --git a/lgsm/config-default/config-lgsm/ts3server/_default.cfg b/lgsm/config-default/config-lgsm/ts3server/_default.cfg index 4c83b6146..34cb54fb8 100644 --- a/lgsm/config-default/config-lgsm/ts3server/_default.cfg +++ b/lgsm/config-default/config-lgsm/ts3server/_default.cfg @@ -29,8 +29,6 @@ displayip="" # More info | https://docs.linuxgsm.com/alerts#more-info postalert="off" -postdays="7" -posttarget="https://termbin.com" # Discord Alerts | https://docs.linuxgsm.com/alerts/discord discordalert="off" @@ -64,14 +62,18 @@ pushoveralert="off" pushovertoken="accesstoken" pushoveruserkey="userkey" +# Rocket.Chat Alerts | https://docs.linuxgsm.com/alerts/rocket.chat +rocketchatalert="off" +rocketchatwebhook="webhook" +rocketchattoken="" + # Slack Alerts | https://docs.linuxgsm.com/alerts/slack slackalert="off" slackwebhook="webhook" # Telegram Alerts | https://docs.linuxgsm.com/alerts/telegram -# You can add a custom cURL string eg proxy (useful in Russia) or else in "curlcustomstring". -# like a "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help", if you not need -# any custom string in curl - simple ignore this parameter. +# You can add a custom cURL string eg proxy (useful in Russia) in "curlcustomstring". +# For example "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help". telegramalert="off" telegramtoken="accesstoken" telegramchatid="" diff --git a/lgsm/config-default/config-lgsm/tsserver/_default.cfg b/lgsm/config-default/config-lgsm/tsserver/_default.cfg index d02b649d4..fb4fb9f01 100644 --- a/lgsm/config-default/config-lgsm/tsserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/tsserver/_default.cfg @@ -36,8 +36,6 @@ displayip="" # More info | https://docs.linuxgsm.com/alerts#more-info postalert="off" -postdays="7" -posttarget="https://termbin.com" # Discord Alerts | https://docs.linuxgsm.com/alerts/discord discordalert="off" @@ -71,14 +69,18 @@ pushoveralert="off" pushovertoken="accesstoken" pushoveruserkey="userkey" +# Rocket.Chat Alerts | https://docs.linuxgsm.com/alerts/rocket.chat +rocketchatalert="off" +rocketchatwebhook="webhook" +rocketchattoken="" + # Slack Alerts | https://docs.linuxgsm.com/alerts/slack slackalert="off" slackwebhook="webhook" # Telegram Alerts | https://docs.linuxgsm.com/alerts/telegram -# You can add a custom cURL string eg proxy (useful in Russia) or else in "curlcustomstring". -# like a "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help", if you not need -# any custom string in curl - simple ignore this parameter. +# You can add a custom cURL string eg proxy (useful in Russia) in "curlcustomstring". +# For example "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help". telegramalert="off" telegramtoken="accesstoken" telegramchatid="" diff --git a/lgsm/config-default/config-lgsm/tuserver/_default.cfg b/lgsm/config-default/config-lgsm/tuserver/_default.cfg index f93e99607..eed1cbdcb 100644 --- a/lgsm/config-default/config-lgsm/tuserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/tuserver/_default.cfg @@ -39,8 +39,6 @@ displayip="" # More info | https://docs.linuxgsm.com/alerts#more-info postalert="off" -postdays="7" -posttarget="https://termbin.com" # Discord Alerts | https://docs.linuxgsm.com/alerts/discord discordalert="off" @@ -74,14 +72,18 @@ pushoveralert="off" pushovertoken="accesstoken" pushoveruserkey="userkey" +# Rocket.Chat Alerts | https://docs.linuxgsm.com/alerts/rocket.chat +rocketchatalert="off" +rocketchatwebhook="webhook" +rocketchattoken="" + # Slack Alerts | https://docs.linuxgsm.com/alerts/slack slackalert="off" slackwebhook="webhook" # Telegram Alerts | https://docs.linuxgsm.com/alerts/telegram -# You can add a custom cURL string eg proxy (useful in Russia) or else in "curlcustomstring". -# like a "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help", if you not need -# any custom string in curl - simple ignore this parameter. +# You can add a custom cURL string eg proxy (useful in Russia) in "curlcustomstring". +# For example "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help". telegramalert="off" telegramtoken="accesstoken" telegramchatid="" diff --git a/lgsm/config-default/config-lgsm/twserver/_default.cfg b/lgsm/config-default/config-lgsm/twserver/_default.cfg index 5f907e86a..9140ed859 100644 --- a/lgsm/config-default/config-lgsm/twserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/twserver/_default.cfg @@ -36,8 +36,6 @@ displayip="" # More info | https://docs.linuxgsm.com/alerts#more-info postalert="off" -postdays="7" -posttarget="https://termbin.com" # Discord Alerts | https://docs.linuxgsm.com/alerts/discord discordalert="off" @@ -71,14 +69,18 @@ pushoveralert="off" pushovertoken="accesstoken" pushoveruserkey="userkey" +# Rocket.Chat Alerts | https://docs.linuxgsm.com/alerts/rocket.chat +rocketchatalert="off" +rocketchatwebhook="webhook" +rocketchattoken="" + # Slack Alerts | https://docs.linuxgsm.com/alerts/slack slackalert="off" slackwebhook="webhook" # Telegram Alerts | https://docs.linuxgsm.com/alerts/telegram -# You can add a custom cURL string eg proxy (useful in Russia) or else in "curlcustomstring". -# like a "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help", if you not need -# any custom string in curl - simple ignore this parameter. +# You can add a custom cURL string eg proxy (useful in Russia) in "curlcustomstring". +# For example "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help". telegramalert="off" telegramtoken="accesstoken" telegramchatid="" diff --git a/lgsm/config-default/config-lgsm/untserver/_default.cfg b/lgsm/config-default/config-lgsm/untserver/_default.cfg index 0137f19d3..1a8230e0a 100644 --- a/lgsm/config-default/config-lgsm/untserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/untserver/_default.cfg @@ -35,8 +35,6 @@ displayip="" # More info | https://docs.linuxgsm.com/alerts#more-info postalert="off" -postdays="7" -posttarget="https://termbin.com" # Discord Alerts | https://docs.linuxgsm.com/alerts/discord discordalert="off" @@ -70,14 +68,18 @@ pushoveralert="off" pushovertoken="accesstoken" pushoveruserkey="userkey" +# Rocket.Chat Alerts | https://docs.linuxgsm.com/alerts/rocket.chat +rocketchatalert="off" +rocketchatwebhook="webhook" +rocketchattoken="" + # Slack Alerts | https://docs.linuxgsm.com/alerts/slack slackalert="off" slackwebhook="webhook" # Telegram Alerts | https://docs.linuxgsm.com/alerts/telegram -# You can add a custom cURL string eg proxy (useful in Russia) or else in "curlcustomstring". -# like a "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help", if you not need -# any custom string in curl - simple ignore this parameter. +# You can add a custom cURL string eg proxy (useful in Russia) in "curlcustomstring". +# For example "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help". telegramalert="off" telegramtoken="accesstoken" telegramchatid="" diff --git a/lgsm/config-default/config-lgsm/ut2k4server/_default.cfg b/lgsm/config-default/config-lgsm/ut2k4server/_default.cfg index 01407b510..1bf464c29 100644 --- a/lgsm/config-default/config-lgsm/ut2k4server/_default.cfg +++ b/lgsm/config-default/config-lgsm/ut2k4server/_default.cfg @@ -33,8 +33,6 @@ displayip="" # More info | https://docs.linuxgsm.com/alerts#more-info postalert="off" -postdays="7" -posttarget="https://termbin.com" # Discord Alerts | https://docs.linuxgsm.com/alerts/discord discordalert="off" @@ -68,14 +66,18 @@ pushoveralert="off" pushovertoken="accesstoken" pushoveruserkey="userkey" +# Rocket.Chat Alerts | https://docs.linuxgsm.com/alerts/rocket.chat +rocketchatalert="off" +rocketchatwebhook="webhook" +rocketchattoken="" + # Slack Alerts | https://docs.linuxgsm.com/alerts/slack slackalert="off" slackwebhook="webhook" # Telegram Alerts | https://docs.linuxgsm.com/alerts/telegram -# You can add a custom cURL string eg proxy (useful in Russia) or else in "curlcustomstring". -# like a "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help", if you not need -# any custom string in curl - simple ignore this parameter. +# You can add a custom cURL string eg proxy (useful in Russia) in "curlcustomstring". +# For example "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help". telegramalert="off" telegramtoken="accesstoken" telegramchatid="" diff --git a/lgsm/config-default/config-lgsm/ut3server/_default.cfg b/lgsm/config-default/config-lgsm/ut3server/_default.cfg index bdebcfdbb..e8f93eb02 100644 --- a/lgsm/config-default/config-lgsm/ut3server/_default.cfg +++ b/lgsm/config-default/config-lgsm/ut3server/_default.cfg @@ -49,8 +49,6 @@ displayip="" # More info | https://docs.linuxgsm.com/alerts#more-info postalert="off" -postdays="7" -posttarget="https://termbin.com" # Discord Alerts | https://docs.linuxgsm.com/alerts/discord discordalert="off" @@ -84,14 +82,18 @@ pushoveralert="off" pushovertoken="accesstoken" pushoveruserkey="userkey" +# Rocket.Chat Alerts | https://docs.linuxgsm.com/alerts/rocket.chat +rocketchatalert="off" +rocketchatwebhook="webhook" +rocketchattoken="" + # Slack Alerts | https://docs.linuxgsm.com/alerts/slack slackalert="off" slackwebhook="webhook" # Telegram Alerts | https://docs.linuxgsm.com/alerts/telegram -# You can add a custom cURL string eg proxy (useful in Russia) or else in "curlcustomstring". -# like a "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help", if you not need -# any custom string in curl - simple ignore this parameter. +# You can add a custom cURL string eg proxy (useful in Russia) in "curlcustomstring". +# For example "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help". telegramalert="off" telegramtoken="accesstoken" telegramchatid="" diff --git a/lgsm/config-default/config-lgsm/ut99server/_default.cfg b/lgsm/config-default/config-lgsm/ut99server/_default.cfg index 901b02d22..70699e1c4 100644 --- a/lgsm/config-default/config-lgsm/ut99server/_default.cfg +++ b/lgsm/config-default/config-lgsm/ut99server/_default.cfg @@ -33,8 +33,6 @@ displayip="" # More info | https://docs.linuxgsm.com/alerts#more-info postalert="off" -postdays="7" -posttarget="https://termbin.com" # Discord Alerts | https://docs.linuxgsm.com/alerts/discord discordalert="off" @@ -68,14 +66,18 @@ pushoveralert="off" pushovertoken="accesstoken" pushoveruserkey="userkey" +# Rocket.Chat Alerts | https://docs.linuxgsm.com/alerts/rocket.chat +rocketchatalert="off" +rocketchatwebhook="webhook" +rocketchattoken="" + # Slack Alerts | https://docs.linuxgsm.com/alerts/slack slackalert="off" slackwebhook="webhook" # Telegram Alerts | https://docs.linuxgsm.com/alerts/telegram -# You can add a custom cURL string eg proxy (useful in Russia) or else in "curlcustomstring". -# like a "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help", if you not need -# any custom string in curl - simple ignore this parameter. +# You can add a custom cURL string eg proxy (useful in Russia) in "curlcustomstring". +# For example "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help". telegramalert="off" telegramtoken="accesstoken" telegramchatid="" diff --git a/lgsm/config-default/config-lgsm/utserver/_default.cfg b/lgsm/config-default/config-lgsm/utserver/_default.cfg index 45d6e1c32..a21c4a1bc 100644 --- a/lgsm/config-default/config-lgsm/utserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/utserver/_default.cfg @@ -37,8 +37,6 @@ displayip="" # More info | https://docs.linuxgsm.com/alerts#more-info postalert="off" -postdays="7" -posttarget="https://termbin.com" # Discord Alerts | https://docs.linuxgsm.com/alerts/discord discordalert="off" @@ -72,14 +70,18 @@ pushoveralert="off" pushovertoken="accesstoken" pushoveruserkey="userkey" +# Rocket.Chat Alerts | https://docs.linuxgsm.com/alerts/rocket.chat +rocketchatalert="off" +rocketchatwebhook="webhook" +rocketchattoken="" + # Slack Alerts | https://docs.linuxgsm.com/alerts/slack slackalert="off" slackwebhook="webhook" # Telegram Alerts | https://docs.linuxgsm.com/alerts/telegram -# You can add a custom cURL string eg proxy (useful in Russia) or else in "curlcustomstring". -# like a "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help", if you not need -# any custom string in curl - simple ignore this parameter. +# You can add a custom cURL string eg proxy (useful in Russia) in "curlcustomstring". +# For example "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help". telegramalert="off" telegramtoken="accesstoken" telegramchatid="" diff --git a/lgsm/config-default/config-lgsm/vsserver/_default.cfg b/lgsm/config-default/config-lgsm/vsserver/_default.cfg index 2228e8cbb..f6bb4394c 100644 --- a/lgsm/config-default/config-lgsm/vsserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/vsserver/_default.cfg @@ -36,8 +36,6 @@ displayip="" # More info | https://docs.linuxgsm.com/alerts#more-info postalert="off" -postdays="7" -posttarget="https://termbin.com" # Discord Alerts | https://docs.linuxgsm.com/alerts/discord discordalert="off" @@ -71,14 +69,18 @@ pushoveralert="off" pushovertoken="accesstoken" pushoveruserkey="userkey" +# Rocket.Chat Alerts | https://docs.linuxgsm.com/alerts/rocket.chat +rocketchatalert="off" +rocketchatwebhook="webhook" +rocketchattoken="" + # Slack Alerts | https://docs.linuxgsm.com/alerts/slack slackalert="off" slackwebhook="webhook" # Telegram Alerts | https://docs.linuxgsm.com/alerts/telegram -# You can add a custom cURL string eg proxy (useful in Russia) or else in "curlcustomstring". -# like a "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help", if you not need -# any custom string in curl - simple ignore this parameter. +# You can add a custom cURL string eg proxy (useful in Russia) in "curlcustomstring". +# For example "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help". telegramalert="off" telegramtoken="accesstoken" telegramchatid="" diff --git a/lgsm/config-default/config-lgsm/wetserver/_default.cfg b/lgsm/config-default/config-lgsm/wetserver/_default.cfg index 63c5e49db..b9ed41c69 100644 --- a/lgsm/config-default/config-lgsm/wetserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/wetserver/_default.cfg @@ -29,8 +29,6 @@ displayip="" # More info | https://docs.linuxgsm.com/alerts#more-info postalert="off" -postdays="7" -posttarget="https://termbin.com" # Discord Alerts | https://docs.linuxgsm.com/alerts/discord discordalert="off" @@ -64,14 +62,18 @@ pushoveralert="off" pushovertoken="accesstoken" pushoveruserkey="userkey" +# Rocket.Chat Alerts | https://docs.linuxgsm.com/alerts/rocket.chat +rocketchatalert="off" +rocketchatwebhook="webhook" +rocketchattoken="" + # Slack Alerts | https://docs.linuxgsm.com/alerts/slack slackalert="off" slackwebhook="webhook" # Telegram Alerts | https://docs.linuxgsm.com/alerts/telegram -# You can add a custom cURL string eg proxy (useful in Russia) or else in "curlcustomstring". -# like a "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help", if you not need -# any custom string in curl - simple ignore this parameter. +# You can add a custom cURL string eg proxy (useful in Russia) in "curlcustomstring". +# For example "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help". telegramalert="off" telegramtoken="accesstoken" telegramchatid="" diff --git a/lgsm/config-default/config-lgsm/wfserver/_default.cfg b/lgsm/config-default/config-lgsm/wfserver/_default.cfg index 7a09021f6..73f0bb8df 100644 --- a/lgsm/config-default/config-lgsm/wfserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/wfserver/_default.cfg @@ -34,8 +34,6 @@ displayip="" # More info | https://docs.linuxgsm.com/alerts#more-info postalert="off" -postdays="7" -posttarget="https://termbin.com" # Discord Alerts | https://docs.linuxgsm.com/alerts/discord discordalert="off" @@ -69,14 +67,18 @@ pushoveralert="off" pushovertoken="accesstoken" pushoveruserkey="userkey" +# Rocket.Chat Alerts | https://docs.linuxgsm.com/alerts/rocket.chat +rocketchatalert="off" +rocketchatwebhook="webhook" +rocketchattoken="" + # Slack Alerts | https://docs.linuxgsm.com/alerts/slack slackalert="off" slackwebhook="webhook" # Telegram Alerts | https://docs.linuxgsm.com/alerts/telegram -# You can add a custom cURL string eg proxy (useful in Russia) or else in "curlcustomstring". -# like a "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help", if you not need -# any custom string in curl - simple ignore this parameter. +# You can add a custom cURL string eg proxy (useful in Russia) in "curlcustomstring". +# For example "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help". telegramalert="off" telegramtoken="accesstoken" telegramchatid="" diff --git a/lgsm/config-default/config-lgsm/wurmserver/_default.cfg b/lgsm/config-default/config-lgsm/wurmserver/_default.cfg index 61a68a70b..0ad05ae4b 100644 --- a/lgsm/config-default/config-lgsm/wurmserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/wurmserver/_default.cfg @@ -31,8 +31,6 @@ displayip="" # More info | https://docs.linuxgsm.com/alerts#more-info postalert="off" -postdays="7" -posttarget="https://termbin.com" # Discord Alerts | https://docs.linuxgsm.com/alerts/discord discordalert="off" @@ -66,14 +64,18 @@ pushoveralert="off" pushovertoken="accesstoken" pushoveruserkey="userkey" +# Rocket.Chat Alerts | https://docs.linuxgsm.com/alerts/rocket.chat +rocketchatalert="off" +rocketchatwebhook="webhook" +rocketchattoken="" + # Slack Alerts | https://docs.linuxgsm.com/alerts/slack slackalert="off" slackwebhook="webhook" # Telegram Alerts | https://docs.linuxgsm.com/alerts/telegram -# You can add a custom cURL string eg proxy (useful in Russia) or else in "curlcustomstring". -# like a "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help", if you not need -# any custom string in curl - simple ignore this parameter. +# You can add a custom cURL string eg proxy (useful in Russia) in "curlcustomstring". +# For example "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help". telegramalert="off" telegramtoken="accesstoken" telegramchatid="" diff --git a/lgsm/config-default/config-lgsm/zmrserver/_default.cfg b/lgsm/config-default/config-lgsm/zmrserver/_default.cfg index 8e9a09505..ce5cb3329 100644 --- a/lgsm/config-default/config-lgsm/zmrserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/zmrserver/_default.cfg @@ -37,8 +37,6 @@ displayip="" # More info | https://docs.linuxgsm.com/alerts#more-info postalert="off" -postdays="7" -posttarget="https://termbin.com" # Discord Alerts | https://docs.linuxgsm.com/alerts/discord discordalert="off" @@ -72,14 +70,18 @@ pushoveralert="off" pushovertoken="accesstoken" pushoveruserkey="userkey" +# Rocket.Chat Alerts | https://docs.linuxgsm.com/alerts/rocket.chat +rocketchatalert="off" +rocketchatwebhook="webhook" +rocketchattoken="" + # Slack Alerts | https://docs.linuxgsm.com/alerts/slack slackalert="off" slackwebhook="webhook" # Telegram Alerts | https://docs.linuxgsm.com/alerts/telegram -# You can add a custom cURL string eg proxy (useful in Russia) or else in "curlcustomstring". -# like a "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help", if you not need -# any custom string in curl - simple ignore this parameter. +# You can add a custom cURL string eg proxy (useful in Russia) in "curlcustomstring". +# For example "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help". telegramalert="off" telegramtoken="accesstoken" telegramchatid="" diff --git a/lgsm/config-default/config-lgsm/zpsserver/_default.cfg b/lgsm/config-default/config-lgsm/zpsserver/_default.cfg index a4f71fcb8..cf26a9e84 100644 --- a/lgsm/config-default/config-lgsm/zpsserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/zpsserver/_default.cfg @@ -42,8 +42,6 @@ displayip="" # More info | https://docs.linuxgsm.com/alerts#more-info postalert="off" -postdays="7" -posttarget="https://termbin.com" # Discord Alerts | https://docs.linuxgsm.com/alerts/discord discordalert="off" @@ -77,14 +75,18 @@ pushoveralert="off" pushovertoken="accesstoken" pushoveruserkey="userkey" +# Rocket.Chat Alerts | https://docs.linuxgsm.com/alerts/rocket.chat +rocketchatalert="off" +rocketchatwebhook="webhook" +rocketchattoken="" + # Slack Alerts | https://docs.linuxgsm.com/alerts/slack slackalert="off" slackwebhook="webhook" # Telegram Alerts | https://docs.linuxgsm.com/alerts/telegram -# You can add a custom cURL string eg proxy (useful in Russia) or else in "curlcustomstring". -# like a "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help", if you not need -# any custom string in curl - simple ignore this parameter. +# You can add a custom cURL string eg proxy (useful in Russia) in "curlcustomstring". +# For example "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help". telegramalert="off" telegramtoken="accesstoken" telegramchatid="" diff --git a/lgsm/data/alert_discord_logo.jpg b/lgsm/data/alert_discord_logo.jpg new file mode 100644 index 0000000000000000000000000000000000000000..db94b295ec44b542b47851a8254025daad0e375a GIT binary patch literal 34529 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 literal 0 HcmV?d00001 diff --git a/lgsm/data/alert_discord_logo.png b/lgsm/data/alert_discord_logo.png deleted file mode 100644 index e56a9293219f1ac4160ebc66ce820fdde7dda8e2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 22166 zcmYIw1z1(j7ww^?OIo_5MM4my1O!Bp?nX*lq`Rb~6hQ$2kx-<&yIbG~NQa2hh=5XW zU;poY&-gChbIzQZJ$v@7z4jWT9zDEAh)0WuAPAwdlDr0jpu>;o$Q5k(IP{wM3m@1P z_wUIgh48za=;+xDe1q$vr2iB?=uv;sZd{?rhA(m4l^-bJEMw!5;tQ4TW5az+h_bw_ zme<#<`DgBwQ(r~*Hpglc!(;WxE{Lp2g@aXq2#H2wUR3rzVe7Wy+6C_K9*-n z7=jkUp%+BL%)k;K7cq#GAE1o7~Wc*&d%zQC8sLIB{u`-sU1s^P2Tr{4$3kufO91@vI-C6{Q{K2DU zKktd+bAor?>ogOew8^uxwMl4c@ua1tQykP36|r~b>S823cb2|ZJ*oBk!(D9B6#d}? z8)Zx+T2N$k$M`tL3tADmU+Y6-m3HL9_7fx*7Z>HzN0pVr>C%iZglyiE(0F50@f*p= z%A&=nbRshHfq6QGV_CBP?i-_M^b#I29T9|CllI}ZX?<35T3T0$7^R{+p2stBaA1ql z5lhHJAMtXhHphyM4G(wb@r@g#o(BaX3YDiYq^PTuN5_54` zi@VZpoHi7PSnhadera>FaO0x4x3{&}xS`B-)mmOr(JhEX5Fv@m_4{*hGSyhv~2vbhntr#oy4&L66x?fB&59sCBg*YYCJ#-}xc&w$G}4XWn=3 zTZ$<&_fKAlFtCM^l+WQt9G50Xj%+CQRxDX$tYqlp0iC6#w$LpC7Hov&htEzOzt?8b zE%lZFe~$=y<7Pjsf!BOJ)sC|>G^kO28OwX{r15k|qQJ0*U!o)UeNK*`^Fo84SpqcQ zTlGn&DEiN@@7YhLzE9IUw5XUV^*<$Qyu84PjBn{7Vzxk-+!#DPJyqWdqrK!*3rS0( zljy|4!^10e`^L>{+DxXHllX5mYkJ#XtGe35Gns@d@g(k|TUc7|ucwWB8wR0X(>l3s-s6^rREr)O`7nu3w0jbC{0&AnGy^* z!!)XMOU{rzB=(}Ydq`~J=PFk1e3{G{NK>F)$Z@na6P{wqFfh!tLV&36dwF|X^d)s| zOqB>o+>NMq_(SU4Btq})-N-Hj_SRCO;L&NVe=pM5o=uUjtd?kuc1LE5xSw~ zg&(w`Mk`_;Ip5&9za|jm^ZTdy<;5MNH;FKSjUV-%yAhdz3(;S4LuY70uHfRf3ACJr zJ+2#^o%mff-K_ZaztRB|nBt}|gu9ve}8 z`0!zArR)9{i3MVID?x*h{x&8)RY3d8mXHE1ZugxzT+iL^)t{43wn#Lbn5?N1G=6VR zQQc4BUoLOP%fQvEa}x(Q8Xji)7GYkDA)_+!UIE`>raaN~K(jU^1f78T#uasSn;Du; z8iZwRvOpc<$yC6=OX;@xd3qQHV_0}Nj1rvD3JncSujK;g6oT|kq!aF8G0PO1oRr*ybd1^uXDNMISHA@ z+YH&u>s(y8+q0f>K0dc4Lc_Z0OxPO1YYx`b!gcagX?Tt6Q|V>FrQAd_ zW;`XI0jr>3V#dD~lejcZzV~Hb>+a~lAm?c8j$;}|NR*WyJz^Tph=Iv@-ajyKceQ&c z;q~k8;eXfKcuE@EUrLLo=jU^F$I^8D?}^})6e@lbNn%q|Qx9x$BM8;B!nUzzXMX>N z)0-SYK+_2iJ&=(>un9Is;!v}rODFEeCJ~%&e`vdajrt-$&3w_f zB2W7NcPEXg!*z*ZqZQN3m1$P*)w@A#hVR}n)cT2IFD#gB5xCW-r(c`+sF_KOK?XCC zUZj?}Ao=Izz{$x;7EIvQ6;wc~zBvEGCR+DjYw)#DHq%Bdnew&W-S|RXO9=QgG;23G zUgC~OYEtRz>u(W2U`P~l-#ogecCqGmJA(*Tz4gE8tT@~l3(b&88m-{$Vd*0W|Ku&H zcbcp1#zBK*x+T zf%lcb2qFW^3xbsx1&`ZjGFTn-7)Z${C4M1@U~ne{5(_7+#b+3i zAyfXS*ht?4{a@pc9+5}{i|IsBBTCBX=;&GFKc-39@SU8T0E|3FO_RDZ77k7Yd8FlQ zu=p#E>(>)9WNy+`G!mlT-}siLi_7?})tEJ?j8(oDTVFFx(hyIO3Ug7)q9vUQxijgrw2YOxJ(KeBmAp>g_ z{*k+Xcxc6$@Y&1DtCSo%Qt)AJZf*vbtpaHkybq7FukQ?pa`o|5)|dUeyoMHpqiJD_ zG5~{W6q~g5pMUe0oN7{H1I^UdxekKO)T1DH!ygaKKBu{V_O}Z9BrYGdiW;jIyF#by zeK2KX5(^7#^w8AGG^#;CqW9@4?A|MmsIR!kWMAEVC5D08-y|c+Al|^EFe)(*FlnT& zx;z;ka;*V1A%Kwn|A&0%9%?>2L$8y9XONPT3L*&y*2pvt+w9l?KP=$)D>w*)d=zSD zi=;L|wS}Y35@!tkAWL|d4`bl9t1|dEhZHF$;0)Iq{@HzJ#|i9ihm8Ku47LBW(m2w( zr-HK56+|*JNz&WvMk8wUWqW6_1GZ*Ia{b5T1pE{sa+EY#L6dp0F4Er0r} zwY4?gd^0SQo!0+dD)2&UwJ0+idRqd3i8U-jM`6C6u+(~Js#K4+eQMn7hS}Krt^(r* ze*1}naD%F!X5acp!W<+p5akSRvD(-d^D-LGHg$OY{5ri;xuvBUOBxSo0fwBWT>b}0 z^=z-h0234Qiv9o~)yBgw)PM>vzO_8t{Exyk;E%YZq-2<#vz#0{t*AqLMk>skmKGpy zxs0>%@o_LS@5F?KVKRR$nzUChvryRSMcL&Ld882OA?dY;_@5r#Gcq#DzPOmF_`cUoHy-wJ z6=1LHx~f+8g_DB=@86^C_~*ooH#@;&6EwoZ!~2>ExwztQckutg-mD z&R6bynfD+qW-jjJ#CK!L8A(b?!ldrdu4N^MSn$Of(a>O6{`38Gd3`9Y>+i9U^;;)t-1k z^L943WBT_>M**V`4h?mIYX(rA@mnQ~#}rX!%@?YzVyNb4QmMXZ*(X zS}U0pG&E7kJi2|w#LcHW(qjI9-J=2@x*uYxrryBSDb#*#nGKekdxLuU_4fAmrR{C@ z0Y}r)rMqVb10^1(-uP7fa;mDa4qq?#mhS>;MsGN8gydsoHJ+;9jTaLKhgnQ4QbHJF z9feND?W)Ih^QgQcn&PO*;#S&Fs-!nwtYQxD-=(6Og>D$h_FthCKEpWU29E)E-l=7x z2QbIs>^&dH!Qd8OD}NCEnb9pa>N@zw!?uVceNjtsdd%q3I}&jI`(tgOX#lZ8zX&R@ zkP^QQH!IWI>*raeuTPr)k~`q~=YXQ`NY>t-dwtly$6Q*PhX20pGl*<&L%5B$pcv# zROE_#b*%m>w6CS_yxRbFja8eu0;S=*LeO&!c3}DH+>qc^b6(j zyaQYW{KIYfuCtm&ncfY%FPlmFOg8I-GY?J6c1N@CPB(Zm-sOX!7WKjVsrNPBA{`#7 zKb<1G`8{1-%k!R#FXfT)?{9Gw_V;@-Tdgbp7ck{Xu3o*K7LROCmyu7EEV|6>UaqI@ zq7tE$b5wsC&#O1{R!WTOqBA5s`z$_B6zWnjFfh!ufnRJW8&uk&C9AOi*{+;%(5tj9 z8>q4De|5{{^oTzH(xh-Q8kd}dmHk`d{n-}VF$?`c^bPmh!cKFM5@O&Lca%?$wynxC zIMv>{{g}MGTw7Z+8%!)hD; zoNaV;Ua#%k*Z8BtgzEc+=d>W>-WTM zKQ7BadD>6k%kba3fq~njw=lkZ`EtYWM9Iq9TIJLHpFe-ZT$Zv9iL32JzE(R9&}X2g zOO=285~zcet!jVp8n4T9;%jaPjFMj0A@^tP^I*K=qe^LckAI{V1rEk-s|+fg=2a+X zeYU1?m7N#+lQYf1j%GKgw+?=hk&%ryc$#*0b}H3!^gI^yfcC-mYHx2jV>2=`!m!-j z@Zcu4mW<6QXPHbX|ND(aR01aQB_<=Q5MYv=AnJw;m@4ze-hAA@_Y1Wd9Qs10_p-}l zp}|v4)Ss5#9}O~!_O~LJ{0CH+L)Joou45q`?_=5P{V3{2vk8x^U7fENM8xEDbSSMy z-o+ekODw0D2855<`u$w2F(^Vg-#g!82}*t=%!(P_wCaVHz)Z`Gf-99<=x$ZFpV{YV zo@y?y{x|Pd{ zSOV{fJg52F1$t%ZJ1}(_nShvP)`Z#ZMboV2ryzluuK&&HF#q?Z%c_#f6Y{Ipl(5AG zKK;&_0{KZ&Yg=hyEP7Bl*2{vx`X*-fJ3j6N@j|h;kqN2=E3KhqYeP^0}SCL0-!EsiPFx*vrc~slNwxbB2VfET1dzqrz zSd;Iqi30V|a7aJMde-{Lv1;oZhvih76%U9I?qs}@=G$@MY~N#RmX>awHPVP{C37dc z{ykKl@h|>;3=E&#-NNjwtRSr98^pxKb9GP2?W_Ds90{;d?isgc#eZ7?0P&kNG1rjK zY8MCzBjd=+7J{|!-&v(D-hG~3T3?Sq(J>a#JhN*0R=5>bXzD6-q>p) zo8i)|@{iiDNVZYW_rK;F2tmDLWY)O_3qt&<2L#Tg?iYHLS{%S6MnD*wsp$ar0w^mB zS%}hW?2?Vxe~{emv0nv+R~gKK30cbd??bd$lI9sm~&&h&YcUpuFjkH^WfV0 z`pUt#f%eLL)0XA}eWCPlNYIjsXDV#)Cf~8%iz_X-`Rt@rtV*+RGF9XWM+~Yj4^WZo zoa*voYc#uq_p`$jP93k!|B86NR@x1Hgx=ziI3yGz;PEFLq}sUASj5N!nTW|o0w-k&Q5Tz zUcFk{i;h)K&iN2;rdrD1Cr9~ZH}6ewiKjr+0e9+WK3n5B>p`i1W40znUo%-HJYM?Z zQEI$1w52>(pw5cw5%a9IFm0L5hzZ=*;ISP%W_z{V5k>K4$zteRfs^zc93S^o+BxIR zHUkUB%EJ>APO0kQQ9ZhOd+^;I&E6VU2+3?~MKyWZK+?BY?>=YzudFx3pd}!*)RD)q znwR6j+g=vUM3`PJ+sQ)RomMGE?fDgtYA$FK|;4iutABw{+1N9M4l}c5IhZ2SFhMds?e1PIw z!m#Y_&Q_1W9pm|Gs~cmMyw!5_x83!oOE53gM&8{Sg?)}P?SgU&Evp4$hgiVb704RG zoNVG5np}>y#1$qcrlzRQ{}Rf~lz)5o_t?$Nt<-V0q&866g!KFi(BE4#756u$){9MB zf{EyFyC(Ad#pi1Xy4XtAHKDv%YXL;sm40?Vg{W<9+0!5gk<*9N zKtSw=eT*lLLxJq+XH^FD9IB~CYcHkuW}iRpj`PQ2W_}#Dn{Qa-WIph^2=7XWrgso4 zHuBf^+0O~e0IV`#6nRY=wMc(|ew6JO^>E3ji2)Xiro5^D;aCr9xz@k1?1@8h$lh6~ z=L(6XyohOEC~k-r>;DoVBPZ8)_!|l(BfsPMz%ZvAU|`Sw{L*uelIln zMn*^T9<`{csdWM6Ofhcy=FOXvlhyF{8ckdwe{hv>;efNkEBNHTeWR(V)WBJ*t3RtU zD7x`xuMMJ6Q0lGT>uBsZrSy;ISS~XFt<>BWQX1?EKstu>t}u?T+v3y-dRMANiT2G&CQ3 z|Gr*pIHruzPV}dQDi~yxB=s)FmhLSiyH2$ zt+3+~yWMhL@Pi!(cfPyKvgb<63a214Ne{ zlTX#CEDVIOK4DlFmaTv&iEC3d0L1^G^MCB#2_h%dKMy^smPCm`qqIyKD6(!_*eeaQED7q*!& zZOpkdAvUW7Noy=kMOYw{OLy##_7*}QlO$7zQu)uOE&!E>K^9Xwjl?S6#YLAvlOT}+ zDh8Nc4tKiHkdUyJ8^ARw;1ibw!??jhg}Nong(d%$PJ4(&(Y@gCSPCpMImdzs$LvmL z8sJU9ty|n_A%rAEu8(AL9(G8HrV#>AiI{P)F1r*!Uae8eNJ;FqsB)0!J@7T$pg^CW zo4dOI07^KI(jo4>*UWz?SK|tC7-$FK7{`1XBs5qEX`up2VkoWV%6#|t%-v96P)es^ z$H#*`$8(Y5G`sfj&|RVA}X9#=s$xIsf}R z+-bF8x0&;-W-bP{n+D8F(HQy@PRJHcHgeR!e&cx$Msx0YQl&Rmb=QHbHz+>;OgmaAc~lR@awtb0J++~XB_5g%OE9rU%D*>Y=-ztV*Wc( zZI6)9Y_AgZo5BZjb{+B?1&@cM^DjIc62Ykp+1as~t0yaVsYqQNb#0+LXzU1;AN-I5l$bZn{ zeI|zE?d^AE&ra&Xin@4CZjNJt1!1M-w_VO)7`-&CjtR}`SjjmG3AG?fTz7Np|)( z^txA249>+lPMBk6Lqo$JF)4V!BcSlZAa3CLeM^20u3kPGPJ}2(zu{zOFI&a4gUHWr z;4J$SQkh7|0xL#gLgNcBXC8gjYOi+QU+MDN3t~LwivK%{_5ZX0pYO#d#q2vXz~eu5 z=Dm0gtL5fih8Ya8hrsj_-S*fD0vE!aZH8=jDMp~#B0GjjLV}JmCRgc_Lr5r;UKg`a z$3J3vTF-oT>Z9hpO8d#AaBGB#D^2R0&wSPzs4~lL)qt&hYB#s&qlePEXuP!Se!RBp zgEYLtfN8XM7n)F69N-?Od7t##UGe8v@2RV87-1G{03E%z8gCfxXbONK>@tfQfOtiM zy-1!~CWpi6Nm*tRSHFD_Wek?JPz$EswO`*`Vn8imK6}e%m^V990DzD_t)v%Idq+pO zRH@tJ`Xo#w=WaXt`B=`qk9ws`tmd=24M#$9E#@%qe+%{g(R|?%0o(nb;p%P(DCamuN&?g)ozyG;uM)1jQFVS z3{{YogBdHVYiPi4GCBS^nTdbyll&`0YgtW^gM6|4I@g#q<>7yZ&T=JFsEJxrS?zwI z00owChgsk!%iMpsQO@w|=Kd#lXsgfudaqd zGg5iEgTxYh!8V=^d9P1eoLj z79rl=uOrfzA^(G;Sy@ad{Hy?X+WZ0lIUo>EQSOKxiuQE9v4drnVsYLhnMTMO_f%%- zWWU6X5@Kw+BdklvqbSQAQC=`x<6P0}VO4eTX+axRmY>vp66RnC^*hD*fT(}%?!&zv zKer*-f>JR>jDsfuQe0^}MrO`<<(l+`2-MZfd%+Y0P??TsX=zDtOcQxRbZ~I8l-ZP< zmv?(@S7SNyOvcR2j0uwIZkB-rpvnmZ2(3Cn#{sDw$+c^2Mzf&62w}b(QQk}RCFhBwkk&WM_F0Kh;3MGYh*tC-jc@g*M@7b)GX;-2A*S@SX%W~O^} zF3T(+9H@1<|HH@E7b>QtzzkU>J`SrvtU4j;t@gBVTg~c}T%;3Uh_^NQ?oU^5e{VVa z^HG!2_2Nw2BO$b_yW0Zj6#SWL<(C|Cg_HlRaRn463Q9_mF54=qs-4jkJo;uDVQSLG zv1@Brm%nO5-a|ku9EA0nv|FU^s!Czk$-YJL-(%R1S#I5mS9tvqv^ZWqlsm~2gM-3r zYmz$df!`n%99N?Bc|zfGpUdCP1tNP{Na36^igDQ(ZAs`>+D_&EDV< z5p@@+TdL=(*aBl;_f-94`S~uzWx_JC^yiKOb%AV;ZJRKAU0YiUs3Zbkf zs|8v{-Wo(FltBap)T4|7&0E>eFOW;9=b8MGEZ7YS3%31@wekP!!;K9^eGQcEq#3Rx)P0 zx8RFE3M!m;XP3bZ4H6MV^bw@2CK~d-yK{9sfO|kmaj#H^PdtkTDPWWL+r9k1pvb~r z%)H$S6ASC<4Jz3f$|Athz6zDk#@@5bHB$oee{v0$jFu6gT}4#NFjaiKXquJ!`=X=0 z{ZWNAAJMwS#-b_B?yJk)Dw#3&A75wy>8{GaD(Bc(G-~!!P%pV6;xHYFQI~q?Q_~{( z`T8fu0KMlB(X+pP(D=9q`;}M%bg2N`BotCse6Qb^!S78@SHBdn=ZsxvMf8ev{0{o^ zA+PRDXuEFwwx)#|DNr&A@c!(ghMftO2QZ?!Yt%(Iu$UzD^n6-rP_4UR(Rqb31uY0~ z0P?|(h^S-zIV^lBE7z!Z78hs7;ZMeU6Iri5<#~=4q~ZXAm+RV}UOjUBT4u>P{7!pe zYCTp_2%) zw!>oc-2zb&$FG=Bi7<18TDDpRC{4UB{zw6ll9h#G#AJc-W!coPcF-rdc7l%MAy{P6 zB$t@^nvjsND~kMHc)e${>naC8@$gUsxs$l0F!+^qFMda^>PMP$v-VaWBO-a{j(Q;_ z6*~73MYIZ`j5pfSaE63lO8|yq+|}>6f1CX?d(QssGT*tAfnmtvg)bu)LF6x6(3zQ* z_8jUTWu@|6rC$3Q)CAb(Usrc_;+XGZSCkSUhaV88q}}GzIJ?Y(RH%xT+KpRhe?44@ z>Cn@Il%(QldzM+aGWy20AT`0sN=(UBQ(g8VpN%XAE%!|*|6l>Ntm^woyD$QX?WcM| z$mlL1Bfrkgi{8Ea~4npYW!x5hxvvJ(5cYz;yA_4LS5%-vR6V%78K#K#w* zILCK$HE_q?LHd^c^m{QcFGf%~#0g>?qAiNNJJRQeLMHytB=Ju%rKA@2j)|@Ao$>K# zXlR7_{2qGuU&$o{P#KhYcecMiYXv=-zMig0YAL?alhG`+_R22n3UjE7@&43=@T>T6 z*wO=&Vg^)J;dlsC9$Rr3dCkm?BcCSne;BhJt#LLr|5^bA1cwg`j=1NJ&M_ zqAh_zKEh$-5fsvEPkFukL&ja^Y6w<}Xzr9+_)%ZA?_rQ>dDJk|rnyA>f<7;9rB*2dqm^9Th z^|XSjiNDhj;a^!^4u;Ys?)W=_7Nd^$Wa4d8rh%-ghEU$+n&1K4qIDgDUPMYtK8d5U zib{J)i<6~#RJvJ5!~@VQlDy|zSXkH?&At=Uk7V&S`TV|`$F~@8$_O4oncRyD8Cscn zhhnfbnon5)0n!g@66V28NyuygZ<;|n8x6Y`tb+%wkPxmqB2>$FgZM`QW_tPh;*Pxr z{QfIPn(XzfSCJ68Spk`NNF*ERXH_EqUB} z-&+iv57Xr#T=qAkI%qq4q`$Qo7!>}EAm~K??ZMxRQ%1cF}Q$yCmL zD#5%xx$%C zt}+)iNTc@R%tHuMEdcQL*;&KLYLLJYiPA~4GiwJ2%Le`tD$>CZybNkN^LBBu^YS|T zUG$1u`%@_^d%uIIxyr7Q5#ph@B9GN+kWP;N$(Bj`E?8Cik8q#N|J4VmzJ7U8 zlb=te7goJ^$ibqN0D=e z+ujF)T>lX^QU(TAiG*Tj*~>1rmF6F<$Y^wz6+-g-`EwkQe_lWJ06KUHO3A#}6EU}E zD(*!JV2Z*<1Kcs{1$Qf~AB0nn=0D6(G%=BazRG_5Xjkk0BZ-Mh^@Sd^FDUH1pc?5B zdGLuev4Du-s%1p6Ld-fZ2SyOJymH0+Yetds>?%rB%dfdG5Hy5VxIo}kbPfuKz|2?) zMzL){u>@9Vg1-dhl!F#GkzP|sXw*Sz35Ar6u^e8G#7+QZ>5|?mN84A3h~)kpd_xV( z`^og9*pHukdxdy8NRPEShtc<|%VXk`qeW?M=@0BZ8pi}VGhy_`neP(hX zf_ghZ{+K?b6?0QXP*4#17K?%|ksewlCK+JVgeOP=v%CZ-q=(_5-eevNOhi2{TO;=| zmDs}hn?#rrnCch-DMu$Xy%GXz1dBo z&r@-0(9qNrZ;gDn^0jKy_P@_uz(huQ;kO0@8N&;PtR)?gBkOzQ@cHc6m^3b%0KtRc zO+rS-a_TYH&~tnlwWbtSCDEVEgP*L@g|hB_NbRyG`!9*^`}s-6D0lAdkbz1N1oGB` zG{_oAx!oG0nOGu@$v!;_X2b$dHAWIHvw-YVQc^Mln=W|sQjjd7FA=noLn_o}E3D!+ z3o;+EUZtB5McHc}*x9vgw}A7YG$`p@Vq$tnj-d2RSo5$GrUe2tJv5fh^2>)Qwi-$V zv9hvaVUu4t9tDbb9eGN!fbK#fEgd*hBWsV3kgBU=$V6<-E`d-@4tgHb(sG95=;MQp zugqqtkct8-er1x_Go^=_$oi=H2 z&KzYm=pZ`KOxWC=Xit-=i_~ptA;@{MFm)@&^mgf0sLl8VrqJ#R%HM zE;_S8YUlV98@+w{0~sloEuzt6T+w7Mj5l|7hULgy8P~h6LaBE5XWPpRnNFlNh6@|v z#(SxJvAgKwlJak*IkIz;^fTi-bl ziXjWWyZ)3(O5J&?-l!^5xzk-)v=lZQBw;=)+1VbpJ6e!)hi`1)^Rgwz8bitpEL>+e z{=s~T!pS={jG*@3XJ73Ba|T9PLWO5J0MJf1U#i((6aAdN~2V{NV_2f!(p*G(GW|OJ%R9 zk!xwS-=0$VU-$`|c$r^^e7ck{af6Bj5-W5lRG?%zK{-&^?6r{4)L<~5C=g6P;?x-I zQkGJTrH%s1LEpg{ln6212$O&tbtPqjt>))P)#^-Myg@UY` zSx88;9Su^=YYGGWE?P*!PF9A*F?~KC@z3I#Y-4}?+alHP&9!+xy{eMCY*4qki9xKX zEk;+^9Ysxeq-d95*g6uJ6vXN4Nq1YgGVAVL{GSo}>Q(84Zx@Y2?hNDXuzhmPXFavV zZ+v&4E}KDFVALJa|CpD0^uLfs^raMXTEFH8&waVlvsnHVk~nk~HVwfg0=47(A#CJX z$L9h%Y=TXP;4y-0w@cby=g?l0%nv4v!^Z$n)C#53_v$$jjj2$8NK#Q#d%5P(^lR9! zhmhk1A-r^HQi@}u;87#j12xYj(+oc9xwa6-qbFrvF+?+U>7-15_T6gC&wg>lZrepP zG;ds*lwj41RAdbPUl%nr$Hh{wg{9~b z(N%s-n#}{L73& z{j;Ut=rI;(%)=g9UY;+5IIi9L5IUL0B(P2|$Wtc7{Ix^V zC8Zk7h%XjID~l}^(r#N%6xl2Mk)c!hbHVRG7j(*HZ`4xK{$|rYJ$7u#zM`TT{&m)+H?q`T>lx2D_Z&SNmtA5H>0^x6!k2_+T9Dfma|-hqV)eUv5&i&XZa-% z-tVRxTcL@$e;lr!Sv&K4xfLXgOp=mw-&UDeSkV3d9h^woU8!bC6!!4ET6yR=WQ%FLB;guavq^LS2rq!B(Ubl8~d4DlAA-QT&- zQTf?XAxLd3FirN44oW2U^Ur!toR!*&`-Cy6#d-6 zR=X#9Y<{SK++IQF9o})0wg(+2_wRCi~~%n+;p}~^!A>2`5A3{#nSGU zOfGkyuP`D5ugaIh<2V{e+hWUu;~F%4FMa7(7+e&Wb|;E0y3P_6g$uu>zRC5C*P8Zv z6!YMouo7R}XPIqookofN$h>8pzQc?*On3hQde5XS@|y$6JkLQ7nWfVJ-lG4@83Y0; z63;{Tm}PKOl)N?$9BaMylja{@AUFIAlr?}I@v1JS@RbrYyBCISy8C6NeW*RdZ2q@s zWsyx=0#QrRaGvX4S+TJ{&)W#P8{7DIJQQ7~PMeswA9w}E;yMxey)M@%B^)=sVg6Hw z{3t`)azLH_VRwPKFqM-|mi_~LMbBH=hC)1SN1r6;+*=Q+V!a&S_%lTMo$N7NSXexQ zqh~4An{A<(JJ$%1gTuY-O^jB^thSFTK85Lx<(4TV`4{P6_#5bt<|ku$zSNoyd>D%F zYCq>!plE_-CS17m{jtJ~OqNpt1>qf`RrMYsJ$Ja0 zZ+YbtAs+7MdZd{SnQXp?8?Grhhz+0qFd`$DHw6-*uiG|FqkZUA1WuN^T$UXJcXAuN z5>&8w1BQYcqIPP@O18eEzn!dHI#)0D9U7R$*!VgTQv3i-W&!`9-9+osk+omFvU5tN z=h=xX&`Ik1RO*m_54LT7Ma(K@AVqC+k}kO?RNQMLz~Iz6B{WxRcF!iYs6QRoW!&J# z@t=8xfcDIHpKb8*rRJ?NGoJw-a1c$qpMu?tl5O-OOjAh0mBPuNp3&OsI|MzC@-P;{YX038F*qa-XC&XMkL;JsraF;QA3jmG3n3d6pU81 zt-2DEMz6ld+e)gcA(Q>9L>NJ_^G$TS<%^CZKQ0xQDJjR%gt=Ki)${D$`EI|{B7+sj zbytbN*&+UNt-1H9j714|`(rqj5&?o`(AXv@3d{PUiQ6OMF68ZA*D0vp6E^PKgc*9rpMk|Ot)?UDv0=r z_}$0Hp&>P+5h_m4^=vr{?0QC}p8cewmh!`d6l%9}8{~qK@$oh&c+Dpuuvq+L|B@cW z!oZ#6cuF|P5IZci(}bo3!Eax`lLyE4#) z@t{++XbqAT^V&=35U^iaT{Rbdx-5u|pcyrI%ri?*0j~y%e6ORKBLJggk+HGvy}KW^ z-_#)Kxv?g5`K#W$i{9<@SHD7b9h`mldA9#)97;6;nXuT}u~C!H3kArKLz{4(Iyo`C z7BGzh8sB`Svkz4EPp7MWH-e*cX`rdb3pQl`uVGPn)@P|`ERUqoa?#o!*KWl@{ugIA zo|ohOOXuWhcGpb!>v3J&=2S^VBmrVkI%QT3!f7B?LG2g;Y_q&i{puopiRt8iW?$~* z$o-e-(l5M-rLpWwWJ-pugEQoFuzx-mzxdDC!h&TXz?Z|I+TjJTd@~|ufR~ws5Z(J{ zLQp&y%~z9FeRF^f7%9Dan{RUuO~wX)ER(AE!Q;d4dU~8s)Mvd%cHqbYlB4*dZEu-% z>i~BVQq1xo=v3s37omMxXS*5TNLWCmJ)6FBk^kch=(9KnlFG9y`QL^=D<6K5(XzWU zTf+#_uvRG8X>4VpsEx-#z*m@qAfbvu2F%qRNBY8{Hg7*FTe-&uJ$GH3~9Eb9oi^BOQ9T@bx zz-Gp3$EWkpEfghtrd*8J^*m)$tHbtwnkJs^c`lygoSzbRLNQfAQpdzkVzF6pakykb=M$jg@OzaIu+%Lw~vc^`noI)XIMm2FgZ-mq#_0dh# z`OVW`1}CVjme2mQ8)GTlyJxx7%B-a9x_x!;ERmyjQ~#DO?u0SL%F{Z7WV8U3JE{T+F!<9#M4i=yT@`KFS9Mx})nr)jA-W4^vQcMLQv^)Ce=ZL6^|@};a{w&> zhmT2hizU7HOd*8>sid5f)4TgM6|RK%QjlX+Dan@ZL~qTKd|2Hy(kR^!A%8pR?nrX~ z{(Vs7-36k0i1Q)?azH;M0Zm5r`^e>aQxWRy$=(uk@36Ti61-e&!g#eBJ-f5MZ z8ws#p2#q7AYX2#7pHp+3-s`Ypom&JfNW>s*}RRw6YXk?O<(Lm z2B!#}4qD|+OarD(@`9G5JQCuYcp`bit&OA{4&GBsUq<{);lwlKbpM&gJ+~R&^Cg7_ zp>%oH(RTq=$JHg-DL;&6A1r*GhoWXv_poe@LNia3KOv5vV{0;qpDJsQyYL+OS+tf% zVQcYxe|vt3I_I${`*$?QRNdZQ@RKbVM{$5p?;iwTto5wsa_Feda0yt2)*A{ zG0UzN?U>=?UWXJ4t}_2B>tAj`g+MqQF zCjHx#b0Yd9#tXf(x47Fs4NrnH34Tm^*J_Ru>TFn5&6~WvSMake6zdg@w7}Agk5254 zlVVZ74qI+vLhAaoU3+II8{?ZmGRe{g+FG4ez)o_h;)~KIq^}y*U~t`pnze z6q9tOBGI~-z0i@rP&!m`fk#ggO@987WuGsE8&a%Int^iRSnwD?9^j zbnfN6=xMJ@+K)`{I*b7h+OdLqie10_(8)ZD{9fuzv;@J7?g;G?y0Ib}wF?%Zx7r)W z=9YTQ@u5X24Or3-rAOLvolfltO-w&N@9HOMr9s?o(!Ew)>NCYXG@x_)!p|zD&)~U5 ztF@Y{6|%s`*E=j?@n6gQG|kN}8^p@qNPzrrNJXdd&MV@T>&lbm2jU+iUVk%IVE1-@g`2D*bO@4N&B4IFR^sF9d`R!cr+RK1 zbD4kpX6%5*#GH#Cd6lB6w|t`Yw)g>`t#(=s8x7K%-TixIqJ=Cx zIk~4zyQn<-rYWz+hZJ8Il&Iobo(Bbw^nBr?wu_*WltZ=8$#M=Z<7Fl)6WNIr*^j;a zlE|B}ud{YY2$}QDe2M2^ohRY=;mEt`O4@2qc|TZ-+YIs>sf8>Xn;S@i|IFw|(($VI zHfWMU=A%B!K6IgTLi*RSHYcV-;%}8Qu7!X$;k{ETA#<*mvv!}Ph;q`RqQHZj__<~x z+|!TP!>G7H5}->@yN7F-`&8G)g--cz&!-4U9Wa1#`2M^-HlmLiLcu#)SfO`4e4uZ&EE@E>+#)d& z$zOg<)QuLzCe2HEKBLrHn#}x?>p}+G;MS%!I`G#!_CFYm=T8tOwA%B8dR zDbSp_e@I#N;2^ljaMyue7b4^F>~}HkAM7Ix8{~r|M(gRN%JFsb+LZQjJm^Jo-~0Bm z`)AlUFc2F=sh;TF_my&(ERqIR8sydRgLWar2s6^-fEwC~E4xg`#ttA>S{6dS-05>8 zL>>?HV?8uo=L&}@T5)a0^UX;uO;#;Q+VS`Bl)}ieZFx7^ZnZoMviY?en@7JG(%xeP z-PSFi&C|YP9emZ{+?)ZIjzy3&tqx3g*$pt+9(d|I%#N*a(16ShJ-Kt*~EjNoU6mUYLbT45@?xs#t%*iDt zJkI&aOPs;EXKyUrVsYZN^gM&8nBh8E9TvA=U4}%~7h9&LLPrrXj4a`SfQfe7^+{=v z*$;m8zs;6c#(0$iVH3w_75S9Rb`*?f7{9*~iWX$_skNXzKkabqiUJlAidpk9C|o^( zc+xa_nkNcetLPo)bJQF6wXAr!*TA-N~;$yMyF+68O{@&z}()7|;3a}>t% zsVK=Ldy<<-iv5OR5OKf~EgL{>u9V$^{a?6wZjU?f6k^u&wYOhy{n}*Ex$xaJ0(9`- zJAU7``c}@^NsNf%I+5ET@+nEUyz~8qfgtqyFrg|UHQ!0Eb%xoB$P6Fvc=}j~%7xSBYwd-?EVVKNJW$JdFcU2GCEGva)`)86&C$x z>LKpN-?{H_tkINRn{c=y$hc`jalJP0)9apDB241-E}9*O{A&b3(X;YIHSRG)uEZxy zaKfO^lk-A7W*SFQEJi-M;x`P=zwvhA^W8Zsa z8?t5_%veHX-(@n5Feb+G+P-&ve*ezrnYqt7b3Nyoxz4#R*M6`>7qC&uaifY*0ogHp zy?nG~(-z^!+>=#BX+(9KoIMMjUqQ`Va7p71gLr$>;ZQFEV!|YS<2VY5GyxF1`F?TX zf~LNcL9ew<1c=N(K*T({p?$2D59pTEiPPY0B6gT&z{-QFA#Q!Zjf%f&bVV$R3#gXv ze9xq@C66lyfkvR;AOZEx7U;>U6Sq9yV>_)w%iX3Z1@XGyrGsRr`KTlgI zhS7qbN#NfiH55m@t!uH2HJ}}^qfy3~O*@;*=WAN)Ul-jqk&+*BssNqxjs(v`+B1Yg8 zX1mMU04ok-4Umh7VG*pJ4!>$kWbPycfg|Hx0iW15-4hd2v{Z6YzfuY&Gk*7+PW?~N z+4d|!W|xCKD;Qe%WK69#Ce(6d9acm^P<%>mEsuC*$A-2r$cVb6bw8xZqI|QDMQ#_T@O*78H3f$aKSIj9r zf9h4Bd$XvZ0UO0az}7>%E%E%v)N-rO#aLIJd3gQS{fpq4nf+ApvEBX|siU17D%QxW zXR?S!{BK-JN%d0BqwGM4dC--cEdz@N!<_#+nQpl8uMym|(|VY^tP992_Ey7WtG3OD z8XX6+x8LF~O1=v1sG@EDzBXjzGFf>n6}J1@`bB-uznD*fIWM!C4NA&I-6A-RYXhYL zU*Wwo{s7HUsOY8UL3M~Rx8I!dG^;Qv_0LyT@v?62>WZ($mU0VHIm`v%&hp{Te}p7g7bfdM0! z(f<$$vjH-tvhm%6Yv~@_)!&~T(7?w8JfwZ1=#PN}x2d;AheOvQKV}-!hJ5$Zl=b>F zk*WjeD2_Mc7J#XYot>Tk!8Iw^Snm*Go~yWn?)AY~V)+rkZ_~oUEg}92B!Uk4#>8wx z=Gc}HcRHBEcqXS6tCqmWKG@-^Ly->35C{Vq#7(h&=$y4(gD>Nv)`fq^D=b2RB~O;~ z%JglP&-XJ6oRSB2q*(?V8UP?~uHq1~x~m(|;V@)Xvq;q*w7qI@;5oRy`&?fFlE&lP zPwyI>fIZ>MpZHW0`tHob#cM^@c@(vxUz#4uKf1xr9-ArImAk*lDd|E7s?c&&2}txJ zr`i|0a8ar%;pM(RI$9e42hT*kqH}mU81!xG7lmg4zg}i)zyJf16ur!QH3KBHO7u4~ z8G1wGgI9|-6uH2hznNrA`8-H4OJ6&Pho9d_LN7+NKOIPmzHojQEfr6dchj5x#q)6z z^^JX?UU`c;OQ>Tf=X2Vgzfqdm`;#b>$o#VJ6DMM#ArYKTM&QoD z|LL4+ivbTgNVIIfs9n%gB>M2>WyupVX?j~GeC`aZzU?wkN!iqZO4iKe6cvhLZB-M{%}-dmU{ zvU^JwPXu$r2e4~3+PFN*or^+Yj_H|P0puiesa#t7f)-8|flA`WJhlsTnX=Pa_d zeSYpi8VEWW_Q~-{qJwxa9~4U^+-n}1i(4AlO&a;paPuKdOZERV$)JU*x69aTTJqae z5Nq~~H*DT{!PFr-BMdIx?>Ad;S<6k{JPB%#j(n4~iBk!2aoJ-xN5>L$@ab-4pO6;K z21}{pXrJZJWsGD-+Bs%O^_^EwX-a#q+SA0?@Kaox8ov~4Wv)TyyK$mZZLPrV^1Wc? zREG|Ify0zed_od z&-IjIX8J3ug%`V_&qbS-{$9RiMz1%G%nWi=h?Q))`{E>1r#^n3$h`T8^I8)dA_s*k ztUkxVxu?}lP;z#Un%1%Yc+0B~PR9$q%;`(>P9@#lLVhrk=MHz(GqlJTcF4(;eOXi# z5pdiBTnK0`YMM?YQJ!8ItoZ$cYDnrCUI;lb(iTYvsg!+~>tcwoFvqbYS%) z>PpjaP+0{@CbSLt2r+;C6P6q&;J6TQ6=>gGG=^-2I8ebu&qJ&91qhSZ{coiHVEhxb zZ+x=IFWn%;S5p2vuj711EIzq{L1{X91veic6BM*q089w`XMT8&2YQ9>IJL$hNvf;Ez?V7L^n~p9&&5G>k(W78 zzB$1?U0JLnuuDj;{qfuB#w(0(P;%xOWLmJx39L6pv}Xf%=+ivBQz)-vtRE(Ngtfrk6?9Ln12;p52T+)5yDrSct{CFMo#As( z@*myj>Pimq*hp$KE!+toCJqQT%{x*x))#3{E7q zE}hqDoVusi4_kRaTqX9oI1Wkbre0|HXi6x2PL3w$wY)A(_rjA^hd`F2j@h zK8Nx9^f6oPOjS}j{r%q8gMa1=6H|u?h_SM&mF)w}%0E9DwoCm*owT;pbL0_A<`S zYAtTM2zz@#<0FQ1(ADoq(i}0a7Z-vSmj=$d{TH@CEb!D=NuIsCTH#ys34@3If5f3)0lOiwO!pT!dl3JVIvzevjH zzL4+E61*m#S@h!H-v@R$=G2ORXdb#!sx_Rc|K8kuRwZg!#Qm$uuh=u}Q)PRxjks7( z1Z-X29$h@Q)GA>OYXD@s2rc6#?pLTN{VHIC9d~|uF6|w*6tywiUPw`rRi7}6+G)j& zCna%b$(H-nJuXFK^9n2k91=$Ufm_Jdl^zv-8)~)Vwbt6KxZwrfjIAR4gn`LjA!KOb0Ny zDgC;z@T$bQ(aHn5s3ssRylFd(?dh>&rx6ko0+*hNfb!qyaWi$)tL-0CX=|UTdXce} z*>y-wJ#S3|1~EK6!`VZb?!B6t&9BxK?hNT1mxOJ;H6ry2H{T9{vP#YLEYY9oP=ey3 W0$8HP5J=!43u$TSt5>SRBmW1I8SIz< diff --git a/lgsm/functions/README.md b/lgsm/functions/README.md old mode 100644 new mode 100755 diff --git a/lgsm/functions/alert.sh b/lgsm/functions/alert.sh old mode 100644 new mode 100755 index 704a3f3eb..3b54230eb --- a/lgsm/functions/alert.sh +++ b/lgsm/functions/alert.sh @@ -100,6 +100,7 @@ if [ "${postalert}" == "on" ]&&[ -n "${postalert}" ]; then exitbypass=1 command_postdetails.sh fn_firstcommand_reset + unset exitbypass elif [ "${postalert}" != "on" ]&&[ "${commandname}" == "TEST-ALERT" ]; then fn_print_warn_nl "More Info not enabled" fn_script_log_warn "More Info alerts not enabled" @@ -191,6 +192,17 @@ elif [ -z "${telegramchatid}" ]&&[ "${commandname}" == "TEST-ALERT" ]; then fn_script_error "Telegram chat id not set." fi +if [ "${rocketchatalert}" == "on" ]&&[ -n "${rocketchatalert}" ]; then + alert_rocketchat.sh +elif [ "${rocketchatalert}" != "on" ]&&[ "${commandname}" == "TEST-ALERT" ]; then + fn_print_warn_nl "Rocketchat alerts not enabled" + fn_script_log_warn "Rocketchat alerts not enabled" +elif [ -z "${rocketchattoken}" ]&&[ "${commandname}" == "TEST-ALERT" ]; then + fn_print_error_nl "Rocketchat token not set" + #echo -e "* https://docs.linuxgsm.com/alerts/slack" + fn_script_error "Rocketchat token not set" +fi + if [ "${slackalert}" == "on" ]&&[ -n "${slackalert}" ]; then alert_slack.sh elif [ "${slackalert}" != "on" ]&&[ "${commandname}" == "TEST-ALERT" ]; then diff --git a/lgsm/functions/alert_discord.sh b/lgsm/functions/alert_discord.sh old mode 100644 new mode 100755 index 3ed12fe97..c19e66506 --- a/lgsm/functions/alert_discord.sh +++ b/lgsm/functions/alert_discord.sh @@ -12,9 +12,6 @@ if ! command -v jq > /dev/null; then fn_script_log_fatal "Sending Discord alert: jq is missing." fi -escaped_servername=$(echo -n "${servername}" | jq -sRr "@json") -escaped_alertbody=$(echo -n "${alertbody}" | jq -sRr "@json") - json=$(cat < /dev/null; then + fn_print_fail_nl "Sending Rocketchat alert: jq is missing." + fn_script_log_fatal "Sending Rocketchat alert: jq is missing." +fi + +json=$(cat <${alertsubject} ${alertemoji}\n\nMessage\n${alertbody}\n\nGame\n${gamename}\n\nServer name\n${servername}\n\nHostname\n${HOSTNAME}\n\nServer IP\n${alertip}:${port}\n\nMore info\n${alerturl}", + "text": "${alertemoji} ${alertsubject} ${alertemoji}\n\nServer name\n${servername}\n\nMessage\n${alertbody}\n\nGame\n${gamename}\n\nServer IP\n${alertip}:${port}\n\nHostname\n${HOSTNAME}\n\nMore info\n${alerturl}", "disable_web_page_preview": "yes", EOF ) @@ -18,7 +18,7 @@ EOF fn_print_dots "Sending Telegram alert" telegramsend=$(curl -sSL -H "Content-Type: application/json" -X POST -d """${json}""" ${curlcustomstring} "https://api.telegram.org/bot${telegramtoken}/sendMessage" | grep "error_code") -if [ "${telegramsend}" ]; then +if [ -n "${telegramsend}" ]; then fn_print_fail_nl "Sending Telegram alert: ${telegramsend}" fn_script_log_fatal "Sending Telegram alert: ${telegramsend}" else diff --git a/lgsm/functions/check.sh b/lgsm/functions/check.sh old mode 100644 new mode 100755 index d5e7df939..7ce2e9824 --- a/lgsm/functions/check.sh +++ b/lgsm/functions/check.sh @@ -67,7 +67,7 @@ for allowed_command in "${allowed_commands_array[@]}"; do fi done -allowed_commands_array=( DEBUG DETAILS POST_DETAILS MONITOR START STOP DEV-QUERY-RAW ) +allowed_commands_array=( DEBUG DETAILS DEV-QUERY-RAW MONITOR POST_DETAILS START STOP POST-DETAILS ) for allowed_command in "${allowed_commands_array[@]}"; do if [ "${allowed_command}" == "${commandname}" ]; then if [ -z "${installflag}" ]; then @@ -85,7 +85,7 @@ for allowed_command in "${allowed_commands_array[@]}"; do fi done -allowed_commands_array=( DETAILS MONITOR START STOP CHANGE-PASSWORD UPDATE VALIDATE ) +allowed_commands_array=( CHANGE-PASSWORD DETAILS MONITOR START STOP UPDATE VALIDATE POST-DETAILS ) for allowed_command in "${allowed_commands_array[@]}"; do if [ "${allowed_command}" == "${commandname}" ]; then check_status.sh diff --git a/lgsm/functions/check_config.sh b/lgsm/functions/check_config.sh old mode 100644 new mode 100755 diff --git a/lgsm/functions/check_deps.sh b/lgsm/functions/check_deps.sh old mode 100644 new mode 100755 diff --git a/lgsm/functions/check_executable.sh b/lgsm/functions/check_executable.sh old mode 100644 new mode 100755 diff --git a/lgsm/functions/check_glibc.sh b/lgsm/functions/check_glibc.sh old mode 100644 new mode 100755 diff --git a/lgsm/functions/check_ip.sh b/lgsm/functions/check_ip.sh old mode 100644 new mode 100755 diff --git a/lgsm/functions/check_last_update.sh b/lgsm/functions/check_last_update.sh old mode 100644 new mode 100755 diff --git a/lgsm/functions/check_logs.sh b/lgsm/functions/check_logs.sh old mode 100644 new mode 100755 diff --git a/lgsm/functions/check_permissions.sh b/lgsm/functions/check_permissions.sh old mode 100644 new mode 100755 diff --git a/lgsm/functions/check_root.sh b/lgsm/functions/check_root.sh old mode 100644 new mode 100755 diff --git a/lgsm/functions/check_status.sh b/lgsm/functions/check_status.sh old mode 100644 new mode 100755 diff --git a/lgsm/functions/check_steamcmd.sh b/lgsm/functions/check_steamcmd.sh old mode 100644 new mode 100755 diff --git a/lgsm/functions/check_system_dir.sh b/lgsm/functions/check_system_dir.sh old mode 100644 new mode 100755 diff --git a/lgsm/functions/check_system_requirements.sh b/lgsm/functions/check_system_requirements.sh old mode 100644 new mode 100755 diff --git a/lgsm/functions/check_tmuxception.sh b/lgsm/functions/check_tmuxception.sh old mode 100644 new mode 100755 diff --git a/lgsm/functions/check_version.sh b/lgsm/functions/check_version.sh old mode 100644 new mode 100755 diff --git a/lgsm/functions/command_backup.sh b/lgsm/functions/command_backup.sh old mode 100644 new mode 100755 diff --git a/lgsm/functions/command_console.sh b/lgsm/functions/command_console.sh old mode 100644 new mode 100755 diff --git a/lgsm/functions/command_debug.sh b/lgsm/functions/command_debug.sh old mode 100644 new mode 100755 diff --git a/lgsm/functions/command_details.sh b/lgsm/functions/command_details.sh old mode 100644 new mode 100755 diff --git a/lgsm/functions/command_dev_clear_functions.sh b/lgsm/functions/command_dev_clear_functions.sh old mode 100644 new mode 100755 diff --git a/lgsm/functions/command_dev_debug.sh b/lgsm/functions/command_dev_debug.sh old mode 100644 new mode 100755 diff --git a/lgsm/functions/command_dev_detect_deps.sh b/lgsm/functions/command_dev_detect_deps.sh old mode 100644 new mode 100755 diff --git a/lgsm/functions/command_dev_detect_glibc.sh b/lgsm/functions/command_dev_detect_glibc.sh old mode 100644 new mode 100755 diff --git a/lgsm/functions/command_dev_detect_ldd.sh b/lgsm/functions/command_dev_detect_ldd.sh old mode 100644 new mode 100755 diff --git a/lgsm/functions/command_dev_query_raw.sh b/lgsm/functions/command_dev_query_raw.sh old mode 100644 new mode 100755 diff --git a/lgsm/functions/command_donate.sh b/lgsm/functions/command_donate.sh old mode 100644 new mode 100755 diff --git a/lgsm/functions/command_fastdl.sh b/lgsm/functions/command_fastdl.sh old mode 100644 new mode 100755 diff --git a/lgsm/functions/command_install.sh b/lgsm/functions/command_install.sh old mode 100644 new mode 100755 diff --git a/lgsm/functions/command_install_resources_mta.sh b/lgsm/functions/command_install_resources_mta.sh old mode 100644 new mode 100755 diff --git a/lgsm/functions/command_mods_install.sh b/lgsm/functions/command_mods_install.sh old mode 100644 new mode 100755 diff --git a/lgsm/functions/command_mods_remove.sh b/lgsm/functions/command_mods_remove.sh old mode 100644 new mode 100755 diff --git a/lgsm/functions/command_mods_update.sh b/lgsm/functions/command_mods_update.sh old mode 100644 new mode 100755 diff --git a/lgsm/functions/command_monitor.sh b/lgsm/functions/command_monitor.sh old mode 100644 new mode 100755 diff --git a/lgsm/functions/command_postdetails.sh b/lgsm/functions/command_postdetails.sh old mode 100644 new mode 100755 index 3cb4c5852..b6fbb4495 --- a/lgsm/functions/command_postdetails.sh +++ b/lgsm/functions/command_postdetails.sh @@ -10,30 +10,7 @@ commandaction="Posting details" functionselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" fn_firstcommand_set -# Set posttarget to the appropriately-defined post destination. - -# The options for posttarget are: -# The default destination - hastebin -# posttarget="https://hastebin.com" -# -# Secondary destination - pastebin -# posttarget="http://pastebin.com -# -# Third option - leave on the filesystem -# posttarget= -# -# All of these options can be specified/overridden from the top-level -# invocation, as in: -# rustserver@gamerig:~$ posttarget="http://pastebin.com" ./rustserver pd -# to post to pastebin, or -# rustserver@gamerig:~$ posttarget= ./rustserver pd -# to leave the output on the filesystem. -posttarget=${posttarget="https://termbin.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="30D"}" +posttarget="https://termbin.com" # source all of the functions defined in the details command. info_messages.sh @@ -83,50 +60,21 @@ else fn_info_message_statusbottom } | sed -r "s/\x1B\[([0-9]{1,2}(;[0-9]{1,2})?)?[m|K]//g" | tee -a "${postdetailslog}" > /dev/null 2>&1 fi -# Pastebin -if [ "${posttarget}" == "http://pastebin.com" ] ; then - fn_print_dots "pastbin.com for ${postexpire}" - # grab the return from 'value' from an initial visit to pastebin. - csrftoken=$(curl -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" \ - -F "post_key=${csrftoken}" -F "paste_expire_date=${postexpire}" \ - -F "paste_name=${gamename} Debug Info" \ - -F "paste_format=8" -F "paste_private=0" \ - -F "paste_type=bash" -F "paste_code=<${postdetailslog}" | - awk '/^location: / { print $2 }' | sed "s/\n//g") - # Output the resulting link. - fn_print_ok_nl "pastbin.com for ${postexpire}" - fn_script_log_pass "pastbin.com for ${postexpire}" - pdurl="${posttarget}${link}" -# Hastebin -elif [ "${posttarget}" == "https://hastebin.com" ] ; then - fn_print_dots "hastebin.com" - # 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 "$(<${postdetailslog})" "${posttarget}/documents" | cut -d\" -f4) - fn_print_ok_nl "hastebin.com for ${postexpire}" - fn_script_log_pass "hastebin.com for ${postexpire}" - pdurl="${posttarget}/${link}" -# Termbin -elif [ "${posttarget}" == "https://termbin.com" ] ; then - fn_print_dots "termbin.com" - link=$(cat "${postdetailslog}" | nc termbin.com 9999 | tr -d '\n\0') - fn_print_ok_nl "termbin.com for 30D" - fn_script_log_pass "termbin.com for 30D" - pdurl="${link}" +fn_print_dots "termbin.com" +link=$(cat "${postdetailslog}" | nc termbin.com 9999 | tr -d '\n\0') +fn_print_ok_nl "termbin.com for 30D" +fn_script_log_pass "termbin.com for 30D" +pdurl="${link}" + +if [ ${firstcommandname} == "POST-DETAILS" ]; then + echo -e "" + echo -e "Please share the following url for support: " + echo -e "${pdurl}" fi -echo -e "" -echo -e "Please share the following url for support: " -echo -e "${pdurl}" fn_script_log_info "${pdurl}" if [ -z "${exitbypass}" ]; then core_exit.sh -else - alerturl="${pdurl}" fi +alerturl="${pdurl}" diff --git a/lgsm/functions/command_restart.sh b/lgsm/functions/command_restart.sh old mode 100644 new mode 100755 diff --git a/lgsm/functions/command_start.sh b/lgsm/functions/command_start.sh old mode 100644 new mode 100755 diff --git a/lgsm/functions/command_test_alert.sh b/lgsm/functions/command_test_alert.sh old mode 100644 new mode 100755 diff --git a/lgsm/functions/command_ts3_server_pass.sh b/lgsm/functions/command_ts3_server_pass.sh old mode 100644 new mode 100755 diff --git a/lgsm/functions/command_update.sh b/lgsm/functions/command_update.sh old mode 100644 new mode 100755 diff --git a/lgsm/functions/command_update_functions.sh b/lgsm/functions/command_update_functions.sh old mode 100644 new mode 100755 diff --git a/lgsm/functions/command_update_linuxgsm.sh b/lgsm/functions/command_update_linuxgsm.sh old mode 100644 new mode 100755 diff --git a/lgsm/functions/command_validate.sh b/lgsm/functions/command_validate.sh old mode 100644 new mode 100755 diff --git a/lgsm/functions/command_wipe.sh b/lgsm/functions/command_wipe.sh old mode 100644 new mode 100755 diff --git a/lgsm/functions/compress_unreal2_maps.sh b/lgsm/functions/compress_unreal2_maps.sh old mode 100644 new mode 100755 diff --git a/lgsm/functions/compress_ut99_maps.sh b/lgsm/functions/compress_ut99_maps.sh old mode 100644 new mode 100755 diff --git a/lgsm/functions/core_dl.sh b/lgsm/functions/core_dl.sh old mode 100644 new mode 100755 diff --git a/lgsm/functions/core_exit.sh b/lgsm/functions/core_exit.sh old mode 100644 new mode 100755 diff --git a/lgsm/functions/core_functions.sh b/lgsm/functions/core_functions.sh old mode 100644 new mode 100755 index a1ee7fe26..f136fa758 --- a/lgsm/functions/core_functions.sh +++ b/lgsm/functions/core_functions.sh @@ -574,6 +574,11 @@ functionfile="${FUNCNAME[0]}" fn_fetch_function } +alert_rocketchat.sh(){ +functionfile="${FUNCNAME[0]}" +fn_fetch_function +} + alert_slack.sh(){ functionfile="${FUNCNAME[0]}" fn_fetch_function diff --git a/lgsm/functions/core_getopt.sh b/lgsm/functions/core_getopt.sh old mode 100644 new mode 100755 diff --git a/lgsm/functions/core_legacy.sh b/lgsm/functions/core_legacy.sh old mode 100644 new mode 100755 diff --git a/lgsm/functions/core_logs.sh b/lgsm/functions/core_logs.sh old mode 100644 new mode 100755 diff --git a/lgsm/functions/core_messages.sh b/lgsm/functions/core_messages.sh old mode 100644 new mode 100755 diff --git a/lgsm/functions/core_trap.sh b/lgsm/functions/core_trap.sh old mode 100644 new mode 100755 diff --git a/lgsm/functions/fix.sh b/lgsm/functions/fix.sh old mode 100644 new mode 100755 diff --git a/lgsm/functions/fix_ark.sh b/lgsm/functions/fix_ark.sh old mode 100644 new mode 100755 diff --git a/lgsm/functions/fix_arma3.sh b/lgsm/functions/fix_arma3.sh old mode 100644 new mode 100755 diff --git a/lgsm/functions/fix_av.sh b/lgsm/functions/fix_av.sh old mode 100644 new mode 100755 diff --git a/lgsm/functions/fix_cmw.sh b/lgsm/functions/fix_cmw.sh old mode 100644 new mode 100755 diff --git a/lgsm/functions/fix_csgo.sh b/lgsm/functions/fix_csgo.sh old mode 100644 new mode 100755 diff --git a/lgsm/functions/fix_dst.sh b/lgsm/functions/fix_dst.sh old mode 100644 new mode 100755 diff --git a/lgsm/functions/fix_ges.sh b/lgsm/functions/fix_ges.sh old mode 100644 new mode 100755 diff --git a/lgsm/functions/fix_hw.sh b/lgsm/functions/fix_hw.sh old mode 100644 new mode 100755 diff --git a/lgsm/functions/fix_ins.sh b/lgsm/functions/fix_ins.sh old mode 100644 new mode 100755 diff --git a/lgsm/functions/fix_kf.sh b/lgsm/functions/fix_kf.sh old mode 100644 new mode 100755 diff --git a/lgsm/functions/fix_kf2.sh b/lgsm/functions/fix_kf2.sh old mode 100644 new mode 100755 diff --git a/lgsm/functions/fix_mcb.sh b/lgsm/functions/fix_mcb.sh old mode 100644 new mode 100755 diff --git a/lgsm/functions/fix_mta.sh b/lgsm/functions/fix_mta.sh old mode 100644 new mode 100755 diff --git a/lgsm/functions/fix_nmrih.sh b/lgsm/functions/fix_nmrih.sh old mode 100644 new mode 100755 diff --git a/lgsm/functions/fix_onset.sh b/lgsm/functions/fix_onset.sh old mode 100644 new mode 100755 diff --git a/lgsm/functions/fix_ro.sh b/lgsm/functions/fix_ro.sh old mode 100644 new mode 100755 diff --git a/lgsm/functions/fix_rust.sh b/lgsm/functions/fix_rust.sh old mode 100644 new mode 100755 diff --git a/lgsm/functions/fix_rw.sh b/lgsm/functions/fix_rw.sh old mode 100644 new mode 100755 diff --git a/lgsm/functions/fix_sdtd.sh b/lgsm/functions/fix_sdtd.sh old mode 100644 new mode 100755 diff --git a/lgsm/functions/fix_sfc.sh b/lgsm/functions/fix_sfc.sh old mode 100644 new mode 100755 diff --git a/lgsm/functions/fix_sof2.sh b/lgsm/functions/fix_sof2.sh old mode 100644 new mode 100755 diff --git a/lgsm/functions/fix_ss3.sh b/lgsm/functions/fix_ss3.sh old mode 100644 new mode 100755 diff --git a/lgsm/functions/fix_steamcmd.sh b/lgsm/functions/fix_steamcmd.sh old mode 100644 new mode 100755 diff --git a/lgsm/functions/fix_terraria.sh b/lgsm/functions/fix_terraria.sh old mode 100644 new mode 100755 diff --git a/lgsm/functions/fix_tf2.sh b/lgsm/functions/fix_tf2.sh old mode 100644 new mode 100755 diff --git a/lgsm/functions/fix_ts3.sh b/lgsm/functions/fix_ts3.sh old mode 100644 new mode 100755 diff --git a/lgsm/functions/fix_tu.sh b/lgsm/functions/fix_tu.sh old mode 100644 new mode 100755 diff --git a/lgsm/functions/fix_unt.sh b/lgsm/functions/fix_unt.sh old mode 100644 new mode 100755 diff --git a/lgsm/functions/fix_ut.sh b/lgsm/functions/fix_ut.sh old mode 100644 new mode 100755 diff --git a/lgsm/functions/fix_ut2k4.sh b/lgsm/functions/fix_ut2k4.sh old mode 100644 new mode 100755 diff --git a/lgsm/functions/fix_ut3.sh b/lgsm/functions/fix_ut3.sh old mode 100644 new mode 100755 diff --git a/lgsm/functions/fix_wurm.sh b/lgsm/functions/fix_wurm.sh old mode 100644 new mode 100755 diff --git a/lgsm/functions/fix_zmr.sh b/lgsm/functions/fix_zmr.sh old mode 100644 new mode 100755 diff --git a/lgsm/functions/info_config.sh b/lgsm/functions/info_config.sh old mode 100644 new mode 100755 diff --git a/lgsm/functions/info_distro.sh b/lgsm/functions/info_distro.sh old mode 100644 new mode 100755 index f7500b695..97c806da2 --- a/lgsm/functions/info_distro.sh +++ b/lgsm/functions/info_distro.sh @@ -97,7 +97,7 @@ cpumodel=$(awk -F: '/model name/ {name=$2} END {print name}' /proc/cpuinfo | sed cpucores=$(awk -F: '/model name/ {core++} END {print core}' /proc/cpuinfo) cpufreqency=$(awk -F: '/cpu MHz/ {freq=$2} END {print freq}' /proc/cpuinfo | sed 's/^[ \t]*//;s/[ \t]*$//') # CPU usage of the game server pid -if [ "${gameserverpid}" ]; then +if [ -n "${gameserverpid}" ]; then cpuused=$(ps --forest -o pcpu -g "${gameserverpid}"|awk '{s+=$1} END {print s}') cpuusedmhz=$(echo "${cpufreqency} * ${cpuused} / 100" | bc ) fi diff --git a/lgsm/functions/info_messages.sh b/lgsm/functions/info_messages.sh old mode 100644 new mode 100755 index 7c70b57a6..15fd7aa5b --- a/lgsm/functions/info_messages.sh +++ b/lgsm/functions/info_messages.sh @@ -424,19 +424,19 @@ fn_info_message_script(){ # LinuxGSM version: v19.9.0 # glibc required: 2.15 # Discord alert: off - # Slack alert: off # Email alert: off - # Pushbullet alert: off # IFTTT alert: off # Mailgun (email) alert: off + # Pushbullet alert: off # Pushover alert: off + # Rocketchat alert: off + # Slack alert: off # Telegram alert: off # Update on start: off # User: lgsm # Location: /home/lgsm/csgoserver # Config file: /home/lgsm/csgoserver/serverfiles/csgo/cfg/csgoserver.cfg - echo -e "${lightgreen}${selfname} Script Details${default}" fn_messages_separator { @@ -464,20 +464,23 @@ fn_info_message_script(){ # Discord alert echo -e "${lightblue}Discord alert:\t${default}${discordalert}" - # Slack alert - echo -e "${lightblue}Slack alert:\t${default}${slackalert}" # Email alert echo -e "${lightblue}Email alert:\t${default}${emailalert}" - # Pushbullet alert - echo -e "${lightblue}Pushbullet alert:\t${default}${pushbulletalert}" # IFTTT alert echo -e "${lightblue}IFTTT alert:\t${default}${iftttalert}" # Mailgun alert echo -e "${lightblue}Mailgun (email) alert:\t${default}${mailgunalert}" + # Pushbullet alert + echo -e "${lightblue}Pushbullet alert:\t${default}${pushbulletalert}" # Pushover alert echo -e "${lightblue}Pushover alert:\t${default}${pushoveralert}" + # Rocketchat alert + echo -e "${lightblue}Rocketchat alert:\t${default}${rocketchatalert}" + # Slack alert + echo -e "${lightblue}Slack alert:\t${default}${slackalert}" # Telegram alert echo -e "${lightblue}Telegram alert:\t${default}${telegramalert}" + # Update on start if [ -n "${updateonstart}" ]; then echo -e "${lightblue}Update on start:\t${default}${updateonstart}" diff --git a/lgsm/functions/info_parms.sh b/lgsm/functions/info_parms.sh old mode 100644 new mode 100755 diff --git a/lgsm/functions/info_stats.sh b/lgsm/functions/info_stats.sh old mode 100644 new mode 100755 diff --git a/lgsm/functions/install_complete.sh b/lgsm/functions/install_complete.sh old mode 100644 new mode 100755 diff --git a/lgsm/functions/install_config.sh b/lgsm/functions/install_config.sh old mode 100644 new mode 100755 diff --git a/lgsm/functions/install_dst_token.sh b/lgsm/functions/install_dst_token.sh old mode 100644 new mode 100755 diff --git a/lgsm/functions/install_eula.sh b/lgsm/functions/install_eula.sh old mode 100644 new mode 100755 diff --git a/lgsm/functions/install_factorio_save.sh b/lgsm/functions/install_factorio_save.sh old mode 100644 new mode 100755 diff --git a/lgsm/functions/install_gslt.sh b/lgsm/functions/install_gslt.sh old mode 100644 new mode 100755 diff --git a/lgsm/functions/install_header.sh b/lgsm/functions/install_header.sh old mode 100644 new mode 100755 diff --git a/lgsm/functions/install_logs.sh b/lgsm/functions/install_logs.sh old mode 100644 new mode 100755 diff --git a/lgsm/functions/install_modules.sh b/lgsm/functions/install_modules.sh old mode 100644 new mode 100755 diff --git a/lgsm/functions/install_mta_resources.sh b/lgsm/functions/install_mta_resources.sh old mode 100644 new mode 100755 diff --git a/lgsm/functions/install_retry.sh b/lgsm/functions/install_retry.sh old mode 100644 new mode 100755 diff --git a/lgsm/functions/install_server_dir.sh b/lgsm/functions/install_server_dir.sh old mode 100644 new mode 100755 diff --git a/lgsm/functions/install_server_files.sh b/lgsm/functions/install_server_files.sh old mode 100644 new mode 100755 diff --git a/lgsm/functions/install_squad_license.sh b/lgsm/functions/install_squad_license.sh old mode 100644 new mode 100755 diff --git a/lgsm/functions/install_stats.sh b/lgsm/functions/install_stats.sh old mode 100644 new mode 100755 diff --git a/lgsm/functions/install_steamcmd.sh b/lgsm/functions/install_steamcmd.sh old mode 100644 new mode 100755 diff --git a/lgsm/functions/install_ts3db.sh b/lgsm/functions/install_ts3db.sh old mode 100644 new mode 100755 diff --git a/lgsm/functions/install_ut2k4_key.sh b/lgsm/functions/install_ut2k4_key.sh old mode 100644 new mode 100755 diff --git a/lgsm/functions/mods_core.sh b/lgsm/functions/mods_core.sh old mode 100644 new mode 100755 diff --git a/lgsm/functions/mods_list.sh b/lgsm/functions/mods_list.sh old mode 100644 new mode 100755 diff --git a/lgsm/functions/query_gamedig.sh b/lgsm/functions/query_gamedig.sh old mode 100644 new mode 100755 diff --git a/lgsm/functions/query_gsquery.py b/lgsm/functions/query_gsquery.py old mode 100644 new mode 100755 diff --git a/lgsm/functions/update_factorio.sh b/lgsm/functions/update_factorio.sh old mode 100644 new mode 100755 diff --git a/lgsm/functions/update_minecraft.sh b/lgsm/functions/update_minecraft.sh old mode 100644 new mode 100755 diff --git a/lgsm/functions/update_minecraft_bedrock.sh b/lgsm/functions/update_minecraft_bedrock.sh old mode 100644 new mode 100755 diff --git a/lgsm/functions/update_mta.sh b/lgsm/functions/update_mta.sh old mode 100644 new mode 100755 diff --git a/lgsm/functions/update_mumble.sh b/lgsm/functions/update_mumble.sh old mode 100644 new mode 100755 diff --git a/lgsm/functions/update_ts3.sh b/lgsm/functions/update_ts3.sh old mode 100644 new mode 100755 diff --git a/tests/tests_defaultcfg/defaultcfg_1.txt b/tests/tests_defaultcfg/defaultcfg_1.txt index ca8fa2a8e..aa5b8a207 100644 --- a/tests/tests_defaultcfg/defaultcfg_1.txt +++ b/tests/tests_defaultcfg/defaultcfg_1.txt @@ -20,9 +20,8 @@ # Pushover Alerts | https://docs.linuxgsm.com/alerts/pushover # Slack Alerts | https://docs.linuxgsm.com/alerts/slack # Telegram Alerts | https://docs.linuxgsm.com/alerts/telegram -# You can add a custom cURL string eg proxy (useful in Russia) or else in "curlcustomstring". -# like a "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help", if you not need -# any custom string in curl - simple ignore this parameter. +# You can add a custom cURL string eg proxy (useful in Russia) in "curlcustomstring". +# For example "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help". ## Backup | https://docs.linuxgsm.com/commands/backup ## Logging | https://docs.linuxgsm.com/features/logging ## Monitor | https://docs.linuxgsm.com/commands/monitor From 47a02e87d64d5be2de4463df6c359cc1f5b6a69f Mon Sep 17 00:00:00 2001 From: Christian Date: Sun, 20 Sep 2020 22:01:19 +0200 Subject: [PATCH 472/534] fix(mod): csgo pug fix var not set (#3053) --- 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 aa0ee7614..13ae3e268 100755 --- a/lgsm/functions/mods_list.sh +++ b/lgsm/functions/mods_list.sh @@ -35,8 +35,8 @@ get5latestfile=$(echo -e "${get5lastbuild}" | jq -r '.fileName') get5latestfilepath=$(echo -e "${get5lastbuild}" | jq -r '.relativePath') get5url="https://ci.splewis.net/job/get5/lastSuccessfulBuild/artifact/${get5latestfilepath}" csgopuglatest=$(curl -sL https://api.github.com/repos/splewis/csgo-pug-setup/releases/latest | jq '.assets[]') -csgopuglatestfile=$(echo -e "${}" | jq -r '.name') -csgopuglatestlink=$(echo -e "${}" | jq -r '.browser_download_url') +csgopuglatestfile=$(echo -e "${csgopuglatest}" | jq -r '.name') +csgopuglatestlink=$(echo -e "${csgopuglatest}" | jq -r '.browser_download_url') # Oxide oxiderustlatestlink=$(curl -sL https://api.github.com/repos/OxideMod/Oxide.Rust/releases/latest | jq -r '.assets[]|select(.browser_download_url | contains("linux")) | .browser_download_url') oxidehurtworldlatestlink=$(curl -sL https://api.github.com/repos/OxideMod/Oxide.Hurtworld/releases/latest | jq -r '.assets[].browser_download_url') From 5b84fb5bf4bbeb26155ef62e68c49aa56c778b66 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Sun, 20 Sep 2020 21:32:35 +0100 Subject: [PATCH 473/534] Release 20.5.0 --- lgsm/functions/alert_discord.sh | 3 +- lgsm/functions/alert_rocketchat.sh | 2 +- lgsm/functions/alert_slack.sh | 103 ++++++++++----------- lgsm/functions/check_ip.sh | 8 +- lgsm/functions/command_postdetails.sh | 2 +- lgsm/functions/command_update.sh | 2 +- lgsm/functions/command_update_functions.sh | 0 lgsm/functions/core_functions.sh | 2 +- lgsm/functions/fix_squad.sh | 2 +- linuxgsm.sh | 2 +- tests/tests_defaultcfg/defaultcfg_0.txt | 11 ++- tests/tests_fctrserver.sh | 2 +- tests/tests_jc2server.sh | 2 +- tests/tests_mcserver.sh | 2 +- tests/tests_ts3server.sh | 2 +- 15 files changed, 72 insertions(+), 73 deletions(-) delete mode 100755 lgsm/functions/command_update_functions.sh diff --git a/lgsm/functions/alert_discord.sh b/lgsm/functions/alert_discord.sh index c19e66506..b9512bbe7 100755 --- a/lgsm/functions/alert_discord.sh +++ b/lgsm/functions/alert_discord.sh @@ -21,7 +21,8 @@ json=$(cat < Date: Sun, 20 Sep 2020 21:41:39 +0100 Subject: [PATCH 474/534] Release 20.5.0 --- lgsm/functions/command_postdetails.sh | 2 +- lgsm/functions/info_config.sh | 2 +- lgsm/functions/info_distro.sh | 4 ++-- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/lgsm/functions/command_postdetails.sh b/lgsm/functions/command_postdetails.sh index c819568f8..0f18b12a9 100755 --- a/lgsm/functions/command_postdetails.sh +++ b/lgsm/functions/command_postdetails.sh @@ -67,7 +67,7 @@ fn_print_ok_nl "termbin.com for 30D" fn_script_log_pass "termbin.com for 30D" pdurl="${link}" -if [ ${firstcommandname} == "POST-DETAILS" ]; then +if [ "${firstcommandname}" == "POST-DETAILS" ]; then echo -e "" echo -e "Please share the following url for support: " echo -e "${pdurl}" diff --git a/lgsm/functions/info_config.sh b/lgsm/functions/info_config.sh index c38e3e155..1ca69764d 100755 --- a/lgsm/functions/info_config.sh +++ b/lgsm/functions/info_config.sh @@ -1248,7 +1248,7 @@ fn_info_config_sdtd(){ 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}" | egrep -o 'value="[0-9]+"' | tr -cd '[:digit:]') + port=$(grep "ServerPort" "${servercfgfullpath}" | grep -Eo 'value="[0-9]+"' | tr -cd '[:digit:]') queryport=${port:-"0"} webadminenabled=$(grep "ControlPanelEnabled" "${servercfgfullpath}" | sed 's/^.*value="//' | cut -f1 -d"\"") diff --git a/lgsm/functions/info_distro.sh b/lgsm/functions/info_distro.sh index 97c806da2..8962426af 100755 --- a/lgsm/functions/info_distro.sh +++ b/lgsm/functions/info_distro.sh @@ -264,11 +264,11 @@ if [ "$(command -v jq 2>/dev/null)" ]; then if [ "${steammaster}" == "true" ]; then # Will query server IP addresses first. for queryip in "${queryips[@]}"; do - masterserver=$(curl -m 3 -s 'https://api.steampowered.com/ISteamApps/GetServersAtAddress/v0001?addr='${queryip}':'${port}'&format=json' | jq '.response.servers[]|.addr' | wc -l 2>/dev/null) + masterserver="$(curl -m 3 -s 'https://api.steampowered.com/ISteamApps/GetServersAtAddress/v0001?addr='${queryip}':'${port}'&format=json' | jq '.response.servers[]|.addr' | wc -l 2>/dev/null)" done # Should that not work it will try the external IP. if [ "${masterserver}" == "0" ]; then - masterserver=$(curl -m 3 -s 'https://api.steampowered.com/ISteamApps/GetServersAtAddress/v0001?addr='${extip}':'${port}'&format=json' | jq '.response.servers[]|.addr' | wc -l 2>/dev/null) + masterserver="$(curl -m 3 -s 'https://api.steampowered.com/ISteamApps/GetServersAtAddress/v0001?addr='${extip}':'${port}'&format=json' | jq '.response.servers[]|.addr' | wc -l 2>/dev/null)" fi if [ "${masterserver}" == "0" ]; then displaymasterserver="false" From f774335d7a83f8bdd88dc62e20e7e3cb21331d69 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Sat, 26 Sep 2020 23:30:03 +0100 Subject: [PATCH 475/534] Update no-response.yml --- .github/no-response.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/no-response.yml b/.github/no-response.yml index 432ff0cd1..a883b161e 100644 --- a/.github/no-response.yml +++ b/.github/no-response.yml @@ -3,7 +3,7 @@ # Number of days of inactivity before an Issue is closed for lack of response daysUntilClose: 60 # Label requiring a response -responseRequiredLabel: "status: waiting response" +responseRequiredLabel: "waiting response" # Comment to post when closing an Issue for lack of response. Set to `false` to disable closeComment: > This issue has been automatically closed because there has been no response From 901b7c3a16969b6a36c85fda70e200f5e799d6e2 Mon Sep 17 00:00:00 2001 From: Christian Date: Sun, 4 Oct 2020 22:25:51 +0200 Subject: [PATCH 476/534] fix(insserver): fix steamclient.so error (#3062) --- lgsm/functions/fix_steamcmd.sh | 2 ++ 1 file changed, 2 insertions(+) diff --git a/lgsm/functions/fix_steamcmd.sh b/lgsm/functions/fix_steamcmd.sh index 62245127b..3fe106c38 100755 --- a/lgsm/functions/fix_steamcmd.sh +++ b/lgsm/functions/fix_steamcmd.sh @@ -79,6 +79,8 @@ elif [ "${shortname}" == "cmw" ]; then fn_fix_steamclient_so "32" "${executabledir}/lib" elif [ "${shortname}" == "cs" ]; then fn_fix_steamclient_so "32" "${serverfiles}" +elif [ "${shortname}" == "ins" ]; then + fn_fix_steamclient_so "32" "${serverfiles}/bin" elif [ "${shortname}" == "pz" ]; then fn_fix_steamclient_so "32" "${serverfiles}/linux32" fn_fix_steamclient_so "64" "${serverfiles}/linux64" From 78cb4689ecf1afd675016ff85b1c0494663cd2d4 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Mon, 5 Oct 2020 22:31:09 +0100 Subject: [PATCH 477/534] fix(update): resolve broken minecraft updater since v1.16.3 (#3067) * fix(mcserver): resolve minecraft now outputting windows line endings * fix(update): resolve broken minecraft updater since v1.16.3 --- lgsm/functions/update_factorio.sh | 1 + lgsm/functions/update_minecraft.sh | 7 ++++--- lgsm/functions/update_minecraft_bedrock.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 + 7 files changed, 10 insertions(+), 3 deletions(-) mode change 100755 => 100644 lgsm/functions/update_factorio.sh mode change 100755 => 100644 lgsm/functions/update_minecraft_bedrock.sh mode change 100755 => 100644 lgsm/functions/update_mta.sh mode change 100755 => 100644 lgsm/functions/update_mumble.sh mode change 100755 => 100644 lgsm/functions/update_ts3.sh diff --git a/lgsm/functions/update_factorio.sh b/lgsm/functions/update_factorio.sh old mode 100755 new mode 100644 index ded4d8206..f13a48c43 --- a/lgsm/functions/update_factorio.sh +++ b/lgsm/functions/update_factorio.sh @@ -112,6 +112,7 @@ fn_update_factorio_compare(){ command_start.sh fn_firstcommand_reset fi + unset exitbypass date +%s > "${lockdir}/lastupdate.lock" alert="update" alert.sh diff --git a/lgsm/functions/update_minecraft.sh b/lgsm/functions/update_minecraft.sh index 9915f39b3..98889ed64 100755 --- a/lgsm/functions/update_minecraft.sh +++ b/lgsm/functions/update_minecraft.sh @@ -35,7 +35,7 @@ fn_update_minecraft_localbuild(){ # Gets local build info. fn_print_dots "Checking local build: ${remotelocation}" # Uses log file to gather info. - localbuild=$(grep Version "${consolelogdir}"/* 2>/dev/null | tail -1 | sed 's/.*Version //') + localbuild=$(grep -i version "${consolelogdir}"/* | tail -1 | sed 's/.*[Vv]ersion //' | sed 's/\r//g' 2>/dev/null) if [ -z "${localbuild}" ]; then fn_print_error "Checking local build: ${remotelocation}" fn_print_error_nl "Checking local build: ${remotelocation}: no log files containing version info" @@ -49,7 +49,7 @@ fn_update_minecraft_localbuild(){ command_start.sh fn_firstcommand_reset totalseconds=0 - localbuild=$(grep Version "${consolelogdir}"/* 2>/dev/null | tail -1 | sed 's/.*Version //') + localbuild=$(grep -i version "${consolelogdir}"/* | tail -1 | sed 's/.*[Vv]ersion //' | sed 's/\r//g' 2>/dev/null) while [ -z "${localbuild}" ]; do sleep 1 fn_print_info "Checking local build: ${remotelocation}: waiting for log file: ${totalseconds}" @@ -58,7 +58,7 @@ fn_update_minecraft_localbuild(){ fn_script_log_info "Waiting for log file to generate" fi - localbuild=$(grep Version "$(ls -tr "${consolelogdir}"/* 2>/dev/null)" | tail -1 | sed 's/.*Version //') + localbuild=$(grep -i version "${consolelogdir}"/* | tail -1 | sed 's/.*[Vv]ersion //' | sed 's/\r//g' 2>/dev/null) if [ "${totalseconds}" -gt "120" ]; then localbuild="0" fn_print_error "Checking local build: ${remotelocation}: waiting for log file" @@ -145,6 +145,7 @@ fn_update_minecraft_compare(){ command_start.sh fn_firstcommand_reset fi + unset exitbypass date +%s > "${lockdir}/lastupdate.lock" alert="update" alert.sh diff --git a/lgsm/functions/update_minecraft_bedrock.sh b/lgsm/functions/update_minecraft_bedrock.sh old mode 100755 new mode 100644 index d980ff289..34ada66b3 --- a/lgsm/functions/update_minecraft_bedrock.sh +++ b/lgsm/functions/update_minecraft_bedrock.sh @@ -139,6 +139,7 @@ fn_update_minecraft_compare(){ command_start.sh fn_firstcommand_reset fi + unset exitbypass date +%s > "${lockdir}/lastupdate.lock" alert="update" alert.sh diff --git a/lgsm/functions/update_mta.sh b/lgsm/functions/update_mta.sh old mode 100755 new mode 100644 index bb5f744ea..00ffc5a18 --- a/lgsm/functions/update_mta.sh +++ b/lgsm/functions/update_mta.sh @@ -168,6 +168,7 @@ fn_update_mta_compare(){ command_start.sh fn_firstcommand_reset fi + unset exitbypass date +%s > "${lockdir}/lastupdate.lock" alert="update" alert.sh diff --git a/lgsm/functions/update_mumble.sh b/lgsm/functions/update_mumble.sh old mode 100755 new mode 100644 index dfe8b317a..76ae837f3 --- a/lgsm/functions/update_mumble.sh +++ b/lgsm/functions/update_mumble.sh @@ -104,6 +104,7 @@ fn_update_mumble_compare(){ command_start.sh fn_firstcommand_reset fi + unset exitbypass date +%s > "${lockdir}/lastupdate.lock" alert="update" alert.sh diff --git a/lgsm/functions/update_steamcmd.sh b/lgsm/functions/update_steamcmd.sh index 11ad0598c..28496f7d7 100644 --- a/lgsm/functions/update_steamcmd.sh +++ b/lgsm/functions/update_steamcmd.sh @@ -113,6 +113,7 @@ fn_update_steamcmd_compare(){ command_start.sh fn_firstcommand_reset fi + unset exitbypass date +%s > "${lockdir}/lastupdate.lock" alert="update" alert.sh diff --git a/lgsm/functions/update_ts3.sh b/lgsm/functions/update_ts3.sh old mode 100755 new mode 100644 index b4fc5d692..b72979ff4 --- a/lgsm/functions/update_ts3.sh +++ b/lgsm/functions/update_ts3.sh @@ -166,6 +166,7 @@ fn_update_ts3_compare(){ command_start.sh fn_firstcommand_reset fi + unset exitbypass date +%s > "${lockdir}/lastupdate.lock" alert="update" alert.sh From 455fd0378746d8fe96bbeaddbfb6a7b24ba4b72f Mon Sep 17 00:00:00 2001 From: Christian Date: Mon, 5 Oct 2020 23:32:03 +0200 Subject: [PATCH 478/534] fix(rustserver): fix wipe for player.states.*.db (#3065) --- lgsm/functions/command_wipe.sh | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/lgsm/functions/command_wipe.sh b/lgsm/functions/command_wipe.sh index 7ebf2aa9d..3e0c53b2e 100755 --- a/lgsm/functions/command_wipe.sh +++ b/lgsm/functions/command_wipe.sh @@ -146,6 +146,19 @@ fn_wipe_server_files(){ fn_sleep_time fn_script_log_pass "No player death to remove" fi + # Wipe player states files + if [ -n "$(find "${serveridentitydir}" -type f -name "player.states.*.db")" ]; then + echo -en "removing player states player.states.*.db file(s)..." + fn_sleep_time + fn_script_log_info "Removing player states: ${serveridentitydir}/player.states.*.db" + find "${serveridentitydir:?}" -type f -name "player.states.*.db" -delete | tee -a "${lgsmlog}" + fn_wipe_exit_code + fn_sleep_time + else + echo -e "no player states to remove" + fn_sleep_time + fn_script_log_pass "No player states to remove" + fi # Wipe blueprints only if full-wipe command was used. if [ "${fullwipe}" == "1" ]; then if [ -n "$(find "${serveridentitydir}" -type f -name "player.blueprints.*.db")" ]; then From ff646adb24a105faa92765d3e62a36fc9fed5a8b Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Mon, 5 Oct 2020 22:35:12 +0100 Subject: [PATCH 479/534] Version v20.5.1 --- lgsm/functions/core_functions.sh | 2 +- linuxgsm.sh | 2 +- tests/tests_fctrserver.sh | 2 +- tests/tests_jc2server.sh | 2 +- tests/tests_mcserver.sh | 2 +- tests/tests_ts3server.sh | 2 +- 6 files changed, 6 insertions(+), 6 deletions(-) diff --git a/lgsm/functions/core_functions.sh b/lgsm/functions/core_functions.sh index ea11f7e70..308e3bb68 100755 --- a/lgsm/functions/core_functions.sh +++ b/lgsm/functions/core_functions.sh @@ -7,7 +7,7 @@ functionselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" -modulesversion="v20.5.0" +modulesversion="v20.5.1" # Core diff --git a/linuxgsm.sh b/linuxgsm.sh index 712f2eccf..67f24da3f 100755 --- a/linuxgsm.sh +++ b/linuxgsm.sh @@ -20,7 +20,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="v20.5.0" +version="v20.5.1" shortname="core" gameservername="core" commandname="CORE" diff --git a/tests/tests_fctrserver.sh b/tests/tests_fctrserver.sh index 6524907a8..8856a63b9 100644 --- a/tests/tests_fctrserver.sh +++ b/tests/tests_fctrserver.sh @@ -20,7 +20,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="v20.5.0" +version="v20.5.1" shortname="fctr" gameservername="fctrserver" commandname="CORE" diff --git a/tests/tests_jc2server.sh b/tests/tests_jc2server.sh index befa6c21c..dca188aef 100644 --- a/tests/tests_jc2server.sh +++ b/tests/tests_jc2server.sh @@ -20,7 +20,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="v20.5.0" +version="v20.5.1" shortname="jc2" gameservername="jc2server" commandname="CORE" diff --git a/tests/tests_mcserver.sh b/tests/tests_mcserver.sh index 4a81e0aea..71b45f34a 100644 --- a/tests/tests_mcserver.sh +++ b/tests/tests_mcserver.sh @@ -20,7 +20,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="v20.5.0" +version="v20.5.1" shortname="mc" gameservername="mcserver" commandname="CORE" diff --git a/tests/tests_ts3server.sh b/tests/tests_ts3server.sh index 29ba2af77..c9756c331 100644 --- a/tests/tests_ts3server.sh +++ b/tests/tests_ts3server.sh @@ -20,7 +20,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="v20.5.0" +version="v20.5.1" shortname="ts3" gameservername="ts3server" commandname="CORE" From 6f152ecfb3c182745c3d1d9a2b93713d38a77dfd Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Wed, 7 Oct 2020 11:46:19 +0100 Subject: [PATCH 480/534] Updated Codacy badge to new organisation --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 7e8c789d3..6f6f41c6f 100644 --- a/README.md +++ b/README.md @@ -3,7 +3,7 @@ LinuxGSM -[![LinuxGSM](https://img.shields.io/badge/-LinuxGSM-2b2b2b.svg?logo=data%3Aimage%2Fpng%3Bbase64%2CiVBORw0KGgoAAAANSUhEUgAAACsAAABACAYAAACDbo5ZAAAGD0lEQVR4AcWYa2wUVRvHz75c2vJ2disXoUBEVIioRAx%2BMIFA1IRwUS6KCCiIKBrvhEYiiGm5iBgk8QOGEgUUDYTttmVZWFr2UmwURS6iYAoCtmisElSsdHdbkT7%2BTzoNy%2BGc2dm54C%2F5Rdkz85x%2FZ86ZOXOYXYhIg3Phx%2FA4PAcv6f%2Btg5vhHJjP3EcZsgsshufJHH%2FAJbDztQ7aG35J1vgCXn%2BtgvrgEbLHYei9FmE3kDOUuh10OGwjZ7gEh7kZ9gNyllK3gnrg7%2BQs56DHjbCDyB0GuRF2ArnDeDfCziF3mO1G2FfJHRa4EXYpuUOxG2GXkzuUuBH2TXKH5W6ELSV3eM%2BNsOUk5yQcAY8p2uvgSPitor3MjbB1UOQXOFBvHwpbhPYWOExvL4SNUOQ7p4P2JTlzhOPmCu0vCu1PQpE2WOhk2MdJjk9y7HNwP1wEPUJbAcmZ6WTYrYolnifbxZBiibnFySHQCkUaLdY7C0V4%2FT5OhF1JcuIW6%2B0lOcvsBi2Ezao3j8Ov7Quwj52w60jNKIs1R5GatVaDDoEXSU4D7GSxbidYT3IuwjusFK0mNUVMwaZNNbl%2B%2F87hoVCom0HthaQmnG3QB0lNPcxlCvz%2B0GtlZTuorCxYYlA%2FDzbY%2FnrAgV3hCVLzCDMgEAi9wMMi9IIM%2FUwnNXWwi5mwRaSmmmXA798xq%2F3Khp420VeE1LyS6eQeBhttSXgzywCCToIUCOyYZvKLOWWwkdfd6ORVpGYJM0F5efDe9mEQHGty2BWTmhVGO4PNBmOoKzMBxmo%2FhD25dWvljSbD5hjMkb9gT9lJq63Mzi1bKkbjloc7xBWtwiRrDASCVRi%2FRxA8if%2BvrawMTzYI%2FACpeUv2KFFtDcUyTKilCHcis8G1Ga7wHpLzG8wVFs1K7jaeUKHZfIxmkj9%2FM4S9x9RGiMEudo0QbCVu9Xqn5PWEwLUk5%2FP0iaXac53I0kAH9Sau4m54lo%2FdTMfyekLYKQZ7ub34AbMMlmw5irC2VYTN0fuVMYMf8JHxJ7L7YYXAlSRnI2%2F8RtH4siTsDMz%2BZ5yS15OEXUxyDjGD1%2BvEq8MG16CDzY6JepKwT6geYbzxb0XjGMl7vwGSgzZIwo4nOa1M8Yr9Afb%2Fj8L21%2FsXaeaNZ2A6KTiEASph%2F0vF80cn4tokqu79fzfCUk2vfF4%2FFdFGEjGPHvg2yWrsDG%2F4%2BqpZB8jPOiXjWk0y5iXdM3XhKUvxBTA9UvHuvNPh%2Bzb%2BWj10z6nwuHWBbQFMvNCjKnn7qd1jS%2Fnx9VX3b6jC%2BbwOr5eMe3%2B83IcW4%2F3qgT%2BUTbA9srGaiHsn8AKiF6Ld%2FxF%2FOx6eeAJXabvK78MTTornNMd6XJTVR7%2Fj9bBjhFxV%2FMc1kJOAy2AeA%2FgrV4mFVDZFCqm8rEJ6qysCAWqK9iaztRJRbWXa4moFTELOav7jY%2FqAvoXp0Gc9NX7bIZl17%2FZl0rC1wRLeno0NvP%2B0CTcYNnS8wW6CtzNANaxzKqo9hRNOQ8rGo7tmSsMe2zWdt2frqVRcm5s2fofCgawDNHRNxnyfqgsYez4y4ADCjRM9H73hsNWafILTQdaFiSTj%2BQ%2FxA6yH7d%2BCmR8XbYr0a7VTF2N4siSsb5qdos3R6%2FjGxpULFfw7EfORnbrI9TAToX0sD40%2F2ylcGdh2Rdhg%2BSf2gka9jRTqK9%2BGwgHz7RTfVbHxirDhivdthYUvMRX8aYAD9lstvi%2B0aDL2DUZ0eCBUNNVG0IP65FLTWqPdiqdC0koHTVXe7iyNRG23QotBEy1RbTAzQyrmnYUT2rLsoA13JpcB4eVC2daBM1g2JGLekmwf5On7EJfngfZTNnVSce8bFjaTmQdvs%2FXmO%2FJVpoXdx3RSUe9O00Fj3nUdy0RLgRHiHXOPGW1h2uKZ07c9rG%2Bxyefp23pQeyBIEQoavYlakrG8fnrY5yHn2fbxXzAgw7m8bT5zkkSk4C7cpmOK21esB%2FXAQ5DzFfTo43%2BF%2FDzf0eZ4wZ3MDSjMcvD6nIeOahGgia%2FyU3HforTPkWkwnakdn0cI9jqfbPjD%2FuQLJr6644snlgX%2FApOMoyd1R5%2FxAAAAAElFTkSuQmCC)](https://linuxgsm.com) [![Build Status](https://travis-ci.com/GameServerManagers/LinuxGSM.svg?branch=master)](https://travis-ci.com/GameServerManagers/LinuxGSM) [![Codacy Badge](https://api.codacy.com/project/badge/Grade/3e98be27840043a090c3ab6e35db44b0)](https://app.codacy.com/app/GameServerManagers/LinuxGSM?utm_source=github.com&utm_medium=referral&utm_content=GameServerManagers/LinuxGSM&utm_campaign=Badge_Grade_Dashboard) [![Codacy Badge](https://api.codacy.com/project/badge/Coverage/9ef77095e98a43618ddd57381f86b4be)](https://www.codacy.com/manual/GameServerManagers/LinuxGSM?utm_source=github.com&utm_medium=referral&utm_content=GameServerManagers/LinuxGSM&utm_campaign=Badge_Coverage) [![Backup Repo](https://github.com/GameServerManagers/LinuxGSM/workflows/Backup%20Repo/badge.svg)](https://bitbucket.org/GameServerManagers/linuxgsm) [![Discord](https://discordapp.com/api/guilds/127498813903601664/widget.png?style=shield)](https://linuxgsm.com/discord) [![MIT Licence](https://badges.frapsoft.com/os/mit/mit.svg?v=103)](https://github.com/GameServerManagers/LinuxGSM/blob/master/LICENSE) [![made-with-bash](https://img.shields.io/badge/-Made%20with%20Bash-1f425f.svg?logo=image%2Fpng%3Bbase64%2CiVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyZpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw%2FeHBhY2tldCBiZWdpbj0i77u%2FIiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8%2BIDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNi1jMTExIDc5LjE1ODMyNSwgMjAxNS8wOS8xMC0wMToxMDoyMCAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENDIDIwMTUgKFdpbmRvd3MpIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOkE3MDg2QTAyQUZCMzExRTVBMkQxRDMzMkJDMUQ4RDk3IiB4bXBNTTpEb2N1bWVudElEPSJ4bXAuZGlkOkE3MDg2QTAzQUZCMzExRTVBMkQxRDMzMkJDMUQ4RDk3Ij4gPHhtcE1NOkRlcml2ZWRGcm9tIHN0UmVmOmluc3RhbmNlSUQ9InhtcC5paWQ6QTcwODZBMDBBRkIzMTFFNUEyRDFEMzMyQkMxRDhEOTciIHN0UmVmOmRvY3VtZW50SUQ9InhtcC5kaWQ6QTcwODZBMDFBRkIzMTFFNUEyRDFEMzMyQkMxRDhEOTciLz4gPC9yZGY6RGVzY3JpcHRpb24%2BIDwvcmRmOlJERj4gPC94OnhtcG1ldGE%2BIDw%2FeHBhY2tldCBlbmQ9InIiPz6lm45hAAADkklEQVR42qyVa0yTVxzGn7d9Wy03MS2ii8s%2BeokYNQSVhCzOjXZOFNF4jx%2BMRmPUMEUEqVG36jo2thizLSQSMd4N8ZoQ8RKjJtooaCpK6ZoCtRXKpRempbTv5ey83bhkAUphz8fznvP8znn%2B%2F3NeEEJgNBoRRSmz0ub%2FfuxEacBg%2FDmYtiCjgo5NG2mBXq%2BH5I1ogMRk9Zbd%2BQU2e1ML6VPLOyf5tvBQ8yT1lG10imxsABm7SLs898GTpyYynEzP60hO3trHDKvMigUwdeaceacqzp7nOI4n0SSIIjl36ao4Z356OV07fSQAk6xJ3XGg%2BLCr1d1OYlVHp4eUHPnerU79ZA%2F1kuv1JQMAg%2BE4O2P23EumF3VkvHprsZKMzKwbRUXFEyTvSIEmTVbrysp%2BWr8wfQHGK6WChVa3bKUmdWou%2BjpArdGkzZ41c1zG%2Fu5uGH4swzd561F%2BuhIT4%2BLnSuPsv9%2BJKIpjNr9dXYOyk7%2FBZrcjIT4eCnoKgedJP4BEqhG77E3NKP31FO7cfQA5K0dSYuLgz2TwCWJSOBzG6crzKK%2BohNfni%2Bx6OMUMMNe%2Fgf7ocbw0v0acKg6J8Ql0q%2BT%2FAXR5PNi5dz9c71upuQqCKFAD%2BYhrZLEAmpodaHO3Qy6TI3NhBpbrshGtOWKOSMYwYGQM8nJzoFJNxP2HjyIQho4PewK6hBktoDcUwtIln4PjOWzflQ%2Be5yl0yCCYgYikTclGlxadio%2BBQCSiW1UXoVGrKYwH4RgMrjU1HAB4vR6LzWYfFUCKxfS8Ftk5qxHoCUQAUkRJaSEokkV6Y%2F%2BJUOC4hn6A39NVXVBYeNP8piH6HeA4fPbpdBQV5KOx0QaL1YppX3Jgk0TwH2Vg6S3u%2BdB91%2B%2FpuNYPYFl5uP5V7ZqvsrX7jxqMXR6ff3gCQSTzFI0a1TX3wIs8ul%2Bq4HuWAAiM39vhOuR1O1fQ2gT%2F26Z8Z5vrl2OHi9OXZn995nLV9aFfS6UC9JeJPfuK0NBohWpCHMSAAsFe74WWP%2BvT25wtP9Bpob6uGqqyDnOtaeumjRu%2ByFu36VntK%2FPA5umTJeUtPWZSU9BCgud661odVp3DZtkc7AnYR33RRC708PrVi1larW7XwZIjLnd7R6SgSqWSNjU1B3F72pz5TZbXmX5vV81Yb7Lg7XT%2FUXriu8XLVqw6c6XqWnBKiiYU%2BMt3wWF7u7i91XlSEITwSAZ%2FCzAAHsJVbwXYFFEAAAAASUVORK5CYII%3D)](https://www.gnu.org/software/bash/) +[![LinuxGSM](https://img.shields.io/badge/-LinuxGSM-2b2b2b.svg?logo=data%3Aimage%2Fpng%3Bbase64%2CiVBORw0KGgoAAAANSUhEUgAAACsAAABACAYAAACDbo5ZAAAGD0lEQVR4AcWYa2wUVRvHz75c2vJ2disXoUBEVIioRAx%2BMIFA1IRwUS6KCCiIKBrvhEYiiGm5iBgk8QOGEgUUDYTttmVZWFr2UmwURS6iYAoCtmisElSsdHdbkT7%2BTzoNy%2BGc2dm54C%2F5Rdkz85x%2FZ86ZOXOYXYhIg3Phx%2FA4PAcv6f%2Btg5vhHJjP3EcZsgsshufJHH%2FAJbDztQ7aG35J1vgCXn%2BtgvrgEbLHYei9FmE3kDOUuh10OGwjZ7gEh7kZ9gNyllK3gnrg7%2BQs56DHjbCDyB0GuRF2ArnDeDfCziF3mO1G2FfJHRa4EXYpuUOxG2GXkzuUuBH2TXKH5W6ELSV3eM%2BNsOUk5yQcAY8p2uvgSPitor3MjbB1UOQXOFBvHwpbhPYWOExvL4SNUOQ7p4P2JTlzhOPmCu0vCu1PQpE2WOhk2MdJjk9y7HNwP1wEPUJbAcmZ6WTYrYolnifbxZBiibnFySHQCkUaLdY7C0V4%2FT5OhF1JcuIW6%2B0lOcvsBi2Ezao3j8Ov7Quwj52w60jNKIs1R5GatVaDDoEXSU4D7GSxbidYT3IuwjusFK0mNUVMwaZNNbl%2B%2F87hoVCom0HthaQmnG3QB0lNPcxlCvz%2B0GtlZTuorCxYYlA%2FDzbY%2FnrAgV3hCVLzCDMgEAi9wMMi9IIM%2FUwnNXWwi5mwRaSmmmXA798xq%2F3Khp420VeE1LyS6eQeBhttSXgzywCCToIUCOyYZvKLOWWwkdfd6ORVpGYJM0F5efDe9mEQHGty2BWTmhVGO4PNBmOoKzMBxmo%2FhD25dWvljSbD5hjMkb9gT9lJq63Mzi1bKkbjloc7xBWtwiRrDASCVRi%2FRxA8if%2BvrawMTzYI%2FACpeUv2KFFtDcUyTKilCHcis8G1Ga7wHpLzG8wVFs1K7jaeUKHZfIxmkj9%2FM4S9x9RGiMEudo0QbCVu9Xqn5PWEwLUk5%2FP0iaXac53I0kAH9Sau4m54lo%2FdTMfyekLYKQZ7ub34AbMMlmw5irC2VYTN0fuVMYMf8JHxJ7L7YYXAlSRnI2%2F8RtH4siTsDMz%2BZ5yS15OEXUxyDjGD1%2BvEq8MG16CDzY6JepKwT6geYbzxb0XjGMl7vwGSgzZIwo4nOa1M8Yr9Afb%2Fj8L21%2FsXaeaNZ2A6KTiEASph%2F0vF80cn4tokqu79fzfCUk2vfF4%2FFdFGEjGPHvg2yWrsDG%2F4%2BqpZB8jPOiXjWk0y5iXdM3XhKUvxBTA9UvHuvNPh%2Bzb%2BWj10z6nwuHWBbQFMvNCjKnn7qd1jS%2Fnx9VX3b6jC%2BbwOr5eMe3%2B83IcW4%2F3qgT%2BUTbA9srGaiHsn8AKiF6Ld%2FxF%2FOx6eeAJXabvK78MTTornNMd6XJTVR7%2Fj9bBjhFxV%2FMc1kJOAy2AeA%2FgrV4mFVDZFCqm8rEJ6qysCAWqK9iaztRJRbWXa4moFTELOav7jY%2FqAvoXp0Gc9NX7bIZl17%2FZl0rC1wRLeno0NvP%2B0CTcYNnS8wW6CtzNANaxzKqo9hRNOQ8rGo7tmSsMe2zWdt2frqVRcm5s2fofCgawDNHRNxnyfqgsYez4y4ADCjRM9H73hsNWafILTQdaFiSTj%2BQ%2FxA6yH7d%2BCmR8XbYr0a7VTF2N4siSsb5qdos3R6%2FjGxpULFfw7EfORnbrI9TAToX0sD40%2F2ylcGdh2Rdhg%2BSf2gka9jRTqK9%2BGwgHz7RTfVbHxirDhivdthYUvMRX8aYAD9lstvi%2B0aDL2DUZ0eCBUNNVG0IP65FLTWqPdiqdC0koHTVXe7iyNRG23QotBEy1RbTAzQyrmnYUT2rLsoA13JpcB4eVC2daBM1g2JGLekmwf5On7EJfngfZTNnVSce8bFjaTmQdvs%2FXmO%2FJVpoXdx3RSUe9O00Fj3nUdy0RLgRHiHXOPGW1h2uKZ07c9rG%2Bxyefp23pQeyBIEQoavYlakrG8fnrY5yHn2fbxXzAgw7m8bT5zkkSk4C7cpmOK21esB%2FXAQ5DzFfTo43%2BF%2FDzf0eZ4wZ3MDSjMcvD6nIeOahGgia%2FyU3HforTPkWkwnakdn0cI9jqfbPjD%2FuQLJr6644snlgX%2FApOMoyd1R5%2FxAAAAAElFTkSuQmCC)](https://linuxgsm.com) [![Build Status](https://travis-ci.com/GameServerManagers/LinuxGSM.svg?branch=master)](https://travis-ci.com/GameServerManagers/LinuxGSM) [![Codacy Badge](https://app.codacy.com/project/badge/Grade/d19c5234dc3743d8a8a14093711ca52d)](https://www.codacy.com/gh/GameServerManagers/LinuxGSM/dashboard?utm_source=github.com&utm_medium=referral&utm_content=GameServerManagers/LinuxGSM&utm_campaign=Badge_Grade) [![Backup Repo](https://github.com/GameServerManagers/LinuxGSM/workflows/Backup%20Repo/badge.svg)](https://bitbucket.org/GameServerManagers/linuxgsm) [![Discord](https://discordapp.com/api/guilds/127498813903601664/widget.png?style=shield)](https://linuxgsm.com/discord) [![MIT Licence](https://badges.frapsoft.com/os/mit/mit.svg?v=103)](https://github.com/GameServerManagers/LinuxGSM/blob/master/LICENSE) [![made-with-bash](https://img.shields.io/badge/-Made%20with%20Bash-1f425f.svg?logo=image%2Fpng%3Bbase64%2CiVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyZpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw%2FeHBhY2tldCBiZWdpbj0i77u%2FIiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8%2BIDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNi1jMTExIDc5LjE1ODMyNSwgMjAxNS8wOS8xMC0wMToxMDoyMCAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENDIDIwMTUgKFdpbmRvd3MpIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOkE3MDg2QTAyQUZCMzExRTVBMkQxRDMzMkJDMUQ4RDk3IiB4bXBNTTpEb2N1bWVudElEPSJ4bXAuZGlkOkE3MDg2QTAzQUZCMzExRTVBMkQxRDMzMkJDMUQ4RDk3Ij4gPHhtcE1NOkRlcml2ZWRGcm9tIHN0UmVmOmluc3RhbmNlSUQ9InhtcC5paWQ6QTcwODZBMDBBRkIzMTFFNUEyRDFEMzMyQkMxRDhEOTciIHN0UmVmOmRvY3VtZW50SUQ9InhtcC5kaWQ6QTcwODZBMDFBRkIzMTFFNUEyRDFEMzMyQkMxRDhEOTciLz4gPC9yZGY6RGVzY3JpcHRpb24%2BIDwvcmRmOlJERj4gPC94OnhtcG1ldGE%2BIDw%2FeHBhY2tldCBlbmQ9InIiPz6lm45hAAADkklEQVR42qyVa0yTVxzGn7d9Wy03MS2ii8s%2BeokYNQSVhCzOjXZOFNF4jx%2BMRmPUMEUEqVG36jo2thizLSQSMd4N8ZoQ8RKjJtooaCpK6ZoCtRXKpRempbTv5ey83bhkAUphz8fznvP8znn%2B%2F3NeEEJgNBoRRSmz0ub%2FfuxEacBg%2FDmYtiCjgo5NG2mBXq%2BH5I1ogMRk9Zbd%2BQU2e1ML6VPLOyf5tvBQ8yT1lG10imxsABm7SLs898GTpyYynEzP60hO3trHDKvMigUwdeaceacqzp7nOI4n0SSIIjl36ao4Z356OV07fSQAk6xJ3XGg%2BLCr1d1OYlVHp4eUHPnerU79ZA%2F1kuv1JQMAg%2BE4O2P23EumF3VkvHprsZKMzKwbRUXFEyTvSIEmTVbrysp%2BWr8wfQHGK6WChVa3bKUmdWou%2BjpArdGkzZ41c1zG%2Fu5uGH4swzd561F%2BuhIT4%2BLnSuPsv9%2BJKIpjNr9dXYOyk7%2FBZrcjIT4eCnoKgedJP4BEqhG77E3NKP31FO7cfQA5K0dSYuLgz2TwCWJSOBzG6crzKK%2BohNfni%2Bx6OMUMMNe%2Fgf7ocbw0v0acKg6J8Ql0q%2BT%2FAXR5PNi5dz9c71upuQqCKFAD%2BYhrZLEAmpodaHO3Qy6TI3NhBpbrshGtOWKOSMYwYGQM8nJzoFJNxP2HjyIQho4PewK6hBktoDcUwtIln4PjOWzflQ%2Be5yl0yCCYgYikTclGlxadio%2BBQCSiW1UXoVGrKYwH4RgMrjU1HAB4vR6LzWYfFUCKxfS8Ftk5qxHoCUQAUkRJaSEokkV6Y%2F%2BJUOC4hn6A39NVXVBYeNP8piH6HeA4fPbpdBQV5KOx0QaL1YppX3Jgk0TwH2Vg6S3u%2BdB91%2B%2FpuNYPYFl5uP5V7ZqvsrX7jxqMXR6ff3gCQSTzFI0a1TX3wIs8ul%2Bq4HuWAAiM39vhOuR1O1fQ2gT%2F26Z8Z5vrl2OHi9OXZn995nLV9aFfS6UC9JeJPfuK0NBohWpCHMSAAsFe74WWP%2BvT25wtP9Bpob6uGqqyDnOtaeumjRu%2ByFu36VntK%2FPA5umTJeUtPWZSU9BCgud661odVp3DZtkc7AnYR33RRC708PrVi1larW7XwZIjLnd7R6SgSqWSNjU1B3F72pz5TZbXmX5vV81Yb7Lg7XT%2FUXriu8XLVqw6c6XqWnBKiiYU%2BMt3wWF7u7i91XlSEITwSAZ%2FCzAAHsJVbwXYFFEAAAAASUVORK5CYII%3D)](https://www.gnu.org/software/bash/) [LinuxGSM](https://linuxgsm.com) is the command-line tool for quick, simple deployment and management of Linux dedicated game servers. From 0ff4305c39248178b6687295800c844f35fa2080 Mon Sep 17 00:00:00 2001 From: Christian Date: Wed, 7 Oct 2020 21:20:29 +0200 Subject: [PATCH 481/534] feat(mods): add Stripper:Source to the modlist (#3070) --- lgsm/functions/mods_list.sh | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/lgsm/functions/mods_list.sh b/lgsm/functions/mods_list.sh index 13ae3e268..333601dce 100755 --- a/lgsm/functions/mods_list.sh +++ b/lgsm/functions/mods_list.sh @@ -71,6 +71,7 @@ modseparator="MOD" 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)" ) mod_info_steamworks=( MOD "steamworks" "SteamWorks" "${steamworksurl}" "${steamworkslatestfile}" "0" "LowercaseOff" "${systemdir}" "OVERWRITE" "ENGINES" "Counter-Strike: Global Offensive;" "NOTGAMES" "https://github.com/KyleSanderson/SteamWorks" "Exposing SteamWorks functions to SourcePawn" ) +mod_info_stripper=( MOD "stripper" "Stripper Source" "http://www.bailopan.net/stripper/snapshots/1.2/stripper-1.2.2-git129-linux.tar.gz" "stripper-1.2.2-git129-linux.tar.gz" "0" "LowercaseOff" "${systemdir}" "addons/stripper/maps;" "ENGINES" "Counter-Strike: Global Offensive;Counter-Strike: Source;Day of Defeat: Source;Half Life: Deathmatch;Half Life 2: Deathmatch;Insurgency;Left 4 Dead;Left 4 Dead 2;Nuclear Dawn;Team Fortress 2;" "NOTGAMES" "http://www.bailopan.net/stripper/" "Add or remove objects from map (requires MetaMod)") # CS:GO Mods mod_info_gokz=( MOD "gokz" "GOKZ" "https://bitbucket.org/kztimerglobalteam/gokz/downloads/GOKZ-latest.zip" "gokz-latest.zip" "0" "LowercaseOff" "${systemdir}" "cfg;addons/sourcemod/configs;" "ENGINES" "Counter-Strike: Global Offensive;" "NOTGAMES" "https://bitbucket.org/kztimerglobalteam/gokz/src/master/" "Implements the KZ game mode (requires SourceMod and MetaMod)" ) @@ -99,4 +100,4 @@ mod_info_hwoxide=( MOD "hwoxide" "Oxide for Hurtworld" "${oxidehurtworldlatestli mod_info_sdtdoxide=( MOD "sdtdoxide" "Oxide for 7 Days To Die" "${oxidesdtdlatestlink}" "Oxide.SevenDaysToDie.zip" "0" "LowercaseOff" "${systemdir}" "OVERWRITE" "ENGINES" "7 Days To Die;" "NOTGAMES" "https://umod.org/games/7-days-to-die" "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_steamworks[@]}" "${mod_info_gokz[@]}" "${mod_info_ttt[@]}" "${mod_info_get5[@]}" "${mod_info_pug[@]}" "${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_pac3[@]}" "${mod_info_wiremod[@]}" "${mod_info_wiremodextras[@]}" "${mod_info_darkrp[@]}" "${mod_info_darkrpmodification[@]}" "${mod_info_rustoxide[@]}" "${mod_info_hwoxide[@]}" "${mod_info_sdtdoxide[@]}" ) +mods_global_array=( "${mod_info_metamod[@]}" "${mod_info_sourcemod[@]}" "${mod_info_steamworks[@]}" "${mod_info_stripper[@]}" "${mod_info_gokz[@]}" "${mod_info_ttt[@]}" "${mod_info_get5[@]}" "${mod_info_pug[@]}" "${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_pac3[@]}" "${mod_info_wiremod[@]}" "${mod_info_wiremodextras[@]}" "${mod_info_darkrp[@]}" "${mod_info_darkrpmodification[@]}" "${mod_info_rustoxide[@]}" "${mod_info_hwoxide[@]}" "${mod_info_sdtdoxide[@]}" ) From f0f0a561330a9cf51b7cb60a66cc8d8099ef81e8 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Fri, 9 Oct 2020 12:12:17 +0100 Subject: [PATCH 482/534] feat: remove support for Serious Sam 3 and Goldeneye: Source (#3078) --- .../config-lgsm/gesserver/_default.cfg | 183 ------------------ .../config-lgsm/ss3server/_default.cfg | 181 ----------------- lgsm/data/serverlist.csv | 2 - lgsm/functions/check_deps.sh | 6 - lgsm/functions/core_functions.sh | 10 - lgsm/functions/fix.sh | 4 - lgsm/functions/fix_ges.sh | 10 - lgsm/functions/fix_ss3.sh | 23 --- lgsm/functions/info_config.sh | 78 -------- lgsm/functions/info_messages.sh | 15 +- lgsm/functions/info_parms.sh | 23 --- lgsm/functions/install_config.sh | 14 -- lgsm/functions/install_server_files.sh | 4 +- 13 files changed, 2 insertions(+), 551 deletions(-) delete mode 100644 lgsm/config-default/config-lgsm/gesserver/_default.cfg delete mode 100644 lgsm/config-default/config-lgsm/ss3server/_default.cfg delete mode 100755 lgsm/functions/fix_ges.sh delete mode 100755 lgsm/functions/fix_ss3.sh diff --git a/lgsm/config-default/config-lgsm/gesserver/_default.cfg b/lgsm/config-default/config-lgsm/gesserver/_default.cfg deleted file mode 100644 index 24f5f65bf..000000000 --- a/lgsm/config-default/config-lgsm/gesserver/_default.cfg +++ /dev/null @@ -1,183 +0,0 @@ -################################## -######## Default Settings ######## -################################## -# DO NOT EDIT, ANY CHANGES 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. - -#### Game Server Settings #### - -## Predefined Parameters | https://docs.linuxgsm.com/configuration/start-parameters -ip="0.0.0.0" -port="27015" -clientport="27005" -sourcetvport="27020" -defaultmap="ge_archives" -maxplayers="16" - -## Server Parameters | https://docs.linuxgsm.com/configuration/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 #### - -## LinuxGSM Stats -# Send useful stats to LinuxGSM developers. -# https://docs.linuxgsm.com/configuration/linuxgsm-stats -# (on|off) -stats="off" - -## Notification Alerts -# (on|off) - -# Display IP | https://docs.linuxgsm.com/alerts#display-ip -displayip="" - -# More info | https://docs.linuxgsm.com/alerts#more-info -postalert="off" - -# Discord Alerts | https://docs.linuxgsm.com/alerts/discord -discordalert="off" -discordwebhook="webhook" - -# Email Alerts | https://docs.linuxgsm.com/alerts/email -emailalert="off" -email="email@example.com" -emailfrom="" - -# IFTTT Alerts | https://docs.linuxgsm.com/alerts/ifttt -iftttalert="off" -ifttttoken="accesstoken" -iftttevent="linuxgsm_alert" - -# Mailgun Email Alerts | https://docs.linuxgsm.com/alerts/mailgun -mailgunalert="off" -mailgunapiregion="us" -mailguntoken="accesstoken" -mailgundomain="example.com" -mailgunemailfrom="alert@example.com" -mailgunemail="email@myemail.com" - -# Pushbullet Alerts | https://docs.linuxgsm.com/alerts/pushbullet -pushbulletalert="off" -pushbullettoken="accesstoken" -channeltag="" - -# Pushover Alerts | https://docs.linuxgsm.com/alerts/pushover -pushoveralert="off" -pushovertoken="accesstoken" -pushoveruserkey="userkey" - -# Rocket.Chat Alerts | https://docs.linuxgsm.com/alerts/rocket.chat -rocketchatalert="off" -rocketchatwebhook="webhook" -rocketchattoken="" - -# Slack Alerts | https://docs.linuxgsm.com/alerts/slack -slackalert="off" -slackwebhook="webhook" - -# Telegram Alerts | https://docs.linuxgsm.com/alerts/telegram -# You can add a custom cURL string eg proxy (useful in Russia) in "curlcustomstring". -# For example "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help". -telegramalert="off" -telegramtoken="accesstoken" -telegramchatid="" -curlcustomstring="" - -## Updating | https://docs.linuxgsm.com/commands/update -updateonstart="off" - -## Backup | https://docs.linuxgsm.com/commands/backup -maxbackups="4" -maxbackupdays="30" -stoponbackup="on" - -## Logging | https://docs.linuxgsm.com/features/logging -consolelogging="on" -logdays="7" - -## Monitor | https://docs.linuxgsm.com/commands/monitor -# Query delay time -querydelay="1" - -## ANSI Colors | https://docs.linuxgsm.com/features/ansi-colors -ansi="on" - -#### Advanced Settings #### - -## Message Display Time | https://docs.linuxgsm.com/features/message-display-time -sleeptime="0.5" - -## SteamCMD Settings | https://docs.linuxgsm.com/steamcmd -# Server appid -appid="310" # Source 2007 SDK -# SteamCMD Branch | https://docs.linuxgsm.com/steamcmd/branch -branch="" -betapassword="" -# Master Server | https://docs.linuxgsm.com/steamcmd/steam-master-server -steammaster="true" - -## Stop Mode | https://docs.linuxgsm.com/features/stop-mode -# 1: tmux kill -# 2: CTRL+c -# 3: quit -# 4: quit 120s -# 5: stop -# 6: q -# 7: exit -# 8: 7 Days to Die -# 9: GoldSrc -# 10: Avorion -# 11: end -stopmode="3" - -## Query mode -# 1: session only -# 2: gamedig (gsquery fallback) -# 3: gamedig -# 4: gsquery -# 5: tcp -querymode="2" -querytype="protocol-valve" - -## Console type -consoleverbose="yes" -consoleinteract="yes" - -## Game Server Details -# Do not edit -gamename="GoldenEye: Source" -engine="source" -glibc="2.15" - -#### Directories #### -# Edit with care - -## Game Server Directories -systemdir="${serverfiles}/gesource" -executabledir="${serverfiles}" -executable="./srcds_run" -servercfgdir="${systemdir}/cfg" -servercfg="${selfname}.cfg" -servercfgdefault="server.cfg" -servercfgfullpath="${servercfgdir}/${servercfg}" - -## Backup Directory -backupdir="${lgsmdir}/backup" - -## Logging Directories -logdir="${rootdir}/log" -gamelogdir="${systemdir}/logs" -lgsmlogdir="${logdir}/script" -consolelogdir="${logdir}/console" -lgsmlog="${lgsmlogdir}/${selfname}-script.log" -consolelog="${consolelogdir}/${selfname}-console.log" -alertlog="${lgsmlogdir}/${selfname}-alert.log" -postdetailslog="${lgsmlogdir}/${selfname}-postdetails.log" - -## Logs Naming -lgsmlogdate="${lgsmlogdir}/${selfname}-script-$(date '+%Y-%m-%d-%H:%M:%S').log" -consolelogdate="${consolelogdir}/${selfname}-console-$(date '+%Y-%m-%d-%H:%M:%S').log" diff --git a/lgsm/config-default/config-lgsm/ss3server/_default.cfg b/lgsm/config-default/config-lgsm/ss3server/_default.cfg deleted file mode 100644 index 9cb3f5601..000000000 --- a/lgsm/config-default/config-lgsm/ss3server/_default.cfg +++ /dev/null @@ -1,181 +0,0 @@ -################################## -######## Default Settings ######## -################################## -# DO NOT EDIT, ANY CHANGES 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. - -#### Game Server Settings #### - -## Predefined Parameters | https://docs.linuxgsm.com/configuration/start-parameters -ip="0.0.0.0" - -## Server Parameters | https://docs.linuxgsm.com/configuration/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 #### - -## LinuxGSM Stats -# Send useful stats to LinuxGSM developers. -# https://docs.linuxgsm.com/configuration/linuxgsm-stats -# (on|off) -stats="off" - -## Notification Alerts -# (on|off) - -# Display IP | https://docs.linuxgsm.com/alerts#display-ip -displayip="" - -# More info | https://docs.linuxgsm.com/alerts#more-info -postalert="off" - -# Discord Alerts | https://docs.linuxgsm.com/alerts/discord -discordalert="off" -discordwebhook="webhook" - -# Email Alerts | https://docs.linuxgsm.com/alerts/email -emailalert="off" -email="email@example.com" -emailfrom="" - -# IFTTT Alerts | https://docs.linuxgsm.com/alerts/ifttt -iftttalert="off" -ifttttoken="accesstoken" -iftttevent="linuxgsm_alert" - -# Mailgun Email Alerts | https://docs.linuxgsm.com/alerts/mailgun -mailgunalert="off" -mailgunapiregion="us" -mailguntoken="accesstoken" -mailgundomain="example.com" -mailgunemailfrom="alert@example.com" -mailgunemail="email@myemail.com" - -# Pushbullet Alerts | https://docs.linuxgsm.com/alerts/pushbullet -pushbulletalert="off" -pushbullettoken="accesstoken" -channeltag="" - -# Pushover Alerts | https://docs.linuxgsm.com/alerts/pushover -pushoveralert="off" -pushovertoken="accesstoken" -pushoveruserkey="userkey" - -# Rocket.Chat Alerts | https://docs.linuxgsm.com/alerts/rocket.chat -rocketchatalert="off" -rocketchatwebhook="webhook" -rocketchattoken="" - -# Slack Alerts | https://docs.linuxgsm.com/alerts/slack -slackalert="off" -slackwebhook="webhook" - -# Telegram Alerts | https://docs.linuxgsm.com/alerts/telegram -# You can add a custom cURL string eg proxy (useful in Russia) in "curlcustomstring". -# For example "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help". -telegramalert="off" -telegramtoken="accesstoken" -telegramchatid="" -curlcustomstring="" - -## Updating | https://docs.linuxgsm.com/commands/update -updateonstart="off" - -## Backup | https://docs.linuxgsm.com/commands/backup -maxbackups="4" -maxbackupdays="30" -stoponbackup="on" - -## Logging | https://docs.linuxgsm.com/features/logging -consolelogging="on" -logdays="7" - -## Monitor | https://docs.linuxgsm.com/commands/monitor -# Query delay time -querydelay="1" - -## ANSI Colors | https://docs.linuxgsm.com/features/ansi-colors -ansi="on" - -#### Advanced Settings #### - -## Message Display Time | https://docs.linuxgsm.com/features/message-display-time -sleeptime="0.5" - -## SteamCMD Settings | https://docs.linuxgsm.com/steamcmd -# Server appid -appid="41080" -# SteamCMD Branch | https://docs.linuxgsm.com/steamcmd/branch -branch="" -betapassword="" -# Master Server | https://docs.linuxgsm.com/steamcmd/steam-master-server -steammaster="false" - -## Stop Mode | https://docs.linuxgsm.com/features/stop-mode -# 1: tmux kill -# 2: CTRL+c -# 3: quit -# 4: quit 120s -# 5: stop -# 6: q -# 7: exit -# 8: 7 Days to Die -# 9: GoldSrc -# 10: Avorion -# 11: end -stopmode="2" - -## Query mode -# 1: session only -# 2: gamedig (gsquery fallback) -# 3: gamedig -# 4: gsquery -# 5: tcp -querymode="2" -querytype="protocol-valve" - -## Console type -consoleverbose="" -consoleinteract="" - -## Game Server Details -# Do not edit -gamename="Serious Sam 3: BFE" -engine="seriousengine35" -glibc="2.13" - -#### Directories #### -# Edit with care - -## Game Server Directories -systemdir="${serverfiles}/Bin" -executabledir="${systemdir}" -executable="./runSam3_DedicatedServer.sh" -servercfgdir="${serverfiles}/Content/SeriousSam3/Config" -servercfg="${selfname}.ini" -servercfgdefault="server.ini" -servercfgfullpath="${servercfgdir}/${servercfg}" - -## Backup Directory -backupdir="${lgsmdir}/backup" - -## Logging Directories -logdir="${rootdir}/log" -gamelogdir="${logdir}/server" -lgsmlogdir="${logdir}/script" -consolelogdir="${logdir}/console" -gamelog="${gamelogdir}/${selfname}-game.log" -lgsmlog="${lgsmlogdir}/${selfname}-script.log" -consolelog="${consolelogdir}/${selfname}-console.log" -alertlog="${lgsmlogdir}/${selfname}-alert.log" -postdetailslog="${lgsmlogdir}/${selfname}-postdetails.log" - -## Logs Naming -lgsmlogdate="${lgsmlogdir}/${selfname}-script-$(date '+%Y-%m-%d-%H:%M:%S').log" -consolelogdate="${consolelogdir}/${selfname}-console-$(date '+%Y-%m-%d-%H:%M:%S').log" -gamelogdate="${gamelogdir}/${selfname}-game-$(date '+%Y-%m-%d-%H:%M:%S').log" diff --git a/lgsm/data/serverlist.csv b/lgsm/data/serverlist.csv index 8a71858fe..b871357f9 100644 --- a/lgsm/data/serverlist.csv +++ b/lgsm/data/serverlist.csv @@ -37,7 +37,6 @@ em,emserver,Empires Mod etl,etlserver,ET: Legacy fctr,fctrserver,Factorio fof,fofserver,Fistful of Frags -ges,gesserver,GoldenEye: Source gmod,gmodserver,Garrys Mod hl2dm,hl2dmserver,Half-Life 2: Deathmatch hldm,hldmserver,Half-Life: Deathmatch @@ -88,7 +87,6 @@ sfc,sfcserver,SourceForts Classic sof2,sof2server,Soldier Of Fortune 2: Gold Edition sol,solserver,Soldat squad,squadserver,Squad -ss3,ss3server,Serious Sam 3: BFE st,stserver,Stationeers sven,svenserver,Sven Co-op terraria,terrariaserver,Terraria diff --git a/lgsm/functions/check_deps.sh b/lgsm/functions/check_deps.sh index 18548e156..60fc30c72 100755 --- a/lgsm/functions/check_deps.sh +++ b/lgsm/functions/check_deps.sh @@ -425,9 +425,6 @@ fn_deps_build_debian(){ else array_deps_required+=( default-jre rng-tools ) fi - # GoldenEye: Source - elif [ "${shortname}" == "ges" ]; then - array_deps_required+=( zlib1g:i386 libldap-2.4-2:i386 ) # Sven Co-op elif [ "${shortname}" == "sven" ]; then array_deps_required+=( libssl1.1:i386 zlib1g:i386 ) @@ -534,9 +531,6 @@ fn_deps_build_redhat(){ else array_deps_required+=( java-11-openjdk rng-tools ) fi - # GoldenEye: Source - elif [ "${shortname}" == "ges" ]; then - array_deps_required+=( zlib.i686 openldap.i686 ) # Sven Co-op elif [ "${shortname}" == "sven" ]; then : # not compatible diff --git a/lgsm/functions/core_functions.sh b/lgsm/functions/core_functions.sh index 308e3bb68..21ef3cbd1 100755 --- a/lgsm/functions/core_functions.sh +++ b/lgsm/functions/core_functions.sh @@ -340,11 +340,6 @@ functionfile="${FUNCNAME[0]}" fn_fetch_function } -fix_ges.sh(){ -functionfile="${FUNCNAME[0]}" -fn_fetch_function -} - fix_hw.sh(){ functionfile="${FUNCNAME[0]}" fn_fetch_function @@ -450,11 +445,6 @@ functionfile="${FUNCNAME[0]}" fn_fetch_function } -fix_ss3.sh(){ -functionfile="${FUNCNAME[0]}" -fn_fetch_function -} - fix_ts3.sh(){ functionfile="${FUNCNAME[0]}" fn_fetch_function diff --git a/lgsm/functions/fix.sh b/lgsm/functions/fix.sh index ad5209747..f92709f56 100755 --- a/lgsm/functions/fix.sh +++ b/lgsm/functions/fix.sh @@ -48,8 +48,6 @@ if [ "${commandname}" != "INSTALL" ]&&[ -z "${fixbypass}" ]; then fix_cmw.sh elif [ "${shortname}" == "dst" ]; then fix_dst.sh - elif [ "${shortname}" == "ges" ]; then - fix_ges.sh elif [ "${shortname}" == "hw" ]; then fix_hw.sh elif [ "${shortname}" == "ins" ]; then @@ -70,8 +68,6 @@ if [ "${commandname}" != "INSTALL" ]&&[ -z "${fixbypass}" ]; then fix_sof2.sh elif [ "${shortname}" == "squad" ]; then fix_squad.sh - elif [ "${shortname}" == "ss3" ]; then - fix_ss3.sh elif [ "${shortname}" == "st" ]; then fix_st.sh elif [ "${shortname}" == "tf2" ]; then diff --git a/lgsm/functions/fix_ges.sh b/lgsm/functions/fix_ges.sh deleted file mode 100755 index 6065f9ba8..000000000 --- a/lgsm/functions/fix_ges.sh +++ /dev/null @@ -1,10 +0,0 @@ -#!/bin/bash -# LinuxGSM fix_ges.sh function -# Author: Daniel Gibbs -# Website: https://linuxgsm.com -# Description: Resolves various issues with GoldenEye: Source. - -functionselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" - -# Fixes: MALLOC_CHECK_ needing to be set to 0. -export MALLOC_CHECK_=0 diff --git a/lgsm/functions/fix_ss3.sh b/lgsm/functions/fix_ss3.sh deleted file mode 100755 index b19ba6f17..000000000 --- a/lgsm/functions/fix_ss3.sh +++ /dev/null @@ -1,23 +0,0 @@ -#!/bin/bash -# LinuxGSM fix_ss3.sh function -# Author: Daniel Gibbs -# Website: https://linuxgsm.com -# Description: Resolves various issues with Serious Sam 3. - -functionselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" - -# Fixes: https://steamcommunity.com/app/41070/discussions/0/353916981477716386/ -if [ -f "${serverfiles}/Bin/steamclient.so" ] && [ "$(diff "${HOME}/.steam/steamcmd/linux32/steamclient.so" "${serverfiles}/Bin/steamclient.so" 2>/dev/null)" ]; then - # delete old steamclient.so file - rm -f "${serverfiles}/Bin/steamclient.so" - fn_fix_steamclient_so "32" "${serverfiles}/Bin" -fi - -# Fixes: .steam/bin32/libsteam.so: cannot open shared object file: No such file or directory -if [ ! -f "${HOME}/.steam/bin32/libsteam.so" ]; then - fixname="libsteam.so" - fn_fix_msg_start - mkdir -p "${HOME}/.steam/bin32" - cp "${serverfiles}/Bin/libsteam.so" "${HOME}/.steam/bin32/libsteam.so" - fn_fix_msg_end -fi diff --git a/lgsm/functions/info_config.sh b/lgsm/functions/info_config.sh index 1ca69764d..d54fdba96 100755 --- a/lgsm/functions/info_config.sh +++ b/lgsm/functions/info_config.sh @@ -827,29 +827,6 @@ fn_info_config_rtcw(){ fi } -fn_info_config_seriousengine35(){ - if [ ! -f "${servercfgfullpath}" ]; then - servername="${unavailable}" - rconpassword="${unavailable}" - gamemode="${unavailable}" - maxplayers="${zero}" - port="${zero}" - else - servername=$(grep "prj_strMultiplayerSessionName" "${servercfgfullpath}" | sed -e 's/^[ \t]*//g' -e '/^\//d' -e 's/prj_strMultiplayerSessionName//g' | tr -d '=\";,:' | sed -e 's/^[ \t]*//' -e 's/[ \t]*$//') - rconpassword=$(grep "rcts_strAdminPassword" "${servercfgfullpath}" | sed -e 's/^[ \t]*//g' -e '/^\//d' -e 's/rcts_strAdminPassword//g' | tr -d '=\";,:' | sed -e 's/^[ \t]*//' -e 's/[ \t]*$//') - gamemode=$(grep "gam_idGameMode" "${servercfgfullpath}" | sed -e 's/^[ \t]*//g' -e '/^\//d' -e 's/gam_idGameMode//g' | tr -d '=\";,:' | sed -e 's/^[ \t]*//' -e 's/[ \t]*$//') - maxplayers=$(grep "gam_ctMaxPlayers" "${servercfgfullpath}" | grep -v "//" | tr -cd '[:digit:]') - port=$(grep "prj_uwPort" "${servercfgfullpath}" | grep -v "//" | tr -cd '[:digit:]') - - # Not Set - servername=${servername:-"NOT SET"} - rconpassword=${rconpassword:-"NOT SET"} - gamemode=${gamemode:-"NOT SET"} - maxplayers=${maxplayers:-"0"} - port=${port:-"0"} - fi -} - #StickyBots fn_info_config_sbots(){ if [ ! -f "${servercfgfullpath}" ]; then @@ -1534,162 +1511,108 @@ fn_info_config_soldat(){ fi } -# Assetto Corsa if [ "${shortname}" == "ac" ]; then fn_info_config_assettocorsa -# ARK: Survival Evolved elif [ "${shortname}" == "ark" ]; then fn_info_config_ark -# Avorion elif [ "${shortname}" == "av" ]; then fn_info_config_avorion -# Ballistic Overkill elif [ "${shortname}" == "bo" ]; then fn_info_config_ballistic_overkill -# Barotrauma elif [ "${shortname}" == "bt" ]; then fn_info_config_barotrauma -# Battalion 1944 elif [ "${shortname}" == "bt1944" ]; then fn_info_config_battalion1944 -# Battlefield: 1942 elif [ "${shortname}" == "bf1942" ]; then fn_info_config_bf1942 -# Battlefield: Vietnam elif [ "${shortname}" == "bfv" ]; then fn_info_config_bfv -# Chivalry: Medieval Warfare elif [ "${shortname}" == "cmw" ]; then fn_info_config_chivalry -# Call of Duty elif [ "${shortname}" == "cod" ]||[ "${shortname}" == "coduo" ]; then fn_info_config_cod -# Call of Duty 2 elif [ "${shortname}" == "cod2" ]; then fn_info_config_cod2 -# Call of Duty 4 elif [ "${shortname}" == "cod4" ]; then fn_info_config_cod4 -# Call of Duty: World at War elif [ "${shortname}" == "codwaw" ]; then fn_info_config_codwaw -# Dont Starve Together elif [ "${shortname}" == "dst" ]; then fn_info_config_dontstarve -# Eco elif [ "${shortname}" == "eco" ]; then fn_info_config_eco -# Factorio elif [ "${shortname}" == "fctr" ]; then fn_info_config_factorio -# Insurgency: Sandstorm elif [ "${shortname}" == "inss" ]; then fn_info_config_inss -# Just Cause 2 elif [ "${shortname}" == "jc2" ]; then fn_info_config_justcause2 -# Just Cause 3 elif [ "${shortname}" == "jc3" ]; then fn_info_config_justcause3 -# Killing Floor 2 elif [ "${shortname}" == "kf2" ]; then fn_info_config_kf2 -# Medal of Honor: Allied Assault elif [ "${shortname}" == "mohaa" ]; then fn_info_config_mohaa -# Memories of Mars elif [ "${shortname}" == "mofm" ]; then fn_info_config_mofm -# QuakeWorld elif [ "${shortname}" == "qw" ]; then fn_info_config_quakeworld -# Quake 2 elif [ "${shortname}" == "q2" ]; then fn_info_config_quake2 -# Quake 3 elif [ "${shortname}" == "q3" ]; then fn_info_config_quake3 -# Quake Live elif [ "${shortname}" == "ql" ]; then fn_info_config_quakelive -# Jedi Knight II: Jedi Outcast elif [ "${shortname}" == "jk2" ]; then fn_info_config_jk2 -# Minecraft elif [ "${shortname}" == "mc" ]; then fn_info_config_minecraft -# Minecraft Bedrock elif [ "${shortname}" == "mcb" ]; then fn_info_config_minecraft_bedrock -# Onset elif [ "${shortname}" == "onset" ]; then fn_info_config_onset -# Post Scriptum: The Bloody Seventh elif [ "${shortname}" == "pstbs" ]; then fn_info_config_pstbs -# Project Cars elif [ "${shortname}" == "pc" ]; then fn_info_config_projectcars -# Project Zomboid elif [ "${shortname}" == "pz" ]; then fn_info_config_projectzomboid -# ARMA 3 elif [ "${shortname}" == "arma3" ]; then fn_info_config_realvirtuality -# Return to Castle Wolfenstein elif [ "${shortname}" == "rtcw" ]; then fn_info_config_rtcw -# Rising World elif [ "${shortname}" == "rw" ]; then fn_info_config_risingworld -# Serious Sam -elif [ "${shortname}" == "ss3" ]; then - fn_info_config_seriousengine35 -# Soldat elif [ "${shortname}" == "sol" ]; then fn_info_config_soldat -# Soldier Of Fortune 2: Gold Edition elif [ "${shortname}" == "sof2" ]; then fn_info_config_sof2 -# Source Engine Games elif [ "${engine}" == "source" ]||[ "${engine}" == "goldsrc" ]; then fn_info_config_source -# Starbound elif [ "${shortname}" == "sb" ]; then fn_info_config_starbound -# Teamspeak 3 elif [ "${shortname}" == "ts3" ]; then fn_info_config_teamspeak3 -# Mumble elif [ "${shortname}" == "mumble" ]; then fn_info_config_mumble -# San Andreas Multiplayer elif [ "${shortname}" == "samp" ]; then fn_info_config_samp -# StickyBots elif [ "${shortname}" == "pstbs" ]; then fn_info_config_sbots -# Teeworlds elif [ "${shortname}" == "tw" ]; then fn_info_config_teeworlds -# Terraria elif [ "${shortname}" == "terraria" ]; then fn_info_config_terraria -# Tower Unite elif [ "${shortname}" == "tu" ]; then fn_info_config_towerunite -# Unreal engine elif [ "${engine}" == "unreal" ]; then fn_info_config_unreal -# Unreal 2 engine elif [ "${engine}" == "unreal2" ]; then fn_info_config_unreal2 -# Unreal 3 engine elif [ "${engine}" == "unreal3" ]; then fn_info_config_unreal3 elif [ "${shortname}" == "ut" ]; then fn_info_config_ut -# 7 Day To Die (unity3d) elif [ "${shortname}" == "sdtd" ]; then fn_info_config_sdtd elif [ "${shortname}" == "wet" ]; then @@ -1704,7 +1627,6 @@ elif [ "${shortname}" == "mta" ]; then fn_info_config_mta elif [ "${shortname}" == "squad" ]; then fn_info_config_squad -# Stationeers elif [ "${shortname}" == "st" ]; then fn_info_config_stationeers elif [ "${shortname}" == "mh" ]; then diff --git a/lgsm/functions/info_messages.sh b/lgsm/functions/info_messages.sh index 15fd7aa5b..4e1863f3e 100755 --- a/lgsm/functions/info_messages.sh +++ b/lgsm/functions/info_messages.sh @@ -572,7 +572,7 @@ fn_info_message_ports(){ parmslocation="${red}UNKNOWN${default}" # engines/games that require editing in the config file. - local ports_edit_array=( "avalanche2.0" "avalanche3.0" "Ballistic Overkill" "dontstarve" "Eco" "idtech2" "idtech3" "idtech3_ql" "lwjgl2" "Minecraft Bedrock" "Project Cars" "projectzomboid" "quake" "refractor" "realvirtuality" "renderware" "seriousengine35" "Stationeers" "teeworlds" "terraria" "unreal" "unreal2" "unreal3" "TeamSpeak 3" "Mumble" "7 Days To Die" "wurm") + local ports_edit_array=( "avalanche2.0" "avalanche3.0" "Ballistic Overkill" "dontstarve" "Eco" "idtech2" "idtech3" "idtech3_ql" "lwjgl2" "Minecraft Bedrock" "Project Cars" "projectzomboid" "quake" "refractor" "realvirtuality" "renderware" "Stationeers" "teeworlds" "terraria" "unreal" "unreal2" "unreal3" "TeamSpeak 3" "Mumble" "7 Days To Die" "wurm") for port_edit in "${ports_edit_array[@]}"; do if [ "${shortname}" == "ut3" ]; then parmslocation="${servercfgdir}/UTWeb.ini" @@ -1081,17 +1081,6 @@ fn_info_message_samp(){ } | column -s $'\t' -t } - -fn_info_message_ss3(){ - echo -e "netstat -atunp | grep Sam3_Ded" - echo -e "" - { - echo -e "${lightblue}DESCRIPTION\tDIRECTION\tPORT\tPROTOCOL${default}" - echo -e "> Game/RCON\tINBOUND\t${port}\ttcp" - echo -e "> Query\tINBOUND\t${queryport}\tudp" - } | column -s $'\t' -t -} - fn_info_message_sbots(){ echo -e "netstat -atunp | grep blank1" echo -e "" @@ -1530,8 +1519,6 @@ fn_info_message_select_engine(){ fn_info_message_starbound elif [ "${shortname}" == "sbots" ]; then fn_info_message_sbots - elif [ "${shortname}" == "ss3" ]; then - fn_info_message_ss3 elif [ "${shortname}" == "terraria" ]; then fn_info_message_terraria elif [ "${shortname}" == "ts3" ]; then diff --git a/lgsm/functions/info_parms.sh b/lgsm/functions/info_parms.sh index 93df0309f..57ca43850 100755 --- a/lgsm/functions/info_parms.sh +++ b/lgsm/functions/info_parms.sh @@ -187,11 +187,6 @@ fn_info_parms_sof2(){ defaultmap=${defaultmap:-"NOT SET"} } -fn_info_parms_ss3(){ - port=${port:-"0"} - queryport=$((port + 1)) -} - fn_info_parms_towerunite(){ port=${port:-"0"} queryport=${queryport:-"0"} @@ -233,19 +228,14 @@ fn_info_parms_wf(){ webadminport=${webadminport:-"0"} } -# ARK: Survival Evolved if [ "${shortname}" == "ark" ]; then fn_info_parms_ark -# ARMA 3 elif [ "${shortname}" == "arma3" ]; then fn_info_parms_realvirtuality -# Barotrauma elif [ "${shortname}" == "bt" ]; then fn_info_parms_barotrauma -# Call of Duty elif [ "${shortname}" == "cod" ]||[ "${shortname}" == "coduo" ]||[ "${engine}" == "iw2.0" ]||[ "${engine}" == "iw3.0" ]; then fn_info_parms_cod -# Factorio elif [ "${shortname}" == "fctr" ]; then fn_info_parms_factorio elif [ "${shortname}" == "inss" ]; then @@ -256,10 +246,8 @@ elif [ "${shortname}" == "kf2" ]; then fn_info_parms_kf2 elif [ "${shortname}" == "mohaa" ]; then fn_info_parms_mohaa -#Memories of Mars elif [ "${shortname}" == "mom" ]; then fn_info_parms_mom -# Project Zomboid elif [ "${shortname}" == "pz" ]; then fn_info_parms_projectzomboid elif [ "${shortname}" == "qw" ]; then @@ -268,26 +256,18 @@ elif [ "${shortname}" == "q2" ]||[ "${shortname}" == "q3" ]; then fn_info_parms_quake2 elif [ "${shortname}" == "rtcw" ]; then fn_info_parms_rtcw -# Rust elif [ "${shortname}" == "rust" ]; then fn_info_parms_rust elif [ "${shortname}" == "samp" ]; then fn_info_parms_samp -# Rising World elif [ "${shortname}" == "rw" ]; then fn_info_parms_risingworld -# Soldier Of Fortune 2: Gold Edition elif [ "${shortname}" == "sof2" ]; then fn_info_parms_sof2 -# Sticky Bots elif [ "${shortname}" == "sbots" ]; then fn_info_parms_stickybots -# Serious Sam -elif [ "${shortname}" == "ss3" ]; then - fn_info_parms_ss3 elif [ "${engine}" == "source" ]||[ "${engine}" == "goldsrc" ]; then fn_info_parms_source -# Spark elif [ "${engine}" == "spark" ]; then fn_info_parms_spark elif [ "${shortname}" == "tu" ]; then @@ -298,17 +278,14 @@ elif [ "${shortname}" == "mh" ]; then fn_info_parms_mordhau elif [ "${shortname}" == "mta" ]; then fn_info_parms_mta -# Unreal/Unreal 2 engine elif [ "${engine}" == "unreal" ]||[ "${engine}" == "unreal2" ]; then fn_info_parms_unreal -# Unreal 3 engine elif [ "${engine}" == "unreal3" ]; then fn_info_parms_unreal3 elif [ "${shortname}" == "unt" ]; then fn_info_parms_unturned elif [ "${shortname}" == "ut" ]; then fn_info_parms_ut -# Warfork elif [ "${shortname}" == "wf" ]; then fn_info_parms_wf fi diff --git a/lgsm/functions/install_config.sh b/lgsm/functions/install_config.sh index 63589b81c..543bd0a3d 100755 --- a/lgsm/functions/install_config.sh +++ b/lgsm/functions/install_config.sh @@ -429,13 +429,6 @@ elif [ "${shortname}" == "gmod" ]; then fn_default_config_remote fn_set_config_vars fn_list_config_locations -elif [ "${shortname}" == "ges" ]; then - gamedirname="GoldenEyeSource" - array_configs+=( server.cfg ) - fn_fetch_default_config - fn_default_config_remote - fn_set_config_vars - fn_list_config_locations elif [ "${shortname}" == "hldm" ]; then gamedirname="HalfLifeDeathmatch" array_configs+=( server.cfg ) @@ -667,13 +660,6 @@ elif [ "${shortname}" == "samp" ]; then fn_default_config_remote fn_set_config_vars fn_list_config_locations -elif [ "${shortname}" == "ss3" ]; then - gamedirname="SeriousSam3BFE" - array_configs+=( server.ini ) - fn_fetch_default_config - fn_default_config_remote - fn_set_config_vars - fn_list_config_locations elif [ "${shortname}" == "sol" ]; then gamedirname="Soldat" array_configs+=( soldat.ini ) diff --git a/lgsm/functions/install_server_files.sh b/lgsm/functions/install_server_files.sh index 979a32805..73f2dc2b1 100755 --- a/lgsm/functions/install_server_files.sh +++ b/lgsm/functions/install_server_files.sh @@ -27,8 +27,6 @@ fn_install_server_files(){ remote_fileurl="http://linuxgsm.download/CallOfDutyWorldAtWar/codwaw-lnxded-1.7-full.tar.xz"; local_filedir="${tmpdir}"; local_filename="codwaw-lnxded-1.7-full.tar.xz"; chmodx="nochmodx" run="norun"; force="noforce"; md5="2c6be1bb66ea631b9b2e7ae6216c6680" elif [ "${shortname}" == "etl" ]; then remote_fileurl="http://linuxgsm.download/WolfensteinEnemyTerritory/etlegacy-v2.76-i386-et-260b.tar.xz"; local_filedir="${tmpdir}"; local_filename="etlegacy-v2.75-i386-et-260b.tar.bz2"; chmodx="nochmodx" run="norun"; force="noforce"; md5="178a00233cec1e25b69d130107ce1a79" - elif [ "${shortname}" == "ges" ]; then - remote_fileurl="http://linuxgsm.download/GoldenEyeSource/GoldenEye_Source_v5.0.6_full_server.tar.xz"; local_filedir="${tmpdir}"; local_filename="GoldenEye_Source_v5.0.6_full_server.tar.xz"; chmodx="nochmodx" run="norun"; force="noforce"; md5="e31481f280eed40c9145816bd4f6dc45" elif [ "${shortname}" == "mohaa" ]; then remote_fileurl="http://linuxgsm.download/MedalofHonorAlliedAssault/moh_revival_v1.12_RC3.5.1.tar.xz"; local_filedir="${tmpdir}"; local_filename="moh_revival_v1.12_RC3.5.1.tar.xz"; chmodx="nochmodx" run="norun"; force="noforce"; md5="7c664538999252eeaf2b6d9949416480" elif [ "${shortname}" == "ns" ]; then @@ -93,7 +91,7 @@ elif [ "${shortname}" == "fctr" ]; then install_factorio_save.sh elif [ "${shortname}" == "jk2" ]; then update_jediknight2.sh -elif [ -z "${appid}" ]||[ "${shortname}" == "ahl" ]||[ "${shortname}" == "bd" ]||[ "${shortname}" == "bb" ]||[ "${shortname}" == "ges" ]||[ "${shortname}" == "ns" ]||[ "${shortname}" == "sfc" ]||[ "${shortname}" == "ts" ]||[ "${shortname}" == "vs" ]||[ "${shortname}" == "zmr" ]; then +elif [ -z "${appid}" ]||[ "${shortname}" == "ahl" ]||[ "${shortname}" == "bd" ]||[ "${shortname}" == "bb" ]||[ "${shortname}" == "ns" ]||[ "${shortname}" == "sfc" ]||[ "${shortname}" == "ts" ]||[ "${shortname}" == "vs" ]||[ "${shortname}" == "zmr" ]; then if [ "${shortname}" == "ut" ]; then install_eula.sh fi From a75ce429b52c8c5d57810ad007ece0eecf24b9af Mon Sep 17 00:00:00 2001 From: Max Vaessen Date: Sat, 10 Oct 2020 23:14:19 +0200 Subject: [PATCH 483/534] feat: allow forks to use master branch (#3073) The standard behaviour for master is that it uses the release/version number rather than the latest master. This is designed to prevent modules "version mixing" e.g alerts.sh being on v20.4.0 and alerts_discord.sh being v20.5.0. Version mixing can cause unpredictable behaviour and break installs. This solution will ensure that only the official the GameServerManagers repo uses this method. This allows forked repos to use custom code in master ignoring the release. --- README.md | 2 +- lgsm/functions/core_dl.sh | 14 +++++++++----- linuxgsm.sh | 3 ++- tests/tests_fctrserver.sh | 3 ++- tests/tests_jc2server.sh | 3 ++- tests/tests_mcserver.sh | 3 ++- tests/tests_ts3server.sh | 3 ++- 7 files changed, 20 insertions(+), 11 deletions(-) diff --git a/README.md b/README.md index 7e8c789d3..6f6f41c6f 100644 --- a/README.md +++ b/README.md @@ -3,7 +3,7 @@ LinuxGSM -[![LinuxGSM](https://img.shields.io/badge/-LinuxGSM-2b2b2b.svg?logo=data%3Aimage%2Fpng%3Bbase64%2CiVBORw0KGgoAAAANSUhEUgAAACsAAABACAYAAACDbo5ZAAAGD0lEQVR4AcWYa2wUVRvHz75c2vJ2disXoUBEVIioRAx%2BMIFA1IRwUS6KCCiIKBrvhEYiiGm5iBgk8QOGEgUUDYTttmVZWFr2UmwURS6iYAoCtmisElSsdHdbkT7%2BTzoNy%2BGc2dm54C%2F5Rdkz85x%2FZ86ZOXOYXYhIg3Phx%2FA4PAcv6f%2Btg5vhHJjP3EcZsgsshufJHH%2FAJbDztQ7aG35J1vgCXn%2BtgvrgEbLHYei9FmE3kDOUuh10OGwjZ7gEh7kZ9gNyllK3gnrg7%2BQs56DHjbCDyB0GuRF2ArnDeDfCziF3mO1G2FfJHRa4EXYpuUOxG2GXkzuUuBH2TXKH5W6ELSV3eM%2BNsOUk5yQcAY8p2uvgSPitor3MjbB1UOQXOFBvHwpbhPYWOExvL4SNUOQ7p4P2JTlzhOPmCu0vCu1PQpE2WOhk2MdJjk9y7HNwP1wEPUJbAcmZ6WTYrYolnifbxZBiibnFySHQCkUaLdY7C0V4%2FT5OhF1JcuIW6%2B0lOcvsBi2Ezao3j8Ov7Quwj52w60jNKIs1R5GatVaDDoEXSU4D7GSxbidYT3IuwjusFK0mNUVMwaZNNbl%2B%2F87hoVCom0HthaQmnG3QB0lNPcxlCvz%2B0GtlZTuorCxYYlA%2FDzbY%2FnrAgV3hCVLzCDMgEAi9wMMi9IIM%2FUwnNXWwi5mwRaSmmmXA798xq%2F3Khp420VeE1LyS6eQeBhttSXgzywCCToIUCOyYZvKLOWWwkdfd6ORVpGYJM0F5efDe9mEQHGty2BWTmhVGO4PNBmOoKzMBxmo%2FhD25dWvljSbD5hjMkb9gT9lJq63Mzi1bKkbjloc7xBWtwiRrDASCVRi%2FRxA8if%2BvrawMTzYI%2FACpeUv2KFFtDcUyTKilCHcis8G1Ga7wHpLzG8wVFs1K7jaeUKHZfIxmkj9%2FM4S9x9RGiMEudo0QbCVu9Xqn5PWEwLUk5%2FP0iaXac53I0kAH9Sau4m54lo%2FdTMfyekLYKQZ7ub34AbMMlmw5irC2VYTN0fuVMYMf8JHxJ7L7YYXAlSRnI2%2F8RtH4siTsDMz%2BZ5yS15OEXUxyDjGD1%2BvEq8MG16CDzY6JepKwT6geYbzxb0XjGMl7vwGSgzZIwo4nOa1M8Yr9Afb%2Fj8L21%2FsXaeaNZ2A6KTiEASph%2F0vF80cn4tokqu79fzfCUk2vfF4%2FFdFGEjGPHvg2yWrsDG%2F4%2BqpZB8jPOiXjWk0y5iXdM3XhKUvxBTA9UvHuvNPh%2Bzb%2BWj10z6nwuHWBbQFMvNCjKnn7qd1jS%2Fnx9VX3b6jC%2BbwOr5eMe3%2B83IcW4%2F3qgT%2BUTbA9srGaiHsn8AKiF6Ld%2FxF%2FOx6eeAJXabvK78MTTornNMd6XJTVR7%2Fj9bBjhFxV%2FMc1kJOAy2AeA%2FgrV4mFVDZFCqm8rEJ6qysCAWqK9iaztRJRbWXa4moFTELOav7jY%2FqAvoXp0Gc9NX7bIZl17%2FZl0rC1wRLeno0NvP%2B0CTcYNnS8wW6CtzNANaxzKqo9hRNOQ8rGo7tmSsMe2zWdt2frqVRcm5s2fofCgawDNHRNxnyfqgsYez4y4ADCjRM9H73hsNWafILTQdaFiSTj%2BQ%2FxA6yH7d%2BCmR8XbYr0a7VTF2N4siSsb5qdos3R6%2FjGxpULFfw7EfORnbrI9TAToX0sD40%2F2ylcGdh2Rdhg%2BSf2gka9jRTqK9%2BGwgHz7RTfVbHxirDhivdthYUvMRX8aYAD9lstvi%2B0aDL2DUZ0eCBUNNVG0IP65FLTWqPdiqdC0koHTVXe7iyNRG23QotBEy1RbTAzQyrmnYUT2rLsoA13JpcB4eVC2daBM1g2JGLekmwf5On7EJfngfZTNnVSce8bFjaTmQdvs%2FXmO%2FJVpoXdx3RSUe9O00Fj3nUdy0RLgRHiHXOPGW1h2uKZ07c9rG%2Bxyefp23pQeyBIEQoavYlakrG8fnrY5yHn2fbxXzAgw7m8bT5zkkSk4C7cpmOK21esB%2FXAQ5DzFfTo43%2BF%2FDzf0eZ4wZ3MDSjMcvD6nIeOahGgia%2FyU3HforTPkWkwnakdn0cI9jqfbPjD%2FuQLJr6644snlgX%2FApOMoyd1R5%2FxAAAAAElFTkSuQmCC)](https://linuxgsm.com) [![Build Status](https://travis-ci.com/GameServerManagers/LinuxGSM.svg?branch=master)](https://travis-ci.com/GameServerManagers/LinuxGSM) [![Codacy Badge](https://api.codacy.com/project/badge/Grade/3e98be27840043a090c3ab6e35db44b0)](https://app.codacy.com/app/GameServerManagers/LinuxGSM?utm_source=github.com&utm_medium=referral&utm_content=GameServerManagers/LinuxGSM&utm_campaign=Badge_Grade_Dashboard) [![Codacy Badge](https://api.codacy.com/project/badge/Coverage/9ef77095e98a43618ddd57381f86b4be)](https://www.codacy.com/manual/GameServerManagers/LinuxGSM?utm_source=github.com&utm_medium=referral&utm_content=GameServerManagers/LinuxGSM&utm_campaign=Badge_Coverage) [![Backup Repo](https://github.com/GameServerManagers/LinuxGSM/workflows/Backup%20Repo/badge.svg)](https://bitbucket.org/GameServerManagers/linuxgsm) [![Discord](https://discordapp.com/api/guilds/127498813903601664/widget.png?style=shield)](https://linuxgsm.com/discord) [![MIT Licence](https://badges.frapsoft.com/os/mit/mit.svg?v=103)](https://github.com/GameServerManagers/LinuxGSM/blob/master/LICENSE) [![made-with-bash](https://img.shields.io/badge/-Made%20with%20Bash-1f425f.svg?logo=image%2Fpng%3Bbase64%2CiVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyZpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw%2FeHBhY2tldCBiZWdpbj0i77u%2FIiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8%2BIDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNi1jMTExIDc5LjE1ODMyNSwgMjAxNS8wOS8xMC0wMToxMDoyMCAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENDIDIwMTUgKFdpbmRvd3MpIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOkE3MDg2QTAyQUZCMzExRTVBMkQxRDMzMkJDMUQ4RDk3IiB4bXBNTTpEb2N1bWVudElEPSJ4bXAuZGlkOkE3MDg2QTAzQUZCMzExRTVBMkQxRDMzMkJDMUQ4RDk3Ij4gPHhtcE1NOkRlcml2ZWRGcm9tIHN0UmVmOmluc3RhbmNlSUQ9InhtcC5paWQ6QTcwODZBMDBBRkIzMTFFNUEyRDFEMzMyQkMxRDhEOTciIHN0UmVmOmRvY3VtZW50SUQ9InhtcC5kaWQ6QTcwODZBMDFBRkIzMTFFNUEyRDFEMzMyQkMxRDhEOTciLz4gPC9yZGY6RGVzY3JpcHRpb24%2BIDwvcmRmOlJERj4gPC94OnhtcG1ldGE%2BIDw%2FeHBhY2tldCBlbmQ9InIiPz6lm45hAAADkklEQVR42qyVa0yTVxzGn7d9Wy03MS2ii8s%2BeokYNQSVhCzOjXZOFNF4jx%2BMRmPUMEUEqVG36jo2thizLSQSMd4N8ZoQ8RKjJtooaCpK6ZoCtRXKpRempbTv5ey83bhkAUphz8fznvP8znn%2B%2F3NeEEJgNBoRRSmz0ub%2FfuxEacBg%2FDmYtiCjgo5NG2mBXq%2BH5I1ogMRk9Zbd%2BQU2e1ML6VPLOyf5tvBQ8yT1lG10imxsABm7SLs898GTpyYynEzP60hO3trHDKvMigUwdeaceacqzp7nOI4n0SSIIjl36ao4Z356OV07fSQAk6xJ3XGg%2BLCr1d1OYlVHp4eUHPnerU79ZA%2F1kuv1JQMAg%2BE4O2P23EumF3VkvHprsZKMzKwbRUXFEyTvSIEmTVbrysp%2BWr8wfQHGK6WChVa3bKUmdWou%2BjpArdGkzZ41c1zG%2Fu5uGH4swzd561F%2BuhIT4%2BLnSuPsv9%2BJKIpjNr9dXYOyk7%2FBZrcjIT4eCnoKgedJP4BEqhG77E3NKP31FO7cfQA5K0dSYuLgz2TwCWJSOBzG6crzKK%2BohNfni%2Bx6OMUMMNe%2Fgf7ocbw0v0acKg6J8Ql0q%2BT%2FAXR5PNi5dz9c71upuQqCKFAD%2BYhrZLEAmpodaHO3Qy6TI3NhBpbrshGtOWKOSMYwYGQM8nJzoFJNxP2HjyIQho4PewK6hBktoDcUwtIln4PjOWzflQ%2Be5yl0yCCYgYikTclGlxadio%2BBQCSiW1UXoVGrKYwH4RgMrjU1HAB4vR6LzWYfFUCKxfS8Ftk5qxHoCUQAUkRJaSEokkV6Y%2F%2BJUOC4hn6A39NVXVBYeNP8piH6HeA4fPbpdBQV5KOx0QaL1YppX3Jgk0TwH2Vg6S3u%2BdB91%2B%2FpuNYPYFl5uP5V7ZqvsrX7jxqMXR6ff3gCQSTzFI0a1TX3wIs8ul%2Bq4HuWAAiM39vhOuR1O1fQ2gT%2F26Z8Z5vrl2OHi9OXZn995nLV9aFfS6UC9JeJPfuK0NBohWpCHMSAAsFe74WWP%2BvT25wtP9Bpob6uGqqyDnOtaeumjRu%2ByFu36VntK%2FPA5umTJeUtPWZSU9BCgud661odVp3DZtkc7AnYR33RRC708PrVi1larW7XwZIjLnd7R6SgSqWSNjU1B3F72pz5TZbXmX5vV81Yb7Lg7XT%2FUXriu8XLVqw6c6XqWnBKiiYU%2BMt3wWF7u7i91XlSEITwSAZ%2FCzAAHsJVbwXYFFEAAAAASUVORK5CYII%3D)](https://www.gnu.org/software/bash/) +[![LinuxGSM](https://img.shields.io/badge/-LinuxGSM-2b2b2b.svg?logo=data%3Aimage%2Fpng%3Bbase64%2CiVBORw0KGgoAAAANSUhEUgAAACsAAABACAYAAACDbo5ZAAAGD0lEQVR4AcWYa2wUVRvHz75c2vJ2disXoUBEVIioRAx%2BMIFA1IRwUS6KCCiIKBrvhEYiiGm5iBgk8QOGEgUUDYTttmVZWFr2UmwURS6iYAoCtmisElSsdHdbkT7%2BTzoNy%2BGc2dm54C%2F5Rdkz85x%2FZ86ZOXOYXYhIg3Phx%2FA4PAcv6f%2Btg5vhHJjP3EcZsgsshufJHH%2FAJbDztQ7aG35J1vgCXn%2BtgvrgEbLHYei9FmE3kDOUuh10OGwjZ7gEh7kZ9gNyllK3gnrg7%2BQs56DHjbCDyB0GuRF2ArnDeDfCziF3mO1G2FfJHRa4EXYpuUOxG2GXkzuUuBH2TXKH5W6ELSV3eM%2BNsOUk5yQcAY8p2uvgSPitor3MjbB1UOQXOFBvHwpbhPYWOExvL4SNUOQ7p4P2JTlzhOPmCu0vCu1PQpE2WOhk2MdJjk9y7HNwP1wEPUJbAcmZ6WTYrYolnifbxZBiibnFySHQCkUaLdY7C0V4%2FT5OhF1JcuIW6%2B0lOcvsBi2Ezao3j8Ov7Quwj52w60jNKIs1R5GatVaDDoEXSU4D7GSxbidYT3IuwjusFK0mNUVMwaZNNbl%2B%2F87hoVCom0HthaQmnG3QB0lNPcxlCvz%2B0GtlZTuorCxYYlA%2FDzbY%2FnrAgV3hCVLzCDMgEAi9wMMi9IIM%2FUwnNXWwi5mwRaSmmmXA798xq%2F3Khp420VeE1LyS6eQeBhttSXgzywCCToIUCOyYZvKLOWWwkdfd6ORVpGYJM0F5efDe9mEQHGty2BWTmhVGO4PNBmOoKzMBxmo%2FhD25dWvljSbD5hjMkb9gT9lJq63Mzi1bKkbjloc7xBWtwiRrDASCVRi%2FRxA8if%2BvrawMTzYI%2FACpeUv2KFFtDcUyTKilCHcis8G1Ga7wHpLzG8wVFs1K7jaeUKHZfIxmkj9%2FM4S9x9RGiMEudo0QbCVu9Xqn5PWEwLUk5%2FP0iaXac53I0kAH9Sau4m54lo%2FdTMfyekLYKQZ7ub34AbMMlmw5irC2VYTN0fuVMYMf8JHxJ7L7YYXAlSRnI2%2F8RtH4siTsDMz%2BZ5yS15OEXUxyDjGD1%2BvEq8MG16CDzY6JepKwT6geYbzxb0XjGMl7vwGSgzZIwo4nOa1M8Yr9Afb%2Fj8L21%2FsXaeaNZ2A6KTiEASph%2F0vF80cn4tokqu79fzfCUk2vfF4%2FFdFGEjGPHvg2yWrsDG%2F4%2BqpZB8jPOiXjWk0y5iXdM3XhKUvxBTA9UvHuvNPh%2Bzb%2BWj10z6nwuHWBbQFMvNCjKnn7qd1jS%2Fnx9VX3b6jC%2BbwOr5eMe3%2B83IcW4%2F3qgT%2BUTbA9srGaiHsn8AKiF6Ld%2FxF%2FOx6eeAJXabvK78MTTornNMd6XJTVR7%2Fj9bBjhFxV%2FMc1kJOAy2AeA%2FgrV4mFVDZFCqm8rEJ6qysCAWqK9iaztRJRbWXa4moFTELOav7jY%2FqAvoXp0Gc9NX7bIZl17%2FZl0rC1wRLeno0NvP%2B0CTcYNnS8wW6CtzNANaxzKqo9hRNOQ8rGo7tmSsMe2zWdt2frqVRcm5s2fofCgawDNHRNxnyfqgsYez4y4ADCjRM9H73hsNWafILTQdaFiSTj%2BQ%2FxA6yH7d%2BCmR8XbYr0a7VTF2N4siSsb5qdos3R6%2FjGxpULFfw7EfORnbrI9TAToX0sD40%2F2ylcGdh2Rdhg%2BSf2gka9jRTqK9%2BGwgHz7RTfVbHxirDhivdthYUvMRX8aYAD9lstvi%2B0aDL2DUZ0eCBUNNVG0IP65FLTWqPdiqdC0koHTVXe7iyNRG23QotBEy1RbTAzQyrmnYUT2rLsoA13JpcB4eVC2daBM1g2JGLekmwf5On7EJfngfZTNnVSce8bFjaTmQdvs%2FXmO%2FJVpoXdx3RSUe9O00Fj3nUdy0RLgRHiHXOPGW1h2uKZ07c9rG%2Bxyefp23pQeyBIEQoavYlakrG8fnrY5yHn2fbxXzAgw7m8bT5zkkSk4C7cpmOK21esB%2FXAQ5DzFfTo43%2BF%2FDzf0eZ4wZ3MDSjMcvD6nIeOahGgia%2FyU3HforTPkWkwnakdn0cI9jqfbPjD%2FuQLJr6644snlgX%2FApOMoyd1R5%2FxAAAAAElFTkSuQmCC)](https://linuxgsm.com) [![Build Status](https://travis-ci.com/GameServerManagers/LinuxGSM.svg?branch=master)](https://travis-ci.com/GameServerManagers/LinuxGSM) [![Codacy Badge](https://app.codacy.com/project/badge/Grade/d19c5234dc3743d8a8a14093711ca52d)](https://www.codacy.com/gh/GameServerManagers/LinuxGSM/dashboard?utm_source=github.com&utm_medium=referral&utm_content=GameServerManagers/LinuxGSM&utm_campaign=Badge_Grade) [![Backup Repo](https://github.com/GameServerManagers/LinuxGSM/workflows/Backup%20Repo/badge.svg)](https://bitbucket.org/GameServerManagers/linuxgsm) [![Discord](https://discordapp.com/api/guilds/127498813903601664/widget.png?style=shield)](https://linuxgsm.com/discord) [![MIT Licence](https://badges.frapsoft.com/os/mit/mit.svg?v=103)](https://github.com/GameServerManagers/LinuxGSM/blob/master/LICENSE) [![made-with-bash](https://img.shields.io/badge/-Made%20with%20Bash-1f425f.svg?logo=image%2Fpng%3Bbase64%2CiVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyZpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw%2FeHBhY2tldCBiZWdpbj0i77u%2FIiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8%2BIDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNi1jMTExIDc5LjE1ODMyNSwgMjAxNS8wOS8xMC0wMToxMDoyMCAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENDIDIwMTUgKFdpbmRvd3MpIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOkE3MDg2QTAyQUZCMzExRTVBMkQxRDMzMkJDMUQ4RDk3IiB4bXBNTTpEb2N1bWVudElEPSJ4bXAuZGlkOkE3MDg2QTAzQUZCMzExRTVBMkQxRDMzMkJDMUQ4RDk3Ij4gPHhtcE1NOkRlcml2ZWRGcm9tIHN0UmVmOmluc3RhbmNlSUQ9InhtcC5paWQ6QTcwODZBMDBBRkIzMTFFNUEyRDFEMzMyQkMxRDhEOTciIHN0UmVmOmRvY3VtZW50SUQ9InhtcC5kaWQ6QTcwODZBMDFBRkIzMTFFNUEyRDFEMzMyQkMxRDhEOTciLz4gPC9yZGY6RGVzY3JpcHRpb24%2BIDwvcmRmOlJERj4gPC94OnhtcG1ldGE%2BIDw%2FeHBhY2tldCBlbmQ9InIiPz6lm45hAAADkklEQVR42qyVa0yTVxzGn7d9Wy03MS2ii8s%2BeokYNQSVhCzOjXZOFNF4jx%2BMRmPUMEUEqVG36jo2thizLSQSMd4N8ZoQ8RKjJtooaCpK6ZoCtRXKpRempbTv5ey83bhkAUphz8fznvP8znn%2B%2F3NeEEJgNBoRRSmz0ub%2FfuxEacBg%2FDmYtiCjgo5NG2mBXq%2BH5I1ogMRk9Zbd%2BQU2e1ML6VPLOyf5tvBQ8yT1lG10imxsABm7SLs898GTpyYynEzP60hO3trHDKvMigUwdeaceacqzp7nOI4n0SSIIjl36ao4Z356OV07fSQAk6xJ3XGg%2BLCr1d1OYlVHp4eUHPnerU79ZA%2F1kuv1JQMAg%2BE4O2P23EumF3VkvHprsZKMzKwbRUXFEyTvSIEmTVbrysp%2BWr8wfQHGK6WChVa3bKUmdWou%2BjpArdGkzZ41c1zG%2Fu5uGH4swzd561F%2BuhIT4%2BLnSuPsv9%2BJKIpjNr9dXYOyk7%2FBZrcjIT4eCnoKgedJP4BEqhG77E3NKP31FO7cfQA5K0dSYuLgz2TwCWJSOBzG6crzKK%2BohNfni%2Bx6OMUMMNe%2Fgf7ocbw0v0acKg6J8Ql0q%2BT%2FAXR5PNi5dz9c71upuQqCKFAD%2BYhrZLEAmpodaHO3Qy6TI3NhBpbrshGtOWKOSMYwYGQM8nJzoFJNxP2HjyIQho4PewK6hBktoDcUwtIln4PjOWzflQ%2Be5yl0yCCYgYikTclGlxadio%2BBQCSiW1UXoVGrKYwH4RgMrjU1HAB4vR6LzWYfFUCKxfS8Ftk5qxHoCUQAUkRJaSEokkV6Y%2F%2BJUOC4hn6A39NVXVBYeNP8piH6HeA4fPbpdBQV5KOx0QaL1YppX3Jgk0TwH2Vg6S3u%2BdB91%2B%2FpuNYPYFl5uP5V7ZqvsrX7jxqMXR6ff3gCQSTzFI0a1TX3wIs8ul%2Bq4HuWAAiM39vhOuR1O1fQ2gT%2F26Z8Z5vrl2OHi9OXZn995nLV9aFfS6UC9JeJPfuK0NBohWpCHMSAAsFe74WWP%2BvT25wtP9Bpob6uGqqyDnOtaeumjRu%2ByFu36VntK%2FPA5umTJeUtPWZSU9BCgud661odVp3DZtkc7AnYR33RRC708PrVi1larW7XwZIjLnd7R6SgSqWSNjU1B3F72pz5TZbXmX5vV81Yb7Lg7XT%2FUXriu8XLVqw6c6XqWnBKiiYU%2BMt3wWF7u7i91XlSEITwSAZ%2FCzAAHsJVbwXYFFEAAAAASUVORK5CYII%3D)](https://www.gnu.org/software/bash/) [LinuxGSM](https://linuxgsm.com) is the command-line tool for quick, simple deployment and management of Linux dedicated game servers. diff --git a/lgsm/functions/core_dl.sh b/lgsm/functions/core_dl.sh index b8e1b2b86..b5c92b3c1 100755 --- a/lgsm/functions/core_dl.sh +++ b/lgsm/functions/core_dl.sh @@ -349,11 +349,12 @@ fn_fetch_file(){ fn_fetch_file_github(){ github_file_url_dir="${1}" github_file_url_name="${2}" + # For legacy versions - code can be removed at a future date if [ "${legacymode}" == "1" ]; then - # For legacy versions - code can be removed at a future date remote_fileurl="https://raw.githubusercontent.com/${githubuser}/${githubrepo}/${githubbranch}/${github_file_url_dir}/${github_file_url_name}" remote_fileurl_backup="https://bitbucket.org/${githubuser}/${githubrepo}/raw/${githubbranch}/${github_file_url_dir}/${github_file_url_name}" - elif [ "${githubbranch}" == "master" ]&&[ "${commandname}" != "UPDATE-LGSM" ]; then + # If master branch will currently running LinuxGSM version to prevent "version mixing". This is ignored if a fork. + elif [ "${githubbranch}" == "master" ]&&[ "${githubuser}" == "GameServerManager" ]&&[ "${commandname}" != "UPDATE-LGSM" ]; then remote_fileurl="https://raw.githubusercontent.com/${githubuser}/${githubrepo}/${version}/${github_file_url_dir}/${github_file_url_name}" remote_fileurl_backup="https://bitbucket.org/${githubuser}/${githubrepo}/raw/${version}/${github_file_url_dir}/${github_file_url_name}" else @@ -376,7 +377,8 @@ fn_fetch_file_github(){ fn_fetch_config(){ github_file_url_dir="${1}" github_file_url_name="${2}" - if [ "${githubbranch}" == "master" ]&&[ "${commandname}" != "UPDATE-LGSM" ]; then + # If master branch will currently running LinuxGSM version to prevent "version mixing". This is ignored if a fork. + if [ "${githubbranch}" == "master" ]&&[ "${githubuser}" == "GameServerManager" ]&&[ "${commandname}" != "UPDATE-LGSM" ]; then remote_fileurl="https://raw.githubusercontent.com/${githubuser}/${githubrepo}/${version}/${github_file_url_dir}/${github_file_url_name}" remote_fileurl_backup="https://bitbucket.org/${githubuser}/${githubrepo}/raw/${version}/${github_file_url_dir}/${github_file_url_name}" else @@ -399,7 +401,8 @@ fn_fetch_config(){ fn_fetch_function(){ github_file_url_dir="lgsm/functions" github_file_url_name="${functionfile}" - if [ "${githubbranch}" == "master" ]&&[ "${commandname}" != "UPDATE-LGSM" ]; then + # If master branch will currently running LinuxGSM version to prevent "version mixing". This is ignored if a fork. + if [ "${githubbranch}" == "master" ]&&[ "${githubuser}" == "GameServerManager" ]&&[ "${commandname}" != "UPDATE-LGSM" ]; then remote_fileurl="https://raw.githubusercontent.com/${githubuser}/${githubrepo}/${version}/${github_file_url_dir}/${github_file_url_name}" remote_fileurl_backup="https://bitbucket.org/${githubuser}/${githubrepo}/raw/${version}/${github_file_url_dir}/${github_file_url_name}" else @@ -422,7 +425,8 @@ fn_fetch_function(){ fn_update_function(){ github_file_url_dir="lgsm/functions" github_file_url_name="${functionfile}" - if [ "${githubbranch}" == "master" ]&&[ "${commandname}" != "UPDATE-LGSM" ]; then + # If master branch will currently running LinuxGSM version to prevent "version mixing". This is ignored if a fork. + if [ "${githubbranch}" == "master" ]&&[ "${githubuser}" == "GameServerManager" ]&&[ "${commandname}" != "UPDATE-LGSM" ]; then remote_fileurl="https://raw.githubusercontent.com/${githubuser}/${githubrepo}/${version}/${github_file_url_dir}/${github_file_url_name}" remote_fileurl_backup="https://bitbucket.org/${githubuser}/${githubrepo}/raw/${version}/${github_file_url_dir}/${github_file_url_name}" else diff --git a/linuxgsm.sh b/linuxgsm.sh index 67f24da3f..70a280a32 100755 --- a/linuxgsm.sh +++ b/linuxgsm.sh @@ -160,7 +160,8 @@ fn_bootstrap_fetch_file(){ fn_bootstrap_fetch_file_github(){ github_file_url_dir="${1}" github_file_url_name="${2}" - if [ "${githubbranch}" == "master" ]&&[ "${commandname}" != "UPDATE-LGSM" ]; then + # If master branch will currently running LinuxGSM version to prevent "version mixing". This is ignored if a fork. + if [ "${githubbranch}" == "master" ]&&[ "${githubuser}" == "GameServerManager" ]&&[ "${commandname}" != "UPDATE-LGSM" ]; then remote_fileurl="https://raw.githubusercontent.com/${githubuser}/${githubrepo}/${version}/${github_file_url_dir}/${github_file_url_name}" remote_fileurl_backup="https://bitbucket.org/${githubuser}/${githubrepo}/raw/${version}/${github_file_url_dir}/${github_file_url_name}" else diff --git a/tests/tests_fctrserver.sh b/tests/tests_fctrserver.sh index 8856a63b9..afb2f8ded 100644 --- a/tests/tests_fctrserver.sh +++ b/tests/tests_fctrserver.sh @@ -167,7 +167,8 @@ fn_bootstrap_fetch_file(){ fn_bootstrap_fetch_file_github(){ github_file_url_dir="${1}" github_file_url_name="${2}" - if [ "${githubbranch}" == "master" ]&&[ "${commandname}" != "UPDATE-LGSM" ]; then + # If master branch will currently running LinuxGSM version to prevent "version mixing". This is ignored if a fork. + if [ "${githubbranch}" == "master" ]&&[ "${githubuser}" == "GameServerManager" ]&&[ "${commandname}" != "UPDATE-LGSM" ]; then remote_fileurl="https://raw.githubusercontent.com/${githubuser}/${githubrepo}/${version}/${github_file_url_dir}/${github_file_url_name}" remote_fileurl_backup="https://bitbucket.org/${githubuser}/${githubrepo}/raw/${version}/${github_file_url_dir}/${github_file_url_name}" else diff --git a/tests/tests_jc2server.sh b/tests/tests_jc2server.sh index dca188aef..34cea40e4 100644 --- a/tests/tests_jc2server.sh +++ b/tests/tests_jc2server.sh @@ -168,7 +168,8 @@ fn_bootstrap_fetch_file(){ fn_bootstrap_fetch_file_github(){ github_file_url_dir="${1}" github_file_url_name="${2}" - if [ "${githubbranch}" == "master" ]&&[ "${commandname}" != "UPDATE-LGSM" ]; then + # If master branch will currently running LinuxGSM version to prevent "version mixing". This is ignored if a fork. + if [ "${githubbranch}" == "master" ]&&[ "${githubuser}" == "GameServerManager" ]&&[ "${commandname}" != "UPDATE-LGSM" ]; then remote_fileurl="https://raw.githubusercontent.com/${githubuser}/${githubrepo}/${version}/${github_file_url_dir}/${github_file_url_name}" remote_fileurl_backup="https://bitbucket.org/${githubuser}/${githubrepo}/raw/${version}/${github_file_url_dir}/${github_file_url_name}" else diff --git a/tests/tests_mcserver.sh b/tests/tests_mcserver.sh index 71b45f34a..f253df31a 100644 --- a/tests/tests_mcserver.sh +++ b/tests/tests_mcserver.sh @@ -168,7 +168,8 @@ fn_bootstrap_fetch_file(){ fn_bootstrap_fetch_file_github(){ github_file_url_dir="${1}" github_file_url_name="${2}" - if [ "${githubbranch}" == "master" ]&&[ "${commandname}" != "UPDATE-LGSM" ]; then + # If master branch will currently running LinuxGSM version to prevent "version mixing". This is ignored if a fork. + if [ "${githubbranch}" == "master" ]&&[ "${githubuser}" == "GameServerManager" ]&&[ "${commandname}" != "UPDATE-LGSM" ]; then remote_fileurl="https://raw.githubusercontent.com/${githubuser}/${githubrepo}/${version}/${github_file_url_dir}/${github_file_url_name}" remote_fileurl_backup="https://bitbucket.org/${githubuser}/${githubrepo}/raw/${version}/${github_file_url_dir}/${github_file_url_name}" else diff --git a/tests/tests_ts3server.sh b/tests/tests_ts3server.sh index c9756c331..cf5d5ebd1 100644 --- a/tests/tests_ts3server.sh +++ b/tests/tests_ts3server.sh @@ -168,7 +168,8 @@ fn_bootstrap_fetch_file(){ fn_bootstrap_fetch_file_github(){ github_file_url_dir="${1}" github_file_url_name="${2}" - if [ "${githubbranch}" == "master" ]&&[ "${commandname}" != "UPDATE-LGSM" ]; then + # If master branch will currently running LinuxGSM version to prevent "version mixing". This is ignored if a fork. + if [ "${githubbranch}" == "master" ]&&[ "${githubuser}" == "GameServerManager" ]&&[ "${commandname}" != "UPDATE-LGSM" ]; then remote_fileurl="https://raw.githubusercontent.com/${githubuser}/${githubrepo}/${version}/${github_file_url_dir}/${github_file_url_name}" remote_fileurl_backup="https://bitbucket.org/${githubuser}/${githubrepo}/raw/${version}/${github_file_url_dir}/${github_file_url_name}" else From 990edfd775ec0b3dcd091b3017d94cdb2b88ce6b Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Sun, 11 Oct 2020 00:48:11 +0100 Subject: [PATCH 484/534] feat: improve uniqueness tmux session name (#3081) * Fixed uniqueness constraint on session names by adding port to tmux sesssions. Removed content constraint from session name by avoiding grep regex Co-authored-by: jason <1569551+j4s0n@users.noreply.github.com> --- lgsm/functions/check_status.sh | 6 +++++- lgsm/functions/command_console.sh | 2 +- lgsm/functions/command_start.sh | 6 +++--- lgsm/functions/command_stop.sh | 2 +- lgsm/functions/info_distro.sh | 2 +- 5 files changed, 11 insertions(+), 7 deletions(-) diff --git a/lgsm/functions/check_status.sh b/lgsm/functions/check_status.sh index 178adcf6b..1abd2990b 100755 --- a/lgsm/functions/check_status.sh +++ b/lgsm/functions/check_status.sh @@ -7,4 +7,8 @@ functionselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" -status=$(tmux list-sessions -F "#{session_name}" 2>/dev/null | grep -Ecx "^${sessionname}") +if [ "$(tmux list-sessions -F "#{session_name}" 2>/dev/null)" == "${sessionname}${port}" ]; then + status=1; +else + status=0; +fi diff --git a/lgsm/functions/command_console.sh b/lgsm/functions/command_console.sh index 0de924ea6..36ca7e092 100755 --- a/lgsm/functions/command_console.sh +++ b/lgsm/functions/command_console.sh @@ -41,7 +41,7 @@ check_status.sh if [ "${status}" != "0" ]; then fn_print_ok_nl "Accessing console" fn_script_log_pass "Console accessed" - tmux attach-session -t "${sessionname}" + tmux attach-session -t "${sessionname}${port}" fn_print_ok_nl "Closing console" fn_script_log_pass "Console closed" else diff --git a/lgsm/functions/command_start.sh b/lgsm/functions/command_start.sh index 62160e187..3ebbc8871 100755 --- a/lgsm/functions/command_start.sh +++ b/lgsm/functions/command_start.sh @@ -36,7 +36,7 @@ fn_start_teamspeak3(){ # Used to allow update to detect JK2MV server version. fn_start_jk2(){ fn_start_tmux - tmux send -t "${sessionname}" version ENTER > /dev/null 2>&1 + tmux send -t "${sessionname}${port}" version ENTER > /dev/null 2>&1 } fn_start_tmux(){ @@ -72,7 +72,7 @@ fn_start_tmux(){ # Create lockfile date '+%s' > "${lockdir}/${selfname}.lock" cd "${executabledir}" || exit - tmux new-session -d -x "${sessionwidth}" -y "${sessionheight}" -s "${sessionname}" "${executable} ${parms}" 2> "${lgsmlogdir}/.${selfname}-tmux-error.tmp" + tmux new-session -d -x "${sessionwidth}" -y "${sessionheight}" -s "${sessionname}${port}" "${executable} ${parms}" 2> "${lgsmlogdir}/.${selfname}-tmux-error.tmp" # Create logfile. touch "${consolelog}" @@ -130,7 +130,7 @@ fn_start_tmux(){ echo -e "" echo -e "Command" echo -e "=================================" - echo -e "tmux new-session -d -s \"${sessionname}\" \"${executable} ${parms}\"" | tee -a "${lgsmlog}" + echo -e "tmux new-session -d -s \"${sessionname} ${port}\" \"${executable} ${parms}\"" | tee -a "${lgsmlog}" echo -e "" echo -e "Error" echo -e "=================================" diff --git a/lgsm/functions/command_stop.sh b/lgsm/functions/command_stop.sh index 439967fd0..bde89dd13 100644 --- a/lgsm/functions/command_stop.sh +++ b/lgsm/functions/command_stop.sh @@ -15,7 +15,7 @@ fn_stop_graceful_ctrlc(){ fn_print_dots "Graceful: CTRL+c" fn_script_log_info "Graceful: CTRL+c" # Sends quit. - tmux send-keys -t "${sessionname}" C-c > /dev/null 2>&1 + tmux send-keys -t "${sessionname}${port}" C-c > /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 diff --git a/lgsm/functions/info_distro.sh b/lgsm/functions/info_distro.sh index 8962426af..725748311 100755 --- a/lgsm/functions/info_distro.sh +++ b/lgsm/functions/info_distro.sh @@ -9,7 +9,7 @@ functionselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" ### Game Server pid if [ "${status}" == "1" ]; then - gameserverpid=$(tmux list-sessions -F "#{session_name} #{pane_pid}" | grep "^${sessionname} " | awk '{print $NF}') + gameserverpid=$(tmux list-sessions -F "#{session_name} #{pane_pid}" | grep "^${sessionname}${port}" | awk '{print $NF}') fi ### Distro information From 5d7ff92d9b48971d9b38e7919f4303714be63f72 Mon Sep 17 00:00:00 2001 From: Christian Date: Sun, 11 Oct 2020 14:32:48 +0200 Subject: [PATCH 485/534] fix(details): Barotrauma will show as needing to be edited in game config (#3085) --- lgsm/functions/info_messages.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lgsm/functions/info_messages.sh b/lgsm/functions/info_messages.sh index 4e1863f3e..6eb97f241 100755 --- a/lgsm/functions/info_messages.sh +++ b/lgsm/functions/info_messages.sh @@ -572,7 +572,7 @@ fn_info_message_ports(){ parmslocation="${red}UNKNOWN${default}" # engines/games that require editing in the config file. - local ports_edit_array=( "avalanche2.0" "avalanche3.0" "Ballistic Overkill" "dontstarve" "Eco" "idtech2" "idtech3" "idtech3_ql" "lwjgl2" "Minecraft Bedrock" "Project Cars" "projectzomboid" "quake" "refractor" "realvirtuality" "renderware" "Stationeers" "teeworlds" "terraria" "unreal" "unreal2" "unreal3" "TeamSpeak 3" "Mumble" "7 Days To Die" "wurm") + local ports_edit_array=( "avalanche2.0" "avalanche3.0" "Ballistic Overkill" "Barotrauma" "dontstarve" "Eco" "idtech2" "idtech3" "idtech3_ql" "lwjgl2" "Minecraft Bedrock" "Project Cars" "projectzomboid" "quake" "refractor" "realvirtuality" "renderware" "Stationeers" "teeworlds" "terraria" "unreal" "unreal2" "unreal3" "TeamSpeak 3" "Mumble" "7 Days To Die" "wurm") for port_edit in "${ports_edit_array[@]}"; do if [ "${shortname}" == "ut3" ]; then parmslocation="${servercfgdir}/UTWeb.ini" From 27fe4a65290a8838667b3b8044c307ce14c2637a Mon Sep 17 00:00:00 2001 From: H3o66 Date: Sun, 11 Oct 2020 11:38:38 +0200 Subject: [PATCH 486/534] fix(btserver): add dependency check for libicu --- lgsm/functions/check_deps.sh | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/lgsm/functions/check_deps.sh b/lgsm/functions/check_deps.sh index 60fc30c72..d8e73ec89 100755 --- a/lgsm/functions/check_deps.sh +++ b/lgsm/functions/check_deps.sh @@ -395,6 +395,9 @@ fn_deps_build_debian(){ # Call of Duty & Medal of Honor: Allied Assault elif [ "${shortname}" == "cod" ]||[ "${shortname}" == "coduo" ]||[ "${shortname}" == "cod2" ]||[ "${shortname}" == "mohaa" ]; then array_deps_required+=( libstdc++5:i386 ) + # Barotrauma + elif [ "${shortname}" == "bt" ]; then + array_deps_required+=( libicu-dev ) # Ecoserver elif [ "${shortname}" == "eco" ]; then array_deps_required+=( libgdiplus ) @@ -489,6 +492,9 @@ fn_deps_build_redhat(){ # 7 Days to Die elif [ "${shortname}" == "sdtd" ]; then array_deps_required+=( telnet expect ) + # Barotrauma + elif [ "${shortname}" == "bt" ]; then + array_deps_required+=( libicu ) # Battlefield: Vietnam elif [ "${shortname}" == "bfv" ]; then array_deps_required+=( compat-libstdc++-33.i686 glibc.i686 ) From e8a71183b8c1931606c8b15522c14d61d3773b29 Mon Sep 17 00:00:00 2001 From: Christian Date: Fri, 13 Nov 2020 22:47:48 +0100 Subject: [PATCH 487/534] fix(bf1942): add missing dependency to checks for libncurses5:i386 (#3098) --- lgsm/functions/check_deps.sh | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/lgsm/functions/check_deps.sh b/lgsm/functions/check_deps.sh index d8e73ec89..25c767ae0 100755 --- a/lgsm/functions/check_deps.sh +++ b/lgsm/functions/check_deps.sh @@ -382,8 +382,11 @@ fn_deps_build_debian(){ # Battlefield: Vietnam elif [ "${shortname}" == "bfv" ]; then array_deps_required+=( libncurses5:i386 libstdc++5:i386 ) - # Battlefield 1942, Counter-Strike: Source, Garry's Mod, No More Room in Hell, Source Forts Classic, Zombie Master Reborn and Zombie Panic: Source - elif [ "${shortname}" == "bf1942" ]||[ "${shortname}" == "css" ]||[ "${shortname}" == "gmod" ]||[ "${shortname}" == "nmrih" ]||[ "${shortname}" == "sfc" ]||[ "${shortname}" == "zmr" ]||[ "${shortname}" == "zps" ]; then + # Battlefield 1942 + elif [ "${shortname}" == "bf1942" ]; then + array_deps_required+=( libncurses5:i386 libtinfo5:i386 ) + # Counter-Strike: Source, Garry's Mod, No More Room in Hell, Source Forts Classic, Zombie Master Reborn and Zombie Panic: Source + elif [ "${shortname}" == "css" ]||[ "${shortname}" == "gmod" ]||[ "${shortname}" == "nmrih" ]||[ "${shortname}" == "sfc" ]||[ "${shortname}" == "zmr" ]||[ "${shortname}" == "zps" ]; then if [ "${arch}" == "x86_64" ]; then array_deps_required+=( libtinfo5:i386 ) else From bb78ee3655e29a04056bfa87145436c89394f2f8 Mon Sep 17 00:00:00 2001 From: Christian Date: Fri, 13 Nov 2020 22:47:58 +0100 Subject: [PATCH 488/534] fix(bf1942): servername parsing (#3096) --- 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 d54fdba96..ec0d2eb4a 100755 --- a/lgsm/functions/info_config.sh +++ b/lgsm/functions/info_config.sh @@ -188,7 +188,7 @@ fn_info_config_bf1942(){ queryport="${zero}" else - servername=$(grep "game.serverName" "${servercfgfullpath}" | sed -e 's/^[ \t]*//g' -e '/^--/d' -e 's/game.serverName //g' | tr -d '=\";,:' | xargs) + servername=$(grep -E "^game.serverName " "${servercfgfullpath}" | sed -e 's/^[ \t]*//g' -e '/^--/d' -e 's/game.serverName //g' | tr -d '=\";,:' | xargs) serverpassword=$(grep "game.serverPassword" "${servercfgfullpath}" | sed -e 's/^ *//g' -e '/^--/d' -e 's/game.serverPassword//g' | tr -d '=\";,:' | xargs) maxplayers=$(grep "game.serverMaxPlayers" "${servercfgfullpath}" | grep -v "\--" | tr -cd '[:digit:]') port=$(grep "game.serverPort" "${servercfgfullpath}" | grep -v "\--" | tr -cd '[:digit:]') From 5add746d00503e15eb9cc5aa5bcaf5e3ad4ff611 Mon Sep 17 00:00:00 2001 From: Christian Date: Sat, 14 Nov 2020 22:12:01 +0100 Subject: [PATCH 489/534] fix(deps): change ubuntu 20.10 to use lib32gcc-s1 (#3094) --- 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 25c767ae0..7a43e2f3a 100755 --- a/lgsm/functions/check_deps.sh +++ b/lgsm/functions/check_deps.sh @@ -185,7 +185,7 @@ if [ "${javacheck}" == "1" ]; then # Define required dependencies for SteamCMD. if [ "${appid}" ]; then # lib32gcc1 is now called lib32gcc-s1 in debian 11 - if [ "${distroid}" == "debian" ]&&[ "${distroversion}" == "11" ]; then + if { [ "${distroid}" == "debian" ]&&[ "${distroversion}" == "11" ]; }||{ [ "${distroid}" == "ubuntu" ]&&[ "${distroversion}" == "20.10" ]; }; then if [ "${deptocheck}" == "glibc.i686" ]||[ "${deptocheck}" == "libstdc++64.i686" ]||[ "${deptocheck}" == "lib32gcc-s1" ]||[ "${deptocheck}" == "lib32stdc++6" ]; then steamcmdfail=1 fi @@ -349,7 +349,7 @@ fn_deps_build_debian(){ if [ "${shortname}" != "ts3" ]&&[ "${shortname}" != "mumble" ]&&[ "${shortname}" != "mc" ]&&[ "${engine}" != "renderware" ]; then if [ "${arch}" == "x86_64" ]; then # lib32gcc1 is now called lib32gcc-s1 in debian 11 - if [ "${distroid}" == "debian" ]&&[ "${distroversion}" == "11" ]; then + if { [ "${distroid}" == "debian" ]&&[ "${distroversion}" == "11" ]; }|| { [ "${distroid}" == "ubuntu" ]&&[ "${distroversion}" == "20.10" ]; }; then array_deps_required+=( lib32gcc-s1 lib32stdc++6 ) else array_deps_required+=( lib32gcc1 lib32stdc++6 ) From a62d9236a3561cc2ac7a25af5cbd5c838ad9384a Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Sat, 14 Nov 2020 21:25:42 +0000 Subject: [PATCH 490/534] code tidy --- lgsm/functions/check_status.sh | 4 ++-- lgsm/functions/fix_squad.sh | 2 +- lgsm/functions/query_gamedig.sh | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/lgsm/functions/check_status.sh b/lgsm/functions/check_status.sh index 1abd2990b..a473aff73 100755 --- a/lgsm/functions/check_status.sh +++ b/lgsm/functions/check_status.sh @@ -8,7 +8,7 @@ functionselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" if [ "$(tmux list-sessions -F "#{session_name}" 2>/dev/null)" == "${sessionname}${port}" ]; then - status=1; + status=1; else - status=0; + status=0; fi diff --git a/lgsm/functions/fix_squad.sh b/lgsm/functions/fix_squad.sh index 28d0e30f0..8ec84a86f 100644 --- a/lgsm/functions/fix_squad.sh +++ b/lgsm/functions/fix_squad.sh @@ -6,7 +6,7 @@ # As the server base dir changed for the game, we need to migrate the default config from the old to the new location oldservercfg="${serverfiles}/Squad/ServerConfig/${servercfg}" -if [ -f "${oldservercfg}" ] && [ -f "${servercfgfullpath}" ]; then +if [ -f "${oldservercfg}" ]&&[ -f "${servercfgfullpath}" ]; then # diff old and new config - if it is different move the old config over the new one if [ "$(diff -c "${oldservercfg}" "${servercfgfullpath}" | wc -l)" -gt 0 ]; then fixname="Migrate server config to new Game folder" diff --git a/lgsm/functions/query_gamedig.sh b/lgsm/functions/query_gamedig.sh index 3c5ff38bf..2443c6e99 100755 --- a/lgsm/functions/query_gamedig.sh +++ b/lgsm/functions/query_gamedig.sh @@ -38,7 +38,7 @@ if [ "$(command -v gamedig 2>/dev/null)" ]&&[ "$(command -v jq 2>/dev/null)" ]; fi if [ "${gdplayers}" == "null" ]; then unset gdplayers - elif [ "${gdplayers}" == "[]" ] || [ "${gdplayers}" == "-1" ]; then + elif [ "${gdplayers}" == "[]" ]||[ "${gdplayers}" == "-1" ]; then gdplayers=0 fi From afe2b70cae47bd1c4f37ad4380a4ef07954601c1 Mon Sep 17 00:00:00 2001 From: Christian Date: Wed, 18 Nov 2020 23:46:43 +0100 Subject: [PATCH 491/534] feat(new server): pvrserver (#2384) --- .../config-lgsm/pvrserver/_default.cfg | 173 ++++++++++++++++++ lgsm/data/serverlist.csv | 1 + lgsm/functions/check_system_requirements.sh | 3 + lgsm/functions/fix_steamcmd.sh | 2 + lgsm/functions/info_config.sh | 16 ++ lgsm/functions/info_messages.sh | 12 ++ lgsm/functions/info_parms.sh | 7 + lgsm/functions/install_config.sh | 7 + 8 files changed, 221 insertions(+) create mode 100644 lgsm/config-default/config-lgsm/pvrserver/_default.cfg diff --git a/lgsm/config-default/config-lgsm/pvrserver/_default.cfg b/lgsm/config-default/config-lgsm/pvrserver/_default.cfg new file mode 100644 index 000000000..f51bd9ea4 --- /dev/null +++ b/lgsm/config-default/config-lgsm/pvrserver/_default.cfg @@ -0,0 +1,173 @@ +################################## +######## 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://docs.linuxgsm.com/configuration/start-parameters +ip="0.0.0.0" +port="7777" + +# Maps: bridge, datacenter, sand +defaultmap="datacenter" + +## Server Start Command | https://docs.linuxgsm.com/configuration/start-parameters#additional-parameters +fn_parms(){ +parms="${defaultmap} -log -MultiHome=${ip} -Port=${port}" +} + +#### LinuxGSM Settings #### + +## Notification Alerts +# (on|off) + +# Display IP | https://docs.linuxgsm.com/alerts#display-ip +displayip="" + +# More info | https://docs.linuxgsm.com/alerts#more-info +postalert="off" +postdays="7" +posttarget="https://hastebin.com" + +# Discord Alerts | https://docs.linuxgsm.com/alerts/discord +discordalert="off" +discordwebhook="webhook" + +# Email Alerts | https://docs.linuxgsm.com/alerts/email +emailalert="off" +email="email@example.com" +emailfrom="" + +# IFTTT Alerts | https://docs.linuxgsm.com/alerts/ifttt +iftttalert="off" +ifttttoken="accesstoken" +iftttevent="linuxgsm_alert" + +# Mailgun Email Alerts | https://docs.linuxgsm.com/alerts/mailgun +mailgunalert="off" +mailgunapiregion="us" +mailguntoken="accesstoken" +mailgundomain="example.com" +mailgunemailfrom="alert@example.com" +mailgunemail="email@myemail.com" + +# Pushbullet Alerts | https://docs.linuxgsm.com/alerts/pushbullet +pushbulletalert="off" +pushbullettoken="accesstoken" +channeltag="" + +# Pushover Alerts | https://docs.linuxgsm.com/alerts/pushover +pushoveralert="off" +pushovertoken="accesstoken" + +# Rocket.Chat Alerts | https://docs.linuxgsm.com/alerts/rocket.chat +rocketchatalert="off" +rocketchatwebhook="webhook" +rocketchattoken="" + +# Slack Alerts | https://docs.linuxgsm.com/alerts/slack +slackalert="off" +slackwebhook="webhook" + +# Telegram Alerts | https://docs.linuxgsm.com/alerts/telegram +# You can add a custom cURL string eg proxy (useful in Russia) or else in "curlcustomstring". +# like a "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help", if you not need +telegramalert="off" +telegramtoken="accesstoken" +telegramchatid="" +curlcustomstring="" + +## Updating | https://docs.linuxgsm.com/commands/update +updateonstart="off" + +## Backup | https://docs.linuxgsm.com/commands/backup +maxbackups="4" +maxbackupdays="30" +stoponbackup="on" + +## Logging | https://docs.linuxgsm.com/features/logging +consolelogging="on" +logdays="7" + +## Monitor | https://docs.linuxgsm.com/commands/monitor +# Query delay time +querydelay="1" + +#### LinuxGSM Advanced Settings #### + +# ANSI Colors +ansi="on" + +# Message Display Time +sleeptime="0.5" + +## SteamCMD Settings | https://docs.linuxgsm.com/steamcmd +# Server appid +appid="622970" +# SteamCMD Branch | https://docs.linuxgsm.com/steamcmd/branch +branch="" +betapassword="" +# Master Server | https://docs.linuxgsm.com/steamcmd/steam-master-server +steammaster="false" + +## Stop Mode | https://docs.linuxgsm.com/features/stop-mode +# 1: tmux kill +# 2: CTRL+c +# 3: quit +# 4: quit 120s +# 5: stop +# 6: q +# 7: exit +# 8: 7 Days to Die +# 9: GoldSrc +# 10: Avorion +# 11: end +stopmode="2" + +## Query mode +# 1: session only +# 2: gamedig + gsquery +# 3: gamedig +# 4: gsquery +# 5: tcp +querymode="1" +querytype="" + +## LinuxGSM Server Details +# Do not edit +gamename="Pavlov VR" +engine="unreal4" +glibc="2.17" + +#### Directories #### +# Edit with care + +## Server Specific Directories +systemdir="${serverfiles}/Pavlov" +executabledir="${systemdir}/Binaries/Linux" +executable="./PavlovServer" +servercfgdir="${systemdir}/Saved/Config/LinuxServer" +servercfg="Game.ini" +servercfgdefault="Game.ini" +servercfgfullpath="${servercfgdir}/${servercfg}" + +## Backup Directory +backupdir="${lgsmdir}/backup" + +## Logging Directories +logdir="${rootdir}/log" +gamelogdir="${systemdir}/Saved/Logs" +lgsmlogdir="${logdir}/script" +consolelogdir="${logdir}/console" +lgsmlog="${lgsmlogdir}/${selfname}-script.log" +consolelog="${consolelogdir}/${selfname}-console.log" +alertlog="${lgsmlogdir}/${selfname}-alert.log" +postdetailslog="${lgsmlogdir}/${selfname}-postdetails.log" + +## Logs Naming +lgsmlogdate="${lgsmlogdir}/${selfname}-script-$(date '+%Y-%m-%d-%H:%M:%S').log" +consolelogdate="${consolelogdir}/${selfname}-console-$(date '+%Y-%m-%d-%H:%M:%S').log" diff --git a/lgsm/data/serverlist.csv b/lgsm/data/serverlist.csv index b871357f9..ad3bc9a19 100644 --- a/lgsm/data/serverlist.csv +++ b/lgsm/data/serverlist.csv @@ -69,6 +69,7 @@ opfor,opforserver,Opposing Force pc,pcserver,Project Cars pstbs,pstbsserver,Post Scriptum: The Bloody Seventh pvkii,pvkiiserver,Pirates Vikings & Knights II +pvr,pvrserver,Pavlov VR pz,pzserver,Project Zomboid q2,q2server,Quake 2 q3,q3server,Quake 3: Arena diff --git a/lgsm/functions/check_system_requirements.sh b/lgsm/functions/check_system_requirements.sh index 8b7db5a3c..7a8b73de5 100755 --- a/lgsm/functions/check_system_requirements.sh +++ b/lgsm/functions/check_system_requirements.sh @@ -38,6 +38,9 @@ elif [ "${shortname}" == "ns2" ]||[ "${shortname}" == "ns2c" ]; then elif [ "${shortname}" == "st" ]; then ramrequirementmb="1000" ramrequirementgb="1" +elif [ "${shortname}" == "pvr" ];then + ramrequirementmb="2000" + ramrequirementgb="2" fi # If the game or engine has a minimum RAM Requirement, compare it to system's available RAM. diff --git a/lgsm/functions/fix_steamcmd.sh b/lgsm/functions/fix_steamcmd.sh index 3fe106c38..41d31e263 100755 --- a/lgsm/functions/fix_steamcmd.sh +++ b/lgsm/functions/fix_steamcmd.sh @@ -84,6 +84,8 @@ elif [ "${shortname}" == "ins" ]; then elif [ "${shortname}" == "pz" ]; then fn_fix_steamclient_so "32" "${serverfiles}/linux32" fn_fix_steamclient_so "64" "${serverfiles}/linux64" +elif [ "${shortname}" == "pvr" ]; then + fn_fix_steamclient_so "64" "${executabledir}" elif [ "${shortname}" == "ss3" ]; then fn_fix_steamclient_so "32" "${serverfiles}/Bin" elif [ "${shortname}" == "tu" ];then diff --git a/lgsm/functions/info_config.sh b/lgsm/functions/info_config.sh index ec0d2eb4a..d13e000d9 100755 --- a/lgsm/functions/info_config.sh +++ b/lgsm/functions/info_config.sh @@ -1511,6 +1511,20 @@ fn_info_config_soldat(){ fi } +fn_info_config_pavlovvr(){ + if [ ! -f "${servercfgfullpath}" ]; then + servername="${unavailable}" + maxplayers="${unavailable}" + else + servername=$(grep "ServerName" "${servercfgfullpath}" | awk -F '=' '{print $2}') + maxplayers=$(grep "MaxPlayers" "${servercfgfullpath}" | awk -F '=' '{print $2}') + + # Not set + servername=${servername:-"NOT SET"} + maxplayers=${maxplayers:-"0"} + fi +} + if [ "${shortname}" == "ac" ]; then fn_info_config_assettocorsa elif [ "${shortname}" == "ark" ]; then @@ -1631,4 +1645,6 @@ elif [ "${shortname}" == "st" ]; then fn_info_config_stationeers elif [ "${shortname}" == "mh" ]; then fn_info_config_mordhau +elif [ "${shortname}" == "pvr" ];then + fn_info_config_pavlovvr fi diff --git a/lgsm/functions/info_messages.sh b/lgsm/functions/info_messages.sh index 6eb97f241..dde3a2585 100755 --- a/lgsm/functions/info_messages.sh +++ b/lgsm/functions/info_messages.sh @@ -1435,6 +1435,16 @@ fn_info_message_warfork(){ } | column -s $'\t' -t } +fn_info_message_pavlovvr(){ + echo "netstat -atunp | grep Pavlov" + echo -e "" + { + echo -e "DESCRIPTION\tDIRECTION\tPORT\tPROTOCOL" + echo -e "> Game\tINBOUND\t${port}\tudp" + echo -e "> Game\tINBOUND\t$((port+400))\tudp" + } | column -s $'\t' -t +} + fn_info_message_select_engine(){ # Display details depending on game or engine. if [ "${shortname}" == "ac" ]; then @@ -1547,6 +1557,8 @@ fn_info_message_select_engine(){ fn_info_message_bfv elif [ "${shortname}" == "rtcw" ]; then fn_info_message_rtcw + elif [ "${shortname}" == "pvr" ]; then + fn_info_message_pavlovvr elif [ "${shortname}" == "rust" ]; then fn_info_message_rust elif [ "${shortname}" == "wf" ]; then diff --git a/lgsm/functions/info_parms.sh b/lgsm/functions/info_parms.sh index 57ca43850..74c29b9df 100755 --- a/lgsm/functions/info_parms.sh +++ b/lgsm/functions/info_parms.sh @@ -196,6 +196,11 @@ fn_info_parms_teeworlds(){ queryport=${port:-"0"} } +fn_info_parms_pavlovvr(){ + port=${port:-"0"} + queryport=${queryport:-"0"} +} + fn_info_parms_unreal(){ defaultmap=${defaultmap:-"NOT SET"} queryport=$((port + 1)) @@ -250,6 +255,8 @@ elif [ "${shortname}" == "mom" ]; then fn_info_parms_mom elif [ "${shortname}" == "pz" ]; then fn_info_parms_projectzomboid +elif [ "${shortname}" == "pvr" ]; then + fn_info_parms_pavlovvr elif [ "${shortname}" == "qw" ]; then fn_info_parms_quakeworld elif [ "${shortname}" == "q2" ]||[ "${shortname}" == "q3" ]; then diff --git a/lgsm/functions/install_config.sh b/lgsm/functions/install_config.sh index 543bd0a3d..d512f5b68 100755 --- a/lgsm/functions/install_config.sh +++ b/lgsm/functions/install_config.sh @@ -576,6 +576,13 @@ elif [ "${shortname}" == "mumble" ]; then fn_fetch_default_config fn_default_config_remote fn_list_config_locations +elif [ "${gamename}" == "Pavlov VR" ]; then + gamedirname="PavlovVR" + fn_check_cfgdir + array_configs+=( Game.ini ) + fn_fetch_default_config + fn_default_config_remote + fn_set_config_vars elif [ "${shortname}" == "pvkii" ]; then gamedirname="PiratesVikingandKnightsII" array_configs+=( server.cfg ) From 26d750133b453404b141f335b54689fc5baddd93 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Wed, 18 Nov 2020 23:05:27 +0000 Subject: [PATCH 492/534] Update ssh-agent to 0.4.1 --- .github/workflows/git-sync.yml | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/.github/workflows/git-sync.yml b/.github/workflows/git-sync.yml index 9fc886b4e..c058b6d24 100644 --- a/.github/workflows/git-sync.yml +++ b/.github/workflows/git-sync.yml @@ -11,17 +11,16 @@ jobs: repo-sync: runs-on: ubuntu-latest steps: - - name: ssh - uses: webfactory/ssh-agent@v0.2.0 + - name: webfactory/ssh-agent + uses: webfactory/ssh-agent@v0.4.1 with: ssh-private-key: ${{ secrets.BITBUCKET_SECRET }} - ssh_private_key: ${{ secrets.BITBUCKET_SECRET }} - name: repo-sync - uses: wei/git-sync@v2 + uses: wei/git-sync@v2.1.0 with: + ssh_private_key: ${{ secrets.BITBUCKET_SECRET }} source_repo: "https://github.com/GameServerManagers/LinuxGSM" source_branch: "refs/heads/*" destination_repo: "git@bitbucket.org:GameServerManagers/linuxgsm.git" destination_branch: "refs/heads/*" - ssh_private_key: ${{ secrets.BITBUCKET_SECRET }} From 097bb991ab93705cfe3851fadfb3d0d135ead715 Mon Sep 17 00:00:00 2001 From: tkrn Date: Thu, 19 Nov 2020 17:03:04 -0500 Subject: [PATCH 493/534] feat(mods): metamod/amxmodx for goldsrc engines (#3104) --- lgsm/functions/command_mods_install.sh | 23 +++ lgsm/functions/command_mods_remove.sh | 31 +++- lgsm/functions/core_getopt.sh | 2 +- lgsm/functions/mods_core.sh | 248 +++++++++++++++++++++++++ lgsm/functions/mods_list.sh | 86 +++++++-- 5 files changed, 370 insertions(+), 20 deletions(-) diff --git a/lgsm/functions/command_mods_install.sh b/lgsm/functions/command_mods_install.sh index 369f5f967..d644e0cf0 100755 --- a/lgsm/functions/command_mods_install.sh +++ b/lgsm/functions/command_mods_install.sh @@ -95,6 +95,18 @@ if [ -f "${modsinstalledlistfullpath}" ]; then fi ## Installation. +# If amxmodx check if metamod exists first +if [ "${modcommand}" == "amxmodx" ]; then + fn_mod_exist "metamod" +fi + +if [ "${modcommand}" == "amxmodxcs" ] || + [ "${modcommand}" == "amxmodxdod" ] || + [ "${modcommand}" == "amxmodxtfc" ] || + [ "${modcommand}" == "amxmodxns" ] || + [ "${modcommand}" == "amxmodxts" ]; then + fn_mod_exist "amxmodx" +fi fn_create_mods_dir fn_mods_clear_tmp_dir @@ -106,6 +118,17 @@ fn_mod_copy_destination fn_mod_add_list fn_mod_tidy_files_list fn_mods_clear_tmp_dir + +# Create/modify existing liblist.gam file for Metamod +if [ "${modcommand}" == "metamod" ]; then + fn_mod_install_liblist_gam_file +fi + +# Create/modify plugins.ini file for Metamod +if [ "${modcommand}" == "amxmodx" ]; then + fn_mod_install_amxmodx_file +fi + echo -e "${modprettyname} installed" fn_script_log_pass "${modprettyname} installed." diff --git a/lgsm/functions/command_mods_remove.sh b/lgsm/functions/command_mods_remove.sh index 7cbba8a71..507251e87 100755 --- a/lgsm/functions/command_mods_remove.sh +++ b/lgsm/functions/command_mods_remove.sh @@ -37,7 +37,7 @@ while [[ ! " ${installedmodslist[@]} " =~ " ${usermodselect} " ]]; do read -r usermodselect # Exit if user says exit or abort. if [ "${usermodselect}" == "exit" ]||[ "${usermodselect}" == "abort" ]; then - core_exit.sh + core_exit.sh # Supplementary output upon invalid user input. elif [[ ! " ${availablemodscommands[@]} " =~ " ${usermodselect} " ]]; then fn_print_error2_nl "${usermodselect} is not a valid addon/mod." @@ -82,17 +82,25 @@ while [ "${modfileline}" -le "${modsfilelistsize}" ]; do echo -e "removing ${modprettyname} ${modfileline} / ${modsfilelistsize} : ${currentfileremove}..." ((modfileline++)) done -if [ "${exitcode}" != 0 ]; then - fn_print_fail_eol_nl - core_exit.sh + +# Added logic not to fail since removing game specific mods (amxmodxcs) removes files that will +# not be found when removing the base (amxmodx) mod +if [ "${modcommand}" != "amxmodx" ]; then + if [ "${exitcode}" != 0 ]; then + fn_print_fail_eol_nl + core_exit.sh + else + fn_print_ok_eol_nl + fi else fn_print_ok_eol_nl fi + # Remove file list. echo -en "removing ${modcommand}-files.txt..." fn_sleep_time rm -rf "${modsdir:?}/${modcommand}-files.txt" -local exitcode=$? +exitcode=$? if [ "${exitcode}" != 0 ]; then fn_script_log_fatal "Removing ${modsdir}/${modcommand}-files.txt" fn_print_fail_eol_nl @@ -107,7 +115,7 @@ echo -en "removing ${modcommand} from ${modsinstalledlist}..." fn_sleep_time sed -i "/^${modcommand}$/d" "${modsinstalledlistfullpath}" -local exitcode=$? +exitcode=$? if [ "${exitcode}" != 0 ]; then fn_script_log_fatal "Removing ${modcommand} from ${modsinstalledlist}" fn_print_fail_eol_nl @@ -127,6 +135,17 @@ if [ "${engine}" == "unity3d" ]&&[[ "${modprettyname}" == *"Oxide"* ]]; then fn_firstcommand_reset unset exitbypass fi + +# Remove/modify existing liblist.gam file for Metamod +if [ "${modcommand}" == "metamod" ]; then + fn_mod_remove_liblist_gam_file +fi + +# Remove/modify plugins.ini file for AMX Mod X +if [ "${modcommand}" == "amxmodx" ]; then + fn_mod_remove_amxmodx_file +fi + echo -e "${modprettyname} removed" fn_script_log "${modprettyname} removed" diff --git a/lgsm/functions/core_getopt.sh b/lgsm/functions/core_getopt.sh index 82eb77691..e20b32b57 100755 --- a/lgsm/functions/core_getopt.sh +++ b/lgsm/functions/core_getopt.sh @@ -125,7 +125,7 @@ if [ "${shortname}" == "squad" ]; then fi ## Mods commands. -if [ "${engine}" == "source" ]||[ "${shortname}" == "rust" ]||[ "${shortname}" == "hq" ]||[ "${shortname}" == "sdtd" ]; then +if [ "${engine}" == "source" ]||[ "${shortname}" == "rust" ]||[ "${shortname}" == "hq" ]||[ "${shortname}" == "sdtd" ]||[ "${shortname}" == "cs" ]||[ "${shortname}" == "dod" ]||[ "${shortname}" == "tfc" ]||[ "${shortname}" == "ns" ]||[ "${shortname}" == "ts" ]||[ "${shortname}" == "hldm" ]; then currentopt+=( "${cmd_mods_install[@]}" "${cmd_mods_remove[@]}" "${cmd_mods_update[@]}" ) fi diff --git a/lgsm/functions/mods_core.sh b/lgsm/functions/mods_core.sh index bd6b6275c..535703430 100755 --- a/lgsm/functions/mods_core.sh +++ b/lgsm/functions/mods_core.sh @@ -495,6 +495,254 @@ fn_check_mod_files_list(){ fi } +fn_mod_exist(){ + modreq=$1 + # requires one parameter, the mod + if [ -f "${modsdir}/${modreq}-files.txt" ]; then + # how many lines is the file list + modsfilelistsize=$(wc -l < "${modsdir}/${modreq}-files.txt") + # if file list is empty + if [ "${modsfilelistsize}" -eq 0 ]; then + fn_mod_required_fail_exist "${modreq}" + fi + else + fn_mod_required_fail_exist "${modreq}" + fi +} + +fn_mod_required_fail_exist(){ + modreq=$1 + # requires one parameter, the mod + fn_script_log_fatal "${modreq}-files.txt is empty: unable to find ${modreq} installed" + echo -en "* Unable to find '${modreq}' which is required prior to installing this mod..." + fn_print_fail_eol_nl + core_exit.sh +} + +fn_mod_liblist_gam_filenames(){ + # clear variables just in case + moddll="" + modso="" + moddylib="" + + # default libraries + case ${gamename} in + "Counter-Strike 1.6") + moddll="mp.dll" + modso="cs.so" + moddylib="cs.dylib" + ;; + "Day of Defeat") + moddll="dod.dll" + modso="dod.so" + moddylib="dod.dylib" + ;; + "Team Fortress Classic") + moddll="tfc.dll" + modso="tfc.so" + moddylib="tfc.dylib" + ;; + "Natural Selection") + moddll="ns.dll" + modso="ns_i386.so" + moddylib="" + ;; + "The Specialists") + moddll="mp.dll" + modso="ts_i386.so" + moddylib="" + ;; + "Half-Life: Deathmatch") + moddll="hl.dll" + modso="hl.so" + moddylib="hl.dylib" + ;; + esac +} + +# modifers for liblist.gam to add/remote metamod binaries +fn_mod_install_liblist_gam_file(){ + + fn_mod_liblist_gam_filenames + + if [ -f "${modinstalldir}/liblist.gam" ]; then + # modify the liblist.gam file to initialize Metamod + logentry="sed replace (dlls\\${moddll}) ${modinstalldir}/liblist.gam" + echo -en "modifying gamedll in liblist.gam..." + rpldll="s/dlls\\\\${moddll}/addons\/metamod\/dlls\/metamod.dll/g" + sed -i $rpldll ${modinstalldir}/liblist.gam + grep -q "addons/metamod/dlls/metamod.dll" ${modinstalldir}/liblist.gam + exitcode=$? + # if replacement back didn't happen, error out. + if [ "${exitcode}" != 0 ]; then + fn_script_log_fatal $logentry + fn_print_fail_eol_nl + else + fn_script_log_pass $logentry + fn_print_ok_eol_nl + fi + + # modify the liblist.gam file to initialize metamod + logentry="sed replace (dlls\\${modso}) ${modinstalldir}/liblist.gam" + echo -en "modifying gamedll_linux in liblist.gam..." + rplso="s/dlls\/${modso}/addons\/metamod\/dlls\/metamod.so/g" + sed -i $rplso ${modinstalldir}/liblist.gam + grep -q "addons/metamod/dlls/metamod.so" ${modinstalldir}/liblist.gam + exitcode=$? + # if replacement back didn't happen, error out + if [ "${exitcode}" != 0 ]; then + fn_script_log_fatal $logentry + fn_print_fail_eol_nl + else + fn_script_log_pass $logentry + fn_print_ok_eol_nl + fi + + # mac os needs to be checked not all mods support mac os + if [ -n "${moddylib}" ]; then + # modify the liblist.gam file to initialize metamod + logentry="sed replace (dlls\\${moddylib}) ${modinstalldir}/liblist.gam" + echo -en "modifying gamedll_osx in liblist.gam..." + rpldylib="s/dlls\/${moddylib}/addons\/metamod\/dlls\/metamod.dylib/g" + sed -i $rpldylib ${modinstalldir}/liblist.gam + grep -q "addons/metamod/dlls/metamod.dylib" ${modinstalldir}/liblist.gam + exitcode=$? + # if replacement back didn't happen, error out. + if [ "${exitcode}" != 0 ]; then + fn_script_log_fatal $logentry + fn_print_fail_eol_nl + else + fn_script_log_pass $logentry + fn_print_ok_eol_nl + fi + fi + fi +} + +fn_mod_remove_liblist_gam_file(){ + + fn_mod_liblist_gam_filenames + + if [ -f "${modinstalldir}/liblist.gam" ]; then + # modify the liblist.gam file back to defaults + logentry="sed replace (addons/metamod/dlls/metamod.dll) ${modinstalldir}/liblist.gam" + echo -en "modifying gamedll in liblist.gam..." + rpldll="s/addons\/metamod\/dlls\/metamod.dll/dlls\\\\${moddll}/g" + sed -i $rpldll ${modinstalldir}/liblist.gam + grep -q "${moddll}" ${modinstalldir}/liblist.gam + exitcode=$? + # if replacement back didn't happen, error out. + if [ "${exitcode}" != 0 ]; then + fn_script_log_fatal $logentry + fn_print_fail_eol_nl + else + fn_script_log_pass $logentry + fn_print_ok_eol_nl + fi + + # modify the liblist.gam file back to defaults + logentry="sed replace (addons/metamod/dlls/metamod.so) ${modinstalldir}/liblist.gam" + echo -en "modifying gamedll_linux in liblist.gam..." + rplso="s/addons\/metamod\/dlls\/metamod.so/dlls\/${modso}/g" + sed -i $rplso ${modinstalldir}/liblist.gam + grep -q "${modso}" ${modinstalldir}/liblist.gam + exitcode=$? + # if replacement back didn't happen, error out + if [ "${exitcode}" != 0 ]; then + fn_script_log_fatal $logentry + fn_print_fail_eol_nl + else + fn_script_log_pass $logentry + fn_print_ok_eol_nl + fi + + # mac os needs to be checked not all mods support mac os + if [ -n "${moddylib}" ]; then + # modify the liblist.gam file back to defaults + logentry="sed replace (addons/metamod/dlls/metamod.dylib) ${modinstalldir}/liblist.gam" + echo -en "modifying gamedll_osx in liblist.gam..." + rpldylib="s/addons\/metamod\/dlls\/metamod.dylib/dlls\/${moddylib}/g" + sed -i $rpldylib ${modinstalldir}/liblist.gam + grep -q "${moddylib}" ${modinstalldir}/liblist.gam + # if replacement back didn't happen, error out. + exitcode=$? + if [ "${exitcode}" != 0 ]; then + fn_script_log_fatal $logentry + fn_print_fail_eol_nl + else + fn_script_log_pass $logentry + fn_print_ok_eol_nl + fi + fi + fi +} + +fn_mod_install_amxmodx_file(){ + # does plugins.ini exist? + if [ -f "${modinstalldir}/addons/metamod/plugins.ini" ]; then + # since it does exist, is the entry already in plugins.ini + logentry="line (linux addons/amxmodx/dlls/amxmodx_mm_i386.so) inserted into ${modinstalldir}/addons/metamod/plugins.ini" + echo -en "adding amxmodx_mm_i386.so in plugins.ini..." + grep -q "amxmodx_mm_i386.so" ${modinstalldir}/addons/metamod/plugins.ini + exitcode=$? + if [ "${exitcode}" != 0 ]; then + # file exists but the entry does not, let's add it + echo "linux addons/amxmodx/dlls/amxmodx_mm_i386.so" >> ${modinstalldir}/addons/metamod/plugins.ini + exitcode=$? + if [ "${exitcode}" != 0 ]; then + fn_script_log_fatal $logentry + fn_print_fail_eol_nl + else + fn_script_log_pass $logentry + fn_print_ok_eol_nl + fi + fi + else + # create new file and add the mod to it + echo "linux addons/amxmodx/dlls/amxmodx_mm_i386.so" > ${modinstalldir}/addons/metamod/plugins.ini + exitcode=$? + if [ "${exitcode}" != 0 ]; then + fn_script_log_fatal $logentry + fn_print_fail_eol_nl + core_exit.sh + else + fn_script_log_pass $logentry + fn_print_ok_eol_nl + fi + fi +} + +fn_mod_remove_amxmodx_file(){ + if [ -f "${modinstalldir}/addons/metamod/plugins.ini" ]; then + # since it does exist, is the entry already in plugins.ini + logentry="line (linux addons/amxmodx/dlls/amxmodx_mm_i386.so) removed from ${modinstalldir}/addons/metamod/plugins.ini" + echo -en "removing amxmodx_mm_i386.so in plugins.ini..." + grep -q "linux addons/amxmodx/dlls/amxmodx_mm_i386.so" ${modinstalldir}/addons/metamod/plugins.ini + # iIs it found? If so remove it and clean up + exitcode=$? + if [ "${exitcode}" == 0 ]; then + # delete the line we inserted + sed -i '/linux addons\/amxmodx\/dlls\/amxmodx_mm_i386.so/d' ${modinstalldir}/addons/metamod/plugins.ini + # remove empty lines + sed -i '/^$/d' ${modinstalldir}/addons/metamod/plugins.ini + exitcode=$? + if [ "${exitcode}" != 0 ]; then + fn_script_log_fatal $logentry + fn_print_fail_eol_nl + else + fn_script_log_pass $logentry + fn_print_ok_eol_nl + fi + + # if file is empty, remove it. + if [ -f "${modinstalldir}/addons/metamod/plugins.ini" ]; then + rm ${modinstalldir}/addons/metamod/plugins.ini + fn_script_log_pass "file removed ${modinstalldir}/addons/metamod/plugins.ini because it was empty" + fi + fi + fi +} + ## Database initialisation. mods_list.sh diff --git a/lgsm/functions/mods_list.sh b/lgsm/functions/mods_list.sh index 333601dce..2e7e35cb2 100755 --- a/lgsm/functions/mods_list.sh +++ b/lgsm/functions/mods_list.sh @@ -12,17 +12,59 @@ functionselfname="$(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 -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}" + +# Metamod (Half-life 1 Classic Engine) +metamodversion="1.21.1-am" +metamodlatestfile="metamod-${metamodversion}.zip" +metamoddownloadurl="https://www.amxmodx.org/release/${metamodlatestfile}" metamodurl="${metamoddownloadurl}" +# AMX Mod X: Base +amxxbaseversion="1.8.2" +amxxbasemod="base" +amxxbaselatestfile="amxmodx-${amxxbaseversion}-${amxxbasemod}-linux.tar.gz" +amxxbasedownloadurl="https://www.amxmodx.org/release/${amxxbaselatestfile}" +amxxbaseurl="${amxxbasedownloadurl}" +# AMX Mod X: Counter-Strike +amxxcsversion="1.8.2" +amxxcsmod="cstrike" +amxxcslatestfile="amxmodx-${amxxbaseversion}-${amxxcsmod}-linux.tar.gz" +amxxcsdownloadurl="https://www.amxmodx.org/release/${amxxcslatestfile}" +amxxcsurl="${amxxcsdownloadurl}" +# AMX Mod X: Day of Defeat +amxxdodversion="1.8.2" +amxxdodmod="dod" +amxxdodlatestfile="amxmodx-${amxxdodversion}-${amxxdodmod}-linux.tar.gz" +amxxdoddownloadurl="https://www.amxmodx.org/release/${amxxdodlatestfile}" +amxxdodurl="${amxxdoddownloadurl}" +# AMX Mod X: Team Fortress Classic +amxxtfcversion="1.8.2" +amxxtfcmod="tfc" +amxxtfclatestfile="amxmodx-${amxxtfcversion}-${amxxtfcmod}-linux.tar.gz" +amxxtfcdownloadurl="https://www.amxmodx.org/release/${amxxtfclatestfile}" +amxxtfcurl="${amxxtfcdownloadurl}" +# AMX Mod X: Natural Selection +amxxnsversion="1.8.2" +amxxnsmod="ns" +amxxnslatestfile="amxmodx-${amxxnsversion}-${amxxnsmod}-linux.tar.gz" +amxxnsdownloadurl="https://www.amxmodx.org/release/${amxxnslatestfile}" +amxxnsurl="${amxxnsdownloadurl}" +# AMX Mod X: The Specialists +amxxtsversion="1.8.2" +amxxtsmod="ts" +amxxtslatestfile="amxmodx-${amxxtsversion}-${amxxtsmod}-linux.tar.gz" +amxxtsdownloadurl="https://www.amxmodx.org/release/${amxxtslatestfile}" +amxxtsurl="${amxxtsdownloadurl}" +# Metamod:Source +metamodsourceversion="1.10" +metamodsourcescrapeurl="https://mms.alliedmods.net/mmsdrop/${metamodsourceversion}/mmsource-latest-linux" +metamodsourcelatestfile=$(wget "${metamodsourcescrapeurl}" -q -O -) +metamodsourcedownloadurl="https://www.metamodsource.net/latest.php?os=linux&version=${metamodsourceversion}" +metamodsourceurl="${metamodsourcedownloadurl}" # Sourcemod -sourcemodmversion="1.10" -sourcemodscrapeurl="https://sm.alliedmods.net/smdrop/${sourcemodmversion}/sourcemod-latest-linux" +sourcemodversion="1.10" +sourcemodscrapeurl="https://sm.alliedmods.net/smdrop/${sourcemodversion}/sourcemod-latest-linux" sourcemodlatestfile=$(wget "${sourcemodscrapeurl}" -q -O -) -sourcemoddownloadurl="https://www.sourcemod.net/latest.php?os=linux&version=${sourcemodmversion}" +sourcemoddownloadurl="https://www.sourcemod.net/latest.php?os=linux&version=${sourcemodversion}" sourcemodurl="${sourcemoddownloadurl}" # Steamworks steamworksscrapeurl="https://users.alliedmods.net/~kyles/builds/SteamWorks" @@ -67,15 +109,34 @@ modseparator="MOD" # [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/removal +# Half-life 1 Engine Mods +mod_info_metamod=( MOD "metamod" "Metamod" "${metamodurl}" "${metamodlatestfile}" "0" "LowercaseOff" "${systemdir}" "addons/metamod/plugins.ini;" "ENGINES" "Counter-Strike 1.6;Day of Defeat;Team Fortress Classic;Natural Selection;The Specialists;Half-Life: Deathmatch;" "NOTGAMES" "https://github.com/alliedmodders/metamod-hl1" "Plugins Framework" ) +mod_info_base_amxx=( MOD "amxmodx" "AMX Mod X: Base" "${amxxbaseurl}" "${amxxbaselatestfile}" "0" "LowercaseOff" "${systemdir}" "addons/amxmodx/configs;" "ENGINES" "Counter-Strike 1.6;Day of Defeat;Team Fortress Classic;Natural Selection;The Specialists;Half-Life: Deathmatch;" "NOTGAMES" "https://www.amxmodx.org" "Admin Features (requires Metamod)" ) + +# CS 1.6 (HL1) Engine Mods +mod_info_cs_amxx=( MOD "amxmodxcs" "AMX Mod X: Counter-Strike" "${amxxcsurl}" "${amxxcslatestfile}" "0" "LowercaseOff" "${systemdir}" "addons/amxmodx/configs;" "ENGINES" "Counter-Strike 1.6;" "NOTGAMES" "https://www.amxmodx.org" "Admin Features (requires Metamod & AMX Mod X: Base)" ) + +# DOD (HL1) Engine Mods +mod_info_dod_amxx=( MOD "amxmodxdod" "AMX Mod X: Day of Defeat" "${amxxdodurl}" "${amxxdodlatestfile}" "0" "LowercaseOff" "${systemdir}" "addons/amxmodx/configs;" "ENGINES" "Day of Defeat;" "NOTGAMES" "https://www.amxmodx.org" "Admin Features (requires Metamod & AMX Mod X: Base)" ) + +# TFC (HL1) Engine Mods +mod_info_tfc_amxx=( MOD "amxmodxtfc" "AMX Mod X: Team Fortress Classic" "${amxxtfcurl}" "${amxxtfclatestfile}" "0" "LowercaseOff" "${systemdir}" "addons/amxmodx/configs;" "ENGINES" "Team Fortress Classic;" "NOTGAMES" "https://www.amxmodx.org" "Admin Features (requires Metamod & AMX Mod X: Base)" ) + +# NS (Natural Selection) (HL1) Engine Mods +mod_info_ns_amxx=( MOD "amxmodxns" "AMX Mod X: Natural Selection" "${amxxnsurl}" "${amxxnslatestfile}" "0" "LowercaseOff" "${systemdir}" "addons/amxmodx/configs;" "ENGINES" "Natural Selection;" "NOTGAMES" "https://www.amxmodx.org" "Admin Features (requires Metamod & AMX Mod X: Base)" ) + +# TS (The Specialists) (HL1) Engine Mods +mod_info_ts_amxx=( MOD "amxmodxts" "AMX Mod X: The Specialists" "${amxxtsurl}" "${amxxtslatestfile}" "0" "LowercaseOff" "${systemdir}" "addons/amxmodx/configs;" "ENGINES" "The Specialists;" "NOTGAMES" "https://www.amxmodx.org" "Admin Features (requires Metamod & AMX Mod X: Base)" ) + # 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)" ) +mod_info_metamodsource=( MOD "metamodsource" "Metamod: Source" "${metamodsourceurl}" "${metamodsourcelatestfile}" "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: Source)" ) mod_info_steamworks=( MOD "steamworks" "SteamWorks" "${steamworksurl}" "${steamworkslatestfile}" "0" "LowercaseOff" "${systemdir}" "OVERWRITE" "ENGINES" "Counter-Strike: Global Offensive;" "NOTGAMES" "https://github.com/KyleSanderson/SteamWorks" "Exposing SteamWorks functions to SourcePawn" ) mod_info_stripper=( MOD "stripper" "Stripper Source" "http://www.bailopan.net/stripper/snapshots/1.2/stripper-1.2.2-git129-linux.tar.gz" "stripper-1.2.2-git129-linux.tar.gz" "0" "LowercaseOff" "${systemdir}" "addons/stripper/maps;" "ENGINES" "Counter-Strike: Global Offensive;Counter-Strike: Source;Day of Defeat: Source;Half Life: Deathmatch;Half Life 2: Deathmatch;Insurgency;Left 4 Dead;Left 4 Dead 2;Nuclear Dawn;Team Fortress 2;" "NOTGAMES" "http://www.bailopan.net/stripper/" "Add or remove objects from map (requires MetaMod)") # CS:GO Mods mod_info_gokz=( MOD "gokz" "GOKZ" "https://bitbucket.org/kztimerglobalteam/gokz/downloads/GOKZ-latest.zip" "gokz-latest.zip" "0" "LowercaseOff" "${systemdir}" "cfg;addons/sourcemod/configs;" "ENGINES" "Counter-Strike: Global Offensive;" "NOTGAMES" "https://bitbucket.org/kztimerglobalteam/gokz/src/master/" "Implements the KZ game mode (requires SourceMod and MetaMod)" ) -mod_info_ttt=( MOD "ttt" "Trouble in Terrorist Town" "https://csgottt.com/downloads/ttt-latest-dev-${sourcemodmversion}.zip" "ttt-latest.zip" "0" "LowercaseOff" "${systemdir}" "cfg;addons/sourcemod/configs;" "ENGINES" "Counter-Strike: Global Offensive;" "NOTGAMES" "https://github.com/Bara/TroubleinTerroristTown" "Implements the TTT game mode (requires SourceMod and MetaMod)" ) +mod_info_ttt=( MOD "ttt" "Trouble in Terrorist Town" "https://csgottt.com/downloads/ttt-latest-dev-${sourcemodversion}.zip" "ttt-latest.zip" "0" "LowercaseOff" "${systemdir}" "cfg;addons/sourcemod/configs;" "ENGINES" "Counter-Strike: Global Offensive;" "NOTGAMES" "https://github.com/Bara/TroubleinTerroristTown" "Implements the TTT game mode (requires SourceMod and MetaMod)" ) mod_info_get5=( MOD "get5" "Get 5" "${get5url}" "${get5latestfile}" "0" "LowercaseOff" "${systemdir}" "cfg;addons/sourcemod/configs;" "ENGINES" "Counter-Strike: Global Offensive;" "NOTGAMES" "https://github.com/splewis/get5" "Plugin for competitive matches/scrims (requires SourceMod and MetaMod)" ) mod_info_pug=( MOD "pug" "PUG" "${csgopuglatestlink}" "${csgopuglatestfile}" "0" "LowercaseOff" "${systemdir}" "cfg;addons/sourcemod/configs;" "ENGINES" "Counter-Strike: Global Offensive;" "NOTGAMES" "https://github.com/splewis/csgo-pug-setup" "plugin for setting up private pug/10man games" ) @@ -93,11 +154,10 @@ mod_info_wiremodextras=( MOD "wiremod-extras" "Wiremod Extras" "https://github.c mod_info_darkrp=( MOD "darkrp" "DarkRP" "https://github.com/FPtje/DarkRP/archive/master.zip" "darkrp-master.zip" "0" "LowercaseOn" "${systemdir}/gamemodes" "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" "${oxiderustlatestlink}" "Oxide.Rust-linux.zip" "0" "LowercaseOff" "${systemdir}" "OVERWRITE" "ENGINES" "Rust;" "NOTGAMES" "https://umod.org/games/rust" "Allows for the use of plugins" ) mod_info_hwoxide=( MOD "hwoxide" "Oxide for Hurtworld" "${oxidehurtworldlatestlink}" "Oxide.Hurtworld.zip" "0" "LowercaseOff" "${systemdir}" "OVERWRITE" "ENGINES" "Hurtworld;" "NOTGAMES" "https://umod.org/games/hurtworld" "Allows for the use of plugins" ) mod_info_sdtdoxide=( MOD "sdtdoxide" "Oxide for 7 Days To Die" "${oxidesdtdlatestlink}" "Oxide.SevenDaysToDie.zip" "0" "LowercaseOff" "${systemdir}" "OVERWRITE" "ENGINES" "7 Days To Die;" "NOTGAMES" "https://umod.org/games/7-days-to-die" "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_steamworks[@]}" "${mod_info_stripper[@]}" "${mod_info_gokz[@]}" "${mod_info_ttt[@]}" "${mod_info_get5[@]}" "${mod_info_pug[@]}" "${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_pac3[@]}" "${mod_info_wiremod[@]}" "${mod_info_wiremodextras[@]}" "${mod_info_darkrp[@]}" "${mod_info_darkrpmodification[@]}" "${mod_info_rustoxide[@]}" "${mod_info_hwoxide[@]}" "${mod_info_sdtdoxide[@]}" ) +mods_global_array=( "${mod_info_metamod[@]}" "${mod_info_base_amxx[@]}" "${mod_info_cs_amxx[@]}" "${mod_info_dod_amxx[@]}" "${mod_info_tfc_amxx[@]}" "${mod_info_ns_amxx[@]}" "${mod_info_ts_amxx[@]}" "${mod_info_metamodsource[@]}" "${mod_info_sourcemod[@]}" "${mod_info_steamworks[@]}" "${mod_info_gokz[@]}" "${mod_info_ttt[@]}" "${mod_info_get5[@]}" "${mod_info_pug[@]}" "${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_pac3[@]}" "${mod_info_wiremod[@]}" "${mod_info_wiremodextras[@]}" "${mod_info_darkrp[@]}" "${mod_info_darkrpmodification[@]}" "${mod_info_rustoxide[@]}" "${mod_info_hwoxide[@]}" "${mod_info_sdtdoxide[@]}" ) \ No newline at end of file From 6eabed9565f68b620d65df12fadcd62cd09cae0a Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Sun, 22 Nov 2020 19:00:44 +0000 Subject: [PATCH 494/534] feat(ut99server): update UT99 to version 469a (OldUnreal patch) (#3110) --- 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 73f2dc2b1..f8b6be4f0 100755 --- a/lgsm/functions/install_server_files.sh +++ b/lgsm/functions/install_server_files.sh @@ -48,7 +48,7 @@ fn_install_server_files(){ elif [ "${shortname}" == "ut2k4" ]; then remote_fileurl="http://linuxgsm.download/UnrealTournament2004/ut2004-server-3369-3-ultimate-linux.tar.xz"; local_filedir="${tmpdir}"; local_filename="ut2004-server-3369-3-ultimate-linux.tar.xz"; chmodx="nochmodx" run="norun"; force="noforce"; md5="9fceaab68554749f4b45be66613b9a15" elif [ "${shortname}" == "ut99" ]; then - remote_fileurl="http://linuxgsm.download/UnrealTournament99/ut99-server-451-ultimate-linux.tar.xz"; local_filedir="${tmpdir}"; local_filename="ut99-server-451-ultimate-linux.tar.xz"; chmodx="nochmodx" run="norun"; force="noforce"; md5="42c6839f8cb95907eeef71a1838aa1f7" + remote_fileurl="http://linuxgsm.download/UnrealTournament99/ut99-server-469a-ultimate-linux.tar.xz"; local_filedir="${tmpdir}"; local_filename="ut99-server-469a-ultimate-linux.tar.xz"; chmodx="nochmodx" run="norun"; force="noforce"; md5="e3f2ffaab8e23b98d9e825d0244e8b9d" elif [ "${shortname}" == "ut" ]; then remote_fileurl="http://linuxgsm.download/UnrealTournament/UnrealTournament-Server-XAN-3525360-Linux.tar.xz"; local_filedir="${tmpdir}"; local_filename="UnrealTournament-Server-XAN-3525360-Linux.tar.xz"; chmodx="noexecute" run="norun"; force="noforce"; md5="41dd92015713a78211eaccf503b72393" elif [ "${shortname}" == "ut3" ]; then From d7b4ac6b46169368ea0568bc0e7e636a1094bf23 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Sat, 28 Nov 2020 22:17:47 +0000 Subject: [PATCH 495/534] feat(mcserver): select Minecraft release or snapshot (#3114) Select either release or snapshot branch. Also, have the option to select either latest or specific release/snapshot. A new more efficient way to get the local release that extracts the jar file and parses json file with version number Co-authored-by: Josh Bryans --- .../config-lgsm/mcserver/_default.cfg | 5 +- lgsm/functions/update_minecraft.sh | 65 ++++++------------- 2 files changed, 24 insertions(+), 46 deletions(-) diff --git a/lgsm/config-default/config-lgsm/mcserver/_default.cfg b/lgsm/config-default/config-lgsm/mcserver/_default.cfg index 92f25294c..b78195e3e 100644 --- a/lgsm/config-default/config-lgsm/mcserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/mcserver/_default.cfg @@ -16,8 +16,11 @@ fn_parms(){ parms="nogui" } -## Branch, "snapshot" include snapshot and pre-release versions. | (release|snapshot) +## Release Settings | https://docs.linuxgsm.com/game-servers/minecraft#release-settings +# Branch (release|snapshot) branch="release" +# Version (latest|1.16) +mcversion="latest" #### LinuxGSM Settings #### diff --git a/lgsm/functions/update_minecraft.sh b/lgsm/functions/update_minecraft.sh index 98889ed64..e33840f3e 100755 --- a/lgsm/functions/update_minecraft.sh +++ b/lgsm/functions/update_minecraft.sh @@ -7,14 +7,12 @@ functionselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" fn_update_minecraft_dl(){ - if [ "${branch}" == "release" ]; then - latestmcreleaselink=$(curl -s "https://launchermeta.${remotelocation}/mc/game/version_manifest.json" | jq -r '.latest.release as $latest | .versions[] | select(.id == $latest) | .url') - else - latestmcreleaselink=$(curl -s "https://launchermeta.${remotelocation}/mc/game/version_manifest.json" | jq -r '.versions[0].url') - fi + # Generate link to version manifest json. + remotebuildlink=$(curl -s "https://launchermeta.${remotelocation}/mc/game/version_manifest.json" | jq -r --arg branch ${branch} --arg mcversion ${remotebuild} '.versions | .[] | select(.type==$branch and .id==$mcversion) | .url') + # Generate link to server.jar + remotebuildurl=$(curl -s "${remotebuildlink}" | jq -r '.downloads.server.url') - latestmcbuildurl=$(curl -s "${latestmcreleaselink}" | jq -r '.downloads.server.url') - fn_fetch_file "${latestmcbuildurl}" "" "" "" "${tmpdir}" "minecraft_server.${remotebuild}.jar" "" "norun" "noforce" "nomd5" + fn_fetch_file "${remotebuildurl}" "" "" "" "${tmpdir}" "minecraft_server.${remotebuild}.jar" "" "norun" "noforce" "nomd5" echo -e "copying to ${serverfiles}...\c" cp "${tmpdir}/minecraft_server.${remotebuild}.jar" "${serverfiles}/minecraft_server.jar" local exitcode=$? @@ -34,53 +32,30 @@ fn_update_minecraft_dl(){ fn_update_minecraft_localbuild(){ # Gets local build info. fn_print_dots "Checking local build: ${remotelocation}" - # Uses log file to gather info. - localbuild=$(grep -i version "${consolelogdir}"/* | tail -1 | sed 's/.*[Vv]ersion //' | sed 's/\r//g' 2>/dev/null) - if [ -z "${localbuild}" ]; then - fn_print_error "Checking local build: ${remotelocation}" - fn_print_error_nl "Checking local build: ${remotelocation}: no log files containing version info" - fn_print_info_nl "Checking local build: ${remotelocation}: forcing server restart" - fn_script_log_error "No log files containing version info" - fn_script_log_info "Forcing server restart" - exitbypass=1 - command_stop.sh - fn_firstcommand_reset - exitbypass=1 - command_start.sh - fn_firstcommand_reset - totalseconds=0 - localbuild=$(grep -i version "${consolelogdir}"/* | tail -1 | sed 's/.*[Vv]ersion //' | sed 's/\r//g' 2>/dev/null) - while [ -z "${localbuild}" ]; do - sleep 1 - fn_print_info "Checking local build: ${remotelocation}: waiting for log file: ${totalseconds}" - if [ -v "${loopignore}" ]; then - loopignore=1 - fn_script_log_info "Waiting for log file to generate" - fi - - localbuild=$(grep -i version "${consolelogdir}"/* | tail -1 | sed 's/.*[Vv]ersion //' | sed 's/\r//g' 2>/dev/null) - if [ "${totalseconds}" -gt "120" ]; then - localbuild="0" - fn_print_error "Checking local build: ${remotelocation}: waiting for log file" - fn_script_log_error "Local build did not generate" - fn_script_log_error "Required log file may be missing" - fn_script_log_error "Local build set to 0" - fi - totalseconds=$((totalseconds + 1)) - done - fi - if [ "${localbuild}" != "0" ]; then + # Uses executable to find local build. + cd "${executabledir}" || exit + if [ -f "minecraft_server.jar" ]; then + localbuild=$(unzip -p "minecraft_server.jar" version.json | jq -r '.id') fn_print_ok "Checking local build: ${remotelocation}" fn_script_log_pass "Checking local build" + else + localbuild="0" + fn_print_error "Checking local build: ${remotelocation}" + fn_script_log_error "Checking local build" fi } fn_update_minecraft_remotebuild(){ # Gets remote build info. - if [ "${branch}" == "release" ]; then + # Latest release. + if [ "${branch}" == "release" ] && [ "${mcversion}" == "latest" ]; then remotebuild=$(curl -s "https://launchermeta.${remotelocation}/mc/game/version_manifest.json" | jq -r '.latest.release') + # Latest snapshot. + elif [ "${branch}" == "snapshot" ] && [ "${mcversion}" == "latest" ]; then + remotebuild=$(curl -s "https://launchermeta.${remotelocation}/mc/game/version_manifest.json" | jq -r '.latest.snapshot') + # Specific release/snapshot. else - remotebuild=$(curl -s "https://launchermeta.${remotelocation}/mc/game/version_manifest.json" | jq -r '.versions[0].id') + remotebuild=$(curl -s "https://launchermeta.${remotelocation}/mc/game/version_manifest.json" | jq -r --arg branch ${branch} --arg mcversion ${mcversion} '.versions | .[] | select(.type==$branch and .id==$mcversion) | .id') fi if [ "${firstcommandname}" != "INSTALL" ]; then From 269bf6e491fba066f22318668c90d5bbe0692fdc Mon Sep 17 00:00:00 2001 From: Christian Date: Sun, 29 Nov 2020 14:20:56 +0100 Subject: [PATCH 496/534] fix: add connect timeout to core curl functions (#3117) --- lgsm/functions/alert_discord.sh | 2 +- lgsm/functions/alert_ifttt.sh | 2 +- lgsm/functions/alert_mailgun.sh | 2 +- lgsm/functions/alert_pushbullet.sh | 2 +- lgsm/functions/alert_pushover.sh | 2 +- lgsm/functions/alert_rocketchat.sh | 2 +- lgsm/functions/alert_slack.sh | 2 +- lgsm/functions/alert_telegram.sh | 2 +- lgsm/functions/command_update_linuxgsm.sh | 28 +++++++++++------------ lgsm/functions/core_dl.sh | 4 ++-- lgsm/functions/info_distro.sh | 6 ++--- lgsm/functions/mods_list.sh | 14 ++++++------ linuxgsm.sh | 2 +- 13 files changed, 35 insertions(+), 35 deletions(-) diff --git a/lgsm/functions/alert_discord.sh b/lgsm/functions/alert_discord.sh index b9512bbe7..a8ce373f0 100755 --- a/lgsm/functions/alert_discord.sh +++ b/lgsm/functions/alert_discord.sh @@ -52,7 +52,7 @@ EOF fn_print_dots "Sending Discord alert" -discordsend=$(curl -sSL -H "Content-Type: application/json" -X POST -d "$(echo -n "$json" | jq -c .)" "${discordwebhook}") +discordsend=$(curl --connect-timeout 10 -sSL -H "Content-Type: application/json" -X POST -d "$(echo -n "$json" | jq -c .)" "${discordwebhook}") if [ -n "${discordsend}" ]; then fn_print_fail_nl "Sending Discord alert: ${discordsend}" diff --git a/lgsm/functions/alert_ifttt.sh b/lgsm/functions/alert_ifttt.sh index 7a75050a4..faef505a5 100755 --- a/lgsm/functions/alert_ifttt.sh +++ b/lgsm/functions/alert_ifttt.sh @@ -16,7 +16,7 @@ EOF ) fn_print_dots "Sending IFTTT alert" -iftttsend=$(curl -sSL -H "Content-Type: application/json" -X POST -d """${json}""" "https://maker.ifttt.com/trigger/${iftttevent}/with/key/${ifttttoken}" | grep "Bad Request") +iftttsend=$(curl --connect-timeout 10 -sSL -H "Content-Type: application/json" -X POST -d """${json}""" "https://maker.ifttt.com/trigger/${iftttevent}/with/key/${ifttttoken}" | grep "Bad Request") if [ -n "${iftttsend}" ]; then fn_print_fail_nl "Sending IFTTT alert: ${pushbulletsend}" diff --git a/lgsm/functions/alert_mailgun.sh b/lgsm/functions/alert_mailgun.sh index 0c5aef4b6..5694bd595 100755 --- a/lgsm/functions/alert_mailgun.sh +++ b/lgsm/functions/alert_mailgun.sh @@ -14,7 +14,7 @@ fi fn_print_dots "Sending Email alert: Mailgun: ${email}" -mailgunsend=$(curl -s --user "api:${mailguntoken}" \ +mailgunsend=$(curl --connect-timeout 10 -s --user "api:${mailguntoken}" \ -F from="LinuxGSM <${mailgunemailfrom}>" \ -F to="LinuxGSM Admin <${mailgunemail}>" \ -F subject="${alertemoji} ${alertsubject} ${alertemoji}" \ diff --git a/lgsm/functions/alert_pushbullet.sh b/lgsm/functions/alert_pushbullet.sh index 7a0117a0a..42a9b7d5d 100755 --- a/lgsm/functions/alert_pushbullet.sh +++ b/lgsm/functions/alert_pushbullet.sh @@ -17,7 +17,7 @@ EOF ) fn_print_dots "Sending Pushbullet alert" -pushbulletsend=$(curl -sSL -u """${pushbullettoken}"":" -H "Content-Type: application/json" -X POST -d """${json}""" "https://api.pushbullet.com/v2/pushes" | grep "error_code") +pushbulletsend=$(curl --connect-timeout 10 -sSL -u """${pushbullettoken}"":" -H "Content-Type: application/json" -X POST -d """${json}""" "https://api.pushbullet.com/v2/pushes" | grep "error_code") if [ -n "${pushbulletsend}" ]; then fn_print_fail_nl "Sending Pushbullet alert: ${pushbulletsend}" diff --git a/lgsm/functions/alert_pushover.sh b/lgsm/functions/alert_pushover.sh index 82ba0af05..848a2eea5 100755 --- a/lgsm/functions/alert_pushover.sh +++ b/lgsm/functions/alert_pushover.sh @@ -21,7 +21,7 @@ else alertpriority="0" fi -pushoversend=$(curl -sS -F token="${pushovertoken}" -F user="${pushoveruserkey}" -F html="1" -F sound="${alertsound}" -F priority="${alertpriority}" -F title="${alertemoji} ${alertsubject} ${alertemoji}" -F message=" Server name
${servername}

Message
${alertbody}

Game
${gamename}

Server IP
${alertip}:${port}

Hostname
${HOSTNAME}

More info
${alerturl}" "https://api.pushover.net/1/messages.json" | grep errors) +pushoversend=$(curl --connect-timeout 10 -sS -F token="${pushovertoken}" -F user="${pushoveruserkey}" -F html="1" -F sound="${alertsound}" -F priority="${alertpriority}" -F title="${alertemoji} ${alertsubject} ${alertemoji}" -F message=" Server name
${servername}

Message
${alertbody}

Game
${gamename}

Server IP
${alertip}:${port}

Hostname
${HOSTNAME}

More info
${alerturl}" "https://api.pushover.net/1/messages.json" | grep errors) if [ -n "${pushoversend}" ]; then fn_print_fail_nl "Sending Pushover alert: ${pushoversend}" diff --git a/lgsm/functions/alert_rocketchat.sh b/lgsm/functions/alert_rocketchat.sh index 505113918..e6d4cf5ce 100755 --- a/lgsm/functions/alert_rocketchat.sh +++ b/lgsm/functions/alert_rocketchat.sh @@ -42,7 +42,7 @@ EOF fn_print_dots "Sending Rocketchat alert" -rocketchatsend=$(curl -sSL -H "Content-Type:application/json" -X POST -d "$(echo -n "$json" | jq -c .)" "${rocketchatwebhook}") +rocketchatsend=$(curl --connect-timeout 10 -sSL -H "Content-Type:application/json" -X POST -d "$(echo -n "$json" | jq -c .)" "${rocketchatwebhook}") if [ -n "${rocketchatsend}" ]; then fn_print_ok_nl "Sending Rocketchat alert" diff --git a/lgsm/functions/alert_slack.sh b/lgsm/functions/alert_slack.sh index 0ea5a41f8..c3a82d529 100755 --- a/lgsm/functions/alert_slack.sh +++ b/lgsm/functions/alert_slack.sh @@ -67,7 +67,7 @@ EOF fn_print_dots "Sending Slack alert" -slacksend=$(curl -sSL -H "Content-Type: application/json" -X POST -d "$(echo -n "$json" | jq -c .)" "${slackwebhook}") +slacksend=$(curl --connect-timeout 10 -sSL -H "Content-Type: application/json" -X POST -d "$(echo -n "$json" | jq -c .)" "${slackwebhook}") if [ "${slacksend}" == "ok" ]; then fn_print_ok_nl "Sending Slack alert" diff --git a/lgsm/functions/alert_telegram.sh b/lgsm/functions/alert_telegram.sh index 64e5fcbb3..7b812246c 100755 --- a/lgsm/functions/alert_telegram.sh +++ b/lgsm/functions/alert_telegram.sh @@ -16,7 +16,7 @@ EOF ) fn_print_dots "Sending Telegram alert" -telegramsend=$(curl -sSL -H "Content-Type: application/json" -X POST -d """${json}""" ${curlcustomstring} "https://api.telegram.org/bot${telegramtoken}/sendMessage" | grep "error_code") +telegramsend=$(curl --connect-timeout 10 -sSL -H "Content-Type: application/json" -X POST -d """${json}""" ${curlcustomstring} "https://api.telegram.org/bot${telegramtoken}/sendMessage" | grep "error_code") if [ -n "${telegramsend}" ]; then fn_print_fail_nl "Sending Telegram alert: ${telegramsend}" diff --git a/lgsm/functions/command_update_linuxgsm.sh b/lgsm/functions/command_update_linuxgsm.sh index 37918be2d..7e0ec57b6 100755 --- a/lgsm/functions/command_update_linuxgsm.sh +++ b/lgsm/functions/command_update_linuxgsm.sh @@ -17,9 +17,9 @@ fn_script_log_info "Updating LinuxGSM" fn_print_dots "Selecting repo" fn_script_log_info "Selecting repo" # Select remotereponame -curl -IsfL "https://raw.githubusercontent.com/${githubuser}/${githubrepo}/${githubbranch}/linuxgsm.sh" 1>/dev/null +curl --connect-timeout 10 -IsfL "https://raw.githubusercontent.com/${githubuser}/${githubrepo}/${githubbranch}/linuxgsm.sh" 1>/dev/null if [ $? != "0" ]; then - curl -IsfL "https://bitbucket.org/${githubuser}/${githubrepo}/raw/${githubbranch}/linuxgsm.sh" 1>/dev/null + curl --connect-timeout 10 -IsfL "https://bitbucket.org/${githubuser}/${githubrepo}/raw/${githubbranch}/linuxgsm.sh" 1>/dev/null if [ $? != "0" ]; then fn_print_fail_nl "Selecting repo: Unable to to access GitHub or Bitbucket repositories" fn_script_log_fatal "Selecting repo: Unable to to access GitHub or Bitbucket repositories" @@ -36,9 +36,9 @@ fi # Check linuxsm.sh echo -en "checking ${remotereponame} linuxgsm.sh...\c" if [ "${remotereponame}" == "GitHub" ]; then - curl -IsfL "https://raw.githubusercontent.com/${githubuser}/${githubrepo}/${githubbranch}/linuxgsm.sh" 1>/dev/null + curl --connect-timeout 10 -IsfL "https://raw.githubusercontent.com/${githubuser}/${githubrepo}/${githubbranch}/linuxgsm.sh" 1>/dev/null else - curl -IsfL "https://bitbucket.org/${githubuser}/${githubrepo}/raw/${githubbranch}/linuxgsm.sh" 1>/dev/null + curl --connect-timeout 10 -IsfL "https://bitbucket.org/${githubuser}/${githubrepo}/raw/${githubbranch}/linuxgsm.sh" 1>/dev/null fi if [ $? != "0" ]; then fn_print_fail_eol_nl @@ -48,9 +48,9 @@ if [ $? != "0" ]; then fi if [ "${remotereponame}" == "GitHub" ]; then - tmp_script_diff=$(diff "${tmpdir}/linuxgsm.sh" <(curl -s "https://raw.githubusercontent.com/${githubuser}/${githubrepo}/${githubbranch}/linuxgsm.sh")) + tmp_script_diff=$(diff "${tmpdir}/linuxgsm.sh" <(curl --connect-timeout 10 -s "https://raw.githubusercontent.com/${githubuser}/${githubrepo}/${githubbranch}/linuxgsm.sh")) else - tmp_script_diff=$(diff "${tmpdir}/linuxgsm.sh" <(curl -s "https://bitbucket.org/${githubuser}/${githubrepo}/raw/${githubbranch}/linuxgsm.sh")) + tmp_script_diff=$(diff "${tmpdir}/linuxgsm.sh" <(curl --connect-timeout 10 -s "https://bitbucket.org/${githubuser}/${githubrepo}/raw/${githubbranch}/linuxgsm.sh")) fi if [ "${tmp_script_diff}" != "" ]; then @@ -116,9 +116,9 @@ fi echo -en "checking ${remotereponame} config _default.cfg...\c" fn_script_log_info "Checking ${remotereponame} config _default.cfg" if [ "${remotereponame}" == "GitHub" ]; then - curl -IsfL "https://raw.githubusercontent.com/${githubuser}/${githubrepo}/${githubbranch}/lgsm/config-default/config-lgsm/${gameservername}/_default.cfg" 1>/dev/null + curl --connect-timeout 10 -IsfL "https://raw.githubusercontent.com/${githubuser}/${githubrepo}/${githubbranch}/lgsm/config-default/config-lgsm/${gameservername}/_default.cfg" 1>/dev/null else - curl -IsfL "https://bitbucket.org/${githubuser}/${githubrepo}/raw/${githubbranch}/lgsm/config-default/config-lgsm/${gameservername}/_default.cfg" 1>/dev/null + curl --connect-timeout 10 -IsfL "https://bitbucket.org/${githubuser}/${githubrepo}/raw/${githubbranch}/lgsm/config-default/config-lgsm/${gameservername}/_default.cfg" 1>/dev/null fi if [ $? != "0" ]; then fn_print_fail_eol_nl @@ -128,9 +128,9 @@ if [ $? != "0" ]; then fi if [ "${remotereponame}" == "GitHub" ]; then - config_file_diff=$(diff "${configdirdefault}/config-lgsm/${gameservername}/_default.cfg" <(curl -s "https://raw.githubusercontent.com/${githubuser}/${githubrepo}/${githubbranch}/lgsm/config-default/config-lgsm/${gameservername}/_default.cfg")) + config_file_diff=$(diff "${configdirdefault}/config-lgsm/${gameservername}/_default.cfg" <(curl --connect-timeout 10 -s "https://raw.githubusercontent.com/${githubuser}/${githubrepo}/${githubbranch}/lgsm/config-default/config-lgsm/${gameservername}/_default.cfg")) else - config_file_diff=$(diff "${configdirdefault}/config-lgsm/${gameservername}/_default.cfg" <(curl -s "https://bitbucket.org/${githubuser}/${githubrepo}/raw/${githubbranch}/lgsm/config-default/config-lgsm/${gameservername}/_default.cfg")) + config_file_diff=$(diff "${configdirdefault}/config-lgsm/${gameservername}/_default.cfg" <(curl --connect-timeout 10 -s "https://bitbucket.org/${githubuser}/${githubrepo}/raw/${githubbranch}/lgsm/config-default/config-lgsm/${gameservername}/_default.cfg")) fi if [ "${config_file_diff}" != "" ]; then @@ -155,9 +155,9 @@ if [ -n "${functionsdir}" ]; then echo -en "checking ${remotereponame} module ${functionfile}...\c" github_file_url_dir="lgsm/functions" if [ "${remotereponame}" == "GitHub" ]; then - curl -IsfL "https://raw.githubusercontent.com/${githubuser}/${githubrepo}/${githubbranch}/${github_file_url_dir}/${functionfile}" 1>/dev/null + curl --connect-timeout 10 -IsfL "https://raw.githubusercontent.com/${githubuser}/${githubrepo}/${githubbranch}/${github_file_url_dir}/${functionfile}" 1>/dev/null else - curl -IsfL "https://bitbucket.org/${githubuser}/${githubrepo}/raw/${githubbranch}/${github_file_url_dir}/${functionfile}" 1>/dev/null + curl --connect-timeout 10 -IsfL "https://bitbucket.org/${githubuser}/${githubrepo}/raw/${githubbranch}/${github_file_url_dir}/${functionfile}" 1>/dev/null fi if [ $? != 0 ]; then fn_print_error_eol_nl @@ -174,9 +174,9 @@ if [ -n "${functionsdir}" ]; then else # compare file if [ "${remotereponame}" == "GitHub" ]; then - function_file_diff=$(diff "${functionsdir}/${functionfile}" <(curl -s "https://raw.githubusercontent.com/${githubuser}/${githubrepo}/${githubbranch}/${github_file_url_dir}/${functionfile}")) + function_file_diff=$(diff "${functionsdir}/${functionfile}" <(curl --connect-timeout 10 -s "https://raw.githubusercontent.com/${githubuser}/${githubrepo}/${githubbranch}/${github_file_url_dir}/${functionfile}")) else - function_file_diff=$(diff "${functionsdir}/${functionfile}" <(curl -s "https://bitbucket.org/${githubuser}/${githubrepo}/raw/${githubbranch}/${github_file_url_dir}/${functionfile}")) + function_file_diff=$(diff "${functionsdir}/${functionfile}" <(curl --connect-timeout 10 -s "https://bitbucket.org/${githubuser}/${githubrepo}/raw/${githubbranch}/${github_file_url_dir}/${functionfile}")) fi # results diff --git a/lgsm/functions/core_dl.sh b/lgsm/functions/core_dl.sh index b5c92b3c1..ea20002a8 100755 --- a/lgsm/functions/core_dl.sh +++ b/lgsm/functions/core_dl.sh @@ -267,11 +267,11 @@ fn_fetch_file(){ echo -en "downloading ${local_filename}..." fn_sleep_time echo -en "\033[1K" - curlcmd=$(curl --progress-bar --fail -L -o "${local_filedir}/${local_filename}" "${fileurl}") + curlcmd=$(curl --connect-timeout 10 --progress-bar --fail -L -o "${local_filedir}/${local_filename}" "${fileurl}") echo -en "downloading ${local_filename}..." else echo -en "fetching ${fileurl_name} ${local_filename}...\c" - curlcmd=$(curl -s --fail -L -o "${local_filedir}/${local_filename}" "${fileurl}" 2>&1) + curlcmd=$(curl --connect-timeout 10 -s --fail -L -o "${local_filedir}/${local_filename}" "${fileurl}" 2>&1) fi local exitcode=$? diff --git a/lgsm/functions/info_distro.sh b/lgsm/functions/info_distro.sh index 725748311..53e8f4943 100755 --- a/lgsm/functions/info_distro.sh +++ b/lgsm/functions/info_distro.sh @@ -227,7 +227,7 @@ netlink=$(ethtool "${netint}" 2>/dev/null| grep Speed | awk '{print $2}') # External IP address if [ -z "${extip}" ]; then - extip=$(curl -s https://api.ipify.org 2>/dev/null) + extip=$(curl --connect-timeout 10 -s https://api.ipify.org 2>/dev/null) exitcode=$? # Should ifconfig.co return an error will use last known IP. if [ ${exitcode} -eq 0 ]; then @@ -264,11 +264,11 @@ if [ "$(command -v jq 2>/dev/null)" ]; then if [ "${steammaster}" == "true" ]; then # Will query server IP addresses first. for queryip in "${queryips[@]}"; do - masterserver="$(curl -m 3 -s 'https://api.steampowered.com/ISteamApps/GetServersAtAddress/v0001?addr='${queryip}':'${port}'&format=json' | jq '.response.servers[]|.addr' | wc -l 2>/dev/null)" + masterserver="$(curl --connect-timeout 10 -m 3 -s 'https://api.steampowered.com/ISteamApps/GetServersAtAddress/v0001?addr='${queryip}':'${port}'&format=json' | jq '.response.servers[]|.addr' | wc -l 2>/dev/null)" done # Should that not work it will try the external IP. if [ "${masterserver}" == "0" ]; then - masterserver="$(curl -m 3 -s 'https://api.steampowered.com/ISteamApps/GetServersAtAddress/v0001?addr='${extip}':'${port}'&format=json' | jq '.response.servers[]|.addr' | wc -l 2>/dev/null)" + masterserver="$(curl --connect-timeout 10 -m 3 -s 'https://api.steampowered.com/ISteamApps/GetServersAtAddress/v0001?addr='${extip}':'${port}'&format=json' | jq '.response.servers[]|.addr' | wc -l 2>/dev/null)" fi if [ "${masterserver}" == "0" ]; then displaymasterserver="false" diff --git a/lgsm/functions/mods_list.sh b/lgsm/functions/mods_list.sh index 2e7e35cb2..f60d9b30f 100755 --- a/lgsm/functions/mods_list.sh +++ b/lgsm/functions/mods_list.sh @@ -68,21 +68,21 @@ sourcemoddownloadurl="https://www.sourcemod.net/latest.php?os=linux&version=${so sourcemodurl="${sourcemoddownloadurl}" # Steamworks steamworksscrapeurl="https://users.alliedmods.net/~kyles/builds/SteamWorks" -steamworkslatestfile=$(curl -sL ${steamworksscrapeurl} | grep -m 1 linux | cut -d '"' -f 4) +steamworkslatestfile=$(curl --connect-timeout 10 -sL ${steamworksscrapeurl} | grep -m 1 linux | cut -d '"' -f 4) steamworksdownloadurl="${steamworksscrapeurl}/${steamworkslatestfile}" steamworksurl="${steamworksdownloadurl}" # CS:GO Mods -get5lastbuild=$(curl -sL https://ci.splewis.net/job/get5/lastSuccessfulBuild/api/json | jq -r '.artifacts[]') +get5lastbuild=$(curl --connect-timeout 10 -sL https://ci.splewis.net/job/get5/lastSuccessfulBuild/api/json | jq -r '.artifacts[]') get5latestfile=$(echo -e "${get5lastbuild}" | jq -r '.fileName') get5latestfilepath=$(echo -e "${get5lastbuild}" | jq -r '.relativePath') get5url="https://ci.splewis.net/job/get5/lastSuccessfulBuild/artifact/${get5latestfilepath}" -csgopuglatest=$(curl -sL https://api.github.com/repos/splewis/csgo-pug-setup/releases/latest | jq '.assets[]') +csgopuglatest=$(curl --connect-timeout 10 -sL https://api.github.com/repos/splewis/csgo-pug-setup/releases/latest | jq '.assets[]') csgopuglatestfile=$(echo -e "${csgopuglatest}" | jq -r '.name') csgopuglatestlink=$(echo -e "${csgopuglatest}" | jq -r '.browser_download_url') # Oxide -oxiderustlatestlink=$(curl -sL https://api.github.com/repos/OxideMod/Oxide.Rust/releases/latest | jq -r '.assets[]|select(.browser_download_url | contains("linux")) | .browser_download_url') -oxidehurtworldlatestlink=$(curl -sL https://api.github.com/repos/OxideMod/Oxide.Hurtworld/releases/latest | jq -r '.assets[].browser_download_url') -oxidesdtdlatestlink=$(curl -sL https://api.github.com/repos/OxideMod/Oxide.SevenDaysToDie/releases/latest | jq -r '.assets[]|select(.browser_download_url | contains("linux")) | .browser_download_url' ) +oxiderustlatestlink=$(curl --connect-timeout 10 -sL https://api.github.com/repos/OxideMod/Oxide.Rust/releases/latest | jq -r '.assets[]|select(.browser_download_url | contains("linux")) | .browser_download_url') +oxidehurtworldlatestlink=$(curl --connect-timeout 10 -sL https://api.github.com/repos/OxideMod/Oxide.Hurtworld/releases/latest | jq -r '.assets[].browser_download_url') +oxidesdtdlatestlink=$(curl --connect-timeout 10 -sL https://api.github.com/repos/OxideMod/Oxide.SevenDaysToDie/releases/latest | jq -r '.assets[]|select(.browser_download_url | contains("linux")) | .browser_download_url' ) # Define mods information (required) @@ -160,4 +160,4 @@ mod_info_hwoxide=( MOD "hwoxide" "Oxide for Hurtworld" "${oxidehurtworldlatestli mod_info_sdtdoxide=( MOD "sdtdoxide" "Oxide for 7 Days To Die" "${oxidesdtdlatestlink}" "Oxide.SevenDaysToDie.zip" "0" "LowercaseOff" "${systemdir}" "OVERWRITE" "ENGINES" "7 Days To Die;" "NOTGAMES" "https://umod.org/games/7-days-to-die" "Allows for the use of plugins" ) # REQUIRED: Set all mods info into the global array -mods_global_array=( "${mod_info_metamod[@]}" "${mod_info_base_amxx[@]}" "${mod_info_cs_amxx[@]}" "${mod_info_dod_amxx[@]}" "${mod_info_tfc_amxx[@]}" "${mod_info_ns_amxx[@]}" "${mod_info_ts_amxx[@]}" "${mod_info_metamodsource[@]}" "${mod_info_sourcemod[@]}" "${mod_info_steamworks[@]}" "${mod_info_gokz[@]}" "${mod_info_ttt[@]}" "${mod_info_get5[@]}" "${mod_info_pug[@]}" "${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_pac3[@]}" "${mod_info_wiremod[@]}" "${mod_info_wiremodextras[@]}" "${mod_info_darkrp[@]}" "${mod_info_darkrpmodification[@]}" "${mod_info_rustoxide[@]}" "${mod_info_hwoxide[@]}" "${mod_info_sdtdoxide[@]}" ) \ No newline at end of file +mods_global_array=( "${mod_info_metamod[@]}" "${mod_info_base_amxx[@]}" "${mod_info_cs_amxx[@]}" "${mod_info_dod_amxx[@]}" "${mod_info_tfc_amxx[@]}" "${mod_info_ns_amxx[@]}" "${mod_info_ts_amxx[@]}" "${mod_info_metamodsource[@]}" "${mod_info_sourcemod[@]}" "${mod_info_steamworks[@]}" "${mod_info_gokz[@]}" "${mod_info_ttt[@]}" "${mod_info_get5[@]}" "${mod_info_pug[@]}" "${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_pac3[@]}" "${mod_info_wiremod[@]}" "${mod_info_wiremodextras[@]}" "${mod_info_darkrp[@]}" "${mod_info_darkrpmodification[@]}" "${mod_info_rustoxide[@]}" "${mod_info_hwoxide[@]}" "${mod_info_sdtdoxide[@]}" ) diff --git a/linuxgsm.sh b/linuxgsm.sh index 70a280a32..6c63b1244 100755 --- a/linuxgsm.sh +++ b/linuxgsm.sh @@ -99,7 +99,7 @@ fn_bootstrap_fetch_file(){ # Larger files show a progress bar. echo -en "fetching ${fileurl_name} ${local_filename}...\c" - curlcmd=$(curl -s --fail -L -o "${local_filedir}/${local_filename}" "${fileurl}" 2>&1) + curlcmd=$(curl --connect-timeout 10 -s --fail -L -o "${local_filedir}/${local_filename}" "${fileurl}" 2>&1) local exitcode=$? From b1d866d02371555731461558e10b581958150874 Mon Sep 17 00:00:00 2001 From: Christian Date: Mon, 30 Nov 2020 21:40:14 +0100 Subject: [PATCH 497/534] fix(samp): fix config change after installation (#3119) --- lgsm/functions/core_functions.sh | 5 +++++ lgsm/functions/fix.sh | 4 +++- lgsm/functions/fix_samp.sh | 33 ++++++++++++++++++++++++++++++++ lgsm/functions/install_config.sh | 7 ------- 4 files changed, 41 insertions(+), 8 deletions(-) create mode 100644 lgsm/functions/fix_samp.sh diff --git a/lgsm/functions/core_functions.sh b/lgsm/functions/core_functions.sh index 21ef3cbd1..2fc75f02f 100755 --- a/lgsm/functions/core_functions.sh +++ b/lgsm/functions/core_functions.sh @@ -430,6 +430,11 @@ functionfile="${FUNCNAME[0]}" fn_fetch_function } +fix_samp.sh(){ +functionfile="${FUNCNAME[0]}" +fn_fetch_function +} + fix_sdtd.sh(){ functionfile="${FUNCNAME[0]}" fn_fetch_function diff --git a/lgsm/functions/fix.sh b/lgsm/functions/fix.sh index f92709f56..2e2931e41 100755 --- a/lgsm/functions/fix.sh +++ b/lgsm/functions/fix.sh @@ -91,7 +91,7 @@ fi # Fixes that are run on install only. if [ "${commandname}" == "INSTALL" ]; then - if [ "${shortname}" == "av" ]||[ "${shortname}" == "cmw" ]||[ "${shortname}" == "kf" ]||[ "${shortname}" == "kf2" ]||[ "${shortname}" == "onset" ]||[ "${shortname}" == "ro" ]||[ "${shortname}" == "ut2k4" ]||[ "${shortname}" == "ut" ]||[ "${shortname}" == "ut3" ]; then + if [ "${shortname}" == "av" ]||[ "${shortname}" == "cmw" ]||[ "${shortname}" == "kf" ]||[ "${shortname}" == "kf2" ]||[ "${shortname}" == "onset" ]||[ "${shortname}" == "ro" ]||[ "${shortname}" == "samp" ]||[ "${shortname}" == "ut2k4" ]||[ "${shortname}" == "ut" ]||[ "${shortname}" == "ut3" ]; then echo -e "" echo -e "Applying Post-Install Fixes" echo -e "=================================" @@ -105,6 +105,8 @@ if [ "${commandname}" == "INSTALL" ]; then fix_kf2.sh elif [ "${shortname}" == "ro" ]; then fix_ro.sh + elif [ "${shortname}" == "samp" ]; then + fix_samp.sh elif [ "${shortname}" == "ut2k4" ]; then fix_ut2k4.sh elif [ "${shortname}" == "ut" ]; then diff --git a/lgsm/functions/fix_samp.sh b/lgsm/functions/fix_samp.sh new file mode 100644 index 000000000..b69779019 --- /dev/null +++ b/lgsm/functions/fix_samp.sh @@ -0,0 +1,33 @@ +#!/bin/bash +# LinuxGSM fix_sfc.sh function +# Author: Christian Birk +# Website: https://linuxgsm.com +# Description: Resolves issue that the default rcon password is not changed + +functionselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" + +if [ -f "${servercfgfullpath}" ]; then + # check if default password is set "changeme" + currentpass=$(grep -E "^rcon_password" "${servercfgfullpath}" | sed 's/^rcon_password //' ) + defaultpass="changeme" + # check if default password is set + if [ "${currentpass}" == "${defaultpass}" ]; then + fixname="change default rcon password" + fn_fix_msg_start + fn_script_log_info "changing rcon/admin password." + random=$(tr -dc A-Za-z0-9_ < /dev/urandom | head -c 8 | xargs) + rconpass="admin${random}" + sed -i "s/rcon_password changeme/rcon_password ${rconpass}/g" "${servercfgfullpath}" + fn_fix_msg_end + fi + # check if the hostname is the default name + currenthostname=$(grep -E "^hostname" "${servercfgfullpath}" | sed 's/^hostname //') + defaulthostname="SA-MP 0.3 Server" + if [ "${currenthostname}" == "${defaulthostname}" ]; then + fixname="change default hostname" + fn_fix_msg_start + fn_script_log_info "changing default hostname to LinuxGSM" + sed -i "s/hostname ${defaulthostname}/hostname LinuxGSM/g" "${servercfgfullpath}" + fn_fix_msg_end + fi +fi diff --git a/lgsm/functions/install_config.sh b/lgsm/functions/install_config.sh index d512f5b68..bf701ebf1 100755 --- a/lgsm/functions/install_config.sh +++ b/lgsm/functions/install_config.sh @@ -660,13 +660,6 @@ elif [ "${shortname}" == "rust" ]; then fn_fetch_default_config fn_default_config_remote fn_list_config_locations -elif [ "${shortname}" == "samp" ]; then - gamedirname="SanAndreasMultiplayer" - array_configs+=( server.cfg ) - fn_fetch_default_config - fn_default_config_remote - fn_set_config_vars - fn_list_config_locations elif [ "${shortname}" == "sol" ]; then gamedirname="Soldat" array_configs+=( soldat.ini ) From b513e8c8b81f7522bc568cfb425a9fdd23c428f6 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Tue, 1 Dec 2020 20:13:28 +0000 Subject: [PATCH 498/534] codacy changes --- lgsm/functions/mods_core.sh | 94 ++++++++++++++++++------------------- 1 file changed, 47 insertions(+), 47 deletions(-) diff --git a/lgsm/functions/mods_core.sh b/lgsm/functions/mods_core.sh index 535703430..66cc71d71 100755 --- a/lgsm/functions/mods_core.sh +++ b/lgsm/functions/mods_core.sh @@ -512,10 +512,10 @@ fn_mod_exist(){ fn_mod_required_fail_exist(){ modreq=$1 - # requires one parameter, the mod + # requires one parameter, the mod fn_script_log_fatal "${modreq}-files.txt is empty: unable to find ${modreq} installed" echo -en "* Unable to find '${modreq}' which is required prior to installing this mod..." - fn_print_fail_eol_nl + fn_print_fail_eol_nl core_exit.sh } @@ -527,32 +527,32 @@ fn_mod_liblist_gam_filenames(){ # default libraries case ${gamename} in - "Counter-Strike 1.6") + "Counter-Strike 1.6") moddll="mp.dll" modso="cs.so" moddylib="cs.dylib" ;; - "Day of Defeat") + "Day of Defeat") moddll="dod.dll" modso="dod.so" moddylib="dod.dylib" ;; - "Team Fortress Classic") + "Team Fortress Classic") moddll="tfc.dll" modso="tfc.so" moddylib="tfc.dylib" ;; - "Natural Selection") + "Natural Selection") moddll="ns.dll" modso="ns_i386.so" moddylib="" ;; - "The Specialists") + "The Specialists") moddll="mp.dll" modso="ts_i386.so" moddylib="" ;; - "Half-Life: Deathmatch") + "Half-Life: Deathmatch") moddll="hl.dll" modso="hl.so" moddylib="hl.dylib" @@ -570,32 +570,32 @@ fn_mod_install_liblist_gam_file(){ logentry="sed replace (dlls\\${moddll}) ${modinstalldir}/liblist.gam" echo -en "modifying gamedll in liblist.gam..." rpldll="s/dlls\\\\${moddll}/addons\/metamod\/dlls\/metamod.dll/g" - sed -i $rpldll ${modinstalldir}/liblist.gam - grep -q "addons/metamod/dlls/metamod.dll" ${modinstalldir}/liblist.gam + sed -i $rpldll "${modinstalldir}/liblist.gam" + grep -q "addons/metamod/dlls/metamod.dll" "${modinstalldir}/liblist.gam" exitcode=$? # if replacement back didn't happen, error out. if [ "${exitcode}" != 0 ]; then - fn_script_log_fatal $logentry + fn_script_log_fatal ${logentry} fn_print_fail_eol_nl else - fn_script_log_pass $logentry - fn_print_ok_eol_nl + fn_script_log_pass ${logentry} + fn_print_ok_eol_nl fi # modify the liblist.gam file to initialize metamod logentry="sed replace (dlls\\${modso}) ${modinstalldir}/liblist.gam" echo -en "modifying gamedll_linux in liblist.gam..." rplso="s/dlls\/${modso}/addons\/metamod\/dlls\/metamod.so/g" - sed -i $rplso ${modinstalldir}/liblist.gam - grep -q "addons/metamod/dlls/metamod.so" ${modinstalldir}/liblist.gam + sed -i $rplso "${modinstalldir}/liblist.gam" + grep -q "addons/metamod/dlls/metamod.so" "${modinstalldir}/liblist.gam" exitcode=$? # if replacement back didn't happen, error out if [ "${exitcode}" != 0 ]; then - fn_script_log_fatal $logentry + fn_script_log_fatal ${logentry} fn_print_fail_eol_nl else - fn_script_log_pass $logentry - fn_print_ok_eol_nl + fn_script_log_pass ${logentry} + fn_print_ok_eol_nl fi # mac os needs to be checked not all mods support mac os @@ -605,14 +605,14 @@ fn_mod_install_liblist_gam_file(){ echo -en "modifying gamedll_osx in liblist.gam..." rpldylib="s/dlls\/${moddylib}/addons\/metamod\/dlls\/metamod.dylib/g" sed -i $rpldylib ${modinstalldir}/liblist.gam - grep -q "addons/metamod/dlls/metamod.dylib" ${modinstalldir}/liblist.gam + grep -q "addons/metamod/dlls/metamod.dylib" "${modinstalldir}/liblist.gam" exitcode=$? # if replacement back didn't happen, error out. if [ "${exitcode}" != 0 ]; then - fn_script_log_fatal $logentry + fn_script_log_fatal ${logentry} fn_print_fail_eol_nl else - fn_script_log_pass $logentry + fn_script_log_pass ${logentry} fn_print_ok_eol_nl fi fi @@ -628,15 +628,15 @@ fn_mod_remove_liblist_gam_file(){ logentry="sed replace (addons/metamod/dlls/metamod.dll) ${modinstalldir}/liblist.gam" echo -en "modifying gamedll in liblist.gam..." rpldll="s/addons\/metamod\/dlls\/metamod.dll/dlls\\\\${moddll}/g" - sed -i $rpldll ${modinstalldir}/liblist.gam - grep -q "${moddll}" ${modinstalldir}/liblist.gam + sed -i $rpldll "${modinstalldir}/liblist.gam" + grep -q "${moddll}" "${modinstalldir}/liblist.gam" exitcode=$? # if replacement back didn't happen, error out. if [ "${exitcode}" != 0 ]; then - fn_script_log_fatal $logentry + fn_script_log_fatal ${logentry} fn_print_fail_eol_nl else - fn_script_log_pass $logentry + fn_script_log_pass ${logentry} fn_print_ok_eol_nl fi @@ -644,15 +644,15 @@ fn_mod_remove_liblist_gam_file(){ logentry="sed replace (addons/metamod/dlls/metamod.so) ${modinstalldir}/liblist.gam" echo -en "modifying gamedll_linux in liblist.gam..." rplso="s/addons\/metamod\/dlls\/metamod.so/dlls\/${modso}/g" - sed -i $rplso ${modinstalldir}/liblist.gam - grep -q "${modso}" ${modinstalldir}/liblist.gam + sed -i $rplso "${modinstalldir}/liblist.gam" + grep -q "${modso}" "${modinstalldir}/liblist.gam" exitcode=$? # if replacement back didn't happen, error out if [ "${exitcode}" != 0 ]; then - fn_script_log_fatal $logentry + fn_script_log_fatal ${logentry} fn_print_fail_eol_nl else - fn_script_log_pass $logentry + fn_script_log_pass ${logentry} fn_print_ok_eol_nl fi @@ -662,15 +662,15 @@ fn_mod_remove_liblist_gam_file(){ logentry="sed replace (addons/metamod/dlls/metamod.dylib) ${modinstalldir}/liblist.gam" echo -en "modifying gamedll_osx in liblist.gam..." rpldylib="s/addons\/metamod\/dlls\/metamod.dylib/dlls\/${moddylib}/g" - sed -i $rpldylib ${modinstalldir}/liblist.gam - grep -q "${moddylib}" ${modinstalldir}/liblist.gam + sed -i $rpldylib "${modinstalldir}/liblist.gam" + grep -q "${moddylib}" "${modinstalldir}/liblist.gam" # if replacement back didn't happen, error out. exitcode=$? if [ "${exitcode}" != 0 ]; then - fn_script_log_fatal $logentry + fn_script_log_fatal ${logentry} fn_print_fail_eol_nl else - fn_script_log_pass $logentry + fn_script_log_pass ${logentry} fn_print_ok_eol_nl fi fi @@ -683,30 +683,30 @@ fn_mod_install_amxmodx_file(){ # since it does exist, is the entry already in plugins.ini logentry="line (linux addons/amxmodx/dlls/amxmodx_mm_i386.so) inserted into ${modinstalldir}/addons/metamod/plugins.ini" echo -en "adding amxmodx_mm_i386.so in plugins.ini..." - grep -q "amxmodx_mm_i386.so" ${modinstalldir}/addons/metamod/plugins.ini + grep -q "amxmodx_mm_i386.so" "${modinstalldir}/addons/metamod/plugins.ini" exitcode=$? if [ "${exitcode}" != 0 ]; then # file exists but the entry does not, let's add it - echo "linux addons/amxmodx/dlls/amxmodx_mm_i386.so" >> ${modinstalldir}/addons/metamod/plugins.ini + echo "linux addons/amxmodx/dlls/amxmodx_mm_i386.so" >> "${modinstalldir}/addons/metamod/plugins.ini" exitcode=$? if [ "${exitcode}" != 0 ]; then - fn_script_log_fatal $logentry + fn_script_log_fatal ${logentry} fn_print_fail_eol_nl else - fn_script_log_pass $logentry + fn_script_log_pass ${logentry} fn_print_ok_eol_nl fi fi - else + else # create new file and add the mod to it - echo "linux addons/amxmodx/dlls/amxmodx_mm_i386.so" > ${modinstalldir}/addons/metamod/plugins.ini + echo "linux addons/amxmodx/dlls/amxmodx_mm_i386.so" > "${modinstalldir}/addons/metamod/plugins.ini" exitcode=$? if [ "${exitcode}" != 0 ]; then - fn_script_log_fatal $logentry + fn_script_log_fatal ${logentry} fn_print_fail_eol_nl core_exit.sh else - fn_script_log_pass $logentry + fn_script_log_pass ${logentry} fn_print_ok_eol_nl fi fi @@ -717,26 +717,26 @@ fn_mod_remove_amxmodx_file(){ # since it does exist, is the entry already in plugins.ini logentry="line (linux addons/amxmodx/dlls/amxmodx_mm_i386.so) removed from ${modinstalldir}/addons/metamod/plugins.ini" echo -en "removing amxmodx_mm_i386.so in plugins.ini..." - grep -q "linux addons/amxmodx/dlls/amxmodx_mm_i386.so" ${modinstalldir}/addons/metamod/plugins.ini + grep -q "linux addons/amxmodx/dlls/amxmodx_mm_i386.so" "${modinstalldir}/addons/metamod/plugins.ini" # iIs it found? If so remove it and clean up exitcode=$? if [ "${exitcode}" == 0 ]; then # delete the line we inserted - sed -i '/linux addons\/amxmodx\/dlls\/amxmodx_mm_i386.so/d' ${modinstalldir}/addons/metamod/plugins.ini + sed -i '/linux addons\/amxmodx\/dlls\/amxmodx_mm_i386.so/d' "${modinstalldir}/addons/metamod/plugins.ini" # remove empty lines - sed -i '/^$/d' ${modinstalldir}/addons/metamod/plugins.ini + sed -i '/^$/d' "${modinstalldir}/addons/metamod/plugins.ini" exitcode=$? if [ "${exitcode}" != 0 ]; then - fn_script_log_fatal $logentry + fn_script_log_fatal ${logentry} fn_print_fail_eol_nl else - fn_script_log_pass $logentry + fn_script_log_pass ${logentry} fn_print_ok_eol_nl fi # if file is empty, remove it. if [ -f "${modinstalldir}/addons/metamod/plugins.ini" ]; then - rm ${modinstalldir}/addons/metamod/plugins.ini + rm "${modinstalldir}/addons/metamod/plugins.ini" fn_script_log_pass "file removed ${modinstalldir}/addons/metamod/plugins.ini because it was empty" fi fi From b19c9a0a4a29eda2db27546519d53b7ade15048e Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Fri, 4 Dec 2020 13:33:45 +0000 Subject: [PATCH 499/534] Revert "feat: improve uniqueness tmux session name (#3081)" This reverts commit 990edfd775ec0b3dcd091b3017d94cdb2b88ce6b. --- lgsm/functions/check_status.sh | 6 +----- lgsm/functions/command_console.sh | 2 +- lgsm/functions/command_start.sh | 6 +++--- lgsm/functions/command_stop.sh | 2 +- lgsm/functions/info_distro.sh | 2 +- 5 files changed, 7 insertions(+), 11 deletions(-) diff --git a/lgsm/functions/check_status.sh b/lgsm/functions/check_status.sh index a473aff73..178adcf6b 100755 --- a/lgsm/functions/check_status.sh +++ b/lgsm/functions/check_status.sh @@ -7,8 +7,4 @@ functionselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" -if [ "$(tmux list-sessions -F "#{session_name}" 2>/dev/null)" == "${sessionname}${port}" ]; then - status=1; -else - status=0; -fi +status=$(tmux list-sessions -F "#{session_name}" 2>/dev/null | grep -Ecx "^${sessionname}") diff --git a/lgsm/functions/command_console.sh b/lgsm/functions/command_console.sh index 36ca7e092..0de924ea6 100755 --- a/lgsm/functions/command_console.sh +++ b/lgsm/functions/command_console.sh @@ -41,7 +41,7 @@ check_status.sh if [ "${status}" != "0" ]; then fn_print_ok_nl "Accessing console" fn_script_log_pass "Console accessed" - tmux attach-session -t "${sessionname}${port}" + tmux attach-session -t "${sessionname}" fn_print_ok_nl "Closing console" fn_script_log_pass "Console closed" else diff --git a/lgsm/functions/command_start.sh b/lgsm/functions/command_start.sh index 3ebbc8871..62160e187 100755 --- a/lgsm/functions/command_start.sh +++ b/lgsm/functions/command_start.sh @@ -36,7 +36,7 @@ fn_start_teamspeak3(){ # Used to allow update to detect JK2MV server version. fn_start_jk2(){ fn_start_tmux - tmux send -t "${sessionname}${port}" version ENTER > /dev/null 2>&1 + tmux send -t "${sessionname}" version ENTER > /dev/null 2>&1 } fn_start_tmux(){ @@ -72,7 +72,7 @@ fn_start_tmux(){ # Create lockfile date '+%s' > "${lockdir}/${selfname}.lock" cd "${executabledir}" || exit - tmux new-session -d -x "${sessionwidth}" -y "${sessionheight}" -s "${sessionname}${port}" "${executable} ${parms}" 2> "${lgsmlogdir}/.${selfname}-tmux-error.tmp" + tmux new-session -d -x "${sessionwidth}" -y "${sessionheight}" -s "${sessionname}" "${executable} ${parms}" 2> "${lgsmlogdir}/.${selfname}-tmux-error.tmp" # Create logfile. touch "${consolelog}" @@ -130,7 +130,7 @@ fn_start_tmux(){ echo -e "" echo -e "Command" echo -e "=================================" - echo -e "tmux new-session -d -s \"${sessionname} ${port}\" \"${executable} ${parms}\"" | tee -a "${lgsmlog}" + echo -e "tmux new-session -d -s \"${sessionname}\" \"${executable} ${parms}\"" | tee -a "${lgsmlog}" echo -e "" echo -e "Error" echo -e "=================================" diff --git a/lgsm/functions/command_stop.sh b/lgsm/functions/command_stop.sh index bde89dd13..439967fd0 100644 --- a/lgsm/functions/command_stop.sh +++ b/lgsm/functions/command_stop.sh @@ -15,7 +15,7 @@ fn_stop_graceful_ctrlc(){ fn_print_dots "Graceful: CTRL+c" fn_script_log_info "Graceful: CTRL+c" # Sends quit. - tmux send-keys -t "${sessionname}${port}" C-c > /dev/null 2>&1 + tmux send-keys -t "${sessionname}" C-c > /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 diff --git a/lgsm/functions/info_distro.sh b/lgsm/functions/info_distro.sh index 53e8f4943..11da3cc63 100755 --- a/lgsm/functions/info_distro.sh +++ b/lgsm/functions/info_distro.sh @@ -9,7 +9,7 @@ functionselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" ### Game Server pid if [ "${status}" == "1" ]; then - gameserverpid=$(tmux list-sessions -F "#{session_name} #{pane_pid}" | grep "^${sessionname}${port}" | awk '{print $NF}') + gameserverpid=$(tmux list-sessions -F "#{session_name} #{pane_pid}" | grep "^${sessionname} " | awk '{print $NF}') fi ### Distro information From 4659f9894170887bb72b2c5ff6a76c14210eefaf Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Fri, 4 Dec 2020 14:01:56 +0000 Subject: [PATCH 500/534] codacy codacy --- lgsm/functions/mods_core.sh | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/lgsm/functions/mods_core.sh b/lgsm/functions/mods_core.sh index 66cc71d71..47dac4b78 100755 --- a/lgsm/functions/mods_core.sh +++ b/lgsm/functions/mods_core.sh @@ -575,10 +575,10 @@ fn_mod_install_liblist_gam_file(){ exitcode=$? # if replacement back didn't happen, error out. if [ "${exitcode}" != 0 ]; then - fn_script_log_fatal ${logentry} + fn_script_log_fatal "${logentry}" fn_print_fail_eol_nl else - fn_script_log_pass ${logentry} + fn_script_log_pass "${logentry}" fn_print_ok_eol_nl fi @@ -591,10 +591,10 @@ fn_mod_install_liblist_gam_file(){ exitcode=$? # if replacement back didn't happen, error out if [ "${exitcode}" != 0 ]; then - fn_script_log_fatal ${logentry} + fn_script_log_fatal "${logentry}" fn_print_fail_eol_nl else - fn_script_log_pass ${logentry} + fn_script_log_pass "${logentry}" fn_print_ok_eol_nl fi @@ -604,7 +604,7 @@ fn_mod_install_liblist_gam_file(){ logentry="sed replace (dlls\\${moddylib}) ${modinstalldir}/liblist.gam" echo -en "modifying gamedll_osx in liblist.gam..." rpldylib="s/dlls\/${moddylib}/addons\/metamod\/dlls\/metamod.dylib/g" - sed -i $rpldylib ${modinstalldir}/liblist.gam + sed -i $rpldylib "${modinstalldir}/liblist.gam" grep -q "addons/metamod/dlls/metamod.dylib" "${modinstalldir}/liblist.gam" exitcode=$? # if replacement back didn't happen, error out. From b7c8f9e5485fdafa6828ee1340ac469785dc4071 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Fri, 4 Dec 2020 14:21:06 +0000 Subject: [PATCH 501/534] v20.6.0 --- lgsm/functions/core_functions.sh | 2 +- linuxgsm.sh | 2 +- tests/tests_fctrserver.sh | 2 +- tests/tests_jc2server.sh | 2 +- tests/tests_mcserver.sh | 2 +- tests/tests_ts3server.sh | 2 +- 6 files changed, 6 insertions(+), 6 deletions(-) diff --git a/lgsm/functions/core_functions.sh b/lgsm/functions/core_functions.sh index 2fc75f02f..5250e7080 100755 --- a/lgsm/functions/core_functions.sh +++ b/lgsm/functions/core_functions.sh @@ -7,7 +7,7 @@ functionselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" -modulesversion="v20.5.1" +modulesversion="v20.6.0" # Core diff --git a/linuxgsm.sh b/linuxgsm.sh index 6c63b1244..3c105f4a5 100755 --- a/linuxgsm.sh +++ b/linuxgsm.sh @@ -20,7 +20,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="v20.5.1" +version="v20.6.0" shortname="core" gameservername="core" commandname="CORE" diff --git a/tests/tests_fctrserver.sh b/tests/tests_fctrserver.sh index afb2f8ded..450c2bcf7 100644 --- a/tests/tests_fctrserver.sh +++ b/tests/tests_fctrserver.sh @@ -20,7 +20,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="v20.5.1" +version="v20.6.0" shortname="fctr" gameservername="fctrserver" commandname="CORE" diff --git a/tests/tests_jc2server.sh b/tests/tests_jc2server.sh index 34cea40e4..15261bf33 100644 --- a/tests/tests_jc2server.sh +++ b/tests/tests_jc2server.sh @@ -20,7 +20,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="v20.5.1" +version="v20.6.0" shortname="jc2" gameservername="jc2server" commandname="CORE" diff --git a/tests/tests_mcserver.sh b/tests/tests_mcserver.sh index f253df31a..e501772fb 100644 --- a/tests/tests_mcserver.sh +++ b/tests/tests_mcserver.sh @@ -20,7 +20,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="v20.5.1" +version="v20.6.0" shortname="mc" gameservername="mcserver" commandname="CORE" diff --git a/tests/tests_ts3server.sh b/tests/tests_ts3server.sh index cf5d5ebd1..0243bf580 100644 --- a/tests/tests_ts3server.sh +++ b/tests/tests_ts3server.sh @@ -20,7 +20,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="v20.5.1" +version="v20.6.0" shortname="ts3" gameservername="ts3server" commandname="CORE" From 0b38915f03eb6284654bf360fcc3a19ee10310dd Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Fri, 4 Dec 2020 14:28:25 +0000 Subject: [PATCH 502/534] feat:add version and port details to lockfile --- lgsm/functions/command_debug.sh | 2 ++ lgsm/functions/command_monitor.sh | 6 ++++-- lgsm/functions/command_start.sh | 2 ++ tests/tests_fctrserver.sh | 2 ++ tests/tests_jc2server.sh | 2 ++ tests/tests_mcserver.sh | 2 ++ tests/tests_ts3server.sh | 2 ++ 7 files changed, 16 insertions(+), 2 deletions(-) diff --git a/lgsm/functions/command_debug.sh b/lgsm/functions/command_debug.sh index 059cf539a..fe2e8a38e 100755 --- a/lgsm/functions/command_debug.sh +++ b/lgsm/functions/command_debug.sh @@ -95,6 +95,8 @@ fn_print_ok_nl "Starting debug" # Create lockfile. date '+%s' > "${lockdir}/${selfname}.lock" +echo "${version}" >> "${lockdir}/${selfname}.lock" +echo "${port}" >> "${lockdir}/${selfname}.lock" fn_script_log_info "Lockfile generated" fn_script_log_info "${lockdir}/${selfname}.lock" diff --git a/lgsm/functions/command_monitor.sh b/lgsm/functions/command_monitor.sh index 80d3f43f0..28cc70fab 100755 --- a/lgsm/functions/command_monitor.sh +++ b/lgsm/functions/command_monitor.sh @@ -25,8 +25,10 @@ fn_monitor_check_lockfile(){ fi # Fix if lockfile is not unix time or contains letters - if [ -f "${lockdir}/${selfname}.lock" ]&&[[ "$(cat "${lockdir}/${selfname}.lock")" =~ [A-Za-z] ]]; then - date '+%s' > "${lockdir}/${selfname}.lock" + if [ -f "${lockdir}/${selfname}.lock" ]&&[[ "$(head -n 1 "${lockdir}/${selfname}.lock")" =~ [A-Za-z] ]]; then + date '+%s' > "${lockdir}/${selfname}.lock" + echo "${version}" >> "${lockdir}/${selfname}.lock" + echo "${port}" >> "${lockdir}/${selfname}.lock" fi } diff --git a/lgsm/functions/command_start.sh b/lgsm/functions/command_start.sh index 62160e187..897cc90aa 100755 --- a/lgsm/functions/command_start.sh +++ b/lgsm/functions/command_start.sh @@ -71,6 +71,8 @@ fn_start_tmux(){ # Create lockfile date '+%s' > "${lockdir}/${selfname}.lock" + echo "${version}" >> "${lockdir}/${selfname}.lock" + echo "${port}" >> "${lockdir}/${selfname}.lock" cd "${executabledir}" || exit tmux new-session -d -x "${sessionwidth}" -y "${sessionheight}" -s "${sessionname}" "${executable} ${parms}" 2> "${lgsmlogdir}/.${selfname}-tmux-error.tmp" diff --git a/tests/tests_fctrserver.sh b/tests/tests_fctrserver.sh index 450c2bcf7..2c08922c2 100644 --- a/tests/tests_fctrserver.sh +++ b/tests/tests_fctrserver.sh @@ -938,6 +938,8 @@ requiredstatus="OFFLINE" fn_setstatus fn_print_info_nl "creating lockfile." date '+%s' > "${lockdir}/${selfname}.lock" +echo "${version}" >> "${lockdir}/${selfname}.lock" +echo "${port}" >> "${lockdir}/${selfname}.lock" ( exec 5>"${TRAVIS_BUILD_DIR}/dev-debug.log" BASH_XTRACEFD="5" diff --git a/tests/tests_jc2server.sh b/tests/tests_jc2server.sh index 15261bf33..39746de57 100644 --- a/tests/tests_jc2server.sh +++ b/tests/tests_jc2server.sh @@ -1097,6 +1097,8 @@ requiredstatus="OFFLINE" fn_setstatus fn_print_info_nl "creating lockfile." date '+%s' > "${lockdir}/${selfname}.lock" +echo "${version}" >> "${lockdir}/${selfname}.lock" +echo "${port}" >> "${lockdir}/${selfname}.lock" ( exec 5>"${TRAVIS_BUILD_DIR}/dev-debug.log" BASH_XTRACEFD="5" diff --git a/tests/tests_mcserver.sh b/tests/tests_mcserver.sh index e501772fb..221e11856 100644 --- a/tests/tests_mcserver.sh +++ b/tests/tests_mcserver.sh @@ -970,6 +970,8 @@ requiredstatus="OFFLINE" fn_setstatus fn_print_info_nl "creating lockfile." date '+%s' > "${lockdir}/${selfname}.lock" +echo "${version}" >> "${lockdir}/${selfname}.lock" +echo "${port}" >> "${lockdir}/${selfname}.lock" ( exec 5>"${TRAVIS_BUILD_DIR}/dev-debug.log" BASH_XTRACEFD="5" diff --git a/tests/tests_ts3server.sh b/tests/tests_ts3server.sh index 0243bf580..be72227f1 100644 --- a/tests/tests_ts3server.sh +++ b/tests/tests_ts3server.sh @@ -937,6 +937,8 @@ requiredstatus="OFFLINE" fn_setstatus fn_print_info_nl "creating lockfile." date '+%s' > "${lockdir}/${selfname}.lock" +echo "${version}" >> "${lockdir}/${selfname}.lock" +echo "${port}" >> "${lockdir}/${selfname}.lock" ( exec 5>"${TRAVIS_BUILD_DIR}/dev-debug.log" BASH_XTRACEFD="5" From e405e84b0f6e90a11b3ee8e00a2559a13177d401 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Fri, 4 Dec 2020 20:56:14 +0000 Subject: [PATCH 503/534] updated PVR _default.cfg --- .../config-lgsm/pvrserver/_default.cfg | 45 +++++++++++-------- 1 file changed, 27 insertions(+), 18 deletions(-) diff --git a/lgsm/config-default/config-lgsm/pvrserver/_default.cfg b/lgsm/config-default/config-lgsm/pvrserver/_default.cfg index f51bd9ea4..0177b2a95 100644 --- a/lgsm/config-default/config-lgsm/pvrserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/pvrserver/_default.cfg @@ -1,27 +1,33 @@ ################################## ######## 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 +# DO NOT EDIT, ANY CHANGES 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 #### +#### Game Server Settings #### -## Server Start Settings | https://docs.linuxgsm.com/configuration/start-parameters +## Predefined Parameters | https://docs.linuxgsm.com/configuration/start-parameters ip="0.0.0.0" port="7777" # Maps: bridge, datacenter, sand defaultmap="datacenter" -## Server Start Command | https://docs.linuxgsm.com/configuration/start-parameters#additional-parameters +## Server Parameters | https://docs.linuxgsm.com/configuration/start-parameters#additional-parameters fn_parms(){ parms="${defaultmap} -log -MultiHome=${ip} -Port=${port}" } #### LinuxGSM Settings #### +## LinuxGSM Stats +# Send useful stats to LinuxGSM developers. +# https://docs.linuxgsm.com/configuration/linuxgsm-stats +# (on|off) +stats="off" + ## Notification Alerts # (on|off) @@ -30,8 +36,6 @@ displayip="" # More info | https://docs.linuxgsm.com/alerts#more-info postalert="off" -postdays="7" -posttarget="https://hastebin.com" # Discord Alerts | https://docs.linuxgsm.com/alerts/discord discordalert="off" @@ -63,6 +67,7 @@ channeltag="" # Pushover Alerts | https://docs.linuxgsm.com/alerts/pushover pushoveralert="off" pushovertoken="accesstoken" +pushoveruserkey="userkey" # Rocket.Chat Alerts | https://docs.linuxgsm.com/alerts/rocket.chat rocketchatalert="off" @@ -74,8 +79,8 @@ slackalert="off" slackwebhook="webhook" # Telegram Alerts | https://docs.linuxgsm.com/alerts/telegram -# You can add a custom cURL string eg proxy (useful in Russia) or else in "curlcustomstring". -# like a "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help", if you not need +# You can add a custom cURL string eg proxy (useful in Russia) in "curlcustomstring". +# For example "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help". telegramalert="off" telegramtoken="accesstoken" telegramchatid="" @@ -97,12 +102,12 @@ logdays="7" # Query delay time querydelay="1" -#### LinuxGSM Advanced Settings #### - -# ANSI Colors +## ANSI Colors | https://docs.linuxgsm.com/features/ansi-colors ansi="on" -# Message Display Time +#### Advanced Settings #### + +## Message Display Time | https://docs.linuxgsm.com/features/message-display-time sleeptime="0.5" ## SteamCMD Settings | https://docs.linuxgsm.com/steamcmd @@ -130,14 +135,18 @@ stopmode="2" ## Query mode # 1: session only -# 2: gamedig + gsquery +# 2: gamedig (gsquery fallback) # 3: gamedig # 4: gsquery # 5: tcp querymode="1" querytype="" -## LinuxGSM Server Details +## Console type +consoleverbose="no" +consoleinteract="no" + +## Game Server Details # Do not edit gamename="Pavlov VR" engine="unreal4" @@ -146,7 +155,7 @@ glibc="2.17" #### Directories #### # Edit with care -## Server Specific Directories +## Game Server Directories systemdir="${serverfiles}/Pavlov" executabledir="${systemdir}/Binaries/Linux" executable="./PavlovServer" From 6bf2351a77953dd7b9730419e2a7128cb514da35 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Fri, 4 Dec 2020 21:24:01 +0000 Subject: [PATCH 504/534] code tidy codacy --- lgsm/functions/core_dl.sh | 4 ++-- lgsm/functions/install_config.sh | 2 +- lgsm/functions/mods_core.sh | 14 +++++++------- 3 files changed, 10 insertions(+), 10 deletions(-) diff --git a/lgsm/functions/core_dl.sh b/lgsm/functions/core_dl.sh index ea20002a8..03ff54383 100755 --- a/lgsm/functions/core_dl.sh +++ b/lgsm/functions/core_dl.sh @@ -377,7 +377,7 @@ fn_fetch_file_github(){ fn_fetch_config(){ github_file_url_dir="${1}" github_file_url_name="${2}" - # If master branch will currently running LinuxGSM version to prevent "version mixing". This is ignored if a fork. + # If master branch will currently running LinuxGSM version to prevent "version mixing". This is ignored if a fork. if [ "${githubbranch}" == "master" ]&&[ "${githubuser}" == "GameServerManager" ]&&[ "${commandname}" != "UPDATE-LGSM" ]; then remote_fileurl="https://raw.githubusercontent.com/${githubuser}/${githubrepo}/${version}/${github_file_url_dir}/${github_file_url_name}" remote_fileurl_backup="https://bitbucket.org/${githubuser}/${githubrepo}/raw/${version}/${github_file_url_dir}/${github_file_url_name}" @@ -425,7 +425,7 @@ fn_fetch_function(){ fn_update_function(){ github_file_url_dir="lgsm/functions" github_file_url_name="${functionfile}" - # If master branch will currently running LinuxGSM version to prevent "version mixing". This is ignored if a fork. + # If master branch will currently running LinuxGSM version to prevent "version mixing". This is ignored if a fork. if [ "${githubbranch}" == "master" ]&&[ "${githubuser}" == "GameServerManager" ]&&[ "${commandname}" != "UPDATE-LGSM" ]; then remote_fileurl="https://raw.githubusercontent.com/${githubuser}/${githubrepo}/${version}/${github_file_url_dir}/${github_file_url_name}" remote_fileurl_backup="https://bitbucket.org/${githubuser}/${githubrepo}/raw/${version}/${github_file_url_dir}/${github_file_url_name}" diff --git a/lgsm/functions/install_config.sh b/lgsm/functions/install_config.sh index bf701ebf1..fbff9dbbb 100755 --- a/lgsm/functions/install_config.sh +++ b/lgsm/functions/install_config.sh @@ -576,7 +576,7 @@ elif [ "${shortname}" == "mumble" ]; then fn_fetch_default_config fn_default_config_remote fn_list_config_locations -elif [ "${gamename}" == "Pavlov VR" ]; then +elif [ "${shortname}" == "pvr" ]; then gamedirname="PavlovVR" fn_check_cfgdir array_configs+=( Game.ini ) diff --git a/lgsm/functions/mods_core.sh b/lgsm/functions/mods_core.sh index 47dac4b78..010ff109e 100755 --- a/lgsm/functions/mods_core.sh +++ b/lgsm/functions/mods_core.sh @@ -609,7 +609,7 @@ fn_mod_install_liblist_gam_file(){ exitcode=$? # if replacement back didn't happen, error out. if [ "${exitcode}" != 0 ]; then - fn_script_log_fatal ${logentry} + fn_script_log_fatal "${logentry}" fn_print_fail_eol_nl else fn_script_log_pass ${logentry} @@ -633,7 +633,7 @@ fn_mod_remove_liblist_gam_file(){ exitcode=$? # if replacement back didn't happen, error out. if [ "${exitcode}" != 0 ]; then - fn_script_log_fatal ${logentry} + fn_script_log_fatal "${logentry}" fn_print_fail_eol_nl else fn_script_log_pass ${logentry} @@ -649,7 +649,7 @@ fn_mod_remove_liblist_gam_file(){ exitcode=$? # if replacement back didn't happen, error out if [ "${exitcode}" != 0 ]; then - fn_script_log_fatal ${logentry} + fn_script_log_fatal "${logentry}" fn_print_fail_eol_nl else fn_script_log_pass ${logentry} @@ -667,7 +667,7 @@ fn_mod_remove_liblist_gam_file(){ # if replacement back didn't happen, error out. exitcode=$? if [ "${exitcode}" != 0 ]; then - fn_script_log_fatal ${logentry} + fn_script_log_fatal "${logentry}" fn_print_fail_eol_nl else fn_script_log_pass ${logentry} @@ -690,7 +690,7 @@ fn_mod_install_amxmodx_file(){ echo "linux addons/amxmodx/dlls/amxmodx_mm_i386.so" >> "${modinstalldir}/addons/metamod/plugins.ini" exitcode=$? if [ "${exitcode}" != 0 ]; then - fn_script_log_fatal ${logentry} + fn_script_log_fatal "${logentry}" fn_print_fail_eol_nl else fn_script_log_pass ${logentry} @@ -702,7 +702,7 @@ fn_mod_install_amxmodx_file(){ echo "linux addons/amxmodx/dlls/amxmodx_mm_i386.so" > "${modinstalldir}/addons/metamod/plugins.ini" exitcode=$? if [ "${exitcode}" != 0 ]; then - fn_script_log_fatal ${logentry} + fn_script_log_fatal "${logentry}" fn_print_fail_eol_nl core_exit.sh else @@ -727,7 +727,7 @@ fn_mod_remove_amxmodx_file(){ sed -i '/^$/d' "${modinstalldir}/addons/metamod/plugins.ini" exitcode=$? if [ "${exitcode}" != 0 ]; then - fn_script_log_fatal ${logentry} + fn_script_log_fatal "${logentry}" fn_print_fail_eol_nl else fn_script_log_pass ${logentry} From 9254d820b0144d9d2199c6cc8d76bbc1780daae7 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Sat, 5 Dec 2020 11:17:14 +0000 Subject: [PATCH 505/534] fix(monitor):correct monitor not picking up date from lock file --- lgsm/functions/command_monitor.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lgsm/functions/command_monitor.sh b/lgsm/functions/command_monitor.sh index 28cc70fab..edc101012 100755 --- a/lgsm/functions/command_monitor.sh +++ b/lgsm/functions/command_monitor.sh @@ -108,12 +108,12 @@ for queryattempt in {1..5}; do fn_print_querying_eol fn_script_log_info "Querying port: ${querymethod}: ${queryip}:${queryport} : ${queryattempt} : QUERYING" # querydelay - if [ "$(cat "${lockdir}/${selfname}.lock")" -gt "$(date "+%s" -d "${querydelay} mins ago")" ]; then + if [ "$(head -n 1 "${lockdir}/${selfname}.lock")" -gt "$(date "+%s" -d "${querydelay} mins ago")" ]; then fn_print_ok "Querying port: ${querymethod}: ${ip}:${queryport} : ${totalseconds}/${queryattempt}: " fn_print_delay_eol_nl fn_script_log_info "Querying port: ${querymethod}: ${ip}:${queryport} : ${queryattempt} : DELAY" fn_script_log_info "Query bypassed: ${gameservername} started less than ${querydelay} minutes ago" - fn_script_log_info "Server started: $(date -d @$(cat "${lockdir}/${selfname}.lock"))" + fn_script_log_info "Server started: $(date -d @$(head -n 1 "${lockdir}/${selfname}.lock"))" fn_script_log_info "Current time: $(date)" monitorpass=1 core_exit.sh From db559aabe0ed1d2e97cb1a7ac2bc99d028b9d4d0 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Sat, 5 Dec 2020 11:17:54 +0000 Subject: [PATCH 506/534] v20.6.1 --- lgsm/functions/core_functions.sh | 2 +- linuxgsm.sh | 2 +- tests/tests_fctrserver.sh | 2 +- tests/tests_jc2server.sh | 2 +- tests/tests_mcserver.sh | 2 +- tests/tests_ts3server.sh | 2 +- 6 files changed, 6 insertions(+), 6 deletions(-) diff --git a/lgsm/functions/core_functions.sh b/lgsm/functions/core_functions.sh index 5250e7080..b02084256 100755 --- a/lgsm/functions/core_functions.sh +++ b/lgsm/functions/core_functions.sh @@ -7,7 +7,7 @@ functionselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" -modulesversion="v20.6.0" +modulesversion="v20.6.1" # Core diff --git a/linuxgsm.sh b/linuxgsm.sh index 3c105f4a5..18cd88326 100755 --- a/linuxgsm.sh +++ b/linuxgsm.sh @@ -20,7 +20,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="v20.6.0" +version="v20.6.1" shortname="core" gameservername="core" commandname="CORE" diff --git a/tests/tests_fctrserver.sh b/tests/tests_fctrserver.sh index 2c08922c2..1730f7ba1 100644 --- a/tests/tests_fctrserver.sh +++ b/tests/tests_fctrserver.sh @@ -20,7 +20,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="v20.6.0" +version="v20.6.1" shortname="fctr" gameservername="fctrserver" commandname="CORE" diff --git a/tests/tests_jc2server.sh b/tests/tests_jc2server.sh index 39746de57..18e5f964b 100644 --- a/tests/tests_jc2server.sh +++ b/tests/tests_jc2server.sh @@ -20,7 +20,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="v20.6.0" +version="v20.6.1" shortname="jc2" gameservername="jc2server" commandname="CORE" diff --git a/tests/tests_mcserver.sh b/tests/tests_mcserver.sh index 221e11856..8aa7f73c3 100644 --- a/tests/tests_mcserver.sh +++ b/tests/tests_mcserver.sh @@ -20,7 +20,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="v20.6.0" +version="v20.6.1" shortname="mc" gameservername="mcserver" commandname="CORE" diff --git a/tests/tests_ts3server.sh b/tests/tests_ts3server.sh index be72227f1..7c5212f40 100644 --- a/tests/tests_ts3server.sh +++ b/tests/tests_ts3server.sh @@ -20,7 +20,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="v20.6.0" +version="v20.6.1" shortname="ts3" gameservername="ts3server" commandname="CORE" From 67e08ba84ffa300dfa9974bd6f62f66d6d0e4d75 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Fri, 18 Dec 2020 22:10:18 +0000 Subject: [PATCH 507/534] fix(update): fix broken branch selection. (#3130) This change fixes the update command for those on public branches. add fix to core_dl.sh --- lgsm/functions/core_dl.sh | 6 +++--- lgsm/functions/update_steamcmd.sh | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/lgsm/functions/core_dl.sh b/lgsm/functions/core_dl.sh index 03ff54383..35b5e008b 100755 --- a/lgsm/functions/core_dl.sh +++ b/lgsm/functions/core_dl.sh @@ -61,7 +61,7 @@ fn_dl_steamcmd(){ # If using a specific branch. if [ -n "${branch}" ]&&[ -n "${betapassword}" ]; then ${unbuffer} ${steamcmdcommand} +login "${steamuser}" "${steampass}" +force_install_dir "${serverfiles}" +app_set_config 90 mod "${appidmod}" +app_update "${appid}" -beta "${branch}" -betapassword "${betapassword}" ${validate} +quit | uniq | tee -a "${lgsmlog}" "${steamcmdlog}" - elif [ -n "${branch}" ]; then + elif [ -n "${branch}" ]&&[ "${branch}" != "public" ]; then ${unbuffer} ${steamcmdcommand} +login "${steamuser}" "${steampass}" +force_install_dir "${serverfiles}" +app_set_config 90 mod "${appidmod}" +app_update "${appid}" -beta "${branch}" ${validate} +quit | uniq | tee -a "${lgsmlog}" "${steamcmdlog}" else ${unbuffer} ${steamcmdcommand} +login "${steamuser}" "${steampass}" +force_install_dir "${serverfiles}" +app_set_config 90 mod "${appidmod}" +app_update "${appid}" ${validate} +quit | uniq | tee -a "${lgsmlog}" "${steamcmdlog}" @@ -70,7 +70,7 @@ fn_dl_steamcmd(){ elif [ "${shortname}" == "ac" ]||[ "${shortname}" == "jk2" ]; then if [ -n "${branch}" ]&&[ -n "${betapassword}" ]; then ${unbuffer} ${steamcmdcommand} +@sSteamCmdForcePlatformType windows +login "${steamuser}" "${steampass}" +force_install_dir "${serverfiles}" +app_update "${appid}" -beta "${branch}" -betapassword "${betapassword}" ${validate} +quit | uniq | tee -a "${lgsmlog}" "${steamcmdlog}" - elif [ -n "${branch}" ]; then + elif [ -n "${branch}" ]&&[ "${branch}" != "public" ]; then ${unbuffer} ${steamcmdcommand} +@sSteamCmdForcePlatformType windows +login "${steamuser}" "${steampass}" +force_install_dir "${serverfiles}" +app_update "${appid}" -beta "${branch}" ${validate} +quit | uniq | tee -a "${lgsmlog}" "${steamcmdlog}" else ${unbuffer} ${steamcmdcommand} +@sSteamCmdForcePlatformType windows +login "${steamuser}" "${steampass}" +force_install_dir "${serverfiles}" +app_update "${appid}" ${validate} +quit | uniq | tee -a "${lgsmlog}" "${steamcmdlog}" @@ -79,7 +79,7 @@ fn_dl_steamcmd(){ else if [ -n "${branch}" ]&&[ -n "${betapassword}" ]; then ${unbuffer} ${steamcmdcommand} +login "${steamuser}" "${steampass}" +force_install_dir "${serverfiles}" +app_update "${appid}" -beta "${branch}" -betapassword "${betapassword}" ${validate} +quit | uniq | tee -a "${lgsmlog}" "${steamcmdlog}" - elif [ -n "${branch}" ]; then + elif [ -n "${branch}" ]&&[ "${branch}" != "public" ]; then ${unbuffer} ${steamcmdcommand} +login "${steamuser}" "${steampass}" +force_install_dir "${serverfiles}" +app_update "${appid}" -beta "${branch}" ${validate} +quit | uniq | tee -a "${lgsmlog}" "${steamcmdlog}" else ${unbuffer} ${steamcmdcommand} +login "${steamuser}" "${steampass}" +force_install_dir "${serverfiles}" +app_update "${appid}" ${validate} +quit | uniq | tee -a "${lgsmlog}" "${steamcmdlog}" diff --git a/lgsm/functions/update_steamcmd.sh b/lgsm/functions/update_steamcmd.sh index 28496f7d7..8df7b0563 100644 --- a/lgsm/functions/update_steamcmd.sh +++ b/lgsm/functions/update_steamcmd.sh @@ -42,7 +42,7 @@ fn_update_steamcmd_remotebuild(){ if [ -n "${branch}" ]&&[ -n "${betapassword}" ]; then remotebuild=$(${steamcmdcommand} +login "${steamuser}" "${steampass}" +app_info_update 1 +app_info_print "${appid}" -beta "${branch}" -betapassword "${betapassword}" +quit | sed '1,/branches/d' | sed "1,/${branch}/d" | grep -m 1 buildid | tr -cd '[:digit:]') - elif [ -n "${branch}" ]; then + elif [ -n "${branch}" ]&&[ "${branch}" != "public" ]; then remotebuild=$(${steamcmdcommand} +login "${steamuser}" "${steampass}" +app_info_update 1 +app_info_print "${appid}" -beta "${branch}" +quit | sed '1,/branches/d' | sed "1,/${branch}/d" | grep -m 1 buildid | tr -cd '[:digit:]') else remotebuild=$(${steamcmdcommand} +login "${steamuser}" "${steampass}" +app_info_update 1 +app_info_print "${appid}" +quit | sed '1,/branches/d' | sed "1,/${branch}/d" | grep -m 1 buildid | tr -cd '[:digit:]') From 871af8adc99b98acfbf6f437868fe662517f4de8 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Fri, 18 Dec 2020 22:14:04 +0000 Subject: [PATCH 508/534] release v20.6.2 --- lgsm/functions/core_functions.sh | 2 +- tests/tests_fctrserver.sh | 2 +- tests/tests_jc2server.sh | 2 +- tests/tests_mcserver.sh | 2 +- tests/tests_ts3server.sh | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/lgsm/functions/core_functions.sh b/lgsm/functions/core_functions.sh index b02084256..e4da9830f 100755 --- a/lgsm/functions/core_functions.sh +++ b/lgsm/functions/core_functions.sh @@ -7,7 +7,7 @@ functionselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" -modulesversion="v20.6.1" +modulesversion="v20.6.2" # Core diff --git a/tests/tests_fctrserver.sh b/tests/tests_fctrserver.sh index 1730f7ba1..1afa2f60a 100644 --- a/tests/tests_fctrserver.sh +++ b/tests/tests_fctrserver.sh @@ -20,7 +20,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="v20.6.1" +version="v20.6.2" shortname="fctr" gameservername="fctrserver" commandname="CORE" diff --git a/tests/tests_jc2server.sh b/tests/tests_jc2server.sh index 18e5f964b..aab73228d 100644 --- a/tests/tests_jc2server.sh +++ b/tests/tests_jc2server.sh @@ -20,7 +20,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="v20.6.1" +version="v20.6.2" shortname="jc2" gameservername="jc2server" commandname="CORE" diff --git a/tests/tests_mcserver.sh b/tests/tests_mcserver.sh index 8aa7f73c3..edfc620b3 100644 --- a/tests/tests_mcserver.sh +++ b/tests/tests_mcserver.sh @@ -20,7 +20,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="v20.6.1" +version="v20.6.2" shortname="mc" gameservername="mcserver" commandname="CORE" diff --git a/tests/tests_ts3server.sh b/tests/tests_ts3server.sh index 7c5212f40..620eb43ee 100644 --- a/tests/tests_ts3server.sh +++ b/tests/tests_ts3server.sh @@ -20,7 +20,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="v20.6.1" +version="v20.6.2" shortname="ts3" gameservername="ts3server" commandname="CORE" From 37d9d8e748809bc876fb16ac319d7145f00cc604 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Fri, 18 Dec 2020 22:15:31 +0000 Subject: [PATCH 509/534] release v20.6.2 --- linuxgsm.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/linuxgsm.sh b/linuxgsm.sh index 18cd88326..4815e86e3 100755 --- a/linuxgsm.sh +++ b/linuxgsm.sh @@ -20,7 +20,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="v20.6.1" +version="v20.6.2" shortname="core" gameservername="core" commandname="CORE" From 05e236f27ff16ac754f909af4226b533b771f2f7 Mon Sep 17 00:00:00 2001 From: unknowntrojan <14975032+unknowntrojan@users.noreply.github.com> Date: Fri, 25 Dec 2020 15:13:51 +0100 Subject: [PATCH 510/534] fix(stop) stop will clear tmux text before entering stop command (#3142) Tmux will ENTER before using stop command to clear any text entered in teh console --- 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 439967fd0..6fe06e4ef 100644 --- a/lgsm/functions/command_stop.sh +++ b/lgsm/functions/command_stop.sh @@ -43,7 +43,7 @@ fn_stop_graceful_cmd(){ fn_print_dots "Graceful: sending \"${1}\"" fn_script_log_info "Graceful: sending \"${1}\"" # Sends specific stop command. - tmux send -t "${sessionname}" "${1}" ENTER > /dev/null 2>&1 + tmux send -t "${sessionname}" ENTER "${1}" ENTER > /dev/null 2>&1 # Waits up to ${seconds} seconds giving the server time to shutdown gracefully. for ((seconds=1; seconds<=${2}; seconds++)); do check_status.sh From dc6b0378bccea31b576922b243a58349bccfc069 Mon Sep 17 00:00:00 2001 From: Christian Date: Sun, 27 Dec 2020 00:32:00 +0100 Subject: [PATCH 511/534] fix(update): redo steamcmd update part for new behavoir (#3139) Co-authored-by: Daniel Gibbs --- lgsm/functions/update_steamcmd.sh | 9 ++------- 1 file changed, 2 insertions(+), 7 deletions(-) diff --git a/lgsm/functions/update_steamcmd.sh b/lgsm/functions/update_steamcmd.sh index 8df7b0563..b7238daf3 100644 --- a/lgsm/functions/update_steamcmd.sh +++ b/lgsm/functions/update_steamcmd.sh @@ -40,13 +40,8 @@ fn_update_steamcmd_remotebuild(){ find "${HOME}" -type f -name "appinfo.vdf" -exec rm -f {} \; fi - if [ -n "${branch}" ]&&[ -n "${betapassword}" ]; then - remotebuild=$(${steamcmdcommand} +login "${steamuser}" "${steampass}" +app_info_update 1 +app_info_print "${appid}" -beta "${branch}" -betapassword "${betapassword}" +quit | sed '1,/branches/d' | sed "1,/${branch}/d" | grep -m 1 buildid | tr -cd '[:digit:]') - elif [ -n "${branch}" ]&&[ "${branch}" != "public" ]; then - remotebuild=$(${steamcmdcommand} +login "${steamuser}" "${steampass}" +app_info_update 1 +app_info_print "${appid}" -beta "${branch}" +quit | sed '1,/branches/d' | sed "1,/${branch}/d" | grep -m 1 buildid | tr -cd '[:digit:]') - else - remotebuild=$(${steamcmdcommand} +login "${steamuser}" "${steampass}" +app_info_update 1 +app_info_print "${appid}" +quit | sed '1,/branches/d' | sed "1,/${branch}/d" | grep -m 1 buildid | tr -cd '[:digit:]') - fi + # password for branch not needed to check the buildid + remotebuild=$(${steamcmdcommand} +login "${steamuser}" "${steampass}" +app_info_update 1 +app_info_print "${appid}" +quit | sed -e '/"branches"/,/^}/!d' | sed -n "/\"${branch}\"/,/}/p" | grep -m 1 buildid | tr -cd '[:digit:]') if [ "${firstcommandname}" != "INSTALL" ]; then fn_print_dots "Checking remote build: ${remotelocation}" From 55b3bbec6e4072cb56fa729212145d977dcbbe12 Mon Sep 17 00:00:00 2001 From: Christian Date: Sun, 27 Dec 2020 00:33:37 +0100 Subject: [PATCH 512/534] fix(bmdm): add missing dependency ncurses libs (#3138) Co-authored-by: Daniel Gibbs --- lgsm/functions/check_deps.sh | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/lgsm/functions/check_deps.sh b/lgsm/functions/check_deps.sh index 7a43e2f3a..80d33cad9 100755 --- a/lgsm/functions/check_deps.sh +++ b/lgsm/functions/check_deps.sh @@ -385,6 +385,9 @@ fn_deps_build_debian(){ # Battlefield 1942 elif [ "${shortname}" == "bf1942" ]; then array_deps_required+=( libncurses5:i386 libtinfo5:i386 ) + # Black Mesa: Death Match + elif [ "${shortname}" == "bmdm" ]; then + array_deps_required+=( libncurses5:i386 ) # Counter-Strike: Source, Garry's Mod, No More Room in Hell, Source Forts Classic, Zombie Master Reborn and Zombie Panic: Source elif [ "${shortname}" == "css" ]||[ "${shortname}" == "gmod" ]||[ "${shortname}" == "nmrih" ]||[ "${shortname}" == "sfc" ]||[ "${shortname}" == "zmr" ]||[ "${shortname}" == "zps" ]; then if [ "${arch}" == "x86_64" ]; then @@ -501,8 +504,8 @@ fn_deps_build_redhat(){ # Battlefield: Vietnam elif [ "${shortname}" == "bfv" ]; then array_deps_required+=( compat-libstdc++-33.i686 glibc.i686 ) - # Battlefield 1942, Counter-Strike: Source, Garry's Mod, No More Room in Hell, Source Forts Classic, Zombie Master Reborn and Zombie Panic: Source - elif [ "${shortname}" == "bf1942" ]||[ "${shortname}" == "css" ]||[ "${shortname}" == "gmod" ]||[ "${shortname}" == "nmrih" ]||[ "${shortname}" == "sfc" ]||[ "${shortname}" == "zmr" ]||[ "${shortname}" == "zps" ]; then + # Battlefield 1942, Black Mesa: Deathmatch, Counter-Strike: Source, Garry's Mod, No More Room in Hell, Source Forts Classic, Zombie Master Reborn and Zombie Panic: Source + elif [ "${shortname}" == "bf1942" ]||[ "${shortname}" == "bmdm" ]||[ "${shortname}" == "css" ]||[ "${shortname}" == "gmod" ]||[ "${shortname}" == "nmrih" ]||[ "${shortname}" == "sfc" ]||[ "${shortname}" == "zmr" ]||[ "${shortname}" == "zps" ]; then array_deps_required+=( ncurses-libs.i686 ) # Brainbread 2, Don't Starve Together & Team Fortress 2 elif [ "${shortname}" == "bb2" ]||[ "${shortname}" == "dst" ]||[ "${shortname}" == "tf2" ]; then From 5d58dcf8e70eae0c18a82d75f6797da613dce00e Mon Sep 17 00:00:00 2001 From: Christian Date: Tue, 29 Dec 2020 11:46:08 +0100 Subject: [PATCH 513/534] fix(minecraft): fix java ram assignment (#3147) --- lgsm/config-default/config-lgsm/mcserver/_default.cfg | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/lgsm/config-default/config-lgsm/mcserver/_default.cfg b/lgsm/config-default/config-lgsm/mcserver/_default.cfg index b78195e3e..81e833d6e 100644 --- a/lgsm/config-default/config-lgsm/mcserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/mcserver/_default.cfg @@ -14,6 +14,7 @@ javaram="1024" # -Xmx$1024M ## Server Parameters | https://docs.linuxgsm.com/configuration/start-parameters#additional-parameters fn_parms(){ parms="nogui" +executable="java -Xmx${javaram}M -jar ${jarfile}" } ## Release Settings | https://docs.linuxgsm.com/game-servers/minecraft#release-settings @@ -151,7 +152,8 @@ glibc="null" ## Game Server Directories systemdir="${serverfiles}" executabledir="${serverfiles}" -executable="java -Xmx${javaram}M -jar ${serverfiles}/minecraft_server.jar" +jarfile="${serverfiles}/minecraft_server.jar" +executable="${jarfile}" servercfgdir="${systemdir}" servercfg="server.properties" servercfgdefault="server.properties" From d0ecddfcbb6b76b5af42d501c082cc4dbe5e255c Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Tue, 29 Dec 2020 14:48:22 +0000 Subject: [PATCH 514/534] feat(config): add secrets config to store sensitive settings (#3080) * feat(config): add secrets.cfg * changed name of config * updated wording --- .../config-lgsm/secrets-common-template.cfg | 5 +++++ .../config-lgsm/secrets-instance-template.cfg | 5 +++++ linuxgsm.sh | 18 ++++++++++++++++++ tests/tests_fctrserver.sh | 18 ++++++++++++++++++ tests/tests_jc2server.sh | 18 ++++++++++++++++++ tests/tests_mcserver.sh | 18 ++++++++++++++++++ tests/tests_ts3server.sh | 18 ++++++++++++++++++ 7 files changed, 100 insertions(+) create mode 100644 lgsm/config-default/config-lgsm/secrets-common-template.cfg create mode 100644 lgsm/config-default/config-lgsm/secrets-instance-template.cfg diff --git a/lgsm/config-default/config-lgsm/secrets-common-template.cfg b/lgsm/config-default/config-lgsm/secrets-common-template.cfg new file mode 100644 index 000000000..d8ded6aa9 --- /dev/null +++ b/lgsm/config-default/config-lgsm/secrets-common-template.cfg @@ -0,0 +1,5 @@ +################################## +######## Common Secrets ########## +################################## +# PLACE GLOBAL SECRET SETTINGS HERE +## These settings will apply to all instances. diff --git a/lgsm/config-default/config-lgsm/secrets-instance-template.cfg b/lgsm/config-default/config-lgsm/secrets-instance-template.cfg new file mode 100644 index 000000000..5446d3718 --- /dev/null +++ b/lgsm/config-default/config-lgsm/secrets-instance-template.cfg @@ -0,0 +1,5 @@ +################################## +####### Instance Secrets ######### +################################## +# PLACE INSTANCE SECRET SETTINGS HERE +## These settings will apply to a specific instance. diff --git a/linuxgsm.sh b/linuxgsm.sh index 4815e86e3..cb767a770 100755 --- a/linuxgsm.sh +++ b/linuxgsm.sh @@ -412,6 +412,15 @@ else # shellcheck source=/dev/null source "${configdirserver}/common.cfg" fi + # Load the secrets-common.cfg config. If missing download it. + if [ ! -f "${configdirserver}/secrets-common.cfg" ]; then + fn_fetch_config "lgsm/config-default/config-lgsm" "secrets-common-template.cfg" "${configdirserver}" "secrets-common.cfg" "${chmodx}" "nochmodx" "norun" "noforcedl" "nomd5" + # shellcheck source=/dev/null + source "${configdirserver}/secrets-common.cfg" + else + # shellcheck source=/dev/null + source "${configdirserver}/secrets-common.cfg" + fi # Load the instance.cfg config. If missing download it. if [ ! -f "${configdirserver}/${selfname}.cfg" ]; then fn_fetch_config "lgsm/config-default/config-lgsm" "instance-template.cfg" "${configdirserver}" "${selfname}.cfg" "nochmodx" "norun" "noforcedl" "nomd5" @@ -421,6 +430,15 @@ else # shellcheck source=/dev/null source "${configdirserver}/${selfname}.cfg" fi + # Load the secrets-instance.cfg config. If missing download it. + if [ ! -f "${configdirserver}/secrets-${selfname}.cfg" ]; then + fn_fetch_config "lgsm/config-default/config-lgsm" "secrets-instance-template.cfg" "${configdirserver}" "secrets-${selfname}.cfg" "nochmodx" "norun" "noforcedl" "nomd5" + # shellcheck source=/dev/null + source "${configdirserver}/secrets-${selfname}.cfg" + else + # shellcheck source=/dev/null + source "${configdirserver}/secrets-${selfname}.cfg" + fi # Load the linuxgsm.sh in to tmpdir. If missing download it. if [ ! -f "${tmpdir}/linuxgsm.sh" ]; then diff --git a/tests/tests_fctrserver.sh b/tests/tests_fctrserver.sh index 1afa2f60a..55a05f99f 100644 --- a/tests/tests_fctrserver.sh +++ b/tests/tests_fctrserver.sh @@ -421,6 +421,15 @@ else # shellcheck source=/dev/null source "${configdirserver}/common.cfg" fi + # Load the secrets-common.cfg config. If missing download it. + if [ ! -f "${configdirserver}/secrets-common.cfg" ]; then + fn_fetch_config "lgsm/config-default/config-lgsm" "secrets-common-template.cfg" "${configdirserver}" "secrets-common.cfg" "${chmodx}" "nochmodx" "norun" "noforcedl" "nomd5" + # shellcheck source=/dev/null + source "${configdirserver}/secrets-common.cfg" + else + # shellcheck source=/dev/null + source "${configdirserver}/secrets-common.cfg" + fi # Load the instance.cfg config. If missing download it. if [ ! -f "${configdirserver}/${selfname}.cfg" ]; then fn_fetch_config "lgsm/config-default/config-lgsm" "instance-template.cfg" "${configdirserver}" "${selfname}.cfg" "nochmodx" "norun" "noforcedl" "nomd5" @@ -430,6 +439,15 @@ else # shellcheck source=/dev/null source "${configdirserver}/${selfname}.cfg" fi + # Load the secrets-instance.cfg config. If missing download it. + if [ ! -f "${configdirserver}/secrets-${selfname}.cfg" ]; then + fn_fetch_config "lgsm/config-default/config-lgsm" "secrets-instance-template.cfg" "${configdirserver}" "secrets-${selfname}.cfg" "nochmodx" "norun" "noforcedl" "nomd5" + # shellcheck source=/dev/null + source "${configdirserver}/secrets-${selfname}.cfg" + else + # shellcheck source=/dev/null + source "${configdirserver}/secrets-${selfname}.cfg" + fi # Load the linuxgsm.sh in to tmpdir. If missing download it. if [ ! -f "${tmpdir}/linuxgsm.sh" ]; then diff --git a/tests/tests_jc2server.sh b/tests/tests_jc2server.sh index aab73228d..2eb1815f3 100644 --- a/tests/tests_jc2server.sh +++ b/tests/tests_jc2server.sh @@ -422,6 +422,15 @@ else # shellcheck source=/dev/null source "${configdirserver}/common.cfg" fi + # Load the secrets-common.cfg config. If missing download it. + if [ ! -f "${configdirserver}/secrets-common.cfg" ]; then + fn_fetch_config "lgsm/config-default/config-lgsm" "secrets-common-template.cfg" "${configdirserver}" "secrets-common.cfg" "${chmodx}" "nochmodx" "norun" "noforcedl" "nomd5" + # shellcheck source=/dev/null + source "${configdirserver}/secrets-common.cfg" + else + # shellcheck source=/dev/null + source "${configdirserver}/secrets-common.cfg" + fi # Load the instance.cfg config. If missing download it. if [ ! -f "${configdirserver}/${selfname}.cfg" ]; then fn_fetch_config "lgsm/config-default/config-lgsm" "instance-template.cfg" "${configdirserver}" "${selfname}.cfg" "nochmodx" "norun" "noforcedl" "nomd5" @@ -431,6 +440,15 @@ else # shellcheck source=/dev/null source "${configdirserver}/${selfname}.cfg" fi + # Load the secrets-instance.cfg config. If missing download it. + if [ ! -f "${configdirserver}/secrets-${selfname}.cfg" ]; then + fn_fetch_config "lgsm/config-default/config-lgsm" "secrets-instance-template.cfg" "${configdirserver}" "secrets-${selfname}.cfg" "nochmodx" "norun" "noforcedl" "nomd5" + # shellcheck source=/dev/null + source "${configdirserver}/secrets-${selfname}.cfg" + else + # shellcheck source=/dev/null + source "${configdirserver}/secrets-${selfname}.cfg" + fi # Load the linuxgsm.sh in to tmpdir. If missing download it. if [ ! -f "${tmpdir}/linuxgsm.sh" ]; then diff --git a/tests/tests_mcserver.sh b/tests/tests_mcserver.sh index edfc620b3..8797e78e8 100644 --- a/tests/tests_mcserver.sh +++ b/tests/tests_mcserver.sh @@ -422,6 +422,15 @@ else # shellcheck source=/dev/null source "${configdirserver}/common.cfg" fi + # Load the secrets-common.cfg config. If missing download it. + if [ ! -f "${configdirserver}/secrets-common.cfg" ]; then + fn_fetch_config "lgsm/config-default/config-lgsm" "secrets-common.cfg" "${configdirserver}" "secrets-common.cfg" "${chmodx}" "nochmodx" "norun" "noforcedl" "nomd5" + # shellcheck source=/dev/null + source "${configdirserver}/secrets-common.cfg" + else + # shellcheck source=/dev/null + source "${configdirserver}/secrets-common.cfg" + fi # Load the instance.cfg config. If missing download it. if [ ! -f "${configdirserver}/${selfname}.cfg" ]; then fn_fetch_config "lgsm/config-default/config-lgsm" "instance-template.cfg" "${configdirserver}" "${selfname}.cfg" "nochmodx" "norun" "noforcedl" "nomd5" @@ -431,6 +440,15 @@ else # shellcheck source=/dev/null source "${configdirserver}/${selfname}.cfg" fi + # Load the secrets-instance.cfg config. If missing download it. + if [ ! -f "${configdirserver}/secrets-${selfname}.cfg" ]; then + fn_fetch_config "lgsm/config-default/config-lgsm" "secrets-instance-template.cfg" "${configdirserver}" "secrets-${selfname}.cfg" "nochmodx" "norun" "noforcedl" "nomd5" + # shellcheck source=/dev/null + source "${configdirserver}/secrets-${selfname}.cfg" + else + # shellcheck source=/dev/null + source "${configdirserver}/secrets-${selfname}.cfg" + fi # Load the linuxgsm.sh in to tmpdir. If missing download it. if [ ! -f "${tmpdir}/linuxgsm.sh" ]; then diff --git a/tests/tests_ts3server.sh b/tests/tests_ts3server.sh index 620eb43ee..3883d8dc2 100644 --- a/tests/tests_ts3server.sh +++ b/tests/tests_ts3server.sh @@ -422,6 +422,15 @@ else # shellcheck source=/dev/null source "${configdirserver}/common.cfg" fi + # Load the secrets-common.cfg config. If missing download it. + if [ ! -f "${configdirserver}/secrets-common.cfg" ]; then + fn_fetch_config "lgsm/config-default/config-lgsm" "secrets-common-template.cfg" "${configdirserver}" "secrets-common.cfg" "${chmodx}" "nochmodx" "norun" "noforcedl" "nomd5" + # shellcheck source=/dev/null + source "${configdirserver}/secrets-common.cfg" + else + # shellcheck source=/dev/null + source "${configdirserver}/secrets-common.cfg" + fi # Load the instance.cfg config. If missing download it. if [ ! -f "${configdirserver}/${selfname}.cfg" ]; then fn_fetch_config "lgsm/config-default/config-lgsm" "instance-template.cfg" "${configdirserver}" "${selfname}.cfg" "nochmodx" "norun" "noforcedl" "nomd5" @@ -431,6 +440,15 @@ else # shellcheck source=/dev/null source "${configdirserver}/${selfname}.cfg" fi + # Load the secrets-instance.cfg config. If missing download it. + if [ ! -f "${configdirserver}/secrets-${selfname}.cfg" ]; then + fn_fetch_config "lgsm/config-default/config-lgsm" "secrets-instance-template.cfg" "${configdirserver}" "secrets-${selfname}.cfg" "nochmodx" "norun" "noforcedl" "nomd5" + # shellcheck source=/dev/null + source "${configdirserver}/secrets-${selfname}.cfg" + else + # shellcheck source=/dev/null + source "${configdirserver}/secrets-${selfname}.cfg" + fi # Load the linuxgsm.sh in to tmpdir. If missing download it. if [ ! -f "${tmpdir}/linuxgsm.sh" ]; then From 9a8506387a1deed35077b53c064c14123eab3ba6 Mon Sep 17 00:00:00 2001 From: Christian Date: Wed, 30 Dec 2020 11:14:05 +0100 Subject: [PATCH 515/534] feat(newserver): Colony Survival (#3075) --- .../config-lgsm/colserver/_default.cfg | 178 ++++++++++++++++++ lgsm/data/serverlist.csv | 1 + lgsm/functions/check_deps.sh | 6 + lgsm/functions/fix_steamcmd.sh | 2 + lgsm/functions/info_config.sh | 25 +++ lgsm/functions/info_messages.sh | 14 +- lgsm/functions/install_config.sh | 7 + 7 files changed, 232 insertions(+), 1 deletion(-) create mode 100644 lgsm/config-default/config-lgsm/colserver/_default.cfg diff --git a/lgsm/config-default/config-lgsm/colserver/_default.cfg b/lgsm/config-default/config-lgsm/colserver/_default.cfg new file mode 100644 index 000000000..5be0776cf --- /dev/null +++ b/lgsm/config-default/config-lgsm/colserver/_default.cfg @@ -0,0 +1,178 @@ +################################## +######## Default Settings ######## +################################## +# DO NOT EDIT, ANY CHANGES 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. + +#### Game Server Settings #### + +## Server Parameters | https://docs.linuxgsm.com/configuration/start-parameters#additional-parameters +# Edit with care | https://colonysurvival.gamepedia.com/Dedicated_Server#Installation_.28Linux.29 +fn_parms(){ +parms="-batchmode -nographics +server.config ${servercfgfullpath}" +} + +#### LinuxGSM Settings #### + +## LinuxGSM Stats +# Send useful stats to LinuxGSM developers. +# https://docs.linuxgsm.com/configuration/linuxgsm-stats +# (on|off) +stats="off" + +## Notification Alerts +# (on|off) + +# Display IP | https://docs.linuxgsm.com/alerts#display-ip +displayip="" + +# More info | https://docs.linuxgsm.com/alerts#more-info +postalert="off" + +# Discord Alerts | https://docs.linuxgsm.com/alerts/discord +discordalert="off" +discordwebhook="webhook" + +# Email Alerts | https://docs.linuxgsm.com/alerts/email +emailalert="off" +email="email@example.com" +emailfrom="" + +# IFTTT Alerts | https://docs.linuxgsm.com/alerts/ifttt +iftttalert="off" +ifttttoken="accesstoken" +iftttevent="linuxgsm_alert" + +# Mailgun Email Alerts | https://docs.linuxgsm.com/alerts/mailgun +mailgunalert="off" +mailgunapiregion="us" +mailguntoken="accesstoken" +mailgundomain="example.com" +mailgunemailfrom="alert@example.com" +mailgunemail="email@myemail.com" + +# Pushbullet Alerts | https://docs.linuxgsm.com/alerts/pushbullet +pushbulletalert="off" +pushbullettoken="accesstoken" +channeltag="" + +# Pushover Alerts | https://docs.linuxgsm.com/alerts/pushover +pushoveralert="off" +pushovertoken="accesstoken" +pushoveruserkey="userkey" + +# Rocket.Chat Alerts | https://docs.linuxgsm.com/alerts/rocket.chat +rocketchatalert="off" +rocketchatwebhook="webhook" +rocketchattoken="" + +# Slack Alerts | https://docs.linuxgsm.com/alerts/slack +slackalert="off" +slackwebhook="webhook" + +# Telegram Alerts | https://docs.linuxgsm.com/alerts/telegram +# You can add a custom cURL string eg proxy (useful in Russia) in "curlcustomstring". +# For example "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help". +telegramalert="off" +telegramtoken="accesstoken" +telegramchatid="" +curlcustomstring="" + +## Updating | https://docs.linuxgsm.com/commands/update +updateonstart="off" + +## Backup | https://docs.linuxgsm.com/commands/backup +maxbackups="4" +maxbackupdays="30" +stoponbackup="on" + +## Logging | https://docs.linuxgsm.com/features/logging +consolelogging="on" +logdays="7" + +## Monitor | https://docs.linuxgsm.com/commands/monitor +# Query delay time +querydelay="1" + +## ANSI Colors | https://docs.linuxgsm.com/features/ansi-colors +ansi="on" + +#### Advanced Settings #### + +## Message Display Time | https://docs.linuxgsm.com/features/message-display-time +sleeptime="0.5" + +## SteamCMD Settings | https://docs.linuxgsm.com/steamcmd +# Server appid +appid="748090" +# SteamCMD Branch | https://docs.linuxgsm.com/steamcmd/branch +branch="" +betapassword="" +# Master Server | https://docs.linuxgsm.com/steamcmd/steam-master-server +steammaster="false" + +## Stop Mode | https://docs.linuxgsm.com/features/stop-mode +# 1: tmux kill +# 2: CTRL+c +# 3: quit +# 4: quit 120s +# 5: stop +# 6: q +# 7: exit +# 8: 7 Days to Die +# 9: GoldSrc +# 10: Avorion +# 11: end +stopmode="2" + +## Query mode +# 1: session only +# 2: gamedig (gsquery fallback) +# 3: gamedig +# 4: gsquery +# 5: tcp +querymode="2" +querytype="protocol-valve" + +## Console type +consoleverbose="no" +consoleinteract="no" + +## Game Server Details +# Do not edit +gamename="Colony Survival" +engine="unity3d" +glibc="2.15" + +#### Directories #### +# Edit with care + +## Game Server Directories +systemdir="${serverfiles}" +executabledir="${serverfiles}" +executable="./colonyserver.x86_64" +servercfgdir="${systemdir}/gamedata/settings" +servercfg="${selfname}.json" +servercfgdefault="colserver.json" +servercfgfullpath="${servercfgdir}/${servercfg}" + +## Backup Directory +backupdir="${lgsmdir}/backup" + +## Logging Directories +logdir="${rootdir}/log" +gamelogdir="${serverfiles}/gamedata/logs/server/" +lgsmlogdir="${logdir}/script" +consolelogdir="${logdir}/console" +gamelog="${gamelogdir}/${selfname}-game.log" +lgsmlog="${lgsmlogdir}/${selfname}-script.log" +consolelog="${consolelogdir}/${selfname}-console.log" +alertlog="${lgsmlogdir}/${selfname}-alert.log" +postdetailslog="${lgsmlogdir}/${selfname}-postdetails.log" + +## Logs Naming +gamelogdate="${gamelogdir}/${selfname}-game-$(date '+%Y-%m-%d-%H:%M:%S').log" +lgsmlogdate="${lgsmlogdir}/${selfname}-script-$(date '+%Y-%m-%d-%H:%M:%S').log" +consolelogdate="${consolelogdir}/${selfname}-console-$(date '+%Y-%m-%d-%H:%M:%S').log" diff --git a/lgsm/data/serverlist.csv b/lgsm/data/serverlist.csv index ad3bc9a19..7786158f1 100644 --- a/lgsm/data/serverlist.csv +++ b/lgsm/data/serverlist.csv @@ -21,6 +21,7 @@ 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 +col,colserver,Colony Survival cs,csserver,Counter-Strike 1.6 cscz,csczserver,Counter-Strike: Condition Zero csgo,csgoserver,Counter-Strike: Global Offensive diff --git a/lgsm/functions/check_deps.sh b/lgsm/functions/check_deps.sh index 80d33cad9..29c1c4548 100755 --- a/lgsm/functions/check_deps.sh +++ b/lgsm/functions/check_deps.sh @@ -404,6 +404,9 @@ fn_deps_build_debian(){ # Barotrauma elif [ "${shortname}" == "bt" ]; then array_deps_required+=( libicu-dev ) + # Colony Survival + elif [ "${shortname}" == "col" ]; then + array_deps_required+=( coreutils ) # Ecoserver elif [ "${shortname}" == "eco" ]; then array_deps_required+=( libgdiplus ) @@ -513,6 +516,9 @@ fn_deps_build_redhat(){ # Call of Duty & Medal of Honor: Allied Assault elif [ "${shortname}" == "cod" ]||[ "${shortname}" == "coduo" ]||[ "${shortname}" == "cod2" ]||[ "${shortname}" == "mohaa" ]; then array_deps_required+=( compat-libstdc++-33.i686 ) + # Colony Survival + elif [ "${shortname}" == "col" ]; then + array_deps_required+=( coreutils ) # Ecoserver elif [ "${shortname}" == "eco" ]; then array_deps_required+=( libgdiplus ) diff --git a/lgsm/functions/fix_steamcmd.sh b/lgsm/functions/fix_steamcmd.sh index 41d31e263..01465b45e 100755 --- a/lgsm/functions/fix_steamcmd.sh +++ b/lgsm/functions/fix_steamcmd.sh @@ -79,6 +79,8 @@ elif [ "${shortname}" == "cmw" ]; then fn_fix_steamclient_so "32" "${executabledir}/lib" elif [ "${shortname}" == "cs" ]; then fn_fix_steamclient_so "32" "${serverfiles}" +elif [ "${shortname}" == "col" ]; then + fn_fix_steamclient_so "64" "${serverfiles}" elif [ "${shortname}" == "ins" ]; then fn_fix_steamclient_so "32" "${serverfiles}/bin" elif [ "${shortname}" == "pz" ]; then diff --git a/lgsm/functions/info_config.sh b/lgsm/functions/info_config.sh index d13e000d9..99eed24c4 100755 --- a/lgsm/functions/info_config.sh +++ b/lgsm/functions/info_config.sh @@ -1525,6 +1525,29 @@ fn_info_config_pavlovvr(){ fi } +fn_info_config_col(){ + if [ -f "${servercfgfullpath}" ]; then + servername=$(jq -r '.ServerSettings.ServerName' "${servercfgfullpath}") + serverpassword=$(jq -r '.ServerSettings.ServerPassword' "${servercfgfullpath}") + maxplayers=$(jq -r '.ServerSettings.MaxPlayerCount' "${servercfgfullpath}") + port=$(jq -r '.ServerSettings.ServerGamePort' "${servercfgfullpath}") + steamport=$(jq -r '.ServerSettings.ServerSteamPort' "${servercfgfullpath}") + rconpassword=$(jq -r '.ServerSettings.RCONPassword' "${servercfgfullpath}") + configip=$(jq -r '.ServerSettings.ServerIP' "${servercfgfullpath}") + + # password not set + serverpassword=${serverpassword:-"NOT SET"} + queryport=${port:-"0"} + else + servername=${servername:-"NOT SET"} + serverpassword=${serverpassword:-"NOT SET"} + maxplayers=${maxplayers:-"0"} + port=${port:-"27004"} + steamport=${steamport:-"27005"} + rconpassword=${rconpassword:-"NOT SET"} + fi +} + if [ "${shortname}" == "ac" ]; then fn_info_config_assettocorsa elif [ "${shortname}" == "ark" ]; then @@ -1551,6 +1574,8 @@ elif [ "${shortname}" == "cod4" ]; then fn_info_config_cod4 elif [ "${shortname}" == "codwaw" ]; then fn_info_config_codwaw +elif [ "${shortname}" == "col" ]; then + fn_info_config_col elif [ "${shortname}" == "dst" ]; then fn_info_config_dontstarve elif [ "${shortname}" == "eco" ]; then diff --git a/lgsm/functions/info_messages.sh b/lgsm/functions/info_messages.sh index dde3a2585..c6a1b996f 100755 --- a/lgsm/functions/info_messages.sh +++ b/lgsm/functions/info_messages.sh @@ -583,7 +583,7 @@ fn_info_message_ports(){ fi done # engines/games that require editing the parms. - local ports_edit_array=( "Avorion" "goldsrc" "Factorio" "Hurtworld" "iw3.0" "ioquake3" "qfusion" "Rust" "Soldat" "spark" "source" "starbound" "unreal4" "realvirtuality" "Unturned" ) + local ports_edit_array=( "Avorion" "col" "goldsrc" "Factorio" "Hurtworld" "iw3.0" "ioquake3" "qfusion" "Rust" "Soldat" "spark" "source" "starbound" "unreal4" "realvirtuality" "Unturned" ) for port_edit in "${ports_edit_array[@]}"; do if [ "${engine}" == "${port_edit}" ]||[ "${gamename}" == "${port_edit}" ]||[ "${shortname}" == "${port_edit}" ]; then parmslocation="${configdirserver}" @@ -1445,6 +1445,16 @@ fn_info_message_pavlovvr(){ } | column -s $'\t' -t } +fn_info_message_colony(){ + echo -e "netstat -atunp | grep colonyserver" + echo -e "" + { + echo -e "${lightblue}DESCRIPTION\tDIRECTION\tPORT\tPROTOCOL${default}" + echo -e "> Game\tINBOUND\t${port}\tudp" + echo -e "> Steam\tINBOUND\t${steamport}\tudp" + } | column -s $'\t' -t +} + fn_info_message_select_engine(){ # Display details depending on game or engine. if [ "${shortname}" == "ac" ]; then @@ -1473,6 +1483,8 @@ fn_info_message_select_engine(){ fn_info_message_cod4 elif [ "${shortname}" == "codwaw" ]; then fn_info_message_codwaw + elif [ "${shortname}" == "col" ]; then + fn_info_message_colony elif [ "${shortname}" == "dst" ]; then fn_info_message_dst elif [ "${shortname}" == "eco" ]; then diff --git a/lgsm/functions/install_config.sh b/lgsm/functions/install_config.sh index fbff9dbbb..052e535d2 100755 --- a/lgsm/functions/install_config.sh +++ b/lgsm/functions/install_config.sh @@ -316,6 +316,13 @@ elif [ "${shortname}" == "cc" ]; then fn_default_config_remote fn_set_config_vars fn_list_config_locations +elif [ "${shortname}" == "col" ]; then + gamedirname="ColonySurvival" + array_configs+=( colserver.json ) + fn_fetch_default_config + fn_default_config_remote + fn_set_config_vars + fn_list_config_locations elif [ "${shortname}" == "cs" ]; then gamedirname="CounterStrike" array_configs+=( server.cfg ) From efa159d8ab9f3e8883f9323f1cf4b937d7e64e62 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Wed, 30 Dec 2020 22:33:47 +0000 Subject: [PATCH 516/534] feat(skeleton): New command skeleton (#3152) * initial commit of skel * getopt * getopt * getopt * cpio * adding messages * exit * message * shellcheck * truncate netstat for colserver * added cpio dependency * tabs --- lgsm/functions/check_deps.sh | 12 ++++++------ lgsm/functions/command_skeleton.sh | 21 +++++++++++++++++++++ lgsm/functions/core_functions.sh | 5 +++++ lgsm/functions/core_getopt.sh | 5 +++-- lgsm/functions/info_messages.sh | 2 +- 5 files changed, 36 insertions(+), 9 deletions(-) create mode 100644 lgsm/functions/command_skeleton.sh diff --git a/lgsm/functions/check_deps.sh b/lgsm/functions/check_deps.sh index 29c1c4548..621b12eae 100755 --- a/lgsm/functions/check_deps.sh +++ b/lgsm/functions/check_deps.sh @@ -343,7 +343,7 @@ fn_deps_build_debian(){ array_deps_missing=() # LinuxGSM requirements. - array_deps_required=( curl wget ca-certificates file bsdmainutils util-linux python3 tar bzip2 gzip unzip binutils bc jq tmux netcat ) + array_deps_required=( curl wget ca-certificates file bsdmainutils util-linux python3 tar bzip2 gzip unzip binutils bc jq tmux netcat cpio ) # All servers except ts3, mumble, GTA and minecraft servers require lib32stdc++6 and lib32gcc1. if [ "${shortname}" != "ts3" ]&&[ "${shortname}" != "mumble" ]&&[ "${shortname}" != "mc" ]&&[ "${engine}" != "renderware" ]; then @@ -470,15 +470,15 @@ fn_deps_build_redhat(){ # LinuxGSM requirements. # CentOS if [ "${distroversion}" == "7" ]; then - array_deps_required=( epel-release curl wget util-linux python3 file tar gzip bzip2 unzip binutils bc jq tmux nmap-ncat ) + array_deps_required=( epel-release curl wget util-linux python3 file tar gzip bzip2 unzip binutils bc jq tmux nmap-ncat cpio ) elif [ "${distroversion}" == "8" ]; then - array_deps_required=( epel-release curl wget util-linux python36 file tar gzip bzip2 unzip binutils bc jq tmux nmap-ncat ) + array_deps_required=( epel-release curl wget util-linux python36 file tar gzip bzip2 unzip binutils bc jq tmux nmap-ncat cpio ) elif [ "${distroid}" == "fedora" ]; then - array_deps_required=( curl wget util-linux python3 file tar gzip bzip2 unzip binutils bc jq tmux nmap-ncat ) + array_deps_required=( curl wget util-linux python3 file tar gzip bzip2 unzip binutils bc jq tmux nmap-ncat cpio ) elif [[ "${distroname}" == *"Amazon Linux AMI"* ]]; then - array_deps_required=( curl wget util-linux python3 file tar gzip bzip2 unzip binutils bc jq tmux nmap-ncat ) + array_deps_required=( curl wget util-linux python3 file tar gzip bzip2 unzip binutils bc jq tmux nmap-ncat cpio ) else - array_deps_required=( curl wget util-linux python3 file tar gzip bzip2 unzip binutils bc jq tmux nmap-ncat ) + array_deps_required=( curl wget util-linux python3 file tar gzip bzip2 unzip binutils bc jq tmux nmap-ncat cpio ) fi # All servers except ts3, mumble, multi theft auto and minecraft servers require glibc.i686 and libstdc++.i686. diff --git a/lgsm/functions/command_skeleton.sh b/lgsm/functions/command_skeleton.sh new file mode 100644 index 000000000..cb1136915 --- /dev/null +++ b/lgsm/functions/command_skeleton.sh @@ -0,0 +1,21 @@ +#!/bin/bash +# LinuxGSM command_skeleton.sh function +# Author: Daniel Gibbs +# Website: https://linuxgsm.com +# Description: Creates an copy of a game servers directorys. + + +fn_print_dots "Creating skeleton directory" +check.sh + +# Find all directorys and create them in the skel directory +find "${rootdir}" -type d -not \( -path ./skel -prune \) | cpio -pdvm skel 2>/dev/null +exitcode=$? +if [ "${exitcode}" != 0 ]; then + fn_print_fail_nl "Creating skeleton directory" + fn_script_log_fatal "Creating skeleton directory" +else + fn_print_ok_nl "Creating skeleton directory: ./skel" + fn_script_log_pass "Creating skeleton directory: ./skel" +fi +core_exit.sh diff --git a/lgsm/functions/core_functions.sh b/lgsm/functions/core_functions.sh index e4da9830f..942eb6bda 100755 --- a/lgsm/functions/core_functions.sh +++ b/lgsm/functions/core_functions.sh @@ -155,6 +155,11 @@ functionfile="${FUNCNAME[0]}" fn_fetch_function } +command_skeleton.sh(){ +functionfile="${FUNCNAME[0]}" +fn_fetch_function +} + command_wipe.sh(){ functionfile="${FUNCNAME[0]}" fn_fetch_function diff --git a/lgsm/functions/core_getopt.sh b/lgsm/functions/core_getopt.sh index e20b32b57..ecfba09b3 100755 --- a/lgsm/functions/core_getopt.sh +++ b/lgsm/functions/core_getopt.sh @@ -20,6 +20,7 @@ cmd_backup=( "b;backup" "command_backup.sh" "Create backup archives of the serve 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." ) +cmd_skeleton=( "sk;skeleton" "command_skeleton.sh" "Create a skeleton directory." ) cmd_donate=( "do;donate" "command_donate.sh" "Donation options." ) # Console servers only. cmd_console=( "c;console" "command_console.sh" "Access server console." ) @@ -55,9 +56,9 @@ cmd_dev_clear_functions=( "cf;clear-functions" "command_dev_clear_functions.sh" ### Set specific opt here. -currentopt=( "${cmd_start[@]}" "${cmd_stop[@]}" "${cmd_restart[@]}" "${cmd_monitor[@]}" "${cmd_test_alert[@]}" "${cmd_details[@]}" "${cmd_postdetails[@]}" ) +currentopt=( "${cmd_start[@]}" "${cmd_stop[@]}" "${cmd_restart[@]}" "${cmd_monitor[@]}" "${cmd_test_alert[@]}" "${cmd_details[@]}" "${cmd_postdetails[@]}" "${cmd_skeleton[@]}" ) -# Update LGSM. +# Update LinuxGSM. currentopt+=( "${cmd_update_linuxgsm[@]}" ) # Exclude noupdate games here. diff --git a/lgsm/functions/info_messages.sh b/lgsm/functions/info_messages.sh index c6a1b996f..177129bfd 100755 --- a/lgsm/functions/info_messages.sh +++ b/lgsm/functions/info_messages.sh @@ -1446,7 +1446,7 @@ fn_info_message_pavlovvr(){ } fn_info_message_colony(){ - echo -e "netstat -atunp | grep colonyserver" + echo -e "netstat -atunp | grep colonyserv" echo -e "" { echo -e "${lightblue}DESCRIPTION\tDIRECTION\tPORT\tPROTOCOL${default}" From a075300589ffe88c9fe31eda9cf82db7347f0a41 Mon Sep 17 00:00:00 2001 From: Christian Date: Thu, 31 Dec 2020 11:33:33 +0100 Subject: [PATCH 517/534] feat(check-update): add new command check-update for steamcmd game servers (#3146) --- lgsm/functions/alert.sh | 11 + lgsm/functions/check_steamcmd.sh | 141 +---------- lgsm/functions/command_check_update.sh | 24 ++ lgsm/functions/core_functions.sh | 10 + lgsm/functions/core_getopt.sh | 5 +- lgsm/functions/core_steamcmd.sh | 332 +++++++++++++++++++++++++ lgsm/functions/update_steamcmd.sh | 182 +------------- 7 files changed, 384 insertions(+), 321 deletions(-) create mode 100755 lgsm/functions/command_check_update.sh create mode 100755 lgsm/functions/core_steamcmd.sh diff --git a/lgsm/functions/alert.sh b/lgsm/functions/alert.sh index 3b54230eb..484c0c1e2 100755 --- a/lgsm/functions/alert.sh +++ b/lgsm/functions/alert.sh @@ -60,6 +60,15 @@ fn_alert_update(){ alertbody="${gamename} received update" } +fn_alert_check_update(){ + fn_script_log_info "Sending alert: Update available" + alertsubject="Alert - ${selfname} - Update available" + alertemoji="🎮" + alertsound="1" + alerturl="not enabled" + alertbody="${gamename} update available" +} + fn_alert_permissions(){ fn_script_log_info "Sending alert: Permissions error" alertsubject="Alert - ${selfname}: Permissions error" @@ -88,6 +97,8 @@ elif [ "${alert}" == "test" ]; then fn_alert_test elif [ "${alert}" == "update" ]; then fn_alert_update +elif [ "${alert}" == "check-update" ]; then + fn_alert_check_update elif [ "${alert}" == "config" ]; then fn_alert_config fi diff --git a/lgsm/functions/check_steamcmd.sh b/lgsm/functions/check_steamcmd.sh index 647ee7525..9141acd0d 100755 --- a/lgsm/functions/check_steamcmd.sh +++ b/lgsm/functions/check_steamcmd.sh @@ -6,145 +6,8 @@ functionselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" -fn_install_steamcmd(){ - if [ "${shortname}" == "ark" ]&&[ "${installsteamcmd}" == "1" ]; then - steamcmddir="${serverfiles}/Engine/Binaries/ThirdParty/SteamCMD/Linux" - fi - if [ ! -d "${steamcmddir}" ]; then - mkdir -p "${steamcmddir}" - fi - remote_fileurl="${1}" - remote_fileurl_backup="${2}" - remote_fileurl_name="${3}" - remote_fileurl_backup_name="${4}" - local_filedir="${5}" - local_filename="${6}" - chmodx="${7:-0}" - run="${8:-0}" - forcedl="${9:-0}" - md5="${10:-0}" - fn_fetch_file "http://media.steampowered.com/client/steamcmd_linux.tar.gz" "" "" "" "${tmpdir}" "steamcmd_linux.tar.gz" "" "norun" "noforce" "nomd5" - fn_dl_extract "${tmpdir}" "steamcmd_linux.tar.gz" "${steamcmddir}" - chmod +x "${steamcmddir}/steamcmd.sh" -} - -fn_check_steamcmd_user(){ - # Checks if steamuser is setup. - if [ "${steamuser}" == "username" ]; then - fn_print_fail_nl "Steam login not set. Update steamuser in ${configdirserver}" - echo -e " * Change steamuser=\"username\" to a valid steam login." - if [ -d "${lgsmlogdir}" ]; then - fn_script_log_fatal "Steam login not set. Update steamuser in ${configdirserver}" - fi - core_exit.sh - fi - # Anonymous user is set if steamuser is missing. - if [ -z "${steamuser}" ]; then - if [ -d "${lgsmlogdir}" ]; then - fn_script_log_info "Using anonymous Steam login" - fi - steamuser="anonymous" - steampass='' - fi -} - -fn_check_steamcmd(){ - # Checks if SteamCMD exists when starting or updating a server. - # Only install if steamcmd package is missing or steamcmd dir is missing. - if [ ! -f "${steamcmddir}/steamcmd.sh" ]&&[ -z "$(command -v steamcmd 2>/dev/null)" ]; then - if [ "${commandname}" == "INSTALL" ]; then - fn_install_steamcmd - else - fn_print_warn_nl "SteamCMD is missing" - fn_script_log_warn "SteamCMD is missing" - fn_install_steamcmd - fi - elif [ "${commandname}" == "INSTALL" ]; then - fn_print_information "SteamCMD is already installed..." - fn_print_ok_eol_nl - fi -} - -fn_check_steamcmd_dir(){ - # Worksround that pre-installs the correct steam directories to ensure all packages use the correct Standard. - # https://github.com/ValveSoftware/steam-for-linux/issues/6976#issuecomment-610446347 - - # Create Steam installation directory. - if [ ! -d "${XDG_DATA_HOME:="${HOME}/.local/share"}/Steam" ]; then - mkdir -p "${XDG_DATA_HOME:="${HOME}/.local/share"}/Steam" - fi - - # Create common Steam directory. - if [ ! -d "${HOME}/.steam" ]; then - mkdir -p "${HOME}/.steam" - fi - - # Symbolic links to Steam installation directory. - if [ ! -L "${HOME}/.steam/root" ]; then - if [ -d "${HOME}/.steam/root" ]; then - rm "${HOME}/.steam/root" - fi - ln -s "${XDG_DATA_HOME:="${HOME}/.local/share"}/Steam" "${HOME}/.steam/root" - fi - - if [ ! -L "${HOME}/.steam/steam" ]; then - if [ -d "${HOME}/.steam/steam" ]; then - rm -rf "${HOME}/.steam/steam" - fi - ln -s "${XDG_DATA_HOME:="${HOME}/.local/share"}/Steam" "${HOME}/.steam/steam" - fi -} - -fn_check_steamcmd_dir_legacy(){ - # Remove old Steam installation directories ~/Steam and ${rootdir}/steamcmd - if [ -d "${rootdir}/steamcmd" ]&&[ "${steamcmddir}" == "${XDG_DATA_HOME:="${HOME}/.local/share"}/Steam" ]; then - rm -rf "${rootdir:?}/steamcmd" - fi - - if [ -d "${HOME}/Steam" ]&&[ "${steamcmddir}" == "${XDG_DATA_HOME:="${HOME}/.local/share"}/Steam" ]; then - rm -rf "${HOME}/Steam" - fi -} - -fn_check_steamcmd_ark(){ - # Checks if SteamCMD exists in - # Engine/Binaries/ThirdParty/SteamCMD/Linux - # to allow ark mods to work - if [ ! -f "${serverfiles}/Engine/Binaries/ThirdParty/SteamCMD/Linux/steamcmd.sh" ]; then - installsteamcmd=1 - if [ "${commandname}" == "INSTALL" ]; then - fn_install_steamcmd - else - fn_print_warn_nl "ARK mods SteamCMD is missing" - fn_script_log_warn "ARK mods SteamCMD is missing" - fn_install_steamcmd - fi - elif [ "${commandname}" == "INSTALL" ]; then - fn_print_information "ARK mods SteamCMD is already installed..." - fn_print_ok_eol_nl - fi -} - -fn_check_steamcmd_clear(){ -# Will remove steamcmd dir if steamcmd package is installed. -if [ "$(command -v steamcmd 2>/dev/null)" ]&&[ -d "${rootdir}/steamcmd" ]; then - rm -rf "${steamcmddir:?}" - exitcode=$? - if [ "${exitcode}" != 0 ]; then - fn_script_log_fatal "Removing ${rootdir}/steamcmd" - else - fn_script_log_pass "Removing ${rootdir}/steamcmd" - fi -fi -} - -fn_check_steamcmd_exec(){ - if [ "$(command -v steamcmd 2>/dev/null)" ]; then - steamcmdcommand="steamcmd" - else - steamcmdcommand="./steamcmd.sh" - fi -} +# init steamcmd functions +core_steamcmd.sh fn_check_steamcmd_clear fn_check_steamcmd diff --git a/lgsm/functions/command_check_update.sh b/lgsm/functions/command_check_update.sh new file mode 100755 index 000000000..5bda55469 --- /dev/null +++ b/lgsm/functions/command_check_update.sh @@ -0,0 +1,24 @@ +#!/bin/bash +# LinuxGSM command_check_update.sh function +# Author: Daniel Gibbs +# Website: https://linuxgsm.com +# Description: Handles updating of servers. + +commandname="CHECK-UPDATE" +commandaction="check for Update" +functionselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" +fn_firstcommand_set + +fn_print_dots "" +check.sh +core_logs.sh + +core_steamcmd.sh + +check_steamcmd.sh + +fn_update_steamcmd_localbuild +fn_update_steamcmd_remotebuild +fn_update_steamcmd_compare + +core_exit.sh diff --git a/lgsm/functions/core_functions.sh b/lgsm/functions/core_functions.sh index 942eb6bda..ce8458b5d 100755 --- a/lgsm/functions/core_functions.sh +++ b/lgsm/functions/core_functions.sh @@ -53,6 +53,11 @@ functionfile="${FUNCNAME[0]}" fn_fetch_function } +core_steamcmd.sh(){ +functionfile="${FUNCNAME[0]}" +fn_fetch_function +} + # Commands command_backup.sh(){ @@ -599,6 +604,11 @@ functionfile="${FUNCNAME[0]}" fn_fetch_function } +command_check_update.sh(){ +functionfile="${FUNCNAME[0]}" +fn_fetch_function +} + update_ts3.sh(){ functionfile="${FUNCNAME[0]}" fn_fetch_function diff --git a/lgsm/functions/core_getopt.sh b/lgsm/functions/core_getopt.sh index ecfba09b3..5fae3fb9f 100755 --- a/lgsm/functions/core_getopt.sh +++ b/lgsm/functions/core_getopt.sh @@ -27,6 +27,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 and apply any server updates." ) +cmd_check_update=( "cu;check-update" "command_check_update.sh" "Check if a gameserver update is available" ) 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." ) @@ -72,9 +73,9 @@ if [ "${shortname}" == "jk2" ]||[ "${engine}" != "idtech3" ];then fi fi -# Validate command. +# Validate and check-update command. if [ "${appid}" ]; then - currentopt+=( "${cmd_validate[@]}" ) + currentopt+=( "${cmd_validate[@]}" "${cmd_check_update[@]}" ) fi # Backup. diff --git a/lgsm/functions/core_steamcmd.sh b/lgsm/functions/core_steamcmd.sh new file mode 100755 index 000000000..582eb93b6 --- /dev/null +++ b/lgsm/functions/core_steamcmd.sh @@ -0,0 +1,332 @@ +#!/bin/bash +# LinuxGSM core_steamcmd.sh function +# Author: Daniel Gibbs +# Website: https://linuxgsm.com +# Description: Core functions for SteamCMD + +functionselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" + +fn_install_steamcmd(){ + if [ "${shortname}" == "ark" ]&&[ "${installsteamcmd}" == "1" ]; then + steamcmddir="${serverfiles}/Engine/Binaries/ThirdParty/SteamCMD/Linux" + fi + if [ ! -d "${steamcmddir}" ]; then + mkdir -p "${steamcmddir}" + fi + remote_fileurl="${1}" + remote_fileurl_backup="${2}" + remote_fileurl_name="${3}" + remote_fileurl_backup_name="${4}" + local_filedir="${5}" + local_filename="${6}" + chmodx="${7:-0}" + run="${8:-0}" + forcedl="${9:-0}" + md5="${10:-0}" + fn_fetch_file "http://media.steampowered.com/client/steamcmd_linux.tar.gz" "" "" "" "${tmpdir}" "steamcmd_linux.tar.gz" "" "norun" "noforce" "nomd5" + fn_dl_extract "${tmpdir}" "steamcmd_linux.tar.gz" "${steamcmddir}" + chmod +x "${steamcmddir}/steamcmd.sh" +} + +fn_check_steamcmd_user(){ + # Checks if steamuser is setup. + if [ "${steamuser}" == "username" ]; then + fn_print_fail_nl "Steam login not set. Update steamuser in ${configdirserver}" + echo -e " * Change steamuser=\"username\" to a valid steam login." + if [ -d "${lgsmlogdir}" ]; then + fn_script_log_fatal "Steam login not set. Update steamuser in ${configdirserver}" + fi + core_exit.sh + fi + # Anonymous user is set if steamuser is missing. + if [ -z "${steamuser}" ]; then + if [ -d "${lgsmlogdir}" ]; then + fn_script_log_info "Using anonymous Steam login" + fi + steamuser="anonymous" + steampass='' + fi +} + +fn_check_steamcmd(){ + # Checks if SteamCMD exists when starting or updating a server. + # Only install if steamcmd package is missing or steamcmd dir is missing. + if [ ! -f "${steamcmddir}/steamcmd.sh" ]&&[ -z "$(command -v steamcmd 2>/dev/null)" ]; then + if [ "${commandname}" == "INSTALL" ]; then + fn_install_steamcmd + else + fn_print_warn_nl "SteamCMD is missing" + fn_script_log_warn "SteamCMD is missing" + fn_install_steamcmd + fi + elif [ "${commandname}" == "INSTALL" ]; then + fn_print_information "SteamCMD is already installed..." + fn_print_ok_eol_nl + fi +} + +fn_check_steamcmd_dir(){ + # Worksround that pre-installs the correct steam directories to ensure all packages use the correct Standard. + # https://github.com/ValveSoftware/steam-for-linux/issues/6976#issuecomment-610446347 + + # Create Steam installation directory. + if [ ! -d "${XDG_DATA_HOME:="${HOME}/.local/share"}/Steam" ]; then + mkdir -p "${XDG_DATA_HOME:="${HOME}/.local/share"}/Steam" + fi + + # Create common Steam directory. + if [ ! -d "${HOME}/.steam" ]; then + mkdir -p "${HOME}/.steam" + fi + + # Symbolic links to Steam installation directory. + if [ ! -L "${HOME}/.steam/root" ]; then + if [ -d "${HOME}/.steam/root" ]; then + rm "${HOME}/.steam/root" + fi + ln -s "${XDG_DATA_HOME:="${HOME}/.local/share"}/Steam" "${HOME}/.steam/root" + fi + + if [ ! -L "${HOME}/.steam/steam" ]; then + if [ -d "${HOME}/.steam/steam" ]; then + rm -rf "${HOME}/.steam/steam" + fi + ln -s "${XDG_DATA_HOME:="${HOME}/.local/share"}/Steam" "${HOME}/.steam/steam" + fi +} + +fn_check_steamcmd_dir_legacy(){ + # Remove old Steam installation directories ~/Steam and ${rootdir}/steamcmd + if [ -d "${rootdir}/steamcmd" ]&&[ "${steamcmddir}" == "${XDG_DATA_HOME:="${HOME}/.local/share"}/Steam" ]; then + rm -rf "${rootdir:?}/steamcmd" + fi + + if [ -d "${HOME}/Steam" ]&&[ "${steamcmddir}" == "${XDG_DATA_HOME:="${HOME}/.local/share"}/Steam" ]; then + rm -rf "${HOME}/Steam" + fi +} + +fn_check_steamcmd_ark(){ + # Checks if SteamCMD exists in + # Engine/Binaries/ThirdParty/SteamCMD/Linux + # to allow ark mods to work + if [ ! -f "${serverfiles}/Engine/Binaries/ThirdParty/SteamCMD/Linux/steamcmd.sh" ]; then + installsteamcmd=1 + if [ "${commandname}" == "INSTALL" ]; then + fn_install_steamcmd + else + fn_print_warn_nl "ARK mods SteamCMD is missing" + fn_script_log_warn "ARK mods SteamCMD is missing" + fn_install_steamcmd + fi + elif [ "${commandname}" == "INSTALL" ]; then + fn_print_information "ARK mods SteamCMD is already installed..." + fn_print_ok_eol_nl + fi +} + +fn_check_steamcmd_clear(){ + # Will remove steamcmd dir if steamcmd package is installed. + if [ "$(command -v steamcmd 2>/dev/null)" ]&&[ -d "${rootdir}/steamcmd" ]; then + rm -rf "${steamcmddir:?}" + exitcode=$? + if [ "${exitcode}" != 0 ]; then + fn_script_log_fatal "Removing ${rootdir}/steamcmd" + else + fn_script_log_pass "Removing ${rootdir}/steamcmd" + fi + fi +} + +fn_check_steamcmd_exec(){ + if [ "$(command -v steamcmd 2>/dev/null)" ]; then + steamcmdcommand="steamcmd" + else + steamcmdcommand="./steamcmd.sh" + fi +} + +fn_update_steamcmd_localbuild(){ + # Gets local build info. + fn_print_dots "Checking local build: ${remotelocation}" + fn_appmanifest_check + # Uses appmanifest to find local build. + localbuild=$(grep buildid "${appmanifestfile}" | tr '[:blank:]"' ' ' | tr -s ' ' | cut -d\ -f3) + + # Set branch to public if no custom branch. + if [ -z "${branch}" ]; then + branch="public" + fi + + # Checks if localbuild variable has been set. + if [ -z "${localbuild}" ]||[ "${localbuild}" == "null" ]; then + fn_print_fail "Checking local build: ${remotelocation}" + fn_script_log_fatal "Checking local build" + core_exit.sh + else + fn_print_ok "Checking local build: ${remotelocation}" + fn_script_log_pass "Checking local build" + fi +} + +fn_update_steamcmd_remotebuild(){ + # Gets remote build info. + if [ -d "${steamcmddir}" ]; then + cd "${steamcmddir}" || exit + fi + + # Removes appinfo.vdf as a fix for not always getting up to date version info from SteamCMD. + if [ "$(find "${HOME}" -type f -name "appinfo.vdf" | wc -l)" -ne "0" ]; then + find "${HOME}" -type f -name "appinfo.vdf" -exec rm -f {} \; + fi + + # password for branch not needed to check the buildid + remotebuild=$(${steamcmdcommand} +login "${steamuser}" "${steampass}" +app_info_update 1 +app_info_print "${appid}" +quit | sed -e '/"branches"/,/^}/!d' | sed -n "/\"${branch}\"/,/}/p" | grep -m 1 buildid | tr -cd '[:digit:]') + + if [ "${firstcommandname}" != "INSTALL" ]; then + fn_print_dots "Checking remote build: ${remotelocation}" + # Checks if remotebuild variable has been set. + if [ -z "${remotebuild}" ]||[ "${remotebuild}" == "null" ]; then + fn_print_fail "Checking remote build: ${remotelocation}" + fn_script_log_fatal "Checking remote build" + core_exit.sh + else + fn_print_ok "Checking remote build: ${remotelocation}" + fn_script_log_pass "Checking remote build" + fi + else + # Checks if remotebuild variable has been set. + if [ -z "${remotebuild}" ]||[ "${remotebuild}" == "null" ]; then + fn_print_failure "Unable to get remote build" + fn_script_log_fatal "Unable to get remote build" + core_exit.sh + fi + fi +} + +fn_update_steamcmd_compare(){ + fn_print_dots "Checking for update: ${remotelocation}" + if [ "${localbuild}" != "${remotebuild}" ]; then + fn_print_ok_nl "Checking for update: ${remotelocation}" + echo -en "\n" + echo -e "Update available" + echo -e "* Local build: ${red}${localbuild}${default}" + echo -e "* Remote build: ${green}${remotebuild}${default}" + if [ -n "${branch}" ]; then + echo -e "* Branch: ${branch}" + fi + if [ -n "${betapassword}" ]; then + echo -e "* Branch password: ${betapassword}" + fi + echo -e "https://steamdb.info/app/${appid}/" + echo -en "\n" + fn_script_log_info "Update available" + fn_script_log_info "Local build: ${localbuild}" + fn_script_log_info "Remote build: ${remotebuild}" + if [ -n "${branch}" ]; then + fn_script_log_info "Branch: ${branch}" + fi + if [ -n "${betapassword}" ]; then + fn_script_log_info "Branch password: ${betapassword}" + fi + fn_script_log_info "${localbuild} > ${remotebuild}" + + if [ "${commandname}" == "UPDATE" ]; then + unset updateonstart + check_status.sh + # If server stopped. + if [ "${status}" == "0" ]; then + fn_dl_steamcmd + # If server started. + else + fn_print_restart_warning + exitbypass=1 + command_stop.sh + fn_firstcommand_reset + exitbypass=1 + fn_dl_steamcmd + exitbypass=1 + command_start.sh + fn_firstcommand_reset + fi + unset exitbypass + date +%s > "${lockdir}/lastupdate.lock" + alert="update" + elif [ "${commandname}" == "CHECK-UPDATE" ]; then + alert="check-update" + fi + alert.sh + else + fn_print_ok_nl "Checking for update: ${remotelocation}" + echo -en "\n" + echo -e "No update available" + echo -e "* Local build: ${green}${localbuild}${default}" + echo -e "* Remote build: ${green}${remotebuild}${default}" + if [ -n "${branch}" ]; then + echo -e "* Branch: ${branch}" + fi + if [ -n "${betapassword}" ]; then + echo -e "* Branch password: ${betapassword}" + fi + echo -e "https://steamdb.info/app/${appid}/" + echo -en "\n" + fn_script_log_info "No update available" + fn_script_log_info "Local build: ${localbuild}" + fn_script_log_info "Remote build: ${remotebuild}" + if [ -n "${branch}" ]; then + fn_script_log_info "Branch: ${branch}" + fi + if [ -n "${betapassword}" ]; then + fn_script_log_info "Branch password: ${betapassword}" + fi + fi +} + +fn_appmanifest_info(){ + appmanifestfile=$(find "${serverfiles}" -type f -name "appmanifest_${appid}.acf") + appmanifestfilewc=$(find "${serverfiles}" -type f -name "appmanifest_${appid}.acf" | wc -l) +} + +fn_appmanifest_check(){ + fn_appmanifest_info + # Multiple or no matching appmanifest files may sometimes be present. + # This error is corrected if required. + if [ "${appmanifestfilewc}" -ge "2" ]; then + fn_print_error "Multiple appmanifest_${appid}.acf files found" + fn_script_log_error "Multiple appmanifest_${appid}.acf files found" + fn_print_dots "Removing x${appmanifestfilewc} appmanifest_${appid}.acf files" + for appfile in ${appmanifestfile}; do + rm -f "${appfile:?}" + done + appmanifestfilewc1="${appmanifestfilewc}" + fn_appmanifest_info + # if error can not be resolved. + if [ "${appmanifestfilewc}" -ge "2" ]; then + fn_print_fail "Unable to remove x${appmanifestfilewc} appmanifest_${appid}.acf files" + fn_script_log_fatal "Unable to remove x${appmanifestfilewc} appmanifest_${appid}.acf files" + echo -e "* Check user permissions" + for appfile in ${appmanifestfile}; do + echo -e " ${appfile}" + done + core_exit.sh + else + fn_print_ok "Removed x${appmanifestfilewc1} appmanifest_${appid}.acf files" + fn_script_log_pass "Removed x${appmanifestfilewc1} appmanifest_${appid}.acf files" + fn_print_info_nl "Forcing update to correct issue" + fn_script_log_info "Forcing update to correct issue" + fn_dl_steamcmd + fi + elif [ "${appmanifestfilewc}" -eq "0" ]; then + fn_print_error_nl "No appmanifest_${appid}.acf found" + fn_script_log_error "No appmanifest_${appid}.acf found" + fn_print_info_nl "Forcing update to correct issue" + fn_script_log_info "Forcing update to correct issue" + fn_dl_steamcmd + fn_appmanifest_info + if [ "${appmanifestfilewc}" -eq "0" ]; then + fn_print_fail_nl "Still no appmanifest_${appid}.acf found" + fn_script_log_fatal "Still no appmanifest_${appid}.acf found" + core_exit.sh + fi + fi +} diff --git a/lgsm/functions/update_steamcmd.sh b/lgsm/functions/update_steamcmd.sh index b7238daf3..0733a57d2 100644 --- a/lgsm/functions/update_steamcmd.sh +++ b/lgsm/functions/update_steamcmd.sh @@ -6,186 +6,8 @@ functionselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" -fn_update_steamcmd_localbuild(){ - # Gets local build info. - fn_print_dots "Checking local build: ${remotelocation}" - fn_appmanifest_check - # Uses appmanifest to find local build. - localbuild=$(grep buildid "${appmanifestfile}" | tr '[:blank:]"' ' ' | tr -s ' ' | cut -d\ -f3) - - # Set branch to public if no custom branch. - if [ -z "${branch}" ]; then - branch="public" - fi - - # Checks if localbuild variable has been set. - if [ -z "${localbuild}" ]||[ "${localbuild}" == "null" ]; then - fn_print_fail "Checking local build: ${remotelocation}" - fn_script_log_fatal "Checking local build" - core_exit.sh - else - fn_print_ok "Checking local build: ${remotelocation}" - fn_script_log_pass "Checking local build" - fi -} - -fn_update_steamcmd_remotebuild(){ - # Gets remote build info. - if [ -d "${steamcmddir}" ]; then - cd "${steamcmddir}" || exit - fi - - # Removes appinfo.vdf as a fix for not always getting up to date version info from SteamCMD. - if [ "$(find "${HOME}" -type f -name "appinfo.vdf" | wc -l)" -ne "0" ]; then - find "${HOME}" -type f -name "appinfo.vdf" -exec rm -f {} \; - fi - - # password for branch not needed to check the buildid - remotebuild=$(${steamcmdcommand} +login "${steamuser}" "${steampass}" +app_info_update 1 +app_info_print "${appid}" +quit | sed -e '/"branches"/,/^}/!d' | sed -n "/\"${branch}\"/,/}/p" | grep -m 1 buildid | tr -cd '[:digit:]') - - if [ "${firstcommandname}" != "INSTALL" ]; then - fn_print_dots "Checking remote build: ${remotelocation}" - # Checks if remotebuild variable has been set. - if [ -z "${remotebuild}" ]||[ "${remotebuild}" == "null" ]; then - fn_print_fail "Checking remote build: ${remotelocation}" - fn_script_log_fatal "Checking remote build" - core_exit.sh - else - fn_print_ok "Checking remote build: ${remotelocation}" - fn_script_log_pass "Checking remote build" - fi - else - # Checks if remotebuild variable has been set. - if [ -z "${remotebuild}" ]||[ "${remotebuild}" == "null" ]; then - fn_print_failure "Unable to get remote build" - fn_script_log_fatal "Unable to get remote build" - core_exit.sh - fi - fi -} - -fn_update_steamcmd_compare(){ - fn_print_dots "Checking for update: ${remotelocation}" - if [ "${localbuild}" != "${remotebuild}" ]; then - fn_print_ok_nl "Checking for update: ${remotelocation}" - echo -en "\n" - echo -e "Update available" - echo -e "* Local build: ${red}${localbuild}${default}" - echo -e "* Remote build: ${green}${remotebuild}${default}" - if [ -n "${branch}" ]; then - echo -e "* Branch: ${branch}" - fi - if [ -n "${betapassword}" ]; then - echo -e "* Branch password: ${betapassword}" - fi - echo -e "https://steamdb.info/app/${appid}/" - echo -en "\n" - fn_script_log_info "Update available" - fn_script_log_info "Local build: ${localbuild}" - fn_script_log_info "Remote build: ${remotebuild}" - if [ -n "${branch}" ]; then - fn_script_log_info "Branch: ${branch}" - fi - if [ -n "${betapassword}" ]; then - fn_script_log_info "Branch password: ${betapassword}" - fi - fn_script_log_info "${localbuild} > ${remotebuild}" - - unset updateonstart - check_status.sh - # If server stopped. - if [ "${status}" == "0" ]; then - fn_dl_steamcmd - # If server started. - else - fn_print_restart_warning - exitbypass=1 - command_stop.sh - fn_firstcommand_reset - exitbypass=1 - fn_dl_steamcmd - exitbypass=1 - command_start.sh - fn_firstcommand_reset - fi - unset exitbypass - date +%s > "${lockdir}/lastupdate.lock" - alert="update" - alert.sh - else - fn_print_ok_nl "Checking for update: ${remotelocation}" - echo -en "\n" - echo -e "No update available" - echo -e "* Local build: ${green}${localbuild}${default}" - echo -e "* Remote build: ${green}${remotebuild}${default}" - if [ -n "${branch}" ]; then - echo -e "* Branch: ${branch}" - fi - if [ -n "${betapassword}" ]; then - echo -e "* Branch password: ${betapassword}" - fi - echo -e "https://steamdb.info/app/${appid}/" - echo -en "\n" - fn_script_log_info "No update available" - fn_script_log_info "Local build: ${localbuild}" - fn_script_log_info "Remote build: ${remotebuild}" - if [ -n "${branch}" ]; then - fn_script_log_info "Branch: ${branch}" - fi - if [ -n "${betapassword}" ]; then - fn_script_log_info "Branch password: ${betapassword}" - fi - fi -} - -fn_appmanifest_info(){ - appmanifestfile=$(find "${serverfiles}" -type f -name "appmanifest_${appid}.acf") - appmanifestfilewc=$(find "${serverfiles}" -type f -name "appmanifest_${appid}.acf" | wc -l) -} - -fn_appmanifest_check(){ - fn_appmanifest_info - # Multiple or no matching appmanifest files may sometimes be present. - # This error is corrected if required. - if [ "${appmanifestfilewc}" -ge "2" ]; then - fn_print_error "Multiple appmanifest_${appid}.acf files found" - fn_script_log_error "Multiple appmanifest_${appid}.acf files found" - fn_print_dots "Removing x${appmanifestfilewc} appmanifest_${appid}.acf files" - for appfile in ${appmanifestfile}; do - rm -f "${appfile:?}" - done - appmanifestfilewc1="${appmanifestfilewc}" - fn_appmanifest_info - # if error can not be resolved. - if [ "${appmanifestfilewc}" -ge "2" ]; then - fn_print_fail "Unable to remove x${appmanifestfilewc} appmanifest_${appid}.acf files" - fn_script_log_fatal "Unable to remove x${appmanifestfilewc} appmanifest_${appid}.acf files" - echo -e "* Check user permissions" - for appfile in ${appmanifestfile}; do - echo -e " ${appfile}" - done - core_exit.sh - else - fn_print_ok "Removed x${appmanifestfilewc1} appmanifest_${appid}.acf files" - fn_script_log_pass "Removed x${appmanifestfilewc1} appmanifest_${appid}.acf files" - fn_print_info_nl "Forcing update to correct issue" - fn_script_log_info "Forcing update to correct issue" - fn_dl_steamcmd - fi - elif [ "${appmanifestfilewc}" -eq "0" ]; then - fn_print_error_nl "No appmanifest_${appid}.acf found" - fn_script_log_error "No appmanifest_${appid}.acf found" - fn_print_info_nl "Forcing update to correct issue" - fn_script_log_info "Forcing update to correct issue" - fn_dl_steamcmd - fn_appmanifest_info - if [ "${appmanifestfilewc}" -eq "0" ]; then - fn_print_fail_nl "Still no appmanifest_${appid}.acf found" - fn_script_log_fatal "Still no appmanifest_${appid}.acf found" - core_exit.sh - fi - fi -} +# init steamcmd functions +core_steamcmd.sh # The location where the builds are checked and downloaded. remotelocation="SteamCMD" From e9dbda748e85392a3fc8a73d09dce97aeb35d7c3 Mon Sep 17 00:00:00 2001 From: Christian Date: Sun, 3 Jan 2021 00:12:19 +0100 Subject: [PATCH 518/534] fix(steamcmd): retries are not honored if install succeeds (#3155) --- lgsm/functions/core_dl.sh | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/lgsm/functions/core_dl.sh b/lgsm/functions/core_dl.sh index 35b5e008b..01ffcfbc3 100755 --- a/lgsm/functions/core_dl.sh +++ b/lgsm/functions/core_dl.sh @@ -87,8 +87,9 @@ fn_dl_steamcmd(){ fi # Error checking for SteamCMD. Some errors will loop to try again and some will just exit. + # Check also if we have more errors than retries to be sure that we do not loop to many times and error out. exitcode=$? - if [ -n "$(grep "Error!" "${steamcmdlog}" | tail -1)" ]||[ -n "$(grep "ERROR!" "${steamcmdlog}" | tail -1)" ]; then + if [ -n "$(grep -i "Error!" "${steamcmdlog}" | tail -1)" ]&&[ "$(grep -ic "Error!" "${steamcmdlog}")" -ge "${counter}" ] ; then # Not enough space. if [ -n "$(grep "0x202" "${steamcmdlog}" | tail -1)" ]; then fn_print_failure_nl "${commandaction} ${selfname}: ${remotelocation}: Not enough space to download server files" From ede205ad6bb4af90a4c7db0c3c06683e70b024a7 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Thu, 7 Jan 2021 16:11:30 +0000 Subject: [PATCH 519/534] feat: refactor check_config removing some game specific code (#3160) --- lgsm/functions/check_config.sh | 35 +++++++++++++++------------------- 1 file changed, 15 insertions(+), 20 deletions(-) diff --git a/lgsm/functions/check_config.sh b/lgsm/functions/check_config.sh index 2b4443cb3..ce9035744 100755 --- a/lgsm/functions/check_config.sh +++ b/lgsm/functions/check_config.sh @@ -6,26 +6,21 @@ functionselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" -if [ ! -f "${servercfgfullpath}" ]; then - if [ "${shortname}" != "hw" ]&&[ "${shortname}" != "ut3" ]&&[ "${shortname}" != "kf2" ]; then - fn_print_dots "" - fn_print_warn_nl "Configuration file missing!" - echo -e "${servercfgfullpath}" - fn_script_log_warn "Configuration file missing!" - fn_script_log_warn "${servercfgfullpath}" - install_config.sh - fi +if [ -n "${servercfgfullpath}" ]&&[ ! -f "${servercfgfullpath}" ]; then + fn_print_dots "" + fn_print_warn_nl "Configuration file missing!" + echo -e "${servercfgfullpath}" + fn_script_log_warn "Configuration file missing!" + fn_script_log_warn "${servercfgfullpath}" + install_config.sh fi -if [ "${shortname}" == "rust" ]; then - if [ -z "${rconpassword}" ]; then - fn_print_dots "" - fn_print_fail_nl "RCON password is not set" - fn_script_log_fatal "RCON password is not set" - core_exit.sh - elif [ "${rconpassword}" == "CHANGE_ME" ]; then - fn_print_dots "" - fn_print_warn_nl "Default RCON Password detected" - fn_script_log_warn "Default RCON Password detected" - fi +if [ "${shortname}" == "rust" ]&&[ -v rconpassword ]&&[ -z "${rconpassword}" ]; then + fn_print_dots "" + fn_print_fail_nl "RCON password is not set" + fn_script_log_warn "RCON password is not set" +elif [ -v rconpassword ]&&[ "${rconpassword}" == "CHANGE_ME" ]; then + fn_print_dots "" + fn_print_warn_nl "Default RCON Password detected" + fn_script_log_warn "Default RCON Password detected" fi From 16e58f1d327b8c6818dd31114733f1c8dcbfafee Mon Sep 17 00:00:00 2001 From: Christian Date: Sat, 9 Jan 2021 00:10:57 +0100 Subject: [PATCH 520/534] fix(gmod): update link for wiki page (#3165) --- lgsm/config-default/config-lgsm/gmodserver/_default.cfg | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lgsm/config-default/config-lgsm/gmodserver/_default.cfg b/lgsm/config-default/config-lgsm/gmodserver/_default.cfg index 1e8fb92aa..4bac3995c 100644 --- a/lgsm/config-default/config-lgsm/gmodserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/gmodserver/_default.cfg @@ -18,7 +18,7 @@ maxplayers="16" tickrate="66" gamemode="sandbox" -## Workshop Parameters | https://wiki.garrysmod.com/page/Workshop_for_Dedicated_Servers +## Workshop Parameters | https://wiki.facepunch.com/gmod/Workshop_for_Dedicated_Servers # To get an API key visit - https://steamcommunity.com/dev/apikey wsapikey="" wscollectionid="" From 681d878e9270eb6c442998b144af73e4b9ee19fe Mon Sep 17 00:00:00 2001 From: Christian Date: Sat, 9 Jan 2021 22:01:15 +0100 Subject: [PATCH 521/534] fix(steamcmd): fix branch switch (#3168) --- lgsm/functions/core_dl.sh | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/lgsm/functions/core_dl.sh b/lgsm/functions/core_dl.sh index 01ffcfbc3..7bb346a85 100755 --- a/lgsm/functions/core_dl.sh +++ b/lgsm/functions/core_dl.sh @@ -61,7 +61,7 @@ fn_dl_steamcmd(){ # If using a specific branch. if [ -n "${branch}" ]&&[ -n "${betapassword}" ]; then ${unbuffer} ${steamcmdcommand} +login "${steamuser}" "${steampass}" +force_install_dir "${serverfiles}" +app_set_config 90 mod "${appidmod}" +app_update "${appid}" -beta "${branch}" -betapassword "${betapassword}" ${validate} +quit | uniq | tee -a "${lgsmlog}" "${steamcmdlog}" - elif [ -n "${branch}" ]&&[ "${branch}" != "public" ]; then + elif [ -n "${branch}" ]; then ${unbuffer} ${steamcmdcommand} +login "${steamuser}" "${steampass}" +force_install_dir "${serverfiles}" +app_set_config 90 mod "${appidmod}" +app_update "${appid}" -beta "${branch}" ${validate} +quit | uniq | tee -a "${lgsmlog}" "${steamcmdlog}" else ${unbuffer} ${steamcmdcommand} +login "${steamuser}" "${steampass}" +force_install_dir "${serverfiles}" +app_set_config 90 mod "${appidmod}" +app_update "${appid}" ${validate} +quit | uniq | tee -a "${lgsmlog}" "${steamcmdlog}" @@ -70,7 +70,7 @@ fn_dl_steamcmd(){ elif [ "${shortname}" == "ac" ]||[ "${shortname}" == "jk2" ]; then if [ -n "${branch}" ]&&[ -n "${betapassword}" ]; then ${unbuffer} ${steamcmdcommand} +@sSteamCmdForcePlatformType windows +login "${steamuser}" "${steampass}" +force_install_dir "${serverfiles}" +app_update "${appid}" -beta "${branch}" -betapassword "${betapassword}" ${validate} +quit | uniq | tee -a "${lgsmlog}" "${steamcmdlog}" - elif [ -n "${branch}" ]&&[ "${branch}" != "public" ]; then + elif [ -n "${branch}" ]; then ${unbuffer} ${steamcmdcommand} +@sSteamCmdForcePlatformType windows +login "${steamuser}" "${steampass}" +force_install_dir "${serverfiles}" +app_update "${appid}" -beta "${branch}" ${validate} +quit | uniq | tee -a "${lgsmlog}" "${steamcmdlog}" else ${unbuffer} ${steamcmdcommand} +@sSteamCmdForcePlatformType windows +login "${steamuser}" "${steampass}" +force_install_dir "${serverfiles}" +app_update "${appid}" ${validate} +quit | uniq | tee -a "${lgsmlog}" "${steamcmdlog}" @@ -79,7 +79,7 @@ fn_dl_steamcmd(){ else if [ -n "${branch}" ]&&[ -n "${betapassword}" ]; then ${unbuffer} ${steamcmdcommand} +login "${steamuser}" "${steampass}" +force_install_dir "${serverfiles}" +app_update "${appid}" -beta "${branch}" -betapassword "${betapassword}" ${validate} +quit | uniq | tee -a "${lgsmlog}" "${steamcmdlog}" - elif [ -n "${branch}" ]&&[ "${branch}" != "public" ]; then + elif [ -n "${branch}" ]; then ${unbuffer} ${steamcmdcommand} +login "${steamuser}" "${steampass}" +force_install_dir "${serverfiles}" +app_update "${appid}" -beta "${branch}" ${validate} +quit | uniq | tee -a "${lgsmlog}" "${steamcmdlog}" else ${unbuffer} ${steamcmdcommand} +login "${steamuser}" "${steampass}" +force_install_dir "${serverfiles}" +app_update "${appid}" ${validate} +quit | uniq | tee -a "${lgsmlog}" "${steamcmdlog}" From 223b076cdd9186f488d651f52a597cca10ee391b Mon Sep 17 00:00:00 2001 From: Christian Date: Sun, 10 Jan 2021 01:22:04 +0100 Subject: [PATCH 522/534] feat(newserver): Vintage Story (#3156) Co-authored-by: Daniel Gibbs --- .../config-lgsm/vintsserver/_default.cfg | 171 ++++++++++++++++++ lgsm/data/serverlist.csv | 1 + lgsm/functions/check_deps.sh | 6 + lgsm/functions/command_update.sh | 2 + lgsm/functions/core_functions.sh | 5 + lgsm/functions/info_config.sh | 23 +++ lgsm/functions/info_messages.sh | 13 +- lgsm/functions/install_config.sh | 7 + lgsm/functions/install_server_files.sh | 2 + lgsm/functions/update_minecraft.sh | 2 +- lgsm/functions/update_vintagestory.sh | 145 +++++++++++++++ 11 files changed, 375 insertions(+), 2 deletions(-) create mode 100644 lgsm/config-default/config-lgsm/vintsserver/_default.cfg create mode 100755 lgsm/functions/update_vintagestory.sh diff --git a/lgsm/config-default/config-lgsm/vintsserver/_default.cfg b/lgsm/config-default/config-lgsm/vintsserver/_default.cfg new file mode 100644 index 000000000..e23baf8af --- /dev/null +++ b/lgsm/config-default/config-lgsm/vintsserver/_default.cfg @@ -0,0 +1,171 @@ +################################## +######## Default Settings ######## +################################## +# DO NOT EDIT, ANY CHANGES 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. + +#### Game Server Settings #### + +## Server Parameters | https://docs.linuxgsm.com/configuration/start-parameters#additional-parameters +fn_parms(){ +parms="--datapath ${servercfgdir}" +} + +## Release Settings | https://docs.linuxgsm.com/game-servers/vintagestory#release-settings +# Branch (stable|unstable) +branch="stable" + +#### LinuxGSM Settings #### + +## LinuxGSM Stats +# Send useful stats to LinuxGSM developers. +# https://docs.linuxgsm.com/configuration/linuxgsm-stats +# (on|off) +stats="off" + +## Notification Alerts +# (on|off) + +# Display IP | https://docs.linuxgsm.com/alerts#display-ip +displayip="" + +# More info | https://docs.linuxgsm.com/alerts#more-info +postalert="off" + +# Discord Alerts | https://docs.linuxgsm.com/alerts/discord +discordalert="off" +discordwebhook="webhook" + +# Email Alerts | https://docs.linuxgsm.com/alerts/email +emailalert="off" +email="email@example.com" +emailfrom="" + +# IFTTT Alerts | https://docs.linuxgsm.com/alerts/ifttt +iftttalert="off" +ifttttoken="accesstoken" +iftttevent="linuxgsm_alert" + +# Mailgun Email Alerts | https://docs.linuxgsm.com/alerts/mailgun +mailgunalert="off" +mailgunapiregion="us" +mailguntoken="accesstoken" +mailgundomain="example.com" +mailgunemailfrom="alert@example.com" +mailgunemail="email@myemail.com" + +# Pushbullet Alerts | https://docs.linuxgsm.com/alerts/pushbullet +pushbulletalert="off" +pushbullettoken="accesstoken" +channeltag="" + +# Pushover Alerts | https://docs.linuxgsm.com/alerts/pushover +pushoveralert="off" +pushovertoken="accesstoken" +pushoveruserkey="userkey" + +# Rocket.Chat Alerts | https://docs.linuxgsm.com/alerts/rocket.chat +rocketchatalert="off" +rocketchatwebhook="webhook" +rocketchattoken="" + +# Slack Alerts | https://docs.linuxgsm.com/alerts/slack +slackalert="off" +slackwebhook="webhook" + +# Telegram Alerts | https://docs.linuxgsm.com/alerts/telegram +# You can add a custom cURL string eg proxy (useful in Russia) in "curlcustomstring". +# For example "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help". +telegramalert="off" +telegramtoken="accesstoken" +telegramchatid="" +curlcustomstring="" + +## Updating | https://docs.linuxgsm.com/commands/update +updateonstart="off" + +## Backup | https://docs.linuxgsm.com/commands/backup +maxbackups="4" +maxbackupdays="30" +stoponbackup="on" + +## Logging | https://docs.linuxgsm.com/features/logging +consolelogging="on" +logdays="7" + +## Monitor | https://docs.linuxgsm.com/commands/monitor +# Query delay time +querydelay="1" + +## ANSI Colors | https://docs.linuxgsm.com/features/ansi-colors +ansi="on" + +#### Advanced Settings #### + +## Message Display Time | https://docs.linuxgsm.com/features/message-display-time +sleeptime="0.5" + +## Stop Mode | https://docs.linuxgsm.com/features/stop-mode +# 1: tmux kill +# 2: CTRL+c +# 3: quit +# 4: quit 120s +# 5: stop +# 6: q +# 7: exit +# 8: 7 Days to Die +# 9: GoldSrc +# 10: Avorion +# 11: end +stopmode="2" + +## Query mode +# 1: session only +# 2: gamedig (gsquery fallback) +# 3: gamedig +# 4: gsquery +# 5: tcp +querymode="5" +querytype="" + +## Console type +consoleverbose="yes" +consoleinteract="yes" + +## Game Server Details +# Do not edit +gamename="Vintage Story" +engine="vintagestory" +glibc="2.17" + +#### Directories #### +# Edit with care + +## Game Server Directories +systemdir="${serverfiles}" +executabledir="${systemdir}" +preexecutable="mono" +executable="./VintagestoryServer.exe" +servercfgdir="${serverfiles}/data/${selfname}" +servercfg="serverconfig.json" +servercfgdefault="serverconfig.json" +servercfgfullpath="${servercfgdir}/${servercfg}" + +## Backup Directory +backupdir="${lgsmdir}/backup" + +## Logging Directories +logdir="${rootdir}/log" +gamelogdir="${vsdataworld}/Logs" +lgsmlogdir="${logdir}/script" +consolelogdir="${logdir}/console" +lgsmlog="${lgsmlogdir}/${selfname}-script.log" +consolelog="${consolelogdir}/${selfname}-console.log" +alertlog="${lgsmlogdir}/${selfname}-alert.log" +postdetailslog="${lgsmlogdir}/${selfname}-postdetails.log" + +## Logs Naming +lgsmlogdate="${lgsmlogdir}/${selfname}-script-$(date '+%Y-%m-%d-%H:%M:%S').log" +consolelogdate="${consolelogdir}/${selfname}-console-$(date '+%Y-%m-%d-%H:%M:%S').log" diff --git a/lgsm/data/serverlist.csv b/lgsm/data/serverlist.csv index 7786158f1..92f194046 100644 --- a/lgsm/data/serverlist.csv +++ b/lgsm/data/serverlist.csv @@ -104,6 +104,7 @@ ut2k4,ut2k4server,Unreal Tournament 2004 ut3,ut3server,Unreal Tournament 3 ut99,ut99server,Unreal Tournament 99 vs,vsserver,Vampire Slayer +vints,vintsserver,Vintage Story wet,wetserver,Wolfenstein: Enemy Territory wf,wfserver,Warfork wurm,wurmserver,Wurm Unlimited diff --git a/lgsm/functions/check_deps.sh b/lgsm/functions/check_deps.sh index 621b12eae..5a9b34be8 100755 --- a/lgsm/functions/check_deps.sh +++ b/lgsm/functions/check_deps.sh @@ -452,6 +452,9 @@ fn_deps_build_debian(){ # Unreal Tournament elif [ "${shortname}" == "ut" ]; then array_deps_required+=( unzip ) + # Vintage Story + elif [ "${shortname}" == "vints" ]; then + array_deps_required+=( mono-complete ) # Wurm: Unlimited elif [ "${shortname}" == "wurm" ]; then array_deps_required+=( xvfb ) @@ -564,6 +567,9 @@ fn_deps_build_redhat(){ # Unreal Tournament elif [ "${shortname}" == "ut" ]; then array_deps_required+=( unzip ) + # Vintage Story + elif [ "${shortname}" == "vints" ]; then + array_deps_required+=( mono-complete ) # Wurm: Unlimited elif [ "${shortname}" == "wurm" ]; then array_deps_required+=( xorg-x11-server-Xvfb ) diff --git a/lgsm/functions/command_update.sh b/lgsm/functions/command_update.sh index b117cbec5..718f5d490 100755 --- a/lgsm/functions/command_update.sh +++ b/lgsm/functions/command_update.sh @@ -28,6 +28,8 @@ elif [ "${shortname}" == "mta" ]; then update_mta.sh elif [ "${shortname}" == "jk2" ]; then update_jediknight2.sh +elif [ "${shortname}" == "vints" ]; then + update_vintagestory.sh else update_steamcmd.sh fi diff --git a/lgsm/functions/core_functions.sh b/lgsm/functions/core_functions.sh index ce8458b5d..3a8c77def 100755 --- a/lgsm/functions/core_functions.sh +++ b/lgsm/functions/core_functions.sh @@ -649,6 +649,11 @@ functionfile="${FUNCNAME[0]}" fn_fetch_function } +update_vintagestory.sh(){ +functionfile="${FUNCNAME[0]}" +fn_fetch_function +} + fn_update_functions.sh(){ functionfile="${FUNCNAME[0]}" fn_fetch_function diff --git a/lgsm/functions/info_config.sh b/lgsm/functions/info_config.sh index 99eed24c4..3720c421e 100755 --- a/lgsm/functions/info_config.sh +++ b/lgsm/functions/info_config.sh @@ -1548,6 +1548,27 @@ fn_info_config_col(){ fi } +fn_info_config_vintagestory(){ + if [ ! -f "${servercfgfullpath}" ]; then + servername="${unavailable}" + maxplayers="${unavailable}" + serverpassword="${unavailable}" + port="${unavailable}" + queryport="${unavailable}" + configip="${unavailable}" + else + servername=$(jq -r '.ServerName' "${servercfgfullpath}") + maxplayers=$(jq -r '.MaxClients' "${servercfgfullpath}") + serverpassword=$(jq -r 'select(.Password != null) | .Password' "${servercfgfullpath}") + port=$(jq -r '.Port' "${servercfgfullpath}") + queryport=${port:-"0"} + configip=$(jq -r 'select(.Ip != null) | .Ip' "${servercfgfullpath}") + + serverpassword=${serverpassword:-"NOT SET"} + configip=${configip:-"0.0.0.0"} + fi +} + if [ "${shortname}" == "ac" ]; then fn_info_config_assettocorsa elif [ "${shortname}" == "ark" ]; then @@ -1672,4 +1693,6 @@ elif [ "${shortname}" == "mh" ]; then fn_info_config_mordhau elif [ "${shortname}" == "pvr" ];then fn_info_config_pavlovvr +elif [ "${shortname}" == "vints" ]; then + fn_info_config_vintagestory fi diff --git a/lgsm/functions/info_messages.sh b/lgsm/functions/info_messages.sh index 177129bfd..93dbea45b 100755 --- a/lgsm/functions/info_messages.sh +++ b/lgsm/functions/info_messages.sh @@ -572,7 +572,7 @@ fn_info_message_ports(){ parmslocation="${red}UNKNOWN${default}" # engines/games that require editing in the config file. - local ports_edit_array=( "avalanche2.0" "avalanche3.0" "Ballistic Overkill" "Barotrauma" "dontstarve" "Eco" "idtech2" "idtech3" "idtech3_ql" "lwjgl2" "Minecraft Bedrock" "Project Cars" "projectzomboid" "quake" "refractor" "realvirtuality" "renderware" "Stationeers" "teeworlds" "terraria" "unreal" "unreal2" "unreal3" "TeamSpeak 3" "Mumble" "7 Days To Die" "wurm") + local ports_edit_array=( "avalanche2.0" "avalanche3.0" "Ballistic Overkill" "Barotrauma" "dontstarve" "Eco" "idtech2" "idtech3" "idtech3_ql" "lwjgl2" "Minecraft Bedrock" "Project Cars" "projectzomboid" "quake" "refractor" "realvirtuality" "renderware" "Stationeers" "teeworlds" "terraria" "unreal" "unreal2" "unreal3" "TeamSpeak 3" "Mumble" "7 Days To Die" "Vintage Story" "wurm") for port_edit in "${ports_edit_array[@]}"; do if [ "${shortname}" == "ut3" ]; then parmslocation="${servercfgdir}/UTWeb.ini" @@ -1455,6 +1455,15 @@ fn_info_message_colony(){ } | column -s $'\t' -t } +fn_info_message_vintagestory(){ + echo "netstat -atunp | grep cli" + echo -e "" + { + echo -e "DESCRIPTION\tDIRECTION\tPORT\tPROTOCOL" + echo -e "> Game\tINBOUND\t${port}\tTCP" + } | column -s $'\t' -t +} + fn_info_message_select_engine(){ # Display details depending on game or engine. if [ "${shortname}" == "ac" ]; then @@ -1573,6 +1582,8 @@ fn_info_message_select_engine(){ fn_info_message_pavlovvr elif [ "${shortname}" == "rust" ]; then fn_info_message_rust + elif [ "${shortname}" == "vints" ]; then + fn_info_message_vintagestory elif [ "${shortname}" == "wf" ]; then fn_info_message_warfork elif [ "${shortname}" == "wurm" ]; then diff --git a/lgsm/functions/install_config.sh b/lgsm/functions/install_config.sh index 052e535d2..3efb46a65 100755 --- a/lgsm/functions/install_config.sh +++ b/lgsm/functions/install_config.sh @@ -793,6 +793,13 @@ elif [ "${shortname}" == "unt" ]; then fn_default_config_remote fn_set_config_vars fn_list_config_locations +elif [ "${shortname}" == "vints" ]; then + gamedirname="VintageStory" + array_configs+=( serverconfig.json ) + fn_fetch_default_config + fn_default_config_remote + fn_set_config_vars + fn_list_config_locations elif [ "${shortname}" == "vs" ]; then gamedirname="VampireSlayer" array_configs+=( server.cfg ) diff --git a/lgsm/functions/install_server_files.sh b/lgsm/functions/install_server_files.sh index f8b6be4f0..a3c40da37 100755 --- a/lgsm/functions/install_server_files.sh +++ b/lgsm/functions/install_server_files.sh @@ -91,6 +91,8 @@ elif [ "${shortname}" == "fctr" ]; then install_factorio_save.sh elif [ "${shortname}" == "jk2" ]; then update_jediknight2.sh +elif [ "${shortname}" == "vints" ]; then + update_vintagestory.sh elif [ -z "${appid}" ]||[ "${shortname}" == "ahl" ]||[ "${shortname}" == "bd" ]||[ "${shortname}" == "bb" ]||[ "${shortname}" == "ns" ]||[ "${shortname}" == "sfc" ]||[ "${shortname}" == "ts" ]||[ "${shortname}" == "vs" ]||[ "${shortname}" == "zmr" ]; then if [ "${shortname}" == "ut" ]; then install_eula.sh diff --git a/lgsm/functions/update_minecraft.sh b/lgsm/functions/update_minecraft.sh index e33840f3e..34adf43fc 100755 --- a/lgsm/functions/update_minecraft.sh +++ b/lgsm/functions/update_minecraft.sh @@ -88,10 +88,10 @@ fn_update_minecraft_compare(){ echo -e "Update available" echo -e "* Local build: ${red}${localbuild}${default}" echo -e "* Remote build: ${green}${remotebuild}${default}" - echo -en "\n" if [ -n "${branch}" ]; then echo -e "* Branch: ${branch}" fi + echo -en "\n" fn_script_log_info "Update available" fn_script_log_info "Local build: ${localbuild}" fn_script_log_info "Remote build: ${remotebuild}" diff --git a/lgsm/functions/update_vintagestory.sh b/lgsm/functions/update_vintagestory.sh new file mode 100755 index 000000000..98568f3ca --- /dev/null +++ b/lgsm/functions/update_vintagestory.sh @@ -0,0 +1,145 @@ +#!/bin/bash +# LinuxGSM update_vintagestory.sh function +# Author: Christian Birk +# Website: https://linuxgsm.com +# Description: Handles updating of Vintage Story servers. + +functionselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" + +fn_update_vs_dl(){ + # get version info for download + remotebuildresponse=$(curl -s "${apiurl}" | jq --arg version "${remotebuild}" '.[$version].server') + remotebuildfile=$(echo -e "${remotebuildresponse}" | jq -r '.filename') + remotebuildlink=$(echo -e "${remotebuildresponse}" | jq -r '.urls.cdn') + remotebuildmd5=$(echo -e "${remotebuildresponse}" | jq -r '.md5') + + # Download and extract files to serverfiles + fn_fetch_file "${remotebuildlink}" "" "" "" "${tmpdir}" "${remotebuildfile}" "nochmodx" "norun" "force" "${remotebuildmd5}" + fn_dl_extract "${tmpdir}" "${remotebuildfile}" "${serverfiles}" + fn_clear_tmp +} + +fn_update_vs_localbuild(){ + # Gets local build info. + fn_print_dots "Checking local build: ${remotelocation}" + # Uses executable to find local build. + cd "${executabledir}" || exit + if [ -f "${executable}" ]; then + localbuild="$(${preexecutable} ${executable} --version | sed '/^[[:space:]]*$/d')" + fn_print_ok "Checking local build: ${remotelocation}" + fn_script_log_pass "Checking local build" + else + localbuild="0" + fn_print_error "Checking local build: ${remotelocation}" + fn_script_log_error "Checking local build" + fi +} + +fn_update_vs_remotebuild(){ + if [ "${branch}" == "stable" ]; then + remotebuild=$(curl -s "${apiurl}" | jq -r '[ to_entries[] ] | .[].key' | grep -Ev "\-rc|\-pre" | sort -r -V | head -1) + else + remotebuild=$(curl -s "${apiurl}" | jq -r '[ to_entries[] ] | .[].key' | grep -E "\-rc|\-pre" | sort -r -V | head -1) + fi + + if [ "${firstcommandname}" != "INSTALL" ]; then + fn_print_dots "Checking remote build: ${remotelocation}" + # Checks if remotebuild variable has been set. + if [ -z "${remotebuild}" ]||[ "${remotebuild}" == "null" ]; then + fn_print_fail "Checking remote build: ${remotelocation}" + fn_script_log_fatal "Checking remote build" + core_exit.sh + else + fn_print_ok "Checking remote build: ${remotelocation}" + fn_script_log_pass "Checking remote build" + fi + else + # Checks if remotebuild variable has been set. + if [ -z "${remotebuild}" ]||[ "${remotebuild}" == "null" ]; then + fn_print_failure "Unable to get remote build" + fn_script_log_fatal "Unable to get remote build" + core_exit.sh + fi + fi +} + +fn_update_vs_compare(){ + # Removes dots so if statement can compare version numbers. + fn_print_dots "Checking for update: ${remotelocation}" + if [ "${localbuild}" != "${remotebuild}" ]||[ "${forceupdate}" == "1" ]; then + fn_print_ok_nl "Checking for update: ${remotelocation}" + echo -en "\n" + echo -e "Update available" + echo -e "* Local build: ${red}${localbuild}${default}" + echo -e "* Remote build: ${green}${remotebuild}${default}" + if [ -n "${branch}" ]; then + echo -e "* Branch: ${branch}" + fi + echo -en "\n" + fn_script_log_info "Update available" + fn_script_log_info "Local build: ${localbuild}" + fn_script_log_info "Remote build: ${remotebuild}" + fn_script_log_info "${localbuild} > ${remotebuild}" + + unset updateonstart + check_status.sh + # If server stopped. + if [ "${status}" == "0" ]; then + exitbypass=1 + fn_update_vs_dl + exitbypass=1 + command_start.sh + exitbypass=1 + command_stop.sh + fn_firstcommand_reset + # If server started. + else + fn_print_restart_warning + exitbypass=1 + command_stop.sh + fn_firstcommand_reset + exitbypass=1 + fn_update_vs_dl + exitbypass=1 + command_start.sh + fn_firstcommand_reset + fi + unset exitbypass + date +%s > "${lockdir}/lastupdate.lock" + alert="update" + alert.sh + else + fn_print_ok_nl "Checking for update: ${remotelocation}" + echo -en "\n" + echo -e "No update available" + echo -e "* Local build: ${green}${localbuild}${default}" + echo -e "* Remote build: ${green}${remotebuild}${default}" + if [ -n "${branch}" ]; then + echo -e "* Branch: ${branch}" + fi + echo -en "\n" + fn_script_log_info "No update available" + fn_script_log_info "Local build: ${localbuild}" + fn_script_log_info "Remote build: ${remotebuild}" + if [ -n "${branch}" ]; then + fn_script_log_info "Branch: ${branch}" + fi + fi +} + +# The location where the builds are checked and downloaded. +remotelocation="vintagestory.at" +apiurl="http://api.${remotelocation}/stable-unstable.json" +localversionfile="${datadir}/vintagestoryversion" + +if [ "${firstcommandname}" == "INSTALL" ]; then + fn_update_vs_remotebuild + fn_update_vs_dl +else + fn_print_dots "Checking for update" + fn_print_dots "Checking for update: ${remotelocation}" + fn_script_log_info "Checking for update: ${remotelocation}" + fn_update_vs_localbuild + fn_update_vs_remotebuild + fn_update_vs_compare +fi From 05e45700e7b2b2c87ac0840630c3da2be96c1dc5 Mon Sep 17 00:00:00 2001 From: Christian Date: Sun, 10 Jan 2021 23:26:22 +0100 Subject: [PATCH 523/534] feat(newserver): SCP: Secret Laboratory (#3163) --- .../config-lgsm/scpslserver/_default.cfg | 168 ++++++++++++++++++ .../config-lgsm/scpslsmserver/_default.cfg | 168 ++++++++++++++++++ lgsm/data/serverlist.csv | 2 + lgsm/functions/check_deps.sh | 3 + lgsm/functions/info_config.sh | 22 +++ lgsm/functions/info_messages.sh | 13 +- lgsm/functions/info_parms.sh | 7 + lgsm/functions/install_config.sh | 7 + 8 files changed, 389 insertions(+), 1 deletion(-) create mode 100644 lgsm/config-default/config-lgsm/scpslserver/_default.cfg create mode 100644 lgsm/config-default/config-lgsm/scpslsmserver/_default.cfg diff --git a/lgsm/config-default/config-lgsm/scpslserver/_default.cfg b/lgsm/config-default/config-lgsm/scpslserver/_default.cfg new file mode 100644 index 000000000..4a706ae40 --- /dev/null +++ b/lgsm/config-default/config-lgsm/scpslserver/_default.cfg @@ -0,0 +1,168 @@ +################################## +######## 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://docs.linuxgsm.com/configuration/start-parameters +## All server settings except the server port are done in the config file: +## Docs: https://en.scpslgame.com/index.php?title=Docs:Server_Config +port="7777" + +## Server Start Command | https://docs.linuxgsm.com/configuration/start-parameters#additional-parameters +fn_parms(){ +parms="${port}" +} + +#### LinuxGSM Settings #### + +## Notification Alerts +# (on|off) + +# Display IP | https://docs.linuxgsm.com/alerts#display-ip +displayip="" + +# More info | https://docs.linuxgsm.com/alerts#more-info +postalert="off" +postdays="7" +posttarget="https://hastebin.com" + +# Discord Alerts | https://docs.linuxgsm.com/alerts/discord +discordalert="off" +discordwebhook="webhook" + +# Slack Alerts | https://docs.linuxgsm.com/alerts/slack +slackalert="off" +slackwebhook="webhook" + +# Email Alerts | https://docs.linuxgsm.com/alerts/email +emailalert="off" +email="email@example.com" +emailfrom="" + +# IFTTT Alerts | https://docs.linuxgsm.com/alerts/ifttt +iftttalert="off" +ifttttoken="accesstoken" +iftttevent="linuxgsm_alert" + +# Mailgun Email Alerts | https://docs.linuxgsm.com/alerts/mailgun +mailgunalert="off" +mailguntoken="accesstoken" +mailgundomain="example.com" +mailgunemailfrom="alert@example.com" +mailgunemail="email@myemail.com" + +# Pushbullet Alerts | https://docs.linuxgsm.com/alerts/pushbullet +pushbulletalert="off" +pushbullettoken="accesstoken" +channeltag="" + +# Pushover Alerts | https://docs.linuxgsm.com/alerts/pushover +pushoveralert="off" +pushovertoken="accesstoken" + +# Telegram Alerts | https://docs.linuxgsm.com/alerts/telegram +# You can add a custom cURL string eg proxy (useful in Russia) or else in "curlcustomstring". +# like a "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help", if you not need +# any custom string in curl - simple ignore this parameter. +telegramalert="off" +telegramtoken="accesstoken" +telegramchatid="" +curlcustomstring="" + +## Updating | https://docs.linuxgsm.com/commands/update +updateonstart="off" + +## Backup | https://docs.linuxgsm.com/commands/backup +maxbackups="4" +maxbackupdays="30" +stoponbackup="on" + +## Logging | https://docs.linuxgsm.com/features/logging +consolelogging="on" +logdays="7" + +## Monitor | https://docs.linuxgsm.com/commands/monitor +# Query delay time +querydelay="1" + +#### LinuxGSM Advanced Settings #### + +# ANSI Colors +ansi="on" + +# Message Display Time +sleeptime="0.5" + +# Stop Mode | https://docs.linuxgsm.com/steamcmd/stopmode +# 1: tmux kill +# 2: CTRL+c +# 3: quit +# 4: quit 120s +# 5: stop +# 6: q +# 7: exit +# 8: 7 Days to Die +# 9: Gold Source +# 10: Teamspeak 3 +stopmode="7" + +## Query mode +# 1: session only +# 2: gamedig + gsquery +# 3: gamedig +# 4: gsquery +# 5: tcp +querymode="1" +querytype="" + +## Console type +consoleverbose="yes" +consoleinteract="yes" + +## SteamCMD Settings +# Server appid +appid="996560" +# SteamCMD Branch | https://docs.linuxgsm.com/steamcmd/branch +branch="" +# Master Server | https://docs.linuxgsm.com/steamcmd/steam-master-server +steammaster="" + +## LinuxGSM Server Details +# Do not edit +gamename="SCP: Secret Laboratory" +engine="unity3d" +glibc="2.27" + +#### Directories #### +# Edit with care + +## Server Specific Directories +systemdir="${serverfiles}" +executabledir="${systemdir}" +executable="./LocalAdmin" +servercfg="config_gameplay.txt" +servercfgdefault="config_gameplay.txt" +servercfgdir="${HOME}/.config/SCP Secret Laboratory/config/${port}" +servercfgfullpath="${servercfgdir}/${servercfg}" + +## Backup Directory +backupdir="${rootdir}/backups" + +## Logging Directories +logdir="${rootdir}/log" +gamelogdir="${HOME}/.config/SCP Secret Laboratory/LocalAdminLogs/${port}" +lgsmlogdir="${logdir}/script" +consolelogdir="${logdir}/console" +lgsmlog="${lgsmlogdir}/${selfname}-script.log" +consolelog="${consolelogdir}/${selfname}-console.log" +alertlog="${lgsmlogdir}/${selfname}-alert.log" +postdetailslog="${lgsmlogdir}/${selfname}-postdetails.log" + +## Logs Naming +lgsmlogdate="${lgsmlogdir}/${selfname}-script-$(date '+%Y-%m-%d-%H:%M:%S').log" +consolelogdate="${consolelogdir}/${selfname}-console-$(date '+%Y-%m-%d-%H:%M:%S').log" diff --git a/lgsm/config-default/config-lgsm/scpslsmserver/_default.cfg b/lgsm/config-default/config-lgsm/scpslsmserver/_default.cfg new file mode 100644 index 000000000..4ac830f21 --- /dev/null +++ b/lgsm/config-default/config-lgsm/scpslsmserver/_default.cfg @@ -0,0 +1,168 @@ +################################## +######## 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://docs.linuxgsm.com/configuration/start-parameters +## All server settings except the server port are done in the config file: +## Docs: https://en.scpslgame.com/index.php?title=Docs:Server_Config +port="7777" + +## Server Start Command | https://docs.linuxgsm.com/configuration/start-parameters#additional-parameters +fn_parms(){ +parms="${port}" +} + +#### LinuxGSM Settings #### + +## Notification Alerts +# (on|off) + +# Display IP | https://docs.linuxgsm.com/alerts#display-ip +displayip="" + +# More info | https://docs.linuxgsm.com/alerts#more-info +postalert="off" +postdays="7" +posttarget="https://hastebin.com" + +# Discord Alerts | https://docs.linuxgsm.com/alerts/discord +discordalert="off" +discordwebhook="webhook" + +# Slack Alerts | https://docs.linuxgsm.com/alerts/slack +slackalert="off" +slackwebhook="webhook" + +# Email Alerts | https://docs.linuxgsm.com/alerts/email +emailalert="off" +email="email@example.com" +emailfrom="" + +# IFTTT Alerts | https://docs.linuxgsm.com/alerts/ifttt +iftttalert="off" +ifttttoken="accesstoken" +iftttevent="linuxgsm_alert" + +# Mailgun Email Alerts | https://docs.linuxgsm.com/alerts/mailgun +mailgunalert="off" +mailguntoken="accesstoken" +mailgundomain="example.com" +mailgunemailfrom="alert@example.com" +mailgunemail="email@myemail.com" + +# Pushbullet Alerts | https://docs.linuxgsm.com/alerts/pushbullet +pushbulletalert="off" +pushbullettoken="accesstoken" +channeltag="" + +# Pushover Alerts | https://docs.linuxgsm.com/alerts/pushover +pushoveralert="off" +pushovertoken="accesstoken" + +# Telegram Alerts | https://docs.linuxgsm.com/alerts/telegram +# You can add a custom cURL string eg proxy (useful in Russia) or else in "curlcustomstring". +# like a "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help", if you not need +# any custom string in curl - simple ignore this parameter. +telegramalert="off" +telegramtoken="accesstoken" +telegramchatid="" +curlcustomstring="" + +## Updating | https://docs.linuxgsm.com/commands/update +updateonstart="off" + +## Backup | https://docs.linuxgsm.com/commands/backup +maxbackups="4" +maxbackupdays="30" +stoponbackup="on" + +## Logging | https://docs.linuxgsm.com/features/logging +consolelogging="on" +logdays="7" + +## Monitor | https://docs.linuxgsm.com/commands/monitor +# Query delay time +querydelay="1" + +#### LinuxGSM Advanced Settings #### + +# ANSI Colors +ansi="on" + +# Message Display Time +sleeptime="0.5" + +# Stop Mode | https://docs.linuxgsm.com/steamcmd/stopmode +# 1: tmux kill +# 2: CTRL+c +# 3: quit +# 4: quit 120s +# 5: stop +# 6: q +# 7: exit +# 8: 7 Days to Die +# 9: Gold Source +# 10: Teamspeak 3 +stopmode="7" + +## Query mode +# 1: session only +# 2: gamedig + gsquery +# 3: gamedig +# 4: gsquery +# 5: tcp +querymode="1" +querytype="" + +## Console type +consoleverbose="yes" +consoleinteract="yes" + +## SteamCMD Settings +# Server appid +appid="786920" +# SteamCMD Branch | https://docs.linuxgsm.com/steamcmd/branch +branch="" +# Master Server | https://docs.linuxgsm.com/steamcmd/steam-master-server +steammaster="" + +## LinuxGSM Server Details +# Do not edit +gamename="SCP: Secret Laboratory ServerMod" +engine="unity3d" +glibc="2.27" + +#### Directories #### +# Edit with care + +## Server Specific Directories +systemdir="${serverfiles}" +executabledir="${systemdir}" +executable="./LocalAdmin" +servercfg="config_gameplay.txt" +servercfgdefault="config_gameplay.txt" +servercfgdir="${HOME}/.config/SCP Secret Laboratory/config/${port}" +servercfgfullpath="${servercfgdir}/${servercfg}" + +## Backup Directory +backupdir="${rootdir}/backups" + +## Logging Directories +logdir="${rootdir}/log" +gamelogdir="${HOME}/.config/SCP Secret Laboratory/LocalAdminLogs/${port}" +lgsmlogdir="${logdir}/script" +consolelogdir="${logdir}/console" +lgsmlog="${lgsmlogdir}/${selfname}-script.log" +consolelog="${consolelogdir}/${selfname}-console.log" +alertlog="${lgsmlogdir}/${selfname}-alert.log" +postdetailslog="${lgsmlogdir}/${selfname}-postdetails.log" + +## Logs Naming +lgsmlogdate="${lgsmlogdir}/${selfname}-script-$(date '+%Y-%m-%d-%H:%M:%S').log" +consolelogdate="${consolelogdir}/${selfname}-console-$(date '+%Y-%m-%d-%H:%M:%S').log" diff --git a/lgsm/data/serverlist.csv b/lgsm/data/serverlist.csv index 92f194046..79139f680 100644 --- a/lgsm/data/serverlist.csv +++ b/lgsm/data/serverlist.csv @@ -84,6 +84,8 @@ rw,rwserver,Rising World samp,sampserver,San Andreas Multiplayer sb,sbserver,Starbound sbots,sbotsserver,StickyBots +scpsl,scpslserver,SCP: Secret Laboratory +scpslsm,scpslsmserver,SCP: Secret Laboratory ServerMod sdtd,sdtdserver,7 Days to Die sfc,sfcserver,SourceForts Classic sof2,sof2server,Soldier Of Fortune 2: Gold Edition diff --git a/lgsm/functions/check_deps.sh b/lgsm/functions/check_deps.sh index 5a9b34be8..70e5f5a09 100755 --- a/lgsm/functions/check_deps.sh +++ b/lgsm/functions/check_deps.sh @@ -437,6 +437,9 @@ fn_deps_build_debian(){ else array_deps_required+=( default-jre rng-tools ) fi + # SCP: Secret Laboratory, SCP: Secret Laboratory ServerMod + elif [ "${shortname}" == "scpsl" ]||[ "${shortname}" == "scpslsm" ]; then + array_deps_required+=( mono-complete ) # Sven Co-op elif [ "${shortname}" == "sven" ]; then array_deps_required+=( libssl1.1:i386 zlib1g:i386 ) diff --git a/lgsm/functions/info_config.sh b/lgsm/functions/info_config.sh index 3720c421e..ecf840961 100755 --- a/lgsm/functions/info_config.sh +++ b/lgsm/functions/info_config.sh @@ -1569,6 +1569,26 @@ fn_info_config_vintagestory(){ fi } +fn_info_config_scpsl(){ + if [ -f "${servercfgfullpath}" ]; then + servername=$(sed -nr 's/^server_name: (.*)$/\1/p' "${servercfgfullpath}") + maxplayers=$(sed -nr 's/^max_players: (.*)$/\1/p' "${servercfgfullpath}") + configip=$(sed -nr 's/^ipv4_bind_ip: (.*)$/\1/p' "${servercfgfullpath}") + tickrate=$(sed -nr 's/^server_tickrate: (.*)$/\1/p' "${servercfgfullpath}") + adminpassword=$(sed -nr 's/^administrator_query_password: (.*)$/\1/p' "${servercfgfullpath}") + + if [ "${adminpassword}" == "none" ]; then + adminpassword="NOT SET" + fi + else + servername=${servername:-"NOT SET"} + maxplayers=${maxplayers:-"0"} + configip=${configip:-"0.0.0.0"} + tickrate=${tickrate:-"NOT SET"} + adminpassword=${adminpassword:-"NOT SET"} + fi +} + if [ "${shortname}" == "ac" ]; then fn_info_config_assettocorsa elif [ "${shortname}" == "ark" ]; then @@ -1673,6 +1693,8 @@ elif [ "${engine}" == "unreal3" ]; then fn_info_config_unreal3 elif [ "${shortname}" == "ut" ]; then fn_info_config_ut +elif [ "${shortname}" == "scpsl" ]||[ "${shortname}" == "scpslsm" ]; then + fn_info_config_scpsl elif [ "${shortname}" == "sdtd" ]; then fn_info_config_sdtd elif [ "${shortname}" == "wet" ]; then diff --git a/lgsm/functions/info_messages.sh b/lgsm/functions/info_messages.sh index 93dbea45b..4a834d797 100755 --- a/lgsm/functions/info_messages.sh +++ b/lgsm/functions/info_messages.sh @@ -583,7 +583,7 @@ fn_info_message_ports(){ fi done # engines/games that require editing the parms. - local ports_edit_array=( "Avorion" "col" "goldsrc" "Factorio" "Hurtworld" "iw3.0" "ioquake3" "qfusion" "Rust" "Soldat" "spark" "source" "starbound" "unreal4" "realvirtuality" "Unturned" ) + local ports_edit_array=( "Avorion" "col" "goldsrc" "Factorio" "Hurtworld" "iw3.0" "ioquake3" "qfusion" "Rust" "scpsl" "scpslsm" "Soldat" "spark" "source" "starbound" "unreal4" "realvirtuality" "Unturned" ) for port_edit in "${ports_edit_array[@]}"; do if [ "${engine}" == "${port_edit}" ]||[ "${gamename}" == "${port_edit}" ]||[ "${shortname}" == "${port_edit}" ]; then parmslocation="${configdirserver}" @@ -1464,6 +1464,15 @@ fn_info_message_vintagestory(){ } | column -s $'\t' -t } +fn_info_message_scpsl(){ + echo -e "netstat -atunp | grep SCPSL" + echo -e "" + { + echo -e "${lightblue}DESCRIPTION\tDIRECTION\tPORT\tPROTOCOL${default}" + echo -e "> Game\tINBOUND\t${port}\tudp" + } | column -s $'\t' -t +} + fn_info_message_select_engine(){ # Display details depending on game or engine. if [ "${shortname}" == "ac" ]; then @@ -1536,6 +1545,8 @@ fn_info_message_select_engine(){ fn_info_message_quakelive elif [ "${shortname}" == "samp" ]; then fn_info_message_samp + elif [ "${shortname}" == "scpsl" ]||[ "${shortname}" == "scpslsm" ]; then + fn_info_message_scpsl elif [ "${shortname}" == "sdtd" ]; then fn_info_message_sdtd elif [ "${shortname}" == "squad" ]; then diff --git a/lgsm/functions/info_parms.sh b/lgsm/functions/info_parms.sh index 74c29b9df..782f774d4 100755 --- a/lgsm/functions/info_parms.sh +++ b/lgsm/functions/info_parms.sh @@ -233,6 +233,10 @@ fn_info_parms_wf(){ webadminport=${webadminport:-"0"} } +fn_info_parms_queryport(){ + queryport="${port:-"0"}" +} + if [ "${shortname}" == "ark" ]; then fn_info_parms_ark elif [ "${shortname}" == "arma3" ]; then @@ -295,4 +299,7 @@ elif [ "${shortname}" == "ut" ]; then fn_info_parms_ut elif [ "${shortname}" == "wf" ]; then fn_info_parms_wf +# for servers that have a missing queryport from the config +elif [ "${shortname}" == "scpsl" ]||[ "${shortname}" == "scpslsm" ]; then + fn_info_parms_queryport fi diff --git a/lgsm/functions/install_config.sh b/lgsm/functions/install_config.sh index 3efb46a65..dbcb27e14 100755 --- a/lgsm/functions/install_config.sh +++ b/lgsm/functions/install_config.sh @@ -667,6 +667,13 @@ elif [ "${shortname}" == "rust" ]; then fn_fetch_default_config fn_default_config_remote fn_list_config_locations +elif [ "${shortname}" == "scpsl" ]||[ "${shortname}" == "scpslsm" ]; then + gamedirname="SCPSecretLaboratory" + array_configs+=( config_gameplay.txt config_localadmin.txt ) + fn_fetch_default_config + fn_default_config_remote + fn_set_config_vars + fn_list_config_locations elif [ "${shortname}" == "sol" ]; then gamedirname="Soldat" array_configs+=( soldat.ini ) From 9cc0b3dac8e2c5f6faf9ae71bc45bb95b5032eec Mon Sep 17 00:00:00 2001 From: Christian Date: Sun, 10 Jan 2021 23:27:57 +0100 Subject: [PATCH 524/534] fix(rust): server config text change for rcon (#3175) Co-authored-by: Daniel Gibbs --- lgsm/config-default/config-lgsm/rustserver/_default.cfg | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lgsm/config-default/config-lgsm/rustserver/_default.cfg b/lgsm/config-default/config-lgsm/rustserver/_default.cfg index b518b00ba..7ec79ab97 100644 --- a/lgsm/config-default/config-lgsm/rustserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/rustserver/_default.cfg @@ -14,7 +14,7 @@ port="28015" rconport="28016" appport=28082 rconpassword="CHANGE_ME" -rconweb="1" # Value is: 1 for the Facepunch web panel; 0 for RCON tools like Rusty or Rustadmin. +rconweb="1" # Value is: 1 for the Facepunch web panel, Rustadmin desktop and Rustadmin Online; 0 for RCON tools like Rusty. servername="Rust" maxplayers="50" seed="" # range: 1-2147483647, used to reproduce a procedural map. From cee98dc9950a343bef67b0438348284aee68dcec Mon Sep 17 00:00:00 2001 From: Christian Date: Mon, 11 Jan 2021 22:20:16 +0100 Subject: [PATCH 525/534] fix(steamcmd): remove unused parameter (#3170) --- lgsm/functions/core_steamcmd.sh | 10 ---------- 1 file changed, 10 deletions(-) diff --git a/lgsm/functions/core_steamcmd.sh b/lgsm/functions/core_steamcmd.sh index 582eb93b6..bfdbce38c 100755 --- a/lgsm/functions/core_steamcmd.sh +++ b/lgsm/functions/core_steamcmd.sh @@ -13,16 +13,6 @@ fn_install_steamcmd(){ if [ ! -d "${steamcmddir}" ]; then mkdir -p "${steamcmddir}" fi - remote_fileurl="${1}" - remote_fileurl_backup="${2}" - remote_fileurl_name="${3}" - remote_fileurl_backup_name="${4}" - local_filedir="${5}" - local_filename="${6}" - chmodx="${7:-0}" - run="${8:-0}" - forcedl="${9:-0}" - md5="${10:-0}" fn_fetch_file "http://media.steampowered.com/client/steamcmd_linux.tar.gz" "" "" "" "${tmpdir}" "steamcmd_linux.tar.gz" "" "norun" "noforce" "nomd5" fn_dl_extract "${tmpdir}" "steamcmd_linux.tar.gz" "${steamcmddir}" chmod +x "${steamcmddir}/steamcmd.sh" From 778494ce3161d3ed5d64cbb0faa4b84f0adca2e0 Mon Sep 17 00:00:00 2001 From: Christian Date: Tue, 12 Jan 2021 22:50:09 +0100 Subject: [PATCH 526/534] fix(rust): wipe command does not wipe all sav files (#3183) --- lgsm/functions/command_wipe.sh | 36 +++++----------------------------- 1 file changed, 5 insertions(+), 31 deletions(-) diff --git a/lgsm/functions/command_wipe.sh b/lgsm/functions/command_wipe.sh index 3e0c53b2e..f48f9e5f8 100755 --- a/lgsm/functions/command_wipe.sh +++ b/lgsm/functions/command_wipe.sh @@ -38,19 +38,6 @@ fn_wipe_server_files(){ fn_sleep_time fn_script_log_pass "No procedural map file to remove" fi - # Wipe procedural map save. - if [ -n "$(find "${serveridentitydir}" -type f -name "proceduralmap.*.sav")" ]; then - echo -en "removing map saves proceduralmap.*.sav file(s)..." - fn_sleep_time - fn_script_log_info "Removing procedural map save(s): ${serveridentitydir}/proceduralmap.*.sav" - find "${serveridentitydir:?}" -type f -name "proceduralmap.*.sav" -delete | tee -a "${lgsmlog}" - fn_wipe_exit_code - fn_sleep_time - else - echo -e "no procedural map save to remove" - fn_sleep_time - fn_script_log_pass "No procedural map save to remove" - fi # Wipe Barren map. if [ -n "$(find "${serveridentitydir}" -type f -name "barren*.map")" ]; then echo -en "removing barren map barren*.map file(s)..." @@ -64,19 +51,6 @@ fn_wipe_server_files(){ fn_sleep_time fn_script_log_pass "No barren map file to remove" fi - # Wipe barren map save. - if [ -n "$(find "${serveridentitydir}" -type f -name "barren*.sav")" ]; then - echo -en "removing barren map saves barren*.sav file(s)..." - fn_sleep_time - fn_script_log_info "Removing barren map save(s): ${serveridentitydir}/barren*.sav" - find "${serveridentitydir:?}" -type f -name "barren*.sav" -delete | tee -a "${lgsmlog}" - fn_wipe_exit_code - fn_sleep_time - else - echo -e "no barren map save to remove" - fn_sleep_time - fn_script_log_pass "No barren map save to remove." - fi # Wipe custom map. if [ -n "$(find "${serveridentitydir}" -type f -name "*.map")" ]; then echo -en "removing custom map file(s)..." @@ -91,11 +65,11 @@ fn_wipe_server_files(){ fn_script_log_pass "No map file to remove" fi # Wipe custom map save. - if [ -n "$(find "${serveridentitydir}" -type f -name "*.sav")" ]; then - echo -en "removing map save *.sav file(s)..." + if [ -n "$(find "${serveridentitydir}" -type f -name "*.sav*")" ]; then + echo -en "removing map save *.sav* file(s)..." fn_sleep_time - fn_script_log_info "Removing map save(s): ${serveridentitydir}/*.sav" - find "${serveridentitydir:?}" -type f -name "*.sav" -delete | tee -a "${lgsmlog}" + fn_script_log_info "Removing map save(s): ${serveridentitydir}/*.sav*" + find "${serveridentitydir:?}" -type f -name "*.sav*" -delete | tee -a "${lgsmlog}" fn_wipe_exit_code fn_sleep_time else @@ -228,7 +202,7 @@ fn_print_dots "" check.sh # Check if there is something to wipe. -if [ -d "${serveridentitydir}/storage" ]||[ -d "${serveridentitydir}/user" ]||[ -n "$(find "${serveridentitydir}" -type f -name "proceduralmap*.sav")" ]||[ -n "$(find "${serveridentitydir}" -type f -name "barren*.sav")" ]||[ -n "$(find "${serveridentitydir}" -type f -name "Log.*.txt")" ]||[ -n "$(find "${serveridentitydir}" -type f -name "player.deaths.*.db")" ]||[ -n "$(find "${serveridentitydir}" -type f -name "player.blueprints.*.db")" ]||[ -n "$(find "${serveridentitydir}" -type f -name "sv.files.*.db")" ]; then +if [ -d "${serveridentitydir}/storage" ]||[ -d "${serveridentitydir}/user" ]||[ -n "$(find "${serveridentitydir}" -type f -name "*.sav*")" ]||[ -n "$(find "${serveridentitydir}" -type f -name "Log.*.txt")" ]||[ -n "$(find "${serveridentitydir}" -type f -name "player.deaths.*.db")" ]||[ -n "$(find "${serveridentitydir}" -type f -name "player.blueprints.*.db")" ]||[ -n "$(find "${serveridentitydir}" -type f -name "sv.files.*.db")" ]; then fn_wipe_warning check_status.sh if [ "${status}" != "0" ]; then From 706bc358f0fce90d087a0707dfd23be4b1727951 Mon Sep 17 00:00:00 2001 From: Christian Date: Tue, 12 Jan 2021 22:51:30 +0100 Subject: [PATCH 527/534] feat(dev): add libc++.so.1 for dependency detection (#3181) Co-authored-by: Daniel Gibbs --- lgsm/functions/command_dev_detect_deps.sh | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/lgsm/functions/command_dev_detect_deps.sh b/lgsm/functions/command_dev_detect_deps.sh index 2a620fd66..c8271172e 100755 --- a/lgsm/functions/command_dev_detect_deps.sh +++ b/lgsm/functions/command_dev_detect_deps.sh @@ -155,6 +155,11 @@ while read -r lib; do echo -e "libfreetype6" >> "${tmpdir}/.depdetect_ubuntu_list" echo -e "libfreetype6" >> "${tmpdir}/.depdetect_debian_list" libdetected=1 + elif [ "${lib}" == "libc++.so.1" ]; then + echo -e "libcxx" >> "${tmpdir}/.depdetect_centos_list" + echo -e "libc++1" >> "${tmpdir}/.depdetect_ubuntu_list" + echo -e "libc++1" >> "${tmpdir}/.depdetect_debian_list" + libdetected=1 fi if [ "${libdetected}" != "1" ]; then From e096d3a347f0d0d29c23bdb96d6cee77026cbf98 Mon Sep 17 00:00:00 2001 From: Christian Date: Tue, 12 Jan 2021 22:52:03 +0100 Subject: [PATCH 528/534] fix(pvr): add new dependency (#3180) Co-authored-by: Daniel Gibbs --- lgsm/functions/check_deps.sh | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/lgsm/functions/check_deps.sh b/lgsm/functions/check_deps.sh index 70e5f5a09..2ad38e481 100755 --- a/lgsm/functions/check_deps.sh +++ b/lgsm/functions/check_deps.sh @@ -464,6 +464,9 @@ fn_deps_build_debian(){ # Post Scriptum elif [ "${shortname}" == "pstbs" ]; then array_deps_required+=( libgconf-2-4 ) + # Pavlov VR + elif [ "${shortname}" == "pvr" ]; then + array_deps_required+=( libc++1 ) fi fn_deps_email fn_check_loop @@ -579,6 +582,9 @@ fn_deps_build_redhat(){ # Post Scriptum elif [ "${shortname}" == "pstbs" ]; then array_deps_required+=( GConf2 ) + # Pavlov VR + elif [ "${shortname}" == "pvr" ]; then + array_deps_required+=( libcxx ) fi fn_deps_email fn_check_loop From 1f821f97f4a72236a13dc2c05e227fc6b71983cb Mon Sep 17 00:00:00 2001 From: Christian Date: Tue, 12 Jan 2021 23:09:53 +0100 Subject: [PATCH 529/534] fix(inss): fix config to only use parameter (#3179) --- .../config-lgsm/inssserver/_default.cfg | 8 +++--- lgsm/functions/info_config.sh | 26 ------------------- 2 files changed, 4 insertions(+), 30 deletions(-) diff --git a/lgsm/config-default/config-lgsm/inssserver/_default.cfg b/lgsm/config-default/config-lgsm/inssserver/_default.cfg index 07bc89a60..2e8b29e16 100644 --- a/lgsm/config-default/config-lgsm/inssserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/inssserver/_default.cfg @@ -19,12 +19,13 @@ defaultscenario="Scenario_Crossing_Push_Security" maxplayers="28" ## Server Parameters | https://docs.linuxgsm.com/configuration/start-parameters#additional-parameters +## Parameter Docs: https://sandstorm-support.newworldinteractive.com/hc/en-us/articles/360049211072-Server-Admin-Guide fn_parms(){ # Allows serverpassword to work with parameters - if [ "${serverpassword}" != "NOT SET" ]; then - parms="${defaultmap}?Scenario=${defaultscenario}?MaxPlayers=${maxplayers}?Port=${port}?QueryPort=${queryport}?password="${serverpassword}" -hostname="${servername}" -log" + if [ "${serverpassword}" != "" ]; then + parms="${defaultmap}?Scenario=${defaultscenario}?MaxPlayers=${maxplayers}?password='${serverpassword}' -Port=${port} -QueryPort=${queryport} -hostname="${servername}" -log" else - parms="${defaultmap}?Scenario=${defaultscenario}?MaxPlayers=${maxplayers}?Port=${port}?QueryPort=${queryport} -hostname="${servername}" -log" + parms="${defaultmap}?Scenario=${defaultscenario}?MaxPlayers=${maxplayers} -Port=${port} -QueryPort=${queryport} -hostname='${servername}' -log" fi } @@ -170,7 +171,6 @@ executable="./InsurgencyServer-Linux-Shipping" servercfgdir="${systemdir}/Saved/Config/LinuxServer" servercfg="Game.ini" servercfgdefault="Game.ini" -servercfgfullpath="${servercfgdir}/${servercfg}" ## Backup Directory backupdir="${lgsmdir}/backup" diff --git a/lgsm/functions/info_config.sh b/lgsm/functions/info_config.sh index ecf840961..ef782fa70 100755 --- a/lgsm/functions/info_config.sh +++ b/lgsm/functions/info_config.sh @@ -405,30 +405,6 @@ fn_info_config_factorio(){ fi } -fn_info_config_inss(){ - if [ ! -f "${servercfgfullpath}" ]; then - rconenabled="${unavailable}" - rconpassword="${unavailable}" - rconport="${zero}" - maxplayers="${zero}" - port="${zero}" - queryport="${zero}" - queryenabled="${unavailable}" - rconport="${zero}" - gamemode="${unavailable}" - gameworld="${unavailable}" - else - rconenabled=$(grep "bEnabled" "${servercfgfullpath}" | sed -e 's/^[ \t]*//g' -e '/^#/d' -e 's/bEnabled//g' | tr -d '=\";,:' | sed -e 's/^[ \t]*//' -e 's/[ \t]*$//') - rconpassword=$(grep "Password" "${servercfgfullpath}" | sed -e 's/^[ \t]*//g' -e '/^#/d' -e 's/Password//g' | tr -d '=\";,:' | sed -e 's/^[ \t]*//' -e 's/[ \t]*$//') - rconport=$(grep "ListenPort" "${servercfgfullpath}" | tr -cd '[:digit:]') - - # Not Set - rconenabled=${rconenabled:-"NOT SET"} - rconpassword=${rconpassword:-"NOT SET"} - rconport=${rconport:-"0"} - fi -} - fn_info_config_minecraft(){ if [ ! -f "${servercfgfullpath}" ]; then servername="${unavailable}" @@ -1623,8 +1599,6 @@ elif [ "${shortname}" == "eco" ]; then fn_info_config_eco elif [ "${shortname}" == "fctr" ]; then fn_info_config_factorio -elif [ "${shortname}" == "inss" ]; then - fn_info_config_inss elif [ "${shortname}" == "jc2" ]; then fn_info_config_justcause2 elif [ "${shortname}" == "jc3" ]; then From 50cd3d8f2a09b778c9e03bafd12c2c5028d8d3ed Mon Sep 17 00:00:00 2001 From: Christian Date: Thu, 14 Jan 2021 22:44:44 +0100 Subject: [PATCH 530/534] fix(steamcmd): fix update on start not starting the server (#3169) Co-authored-by: Daniel Gibbs --- lgsm/functions/core_steamcmd.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lgsm/functions/core_steamcmd.sh b/lgsm/functions/core_steamcmd.sh index bfdbce38c..389880241 100755 --- a/lgsm/functions/core_steamcmd.sh +++ b/lgsm/functions/core_steamcmd.sh @@ -238,8 +238,8 @@ fn_update_steamcmd_compare(){ exitbypass=1 command_start.sh fn_firstcommand_reset + unset exitbypass fi - unset exitbypass date +%s > "${lockdir}/lastupdate.lock" alert="update" elif [ "${commandname}" == "CHECK-UPDATE" ]; then From add3a5cc9eca3b606ae53b1e0dfb66a6ee8391ea Mon Sep 17 00:00:00 2001 From: Christian Date: Thu, 14 Jan 2021 23:22:06 +0100 Subject: [PATCH 531/534] feat(steamcmd): set platformtype for steamcmd in the default config for the game server (#3167) --- lgsm/config-default/config-lgsm/acserver/_default.cfg | 1 + lgsm/config-default/config-lgsm/ahl2server/_default.cfg | 1 + lgsm/config-default/config-lgsm/ahlserver/_default.cfg | 1 + lgsm/config-default/config-lgsm/arkserver/_default.cfg | 1 + lgsm/config-default/config-lgsm/arma3server/_default.cfg | 1 + lgsm/config-default/config-lgsm/avserver/_default.cfg | 1 + lgsm/config-default/config-lgsm/bb2server/_default.cfg | 1 + lgsm/config-default/config-lgsm/bbserver/_default.cfg | 1 + lgsm/config-default/config-lgsm/bdserver/_default.cfg | 1 + lgsm/config-default/config-lgsm/bmdmserver/_default.cfg | 1 + lgsm/config-default/config-lgsm/boserver/_default.cfg | 1 + lgsm/config-default/config-lgsm/bsserver/_default.cfg | 1 + lgsm/config-default/config-lgsm/bt1944server/_default.cfg | 1 + lgsm/config-default/config-lgsm/btserver/_default.cfg | 1 + lgsm/config-default/config-lgsm/ccserver/_default.cfg | 1 + lgsm/config-default/config-lgsm/cmwserver/_default.cfg | 1 + lgsm/config-default/config-lgsm/colserver/_default.cfg | 1 + lgsm/config-default/config-lgsm/csczserver/_default.cfg | 1 + lgsm/config-default/config-lgsm/csgoserver/_default.cfg | 1 + lgsm/config-default/config-lgsm/csserver/_default.cfg | 1 + lgsm/config-default/config-lgsm/cssserver/_default.cfg | 1 + lgsm/config-default/config-lgsm/dabserver/_default.cfg | 1 + lgsm/config-default/config-lgsm/dmcserver/_default.cfg | 1 + lgsm/config-default/config-lgsm/dodserver/_default.cfg | 1 + lgsm/config-default/config-lgsm/dodsserver/_default.cfg | 1 + lgsm/config-default/config-lgsm/doiserver/_default.cfg | 1 + lgsm/config-default/config-lgsm/dstserver/_default.cfg | 1 + lgsm/config-default/config-lgsm/dysserver/_default.cfg | 1 + lgsm/config-default/config-lgsm/ecoserver/_default.cfg | 1 + lgsm/config-default/config-lgsm/emserver/_default.cfg | 1 + lgsm/config-default/config-lgsm/fofserver/_default.cfg | 1 + lgsm/config-default/config-lgsm/gmodserver/_default.cfg | 1 + lgsm/config-default/config-lgsm/hl2dmserver/_default.cfg | 1 + lgsm/config-default/config-lgsm/hldmserver/_default.cfg | 1 + lgsm/config-default/config-lgsm/hldmsserver/_default.cfg | 1 + lgsm/config-default/config-lgsm/hwserver/_default.cfg | 1 + lgsm/config-default/config-lgsm/insserver/_default.cfg | 1 + lgsm/config-default/config-lgsm/inssserver/_default.cfg | 1 + lgsm/config-default/config-lgsm/iosserver/_default.cfg | 1 + lgsm/config-default/config-lgsm/jc2server/_default.cfg | 1 + lgsm/config-default/config-lgsm/jc3server/_default.cfg | 1 + lgsm/config-default/config-lgsm/jk2server/_default.cfg | 1 + lgsm/config-default/config-lgsm/kf2server/_default.cfg | 1 + lgsm/config-default/config-lgsm/kfserver/_default.cfg | 1 + lgsm/config-default/config-lgsm/l4d2server/_default.cfg | 1 + lgsm/config-default/config-lgsm/l4dserver/_default.cfg | 1 + lgsm/config-default/config-lgsm/mhserver/_default.cfg | 1 + lgsm/config-default/config-lgsm/momserver/_default.cfg | 1 + lgsm/config-default/config-lgsm/ndserver/_default.cfg | 1 + lgsm/config-default/config-lgsm/nmrihserver/_default.cfg | 1 + lgsm/config-default/config-lgsm/ns2cserver/_default.cfg | 1 + lgsm/config-default/config-lgsm/ns2server/_default.cfg | 1 + lgsm/config-default/config-lgsm/nsserver/_default.cfg | 1 + lgsm/config-default/config-lgsm/onsetserver/_default.cfg | 1 + lgsm/config-default/config-lgsm/opforserver/_default.cfg | 1 + lgsm/config-default/config-lgsm/pcserver/_default.cfg | 1 + lgsm/config-default/config-lgsm/pstbsserver/_default.cfg | 1 + lgsm/config-default/config-lgsm/pvkiiserver/_default.cfg | 1 + lgsm/config-default/config-lgsm/pvrserver/_default.cfg | 1 + lgsm/config-default/config-lgsm/pzserver/_default.cfg | 1 + lgsm/config-default/config-lgsm/qlserver/_default.cfg | 1 + lgsm/config-default/config-lgsm/ricochetserver/_default.cfg | 1 + lgsm/config-default/config-lgsm/roserver/_default.cfg | 1 + lgsm/config-default/config-lgsm/rustserver/_default.cfg | 1 + lgsm/config-default/config-lgsm/rwserver/_default.cfg | 1 + lgsm/config-default/config-lgsm/sbotsserver/_default.cfg | 1 + lgsm/config-default/config-lgsm/sbserver/_default.cfg | 1 + lgsm/config-default/config-lgsm/scpslserver/_default.cfg | 1 + lgsm/config-default/config-lgsm/scpslsmserver/_default.cfg | 1 + lgsm/config-default/config-lgsm/sdtdserver/_default.cfg | 1 + lgsm/config-default/config-lgsm/sfcserver/_default.cfg | 1 + lgsm/config-default/config-lgsm/solserver/_default.cfg | 1 + lgsm/config-default/config-lgsm/squadserver/_default.cfg | 1 + lgsm/config-default/config-lgsm/stserver/_default.cfg | 1 + lgsm/config-default/config-lgsm/svenserver/_default.cfg | 1 + lgsm/config-default/config-lgsm/terrariaserver/_default.cfg | 1 + lgsm/config-default/config-lgsm/tf2server/_default.cfg | 1 + lgsm/config-default/config-lgsm/tfcserver/_default.cfg | 1 + lgsm/config-default/config-lgsm/tsserver/_default.cfg | 1 + lgsm/config-default/config-lgsm/tuserver/_default.cfg | 1 + lgsm/config-default/config-lgsm/twserver/_default.cfg | 1 + lgsm/config-default/config-lgsm/untserver/_default.cfg | 1 + lgsm/config-default/config-lgsm/vsserver/_default.cfg | 1 + lgsm/config-default/config-lgsm/wfserver/_default.cfg | 1 + lgsm/config-default/config-lgsm/wurmserver/_default.cfg | 1 + lgsm/config-default/config-lgsm/zmrserver/_default.cfg | 1 + lgsm/config-default/config-lgsm/zpsserver/_default.cfg | 1 + lgsm/functions/core_dl.sh | 2 +- 88 files changed, 88 insertions(+), 1 deletion(-) diff --git a/lgsm/config-default/config-lgsm/acserver/_default.cfg b/lgsm/config-default/config-lgsm/acserver/_default.cfg index f64c34ac3..c0d82a5ab 100644 --- a/lgsm/config-default/config-lgsm/acserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/acserver/_default.cfg @@ -112,6 +112,7 @@ sleeptime="0.5" ## SteamCMD Settings | https://docs.linuxgsm.com/steamcmd # Server appid appid="302550" +steamcmdforcewindows="yes" # SteamCMD Branch | https://docs.linuxgsm.com/steamcmd/branch branch="" betapassword="" diff --git a/lgsm/config-default/config-lgsm/ahl2server/_default.cfg b/lgsm/config-default/config-lgsm/ahl2server/_default.cfg index 505076703..8e1c62fbf 100644 --- a/lgsm/config-default/config-lgsm/ahl2server/_default.cfg +++ b/lgsm/config-default/config-lgsm/ahl2server/_default.cfg @@ -141,6 +141,7 @@ querytype="protocol-valve" ## SteamCMD Settings | https://docs.linuxgsm.com/steamcmd # Server appid appid="985050" +steamcmdforcewindows="no" # SteamCMD Branch | https://docs.linuxgsm.com/steamcmd/branch branch="" betapassword="" diff --git a/lgsm/config-default/config-lgsm/ahlserver/_default.cfg b/lgsm/config-default/config-lgsm/ahlserver/_default.cfg index 9e52094a0..da64ff4a0 100644 --- a/lgsm/config-default/config-lgsm/ahlserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/ahlserver/_default.cfg @@ -113,6 +113,7 @@ sleeptime="0.5" ## SteamCMD Settings | https://docs.linuxgsm.com/steamcmd # Server appid appid="90" +steamcmdforcewindows="no" appidmod="cstrike" # SteamCMD Branch | https://docs.linuxgsm.com/steamcmd/branch branch="" diff --git a/lgsm/config-default/config-lgsm/arkserver/_default.cfg b/lgsm/config-default/config-lgsm/arkserver/_default.cfg index f289cd1fb..f5ac04477 100644 --- a/lgsm/config-default/config-lgsm/arkserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/arkserver/_default.cfg @@ -116,6 +116,7 @@ sleeptime="0.5" ## SteamCMD Settings | https://docs.linuxgsm.com/steamcmd # Server appid appid="376030" +steamcmdforcewindows="no" # SteamCMD Branch | https://docs.linuxgsm.com/steamcmd/branch branch="" betapassword="" diff --git a/lgsm/config-default/config-lgsm/arma3server/_default.cfg b/lgsm/config-default/config-lgsm/arma3server/_default.cfg index acdbedb59..bacd851f3 100644 --- a/lgsm/config-default/config-lgsm/arma3server/_default.cfg +++ b/lgsm/config-default/config-lgsm/arma3server/_default.cfg @@ -129,6 +129,7 @@ sleeptime="0.5" ## SteamCMD Settings | https://docs.linuxgsm.com/steamcmd # Server appid appid="233780" +steamcmdforcewindows="no" # SteamCMD Branch | https://docs.linuxgsm.com/steamcmd/branch branch="" betapassword="" diff --git a/lgsm/config-default/config-lgsm/avserver/_default.cfg b/lgsm/config-default/config-lgsm/avserver/_default.cfg index a8e6fb049..36703b30c 100644 --- a/lgsm/config-default/config-lgsm/avserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/avserver/_default.cfg @@ -112,6 +112,7 @@ sleeptime="0.5" ## SteamCMD Settings | https://docs.linuxgsm.com/steamcmd # Server appid appid="565060" +steamcmdforcewindows="no" # SteamCMD Branch | https://docs.linuxgsm.com/steamcmd/branch branch="" betapassword="" diff --git a/lgsm/config-default/config-lgsm/bb2server/_default.cfg b/lgsm/config-default/config-lgsm/bb2server/_default.cfg index 2f35f1c9d..2ba9bd914 100644 --- a/lgsm/config-default/config-lgsm/bb2server/_default.cfg +++ b/lgsm/config-default/config-lgsm/bb2server/_default.cfg @@ -119,6 +119,7 @@ sleeptime="0.5" ## SteamCMD Settings | https://docs.linuxgsm.com/steamcmd # Server appid appid="475370" +steamcmdforcewindows="no" # SteamCMD Branch | https://docs.linuxgsm.com/steamcmd/branch branch="" betapassword="" diff --git a/lgsm/config-default/config-lgsm/bbserver/_default.cfg b/lgsm/config-default/config-lgsm/bbserver/_default.cfg index 573c9964b..ace128b19 100644 --- a/lgsm/config-default/config-lgsm/bbserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/bbserver/_default.cfg @@ -113,6 +113,7 @@ sleeptime="0.5" ## SteamCMD Settings | https://docs.linuxgsm.com/steamcmd # Server appid appid="90" +steamcmdforcewindows="no" appidmod="cstrike" # SteamCMD Branch | https://docs.linuxgsm.com/steamcmd/branch branch="" diff --git a/lgsm/config-default/config-lgsm/bdserver/_default.cfg b/lgsm/config-default/config-lgsm/bdserver/_default.cfg index 746169c5b..6dea0c4c0 100644 --- a/lgsm/config-default/config-lgsm/bdserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/bdserver/_default.cfg @@ -113,6 +113,7 @@ sleeptime="0.5" ## SteamCMD Settings | https://docs.linuxgsm.com/steamcmd # Server appid appid="817300" +steamcmdforcewindows="no" # SteamCMD Branch | https://docs.linuxgsm.com/steamcmd/branch branch="" betapassword="" diff --git a/lgsm/config-default/config-lgsm/bmdmserver/_default.cfg b/lgsm/config-default/config-lgsm/bmdmserver/_default.cfg index b9ebbce02..c844d94a1 100644 --- a/lgsm/config-default/config-lgsm/bmdmserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/bmdmserver/_default.cfg @@ -119,6 +119,7 @@ sleeptime="0.5" ## SteamCMD Settings | https://docs.linuxgsm.com/steamcmd # Server appid appid="346680" +steamcmdforcewindows="no" # SteamCMD Branch | https://docs.linuxgsm.com/steamcmd/branch branch="" betapassword="" diff --git a/lgsm/config-default/config-lgsm/boserver/_default.cfg b/lgsm/config-default/config-lgsm/boserver/_default.cfg index 907f72a4c..0095661c9 100644 --- a/lgsm/config-default/config-lgsm/boserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/boserver/_default.cfg @@ -112,6 +112,7 @@ sleeptime="0.5" ## SteamCMD Settings | https://docs.linuxgsm.com/steamcmd # Server appid appid="416880" +steamcmdforcewindows="no" # SteamCMD Branch | https://docs.linuxgsm.com/steamcmd/branch branch="" betapassword="" diff --git a/lgsm/config-default/config-lgsm/bsserver/_default.cfg b/lgsm/config-default/config-lgsm/bsserver/_default.cfg index f23980d49..a43270618 100644 --- a/lgsm/config-default/config-lgsm/bsserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/bsserver/_default.cfg @@ -123,6 +123,7 @@ sleeptime="0.5" ## SteamCMD Settings | https://docs.linuxgsm.com/steamcmd # Server appid appid="228780" +steamcmdforcewindows="no" # SteamCMD Branch | https://docs.linuxgsm.com/steamcmd/branch branch="" betapassword="" diff --git a/lgsm/config-default/config-lgsm/bt1944server/_default.cfg b/lgsm/config-default/config-lgsm/bt1944server/_default.cfg index 84b059dbe..7ec7dc257 100644 --- a/lgsm/config-default/config-lgsm/bt1944server/_default.cfg +++ b/lgsm/config-default/config-lgsm/bt1944server/_default.cfg @@ -111,6 +111,7 @@ sleeptime="0.5" ## SteamCMD Settings | https://docs.linuxgsm.com/steamcmd # Server appid appid="805140" +steamcmdforcewindows="no" # SteamCMD Branch | https://docs.linuxgsm.com/steamcmd/branch branch="" betapassword="" diff --git a/lgsm/config-default/config-lgsm/btserver/_default.cfg b/lgsm/config-default/config-lgsm/btserver/_default.cfg index c22a70533..b1014cbdc 100644 --- a/lgsm/config-default/config-lgsm/btserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/btserver/_default.cfg @@ -106,6 +106,7 @@ sleeptime="0.5" ## SteamCMD Settings | https://docs.linuxgsm.com/steamcmd # Server appid appid="1026340" +steamcmdforcewindows="no" # SteamCMD Branch | https://docs.linuxgsm.com/steamcmd/branch branch="" betapassword="" diff --git a/lgsm/config-default/config-lgsm/ccserver/_default.cfg b/lgsm/config-default/config-lgsm/ccserver/_default.cfg index 202535ce1..866d9b1eb 100644 --- a/lgsm/config-default/config-lgsm/ccserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/ccserver/_default.cfg @@ -114,6 +114,7 @@ sleeptime="0.5" ## SteamCMD Settings | https://docs.linuxgsm.com/steamcmd # Server appid appid="383410" +steamcmdforcewindows="no" # SteamCMD Branch | https://docs.linuxgsm.com/steamcmd/branch branch="" betapassword="" diff --git a/lgsm/config-default/config-lgsm/cmwserver/_default.cfg b/lgsm/config-default/config-lgsm/cmwserver/_default.cfg index 3f3e29c8b..c8e09c8da 100644 --- a/lgsm/config-default/config-lgsm/cmwserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/cmwserver/_default.cfg @@ -115,6 +115,7 @@ sleeptime="0.5" ## SteamCMD Settings | https://docs.linuxgsm.com/steamcmd # Server appid appid="220070" +steamcmdforcewindows="no" # SteamCMD Branch | https://docs.linuxgsm.com/steamcmd/branch branch="" betapassword="" diff --git a/lgsm/config-default/config-lgsm/colserver/_default.cfg b/lgsm/config-default/config-lgsm/colserver/_default.cfg index 5be0776cf..63a60b6c8 100644 --- a/lgsm/config-default/config-lgsm/colserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/colserver/_default.cfg @@ -107,6 +107,7 @@ sleeptime="0.5" ## SteamCMD Settings | https://docs.linuxgsm.com/steamcmd # Server appid appid="748090" +steamcmdforcewindows="no" # SteamCMD Branch | https://docs.linuxgsm.com/steamcmd/branch branch="" betapassword="" diff --git a/lgsm/config-default/config-lgsm/csczserver/_default.cfg b/lgsm/config-default/config-lgsm/csczserver/_default.cfg index a0fb7fea8..fbe8fb9f1 100644 --- a/lgsm/config-default/config-lgsm/csczserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/csczserver/_default.cfg @@ -113,6 +113,7 @@ sleeptime="0.5" ## SteamCMD Settings | https://docs.linuxgsm.com/steamcmd # Server appid appid="90" +steamcmdforcewindows="no" appidmod="czero" # SteamCMD Branch | https://docs.linuxgsm.com/steamcmd/branch branch="" diff --git a/lgsm/config-default/config-lgsm/csgoserver/_default.cfg b/lgsm/config-default/config-lgsm/csgoserver/_default.cfg index 2ed74049e..31afc3b43 100644 --- a/lgsm/config-default/config-lgsm/csgoserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/csgoserver/_default.cfg @@ -139,6 +139,7 @@ sleeptime="0.5" ## SteamCMD Settings | https://docs.linuxgsm.com/steamcmd # Server appid appid="740" +steamcmdforcewindows="no" # SteamCMD Branch | https://docs.linuxgsm.com/steamcmd/branch branch="" betapassword="" diff --git a/lgsm/config-default/config-lgsm/csserver/_default.cfg b/lgsm/config-default/config-lgsm/csserver/_default.cfg index a5661c890..e4eb45909 100644 --- a/lgsm/config-default/config-lgsm/csserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/csserver/_default.cfg @@ -113,6 +113,7 @@ sleeptime="0.5" ## SteamCMD Settings | https://docs.linuxgsm.com/steamcmd # Server appid appid="90" +steamcmdforcewindows="no" appidmod="cstrike" # SteamCMD Branch | https://docs.linuxgsm.com/steamcmd/branch branch="" diff --git a/lgsm/config-default/config-lgsm/cssserver/_default.cfg b/lgsm/config-default/config-lgsm/cssserver/_default.cfg index 56f430bb6..5dd2d09a3 100644 --- a/lgsm/config-default/config-lgsm/cssserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/cssserver/_default.cfg @@ -119,6 +119,7 @@ sleeptime="0.5" ## SteamCMD Settings | https://docs.linuxgsm.com/steamcmd # Server appid appid="232330" +steamcmdforcewindows="no" # SteamCMD Branch | https://docs.linuxgsm.com/steamcmd/branch branch="" betapassword="" diff --git a/lgsm/config-default/config-lgsm/dabserver/_default.cfg b/lgsm/config-default/config-lgsm/dabserver/_default.cfg index ea6bcf390..2ba9c66c3 100644 --- a/lgsm/config-default/config-lgsm/dabserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/dabserver/_default.cfg @@ -114,6 +114,7 @@ sleeptime="0.5" ## SteamCMD Settings | https://docs.linuxgsm.com/steamcmd # Server appid appid="317800" +steamcmdforcewindows="no" # SteamCMD Branch | https://docs.linuxgsm.com/steamcmd/branch branch="" betapassword="" diff --git a/lgsm/config-default/config-lgsm/dmcserver/_default.cfg b/lgsm/config-default/config-lgsm/dmcserver/_default.cfg index 8babab1dd..e13d16998 100644 --- a/lgsm/config-default/config-lgsm/dmcserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/dmcserver/_default.cfg @@ -113,6 +113,7 @@ sleeptime="0.5" ## SteamCMD Settings | https://docs.linuxgsm.com/steamcmd # Server appid appid="90" +steamcmdforcewindows="no" appidmod="dmc" # SteamCMD Branch | https://docs.linuxgsm.com/steamcmd/branch branch="" diff --git a/lgsm/config-default/config-lgsm/dodserver/_default.cfg b/lgsm/config-default/config-lgsm/dodserver/_default.cfg index 83b051930..768cd5916 100644 --- a/lgsm/config-default/config-lgsm/dodserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/dodserver/_default.cfg @@ -113,6 +113,7 @@ sleeptime="0.5" ## SteamCMD Settings | https://docs.linuxgsm.com/steamcmd # Server appid appid="90" +steamcmdforcewindows="no" appidmod="dod" # SteamCMD Branch | https://docs.linuxgsm.com/steamcmd/branch branch="" diff --git a/lgsm/config-default/config-lgsm/dodsserver/_default.cfg b/lgsm/config-default/config-lgsm/dodsserver/_default.cfg index 3af945122..edfe49b05 100644 --- a/lgsm/config-default/config-lgsm/dodsserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/dodsserver/_default.cfg @@ -114,6 +114,7 @@ sleeptime="0.5" ## SteamCMD Settings | https://docs.linuxgsm.com/steamcmd # Server appid appid="232290" +steamcmdforcewindows="no" # SteamCMD Branch | https://docs.linuxgsm.com/steamcmd/branch branch="" betapassword="" diff --git a/lgsm/config-default/config-lgsm/doiserver/_default.cfg b/lgsm/config-default/config-lgsm/doiserver/_default.cfg index deb15b2dc..040b51a77 100644 --- a/lgsm/config-default/config-lgsm/doiserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/doiserver/_default.cfg @@ -115,6 +115,7 @@ sleeptime="0.5" ## SteamCMD Settings | https://docs.linuxgsm.com/steamcmd # Server appid appid="462310" +steamcmdforcewindows="no" # SteamCMD Branch | https://docs.linuxgsm.com/steamcmd/branch branch="" betapassword="" diff --git a/lgsm/config-default/config-lgsm/dstserver/_default.cfg b/lgsm/config-default/config-lgsm/dstserver/_default.cfg index 6e746fb83..4c2373c83 100644 --- a/lgsm/config-default/config-lgsm/dstserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/dstserver/_default.cfg @@ -117,6 +117,7 @@ sleeptime="0.5" ## SteamCMD Settings | https://docs.linuxgsm.com/steamcmd # Server appid appid="343050" +steamcmdforcewindows="no" # SteamCMD Branch | https://docs.linuxgsm.com/steamcmd/branch branch="" betapassword="" diff --git a/lgsm/config-default/config-lgsm/dysserver/_default.cfg b/lgsm/config-default/config-lgsm/dysserver/_default.cfg index c45a12bee..9492acfda 100644 --- a/lgsm/config-default/config-lgsm/dysserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/dysserver/_default.cfg @@ -119,6 +119,7 @@ sleeptime="0.5" ## SteamCMD Settings | https://docs.linuxgsm.com/steamcmd # Server appid appid="17585" +steamcmdforcewindows="no" # SteamCMD Branch | https://docs.linuxgsm.com/steamcmd/branch branch="" betapassword="" diff --git a/lgsm/config-default/config-lgsm/ecoserver/_default.cfg b/lgsm/config-default/config-lgsm/ecoserver/_default.cfg index c515595e2..b9cc4eb9b 100644 --- a/lgsm/config-default/config-lgsm/ecoserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/ecoserver/_default.cfg @@ -106,6 +106,7 @@ sleeptime="0.5" ## SteamCMD Settings | https://docs.linuxgsm.com/steamcmd # Server appid appid="739590" +steamcmdforcewindows="no" # SteamCMD Branch | https://docs.linuxgsm.com/steamcmd/branch branch="" betapassword="" diff --git a/lgsm/config-default/config-lgsm/emserver/_default.cfg b/lgsm/config-default/config-lgsm/emserver/_default.cfg index be13dac6b..293df0749 100644 --- a/lgsm/config-default/config-lgsm/emserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/emserver/_default.cfg @@ -119,6 +119,7 @@ sleeptime="0.5" ## SteamCMD Settings | https://docs.linuxgsm.com/steamcmd # Server appid appid="460040" +steamcmdforcewindows="no" # SteamCMD Branch | https://docs.linuxgsm.com/steamcmd/branch branch="" betapassword="" diff --git a/lgsm/config-default/config-lgsm/fofserver/_default.cfg b/lgsm/config-default/config-lgsm/fofserver/_default.cfg index 1452805b8..5cfab32fd 100644 --- a/lgsm/config-default/config-lgsm/fofserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/fofserver/_default.cfg @@ -114,6 +114,7 @@ sleeptime="0.5" ## SteamCMD Settings | https://docs.linuxgsm.com/steamcmd # Server appid appid="295230" +steamcmdforcewindows="no" # SteamCMD Branch | https://docs.linuxgsm.com/steamcmd/branch branch="" betapassword="" diff --git a/lgsm/config-default/config-lgsm/gmodserver/_default.cfg b/lgsm/config-default/config-lgsm/gmodserver/_default.cfg index 4bac3995c..bdd9296e0 100644 --- a/lgsm/config-default/config-lgsm/gmodserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/gmodserver/_default.cfg @@ -130,6 +130,7 @@ sleeptime="0.5" ## SteamCMD Settings | https://docs.linuxgsm.com/steamcmd # Server appid appid="4020" +steamcmdforcewindows="no" # SteamCMD Branch | https://docs.linuxgsm.com/steamcmd/branch branch="" betapassword="" diff --git a/lgsm/config-default/config-lgsm/hl2dmserver/_default.cfg b/lgsm/config-default/config-lgsm/hl2dmserver/_default.cfg index f356b1238..aa4515806 100644 --- a/lgsm/config-default/config-lgsm/hl2dmserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/hl2dmserver/_default.cfg @@ -114,6 +114,7 @@ sleeptime="0.5" ## SteamCMD Settings | https://docs.linuxgsm.com/steamcmd # Server appid appid="232370" +steamcmdforcewindows="no" # SteamCMD Branch | https://docs.linuxgsm.com/steamcmd/branch branch="" betapassword="" diff --git a/lgsm/config-default/config-lgsm/hldmserver/_default.cfg b/lgsm/config-default/config-lgsm/hldmserver/_default.cfg index 41b702789..79daf5607 100644 --- a/lgsm/config-default/config-lgsm/hldmserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/hldmserver/_default.cfg @@ -113,6 +113,7 @@ sleeptime="0.5" ## SteamCMD Settings | https://docs.linuxgsm.com/steamcmd # Server appid appid="90" +steamcmdforcewindows="no" # SteamCMD Branch | https://docs.linuxgsm.com/steamcmd/branch branch="" betapassword="" diff --git a/lgsm/config-default/config-lgsm/hldmsserver/_default.cfg b/lgsm/config-default/config-lgsm/hldmsserver/_default.cfg index 7c04267ad..e174f48ef 100644 --- a/lgsm/config-default/config-lgsm/hldmsserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/hldmsserver/_default.cfg @@ -114,6 +114,7 @@ sleeptime="0.5" ## SteamCMD Settings | https://docs.linuxgsm.com/steamcmd # Server appid appid="255470" +steamcmdforcewindows="no" # SteamCMD Branch | https://docs.linuxgsm.com/steamcmd/branch branch="" betapassword="" diff --git a/lgsm/config-default/config-lgsm/hwserver/_default.cfg b/lgsm/config-default/config-lgsm/hwserver/_default.cfg index eda9972d3..37b1e171c 100644 --- a/lgsm/config-default/config-lgsm/hwserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/hwserver/_default.cfg @@ -125,6 +125,7 @@ sleeptime="0.5" ## SteamCMD Settings | https://docs.linuxgsm.com/steamcmd # Server appid appid="405100" +steamcmdforcewindows="no" # SteamCMD Branch | https://docs.linuxgsm.com/steamcmd/branch branch="" betapassword="" diff --git a/lgsm/config-default/config-lgsm/insserver/_default.cfg b/lgsm/config-default/config-lgsm/insserver/_default.cfg index 50e3e8721..3302251e2 100644 --- a/lgsm/config-default/config-lgsm/insserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/insserver/_default.cfg @@ -120,6 +120,7 @@ sleeptime="0.5" ## SteamCMD Settings | https://docs.linuxgsm.com/steamcmd # Server appid appid="237410" +steamcmdforcewindows="no" # SteamCMD Branch | https://docs.linuxgsm.com/steamcmd/branch branch="" betapassword="" diff --git a/lgsm/config-default/config-lgsm/inssserver/_default.cfg b/lgsm/config-default/config-lgsm/inssserver/_default.cfg index 2e8b29e16..c7d600980 100644 --- a/lgsm/config-default/config-lgsm/inssserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/inssserver/_default.cfg @@ -122,6 +122,7 @@ sleeptime="0.5" ## SteamCMD Settings | https://docs.linuxgsm.com/steamcmd # Server appid appid="581330" +steamcmdforcewindows="no" # SteamCMD Branch | https://docs.linuxgsm.com/steamcmd/branch branch="" betapassword="" diff --git a/lgsm/config-default/config-lgsm/iosserver/_default.cfg b/lgsm/config-default/config-lgsm/iosserver/_default.cfg index c322ed383..9420ed294 100644 --- a/lgsm/config-default/config-lgsm/iosserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/iosserver/_default.cfg @@ -114,6 +114,7 @@ sleeptime="0.5" ## SteamCMD Settings | https://docs.linuxgsm.com/steamcmd # Server appid appid="673990" +steamcmdforcewindows="no" # SteamCMD Branch | https://docs.linuxgsm.com/steamcmd/branch branch="" betapassword="" diff --git a/lgsm/config-default/config-lgsm/jc2server/_default.cfg b/lgsm/config-default/config-lgsm/jc2server/_default.cfg index c57af02ea..a7b45a24a 100644 --- a/lgsm/config-default/config-lgsm/jc2server/_default.cfg +++ b/lgsm/config-default/config-lgsm/jc2server/_default.cfg @@ -106,6 +106,7 @@ sleeptime="0.5" ## SteamCMD Settings | https://docs.linuxgsm.com/steamcmd # Server appid appid="261140" +steamcmdforcewindows="no" # SteamCMD Branch | https://docs.linuxgsm.com/steamcmd/branch branch="" betapassword="" diff --git a/lgsm/config-default/config-lgsm/jc3server/_default.cfg b/lgsm/config-default/config-lgsm/jc3server/_default.cfg index e208a42f4..368b815aa 100644 --- a/lgsm/config-default/config-lgsm/jc3server/_default.cfg +++ b/lgsm/config-default/config-lgsm/jc3server/_default.cfg @@ -106,6 +106,7 @@ sleeptime="0.5" ## SteamCMD Settings | https://docs.linuxgsm.com/steamcmd # Server appid appid="619960" +steamcmdforcewindows="no" # SteamCMD Branch | https://docs.linuxgsm.com/steamcmd/branch branch="" betapassword="" diff --git a/lgsm/config-default/config-lgsm/jk2server/_default.cfg b/lgsm/config-default/config-lgsm/jk2server/_default.cfg index cb42989a7..0aa6710a6 100644 --- a/lgsm/config-default/config-lgsm/jk2server/_default.cfg +++ b/lgsm/config-default/config-lgsm/jk2server/_default.cfg @@ -135,6 +135,7 @@ consoleinteract="yes" ## SteamCMD Settings # Server appid appid="6030" +steamcmdforcewindows="yes" # SteamCMD Branch | https://docs.linuxgsm.com/steamcmd/branch branch="" # Master Server | https://docs.linuxgsm.com/steamcmd/steam-master-server diff --git a/lgsm/config-default/config-lgsm/kf2server/_default.cfg b/lgsm/config-default/config-lgsm/kf2server/_default.cfg index 175e082ab..8fb108406 100644 --- a/lgsm/config-default/config-lgsm/kf2server/_default.cfg +++ b/lgsm/config-default/config-lgsm/kf2server/_default.cfg @@ -112,6 +112,7 @@ sleeptime="0.5" ## SteamCMD Settings | https://docs.linuxgsm.com/steamcmd # Server appid appid="232130" +steamcmdforcewindows="no" # SteamCMD Branch | https://docs.linuxgsm.com/steamcmd/branch branch="" betapassword="" diff --git a/lgsm/config-default/config-lgsm/kfserver/_default.cfg b/lgsm/config-default/config-lgsm/kfserver/_default.cfg index 0169f48d0..972351bd2 100644 --- a/lgsm/config-default/config-lgsm/kfserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/kfserver/_default.cfg @@ -118,6 +118,7 @@ sleeptime="0.5" ## SteamCMD Settings | https://docs.linuxgsm.com/steamcmd # Server appid appid="215360" +steamcmdforcewindows="no" # SteamCMD Branch | https://docs.linuxgsm.com/steamcmd/branch branch="" betapassword="" diff --git a/lgsm/config-default/config-lgsm/l4d2server/_default.cfg b/lgsm/config-default/config-lgsm/l4d2server/_default.cfg index 718432852..66112ed91 100644 --- a/lgsm/config-default/config-lgsm/l4d2server/_default.cfg +++ b/lgsm/config-default/config-lgsm/l4d2server/_default.cfg @@ -113,6 +113,7 @@ sleeptime="0.5" ## SteamCMD Settings | https://docs.linuxgsm.com/steamcmd # Server appid appid="222860" +steamcmdforcewindows="no" # SteamCMD Branch | https://docs.linuxgsm.com/steamcmd/branch branch="" betapassword="" diff --git a/lgsm/config-default/config-lgsm/l4dserver/_default.cfg b/lgsm/config-default/config-lgsm/l4dserver/_default.cfg index beacac9bb..22833b5b8 100644 --- a/lgsm/config-default/config-lgsm/l4dserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/l4dserver/_default.cfg @@ -113,6 +113,7 @@ sleeptime="0.5" ## SteamCMD Settings | https://docs.linuxgsm.com/steamcmd # Server appid appid="222840" +steamcmdforcewindows="no" # SteamCMD Branch | https://docs.linuxgsm.com/steamcmd/branch branch="" betapassword="" diff --git a/lgsm/config-default/config-lgsm/mhserver/_default.cfg b/lgsm/config-default/config-lgsm/mhserver/_default.cfg index c71081b89..1af879ac1 100644 --- a/lgsm/config-default/config-lgsm/mhserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/mhserver/_default.cfg @@ -114,6 +114,7 @@ sleeptime="0.5" ## SteamCMD Settings | https://docs.linuxgsm.com/steamcmd # Server appid appid="629800" +steamcmdforcewindows="no" # SteamCMD Branch | https://docs.linuxgsm.com/steamcmd/branch branch="" betapassword="" diff --git a/lgsm/config-default/config-lgsm/momserver/_default.cfg b/lgsm/config-default/config-lgsm/momserver/_default.cfg index 7909b67e2..1a4569052 100644 --- a/lgsm/config-default/config-lgsm/momserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/momserver/_default.cfg @@ -112,6 +112,7 @@ sleeptime="0.5" ## SteamCMD Settings | https://docs.linuxgsm.com/steamcmd # Server appid appid="897590" +steamcmdforcewindows="no" # SteamCMD Branch | https://docs.linuxgsm.com/steamcmd/branch branch="" betapassword="" diff --git a/lgsm/config-default/config-lgsm/ndserver/_default.cfg b/lgsm/config-default/config-lgsm/ndserver/_default.cfg index 7ef270919..446b9a151 100644 --- a/lgsm/config-default/config-lgsm/ndserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/ndserver/_default.cfg @@ -114,6 +114,7 @@ sleeptime="0.5" ## SteamCMD Settings | https://docs.linuxgsm.com/steamcmd # Server appid appid="111710" +steamcmdforcewindows="no" # SteamCMD Branch | https://docs.linuxgsm.com/steamcmd/branch branch="" betapassword="" diff --git a/lgsm/config-default/config-lgsm/nmrihserver/_default.cfg b/lgsm/config-default/config-lgsm/nmrihserver/_default.cfg index 41c057356..799a919c7 100644 --- a/lgsm/config-default/config-lgsm/nmrihserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/nmrihserver/_default.cfg @@ -119,6 +119,7 @@ sleeptime="0.5" ## SteamCMD Settings | https://docs.linuxgsm.com/steamcmd # Server appid appid="317670" +steamcmdforcewindows="no" # SteamCMD Branch | https://docs.linuxgsm.com/steamcmd/branch branch="" betapassword="" diff --git a/lgsm/config-default/config-lgsm/ns2cserver/_default.cfg b/lgsm/config-default/config-lgsm/ns2cserver/_default.cfg index 1ccb9706e..c65047fff 100644 --- a/lgsm/config-default/config-lgsm/ns2cserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/ns2cserver/_default.cfg @@ -121,6 +121,7 @@ sleeptime="0.5" ## SteamCMD Settings | https://docs.linuxgsm.com/steamcmd # Server appid appid="313900" +steamcmdforcewindows="no" # SteamCMD Branch | https://docs.linuxgsm.com/steamcmd/branch branch="" betapassword="" diff --git a/lgsm/config-default/config-lgsm/ns2server/_default.cfg b/lgsm/config-default/config-lgsm/ns2server/_default.cfg index c132d539d..58e1da031 100644 --- a/lgsm/config-default/config-lgsm/ns2server/_default.cfg +++ b/lgsm/config-default/config-lgsm/ns2server/_default.cfg @@ -125,6 +125,7 @@ sleeptime="0.5" ## SteamCMD Settings | https://docs.linuxgsm.com/steamcmd # Server appid appid="4940" +steamcmdforcewindows="no" # SteamCMD Branch | https://docs.linuxgsm.com/steamcmd/branch branch="" betapassword="" diff --git a/lgsm/config-default/config-lgsm/nsserver/_default.cfg b/lgsm/config-default/config-lgsm/nsserver/_default.cfg index 2a2425f73..d1e223469 100644 --- a/lgsm/config-default/config-lgsm/nsserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/nsserver/_default.cfg @@ -113,6 +113,7 @@ sleeptime="0.5" ## SteamCMD Settings | https://docs.linuxgsm.com/steamcmd # Server appid appid="90" +steamcmdforcewindows="no" appidmod="cstrike" # SteamCMD Branch | https://docs.linuxgsm.com/steamcmd/branch branch="" diff --git a/lgsm/config-default/config-lgsm/onsetserver/_default.cfg b/lgsm/config-default/config-lgsm/onsetserver/_default.cfg index d564020ed..4301a2e72 100644 --- a/lgsm/config-default/config-lgsm/onsetserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/onsetserver/_default.cfg @@ -106,6 +106,7 @@ sleeptime="0.5" ## SteamCMD Settings | https://docs.linuxgsm.com/steamcmd # Server appid appid="1204170" +steamcmdforcewindows="no" # SteamCMD Branch | https://docs.linuxgsm.com/steamcmd/branch branch="" betapassword="" diff --git a/lgsm/config-default/config-lgsm/opforserver/_default.cfg b/lgsm/config-default/config-lgsm/opforserver/_default.cfg index f0e54f511..1af66199d 100644 --- a/lgsm/config-default/config-lgsm/opforserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/opforserver/_default.cfg @@ -113,6 +113,7 @@ sleeptime="0.5" ## SteamCMD Settings | https://docs.linuxgsm.com/steamcmd # Server appid appid="90" +steamcmdforcewindows="no" appidmod="gearbox" # SteamCMD Branch | https://docs.linuxgsm.com/steamcmd/branch branch="" diff --git a/lgsm/config-default/config-lgsm/pcserver/_default.cfg b/lgsm/config-default/config-lgsm/pcserver/_default.cfg index c02992f92..3f1f88292 100644 --- a/lgsm/config-default/config-lgsm/pcserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/pcserver/_default.cfg @@ -106,6 +106,7 @@ sleeptime="0.5" ## SteamCMD Settings | https://docs.linuxgsm.com/steamcmd # Server appid appid="332670" +steamcmdforcewindows="no" # SteamCMD Branch | https://docs.linuxgsm.com/steamcmd/branch branch="" betapassword="" diff --git a/lgsm/config-default/config-lgsm/pstbsserver/_default.cfg b/lgsm/config-default/config-lgsm/pstbsserver/_default.cfg index 62a8af0ba..c3ec4ec3f 100644 --- a/lgsm/config-default/config-lgsm/pstbsserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/pstbsserver/_default.cfg @@ -116,6 +116,7 @@ sleeptime="0.5" ## SteamCMD Settings | https://docs.linuxgsm.com/steamcmd # Server appid appid="746200" +steamcmdforcewindows="no" # SteamCMD Branch | https://docs.linuxgsm.com/steamcmd/branch branch="" betapassword="" diff --git a/lgsm/config-default/config-lgsm/pvkiiserver/_default.cfg b/lgsm/config-default/config-lgsm/pvkiiserver/_default.cfg index 96442da3d..b8b96d735 100644 --- a/lgsm/config-default/config-lgsm/pvkiiserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/pvkiiserver/_default.cfg @@ -114,6 +114,7 @@ sleeptime="0.5" ## SteamCMD Settings | https://docs.linuxgsm.com/steamcmd # Server appid appid="17575" +steamcmdforcewindows="no" # SteamCMD Branch | https://docs.linuxgsm.com/steamcmd/branch branch="" betapassword="" diff --git a/lgsm/config-default/config-lgsm/pvrserver/_default.cfg b/lgsm/config-default/config-lgsm/pvrserver/_default.cfg index 0177b2a95..e2373f9fd 100644 --- a/lgsm/config-default/config-lgsm/pvrserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/pvrserver/_default.cfg @@ -113,6 +113,7 @@ sleeptime="0.5" ## SteamCMD Settings | https://docs.linuxgsm.com/steamcmd # Server appid appid="622970" +steamcmdforcewindows="no" # SteamCMD Branch | https://docs.linuxgsm.com/steamcmd/branch branch="" betapassword="" diff --git a/lgsm/config-default/config-lgsm/pzserver/_default.cfg b/lgsm/config-default/config-lgsm/pzserver/_default.cfg index ab22be682..9995baeea 100644 --- a/lgsm/config-default/config-lgsm/pzserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/pzserver/_default.cfg @@ -110,6 +110,7 @@ sleeptime="0.5" ## SteamCMD Settings | https://docs.linuxgsm.com/steamcmd # Server appid appid="380870" +steamcmdforcewindows="no" # SteamCMD Branch | https://docs.linuxgsm.com/steamcmd/branch branch="" betapassword="" diff --git a/lgsm/config-default/config-lgsm/qlserver/_default.cfg b/lgsm/config-default/config-lgsm/qlserver/_default.cfg index 25d1f43bc..ad44f6c29 100644 --- a/lgsm/config-default/config-lgsm/qlserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/qlserver/_default.cfg @@ -106,6 +106,7 @@ sleeptime="0.5" ## SteamCMD Settings | https://docs.linuxgsm.com/steamcmd # Server appid appid="349090" +steamcmdforcewindows="no" # SteamCMD Branch | https://docs.linuxgsm.com/steamcmd/branch branch="" betapassword="" diff --git a/lgsm/config-default/config-lgsm/ricochetserver/_default.cfg b/lgsm/config-default/config-lgsm/ricochetserver/_default.cfg index c443cbb47..187ca2ede 100644 --- a/lgsm/config-default/config-lgsm/ricochetserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/ricochetserver/_default.cfg @@ -113,6 +113,7 @@ sleeptime="0.5" ## SteamCMD Settings | https://docs.linuxgsm.com/steamcmd # Server appid appid="90" +steamcmdforcewindows="no" appidmod="ricochet" # SteamCMD Branch | https://docs.linuxgsm.com/steamcmd/branch branch="" diff --git a/lgsm/config-default/config-lgsm/roserver/_default.cfg b/lgsm/config-default/config-lgsm/roserver/_default.cfg index f5659b550..96f26998a 100644 --- a/lgsm/config-default/config-lgsm/roserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/roserver/_default.cfg @@ -114,6 +114,7 @@ sleeptime="0.5" ## SteamCMD Settings | https://docs.linuxgsm.com/steamcmd # Server appid appid="223250" +steamcmdforcewindows="no" # SteamCMD Branch | https://docs.linuxgsm.com/steamcmd/branch branch="" betapassword="" diff --git a/lgsm/config-default/config-lgsm/rustserver/_default.cfg b/lgsm/config-default/config-lgsm/rustserver/_default.cfg index 7ec79ab97..db48ddd55 100644 --- a/lgsm/config-default/config-lgsm/rustserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/rustserver/_default.cfg @@ -121,6 +121,7 @@ sleeptime="0.5" ## SteamCMD Settings | https://docs.linuxgsm.com/steamcmd # Server appid appid="258550" +steamcmdforcewindows="no" # SteamCMD Branch | https://docs.linuxgsm.com/steamcmd/branch branch="" betapassword="" diff --git a/lgsm/config-default/config-lgsm/rwserver/_default.cfg b/lgsm/config-default/config-lgsm/rwserver/_default.cfg index cddf99818..0a83c50d9 100644 --- a/lgsm/config-default/config-lgsm/rwserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/rwserver/_default.cfg @@ -109,6 +109,7 @@ sleeptime="0.5" ## SteamCMD Settings | https://docs.linuxgsm.com/steamcmd # Server appid appid="339010" +steamcmdforcewindows="no" # SteamCMD Branch | https://docs.linuxgsm.com/steamcmd/branch branch="" betapassword="" diff --git a/lgsm/config-default/config-lgsm/sbotsserver/_default.cfg b/lgsm/config-default/config-lgsm/sbotsserver/_default.cfg index c0867e1c8..628b921e2 100644 --- a/lgsm/config-default/config-lgsm/sbotsserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/sbotsserver/_default.cfg @@ -114,6 +114,7 @@ sleeptime="0.5" ## SteamCMD Settings | https://docs.linuxgsm.com/steamcmd # Server appid appid="974130" +steamcmdforcewindows="no" # SteamCMD Branch | https://docs.linuxgsm.com/steamcmd/branch branch="" betapassword="" diff --git a/lgsm/config-default/config-lgsm/sbserver/_default.cfg b/lgsm/config-default/config-lgsm/sbserver/_default.cfg index b3bffbcad..d6cbf5f8d 100644 --- a/lgsm/config-default/config-lgsm/sbserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/sbserver/_default.cfg @@ -113,6 +113,7 @@ sleeptime="0.5" ## SteamCMD Settings | https://docs.linuxgsm.com/steamcmd # Server appid appid="211820" +steamcmdforcewindows="no" # SteamCMD Branch | https://docs.linuxgsm.com/steamcmd/branch branch="" betapassword="" diff --git a/lgsm/config-default/config-lgsm/scpslserver/_default.cfg b/lgsm/config-default/config-lgsm/scpslserver/_default.cfg index 4a706ae40..e1753d071 100644 --- a/lgsm/config-default/config-lgsm/scpslserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/scpslserver/_default.cfg @@ -127,6 +127,7 @@ consoleinteract="yes" ## SteamCMD Settings # Server appid appid="996560" +steamcmdforcewindows="no" # SteamCMD Branch | https://docs.linuxgsm.com/steamcmd/branch branch="" # Master Server | https://docs.linuxgsm.com/steamcmd/steam-master-server diff --git a/lgsm/config-default/config-lgsm/scpslsmserver/_default.cfg b/lgsm/config-default/config-lgsm/scpslsmserver/_default.cfg index 4ac830f21..905918e9a 100644 --- a/lgsm/config-default/config-lgsm/scpslsmserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/scpslsmserver/_default.cfg @@ -127,6 +127,7 @@ consoleinteract="yes" ## SteamCMD Settings # Server appid appid="786920" +steamcmdforcewindows="no" # SteamCMD Branch | https://docs.linuxgsm.com/steamcmd/branch branch="" # Master Server | https://docs.linuxgsm.com/steamcmd/steam-master-server diff --git a/lgsm/config-default/config-lgsm/sdtdserver/_default.cfg b/lgsm/config-default/config-lgsm/sdtdserver/_default.cfg index 3dad1f106..d2b754e6b 100644 --- a/lgsm/config-default/config-lgsm/sdtdserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/sdtdserver/_default.cfg @@ -109,6 +109,7 @@ sleeptime="0.5" ## SteamCMD Settings | https://docs.linuxgsm.com/steamcmd # Server appid appid="294420" +steamcmdforcewindows="no" # SteamCMD Branch | https://docs.linuxgsm.com/steamcmd/branch branch="" betapassword="" diff --git a/lgsm/config-default/config-lgsm/sfcserver/_default.cfg b/lgsm/config-default/config-lgsm/sfcserver/_default.cfg index 746b9e84c..5edbb791a 100644 --- a/lgsm/config-default/config-lgsm/sfcserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/sfcserver/_default.cfg @@ -114,6 +114,7 @@ sleeptime="0.5" ## SteamCMD Settings | https://docs.linuxgsm.com/steamcmd # Server appid appid="244310" # Source 2013 SDK +steamcmdforcewindows="no" # SteamCMD Branch | https://docs.linuxgsm.com/steamcmd/branch branch="" betapassword="" diff --git a/lgsm/config-default/config-lgsm/solserver/_default.cfg b/lgsm/config-default/config-lgsm/solserver/_default.cfg index b0fda3b81..e23a90421 100644 --- a/lgsm/config-default/config-lgsm/solserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/solserver/_default.cfg @@ -107,6 +107,7 @@ sleeptime="0.5" ## SteamCMD Settings | https://docs.linuxgsm.com/steamcmd # Server appid appid="638500" +steamcmdforcewindows="no" # SteamCMD Branch | https://docs.linuxgsm.com/steamcmd/branch branch="" betapassword="" diff --git a/lgsm/config-default/config-lgsm/squadserver/_default.cfg b/lgsm/config-default/config-lgsm/squadserver/_default.cfg index c329b06b4..62be29db5 100644 --- a/lgsm/config-default/config-lgsm/squadserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/squadserver/_default.cfg @@ -111,6 +111,7 @@ sleeptime="0.5" ## SteamCMD Settings | https://docs.linuxgsm.com/steamcmd # Server appid appid="403240" +steamcmdforcewindows="no" # SteamCMD Branch | https://docs.linuxgsm.com/steamcmd/branch branch="" betapassword="" diff --git a/lgsm/config-default/config-lgsm/stserver/_default.cfg b/lgsm/config-default/config-lgsm/stserver/_default.cfg index d7caf33e6..b0aa30fd6 100644 --- a/lgsm/config-default/config-lgsm/stserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/stserver/_default.cfg @@ -116,6 +116,7 @@ sleeptime="0.5" ## SteamCMD Settings | https://docs.linuxgsm.com/steamcmd # Server appid appid="600760" +steamcmdforcewindows="no" # SteamCMD Branch | https://docs.linuxgsm.com/steamcmd/branch branch="" betapassword="" diff --git a/lgsm/config-default/config-lgsm/svenserver/_default.cfg b/lgsm/config-default/config-lgsm/svenserver/_default.cfg index 908dd046d..7647d7566 100644 --- a/lgsm/config-default/config-lgsm/svenserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/svenserver/_default.cfg @@ -113,6 +113,7 @@ sleeptime="0.5" ## SteamCMD Settings | https://docs.linuxgsm.com/steamcmd # Server appid appid="276060" +steamcmdforcewindows="no" # SteamCMD Branch | https://docs.linuxgsm.com/steamcmd/branch branch="" betapassword="" diff --git a/lgsm/config-default/config-lgsm/terrariaserver/_default.cfg b/lgsm/config-default/config-lgsm/terrariaserver/_default.cfg index 79e683f65..6b9f66d3e 100644 --- a/lgsm/config-default/config-lgsm/terrariaserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/terrariaserver/_default.cfg @@ -113,6 +113,7 @@ sleeptime="0.5" ## SteamCMD Settings | https://docs.linuxgsm.com/steamcmd # Server appid appid="105600" +steamcmdforcewindows="no" # SteamCMD Branch | https://docs.linuxgsm.com/steamcmd/branch branch="" betapassword="" diff --git a/lgsm/config-default/config-lgsm/tf2server/_default.cfg b/lgsm/config-default/config-lgsm/tf2server/_default.cfg index 3aa580d39..cc3ed416f 100644 --- a/lgsm/config-default/config-lgsm/tf2server/_default.cfg +++ b/lgsm/config-default/config-lgsm/tf2server/_default.cfg @@ -119,6 +119,7 @@ sleeptime="0.5" ## SteamCMD Settings | https://docs.linuxgsm.com/steamcmd # Server appid appid="232250" +steamcmdforcewindows="no" # SteamCMD Branch | https://docs.linuxgsm.com/steamcmd/branch branch="" betapassword="" diff --git a/lgsm/config-default/config-lgsm/tfcserver/_default.cfg b/lgsm/config-default/config-lgsm/tfcserver/_default.cfg index c29b43642..ec8dcdcb3 100644 --- a/lgsm/config-default/config-lgsm/tfcserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/tfcserver/_default.cfg @@ -113,6 +113,7 @@ sleeptime="0.5" ## SteamCMD Settings | https://docs.linuxgsm.com/steamcmd # Server appid appid="90" +steamcmdforcewindows="no" appidmod="tfc" # SteamCMD Branch | https://docs.linuxgsm.com/steamcmd/branch branch="" diff --git a/lgsm/config-default/config-lgsm/tsserver/_default.cfg b/lgsm/config-default/config-lgsm/tsserver/_default.cfg index fb4fb9f01..a0c62e430 100644 --- a/lgsm/config-default/config-lgsm/tsserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/tsserver/_default.cfg @@ -113,6 +113,7 @@ sleeptime="0.5" ## SteamCMD Settings | https://docs.linuxgsm.com/steamcmd # Server appid appid="90" +steamcmdforcewindows="no" appidmod="cstrike" # SteamCMD Branch | https://docs.linuxgsm.com/steamcmd/branch branch="" diff --git a/lgsm/config-default/config-lgsm/tuserver/_default.cfg b/lgsm/config-default/config-lgsm/tuserver/_default.cfg index eed1cbdcb..799be9a80 100644 --- a/lgsm/config-default/config-lgsm/tuserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/tuserver/_default.cfg @@ -116,6 +116,7 @@ sleeptime="0.5" ## SteamCMD Settings | https://docs.linuxgsm.com/steamcmd # Server appid appid="439660" +steamcmdforcewindows="no" # SteamCMD Branch | https://docs.linuxgsm.com/steamcmd/branch branch="" betapassword="" diff --git a/lgsm/config-default/config-lgsm/twserver/_default.cfg b/lgsm/config-default/config-lgsm/twserver/_default.cfg index 9140ed859..40f81d959 100644 --- a/lgsm/config-default/config-lgsm/twserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/twserver/_default.cfg @@ -113,6 +113,7 @@ sleeptime="0.5" ## SteamCMD Settings | https://docs.linuxgsm.com/steamcmd # Server appid appid="380840" +steamcmdforcewindows="no" # SteamCMD Branch | https://docs.linuxgsm.com/steamcmd/branch branch="" betapassword="" diff --git a/lgsm/config-default/config-lgsm/untserver/_default.cfg b/lgsm/config-default/config-lgsm/untserver/_default.cfg index 1a8230e0a..36445e51d 100644 --- a/lgsm/config-default/config-lgsm/untserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/untserver/_default.cfg @@ -112,6 +112,7 @@ sleeptime="0.5" ## SteamCMD Settings | https://docs.linuxgsm.com/steamcmd # Server appid appid="1110390" +steamcmdforcewindows="no" # SteamCMD Branch | https://docs.linuxgsm.com/steamcmd/branch branch="" betapassword="" diff --git a/lgsm/config-default/config-lgsm/vsserver/_default.cfg b/lgsm/config-default/config-lgsm/vsserver/_default.cfg index f6bb4394c..83ae3b82c 100644 --- a/lgsm/config-default/config-lgsm/vsserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/vsserver/_default.cfg @@ -113,6 +113,7 @@ sleeptime="0.5" ## SteamCMD Settings | https://docs.linuxgsm.com/steamcmd # Server appid appid="90" +steamcmdforcewindows="no" appidmod="cstrike" # SteamCMD Branch | https://docs.linuxgsm.com/steamcmd/branch branch="" diff --git a/lgsm/config-default/config-lgsm/wfserver/_default.cfg b/lgsm/config-default/config-lgsm/wfserver/_default.cfg index 73f0bb8df..957124aae 100644 --- a/lgsm/config-default/config-lgsm/wfserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/wfserver/_default.cfg @@ -131,6 +131,7 @@ querytype="protocol-quake3" ## SteamCMD Settings | https://docs.linuxgsm.com/steamcmd # Server appid appid="1136510" +steamcmdforcewindows="no" appidmod="warfork" # SteamCMD Branch | https://docs.linuxgsm.com/steamcmd/branch branch="" diff --git a/lgsm/config-default/config-lgsm/wurmserver/_default.cfg b/lgsm/config-default/config-lgsm/wurmserver/_default.cfg index 0ad05ae4b..0a2131adf 100644 --- a/lgsm/config-default/config-lgsm/wurmserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/wurmserver/_default.cfg @@ -105,6 +105,7 @@ sleeptime="0.5" ## SteamCMD Settings | https://docs.linuxgsm.com/steamcmd # Server appid appid="402370" +steamcmdforcewindows="no" # SteamCMD Branch | https://docs.linuxgsm.com/steamcmd/branch branch="" betapassword="" diff --git a/lgsm/config-default/config-lgsm/zmrserver/_default.cfg b/lgsm/config-default/config-lgsm/zmrserver/_default.cfg index ce5cb3329..3eccd1daa 100644 --- a/lgsm/config-default/config-lgsm/zmrserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/zmrserver/_default.cfg @@ -114,6 +114,7 @@ sleeptime="0.5" ## SteamCMD Settings | https://docs.linuxgsm.com/steamcmd # Server appid appid="244310" # Source 2013 SDK +steamcmdforcewindows="no" # SteamCMD Branch | https://docs.linuxgsm.com/steamcmd/branch branch="" betapassword="" diff --git a/lgsm/config-default/config-lgsm/zpsserver/_default.cfg b/lgsm/config-default/config-lgsm/zpsserver/_default.cfg index cf26a9e84..c30c533b5 100644 --- a/lgsm/config-default/config-lgsm/zpsserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/zpsserver/_default.cfg @@ -119,6 +119,7 @@ sleeptime="0.5" ## SteamCMD Settings | https://docs.linuxgsm.com/steamcmd # Server appid appid="17505" +steamcmdforcewindows="no" # SteamCMD Branch | https://docs.linuxgsm.com/steamcmd/branch branch="" betapassword="" diff --git a/lgsm/functions/core_dl.sh b/lgsm/functions/core_dl.sh index 7bb346a85..eaaddf5c7 100755 --- a/lgsm/functions/core_dl.sh +++ b/lgsm/functions/core_dl.sh @@ -67,7 +67,7 @@ fn_dl_steamcmd(){ ${unbuffer} ${steamcmdcommand} +login "${steamuser}" "${steampass}" +force_install_dir "${serverfiles}" +app_set_config 90 mod "${appidmod}" +app_update "${appid}" ${validate} +quit | uniq | tee -a "${lgsmlog}" "${steamcmdlog}" fi # Force Windows Platform type. - elif [ "${shortname}" == "ac" ]||[ "${shortname}" == "jk2" ]; then + elif [ "${steamcmdforcewindows}" == "yes" ]; then if [ -n "${branch}" ]&&[ -n "${betapassword}" ]; then ${unbuffer} ${steamcmdcommand} +@sSteamCmdForcePlatformType windows +login "${steamuser}" "${steampass}" +force_install_dir "${serverfiles}" +app_update "${appid}" -beta "${branch}" -betapassword "${betapassword}" ${validate} +quit | uniq | tee -a "${lgsmlog}" "${steamcmdlog}" elif [ -n "${branch}" ]; then From 45f91d28735b93b1b4254c5e1fcf93ce4b7d7406 Mon Sep 17 00:00:00 2001 From: Christian Date: Sat, 16 Jan 2021 00:53:49 +0100 Subject: [PATCH 532/534] fix(steamcmd): add dependency SDL 32bit for debian and ubuntu (#3186) --- 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 2ad38e481..4b83bf2f1 100755 --- a/lgsm/functions/check_deps.sh +++ b/lgsm/functions/check_deps.sh @@ -364,7 +364,7 @@ fn_deps_build_debian(){ if [ "${distroversion}" == "14.04" ]||[ "${distroid}" == "debian" ]&& ! grep -qE "^deb .*non-free" /etc/apt/sources.list; then : else - array_deps_required+=( steamcmd ) + array_deps_required+=( steamcmd libsdl2-2.0-0:i386 ) fi fi From f449154a95f9fe5456816380764eea8b872a4b9a Mon Sep 17 00:00:00 2001 From: Christian Date: Sat, 16 Jan 2021 16:46:29 +0100 Subject: [PATCH 533/534] fix(stop): change csgoserver stop mode (#3171) Co-authored-by: Daniel Gibbs --- lgsm/config-default/config-lgsm/csgoserver/_default.cfg | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lgsm/config-default/config-lgsm/csgoserver/_default.cfg b/lgsm/config-default/config-lgsm/csgoserver/_default.cfg index 31afc3b43..c5a44b820 100644 --- a/lgsm/config-default/config-lgsm/csgoserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/csgoserver/_default.cfg @@ -158,7 +158,7 @@ steammaster="true" # 9: GoldSrc # 10: Avorion # 11: end -stopmode="3" +stopmode="9" ## Query mode # 1: session only From 2bc7b309ce0c1a341920f3750bbff589865baf44 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Sat, 16 Jan 2021 15:51:34 +0000 Subject: [PATCH 534/534] fix(update): non-steam updates to not always require restarting if stopped (#3173) --- lgsm/functions/update_factorio.sh | 14 ++++++++------ lgsm/functions/update_jediknight2.sh | 18 ++++++++++-------- lgsm/functions/update_minecraft.sh | 13 ++++++++----- lgsm/functions/update_minecraft_bedrock.sh | 14 +++++++++----- lgsm/functions/update_mta.sh | 14 +++++++++----- lgsm/functions/update_mumble.sh | 13 ++++++++----- lgsm/functions/update_ts3.sh | 14 +++++++++----- lgsm/functions/update_vintagestory.sh | 14 ++++++++------ 8 files changed, 69 insertions(+), 45 deletions(-) diff --git a/lgsm/functions/update_factorio.sh b/lgsm/functions/update_factorio.sh index f13a48c43..3e01e4203 100644 --- a/lgsm/functions/update_factorio.sh +++ b/lgsm/functions/update_factorio.sh @@ -94,12 +94,14 @@ fn_update_factorio_compare(){ if [ "${status}" == "0" ]; then exitbypass=1 fn_update_factorio_dl - exitbypass=1 - command_start.sh - fn_firstcommand_reset - exitbypass=1 - command_stop.sh - fn_firstcommand_reset + if [ "${requirerestart}" == "1" ]; then + exitbypass=1 + command_start.sh + fn_firstcommand_reset + exitbypass=1 + command_stop.sh + fn_firstcommand_reset + fi # If server started. else fn_print_restart_warning diff --git a/lgsm/functions/update_jediknight2.sh b/lgsm/functions/update_jediknight2.sh index c2bdca1b6..bddb7ec93 100644 --- a/lgsm/functions/update_jediknight2.sh +++ b/lgsm/functions/update_jediknight2.sh @@ -4,9 +4,7 @@ # Website: https://linuxgsm.com # Description: Handles updating of jk2 servers. -local commandname="UPDATE" -local commandaction="Update" -local function_selfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" +functionselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" fn_update_jk2_dl(){ fn_fetch_file "https://github.com/mvdevs/jk2mv/releases/download/${remotebuild}/jk2mv-v${remotebuild}-dedicated.zip" "" "" "" "${tmpdir}" "jk2mv-${remotebuild}-dedicated.zip" "" "norun" "noforce" "nomd5" @@ -30,6 +28,7 @@ fn_update_jk2_localbuild(){ fn_print_dots "Checking local build: ${remotelocation}" # Uses log file to gather info. # Log is generated and cleared on startup but filled on shutdown. + requirerestart=1 localbuild=$(grep "\"version\"" "${consolelogdir}"/* 2>/dev/null | sed 's/.*://' | awk '{print $1}' | head -n 1) if [ -z "${localbuild}" ]; then fn_print_error "Checking local build: ${remotelocation}" @@ -118,11 +117,14 @@ fn_update_jk2_compare(){ if [ "${status}" == "0" ]; then exitbypass=1 fn_update_jk2_dl - exitbypass=1 - command_start.sh - exitbypass=1 - command_stop.sh - fn_firstcommand_reset + if [ "${requirerestart}" == "1" ]; then + exitbypass=1 + command_start.sh + fn_firstcommand_reset + exitbypass=1 + command_stop.sh + fn_firstcommand_reset + fi # If server started. else fn_print_restart_warning diff --git a/lgsm/functions/update_minecraft.sh b/lgsm/functions/update_minecraft.sh index 34adf43fc..bd8bd3d33 100755 --- a/lgsm/functions/update_minecraft.sh +++ b/lgsm/functions/update_minecraft.sh @@ -103,11 +103,14 @@ fn_update_minecraft_compare(){ if [ "${status}" == "0" ]; then exitbypass=1 fn_update_minecraft_dl - exitbypass=1 - command_start.sh - exitbypass=1 - command_stop.sh - fn_firstcommand_reset + if [ "${requirerestart}" == "1" ]; then + exitbypass=1 + command_start.sh + fn_firstcommand_reset + exitbypass=1 + command_stop.sh + fn_firstcommand_reset + fi # If server started. else fn_print_restart_warning diff --git a/lgsm/functions/update_minecraft_bedrock.sh b/lgsm/functions/update_minecraft_bedrock.sh index 34ada66b3..e12a3cc8e 100644 --- a/lgsm/functions/update_minecraft_bedrock.sh +++ b/lgsm/functions/update_minecraft_bedrock.sh @@ -34,6 +34,7 @@ fn_update_minecraft_localbuild(){ fn_print_dots "Checking local build: ${remotelocation}" # Uses log file to gather info. # Log is generated and cleared on startup but filled on shutdown. + requirerestart=1 localbuild=$(grep Version "${consolelogdir}"/* 2>/dev/null | tail -1 | sed 's/.*Version //') if [ -z "${localbuild}" ]; then fn_print_error "Checking local build: ${remotelocation}" @@ -122,11 +123,14 @@ fn_update_minecraft_compare(){ if [ "${status}" == "0" ]; then exitbypass=1 fn_update_minecraft_dl - exitbypass=1 - command_start.sh - exitbypass=1 - command_stop.sh - fn_firstcommand_reset + if [ "${requirerestart}" == "1" ]; then + exitbypass=1 + command_start.sh + fn_firstcommand_reset + exitbypass=1 + command_stop.sh + fn_firstcommand_reset + fi # If server started. else fn_print_restart_warning diff --git a/lgsm/functions/update_mta.sh b/lgsm/functions/update_mta.sh index 00ffc5a18..e4e803d68 100644 --- a/lgsm/functions/update_mta.sh +++ b/lgsm/functions/update_mta.sh @@ -30,6 +30,7 @@ fn_update_mta_localbuild(){ fn_print_dots "Checking local build: ${remotelocation}" # Uses log file to gather info. # Gives time for log file to generate. + requirerestart=1 if [ ! -f "${serverfiles}/mods/deathmatch/logs/server.log" ]; then fn_print_error "Checking local build: ${remotelocation}" fn_print_error_nl "Checking local build: ${remotelocation}: no log files containing version info" @@ -151,11 +152,14 @@ fn_update_mta_compare(){ if [ "${status}" == "0" ]; then exitbypass=1 fn_update_mta_dl - exitbypass=1 - command_start.sh - exitbypass=1 - command_stop.sh - fn_firstcommand_reset + if [ "${requirerestart}" == "1" ]; then + exitbypass=1 + command_start.sh + fn_firstcommand_reset + exitbypass=1 + command_stop.sh + fn_firstcommand_reset + fi # If server started. else fn_print_restart_warning diff --git a/lgsm/functions/update_mumble.sh b/lgsm/functions/update_mumble.sh index 76ae837f3..5221f0503 100644 --- a/lgsm/functions/update_mumble.sh +++ b/lgsm/functions/update_mumble.sh @@ -87,11 +87,14 @@ fn_update_mumble_compare(){ if [ "${status}" == "0" ]; then exitbypass=1 fn_update_mumble_dl - exitbypass=1 - command_start.sh - exitbypass=1 - command_stop.sh - fn_firstcommand_reset + if [ "${requirerestart}" == "1" ]; then + exitbypass=1 + command_start.sh + fn_firstcommand_reset + exitbypass=1 + command_stop.sh + fn_firstcommand_reset + fi # If server started. else fn_print_restart_warning diff --git a/lgsm/functions/update_ts3.sh b/lgsm/functions/update_ts3.sh index b72979ff4..bea143ff5 100644 --- a/lgsm/functions/update_ts3.sh +++ b/lgsm/functions/update_ts3.sh @@ -34,6 +34,7 @@ fn_update_ts3_localbuild(){ fn_print_dots "Checking local build: ${remotelocation}" # Uses log file to gather info. # Gives time for log file to generate. + requirerestart=1 if [ ! -d "${serverfiles}/logs" ]||[ -z "$(find "${serverfiles}/logs/"* -name 'ts3server*_0.log' 2> /dev/null)" ]; then fn_print_error "Checking local build: ${remotelocation}" fn_print_error_nl "Checking local build: ${remotelocation}: no log files containing version info" @@ -149,11 +150,14 @@ fn_update_ts3_compare(){ if [ "${status}" == "0" ]; then exitbypass=1 fn_update_ts3_dl - exitbypass=1 - command_start.sh - exitbypass=1 - command_stop.sh - fn_firstcommand_reset + if [ "${requirerestart}" == "1" ]; then + exitbypass=1 + command_start.sh + fn_firstcommand_reset + exitbypass=1 + command_stop.sh + fn_firstcommand_reset + fi # If server started. else fn_print_restart_warning diff --git a/lgsm/functions/update_vintagestory.sh b/lgsm/functions/update_vintagestory.sh index 98568f3ca..093f27c8d 100755 --- a/lgsm/functions/update_vintagestory.sh +++ b/lgsm/functions/update_vintagestory.sh @@ -87,11 +87,14 @@ fn_update_vs_compare(){ if [ "${status}" == "0" ]; then exitbypass=1 fn_update_vs_dl - exitbypass=1 - command_start.sh - exitbypass=1 - command_stop.sh - fn_firstcommand_reset + if [ "${requirerestart}" == "1" ]; then + exitbypass=1 + command_start.sh + fn_firstcommand_reset + exitbypass=1 + command_stop.sh + fn_firstcommand_reset + fi # If server started. else fn_print_restart_warning @@ -130,7 +133,6 @@ fn_update_vs_compare(){ # The location where the builds are checked and downloaded. remotelocation="vintagestory.at" apiurl="http://api.${remotelocation}/stable-unstable.json" -localversionfile="${datadir}/vintagestoryversion" if [ "${firstcommandname}" == "INSTALL" ]; then fn_update_vs_remotebuild