Explorar el Código

Merge pull request #5205 from GameServerManagers/release/v26.6.0

Release v26.6.0
Daniel Gibbs hace 1 día
padre
commit
9ca2e951c6
Se han modificado 69 ficheros con 385 adiciones y 899 borrados
  1. 1 1
      .github/scripts/details-check-generate-matrix.sh
  2. 1 1
      .github/workflows/action-pr-body-check.yml
  3. 3 4
      .github/workflows/action-update-check.yml
  4. 7 3
      lgsm/config-default/config-lgsm/avserver/_default.cfg
  5. 1 1
      lgsm/config-default/config-lgsm/boserver/_default.cfg
  6. 0 214
      lgsm/config-default/config-lgsm/btlserver/_default.cfg
  7. 2 2
      lgsm/config-default/config-lgsm/btserver/_default.cfg
  8. 1 1
      lgsm/config-default/config-lgsm/cs2server/_default.cfg
  9. 1 1
      lgsm/config-default/config-lgsm/emserver/_default.cfg
  10. 1 1
      lgsm/config-default/config-lgsm/jk2server/_default.cfg
  11. 1 1
      lgsm/config-default/config-lgsm/mcbserver/_default.cfg
  12. 4 3
      lgsm/config-default/config-lgsm/mohaaserver/_default.cfg
  13. 0 210
      lgsm/config-default/config-lgsm/onsetserver/_default.cfg
  14. 1 1
      lgsm/config-default/config-lgsm/stserver/_default.cfg
  15. 1 1
      lgsm/config-default/config-lgsm/tfserver/_default.cfg
  16. 1 1
      lgsm/config-default/config-lgsm/zpsserver/_default.cfg
  17. 5 7
      lgsm/data/almalinux-8.csv
  18. 5 7
      lgsm/data/almalinux-9.csv
  19. 4 6
      lgsm/data/centos-7.csv
  20. 5 7
      lgsm/data/centos-8.csv
  21. 5 7
      lgsm/data/centos-9.csv
  22. 5 7
      lgsm/data/debian-10.csv
  23. 5 7
      lgsm/data/debian-11.csv
  24. 5 7
      lgsm/data/debian-12.csv
  25. 4 6
      lgsm/data/debian-13.csv
  26. 5 7
      lgsm/data/debian-9.csv
  27. BIN
      lgsm/data/gameicons/btl-icon.png
  28. BIN
      lgsm/data/gameicons/onset-icon.png
  29. 4 6
      lgsm/data/rhel-7.csv
  30. 5 7
      lgsm/data/rhel-8.csv
  31. 5 7
      lgsm/data/rhel-9.csv
  32. 5 7
      lgsm/data/rocky-8.csv
  33. 5 7
      lgsm/data/rocky-9.csv
  34. 0 2
      lgsm/data/serverlist.csv
  35. 5 7
      lgsm/data/ubuntu-16.04.csv
  36. 5 7
      lgsm/data/ubuntu-18.04.csv
  37. 5 7
      lgsm/data/ubuntu-20.04.csv
  38. 5 7
      lgsm/data/ubuntu-22.04.csv
  39. 5 7
      lgsm/data/ubuntu-23.04.csv
  40. 5 7
      lgsm/data/ubuntu-23.10.csv
  41. 5 7
      lgsm/data/ubuntu-24.04.csv
  42. 5 7
      lgsm/data/ubuntu-26.04.csv
  43. 1 1
      lgsm/modules/alert.sh
  44. 6 0
      lgsm/modules/check_config.sh
  45. 0 9
      lgsm/modules/check_deps.sh
  46. 1 3
      lgsm/modules/check_executable.sh
  47. 2 6
      lgsm/modules/check_system_dir.sh
  48. 6 4
      lgsm/modules/command_monitor.sh
  49. 2 1
      lgsm/modules/command_stop.sh
  50. 9 2
      lgsm/modules/core_dl.sh
  51. 18 6
      lgsm/modules/core_modules.sh
  52. 5 7
      lgsm/modules/core_steamcmd.sh
  53. 1 1
      lgsm/modules/fix.sh
  54. 8 0
      lgsm/modules/fix_bo.sh
  55. 8 0
      lgsm/modules/fix_cmw.sh
  56. 7 2
      lgsm/modules/fix_ins.sh
  57. 11 0
      lgsm/modules/fix_jc2.sh
  58. 0 19
      lgsm/modules/fix_onset.sh
  59. 4 4
      lgsm/modules/fix_pvr.sh
  60. 22 0
      lgsm/modules/fix_zps.sh
  61. 22 46
      lgsm/modules/info_game.sh
  62. 34 26
      lgsm/modules/info_messages.sh
  63. 60 131
      lgsm/modules/info_stats.sh
  64. 11 17
      lgsm/modules/install_config.sh
  65. 1 1
      lgsm/modules/install_server_files.sh
  66. 2 2
      lgsm/modules/update_fivem.sh
  67. 2 2
      lgsm/modules/update_luanti.sh
  68. 1 1
      lgsm/modules/update_openra.sh
  69. 3 2
      linuxgsm.sh

+ 1 - 1
.github/scripts/details-check-generate-matrix.sh

@@ -5,7 +5,7 @@
 
 ref="${LGSM_REF:-${GITHUB_REF#refs/heads/}}"
 maxshards="${DETAILS_CHECK_SHARDS:-12}"
-legacyservers="bfv bf1942 btl onset"
+legacyservers="bfv bf1942"
 
 if [ -f lgsm/data/serverlist.csv ]; then
 	serverlist="lgsm/data/serverlist.csv"

+ 1 - 1
.github/workflows/action-pr-body-check.yml

@@ -74,7 +74,7 @@ jobs:
                 }
               }
               if (unlinked.length > 0) {
-                errors.push(`Not linked in Development: ${unlinked.join(', ')}. Closing keywords in pull requests to develop do not link issues. Select each issue in the Development section of this pull request's sidebar, then re-run this check.`);
+                errors.push(`Not linked in Development: ${unlinked.join(', ')}. Closing keywords in pull requests to develop do not link issues. A maintainer with write access must link these issues in the Development section, then re-run this check. No PR content change is needed to resolve the missing links.`);
               }
             }
 

+ 3 - 4
.github/workflows/action-update-check.yml

@@ -41,12 +41,11 @@ jobs:
       - name: Grab server
         run: LGSM_GITHUBBRANCH="${LGSM_REF}" ./linuxgsm.sh ${{ matrix.shortname }}server
 
-      - name: Enable developer mode
-        run: LGSM_GITHUBBRANCH="${LGSM_REF}" ./${{ matrix.shortname }}server developer
-
       - name: Insert steamuser
         if: matrix.shortname == 'jk2'
-        run: echo -e "steamuser=\"${{ secrets.STEAMCMD_USER }}\"\nsteampass='${{ secrets.STEAMCMD_PASS }}'" > lgsm/config-lgsm/${{ matrix.shortname }}server/common.cfg
+        run: |
+          mkdir -p lgsm/config-lgsm/${{ matrix.shortname }}server
+          echo -e "steamuser=\"${{ secrets.STEAMCMD_USER }}\"\nsteampass='${{ secrets.STEAMCMD_PASS }}'" > lgsm/config-lgsm/${{ matrix.shortname }}server/common.cfg
 
       - name: Install server
         run: LGSM_GITHUBBRANCH="${LGSM_REF}" ./${{ matrix.shortname }}server auto-install

+ 7 - 3
lgsm/config-default/config-lgsm/avserver/_default.cfg

@@ -8,8 +8,12 @@
 
 #### Game Server Settings ####
 
+## Predefined Parameters | https://docs.linuxgsm.com/configuration/start-parameters
+queryport="27020"
+steamport="27021"
+
 ## Server Parameters | https://docs.linuxgsm.com/configuration/start-parameters#additional-parameters
-startparameters="--galaxy-name ${selfname} --ip ${ip} --datapath ${avdatapath}"
+startparameters="--galaxy-name ${selfname} --ip ${ip} --datapath ${avdatapath} --steam-query-port ${queryport} --steam-master-port ${steamport}"
 
 ## Extra Parameters | https://docs.linuxgsm.com/configuration/start-parameters#extra-parameters
 # Added to the end of startparameters.
@@ -162,8 +166,8 @@ stopmode="10"
 # 3: gamedig
 # 4: gsquery
 # 5: tcp
-querymode="1"
-querytype=""
+querymode="2"
+querytype="protocol-valve"
 
 ## Console type
 consoleverbose="yes"

+ 1 - 1
lgsm/config-default/config-lgsm/boserver/_default.cfg

@@ -14,7 +14,7 @@
 gslt=""
 
 ## Server Parameters | https://docs.linuxgsm.com/configuration/start-parameters#additional-parameters
-startparameters="-batchmode -nographics -dedicated -configfile=${servercfgfullpath}"
+startparameters="-batchmode -nographics -dedicated"
 
 ## Extra Parameters | https://docs.linuxgsm.com/configuration/start-parameters#extra-parameters
 # Added to the end of startparameters.

+ 0 - 214
lgsm/config-default/config-lgsm/btlserver/_default.cfg

@@ -1,214 +0,0 @@
-##################################
-######## Default Settings ########
-##################################
-# DO NOT EDIT, ANY CHANGES WILL BE OVERWRITTEN!
-# Copy settings from here and use them in either:
-# common.cfg - applies settings to every instance.
-# [instance].cfg - applies settings to a specific instance.
-
-#### Game Server Settings ####
-
-## Predefined Parameters | https://docs.linuxgsm.com/configuration/start-parameters
-ip="0.0.0.0"
-port="7777"
-queryport="7780"
-
-## Server Parameters | https://docs.linuxgsm.com/configuration/start-parameters#additional-parameters
-startparameters="-Port=${port} -QueryPort=${queryport} -BroadcastIp=${publicip} -log"
-
-## Extra Parameters | https://docs.linuxgsm.com/configuration/start-parameters#extra-parameters
-# Added to the end of startparameters.
-extraparams=""
-
-#### 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"
-
-# Alert on Start/Stop/Restart
-statusalert="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"
-
-# ntfy Alerts | https://docs.linuxgsm.com/alerts/ntfy
-ntfyalert="off"
-ntfytopic="LinuxGSM"
-ntfyserver="https://ntfy.sh"
-ntfytoken=""
-ntfyusername=""
-ntfypassword=""
-ntfypriority=""
-ntfytags=""
-
-# Matrix Alerts | https://docs.linuxgsm.com/alerts/matrix
-matrixalert="off"
-matrixhomeserver="matrix.org"
-matrixtoken="accesstoken"
-matrixroom=""
-
-# 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"
-
-# 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 all".
-telegramapi="api.telegram.org"
-telegramalert="off"
-telegramtoken="accesstoken"
-telegramchatid=""
-telegramthreadid=""
-telegramsilentnotification="false"
-curlcustomstring=""
-
-## Stop | https://docs.linuxgsm.com/commands/start-stop-restart
-stoponlyifnoplayers="off"
-stoponlyifnoplayersallcommands="on"
-
-## Player Warnings | https://docs.linuxgsm.com/features/player-warnings
-# Minutes to warn players in-game before a stop, restart or update. 0 to disable.
-# e.g. 15 warns at 15, 10, 5, 3 and 1 minutes.
-warnplayerstimer="0"
-
-## 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="805140"
-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="BATTALION: Legacy"
-engine="unreal4"
-glibc="2.17"
-
-#### Directories ####
-# Edit with care
-
-## Game Server Directories
-systemdir="${serverfiles}/Battalion"
-executabledir="${systemdir}/Binaries/Linux"
-executable="./BattalionServer-Linux-Shipping"
-servercfgdir="${systemdir}/Saved/Config/LinuxServer"
-servercfg="Game.ini"
-servercfgdefault="Game.ini"
-servercfgfullpath="${servercfgdir}/${servercfg}"
-
-## Backup Directory
-backupdir="${lgsmdir}/backup"
-
-## Logging Directories
-[ -n "${LGSM_LOGDIR}" ] && logdir="${LGSM_LOGDIR}" || 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"
-
-## Log Parameters
-logtimestamp="off"
-logtimestampformat="%Y-%m-%d %H:%M:%S"

+ 2 - 2
lgsm/config-default/config-lgsm/btserver/_default.cfg

@@ -168,8 +168,8 @@ stopmode="7"
 # 3: gamedig
 # 4: gsquery
 # 5: tcp
-querymode="1"
-querytype=""
+querymode="2"
+querytype="protocol-valve"
 
 ## Console type
 consoleverbose="yes"

+ 1 - 1
lgsm/config-default/config-lgsm/cs2server/_default.cfg

@@ -21,7 +21,7 @@ wsapikey=""
 gslt=""
 
 ## Server Parameters | https://docs.linuxgsm.com/configuration/start-parameters#additional-parameters
-startparameters="-dedicated -ip ${ip} -port ${port} -maxplayers ${maxplayers} -authkey ${wsapikey} +exec ${selfname}.cfg"
+startparameters="-dedicated -ip ${ip} -port ${port} -maxplayers ${maxplayers} -authkey ${wsapikey} +exec ${selfname}.cfg +sv_setsteamaccount ${gslt}"
 
 ## Extra Parameters | https://docs.linuxgsm.com/configuration/start-parameters#extra-parameters
 # Added to the end of startparameters.

+ 1 - 1
lgsm/config-default/config-lgsm/emserver/_default.cfg

@@ -22,7 +22,7 @@ maxplayers="62"
 gslt=""
 
 ## Server Parameters | https://docs.linuxgsm.com/configuration/start-parameters#additional-parameters
-startparameters="-game empires -strictportbind -ip ${ip} -port ${port} +clientport ${clientport} +tv_port ${sourcetvport} +map ${defaultmap} +servercfgfile ${servercfg} -maxplayers ${maxplayers}"
+startparameters="-game empires -strictportbind -ip ${ip} -port ${port} +clientport ${clientport} +tv_port ${sourcetvport} +sv_setsteamaccount ${gslt} +map ${defaultmap} +servercfgfile ${servercfg} -maxplayers ${maxplayers}"
 
 ## Extra Parameters | https://docs.linuxgsm.com/configuration/start-parameters#extra-parameters
 # Added to the end of startparameters.

