From b02f1a436e6cb0d6759ed08edcc3fe98355b50de Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Wed, 17 Mar 2021 16:16:43 +0000 Subject: [PATCH 001/164] spaces --- 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 94e48e672..50109b2f6 100755 --- a/lgsm/functions/check_deps.sh +++ b/lgsm/functions/check_deps.sh @@ -350,7 +350,7 @@ fn_deps_build_debian(){ if [ "${shortname}" != "ts3" ]&&[ "${shortname}" != "mumble" ]&&[ "${shortname}" != "mc" ]&&[ "${shortname}" != "pmc" ]&&[ "${shortname}" != "wmc" ]&&[ "${engine}" != "renderware" ]; then if [ "${arch}" == "x86_64" ]; then # lib32gcc1 is now called lib32gcc-s1 in debian 11 - if { [ "${distroid}" == "debian" ]&&[ "${distroversion}" == "11" ]; }|| { [ "${distroid}" == "ubuntu" ]&&[ "${distroversion}" == "20.10" ]; } ||{ [ "${distroid}" == "pop" ]&&[ "${distroversion}" == "20.10" ]; }; then + if { [ "${distroid}" == "debian" ]&&[ "${distroversion}" == "11" ]; }||{ [ "${distroid}" == "ubuntu" ]&&[ "${distroversion}" == "20.10" ]; }||{ [ "${distroid}" == "pop" ]&&[ "${distroversion}" == "20.10" ]; }; then array_deps_required+=( lib32gcc-s1 lib32stdc++6 ) else array_deps_required+=( lib32gcc1 lib32stdc++6 ) From 0068857b9363fb86e55a0f3d64c54ca93e6032c1 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Fri, 26 Mar 2021 23:54:04 +0000 Subject: [PATCH 002/164] fix(arma3): increase glibc requirement to 2.27 (#3408) --- lgsm/config-default/config-lgsm/arma3server/_default.cfg | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lgsm/config-default/config-lgsm/arma3server/_default.cfg b/lgsm/config-default/config-lgsm/arma3server/_default.cfg index d7da37cf1..7b338811a 100644 --- a/lgsm/config-default/config-lgsm/arma3server/_default.cfg +++ b/lgsm/config-default/config-lgsm/arma3server/_default.cfg @@ -166,7 +166,7 @@ consoleinteract="no" # Do not edit gamename="ARMA 3" engine="realvirtuality" -glibc="2.13" +glibc="2.27" #### Directories #### # Edit with care From 4c9ea848a03ea137c8106431794773db4c73bde5 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Fri, 26 Mar 2021 23:56:50 +0000 Subject: [PATCH 003/164] fix(alert): correct discord avatar from png to jpg (#3410) --- lgsm/functions/alert_discord.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lgsm/functions/alert_discord.sh b/lgsm/functions/alert_discord.sh index b8467eecc..1d047b60b 100755 --- a/lgsm/functions/alert_discord.sh +++ b/lgsm/functions/alert_discord.sh @@ -15,13 +15,13 @@ fi json=$(cat < Date: Sat, 27 Mar 2021 00:05:47 +0000 Subject: [PATCH 004/164] fix(rust): increase rust query delay (#3412) 5 mins is not enough for some servers to load and query to become available --- lgsm/config-default/config-lgsm/rustserver/_default.cfg | 2 +- lgsm/functions/check_deps.sh | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/lgsm/config-default/config-lgsm/rustserver/_default.cfg b/lgsm/config-default/config-lgsm/rustserver/_default.cfg index 424cafabf..5d4808dc7 100644 --- a/lgsm/config-default/config-lgsm/rustserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/rustserver/_default.cfg @@ -108,7 +108,7 @@ logdays="7" ## Monitor | https://docs.linuxgsm.com/commands/monitor # Query delay time -querydelay="5" +querydelay="10" ## ANSI Colors | https://docs.linuxgsm.com/features/ansi-colors ansi="on" diff --git a/lgsm/functions/check_deps.sh b/lgsm/functions/check_deps.sh index 94e48e672..50109b2f6 100755 --- a/lgsm/functions/check_deps.sh +++ b/lgsm/functions/check_deps.sh @@ -350,7 +350,7 @@ fn_deps_build_debian(){ if [ "${shortname}" != "ts3" ]&&[ "${shortname}" != "mumble" ]&&[ "${shortname}" != "mc" ]&&[ "${shortname}" != "pmc" ]&&[ "${shortname}" != "wmc" ]&&[ "${engine}" != "renderware" ]; then if [ "${arch}" == "x86_64" ]; then # lib32gcc1 is now called lib32gcc-s1 in debian 11 - if { [ "${distroid}" == "debian" ]&&[ "${distroversion}" == "11" ]; }|| { [ "${distroid}" == "ubuntu" ]&&[ "${distroversion}" == "20.10" ]; } ||{ [ "${distroid}" == "pop" ]&&[ "${distroversion}" == "20.10" ]; }; then + if { [ "${distroid}" == "debian" ]&&[ "${distroversion}" == "11" ]; }||{ [ "${distroid}" == "ubuntu" ]&&[ "${distroversion}" == "20.10" ]; }||{ [ "${distroid}" == "pop" ]&&[ "${distroversion}" == "20.10" ]; }; then array_deps_required+=( lib32gcc-s1 lib32stdc++6 ) else array_deps_required+=( lib32gcc1 lib32stdc++6 ) From 631c22a1ee63e7c5287f88d0edce4b36b123093d Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Sat, 27 Mar 2021 00:10:08 +0000 Subject: [PATCH 005/164] feat(mcbserver): gamedig is now supported (#3389) Make sure gamedig is updated --- lgsm/config-default/config-lgsm/mcbserver/_default.cfg | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lgsm/config-default/config-lgsm/mcbserver/_default.cfg b/lgsm/config-default/config-lgsm/mcbserver/_default.cfg index abad7f61c..d5ad3b59f 100644 --- a/lgsm/config-default/config-lgsm/mcbserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/mcbserver/_default.cfg @@ -122,7 +122,7 @@ stopmode="5" # 3: gamedig # 4: gsquery # 5: tcp -querymode="4" +querymode="2" querytype="minecraftbe" ## Console type From 5a5a12525bd6cc346da7aceb787642293d774bf0 Mon Sep 17 00:00:00 2001 From: jobhh Date: Sun, 28 Mar 2021 22:44:20 +0200 Subject: [PATCH 006/164] feat(etl): update ET: Legacy to 2.77.1 (#3417) --- 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 bf0233177..b6b9f5240 100755 --- a/lgsm/functions/install_server_files.sh +++ b/lgsm/functions/install_server_files.sh @@ -27,7 +27,7 @@ fn_install_server_files(){ elif [ "${shortname}" == "codwaw" ]; then 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.77-i386-et-260b.tar.xz"; local_filedir="${tmpdir}"; local_filename="etlegacy-v2.77-i386-et-260b.tar.xz"; chmodx="nochmodx" run="norun"; force="noforce"; md5="7f301708f5bb1272c243f9e2d1b735dc" + remote_fileurl="http://linuxgsm.download/WolfensteinEnemyTerritory/etlegacy-v2.77.1-i386-et-260b.tar.xz"; local_filedir="${tmpdir}"; local_filename="etlegacy-v2.77.1-i386-et-260b.tar.xz"; chmodx="nochmodx" run="norun"; force="noforce"; md5="cc307a9232abd3999be499b42d8e4ea8" 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 From 53fdf7c7058d3f990792691340d2adc398301ee5 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Sun, 28 Mar 2021 21:46:36 +0100 Subject: [PATCH 007/164] fix(rust): resolve rust seed not loading to server (#3407) --- lgsm/functions/command_debug.sh | 2 ++ lgsm/functions/command_start.sh | 1 + lgsm/functions/core_legacy.sh | 3 ++- lgsm/functions/info_messages.sh | 19 +++++++++++++++++-- linuxgsm.sh | 3 +-- 5 files changed, 23 insertions(+), 5 deletions(-) diff --git a/lgsm/functions/command_debug.sh b/lgsm/functions/command_debug.sh index 7925e3ff9..aac203ac9 100755 --- a/lgsm/functions/command_debug.sh +++ b/lgsm/functions/command_debug.sh @@ -67,6 +67,8 @@ fi if [ "${serverpassword}" ]; then echo -e "${lightblue}Server password:\t${default}${serverpassword}" fi + +fn_reload_startparameters echo -e "${lightblue}Start parameters:${default}" if [ "${engine}" == "source" ]||[ "${engine}" == "goldsrc" ]; then echo -e "${executable} ${startparameters} -debug" diff --git a/lgsm/functions/command_start.sh b/lgsm/functions/command_start.sh index e06a0e3e5..caa933320 100755 --- a/lgsm/functions/command_start.sh +++ b/lgsm/functions/command_start.sh @@ -71,6 +71,7 @@ fn_start_tmux(){ date '+%s' > "${lockdir}/${selfname}.lock" echo "${version}" >> "${lockdir}/${selfname}.lock" echo "${port}" >> "${lockdir}/${selfname}.lock" + fn_reload_startparameters cd "${executabledir}" || exit tmux new-session -d -x "${sessionwidth}" -y "${sessionheight}" -s "${sessionname}" "${preexecutable} ${executable} ${startparameters}" 2> "${lgsmlogdir}/.${selfname}-tmux-error.tmp" diff --git a/lgsm/functions/core_legacy.sh b/lgsm/functions/core_legacy.sh index e28cb7457..811acfbba 100755 --- a/lgsm/functions/core_legacy.sh +++ b/lgsm/functions/core_legacy.sh @@ -79,5 +79,6 @@ if [ -z "${wsstartmap}" ]; then fi fn_parms(){ -parms="${startparameters}" + fn_reload_startparameters + parms="${startparameters}" } diff --git a/lgsm/functions/info_messages.sh b/lgsm/functions/info_messages.sh index e42236aa8..7ff432079 100755 --- a/lgsm/functions/info_messages.sh +++ b/lgsm/functions/info_messages.sh @@ -347,7 +347,7 @@ fn_info_message_gameserver(){ fi if [ -n "${defaultscenario}" ]; then - # Current scenario + # Current scenario (Insurgency: Sandstorm) if [ -n "${gdgamemode}" ]; then echo -e "${lightblue}Current scenario:\t${default}${gdgamemode}" fi @@ -425,7 +425,22 @@ fn_info_message_gameserver(){ # Save interval (Rust) if [ -n "${saveinterval}" ]; then - echo -e "${lightblue}ASE:\t${default}${saveinterval} s" + echo -e "${lightblue}Save interval:\t${default}${saveinterval}s" + fi + + # Seed (Rust) + if [ -n "${seed}" ]; then + echo -e "${lightblue}Seed:\t${default}${seed}" + fi + + # Salt (Rust) + if [ -n "${salt}" ]; then + echo -e "${lightblue}Salt:\t${default}${salt}" + fi + + # World Size (Rust) + if [ -n "${worldsize}" ]; then + echo -e "${lightblue}World size:\t${default}${worldsize}m" fi # Random map rotation mode (Squad and Post Scriptum) diff --git a/linuxgsm.sh b/linuxgsm.sh index 08bb0975f..ea29b72a6 100755 --- a/linuxgsm.sh +++ b/linuxgsm.sh @@ -478,7 +478,7 @@ else elif grep -qE "^[[:blank:]]*preexecutable=" "${configdirserver}/_default.cfg"; then eval preexecutable="$(sed -nr 's/^ *preexecutable=(.*)$/\1/p' "${configdirserver}/_default.cfg")" fi - + # For legacy configs that still use parms= 15.03.21 if grep -qE "^[[:blank:]]*parms=" "${configdirserver}/secrets-${selfname}.cfg"; then eval parms="$(sed -nr 's/^ *parms=(.*)$/\1/p' "${configdirserver}/secrets-${selfname}.cfg")" @@ -497,7 +497,6 @@ else fi } - fn_reload_startparameters # 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" From 669e2c9227b3a58051ee715469448dfd2fc39b90 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Sun, 28 Mar 2021 22:25:02 +0100 Subject: [PATCH 008/164] Release v21.2.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 89b0ef0fa..ec1a98531 100755 --- a/lgsm/functions/core_functions.sh +++ b/lgsm/functions/core_functions.sh @@ -8,7 +8,7 @@ functionselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" -modulesversion="v21.2.2" +modulesversion="v21.2.3" # Core diff --git a/linuxgsm.sh b/linuxgsm.sh index ea29b72a6..c4df71037 100755 --- a/linuxgsm.sh +++ b/linuxgsm.sh @@ -20,7 +20,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="v21.2.2" +version="v21.2.3" shortname="core" gameservername="core" commandname="CORE" diff --git a/tests/tests_fctrserver.sh b/tests/tests_fctrserver.sh index c4a716aa9..f31d4ac96 100644 --- a/tests/tests_fctrserver.sh +++ b/tests/tests_fctrserver.sh @@ -20,7 +20,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="v21.2.2" +version="v21.2.3" shortname="fctr" gameservername="fctrserver" commandname="CORE" diff --git a/tests/tests_jc2server.sh b/tests/tests_jc2server.sh index ff1eec547..7203ac0d2 100644 --- a/tests/tests_jc2server.sh +++ b/tests/tests_jc2server.sh @@ -20,7 +20,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="v21.2.2" +version="v21.2.3" shortname="jc2" gameservername="jc2server" commandname="CORE" diff --git a/tests/tests_mcserver.sh b/tests/tests_mcserver.sh index ce24f3df0..420732839 100644 --- a/tests/tests_mcserver.sh +++ b/tests/tests_mcserver.sh @@ -20,7 +20,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="v21.2.2" +version="v21.2.3" shortname="mc" gameservername="mcserver" commandname="CORE" diff --git a/tests/tests_ts3server.sh b/tests/tests_ts3server.sh index d867b41ac..afc68811a 100644 --- a/tests/tests_ts3server.sh +++ b/tests/tests_ts3server.sh @@ -20,7 +20,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="v21.2.2" +version="v21.2.3" shortname="ts3" gameservername="ts3server" commandname="CORE" From 079ec1e8d4d2e96f590620d9e26e853af52bf616 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Tue, 6 Apr 2021 10:54:44 +0100 Subject: [PATCH 009/164] feat(wipe): resolve random seed and simplify wipe (#3420) merge merge merge merge merge merge MERGE merge merge merge merge message about Rust+ data merge merge merge merge merge mertge merge merge merge merge merge merge --- .../config-lgsm/rustserver/_default.cfg | 8 +- lgsm/data/bo_header.jpg | Bin 0 -> 19790 bytes lgsm/data/rust_header.jpg | Bin 0 -> 117845 bytes lgsm/functions/command_wipe.sh | 267 +++++++----------- lgsm/functions/core_getopt.sh | 6 +- lgsm/functions/core_messages.sh | 22 ++ lgsm/functions/fix_rust.sh | 10 + lgsm/functions/info_messages.sh | 6 + lgsm/functions/info_parms.sh | 15 +- lgsm/functions/install_modules.sh | 20 -- lgsm/functions/query_gamedig.sh | 8 +- lgsm/functions/update_papermc.sh | 2 +- 12 files changed, 169 insertions(+), 195 deletions(-) create mode 100644 lgsm/data/bo_header.jpg create mode 100644 lgsm/data/rust_header.jpg delete mode 100755 lgsm/functions/install_modules.sh diff --git a/lgsm/config-default/config-lgsm/rustserver/_default.cfg b/lgsm/config-default/config-lgsm/rustserver/_default.cfg index 5d4808dc7..a29d76374 100644 --- a/lgsm/config-default/config-lgsm/rustserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/rustserver/_default.cfg @@ -16,16 +16,18 @@ appport=28082 rconpassword="CHANGE_ME" rconweb="1" # Value is: 1 for the Facepunch web panel, Rustadmin desktop and Rustadmin Online; 0 for RCON tools like Rusty. servername="Rust" -gamemode="vanilla" # values: vanilla, softcore ( Doc: https://wiki.facepunch.com/rust/server-gamemodes ) -maxplayers="50" +gamemode="vanilla" # Values: vanilla, softcore ( Doc: https://wiki.facepunch.com/rust/server-gamemodes ) +serverlevel="Procedural Map" # Values: Procedural Map, Barren, HapisIsland, SavasIsland +customlevelurl="" # Custom level url seed="" # range: 1-2147483647, used to reproduce a procedural map. salt="" # range: unknown, used to recover a known setting from an existing map. +maxplayers="50" 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 Parameters | https://docs.linuxgsm.com/configuration/start-parameters#additional-parameters -startparameters="-batchmode +app.listenip ${ip} +app.port ${appport} +server.ip ${ip} +server.port ${port} +server.tickrate ${tickrate} +server.hostname \"${servername}\" +server.identity \"${selfname}\" +server.gamemode ${gamemode} +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" +startparameters="-batchmode +app.listenip ${ip} +app.port ${appport} +server.ip ${ip} +server.port ${port} +server.tickrate ${tickrate} +server.hostname \"${servername}\" +server.identity \"${selfname}\" +server.gamemode ${gamemode} +server.level \"${serverlevel}\" +server.seed ${seed} +server.salt ${salt} +server.levelurl ${customlevelurl} +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/data/bo_header.jpg b/lgsm/data/bo_header.jpg new file mode 100644 index 0000000000000000000000000000000000000000..d63ee5c3da594ffd9b7d71080bccd535ba662795 GIT binary patch literal 19790 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 literal 0 HcmV?d00001 diff --git a/lgsm/functions/command_wipe.sh b/lgsm/functions/command_wipe.sh index 63cb830fb..d2d05defc 100755 --- a/lgsm/functions/command_wipe.sh +++ b/lgsm/functions/command_wipe.sh @@ -12,9 +12,9 @@ fn_firstcommand_set # Provides an exit code upon error. fn_wipe_exit_code(){ - ((exitcode=$?)) + exitcode=$? if [ "${exitcode}" != 0 ]; then - fn_script_log_fatal "${currentaction}" + fn_print_fail_eol_nl core_exit.sh else fn_print_ok_eol_nl @@ -22,209 +22,160 @@ fn_wipe_exit_code(){ } # Removes files to wipe server. -fn_wipe_server_files(){ - fn_print_start_nl "Wiping server" - fn_script_log_info "Wiping server" - # Wipe procedural map. - 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" - 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 Barren map. - 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" - 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 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..." - 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 - 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 [ -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" - 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 [ -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" - 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 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 - echo -en "removing blueprints player.blueprints.*.db file(s)..." +fn_wipe_files(){ + fn_print_start_nl "${wipetype}" + fn_script_log_info "${wipetype}" + + # Remove Map files + if [ -n "${serverwipe}" ]||[ -n "${mapwipe}" ]; then + if [ -n "$(find "${serveridentitydir}" -type f -name "*.map")" ]; then + echo -en "removing .map file(s)..." + fn_script_log_info "removing *.map file(s)" fn_sleep_time - fn_script_log_info "Removing blueprint file(s): ${serveridentitydir}/player.blueprints.*.db" - find "${serveridentitydir:?}" -type f -name "player.blueprints.*.db" -delete | tee -a "${lgsmlog}" + find "${serveridentitydir:?}" -type f -name "*.map" -printf "%f\n" >> "${lgsmlog}" + find "${serveridentitydir:?}" -type f -name "*.map" -delete | tee -a "${lgsmlog}" fn_wipe_exit_code + else + echo -e "no .map file(s) to remove" + fn_sleep_time + fn_script_log_pass "no .map file(s) to remove" + fi + fi + # Remove Save files. + if [ -n "${serverwipe}" ]||[ -n "${mapwipe}" ]; then + if [ -n "$(find "${serveridentitydir}" -type f -name "*.sav*")" ]; then + echo -en "removing .sav file(s)..." + fn_script_log_info "removing .sav file(s)" fn_sleep_time + find "${serveridentitydir:?}" -type f -name "*.sav*" -printf "%f\n" >> "${lgsmlog}" + find "${serveridentitydir:?}" -type f -name "*.sav*" -delete + fn_wipe_exit_code else - echo -e "no blueprint file to remove" + echo -e "no .sav file(s) to remove" + fn_script_log_pass "no .sav file(s) to remove" fn_sleep_time - fn_script_log_pass "No blueprint file to remove" fi - elif [ -n "$(find "${serveridentitydir}" -type f -name "player.blueprints.*.db")" ]; then - 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" fi - # Wipe some logs that might be there. - 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 - fn_wipe_exit_code - fn_sleep_time - # We do not print additional information if there are no logs to remove. + # Remove db files for full wipe. + # Excluding player.tokens.db for Rust+. + if [ -n "${serverwipe}" ]; then + if [ -n "$(find "${serveridentitydir}" -type f ! -name 'player.tokens.db' -name "*.db")" ]; then + echo -en "removing .db file(s)..." + fn_script_log_info "removing .db file(s)" + fn_sleep_time + find "${serveridentitydir:?}" -type f ! -name 'player.tokens.db' -name "*.db" -printf "%f\n" >> "${lgsmlog}" + find "${serveridentitydir:?}" -type f ! -name 'player.tokens.db' -name "*.db" -delete + fn_wipe_exit_code + else + echo -e "no .db file(s) to remove" + fn_sleep_time + fn_script_log_pass "no .db file(s) to remove" + fi fi } -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" +fn_map_wipe_warning(){ + fn_print_warn "Map wipe will reset the map data and keep blueprint data" + fn_script_log_warn "Map wipe will reset the map data and keep blueprint data" totalseconds=3 for seconds in {3..1}; do - fn_print_warn "this game server will be stopped during wipe: ${totalseconds}" + fn_print_warn "Map wipe will reset the map data and keep blueprint data: ${totalseconds}" totalseconds=$((totalseconds - 1)) sleep 1 if [ "${seconds}" == "0" ]; then break fi done - fn_print_warn_nl "this game server will be stopped during wipe" + fn_print_warn_nl "Map wipe will reset the map data and keep blueprint data" } -fn_wipe_warning(){ - fn_print_warn "wipe is about to start" - fn_script_log_warn "wipe is about to start" +fn_full_wipe_warning(){ + fn_print_warn "Server wipe will reset the map data and remove blueprint data" + fn_script_log_warn "Server wipe will reset the map data and remove blueprint data" totalseconds=3 for seconds in {3..1}; do - fn_print_warn "wipe is about to start: ${totalseconds}" + fn_print_warn "Server wipe will reset the map data and remove blueprint data: ${totalseconds}" totalseconds=$((totalseconds - 1)) sleep 1 if [ "${seconds}" == "0" ]; then break fi done - fn_print_warn "wipe is about to start" + fn_print_warn_nl "Server wipe will reset the map data and remove blueprint data" } -# Will change the seed everytime the wipe command is run if the seed in config is not set. +# Will change the seed if the seed is not defined by the user. fn_wipe_random_seed(){ - shuf -i 1-2147483647 -n 1 > "${datadir}/${selfname}-seed.txt" + if [ -f "${datadir}/${selfname}-seed.txt" ]&&[ -n "${randomseed}" ]; then + shuf -i 1-2147483647 -n 1 > "${datadir}/${selfname}-seed.txt" + seed=$(cat "${datadir}/${selfname}-seed.txt") + randomseed=1 + echo -en "generating new random seed (${cyan}${seed}${default})..." + fn_script_log_pass "generating new random seed (${cyan}${seed}${default})" + fn_sleep_time + fn_print_ok_eol_nl + fi +} + +# A summary of what wipe is going to do. +fn_wipe_details(){ + fn_print_information_nl "Wipe does not remove Rust+ data." + echo -en "* Wipe map data: " + if [ -n "${serverwipe}" ]||[ -n "${mapwipe}" ]; then + fn_print_yes_eol_nl + else + fn_print_no_eol_nl + fi + + echo -en "* Wipe blueprint data: " + if [ -n "${serverwipe}" ]; then + fn_print_yes_eol_nl + else + fn_print_no_eol_nl + fi + + echo -en "* Change Procedural Map seed: " + if [ -n "${randomseed}" ]; then + fn_print_yes_eol_nl + else + fn_print_no_eol_nl + fi } fn_print_dots "" check.sh +fix_rust.sh # Check if there is something to wipe. -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 +if [ -n "$(find "${serveridentitydir}" -type f -name "*.map")" ]||[ -n "$(find "${serveridentitydir}" -type f -name "*.sav*")" ]&&[ -n "$(find "${serveridentitydir}" -type f ! -name 'player.tokens.db' -name "*.db")" ]; then + if [ -n "${serverwipe}" ]; then + wipetype="Full wipe" + fn_full_wipe_warning + fn_wipe_details + elif [ -n "${mapwipe}" ]; then + wipetype="Map wipe" + fn_map_wipe_warning + fn_wipe_details + fi check_status.sh if [ "${status}" != "0" ]; then - fn_stop_warning + fn_print_restart_warning exitbypass=1 command_stop.sh fn_firstcommand_reset - fn_wipe_server_files + fn_wipe_files + fn_wipe_random_seed + fn_print_complete_nl "${wipetype}" + fn_script_log_pass "${wipetype}" exitbypass=1 command_start.sh fn_firstcommand_reset else - fn_wipe_server_files + fn_wipe_files + fn_wipe_random_seed + fn_print_complete_nl "${wipetype}" + fn_script_log_pass "${wipetype}" fi - fn_print_complete_nl "Wiping ${selfname}" - fn_script_log_pass "Wiping ${selfname}" - fn_wipe_random_seed else fn_print_ok_nl "Wipe not required" fn_script_log_pass "Wipe not required" diff --git a/lgsm/functions/core_getopt.sh b/lgsm/functions/core_getopt.sh index 904bad37d..ea3c84f6d 100755 --- a/lgsm/functions/core_getopt.sh +++ b/lgsm/functions/core_getopt.sh @@ -40,8 +40,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=( "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_fullwipe=( "fw;full-wipe;wa;wipeall" "serverwipe=1; command_wipe.sh" "Reset the map and remove blueprint data." ) +cmd_mapwipe=( "mw;map-wipe;w;wipe;wi" "mapwipe=1; command_wipe.sh" "Reset the map and keep blueprint data." ) cmd_map_compressor_u99=( "mc;map-compressor" "compress_ut99_maps.sh" "Compresses all ${gamename} server maps." ) cmd_map_compressor_u2=( "mc;map-compressor" "compress_unreal2_maps.sh" "Compresses all ${gamename} server maps." ) cmd_install_cdkey=( "cd;server-cd-key" "install_ut2k4_key.sh" "Add your server cd key." ) @@ -105,7 +105,7 @@ fi # Unreal exclusive. if [ "${shortname}" == "rust" ]; then - currentopt+=( "${cmd_wipe[@]}" "${cmd_full_wipe[@]}" ) + currentopt+=( "${cmd_fullwipe[@]}" "${cmd_mapwipe[@]}" ) fi if [ "${engine}" == "unreal2" ]; then if [ "${shortname}" == "ut2k4" ]; then diff --git a/lgsm/functions/core_messages.sh b/lgsm/functions/core_messages.sh index 8dfca6661..463f833c2 100755 --- a/lgsm/functions/core_messages.sh +++ b/lgsm/functions/core_messages.sh @@ -375,6 +375,28 @@ fn_prompt_message(){ # On-Screen End of Line ################################## +# YES +fn_print_yes_eol(){ + echo -en "${cyan}YES${default}" + fn_sleep_time +} + +fn_print_yes_eol_nl(){ + echo -e "${cyan}YES${default}" + fn_sleep_time +} + +# NO +fn_print_no_eol(){ + echo -en "${red}NO${default}" + fn_sleep_time +} + +fn_print_no_eol_nl(){ + echo -e "${red}NO${default}" + fn_sleep_time +} + # OK fn_print_ok_eol(){ echo -en "${green}OK${default}" diff --git a/lgsm/functions/fix_rust.sh b/lgsm/functions/fix_rust.sh index 1e62898df..4488377a3 100755 --- a/lgsm/functions/fix_rust.sh +++ b/lgsm/functions/fix_rust.sh @@ -9,3 +9,13 @@ functionselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" # Fixes: [Raknet] Server Shutting Down (Shutting Down). export LD_LIBRARY_PATH="$LD_LIBRARY_PATH:${serverfiles}:${serverfiles}/RustDedicated_Data/Plugins/x86_64" + +# Part of random seed feature. +# If seed is not defined by user generate a seed file. +if [ -z "${seed}" ]; then + if [ ! -f "${datadir}/${selfname}-seed.txt" ]; then + shuf -i 1-2147483647 -n 1 > "${datadir}/${selfname}-seed.txt" + fi + seed="$(cat "${datadir}/${selfname}-seed.txt")" + randomseed=1 +fi diff --git a/lgsm/functions/info_messages.sh b/lgsm/functions/info_messages.sh index 7ff432079..391964c2a 100755 --- a/lgsm/functions/info_messages.sh +++ b/lgsm/functions/info_messages.sh @@ -262,6 +262,11 @@ fn_info_message_gameserver(){ echo -e "${lightblue}Beta Password:\t${default}${betapassword}" fi + # Server Version + if [ -n "${gdversion}" ]; then + echo -e "${lightblue}Server Version:\t${default}${gdversion}" + fi + # Server ip echo -e "${lightblue}Server IP:\t${default}${ip}:${port}" @@ -1141,6 +1146,7 @@ fn_info_message_rust(){ echo -e "${lightblue}DESCRIPTION\tDIRECTION\tPORT\tPROTOCOL${default}" echo -e "> Game/Query\tINBOUND\t${port}\tudp" echo -e "> RCON\tINBOUND\t${rconport}\ttcp" + echo -e "> App\tINBOUND\t${appport}\ttcp" } | column -s $'\t' -t } diff --git a/lgsm/functions/info_parms.sh b/lgsm/functions/info_parms.sh index f2496ce5d..47148f4b3 100755 --- a/lgsm/functions/info_parms.sh +++ b/lgsm/functions/info_parms.sh @@ -135,19 +135,16 @@ fn_info_parms_rust(){ servername=${servername:-"NOT SET"} port=${port:-"0"} queryport=${port:-"0"} + appport=${appport:-"0"} rconport=${rconport:-"0"} + gamemode=${gamemode:-"NOT SET"} + maxplayers=${maxplayers:-"0"} rconpassword=${rconpassword:-"NOT SET"} rconweb=${rconweb:-"NOT SET"} - maxplayers=${maxplayers:-"0"} - saveinterval=${saveinterval:-"0"} tickrate=${tickrate:-"0"} - # Part of random seed feature. - if [ -z "${seed}" ]; then - if [ ! -f "${datadir}/${selfname}-seed.txt" ]; then - shuf -i 1-2147483647 -n 1 > "${datadir}/${selfname}-seed.txt" - fi - seed=$(cat "${datadir}/${selfname}-seed.txt") - fi + saveinterval=${saveinterval:-"0"} + serverlevel=${serverlevel:-"NOT SET"} + worldsize=${worldsize:-"0"} } fn_info_parms_samp(){ diff --git a/lgsm/functions/install_modules.sh b/lgsm/functions/install_modules.sh deleted file mode 100755 index af1050a94..000000000 --- a/lgsm/functions/install_modules.sh +++ /dev/null @@ -1,20 +0,0 @@ -#!/bin/bash -# LinuxGSM install_modules.sh module -# Author: Daniel Gibbs -# Contributors: http://linuxgsm.com/contrib -# Website: https://linuxgsm.com -# Description: Downloads all modules on install. - -functionselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" - -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" "nohash" -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 -fn_firstcommand_reset diff --git a/lgsm/functions/query_gamedig.sh b/lgsm/functions/query_gamedig.sh index 4d479a4c0..123d8c86c 100755 --- 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)" ]; # maxplayers. gdmaxplayers=$(echo "${gamedigraw}" | jq -re '.maxplayers') if [ "${gdmaxplayers}" == "null" ]; then - unset maxplayers + unset gdmaxplayers elif [ "${gdmaxplayers}" == "[]" ]; then gdmaxplayers=0 fi @@ -68,5 +68,11 @@ if [ "$(command -v gamedig 2>/dev/null)" ]&&[ "$(command -v jq 2>/dev/null)" ]; if [ "${gdbots}" == "null" ]||[ "${gdbots}" == "0" ]; then unset gdbots fi + + # server version. + gdversion=$(echo "${gamedigraw}" | jq -re '.raw.version') + if [ "${gdversion}" == "null" ]||[ "${gdversion}" == "0" ]; then + unset gdversion + fi fi fi diff --git a/lgsm/functions/update_papermc.sh b/lgsm/functions/update_papermc.sh index ae512c0ba..2e669d93d 100644 --- a/lgsm/functions/update_papermc.sh +++ b/lgsm/functions/update_papermc.sh @@ -74,7 +74,7 @@ fn_update_papermc_remotebuild(){ fn_update_papermc_compare(){ fn_print_dots "Checking for update: ${remotelocation}" sleep 0.5 - if [ "${localbuild}" != "${remotebuild}" ]||[ "${forceupdate}" == "1" ]; then + if [ "${localbuild}" != "${remotebuild}" ]||[ "${forceupdate}" == "1" ]; then fn_print_ok_nl "Checking for update: ${remotelocation}" echo -en "\n" echo -e "Update available for version ${paperversion}" From 8ea23f49f15dcb2a1e58d2c590db142746cbf3e6 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Tue, 6 Apr 2021 11:49:50 +0100 Subject: [PATCH 010/164] remove +server.levelurl from parameters --- lgsm/config-default/config-lgsm/rustserver/_default.cfg | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lgsm/config-default/config-lgsm/rustserver/_default.cfg b/lgsm/config-default/config-lgsm/rustserver/_default.cfg index a29d76374..c956b492c 100644 --- a/lgsm/config-default/config-lgsm/rustserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/rustserver/_default.cfg @@ -18,7 +18,7 @@ rconweb="1" # Value is: 1 for the Facepunch web panel, Rustadmin desktop and Rus servername="Rust" gamemode="vanilla" # Values: vanilla, softcore ( Doc: https://wiki.facepunch.com/rust/server-gamemodes ) serverlevel="Procedural Map" # Values: Procedural Map, Barren, HapisIsland, SavasIsland -customlevelurl="" # Custom level url +customlevelurl="" # Custom level url. +server.levelurl \"${customlevelurl}\" seed="" # range: 1-2147483647, used to reproduce a procedural map. salt="" # range: unknown, used to recover a known setting from an existing map. maxplayers="50" @@ -27,7 +27,7 @@ saveinterval="300" # Auto-save in seconds. tickrate="30" # default: 30, range: 15-100. ## Server Parameters | https://docs.linuxgsm.com/configuration/start-parameters#additional-parameters -startparameters="-batchmode +app.listenip ${ip} +app.port ${appport} +server.ip ${ip} +server.port ${port} +server.tickrate ${tickrate} +server.hostname \"${servername}\" +server.identity \"${selfname}\" +server.gamemode ${gamemode} +server.level \"${serverlevel}\" +server.seed ${seed} +server.salt ${salt} +server.levelurl ${customlevelurl} +server.maxplayers ${maxplayers} +server.worldsize ${worldsize} +server.saveinterval ${saveinterval} +rcon.web ${rconweb} +rcon.ip ${ip} +rcon.port ${rconport} +rcon.password \"${rconpassword}\" -logfile" +startparameters="-batchmode +app.listenip ${ip} +app.port ${appport} +server.ip ${ip} +server.port ${port} +server.tickrate ${tickrate} +server.hostname \"${servername}\" +server.identity \"${selfname}\" +server.gamemode ${gamemode} +server.level \"${serverlevel}\" +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 #### From ecc455c4fc83d68cfde4324010206d38c5086de3 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Tue, 6 Apr 2021 23:25:58 +0100 Subject: [PATCH 011/164] Update labeler.yml --- .github/workflows/labeler.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/labeler.yml b/.github/workflows/labeler.yml index 248598e23..6b0c0ea06 100644 --- a/.github/workflows/labeler.yml +++ b/.github/workflows/labeler.yml @@ -12,5 +12,5 @@ jobs: - uses: Naturalclar/issue-action@v2.0.2 with: title-or-body: "both" - parameters: '[ {"keywords": ["backup"], "labels": ["command: backup"]}, {"keywords": ["console"], "labels": ["command: console"]}, {"keywords": ["command: debug"], "labels": ["command: debug"]}, {"keywords": ["command: details"], "labels": ["command: details"]}, {"keywords": ["fast-dl"], "labels": ["command: fast-dl"]}, {"keywords": ["command: install"], "labels": ["command: install"]}, {"keywords": ["command: mods"], "labels": ["command: mods"]}, {"keywords": ["monitor"], "labels": ["command: monitor"]}, {"keywords": ["command: start"], "labels": ["command: start"]}, {"keywords": ["command: stop"], "labels": ["command: stop"]}, {"keywords": ["command: update-lgsm"], "labels": ["command: update-lgsm"]}, {"keywords": ["update"], "labels": ["command: update"]}, {"keywords": ["validate"], "labels": ["command: validate"]}, {"keywords": ["wipe"], "labels": ["command: wipe"]}, {"keywords": ["CentOS"], "labels": ["distro: CentOS"]}, {"keywords": ["Debian"], "labels": ["distro: Debian"]}, {"keywords": ["Fedora"], "labels": ["distro: Fedora"]}, {"keywords": ["Ubuntu"], "labels": ["distro: Ubuntu"]} ]' + parameters: '[ {"keywords": ["backup"], "labels": ["command: backup"]}, {"keywords": ["console"], "labels": ["command: console"]}, {"keywords": ["command: debug"], "labels": ["command: debug"]}, {"keywords": ["command: details"], "labels": ["command: details"]}, {"keywords": ["fast-dl"], "labels": ["command: fast-dl"]}, {"keywords": ["command: install"], "labels": ["command: install"]}, {"keywords": ["command: mods"], "labels": ["command: mods"]}, {"keywords": ["monitor"], "labels": ["command: monitor"]}, {"keywords": ["command: start"], "labels": ["command: start"]}, {"keywords": ["command: stop"], "labels": ["command: stop"]}, {"keywords": ["command: update-lgsm"], "labels": ["command: update-lgsm"]}, {"keywords": ["update"], "labels": ["command: update"]}, {"keywords": ["validate"], "labels": ["command: validate"]}, {"keywords": ["wipe"], "labels": ["command: wipe"]}, {"keywords": ["CentOS"], "labels": ["distro: CentOS"]}, {"keywords": ["Debian"], "labels": ["distro: Debian"]}, {"keywords": ["Fedora"], "labels": ["distro: Fedora"]}, {"keywords": ["Ubuntu"], "labels": ["distro: Ubuntu"]}, {"keywords": ["alert"], "labels": ["info: alerts"]}, {"keywords": ["dependency"], "labels": ["info: dependency"]}, {"keywords": ["docker"], "labels": ["info: docker"]}, {"keywords": ["steamcmd"], "labels": ["info: steamcmd"]}, {"keywords": ["systemd"], "labels": ["info: systemd"]}, {"keywords": ["tmux"], "labels": ["info: tmux"]}, {"keywords": ["bug"], "labels": ["type: bug"]}, {"keywords": ["feature"], "labels": ["type: feature"]}, {"keywords": ["refactor"], "labels": ["type: refactor"]}, {"keywords": ["Ark"], "labels": ["game: Ark: Survival Evolved"]}, {"keywords": ["Arma 3"], "labels": ["game: Arma 3"]}, {"keywords": ["Counter-Strike: Global Offensive"], "labels": ["game: Counter-Strike: Global Offensive"]}, {"keywords": ["Minecraft"], "labels": ["game: Minecraft"]}, {"keywords": ["Rust"], "labels": ["game: Rust"]}, {"keywords": ["Valhiem"], "labels": ["game: Valheim"]}, {"keywords": ["7 Days to Die"], "labels": ["game: 7 Days to Die"]}]' github-token: "${{ secrets.GITHUB_TOKEN }}" From cd44a0e8497c6af410fab809a11c819cdc63138b Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Tue, 6 Apr 2021 23:35:43 +0100 Subject: [PATCH 012/164] Update labeler.yml --- .github/workflows/labeler.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/labeler.yml b/.github/workflows/labeler.yml index 6b0c0ea06..2ed4ffe37 100644 --- a/.github/workflows/labeler.yml +++ b/.github/workflows/labeler.yml @@ -1,9 +1,9 @@ name: "Set Issue Label and Assignee" on: issues: - types: [opened] + types: [opened, edited] pull_request: - typed: [opened] + types: [opened, edited] jobs: test: From f07a7aba01c98aa082166ad8667f3a4ccb9e0fa2 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Tue, 6 Apr 2021 23:38:54 +0100 Subject: [PATCH 013/164] Update labeler.yml --- .github/workflows/labeler.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/labeler.yml b/.github/workflows/labeler.yml index 2ed4ffe37..f6747e29e 100644 --- a/.github/workflows/labeler.yml +++ b/.github/workflows/labeler.yml @@ -12,5 +12,5 @@ jobs: - uses: Naturalclar/issue-action@v2.0.2 with: title-or-body: "both" - parameters: '[ {"keywords": ["backup"], "labels": ["command: backup"]}, {"keywords": ["console"], "labels": ["command: console"]}, {"keywords": ["command: debug"], "labels": ["command: debug"]}, {"keywords": ["command: details"], "labels": ["command: details"]}, {"keywords": ["fast-dl"], "labels": ["command: fast-dl"]}, {"keywords": ["command: install"], "labels": ["command: install"]}, {"keywords": ["command: mods"], "labels": ["command: mods"]}, {"keywords": ["monitor"], "labels": ["command: monitor"]}, {"keywords": ["command: start"], "labels": ["command: start"]}, {"keywords": ["command: stop"], "labels": ["command: stop"]}, {"keywords": ["command: update-lgsm"], "labels": ["command: update-lgsm"]}, {"keywords": ["update"], "labels": ["command: update"]}, {"keywords": ["validate"], "labels": ["command: validate"]}, {"keywords": ["wipe"], "labels": ["command: wipe"]}, {"keywords": ["CentOS"], "labels": ["distro: CentOS"]}, {"keywords": ["Debian"], "labels": ["distro: Debian"]}, {"keywords": ["Fedora"], "labels": ["distro: Fedora"]}, {"keywords": ["Ubuntu"], "labels": ["distro: Ubuntu"]}, {"keywords": ["alert"], "labels": ["info: alerts"]}, {"keywords": ["dependency"], "labels": ["info: dependency"]}, {"keywords": ["docker"], "labels": ["info: docker"]}, {"keywords": ["steamcmd"], "labels": ["info: steamcmd"]}, {"keywords": ["systemd"], "labels": ["info: systemd"]}, {"keywords": ["tmux"], "labels": ["info: tmux"]}, {"keywords": ["bug"], "labels": ["type: bug"]}, {"keywords": ["feature"], "labels": ["type: feature"]}, {"keywords": ["refactor"], "labels": ["type: refactor"]}, {"keywords": ["Ark"], "labels": ["game: Ark: Survival Evolved"]}, {"keywords": ["Arma 3"], "labels": ["game: Arma 3"]}, {"keywords": ["Counter-Strike: Global Offensive"], "labels": ["game: Counter-Strike: Global Offensive"]}, {"keywords": ["Minecraft"], "labels": ["game: Minecraft"]}, {"keywords": ["Rust"], "labels": ["game: Rust"]}, {"keywords": ["Valhiem"], "labels": ["game: Valheim"]}, {"keywords": ["7 Days to Die"], "labels": ["game: 7 Days to Die"]}]' + parameters: '[ {"keywords": ["Server Request"], "labels": ["type: game server request"]}, {"keywords": ["backup"], "labels": ["command: backup"]}, {"keywords": ["console"], "labels": ["command: console"]}, {"keywords": ["command: debug"], "labels": ["command: debug"]}, {"keywords": ["command: details"], "labels": ["command: details"]}, {"keywords": ["fast-dl"], "labels": ["command: fast-dl"]}, {"keywords": ["command: install"], "labels": ["command: install"]}, {"keywords": ["command: mods"], "labels": ["command: mods"]}, {"keywords": ["monitor"], "labels": ["command: monitor"]}, {"keywords": ["command: start"], "labels": ["command: start"]}, {"keywords": ["command: stop"], "labels": ["command: stop"]}, {"keywords": ["command: update-lgsm"], "labels": ["command: update-lgsm"]}, {"keywords": ["update"], "labels": ["command: update"]}, {"keywords": ["validate"], "labels": ["command: validate"]}, {"keywords": ["wipe"], "labels": ["command: wipe"]}, {"keywords": ["CentOS"], "labels": ["distro: CentOS"]}, {"keywords": ["Debian"], "labels": ["distro: Debian"]}, {"keywords": ["Fedora"], "labels": ["distro: Fedora"]}, {"keywords": ["Ubuntu"], "labels": ["distro: Ubuntu"]}, {"keywords": ["alert"], "labels": ["info: alerts"]}, {"keywords": ["dependency"], "labels": ["info: dependency"]}, {"keywords": ["docker"], "labels": ["info: docker"]}, {"keywords": ["steamcmd"], "labels": ["info: steamcmd"]}, {"keywords": ["systemd"], "labels": ["info: systemd"]}, {"keywords": ["tmux"], "labels": ["info: tmux"]}, {"keywords": ["bug"], "labels": ["type: bug"]}, {"keywords": ["feature"], "labels": ["type: feature"]}, {"keywords": ["refactor"], "labels": ["type: refactor"]}, {"keywords": ["Ark"], "labels": ["game: Ark: Survival Evolved"]}, {"keywords": ["Arma 3"], "labels": ["game: Arma 3"]}, {"keywords": ["Counter-Strike: Global Offensive"], "labels": ["game: Counter-Strike: Global Offensive"]}, {"keywords": ["Minecraft"], "labels": ["game: Minecraft"]}, {"keywords": ["Rust"], "labels": ["game: Rust"]}, {"keywords": ["Valhiem"], "labels": ["game: Valheim"]}, {"keywords": ["7 Days to Die"], "labels": ["game: 7 Days to Die"]}]' github-token: "${{ secrets.GITHUB_TOKEN }}" From 3873a45798c9b65cb647d78106ae01e4a355e3e2 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Tue, 6 Apr 2021 23:42:21 +0100 Subject: [PATCH 014/164] Update labeler.yml --- .github/workflows/labeler.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/labeler.yml b/.github/workflows/labeler.yml index f6747e29e..484d30d11 100644 --- a/.github/workflows/labeler.yml +++ b/.github/workflows/labeler.yml @@ -12,5 +12,5 @@ jobs: - uses: Naturalclar/issue-action@v2.0.2 with: title-or-body: "both" - parameters: '[ {"keywords": ["Server Request"], "labels": ["type: game server request"]}, {"keywords": ["backup"], "labels": ["command: backup"]}, {"keywords": ["console"], "labels": ["command: console"]}, {"keywords": ["command: debug"], "labels": ["command: debug"]}, {"keywords": ["command: details"], "labels": ["command: details"]}, {"keywords": ["fast-dl"], "labels": ["command: fast-dl"]}, {"keywords": ["command: install"], "labels": ["command: install"]}, {"keywords": ["command: mods"], "labels": ["command: mods"]}, {"keywords": ["monitor"], "labels": ["command: monitor"]}, {"keywords": ["command: start"], "labels": ["command: start"]}, {"keywords": ["command: stop"], "labels": ["command: stop"]}, {"keywords": ["command: update-lgsm"], "labels": ["command: update-lgsm"]}, {"keywords": ["update"], "labels": ["command: update"]}, {"keywords": ["validate"], "labels": ["command: validate"]}, {"keywords": ["wipe"], "labels": ["command: wipe"]}, {"keywords": ["CentOS"], "labels": ["distro: CentOS"]}, {"keywords": ["Debian"], "labels": ["distro: Debian"]}, {"keywords": ["Fedora"], "labels": ["distro: Fedora"]}, {"keywords": ["Ubuntu"], "labels": ["distro: Ubuntu"]}, {"keywords": ["alert"], "labels": ["info: alerts"]}, {"keywords": ["dependency"], "labels": ["info: dependency"]}, {"keywords": ["docker"], "labels": ["info: docker"]}, {"keywords": ["steamcmd"], "labels": ["info: steamcmd"]}, {"keywords": ["systemd"], "labels": ["info: systemd"]}, {"keywords": ["tmux"], "labels": ["info: tmux"]}, {"keywords": ["bug"], "labels": ["type: bug"]}, {"keywords": ["feature"], "labels": ["type: feature"]}, {"keywords": ["refactor"], "labels": ["type: refactor"]}, {"keywords": ["Ark"], "labels": ["game: Ark: Survival Evolved"]}, {"keywords": ["Arma 3"], "labels": ["game: Arma 3"]}, {"keywords": ["Counter-Strike: Global Offensive"], "labels": ["game: Counter-Strike: Global Offensive"]}, {"keywords": ["Minecraft"], "labels": ["game: Minecraft"]}, {"keywords": ["Rust"], "labels": ["game: Rust"]}, {"keywords": ["Valhiem"], "labels": ["game: Valheim"]}, {"keywords": ["7 Days to Die"], "labels": ["game: 7 Days to Die"]}]' + parameters: '[ {"keywords": ["Server Request"], "labels": ["type: game server request"]}, {"keywords": ["backup"], "labels": ["command: backup"]}, {"keywords": ["console"], "labels": ["command: console"]}, {"keywords": ["command: debug"], "labels": ["command: debug"]}, {"keywords": ["command: details"], "labels": ["command: details"]}, {"keywords": ["fast-dl"], "labels": ["command: fast-dl"]}, {"keywords": ["command: install"], "labels": ["command: install"]}, {"keywords": ["command: mods"], "labels": ["command: mods"]}, {"keywords": ["monitor"], "labels": ["command: monitor"]}, {"keywords": ["command: start"], "labels": ["command: start"]}, {"keywords": ["command: stop"], "labels": ["command: stop"]}, {"keywords": ["command: update-lgsm"], "labels": ["command: update-lgsm"]}, {"keywords": ["update"], "labels": ["command: update"]}, {"keywords": ["validate"], "labels": ["command: validate"]}, {"keywords": ["wipe"], "labels": ["command: wipe"]}, {"keywords": ["CentOS"], "labels": ["distro: CentOS"]}, {"keywords": ["Debian"], "labels": ["distro: Debian"]}, {"keywords": ["Fedora"], "labels": ["distro: Fedora"]}, {"keywords": ["Ubuntu"], "labels": ["distro: Ubuntu"]}, {"keywords": ["alert"], "labels": ["info: alerts"]}, {"keywords": ["dependency"], "labels": ["info: dependency"]}, {"keywords": ["docker"], "labels": ["info: docker"]}, {"keywords": ["steamcmd"], "labels": ["info: steamcmd"]}, {"keywords": ["systemd"], "labels": ["info: systemd"]}, {"keywords": ["tmux"], "labels": ["info: tmux"]}, {"keywords": ["bug"], "labels": ["type: bug"]}, {"keywords": ["feature"], "labels": ["type: feature"]}, {"keywords": ["refactor"], "labels": ["type: refactor"]}, {"keywords": ["Ark"], "labels": ["game: Ark: Survival Evolved"]}, {"keywords": ["Arma 3"], "labels": ["game: Arma 3"]}, {"keywords": ["Counter-Strike: Global Offensive"], "labels": ["game: Counter-Strike: Global Offensive"]}, {"keywords": ["Minecraft"], "labels": ["game: Minecraft"]}, {"keywords": ["Rust"], "labels": ["game: Rust"]}, {"keywords": ["Valheim"], "labels": ["game: Valheim"]}, {"keywords": ["7 Days to Die"], "labels": ["game: 7 Days to Die"]}]' github-token: "${{ secrets.GITHUB_TOKEN }}" From 19ac5610f1d532c5ee2697b800c5b385b8d4a519 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Tue, 6 Apr 2021 23:45:34 +0100 Subject: [PATCH 015/164] Update labeler.yml --- .github/workflows/labeler.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/labeler.yml b/.github/workflows/labeler.yml index 484d30d11..316f08b98 100644 --- a/.github/workflows/labeler.yml +++ b/.github/workflows/labeler.yml @@ -12,5 +12,5 @@ jobs: - uses: Naturalclar/issue-action@v2.0.2 with: title-or-body: "both" - parameters: '[ {"keywords": ["Server Request"], "labels": ["type: game server request"]}, {"keywords": ["backup"], "labels": ["command: backup"]}, {"keywords": ["console"], "labels": ["command: console"]}, {"keywords": ["command: debug"], "labels": ["command: debug"]}, {"keywords": ["command: details"], "labels": ["command: details"]}, {"keywords": ["fast-dl"], "labels": ["command: fast-dl"]}, {"keywords": ["command: install"], "labels": ["command: install"]}, {"keywords": ["command: mods"], "labels": ["command: mods"]}, {"keywords": ["monitor"], "labels": ["command: monitor"]}, {"keywords": ["command: start"], "labels": ["command: start"]}, {"keywords": ["command: stop"], "labels": ["command: stop"]}, {"keywords": ["command: update-lgsm"], "labels": ["command: update-lgsm"]}, {"keywords": ["update"], "labels": ["command: update"]}, {"keywords": ["validate"], "labels": ["command: validate"]}, {"keywords": ["wipe"], "labels": ["command: wipe"]}, {"keywords": ["CentOS"], "labels": ["distro: CentOS"]}, {"keywords": ["Debian"], "labels": ["distro: Debian"]}, {"keywords": ["Fedora"], "labels": ["distro: Fedora"]}, {"keywords": ["Ubuntu"], "labels": ["distro: Ubuntu"]}, {"keywords": ["alert"], "labels": ["info: alerts"]}, {"keywords": ["dependency"], "labels": ["info: dependency"]}, {"keywords": ["docker"], "labels": ["info: docker"]}, {"keywords": ["steamcmd"], "labels": ["info: steamcmd"]}, {"keywords": ["systemd"], "labels": ["info: systemd"]}, {"keywords": ["tmux"], "labels": ["info: tmux"]}, {"keywords": ["bug"], "labels": ["type: bug"]}, {"keywords": ["feature"], "labels": ["type: feature"]}, {"keywords": ["refactor"], "labels": ["type: refactor"]}, {"keywords": ["Ark"], "labels": ["game: Ark: Survival Evolved"]}, {"keywords": ["Arma 3"], "labels": ["game: Arma 3"]}, {"keywords": ["Counter-Strike: Global Offensive"], "labels": ["game: Counter-Strike: Global Offensive"]}, {"keywords": ["Minecraft"], "labels": ["game: Minecraft"]}, {"keywords": ["Rust"], "labels": ["game: Rust"]}, {"keywords": ["Valheim"], "labels": ["game: Valheim"]}, {"keywords": ["7 Days to Die"], "labels": ["game: 7 Days to Die"]}]' + parameters: '[ {"keywords": ["Server Request"], "labels": ["type: game server request"]}, {"keywords": ["backup"], "labels": ["command: backup"]}, {"keywords": ["console"], "labels": ["command: console"]}, {"keywords": ["command: debug"], "labels": ["command: debug"]}, {"keywords": ["command: details"], "labels": ["command: details"]}, {"keywords": ["fast-dl"], "labels": ["command: fast-dl"]}, {"keywords": ["command: install"], "labels": ["command: install"]}, {"keywords": ["command: mods"], "labels": ["command: mods"]}, {"keywords": ["monitor"], "labels": ["command: monitor"]}, {"keywords": ["command: start"], "labels": ["command: start"]}, {"keywords": ["command: stop"], "labels": ["command: stop"]}, {"keywords": ["command: update-lgsm"], "labels": ["command: update-lgsm"]}, {"keywords": ["update"], "labels": ["command: update"]}, {"keywords": ["validate"], "labels": ["command: validate"]}, {"keywords": ["wipe"], "labels": ["command: wipe"]}, {"keywords": ["CentOS"], "labels": ["distro: CentOS"]}, {"keywords": ["Debian"], "labels": ["distro: Debian"]}, {"keywords": ["Fedora"], "labels": ["distro: Fedora"]}, {"keywords": ["Ubuntu"], "labels": ["distro: Ubuntu"]}, {"keywords": ["alert"], "labels": ["info: alerts"]}, {"keywords": ["dependency"], "labels": ["info: dependency"]}, {"keywords": ["docker"], "labels": ["info: docker"]}, {"keywords": ["steamcmd"], "labels": ["info: steamcmd"]}, {"keywords": ["systemd"], "labels": ["info: systemd"]}, {"keywords": ["tmux"], "labels": ["info: tmux"]}, {"keywords": ["bug"], "labels": ["type: bug"]}, {"keywords": ["feature"], "labels": ["type: feature request"]}, {"keywords": ["refactor"], "labels": ["type: refactor"]}, {"keywords": ["Ark"], "labels": ["game: Ark: Survival Evolved"]}, {"keywords": ["Arma 3"], "labels": ["game: Arma 3"]}, {"keywords": ["Counter-Strike: Global Offensive"], "labels": ["game: Counter-Strike: Global Offensive"]}, {"keywords": ["Minecraft"], "labels": ["game: Minecraft"]}, {"keywords": ["Rust"], "labels": ["game: Rust"]}, {"keywords": ["Valheim"], "labels": ["game: Valheim"]}, {"keywords": ["7 Days to Die"], "labels": ["game: 7 Days to Die"]}]' github-token: "${{ secrets.GITHUB_TOKEN }}" From 2a7fd6f2dd6b2d5af817ba83ae465c784e2438b1 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Wed, 9 Jun 2021 22:35:53 +0100 Subject: [PATCH 016/164] fix(mc): add Java 16 as a dependency requirement for Ubuntu 20.04 and above (#3482) * Added java info to details for game servers that require it * added openjdk-16-jre option for Ubuntu server --- lgsm/functions/check_deps.sh | 16 ++++++++++++++-- lgsm/functions/info_distro.sh | 4 ++++ lgsm/functions/info_messages.sh | 3 +++ 3 files changed, 21 insertions(+), 2 deletions(-) diff --git a/lgsm/functions/check_deps.sh b/lgsm/functions/check_deps.sh index 50109b2f6..722a0a4da 100755 --- a/lgsm/functions/check_deps.sh +++ b/lgsm/functions/check_deps.sh @@ -414,8 +414,20 @@ fn_deps_build_debian(){ # Hurtword/Rust elif [ "${shortname}" == "hw" ]||[ "${shortname}" == "rust" ]; then array_deps_required+=( lib32z1 ) - # Minecraft, Rising World, Wurm - elif [ "${shortname}" == "mc" ]||[ "${shortname}" == "pmc" ]||[ "${shortname}" == "wmc" ]||[ "${shortname}" == "rw" ]; then + # Minecraft, Rising World + elif [ "${shortname}" == "mc" ]||[ "${shortname}" == "pmc" ]||[ "${shortname}" == "wmc" ]; then + javaversion=$(java -version 2>&1 | grep "version") + if [ "${javaversion}" ]; then + # Added for users using Oracle JRE to bypass the check. + javacheck=1 + else + if { [ "${distroid}" == "ubuntu" ]&&[ "${distroversion}" == "20.04" ]; }||{ [ "${distroid}" == "ubuntu" ]&&[ "${distroversion}" == "20.10" ]; }||{ [ "${distroid}" == "ubuntu" ]&&[ "${distroversion}" == "21.04" ]; }||{ [ "${distroid}" == "pop" ]&&[ "${distroversion}" == "20.04" ]; }||{ [ "${distroid}" == "pop" ]&&[ "${distroversion}" == "20.10" ]; }||{ [ "${distroid}" == "pop" ]&&[ "${distroversion}" == "21.04" ]; }; then + array_deps_required+=( openjdk-16-jre ) + else + array_deps_required+=( default-jre ) + fi + fi + elif [ "${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/info_distro.sh b/lgsm/functions/info_distro.sh index 283d8ed39..7f0dc2b19 100755 --- a/lgsm/functions/info_distro.sh +++ b/lgsm/functions/info_distro.sh @@ -83,6 +83,10 @@ else fi fi +if [ "$(command -V java 2>/dev/null)" ]; then + javaversion=$(java -version 2>&1 | grep "version") +fi + ## Uptime uptime=$( Date: Wed, 9 Jun 2021 22:42:06 +0100 Subject: [PATCH 017/164] fix(steamcmd): resolve disk write failure bug (#3483) --- lgsm/functions/check_steamcmd.sh | 1 + lgsm/functions/core_steamcmd.sh | 7 +++++++ 2 files changed, 8 insertions(+) diff --git a/lgsm/functions/check_steamcmd.sh b/lgsm/functions/check_steamcmd.sh index 9b84686dc..030cbbf03 100755 --- a/lgsm/functions/check_steamcmd.sh +++ b/lgsm/functions/check_steamcmd.sh @@ -17,5 +17,6 @@ if [ ${shortname} == "ark" ]; then fi fn_check_steamcmd_dir fn_check_steamcmd_dir_legacy +fn_check_steamcmd_steamapp fn_check_steamcmd_user fn_check_steamcmd_exec diff --git a/lgsm/functions/core_steamcmd.sh b/lgsm/functions/core_steamcmd.sh index ece274f0f..5fbd5db9f 100755 --- a/lgsm/functions/core_steamcmd.sh +++ b/lgsm/functions/core_steamcmd.sh @@ -97,6 +97,13 @@ fn_check_steamcmd_dir_legacy(){ fi } +fn_check_steamcmd_steamapp(){ + # Check that steamapp directory fixes issue #3481 + if [ ! -d "${serverfiles}/steamapps" ]; then + mkdir -p "${serverfiles}/steamapps" + fi +} + fn_check_steamcmd_ark(){ # Checks if SteamCMD exists in # Engine/Binaries/ThirdParty/SteamCMD/Linux From 54aa34a40516777fd62188800c3e5f82170d8ef4 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Wed, 9 Jun 2021 22:46:18 +0100 Subject: [PATCH 018/164] v21.2.4 --- 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 ec1a98531..55b23a590 100755 --- a/lgsm/functions/core_functions.sh +++ b/lgsm/functions/core_functions.sh @@ -8,7 +8,7 @@ functionselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" -modulesversion="v21.2.3" +modulesversion="v21.2.4" # Core diff --git a/tests/tests_fctrserver.sh b/tests/tests_fctrserver.sh index f31d4ac96..a4686684a 100644 --- a/tests/tests_fctrserver.sh +++ b/tests/tests_fctrserver.sh @@ -20,7 +20,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="v21.2.3" +version="v21.2.4" shortname="fctr" gameservername="fctrserver" commandname="CORE" diff --git a/tests/tests_jc2server.sh b/tests/tests_jc2server.sh index 7203ac0d2..f39dc0476 100644 --- a/tests/tests_jc2server.sh +++ b/tests/tests_jc2server.sh @@ -20,7 +20,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="v21.2.3" +version="v21.2.4" shortname="jc2" gameservername="jc2server" commandname="CORE" diff --git a/tests/tests_mcserver.sh b/tests/tests_mcserver.sh index 420732839..a426a07e9 100644 --- a/tests/tests_mcserver.sh +++ b/tests/tests_mcserver.sh @@ -20,7 +20,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="v21.2.3" +version="v21.2.4" shortname="mc" gameservername="mcserver" commandname="CORE" diff --git a/tests/tests_ts3server.sh b/tests/tests_ts3server.sh index afc68811a..32cb17c49 100644 --- a/tests/tests_ts3server.sh +++ b/tests/tests_ts3server.sh @@ -20,7 +20,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="v21.2.3" +version="v21.2.4" shortname="ts3" gameservername="ts3server" commandname="CORE" From 9b6d239ca44b699eb3f48e963af46c4f886a2e4f Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Thu, 10 Jun 2021 12:05:41 +0100 Subject: [PATCH 019/164] v21.2.4 --- linuxgsm.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/linuxgsm.sh b/linuxgsm.sh index c4df71037..7173fe0ba 100755 --- a/linuxgsm.sh +++ b/linuxgsm.sh @@ -20,7 +20,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="v21.2.3" +version="v21.2.4" shortname="core" gameservername="core" commandname="CORE" From 85a6c47abc905cf1495b14923249ddecc4908005 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Thu, 10 Jun 2021 12:08:12 +0100 Subject: [PATCH 020/164] v21.2.4 --- linuxgsm.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/linuxgsm.sh b/linuxgsm.sh index c4df71037..7173fe0ba 100755 --- a/linuxgsm.sh +++ b/linuxgsm.sh @@ -20,7 +20,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="v21.2.3" +version="v21.2.4" shortname="core" gameservername="core" commandname="CORE" From 9d8c53f5bf7a8addf65a2002337811cc3e280266 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Wed, 7 Jul 2021 14:14:51 +0100 Subject: [PATCH 021/164] Update labeler.yml --- .github/workflows/labeler.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/labeler.yml b/.github/workflows/labeler.yml index 316f08b98..9647a5461 100644 --- a/.github/workflows/labeler.yml +++ b/.github/workflows/labeler.yml @@ -12,5 +12,5 @@ jobs: - uses: Naturalclar/issue-action@v2.0.2 with: title-or-body: "both" - parameters: '[ {"keywords": ["Server Request"], "labels": ["type: game server request"]}, {"keywords": ["backup"], "labels": ["command: backup"]}, {"keywords": ["console"], "labels": ["command: console"]}, {"keywords": ["command: debug"], "labels": ["command: debug"]}, {"keywords": ["command: details"], "labels": ["command: details"]}, {"keywords": ["fast-dl"], "labels": ["command: fast-dl"]}, {"keywords": ["command: install"], "labels": ["command: install"]}, {"keywords": ["command: mods"], "labels": ["command: mods"]}, {"keywords": ["monitor"], "labels": ["command: monitor"]}, {"keywords": ["command: start"], "labels": ["command: start"]}, {"keywords": ["command: stop"], "labels": ["command: stop"]}, {"keywords": ["command: update-lgsm"], "labels": ["command: update-lgsm"]}, {"keywords": ["update"], "labels": ["command: update"]}, {"keywords": ["validate"], "labels": ["command: validate"]}, {"keywords": ["wipe"], "labels": ["command: wipe"]}, {"keywords": ["CentOS"], "labels": ["distro: CentOS"]}, {"keywords": ["Debian"], "labels": ["distro: Debian"]}, {"keywords": ["Fedora"], "labels": ["distro: Fedora"]}, {"keywords": ["Ubuntu"], "labels": ["distro: Ubuntu"]}, {"keywords": ["alert"], "labels": ["info: alerts"]}, {"keywords": ["dependency"], "labels": ["info: dependency"]}, {"keywords": ["docker"], "labels": ["info: docker"]}, {"keywords": ["steamcmd"], "labels": ["info: steamcmd"]}, {"keywords": ["systemd"], "labels": ["info: systemd"]}, {"keywords": ["tmux"], "labels": ["info: tmux"]}, {"keywords": ["bug"], "labels": ["type: bug"]}, {"keywords": ["feature"], "labels": ["type: feature request"]}, {"keywords": ["refactor"], "labels": ["type: refactor"]}, {"keywords": ["Ark"], "labels": ["game: Ark: Survival Evolved"]}, {"keywords": ["Arma 3"], "labels": ["game: Arma 3"]}, {"keywords": ["Counter-Strike: Global Offensive"], "labels": ["game: Counter-Strike: Global Offensive"]}, {"keywords": ["Minecraft"], "labels": ["game: Minecraft"]}, {"keywords": ["Rust"], "labels": ["game: Rust"]}, {"keywords": ["Valheim"], "labels": ["game: Valheim"]}, {"keywords": ["7 Days to Die"], "labels": ["game: 7 Days to Die"]}]' + parameters: '[ {"keywords": ["Server Request"], "labels": ["type: game server request"]}, {"keywords": ["backup"], "labels": ["command: backup"]}, {"keywords": ["console"], "labels": ["command: console"]}, {"keywords": ["command: debug"], "labels": ["command: debug"]}, {"keywords": ["command: details"], "labels": ["command: details"]}, {"keywords": ["fast-dl"], "labels": ["command: fast-dl"]}, {"keywords": ["command: install"], "labels": ["command: install"]}, {"keywords": ["command: mods"], "labels": ["command: mods"]}, {"keywords": ["monitor"], "labels": ["command: monitor"]}, {"keywords": ["command: start"], "labels": ["command: start"]}, {"keywords": ["command: stop"], "labels": ["command: stop"]}, {"keywords": ["command: update-lgsm"], "labels": ["command: update-lgsm"]}, {"keywords": ["update"], "labels": ["command: update"]}, {"keywords": ["validate"], "labels": ["command: validate"]}, {"keywords": ["wipe"], "labels": ["command: wipe"]}, {"keywords": ["CentOS"], "labels": ["distro: CentOS"]}, {"keywords": ["Debian"], "labels": ["distro: Debian"]}, {"keywords": ["Fedora"], "labels": ["distro: Fedora"]}, {"keywords": ["Ubuntu"], "labels": ["distro: Ubuntu"]}, {"keywords": ["alert"], "labels": ["info: alerts"]}, {"keywords": ["dependency"], "labels": ["info: dependency"]}, {"keywords": ["docker"], "labels": ["info: docker"]}, {"keywords": ["steamcmd"], "labels": ["info: steamcmd"]}, {"keywords": ["systemd"], "labels": ["info: systemd"]}, {"keywords": ["tmux"], "labels": ["info: tmux"]}, {"keywords": ["bug"], "labels": ["type: bug"]}, {"keywords": ["feature"], "labels": ["type: feature request"]}, {"keywords": ["refactor"], "labels": ["type: refactor"]}, {"keywords": ["Ark"], "labels": ["game: Ark: Survival Evolved"]}, {"keywords": ["Arma 3"], "labels": ["game: Arma 3"]}, {"keywords": ["Counter-Strike: Global Offensive"], "labels": ["game: Counter-Strike: Global Offensive"]}, {"keywords": ["Minecraft"], "labels": ["game: Minecraft"]}, {"keywords": ["Rust"], "labels": ["game: Rust"]}, {"keywords": ["Valheim"], "labels": ["game: Valheim"]}, {"keywords": ["Garry's Mod"], "labels": ["game: Garry's Mod"]}, {"keywords": ["7 Days to Die"], "labels": ["game: 7 Days to Die"]}]' github-token: "${{ secrets.GITHUB_TOKEN }}" From 6960cd5c14a901113355574720c13a68e1d06353 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Wed, 7 Jul 2021 14:16:51 +0100 Subject: [PATCH 022/164] Update labeler.yml --- .github/workflows/labeler.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/labeler.yml b/.github/workflows/labeler.yml index 9647a5461..5b9f23012 100644 --- a/.github/workflows/labeler.yml +++ b/.github/workflows/labeler.yml @@ -12,5 +12,5 @@ jobs: - uses: Naturalclar/issue-action@v2.0.2 with: title-or-body: "both" - parameters: '[ {"keywords": ["Server Request"], "labels": ["type: game server request"]}, {"keywords": ["backup"], "labels": ["command: backup"]}, {"keywords": ["console"], "labels": ["command: console"]}, {"keywords": ["command: debug"], "labels": ["command: debug"]}, {"keywords": ["command: details"], "labels": ["command: details"]}, {"keywords": ["fast-dl"], "labels": ["command: fast-dl"]}, {"keywords": ["command: install"], "labels": ["command: install"]}, {"keywords": ["command: mods"], "labels": ["command: mods"]}, {"keywords": ["monitor"], "labels": ["command: monitor"]}, {"keywords": ["command: start"], "labels": ["command: start"]}, {"keywords": ["command: stop"], "labels": ["command: stop"]}, {"keywords": ["command: update-lgsm"], "labels": ["command: update-lgsm"]}, {"keywords": ["update"], "labels": ["command: update"]}, {"keywords": ["validate"], "labels": ["command: validate"]}, {"keywords": ["wipe"], "labels": ["command: wipe"]}, {"keywords": ["CentOS"], "labels": ["distro: CentOS"]}, {"keywords": ["Debian"], "labels": ["distro: Debian"]}, {"keywords": ["Fedora"], "labels": ["distro: Fedora"]}, {"keywords": ["Ubuntu"], "labels": ["distro: Ubuntu"]}, {"keywords": ["alert"], "labels": ["info: alerts"]}, {"keywords": ["dependency"], "labels": ["info: dependency"]}, {"keywords": ["docker"], "labels": ["info: docker"]}, {"keywords": ["steamcmd"], "labels": ["info: steamcmd"]}, {"keywords": ["systemd"], "labels": ["info: systemd"]}, {"keywords": ["tmux"], "labels": ["info: tmux"]}, {"keywords": ["bug"], "labels": ["type: bug"]}, {"keywords": ["feature"], "labels": ["type: feature request"]}, {"keywords": ["refactor"], "labels": ["type: refactor"]}, {"keywords": ["Ark"], "labels": ["game: Ark: Survival Evolved"]}, {"keywords": ["Arma 3"], "labels": ["game: Arma 3"]}, {"keywords": ["Counter-Strike: Global Offensive"], "labels": ["game: Counter-Strike: Global Offensive"]}, {"keywords": ["Minecraft"], "labels": ["game: Minecraft"]}, {"keywords": ["Rust"], "labels": ["game: Rust"]}, {"keywords": ["Valheim"], "labels": ["game: Valheim"]}, {"keywords": ["Garry's Mod"], "labels": ["game: Garry's Mod"]}, {"keywords": ["7 Days to Die"], "labels": ["game: 7 Days to Die"]}]' + parameters: '[ {"keywords": ["Server Request"], "labels": ["type: game server request"]}, {"keywords": ["backup"], "labels": ["command: backup"]}, {"keywords": ["console"], "labels": ["command: console"]}, {"keywords": ["command: debug"], "labels": ["command: debug"]}, {"keywords": ["command: details"], "labels": ["command: details"]}, {"keywords": ["fast-dl"], "labels": ["command: fast-dl"]}, {"keywords": ["command: install"], "labels": ["command: install"]}, {"keywords": ["command: mods"], "labels": ["command: mods"]}, {"keywords": ["monitor"], "labels": ["command: monitor"]}, {"keywords": ["command: start"], "labels": ["command: start"]}, {"keywords": ["command: stop"], "labels": ["command: stop"]}, {"keywords": ["command: update-lgsm"], "labels": ["command: update-lgsm"]}, {"keywords": ["update"], "labels": ["command: update"]}, {"keywords": ["validate"], "labels": ["command: validate"]}, {"keywords": ["wipe"], "labels": ["command: wipe"]}, {"keywords": ["CentOS"], "labels": ["distro: CentOS"]}, {"keywords": ["Debian"], "labels": ["distro: Debian"]}, {"keywords": ["Fedora"], "labels": ["distro: Fedora"]}, {"keywords": ["Ubuntu"], "labels": ["distro: Ubuntu"]}, {"keywords": ["alert"], "labels": ["info: alerts"]}, {"keywords": ["dependency"], "labels": ["info: dependency"]}, {"keywords": ["docker"], "labels": ["info: docker"]}, {"keywords": ["steamcmd"], "labels": ["info: steamcmd"]}, {"keywords": ["systemd"], "labels": ["info: systemd"]}, {"keywords": ["tmux"], "labels": ["info: tmux"]}, {"keywords": ["bug"], "labels": ["type: bug"]}, {"keywords": ["feature"], "labels": ["type: feature request"]}, {"keywords": ["refactor"], "labels": ["type: refactor"]}, {"keywords": ["Ark"], "labels": ["game: Ark: Survival Evolved"]}, {"keywords": ["Arma 3"], "labels": ["game: Arma 3"]}, {"keywords": ["Counter-Strike: Global Offensive"], "labels": ["game: Counter-Strike: Global Offensive"]}, {"keywords": ["Minecraft"], "labels": ["game: Minecraft"]}, {"keywords": ["Rust"], "labels": ["game: Rust"]}, {"keywords": ["Valheim"], "labels": ["game: Valheim"]}, {"keywords": ["Garry\'s Mod"], "labels": ["game: Garry\'s Mod"]}, {"keywords": ["7 Days to Die"], "labels": ["game: 7 Days to Die"]}]' github-token: "${{ secrets.GITHUB_TOKEN }}" From c0e79e803ab481e6cd9364f8f685a44c1e884d28 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Wed, 7 Jul 2021 14:17:58 +0100 Subject: [PATCH 023/164] Update labeler.yml --- .github/workflows/labeler.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/labeler.yml b/.github/workflows/labeler.yml index 5b9f23012..316f08b98 100644 --- a/.github/workflows/labeler.yml +++ b/.github/workflows/labeler.yml @@ -12,5 +12,5 @@ jobs: - uses: Naturalclar/issue-action@v2.0.2 with: title-or-body: "both" - parameters: '[ {"keywords": ["Server Request"], "labels": ["type: game server request"]}, {"keywords": ["backup"], "labels": ["command: backup"]}, {"keywords": ["console"], "labels": ["command: console"]}, {"keywords": ["command: debug"], "labels": ["command: debug"]}, {"keywords": ["command: details"], "labels": ["command: details"]}, {"keywords": ["fast-dl"], "labels": ["command: fast-dl"]}, {"keywords": ["command: install"], "labels": ["command: install"]}, {"keywords": ["command: mods"], "labels": ["command: mods"]}, {"keywords": ["monitor"], "labels": ["command: monitor"]}, {"keywords": ["command: start"], "labels": ["command: start"]}, {"keywords": ["command: stop"], "labels": ["command: stop"]}, {"keywords": ["command: update-lgsm"], "labels": ["command: update-lgsm"]}, {"keywords": ["update"], "labels": ["command: update"]}, {"keywords": ["validate"], "labels": ["command: validate"]}, {"keywords": ["wipe"], "labels": ["command: wipe"]}, {"keywords": ["CentOS"], "labels": ["distro: CentOS"]}, {"keywords": ["Debian"], "labels": ["distro: Debian"]}, {"keywords": ["Fedora"], "labels": ["distro: Fedora"]}, {"keywords": ["Ubuntu"], "labels": ["distro: Ubuntu"]}, {"keywords": ["alert"], "labels": ["info: alerts"]}, {"keywords": ["dependency"], "labels": ["info: dependency"]}, {"keywords": ["docker"], "labels": ["info: docker"]}, {"keywords": ["steamcmd"], "labels": ["info: steamcmd"]}, {"keywords": ["systemd"], "labels": ["info: systemd"]}, {"keywords": ["tmux"], "labels": ["info: tmux"]}, {"keywords": ["bug"], "labels": ["type: bug"]}, {"keywords": ["feature"], "labels": ["type: feature request"]}, {"keywords": ["refactor"], "labels": ["type: refactor"]}, {"keywords": ["Ark"], "labels": ["game: Ark: Survival Evolved"]}, {"keywords": ["Arma 3"], "labels": ["game: Arma 3"]}, {"keywords": ["Counter-Strike: Global Offensive"], "labels": ["game: Counter-Strike: Global Offensive"]}, {"keywords": ["Minecraft"], "labels": ["game: Minecraft"]}, {"keywords": ["Rust"], "labels": ["game: Rust"]}, {"keywords": ["Valheim"], "labels": ["game: Valheim"]}, {"keywords": ["Garry\'s Mod"], "labels": ["game: Garry\'s Mod"]}, {"keywords": ["7 Days to Die"], "labels": ["game: 7 Days to Die"]}]' + parameters: '[ {"keywords": ["Server Request"], "labels": ["type: game server request"]}, {"keywords": ["backup"], "labels": ["command: backup"]}, {"keywords": ["console"], "labels": ["command: console"]}, {"keywords": ["command: debug"], "labels": ["command: debug"]}, {"keywords": ["command: details"], "labels": ["command: details"]}, {"keywords": ["fast-dl"], "labels": ["command: fast-dl"]}, {"keywords": ["command: install"], "labels": ["command: install"]}, {"keywords": ["command: mods"], "labels": ["command: mods"]}, {"keywords": ["monitor"], "labels": ["command: monitor"]}, {"keywords": ["command: start"], "labels": ["command: start"]}, {"keywords": ["command: stop"], "labels": ["command: stop"]}, {"keywords": ["command: update-lgsm"], "labels": ["command: update-lgsm"]}, {"keywords": ["update"], "labels": ["command: update"]}, {"keywords": ["validate"], "labels": ["command: validate"]}, {"keywords": ["wipe"], "labels": ["command: wipe"]}, {"keywords": ["CentOS"], "labels": ["distro: CentOS"]}, {"keywords": ["Debian"], "labels": ["distro: Debian"]}, {"keywords": ["Fedora"], "labels": ["distro: Fedora"]}, {"keywords": ["Ubuntu"], "labels": ["distro: Ubuntu"]}, {"keywords": ["alert"], "labels": ["info: alerts"]}, {"keywords": ["dependency"], "labels": ["info: dependency"]}, {"keywords": ["docker"], "labels": ["info: docker"]}, {"keywords": ["steamcmd"], "labels": ["info: steamcmd"]}, {"keywords": ["systemd"], "labels": ["info: systemd"]}, {"keywords": ["tmux"], "labels": ["info: tmux"]}, {"keywords": ["bug"], "labels": ["type: bug"]}, {"keywords": ["feature"], "labels": ["type: feature request"]}, {"keywords": ["refactor"], "labels": ["type: refactor"]}, {"keywords": ["Ark"], "labels": ["game: Ark: Survival Evolved"]}, {"keywords": ["Arma 3"], "labels": ["game: Arma 3"]}, {"keywords": ["Counter-Strike: Global Offensive"], "labels": ["game: Counter-Strike: Global Offensive"]}, {"keywords": ["Minecraft"], "labels": ["game: Minecraft"]}, {"keywords": ["Rust"], "labels": ["game: Rust"]}, {"keywords": ["Valheim"], "labels": ["game: Valheim"]}, {"keywords": ["7 Days to Die"], "labels": ["game: 7 Days to Die"]}]' github-token: "${{ secrets.GITHUB_TOKEN }}" From a7f81ff4f6953e7c1fd912bc7b2ba47c681cdb17 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Wed, 7 Jul 2021 14:22:55 +0100 Subject: [PATCH 024/164] Update lock-threads v2.0.3 --- .github/workflows/lock.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/lock.yml b/.github/workflows/lock.yml index 63f0cf2db..bef7c74c6 100644 --- a/.github/workflows/lock.yml +++ b/.github/workflows/lock.yml @@ -8,7 +8,7 @@ jobs: lock: runs-on: ubuntu-latest steps: - - uses: dessant/lock-threads@v2 + - uses: dessant/lock-threads@v2.0.3 with: github-token: ${{ secrets.GITHUB_TOKEN }} issue-lock-comment: > From 1927d2587b40fd450afd6f500b1eaca1e6da4f9f Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Wed, 7 Jul 2021 14:25:01 +0100 Subject: [PATCH 025/164] Update ssh-agent and git-sync dependencies --- .github/workflows/git-sync.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/git-sync.yml b/.github/workflows/git-sync.yml index a5a827096..4467acde2 100644 --- a/.github/workflows/git-sync.yml +++ b/.github/workflows/git-sync.yml @@ -12,12 +12,12 @@ jobs: runs-on: ubuntu-latest steps: - name: webfactory/ssh-agent - uses: webfactory/ssh-agent@v0.4.1 + uses: webfactory/ssh-agent@v0.5.3 with: ssh-private-key: ${{ secrets.BITBUCKET_SECRET }} - name: repo-sync - uses: wei/git-sync@v2.1.0 + uses: wei/git-sync@v3.0.0 with: ssh_private_key: ${{ secrets.BITBUCKET_SECRET }} source_repo: "https://github.com/GameServerManagers/LinuxGSM" From aabcd64554b5efbb601b590c6f308045eaf56f6c Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Wed, 7 Jul 2021 14:26:46 +0100 Subject: [PATCH 026/164] Update LICENCE date --- LICENSE | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/LICENSE b/LICENSE index 6fa6c795f..bda7cb6ee 100644 --- a/LICENSE +++ b/LICENSE @@ -1,6 +1,6 @@ MIT License -Copyright (c) 2012-2020 Daniel Gibbs +Copyright (c) 2012-2021 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 c87a530fc75ea1aca1acaef8abfbfe61c37965fb Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Wed, 7 Jul 2021 14:34:34 +0100 Subject: [PATCH 027/164] Update CONTRIBUTING.md --- CONTRIBUTING.md | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index bcb1caf7f..4a114d2fc 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -48,8 +48,7 @@ Before creating bug reports, please check [this list](https://github.com/GameSer #### Before Submitting A Bug Report * **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. +* **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. #### How Do I Submit A (Good) Bug Report? From 76f23e192a2909303076f840f3410a4a7eacc9bd Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Wed, 7 Jul 2021 15:03:23 +0100 Subject: [PATCH 028/164] Update README.md --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 6f6f41c6f..341e0af57 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://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://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) [![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. @@ -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) 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 [sponsor](https://linuxgsm.com/sponsor) 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 ad91fb5be96a15ff9cb68967087ad08ae97c088c Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Wed, 7 Jul 2021 15:04:06 +0100 Subject: [PATCH 029/164] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 341e0af57..baed33db1 100644 --- a/README.md +++ b/README.md @@ -45,7 +45,7 @@ Documentation is found at [linuxgsm.com](https://linuxgsm.com) and [docs.linuxgs There are a various ways to get support, check out the [support](https://linuxgsm.com/support/) page to the right support. -## :heart: Donate +## :heart: Sponsor If you would like to [sponsor](https://linuxgsm.com/sponsor) 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. From 45de90e000bffc7e78f46c7863b2055705d0f5e6 Mon Sep 17 00:00:00 2001 From: Claiyc Date: Sun, 1 Aug 2021 19:47:05 +0200 Subject: [PATCH 030/164] add lastoasis --- .../config-lgsm/loserver/_default.cfg | 184 ++++++++++++++++++ lgsm/data/serverlist.csv | 1 + lgsm/functions/info_messages.sh | 12 ++ lgsm/functions/info_parms.sh | 8 + 4 files changed, 205 insertions(+) create mode 100644 lgsm/config-default/config-lgsm/loserver/_default.cfg diff --git a/lgsm/config-default/config-lgsm/loserver/_default.cfg b/lgsm/config-default/config-lgsm/loserver/_default.cfg new file mode 100644 index 000000000..4bbdf27dd --- /dev/null +++ b/lgsm/config-default/config-lgsm/loserver/_default.cfg @@ -0,0 +1,184 @@ +################################## +######## 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 +servername="LinuxGSM" +ip="0.0.0.0" +port="7777" +queryport="27015" +customerkey="" +providerkey="" +slots="100" + +## Server Parameters | https://docs.linuxgsm.com/configuration/start-parameters#additional-parameters +startparameters="-log -force_steamclient_link -messaging -NoLiveServer -EnableCheats -backendapiurloverride='backend.last-oasis.com' -identifier=${servername} -port=${port} -CustomerKey=${customerkey} -ProviderKey=${providerkey} -slots=${slots} -QueryPort=${queryport} -OverrideConnectionAddress=${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) + +# 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". +telegramapi="api.telegram.org" +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="920720" +steamcmdforcewindows="no" +# 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="1" +querytype="" + +## Console type +consoleverbose="yes" +consoleinteract="no" + +## Game Server Details +# Do not edit +gamename="Last Oasis" +engine="unreal4" +glibc="2.17" + +#### Directories #### +# Edit with care + +## Game Server Directories +systemdir="${serverfiles}/Mist" +executabledir="${systemdir}/Binaries/Linux" +executable="./MistServer-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}/${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" \ No newline at end of file diff --git a/lgsm/data/serverlist.csv b/lgsm/data/serverlist.csv index 687a3f63d..249f1616d 100644 --- a/lgsm/data/serverlist.csv +++ b/lgsm/data/serverlist.csv @@ -51,6 +51,7 @@ jc3,jc3server,Just Cause 3 jk2,jk2server,Jedi Knight II: Jedi Outcast kf,kfserver,Killing Floor kf2,kf2server,Killing Floor 2 +lo,loserver,Last Oasis l4d,l4dserver,Left 4 Dead l4d2,l4d2server,Left 4 Dead 2 mc,mcserver,Minecraft diff --git a/lgsm/functions/info_messages.sh b/lgsm/functions/info_messages.sh index 0c81175fe..d2ef50586 100755 --- a/lgsm/functions/info_messages.sh +++ b/lgsm/functions/info_messages.sh @@ -950,6 +950,16 @@ fn_info_message_justcause3(){ } | column -s $'\t' -t } +fn_info_message_lo(){ + echo -e "netstat -atunp | grep MistServer" + 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_minecraft(){ echo -e "netstat -atunp | grep java" echo -e "" @@ -1616,6 +1626,8 @@ fn_info_message_select_engine(){ fn_info_message_justcause2 elif [ "${shortname}" == "jc3" ]; then fn_info_message_justcause3 + elif [ "${shortname}" == "lo" ]; then + fn_info_message_lo elif [ "${shortname}" == "kf2" ]; then fn_info_message_kf2 elif [ "${shortname}" == "mc" ]||[ "${shortname}" == "pmc" ]||[ "${shortname}" == "wmc" ]; then diff --git a/lgsm/functions/info_parms.sh b/lgsm/functions/info_parms.sh index 47148f4b3..9aee054cd 100755 --- a/lgsm/functions/info_parms.sh +++ b/lgsm/functions/info_parms.sh @@ -77,6 +77,12 @@ fn_info_parms_kf2(){ defaultmap=${defaultmap:-"NOT SET"} } +fn_info_parms_lo(){ + servername=${servername:-"NOT SET"} + port=${port:-"0"} + queryport=${queryport:-"0"} +} + fn_info_parms_mordhau(){ port=${port:-"0"} queryport=${queryport:-"0"} @@ -270,6 +276,8 @@ elif [ "${shortname}" == "jk2" ]; then fn_info_parms_jk2 elif [ "${shortname}" == "kf2" ]; then fn_info_parms_kf2 +elif [ "${shortname}" == "lo" ]; then + fn_info_parms_lo elif [ "${shortname}" == "mohaa" ]; then fn_info_parms_mohaa elif [ "${shortname}" == "mom" ]; then From be6ee5ea3e076278c43c90507c02b4c2de03a0bb Mon Sep 17 00:00:00 2001 From: Claiyc Date: Sun, 1 Aug 2021 20:21:50 +0200 Subject: [PATCH 031/164] add steamcmd login to loserver cfg --- lgsm/config-default/config-lgsm/loserver/_default.cfg | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/lgsm/config-default/config-lgsm/loserver/_default.cfg b/lgsm/config-default/config-lgsm/loserver/_default.cfg index 4bbdf27dd..313e50a49 100644 --- a/lgsm/config-default/config-lgsm/loserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/loserver/_default.cfg @@ -8,6 +8,10 @@ #### Game Server Settings #### +## SteamCMD Login | https://docs.linuxgsm.com/steamcmd#steamcmd-login +steamuser="username" +steampass='password' + ## Predefined Parameters | https://docs.linuxgsm.com/configuration/start-parameters servername="LinuxGSM" ip="0.0.0.0" From 019431b009207e2bc287d4a6f0c5f2660612e7d0 Mon Sep 17 00:00:00 2001 From: Claiyc Date: Sun, 1 Aug 2021 21:31:10 +0200 Subject: [PATCH 032/164] add fix_lo.sh --- lgsm/functions/fix.sh | 2 ++ lgsm/functions/fix_lo.sh | 12 ++++++++++++ 2 files changed, 14 insertions(+) create mode 100644 lgsm/functions/fix_lo.sh diff --git a/lgsm/functions/fix.sh b/lgsm/functions/fix.sh index 1b5e63db6..ce472e94c 100755 --- a/lgsm/functions/fix.sh +++ b/lgsm/functions/fix.sh @@ -106,6 +106,8 @@ if [ "${commandname}" == "INSTALL" ]; then fix_kf.sh elif [ "${shortname}" == "kf2" ]; then fix_kf2.sh + elif [ "${shortname}" == "lo" ]; then + fix_lo.sh elif [ "${shortname}" == "ro" ]; then fix_ro.sh elif [ "${shortname}" == "samp" ]; then diff --git a/lgsm/functions/fix_lo.sh b/lgsm/functions/fix_lo.sh new file mode 100644 index 000000000..70e0dbe1e --- /dev/null +++ b/lgsm/functions/fix_lo.sh @@ -0,0 +1,12 @@ +#!/bin/bash +# LinuxGSM fix_lo.sh function +# Author: Daniel Gibbs +# Website: https://linuxgsm.com +# Description: Resolves startup issue with Last Oasis + +functionselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" + +local APPID_FILE = ${executabledir}/steam_appid.txt +if [! -f "${APPID_FILE}" ]; then + echo "903950" > ${APPID_FILE} +fi \ No newline at end of file From 24f2b6fcf229c32dec2cd70f71f65e1f8605ed9a Mon Sep 17 00:00:00 2001 From: Claiyc Date: Sun, 1 Aug 2021 21:47:00 +0200 Subject: [PATCH 033/164] fix: fix.sh --- 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 ce472e94c..a4d19f663 100755 --- a/lgsm/functions/fix.sh +++ b/lgsm/functions/fix.sh @@ -94,7 +94,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}" == "samp" ]||[ "${shortname}" == "ut2k4" ]||[ "${shortname}" == "ut" ]||[ "${shortname}" == "ut3" ]; then + if [ "${shortname}" == "av" ]||[ "${shortname}" == "cmw" ]||[ "${shortname}" == "kf" ]||[ "${shortname}" == "kf2" ]||[ "${shortname}" == "lo" ]||[ "${shortname}" == "onset" ]||[ "${shortname}" == "ro" ]||[ "${shortname}" == "samp" ]||[ "${shortname}" == "ut2k4" ]||[ "${shortname}" == "ut" ]||[ "${shortname}" == "ut3" ]; then echo -e "" echo -e "${lightyellow}Applying Post-Install Fixes}${default}" echo -e "=================================" From a8a877171303e40b7dda3e3e700999db1edd2e4a Mon Sep 17 00:00:00 2001 From: Claiyc Date: Sun, 1 Aug 2021 21:55:49 +0200 Subject: [PATCH 034/164] fix: add fetch for fix_lo.sh --- lgsm/functions/core_functions.sh | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/lgsm/functions/core_functions.sh b/lgsm/functions/core_functions.sh index 55b23a590..9c8dccef1 100755 --- a/lgsm/functions/core_functions.sh +++ b/lgsm/functions/core_functions.sh @@ -381,6 +381,11 @@ functionfile="${FUNCNAME[0]}" fn_fetch_function } +fix_lo.sh(){ +functionfile="${FUNCNAME[0]}" +fn_fetch_function +} + fix_mcb.sh(){ functionfile="${FUNCNAME[0]}" fn_fetch_function From c8a5c2732e23b35da873b067f9df81a94b3f9d21 Mon Sep 17 00:00:00 2001 From: Claiyc Date: Sun, 1 Aug 2021 22:26:13 +0200 Subject: [PATCH 035/164] fix: fix_lo.sh --- lgsm/functions/fix_lo.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lgsm/functions/fix_lo.sh b/lgsm/functions/fix_lo.sh index 70e0dbe1e..462005ddd 100644 --- a/lgsm/functions/fix_lo.sh +++ b/lgsm/functions/fix_lo.sh @@ -6,7 +6,7 @@ functionselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" -local APPID_FILE = ${executabledir}/steam_appid.txt -if [! -f "${APPID_FILE}" ]; then +local APPID_FILE=${executabledir}/steam_appid.txt +if [ ! -f "${APPID_FILE}" ]; then echo "903950" > ${APPID_FILE} fi \ No newline at end of file From 746dbbd066e045dc46b36e7d079d6b175e22c207 Mon Sep 17 00:00:00 2001 From: Claiyc Date: Sun, 1 Aug 2021 22:39:46 +0200 Subject: [PATCH 036/164] fix: misspelling & fix_lo.sh --- lgsm/functions/fix.sh | 2 +- lgsm/functions/fix_lo.sh | 5 ++++- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/lgsm/functions/fix.sh b/lgsm/functions/fix.sh index a4d19f663..b5cbcc77a 100755 --- a/lgsm/functions/fix.sh +++ b/lgsm/functions/fix.sh @@ -96,7 +96,7 @@ fi if [ "${commandname}" == "INSTALL" ]; then if [ "${shortname}" == "av" ]||[ "${shortname}" == "cmw" ]||[ "${shortname}" == "kf" ]||[ "${shortname}" == "kf2" ]||[ "${shortname}" == "lo" ]||[ "${shortname}" == "onset" ]||[ "${shortname}" == "ro" ]||[ "${shortname}" == "samp" ]||[ "${shortname}" == "ut2k4" ]||[ "${shortname}" == "ut" ]||[ "${shortname}" == "ut3" ]; then echo -e "" - echo -e "${lightyellow}Applying Post-Install Fixes}${default}" + echo -e "${lightyellow}Applying Post-Install Fixes${default}" echo -e "=================================" fn_sleep_time postinstall=1 diff --git a/lgsm/functions/fix_lo.sh b/lgsm/functions/fix_lo.sh index 462005ddd..c64a90b2d 100644 --- a/lgsm/functions/fix_lo.sh +++ b/lgsm/functions/fix_lo.sh @@ -2,11 +2,14 @@ # LinuxGSM fix_lo.sh function # Author: Daniel Gibbs # Website: https://linuxgsm.com -# Description: Resolves startup issue with Last Oasis +# Description: Resolves installation issue with Last Oasis functionselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" local APPID_FILE=${executabledir}/steam_appid.txt if [ ! -f "${APPID_FILE}" ]; then + fn_print_information "add ${APPID_FILE} to ${gamename} server." echo "903950" > ${APPID_FILE} +else + fn_print_information "${APPID_FILE} already exists. No action to be taken." fi \ No newline at end of file From 590bcbd6b344ae3b77f2733ebf152961ee5b06cc Mon Sep 17 00:00:00 2001 From: Claiyc Date: Sun, 1 Aug 2021 22:50:13 +0200 Subject: [PATCH 037/164] minor --- lgsm/functions/fix_lo.sh | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/lgsm/functions/fix_lo.sh b/lgsm/functions/fix_lo.sh index c64a90b2d..608aa587f 100644 --- a/lgsm/functions/fix_lo.sh +++ b/lgsm/functions/fix_lo.sh @@ -8,8 +8,10 @@ functionselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" local APPID_FILE=${executabledir}/steam_appid.txt if [ ! -f "${APPID_FILE}" ]; then - fn_print_information "add ${APPID_FILE} to ${gamename} server." + fn_print_information "adding ${APPID_FILE} to ${gamename} server." + fn_sleep_time echo "903950" > ${APPID_FILE} else fn_print_information "${APPID_FILE} already exists. No action to be taken." + fn_sleep_time fi \ No newline at end of file From 49c3b09df91eeadf1a5e2e81d6bb02128a1a77ce Mon Sep 17 00:00:00 2001 From: Claiyc <58397976+Claiyc@users.noreply.github.com> Date: Sun, 1 Aug 2021 23:16:23 +0200 Subject: [PATCH 038/164] add doublequotes in fix_lo.sh --- lgsm/functions/fix_lo.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lgsm/functions/fix_lo.sh b/lgsm/functions/fix_lo.sh index 608aa587f..466d6abd0 100644 --- a/lgsm/functions/fix_lo.sh +++ b/lgsm/functions/fix_lo.sh @@ -10,8 +10,8 @@ local APPID_FILE=${executabledir}/steam_appid.txt if [ ! -f "${APPID_FILE}" ]; then fn_print_information "adding ${APPID_FILE} to ${gamename} server." fn_sleep_time - echo "903950" > ${APPID_FILE} + echo "903950" > "${APPID_FILE}" else fn_print_information "${APPID_FILE} already exists. No action to be taken." fn_sleep_time -fi \ No newline at end of file +fi From a826e61e41658f0c6d233c547ddcbf9db714f6de Mon Sep 17 00:00:00 2001 From: Clemens Mol Date: Fri, 6 Aug 2021 21:39:55 +0200 Subject: [PATCH 039/164] fix(mcb): resolve failing to check remote build (#3521) * mcbserver update working again * fix(mcbserver) better random and added comment * code styling fix. Codacy Static Code Analysis wasn't happy * style update --- lgsm/functions/update_minecraft_bedrock.sh | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/lgsm/functions/update_minecraft_bedrock.sh b/lgsm/functions/update_minecraft_bedrock.sh index f109a52e3..f4054ae00 100644 --- a/lgsm/functions/update_minecraft_bedrock.sh +++ b/lgsm/functions/update_minecraft_bedrock.sh @@ -7,8 +7,11 @@ functionselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" +#random number for userAgent +randnum=$((1 + RANDOM % 5000)) + fn_update_minecraft_dl(){ - latestmcbuildurl=$(curl -Ls "https://www.minecraft.net/en-us/download/server/bedrock/" | grep -o 'https://minecraft.azureedge.net/bin-linux/[^"]*zip') + latestmcbuildurl=$(curl -H "Accept-Encoding: identity" -H "Accept-Language: en" -Ls -A "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.${randnum}.212 Safari/537.36" "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 @@ -79,7 +82,7 @@ fn_update_minecraft_localbuild(){ fn_update_minecraft_remotebuild(){ # Gets remote build info. - 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]") + remotebuild=$(curl -H "Accept-Encoding: identity" -H "Accept-Language: en" -Ls -A "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.${randnum}.212 Safari/537.36" "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 79b60561a033d74936e7923d1e1f254441cf939b Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Fri, 6 Aug 2021 20:43:22 +0100 Subject: [PATCH 040/164] v21.2.5 --- 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 55b23a590..6d9f4303d 100755 --- a/lgsm/functions/core_functions.sh +++ b/lgsm/functions/core_functions.sh @@ -8,7 +8,7 @@ functionselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" -modulesversion="v21.2.4" +modulesversion="v21.2.5" # Core diff --git a/linuxgsm.sh b/linuxgsm.sh index 7173fe0ba..462ea09ad 100755 --- a/linuxgsm.sh +++ b/linuxgsm.sh @@ -20,7 +20,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="v21.2.4" +version="v21.2.5" shortname="core" gameservername="core" commandname="CORE" diff --git a/tests/tests_fctrserver.sh b/tests/tests_fctrserver.sh index a4686684a..9b47f763d 100644 --- a/tests/tests_fctrserver.sh +++ b/tests/tests_fctrserver.sh @@ -20,7 +20,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="v21.2.4" +version="v21.2.5" shortname="fctr" gameservername="fctrserver" commandname="CORE" diff --git a/tests/tests_jc2server.sh b/tests/tests_jc2server.sh index f39dc0476..da0fd91ce 100644 --- a/tests/tests_jc2server.sh +++ b/tests/tests_jc2server.sh @@ -20,7 +20,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="v21.2.4" +version="v21.2.5" shortname="jc2" gameservername="jc2server" commandname="CORE" diff --git a/tests/tests_mcserver.sh b/tests/tests_mcserver.sh index a426a07e9..501b64a43 100644 --- a/tests/tests_mcserver.sh +++ b/tests/tests_mcserver.sh @@ -20,7 +20,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="v21.2.4" +version="v21.2.5" shortname="mc" gameservername="mcserver" commandname="CORE" diff --git a/tests/tests_ts3server.sh b/tests/tests_ts3server.sh index 32cb17c49..b9941598a 100644 --- a/tests/tests_ts3server.sh +++ b/tests/tests_ts3server.sh @@ -20,7 +20,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="v21.2.4" +version="v21.2.5" shortname="ts3" gameservername="ts3server" commandname="CORE" From 6521320df133cf4472d9b8aeb281e7719166934d Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Tue, 31 Aug 2021 21:53:23 +0100 Subject: [PATCH 041/164] feat(info): refactor info modules (#3428) * add new details to queryraw * fix httpport ac server * correct info bug for bt1944server * added bt1944 to info_parms update info messages bt1944ports * steamport * raw port raw * message display * check_root bug * add more ports merge words * arma 3 improvements * master port * add arma3 ports * portnames * strip ./ from executable * exec * integrate ss * replace netstat with ss * port header headerr * remove inbound outbound * ark * shorten executable * change to port display * add info_distro * response * acserver improvements acserver ac * add assettocorsa query * ss * rawport * update av server exec merge av changes * av ports * av ss bug * av * avserver * remove port * port changes * listen * col * bt1944 * cmw cmw * cmw * changes * etl * add servers * hw * inss ins * add rcon to insserver * rcon * jc * jc3 minecraft * mcb * onset * Memories of mars * mumble * changes * steamport * tcp query * udp * fix * steamport * info_distro now required before parms * srcdslinuxopid * srcds_linux * hlds_linux * ins * date * ns2 * rising world rising world query port rising world javaram rising world a * rising world ports * portipv6 * add ports to query raw * add Rising World Query * fix rising world game mode * update 7 Days to Die * port3 * increased sdtd glibc to 2.27 * corrected starbound ports location * starbound * added new SteamCMD error code * Master server check if query raw * Stationeers * stationeers * webadmin * added extra query ports for ts3 a * add teamspeak3 query * add ts3 query details * ts3 version * queryport reverts back once gamedig finished * added telnetport to ts3 * fix TS3 bug causing shutdown when starting debug the fix was running and killing a running server * show start parameters for ts3 * tower unite * terraria * terraria * ss command in dev-query-raw info_messages.sh * ut4 and others * more updates * soldat * col vint * pvr query port tab * pvr query type tcp * pvr gameport+400 * changed to shortname * unreal99 * ut99 beacon * httpport * ut2k4 * kf * kf * bug * httpport * httpport * more kf ports * lan port * steammasterport * kf * ports * ports * ut2k4 * ut2k4 * lanport * lanport * ro * ro * kf2 * httpport * update naming * ut3 * ut3 * ut3 * mom * mom * reshuffle * sort list * function re-shuffle * merge info_parms and info_config into info_game.sh a * updated source filters * added ac to edit ports array * Revert "updated source filters" This reverts commit e8621eaed6d7b7f38fa3911858a4c28a0e4dcc18. * spaces * fix typo * tidy * re ordered ports edit array * added java * add bf1942 * Added Last Oasis * corrected pc function name * re ordered in alpha * space * remove space --- .../config-lgsm/acserver/_default.cfg | 2 +- .../config-lgsm/avserver/_default.cfg | 6 +- .../config-lgsm/csgoserver/_default.cfg | 1 + .../config-lgsm/inssserver/_default.cfg | 4 +- .../config-lgsm/pvrserver/_default.cfg | 2 +- .../config-lgsm/rwserver/_default.cfg | 4 +- .../config-lgsm/sdtdserver/_default.cfg | 2 +- .../config-lgsm/ts3server/_default.cfg | 2 +- lgsm/data/serverlist.csv | 2 +- lgsm/functions/alert.sh | 2 +- lgsm/functions/check_ip.sh | 3 +- lgsm/functions/check_root.sh | 3 + lgsm/functions/command_debug.sh | 9 +- lgsm/functions/command_details.sh | 6 +- lgsm/functions/command_dev_query_raw.sh | 208 +- lgsm/functions/command_monitor.sh | 5 +- lgsm/functions/command_postdetails.sh | 4 +- lgsm/functions/command_restart.sh | 2 +- lgsm/functions/command_start.sh | 10 +- lgsm/functions/command_stop.sh | 2 +- lgsm/functions/command_test_alert.sh | 2 +- lgsm/functions/core_dl.sh | 10 +- lgsm/functions/core_functions.sh | 11 +- lgsm/functions/fix_ts3.sh | 2 +- lgsm/functions/info_distro.sh | 10 +- .../{info_config.sh => info_game.sh} | 2258 ++++++++++------- lgsm/functions/info_messages.sh | 1130 ++++----- lgsm/functions/info_parms.sh | 332 --- lgsm/functions/query_gamedig.sh | 17 +- tests/tests_fctrserver.sh | 2 +- tests/tests_jc2server.sh | 2 +- tests/tests_mcserver.sh | 2 +- tests/tests_ts3server.sh | 2 +- 33 files changed, 2190 insertions(+), 1869 deletions(-) rename lgsm/functions/{info_config.sh => info_game.sh} (79%) mode change 100755 => 100644 delete mode 100755 lgsm/functions/info_parms.sh diff --git a/lgsm/config-default/config-lgsm/acserver/_default.cfg b/lgsm/config-default/config-lgsm/acserver/_default.cfg index 728671a7a..6dbcf68e6 100644 --- a/lgsm/config-default/config-lgsm/acserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/acserver/_default.cfg @@ -139,7 +139,7 @@ stopmode="2" # 4: gsquery # 5: tcp querymode="5" -querytype="" +querytype="assettocorsa" ## Console type consoleverbose="yes" diff --git a/lgsm/config-default/config-lgsm/avserver/_default.cfg b/lgsm/config-default/config-lgsm/avserver/_default.cfg index 17d670d0f..2eef21849 100644 --- a/lgsm/config-default/config-lgsm/avserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/avserver/_default.cfg @@ -9,7 +9,7 @@ #### Game Server Settings #### ## Predefined Parameters | https://docs.linuxgsm.com/configuration/start-parameters -port="27000" + # https://steamidfinder.com adminsteamid="" if [ -n "${adminsteamid}" ]; then @@ -160,8 +160,8 @@ glibc="2.15" avdatapath="${serverfiles}/galaxy" avgalaxypath="${avdatapath}/${selfname}" systemdir="${serverfiles}" -executabledir="${systemdir}" -executable="./server.sh" +executabledir="${systemdir}/bin" +executable="./bin/AvorionServer" servercfgdir="${avgalaxypath}" servercfg="server.ini" servercfgdefault="server.ini" diff --git a/lgsm/config-default/config-lgsm/csgoserver/_default.cfg b/lgsm/config-default/config-lgsm/csgoserver/_default.cfg index 28f3082b3..564ac84a3 100644 --- a/lgsm/config-default/config-lgsm/csgoserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/csgoserver/_default.cfg @@ -26,6 +26,7 @@ ip="0.0.0.0" port="27015" clientport="27005" sourcetvport="27020" +steamport="26901" defaultmap="de_mirage" maxplayers="16" tickrate="64" diff --git a/lgsm/config-default/config-lgsm/inssserver/_default.cfg b/lgsm/config-default/config-lgsm/inssserver/_default.cfg index e9895b132..1dbc0889f 100644 --- a/lgsm/config-default/config-lgsm/inssserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/inssserver/_default.cfg @@ -12,6 +12,8 @@ ip="0.0.0.0" port="27102" queryport="27131" +rconport="27015" +rconpassword="" servername="LinuxGSM Server" defaultmap="Canyon" defaultscenario="Scenario_Crossing_Push_Security" @@ -19,7 +21,7 @@ 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 -startparameters="${defaultmap}?Scenario=${defaultscenario}?MaxPlayers=${maxplayers} -Port=${port} -QueryPort=${queryport} -hostname='${servername}' -log" +startparameters="${defaultmap}?Scenario=${defaultscenario}?MaxPlayers=${maxplayers} -Port=${port} -QueryPort=${queryport} -hostname='${servername}' -Rcon -RconPassword=${rconpassword} -RconListenPort=${rconport} -log" #### LinuxGSM Settings #### diff --git a/lgsm/config-default/config-lgsm/pvrserver/_default.cfg b/lgsm/config-default/config-lgsm/pvrserver/_default.cfg index 3fa9a8864..ed65d0f2f 100644 --- a/lgsm/config-default/config-lgsm/pvrserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/pvrserver/_default.cfg @@ -139,7 +139,7 @@ stopmode="2" # 3: gamedig # 4: gsquery # 5: tcp -querymode="1" +querymode="5" querytype="" ## Console type diff --git a/lgsm/config-default/config-lgsm/rwserver/_default.cfg b/lgsm/config-default/config-lgsm/rwserver/_default.cfg index 3ff7bc137..0ff3726ba 100644 --- a/lgsm/config-default/config-lgsm/rwserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/rwserver/_default.cfg @@ -135,8 +135,8 @@ stopmode="3" # 3: gamedig # 4: gsquery # 5: tcp -querymode="1" -querytype="" +querymode="2" +querytype="protocol-valve" ## Console type consoleverbose="yes" diff --git a/lgsm/config-default/config-lgsm/sdtdserver/_default.cfg b/lgsm/config-default/config-lgsm/sdtdserver/_default.cfg index d8ca86974..7c985a636 100644 --- a/lgsm/config-default/config-lgsm/sdtdserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/sdtdserver/_default.cfg @@ -146,7 +146,7 @@ consoleinteract="no" # Do not edit gamename="7 Days To Die" engine="unity3d" -glibc="2.15" +glibc="2.27" #### 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 3bfaf5d10..694b0501f 100644 --- a/lgsm/config-default/config-lgsm/ts3server/_default.cfg +++ b/lgsm/config-default/config-lgsm/ts3server/_default.cfg @@ -123,7 +123,7 @@ stopmode="2" # 4: gsquery # 5: tcp querymode="5" -querytype="" +querytype="teamspeak3" ## Console type consoleverbose="yes" diff --git a/lgsm/data/serverlist.csv b/lgsm/data/serverlist.csv index 249f1616d..524826a33 100644 --- a/lgsm/data/serverlist.csv +++ b/lgsm/data/serverlist.csv @@ -108,8 +108,8 @@ ut2k4,ut2k4server,Unreal Tournament 2004 ut3,ut3server,Unreal Tournament 3 ut99,ut99server,Unreal Tournament 99 vh,vhserver,Valheim -vs,vsserver,Vampire Slayer vints,vintsserver,Vintage Story +vs,vsserver,Vampire Slayer wet,wetserver,Wolfenstein: Enemy Territory wf,wfserver,Warfork wmc,wmcserver,WaterfallMC diff --git a/lgsm/functions/alert.sh b/lgsm/functions/alert.sh index 5fd999728..782c6e9a4 100755 --- a/lgsm/functions/alert.sh +++ b/lgsm/functions/alert.sh @@ -11,7 +11,7 @@ functionselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" # Used with email alerts. fn_alert_log(){ info_distro.sh - info_config.sh + info_game.sh info_messages.sh if [ -f "${alertlog}" ]; then rm -f "${alertlog:?}" diff --git a/lgsm/functions/check_ip.sh b/lgsm/functions/check_ip.sh index ae1b99b77..09b948ccd 100755 --- a/lgsm/functions/check_ip.sh +++ b/lgsm/functions/check_ip.sh @@ -8,8 +8,7 @@ functionselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" -info_config.sh -info_parms.sh +info_game.sh if [ ! -f "/bin/ip" ]; then ipcommand="/sbin/ip" diff --git a/lgsm/functions/check_root.sh b/lgsm/functions/check_root.sh index 1eb6309cb..13942cbd4 100755 --- a/lgsm/functions/check_root.sh +++ b/lgsm/functions/check_root.sh @@ -12,6 +12,9 @@ if [ "$(whoami)" = "root" ]; then fn_print_fail_nl "Do NOT run this script as root!" if [ -d "${lgsmlogdir}" ]; then fn_script_log_fatal "${selfname} attempted to run as root." + else + # Forces exit code is log does not yet exist. + exitcode=1 fi core_exit.sh fi diff --git a/lgsm/functions/command_debug.sh b/lgsm/functions/command_debug.sh index aac203ac9..a9cceebdb 100755 --- a/lgsm/functions/command_debug.sh +++ b/lgsm/functions/command_debug.sh @@ -27,7 +27,7 @@ fn_lockfile_trap(){ check.sh fix.sh info_distro.sh -info_config.sh +info_game.sh # NOTE: Check if works with server without parms. Could be intergrated in to info_parms.sh. fn_print_header { @@ -104,7 +104,12 @@ echo "${port}" >> "${lockdir}/${selfname}.lock" fn_script_log_info "Lockfile generated" fn_script_log_info "${lockdir}/${selfname}.lock" -cd "${executabledir}" || exit +if [ "${shortname}" == "av" ]; then + cd "${systemdir}" || exit +else + cd "${executabledir}" || exit +fi + # Note: do not add double quotes to ${executable} ${startparameters}. if [ "${engine}" == "source" ]||[ "${engine}" == "goldsrc" ]; then ${executable} ${startparameters} -debug diff --git a/lgsm/functions/command_details.sh b/lgsm/functions/command_details.sh index 14765ca99..2daeeb2f7 100755 --- a/lgsm/functions/command_details.sh +++ b/lgsm/functions/command_details.sh @@ -12,9 +12,8 @@ fn_firstcommand_set # Run checks and gathers details to display. check.sh -info_config.sh -info_parms.sh info_distro.sh +info_game.sh info_messages.sh if [ "${querymode}" == "2" ]||[ "${querymode}" == "3" ]; then for queryip in "${queryips[@]}"; do @@ -31,9 +30,10 @@ fn_info_message_gameserver fn_info_message_script fn_info_message_backup # Some game servers do not have parms. -if [ "${shortname}" != "ts3" ]&&[ "${shortname}" != "jc2" ]&&[ "${shortname}" != "dst" ]&&[ "${shortname}" != "pz" ]&&[ "${engine}" != "renderware" ]; then +if [ "${shortname}" != "jc2" ]&&[ "${shortname}" != "dst" ]&&[ "${shortname}" != "pz" ]&&[ "${engine}" != "renderware" ]; then fn_info_message_commandlineparms fi +fn_info_message_ports_edit fn_info_message_ports fn_info_message_select_engine fn_info_message_statusbottom diff --git a/lgsm/functions/command_dev_query_raw.sh b/lgsm/functions/command_dev_query_raw.sh index 7c2dd95f9..c9123ebcb 100755 --- a/lgsm/functions/command_dev_query_raw.sh +++ b/lgsm/functions/command_dev_query_raw.sh @@ -11,25 +11,204 @@ functionselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" fn_firstcommand_set check.sh -info_config.sh -info_parms.sh +info_game.sh +info_distro.sh +info_messages.sh echo -e "" -echo -e "Query Port - Raw Output" +echo -e "${lightgreen}Query IP Addresses${default}" echo -e "==================================================================" echo -e "" -echo -e "QUERY IP" for queryip in "${queryips[@]}"; do echo -e "${queryip}" done +echo -e "" +echo -e "${lightgreen}Game Server Ports${default}" +echo -e "==================================================================" +{ +echo -e "${lightblue}Port Name \tPort Number \tStatus \tTCP \tUDP${default}" +if [ -v port ]; then + echo -e "Game: \t${port} \t$(ss -tupl|grep ${port}|wc -l) \t$(ss -tupl|grep ${port}|grep tcp|awk '{ print $2 }') \t$(ss -tupl|grep ${port}|grep udp|awk '{ print $2 }')" +else + echo -e "Game:" +fi +if [ "${shortname}" == "rw" ]; then + if [ -v port2 ]; then + echo -e "Game+1: \t${port2} \t$(ss -tupl|grep ${port}|wc -l) \t$(ss -tupl|grep ${port2}|grep tcp|awk '{ print $2 }') \t$(ss -tupl|grep ${port2}|grep udp|awk '{ print $2 }')" + else + echo -e "Game+1:" + fi + + if [ -v port3 ]; then + echo -e "Game+2: \t${port3} \t$(ss -tupl|grep ${port}|wc -l) \t$(ss -tupl|grep ${port3}|grep tcp|awk '{ print $2 }') \t$(ss -tupl|grep ${port3}|grep udp|awk '{ print $2 }')" + else + echo -e "Game+2:" + fi + + if [ -v port4 ]; then + echo -e "Game+3: \t${port4} \t$(ss -tupl|grep ${port}|wc -l) \t$(ss -tupl|grep ${port4}|grep tcp|awk '{ print $2 }') \t$(ss -tupl|grep ${port4}|grep udp|awk '{ print $2 }')" + else + echo -e "Game+3:" + fi +fi + +if [ -v port401 ]; then + echo -e "Game+400: \t${port401} \t$(ss -tupl|grep ${port401}|wc -l) \t$(ss -tupl|grep ${port401}|grep tcp|awk '{ print $2 }') \t$(ss -tupl|grep ${port401}|grep udp|awk '{ print $2 }')" +else + echo -e "Game+400:" +fi + +if [ -v portipv6 ]; then + echo -e "Game ipv6: \t${portipv6} \t$(ss -tupl|grep ${portipv6}|wc -l) \t$(ss -tupl|grep ${portipv6}|grep tcp|awk '{ print $2 }') \t$(ss -tupl|grep ${portipv6}|grep udp|awk '{ print $2 }')" +else + echo -e "Game ipv6:" +fi + +if [ -v queryport ]; then + echo -e "Query: \t${queryport} \t$(ss -tupl|grep ${queryport}|wc -l) \t$(ss -tupl|grep ${queryport}|grep tcp|awk '{ print $2 }') \t$(ss -tupl|grep ${queryport}|grep udp|awk '{ print $2 }')" +else + echo -e "Query:" +fi + +if [ -v httpport ]; then + echo -e "HTTP: \t${httpport} \t$(ss -tupl|grep ${httpport}|wc -l) \t$(ss -tupl|grep ${httpport}|grep tcp|awk '{ print $2 }') \t$(ss -tupl|grep ${httpport}|grep udp|awk '{ print $2 }')" +else + echo -e "HTTP:" +fi + +if [ -v httpqueryport ]; then + echo -e "HTTP Query: \t${httpqueryport} \t$(ss -tupl|grep ${httpqueryport}|wc -l) \t$(ss -tupl|grep ${httpqueryport}|grep tcp|awk '{ print $2 }') \t$(ss -tupl|grep ${httpqueryport}|grep udp|awk '{ print $2 }')" +else + echo -e "HTTP Query:" +fi + + +if [ -v webadminport ]; then + echo -e "Web Admin: \t${webadminport} \t$(ss -tupl|grep ${webadminport}|wc -l) \t$(ss -tupl|grep ${webadminport}|grep tcp|awk '{ print $2 }') \t$(ss -tupl|grep ${webadminport}|grep udp|awk '{ print $2 }')" +else + echo -e "Web Admin:" +fi + +if [ -v clientport ]; then + echo -e "Client: \t${clientport} \t$(ss -tupl|grep ${clientport}|wc -l) \t$(ss -tupl|grep ${clientport}|grep tcp|awk '{ print $2 }') \t$(ss -tupl|grep ${clientport}|grep udp|awk '{ print $2 }')" +else + echo -e "Client:" +fi + +if [ -v rconport ]; then + echo -e "RCON: \t${rconport} \t$(ss -tupl|grep ${rconport}|wc -l) \t$(ss -tupl|grep ${rconport}|grep tcp|awk '{ print $2 }') \t$(ss -tupl|grep ${rconport}|grep udp|awk '{ print $2 }')" +else + echo -e "RCON:" +fi + +if [ -v rawport ]; then + echo -e "RAW UDP Socket: \t${rawport} \t$(ss -tupl|grep ${rawport}|wc -l) \t$(ss -tupl|grep ${rawport}|grep tcp|awk '{ print $2 }') \t$(ss -tupl|grep ${rawport}|grep udp|awk '{ print $2 }')" +else + echo -e "RAW UDP Socket:" +fi + +if [ -v masterport ]; then + echo -e "Game: Master: \t${masterport} \t$(ss -tupl|grep ${masterport}|wc -l) \t$(ss -tupl|grep ${masterport}|grep tcp|awk '{ print $2 }') \t$(ss -tupl|grep ${masterport}|grep udp|awk '{ print $2 }')" +else + echo -e "Game: Master:" +fi + +if [ -v steamport ]; then + echo -e "Steam: \t${steamport} \t$(ss -tupl|grep ${steamport}|wc -l) \t$(ss -tupl|grep ${steamport}|grep tcp|awk '{ print $2 }') \t$(ss -tupl|grep ${steamport}|grep udp|awk '{ print $2 }')" +else + echo -e "Steam:" +fi + +if [ -v steamauthport ]; then + echo -e "Steam: Auth: \t${steamauthport} \t$(ss -tupl|grep ${steamauthport}|wc -l) \t$(ss -tupl|grep ${steamauthport}|grep tcp|awk '{ print $2 }') \t$(ss -tupl|grep ${steamauthport}|grep udp|awk '{ print $2 }')" +else + echo -e "Steam: Auth:" +fi + +if [ -v steammasterport ]; then + echo -e "Steam: Master: \t${steammasterport} \t$(ss -tupl|grep ${steammasterport}|wc -l) \t$(ss -tupl|grep ${steammasterport}|grep tcp|awk '{ print $2 }') \t$(ss -tupl|grep ${steammasterport}|grep udp|awk '{ print $2 }')" +else + echo -e "Steam: Master:" +fi + +if [ -v steamqueryport ]; then + echo -e "Steam: Query: \t${steamqueryport} \t$(ss -tupl|grep ${steamqueryport}|wc -l) \t$(ss -tupl|grep ${steamqueryport}|grep tcp|awk '{ print $2 }') \t$(ss -tupl|grep ${steamqueryport}|grep udp|awk '{ print $2 }')" +else + echo -e "Steam: Query:" +fi +if [ -v beaconport ]; then + echo -e "Beacon: \t${beaconport} \t$(ss -tupl|grep ${beaconport}|wc -l) \t$(ss -tupl|grep ${beaconport}|grep tcp|awk '{ print $2 }') \t$(ss -tupl|grep ${beaconport}|grep udp|awk '{ print $2 }')" +else + echo -e "Beacon:" +fi + +if [ -v appport ]; then + echo -e "App: \t${appport} \t$(ss -tupl|grep ${appport}|wc -l) \t$(ss -tupl|grep ${appport}|grep tcp|awk '{ print $2 }') \t$(ss -tupl|grep ${appport}|grep udp|awk '{ print $2 }')" +else + echo -e "App:" +fi + +if [ -v telnetport ]; then + echo -e "Telnet: \t${telnetport} \t$(ss -tupl|grep ${telnetport}|wc -l) \t$(ss -tupl|grep ${telnetport}|grep tcp|awk '{ print $2 }') \t$(ss -tupl|grep ${telnetport}|grep udp|awk '{ print $2 }')" +else + echo -e "Telnet:" +fi + +if [ -v sourcetvport ]; then + echo -e "SourceTV: \t${sourcetvport} \t$(ss -tupl|grep ${sourcetvport}|wc -l) \t$(ss -tupl|grep ${sourcetvport}|grep tcp|awk '{ print $2 }') \t$(ss -tupl|grep ${sourcetvport}|grep udp|awk '{ print $2 }')" +else + echo -e "SourceTV:" +fi + +if [ -v fileport ]; then + echo -e "File: \t${fileport} \t$(ss -tupl|grep ${fileport}|wc -l) \t$(ss -tupl|grep ${fileport}|grep tcp|awk '{ print $2 }') \t$(ss -tupl|grep ${fileport}|grep udp|awk '{ print $2 }')" +else + echo -e "File:" +fi + +if [ -v udplinkport ]; then + echo -e "UDP Link: \t${udplinkport} \t$(ss -tupl|grep ${udplinkport}|wc -l) \t$(ss -tupl|grep ${udplinkport}|grep tcp|awk '{ print $2 }') \t$(ss -tupl|grep ${udplinkport}|grep udp|awk '{ print $2 }')" +else + echo -e "UDP Link:" +fi + +if [ -v voiceport ]; then + echo -e "Voice: \t${voiceport} \t$(ss -tupl|grep ${voiceport}|wc -l) \t$(ss -tupl|grep ${voiceport}|grep tcp|awk '{ print $2 }') \t$(ss -tupl|grep ${voiceport}|grep udp|awk '{ print $2 }')" +else + echo -e "Voice:" +fi + +if [ -v voiceunusedport ]; then + echo -e "Voice (Unused): \t${voiceunusedport} \t$(ss -tupl|grep ${voiceunusedport}|wc -l) \t$(ss -tupl|grep ${voiceunusedport}|grep tcp|awk '{ print $2 }') \t$(ss -tupl|grep ${voiceunusedport}|grep udp|awk '{ print $2 }')" +else + echo -e "Voice (Unused):" +fi + +if [ -v battleeyeport ]; then + echo -e "BattleEye: \t${battleeyeport} \t$(ss -tupl|grep ${battleeyeport}|wc -l) \t$(ss -tupl|grep ${battleeyeport}|grep tcp|awk '{ print $2 }') \t$(ss -tupl|grep ${battleeyeport}|grep udp|awk '{ print $2 }')" +else + echo -e "BattleEye:" +fi + +if [ -v statsport ]; then + echo -e "Stats: \t${battleeyeport} \t$(ss -tupl|grep ${statsport}|wc -l) \t$(ss -tupl|grep ${statsport}|grep tcp|awk '{ print $2 }') \t$(ss -tupl|grep ${statsport}|grep udp|awk '{ print $2 }')" +else + echo -e "Stats:" +fi + +} | column -s $'\t' -t +echo -e "" +echo -e "${lightgreen}SS Output${default}" echo -e "=================================" -echo -e "Ports" -echo -e "=================================" +fn_info_message_ports +echo -e "" +echo -e "${lightgreen}Query Port - Raw Output${default}" +echo -e "==================================================================" echo -e "" echo -e "PORT: ${port}" echo -e "QUERY PORT: ${queryport}" echo -e "" -echo -e "Gamedig Raw Output" +echo -e "${lightgreen}Gamedig Raw Output${default}" echo -e "=================================" echo -e "" if [ ! "$(command -v gamedig 2>/dev/null)" ]; then @@ -45,7 +224,7 @@ for queryip in "${queryips[@]}"; do echo "${gamedigraw}" | jq done echo -e "" -echo -e "gsquery Raw Output" +echo -e "${lightgreen}gsquery Raw Output${default}" echo -e "=================================" echo -e "" for queryip in "${queryips[@]}"; do @@ -57,7 +236,7 @@ for queryip in "${queryips[@]}"; do "${functionsdir}"/query_gsquery.py -a "${queryip}" -p "${queryport}" -e "${querytype}" done echo -e "" -echo -e "TCP Raw Output" +echo -e "${lightgreen}TCP Raw Output${default}" echo -e "=================================" echo -e "" for queryip in "${queryips[@]}"; do @@ -73,10 +252,10 @@ for queryip in "${queryips[@]}"; do fi done echo -e "" -echo -e "Game Port - Raw Output" +echo -e "${lightgreen}Game Port - Raw Output${default}" echo -e "==================================================================" echo -e "" -echo -e "TCP Raw Output" +echo -e "${lightgreen}TCP Raw Output${default}" echo -e "=================================" echo -e "" for queryip in "${queryips[@]}"; do @@ -91,5 +270,12 @@ for queryip in "${queryips[@]}"; do echo -e "TCP query FAIL" fi done +echo -e "" +echo -e "${lightgreen}Steam Master Server Response${default}" +echo -e "==================================================================" +echo -e "" +echo -e "Response: ${displaymasterserver}" +echo -e "" + exitcode=0 core_exit.sh diff --git a/lgsm/functions/command_monitor.sh b/lgsm/functions/command_monitor.sh index 3602bef93..3f4e397e2 100755 --- a/lgsm/functions/command_monitor.sh +++ b/lgsm/functions/command_monitor.sh @@ -74,12 +74,10 @@ 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, 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, queryport is not set" - fn_print_error_eol_nl fi core_exit.sh fi @@ -227,8 +225,7 @@ fn_monitor_loop(){ monitorflag=1 check.sh core_logs.sh -info_config.sh -info_parms.sh +info_game.sh # query pre-checks fn_monitor_check_lockfile diff --git a/lgsm/functions/command_postdetails.sh b/lgsm/functions/command_postdetails.sh index fa2907b1e..f8b36fb61 100755 --- a/lgsm/functions/command_postdetails.sh +++ b/lgsm/functions/command_postdetails.sh @@ -31,8 +31,7 @@ if [ "${exitbypass}" ]; then else # Run checks and gathers details to display. check.sh - info_config.sh - info_parms.sh + info_game.sh info_distro.sh info_messages.sh for queryip in "${queryips[@]}" @@ -54,6 +53,7 @@ else if [ "${shortname}" != "jc2" ]&&[ "${shortname}" != "jc3" ]&&[ "${shortname}" != "dst" ]&&[ "${shortname}" != "pz" ]&&[ "${engine}" != "renderware" ]; then fn_info_message_commandlineparms fi + fn_info_message_ports_edit fn_info_message_ports fn_info_message_select_engine fn_info_message_statusbottom diff --git a/lgsm/functions/command_restart.sh b/lgsm/functions/command_restart.sh index 47a6b904c..3bf60c32c 100755 --- a/lgsm/functions/command_restart.sh +++ b/lgsm/functions/command_restart.sh @@ -10,7 +10,7 @@ commandaction="Restarting" functionselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" fn_firstcommand_set -info_config.sh +info_game.sh exitbypass=1 command_stop.sh command_start.sh diff --git a/lgsm/functions/command_start.sh b/lgsm/functions/command_start.sh index caa933320..58ecfcff7 100755 --- a/lgsm/functions/command_start.sh +++ b/lgsm/functions/command_start.sh @@ -72,7 +72,13 @@ fn_start_tmux(){ echo "${version}" >> "${lockdir}/${selfname}.lock" echo "${port}" >> "${lockdir}/${selfname}.lock" fn_reload_startparameters - cd "${executabledir}" || exit + + if [ "${shortname}" == "av" ]; then + cd "${systemdir}" || exit + else + cd "${executabledir}" || exit + fi + tmux new-session -d -x "${sessionwidth}" -y "${sessionheight}" -s "${sessionname}" "${preexecutable} ${executable} ${startparameters}" 2> "${lgsmlogdir}/.${selfname}-tmux-error.tmp" # Create logfile. @@ -185,7 +191,7 @@ fi if [ -z "${fixbypass}" ]; then fix.sh fi -info_config.sh +info_game.sh core_logs.sh # Will check for updates is updateonstart is yes. diff --git a/lgsm/functions/command_stop.sh b/lgsm/functions/command_stop.sh index f0a0bf92c..ef54b525c 100644 --- a/lgsm/functions/command_stop.sh +++ b/lgsm/functions/command_stop.sh @@ -269,7 +269,7 @@ fn_stop_pre_check(){ check.sh fn_print_dots "${servername}" -info_config.sh +info_game.sh fn_stop_pre_check # Remove lockfile. if [ -f "${lockdir}/${selfname}.lock" ]; then diff --git a/lgsm/functions/command_test_alert.sh b/lgsm/functions/command_test_alert.sh index 9397a445c..7fe61e48a 100755 --- a/lgsm/functions/command_test_alert.sh +++ b/lgsm/functions/command_test_alert.sh @@ -12,7 +12,7 @@ fn_firstcommand_set fn_print_dots "${servername}" check.sh -info_config.sh +info_game.sh alert="test" alert.sh diff --git a/lgsm/functions/core_dl.sh b/lgsm/functions/core_dl.sh index 2c8c269bf..9d80913a7 100755 --- a/lgsm/functions/core_dl.sh +++ b/lgsm/functions/core_dl.sh @@ -92,9 +92,14 @@ fn_dl_steamcmd(){ 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" - fn_script_log_fatal "${commandaction} ${selfname}: ${remotelocation}: Not enough space to download server files" + fn_print_failure_nl "${commandaction} ${selfname}: ${remotelocation}: Not enough disk space to download server files" + fn_script_log_fatal "${commandaction} ${selfname}: ${remotelocation}: Not enough disk space to download server files" core_exit.sh + # Not enough space. + elif [ -n "$(grep "0x212" "${steamcmdlog}" | tail -1)" ]; then + fn_print_failure_nl "${commandaction} ${selfname}: ${remotelocation}: Not enough disk space to download server files" + fn_script_log_fatal "${commandaction} ${selfname}: ${remotelocation}: Not enough disk 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} ${selfname}: ${remotelocation}: Steam account does not have a license for the required game" @@ -116,6 +121,7 @@ fn_dl_steamcmd(){ fn_script_log_error "${commandaction} ${selfname}: ${remotelocation}: Update required but not completed - check network" else fn_print_error2_nl "${commandaction} ${selfname}: ${remotelocation}: Unknown error occured" + echo -en "Please provide content log to LinuxGSM developers https://linuxgsm.com/steamcmd-error" fn_script_log_error "${commandaction} ${selfname}: ${remotelocation}: Unknown error occured" fi elif [ "${exitcode}" != "0" ]; then diff --git a/lgsm/functions/core_functions.sh b/lgsm/functions/core_functions.sh index 59e6b20f5..dd82419a4 100755 --- a/lgsm/functions/core_functions.sh +++ b/lgsm/functions/core_functions.sh @@ -513,17 +513,12 @@ fn_fetch_function # Info -info_stats.sh(){ -functionfile="${FUNCNAME[0]}" -fn_fetch_function -} - -info_config.sh(){ +info_distro.sh(){ functionfile="${FUNCNAME[0]}" fn_fetch_function } -info_distro.sh(){ +info_game.sh(){ functionfile="${FUNCNAME[0]}" fn_fetch_function } @@ -538,7 +533,7 @@ functionfile="${FUNCNAME[0]}" fn_fetch_function } -info_parms.sh(){ +info_stats.sh(){ functionfile="${FUNCNAME[0]}" fn_fetch_function } diff --git a/lgsm/functions/fix_ts3.sh b/lgsm/functions/fix_ts3.sh index b1ed7d84b..021f03764 100755 --- a/lgsm/functions/fix_ts3.sh +++ b/lgsm/functions/fix_ts3.sh @@ -17,7 +17,7 @@ fi # Fixes: failed to register local accounting service: No such file or directory. accountingfile="/dev/shm/7gbhujb54g8z9hu43jre8" -if [ -f "${accountingfile}" ]; then +if [ -f "${accountingfile}" ]&&[ "${status}" == "0" ]; then # Check permissions for the file if the current user owns it, if not exit. if [ "$( stat -c %U ${accountingfile})" == "$(whoami)" ]; then fixname="Delete file ${accountingfile}" diff --git a/lgsm/functions/info_distro.sh b/lgsm/functions/info_distro.sh index 7f0dc2b19..fdfc076ab 100755 --- a/lgsm/functions/info_distro.sh +++ b/lgsm/functions/info_distro.sh @@ -11,6 +11,11 @@ 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}') + if [ "${engine}" == "source" ]; then + srcdslinuxpid=$(ps -ef | grep -v grep | grep "${gameserverpid}" | grep srcds_linux | awk '{print $2}') + elif [ "${engine}" == "goldsrc" ]; then + hldslinuxpid=$(ps -ef | grep -v grep | grep "${gameserverpid}" | grep hlds_linux | awk '{print $2}') + fi fi ### Distro information @@ -268,7 +273,7 @@ fi # 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 + if [ "${steammaster}" == "true" ]||[ ${commandname} == "DEV-QUERY-RAW" ]; then # Will query server IP addresses first. for queryip in "${queryips[@]}"; do 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)" @@ -292,3 +297,6 @@ if [ "${appid}" ]; then glibc="2.14" fi fi + +# Gather Port Info using ss +ssinfo="$(ss -tuplwn)" diff --git a/lgsm/functions/info_config.sh b/lgsm/functions/info_game.sh old mode 100755 new mode 100644 similarity index 79% rename from lgsm/functions/info_config.sh rename to lgsm/functions/info_game.sh index 07960e290..2c3c52584 --- a/lgsm/functions/info_config.sh +++ b/lgsm/functions/info_game.sh @@ -1,9 +1,9 @@ #!/bin/bash -# LinuxGSM info_config.sh module +# LinuxGSM info_game.sh module # Author: Daniel Gibbs # Contributors: http://linuxgsm.com/contrib # Website: https://linuxgsm.com -# Description: Gets specific details from config files. +# Description: Gathers various game server information. functionselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" @@ -14,8 +14,7 @@ functionselfname="$(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(){ +fn_info_game_ac(){ if [ ! -f "${servercfgfullpath}" ]; then httpport="${zero}" port="${zero}" @@ -25,7 +24,7 @@ fn_info_config_assettocorsa(){ else httpport=$(grep "HTTP_PORT" "${servercfgfullpath}" | tr -cd '[:digit:]') port=$(grep "TCP_PORT" "${servercfgfullpath}" | tr -cd '[:digit:]') - queryport="${port}" + queryport="${httpport}" 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]*$//') @@ -39,87 +38,149 @@ fn_info_config_assettocorsa(){ fi } -fn_info_config_justcause2(){ +fn_info_game_ark(){ + # Config + 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 + + # Parameters + port=${port:-"0"} + queryport=${queryport:-"0"} + rconport=${rconport:-"0"} + rawport=$((port+1)) + maxplayers=${maxplayers:-"0"} +} + +fn_info_game_arma3(){ + # Config if [ ! -f "${servercfgfullpath}" ]; then servername="${unavailable}" + adminpassword="${unavailable}" serverpassword="${unavailable}" maxplayers="${zero}" - port="${zero}" - queryport="${zero}" else - servername=$(grep "Name" "${servercfgfullpath}" | sed -e 's/^[ \t]*//g' -e '/^--/d' -e 's/Name//g' | tr -d '=\";,:' | sed -e 's/^[ \t]*//' -e 's/[ \t]*$//') - serverdescription=$(grep "Description" "${servercfgfullpath}" | sed -e 's/^[ \t]*//g' -e '/^--/d' -e 's/Description//g' | tr -d '=\";,:' | sed -e 's/^[ \t]*//' -e 's/[ \t]*$//') - serverpassword=$(grep "Password" "${servercfgfullpath}" | sed -e 's/^ *//g' -e '/^--/d' -e 's/Password//g' | tr -d '=\";,:' | sed -e 's/^[ \t]*//' -e 's/[ \t]*$//') - maxplayers=$(grep "MaxPlayers" "${servercfgfullpath}" | grep -v "\--" | tr -cd '[:digit:]') - port=$(grep "BindPort" "${servercfgfullpath}" | grep -v "\--" | tr -cd '[:digit:]') - queryport="${port}" - 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" + servername=$(grep "hostname" "${servercfgfullpath}" | sed -e 's/^[ \t]*//g' -e '/^\//d' -e 's/hostname//g' | tr -d '=\";,:' | sed -e 's/^[ \t]*//' -e 's/[ \t]*$//') + adminpassword=$(grep "passwordAdmin" "${servercfgfullpath}" | sed -e 's/^[ \t]*//g' -e '/^\//d' -e 's/passwordAdmin//g' | tr -d '=\";,:' | sed -e 's/^[ \t]*//' -e 's/[ \t]*$//') + serverpassword=$(grep "password" "${servercfgfullpath}" | sed -e 's/^[ \t]*//g' -e '/^\//d' -e 's/password//g' | tr -d '=\";,:' | sed -e 's/^[ \t]*//' -e 's/[ \t]*$//') + maxplayers=$(grep "maxPlayers" "${servercfgfullpath}" | grep -v "//" | tr -cd '[:digit:]') # Not Set servername=${servername:-"NOT SET"} + adminpassword=${adminpassword:-"NOT SET"} serverpassword=${serverpassword:-"NOT SET"} maxplayers=${maxplayers:-"0"} - port=${port:-"0"} + fi + + # Parameters + port=${port:-"2302"} + voiceport=${port:-"2302"} + queryport=$((port+1)) + steammasterport=$((port+2)) + voiceunusedport=$((port+3)) + battleeyeport=$((port+4)) +} + +fn_info_game_av() { + 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=//') + + port=$(grep "port=" "${servercfgfullpath}" | sed 's/port=//') + queryport=$((port+3)) + steamqueryport=$((port+20)) + steammasterport=$((port+21)) + rconport=$(grep "rconPort=" "${servercfgfullpath}" | sed 's/rconPort=//') + + rconpassword=$(grep "rconPassword=" "${servercfgfullpath}" | sed 's/rconPassword=//') + if [ -n "${rconpassword}" ]; then + rconenabled="true" + 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_justcause3(){ +fn_info_game_bf1942(){ if [ ! -f "${servercfgfullpath}" ]; then servername="${unavailable}" - serverdescription="${unavailable}" serverpassword="${unavailable}" maxplayers="${zero}" port="${zero}" - queryPort="${zero}" - steamport="${zero}" - tickrate="${zero}" + queryport="${zero}" else - servername=$(grep "name" "${servercfgfullpath}" | sed -e 's/^[ \t]*//g' -e '/^#/d' -e 's/name//g' | tr -d '=\";,:' | sed -e 's/^[ \t]*//' -e 's/[ \t]*$//') - serverdescription=$(grep "description" "${servercfgfullpath}" | sed -e 's/^[ \t]*//g' -e '/^#/d' -e 's/description//g' | tr -d '=\";,:' | sed -e 's/^[ \t]*//' -e 's/[ \t]*$//') - serverpassword=$(grep "password" "${servercfgfullpath}" | sed -e 's/^[ \t]*//g' -e '/^#/d' -e 's/password//g' | tr -d '=\";,:' | sed -e 's/^[ \t]*//' -e 's/[ \t]*$//') - maxplayers=$(grep "\"maxPlayers\"" "${servercfgfullpath}" | tr -cd '[:digit:]') - port=$(grep "\"port\"" "${servercfgfullpath}" | tr -cd '[:digit:]') - queryport=$(grep "\"queryPort\"" "${servercfgfullpath}" | tr -cd '[:digit:]') - steamport=$(grep "\"steamPort\"" "${servercfgfullpath}" | tr -cd '[:digit:]') - tickrate=$(grep "\"maxTickRate\"" "${servercfgfullpath}" | tr -cd '[:digit:]') + 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:]') + queryport="22000" - configip=$(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 "game.serverIP" "${servercfgfullpath}" | sed -e 's/^[ \t]*//g' -e '/^--/d' -e 's/game.serverIP//g' | tr -d '=\";,:' | xargs) ipsetinconfig=1 - ipinconfigvar="host" + ipinconfigvar="game.serverIP" # Not Set servername=${servername:-"NOT SET"} - serverdescription=${serverdescription:-"NOT SET"} serverpassword=${serverpassword:-"NOT SET"} - maxplayers=${maxplayers=:-"0"} - port=${port=:-"0"} - queryport=${queryport=:-"0"} - steamport=${steamport=:-"0"} - tickrate=${tickrate=:-"0"} + maxplayers=${maxplayers:-"0"} + port=${port:-"0"} fi } -fn_info_config_ark(){ +fn_info_game_bfv(){ if [ ! -f "${servercfgfullpath}" ]; then servername="${unavailable}" - adminpassword="${unavailable}" serverpassword="${unavailable}" + maxplayers="${zero}" + port="${zero}" + queryport="${zero}" 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]*$//') + 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" + + 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" # Not Set servername=${servername:-"NOT SET"} - adminpassword=${adminpassword:-"NOT SET"} serverpassword=${serverpassword:-"NOT SET"} + maxplayers=${maxplayers:-"0"} + port=${port:-"0"} fi } -fn_info_config_ballistic_overkill(){ +fn_info_game_bo(){ if [ ! -f "${servercfgfullpath}" ]; then servername="${unavailable}" serverpassword="${unavailable}" @@ -130,7 +191,7 @@ fn_info_config_ballistic_overkill(){ servername=$(grep "ServerName=" "${servercfgfullpath}" | sed -e 's/^[ \t]*//g' -e '/^#/d' -e 's/ServerName//g' | tr -d '=\";,:' | sed -e 's/^[ \t]*//' -e 's/[ \t]*$//') serverpassword=$(grep "Password=" "${servercfgfullpath}" | sed -e 's/^[ \t]*//g' -e '/^#/d' -e 's/Password//g' | tr -d '=\";,:' | sed -e 's/^[ \t]*//' -e 's/[ \t]*$//') port=$(grep "ServerPort=" "${servercfgfullpath}" | tr -cd '[:digit:]') - queryport=$((port + 1)) + queryport=$((port+1)) maxplayers=$(grep "MaxPlayers=" "${servercfgfullpath}" | tr -cd '[:digit:]') # Not Set @@ -142,7 +203,8 @@ fn_info_config_ballistic_overkill(){ fi } -fn_info_config_barotrauma(){ +fn_info_game_bt(){ + # Config if [ ! -f "${servercfgfullpath}" ]; then servername="${unavailable}" serverpassword="${unavailable}" @@ -163,94 +225,53 @@ fn_info_config_barotrauma(){ queryport=${queryport:-"0"} maxplayers=${maxplayers:-"0"} fi -} -fn_info_config_battalion1944(){ - 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 "Password" "${servercfgfullpath}" | sed -e 's/^[ \t]*//g' -e '/^--/d' -e 's/Password//g' | tr -d '=\";,:' | sed -e 's/^[ \t]*//' -e 's/[ \t]*$//') - - # Not Set - servername=${servername:-"NOT SET"} - serverpassword=${serverpassword:-"NOT SET"} - fi + # Parameters + port=${port:-"0"} + queryport=${queryport:-"0"} } -fn_info_config_bf1942(){ +fn_info_game_bt1944(){ + # Config if [ ! -f "${servercfgfullpath}" ]; then servername="${unavailable}" serverpassword="${unavailable}" - maxplayers="${zero}" - port="${zero}" - queryport="${zero}" + gamemode="${unavailable}" else - - 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:]') - queryport="22000" - - 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" + servername=$(grep -m2 "ServerName" "${servercfgfullpath}" | sed -e 's/^[ \t]*//g' -e '/^--/d' -e 's/ServerName//g' | tr -d '=\";,:' | sed -e 's/^[ \t]*//' -e 's/[ \t]*$//') + serverpassword=$(grep "Password" "${servercfgfullpath}" | grep -v "RCONPassword" | sed -e 's/^[ \t]*//g' -e '/^--/d' -e 's/Password//g' | tr -d '=\";,:' | sed -e 's/^[ \t]*//' -e 's/[ \t]*$//') + gamemode=$(grep -m2 "PlayMode" "${servercfgfullpath}" | sed -e 's/^[ \t]*//g' -e '/^--/d' -e 's/PlayMode//g' | tr -d '=\";,:' | sed -e 's/^[ \t]*//' -e 's/[ \t]*$//') # Not Set servername=${servername:-"NOT SET"} serverpassword=${serverpassword:-"NOT SET"} - maxplayers=${maxplayers:-"0"} - port=${port:-"0"} + gamemode=${gamemode:-"NOT SET"} 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" - - 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" - # Not Set - servername=${servername:-"NOT SET"} - serverpassword=${serverpassword:-"NOT SET"} - maxplayers=${maxplayers:-"0"} - port=${port:-"0"} - fi + # Parameters + port=${port:-"0"} + rconport=$((port+2)) + queryport=${queryport:-"0"} } -fn_info_config_chivalry(){ +fn_info_game_cmw(){ if [ ! -f "${servercfgfullpath}" ]; then servername="${unavailable}" serverpassword="${unavailable}" adminpassword="${unavailable}" - else + rconport="${unavailable}" + else servername=$(grep -E "^ServerName" "${servercfgfullpath}" | sed 's/^ServerName=//') - adminpassword=$(grep -E "^AdminPassword" "${servercfgfullpath}" | sed 's/^AdminPassword=//') + rconport=$(grep -E "^RConPort=" "${servercfgdir}/DefaultGame.ini" | tr -cd '[:digit:]') # Not Set servername=${servername:-"NOT SET"} - serverpassword=${serverpassword:-"NOT SET"} - adminpassword=${adminpassword:-"NOT SET"} - port=${port:-"0"} + rconport=${port:-"0"} fi } -fn_info_config_cod(){ +fn_info_game_cod(){ + # Config if [ ! -f "${servercfgfullpath}" ]; then servername="${unavailable}" rconpassword="${unavailable}" @@ -262,9 +283,15 @@ fn_info_config_cod(){ servername=${servername:-"NOT SET"} rconpassword=${rconpassword=:-"NOT SET"} fi + + # Parameters + defaultmap=${defaultmap:-"NOT SET"} + maxplayers=${maxplayers:-"0"} + port=${port:-"0"} + queryport=${port:-"0"} } -fn_info_config_cod2(){ +fn_info_game_cod2(){ if [ ! -f "${servercfgfullpath}" ]; then servername="${unavailable}" rconpassword="${unavailable}" @@ -278,7 +305,7 @@ fn_info_config_cod2(){ fi } -fn_info_config_cod4(){ +fn_info_game_cod4(){ if [ ! -f "${servercfgfullpath}" ]; then servername="${unavailable}" rconpassword="${unavailable}" @@ -292,7 +319,7 @@ fn_info_config_cod4(){ fi } -fn_info_config_codwaw(){ +fn_info_game_codwaw(){ if [ ! -f "${servercfgfullpath}" ]; then servername="${unavailable}" rconpassword="${unavailable}" @@ -306,7 +333,31 @@ fn_info_config_codwaw(){ fi } -fn_info_config_dontstarve(){ +fn_info_game_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 +} + +fn_info_game_dst(){ + # Config if [ ! -f "${clustercfgfullpath}" ]; then servername="${unavailable}" serverpassword="${unavailable}" @@ -337,21 +388,28 @@ fn_info_config_dontstarve(){ if [ ! -f "${servercfgfullpath}" ]; then port="${zero}" - steamauthenticationport="${zero}" - steammasterserverport="${zero}" + steamauthport="${zero}" + steammasterport="${zero}" else port=$(grep "server_port" "${servercfgfullpath}" | grep "^server_port" | grep -v "#" | tr -cd '[:digit:]') - steamauthenticationport=$(grep "authentication_port" "${servercfgfullpath}" | grep -v "#" | tr -cd '[:digit:]') - steammasterserverport=$(grep "master_server_port" "${servercfgfullpath}" | grep -v "#" | tr -cd '[:digit:]') + steamauthport=$(grep "authentication_port" "${servercfgfullpath}" | grep -v "#" | tr -cd '[:digit:]') + steammasterport=$(grep "master_server_port" "${servercfgfullpath}" | grep -v "#" | tr -cd '[:digit:]') # Not Set port=${port:-"0"} - steamauthenticationport=${steamauthenticationport:-"0"} - steammasterserverport=${steammasterserverport:-"0"} + steamauthport=${steamauthport:-"0"} + steammasterport=${steammasterport:-"0"} fi + + # Parameters + sharding=${sharding:-"NOT SET"} + master=${master:-"NOT SET"} + shard=${shard:-"NOT SET"} + cluster=${cluster:-"NOT SET"} + cave=${cave:-"NOT SET"} } -fn_info_config_eco(){ +fn_info_game_eco(){ if [ ! -f "${servercfgfullpath}" ]; then configip="${unavailable}" servername="${unavailable}" @@ -379,7 +437,38 @@ fn_info_config_eco(){ fi } -fn_info_config_factorio(){ +fn_info_game_etl(){ + if [ ! -f "${servercfgfullpath}" ]; then + rconpassword="${unavailable}" + servername="${unavailable}" + serverpassword="${unavailable}" + maxplayers="${zero}" + port="${zero}" + queryport="${zero}" + else + port=$(grep "set net_port" "${servercfgfullpath}" | grep -v "//" | tr -cd '[:digit:]') + queryport="${port}" + rconpassword=$(grep "set rconpassword" "${servercfgfullpath}" | sed -e 's/^[ \t]*//g' -e '/^\//d' -e 's/set rconpassword //g' | tr -d '=\";,:' | sed -e 's/^[ \t]*//g' -e '/^\//d' | sed -e 's/^[ \t]*//' -e 's/[ \t]*$//') + servername=$(grep "set sv_hostname" "${servercfgfullpath}" | sed -e 's/^[ \t]*//g' -e '/^\//d' -e 's/set sv_hostname //g' | tr -d '=\";,:' | sed -e 's/^[ \t]*//' -e 's/[ \t]*$//') + serverpassword=$(grep "set g_password" "${servercfgfullpath}" | sed -e 's/^[ \t]*//g' -e '/^\//d' -e 's/set g_password //g' | tr -d '=\";,:' | sed -e 's/^[ \t]*//' -e 's/[ \t]*$//') + maxplayers=$(grep "set sv_maxclients" "${servercfgfullpath}" | grep -v "//" | tr -cd '[:digit:]') + + 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" + + # Not Set + rconpassword=${rconpassword:-"NOT SET"} + servername=${servername:-"NOT SET"} + serverpassword=${serverpassword:-"NOT SET"} + maxplayers=${maxplayers:-"0"} + port=${port:-"27960"} + queryport=${queryport:-"27960"} + fi +} + +fn_info_game_fctr(){ + # Config if [ ! -f "${servercfgfullpath}" ]; then servername="Factorio Server" serverpassword="${unavailable}" @@ -403,790 +492,899 @@ fn_info_config_factorio(){ savegameinterval=${savegameinterval:-"0"} versioncount=${versioncount:-"0"} fi + + # Parameters + port=${port:-"0"} + rconport=${rconport:-"0"} + rconpassword=${rconpassword:-"NOT SET"} } -fn_info_config_minecraft(){ +fn_info_game_jc2(){ if [ ! -f "${servercfgfullpath}" ]; then servername="${unavailable}" - rconpassword="${unavailable}" - rconport="${zero}" + serverpassword="${unavailable}" maxplayers="${zero}" port="${zero}" queryport="${zero}" - queryenabled="${unavailable}" - gamemode="${unavailable}" - gameworld="${unavailable}" else - servername=$(grep "motd" "${servercfgfullpath}" | sed -e 's/^[ \t]*//g' -e '/^#/d' -e 's/motd//g' | tr -d '=\";,:' | sed -e 's/^[ \t]*//' -e 's/[ \t]*$//') - rconpassword=$(grep "rcon.password" "${servercfgfullpath}" | sed -e 's/^[ \t]*//g' -e '/^#/d' -e 's/rcon.password//g' | tr -d '=\";,:' | sed -e 's/^[ \t]*//' -e 's/[ \t]*$//') - 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:]') - 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]*$//') - - 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" - - # Not Set + servername=$(grep "Name" "${servercfgfullpath}" | sed -e 's/^[ \t]*//g' -e '/^--/d' -e 's/Name//g' | tr -d '=\";,:' | sed -e 's/^[ \t]*//' -e 's/[ \t]*$//') + serverdescription=$(grep "Description" "${servercfgfullpath}" | sed -e 's/^[ \t]*//g' -e '/^--/d' -e 's/Description//g' | tr -d '=\";,:' | sed -e 's/^[ \t]*//' -e 's/[ \t]*$//') + serverpassword=$(grep "Password" "${servercfgfullpath}" | sed -e 's/^ *//g' -e '/^--/d' -e 's/Password//g' | tr -d '=\";,:' | sed -e 's/^[ \t]*//' -e 's/[ \t]*$//') + maxplayers=$(grep "MaxPlayers" "${servercfgfullpath}" | grep -v "\--" | tr -cd '[:digit:]') + port=$(grep "BindPort" "${servercfgfullpath}" | grep -v "\--" | tr -cd '[:digit:]') + queryport="${port}" + 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" + + # Not Set servername=${servername:-"NOT SET"} - rconpassword=${rconpassword:-"NOT SET"} - 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"} + serverpassword=${serverpassword:-"NOT SET"} + maxplayers=${maxplayers:-"0"} + port=${port:-"0"} + queryport=${queryport:-"0"} fi } -fn_info_config_minecraft_bedrock(){ +fn_info_game_hw(){ + servername=${servername:-"NOT SET"} + port=${port:-"0"} + queryport=${queryport:-"0"} + maxplayers=${maxplayers:-"0"} + defaultmap=${defaultmap:-"NOT SET"} + creativemode=${creativemode:-"NOT SET"} +} + +fn_info_game_inss(){ + # Parameters + port=${port:-"0"} + queryport=${queryport:-"0"} + rconport=${rconport:-"0"} + servername=${servername:-"NOT SET"} + serverpassword=${serverpassword:-"NOT SET"} + defaultmap=${defaultmap:-"NOT SET"} + defaultscenario=${defaultscenario:-"NOT SET"} + maxplayers=${maxplayers:-"0"} +} + +fn_info_game_jc3(){ if [ ! -f "${servercfgfullpath}" ]; then servername="${unavailable}" + serverdescription="${unavailable}" + serverpassword="${unavailable}" maxplayers="${zero}" port="${zero}" - port6="${zero}" - queryport="${zero}" - gamemode="${unavailable}" - gameworld="${unavailable}" + queryPort="${zero}" + steamport="${zero}" + httpport="${zero}" + tickrate="${zero}" 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]*$//') + servername=$(grep "name" "${servercfgfullpath}" | sed -e 's/^[ \t]*//g' -e '/^#/d' -e 's/name//g' | tr -d '=\";,:' | sed -e 's/^[ \t]*//' -e 's/[ \t]*$//') + serverdescription=$(grep "description" "${servercfgfullpath}" | sed -e 's/^[ \t]*//g' -e '/^#/d' -e 's/description//g' | tr -d '=\";,:' | sed -e 's/^[ \t]*//' -e 's/[ \t]*$//') + serverpassword=$(grep "password" "${servercfgfullpath}" | sed -e 's/^[ \t]*//g' -e '/^#/d' -e 's/password//g' | tr -d '=\";,:' | sed -e 's/^[ \t]*//' -e 's/[ \t]*$//') + maxplayers=$(grep "\"maxPlayers\"" "${servercfgfullpath}" | tr -cd '[:digit:]') + port=$(grep "\"port\"" "${servercfgfullpath}" | tr -cd '[:digit:]') + queryport=$(grep "\"queryPort\"" "${servercfgfullpath}" | tr -cd '[:digit:]') + steamport=$(grep "\"steamPort\"" "${servercfgfullpath}" | tr -cd '[:digit:]') + httpport=$(grep "\"httpPort\"" "${servercfgfullpath}" | tr -cd '[:digit:]') + tickrate=$(grep "\"maxTickRate\"" "${servercfgfullpath}" | tr -cd '[:digit:]') + + 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" # 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"} + serverdescription=${serverdescription:-"NOT SET"} + serverpassword=${serverpassword:-"NOT SET"} + maxplayers=${maxplayers=:-"0"} + port=${port=:-"0"} + queryport=${queryport=:-"0"} + steamport=${steamport=:-"0"} + httpport=${httpport=:-"0"} + tickrate=${tickrate=:-"0"} fi } -fn_info_config_mofm(){ +fn_info_game_jk2(){ + # Config if [ ! -f "${servercfgfullpath}" ]; then + rconpassword="${unavailable}" servername="${unavailable}" serverpassword="${unavailable}" + maxplayers="${zero}" 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]*$//') + 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 + + # Parameters + queryport="${port:-"0"}" } -fn_info_config_onset(){ +fn_info_game_kf(){ if [ ! -f "${servercfgfullpath}" ]; then servername="${unavailable}" - maxplayers="${zero}" + serverpassword="${unavailable}" + adminpassword="${unavailable}" port="${zero}" - httpport="${zero}" queryport="${zero}" + queryportgs="${zero}" + steamport="${zero}" + steammasterport="${zero}" + lanport="${zero}" + httpport="${zero}" + webadminenabled="${unavailable}" + webadminuser="${unavailable}" + webadminpass="${unavailable}" 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)) + servername=$(sed -nr 's/^ServerName=(.*)$/\1/p' "${servercfgfullpath}" | tr -d '=\";,:' | sed 's/\r$//') + serverpassword=$(sed -nr 's/^GamePassword=(.*)$/\1/p' "${servercfgfullpath}" | tr -d '=\";,:' | sed 's/\r$//') + adminpassword=$(sed -nr 's/^AdminPassword=(.*)$/\1/p' "${servercfgfullpath}" | tr -d '=\";,:' | sed 's/\r$//') + port=$(sed -nr 's/^Port=(.*)$/\1/p' "${servercfgfullpath}" | tr -cd '[:digit:]') + queryport=$((port+1)) + queryportgs=$(sed -nr 's/^OldQueryPortNumber=(.*)$/\1/p' "${servercfgfullpath}" | tr -cd '[:digit:]') + steamport="20560" + steammasterport="28852" + lanport=$(grep "LANServerPort=" "${servercfgfullpath}" | tr -cd '[:digit:]') + httpport=$(sed -nr 's/^ListenPort=(.*)$/\1/p' "${servercfgfullpath}" | tr -cd '[:digit:]') + webadminenabled=$(sed -nr 's/^bEnabled=(.*)$/\1/p' "${servercfgfullpath}" | tr -d '=\";,:' | sed 's/\r$//') + webadminuser=$(sed -nr 's/^AdminName=(.*)$/\1/p' "${servercfgfullpath}" | tr -d '=\";,:' | sed 's/\r$//') + webadminpass="${adminpassword}" # Not Set servername=${servername:-"NOT SET"} - maxplayers=${maxplayers:-"NOT SET"} - port=${port:-"NOT SET"} - httpport=${httpport:-"NOT SET"} - queryport=${queryport:-"NOT SET"} + serverpassword=${serverpassword:-"NOT SET"} + adminpassword=${adminpassword:-"NOT SET"} + port=${port:-"0"} + queryport=${queryport:-"0"} + queryportgs=${queryportgs:-"0"} + steamport=${steamport:-"0"} + steammasterport=${steammasterport:-"0"} + lanport=${lanport:-"0"} + httpport=${httpport:-"0"} + webadminenabled=${webadminenabled:-"NOT SET"} + webadminuser=${webadminuser:-"NOT SET"} + webadminpass=${webadminpass:-"NOT SET"} fi } -fn_info_config_mohaa(){ +fn_info_game_kf2(){ + # Config if [ ! -f "${servercfgfullpath}" ]; then - rconpassword="${unavailable}" servername="${unavailable}" serverpassword="${unavailable}" - maxplayers="${zero}" + adminpassword="${unavailable}" + port="${unavailable}" + queryport="${unavailable}" + webadminenabled="${unavailable}" + httpport="${zero}" + webadminuser="${unavailable}" + webadminpass="${unavailable}" 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:]') + 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]*$//') + port=$(grep "Port" "${servercfgdir}/LinuxServer-KFEngine.ini" | sed -e 's/^[ \t]*//g' | grep "^Port" | grep -v "#" | tr -cd '[:digit:]') + webadminenabled=$(grep "bEnabled" "${servercfgdir}/KFWeb.ini" | sed -e 's/^[ \t]*//g' -e '/^#/d' -e 's/bEnabled//g' | tr -d '=\";,:' | sed -e 's/^[ \t]*//' -e 's/[ \t]*$//') + httpport=$(grep "ListenPort" "${servercfgdir}/KFWeb.ini" | grep -v "#" | tr -cd '[:digit:]') + webadminuser="Admin" + webadminpass=$(grep "AdminPassword" "${servercfgfullpath}" | sed -e 's/^[ \t]*//g' -e '/^#/d' -e 's/AdminPassword//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 -} - -#Post Scriptum: The bloody Seventh -fn_info_config_pstbs(){ - if [ ! -f "${servercfgfullpath}" ]; then - servername="${unavailable}" - 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:]') - fi - - if [ ! -f "${servercfgdir}/Rcon.cfg" ]; then - rconport=${unavailable} - rconpassword=${unavailable} - else - rconport=$(grep "Port=" "${servercfgdir}/Rcon.cfg" | tr -cd '[:digit:]') - rconpassword=$(grep "Password=" "${servercfgdir}/Rcon.cfg" | sed -e 's/^[ \t]*//g' -e '/^\//d' -e 's/Password//g' | tr -d '=\";,:' | sed -e 's/^[ \t]*//' -e 's/[ \t]*$//') + adminpassword=${adminpassword:-"NOT SET"} + port=${port:-"0"} + webadminenabled=${webadminenabled:-"NOT SET"} + httpport=${webadminport:-"0"} + webadminuser=${webadminuser:-"NOT SET"} + webadminpass=${webadminpass:-"NOT SET"} fi - rconport=${rconport:-"0"} - if [ -z "${rconpassword}" ]||[ ${#rconpassword} == 1 ]; then - rconpassword="NOT SET" - fi - servername=${servername:-"NOT SET"} - serverpassword=${serverpassword:-"NOT SET"} - maxplayers=${maxplayers:-"0"} - numreservedslots=${numreservedslots:-"0"} + # Parameters + queryport=${queryport:-"0"} + defaultmap=${defaultmap:-"NOT SET"} } -fn_info_config_projectcars(){ +fn_info_game_mc(){ if [ ! -f "${servercfgfullpath}" ]; then servername="${unavailable}" - serverpassword="${unavailable}" + rconpassword="${unavailable}" + rconport="${zero}" maxplayers="${zero}" port="${zero}" queryport="${zero}" - steamport="${zero}" + queryenabled="${unavailable}" + gamemode="${unavailable}" + gameworld="${unavailable}" else - servername=$(grep "name" "${servercfgfullpath}" | sed -e 's/^[ \t]*//g' -e '/^\//d' -e 's/name//g' | tr -d '=\";,:' | sed -e 's/^[ \t]*//' -e 's/[ \t]*$//') - serverpassword=$(grep "password " "${servercfgfullpath}" | sed -e 's/^[ \t]*//g' -e '/^\//d' -e 's/password//g' | tr -d '=\";,:' | sed -e 's/^[ \t]*//' -e 's/[ \t]*$//') - maxplayers=$(grep "MaxPlayers" "${servercfgfullpath}" | grep -v "//" | tr -cd '[:digit:]') - port=$(grep "hostPort" "${servercfgfullpath}" | grep -v "//" | tr -cd '[:digit:]') - queryport=$(grep "queryPort" "${servercfgfullpath}" | grep -v "//" | tr -cd '[:digit:]') - steamport=$(grep "steamPort" "${servercfgfullpath}" | grep -v "//" | tr -cd '[:digit:]') + servername=$(grep "motd" "${servercfgfullpath}" | sed -e 's/^[ \t]*//g' -e '/^#/d' -e 's/motd//g' | tr -d '=\";,:' | sed -e 's/^[ \t]*//' -e 's/[ \t]*$//') + rconpassword=$(grep "rcon.password" "${servercfgfullpath}" | sed -e 's/^[ \t]*//g' -e '/^#/d' -e 's/rcon.password//g' | tr -d '=\";,:' | sed -e 's/^[ \t]*//' -e 's/[ \t]*$//') + 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:]') + if [ -z "${queryport}" ]; then + queryport=${port:-"0"} + 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]*$//') + + 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" # Not Set servername=${servername:-"NOT SET"} - serverpassword=${serverpassword:-"NOT SET"} + rconpassword=${rconpassword:-"NOT SET"} + rconport=${rconport:-"NOT SET"} maxplayers=${maxplayers:-"NOT SET"} port=${port:-"NOT SET"} queryport=${queryport:-"NOT SET"} - steamport=${steamport:-"NOT SET"} + queryenabled="${queryenabled:-"NOT SET"}" + gamemode=${gamemode:-"NOT SET"} + gameworld=${gameworld:-"NOT SET"} fi } -fn_info_config_projectzomboid(){ +fn_info_game_mcb(){ if [ ! -f "${servercfgfullpath}" ]; then servername="${unavailable}" - serverpassword="${unavailable}" - rconpassword="${unavailable}" maxplayers="${zero}" port="${zero}" + portipv6="${zero}" + queryport="${zero}" + gamemode="${unavailable}" gameworld="${unavailable}" else - servername=$(grep "PublicName" "${servercfgfullpath}" | sed -e 's/^[ \t]*//g' -e '/^#/d' -e 's/PublicName//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 "RCONPassword" "${servercfgfullpath}" | sed -e 's/^[ \t]*//g' -e '/^#/d' -e 's/RCONPassword//g' | tr -d '=\";,:' | sed -e 's/^[ \t]*//' -e 's/[ \t]*$//') - maxplayers=$(grep "MaxPlayers" "${servercfgfullpath}" | grep -v "#" | tr -cd '[:digit:]') - port=$(grep "DefaultPort" "${servercfgfullpath}" | tr -cd '[:digit:]') - gameworld=$(grep "Map" "${servercfgfullpath}" | sed -e 's/^[ \t]*//g' | grep "^Map" | sed -e '/^#/d' -e 's/Map//g' | tr -d '=\";' | sed -e 's/^[ \t]*//' -e 's/[ \t]*$//') + 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:]') + portipv6=$(grep "server-portv6\b" "${servercfgfullpath}" | sed 's/v6//g' | grep -v "#" | tr -cd '[:digit:]') + queryport=${port:-"0"} + 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"} - serverpassword=${serverpassword:-"NOT SET"} - rconpassword=${rconpassword:-"NOT SET"} maxplayers=${maxplayers:-"NOT SET"} port=${port:-"NOT SET"} + portipv6=${portipv6:-"NOT SET"} + queryport=${queryport:-"NOT SET"} + gamemode=${gamemode:-"NOT SET"} gameworld=${gameworld:-"NOT SET"} fi } -fn_info_config_quakeworld(){ +fn_info_game_mh(){ + # Config if [ ! -f "${servercfgfullpath}" ]; then - rconpassword="${unavailable}" servername="${unavailable}" serverpassword="${unavailable}" - maxplayers="${zero}" - port="${zero}" + rconpassword="${unavailable}" + maxplayers="${unavailable}" 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]*$//' | 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:]') + 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 - rconpassword=${rconpassword:-"NOT SET"} + # Not set servername=${servername:-"NOT SET"} + serverpassword=${serverpassword:-"NOT SET"} + rconpassword=${rconpassword:-"NOT SET"} maxplayers=${maxplayers:-"0"} fi + + # Parameters + port=${port:-"0"} + queryport=${queryport:-"0"} + beaconport=${beaconport:-"0"} } -fn_info_config_quake2(){ +fn_info_game_mohaa(){ + # Config if [ ! -f "${servercfgfullpath}" ]; then rconpassword="${unavailable}" servername="${unavailable}" serverpassword="${unavailable}" maxplayers="${zero}" else - rconpassword=$(grep "rcon_password" "${servercfgfullpath}" | sed -e 's/^[ \t]*//g' -e '/^\//d' -e 's/set rcon_password//g' | tr -d '=\";,:' | sed -e 's/^[ \t]*//' -e 's/[ \t]*$//') - servername=$(grep "hostname" "${servercfgfullpath}" | sed -e 's/^[ \t]*//g' -e '/^\//d' -e 's/set hostname//g' | tr -d '=\";,:' | sed -e 's/^[ \t]*//' -e 's/[ \t]*$//') - maxplayers=$(grep "maxclients" "${servercfgfullpath}" | grep -v "#" | tr -cd '[:digit:]') + 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 + + # Parameters + port=${port:-"0"} + queryport=${port:-"0"} + defaultmap=${defaultmap:-"NOT SET"} } -fn_info_config_quake3(){ +fn_info_game_mom(){ + # Config if [ ! -f "${servercfgfullpath}" ]; then - rconpassword="${unavailable}" servername="${unavailable}" serverpassword="${unavailable}" - maxplayers="${zero}" + maxplayer="${zero}" + defaultmap="${unavailable}" else - rconpassword=$(grep "zmq_rcon_password" "${servercfgfullpath}" | sed -e 's/^[ \t]*//g' -e '/^\//d' -e 's/set zmq_rcon_password//g' | tr -d '=\";,:' | sed -e 's/^[ \t]*//' -e 's/[ \t]*$//') - servername=$(grep "sv_hostname" "${servercfgfullpath}" | sed -e 's/^[ \t]*//g' -e '/^\//d' -e 's/set sv_hostname//g' | tr -d '=\";,:' | sed -e 's/^[ \t]*//' -e 's/[ \t]*$//') - serverpassword=$(grep "rconpassword" "${servercfgfullpath}" | sed -e 's/^[ \t]*//g' -e '/^\//d' -e 's/set rconpassword//g' | tr -d '=\";,:' | sed -e 's/^[ \t]*//' -e 's/[ \t]*$//') - maxplayers=$(grep "sv_maxclients" "${servercfgfullpath}" | grep -v "#" | tr -cd '[:digit:]') + servername=$(grep "ServerName" "${servercfgfullpath}" | sed -e 's/^[ \t]*//g' -e '/^--/d' -e 's/ServerName//g' | tr -d '=\";,:' | sed -e 's/^[ \t]*//' -e 's/[ \t]*$//') + serverpassword=$(grep "ServerPassword" "${servercfgfullpath}" | sed -e 's/^ *//g' -e '/^--/d' -e 's/ServerPassword//g' | tr -d '=\";,:' | sed -e 's/^[ \t]*//' -e 's/[ \t]*$//') + maxplayers=$(grep "MaxPlayers" "${servercfgfullpath}" | sed -e 's/^ *//g' -e '/^--/d' -e 's/MaxPlayers//g' | tr -d '=\";,:' | sed -e 's/^[ \t]*//' -e 's/[ \t]*$//') + defaultmap=$(grep "MapName" "${servercfgfullpath}" | sed -e 's/^ *//g' -e '/^--/d' -e 's/MapName//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"} + maxplayer=${maxplayers:-"NOT SET"} + defaultmap=${defaultmap:-"NOT SET"} fi + + # Parameters + port=${port:-"7777"} + beaconport=${queryport:-"15000"} } -fn_info_config_jk2(){ +fn_info_game_mta(){ + # Config if [ ! -f "${servercfgfullpath}" ]; then - rconpassword="${unavailable}" + configip="${zero}" + port="${unavailable}" + httpport="${unavailable}" + ase="${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]*$//') + 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:]') + 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 + # 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" # Not Set - rconpassword=${rconpassword:-"NOT SET"} + port=${port:-"22003"} + httpport=${httpport:-"22005"} + ase=${ase:-"Disabled"} servername=${servername:-"NOT SET"} serverpassword=${serverpassword:-"NOT SET"} maxplayers=${maxplayers:-"0"} fi + + # Parameters + queryport=$((port+123)) } -fn_info_config_quakelive(){ +fn_info_game_mumble(){ + if [ ! -f "${servercfgfullpath}" ]; then + port="64738" + queryport="${port}" + servername="Mumble" + else + 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}" + + 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" + + # Not Set + port=${port:-"64738"} + queryport=${queryport:-"64738"} + servername="Mumble Port ${port}" + fi +} + +fn_info_game_onset(){ if [ ! -f "${servercfgfullpath}" ]; then - rconpassword="${unavailable}" servername="${unavailable}" - serverpassword="${unavailable}" maxplayers="${zero}" port="${zero}" + httpport="${zero}" queryport="${zero}" - rconport="${zero}" - statsport="${zero}" else - rconpassword=$(grep "zmq_rcon_password" "${servercfgfullpath}" | sed -e 's/^[ \t]*//g' -e '/^\//d' -e 's/set zmq_rcon_password//g' | tr -d '=\";,:' | sed -e 's/^[ \t]*//' -e 's/[ \t]*$//') - servername=$(grep "sv_hostname" "${servercfgfullpath}" | sed -e 's/^[ \t]*//g' -e '/^\//d' -e 's/set sv_hostname//g' | tr -d '=\";,:' | sed -e 's/^[ \t]*//' -e 's/[ \t]*$//') - serverpassword=$(grep "g_password" "${servercfgfullpath}" | sed -e 's/^[ \t]*//g' -e '/^\//d' -e 's/set g_password//g' | tr -d '=\";,:' | sed -e 's/^[ \t]*//' -e 's/[ \t]*$//') - maxplayers=$(grep "sv_maxClients" "${servercfgfullpath}" | grep -v "//" | tr -cd '[:digit:]') - port=$(grep "net_port" "${servercfgfullpath}" | grep -v "//" | tr -cd '[:digit:]') - queryport="${port}" - rconport=$(grep "zmq_rcon_port" "${servercfgfullpath}" | grep -v "//" | tr -cd '[:digit:]') - statsport=$(grep "zmq_stats_port" "${servercfgfullpath}" | grep -v "//" | tr -cd '[:digit:]') - - 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" + 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 - rconpassword=${rconpassword:-"NOT SET"} servername=${servername:-"NOT SET"} - serverpassword=${serverpassword:-"NOT SET"} - maxplayers=${maxplayers:-"0"} - port=${port:-"0"} - queryport=${queryport:-"0"} - rconport=${rconport:-"0"} - statsport=${statsport:-"0"} + maxplayers=${maxplayers:-"NOT SET"} + port=${port:-"NOT SET"} + httpport=${httpport:-"NOT SET"} + queryport=${queryport:-"NOT SET"} fi } -fn_info_config_realvirtuality(){ +fn_info_game_pc(){ if [ ! -f "${servercfgfullpath}" ]; then servername="${unavailable}" - adminpassword="${unavailable}" serverpassword="${unavailable}" maxplayers="${zero}" + port="${zero}" + queryport="${zero}" + steamport="${zero}" else - servername=$(grep "hostname" "${servercfgfullpath}" | sed -e 's/^[ \t]*//g' -e '/^\//d' -e 's/hostname//g' | tr -d '=\";,:' | sed -e 's/^[ \t]*//' -e 's/[ \t]*$//') - adminpassword=$(grep "passwordAdmin" "${servercfgfullpath}" | sed -e 's/^[ \t]*//g' -e '/^\//d' -e 's/passwordAdmin//g' | tr -d '=\";,:' | sed -e 's/^[ \t]*//' -e 's/[ \t]*$//') - serverpassword=$(grep "password" "${servercfgfullpath}" | sed -e 's/^[ \t]*//g' -e '/^\//d' -e 's/password//g' | tr -d '=\";,:' | sed -e 's/^[ \t]*//' -e 's/[ \t]*$//') - maxplayers=$(grep "maxPlayers" "${servercfgfullpath}" | grep -v "//" | tr -cd '[:digit:]') + servername=$(grep "name" "${servercfgfullpath}" | sed -e 's/^[ \t]*//g' -e '/^\//d' -e 's/name//g' | tr -d '=\";,:' | sed -e 's/^[ \t]*//' -e 's/[ \t]*$//') + serverpassword=$(grep "password " "${servercfgfullpath}" | sed -e 's/^[ \t]*//g' -e '/^\//d' -e 's/password//g' | tr -d '=\";,:' | sed -e 's/^[ \t]*//' -e 's/[ \t]*$//') + maxplayers=$(grep "MaxPlayers" "${servercfgfullpath}" | grep -v "//" | tr -cd '[:digit:]') + port=$(grep "hostPort" "${servercfgfullpath}" | grep -v "//" | tr -cd '[:digit:]') + queryport=$(grep "queryPort" "${servercfgfullpath}" | grep -v "//" | tr -cd '[:digit:]') + steamport=$(grep "steamPort" "${servercfgfullpath}" | grep -v "//" | tr -cd '[:digit:]') # Not Set servername=${servername:-"NOT SET"} - adminpassword=${adminpassword:-"NOT SET"} serverpassword=${serverpassword:-"NOT SET"} + maxplayers=${maxplayers:-"NOT SET"} + port=${port:-"NOT SET"} + queryport=${queryport:-"NOT SET"} + steamport=${steamport:-"NOT SET"} + fi +} + +fn_info_game_pstbs(){ + if [ ! -f "${servercfgfullpath}" ]; then + servername="${unavailable}" + 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:]') + fi + + if [ ! -f "${servercfgdir}/Rcon.cfg" ]; then + rconport=${unavailable} + rconpassword=${unavailable} + else + rconport=$(grep "Port=" "${servercfgdir}/Rcon.cfg" | tr -cd '[:digit:]') + rconpassword=$(grep "Password=" "${servercfgdir}/Rcon.cfg" | sed -e 's/^[ \t]*//g' -e '/^\//d' -e 's/Password//g' | tr -d '=\";,:' | sed -e 's/^[ \t]*//' -e 's/[ \t]*$//') + fi + + rconport=${rconport:-"0"} + if [ -z "${rconpassword}" ]||[ ${#rconpassword} == 1 ]; then + rconpassword="NOT SET" + fi + servername=${servername:-"NOT SET"} + serverpassword=${serverpassword:-"NOT SET"} + maxplayers=${maxplayers:-"0"} + numreservedslots=${numreservedslots:-"0"} +} + +fn_info_game_pvr(){ + # Config + 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 + + # Parameters + port=${port:-"0"} + port401=$((port+400)) + queryport=${port:-"0"} } -fn_info_config_risingworld(){ +fn_info_game_pz(){ + # Config if [ ! -f "${servercfgfullpath}" ]; then servername="${unavailable}" + serverpassword="${unavailable}" rconpassword="${unavailable}" - rconport="${zero}" maxplayers="${zero}" port="${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]*$//') - serverpassword=$(grep "server_password" "${servercfgfullpath}" | sed -e 's/^[ \t]*//g' -e '/^#/d' -e 's/server_password//g' | tr -d '=\";,:' | sed -e 's/^[ \t]*//' -e 's/[ \t]*$//') - rconpassword=$(grep "rcon_password" "${servercfgfullpath}" | sed -e 's/^[ \t]*//g' -e '/^#/d' -e 's/rcon_password//g' | tr -d '=\";,:' | sed -e 's/^[ \t]*//' -e 's/[ \t]*$//') - rconport=$(grep "rcon_port" "${servercfgfullpath}" | grep -v "#" | tr -cd '[:digit:]') - maxplayers=$(grep "settings_max_players" "${servercfgfullpath}" | grep -v "#" | tr -cd '[:digit:]') - port=$(grep "server_port" "${servercfgfullpath}" | grep -v "database_mysql_server_port" | grep -v "#" | tr -cd '[:digit:]') - 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]*$//') - 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" + servername=$(grep "PublicName" "${servercfgfullpath}" | sed -e 's/^[ \t]*//g' -e '/^#/d' -e 's/PublicName//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 "RCONPassword" "${servercfgfullpath}" | sed -e 's/^[ \t]*//g' -e '/^#/d' -e 's/RCONPassword//g' | tr -d '=\";,:' | sed -e 's/^[ \t]*//' -e 's/[ \t]*$//') + maxplayers=$(grep "MaxPlayers" "${servercfgfullpath}" | grep -v "#" | tr -cd '[:digit:]') + port=$(grep "DefaultPort" "${servercfgfullpath}" | tr -cd '[:digit:]') + gameworld=$(grep "Map" "${servercfgfullpath}" | sed -e 's/^[ \t]*//g' | grep "^Map" | sed -e '/^#/d' -e 's/Map//g' | tr -d '=\";' | sed -e 's/^[ \t]*//' -e 's/[ \t]*$//') # Not Set servername=${servername:-"NOT SET"} + serverpassword=${serverpassword:-"NOT SET"} rconpassword=${rconpassword:-"NOT SET"} - rconport=${rconport:-"NOT SET"} maxplayers=${maxplayers:-"NOT SET"} port=${port:-"NOT SET"} - gamemode=${gamemode:-"NOT SET"} gameworld=${gameworld:-"NOT SET"} fi + + # Parameters + adminpassword=${adminpassword:-"NOT SET"} + queryport=${port:-"0"} } -fn_info_config_rtcw(){ +fn_info_game_q2(){ + # Config 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:]') + rconpassword=$(grep "rcon_password" "${servercfgfullpath}" | sed -e 's/^[ \t]*//g' -e '/^\//d' -e 's/set rcon_password//g' | tr -d '=\";,:' | sed -e 's/^[ \t]*//' -e 's/[ \t]*$//') + servername=$(grep "hostname" "${servercfgfullpath}" | sed -e 's/^[ \t]*//g' -e '/^\//d' -e 's/set hostname//g' | tr -d '=\";,:' | sed -e 's/^[ \t]*//' -e 's/[ \t]*$//') + maxplayers=$(grep "maxclients" "${servercfgfullpath}" | grep -v "#" | tr -cd '[:digit:]') # Not Set rconpassword=${rconpassword:-"NOT SET"} servername=${servername:-"NOT SET"} - serverpassword=${serverpassword:-"NOT SET"} maxplayers=${maxplayers:-"0"} fi + + # Parameters + port=${port:-"0"} + queryport=${port:-"0"} + defaultmap=${defaultmap:-"NOT SET"} } -#StickyBots -fn_info_config_sbots(){ +fn_info_game_q3(){ if [ ! -f "${servercfgfullpath}" ]; then + rconpassword="${unavailable}" servername="${unavailable}" - maxplayers="${unavailable}" + serverpassword="${unavailable}" + maxplayers="${zero}" 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:]') - fi + rconpassword=$(grep "zmq_rcon_password" "${servercfgfullpath}" | sed -e 's/^[ \t]*//g' -e '/^\//d' -e 's/set zmq_rcon_password//g' | tr -d '=\";,:' | sed -e 's/^[ \t]*//' -e 's/[ \t]*$//') + servername=$(grep "sv_hostname" "${servercfgfullpath}" | sed -e 's/^[ \t]*//g' -e '/^\//d' -e 's/set sv_hostname//g' | tr -d '=\";,:' | sed -e 's/^[ \t]*//' -e 's/[ \t]*$//') + serverpassword=$(grep "rconpassword" "${servercfgfullpath}" | sed -e 's/^[ \t]*//g' -e '/^\//d' -e 's/set rconpassword//g' | tr -d '=\";,:' | sed -e 's/^[ \t]*//' -e 's/[ \t]*$//') + maxplayers=$(grep "sv_maxclients" "${servercfgfullpath}" | grep -v "#" | tr -cd '[:digit:]') - servername=${servername:-"NOT SET"} - serverpassword=${serverpassword:-"NOT SET"} - maxplayers=${maxplayers:-"0"} + # Not Set + rconpassword=${rconpassword:-"NOT SET"} + servername=${servername:-"NOT SET"} + serverpassword=${serverpassword:-"NOT SET"} + maxplayers=${maxplayers:-"0"} + fi } -fn_info_config_sof2(){ +fn_info_game_ql(){ if [ ! -f "${servercfgfullpath}" ]; then rconpassword="${unavailable}" servername="${unavailable}" serverpassword="${unavailable}" maxplayers="${zero}" + port="${zero}" + queryport="${zero}" + rconport="${zero}" + statsport="${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]*$//') + rconpassword=$(grep "zmq_rcon_password" "${servercfgfullpath}" | sed -e 's/^[ \t]*//g' -e '/^\//d' -e 's/set zmq_rcon_password//g' | tr -d '=\";,:' | sed -e 's/^[ \t]*//' -e 's/[ \t]*$//') servername=$(grep "sv_hostname" "${servercfgfullpath}" | sed -e 's/^[ \t]*//g' -e '/^\//d' -e 's/set sv_hostname//g' | tr -d '=\";,:' | sed -e 's/^[ \t]*//' -e 's/[ \t]*$//') serverpassword=$(grep "g_password" "${servercfgfullpath}" | sed -e 's/^[ \t]*//g' -e '/^\//d' -e 's/set g_password//g' | tr -d '=\";,:' | sed -e 's/^[ \t]*//' -e 's/[ \t]*$//') - maxplayers=$(grep "sv_maxclients" "${servercfgfullpath}" | grep -v "#" | tr -cd '[:digit:]') + maxplayers=$(grep "sv_maxClients" "${servercfgfullpath}" | grep -v "//" | tr -cd '[:digit:]') + port=$(grep "net_port" "${servercfgfullpath}" | grep -v "//" | tr -cd '[:digit:]') + queryport="${port}" + rconport=$(grep "zmq_rcon_port" "${servercfgfullpath}" | grep -v "//" | tr -cd '[:digit:]') + statsport=$(grep "zmq_stats_port" "${servercfgfullpath}" | grep -v "//" | tr -cd '[:digit:]') + + 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" # Not Set rconpassword=${rconpassword:-"NOT SET"} servername=${servername:-"NOT SET"} serverpassword=${serverpassword:-"NOT SET"} maxplayers=${maxplayers:-"0"} + port=${port:-"0"} + queryport=${queryport:-"0"} + rconport=${rconport:-"0"} + statsport=${statsport:-"0"} fi } -fn_info_config_source(){ +fn_info_game_qw(){ + # Config if [ ! -f "${servercfgfullpath}" ]; then + rconpassword="${unavailable}" servername="${unavailable}" serverpassword="${unavailable}" - rconpassword="${unavailable}" + maxplayers="${zero}" + port="${zero}" else - servername=$(grep "hostname" "${servercfgfullpath}" | sed -e 's/^[ \t]*//g' -e '/^\//d' -e 's/hostname//g' | tr -d '=\";,:' | sed -e 's/^[ \t]*//' -e 's/[ \t]*$//') - serverpassword=$(grep "sv_password" "${servercfgfullpath}" | sed -e 's/^[ \t]*//g' -e '/^\//d' -e 's/sv_password//g' | tr -d '=\";,:' | sed -e 's/^[ \t]*//' -e 's/[ \t]*$//') - rconpassword=$(grep "rcon_password" "${servercfgfullpath}" | sed -e 's/^[ \t]*//g' -e '/^\//d' -e 's/rcon_password//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 - servername=${servername:-"NOT SET"} - serverpassword=${serverpassword:-"NOT SET"} rconpassword=${rconpassword:-"NOT SET"} + servername=${servername:-"NOT SET"} + maxplayers=${maxplayers:-"0"} fi + + # Parameters + port=${port:-"0"} + queryport=${port:-"0"} } -fn_info_config_starbound(){ +fn_info_game_ro(){ if [ ! -f "${servercfgfullpath}" ]; then servername="${unavailable}" - queryenabled="${unavailable}" - rconenabled="${unavailable}" - rconpassword="${unavailable}" - port="21025" - queryport="21025" - rconport="21026" - maxplayers="8" + serverpassword="${unavailable}" + adminpassword="${unavailable}" + port="${zero}" + queryport="${zero}" + steamport="${zero}" + steammasterport="${zero}" + lanport="${zero}" + httpport="${zero}" + webadminenabled="${unavailable}" + webadminuser="${unavailable}" + webadminpass="${unavailable}" else - servername=$(grep "serverName" "${servercfgfullpath}" | sed -e 's/^[ \t]*//g' -e 's/serverName//g' | tr -d '=\";,:' | sed -e 's/^[ \t]*//' -e 's/[ \t]*$//') - queryenabled=$(grep "runQueryServer" "${servercfgfullpath}" | sed -e 's/^[ \t]*//g' -e 's/runQueryServer//g' | tr -d '=\";,:' | sed -e 's/^[ \t]*//' -e 's/[ \t]*$//') - rconenabled=$(grep "runRconServer" "${servercfgfullpath}" | sed -e 's/^[ \t]*//g' -e 's/runRconServer//g' | tr -d '=\";,:' | sed -e 's/^[ \t]*//' -e 's/[ \t]*$//') - rconpassword=$(grep "rconServerPassword" "${servercfgfullpath}" | sed -e 's/^[ \t]*//g' -e 's/rconServerPassword//g' | tr -d '=\";,:' | sed -e 's/^[ \t]*//' -e 's/[ \t]*$//') - port=$(grep "gameServerPort" "${servercfgfullpath}" | tr -cd '[:digit:]') - queryport=$(grep "queryServerPort" "${servercfgfullpath}" | tr -cd '[:digit:]') - rconport=$(grep "rconServerPort" "${servercfgfullpath}" | tr -cd '[:digit:]') - maxplayers=$(grep "maxPlayers" "${servercfgfullpath}" | tr -cd '[:digit:]') + servername=$(sed -nr 's/^ServerName=(.*)$/\1/p' "${servercfgfullpath}" | tr -d '=\";,:' | sed 's/\r$//') + serverpassword=$(sed -nr 's/^GamePassword=(.*)$/\1/p' "${servercfgfullpath}" | tr -d '=\";,:' | sed 's/\r$//') + adminpassword=$(sed -nr 's/^AdminPassword=(.*)$/\1/p' "${servercfgfullpath}" | tr -d '=\";,:' | sed 's/\r$//') + port=$(sed -nr 's/^Port=(.*)$/\1/p' "${servercfgfullpath}" | tr -cd '[:digit:]') + queryport=$((port+1)) + steamport="20610" + steammasterport="28902" + lanport=$(grep "LANServerPort=" "${servercfgfullpath}" | tr -cd '[:digit:]') + httpport=$(sed -nr 's/^ListenPort=(.*)$/\1/p' "${servercfgfullpath}" | tr -cd '[:digit:]') + webadminenabled=$(sed -nr 's/^bEnabled=(.*)$/\1/p' "${servercfgfullpath}" | tr -d '=\";,:' | sed 's/\r$//') + webadminuser=$(sed -nr 's/^AdminName=(.*)$/\1/p' "${servercfgfullpath}" | tr -d '=\";,:' | sed 's/\r$//') + webadminpass="${adminpassword}" # Not Set servername=${servername:-"NOT SET"} - queryenabled=${queryenabled:-"NOT SET"} - rconenabled=${rconenabled:-"NOT SET"} - rconpassword=${rconpassword:-"NOT SET"} - port=${port:-"21025"} - queryport=${queryport:-"21025"} - rconport=${rconport:-"21026"} - maxplayers=${maxplayers:-"8"} + serverpassword=${serverpassword:-"NOT SET"} + adminpassword=${adminpassword:-"NOT SET"} + port=${port:-"0"} + queryport=${queryport:-"0"} + steamport=${steamport:-"0"} + steammasterport=${steammasterport:-"0"} + lanport=${lanport:-"0"} + httpport=${httpport:-"0"} + webadminenabled=${webadminenabled:-"NOT SET"} + webadminuser=${webadminuser:-"NOT SET"} + webadminpass=${webadminpass:-"NOT SET"} fi } -fn_info_config_teamspeak3(){ +fn_info_game_rtcw(){ + # Config if [ ! -f "${servercfgfullpath}" ]; then - dbplugin="${unavailable}" - port="9987" - queryport="10011" - fileport="30033" + rconpassword="${unavailable}" + servername="${unavailable}" + serverpassword="${unavailable}" + maxplayers="${zero}" else - dbplugin=$(grep "dbplugin=" "${servercfgfullpath}" | sed -e 's/^[ \t]*//g' -e '/^#/d' -e 's/dbplugin=//g' | tr -d '=\";,:' | sed -e 's/^[ \t]*//' -e 's/[ \t]*$//') - port=$(grep "default_voice_port" "${servercfgfullpath}" | tr -cd '[:digit:]') - queryport=$(grep "query_port" "${servercfgfullpath}" | grep -v "#" | tr -cd '[:digit:]') - fileport=$(grep "filetransfer_port" "${servercfgfullpath}" | grep -v "#" | tr -cd '[:digit:]') - - 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" + 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 - port=${port:-"9987"} - queryport=${queryport:-"10011"} - fileport=${fileport:-"30033"} + rconpassword=${rconpassword:-"NOT SET"} + servername=${servername:-"NOT SET"} + serverpassword=${serverpassword:-"NOT SET"} + maxplayers=${maxplayers:-"0"} fi + + # Parameters + port=${port:-"0"} + queryport=${port:-"0"} + defaultmap=${defaultmap:-"NOT SET"} +} + +fn_info_game_rust(){ + # Parameters + servername=${servername:-"NOT SET"} + port=${port:-"0"} + queryport=${port:-"0"} + appport=${appport:-"0"} + rconport=${rconport:-"0"} + gamemode=${gamemode:-"NOT SET"} + maxplayers=${maxplayers:-"0"} + rconpassword=${rconpassword:-"NOT SET"} + rconweb=${rconweb:-"NOT SET"} + tickrate=${tickrate:-"0"} + saveinterval=${saveinterval:-"0"} + serverlevel=${serverlevel:-"NOT SET"} + worldsize=${worldsize:-"0"} } -fn_info_config_mumble(){ +fn_info_game_rw(){ + # Config if [ ! -f "${servercfgfullpath}" ]; then - port="64738" - queryport="${port}" - servername="Mumble" + servername="${unavailable}" + rconpassword="${unavailable}" + rconport="${zero}" + maxplayers="${zero}" + port="${zero}" + port2="${zero}" + port3="${zero}" + port4="${zero}" + queryport="${zero}" + gamemode="${unavailable}" + gameworld="${unavailable}" else - port=$(grep "port" "${servercfgfullpath}" | sed -e 's/^[ \t]*//g' -e '/^;/d' -e 's/port//g' | tr -d '=\";,:' | sed -e 's/^[ \t]*//' -e 's/[ \t]*$//') + 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]*$//') + serverpassword=$(grep "server_password" "${servercfgfullpath}" | sed -e 's/^[ \t]*//g' -e '/^#/d' -e 's/server_password//g' | tr -d '=\";,:' | sed -e 's/^[ \t]*//' -e 's/[ \t]*$//') + rconpassword=$(grep "rcon_password" "${servercfgfullpath}" | sed -e 's/^[ \t]*//g' -e '/^#/d' -e 's/rcon_password//g' | tr -d '=\";,:' | sed -e 's/^[ \t]*//' -e 's/[ \t]*$//') + rconport=$(grep "rcon_port" "${servercfgfullpath}" | grep -v "#" | tr -cd '[:digit:]') + maxplayers=$(grep "settings_max_players" "${servercfgfullpath}" | grep -v "#" | tr -cd '[:digit:]') + port=$(grep "server_port" "${servercfgfullpath}" | grep -v "database_mysql_server_port" | grep -v "#" | tr -cd '[:digit:]') + port2=$((port+1)) + port3=$((port+2)) + port4=$((port+3)) queryport="${port}" - - configip=$(grep "host=" "${servercfgfullpath}" | sed -e 's/^[ \t]*//g' -e '/^;/d' -e 's/host=//g' | tr -d '=\";,:' | sed -e 's/^[ \t]*//' -e 's/[ \t]*$//') + gamemode=$(grep "settings_default_gamemode=" "${servercfgfullpath}" | sed -e 's/^[ \t]*//g' -e '/^#/d' -e 's/settings_default_gamemode//g' | tr -d '=\";,:' | sed -e 's/^[ \t]*//' -e 's/[ \t]*$//') + 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]*$//') + 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="voice_ip" + ipinconfigvar="server-ip" # Not Set - port=${port:-"64738"} - queryport=${queryport:-"64738"} - servername="Mumble Port ${port}" + servername=${servername:-"NOT SET"} + rconpassword=${rconpassword:-"NOT SET"} + rconport=${rconport:-"NOT SET"} + maxplayers=${maxplayers:-"NOT SET"} + port=${port:-"NOT SET"} + gamemode=${gamemode:-"NOT SET"} + gameworld=${gameworld:-"NOT SET"} fi + + # Parameters + servername=${servername:-"NOT SET"} + port=${port:-"0"} + httpqueryport=$((port-1)) } -fn_info_config_samp(){ +fn_info_game_samp(){ + # Config if [ ! -f "${servercfgfullpath}" ]; then servername="unnamed server" serverpassword="${unavailable}" rconpassword="${unavailable}" port="7777" + rconport="${port}" maxplayers="50" else servername=$(grep "hostname" "${servercfgfullpath}" | sed -e 's/^[ \t]*//g' -e '/^\//d' -e 's/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/^rcon_password//g' | tr -d '=\";,:' | sed -e 's/^[ \t]*//' -e 's/[ \t]*$//') port=$(grep "port" "${servercfgfullpath}" | grep -v "#" | tr -cd '[:digit:]') + rconport="${port}" maxplayers=$(grep "maxplayers" "${servercfgfullpath}" | grep -v "#" | tr -cd '[:digit:]') # Not Set servername=${servername:-"NOT SET"} rconpassword=${rconpassword:-"NOT SET"} - port=${port:-"8303"} + port=${port:-"7777"} + rconport="${port}" maxplayers=${maxplayers:-"12"} fi -} - -fn_info_config_teeworlds(){ - if [ ! -f "${servercfgfullpath}" ]; then - servername="unnamed server" - 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 - servername=${servername:-"NOT SET"} - serverpassword=${serverpassword:-"NOT SET"} - rconpassword=${rconpassword:-"NOT SET"} - port=${port:-"8303"} - queryport=${port:-"8303"} - maxplayers=${maxplayers:-"12"} - fi -} - -fn_info_config_terraria(){ - if [ ! -f "${servercfgfullpath}" ]; then - servername="${unavailable}" - 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 -} - -fn_info_config_towerunite(){ - if [ ! -f "${servercfgfullpath}" ]; then - servername="${unavailable}" - maxplayers="${zero}" - else - servername=$(grep "ServerTitle" "${servercfgfullpath}" | sed -e 's/^[ \t]*//g' -e '/^--/d' -e 's/ServerTitle//g' | tr -d '=\";,:' | sed -e 's/^[ \t]*//' -e 's/[ \t]*$//') - maxplayers=$(grep "MaxPlayers" "${servercfgfullpath}" | grep -v "#" | tr -cd '[:digit:]') - - # Not Set - servername=${servername:-"NOT SET"} - maxplayers=${maxplayers:-"0"} - fi -} -fn_info_config_unreal(){ - if [ ! -f "${servercfgfullpath}" ]; then - servername="${unavailable}" - 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 "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 + # Parameters + queryport=${port:-"0"} } -fn_info_config_unreal2(){ +fn_info_game_sb(){ if [ ! -f "${servercfgfullpath}" ]; then servername="${unavailable}" - serverpassword="${unavailable}" - adminpassword="${unavailable}" - port="${zero}" - queryport="${zero}" - queryportgs="${zero}" - webadminenabled="${unavailable}" - webadminport="${zero}" - webadminuser="${unavailable}" - webadminpass="${unavailable}" + queryenabled="${unavailable}" + rconenabled="${unavailable}" + rconpassword="${unavailable}" + port="21025" + queryport="21025" + rconport="21026" + maxplayers="8" else - servername=$(sed -nr 's/^ServerName=(.*)$/\1/p' "${servercfgfullpath}" | tr -d '=\";,:' | sed 's/\r$//') - serverpassword=$(sed -nr 's/^GamePassword=(.*)$/\1/p' "${servercfgfullpath}" | tr -d '=\";,:' | sed 's/\r$//') - adminpassword=$(sed -nr 's/^AdminPassword=(.*)$/\1/p' "${servercfgfullpath}" | tr -d '=\";,:' | sed 's/\r$//') - port=$(sed -nr 's/^Port=(.*)$/\1/p' "${servercfgfullpath}" | tr -cd '[:digit:]') - queryport=$((port + 1)) - queryportgs=$(sed -nr 's/^OldQueryPortNumber=(.*)$/\1/p' "${servercfgfullpath}" | tr -cd '[:digit:]') - webadminenabled=$(sed -nr 's/^bEnabled=(.*)$/\1/p' "${servercfgfullpath}" | tr -d '=\";,:' | sed 's/\r$//') - webadminport=$(sed -nr 's/^ListenPort=(.*)$/\1/p' "${servercfgfullpath}" | tr -cd '[:digit:]') - webadminuser=$(sed -nr 's/^AdminName=(.*)$/\1/p' "${servercfgfullpath}" | tr -d '=\";,:' | sed 's/\r$//') - webadminpass="${adminpassword}" + servername=$(grep "serverName" "${servercfgfullpath}" | sed -e 's/^[ \t]*//g' -e 's/serverName//g' | tr -d '=\";,:' | sed -e 's/^[ \t]*//' -e 's/[ \t]*$//') + queryenabled=$(grep "runQueryServer" "${servercfgfullpath}" | sed -e 's/^[ \t]*//g' -e 's/runQueryServer//g' | tr -d '=\";,:' | sed -e 's/^[ \t]*//' -e 's/[ \t]*$//') + rconenabled=$(grep "runRconServer" "${servercfgfullpath}" | sed -e 's/^[ \t]*//g' -e 's/runRconServer//g' | tr -d '=\";,:' | sed -e 's/^[ \t]*//' -e 's/[ \t]*$//') + rconpassword=$(grep "rconServerPassword" "${servercfgfullpath}" | sed -e 's/^[ \t]*//g' -e 's/rconServerPassword//g' | tr -d '=\";,:' | sed -e 's/^[ \t]*//' -e 's/[ \t]*$//') + port=$(grep "gameServerPort" "${servercfgfullpath}" | tr -cd '[:digit:]') + queryport=$(grep "queryServerPort" "${servercfgfullpath}" | tr -cd '[:digit:]') + rconport=$(grep "rconServerPort" "${servercfgfullpath}" | tr -cd '[:digit:]') + maxplayers=$(grep "maxPlayers" "${servercfgfullpath}" | tr -cd '[:digit:]') # 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"} + queryenabled=${queryenabled:-"NOT SET"} + rconenabled=${rconenabled:-"NOT SET"} + rconpassword=${rconpassword:-"NOT SET"} + port=${port:-"21025"} + queryport=${queryport:-"21025"} + rconport=${rconport:-"21026"} + maxplayers=${maxplayers:-"8"} fi } -fn_info_config_unreal3(){ +fn_info_game_sbots(){ + # Config if [ ! -f "${servercfgfullpath}" ]; then 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" - webadminpass=$(grep "AdminPassword" "${servercfgfullpath}" | sed -e 's/^[ \t]*//g' -e '/^#/d' -e 's/AdminPassword//g' | tr -d '=\";,:' | sed -e 's/^[ \t]*//' -e 's/[ \t]*$//') + 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:]') # Not Set servername=${servername:-"NOT SET"} serverpassword=${serverpassword:-"NOT SET"} - adminpassword=${adminpassword:-"NOT SET"} - maxplayers=${maxplayers:-"NOT SET"} - webadminenabled=${webadminenabled:-"NOT SET"} - webadminport=${webadminport:-"0"} - webadminuser=${webadminuser:-"NOT SET"} - webadminpass=${webadminpass:-"NOT SET"} + maxplayers=${maxplayers:-"0"} 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 + # Parameters + port=${port:-"0"} + queryport=${queryport:-"0"} + servername=${servername:-"NOT SET"} + serverpassword=${serverpassword:-"NOT SET"} + defaultmap=${defaultmap:-"NOT SET"} + maxplayers=${maxplayers:-"0"} } -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_game_scpsl(){ + # Config + 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}") -fn_info_config_kf2(){ - if [ ! -f "${servercfgfullpath}" ]; then - servername="${unavailable}" - serverpassword="${unavailable}" - adminpassword="${unavailable}" - port="${unavailable}" - queryport="${unavailable}" - webadminenabled="${unavailable}" - webadminport="${zero}" - webadminuser="${unavailable}" - webadminpass="${unavailable}" + if [ "${adminpassword}" == "none" ]; then + adminpassword="NOT SET" + fi 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]*$//') - port=$(grep "Port" "${servercfgdir}/LinuxServer-KFEngine.ini" | sed -e 's/^[ \t]*//g' | grep "^Port" | grep -v "#" | tr -cd '[:digit:]') - webadminenabled=$(grep "bEnabled" "${servercfgdir}/KFWeb.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}/KFWeb.ini" | grep -v "#" | tr -cd '[:digit:]') - webadminuser="Admin" - webadminpass=$(grep "AdminPassword" "${servercfgfullpath}" | sed -e 's/^[ \t]*//g' -e '/^#/d' -e 's/AdminPassword//g' | tr -d '=\";,:' | sed -e 's/^[ \t]*//' -e 's/[ \t]*$//') - - # Not Set servername=${servername:-"NOT SET"} - serverpassword=${serverpassword:-"NOT SET"} + maxplayers=${maxplayers:-"0"} + configip=${configip:-"0.0.0.0"} + tickrate=${tickrate:-"NOT SET"} adminpassword=${adminpassword:-"NOT SET"} - port=${port:-"0"} - webadminenabled=${webadminenabled:-"NOT SET"} - webadminport=${webadminport:-"0"} - webadminuser=${webadminuser:-"NOT SET"} - webadminpass=${webadminpass:-"NOT SET"} fi + + # Parameters + queryport="${port:-"0"}" } -fn_info_config_sdtd(){ +fn_info_game_sdtd(){ if [ ! -f "${servercfgfullpath}" ]; then servername="${unavailable}" serverpassword="${unavailable}" port="${zero}" + port3="${zero}" queryport="${zero}" webadminenabled="${unavailable}" webadminport="${zero}" @@ -1202,168 +1400,140 @@ fn_info_config_sdtd(){ servername=$(grep "ServerName" "${servercfgfullpath}" | sed 's/^.*value="//' | cut -f1 -d"\"") serverpassword=$(grep "ServerPassword" "${servercfgfullpath}" | sed 's/^.*value="//' | cut -f1 -d"\"") port=$(grep "ServerPort" "${servercfgfullpath}" | grep -Eo 'value="[0-9]+"' | tr -cd '[:digit:]') + port3=$((port+2)) queryport=${port:-"0"} - webadminenabled=$(grep "ControlPanelEnabled" "${servercfgfullpath}" | sed 's/^.*value="//' | cut -f1 -d"\"") webadminport=$(grep "ControlPanelPort" "${servercfgfullpath}" | tr -cd '[:digit:]') webadminpass=$(grep "ControlPanelPassword" "${servercfgfullpath}" | sed 's/^.*value="//' | cut -f1 -d"\"") - 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"\"") - - # Not Set - servername=${servername:-"NOT SET"} - serverpassword=${serverpassword:-"NOT SET"} - port=${port:-"0"} - queryport=${queryport:-"0"} - webadminenabled=${webadminenabled:-"NOT SET"} - webadminport=${webadminport:-"0"} - webadminpass=${webadminpass:-"NOT SET"} - telnetenabled=${telnetenabled:-"NOT SET"} - telnetport=${telnetport:-"0"} - telnetpass=${telnetpass:-"NOT SET"} - maxplayers=${maxplayers:-"NOT SET"} - gamemode=${gamemode:-"NOT SET"} - gameworld=${gameworld:-"NOT SET"} - fi -} - -fn_info_config_mta(){ - if [ ! -f "${servercfgfullpath}" ]; then - configip="${zero}" - port="${unavailable}" - httpport="${unavailable}" - ase="${unavailable}" - servername="${unavailable}" - serverpassword="${unavailable}" - maxplayers="${zero}" - else - port=$(grep -m 1 "serverport" "${servercfgfullpath}" | sed -e 's/^[ \t]*//g' -e '/^\//d' -e 's///g' | sed -e 's/^[ \t]*//' -e 's/[ \t]*$//' | cut -f1 -d "<" | tr -cd '[:digit:]') - httpport=$(grep -m 1 "httpport" "${servercfgfullpath}" | sed -e 's/^[ \t]*//g' -e '/^\//d' -e 's///g' | sed -e 's/^[ \t]*//' -e 's/[ \t]*$//' | cut -f1 -d "<" | tr -cd '[:digit:]') - 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" + 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 - # 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" + maxplayers=$(grep "ServerMaxPlayerCount" "${servercfgfullpath}" | tr -cd '[:digit:]') + gamemode=$(grep "GameMode" "${servercfgfullpath}" | sed 's/^.*value="//' | cut -f1 -d"\"") + gameworld=$(grep "GameWorld" "${servercfgfullpath}" | sed 's/^.*value="//' | cut -f1 -d"\"") # Not Set - port=${port:-"22003"} - httpport=${httpport:-"22005"} - ase=${ase:-"Disabled"} servername=${servername:-"NOT SET"} serverpassword=${serverpassword:-"NOT SET"} - maxplayers=${maxplayers:-"0"} + port=${port:-"0"} + queryport=${queryport:-"0"} + webadminenabled=${webadminenabled:-"NOT SET"} + webadminport=${webadminport:-"0"} + webadminpass=${webadminpass:-"NOT SET"} + telnetenabled=${telnetenabled:-"NOT SET"} + telnetport=${telnetport:-"0"} + telnetpass=${telnetpass:-"NOT SET"} + maxplayers=${maxplayers:-"NOT SET"} + gamemode=${gamemode:-"NOT SET"} + gameworld=${gameworld:-"NOT SET"} fi } -fn_info_config_wolfensteinenemyterritory(){ +fn_info_game_sof2(){ + # Config if [ ! -f "${servercfgfullpath}" ]; then rconpassword="${unavailable}" servername="${unavailable}" serverpassword="${unavailable}" maxplayers="${zero}" - port="${zero}" - queryport="${zero}" else - port=$(grep "set net_port" "${servercfgfullpath}" | grep -v "//" | tr -cd '[:digit:]') - queryport="${port}" - rconpassword=$(grep "set zmq_rcon_password" "${servercfgfullpath}" | sed -e 's/^[ \t]*//g' -e '/^\//d' -e 's/set zmq_rcon_password //g' | tr -d '=\";,:' | sed -e 's/^[ \t]*//g' -e '/^\//d' | sed -e 's/^[ \t]*//' -e 's/[ \t]*$//') - servername=$(grep "set sv_hostname" "${servercfgfullpath}" | sed -e 's/^[ \t]*//g' -e '/^\//d' -e 's/set sv_hostname //g' | tr -d '=\";,:' | sed -e 's/^[ \t]*//' -e 's/[ \t]*$//') - serverpassword=$(grep "set g_password" "${servercfgfullpath}" | sed -e 's/^[ \t]*//g' -e '/^\//d' -e 's/set g_password //g' | tr -d '=\";,:' | sed -e 's/^[ \t]*//' -e 's/[ \t]*$//') - maxplayers=$(grep "set sv_maxclients" "${servercfgfullpath}" | grep -v "//" | tr -cd '[:digit:]') - - 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" + 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"} - port=${port:-"27960"} - queryport=${queryport:-"27960"} fi + + # Parameters + port=${port:-"0"} + queryport=${port:-"0"} + defaultmap=${defaultmap:-"NOT SET"} } -fn_info_config_etlegacy(){ +fn_info_game_sol(){ if [ ! -f "${servercfgfullpath}" ]; then - rconpassword="${unavailable}" - servername="${unavailable}" - serverpassword="${unavailable}" - maxplayers="${zero}" + adminpassword="${unavailable}" + maxplayers="${unavailable}" port="${zero}" queryport="${zero}" + servername="${unavailable}" + serverpassword="${unavailable}" else - port=$(grep "set net_port" "${servercfgfullpath}" | grep -v "//" | tr -cd '[:digit:]') + 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}" - rconpassword=$(grep "set rconpassword" "${servercfgfullpath}" | sed -e 's/^[ \t]*//g' -e '/^\//d' -e 's/set rconpassword //g' | tr -d '=\";,:' | sed -e 's/^[ \t]*//g' -e '/^\//d' | sed -e 's/^[ \t]*//' -e 's/[ \t]*$//') - servername=$(grep "set sv_hostname" "${servercfgfullpath}" | sed -e 's/^[ \t]*//g' -e '/^\//d' -e 's/set sv_hostname //g' | tr -d '=\";,:' | sed -e 's/^[ \t]*//' -e 's/[ \t]*$//') - serverpassword=$(grep "set g_password" "${servercfgfullpath}" | sed -e 's/^[ \t]*//g' -e '/^\//d' -e 's/set g_password //g' | tr -d '=\";,:' | sed -e 's/^[ \t]*//' -e 's/[ \t]*$//') - maxplayers=$(grep "set sv_maxclients" "${servercfgfullpath}" | grep -v "//" | tr -cd '[:digit:]') - - 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" + filesport=$((port+10)) + servername=$(grep "Server_Name=" "${servercfgfullpath}" | awk -F '=' '{print $2}') + serverpassword=$(grep "Game_Password=" "${servercfgfullpath}" | awk -F '=' '{print $2}') - # Not Set - rconpassword=${rconpassword:-"NOT SET"} + # Not set + adminpassword=${adminpassword:-"NOT SET"} + maxplayers=${maxplayers:-"0"} + port=${port:-"23073"} + queryport=${queryport:-"23083"} servername=${servername:-"NOT SET"} serverpassword=${serverpassword:-"NOT SET"} - maxplayers=${maxplayers:-"0"} - port=${port:-"27960"} - queryport=${queryport:-"27960"} fi } -fn_info_config_wurmunlimited(){ +fn_info_game_source(){ + # Config if [ ! -f "${servercfgfullpath}" ]; then - port="${zero}" - queryport="${zero}" - rconpassword="${unavailable}" servername="${unavailable}" serverpassword="${unavailable}" - adminpassword="${unavailable}" - maxplayers="${zero}" + rconpassword="${unavailable}" else - - port=$(grep "EXTERNALPORT=" "${servercfgfullpath}" | grep -v "#" | tr -cd '[:digit:]') - queryport=$(grep "QUERYPORT=" "${servercfgfullpath}" | grep -v "#" | tr -cd '[:digit:]') - servername=$(grep "SERVERNAME=" "${servercfgfullpath}" | sed -e 's/^[ \t]*//g' -e '/^\//d' -e 's/SERVERNAME//g' | tr -d '=\";,:' | sed -e 's/^[ \t]*//' -e 's/[ \t]*$//') - serverpassword=$(grep "SERVERPASSWORD=" "${servercfgfullpath}" | sed -e 's/^[ \t]*//g' -e '/^\//d' -e 's/SERVERPASSWORD//g' | tr -d '=\";,:' | sed -e 's/^[ \t]*//' -e 's/[ \t]*$//') - 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:]') - - 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" + servername=$(grep "hostname" "${servercfgfullpath}" | sed -e 's/^[ \t]*//g' -e '/^\//d' -e 's/hostname//g' | tr -d '=\";,:' | sed -e 's/^[ \t]*//' -e 's/[ \t]*$//') + serverpassword=$(grep "sv_password" "${servercfgfullpath}" | sed -e 's/^[ \t]*//g' -e '/^\//d' -e 's/sv_password//g' | tr -d '=\";,:' | sed -e 's/^[ \t]*//' -e 's/[ \t]*$//') + rconpassword=$(grep "rcon_password" "${servercfgfullpath}" | sed -e 's/^[ \t]*//g' -e '/^\//d' -e 's/rcon_password//g' | tr -d '=\";,:' | sed -e 's/^[ \t]*//' -e 's/[ \t]*$//') # Not Set - port=${port:-"3724"} - queryport=${queryport:-"27017"} servername=${servername:-"NOT SET"} serverpassword=${serverpassword:-"NOT SET"} - adminpassword=${adminpassword:-"NOT SET"} - maxplayers=${maxplayers:-"0"} + rconpassword=${rconpassword:-"NOT SET"} fi + + # Parameters + defaultmap=${defaultmap:-"NOT SET"} + maxplayers=${maxplayers:-"0"} + port=${port:-"0"} + rconport=${port:-"0"} + queryport=${port:-"0"} + clientport=${clientport:-"0"} + # Steamport can be between 26901-26910 and is normaly automaticly set. + # Some servers might support -steamport parameter to set + if [ "${steamport}" == "0" ]||[ -z "${steamport}" ]; then + steamport="$(echo "${ssinfo}" | grep "${srcdslinuxpid}" | awk '{print $5}' | grep ":269" | cut -d ":" -f2)" + fi + steamport="${steamport:-"0"}" +} + +fn_info_game_spark(){ + defaultmap=${defaultmap:-"NOT SET"} + maxplayers=${maxplayers:-"0"} + port=${port:-"0"} + queryport=$((port+1)) + servername=${servername:-"NOT SET"} + serverpassword=${serverpassword:-"NOT SET"} + webadminuser=${webadminuser:-"NOT SET"} + webadminpass=${webadminpass:-"NOT SET"} + webadminport=${webadminport:-"0"} + # Commented out as displaying not set in details parameters + #mods=${mods:-"NOT SET"} } -fn_info_config_squad(){ +fn_info_game_squad(){ if [ ! -f "${servercfgfullpath}" ]; then servername="${unavailable}" maxplayers="${unavailable}" @@ -1389,7 +1559,8 @@ fn_info_config_squad(){ maxplayers=${maxplayers:-"0"} } -fn_info_config_stationeers(){ +fn_info_game_st(){ + # Config if [ ! -f "${servercfgfullpath}" ]; then servername="${unavailable}" serverpassword="${unavailable}" @@ -1407,165 +1578,379 @@ fn_info_config_stationeers(){ rconpassword=${rconpassword:-"NOT SET"} maxplayers=${maxplayers:-"0"} fi + + # Parameters + port=${port:-"0"} + queryport=${queryport:-"0"} + httpport=${port:-"0"} + worldtype=${worldtype:-"NOT SET"} + autosaveinterval=${autosaveinterval:-"0"} + clearinterval=${clearinterval:-"0"} + worldname=${worldname:-"NOT SET"} +} +fn_info_game_terraria(){ + if [ ! -f "${servercfgfullpath}" ]; then + servername="${unavailable}" + 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 +} + +fn_info_game_ts3(){ + if [ ! -f "${servercfgfullpath}" ]; then + dbplugin="${unavailable}" + port="9987" + queryport="10011" + querysshport="10022" + queryhttpport="10080" + queryhttpsport="10443" + fileport="30033" + telnetport="10011" + else + dbplugin=$(grep "dbplugin=" "${servercfgfullpath}" | sed -e 's/^[ \t]*//g' -e '/^#/d' -e 's/dbplugin=//g' | tr -d '=\";,:' | sed -e 's/^[ \t]*//' -e 's/[ \t]*$//') + port=$(grep "default_voice_port" "${servercfgfullpath}" | tr -cd '[:digit:]') + queryport=$(grep "query_port" "${servercfgfullpath}" | grep -v "#" | tr -cd '[:digit:]') + querysshport=$(grep "query_ssh_port" "${servercfgfullpath}" | grep -v "#" | tr -cd '[:digit:]') + queryhttpport=$(grep "query_http_port" "${servercfgfullpath}" | grep -v "#" | tr -cd '[:digit:]') + queryhttpsport=$(grep "query_https_port" "${servercfgfullpath}" | grep -v "#" | tr -cd '[:digit:]') + fileport=$(grep "filetransfer_port" "${servercfgfullpath}" | grep -v "#" | tr -cd '[:digit:]') + telnetport="${queryport}" + + 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" + + # Not Set + dbplugin=${dbplugin:-"NOT SET"} + port=${port:-"9987"} + queryport=${queryport:-"10011"} + querysshport=${querysshport:-"10022"} + queryhttpport=${queryhttpport:-"10080"} + queryhttpsport=${queryhttpsport:-"10443"} + fileport=${fileport:-"30033"} + telnetport=${telnetport:-"10011"} + fi } -fn_info_config_mordhau(){ +fn_info_game_tu(){ + # Config if [ ! -f "${servercfgfullpath}" ]; then servername="${unavailable}" + maxplayers="${zero}" + else + servername=$(grep "ServerTitle" "${servercfgfullpath}" | sed -e 's/^[ \t]*//g' -e '/^--/d' -e 's/ServerTitle//g' | tr -d '=\";,:' | sed -e 's/^[ \t]*//' -e 's/[ \t]*$//') + maxplayers=$(grep "MaxPlayers" "${servercfgfullpath}" | grep -v "#" | tr -cd '[:digit:]') + + # Not Set + servername=${servername:-"NOT SET"} + maxplayers=${maxplayers:-"0"} + fi + + # Parameters + port=${port:-"0"} + steamport=$((port+1)) + queryport=${queryport:-"0"} +} + +fn_info_game_tw(){ + # Config + if [ ! -f "${servercfgfullpath}" ]; then + servername="unnamed server" serverpassword="${unavailable}" rconpassword="${unavailable}" - maxplayers="${unavailable}" + port="8303" + queryport="8303" + maxplayers="12" 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}') + 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 + # Not Set servername=${servername:-"NOT SET"} serverpassword=${serverpassword:-"NOT SET"} rconpassword=${rconpassword:-"NOT SET"} - maxplayers=${maxplayers:-"0"} + port=${port:-"8303"} + queryport=${port:-"8303"} + maxplayers=${maxplayers:-"12"} + fi + + # Parameters + queryport="${port:-"0"}" +} + +fn_info_game_unreal(){ + # Config + 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:]') + beaconport=$(grep "ServerBeaconPort" "${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$//') + httpport=$(grep "ListenPort" "${servercfgfullpath}" | grep -v "#" | tr -cd '[:digit:]') + 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"} + beaconport=${beaconport:-"8777"} + queryportgs=${queryportgs:-"0"} + webadminenabled=${webadminenabled:-"NOT SET"} + webadminport=${webadminport:-"0"} + webadminuser=${webadminuser:-"NOT SET"} + webadminpass=${webadminpass:-"NOT SET"} + fi + + # Parameters + defaultmap=${defaultmap:-"NOT SET"} +} + +fn_info_game_unreal2(){ + # Config + 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=$(sed -nr 's/^ServerName=(.*)$/\1/p' "${servercfgfullpath}" | tr -d '=\";,:' | sed 's/\r$//') + serverpassword=$(sed -nr 's/^GamePassword=(.*)$/\1/p' "${servercfgfullpath}" | tr -d '=\";,:' | sed 's/\r$//') + adminpassword=$(sed -nr 's/^AdminPassword=(.*)$/\1/p' "${servercfgfullpath}" | tr -d '=\";,:' | sed 's/\r$//') + port=$(sed -nr 's/^Port=(.*)$/\1/p' "${servercfgfullpath}" | tr -cd '[:digit:]') + queryport=$((port+1)) + queryportgs=$(sed -nr 's/^OldQueryPortNumber=(.*)$/\1/p' "${servercfgfullpath}" | tr -cd '[:digit:]') + webadminenabled=$(sed -nr 's/^bEnabled=(.*)$/\1/p' "${servercfgfullpath}" | tr -d '=\";,:' | sed 's/\r$//') + webadminport=$(sed -nr 's/^ListenPort=(.*)$/\1/p' "${servercfgfullpath}" | tr -cd '[:digit:]') + webadminuser=$(sed -nr 's/^AdminName=(.*)$/\1/p' "${servercfgfullpath}" | tr -d '=\";,:' | sed 's/\r$//') + webadminpass="${adminpassword}" + + # 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 + + # Parameters + defaultmap=${defaultmap:-"NOT SET"} } +fn_info_game_unt(){ + servername=${selfname:-"NOT SET"} + port=${port:-"0"} + queryport=$((port+1)) +} -fn_info_config_avorion() { +fn_info_game_ut(){ + # Config 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 + servername=$(grep "ServerName" "${servercfgfullpath}" | awk -F '=' '{print $2}') # 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 + + # Parameters + port=${port:-"0"} + queryport=$((port+1)) } -fn_info_config_soldat(){ +fn_info_game_ut2k4(){ if [ ! -f "${servercfgfullpath}" ]; then + servername="${unavailable}" + serverpassword="${unavailable}" adminpassword="${unavailable}" - maxplayers="${unavailable}" port="${zero}" queryport="${zero}" - servername="${unavailable}" - serverpassword="${unavailable}" + queryportgs="${zero}" + lanport="${zero}" + webadminenabled="${unavailable}" + httpport="${zero}" + webadminuser="${unavailable}" + webadminpass="${unavailable}" else - 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}') + servername=$(sed -nr 's/^ServerName=(.*)$/\1/p' "${servercfgfullpath}" | tr -d '=\";,:' | sed 's/\r$//') + serverpassword=$(sed -nr 's/^GamePassword=(.*)$/\1/p' "${servercfgfullpath}" | tr -d '=\";,:' | sed 's/\r$//') + adminpassword=$(sed -nr 's/^AdminPassword=(.*)$/\1/p' "${servercfgfullpath}" | tr -d '=\";,:' | sed 's/\r$//') + port=$(sed -nr 's/^Port=(.*)$/\1/p' "${servercfgfullpath}" | tr -cd '[:digit:]') + queryport=$((port+1)) + queryportgs=$(sed -nr 's/^OldQueryPortNumber=(.*)$/\1/p' "${servercfgfullpath}" | tr -cd '[:digit:]') + lanport=$(grep "LANServerPort=" "${servercfgfullpath}" | tr -cd '[:digit:]') + webadminenabled=$(sed -nr 's/^bEnabled=(.*)$/\1/p' "${servercfgfullpath}" | tr -d '=\";,:' | sed 's/\r$//') + httpport=$(sed -nr 's/^ListenPort=(.*)$/\1/p' "${servercfgfullpath}" | tr -cd '[:digit:]') + webadminuser=$(sed -nr 's/^AdminName=(.*)$/\1/p' "${servercfgfullpath}" | tr -d '=\";,:' | sed 's/\r$//') + webadminpass="${adminpassword}" - # Not set - adminpassword=${adminpassword:-"NOT SET"} - maxplayers=${maxplayers:-"0"} - port=${port:-"23073"} - queryport=${queryport:-"23083"} + # Not Set servername=${servername:-"NOT SET"} serverpassword=${serverpassword:-"NOT SET"} + adminpassword=${adminpassword:-"NOT SET"} + port=${port:-"0"} + queryport=${queryport:-"0"} + queryportgs=${queryportgs:-"0"} + lanport=${lanport:-"0"} + webadminenabled=${webadminenabled:-"NOT SET"} + httpport=${httpport:-"0"} + webadminuser=${webadminuser:-"NOT SET"} + webadminpass=${webadminpass:-"NOT SET"} fi } -fn_info_config_pavlovvr(){ +fn_info_game_ut3(){ + # Config if [ ! -f "${servercfgfullpath}" ]; then servername="${unavailable}" + serverpassword="${unavailable}" + adminpassword="${unavailable}" maxplayers="${unavailable}" + webadminenabled="${unavailable}" + webadminport="${zero}" + webadminuser="${unavailable}" + webadminpass="${unavailable}" else - servername=$(grep "ServerName" "${servercfgfullpath}" | awk -F '=' '{print $2}') - maxplayers=$(grep "MaxPlayers" "${servercfgfullpath}" | awk -F '=' '{print $2}') + 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" + webadminpass=$(grep "AdminPassword" "${servercfgfullpath}" | sed -e 's/^[ \t]*//g' -e '/^#/d' -e 's/AdminPassword//g' | tr -d '=\";,:' | sed -e 's/^[ \t]*//' -e 's/[ \t]*$//') - # Not set + # Not Set servername=${servername:-"NOT SET"} - maxplayers=${maxplayers:-"0"} + serverpassword=${serverpassword:-"NOT SET"} + adminpassword=${adminpassword:-"NOT SET"} + maxplayers=${maxplayers:-"NOT SET"} + webadminenabled=${webadminenabled:-"NOT SET"} + webadminport=${webadminport:-"0"} + webadminuser=${webadminuser:-"NOT SET"} + webadminpass=${webadminpass:-"NOT SET"} 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}") + # Parameters + port=${port:-"0"} + queryport=${queryport:-"0"} + defaultmap=${defaultmap:-"NOT SET"} +} - # password not set - serverpassword=${serverpassword:-"NOT SET"} - queryport=${port:-"0"} +fn_info_game_vh(){ + port=${port:-"0"} + if [ "${public}" != "0" ]; then + queryport=$((port+1)) else - servername=${servername:-"NOT SET"} - serverpassword=${serverpassword:-"NOT SET"} - maxplayers=${maxplayers:-"0"} - port=${port:-"27004"} - steamport=${steamport:-"27005"} - rconpassword=${rconpassword:-"NOT SET"} + querymode="1" fi + gameworld=${gameworld:-"NOT SET"} + serverpassword=${serverpassword:-"NOT SET"} + servername=${servername:-"NOT SET"} } -fn_info_config_vintagestory(){ +fn_info_game_wet(){ if [ ! -f "${servercfgfullpath}" ]; then + rconpassword="${unavailable}" servername="${unavailable}" - maxplayers="${unavailable}" serverpassword="${unavailable}" - port="${unavailable}" - queryport="${unavailable}" - configip="${unavailable}" + maxplayers="${zero}" + port="${zero}" + queryport="${zero}" 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}") + port=$(grep "set net_port" "${servercfgfullpath}" | grep -v "//" | tr -cd '[:digit:]') + queryport="${port}" + rconpassword=$(grep "set zmq_rcon_password" "${servercfgfullpath}" | sed -e 's/^[ \t]*//g' -e '/^\//d' -e 's/set zmq_rcon_password //g' | tr -d '=\";,:' | sed -e 's/^[ \t]*//g' -e '/^\//d' | sed -e 's/^[ \t]*//' -e 's/[ \t]*$//') + servername=$(grep "set sv_hostname" "${servercfgfullpath}" | sed -e 's/^[ \t]*//g' -e '/^\//d' -e 's/set sv_hostname //g' | tr -d '=\";,:' | sed -e 's/^[ \t]*//' -e 's/[ \t]*$//') + serverpassword=$(grep "set g_password" "${servercfgfullpath}" | sed -e 's/^[ \t]*//g' -e '/^\//d' -e 's/set g_password //g' | tr -d '=\";,:' | sed -e 's/^[ \t]*//' -e 's/[ \t]*$//') + maxplayers=$(grep "set sv_maxclients" "${servercfgfullpath}" | grep -v "//" | tr -cd '[:digit:]') + + 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" + # Not Set + rconpassword=${rconpassword:-"NOT SET"} + servername=${servername:-"NOT SET"} serverpassword=${serverpassword:-"NOT SET"} - configip=${configip:-"0.0.0.0"} + maxplayers=${maxplayers:-"0"} + port=${port:-"27960"} + queryport=${queryport:-"27960"} 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 +fn_info_game_wf(){ + # Config + 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"} - configip=${configip:-"0.0.0.0"} - tickrate=${tickrate:-"NOT SET"} - adminpassword=${adminpassword:-"NOT SET"} fi + + # Parameters + port=${port:-"0"} + queryport="${port:-"0"}" + webadminport=${webadminport:-"0"} } -fn_info_config_waterfall(){ + +fn_info_game_wmc(){ if [ -f "${servercfgfullpath}" ]; then servername=$(sed -e '/^listeners:/,/^[a-z]/!d' "${servercfgfullpath}" | sed -nr 's/^[ ]+motd: (.*)$/\1/p' | tr -d "'" | sed 's/&1//') queryport=$(sed -nr 's/^[ -]+query_port: ([0-9]+)/\1/p' "${servercfgfullpath}") @@ -1587,132 +1972,183 @@ fn_info_config_waterfall(){ fi } +fn_info_game_wurm(){ + if [ ! -f "${servercfgfullpath}" ]; then + port="${zero}" + queryport="${zero}" + rconpassword="${unavailable}" + servername="${unavailable}" + serverpassword="${unavailable}" + adminpassword="${unavailable}" + maxplayers="${zero}" + else + + port=$(grep "EXTERNALPORT=" "${servercfgfullpath}" | grep -v "#" | tr -cd '[:digit:]') + queryport=$(grep "QUERYPORT=" "${servercfgfullpath}" | grep -v "#" | tr -cd '[:digit:]') + servername=$(grep "SERVERNAME=" "${servercfgfullpath}" | sed -e 's/^[ \t]*//g' -e '/^\//d' -e 's/SERVERNAME//g' | tr -d '=\";,:' | sed -e 's/^[ \t]*//' -e 's/[ \t]*$//') + serverpassword=$(grep "SERVERPASSWORD=" "${servercfgfullpath}" | sed -e 's/^[ \t]*//g' -e '/^\//d' -e 's/SERVERPASSWORD//g' | tr -d '=\";,:' | sed -e 's/^[ \t]*//' -e 's/[ \t]*$//') + 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:]') + + 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" + + # Not Set + port=${port:-"3724"} + queryport=${queryport:-"27017"} + servername=${servername:-"NOT SET"} + serverpassword=${serverpassword:-"NOT SET"} + adminpassword=${adminpassword:-"NOT SET"} + maxplayers=${maxplayers:-"0"} + fi +} + +unavailable="${red}UNAVAILABLE${default}" +zero="${red}0${default}" + if [ "${shortname}" == "ac" ]; then - fn_info_config_assettocorsa + fn_info_game_ac elif [ "${shortname}" == "ark" ]; then - fn_info_config_ark + fn_info_game_ark +elif [ "${shortname}" == "arma3" ]; then + fn_info_game_arma3 elif [ "${shortname}" == "av" ]; then - fn_info_config_avorion + fn_info_game_av +elif [ "${shortname}" == "bf1942" ]; then + fn_info_game_bf1942 +elif [ "${shortname}" == "bfv" ]; then + fn_info_game_bfv elif [ "${shortname}" == "bo" ]; then - fn_info_config_ballistic_overkill + fn_info_game_bo elif [ "${shortname}" == "bt" ]; then - fn_info_config_barotrauma + fn_info_game_bt elif [ "${shortname}" == "bt1944" ]; then - fn_info_config_battalion1944 -elif [ "${shortname}" == "bf1942" ]; then - fn_info_config_bf1942 -elif [ "${shortname}" == "bfv" ]; then - fn_info_config_bfv + fn_info_game_bt1944 elif [ "${shortname}" == "cmw" ]; then - fn_info_config_chivalry + fn_info_game_cmw elif [ "${shortname}" == "cod" ]||[ "${shortname}" == "coduo" ]; then - fn_info_config_cod + fn_info_game_cod elif [ "${shortname}" == "cod2" ]; then - fn_info_config_cod2 + fn_info_game_cod2 elif [ "${shortname}" == "cod4" ]; then - fn_info_config_cod4 + fn_info_game_cod4 elif [ "${shortname}" == "codwaw" ]; then - fn_info_config_codwaw + fn_info_game_codwaw elif [ "${shortname}" == "col" ]; then - fn_info_config_col + fn_info_game_col elif [ "${shortname}" == "dst" ]; then - fn_info_config_dontstarve + fn_info_game_dst elif [ "${shortname}" == "eco" ]; then - fn_info_config_eco + fn_info_game_eco +elif [ "${shortname}" == "etl" ]; then + fn_info_game_etl elif [ "${shortname}" == "fctr" ]; then - fn_info_config_factorio + fn_info_game_fctr +elif [ "${shortname}" == "hw" ]; then + fn_info_game_hw +elif [ "${shortname}" == "inss" ]; then + fn_info_game_inss elif [ "${shortname}" == "jc2" ]; then - fn_info_config_justcause2 + fn_info_game_jc2 elif [ "${shortname}" == "jc3" ]; then - fn_info_config_justcause3 -elif [ "${shortname}" == "kf2" ]; then - fn_info_config_kf2 -elif [ "${shortname}" == "mohaa" ]; then - fn_info_config_mohaa -elif [ "${shortname}" == "mofm" ]; then - fn_info_config_mofm -elif [ "${shortname}" == "qw" ]; then - fn_info_config_quakeworld -elif [ "${shortname}" == "q2" ]; then - fn_info_config_quake2 -elif [ "${shortname}" == "q3" ]; then - fn_info_config_quake3 -elif [ "${shortname}" == "ql" ]; then - fn_info_config_quakelive + fn_info_game_jc3 elif [ "${shortname}" == "jk2" ]; then - fn_info_config_jk2 + fn_info_game_jk2 +elif [ "${shortname}" == "kf" ]; then + fn_info_game_kf +elif [ "${shortname}" == "kf2" ]; then + fn_info_game_kf2 elif [ "${shortname}" == "mc" ]||[ "${shortname}" == "pmc" ]; then - fn_info_config_minecraft + fn_info_game_mc elif [ "${shortname}" == "mcb" ]; then - fn_info_config_minecraft_bedrock + fn_info_game_mcb +elif [ "${shortname}" == "mh" ]; then + fn_info_game_mh +elif [ "${shortname}" == "mohaa" ]; then + fn_info_game_mohaa +elif [ "${shortname}" == "mom" ]; then + fn_info_game_mom +elif [ "${shortname}" == "mta" ]; then + fn_info_game_mta +elif [ "${shortname}" == "mumble" ]; then + fn_info_game_mumble elif [ "${shortname}" == "onset" ]; then - fn_info_config_onset -elif [ "${shortname}" == "pstbs" ]; then - fn_info_config_pstbs + fn_info_game_onset elif [ "${shortname}" == "pc" ]; then - fn_info_config_projectcars + fn_info_game_pc +elif [ "${shortname}" == "pstbs" ]; then + fn_info_game_pstbs +elif [ "${shortname}" == "pvr" ];then + fn_info_game_pvr elif [ "${shortname}" == "pz" ]; then - fn_info_config_projectzomboid -elif [ "${shortname}" == "arma3" ]; then - fn_info_config_realvirtuality + fn_info_game_pz +elif [ "${shortname}" == "q2" ]; then + fn_info_game_q2 +elif [ "${shortname}" == "q3" ]; then + fn_info_game_q3 +elif [ "${shortname}" == "ql" ]; then + fn_info_game_ql +elif [ "${shortname}" == "qw" ]; then + fn_info_game_qw +elif [ "${shortname}" == "ro" ]; then + fn_info_game_ro elif [ "${shortname}" == "rtcw" ]; then - fn_info_config_rtcw + fn_info_game_rtcw +elif [ "${shortname}" == "rust" ]; then + fn_info_game_rust elif [ "${shortname}" == "rw" ]; then - fn_info_config_risingworld -elif [ "${shortname}" == "sol" ]; then - fn_info_config_soldat -elif [ "${shortname}" == "sof2" ]; then - fn_info_config_sof2 -elif [ "${engine}" == "source" ]||[ "${engine}" == "goldsrc" ]; then - fn_info_config_source -elif [ "${shortname}" == "sb" ]; then - fn_info_config_starbound -elif [ "${shortname}" == "ts3" ]; then - fn_info_config_teamspeak3 -elif [ "${shortname}" == "mumble" ]; then - fn_info_config_mumble + fn_info_game_rw elif [ "${shortname}" == "samp" ]; then - fn_info_config_samp -elif [ "${shortname}" == "pstbs" ]; then - fn_info_config_sbots -elif [ "${shortname}" == "tw" ]; then - fn_info_config_teeworlds -elif [ "${shortname}" == "terraria" ]; then - fn_info_config_terraria -elif [ "${shortname}" == "tu" ]; then - fn_info_config_towerunite -elif [ "${engine}" == "unreal" ]; then - fn_info_config_unreal -elif [ "${engine}" == "unreal2" ]; then - fn_info_config_unreal2 -elif [ "${engine}" == "unreal3" ]; then - fn_info_config_unreal3 -elif [ "${shortname}" == "ut" ]; then - fn_info_config_ut + fn_info_game_samp +elif [ "${shortname}" == "sb" ]; then + fn_info_game_sb +elif [ "${shortname}" == "sbots" ]; then + fn_info_game_sbots elif [ "${shortname}" == "scpsl" ]||[ "${shortname}" == "scpslsm" ]; then - fn_info_config_scpsl + fn_info_game_scpsl 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 - fn_info_config_wurmunlimited -elif [ "${shortname}" == "mta" ]; then - fn_info_config_mta + fn_info_game_sdtd +elif [ "${shortname}" == "sof2" ]; then + fn_info_game_sof2 +elif [ "${shortname}" == "sol" ]; then + fn_info_game_sol +elif [ "${engine}" == "spark" ]; then + fn_info_game_spark elif [ "${shortname}" == "squad" ]; then - fn_info_config_squad + fn_info_game_squad elif [ "${shortname}" == "st" ]; then - fn_info_config_stationeers -elif [ "${shortname}" == "mh" ]; then - fn_info_config_mordhau -elif [ "${shortname}" == "pvr" ];then - fn_info_config_pavlovvr + fn_info_game_st +elif [ "${shortname}" == "terraria" ]; then + fn_info_game_terraria +elif [ "${shortname}" == "tu" ]; then + fn_info_game_tu +elif [ "${shortname}" == "tw" ]; then + fn_info_game_tw +elif [ "${shortname}" == "unt" ]; then + fn_info_game_unt +elif [ "${shortname}" == "ut" ]; then + fn_info_game_ut +elif [ "${shortname}" == "ut2k4" ]; then + fn_info_game_ut2k4 +elif [ "${shortname}" == "ut3" ]; then + fn_info_game_ut3 +elif [ "${shortname}" == "vh" ]; then + fn_info_game_vh elif [ "${shortname}" == "vints" ]; then - fn_info_config_vintagestory + fn_info_game_vints +elif [ "${shortname}" == "wet" ]; then + fn_info_game_wet +elif [ "${shortname}" == "wf" ]; then + fn_info_game_wf elif [ "${shortname}" == "wmc" ]; then - fn_info_config_waterfall + fn_info_game_wmc +elif [ "${shortname}" == "wurm" ]; then + fn_info_game_wurm +elif [ "${engine}" == "source" ]||[ "${engine}" == "goldsrc" ]; then + fn_info_game_source +elif [ "${engine}" == "unreal" ]; then + fn_info_game_unreal +elif [ "${engine}" == "unreal2" ]; then + fn_info_game_unreal2 fi diff --git a/lgsm/functions/info_messages.sh b/lgsm/functions/info_messages.sh index d2ef50586..f68d12e4f 100755 --- a/lgsm/functions/info_messages.sh +++ b/lgsm/functions/info_messages.sh @@ -92,7 +92,7 @@ fn_info_message_distro(){ echo -e "${lightyellow}Distro Details${default}" fn_messages_separator { - echo -e "${lightblue}Date:\t${default}${date}" + echo -e "${lightblue}Date:\t${default}$(date)" echo -e "${lightblue}Distro:\t${default}${distroname}" echo -e "${lightblue}Arch:\t${default}${arch}" echo -e "${lightblue}Kernel:\t${default}${kernel}" @@ -637,7 +637,7 @@ fn_info_message_commandlineparms(){ echo -e "${preexecutable} ${executable} ${startparameters}" } -fn_info_message_ports(){ +fn_info_message_ports_edit(){ # # Ports # ================================= @@ -650,18 +650,18 @@ fn_info_message_ports(){ startparameterslocation="${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" "Vintage Story" "wurm") + local ports_edit_array=( "ac" "arma3" "bo" "bt" "dst" "eco" "idtech2" "idtech3" "idtech3_ql" "jc2" "jc3" "lwjgl2" "mcb" "mumble" "pc" "pz" "qw" "refractor" "renderware" "rw" "sb" "sdtd" "st" "ts3" "tw" "terraria" "unreal" "unreal2" "unreal3" "vints" "wurm") for port_edit in "${ports_edit_array[@]}"; do if [ "${shortname}" == "ut3" ]; then startparameterslocation="${servercfgdir}/UTWeb.ini" elif [ "${shortname}" == "kf2" ]; then startparameterslocation="${servercfgdir}/LinuxServer-KFEngine.ini\n${servercfgdir}/KFWeb.ini" - elif [ "${engine}" == "${port_edit}" ]||[ "${gamename}" == "${port_edit}" ]; then + elif [ "${engine}" == "${port_edit}" ]||[ "${gamename}" == "${port_edit}" ]||[ "${shortname}" == "${port_edit}" ]; then startparameterslocation="${servercfgfullpath}" fi done # engines/games that require editing the start parameters. - local ports_edit_array=( "Avorion" "col" "goldsrc" "Factorio" "Hurtworld" "iw3.0" "ioquake3" "qfusion" "Rust" "scpsl" "scpslsm" "Soldat" "spark" "source" "starbound" "unreal4" "realvirtuality" "Unturned" "vh" ) + local ports_edit_array=( "av" "col" "fctr" "goldsrc" "hw" "iw3.0" "ioquake3" "qfusion" "rust" "scpsl" "scpslsm" "sol" "spark" "source" "unreal4" "arma3" "unt" "vh" ) for port_edit in "${ports_edit_array[@]}"; do if [ "${engine}" == "${port_edit}" ]||[ "${gamename}" == "${port_edit}" ]||[ "${shortname}" == "${port_edit}" ]; then startparameterslocation="${configdirserver}" @@ -669,7 +669,27 @@ fn_info_message_ports(){ done echo -e "${startparameterslocation}" echo -e "" +} + +fn_info_message_ports(){ echo -e "${lightblue}Useful port diagnostic command:${default}" + if [ "${shortname}" == "av" ]; then + echo -e "ss -tuplwn | grep AvorionServer" + elif [ "${shortname}" == "bf1942" ]; then + echo -e "ss -tuplwn | grep bf1942_lnxded" + elif [ "${shortname}" == "mc" ]||[ "${shortname}" == "pmc" ]||[ "${shortname}" == "rw" ]||[ "${shortname}" == "wmc" ]; then + echo -e "ss -tuplwn | grep java" + elif [ "${shortname}" == "terraria" ]; then + echo -e "ss -tuplwn | grep Main" + elif [ "${engine}" == "source" ]; then + echo -e "ss -tuplwn | grep srcds_linux" + elif [ "${engine}" == "goldsrc" ]; then + echo -e "ss -tuplwn | grep hlds_linux" + else + executableshort="$(echo "${executable//.\/}" | cut -c -15)" + echo -e "ss -tuplwn | grep ${executableshort}" + fi + echo -e "" } fn_info_message_statusbottom(){ @@ -728,477 +748,562 @@ fn_info_logs(){ # Engine/Game Specific details -fn_info_message_assettocorsa(){ - echo -e "netstat -atunp| grep acServer" - echo -e "" +# Function used to generate port info. by passing info to function. (Reduces repeating code) +# example output +# DESCRIPTION PORT PROTOCOL LISTEN +# Game 7777 udp 1 +# RAW UDP Socket 7778 udp 1 +# Query 27015 udp 1 +# RCON 27020 tcp 1 + +fn_port(){ + if [ "${1}" == "header" ]; then + echo -e "${lightblue}DESCRIPTION\tPORT\tPROTOCOL\tLISTEN${default}" + else + portname="${1}" + porttype="${2}" + portprotocol="${3}" + echo -e "${portname}\t${!porttype}\t${portprotocol}\t$(echo "${ssinfo}" | grep ${portprotocol} | grep ${!porttype} | wc -l)" + fi +} + +fn_info_message_ac(){ { - echo -e "${lightblue}DESCRIPTION\tDIRECTION\tPORT\tPROTOCOL${default}" - echo -e "> Game\tINBOUND\t${port}\tudp" - echo -e "> HTTP\tINBOUND\t${port}\tudp" + fn_port "header" + fn_port "Game" port udp + fn_port "Game" port tcp + fn_port "Query" queryport udp + fn_port "HTTP" httpport tcp } | column -s $'\t' -t } fn_info_message_ark(){ - echo -e "netstat -atunp | grep ShooterGame" - echo -e "" { - 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 - echo -e "> RAW\tINBOUND\t$((port+1))\tudp" - fi - echo -e "> Query\tINBOUND\t${queryport}\tudp" - echo -e "> RCON\tINBOUND\t${rconport}\ttcp" + fn_port "header" + fn_port "Game" port udp + fn_port "RAW UDP Socket" rawport udp + fn_port "Query" queryport udp + fn_port "RCON" rconport tcp } | column -s $'\t' -t } -fn_info_message_avorion() { - echo "netstat -atunp | grep Avorion" - echo -e "" +fn_info_message_arma3(){ { - echo -e "DESCRIPTION\tDIRECTION\tPORT\tPROTOCOL" - echo -e "> Game\tINBOUND\t${port}\tudp" - echo -e "> RCON\tINBOUND\t${rconport}\ttcp" + fn_port "header" + fn_port "Game" port udp + fn_port "Voice" voiceport udp + fn_port "Query Steam" queryport udp + fn_port "Steam Master" steammasterport udp + fn_port "Voice (unused)" voiceunusedport udp + fn_port "BattleEye" battleeyeport udp } | column -s $'\t' -t } -fn_info_message_ballisticoverkill(){ - echo -e "netstat -atunp | grep BODS.x86" - echo -e "" +fn_info_message_av(){ { - echo -e "${lightblue}DESCRIPTION\tDIRECTION\tPORT\tPROTOCOL${default}" - echo -e "> Game/RCON\tINBOUND\t${port}\tudp" - echo -e "> Query\tINBOUND\t${queryport}\tudp" + fn_port "header" + fn_port "Game" port udp + fn_port "Query" queryport udp + fn_port "Steam Master" steammasterport udp + fn_port "Steam Query" steamqueryport udp + fn_port "RCON" rconport tcp } | column -s $'\t' -t } -fn_info_message_battalion1944(){ - echo -e "netstat -atunp | grep BattalionServ" - echo -e "" +fn_info_message_bf1942(){ { - 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 - if [ "${port}" -eq "${port}" ]; then - echo -e "> Steam\tINBOUND\t$((port+1))\tudp" - echo -e "> Unused\tINBOUND\t$((port+2))\ttcp" - fi - echo -e "> Query\tINBOUND\t${queryport}\tudp" + fn_port "header" + fn_port "Game" port udp + fn_port "Query" queryport udp } | column -s $'\t' -t } -fn_info_message_cod(){ - echo -e "netstat -atunp | grep cod_lnxded" - echo -e "" +fn_info_message_bfv(){ { - echo -e "${lightblue}DESCRIPTION\tDIRECTION\tPORT\tPROTOCOL${default}" - echo -e "> Game\tINBOUND\t${port}\tudp" + fn_port "header" + fn_port "Game" port udp + fn_port "Query" queryport udp } | column -s $'\t' -t } -fn_info_message_coduo(){ - echo -e "netstat -atunp | grep coduo_lnxded" - echo -e "" +fn_info_message_bo(){ { - echo -e "${lightblue}DESCRIPTION\tDIRECTION\tPORT\tPROTOCOL${default}" - echo -e "> Game\tINBOUND\t${port}\tudp" + fn_port "header" + fn_port "Game" port udp + fn_port "Query" queryport udp } | column -s $'\t' -t } -fn_info_message_chivalry(){ +fn_info_message_bt(){ + { + fn_port "header" + fn_port "Game" port udp + fn_port "Query" queryport udp + } | column -s $'\t' -t +} + +fn_info_message_bt1944(){ + { + fn_port "header" + fn_port "Game" port udp + fn_port "Query" queryport udp + fn_port "RCON" rconport tcp + } | column -s $'\t' -t +} + +fn_info_message_cmw(){ 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" + fn_port "header" + fn_port "Game" port udp + fn_port "Query" queryport udp + fn_port "RCON" rconport tcp + } | column -s $'\t' -t +} + +fn_info_message_cod(){ + { + fn_port "header" + fn_port "Game" port udp + fn_port "Query" queryport udp + } | column -s $'\t' -t +} + +fn_info_message_coduo(){ + { + fn_port "header" + fn_port "Game" port udp + fn_port "Query" queryport udp } | column -s $'\t' -t } fn_info_message_cod2(){ - echo -e "netstat -atunp | grep cod2_lnxded" - echo -e "" { - echo -e "${lightblue}DESCRIPTION\tDIRECTION\tPORT\tPROTOCOL${default}" - echo -e "> Game\tINBOUND\t${port}\tudp" + fn_port "header" + fn_port "Game" port udp + fn_port "Query" queryport udp } | column -s $'\t' -t } fn_info_message_cod4(){ - echo -e "netstat -atunp" - echo -e "" { - echo -e "${lightblue}DESCRIPTION\tDIRECTION\tPORT\tPROTOCOL${default}" - echo -e "> Game\tINBOUND\t${port}\tudp" + fn_port "header" + fn_port "Game" port udp + fn_port "Query" queryport udp } | column -s $'\t' -t } fn_info_message_codwaw(){ - echo -e "netstat -atunp | grep codwaw_lnxded" - echo -e "" { - echo -e "${lightblue}DESCRIPTION\tDIRECTION\tPORT\tPROTOCOL${default}" - echo -e "> Game\tINBOUND\t${port}\tudp" + fn_port "header" + fn_port "Game" port udp + fn_port "Query" queryport udp + } | column -s $'\t' -t +} + +fn_info_message_col(){ + { + fn_port "header" + fn_port "Game" port udp + fn_port "Query" queryport tcp + fn_port "Steam" steamport tcp + } | column -s $'\t' -t +} + +fn_info_message_csgo(){ + { + fn_port "header" + fn_port "Game" port udp + fn_port "Query" queryport tcp + fn_port "RCON" rconport tcp + fn_port "SourceTV" sourcetvport udp + fn_port "Client" clientport udp } | column -s $'\t' -t } fn_info_message_dst(){ - echo -e "netstat -atunp | grep dontstarve" - echo -e "" { - 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" - echo -e "> Steam: Master\tINBOUND\t${steammasterserverport}\tudp" + fn_port "header" + fn_port "Game: Server" port udp + fn_port "Game: Master" masterport udp + fn_port "Steam: Auth" steamauthport udp + fn_port "Steam: Master" steammasterport udp } | column -s $'\t' -t } fn_info_message_eco(){ - echo -e "netstat -atunp | grep EcoServer" - echo -e "" { - echo -e "${lightblue}DESCRIPTION\tDIRECTION\tPORT\tPROTOCOL${default}" - echo -e "> Game\tINBOUND\t${port}\tudp" - echo -e "> Web Admin\tINBOUND\t${webadminport}\ttcp" + fn_port "header" + fn_port "Game" port udp + fn_port "Web Admin" webadminport tcp } | column -s $'\t' -t } - -fn_info_message_etlegacy(){ - echo -e "netstat -atunp | grep etlded" - echo -e "" +fn_info_message_etl(){ { - echo -e "${lightblue}DESCRIPTION\tDIRECTION\tPORT\tPROTOCOL${default}" - echo -e "> Game/Query\tINBOUND\t${port}\tudp" + fn_port "header" + fn_port "Game" port udp + fn_port "Query" queryport udp } | column -s $'\t' -t } -fn_info_message_factorio(){ - echo -e "netstat -atunp | grep factorio" - echo -e "" +fn_info_message_fctr(){ { - echo -e "${lightblue}DESCRIPTION\tDIRECTION\tPORT\tPROTOCOL${default}" - echo -e "> Game\tINBOUND\t${port}\tudp" - echo -e "> RCON\tINBOUND\t${rconport}\ttcp" + fn_port "header" + fn_port "Game" port udp + fn_port "RCON" rconport tcp } | column -s $'\t' -t } fn_info_message_goldsrc(){ - echo -e "netstat -atunp | grep hlds_linux" - echo -e "" { - echo -e "${lightblue}DESCRIPTION\tDIRECTION\tPORT\tPROTOCOL${default}" - echo -e "> Game/RCON\tINBOUND\t${port}\ttcp/udp" - echo -e "< Client\tOUTBOUND\t${clientport}\tudp" + fn_port "header" + fn_port "Game" port udp + fn_port "Client" clientport udp } | column -s $'\t' -t } -fn_info_message_hurtworld(){ - echo -e "netstat -atunp | grep Hurtworld" - echo -e "" +fn_info_message_hw(){ { - echo -e "${lightblue}DESCRIPTION\tDIRECTION\tPORT\tPROTOCOL${default}" - echo -e "> Game/RCON\tINBOUND\t${port}\tudp" - echo -e "> Query\tINBOUND\t${queryport}\tudp" + fn_port "header" + fn_port "Game" port udp + fn_port "Query" queryport udp + } | column -s $'\t' -t +} + +fn_info_message_ins(){ + { + fn_port "header" + fn_port "Game" port udp + fn_port "Query" queryport tcp + fn_port "RCON" rconport tcp + fn_port "SourceTV" sourcetvport udp + fn_port "Client" clientport udp } | column -s $'\t' -t } fn_info_message_inss(){ - echo -e "netstat -atunp | grep Insurgency" - echo -e "" { - echo -e "${lightblue}DESCRIPTION\tDIRECTION\tPORT\tPROTOCOL${default}" - echo -e "> Game\tINBOUND\t${port}\tudp" - echo -e "> Query\tINBOUND\t${queryport}\tudp" - if [ -n "${rconport}" ]; then - echo -e "> RCON\tINBOUND\t${rconport}\ttcp" - fi + fn_port "header" + fn_port "Game" port udp + fn_port "Query" queryport udp + fn_port "RCON" rconport tcp } | 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_jc2(){ + { + fn_port "header" + fn_port "Game" port udp + fn_port "Query" queryport udp + } | column -s $'\t' -t +} + +fn_info_message_jc3(){ + { + fn_port "header" + fn_port "Game" port udp + fn_port "Query" queryport udp + fn_port "Steam" steamport udp + fn_port "HTTP" httpport tcp + } | column -s $'\t' -t +} -fn_info_message_justcause2(){ - echo -e "netstat -atunp | grep Jcmp-Server" +fn_info_message_jk2(){ + { + fn_port "header" + fn_port "Game" port udp + } | column -s $'\t' -t +} + +fn_info_message_kf(){ + { + fn_port "header" + fn_port "Game" port udp + fn_port "Query" queryport udp + fn_port "Query (GameSpy)" queryportgs udp + fn_port "Web Admin" webadminport tcp + fn_port "LAN" lanport udp + fn_port "Steam" steamport udp + fn_port "Steam Master" steammasterport udp + } | column -s $'\t' -t echo -e "" + echo -e "${lightgreen}${servername} Web Admin${default}" + fn_messages_separator { - echo -e "${lightblue}DESCRIPTION\tDIRECTION\tPORT\tPROTOCOL${default}" - echo -e "> Game\tINBOUND\t${port}\tudp" + 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 } -fn_info_message_justcause3(){ - echo -e "netstat -atunp | grep Server" +fn_info_message_kf2(){ + fn_info_message_password_strip + { + fn_port "header" + fn_port "Game" port udp + fn_port "Query" queryport udp + fn_port "Web Admin" webadminport tcp + } | column -s $'\t' -t echo -e "" + echo -e "${lightgreen}${servername} Web Admin${default}" + fn_messages_separator { - 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" + 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 } fn_info_message_lo(){ - echo -e "netstat -atunp | grep MistServer" - echo -e "" { - echo -e "${lightblue}DESCRIPTION\tDIRECTION\tPORT\tPROTOCOL${default}" - echo -e "> Game\tINBOUND\t${port}\tudp" - echo -e "> Query\tINBOUND\t${queryport}\tudp" + fn_port "header" + fn_port "Game" port udp + fn_port "Query" queryport udp } | column -s $'\t' -t } -fn_info_message_minecraft(){ - echo -e "netstat -atunp | grep java" - echo -e "" +fn_info_message_mc(){ { - 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" + fn_port "header" + fn_port "Game" port tcp + fn_port "Query" queryport udp + fn_port "RCON" rconport tcp } | column -s $'\t' -t } -fn_info_message_minecraft_bedrock(){ - echo -e "netstat -atunp | grep bedrock_serv" - echo -e "" +fn_info_message_mcb(){ { - echo -e "${lightblue}DESCRIPTION\tDIRECTION\tPORT\tPROTOCOL${default}" - echo -e "> Game\tINBOUND\t${port}\tudp" - echo -e "> Game\tINBOUND\t${port6}\tudp6" + fn_port "header" + fn_port "Game" port udp + fn_port "Game" portipv6 udp6 } | column -s $'\t' -t } -fn_info_message_onset(){ - echo -e "netstat -atunp | grep OnsetServer" - echo -e "" +fn_info_message_mh(){ { - 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" + fn_port "header" + fn_port "Game" port udp + fn_port "Query" queryport udp + fn_port "Beacon" beaconport udp } | 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" + fn_port "header" + fn_port "Game" port udp } | 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" + fn_port "header" + fn_port "Game" port udp + fn_port "Beacon" beaconport udp } | column -s $'\t' -t } -fn_info_message_mumble(){ - echo -e "netstat -atunp | grep murmur" - echo -e "" +fn_info_message_mta(){ { - echo -e "${lightblue}DESCRIPTION\tDIRECTION\tPORT\tPROTOCOL${default}" - echo -e "> Voice\tINBOUND\t${port}\tudp" - echo -e "> ServerQuery\tINBOUND\t${port}\ttcp" + fn_port "header" + fn_port "Game" port udp + if [ "${ase}" == "Enabled" ]; then + fn_port "Query" queryport udp + fi + fn_port "HTTP" httpport tcp } | column -s $'\t' -t } -fn_info_message_pstbs(){ - echo -e "netstat -atunp | grep PostScriptum" - echo -e "" + +fn_info_message_mumble(){ { - 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" + fn_port "header" + fn_port "Voice" port udp + fn_port "Query" queryport tcp } | column -s $'\t' -t } -fn_info_message_projectcars(){ - echo -e "netstat -atunp | grep DedicatedS" - echo -e "" +fn_info_message_onset(){ { - 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" + fn_port "header" + fn_port "Game" port udp + fn_port "Query" queryport udp + fn_port "HTTP" httpport tcp } | column -s $'\t' -t } -fn_info_message_projectzomboid(){ - echo -e "netstat -atunp | grep ProjectZomb" - echo -e "" +fn_info_message_pc(){ { - echo -e "${lightblue}DESCRIPTION\tDIRECTION\tPORT\tPROTOCOL${default}" - echo -e "> Game/Query\tINBOUND\t${port}\tudp" + fn_port "header" + fn_port "Game" port udp + fn_port "Query" queryport udp + fn_port "Steam" steamport udp } | column -s $'\t' -t } -fn_info_message_quake(){ - echo -e "netstat -atunp | grep mvdsv" - echo -e "" +fn_info_message_pstbs(){ { - echo -e "${lightblue}DESCRIPTION\tDIRECTION\tPORT\tPROTOCOL${default}" - echo -e "> Game\tINBOUND\t${port}\tudp" + fn_port "header" + fn_port "Game" port udp + fn_port "Query" queryport udp + fn_port "RCON" rconport tcp } | column -s $'\t' -t } -fn_info_message_quake2(){ - echo -e "netstat -atunp | grep quake2" - echo -e "" +fn_info_message_pvr(){ { - echo -e "${lightblue}DESCRIPTION\tDIRECTION\tPORT\tPROTOCOL${default}" - echo -e "> Game\tINBOUND\t${port}\tudp" + fn_port "header" + fn_port "Game" port udp + fn_port "Game" port tcp + fn_port "Game+400" port401 udp + fn_port "Query" queryport tcp } | column -s $'\t' -t } -fn_info_message_quake3(){ - echo -e "netstat -atunp | grep q3ded" - echo -e "" +fn_info_message_pz(){ { - echo -e "${lightblue}DESCRIPTION\tDIRECTION\tPORT\tPROTOCOL${default}" - echo -e "> Game\tINBOUND\t${port}\tudp" + fn_port "header" + fn_port "Game" port udp + fn_port "Query" queryport udp } | column -s $'\t' -t } -fn_info_message_quakelive(){ - echo -e "netstat -atunp | grep qzeroded" - echo -e "" - if [ -z "${port}" ]||[ -z "${rconport}" ]||[ -z "${statsport}" ]; then - echo -e "${red}ERROR!${default} Missing/commented ports in ${servercfg}." - echo -e "" - fi +fn_info_message_qw(){ { - 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" + fn_port "header" + fn_port "Game" port udp } | column -s $'\t' -t } -fn_info_message_arma3(){ - echo -e "netstat -atunp | grep arma3server" - echo -e "" - # Default port - if [ -z "${port}" ]; then - port="2302" - fi +fn_info_message_q2(){ { - 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 - 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 + fn_port "header" + fn_port "Game" port udp } | column -s $'\t' -t } -fn_info_message_bf1942(){ - echo -e "netstat -atunp | grep bf1942_lnxd" - echo -e "" +fn_info_message_q3(){ { - echo -e "${lightblue}DESCRIPTION\tDIRECTION\tPORT\tPROTOCOL${default}" - echo -e "> Game/Query\tINBOUND\t${port}\tudp" - echo -e "> Query Steam\tINBOUND\t${queryport}\tudp" + fn_port "header" + fn_port "Game" port udp } | column -s $'\t' -t } -fn_info_message_bfv(){ - echo -e "netstat -atunp | grep bfv_linded" - echo -e "" +fn_info_message_ql(){ { - echo -e "${lightblue}DESCRIPTION\tDIRECTION\tPORT\tPROTOCOL${default}" - echo -e "> Game\tINBOUND\t${port}\tudp" - echo -e "> Query\tINBOUND\t${queryport}\tudp" + fn_port "header" + fn_port "Game" port udp + fn_port "Query" queryport udp + fn_port "RCON" rconport tcp + fn_port "Stats" statsport udp } | column -s $'\t' -t } -fn_info_message_risingworld(){ - echo -e "netstat -atunp | grep java" +fn_info_message_ro(){ + { + fn_port "header" + fn_port "Game" port udp + fn_port "Query" queryport udp + fn_port "Web Admin" webadminport tcp + fn_port "LAN" lanport udp + fn_port "Steam" steamport udp + fn_port "Steam Master" steammasterport udp + } | column -s $'\t' -t echo -e "" + echo -e "${lightgreen}${servername} Web Admin${default}" + fn_messages_separator { - echo -e "${lightblue}DESCRIPTION\tDIRECTION\tPORT\tPROTOCOL${default}" - echo -e "> Game/Query\tINBOUND\t${port}\ttcp/udp" - echo -e "> Query HTTP\tINBOUND\t${httpqueryport}\ttcp" - echo -e "> RCON\tINBOUND\t${rconport}\ttcp" + 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 } fn_info_message_rtcw(){ - echo -e "netstat -atunp | grep iowolfded" - echo -e "" { - echo -e "${lightblue}DESCRIPTION\tDIRECTION\tPORT\tPROTOCOL${default}" - echo -e "> Game\tINBOUND\t${port}\tudp" + fn_port "header" + fn_port "Game" port udp } | column -s $'\t' -t } fn_info_message_rust(){ - echo -e "netstat -atunp | grep Rust" - echo -e "" { - echo -e "${lightblue}DESCRIPTION\tDIRECTION\tPORT\tPROTOCOL${default}" - echo -e "> Game/Query\tINBOUND\t${port}\tudp" - echo -e "> RCON\tINBOUND\t${rconport}\ttcp" - echo -e "> App\tINBOUND\t${appport}\ttcp" + fn_port "header" + fn_port "Game" port udp + fn_port "Query" queryport udp + fn_port "RCON" rconport tcp + fn_port "App" appport tcp + } | column -s $'\t' -t +} + +fn_info_message_rw(){ + { + fn_port "header" + fn_port "Game" port udp + fn_port "Game+1" port2 udp + fn_port "Game+2" port3 udp + fn_port "Game+3" port4 udp + fn_port "Game+1" port2 tcp + fn_port "Game+2" port3 tcp + fn_port "Game+3" port4 tcp + fn_port "Query" queryport tcp + fn_port "Query HTTP" httpqueryport tcp + fn_port "RCON" rconport tcp } | column -s $'\t' -t } fn_info_message_samp(){ - echo -e "netstat -atunp | grep samp03svr" - echo -e "" { - echo -e "${lightblue}DESCRIPTION\tDIRECTION\tPORT\tPROTOCOL${default}" - echo -e "> Game/RCON\tINBOUND\t${port}\ttcp/udp" + fn_port "header" + fn_port "Game" port udp + fn_port "RCON" rconport udp + } | column -s $'\t' -t +} + +fn_info_message_sb(){ + { + fn_port "header" + fn_port "Game" port udp + fn_port "Query" queryport tcp + fn_port "RCON" rconport tcp } | column -s $'\t' -t } fn_info_message_sbots(){ - echo -e "netstat -atunp | grep blank1" - echo -e "" { - echo -e "${lightblue}DESCRIPTION\tDIRECTION\tPORT\tPROTOCOL${default}" - echo -e "> Game\tINBOUND\t${port}\tudp" - echo -e "> Query\tINBOUND\t${queryport}\tudp" + fn_port "header" + fn_port "Game" port udp + fn_port "Query" queryport udp + } | column -s $'\t' -t +} + +fn_info_message_scpsl(){ + { + fn_port "header" + fn_port "Game" port tcp } | column -s $'\t' -t } fn_info_message_sdtd(){ fn_info_message_password_strip - echo -e "netstat -atunp | grep 7DaysToDie" - echo -e "" { - 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 "> Web Admin\tINBOUND\t${webadminport}\ttcp" - echo -e "> Telnet\tINBOUND\t${telnetport}\ttcp" + fn_port "header" + fn_port "Game" port udp + fn_port "Game+2" port3 udp + fn_port "Query" queryport tcp + fn_port "Web Admin" webadminport tcp + fn_port "Telnet" telnetport tcp } | column -s $'\t' -t echo -e "" echo -e "${lightgreen}${gamename} Web Admin${default}" fn_messages_separator { 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 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 echo -e "" @@ -1212,37 +1317,44 @@ fn_info_message_sdtd(){ } fn_info_message_sof2(){ - echo -e "netstat -atunp | grep sof2ded" - echo -e "" { - echo -e "${lightblue}DESCRIPTION\tDIRECTION\tPORT\tPROTOCOL${default}" - echo -e "> Game/Query\tINBOUND\t${port}\tudp" + fn_port "header" + fn_port "Game" port udp + fn_port "Query" queryport udp } | column -s $'\t' -t } +fn_info_message_sol(){ + { + fn_port "header" + fn_port "Game" port udp + fn_port "Query" queryport udp + fn_port "Files" filesport tcp + } | column -s $'\t' -t +} fn_info_message_source(){ - echo -e "netstat -atunp | grep srcds_linux" - echo -e "" { - 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" + fn_port "header" + fn_port "Game" port udp + fn_port "Query" queryport tcp + fn_port "RCON" rconport tcp + fn_port "SourceTV" sourcetvport udp + # not manualy set by default more research needed + fn_port "Steam" steamport udp + fn_port "Client" clientport udp } | column -s $'\t' -t } fn_info_message_spark(){ fn_info_message_password_strip - echo -e "netstat -atunp | grep server_linux" - echo -e "" { - 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 "> Web Admin\tINBOUND\t${webadminport}\ttcp" + fn_port "header" + fn_port "Game" port udp + fn_port "Query" queryport udp + fn_port "Web Admin" webadminport tcp } | column -s $'\t' -t echo -e "" - echo -e "${lightgreen}${servername} Web Admin${default}" + echo -e "${lightgreen}${gamename} Web Admin${default}" fn_messages_separator { echo -e "${lightblue}Web Admin url:\t${default}http://${webadminip}:${webadminport}/index.html" @@ -1252,107 +1364,75 @@ fn_info_message_spark(){ } fn_info_message_squad(){ - echo -e "netstat -atunp | grep SquadServer" - 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\t${rconport}\ttcp" + fn_port "header" + fn_port "Game" port udp + fn_port "Query" queryport udp + fn_port "RCON" rconport tcp } | column -s $'\t' -t } -fn_info_message_starbound(){ - echo -e "netstat -atunp | grep starbound" - echo -e "" +fn_info_message_st(){ { - 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" + fn_port "header" + fn_port "Game" port udp + fn_port "Query" queryport udp + fn_port "Web Admin" webadminport tcp } | column -s $'\t' -t -} - -fn_info_message_stationeers(){ - echo -e "netstat -atunp | grep rocketstation" echo -e "" + echo -e "${lightgreen}${gamename} Web Admin${default}" + fn_messages_separator { - echo -e "${lightblue}DESCRIPTION\tDIRECTION\tPORT\tPROTOCOL${default}" - echo -e "> Game\tINBOUND\t${port}\ttcp" - echo -e "> Query\tINBOUND\t${queryport}\ttcp" + echo -e "${lightblue}Web Admin url:\t${default}http://${webadminip}:${webadminport}" } | column -s $'\t' -t } -fn_info_message_teamspeak3(){ - echo -e "netstat -atunp | grep ts3server" - echo -e "" +fn_info_message_ts3(){ { - 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" + fn_port "header" + fn_port "Voice" port udp + fn_port "Query" queryport tcp + fn_port "Query (SSH)" querysshport tcp + fn_port "Query (http)" queryhttpport tcp + fn_port "Query (https)" queryhttpsport tcp + fn_port "File Transfer" fileport tcp + fn_port "Telnet" telnetport tcp } | column -s $'\t' -t } -fn_info_message_teeworlds(){ - echo -e "netstat -atunp | grep teeworlds" - echo -e "" +fn_info_message_tw(){ { - echo -e "${lightblue}DESCRIPTION\tDIRECTION\tPORT\tPROTOCOL${default}" - echo -e "> Game\Query\tINBOUND\t${port}\ttcp" + fn_port "header" + fn_port "Game" port udp + fn_port "Query" queryport udp } | column -s $'\t' -t } fn_info_message_terraria(){ - echo -e "netstat -atunp | grep Terraria" - echo -e "" { - echo -e "${lightblue}DESCRIPTION\tDIRECTION\tPORT\tPROTOCOL${default}" - echo -e "> Game\tINBOUND\t${port}\ttcp" + fn_port "header" + fn_port "Game" port tcp + fn_port "Query" queryport tcp } | column -s $'\t' -t } -fn_info_message_towerunite(){ - echo -e "netstat -atunp | grep TowerServer" - echo -e "" +fn_info_message_tu(){ { - 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 - echo -e "> Steam\tINBOUND\t$((port+1))\tudp" - fi - echo -e "> Query\tINBOUND\t${queryport}\tudp" + fn_port "header" + fn_port "Game" port udp + fn_port "Query" queryport udp + fn_port "Steam" steamport udp } | column -s $'\t' -t } fn_info_message_unreal(){ 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 [ "${engine}" == "unreal" ]; then - echo -e "< UdpLink Port (random)\tOUTBOUND\t${udplinkport}+\tudp" - fi - if [ "${engine}" != "unreal" ]&&[ "${appid}" != "223250" ]; then - echo -e "> Query (GameSpy)\tINBOUND\t${queryportgs}\tudp\tOldQueryPortNumber=${queryportgs}" - fi - if [ "${appid}" == "215360" ]; then - echo -e "< Master server\tOUTBOUND\t28852\ttcp/udp" - else - echo -e "< Master server\tOUTBOUND\t28900/28902\ttcp/udp" - fi - if [ "${appid}" ]; then - if [ "${appid}" == "223250" ]; then - echo -e "> Steam\tINBOUND\t20610\tudp" - else - echo -e "> Steam\tINBOUND\t20660\tudp" - fi - fi - echo -e "> Web Admin\tINBOUND\t${webadminport}\ttcp\tListenPort=${webadminport}" + fn_port "header" + fn_port "Game" port udp + fn_port "Query" queryport udp + fn_port "LAN Beacon" beaconport udp + fn_port "Web Admin" webadminport tcp } | column -s $'\t' -t echo -e "" echo -e "${lightgreen}${servername} Web Admin${default}" @@ -1365,18 +1445,14 @@ 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 "" +fn_info_message_ut2k4(){ { - 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 "> Web Admin\tINBOUND\t${webadminport}\ttcp\tListenPort=${webadminport}" + fn_port "header" + fn_port "Game" port udp + fn_port "Query" queryport udp + fn_port "Query (GameSpy)" queryportgs udp + fn_port "Web Admin" webadminport tcp + fn_port "LAN" lanport udp } | column -s $'\t' -t echo -e "" echo -e "${lightgreen}${servername} Web Admin${default}" @@ -1389,15 +1465,14 @@ fn_info_message_unreal2(){ } | column -s $'\t' -t } -fn_info_message_unreal3(){ +fn_info_message_unreal(){ fn_info_message_password_strip - echo -e "netstat -atunp | grep ut3-bin" - 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 "> Web Admin\tINBOUND\t${webadminport}\ttcp\tListenPort=${webadminport}" + fn_port "header" + fn_port "Game" port udp + fn_port "Query" queryport udp + fn_port "LAN Beacon" beaconport udp + fn_port "Web Admin" webadminport tcp } | column -s $'\t' -t echo -e "" echo -e "${lightgreen}${servername} Web Admin${default}" @@ -1410,45 +1485,29 @@ fn_info_message_unreal3(){ } | column -s $'\t' -t } -fn_info_message_unturned(){ - echo -e "netstat -atunp | grep Unturned" - echo -e "" +fn_info_message_unt(){ { - echo -e "${lightblue}DESCRIPTION\tDIRECTION\tPORT\tPROTOCOL${default}" - echo -e "> Game\tINBOUND\t${port}\tudp" - echo -e "> Query\tINBOUND\t${queryport}\tudp" + fn_port "header" + fn_port "Game" port udp + fn_port "Query" queryport udp } | 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" + fn_port "header" + fn_port "Game" port udp + fn_port "Query" queryport udp } | column -s $'\t' -t } -fn_info_message_vh(){ - echo -e "netstat -atunp | grep valheim" - 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_kf2(){ +fn_info_message_ut3(){ fn_info_message_password_strip - echo -e "netstat -atunp | grep KFGame" - echo -e "" { - 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" - echo -e "> Web Admin\tINBOUND\t${webadminport}\ttcp\tListenPort=${webadminport}" + fn_port "header" + fn_port "Game" port udp + fn_port "Query" queryport udp + fn_port "Web Admin" webadminport tcp } | column -s $'\t' -t echo -e "" echo -e "${lightgreen}${servername} Web Admin${default}" @@ -1461,141 +1520,69 @@ fn_info_message_kf2(){ } | column -s $'\t' -t } -fn_info_message_wolfensteinenemyterritory(){ - echo -e "netstat -atunp | grep etded" - echo -e "" - { - echo -e "${lightblue}DESCRIPTION\tDIRECTION\tPORT\tPROTOCOL${default}" - echo -e "> Game/Query\tINBOUND\t${port}\tudp" - } | column -s $'\t' -t -} - - -fn_info_message_wurmunlimited(){ - echo -e "netstat -atunp | grep WurmServer" - echo -e "" - { - echo -e "${lightblue}DESCRIPTION\tDIRECTION\tPORT\tPROTOCOL${default}" - echo -e "> Game\tINBOUND\t${port}\ttcp" - echo -e "> Query\tINBOUND\t${queryport}\tudp" - } | column -s $'\t' -t -} - -fn_info_message_mta(){ - echo -e "netstat -atunp | grep mta-server" - echo -e "" - { - echo -e "${lightblue}DESCRIPTION\tDIRECTION\tPORT\tPROTOCOL${default}" - echo -e "> Game/Query\tINBOUND\t${port}\tudp" - echo -e "> HTTP Server\tINBOUND\t${httpport}\ttcp" - if [ "${ase}" == "Enabled" ]; then - echo -e "> Query Port\tOUTBOUND\t${queryport}\tudp" - fi - } | column -s $'\t' -t -} - -fn_info_message_mordhau(){ - echo -e "netstat -atunp | grep Mord" - echo -e "" - { - 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" - } | column -s $'\t' -t -} - -fn_info_message_barotrauma(){ - echo -e "netstat -atunp | grep /./Server.bin" - echo -e "" - { - 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 -e "netstat -atunp | grep soldat" - 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 "> FILES\tINBOUND\t$((port+10))\ttcp" - } | column -s $'\t' -t -} - -fn_info_message_warfork(){ - echo -e "netstat -atunp | grep wf_server" - echo -e "" +fn_info_message_vh(){ { - echo -e "${lightblue}DESCRIPTION\tDIRECTION\tPORT\tPROTOCOL${default}" - echo -e "> Game\tINBOUND\t${port}\tudp" - echo -e "> HTTP\tINBOUND\t${httpport}\ttcp" + fn_port "header" + fn_port "Game" port udp + fn_port "Query" queryport udp } | column -s $'\t' -t } -fn_info_message_pavlovvr(){ - echo "netstat -atunp | grep Pavlov" - echo -e "" +fn_info_message_vints(){ { - echo -e "DESCRIPTION\tDIRECTION\tPORT\tPROTOCOL" - echo -e "> Game\tINBOUND\t${port}\tudp" - echo -e "> Game\tINBOUND\t$((port+400))\tudp" + fn_port "header" + fn_port "Game" port tcp } | column -s $'\t' -t } -fn_info_message_colony(){ - echo -e "netstat -atunp | grep colonyserv" - echo -e "" +fn_info_message_wet(){ { - echo -e "${lightblue}DESCRIPTION\tDIRECTION\tPORT\tPROTOCOL${default}" - echo -e "> Game\tINBOUND\t${port}\tudp" - echo -e "> Steam\tINBOUND\t${steamport}\tudp" + fn_port "header" + fn_port "Game" port udp + fn_port "Query" queryport udp } | column -s $'\t' -t } -fn_info_message_vintagestory(){ - echo "netstat -atunp | grep cli" - echo -e "" +fn_info_message_wf(){ { - echo -e "DESCRIPTION\tDIRECTION\tPORT\tPROTOCOL" - echo -e "> Game\tINBOUND\t${port}\tTCP" + fn_port "header" + fn_port "Game" port udp + fn_port "HTTP" httpport tcp } | column -s $'\t' -t } -fn_info_message_scpsl(){ - echo -e "netstat -atunp | grep SCPSL" - echo -e "" +fn_info_message_wurm(){ { - echo -e "${lightblue}DESCRIPTION\tDIRECTION\tPORT\tPROTOCOL${default}" - echo -e "> Game\tINBOUND\t${port}\tudp" + fn_port "header" + fn_port "Game" port tcp + fn_port "Query" queryport udp } | column -s $'\t' -t } fn_info_message_select_engine(){ # Display details depending on game or engine. if [ "${shortname}" == "ac" ]; then - fn_info_message_assettocorsa + fn_info_message_ac 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}" == "av" ]; then + fn_info_message_av elif [ "${shortname}" == "bf1942" ]; then fn_info_message_bf1942 elif [ "${shortname}" == "bfv" ]; then fn_info_message_bfv elif [ "${shortname}" == "bo" ]; then - fn_info_message_ballisticoverkill + fn_info_message_bo elif [ "${shortname}" == "bt" ]; then - fn_info_message_barotrauma + fn_info_message_bt elif [ "${shortname}" == "bt1944" ]; then - fn_info_message_battalion1944 + fn_info_message_bt1944 + elif [ "${shortname}" == "csgo" ]; then + fn_info_message_csgo elif [ "${shortname}" == "cmw" ]; then - fn_info_message_chivalry + fn_info_message_cmw elif [ "${shortname}" == "cod" ]; then fn_info_message_cod elif [ "${shortname}" == "coduo" ]; then @@ -1607,107 +1594,117 @@ fn_info_message_select_engine(){ elif [ "${shortname}" == "codwaw" ]; then fn_info_message_codwaw elif [ "${shortname}" == "col" ]; then - fn_info_message_colony + fn_info_message_col elif [ "${shortname}" == "dst" ]; then fn_info_message_dst elif [ "${shortname}" == "eco" ]; then fn_info_message_eco elif [ "${shortname}" == "etl" ]; then - fn_info_message_etlegacy + fn_info_message_etl elif [ "${shortname}" == "fctr" ]; then - fn_info_message_factorio + fn_info_message_fctr elif [ "${shortname}" == "hw" ]; then - fn_info_message_hurtworld + fn_info_message_hw + elif [ "${shortname}" == "ins" ]; then + fn_info_message_ins elif [ "${shortname}" == "inss" ]; then fn_info_message_inss - elif [ "${shortname}" == "jk2" ]; then - fn_info_message_jk2 elif [ "${shortname}" == "jc2" ]; then - fn_info_message_justcause2 + fn_info_message_jc2 elif [ "${shortname}" == "jc3" ]; then - fn_info_message_justcause3 - elif [ "${shortname}" == "lo" ]; then - fn_info_message_lo + fn_info_message_jc3 + elif [ "${shortname}" == "jk2" ]; then + fn_info_message_jk2 + elif [ "${shortname}" == "kf" ]; then + fn_info_message_kf elif [ "${shortname}" == "kf2" ]; then fn_info_message_kf2 + elif [ "${shortname}" == "lo" ]; then + fn_info_message_lo elif [ "${shortname}" == "mc" ]||[ "${shortname}" == "pmc" ]||[ "${shortname}" == "wmc" ]; then - fn_info_message_minecraft + fn_info_message_mc elif [ "${shortname}" == "mcb" ]; then - fn_info_message_minecraft_bedrock + fn_info_message_mcb elif [ "${shortname}" == "mh" ]; then - fn_info_message_mordhau + fn_info_message_mh 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 [ "${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}" == "onset" ]; then + fn_info_message_onset + elif [ "${shortname}" == "pc" ]; then + fn_info_message_pc elif [ "${shortname}" == "pstbs" ]; then fn_info_message_pstbs - elif [ "${shortname}" == "pc" ]; then - fn_info_message_projectcars - elif [ "${shortname}" == "qw" ]; then - fn_info_message_quake + elif [ "${shortname}" == "pvr" ]; then + fn_info_message_pvr + elif [ "${shortname}" == "pz" ]; then + fn_info_message_pz elif [ "${shortname}" == "q2" ]; then - fn_info_message_quake2 + fn_info_message_q2 elif [ "${shortname}" == "q3" ]; then - fn_info_message_quake3 + fn_info_message_q3 elif [ "${shortname}" == "ql" ]; then - fn_info_message_quakelive + fn_info_message_ql + elif [ "${shortname}" == "qw" ]; then + fn_info_message_qw + elif [ "${shortname}" == "ro" ]; then + fn_info_message_ro + elif [ "${shortname}" == "rtcw" ]; then + fn_info_message_rtcw elif [ "${shortname}" == "samp" ]; then fn_info_message_samp + elif [ "${shortname}" == "sb" ]; then + fn_info_message_sb + elif [ "${shortname}" == "sbots" ]; then + fn_info_message_sbots elif [ "${shortname}" == "scpsl" ]||[ "${shortname}" == "scpslsm" ]; then fn_info_message_scpsl 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 elif [ "${shortname}" == "sol" ]; then - fn_info_message_soldat - elif [ "${shortname}" == "sb" ]; then - fn_info_message_starbound - elif [ "${shortname}" == "sbots" ]; then - fn_info_message_sbots + fn_info_message_sol + elif [ "${shortname}" == "squad" ]; then + fn_info_message_squad + elif [ "${shortname}" == "st" ]; then + fn_info_message_st elif [ "${shortname}" == "terraria" ]; then fn_info_message_terraria elif [ "${shortname}" == "ts3" ]; then - fn_info_message_teamspeak3 + fn_info_message_ts3 elif [ "${shortname}" == "tu" ]; then - fn_info_message_towerunite + fn_info_message_tu elif [ "${shortname}" == "tw" ]; then - fn_info_message_teeworlds + fn_info_message_tw elif [ "${shortname}" == "unt" ]; then - fn_info_message_unturned - elif [ "${shortname}" == "ut" ]; then - fn_info_message_ut + fn_info_message_unt elif [ "${shortname}" == "vh" ]; then fn_info_message_vh - elif [ "${shortname}" == "rtcw" ]; then - fn_info_message_rtcw - elif [ "${shortname}" == "pvr" ]; then - fn_info_message_pavlovvr + elif [ "${shortname}" == "vints" ]; then + fn_info_message_vints 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 - fn_info_message_wurmunlimited elif [ "${shortname}" == "rw" ]; then - fn_info_message_risingworld + fn_info_message_rw + elif [ "${shortname}" == "ut" ]; then + fn_info_message_ut + elif [ "${shortname}" == "ut2k4" ]; then + fn_info_message_ut2k4 + elif [ "${shortname}" == "ut3" ]; then + fn_info_message_ut3 elif [ "${shortname}" == "wet" ]; then - fn_info_message_wolfensteinenemyterritory + fn_info_message_wet + elif [ "${shortname}" == "wf" ]; then + fn_info_message_wf + elif [ "${shortname}" == "wurm" ]; then + fn_info_message_wurm elif [ "${engine}" == "goldsrc" ]; then fn_info_message_goldsrc elif [ "${engine}" == "source" ]; then @@ -1716,10 +1713,7 @@ fn_info_message_select_engine(){ fn_info_message_spark 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 fn_print_error_nl "Unable to detect server engine." fi diff --git a/lgsm/functions/info_parms.sh b/lgsm/functions/info_parms.sh deleted file mode 100755 index 9aee054cd..000000000 --- a/lgsm/functions/info_parms.sh +++ /dev/null @@ -1,332 +0,0 @@ -#!/bin/bash -# LinuxGSM info_parms.sh module -# Author: Daniel Gibbs -# Contributors: http://linuxgsm.com/contrib -# Website: https://linuxgsm.com -# Description: If specific parms are not set then this will be displayed in details. - -functionselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" - -## Examples of filtering to get info from config files -# sed 's/foo//g' - remove foo -# tr -cd '[:digit:]' leave only digits -# tr -d '=\"; ' remove selected charectors =\"; -# grep -v "foo" filter out lines that contain foo - -unavailable="${red}UNAVAILABLE${default}" -zero="${red}0${default}" - -fn_info_parms_ark(){ - port=${port:-"0"} - queryport=${queryport:-"0"} - rconport=${rconport:-"0"} - maxplayers=${maxplayers:-"0"} -} - -fn_info_parms_barotrauma(){ - port=${port:-"0"} - queryport=${queryport:-"0"} -} - -fn_info_parms_cod(){ - defaultmap=${defaultmap:-"NOT SET"} - maxplayers=${maxplayers:-"0"} - port=${port:-"0"} - queryport=${port:-"0"} -} - -fn_info_parms_dst(){ - sharding=${sharding:-"NOT SET"} - master=${master:-"NOT SET"} - shard=${shard:-"NOT SET"} - cluster=${cluster:-"NOT SET"} - cave=${cave:-"NOT SET"} -} - -fn_info_parms_factorio(){ - port=${port:-"0"} - rconport=${rconport:-"0"} - 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"} - servername=${servername:-"NOT SET"} - serverpassword=${serverpassword:-"NOT SET"} - defaultmap=${defaultmap:-"NOT SET"} - defaultscenario=${defaultscenario:-"NOT SET"} - maxplayers=${maxplayers:-"0"} -} - -fn_info_parms_jk2(){ - queryport=${port} -} - -fn_info_parms_kf2(){ - queryport=${queryport:-"0"} - defaultmap=${defaultmap:-"NOT SET"} -} - -fn_info_parms_lo(){ - servername=${servername:-"NOT SET"} - port=${port:-"0"} - queryport=${queryport:-"0"} -} - -fn_info_parms_mordhau(){ - port=${port:-"0"} - queryport=${queryport:-"0"} - beaconport=${beaconport:-"0"} -} - -fn_info_parms_mohaa(){ - port=${port:-"0"} - queryport=${port:-"0"} - defaultmap=${defaultmap:-"NOT SET"} -} - -fn_info_parms_mom(){ - port=${port:-"7777"} - beaconport=${queryport:-"15000"} -} - -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:-"0"} -} - -fn_info_parms_quake2(){ - port=${port:-"0"} - queryport=${port:-"0"} - 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"} - httpqueryport=$((port - 1)) -} - -fn_info_parms_rtcw(){ - port=${port:-"0"} - queryport="${port:-"0"}" - defaultmap=${defaultmap:-"NOT SET"} -} - -fn_info_parms_rust(){ - servername=${servername:-"NOT SET"} - port=${port:-"0"} - queryport=${port:-"0"} - appport=${appport:-"0"} - rconport=${rconport:-"0"} - gamemode=${gamemode:-"NOT SET"} - maxplayers=${maxplayers:-"0"} - rconpassword=${rconpassword:-"NOT SET"} - rconweb=${rconweb:-"NOT SET"} - tickrate=${tickrate:-"0"} - saveinterval=${saveinterval:-"0"} - serverlevel=${serverlevel:-"NOT SET"} - worldsize=${worldsize:-"0"} -} - -fn_info_parms_samp(){ - queryport=${port:-"0"} -} - -fn_info_parms_sof2(){ - port=${port:-"0"} - defaultmap=${defaultmap:-"NOT SET"} -} - -fn_info_parms_source(){ - defaultmap=${defaultmap:-"NOT SET"} - maxplayers=${maxplayers:-"0"} - port=${port:-"0"} - queryport=${port:-"0"} - clientport=${clientport:-"0"} -} - -fn_info_parms_spark(){ - defaultmap=${defaultmap:-"NOT SET"} - maxplayers=${maxplayers:-"0"} - port=${port:-"0"} - queryport=$((port + 1)) - servername=${servername:-"NOT SET"} - serverpassword=${serverpassword:-"NOT SET"} - webadminuser=${webadminuser:-"NOT SET"} - webadminpass=${webadminpass:-"NOT SET"} - webadminport=${webadminport:-"0"} - mods=${mods:-"NOT SET"} -} - -fn_info_parms_stickybots(){ - port=${port:-"0"} - queryport=${queryport:-"0"} - servername=${servername:-"NOT SET"} - serverpassword=${serverpassword:-"NOT SET"} - defaultmap=${defaultmap:-"NOT SET"} - maxplayers=${maxplayers:-"0"} -} - -fn_info_parms_sof2(){ - port=${port:-"0"} - queryport=${port:-"0"} - defaultmap=${defaultmap:-"NOT SET"} -} - -fn_info_parms_towerunite(){ - port=${port:-"0"} - queryport=${queryport:-"0"} -} - -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)) -} - -fn_info_parms_unreal2(){ - defaultmap=${defaultmap:-"NOT SET"} - queryport=$((port + 1)) -} - -fn_info_parms_unreal3(){ - port=${port:-"0"} - queryport=${queryport:-"0"} - defaultmap=${defaultmap:-"NOT SET"} -} - -fn_info_parms_unturned(){ - servername=${selfname:-"NOT SET"} - port=${port:-"0"} - queryport=$((port + 1)) -} - -fn_info_parms_ut(){ - port=${port:-"0"} -} - -fn_info_parms_vh(){ - port=${port:-"0"} - if [ "${public}" != "0" ]; then - queryport=$((port + 1)) - else - querymode="1" - fi - gameworld=${gameworld:-"NOT SET"} - serverpassword=${serverpassword:-"NOT SET"} - servername=${servername:-"NOT SET"} -} - -fn_info_parms_wf(){ - port=${port:-"0"} - queryport="${port:-"0"}" - webadminport=${webadminport:-"0"} -} - -fn_info_parms_queryport(){ - queryport="${port:-"0"}" -} - -if [ "${shortname}" == "ark" ]; then - fn_info_parms_ark -elif [ "${shortname}" == "arma3" ]; then - fn_info_parms_realvirtuality -elif [ "${shortname}" == "bt" ]; then - fn_info_parms_barotrauma -elif [ "${shortname}" == "cod" ]||[ "${shortname}" == "coduo" ]||[ "${engine}" == "iw2.0" ]||[ "${engine}" == "iw3.0" ]; then - fn_info_parms_cod -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}" == "lo" ]; then - fn_info_parms_lo -elif [ "${shortname}" == "mohaa" ]; then - fn_info_parms_mohaa -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 - fn_info_parms_quake2 -elif [ "${shortname}" == "rtcw" ]; then - fn_info_parms_rtcw -elif [ "${shortname}" == "rust" ]; then - fn_info_parms_rust -elif [ "${shortname}" == "samp" ]; then - fn_info_parms_samp -elif [ "${shortname}" == "rw" ]; then - fn_info_parms_risingworld -elif [ "${shortname}" == "sof2" ]; then - fn_info_parms_sof2 -elif [ "${shortname}" == "sbots" ]; then - fn_info_parms_stickybots -elif [ "${engine}" == "source" ]||[ "${engine}" == "goldsrc" ]; then - fn_info_parms_source -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}" == "vh" ]; then - fn_info_parms_vh -elif [ "${shortname}" == "mh" ]; then - fn_info_parms_mordhau -elif [ "${shortname}" == "mta" ]; then - fn_info_parms_mta -elif [ "${engine}" == "unreal" ]||[ "${engine}" == "unreal2" ]; then - fn_info_parms_unreal -elif [ "${engine}" == "unreal3" ]; then - fn_info_parms_unreal3 -elif [ "${shortname}" == "unt" ]; then - fn_info_parms_unturned -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/query_gamedig.sh b/lgsm/functions/query_gamedig.sh index 123d8c86c..32b70aac2 100755 --- a/lgsm/functions/query_gamedig.sh +++ b/lgsm/functions/query_gamedig.sh @@ -14,6 +14,10 @@ if [ "$(command -v gamedig 2>/dev/null)" ]&&[ "$(command -v jq 2>/dev/null)" ]; # will bypass query if server offline. check_status.sh if [ "${status}" != "0" ]; then + # GameDig requires you use the voice port when querying. + if [ "${querytype}" == "teamspeak3" ]; then + queryport="${port}" + fi # checks if query is working null = pass. gamedigcmd=$(echo -e "gamedig --type \"${querytype}\" --host \"${queryip}\" --query_port \"${queryport}\"|jq") gamedigraw=$(gamedig --type "${querytype}" --host "${queryip}" --query_port "${queryport}") @@ -25,6 +29,10 @@ if [ "$(command -v gamedig 2>/dev/null)" ]&&[ "$(command -v jq 2>/dev/null)" ]; querystatus=$(echo "${gamedigraw}" | jq '.error|length') fi + if [ "${querytype}" == "teamspeak3" ]; then + fn_info_game_ts3 + fi + # server name. gdname=$(echo "${gamedigraw}" | jq -re '.name') if [ "${gdname}" == "null" ]; then @@ -34,6 +42,8 @@ if [ "$(command -v gamedig 2>/dev/null)" ]&&[ "$(command -v jq 2>/dev/null)" ]; # numplayers. if [ "${querytype}" == "minecraft" ]; then gdplayers=$(echo "${gamedigraw}" | jq -re '.players | length-1') + elif [ "${querytype}" == "teamspeak3" ]; then + gdplayers=$(echo "${gamedigraw}" | jq -re '.raw.virtualserver_clientsonline') else gdplayers=$(echo "${gamedigraw}" | jq -re '.players | length') fi @@ -70,7 +80,12 @@ if [ "$(command -v gamedig 2>/dev/null)" ]&&[ "$(command -v jq 2>/dev/null)" ]; fi # server version. - gdversion=$(echo "${gamedigraw}" | jq -re '.raw.version') + if [ "${querytype}" == "teamspeak3" ]; then + dversion=$(echo "${gamedigraw}" | jq -re '.raw.virtualserver_version') + else + gdversion=$(echo "${gamedigraw}" | jq -re '.raw.version') + fi + if [ "${gdversion}" == "null" ]||[ "${gdversion}" == "0" ]; then unset gdversion fi diff --git a/tests/tests_fctrserver.sh b/tests/tests_fctrserver.sh index 9b47f763d..ef62e9724 100644 --- a/tests/tests_fctrserver.sh +++ b/tests/tests_fctrserver.sh @@ -923,7 +923,7 @@ echo -e "" echo -e "5.0 - Monitor Tests" echo -e "==================================================================" echo -e "" -info_config.sh +info_game.sh echo -e "Server IP - Port: ${ip}:${port}" echo -e "Server IP - Query Port: ${ip}:${queryport}" diff --git a/tests/tests_jc2server.sh b/tests/tests_jc2server.sh index da0fd91ce..474d45f06 100644 --- a/tests/tests_jc2server.sh +++ b/tests/tests_jc2server.sh @@ -1082,7 +1082,7 @@ echo -e "" echo -e "5.0 - Monitor Tests" echo -e "==================================================================" echo -e "" -info_config.sh +info_game.sh echo -e "Server IP - Port: ${ip}:${port}" echo -e "Server IP - Query Port: ${ip}:${queryport}" diff --git a/tests/tests_mcserver.sh b/tests/tests_mcserver.sh index 501b64a43..b6d6217cd 100644 --- a/tests/tests_mcserver.sh +++ b/tests/tests_mcserver.sh @@ -945,7 +945,7 @@ echo -e "" echo -e "5.0 - Monitor Tests" echo -e "==================================================================" echo -e "" -info_config.sh +info_game.sh echo -e "Server IP - Port: ${ip}:${port}" echo -e "Server IP - Query Port: ${ip}:${queryport}" diff --git a/tests/tests_ts3server.sh b/tests/tests_ts3server.sh index b9941598a..6d2b5d95f 100644 --- a/tests/tests_ts3server.sh +++ b/tests/tests_ts3server.sh @@ -922,7 +922,7 @@ echo -e "" echo -e "5.0 - Monitor Tests" echo -e "==================================================================" echo -e "" -info_config.sh +info_game.sh echo -e "Server IP - Port: ${ip}:${port}" echo -e "Server IP - Query Port: ${ip}:${queryport}" From dd3f554f1f2e7771b710e8c8a2a36e7cb4f7e4fa Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Sat, 4 Sep 2021 21:57:59 +0100 Subject: [PATCH 042/164] feat(stats): allow stats on which alerts are being used (#3550) * add alert stats and deprecate old analytics id * fix executable name with ss command * el in summary * updated ea name * prevent steamport from showing if not available steamport fix * remove non existent module --- lgsm/functions/core_functions.sh | 5 ---- lgsm/functions/info_game.sh | 5 ++-- lgsm/functions/info_messages.sh | 11 ++++---- lgsm/functions/info_stats.sh | 46 ++++++++++++++++++++++---------- 4 files changed, 40 insertions(+), 27 deletions(-) diff --git a/lgsm/functions/core_functions.sh b/lgsm/functions/core_functions.sh index dd82419a4..067ccff54 100755 --- a/lgsm/functions/core_functions.sh +++ b/lgsm/functions/core_functions.sh @@ -523,11 +523,6 @@ functionfile="${FUNCNAME[0]}" fn_fetch_function } -info_gamedig.sh(){ -functionfile="${FUNCNAME[0]}" -fn_fetch_function -} - info_messages.sh(){ functionfile="${FUNCNAME[0]}" fn_fetch_function diff --git a/lgsm/functions/info_game.sh b/lgsm/functions/info_game.sh index 2c3c52584..4b45ab417 100644 --- a/lgsm/functions/info_game.sh +++ b/lgsm/functions/info_game.sh @@ -1511,12 +1511,11 @@ fn_info_game_source(){ rconport=${port:-"0"} queryport=${port:-"0"} clientport=${clientport:-"0"} - # Steamport can be between 26901-26910 and is normaly automaticly set. + # Steamport can be between 26901-26910 and is normaly automatically set. # Some servers might support -steamport parameter to set - if [ "${steamport}" == "0" ]||[ -z "${steamport}" ]; then + if [ "${steamport}" == "0" ]||[ -v "${steamport}" ]; then steamport="$(echo "${ssinfo}" | grep "${srcdslinuxpid}" | awk '{print $5}' | grep ":269" | cut -d ":" -f2)" fi - steamport="${steamport:-"0"}" } fn_info_game_spark(){ diff --git a/lgsm/functions/info_messages.sh b/lgsm/functions/info_messages.sh index f68d12e4f..984db5b80 100755 --- a/lgsm/functions/info_messages.sh +++ b/lgsm/functions/info_messages.sh @@ -686,7 +686,7 @@ fn_info_message_ports(){ elif [ "${engine}" == "goldsrc" ]; then echo -e "ss -tuplwn | grep hlds_linux" else - executableshort="$(echo "${executable//.\/}" | cut -c -15)" + executableshort="$(basename "${executable}" | cut -c -15)" echo -e "ss -tuplwn | grep ${executableshort}" fi echo -e "" @@ -1339,8 +1339,10 @@ fn_info_message_source(){ fn_port "Query" queryport tcp fn_port "RCON" rconport tcp fn_port "SourceTV" sourcetvport udp - # not manualy set by default more research needed - fn_port "Steam" steamport udp + # Will not show if unaviable + if [ "${steamport}" == "0" ]||[ -z "${steamport}" ]; then + fn_port "Steam" steamport udp + fi fn_port "Client" clientport udp } | column -s $'\t' -t } @@ -1713,8 +1715,7 @@ fn_info_message_select_engine(){ fn_info_message_spark elif [ "${engine}" == "unreal" ]; then fn_info_message_unreal - else - fn_print_error_nl "Unable to detect server engine." + fn_print_error_nl "Unable to detect game server." fi } diff --git a/lgsm/functions/info_stats.sh b/lgsm/functions/info_stats.sh index 211208717..03bebe420 100755 --- a/lgsm/functions/info_stats.sh +++ b/lgsm/functions/info_stats.sh @@ -62,40 +62,34 @@ memusedroundup="$(((memused + 99) / 100 * 100))" # Hardware Property - UA-165287622-3 ## Distro. -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=${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=${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 [ -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 [ -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 [ -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 @@ -103,7 +97,6 @@ fi ## CPU Model. 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 @@ -112,7 +105,6 @@ fi ## CPU Frequency. 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 @@ -120,7 +112,6 @@ fi ## Server RAM. 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 @@ -128,17 +119,44 @@ fi ## Server Disk. 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 +## Alert Stats. +if [ "${discordalert}" == "on" ]; then + curl https://www.google-analytics.com/collect -d "tid=UA-165287622-1" -d "aip=1" -d "cid=${uuidinstance}" -d "t=event" -d "ec=alert" -d "ea=Discord" -d "el=${gamename}" -d "v=1" > /dev/null 2>&1 +fi +if [ "${emailalert}" == "on" ]; then + curl https://www.google-analytics.com/collect -d "tid=UA-165287622-1" -d "aip=1" -d "cid=${uuidinstance}" -d "t=event" -d "ec=alert" -d "ea=Email" -d "el=${gamename}" -d "v=1" > /dev/null 2>&1 +fi +if [ "${iftttalert}" == "on" ]; then + curl https://www.google-analytics.com/collect -d "tid=UA-165287622-1" -d "aip=1" -d "cid=${uuidinstance}" -d "t=event" -d "ec=alert" -d "ea=IFTTT" -d "el=${gamename}" -d "v=1" > /dev/null 2>&1 +fi +if [ "${mailgunalert}" == "on" ]; then + curl https://www.google-analytics.com/collect -d "tid=UA-165287622-1" -d "aip=1" -d "cid=${uuidinstance}" -d "t=event" -d "ec=alert" -d "ea=Mailgun" -d "el=${gamename}" -d "v=1" > /dev/null 2>&1 +fi +if [ "${pushbulletalert}" == "on" ]; then + curl https://www.google-analytics.com/collect -d "tid=UA-165287622-1" -d "aip=1" -d "cid=${uuidinstance}" -d "t=event" -d "ec=alert" -d "ea=Pushbullet" -d "el=${gamename}" -d "v=1" > /dev/null 2>&1 +fi +if [ "${pushoveralert}" == "on" ]; then + curl https://www.google-analytics.com/collect -d "tid=UA-165287622-1" -d "aip=1" -d "cid=${uuidinstance}" -d "t=event" -d "ec=alert" -d "ea=Pushover" -d "el=${gamename}" -d "v=1" > /dev/null 2>&1 +fi +if [ "${rocketchatalert}" == "on" ]; then + curl https://www.google-analytics.com/collect -d "tid=UA-165287622-1" -d "aip=1" -d "cid=${uuidinstance}" -d "t=event" -d "ec=alert" -d "ea=Rocket Chat" -d "el=${gamename}" -d "v=1" > /dev/null 2>&1 +fi +if [ "${slackalert}" == "on" ]; then + curl https://www.google-analytics.com/collect -d "tid=UA-165287622-1" -d "aip=1" -d "cid=${uuidinstance}" -d "t=event" -d "ec=alert" -d "ea=Slack" -d "el=${gamename}" -d "v=1" > /dev/null 2>&1 +fi +if [ "${telegramalert}" == "on" ]; then + curl https://www.google-analytics.com/collect -d "tid=UA-165287622-1" -d "aip=1" -d "cid=${uuidinstance}" -d "t=event" -d "ec=alert" -d "ea=Telegram" -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=${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 +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 "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=summary" -d "ea=GAME: ${gamename} | DISTRO: ${distroname} | CPU MODEL: ${cpumodel} ${cpucores} cores | RAM: ${physmemtotal} | DISK: ${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=summary" -d "ea=GAME: ${gamename} | DISTRO: ${distroname} | CPU MODEL: ${cpumodel} ${cpucores} cores | RAM: ${physmemtotal} | DISK: ${totalspace}" -d "el=${gamename}" -d "v=1" > /dev/null 2>&1 fn_script_log_info "Send LinuxGSM stats" fn_script_log_info "* uuid-${selfname}: ${uuidinstance}" From 9b325c7c265c3e87fef998a6b953372509ab13af Mon Sep 17 00:00:00 2001 From: AnthonyAMC Date: Sat, 4 Sep 2021 17:00:51 -0400 Subject: [PATCH 043/164] fix(perms): corrects tab (#3531) Removes erroneous TAB character. Fixes #3530 --- lgsm/functions/check_permissions.sh | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/lgsm/functions/check_permissions.sh b/lgsm/functions/check_permissions.sh index d4421dba1..4c8fda389 100755 --- a/lgsm/functions/check_permissions.sh +++ b/lgsm/functions/check_permissions.sh @@ -31,13 +31,13 @@ fn_check_ownership(){ { echo -e "User\tGroup\tFile\n" if [ "${selfownissue}" == "1" ]; then - find "${rootdir}/${selfname}" -not -user "$(whoami)" -printf "%u\t\t%g\t%p\n" + find "${rootdir}/${selfname}" -not -user "$(whoami)" -printf "%u\t%g\t%p\n" fi if [ "${funcownissue}" == "1" ]; then - find "${functionsdir}" -not -user "$(whoami)" -printf "%u\t\t%g\t%p\n" + find "${functionsdir}" -not -user "$(whoami)" -printf "%u\t%g\t%p\n" fi if [ "${filesownissue}" == "1" ]; then - find "${serverfiles}" -not -user "$(whoami)" -printf "%u\t\t%g\t%p\n" + find "${serverfiles}" -not -user "$(whoami)" -printf "%u\t%g\t%p\n" fi } | column -s $'\t' -t | tee -a "${lgsmlog}" From d9367755097f14834bf91492db64dabb6e9aea54 Mon Sep 17 00:00:00 2001 From: Christian Date: Sun, 5 Sep 2021 14:06:46 +0200 Subject: [PATCH 044/164] fix(mordhau): add config to startparameters (#3421) --- lgsm/config-default/config-lgsm/mhserver/_default.cfg | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lgsm/config-default/config-lgsm/mhserver/_default.cfg b/lgsm/config-default/config-lgsm/mhserver/_default.cfg index bb4847c00..fd8b8b1d0 100644 --- a/lgsm/config-default/config-lgsm/mhserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/mhserver/_default.cfg @@ -17,7 +17,7 @@ queryport="27015" defaultmap="FFA_ThePit" ## Server Parameters | https://docs.linuxgsm.com/configuration/start-parameters#additional-parameters -startparameters="Mordhau ${defaultmap} -log -MultiHome=${ip} -Port=${port} -BeaconPort=${beaconport} -QueryPort=${queryport}" +startparameters="Mordhau ${defaultmap} -log -MultiHome=${ip} -Port=${port} -BeaconPort=${beaconport} -QueryPort=${queryport} -GameIni=${servercfgfullpath}" #### LinuxGSM Settings #### From 436c87de1918e92dc1558cfe8d29f663a33a2453 Mon Sep 17 00:00:00 2001 From: jamiew0w Date: Tue, 14 Sep 2021 21:20:10 +0000 Subject: [PATCH 045/164] feat(alerts): add Gotify support to alerts (#3509) * added gotify to default configs * added gotify to info_messages.sh * added gotify to core_function.sh * added gotify to alerts.sh * core of alert_gotify.sh * fixed unterminated string in default configs * fixed mistakes in alert_gotify.sh * fixed bad quoting in alert_gotify.sh * first working version, gotify does not like emojis * added back curl options * added catch for $gotifywebhook to alert.sh * tabs over spaces * standardised json * message Co-authored-by: Daniel Gibbs --- .../config-lgsm/acserver/_default.cfg | 5 ++++ .../config-lgsm/ahl2server/_default.cfg | 5 ++++ .../config-lgsm/ahlserver/_default.cfg | 5 ++++ .../config-lgsm/arkserver/_default.cfg | 5 ++++ .../config-lgsm/arma3server/_default.cfg | 5 ++++ .../config-lgsm/avserver/_default.cfg | 5 ++++ .../config-lgsm/bb2server/_default.cfg | 5 ++++ .../config-lgsm/bbserver/_default.cfg | 5 ++++ .../config-lgsm/bdserver/_default.cfg | 5 ++++ .../config-lgsm/bf1942server/_default.cfg | 5 ++++ .../config-lgsm/bfvserver/_default.cfg | 5 ++++ .../config-lgsm/bmdmserver/_default.cfg | 5 ++++ .../config-lgsm/boserver/_default.cfg | 5 ++++ .../config-lgsm/bsserver/_default.cfg | 5 ++++ .../config-lgsm/bt1944server/_default.cfg | 5 ++++ .../config-lgsm/btserver/_default.cfg | 5 ++++ .../config-lgsm/ccserver/_default.cfg | 5 ++++ .../config-lgsm/cmwserver/_default.cfg | 5 ++++ .../config-lgsm/cod2server/_default.cfg | 5 ++++ .../config-lgsm/cod4server/_default.cfg | 5 ++++ .../config-lgsm/codserver/_default.cfg | 5 ++++ .../config-lgsm/coduoserver/_default.cfg | 5 ++++ .../config-lgsm/codwawserver/_default.cfg | 5 ++++ .../config-lgsm/colserver/_default.cfg | 5 ++++ .../config-lgsm/csczserver/_default.cfg | 5 ++++ .../config-lgsm/csgoserver/_default.cfg | 5 ++++ .../config-lgsm/csserver/_default.cfg | 5 ++++ .../config-lgsm/cssserver/_default.cfg | 5 ++++ .../config-lgsm/dabserver/_default.cfg | 5 ++++ .../config-lgsm/dmcserver/_default.cfg | 5 ++++ .../config-lgsm/dodserver/_default.cfg | 5 ++++ .../config-lgsm/dodsserver/_default.cfg | 5 ++++ .../config-lgsm/doiserver/_default.cfg | 5 ++++ .../config-lgsm/dstserver/_default.cfg | 5 ++++ .../config-lgsm/dysserver/_default.cfg | 5 ++++ .../config-lgsm/ecoserver/_default.cfg | 5 ++++ .../config-lgsm/emserver/_default.cfg | 5 ++++ .../config-lgsm/etlserver/_default.cfg | 5 ++++ .../config-lgsm/fctrserver/_default.cfg | 5 ++++ .../config-lgsm/fofserver/_default.cfg | 5 ++++ .../config-lgsm/gmodserver/_default.cfg | 5 ++++ .../config-lgsm/hl2dmserver/_default.cfg | 5 ++++ .../config-lgsm/hldmserver/_default.cfg | 5 ++++ .../config-lgsm/hldmsserver/_default.cfg | 5 ++++ .../config-lgsm/hwserver/_default.cfg | 5 ++++ .../config-lgsm/insserver/_default.cfg | 5 ++++ .../config-lgsm/inssserver/_default.cfg | 5 ++++ .../config-lgsm/iosserver/_default.cfg | 5 ++++ .../config-lgsm/jc2server/_default.cfg | 5 ++++ .../config-lgsm/jc3server/_default.cfg | 5 ++++ .../config-lgsm/jk2server/_default.cfg | 5 ++++ .../config-lgsm/kf2server/_default.cfg | 5 ++++ .../config-lgsm/kfserver/_default.cfg | 5 ++++ .../config-lgsm/l4d2server/_default.cfg | 5 ++++ .../config-lgsm/l4dserver/_default.cfg | 5 ++++ .../config-lgsm/mcbserver/_default.cfg | 5 ++++ .../config-lgsm/mcserver/_default.cfg | 5 ++++ .../config-lgsm/mhserver/_default.cfg | 5 ++++ .../config-lgsm/mohaaserver/_default.cfg | 5 ++++ .../config-lgsm/momserver/_default.cfg | 5 ++++ .../config-lgsm/mtaserver/_default.cfg | 5 ++++ .../config-lgsm/mumbleserver/_default.cfg | 5 ++++ .../config-lgsm/ndserver/_default.cfg | 5 ++++ .../config-lgsm/nmrihserver/_default.cfg | 5 ++++ .../config-lgsm/ns2cserver/_default.cfg | 5 ++++ .../config-lgsm/ns2server/_default.cfg | 5 ++++ .../config-lgsm/nsserver/_default.cfg | 5 ++++ .../config-lgsm/onsetserver/_default.cfg | 5 ++++ .../config-lgsm/opforserver/_default.cfg | 5 ++++ .../config-lgsm/pcserver/_default.cfg | 5 ++++ .../config-lgsm/pmcserver/_default.cfg | 5 ++++ .../config-lgsm/pstbsserver/_default.cfg | 5 ++++ .../config-lgsm/pvkiiserver/_default.cfg | 5 ++++ .../config-lgsm/pvrserver/_default.cfg | 5 ++++ .../config-lgsm/pzserver/_default.cfg | 5 ++++ .../config-lgsm/q2server/_default.cfg | 5 ++++ .../config-lgsm/q3server/_default.cfg | 5 ++++ .../config-lgsm/qlserver/_default.cfg | 5 ++++ .../config-lgsm/qwserver/_default.cfg | 5 ++++ .../config-lgsm/ricochetserver/_default.cfg | 5 ++++ .../config-lgsm/roserver/_default.cfg | 5 ++++ .../config-lgsm/rtcwserver/_default.cfg | 5 ++++ .../config-lgsm/rustserver/_default.cfg | 5 ++++ .../config-lgsm/rwserver/_default.cfg | 5 ++++ .../config-lgsm/sampserver/_default.cfg | 5 ++++ .../config-lgsm/sbotsserver/_default.cfg | 5 ++++ .../config-lgsm/sbserver/_default.cfg | 5 ++++ .../config-lgsm/scpslserver/_default.cfg | 5 ++++ .../config-lgsm/scpslsmserver/_default.cfg | 5 ++++ .../config-lgsm/sdtdserver/_default.cfg | 5 ++++ .../config-lgsm/sfcserver/_default.cfg | 5 ++++ .../config-lgsm/sof2server/_default.cfg | 5 ++++ .../config-lgsm/solserver/_default.cfg | 5 ++++ .../config-lgsm/squadserver/_default.cfg | 5 ++++ .../config-lgsm/stserver/_default.cfg | 5 ++++ .../config-lgsm/svenserver/_default.cfg | 5 ++++ .../config-lgsm/terrariaserver/_default.cfg | 5 ++++ .../config-lgsm/tf2server/_default.cfg | 5 ++++ .../config-lgsm/tfcserver/_default.cfg | 5 ++++ .../config-lgsm/ts3server/_default.cfg | 5 ++++ .../config-lgsm/tsserver/_default.cfg | 5 ++++ .../config-lgsm/tuserver/_default.cfg | 5 ++++ .../config-lgsm/twserver/_default.cfg | 5 ++++ .../config-lgsm/untserver/_default.cfg | 5 ++++ .../config-lgsm/ut2k4server/_default.cfg | 5 ++++ .../config-lgsm/ut3server/_default.cfg | 5 ++++ .../config-lgsm/ut99server/_default.cfg | 5 ++++ .../config-lgsm/utserver/_default.cfg | 5 ++++ .../config-lgsm/vhserver/_default.cfg | 5 ++++ .../config-lgsm/vintsserver/_default.cfg | 5 ++++ .../config-lgsm/vsserver/_default.cfg | 5 ++++ .../config-lgsm/wetserver/_default.cfg | 5 ++++ .../config-lgsm/wfserver/_default.cfg | 5 ++++ .../config-lgsm/wmcserver/_default.cfg | 5 ++++ .../config-lgsm/wurmserver/_default.cfg | 5 ++++ .../config-lgsm/zmrserver/_default.cfg | 5 ++++ .../config-lgsm/zpsserver/_default.cfg | 5 ++++ lgsm/functions/alert.sh | 15 ++++++++++ lgsm/functions/alert_discord.sh | 7 +---- lgsm/functions/alert_gotify.sh | 29 +++++++++++++++++++ lgsm/functions/alert_ifttt.sh | 2 +- lgsm/functions/alert_pushbullet.sh | 2 +- lgsm/functions/alert_rocketchat.sh | 7 +---- lgsm/functions/alert_slack.sh | 7 +---- lgsm/functions/alert_telegram.sh | 2 +- lgsm/functions/core_functions.sh | 5 ++++ lgsm/functions/info_messages.sh | 3 ++ 127 files changed, 643 insertions(+), 21 deletions(-) create mode 100644 lgsm/functions/alert_gotify.sh diff --git a/lgsm/config-default/config-lgsm/acserver/_default.cfg b/lgsm/config-default/config-lgsm/acserver/_default.cfg index 6dbcf68e6..3b6776ef7 100644 --- a/lgsm/config-default/config-lgsm/acserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/acserver/_default.cfg @@ -43,6 +43,11 @@ emailalert="off" email="email@example.com" emailfrom="" +# Gotify Alerts | https://docs.linuxgsm.com/alerts/gotify +gotifyalert="off" +gotifytoken="token" +gotifywebhook="webhook" + # IFTTT Alerts | https://docs.linuxgsm.com/alerts/ifttt iftttalert="off" ifttttoken="accesstoken" diff --git a/lgsm/config-default/config-lgsm/ahl2server/_default.cfg b/lgsm/config-default/config-lgsm/ahl2server/_default.cfg index 533d827f1..a2552a95d 100644 --- a/lgsm/config-default/config-lgsm/ahl2server/_default.cfg +++ b/lgsm/config-default/config-lgsm/ahl2server/_default.cfg @@ -49,6 +49,11 @@ emailalert="off" email="email@example.com" emailfrom="" +# Gotify Alerts | https://docs.linuxgsm.com/alerts/gotify +gotifyalert="off" +gotifytoken="token" +gotifywebhook="webhook" + # IFTTT Alerts | https://docs.linuxgsm.com/alerts/ifttt iftttalert="off" ifttttoken="accesstoken" diff --git a/lgsm/config-default/config-lgsm/ahlserver/_default.cfg b/lgsm/config-default/config-lgsm/ahlserver/_default.cfg index 931d3bd4b..046aa0c11 100644 --- a/lgsm/config-default/config-lgsm/ahlserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/ahlserver/_default.cfg @@ -44,6 +44,11 @@ emailalert="off" email="email@example.com" emailfrom="" +# Gotify Alerts | https://docs.linuxgsm.com/alerts/gotify +gotifyalert="off" +gotifytoken="token" +gotifywebhook="webhook" + # IFTTT Alerts | https://docs.linuxgsm.com/alerts/ifttt iftttalert="off" ifttttoken="accesstoken" diff --git a/lgsm/config-default/config-lgsm/arkserver/_default.cfg b/lgsm/config-default/config-lgsm/arkserver/_default.cfg index 57635b6d3..ea8b917af 100644 --- a/lgsm/config-default/config-lgsm/arkserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/arkserver/_default.cfg @@ -47,6 +47,11 @@ emailalert="off" email="email@example.com" emailfrom="" +# Gotify Alerts | https://docs.linuxgsm.com/alerts/gotify +gotifyalert="off" +gotifytoken="token" +gotifywebhook="webhook" + # IFTTT Alerts | https://docs.linuxgsm.com/alerts/ifttt iftttalert="off" ifttttoken="accesstoken" diff --git a/lgsm/config-default/config-lgsm/arma3server/_default.cfg b/lgsm/config-default/config-lgsm/arma3server/_default.cfg index 7b338811a..1cdfe239a 100644 --- a/lgsm/config-default/config-lgsm/arma3server/_default.cfg +++ b/lgsm/config-default/config-lgsm/arma3server/_default.cfg @@ -60,6 +60,11 @@ emailalert="off" email="email@example.com" emailfrom="" +# Gotify Alerts | https://docs.linuxgsm.com/alerts/gotify +gotifyalert="off" +gotifytoken="token" +gotifywebhook="webhook" + # IFTTT Alerts | https://docs.linuxgsm.com/alerts/ifttt iftttalert="off" ifttttoken="accesstoken" diff --git a/lgsm/config-default/config-lgsm/avserver/_default.cfg b/lgsm/config-default/config-lgsm/avserver/_default.cfg index 2eef21849..76101b2a9 100644 --- a/lgsm/config-default/config-lgsm/avserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/avserver/_default.cfg @@ -45,6 +45,11 @@ emailalert="off" email="email@example.com" emailfrom="" +# Gotify Alerts | https://docs.linuxgsm.com/alerts/gotify +gotifyalert="off" +gotifytoken="token" +gotifywebhook="webhook" + # IFTTT Alerts | https://docs.linuxgsm.com/alerts/ifttt iftttalert="off" ifttttoken="accesstoken" diff --git a/lgsm/config-default/config-lgsm/bb2server/_default.cfg b/lgsm/config-default/config-lgsm/bb2server/_default.cfg index 800379706..1e566b88b 100644 --- a/lgsm/config-default/config-lgsm/bb2server/_default.cfg +++ b/lgsm/config-default/config-lgsm/bb2server/_default.cfg @@ -50,6 +50,11 @@ emailalert="off" email="email@example.com" emailfrom="" +# Gotify Alerts | https://docs.linuxgsm.com/alerts/gotify +gotifyalert="off" +gotifytoken="token" +gotifywebhook="webhook" + # IFTTT Alerts | https://docs.linuxgsm.com/alerts/ifttt iftttalert="off" ifttttoken="accesstoken" diff --git a/lgsm/config-default/config-lgsm/bbserver/_default.cfg b/lgsm/config-default/config-lgsm/bbserver/_default.cfg index 9576c708f..118f65547 100644 --- a/lgsm/config-default/config-lgsm/bbserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/bbserver/_default.cfg @@ -44,6 +44,11 @@ emailalert="off" email="email@example.com" emailfrom="" +# Gotify Alerts | https://docs.linuxgsm.com/alerts/gotify +gotifyalert="off" +gotifytoken="token" +gotifywebhook="webhook" + # IFTTT Alerts | https://docs.linuxgsm.com/alerts/ifttt iftttalert="off" ifttttoken="accesstoken" diff --git a/lgsm/config-default/config-lgsm/bdserver/_default.cfg b/lgsm/config-default/config-lgsm/bdserver/_default.cfg index f1ae81a1f..eef61562c 100644 --- a/lgsm/config-default/config-lgsm/bdserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/bdserver/_default.cfg @@ -44,6 +44,11 @@ emailalert="off" email="email@example.com" emailfrom="" +# Gotify Alerts | https://docs.linuxgsm.com/alerts/gotify +gotifyalert="off" +gotifytoken="token" +gotifywebhook="webhook" + # IFTTT Alerts | https://docs.linuxgsm.com/alerts/ifttt iftttalert="off" ifttttoken="accesstoken" diff --git a/lgsm/config-default/config-lgsm/bf1942server/_default.cfg b/lgsm/config-default/config-lgsm/bf1942server/_default.cfg index 12f9ea76c..c6da048f9 100644 --- a/lgsm/config-default/config-lgsm/bf1942server/_default.cfg +++ b/lgsm/config-default/config-lgsm/bf1942server/_default.cfg @@ -37,6 +37,11 @@ emailalert="off" email="email@example.com" emailfrom="" +# Gotify Alerts | https://docs.linuxgsm.com/alerts/gotify +gotifyalert="off" +gotifytoken="token" +gotifywebhook="webhook" + # IFTTT Alerts | https://docs.linuxgsm.com/alerts/ifttt iftttalert="off" ifttttoken="accesstoken" diff --git a/lgsm/config-default/config-lgsm/bfvserver/_default.cfg b/lgsm/config-default/config-lgsm/bfvserver/_default.cfg index f8d7994e2..9acc98e5b 100644 --- a/lgsm/config-default/config-lgsm/bfvserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/bfvserver/_default.cfg @@ -37,6 +37,11 @@ emailalert="off" email="email@example.com" emailfrom="" +# Gotify Alerts | https://docs.linuxgsm.com/alerts/gotify +gotifyalert="off" +gotifytoken="token" +gotifywebhook="webhook" + # IFTTT Alerts | https://docs.linuxgsm.com/alerts/ifttt iftttalert="off" ifttttoken="accesstoken" diff --git a/lgsm/config-default/config-lgsm/bmdmserver/_default.cfg b/lgsm/config-default/config-lgsm/bmdmserver/_default.cfg index 2921250d7..bd8145df3 100644 --- a/lgsm/config-default/config-lgsm/bmdmserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/bmdmserver/_default.cfg @@ -50,6 +50,11 @@ emailalert="off" email="email@example.com" emailfrom="" +# Gotify Alerts | https://docs.linuxgsm.com/alerts/gotify +gotifyalert="off" +gotifytoken="token" +gotifywebhook="webhook" + # IFTTT Alerts | https://docs.linuxgsm.com/alerts/ifttt iftttalert="off" ifttttoken="accesstoken" diff --git a/lgsm/config-default/config-lgsm/boserver/_default.cfg b/lgsm/config-default/config-lgsm/boserver/_default.cfg index dd779cd6a..f2c2a3b03 100644 --- a/lgsm/config-default/config-lgsm/boserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/boserver/_default.cfg @@ -43,6 +43,11 @@ emailalert="off" email="email@example.com" emailfrom="" +# Gotify Alerts | https://docs.linuxgsm.com/alerts/gotify +gotifyalert="off" +gotifytoken="token" +gotifywebhook="webhook" + # IFTTT Alerts | https://docs.linuxgsm.com/alerts/ifttt iftttalert="off" ifttttoken="accesstoken" diff --git a/lgsm/config-default/config-lgsm/bsserver/_default.cfg b/lgsm/config-default/config-lgsm/bsserver/_default.cfg index 8a9af8b1a..41ab3fba7 100644 --- a/lgsm/config-default/config-lgsm/bsserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/bsserver/_default.cfg @@ -54,6 +54,11 @@ emailalert="off" email="email@example.com" emailfrom="" +# Gotify Alerts | https://docs.linuxgsm.com/alerts/gotify +gotifyalert="off" +gotifytoken="token" +gotifywebhook="webhook" + # IFTTT Alerts | https://docs.linuxgsm.com/alerts/ifttt iftttalert="off" ifttttoken="accesstoken" diff --git a/lgsm/config-default/config-lgsm/bt1944server/_default.cfg b/lgsm/config-default/config-lgsm/bt1944server/_default.cfg index aa4785985..78032cfe0 100644 --- a/lgsm/config-default/config-lgsm/bt1944server/_default.cfg +++ b/lgsm/config-default/config-lgsm/bt1944server/_default.cfg @@ -42,6 +42,11 @@ emailalert="off" email="email@example.com" emailfrom="" +# Gotify Alerts | https://docs.linuxgsm.com/alerts/gotify +gotifyalert="off" +gotifytoken="token" +gotifywebhook="webhook" + # IFTTT Alerts | https://docs.linuxgsm.com/alerts/ifttt iftttalert="off" ifttttoken="accesstoken" diff --git a/lgsm/config-default/config-lgsm/btserver/_default.cfg b/lgsm/config-default/config-lgsm/btserver/_default.cfg index dd695ec70..11e175c18 100644 --- a/lgsm/config-default/config-lgsm/btserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/btserver/_default.cfg @@ -37,6 +37,11 @@ emailalert="off" email="email@example.com" emailfrom="" +# Gotify Alerts | https://docs.linuxgsm.com/alerts/gotify +gotifyalert="off" +gotifytoken="token" +gotifywebhook="webhook" + # IFTTT Alerts | https://docs.linuxgsm.com/alerts/ifttt iftttalert="off" ifttttoken="accesstoken" diff --git a/lgsm/config-default/config-lgsm/ccserver/_default.cfg b/lgsm/config-default/config-lgsm/ccserver/_default.cfg index c9ceb5f5f..10ba0f8af 100644 --- a/lgsm/config-default/config-lgsm/ccserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/ccserver/_default.cfg @@ -45,6 +45,11 @@ emailalert="off" email="email@example.com" emailfrom="" +# Gotify Alerts | https://docs.linuxgsm.com/alerts/gotify +gotifyalert="off" +gotifytoken="token" +gotifywebhook="webhook" + # IFTTT Alerts | https://docs.linuxgsm.com/alerts/ifttt iftttalert="off" ifttttoken="accesstoken" diff --git a/lgsm/config-default/config-lgsm/cmwserver/_default.cfg b/lgsm/config-default/config-lgsm/cmwserver/_default.cfg index da790a356..435bde1ea 100644 --- a/lgsm/config-default/config-lgsm/cmwserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/cmwserver/_default.cfg @@ -43,6 +43,11 @@ emailalert="off" email="email@example.com" emailfrom="" +# Gotify Alerts | https://docs.linuxgsm.com/alerts/gotify +gotifyalert="off" +gotifytoken="token" +gotifywebhook="webhook" + # IFTTT Alerts | https://docs.linuxgsm.com/alerts/ifttt iftttalert="off" ifttttoken="accesstoken" diff --git a/lgsm/config-default/config-lgsm/cod2server/_default.cfg b/lgsm/config-default/config-lgsm/cod2server/_default.cfg index 611a8a086..fca571d93 100644 --- a/lgsm/config-default/config-lgsm/cod2server/_default.cfg +++ b/lgsm/config-default/config-lgsm/cod2server/_default.cfg @@ -43,6 +43,11 @@ emailalert="off" email="email@example.com" emailfrom="" +# Gotify Alerts | https://docs.linuxgsm.com/alerts/gotify +gotifyalert="off" +gotifytoken="token" +gotifywebhook="webhook" + # IFTTT Alerts | https://docs.linuxgsm.com/alerts/ifttt iftttalert="off" ifttttoken="accesstoken" diff --git a/lgsm/config-default/config-lgsm/cod4server/_default.cfg b/lgsm/config-default/config-lgsm/cod4server/_default.cfg index 30dfbd177..8389feb3c 100644 --- a/lgsm/config-default/config-lgsm/cod4server/_default.cfg +++ b/lgsm/config-default/config-lgsm/cod4server/_default.cfg @@ -43,6 +43,11 @@ emailalert="off" email="email@example.com" emailfrom="" +# Gotify Alerts | https://docs.linuxgsm.com/alerts/gotify +gotifyalert="off" +gotifytoken="token" +gotifywebhook="webhook" + # IFTTT Alerts | https://docs.linuxgsm.com/alerts/ifttt iftttalert="off" ifttttoken="accesstoken" diff --git a/lgsm/config-default/config-lgsm/codserver/_default.cfg b/lgsm/config-default/config-lgsm/codserver/_default.cfg index 7e22c1707..34883c0a1 100644 --- a/lgsm/config-default/config-lgsm/codserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/codserver/_default.cfg @@ -43,6 +43,11 @@ emailalert="off" email="email@example.com" emailfrom="" +# Gotify Alerts | https://docs.linuxgsm.com/alerts/gotify +gotifyalert="off" +gotifytoken="token" +gotifywebhook="webhook" + # IFTTT Alerts | https://docs.linuxgsm.com/alerts/ifttt iftttalert="off" ifttttoken="accesstoken" diff --git a/lgsm/config-default/config-lgsm/coduoserver/_default.cfg b/lgsm/config-default/config-lgsm/coduoserver/_default.cfg index 19ba2098b..3b922967d 100644 --- a/lgsm/config-default/config-lgsm/coduoserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/coduoserver/_default.cfg @@ -43,6 +43,11 @@ emailalert="off" email="email@example.com" emailfrom="" +# Gotify Alerts | https://docs.linuxgsm.com/alerts/gotify +gotifyalert="off" +gotifytoken="token" +gotifywebhook="webhook" + # IFTTT Alerts | https://docs.linuxgsm.com/alerts/ifttt iftttalert="off" ifttttoken="accesstoken" diff --git a/lgsm/config-default/config-lgsm/codwawserver/_default.cfg b/lgsm/config-default/config-lgsm/codwawserver/_default.cfg index 427237992..58dec3f7a 100644 --- a/lgsm/config-default/config-lgsm/codwawserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/codwawserver/_default.cfg @@ -43,6 +43,11 @@ emailalert="off" email="email@example.com" emailfrom="" +# Gotify Alerts | https://docs.linuxgsm.com/alerts/gotify +gotifyalert="off" +gotifytoken="token" +gotifywebhook="webhook" + # IFTTT Alerts | https://docs.linuxgsm.com/alerts/ifttt iftttalert="off" ifttttoken="accesstoken" diff --git a/lgsm/config-default/config-lgsm/colserver/_default.cfg b/lgsm/config-default/config-lgsm/colserver/_default.cfg index 85a1aab06..b9bd78594 100644 --- a/lgsm/config-default/config-lgsm/colserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/colserver/_default.cfg @@ -38,6 +38,11 @@ emailalert="off" email="email@example.com" emailfrom="" +# Gotify Alerts | https://docs.linuxgsm.com/alerts/gotify +gotifyalert="off" +gotifytoken="token" +gotifywebhook="webhook" + # IFTTT Alerts | https://docs.linuxgsm.com/alerts/ifttt iftttalert="off" ifttttoken="accesstoken" diff --git a/lgsm/config-default/config-lgsm/csczserver/_default.cfg b/lgsm/config-default/config-lgsm/csczserver/_default.cfg index 5edbaee9c..61767765b 100644 --- a/lgsm/config-default/config-lgsm/csczserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/csczserver/_default.cfg @@ -44,6 +44,11 @@ emailalert="off" email="email@example.com" emailfrom="" +# Gotify Alerts | https://docs.linuxgsm.com/alerts/gotify +gotifyalert="off" +gotifytoken="token" +gotifywebhook="webhook" + # IFTTT Alerts | https://docs.linuxgsm.com/alerts/ifttt iftttalert="off" ifttttoken="accesstoken" diff --git a/lgsm/config-default/config-lgsm/csgoserver/_default.cfg b/lgsm/config-default/config-lgsm/csgoserver/_default.cfg index 564ac84a3..ae82d2a94 100644 --- a/lgsm/config-default/config-lgsm/csgoserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/csgoserver/_default.cfg @@ -71,6 +71,11 @@ emailalert="off" email="email@example.com" emailfrom="" +# Gotify Alerts | https://docs.linuxgsm.com/alerts/gotify +gotifyalert="off" +gotifytoken="token" +gotifywebhook="webhook" + # IFTTT Alerts | https://docs.linuxgsm.com/alerts/ifttt iftttalert="off" ifttttoken="accesstoken" diff --git a/lgsm/config-default/config-lgsm/csserver/_default.cfg b/lgsm/config-default/config-lgsm/csserver/_default.cfg index a72d3b3cd..83a6101da 100644 --- a/lgsm/config-default/config-lgsm/csserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/csserver/_default.cfg @@ -44,6 +44,11 @@ emailalert="off" email="email@example.com" emailfrom="" +# Gotify Alerts | https://docs.linuxgsm.com/alerts/gotify +gotifyalert="off" +gotifytoken="token" +gotifywebhook="webhook" + # IFTTT Alerts | https://docs.linuxgsm.com/alerts/ifttt iftttalert="off" ifttttoken="accesstoken" diff --git a/lgsm/config-default/config-lgsm/cssserver/_default.cfg b/lgsm/config-default/config-lgsm/cssserver/_default.cfg index a8b6b122b..e06da982c 100644 --- a/lgsm/config-default/config-lgsm/cssserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/cssserver/_default.cfg @@ -50,6 +50,11 @@ emailalert="off" email="email@example.com" emailfrom="" +# Gotify Alerts | https://docs.linuxgsm.com/alerts/gotify +gotifyalert="off" +gotifytoken="token" +gotifywebhook="webhook" + # IFTTT Alerts | https://docs.linuxgsm.com/alerts/ifttt iftttalert="off" ifttttoken="accesstoken" diff --git a/lgsm/config-default/config-lgsm/dabserver/_default.cfg b/lgsm/config-default/config-lgsm/dabserver/_default.cfg index 61050282e..377ab85ff 100644 --- a/lgsm/config-default/config-lgsm/dabserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/dabserver/_default.cfg @@ -45,6 +45,11 @@ emailalert="off" email="email@example.com" emailfrom="" +# Gotify Alerts | https://docs.linuxgsm.com/alerts/gotify +gotifyalert="off" +gotifytoken="token" +gotifywebhook="webhook" + # IFTTT Alerts | https://docs.linuxgsm.com/alerts/ifttt iftttalert="off" ifttttoken="accesstoken" diff --git a/lgsm/config-default/config-lgsm/dmcserver/_default.cfg b/lgsm/config-default/config-lgsm/dmcserver/_default.cfg index 335ba7b56..b8d7d382c 100644 --- a/lgsm/config-default/config-lgsm/dmcserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/dmcserver/_default.cfg @@ -44,6 +44,11 @@ emailalert="off" email="email@example.com" emailfrom="" +# Gotify Alerts | https://docs.linuxgsm.com/alerts/gotify +gotifyalert="off" +gotifytoken="token" +gotifywebhook="webhook" + # IFTTT Alerts | https://docs.linuxgsm.com/alerts/ifttt iftttalert="off" ifttttoken="accesstoken" diff --git a/lgsm/config-default/config-lgsm/dodserver/_default.cfg b/lgsm/config-default/config-lgsm/dodserver/_default.cfg index 1e87b20b6..12076ed80 100644 --- a/lgsm/config-default/config-lgsm/dodserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/dodserver/_default.cfg @@ -44,6 +44,11 @@ emailalert="off" email="email@example.com" emailfrom="" +# Gotify Alerts | https://docs.linuxgsm.com/alerts/gotify +gotifyalert="off" +gotifytoken="token" +gotifywebhook="webhook" + # IFTTT Alerts | https://docs.linuxgsm.com/alerts/ifttt iftttalert="off" ifttttoken="accesstoken" diff --git a/lgsm/config-default/config-lgsm/dodsserver/_default.cfg b/lgsm/config-default/config-lgsm/dodsserver/_default.cfg index 87caa5a69..b938891db 100644 --- a/lgsm/config-default/config-lgsm/dodsserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/dodsserver/_default.cfg @@ -45,6 +45,11 @@ emailalert="off" email="email@example.com" emailfrom="" +# Gotify Alerts | https://docs.linuxgsm.com/alerts/gotify +gotifyalert="off" +gotifytoken="token" +gotifywebhook="webhook" + # IFTTT Alerts | https://docs.linuxgsm.com/alerts/ifttt iftttalert="off" ifttttoken="accesstoken" diff --git a/lgsm/config-default/config-lgsm/doiserver/_default.cfg b/lgsm/config-default/config-lgsm/doiserver/_default.cfg index 2099d2296..f1eac4968 100644 --- a/lgsm/config-default/config-lgsm/doiserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/doiserver/_default.cfg @@ -46,6 +46,11 @@ emailalert="off" email="email@example.com" emailfrom="" +# Gotify Alerts | https://docs.linuxgsm.com/alerts/gotify +gotifyalert="off" +gotifytoken="token" +gotifywebhook="webhook" + # IFTTT Alerts | https://docs.linuxgsm.com/alerts/ifttt iftttalert="off" ifttttoken="accesstoken" diff --git a/lgsm/config-default/config-lgsm/dstserver/_default.cfg b/lgsm/config-default/config-lgsm/dstserver/_default.cfg index 766b3a706..fa6c79315 100644 --- a/lgsm/config-default/config-lgsm/dstserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/dstserver/_default.cfg @@ -48,6 +48,11 @@ emailalert="off" email="email@example.com" emailfrom="" +# Gotify Alerts | https://docs.linuxgsm.com/alerts/gotify +gotifyalert="off" +gotifytoken="token" +gotifywebhook="webhook" + # IFTTT Alerts | https://docs.linuxgsm.com/alerts/ifttt iftttalert="off" ifttttoken="accesstoken" diff --git a/lgsm/config-default/config-lgsm/dysserver/_default.cfg b/lgsm/config-default/config-lgsm/dysserver/_default.cfg index 59d36fa9f..8ac508ca9 100644 --- a/lgsm/config-default/config-lgsm/dysserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/dysserver/_default.cfg @@ -50,6 +50,11 @@ emailalert="off" email="email@example.com" emailfrom="" +# Gotify Alerts | https://docs.linuxgsm.com/alerts/gotify +gotifyalert="off" +gotifytoken="token" +gotifywebhook="webhook" + # IFTTT Alerts | https://docs.linuxgsm.com/alerts/ifttt iftttalert="off" ifttttoken="accesstoken" diff --git a/lgsm/config-default/config-lgsm/ecoserver/_default.cfg b/lgsm/config-default/config-lgsm/ecoserver/_default.cfg index d99a754d2..db4669132 100644 --- a/lgsm/config-default/config-lgsm/ecoserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/ecoserver/_default.cfg @@ -37,6 +37,11 @@ emailalert="off" email="email@example.com" emailfrom="" +# Gotify Alerts | https://docs.linuxgsm.com/alerts/gotify +gotifyalert="off" +gotifytoken="token" +gotifywebhook="webhook" + # IFTTT Alerts | https://docs.linuxgsm.com/alerts/ifttt iftttalert="off" ifttttoken="accesstoken" diff --git a/lgsm/config-default/config-lgsm/emserver/_default.cfg b/lgsm/config-default/config-lgsm/emserver/_default.cfg index 6e782cc24..f10a8a437 100644 --- a/lgsm/config-default/config-lgsm/emserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/emserver/_default.cfg @@ -50,6 +50,11 @@ emailalert="off" email="email@example.com" emailfrom="" +# Gotify Alerts | https://docs.linuxgsm.com/alerts/gotify +gotifyalert="off" +gotifytoken="token" +gotifywebhook="webhook" + # IFTTT Alerts | https://docs.linuxgsm.com/alerts/ifttt iftttalert="off" ifttttoken="accesstoken" diff --git a/lgsm/config-default/config-lgsm/etlserver/_default.cfg b/lgsm/config-default/config-lgsm/etlserver/_default.cfg index dec02d4b3..488fe649a 100644 --- a/lgsm/config-default/config-lgsm/etlserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/etlserver/_default.cfg @@ -37,6 +37,11 @@ emailalert="off" email="email@example.com" emailfrom="" +# Gotify Alerts | https://docs.linuxgsm.com/alerts/gotify +gotifyalert="off" +gotifytoken="token" +gotifywebhook="webhook" + # IFTTT Alerts | https://docs.linuxgsm.com/alerts/ifttt iftttalert="off" ifttttoken="accesstoken" diff --git a/lgsm/config-default/config-lgsm/fctrserver/_default.cfg b/lgsm/config-default/config-lgsm/fctrserver/_default.cfg index b6d1fcd34..9f010510e 100644 --- a/lgsm/config-default/config-lgsm/fctrserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/fctrserver/_default.cfg @@ -45,6 +45,11 @@ emailalert="off" email="email@example.com" emailfrom="" +# Gotify Alerts | https://docs.linuxgsm.com/alerts/gotify +gotifyalert="off" +gotifytoken="token" +gotifywebhook="webhook" + # IFTTT Alerts | https://docs.linuxgsm.com/alerts/ifttt iftttalert="off" ifttttoken="accesstoken" diff --git a/lgsm/config-default/config-lgsm/fofserver/_default.cfg b/lgsm/config-default/config-lgsm/fofserver/_default.cfg index 736d78ca8..3c2adf8af 100644 --- a/lgsm/config-default/config-lgsm/fofserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/fofserver/_default.cfg @@ -45,6 +45,11 @@ emailalert="off" email="email@example.com" emailfrom="" +# Gotify Alerts | https://docs.linuxgsm.com/alerts/gotify +gotifyalert="off" +gotifytoken="token" +gotifywebhook="webhook" + # IFTTT Alerts | https://docs.linuxgsm.com/alerts/ifttt iftttalert="off" ifttttoken="accesstoken" diff --git a/lgsm/config-default/config-lgsm/gmodserver/_default.cfg b/lgsm/config-default/config-lgsm/gmodserver/_default.cfg index ed8b2f8e8..1f569df9c 100644 --- a/lgsm/config-default/config-lgsm/gmodserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/gmodserver/_default.cfg @@ -57,6 +57,11 @@ emailalert="off" email="email@example.com" emailfrom="" +# Gotify Alerts | https://docs.linuxgsm.com/alerts/gotify +gotifyalert="off" +gotifytoken="token" +gotifywebhook="webhook" + # IFTTT Alerts | https://docs.linuxgsm.com/alerts/ifttt iftttalert="off" ifttttoken="accesstoken" diff --git a/lgsm/config-default/config-lgsm/hl2dmserver/_default.cfg b/lgsm/config-default/config-lgsm/hl2dmserver/_default.cfg index 6c268b108..3b2b69a58 100644 --- a/lgsm/config-default/config-lgsm/hl2dmserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/hl2dmserver/_default.cfg @@ -45,6 +45,11 @@ emailalert="off" email="email@example.com" emailfrom="" +# Gotify Alerts | https://docs.linuxgsm.com/alerts/gotify +gotifyalert="off" +gotifytoken="token" +gotifywebhook="webhook" + # IFTTT Alerts | https://docs.linuxgsm.com/alerts/ifttt iftttalert="off" ifttttoken="accesstoken" diff --git a/lgsm/config-default/config-lgsm/hldmserver/_default.cfg b/lgsm/config-default/config-lgsm/hldmserver/_default.cfg index 361c1f7b7..f595afc2a 100644 --- a/lgsm/config-default/config-lgsm/hldmserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/hldmserver/_default.cfg @@ -44,6 +44,11 @@ emailalert="off" email="email@example.com" emailfrom="" +# Gotify Alerts | https://docs.linuxgsm.com/alerts/gotify +gotifyalert="off" +gotifytoken="token" +gotifywebhook="webhook" + # IFTTT Alerts | https://docs.linuxgsm.com/alerts/ifttt iftttalert="off" ifttttoken="accesstoken" diff --git a/lgsm/config-default/config-lgsm/hldmsserver/_default.cfg b/lgsm/config-default/config-lgsm/hldmsserver/_default.cfg index 127519b40..59aada076 100644 --- a/lgsm/config-default/config-lgsm/hldmsserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/hldmsserver/_default.cfg @@ -45,6 +45,11 @@ emailalert="off" email="email@example.com" emailfrom="" +# Gotify Alerts | https://docs.linuxgsm.com/alerts/gotify +gotifyalert="off" +gotifytoken="token" +gotifywebhook="webhook" + # IFTTT Alerts | https://docs.linuxgsm.com/alerts/ifttt iftttalert="off" ifttttoken="accesstoken" diff --git a/lgsm/config-default/config-lgsm/hwserver/_default.cfg b/lgsm/config-default/config-lgsm/hwserver/_default.cfg index 793e3d77c..1d54b8eb2 100644 --- a/lgsm/config-default/config-lgsm/hwserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/hwserver/_default.cfg @@ -56,6 +56,11 @@ emailalert="off" email="email@example.com" emailfrom="" +# Gotify Alerts | https://docs.linuxgsm.com/alerts/gotify +gotifyalert="off" +gotifytoken="token" +gotifywebhook="webhook" + # IFTTT Alerts | https://docs.linuxgsm.com/alerts/ifttt iftttalert="off" ifttttoken="accesstoken" diff --git a/lgsm/config-default/config-lgsm/insserver/_default.cfg b/lgsm/config-default/config-lgsm/insserver/_default.cfg index 6dbf464ce..c7adf3e65 100644 --- a/lgsm/config-default/config-lgsm/insserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/insserver/_default.cfg @@ -51,6 +51,11 @@ emailalert="off" email="email@example.com" emailfrom="" +# Gotify Alerts | https://docs.linuxgsm.com/alerts/gotify +gotifyalert="off" +gotifytoken="token" +gotifywebhook="webhook" + # IFTTT Alerts | https://docs.linuxgsm.com/alerts/ifttt iftttalert="off" ifttttoken="accesstoken" diff --git a/lgsm/config-default/config-lgsm/inssserver/_default.cfg b/lgsm/config-default/config-lgsm/inssserver/_default.cfg index 1dbc0889f..66678d284 100644 --- a/lgsm/config-default/config-lgsm/inssserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/inssserver/_default.cfg @@ -49,6 +49,11 @@ emailalert="off" email="email@example.com" emailfrom="" +# Gotify Alerts | https://docs.linuxgsm.com/alerts/gotify +gotifyalert="off" +gotifytoken="token" +gotifywebhook="webhook" + # IFTTT Alerts | https://docs.linuxgsm.com/alerts/ifttt iftttalert="off" ifttttoken="accesstoken" diff --git a/lgsm/config-default/config-lgsm/iosserver/_default.cfg b/lgsm/config-default/config-lgsm/iosserver/_default.cfg index 6ba806960..c81bc4002 100644 --- a/lgsm/config-default/config-lgsm/iosserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/iosserver/_default.cfg @@ -45,6 +45,11 @@ emailalert="off" email="email@example.com" emailfrom="" +# Gotify Alerts | https://docs.linuxgsm.com/alerts/gotify +gotifyalert="off" +gotifytoken="token" +gotifywebhook="webhook" + # IFTTT Alerts | https://docs.linuxgsm.com/alerts/ifttt iftttalert="off" ifttttoken="accesstoken" diff --git a/lgsm/config-default/config-lgsm/jc2server/_default.cfg b/lgsm/config-default/config-lgsm/jc2server/_default.cfg index d57520398..01043a35e 100644 --- a/lgsm/config-default/config-lgsm/jc2server/_default.cfg +++ b/lgsm/config-default/config-lgsm/jc2server/_default.cfg @@ -37,6 +37,11 @@ emailalert="off" email="email@example.com" emailfrom="" +# Gotify Alerts | https://docs.linuxgsm.com/alerts/gotify +gotifyalert="off" +gotifytoken="token" +gotifywebhook="webhook" + # IFTTT Alerts | https://docs.linuxgsm.com/alerts/ifttt iftttalert="off" ifttttoken="accesstoken" diff --git a/lgsm/config-default/config-lgsm/jc3server/_default.cfg b/lgsm/config-default/config-lgsm/jc3server/_default.cfg index 46ab112a4..a1aacafb5 100644 --- a/lgsm/config-default/config-lgsm/jc3server/_default.cfg +++ b/lgsm/config-default/config-lgsm/jc3server/_default.cfg @@ -37,6 +37,11 @@ emailalert="off" email="email@example.com" emailfrom="" +# Gotify Alerts | https://docs.linuxgsm.com/alerts/gotify +gotifyalert="off" +gotifytoken="token" +gotifywebhook="webhook" + # IFTTT Alerts | https://docs.linuxgsm.com/alerts/ifttt iftttalert="off" ifttttoken="accesstoken" diff --git a/lgsm/config-default/config-lgsm/jk2server/_default.cfg b/lgsm/config-default/config-lgsm/jk2server/_default.cfg index a6bf4f7b1..700ba8fbb 100644 --- a/lgsm/config-default/config-lgsm/jk2server/_default.cfg +++ b/lgsm/config-default/config-lgsm/jk2server/_default.cfg @@ -46,6 +46,11 @@ emailalert="off" email="email@example.com" emailfrom="" +# Gotify Alerts | https://docs.linuxgsm.com/alerts/gotify +gotifyalert="off" +gotifytoken="token" +gotifywebhook="webhook" + # IFTTT Alerts | https://docs.linuxgsm.com/alerts/ifttt iftttalert="off" ifttttoken="accesstoken" diff --git a/lgsm/config-default/config-lgsm/kf2server/_default.cfg b/lgsm/config-default/config-lgsm/kf2server/_default.cfg index 5617a4cf5..a60bbd1a2 100644 --- a/lgsm/config-default/config-lgsm/kf2server/_default.cfg +++ b/lgsm/config-default/config-lgsm/kf2server/_default.cfg @@ -43,6 +43,11 @@ emailalert="off" email="email@example.com" emailfrom="" +# Gotify Alerts | https://docs.linuxgsm.com/alerts/gotify +gotifyalert="off" +gotifytoken="token" +gotifywebhook="webhook" + # IFTTT Alerts | https://docs.linuxgsm.com/alerts/ifttt iftttalert="off" ifttttoken="accesstoken" diff --git a/lgsm/config-default/config-lgsm/kfserver/_default.cfg b/lgsm/config-default/config-lgsm/kfserver/_default.cfg index d1a672dcc..74ffea9af 100644 --- a/lgsm/config-default/config-lgsm/kfserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/kfserver/_default.cfg @@ -49,6 +49,11 @@ emailalert="off" email="email@example.com" emailfrom="" +# Gotify Alerts | https://docs.linuxgsm.com/alerts/gotify +gotifyalert="off" +gotifytoken="token" +gotifywebhook="webhook" + # IFTTT Alerts | https://docs.linuxgsm.com/alerts/ifttt iftttalert="off" ifttttoken="accesstoken" diff --git a/lgsm/config-default/config-lgsm/l4d2server/_default.cfg b/lgsm/config-default/config-lgsm/l4d2server/_default.cfg index 5d947eca0..4fb938983 100644 --- a/lgsm/config-default/config-lgsm/l4d2server/_default.cfg +++ b/lgsm/config-default/config-lgsm/l4d2server/_default.cfg @@ -44,6 +44,11 @@ emailalert="off" email="email@example.com" emailfrom="" +# Gotify Alerts | https://docs.linuxgsm.com/alerts/gotify +gotifyalert="off" +gotifytoken="token" +gotifywebhook="webhook" + # IFTTT Alerts | https://docs.linuxgsm.com/alerts/ifttt iftttalert="off" ifttttoken="accesstoken" diff --git a/lgsm/config-default/config-lgsm/l4dserver/_default.cfg b/lgsm/config-default/config-lgsm/l4dserver/_default.cfg index 0f1b2f4a4..838a65efb 100644 --- a/lgsm/config-default/config-lgsm/l4dserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/l4dserver/_default.cfg @@ -44,6 +44,11 @@ emailalert="off" email="email@example.com" emailfrom="" +# Gotify Alerts | https://docs.linuxgsm.com/alerts/gotify +gotifyalert="off" +gotifytoken="token" +gotifywebhook="webhook" + # IFTTT Alerts | https://docs.linuxgsm.com/alerts/ifttt iftttalert="off" ifttttoken="accesstoken" diff --git a/lgsm/config-default/config-lgsm/mcbserver/_default.cfg b/lgsm/config-default/config-lgsm/mcbserver/_default.cfg index d5ad3b59f..8ccd2e658 100644 --- a/lgsm/config-default/config-lgsm/mcbserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/mcbserver/_default.cfg @@ -37,6 +37,11 @@ emailalert="off" email="email@example.com" emailfrom="" +# Gotify Alerts | https://docs.linuxgsm.com/alerts/gotify +gotifyalert="off" +gotifytoken="token" +gotifywebhook="webhook" + # IFTTT Alerts | https://docs.linuxgsm.com/alerts/ifttt iftttalert="off" ifttttoken="accesstoken" diff --git a/lgsm/config-default/config-lgsm/mcserver/_default.cfg b/lgsm/config-default/config-lgsm/mcserver/_default.cfg index 6cbdd8e15..fd7b8a71e 100644 --- a/lgsm/config-default/config-lgsm/mcserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/mcserver/_default.cfg @@ -46,6 +46,11 @@ emailalert="off" email="email@example.com" emailfrom="" +# Gotify Alerts | https://docs.linuxgsm.com/alerts/gotify +gotifyalert="off" +gotifytoken="token" +gotifywebhook="webhook" + # IFTTT Alerts | https://docs.linuxgsm.com/alerts/ifttt iftttalert="off" ifttttoken="accesstoken" diff --git a/lgsm/config-default/config-lgsm/mhserver/_default.cfg b/lgsm/config-default/config-lgsm/mhserver/_default.cfg index fd8b8b1d0..81ab22a95 100644 --- a/lgsm/config-default/config-lgsm/mhserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/mhserver/_default.cfg @@ -45,6 +45,11 @@ emailalert="off" email="email@example.com" emailfrom="" +# Gotify Alerts | https://docs.linuxgsm.com/alerts/gotify +gotifyalert="off" +gotifytoken="token" +gotifywebhook="webhook" + # IFTTT Alerts | https://docs.linuxgsm.com/alerts/ifttt iftttalert="off" ifttttoken="accesstoken" diff --git a/lgsm/config-default/config-lgsm/mohaaserver/_default.cfg b/lgsm/config-default/config-lgsm/mohaaserver/_default.cfg index 9ab26b75a..a9f5fc840 100644 --- a/lgsm/config-default/config-lgsm/mohaaserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/mohaaserver/_default.cfg @@ -42,6 +42,11 @@ emailalert="off" email="email@example.com" emailfrom="" +# Gotify Alerts | https://docs.linuxgsm.com/alerts/gotify +gotifyalert="off" +gotifytoken="token" +gotifywebhook="webhook" + # IFTTT Alerts | https://docs.linuxgsm.com/alerts/ifttt iftttalert="off" ifttttoken="accesstoken" diff --git a/lgsm/config-default/config-lgsm/momserver/_default.cfg b/lgsm/config-default/config-lgsm/momserver/_default.cfg index c4f469c61..a19d077fe 100644 --- a/lgsm/config-default/config-lgsm/momserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/momserver/_default.cfg @@ -43,6 +43,11 @@ emailalert="off" email="email@example.com" emailfrom="" +# Gotify Alerts | https://docs.linuxgsm.com/alerts/gotify +gotifyalert="off" +gotifytoken="token" +gotifywebhook="webhook" + # IFTTT Alerts | https://docs.linuxgsm.com/alerts/ifttt iftttalert="off" ifttttoken="accesstoken" diff --git a/lgsm/config-default/config-lgsm/mtaserver/_default.cfg b/lgsm/config-default/config-lgsm/mtaserver/_default.cfg index 027aa8cef..ac7d4e939 100644 --- a/lgsm/config-default/config-lgsm/mtaserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/mtaserver/_default.cfg @@ -41,6 +41,11 @@ emailalert="off" email="email@example.com" emailfrom="" +# Gotify Alerts | https://docs.linuxgsm.com/alerts/gotify +gotifyalert="off" +gotifytoken="token" +gotifywebhook="webhook" + # IFTTT Alerts | https://docs.linuxgsm.com/alerts/ifttt iftttalert="off" ifttttoken="accesstoken" diff --git a/lgsm/config-default/config-lgsm/mumbleserver/_default.cfg b/lgsm/config-default/config-lgsm/mumbleserver/_default.cfg index 0fe4ffabc..fdb06bfe8 100644 --- a/lgsm/config-default/config-lgsm/mumbleserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/mumbleserver/_default.cfg @@ -37,6 +37,11 @@ emailalert="off" email="email@example.com" emailfrom="" +# Gotify Alerts | https://docs.linuxgsm.com/alerts/gotify +gotifyalert="off" +gotifytoken="token" +gotifywebhook="webhook" + # IFTTT Alerts | https://docs.linuxgsm.com/alerts/ifttt iftttalert="off" ifttttoken="accesstoken" diff --git a/lgsm/config-default/config-lgsm/ndserver/_default.cfg b/lgsm/config-default/config-lgsm/ndserver/_default.cfg index ee43d1f5d..9653eb52b 100644 --- a/lgsm/config-default/config-lgsm/ndserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/ndserver/_default.cfg @@ -45,6 +45,11 @@ emailalert="off" email="email@example.com" emailfrom="" +# Gotify Alerts | https://docs.linuxgsm.com/alerts/gotify +gotifyalert="off" +gotifytoken="token" +gotifywebhook="webhook" + # IFTTT Alerts | https://docs.linuxgsm.com/alerts/ifttt iftttalert="off" ifttttoken="accesstoken" diff --git a/lgsm/config-default/config-lgsm/nmrihserver/_default.cfg b/lgsm/config-default/config-lgsm/nmrihserver/_default.cfg index c3594cec8..5f412cd4d 100644 --- a/lgsm/config-default/config-lgsm/nmrihserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/nmrihserver/_default.cfg @@ -50,6 +50,11 @@ emailalert="off" email="email@example.com" emailfrom="" +# Gotify Alerts | https://docs.linuxgsm.com/alerts/gotify +gotifyalert="off" +gotifytoken="token" +gotifywebhook="webhook" + # IFTTT Alerts | https://docs.linuxgsm.com/alerts/ifttt iftttalert="off" ifttttoken="accesstoken" diff --git a/lgsm/config-default/config-lgsm/ns2cserver/_default.cfg b/lgsm/config-default/config-lgsm/ns2cserver/_default.cfg index f6e717698..73cf810f1 100644 --- a/lgsm/config-default/config-lgsm/ns2cserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/ns2cserver/_default.cfg @@ -52,6 +52,11 @@ emailalert="off" email="email@example.com" emailfrom="" +# Gotify Alerts | https://docs.linuxgsm.com/alerts/gotify +gotifyalert="off" +gotifytoken="token" +gotifywebhook="webhook" + # IFTTT Alerts | https://docs.linuxgsm.com/alerts/ifttt iftttalert="off" ifttttoken="accesstoken" diff --git a/lgsm/config-default/config-lgsm/ns2server/_default.cfg b/lgsm/config-default/config-lgsm/ns2server/_default.cfg index a4b93ad93..2d7a64cbe 100644 --- a/lgsm/config-default/config-lgsm/ns2server/_default.cfg +++ b/lgsm/config-default/config-lgsm/ns2server/_default.cfg @@ -56,6 +56,11 @@ emailalert="off" email="email@example.com" emailfrom="" +# Gotify Alerts | https://docs.linuxgsm.com/alerts/gotify +gotifyalert="off" +gotifytoken="token" +gotifywebhook="webhook" + # IFTTT Alerts | https://docs.linuxgsm.com/alerts/ifttt iftttalert="off" ifttttoken="accesstoken" diff --git a/lgsm/config-default/config-lgsm/nsserver/_default.cfg b/lgsm/config-default/config-lgsm/nsserver/_default.cfg index 6ef66dc68..4292b1f2a 100644 --- a/lgsm/config-default/config-lgsm/nsserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/nsserver/_default.cfg @@ -44,6 +44,11 @@ emailalert="off" email="email@example.com" emailfrom="" +# Gotify Alerts | https://docs.linuxgsm.com/alerts/gotify +gotifyalert="off" +gotifytoken="token" +gotifywebhook="webhook" + # IFTTT Alerts | https://docs.linuxgsm.com/alerts/ifttt iftttalert="off" ifttttoken="accesstoken" diff --git a/lgsm/config-default/config-lgsm/onsetserver/_default.cfg b/lgsm/config-default/config-lgsm/onsetserver/_default.cfg index fc795cc6a..172953609 100644 --- a/lgsm/config-default/config-lgsm/onsetserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/onsetserver/_default.cfg @@ -37,6 +37,11 @@ emailalert="off" email="email@example.com" emailfrom="" +# Gotify Alerts | https://docs.linuxgsm.com/alerts/gotify +gotifyalert="off" +gotifytoken="token" +gotifywebhook="webhook" + # IFTTT Alerts | https://docs.linuxgsm.com/alerts/ifttt iftttalert="off" ifttttoken="accesstoken" diff --git a/lgsm/config-default/config-lgsm/opforserver/_default.cfg b/lgsm/config-default/config-lgsm/opforserver/_default.cfg index ccd430e6f..d10367f63 100644 --- a/lgsm/config-default/config-lgsm/opforserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/opforserver/_default.cfg @@ -44,6 +44,11 @@ emailalert="off" email="email@example.com" emailfrom="" +# Gotify Alerts | https://docs.linuxgsm.com/alerts/gotify +gotifyalert="off" +gotifytoken="token" +gotifywebhook="webhook" + # IFTTT Alerts | https://docs.linuxgsm.com/alerts/ifttt iftttalert="off" ifttttoken="accesstoken" diff --git a/lgsm/config-default/config-lgsm/pcserver/_default.cfg b/lgsm/config-default/config-lgsm/pcserver/_default.cfg index 231948872..cb82ffca5 100644 --- a/lgsm/config-default/config-lgsm/pcserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/pcserver/_default.cfg @@ -37,6 +37,11 @@ emailalert="off" email="email@example.com" emailfrom="" +# Gotify Alerts | https://docs.linuxgsm.com/alerts/gotify +gotifyalert="off" +gotifytoken="token" +gotifywebhook="webhook" + # IFTTT Alerts | https://docs.linuxgsm.com/alerts/ifttt iftttalert="off" ifttttoken="accesstoken" diff --git a/lgsm/config-default/config-lgsm/pmcserver/_default.cfg b/lgsm/config-default/config-lgsm/pmcserver/_default.cfg index 8369b782c..704d63ff3 100644 --- a/lgsm/config-default/config-lgsm/pmcserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/pmcserver/_default.cfg @@ -44,6 +44,11 @@ emailalert="off" email="email@example.com" emailfrom="" +# Gotify Alerts | https://docs.linuxgsm.com/alerts/gotify +gotifyalert="off" +gotifytoken="token" +gotifywebhook="webhook" + # IFTTT Alerts | https://docs.linuxgsm.com/alerts/ifttt iftttalert="off" ifttttoken="accesstoken" diff --git a/lgsm/config-default/config-lgsm/pstbsserver/_default.cfg b/lgsm/config-default/config-lgsm/pstbsserver/_default.cfg index 2a8a9cbc6..80a066b2f 100644 --- a/lgsm/config-default/config-lgsm/pstbsserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/pstbsserver/_default.cfg @@ -47,6 +47,11 @@ emailalert="off" email="email@example.com" emailfrom="" +# Gotify Alerts | https://docs.linuxgsm.com/alerts/gotify +gotifyalert="off" +gotifytoken="token" +gotifywebhook="webhook" + # IFTTT Alerts | https://docs.linuxgsm.com/alerts/ifttt iftttalert="off" ifttttoken="accesstoken" diff --git a/lgsm/config-default/config-lgsm/pvkiiserver/_default.cfg b/lgsm/config-default/config-lgsm/pvkiiserver/_default.cfg index 7003c4a8e..1689af811 100644 --- a/lgsm/config-default/config-lgsm/pvkiiserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/pvkiiserver/_default.cfg @@ -45,6 +45,11 @@ emailalert="off" email="email@example.com" emailfrom="" +# Gotify Alerts | https://docs.linuxgsm.com/alerts/gotify +gotifyalert="off" +gotifytoken="token" +gotifywebhook="webhook" + # IFTTT Alerts | https://docs.linuxgsm.com/alerts/ifttt iftttalert="off" ifttttoken="accesstoken" diff --git a/lgsm/config-default/config-lgsm/pvrserver/_default.cfg b/lgsm/config-default/config-lgsm/pvrserver/_default.cfg index ed65d0f2f..45a2b8fbd 100644 --- a/lgsm/config-default/config-lgsm/pvrserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/pvrserver/_default.cfg @@ -44,6 +44,11 @@ emailalert="off" email="email@example.com" emailfrom="" +# Gotify Alerts | https://docs.linuxgsm.com/alerts/gotify +gotifyalert="off" +gotifytoken="token" +gotifywebhook="webhook" + # IFTTT Alerts | https://docs.linuxgsm.com/alerts/ifttt iftttalert="off" ifttttoken="accesstoken" diff --git a/lgsm/config-default/config-lgsm/pzserver/_default.cfg b/lgsm/config-default/config-lgsm/pzserver/_default.cfg index 720db40d5..a9dfb40b2 100644 --- a/lgsm/config-default/config-lgsm/pzserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/pzserver/_default.cfg @@ -41,6 +41,11 @@ emailalert="off" email="email@example.com" emailfrom="" +# Gotify Alerts | https://docs.linuxgsm.com/alerts/gotify +gotifyalert="off" +gotifytoken="token" +gotifywebhook="webhook" + # IFTTT Alerts | https://docs.linuxgsm.com/alerts/ifttt iftttalert="off" ifttttoken="accesstoken" diff --git a/lgsm/config-default/config-lgsm/q2server/_default.cfg b/lgsm/config-default/config-lgsm/q2server/_default.cfg index cc11f34a8..ea1061a70 100644 --- a/lgsm/config-default/config-lgsm/q2server/_default.cfg +++ b/lgsm/config-default/config-lgsm/q2server/_default.cfg @@ -42,6 +42,11 @@ emailalert="off" email="email@example.com" emailfrom="" +# Gotify Alerts | https://docs.linuxgsm.com/alerts/gotify +gotifyalert="off" +gotifytoken="token" +gotifywebhook="webhook" + # IFTTT Alerts | https://docs.linuxgsm.com/alerts/ifttt iftttalert="off" ifttttoken="accesstoken" diff --git a/lgsm/config-default/config-lgsm/q3server/_default.cfg b/lgsm/config-default/config-lgsm/q3server/_default.cfg index e7c003815..5621dec15 100644 --- a/lgsm/config-default/config-lgsm/q3server/_default.cfg +++ b/lgsm/config-default/config-lgsm/q3server/_default.cfg @@ -42,6 +42,11 @@ emailalert="off" email="email@example.com" emailfrom="" +# Gotify Alerts | https://docs.linuxgsm.com/alerts/gotify +gotifyalert="off" +gotifytoken="token" +gotifywebhook="webhook" + # IFTTT Alerts | https://docs.linuxgsm.com/alerts/ifttt iftttalert="off" ifttttoken="accesstoken" diff --git a/lgsm/config-default/config-lgsm/qlserver/_default.cfg b/lgsm/config-default/config-lgsm/qlserver/_default.cfg index 69ed4d662..c2c0d0f24 100644 --- a/lgsm/config-default/config-lgsm/qlserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/qlserver/_default.cfg @@ -37,6 +37,11 @@ emailalert="off" email="email@example.com" emailfrom="" +# Gotify Alerts | https://docs.linuxgsm.com/alerts/gotify +gotifyalert="off" +gotifytoken="token" +gotifywebhook="webhook" + # IFTTT Alerts | https://docs.linuxgsm.com/alerts/ifttt iftttalert="off" ifttttoken="accesstoken" diff --git a/lgsm/config-default/config-lgsm/qwserver/_default.cfg b/lgsm/config-default/config-lgsm/qwserver/_default.cfg index 7f5484895..9435b2199 100644 --- a/lgsm/config-default/config-lgsm/qwserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/qwserver/_default.cfg @@ -41,6 +41,11 @@ emailalert="off" email="email@example.com" emailfrom="" +# Gotify Alerts | https://docs.linuxgsm.com/alerts/gotify +gotifyalert="off" +gotifytoken="token" +gotifywebhook="webhook" + # IFTTT Alerts | https://docs.linuxgsm.com/alerts/ifttt iftttalert="off" ifttttoken="accesstoken" diff --git a/lgsm/config-default/config-lgsm/ricochetserver/_default.cfg b/lgsm/config-default/config-lgsm/ricochetserver/_default.cfg index 93a9a8432..d36a4c1f2 100644 --- a/lgsm/config-default/config-lgsm/ricochetserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/ricochetserver/_default.cfg @@ -44,6 +44,11 @@ emailalert="off" email="email@example.com" emailfrom="" +# Gotify Alerts | https://docs.linuxgsm.com/alerts/gotify +gotifyalert="off" +gotifytoken="token" +gotifywebhook="webhook" + # IFTTT Alerts | https://docs.linuxgsm.com/alerts/ifttt iftttalert="off" ifttttoken="accesstoken" diff --git a/lgsm/config-default/config-lgsm/roserver/_default.cfg b/lgsm/config-default/config-lgsm/roserver/_default.cfg index 36ad5d5e8..58e3f4fe9 100644 --- a/lgsm/config-default/config-lgsm/roserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/roserver/_default.cfg @@ -45,6 +45,11 @@ emailalert="off" email="email@example.com" emailfrom="" +# Gotify Alerts | https://docs.linuxgsm.com/alerts/gotify +gotifyalert="off" +gotifytoken="token" +gotifywebhook="webhook" + # IFTTT Alerts | https://docs.linuxgsm.com/alerts/ifttt iftttalert="off" ifttttoken="accesstoken" diff --git a/lgsm/config-default/config-lgsm/rtcwserver/_default.cfg b/lgsm/config-default/config-lgsm/rtcwserver/_default.cfg index 54571e2af..847c8a1dd 100644 --- a/lgsm/config-default/config-lgsm/rtcwserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/rtcwserver/_default.cfg @@ -42,6 +42,11 @@ emailalert="off" email="email@example.com" emailfrom="" +# Gotify Alerts | https://docs.linuxgsm.com/alerts/gotify +gotifyalert="off" +gotifytoken="token" +gotifywebhook="webhook" + # IFTTT Alerts | https://docs.linuxgsm.com/alerts/ifttt iftttalert="off" ifttttoken="accesstoken" diff --git a/lgsm/config-default/config-lgsm/rustserver/_default.cfg b/lgsm/config-default/config-lgsm/rustserver/_default.cfg index c956b492c..7be5cd21d 100644 --- a/lgsm/config-default/config-lgsm/rustserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/rustserver/_default.cfg @@ -55,6 +55,11 @@ emailalert="off" email="email@example.com" emailfrom="" +# Gotify Alerts | https://docs.linuxgsm.com/alerts/gotify +gotifyalert="off" +gotifytoken="token" +gotifywebhook="webhook" + # IFTTT Alerts | https://docs.linuxgsm.com/alerts/ifttt iftttalert="off" ifttttoken="accesstoken" diff --git a/lgsm/config-default/config-lgsm/rwserver/_default.cfg b/lgsm/config-default/config-lgsm/rwserver/_default.cfg index 0ff3726ba..f1c09e189 100644 --- a/lgsm/config-default/config-lgsm/rwserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/rwserver/_default.cfg @@ -40,6 +40,11 @@ emailalert="off" email="email@example.com" emailfrom="" +# Gotify Alerts | https://docs.linuxgsm.com/alerts/gotify +gotifyalert="off" +gotifytoken="token" +gotifywebhook="webhook" + # IFTTT Alerts | https://docs.linuxgsm.com/alerts/ifttt iftttalert="off" ifttttoken="accesstoken" diff --git a/lgsm/config-default/config-lgsm/sampserver/_default.cfg b/lgsm/config-default/config-lgsm/sampserver/_default.cfg index d1add1c0e..6883fe589 100644 --- a/lgsm/config-default/config-lgsm/sampserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/sampserver/_default.cfg @@ -41,6 +41,11 @@ emailalert="off" email="email@example.com" emailfrom="" +# Gotify Alerts | https://docs.linuxgsm.com/alerts/gotify +gotifyalert="off" +gotifytoken="token" +gotifywebhook="webhook" + # IFTTT Alerts | https://docs.linuxgsm.com/alerts/ifttt iftttalert="off" ifttttoken="accesstoken" diff --git a/lgsm/config-default/config-lgsm/sbotsserver/_default.cfg b/lgsm/config-default/config-lgsm/sbotsserver/_default.cfg index 438a37e0a..6805d6395 100644 --- a/lgsm/config-default/config-lgsm/sbotsserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/sbotsserver/_default.cfg @@ -45,6 +45,11 @@ emailalert="off" email="email@example.com" emailfrom="" +# Gotify Alerts | https://docs.linuxgsm.com/alerts/gotify +gotifyalert="off" +gotifytoken="token" +gotifywebhook="webhook" + # IFTTT Alerts | https://docs.linuxgsm.com/alerts/ifttt iftttalert="off" ifttttoken="accesstoken" diff --git a/lgsm/config-default/config-lgsm/sbserver/_default.cfg b/lgsm/config-default/config-lgsm/sbserver/_default.cfg index 03093c44c..13815fbcb 100644 --- a/lgsm/config-default/config-lgsm/sbserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/sbserver/_default.cfg @@ -44,6 +44,11 @@ emailalert="off" email="email@example.com" emailfrom="" +# Gotify Alerts | https://docs.linuxgsm.com/alerts/gotify +gotifyalert="off" +gotifytoken="token" +gotifywebhook="webhook" + # IFTTT Alerts | https://docs.linuxgsm.com/alerts/ifttt iftttalert="off" ifttttoken="accesstoken" diff --git a/lgsm/config-default/config-lgsm/scpslserver/_default.cfg b/lgsm/config-default/config-lgsm/scpslserver/_default.cfg index 871d8d18c..ac948d864 100644 --- a/lgsm/config-default/config-lgsm/scpslserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/scpslserver/_default.cfg @@ -42,6 +42,11 @@ emailalert="off" email="email@example.com" emailfrom="" +# Gotify Alerts | https://docs.linuxgsm.com/alerts/gotify +gotifyalert="off" +gotifytoken="token" +gotifywebhook="webhook" + # IFTTT Alerts | https://docs.linuxgsm.com/alerts/ifttt iftttalert="off" ifttttoken="accesstoken" diff --git a/lgsm/config-default/config-lgsm/scpslsmserver/_default.cfg b/lgsm/config-default/config-lgsm/scpslsmserver/_default.cfg index 7a4c80253..285bd0a49 100644 --- a/lgsm/config-default/config-lgsm/scpslsmserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/scpslsmserver/_default.cfg @@ -42,6 +42,11 @@ emailalert="off" email="email@example.com" emailfrom="" +# Gotify Alerts | https://docs.linuxgsm.com/alerts/gotify +gotifyalert="off" +gotifytoken="token" +gotifywebhook="webhook" + # IFTTT Alerts | https://docs.linuxgsm.com/alerts/ifttt iftttalert="off" ifttttoken="accesstoken" diff --git a/lgsm/config-default/config-lgsm/sdtdserver/_default.cfg b/lgsm/config-default/config-lgsm/sdtdserver/_default.cfg index 7c985a636..bd922057b 100644 --- a/lgsm/config-default/config-lgsm/sdtdserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/sdtdserver/_default.cfg @@ -40,6 +40,11 @@ emailalert="off" email="email@example.com" emailfrom="" +# Gotify Alerts | https://docs.linuxgsm.com/alerts/gotify +gotifyalert="off" +gotifytoken="token" +gotifywebhook="webhook" + # IFTTT Alerts | https://docs.linuxgsm.com/alerts/ifttt iftttalert="off" ifttttoken="accesstoken" diff --git a/lgsm/config-default/config-lgsm/sfcserver/_default.cfg b/lgsm/config-default/config-lgsm/sfcserver/_default.cfg index 8dc17afb9..5b1071a3b 100644 --- a/lgsm/config-default/config-lgsm/sfcserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/sfcserver/_default.cfg @@ -45,6 +45,11 @@ emailalert="off" email="email@example.com" emailfrom="" +# Gotify Alerts | https://docs.linuxgsm.com/alerts/gotify +gotifyalert="off" +gotifytoken="token" +gotifywebhook="webhook" + # IFTTT Alerts | https://docs.linuxgsm.com/alerts/ifttt iftttalert="off" ifttttoken="accesstoken" diff --git a/lgsm/config-default/config-lgsm/sof2server/_default.cfg b/lgsm/config-default/config-lgsm/sof2server/_default.cfg index 36922b437..094754914 100644 --- a/lgsm/config-default/config-lgsm/sof2server/_default.cfg +++ b/lgsm/config-default/config-lgsm/sof2server/_default.cfg @@ -42,6 +42,11 @@ emailalert="off" email="email@example.com" emailfrom="" +# Gotify Alerts | https://docs.linuxgsm.com/alerts/gotify +gotifyalert="off" +gotifytoken="token" +gotifywebhook="webhook" + # IFTTT Alerts | https://docs.linuxgsm.com/alerts/ifttt iftttalert="off" ifttttoken="accesstoken" diff --git a/lgsm/config-default/config-lgsm/solserver/_default.cfg b/lgsm/config-default/config-lgsm/solserver/_default.cfg index 6ce6ce1cf..820492509 100644 --- a/lgsm/config-default/config-lgsm/solserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/solserver/_default.cfg @@ -41,6 +41,11 @@ emailalert="off" email="email@example.com" emailfrom="" +# Gotify Alerts | https://docs.linuxgsm.com/alerts/gotify +gotifyalert="off" +gotifytoken="token" +gotifywebhook="webhook" + # IFTTT Alerts | https://docs.linuxgsm.com/alerts/ifttt iftttalert="off" ifttttoken="accesstoken" diff --git a/lgsm/config-default/config-lgsm/squadserver/_default.cfg b/lgsm/config-default/config-lgsm/squadserver/_default.cfg index a4d8496d8..1adfe68e0 100644 --- a/lgsm/config-default/config-lgsm/squadserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/squadserver/_default.cfg @@ -42,6 +42,11 @@ emailalert="off" email="email@example.com" emailfrom="" +# Gotify Alerts | https://docs.linuxgsm.com/alerts/gotify +gotifyalert="off" +gotifytoken="token" +gotifywebhook="webhook" + # IFTTT Alerts | https://docs.linuxgsm.com/alerts/ifttt iftttalert="off" ifttttoken="accesstoken" diff --git a/lgsm/config-default/config-lgsm/stserver/_default.cfg b/lgsm/config-default/config-lgsm/stserver/_default.cfg index c58182cdd..8c0f0dbf9 100644 --- a/lgsm/config-default/config-lgsm/stserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/stserver/_default.cfg @@ -47,6 +47,11 @@ emailalert="off" email="email@example.com" emailfrom="" +# Gotify Alerts | https://docs.linuxgsm.com/alerts/gotify +gotifyalert="off" +gotifytoken="token" +gotifywebhook="webhook" + # IFTTT Alerts | https://docs.linuxgsm.com/alerts/ifttt iftttalert="off" ifttttoken="accesstoken" diff --git a/lgsm/config-default/config-lgsm/svenserver/_default.cfg b/lgsm/config-default/config-lgsm/svenserver/_default.cfg index 1d7b97c7f..f8feb47f4 100644 --- a/lgsm/config-default/config-lgsm/svenserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/svenserver/_default.cfg @@ -44,6 +44,11 @@ emailalert="off" email="email@example.com" emailfrom="" +# Gotify Alerts | https://docs.linuxgsm.com/alerts/gotify +gotifyalert="off" +gotifytoken="token" +gotifywebhook="webhook" + # IFTTT Alerts | https://docs.linuxgsm.com/alerts/ifttt iftttalert="off" ifttttoken="accesstoken" diff --git a/lgsm/config-default/config-lgsm/terrariaserver/_default.cfg b/lgsm/config-default/config-lgsm/terrariaserver/_default.cfg index 27306d89e..c0aaea6c6 100644 --- a/lgsm/config-default/config-lgsm/terrariaserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/terrariaserver/_default.cfg @@ -44,6 +44,11 @@ emailalert="off" email="email@example.com" emailfrom="" +# Gotify Alerts | https://docs.linuxgsm.com/alerts/gotify +gotifyalert="off" +gotifytoken="token" +gotifywebhook="webhook" + # IFTTT Alerts | https://docs.linuxgsm.com/alerts/ifttt iftttalert="off" ifttttoken="accesstoken" diff --git a/lgsm/config-default/config-lgsm/tf2server/_default.cfg b/lgsm/config-default/config-lgsm/tf2server/_default.cfg index 72f79304d..16ab36696 100644 --- a/lgsm/config-default/config-lgsm/tf2server/_default.cfg +++ b/lgsm/config-default/config-lgsm/tf2server/_default.cfg @@ -50,6 +50,11 @@ emailalert="off" email="email@example.com" emailfrom="" +# Gotify Alerts | https://docs.linuxgsm.com/alerts/gotify +gotifyalert="off" +gotifytoken="token" +gotifywebhook="webhook" + # IFTTT Alerts | https://docs.linuxgsm.com/alerts/ifttt iftttalert="off" ifttttoken="accesstoken" diff --git a/lgsm/config-default/config-lgsm/tfcserver/_default.cfg b/lgsm/config-default/config-lgsm/tfcserver/_default.cfg index a9339fda9..b22c10a7c 100644 --- a/lgsm/config-default/config-lgsm/tfcserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/tfcserver/_default.cfg @@ -44,6 +44,11 @@ emailalert="off" email="email@example.com" emailfrom="" +# Gotify Alerts | https://docs.linuxgsm.com/alerts/gotify +gotifyalert="off" +gotifytoken="token" +gotifywebhook="webhook" + # IFTTT Alerts | https://docs.linuxgsm.com/alerts/ifttt iftttalert="off" ifttttoken="accesstoken" diff --git a/lgsm/config-default/config-lgsm/ts3server/_default.cfg b/lgsm/config-default/config-lgsm/ts3server/_default.cfg index 694b0501f..f676309d0 100644 --- a/lgsm/config-default/config-lgsm/ts3server/_default.cfg +++ b/lgsm/config-default/config-lgsm/ts3server/_default.cfg @@ -37,6 +37,11 @@ emailalert="off" email="email@example.com" emailfrom="" +# Gotify Alerts | https://docs.linuxgsm.com/alerts/gotify +gotifyalert="off" +gotifytoken="token" +gotifywebhook="webhook" + # IFTTT Alerts | https://docs.linuxgsm.com/alerts/ifttt iftttalert="off" ifttttoken="accesstoken" diff --git a/lgsm/config-default/config-lgsm/tsserver/_default.cfg b/lgsm/config-default/config-lgsm/tsserver/_default.cfg index b9ad02e2b..c1c99b24a 100644 --- a/lgsm/config-default/config-lgsm/tsserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/tsserver/_default.cfg @@ -44,6 +44,11 @@ emailalert="off" email="email@example.com" emailfrom="" +# Gotify Alerts | https://docs.linuxgsm.com/alerts/gotify +gotifyalert="off" +gotifytoken="token" +gotifywebhook="webhook" + # IFTTT Alerts | https://docs.linuxgsm.com/alerts/ifttt iftttalert="off" ifttttoken="accesstoken" diff --git a/lgsm/config-default/config-lgsm/tuserver/_default.cfg b/lgsm/config-default/config-lgsm/tuserver/_default.cfg index c0a119abe..5fdfd6447 100644 --- a/lgsm/config-default/config-lgsm/tuserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/tuserver/_default.cfg @@ -47,6 +47,11 @@ emailalert="off" email="email@example.com" emailfrom="" +# Gotify Alerts | https://docs.linuxgsm.com/alerts/gotify +gotifyalert="off" +gotifytoken="token" +gotifywebhook="webhook" + # IFTTT Alerts | https://docs.linuxgsm.com/alerts/ifttt iftttalert="off" ifttttoken="accesstoken" diff --git a/lgsm/config-default/config-lgsm/twserver/_default.cfg b/lgsm/config-default/config-lgsm/twserver/_default.cfg index c8a53240e..791c93da5 100644 --- a/lgsm/config-default/config-lgsm/twserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/twserver/_default.cfg @@ -44,6 +44,11 @@ emailalert="off" email="email@example.com" emailfrom="" +# Gotify Alerts | https://docs.linuxgsm.com/alerts/gotify +gotifyalert="off" +gotifytoken="token" +gotifywebhook="webhook" + # IFTTT Alerts | https://docs.linuxgsm.com/alerts/ifttt iftttalert="off" ifttttoken="accesstoken" diff --git a/lgsm/config-default/config-lgsm/untserver/_default.cfg b/lgsm/config-default/config-lgsm/untserver/_default.cfg index 507005e58..e57f08f57 100644 --- a/lgsm/config-default/config-lgsm/untserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/untserver/_default.cfg @@ -43,6 +43,11 @@ emailalert="off" email="email@example.com" emailfrom="" +# Gotify Alerts | https://docs.linuxgsm.com/alerts/gotify +gotifyalert="off" +gotifytoken="token" +gotifywebhook="webhook" + # IFTTT Alerts | https://docs.linuxgsm.com/alerts/ifttt iftttalert="off" ifttttoken="accesstoken" diff --git a/lgsm/config-default/config-lgsm/ut2k4server/_default.cfg b/lgsm/config-default/config-lgsm/ut2k4server/_default.cfg index cba690fd7..b3ca481cd 100644 --- a/lgsm/config-default/config-lgsm/ut2k4server/_default.cfg +++ b/lgsm/config-default/config-lgsm/ut2k4server/_default.cfg @@ -41,6 +41,11 @@ emailalert="off" email="email@example.com" emailfrom="" +# Gotify Alerts | https://docs.linuxgsm.com/alerts/gotify +gotifyalert="off" +gotifytoken="token" +gotifywebhook="webhook" + # IFTTT Alerts | https://docs.linuxgsm.com/alerts/ifttt iftttalert="off" ifttttoken="accesstoken" diff --git a/lgsm/config-default/config-lgsm/ut3server/_default.cfg b/lgsm/config-default/config-lgsm/ut3server/_default.cfg index 727e79df7..49cd6b7d5 100644 --- a/lgsm/config-default/config-lgsm/ut3server/_default.cfg +++ b/lgsm/config-default/config-lgsm/ut3server/_default.cfg @@ -57,6 +57,11 @@ emailalert="off" email="email@example.com" emailfrom="" +# Gotify Alerts | https://docs.linuxgsm.com/alerts/gotify +gotifyalert="off" +gotifytoken="token" +gotifywebhook="webhook" + # IFTTT Alerts | https://docs.linuxgsm.com/alerts/ifttt iftttalert="off" ifttttoken="accesstoken" diff --git a/lgsm/config-default/config-lgsm/ut99server/_default.cfg b/lgsm/config-default/config-lgsm/ut99server/_default.cfg index c0bb5619a..205e8a1d7 100644 --- a/lgsm/config-default/config-lgsm/ut99server/_default.cfg +++ b/lgsm/config-default/config-lgsm/ut99server/_default.cfg @@ -41,6 +41,11 @@ emailalert="off" email="email@example.com" emailfrom="" +# Gotify Alerts | https://docs.linuxgsm.com/alerts/gotify +gotifyalert="off" +gotifytoken="token" +gotifywebhook="webhook" + # IFTTT Alerts | https://docs.linuxgsm.com/alerts/ifttt iftttalert="off" ifttttoken="accesstoken" diff --git a/lgsm/config-default/config-lgsm/utserver/_default.cfg b/lgsm/config-default/config-lgsm/utserver/_default.cfg index ed19edd39..6b6603221 100644 --- a/lgsm/config-default/config-lgsm/utserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/utserver/_default.cfg @@ -45,6 +45,11 @@ emailalert="off" email="email@example.com" emailfrom="" +# Gotify Alerts | https://docs.linuxgsm.com/alerts/gotify +gotifyalert="off" +gotifytoken="token" +gotifywebhook="webhook" + # IFTTT Alerts | https://docs.linuxgsm.com/alerts/ifttt iftttalert="off" ifttttoken="accesstoken" diff --git a/lgsm/config-default/config-lgsm/vhserver/_default.cfg b/lgsm/config-default/config-lgsm/vhserver/_default.cfg index 096faf2a4..286be4787 100644 --- a/lgsm/config-default/config-lgsm/vhserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/vhserver/_default.cfg @@ -46,6 +46,11 @@ emailalert="off" email="email@example.com" emailfrom="" +# Gotify Alerts | https://docs.linuxgsm.com/alerts/gotify +gotifyalert="off" +gotifytoken="token" +gotifywebhook="webhook" + # IFTTT Alerts | https://docs.linuxgsm.com/alerts/ifttt iftttalert="off" ifttttoken="accesstoken" diff --git a/lgsm/config-default/config-lgsm/vintsserver/_default.cfg b/lgsm/config-default/config-lgsm/vintsserver/_default.cfg index 42b6c42fa..7009f02cb 100644 --- a/lgsm/config-default/config-lgsm/vintsserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/vintsserver/_default.cfg @@ -41,6 +41,11 @@ emailalert="off" email="email@example.com" emailfrom="" +# Gotify Alerts | https://docs.linuxgsm.com/alerts/gotify +gotifyalert="off" +gotifytoken="token" +gotifywebhook="webhook" + # IFTTT Alerts | https://docs.linuxgsm.com/alerts/ifttt iftttalert="off" ifttttoken="accesstoken" diff --git a/lgsm/config-default/config-lgsm/vsserver/_default.cfg b/lgsm/config-default/config-lgsm/vsserver/_default.cfg index dace8b1ab..a441abd01 100644 --- a/lgsm/config-default/config-lgsm/vsserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/vsserver/_default.cfg @@ -44,6 +44,11 @@ emailalert="off" email="email@example.com" emailfrom="" +# Gotify Alerts | https://docs.linuxgsm.com/alerts/gotify +gotifyalert="off" +gotifytoken="token" +gotifywebhook="webhook" + # IFTTT Alerts | https://docs.linuxgsm.com/alerts/ifttt iftttalert="off" ifttttoken="accesstoken" diff --git a/lgsm/config-default/config-lgsm/wetserver/_default.cfg b/lgsm/config-default/config-lgsm/wetserver/_default.cfg index 296b7bd16..012b2df1c 100644 --- a/lgsm/config-default/config-lgsm/wetserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/wetserver/_default.cfg @@ -37,6 +37,11 @@ emailalert="off" email="email@example.com" emailfrom="" +# Gotify Alerts | https://docs.linuxgsm.com/alerts/gotify +gotifyalert="off" +gotifytoken="token" +gotifywebhook="webhook" + # IFTTT Alerts | https://docs.linuxgsm.com/alerts/ifttt iftttalert="off" ifttttoken="accesstoken" diff --git a/lgsm/config-default/config-lgsm/wfserver/_default.cfg b/lgsm/config-default/config-lgsm/wfserver/_default.cfg index 5bb63c67f..eeedf5f18 100644 --- a/lgsm/config-default/config-lgsm/wfserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/wfserver/_default.cfg @@ -42,6 +42,11 @@ emailalert="off" email="email@example.com" emailfrom="" +# Gotify Alerts | https://docs.linuxgsm.com/alerts/gotify +gotifyalert="off" +gotifytoken="token" +gotifywebhook="webhook" + # IFTTT Alerts | https://docs.linuxgsm.com/alerts/ifttt iftttalert="off" ifttttoken="accesstoken" diff --git a/lgsm/config-default/config-lgsm/wmcserver/_default.cfg b/lgsm/config-default/config-lgsm/wmcserver/_default.cfg index b0df8cbfd..229d7bef5 100644 --- a/lgsm/config-default/config-lgsm/wmcserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/wmcserver/_default.cfg @@ -44,6 +44,11 @@ emailalert="off" email="email@example.com" emailfrom="" +# Gotify Alerts | https://docs.linuxgsm.com/alerts/gotify +gotifyalert="off" +gotifytoken="token" +gotifywebhook="webhook" + # IFTTT Alerts | https://docs.linuxgsm.com/alerts/ifttt iftttalert="off" ifttttoken="accesstoken" diff --git a/lgsm/config-default/config-lgsm/wurmserver/_default.cfg b/lgsm/config-default/config-lgsm/wurmserver/_default.cfg index 49b342436..a70fa371f 100644 --- a/lgsm/config-default/config-lgsm/wurmserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/wurmserver/_default.cfg @@ -38,6 +38,11 @@ emailalert="off" email="email@example.com" emailfrom="" +# Gotify Alerts | https://docs.linuxgsm.com/alerts/gotify +gotifyalert="off" +gotifytoken="token" +gotifywebhook="webhook" + # IFTTT Alerts | https://docs.linuxgsm.com/alerts/ifttt iftttalert="off" ifttttoken="accesstoken" diff --git a/lgsm/config-default/config-lgsm/zmrserver/_default.cfg b/lgsm/config-default/config-lgsm/zmrserver/_default.cfg index b5bfa3359..4b87f9172 100644 --- a/lgsm/config-default/config-lgsm/zmrserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/zmrserver/_default.cfg @@ -45,6 +45,11 @@ emailalert="off" email="email@example.com" emailfrom="" +# Gotify Alerts | https://docs.linuxgsm.com/alerts/gotify +gotifyalert="off" +gotifytoken="token" +gotifywebhook="webhook" + # IFTTT Alerts | https://docs.linuxgsm.com/alerts/ifttt iftttalert="off" ifttttoken="accesstoken" diff --git a/lgsm/config-default/config-lgsm/zpsserver/_default.cfg b/lgsm/config-default/config-lgsm/zpsserver/_default.cfg index bf3c26e22..a5fc616cf 100644 --- a/lgsm/config-default/config-lgsm/zpsserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/zpsserver/_default.cfg @@ -50,6 +50,11 @@ emailalert="off" email="email@example.com" emailfrom="" +# Gotify Alerts | https://docs.linuxgsm.com/alerts/gotify +gotifyalert="off" +gotifytoken="token" +gotifywebhook="webhook" + # IFTTT Alerts | https://docs.linuxgsm.com/alerts/ifttt iftttalert="off" ifttttoken="accesstoken" diff --git a/lgsm/functions/alert.sh b/lgsm/functions/alert.sh index 782c6e9a4..c62c65556 100755 --- a/lgsm/functions/alert.sh +++ b/lgsm/functions/alert.sh @@ -141,6 +141,21 @@ elif [ -z "${email}" ]&&[ "${commandname}" == "TEST-ALERT" ]; then fn_script_log_error "Email not set" fi +if [ "${gotifyalert}" == "on" ]&&[ -n "${gotifyalert}" ]; then + alert_gotify.sh +elif [ "${gotifyalert}" != "on" ]&&[ "${commandname}" == "TEST-ALERT" ]; then + fn_print_warn_nl "Gotify alerts not enabled" + fn_script_log_warn "Gotify alerts not enabled" +elif [ -z "${gotifytoken}" ]&&[ "${commandname}" == "TEST-ALERT" ]; then + fn_print_error_nl "Gotify token not set" + echo -e "* https://docs.linuxgsm.com/alerts/gotify" + fn_script_error "Gotify token not set" +elif [ -z "${gotifywebhook}" ]&&[ "${commandname}" == "TEST-ALERT" ]; then + fn_print_error_nl "Gotify webhook not set" + echo -e "* https://docs.linuxgsm.com/alerts/gotify" + fn_script_error "Gotify webhook not set" +fi + if [ "${iftttalert}" == "on" ]&&[ -n "${iftttalert}" ]; then alert_ifttt.sh elif [ "${iftttalert}" != "on" ]&&[ "${commandname}" == "TEST-ALERT" ]; then diff --git a/lgsm/functions/alert_discord.sh b/lgsm/functions/alert_discord.sh index 1d047b60b..9db56da3f 100755 --- a/lgsm/functions/alert_discord.sh +++ b/lgsm/functions/alert_discord.sh @@ -7,11 +7,6 @@ functionselfname="$(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." -fi - 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 < /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, 20 Sep 2021 22:10:11 +0200 Subject: [PATCH 046/164] feat(dodr): Day of Dragons (#3351) * feat(dodr): add new server * updated query * update info Co-authored-by: Daniel Gibbs --- .../config-lgsm/dodrserver/_default.cfg | 181 ++++++++++++++++++ lgsm/data/serverlist.csv | 1 + lgsm/functions/info_game.sh | 13 ++ lgsm/functions/install_config.sh | 6 + 4 files changed, 201 insertions(+) create mode 100644 lgsm/config-default/config-lgsm/dodrserver/_default.cfg diff --git a/lgsm/config-default/config-lgsm/dodrserver/_default.cfg b/lgsm/config-default/config-lgsm/dodrserver/_default.cfg new file mode 100644 index 000000000..00f2c11f5 --- /dev/null +++ b/lgsm/config-default/config-lgsm/dodrserver/_default.cfg @@ -0,0 +1,181 @@ +################################## +######## 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 +servername="LinuxGSM" +ip="0.0.0.0" +port="7777" +queryport="27015" + +## Server Parameters | https://docs.linuxgsm.com/configuration/start-parameters#additional-parameters +startparameters="-MultiHome=${ip} -Port=${port} -QueryPort=${queryport} -SteamServerName='${servername}' -log" + +#### 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". +telegramapi="api.telegram.org" +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="1088320" +steamcmdforcewindows="no" +# 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="yes" +consoleinteract="no" + +## Game Server Details +# Do not edit +gamename="Day of Dragons" +engine="unreal4" +glibc="2.17" + +#### Directories #### +# Edit with care + +## Game Server Directories +systemdir="${serverfiles}/Dragons" +executabledir="${systemdir}/Binaries/Linux" +executable="./DragonsServer-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}/${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 524826a33..ce3d2e85d 100644 --- a/lgsm/data/serverlist.csv +++ b/lgsm/data/serverlist.csv @@ -29,6 +29,7 @@ css,cssserver,Counter-Strike: Source dab,dabserver,Double Action: Boogaloo dmc,dmcserver,Deathmatch Classic dod,dodserver,Day of Defeat +dodr,dodrserver,Day of Dragons dods,dodsserver,Day of Defeat: Source doi,doiserver,Day of Infamy dst,dstserver,Don't Starve Together diff --git a/lgsm/functions/info_game.sh b/lgsm/functions/info_game.sh index 4b45ab417..295daa55d 100644 --- a/lgsm/functions/info_game.sh +++ b/lgsm/functions/info_game.sh @@ -356,6 +356,17 @@ fn_info_game_col(){ fi } +fn_info_game_dodr(){ + if [ ! -f "${servercfgfullpath}" ]; then + maxplayers="${zero}" + else + maxplayers=$(sed -nr 's/^iServerMaxPlayers=(.*)$/\1/p' "${servercfgfullpath}") + + # Not Set + maxplayers=${maxplayers:-"NOT SET"} + fi +} + fn_info_game_dst(){ # Config if [ ! -f "${clustercfgfullpath}" ]; then @@ -2036,6 +2047,8 @@ elif [ "${shortname}" == "codwaw" ]; then fn_info_game_codwaw elif [ "${shortname}" == "col" ]; then fn_info_game_col +elif [ "${shortname}" == "dodr" ]; then + fn_info_game_dodr elif [ "${shortname}" == "dst" ]; then fn_info_game_dst elif [ "${shortname}" == "eco" ]; then diff --git a/lgsm/functions/install_config.sh b/lgsm/functions/install_config.sh index 9b5ef01cd..73e45929e 100755 --- a/lgsm/functions/install_config.sh +++ b/lgsm/functions/install_config.sh @@ -359,6 +359,12 @@ elif [ "${shortname}" == "dod" ]; then fn_default_config_remote fn_set_config_vars fn_list_config_locations +elif [ "${shortname}" == "dodr" ]; then + gamedirname="DayOfDragons" + array_configs+=( Game.ini ) + fn_fetch_default_config + fn_default_config_remote + fn_list_config_locations elif [ "${shortname}" == "dods" ]; then gamedirname="DayOfDefeatSource" array_configs+=( server.cfg ) From eaefc57131cd4a114c797d5b49b7f271d5cfdc63 Mon Sep 17 00:00:00 2001 From: Christian Date: Mon, 20 Sep 2021 23:52:34 +0200 Subject: [PATCH 047/164] feat(newserver): Survive the Nights (#3427) * feat(newserver): Survive the Nights * add gotify * update info_config * verbose console * added missing dodr stuff Co-authored-by: Daniel Gibbs --- .../config-lgsm/dodrserver/_default.cfg | 5 + .../config-lgsm/stnserver/_default.cfg | 186 ++++++++++++++++++ lgsm/data/serverlist.csv | 1 + lgsm/functions/info_game.sh | 18 ++ lgsm/functions/info_messages.sh | 22 ++- lgsm/functions/install_config.sh | 7 + 6 files changed, 238 insertions(+), 1 deletion(-) create mode 100644 lgsm/config-default/config-lgsm/stnserver/_default.cfg diff --git a/lgsm/config-default/config-lgsm/dodrserver/_default.cfg b/lgsm/config-default/config-lgsm/dodrserver/_default.cfg index 00f2c11f5..3bf88cf46 100644 --- a/lgsm/config-default/config-lgsm/dodrserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/dodrserver/_default.cfg @@ -43,6 +43,11 @@ emailalert="off" email="email@example.com" emailfrom="" +# Gotify Alerts | https://docs.linuxgsm.com/alerts/gotify +gotifyalert="off" +gotifytoken="token" +gotifywebhook="webhook" + # IFTTT Alerts | https://docs.linuxgsm.com/alerts/ifttt iftttalert="off" ifttttoken="accesstoken" diff --git a/lgsm/config-default/config-lgsm/stnserver/_default.cfg b/lgsm/config-default/config-lgsm/stnserver/_default.cfg new file mode 100644 index 000000000..339d1ee22 --- /dev/null +++ b/lgsm/config-default/config-lgsm/stnserver/_default.cfg @@ -0,0 +1,186 @@ +################################## +######## 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 #### +maxplayers="20" +# Regions: USA: 0, EU: 1, AUS: 2 +region="0" + +## Server Parameters | https://docs.linuxgsm.com/configuration/start-parameters#additional-parameters +# Edit with care | https://colonysurvival.gamepedia.com/Dedicated_Server#Installation_.28Linux.29 +startparameters="-mc ${maxplayers} -r ${region}" + +#### 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="" + +# Gotify Alerts | https://docs.linuxgsm.com/alerts/gotify +gotifyalert="off" +gotifytoken="token" +gotifywebhook="webhook" + +# 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". +telegramapi="api.telegram.org" +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="1502300" +steamcmdforcewindows="no" +# 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="yes" +consoleinteract="no" + +## Game Server Details +# Do not edit +gamename="Survive the Nights" +engine="unity3d" +glibc="2.15" + +#### Directories #### +# Edit with care + +## Game Server Directories +systemdir="${serverfiles}" +executabledir="${serverfiles}" +executable="./Server_Linux_x64" +servercfgdir="${systemdir}/Config" +servercfg="ServerConfig.txt" +servercfgdefault="ServerConfig.txt" +servercfgfullpath="${servercfgdir}/${servercfg}" + +## Backup Directory +backupdir="${lgsmdir}/backup" + +## Logging Directories +logdir="${rootdir}/log" +gamelogdir="${serverfiles}" +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 ce3d2e85d..4bad355a6 100644 --- a/lgsm/data/serverlist.csv +++ b/lgsm/data/serverlist.csv @@ -95,6 +95,7 @@ sof2,sof2server,Soldier Of Fortune 2: Gold Edition sol,solserver,Soldat squad,squadserver,Squad st,stserver,Stationeers +stn,stnserver,Survive the Nights sven,svenserver,Sven Co-op terraria,terrariaserver,Terraria tf2,tf2server,Team Fortress 2 diff --git a/lgsm/functions/info_game.sh b/lgsm/functions/info_game.sh index 295daa55d..5f460c68e 100644 --- a/lgsm/functions/info_game.sh +++ b/lgsm/functions/info_game.sh @@ -1621,6 +1621,22 @@ fn_info_game_terraria(){ fi } +fn_info_game_stn(){ + if [ -f "${servercfgfullpath}" ]; then + servername=$(sed -nr 's/^ServerName="(.*)"/\1/p' "${servercfgfullpath}") + configip=$(sed -nr 's/^ServerIP=([0-9]+)/\1/p' "${servercfgfullpath}") + port=$(sed -nr 's/^ServerPort=([0-9]+)/\1/p' "${servercfgfullpath}") + serverpassword=$(sed -nr 's/^ServerPassword=(.*)$/\1/p' "${servercfgfullpath}") + queryport=$((port + 1)) + else + servername="${unavailable}" + configip=${configip:-"0.0.0.0"} + port="${zero}" + queryport="${zero}" + serverpassword=${serverpassword:-"NOT SET"} + fi +} + fn_info_game_ts3(){ if [ ! -f "${servercfgfullpath}" ]; then dbplugin="${unavailable}" @@ -2131,6 +2147,8 @@ elif [ "${shortname}" == "squad" ]; then fn_info_game_squad elif [ "${shortname}" == "st" ]; then fn_info_game_st +elif [ "${shortname}" == "stn" ]; then + fn_info_game_stn elif [ "${shortname}" == "terraria" ]; then fn_info_game_terraria elif [ "${shortname}" == "tu" ]; then diff --git a/lgsm/functions/info_messages.sh b/lgsm/functions/info_messages.sh index c6f0f99f0..eb1724560 100755 --- a/lgsm/functions/info_messages.sh +++ b/lgsm/functions/info_messages.sh @@ -653,7 +653,7 @@ fn_info_message_ports_edit(){ startparameterslocation="${red}UNKNOWN${default}" # engines/games that require editing in the config file. - local ports_edit_array=( "ac" "arma3" "bo" "bt" "dst" "eco" "idtech2" "idtech3" "idtech3_ql" "jc2" "jc3" "lwjgl2" "mcb" "mumble" "pc" "pz" "qw" "refractor" "renderware" "rw" "sb" "sdtd" "st" "ts3" "tw" "terraria" "unreal" "unreal2" "unreal3" "vints" "wurm") + local ports_edit_array=( "ac" "arma3" "bo" "bt" "dst" "eco" "idtech2" "idtech3" "idtech3_ql" "jc2" "jc3" "lwjgl2" "mcb" "mumble" "pc" "pz" "qw" "refractor" "renderware" "rw" "sb" "sdtd" "st" "stn" "ts3" "tw" "terraria" "unreal" "unreal2" "unreal3" "vints" "wurm") for port_edit in "${ports_edit_array[@]}"; do if [ "${shortname}" == "ut3" ]; then startparameterslocation="${servercfgdir}/UTWeb.ini" @@ -924,6 +924,14 @@ fn_info_message_csgo(){ } | column -s $'\t' -t } +fn_info_message_dodr(){ + { + fn_port "header" + fn_port "Game" port udp + fn_port "Query" queryport udp + } | column -s $'\t' -t +} + fn_info_message_dst(){ { fn_port "header" @@ -1564,6 +1572,14 @@ fn_info_message_wurm(){ } | column -s $'\t' -t } +fn_info_message_stn(){ + { + fn_port "header" + fn_port "Game" port udp + fn_port "Query" queryport udp + } | column -s $'\t' -t +} + fn_info_message_select_engine(){ # Display details depending on game or engine. if [ "${shortname}" == "ac" ]; then @@ -1600,6 +1616,8 @@ fn_info_message_select_engine(){ fn_info_message_codwaw elif [ "${shortname}" == "col" ]; then fn_info_message_col + elif [ "${shortname}" == "dodr" ]; then + fn_info_message_dodr elif [ "${shortname}" == "dst" ]; then fn_info_message_dst elif [ "${shortname}" == "eco" ]; then @@ -1680,6 +1698,8 @@ fn_info_message_select_engine(){ fn_info_message_squad elif [ "${shortname}" == "st" ]; then fn_info_message_st + elif [ "${shortname}" == "stn" ]; then + fn_info_message_stn elif [ "${shortname}" == "terraria" ]; then fn_info_message_terraria elif [ "${shortname}" == "ts3" ]; then diff --git a/lgsm/functions/install_config.sh b/lgsm/functions/install_config.sh index 73e45929e..96ae7a1ea 100755 --- a/lgsm/functions/install_config.sh +++ b/lgsm/functions/install_config.sh @@ -723,6 +723,13 @@ elif [ "${shortname}" == "st" ]; then fn_default_config_remote fn_set_config_vars fn_list_config_locations +elif [ "${shortname}" == "stn" ]; then + gamedirname="SurvivetheNights" + array_configs+=( ServerConfig.txt ServerUsers.txt TpPresets.json UserPermissions.json ) + 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 ) From 37bf70f7c2e4bcd9d52769c70f28aa803a979e52 Mon Sep 17 00:00:00 2001 From: Deyan Dobromirov Date: Tue, 21 Sep 2021 01:28:55 +0300 Subject: [PATCH 048/164] feat(mods): More Gmod addons utilising the installer (#3401) * feat: More Gmod addons by utilizing the installer * feat: Update the global array * feat: Laser STool addition * fix: updated the laser STool with the correct *.zip path --- lgsm/functions/mods_list.sh | 20 ++++++++++++++++++-- 1 file changed, 18 insertions(+), 2 deletions(-) diff --git a/lgsm/functions/mods_list.sh b/lgsm/functions/mods_list.sh index 3863dfe47..35a302fc0 100755 --- a/lgsm/functions/mods_list.sh +++ b/lgsm/functions/mods_list.sh @@ -147,12 +147,28 @@ mod_info_utime=( MOD "utime" "UTime" "https://github.com/TeamUlysses/utime/archi mod_info_uclip=( MOD "uclip" "UClip" "https://github.com/TeamUlysses/uclip/archive/master.zip" "uclip-master.zip" "0" "LowercaseOff" "${systemdir}/addons" "OVERWRITE" "ENGINES" "Garry's Mod;" "NOTGAMES" "http://ulyssesmod.net" "An alternative to noclip" ) mod_info_acf=( MOD "acf" "Armoured Combat Framework" "https://github.com/nrlulz/ACF/archive/master.zip" "acf-master.zip" "0" "LowercaseOn" "${systemdir}/addons" "acf-master/lua/acf/shared/guns;" "ENGINES" "Garry's Mod;" "NOTGAMES" "https://github.com/nrlulz/ACF" "Realistic Wepons & Engines" ) mod_info_acf_missiles=( MOD "acfmissiles" "ACF Missiles" "https://github.com/Bubbus/ACF-Missiles/archive/master.zip" "acf-missiles-master.zip" "0" "LowercaseOn" "${systemdir}/addons" "OVERWRITE" "ENGINES" "Garry's Mod;" "NOTGAMES" "https://github.com/Bubbus/ACF-Missiles" "More missiles for ACF" ) -mod_info_advdupe2=( MOD "advdupe2" "Advanced Duplicator 2" "https://github.com/wiremod/advdupe2/archive/master.zip" "advdupe2-master.zip" "0" "LowercaseOn" "${systemdir}/addons" "OVERWRITE" "ENGINES" "Garry's Mod;" "NOTGAMES" "http://www.wiremod.com" "Save your constructions" ) +mod_info_advdupe2=( MOD "advdupe2" "Advanced Duplicator 2" "https://github.com/wiremod/advdupe2/archive/master.zip" "advdupe2-master.zip" "0" "LowercaseOn" "${systemdir}/addons" "OVERWRITE" "ENGINES" "Garry's Mod;" "NOTGAMES" "http://www.wiremod.com" "Save your constructions. Second version" ) mod_info_pac3=( MOD "pac3" "PAC3" "https://github.com/CapsAdmin/pac3/archive/master.zip" "pac3-master.zip" "0" "LowercaseOff" "${systemdir}/addons" "OVERWRITE" "ENGINES" "Garry's Mod;" "NOTGAMES" "https://github.com/CapsAdmin/pac3" "Advanced player model customization" ) mod_info_wiremod=( MOD "wiremod" "Wiremod" "https://github.com/wiremod/wire/archive/master.zip" "wire-master.zip" "0" "LowercaseOff" "${systemdir}/addons" "OVERWRITE" "ENGINES" "Garry's Mod;" "NOTGAMES" "https://github.com/wiremod/wire" "Base Wiremod Addon") mod_info_wiremodextras=( MOD "wiremod-extras" "Wiremod Extras" "https://github.com/wiremod/wire-extras/archive/master.zip" "wire-extras-master.zip" "0" "LowercaseOff" "${systemdir}/addons" "OVERWRITE" "ENGINES" "Garry's Mod;" "NOTGAMES" "https://github.com/wiremod/wire-extras/" "Addition to Wiremod, Extra Content") +mod_info_advduplicator=( MOD "advdupe1" "Advanced Duplicator 1" "https://github.com/wiremod/advduplicator/archive/master.zip" "advduplicator-master.zip" "0" "LowercaseOn" "${systemdir}/addons" "OVERWRITE" "ENGINES" "Garry's Mod;" "NOTGAMES" "https://github.com/wiremod/advduplicator" "Save your constructions. First version" ) +mod_info_trackassemblytool=( MOD "trackassemblytool" "Track Assembly Tool" "https://github.com/dvdvideo1234/trackassemblytool/archive/master.zip" "trackassemblytool-master.zip" "0" "LowercaseOn" "${systemdir}/addons" "OVERWRITE" "ENGINES" "Garry's Mod;" "NOTGAMES" "https://github.com/dvdvideo1234/TrackAssemblyTool" "Assembles segmented track. Supports wire" ) +mod_info_physpropertiesadv=( MOD "physpropertiesadv" "Phys Properties Adv" "https://github.com/dvdvideo1234/physpropertiesadv/archive/master.zip" "physpropertiesadv-master.zip" "0" "LowercaseOn" "${systemdir}/addons" "OVERWRITE" "ENGINES" "Garry's Mod;" "NOTGAMES" "https://github.com/dvdvideo1234/PhysPropertiesAdv" "Advanced configurable properties" ) +mod_info_controlsystemse2=( MOD "controlsystemse2" "Control Systems E2" "https://github.com/dvdvideo1234/controlsystemse2/archive/master.zip" "controlsystemse2-master.zip" "0" "LowercaseOn" "${systemdir}/addons" "OVERWRITE" "ENGINES" "Garry's Mod;" "NOTGAMES" "https://github.com/dvdvideo1234/ControlSystemsE2" "PID controllers and fast traces for E2. Minor included in wire-extas" ) +mod_info_e2pistontiming=( MOD "e2pistontiming" "E2 Piston Timing" "https://github.com/dvdvideo1234/e2pistontiming/archive/master.zip" "e2pistontiming-master.zip" "0" "LowercaseOn" "${systemdir}/addons" "OVERWRITE" "ENGINES" "Garry's Mod;" "NOTGAMES" "https://github.com/dvdvideo1234/E2PistonTiming" "Routine driven piston engine timings for E2" ) +mod_info_propcannontool=( MOD "propcannontool" "Prop Cannon Tool" "https://github.com/dvdvideo1234/propcannontool/archive/master.zip" "propcannontool-master.zip" "0" "LowercaseOn" "${systemdir}/addons" "OVERWRITE" "ENGINES" "Garry's Mod;" "NOTGAMES" "https://github.com/dvdvideo1234/PropCannonTool" "Cannon entity that can fire props. Supports wire" ) +mod_info_gearassemblytool=( MOD "gearassemblytool" "Gear Assembly Tool" "https://github.com/dvdvideo1234/gearassemblytool/archive/master.zip" "gearassemblytool-master.zip" "0" "LowercaseOn" "${systemdir}/addons" "OVERWRITE" "ENGINES" "Garry's Mod;" "NOTGAMES" "https://github.com/dvdvideo1234/GearAssemblyTool" "Assembles segmented gearbox" ) +mod_info_spinnertool=( MOD "spinnertool" "Spinner Tool" "https://github.com/dvdvideo1234/spinnertool/archive/master.zip" "spinnertool-master.zip" "0" "LowercaseOn" "${systemdir}/addons" "OVERWRITE" "ENGINES" "Garry's Mod;" "NOTGAMES" "https://github.com/dvdvideo1234/SpinnerTool" "Torque lever controlled spinner. Supports wire" ) +mod_info_surfacefrictiontool=( MOD "surfacefrictiontool" "Surface Friction Tool" "https://github.com/dvdvideo1234/surfacefrictiontool/archive/master.zip" "surfacefrictiontool-master.zip" "0" "LowercaseOn" "${systemdir}/addons" "OVERWRITE" "ENGINES" "Garry's Mod;" "NOTGAMES" "https://github.com/dvdvideo1234/SurfaceFrictionTool" "Controls the surface friction of a prop" ) +mod_info_magneticdipole=( MOD "magneticdipole" "Magnetic Dipole" "https://github.com/dvdvideo1234/magneticdipole/archive/master.zip" "magneticdipole-master.zip" "0" "LowercaseOn" "${systemdir}/addons" "OVERWRITE" "ENGINES" "Garry's Mod;" "NOTGAMES" "https://github.com/dvdvideo1234/MagneticDipole" "Magnet entity that runs forces on its poles. Supports wire" ) +mod_info_environmentorganizer=( MOD "environmentorganizer" "Environment Organizer" "https://github.com/dvdvideo1234/environmentorganizer/archive/master.zip" "environmentorganizer-master.zip" "0" "LowercaseOn" "${systemdir}/addons" "OVERWRITE" "ENGINES" "Garry's Mod;" "NOTGAMES" "https://github.com/dvdvideo1234/EnvironmentOrganizer" "Installs routines designed for server settings adjustment" ) +mod_info_precision_alignment=( MOD "precision-alignment" "Precision Alignment" "https://github.com/Mista-Tea/precision-alignment/archive/master.zip" "precision-alignment-master.zip" "0" "LowercaseOn" "${systemdir}/addons" "OVERWRITE" "ENGINES" "Garry's Mod;" "NOTGAMES" "https://github.com/Mista-Tea/precision-alignment" "Creates precise constraints and aligments" ) +mod_info_improved_stacker=( MOD "improved-stacker" "Improved Stacker" "https://github.com/Mista-Tea/improved-stacker/archive/master.zip" "improved-stacker-master.zip" "0" "LowercaseOn" "${systemdir}/addons" "OVERWRITE" "ENGINES" "Garry's Mod;" "NOTGAMES" "https://github.com/Mista-Tea/improved-stacker" "Stacks entities in the direction chosen" ) +mod_info_improved_weight=( MOD "improved-weight" "Improved Weight" "https://github.com/Mista-Tea/improved-weight/archive/master.zip" "improved-weight-master.zip" "0" "LowercaseOn" "${systemdir}/addons" "OVERWRITE" "ENGINES" "Garry's Mod;" "NOTGAMES" "https://github.com/Mista-Tea/improved-weight" "Weight tool but with more features" ) +mod_info_improved_antinoclip=( MOD "improved-antinoclip" "Improved Antinoclip" "https://github.com/Mista-Tea/improved-antinoclip/archive/master.zip" "improved-antinoclip-master.zip" "0" "LowercaseOn" "${systemdir}/addons" "OVERWRITE" "ENGINES" "Garry's Mod;" "NOTGAMES" "https://github.com/Mista-Tea/improved-antinoclip" "Controls clipping trough an object" ) 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" ) +mod_info_laserstool=( MOD "laserstool" "Laser STool" "https://github.com/dvdvideo1234/laserstool/archive/main.zip" "laserstool-main.zip" "0" "LowercaseOn" "${systemdir}/addons" "OVERWRITE" "ENGINES" "Garry's Mod;" "NOTGAMES" "https://github.com/dvdvideo1234/LaserSTool" "Scripted tool that spawns laser entities, simulates light rays and even kill players" ) # 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" ) @@ -160,4 +176,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[@]}" ) +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[@]}" "${mod_info_advduplicator[@]}" "${mod_info_trackassemblytool[@]}" "${mod_info_physpropertiesadv[@]}" "${mod_info_controlsystemse2[@]}" "${mod_info_e2pistontiming[@]}" "${mod_info_propcannontool[@]}" "${mod_info_gearassemblytool[@]}" "${mod_info_spinnertool[@]}" "${mod_info_surfacefrictiontool[@]}" "${mod_info_magneticdipole[@]}" "${mod_info_environmentorganizer[@]}" "${mod_info_precision_alignment[@]}" "${mod_info_improved_stacker[@]}" "${mod_info_improved_weight[@]}" "${mod_info_improved_antinoclip[@]}" "${mod_info_laserstool[@]}" ) From 5ca18033532f4f4a3c54f1d23d189c494599ef5e Mon Sep 17 00:00:00 2001 From: Christian Date: Wed, 22 Sep 2021 22:11:46 +0200 Subject: [PATCH 049/164] fix(cod4): Improve servername and rcon password parsing (#3564) * fix(cod4): Improve servername and rcon password parsing * further improvements to info_game Co-authored-by: Daniel Gibbs --- .../config-lgsm/pstbsserver/_default.cfg | 1 - lgsm/functions/info_game.sh | 501 +++++++++++------- lgsm/functions/info_messages.sh | 5 + 3 files changed, 314 insertions(+), 193 deletions(-) mode change 100755 => 100644 lgsm/functions/info_messages.sh diff --git a/lgsm/config-default/config-lgsm/pstbsserver/_default.cfg b/lgsm/config-default/config-lgsm/pstbsserver/_default.cfg index 80a066b2f..9478ad42c 100644 --- a/lgsm/config-default/config-lgsm/pstbsserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/pstbsserver/_default.cfg @@ -14,7 +14,6 @@ port="10027" queryport="10037" rconport="21114" randommap="NONE" -#servername="LinuxGSM Server" maxplayers="40" reservedslots="0" diff --git a/lgsm/functions/info_game.sh b/lgsm/functions/info_game.sh index 5f460c68e..e67bd93bf 100644 --- a/lgsm/functions/info_game.sh +++ b/lgsm/functions/info_game.sh @@ -15,6 +15,7 @@ functionselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" # cut -f1 -d "/" remove everything after / fn_info_game_ac(){ + # Config if [ ! -f "${servercfgfullpath}" ]; then httpport="${zero}" port="${zero}" @@ -28,7 +29,7 @@ fn_info_game_ac(){ 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 + # Not set httpport=${httpport:-"0"} port=${port:-"0"} queryport=${queryport:-"0"} @@ -49,7 +50,7 @@ fn_info_game_ark(){ 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 + # Not set servername=${servername:-"NOT SET"} adminpassword=${adminpassword:-"NOT SET"} serverpassword=${serverpassword:-"NOT SET"} @@ -76,7 +77,7 @@ fn_info_game_arma3(){ serverpassword=$(grep "password" "${servercfgfullpath}" | sed -e 's/^[ \t]*//g' -e '/^\//d' -e 's/password//g' | tr -d '=\";,:' | sed -e 's/^[ \t]*//' -e 's/[ \t]*$//') maxplayers=$(grep "maxPlayers" "${servercfgfullpath}" | grep -v "//" | tr -cd '[:digit:]') - # Not Set + # Not set servername=${servername:-"NOT SET"} adminpassword=${adminpassword:-"NOT SET"} serverpassword=${serverpassword:-"NOT SET"} @@ -93,19 +94,22 @@ fn_info_game_arma3(){ } fn_info_game_av() { + # Config if [ ! -f "${servercfgfullpath}" ]; then maxplayers="${unavailable}" servername="${unavailable}" serverpassword="${unavailable}" - rconpassword="${unavailable}" - rconport="${unavailable}" + port=${zero} + queryport=${zero} + steamqueryport=${zero} + steammasterport=${zero} + rconport=${zero} rconenabled="${unavailable}" - queryport="${unavailable}" + rconpassword="${unavailable}" else maxplayers=$(grep "maxPlayers=" "${servercfgfullpath}" | sed 's/maxPlayers=//') servername=$(grep "name=" "${servercfgfullpath}" | sed 's/name=//') serverpassword=$(grep "password=" "${servercfgfullpath}" | sed 's/password=//') - port=$(grep "port=" "${servercfgfullpath}" | sed 's/port=//') queryport=$((port+3)) steamqueryport=$((port+20)) @@ -121,14 +125,18 @@ fn_info_game_av() { maxplayers=${maxplayers:-"NOT SET"} servername=${servername:-"NOT SET"} serverpassword=${serverpassword:-"NOT SET"} - rconpassword=${rconpassword:-"NOT SET"} - rconport=${rconport:-"0"} - rconenabled=${rconenabled:-"false"} + port=${zero} queryport=${queryport:-"0"} + steamqueryport=${steamqueryport:-"0"} + steammasterport=${steammasterport:-"0"} + rconport=${rconport:-"0"} + rconenabled=${rconenabled:-"NOT SET"} + rconpassword=${rconpassword:-"NOT SET"} fi } fn_info_game_bf1942(){ + # Config if [ ! -f "${servercfgfullpath}" ]; then servername="${unavailable}" serverpassword="${unavailable}" @@ -141,20 +149,20 @@ fn_info_game_bf1942(){ maxplayers=$(grep "game.serverMaxPlayers" "${servercfgfullpath}" | grep -v "\--" | tr -cd '[:digit:]') port=$(grep "game.serverPort" "${servercfgfullpath}" | grep -v "\--" | tr -cd '[:digit:]') queryport="22000" - 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" - # Not Set + # Not set servername=${servername:-"NOT SET"} serverpassword=${serverpassword:-"NOT SET"} maxplayers=${maxplayers:-"0"} port=${port:-"0"} + queryport=${queryport:-"0"} + configip=${configip:-"0.0.0.0"} fi } fn_info_game_bfv(){ + # Config if [ ! -f "${servercfgfullpath}" ]; then servername="${unavailable}" serverpassword="${unavailable}" @@ -167,20 +175,20 @@ fn_info_game_bfv(){ maxplayers=$(grep "game.serverMaxPlayers" "${servercfgfullpath}" | grep -v "\--" | tr -cd '[:digit:]') port=$(grep "game.serverPort" "${servercfgfullpath}" | grep -v "\--" | tr -cd '[:digit:]') queryport="23000" - 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" - # Not Set + # Not set servername=${servername:-"NOT SET"} serverpassword=${serverpassword:-"NOT SET"} maxplayers=${maxplayers:-"0"} port=${port:-"0"} + queryport=${queryport:-"0"} + configip=${configip:-"0.0.0.0"} fi } fn_info_game_bo(){ + # Config if [ ! -f "${servercfgfullpath}" ]; then servername="${unavailable}" serverpassword="${unavailable}" @@ -194,7 +202,7 @@ fn_info_game_bo(){ queryport=$((port+1)) maxplayers=$(grep "MaxPlayers=" "${servercfgfullpath}" | tr -cd '[:digit:]') - # Not Set + # Not set servername=${servername:-"NOT SET"} serverpassword=${serverpassword:-"NOT SET"} port=${port:-"0"} @@ -225,10 +233,6 @@ fn_info_game_bt(){ queryport=${queryport:-"0"} maxplayers=${maxplayers:-"0"} fi - - # Parameters - port=${port:-"0"} - queryport=${queryport:-"0"} } fn_info_game_bt1944(){ @@ -242,7 +246,7 @@ fn_info_game_bt1944(){ serverpassword=$(grep "Password" "${servercfgfullpath}" | grep -v "RCONPassword" | sed -e 's/^[ \t]*//g' -e '/^--/d' -e 's/Password//g' | tr -d '=\";,:' | sed -e 's/^[ \t]*//' -e 's/[ \t]*$//') gamemode=$(grep -m2 "PlayMode" "${servercfgfullpath}" | sed -e 's/^[ \t]*//g' -e '/^--/d' -e 's/PlayMode//g' | tr -d '=\";,:' | sed -e 's/^[ \t]*//' -e 's/[ \t]*$//') - # Not Set + # Not set servername=${servername:-"NOT SET"} serverpassword=${serverpassword:-"NOT SET"} gamemode=${gamemode:-"NOT SET"} @@ -250,24 +254,35 @@ fn_info_game_bt1944(){ # Parameters port=${port:-"0"} - rconport=$((port+2)) queryport=${queryport:-"0"} + rconport=$((port+2)) } fn_info_game_cmw(){ + # Config if [ ! -f "${servercfgfullpath}" ]; then + adminpassword="${unavailable}" + rconport=${zero} servername="${unavailable}" serverpassword="${unavailable}" - adminpassword="${unavailable}" - rconport="${unavailable}" + else - servername=$(grep -E "^ServerName" "${servercfgfullpath}" | sed 's/^ServerName=//') + adminpassword=$(grep -E "^adminpassword=" "${servercfgfullpath}" | tr -cd '[:digit:]') rconport=$(grep -E "^RConPort=" "${servercfgdir}/DefaultGame.ini" | tr -cd '[:digit:]') + servername=$(grep -E "^ServerName" "${servercfgfullpath}" | sed 's/^ServerName=//') + serverpassword=$(grep -E "^GamePassword" "${servercfgfullpath}" | sed 's/^ServerName=//') - # Not Set + # Not set + adminpassword=${adminpassword:-"NOT SET"} + rconport=${rconport:-"0"} servername=${servername:-"NOT SET"} - rconport=${port:-"0"} + serverpassword=${serverpassword:-"NOT SET"} fi + + # Parameters + defaultmap=${defaultmap:-"NOT SET"} + port=${port:-"0"} + queryport=${queryport:-"0"} } fn_info_game_cod(){ @@ -279,7 +294,7 @@ fn_info_game_cod(){ servername=$(grep "sv_hostname " "${servercfgfullpath}" | sed -e 's/^[ \t]*//g' -e '/^\//d' -e 's/set sv_hostname //g' | tr -d '=\";,:' | xargs) rconpassword=$(grep "rconpassword" "${servercfgfullpath}" | sed -e 's/^[ \t]*//g' -e '/^\//d' -e 's/set rconpassword //g' | tr -d '=\";,:' | sed -e 's/^[ \t]*//' -e 's/[ \t]*$//') - # Not Set + # Not set servername=${servername:-"NOT SET"} rconpassword=${rconpassword=:-"NOT SET"} fi @@ -288,10 +303,10 @@ fn_info_game_cod(){ defaultmap=${defaultmap:-"NOT SET"} maxplayers=${maxplayers:-"0"} port=${port:-"0"} - queryport=${port:-"0"} } -fn_info_game_cod2(){ +fn_info_game_coduo(){ + # Config if [ ! -f "${servercfgfullpath}" ]; then servername="${unavailable}" rconpassword="${unavailable}" @@ -299,13 +314,22 @@ fn_info_game_cod2(){ servername=$(grep "sv_hostname " "${servercfgfullpath}" | sed -e 's/^[ \t]*//g' -e '/^\//d' -e 's/set sv_hostname //g' | tr -d '=\";,:' | xargs) rconpassword=$(grep "rconpassword" "${servercfgfullpath}" | sed -e 's/^[ \t]*//g' -e '/^\//d' -e 's/set rconpassword //g' | tr -d '=\";,:' | sed -e 's/^[ \t]*//' -e 's/[ \t]*$//') - # Not Set + # Not set servername=${servername:-"NOT SET"} rconpassword=${rconpassword=:-"NOT SET"} fi + + # Parameters + defaultmap=${defaultmap:-"NOT SET"} + maxplayers=${maxplayers:-"0"} + port=${port:-"0"} + queryport=${port:-"28960"} } -fn_info_game_cod4(){ + + +fn_info_game_cod2(){ + # Config if [ ! -f "${servercfgfullpath}" ]; then servername="${unavailable}" rconpassword="${unavailable}" @@ -313,13 +337,43 @@ fn_info_game_cod4(){ servername=$(grep "sv_hostname " "${servercfgfullpath}" | sed -e 's/^[ \t]*//g' -e '/^\//d' -e 's/set sv_hostname //g' | tr -d '=\";,:' | xargs) rconpassword=$(grep "rconpassword" "${servercfgfullpath}" | sed -e 's/^[ \t]*//g' -e '/^\//d' -e 's/set rconpassword //g' | tr -d '=\";,:' | sed -e 's/^[ \t]*//' -e 's/[ \t]*$//') - # Not Set + # Not set + servername=${servername:-"NOT SET"} + rconpassword=${rconpassword=:-"NOT SET"} + fi + + # Parameters + defaultmap=${defaultmap:-"NOT SET"} + maxplayers=${maxplayers:-"0"} + port=${port:-"0"} + queryport=${port:-"28960"} +} + +fn_info_game_cod4(){ + # Config + if [ ! -f "${servercfgfullpath}" ]; then + servername="${unavailable}" + rconpassword="${unavailable}" + else + servername=$(sed -nr 's/^set\s*sv_hostname\s*"(.*)".*/\1/p' "${servercfgfullpath}") + rconpassword=$(sed -nr 's/^set\s*rcon_password\s*"(.*)"\s*\/.*/\1/p' "${servercfgfullpath}") + queryport=${port:-"28960"} + + # Not set servername=${servername:-"NOT SET"} rconpassword=${rconpassword=:-"NOT SET"} + queryport=${queryport:-"28960"} fi + + # Parameters + defaultmap=${defaultmap:-"NOT SET"} + maxplayers=${maxplayers:-"0"} + port=${port:-"0"} + queryport=${port:-"28960"} } fn_info_game_codwaw(){ + # Config if [ ! -f "${servercfgfullpath}" ]; then servername="${unavailable}" rconpassword="${unavailable}" @@ -327,44 +381,65 @@ fn_info_game_codwaw(){ servername=$(grep "sv_hostname " "${servercfgfullpath}" | sed -e 's/^[ \t]*//g' -e '/^\//d' -e 's/set sv_hostname //g' | tr -d '=\";,:' | xargs) rconpassword=$(grep "rconpassword" "${servercfgfullpath}" | sed -e 's/^[ \t]*//g' -e '/^\//d' -e 's/set rconpassword //g' | tr -d '=\";,:' | sed -e 's/^[ \t]*//' -e 's/[ \t]*$//') - # Not Set + # Not set servername=${servername:-"NOT SET"} rconpassword=${rconpassword=:-"NOT SET"} fi + + # Parameters + defaultmap=${defaultmap:-"NOT SET"} + maxplayers=${maxplayers:-"0"} + port=${port:-"0"} + queryport=${port:-"28960"} } fn_info_game_col(){ - if [ -f "${servercfgfullpath}" ]; then + # Config + if [ ! -f "${servercfgfullpath}" ]; then + servername="${unavailable}" + serverpassword="${unavailable}" + maxplayers="${unavailable}" + port="${zero}" + queryport="${zero}" + steamport="${zero}" + rconpassword="${unavailable}" + else servername=$(jq -r '.ServerSettings.ServerName' "${servercfgfullpath}") serverpassword=$(jq -r '.ServerSettings.ServerPassword' "${servercfgfullpath}") maxplayers=$(jq -r '.ServerSettings.MaxPlayerCount' "${servercfgfullpath}") port=$(jq -r '.ServerSettings.ServerGamePort' "${servercfgfullpath}") + queryport=${port:-"0"} 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 + # Not set servername=${servername:-"NOT SET"} serverpassword=${serverpassword:-"NOT SET"} maxplayers=${maxplayers:-"0"} port=${port:-"27004"} + queryport=${queryport:-"0"} steamport=${steamport:-"27005"} rconpassword=${rconpassword:-"NOT SET"} + configip=${configip:-"0.0.0.0"} fi } fn_info_game_dodr(){ + # Config if [ ! -f "${servercfgfullpath}" ]; then maxplayers="${zero}" else maxplayers=$(sed -nr 's/^iServerMaxPlayers=(.*)$/\1/p' "${servercfgfullpath}") - # Not Set + # Not set maxplayers=${maxplayers:-"NOT SET"} fi + + # Parameters + servername=${servername:-"NOT SET"} + port=${port:-"7777"} + queryport=${queryport:-"27015"} } fn_info_game_dst(){ @@ -383,18 +458,16 @@ fn_info_game_dst(){ gamemode=$(grep "game_mode" "${clustercfgfullpath}" | sed -e 's/^[ \t]*//g' -e '/^#/d' -e 's/game_mode//g' | tr -d '=\";,:' | sed -e 's/^[ \t]*//' -e 's/[ \t]*$//') tickrate=$(grep "tick_rate" "${clustercfgfullpath}" | grep -v "#" | tr -cd '[:digit:]') masterport=$(grep "master_port" "${clustercfgfullpath}" | grep -v "#" | tr -cd '[:digit:]') - 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" - # Not Set + # Not set servername=${servername:-"NOT SET"} serverpassword=${serverpassword:-"NOT SET"} maxplayers=${maxplayers:-"0"} gamemode=${gamemode:-"NOT SET"} tickrate=${tickrate:-"0"} masterport=${masterport:-"0"} + configip=${configip:-"0.0.0.0"} fi if [ ! -f "${servercfgfullpath}" ]; then @@ -406,7 +479,7 @@ fn_info_game_dst(){ steamauthport=$(grep "authentication_port" "${servercfgfullpath}" | grep -v "#" | tr -cd '[:digit:]') steammasterport=$(grep "master_server_port" "${servercfgfullpath}" | grep -v "#" | tr -cd '[:digit:]') - # Not Set + # Not set port=${port:-"0"} steamauthport=${steamauthport:-"0"} steammasterport=${steammasterport:-"0"} @@ -421,8 +494,8 @@ fn_info_game_dst(){ } fn_info_game_eco(){ + # Config if [ ! -f "${servercfgfullpath}" ]; then - configip="${unavailable}" servername="${unavailable}" serverpassword="${unavailable}" maxplayers="${zero}" @@ -438,17 +511,19 @@ fn_info_game_eco(){ port=$(jq -r '.GameServerPort' "${servercfgfullpath}") webadminport=$(jq -r '.WebServerPort' "${servercfgfullpath}") - # Not Set - configip=${configip:-"NOT SET"} + # Not set + configip=${configip:-"0.0.0.0"} servername=${servername:-"NOT SET"} serverpassword=${serverpassword:-"NOT SET"} maxplayers=${maxplayers=:-"0"} + tickrate=${tickrate=:-"0"} port=${port=:-"0"} webadminport=${webadminport=:-"0"} fi } fn_info_game_etl(){ + # Config if [ ! -f "${servercfgfullpath}" ]; then rconpassword="${unavailable}" servername="${unavailable}" @@ -463,18 +538,16 @@ fn_info_game_etl(){ servername=$(grep "set sv_hostname" "${servercfgfullpath}" | sed -e 's/^[ \t]*//g' -e '/^\//d' -e 's/set sv_hostname //g' | tr -d '=\";,:' | sed -e 's/^[ \t]*//' -e 's/[ \t]*$//') serverpassword=$(grep "set g_password" "${servercfgfullpath}" | sed -e 's/^[ \t]*//g' -e '/^\//d' -e 's/set g_password //g' | tr -d '=\";,:' | sed -e 's/^[ \t]*//' -e 's/[ \t]*$//') maxplayers=$(grep "set sv_maxclients" "${servercfgfullpath}" | grep -v "//" | tr -cd '[:digit:]') - 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" - # Not Set + # Not set rconpassword=${rconpassword:-"NOT SET"} servername=${servername:-"NOT SET"} serverpassword=${serverpassword:-"NOT SET"} maxplayers=${maxplayers:-"0"} port=${port:-"27960"} queryport=${queryport:-"27960"} + configip=${configip:-"0.0.0.0"} fi } @@ -484,7 +557,7 @@ fn_info_game_fctr(){ servername="Factorio Server" serverpassword="${unavailable}" maxplayers="${zero}" - authtoken=${authtoken:-"NOT SET"} + authtoken="${unavailable}" savegameinterval="${unavailable}" versioncount="${unavailable}" else @@ -495,7 +568,7 @@ fn_info_game_fctr(){ savegameinterval=$(jq -r '.autosave_interval' "${servercfgfullpath}") versioncount=$(jq -r '.autosave_slots' "${servercfgfullpath}") - # Not Set + # Not set servername=${servername:-"NOT SET"} serverpassword=${serverpassword:-"NOT SET"} maxplayers=${maxplayers:-"0"} @@ -511,8 +584,10 @@ fn_info_game_fctr(){ } fn_info_game_jc2(){ + # Config if [ ! -f "${servercfgfullpath}" ]; then servername="${unavailable}" + serverdescription="${unavailable}" serverpassword="${unavailable}" maxplayers="${zero}" port="${zero}" @@ -525,19 +600,20 @@ fn_info_game_jc2(){ port=$(grep "BindPort" "${servercfgfullpath}" | grep -v "\--" | tr -cd '[:digit:]') queryport="${port}" 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" - # Not Set + # Not set servername=${servername:-"NOT SET"} serverpassword=${serverpassword:-"NOT SET"} + serverdescription=${serverdescription:-"NOT SET"} maxplayers=${maxplayers:-"0"} port=${port:-"0"} queryport=${queryport:-"0"} + configip=${configip:-"0.0.0.0"} fi } fn_info_game_hw(){ + # Parameters servername=${servername:-"NOT SET"} port=${port:-"0"} queryport=${queryport:-"0"} @@ -559,6 +635,7 @@ fn_info_game_inss(){ } fn_info_game_jc3(){ + # Config if [ ! -f "${servercfgfullpath}" ]; then servername="${unavailable}" serverdescription="${unavailable}" @@ -579,12 +656,9 @@ fn_info_game_jc3(){ steamport=$(grep "\"steamPort\"" "${servercfgfullpath}" | tr -cd '[:digit:]') httpport=$(grep "\"httpPort\"" "${servercfgfullpath}" | tr -cd '[:digit:]') tickrate=$(grep "\"maxTickRate\"" "${servercfgfullpath}" | tr -cd '[:digit:]') - 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" - # Not Set + # Not set servername=${servername:-"NOT SET"} serverdescription=${serverdescription:-"NOT SET"} serverpassword=${serverpassword:-"NOT SET"} @@ -594,6 +668,7 @@ fn_info_game_jc3(){ steamport=${steamport=:-"0"} httpport=${httpport=:-"0"} tickrate=${tickrate=:-"0"} + configip=${configip:-"0.0.0.0"} fi } @@ -604,6 +679,7 @@ fn_info_game_jk2(){ servername="${unavailable}" serverpassword="${unavailable}" maxplayers="${zero}" + serverversion="${unavailable}" 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]*$//') @@ -611,18 +687,22 @@ fn_info_game_jk2(){ 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 + # Not set rconpassword=${rconpassword:-"NOT SET"} servername=${servername:-"NOT SET"} serverpassword=${serverpassword:-"NOT SET"} maxplayers=${maxplayers:-"0"} + serverversion=${serverversion:-"NOT SET"} fi # Parameters - queryport="${port:-"0"}" + port=${port:-"0"} + queryport=${port} + defaultmap=${defaultmap:-"NOT SET"} } fn_info_game_kf(){ + # Config if [ ! -f "${servercfgfullpath}" ]; then servername="${unavailable}" serverpassword="${unavailable}" @@ -652,7 +732,7 @@ fn_info_game_kf(){ webadminuser=$(sed -nr 's/^AdminName=(.*)$/\1/p' "${servercfgfullpath}" | tr -d '=\";,:' | sed 's/\r$//') webadminpass="${adminpassword}" - # Not Set + # Not set servername=${servername:-"NOT SET"} serverpassword=${serverpassword:-"NOT SET"} adminpassword=${adminpassword:-"NOT SET"} @@ -667,6 +747,9 @@ fn_info_game_kf(){ webadminuser=${webadminuser:-"NOT SET"} webadminpass=${webadminpass:-"NOT SET"} fi + + # Parameters + defaultmap=${defaultmap:-"NOT SET"} } fn_info_game_kf2(){ @@ -675,8 +758,8 @@ fn_info_game_kf2(){ servername="${unavailable}" serverpassword="${unavailable}" adminpassword="${unavailable}" - port="${unavailable}" - queryport="${unavailable}" + port=${zero} + queryport=${zero} webadminenabled="${unavailable}" httpport="${zero}" webadminuser="${unavailable}" @@ -691,7 +774,7 @@ fn_info_game_kf2(){ webadminuser="Admin" webadminpass=$(grep "AdminPassword" "${servercfgfullpath}" | sed -e 's/^[ \t]*//g' -e '/^#/d' -e 's/AdminPassword//g' | tr -d '=\";,:' | sed -e 's/^[ \t]*//' -e 's/[ \t]*$//') - # Not Set + # Not set servername=${servername:-"NOT SET"} serverpassword=${serverpassword:-"NOT SET"} adminpassword=${adminpassword:-"NOT SET"} @@ -708,6 +791,7 @@ fn_info_game_kf2(){ } fn_info_game_mc(){ + # Config if [ ! -f "${servercfgfullpath}" ]; then servername="${unavailable}" rconpassword="${unavailable}" @@ -726,17 +810,14 @@ fn_info_game_mc(){ port=$(grep "server-port" "${servercfgfullpath}" | grep -v "#" | tr -cd '[:digit:]') queryport=$(grep "query.port" "${servercfgfullpath}" | grep -v "#" | tr -cd '[:digit:]') if [ -z "${queryport}" ]; then - queryport=${port:-"0"} + 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]*$//') - 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" - # Not Set + # Not set servername=${servername:-"NOT SET"} rconpassword=${rconpassword:-"NOT SET"} rconport=${rconport:-"NOT SET"} @@ -746,10 +827,12 @@ fn_info_game_mc(){ queryenabled="${queryenabled:-"NOT SET"}" gamemode=${gamemode:-"NOT SET"} gameworld=${gameworld:-"NOT SET"} + configip=${configip:-"0.0.0.0"} fi } fn_info_game_mcb(){ + # Config if [ ! -f "${servercfgfullpath}" ]; then servername="${unavailable}" maxplayers="${zero}" @@ -763,11 +846,11 @@ fn_info_game_mcb(){ maxplayers=$(grep "max-players" "${servercfgfullpath}" | grep -v "#" | tr -cd '[:digit:]') port=$(grep "server-port\b" "${servercfgfullpath}" | grep -v "#" | tr -cd '[:digit:]') portipv6=$(grep "server-portv6\b" "${servercfgfullpath}" | sed 's/v6//g' | grep -v "#" | tr -cd '[:digit:]') - queryport=${port:-"0"} + 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 + # Not set servername=${servername:-"NOT SET"} maxplayers=${maxplayers:-"NOT SET"} port=${port:-"NOT SET"} @@ -817,7 +900,7 @@ fn_info_game_mohaa(){ 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 + # Not set rconpassword=${rconpassword:-"NOT SET"} servername=${servername:-"NOT SET"} serverpassword=${serverpassword:-"NOT SET"} @@ -843,7 +926,7 @@ fn_info_game_mom(){ maxplayers=$(grep "MaxPlayers" "${servercfgfullpath}" | sed -e 's/^ *//g' -e '/^--/d' -e 's/MaxPlayers//g' | tr -d '=\";,:' | sed -e 's/^[ \t]*//' -e 's/[ \t]*$//') defaultmap=$(grep "MapName" "${servercfgfullpath}" | sed -e 's/^ *//g' -e '/^--/d' -e 's/MapName//g' | tr -d '=\";,:' | sed -e 's/^[ \t]*//' -e 's/[ \t]*$//') - # Not Set + # Not set servername=${servername:-"NOT SET"} serverpassword=${serverpassword:-"NOT SET"} maxplayer=${maxplayers:-"NOT SET"} @@ -858,15 +941,16 @@ fn_info_game_mom(){ fn_info_game_mta(){ # Config if [ ! -f "${servercfgfullpath}" ]; then - configip="${zero}" - port="${unavailable}" - httpport="${unavailable}" + port=${zero} + queryport=${zero} + httpport=${zero} ase="${unavailable}" servername="${unavailable}" serverpassword="${unavailable}" maxplayers="${zero}" else port=$(grep -m 1 "serverport" "${servercfgfullpath}" | sed -e 's/^[ \t]*//g' -e '/^\//d' -e 's///g' | sed -e 's/^[ \t]*//' -e 's/[ \t]*$//' | cut -f1 -d "<" | tr -cd '[:digit:]') + queryport=$((port+123)) 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:]') 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 "<") @@ -877,12 +961,10 @@ fn_info_game_mta(){ else ase="Disabled" fi - # 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" - # Not Set + # Not set port=${port:-"22003"} + queryport=${queryport:-"2326"} httpport=${httpport:-"22005"} ase=${ase:-"Disabled"} servername=${servername:-"NOT SET"} @@ -890,11 +972,10 @@ fn_info_game_mta(){ maxplayers=${maxplayers:-"0"} fi - # Parameters - queryport=$((port+123)) } fn_info_game_mumble(){ + # Config if [ ! -f "${servercfgfullpath}" ]; then port="64738" queryport="${port}" @@ -902,19 +983,18 @@ fn_info_game_mumble(){ else 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}" - 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" - # Not Set + # Not set port=${port:-"64738"} queryport=${queryport:-"64738"} servername="Mumble Port ${port}" + configip=${configip:-"0.0.0.0"} fi } fn_info_game_onset(){ + # Config if [ ! -f "${servercfgfullpath}" ]; then servername="${unavailable}" maxplayers="${zero}" @@ -928,7 +1008,7 @@ fn_info_game_onset(){ httpport=$((port-2)) queryport=$((port-1)) - # Not Set + # Not set servername=${servername:-"NOT SET"} maxplayers=${maxplayers:-"NOT SET"} port=${port:-"NOT SET"} @@ -938,6 +1018,7 @@ fn_info_game_onset(){ } fn_info_game_pc(){ + # Config if [ ! -f "${servercfgfullpath}" ]; then servername="${unavailable}" serverpassword="${unavailable}" @@ -953,7 +1034,7 @@ fn_info_game_pc(){ queryport=$(grep "queryPort" "${servercfgfullpath}" | grep -v "//" | tr -cd '[:digit:]') steamport=$(grep "steamPort" "${servercfgfullpath}" | grep -v "//" | tr -cd '[:digit:]') - # Not Set + # Not set servername=${servername:-"NOT SET"} serverpassword=${serverpassword:-"NOT SET"} maxplayers=${maxplayers:-"NOT SET"} @@ -964,6 +1045,7 @@ fn_info_game_pc(){ } fn_info_game_pstbs(){ + # Config if [ ! -f "${servercfgfullpath}" ]; then servername="${unavailable}" maxplayers="${unavailable}" @@ -972,6 +1054,11 @@ fn_info_game_pstbs(){ 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:]') + + # Not set + servername=${servername:-"NOT SET"} + maxplayers=${maxplayers:-"0"} + reservedslots=${reservedslots:-"0"} fi if [ ! -f "${servercfgdir}/Rcon.cfg" ]; then @@ -980,16 +1067,21 @@ fn_info_game_pstbs(){ else rconport=$(grep "Port=" "${servercfgdir}/Rcon.cfg" | tr -cd '[:digit:]') rconpassword=$(grep "Password=" "${servercfgdir}/Rcon.cfg" | sed -e 's/^[ \t]*//g' -e '/^\//d' -e 's/Password//g' | tr -d '=\";,:' | sed -e 's/^[ \t]*//' -e 's/[ \t]*$//') + + # Not set + rconport=${rconport:-"0"} + if [ -z "${rconpassword}" ]||[ ${#rconpassword} == 1 ]; then + rconpassword="NOT SET" + fi fi + # Parameters + port=${port:-"0"} + queryport=${port:-"0"} rconport=${rconport:-"0"} - if [ -z "${rconpassword}" ]||[ ${#rconpassword} == 1 ]; then - rconpassword="NOT SET" - fi - servername=${servername:-"NOT SET"} - serverpassword=${serverpassword:-"NOT SET"} + randommap=${randommap:-"NOT SET"} maxplayers=${maxplayers:-"0"} - numreservedslots=${numreservedslots:-"0"} + reservedslots=${reservedslots:-"0"} } fn_info_game_pvr(){ @@ -1020,6 +1112,7 @@ fn_info_game_pz(){ rconpassword="${unavailable}" maxplayers="${zero}" port="${zero}" + queryport="${zero}" gameworld="${unavailable}" else servername=$(grep "PublicName" "${servercfgfullpath}" | sed -e 's/^[ \t]*//g' -e '/^#/d' -e 's/PublicName//g' | tr -d '=\";,:' | sed -e 's/^[ \t]*//' -e 's/[ \t]*$//') @@ -1027,20 +1120,22 @@ fn_info_game_pz(){ rconpassword=$(grep "RCONPassword" "${servercfgfullpath}" | sed -e 's/^[ \t]*//g' -e '/^#/d' -e 's/RCONPassword//g' | tr -d '=\";,:' | sed -e 's/^[ \t]*//' -e 's/[ \t]*$//') maxplayers=$(grep "MaxPlayers" "${servercfgfullpath}" | grep -v "#" | tr -cd '[:digit:]') port=$(grep "DefaultPort" "${servercfgfullpath}" | tr -cd '[:digit:]') + queryport=${port} gameworld=$(grep "Map" "${servercfgfullpath}" | sed -e 's/^[ \t]*//g' | grep "^Map" | sed -e '/^#/d' -e 's/Map//g' | tr -d '=\";' | sed -e 's/^[ \t]*//' -e 's/[ \t]*$//') - # Not Set + # Not set servername=${servername:-"NOT SET"} serverpassword=${serverpassword:-"NOT SET"} rconpassword=${rconpassword:-"NOT SET"} - maxplayers=${maxplayers:-"NOT SET"} - port=${port:-"NOT SET"} + maxplayers=${maxplayers:-"0"} + port=${port:-"0"} + queryport=${queryport:-"0"} gameworld=${gameworld:-"NOT SET"} fi # Parameters adminpassword=${adminpassword:-"NOT SET"} - queryport=${port:-"0"} + } fn_info_game_q2(){ @@ -1048,14 +1143,13 @@ fn_info_game_q2(){ if [ ! -f "${servercfgfullpath}" ]; then rconpassword="${unavailable}" servername="${unavailable}" - serverpassword="${unavailable}" maxplayers="${zero}" else rconpassword=$(grep "rcon_password" "${servercfgfullpath}" | sed -e 's/^[ \t]*//g' -e '/^\//d' -e 's/set rcon_password//g' | tr -d '=\";,:' | sed -e 's/^[ \t]*//' -e 's/[ \t]*$//') servername=$(grep "hostname" "${servercfgfullpath}" | sed -e 's/^[ \t]*//g' -e '/^\//d' -e 's/set hostname//g' | tr -d '=\";,:' | sed -e 's/^[ \t]*//' -e 's/[ \t]*$//') maxplayers=$(grep "maxclients" "${servercfgfullpath}" | grep -v "#" | tr -cd '[:digit:]') - # Not Set + # Not set rconpassword=${rconpassword:-"NOT SET"} servername=${servername:-"NOT SET"} maxplayers=${maxplayers:-"0"} @@ -1063,11 +1157,12 @@ fn_info_game_q2(){ # Parameters port=${port:-"0"} - queryport=${port:-"0"} + queryport=${port} defaultmap=${defaultmap:-"NOT SET"} } fn_info_game_q3(){ + # Config if [ ! -f "${servercfgfullpath}" ]; then rconpassword="${unavailable}" servername="${unavailable}" @@ -1079,15 +1174,21 @@ fn_info_game_q3(){ serverpassword=$(grep "rconpassword" "${servercfgfullpath}" | sed -e 's/^[ \t]*//g' -e '/^\//d' -e 's/set rconpassword//g' | tr -d '=\";,:' | sed -e 's/^[ \t]*//' -e 's/[ \t]*$//') maxplayers=$(grep "sv_maxclients" "${servercfgfullpath}" | grep -v "#" | tr -cd '[:digit:]') - # Not Set + # Not set rconpassword=${rconpassword:-"NOT SET"} servername=${servername:-"NOT SET"} serverpassword=${serverpassword:-"NOT SET"} maxplayers=${maxplayers:-"0"} fi + + # Parameters + port=${port:-"0"} + queryport=${port} + defaultmap=${defaultmap:-"NOT SET"} } fn_info_game_ql(){ + # Config if [ ! -f "${servercfgfullpath}" ]; then rconpassword="${unavailable}" servername="${unavailable}" @@ -1103,15 +1204,12 @@ fn_info_game_ql(){ serverpassword=$(grep "g_password" "${servercfgfullpath}" | sed -e 's/^[ \t]*//g' -e '/^\//d' -e 's/set g_password//g' | tr -d '=\";,:' | sed -e 's/^[ \t]*//' -e 's/[ \t]*$//') maxplayers=$(grep "sv_maxClients" "${servercfgfullpath}" | grep -v "//" | tr -cd '[:digit:]') port=$(grep "net_port" "${servercfgfullpath}" | grep -v "//" | tr -cd '[:digit:]') - queryport="${port}" + queryport=${port} rconport=$(grep "zmq_rcon_port" "${servercfgfullpath}" | grep -v "//" | tr -cd '[:digit:]') statsport=$(grep "zmq_stats_port" "${servercfgfullpath}" | grep -v "//" | tr -cd '[:digit:]') - 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" - # Not Set + # Not set rconpassword=${rconpassword:-"NOT SET"} servername=${servername:-"NOT SET"} serverpassword=${serverpassword:-"NOT SET"} @@ -1120,6 +1218,7 @@ fn_info_game_ql(){ queryport=${queryport:-"0"} rconport=${rconport:-"0"} statsport=${statsport:-"0"} + configip=${configip:-"0.0.0.0"} fi } @@ -1136,7 +1235,7 @@ fn_info_game_qw(){ 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 + # Not set rconpassword=${rconpassword:-"NOT SET"} servername=${servername:-"NOT SET"} maxplayers=${maxplayers:-"0"} @@ -1144,10 +1243,11 @@ fn_info_game_qw(){ # Parameters port=${port:-"0"} - queryport=${port:-"0"} + queryport=${port} } fn_info_game_ro(){ + # Config if [ ! -f "${servercfgfullpath}" ]; then servername="${unavailable}" serverpassword="${unavailable}" @@ -1175,7 +1275,7 @@ fn_info_game_ro(){ webadminuser=$(sed -nr 's/^AdminName=(.*)$/\1/p' "${servercfgfullpath}" | tr -d '=\";,:' | sed 's/\r$//') webadminpass="${adminpassword}" - # Not Set + # Not set servername=${servername:-"NOT SET"} serverpassword=${serverpassword:-"NOT SET"} adminpassword=${adminpassword:-"NOT SET"} @@ -1189,6 +1289,9 @@ fn_info_game_ro(){ webadminuser=${webadminuser:-"NOT SET"} webadminpass=${webadminpass:-"NOT SET"} fi + + # Parameters + defaultmap=${defaultmap:-"NOT SET"} } fn_info_game_rtcw(){ @@ -1204,7 +1307,7 @@ fn_info_game_rtcw(){ 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 + # Not set rconpassword=${rconpassword:-"NOT SET"} servername=${servername:-"NOT SET"} serverpassword=${serverpassword:-"NOT SET"} @@ -1231,13 +1334,17 @@ fn_info_game_rust(){ tickrate=${tickrate:-"0"} saveinterval=${saveinterval:-"0"} serverlevel=${serverlevel:-"NOT SET"} + customlevelurl=${customlevelurl:-"NOT SET"} worldsize=${worldsize:-"0"} + seed=${seed:-"0"} + salt=${salt:-"0"} } fn_info_game_rw(){ # Config if [ ! -f "${servercfgfullpath}" ]; then servername="${unavailable}" + serverpassword="${unavailable}" rconpassword="${unavailable}" rconport="${zero}" maxplayers="${zero}" @@ -1259,34 +1366,33 @@ fn_info_game_rw(){ port3=$((port+2)) port4=$((port+3)) queryport="${port}" + httpqueryport=$((port-1)) gamemode=$(grep "settings_default_gamemode=" "${servercfgfullpath}" | sed -e 's/^[ \t]*//g' -e '/^#/d' -e 's/settings_default_gamemode//g' | tr -d '=\";,:' | sed -e 's/^[ \t]*//' -e 's/[ \t]*$//') 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]*$//') 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" - # Not Set + # Not set servername=${servername:-"NOT SET"} + serverpassword=${serverpassword:-"NOT SET"} rconpassword=${rconpassword:-"NOT SET"} rconport=${rconport:-"NOT SET"} maxplayers=${maxplayers:-"NOT SET"} - port=${port:-"NOT SET"} + port=${port:-"0"} + port2=${port2:-"0"} + port3=${port3:-"0"} + port4=${port4:-"0"} + queryport=${queryport:-"0"} + httpqueryport=${httpport:-"0"} gamemode=${gamemode:-"NOT SET"} gameworld=${gameworld:-"NOT SET"} + configip=${configip:-"0.0.0.0"} fi - - # Parameters - servername=${servername:-"NOT SET"} - port=${port:-"0"} - httpqueryport=$((port-1)) } fn_info_game_samp(){ # Config if [ ! -f "${servercfgfullpath}" ]; then servername="unnamed server" - serverpassword="${unavailable}" rconpassword="${unavailable}" port="7777" rconport="${port}" @@ -1295,22 +1401,22 @@ fn_info_game_samp(){ servername=$(grep "hostname" "${servercfgfullpath}" | sed -e 's/^[ \t]*//g' -e '/^\//d' -e 's/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/^rcon_password//g' | tr -d '=\";,:' | sed -e 's/^[ \t]*//' -e 's/[ \t]*$//') port=$(grep "port" "${servercfgfullpath}" | grep -v "#" | tr -cd '[:digit:]') - rconport="${port}" + queryport=${port} + rconport=${port} maxplayers=$(grep "maxplayers" "${servercfgfullpath}" | grep -v "#" | tr -cd '[:digit:]') - # Not Set + # Not set servername=${servername:-"NOT SET"} rconpassword=${rconpassword:-"NOT SET"} port=${port:-"7777"} - rconport="${port}" + queryport=${port:-"7777"} + rconport=${rconport:-"7777"} maxplayers=${maxplayers:-"12"} fi - - # Parameters - queryport=${port:-"0"} } fn_info_game_sb(){ + # Config if [ ! -f "${servercfgfullpath}" ]; then servername="${unavailable}" queryenabled="${unavailable}" @@ -1330,7 +1436,7 @@ fn_info_game_sb(){ rconport=$(grep "rconServerPort" "${servercfgfullpath}" | tr -cd '[:digit:]') maxplayers=$(grep "maxPlayers" "${servercfgfullpath}" | tr -cd '[:digit:]') - # Not Set + # Not set servername=${servername:-"NOT SET"} queryenabled=${queryenabled:-"NOT SET"} rconenabled=${rconenabled:-"NOT SET"} @@ -1351,9 +1457,8 @@ fn_info_game_sbots(){ 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:]') - # Not Set + # Not set servername=${servername:-"NOT SET"} - serverpassword=${serverpassword:-"NOT SET"} maxplayers=${maxplayers:-"0"} fi @@ -1374,10 +1479,6 @@ fn_info_game_scpsl(){ 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"} @@ -1387,10 +1488,12 @@ fn_info_game_scpsl(){ fi # Parameters - queryport="${port:-"0"}" + port=${port:-"0"} + queryport=${port} } fn_info_game_sdtd(){ + # Config if [ ! -f "${servercfgfullpath}" ]; then servername="${unavailable}" serverpassword="${unavailable}" @@ -1428,7 +1531,7 @@ fn_info_game_sdtd(){ gamemode=$(grep "GameMode" "${servercfgfullpath}" | sed 's/^.*value="//' | cut -f1 -d"\"") gameworld=$(grep "GameWorld" "${servercfgfullpath}" | sed 's/^.*value="//' | cut -f1 -d"\"") - # Not Set + # Not set servername=${servername:-"NOT SET"} serverpassword=${serverpassword:-"NOT SET"} port=${port:-"0"} @@ -1458,7 +1561,7 @@ fn_info_game_sof2(){ 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 + # Not set rconpassword=${rconpassword:-"NOT SET"} servername=${servername:-"NOT SET"} serverpassword=${serverpassword:-"NOT SET"} @@ -1467,11 +1570,12 @@ fn_info_game_sof2(){ # Parameters port=${port:-"0"} - queryport=${port:-"0"} + queryport=${port} defaultmap=${defaultmap:-"NOT SET"} } fn_info_game_sol(){ + # Config if [ ! -f "${servercfgfullpath}" ]; then adminpassword="${unavailable}" maxplayers="${unavailable}" @@ -1509,7 +1613,7 @@ fn_info_game_source(){ serverpassword=$(grep "sv_password" "${servercfgfullpath}" | sed -e 's/^[ \t]*//g' -e '/^\//d' -e 's/sv_password//g' | tr -d '=\";,:' | sed -e 's/^[ \t]*//' -e 's/[ \t]*$//') rconpassword=$(grep "rcon_password" "${servercfgfullpath}" | sed -e 's/^[ \t]*//g' -e '/^\//d' -e 's/rcon_password//g' | tr -d '=\";,:' | sed -e 's/^[ \t]*//' -e 's/[ \t]*$//') - # Not Set + # Not set servername=${servername:-"NOT SET"} serverpassword=${serverpassword:-"NOT SET"} rconpassword=${rconpassword:-"NOT SET"} @@ -1544,12 +1648,16 @@ fn_info_game_spark(){ } fn_info_game_squad(){ + # Config if [ ! -f "${servercfgfullpath}" ]; then 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=${servername:-"NOT SET"} + maxplayers=${maxplayers:-"0"} fi if [ ! -f "${servercfgdir}/Rcon.cfg" ]; then @@ -1558,15 +1666,17 @@ fn_info_game_squad(){ else rconport=$(grep "Port=" "${servercfgdir}/Rcon.cfg" | tr -cd '[:digit:]') rconpassword=$(grep "Password=" "${servercfgdir}/Rcon.cfg" | sed -e 's/^[ \t]*//g' -e '/^\//d' -e 's/Password//g' | tr -d '=\";,:' | sed -e 's/^[ \t]*//' -e 's/[ \t]*$//') - fi - rconport=${rconport:-"0"} - if [ -z "${rconpassword}" ]||[ ${#rconpassword} == 1 ]; then - rconpassword="NOT SET" + rconport=${rconport:-"0"} + if [ -z "${rconpassword}" ]||[ ${#rconpassword} == 1 ]; then + rconpassword="NOT SET" + fi + fi - servername=${servername:-"NOT SET"} - serverpassword=${serverpassword:-"NOT SET"} - maxplayers=${maxplayers:-"0"} + + # Parameters + port=${port:-"0"} + queryport=${port:-"0"} } fn_info_game_st(){ @@ -1582,7 +1692,7 @@ fn_info_game_st(){ rconpassword=$(grep "RCONPASSWORD" "${servercfgfullpath}" | sed -e 's/^[ \t]*//g' -e '/^\//d' -e 's/RCONPASSWORD//g' | tr -d '=\";,:' | sed -e 's/^[ \t]*//' -e 's/[ \t]*$//') maxplayers=$(grep "MAXPLAYER" "${servercfgfullpath}" | sed -e 's/^[ \t]*//g' -e '/^\//d' -e 's/MAXPLAYER//g' | tr -d '=\";,:' | sed -e 's/^[ \t]*//' -e 's/[ \t]*$//') - # Not Set + # Not set servername=${servername:-"NOT SET"} serverpassword=${serverpassword:-"NOT SET"} rconpassword=${rconpassword:-"NOT SET"} @@ -1598,7 +1708,9 @@ fn_info_game_st(){ clearinterval=${clearinterval:-"0"} worldname=${worldname:-"NOT SET"} } + fn_info_game_terraria(){ + # Config if [ ! -f "${servercfgfullpath}" ]; then servername="${unavailable}" port="${zero}" @@ -1612,7 +1724,7 @@ fn_info_game_terraria(){ 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 + # Not set servername=${servername:-"NOT SET"} port=${port:-"0"} queryport=${queryport:-"0"} @@ -1622,6 +1734,7 @@ fn_info_game_terraria(){ } fn_info_game_stn(){ + # Config if [ -f "${servercfgfullpath}" ]; then servername=$(sed -nr 's/^ServerName="(.*)"/\1/p' "${servercfgfullpath}") configip=$(sed -nr 's/^ServerIP=([0-9]+)/\1/p' "${servercfgfullpath}") @@ -1638,6 +1751,7 @@ fn_info_game_stn(){ } fn_info_game_ts3(){ + # Config if [ ! -f "${servercfgfullpath}" ]; then dbplugin="${unavailable}" port="9987" @@ -1656,12 +1770,9 @@ fn_info_game_ts3(){ queryhttpsport=$(grep "query_https_port" "${servercfgfullpath}" | grep -v "#" | tr -cd '[:digit:]') fileport=$(grep "filetransfer_port" "${servercfgfullpath}" | grep -v "#" | tr -cd '[:digit:]') telnetport="${queryport}" - 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" - # Not Set + # Not set dbplugin=${dbplugin:-"NOT SET"} port=${port:-"9987"} queryport=${queryport:-"10011"} @@ -1670,6 +1781,7 @@ fn_info_game_ts3(){ queryhttpsport=${queryhttpsport:-"10443"} fileport=${fileport:-"30033"} telnetport=${telnetport:-"10011"} + configip=${configip:-"0.0.0.0"} fi } @@ -1682,7 +1794,7 @@ fn_info_game_tu(){ servername=$(grep "ServerTitle" "${servercfgfullpath}" | sed -e 's/^[ \t]*//g' -e '/^--/d' -e 's/ServerTitle//g' | tr -d '=\";,:' | sed -e 's/^[ \t]*//' -e 's/[ \t]*$//') maxplayers=$(grep "MaxPlayers" "${servercfgfullpath}" | grep -v "#" | tr -cd '[:digit:]') - # Not Set + # Not set servername=${servername:-"NOT SET"} maxplayers=${maxplayers:-"0"} fi @@ -1710,7 +1822,7 @@ fn_info_game_tw(){ queryport="${port}" maxplayers=$(grep "sv_max_clients" "${servercfgfullpath}" | grep -v "#" | tr -cd '[:digit:]') - # Not Set + # Not set servername=${servername:-"NOT SET"} serverpassword=${serverpassword:-"NOT SET"} rconpassword=${rconpassword:-"NOT SET"} @@ -1718,12 +1830,9 @@ fn_info_game_tw(){ queryport=${port:-"8303"} maxplayers=${maxplayers:-"12"} fi - - # Parameters - queryport="${port:-"0"}" } -fn_info_game_unreal(){ +fn_info_game_ut99(){ # Config if [ ! -f "${servercfgfullpath}" ]; then servername="${unavailable}" @@ -1749,7 +1858,7 @@ fn_info_game_unreal(){ 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 + # Not set servername=${servername:-"NOT SET"} serverpassword=${serverpassword:-"NOT SET"} adminpassword=${adminpassword:-"NOT SET"} @@ -1792,7 +1901,7 @@ fn_info_game_unreal2(){ webadminuser=$(sed -nr 's/^AdminName=(.*)$/\1/p' "${servercfgfullpath}" | tr -d '=\";,:' | sed 's/\r$//') webadminpass="${adminpassword}" - # Not Set + # Not set servername=${servername:-"NOT SET"} serverpassword=${serverpassword:-"NOT SET"} adminpassword=${adminpassword:-"NOT SET"} @@ -1810,6 +1919,7 @@ fn_info_game_unreal2(){ } fn_info_game_unt(){ + # Parameters servername=${selfname:-"NOT SET"} port=${port:-"0"} queryport=$((port+1)) @@ -1831,7 +1941,8 @@ fn_info_game_ut(){ queryport=$((port+1)) } -fn_info_game_ut2k4(){ +fn_info_game_unreal2k4(){ + # Config if [ ! -f "${servercfgfullpath}" ]; then servername="${unavailable}" serverpassword="${unavailable}" @@ -1857,7 +1968,7 @@ fn_info_game_ut2k4(){ webadminuser=$(sed -nr 's/^AdminName=(.*)$/\1/p' "${servercfgfullpath}" | tr -d '=\";,:' | sed 's/\r$//') webadminpass="${adminpassword}" - # Not Set + # Not set servername=${servername:-"NOT SET"} serverpassword=${serverpassword:-"NOT SET"} adminpassword=${adminpassword:-"NOT SET"} @@ -1893,7 +2004,7 @@ fn_info_game_ut3(){ webadminuser="Admin" webadminpass=$(grep "AdminPassword" "${servercfgfullpath}" | sed -e 's/^[ \t]*//g' -e '/^#/d' -e 's/AdminPassword//g' | tr -d '=\";,:' | sed -e 's/^[ \t]*//' -e 's/[ \t]*$//') - # Not Set + # Not set servername=${servername:-"NOT SET"} serverpassword=${serverpassword:-"NOT SET"} adminpassword=${adminpassword:-"NOT SET"} @@ -1911,7 +2022,9 @@ fn_info_game_ut3(){ } fn_info_game_vh(){ + # Parameters port=${port:-"0"} + # Query port only enabled if public server if [ "${public}" != "0" ]; then queryport=$((port+1)) else @@ -1923,6 +2036,7 @@ fn_info_game_vh(){ } fn_info_game_wet(){ + # Config if [ ! -f "${servercfgfullpath}" ]; then rconpassword="${unavailable}" servername="${unavailable}" @@ -1937,18 +2051,16 @@ fn_info_game_wet(){ servername=$(grep "set sv_hostname" "${servercfgfullpath}" | sed -e 's/^[ \t]*//g' -e '/^\//d' -e 's/set sv_hostname //g' | tr -d '=\";,:' | sed -e 's/^[ \t]*//' -e 's/[ \t]*$//') serverpassword=$(grep "set g_password" "${servercfgfullpath}" | sed -e 's/^[ \t]*//g' -e '/^\//d' -e 's/set g_password //g' | tr -d '=\";,:' | sed -e 's/^[ \t]*//' -e 's/[ \t]*$//') maxplayers=$(grep "set sv_maxclients" "${servercfgfullpath}" | grep -v "//" | tr -cd '[:digit:]') - 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" - # Not Set + # Not set rconpassword=${rconpassword:-"NOT SET"} servername=${servername:-"NOT SET"} serverpassword=${serverpassword:-"NOT SET"} maxplayers=${maxplayers:-"0"} port=${port:-"27960"} queryport=${queryport:-"27960"} + configip=${configip:-"0.0.0.0"} fi } @@ -1963,7 +2075,7 @@ fn_info_game_wf(){ 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 + # Not set rconpassword=${rconpassword:-"NOT SET"} servername=${servername:-"NOT SET"} maxplayers=${maxplayers:-"0"} @@ -1977,28 +2089,35 @@ fn_info_game_wf(){ fn_info_game_wmc(){ - if [ -f "${servercfgfullpath}" ]; then + if [ ! -f "${servercfgfullpath}" ]; then + servername="${unavailable}" + maxplayers="${zero}" + port="${zero}" + queryport="${zero}" + queryenabled="${unavailable}" + else servername=$(sed -e '/^listeners:/,/^[a-z]/!d' "${servercfgfullpath}" | sed -nr 's/^[ ]+motd: (.*)$/\1/p' | tr -d "'" | sed 's/&1//') queryport=$(sed -nr 's/^[ -]+query_port: ([0-9]+)/\1/p' "${servercfgfullpath}") queryenabled=$(sed -nr 's/^[ ]+query_enabled: (.*)$/\1/p' "${servercfgfullpath}") port=$(sed -nr 's/^[ ]+host: [0-9]+\.[0-9]+\.[0-9]+\.[0-9]+:([0-9]+)/\1/p' "${servercfgfullpath}") - # the normal max_players does only show in on the client side and has no effect how many players can connect + # the normal max_players does only show in on the client side and has no effect how many players can connect. maxplayers=$(sed -nr 's/^player_limit: ([-]*[0-9])/\1/p' "${servercfgfullpath}") configip=$(sed -nr 's/^[ ]+host: ([0-9]+\.[0-9]+\.[0-9]+\.[0-9]+):[0-9]+/\1/p' "${servercfgfullpath}") if [ "${maxplayers}" == "-1" ]||[ "${maxplayers}" == "0" ]; then maxplayers="UNLIMITED" fi - else - servername="${unavailable}" - maxplayers="${zero}" - port="${zero}" - queryport="${zero}" - queryenabled="${unavailable}" + + # Not set + servername=${servername:-"NOT SET"} + queryport=${rconpassword:-"NOT SET"} + maxplayers=${maxplayers:-"0"} + configip=${configip:-"0.0.0.0"} fi } fn_info_game_wurm(){ + # Config if [ ! -f "${servercfgfullpath}" ]; then port="${zero}" queryport="${zero}" @@ -2008,19 +2127,15 @@ fn_info_game_wurm(){ adminpassword="${unavailable}" maxplayers="${zero}" else - port=$(grep "EXTERNALPORT=" "${servercfgfullpath}" | grep -v "#" | tr -cd '[:digit:]') queryport=$(grep "QUERYPORT=" "${servercfgfullpath}" | grep -v "#" | tr -cd '[:digit:]') servername=$(grep "SERVERNAME=" "${servercfgfullpath}" | sed -e 's/^[ \t]*//g' -e '/^\//d' -e 's/SERVERNAME//g' | tr -d '=\";,:' | sed -e 's/^[ \t]*//' -e 's/[ \t]*$//') serverpassword=$(grep "SERVERPASSWORD=" "${servercfgfullpath}" | sed -e 's/^[ \t]*//g' -e '/^\//d' -e 's/SERVERPASSWORD//g' | tr -d '=\";,:' | sed -e 's/^[ \t]*//' -e 's/[ \t]*$//') 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:]') - 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" - # Not Set + # Not set port=${port:-"3724"} queryport=${queryport:-"27017"} servername=${servername:-"NOT SET"} @@ -2053,7 +2168,9 @@ elif [ "${shortname}" == "bt1944" ]; then fn_info_game_bt1944 elif [ "${shortname}" == "cmw" ]; then fn_info_game_cmw -elif [ "${shortname}" == "cod" ]||[ "${shortname}" == "coduo" ]; then +elif [ "${shortname}" == "cod" ]; then + fn_info_game_cod +elif [ "${shortname}" == "coduo" ]; then fn_info_game_cod elif [ "${shortname}" == "cod2" ]; then fn_info_game_cod2 @@ -2160,9 +2277,11 @@ elif [ "${shortname}" == "unt" ]; then elif [ "${shortname}" == "ut" ]; then fn_info_game_ut elif [ "${shortname}" == "ut2k4" ]; then - fn_info_game_ut2k4 + fn_info_game_unreal2k4 elif [ "${shortname}" == "ut3" ]; then fn_info_game_ut3 +elif [ "${shortname}" == "ut99" ]; then + fn_info_game_ut99 elif [ "${shortname}" == "vh" ]; then fn_info_game_vh elif [ "${shortname}" == "vints" ]; then @@ -2177,8 +2296,6 @@ elif [ "${shortname}" == "wurm" ]; then fn_info_game_wurm elif [ "${engine}" == "source" ]||[ "${engine}" == "goldsrc" ]; then fn_info_game_source -elif [ "${engine}" == "unreal" ]; then - fn_info_game_unreal elif [ "${engine}" == "unreal2" ]; then fn_info_game_unreal2 fi diff --git a/lgsm/functions/info_messages.sh b/lgsm/functions/info_messages.sh old mode 100755 new mode 100644 index eb1724560..9a143f8e7 --- a/lgsm/functions/info_messages.sh +++ b/lgsm/functions/info_messages.sh @@ -339,6 +339,11 @@ fn_info_message_gameserver(){ fi fi + # Reverved Slots + if [ -n "${statspassword}" ]; then + echo -e "${lightblue}Reserved Slots:\t${default}${reservedslots}" + fi + # Bots if [ -n "${gdbots}" ]; then echo -e "${lightblue}Bots:\t${default}${gdbots}" From b94c451d79f5f92cb3e4e11c3ac8c0fea0693f1a Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Wed, 22 Sep 2021 22:15:42 +0100 Subject: [PATCH 050/164] Revert "add lastoasis" This reverts commit 45de90e000bffc7e78f46c7863b2055705d0f5e6. --- .../config-lgsm/loserver/_default.cfg | 188 ------------------ lgsm/data/serverlist.csv | 1 - 2 files changed, 189 deletions(-) delete mode 100644 lgsm/config-default/config-lgsm/loserver/_default.cfg diff --git a/lgsm/config-default/config-lgsm/loserver/_default.cfg b/lgsm/config-default/config-lgsm/loserver/_default.cfg deleted file mode 100644 index 313e50a49..000000000 --- a/lgsm/config-default/config-lgsm/loserver/_default.cfg +++ /dev/null @@ -1,188 +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 #### - -## SteamCMD Login | https://docs.linuxgsm.com/steamcmd#steamcmd-login -steamuser="username" -steampass='password' - -## Predefined Parameters | https://docs.linuxgsm.com/configuration/start-parameters -servername="LinuxGSM" -ip="0.0.0.0" -port="7777" -queryport="27015" -customerkey="" -providerkey="" -slots="100" - -## Server Parameters | https://docs.linuxgsm.com/configuration/start-parameters#additional-parameters -startparameters="-log -force_steamclient_link -messaging -NoLiveServer -EnableCheats -backendapiurloverride='backend.last-oasis.com' -identifier=${servername} -port=${port} -CustomerKey=${customerkey} -ProviderKey=${providerkey} -slots=${slots} -QueryPort=${queryport} -OverrideConnectionAddress=${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) - -# 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". -telegramapi="api.telegram.org" -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="920720" -steamcmdforcewindows="no" -# 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="1" -querytype="" - -## Console type -consoleverbose="yes" -consoleinteract="no" - -## Game Server Details -# Do not edit -gamename="Last Oasis" -engine="unreal4" -glibc="2.17" - -#### Directories #### -# Edit with care - -## Game Server Directories -systemdir="${serverfiles}/Mist" -executabledir="${systemdir}/Binaries/Linux" -executable="./MistServer-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}/${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" \ No newline at end of file diff --git a/lgsm/data/serverlist.csv b/lgsm/data/serverlist.csv index 4bad355a6..e5e290efc 100644 --- a/lgsm/data/serverlist.csv +++ b/lgsm/data/serverlist.csv @@ -52,7 +52,6 @@ jc3,jc3server,Just Cause 3 jk2,jk2server,Jedi Knight II: Jedi Outcast kf,kfserver,Killing Floor kf2,kf2server,Killing Floor 2 -lo,loserver,Last Oasis l4d,l4dserver,Left 4 Dead l4d2,l4d2server,Left 4 Dead 2 mc,mcserver,Minecraft From 0ed9783a13e0f7f780267d8e1bc79b7ebaa19133 Mon Sep 17 00:00:00 2001 From: KillahInstinct1 Date: Thu, 23 Sep 2021 23:49:44 +0200 Subject: [PATCH 051/164] feat(mods): Added Dhooks, Movement API and Cleaner for GOKZ (#3511) Co-authored-by: Daniel Gibbs --- lgsm/functions/mods_list.sh | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/lgsm/functions/mods_list.sh b/lgsm/functions/mods_list.sh index 35a302fc0..382ed8c1f 100755 --- a/lgsm/functions/mods_list.sh +++ b/lgsm/functions/mods_list.sh @@ -139,6 +139,9 @@ mod_info_gokz=( MOD "gokz" "GOKZ" "https://bitbucket.org/kztimerglobalteam/gokz/ 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" ) +mod_info_dhook=( MOD "dhook" "dhook" "https://forums.alliedmods.net/attachment.php?attachmentid=190123&d=1625050030" "dhooks-2.2.0d17.zip" "0" "LowercaseOff" "${systemdir}" "cfg;addons/sourcemod/configs;" "ENGINES" "Counter-Strike: Global Offensive;" "NOTGAMES" "https://forums.alliedmods.net/showpost.php?p=2588686&postcount=589" "DHooks 2.2.0 - Required for GOKZ" ) +mod_info_movement=( MOD "movementapi" "movementapi" "https://github.com/danzayau/MovementAPI/releases/download/2.1.0/MovementAPI-v2.1.0.zip" "MovementAPI-v2.1.0.zip" "0" "LowercaseOff" "${systemdir}" "cfg;addons/sourcemod/configs;" "ENGINES" "Counter-Strike: Global Offensive;" "NOTGAMES" "https://github.com/danzayau/MovementAPI" "Movement API 2.1.0 - Required for GOKZ" ) +mod_info_cleaner=( MOD "cleaner" "cleaner" "https://github.com/e54385991/console-cleaner/archive/refs/heads/master.zip" "console-cleaner.zip" "0" "LowercaseOff" "${systemdir}" "cfg;addons/sourcemod/configs;" "ENGINES" "Counter-Strike: Global Offensive;" "NOTGAMES" "https://github.com/e54385991/console-cleaner" "Console Cleaner - Optional for GOKZ" ) # 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" ) @@ -176,4 +179,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[@]}" "${mod_info_advduplicator[@]}" "${mod_info_trackassemblytool[@]}" "${mod_info_physpropertiesadv[@]}" "${mod_info_controlsystemse2[@]}" "${mod_info_e2pistontiming[@]}" "${mod_info_propcannontool[@]}" "${mod_info_gearassemblytool[@]}" "${mod_info_spinnertool[@]}" "${mod_info_surfacefrictiontool[@]}" "${mod_info_magneticdipole[@]}" "${mod_info_environmentorganizer[@]}" "${mod_info_precision_alignment[@]}" "${mod_info_improved_stacker[@]}" "${mod_info_improved_weight[@]}" "${mod_info_improved_antinoclip[@]}" "${mod_info_laserstool[@]}" ) +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_dhook[@]}" "${mod_info_movement[@]}" "${mod_info_cleaner[@]}" "${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[@]}" "${mod_info_advduplicator[@]}" "${mod_info_trackassemblytool[@]}" "${mod_info_physpropertiesadv[@]}" "${mod_info_controlsystemse2[@]}" "${mod_info_e2pistontiming[@]}" "${mod_info_propcannontool[@]}" "${mod_info_gearassemblytool[@]}" "${mod_info_spinnertool[@]}" "${mod_info_surfacefrictiontool[@]}" "${mod_info_magneticdipole[@]}" "${mod_info_environmentorganizer[@]}" "${mod_info_precision_alignment[@]}" "${mod_info_improved_stacker[@]}" "${mod_info_improved_weight[@]}" "${mod_info_improved_antinoclip[@]}" "${mod_info_laserstool[@]}" ) From ef3f7527179457acba8993018c56458f35aa85df Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Thu, 23 Sep 2021 23:39:26 +0100 Subject: [PATCH 052/164] fix(arma3): resolve arma3 debug not working (#3409) * use eval in debug --- lgsm/functions/command_debug.sh | 11 +++-------- 1 file changed, 3 insertions(+), 8 deletions(-) diff --git a/lgsm/functions/command_debug.sh b/lgsm/functions/command_debug.sh index a9cceebdb..b6ab14fe8 100755 --- a/lgsm/functions/command_debug.sh +++ b/lgsm/functions/command_debug.sh @@ -112,17 +112,12 @@ fi # Note: do not add double quotes to ${executable} ${startparameters}. if [ "${engine}" == "source" ]||[ "${engine}" == "goldsrc" ]; then - ${executable} ${startparameters} -debug -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//\\;/;} + eval "${executable} ${startparameters} -debug" elif [ "${engine}" == "quake" ]; then - ${executable} ${startparameters} -condebug + eval "${executable} ${startparameters} -condebug" else # shellcheck disable=SC2086 - ${preexecutable} ${executable} ${startparameters} + eval "${preexecutable} ${executable} ${startparameters}" fi fn_lockfile_trap From bb5300300c8f73a1cce39c3273f2bedff2223ac8 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Fri, 24 Sep 2021 20:50:30 +0100 Subject: [PATCH 053/164] fix(ip): improvements to ip command usage (#3570) --- lgsm/functions/check_ip.sh | 21 ++++++++++++++++----- lgsm/functions/info_distro.sh | 4 ++-- tests/tests_jc2server.sh | 6 +++--- tests/tests_mcserver.sh | 12 ++++++------ 4 files changed, 27 insertions(+), 16 deletions(-) diff --git a/lgsm/functions/check_ip.sh b/lgsm/functions/check_ip.sh index 09b948ccd..0dafbbcdc 100755 --- a/lgsm/functions/check_ip.sh +++ b/lgsm/functions/check_ip.sh @@ -10,11 +10,22 @@ functionselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" info_game.sh -if [ ! -f "/bin/ip" ]; then - ipcommand="/sbin/ip" -else - ipcommand="ip" -fi +ip_commands_array=( "/bin/ip" "/usr/sbin/ip" "ip") +for ip_command in "${ip_commands_array[@]}"; do + if [ "$(command -v ${ip_command} 2>/dev/null)" ]; then + ipcommand="${ip_command}" + break + fi +done + +ethtool_commands_array=( "/bin/ethtool" "/usr/sbin/ethtool" "ethtool") +for ethtool_command in "${ethtool_commands_array[@]}"; do + if [ "$(command -v ${ethtool_command} 2>/dev/null)" ]; then + ethtoolcommand="${ethtool_command}" + break + fi +done + 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) diff --git a/lgsm/functions/info_distro.sh b/lgsm/functions/info_distro.sh index fdfc076ab..eda17f8d1 100755 --- a/lgsm/functions/info_distro.sh +++ b/lgsm/functions/info_distro.sh @@ -234,8 +234,8 @@ if [ -d "${backupdir}" ]; then fi # Network Interface name -netint=$(ip -o addr | grep "${ip}" | awk '{print $2}') -netlink=$(ethtool "${netint}" 2>/dev/null| grep Speed | awk '{print $2}') +netint=$(${ipcommand} -o addr | grep "${ip}" | awk '{print $2}') +netlink=$(${ethtoolcommand} "${netint}" 2>/dev/null| grep Speed | awk '{print $2}') # External IP address if [ -z "${extip}" ]; then diff --git a/tests/tests_jc2server.sh b/tests/tests_jc2server.sh index 474d45f06..246ee76cd 100644 --- a/tests/tests_jc2server.sh +++ b/tests/tests_jc2server.sh @@ -1070,10 +1070,10 @@ 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) +if [ "$(${ipcommand}-o -4 addr|grep eth0)" ]; then + travisip=$(${ipcommand}-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) + travisip=$(${ipcommand}-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 -e "IP: ${travisip}" diff --git a/tests/tests_mcserver.sh b/tests/tests_mcserver.sh index b6d6217cd..783580872 100644 --- a/tests/tests_mcserver.sh +++ b/tests/tests_mcserver.sh @@ -933,10 +933,10 @@ 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) +if [ "$(${ipcommand}-o -4 addr|grep eth0)" ]; then + travisip=$(${ipcommand}-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) + travisip=$(${ipcommand}-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 -e "IP: ${travisip}" @@ -1167,10 +1167,10 @@ 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) +if [ "$(${ipcommand}-o -4 addr|grep eth0)" ]; then + travisip=$(${ipcommand}-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) + travisip=$(${ipcommand}-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 -e "IP: ${travisip}" From 74acd2dc8a303676601558c3282353c27f43d4c3 Mon Sep 17 00:00:00 2001 From: Christian Date: Fri, 24 Sep 2021 22:24:51 +0200 Subject: [PATCH 054/164] feat(valheim): add support for Valheim Plus mod (#3346) --- lgsm/functions/check_deps.sh | 6 ++++++ lgsm/functions/core_getopt.sh | 2 +- lgsm/functions/fix_vh.sh | 14 ++++++++++++++ lgsm/functions/mods_list.sh | 11 ++++++++--- 4 files changed, 29 insertions(+), 4 deletions(-) diff --git a/lgsm/functions/check_deps.sh b/lgsm/functions/check_deps.sh index 722a0a4da..0e18b9f32 100755 --- a/lgsm/functions/check_deps.sh +++ b/lgsm/functions/check_deps.sh @@ -465,6 +465,9 @@ fn_deps_build_debian(){ # Pavlov VR elif [ "${shortname}" == "pvr" ]; then array_deps_required+=( libc++1 ) + # Valheim ( for Plus mod) + elif [ "${shortname}" == "vh" ]; then + array_deps_required+=( libc6-dev ) fi # check if system is a lxc container and the hostname dependency. @@ -577,6 +580,9 @@ fn_deps_build_redhat(){ # Pavlov VR elif [ "${shortname}" == "pvr" ]; then array_deps_required+=( libcxx ) + # Valheim ( for Plus mod ) + elif [ "${shortname}" == "vh" ]; then + array_deps_required+=( glibc-devel ) fi # check if system is a lxc container and the hostname dependency. diff --git a/lgsm/functions/core_getopt.sh b/lgsm/functions/core_getopt.sh index ea3c84f6d..9594fa5ae 100755 --- a/lgsm/functions/core_getopt.sh +++ b/lgsm/functions/core_getopt.sh @@ -134,7 +134,7 @@ if [ "${shortname}" == "squad" ]; then fi ## Mods commands. -if [ "${engine}" == "source" ]||[ "${shortname}" == "rust" ]||[ "${shortname}" == "hq" ]||[ "${shortname}" == "sdtd" ]||[ "${shortname}" == "cs" ]||[ "${shortname}" == "dod" ]||[ "${shortname}" == "tfc" ]||[ "${shortname}" == "ns" ]||[ "${shortname}" == "ts" ]||[ "${shortname}" == "hldm" ]; then +if [ "${engine}" == "source" ]||[ "${shortname}" == "rust" ]||[ "${shortname}" == "hq" ]||[ "${shortname}" == "sdtd" ]||[ "${shortname}" == "cs" ]||[ "${shortname}" == "dod" ]||[ "${shortname}" == "tfc" ]||[ "${shortname}" == "ns" ]||[ "${shortname}" == "ts" ]||[ "${shortname}" == "hldm" ]||[ "${shortname}" == "vh" ]; then currentopt+=( "${cmd_mods_install[@]}" "${cmd_mods_remove[@]}" "${cmd_mods_update[@]}" ) fi diff --git a/lgsm/functions/fix_vh.sh b/lgsm/functions/fix_vh.sh index 551bd878f..9b672a5b3 100755 --- a/lgsm/functions/fix_vh.sh +++ b/lgsm/functions/fix_vh.sh @@ -7,3 +7,17 @@ functionselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" export LD_LIBRARY_PATH=./linux64:$LD_LIBRARY_PATH + +# special check if Valheim Plus is installed +modsdir="${lgsmdir}/mods" +modsinstalledlistfullpath="${modsdir}/installed-mods.txt" +if [ -f "${modsinstalledlistfullpath}" ]; then + if grep -qE "^valheimplus" "${modsinstalledlistfullpath}" + then + if ! grep -qE "^executable=\"./start_server_bepinex.sh\"" "${configdirserver}/${selfname}.cfg" + then + echo 'executable="./start_server_bepinex.sh"' >> "${configdirserver}/${selfname}.cfg" + executeable="./start_server_bepinex.sh" + fi + fi +fi diff --git a/lgsm/functions/mods_list.sh b/lgsm/functions/mods_list.sh index 382ed8c1f..fc9d921d6 100755 --- a/lgsm/functions/mods_list.sh +++ b/lgsm/functions/mods_list.sh @@ -83,6 +83,8 @@ csgopuglatestlink=$(echo -e "${csgopuglatest}" | jq -r '.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' ) +# Valheim Plus +valeimpluslatestlink=$(curl --connect-timeout 10 -sL https://api.github.com/repos/valheimPlus/ValheimPlus/releases/latest | jq -r '.assets[]|select(.browser_download_url | contains("UnixServer.tar.gz")) | .browser_download_url') # Define mods information (required) @@ -140,8 +142,8 @@ mod_info_ttt=( MOD "ttt" "Trouble in Terrorist Town" "https://csgottt.com/downlo 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" ) mod_info_dhook=( MOD "dhook" "dhook" "https://forums.alliedmods.net/attachment.php?attachmentid=190123&d=1625050030" "dhooks-2.2.0d17.zip" "0" "LowercaseOff" "${systemdir}" "cfg;addons/sourcemod/configs;" "ENGINES" "Counter-Strike: Global Offensive;" "NOTGAMES" "https://forums.alliedmods.net/showpost.php?p=2588686&postcount=589" "DHooks 2.2.0 - Required for GOKZ" ) -mod_info_movement=( MOD "movementapi" "movementapi" "https://github.com/danzayau/MovementAPI/releases/download/2.1.0/MovementAPI-v2.1.0.zip" "MovementAPI-v2.1.0.zip" "0" "LowercaseOff" "${systemdir}" "cfg;addons/sourcemod/configs;" "ENGINES" "Counter-Strike: Global Offensive;" "NOTGAMES" "https://github.com/danzayau/MovementAPI" "Movement API 2.1.0 - Required for GOKZ" ) -mod_info_cleaner=( MOD "cleaner" "cleaner" "https://github.com/e54385991/console-cleaner/archive/refs/heads/master.zip" "console-cleaner.zip" "0" "LowercaseOff" "${systemdir}" "cfg;addons/sourcemod/configs;" "ENGINES" "Counter-Strike: Global Offensive;" "NOTGAMES" "https://github.com/e54385991/console-cleaner" "Console Cleaner - Optional for GOKZ" ) +mod_info_movement=( MOD "movementapi" "movementapi" "https://github.com/danzayau/MovementAPI/releases/download/2.1.0/MovementAPI-v2.1.0.zip" "MovementAPI-v2.1.0.zip" "0" "LowercaseOff" "${systemdir}" "cfg;addons/sourcemod/configs;" "ENGINES" "Counter-Strike: Global Offensive;" "NOTGAMES" "https://github.com/danzayau/MovementAPI" "Movement API 2.1.0 - Required for GOKZ" ) +mod_info_cleaner=( MOD "cleaner" "cleaner" "https://github.com/e54385991/console-cleaner/archive/refs/heads/master.zip" "console-cleaner.zip" "0" "LowercaseOff" "${systemdir}" "cfg;addons/sourcemod/configs;" "ENGINES" "Counter-Strike: Global Offensive;" "NOTGAMES" "https://github.com/e54385991/console-cleaner" "Console Cleaner - Optional for GOKZ" ) # 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" ) @@ -178,5 +180,8 @@ mod_info_rustoxide=( MOD "rustoxide" "Oxide for Rust" "${oxiderustlatestlink}" " 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" ) +# ValheimPlus +mod_info_valheimplus=( MOD "valheimplus" "Valheim PLUS" "${valeimpluslatestlink}" "ValheimPlus.tar.gz" "0" "LowercaseOff" "${systemdir}" "OVERWRITE" "ENGINES" "Valheim;" "NOTGAMES" "https://github.com/valheimPlus/ValheimPlus" "Mod to improve Valheim gameplay") + # 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_dhook[@]}" "${mod_info_movement[@]}" "${mod_info_cleaner[@]}" "${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[@]}" "${mod_info_advduplicator[@]}" "${mod_info_trackassemblytool[@]}" "${mod_info_physpropertiesadv[@]}" "${mod_info_controlsystemse2[@]}" "${mod_info_e2pistontiming[@]}" "${mod_info_propcannontool[@]}" "${mod_info_gearassemblytool[@]}" "${mod_info_spinnertool[@]}" "${mod_info_surfacefrictiontool[@]}" "${mod_info_magneticdipole[@]}" "${mod_info_environmentorganizer[@]}" "${mod_info_precision_alignment[@]}" "${mod_info_improved_stacker[@]}" "${mod_info_improved_weight[@]}" "${mod_info_improved_antinoclip[@]}" "${mod_info_laserstool[@]}" ) +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_dhook[@]}" "${mod_info_movement[@]}" "${mod_info_cleaner[@]}" "${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[@]}" "${mod_info_advduplicator[@]}" "${mod_info_trackassemblytool[@]}" "${mod_info_physpropertiesadv[@]}" "${mod_info_controlsystemse2[@]}" "${mod_info_e2pistontiming[@]}" "${mod_info_propcannontool[@]}" "${mod_info_gearassemblytool[@]}" "${mod_info_spinnertool[@]}" "${mod_info_surfacefrictiontool[@]}" "${mod_info_magneticdipole[@]}" "${mod_info_environmentorganizer[@]}" "${mod_info_precision_alignment[@]}" "${mod_info_improved_stacker[@]}" "${mod_info_improved_weight[@]}" "${mod_info_improved_antinoclip[@]}" "${mod_info_laserstool[@]}" "${mod_info_valheimplus[@]}" ) From f289ebe560e152e8c8c017b680733b757cf77b35 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Fri, 24 Sep 2021 23:18:11 +0100 Subject: [PATCH 055/164] feat(install): dependency refactor (#3568) * adding data files * adding old code back in * added csv download code * added debian 11 * distro detection bug * file github * adding url checking * check url * check dl * file_url to fileurl * remove infinite loop * correct message * adding file checking * impove dep checking logic for unsupported distros * logic * add missing dep menu * using update_steamcmd.sh * added remote location * download csv file * download * logic * more logic * speed up dependency loop * message type change * remove legacy code * command only listed on install * remove nl * remove check requirement on stop * missing vints vints * add debian based servers * eco * add centos8 * mono changes * correct centos8 csv * centos 8 fixes * almalinux-8.4 * add centos 7 and rocky 8 * add dnf and email deps * add steamcmd requirements * steamcmd requirements * dependencysteamcmd * prevent masterserver from checking more than once per command * uniq sort dependency array * re-word of mono repo install * prevent too many steam api querys * java and mono check logic * unset depstatus * mono status * java versions * java wildcard * depstatus * bug * add dodr * remove i386 command if not needed * added rhel * 8.4 to just 8 * added Valheim Plus requriements --- lgsm/data/almalinux-8.csv | 120 +++++ lgsm/data/centos-7.csv | 120 +++++ lgsm/data/centos-8.csv | 120 +++++ lgsm/data/debian-10.csv | 120 +++++ lgsm/data/debian-11.csv | 120 +++++ lgsm/data/debian-9.csv | 120 +++++ lgsm/data/rhel-7.csv | 120 +++++ lgsm/data/rhel-8.csv | 120 +++++ lgsm/data/rocky-8.csv | 120 +++++ lgsm/data/ubuntu-16.04.csv | 120 +++++ lgsm/data/ubuntu-18.04.csv | 120 +++++ lgsm/data/ubuntu-20.04.csv | 121 +++++ lgsm/data/ubuntu-21.04.csv | 120 +++++ lgsm/functions/check.sh | 2 +- lgsm/functions/check_deps.sh | 705 ++++++++----------------- lgsm/functions/core_dl.sh | 146 +++-- lgsm/functions/info_distro.sh | 194 +++---- lgsm/functions/info_game.sh | 21 + lgsm/functions/install_config.sh | 1 - lgsm/functions/install_server_dir.sh | 1 - lgsm/functions/install_server_files.sh | 1 + 21 files changed, 2011 insertions(+), 621 deletions(-) create mode 100644 lgsm/data/almalinux-8.csv create mode 100644 lgsm/data/centos-7.csv create mode 100644 lgsm/data/centos-8.csv create mode 100644 lgsm/data/debian-10.csv create mode 100644 lgsm/data/debian-11.csv create mode 100644 lgsm/data/debian-9.csv create mode 100644 lgsm/data/rhel-7.csv create mode 100644 lgsm/data/rhel-8.csv create mode 100644 lgsm/data/rocky-8.csv create mode 100644 lgsm/data/ubuntu-16.04.csv create mode 100644 lgsm/data/ubuntu-18.04.csv create mode 100644 lgsm/data/ubuntu-20.04.csv create mode 100644 lgsm/data/ubuntu-21.04.csv diff --git a/lgsm/data/almalinux-8.csv b/lgsm/data/almalinux-8.csv new file mode 100644 index 000000000..f72d74b7b --- /dev/null +++ b/lgsm/data/almalinux-8.csv @@ -0,0 +1,120 @@ +all,epel-release,curl,wget,util-linux,python36,file,tar,gzip,bzip2,unzip,xz,binutils,bc,jq,tmux,nmap-ncat,cpio,hostname +ac +ahl +ahl2 +ark +arma3 +av +bb +bb2,libcurl.i686 +bd +bf1942,ncurses-libs.i686 +bfv,compat-libstdc++-33.i686,glibc.i686 +bmdm,ncurses-libs.i686 +bo +bs +bt,libicu +bt1944 +cc +cmw +cod,compat-libstdc++-33.i686 +cod2,compat-libstdc++-33.i686 +cod4 +coduo,compat-libstdc++-33.i686 +codwaw +col +cs +cscz +csgo +css,ncurses-libs.i686 +dab +dmc +dod +dodr +dods +doi +dst,libcurl.i686 +dys +eco,libgdiplus +em +etl +fctr +fof +gmod,ncurses-libs.i686 +hl2dm +hldm +hldms +hw,zlib-devel +ins +inss +ios +jc2 +jc3 +jk2 +kf +kf2 +lo +l4d +l4d2 +mc,java-11-openjdk +mcb,libnsl +mh +mohaa,compat-libstdc++-33.i686 +mom +mta +mumble +nd +nmrih,ncurses-libs.i686 +ns +ns2,speex,tbb +ns2c,speex.i686,tbb.i686 +onset,mariadb-connector-c +opfor +pc +pmc,java-11-openjdk +pstbs,GConf2 +pvkii +pvr,libcxx +pz,java-11-openjdk rng-tools +q2 +q3 +ql +qw +ricochet +ro +rtcw +rust,zlib-devel +rw,java-11-openjdk +samp +sb +sbots +scpsl +scpslsm +sdtd,telnet,expect +sfc,ncurses-libs.i686 +sof2 +sol +squad +st +sven +terraria +tf2,libcurl.i686 +tfc +ts +ts3 +tu +tw +unt +ut +ut2k4 +ut3 +ut99 +vh,glibc-devel +vs +vints,mono-complete +wet +wf +wmc,java-11-openjdk +wurm,xorg-x11-server-Xvfb +zmr,ncurses-libs.i686 +zps,ncurses-libs.i686 diff --git a/lgsm/data/centos-7.csv b/lgsm/data/centos-7.csv new file mode 100644 index 000000000..f72d74b7b --- /dev/null +++ b/lgsm/data/centos-7.csv @@ -0,0 +1,120 @@ +all,epel-release,curl,wget,util-linux,python36,file,tar,gzip,bzip2,unzip,xz,binutils,bc,jq,tmux,nmap-ncat,cpio,hostname +ac +ahl +ahl2 +ark +arma3 +av +bb +bb2,libcurl.i686 +bd +bf1942,ncurses-libs.i686 +bfv,compat-libstdc++-33.i686,glibc.i686 +bmdm,ncurses-libs.i686 +bo +bs +bt,libicu +bt1944 +cc +cmw +cod,compat-libstdc++-33.i686 +cod2,compat-libstdc++-33.i686 +cod4 +coduo,compat-libstdc++-33.i686 +codwaw +col +cs +cscz +csgo +css,ncurses-libs.i686 +dab +dmc +dod +dodr +dods +doi +dst,libcurl.i686 +dys +eco,libgdiplus +em +etl +fctr +fof +gmod,ncurses-libs.i686 +hl2dm +hldm +hldms +hw,zlib-devel +ins +inss +ios +jc2 +jc3 +jk2 +kf +kf2 +lo +l4d +l4d2 +mc,java-11-openjdk +mcb,libnsl +mh +mohaa,compat-libstdc++-33.i686 +mom +mta +mumble +nd +nmrih,ncurses-libs.i686 +ns +ns2,speex,tbb +ns2c,speex.i686,tbb.i686 +onset,mariadb-connector-c +opfor +pc +pmc,java-11-openjdk +pstbs,GConf2 +pvkii +pvr,libcxx +pz,java-11-openjdk rng-tools +q2 +q3 +ql +qw +ricochet +ro +rtcw +rust,zlib-devel +rw,java-11-openjdk +samp +sb +sbots +scpsl +scpslsm +sdtd,telnet,expect +sfc,ncurses-libs.i686 +sof2 +sol +squad +st +sven +terraria +tf2,libcurl.i686 +tfc +ts +ts3 +tu +tw +unt +ut +ut2k4 +ut3 +ut99 +vh,glibc-devel +vs +vints,mono-complete +wet +wf +wmc,java-11-openjdk +wurm,xorg-x11-server-Xvfb +zmr,ncurses-libs.i686 +zps,ncurses-libs.i686 diff --git a/lgsm/data/centos-8.csv b/lgsm/data/centos-8.csv new file mode 100644 index 000000000..f72d74b7b --- /dev/null +++ b/lgsm/data/centos-8.csv @@ -0,0 +1,120 @@ +all,epel-release,curl,wget,util-linux,python36,file,tar,gzip,bzip2,unzip,xz,binutils,bc,jq,tmux,nmap-ncat,cpio,hostname +ac +ahl +ahl2 +ark +arma3 +av +bb +bb2,libcurl.i686 +bd +bf1942,ncurses-libs.i686 +bfv,compat-libstdc++-33.i686,glibc.i686 +bmdm,ncurses-libs.i686 +bo +bs +bt,libicu +bt1944 +cc +cmw +cod,compat-libstdc++-33.i686 +cod2,compat-libstdc++-33.i686 +cod4 +coduo,compat-libstdc++-33.i686 +codwaw +col +cs +cscz +csgo +css,ncurses-libs.i686 +dab +dmc +dod +dodr +dods +doi +dst,libcurl.i686 +dys +eco,libgdiplus +em +etl +fctr +fof +gmod,ncurses-libs.i686 +hl2dm +hldm +hldms +hw,zlib-devel +ins +inss +ios +jc2 +jc3 +jk2 +kf +kf2 +lo +l4d +l4d2 +mc,java-11-openjdk +mcb,libnsl +mh +mohaa,compat-libstdc++-33.i686 +mom +mta +mumble +nd +nmrih,ncurses-libs.i686 +ns +ns2,speex,tbb +ns2c,speex.i686,tbb.i686 +onset,mariadb-connector-c +opfor +pc +pmc,java-11-openjdk +pstbs,GConf2 +pvkii +pvr,libcxx +pz,java-11-openjdk rng-tools +q2 +q3 +ql +qw +ricochet +ro +rtcw +rust,zlib-devel +rw,java-11-openjdk +samp +sb +sbots +scpsl +scpslsm +sdtd,telnet,expect +sfc,ncurses-libs.i686 +sof2 +sol +squad +st +sven +terraria +tf2,libcurl.i686 +tfc +ts +ts3 +tu +tw +unt +ut +ut2k4 +ut3 +ut99 +vh,glibc-devel +vs +vints,mono-complete +wet +wf +wmc,java-11-openjdk +wurm,xorg-x11-server-Xvfb +zmr,ncurses-libs.i686 +zps,ncurses-libs.i686 diff --git a/lgsm/data/debian-10.csv b/lgsm/data/debian-10.csv new file mode 100644 index 000000000..f352a05a2 --- /dev/null +++ b/lgsm/data/debian-10.csv @@ -0,0 +1,120 @@ +all,bc,binutils,bsdmainutils,bzip2,ca-certificates,cpio,curl,file,gzip,jq,python3,tar,tmux,util-linux,netcat,unzip,xz-utils,lib32gcc1,lib32stdc++6,hostname +ac +ahl +ahl2 +ark +arma3 +av +bb +bb2,libcurl4-gnutls-dev:i386 +bd +bf1942,libncurses5:i386,libtinfo5:i386 +bfv,libncurses5:i386,libstdc++5:i386 +bmdm,libncurses5:i386 +bo +bs +bt,libicu-dev +bt1944 +cc +cmw +cod,libstdc++5:i386 +cod2,libstdc++5:i386 +cod4 +coduo,libstdc++5:i386 +codwaw +col +cs +cscz +csgo +css,libtinfo5:i386 +dab +dmc +dod +dodr +dods +doi +dst,libcurl4-gnutls-dev:i386 +dys +eco,libgdiplus +em +etl +fctr +fof +gmod,libtinfo5:i386 +hl2dm +hldm +hldms +hw,lib32z1 +ins +inss +ios +jc2 +jc3 +jk2 +kf +kf2 +lo +l4d +l4d2 +mc,openjdk-11-jre +mcb +mh +mohaa,libstdc++5:i386 +mom +mta +mumble +nd +nmrih,libtinfo5:i386 +ns +ns2,speex,libtbb2 +ns2c,speex:i386,libtbb2 +onset +opfor +pc +pmc,openjdk-11-jre +pstbs,libgconf-2-4 +pvkii +pvr,libc++1 +pz +q2 +q3 +ql +qw +ricochet +ro +rtcw +rust,lib32z1 +rw,openjdk-11-jre +samp +sb +sbots +scpsl,mono-complete +scpslsm,mono-complete +sdtd,telnet,expect +sfc,libtinfo5:i386 +sof2 +sol +squad +st +sven,libssl1.1:i386,zlib1g:i386 +terraria +tf2,libcurl4-gnutls-dev:i386 +tfc +ts +ts3 +tu +tw +unt +ut +ut2k4 +ut3 +ut99 +vh,libc6-dev +vs +vints,mono-complete +wet +wf +wmc,openjdk-11-jre +wurm,xvfb +zmr,libtinfo5:i386 +zps,libtinfo5:i386 diff --git a/lgsm/data/debian-11.csv b/lgsm/data/debian-11.csv new file mode 100644 index 000000000..146e9fc2c --- /dev/null +++ b/lgsm/data/debian-11.csv @@ -0,0 +1,120 @@ +all,bc,binutils,bsdmainutils,bzip2,ca-certificates,cpio,curl,file,gzip,jq,python3,tar,tmux,util-linux,netcat,unzip,xz-utils,lib32gcc-s1,lib32stdc++6,hostname +ac +ahl +ahl2 +ark +arma3 +av +bb +bb2,libcurl4-gnutls-dev:i386 +bd +bf1942,libncurses5:i386,libtinfo5:i386 +bfv,libncurses5:i386,libstdc++5:i386 +bmdm,libncurses5:i386 +bo +bs +bt,libicu-dev +bt1944 +cc +cmw +cod,libstdc++5:i386 +cod2,libstdc++5:i386 +cod4 +coduo,libstdc++5:i386 +codwaw +col +cs +cscz +csgo +css,libtinfo5:i386 +dab +dmc +dod +dodr +dods +doi +dst,libcurl4-gnutls-dev:i386 +dys +eco,libgdiplus +em +etl +fctr +fof +gmod,libtinfo5:i386 +hl2dm +hldm +hldms +hw,lib32z1 +ins +inss +ios +jc2 +jc3 +jk2 +kf +kf2 +lo +l4d +l4d2 +mc,openjdk-16-jre +mcb +mh +mohaa,libstdc++5:i386 +mom +mta +mumble +nd +nmrih,libtinfo5:i386 +ns +ns2,speex,libtbb2 +ns2c,speex:i386,libtbb2 +onset +opfor +pc +pmc,openjdk-16-jre +pstbs,libgconf-2-4 +pvkii +pvr,libc++1 +pz +q2 +q3 +ql +qw +ricochet +ro +rtcw +rust,lib32z1 +rw,openjdk-16-jre +samp +sb +sbots +scpsl,mono-complete +scpslsm,mono-complete +sdtd,telnet,expect +sfc,libtinfo5:i386 +sof2 +sol +squad +st +sven,libssl1.1:i386,zlib1g:i386 +terraria +tf2,libcurl4-gnutls-dev:i386 +tfc +ts +ts3 +tu +tw +unt +ut +ut2k4 +ut3 +ut99 +vh,libc6-dev +vs +vints,mono-complete +wet +wf +wmc,openjdk-16-jre +wurm,xvfb +zmr,libtinfo5:i386 +zps,libtinfo5:i386 diff --git a/lgsm/data/debian-9.csv b/lgsm/data/debian-9.csv new file mode 100644 index 000000000..0b40d2340 --- /dev/null +++ b/lgsm/data/debian-9.csv @@ -0,0 +1,120 @@ +all,bc,binutils,bsdmainutils,bzip2,ca-certificates,cpio,curl,file,gzip,jq,python3,tar,tmux,util-linux,netcat,unzip,xz-utils,lib32gcc1,lib32stdc++6,hostname +ac +ahl +ahl2 +ark +arma3 +av +bb +bb2,libcurl4-gnutls-dev:i386 +bd +bf1942,libncurses5:i386,libtinfo5:i386 +bfv,libncurses5:i386,libstdc++5:i386 +bmdm,libncurses5:i386 +bo +bs +bt,libicu-dev +bt1944 +cc +cmw +cod,libstdc++5:i386 +cod2,libstdc++5:i386 +cod4 +coduo,libstdc++5:i386 +codwaw +col +cs +cscz +csgo +css,libtinfo5:i386 +dab +dmc +dod +dodr +dods +doi +dst,libcurl4-gnutls-dev:i386 +dys +eco,libgdiplus +em +etl +fctr +fof +gmod,libtinfo5:i386 +hl2dm +hldm +hldms +hw,lib32z1 +ins +inss +ios +jc2 +jc3 +jk2 +kf +kf2 +lo +l4d +l4d2 +mc,openjdk-8-jre +mcb +mh +mohaa,libstdc++5:i386 +mom +mta +mumble +nd +nmrih,libtinfo5:i386 +ns +ns2,speex,libtbb2 +ns2c,speex:i386,libtbb2 +onset +opfor +pc +pmc,openjdk-8-jre +pstbs,libgconf-2-4 +pvkii +pvr,libc++1 +pz +q2 +q3 +ql +qw +ricochet +ro +rtcw +rust,lib32z1 +rw,openjdk-8-jre +samp +sb +sbots +scpsl,mono-complete +scpslsm,mono-complete +sdtd,telnet,expect +sfc,libtinfo5:i386 +sof2 +sol +squad +st +sven,libssl1.1:i386,zlib1g:i386 +terraria +tf2,libcurl4-gnutls-dev:i386 +tfc +ts +ts3 +tu +tw +unt +ut +ut2k4 +ut3 +ut99 +vh,libc6-dev +vs +vints,mono-complete +wet +wf +wmc,openjdk-8-jre +wurm,xvfb +zmr,libtinfo5:i386 +zps,libtinfo5:i386 diff --git a/lgsm/data/rhel-7.csv b/lgsm/data/rhel-7.csv new file mode 100644 index 000000000..f72d74b7b --- /dev/null +++ b/lgsm/data/rhel-7.csv @@ -0,0 +1,120 @@ +all,epel-release,curl,wget,util-linux,python36,file,tar,gzip,bzip2,unzip,xz,binutils,bc,jq,tmux,nmap-ncat,cpio,hostname +ac +ahl +ahl2 +ark +arma3 +av +bb +bb2,libcurl.i686 +bd +bf1942,ncurses-libs.i686 +bfv,compat-libstdc++-33.i686,glibc.i686 +bmdm,ncurses-libs.i686 +bo +bs +bt,libicu +bt1944 +cc +cmw +cod,compat-libstdc++-33.i686 +cod2,compat-libstdc++-33.i686 +cod4 +coduo,compat-libstdc++-33.i686 +codwaw +col +cs +cscz +csgo +css,ncurses-libs.i686 +dab +dmc +dod +dodr +dods +doi +dst,libcurl.i686 +dys +eco,libgdiplus +em +etl +fctr +fof +gmod,ncurses-libs.i686 +hl2dm +hldm +hldms +hw,zlib-devel +ins +inss +ios +jc2 +jc3 +jk2 +kf +kf2 +lo +l4d +l4d2 +mc,java-11-openjdk +mcb,libnsl +mh +mohaa,compat-libstdc++-33.i686 +mom +mta +mumble +nd +nmrih,ncurses-libs.i686 +ns +ns2,speex,tbb +ns2c,speex.i686,tbb.i686 +onset,mariadb-connector-c +opfor +pc +pmc,java-11-openjdk +pstbs,GConf2 +pvkii +pvr,libcxx +pz,java-11-openjdk rng-tools +q2 +q3 +ql +qw +ricochet +ro +rtcw +rust,zlib-devel +rw,java-11-openjdk +samp +sb +sbots +scpsl +scpslsm +sdtd,telnet,expect +sfc,ncurses-libs.i686 +sof2 +sol +squad +st +sven +terraria +tf2,libcurl.i686 +tfc +ts +ts3 +tu +tw +unt +ut +ut2k4 +ut3 +ut99 +vh,glibc-devel +vs +vints,mono-complete +wet +wf +wmc,java-11-openjdk +wurm,xorg-x11-server-Xvfb +zmr,ncurses-libs.i686 +zps,ncurses-libs.i686 diff --git a/lgsm/data/rhel-8.csv b/lgsm/data/rhel-8.csv new file mode 100644 index 000000000..f72d74b7b --- /dev/null +++ b/lgsm/data/rhel-8.csv @@ -0,0 +1,120 @@ +all,epel-release,curl,wget,util-linux,python36,file,tar,gzip,bzip2,unzip,xz,binutils,bc,jq,tmux,nmap-ncat,cpio,hostname +ac +ahl +ahl2 +ark +arma3 +av +bb +bb2,libcurl.i686 +bd +bf1942,ncurses-libs.i686 +bfv,compat-libstdc++-33.i686,glibc.i686 +bmdm,ncurses-libs.i686 +bo +bs +bt,libicu +bt1944 +cc +cmw +cod,compat-libstdc++-33.i686 +cod2,compat-libstdc++-33.i686 +cod4 +coduo,compat-libstdc++-33.i686 +codwaw +col +cs +cscz +csgo +css,ncurses-libs.i686 +dab +dmc +dod +dodr +dods +doi +dst,libcurl.i686 +dys +eco,libgdiplus +em +etl +fctr +fof +gmod,ncurses-libs.i686 +hl2dm +hldm +hldms +hw,zlib-devel +ins +inss +ios +jc2 +jc3 +jk2 +kf +kf2 +lo +l4d +l4d2 +mc,java-11-openjdk +mcb,libnsl +mh +mohaa,compat-libstdc++-33.i686 +mom +mta +mumble +nd +nmrih,ncurses-libs.i686 +ns +ns2,speex,tbb +ns2c,speex.i686,tbb.i686 +onset,mariadb-connector-c +opfor +pc +pmc,java-11-openjdk +pstbs,GConf2 +pvkii +pvr,libcxx +pz,java-11-openjdk rng-tools +q2 +q3 +ql +qw +ricochet +ro +rtcw +rust,zlib-devel +rw,java-11-openjdk +samp +sb +sbots +scpsl +scpslsm +sdtd,telnet,expect +sfc,ncurses-libs.i686 +sof2 +sol +squad +st +sven +terraria +tf2,libcurl.i686 +tfc +ts +ts3 +tu +tw +unt +ut +ut2k4 +ut3 +ut99 +vh,glibc-devel +vs +vints,mono-complete +wet +wf +wmc,java-11-openjdk +wurm,xorg-x11-server-Xvfb +zmr,ncurses-libs.i686 +zps,ncurses-libs.i686 diff --git a/lgsm/data/rocky-8.csv b/lgsm/data/rocky-8.csv new file mode 100644 index 000000000..f72d74b7b --- /dev/null +++ b/lgsm/data/rocky-8.csv @@ -0,0 +1,120 @@ +all,epel-release,curl,wget,util-linux,python36,file,tar,gzip,bzip2,unzip,xz,binutils,bc,jq,tmux,nmap-ncat,cpio,hostname +ac +ahl +ahl2 +ark +arma3 +av +bb +bb2,libcurl.i686 +bd +bf1942,ncurses-libs.i686 +bfv,compat-libstdc++-33.i686,glibc.i686 +bmdm,ncurses-libs.i686 +bo +bs +bt,libicu +bt1944 +cc +cmw +cod,compat-libstdc++-33.i686 +cod2,compat-libstdc++-33.i686 +cod4 +coduo,compat-libstdc++-33.i686 +codwaw +col +cs +cscz +csgo +css,ncurses-libs.i686 +dab +dmc +dod +dodr +dods +doi +dst,libcurl.i686 +dys +eco,libgdiplus +em +etl +fctr +fof +gmod,ncurses-libs.i686 +hl2dm +hldm +hldms +hw,zlib-devel +ins +inss +ios +jc2 +jc3 +jk2 +kf +kf2 +lo +l4d +l4d2 +mc,java-11-openjdk +mcb,libnsl +mh +mohaa,compat-libstdc++-33.i686 +mom +mta +mumble +nd +nmrih,ncurses-libs.i686 +ns +ns2,speex,tbb +ns2c,speex.i686,tbb.i686 +onset,mariadb-connector-c +opfor +pc +pmc,java-11-openjdk +pstbs,GConf2 +pvkii +pvr,libcxx +pz,java-11-openjdk rng-tools +q2 +q3 +ql +qw +ricochet +ro +rtcw +rust,zlib-devel +rw,java-11-openjdk +samp +sb +sbots +scpsl +scpslsm +sdtd,telnet,expect +sfc,ncurses-libs.i686 +sof2 +sol +squad +st +sven +terraria +tf2,libcurl.i686 +tfc +ts +ts3 +tu +tw +unt +ut +ut2k4 +ut3 +ut99 +vh,glibc-devel +vs +vints,mono-complete +wet +wf +wmc,java-11-openjdk +wurm,xorg-x11-server-Xvfb +zmr,ncurses-libs.i686 +zps,ncurses-libs.i686 diff --git a/lgsm/data/ubuntu-16.04.csv b/lgsm/data/ubuntu-16.04.csv new file mode 100644 index 000000000..0b40d2340 --- /dev/null +++ b/lgsm/data/ubuntu-16.04.csv @@ -0,0 +1,120 @@ +all,bc,binutils,bsdmainutils,bzip2,ca-certificates,cpio,curl,file,gzip,jq,python3,tar,tmux,util-linux,netcat,unzip,xz-utils,lib32gcc1,lib32stdc++6,hostname +ac +ahl +ahl2 +ark +arma3 +av +bb +bb2,libcurl4-gnutls-dev:i386 +bd +bf1942,libncurses5:i386,libtinfo5:i386 +bfv,libncurses5:i386,libstdc++5:i386 +bmdm,libncurses5:i386 +bo +bs +bt,libicu-dev +bt1944 +cc +cmw +cod,libstdc++5:i386 +cod2,libstdc++5:i386 +cod4 +coduo,libstdc++5:i386 +codwaw +col +cs +cscz +csgo +css,libtinfo5:i386 +dab +dmc +dod +dodr +dods +doi +dst,libcurl4-gnutls-dev:i386 +dys +eco,libgdiplus +em +etl +fctr +fof +gmod,libtinfo5:i386 +hl2dm +hldm +hldms +hw,lib32z1 +ins +inss +ios +jc2 +jc3 +jk2 +kf +kf2 +lo +l4d +l4d2 +mc,openjdk-8-jre +mcb +mh +mohaa,libstdc++5:i386 +mom +mta +mumble +nd +nmrih,libtinfo5:i386 +ns +ns2,speex,libtbb2 +ns2c,speex:i386,libtbb2 +onset +opfor +pc +pmc,openjdk-8-jre +pstbs,libgconf-2-4 +pvkii +pvr,libc++1 +pz +q2 +q3 +ql +qw +ricochet +ro +rtcw +rust,lib32z1 +rw,openjdk-8-jre +samp +sb +sbots +scpsl,mono-complete +scpslsm,mono-complete +sdtd,telnet,expect +sfc,libtinfo5:i386 +sof2 +sol +squad +st +sven,libssl1.1:i386,zlib1g:i386 +terraria +tf2,libcurl4-gnutls-dev:i386 +tfc +ts +ts3 +tu +tw +unt +ut +ut2k4 +ut3 +ut99 +vh,libc6-dev +vs +vints,mono-complete +wet +wf +wmc,openjdk-8-jre +wurm,xvfb +zmr,libtinfo5:i386 +zps,libtinfo5:i386 diff --git a/lgsm/data/ubuntu-18.04.csv b/lgsm/data/ubuntu-18.04.csv new file mode 100644 index 000000000..f352a05a2 --- /dev/null +++ b/lgsm/data/ubuntu-18.04.csv @@ -0,0 +1,120 @@ +all,bc,binutils,bsdmainutils,bzip2,ca-certificates,cpio,curl,file,gzip,jq,python3,tar,tmux,util-linux,netcat,unzip,xz-utils,lib32gcc1,lib32stdc++6,hostname +ac +ahl +ahl2 +ark +arma3 +av +bb +bb2,libcurl4-gnutls-dev:i386 +bd +bf1942,libncurses5:i386,libtinfo5:i386 +bfv,libncurses5:i386,libstdc++5:i386 +bmdm,libncurses5:i386 +bo +bs +bt,libicu-dev +bt1944 +cc +cmw +cod,libstdc++5:i386 +cod2,libstdc++5:i386 +cod4 +coduo,libstdc++5:i386 +codwaw +col +cs +cscz +csgo +css,libtinfo5:i386 +dab +dmc +dod +dodr +dods +doi +dst,libcurl4-gnutls-dev:i386 +dys +eco,libgdiplus +em +etl +fctr +fof +gmod,libtinfo5:i386 +hl2dm +hldm +hldms +hw,lib32z1 +ins +inss +ios +jc2 +jc3 +jk2 +kf +kf2 +lo +l4d +l4d2 +mc,openjdk-11-jre +mcb +mh +mohaa,libstdc++5:i386 +mom +mta +mumble +nd +nmrih,libtinfo5:i386 +ns +ns2,speex,libtbb2 +ns2c,speex:i386,libtbb2 +onset +opfor +pc +pmc,openjdk-11-jre +pstbs,libgconf-2-4 +pvkii +pvr,libc++1 +pz +q2 +q3 +ql +qw +ricochet +ro +rtcw +rust,lib32z1 +rw,openjdk-11-jre +samp +sb +sbots +scpsl,mono-complete +scpslsm,mono-complete +sdtd,telnet,expect +sfc,libtinfo5:i386 +sof2 +sol +squad +st +sven,libssl1.1:i386,zlib1g:i386 +terraria +tf2,libcurl4-gnutls-dev:i386 +tfc +ts +ts3 +tu +tw +unt +ut +ut2k4 +ut3 +ut99 +vh,libc6-dev +vs +vints,mono-complete +wet +wf +wmc,openjdk-11-jre +wurm,xvfb +zmr,libtinfo5:i386 +zps,libtinfo5:i386 diff --git a/lgsm/data/ubuntu-20.04.csv b/lgsm/data/ubuntu-20.04.csv new file mode 100644 index 000000000..942915cbe --- /dev/null +++ b/lgsm/data/ubuntu-20.04.csv @@ -0,0 +1,121 @@ +all,bc,binutils,bsdmainutils,bzip2,ca-certificates,cpio,curl,file,gzip,jq,python3,tar,tmux,util-linux,netcat,unzip,xz-utils,lib32gcc1,lib32stdc++6,hostname +steamcmd,lib32gcc1,lib32stdc++6,libsdl2-2.0-0:i386 +ac +ahl +ahl2 +ark +arma3 +av +bb +bb2,libcurl4-gnutls-dev:i386 +bd +bf1942,libncurses5:i386,libtinfo5:i386 +bfv,libncurses5:i386,libstdc++5:i386 +bmdm,libncurses5:i386 +bo +bs +bt,libicu-dev +bt1944 +cc +cmw +cod,libstdc++5:i386 +cod2,libstdc++5:i386 +cod4 +coduo,libstdc++5:i386 +codwaw +col +cs +cscz +csgo +css,libtinfo5:i386 +dab +dmc +dod +dodr +dods +doi +dst,libcurl4-gnutls-dev:i386 +dys +eco,libgdiplus +em +etl +fctr +fof +gmod,libtinfo5:i386 +hl2dm +hldm +hldms +hw,lib32z1 +ins +inss +ios +jc2 +jc3 +jk2 +kf +kf2 +lo +l4d +l4d2 +mc,openjdk-16-jre +mcb +mh +mohaa,libstdc++5:i386 +mom +mta +mumble +nd +nmrih,libtinfo5:i386 +ns +ns2,speex,libtbb2 +ns2c,speex:i386,libtbb2 +onset +opfor +pc +pmc,openjdk-16-jre +pstbs,libgconf-2-4 +pvkii +pvr,libc++1 +pz +q2 +q3 +ql +qw +ricochet +ro +rtcw +rust,lib32z1 +rw,openjdk-16-jre +samp +sb +sbots +scpsl,mono-complete +scpslsm,mono-complete +sdtd,telnet,expect +sfc,libtinfo5:i386 +sof2 +sol +squad +st +sven,libssl1.1:i386,zlib1g:i386 +terraria +tf2,libcurl4-gnutls-dev:i386 +tfc +ts +ts3 +tu +tw +unt +ut +ut2k4 +ut3 +ut99 +vh,libc6-dev +vs +vints,mono-complete +wet +wf +wmc,openjdk-16-jre +wurm,xvfb +zmr,libtinfo5:i386 +zps,libtinfo5:i386 diff --git a/lgsm/data/ubuntu-21.04.csv b/lgsm/data/ubuntu-21.04.csv new file mode 100644 index 000000000..146e9fc2c --- /dev/null +++ b/lgsm/data/ubuntu-21.04.csv @@ -0,0 +1,120 @@ +all,bc,binutils,bsdmainutils,bzip2,ca-certificates,cpio,curl,file,gzip,jq,python3,tar,tmux,util-linux,netcat,unzip,xz-utils,lib32gcc-s1,lib32stdc++6,hostname +ac +ahl +ahl2 +ark +arma3 +av +bb +bb2,libcurl4-gnutls-dev:i386 +bd +bf1942,libncurses5:i386,libtinfo5:i386 +bfv,libncurses5:i386,libstdc++5:i386 +bmdm,libncurses5:i386 +bo +bs +bt,libicu-dev +bt1944 +cc +cmw +cod,libstdc++5:i386 +cod2,libstdc++5:i386 +cod4 +coduo,libstdc++5:i386 +codwaw +col +cs +cscz +csgo +css,libtinfo5:i386 +dab +dmc +dod +dodr +dods +doi +dst,libcurl4-gnutls-dev:i386 +dys +eco,libgdiplus +em +etl +fctr +fof +gmod,libtinfo5:i386 +hl2dm +hldm +hldms +hw,lib32z1 +ins +inss +ios +jc2 +jc3 +jk2 +kf +kf2 +lo +l4d +l4d2 +mc,openjdk-16-jre +mcb +mh +mohaa,libstdc++5:i386 +mom +mta +mumble +nd +nmrih,libtinfo5:i386 +ns +ns2,speex,libtbb2 +ns2c,speex:i386,libtbb2 +onset +opfor +pc +pmc,openjdk-16-jre +pstbs,libgconf-2-4 +pvkii +pvr,libc++1 +pz +q2 +q3 +ql +qw +ricochet +ro +rtcw +rust,lib32z1 +rw,openjdk-16-jre +samp +sb +sbots +scpsl,mono-complete +scpslsm,mono-complete +sdtd,telnet,expect +sfc,libtinfo5:i386 +sof2 +sol +squad +st +sven,libssl1.1:i386,zlib1g:i386 +terraria +tf2,libcurl4-gnutls-dev:i386 +tfc +ts +ts3 +tu +tw +unt +ut +ut2k4 +ut3 +ut99 +vh,libc6-dev +vs +vints,mono-complete +wet +wf +wmc,openjdk-16-jre +wurm,xvfb +zmr,libtinfo5:i386 +zps,libtinfo5:i386 diff --git a/lgsm/functions/check.sh b/lgsm/functions/check.sh index 523445c5d..761846c58 100755 --- a/lgsm/functions/check.sh +++ b/lgsm/functions/check.sh @@ -54,7 +54,7 @@ for allowed_command in "${allowed_commands_array[@]}"; do fi done -allowed_commands_array=( DEBUG START STOP ) +allowed_commands_array=( DEBUG START ) for allowed_command in "${allowed_commands_array[@]}"; do if [ "${allowed_command}" == "${commandname}" ]; then check_deps.sh diff --git a/lgsm/functions/check_deps.sh b/lgsm/functions/check_deps.sh index 0e18b9f32..3e3d6a1b6 100755 --- a/lgsm/functions/check_deps.sh +++ b/lgsm/functions/check_deps.sh @@ -3,204 +3,85 @@ # Author: Daniel Gibbs # Contributors: http://linuxgsm.com/contrib # Website: https://linuxgsm.com -# Description: Checks if required dependencies are installed for LinuxGSM. +# Description: Checks and installs missing dependencies. functionselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" fn_install_mono_repo(){ - if [ "${monostatus}" != "0" ]; then - fn_print_dots "Adding Mono repository" - if [ "${autoinstall}" == "1" ]; then - sudo -n true > /dev/null 2>&1 - else - sudo -v > /dev/null 2>&1 - fi - if [ $? -eq 0 ]; then - fn_print_info_nl "Automatically adding Mono repository." - fn_script_log_info "Automatically adding Mono repository." - echo -en ".\r" - sleep 1 - echo -en "..\r" - sleep 1 - echo -en "...\r" - sleep 1 - 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" - 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" - 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" - eval "${cmd}" - else - 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" - monoautoinstall="1" - 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" - 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" - 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" - 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." - echo -e " https://www.mono-project.com/download/stable/#download-lin" - monoautoinstall="1" - fi - 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}" - 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}" - else - 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}" + if [ "${autodepinstall}" == "0" ]; then + fn_print_information_nl "Automatically adding Mono repository." + fn_script_log_info "Automatically adding Mono repository." + echo -en ".\r" + sleep 1 + echo -en "..\r" + sleep 1 + echo -en "...\r" + sleep 1 + echo -en " \r" + if [ "${distroid}" == "ubuntu" ]; then + if [ "${distroversion}" == "20.04" ]; then + cmd="sudo apt install gnupg ca-certificates;sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys 3FA7E0328081BFF6A14DA29AA6A19B38D3D831EF;echo 'deb https://download.mono-project.com/repo/ubuntu stable-focal main' | sudo tee /etc/apt/sources.list.d/mono-official-stable.list;sudo apt update" + elif [ "${distroversion}" == "18.04" ]; then + cmd="sudo apt install gnupg ca-certificates;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" + 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 ca-certificates;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" else - 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 - if [ $? != 0 ]; then - fn_print_failure_nl "Unable to install Mono repository." - fn_script_log_fatal "Unable to installMono repository." - monoautoinstall=1 - else - fn_print_complete_nl "Installing Mono repository completed." - fn_script_log_pass "Installing Mono repository completed." - monoautoinstall=0 - fi + elif [ "${distroid}" == "debian" ]; then + if [ "${distroversion}" == "10" ]; then + cmd="sudo apt install apt-transport-https dirmngr gnupg ca-certificates;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" + elif [ "${distroversion}" == "9" ]; then + cmd="sudo apt install apt-transport-https dirmngr gnupg ca-certificates;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" + else + monoautoinstall="1" fi - else - 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 " https://www.mono-project.com/download/stable/#download-lin" - fi - fi -} - -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 repository." - if [ "${autoinstall}" == "1" ]; then - sudo -n true > /dev/null 2>&1 - else - sudo -v > /dev/null 2>&1 - fi - if [ $? -eq 0 ]; then - echo -en ".\r" - sleep 1 - echo -en "..\r" - sleep 1 - echo -en "...\r" - sleep 1 - echo -en " \r" - cmd="sudo apt-add-repository universe" - eval "${cmd}" - if [ $? -eq 0 ]; then - fn_print_complete_nl "Installing universe repository completed." - fn_script_log_pass "Installing universe repository completed." + elif [ "${distroid}" == "centos" ]||[ "${distroid}" == "almalinux" ]||[ "${distroid}" == "rocky" ]; then + if [ "${distroversion}" == "8" ]; then + cmd="sudo rpmkeys --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'" + elif [ "${distroversion}" == "7" ]; then + cmd="sudo rpmkeys --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'" + else + monoautoinstall="1" + fi + elif [ "${distroid}" == "fedora" ]; then + if [ "${distroversion}" -ge "29" ]; then + cmd="sudo 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';dnf update" else - fn_print_failure_nl "Unable to install universe repository." - fn_script_log_fatal "Unable to install universe repository." + cmd="sudo 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" fi 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 "" - echo -e " sudo apt-add-repository universe" + monoautoinstall="1" fi - fi -} -fn_deps_detector(){ - # Checks if dependency is missing. -if [ "${javacheck}" == "1" ]; then - # Added for users using Oracle JRE to bypass check. - depstatus=0 - deptocheck="${javaversion}" - unset javacheck - - 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. - 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. - depstatus=0 - else - # Mono not installed or installed Mono < 5.0.0. - depstatus=1 - monostatus=1 - fi - 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 [ "$(command -v rpm 2>/dev/null)" ]; then - rpm -q "${deptocheck}" > /dev/null 2>&1 - depstatus=$? - fi + # Run the mono repo install. + eval "${cmd}" - if [ "${depstatus}" == "0" ]; then - # If dependency is found. - missingdep=0 - if [ "${commandname}" == "INSTALL" ]; then - echo -e "${green}${deptocheck}${default}" - fn_sleep_time - fi - else - # If dependency is not found. - missingdep=1 - if [ "${commandname}" == "INSTALL" ]; then - echo -e "${red}${deptocheck}${default}" - fn_sleep_time - fi - # Define required dependencies for SteamCMD. - if [ "${appid}" ]; then - # lib32gcc1 is now called lib32gcc-s1 in debian 11 - if { [ "${distroid}" == "debian" ]&&[ "${distroversion}" == "11" ]; }||{ [ "${distroid}" == "ubuntu" ]&&[ "${distroversion}" == "20.10" ]; } || { [ "${distroid}" == "pop" ]&&[ "${distroversion}" == "20.10" ]; }; then - if [ "${deptocheck}" == "glibc.i686" ]||[ "${deptocheck}" == "libstdc++64.i686" ]||[ "${deptocheck}" == "lib32gcc-s1" ]||[ "${deptocheck}" == "lib32stdc++6" ]; then - steamcmdfail=1 - fi + # Did Mono repo install correctly? + if [ "${monoautoinstall}" != "1" ]; then + if [ $? != 0 ]; then + fn_print_failure_nl "Unable to install Mono repository." + fn_script_log_fatal "Unable to install Mono repository." else - if [ "${deptocheck}" == "glibc.i686" ]||[ "${deptocheck}" == "libstdc++64.i686" ]||[ "${deptocheck}" == "lib32gcc1" ]||[ "${deptocheck}" == "lib32stdc++6" ]; then - steamcmdfail=1 - fi + fn_print_complete_nl "Installing Mono repository completed." + fn_script_log_pass "Installing Mono repository completed." fi fi - fi - # Missing dependencies are added to array_deps_missing. - if [ "${missingdep}" == "1" ]; then - array_deps_missing+=("${deptocheck}") + # Mono can not be auto installed with this distro. + if [ "${monoautoinstall}" == "1" ]; then + fn_print_warning_nl "Mono auto install not available for ${distroname}." + echo -e "Follow instructions on Mono website to install." + echo -e "https://www.mono-project.com/download/stable/#download-lin" + fn_script_log_warn "Unable to install Mono repository. Mono auto install not available for ${distroname}." + fi + + else + fn_print_information_nl "Installing Mono repository." + fn_print_warning_nl "$(whoami) does not have sudo access." + echo -e "Follow instructions on Mono website to install." + echo -e "https://www.mono-project.com/download/stable/#download-lin" + fn_script_log_warn "Unable to install Mono repository. $(whoami) does not have sudo access." fi } @@ -227,25 +108,51 @@ fn_deps_email(){ fi } -fn_found_missing_deps(){ +fn_install_missing_deps(){ + # If any dependencies are not installed. 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_sleep_time - if [ "${monostatus}" ]; then - fn_install_mono_repo - fi - if [ "${jqstatus}" ]; then - fn_print_warning_nl "jq is not available in the ${distroname} repository." - echo -e " * https://docs.linuxgsm.com/requirements/jq" + if [ "${commandname}" == "INSTALL" ]; then + fn_print_warning_nl "Missing dependencies: ${red}${array_deps_missing[*]}${default}" + fn_script_log_warn "Missing dependencies: ${array_deps_missing[*]}" + else + fn_print_dots "Missing dependencies" + fn_print_warn "Missing dependencies: ${red}${array_deps_missing[*]}${default}" + fn_script_log_warn "Missing dependencies: ${array_deps_missing[*]}" fi + fn_sleep_time + + # Attempt automatic dependency installation if [ "${autoinstall}" == "1" ]; then sudo -n true > /dev/null 2>&1 else sudo -v > /dev/null 2>&1 fi - if [ $? -eq 0 ]; then + autodepinstall="$?" + + if [ "${monostatus}" == "1" ]; then + fn_install_mono_repo + fi + + if [ "${commandname}" == "INSTALL" ]; then + if [ "${autodepinstall}" == "0" ]; then + fn_print_information_nl "$(whoami) has sudo access." + fn_script_log_info "$(whoami) has sudo access." + else + 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." + fi + fi + + + # Add sudo dpkg --add-architecture i386 if using i386 packages. + if [ "$(command -v dpkg-query 2>/dev/null)" ]; then + if printf '%s\n' "${array_deps_required[@]}" | grep -q -P 'i386'; then + i386installcommand="sudo dpkg --add-architecture i386; " + fi + fi + + # If automatic dependency install is available + if [ "${autodepinstall}" == "0" ]; then fn_print_information_nl "Automatically installing missing dependencies." fn_script_log_info "Automatically installing missing dependencies." echo -en ".\r" @@ -256,7 +163,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; ${i386installcommand}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[*]}" @@ -265,61 +172,31 @@ fn_found_missing_deps(){ cmd="sudo yum -y install ${array_deps_missing[*]}" eval "${cmd}" fi - if [ $? != 0 ]; then - 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 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 - echo -e " sudo yum install ${array_deps_missing[*]}" - fi - if [ "${steamcmdfail}" ]; then - echo -e "" - if [ "${commandname}" == "INSTALL" ]; 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." - fn_script_log_pass "Install dependencies completed." - fi - else - 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 "" + autodepinstall="$?" + fi + + # If automatic dependency install is unavailable. + if [ "${autodepinstall}" != "0" ]; 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[*]}" + echo -e "${i386installcommand}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 echo -e "sudo yum install ${array_deps_missing[*]}" fi - if [ "${steamcmdfail}" ]; then - echo -e "" - if [ "${commandname}" == "INSTALL" ]; 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 - if [ "${commandname}" == "INSTALL" ]; then - sleep 5 + + if [ "${steamcmdfail}" ]; then + if [ "${commandname}" == "INSTALL" ]; 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 if [ "${commandname}" == "INSTALL" ]; then fn_print_information_nl "Required dependencies already installed." @@ -329,272 +206,79 @@ fn_found_missing_deps(){ } fn_check_loop(){ - # Loop though required depenencies. + # Loop though required depenencies checking if they are installed. for deptocheck in ${array_deps_required[*]}; do fn_deps_detector done - # user to be informed of any missing dependencies. - fn_found_missing_deps + # user will be informed of any missing dependencies. + fn_install_missing_deps } -# Generate require dependencies for debian based systems. -fn_deps_build_debian(){ - # Generate array of missing deps. - 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 cpio ) - - # All servers except ts3, mumble, GTA and minecraft servers require lib32stdc++6 and lib32gcc1. - if [ "${shortname}" != "ts3" ]&&[ "${shortname}" != "mumble" ]&&[ "${shortname}" != "mc" ]&&[ "${shortname}" != "pmc" ]&&[ "${shortname}" != "wmc" ]&&[ "${engine}" != "renderware" ]; then - if [ "${arch}" == "x86_64" ]; then - # lib32gcc1 is now called lib32gcc-s1 in debian 11 - if { [ "${distroid}" == "debian" ]&&[ "${distroversion}" == "11" ]; }||{ [ "${distroid}" == "ubuntu" ]&&[ "${distroversion}" == "20.10" ]; }||{ [ "${distroid}" == "pop" ]&&[ "${distroversion}" == "20.10" ]; }; then - array_deps_required+=( lib32gcc-s1 lib32stdc++6 ) - else - array_deps_required+=( lib32gcc1 lib32stdc++6 ) - fi - else - array_deps_required+=( lib32stdc++6 ) - fi - fi - # If requires steamcmd. - if [ "${appid}" ]; 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 libsdl2-2.0-0:i386 ) - fi - fi - - # Game Specific requirements. - - # Natural Selection 2 (x64 only) - if [ "${shortname}" == "ns2" ]; then - array_deps_required+=( speex libtbb2 ) - # NS2: Combat - elif [ "${shortname}" == "ns2c" ]; then - array_deps_required+=( speex:i386 libtbb2 ) - # 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 - 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 - array_deps_required+=( libtinfo5:i386 ) - else - array_deps_required+=( libtinfo5 ) - fi - # Brainbread 2, Don't Starve Together & Team Fortress 2 - elif [ "${shortname}" == "bb2" ]||[ "${shortname}" == "dst" ]||[ "${shortname}" == "tf2" ]; then - array_deps_required+=( libcurl4-gnutls-dev: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 ) - # Barotrauma - elif [ "${shortname}" == "bt" ]; then - array_deps_required+=( libicu-dev ) - # Ecoserver - elif [ "${shortname}" == "eco" ]; then - array_deps_required+=( libgdiplus ) - # Factorio - elif [ "${shortname}" == "fctr" ]; then - array_deps_required+=( xz-utils ) - # Hurtword/Rust - elif [ "${shortname}" == "hw" ]||[ "${shortname}" == "rust" ]; then - array_deps_required+=( lib32z1 ) - # Minecraft, Rising World - elif [ "${shortname}" == "mc" ]||[ "${shortname}" == "pmc" ]||[ "${shortname}" == "wmc" ]; then - javaversion=$(java -version 2>&1 | grep "version") - if [ "${javaversion}" ]; then - # Added for users using Oracle JRE to bypass the check. - javacheck=1 - else - if { [ "${distroid}" == "ubuntu" ]&&[ "${distroversion}" == "20.04" ]; }||{ [ "${distroid}" == "ubuntu" ]&&[ "${distroversion}" == "20.10" ]; }||{ [ "${distroid}" == "ubuntu" ]&&[ "${distroversion}" == "21.04" ]; }||{ [ "${distroid}" == "pop" ]&&[ "${distroversion}" == "20.04" ]; }||{ [ "${distroid}" == "pop" ]&&[ "${distroversion}" == "20.10" ]; }||{ [ "${distroid}" == "pop" ]&&[ "${distroversion}" == "21.04" ]; }; then - array_deps_required+=( openjdk-16-jre ) - else - array_deps_required+=( default-jre ) - fi - fi - elif [ "${shortname}" == "rw" ]; then - javaversion=$(java -version 2>&1 | grep "version") - if [ "${javaversion}" ]; then - # Added for users using Oracle JRE to bypass the check. - javacheck=1 +# Checks if dependency is installed or not. +fn_deps_detector(){ + # Java: Added for users using Oracle JRE to bypass check. + if [[ ${deptocheck} == "openjdk"* ]]||[[ ${deptocheck} == "java"* ]]; then + # Is java already installed? + if [ -n "${javaversion}" ]; then + # Added for users using Oracle JRE to bypass check. + depstatus=0 + deptocheck="${javaversion}" else - array_deps_required+=( default-jre ) + depstatus=1 fi - # Onset - elif [ "${shortname}" == "onset" ]; then - array_deps_required+=( libmariadbclient-dev ) - # 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 ) + # Mono: A Mono repo needs to be installed. + elif [ "${deptocheck}" == "mono-complete" ]; then + if [ -n "${monoversion}" ]&&[ "${monoversion}" -ge "5" ]; then + # Mono >= 5.0.0 already installed. + depstatus=0 + monostatus=0 else - array_deps_required+=( default-jre rng-tools ) + # Mono not installed or installed Mono < 5.0.0. + depstatus=1 + monostatus=1 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 ) - # Vintage Story - elif [ "${shortname}" == "vints" ]; then - array_deps_required+=( mono-complete ) - # Wurm: Unlimited - elif [ "${shortname}" == "wurm" ]; then - array_deps_required+=( xvfb ) - # Post Scriptum - elif [ "${shortname}" == "pstbs" ]; then - array_deps_required+=( libgconf-2-4 ) - # Pavlov VR - elif [ "${shortname}" == "pvr" ]; then - array_deps_required+=( libc++1 ) - # Valheim ( for Plus mod) - elif [ "${shortname}" == "vh" ]; then - array_deps_required+=( libc6-dev ) + 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 [ "$(command -v dnf 2>/dev/null)" ]; then + dnf list installed "${deptocheck}" > /dev/null 2>&1 + depstatus=$? + elif [ "$(command -v rpm 2>/dev/null)" ]; then + rpm -q "${deptocheck}" > /dev/null 2>&1 + depstatus=$? fi - # check if system is a lxc container and the hostname dependency. - if command -v systemd-detect-virt &> /dev/null; then - systemd_virt=$(systemd-detect-virt) - if [ "${systemd_virt}" == "lxc" ]||[ "${systemd_virt}" == "lxc-libvirt" ]; then - array_deps_required+=( hostname ) + if [ "${depstatus}" == "0" ]; then + # If dependency is found. + missingdep=0 + if [ "${commandname}" == "INSTALL" ]; then + echo -e "${green}${deptocheck}${default}" + sleep 0.1 fi - fi - - fn_deps_email - fn_check_loop -} - -fn_deps_build_redhat(){ - # Generate array of missing deps. - array_deps_missing=() - - # 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 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 cpio ) - elif [ "${distroid}" == "fedora" ]; then - 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 cpio ) else - 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. - if [ "${shortname}" != "ts3" ]&&[ "${shortname}" != "mumble" ]&&[ "${shortname}" != "mc" ]&&[ "${engine}" != "renderware" ]; then - if [[ "${distroname}" == *"Amazon Linux AMI"* ]]; then - array_deps_required+=( glibc.i686 libstdc++64.i686 ) - else - array_deps_required+=( glibc.i686 libstdc++.i686 ) - fi - fi - - # Game Specific requirements. - - # Natural Selection 2 (x64 only) - if [ "${shortname}" == "ns2" ]; then - array_deps_required+=( speex tbb ) - # NS2: Combat - elif [ "${shortname}" == "ns2c" ]; then - array_deps_required+=( speex.i686 tbb.i686 ) - # 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 ) - # 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 - array_deps_required+=( libcurl.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 ) - # Ecoserver - elif [ "${shortname}" == "eco" ]; then - array_deps_required+=( libgdiplus ) - # Factorio - elif [ "${shortname}" == "fctr" ]; then - array_deps_required+=( xz ) - # Hurtword/Rust - elif [ "${shortname}" == "hw" ]||[ "${shortname}" == "rust" ]; then - array_deps_required+=( zlib-devel ) - # Minecraft, Rising World, Wurm - elif [ "${shortname}" == "mc" ]||[ "${shortname}" == "pmc" ]||[ "${shortname}" == "wmc" ]||[ "${shortname}" == "rw" ]; 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+=( java-11-openjdk ) + # If dependency is not found. + missingdep=1 + if [ "${commandname}" == "INSTALL" ]; then + echo -e "${red}${deptocheck}${default}" + sleep 0.1 fi - # 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 ) + # Define required dependencies for SteamCMD. + if [ -n "${appid}" ]; then + array_steamcmd_deps_required=("${depsteamcmd}") + for steamcmddeptocheck in ${array_steamcmd_deps_required[*]}; do + if [ "${deptocheck}" == "${steamcmddeptocheck}" ]; then + steamcmdfail=1 + fi + done fi - # Sven Co-op - elif [ "${shortname}" == "sven" ]; then - : # not compatible - # Vintage Story - elif [ "${shortname}" == "vints" ]; then - array_deps_required+=( mono-complete ) - # Wurm: Unlimited - elif [ "${shortname}" == "wurm" ]; then - array_deps_required+=( xorg-x11-server-Xvfb ) - # Post Scriptum - elif [ "${shortname}" == "pstbs" ]; then - array_deps_required+=( GConf2 ) - # Pavlov VR - elif [ "${shortname}" == "pvr" ]; then - array_deps_required+=( libcxx ) - # Valheim ( for Plus mod ) - elif [ "${shortname}" == "vh" ]; then - array_deps_required+=( glibc-devel ) fi + unset depstatus - # check if system is a lxc container and the hostname dependency. - if command -v systemd-detect-virt &> /dev/null; then - systemd_virt=$(systemd-detect-virt) - if [ "${systemd_virt}" == "lxc" ]||[ "${systemd_virt}" == "lxc-libvirt" ]; then - array_deps_required+=( hostname ) - fi + # Missing dependencies are added to array_deps_missing. + if [ "${missingdep}" == "1" ]; then + array_deps_missing+=("${deptocheck}") fi - - fn_deps_email - fn_check_loop } if [ "${commandname}" == "INSTALL" ]; then @@ -612,12 +296,45 @@ if [ "${commandname}" == "INSTALL" ]; then fi fi -# Filter checking in to Debian or Red Hat Based. info_distro.sh -if [ -f "/etc/debian_version" ]; then - fn_deps_build_debian -elif [ -f "/etc/redhat-release" ]; then - fn_deps_build_redhat -else - fn_print_warning_nl "${distroname} dependency checking unavailable." + +# some RHEL based distros use 8.4 instead of just 8. +if [[ "${distroidlike}" == *"rhel"* ]]||[ "${distroid}" == "rhel" ]; then + distroversion="${distroversionrh}" +fi + +if [ ! -f "${tmpdir}/dependency-no-check.tmp" ]&&[ ! -f "${datadir}/${distroid}-${distroversion}.csv" ]; then + # Check that the disto dependency csv file exists. + fn_check_file_github "lgsm/data" "${distroid}-${distroversion}.csv" + if [ -n "${checkflag}" ]&&[ "${checkflag}" == "0" ]; then + fn_fetch_file_github "lgsm/data" "${distroid}-${distroversion}.csv" "lgsm/data" "chmodx" "norun" "noforce" "nohash" + fi +fi + +# If the file successfully downloaded run the dependency check. +if [ -f "${datadir}/${distroid}-${distroversion}.csv" ]; then + depall=$(awk -F, '$1=="all" {$1=""; print $0}' "${datadir}/${distroid}-${distroversion}.csv") + depsteamcmd=$(awk -F, '$1=="steamcmd" {$1=""; print $0}' "${datadir}/${distroid}-${distroversion}.csv") + depshortname=$(awk -v shortname="$shortname" -F, '$1==shortname {$1=""; print $0}' "${datadir}/${distroid}-${distroversion}.csv") + + # Generate array of missing deps. + array_deps_missing=() + + array_deps_required=("${depall} ${depsteamcmd} ${depshortname}") + fn_deps_email + # Unique sort dependency array. + IFS=" " read -r -a array_deps_required <<< "$(echo "${array_deps_required[@]}" | tr ' ' '\n' | sort -u | tr '\n' ' ')" + + fn_check_loop +# Warn the user that dependency checking is unavailable for their distro. +elif [ "${commandname}" == "INSTALL" ]||[ -n "${checkflag}" ]&&[ "${checkflag}" != "0" ]; then + fn_print_warning_nl "LinuxGSM dependency checking currently unavailable for ${distroname}." + # Prevent future dependency checking if unavailable for the distro. + echo "${version}" > "${tmpdir}/dependency-no-check.tmp" +elif [ -f "${tmpdir}/dependency-no-check.tmp" ]; then + # Allow LinuxGSM to try a dependency check if LinuxGSM has been recently updated. + nocheckversion=$(cat "${tmpdir}/dependency-no-check.tmp") + if [ "${version}" != "${nocheckversion}" ]; then + rm -f "${tmpdir:?}/dependency-no-check.tmp" + fi fi diff --git a/lgsm/functions/core_dl.sh b/lgsm/functions/core_dl.sh index 9d80913a7..33b2b7120 100755 --- a/lgsm/functions/core_dl.sh +++ b/lgsm/functions/core_dl.sh @@ -252,6 +252,75 @@ fn_fetch_trap(){ core_exit.sh } +# Will check a file exists and download it. Will not exit if fails to download. +fn_check_file(){ + remote_fileurl="${1}" + remote_fileurl_backup="${2}" + remote_fileurl_name="${3}" + remote_fileurl_backup_name="${4}" + remote_filename="${5}" + # 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 + 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)) + echo -en "checking ${fileurl_name} ${remote_filename}...\c" + curlcmd=$(curl --output /dev/null --silent --head --fail "${fileurl}" 2>&1) + local exitcode=$? + + # On first try will error. On second try will fail. + if [ "${exitcode}" != 0 ]; then + if [ ${counter} -ge 2 ]; then + fn_print_fail_eol_nl + if [ -f "${lgsmlog}" ]; then + fn_script_log_fatal "Checking ${remote_filename}" + fn_script_log_fatal "${fileurl}" + checkflag=1 + fi + else + fn_print_error_eol_nl + if [ -f "${lgsmlog}" ]; then + fn_script_log_error "Checking ${remote_filename}" + fn_script_log_error "${fileurl}" + checkflag=2 + fi + fi + else + fn_print_ok_eol + sleep 0.3 + echo -en "\033[2K\\r" + if [ -f "${lgsmlog}" ]; then + fn_script_log_pass "Checking ${remote_filename}" + checkflag=0 + fi + break + fi + done + + if [ -f "${local_filedir}/${local_filename}" ]; then + fn_dl_hash + # Execute file if run is set. + if [ "${run}" == "run" ]; then + # shellcheck source=/dev/null + source "${local_filedir}/${local_filename}" + fi + fi +} + fn_fetch_file(){ remote_fileurl="${1}" remote_fileurl_backup="${2}" @@ -361,8 +430,8 @@ fn_fetch_file(){ # 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 +# github_fileurl_dir: the directory of the file in the GitHub: lgsm/functions +# github_fileurl_name: the filename of the file to download from GitHub: core_messages.sh # githuburl: the full GitHub url # remote_fileurl: The URL of the file: http://example.com/dl/File.tar.bz2 @@ -375,24 +444,24 @@ fn_fetch_file(){ # Fetches files from the Git repo. fn_fetch_file_github(){ - github_file_url_dir="${1}" - github_file_url_name="${2}" + github_fileurl_dir="${1}" + github_fileurl_name="${2}" # For legacy versions - code can be removed at a future date if [ "${legacymode}" == "1" ]; then - 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}" + remote_fileurl="https://raw.githubusercontent.com/${githubuser}/${githubrepo}/${githubbranch}/${github_fileurl_dir}/${github_fileurl_name}" + remote_fileurl_backup="https://bitbucket.org/${githubuser}/${githubrepo}/raw/${githubbranch}/${github_fileurl_dir}/${github_fileurl_name}" # 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}" + remote_fileurl="https://raw.githubusercontent.com/${githubuser}/${githubrepo}/${version}/${github_fileurl_dir}/${github_fileurl_name}" + remote_fileurl_backup="https://bitbucket.org/${githubuser}/${githubrepo}/raw/${version}/${github_fileurl_dir}/${github_fileurl_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}" + remote_fileurl="https://raw.githubusercontent.com/${githubuser}/${githubrepo}/${githubbranch}/${github_fileurl_dir}/${github_fileurl_name}" + remote_fileurl_backup="https://bitbucket.org/${githubuser}/${githubrepo}/raw/${githubbranch}/${github_fileurl_dir}/${github_fileurl_name}" fi remote_fileurl_name="GitHub" remote_fileurl_backup_name="Bitbucket" local_filedir="${3}" - local_filename="${github_file_url_name}" + local_filename="${github_fileurl_name}" chmodx="${4:-0}" run="${5:-0}" forcedl="${6:-0}" @@ -401,17 +470,32 @@ fn_fetch_file_github(){ fn_fetch_file "${remote_fileurl}" "${remote_fileurl_backup}" "${remote_fileurl_name}" "${remote_fileurl_backup_name}" "${local_filedir}" "${local_filename}" "${chmodx}" "${run}" "${forcedl}" "${hash}" } +fn_check_file_github(){ + github_fileurl_dir="${1}" + github_fileurl_name="${2}" + if [ "${githubbranch}" == "master" ]&&[ "${githubuser}" == "GameServerManager" ]&&[ "${commandname}" != "UPDATE-LGSM" ]; then + remote_fileurl="https://raw.githubusercontent.com/${githubuser}/${githubrepo}/${version}/${github_fileurl_dir}/${github_fileurl_name}" + remote_fileurl_backup="https://bitbucket.org/${githubuser}/${githubrepo}/raw/${version}/${github_fileurl_dir}/${github_fileurl_name}" + else + remote_fileurl="https://raw.githubusercontent.com/${githubuser}/${githubrepo}/${githubbranch}/${github_fileurl_dir}/${github_fileurl_name}" + remote_fileurl_backup="https://bitbucket.org/${githubuser}/${githubrepo}/raw/${githubbranch}/${github_fileurl_dir}/${github_fileurl_name}" + fi + remote_fileurl_name="GitHub" + remote_fileurl_backup_name="Bitbucket" + fn_check_file "${remote_fileurl}" "${remote_fileurl_backup}" "${remote_fileurl_name}" "${remote_fileurl_backup_name}" "${github_fileurl_name}" +} + # Fetches config files from the Git repo. fn_fetch_config(){ - github_file_url_dir="${1}" - github_file_url_name="${2}" + github_fileurl_dir="${1}" + github_fileurl_name="${2}" # 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}" + remote_fileurl="https://raw.githubusercontent.com/${githubuser}/${githubrepo}/${version}/${github_fileurl_dir}/${github_fileurl_name}" + remote_fileurl_backup="https://bitbucket.org/${githubuser}/${githubrepo}/raw/${version}/${github_fileurl_dir}/${github_fileurl_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}" + remote_fileurl="https://raw.githubusercontent.com/${githubuser}/${githubrepo}/${githubbranch}/${github_fileurl_dir}/${github_fileurl_name}" + remote_fileurl_backup="https://bitbucket.org/${githubuser}/${githubrepo}/raw/${githubbranch}/${github_fileurl_dir}/${github_fileurl_name}" fi remote_fileurl_name="GitHub" remote_fileurl_backup_name="Bitbucket" @@ -427,20 +511,20 @@ fn_fetch_config(){ # Fetches modules from the Git repo during first download. fn_fetch_function(){ - github_file_url_dir="lgsm/functions" - github_file_url_name="${functionfile}" + github_fileurl_dir="lgsm/functions" + github_fileurl_name="${functionfile}" # 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}" + remote_fileurl="https://raw.githubusercontent.com/${githubuser}/${githubrepo}/${version}/${github_fileurl_dir}/${github_fileurl_name}" + remote_fileurl_backup="https://bitbucket.org/${githubuser}/${githubrepo}/raw/${version}/${github_fileurl_dir}/${github_fileurl_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}" + remote_fileurl="https://raw.githubusercontent.com/${githubuser}/${githubrepo}/${githubbranch}/${github_fileurl_dir}/${github_fileurl_name}" + remote_fileurl_backup="https://bitbucket.org/${githubuser}/${githubrepo}/raw/${githubbranch}/${github_fileurl_dir}/${github_fileurl_name}" fi remote_fileurl_name="GitHub" remote_fileurl_backup_name="Bitbucket" local_filedir="${functionsdir}" - local_filename="${github_file_url_name}" + local_filename="${github_fileurl_name}" chmodx="chmodx" run="run" forcedl="noforce" @@ -451,20 +535,20 @@ fn_fetch_function(){ # Fetches modules from the Git repo during update-lgsm. fn_update_function(){ - github_file_url_dir="lgsm/functions" - github_file_url_name="${functionfile}" + github_fileurl_dir="lgsm/functions" + github_fileurl_name="${functionfile}" # 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}" + remote_fileurl="https://raw.githubusercontent.com/${githubuser}/${githubrepo}/${version}/${github_fileurl_dir}/${github_fileurl_name}" + remote_fileurl_backup="https://bitbucket.org/${githubuser}/${githubrepo}/raw/${version}/${github_fileurl_dir}/${github_fileurl_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}" + remote_fileurl="https://raw.githubusercontent.com/${githubuser}/${githubrepo}/${githubbranch}/${github_fileurl_dir}/${github_fileurl_name}" + remote_fileurl_backup="https://bitbucket.org/${githubuser}/${githubrepo}/raw/${githubbranch}/${github_fileurl_dir}/${github_fileurl_name}" fi remote_fileurl_name="GitHub" remote_fileurl_backup_name="Bitbucket" local_filedir="${functionsdir}" - local_filename="${github_file_url_name}" + local_filename="${github_fileurl_name}" chmodx="chmodx" run="norun" forcedl="noforce" diff --git a/lgsm/functions/info_distro.sh b/lgsm/functions/info_distro.sh index eda17f8d1..dcde3ba7e 100755 --- a/lgsm/functions/info_distro.sh +++ b/lgsm/functions/info_distro.sh @@ -10,19 +10,19 @@ 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} " | awk '{print $NF}')" if [ "${engine}" == "source" ]; then - srcdslinuxpid=$(ps -ef | grep -v grep | grep "${gameserverpid}" | grep srcds_linux | awk '{print $2}') + srcdslinuxpid="$(ps -ef | grep -v grep | grep "${gameserverpid}" | grep srcds_linux | awk '{print $2}')" elif [ "${engine}" == "goldsrc" ]; then - hldslinuxpid=$(ps -ef | grep -v grep | grep "${gameserverpid}" | grep hlds_linux | awk '{print $2}') + hldslinuxpid="$(ps -ef | grep -v grep | grep "${gameserverpid}" | grep hlds_linux | awk '{print $2}')" fi fi ### Distro information ## Distro # Returns architecture, kernel and distro/os. -arch=$(uname -m) -kernel=$(uname -r) +arch="$(uname -m)" +kernel="$(uname -r)" # Distro Name - Ubuntu 16.04 LTS # Distro Version - 16.04 @@ -33,46 +33,49 @@ kernel=$(uname -r) distro_info_array=( os-release lsb_release hostnamectl debian_version redhat-release ) 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') - 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') + distroname="$(grep "PRETTY_NAME" /etc/os-release | awk -F\= '{gsub(/"/,"",$2);print $2}')" + distroversion="$(grep "VERSION_ID" /etc/os-release | awk -F\= '{gsub(/"/,"",$2);print $2}')" + # Special var for rhel like distros to removed point in number e.g 8.4 to just 8. + distroversionrh="$(printf "%.0f\n" "${distroversion}")" + distroid="$(grep "ID=" /etc/os-release | grep -v _ID | awk -F\= '{gsub(/"/,"",$2);print $2}')" + distroidlike="$(grep "ID_LIKE=" /etc/os-release | grep -v _ID | awk -F\= '{gsub(/"/,"",$2);print $2}')" + distrocodename="$(grep "VERSION_CODENAME" /etc/os-release | awk -F\= '{gsub(/"/,"",$2);print $2}')" elif [ "$(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) + distroid="$(lsb_release -si)" elif [ -z "${distrocodename}" ]; then - distrocodename=$(lsb_release -sc) + distrocodename="$(lsb_release -sc)" fi 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') + 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 elif [ -f "/etc/redhat-release" ]&&[ "${distro_info}" == "redhat-release" ]; then if [ -z "${distroname}" ]; then - distroname=$(cat /etc/redhat-release) + distroname="$(cat /etc/redhat-release)" elif [ -z "${distroversion}" ]; then - distroversion=$(rpm -qa \*-release | grep -Ei "oracle|redhat|centos|fedora" | cut -d"-" -f3) + 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 @@ -84,34 +87,38 @@ else if [ "${tmuxvdigit}" -lt "16" ]; then tmuxv="$(tmux -V) (>= 1.6 required for console log)" else - tmuxv=$(tmux -V) + tmuxv="$(tmux -V)" fi fi if [ "$(command -V java 2>/dev/null)" ]; then - javaversion=$(java -version 2>&1 | grep "version") + javaversion="$(java -version 2>&1 | grep "version")" +fi + +if [ "$(command -v mono 2>/dev/null)" ]; then + monoversion="$(mono --version 2>&1 | grep -Po '(?<=version )\d')" fi ## Uptime -uptime=$(/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. - 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}') + 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. if grep -q ^MemAvailable /proc/meminfo; then - physmemactualfreekb=$(grep ^MemAvailable /proc/meminfo | awk '{print $2}') + 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)) - 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") - physmemavailable=$(numfmt --to=iec --from=iec --suffix=B "${physmemactualfreekb}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") - swapused=$(numfmt --to=iec --from=iec --suffix=B "$(($(grep ^SwapTotal /proc/meminfo | awk '{print $2}')-$(grep ^SwapFree /proc/meminfo | awk '{print $2}')))K") + 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")" + physmemavailable="$(numfmt --to=iec --from=iec --suffix=B "${physmemactualfreekb}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")" + 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 [ "${gameserverpid}" ]; then - memused=$(ps --forest -o rss -g "${gameserverpid}" | awk '{s+=$1} END {print s}'| awk '{$1/=1024;printf "%.0f",$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}') + pmemused="$(ps --forest -o %mem -g "${gameserverpid}" | awk '{s+=$1} END {print s}')" fi else -# Older distros will need to use free. + # Older distros will need to use free. # Older versions of free do not support -h option. if [ "$(free -h > /dev/null 2>&1; echo $?)" -ne "0" ]; then humanreadable="-m" else humanreadable="-h" fi - physmemtotalmb=$(free -m | awk '/Mem:/ {print $2}') - physmemtotal=$(free ${humanreadable} | awk '/Mem:/ {print $2}') - physmemfree=$(free ${humanreadable} | awk '/Mem:/ {print $4}') - physmemused=$(free ${humanreadable} | awk '/Mem:/ {print $3}') + physmemtotalmb="$(free -m | awk '/Mem:/ {print $2}')" + physmemtotal="$(free ${humanreadable} | awk '/Mem:/ {print $2}')" + physmemfree="$(free ${humanreadable} | awk '/Mem:/ {print $4}')" + physmemused="$(free ${humanreadable} | awk '/Mem:/ {print $3}')" - oldfree=$(free ${humanreadable} | awk '/cache:/') + oldfree="$(free ${humanreadable} | awk '/cache:/')" if [ "${oldfree}" ]; then physmemavailable="n/a" physmemcached="n/a" else - physmemavailable=$(free ${humanreadable} | awk '/Mem:/ {print $7}') - physmemcached=$(free ${humanreadable} | awk '/Mem:/ {print $6}') + physmemavailable="$(free ${humanreadable} | awk '/Mem:/ {print $7}')" + physmemcached="$(free ${humanreadable} | awk '/Mem:/ {print $6}')" fi - swaptotal=$(free ${humanreadable} | awk '/Swap:/ {print $2}') - swapused=$(free ${humanreadable} | awk '/Swap:/ {print $3}') - swapfree=$(free ${humanreadable} | awk '/Swap:/ {print $4}') + swaptotal="$(free ${humanreadable} | awk '/Swap:/ {print $2}')" + swapused="$(free ${humanreadable} | awk '/Swap:/ {print $3}')" + swapfree="$(free ${humanreadable} | awk '/Swap:/ {print $4}')" fi ### Disk information ## Available disk space on the partition. -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}') +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}') +rootdirdu="$(du -sh "${rootdir}" 2> /dev/null | awk '{print $1}')" if [ -z "${rootdirdu}" ]; then rootdirdu="0M" fi ## LinuxGSM used space in serverfiles dir. -serverfilesdu=$(du -sh "${serverfiles}" 2> /dev/null | awk '{print $1}') +serverfilesdu="$(du -sh "${serverfiles}" 2> /dev/null | awk '{print $1}')" if [ -z "${serverfilesdu}" ]; then serverfilesdu="0M" fi ## LinuxGSM used space total minus backup dir. -rootdirduexbackup=$(du -sh --exclude="${backupdir}" "${serverfiles}" 2> /dev/null | awk '{print $1}') +rootdirduexbackup="$(du -sh --exclude="${backupdir}" "${serverfiles}" 2> /dev/null | awk '{print $1}')" if [ -z "${rootdirduexbackup}" ]; then rootdirduexbackup="0M" fi @@ -209,7 +216,7 @@ fi ## Backup info if [ -d "${backupdir}" ]; then # Used space in backups dir. - backupdirdu=$(du -sh "${backupdir}" | awk '{print $1}') + backupdirdu="$(du -sh "${backupdir}" | awk '{print $1}')" # If no backup dir, size is 0M. if [ -z "${backupdirdu}" ]; then backupdirdu="0M" @@ -221,15 +228,15 @@ if [ -d "${backupdir}" ]; then # If there are backups in backup dir. if [ "$(find "${backupdir}" -name "*.tar.gz" | wc -l)" -ne "0" ]; then # number of backups. - backupcount=$(find "${backupdir}"/*.tar.gz | wc -l) + backupcount="$(find "${backupdir}"/*.tar.gz | wc -l)" # most recent backup. - lastbackup=$(ls -1t "${backupdir}"/*.tar.gz | head -1) + lastbackup="$(ls -1t "${backupdir}"/*.tar.gz | head -1)" # date of most recent backup. - lastbackupdate=$(date -r "${lastbackup}") + lastbackupdate="$(date -r "${lastbackup}")" # no of days since last backup. - lastbackupdaysago=$(( ( $(date +'%s') - $(date -r "${lastbackup}" +'%s') )/60/60/24 )) + lastbackupdaysago="$(( ( $(date +'%s') - $(date -r "${lastbackup}" +'%s') )/60/60/24 ))" # size of most recent backup. - lastbackupsize=$(du -h "${lastbackup}" | awk '{print $1}') + lastbackupsize="$(du -h "${lastbackup}" | awk '{print $1}')" fi fi @@ -239,7 +246,7 @@ netlink=$(${ethtoolcommand} "${netint}" 2>/dev/null| grep Speed | awk '{print $2 # External IP address if [ -z "${extip}" ]; then - extip=$(curl --connect-timeout 10 -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 @@ -247,14 +254,14 @@ 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 fn_print_error_nl "Unable to get external IP" fi fi else if [ -f "${tmpdir}/extip.txt" ]; then - extip=$(cat "${tmpdir}/extip.txt") + extip="$(cat "${tmpdir}/extip.txt")" else fn_print_error_nl "Unable to get external IP" fi @@ -271,26 +278,27 @@ else fi # Steam Master Server - checks if detected by master server. -if [ "$(command -v jq 2>/dev/null)" ]; then - if [ "${ip}" ]&&[ "${port}" ]; then - if [ "${steammaster}" == "true" ]||[ ${commandname} == "DEV-QUERY-RAW" ]; then - # Will query server IP addresses first. - for queryip in "${queryips[@]}"; do - 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 --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" - else - displaymasterserver="true" +if [ -z "${displaymasterserver}" ]; then + if [ "$(command -v jq 2>/dev/null)" ]; then + if [ "${ip}" ]&&[ "${port}" ]; then + if [ "${steammaster}" == "true" ]||[ "${commandname}" == "DEV-QUERY-RAW" ]; then + # Will query server IP addresses first. + for queryip in "${queryips[@]}"; do + 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 --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" + else + displaymasterserver="true" + fi fi fi fi fi - # Sets the SteamCMD glibc requirement if the game server requirement is less or not required. if [ "${appid}" ]; then if [ "${glibc}" = "null" ]||[ -z "${glibc}" ]||[ "$(printf '%s\n'${glibc}'\n' "2.14" | sort -V | head -n 1)" != "2.14" ]; then diff --git a/lgsm/functions/info_game.sh b/lgsm/functions/info_game.sh index e67bd93bf..46bcece5b 100644 --- a/lgsm/functions/info_game.sh +++ b/lgsm/functions/info_game.sh @@ -2035,6 +2035,27 @@ fn_info_game_vh(){ servername=${servername:-"NOT SET"} } +fn_info_game_vints(){ + 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 +} + fn_info_game_wet(){ # Config if [ ! -f "${servercfgfullpath}" ]; then diff --git a/lgsm/functions/install_config.sh b/lgsm/functions/install_config.sh index 96ae7a1ea..8bc9a380a 100755 --- a/lgsm/functions/install_config.sh +++ b/lgsm/functions/install_config.sh @@ -159,7 +159,6 @@ fn_list_config_locations(){ 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 diff --git a/lgsm/functions/install_server_dir.sh b/lgsm/functions/install_server_dir.sh index 9e75fb488..658f4360c 100755 --- a/lgsm/functions/install_server_dir.sh +++ b/lgsm/functions/install_server_dir.sh @@ -15,7 +15,6 @@ if [ -d "${serverfiles}" ]; then fn_print_warning_nl "A server is already installed here." fi pwd -echo -e "" if [ -z "${autoinstall}" ]; then if ! fn_prompt_yn "Continue?" Y; then exitcode=0 diff --git a/lgsm/functions/install_server_files.sh b/lgsm/functions/install_server_files.sh index b6b9f5240..8ac1704dd 100755 --- a/lgsm/functions/install_server_files.sh +++ b/lgsm/functions/install_server_files.sh @@ -73,6 +73,7 @@ echo -e "=================================" fn_sleep_time if [ "${appid}" ]; then + remotelocation="SteamCMD" fn_dl_steamcmd fi From c8d1a7c2a16018d59bf3dada09a6c2fc18a738fe Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Sat, 25 Sep 2021 11:50:46 +0100 Subject: [PATCH 056/164] feat(newserver): Last Oasis (#3565) Co-authored-by: Claiyc <58397976+Claiyc@users.noreply.github.com> --- .../config-lgsm/loserver/_default.cfg | 189 ++++++++++++++++++ lgsm/data/serverlist.csv | 1 + lgsm/functions/info_messages.sh | 12 ++ 3 files changed, 202 insertions(+) create mode 100644 lgsm/config-default/config-lgsm/loserver/_default.cfg mode change 100644 => 100755 lgsm/functions/info_messages.sh diff --git a/lgsm/config-default/config-lgsm/loserver/_default.cfg b/lgsm/config-default/config-lgsm/loserver/_default.cfg new file mode 100644 index 000000000..4f003de83 --- /dev/null +++ b/lgsm/config-default/config-lgsm/loserver/_default.cfg @@ -0,0 +1,189 @@ +################################## +######## 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' + +## Predefined Parameters | https://docs.linuxgsm.com/configuration/start-parameters +servername="LinuxGSM" +ip="0.0.0.0" +port="7777" +queryport="27015" +customerkey="" +providerkey="" +slots="100" + +## Server Parameters | https://docs.linuxgsm.com/configuration/start-parameters#additional-parameters +# For specific IP use: -OverrideConnectionAddress=${ip} +startparameters="-log -force_steamclient_link -messaging -NoLiveServer -EnableCheats -backendapiurloverride="backend.last-oasis.com" -identifier=${servername} -port=${port} -CustomerKey=${customerkey} -ProviderKey=${providerkey} -slots=${slots} -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) + +# 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". +telegramapi="api.telegram.org" +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="920720" +steamcmdforcewindows="no" +# 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="1" +querytype="" + +## Console type +consoleverbose="yes" +consoleinteract="no" + +## Game Server Details +# Do not edit +gamename="Last Oasis" +engine="unreal4" +glibc="2.17" + +#### Directories #### +# Edit with care + +## Game Server Directories +systemdir="${serverfiles}/Mist" +executabledir="${systemdir}/Binaries/Linux" +executable="./MistServer-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}/${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 e5e290efc..4bad355a6 100644 --- a/lgsm/data/serverlist.csv +++ b/lgsm/data/serverlist.csv @@ -52,6 +52,7 @@ jc3,jc3server,Just Cause 3 jk2,jk2server,Jedi Knight II: Jedi Outcast kf,kfserver,Killing Floor kf2,kf2server,Killing Floor 2 +lo,loserver,Last Oasis l4d,l4dserver,Left 4 Dead l4d2,l4d2server,Left 4 Dead 2 mc,mcserver,Minecraft diff --git a/lgsm/functions/info_messages.sh b/lgsm/functions/info_messages.sh old mode 100644 new mode 100755 index 9a143f8e7..ef3b0a7b3 --- a/lgsm/functions/info_messages.sh +++ b/lgsm/functions/info_messages.sh @@ -1032,6 +1032,16 @@ fn_info_message_jk2(){ } | column -s $'\t' -t } +fn_info_message_lo(){ + echo -e "netstat -atunp | grep MistServer" + 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_kf(){ { fn_port "header" @@ -1643,6 +1653,8 @@ fn_info_message_select_engine(){ fn_info_message_jc3 elif [ "${shortname}" == "jk2" ]; then fn_info_message_jk2 + elif [ "${shortname}" == "lo" ]; then + fn_info_message_lo elif [ "${shortname}" == "kf" ]; then fn_info_message_kf elif [ "${shortname}" == "kf2" ]; then From 95de7bfa8f7b66a63a5c723b8ecb3100ef7493be Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Sat, 25 Sep 2021 11:58:54 +0100 Subject: [PATCH 057/164] added missing gotify alert to loserver --- lgsm/config-default/config-lgsm/loserver/_default.cfg | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/lgsm/config-default/config-lgsm/loserver/_default.cfg b/lgsm/config-default/config-lgsm/loserver/_default.cfg index 4f003de83..9bf9ea90e 100644 --- a/lgsm/config-default/config-lgsm/loserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/loserver/_default.cfg @@ -51,6 +51,11 @@ emailalert="off" email="email@example.com" emailfrom="" +# Gotify Alerts | https://docs.linuxgsm.com/alerts/gotify +gotifyalert="off" +gotifytoken="token" +gotifywebhook="webhook" + # IFTTT Alerts | https://docs.linuxgsm.com/alerts/ifttt iftttalert="off" ifttttoken="accesstoken" From f6c982746ba02065f3073f8caec797d0015b4adc Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Sat, 25 Sep 2021 12:45:11 +0100 Subject: [PATCH 058/164] Release v21.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 0f18642e4..e9a4aab6f 100755 --- a/lgsm/functions/core_functions.sh +++ b/lgsm/functions/core_functions.sh @@ -8,7 +8,7 @@ functionselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" -modulesversion="v21.2.5" +modulesversion="v21.3.0" # Core diff --git a/linuxgsm.sh b/linuxgsm.sh index 462ea09ad..a70a50f13 100755 --- a/linuxgsm.sh +++ b/linuxgsm.sh @@ -20,7 +20,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="v21.2.5" +version="v21.3.0" shortname="core" gameservername="core" commandname="CORE" diff --git a/tests/tests_fctrserver.sh b/tests/tests_fctrserver.sh index ef62e9724..4e3941a8d 100644 --- a/tests/tests_fctrserver.sh +++ b/tests/tests_fctrserver.sh @@ -20,7 +20,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="v21.2.5" +version="v21.3.0" shortname="fctr" gameservername="fctrserver" commandname="CORE" diff --git a/tests/tests_jc2server.sh b/tests/tests_jc2server.sh index 246ee76cd..d14025115 100644 --- a/tests/tests_jc2server.sh +++ b/tests/tests_jc2server.sh @@ -20,7 +20,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="v21.2.5" +version="v21.3.0" shortname="jc2" gameservername="jc2server" commandname="CORE" diff --git a/tests/tests_mcserver.sh b/tests/tests_mcserver.sh index 783580872..4866b92f3 100644 --- a/tests/tests_mcserver.sh +++ b/tests/tests_mcserver.sh @@ -20,7 +20,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="v21.2.5" +version="v21.3.0" shortname="mc" gameservername="mcserver" commandname="CORE" diff --git a/tests/tests_ts3server.sh b/tests/tests_ts3server.sh index 6d2b5d95f..ed52a0e67 100644 --- a/tests/tests_ts3server.sh +++ b/tests/tests_ts3server.sh @@ -20,7 +20,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="v21.2.5" +version="v21.3.0" shortname="ts3" gameservername="ts3server" commandname="CORE" From 848a34bd6daac9b421ce57c3ab4dcd9031e8f716 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Sat, 25 Sep 2021 13:13:50 +0100 Subject: [PATCH 059/164] updating github actions and tidy up --- .github/FUNDING.yml | 2 +- .github/ISSUE_TEMPLATE/new-server-request.md | 2 +- .github/topissuebot.yml | 4 - .github/workflows/create-release.yml | 2 +- .github/workflows/lock.yml | 4 +- .github/write-good.yml | 4 - .travis.yml | 44 ------ CODE_OF_CONDUCT.md | 152 +++++++++++++------ CONTRIBUTING.md | 14 +- README.md | 6 +- 10 files changed, 121 insertions(+), 113 deletions(-) delete mode 100644 .github/topissuebot.yml delete mode 100644 .github/write-good.yml delete mode 100644 .travis.yml diff --git a/.github/FUNDING.yml b/.github/FUNDING.yml index 5712ac3e7..357dfdf6e 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: # Replace with a single Patreon username +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 diff --git a/.github/ISSUE_TEMPLATE/new-server-request.md b/.github/ISSUE_TEMPLATE/new-server-request.md index 84176741f..57bee9cbe 100644 --- a/.github/ISSUE_TEMPLATE/new-server-request.md +++ b/.github/ISSUE_TEMPLATE/new-server-request.md @@ -7,7 +7,7 @@ assignees: '' --- -## What game server would you like adding? +## What game server would you like to add? [game server] diff --git a/.github/topissuebot.yml b/.github/topissuebot.yml deleted file mode 100644 index 06c64ae01..000000000 --- a/.github/topissuebot.yml +++ /dev/null @@ -1,4 +0,0 @@ -# Configuration for top-issue-bot -labelName: ":thumbsup: Top Issue!" -labelColor: "f442c2" -numberOfIssuesToLabel: 5 diff --git a/.github/workflows/create-release.yml b/.github/workflows/create-release.yml index f82cb60d9..04b6adb87 100644 --- a/.github/workflows/create-release.yml +++ b/.github/workflows/create-release.yml @@ -10,7 +10,7 @@ jobs: runs-on: ubuntu-latest steps: # Drafts your next Release notes as Pull Requests are merged into "master" - - uses: release-drafter/release-drafter@v5 + - uses: release-drafter/release-drafter@v5.15.0 with: config-name: release-drafter.yml env: diff --git a/.github/workflows/lock.yml b/.github/workflows/lock.yml index bef7c74c6..733fe595d 100644 --- a/.github/workflows/lock.yml +++ b/.github/workflows/lock.yml @@ -2,13 +2,13 @@ name: 'Lock Threads' on: schedule: - - cron: '0 0 * * *' + - cron: '0 0 * * *' jobs: lock: runs-on: ubuntu-latest steps: - - uses: dessant/lock-threads@v2.0.3 + - uses: dessant/lock-threads@v2.1.2 with: github-token: ${{ secrets.GITHUB_TOKEN }} issue-lock-comment: > diff --git a/.github/write-good.yml b/.github/write-good.yml deleted file mode 100644 index 00eefa99c..000000000 --- a/.github/write-good.yml +++ /dev/null @@ -1,4 +0,0 @@ -# .github/write-good.yml -writeGood: true -alex: true -spellchecker: true diff --git a/.travis.yml b/.travis.yml deleted file mode 100644 index 0ea421b0e..000000000 --- a/.travis.yml +++ /dev/null @@ -1,44 +0,0 @@ -language: node_js -dist: bionic -node_js: - - "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 - -install: - - npm install gamedig - -addons: - apt: - packages: - - mailutils - - postfix - - jq - - lib32gcc1 - - lib32stdc++6 - - shellcheck - - libcurl4-openssl-dev - - libdw-dev - - cmake - -jobs: - include: - - 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/CODE_OF_CONDUCT.md b/CODE_OF_CONDUCT.md index 7fe220357..65a0143f5 100644 --- a/CODE_OF_CONDUCT.md +++ b/CODE_OF_CONDUCT.md @@ -1,73 +1,133 @@ + # Contributor Covenant Code of Conduct ## Our Pledge -In the interest of fostering an open and welcoming environment, we as -contributors and maintainers pledge to making participation in our project and -our community a harassment-free experience for everyone, regardless of age, body -size, disability, ethnicity, sex characteristics, gender identity and expression, -level of experience, education, socio-economic status, nationality, personal -appearance, race, religion, or sexual identity and orientation. +We as members, contributors, and leaders pledge to make participation in our +community a harassment-free experience for everyone, regardless of age, body +size, visible or invisible disability, ethnicity, sex characteristics, gender +identity and expression, level of experience, education, socio-economic status, +nationality, personal appearance, race, caste, color, religion, or sexual identity +and orientation. + +We pledge to act and interact in ways that contribute to an open, welcoming, +diverse, inclusive, and healthy community. ## Our Standards -Examples of behavior that contributes to creating a positive environment -include: +Examples of behavior that contributes to a positive environment for our +community include: -* Using welcoming and inclusive language -* Being respectful of differing viewpoints and experiences -* Gracefully accepting constructive criticism -* Focusing on what is best for the community -* Showing empathy towards other community members +* Demonstrating empathy and kindness toward other people +* Being respectful of differing opinions, viewpoints, and experiences +* Giving and gracefully accepting constructive feedback +* Accepting responsibility and apologizing to those affected by our mistakes, + and learning from the experience +* Focusing on what is best not just for us as individuals, but for the + overall community -Examples of unacceptable behavior by participants include: +Examples of unacceptable behavior include: -* The use of sexualized language or imagery and unwelcome sexual attention or advances -* Trolling, insulting/derogatory comments, and personal or political attacks +* The use of sexualized language or imagery, and sexual attention or + advances of any kind +* Trolling, insulting or derogatory comments, and personal or political attacks * Public or private harassment -* Publishing others' private information, such as a physical or electronic address, without explicit permission -* Other conduct which could reasonably be considered inappropriate in a professional setting +* Publishing others' private information, such as a physical or email + address, without their explicit permission +* Other conduct which could reasonably be considered inappropriate in a + professional setting -## Our Responsibilities +## Enforcement Responsibilities -Project maintainers are responsible for clarifying the standards of acceptable -behavior and are expected to take appropriate and fair corrective action in -response to any instances of unacceptable behavior. +Community leaders are responsible for clarifying and enforcing our standards of +acceptable behavior and will take appropriate and fair corrective action in +response to any behavior that they deem inappropriate, threatening, offensive, +or harmful. -Project maintainers have the right and responsibility to remove, edit, or -reject comments, commits, code, wiki edits, issues, and other contributions -that are not aligned to this Code of Conduct, or to ban temporarily or -permanently any contributor for other behaviors that they deem inappropriate, -threatening, offensive, or harmful. +Community leaders have the right and responsibility to remove, edit, or reject +comments, commits, code, wiki edits, issues, and other contributions that are +not aligned to this Code of Conduct, and will communicate reasons for moderation +decisions when appropriate. ## Scope -This Code of Conduct applies both within project spaces and in public spaces -when an individual is representing the project or its community. Examples of -representing a project or community include using an official project e-mail -address, posting via an official social media account, or acting as an appointed -representative at an online or offline event. Representation of a project may be -further defined and clarified by project maintainers. +This Code of Conduct applies within all community spaces, and also applies when +an individual is officially representing the community in public spaces. +Examples of representing our community include using an official e-mail address, +posting via an official social media account, or acting as an appointed +representative at an online or offline event. ## Enforcement Instances of abusive, harassing, or otherwise unacceptable behavior may be -reported by contacting the project team at me@danielgibbs.co.uk. All -complaints will be reviewed and investigated and will result in a response that -is deemed necessary and appropriate to the circumstances. The project team is -obligated to maintain confidentiality with regard to the reporter of an incident. -Further details of specific enforcement policies may be posted separately. +reported to the community leaders responsible for enforcement at +[INSERT CONTACT METHOD]. +All complaints will be reviewed and investigated promptly and fairly. + +All community leaders are obligated to respect the privacy and security of the +reporter of any incident. + +## Enforcement Guidelines + +Community leaders will follow these Community Impact Guidelines in determining +the consequences for any action they deem in violation of this Code of Conduct: + +### 1. Correction + +**Community Impact**: Use of inappropriate language or other behavior deemed +unprofessional or unwelcome in the community. + +**Consequence**: A private, written warning from community leaders, providing +clarity around the nature of the violation and an explanation of why the +behavior was inappropriate. A public apology may be requested. + +### 2. Warning + +**Community Impact**: A violation through a single incident or series +of actions. -Project maintainers who do not follow or enforce the Code of Conduct in good -faith may face temporary or permanent repercussions as determined by other -members of the project's leadership. +**Consequence**: A warning with consequences for continued behavior. No +interaction with the people involved, including unsolicited interaction with +those enforcing the Code of Conduct, for a specified period of time. This +includes avoiding interactions in community spaces as well as external channels +like social media. Violating these terms may lead to a temporary or +permanent ban. + +### 3. Temporary Ban + +**Community Impact**: A serious violation of community standards, including +sustained inappropriate behavior. + +**Consequence**: A temporary ban from any sort of interaction or public +communication with the community for a specified period of time. No public or +private interaction with the people involved, including unsolicited interaction +with those enforcing the Code of Conduct, is allowed during this period. +Violating these terms may lead to a permanent ban. + +### 4. Permanent Ban + +**Community Impact**: Demonstrating a pattern of violation of community +standards, including sustained inappropriate behavior, harassment of an +individual, or aggression toward or disparagement of classes of individuals. + +**Consequence**: A permanent ban from any sort of public interaction within +the community. ## Attribution -This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4, -available at https://www.contributor-covenant.org/version/1/4/code-of-conduct.html +This Code of Conduct is adapted from the [Contributor Covenant][homepage], +version 2.1, available at +[https://www.contributor-covenant.org/version/2/1/code_of_conduct.html][v2.1]. -[homepage]: https://www.contributor-covenant.org +Community Impact Guidelines were inspired by +[Mozilla's code of conduct enforcement ladder][Mozilla CoC]. -For answers to common questions about this code of conduct, see -https://www.contributor-covenant.org/faq +For answers to common questions about this code of conduct, see the FAQ at +[https://www.contributor-covenant.org/faq][FAQ]. Translations are available +at [https://www.contributor-covenant.org/translations][translations]. + +[homepage]: https://www.contributor-covenant.org +[v2.1]: https://www.contributor-covenant.org/version/2/1/code_of_conduct.html +[Mozilla CoC]: https://github.com/mozilla/diversity +[FAQ]: https://www.contributor-covenant.org/faq +[translations]: https://www.contributor-covenant.org/translations diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 4a114d2fc..1a2d7a3c8 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -35,7 +35,7 @@ The following is a set of guidelines for contributing to LinuxGSM, which are hos ## 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). +This project and everyone participating in it is 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). ## 🎉 Bug/Enhancement Contributions 🐛 @@ -87,7 +87,7 @@ Features are tracked as [GitHub issues](https://guides.github.com/features/issue 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. +* **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. * **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** @@ -98,9 +98,9 @@ This section guides you through submitting a game server request for LinuxGSM, F 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 of 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 to 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 should 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 their 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). @@ -157,7 +157,7 @@ Below is an example of the subject line for a pull request: ### 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. +When a Pull Request is submitted, a series of status check tests are conducted. These tests will assess 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 code you must change some variables within the `linuxgsm.sh` file. This will force the use of your own code branch. @@ -197,10 +197,10 @@ This section lists the labels we use to help us track and manage issues and pull [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. +Highlights the LinuxGSM command the Issue/PR relates to. **info** Labels -Labels to help pinpoint what the issue or PR relates too. +Labels to help pinpoint what the issue or PR relates to. variants: * _distro_ diff --git a/README.md b/README.md index baed33db1..5164e0b86 100644 --- a/README.md +++ b/README.md @@ -35,7 +35,7 @@ Other distros are likely to work but are not fully tested. ## :wrench: Requirements -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. +Each game server has 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 @@ -43,11 +43,11 @@ Documentation is found at [linuxgsm.com](https://linuxgsm.com) and [docs.linuxgs ## :question: Support -There are a various ways to get support, check out the [support](https://linuxgsm.com/support/) page to the right support. +There are various ways to get support, check out the [support](https://linuxgsm.com/support/) page to the right support. ## :heart: Sponsor -If you would like to [sponsor](https://linuxgsm.com/sponsor) 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. +If you would like to [sponsor](https://linuxgsm.com/sponsor) 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 sponsors me. Since 2012 LinuxGSM has been steadily growing with new servers, features and improvements added regularly. ## Contributors From daab0884915d04a9907e99f4d9c2020db8fb920c Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Sat, 25 Sep 2021 13:16:50 +0100 Subject: [PATCH 060/164] make labeler more readable --- .github/workflows/labeler.yml | 109 +++++++++++++++++++++++++++++++++- 1 file changed, 108 insertions(+), 1 deletion(-) diff --git a/.github/workflows/labeler.yml b/.github/workflows/labeler.yml index 316f08b98..82f5b8c8b 100644 --- a/.github/workflows/labeler.yml +++ b/.github/workflows/labeler.yml @@ -12,5 +12,112 @@ jobs: - uses: Naturalclar/issue-action@v2.0.2 with: title-or-body: "both" - parameters: '[ {"keywords": ["Server Request"], "labels": ["type: game server request"]}, {"keywords": ["backup"], "labels": ["command: backup"]}, {"keywords": ["console"], "labels": ["command: console"]}, {"keywords": ["command: debug"], "labels": ["command: debug"]}, {"keywords": ["command: details"], "labels": ["command: details"]}, {"keywords": ["fast-dl"], "labels": ["command: fast-dl"]}, {"keywords": ["command: install"], "labels": ["command: install"]}, {"keywords": ["command: mods"], "labels": ["command: mods"]}, {"keywords": ["monitor"], "labels": ["command: monitor"]}, {"keywords": ["command: start"], "labels": ["command: start"]}, {"keywords": ["command: stop"], "labels": ["command: stop"]}, {"keywords": ["command: update-lgsm"], "labels": ["command: update-lgsm"]}, {"keywords": ["update"], "labels": ["command: update"]}, {"keywords": ["validate"], "labels": ["command: validate"]}, {"keywords": ["wipe"], "labels": ["command: wipe"]}, {"keywords": ["CentOS"], "labels": ["distro: CentOS"]}, {"keywords": ["Debian"], "labels": ["distro: Debian"]}, {"keywords": ["Fedora"], "labels": ["distro: Fedora"]}, {"keywords": ["Ubuntu"], "labels": ["distro: Ubuntu"]}, {"keywords": ["alert"], "labels": ["info: alerts"]}, {"keywords": ["dependency"], "labels": ["info: dependency"]}, {"keywords": ["docker"], "labels": ["info: docker"]}, {"keywords": ["steamcmd"], "labels": ["info: steamcmd"]}, {"keywords": ["systemd"], "labels": ["info: systemd"]}, {"keywords": ["tmux"], "labels": ["info: tmux"]}, {"keywords": ["bug"], "labels": ["type: bug"]}, {"keywords": ["feature"], "labels": ["type: feature request"]}, {"keywords": ["refactor"], "labels": ["type: refactor"]}, {"keywords": ["Ark"], "labels": ["game: Ark: Survival Evolved"]}, {"keywords": ["Arma 3"], "labels": ["game: Arma 3"]}, {"keywords": ["Counter-Strike: Global Offensive"], "labels": ["game: Counter-Strike: Global Offensive"]}, {"keywords": ["Minecraft"], "labels": ["game: Minecraft"]}, {"keywords": ["Rust"], "labels": ["game: Rust"]}, {"keywords": ["Valheim"], "labels": ["game: Valheim"]}, {"keywords": ["7 Days to Die"], "labels": ["game: 7 Days to Die"]}]' + parameters: ' + [{ + "keywords": ["Server Request"], + "labels": ["type: game server request"] + }, { + "keywords": ["backup"], + "labels": ["command: backup"] + }, { + "keywords": ["console"], + "labels": ["command: console"] + }, { + "keywords": ["command: debug"], + "labels": ["command: debug"] + }, { + "keywords": ["command: details"], + "labels": ["command: details"] + }, { + "keywords": ["fast-dl"], + "labels": ["command: fast-dl"] + }, { + "keywords": ["command: install"], + "labels": ["command: install"] + }, { + "keywords": ["command: mods"], + "labels": ["command: mods"] + }, { + "keywords": ["monitor"], + "labels": ["command: monitor"] + }, { + "keywords": ["command: start"], + "labels": ["command: start"] + }, { + "keywords": ["command: stop"], + "labels": ["command: stop"] + }, { + "keywords": ["command: update-lgsm"], + "labels": ["command: update-lgsm"] + }, { + "keywords": ["update"], + "labels": ["command: update"] + }, { + "keywords": ["validate"], + "labels": ["command: validate"] + }, { + "keywords": ["wipe"], + "labels": ["command: wipe"] + }, { + "keywords": ["CentOS"], + "labels": ["distro: CentOS"] + }, { + "keywords": ["Debian"], + "labels": ["distro: Debian"] + }, { + "keywords": ["Fedora"], + "labels": ["distro: Fedora"] + }, { + "keywords": ["Ubuntu"], + "labels": ["distro: Ubuntu"] + }, { + "keywords": ["alert"], + "labels": ["info: alerts"] + }, { + "keywords": ["dependency"], + "labels": ["info: dependency"] + }, { + "keywords": ["docker"], + "labels": ["info: docker"] + }, { + "keywords": ["steamcmd"], + "labels": ["info: steamcmd"] + }, { + "keywords": ["systemd"], + "labels": ["info: systemd"] + }, { + "keywords": ["tmux"], + "labels": ["info: tmux"] + }, { + "keywords": ["bug"], + "labels": ["type: bug"] + }, { + "keywords": ["feature"], + "labels": ["type: feature request"] + }, { + "keywords": ["refactor"], + "labels": ["type: refactor"] + }, { + "keywords": ["Ark"], + "labels": ["game: Ark: Survival Evolved"] + }, { + "keywords": ["Arma 3"], + "labels": ["game: Arma 3"] + }, { + "keywords": ["Counter-Strike: Global Offensive"], + "labels": ["game: Counter-Strike: Global Offensive"] + }, { + "keywords": ["Minecraft"], + "labels": ["game: Minecraft"] + }, { + "keywords": ["Rust"], + "labels": ["game: Rust"] + }, { + "keywords": ["Valheim"], + "labels": ["game: Valheim"] + }, { + "keywords": ["7 Days to Die"], + "labels": ["game: 7 Days to Die"] + }] + ' github-token: "${{ secrets.GITHUB_TOKEN }}" From 1efb0a01ea6750703ac3330ea912ba0d43baa590 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Sun, 26 Sep 2021 21:30:22 +0100 Subject: [PATCH 061/164] add labels for all games --- .github/workflows/labeler.yml | 1483 ++++++++++++++++++++++++++++++--- 1 file changed, 1377 insertions(+), 106 deletions(-) diff --git a/.github/workflows/labeler.yml b/.github/workflows/labeler.yml index 82f5b8c8b..30ccb5a03 100644 --- a/.github/workflows/labeler.yml +++ b/.github/workflows/labeler.yml @@ -13,111 +13,1382 @@ jobs: with: title-or-body: "both" parameters: ' - [{ - "keywords": ["Server Request"], - "labels": ["type: game server request"] - }, { - "keywords": ["backup"], - "labels": ["command: backup"] - }, { - "keywords": ["console"], - "labels": ["command: console"] - }, { - "keywords": ["command: debug"], - "labels": ["command: debug"] - }, { - "keywords": ["command: details"], - "labels": ["command: details"] - }, { - "keywords": ["fast-dl"], - "labels": ["command: fast-dl"] - }, { - "keywords": ["command: install"], - "labels": ["command: install"] - }, { - "keywords": ["command: mods"], - "labels": ["command: mods"] - }, { - "keywords": ["monitor"], - "labels": ["command: monitor"] - }, { - "keywords": ["command: start"], - "labels": ["command: start"] - }, { - "keywords": ["command: stop"], - "labels": ["command: stop"] - }, { - "keywords": ["command: update-lgsm"], - "labels": ["command: update-lgsm"] - }, { - "keywords": ["update"], - "labels": ["command: update"] - }, { - "keywords": ["validate"], - "labels": ["command: validate"] - }, { - "keywords": ["wipe"], - "labels": ["command: wipe"] - }, { - "keywords": ["CentOS"], - "labels": ["distro: CentOS"] - }, { - "keywords": ["Debian"], - "labels": ["distro: Debian"] - }, { - "keywords": ["Fedora"], - "labels": ["distro: Fedora"] - }, { - "keywords": ["Ubuntu"], - "labels": ["distro: Ubuntu"] - }, { - "keywords": ["alert"], - "labels": ["info: alerts"] - }, { - "keywords": ["dependency"], - "labels": ["info: dependency"] - }, { - "keywords": ["docker"], - "labels": ["info: docker"] - }, { - "keywords": ["steamcmd"], - "labels": ["info: steamcmd"] - }, { - "keywords": ["systemd"], - "labels": ["info: systemd"] - }, { - "keywords": ["tmux"], - "labels": ["info: tmux"] - }, { - "keywords": ["bug"], - "labels": ["type: bug"] - }, { - "keywords": ["feature"], - "labels": ["type: feature request"] - }, { - "keywords": ["refactor"], - "labels": ["type: refactor"] - }, { - "keywords": ["Ark"], - "labels": ["game: Ark: Survival Evolved"] - }, { - "keywords": ["Arma 3"], - "labels": ["game: Arma 3"] - }, { - "keywords": ["Counter-Strike: Global Offensive"], - "labels": ["game: Counter-Strike: Global Offensive"] - }, { - "keywords": ["Minecraft"], - "labels": ["game: Minecraft"] - }, { - "keywords": ["Rust"], - "labels": ["game: Rust"] - }, { - "keywords": ["Valheim"], - "labels": ["game: Valheim"] - }, { - "keywords": ["7 Days to Die"], - "labels": ["game: 7 Days to Die"] - }] + [{ + "keywords": [ + "Server Request", + "" + ], + "labels": [ + "type: game server request" + ] + }, + { + "keywords": [ + "backup", + "" + ], + "labels": [ + "command: backup" + ] + }, + { + "keywords": [ + "console", + "" + ], + "labels": [ + "command: console" + ] + }, + { + "keywords": [ + "command: debug", + "" + ], + "labels": [ + "command: debug" + ] + }, + { + "keywords": [ + "command: details", + "" + ], + "labels": [ + "command: details" + ] + }, + { + "keywords": [ + "fast-dl", + "" + ], + "labels": [ + "command: fast-dl" + ] + }, + { + "keywords": [ + "command: install", + "" + ], + "labels": [ + "command: install" + ] + }, + { + "keywords": [ + "command: mods", + "" + ], + "labels": [ + "command: mods" + ] + }, + { + "keywords": [ + "monitor", + "" + ], + "labels": [ + "command: monitor" + ] + }, + { + "keywords": [ + "command: start", + "" + ], + "labels": [ + "command: start" + ] + }, + { + "keywords": [ + "command: stop", + "" + ], + "labels": [ + "command: stop" + ] + }, + { + "keywords": [ + "command: update-lgsm", + "" + ], + "labels": [ + "command: update-lgsm" + ] + }, + { + "keywords": [ + "update", + "" + ], + "labels": [ + "command: update" + ] + }, + { + "keywords": [ + "validate", + "" + ], + "labels": [ + "command: validate" + ] + }, + { + "keywords": [ + "wipe", + "" + ], + "labels": [ + "command: wipe" + ] + }, + { + "keywords": [ + "CentOS", + "" + ], + "labels": [ + "distro: CentOS" + ] + }, + { + "keywords": [ + "Debian", + "" + ], + "labels": [ + "distro: Debian" + ] + }, + { + "keywords": [ + "Fedora", + "" + ], + "labels": [ + "distro: Fedora" + ] + }, + { + "keywords": [ + "Ubuntu", + "" + ], + "labels": [ + "distro: Ubuntu" + ] + }, + { + "keywords": [ + "Rocky", + "" + ], + "labels": [ + "distro: Rocky Linux" + ] + }, + { + "keywords": [ + "Slackware", + "" + ], + "labels": [ + "distro: Slackware" + ] + }, + { + "keywords": [ + "Arch", + "" + ], + "labels": [ + "distro: Arch Linux" + ] + }, + { + "keywords": [ + "SUSE", + "" + ], + "labels": [ + "distro: openSUSE" + ] + }, + { + "keywords": [ + "Alma", + "" + ], + "labels": [ + "distro: AlmaLinux" + ] + }, + { + "keywords": [ + "alert", + "" + ], + "labels": [ + "info: alerts" + ] + }, + { + "keywords": [ + "dependency", + "" + ], + "labels": [ + "info: dependency" + ] + }, + { + "keywords": [ + "docker", + "" + ], + "labels": [ + "info: docker" + ] + }, + { + "keywords": [ + "steamcmd", + "" + ], + "labels": [ + "info: steamcmd" + ] + }, + { + "keywords": [ + "systemd", + "" + ], + "labels": [ + "info: systemd" + ] + }, + { + "keywords": [ + "tmux", + "" + ], + "labels": [ + "info: tmux" + ] + }, + { + "keywords": [ + "bug", + "" + ], + "labels": [ + "type: bug" + ] + }, + { + "keywords": [ + "feature", + "" + ], + "labels": [ + "type: feature request" + ] + }, + { + "keywords": [ + "refactor", + "" + ], + "labels": [ + "type: refactor" + ] + }, + { + "keywords": [ + "7 Days to Die", + "" + ], + "labels": [ + "game: 7 Days to Die" + ] + }, + { + "keywords": [ + "Action Half-Life", + "" + ], + "labels": [ + "" + ] + }, + { + "keywords": [ + "Action: Source", + "" + ], + "labels": [ + "" + ] + }, + { + "keywords": [ + "ARK: Survival Evolved", + "ARK" + ], + "labels": [ + "game: Ark: Survival Evolved" + ] + }, + { + "keywords": [ + "ARMA 3", + "" + ], + "labels": [ + "game:ARMA 3" + ] + }, + { + "keywords": [ + "Assetto Corsa", + "" + ], + "labels": [ + "game:Assetto Corsa" + ] + }, + { + "keywords": [ + "Avorion", + "" + ], + "labels": [ + "game:Avorion" + ] + }, + { + "keywords": [ + "Ballistic Overkill", + "" + ], + "labels": [ + "game:Ballistic Overkill" + ] + }, + { + "keywords": [ + "Barotrauma", + "" + ], + "labels": [ + "game:Barotrauma" + ] + }, + { + "keywords": [ + "Base Defense", + "" + ], + "labels": [ + "game:Base Defense" + ] + }, + { + "keywords": [ + "Battalion 1944", + "" + ], + "labels": [ + "game:Battalion 1944" + ] + }, + { + "keywords": [ + "Battlefield 1942", + "" + ], + "labels": [ + "game:Battlefield 1942" + ] + }, + { + "keywords": [ + "Battlefield: Vietnam", + "" + ], + "labels": [ + "game:Battlefield: Vietnam" + ] + }, + { + "keywords": [ + "Black Mesa: Deathmatch", + "" + ], + "labels": [ + "game:Black Mesa: Deathmatch" + ] + }, + { + "keywords": [ + "Blade Symphony", + "" + ], + "labels": [ + "game:Blade Symphony" + ] + }, + { + "keywords": [ + "BrainBread", + "" + ], + "labels": [ + "game:BrainBread" + ] + }, + { + "keywords": [ + "BrainBread 2", + "" + ], + "labels": [ + "game:BrainBread 2" + ] + }, + { + "keywords": [ + "Call of Duty", + "" + ], + "labels": [ + "game:Call of Duty" + ] + }, + { + "keywords": [ + "Call of Duty 2", + "" + ], + "labels": [ + "game:Call of Duty 2" + ] + }, + { + "keywords": [ + "Call of Duty 4", + "" + ], + "labels": [ + "game:Call of Duty 4" + ] + }, + { + "keywords": [ + "Call of Duty: United Offensive", + "" + ], + "labels": [ + "game:Call of Duty: United Offensive" + ] + }, + { + "keywords": [ + "Call of Duty: World at War", + "" + ], + "labels": [ + "game:Call of Duty: World at War" + ] + }, + { + "keywords": [ + "Chivalry: Medieval Warfare", + "" + ], + "labels": [ + "game:Chivalry: Medieval Warfare" + ] + }, + { + "keywords": [ + "Codename CURE", + "" + ], + "labels": [ + "game:Codename CURE" + ] + }, + { + "keywords": [ + "Colony Survival", + "" + ], + "labels": [ + "game:Colony Survival" + ] + }, + { + "keywords": [ + "Counter-Strike 1.6", + "" + ], + "labels": [ + "game:Counter-Strike 1.6" + ] + }, + { + "keywords": [ + "Counter-Strike: Condition Zero", + "" + ], + "labels": [ + "game:Counter-Strike: Condition Zero" + ] + }, + { + "keywords": [ + "Counter-Strike: Global Offensive", + "" + ], + "labels": [ + "game:Counter-Strike: Global Offensive" + ] + }, + { + "keywords": [ + "Counter-Strike: Source", + "" + ], + "labels": [ + "game:Counter-Strike: Source" + ] + }, + { + "keywords": [ + "Day of Defeat", + "" + ], + "labels": [ + "game:Day of Defeat" + ] + }, + { + "keywords": [ + "Day of Defeat: Source", + "" + ], + "labels": [ + "game:Day of Defeat: Source" + ] + }, + { + "keywords": [ + "Day of Dragons", + "" + ], + "labels": [ + "game:Day of Dragons" + ] + }, + { + "keywords": [ + "Day of Infamy", + "" + ], + "labels": [ + "game:Day of Infamy" + ] + }, + { + "keywords": [ + "Deathmatch Classic", + "" + ], + "labels": [ + "game:Deathmatch Classic" + ] + }, + { + "keywords": [ + "Don't Starve Together" + ], + "labels": [ + "game:Don't Starve Together" + ] + }, + { + "keywords": [ + "Double Action: Boogaloo", + "" + ], + "labels": [ + "game:Double Action: Boogaloo" + ] + }, + { + "keywords": [ + "Dystopia", + "" + ], + "labels": [ + "game:Dystopia" + ] + }, + { + "keywords": [ + "Eco", + "" + ], + "labels": [ + "game:Eco" + ] + }, + { + "keywords": [ + "Empires Mod", + "" + ], + "labels": [ + "game:Empires Mod" + ] + }, + { + "keywords": [ + "ET: Legacy", + "" + ], + "labels": [ + "game:ET: Legacy" + ] + }, + { + "keywords": [ + "Factorio", + "" + ], + "labels": [ + "game:Factorio" + ] + }, + { + "keywords": [ + "Fistful of Frags", + "" + ], + "labels": [ + "game:Fistful of Frags" + ] + }, + { + "keywords": [ + "Garrys Mod", + "" + ], + "labels": [ + "game:Garrys Mod" + ] + }, + { + "keywords": [ + "Half-Life 2: Deathmatch", + "" + ], + "labels": [ + "game:Half-Life 2: Deathmatch" + ] + }, + { + "keywords": [ + "Half-Life Deathmatch: Source", + "" + ], + "labels": [ + "game:Half-Life Deathmatch: Source" + ] + }, + { + "keywords": [ + "Half-Life: Deathmatch", + "" + ], + "labels": [ + "game:Half-Life: Deathmatch" + ] + }, + { + "keywords": [ + "Hurtworld", + "" + ], + "labels": [ + "game:Hurtworld" + ] + }, + { + "keywords": [ + "Insurgency", + "" + ], + "labels": [ + "game:Insurgency" + ] + }, + { + "keywords": [ + "Insurgency: Sandstorm", + "" + ], + "labels": [ + "game:Insurgency: Sandstorm" + ] + }, + { + "keywords": [ + "IOSoccer", + "" + ], + "labels": [ + "game:IOSoccer" + ] + }, + { + "keywords": [ + "Jedi Knight II: Jedi Outcast", + "" + ], + "labels": [ + "game:Jedi Knight II: Jedi Outcast" + ] + }, + { + "keywords": [ + "Just Cause 2", + "" + ], + "labels": [ + "game:Just Cause 2" + ] + }, + { + "keywords": [ + "Just Cause 3", + "" + ], + "labels": [ + "game:Just Cause 3" + ] + }, + { + "keywords": [ + "Killing Floor", + "" + ], + "labels": [ + "game:Killing Floor" + ] + }, + { + "keywords": [ + "Killing Floor 2", + "" + ], + "labels": [ + "game:Killing Floor 2" + ] + }, + { + "keywords": [ + "Last Oasis", + "" + ], + "labels": [ + "game:Last Oasis" + ] + }, + { + "keywords": [ + "Left 4 Dead", + "" + ], + "labels": [ + "game:Left 4 Dead" + ] + }, + { + "keywords": [ + "Left 4 Dead 2", + "" + ], + "labels": [ + "game:Left 4 Dead 2" + ] + }, + { + "keywords": [ + "Medal of Honor: Allied Assault", + "" + ], + "labels": [ + "game:Medal of Honor: Allied Assault" + ] + }, + { + "keywords": [ + "Memories of Mars", + "" + ], + "labels": [ + "game:Memories of Mars" + ] + }, + { + "keywords": [ + "Minecraft", + "" + ], + "labels": [ + "game:Minecraft" + ] + }, + { + "keywords": [ + "Minecraft Bedrock", + "" + ], + "labels": [ + "game:Minecraft Bedrock" + ] + }, + { + "keywords": [ + "MORDHAU", + "" + ], + "labels": [ + "game:MORDHAU" + ] + }, + { + "keywords": [ + "Multi Theft Auto", + "" + ], + "labels": [ + "game:Multi Theft Auto" + ] + }, + { + "keywords": [ + "Mumble", + "" + ], + "labels": [ + "game:Mumble" + ] + }, + { + "keywords": [ + "Natural Selection", + "" + ], + "labels": [ + "game:Natural Selection" + ] + }, + { + "keywords": [ + "Natural Selection 2", + "" + ], + "labels": [ + "game:Natural Selection 2" + ] + }, + { + "keywords": [ + "No More Room in Hell", + "" + ], + "labels": [ + "game:No More Room in Hell" + ] + }, + { + "keywords": [ + "NS2: Combat", + "" + ], + "labels": [ + "game:NS2: Combat" + ] + }, + { + "keywords": [ + "Nuclear Dawn", + "" + ], + "labels": [ + "game:Nuclear Dawn" + ] + }, + { + "keywords": [ + "Onset", + "" + ], + "labels": [ + "game:Onset" + ] + }, + { + "keywords": [ + "Opposing Force", + "" + ], + "labels": [ + "game:Opposing Force" + ] + }, + { + "keywords": [ + "PaperMC", + "" + ], + "labels": [ + "game:PaperMC" + ] + }, + { + "keywords": [ + "Pavlov VR", + "" + ], + "labels": [ + "game:Pavlov VR" + ] + }, + { + "keywords": [ + "Pirates Vikings & Knights II", + "" + ], + "labels": [ + "game:Pirates Vikings & Knights II" + ] + }, + { + "keywords": [ + "Post Scriptum: The Bloody Seventh", + "" + ], + "labels": [ + "game:Post Scriptum: The Bloody Seventh" + ] + }, + { + "keywords": [ + "Project Cars", + "" + ], + "labels": [ + "game:Project Cars" + ] + }, + { + "keywords": [ + "Project Zomboid", + "" + ], + "labels": [ + "game:Project Zomboid" + ] + }, + { + "keywords": [ + "Quake 2", + "" + ], + "labels": [ + "game:Quake 2" + ] + }, + { + "keywords": [ + "Quake 3: Arena", + "" + ], + "labels": [ + "game:Quake 3: Arena" + ] + }, + { + "keywords": [ + "Quake Live", + "" + ], + "labels": [ + "game:Quake Live" + ] + }, + { + "keywords": [ + "Quake World", + "" + ], + "labels": [ + "game:Quake World" + ] + }, + { + "keywords": [ + "Red Orchestra: Ostfront 41-45", + "" + ], + "labels": [ + "game:Red Orchestra: Ostfront 41-45" + ] + }, + { + "keywords": [ + "Return to Castle Wolfenstein", + "" + ], + "labels": [ + "game:Return to Castle Wolfenstein" + ] + }, + { + "keywords": [ + "Ricochet", + "" + ], + "labels": [ + "game:Ricochet" + ] + }, + { + "keywords": [ + "Rising World", + "" + ], + "labels": [ + "game:Rising World" + ] + }, + { + "keywords": [ + "Rust", + "" + ], + "labels": [ + "game:Rust" + ] + }, + { + "keywords": [ + "San Andreas Multiplayer", + "" + ], + "labels": [ + "game:San Andreas Multiplayer" + ] + }, + { + "keywords": [ + "SCP: Secret Laboratory", + "" + ], + "labels": [ + "game:SCP: Secret Laboratory" + ] + }, + { + "keywords": [ + "SCP: Secret Laboratory ServerMod", + "" + ], + "labels": [ + "game:SCP: Secret Laboratory ServerMod" + ] + }, + { + "keywords": [ + "Soldat", + "" + ], + "labels": [ + "game:Soldat" + ] + }, + { + "keywords": [ + "Soldier Of Fortune 2: Gold Edition", + "" + ], + "labels": [ + "game:Soldier Of Fortune 2: Gold Edition" + ] + }, + { + "keywords": [ + "SourceForts Classic", + "" + ], + "labels": [ + "game:SourceForts Classic" + ] + }, + { + "keywords": [ + "Squad", + "" + ], + "labels": [ + "game:Squad" + ] + }, + { + "keywords": [ + "Starbound", + "" + ], + "labels": [ + "game:Starbound" + ] + }, + { + "keywords": [ + "Stationeers", + "" + ], + "labels": [ + "game:Stationeers" + ] + }, + { + "keywords": [ + "StickyBots", + "" + ], + "labels": [ + "game:StickyBots" + ] + }, + { + "keywords": [ + "Survive the Nights", + "" + ], + "labels": [ + "game:Survive the Nights" + ] + }, + { + "keywords": [ + "Sven Co-op", + "" + ], + "labels": [ + "game:Sven Co-op" + ] + }, + { + "keywords": [ + "Team Fortress 2", + "" + ], + "labels": [ + "game:Team Fortress 2" + ] + }, + { + "keywords": [ + "Team Fortress Classic", + "" + ], + "labels": [ + "game:Team Fortress Classic" + ] + }, + { + "keywords": [ + "Teamspeak 3", + "" + ], + "labels": [ + "game:Teamspeak 3" + ] + }, + { + "keywords": [ + "Teeworlds", + "" + ], + "labels": [ + "game:Teeworlds" + ] + }, + { + "keywords": [ + "Terraria", + "" + ], + "labels": [ + "game:Terraria" + ] + }, + { + "keywords": [ + "The Specialists", + "" + ], + "labels": [ + "game:The Specialists" + ] + }, + { + "keywords": [ + "Tower Unite", + "" + ], + "labels": [ + "game:Tower Unite" + ] + }, + { + "keywords": [ + "Unreal Tournament", + "" + ], + "labels": [ + "game:Unreal Tournament" + ] + }, + { + "keywords": [ + "Unreal Tournament 2004", + "" + ], + "labels": [ + "game:Unreal Tournament 2004" + ] + }, + { + "keywords": [ + "Unreal Tournament 3", + "" + ], + "labels": [ + "game:Unreal Tournament 3" + ] + }, + { + "keywords": [ + "Unreal Tournament 99", + "" + ], + "labels": [ + "game:Unreal Tournament 99" + ] + }, + { + "keywords": [ + "Unturned", + "" + ], + "labels": [ + "game:Unturned" + ] + }, + { + "keywords": [ + "Valheim", + "" + ], + "labels": [ + "game:Valheim" + ] + }, + { + "keywords": [ + "Vampire Slayer", + "" + ], + "labels": [ + "game:Vampire Slayer" + ] + }, + { + "keywords": [ + "Vintage Story", + "" + ], + "labels": [ + "game:Vintage Story" + ] + }, + { + "keywords": [ + "Warfork", + "" + ], + "labels": [ + "game:Warfork" + ] + }, + { + "keywords": [ + "WaterfallMC", + "" + ], + "labels": [ + "game:WaterfallMC" + ] + }, + { + "keywords": [ + "Wolfenstein: Enemy Territory", + "" + ], + "labels": [ + "game:Wolfenstein: Enemy Territory" + ] + }, + { + "keywords": [ + "Wurm Unlimited", + "" + ], + "labels": [ + "game:Wurm Unlimited" + ] + }, + { + "keywords": [ + "Zombie Master: Reborn", + "" + ], + "labels": [ + "game:Zombie Master: Reborn" + ] + }, + { + "keywords": [ + "Zombie Panic! Source", + "" + ], + "labels": [ + "game:Zombie Panic! Source" + ] + } + ] ' github-token: "${{ secrets.GITHUB_TOKEN }}" From 1cec2db4a7f660640f2fd5e6940d7baf30f8ccde Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Sun, 26 Sep 2021 22:41:06 +0100 Subject: [PATCH 062/164] add docs info to Last Oasis and change servername --- lgsm/config-default/config-lgsm/loserver/_default.cfg | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/lgsm/config-default/config-lgsm/loserver/_default.cfg b/lgsm/config-default/config-lgsm/loserver/_default.cfg index 9bf9ea90e..855b60f26 100644 --- a/lgsm/config-default/config-lgsm/loserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/loserver/_default.cfg @@ -13,7 +13,8 @@ steamuser="username" steampass='password' ## Predefined Parameters | https://docs.linuxgsm.com/configuration/start-parameters -servername="LinuxGSM" +## https://docs.linuxgsm.com/game-servers/last-oasis +servername="${selfname}" ip="0.0.0.0" port="7777" queryport="27015" From 534e43e3727cd9ec4f8c828c8fc2f32d2e244db3 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Mon, 27 Sep 2021 23:28:26 +0100 Subject: [PATCH 063/164] fix(install): rhel based distros now get correct csv file (#3576) --- lgsm/functions/check_deps.sh | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/lgsm/functions/check_deps.sh b/lgsm/functions/check_deps.sh index 3e3d6a1b6..e5f5aead2 100755 --- a/lgsm/functions/check_deps.sh +++ b/lgsm/functions/check_deps.sh @@ -300,22 +300,24 @@ info_distro.sh # some RHEL based distros use 8.4 instead of just 8. if [[ "${distroidlike}" == *"rhel"* ]]||[ "${distroid}" == "rhel" ]; then - distroversion="${distroversionrh}" + distroversioncsv="${distroversionrh}" +else + distroversioncsv="${distroversion}" fi -if [ ! -f "${tmpdir}/dependency-no-check.tmp" ]&&[ ! -f "${datadir}/${distroid}-${distroversion}.csv" ]; then +if [ ! -f "${tmpdir}/dependency-no-check.tmp" ]&&[ ! -f "${datadir}/${distroid}-${distroversioncsv}.csv" ]; then # Check that the disto dependency csv file exists. - fn_check_file_github "lgsm/data" "${distroid}-${distroversion}.csv" + fn_check_file_github "lgsm/data" "${distroid}-${distroversioncsv}.csv" if [ -n "${checkflag}" ]&&[ "${checkflag}" == "0" ]; then - fn_fetch_file_github "lgsm/data" "${distroid}-${distroversion}.csv" "lgsm/data" "chmodx" "norun" "noforce" "nohash" + fn_fetch_file_github "lgsm/data" "${distroid}-${distroversioncsv}.csv" "lgsm/data" "chmodx" "norun" "noforce" "nohash" fi fi # If the file successfully downloaded run the dependency check. -if [ -f "${datadir}/${distroid}-${distroversion}.csv" ]; then - depall=$(awk -F, '$1=="all" {$1=""; print $0}' "${datadir}/${distroid}-${distroversion}.csv") - depsteamcmd=$(awk -F, '$1=="steamcmd" {$1=""; print $0}' "${datadir}/${distroid}-${distroversion}.csv") - depshortname=$(awk -v shortname="$shortname" -F, '$1==shortname {$1=""; print $0}' "${datadir}/${distroid}-${distroversion}.csv") +if [ -f "${datadir}/${distroid}-${distroversioncsv}.csv" ]; then + depall=$(awk -F, '$1=="all" {$1=""; print $0}' "${datadir}/${distroid}-${distroversioncsv}.csv") + depsteamcmd=$(awk -F, '$1=="steamcmd" {$1=""; print $0}' "${datadir}/${distroid}-${distroversioncsv}.csv") + depshortname=$(awk -v shortname="$shortname" -F, '$1==shortname {$1=""; print $0}' "${datadir}/${distroid}-${distroversioncsv}.csv") # Generate array of missing deps. array_deps_missing=() From 565f99e9e8ccd0e2f299630f76dcca363198b5f4 Mon Sep 17 00:00:00 2001 From: Christian Date: Tue, 28 Sep 2021 21:41:55 +0200 Subject: [PATCH 064/164] fix(stn): add case if the password was not set in the config (#3578) --- lgsm/functions/info_game.sh | 3 +++ 1 file changed, 3 insertions(+) diff --git a/lgsm/functions/info_game.sh b/lgsm/functions/info_game.sh index 46bcece5b..a961a41f3 100644 --- a/lgsm/functions/info_game.sh +++ b/lgsm/functions/info_game.sh @@ -1741,6 +1741,9 @@ fn_info_game_stn(){ port=$(sed -nr 's/^ServerPort=([0-9]+)/\1/p' "${servercfgfullpath}") serverpassword=$(sed -nr 's/^ServerPassword=(.*)$/\1/p' "${servercfgfullpath}") queryport=$((port + 1)) + + # Not set + serverpassword=${serverpassword:-"NOT SET"} else servername="${unavailable}" configip=${configip:-"0.0.0.0"} From ac8cef7705265c07f986efa883637850e76325ba Mon Sep 17 00:00:00 2001 From: johnoclockdk <68790186+johnoclockdk@users.noreply.github.com> Date: Tue, 28 Sep 2021 21:43:26 +0200 Subject: [PATCH 065/164] feat(mods): csgo practice mode (#3577) --- 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 fc9d921d6..7afeffcfb 100755 --- a/lgsm/functions/mods_list.sh +++ b/lgsm/functions/mods_list.sh @@ -76,6 +76,9 @@ get5lastbuild=$(curl --connect-timeout 10 -sL https://ci.splewis.net/job/get5/la get5latestfile=$(echo -e "${get5lastbuild}" | jq -r '.fileName') get5latestfilepath=$(echo -e "${get5lastbuild}" | jq -r '.relativePath') get5url="https://ci.splewis.net/job/get5/lastSuccessfulBuild/artifact/${get5latestfilepath}" +csgopracticelatest=$(curl --connect-timeout 10 -sL https://api.github.com/repos/splewis/csgo-practice-mode/releases/latest | jq '.assets[]') +csgopracticelatestfile=$(echo -e "${csgopracticelatest}" | jq -r '.name') +csgopracticelatestlink=$(echo -e "${csgopracticelatest}" | jq -r '.browser_download_url') 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') @@ -140,6 +143,7 @@ mod_info_stripper=( MOD "stripper" "Stripper Source" "http://www.bailopan.net/st 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-${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_prac=( MOD "prac" "csgo practice mode" "${csgopracticelatestlink}" "${csgopracticelatestfile}" "0" "LowercaseOff" "${systemdir}" "cfg;addons/sourcemod/configs;" "ENGINES" "Counter-Strike: Global Offensive;" "NOTGAMES" "https://github.com/splewis/csgo-practice-mode" "Practice Mode is a sourcemod plugin for helping players/teams run practices." ) 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" ) mod_info_dhook=( MOD "dhook" "dhook" "https://forums.alliedmods.net/attachment.php?attachmentid=190123&d=1625050030" "dhooks-2.2.0d17.zip" "0" "LowercaseOff" "${systemdir}" "cfg;addons/sourcemod/configs;" "ENGINES" "Counter-Strike: Global Offensive;" "NOTGAMES" "https://forums.alliedmods.net/showpost.php?p=2588686&postcount=589" "DHooks 2.2.0 - Required for GOKZ" ) mod_info_movement=( MOD "movementapi" "movementapi" "https://github.com/danzayau/MovementAPI/releases/download/2.1.0/MovementAPI-v2.1.0.zip" "MovementAPI-v2.1.0.zip" "0" "LowercaseOff" "${systemdir}" "cfg;addons/sourcemod/configs;" "ENGINES" "Counter-Strike: Global Offensive;" "NOTGAMES" "https://github.com/danzayau/MovementAPI" "Movement API 2.1.0 - Required for GOKZ" ) @@ -184,4 +188,4 @@ mod_info_sdtdoxide=( MOD "sdtdoxide" "Oxide for 7 Days To Die" "${oxidesdtdlates mod_info_valheimplus=( MOD "valheimplus" "Valheim PLUS" "${valeimpluslatestlink}" "ValheimPlus.tar.gz" "0" "LowercaseOff" "${systemdir}" "OVERWRITE" "ENGINES" "Valheim;" "NOTGAMES" "https://github.com/valheimPlus/ValheimPlus" "Mod to improve Valheim gameplay") # 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_dhook[@]}" "${mod_info_movement[@]}" "${mod_info_cleaner[@]}" "${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[@]}" "${mod_info_advduplicator[@]}" "${mod_info_trackassemblytool[@]}" "${mod_info_physpropertiesadv[@]}" "${mod_info_controlsystemse2[@]}" "${mod_info_e2pistontiming[@]}" "${mod_info_propcannontool[@]}" "${mod_info_gearassemblytool[@]}" "${mod_info_spinnertool[@]}" "${mod_info_surfacefrictiontool[@]}" "${mod_info_magneticdipole[@]}" "${mod_info_environmentorganizer[@]}" "${mod_info_precision_alignment[@]}" "${mod_info_improved_stacker[@]}" "${mod_info_improved_weight[@]}" "${mod_info_improved_antinoclip[@]}" "${mod_info_laserstool[@]}" "${mod_info_valheimplus[@]}" ) +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_prac[@]}" "${mod_info_pug[@]}" "${mod_info_dhook[@]}" "${mod_info_movement[@]}" "${mod_info_cleaner[@]}" "${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[@]}" "${mod_info_advduplicator[@]}" "${mod_info_trackassemblytool[@]}" "${mod_info_physpropertiesadv[@]}" "${mod_info_controlsystemse2[@]}" "${mod_info_e2pistontiming[@]}" "${mod_info_propcannontool[@]}" "${mod_info_gearassemblytool[@]}" "${mod_info_spinnertool[@]}" "${mod_info_surfacefrictiontool[@]}" "${mod_info_magneticdipole[@]}" "${mod_info_environmentorganizer[@]}" "${mod_info_precision_alignment[@]}" "${mod_info_improved_stacker[@]}" "${mod_info_improved_weight[@]}" "${mod_info_improved_antinoclip[@]}" "${mod_info_laserstool[@]}" "${mod_info_valheimplus[@]}" ) From 490cd3fa5aeadd63180fab5379f49d78748ec8ef Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Tue, 28 Sep 2021 22:51:41 +0100 Subject: [PATCH 066/164] fix(install): resolve steamcmd dependency issues (#3583) * fix(install): improve steamcmd detection --- lgsm/data/almalinux-8.csv | 4 ++- lgsm/data/centos-7.csv | 4 ++- lgsm/data/centos-8.csv | 3 +- lgsm/data/debian-10.csv | 8 +++-- lgsm/data/debian-11.csv | 8 +++-- lgsm/data/debian-9.csv | 8 +++-- lgsm/data/rhel-7.csv | 4 ++- lgsm/data/rhel-8.csv | 4 ++- lgsm/data/rocky-8.csv | 4 ++- lgsm/data/ubuntu-16.04.csv | 8 +++-- lgsm/data/ubuntu-18.04.csv | 8 +++-- lgsm/data/ubuntu-20.04.csv | 9 +++--- lgsm/data/ubuntu-21.04.csv | 8 +++-- lgsm/functions/check_deps.sh | 36 ++++++++++++++--------- lgsm/functions/command_update_linuxgsm.sh | 33 +++++++++++++++++++++ lgsm/functions/info_distro.sh | 7 +++++ 16 files changed, 114 insertions(+), 42 deletions(-) diff --git a/lgsm/data/almalinux-8.csv b/lgsm/data/almalinux-8.csv index f72d74b7b..270ede409 100644 --- a/lgsm/data/almalinux-8.csv +++ b/lgsm/data/almalinux-8.csv @@ -1,4 +1,5 @@ -all,epel-release,curl,wget,util-linux,python36,file,tar,gzip,bzip2,unzip,xz,binutils,bc,jq,tmux,nmap-ncat,cpio,hostname +all,bc,binutils,bzip2,bzip2,cpio,curl,epel-release,file,glibc.i686,gzip,hostname,jq,libstdc++.i686,nmap-ncat,python36,tar,tmux,unzip,util-linux,wget,xz +steamcmd,glibc.i686,libstdc++.i686 ac ahl ahl2 @@ -96,6 +97,7 @@ sof2 sol squad st +stn sven terraria tf2,libcurl.i686 diff --git a/lgsm/data/centos-7.csv b/lgsm/data/centos-7.csv index f72d74b7b..270ede409 100644 --- a/lgsm/data/centos-7.csv +++ b/lgsm/data/centos-7.csv @@ -1,4 +1,5 @@ -all,epel-release,curl,wget,util-linux,python36,file,tar,gzip,bzip2,unzip,xz,binutils,bc,jq,tmux,nmap-ncat,cpio,hostname +all,bc,binutils,bzip2,bzip2,cpio,curl,epel-release,file,glibc.i686,gzip,hostname,jq,libstdc++.i686,nmap-ncat,python36,tar,tmux,unzip,util-linux,wget,xz +steamcmd,glibc.i686,libstdc++.i686 ac ahl ahl2 @@ -96,6 +97,7 @@ sof2 sol squad st +stn sven terraria tf2,libcurl.i686 diff --git a/lgsm/data/centos-8.csv b/lgsm/data/centos-8.csv index f72d74b7b..f9805f8b0 100644 --- a/lgsm/data/centos-8.csv +++ b/lgsm/data/centos-8.csv @@ -1,4 +1,5 @@ -all,epel-release,curl,wget,util-linux,python36,file,tar,gzip,bzip2,unzip,xz,binutils,bc,jq,tmux,nmap-ncat,cpio,hostname +all,bc,binutils,bzip2,bzip2,cpio,curl,epel-release,file,glibc.i686,gzip,hostname,jq,libstdc++,libstdc++.i686,nmap-ncat,python36,tar,tmux,unzip,util-linux,wget,xz +steamcmd,glibc.i686,libstdc++.i686 ac ahl ahl2 diff --git a/lgsm/data/debian-10.csv b/lgsm/data/debian-10.csv index f352a05a2..746e0d5cc 100644 --- a/lgsm/data/debian-10.csv +++ b/lgsm/data/debian-10.csv @@ -1,4 +1,5 @@ -all,bc,binutils,bsdmainutils,bzip2,ca-certificates,cpio,curl,file,gzip,jq,python3,tar,tmux,util-linux,netcat,unzip,xz-utils,lib32gcc1,lib32stdc++6,hostname +all,bc,binutils,bsdmainutils,bzip2,ca-certificates,cpio,curl,file,gzip,hostname,jq,lib32gcc1,lib32stdc++6,netcat,netcat,python3,tar,tmux,unzip,util-linux,wget,xz-utils +steamcmd,lib32gcc1,lib32stdc++6,libsdl2-2.0-0:i386,steamcmd ac ahl ahl2 @@ -68,14 +69,14 @@ nmrih,libtinfo5:i386 ns ns2,speex,libtbb2 ns2c,speex:i386,libtbb2 -onset +onset,libmariadbclient-dev opfor pc pmc,openjdk-11-jre pstbs,libgconf-2-4 pvkii pvr,libc++1 -pz +pz,openjdk-11-jre,rng-tools q2 q3 ql @@ -96,6 +97,7 @@ sof2 sol squad st +stn sven,libssl1.1:i386,zlib1g:i386 terraria tf2,libcurl4-gnutls-dev:i386 diff --git a/lgsm/data/debian-11.csv b/lgsm/data/debian-11.csv index 146e9fc2c..35bf76936 100644 --- a/lgsm/data/debian-11.csv +++ b/lgsm/data/debian-11.csv @@ -1,4 +1,5 @@ -all,bc,binutils,bsdmainutils,bzip2,ca-certificates,cpio,curl,file,gzip,jq,python3,tar,tmux,util-linux,netcat,unzip,xz-utils,lib32gcc-s1,lib32stdc++6,hostname +all,bc,binutils,bsdmainutils,bzip2,ca-certificates,cpio,curl,file,gzip,hostname,jq,lib32gcc-s1,lib32stdc++6,netcat,netcat,python3,tar,tmux,unzip,util-linux,wget,xz-utils +steamcmd,lib32gcc-s1,lib32stdc++6,libsdl2-2.0-0:i386,steamcmd ac ahl ahl2 @@ -68,14 +69,14 @@ nmrih,libtinfo5:i386 ns ns2,speex,libtbb2 ns2c,speex:i386,libtbb2 -onset +onset,libmariadbclient-dev opfor pc pmc,openjdk-16-jre pstbs,libgconf-2-4 pvkii pvr,libc++1 -pz +pz,openjdk-16-jre,rng-tools q2 q3 ql @@ -96,6 +97,7 @@ sof2 sol squad st +stn sven,libssl1.1:i386,zlib1g:i386 terraria tf2,libcurl4-gnutls-dev:i386 diff --git a/lgsm/data/debian-9.csv b/lgsm/data/debian-9.csv index 0b40d2340..4a8790286 100644 --- a/lgsm/data/debian-9.csv +++ b/lgsm/data/debian-9.csv @@ -1,4 +1,5 @@ -all,bc,binutils,bsdmainutils,bzip2,ca-certificates,cpio,curl,file,gzip,jq,python3,tar,tmux,util-linux,netcat,unzip,xz-utils,lib32gcc1,lib32stdc++6,hostname +all,bc,binutils,bsdmainutils,bzip2,ca-certificates,cpio,curl,file,gzip,hostname,jq,lib32gcc1,lib32stdc++6,netcat,netcat,python3,tar,tmux,unzip,util-linux,wget,xz-utils +steamcmd,lib32gcc1,lib32stdc++6,libsdl2-2.0-0:i386,steamcmd ac ahl ahl2 @@ -68,14 +69,14 @@ nmrih,libtinfo5:i386 ns ns2,speex,libtbb2 ns2c,speex:i386,libtbb2 -onset +onset,libmariadbclient-dev opfor pc pmc,openjdk-8-jre pstbs,libgconf-2-4 pvkii pvr,libc++1 -pz +pz,openjdk-8-jre,rng-tools q2 q3 ql @@ -96,6 +97,7 @@ sof2 sol squad st +stn sven,libssl1.1:i386,zlib1g:i386 terraria tf2,libcurl4-gnutls-dev:i386 diff --git a/lgsm/data/rhel-7.csv b/lgsm/data/rhel-7.csv index f72d74b7b..270ede409 100644 --- a/lgsm/data/rhel-7.csv +++ b/lgsm/data/rhel-7.csv @@ -1,4 +1,5 @@ -all,epel-release,curl,wget,util-linux,python36,file,tar,gzip,bzip2,unzip,xz,binutils,bc,jq,tmux,nmap-ncat,cpio,hostname +all,bc,binutils,bzip2,bzip2,cpio,curl,epel-release,file,glibc.i686,gzip,hostname,jq,libstdc++.i686,nmap-ncat,python36,tar,tmux,unzip,util-linux,wget,xz +steamcmd,glibc.i686,libstdc++.i686 ac ahl ahl2 @@ -96,6 +97,7 @@ sof2 sol squad st +stn sven terraria tf2,libcurl.i686 diff --git a/lgsm/data/rhel-8.csv b/lgsm/data/rhel-8.csv index f72d74b7b..270ede409 100644 --- a/lgsm/data/rhel-8.csv +++ b/lgsm/data/rhel-8.csv @@ -1,4 +1,5 @@ -all,epel-release,curl,wget,util-linux,python36,file,tar,gzip,bzip2,unzip,xz,binutils,bc,jq,tmux,nmap-ncat,cpio,hostname +all,bc,binutils,bzip2,bzip2,cpio,curl,epel-release,file,glibc.i686,gzip,hostname,jq,libstdc++.i686,nmap-ncat,python36,tar,tmux,unzip,util-linux,wget,xz +steamcmd,glibc.i686,libstdc++.i686 ac ahl ahl2 @@ -96,6 +97,7 @@ sof2 sol squad st +stn sven terraria tf2,libcurl.i686 diff --git a/lgsm/data/rocky-8.csv b/lgsm/data/rocky-8.csv index f72d74b7b..270ede409 100644 --- a/lgsm/data/rocky-8.csv +++ b/lgsm/data/rocky-8.csv @@ -1,4 +1,5 @@ -all,epel-release,curl,wget,util-linux,python36,file,tar,gzip,bzip2,unzip,xz,binutils,bc,jq,tmux,nmap-ncat,cpio,hostname +all,bc,binutils,bzip2,bzip2,cpio,curl,epel-release,file,glibc.i686,gzip,hostname,jq,libstdc++.i686,nmap-ncat,python36,tar,tmux,unzip,util-linux,wget,xz +steamcmd,glibc.i686,libstdc++.i686 ac ahl ahl2 @@ -96,6 +97,7 @@ sof2 sol squad st +stn sven terraria tf2,libcurl.i686 diff --git a/lgsm/data/ubuntu-16.04.csv b/lgsm/data/ubuntu-16.04.csv index 0b40d2340..4a8790286 100644 --- a/lgsm/data/ubuntu-16.04.csv +++ b/lgsm/data/ubuntu-16.04.csv @@ -1,4 +1,5 @@ -all,bc,binutils,bsdmainutils,bzip2,ca-certificates,cpio,curl,file,gzip,jq,python3,tar,tmux,util-linux,netcat,unzip,xz-utils,lib32gcc1,lib32stdc++6,hostname +all,bc,binutils,bsdmainutils,bzip2,ca-certificates,cpio,curl,file,gzip,hostname,jq,lib32gcc1,lib32stdc++6,netcat,netcat,python3,tar,tmux,unzip,util-linux,wget,xz-utils +steamcmd,lib32gcc1,lib32stdc++6,libsdl2-2.0-0:i386,steamcmd ac ahl ahl2 @@ -68,14 +69,14 @@ nmrih,libtinfo5:i386 ns ns2,speex,libtbb2 ns2c,speex:i386,libtbb2 -onset +onset,libmariadbclient-dev opfor pc pmc,openjdk-8-jre pstbs,libgconf-2-4 pvkii pvr,libc++1 -pz +pz,openjdk-8-jre,rng-tools q2 q3 ql @@ -96,6 +97,7 @@ sof2 sol squad st +stn sven,libssl1.1:i386,zlib1g:i386 terraria tf2,libcurl4-gnutls-dev:i386 diff --git a/lgsm/data/ubuntu-18.04.csv b/lgsm/data/ubuntu-18.04.csv index f352a05a2..746e0d5cc 100644 --- a/lgsm/data/ubuntu-18.04.csv +++ b/lgsm/data/ubuntu-18.04.csv @@ -1,4 +1,5 @@ -all,bc,binutils,bsdmainutils,bzip2,ca-certificates,cpio,curl,file,gzip,jq,python3,tar,tmux,util-linux,netcat,unzip,xz-utils,lib32gcc1,lib32stdc++6,hostname +all,bc,binutils,bsdmainutils,bzip2,ca-certificates,cpio,curl,file,gzip,hostname,jq,lib32gcc1,lib32stdc++6,netcat,netcat,python3,tar,tmux,unzip,util-linux,wget,xz-utils +steamcmd,lib32gcc1,lib32stdc++6,libsdl2-2.0-0:i386,steamcmd ac ahl ahl2 @@ -68,14 +69,14 @@ nmrih,libtinfo5:i386 ns ns2,speex,libtbb2 ns2c,speex:i386,libtbb2 -onset +onset,libmariadbclient-dev opfor pc pmc,openjdk-11-jre pstbs,libgconf-2-4 pvkii pvr,libc++1 -pz +pz,openjdk-11-jre,rng-tools q2 q3 ql @@ -96,6 +97,7 @@ sof2 sol squad st +stn sven,libssl1.1:i386,zlib1g:i386 terraria tf2,libcurl4-gnutls-dev:i386 diff --git a/lgsm/data/ubuntu-20.04.csv b/lgsm/data/ubuntu-20.04.csv index 942915cbe..90f4a67e0 100644 --- a/lgsm/data/ubuntu-20.04.csv +++ b/lgsm/data/ubuntu-20.04.csv @@ -1,5 +1,5 @@ -all,bc,binutils,bsdmainutils,bzip2,ca-certificates,cpio,curl,file,gzip,jq,python3,tar,tmux,util-linux,netcat,unzip,xz-utils,lib32gcc1,lib32stdc++6,hostname -steamcmd,lib32gcc1,lib32stdc++6,libsdl2-2.0-0:i386 +all,bc,binutils,bsdmainutils,bzip2,ca-certificates,cpio,curl,file,gzip,hostname,jq,lib32gcc1,lib32stdc++6,netcat,netcat,python3,tar,tmux,unzip,util-linux,wget,xz-utils +steamcmd,lib32gcc1,lib32stdc++6,libsdl2-2.0-0:i386,steamcmd ac ahl ahl2 @@ -69,14 +69,14 @@ nmrih,libtinfo5:i386 ns ns2,speex,libtbb2 ns2c,speex:i386,libtbb2 -onset +onset,libmariadbclient-dev opfor pc pmc,openjdk-16-jre pstbs,libgconf-2-4 pvkii pvr,libc++1 -pz +pz,openjdk-16-jre,rng-tools q2 q3 ql @@ -97,6 +97,7 @@ sof2 sol squad st +stn sven,libssl1.1:i386,zlib1g:i386 terraria tf2,libcurl4-gnutls-dev:i386 diff --git a/lgsm/data/ubuntu-21.04.csv b/lgsm/data/ubuntu-21.04.csv index 146e9fc2c..35bf76936 100644 --- a/lgsm/data/ubuntu-21.04.csv +++ b/lgsm/data/ubuntu-21.04.csv @@ -1,4 +1,5 @@ -all,bc,binutils,bsdmainutils,bzip2,ca-certificates,cpio,curl,file,gzip,jq,python3,tar,tmux,util-linux,netcat,unzip,xz-utils,lib32gcc-s1,lib32stdc++6,hostname +all,bc,binutils,bsdmainutils,bzip2,ca-certificates,cpio,curl,file,gzip,hostname,jq,lib32gcc-s1,lib32stdc++6,netcat,netcat,python3,tar,tmux,unzip,util-linux,wget,xz-utils +steamcmd,lib32gcc-s1,lib32stdc++6,libsdl2-2.0-0:i386,steamcmd ac ahl ahl2 @@ -68,14 +69,14 @@ nmrih,libtinfo5:i386 ns ns2,speex,libtbb2 ns2c,speex:i386,libtbb2 -onset +onset,libmariadbclient-dev opfor pc pmc,openjdk-16-jre pstbs,libgconf-2-4 pvkii pvr,libc++1 -pz +pz,openjdk-16-jre,rng-tools q2 q3 ql @@ -96,6 +97,7 @@ sof2 sol squad st +stn sven,libssl1.1:i386,zlib1g:i386 terraria tf2,libcurl4-gnutls-dev:i386 diff --git a/lgsm/functions/check_deps.sh b/lgsm/functions/check_deps.sh index e5f5aead2..f961d076a 100755 --- a/lgsm/functions/check_deps.sh +++ b/lgsm/functions/check_deps.sh @@ -173,6 +173,11 @@ fn_install_missing_deps(){ eval "${cmd}" fi autodepinstall="$?" + + # If auto install passes remove steamcmd install failure. + if [ "${autodepinstall}" == "0" ]; then + unset steamcmdfail + fi fi # If automatic dependency install is unavailable. @@ -217,8 +222,14 @@ fn_check_loop(){ # Checks if dependency is installed or not. fn_deps_detector(){ + ## Check. + # SteamCMD: Will be removed from required array if non-free repo is not available. + # This will cause SteamCMD to be installed using tar. + if [ "${deptocheck}" == "steamcmd" ]&&[ "${distroid}" == "debian" ]&& ! grep -qE "^deb .*non-free" /etc/apt/sources.list; then + array_deps_required=( "${array_deps_required[@]/steamcmd}" ) + steamcmdstatus=1 # Java: Added for users using Oracle JRE to bypass check. - if [[ ${deptocheck} == "openjdk"* ]]||[[ ${deptocheck} == "java"* ]]; then + elif [[ ${deptocheck} == "openjdk"* ]]||[[ ${deptocheck} == "java"* ]]; then # Is java already installed? if [ -n "${javaversion}" ]; then # Added for users using Oracle JRE to bypass check. @@ -249,25 +260,28 @@ fn_deps_detector(){ depstatus=$? fi - if [ "${depstatus}" == "0" ]; then + # Outcome of Check. + if [ "${steamcmdstatus}" == "1" ]; then + # If SteamCMD is not available in repo dont check for it. + unset steamcmdstatus + elif [ "${depstatus}" == "0" ]; then # If dependency is found. missingdep=0 if [ "${commandname}" == "INSTALL" ]; then echo -e "${green}${deptocheck}${default}" sleep 0.1 fi - else + elif [ "${depstatus}" != "0" ]; then # If dependency is not found. missingdep=1 if [ "${commandname}" == "INSTALL" ]; then echo -e "${red}${deptocheck}${default}" sleep 0.1 fi - # Define required dependencies for SteamCMD. + # If SteamCMD requirements are not met install will fail. if [ -n "${appid}" ]; then - array_steamcmd_deps_required=("${depsteamcmd}") - for steamcmddeptocheck in ${array_steamcmd_deps_required[*]}; do - if [ "${deptocheck}" == "${steamcmddeptocheck}" ]; then + for steamcmddeptocheck in ${array_deps_required_steamcmd[*]}; do + if [ "${deptocheck}" != "steamcmd" ]&&[ "${deptocheck}" == "${steamcmddeptocheck}" ]; then steamcmdfail=1 fi done @@ -298,13 +312,6 @@ fi info_distro.sh -# some RHEL based distros use 8.4 instead of just 8. -if [[ "${distroidlike}" == *"rhel"* ]]||[ "${distroid}" == "rhel" ]; then - distroversioncsv="${distroversionrh}" -else - distroversioncsv="${distroversion}" -fi - if [ ! -f "${tmpdir}/dependency-no-check.tmp" ]&&[ ! -f "${datadir}/${distroid}-${distroversioncsv}.csv" ]; then # Check that the disto dependency csv file exists. fn_check_file_github "lgsm/data" "${distroid}-${distroversioncsv}.csv" @@ -323,6 +330,7 @@ if [ -f "${datadir}/${distroid}-${distroversioncsv}.csv" ]; then array_deps_missing=() array_deps_required=("${depall} ${depsteamcmd} ${depshortname}") + array_deps_required_steamcmd=("${depsteamcmd}") fn_deps_email # Unique sort dependency array. IFS=" " read -r -a array_deps_required <<< "$(echo "${array_deps_required[@]}" | tr ' ' '\n' | sort -u | tr '\n' ' ')" diff --git a/lgsm/functions/command_update_linuxgsm.sh b/lgsm/functions/command_update_linuxgsm.sh index 4027c1e6d..e7b70f327 100755 --- a/lgsm/functions/command_update_linuxgsm.sh +++ b/lgsm/functions/command_update_linuxgsm.sh @@ -11,6 +11,7 @@ functionselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" fn_firstcommand_set check.sh +info_distro.sh fn_print_dots "" fn_script_log_info "Updating LinuxGSM" @@ -146,6 +147,38 @@ else fn_script_log_pass "Checking ${remotereponame} config _default.cfg" fi +# Check distro csv. ${datadir}/${distroid}-${distroversioncsv}.csv +if [ -f "${datadir}/${distroid}-${distroversioncsv}.csv" ]; then + echo -en "checking ${remotereponame} config ${distroid}-${distroversioncsv}.csv...\c" + fn_script_log_info "Checking ${remotereponame} ${distroid}-${distroversioncsv}.csv" + if [ "${remotereponame}" == "GitHub" ]; then + curl --connect-timeout 10 -IsfL "https://raw.githubusercontent.com/${githubuser}/${githubrepo}/${githubbranch}/lgsm/data/${distroid}-${distroversioncsv}.csv" 1>/dev/null + else + curl --connect-timeout 10 -IsfL "https://bitbucket.org/${githubuser}/${githubrepo}/raw/${githubbranch}/lgsm/data/${distroid}-${distroversioncsv}.csv" 1>/dev/null + fi + if [ $? != "0" ]; then + fn_print_fail_eol_nl + fn_script_log_fatal "Checking ${remotereponame} ${distroid}-${distroversioncsv}.csv" + fn_script_log_fatal "Curl returned error: $?" + core_exit.sh + fi + + if [ "${remotereponame}" == "GitHub" ]; then + config_file_diff=$(diff "${datadir}/${distroid}-${distroversioncsv}.csv" <(curl --connect-timeout 10 -s "https://raw.githubusercontent.com/${githubuser}/${githubrepo}/${githubbranch}/lgsm/data/${distroid}-${distroversioncsv}.csv")) + else + config_file_diff=$(diff "${datadir}/${distroid}-${distroversioncsv}.csv" <(curl --connect-timeout 10 -s "https://bitbucket.org/${githubuser}/${githubrepo}/raw/${githubbranch}/lgsm/data/${distroid}-${distroversioncsv}.csv")) + fi + + if [ "${config_file_diff}" != "" ]; then + fn_print_update_eol_nl + fn_script_log_update "Checking ${remotereponame} ${distroid}-${distroversioncsv}.csv" + rm -f "${datadir:?}/${distroid}-${distroversioncsv}.csv" + fn_fetch_file_github "lgsm/data" "${distroid}-${distroversioncsv}.csv" "${datadir}" "nochmodx" "norun" "noforce" "nohash" + else + fn_print_ok_eol_nl + fn_script_log_pass "Checking ${remotereponame} ${distroid}-${distroversioncsv}.csv" + fi +fi # Check and update modules. if [ -n "${functionsdir}" ]; then if [ -d "${functionsdir}" ]; then diff --git a/lgsm/functions/info_distro.sh b/lgsm/functions/info_distro.sh index dcde3ba7e..d8f5dfaca 100755 --- a/lgsm/functions/info_distro.sh +++ b/lgsm/functions/info_distro.sh @@ -73,6 +73,13 @@ for distro_info in "${distro_info_array[@]}"; do fi done +# some RHEL based distros use 8.4 instead of just 8. +if [[ "${distroidlike}" == *"rhel"* ]]||[ "${distroid}" == "rhel" ]; then + distroversioncsv="${distroversionrh}" +else + distroversioncsv="${distroversion}" +fi + ## Glibc version # e.g: 1.17 glibcversion="$(ldd --version | sed -n '1s/.* //p')" From da40c636e6513abe09c55127c56dc56f34256c5b Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Tue, 28 Sep 2021 22:54:05 +0100 Subject: [PATCH 067/164] Release v21.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 e9a4aab6f..6c6edbdfc 100755 --- a/lgsm/functions/core_functions.sh +++ b/lgsm/functions/core_functions.sh @@ -8,7 +8,7 @@ functionselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" -modulesversion="v21.3.0" +modulesversion="v21.3.1" # Core diff --git a/linuxgsm.sh b/linuxgsm.sh index a70a50f13..c7620cd72 100755 --- a/linuxgsm.sh +++ b/linuxgsm.sh @@ -20,7 +20,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="v21.3.0" +version="v21.3.1" shortname="core" gameservername="core" commandname="CORE" diff --git a/tests/tests_fctrserver.sh b/tests/tests_fctrserver.sh index 4e3941a8d..05ae0795e 100644 --- a/tests/tests_fctrserver.sh +++ b/tests/tests_fctrserver.sh @@ -20,7 +20,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="v21.3.0" +version="v21.3.1" shortname="fctr" gameservername="fctrserver" commandname="CORE" diff --git a/tests/tests_jc2server.sh b/tests/tests_jc2server.sh index d14025115..609f71f50 100644 --- a/tests/tests_jc2server.sh +++ b/tests/tests_jc2server.sh @@ -20,7 +20,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="v21.3.0" +version="v21.3.1" shortname="jc2" gameservername="jc2server" commandname="CORE" diff --git a/tests/tests_mcserver.sh b/tests/tests_mcserver.sh index 4866b92f3..a9dc9abf2 100644 --- a/tests/tests_mcserver.sh +++ b/tests/tests_mcserver.sh @@ -20,7 +20,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="v21.3.0" +version="v21.3.1" shortname="mc" gameservername="mcserver" commandname="CORE" diff --git a/tests/tests_ts3server.sh b/tests/tests_ts3server.sh index ed52a0e67..7f72dd7ef 100644 --- a/tests/tests_ts3server.sh +++ b/tests/tests_ts3server.sh @@ -20,7 +20,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="v21.3.0" +version="v21.3.1" shortname="ts3" gameservername="ts3server" commandname="CORE" From 23bbc227aefd3db2c01039581d53d6310a14509c Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Tue, 28 Sep 2021 17:07:22 +0100 Subject: [PATCH 068/164] New Labeler action add distros add bug and feature new labels fastdl regex Add sponsor label --- .github/labeler.yml | 83 ++ .github/workflows/label-sponsors.yml | 14 + .github/workflows/labeler.yml | 1393 +------------------------- 3 files changed, 103 insertions(+), 1387 deletions(-) create mode 100644 .github/labeler.yml create mode 100644 .github/workflows/label-sponsors.yml diff --git a/.github/labeler.yml b/.github/labeler.yml new file mode 100644 index 000000000..c8ebdad6f --- /dev/null +++ b/.github/labeler.yml @@ -0,0 +1,83 @@ +# Add/remove 'critical' label if issue contains the words 'urgent' or 'critical' +# Type +"type: game server request": + - '(Server Request)' +"type: bug": + - '(bug)' +"type: feature request": + - '(feature)' +# Commands +"command: backup": + - '(backup)' +"command: console": + - '(console|tmux)' +"command: debug": + - '(debug)' +"command: details": + - '(details)' +"command: fast-dl": + - '(fast-dl|fastdl)' +"command: install": + - '(install)' +"command: mods": + - '(mods)' +"command: monitor": + - '(monitor)' +"command: post-details": + - '(post-details)' +"command: restart": + - '(restart)' +"command: send": + - '(send)' +"command: skeleton": + - '(skeleton)' +"command: start": + - '(start)' +"command: stop": + - '(stop)' +"command: update-lgsm": + - '(update-lgsm)' +"command: update": + - '(update)' +"command: validate": + - '(validate)' +"command: wipe": + - '(wipe)' +# Distros +"distro: AlmaLinux": + - '(Alma)' +"distro: Arch Linux": + - '(Arch)' +"distro: CentOS": + - '(CentOS)' +"distro: Debian": + - '(Debian)' +"distro: Fedora": + - '(Fedora)' +"distro: openSUSE": + - '(openSUSE)' +"distro: Rocky Linux": + - '(Rocky)' +"distro: Slackware": + - '(Slackware)' +"distro: Ubuntu": + - '(Ubuntu)' +# Info +"info: alerts": + - '(alert)' +"info: dependency": + - '(dependency|deps)' +"info: docker": + - '(docker)' +"info: docs": + - '(documentation|docs)' +"info: email": + - '(postfix|sendmail|exim|smtp)' +"info: steamcmd": + - '(steamcmd)' +"info: systemd": + - '(systemd)' +"info: tmux": + - '(tmux)' +"info: website": + - '(website)' diff --git a/.github/workflows/label-sponsors.yml b/.github/workflows/label-sponsors.yml new file mode 100644 index 000000000..0b7691cbb --- /dev/null +++ b/.github/workflows/label-sponsors.yml @@ -0,0 +1,14 @@ +name: Label sponsors +on: + pull_request: + types: [opened, edited] + issues: + types: [opened, edited] +jobs: + build: + name: is-sponsor-label + runs-on: ubuntu-latest + steps: + - uses: JasonEtco/is-sponsor-label-action@v1 + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} diff --git a/.github/workflows/labeler.yml b/.github/workflows/labeler.yml index 30ccb5a03..8d806009d 100644 --- a/.github/workflows/labeler.yml +++ b/.github/workflows/labeler.yml @@ -1,1394 +1,13 @@ -name: "Set Issue Label and Assignee" +name: "Issue Labeler" on: issues: types: [opened, edited] - pull_request: - types: [opened, edited] jobs: - test: + triage: runs-on: ubuntu-latest steps: - - uses: Naturalclar/issue-action@v2.0.2 - with: - title-or-body: "both" - parameters: ' - [{ - "keywords": [ - "Server Request", - "" - ], - "labels": [ - "type: game server request" - ] - }, - { - "keywords": [ - "backup", - "" - ], - "labels": [ - "command: backup" - ] - }, - { - "keywords": [ - "console", - "" - ], - "labels": [ - "command: console" - ] - }, - { - "keywords": [ - "command: debug", - "" - ], - "labels": [ - "command: debug" - ] - }, - { - "keywords": [ - "command: details", - "" - ], - "labels": [ - "command: details" - ] - }, - { - "keywords": [ - "fast-dl", - "" - ], - "labels": [ - "command: fast-dl" - ] - }, - { - "keywords": [ - "command: install", - "" - ], - "labels": [ - "command: install" - ] - }, - { - "keywords": [ - "command: mods", - "" - ], - "labels": [ - "command: mods" - ] - }, - { - "keywords": [ - "monitor", - "" - ], - "labels": [ - "command: monitor" - ] - }, - { - "keywords": [ - "command: start", - "" - ], - "labels": [ - "command: start" - ] - }, - { - "keywords": [ - "command: stop", - "" - ], - "labels": [ - "command: stop" - ] - }, - { - "keywords": [ - "command: update-lgsm", - "" - ], - "labels": [ - "command: update-lgsm" - ] - }, - { - "keywords": [ - "update", - "" - ], - "labels": [ - "command: update" - ] - }, - { - "keywords": [ - "validate", - "" - ], - "labels": [ - "command: validate" - ] - }, - { - "keywords": [ - "wipe", - "" - ], - "labels": [ - "command: wipe" - ] - }, - { - "keywords": [ - "CentOS", - "" - ], - "labels": [ - "distro: CentOS" - ] - }, - { - "keywords": [ - "Debian", - "" - ], - "labels": [ - "distro: Debian" - ] - }, - { - "keywords": [ - "Fedora", - "" - ], - "labels": [ - "distro: Fedora" - ] - }, - { - "keywords": [ - "Ubuntu", - "" - ], - "labels": [ - "distro: Ubuntu" - ] - }, - { - "keywords": [ - "Rocky", - "" - ], - "labels": [ - "distro: Rocky Linux" - ] - }, - { - "keywords": [ - "Slackware", - "" - ], - "labels": [ - "distro: Slackware" - ] - }, - { - "keywords": [ - "Arch", - "" - ], - "labels": [ - "distro: Arch Linux" - ] - }, - { - "keywords": [ - "SUSE", - "" - ], - "labels": [ - "distro: openSUSE" - ] - }, - { - "keywords": [ - "Alma", - "" - ], - "labels": [ - "distro: AlmaLinux" - ] - }, - { - "keywords": [ - "alert", - "" - ], - "labels": [ - "info: alerts" - ] - }, - { - "keywords": [ - "dependency", - "" - ], - "labels": [ - "info: dependency" - ] - }, - { - "keywords": [ - "docker", - "" - ], - "labels": [ - "info: docker" - ] - }, - { - "keywords": [ - "steamcmd", - "" - ], - "labels": [ - "info: steamcmd" - ] - }, - { - "keywords": [ - "systemd", - "" - ], - "labels": [ - "info: systemd" - ] - }, - { - "keywords": [ - "tmux", - "" - ], - "labels": [ - "info: tmux" - ] - }, - { - "keywords": [ - "bug", - "" - ], - "labels": [ - "type: bug" - ] - }, - { - "keywords": [ - "feature", - "" - ], - "labels": [ - "type: feature request" - ] - }, - { - "keywords": [ - "refactor", - "" - ], - "labels": [ - "type: refactor" - ] - }, - { - "keywords": [ - "7 Days to Die", - "" - ], - "labels": [ - "game: 7 Days to Die" - ] - }, - { - "keywords": [ - "Action Half-Life", - "" - ], - "labels": [ - "" - ] - }, - { - "keywords": [ - "Action: Source", - "" - ], - "labels": [ - "" - ] - }, - { - "keywords": [ - "ARK: Survival Evolved", - "ARK" - ], - "labels": [ - "game: Ark: Survival Evolved" - ] - }, - { - "keywords": [ - "ARMA 3", - "" - ], - "labels": [ - "game:ARMA 3" - ] - }, - { - "keywords": [ - "Assetto Corsa", - "" - ], - "labels": [ - "game:Assetto Corsa" - ] - }, - { - "keywords": [ - "Avorion", - "" - ], - "labels": [ - "game:Avorion" - ] - }, - { - "keywords": [ - "Ballistic Overkill", - "" - ], - "labels": [ - "game:Ballistic Overkill" - ] - }, - { - "keywords": [ - "Barotrauma", - "" - ], - "labels": [ - "game:Barotrauma" - ] - }, - { - "keywords": [ - "Base Defense", - "" - ], - "labels": [ - "game:Base Defense" - ] - }, - { - "keywords": [ - "Battalion 1944", - "" - ], - "labels": [ - "game:Battalion 1944" - ] - }, - { - "keywords": [ - "Battlefield 1942", - "" - ], - "labels": [ - "game:Battlefield 1942" - ] - }, - { - "keywords": [ - "Battlefield: Vietnam", - "" - ], - "labels": [ - "game:Battlefield: Vietnam" - ] - }, - { - "keywords": [ - "Black Mesa: Deathmatch", - "" - ], - "labels": [ - "game:Black Mesa: Deathmatch" - ] - }, - { - "keywords": [ - "Blade Symphony", - "" - ], - "labels": [ - "game:Blade Symphony" - ] - }, - { - "keywords": [ - "BrainBread", - "" - ], - "labels": [ - "game:BrainBread" - ] - }, - { - "keywords": [ - "BrainBread 2", - "" - ], - "labels": [ - "game:BrainBread 2" - ] - }, - { - "keywords": [ - "Call of Duty", - "" - ], - "labels": [ - "game:Call of Duty" - ] - }, - { - "keywords": [ - "Call of Duty 2", - "" - ], - "labels": [ - "game:Call of Duty 2" - ] - }, - { - "keywords": [ - "Call of Duty 4", - "" - ], - "labels": [ - "game:Call of Duty 4" - ] - }, - { - "keywords": [ - "Call of Duty: United Offensive", - "" - ], - "labels": [ - "game:Call of Duty: United Offensive" - ] - }, - { - "keywords": [ - "Call of Duty: World at War", - "" - ], - "labels": [ - "game:Call of Duty: World at War" - ] - }, - { - "keywords": [ - "Chivalry: Medieval Warfare", - "" - ], - "labels": [ - "game:Chivalry: Medieval Warfare" - ] - }, - { - "keywords": [ - "Codename CURE", - "" - ], - "labels": [ - "game:Codename CURE" - ] - }, - { - "keywords": [ - "Colony Survival", - "" - ], - "labels": [ - "game:Colony Survival" - ] - }, - { - "keywords": [ - "Counter-Strike 1.6", - "" - ], - "labels": [ - "game:Counter-Strike 1.6" - ] - }, - { - "keywords": [ - "Counter-Strike: Condition Zero", - "" - ], - "labels": [ - "game:Counter-Strike: Condition Zero" - ] - }, - { - "keywords": [ - "Counter-Strike: Global Offensive", - "" - ], - "labels": [ - "game:Counter-Strike: Global Offensive" - ] - }, - { - "keywords": [ - "Counter-Strike: Source", - "" - ], - "labels": [ - "game:Counter-Strike: Source" - ] - }, - { - "keywords": [ - "Day of Defeat", - "" - ], - "labels": [ - "game:Day of Defeat" - ] - }, - { - "keywords": [ - "Day of Defeat: Source", - "" - ], - "labels": [ - "game:Day of Defeat: Source" - ] - }, - { - "keywords": [ - "Day of Dragons", - "" - ], - "labels": [ - "game:Day of Dragons" - ] - }, - { - "keywords": [ - "Day of Infamy", - "" - ], - "labels": [ - "game:Day of Infamy" - ] - }, - { - "keywords": [ - "Deathmatch Classic", - "" - ], - "labels": [ - "game:Deathmatch Classic" - ] - }, - { - "keywords": [ - "Don't Starve Together" - ], - "labels": [ - "game:Don't Starve Together" - ] - }, - { - "keywords": [ - "Double Action: Boogaloo", - "" - ], - "labels": [ - "game:Double Action: Boogaloo" - ] - }, - { - "keywords": [ - "Dystopia", - "" - ], - "labels": [ - "game:Dystopia" - ] - }, - { - "keywords": [ - "Eco", - "" - ], - "labels": [ - "game:Eco" - ] - }, - { - "keywords": [ - "Empires Mod", - "" - ], - "labels": [ - "game:Empires Mod" - ] - }, - { - "keywords": [ - "ET: Legacy", - "" - ], - "labels": [ - "game:ET: Legacy" - ] - }, - { - "keywords": [ - "Factorio", - "" - ], - "labels": [ - "game:Factorio" - ] - }, - { - "keywords": [ - "Fistful of Frags", - "" - ], - "labels": [ - "game:Fistful of Frags" - ] - }, - { - "keywords": [ - "Garrys Mod", - "" - ], - "labels": [ - "game:Garrys Mod" - ] - }, - { - "keywords": [ - "Half-Life 2: Deathmatch", - "" - ], - "labels": [ - "game:Half-Life 2: Deathmatch" - ] - }, - { - "keywords": [ - "Half-Life Deathmatch: Source", - "" - ], - "labels": [ - "game:Half-Life Deathmatch: Source" - ] - }, - { - "keywords": [ - "Half-Life: Deathmatch", - "" - ], - "labels": [ - "game:Half-Life: Deathmatch" - ] - }, - { - "keywords": [ - "Hurtworld", - "" - ], - "labels": [ - "game:Hurtworld" - ] - }, - { - "keywords": [ - "Insurgency", - "" - ], - "labels": [ - "game:Insurgency" - ] - }, - { - "keywords": [ - "Insurgency: Sandstorm", - "" - ], - "labels": [ - "game:Insurgency: Sandstorm" - ] - }, - { - "keywords": [ - "IOSoccer", - "" - ], - "labels": [ - "game:IOSoccer" - ] - }, - { - "keywords": [ - "Jedi Knight II: Jedi Outcast", - "" - ], - "labels": [ - "game:Jedi Knight II: Jedi Outcast" - ] - }, - { - "keywords": [ - "Just Cause 2", - "" - ], - "labels": [ - "game:Just Cause 2" - ] - }, - { - "keywords": [ - "Just Cause 3", - "" - ], - "labels": [ - "game:Just Cause 3" - ] - }, - { - "keywords": [ - "Killing Floor", - "" - ], - "labels": [ - "game:Killing Floor" - ] - }, - { - "keywords": [ - "Killing Floor 2", - "" - ], - "labels": [ - "game:Killing Floor 2" - ] - }, - { - "keywords": [ - "Last Oasis", - "" - ], - "labels": [ - "game:Last Oasis" - ] - }, - { - "keywords": [ - "Left 4 Dead", - "" - ], - "labels": [ - "game:Left 4 Dead" - ] - }, - { - "keywords": [ - "Left 4 Dead 2", - "" - ], - "labels": [ - "game:Left 4 Dead 2" - ] - }, - { - "keywords": [ - "Medal of Honor: Allied Assault", - "" - ], - "labels": [ - "game:Medal of Honor: Allied Assault" - ] - }, - { - "keywords": [ - "Memories of Mars", - "" - ], - "labels": [ - "game:Memories of Mars" - ] - }, - { - "keywords": [ - "Minecraft", - "" - ], - "labels": [ - "game:Minecraft" - ] - }, - { - "keywords": [ - "Minecraft Bedrock", - "" - ], - "labels": [ - "game:Minecraft Bedrock" - ] - }, - { - "keywords": [ - "MORDHAU", - "" - ], - "labels": [ - "game:MORDHAU" - ] - }, - { - "keywords": [ - "Multi Theft Auto", - "" - ], - "labels": [ - "game:Multi Theft Auto" - ] - }, - { - "keywords": [ - "Mumble", - "" - ], - "labels": [ - "game:Mumble" - ] - }, - { - "keywords": [ - "Natural Selection", - "" - ], - "labels": [ - "game:Natural Selection" - ] - }, - { - "keywords": [ - "Natural Selection 2", - "" - ], - "labels": [ - "game:Natural Selection 2" - ] - }, - { - "keywords": [ - "No More Room in Hell", - "" - ], - "labels": [ - "game:No More Room in Hell" - ] - }, - { - "keywords": [ - "NS2: Combat", - "" - ], - "labels": [ - "game:NS2: Combat" - ] - }, - { - "keywords": [ - "Nuclear Dawn", - "" - ], - "labels": [ - "game:Nuclear Dawn" - ] - }, - { - "keywords": [ - "Onset", - "" - ], - "labels": [ - "game:Onset" - ] - }, - { - "keywords": [ - "Opposing Force", - "" - ], - "labels": [ - "game:Opposing Force" - ] - }, - { - "keywords": [ - "PaperMC", - "" - ], - "labels": [ - "game:PaperMC" - ] - }, - { - "keywords": [ - "Pavlov VR", - "" - ], - "labels": [ - "game:Pavlov VR" - ] - }, - { - "keywords": [ - "Pirates Vikings & Knights II", - "" - ], - "labels": [ - "game:Pirates Vikings & Knights II" - ] - }, - { - "keywords": [ - "Post Scriptum: The Bloody Seventh", - "" - ], - "labels": [ - "game:Post Scriptum: The Bloody Seventh" - ] - }, - { - "keywords": [ - "Project Cars", - "" - ], - "labels": [ - "game:Project Cars" - ] - }, - { - "keywords": [ - "Project Zomboid", - "" - ], - "labels": [ - "game:Project Zomboid" - ] - }, - { - "keywords": [ - "Quake 2", - "" - ], - "labels": [ - "game:Quake 2" - ] - }, - { - "keywords": [ - "Quake 3: Arena", - "" - ], - "labels": [ - "game:Quake 3: Arena" - ] - }, - { - "keywords": [ - "Quake Live", - "" - ], - "labels": [ - "game:Quake Live" - ] - }, - { - "keywords": [ - "Quake World", - "" - ], - "labels": [ - "game:Quake World" - ] - }, - { - "keywords": [ - "Red Orchestra: Ostfront 41-45", - "" - ], - "labels": [ - "game:Red Orchestra: Ostfront 41-45" - ] - }, - { - "keywords": [ - "Return to Castle Wolfenstein", - "" - ], - "labels": [ - "game:Return to Castle Wolfenstein" - ] - }, - { - "keywords": [ - "Ricochet", - "" - ], - "labels": [ - "game:Ricochet" - ] - }, - { - "keywords": [ - "Rising World", - "" - ], - "labels": [ - "game:Rising World" - ] - }, - { - "keywords": [ - "Rust", - "" - ], - "labels": [ - "game:Rust" - ] - }, - { - "keywords": [ - "San Andreas Multiplayer", - "" - ], - "labels": [ - "game:San Andreas Multiplayer" - ] - }, - { - "keywords": [ - "SCP: Secret Laboratory", - "" - ], - "labels": [ - "game:SCP: Secret Laboratory" - ] - }, - { - "keywords": [ - "SCP: Secret Laboratory ServerMod", - "" - ], - "labels": [ - "game:SCP: Secret Laboratory ServerMod" - ] - }, - { - "keywords": [ - "Soldat", - "" - ], - "labels": [ - "game:Soldat" - ] - }, - { - "keywords": [ - "Soldier Of Fortune 2: Gold Edition", - "" - ], - "labels": [ - "game:Soldier Of Fortune 2: Gold Edition" - ] - }, - { - "keywords": [ - "SourceForts Classic", - "" - ], - "labels": [ - "game:SourceForts Classic" - ] - }, - { - "keywords": [ - "Squad", - "" - ], - "labels": [ - "game:Squad" - ] - }, - { - "keywords": [ - "Starbound", - "" - ], - "labels": [ - "game:Starbound" - ] - }, - { - "keywords": [ - "Stationeers", - "" - ], - "labels": [ - "game:Stationeers" - ] - }, - { - "keywords": [ - "StickyBots", - "" - ], - "labels": [ - "game:StickyBots" - ] - }, - { - "keywords": [ - "Survive the Nights", - "" - ], - "labels": [ - "game:Survive the Nights" - ] - }, - { - "keywords": [ - "Sven Co-op", - "" - ], - "labels": [ - "game:Sven Co-op" - ] - }, - { - "keywords": [ - "Team Fortress 2", - "" - ], - "labels": [ - "game:Team Fortress 2" - ] - }, - { - "keywords": [ - "Team Fortress Classic", - "" - ], - "labels": [ - "game:Team Fortress Classic" - ] - }, - { - "keywords": [ - "Teamspeak 3", - "" - ], - "labels": [ - "game:Teamspeak 3" - ] - }, - { - "keywords": [ - "Teeworlds", - "" - ], - "labels": [ - "game:Teeworlds" - ] - }, - { - "keywords": [ - "Terraria", - "" - ], - "labels": [ - "game:Terraria" - ] - }, - { - "keywords": [ - "The Specialists", - "" - ], - "labels": [ - "game:The Specialists" - ] - }, - { - "keywords": [ - "Tower Unite", - "" - ], - "labels": [ - "game:Tower Unite" - ] - }, - { - "keywords": [ - "Unreal Tournament", - "" - ], - "labels": [ - "game:Unreal Tournament" - ] - }, - { - "keywords": [ - "Unreal Tournament 2004", - "" - ], - "labels": [ - "game:Unreal Tournament 2004" - ] - }, - { - "keywords": [ - "Unreal Tournament 3", - "" - ], - "labels": [ - "game:Unreal Tournament 3" - ] - }, - { - "keywords": [ - "Unreal Tournament 99", - "" - ], - "labels": [ - "game:Unreal Tournament 99" - ] - }, - { - "keywords": [ - "Unturned", - "" - ], - "labels": [ - "game:Unturned" - ] - }, - { - "keywords": [ - "Valheim", - "" - ], - "labels": [ - "game:Valheim" - ] - }, - { - "keywords": [ - "Vampire Slayer", - "" - ], - "labels": [ - "game:Vampire Slayer" - ] - }, - { - "keywords": [ - "Vintage Story", - "" - ], - "labels": [ - "game:Vintage Story" - ] - }, - { - "keywords": [ - "Warfork", - "" - ], - "labels": [ - "game:Warfork" - ] - }, - { - "keywords": [ - "WaterfallMC", - "" - ], - "labels": [ - "game:WaterfallMC" - ] - }, - { - "keywords": [ - "Wolfenstein: Enemy Territory", - "" - ], - "labels": [ - "game:Wolfenstein: Enemy Territory" - ] - }, - { - "keywords": [ - "Wurm Unlimited", - "" - ], - "labels": [ - "game:Wurm Unlimited" - ] - }, - { - "keywords": [ - "Zombie Master: Reborn", - "" - ], - "labels": [ - "game:Zombie Master: Reborn" - ] - }, - { - "keywords": [ - "Zombie Panic! Source", - "" - ], - "labels": [ - "game:Zombie Panic! Source" - ] - } - ] - ' - github-token: "${{ secrets.GITHUB_TOKEN }}" + - uses: github/issue-labeler@v2.0 + with: + repo-token: "${{ secrets.GITHUB_TOKEN }}" + configuration-path: .github/labeler.yml From 1766d43c720618cc4403322cce3d7bb30b3ae4c0 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Tue, 28 Sep 2021 23:23:19 +0100 Subject: [PATCH 069/164] fix(details): steam port showing when unavailable --- 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 ef3b0a7b3..c670bec05 100755 --- a/lgsm/functions/info_messages.sh +++ b/lgsm/functions/info_messages.sh @@ -1366,7 +1366,7 @@ fn_info_message_source(){ fn_port "RCON" rconport tcp fn_port "SourceTV" sourcetvport udp # Will not show if unaviable - if [ "${steamport}" == "0" ]||[ -z "${steamport}" ]; then + if [ "${steamport}" == "0" ]||[ -v "${steamport}" ]; then fn_port "Steam" steamport udp fi fn_port "Client" clientport udp From bdd5b1f22c279d80a5930f0bfdacbd63b855182e Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Tue, 28 Sep 2021 23:23:19 +0100 Subject: [PATCH 070/164] fix(details): steam port showing when unavailable --- 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 ef3b0a7b3..c670bec05 100755 --- a/lgsm/functions/info_messages.sh +++ b/lgsm/functions/info_messages.sh @@ -1366,7 +1366,7 @@ fn_info_message_source(){ fn_port "RCON" rconport tcp fn_port "SourceTV" sourcetvport udp # Will not show if unaviable - if [ "${steamport}" == "0" ]||[ -z "${steamport}" ]; then + if [ "${steamport}" == "0" ]||[ -v "${steamport}" ]; then fn_port "Steam" steamport udp fi fn_port "Client" clientport udp From 3fe55b634d81669dd82f419bcecbd9e1d47d26ca Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Wed, 29 Sep 2021 00:01:13 +0100 Subject: [PATCH 071/164] actions: fixes for labeler and sponsored labeler test reg --- .github/labeler.yml | 78 ++++++++++++++-------------- .github/workflows/label-sponsors.yml | 4 +- .github/workflows/labeler.yml | 4 +- 3 files changed, 44 insertions(+), 42 deletions(-) diff --git a/.github/labeler.yml b/.github/labeler.yml index c8ebdad6f..683b29f32 100644 --- a/.github/labeler.yml +++ b/.github/labeler.yml @@ -1,83 +1,83 @@ # Add/remove 'critical' label if issue contains the words 'urgent' or 'critical' # Type "type: game server request": - - '(Server Request)' + - '/(Server Request)/i' "type: bug": - - '(bug)' + - '/(bug)/i' "type: feature request": - - '(feature)' + - '/(feature)/i' # Commands "command: backup": - - '(backup)' + - '/(backup)/i' "command: console": - - '(console|tmux)' + - '/(console|tmux)/i' "command: debug": - - '(debug)' + - '/(debug)/i' "command: details": - - '(details)' + - '/(details)/i' "command: fast-dl": - - '(fast-dl|fastdl)' + - '/(fast-dl|fastdl)/i' "command: install": - - '(install)' + - '/(install)/i' "command: mods": - - '(mods)' + - '/(mods)/i' "command: monitor": - - '(monitor)' + - '/(monitor)/i' "command: post-details": - - '(post-details)' + - '/(post-details)/i' "command: restart": - - '(restart)' + - '/(restart)/i' "command: send": - - '(send)' + - '/(send)/i' "command: skeleton": - - '(skeleton)' + - '/(skeleton)/i' "command: start": - - '(start)' + - '/(start)/i' "command: stop": - - '(stop)' + - '/(stop)/i' "command: update-lgsm": - - '(update-lgsm)' + - '/(update-lgsm)/i' "command: update": - - '(update)' + - '/(update)/i' "command: validate": - - '(validate)' + - '/(validate)/i' "command: wipe": - - '(wipe)' + - '/(wipe)/i' # Distros "distro: AlmaLinux": - - '(Alma)' + - '/(Alma)/i' "distro: Arch Linux": - - '(Arch)' + - '/(Arch)/i' "distro: CentOS": - - '(CentOS)' + - '/(CentOS)/i' "distro: Debian": - - '(Debian)' + - '/(Debian)/i' "distro: Fedora": - - '(Fedora)' + - '/(Fedora)/i' "distro: openSUSE": - - '(openSUSE)' + - '/(openSUSE|suse)/i' "distro: Rocky Linux": - - '(Rocky)' + - '/(Rocky)/i' "distro: Slackware": - - '(Slackware)' + - '/(Slackware)/i' "distro: Ubuntu": - - '(Ubuntu)' + - '/(Ubuntu)/i' # Info "info: alerts": - - '(alert)' + - '/(alert)/i' "info: dependency": - - '(dependency|deps)' + - '/(dependency|deps)/i' "info: docker": - - '(docker)' + - '/(docker)/i' "info: docs": - - '(documentation|docs)' + - '/(documentation|docs)/i' "info: email": - - '(postfix|sendmail|exim|smtp)' + - '/(postfix|sendmail|exim|smtp)/i' "info: steamcmd": - - '(steamcmd)' + - '/(steamcmd)/i' "info: systemd": - - '(systemd)' + - '/(systemd)/i' "info: tmux": - - '(tmux)' + - '/(tmux)/i' "info: website": - - '(website)' + - '/(website)/i' diff --git a/.github/workflows/label-sponsors.yml b/.github/workflows/label-sponsors.yml index 0b7691cbb..8cf880da9 100644 --- a/.github/workflows/label-sponsors.yml +++ b/.github/workflows/label-sponsors.yml @@ -1,9 +1,9 @@ name: Label sponsors on: pull_request: - types: [opened, edited] + types: [opened] issues: - types: [opened, edited] + types: [opened] jobs: build: name: is-sponsor-label diff --git a/.github/workflows/labeler.yml b/.github/workflows/labeler.yml index 8d806009d..7b8e2668a 100644 --- a/.github/workflows/labeler.yml +++ b/.github/workflows/labeler.yml @@ -7,7 +7,9 @@ jobs: triage: runs-on: ubuntu-latest steps: - - uses: github/issue-labeler@v2.0 + - uses: github/issue-labeler@v2.4 with: repo-token: "${{ secrets.GITHUB_TOKEN }}" configuration-path: .github/labeler.yml + not-before: + enable-versioned-regex: 0 From 081826b240712e2366fd87c9a4a2ea9c4378b999 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Wed, 29 Sep 2021 17:18:16 +0100 Subject: [PATCH 072/164] actions: fixes for labeler and sponsored labeler test reg add query Added games add pr-labeler --- .github/labeler.yml | 93 ++++++++++++++++------------ .github/pr-labeler.yml | 3 + .github/workflows/label-sponsors.yml | 4 +- .github/workflows/labeler.yml | 4 +- .github/workflows/pr-labeler.yml | 14 +++++ 5 files changed, 76 insertions(+), 42 deletions(-) create mode 100644 .github/pr-labeler.yml create mode 100644 .github/workflows/pr-labeler.yml diff --git a/.github/labeler.yml b/.github/labeler.yml index c8ebdad6f..5cd6740d4 100644 --- a/.github/labeler.yml +++ b/.github/labeler.yml @@ -1,83 +1,98 @@ # Add/remove 'critical' label if issue contains the words 'urgent' or 'critical' # Type "type: game server request": - - '(Server Request)' + - '/(Server Request)/i' "type: bug": - - '(bug)' + - '/(bug)/i' "type: feature request": - - '(feature)' + - '/(feature)/i' # Commands "command: backup": - - '(backup)' + - '/(backup)/i' "command: console": - - '(console|tmux)' + - '/(console|tmux)/i' "command: debug": - - '(debug)' + - '/(debug)/i' "command: details": - - '(details)' + - '/(details)/i' "command: fast-dl": - - '(fast-dl|fastdl)' + - '/(fast-dl|fastdl)/i' "command: install": - - '(install)' + - '/(install)/i' "command: mods": - - '(mods)' + - '/(mods)/i' "command: monitor": - - '(monitor)' + - '/(monitor)/i' "command: post-details": - - '(post-details)' + - '/(post-details)/i' "command: restart": - - '(restart)' + - '/(restart)/i' "command: send": - - '(send)' + - '/(send)/i' "command: skeleton": - - '(skeleton)' + - '/(skeleton)/i' "command: start": - - '(start)' + - '/(start)/i' "command: stop": - - '(stop)' + - '/(stop)/i' "command: update-lgsm": - - '(update-lgsm)' + - '/(update-lgsm)/i' "command: update": - - '(update)' + - '/(update)/i' "command: validate": - - '(validate)' + - '/(validate)/i' "command: wipe": - - '(wipe)' + - '/(wipe)/i' # Distros "distro: AlmaLinux": - - '(Alma)' + - '/(Alma)/i' "distro: Arch Linux": - - '(Arch)' + - '/(Arch)/i' "distro: CentOS": - - '(CentOS)' + - '/(CentOS)/i' "distro: Debian": - - '(Debian)' + - '/(Debian)/i' "distro: Fedora": - - '(Fedora)' + - '/(Fedora)/i' "distro: openSUSE": - - '(openSUSE)' + - '/(openSUSE|suse)/i' "distro: Rocky Linux": - - '(Rocky)' + - '/(Rocky)/i' "distro: Slackware": - - '(Slackware)' + - '/(Slackware)/i' "distro: Ubuntu": - - '(Ubuntu)' + - '/(Ubuntu)/i' # Info "info: alerts": - - '(alert)' + - '/(alert)/i' "info: dependency": - - '(dependency|deps)' + - '/(dependency|deps)/i' "info: docker": - - '(docker)' + - '/(docker)/i' "info: docs": - - '(documentation|docs)' + - '/(documentation|docs)/i' "info: email": - - '(postfix|sendmail|exim|smtp)' + - '/(postfix|sendmail|exim|smtp)/i' +"info: query": + - '/(gamedig|gsquery)/i' "info: steamcmd": - - '(steamcmd)' + - '/(steamcmd)/i' "info: systemd": - - '(systemd)' + - '/(systemd)/i' "info: tmux": - - '(tmux)' + - '/(tmux)/i' "info: website": - - '(website)' + - '/(website)/i' +# Games +"game: Ark: Survival Evolved": + - '/(Ark: Survival Evolved|Ark)/i' +"game: ARMA 3": + - '/(ARMA 3)/i' +"game: Assetto Corsa": + - '/(Assetto Corsa)/i' +"game: Avorion": + - '/(Avorion)/i' +"game: Ballistic Overkill": + - '/(Ballistic Overkill)/i' +"game: Barotrauma": + - '/(Barotrauma)/i' diff --git a/.github/pr-labeler.yml b/.github/pr-labeler.yml new file mode 100644 index 000000000..06092ef11 --- /dev/null +++ b/.github/pr-labeler.yml @@ -0,0 +1,3 @@ +feature: ['feature/*', 'feat/*'] +hotfix: hotfix/* +release: release/* diff --git a/.github/workflows/label-sponsors.yml b/.github/workflows/label-sponsors.yml index 0b7691cbb..8cf880da9 100644 --- a/.github/workflows/label-sponsors.yml +++ b/.github/workflows/label-sponsors.yml @@ -1,9 +1,9 @@ name: Label sponsors on: pull_request: - types: [opened, edited] + types: [opened] issues: - types: [opened, edited] + types: [opened] jobs: build: name: is-sponsor-label diff --git a/.github/workflows/labeler.yml b/.github/workflows/labeler.yml index 8d806009d..7b8e2668a 100644 --- a/.github/workflows/labeler.yml +++ b/.github/workflows/labeler.yml @@ -7,7 +7,9 @@ jobs: triage: runs-on: ubuntu-latest steps: - - uses: github/issue-labeler@v2.0 + - uses: github/issue-labeler@v2.4 with: repo-token: "${{ secrets.GITHUB_TOKEN }}" configuration-path: .github/labeler.yml + not-before: + enable-versioned-regex: 0 diff --git a/.github/workflows/pr-labeler.yml b/.github/workflows/pr-labeler.yml new file mode 100644 index 000000000..8b7371574 --- /dev/null +++ b/.github/workflows/pr-labeler.yml @@ -0,0 +1,14 @@ +name: PR Labeler +on: + pull_request: + types: [opened, edited, closed] + +jobs: + pr-labeler: + runs-on: ubuntu-latest + steps: + - uses: TimonVS/pr-labeler-action@v3 + with: + configuration-path: .github/pr-labeler.yml # optional, .github/pr-labeler.yml is the default value + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} From 204a43d791a3d1b48c4091f00771aed507de2402 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Sun, 3 Oct 2021 10:50:03 +0100 Subject: [PATCH 073/164] fix(loserver): make Last Oasis anonymous login --- lgsm/config-default/config-lgsm/loserver/_default.cfg | 4 ---- 1 file changed, 4 deletions(-) diff --git a/lgsm/config-default/config-lgsm/loserver/_default.cfg b/lgsm/config-default/config-lgsm/loserver/_default.cfg index 855b60f26..15ebddde5 100644 --- a/lgsm/config-default/config-lgsm/loserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/loserver/_default.cfg @@ -8,10 +8,6 @@ #### Game Server Settings #### -## SteamCMD Login | https://docs.linuxgsm.com/steamcmd#steamcmd-login -steamuser="username" -steampass='password' - ## Predefined Parameters | https://docs.linuxgsm.com/configuration/start-parameters ## https://docs.linuxgsm.com/game-servers/last-oasis servername="${selfname}" From 48308ec61e6f01e83e7e127a8b25c8fda4ef1355 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Sun, 3 Oct 2021 11:10:45 +0100 Subject: [PATCH 074/164] Revert telegram change --- 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 de5dd2714..056f11ae0 100755 --- a/lgsm/functions/alert_telegram.sh +++ b/lgsm/functions/alert_telegram.sh @@ -17,7 +17,7 @@ EOF ) fn_print_dots "Sending Telegram alert" -telegramsend=$(curl --connect-timeout 10 -sSL -H "Content-Type: application/json" -X POST -d "$(echo -n "${json}" | jq -c .)" ${curlcustomstring} "https://${telegramapi}/bot${telegramtoken}/sendMessage" | grep "error_code") +telegramsend=$(curl --connect-timeout 10 -sSL -H "Content-Type: application/json" -X POST -d """${json}""" ${curlcustomstring} "https://${telegramapi}/bot${telegramtoken}/sendMessage" | grep "error_code") if [ -n "${telegramsend}" ]; then fn_print_fail_nl "Sending Telegram alert: ${telegramsend}" From 9933a7840b25e37de09362b2a28f04dfeb04391f Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Fri, 8 Oct 2021 11:59:01 +0100 Subject: [PATCH 075/164] 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 357dfdf6e..441867e9c 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: [paypal.me/dgibbs64] # Replace with a single custom sponsorship URL +custom: # Replace with a single custom sponsorship URL From 04d680d90397ee6ded8cb8998f26b9b34192e780 Mon Sep 17 00:00:00 2001 From: Christian Date: Sat, 9 Oct 2021 21:15:39 +0200 Subject: [PATCH 076/164] fix(pstbs): fix queryport from config (#3597) --- lgsm/functions/info_game.sh | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/lgsm/functions/info_game.sh b/lgsm/functions/info_game.sh index a961a41f3..106b1b4ee 100644 --- a/lgsm/functions/info_game.sh +++ b/lgsm/functions/info_game.sh @@ -1077,7 +1077,9 @@ fn_info_game_pstbs(){ # Parameters port=${port:-"0"} - queryport=${port:-"0"} + if [ -z "${queryport}" ]; then + queryport=${port:-"0"} + fi rconport=${rconport:-"0"} randommap=${randommap:-"NOT SET"} maxplayers=${maxplayers:-"0"} From 0ef31243a8661e41ea70ecbf5ed62a99625086fa Mon Sep 17 00:00:00 2001 From: johnoclockdk <68790186+johnoclockdk@users.noreply.github.com> Date: Sat, 9 Oct 2021 21:16:54 +0200 Subject: [PATCH 078/164] fix(deps): missing dependency libsdl (#3590) --- lgsm/data/ubuntu-21.04.csv | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lgsm/data/ubuntu-21.04.csv b/lgsm/data/ubuntu-21.04.csv index 35bf76936..180be9c25 100644 --- a/lgsm/data/ubuntu-21.04.csv +++ b/lgsm/data/ubuntu-21.04.csv @@ -99,7 +99,7 @@ squad st stn sven,libssl1.1:i386,zlib1g:i386 -terraria +terraria,libsdl tf2,libcurl4-gnutls-dev:i386 tfc ts From 0fee00e19c5a4a606016ad299b1cca3cccb2a405 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Sun, 10 Oct 2021 22:24:53 +0100 Subject: [PATCH 079/164] fix(deps): steamcmd will be removed as a requirement is appid is missing (#3606) --- 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 f961d076a..862d03743 100755 --- a/lgsm/functions/check_deps.sh +++ b/lgsm/functions/check_deps.sh @@ -223,9 +223,9 @@ fn_check_loop(){ # Checks if dependency is installed or not. fn_deps_detector(){ ## Check. - # SteamCMD: Will be removed from required array if non-free repo is not available. + # SteamCMD: Will be removed from required array if no appid is present or non-free repo is not available. # This will cause SteamCMD to be installed using tar. - if [ "${deptocheck}" == "steamcmd" ]&&[ "${distroid}" == "debian" ]&& ! grep -qE "^deb .*non-free" /etc/apt/sources.list; then + if [ -z "${appid}" ]||[ "${deptocheck}" == "steamcmd" ]&&[ "${distroid}" == "debian" ]&& ! grep -qE "^deb .*non-free" /etc/apt/sources.list; then array_deps_required=( "${array_deps_required[@]/steamcmd}" ) steamcmdstatus=1 # Java: Added for users using Oracle JRE to bypass check. @@ -313,7 +313,7 @@ fi info_distro.sh if [ ! -f "${tmpdir}/dependency-no-check.tmp" ]&&[ ! -f "${datadir}/${distroid}-${distroversioncsv}.csv" ]; then - # Check that the disto dependency csv file exists. + # Check that the distro dependency csv file exists. fn_check_file_github "lgsm/data" "${distroid}-${distroversioncsv}.csv" if [ -n "${checkflag}" ]&&[ "${checkflag}" == "0" ]; then fn_fetch_file_github "lgsm/data" "${distroid}-${distroversioncsv}.csv" "lgsm/data" "chmodx" "norun" "noforce" "nohash" From 44daf200834c5bf56956531ff082dc1045021253 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Sun, 10 Oct 2021 22:34:02 +0100 Subject: [PATCH 080/164] fix(telegram): resolve alert sending invalid json (#3605) The telegram alert was using invalid json (though telegram did accept it). JSON has been corrected and is now valid --- lgsm/functions/alert_telegram.sh | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/lgsm/functions/alert_telegram.sh b/lgsm/functions/alert_telegram.sh index 056f11ae0..7da6a9f0c 100755 --- a/lgsm/functions/alert_telegram.sh +++ b/lgsm/functions/alert_telegram.sh @@ -12,12 +12,13 @@ json=$(cat <${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", + "disable_web_page_preview": "yes" +} EOF ) fn_print_dots "Sending Telegram alert" -telegramsend=$(curl --connect-timeout 10 -sSL -H "Content-Type: application/json" -X POST -d """${json}""" ${curlcustomstring} "https://${telegramapi}/bot${telegramtoken}/sendMessage" | grep "error_code") +telegramsend=$(curl --connect-timeout 10 -sSL -H "Content-Type: application/json" -X POST -d "$(echo -n "${json}" | jq -c .)" ${curlcustomstring} "https://${telegramapi}/bot${telegramtoken}/sendMessage" | grep "error_code") if [ -n "${telegramsend}" ]; then fn_print_fail_nl "Sending Telegram alert: ${telegramsend}" From db4d40e3e782c65363fd29e45cf44fd36a663789 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Sun, 10 Oct 2021 22:35:32 +0100 Subject: [PATCH 081/164] fix(info): resolve distroversionrh error for some non English languages (#3607) --- 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 d8f5dfaca..43a6aa4e0 100755 --- a/lgsm/functions/info_distro.sh +++ b/lgsm/functions/info_distro.sh @@ -36,7 +36,7 @@ for distro_info in "${distro_info_array[@]}"; do distroname="$(grep "PRETTY_NAME" /etc/os-release | awk -F\= '{gsub(/"/,"",$2);print $2}')" distroversion="$(grep "VERSION_ID" /etc/os-release | awk -F\= '{gsub(/"/,"",$2);print $2}')" # Special var for rhel like distros to removed point in number e.g 8.4 to just 8. - distroversionrh="$(printf "%.0f\n" "${distroversion}")" + distroversionrh="$(sed -nr 's/^VERSION_ID="([0-9]*).+?"/\1/p' /etc/os-release)" distroid="$(grep "ID=" /etc/os-release | grep -v _ID | awk -F\= '{gsub(/"/,"",$2);print $2}')" distroidlike="$(grep "ID_LIKE=" /etc/os-release | grep -v _ID | awk -F\= '{gsub(/"/,"",$2);print $2}')" distrocodename="$(grep "VERSION_CODENAME" /etc/os-release | awk -F\= '{gsub(/"/,"",$2);print $2}')" From 8dbca12a5626f8bb625ab19c88111d203bfce0f4 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Sun, 10 Oct 2021 23:56:05 +0100 Subject: [PATCH 082/164] feat(etl): update Enemy Territory: Legacy to 2.78 (#3609) tab --- lgsm/functions/check_deps.sh | 2 +- lgsm/functions/install_server_files.sh | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/lgsm/functions/check_deps.sh b/lgsm/functions/check_deps.sh index 862d03743..047093596 100755 --- a/lgsm/functions/check_deps.sh +++ b/lgsm/functions/check_deps.sh @@ -225,7 +225,7 @@ fn_deps_detector(){ ## Check. # SteamCMD: Will be removed from required array if no appid is present or non-free repo is not available. # This will cause SteamCMD to be installed using tar. - if [ -z "${appid}" ]||[ "${deptocheck}" == "steamcmd" ]&&[ "${distroid}" == "debian" ]&& ! grep -qE "^deb .*non-free" /etc/apt/sources.list; then + if [ -z "${appid}" ]||[ "${deptocheck}" == "steamcmd" ]&&[ "${distroid}" == "debian" ]&& ! grep -qE "^deb .*non-free" /etc/apt/sources.list; then array_deps_required=( "${array_deps_required[@]/steamcmd}" ) steamcmdstatus=1 # Java: Added for users using Oracle JRE to bypass check. diff --git a/lgsm/functions/install_server_files.sh b/lgsm/functions/install_server_files.sh index 8ac1704dd..e32d3d778 100755 --- a/lgsm/functions/install_server_files.sh +++ b/lgsm/functions/install_server_files.sh @@ -27,7 +27,7 @@ fn_install_server_files(){ elif [ "${shortname}" == "codwaw" ]; then 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.77.1-i386-et-260b.tar.xz"; local_filedir="${tmpdir}"; local_filename="etlegacy-v2.77.1-i386-et-260b.tar.xz"; chmodx="nochmodx" run="norun"; force="noforce"; md5="cc307a9232abd3999be499b42d8e4ea8" + remote_fileurl="http://linuxgsm.download/WolfensteinEnemyTerritory/etlegacy-v2.78-i386-et-260b.tar.xz"; local_filedir="${tmpdir}"; local_filename="etlegacy-v2.78-i386-et-260b.tar.xz"; chmodx="nochmodx" run="norun"; force="noforce"; md5="501e442fdac2eeab5e7f51e5b5c27280" 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 From 222eb9dffd15378a3d67e9fd1f403ffcf2520044 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Mon, 11 Oct 2021 00:03:30 +0100 Subject: [PATCH 083/164] Release v21.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 6c6edbdfc..f11b6f3e0 100755 --- a/lgsm/functions/core_functions.sh +++ b/lgsm/functions/core_functions.sh @@ -8,7 +8,7 @@ functionselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" -modulesversion="v21.3.1" +modulesversion="v21.3.2" # Core diff --git a/linuxgsm.sh b/linuxgsm.sh index c7620cd72..8c6cf9fc0 100755 --- a/linuxgsm.sh +++ b/linuxgsm.sh @@ -20,7 +20,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="v21.3.1" +version="v21.3.2" shortname="core" gameservername="core" commandname="CORE" diff --git a/tests/tests_fctrserver.sh b/tests/tests_fctrserver.sh index 05ae0795e..6df457a10 100644 --- a/tests/tests_fctrserver.sh +++ b/tests/tests_fctrserver.sh @@ -20,7 +20,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="v21.3.1" +version="v21.3.2" shortname="fctr" gameservername="fctrserver" commandname="CORE" diff --git a/tests/tests_jc2server.sh b/tests/tests_jc2server.sh index 609f71f50..65a32db1a 100644 --- a/tests/tests_jc2server.sh +++ b/tests/tests_jc2server.sh @@ -20,7 +20,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="v21.3.1" +version="v21.3.2" shortname="jc2" gameservername="jc2server" commandname="CORE" diff --git a/tests/tests_mcserver.sh b/tests/tests_mcserver.sh index a9dc9abf2..de0a44d18 100644 --- a/tests/tests_mcserver.sh +++ b/tests/tests_mcserver.sh @@ -20,7 +20,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="v21.3.1" +version="v21.3.2" shortname="mc" gameservername="mcserver" commandname="CORE" diff --git a/tests/tests_ts3server.sh b/tests/tests_ts3server.sh index 7f72dd7ef..4e6383bf9 100644 --- a/tests/tests_ts3server.sh +++ b/tests/tests_ts3server.sh @@ -20,7 +20,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="v21.3.1" +version="v21.3.2" shortname="ts3" gameservername="ts3server" commandname="CORE" From 75d412f4d2148ee290b71a398df3bed58f122437 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Mon, 11 Oct 2021 23:59:55 +0100 Subject: [PATCH 084/164] actions update update update update update update update update --- .github/potential-duplicates.yml | 13 --------- .github/release-drafter.yml | 27 ++++++++++++++++++- .github/workflows/git-sync.yml | 9 +++---- .github/workflows/potential-duplicates.yml | 31 ++++++++++++++++++++++ .github/workflows/release-drafter.yml | 29 ++++++++++++++++++++ 5 files changed, 90 insertions(+), 19 deletions(-) delete mode 100644 .github/potential-duplicates.yml create mode 100644 .github/workflows/potential-duplicates.yml create mode 100644 .github/workflows/release-drafter.yml diff --git a/.github/potential-duplicates.yml b/.github/potential-duplicates.yml deleted file mode 100644 index 3ca5a7cb8..000000000 --- a/.github/potential-duplicates.yml +++ /dev/null @@ -1,13 +0,0 @@ -# Label name and color to set, when potential duplicates are detected -issueLabel: "duplicate" -labelColor: 579e01 - -# If similarity is higher than this threshold, issue will be marked as duplicate -threshold: 0.60 - -# Comment to post when potential duplicates are detected -referenceComment: > - Potential duplicates: - {{#issues}} - - [#{{ number }}] {{ title }} ({{ accuracy }}%) - {{/issues}} diff --git a/.github/release-drafter.yml b/.github/release-drafter.yml index 27bcee3fb..609c1d8cb 100644 --- a/.github/release-drafter.yml +++ b/.github/release-drafter.yml @@ -1,4 +1,29 @@ +version-template: 'v21.$MINOR.$PATCH' +name-template: '$RESOLVED_VERSION' +tag-template: '$RESOLVED_VERSION' +categories: + - title: '🚀 Features' + labels: + - 'feature' + - 'enhancement' + - title: '🐛 Bug Fixes' + labels: + - 'fix' + - 'bugfix' + - 'bug' + - title: '🧰 Maintenance' + label: 'chore' +change-template: '- $TITLE @$AUTHOR (#$NUMBER)' +change-title-escapes: '\<*_&' # You can add # and @ to disable mentions, and add ` to disable code blocks. +version-resolver: + minor: + labels: + - 'release' + patch: + labels: + - 'hotfix' + default: patch template: | - ## What’s Changed + ## Changes $CHANGES diff --git a/.github/workflows/git-sync.yml b/.github/workflows/git-sync.yml index 4467acde2..d666af6db 100644 --- a/.github/workflows/git-sync.yml +++ b/.github/workflows/git-sync.yml @@ -5,18 +5,17 @@ on: push: branches: - master - - 'develop' - + - develop jobs: - repo-sync: + GitHub-to-Bitbucket: runs-on: ubuntu-latest steps: - - name: webfactory/ssh-agent + - name: webfactory/ssh-agent@v0.5.3 uses: webfactory/ssh-agent@v0.5.3 with: ssh-private-key: ${{ secrets.BITBUCKET_SECRET }} - - name: repo-sync + - name: wei/git-sync@v3.0.0 uses: wei/git-sync@v3.0.0 with: ssh_private_key: ${{ secrets.BITBUCKET_SECRET }} diff --git a/.github/workflows/potential-duplicates.yml b/.github/workflows/potential-duplicates.yml new file mode 100644 index 000000000..7b26eb469 --- /dev/null +++ b/.github/workflows/potential-duplicates.yml @@ -0,0 +1,31 @@ +name: Potential Duplicates +on: + issues: + types: [opened, edited] +jobs: + run: + runs-on: ubuntu-latest + steps: + - uses: wow-actions/potential-duplicates@v1 + with: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + # Issue title filter work with anymatch https://www.npmjs.com/package/anymatch. + # Any matched issue will stop detection immediately. + # You can specify multi filters in each line. + filter: '' + # Exclude keywords in title before detecting. + exclude: '' + # Label to set, when potential duplicates are detected. + label: potential-duplicate + # Get issues with state to compare. Supported state: 'all', 'closed', 'open'. + state: all + # If similarity is higher than this threshold([0,1]), issue will be marked as duplicate. + threshold: 0.6 + # Reactions to be add to comment when potential duplicates are detected. + # Available reactions: "-1", "+1", "confused", "laugh", "heart", "hooray", "rocket", "eyes" + #reactions: 'eyes, confused' + # Comment to post when potential duplicates are detected. + comment: > + Potential duplicates: {{#issues}} + - [#{{ number }}] {{ title }} ({{ accuracy }}%) + {{/issues}} diff --git a/.github/workflows/release-drafter.yml b/.github/workflows/release-drafter.yml new file mode 100644 index 000000000..442f6dc41 --- /dev/null +++ b/.github/workflows/release-drafter.yml @@ -0,0 +1,29 @@ +name: Release Drafter + +on: + push: + # branches to consider in the event; optional, defaults to all + branches: + - master + # pull_request event is required only for autolabeler + pull_request: + # Only following types are handled by the action, but one can default to all as well + types: [opened, reopened, synchronize] + +jobs: + update_release_draft: + runs-on: ubuntu-latest + steps: + # (Optional) GitHub Enterprise requires GHE_HOST variable set + #- name: Set GHE_HOST + # run: | + # echo "GHE_HOST=${GITHUB_SERVER_URL##https:\/\/}" >> $GITHUB_ENV + + # Drafts your next Release notes as Pull Requests are merged into "master" + - uses: release-drafter/release-drafter@v5 + # (Optional) specify config name to use, relative to .github/. Default: release-drafter.yml + # with: + # config-name: my-config.yml + # disable-autolabeler: true + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} From 70e9db36942bb86275c9b28583d110c3e39dfb66 Mon Sep 17 00:00:00 2001 From: Christian Date: Wed, 20 Oct 2021 21:10:47 +0200 Subject: [PATCH 085/164] fix(deps): add libncurses for mta (#3623) --- lgsm/data/almalinux-8.csv | 2 +- lgsm/data/centos-7.csv | 2 +- lgsm/data/centos-8.csv | 2 +- lgsm/data/debian-10.csv | 2 +- lgsm/data/debian-11.csv | 2 +- lgsm/data/debian-9.csv | 2 +- lgsm/data/rocky-8.csv | 2 +- lgsm/data/ubuntu-18.04.csv | 2 +- lgsm/data/ubuntu-20.04.csv | 2 +- lgsm/data/ubuntu-21.04.csv | 2 +- 10 files changed, 10 insertions(+), 10 deletions(-) diff --git a/lgsm/data/almalinux-8.csv b/lgsm/data/almalinux-8.csv index 270ede409..df219e24c 100644 --- a/lgsm/data/almalinux-8.csv +++ b/lgsm/data/almalinux-8.csv @@ -62,7 +62,7 @@ mcb,libnsl mh mohaa,compat-libstdc++-33.i686 mom -mta +mta,ncurses-compat-libs mumble nd nmrih,ncurses-libs.i686 diff --git a/lgsm/data/centos-7.csv b/lgsm/data/centos-7.csv index 270ede409..d20802e8a 100644 --- a/lgsm/data/centos-7.csv +++ b/lgsm/data/centos-7.csv @@ -62,7 +62,7 @@ mcb,libnsl mh mohaa,compat-libstdc++-33.i686 mom -mta +mta,ncurses-libs mumble nd nmrih,ncurses-libs.i686 diff --git a/lgsm/data/centos-8.csv b/lgsm/data/centos-8.csv index f9805f8b0..2d52f40fc 100644 --- a/lgsm/data/centos-8.csv +++ b/lgsm/data/centos-8.csv @@ -62,7 +62,7 @@ mcb,libnsl mh mohaa,compat-libstdc++-33.i686 mom -mta +mta,ncurses-compat-libs mumble nd nmrih,ncurses-libs.i686 diff --git a/lgsm/data/debian-10.csv b/lgsm/data/debian-10.csv index 746e0d5cc..91218ae02 100644 --- a/lgsm/data/debian-10.csv +++ b/lgsm/data/debian-10.csv @@ -62,7 +62,7 @@ mcb mh mohaa,libstdc++5:i386 mom -mta +mta,libncursesw5 mumble nd nmrih,libtinfo5:i386 diff --git a/lgsm/data/debian-11.csv b/lgsm/data/debian-11.csv index 35bf76936..c793517c6 100644 --- a/lgsm/data/debian-11.csv +++ b/lgsm/data/debian-11.csv @@ -62,7 +62,7 @@ mcb mh mohaa,libstdc++5:i386 mom -mta +mta,libncursesw5 mumble nd nmrih,libtinfo5:i386 diff --git a/lgsm/data/debian-9.csv b/lgsm/data/debian-9.csv index 4a8790286..520be409f 100644 --- a/lgsm/data/debian-9.csv +++ b/lgsm/data/debian-9.csv @@ -62,7 +62,7 @@ mcb mh mohaa,libstdc++5:i386 mom -mta +mta,libncursesw5 mumble nd nmrih,libtinfo5:i386 diff --git a/lgsm/data/rocky-8.csv b/lgsm/data/rocky-8.csv index 270ede409..df219e24c 100644 --- a/lgsm/data/rocky-8.csv +++ b/lgsm/data/rocky-8.csv @@ -62,7 +62,7 @@ mcb,libnsl mh mohaa,compat-libstdc++-33.i686 mom -mta +mta,ncurses-compat-libs mumble nd nmrih,ncurses-libs.i686 diff --git a/lgsm/data/ubuntu-18.04.csv b/lgsm/data/ubuntu-18.04.csv index 746e0d5cc..91218ae02 100644 --- a/lgsm/data/ubuntu-18.04.csv +++ b/lgsm/data/ubuntu-18.04.csv @@ -62,7 +62,7 @@ mcb mh mohaa,libstdc++5:i386 mom -mta +mta,libncursesw5 mumble nd nmrih,libtinfo5:i386 diff --git a/lgsm/data/ubuntu-20.04.csv b/lgsm/data/ubuntu-20.04.csv index 90f4a67e0..012befe25 100644 --- a/lgsm/data/ubuntu-20.04.csv +++ b/lgsm/data/ubuntu-20.04.csv @@ -62,7 +62,7 @@ mcb mh mohaa,libstdc++5:i386 mom -mta +mta,libncursesw5 mumble nd nmrih,libtinfo5:i386 diff --git a/lgsm/data/ubuntu-21.04.csv b/lgsm/data/ubuntu-21.04.csv index 180be9c25..8788b053a 100644 --- a/lgsm/data/ubuntu-21.04.csv +++ b/lgsm/data/ubuntu-21.04.csv @@ -62,7 +62,7 @@ mcb mh mohaa,libstdc++5:i386 mom -mta +mta,libncursesw5 mumble nd nmrih,libtinfo5:i386 From 457238ba22d05cddc292f1e8d3a1514898aedc0e Mon Sep 17 00:00:00 2001 From: Christian Date: Wed, 20 Oct 2021 21:12:16 +0200 Subject: [PATCH 086/164] fix(deps): fix python 3 package name in centos 7 (#3627) --- lgsm/data/centos-7.csv | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lgsm/data/centos-7.csv b/lgsm/data/centos-7.csv index d20802e8a..9d93ca8f3 100644 --- a/lgsm/data/centos-7.csv +++ b/lgsm/data/centos-7.csv @@ -1,4 +1,4 @@ -all,bc,binutils,bzip2,bzip2,cpio,curl,epel-release,file,glibc.i686,gzip,hostname,jq,libstdc++.i686,nmap-ncat,python36,tar,tmux,unzip,util-linux,wget,xz +all,bc,binutils,bzip2,bzip2,cpio,curl,epel-release,file,glibc.i686,gzip,hostname,jq,libstdc++.i686,nmap-ncat,python3,tar,tmux,unzip,util-linux,wget,xz steamcmd,glibc.i686,libstdc++.i686 ac ahl From 48c8bc7882ea7fecdf503187ed3374e6fce42dcb Mon Sep 17 00:00:00 2001 From: Claiyc <58397976+Claiyc@users.noreply.github.com> Date: Wed, 20 Oct 2021 21:12:36 +0200 Subject: [PATCH 087/164] fix(avserver): remove adminsteamid (#3620) --- lgsm/config-default/config-lgsm/avserver/_default.cfg | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) diff --git a/lgsm/config-default/config-lgsm/avserver/_default.cfg b/lgsm/config-default/config-lgsm/avserver/_default.cfg index 76101b2a9..bbaf07daa 100644 --- a/lgsm/config-default/config-lgsm/avserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/avserver/_default.cfg @@ -10,14 +10,8 @@ ## Predefined Parameters | https://docs.linuxgsm.com/configuration/start-parameters -# https://steamidfinder.com -adminsteamid="" -if [ -n "${adminsteamid}" ]; then - admincmd="--admin ${adminsteamid}" -fi - ## Server Parameters | https://docs.linuxgsm.com/configuration/start-parameters#additional-parameters -startparameters="--galaxy-name ${selfname} --ip ${ip} --datapath ${avdatapath} ${admincmd}" +startparameters="--galaxy-name ${selfname} --ip ${ip} --datapath ${avdatapath}" #### LinuxGSM Settings #### From 2caea172a3cb533aef971fc8065e824e3014fc79 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Fri, 22 Oct 2021 12:43:24 +0100 Subject: [PATCH 088/164] Update potential-duplicates.yml --- .github/workflows/potential-duplicates.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/potential-duplicates.yml b/.github/workflows/potential-duplicates.yml index 7b26eb469..8c9fe7cc7 100644 --- a/.github/workflows/potential-duplicates.yml +++ b/.github/workflows/potential-duplicates.yml @@ -1,7 +1,7 @@ name: Potential Duplicates on: issues: - types: [opened, edited] + types: [opened] jobs: run: runs-on: ubuntu-latest From 3d175b48f04e68243268469cd1766ffd3a51a683 Mon Sep 17 00:00:00 2001 From: Christian Date: Sun, 24 Oct 2021 19:57:37 +0200 Subject: [PATCH 089/164] fix(mta): fix update not working, as the old way does not work anymore (#3625) --- lgsm/functions/update_mta.sh | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/lgsm/functions/update_mta.sh b/lgsm/functions/update_mta.sh index f49e54910..c789a3c21 100644 --- a/lgsm/functions/update_mta.sh +++ b/lgsm/functions/update_mta.sh @@ -99,10 +99,7 @@ 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') - remotebuild="${majorversion}.${minorversion}.${maintenanceversion}" + remotebuild=$(curl -s "https://api.github.com/repos/multitheftauto/mtasa-blue/releases/latest" | jq -r '.tag_name') if [ "${firstcommandname}" != "INSTALL" ]; then fn_print_dots "Checking remote build: ${remotelocation}" # Checks if remotebuild variable has been set. From 994a9ab819c92c3462be1d686224bdb95c25b84d Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Sun, 24 Oct 2021 22:14:46 +0100 Subject: [PATCH 090/164] fix(deps): prevent steamcmd showing as a required when it is not (#3633) * fix(deps): prevent steamcmd showing as a required when it is not repeat issue. Looks like I got the if statement wrong. * further improvements to if statement --- 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 047093596..e8fd3f991 100755 --- a/lgsm/functions/check_deps.sh +++ b/lgsm/functions/check_deps.sh @@ -225,7 +225,7 @@ fn_deps_detector(){ ## Check. # SteamCMD: Will be removed from required array if no appid is present or non-free repo is not available. # This will cause SteamCMD to be installed using tar. - if [ -z "${appid}" ]||[ "${deptocheck}" == "steamcmd" ]&&[ "${distroid}" == "debian" ]&& ! grep -qE "^deb .*non-free" /etc/apt/sources.list; then + if [ "${deptocheck}" == "steamcmd" ]&&[ -z "${appid}" ]||[ "${deptocheck}" == "steamcmd" ]&&[ "${distroid}" == "debian" ]&& ! grep -qE "^deb .*non-free" /etc/apt/sources.list; then array_deps_required=( "${array_deps_required[@]/steamcmd}" ) steamcmdstatus=1 # Java: Added for users using Oracle JRE to bypass check. From 63aba3898da54e58acb0a0e0d1427c7071b7c87b Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Sun, 24 Oct 2021 23:21:40 +0100 Subject: [PATCH 092/164] fix(alert): correct mailgun email variable --- lgsm/functions/alert_mailgun.sh | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/lgsm/functions/alert_mailgun.sh b/lgsm/functions/alert_mailgun.sh index 4a2955104..a7b344086 100755 --- a/lgsm/functions/alert_mailgun.sh +++ b/lgsm/functions/alert_mailgun.sh @@ -13,7 +13,7 @@ else mailgunapiurl="https://api.mailgun.net" fi -fn_print_dots "Sending Email alert: Mailgun: ${email}" +fn_print_dots "Sending Email alert: Mailgun: ${mailgunemail}" mailgunsend=$(curl --connect-timeout 10 -s --user "api:${mailguntoken}" \ -F from="LinuxGSM <${mailgunemailfrom}>" \ @@ -24,9 +24,9 @@ mailgunsend=$(curl --connect-timeout 10 -s --user "api:${mailguntoken}" \ -F text="$(cat "${alertlog}")" "${mailgunapiurl}/v3/${mailgundomain}/messages") if [ -z "${mailgunsend}" ]; then - fn_print_fail_nl "Sending Email alert: Mailgun: ${email}" - fn_script_log_fatal "Sending Email alert: Mailgun: ${email}" + fn_print_fail_nl "Sending Email alert: Mailgun: ${mailgunemail}" + fn_script_log_fatal "Sending Email alert: Mailgun: ${mailgunemail}" else - fn_print_ok_nl "Sending Email alert: Mailgun: ${email}" - fn_script_log_pass "Sending Email alert: Mailgun: ${email}" + fn_print_ok_nl "Sending Email alert: Mailgun: ${mailgunemail}" + fn_script_log_pass "Sending Email alert: Mailgun: ${mailgunemail}" fi From 87a5161c675066198b1d4d2b8cee6ad14ccbacc4 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Sun, 24 Oct 2021 23:23:20 +0100 Subject: [PATCH 093/164] remove PR labeler --- .github/pr-labeler.yml | 3 --- .github/workflows/pr-labeler.yml | 14 -------------- 2 files changed, 17 deletions(-) delete mode 100644 .github/pr-labeler.yml delete mode 100644 .github/workflows/pr-labeler.yml diff --git a/.github/pr-labeler.yml b/.github/pr-labeler.yml deleted file mode 100644 index 06092ef11..000000000 --- a/.github/pr-labeler.yml +++ /dev/null @@ -1,3 +0,0 @@ -feature: ['feature/*', 'feat/*'] -hotfix: hotfix/* -release: release/* diff --git a/.github/workflows/pr-labeler.yml b/.github/workflows/pr-labeler.yml deleted file mode 100644 index 8b7371574..000000000 --- a/.github/workflows/pr-labeler.yml +++ /dev/null @@ -1,14 +0,0 @@ -name: PR Labeler -on: - pull_request: - types: [opened, edited, closed] - -jobs: - pr-labeler: - runs-on: ubuntu-latest - steps: - - uses: TimonVS/pr-labeler-action@v3 - with: - configuration-path: .github/pr-labeler.yml # optional, .github/pr-labeler.yml is the default value - env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} From 36c419ed15384afa320c147c471879a3d758aa21 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Sun, 24 Oct 2021 23:26:53 +0100 Subject: [PATCH 094/164] Release v21.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 f11b6f3e0..5f2f4d883 100755 --- a/lgsm/functions/core_functions.sh +++ b/lgsm/functions/core_functions.sh @@ -8,7 +8,7 @@ functionselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" -modulesversion="v21.3.2" +modulesversion="v21.3.3" # Core diff --git a/linuxgsm.sh b/linuxgsm.sh index 8c6cf9fc0..f66ec4b15 100755 --- a/linuxgsm.sh +++ b/linuxgsm.sh @@ -20,7 +20,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="v21.3.2" +version="v21.3.3" shortname="core" gameservername="core" commandname="CORE" diff --git a/tests/tests_fctrserver.sh b/tests/tests_fctrserver.sh index 6df457a10..883000cd6 100644 --- a/tests/tests_fctrserver.sh +++ b/tests/tests_fctrserver.sh @@ -20,7 +20,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="v21.3.2" +version="v21.3.3" shortname="fctr" gameservername="fctrserver" commandname="CORE" diff --git a/tests/tests_jc2server.sh b/tests/tests_jc2server.sh index 65a32db1a..4d753dee4 100644 --- a/tests/tests_jc2server.sh +++ b/tests/tests_jc2server.sh @@ -20,7 +20,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="v21.3.2" +version="v21.3.3" shortname="jc2" gameservername="jc2server" commandname="CORE" diff --git a/tests/tests_mcserver.sh b/tests/tests_mcserver.sh index de0a44d18..d632b00b3 100644 --- a/tests/tests_mcserver.sh +++ b/tests/tests_mcserver.sh @@ -20,7 +20,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="v21.3.2" +version="v21.3.3" shortname="mc" gameservername="mcserver" commandname="CORE" diff --git a/tests/tests_ts3server.sh b/tests/tests_ts3server.sh index 4e6383bf9..9471175b8 100644 --- a/tests/tests_ts3server.sh +++ b/tests/tests_ts3server.sh @@ -20,7 +20,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="v21.3.2" +version="v21.3.3" shortname="ts3" gameservername="ts3server" commandname="CORE" From 9b6ed8580ab45257e8342d366bab49267404d24d Mon Sep 17 00:00:00 2001 From: Claiyc <58397976+Claiyc@users.noreply.github.com> Date: Wed, 27 Oct 2021 01:07:03 +0200 Subject: [PATCH 095/164] feat(newserver): satisfactory (#3638) * Add satisfactory default cfg * add fn_info_message_sf & remove lo duplicate * add default config installation * add sf to dependency files --- .../config-lgsm/sfserver/_default.cfg | 186 ++++++++++++++++++ lgsm/data/almalinux-8.csv | 1 + lgsm/data/centos-7.csv | 1 + lgsm/data/centos-8.csv | 1 + lgsm/data/debian-10.csv | 1 + lgsm/data/debian-11.csv | 1 + lgsm/data/debian-9.csv | 1 + lgsm/data/rhel-7.csv | 1 + lgsm/data/rhel-8.csv | 1 + lgsm/data/rocky-8.csv | 1 + lgsm/data/serverlist.csv | 1 + lgsm/data/ubuntu-16.04.csv | 1 + lgsm/data/ubuntu-18.04.csv | 1 + lgsm/data/ubuntu-20.04.csv | 1 + lgsm/data/ubuntu-21.04.csv | 1 + lgsm/functions/info_messages.sh | 23 ++- lgsm/functions/install_config.sh | 7 + 17 files changed, 218 insertions(+), 12 deletions(-) create mode 100644 lgsm/config-default/config-lgsm/sfserver/_default.cfg diff --git a/lgsm/config-default/config-lgsm/sfserver/_default.cfg b/lgsm/config-default/config-lgsm/sfserver/_default.cfg new file mode 100644 index 000000000..e27899793 --- /dev/null +++ b/lgsm/config-default/config-lgsm/sfserver/_default.cfg @@ -0,0 +1,186 @@ +################################## +######## 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" +queryport="15777" +beaconport="15000" +port="7777" + +## Server Parameters | https://docs.linuxgsm.com/configuration/start-parameters#additional-parameters +startparameters="FactoryGame -ServerQueryPort=${queryport} -BeaconPort=${beaconport} -GamePort=${port} -log -unattended" + +#### 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="" + +# Gotify Alerts | https://docs.linuxgsm.com/alerts/gotify +gotifyalert="off" +gotifytoken="token" +gotifywebhook="webhook" + +# 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". +telegramapi="api.telegram.org" +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="1690800" +steamcmdforcewindows="no" +# 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="1" +querytype="" + +## Console type +consoleverbose="yes" +consoleinteract="no" + +## Game Server Details +# Do not edit +gamename="Satisfactory" +engine="unreal4" +glibc="2.17" + +#### Directories #### +# Edit with care + +## Game Server Directories +systemdir="${serverfiles}/FactoryGame" +executabledir="${serverfiles}/Engine/Binaries/Linux" +executable="./UE4Server-Linux-Shipping" +servercfgdir="${systemdir}/Saved/Config/LinuxServer" +servercfg="GameUserSettings.ini" +servercfgdefault="GameUserSettings.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/almalinux-8.csv b/lgsm/data/almalinux-8.csv index df219e24c..08ae83a10 100644 --- a/lgsm/data/almalinux-8.csv +++ b/lgsm/data/almalinux-8.csv @@ -93,6 +93,7 @@ scpsl scpslsm sdtd,telnet,expect sfc,ncurses-libs.i686 +sf sof2 sol squad diff --git a/lgsm/data/centos-7.csv b/lgsm/data/centos-7.csv index 9d93ca8f3..eb64cfb86 100644 --- a/lgsm/data/centos-7.csv +++ b/lgsm/data/centos-7.csv @@ -93,6 +93,7 @@ scpsl scpslsm sdtd,telnet,expect sfc,ncurses-libs.i686 +sf sof2 sol squad diff --git a/lgsm/data/centos-8.csv b/lgsm/data/centos-8.csv index 2d52f40fc..d33fbe00a 100644 --- a/lgsm/data/centos-8.csv +++ b/lgsm/data/centos-8.csv @@ -93,6 +93,7 @@ scpsl scpslsm sdtd,telnet,expect sfc,ncurses-libs.i686 +sf sof2 sol squad diff --git a/lgsm/data/debian-10.csv b/lgsm/data/debian-10.csv index 91218ae02..2024e85fa 100644 --- a/lgsm/data/debian-10.csv +++ b/lgsm/data/debian-10.csv @@ -93,6 +93,7 @@ scpsl,mono-complete scpslsm,mono-complete sdtd,telnet,expect sfc,libtinfo5:i386 +sf sof2 sol squad diff --git a/lgsm/data/debian-11.csv b/lgsm/data/debian-11.csv index c793517c6..32d0c8b0d 100644 --- a/lgsm/data/debian-11.csv +++ b/lgsm/data/debian-11.csv @@ -93,6 +93,7 @@ scpsl,mono-complete scpslsm,mono-complete sdtd,telnet,expect sfc,libtinfo5:i386 +sf sof2 sol squad diff --git a/lgsm/data/debian-9.csv b/lgsm/data/debian-9.csv index 520be409f..139d5fd80 100644 --- a/lgsm/data/debian-9.csv +++ b/lgsm/data/debian-9.csv @@ -93,6 +93,7 @@ scpsl,mono-complete scpslsm,mono-complete sdtd,telnet,expect sfc,libtinfo5:i386 +sf sof2 sol squad diff --git a/lgsm/data/rhel-7.csv b/lgsm/data/rhel-7.csv index 270ede409..1334a5f6c 100644 --- a/lgsm/data/rhel-7.csv +++ b/lgsm/data/rhel-7.csv @@ -93,6 +93,7 @@ scpsl scpslsm sdtd,telnet,expect sfc,ncurses-libs.i686 +sf sof2 sol squad diff --git a/lgsm/data/rhel-8.csv b/lgsm/data/rhel-8.csv index 270ede409..1334a5f6c 100644 --- a/lgsm/data/rhel-8.csv +++ b/lgsm/data/rhel-8.csv @@ -93,6 +93,7 @@ scpsl scpslsm sdtd,telnet,expect sfc,ncurses-libs.i686 +sf sof2 sol squad diff --git a/lgsm/data/rocky-8.csv b/lgsm/data/rocky-8.csv index df219e24c..08ae83a10 100644 --- a/lgsm/data/rocky-8.csv +++ b/lgsm/data/rocky-8.csv @@ -93,6 +93,7 @@ scpsl scpslsm sdtd,telnet,expect sfc,ncurses-libs.i686 +sf sof2 sol squad diff --git a/lgsm/data/serverlist.csv b/lgsm/data/serverlist.csv index 4bad355a6..cbd0f330e 100644 --- a/lgsm/data/serverlist.csv +++ b/lgsm/data/serverlist.csv @@ -91,6 +91,7 @@ scpsl,scpslserver,SCP: Secret Laboratory scpslsm,scpslsmserver,SCP: Secret Laboratory ServerMod sdtd,sdtdserver,7 Days to Die sfc,sfcserver,SourceForts Classic +sf,sfserver,Satisfactory sof2,sof2server,Soldier Of Fortune 2: Gold Edition sol,solserver,Soldat squad,squadserver,Squad diff --git a/lgsm/data/ubuntu-16.04.csv b/lgsm/data/ubuntu-16.04.csv index 4a8790286..415d9abbf 100644 --- a/lgsm/data/ubuntu-16.04.csv +++ b/lgsm/data/ubuntu-16.04.csv @@ -93,6 +93,7 @@ scpsl,mono-complete scpslsm,mono-complete sdtd,telnet,expect sfc,libtinfo5:i386 +sf sof2 sol squad diff --git a/lgsm/data/ubuntu-18.04.csv b/lgsm/data/ubuntu-18.04.csv index 91218ae02..2024e85fa 100644 --- a/lgsm/data/ubuntu-18.04.csv +++ b/lgsm/data/ubuntu-18.04.csv @@ -93,6 +93,7 @@ scpsl,mono-complete scpslsm,mono-complete sdtd,telnet,expect sfc,libtinfo5:i386 +sf sof2 sol squad diff --git a/lgsm/data/ubuntu-20.04.csv b/lgsm/data/ubuntu-20.04.csv index 012befe25..96889c2ff 100644 --- a/lgsm/data/ubuntu-20.04.csv +++ b/lgsm/data/ubuntu-20.04.csv @@ -93,6 +93,7 @@ scpsl,mono-complete scpslsm,mono-complete sdtd,telnet,expect sfc,libtinfo5:i386 +sf sof2 sol squad diff --git a/lgsm/data/ubuntu-21.04.csv b/lgsm/data/ubuntu-21.04.csv index 8788b053a..a0abc3825 100644 --- a/lgsm/data/ubuntu-21.04.csv +++ b/lgsm/data/ubuntu-21.04.csv @@ -93,6 +93,7 @@ scpsl,mono-complete scpslsm,mono-complete sdtd,telnet,expect sfc,libtinfo5:i386 +sf sof2 sol squad diff --git a/lgsm/functions/info_messages.sh b/lgsm/functions/info_messages.sh index c670bec05..10925c7e9 100755 --- a/lgsm/functions/info_messages.sh +++ b/lgsm/functions/info_messages.sh @@ -1032,16 +1032,6 @@ fn_info_message_jk2(){ } | column -s $'\t' -t } -fn_info_message_lo(){ - echo -e "netstat -atunp | grep MistServer" - 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_kf(){ { fn_port "header" @@ -1342,6 +1332,15 @@ fn_info_message_sdtd(){ } | column -s $'\t' -t } +fn_info_message_sf(){ + { + fn_port "header" + fn_port "Game" port udp + fn_port "Query" queryport udp + fn_port "Beacon" beaconport udp + } | column -s $'\t' -t +} + fn_info_message_sof2(){ { fn_port "header" @@ -1653,8 +1652,6 @@ fn_info_message_select_engine(){ fn_info_message_jc3 elif [ "${shortname}" == "jk2" ]; then fn_info_message_jk2 - elif [ "${shortname}" == "lo" ]; then - fn_info_message_lo elif [ "${shortname}" == "kf" ]; then fn_info_message_kf elif [ "${shortname}" == "kf2" ]; then @@ -1707,6 +1704,8 @@ fn_info_message_select_engine(){ fn_info_message_scpsl elif [ "${shortname}" == "sdtd" ]; then fn_info_message_sdtd + elif [ "${shortname}" == "sf" ]; then + fn_info_message_sf elif [ "${shortname}" == "sof2" ]; then fn_info_message_sof2 elif [ "${shortname}" == "sol" ]; then diff --git a/lgsm/functions/install_config.sh b/lgsm/functions/install_config.sh index 8bc9a380a..d8b496c38 100755 --- a/lgsm/functions/install_config.sh +++ b/lgsm/functions/install_config.sh @@ -680,6 +680,13 @@ elif [ "${shortname}" == "scpsl" ]||[ "${shortname}" == "scpslsm" ]; then fn_default_config_remote fn_set_config_vars fn_list_config_locations +elif [ "${shortname}" == "sf" ]; then + gamedirname="Satisfactory" + array_configs+=( GameUserSettings.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 ) From d087174603aff30030733c20c47a987482d659f2 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Wed, 27 Oct 2021 00:17:45 +0100 Subject: [PATCH 096/164] Release v21.4.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 f66ec4b15..4cd9d4532 100755 --- a/linuxgsm.sh +++ b/linuxgsm.sh @@ -20,7 +20,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="v21.3.3" +version="v21.4.0" shortname="core" gameservername="core" commandname="CORE" diff --git a/tests/tests_fctrserver.sh b/tests/tests_fctrserver.sh index 883000cd6..5d88e3026 100644 --- a/tests/tests_fctrserver.sh +++ b/tests/tests_fctrserver.sh @@ -20,7 +20,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="v21.3.3" +version="v21.4.0" shortname="fctr" gameservername="fctrserver" commandname="CORE" diff --git a/tests/tests_jc2server.sh b/tests/tests_jc2server.sh index 4d753dee4..5512d608e 100644 --- a/tests/tests_jc2server.sh +++ b/tests/tests_jc2server.sh @@ -20,7 +20,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="v21.3.3" +version="v21.4.0" shortname="jc2" gameservername="jc2server" commandname="CORE" diff --git a/tests/tests_mcserver.sh b/tests/tests_mcserver.sh index d632b00b3..b027e9db3 100644 --- a/tests/tests_mcserver.sh +++ b/tests/tests_mcserver.sh @@ -20,7 +20,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="v21.3.3" +version="v21.4.0" shortname="mc" gameservername="mcserver" commandname="CORE" diff --git a/tests/tests_ts3server.sh b/tests/tests_ts3server.sh index 9471175b8..418ce00ae 100644 --- a/tests/tests_ts3server.sh +++ b/tests/tests_ts3server.sh @@ -20,7 +20,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="v21.3.3" +version="v21.4.0" shortname="ts3" gameservername="ts3server" commandname="CORE" From 1b6303fefcd09e778bb28c56b0f799dcd4fe7cf6 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Wed, 27 Oct 2021 07:44:57 +0100 Subject: [PATCH 097/164] Release v21.4.0 --- lgsm/functions/core_functions.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lgsm/functions/core_functions.sh b/lgsm/functions/core_functions.sh index 5f2f4d883..2ecc47278 100755 --- a/lgsm/functions/core_functions.sh +++ b/lgsm/functions/core_functions.sh @@ -8,7 +8,7 @@ functionselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" -modulesversion="v21.3.3" +modulesversion="v21.4.0" # Core From 059e6016b200ca835b9e56a00a042186f861d859 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Wed, 27 Oct 2021 07:44:57 +0100 Subject: [PATCH 098/164] Release v21.4.0 --- lgsm/functions/core_functions.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lgsm/functions/core_functions.sh b/lgsm/functions/core_functions.sh index 5f2f4d883..2ecc47278 100755 --- a/lgsm/functions/core_functions.sh +++ b/lgsm/functions/core_functions.sh @@ -8,7 +8,7 @@ functionselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" -modulesversion="v21.3.3" +modulesversion="v21.4.0" # Core From f2af7c1e1b7da38fdbf6181f70f83d1cfcb071f2 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Wed, 27 Oct 2021 22:07:30 +0100 Subject: [PATCH 100/164] feat(action): check that linuxgsm.sh and modules version match will prevent version mismatch issues on release from not correctly setting versions. convert to tabs --- .github/workflows/version-check.sh | 14 ++++++++++++++ .github/workflows/version-check.yml | 23 +++++++++++++++++++++++ 2 files changed, 37 insertions(+) create mode 100644 .github/workflows/version-check.sh create mode 100644 .github/workflows/version-check.yml diff --git a/.github/workflows/version-check.sh b/.github/workflows/version-check.sh new file mode 100644 index 000000000..44215385d --- /dev/null +++ b/.github/workflows/version-check.sh @@ -0,0 +1,14 @@ +version=$(grep "version=" linuxgsm.sh | sed -e 's/version//g'| tr -d '="') +modulesversion=$(grep "modulesversion=" lgsm/functions/core_functions.sh | sed -e 's/modulesversion//g'| tr -d '="') + +if [ "${version}" != "${modulesversion}" ]; then + echo "Error! LinuxGSM version mismatch" + echo "Version: ${version}" + echo "Modules Version: ${modulesversion}" + exit 1 +else + echo "Success! LinuxGSM version match" + echo "Version: ${version}" + echo "Modules Version: ${modulesversion}" + exit +fi diff --git a/.github/workflows/version-check.yml b/.github/workflows/version-check.yml new file mode 100644 index 000000000..861653135 --- /dev/null +++ b/.github/workflows/version-check.yml @@ -0,0 +1,23 @@ +# This is a basic workflow to help you get started with Actions + +name: Version Check + +# Controls when the action will run. Triggers the workflow on push or pull request +# events but only for the master branch +on: push + +# A workflow run is made up of one or more jobs that can run sequentially or in parallel +jobs: + # This workflow contains a single job called "build" + Version-Check: + # The type of runner that the job will run on + runs-on: ubuntu-latest + + # Steps represent a sequence of tasks that will be executed as part of the job + steps: + # Checks-out your repository under $GITHUB_WORKSPACE, so your job can access it + - uses: actions/checkout@v2 + + # Runs a single command using the runners shell + - name: compare versions + run: chmod +x .github/workflows/version-check.sh; .github/workflows/version-check.sh \ No newline at end of file From ae0043c607094a671a65cd8888edccd2da693482 Mon Sep 17 00:00:00 2001 From: johnoclockdk <68790186+johnoclockdk@users.noreply.github.com> Date: Fri, 29 Oct 2021 13:41:30 +0200 Subject: [PATCH 101/164] fix(sf): fix port startparameter (#3650) Change in the documentation on Satisfactory Game Server Wiki regarding how ports work --- lgsm/config-default/config-lgsm/sfserver/_default.cfg | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lgsm/config-default/config-lgsm/sfserver/_default.cfg b/lgsm/config-default/config-lgsm/sfserver/_default.cfg index e27899793..229eb1f0b 100644 --- a/lgsm/config-default/config-lgsm/sfserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/sfserver/_default.cfg @@ -15,7 +15,7 @@ beaconport="15000" port="7777" ## Server Parameters | https://docs.linuxgsm.com/configuration/start-parameters#additional-parameters -startparameters="FactoryGame -ServerQueryPort=${queryport} -BeaconPort=${beaconport} -GamePort=${port} -log -unattended" +startparameters="FactoryGame -ServerQueryPort=${queryport} -BeaconPort=${beaconport} -Port=${port} -log -unattended" #### LinuxGSM Settings #### From ac9bfdb71c04ccadfdf812b87ccf381b08387d44 Mon Sep 17 00:00:00 2001 From: johnoclockdk <68790186+johnoclockdk@users.noreply.github.com> Date: Fri, 29 Oct 2021 23:09:13 +0200 Subject: [PATCH 102/164] fix(Minecraft): remove motd color from servername (#3652) will remove any motd colours from being displayed on the command line --- lgsm/functions/info_game.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lgsm/functions/info_game.sh b/lgsm/functions/info_game.sh index 106b1b4ee..6f8c7d209 100644 --- a/lgsm/functions/info_game.sh +++ b/lgsm/functions/info_game.sh @@ -803,7 +803,7 @@ fn_info_game_mc(){ gamemode="${unavailable}" gameworld="${unavailable}" else - servername=$(grep "motd" "${servercfgfullpath}" | sed -e 's/^[ \t]*//g' -e '/^#/d' -e 's/motd//g' | tr -d '=\";,:' | sed -e 's/^[ \t]*//' -e 's/[ \t]*$//') + servername=$(grep "motd" "${servercfgfullpath}" | sed -e 's/^[ \t]*//g' -e '/^#/d' -e 's/motd//g' | tr -d '=\";,:' | sed 's/\\u00A70//g;s/\\u00A71//g;s/\\u00A72//g;s/\\u00A73//g;s/\\u00A74//g;s/\\u00A75//g;s/\\u00A76//g;s/\\u00A77//g;s/\\u00A78//g;s/\\u00A79//g;s/\\u00A7a//g;s/\\u00A7b//g;s/\\u00A7c//g;s/\\u00A7d//g;s/\\u00A7e//g;s/\\u00A7f//g;s/\\u00A7l//g;s/\\u00A7o//g;s/\\u00A7n//g;s/\\u00A7m//g;s/\\u00A7k//g' | sed -e 's/^[ \t]*//' -e 's/[ \t]*$//') rconpassword=$(grep "rcon.password" "${servercfgfullpath}" | sed -e 's/^[ \t]*//g' -e '/^#/d' -e 's/rcon.password//g' | tr -d '=\";,:' | sed -e 's/^[ \t]*//' -e 's/[ \t]*$//') rconport=$(grep "rcon.port" "${servercfgfullpath}" | grep -v "#" | tr -cd '[:digit:]') maxplayers=$(grep "max-players" "${servercfgfullpath}" | grep -v "#" | tr -cd '[:digit:]') From fb2d5544105ee749a78df0d796f173b8ccebfec0 Mon Sep 17 00:00:00 2001 From: Claiyc <58397976+Claiyc@users.noreply.github.com> Date: Fri, 29 Oct 2021 23:13:37 +0200 Subject: [PATCH 103/164] fix: add sf & lo to info_game (#3653) --- lgsm/functions/info_game.sh | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/lgsm/functions/info_game.sh b/lgsm/functions/info_game.sh index 6f8c7d209..d6b526c57 100644 --- a/lgsm/functions/info_game.sh +++ b/lgsm/functions/info_game.sh @@ -790,6 +790,14 @@ fn_info_game_kf2(){ defaultmap=${defaultmap:-"NOT SET"} } +fn_info_game_lo(){ + # Parameters + servername=${servername:-"NOT SET"} + port=${port:-"0"} + queryport=${queryport:-"0"} + maxplayers=${slots:-"0"} +} + fn_info_game_mc(){ # Config if [ ! -f "${servercfgfullpath}" ]; then @@ -1550,6 +1558,14 @@ fn_info_game_sdtd(){ fi } +fn_info_game_sf(){ + # Parameters + servername=${selfname:-"NOT SET"} + port=${port:-"0"} + queryport=${queryport:-"0"} + beaconport=${beaconport:-"0"} +} + fn_info_game_sof2(){ # Config if [ ! -f "${servercfgfullpath}" ]; then @@ -2230,6 +2246,8 @@ elif [ "${shortname}" == "kf" ]; then fn_info_game_kf elif [ "${shortname}" == "kf2" ]; then fn_info_game_kf2 +elif [ "${shortname}" == "lo" ]; then + fn_info_game_lo elif [ "${shortname}" == "mc" ]||[ "${shortname}" == "pmc" ]; then fn_info_game_mc elif [ "${shortname}" == "mcb" ]; then @@ -2280,6 +2298,8 @@ elif [ "${shortname}" == "scpsl" ]||[ "${shortname}" == "scpslsm" ]; then fn_info_game_scpsl elif [ "${shortname}" == "sdtd" ]; then fn_info_game_sdtd +elif [ "${shortname}" == "sf" ]; then + fn_info_game_sf elif [ "${shortname}" == "sof2" ]; then fn_info_game_sof2 elif [ "${shortname}" == "sol" ]; then From e0488d51aba28f60b9ebf9d510f261871e654a08 Mon Sep 17 00:00:00 2001 From: Adithya Hegde <57481485+Emperor-Adi@users.noreply.github.com> Date: Sat, 30 Oct 2021 02:46:46 +0530 Subject: [PATCH 104/164] fix: change methods not using their bound instance to static methods (#3582) * Add function decorators to 2 methods Change methods not using their bound instance to static methods --- lgsm/functions/query_gsquery.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/lgsm/functions/query_gsquery.py b/lgsm/functions/query_gsquery.py index 6c21b1a89..93f68cca5 100755 --- a/lgsm/functions/query_gsquery.py +++ b/lgsm/functions/query_gsquery.py @@ -59,10 +59,12 @@ class gsquery: self.response = None self.sanity_checks() + @staticmethod def fatal_error(self, error_message, error_code=1): sys.stderr.write('ERROR: ' + str(error_message) + '\n') sys.exit(error_code) + @staticmethod def exit_success(self, success_message=''): sys.stdout.write('OK: ' + str(success_message) + '\n') sys.exit(0) @@ -140,6 +142,5 @@ if __name__ == '__main__': help='Display debugging output.' ) options, arguments = parser.parse_args() - # server = gsquery(options, arguments) server.responding() From 7ac60f23660e92b69fdd658ed5eb1a144fda9233 Mon Sep 17 00:00:00 2001 From: johnoclockdk <68790186+johnoclockdk@users.noreply.github.com> Date: Fri, 29 Oct 2021 23:48:14 +0200 Subject: [PATCH 105/164] fix(unt): incorrect query port (#3654) * Release v21.4.0 * fix queryport for Unturned * fix queryport remove +1 variable from queryport * Revert "fix queryport for Unturned" This reverts commit 3c1ccf21d70f1d6803b9cc7a5c91197593cd0c5c. * add steamport port+1 Co-authored-by: Daniel Gibbs --- lgsm/functions/info_game.sh | 3 ++- lgsm/functions/info_messages.sh | 3 ++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/lgsm/functions/info_game.sh b/lgsm/functions/info_game.sh index d6b526c57..c767fcb78 100644 --- a/lgsm/functions/info_game.sh +++ b/lgsm/functions/info_game.sh @@ -1943,7 +1943,8 @@ fn_info_game_unt(){ # Parameters servername=${selfname:-"NOT SET"} port=${port:-"0"} - queryport=$((port+1)) + queryport=${port} + steamport=$((port+1)) } fn_info_game_ut(){ diff --git a/lgsm/functions/info_messages.sh b/lgsm/functions/info_messages.sh index 10925c7e9..0337f2d92 100755 --- a/lgsm/functions/info_messages.sh +++ b/lgsm/functions/info_messages.sh @@ -800,7 +800,7 @@ fn_info_message_arma3(){ fn_port "header" fn_port "Game" port udp fn_port "Voice" voiceport udp - fn_port "Query Steam" queryport udp + fn_port "Query" queryport udp fn_port "Steam Master" steammasterport udp fn_port "Voice (unused)" voiceunusedport udp fn_port "BattleEye" battleeyeport udp @@ -1517,6 +1517,7 @@ fn_info_message_unt(){ fn_port "header" fn_port "Game" port udp fn_port "Query" queryport udp + fn_port "Steam" steamport udp } | column -s $'\t' -t } From 454e53bb9654548c061fa86893f99142c365186e Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Fri, 29 Oct 2021 23:10:12 +0100 Subject: [PATCH 106/164] spaces Release v21.4.1 new line Release v21.4.1 --- .github/workflows/version-check.yml | 4 ++-- lgsm/functions/core_functions.sh | 2 +- lgsm/functions/query_gsquery.py | 4 ++-- linuxgsm.sh | 2 +- tests/tests_fctrserver.sh | 2 +- tests/tests_jc2server.sh | 2 +- tests/tests_mcserver.sh | 2 +- tests/tests_ts3server.sh | 2 +- 8 files changed, 10 insertions(+), 10 deletions(-) diff --git a/.github/workflows/version-check.yml b/.github/workflows/version-check.yml index 861653135..903a79268 100644 --- a/.github/workflows/version-check.yml +++ b/.github/workflows/version-check.yml @@ -17,7 +17,7 @@ jobs: steps: # Checks-out your repository under $GITHUB_WORKSPACE, so your job can access it - uses: actions/checkout@v2 - + # Runs a single command using the runners shell - name: compare versions - run: chmod +x .github/workflows/version-check.sh; .github/workflows/version-check.sh \ No newline at end of file + run: chmod +x .github/workflows/version-check.sh; .github/workflows/version-check.sh diff --git a/lgsm/functions/core_functions.sh b/lgsm/functions/core_functions.sh index 2ecc47278..725cd297b 100755 --- a/lgsm/functions/core_functions.sh +++ b/lgsm/functions/core_functions.sh @@ -8,7 +8,7 @@ functionselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" -modulesversion="v21.4.0" +modulesversion="v21.4.1" # Core diff --git a/lgsm/functions/query_gsquery.py b/lgsm/functions/query_gsquery.py index 93f68cca5..4d6b01828 100755 --- a/lgsm/functions/query_gsquery.py +++ b/lgsm/functions/query_gsquery.py @@ -59,12 +59,12 @@ class gsquery: self.response = None self.sanity_checks() - @staticmethod + @staticmethod def fatal_error(self, error_message, error_code=1): sys.stderr.write('ERROR: ' + str(error_message) + '\n') sys.exit(error_code) - @staticmethod + @staticmethod def exit_success(self, success_message=''): sys.stdout.write('OK: ' + str(success_message) + '\n') sys.exit(0) diff --git a/linuxgsm.sh b/linuxgsm.sh index 4cd9d4532..1eff0d00f 100755 --- a/linuxgsm.sh +++ b/linuxgsm.sh @@ -20,7 +20,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="v21.4.0" +version="v21.4.1" shortname="core" gameservername="core" commandname="CORE" diff --git a/tests/tests_fctrserver.sh b/tests/tests_fctrserver.sh index 5d88e3026..138864098 100644 --- a/tests/tests_fctrserver.sh +++ b/tests/tests_fctrserver.sh @@ -20,7 +20,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="v21.4.0" +version="v21.4.1" shortname="fctr" gameservername="fctrserver" commandname="CORE" diff --git a/tests/tests_jc2server.sh b/tests/tests_jc2server.sh index 5512d608e..86637f5b2 100644 --- a/tests/tests_jc2server.sh +++ b/tests/tests_jc2server.sh @@ -20,7 +20,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="v21.4.0" +version="v21.4.1" shortname="jc2" gameservername="jc2server" commandname="CORE" diff --git a/tests/tests_mcserver.sh b/tests/tests_mcserver.sh index b027e9db3..447b8b9e3 100644 --- a/tests/tests_mcserver.sh +++ b/tests/tests_mcserver.sh @@ -20,7 +20,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="v21.4.0" +version="v21.4.1" shortname="mc" gameservername="mcserver" commandname="CORE" diff --git a/tests/tests_ts3server.sh b/tests/tests_ts3server.sh index 418ce00ae..3c160f009 100644 --- a/tests/tests_ts3server.sh +++ b/tests/tests_ts3server.sh @@ -20,7 +20,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="v21.4.0" +version="v21.4.1" shortname="ts3" gameservername="ts3server" commandname="CORE" From 6fc99cfbac3a59a3faf83541d78c9e3f06c2d6ed Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Fri, 29 Oct 2021 23:12:03 +0100 Subject: [PATCH 107/164] remove release drafter --- .github/release-drafter.yml | 29 --------------------------- .github/workflows/release-drafter.yml | 29 --------------------------- 2 files changed, 58 deletions(-) delete mode 100644 .github/release-drafter.yml delete mode 100644 .github/workflows/release-drafter.yml diff --git a/.github/release-drafter.yml b/.github/release-drafter.yml deleted file mode 100644 index 609c1d8cb..000000000 --- a/.github/release-drafter.yml +++ /dev/null @@ -1,29 +0,0 @@ -version-template: 'v21.$MINOR.$PATCH' -name-template: '$RESOLVED_VERSION' -tag-template: '$RESOLVED_VERSION' -categories: - - title: '🚀 Features' - labels: - - 'feature' - - 'enhancement' - - title: '🐛 Bug Fixes' - labels: - - 'fix' - - 'bugfix' - - 'bug' - - title: '🧰 Maintenance' - label: 'chore' -change-template: '- $TITLE @$AUTHOR (#$NUMBER)' -change-title-escapes: '\<*_&' # You can add # and @ to disable mentions, and add ` to disable code blocks. -version-resolver: - minor: - labels: - - 'release' - patch: - labels: - - 'hotfix' - default: patch -template: | - ## Changes - - $CHANGES diff --git a/.github/workflows/release-drafter.yml b/.github/workflows/release-drafter.yml deleted file mode 100644 index 442f6dc41..000000000 --- a/.github/workflows/release-drafter.yml +++ /dev/null @@ -1,29 +0,0 @@ -name: Release Drafter - -on: - push: - # branches to consider in the event; optional, defaults to all - branches: - - master - # pull_request event is required only for autolabeler - pull_request: - # Only following types are handled by the action, but one can default to all as well - types: [opened, reopened, synchronize] - -jobs: - update_release_draft: - runs-on: ubuntu-latest - steps: - # (Optional) GitHub Enterprise requires GHE_HOST variable set - #- name: Set GHE_HOST - # run: | - # echo "GHE_HOST=${GITHUB_SERVER_URL##https:\/\/}" >> $GITHUB_ENV - - # Drafts your next Release notes as Pull Requests are merged into "master" - - uses: release-drafter/release-drafter@v5 - # (Optional) specify config name to use, relative to .github/. Default: release-drafter.yml - # with: - # config-name: my-config.yml - # disable-autolabeler: true - env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} From 18833adde1c5cdd19e286670bea97d7715ec26a3 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Thu, 2 Dec 2021 21:08:31 +0000 Subject: [PATCH 108/164] feat(mc): update Minecraft java requirements (#3697) * update Minecraft Java requirements to Java 17 * fix: steamcmd depdencency check logic --- lgsm/data/debian-11.csv | 6 +- lgsm/data/ubuntu-20.04.csv | 6 +- lgsm/data/ubuntu-21.04.csv | 6 +- lgsm/data/ubuntu-21.10.csv | 123 +++++++++++++++++++++++++++++++++++ lgsm/data/ubuntu-22.04.csv | 123 +++++++++++++++++++++++++++++++++++ lgsm/functions/check_deps.sh | 8 ++- 6 files changed, 262 insertions(+), 10 deletions(-) create mode 100644 lgsm/data/ubuntu-21.10.csv create mode 100644 lgsm/data/ubuntu-22.04.csv diff --git a/lgsm/data/debian-11.csv b/lgsm/data/debian-11.csv index 32d0c8b0d..27dc5cb74 100644 --- a/lgsm/data/debian-11.csv +++ b/lgsm/data/debian-11.csv @@ -57,7 +57,7 @@ kf2 lo l4d l4d2 -mc,openjdk-16-jre +mc,openjdk-17-jre mcb mh mohaa,libstdc++5:i386 @@ -72,7 +72,7 @@ ns2c,speex:i386,libtbb2 onset,libmariadbclient-dev opfor pc -pmc,openjdk-16-jre +pmc,openjdk-17-jre pstbs,libgconf-2-4 pvkii pvr,libc++1 @@ -117,7 +117,7 @@ vs vints,mono-complete wet wf -wmc,openjdk-16-jre +wmc,openjdk-17-jre wurm,xvfb zmr,libtinfo5:i386 zps,libtinfo5:i386 diff --git a/lgsm/data/ubuntu-20.04.csv b/lgsm/data/ubuntu-20.04.csv index 96889c2ff..c9fa981f0 100644 --- a/lgsm/data/ubuntu-20.04.csv +++ b/lgsm/data/ubuntu-20.04.csv @@ -57,7 +57,7 @@ kf2 lo l4d l4d2 -mc,openjdk-16-jre +mc,openjdk-17-jre mcb mh mohaa,libstdc++5:i386 @@ -72,7 +72,7 @@ ns2c,speex:i386,libtbb2 onset,libmariadbclient-dev opfor pc -pmc,openjdk-16-jre +pmc,openjdk-17-jre pstbs,libgconf-2-4 pvkii pvr,libc++1 @@ -117,7 +117,7 @@ vs vints,mono-complete wet wf -wmc,openjdk-16-jre +wmc,openjdk-17-jre wurm,xvfb zmr,libtinfo5:i386 zps,libtinfo5:i386 diff --git a/lgsm/data/ubuntu-21.04.csv b/lgsm/data/ubuntu-21.04.csv index a0abc3825..a3ca2d84e 100644 --- a/lgsm/data/ubuntu-21.04.csv +++ b/lgsm/data/ubuntu-21.04.csv @@ -57,7 +57,7 @@ kf2 lo l4d l4d2 -mc,openjdk-16-jre +mc,openjdk-17-jre mcb mh mohaa,libstdc++5:i386 @@ -72,7 +72,7 @@ ns2c,speex:i386,libtbb2 onset,libmariadbclient-dev opfor pc -pmc,openjdk-16-jre +pmc,openjdk-17-jre pstbs,libgconf-2-4 pvkii pvr,libc++1 @@ -117,7 +117,7 @@ vs vints,mono-complete wet wf -wmc,openjdk-16-jre +wmc,openjdk-17-jre wurm,xvfb zmr,libtinfo5:i386 zps,libtinfo5:i386 diff --git a/lgsm/data/ubuntu-21.10.csv b/lgsm/data/ubuntu-21.10.csv new file mode 100644 index 000000000..a3ca2d84e --- /dev/null +++ b/lgsm/data/ubuntu-21.10.csv @@ -0,0 +1,123 @@ +all,bc,binutils,bsdmainutils,bzip2,ca-certificates,cpio,curl,file,gzip,hostname,jq,lib32gcc-s1,lib32stdc++6,netcat,netcat,python3,tar,tmux,unzip,util-linux,wget,xz-utils +steamcmd,lib32gcc-s1,lib32stdc++6,libsdl2-2.0-0:i386,steamcmd +ac +ahl +ahl2 +ark +arma3 +av +bb +bb2,libcurl4-gnutls-dev:i386 +bd +bf1942,libncurses5:i386,libtinfo5:i386 +bfv,libncurses5:i386,libstdc++5:i386 +bmdm,libncurses5:i386 +bo +bs +bt,libicu-dev +bt1944 +cc +cmw +cod,libstdc++5:i386 +cod2,libstdc++5:i386 +cod4 +coduo,libstdc++5:i386 +codwaw +col +cs +cscz +csgo +css,libtinfo5:i386 +dab +dmc +dod +dodr +dods +doi +dst,libcurl4-gnutls-dev:i386 +dys +eco,libgdiplus +em +etl +fctr +fof +gmod,libtinfo5:i386 +hl2dm +hldm +hldms +hw,lib32z1 +ins +inss +ios +jc2 +jc3 +jk2 +kf +kf2 +lo +l4d +l4d2 +mc,openjdk-17-jre +mcb +mh +mohaa,libstdc++5:i386 +mom +mta,libncursesw5 +mumble +nd +nmrih,libtinfo5:i386 +ns +ns2,speex,libtbb2 +ns2c,speex:i386,libtbb2 +onset,libmariadbclient-dev +opfor +pc +pmc,openjdk-17-jre +pstbs,libgconf-2-4 +pvkii +pvr,libc++1 +pz,openjdk-16-jre,rng-tools +q2 +q3 +ql +qw +ricochet +ro +rtcw +rust,lib32z1 +rw,openjdk-16-jre +samp +sb +sbots +scpsl,mono-complete +scpslsm,mono-complete +sdtd,telnet,expect +sfc,libtinfo5:i386 +sf +sof2 +sol +squad +st +stn +sven,libssl1.1:i386,zlib1g:i386 +terraria,libsdl +tf2,libcurl4-gnutls-dev:i386 +tfc +ts +ts3 +tu +tw +unt +ut +ut2k4 +ut3 +ut99 +vh,libc6-dev +vs +vints,mono-complete +wet +wf +wmc,openjdk-17-jre +wurm,xvfb +zmr,libtinfo5:i386 +zps,libtinfo5:i386 diff --git a/lgsm/data/ubuntu-22.04.csv b/lgsm/data/ubuntu-22.04.csv new file mode 100644 index 000000000..a3ca2d84e --- /dev/null +++ b/lgsm/data/ubuntu-22.04.csv @@ -0,0 +1,123 @@ +all,bc,binutils,bsdmainutils,bzip2,ca-certificates,cpio,curl,file,gzip,hostname,jq,lib32gcc-s1,lib32stdc++6,netcat,netcat,python3,tar,tmux,unzip,util-linux,wget,xz-utils +steamcmd,lib32gcc-s1,lib32stdc++6,libsdl2-2.0-0:i386,steamcmd +ac +ahl +ahl2 +ark +arma3 +av +bb +bb2,libcurl4-gnutls-dev:i386 +bd +bf1942,libncurses5:i386,libtinfo5:i386 +bfv,libncurses5:i386,libstdc++5:i386 +bmdm,libncurses5:i386 +bo +bs +bt,libicu-dev +bt1944 +cc +cmw +cod,libstdc++5:i386 +cod2,libstdc++5:i386 +cod4 +coduo,libstdc++5:i386 +codwaw +col +cs +cscz +csgo +css,libtinfo5:i386 +dab +dmc +dod +dodr +dods +doi +dst,libcurl4-gnutls-dev:i386 +dys +eco,libgdiplus +em +etl +fctr +fof +gmod,libtinfo5:i386 +hl2dm +hldm +hldms +hw,lib32z1 +ins +inss +ios +jc2 +jc3 +jk2 +kf +kf2 +lo +l4d +l4d2 +mc,openjdk-17-jre +mcb +mh +mohaa,libstdc++5:i386 +mom +mta,libncursesw5 +mumble +nd +nmrih,libtinfo5:i386 +ns +ns2,speex,libtbb2 +ns2c,speex:i386,libtbb2 +onset,libmariadbclient-dev +opfor +pc +pmc,openjdk-17-jre +pstbs,libgconf-2-4 +pvkii +pvr,libc++1 +pz,openjdk-16-jre,rng-tools +q2 +q3 +ql +qw +ricochet +ro +rtcw +rust,lib32z1 +rw,openjdk-16-jre +samp +sb +sbots +scpsl,mono-complete +scpslsm,mono-complete +sdtd,telnet,expect +sfc,libtinfo5:i386 +sf +sof2 +sol +squad +st +stn +sven,libssl1.1:i386,zlib1g:i386 +terraria,libsdl +tf2,libcurl4-gnutls-dev:i386 +tfc +ts +ts3 +tu +tw +unt +ut +ut2k4 +ut3 +ut99 +vh,libc6-dev +vs +vints,mono-complete +wet +wf +wmc,openjdk-17-jre +wurm,xvfb +zmr,libtinfo5:i386 +zps,libtinfo5:i386 diff --git a/lgsm/functions/check_deps.sh b/lgsm/functions/check_deps.sh index e8fd3f991..fab923bd7 100755 --- a/lgsm/functions/check_deps.sh +++ b/lgsm/functions/check_deps.sh @@ -225,7 +225,13 @@ fn_deps_detector(){ ## Check. # SteamCMD: Will be removed from required array if no appid is present or non-free repo is not available. # This will cause SteamCMD to be installed using tar. - if [ "${deptocheck}" == "steamcmd" ]&&[ -z "${appid}" ]||[ "${deptocheck}" == "steamcmd" ]&&[ "${distroid}" == "debian" ]&& ! grep -qE "^deb .*non-free" /etc/apt/sources.list; then + if [ "${deptocheck}" == "libsdl2-2.0-0:i386" ]&&[ -z "${appid}" ]; then + array_deps_required=( "${array_deps_required[@]/libsdl2-2.0-0:i386}" ) + steamcmdstatus=1 + elif [ "${deptocheck}" == "steamcmd" ]&&[ -z "${appid}" ]; then + array_deps_required=( "${array_deps_required[@]/steamcmd}" ) + steamcmdstatus=1 + elif [ "${deptocheck}" == "steamcmd" ]&&[ "${distroid}" == "debian" ]&& ! grep -qE "^deb .*non-free" /etc/apt/sources.list; then array_deps_required=( "${array_deps_required[@]/steamcmd}" ) steamcmdstatus=1 # Java: Added for users using Oracle JRE to bypass check. From fa73a72521a0316d3124fef2ce68d8b834489224 Mon Sep 17 00:00:00 2001 From: Christian Date: Thu, 2 Dec 2021 22:12:17 +0100 Subject: [PATCH 109/164] fix(core_dl): fix position of force_install_dir (#3693) --- 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 33b2b7120..5abfdfbb3 100755 --- 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 | uniq | tee -a "${lgsmlog}" "${steamcmdlog}" + ${unbuffer} ${steamcmdcommand} +force_install_dir "${serverfiles}" +login "${steamuser}" "${steampass}" +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 | uniq | tee -a "${lgsmlog}" "${steamcmdlog}" + ${unbuffer} ${steamcmdcommand} +force_install_dir "${serverfiles}" +login "${steamuser}" "${steampass}" +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}" + ${unbuffer} ${steamcmdcommand} +force_install_dir "${serverfiles}" +login "${steamuser}" "${steampass}" +app_set_config 90 mod "${appidmod}" +app_update "${appid}" ${validate} +quit | uniq | tee -a "${lgsmlog}" "${steamcmdlog}" fi # Force Windows Platform type. 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}" + ${unbuffer} ${steamcmdcommand} +@sSteamCmdForcePlatformType windows +force_install_dir "${serverfiles}" +login "${steamuser}" "${steampass}" +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 | uniq | tee -a "${lgsmlog}" "${steamcmdlog}" + ${unbuffer} ${steamcmdcommand} +@sSteamCmdForcePlatformType windows +force_install_dir "${serverfiles}" +login "${steamuser}" "${steampass}" +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}" + ${unbuffer} ${steamcmdcommand} +@sSteamCmdForcePlatformType windows +force_install_dir "${serverfiles}" +login "${steamuser}" "${steampass}" +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 | uniq | tee -a "${lgsmlog}" "${steamcmdlog}" + ${unbuffer} ${steamcmdcommand} +force_install_dir "${serverfiles}" +login "${steamuser}" "${steampass}" +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 | uniq | tee -a "${lgsmlog}" "${steamcmdlog}" + ${unbuffer} ${steamcmdcommand} +force_install_dir "${serverfiles}" +login "${steamuser}" "${steampass}" +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}" + ${unbuffer} ${steamcmdcommand} +force_install_dir "${serverfiles}" +login "${steamuser}" "${steampass}" +app_update "${appid}" ${validate} +quit | uniq | tee -a "${lgsmlog}" "${steamcmdlog}" fi fi From 809305d838b372d3fa92575f15d129bbb84d80f1 Mon Sep 17 00:00:00 2001 From: Christian Date: Thu, 2 Dec 2021 22:12:55 +0100 Subject: [PATCH 110/164] fix(ts3): fix missing details (#3682) --- lgsm/functions/info_game.sh | 2 ++ 1 file changed, 2 insertions(+) diff --git a/lgsm/functions/info_game.sh b/lgsm/functions/info_game.sh index c767fcb78..ad29b5a2c 100644 --- a/lgsm/functions/info_game.sh +++ b/lgsm/functions/info_game.sh @@ -2315,6 +2315,8 @@ elif [ "${shortname}" == "stn" ]; then fn_info_game_stn elif [ "${shortname}" == "terraria" ]; then fn_info_game_terraria +elif [ "${shortname}" == "ts3" ]; then + fn_info_game_ts3 elif [ "${shortname}" == "tu" ]; then fn_info_game_tu elif [ "${shortname}" == "tw" ]; then From 07715b73cdb96de8a9b0b61747f1365fe6367265 Mon Sep 17 00:00:00 2001 From: Cryotize <49732602+Cryotize@users.noreply.github.com> Date: Thu, 2 Dec 2021 22:14:35 +0100 Subject: [PATCH 111/164] feat(ark): Add Genesis 2 (#3678) Add the Genesis 2 DLC map name Co-authored-by: Daniel Gibbs --- 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 ea8b917af..eb3ac908b 100644 --- a/lgsm/config-default/config-lgsm/arkserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/arkserver/_default.cfg @@ -13,7 +13,7 @@ ip="0.0.0.0" port="7777" queryport="27015" rconport="27020" -# Default Map: TheIsland, Ragnarok, CrystalIsles, Aberration_P, ScorchedEarth_P, TheCenter, Extinction, Valguero_P, Genesis +# Default Map: TheIsland, Ragnarok, CrystalIsles, Aberration_P, ScorchedEarth_P, TheCenter, Extinction, Valguero_P, Genesis, Gen2 defaultmap="TheIsland" altsavedirectoryname="${defaultmap}" maxplayers="70" From 3c9d112ae29e42cad9f3c2fc01b0362a0d9728f5 Mon Sep 17 00:00:00 2001 From: StudioEtrange Date: Thu, 2 Dec 2021 22:15:18 +0100 Subject: [PATCH 112/164] fix: typo in fix_vh.sh (#3674) Co-authored-by: Daniel Gibbs --- lgsm/functions/fix_vh.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lgsm/functions/fix_vh.sh b/lgsm/functions/fix_vh.sh index 9b672a5b3..7d60916a4 100755 --- a/lgsm/functions/fix_vh.sh +++ b/lgsm/functions/fix_vh.sh @@ -17,7 +17,7 @@ if [ -f "${modsinstalledlistfullpath}" ]; then if ! grep -qE "^executable=\"./start_server_bepinex.sh\"" "${configdirserver}/${selfname}.cfg" then echo 'executable="./start_server_bepinex.sh"' >> "${configdirserver}/${selfname}.cfg" - executeable="./start_server_bepinex.sh" + executable="./start_server_bepinex.sh" fi fi fi From a908e18c12b7f94c9a596590e9395f09c9624fd4 Mon Sep 17 00:00:00 2001 From: jobhh Date: Thu, 2 Dec 2021 23:24:18 +0100 Subject: [PATCH 113/164] feat(etl): update Enemy Territory: Legacy to 2.78.1 (#3684) --- 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 e32d3d778..91fb1743a 100755 --- a/lgsm/functions/install_server_files.sh +++ b/lgsm/functions/install_server_files.sh @@ -27,7 +27,7 @@ fn_install_server_files(){ elif [ "${shortname}" == "codwaw" ]; then 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.78-i386-et-260b.tar.xz"; local_filedir="${tmpdir}"; local_filename="etlegacy-v2.78-i386-et-260b.tar.xz"; chmodx="nochmodx" run="norun"; force="noforce"; md5="501e442fdac2eeab5e7f51e5b5c27280" + remote_fileurl="http://linuxgsm.download/WolfensteinEnemyTerritory/etlegacy-v2.78.1-i386-et-260b.tar.xz"; local_filedir="${tmpdir}"; local_filename="etlegacy-v2.78.1-i386-et-260b.tar.xz"; chmodx="nochmodx" run="norun"; force="noforce"; md5="7c08b52cb09b30eadb98ea05ef780fc7" 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 From 72cf56bd2740f7026ce40f03fb5b1ce279b3a218 Mon Sep 17 00:00:00 2001 From: Christian Date: Thu, 2 Dec 2021 23:24:40 +0100 Subject: [PATCH 114/164] fix(sf): add multihome parameter (#3667) --- lgsm/config-default/config-lgsm/sfserver/_default.cfg | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lgsm/config-default/config-lgsm/sfserver/_default.cfg b/lgsm/config-default/config-lgsm/sfserver/_default.cfg index 229eb1f0b..45ca1151a 100644 --- a/lgsm/config-default/config-lgsm/sfserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/sfserver/_default.cfg @@ -15,7 +15,7 @@ beaconport="15000" port="7777" ## Server Parameters | https://docs.linuxgsm.com/configuration/start-parameters#additional-parameters -startparameters="FactoryGame -ServerQueryPort=${queryport} -BeaconPort=${beaconport} -Port=${port} -log -unattended" +startparameters="FactoryGame -multihome=${ip} -ServerQueryPort=${queryport} -BeaconPort=${beaconport} -Port=${port} -log -unattended" #### LinuxGSM Settings #### From 4b95e7f120c8909dd87eaf990a7268b5134c58ea Mon Sep 17 00:00:00 2001 From: Christian Date: Mon, 20 Dec 2021 21:39:00 +0100 Subject: [PATCH 115/164] fix(details): check as well queryport via steam (#3719) --- lgsm/config-default/config-lgsm/colserver/_default.cfg | 2 +- lgsm/config-default/config-lgsm/dodrserver/_default.cfg | 2 +- lgsm/config-default/config-lgsm/stnserver/_default.cfg | 2 +- lgsm/config-default/config-lgsm/vhserver/_default.cfg | 2 +- lgsm/functions/info_distro.sh | 4 ++-- 5 files changed, 6 insertions(+), 6 deletions(-) diff --git a/lgsm/config-default/config-lgsm/colserver/_default.cfg b/lgsm/config-default/config-lgsm/colserver/_default.cfg index b9bd78594..450b76765 100644 --- a/lgsm/config-default/config-lgsm/colserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/colserver/_default.cfg @@ -116,7 +116,7 @@ steamcmdforcewindows="no" branch="" betapassword="" # Master Server | https://docs.linuxgsm.com/steamcmd/steam-master-server -steammaster="false" +steammaster="true" ## Stop Mode | https://docs.linuxgsm.com/features/stop-mode # 1: tmux kill diff --git a/lgsm/config-default/config-lgsm/dodrserver/_default.cfg b/lgsm/config-default/config-lgsm/dodrserver/_default.cfg index 3bf88cf46..41d55374b 100644 --- a/lgsm/config-default/config-lgsm/dodrserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/dodrserver/_default.cfg @@ -121,7 +121,7 @@ steamcmdforcewindows="no" branch="" betapassword="" # Master Server | https://docs.linuxgsm.com/steamcmd/steam-master-server -steammaster="false" +steammaster="true" ## Stop Mode | https://docs.linuxgsm.com/features/stop-mode # 1: tmux kill diff --git a/lgsm/config-default/config-lgsm/stnserver/_default.cfg b/lgsm/config-default/config-lgsm/stnserver/_default.cfg index 339d1ee22..0b9510d4c 100644 --- a/lgsm/config-default/config-lgsm/stnserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/stnserver/_default.cfg @@ -119,7 +119,7 @@ steamcmdforcewindows="no" branch="" betapassword="" # Master Server | https://docs.linuxgsm.com/steamcmd/steam-master-server -steammaster="false" +steammaster="true" ## Stop Mode | https://docs.linuxgsm.com/features/stop-mode # 1: tmux kill diff --git a/lgsm/config-default/config-lgsm/vhserver/_default.cfg b/lgsm/config-default/config-lgsm/vhserver/_default.cfg index 286be4787..89babe324 100644 --- a/lgsm/config-default/config-lgsm/vhserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/vhserver/_default.cfg @@ -124,7 +124,7 @@ steamcmdforcewindows="no" branch="" betapassword="" # Master Server | https://docs.linuxgsm.com/steamcmd/steam-master-server -steammaster="false" +steammaster="true" ## Stop Mode | https://docs.linuxgsm.com/features/stop-mode # 1: tmux kill diff --git a/lgsm/functions/info_distro.sh b/lgsm/functions/info_distro.sh index 43a6aa4e0..3e3051d2d 100755 --- a/lgsm/functions/info_distro.sh +++ b/lgsm/functions/info_distro.sh @@ -291,11 +291,11 @@ if [ -z "${displaymasterserver}" ]; then if [ "${steammaster}" == "true" ]||[ "${commandname}" == "DEV-QUERY-RAW" ]; then # Will query server IP addresses first. for queryip in "${queryips[@]}"; do - 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)" + masterserver="$(curl --connect-timeout 10 -m 3 -s "https://api.steampowered.com/ISteamApps/GetServersAtAddress/v0001?addr=${queryip}&format=json" | jq --arg port "${port}" --arg queryport "${queryport}" '.response.servers[] | select((.gameport == ($port|tonumber) or (.gameport == ($queryport|tonumber)))) | .addr' | wc -l 2>/dev/null)" done # Should that not work it will try the external IP. if [ "${masterserver}" == "0" ]; then - 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)" + masterserver="$(curl --connect-timeout 10 -m 3 -s "https://api.steampowered.com/ISteamApps/GetServersAtAddress/v0001?addr=${extip}&format=json" | jq --arg port "${port}" --arg queryport "${queryport}" '.response.servers[] | select((.gameport == ($port|tonumber) or (.gameport == ($queryport|tonumber)))) | .addr' | wc -l 2>/dev/null)" fi if [ "${masterserver}" == "0" ]; then displaymasterserver="false" From a0d970758c96cc50c593be5c63b8a858fd53bc12 Mon Sep 17 00:00:00 2001 From: Christian Date: Mon, 20 Dec 2021 21:55:50 +0100 Subject: [PATCH 116/164] feat(newserver): Crafting Dead (#3691) --- .../config-lgsm/cdserver/_default.cfg | 180 ++++++++++++++++++ lgsm/data/almalinux-8.csv | 1 + lgsm/data/centos-7.csv | 1 + lgsm/data/centos-8.csv | 1 + lgsm/data/debian-10.csv | 1 + lgsm/data/debian-11.csv | 1 + lgsm/data/debian-9.csv | 1 + lgsm/data/rhel-7.csv | 1 + lgsm/data/rhel-8.csv | 1 + lgsm/data/rocky-8.csv | 1 + lgsm/data/serverlist.csv | 1 + lgsm/data/ubuntu-16.04.csv | 1 + lgsm/data/ubuntu-18.04.csv | 1 + lgsm/data/ubuntu-20.04.csv | 1 + lgsm/data/ubuntu-21.04.csv | 1 + lgsm/functions/info_game.sh | 22 +++ lgsm/functions/info_messages.sh | 13 +- 17 files changed, 228 insertions(+), 1 deletion(-) create mode 100644 lgsm/config-default/config-lgsm/cdserver/_default.cfg diff --git a/lgsm/config-default/config-lgsm/cdserver/_default.cfg b/lgsm/config-default/config-lgsm/cdserver/_default.cfg new file mode 100644 index 000000000..50eb14bf1 --- /dev/null +++ b/lgsm/config-default/config-lgsm/cdserver/_default.cfg @@ -0,0 +1,180 @@ +################################## +######## 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 +startparameters="-batchmode -nographics" + +#### 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="" + +# Gotify Alerts | https://docs.linuxgsm.com/alerts/gotify +gotifyalert="off" +gotifytoken="token" +gotifywebhook="webhook" + +# 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". +telegramapi="api.telegram.org" +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="685100" +steamcmdforcewindows="no" +# 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="1" +querytype="" + +## Console type +consoleverbose="yes" +consoleinteract="no" + +## Game Server Details +# Do not edit +gamename="Crafting Dead" +engine="unity3d" +glibc="2.15" + +#### Directories #### +# Edit with care + +## Game Server Directories +systemdir="${serverfiles}" +executabledir="${serverfiles}" +executable="./crafting_dead.x86_64" +servercfgdir="${systemdir}" +servercfg="properties.json" +servercfgdefault="properties.json" +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/almalinux-8.csv b/lgsm/data/almalinux-8.csv index 08ae83a10..4b9942c89 100644 --- a/lgsm/data/almalinux-8.csv +++ b/lgsm/data/almalinux-8.csv @@ -17,6 +17,7 @@ bs bt,libicu bt1944 cc +cd cmw cod,compat-libstdc++-33.i686 cod2,compat-libstdc++-33.i686 diff --git a/lgsm/data/centos-7.csv b/lgsm/data/centos-7.csv index eb64cfb86..97ea6298d 100644 --- a/lgsm/data/centos-7.csv +++ b/lgsm/data/centos-7.csv @@ -17,6 +17,7 @@ bs bt,libicu bt1944 cc +cd cmw cod,compat-libstdc++-33.i686 cod2,compat-libstdc++-33.i686 diff --git a/lgsm/data/centos-8.csv b/lgsm/data/centos-8.csv index d33fbe00a..6218227d2 100644 --- a/lgsm/data/centos-8.csv +++ b/lgsm/data/centos-8.csv @@ -17,6 +17,7 @@ bs bt,libicu bt1944 cc +cd cmw cod,compat-libstdc++-33.i686 cod2,compat-libstdc++-33.i686 diff --git a/lgsm/data/debian-10.csv b/lgsm/data/debian-10.csv index 2024e85fa..634c58a1c 100644 --- a/lgsm/data/debian-10.csv +++ b/lgsm/data/debian-10.csv @@ -17,6 +17,7 @@ bs bt,libicu-dev bt1944 cc +cd cmw cod,libstdc++5:i386 cod2,libstdc++5:i386 diff --git a/lgsm/data/debian-11.csv b/lgsm/data/debian-11.csv index 27dc5cb74..8b49da2c5 100644 --- a/lgsm/data/debian-11.csv +++ b/lgsm/data/debian-11.csv @@ -17,6 +17,7 @@ bs bt,libicu-dev bt1944 cc +cd cmw cod,libstdc++5:i386 cod2,libstdc++5:i386 diff --git a/lgsm/data/debian-9.csv b/lgsm/data/debian-9.csv index 139d5fd80..adda69a37 100644 --- a/lgsm/data/debian-9.csv +++ b/lgsm/data/debian-9.csv @@ -17,6 +17,7 @@ bs bt,libicu-dev bt1944 cc +cd cmw cod,libstdc++5:i386 cod2,libstdc++5:i386 diff --git a/lgsm/data/rhel-7.csv b/lgsm/data/rhel-7.csv index 1334a5f6c..6b4f93372 100644 --- a/lgsm/data/rhel-7.csv +++ b/lgsm/data/rhel-7.csv @@ -17,6 +17,7 @@ bs bt,libicu bt1944 cc +cd cmw cod,compat-libstdc++-33.i686 cod2,compat-libstdc++-33.i686 diff --git a/lgsm/data/rhel-8.csv b/lgsm/data/rhel-8.csv index 1334a5f6c..6b4f93372 100644 --- a/lgsm/data/rhel-8.csv +++ b/lgsm/data/rhel-8.csv @@ -17,6 +17,7 @@ bs bt,libicu bt1944 cc +cd cmw cod,compat-libstdc++-33.i686 cod2,compat-libstdc++-33.i686 diff --git a/lgsm/data/rocky-8.csv b/lgsm/data/rocky-8.csv index 08ae83a10..4b9942c89 100644 --- a/lgsm/data/rocky-8.csv +++ b/lgsm/data/rocky-8.csv @@ -17,6 +17,7 @@ bs bt,libicu bt1944 cc +cd cmw cod,compat-libstdc++-33.i686 cod2,compat-libstdc++-33.i686 diff --git a/lgsm/data/serverlist.csv b/lgsm/data/serverlist.csv index cbd0f330e..13ae66a0d 100644 --- a/lgsm/data/serverlist.csv +++ b/lgsm/data/serverlist.csv @@ -15,6 +15,7 @@ bs,bsserver,Blade Symphony bt,btserver,Barotrauma bt1944,bt1944server,Battalion 1944 cc,ccserver,Codename CURE +cd,cdserver,Crafting Dead cmw,cmwserver,Chivalry: Medieval Warfare cod,codserver,Call of Duty cod2,cod2server,Call of Duty 2 diff --git a/lgsm/data/ubuntu-16.04.csv b/lgsm/data/ubuntu-16.04.csv index 415d9abbf..d56c0172a 100644 --- a/lgsm/data/ubuntu-16.04.csv +++ b/lgsm/data/ubuntu-16.04.csv @@ -17,6 +17,7 @@ bs bt,libicu-dev bt1944 cc +cd cmw cod,libstdc++5:i386 cod2,libstdc++5:i386 diff --git a/lgsm/data/ubuntu-18.04.csv b/lgsm/data/ubuntu-18.04.csv index 2024e85fa..634c58a1c 100644 --- a/lgsm/data/ubuntu-18.04.csv +++ b/lgsm/data/ubuntu-18.04.csv @@ -17,6 +17,7 @@ bs bt,libicu-dev bt1944 cc +cd cmw cod,libstdc++5:i386 cod2,libstdc++5:i386 diff --git a/lgsm/data/ubuntu-20.04.csv b/lgsm/data/ubuntu-20.04.csv index c9fa981f0..5fdad7d61 100644 --- a/lgsm/data/ubuntu-20.04.csv +++ b/lgsm/data/ubuntu-20.04.csv @@ -17,6 +17,7 @@ bs bt,libicu-dev bt1944 cc +cd cmw cod,libstdc++5:i386 cod2,libstdc++5:i386 diff --git a/lgsm/data/ubuntu-21.04.csv b/lgsm/data/ubuntu-21.04.csv index a3ca2d84e..352d6d203 100644 --- a/lgsm/data/ubuntu-21.04.csv +++ b/lgsm/data/ubuntu-21.04.csv @@ -17,6 +17,7 @@ bs bt,libicu-dev bt1944 cc +cd cmw cod,libstdc++5:i386 cod2,libstdc++5:i386 diff --git a/lgsm/functions/info_game.sh b/lgsm/functions/info_game.sh index ad29b5a2c..7d505a98a 100644 --- a/lgsm/functions/info_game.sh +++ b/lgsm/functions/info_game.sh @@ -258,6 +258,26 @@ fn_info_game_bt1944(){ rconport=$((port+2)) } +fn_info_game_cd(){ + if [ ! -f "${servercfgfullpath}" ]; then + servername="${unavailable}" + port="${zero}" + rconenabled="false" + rconport="${zero}" + rconpassword="${unavailable}" + steamport="${zero}" + maxplayers="${zero}" + else + servername=$(jq -r '.game_title' "${servercfgfullpath}") + port=$(jq -r '.game_port' "${servercfgfullpath}") + steamport=$(jq -r '.steam_port_messages' "${servercfgfullpath}") + rconenabled=$(jq -r '.rcon' "${servercfgfullpath}") + rconport=$(jq -r '.rcon_port' "${servercfgfullpath}") + rconpassword=$(jq -r '.rcon_password' "${servercfgfullpath}") + maxplayers=$(jq -r '.player_count' "${servercfgfullpath}") + fi +} + fn_info_game_cmw(){ # Config if [ ! -f "${servercfgfullpath}" ]; then @@ -2209,6 +2229,8 @@ elif [ "${shortname}" == "bt" ]; then fn_info_game_bt elif [ "${shortname}" == "bt1944" ]; then fn_info_game_bt1944 +elif [ "${shortname}" == "cd" ]; then + fn_info_game_cd elif [ "${shortname}" == "cmw" ]; then fn_info_game_cmw elif [ "${shortname}" == "cod" ]; then diff --git a/lgsm/functions/info_messages.sh b/lgsm/functions/info_messages.sh index 0337f2d92..7b9b91309 100755 --- a/lgsm/functions/info_messages.sh +++ b/lgsm/functions/info_messages.sh @@ -658,7 +658,7 @@ fn_info_message_ports_edit(){ startparameterslocation="${red}UNKNOWN${default}" # engines/games that require editing in the config file. - local ports_edit_array=( "ac" "arma3" "bo" "bt" "dst" "eco" "idtech2" "idtech3" "idtech3_ql" "jc2" "jc3" "lwjgl2" "mcb" "mumble" "pc" "pz" "qw" "refractor" "renderware" "rw" "sb" "sdtd" "st" "stn" "ts3" "tw" "terraria" "unreal" "unreal2" "unreal3" "vints" "wurm") + local ports_edit_array=( "ac" "arma3" "bo" "bt" "cd" "dst" "eco" "idtech2" "idtech3" "idtech3_ql" "jc2" "jc3" "lwjgl2" "mcb" "mumble" "pc" "pz" "qw" "refractor" "renderware" "rw" "sb" "sdtd" "st" "stn" "ts3" "tw" "terraria" "unreal" "unreal2" "unreal3" "vints" "wurm") for port_edit in "${ports_edit_array[@]}"; do if [ "${shortname}" == "ut3" ]; then startparameterslocation="${servercfgdir}/UTWeb.ini" @@ -859,6 +859,15 @@ fn_info_message_bt1944(){ } | column -s $'\t' -t } +fn_info_messages_cd(){ + { + fn_port "header" + fn_port "Game" port udp + fn_port "Steam" steamport udp + fn_port "RCON" rconport tcp + } | column -s $'\t' -t +} + fn_info_message_cmw(){ fn_info_message_password_strip { @@ -1615,6 +1624,8 @@ fn_info_message_select_engine(){ fn_info_message_bt elif [ "${shortname}" == "bt1944" ]; then fn_info_message_bt1944 + elif [ "${shortname}" == "cd" ]; then + fn_info_messages_cd elif [ "${shortname}" == "csgo" ]; then fn_info_message_csgo elif [ "${shortname}" == "cmw" ]; then From 54bf33264da3fcc55f9682a4ef23848fbee8705e Mon Sep 17 00:00:00 2001 From: Marcin Jakubowski Date: Mon, 20 Dec 2021 22:07:23 +0100 Subject: [PATCH 117/164] feat(newserver): DayZ (#3557) * feat(dayzserver): add base dayz support * feat(dayzserver): add game info support * fix(dayzserver): fix dayz mods if run in debug * feat(dayzserver): add install game config * fix(dayzserver): fix shortname in install_config * feat(dayzserver): download config from remote * fix(dayzserver): fix default server cfg file * fix(dayzserver): temporarily use default debug cmd * fix(dayzserver): fix DayZ info game ports * feat(dayzserver): add change port config location * refactor(dayzserver): cleaner reading of server variables * fix(dayzserver): fix DayZ debug parameters. * fix(dayzserver): add dayz to dependency files * fix(dayzserver): add gotify allerts to dayz config --- .../config-lgsm/dayzserver/_default.cfg | 202 ++++++++++++++++++ lgsm/data/almalinux-8.csv | 1 + lgsm/data/centos-7.csv | 1 + lgsm/data/centos-8.csv | 1 + lgsm/data/debian-10.csv | 1 + lgsm/data/debian-11.csv | 1 + lgsm/data/debian-9.csv | 1 + lgsm/data/rhel-7.csv | 1 + lgsm/data/rhel-8.csv | 1 + lgsm/data/rocky-8.csv | 1 + lgsm/data/serverlist.csv | 1 + lgsm/data/ubuntu-16.04.csv | 1 + lgsm/data/ubuntu-18.04.csv | 1 + lgsm/data/ubuntu-20.04.csv | 1 + lgsm/data/ubuntu-21.04.csv | 1 + lgsm/functions/info_game.sh | 30 +++ lgsm/functions/info_messages.sh | 14 +- lgsm/functions/install_config.sh | 8 + 18 files changed, 267 insertions(+), 1 deletion(-) create mode 100644 lgsm/config-default/config-lgsm/dayzserver/_default.cfg diff --git a/lgsm/config-default/config-lgsm/dayzserver/_default.cfg b/lgsm/config-default/config-lgsm/dayzserver/_default.cfg new file mode 100644 index 000000000..45042cf07 --- /dev/null +++ b/lgsm/config-default/config-lgsm/dayzserver/_default.cfg @@ -0,0 +1,202 @@ +################################## +######## 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' + +## Predefined Parameters | https://docs.linuxgsm.com/configuration/start-parameters +ip="0.0.0.0" +port="2302" + +## DayZ Modules +# Add mods with relative paths: +# mods/@cf +# To load the "Community framework for DayZ SA" module found in the +# directory serverfiles/mods/@cf. Load several mods as: +# mods="mods/@cf\;mods/@dayz-expansion\;mods/@deerisle" +mods="" + +## Server-side Mods +servermods="" + +## Path to BattlEye +# Leave empty for default +bepath="" + +## Server Parameters | https://docs.linuxgsm.com/configuration/start-parameters#additional-parameters +startparameters="-ip=${ip} -port=${port} -config=${servercfgfullpath} -mod=${mods} -servermod=${servermods} -bepath=${bepath} -limitFPS=60 -dologs -adminlog -freezeCheck" + +#### 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="" + +# Gotify Alerts | https://docs.linuxgsm.com/alerts/gotify +gotifyalert="off" +gotifytoken="token" +gotifywebhook="webhook" + +# 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". +telegramapi="api.telegram.org" +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="5" + +## 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="1042420" +steamcmdforcewindows="no" +# 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="yes" +consoleinteract="no" + +## Game Server Details +# Do not edit +gamename="DayZ" +engine="enfusion" +glibc="2.27" + +#### Directories #### +# Edit with care + +## Game Server Directories +systemdir="${serverfiles}" +executabledir="${serverfiles}" +executable="./DayZServer" +servercfgdir="${systemdir}/cfg" +servercfg="${selfname}.server.cfg" +servercfgdefault="server.cfg" +servercfgfullpath="${servercfgdir}/${servercfg}" + +## Backup Directory +backupdir="${lgsmdir}/backup" + +## Logging Directories +logdir="${rootdir}/log" +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/almalinux-8.csv b/lgsm/data/almalinux-8.csv index 4b9942c89..39c49c153 100644 --- a/lgsm/data/almalinux-8.csv +++ b/lgsm/data/almalinux-8.csv @@ -30,6 +30,7 @@ cscz csgo css,ncurses-libs.i686 dab +dayz dmc dod dodr diff --git a/lgsm/data/centos-7.csv b/lgsm/data/centos-7.csv index 97ea6298d..db84ecc18 100644 --- a/lgsm/data/centos-7.csv +++ b/lgsm/data/centos-7.csv @@ -30,6 +30,7 @@ cscz csgo css,ncurses-libs.i686 dab +dayz dmc dod dodr diff --git a/lgsm/data/centos-8.csv b/lgsm/data/centos-8.csv index 6218227d2..8084d9e0d 100644 --- a/lgsm/data/centos-8.csv +++ b/lgsm/data/centos-8.csv @@ -30,6 +30,7 @@ cscz csgo css,ncurses-libs.i686 dab +dayz dmc dod dodr diff --git a/lgsm/data/debian-10.csv b/lgsm/data/debian-10.csv index 634c58a1c..19d9b1828 100644 --- a/lgsm/data/debian-10.csv +++ b/lgsm/data/debian-10.csv @@ -30,6 +30,7 @@ cscz csgo css,libtinfo5:i386 dab +dayz dmc dod dodr diff --git a/lgsm/data/debian-11.csv b/lgsm/data/debian-11.csv index 8b49da2c5..926d6d255 100644 --- a/lgsm/data/debian-11.csv +++ b/lgsm/data/debian-11.csv @@ -30,6 +30,7 @@ cscz csgo css,libtinfo5:i386 dab +dayz dmc dod dodr diff --git a/lgsm/data/debian-9.csv b/lgsm/data/debian-9.csv index adda69a37..d6886018c 100644 --- a/lgsm/data/debian-9.csv +++ b/lgsm/data/debian-9.csv @@ -30,6 +30,7 @@ cscz csgo css,libtinfo5:i386 dab +dayz dmc dod dodr diff --git a/lgsm/data/rhel-7.csv b/lgsm/data/rhel-7.csv index 6b4f93372..5438404b1 100644 --- a/lgsm/data/rhel-7.csv +++ b/lgsm/data/rhel-7.csv @@ -30,6 +30,7 @@ cscz csgo css,ncurses-libs.i686 dab +dayz dmc dod dodr diff --git a/lgsm/data/rhel-8.csv b/lgsm/data/rhel-8.csv index 6b4f93372..5438404b1 100644 --- a/lgsm/data/rhel-8.csv +++ b/lgsm/data/rhel-8.csv @@ -30,6 +30,7 @@ cscz csgo css,ncurses-libs.i686 dab +dayz dmc dod dodr diff --git a/lgsm/data/rocky-8.csv b/lgsm/data/rocky-8.csv index 4b9942c89..39c49c153 100644 --- a/lgsm/data/rocky-8.csv +++ b/lgsm/data/rocky-8.csv @@ -30,6 +30,7 @@ cscz csgo css,ncurses-libs.i686 dab +dayz dmc dod dodr diff --git a/lgsm/data/serverlist.csv b/lgsm/data/serverlist.csv index 13ae66a0d..2ad567579 100644 --- a/lgsm/data/serverlist.csv +++ b/lgsm/data/serverlist.csv @@ -28,6 +28,7 @@ cscz,csczserver,Counter-Strike: Condition Zero csgo,csgoserver,Counter-Strike: Global Offensive css,cssserver,Counter-Strike: Source dab,dabserver,Double Action: Boogaloo +dayz,dayzserver,DayZ dmc,dmcserver,Deathmatch Classic dod,dodserver,Day of Defeat dodr,dodrserver,Day of Dragons diff --git a/lgsm/data/ubuntu-16.04.csv b/lgsm/data/ubuntu-16.04.csv index d56c0172a..7ff519720 100644 --- a/lgsm/data/ubuntu-16.04.csv +++ b/lgsm/data/ubuntu-16.04.csv @@ -30,6 +30,7 @@ cscz csgo css,libtinfo5:i386 dab +dayz dmc dod dodr diff --git a/lgsm/data/ubuntu-18.04.csv b/lgsm/data/ubuntu-18.04.csv index 634c58a1c..19d9b1828 100644 --- a/lgsm/data/ubuntu-18.04.csv +++ b/lgsm/data/ubuntu-18.04.csv @@ -30,6 +30,7 @@ cscz csgo css,libtinfo5:i386 dab +dayz dmc dod dodr diff --git a/lgsm/data/ubuntu-20.04.csv b/lgsm/data/ubuntu-20.04.csv index 5fdad7d61..a2fa9c28e 100644 --- a/lgsm/data/ubuntu-20.04.csv +++ b/lgsm/data/ubuntu-20.04.csv @@ -30,6 +30,7 @@ cscz csgo css,libtinfo5:i386 dab +dayz dmc dod dodr diff --git a/lgsm/data/ubuntu-21.04.csv b/lgsm/data/ubuntu-21.04.csv index 352d6d203..4274c4331 100644 --- a/lgsm/data/ubuntu-21.04.csv +++ b/lgsm/data/ubuntu-21.04.csv @@ -30,6 +30,7 @@ cscz csgo css,libtinfo5:i386 dab +dayz dmc dod dodr diff --git a/lgsm/functions/info_game.sh b/lgsm/functions/info_game.sh index 7d505a98a..70c8a3caa 100644 --- a/lgsm/functions/info_game.sh +++ b/lgsm/functions/info_game.sh @@ -462,6 +462,34 @@ fn_info_game_dodr(){ queryport=${queryport:-"27015"} } +fn_info_game_dayz(){ + # Config + if [ ! -f "${servercfgfullpath}" ]; then + servername="${unavailable}" + adminpassword="${unavailable}" + serverpassword="${unavailable}" + maxplayers="${zero}" + else + servername=$(sed -nr 's/^hostname\s*=\s*"(.*)"\s*;/\1/p' "${servercfgfullpath}") + adminpassword=$(sed -nr 's/^passwordAdmin\s*=\s*"(.*)"\s*;/\1/p' "${servercfgfullpath}") + serverpassword=$(sed -nr 's/^password\s*=\s*"(.*)"\s*;/\1/p' "${servercfgfullpath}") + maxplayers=$(sed -nr 's/^maxPlayers\s*=\s*([0-9]+)\s*;/\1/p' "${servercfgfullpath}") + queryport=$(sed -nr 's/^steamQueryPort\s*=\s*([0-9]+)\s*;/\1/p' "${servercfgfullpath}") + + # Not Set + servername=${servername:-"NOT SET"} + adminpassword=${adminpassword:-"NOT SET"} + serverpassword=${serverpassword:-"NOT SET"} + maxplayers=${maxplayers:-"0"} + queryport=${queryport:-"27016"} + fi + + # Parameters + port=${port:-"2302"} + steammasterport=$((port+2)) + battleeyeport=$((port+4)) +} + fn_info_game_dst(){ # Config if [ ! -f "${clustercfgfullpath}" ]; then @@ -2245,6 +2273,8 @@ elif [ "${shortname}" == "codwaw" ]; then fn_info_game_codwaw elif [ "${shortname}" == "col" ]; then fn_info_game_col +elif [ "${shortname}" == "dayz" ]; then + fn_info_game_dayz elif [ "${shortname}" == "dodr" ]; then fn_info_game_dodr elif [ "${shortname}" == "dst" ]; then diff --git a/lgsm/functions/info_messages.sh b/lgsm/functions/info_messages.sh index 7b9b91309..a431bd54a 100755 --- a/lgsm/functions/info_messages.sh +++ b/lgsm/functions/info_messages.sh @@ -669,7 +669,7 @@ fn_info_message_ports_edit(){ fi done # engines/games that require editing the start parameters. - local ports_edit_array=( "av" "col" "fctr" "goldsrc" "hw" "iw3.0" "ioquake3" "qfusion" "rust" "scpsl" "scpslsm" "sol" "spark" "source" "unreal4" "arma3" "unt" "vh" ) + local ports_edit_array=( "av" "col" "fctr" "goldsrc" "hw" "iw3.0" "ioquake3" "qfusion" "rust" "scpsl" "scpslsm" "sol" "spark" "source" "unreal4" "arma3" "dayz" "unt" "vh" ) for port_edit in "${ports_edit_array[@]}"; do if [ "${engine}" == "${port_edit}" ]||[ "${gamename}" == "${port_edit}" ]||[ "${shortname}" == "${port_edit}" ]; then startparameterslocation="${configdirserver}" @@ -938,6 +938,16 @@ fn_info_message_csgo(){ } | column -s $'\t' -t } +fn_info_message_dayz(){ + { + fn_port "header" + fn_port "Game" port udp + fn_port "Query Steam" queryport udp + fn_port "Steam Master" steammasterport udp + fn_port "BattleEye" battleeyeport udp + } | column -s $'\t' -t +} + fn_info_message_dodr(){ { fn_port "header" @@ -1642,6 +1652,8 @@ fn_info_message_select_engine(){ fn_info_message_codwaw elif [ "${shortname}" == "col" ]; then fn_info_message_col + elif [ "${shortname}" == "dayz" ]; then + fn_info_message_dayz elif [ "${shortname}" == "dodr" ]; then fn_info_message_dodr elif [ "${shortname}" == "dst" ]; then diff --git a/lgsm/functions/install_config.sh b/lgsm/functions/install_config.sh index d8b496c38..a5fa7bb7e 100755 --- a/lgsm/functions/install_config.sh +++ b/lgsm/functions/install_config.sh @@ -351,6 +351,14 @@ elif [ "${shortname}" == "css" ]; then fn_default_config_remote fn_set_config_vars fn_list_config_locations +elif [ "${shortname}" == "dayz" ]; then + gamedirname="DayZ" + fn_check_cfgdir + 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 ) From 169775cc9234c24a061a4e4e46ceef17453a07bc Mon Sep 17 00:00:00 2001 From: Christian Date: Mon, 20 Dec 2021 22:08:34 +0100 Subject: [PATCH 118/164] fix(squad): enable steammaster (#3721) --- lgsm/config-default/config-lgsm/squadserver/_default.cfg | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lgsm/config-default/config-lgsm/squadserver/_default.cfg b/lgsm/config-default/config-lgsm/squadserver/_default.cfg index 1adfe68e0..85affef38 100644 --- a/lgsm/config-default/config-lgsm/squadserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/squadserver/_default.cfg @@ -120,7 +120,7 @@ steamcmdforcewindows="no" branch="" betapassword="" # Master Server | https://docs.linuxgsm.com/steamcmd/steam-master-server -steammaster="false" +steammaster="true" ## Stop Mode | https://docs.linuxgsm.com/features/stop-mode # 1: tmux kill From f06dfc45c3ad8b5680899edcd798486a4d340fe2 Mon Sep 17 00:00:00 2001 From: Christian Date: Mon, 20 Dec 2021 22:28:34 +0100 Subject: [PATCH 119/164] feat(newserver): The Isle (#3720) --- .../config-lgsm/tiserver/_default.cfg | 187 ++++++++++++++++++ lgsm/data/almalinux-8.csv | 1 + lgsm/data/centos-7.csv | 1 + lgsm/data/centos-8.csv | 1 + lgsm/data/debian-10.csv | 1 + lgsm/data/debian-11.csv | 1 + lgsm/data/debian-9.csv | 1 + lgsm/data/rhel-7.csv | 1 + lgsm/data/rhel-8.csv | 1 + lgsm/data/rocky-8.csv | 1 + lgsm/data/serverlist.csv | 1 + lgsm/data/ubuntu-16.04.csv | 1 + lgsm/data/ubuntu-18.04.csv | 1 + lgsm/data/ubuntu-20.04.csv | 1 + lgsm/data/ubuntu-21.04.csv | 1 + lgsm/data/ubuntu-21.10.csv | 1 + lgsm/data/ubuntu-22.04.csv | 1 + lgsm/functions/info_game.sh | 12 ++ lgsm/functions/info_messages.sh | 8 + lgsm/functions/install_config.sh | 7 + 20 files changed, 230 insertions(+) create mode 100644 lgsm/config-default/config-lgsm/tiserver/_default.cfg diff --git a/lgsm/config-default/config-lgsm/tiserver/_default.cfg b/lgsm/config-default/config-lgsm/tiserver/_default.cfg new file mode 100644 index 000000000..1de6910b5 --- /dev/null +++ b/lgsm/config-default/config-lgsm/tiserver/_default.cfg @@ -0,0 +1,187 @@ +################################## +######## 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="7777" +queryport="27015" +# Possible maps, see: https://isle.fandom.com/wiki/The_Isle_Server_Settings_and_Configuration#Optional_Maps +map="" + +## Server Parameters | https://docs.linuxgsm.com/configuration/start-parameters#additional-parameters +startparameters="${map} -MultiHome=${ip} -Port=${port} -QueryPort=${queryport} -log" + +#### 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="" + +# Gotify Alerts | https://docs.linuxgsm.com/alerts/gotify +gotifyalert="off" +gotifytoken="token" +gotifywebhook="webhook" + +# 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". +telegramapi="api.telegram.org" +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="412680" +steamcmdforcewindows="no" +# SteamCMD Branch | https://docs.linuxgsm.com/steamcmd/branch +branch="evrima" +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="2" + +## 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="no" + +## Game Server Details +# Do not edit +gamename="The Isle" +engine="unreal4" +glibc="2.17" + +#### Directories #### +# Edit with care + +## Game Server Directories +systemdir="${serverfiles}/TheIsle" +executabledir="${systemdir}/Binaries/Linux" +executable="./TheIsleServer-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}/${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/almalinux-8.csv b/lgsm/data/almalinux-8.csv index 39c49c153..808267bb0 100644 --- a/lgsm/data/almalinux-8.csv +++ b/lgsm/data/almalinux-8.csv @@ -105,6 +105,7 @@ sven terraria tf2,libcurl.i686 tfc +ti ts ts3 tu diff --git a/lgsm/data/centos-7.csv b/lgsm/data/centos-7.csv index db84ecc18..9f989f42a 100644 --- a/lgsm/data/centos-7.csv +++ b/lgsm/data/centos-7.csv @@ -105,6 +105,7 @@ sven terraria tf2,libcurl.i686 tfc +ti ts ts3 tu diff --git a/lgsm/data/centos-8.csv b/lgsm/data/centos-8.csv index 8084d9e0d..79c45b8db 100644 --- a/lgsm/data/centos-8.csv +++ b/lgsm/data/centos-8.csv @@ -104,6 +104,7 @@ sven terraria tf2,libcurl.i686 tfc +ti ts ts3 tu diff --git a/lgsm/data/debian-10.csv b/lgsm/data/debian-10.csv index 19d9b1828..b127eed9d 100644 --- a/lgsm/data/debian-10.csv +++ b/lgsm/data/debian-10.csv @@ -105,6 +105,7 @@ sven,libssl1.1:i386,zlib1g:i386 terraria tf2,libcurl4-gnutls-dev:i386 tfc +ti ts ts3 tu diff --git a/lgsm/data/debian-11.csv b/lgsm/data/debian-11.csv index 926d6d255..9ea1992f1 100644 --- a/lgsm/data/debian-11.csv +++ b/lgsm/data/debian-11.csv @@ -105,6 +105,7 @@ sven,libssl1.1:i386,zlib1g:i386 terraria tf2,libcurl4-gnutls-dev:i386 tfc +ti ts ts3 tu diff --git a/lgsm/data/debian-9.csv b/lgsm/data/debian-9.csv index d6886018c..b204d55b2 100644 --- a/lgsm/data/debian-9.csv +++ b/lgsm/data/debian-9.csv @@ -105,6 +105,7 @@ sven,libssl1.1:i386,zlib1g:i386 terraria tf2,libcurl4-gnutls-dev:i386 tfc +ti ts ts3 tu diff --git a/lgsm/data/rhel-7.csv b/lgsm/data/rhel-7.csv index 5438404b1..a7b3254ec 100644 --- a/lgsm/data/rhel-7.csv +++ b/lgsm/data/rhel-7.csv @@ -105,6 +105,7 @@ sven terraria tf2,libcurl.i686 tfc +ti ts ts3 tu diff --git a/lgsm/data/rhel-8.csv b/lgsm/data/rhel-8.csv index 5438404b1..a7b3254ec 100644 --- a/lgsm/data/rhel-8.csv +++ b/lgsm/data/rhel-8.csv @@ -105,6 +105,7 @@ sven terraria tf2,libcurl.i686 tfc +ti ts ts3 tu diff --git a/lgsm/data/rocky-8.csv b/lgsm/data/rocky-8.csv index 39c49c153..808267bb0 100644 --- a/lgsm/data/rocky-8.csv +++ b/lgsm/data/rocky-8.csv @@ -105,6 +105,7 @@ sven terraria tf2,libcurl.i686 tfc +ti ts ts3 tu diff --git a/lgsm/data/serverlist.csv b/lgsm/data/serverlist.csv index 2ad567579..7e71a94cc 100644 --- a/lgsm/data/serverlist.csv +++ b/lgsm/data/serverlist.csv @@ -103,6 +103,7 @@ sven,svenserver,Sven Co-op terraria,terrariaserver,Terraria tf2,tf2server,Team Fortress 2 tfc,tfcserver,Team Fortress Classic +ti,tiserver,The Isle ts,tsserver,The Specialists ts3,ts3server,Teamspeak 3 tu,tuserver,Tower Unite diff --git a/lgsm/data/ubuntu-16.04.csv b/lgsm/data/ubuntu-16.04.csv index 7ff519720..3882cec61 100644 --- a/lgsm/data/ubuntu-16.04.csv +++ b/lgsm/data/ubuntu-16.04.csv @@ -105,6 +105,7 @@ sven,libssl1.1:i386,zlib1g:i386 terraria tf2,libcurl4-gnutls-dev:i386 tfc +ti ts ts3 tu diff --git a/lgsm/data/ubuntu-18.04.csv b/lgsm/data/ubuntu-18.04.csv index 19d9b1828..b127eed9d 100644 --- a/lgsm/data/ubuntu-18.04.csv +++ b/lgsm/data/ubuntu-18.04.csv @@ -105,6 +105,7 @@ sven,libssl1.1:i386,zlib1g:i386 terraria tf2,libcurl4-gnutls-dev:i386 tfc +ti ts ts3 tu diff --git a/lgsm/data/ubuntu-20.04.csv b/lgsm/data/ubuntu-20.04.csv index a2fa9c28e..6276526d6 100644 --- a/lgsm/data/ubuntu-20.04.csv +++ b/lgsm/data/ubuntu-20.04.csv @@ -105,6 +105,7 @@ sven,libssl1.1:i386,zlib1g:i386 terraria tf2,libcurl4-gnutls-dev:i386 tfc +ti ts ts3 tu diff --git a/lgsm/data/ubuntu-21.04.csv b/lgsm/data/ubuntu-21.04.csv index 4274c4331..7ed62f1b1 100644 --- a/lgsm/data/ubuntu-21.04.csv +++ b/lgsm/data/ubuntu-21.04.csv @@ -105,6 +105,7 @@ sven,libssl1.1:i386,zlib1g:i386 terraria,libsdl tf2,libcurl4-gnutls-dev:i386 tfc +ti ts ts3 tu diff --git a/lgsm/data/ubuntu-21.10.csv b/lgsm/data/ubuntu-21.10.csv index a3ca2d84e..6780fd8c7 100644 --- a/lgsm/data/ubuntu-21.10.csv +++ b/lgsm/data/ubuntu-21.10.csv @@ -103,6 +103,7 @@ sven,libssl1.1:i386,zlib1g:i386 terraria,libsdl tf2,libcurl4-gnutls-dev:i386 tfc +ti ts ts3 tu diff --git a/lgsm/data/ubuntu-22.04.csv b/lgsm/data/ubuntu-22.04.csv index a3ca2d84e..6780fd8c7 100644 --- a/lgsm/data/ubuntu-22.04.csv +++ b/lgsm/data/ubuntu-22.04.csv @@ -103,6 +103,7 @@ sven,libssl1.1:i386,zlib1g:i386 terraria,libsdl tf2,libcurl4-gnutls-dev:i386 tfc +ti ts ts3 tu diff --git a/lgsm/functions/info_game.sh b/lgsm/functions/info_game.sh index 70c8a3caa..754f6183d 100644 --- a/lgsm/functions/info_game.sh +++ b/lgsm/functions/info_game.sh @@ -1819,6 +1819,16 @@ fn_info_game_stn(){ fi } +fn_info_game_ti(){ + if [ -f "${servercfgfullpath}" ]; then + servername=$(sed -nr 's/^ServerName="(.*)"/\1/p' "${servercfgfullpath}") + maxplayers=$(sed -nr 's/^MaxPlayerCount=([0-9]+)/\1/' "${servercfgfullpath}") + else + servername="${unavailable}" + maxplayers="${zero}" + fi +} + fn_info_game_ts3(){ # Config if [ ! -f "${servercfgfullpath}" ]; then @@ -2367,6 +2377,8 @@ elif [ "${shortname}" == "stn" ]; then fn_info_game_stn elif [ "${shortname}" == "terraria" ]; then fn_info_game_terraria +elif [ "${shortname}" == "ti" ]; then + fn_info_game_ti elif [ "${shortname}" == "ts3" ]; then fn_info_game_ts3 elif [ "${shortname}" == "tu" ]; then diff --git a/lgsm/functions/info_messages.sh b/lgsm/functions/info_messages.sh index a431bd54a..13e6987c1 100755 --- a/lgsm/functions/info_messages.sh +++ b/lgsm/functions/info_messages.sh @@ -1433,6 +1433,12 @@ fn_info_message_st(){ } | column -s $'\t' -t } +fn_info_message_ti(){ + fn_port "header" + fn_port "Game" port udp + fn_port "Query" queryport udp +} + fn_info_message_ts3(){ { fn_port "header" @@ -1742,6 +1748,8 @@ fn_info_message_select_engine(){ fn_info_message_stn elif [ "${shortname}" == "terraria" ]; then fn_info_message_terraria + elif [ "${shortname}" == "ti" ]; then + fn_info_message_ti elif [ "${shortname}" == "ts3" ]; then fn_info_message_ts3 elif [ "${shortname}" == "tu" ]; then diff --git a/lgsm/functions/install_config.sh b/lgsm/functions/install_config.sh index a5fa7bb7e..7832e9cd2 100755 --- a/lgsm/functions/install_config.sh +++ b/lgsm/functions/install_config.sh @@ -765,6 +765,13 @@ elif [ "${shortname}" == "tfc" ]; then fn_default_config_remote fn_set_config_vars fn_list_config_locations +elif [ "${shortname}" == "ti" ]; then + gamedirname="TheIsle" + array_configs+=( Game.ini ) + 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 ) From 0e6e09da2bf340d410dfec607de8aeb4a6416423 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Mon, 20 Dec 2021 21:53:20 +0000 Subject: [PATCH 120/164] fix: remove duplicate dependency --- lgsm/data/debian-10.csv | 2 +- lgsm/data/debian-11.csv | 2 +- lgsm/data/debian-9.csv | 2 +- lgsm/data/ubuntu-16.04.csv | 2 +- lgsm/data/ubuntu-18.04.csv | 2 +- lgsm/data/ubuntu-20.04.csv | 2 +- lgsm/data/ubuntu-21.04.csv | 2 +- lgsm/data/ubuntu-21.10.csv | 2 +- lgsm/data/ubuntu-22.04.csv | 2 +- 9 files changed, 9 insertions(+), 9 deletions(-) diff --git a/lgsm/data/debian-10.csv b/lgsm/data/debian-10.csv index b127eed9d..5f066b1ee 100644 --- a/lgsm/data/debian-10.csv +++ b/lgsm/data/debian-10.csv @@ -1,4 +1,4 @@ -all,bc,binutils,bsdmainutils,bzip2,ca-certificates,cpio,curl,file,gzip,hostname,jq,lib32gcc1,lib32stdc++6,netcat,netcat,python3,tar,tmux,unzip,util-linux,wget,xz-utils +all,bc,binutils,bsdmainutils,bzip2,ca-certificates,cpio,curl,file,gzip,hostname,jq,lib32gcc1,lib32stdc++6,netcat,python3,tar,tmux,unzip,util-linux,wget,xz-utils steamcmd,lib32gcc1,lib32stdc++6,libsdl2-2.0-0:i386,steamcmd ac ahl diff --git a/lgsm/data/debian-11.csv b/lgsm/data/debian-11.csv index 9ea1992f1..ca7b2a208 100644 --- a/lgsm/data/debian-11.csv +++ b/lgsm/data/debian-11.csv @@ -1,4 +1,4 @@ -all,bc,binutils,bsdmainutils,bzip2,ca-certificates,cpio,curl,file,gzip,hostname,jq,lib32gcc-s1,lib32stdc++6,netcat,netcat,python3,tar,tmux,unzip,util-linux,wget,xz-utils +all,bc,binutils,bsdmainutils,bzip2,ca-certificates,cpio,curl,file,gzip,hostname,jq,lib32gcc-s1,lib32stdc++6,netcat,python3,tar,tmux,unzip,util-linux,wget,xz-utils steamcmd,lib32gcc-s1,lib32stdc++6,libsdl2-2.0-0:i386,steamcmd ac ahl diff --git a/lgsm/data/debian-9.csv b/lgsm/data/debian-9.csv index b204d55b2..36f752356 100644 --- a/lgsm/data/debian-9.csv +++ b/lgsm/data/debian-9.csv @@ -1,4 +1,4 @@ -all,bc,binutils,bsdmainutils,bzip2,ca-certificates,cpio,curl,file,gzip,hostname,jq,lib32gcc1,lib32stdc++6,netcat,netcat,python3,tar,tmux,unzip,util-linux,wget,xz-utils +all,bc,binutils,bsdmainutils,bzip2,ca-certificates,cpio,curl,file,gzip,hostname,jq,lib32gcc1,lib32stdc++6,netcat,python3,tar,tmux,unzip,util-linux,wget,xz-utils steamcmd,lib32gcc1,lib32stdc++6,libsdl2-2.0-0:i386,steamcmd ac ahl diff --git a/lgsm/data/ubuntu-16.04.csv b/lgsm/data/ubuntu-16.04.csv index 3882cec61..1b23b1836 100644 --- a/lgsm/data/ubuntu-16.04.csv +++ b/lgsm/data/ubuntu-16.04.csv @@ -1,4 +1,4 @@ -all,bc,binutils,bsdmainutils,bzip2,ca-certificates,cpio,curl,file,gzip,hostname,jq,lib32gcc1,lib32stdc++6,netcat,netcat,python3,tar,tmux,unzip,util-linux,wget,xz-utils +all,bc,binutils,bsdmainutils,bzip2,ca-certificates,cpio,curl,file,gzip,hostname,jq,lib32gcc1,lib32stdc++6,netcat,python3,tar,tmux,unzip,util-linux,wget,xz-utils steamcmd,lib32gcc1,lib32stdc++6,libsdl2-2.0-0:i386,steamcmd ac ahl diff --git a/lgsm/data/ubuntu-18.04.csv b/lgsm/data/ubuntu-18.04.csv index b127eed9d..5f066b1ee 100644 --- a/lgsm/data/ubuntu-18.04.csv +++ b/lgsm/data/ubuntu-18.04.csv @@ -1,4 +1,4 @@ -all,bc,binutils,bsdmainutils,bzip2,ca-certificates,cpio,curl,file,gzip,hostname,jq,lib32gcc1,lib32stdc++6,netcat,netcat,python3,tar,tmux,unzip,util-linux,wget,xz-utils +all,bc,binutils,bsdmainutils,bzip2,ca-certificates,cpio,curl,file,gzip,hostname,jq,lib32gcc1,lib32stdc++6,netcat,python3,tar,tmux,unzip,util-linux,wget,xz-utils steamcmd,lib32gcc1,lib32stdc++6,libsdl2-2.0-0:i386,steamcmd ac ahl diff --git a/lgsm/data/ubuntu-20.04.csv b/lgsm/data/ubuntu-20.04.csv index 6276526d6..4809d4b97 100644 --- a/lgsm/data/ubuntu-20.04.csv +++ b/lgsm/data/ubuntu-20.04.csv @@ -1,4 +1,4 @@ -all,bc,binutils,bsdmainutils,bzip2,ca-certificates,cpio,curl,file,gzip,hostname,jq,lib32gcc1,lib32stdc++6,netcat,netcat,python3,tar,tmux,unzip,util-linux,wget,xz-utils +all,bc,binutils,bsdmainutils,bzip2,ca-certificates,cpio,curl,file,gzip,hostname,jq,lib32gcc1,lib32stdc++6,netcat,python3,tar,tmux,unzip,util-linux,wget,xz-utils steamcmd,lib32gcc1,lib32stdc++6,libsdl2-2.0-0:i386,steamcmd ac ahl diff --git a/lgsm/data/ubuntu-21.04.csv b/lgsm/data/ubuntu-21.04.csv index 7ed62f1b1..18918e443 100644 --- a/lgsm/data/ubuntu-21.04.csv +++ b/lgsm/data/ubuntu-21.04.csv @@ -1,4 +1,4 @@ -all,bc,binutils,bsdmainutils,bzip2,ca-certificates,cpio,curl,file,gzip,hostname,jq,lib32gcc-s1,lib32stdc++6,netcat,netcat,python3,tar,tmux,unzip,util-linux,wget,xz-utils +all,bc,binutils,bsdmainutils,bzip2,ca-certificates,cpio,curl,file,gzip,hostname,jq,lib32gcc-s1,lib32stdc++6,netcat,python3,tar,tmux,unzip,util-linux,wget,xz-utils steamcmd,lib32gcc-s1,lib32stdc++6,libsdl2-2.0-0:i386,steamcmd ac ahl diff --git a/lgsm/data/ubuntu-21.10.csv b/lgsm/data/ubuntu-21.10.csv index 6780fd8c7..d12f19447 100644 --- a/lgsm/data/ubuntu-21.10.csv +++ b/lgsm/data/ubuntu-21.10.csv @@ -1,4 +1,4 @@ -all,bc,binutils,bsdmainutils,bzip2,ca-certificates,cpio,curl,file,gzip,hostname,jq,lib32gcc-s1,lib32stdc++6,netcat,netcat,python3,tar,tmux,unzip,util-linux,wget,xz-utils +all,bc,binutils,bsdmainutils,bzip2,ca-certificates,cpio,curl,file,gzip,hostname,jq,lib32gcc-s1,lib32stdc++6,netcat,python3,tar,tmux,unzip,util-linux,wget,xz-utils steamcmd,lib32gcc-s1,lib32stdc++6,libsdl2-2.0-0:i386,steamcmd ac ahl diff --git a/lgsm/data/ubuntu-22.04.csv b/lgsm/data/ubuntu-22.04.csv index 6780fd8c7..d12f19447 100644 --- a/lgsm/data/ubuntu-22.04.csv +++ b/lgsm/data/ubuntu-22.04.csv @@ -1,4 +1,4 @@ -all,bc,binutils,bsdmainutils,bzip2,ca-certificates,cpio,curl,file,gzip,hostname,jq,lib32gcc-s1,lib32stdc++6,netcat,netcat,python3,tar,tmux,unzip,util-linux,wget,xz-utils +all,bc,binutils,bsdmainutils,bzip2,ca-certificates,cpio,curl,file,gzip,hostname,jq,lib32gcc-s1,lib32stdc++6,netcat,python3,tar,tmux,unzip,util-linux,wget,xz-utils steamcmd,lib32gcc-s1,lib32stdc++6,libsdl2-2.0-0:i386,steamcmd ac ahl From 5c139444c885a213561c8285c3338d24778b0730 Mon Sep 17 00:00:00 2001 From: Christian Date: Mon, 20 Dec 2021 22:54:39 +0100 Subject: [PATCH 121/164] fix(pstbs): enable steammaster (#3722) --- lgsm/config-default/config-lgsm/pstbsserver/_default.cfg | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lgsm/config-default/config-lgsm/pstbsserver/_default.cfg b/lgsm/config-default/config-lgsm/pstbsserver/_default.cfg index 9478ad42c..69501dbf3 100644 --- a/lgsm/config-default/config-lgsm/pstbsserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/pstbsserver/_default.cfg @@ -124,7 +124,7 @@ steamcmdforcewindows="no" branch="" betapassword="" # Master Server | https://docs.linuxgsm.com/steamcmd/steam-master-server -steammaster="false" +steammaster="true" ## Stop Mode | https://docs.linuxgsm.com/features/stop-mode # 1: tmux kill From a82ac53618e775344fe655e83a68c9d8aca61dbe Mon Sep 17 00:00:00 2001 From: Christian Date: Mon, 20 Dec 2021 23:14:08 +0100 Subject: [PATCH 122/164] fix(fix_steamcmd): fix to use link for steamclient.so via link (#3695) * fix(steamcmd): steamclient.so hardlink instead of copy --- lgsm/functions/fix_steamcmd.sh | 61 ++++++++++++++++++++++++++++------ 1 file changed, 51 insertions(+), 10 deletions(-) diff --git a/lgsm/functions/fix_steamcmd.sh b/lgsm/functions/fix_steamcmd.sh index 5fb151bad..abac31cfb 100755 --- a/lgsm/functions/fix_steamcmd.sh +++ b/lgsm/functions/fix_steamcmd.sh @@ -25,6 +25,8 @@ fn_fix_steamclient_so(){ 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" + elif [ -f "${HOME}/.local/share/Steam/steamcmd/linux32/steamclient.so" ]; then + cp "${HOME}/.local/share/Steam/steamcmd/linux32/steamclient.so" "${2}/steamclient.so" fi fn_fix_msg_end fi @@ -40,6 +42,8 @@ fn_fix_steamclient_so(){ 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" + elif [ -f "${HOME}/.local/share/Steam/steamcmd/linux64/steamclient.so" ]; then + cp "${HOME}/.local/share/Steam/steamcmd/linux64/steamclient.so" "${2}/steamclient.so" fi fn_fix_msg_end fi @@ -47,27 +51,64 @@ fn_fix_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" +steamsdk64="${HOME}/.steam/sdk64" +steamclientsdk64="${steamsdk64}/steamclient.so" +# remove any old unlinked versions of steamclient.so +if [ -f "${steamclientsdk64}" ]; then + if [ "$(stat -c '%h' "${steamclientsdk64}")" -eq 1 ]; then + fixname="steamclient.so sdk64 -- remove old file" + fn_fix_msg_start + rm -f "${steamclientsdk64}" + fn_fix_msg_end + fi +fi + +# place new hardlink for the file to the disk +if [ ! -f "${steamclientsdk64}" ]; then + fixname="steamclient.so sdk64 hardlink" fn_fix_msg_start - mkdir -p "${HOME}/.steam/sdk64" + if [ ! -d "${steamsdk64}" ]; then + mkdir -p "${steamsdk64}" + fi if [ -f "${HOME}/.steam/steamcmd/linux64/steamclient.so" ]; then - cp "${HOME}/.steam/steamcmd/linux64/steamclient.so" "${HOME}/.steam/sdk64/steamclient.so" + ln "${HOME}/.steam/steamcmd/linux64/steamclient.so" "${steamclientsdk64}" elif [ -f "${steamcmddir}/linux64/steamclient.so" ]; then - cp "${steamcmddir}/linux64/steamclient.so" "${HOME}/.steam/sdk64/steamclient.so" + ln "${steamcmddir}/linux64/steamclient.so" "${steamclientsdk64}" + elif [ -f "${HOME}/.local/share/Steam/steamcmd/linux64/steamclient.so" ]; then + ln "${HOME}/.local/share/Steam/steamcmd/linux64/steamclient.so" "${steamclientsdk64}" + else + fn_print_fail_nl "Could not copy any steamclient.so 64bit for the gameserver" 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 sdk32" +steamsdk32="${HOME}/.steam/sdk32" +steamclientsdk32="${HOME}/.steam/sdk32/steamclient.so" +if [ -f "${steamclientsdk32}" ]; then + if [ " $(stat -c '%h' "${steamclientsdk32}")" -eq 1 ]; then + fixname="steamclient.so sdk32 -- remove old file" + fn_fix_msg_start + rm -f "${steamclientsdk32}" + fn_fix_msg_end + fi +fi + +# place new hardlink for the file to the disk +if [ ! -f "${steamclientsdk32}" ]; then + fixname="steamclient.so sdk32 link" fn_fix_msg_start - mkdir -p "${HOME}/.steam/sdk32" + if [ ! -d "${steamsdk32}" ]; then + mkdir -p "${steamsdk32}" + fi if [ -f "${HOME}/.steam/steamcmd/linux32/steamclient.so" ]; then - cp "${HOME}/.steam/steamcmd/linux32/steamclient.so" "${HOME}/.steam/sdk32/steamclient.so" + ln "${HOME}/.steam/steamcmd/linux32/steamclient.so" "${steamclientsdk32}" elif [ -f "${steamcmddir}/linux32/steamclient.so" ]; then - cp "${steamcmddir}/linux32/steamclient.so" "${HOME}/.steam/sdk32/steamclient.so" + ln "${steamcmddir}/linux32/steamclient.so" "${steamclientsdk32}" + elif [ -f "${HOME}/.local/share/Steam/steamcmd/linux32/steamclient.so" ]; then + ln "${HOME}/.local/share/Steam/steamcmd/linux32/steamclient.so" "${steamclientsdk32}" + else + fn_print_fail_nl "Could not copy any steamclient.so 32bit for the gameserver" fi fn_fix_msg_end fi From 1c3e5048ebb0abf8f2e631d1259e3a1eafbb4feb Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Tue, 21 Dec 2021 22:07:32 +0000 Subject: [PATCH 123/164] feat: give warning if distro is not supported by vendor (#3723) --- lgsm/functions/check_deps.sh | 8 ++++++++ lgsm/functions/info_distro.sh | 17 +++++++++++++++++ 2 files changed, 25 insertions(+) diff --git a/lgsm/functions/check_deps.sh b/lgsm/functions/check_deps.sh index fab923bd7..340a6456b 100755 --- a/lgsm/functions/check_deps.sh +++ b/lgsm/functions/check_deps.sh @@ -316,6 +316,14 @@ if [ "${commandname}" == "INSTALL" ]; then fi fi +# Will warn user if their distro is no longer supported by the vendor. +if [ -n "${distrosupport}" ]; then + if [ "${distrosupport}" == "unsupported" ]; then + fn_print_warning_nl "${distroname} is no longer supported by the vendor. Upgrading is recommended." + fn_script_log_warn "${distroname} is no longer supported by the vendor. Upgrading is recommended." + fi +fi + info_distro.sh if [ ! -f "${tmpdir}/dependency-no-check.tmp" ]&&[ ! -f "${datadir}/${distroid}-${distroversioncsv}.csv" ]; then diff --git a/lgsm/functions/info_distro.sh b/lgsm/functions/info_distro.sh index 3e3051d2d..472c9c5b2 100755 --- a/lgsm/functions/info_distro.sh +++ b/lgsm/functions/info_distro.sh @@ -80,6 +80,23 @@ else distroversioncsv="${distroversion}" fi +# Check if distro supported by distro vendor. +if [ "$(command -v distro-info 2>/dev/null)" ]; then + distrosunsupported="$(distro-info --unsupported)" + distrosunsupported_array=( "${distrosunsupported}" ) + for distrounsupported in "${distrosunsupported_array[@]}"; do + if [ "${distrounsupported}" == "${distrocodename}" ]; then + distrosupport=unsupported + break + else + distrosupport=supported + fi + done +else + distrosupport=unknown +fi + +echo "${distrosupport}" ## Glibc version # e.g: 1.17 glibcversion="$(ldd --version | sed -n '1s/.* //p')" From de6240fd0ceeef73750e03eb331ae6b2181efdde Mon Sep 17 00:00:00 2001 From: UltimateByte Date: Tue, 21 Dec 2021 23:08:07 +0100 Subject: [PATCH 124/164] fix: #1868 mods lowercase conversion (#3717) * Finally fixes #1868 mods lowercase conversion Sample output: Installing DarkRP ================================= creating mod download directory /home/ulti/lgsm/mods/tmp...OK #=#=- # # ################################################################################################################################################################################################################################################ 100.0% -#O=- # # # extracting darkrp-master.zip...OK converting DarkRP files to lowercase...Found 19 uppercase files out of 588, converting...OK building darkrp-files.txt...OK copying DarkRP to /home/ulti/serverfiles/garrysmod/gamemodes...OK tidy up darkrp-files.txt...OK clearing mod download directory /home/ulti/lgsm/mods/tmp...OK DarkRP installed * removed unused variable --- lgsm/functions/mods_core.sh | 44 +++++++++++++++++++++---------------- 1 file changed, 25 insertions(+), 19 deletions(-) diff --git a/lgsm/functions/mods_core.sh b/lgsm/functions/mods_core.sh index 7e46f7977..47ac70cb2 100755 --- a/lgsm/functions/mods_core.sh +++ b/lgsm/functions/mods_core.sh @@ -33,33 +33,39 @@ fn_mod_install_files(){ # Convert mod files to lowercase if needed. fn_mod_lowercase(){ + # Checking lowercase settings from mods array definition if [ "${modlowercase}" == "LowercaseOn" ]; then - echo -en "converting ${modprettyname} files to lowercase..." fn_sleep_time fn_script_log_info "Converting ${modprettyname} files to lowercase" - fileswc=$(find "${extractdir}" -depth | wc -l) - echo -en "\r" + # Total files and directories for the mod, to output to the user + fileswc=$(find "${extractdir}" | wc -l) + # Total uppercase files and directories for the mod, to output to the user + filesupperwc=$(find "${extractdir}" -name '*[[:upper:]]*' | wc -l) + fn_script_log_info "Found ${filesupperwc} uppercase files out of ${fileswc}, converting" + echo -en "Found ${filesupperwc} uppercase files out of ${fileswc}, converting..." + # Convert files and directories starting from the deepest to prevent issues (-depth argument) while read -r src; do - dst=$(dirname "${src}$(/)basename" "${src}" | tr '[:upper:]' '[:lower:]') - if [ "${src}" != "${dst}" ] - then - [ ! -e "${dst}" ] && mv -T "${src}" "${dst}" || echo -e "${src} was not renamed" + # We have to convert only the last file from the path, otherwise we will fail to convert anything if a parent dir has any uppercase + # therefore, we have to separate the end of the filename to only lowercase it rather than the whole line + # Gather parent dir, filename lowercase filename, and set lowercase destination name + latestparentdir=$(dirname "${src}") + latestfilelc=$(basename "${src}" | tr '[:upper:]' '[:lower:]') + dst="${latestparentdir}/${latestfilelc}" + # Only convert if destination does not already exist for some reason + if [ ! -e "${dst}" ]; then + # Finally we can rename the file + mv "${src}" "${dst}" + # Exit if it fails for any reason local exitcode=$? - ((renamedwc++)) + if [ "${exitcode}" != 0 ]; then + fn_print_fail_eol_nl + core_exit.sh + fi fi - echo -en "${renamedwc} / ${totalfileswc} / ${fileswc} converting ${modprettyname} files to lowercase..." $'\r' - ((totalfileswc++)) - done < <(find "${extractdir}" -depth) - echo -en "${renamedwc} / ${totalfileswc} / ${fileswc} converting ${modprettyname} files to lowercase..." - - if [ "${exitcode}" != 0 ]; then - fn_print_fail_eol_nl - core_exit.sh - else + done < <(find "${extractdir}" -depth -name '*[[:upper:]]*') fn_print_ok_eol_nl - fi - fi + fi } # Create ${modcommand}-files.txt containing the full extracted file/directory list. From 1c603b7449383a937cb3c3cee89604caac9eac70 Mon Sep 17 00:00:00 2001 From: Viktor Vilhelm Sonesten Date: Wed, 22 Dec 2021 13:32:14 +0100 Subject: [PATCH 125/164] fix(pzserver): start with --ip instead of -ip (#3724) `-ip` is not parsed correctly by the new build 41 release. See https://github.com/GameServerManagers/LinuxGSM/discussions/3711#discussioncomment-1844368 --- lgsm/config-default/config-lgsm/pzserver/_default.cfg | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lgsm/config-default/config-lgsm/pzserver/_default.cfg b/lgsm/config-default/config-lgsm/pzserver/_default.cfg index a9dfb40b2..2d284187f 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" ## Server Parameters | https://docs.linuxgsm.com/configuration/start-parameters#additional-parameters -startparameters="-ip ${ip} -adminpassword \"${adminpassword}\" -servername ${selfname}" +startparameters="--ip ${ip} -adminpassword \"${adminpassword}\" -servername ${selfname}" #### LinuxGSM Settings #### From 588453a43ae73f2e0bc2d1628ea8281de15a354e Mon Sep 17 00:00:00 2001 From: Christian Date: Fri, 31 Dec 2021 22:12:30 +0100 Subject: [PATCH 126/164] fix(cd): add config install (#3726) --- lgsm/functions/install_config.sh | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/lgsm/functions/install_config.sh b/lgsm/functions/install_config.sh index 7832e9cd2..76de7867f 100755 --- a/lgsm/functions/install_config.sh +++ b/lgsm/functions/install_config.sh @@ -274,6 +274,13 @@ elif [ "${shortname}" == "bmdm" ]; then fn_default_config_remote fn_set_config_vars fn_list_config_locations +elif [ "${shortname}" == "cd" ]; then + gamedirname="CraftingDead" + array_configs+=( properties.json ) + 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 ) From 043f9da769b17eab3c763e657d367645a6206333 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Fri, 31 Dec 2021 21:23:00 +0000 Subject: [PATCH 127/164] Release v21.5.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 725cd297b..4e857553e 100755 --- a/lgsm/functions/core_functions.sh +++ b/lgsm/functions/core_functions.sh @@ -8,7 +8,7 @@ functionselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" -modulesversion="v21.4.1" +modulesversion="v21.5.0" # Core diff --git a/linuxgsm.sh b/linuxgsm.sh index 1eff0d00f..76edddfa3 100755 --- a/linuxgsm.sh +++ b/linuxgsm.sh @@ -20,7 +20,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="v21.4.1" +version="v21.5.0" shortname="core" gameservername="core" commandname="CORE" diff --git a/tests/tests_fctrserver.sh b/tests/tests_fctrserver.sh index 138864098..8dfad01c6 100644 --- a/tests/tests_fctrserver.sh +++ b/tests/tests_fctrserver.sh @@ -20,7 +20,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="v21.4.1" +version="v21.5.0" shortname="fctr" gameservername="fctrserver" commandname="CORE" diff --git a/tests/tests_jc2server.sh b/tests/tests_jc2server.sh index 86637f5b2..c4b2bba4a 100644 --- a/tests/tests_jc2server.sh +++ b/tests/tests_jc2server.sh @@ -20,7 +20,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="v21.4.1" +version="v21.5.0" shortname="jc2" gameservername="jc2server" commandname="CORE" diff --git a/tests/tests_mcserver.sh b/tests/tests_mcserver.sh index 447b8b9e3..382dd4e12 100644 --- a/tests/tests_mcserver.sh +++ b/tests/tests_mcserver.sh @@ -20,7 +20,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="v21.4.1" +version="v21.5.0" shortname="mc" gameservername="mcserver" commandname="CORE" diff --git a/tests/tests_ts3server.sh b/tests/tests_ts3server.sh index 3c160f009..aec69cdd1 100644 --- a/tests/tests_ts3server.sh +++ b/tests/tests_ts3server.sh @@ -20,7 +20,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="v21.4.1" +version="v21.5.0" shortname="ts3" gameservername="ts3server" commandname="CORE" From dda4af8a0a3e1a63c15fd19010088b6e26904ae3 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Fri, 31 Dec 2021 21:28:24 +0000 Subject: [PATCH 128/164] fix ti message --- lgsm/functions/info_messages.sh | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/lgsm/functions/info_messages.sh b/lgsm/functions/info_messages.sh index 13e6987c1..a5ad5852e 100755 --- a/lgsm/functions/info_messages.sh +++ b/lgsm/functions/info_messages.sh @@ -1434,9 +1434,11 @@ fn_info_message_st(){ } fn_info_message_ti(){ - fn_port "header" - fn_port "Game" port udp - fn_port "Query" queryport udp + { + fn_port "header" + fn_port "Game" port udp + fn_port "Query" queryport udp + } | column -s $'\t' -t } fn_info_message_ts3(){ From ad8fc3ac8a79ad9c15fe4d032c3d16636b9cf5e3 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Mon, 3 Jan 2022 19:05:16 +0000 Subject: [PATCH 129/164] fix: remove unneeded echo --- lgsm/functions/info_distro.sh | 1 - 1 file changed, 1 deletion(-) diff --git a/lgsm/functions/info_distro.sh b/lgsm/functions/info_distro.sh index 472c9c5b2..148e2df48 100755 --- a/lgsm/functions/info_distro.sh +++ b/lgsm/functions/info_distro.sh @@ -96,7 +96,6 @@ else distrosupport=unknown fi -echo "${distrosupport}" ## Glibc version # e.g: 1.17 glibcversion="$(ldd --version | sed -n '1s/.* //p')" From 643a6fed2628d4488ac7fe5884b28a97d9eb7071 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Sat, 8 Jan 2022 18:01:22 +0000 Subject: [PATCH 130/164] feat(ark): increase glibc requirement to 2.17 --- 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 eb3ac908b..8e24debfc 100644 --- a/lgsm/config-default/config-lgsm/arkserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/arkserver/_default.cfg @@ -158,7 +158,7 @@ consoleinteract="no" # Do not edit gamename="ARK: Survival Evolved" engine="unreal4" -glibc="2.15" +glibc="2.17" #### Directories #### # Edit with care From 0465e0970bb1e9909269c7aba186d91e4d78a0db Mon Sep 17 00:00:00 2001 From: Christian Date: Sun, 9 Jan 2022 22:41:31 +0100 Subject: [PATCH 131/164] fix(deps): add missing dep for distro-info (#3732) --- lgsm/data/debian-10.csv | 2 +- lgsm/data/debian-11.csv | 2 +- lgsm/data/debian-9.csv | 2 +- lgsm/data/ubuntu-18.04.csv | 2 +- lgsm/data/ubuntu-20.04.csv | 2 +- lgsm/data/ubuntu-21.04.csv | 2 +- lgsm/data/ubuntu-21.10.csv | 2 +- lgsm/data/ubuntu-22.04.csv | 2 +- 8 files changed, 8 insertions(+), 8 deletions(-) diff --git a/lgsm/data/debian-10.csv b/lgsm/data/debian-10.csv index 5f066b1ee..94f356412 100644 --- a/lgsm/data/debian-10.csv +++ b/lgsm/data/debian-10.csv @@ -1,4 +1,4 @@ -all,bc,binutils,bsdmainutils,bzip2,ca-certificates,cpio,curl,file,gzip,hostname,jq,lib32gcc1,lib32stdc++6,netcat,python3,tar,tmux,unzip,util-linux,wget,xz-utils +all,bc,binutils,bsdmainutils,bzip2,ca-certificates,cpio,curl,distro-info,file,gzip,hostname,jq,lib32gcc1,lib32stdc++6,netcat,python3,tar,tmux,unzip,util-linux,wget,xz-utils steamcmd,lib32gcc1,lib32stdc++6,libsdl2-2.0-0:i386,steamcmd ac ahl diff --git a/lgsm/data/debian-11.csv b/lgsm/data/debian-11.csv index ca7b2a208..6e2b3e99f 100644 --- a/lgsm/data/debian-11.csv +++ b/lgsm/data/debian-11.csv @@ -1,4 +1,4 @@ -all,bc,binutils,bsdmainutils,bzip2,ca-certificates,cpio,curl,file,gzip,hostname,jq,lib32gcc-s1,lib32stdc++6,netcat,python3,tar,tmux,unzip,util-linux,wget,xz-utils +all,bc,binutils,bsdmainutils,bzip2,ca-certificates,cpio,curl,distro-info,file,gzip,hostname,jq,lib32gcc-s1,lib32stdc++6,netcat,python3,tar,tmux,unzip,util-linux,wget,xz-utils steamcmd,lib32gcc-s1,lib32stdc++6,libsdl2-2.0-0:i386,steamcmd ac ahl diff --git a/lgsm/data/debian-9.csv b/lgsm/data/debian-9.csv index 36f752356..9cb339c8e 100644 --- a/lgsm/data/debian-9.csv +++ b/lgsm/data/debian-9.csv @@ -1,4 +1,4 @@ -all,bc,binutils,bsdmainutils,bzip2,ca-certificates,cpio,curl,file,gzip,hostname,jq,lib32gcc1,lib32stdc++6,netcat,python3,tar,tmux,unzip,util-linux,wget,xz-utils +all,bc,binutils,bsdmainutils,bzip2,ca-certificates,cpio,curl,distro-info,file,gzip,hostname,jq,lib32gcc1,lib32stdc++6,netcat,python3,tar,tmux,unzip,util-linux,wget,xz-utils steamcmd,lib32gcc1,lib32stdc++6,libsdl2-2.0-0:i386,steamcmd ac ahl diff --git a/lgsm/data/ubuntu-18.04.csv b/lgsm/data/ubuntu-18.04.csv index 5f066b1ee..94f356412 100644 --- a/lgsm/data/ubuntu-18.04.csv +++ b/lgsm/data/ubuntu-18.04.csv @@ -1,4 +1,4 @@ -all,bc,binutils,bsdmainutils,bzip2,ca-certificates,cpio,curl,file,gzip,hostname,jq,lib32gcc1,lib32stdc++6,netcat,python3,tar,tmux,unzip,util-linux,wget,xz-utils +all,bc,binutils,bsdmainutils,bzip2,ca-certificates,cpio,curl,distro-info,file,gzip,hostname,jq,lib32gcc1,lib32stdc++6,netcat,python3,tar,tmux,unzip,util-linux,wget,xz-utils steamcmd,lib32gcc1,lib32stdc++6,libsdl2-2.0-0:i386,steamcmd ac ahl diff --git a/lgsm/data/ubuntu-20.04.csv b/lgsm/data/ubuntu-20.04.csv index 4809d4b97..bf5a9601c 100644 --- a/lgsm/data/ubuntu-20.04.csv +++ b/lgsm/data/ubuntu-20.04.csv @@ -1,4 +1,4 @@ -all,bc,binutils,bsdmainutils,bzip2,ca-certificates,cpio,curl,file,gzip,hostname,jq,lib32gcc1,lib32stdc++6,netcat,python3,tar,tmux,unzip,util-linux,wget,xz-utils +all,bc,binutils,bsdmainutils,bzip2,ca-certificates,cpio,curl,distro-info,file,gzip,hostname,jq,lib32gcc1,lib32stdc++6,netcat,python3,tar,tmux,unzip,util-linux,wget,xz-utils steamcmd,lib32gcc1,lib32stdc++6,libsdl2-2.0-0:i386,steamcmd ac ahl diff --git a/lgsm/data/ubuntu-21.04.csv b/lgsm/data/ubuntu-21.04.csv index 18918e443..c2a4b959d 100644 --- a/lgsm/data/ubuntu-21.04.csv +++ b/lgsm/data/ubuntu-21.04.csv @@ -1,4 +1,4 @@ -all,bc,binutils,bsdmainutils,bzip2,ca-certificates,cpio,curl,file,gzip,hostname,jq,lib32gcc-s1,lib32stdc++6,netcat,python3,tar,tmux,unzip,util-linux,wget,xz-utils +all,bc,binutils,bsdmainutils,bzip2,ca-certificates,cpio,curl,distro-info,file,gzip,hostname,jq,lib32gcc-s1,lib32stdc++6,netcat,python3,tar,tmux,unzip,util-linux,wget,xz-utils steamcmd,lib32gcc-s1,lib32stdc++6,libsdl2-2.0-0:i386,steamcmd ac ahl diff --git a/lgsm/data/ubuntu-21.10.csv b/lgsm/data/ubuntu-21.10.csv index d12f19447..8c66e2e26 100644 --- a/lgsm/data/ubuntu-21.10.csv +++ b/lgsm/data/ubuntu-21.10.csv @@ -1,4 +1,4 @@ -all,bc,binutils,bsdmainutils,bzip2,ca-certificates,cpio,curl,file,gzip,hostname,jq,lib32gcc-s1,lib32stdc++6,netcat,python3,tar,tmux,unzip,util-linux,wget,xz-utils +all,bc,binutils,bsdmainutils,bzip2,ca-certificates,cpio,curl,distro-info,file,gzip,hostname,jq,lib32gcc-s1,lib32stdc++6,netcat,python3,tar,tmux,unzip,util-linux,wget,xz-utils steamcmd,lib32gcc-s1,lib32stdc++6,libsdl2-2.0-0:i386,steamcmd ac ahl diff --git a/lgsm/data/ubuntu-22.04.csv b/lgsm/data/ubuntu-22.04.csv index d12f19447..8c66e2e26 100644 --- a/lgsm/data/ubuntu-22.04.csv +++ b/lgsm/data/ubuntu-22.04.csv @@ -1,4 +1,4 @@ -all,bc,binutils,bsdmainutils,bzip2,ca-certificates,cpio,curl,file,gzip,hostname,jq,lib32gcc-s1,lib32stdc++6,netcat,python3,tar,tmux,unzip,util-linux,wget,xz-utils +all,bc,binutils,bsdmainutils,bzip2,ca-certificates,cpio,curl,distro-info,file,gzip,hostname,jq,lib32gcc-s1,lib32stdc++6,netcat,python3,tar,tmux,unzip,util-linux,wget,xz-utils steamcmd,lib32gcc-s1,lib32stdc++6,libsdl2-2.0-0:i386,steamcmd ac ahl From 079fe0766e98bc0a1a191ecb7e576a05d25bc273 Mon Sep 17 00:00:00 2001 From: Christian Date: Sun, 9 Jan 2022 22:42:07 +0100 Subject: [PATCH 132/164] fix(vh): log a message when the password is not set or to short (#3738) --- lgsm/functions/check_config.sh | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/lgsm/functions/check_config.sh b/lgsm/functions/check_config.sh index 5b8d51691..0a6313151 100755 --- a/lgsm/functions/check_config.sh +++ b/lgsm/functions/check_config.sh @@ -25,3 +25,11 @@ elif [ -v rconpassword ]&&[ "${rconpassword}" == "CHANGE_ME" ]; then fn_print_warn_nl "Default RCON Password detected" fn_script_log_warn "Default RCON Password detected" fi + +if [ "${shortname}" == "vh" ]&&[ -z "${serverpassword}" ]; then + fn_print_fail_nl "serverpassword is not set" + fn_script_log_fatal "serverpassword is not set" +elif [ "${shortname}" == "vh" ]&&[ "${#serverpassword}" -le "4" ]; then + fn_print_fail_nl "serverpassword is to short (min 5 chars)" + fn_script_log_fatal "serverpassword is to short (min 5 chars)" +fi From 1a022caf21b9f4c7716b5e3d542c78d8f4d3f675 Mon Sep 17 00:00:00 2001 From: sharaga44 <97103998+sharaga44@users.noreply.github.com> Date: Mon, 10 Jan 2022 00:42:36 +0300 Subject: [PATCH 133/164] fix(unt): resolve start parameter issues #2681 (#3733) * Update linuxgsm.sh * Update _default.cfg * Update install_config.sh * Update _default.cfg * Revert "Update linuxgsm.sh" This reverts commit 12639d26d1935f09c0ebd4de79d70dd9ce75d4b8. * Revert "Update install_config.sh" This reverts commit 2de6088edddc1fc7e0d934439395bd6d57dfa441. --- lgsm/config-default/config-lgsm/untserver/_default.cfg | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/lgsm/config-default/config-lgsm/untserver/_default.cfg b/lgsm/config-default/config-lgsm/untserver/_default.cfg index e57f08f57..41d1981e7 100644 --- a/lgsm/config-default/config-lgsm/untserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/untserver/_default.cfg @@ -12,10 +12,15 @@ ip="0.0.0.0" port="27015" maxplayers="20" -defaultmap="pei" +defaultmap="PEI" + +## Game Server Login Token (GSLT): Required +# GSLT is required for running a public server. +# More info: https://docs.linuxgsm.com/steamcmd/gslt +gslt="" ## Server Parameters | https://docs.linuxgsm.com/configuration/start-parameters#additional-parameters -startparameters="-port:${port} -players:${maxplayers} --nographics -${defaultmap} -batchmode +secureserver/${selfname}" +startparameters="-nographics -batchmode -bind ${ip} -port ${port} -maxplayers ${maxplayers} -map ${defaultmap} -gslt ${gslt} +InternetServer/${selfname}" #### LinuxGSM Settings #### From f60c65a744fe82410f947e85b5d8ae93387d9406 Mon Sep 17 00:00:00 2001 From: Christian Date: Sat, 15 Jan 2022 14:30:48 +0100 Subject: [PATCH 134/164] refactor(core): move curl check to main file (#3740) --- lgsm/functions/core_dl.sh | 6 ------ linuxgsm.sh | 6 ++++++ 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/lgsm/functions/core_dl.sh b/lgsm/functions/core_dl.sh index 5abfdfbb3..297f4101f 100755 --- a/lgsm/functions/core_dl.sh +++ b/lgsm/functions/core_dl.sh @@ -597,9 +597,3 @@ fn_dl_latest_release_github(){ fi fi } - -# Check that curl is installed -if [ ! "$(command -v curl 2>/dev/null)" ]; then - echo -e "[ FAIL ] Curl is not installed" - exit 1 -fi diff --git a/linuxgsm.sh b/linuxgsm.sh index 76edddfa3..6eb3f0beb 100755 --- a/linuxgsm.sh +++ b/linuxgsm.sh @@ -51,6 +51,12 @@ githubuser="GameServerManagers" githubrepo="LinuxGSM" githubbranch="master" +# Check that curl is installed before doing anything +if [ ! "$(command -v curl 2>/dev/null)" ]; then + echo -e "[ FAIL ] Curl is not installed" + exit 1 +fi + # Core function that is required first. core_functions.sh(){ functionfile="${FUNCNAME[0]}" From fc97f5b696e100f81ef9332193be4e5e5ff445a6 Mon Sep 17 00:00:00 2001 From: StudioEtrange Date: Mon, 17 Jan 2022 23:38:25 +0100 Subject: [PATCH 135/164] feat(core): allow to set github details at runtime with env vars (#3708) --- linuxgsm.sh | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/linuxgsm.sh b/linuxgsm.sh index 76edddfa3..5e5565f3e 100755 --- a/linuxgsm.sh +++ b/linuxgsm.sh @@ -47,9 +47,9 @@ userinput2="${2}" ## GitHub Branch Select # Allows for the use of different function files # from a different repo and/or branch. -githubuser="GameServerManagers" -githubrepo="LinuxGSM" -githubbranch="master" +[ -n "${LGSM_GITHUBUSER}" ] && githubuser="${LGSM_GITHUBUSER}" || githubuser="GameServerManagers" +[ -n "${LGSM_GITHUBREPO}" ] && githubrepo="${LGSM_GITHUBREPO}" || githubrepo="LinuxGSM" +[ -n "${LGSM_GITHUBBRANCH}" ] && githubbranch="${LGSM_GITHUBBRANCH}" || githubbranch="master" # Core function that is required first. core_functions.sh(){ From 437ebfaed727d7a9244dca4e5a14f7f545c0e8c8 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Mon, 17 Jan 2022 22:44:07 +0000 Subject: [PATCH 136/164] Release v21.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 4e857553e..4a72bf7d0 100755 --- a/lgsm/functions/core_functions.sh +++ b/lgsm/functions/core_functions.sh @@ -8,7 +8,7 @@ functionselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" -modulesversion="v21.5.0" +modulesversion="v21.5.1" # Core diff --git a/linuxgsm.sh b/linuxgsm.sh index 5e5565f3e..99cf85902 100755 --- a/linuxgsm.sh +++ b/linuxgsm.sh @@ -20,7 +20,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="v21.5.0" +version="v21.5.1" shortname="core" gameservername="core" commandname="CORE" diff --git a/tests/tests_fctrserver.sh b/tests/tests_fctrserver.sh index 8dfad01c6..c5c80590c 100644 --- a/tests/tests_fctrserver.sh +++ b/tests/tests_fctrserver.sh @@ -20,7 +20,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="v21.5.0" +version="v21.5.1" shortname="fctr" gameservername="fctrserver" commandname="CORE" diff --git a/tests/tests_jc2server.sh b/tests/tests_jc2server.sh index c4b2bba4a..89867b5fa 100644 --- a/tests/tests_jc2server.sh +++ b/tests/tests_jc2server.sh @@ -20,7 +20,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="v21.5.0" +version="v21.5.1" shortname="jc2" gameservername="jc2server" commandname="CORE" diff --git a/tests/tests_mcserver.sh b/tests/tests_mcserver.sh index 382dd4e12..347646789 100644 --- a/tests/tests_mcserver.sh +++ b/tests/tests_mcserver.sh @@ -20,7 +20,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="v21.5.0" +version="v21.5.1" shortname="mc" gameservername="mcserver" commandname="CORE" diff --git a/tests/tests_ts3server.sh b/tests/tests_ts3server.sh index aec69cdd1..01a705086 100644 --- a/tests/tests_ts3server.sh +++ b/tests/tests_ts3server.sh @@ -20,7 +20,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="v21.5.0" +version="v21.5.1" shortname="ts3" gameservername="ts3server" commandname="CORE" From a52d3d4638bb5fba28815f89ce24c604d345b7b8 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Wed, 9 Feb 2022 23:39:46 +0000 Subject: [PATCH 137/164] Create dependabot.yml --- .github/dependabot.yml | 9 +++++++++ 1 file changed, 9 insertions(+) create mode 100644 .github/dependabot.yml diff --git a/.github/dependabot.yml b/.github/dependabot.yml new file mode 100644 index 000000000..c39f10ad4 --- /dev/null +++ b/.github/dependabot.yml @@ -0,0 +1,9 @@ +# Set update schedule for GitHub Actions +version: 2 +updates: + + - package-ecosystem: "github-actions" + directory: "/" + schedule: + # Check for updates to GitHub Actions every weekday + interval: "daily" From ff7a9e788f0005ce012b24438a0762698a80bed0 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 9 Feb 2022 23:41:31 +0000 Subject: [PATCH 138/164] build(deps): bump release-drafter/release-drafter from 5.15.0 to 5.18.1 (#3783) * Create dependabot.yml * build(deps): bump release-drafter/release-drafter from 5.15.0 to 5.18.1 Bumps [release-drafter/release-drafter](https://github.com/release-drafter/release-drafter) from 5.15.0 to 5.18.1. - [Release notes](https://github.com/release-drafter/release-drafter/releases) - [Commits](https://github.com/release-drafter/release-drafter/compare/v5.15.0...v5.18.1) --- updated-dependencies: - dependency-name: release-drafter/release-drafter dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: Daniel Gibbs Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/dependabot.yml | 9 +++++++++ .github/workflows/create-release.yml | 2 +- 2 files changed, 10 insertions(+), 1 deletion(-) create mode 100644 .github/dependabot.yml diff --git a/.github/dependabot.yml b/.github/dependabot.yml new file mode 100644 index 000000000..c39f10ad4 --- /dev/null +++ b/.github/dependabot.yml @@ -0,0 +1,9 @@ +# Set update schedule for GitHub Actions +version: 2 +updates: + + - package-ecosystem: "github-actions" + directory: "/" + schedule: + # Check for updates to GitHub Actions every weekday + interval: "daily" diff --git a/.github/workflows/create-release.yml b/.github/workflows/create-release.yml index 04b6adb87..7b71953f0 100644 --- a/.github/workflows/create-release.yml +++ b/.github/workflows/create-release.yml @@ -10,7 +10,7 @@ jobs: runs-on: ubuntu-latest steps: # Drafts your next Release notes as Pull Requests are merged into "master" - - uses: release-drafter/release-drafter@v5.15.0 + - uses: release-drafter/release-drafter@v5.18.1 with: config-name: release-drafter.yml env: From ef583bdf33a3e612d5b095e80fd65945046d0561 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 9 Feb 2022 23:42:00 +0000 Subject: [PATCH 139/164] build(deps): bump dessant/lock-threads from 2.1.2 to 3 (#3782) * Create dependabot.yml * build(deps): bump dessant/lock-threads from 2.1.2 to 3 Bumps [dessant/lock-threads](https://github.com/dessant/lock-threads) from 2.1.2 to 3. - [Release notes](https://github.com/dessant/lock-threads/releases) - [Changelog](https://github.com/dessant/lock-threads/blob/master/CHANGELOG.md) - [Commits](https://github.com/dessant/lock-threads/compare/v2.1.2...v3) --- updated-dependencies: - dependency-name: dessant/lock-threads dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] Co-authored-by: Daniel Gibbs Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/lock.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/lock.yml b/.github/workflows/lock.yml index 733fe595d..668b8a581 100644 --- a/.github/workflows/lock.yml +++ b/.github/workflows/lock.yml @@ -8,7 +8,7 @@ jobs: lock: runs-on: ubuntu-latest steps: - - uses: dessant/lock-threads@v2.1.2 + - uses: dessant/lock-threads@v3 with: github-token: ${{ secrets.GITHUB_TOKEN }} issue-lock-comment: > From be04256904c6b78eece7b72987520e36b3ecab26 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 9 Feb 2022 23:42:50 +0000 Subject: [PATCH 140/164] build(deps): bump webfactory/ssh-agent from 0.5.3 to 0.5.4 (#3781) Bumps [webfactory/ssh-agent](https://github.com/webfactory/ssh-agent) from 0.5.3 to 0.5.4. - [Release notes](https://github.com/webfactory/ssh-agent/releases) - [Changelog](https://github.com/webfactory/ssh-agent/blob/master/CHANGELOG.md) - [Commits](https://github.com/webfactory/ssh-agent/compare/v0.5.3...v0.5.4) --- updated-dependencies: - dependency-name: webfactory/ssh-agent dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/git-sync.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/git-sync.yml b/.github/workflows/git-sync.yml index d666af6db..fb0b3c477 100644 --- a/.github/workflows/git-sync.yml +++ b/.github/workflows/git-sync.yml @@ -10,8 +10,8 @@ jobs: GitHub-to-Bitbucket: runs-on: ubuntu-latest steps: - - name: webfactory/ssh-agent@v0.5.3 - uses: webfactory/ssh-agent@v0.5.3 + - name: webfactory/ssh-agent@v0.5.4 + uses: webfactory/ssh-agent@v0.5.4 with: ssh-private-key: ${{ secrets.BITBUCKET_SECRET }} From eaa2ee9d2c263c65ee6b1c51e31ce9a90c2fc4a9 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 31 Mar 2022 21:21:58 +0100 Subject: [PATCH 141/164] build(deps): bump dessant/lock-threads from 2.1.2 to 3 (#3785) Bumps [dessant/lock-threads](https://github.com/dessant/lock-threads) from 2.1.2 to 3. - [Release notes](https://github.com/dessant/lock-threads/releases) - [Changelog](https://github.com/dessant/lock-threads/blob/master/CHANGELOG.md) - [Commits](https://github.com/dessant/lock-threads/compare/v2.1.2...v3) --- updated-dependencies: - dependency-name: dessant/lock-threads dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/lock.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/lock.yml b/.github/workflows/lock.yml index 733fe595d..668b8a581 100644 --- a/.github/workflows/lock.yml +++ b/.github/workflows/lock.yml @@ -8,7 +8,7 @@ jobs: lock: runs-on: ubuntu-latest steps: - - uses: dessant/lock-threads@v2.1.2 + - uses: dessant/lock-threads@v3 with: github-token: ${{ secrets.GITHUB_TOKEN }} issue-lock-comment: > From e9fe47395f56b0416e09dac104fb2a8f8a6dd2d8 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 31 Mar 2022 21:22:10 +0100 Subject: [PATCH 142/164] build(deps): bump release-drafter/release-drafter from 5.15.0 to 5.19.0 (#3810) Bumps [release-drafter/release-drafter](https://github.com/release-drafter/release-drafter) from 5.15.0 to 5.19.0. - [Release notes](https://github.com/release-drafter/release-drafter/releases) - [Commits](https://github.com/release-drafter/release-drafter/compare/v5.15.0...v5.19.0) --- updated-dependencies: - dependency-name: release-drafter/release-drafter dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/create-release.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/create-release.yml b/.github/workflows/create-release.yml index 04b6adb87..c53f39d3d 100644 --- a/.github/workflows/create-release.yml +++ b/.github/workflows/create-release.yml @@ -10,7 +10,7 @@ jobs: runs-on: ubuntu-latest steps: # Drafts your next Release notes as Pull Requests are merged into "master" - - uses: release-drafter/release-drafter@v5.15.0 + - uses: release-drafter/release-drafter@v5.19.0 with: config-name: release-drafter.yml env: From a8061d7bf03860f224031c0cb187f556226013a3 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 31 Mar 2022 21:22:33 +0100 Subject: [PATCH 143/164] build(deps): bump actions/checkout from 2 to 3 (#3803) Bumps [actions/checkout](https://github.com/actions/checkout) from 2 to 3. - [Release notes](https://github.com/actions/checkout/releases) - [Changelog](https://github.com/actions/checkout/blob/main/CHANGELOG.md) - [Commits](https://github.com/actions/checkout/compare/v2...v3) --- updated-dependencies: - dependency-name: actions/checkout dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/version-check.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/version-check.yml b/.github/workflows/version-check.yml index 903a79268..2bf80f491 100644 --- a/.github/workflows/version-check.yml +++ b/.github/workflows/version-check.yml @@ -16,7 +16,7 @@ jobs: # Steps represent a sequence of tasks that will be executed as part of the job steps: # Checks-out your repository under $GITHUB_WORKSPACE, so your job can access it - - uses: actions/checkout@v2 + - uses: actions/checkout@v3 # Runs a single command using the runners shell - name: compare versions From 8253bdf4768e4996ca8db1111c2f7e7f6c986b12 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Thu, 31 Mar 2022 21:29:23 +0100 Subject: [PATCH 144/164] Update config for lock v3 --- .github/workflows/lock.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/lock.yml b/.github/workflows/lock.yml index 668b8a581..0ec82b1f6 100644 --- a/.github/workflows/lock.yml +++ b/.github/workflows/lock.yml @@ -11,11 +11,11 @@ jobs: - uses: dessant/lock-threads@v3 with: github-token: ${{ secrets.GITHUB_TOKEN }} - issue-lock-comment: > + issue-comment: > This issue has been automatically locked since there has not been any recent activity after it was closed. Please open a new issue for related bugs. - pr-lock-comment: > + pr-comment: > This pull request has been automatically locked since there has not been any recent activity after it was closed. Please open a new issue for related bugs. From 522bb2d3c3bab786bee3e52a14c30df423ead471 Mon Sep 17 00:00:00 2001 From: Christian Date: Mon, 4 Apr 2022 21:56:06 +0200 Subject: [PATCH 145/164] fix(av): fix port for config info (#3826) --- lgsm/functions/info_game.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lgsm/functions/info_game.sh b/lgsm/functions/info_game.sh index 754f6183d..8c1652023 100644 --- a/lgsm/functions/info_game.sh +++ b/lgsm/functions/info_game.sh @@ -125,7 +125,7 @@ fn_info_game_av() { maxplayers=${maxplayers:-"NOT SET"} servername=${servername:-"NOT SET"} serverpassword=${serverpassword:-"NOT SET"} - port=${zero} + port=${port:-"0"} queryport=${queryport:-"0"} steamqueryport=${steamqueryport:-"0"} steammasterport=${steammasterport:-"0"} From 50d485ff0542e0bff75c34b70409cb1fa8a4b792 Mon Sep 17 00:00:00 2001 From: Christian Date: Mon, 4 Apr 2022 21:56:25 +0200 Subject: [PATCH 146/164] fix(squad): fix variable for queryport (#3824) --- lgsm/functions/info_game.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lgsm/functions/info_game.sh b/lgsm/functions/info_game.sh index 8c1652023..bb750559f 100644 --- a/lgsm/functions/info_game.sh +++ b/lgsm/functions/info_game.sh @@ -1742,7 +1742,7 @@ fn_info_game_squad(){ # Parameters port=${port:-"0"} - queryport=${port:-"0"} + queryport=${queryport:-"0"} } fn_info_game_st(){ From 95e9498330bc2f75d421545630f41671529b65b9 Mon Sep 17 00:00:00 2001 From: Christian Date: Mon, 4 Apr 2022 21:59:01 +0200 Subject: [PATCH 147/164] fix(deps): change openjdk to version 17 for debian 11 (#3825) --- lgsm/data/debian-11.csv | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lgsm/data/debian-11.csv b/lgsm/data/debian-11.csv index 6e2b3e99f..e0021c345 100644 --- a/lgsm/data/debian-11.csv +++ b/lgsm/data/debian-11.csv @@ -78,7 +78,7 @@ pmc,openjdk-17-jre pstbs,libgconf-2-4 pvkii pvr,libc++1 -pz,openjdk-16-jre,rng-tools +pz,openjdk-17-jre,rng-tools q2 q3 ql @@ -87,7 +87,7 @@ ricochet ro rtcw rust,lib32z1 -rw,openjdk-16-jre +rw,openjdk-17-jre samp sb sbots From 3fb3ccc8243e66ffbd343396a37d1c860396cd25 Mon Sep 17 00:00:00 2001 From: Christian Date: Mon, 4 Apr 2022 21:59:15 +0200 Subject: [PATCH 148/164] fix(ns2): remove login (#3759) --- lgsm/config-default/config-lgsm/ns2server/_default.cfg | 4 ---- 1 file changed, 4 deletions(-) diff --git a/lgsm/config-default/config-lgsm/ns2server/_default.cfg b/lgsm/config-default/config-lgsm/ns2server/_default.cfg index 2d7a64cbe..e071f539e 100644 --- a/lgsm/config-default/config-lgsm/ns2server/_default.cfg +++ b/lgsm/config-default/config-lgsm/ns2server/_default.cfg @@ -8,10 +8,6 @@ #### Game Server Settings #### -## SteamCMD Login | https://docs.linuxgsm.com/steamcmd#steamcmd-login -steamuser="username" -steampass='password' - ## Predefined Parameters | https://docs.linuxgsm.com/configuration/start-parameters ip="0.0.0.0" port="27015" From 00cdee22decc42bb9bcc4fabdd761904a8012931 Mon Sep 17 00:00:00 2001 From: Jay Oster Date: Mon, 4 Apr 2022 12:59:55 -0700 Subject: [PATCH 149/164] fix(sdtdserver): monitor command fails (#3764) * Fix monitor command for SDTD - Closes #3619 - Related to #3701 * Fix semantic pull request --- lgsm/config-default/config-lgsm/sdtdserver/_default.cfg | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lgsm/config-default/config-lgsm/sdtdserver/_default.cfg b/lgsm/config-default/config-lgsm/sdtdserver/_default.cfg index bd922057b..090309696 100644 --- a/lgsm/config-default/config-lgsm/sdtdserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/sdtdserver/_default.cfg @@ -140,7 +140,7 @@ stopmode="8" # 3: gamedig # 4: gsquery # 5: tcp -querymode="2" +querymode="5" querytype="protocol-valve" ## Console type From 4844b695dce5a23ab4f8de287b838f8a2acfadc8 Mon Sep 17 00:00:00 2001 From: Christian Date: Mon, 4 Apr 2022 22:00:16 +0200 Subject: [PATCH 150/164] fix(ns2): change mods commandline (#3760) --- lgsm/config-default/config-lgsm/ns2server/_default.cfg | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lgsm/config-default/config-lgsm/ns2server/_default.cfg b/lgsm/config-default/config-lgsm/ns2server/_default.cfg index e071f539e..83dfd991b 100644 --- a/lgsm/config-default/config-lgsm/ns2server/_default.cfg +++ b/lgsm/config-default/config-lgsm/ns2server/_default.cfg @@ -24,7 +24,7 @@ serverpassword="" # -password \"${serverpassword}\" ## Server Parameters | https://docs.linuxgsm.com/configuration/start-parameters#additional-parameters -startparameters="-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}\"" +startparameters="-name \"${servername}\" -port ${port} -webadmin -webdomain ${ip} -webuser ${webadminuser} -webpassword \"${webadminpass}\" -webport ${webadminport} -map ${defaultmap} -limit ${maxplayers} -config_path \"${servercfgdir}\" -logdir \"${gamelogdir}\" -modstorage \"${modstoragedir}\" -mods2 \"${mods}\"" #### LinuxGSM Settings #### From 1d6d94d7a3a8fcbe2d346e4f9d1d91738f64b59c Mon Sep 17 00:00:00 2001 From: Jens Date: Mon, 11 Apr 2022 00:36:07 +0200 Subject: [PATCH 151/164] feat(mods): csgo mods - scraping latest versions for GOKZ and MovementAPI (#3841) --- lgsm/functions/mods_list.sh | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/lgsm/functions/mods_list.sh b/lgsm/functions/mods_list.sh index 7afeffcfb..ed9be2121 100755 --- a/lgsm/functions/mods_list.sh +++ b/lgsm/functions/mods_list.sh @@ -82,6 +82,13 @@ csgopracticelatestlink=$(echo -e "${csgopracticelatest}" | jq -r '.browser_downl 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') +gokzlatestversion=$(curl --connect-timeout 10 -s https://api.github.com/repos/KZGlobalTeam/gokz/releases/latest | grep "tag_name" | cut -d : -f 2,3 | sed -E 's/.*"([^"]+)".*/\1/') +gokzlatestfile="GOKZ-v${gokzlatestversion}.zip" +gokzlatestlink="https://github.com/KZGlobalTeam/gokz/releases/download/${gokzlatestversion}/${gokzlatestfile}" +movementapilatestversion=$(curl --connect-timeout 10 -s https://api.github.com/repos/danzayau/MovementAPI/releases/latest | grep "tag_name" | cut -d : -f 2,3 | sed -E 's/.*"([^"]+)".*/\1/') +movementapilatestfile="MovementAPI-v${movementapilatestversion}.zip" +movementapilatestlink="https://github.com/danzayau/MovementAPI/releases/download/${movementapilatestversion}/${movementapilatestfile}" + # Oxide 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') @@ -140,13 +147,13 @@ mod_info_steamworks=( MOD "steamworks" "SteamWorks" "${steamworksurl}" "${steamw 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_gokz=( MOD "gokz" "GOKZ" "${gokzlatestlink}" "${gokzlatestfile}" "0" "LowercaseOff" "${systemdir}" "cfg;addons/sourcemod/configs;" "ENGINES" "Counter-Strike: Global Offensive;" "NOTGAMES" "https://github.com/KZGlobalTeam/gokz" "GOKZ ${gokzlatestversion} - 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-${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_prac=( MOD "prac" "csgo practice mode" "${csgopracticelatestlink}" "${csgopracticelatestfile}" "0" "LowercaseOff" "${systemdir}" "cfg;addons/sourcemod/configs;" "ENGINES" "Counter-Strike: Global Offensive;" "NOTGAMES" "https://github.com/splewis/csgo-practice-mode" "Practice Mode is a sourcemod plugin for helping players/teams run practices." ) 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" ) mod_info_dhook=( MOD "dhook" "dhook" "https://forums.alliedmods.net/attachment.php?attachmentid=190123&d=1625050030" "dhooks-2.2.0d17.zip" "0" "LowercaseOff" "${systemdir}" "cfg;addons/sourcemod/configs;" "ENGINES" "Counter-Strike: Global Offensive;" "NOTGAMES" "https://forums.alliedmods.net/showpost.php?p=2588686&postcount=589" "DHooks 2.2.0 - Required for GOKZ" ) -mod_info_movement=( MOD "movementapi" "movementapi" "https://github.com/danzayau/MovementAPI/releases/download/2.1.0/MovementAPI-v2.1.0.zip" "MovementAPI-v2.1.0.zip" "0" "LowercaseOff" "${systemdir}" "cfg;addons/sourcemod/configs;" "ENGINES" "Counter-Strike: Global Offensive;" "NOTGAMES" "https://github.com/danzayau/MovementAPI" "Movement API 2.1.0 - Required for GOKZ" ) +mod_info_movement=( MOD "movementapi" "movementapi" "${movementapilatestlink}" "${movementapilatestfile}" "0" "LowercaseOff" "${systemdir}" "cfg;addons/sourcemod/configs;" "ENGINES" "Counter-Strike: Global Offensive;" "NOTGAMES" "https://github.com/danzayau/MovementAPI" "Movement API ${movementapilatestversion} - Required for GOKZ" ) mod_info_cleaner=( MOD "cleaner" "cleaner" "https://github.com/e54385991/console-cleaner/archive/refs/heads/master.zip" "console-cleaner.zip" "0" "LowercaseOff" "${systemdir}" "cfg;addons/sourcemod/configs;" "ENGINES" "Counter-Strike: Global Offensive;" "NOTGAMES" "https://github.com/e54385991/console-cleaner" "Console Cleaner - Optional for GOKZ" ) # Garry's Mod Addons From 60ae41da622c342440978498078d9390f50678de Mon Sep 17 00:00:00 2001 From: Chris Date: Tue, 26 Apr 2022 17:50:19 -0500 Subject: [PATCH 152/164] fix (arma3server): prevent multiple loading mods failing due to accidental line termination (#3845) Fixes loading multiple mods failing due to accidental line termination in the mod string when following the documentation. (Observed on Ubuntu 20.10) --- lgsm/config-default/config-lgsm/arma3server/_default.cfg | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lgsm/config-default/config-lgsm/arma3server/_default.cfg b/lgsm/config-default/config-lgsm/arma3server/_default.cfg index 1cdfe239a..7c4619c17 100644 --- a/lgsm/config-default/config-lgsm/arma3server/_default.cfg +++ b/lgsm/config-default/config-lgsm/arma3server/_default.cfg @@ -32,7 +32,7 @@ servermods="" bepath="" ## Server Parameters | https://docs.linuxgsm.com/configuration/start-parameters#additional-parameters -startparameters="-ip=${ip} -port=${port} -cfg=${networkcfgfullpath} -config=${servercfgfullpath} -mod=${mods} -servermod=${servermods} -bepath=${bepath} -autoinit -loadmissiontomemory" +startparameters="-ip=${ip} -port=${port} -cfg=${networkcfgfullpath} -config=${servercfgfullpath} -mod='${mods}' -servermod=${servermods} -bepath=${bepath} -autoinit -loadmissiontomemory" #### LinuxGSM Settings #### From 0342adaa40d9fb7e1fdfd5e74c210cf83042f7a7 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Tue, 26 Apr 2022 23:51:05 +0100 Subject: [PATCH 153/164] feat(new server): Project Cars 2 (#3842) --- .../config-lgsm/pc2server/_default.cfg | 184 ++++++++++++++++++ lgsm/data/serverlist.csv | 1 + lgsm/functions/info_game.sh | 29 +++ lgsm/functions/info_messages.sh | 13 +- lgsm/functions/install_config.sh | 4 + 5 files changed, 230 insertions(+), 1 deletion(-) create mode 100644 lgsm/config-default/config-lgsm/pc2server/_default.cfg diff --git a/lgsm/config-default/config-lgsm/pc2server/_default.cfg b/lgsm/config-default/config-lgsm/pc2server/_default.cfg new file mode 100644 index 000000000..e43f150fd --- /dev/null +++ b/lgsm/config-default/config-lgsm/pc2server/_default.cfg @@ -0,0 +1,184 @@ +################################## +######## 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 Parameters | https://docs.linuxgsm.com/configuration/start-parameters#additional-parameters +startparameters="--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) + +# 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="" + +# Gotify Alerts | https://docs.linuxgsm.com/alerts/gotify +gotifyalert="off" +gotifytoken="token" +gotifywebhook="webhook" + +# 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". +telegramapi="api.telegram.org" +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="413770" +steamcmdforcewindows="no" +# 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="yes" +consoleinteract="no" + +## Game Server Details +# Do not edit +gamename="Project Cars 2" +engine="madness" +glibc="2.15" + +#### Directories #### +# Edit with care + +## Game Server Directories +systemdir="${serverfiles}" +executabledir="${serverfiles}" +executable="./DedicatedServerCmd.elf" +servercfgdir="${systemdir}" +servercfg="${selfname}.cfg" +servercfgdefault="config_sample/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/data/serverlist.csv b/lgsm/data/serverlist.csv index 7e71a94cc..8f4fde1b2 100644 --- a/lgsm/data/serverlist.csv +++ b/lgsm/data/serverlist.csv @@ -72,6 +72,7 @@ ns2c,ns2cserver,NS2: Combat onset,onsetserver,Onset opfor,opforserver,Opposing Force pc,pcserver,Project Cars +pc2,pc2server,Project Cars 2 pmc,pmcserver,PaperMC pstbs,pstbsserver,Post Scriptum: The Bloody Seventh pvkii,pvkiiserver,Pirates Vikings & Knights II diff --git a/lgsm/functions/info_game.sh b/lgsm/functions/info_game.sh index bb750559f..b2f5b7a24 100644 --- a/lgsm/functions/info_game.sh +++ b/lgsm/functions/info_game.sh @@ -1100,6 +1100,33 @@ fn_info_game_pc(){ fi } +fn_info_game_pc2(){ + # Config + if [ ! -f "${servercfgfullpath}" ]; then + servername="${unavailable}" + serverpassword="${unavailable}" + maxplayers="${zero}" + port="${zero}" + queryport="${zero}" + steamport="${zero}" + else + servername=$(grep "name" "${servercfgfullpath}" | sed -e 's/^[ \t]*//g' -e '/^\//d' -e 's/name//g' | tr -d '=\";,:' | sed -e 's/^[ \t]*//' -e 's/[ \t]*$//') + serverpassword=$(grep "password " "${servercfgfullpath}" | sed -e 's/^[ \t]*//g' -e '/^\//d' -e 's/password//g' | tr -d '=\";,:' | sed -e 's/^[ \t]*//' -e 's/[ \t]*$//') + maxplayers=$(grep "MaxPlayers" "${servercfgfullpath}" | grep -v "//" | tr -cd '[:digit:]') + port=$(grep "hostPort" "${servercfgfullpath}" | grep -v "//" | tr -cd '[:digit:]') + queryport=$(grep "queryPort" "${servercfgfullpath}" | grep -v "//" | tr -cd '[:digit:]') + steamport=$(grep "steamPort" "${servercfgfullpath}" | grep -v "//" | tr -cd '[:digit:]') + + # Not set + servername=${servername:-"NOT SET"} + serverpassword=${serverpassword:-"NOT SET"} + maxplayers=${maxplayers:-"NOT SET"} + port=${port:-"NOT SET"} + queryport=${queryport:-"NOT SET"} + steamport=${steamport:-"NOT SET"} + fi +} + fn_info_game_pstbs(){ # Config if [ ! -f "${servercfgfullpath}" ]; then @@ -2329,6 +2356,8 @@ elif [ "${shortname}" == "onset" ]; then fn_info_game_onset elif [ "${shortname}" == "pc" ]; then fn_info_game_pc +elif [ "${shortname}" == "pc2" ]; then + fn_info_game_pc2 elif [ "${shortname}" == "pstbs" ]; then fn_info_game_pstbs elif [ "${shortname}" == "pvr" ];then diff --git a/lgsm/functions/info_messages.sh b/lgsm/functions/info_messages.sh index a5ad5852e..cf0f686b1 100755 --- a/lgsm/functions/info_messages.sh +++ b/lgsm/functions/info_messages.sh @@ -658,7 +658,7 @@ fn_info_message_ports_edit(){ startparameterslocation="${red}UNKNOWN${default}" # engines/games that require editing in the config file. - local ports_edit_array=( "ac" "arma3" "bo" "bt" "cd" "dst" "eco" "idtech2" "idtech3" "idtech3_ql" "jc2" "jc3" "lwjgl2" "mcb" "mumble" "pc" "pz" "qw" "refractor" "renderware" "rw" "sb" "sdtd" "st" "stn" "ts3" "tw" "terraria" "unreal" "unreal2" "unreal3" "vints" "wurm") + local ports_edit_array=( "ac" "arma3" "bo" "bt" "cd" "dst" "eco" "idtech2" "idtech3" "idtech3_ql" "jc2" "jc3" "lwjgl2" "mcb" "mumble" "pc" "pc2" "pz" "qw" "refractor" "renderware" "rw" "sb" "sdtd" "st" "stn" "ts3" "tw" "terraria" "unreal" "unreal2" "unreal3" "vints" "wurm") for port_edit in "${ports_edit_array[@]}"; do if [ "${shortname}" == "ut3" ]; then startparameterslocation="${servercfgdir}/UTWeb.ini" @@ -1178,6 +1178,15 @@ fn_info_message_pc(){ } | column -s $'\t' -t } +fn_info_message_pc2(){ + { + fn_port "header" + fn_port "Game" port udp + fn_port "Query" queryport udp + fn_port "Steam" steamport udp + } | column -s $'\t' -t +} + fn_info_message_pstbs(){ { fn_port "header" @@ -1708,6 +1717,8 @@ fn_info_message_select_engine(){ fn_info_message_onset elif [ "${shortname}" == "pc" ]; then fn_info_message_pc + elif [ "${shortname}" == "pc2" ]; then + fn_info_message_pc2 elif [ "${shortname}" == "pstbs" ]; then fn_info_message_pstbs elif [ "${shortname}" == "pvr" ]; then diff --git a/lgsm/functions/install_config.sh b/lgsm/functions/install_config.sh index 76de7867f..305a12f93 100755 --- a/lgsm/functions/install_config.sh +++ b/lgsm/functions/install_config.sh @@ -633,6 +633,10 @@ elif [ "${shortname}" == "pc" ]; then fn_default_config_remote fn_set_config_vars fn_list_config_locations +elif [ "${shortname}" == "pc2" ]; then + gamedirname="ProjectCars2" + fn_default_config_local + fn_list_config_locations elif [ "${shortname}" == "q2" ]; then gamedirname="Quake2" array_configs+=( server.cfg ) From 9e77ca2dd15b64437b94fcdeaacba47613c218e2 Mon Sep 17 00:00:00 2001 From: Christian Date: Wed, 27 Apr 2022 00:52:38 +0200 Subject: [PATCH 154/164] refactor: move steammaster check to info_game (#3821) --- lgsm/functions/info_distro.sh | 55 --------------------------------- lgsm/functions/info_game.sh | 57 +++++++++++++++++++++++++++++++++++ 2 files changed, 57 insertions(+), 55 deletions(-) diff --git a/lgsm/functions/info_distro.sh b/lgsm/functions/info_distro.sh index 148e2df48..f747b0d1b 100755 --- a/lgsm/functions/info_distro.sh +++ b/lgsm/functions/info_distro.sh @@ -267,61 +267,6 @@ fi netint=$(${ipcommand} -o addr | grep "${ip}" | awk '{print $2}') netlink=$(${ethtoolcommand} "${netint}" 2>/dev/null| grep Speed | awk '{print $2}') -# External IP address -if [ -z "${extip}" ]; then - 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 - if [[ "${extip}" != *"DOCTYPE"* ]]; then - echo -e "${extip}" > "${tmpdir}/extip.txt" - else - if [ -f "${tmpdir}/extip.txt" ]; then - extip="$(cat "${tmpdir}/extip.txt")" - else - fn_print_error_nl "Unable to get external IP" - fi - fi - else - if [ -f "${tmpdir}/extip.txt" ]; then - extip="$(cat "${tmpdir}/extip.txt")" - else - fn_print_error_nl "Unable to get external IP" - fi - 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 [ -z "${displaymasterserver}" ]; then - if [ "$(command -v jq 2>/dev/null)" ]; then - if [ "${ip}" ]&&[ "${port}" ]; then - if [ "${steammaster}" == "true" ]||[ "${commandname}" == "DEV-QUERY-RAW" ]; then - # Will query server IP addresses first. - for queryip in "${queryips[@]}"; do - masterserver="$(curl --connect-timeout 10 -m 3 -s "https://api.steampowered.com/ISteamApps/GetServersAtAddress/v0001?addr=${queryip}&format=json" | jq --arg port "${port}" --arg queryport "${queryport}" '.response.servers[] | select((.gameport == ($port|tonumber) or (.gameport == ($queryport|tonumber)))) | .addr' | wc -l 2>/dev/null)" - done - # Should that not work it will try the external IP. - if [ "${masterserver}" == "0" ]; then - masterserver="$(curl --connect-timeout 10 -m 3 -s "https://api.steampowered.com/ISteamApps/GetServersAtAddress/v0001?addr=${extip}&format=json" | jq --arg port "${port}" --arg queryport "${queryport}" '.response.servers[] | select((.gameport == ($port|tonumber) or (.gameport == ($queryport|tonumber)))) | .addr' | wc -l 2>/dev/null)" - fi - if [ "${masterserver}" == "0" ]; then - displaymasterserver="false" - else - displaymasterserver="true" - fi - fi - fi - fi -fi # Sets the SteamCMD glibc requirement if the game server requirement is less or not required. if [ "${appid}" ]; then if [ "${glibc}" = "null" ]||[ -z "${glibc}" ]||[ "$(printf '%s\n'${glibc}'\n' "2.14" | sort -V | head -n 1)" != "2.14" ]; then diff --git a/lgsm/functions/info_game.sh b/lgsm/functions/info_game.sh index b2f5b7a24..3b6910802 100644 --- a/lgsm/functions/info_game.sh +++ b/lgsm/functions/info_game.sh @@ -2441,3 +2441,60 @@ elif [ "${engine}" == "source" ]||[ "${engine}" == "goldsrc" ]; then elif [ "${engine}" == "unreal2" ]; then fn_info_game_unreal2 fi + +# External IP address +if [ -z "${extip}" ]; then + 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 + if [[ "${extip}" != *"DOCTYPE"* ]]; then + echo -e "${extip}" > "${tmpdir}/extip.txt" + else + if [ -f "${tmpdir}/extip.txt" ]; then + extip="$(cat "${tmpdir}/extip.txt")" + else + fn_print_error_nl "Unable to get external IP" + fi + fi + else + if [ -f "${tmpdir}/extip.txt" ]; then + extip="$(cat "${tmpdir}/extip.txt")" + else + fn_print_error_nl "Unable to get external IP" + fi + 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. +# Checked after config init, as the queryport is needed +if [ -z "${displaymasterserver}" ]; then + if [ "$(command -v jq 2>/dev/null)" ]; then + if [ "${ip}" ]&&[ "${port}" ]; then + if [ "${steammaster}" == "true" ]||[ "${commandname}" == "DEV-QUERY-RAW" ]; then + # Will query server IP addresses first. + for queryip in "${queryips[@]}"; do + masterserver="$(curl --connect-timeout 10 -m 3 -s "https://api.steampowered.com/ISteamApps/GetServersAtAddress/v0001?addr=${queryip}&format=json" | jq --arg port "${port}" --arg queryport "${queryport}" '.response.servers[] | select((.gameport == ($port|tonumber) or (.gameport == ($queryport|tonumber)))) | .addr' | wc -l 2>/dev/null)" + done + # Should that not work it will try the external IP. + if [ "${masterserver}" == "0" ]; then + masterserver="$(curl --connect-timeout 10 -m 3 -s "https://api.steampowered.com/ISteamApps/GetServersAtAddress/v0001?addr=${extip}&format=json" | jq --arg port "${port}" --arg queryport "${queryport}" '.response.servers[] | select((.gameport == ($port|tonumber) or (.gameport == ($queryport|tonumber)))) | .addr' | wc -l 2>/dev/null)" + fi + if [ "${masterserver}" == "0" ]; then + displaymasterserver="false" + else + displaymasterserver="true" + fi + fi + fi + fi +fi From ed12e6c8a041a57509e2d71f33a3c1de50cd5cbb Mon Sep 17 00:00:00 2001 From: Jonah Hirsch Date: Sat, 14 May 2022 16:20:34 -0700 Subject: [PATCH 155/164] fix: tfcserver/_default.cfg Ip flag (#3859) `_ip` => `+ip` --- lgsm/config-default/config-lgsm/tfcserver/_default.cfg | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lgsm/config-default/config-lgsm/tfcserver/_default.cfg b/lgsm/config-default/config-lgsm/tfcserver/_default.cfg index b22c10a7c..827b32736 100644 --- a/lgsm/config-default/config-lgsm/tfcserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/tfcserver/_default.cfg @@ -16,7 +16,7 @@ defaultmap="dustbowl" maxplayers="16" ## Server Parameters | https://docs.linuxgsm.com/configuration/start-parameters#additional-parameters -startparameters="-game tfc -strictportbind _ip ${ip} -port ${port} +clientport ${clientport} +map ${defaultmap} +servercfgfile ${servercfg} -maxplayers ${maxplayers}" +startparameters="-game tfc -strictportbind +ip ${ip} -port ${port} +clientport ${clientport} +map ${defaultmap} +servercfgfile ${servercfg} -maxplayers ${maxplayers}" #### LinuxGSM Settings #### From 20eb96e8377863d122caebbd866eed02bb7b12ab Mon Sep 17 00:00:00 2001 From: nathannaveen <42319948+nathannaveen@users.noreply.github.com> Date: Sat, 14 May 2022 19:21:46 -0400 Subject: [PATCH 156/164] chore: Set permissions for GitHub actions (#3849) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Restrict the GitHub token permissions only to the required ones; this way, even if the attackers will succeed in compromising your workflow, they won’t be able to do much. - Included permissions for the action. https://github.com/ossf/scorecard/blob/main/docs/checks.md#token-permissions https://docs.github.com/en/actions/using-workflows/workflow-syntax-for-github-actions#permissions https://docs.github.com/en/actions/using-jobs/assigning-permissions-to-jobs [Keeping your GitHub Actions and workflows secure Part 1: Preventing pwn requests](https://securitylab.github.com/research/github-actions-preventing-pwn-requests/) Signed-off-by: nathannaveen <42319948+nathannaveen@users.noreply.github.com> --- .github/workflows/create-release.yml | 6 ++++++ .github/workflows/labeler.yml | 6 ++++++ .github/workflows/lock.yml | 6 ++++++ .github/workflows/version-check.yml | 3 +++ 4 files changed, 21 insertions(+) diff --git a/.github/workflows/create-release.yml b/.github/workflows/create-release.yml index c53f39d3d..fcc7fc837 100644 --- a/.github/workflows/create-release.yml +++ b/.github/workflows/create-release.yml @@ -5,8 +5,14 @@ on: # branches to consider in the event; optional, defaults to all branches: - master +permissions: + contents: read + jobs: update_release_draft: + permissions: + contents: write # for release-drafter/release-drafter to create a github release + pull-requests: write # for release-drafter/release-drafter to add label to PR runs-on: ubuntu-latest steps: # Drafts your next Release notes as Pull Requests are merged into "master" diff --git a/.github/workflows/labeler.yml b/.github/workflows/labeler.yml index 7b8e2668a..c5ea01d0a 100644 --- a/.github/workflows/labeler.yml +++ b/.github/workflows/labeler.yml @@ -3,8 +3,14 @@ on: issues: types: [opened, edited] +permissions: + contents: read + jobs: triage: + permissions: + contents: read # for github/issue-labeler to get repo contents + issues: write # for github/issue-labeler to create or remove labels runs-on: ubuntu-latest steps: - uses: github/issue-labeler@v2.4 diff --git a/.github/workflows/lock.yml b/.github/workflows/lock.yml index 0ec82b1f6..7c17c56bf 100644 --- a/.github/workflows/lock.yml +++ b/.github/workflows/lock.yml @@ -4,8 +4,14 @@ on: schedule: - cron: '0 0 * * *' +permissions: + contents: read + jobs: lock: + permissions: + issues: write # for dessant/lock-threads to lock issues + pull-requests: write # for dessant/lock-threads to lock PRs runs-on: ubuntu-latest steps: - uses: dessant/lock-threads@v3 diff --git a/.github/workflows/version-check.yml b/.github/workflows/version-check.yml index 2bf80f491..4c06d86d7 100644 --- a/.github/workflows/version-check.yml +++ b/.github/workflows/version-check.yml @@ -7,6 +7,9 @@ name: Version Check on: push # A workflow run is made up of one or more jobs that can run sequentially or in parallel +permissions: + contents: read + jobs: # This workflow contains a single job called "build" Version-Check: From d86a7095e517f35e7a199169c960166ea45f9c69 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sun, 15 May 2022 00:24:01 +0100 Subject: [PATCH 157/164] build(deps): bump release-drafter/release-drafter from 5.19.0 to 5.20.0 (#3854) Bumps [release-drafter/release-drafter](https://github.com/release-drafter/release-drafter) from 5.19.0 to 5.20.0. - [Release notes](https://github.com/release-drafter/release-drafter/releases) - [Commits](https://github.com/release-drafter/release-drafter/compare/v5.19.0...v5.20.0) --- updated-dependencies: - dependency-name: release-drafter/release-drafter dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/create-release.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/create-release.yml b/.github/workflows/create-release.yml index c53f39d3d..fe5998378 100644 --- a/.github/workflows/create-release.yml +++ b/.github/workflows/create-release.yml @@ -10,7 +10,7 @@ jobs: runs-on: ubuntu-latest steps: # Drafts your next Release notes as Pull Requests are merged into "master" - - uses: release-drafter/release-drafter@v5.19.0 + - uses: release-drafter/release-drafter@v5.20.0 with: config-name: release-drafter.yml env: From f78d707f2aaf95e64c91a0302267d1287d900395 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 26 May 2022 21:40:59 +0100 Subject: [PATCH 158/164] build(deps): bump github/issue-labeler from 2.4 to 2.5 (#3862) Bumps [github/issue-labeler](https://github.com/github/issue-labeler) from 2.4 to 2.5. - [Release notes](https://github.com/github/issue-labeler/releases) - [Commits](https://github.com/github/issue-labeler/compare/v2.4...v2.5) --- updated-dependencies: - dependency-name: github/issue-labeler dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/labeler.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/labeler.yml b/.github/workflows/labeler.yml index 7b8e2668a..a1fc859a5 100644 --- a/.github/workflows/labeler.yml +++ b/.github/workflows/labeler.yml @@ -7,7 +7,7 @@ jobs: triage: runs-on: ubuntu-latest steps: - - uses: github/issue-labeler@v2.4 + - uses: github/issue-labeler@v2.5 with: repo-token: "${{ secrets.GITHUB_TOKEN }}" configuration-path: .github/labeler.yml From 37ea2c99bc71817555457ad20aa048c54dcb6f7c Mon Sep 17 00:00:00 2001 From: Christian Date: Wed, 1 Jun 2022 00:12:34 +0200 Subject: [PATCH 159/164] fix(mcb): fix renaming whitelist to allowlist (#3883) --- 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 f4054ae00..ad22a291d 100644 --- a/lgsm/functions/update_minecraft_bedrock.sh +++ b/lgsm/functions/update_minecraft_bedrock.sh @@ -17,7 +17,7 @@ fn_update_minecraft_dl(){ 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}" + unzip -oq "${tmpdir}/bedrock_server.${remotebuild}.zip" -x "permissions.json" "server.properties" "allowlist.json" -d "${serverfiles}" fi local exitcode=$? if [ "${exitcode}" == "0" ]; then From 14ca894cdcfe01dbae8c7449d7e4660dc345ce76 Mon Sep 17 00:00:00 2001 From: Christian Date: Wed, 1 Jun 2022 00:13:10 +0200 Subject: [PATCH 160/164] feat(mcb): allow to set hard a version for the server (#3881) --- lgsm/config-default/config-lgsm/mcbserver/_default.cfg | 3 +++ lgsm/functions/update_minecraft_bedrock.sh | 10 +++++++--- 2 files changed, 10 insertions(+), 3 deletions(-) diff --git a/lgsm/config-default/config-lgsm/mcbserver/_default.cfg b/lgsm/config-default/config-lgsm/mcbserver/_default.cfg index 8ccd2e658..bc64ee883 100644 --- a/lgsm/config-default/config-lgsm/mcbserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/mcbserver/_default.cfg @@ -11,6 +11,9 @@ ## Server Parameters | https://docs.linuxgsm.com/configuration/start-parameters#additional-parameters startparameters="" +# Version (latest|1.18.33.02) +mcversion="latest" + #### LinuxGSM Settings #### ## LinuxGSM Stats diff --git a/lgsm/functions/update_minecraft_bedrock.sh b/lgsm/functions/update_minecraft_bedrock.sh index ad22a291d..f724679a9 100644 --- a/lgsm/functions/update_minecraft_bedrock.sh +++ b/lgsm/functions/update_minecraft_bedrock.sh @@ -11,8 +11,7 @@ functionselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" randnum=$((1 + RANDOM % 5000)) fn_update_minecraft_dl(){ - latestmcbuildurl=$(curl -H "Accept-Encoding: identity" -H "Accept-Language: en" -Ls -A "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.${randnum}.212 Safari/537.36" "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 "https://minecraft.azureedge.net/bin-linux/bedrock-server-${remotebuild}.zip" "" "" "" "${tmpdir}" "bedrock_server.${remotebuild}.zip" echo -e "Extracting to ${serverfiles}...\c" if [ "${firstcommandname}" == "INSTALL" ]; then unzip -oq "${tmpdir}/bedrock_server.${remotebuild}.zip" -x "server.properties" -d "${serverfiles}" @@ -82,7 +81,12 @@ fn_update_minecraft_localbuild(){ fn_update_minecraft_remotebuild(){ # Gets remote build info. - remotebuild=$(curl -H "Accept-Encoding: identity" -H "Accept-Language: en" -Ls -A "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.${randnum}.212 Safari/537.36" "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 [ "${mcversion}" == "latest" ]; then + remotebuild=$(curl -H "Accept-Encoding: identity" -H "Accept-Language: en" -Ls -A "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.${randnum}.212 Safari/537.36" "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]") + else + remotebuild="${mcversion}" + fi + if [ "${firstcommandname}" != "INSTALL" ]; then fn_print_dots "Checking remote build: ${remotelocation}" # Checks if remotebuild variable has been set. From 6816d396f82b24da5dbfacefbe5b5540dba73497 Mon Sep 17 00:00:00 2001 From: Christian Date: Wed, 1 Jun 2022 00:13:27 +0200 Subject: [PATCH 161/164] fix(ark): rework parsing of config (#3878) --- lgsm/functions/info_game.sh | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/lgsm/functions/info_game.sh b/lgsm/functions/info_game.sh index 3b6910802..75cef3c69 100644 --- a/lgsm/functions/info_game.sh +++ b/lgsm/functions/info_game.sh @@ -46,9 +46,9 @@ fn_info_game_ark(){ 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]*$//') + servername=$(sed -nr 's/^SessionName=(.*)/\1/p' "${servercfgfullpath}") + adminpassword=$(sed -nr 's/^ServerAdminPassword=(.*)/\1/p' "${servercfgfullpath}") + serverpassword=$(sed -nr 's/^ServerPassword=(.*)/\1/p' "${servercfgfullpath}") # Not set servername=${servername:-"NOT SET"} From c68394ff626b33393c1402a3b1cd6e27629b1f0c Mon Sep 17 00:00:00 2001 From: Christian Date: Thu, 2 Jun 2022 22:58:07 +0200 Subject: [PATCH 162/164] feat(newserver): Arma Reforger (#3871) * feat(newserver): Arma Reforger * feat(armarserver): Add server profile name * feat(armarserver): Add fix for create profile directory * feat(armar): limit fps for the server to fix the performance * feat(armar): add dependencys Co-authored-by: FliesWithWind * feat(armar): move queryport to config parser and add adminpass * feat(armar): fix dependencys * change ss command for armar * add battleeyeport * bug * tcp Co-authored-by: Marcin Jakubowski Co-authored-by: FliesWithWind Co-authored-by: Daniel Gibbs --- .../config-lgsm/armarserver/_default.cfg | 187 ++++++++++++++++++ lgsm/data/almalinux-8.csv | 1 + lgsm/data/centos-7.csv | 1 + lgsm/data/centos-8.csv | 1 + lgsm/data/debian-10.csv | 1 + lgsm/data/debian-11.csv | 1 + lgsm/data/debian-9.csv | 1 + lgsm/data/rhel-7.csv | 1 + lgsm/data/rhel-8.csv | 1 + lgsm/data/rocky-8.csv | 1 + lgsm/data/serverlist.csv | 1 + lgsm/data/ubuntu-18.04.csv | 1 + lgsm/data/ubuntu-20.04.csv | 1 + lgsm/data/ubuntu-21.04.csv | 1 + lgsm/data/ubuntu-21.10.csv | 1 + lgsm/data/ubuntu-22.04.csv | 1 + lgsm/functions/core_functions.sh | 5 + lgsm/functions/fix.sh | 2 + lgsm/functions/fix_armar.sh | 17 ++ lgsm/functions/info_game.sh | 29 +++ lgsm/functions/info_messages.sh | 17 +- lgsm/functions/install_config.sh | 8 + 22 files changed, 278 insertions(+), 2 deletions(-) create mode 100644 lgsm/config-default/config-lgsm/armarserver/_default.cfg create mode 100755 lgsm/functions/fix_armar.sh diff --git a/lgsm/config-default/config-lgsm/armarserver/_default.cfg b/lgsm/config-default/config-lgsm/armarserver/_default.cfg new file mode 100644 index 000000000..9e2f88d7c --- /dev/null +++ b/lgsm/config-default/config-lgsm/armarserver/_default.cfg @@ -0,0 +1,187 @@ +################################## +######## 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 #### + +# https://community.bistudio.com/wiki/Arma_Reforger:Server_Hosting +# MaxFPS to limit the used Server resouces +maxfps="60" + +# Profile Name +serverprofile="server" +serverprofilefullpath="${serverfiles}/profiles/${serverprofile}" + +## Server Parameters | https://docs.linuxgsm.com/configuration/start-parameters#additional-parameters +startparameters="-config ${servercfgfullpath} -profile ${serverprofilefullpath} -maxFPS ${maxfps}" + +#### 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="" + +# Gotify Alerts | https://docs.linuxgsm.com/alerts/gotify +gotifyalert="off" +gotifytoken="token" +gotifywebhook="webhook" + +# 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". +telegramapi="api.telegram.org" +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="5" + +## 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="1874900" +steamcmdforcewindows="no" +# 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="yes" +consoleinteract="no" + +## Game Server Details +# Do not edit +gamename="Arma Reforger" +engine="enfusion" +glibc="2.27" + +#### Directories #### +# Edit with care + +## Game Server Directories +systemdir="${serverfiles}" +executabledir="${serverfiles}" +executable="./ArmaReforgerServer" +servercfgdir="${systemdir}" +servercfg="${selfname}_config.json" +servercfgdefault="server.json" +servercfgfullpath="${servercfgdir}/${servercfg}" + +## Backup Directory +backupdir="${lgsmdir}/backup" + +## Logging Directories +logdir="${rootdir}/log" +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/almalinux-8.csv b/lgsm/data/almalinux-8.csv index 808267bb0..067b58378 100644 --- a/lgsm/data/almalinux-8.csv +++ b/lgsm/data/almalinux-8.csv @@ -5,6 +5,7 @@ ahl ahl2 ark arma3 +armar,libcurl,openssl-libs av bb bb2,libcurl.i686 diff --git a/lgsm/data/centos-7.csv b/lgsm/data/centos-7.csv index 9f989f42a..e8dc0a885 100644 --- a/lgsm/data/centos-7.csv +++ b/lgsm/data/centos-7.csv @@ -5,6 +5,7 @@ ahl ahl2 ark arma3 +armar,libcurl,openssl11-libs av bb bb2,libcurl.i686 diff --git a/lgsm/data/centos-8.csv b/lgsm/data/centos-8.csv index 79c45b8db..116d83bea 100644 --- a/lgsm/data/centos-8.csv +++ b/lgsm/data/centos-8.csv @@ -5,6 +5,7 @@ ahl ahl2 ark arma3 +armar,libcurl,openssl-libs av bb bb2,libcurl.i686 diff --git a/lgsm/data/debian-10.csv b/lgsm/data/debian-10.csv index 94f356412..30ca2df10 100644 --- a/lgsm/data/debian-10.csv +++ b/lgsm/data/debian-10.csv @@ -5,6 +5,7 @@ ahl ahl2 ark arma3 +armar,libcurl4,libssl1.1 av bb bb2,libcurl4-gnutls-dev:i386 diff --git a/lgsm/data/debian-11.csv b/lgsm/data/debian-11.csv index e0021c345..f96d48862 100644 --- a/lgsm/data/debian-11.csv +++ b/lgsm/data/debian-11.csv @@ -5,6 +5,7 @@ ahl ahl2 ark arma3 +armar,libcurl4,libssl1.1 av bb bb2,libcurl4-gnutls-dev:i386 diff --git a/lgsm/data/debian-9.csv b/lgsm/data/debian-9.csv index 9cb339c8e..fe55eb260 100644 --- a/lgsm/data/debian-9.csv +++ b/lgsm/data/debian-9.csv @@ -5,6 +5,7 @@ ahl ahl2 ark arma3 +armar,libcurl4,libssl1.1 av bb bb2,libcurl4-gnutls-dev:i386 diff --git a/lgsm/data/rhel-7.csv b/lgsm/data/rhel-7.csv index a7b3254ec..d4d3fbd30 100644 --- a/lgsm/data/rhel-7.csv +++ b/lgsm/data/rhel-7.csv @@ -5,6 +5,7 @@ ahl ahl2 ark arma3 +armar,libcurl,openssl11-libs av bb bb2,libcurl.i686 diff --git a/lgsm/data/rhel-8.csv b/lgsm/data/rhel-8.csv index a7b3254ec..5e7b622e9 100644 --- a/lgsm/data/rhel-8.csv +++ b/lgsm/data/rhel-8.csv @@ -5,6 +5,7 @@ ahl ahl2 ark arma3 +armar,libcurl,openssl-libs av bb bb2,libcurl.i686 diff --git a/lgsm/data/rocky-8.csv b/lgsm/data/rocky-8.csv index 808267bb0..067b58378 100644 --- a/lgsm/data/rocky-8.csv +++ b/lgsm/data/rocky-8.csv @@ -5,6 +5,7 @@ ahl ahl2 ark arma3 +armar,libcurl,openssl-libs av bb bb2,libcurl.i686 diff --git a/lgsm/data/serverlist.csv b/lgsm/data/serverlist.csv index 8f4fde1b2..f5463cd84 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 +armar,armarserver,Arma Reforger av,avserver,Avorion bb,bbserver,BrainBread bb2,bb2server,BrainBread 2 diff --git a/lgsm/data/ubuntu-18.04.csv b/lgsm/data/ubuntu-18.04.csv index 94f356412..30ca2df10 100644 --- a/lgsm/data/ubuntu-18.04.csv +++ b/lgsm/data/ubuntu-18.04.csv @@ -5,6 +5,7 @@ ahl ahl2 ark arma3 +armar,libcurl4,libssl1.1 av bb bb2,libcurl4-gnutls-dev:i386 diff --git a/lgsm/data/ubuntu-20.04.csv b/lgsm/data/ubuntu-20.04.csv index bf5a9601c..ccb1ca703 100644 --- a/lgsm/data/ubuntu-20.04.csv +++ b/lgsm/data/ubuntu-20.04.csv @@ -5,6 +5,7 @@ ahl ahl2 ark arma3 +armar,libcurl4,libssl1.1 av bb bb2,libcurl4-gnutls-dev:i386 diff --git a/lgsm/data/ubuntu-21.04.csv b/lgsm/data/ubuntu-21.04.csv index c2a4b959d..b2a277306 100644 --- a/lgsm/data/ubuntu-21.04.csv +++ b/lgsm/data/ubuntu-21.04.csv @@ -5,6 +5,7 @@ ahl ahl2 ark arma3 +armar,libcurl4,libssl1.1 av bb bb2,libcurl4-gnutls-dev:i386 diff --git a/lgsm/data/ubuntu-21.10.csv b/lgsm/data/ubuntu-21.10.csv index 8c66e2e26..836dfe53f 100644 --- a/lgsm/data/ubuntu-21.10.csv +++ b/lgsm/data/ubuntu-21.10.csv @@ -5,6 +5,7 @@ ahl ahl2 ark arma3 +armar,libcurl4,libssl1.1 av bb bb2,libcurl4-gnutls-dev:i386 diff --git a/lgsm/data/ubuntu-22.04.csv b/lgsm/data/ubuntu-22.04.csv index 8c66e2e26..836dfe53f 100644 --- a/lgsm/data/ubuntu-22.04.csv +++ b/lgsm/data/ubuntu-22.04.csv @@ -5,6 +5,7 @@ ahl ahl2 ark arma3 +armar,libcurl4,libssl1.1 av bb bb2,libcurl4-gnutls-dev:i386 diff --git a/lgsm/functions/core_functions.sh b/lgsm/functions/core_functions.sh index 4a72bf7d0..ad1307a73 100755 --- a/lgsm/functions/core_functions.sh +++ b/lgsm/functions/core_functions.sh @@ -341,6 +341,11 @@ functionfile="${FUNCNAME[0]}" fn_fetch_function } +fix_armar.sh(){ +functionfile="${FUNCNAME[0]}" +fn_fetch_function +} + fix_bo.sh(){ functionfile="${FUNCNAME[0]}" fn_fetch_function diff --git a/lgsm/functions/fix.sh b/lgsm/functions/fix.sh index b5cbcc77a..f9f61162f 100755 --- a/lgsm/functions/fix.sh +++ b/lgsm/functions/fix.sh @@ -39,6 +39,8 @@ if [ "${commandname}" != "INSTALL" ]&&[ -z "${fixbypass}" ]; then if [ "${shortname}" == "arma3" ]; then fix_arma3.sh + elif [ "${shortname}" == "armar" ]; then + fix_armar.sh elif [ "${shortname}" == "ark" ]; then fix_ark.sh elif [ "${shortname}" == "bo" ]; then diff --git a/lgsm/functions/fix_armar.sh b/lgsm/functions/fix_armar.sh new file mode 100755 index 000000000..9db42f51a --- /dev/null +++ b/lgsm/functions/fix_armar.sh @@ -0,0 +1,17 @@ +#!/bin/bash +# LinuxGSM fix_armar.sh module +# Author: Daniel Gibbs +# Contributors: http://linuxgsm.com/contrib +# Website: https://linuxgsm.com +# Description: Resolves an issue with Arma Reforger. + +functionselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" + +# Fixes: Profile directory doesn't exist. +# Issue Link: https://feedback.bistudio.com/T164845 +if [ ! -d "${serverprofilefullpath}" ]; then + fixname="Profile directory doesn't exist" + fn_fix_msg_start + mkdir -p "${serverprofilefullpath}" + fn_fix_msg_end +fi diff --git a/lgsm/functions/info_game.sh b/lgsm/functions/info_game.sh index 75cef3c69..db769f820 100644 --- a/lgsm/functions/info_game.sh +++ b/lgsm/functions/info_game.sh @@ -93,6 +93,33 @@ fn_info_game_arma3(){ battleeyeport=$((port+4)) } +fn_info_game_armar(){ + if [ -f "${servercfgfullpath}" ]; then + adminpassword=$(jq -r '.adminPassword' "${servercfgfullpath}") + configip=$(jq -r '.gameHostBindAddress' "${servercfgfullpath}") + maxplayers=$(jq -r '.game.playerCountLimit' "${servercfgfullpath}") + port=$(jq -r '.gameHostBindPort' "${servercfgfullpath}") + queryport=$(jq -r '.steamQueryPort' "${servercfgfullpath}") + servername=$(jq -r '.game.name' "${servercfgfullpath}") + serverpassword=$(jq -r '.game.password' "${servercfgfullpath}") + battleeyeport=1376 + + + # Not set + adminpassword=${adminpassword:-"NOT SET"} + configip=${configip:-"0.0.0.0"} + maxplayers=${maxplayers:-"0"} + port=${port:-"0"} + queryport=${queryport:-"0"} + servername=${servername:-"NOT SET"} + serverpassword=${serverpassword:-"NOT SET"} + else + port=${port:-"0"} + servername="${unavailable}" + serverpassword="${unavailable}" + fi +} + fn_info_game_av() { # Config if [ ! -f "${servercfgfullpath}" ]; then @@ -2282,6 +2309,8 @@ elif [ "${shortname}" == "ark" ]; then fn_info_game_ark elif [ "${shortname}" == "arma3" ]; then fn_info_game_arma3 +elif [ "${shortname}" == "armar" ]; then + fn_info_game_armar elif [ "${shortname}" == "av" ]; then fn_info_game_av elif [ "${shortname}" == "bf1942" ]; then diff --git a/lgsm/functions/info_messages.sh b/lgsm/functions/info_messages.sh index cf0f686b1..f0def5b0e 100755 --- a/lgsm/functions/info_messages.sh +++ b/lgsm/functions/info_messages.sh @@ -658,7 +658,7 @@ fn_info_message_ports_edit(){ startparameterslocation="${red}UNKNOWN${default}" # engines/games that require editing in the config file. - local ports_edit_array=( "ac" "arma3" "bo" "bt" "cd" "dst" "eco" "idtech2" "idtech3" "idtech3_ql" "jc2" "jc3" "lwjgl2" "mcb" "mumble" "pc" "pc2" "pz" "qw" "refractor" "renderware" "rw" "sb" "sdtd" "st" "stn" "ts3" "tw" "terraria" "unreal" "unreal2" "unreal3" "vints" "wurm") + local ports_edit_array=( "ac" "arma3" "armar" "bo" "bt" "cd" "dst" "eco" "idtech2" "idtech3" "idtech3_ql" "jc2" "jc3" "lwjgl2" "mcb" "mumble" "pc" "pc2" "pz" "qw" "refractor" "renderware" "rw" "sb" "sdtd" "st" "stn" "ts3" "tw" "terraria" "unreal" "unreal2" "unreal3" "vints" "wurm") for port_edit in "${ports_edit_array[@]}"; do if [ "${shortname}" == "ut3" ]; then startparameterslocation="${servercfgdir}/UTWeb.ini" @@ -681,7 +681,9 @@ fn_info_message_ports_edit(){ fn_info_message_ports(){ echo -e "${lightblue}Useful port diagnostic command:${default}" - if [ "${shortname}" == "av" ]; then + if [ "${shortname}" == "armar" ]; then + echo -e "ss -tuplwn | grep enfMain" + elif [ "${shortname}" == "av" ]; then echo -e "ss -tuplwn | grep AvorionServer" elif [ "${shortname}" == "bf1942" ]; then echo -e "ss -tuplwn | grep bf1942_lnxded" @@ -807,6 +809,15 @@ fn_info_message_arma3(){ } | column -s $'\t' -t } +fn_info_message_armar(){ + { + fn_port "header" + fn_port "Game" port udp + fn_port "Steam Query" queryport udp + fn_port "BattleEye" battleeyeport tcp + } | column -s $'\t' -t +} + fn_info_message_av(){ { fn_port "header" @@ -1639,6 +1650,8 @@ fn_info_message_select_engine(){ fn_info_message_ark elif [ "${shortname}" == "arma3" ]; then fn_info_message_arma3 + elif [ "${shortname}" == "armar" ]; then + fn_info_message_armar elif [ "${shortname}" == "av" ]; then fn_info_message_av elif [ "${shortname}" == "bf1942" ]; then diff --git a/lgsm/functions/install_config.sh b/lgsm/functions/install_config.sh index 305a12f93..a7c18b65d 100755 --- a/lgsm/functions/install_config.sh +++ b/lgsm/functions/install_config.sh @@ -202,6 +202,14 @@ elif [ "${shortname}" == "arma3" ]; then fn_default_config_remote fn_set_config_vars fn_list_config_locations +elif [ "${shortname}" == "armar" ]; then + gamedirname="ArmaReforger" + fn_check_cfgdir + array_configs+=( server.json ) + 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 ) From 74020fb111d11f29c86535ff017b540cbc2fd4c1 Mon Sep 17 00:00:00 2001 From: Marcin Jakubowski Date: Thu, 2 Jun 2022 23:00:11 +0200 Subject: [PATCH 163/164] fix(arma3): rework parsing of config (#3886) --- lgsm/functions/info_game.sh | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/lgsm/functions/info_game.sh b/lgsm/functions/info_game.sh index db769f820..88c27b4c9 100644 --- a/lgsm/functions/info_game.sh +++ b/lgsm/functions/info_game.sh @@ -72,10 +72,10 @@ fn_info_game_arma3(){ serverpassword="${unavailable}" maxplayers="${zero}" else - servername=$(grep "hostname" "${servercfgfullpath}" | sed -e 's/^[ \t]*//g' -e '/^\//d' -e 's/hostname//g' | tr -d '=\";,:' | sed -e 's/^[ \t]*//' -e 's/[ \t]*$//') - adminpassword=$(grep "passwordAdmin" "${servercfgfullpath}" | sed -e 's/^[ \t]*//g' -e '/^\//d' -e 's/passwordAdmin//g' | tr -d '=\";,:' | sed -e 's/^[ \t]*//' -e 's/[ \t]*$//') - serverpassword=$(grep "password" "${servercfgfullpath}" | sed -e 's/^[ \t]*//g' -e '/^\//d' -e 's/password//g' | tr -d '=\";,:' | sed -e 's/^[ \t]*//' -e 's/[ \t]*$//') - maxplayers=$(grep "maxPlayers" "${servercfgfullpath}" | grep -v "//" | tr -cd '[:digit:]') + servername=$(sed -nr 's/^hostname\s*=\s*"(.*)"\s*;/\1/p' "${servercfgfullpath}") + adminpassword=$(sed -nr 's/^passwordAdmin\s*=\s*"(.*)"\s*;/\1/p' "${servercfgfullpath}") + serverpassword=$(sed -nr 's/^password\s*=\s*"(.*)"\s*;/\1/p' "${servercfgfullpath}") + maxplayers=$(sed -nr 's/^maxPlayers\s*=\s*([0-9]+)\s*;/\1/p' "${servercfgfullpath}") # Not set servername=${servername:-"NOT SET"} From f34bae849b279c53394848ea54c036c11502fc26 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Thu, 2 Jun 2022 22:15:00 +0100 Subject: [PATCH 164/164] Release v22.1.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 ad1307a73..67ed2a59b 100755 --- a/lgsm/functions/core_functions.sh +++ b/lgsm/functions/core_functions.sh @@ -8,7 +8,7 @@ functionselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" -modulesversion="v21.5.1" +modulesversion="v22.1.0" # Core diff --git a/linuxgsm.sh b/linuxgsm.sh index c56d3e284..43c388571 100755 --- a/linuxgsm.sh +++ b/linuxgsm.sh @@ -20,7 +20,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="v21.5.1" +version="v22.1.0" shortname="core" gameservername="core" commandname="CORE" diff --git a/tests/tests_fctrserver.sh b/tests/tests_fctrserver.sh index c5c80590c..6a074861c 100644 --- a/tests/tests_fctrserver.sh +++ b/tests/tests_fctrserver.sh @@ -20,7 +20,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="v21.5.1" +version="v22.1.0" shortname="fctr" gameservername="fctrserver" commandname="CORE" diff --git a/tests/tests_jc2server.sh b/tests/tests_jc2server.sh index 89867b5fa..4bdadb59f 100644 --- a/tests/tests_jc2server.sh +++ b/tests/tests_jc2server.sh @@ -20,7 +20,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="v21.5.1" +version="v22.1.0" shortname="jc2" gameservername="jc2server" commandname="CORE" diff --git a/tests/tests_mcserver.sh b/tests/tests_mcserver.sh index 347646789..f9e64e07c 100644 --- a/tests/tests_mcserver.sh +++ b/tests/tests_mcserver.sh @@ -20,7 +20,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="v21.5.1" +version="v22.1.0" shortname="mc" gameservername="mcserver" commandname="CORE" diff --git a/tests/tests_ts3server.sh b/tests/tests_ts3server.sh index 01a705086..bb149ded7 100644 --- a/tests/tests_ts3server.sh +++ b/tests/tests_ts3server.sh @@ -20,7 +20,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="v21.5.1" +version="v22.1.0" shortname="ts3" gameservername="ts3server" commandname="CORE"