+ 1 - 1
lgsm/config-default/config-lgsm/jk2server/_default.cfg

@@ -193,7 +193,7 @@ executabledir="${systemdir}"
 executable="./jk2mvded"
 servercfg="${selfname}.cfg"
 servercfgdefault="server.cfg"
-servercfgdir="${systemdir}"
+servercfgdir="${systemdir}/base"
 servercfgfullpath="${servercfgdir}/${servercfg}"
 
 ## Backup Directory

+ 1 - 1
lgsm/config-default/config-lgsm/mcbserver/_default.cfg

@@ -155,7 +155,7 @@ stopmode="5"
 # 3: gamedig
 # 4: gsquery
 # 5: tcp
-querymode="2"
+querymode="5"
 querytype="mbe"
 
 ## Console type

+ 4 - 3
lgsm/config-default/config-lgsm/mohaaserver/_default.cfg

@@ -11,10 +11,11 @@
 ## Predefined Parameters | https://docs.linuxgsm.com/configuration/start-parameters
 ip="0.0.0.0"
 port="12203"
+queryport="12300"
 defaultmap="dm/mohdm1"
 
 ## Server Parameters | https://docs.linuxgsm.com/configuration/start-parameters#additional-parameters
-startparameters="+set sv_punkbuster 0 +set fs_basepath ${serverfiles} +set fs_outputpath ${gamelogdir} +set dedicated 2 +set net_ip ${ip} +set net_port ${port} +map ${defaultmap} +exec ${servercfg} "
+startparameters="+set sv_punkbuster 0 +set fs_basepath ${serverfiles} +set fs_outputpath ${gamelogdir} +set dedicated 2 +set net_ip ${ip} +set net_port ${port} +set net_gamespy_port ${queryport} +exec ${servercfg} +map ${defaultmap}"
 
 ## Extra Parameters | https://docs.linuxgsm.com/configuration/start-parameters#extra-parameters
 # Added to the end of startparameters.
@@ -154,8 +155,8 @@ stopmode="3"
 # 3: gamedig
 # 4: gsquery
 # 5: tcp
-querymode="1"
-querytype=""
+querymode="2"
+querytype="protocol-gamespy1"
 
 ## Console type
 consoleverbose="yes"

+ 0 - 210
lgsm/config-default/config-lgsm/onsetserver/_default.cfg

@@ -1,210 +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 ####
-
-## Server Parameters | https://docs.linuxgsm.com/configuration/start-parameters#additional-parameters
-## Game Server Docs | https://dev.playonset.com/wiki/DedicatedServer
-startparameters="--config ${servercfgfullpath}"
-
-## Extra Parameters | https://docs.linuxgsm.com/configuration/start-parameters#extra-parameters
-# Added to the end of startparameters.
-extraparams=""
-
-#### 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"
-
-# Alert on Start/Stop/Restart
-statusalert="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"
-
-# ntfy Alerts | https://docs.linuxgsm.com/alerts/ntfy
-ntfyalert="off"
-ntfytopic="LinuxGSM"
-ntfyserver="https://ntfy.sh"
-ntfytoken=""
-ntfyusername=""
-ntfypassword=""
-ntfypriority=""
-ntfytags=""
-
-# Matrix Alerts | https://docs.linuxgsm.com/alerts/matrix
-matrixalert="off"
-matrixhomeserver="matrix.org"
-matrixtoken="accesstoken"
-matrixroom=""
-
-# 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"
-
-# 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 all".
-telegramapi="api.telegram.org"
-telegramalert="off"
-telegramtoken="accesstoken"
-telegramchatid=""
-telegramthreadid=""
-telegramsilentnotification="false"
-curlcustomstring=""
-
-## Stop | https://docs.linuxgsm.com/commands/start-stop-restart
-stoponlyifnoplayers="off"
-stoponlyifnoplayersallcommands="on"
-
-## Player Warnings | https://docs.linuxgsm.com/features/player-warnings
-# Minutes to warn players in-game before a stop, restart or update. 0 to disable.
-# e.g. 15 warns at 15, 10, 5, 3 and 1 minutes.
-warnplayerstimer="0"
-
-## Updating | https://docs.linuxgsm.com/commands/update
-updateonstart="off"
-
-## Backup | https://docs.linuxgsm.com/commands/backup
-maxbackups="4"
-maxbackupdays="30"
-stoponbackup="on"
-
-## Logging | https://docs.linuxgsm.com/features/logging
-consolelogging="on"
-logdays="7"
-
-## Monitor | https://docs.linuxgsm.com/commands/monitor
-# Query delay time
-querydelay="1"
-
-## ANSI Colors | https://docs.linuxgsm.com/features/ansi-colors
-ansi="on"
-
-#### Advanced Settings ####
-
-## Message Display Time | https://docs.linuxgsm.com/features/message-display-time
-sleeptime="0.5"
-
-## SteamCMD Settings | https://docs.linuxgsm.com/steamcmd
-# Server appid
-appid="1204170"
-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="yes"
-
-## Game Server Details
-# Do not edit
-gamename="Onset"
-engine="unreal4"
-glibc="2.24"
-
-#### Directories ####
-# Edit with care
-
-## Game Server Directories
-systemdir="${serverfiles}"
-executabledir="${serverfiles}"
-executable="./OnsetServer"
-servercfgdir="${systemdir}"
-servercfg="server_config.json"
-servercfgdefault="server_config.json"
-servercfgfullpath="${servercfgdir}/${servercfg}"
-
-## Backup Directory
-backupdir="${lgsmdir}/backup"
-
-## Logging Directories
-[ -n "${LGSM_LOGDIR}" ] && logdir="${LGSM_LOGDIR}" || 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"
-
-## Log Parameters
-logtimestamp="off"
-logtimestampformat="%Y-%m-%d %H:%M:%S"

+ 1 - 1
lgsm/config-default/config-lgsm/stserver/_default.cfg

@@ -10,7 +10,7 @@
 
 ## Predefined Parameters | https://docs.linuxgsm.com/configuration/start-parameters
 worldsave="moon_save"
-worldtype="Moon"
+worldtype="Lunar"
 
 ## Server Parameters | https://docs.linuxgsm.com/configuration/start-parameters#additional-parameters
 startparameters="-LOAD ${worldsave} ${worldtype}"

+ 1 - 1
lgsm/config-default/config-lgsm/tfserver/_default.cfg

@@ -19,7 +19,7 @@ allowsensitivewords="true"
 altsavedirectoryname="${defaultmap}"
 anticheat="true"
 damageself="true"
-damangeallies="true"
+damageallies="true"
 gamemode="0" # 0 = PvP; 1 = PvE
 greenhand="true"
 maxplayers="40"

+ 1 - 1
lgsm/config-default/config-lgsm/zpsserver/_default.cfg

@@ -22,7 +22,7 @@ maxplayers="20"
 gslt=""
 
 ## Server Parameters | https://docs.linuxgsm.com/configuration/start-parameters#additional-parameters
-startparameters="-game zps -strictportbind -ip ${ip} -port ${port} +clientport ${clientport} +tv_port ${sourcetvport} +map ${defaultmap} +servercfgfile ${servercfg} -maxplayers ${maxplayers}"
+startparameters="-game zps -strictportbind -ip ${ip} -port ${port} +clientport ${clientport} +tv_port ${sourcetvport} +sv_setsteamaccount ${gslt} +map ${defaultmap} +servercfgfile ${servercfg} -maxplayers ${maxplayers}"
 
 ## Extra Parameters | https://docs.linuxgsm.com/configuration/start-parameters#extra-parameters
 # Added to the end of startparameters.

+ 5 - 7
lgsm/data/almalinux-8.csv

@@ -18,7 +18,6 @@ bmdm,ncurses-libs.i686
 bo
 bs
 bt,dos2unix,libxml2
-btl
 cc
 ce
 ck,xorg-x11-server-Xvfb
@@ -44,8 +43,8 @@ dodr
 dods
 doi
 dst,libcurl.i686
-dys
-eco,libgdiplus
+dys,libcurl.i686
+eco,libgdiplus,libicu
 em
 etl
 ets2,libatomic
@@ -87,7 +86,6 @@ ns
 ns2,speex,tbb
 ns2c,speex.i686,tbb.i686
 ohd
-onset,mariadb-connector-c
 orar,libicu,openssl-libs,zlib
 opfor
 pc
@@ -108,11 +106,11 @@ rsdw
 rtcw
 rust,zlib-devel
 rw,java-11-openjdk
-rwr,libgpg-error.i686,libX11.i686,libXext.i686,zlib.i686
+rwr,libgpg-error.i686,libX11.i686,libXext.i686,zlib.i686,libidn2.i686
 samp
 sb
 sbots
-scpsl
+scpsl,libicu
 sdtd,libxml2
 sf
 sfc,ncurses-libs.i686
@@ -149,4 +147,4 @@ wmc,java-21-openjdk
 wurm,xorg-x11-server-Xvfb
 xnt
 zmr,ncurses-libs.i686
-zps,ncurses-libs.i686
+zps,ncurses-libs.i686,libcurl.i686

+ 5 - 7
lgsm/data/almalinux-9.csv

@@ -18,7 +18,6 @@ bmdm,ncurses-libs.i686
 bo
 bs
 bt,dos2unix,libxml2
-btl
 cc
 ce
 ck,xorg-x11-server-Xvfb
@@ -44,8 +43,8 @@ dodr
 dods
 doi
 dst,libcurl.i686
-dys
-eco,libgdiplus
+dys,libcurl.i686
+eco,libgdiplus,libicu
 em
 etl
 ets2,libatomic
@@ -87,7 +86,6 @@ ns
 ns2,speex,tbb
 ns2c,speex.i686,tbb.i686
 ohd
-onset,mariadb-connector-c
 orar,libicu,openssl-libs,zlib
 opfor
 pc
@@ -108,11 +106,11 @@ rsdw
 rtcw
 rust,zlib-devel
 rw,java-21-openjdk
-rwr,libgpg-error.i686,libX11.i686,libXext.i686,zlib.i686
+rwr,libgpg-error.i686,libX11.i686,libXext.i686,zlib.i686,libidn2.i686
 samp
 sb
 sbots
-scpsl
+scpsl,libicu
 sdtd,libxml2
 sf
 sfc,ncurses-libs.i686
@@ -149,4 +147,4 @@ wmc,java-21-openjdk
 wurm,xorg-x11-server-Xvfb
 xnt
 zmr,ncurses-libs.i686
-zps,ncurses-libs.i686
+zps,ncurses-libs.i686,libcurl.i686

+ 4 - 6
lgsm/data/centos-7.csv

@@ -18,7 +18,6 @@ bmdm,ncurses-libs.i686
 bo
 bs
 bt,dos2unix,libxml2
-btl
 cc
 ce
 ck,xorg-x11-server-Xvfb
@@ -44,8 +43,8 @@ dodr
 dods
 doi
 dst,libcurl.i686
-dys
-eco,libgdiplus
+dys,libcurl.i686
+eco,libgdiplus,libicu
 em
 etl
 ets2,libatomic
@@ -87,7 +86,6 @@ ns
 ns2,speex,tbb
 ns2c,speex.i686,tbb.i686
 ohd
-onset,mariadb-connector-c
 orar
 opfor
 pc
@@ -112,7 +110,7 @@ rwr,libgpg-error.i686,libX11.i686,libXext.i686,zlib.i686
 samp
 sb
 sbots
-scpsl
+scpsl,libicu
 sdtd,libxml2
 sf
 sfc,ncurses-libs.i686
@@ -149,4 +147,4 @@ wmc,java-11-openjdk
 wurm,xorg-x11-server-Xvfb
 xnt
 zmr,ncurses-libs.i686
-zps,ncurses-libs.i686
+zps,ncurses-libs.i686,libcurl.i686

+ 5 - 7
lgsm/data/centos-8.csv

@@ -18,7 +18,6 @@ bmdm,ncurses-libs.i686
 bo
 bs
 bt,dos2unix,libxml2
-btl
 cc
 ce
 ck,xorg-x11-server-Xvfb
@@ -44,8 +43,8 @@ dodr
 dods
 doi
 dst,libcurl.i686
-dys
-eco,libgdiplus
+dys,libcurl.i686
+eco,libgdiplus,libicu
 em
 etl
 ets2,libatomic
@@ -87,7 +86,6 @@ ns
 ns2,speex,tbb
 ns2c,speex.i686,tbb.i686
 ohd
-onset,mariadb-connector-c
 orar
 opfor
 pc
@@ -108,11 +106,11 @@ rsdw
 rtcw
 rust,zlib-devel
 rw,java-11-openjdk
-rwr,libgpg-error.i686,libX11.i686,libXext.i686,zlib.i686
+rwr,libgpg-error.i686,libX11.i686,libXext.i686,zlib.i686,libidn2.i686
 samp
 sb
 sbots
-scpsl
+scpsl,libicu
 sdtd,libxml2
 sf
 sfc,ncurses-libs.i686
@@ -149,4 +147,4 @@ wmc,java-17-openjdk
 wurm,xorg-x11-server-Xvfb
 xnt
 zmr,ncurses-libs.i686
-zps,ncurses-libs.i686
+zps,ncurses-libs.i686,libcurl.i686

+ 5 - 7
lgsm/data/centos-9.csv

@@ -18,7 +18,6 @@ bmdm,ncurses-libs.i686
 bo
 bs
 bt,dos2unix,libxml2
-btl
 cc
 ce
 ck,xorg-x11-server-Xvfb
@@ -44,8 +43,8 @@ dodr
 dods
 doi
 dst,libcurl.i686
-dys
-eco,libgdiplus
+dys,libcurl.i686
+eco,libgdiplus,libicu
 em
 etl
 ets2,libatomic
@@ -87,7 +86,6 @@ ns
 ns2,speex,tbb
 ns2c,speex.i686,tbb.i686
 ohd
-onset,mariadb-connector-c
 orar
 opfor
 pc
@@ -108,11 +106,11 @@ rsdw
 rtcw
 rust,zlib-devel
 rw,java-21-openjdk
-rwr,libgpg-error.i686,libX11.i686,libXext.i686,zlib.i686
+rwr,libgpg-error.i686,libX11.i686,libXext.i686,zlib.i686,libidn2.i686
 samp
 sb
 sbots
-scpsl
+scpsl,libicu
 sdtd,libxml2
 sf
 sfc,ncurses-libs.i686
@@ -149,4 +147,4 @@ wmc,java-17-openjdk
 wurm,xorg-x11-server-Xvfb
 xnt
 zmr,ncurses-libs.i686
-zps,ncurses-libs.i686
+zps,ncurses-libs.i686,libcurl.i686

+ 5 - 7
lgsm/data/debian-10.csv

@@ -17,7 +17,6 @@ bmdm,libncurses5:i386
 bo
 bs
 bt,dos2unix,libxml2-utils
-btl
 cc
 ce
 ck,xvfb,libxi6
@@ -43,8 +42,8 @@ dodr
 dods
 doi
 dst,libcurl4-gnutls-dev:i386
-dys
-eco,libgdiplus
+dys,libcurl4-gnutls-dev:i386
+eco,libgdiplus,libicu63
 em
 etl
 ets2,libatomic1
@@ -86,7 +85,6 @@ ns
 ns2,speex,libtbb2
 ns2c,speex:i386,libtbb2
 ohd
-onset,libmariadb-dev
 orar
 opfor
 pc
@@ -108,11 +106,11 @@ rsdw
 rtcw
 rust,lib32z1
 rw,openjdk-11-jre
-rwr,libgpg-error0:i386,libx11-6:i386,libxext6:i386,zlib1g:i386
+rwr,libgpg-error0:i386,libx11-6:i386,libxext6:i386,zlib1g:i386,libidn2-0:i386
 samp
 sb
 sbots
-scpsl,mono-complete
+scpsl,mono-complete,libicu63
 sdtd,libxml2-utils
 sf
 sfc,libtinfo5:i386
@@ -149,4 +147,4 @@ wmc,openjdk-11-jre
 wurm,xvfb
 xnt
 zmr,libtinfo5:i386
-zps,libtinfo5:i386
+zps,libtinfo5:i386,libcurl4:i386

+ 5 - 7
lgsm/data/debian-11.csv

@@ -18,7 +18,6 @@ bmdm,libncurses5:i386
 bo
 bs
 bt,dos2unix,libxml2-utils
-btl
 cc
 ce
 ck,xvfb,libxi6
@@ -44,8 +43,8 @@ dodr
 dods
 doi
 dst,libcurl4-gnutls-dev:i386
-dys
-eco,libgdiplus
+dys,libcurl4-gnutls-dev:i386
+eco,libgdiplus,libicu67
 em
 etl
 ets2,libatomic1
@@ -87,7 +86,6 @@ ns
 ns2,speex,libtbb2
 ns2c,speex:i386,libtbb2
 ohd
-onset,libmariadb-dev
 orar,libicu67,libssl1.1,zlib1g
 opfor
 pc
@@ -109,11 +107,11 @@ rsdw
 rtcw
 rust,lib32z1
 rw,openjdk-17-jre
-rwr,libgpg-error0:i386,libx11-6:i386,libxext6:i386,zlib1g:i386
+rwr,libgpg-error0:i386,libx11-6:i386,libxext6:i386,zlib1g:i386,libidn2-0:i386
 samp
 sb
 sbots
-scpsl,mono-complete
+scpsl,mono-complete,libicu67
 sdtd,libxml2-utils
 sf
 sfc,libtinfo5:i386
@@ -149,4 +147,4 @@ wmc,openjdk-17-jre
 wurm,xvfb
 xnt
 zmr,libtinfo5:i386
-zps,libtinfo5:i386
+zps,libtinfo5:i386,libcurl4:i386

+ 5 - 7
lgsm/data/debian-12.csv

@@ -18,7 +18,6 @@ bmdm,libncurses5:i386
 bo
 bs
 bt,dos2unix,libxml2-utils
-btl
 cc
 ce
 ck,xvfb,libxi6
@@ -44,8 +43,8 @@ dodr
 dods
 doi
 dst,libcurl4-gnutls-dev:i386
-dys
-eco,libgdiplus
+dys,libcurl4-gnutls-dev:i386
+eco,libgdiplus,libicu72
 em
 etl
 ets2,libatomic1
@@ -87,7 +86,6 @@ ns
 ns2,speex,libtbb12
 ns2c,speex:i386,libtbb12
 ohd
-onset,libmariadb-dev
 orar,libicu72,libssl3,zlib1g
 opfor
 pc
@@ -109,11 +107,11 @@ rsdw
 rtcw
 rust,lib32z1
 rw,openjdk-17-jre
-rwr,libgpg-error0:i386,libx11-6:i386,libxext6:i386,zlib1g:i386
+rwr,libgpg-error0:i386,libx11-6:i386,libxext6:i386,zlib1g:i386,libidn2-0:i386
 samp
 sb
 sbots
-scpsl,mono-complete
+scpsl,mono-complete,libicu72
 sdtd,libxml2-utils
 sf
 sfc,libtinfo5:i386
@@ -149,4 +147,4 @@ wmc,openjdk-17-jre
 wurm,xvfb
 xnt
 zmr,libtinfo5:i386
-zps,libtinfo5:i386
+zps,libtinfo5:i386,libcurl4:i386

+ 4 - 6
lgsm/data/debian-13.csv

@@ -18,7 +18,6 @@ bmdm
 bo
 bs
 bt,dos2unix,libxml2-utils
-btl
 cc
 ce
 ck,xvfb,libxi6
@@ -44,8 +43,8 @@ dodr
 dods
 doi
 dst,libcurl4-gnutls-dev:i386
-dys
-eco,libgdiplus
+dys,libcurl4-gnutls-dev:i386
+eco,libgdiplus,libicu76
 em
 etl
 ets2,libatomic1
@@ -87,7 +86,6 @@ ns
 ns2,speex,libtbb12
 ns2c,speex:i386,libtbb12
 ohd
-onset,libmariadb-dev
 orar,libicu76,libssl3t64,zlib1g
 opfor
 pc
@@ -109,7 +107,7 @@ rsdw
 rtcw
 rust,lib32z1
 rw,openjdk-25-jre
-rwr,libgpg-error0:i386,libx11-6:i386,libxext6:i386,zlib1g:i386
+rwr,libgpg-error0:i386,libx11-6:i386,libxext6:i386,zlib1g:i386,libidn2-0:i386
 samp
 sb
 sbots
@@ -149,4 +147,4 @@ wmc,openjdk-25-jre
 wurm,xvfb
 xnt
 zmr
-zps
+zps,libcurl4t64:i386

+ 5 - 7
lgsm/data/debian-9.csv

@@ -18,7 +18,6 @@ bmdm,libncurses5:i386
 bo
 bs
 bt,dos2unix,libxml2-utils
-btl
 cc
 ce
 ck,xvfb,libxi6
@@ -44,8 +43,8 @@ dodr
 dods
 doi
 dst,libcurl4-gnutls-dev:i386
-dys
-eco,libgdiplus
+dys,libcurl4-gnutls-dev:i386
+eco,libgdiplus,libicu57
 em
 etl
 ets2,libatomic1
@@ -87,7 +86,6 @@ ns
 ns2,speex,libtbb2
 ns2c,speex:i386,libtbb2
 ohd
-onset,libmariadb-dev
 orar
 opfor
 pc
@@ -109,11 +107,11 @@ rsdw
 rtcw
 rust,lib32z1
 rw,openjdk-8-jre
-rwr,libgpg-error0:i386,libx11-6:i386,libxext6:i386,zlib1g:i386
+rwr,libgpg-error0:i386,libx11-6:i386,libxext6:i386,zlib1g:i386,libidn2-0:i386
 samp
 sb
 sbots
-scpsl,mono-complete
+scpsl,mono-complete,libicu57
 sdtd,libxml2-utils
 sf
 sfc,libtinfo5:i386
@@ -149,4 +147,4 @@ wmc,openjdk-8-jre
 wurm,xvfb
 xnt
 zmr,libtinfo5:i386
-zps,libtinfo5:i386
+zps,libtinfo5:i386,libcurl4:i386

BIN
lgsm/data/gameicons/btl-icon.png


BIN
lgsm/data/gameicons/onset-icon.png


+ 4 - 6
lgsm/data/rhel-7.csv

@@ -20,7 +20,6 @@ bmdm,ncurses-libs.i686
 bo
 bs
 bt,dos2unix,libxml2
-btl
 cc
 ce
 ck,xorg-x11-server-Xvfb
@@ -46,8 +45,8 @@ dodr
 dods
 doi
 dst,libcurl.i686
-dys
-eco,libgdiplus
+dys,libcurl.i686
+eco,libgdiplus,libicu
 em
 etl
 ets2,libatomic
@@ -88,7 +87,6 @@ ns
 ns2,speex,tbb
 ns2c,speex.i686,tbb.i686
 ohd
-onset,mariadb-connector-c
 orar
 opfor
 pc
@@ -112,7 +110,7 @@ rwr,libgpg-error.i686,libX11.i686,libXext.i686,zlib.i686
 samp
 sb
 sbots
-scpsl
+scpsl,libicu
 sdtd,libxml2
 sf
 sfc,ncurses-libs.i686
@@ -149,4 +147,4 @@ wmc,java-11-openjdk
 wurm,xorg-x11-server-Xvfb
 xnt
 zmr,ncurses-libs.i686
-zps,ncurses-libs.i686
+zps,ncurses-libs.i686,libcurl.i686

+ 5 - 7
lgsm/data/rhel-8.csv

@@ -18,7 +18,6 @@ bmdm,ncurses-libs.i686
 bo
 bs
 bt,dos2unix,libxml2
-btl
 cc
 ce
 ck,xorg-x11-server-Xvfb
@@ -44,8 +43,8 @@ dodr
 dods
 doi
 dst,libcurl.i686
-dys
-eco,libgdiplus
+dys,libcurl.i686
+eco,libgdiplus,libicu
 em
 etl
 ets2,libatomic
@@ -87,7 +86,6 @@ ns
 ns2,speex,tbb
 ns2c,speex.i686,tbb.i686
 ohd
-onset,mariadb-connector-c
 orar,libicu,openssl-libs,zlib
 opfor
 pc
@@ -108,11 +106,11 @@ rsdw
 rtcw
 rust,zlib-devel
 rw,java-21-openjdk
-rwr,libgpg-error.i686,libX11.i686,libXext.i686,zlib.i686
+rwr,libgpg-error.i686,libX11.i686,libXext.i686,zlib.i686,libidn2.i686
 samp
 sb
 sbots
-scpsl
+scpsl,libicu
 sdtd,libxml2
 sf
 sfc,ncurses-libs.i686
@@ -149,4 +147,4 @@ wmc,java-21-openjdk
 wurm,xorg-x11-server-Xvfb
 xnt
 zmr,ncurses-libs.i686
-zps,ncurses-libs.i686
+zps,ncurses-libs.i686,libcurl.i686

+ 5 - 7
lgsm/data/rhel-9.csv

@@ -18,7 +18,6 @@ bmdm,ncurses-libs.i686
 bo
 bs
 bt,dos2unix,libxml2
-btl
 cc
 ce
 ck,xorg-x11-server-Xvfb
@@ -44,8 +43,8 @@ dodr
 dods
 doi
 dst,libcurl.i686
-dys
-eco,libgdiplus
+dys,libcurl.i686
+eco,libgdiplus,libicu
 em
 etl
 ets2,libatomic
@@ -87,7 +86,6 @@ ns
 ns2,speex,tbb
 ns2c,speex.i686,tbb.i686
 ohd
-onset,mariadb-connector-c
 orar,libicu,openssl-libs,zlib
 opfor
 pc
@@ -108,11 +106,11 @@ rsdw
 rtcw
 rust,zlib-devel
 rw,java-21-openjdk
-rwr,libgpg-error.i686,libX11.i686,libXext.i686,zlib.i686
+rwr,libgpg-error.i686,libX11.i686,libXext.i686,zlib.i686,libidn2.i686
 samp
 sb
 sbots
-scpsl
+scpsl,libicu
 sdtd,libxml2
 sf
 sfc,ncurses-libs.i686
@@ -149,4 +147,4 @@ wmc,java-21-openjdk
 wurm,xorg-x11-server-Xvfb
 xnt
 zmr,ncurses-libs.i686
-zps,ncurses-libs.i686
+zps,ncurses-libs.i686,libcurl.i686

+ 5 - 7
lgsm/data/rocky-8.csv

@@ -18,7 +18,6 @@ bmdm,ncurses-libs.i686
 bo
 bs
 bt,dos2unix,libxml2
-btl
 cc
 ce
 ck,xorg-x11-server-Xvfb
@@ -44,8 +43,8 @@ dodr
 dods
 doi
 dst,libcurl.i686
-dys
-eco,libgdiplus
+dys,libcurl.i686
+eco,libgdiplus,libicu
 em
 etl
 ets2,libatomic
@@ -87,7 +86,6 @@ ns
 ns2,speex,tbb
 ns2c,speex.i686,tbb.i686
 ohd
-onset,mariadb-connector-c
 orar,libicu,openssl-libs,zlib
 opfor
 pc
@@ -108,11 +106,11 @@ rsdw
 rtcw
 rust,zlib-devel
 rw,java-21-openjdk
-rwr,libgpg-error.i686,libX11.i686,libXext.i686,zlib.i686
+rwr,libgpg-error.i686,libX11.i686,libXext.i686,zlib.i686,libidn2.i686
 samp
 sb
 sbots
-scpsl
+scpsl,libicu
 sdtd,libxml2
 sf
 sfc,ncurses-libs.i686
@@ -149,4 +147,4 @@ wmc,java-21-openjdk
 wurm,xorg-x11-server-Xvfb
 xnt
 zmr,ncurses-libs.i686
-zps,ncurses-libs.i686
+zps,ncurses-libs.i686,libcurl.i686

+ 5 - 7
lgsm/data/rocky-9.csv

@@ -18,7 +18,6 @@ bmdm,ncurses-libs.i686
 bo
 bs
 bt,dos2unix,libxml2
-btl
 cc
 ce
 ck,xorg-x11-server-Xvfb
@@ -44,8 +43,8 @@ dodr
 dods
 doi
 dst,libcurl.i686
-dys
-eco,libgdiplus
+dys,libcurl.i686
+eco,libgdiplus,libicu
 em
 etl
 ets2,libatomic
@@ -87,7 +86,6 @@ ns
 ns2,speex,tbb
 ns2c,speex.i686,tbb.i686
 ohd
-onset,mariadb-connector-c
 orar,libicu,openssl-libs,zlib
 opfor
 pc
@@ -108,11 +106,11 @@ rsdw
 rtcw
 rust,zlib-devel
 rw,java-21-openjdk
-rwr,libgpg-error.i686,libX11.i686,libXext.i686,zlib.i686
+rwr,libgpg-error.i686,libX11.i686,libXext.i686,zlib.i686,libidn2.i686
 samp
 sb
 sbots
-scpsl
+scpsl,libicu
 sdtd,libxml2
 sf
 sfc,ncurses-libs.i686
@@ -149,4 +147,4 @@ wmc,java-21-openjdk
 wurm,xorg-x11-server-Xvfb
 xnt
 zmr,ncurses-libs.i686
-zps,ncurses-libs.i686
+zps,ncurses-libs.i686,libcurl.i686

+ 0 - 2
lgsm/data/serverlist.csv

@@ -17,7 +17,6 @@ bmdm,bmdmserver,Black Mesa: Deathmatch,ubuntu-26.04
 bo,boserver,Ballistic Overkill,ubuntu-26.04
 bs,bsserver,Blade Symphony,ubuntu-26.04
 bt,btserver,Barotrauma,ubuntu-26.04
-btl,btlserver,BATTALION: Legacy,ubuntu-20.04
 cc,ccserver,Codename CURE,ubuntu-26.04
 ce,ceserver,Conan Exiles,ubuntu-26.04
 ck,ckserver,Core Keeper,ubuntu-26.04
@@ -86,7 +85,6 @@ ns,nsserver,Natural Selection,ubuntu-26.04
 ns2,ns2server,Natural Selection 2,ubuntu-26.04
 ns2c,ns2cserver,NS2: Combat,ubuntu-26.04
 ohd,ohdserver,Operation: Harsh Doorstop,ubuntu-26.04
-onset,onsetserver,Onset,ubuntu-20.04
 orar,orarserver,OpenRA: Red Alert,ubuntu-24.04
 opfor,opforserver,Opposing Force,ubuntu-26.04
 pc,pcserver,Project Cars,ubuntu-26.04

+ 5 - 7
lgsm/data/ubuntu-16.04.csv

@@ -20,7 +20,6 @@ bmdm,libncurses5:i386
 bo
 bs
 bt,dos2unix,libxml2-utils
-btl
 cc
 ce
 ck,xvfb,libxi6
@@ -46,8 +45,8 @@ dodr
 dods
 doi
 dst,libcurl4-gnutls-dev:i386
-dys
-eco,libgdiplus
+dys,libcurl4-gnutls-dev:i386
+eco,libgdiplus,libicu55
 em
 etl
 ets2,libatomic1
@@ -88,7 +87,6 @@ ns
 ns2,speex,libtbb2
 ns2c,speex:i386,libtbb2
 ohd
-onset,libmariadb-dev
 orar
 opfor
 pc
@@ -109,11 +107,11 @@ rsdw
 rtcw
 rust,lib32z1
 rw,openjdk-8-jre
-rwr,libgpg-error0:i386,libx11-6:i386,libxext6:i386,zlib1g:i386
+rwr,libgpg-error0:i386,libx11-6:i386,libxext6:i386,zlib1g:i386,libidn2-0:i386
 samp
 sb
 sbots
-scpsl,mono-complete
+scpsl,mono-complete,libicu55
 sdtd,libxml2-utils
 sf
 sfc,libtinfo5:i386
@@ -149,4 +147,4 @@ wmc,openjdk-8-jre
 wurm,xvfb
 xnt
 zmr,libtinfo5:i386
-zps,libtinfo5:i386
+zps,libtinfo5:i386,libcurl4:i386

+ 5 - 7
lgsm/data/ubuntu-18.04.csv

@@ -20,7 +20,6 @@ bmdm,libncurses5:i386
 bo
 bs
 bt,dos2unix,libxml2-utils
-btl
 cc
 ce
 ck,xvfb,libxi6
@@ -46,8 +45,8 @@ dodr
 dods
 doi
 dst,libcurl4-gnutls-dev:i386
-dys
-eco,libgdiplus
+dys,libcurl4-gnutls-dev:i386
+eco,libgdiplus,libicu60
 em
 etl
 ets2,libatomic1
@@ -88,7 +87,6 @@ ns
 ns2,speex,libtbb2
 ns2c,speex:i386,libtbb2
 ohd
-onset,libmariadb-dev
 orar
 opfor
 pc
@@ -109,11 +107,11 @@ rsdw
 rtcw
 rust,lib32z1
 rw,openjdk-11-jre
-rwr,libgpg-error0:i386,libx11-6:i386,libxext6:i386,zlib1g:i386
+rwr,libgpg-error0:i386,libx11-6:i386,libxext6:i386,zlib1g:i386,libidn2-0:i386
 samp
 sb
 sbots
-scpsl,mono-complete
+scpsl,mono-complete,libicu60
 sdtd,libxml2-utils
 sf
 sfc,libtinfo5:i386
@@ -149,4 +147,4 @@ wmc,openjdk-11-jre
 wurm,xvfb
 xnt
 zmr,libtinfo5:i386
-zps,libtinfo5:i386
+zps,libtinfo5:i386,libcurl4:i386

+ 5 - 7
lgsm/data/ubuntu-20.04.csv

@@ -18,7 +18,6 @@ bmdm,libncurses5:i386
 bo
 bs
 bt,dos2unix,libxml2-utils
-btl
 cc
 ce
 ck,xvfb,libxi6
@@ -44,8 +43,8 @@ dodr
 dods
 doi
 dst,libcurl4-gnutls-dev:i386
-dys
-eco,libgdiplus
+dys,libcurl4-gnutls-dev:i386
+eco,libgdiplus,libicu66
 em
 etl
 ets2,libatomic1
@@ -87,7 +86,6 @@ ns
 ns2,speex,libtbb2
 ns2c,speex:i386,libtbb2
 ohd
-onset,libmariadb-dev
 orar
 opfor
 pc
@@ -109,11 +107,11 @@ rsdw
 rtcw
 rust,lib32z1
 rw,openjdk-21-jre
-rwr,libgpg-error0:i386,libx11-6:i386,libxext6:i386,zlib1g:i386
+rwr,libgpg-error0:i386,libx11-6:i386,libxext6:i386,zlib1g:i386,libidn2-0:i386
 samp
 sb
 sbots
-scpsl,mono-complete
+scpsl,mono-complete,libicu66
 sdtd,libxml2-utils
 sf
 sfc,libtinfo5:i386
@@ -149,4 +147,4 @@ wmc,openjdk-21-jre
 wurm,xvfb
 xnt
 zmr,libtinfo5:i386
-zps,libtinfo5:i386
+zps,libtinfo5:i386,libcurl4:i386

+ 5 - 7
lgsm/data/ubuntu-22.04.csv

@@ -18,7 +18,6 @@ bmdm,libncurses5:i386
 bo
 bs
 bt,dos2unix,libxml2-utils
-btl
 cc
 ce
 ck,xvfb,libxi6
@@ -44,8 +43,8 @@ dodr
 dods
 doi
 dst,libcurl4-gnutls-dev:i386
-dys
-eco,libgdiplus
+dys,libcurl4-gnutls-dev:i386
+eco,libgdiplus,libicu70
 em
 etl
 ets2,libatomic1
@@ -87,7 +86,6 @@ ns
 ns2,speex,libtbb2
 ns2c,speex:i386,libtbb2
 ohd
-onset,libmariadb-dev
 orar,libicu70,libssl3,zlib1g
 opfor
 pc
@@ -109,11 +107,11 @@ rsdw
 rtcw
 rust,lib32z1
 rw,openjdk-21-jre
-rwr,libgpg-error0:i386,libx11-6:i386,libxext6:i386,zlib1g:i386
+rwr,libgpg-error0:i386,libx11-6:i386,libxext6:i386,zlib1g:i386,libidn2-0:i386
 samp
 sb
 sbots
-scpsl,mono-complete
+scpsl,mono-complete,libicu70
 sdtd,libxml2-utils
 sf
 sfc,libtinfo5:i386
@@ -149,4 +147,4 @@ wmc,openjdk-21-jre
 wurm,xvfb
 xnt
 zmr,libtinfo5:i386
-zps,libtinfo5:i386
+zps,libtinfo5:i386,libcurl4:i386

+ 5 - 7
lgsm/data/ubuntu-23.04.csv

@@ -18,7 +18,6 @@ bmdm,libncurses5:i386
 bo
 bs
 bt,dos2unix,libxml2-utils
-btl
 cc
 ce
 ck,xvfb,libxi6
@@ -44,8 +43,8 @@ dodr
 dods
 doi
 dst,libcurl4-gnutls-dev:i386
-dys
-eco,libgdiplus
+dys,libcurl4-gnutls-dev:i386
+eco,libgdiplus,libicu72
 em
 etl
 ets2,libatomic1
@@ -87,7 +86,6 @@ ns
 ns2,speex,libtbb2
 ns2c,speex:i386,libtbb2
 ohd
-onset,libmariadb-dev
 orar
 opfor
 pc
@@ -109,11 +107,11 @@ rsdw
 rtcw
 rust,lib32z1
 rw,openjdk-21-jre
-rwr,libgpg-error0:i386,libx11-6:i386,libxext6:i386,zlib1g:i386
+rwr,libgpg-error0:i386,libx11-6:i386,libxext6:i386,zlib1g:i386,libidn2-0:i386
 samp
 sb
 sbots
-scpsl,mono-complete
+scpsl,mono-complete,libicu72
 sdtd,libxml2-utils
 sf
 sfc,libtinfo5:i386
@@ -149,4 +147,4 @@ wmc,openjdk-21-jre
 wurm,xvfb
 xnt
 zmr,libtinfo5:i386
-zps,libtinfo5:i386
+zps,libtinfo5:i386,libcurl4:i386

+ 5 - 7
lgsm/data/ubuntu-23.10.csv

@@ -18,7 +18,6 @@ bmdm,libncurses5:i386
 bo
 bs
 bt,dos2unix,libxml2-utils
-btl
 cc
 ce
 ck,xvfb,libxi6
@@ -44,8 +43,8 @@ dodr
 dods
 doi
 dst,libcurl4-gnutls-dev:i386
-dys
-eco,libgdiplus
+dys,libcurl4-gnutls-dev:i386
+eco,libgdiplus,libicu72
 em
 etl
 ets2,libatomic1
@@ -87,7 +86,6 @@ ns
 ns2,speex,libtbb2
 ns2c,speex:i386,libtbb2
 ohd
-onset,libmariadb-dev
 orar
 opfor
 pc
@@ -109,11 +107,11 @@ rsdw
 rtcw
 rust,lib32z1
 rw,openjdk-21-jre
-rwr,libgpg-error0:i386,libx11-6:i386,libxext6:i386,zlib1g:i386
+rwr,libgpg-error0:i386,libx11-6:i386,libxext6:i386,zlib1g:i386,libidn2-0:i386
 samp
 sb
 sbots
-scpsl,mono-complete
+scpsl,mono-complete,libicu72
 sdtd,libxml2-utils
 sf
 sfc,libtinfo5:i386
@@ -149,4 +147,4 @@ wmc,openjdk-21-jre
 wurm,xvfb
 xnt
 zmr,libtinfo5:i386
-zps,libtinfo5:i386
+zps,libtinfo5:i386,libcurl4:i386

+ 5 - 7
lgsm/data/ubuntu-24.04.csv

@@ -18,7 +18,6 @@ bmdm
 bo
 bs
 bt,dos2unix,libxml2-utils
-btl
 cc
 ce
 ck,xvfb,libxi6
@@ -44,8 +43,8 @@ dodr
 dods
 doi
 dst,libcurl4-gnutls-dev:i386
-dys
-eco,libgdiplus
+dys,libcurl4-gnutls-dev:i386
+eco,libgdiplus,libicu74
 em
 etl
 ets2,libatomic1
@@ -87,7 +86,6 @@ ns
 ns2,speex
 ns2c,speex:i386
 ohd
-onset,libmariadb-dev
 orar,libicu74,libssl3t64,zlib1g
 opfor
 pc
@@ -108,11 +106,11 @@ rsdw
 rtcw
 rust,lib32z1
 rw,openjdk-25-jre
-rwr,libgpg-error0:i386,libx11-6:i386,libxext6:i386,zlib1g:i386
+rwr,libgpg-error0:i386,libx11-6:i386,libxext6:i386,zlib1g:i386,libidn2-0:i386
 samp
 sb
 sbots
-scpsl,mono-complete
+scpsl,mono-complete,libicu74
 sdtd,libxml2-utils
 sf
 sfc
@@ -149,4 +147,4 @@ wmc,openjdk-25-jre
 wurm,xvfb
 xnt
 zmr
-zps
+zps,libcurl4t64:i386

+ 5 - 7
lgsm/data/ubuntu-26.04.csv

@@ -18,7 +18,6 @@ bmdm
 bo
 bs
 bt,dos2unix,libxml2-utils
-btl
 cc
 ce
 ck,xvfb,libxi6
@@ -44,8 +43,8 @@ dodr
 dods
 doi
 dst,libcurl4-gnutls-dev:i386
-dys
-eco,libgdiplus
+dys,libcurl4-gnutls-dev:i386
+eco,libgdiplus,libicu78
 em
 etl
 ets2,libatomic1
@@ -87,7 +86,6 @@ ns
 ns2,speex
 ns2c,speex:i386
 ohd
-onset,libmariadb-dev
 orar,libicu78,libssl3t64,zlib1g
 opfor
 pc
@@ -108,11 +106,11 @@ rsdw
 rtcw
 rust,lib32z1
 rw,openjdk-25-jre
-rwr,libgpg-error0:i386,libx11-6:i386,libxext6:i386,zlib1g:i386
+rwr,libgpg-error0:i386,libx11-6:i386,libxext6:i386,zlib1g:i386,libidn2-0:i386
 samp
 sb
 sbots
-scpsl,mono-complete
+scpsl,mono-complete,libicu78
 sdtd,libxml2-utils
 sf
 sfc
@@ -149,4 +147,4 @@ wmc,openjdk-25-jre
 wurm,xvfb
 xnt
 zmr
-zps
+zps,libcurl4t64:i386

+ 1 - 1
lgsm/modules/alert.sh

@@ -129,7 +129,7 @@ fn_alert_update_restart_request() {
 	alertaction="Restart Requested"
 	alertemoji="🎉"
 	alertsound="1"
-	alertmessage="${selfname} has requested a restart for an update to be applied. Restarting now."
+	alertmessage="${selfname} has requested a restart for an update to be applied. Updating once the server is empty."
 	# Blue
 	alertcolourhex="#1e90ff"
 	alertcolourdec="2003199"

+ 6 - 0
lgsm/modules/check_config.sh

@@ -11,6 +11,12 @@ if [ "${shortname}" == "orar" ] && [ ! -d "${servercfgdir}" ]; then
 	install_config.sh
 fi
 
+if [ "${shortname}" == "jk2" ] && [ ! -f "${servercfgfullpath}" ] && [ -f "${systemdir}/${servercfg}" ]; then
+	fn_print_info_nl "Moving ${servercfg} to ${servercfgdir}"
+	fn_script_log_info "Moving ${systemdir}/${servercfg} to ${servercfgfullpath}"
+	mv "${systemdir}/${servercfg}" "${servercfgfullpath}"
+fi
+
 if [ -n "${servercfgfullpath}" ] && [ ! -f "${servercfgfullpath}" ]; then
 	fn_print_warn_nl "Configuration file missing!"
 	echo -e "${servercfgfullpath}"

+ 0 - 9
lgsm/modules/check_deps.sh

@@ -465,15 +465,6 @@ if [ "${depcheckonly}" != "1" ]; then
 		fi
 	fi
 
-	# These titles are only supported up to Ubuntu 20.04 and Debian 11.
-	if { [ "${distroid}" == "ubuntu" ] && dpkg --compare-versions "${distroversion}" "gt" "20.04"; } || { [ "${distroid}" == "debian" ] && dpkg --compare-versions "${distroversion}" "gt" "11"; }; then
-		if [ "${shortname}" == "onset" ] || [ "${shortname}" == "btl" ]; then
-			fn_print_failure_nl "${gamename} is not supported on ${distroname} (requires Ubuntu <= 20.04 or Debian <= 11)."
-			fn_script_log_fail "${gamename} is not supported on ${distroname}."
-			core_exit.sh
-		fi
-	fi
-
 	# Vintage Story tracks newer .NET runtimes; older distro releases may not ship required packages.
 	if [ "${shortname}" == "vints" ]; then
 		if { [ "${distroid}" == "ubuntu" ] && dpkg --compare-versions "${distroversion}" "lt" "24.04"; } || { [ "${distroid}" == "debian" ] && dpkg --compare-versions "${distroversion}" "lt" "12"; } || [ "${distroid}" == "centos" ] || [ "${distroid}" == "rhel" ] || [ "${distroid}" == "rocky" ] || [ "${distroid}" == "almalinux" ]; then

+ 1 - 3
lgsm/modules/check_executable.sh

@@ -12,9 +12,7 @@ execname=$(basename "${executable}")
 if [ ! -f "${executabledir}/${execname}" ]; then
 	fn_print_fail_nl "executable was not found"
 	echo -e "* ${executabledir}/${execname}"
-	if [ -d "${lgsmlogdir}" ]; then
-		fn_script_log_fail "Executable was not found: ${executabledir}/${execname}"
-	fi
+	fn_script_log_fail "Executable was not found: ${executabledir}/${execname}"
 	unset exitbypass
 	core_exit.sh
 fi

+ 2 - 6
lgsm/modules/check_system_dir.sh

@@ -9,16 +9,12 @@ moduleselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")"
 
 if [ ! -d "${serverfiles}" ]; then
 	fn_print_fail_nl "Cannot access ${serverfiles}: No such directory"
-	if [ -d "${lgsmlogdir}" ]; then
-		fn_script_log_fail "Cannot access ${serverfiles}: No such directory."
-	fi
+	fn_script_log_fail "Cannot access ${serverfiles}: No such directory."
 	core_exit.sh
 fi
 
 if [ ! -d "${systemdir}" ] && [ -z "${CI}" ]; then
 	fn_print_fail_nl "Cannot access ${systemdir}: No such directory"
-	if [ -d "${lgsmlogdir}" ]; then
-		fn_script_log_fail "Cannot access ${systemdir}: No such directory."
-	fi
+	fn_script_log_fail "Cannot access ${systemdir}: No such directory."
 	core_exit.sh
 fi

+ 6 - 4
lgsm/modules/command_monitor.sh

@@ -260,10 +260,12 @@ fn_monitor_check_update_source() {
 			fn_print_ok "Checking update"
 			fn_print_ok_eol_nl
 			fn_script_log_info "Checking update: ${selfname} has requested a restart for an update to be applied"
-			alert="update-restart-request"
-			alert.sh
-			command_restart.sh
-			core_exit.sh
+			if [ ! -f "${lockdir}/${selfname}-update-request.lock" ]; then
+				alert="update-restart-request"
+				alert.sh
+				date '+%s' > "${lockdir:?}/${selfname}-update-request.lock"
+				echo "force" >> "${lockdir:?}/${selfname}-update-request.lock"
+			fi
 		fi
 	fi
 }

+ 2 - 1
lgsm/modules/command_stop.sh

@@ -286,7 +286,8 @@ fn_stop_graceful_goldsrc() {
 	fn_print_ok "Graceful: sending \"quit\": ${seconds}"
 	fn_print_ok_eol_nl
 	fn_script_log_pass "Graceful: sending \"quit\": OK: ${seconds} seconds"
-	if [ "${statusalert}" == "on" ] && [ "${firstcommandname}" == "STOP" ]; then
+	check_status.sh
+	if [ "${status}" == "0" ] && [ "${statusalert}" == "on" ] && [ "${firstcommandname}" == "STOP" ]; then
 		alert="stopped"
 		alert.sh
 	fi

+ 9 - 2
lgsm/modules/core_dl.sh

@@ -42,8 +42,8 @@ fn_dl_steamcmd() {
 		fn_script_log_info "Branch: ${branch}"
 	fi
 	if [ -n "${betapassword}" ]; then
-		echo -e "Branch password: ${betapassword}"
-		fn_script_log_info "Branch password: ${betapassword}"
+		echo -e "Branch password: ********"
+		fn_script_log_info "Branch password: ********"
 	fi
 	if [ -d "${steamcmddir}" ]; then
 		cd "${steamcmddir}" || exit
@@ -76,6 +76,7 @@ fn_dl_steamcmd() {
 	steamcmdlog="${lgsmlogdir}/${selfname}-steamcmd.log"
 
 	local invalidplatformworkaround=""
+	local goldsrcshareddepotretry=""
 	counter=0
 	while [ "${counter}" -eq 0 ] || [ "${exitcode}" -ne 0 ]; do
 		counter=$((counter + 1))
@@ -215,6 +216,12 @@ fn_dl_steamcmd() {
 		elif [ "${exitcode}" -ne 0 ]; then
 			fn_print_error2_nl "${commandaction} ${selfname}: ${remotelocation}: Exit code: ${exitcode}"
 			fn_script_log_error "${commandaction} ${selfname}: ${remotelocation}: Exit code: ${exitcode}"
+		elif [ "${appid}" == "90" ] && [ ! -f "${serverfiles}/steamapps/appmanifest_70.acf" ] && [ -z "${goldsrcshareddepotretry}" ]; then
+			goldsrcshareddepotretry="1"
+			fn_print_error2_nl "${commandaction} ${selfname}: ${remotelocation}: Half-Life shared content (AppID 70) is missing - validating"
+			fn_script_log_error "${commandaction} ${selfname}: ${remotelocation}: Half-Life shared content (AppID 70) is missing - validating"
+			validateparam=("validate")
+			counter=0
 		else
 			fn_print_success_nl "${commandaction} ${selfname}: ${remotelocation}"
 			fn_script_log_pass "${commandaction} ${selfname}: ${remotelocation}"

+ 18 - 6
lgsm/modules/core_modules.sh

@@ -8,7 +8,7 @@
 
 moduleselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")"
 
-modulesversion="v26.5.0"
+modulesversion="v26.6.0"
 
 # Core
 
@@ -23,6 +23,13 @@ core_dl.sh() {
 
 core_exit.sh() {
 	modulefile="${FUNCNAME[0]}"
+	# Download core_exit.sh without running it first. fn_fetch_file declares a local exitcode
+	# while downloading, so running it from there would exit with that instead of the real one.
+	if [ ! -f "${modulesdir}/${modulefile}" ]; then
+		local exitcodesaved="${exitcode}"
+		fn_update_module
+		exitcode="${exitcodesaved}"
+	fi
 	fn_fetch_module
 	exitcode=$?
 	if [ "${exitcode}" -ne 0 ]; then
@@ -478,6 +485,11 @@ fix_ios.sh() {
 	fn_fetch_module
 }
 
+fix_jc2.sh() {
+	modulefile="${FUNCNAME[0]}"
+	fn_fetch_module
+}
+
 fix_kf.sh() {
 	modulefile="${FUNCNAME[0]}"
 	fn_fetch_module
@@ -513,11 +525,6 @@ fix_nmrih.sh() {
 	fn_fetch_module
 }
 
-fix_onset.sh() {
-	modulefile="${FUNCNAME[0]}"
-	fn_fetch_module
-}
-
 fix_pvr.sh() {
 	modulefile="${FUNCNAME[0]}"
 	fn_fetch_module
@@ -648,6 +655,11 @@ fix_zmr.sh() {
 	fn_fetch_module
 }
 
+fix_zps.sh() {
+	modulefile="${FUNCNAME[0]}"
+	fn_fetch_module
+}
+
 # Info
 
 info_distro.sh() {

+ 5 - 7
lgsm/modules/core_steamcmd.sh

@@ -24,9 +24,7 @@ fn_check_steamcmd_user() {
 	if [ "${steamuser}" == "username" ]; then
 		fn_print_fail_nl "Steam login not set. Update steamuser in ${configdirserver}"
 		fn_print_nl "	* Change steamuser=\"username\" to a valid steam login."
-		if [ -d "${lgsmlogdir}" ]; then
-			fn_script_log_fail "Steam login not set. Update steamuser in ${configdirserver}"
-		fi
+		fn_script_log_fail "Steam login not set. Update steamuser in ${configdirserver}"
 		core_exit.sh
 	fi
 	# Anonymous user is set if steamuser is missing.
@@ -223,7 +221,7 @@ fn_update_steamcmd_compare() {
 			fn_print_nl "* Branch: ${branch}"
 		fi
 		if [ -n "${betapassword}" ]; then
-			fn_print_nl "* Branch password: ${betapassword}"
+			fn_print_nl "* Branch password: ********"
 		fi
 		fn_print_nl "${italic}https://steamdb.info/app/${appid}/history"
 		fn_print "\n"
@@ -234,7 +232,7 @@ fn_update_steamcmd_compare() {
 			fn_script_log_info "Branch: ${branch}"
 		fi
 		if [ -n "${betapassword}" ]; then
-			fn_script_log_info "Branch password: ${betapassword}"
+			fn_script_log_info "Branch password: ********"
 		fi
 		fn_script_log_info "${localbuild} > ${remotebuild}"
 
@@ -256,7 +254,7 @@ fn_update_steamcmd_compare() {
 			fn_print_nl "* Branch: ${branch}"
 		fi
 		if [ -n "${betapassword}" ]; then
-			fn_print_nl "* Branch password: ${betapassword}"
+			fn_print_nl "* Branch password: ********"
 		fi
 		fn_print_nl "https://steamdb.info/app/${appid}/history"
 		fn_print "\n"
@@ -267,7 +265,7 @@ fn_update_steamcmd_compare() {
 			fn_script_log_info "Branch: ${branch}"
 		fi
 		if [ -n "${betapassword}" ]; then
-			fn_script_log_info "Branch password: ${betapassword}"
+			fn_script_log_info "Branch password: ********"
 		fi
 	fi
 }

+ 1 - 1
lgsm/modules/fix.sh

@@ -53,7 +53,7 @@ fn_apply_fix() {
 	fi
 }
 
-apply_pre_start_fix=(ahl arma3 armar ark av bf1942 bfv bt bo csgo cmw cod cod2 coduo codwaw cswon ct dst hlwon hw ins ios kf nd nmrih onset pvr ro rust rw samp sdtd sfc sm sof2 squad st tf2 terraria ts ts3 mcb mohaa mta unt ut ut99 vh vs wurm xnt zmr)
+apply_pre_start_fix=(ahl arma3 armar ark av bf1942 bfv bt bo csgo cmw cod cod2 coduo codwaw cswon ct dst hlwon hw ins ios jc2 kf nd nmrih pvr ro rust rw samp sdtd sfc sm sof2 squad st tf2 terraria ts ts3 mcb mohaa mta unt ut ut99 vh vs wurm xnt zmr zps)
 apply_post_install_fix=(av kf kf2 nd ro ut2k4 ut3)
 
 # validate registered fixes for safe development

+ 8 - 0
lgsm/modules/fix_bo.sh

@@ -8,3 +8,11 @@
 moduleselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")"
 
 export LD_LIBRARY_PATH="$LD_LIBRARY_PATH:${serverfiles}:${serverfiles}/BODS_Data/Plugins/x86_64"
+
+if [ -f "${servercfgfullpath}" ] && ! cmp -s "${servercfgfullpath}" "${serverfiles}/config.txt"; then
+	fixname="copy ${servercfg} to config.txt"
+	fn_fix_msg_start
+	cp -f "${servercfgfullpath}" "${serverfiles}/config.txt"
+	exitcode=$?
+	fn_fix_msg_end
+fi

+ 8 - 0
lgsm/modules/fix_cmw.sh

@@ -23,3 +23,11 @@ if [ ! -f "${servercfgfullpath}" ]; then
 	cp "${systemdir}/UDKGame/Config/"*.ini "${servercfgdir}"
 	fn_fix_msg_end
 fi
+
+cmwuserconfig="${HOME}/.local/share/TornBanner/Chivalry/UDKGame/Config/${selfname}/${servercfg}"
+if [ -f "${servercfgfullpath}" ] && [ -f "${cmwuserconfig}" ] && [ "${servercfgfullpath}" -nt "${cmwuserconfig}" ]; then
+	fixname="sync config"
+	fn_fix_msg_start
+	cp -f "${servercfgfullpath}" "${cmwuserconfig}"
+	fn_fix_msg_end
+fi

+ 7 - 2
lgsm/modules/fix_ins.sh

@@ -8,13 +8,18 @@
 moduleselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")"
 
 # Fixes: ./srcds_linux: error while loading shared libraries: libtier0.so: cannot open shared object file: No such file or directory.
-
 export LD_LIBRARY_PATH="$LD_LIBRARY_PATH:${serverfiles}:${serverfiles}/bin"
 
 # Fixes: issue #529 - gamemode not passed to debug or start.
-
 if [ "${commandname}" == "DEBUG" ]; then
 	defaultmap="\"${defaultmap}\""
 else
 	defaultmap="\\\"${defaultmap}\\\""
 fi
+
+# Fixes: srcds_run is shipped with CRLF line endings and a /bin/sh shebang but needs bash (pushd/popd).
+if [ -f "${serverfiles}/srcds_run" ]; then
+	if grep -q $'\r' "${serverfiles}/srcds_run" || head -n 1 "${serverfiles}/srcds_run" | grep -q '^#!/bin/sh'; then
+		sed -i 's/\r$//;1s|^#!/bin/sh$|#!/bin/bash|' "${serverfiles}/srcds_run"
+	fi
+fi

+ 11 - 0
lgsm/modules/fix_jc2.sh

@@ -0,0 +1,11 @@
+#!/bin/bash
+# LinuxGSM fix_jc2.sh module
+# Author: Daniel Gibbs
+# Contributors: https://linuxgsm.com/contrib
+# Website: https://linuxgsm.com
+# Description: Resolves issues with Just Cause 2.
+
+# shellcheck disable=SC2034 # Used by the module loader.
+moduleselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")"
+
+export GLIBC_TUNABLES="${GLIBC_TUNABLES:+${GLIBC_TUNABLES}:}glibc.rtld.execstack=2"

+ 0 - 19
lgsm/modules/fix_onset.sh

@@ -1,19 +0,0 @@
-#!/bin/bash
-# LinuxGSM fix_onset.sh module
-# Author: Daniel Gibbs
-# Contributors: https://linuxgsm.com/contrib
-# Website: https://linuxgsm.com
-# Description: Resolves various issues with Onset.
-
-moduleselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")"
-
-export LD_LIBRARY_PATH="$LD_LIBRARY_PATH:${serverfiles}"
-
-# Fixes: Failed loading "mariadb": libmariadbclient.so.18: cannot open shared object file: No such file or directory
-# Issue only occurs on CentOS as libmariadbclient.so.18 is called libmariadb.so.3 on CentOS.
-if [ -f "/etc/redhat-release" ] && [ ! -f "${serverfiles}/libmariadbclient.so.18" ] && [ -f "/usr/lib64/libmariadb.so.3" ]; then
-	fixname="libmariadbclient.so.18"
-	fn_fix_msg_start
-	ln -s "/usr/lib64/libmariadb.so.3" "${serverfiles}/libmariadbclient.so.18"
-	fn_fix_msg_end
-fi

+ 4 - 4
lgsm/modules/fix_pvr.sh

@@ -19,10 +19,10 @@ if ldd "${executabledir}/PavlovServer-Linux-Shipping" 2>&1 | grep -qE "libc\+\+(
 	fn_fix_msg_end
 fi
 
-if [ ! -f "${serverfiles}/linux64/libc++.so" ]; then
-	if [ -f "/usr/lib/x86_64-linux-gnu/libc++.so.1" ]; then
+if [ -f "/usr/lib/x86_64-linux-gnu/libc++.so.1" ]; then
+	if ! cmp -s "/usr/lib/x86_64-linux-gnu/libc++.so.1" "${serverfiles}/linux64/libc++.so"; then
 		cp "/usr/lib/x86_64-linux-gnu/libc++.so.1" "${serverfiles}/linux64/libc++.so"
-	elif [ -f "${serverfiles}/linux64/libc++.so.1" ]; then
-		cp -L "${serverfiles}/linux64/libc++.so.1" "${serverfiles}/linux64/libc++.so"
 	fi
+elif [ ! -f "${serverfiles}/linux64/libc++.so" ] && [ -f "${serverfiles}/linux64/libc++.so.1" ]; then
+	cp -L "${serverfiles}/linux64/libc++.so.1" "${serverfiles}/linux64/libc++.so"
 fi

+ 22 - 0
lgsm/modules/fix_zps.sh

@@ -0,0 +1,22 @@
+#!/bin/bash
+# LinuxGSM fix_zps.sh module
+# Author: Daniel Gibbs
+# Contributors: https://linuxgsm.com/contrib
+# Website: https://linuxgsm.com
+# Description: Resolves issues with Zombie Panic! Source.
+
+# shellcheck disable=SC2034 # Used by the module loader.
+moduleselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")"
+
+for libcurl in /usr/lib/i386-linux-gnu/libcurl.so.4 /usr/lib32/libcurl.so.4 /usr/lib/libcurl.so.4; do
+	if [ -f "${libcurl}" ]; then
+		if [ "$(readlink "${serverfiles}/bin/libcurl.so")" != "${libcurl}" ]; then
+			# shellcheck disable=SC2034 # Used by fn_fix_msg_start_nl and fn_fix_msg_end.
+			fixname="libcurl.so x86"
+			fn_fix_msg_start_nl
+			ln -sf "${libcurl}" "${serverfiles}/bin/libcurl.so"
+			fn_fix_msg_end
+		fi
+		break
+	fi
+done

+ 22 - 46
lgsm/modules/info_game.sh

@@ -339,6 +339,7 @@ fn_info_game_av() {
 		fn_info_game_ini "rconport" "rconPort"
 		fn_info_game_ini "servername" "name"
 		fn_info_game_ini "serverpassword" "password"
+		fn_info_game_ini "public" "isListed"
 		fn_info_game_ini "rconpassword" "rconPassword"
 		if [ -n "${rconpassword}" ]; then
 			rconenabled="true"
@@ -350,12 +351,13 @@ fn_info_game_av() {
 	rconenabled="${rconenabled:-"false"}"
 	rconpassword="${rconpassword:-"NOT SET"}"
 	rconport="${rconport:-"0"}"
-	# queryport doesn't respond to any queries, using session only.
-	queryport=""$((port + 3))""
+	if [ "${public,,}" != "true" ]; then
+		querymode="1"
+	fi
+	queryport="${queryport:-"27020"}"
 	servername="${servername:-"NOT SET"}"
 	serverpassword="${serverpassword:-"NOT SET"}"
-	steamport="$((port + 21))"
-	steamworksport="$((port + 20))"
+	steamport="${steamport:-"27021"}"
 }
 
 # Config Type: ini unknown (Source?)
@@ -367,33 +369,17 @@ fn_info_game_bo() {
 	if [ -f "${servercfgfullpath}" ]; then
 		fn_info_game_ini "maxplayers" "MaxPlayers"
 		fn_info_game_ini "port" "ServerPort"
+		fn_info_game_ini "queryport" "QueryPort"
 		fn_info_game_ini "servername" "ServerName"
 		fn_info_game_ini "serverpassword" "Password"
 	fi
 	maxplayers="${maxplayers:-"0"}"
 	port="${port:-"0"}"
-	queryport="$((port + 1))"
+	queryport="${queryport:-"$((port + 1))"}"
 	servername="${servername:-"NOT SET"}"
 	serverpassword="${serverpassword:-"NOT SET"}"
 }
 
-# Config Type: ini
-# Parameters: true
-# Comment: ; or #
-# Example: ServerName=SERVERNAME
-# Filetype: ini
-fn_info_game_btl() {
-	if [ -f "${servercfgfullpath}" ]; then
-		fn_info_game_ini "adminpassword" "AdminPassword"
-		fn_info_game_ini "servername" "ServerName"
-	fi
-	adminpassword="${adminpassword:-"NOT SET"}"
-	port="${port:-"0"}"
-	queryport="${queryport:-"0"}"
-	rconport="$((port + 2))"
-	servername="${servername:-"NOT SET"}"
-}
-
 # Config Type: ini
 # Parameters: true
 # Comment: ; or #
@@ -1040,9 +1026,16 @@ fn_info_game_bt() {
 		if [ -z "${tickrate}" ]; then
 			fn_info_game_xml "tickrate" "/serversettings/@tickrate"
 		fi
+		fn_info_game_xml "public" "/serversettings/@IsPublic"
+		if [ -z "${public}" ]; then
+			fn_info_game_xml "public" "/serversettings/@public"
+		fi
 	fi
 	maxplayers="${maxplayers:-"0"}"
 	port="${port:-"0"}"
+	if [ "${public,,}" != "true" ]; then
+		querymode="1"
+	fi
 	queryport="${queryport:-"0"}"
 	servername="${servername:-"NOT SET"}"
 	serverpassword="${serverpassword:-"NOT SET"}"
@@ -1414,7 +1407,7 @@ fn_info_game_hz() {
 		fn_info_game_ini "adminpassword" "AdminPassword"
 		fn_info_game_ini "servername" "ServerName"
 	fi
-	adminpass="${adminpassword:-"NOT SET"}"
+	adminpassword="${adminpassword:-"NOT SET"}"
 	port="${port:-"0"}"
 	queryport="${queryport:-"0"}"
 	rconport="$((port + 2))"
@@ -1595,8 +1588,10 @@ fn_info_game_mcb() {
 		fn_info_game_java_properties "gamemode" "gamemode"
 		fn_info_game_java_properties "maxplayers" "max-players"
 		fn_info_game_java_properties "port" "server-port"
-		fn_info_game_java_properties "portv6" "server-portv6"
+		fn_info_game_java_properties "portipv6" "server-portv6"
 		fn_info_game_java_properties "servername" "server-name"
+		fn_info_game_java_properties "transport" "transport"
+		fn_info_game_java_properties "udpport" "server-udp-ports"
 		fn_info_game_java_properties "worldname" "level-name"
 	fi
 	gamemode="${gamemode:-"NOT SET"}"
@@ -1604,6 +1599,8 @@ fn_info_game_mcb() {
 	portipv6="${portipv6:-"NOT SET"}"
 	queryport="${port}"
 	servername="${servername:-"NOT SET"}"
+	transport="${transport:-"nethernet"}"
+	udpport="${udpport:-"NOT SET"}"
 	worldname="${worldname:-"NOT SET"}"
 }
 
@@ -1621,7 +1618,7 @@ fn_info_game_mohaa() {
 	defaultmap="${defaultmap:-"NOT SET"}"
 	maxplayers="${maxplayers:-"0"}"
 	port="${port:-"0"}"
-	queryport="${port:-"0"}"
+	queryport="${queryport:-"0"}"
 	rconpassword="${rconpassword:-"NOT SET"}"
 	servername="${servername:-"NOT SET"}"
 	serverpassword="${serverpassword:-"NOT SET"}"
@@ -1685,23 +1682,6 @@ fn_info_game_ohd() {
 	rconpassword="${rconpassword:-"NOT SET"}"
 }
 
-# Config Type: json
-# Parameters: false
-# Comment: // or /* */
-fn_info_game_onset() {
-	if [ -f "${servercfgfullpath}" ]; then
-		fn_info_game_json "maxplayers" ".maxplayers"
-		fn_info_game_json "port" ".port"
-		fn_info_game_json "servername" ".servername_short"
-		fn_info_game_json "serverpassword" ".password"
-	fi
-	maxplayers="${maxplayers:-"0"}"
-	port="${port:-"0"}"
-	httpport="$((port - 2))"
-	queryport="$((port - 1))"
-	servername="${servername:-"NOT SET"}"
-}
-
 # Config Type: custom
 # Parameters: false
 # Comment: //
@@ -2517,8 +2497,6 @@ elif [ "${shortname}" == "bo" ]; then
 	fn_info_game_bo
 elif [ "${shortname}" == "bt" ]; then
 	fn_info_game_bt
-elif [ "${shortname}" == "btl" ]; then
-	fn_info_game_btl
 elif [ "${shortname}" == "ce" ]; then
 	fn_info_game_ce
 elif [ "${shortname}" == "ck" ]; then
@@ -2589,8 +2567,6 @@ elif [ "${shortname}" == "nec" ]; then
 	fn_info_game_nec
 elif [ "${shortname}" == "ohd" ]; then
 	fn_info_game_ohd
-elif [ "${shortname}" == "onset" ]; then
-	fn_info_game_onset
 elif [ "${shortname}" == "pc" ]; then
 	fn_info_game_pc
 elif [ "${shortname}" == "pc2" ]; then

+ 34 - 26
lgsm/modules/info_messages.sh

@@ -64,6 +64,30 @@ fn_info_messages_password_strip() {
 		if [ "${gslt}" ]; then
 			gslt="********"
 		fi
+
+		if [ "${betapassword}" ]; then
+			betapassword="********"
+		fi
+
+		if [ "${authtoken}" ]; then
+			authtoken="********"
+		fi
+
+		if [ "${usertoken}" ]; then
+			usertoken="********"
+		fi
+
+		if [ "${apikey}" ]; then
+			apikey="********"
+		fi
+
+		if [ "${gspassword}" ]; then
+			gspassword="********"
+		fi
+
+		if [ "${eosclientsecret}" ]; then
+			eosclientsecret="********"
+		fi
 	fi
 }
 
@@ -377,7 +401,7 @@ fn_info_messages_gameserver() {
 		fi
 
 		# Reserved Slots
-		if [ -n "${statspassword}" ]; then
+		if [ -n "${reservedslots}" ]; then
 			echo -e "${lightblue}Reserved Slots:\t${default}${reservedslots}"
 		fi
 
@@ -919,9 +943,9 @@ fn_info_messages_av() {
 	{
 		fn_port "header"
 		fn_port "Game" port udp
+		fn_port "Game" port tcp
 		fn_port "Query" queryport udp
 		fn_port "Steam" steamport udp
-		fn_port "Steamworks P2P" steamworksport udp
 		fn_port "RCON" rconport tcp
 	} | column -s $'\t' -t
 }
@@ -967,15 +991,6 @@ fn_info_messages_bt() {
 	} | column -s $'\t' -t
 }
 
-fn_info_messages_btl() {
-	{
-		fn_port "header"
-		fn_port "Game" port udp
-		fn_port "Query" queryport udp
-		fn_port "RCON" rconport tcp
-	} | column -s $'\t' -t
-}
-
 fn_info_messages_cd() {
 	{
 		fn_port "header"
@@ -1300,8 +1315,13 @@ fn_info_messages_mc() {
 fn_info_messages_mcb() {
 	{
 		fn_port "header"
-		fn_port "Game" port udp
-		fn_port "Game" portipv6 udp6
+		if [ "${transport}" == "raknet" ]; then
+			fn_port "Game" port udp
+			fn_port "Game" portipv6 udp6
+		else
+			fn_port "Signalling" port tcp
+			fn_port "Game" udpport udp
+		fi
 	} | column -s $'\t' -t
 }
 
@@ -1318,6 +1338,7 @@ fn_info_messages_mohaa() {
 	{
 		fn_port "header"
 		fn_port "Game" port udp
+		fn_port "Query" queryport udp
 	} | column -s $'\t' -t
 }
 
@@ -1348,15 +1369,6 @@ fn_info_messages_ohd() {
 	} | column -s $'\t' -t
 }
 
-fn_info_messages_onset() {
-	{
-		fn_port "header"
-		fn_port "Game" port udp
-		fn_port "Query" queryport udp
-		fn_port "HTTP" httpport tcp
-	} | column -s $'\t' -t
-}
-
 fn_info_messages_pc() {
 	{
 		fn_port "header"
@@ -1933,8 +1945,6 @@ fn_info_messages_select_engine() {
 		fn_info_messages_bo
 	elif [ "${shortname}" == "bt" ]; then
 		fn_info_messages_bt
-	elif [ "${shortname}" == "btl" ]; then
-		fn_info_messages_btl
 	elif [ "${shortname}" == "ce" ]; then
 		fn_info_messages_ce
 	elif [ "${shortname}" == "ck" ]; then
@@ -2011,8 +2021,6 @@ fn_info_messages_select_engine() {
 		fn_info_messages_nec
 	elif [ "${shortname}" == "ohd" ]; then
 		fn_info_messages_ohd
-	elif [ "${shortname}" == "onset" ]; then
-		fn_info_messages_onset
 	elif [ "${shortname}" == "pc" ]; then
 		fn_info_messages_pc
 	elif [ "${shortname}" == "pc2" ]; then

+ 60 - 131
lgsm/modules/info_stats.sh

@@ -4,7 +4,6 @@
 # Contributors: https://linuxgsm.com/contrib
 # Website: https://linuxgsm.com
 # Description: Collect optional Stats sent to LinuxGSM project.
-# Uses Google analytics.
 
 moduleselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")"
 
@@ -47,140 +46,70 @@ fi
 
 uuidinstance=$(cat "${datadir}/uuid-${selfname}.txt")
 uuidinstall=$(cat "${datadir}/uuid-install.txt")
-# machine-id is a unique id set on OS install
-uuidhardware=$(cat "/etc/machine-id")
+uuidreport="${uuidinstance##*_}"
 
-# results are rounded up to reduce number of different results in analytics.
+# results are rounded up to reduce number of different results.
 # nearest 100Mhz.
 cpuusedmhzroundup="$(((cpuusedmhz + 99) / 100 * 100))"
 # nearest 100MB
 memusedmbroundup="$(((memusedmb + 99) / 100 * 100))"
 
-# Convert any commas to dots.
-physmemtotal="${physmemtotal//,/.}"
-
-apisecret="A-OzP02TSMWt4_vHi6ZpUw"
-measurementid="G-0CR8V7EMT5"
-
-# Sending stats to Google Analytics GA4
-payload="{
-	\"client_id\": \"${uuidinstance}\",
-	\"events\": [
-		{
-		\"name\": \"LinuxGSM\",
-		\"params\": {
-			\"cpuusedmhzroundup\": \"${cpuusedmhzroundup}\",
-			\"diskused\": \"${serverfilesdu}\",
-			\"distro\": \"${distroname}\",
-			\"game\": \"${gamename}\",
-			\"memusedmbroundup\": \"${memusedmbroundup}\",
-			\"ramused\": \"${memusedmbroundup}\",
-			\"servercpu\": \"${cpumodel} ${cpucores} cores\",
-			\"servercpufreq\": \"${cpufreqency} x${cpulogicalcores}\",
-			\"servercpuphysicalcores\": \"${cpuphysicalcoresdisplay}\",
-			\"servercpulogicalcpus\": \"${cpulogicalcores}\",
-			\"servercpufreqrange\": \"${cpufrequencydisplay}\",
-			\"serverdisk\": \"${totalspace}\",
-			\"serverfilesdu\": \"${serverfilesdu}\",
-			\"serverram\": \"${physmemtotal}\",
-			\"serverramgb\": \"${physmemtotalgb}\",
-			\"uuidhardware\": \"${uuidhardware}\",
-			\"uuidinstall\": \"${uuidinstall}\",
-			\"uuidinstance\": \"${uuidinstance}\",
-			\"version\": \"${version}\",
-			\"virtualenvironment\": \"${virtualenvironment}\",
-			\"tmuxversion\": \"${tmuxversion}\",
-			\"java\": \"${javaversion}\"
-			}
-		}
-	]
-}"
-
-fn_alert_payload() {
-	alertpayload="{
-	\"client_id\": \"${uuidinstance}\",
-	\"events\": [
-		{
-		\"name\": \"LinuxGSM\",
-		\"params\": {
-			\"alert\": \"${alerttype}\"
-			}
-		}
-	]
-}"
-}
-
-curl -X POST "https://www.google-analytics.com/mp/collect?api_secret=A-OzP02TSMWt4_vHi6ZpUw&measurement_id=G-0CR8V7EMT5" -H "Content-Type: application/json" -d "${payload}"
-
-if [ "${discordalert}" == "on" ]; then
-	alerttype="discord"
-	fn_alert_payload
-	curl -X POST "https://www.google-analytics.com/mp/collect?api_secret=${apisecret}&measurement_id=${measurementid}" -H "Content-Type: application/json" -d "${alertpayload}"
-fi
-if [ "${emailalert}" == "on" ]; then
-	alerttype="email"
-	fn_alert_payload
-	curl -X POST "https://www.google-analytics.com/mp/collect?api_secret=${apisecret}&measurement_id=${measurementid}" -H "Content-Type: application/json" -d "${alertpayload}"
-fi
-if [ "${gotifyalert}" == "on" ]; then
-	alerttype="gotify"
-	fn_alert_payload
-	curl -X POST "https://www.google-analytics.com/mp/collect?api_secret=${apisecret}&measurement_id=${measurementid}" -H "Content-Type: application/json" -d "${alertpayload}"
-fi
-if [ "${iftttalert}" == "on" ]; then
-	alerttype="ifttt"
-	fn_alert_payload
-	curl -X POST "https://www.google-analytics.com/mp/collect?api_secret=${apisecret}&measurement_id=${measurementid}" -H "Content-Type: application/json" -d "${alertpayload}"
-fi
-if [ "${matrixalert}" == "on" ]; then
-	alerttype="matrix"
-	fn_alert_payload
-	curl -X POST "https://www.google-analytics.com/mp/collect?api_secret=${apisecret}&measurement_id=${measurementid}" -H "Content-Type: application/json" -d "${alertpayload}"
-fi
-if [ "${ntfyalert}" == "on" ]; then
-	alerttype="ntfy"
-	fn_alert_payload
-	curl -X POST "https://www.google-analytics.com/mp/collect?api_secret=${apisecret}&measurement_id=${measurementid}" -H "Content-Type: application/json" -d "${alertpayload}"
-fi
-if [ "${pushbulletalert}" == "on" ]; then
-	alerttype="pushbullet"
-	fn_alert_payload
-	curl -X POST "https://www.google-analytics.com/mp/collect?api_secret=${apisecret}&measurement_id=${measurementid}" -H "Content-Type: application/json" -d "${alertpayload}"
-fi
-if [ "${pushoveralert}" == "on" ]; then
-	alerttype="pushover"
-	fn_alert_payload
-	curl -X POST "https://www.google-analytics.com/mp/collect?api_secret=${apisecret}&measurement_id=${measurementid}" -H "Content-Type: application/json" -d "${alertpayload}"
-fi
-if [ "${rocketchatalert}" == "on" ]; then
-	alerttype="rocketchat"
-	fn_alert_payload
-	curl -X POST "https://www.google-analytics.com/mp/collect?api_secret=${apisecret}&measurement_id=${measurementid}" -H "Content-Type: application/json" -d "${alertpayload}"
-fi
-if [ "${slackalert}" == "on" ]; then
-	alerttype="slack"
-	fn_alert_payload
-	curl -X POST "https://www.google-analytics.com/mp/collect?api_secret=${apisecret}&measurement_id=${measurementid}" -H "Content-Type: application/json" -d "${alertpayload}"
-fi
-if [ "${telegramalert}" == "on" ]; then
-	alerttype="telegram"
-	fn_alert_payload
-	curl -X POST "https://www.google-analytics.com/mp/collect?api_secret=${apisecret}&measurement_id=${measurementid}" -H "Content-Type: application/json" -d "${alertpayload}"
-fi
+statsdate="$(date -u +%F)"
+statsstamp="${datadir}/stats-last-sent-${selfname}"
+
+if [ "$(cat "${statsstamp}" 2> /dev/null)" != "${statsdate}" ] && [ "$(command -v jq 2> /dev/null)" ]; then
+	echo "${statsdate}" > "${statsstamp}"
 
-fn_script_log_info "Send LinuxGSM stats"
-fn_script_log_info "* uuid-${selfname}: ${uuidinstance}"
-fn_script_log_info "* uuid-install: ${uuidinstall}"
-fn_script_log_info "* uuid-hardware: ${uuidhardware}"
-fn_script_log_info "* Game Name: ${gamename}"
-fn_script_log_info "* Distro Name: ${distroname}"
-fn_script_log_info "* Game Server CPU Used: ${cpuusedmhzroundup}MHz"
-fn_script_log_info "* Game Server RAM Used: ${memusedmbroundup}MB"
-fn_script_log_info "* Game Server Disk Used: ${serverfilesdu}"
-fn_script_log_info "* Server CPU Model: ${cpumodel}"
-fn_script_log_info "* Server CPU Average Frequency: ${cpufreqency}"
-fn_script_log_info "* Server RAM: ${physmemtotal}"
-fn_script_log_info "* Server Disk: ${totalspace}"
-fn_script_log_info "* Virtual Environment: ${virtualenvironment}"
-fn_script_log_info "* LinuxGSM Version: ${version}"
-fn_script_log_info "* Enabled Alerts"
+	statscores="${cpucores}"
+	if [[ ! "${statscores}" =~ ^[0-9]+$ ]]; then
+		statscores="${cpulogicalcores}"
+	fi
+	statsramgb="$(awk -v mb="${physmemtotalmb}" 'BEGIN{printf "%.1f", mb / 1024}')"
+	statsdiskgb="$(LC_ALL=C df -BG -P "${rootdir}" 2> /dev/null | awk 'NR==2{gsub("G","",$2); print $2}')"
+	statsfilesgb="$(awk -v v="${serverfilesdu}" 'BEGIN{n=v+0; u=substr(v,length(v)); if(u=="K")n/=1048576; else if(u=="M")n/=1024; else if(u=="T")n*=1024; printf "%.2f", n}')"
+
+	statsalerts=""
+	for statsalerttype in discord email gotify ifttt matrix ntfy pushbullet pushover rocketchat slack telegram; do
+		statsalertvar="${statsalerttype}alert"
+		if [ "${!statsalertvar}" == "on" ]; then
+			statsalerts+="${statsalerttype} "
+		fi
+	done
+
+	statspayload="$(jq -cn \
+		--arg uuid "${uuidreport}" \
+		--arg game "${gamename}" \
+		--arg distro "${distroname}" \
+		--arg version "${version}" \
+		--arg virt "${virtualenvironment}" \
+		--arg cores "${statscores}" \
+		--arg ram "${statsramgb}" \
+		--arg disk "${statsdiskgb}" \
+		--arg ramused "${memusedmbroundup}" \
+		--arg cpuused "${cpuusedmhzroundup}" \
+		--arg filesgb "${statsfilesgb}" \
+		--arg alerts "${statsalerts}" \
+		'{uuid: $uuid, game: $game, distro: $distro, version: $version, virt: $virt, cpu_cores: ($cores | tonumber? // 0), ram_gb: ($ram | tonumber? // 0), disk_gb: ($disk | tonumber? // 0)}
+		+ (if ($ramused | tonumber? // 0) > 0 then {ram_used_mb: ($ramused | tonumber)} else {} end)
+		+ (if ($cpuused | tonumber? // 0) > 0 then {cpu_used_mhz: ($cpuused | tonumber)} else {} end)
+		+ (if ($filesgb | tonumber? // 0) > 0 then {disk_used_gb: ($filesgb | tonumber)} else {} end)
+		+ (if ($alerts | length) > 0 then {alerts: ($alerts | split(" ") | map(select(length > 0)))} else {} end)' 2> /dev/null)"
+
+	if [ -n "${statspayload}" ]; then
+		curl -sS -f --max-time 5 -X POST "https://usage.linuxgsm.com/v1/report" -H "Content-Type: application/json" -d "${statspayload}" > /dev/null 2>&1
+	fi
+
+	fn_script_log_info "Send LinuxGSM stats"
+	fn_script_log_info "* uuid-${selfname}: ${uuidreport}"
+	fn_script_log_info "* Game Name: ${gamename}"
+	fn_script_log_info "* Distro Name: ${distroname}"
+	fn_script_log_info "* LinuxGSM Version: ${version}"
+	fn_script_log_info "* Virtual Environment: ${virtualenvironment}"
+	fn_script_log_info "* Game Server CPU Used: ${cpuusedmhzroundup}MHz"
+	fn_script_log_info "* Game Server RAM Used: ${memusedmbroundup}MB"
+	fn_script_log_info "* Game Server Disk Used: ${serverfilesdu}"
+	fn_script_log_info "* Server CPU Cores: ${statscores}"
+	fn_script_log_info "* Server RAM: ${statsramgb}GB"
+	fn_script_log_info "* Server Disk: ${statsdiskgb}GB"
+	fn_script_log_info "* Alerts: ${statsalerts:-none}"
+fi

+ 11 - 17
lgsm/modules/install_config.sh

@@ -24,18 +24,18 @@ fn_default_config_remote() {
 	echo -e "Downloading default configs from: ${italic}https://github.com/GameServerManagers/Game-Server-Configs${default}"
 	echo -e ""
 	fn_sleep_time_1
-	mkdir -p "${lgsmdir}/config-default/config-game"
+	mkdir -p "${servercfgdirdefault:-${lgsmdir}/config-default/config-game}"
 	githuburl="https://raw.githubusercontent.com/GameServerManagers/Game-Server-Configs/main"
 	for config in "${array_configs[@]}"; do
-		# Downloads default configs from Game-Server-Configs repo to lgsm/config-default.
-		fn_fetch_file "${githuburl}/${shortname}/${config}" "${remote_fileurl_backup}" "GitHub" "Bitbucket" "${lgsmdir}/config-default/config-game" "${config}" "nochmodx" "norun" "forcedl" "nohash"
+		# Downloads default configs to the configured template source directory.
+		fn_fetch_file "${githuburl}/${shortname}/${config}" "${remote_fileurl_backup}" "GitHub" "Bitbucket" "${servercfgdirdefault:-${lgsmdir}/config-default/config-game}" "${config}" "nochmodx" "norun" "forcedl" "nohash"
 
 		# Every config is copied.
 		if [ "${config}" == "${servercfgdefault}" ]; then
 			mkdir -p "${servercfgdir}"
 			echo -en "copying config file [ ${italic}${servercfgfullpath}${default} ]"
 			if [ ! -e "${servercfgfullpath}" ] && [ ! -L "${servercfgfullpath}" ]; then
-				cp "${lgsmdir}/config-default/config-game/${config}" "${servercfgfullpath}"
+				cp "${servercfgdirdefault:-${lgsmdir}/config-default/config-game}/${config}" "${servercfgfullpath}"
 				exitcode=$?
 				[ "${exitcode}" -eq 0 ] && changes="copied"
 			else
@@ -54,7 +54,7 @@ fn_default_config_remote() {
 			mkdir -p "${servercfgdir}"
 			echo -en "copying config file [ ${italic}${networkcfgfullpath}${default} ]"
 			if [ ! -e "${networkcfgfullpath}" ] && [ ! -L "${networkcfgfullpath}" ]; then
-				cp "${lgsmdir}/config-default/config-game/${config}" "${networkcfgfullpath}"
+				cp "${servercfgdirdefault:-${lgsmdir}/config-default/config-game}/${config}" "${networkcfgfullpath}"
 				exitcode=$?
 				[ "${exitcode}" -eq 0 ] && changes="copied"
 			else
@@ -72,7 +72,7 @@ fn_default_config_remote() {
 		elif [ "${shortname}" == "dst" ] && [ "${config}" == "${clustercfgdefault}" ]; then
 			echo -en "copying config file [ ${italic}${clustercfgfullpath}${default} ]"
 			if [ ! -e "${clustercfgfullpath}" ] && [ ! -L "${clustercfgfullpath}" ]; then
-				cp "${lgsmdir}/config-default/config-game/${clustercfgdefault}" "${clustercfgfullpath}"
+				cp "${servercfgdirdefault:-${lgsmdir}/config-default/config-game}/${clustercfgdefault}" "${clustercfgfullpath}"
 				exitcode=$?
 				[ "${exitcode}" -eq 0 ] && changes="copied"
 			else
@@ -90,7 +90,7 @@ fn_default_config_remote() {
 		else
 			echo -en "copying config file [ ${italic}${servercfgdir}/${config}${default} ]"
 			if [ ! -e "${servercfgdir}/${config}" ] && [ ! -L "${servercfgdir}/${config}" ]; then
-				cp "${lgsmdir}/config-default/config-game/${config}" "${servercfgdir}/${config}"
+				cp "${servercfgdirdefault:-${lgsmdir}/config-default/config-game}/${config}" "${servercfgdir}/${config}"
 				exitcode=$?
 				[ "${exitcode}" -eq 0 ] && changes="copied"
 			else
@@ -111,7 +111,7 @@ fn_default_config_remote() {
 	done
 }
 
-# Copies local default config to server config location.
+# Copies local default config from its source directory to the server config location.
 fn_default_config_local() {
 	echo -e ""
 	echo -e "${bold}${lightyellow}Copying ${gamename} Configs${default}"
@@ -125,7 +125,7 @@ fn_default_config_local() {
 	fi
 
 	echo -en "copying config file [ ${italic}${servercfgdefault}${default} ]: "
-	cp --update=none "${servercfgdir}/${servercfgdefault}" "${servercfgfullpath}"
+	cp --update=none "${servercfgdirdefault:-${servercfgdir}}/${servercfgdefault}" "${servercfgfullpath}"
 	exitcode=$?
 	if [ "${exitcode}" -ne 0 ]; then
 		fn_print_fail_eol
@@ -148,9 +148,9 @@ fn_set_config_vars() {
 		fn_script_log_info "setting hostname"
 		fn_sleep_time
 		# prevents var from being overwritten with the servername.
-		if grep -q "SERVERNAME=SERVERNAME" "${lgsmdir}/config-default/config-game/${config}" 2> /dev/null; then
+		if grep -q "SERVERNAME=SERVERNAME" "${servercfgdirdefault:-${lgsmdir}/config-default/config-game}/${config}" 2> /dev/null; then
 			changes+=$(sed -i "s/SERVERNAME=SERVERNAME/SERVERNAME=${servername}/g w /dev/stdout" "${servercfgfullpath}")
-		elif grep -q "SERVERNAME=\"SERVERNAME\"" "${lgsmdir}/config-default/config-game/${config}" 2> /dev/null; then
+		elif grep -q "SERVERNAME=\"SERVERNAME\"" "${servercfgdirdefault:-${lgsmdir}/config-default/config-game}/${config}" 2> /dev/null; then
 			changes+=$(sed -i "s/SERVERNAME=\"SERVERNAME\"/SERVERNAME=\"${servername}\"/g w /dev/stdout" "${servercfgfullpath}")
 		else
 			changes+=$(sed -i "s/SERVERNAME/${servername}/g w /dev/stdout" "${servercfgfullpath}")
@@ -325,12 +325,6 @@ elif [ "${shortname}" == "bt" ]; then
 	fn_default_config_remote
 	fn_set_config_vars
 	fn_list_config_locations
-elif [ "${shortname}" == "btl" ]; then
-	fn_check_cfgdir
-	array_configs+=(Game.ini)
-	fn_default_config_remote
-	fn_set_config_vars
-	fn_list_config_locations
 elif [ "${shortname}" == "bf1942" ]; then
 	array_configs+=(serversettings.con)
 	fn_default_config_remote

+ 1 - 1
lgsm/modules/install_server_files.sh

@@ -230,7 +230,7 @@ fn_install_server_files() {
 		fn_script_log_fail "Installing ${gamename} Server failed, missing default configuration"
 		core_exit.sh
 	fi
-	fn_fetch_file "${remote_fileurl}" "" "" "" "${local_filedir}" "${local_filename}" "${chmodx}" "${run}" "${forcedl}" "${md5}"
+	fn_fetch_file "${remote_fileurl}" "" "" "" "${local_filedir}" "${local_filename}" "${chmodx}" "${run}" "${force}" "${md5}"
 	fn_dl_extract "${local_filedir}" "${local_filename}" "${serverfiles}"
 	fn_clear_tmp
 }

+ 2 - 2
lgsm/modules/update_fivem.sh

@@ -9,13 +9,13 @@ moduleselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")"
 
 fn_update_resources() {
 	# Download and extract the cfx-server-data base resources.
-	fn_fetch_file "https://github.com/citizenfx/cfx-server-data/archive/refs/heads/master.tar.gz" "" "" "" "${tmpdir}" "cfx-server-data.tar.gz" "nochmodx" "norun" "force" "nohash"
+	fn_fetch_file "https://github.com/citizenfx/cfx-server-data/archive/refs/heads/master.tar.gz" "" "" "" "${tmpdir}" "cfx-server-data.tar.gz" "nochmodx" "norun" "forcedl" "nohash"
 	fn_dl_extract "${tmpdir}" "cfx-server-data.tar.gz" "${serverfiles}" "cfx-server-data-master/resources"
 }
 
 fn_update_dl() {
 	# Download and extract files to tmpdir.
-	fn_fetch_file "${remotebuildurl}" "" "" "" "${tmpdir}" "${remotebuildfilename}" "nochmodx" "norun" "force" "nohash"
+	fn_fetch_file "${remotebuildurl}" "" "" "" "${tmpdir}" "${remotebuildfilename}" "nochmodx" "norun" "forcedl" "nohash"
 	rm -rf "${serverfiles:?}/alpine"
 	fn_dl_extract "${tmpdir}" "${remotebuildfilename}" "${serverfiles}"
 	if [ ! -d "${serverfiles}/resources" ]; then

+ 2 - 2
lgsm/modules/update_luanti.sh

@@ -8,10 +8,10 @@
 moduleselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")"
 
 fn_update_dl() {
-	fn_fetch_file "${remotebuildurl}" "" "" "" "${tmpdir}" "${remotebuildfilename}" "nochmodx" "norun" "force" "${remotebuildhash}"
+	fn_fetch_file "${remotebuildurl}" "" "" "" "${tmpdir}" "${remotebuildfilename}" "nochmodx" "norun" "forcedl" "${remotebuildhash}"
 	fn_dl_extract "${tmpdir}" "${remotebuildfilename}" "${serverfiles}" "luanti"
 	if [ "${firstcommandname}" == "INSTALL" ] && [ ! -d "${serverfiles}/games/minetest" ]; then
-		fn_fetch_file "https://github.com/luanti-org/minetest_game/archive/refs/tags/5.8.0.tar.gz" "" "" "" "${tmpdir}" "minetest_game-5.8.0.tar.gz" "nochmodx" "norun" "force" "33a3bb43b08497a0bdb2f49f140a2829e582d5c16c0ad52be1595c803f706912"
+		fn_fetch_file "https://github.com/luanti-org/minetest_game/archive/refs/tags/5.8.0.tar.gz" "" "" "" "${tmpdir}" "minetest_game-5.8.0.tar.gz" "nochmodx" "norun" "forcedl" "33a3bb43b08497a0bdb2f49f140a2829e582d5c16c0ad52be1595c803f706912"
 		mkdir -p "${serverfiles}/games/minetest"
 		fn_dl_extract "${tmpdir}" "minetest_game-5.8.0.tar.gz" "${serverfiles}/games/minetest" "minetest_game-5.8.0"
 	fi

+ 1 - 1
lgsm/modules/update_openra.sh

@@ -8,7 +8,7 @@
 moduleselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")"
 
 fn_update_dl() {
-	fn_fetch_file "${remotebuildurl}" "" "" "" "${tmpdir}" "${remotebuildfilename}" "chmodx" "norun" "force" "nohash"
+	fn_fetch_file "${remotebuildurl}" "" "" "" "${tmpdir}" "${remotebuildfilename}" "chmodx" "norun" "forcedl" "nohash"
 	local extractdir
 	extractdir=$(mktemp -d "${tmpdir}/openra.XXXXXX") || exit 1
 	if ! (cd "${extractdir}" && "${tmpdir}/${remotebuildfilename}" --appimage-extract > /dev/null) || [ ! -x "${extractdir}/squashfs-root/usr/lib/openra/OpenRA.Server" ] || [ ! -x "${extractdir}/squashfs-root/AppRun" ]; then

+ 3 - 2
linuxgsm.sh

@@ -24,7 +24,7 @@ if [ -f ".dev-debug" ]; then
 	set -x
 fi
 
-version="v26.5.0"
+version="v26.6.0"
 shortname="core"
 gameservername="core"
 commandname="CORE"
@@ -383,9 +383,10 @@ fn_install_file() {
 	cp -R "${selfname}" "${local_filename}"
 	sed -i -e "s/shortname=\"core\"/shortname=\"${shortname}\"/g" "${local_filename}"
 	sed -i -e "s/gameservername=\"core\"/gameservername=\"${gameservername}\"/g" "${local_filename}"
-	echo -e "Installed ${gamename} server as ${local_filename}"
+	echo -e "Installed ${gamename} server script as ${local_filename}"
 	echo -e ""
 	if [ ! -d "${serverfiles}" ]; then
+		echo -e "To install the server type:"
 		echo -e "./${local_filename} install"
 	else
 		echo -e "Remember to check server ports"