Explorar o código

feat(details): refactor of game info (#4174)

* feat(btl): rename bt1944 to btl (#4124)

* fix(bt1944): update binary file

* feat(btl): rename bt1944 to btl

* rename gameworld to worldname

* rename autosaveinverval to saveinterval

* rust seed

* add exit code to details

* update some variables

* comment

* update random

* current refactor

* modules

* json

* xml

* add core modules to functions dir

* functions

* fix

* use xmllint for parsing xml

* check root

* check logs

* sdtd

* quakec

* changes

* remove dev null

* arma3

* add detect details

* config origin

* fix: cmw mkdir bug

* ini improvements

* further ini improvements

* dst ini

* revert

* httpport

* max players

* source engine

* fix: cannot iterate over null

* fix quakec

* fix(nec): no query port

* more updates

* more updated

* more

* more

* telnet ip

* first test of details checking

* more details updates

* more standardizing

* comment out steamport in not set

* kf2 master server true

* update roserver

* fix bug

* looks for file called config and uses that

* test


test


test


test


test

* download correct configs

* test


test


test


test


test


test


test


test


test


test


test


test


test


test


test


test


test


test


test

* remove blank lines

* update var names

* fail

* continue on error

* install xmllint

* adjust quakec

* fix dst

* fix java

* re order mcb

* fix query port mc

* fix mom

* fix pc

* pc add http port

* add api and http port

* change naming to http from web admin

* api port

* http

* pc2

* add query raw

* list cluster config

* servercfgparse

* update avserver

* tidy up steam ports

* more servers completed

* fix sb

* no config file

* no config file

* add emserver config install

* codacy

* add legacy vars

* add more legacy

* add xmllint

* mta xmllint

* codacy

* codacy
Daniel Gibbs %!s(int64=3) %!d(string=hai) anos
pai
achega
40757ae9b5
Modificáronse 49 ficheiros con 3411 adicións e 2541 borrados
  1. 74 0
      .github/workflows/details-check.yml
  2. 25 0
      .github/workflows/detals-check-generate-matrix.sh
  3. 1 1
      lgsm/config-default/config-lgsm/kf2server/_default.cfg
  4. 1 2
      lgsm/config-default/config-lgsm/momserver/_default.cfg
  5. 2 2
      lgsm/config-default/config-lgsm/necserver/_default.cfg
  6. 4 4
      lgsm/config-default/config-lgsm/ns2cserver/_default.cfg
  7. 4 4
      lgsm/config-default/config-lgsm/ns2server/_default.cfg
  8. 1 1
      lgsm/config-default/config-lgsm/pc2server/_default.cfg
  9. 1 1
      lgsm/config-default/config-lgsm/pcserver/_default.cfg
  10. 3 3
      lgsm/config-default/config-lgsm/pstbsserver/_default.cfg
  11. 0 2
      lgsm/config-default/config-lgsm/sbotsserver/_default.cfg
  12. 5 5
      lgsm/config-default/config-lgsm/stserver/_default.cfg
  13. 2 2
      lgsm/config-default/config-lgsm/vhserver/_default.cfg
  14. 2 2
      lgsm/data/almalinux-8.csv
  15. 2 2
      lgsm/data/almalinux-9.csv
  16. 2 2
      lgsm/data/centos-7.csv
  17. 2 2
      lgsm/data/centos-8.csv
  18. 2 2
      lgsm/data/centos-9.csv
  19. 2 2
      lgsm/data/debian-10.csv
  20. 2 2
      lgsm/data/debian-11.csv
  21. 2 2
      lgsm/data/debian-9.csv
  22. 2 2
      lgsm/data/rhel-7.csv
  23. 2 2
      lgsm/data/rhel-8.csv
  24. 2 2
      lgsm/data/rhel-9.csv
  25. 2 2
      lgsm/data/rocky-8.csv
  26. 2 2
      lgsm/data/rocky-9.csv
  27. 1 1
      lgsm/data/ubuntu-16.04.csv
  28. 2 2
      lgsm/data/ubuntu-18.04.csv
  29. 2 2
      lgsm/data/ubuntu-20.04.csv
  30. 2 2
      lgsm/data/ubuntu-21.04.csv
  31. 2 2
      lgsm/data/ubuntu-21.10.csv
  32. 2 2
      lgsm/data/ubuntu-22.04.csv
  33. 26 0
      lgsm/functions/check_logs.sh
  34. 21 0
      lgsm/functions/check_root.sh
  35. 145 145
      lgsm/functions/core_functions.sh
  36. 816 0
      lgsm/functions/core_modules copy.sh
  37. 4 4
      lgsm/modules/check_ip.sh
  38. 94 0
      lgsm/modules/command_dev_details.sh
  39. 33 38
      lgsm/modules/command_dev_query_raw.sh
  40. 3 2
      lgsm/modules/command_sponsor.sh
  41. 24 0
      lgsm/modules/core_legacy.sh
  42. 5 0
      lgsm/modules/core_modules.sh
  43. 3 1
      lgsm/modules/fix_cmw.sh
  44. 2 2
      lgsm/modules/fix_ro.sh
  45. 1989 2196
      lgsm/modules/info_game.sh
  46. 75 81
      lgsm/modules/info_messages.sh
  47. 3 0
      lgsm/modules/install_config.sh
  48. 7 7
      package-lock.json
  49. 1 1
      package.json

+ 74 - 0
.github/workflows/details-check.yml

@@ -0,0 +1,74 @@
+name: Details Check
+# This action will check that LinuxGSM is picking up game server config and parameter variables.
+on:
+  workflow_dispatch:
+  push:
+
+jobs:
+  create-matrix:
+    runs-on: ubuntu-latest
+    outputs:
+      matrix: ${{ steps.set-matrix.outputs.matrix }}
+    steps:
+      - name: Checkout
+        uses: actions/checkout@v3
+
+      - name: Generate matrix with generate-matrix.sh
+        run: chmod +x .github/workflows/detals-check-generate-matrix.sh; .github/workflows/detals-check-generate-matrix.sh
+
+      - id: set-matrix
+        run: |
+          shortnamearray=$(cat shortnamearray.json)
+          echo "${shortnamearray}"
+          echo -n "matrix=${shortnamearray}" >> $GITHUB_OUTPUT
+
+  details-check:
+    needs: create-matrix
+    continue-on-error: true
+    runs-on: ubuntu-latest
+
+    strategy:
+      matrix: ${{ fromJSON(needs.create-matrix.outputs.matrix) }}
+
+    steps:
+      - name: Install dependencies
+        run: sudo apt-get install libxml2-utils jq
+
+      - name: Download linuxgsm.sh
+        run: wget https://raw.githubusercontent.com/GameServerManagers/LinuxGSM/feature/info_game-refactor/linuxgsm.sh; chmod +x linuxgsm.sh
+
+      - name: Grab server
+        run: LGSM_GITHUBBRANCH="feature/info_game-refactor" ./linuxgsm.sh ${{ matrix.shortname }}server
+
+      - name: Enable developer mode
+        run: LGSM_GITHUBBRANCH="feature/info_game-refactor" ./${{ matrix.shortname }}server developer
+
+      - id: sets-servercfgname
+        name: Generate servercfgname
+        run: |
+          servercfg=$(sed -n "/^\<servercfgdefault\>/ { s/.*= *\"\?\([^\"']*\)\"\?/\1/p;q }" lgsm/config-lgsm/${{ matrix.shortname }}server/_default.cfg)
+          echo "servercfgname=$servercfg" >> "$GITHUB_OUTPUT"
+
+      - name: Download config
+        run: |
+          if [ -z "${{ steps.sets-servercfgname.outputs.servercfgname }}" ]; then
+            echo "This game server has no config file."
+          else
+            curl -f -o config "https://raw.githubusercontent.com/GameServerManagers/Game-Server-Configs/rename/${{ matrix.shortname }}/${{ steps.sets-servercfgname.outputs.servercfgname }}"
+          fi
+      - name: Display config
+        run: |
+          if [ -z "${{ steps.sets-servercfgname.outputs.servercfgname }}" ]; then
+            echo "This game server has no config file."
+          else
+            cat config
+          fi
+
+      - name: Display parameters
+        run: grep "startparameters" lgsm/config-default/config-lgsm/${{ matrix.shortname }}server/_default.cfg
+
+      - name: Detect details
+        run: LGSM_GITHUBBRANCH="feature/info_game-refactor" ./${{ matrix.shortname }}server detect-details
+
+      - name: Query Raw
+        run: LGSM_GITHUBBRANCH="feature/info_game-refactor" ./${{ matrix.shortname }}server query-raw

+ 25 - 0
.github/workflows/detals-check-generate-matrix.sh

@@ -0,0 +1,25 @@
+#!/bin/bash
+
+curl "https://raw.githubusercontent.com/GameServerManagers/LinuxGSM/master/lgsm/data/serverlist.csv" | grep -v '^[[:blank:]]*$' > serverlist.csv
+
+echo -n "{" > "shortnamearray.json"
+echo -n "\"include\":[" >> "shortnamearray.json"
+
+while read -r line; do
+	shortname=$(echo "$line" | awk -F, '{ print $1 }')
+	export shortname
+	servername=$(echo "$line" | awk -F, '{ print $2 }')
+	export servername
+	gamename=$(echo "$line" | awk -F, '{ print $3 }')
+	export gamename
+	distro=$(echo "$line" | awk -F, '{ print $4 }')
+	export distro
+	echo -n "{" >> "shortnamearray.json"
+	echo -n "\"shortname\":" >> "shortnamearray.json"
+	echo -n "\"${shortname}\"" >> "shortnamearray.json"
+	echo -n "}," >> "shortnamearray.json"
+done < serverlist.csv
+sed -i '$ s/.$//' "shortnamearray.json"
+echo -n "]" >> "shortnamearray.json"
+echo -n "}" >> "shortnamearray.json"
+rm serverlist.csv

+ 1 - 1
lgsm/config-default/config-lgsm/kf2server/_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

+ 1 - 2
lgsm/config-default/config-lgsm/momserver/_default.cfg

@@ -12,10 +12,9 @@
 ip="0.0.0.0"
 port="7777"
 beaconport="15000"
-maxplayers="32"
 
 ## Server Parameters | https://docs.linuxgsm.com/configuration/start-parameters#additional-parameters
-startparameters="-port="${port}" -beaconport="${beaconport}" -MULTIHOME="${ip}" -maxplayers=${maxplayers}"
+startparameters="-port="${port}" -beaconport="${beaconport}" -MULTIHOME="${ip}""
 
 #### LinuxGSM Settings ####
 

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

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

+ 4 - 4
lgsm/config-default/config-lgsm/ns2cserver/_default.cfg

@@ -14,9 +14,9 @@ port="27015"
 defaultmap="co_core"
 maxplayers="24"
 servername="LinuxGSM Server"
-webadminuser="admin"
-webadminpass="admin"
-webadminport="8080"
+httpuser="admin"
+httppassword="admin"
+httpport="8080"
 mods=""
 serverpassword=""
 # Add the following line to the parms if you want a private server. Ensuring
@@ -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}\" -modstorage \"${modstoragedir}\" -mods \"${mods}\""
+startparameters="-name \"${servername}\" -port ${port} -webinterface -webdomain ${ip} -webuser ${httpuser} -webpassword \"${httppassword}\" -webport ${httpport} -map ${defaultmap} -limit ${maxplayers} -config_path \"${servercfgdir}\" -modstorage \"${modstoragedir}\" -mods \"${mods}\""
 
 #### LinuxGSM Settings ####
 

+ 4 - 4
lgsm/config-default/config-lgsm/ns2server/_default.cfg

@@ -14,9 +14,9 @@ port="27015"
 defaultmap="ns2_summit"
 maxplayers="24"
 servername="LinuxGSM Server"
-webadminuser="admin"
-webadminpass="admin"
-webadminport="8080"
+httpuser="admin"
+httppassword="admin"
+httpport="8080"
 mods=""
 serverpassword=""
 # Add the following line to the parms if you want a private server. Ensuring
@@ -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}\" -mods2 \"${mods}\""
+startparameters="-name \"${servername}\" -port ${port} -webinterface -webdomain ${ip} -webuser ${httpuser} -webpassword \"${httppassword}\" -webport ${httpport} -map ${defaultmap} -limit ${maxplayers} -config_path \"${servercfgdir}\" -logdir \"${gamelogdir}\" -modstorage \"${modstoragedir}\" -mods2 \"${mods}\""
 
 #### LinuxGSM Settings ####
 

+ 1 - 1
lgsm/config-default/config-lgsm/pc2server/_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

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

@@ -115,7 +115,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

+ 3 - 3
lgsm/config-default/config-lgsm/pstbsserver/_default.cfg

@@ -10,15 +10,15 @@
 
 ## Predefined Parameters | https://docs.linuxgsm.com/configuration/start-parameters
 ip="0.0.0.0"
+maxplayers="40"
 port="10027"
 queryport="10037"
-rconport="21114"
 randommap="NONE"
-maxplayers="40"
 reservedslots="0"
+tickrate="50"
 
 ## Server Parameters | https://docs.linuxgsm.com/configuration/start-parameters#additional-parameters
-startparameters="MULTIHOME=${ip} RANDOM=${randommap} Port=${port} QueryPort=${queryport} RCONPORT=${rconport} FIXEDMAXPLAYERS=${maxplayers} NumReservedSlots=${reservedslots}"
+startparameters="MULTIHOME=${ip} RANDOM=${randommap} Port=${port} QueryPort=${queryport} FIXEDMAXPLAYERS=${maxplayers} FIXEDMAXTICKRATE=${tickrate} NumReservedSlots=${reservedslots}"
 
 #### LinuxGSM Settings ####
 

+ 0 - 2
lgsm/config-default/config-lgsm/sbotsserver/_default.cfg

@@ -13,8 +13,6 @@ port="7777"
 queryport="27015"
 defaultmap="StationKappa"
 servername="LinuxGSM Server"
-serverpassword="NOT SET" # Can't be adjusted currently
-maxplayers="8"           # Can't be adjusted currently
 
 ## Server Parameters | https://docs.linuxgsm.com/configuration/start-parameters#additional-parameters
 startparameters="Port=${port}?QueryPort=${queryport} -startup_map ${defaultmap} -server_name \"${servername}\""

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

@@ -10,17 +10,17 @@
 
 ## Predefined Parameters | https://docs.linuxgsm.com/configuration/start-parameters
 ip="0.0.0.0"
-servername="LinuxGSM"
+maxplayers="10"
 port="27500"
 queryport="27015"
-worldtype="Moon"
-maxplayers="10"
-autosaveinterval=300
+saveinterval="300"
+servername="LinuxGSM"
 worldname="moon_save"
+worldtype="Moon"
 
 ## Server Parameters | https://docs.linuxgsm.com/configuration/start-parameters#additional-parameters
 # Edit with care
-startparameters="-LOADLATEST ${worldname} ${worldtype} -settings ServerName ${servername} StartLocalHost true ServerVisible true ServerMaxPlayers ${maxplayers} GamePort ${port} UpdatePort ${queryport} UPNPEnabled true AutoSave true SaveInterval ${autosaveinterval}"
+startparameters="-LOADLATEST ${worldname} ${worldtype} -settings ServerName ${servername} StartLocalHost true ServerVisible true ServerMaxPlayers ${maxplayers} GamePort ${port} UpdatePort ${queryport} UPNPEnabled true AutoSave true SaveInterval ${saveinterval}"
 
 #### LinuxGSM Settings ####
 

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

@@ -13,7 +13,7 @@ servername="Valheim Server"
 # Minimum password length is 5.
 serverpassword=""
 port="2456"
-gameworld="${selfname}"
+worldname="${selfname}"
 public="1"
 savedir="$HOME/.config/unity3d/IronGate/Valheim"
 logFile=""
@@ -26,7 +26,7 @@ backuplong="43200"
 crossplay=""
 
 ## Server Parameters | https://docs.linuxgsm.com/configuration/start-parameters#additional-parameters
-startparameters="-name '${servername}' -password ${serverpassword} -port ${port} -world ${gameworld} -public ${public} -savedir '${savedir}' -logFile '${logFile}' -saveinterval ${saveinterval} -backups ${backups} -backupshort ${backupshort} -backuplong ${backuplong} ${crossplay:+-crossplay}"
+startparameters="-name '${servername}' -password ${serverpassword} -port ${port} -world ${worldname} -public ${public} -savedir '${savedir}' -logFile '${logFile}' -saveinterval ${saveinterval} -backups ${backups} -backupshort ${backupshort} -backuplong ${backuplong} ${crossplay:+-crossplay}"
 
 #### LinuxGSM Settings ####
 

+ 2 - 2
lgsm/data/almalinux-8.csv

@@ -68,7 +68,7 @@ mcb,libnsl
 mh
 mohaa,compat-libstdc++-33.i686
 mom
-mta,ncurses-compat-libs
+mta,ncurses-compat-libs,libxml2
 nd
 nec
 nmrih,ncurses-libs.i686
@@ -97,7 +97,7 @@ sb
 sbots
 scpsl
 scpslsm
-sdtd,telnet,expect
+sdtd,telnet,expect,libxml2
 sf
 sfc,ncurses-libs.i686
 sof2

+ 2 - 2
lgsm/data/almalinux-9.csv

@@ -68,7 +68,7 @@ mcb,libnsl
 mh
 mohaa,compat-libstdc++-33.i686
 mom
-mta,ncurses-compat-libs
+mta,ncurses-compat-libs,libxml2
 nd
 nec
 nmrih,ncurses-libs.i686
@@ -97,7 +97,7 @@ sb
 sbots
 scpsl
 scpslsm
-sdtd,telnet,expect
+sdtd,telnet,expect,libxml2
 sf
 sfc,ncurses-libs.i686
 sof2

+ 2 - 2
lgsm/data/centos-7.csv

@@ -68,7 +68,7 @@ mcb,libnsl
 mh
 mohaa,compat-libstdc++-33.i686
 mom
-mta,ncurses-libs
+mta,ncurses-libs,libxml2
 nd
 nec
 nmrih,ncurses-libs.i686
@@ -97,7 +97,7 @@ sb
 sbots
 scpsl
 scpslsm
-sdtd,telnet,expect
+sdtd,telnet,expect,libxml2
 sf
 sfc,ncurses-libs.i686
 sof2

+ 2 - 2
lgsm/data/centos-8.csv

@@ -68,7 +68,7 @@ mcb,libnsl
 mh
 mohaa,compat-libstdc++-33.i686
 mom
-mta,ncurses-compat-libs
+mta,ncurses-compat-libs,libxml2
 nd
 nec
 nmrih,ncurses-libs.i686
@@ -97,7 +97,7 @@ sb
 sbots
 scpsl
 scpslsm
-sdtd,telnet,expect
+sdtd,telnet,expect,libxml2
 sf
 sfc,ncurses-libs.i686
 sof2

+ 2 - 2
lgsm/data/centos-9.csv

@@ -68,7 +68,7 @@ mcb,libnsl
 mh
 mohaa,compat-libstdc++-33.i686
 mom
-mta,ncurses-compat-libs
+mta,ncurses-compat-libs,libxml2
 nd
 nec
 nmrih,ncurses-libs.i686
@@ -97,7 +97,7 @@ sb
 sbots
 scpsl
 scpslsm
-sdtd,telnet,expect
+sdtd,telnet,expect,libxml2
 sf
 sfc,ncurses-libs.i686
 sof2

+ 2 - 2
lgsm/data/debian-10.csv

@@ -68,7 +68,7 @@ mcb
 mh
 mohaa,libstdc++5:i386
 mom
-mta,libncursesw5
+mta,libncursesw5,libxml2-utils
 nd
 nec
 nmrih,libtinfo5:i386
@@ -97,7 +97,7 @@ sb
 sbots
 scpsl,mono-complete
 scpslsm,mono-complete
-sdtd,telnet,expect
+sdtd,telnet,expect,libxml2-utils
 sf
 sfc,libtinfo5:i386
 sof2

+ 2 - 2
lgsm/data/debian-11.csv

@@ -68,7 +68,7 @@ mcb
 mh
 mohaa,libstdc++5:i386
 mom
-mta,libncursesw5
+mta,libncursesw5,libxml2-utils
 nd
 nec
 nmrih,libtinfo5:i386
@@ -97,7 +97,7 @@ sb
 sbots
 scpsl,mono-complete
 scpslsm,mono-complete
-sdtd,telnet,expect
+sdtd,telnet,expect,libxml2-utils
 sf
 sfc,libtinfo5:i386
 sof2

+ 2 - 2
lgsm/data/debian-9.csv

@@ -68,7 +68,7 @@ mcb
 mh
 mohaa,libstdc++5:i386
 mom
-mta,libncursesw5
+mta,libncursesw5,libxml2-utils
 nd
 nec
 nmrih,libtinfo5:i386
@@ -97,7 +97,7 @@ sb
 sbots
 scpsl,mono-complete
 scpslsm,mono-complete
-sdtd,telnet,expect
+sdtd,telnet,expect,libxml2-utils
 sf
 sfc,libtinfo5:i386
 sof2

+ 2 - 2
lgsm/data/rhel-7.csv

@@ -68,7 +68,7 @@ mcb,libnsl
 mh
 mohaa,compat-libstdc++-33.i686
 mom
-mta,ncurses-libs
+mta,ncurses-libs,libxml2
 nd
 nec
 nmrih,ncurses-libs.i686
@@ -97,7 +97,7 @@ sb
 sbots
 scpsl
 scpslsm
-sdtd,telnet,expect
+sdtd,telnet,expect,libxml2
 sf
 sfc,ncurses-libs.i686
 sof2

+ 2 - 2
lgsm/data/rhel-8.csv

@@ -68,7 +68,7 @@ mcb,libnsl
 mh
 mohaa,compat-libstdc++-33.i686
 mom
-mta,ncurses-compat-libs
+mta,ncurses-compat-libs,libxml2
 nd
 nec
 nmrih,ncurses-libs.i686
@@ -97,7 +97,7 @@ sb
 sbots
 scpsl
 scpslsm
-sdtd,telnet,expect
+sdtd,telnet,expect,libxml2
 sf
 sfc,ncurses-libs.i686
 sof2

+ 2 - 2
lgsm/data/rhel-9.csv

@@ -68,7 +68,7 @@ mcb,libnsl
 mh
 mohaa,compat-libstdc++-33.i686
 mom
-mta,ncurses-compat-libs
+mta,ncurses-compat-libs,libxml2
 nd
 nec
 nmrih,ncurses-libs.i686
@@ -97,7 +97,7 @@ sb
 sbots
 scpsl
 scpslsm
-sdtd,telnet,expect
+sdtd,telnet,expect,libxml2
 sf
 sfc,ncurses-libs.i686
 sof2

+ 2 - 2
lgsm/data/rocky-8.csv

@@ -68,7 +68,7 @@ mcb,libnsl
 mh
 mohaa,compat-libstdc++-33.i686
 mom
-mta,ncurses-compat-libs
+mta,ncurses-compat-libs,libxml2
 nd
 nec
 nmrih,ncurses-libs.i686
@@ -97,7 +97,7 @@ sb
 sbots
 scpsl
 scpslsm
-sdtd,telnet,expect
+sdtd,telnet,expect,libxml2
 sf
 sfc,ncurses-libs.i686
 sof2

+ 2 - 2
lgsm/data/rocky-9.csv

@@ -68,7 +68,7 @@ mcb,libnsl
 mh
 mohaa,compat-libstdc++-33.i686
 mom
-mta,ncurses-compat-libs
+mta,ncurses-compat-libs,libxml2
 nd
 nec
 nmrih,ncurses-libs.i686
@@ -97,7 +97,7 @@ sb
 sbots
 scpsl
 scpslsm
-sdtd,telnet,expect
+sdtd,telnet,expect,libxml2
 sf
 sfc,ncurses-libs.i686
 sof2

+ 1 - 1
lgsm/data/ubuntu-16.04.csv

@@ -97,7 +97,7 @@ sb
 sbots
 scpsl,mono-complete
 scpslsm,mono-complete
-sdtd,telnet,expect
+sdtd,telnet,expect,libxml2-utils
 sf
 sfc,libtinfo5:i386
 sof2

+ 2 - 2
lgsm/data/ubuntu-18.04.csv

@@ -68,7 +68,7 @@ mcb
 mh
 mohaa,libstdc++5:i386
 mom
-mta,libncursesw5
+mta,libncursesw5,libxml2-utils
 nd
 nec
 nmrih,libtinfo5:i386
@@ -97,7 +97,7 @@ sb
 sbots
 scpsl,mono-complete
 scpslsm,mono-complete
-sdtd,telnet,expect
+sdtd,telnet,expect,libxml2-utils
 sf
 sfc,libtinfo5:i386
 sof2

+ 2 - 2
lgsm/data/ubuntu-20.04.csv

@@ -68,7 +68,7 @@ mcb
 mh
 mohaa,libstdc++5:i386
 mom
-mta,libncursesw5
+mta,libncursesw5,libxml2-utils
 nd
 nec
 nmrih,libtinfo5:i386
@@ -97,7 +97,7 @@ sb
 sbots
 scpsl,mono-complete
 scpslsm,mono-complete
-sdtd,telnet,expect
+sdtd,telnet,expect,libxml2-utils
 sf
 sfc,libtinfo5:i386
 sof2

+ 2 - 2
lgsm/data/ubuntu-21.04.csv

@@ -68,7 +68,7 @@ mcb
 mh
 mohaa,libstdc++5:i386
 mom
-mta,libncursesw5
+mta,libncursesw5,libxml2-utils
 nd
 nec
 nmrih,libtinfo5:i386
@@ -97,7 +97,7 @@ sb
 sbots
 scpsl,mono-complete
 scpslsm,mono-complete
-sdtd,telnet,expect
+sdtd,telnet,expect,libxml2-utils
 sf
 sfc,libtinfo5:i386
 sof2

+ 2 - 2
lgsm/data/ubuntu-21.10.csv

@@ -66,7 +66,7 @@ mcb
 mh
 mohaa,libstdc++5:i386
 mom
-mta,libncursesw5
+mta,libncursesw5,libxml2-utils
 nd
 nec
 nmrih,libtinfo5:i386
@@ -95,7 +95,7 @@ sb
 sbots
 scpsl,mono-complete
 scpslsm,mono-complete
-sdtd,telnet,expect
+sdtd,telnet,expect,libxml2-utils
 sf
 sfc,libtinfo5:i386
 sof2

+ 2 - 2
lgsm/data/ubuntu-22.04.csv

@@ -68,7 +68,7 @@ mcb
 mh
 mohaa,libstdc++5:i386
 mom
-mta,libncursesw5
+mta,libncursesw5,libxml2-utils
 nd
 nec
 nmrih,libtinfo5:i386
@@ -97,7 +97,7 @@ sb
 sbots
 scpsl,mono-complete
 scpslsm,mono-complete
-sdtd,telnet,expect
+sdtd,telnet,expect,libxml2-utils
 sf
 sfc,libtinfo5:i386
 sof2

+ 26 - 0
lgsm/functions/check_logs.sh

@@ -0,0 +1,26 @@
+#!/bin/bash
+# LinuxGSM check_logs.sh module
+# Author: Daniel Gibbs
+# Contributors: http://linuxgsm.com/contrib
+# Website: https://linuxgsm.com
+# Description: Checks if log files exist.
+
+moduleselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")"
+
+fn_check_logs() {
+	fn_print_dots "Checking for log files"
+	fn_print_info_nl "Checking for log files: Creating log files"
+	checklogs=1
+	install_logs.sh
+}
+
+# Create directories for the script and console logs.
+if [ ! -d "${lgsmlogdir}" ] || [ ! -d "${consolelogdir}" ]; then
+	fn_check_logs
+fi
+
+# Create gamelogdir.
+# If variable exists gamelogdir exists and log/server does not.
+if [ "${gamelogdir}" ] && [ -d "${gamelogdir}" ] && [ ! -d "${logdir}/server" ]; then
+	fn_check_logs
+fi

+ 21 - 0
lgsm/functions/check_root.sh

@@ -0,0 +1,21 @@
+#!/bin/bash
+# LinuxGSM check_root.sh module
+# Author: Daniel Gibbs
+# Contributors: http://linuxgsm.com/contrib
+# Website: https://linuxgsm.com
+# Description: Checks if the user tried to run the script as root.
+
+moduleselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")"
+
+if [ "$(whoami)" == "root" ] && [ ! -f /.dockerenv ]; then
+	if [ "${commandname}" != "INSTALL" ]; 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
+fi

+ 145 - 145
lgsm/functions/core_functions.sh

@@ -41,653 +41,653 @@ core_legacy.sh() {
 
 core_exit.sh() {
 	functionfile="${FUNCNAME[0]}"
-	fn_fetch_function
+	fn_fetch_module
 }
 
 core_getopt.sh() {
 	functionfile="${FUNCNAME[0]}"
-	fn_fetch_function
+	fn_fetch_module
 }
 
 core_trap.sh() {
 	functionfile="${FUNCNAME[0]}"
-	fn_fetch_function
+	fn_fetch_module
 }
 
 core_steamcmd.sh() {
 	functionfile="${FUNCNAME[0]}"
-	fn_fetch_function
+	fn_fetch_module
 }
 
 core_github.sh() {
 	functionfile="${FUNCNAME[0]}"
-	fn_fetch_function
+	fn_fetch_module
 }
 
 # Commands
 
 command_backup.sh() {
 	functionfile="${FUNCNAME[0]}"
-	fn_fetch_function
+	fn_fetch_module
 }
 
 command_console.sh() {
 	functionfile="${FUNCNAME[0]}"
-	fn_fetch_function
+	fn_fetch_module
 }
 
 command_debug.sh() {
 	functionfile="${FUNCNAME[0]}"
-	fn_fetch_function
+	fn_fetch_module
 }
 
 command_details.sh() {
 	functionfile="${FUNCNAME[0]}"
-	fn_fetch_function
+	fn_fetch_module
 }
 
 command_sponsor.sh() {
 	functionfile="${FUNCNAME[0]}"
-	fn_fetch_function
+	fn_fetch_module
 }
 
 command_postdetails.sh() {
 	functionfile="${FUNCNAME[0]}"
-	fn_fetch_function
+	fn_fetch_module
 }
 
 command_test_alert.sh() {
 	functionfile="${FUNCNAME[0]}"
-	fn_fetch_function
+	fn_fetch_module
 }
 
 command_monitor.sh() {
 	functionfile="${FUNCNAME[0]}"
-	fn_fetch_function
+	fn_fetch_module
 }
 
 command_start.sh() {
 	functionfile="${FUNCNAME[0]}"
-	fn_fetch_function
+	fn_fetch_module
 }
 
 command_stop.sh() {
 	functionfile="${FUNCNAME[0]}"
-	fn_fetch_function
+	fn_fetch_module
 }
 
 command_validate.sh() {
 	functionfile="${FUNCNAME[0]}"
-	fn_fetch_function
+	fn_fetch_module
 }
 
 command_install.sh() {
 	functionfile="${FUNCNAME[0]}"
-	fn_fetch_function
+	fn_fetch_module
 }
 
 command_install_resources_mta.sh() {
 	functionfile="${FUNCNAME[0]}"
-	fn_fetch_function
+	fn_fetch_module
 }
 
 install_squad_license.sh() {
 	functionfile="${FUNCNAME[0]}"
-	fn_fetch_function
+	fn_fetch_module
 }
 
 command_mods_install.sh() {
 	functionfile="${FUNCNAME[0]}"
-	fn_fetch_function
+	fn_fetch_module
 }
 
 command_mods_update.sh() {
 	functionfile="${FUNCNAME[0]}"
-	fn_fetch_function
+	fn_fetch_module
 }
 
 command_mods_remove.sh() {
 	functionfile="${FUNCNAME[0]}"
-	fn_fetch_function
+	fn_fetch_module
 }
 
 command_fastdl.sh() {
 	functionfile="${FUNCNAME[0]}"
-	fn_fetch_function
+	fn_fetch_module
 }
 
 command_ts3_server_pass.sh() {
 	functionfile="${FUNCNAME[0]}"
-	fn_fetch_function
+	fn_fetch_module
 }
 
 command_restart.sh() {
 	functionfile="${FUNCNAME[0]}"
-	fn_fetch_function
+	fn_fetch_module
 }
 
 command_skeleton.sh() {
 	functionfile="${FUNCNAME[0]}"
-	fn_fetch_function
+	fn_fetch_module
 }
 
 command_wipe.sh() {
 	functionfile="${FUNCNAME[0]}"
-	fn_fetch_function
+	fn_fetch_module
 }
 
 command_send.sh() {
 	functionfile="${FUNCNAME[0]}"
-	fn_fetch_function
+	fn_fetch_module
 }
 
 # Checks
 
 check.sh() {
 	functionfile="${FUNCNAME[0]}"
-	fn_fetch_function
+	fn_fetch_module
 }
 
 check_config.sh() {
 	functionfile="${FUNCNAME[0]}"
-	fn_fetch_function
+	fn_fetch_module
 }
 
 check_deps.sh() {
 	functionfile="${FUNCNAME[0]}"
-	fn_fetch_function
+	fn_fetch_module
 }
 
 check_executable.sh() {
 	functionfile="${FUNCNAME[0]}"
-	fn_fetch_function
+	fn_fetch_module
 }
 
 check_glibc.sh() {
 	functionfile="${FUNCNAME[0]}"
-	fn_fetch_function
+	fn_fetch_module
 }
 
 check_ip.sh() {
 	functionfile="${FUNCNAME[0]}"
-	fn_fetch_function
+	fn_fetch_module
 }
 
 check_last_update.sh() {
 	functionfile="${FUNCNAME[0]}"
-	fn_fetch_function
+	fn_fetch_module
 }
 
 check_logs.sh() {
 	functionfile="${FUNCNAME[0]}"
-	fn_fetch_function
+	fn_fetch_module
 }
 
 check_permissions.sh() {
 	functionfile="${FUNCNAME[0]}"
-	fn_fetch_function
+	fn_fetch_module
 }
 
 check_root.sh() {
 	functionfile="${FUNCNAME[0]}"
-	fn_fetch_function
+	fn_fetch_module
 }
 
 check_status.sh() {
 	functionfile="${FUNCNAME[0]}"
-	fn_fetch_function
+	fn_fetch_module
 }
 
 check_steamcmd.sh() {
 	functionfile="${FUNCNAME[0]}"
-	fn_fetch_function
+	fn_fetch_module
 }
 
 check_system_dir.sh() {
 	functionfile="${FUNCNAME[0]}"
-	fn_fetch_function
+	fn_fetch_module
 }
 
 check_system_requirements.sh() {
 	functionfile="${FUNCNAME[0]}"
-	fn_fetch_function
+	fn_fetch_module
 }
 
 check_tmuxception.sh() {
 	functionfile="${FUNCNAME[0]}"
-	fn_fetch_function
+	fn_fetch_module
 }
 
 check_version.sh() {
 	functionfile="${FUNCNAME[0]}"
-	fn_fetch_function
+	fn_fetch_module
 }
 
 # Compress
 
 compress_unreal2_maps.sh() {
 	functionfile="${FUNCNAME[0]}"
-	fn_fetch_function
+	fn_fetch_module
 }
 
 compress_ut99_maps.sh() {
 	functionfile="${FUNCNAME[0]}"
-	fn_fetch_function
+	fn_fetch_module
 }
 
 # Mods
 
 mods_list.sh() {
 	functionfile="${FUNCNAME[0]}"
-	fn_fetch_function
+	fn_fetch_module
 }
 
 mods_core.sh() {
 	functionfile="${FUNCNAME[0]}"
-	fn_fetch_function
+	fn_fetch_module
 }
 
 # Dev
 
 command_dev_clear_functions.sh() {
 	functionfile="${FUNCNAME[0]}"
-	fn_fetch_function
+	fn_fetch_module
 }
 
 command_dev_debug.sh() {
 	functionfile="${FUNCNAME[0]}"
-	fn_fetch_function
+	fn_fetch_module
 }
 
 command_dev_detect_deps.sh() {
 	functionfile="${FUNCNAME[0]}"
-	fn_fetch_function
+	fn_fetch_module
 }
 
 command_dev_detect_glibc.sh() {
 	functionfile="${FUNCNAME[0]}"
-	fn_fetch_function
+	fn_fetch_module
 }
 
 command_dev_detect_ldd.sh() {
 	functionfile="${FUNCNAME[0]}"
-	fn_fetch_function
+	fn_fetch_module
 }
 
 command_dev_query_raw.sh() {
 	functionfile="${FUNCNAME[0]}"
-	fn_fetch_function
+	fn_fetch_module
 }
 
 # Fix
 
 fix.sh() {
 	functionfile="${FUNCNAME[0]}"
-	fn_fetch_function
+	fn_fetch_module
 }
 
 fix_ark.sh() {
 	functionfile="${FUNCNAME[0]}"
-	fn_fetch_function
+	fn_fetch_module
 }
 
 fix_av.sh() {
 	functionfile="${FUNCNAME[0]}"
-	fn_fetch_function
+	fn_fetch_module
 }
 
 fix_arma3.sh() {
 	functionfile="${FUNCNAME[0]}"
-	fn_fetch_function
+	fn_fetch_module
 }
 
 fix_armar.sh() {
 	functionfile="${FUNCNAME[0]}"
-	fn_fetch_function
+	fn_fetch_module
 }
 
 fix_bt.sh() {
 	functionfile="${FUNCNAME[0]}"
-	fn_fetch_function
+	fn_fetch_module
 }
 
 fix_bo.sh() {
 	functionfile="${FUNCNAME[0]}"
-	fn_fetch_function
+	fn_fetch_module
 }
 
 fix_cmw.sh() {
 	functionfile="${FUNCNAME[0]}"
-	fn_fetch_function
+	fn_fetch_module
 }
 
 fix_csgo.sh() {
 	functionfile="${FUNCNAME[0]}"
-	fn_fetch_function
+	fn_fetch_module
 }
 
 fix_dst.sh() {
 	functionfile="${FUNCNAME[0]}"
-	fn_fetch_function
+	fn_fetch_module
 }
 
 fix_hw.sh() {
 	functionfile="${FUNCNAME[0]}"
-	fn_fetch_function
+	fn_fetch_module
 }
 
 fix_ins.sh() {
 	functionfile="${FUNCNAME[0]}"
-	fn_fetch_function
+	fn_fetch_module
 }
 
 fix_kf.sh() {
 	functionfile="${FUNCNAME[0]}"
-	fn_fetch_function
+	fn_fetch_module
 }
 
 fix_kf2.sh() {
 	functionfile="${FUNCNAME[0]}"
-	fn_fetch_function
+	fn_fetch_module
 }
 
 fix_lo.sh() {
 	functionfile="${FUNCNAME[0]}"
-	fn_fetch_function
+	fn_fetch_module
 }
 
 fix_mcb.sh() {
 	functionfile="${FUNCNAME[0]}"
-	fn_fetch_function
+	fn_fetch_module
 }
 
 fix_mta.sh() {
 	functionfile="${FUNCNAME[0]}"
-	fn_fetch_function
+	fn_fetch_module
 }
 
 fix_nmrih.sh() {
 	functionfile="${FUNCNAME[0]}"
-	fn_fetch_function
+	fn_fetch_module
 }
 
 fix_onset.sh() {
 	functionfile="${FUNCNAME[0]}"
-	fn_fetch_function
+	fn_fetch_module
 }
 
 fix_ro.sh() {
 	functionfile="${FUNCNAME[0]}"
-	fn_fetch_function
+	fn_fetch_module
 }
 
 fix_rust.sh() {
 	functionfile="${FUNCNAME[0]}"
-	fn_fetch_function
+	fn_fetch_module
 }
 
 fix_rw.sh() {
 	functionfile="${FUNCNAME[0]}"
-	fn_fetch_function
+	fn_fetch_module
 }
 
 fix_sfc.sh() {
 	functionfile="${FUNCNAME[0]}"
-	fn_fetch_function
+	fn_fetch_module
 }
 
 fix_st.sh() {
 	functionfile="${FUNCNAME[0]}"
-	fn_fetch_function
+	fn_fetch_module
 }
 
 fix_steamcmd.sh() {
 	functionfile="${FUNCNAME[0]}"
-	fn_fetch_function
+	fn_fetch_module
 }
 
 fix_terraria.sh() {
 	functionfile="${FUNCNAME[0]}"
-	fn_fetch_function
+	fn_fetch_module
 }
 
 fix_tf2.sh() {
 	functionfile="${FUNCNAME[0]}"
-	fn_fetch_function
+	fn_fetch_module
 }
 
 fix_ut3.sh() {
 	functionfile="${FUNCNAME[0]}"
-	fn_fetch_function
+	fn_fetch_module
 }
 
 fix_rust.sh() {
 	functionfile="${FUNCNAME[0]}"
-	fn_fetch_function
+	fn_fetch_module
 }
 
 fix_samp.sh() {
 	functionfile="${FUNCNAME[0]}"
-	fn_fetch_function
+	fn_fetch_module
 }
 
 fix_sdtd.sh() {
 	functionfile="${FUNCNAME[0]}"
-	fn_fetch_function
+	fn_fetch_module
 }
 
 fix_sof2.sh() {
 	functionfile="${FUNCNAME[0]}"
-	fn_fetch_function
+	fn_fetch_module
 }
 
 fix_squad.sh() {
 	functionfile="${FUNCNAME[0]}"
-	fn_fetch_function
+	fn_fetch_module
 }
 
 fix_ts3.sh() {
 	functionfile="${FUNCNAME[0]}"
-	fn_fetch_function
+	fn_fetch_module
 }
 
 fix_ut2k4.sh() {
 	functionfile="${FUNCNAME[0]}"
-	fn_fetch_function
+	fn_fetch_module
 }
 
 fix_ut.sh() {
 	functionfile="${FUNCNAME[0]}"
-	fn_fetch_function
+	fn_fetch_module
 }
 
 fix_unt.sh() {
 	functionfile="${FUNCNAME[0]}"
-	fn_fetch_function
+	fn_fetch_module
 }
 
 fix_vh.sh() {
 	functionfile="${FUNCNAME[0]}"
-	fn_fetch_function
+	fn_fetch_module
 }
 
 fix_wurm.sh() {
 	functionfile="${FUNCNAME[0]}"
-	fn_fetch_function
+	fn_fetch_module
 }
 
 fix_zmr.sh() {
 	functionfile="${FUNCNAME[0]}"
-	fn_fetch_function
+	fn_fetch_module
 }
 
 # Info
 
 info_distro.sh() {
 	functionfile="${FUNCNAME[0]}"
-	fn_fetch_function
+	fn_fetch_module
 }
 
 info_game.sh() {
 	functionfile="${FUNCNAME[0]}"
-	fn_fetch_function
+	fn_fetch_module
 }
 
 info_messages.sh() {
 	functionfile="${FUNCNAME[0]}"
-	fn_fetch_function
+	fn_fetch_module
 }
 
 info_stats.sh() {
 	functionfile="${FUNCNAME[0]}"
-	fn_fetch_function
+	fn_fetch_module
 }
 
 # Alert
 
 alert.sh() {
 	functionfile="${FUNCNAME[0]}"
-	fn_fetch_function
+	fn_fetch_module
 }
 
 alert_discord.sh() {
 	functionfile="${FUNCNAME[0]}"
-	fn_fetch_function
+	fn_fetch_module
 }
 
 alert_email.sh() {
 	functionfile="${FUNCNAME[0]}"
-	fn_fetch_function
+	fn_fetch_module
 }
 
 alert_ifttt.sh() {
 	functionfile="${FUNCNAME[0]}"
-	fn_fetch_function
+	fn_fetch_module
 }
 
 alert_mailgun.sh() {
 	functionfile="${FUNCNAME[0]}"
-	fn_fetch_function
+	fn_fetch_module
 }
 
 alert_pushbullet.sh() {
 	functionfile="${FUNCNAME[0]}"
-	fn_fetch_function
+	fn_fetch_module
 }
 
 alert_pushover.sh() {
 	functionfile="${FUNCNAME[0]}"
-	fn_fetch_function
+	fn_fetch_module
 }
 
 alert_gotify.sh() {
 	functionfile="${FUNCNAME[0]}"
-	fn_fetch_function
+	fn_fetch_module
 }
 
 alert_telegram.sh() {
 	functionfile="${FUNCNAME[0]}"
-	fn_fetch_function
+	fn_fetch_module
 }
 
 alert_rocketchat.sh() {
 	functionfile="${FUNCNAME[0]}"
-	fn_fetch_function
+	fn_fetch_module
 }
 
 alert_slack.sh() {
 	functionfile="${FUNCNAME[0]}"
-	fn_fetch_function
+	fn_fetch_module
 }
 # Logs
 
 core_logs.sh() {
 	functionfile="${FUNCNAME[0]}"
-	fn_fetch_function
+	fn_fetch_module
 }
 
 # Query
 
 query_gamedig.sh() {
 	functionfile="${FUNCNAME[0]}"
-	fn_fetch_function
+	fn_fetch_module
 }
 
 # Update
 
 command_update_functions.sh() {
 	functionfile="${FUNCNAME[0]}"
-	fn_fetch_function
+	fn_fetch_module
 }
 
 command_update_linuxgsm.sh() {
 	functionfile="${FUNCNAME[0]}"
-	fn_fetch_function
+	fn_fetch_module
 }
 
 command_update.sh() {
 	functionfile="${FUNCNAME[0]}"
-	fn_fetch_function
+	fn_fetch_module
 }
 
 command_check_update.sh() {
 	functionfile="${FUNCNAME[0]}"
-	fn_fetch_function
+	fn_fetch_module
 }
 
 update_ts3.sh() {
 	functionfile="${FUNCNAME[0]}"
-	fn_fetch_function
+	fn_fetch_module
 }
 
 update_minecraft.sh() {
 	functionfile="${FUNCNAME[0]}"
-	fn_fetch_function
+	fn_fetch_module
 }
 
 update_minecraft_bedrock.sh() {
 	functionfile="${FUNCNAME[0]}"
-	fn_fetch_function
+	fn_fetch_module
 }
 
 update_papermc.sh() {
 	functionfile="${FUNCNAME[0]}"
-	fn_fetch_function
+	fn_fetch_module
 }
 
 update_mta.sh() {
 	functionfile="${FUNCNAME[0]}"
-	fn_fetch_function
+	fn_fetch_module
 }
 
 update_factorio.sh() {
 	functionfile="${FUNCNAME[0]}"
-	fn_fetch_function
+	fn_fetch_module
 }
 
 update_jediknight2.sh() {
 	functionfile="${FUNCNAME[0]}"
-	fn_fetch_function
+	fn_fetch_module
 }
 
 update_steamcmd.sh() {
 	functionfile="${FUNCNAME[0]}"
-	fn_fetch_function
+	fn_fetch_module
 }
 
 update_vintagestory.sh() {
 	functionfile="${FUNCNAME[0]}"
-	fn_fetch_function
+	fn_fetch_module
 }
 
 update_ut99.sh() {
 	functionfile="${FUNCNAME[0]}"
-	fn_fetch_function
+	fn_fetch_module
 }
 
 fn_update_functions.sh() {
 	functionfile="${FUNCNAME[0]}"
-	fn_fetch_function
+	fn_fetch_module
 }
 
 #
@@ -701,96 +701,96 @@ fn_autoinstall() {
 
 install_complete.sh() {
 	functionfile="${FUNCNAME[0]}"
-	fn_fetch_function
+	fn_fetch_module
 }
 
 install_config.sh() {
 	functionfile="${FUNCNAME[0]}"
-	fn_fetch_function
+	fn_fetch_module
 }
 
 install_factorio_save.sh() {
 	functionfile="${FUNCNAME[0]}"
-	fn_fetch_function
+	fn_fetch_module
 }
 
 install_dst_token.sh() {
 	functionfile="${FUNCNAME[0]}"
-	fn_fetch_function
+	fn_fetch_module
 }
 
 install_eula.sh() {
 	functionfile="${FUNCNAME[0]}"
-	fn_fetch_function
+	fn_fetch_module
 }
 
 install_gsquery.sh() {
 	functionfile="${FUNCNAME[0]}"
-	fn_fetch_function
+	fn_fetch_module
 }
 
 install_gslt.sh() {
 	functionfile="${FUNCNAME[0]}"
-	fn_fetch_function
+	fn_fetch_module
 }
 
 install_header.sh() {
 	functionfile="${FUNCNAME[0]}"
-	fn_fetch_function
+	fn_fetch_module
 }
 
 install_logs.sh() {
 	functionfile="${FUNCNAME[0]}"
-	fn_fetch_function
+	fn_fetch_module
 }
 
 install_retry.sh() {
 	functionfile="${FUNCNAME[0]}"
-	fn_fetch_function
+	fn_fetch_module
 }
 
 install_server_dir.sh() {
 	functionfile="${FUNCNAME[0]}"
-	fn_fetch_function
+	fn_fetch_module
 }
 install_server_files.sh() {
 	functionfile="${FUNCNAME[0]}"
-	fn_fetch_function
+	fn_fetch_module
 }
 
 install_stats.sh() {
 	functionfile="${FUNCNAME[0]}"
-	fn_fetch_function
+	fn_fetch_module
 }
 
 install_steamcmd.sh() {
 	functionfile="${FUNCNAME[0]}"
-	fn_fetch_function
+	fn_fetch_module
 }
 
 install_ts3.sh() {
 	functionfile="${FUNCNAME[0]}"
-	fn_fetch_function
+	fn_fetch_module
 }
 
 install_ts3db.sh() {
 	functionfile="${FUNCNAME[0]}"
-	fn_fetch_function
+	fn_fetch_module
 }
 
 install_ut2k4.sh() {
 	functionfile="${FUNCNAME[0]}"
-	fn_fetch_function
+	fn_fetch_module
 }
 
 install_dl_ut2k4.sh() {
 	functionfile="${FUNCNAME[0]}"
-	fn_fetch_function
+	fn_fetch_module
 }
 
 install_ut2k4_key.sh() {
 	functionfile="${FUNCNAME[0]}"
-	fn_fetch_function
+	fn_fetch_module
 }
 
 # Calls code required for legacy servers

+ 816 - 0
lgsm/functions/core_modules copy.sh

@@ -0,0 +1,816 @@
+#!/bin/bash
+# LinuxGSM core_modules.sh module
+# Author: Daniel Gibbs
+# Contributors: http://linuxgsm.com/contrib
+# Website: https://linuxgsm.com
+# Description: Defines all modules to allow download and execution of modules using fn_fetch_module.
+# This module is called first before any other module. Without this file other modules will not load.
+
+moduleselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")"
+
+modulesversion="v23.2.0"
+
+# Core
+
+core_dl.sh() {
+	modulefile="${FUNCNAME[0]}"
+	if [ "$(type fn_fetch_core_dl 2> /dev/null)" ]; then
+		fn_fetch_core_dl "lgsm/modules" "core_dl.sh" "${modulesdir}" "chmodx" "run" "noforcedl" "nohash"
+	else
+		fn_bootstrap_fetch_file_github "lgsm/modules" "core_dl.sh" "${modulesdir}" "chmodx" "run" "noforcedl" "nohash"
+	fi
+}
+
+core_messages.sh() {
+	modulefile="${FUNCNAME[0]}"
+	if [ "$(type fn_fetch_core_dl 2> /dev/null)" ]; then
+		fn_fetch_core_dl "lgsm/modules" "core_messages.sh" "${modulesdir}" "chmodx" "run" "noforcedl" "nohash"
+	else
+		fn_bootstrap_fetch_file_github "lgsm/modules" "core_messages.sh" "${modulesdir}" "chmodx" "run" "noforcedl" "nohash"
+	fi
+}
+
+core_legacy.sh() {
+	modulefile="${FUNCNAME[0]}"
+	if [ "$(type fn_fetch_core_dl 2> /dev/null)" ]; then
+		fn_fetch_core_dl "lgsm/modules" "core_legacy.sh" "${modulesdir}" "chmodx" "run" "noforcedl" "nohash"
+	else
+		fn_bootstrap_fetch_file_github "lgsm/modules" "core_legacy.sh" "${modulesdir}" "chmodx" "run" "noforcedl" "nohash"
+	fi
+}
+
+core_exit.sh() {
+	modulefile="${FUNCNAME[0]}"
+	fn_fetch_module
+}
+
+core_getopt.sh() {
+	modulefile="${FUNCNAME[0]}"
+	fn_fetch_module
+}
+
+core_trap.sh() {
+	modulefile="${FUNCNAME[0]}"
+	fn_fetch_module
+}
+
+core_steamcmd.sh() {
+	modulefile="${FUNCNAME[0]}"
+	fn_fetch_module
+}
+
+core_github.sh() {
+	modulefile="${FUNCNAME[0]}"
+	fn_fetch_module
+}
+
+# Commands
+
+command_backup.sh() {
+	modulefile="${FUNCNAME[0]}"
+	fn_fetch_module
+}
+
+command_console.sh() {
+	modulefile="${FUNCNAME[0]}"
+	fn_fetch_module
+}
+
+command_debug.sh() {
+	modulefile="${FUNCNAME[0]}"
+	fn_fetch_module
+}
+
+command_details.sh() {
+	modulefile="${FUNCNAME[0]}"
+	fn_fetch_module
+}
+
+command_sponsor.sh() {
+	modulefile="${FUNCNAME[0]}"
+	fn_fetch_module
+}
+
+command_postdetails.sh() {
+	modulefile="${FUNCNAME[0]}"
+	fn_fetch_module
+}
+
+command_test_alert.sh() {
+	modulefile="${FUNCNAME[0]}"
+	fn_fetch_module
+}
+
+command_monitor.sh() {
+	modulefile="${FUNCNAME[0]}"
+	fn_fetch_module
+}
+
+command_start.sh() {
+	modulefile="${FUNCNAME[0]}"
+	fn_fetch_module
+}
+
+command_stop.sh() {
+	modulefile="${FUNCNAME[0]}"
+	fn_fetch_module
+}
+
+command_validate.sh() {
+	modulefile="${FUNCNAME[0]}"
+	fn_fetch_module
+}
+
+command_install.sh() {
+	modulefile="${FUNCNAME[0]}"
+	fn_fetch_module
+}
+
+command_install_resources_mta.sh() {
+	modulefile="${FUNCNAME[0]}"
+	fn_fetch_module
+}
+
+install_squad_license.sh() {
+	modulefile="${FUNCNAME[0]}"
+	fn_fetch_module
+}
+
+command_mods_install.sh() {
+	modulefile="${FUNCNAME[0]}"
+	fn_fetch_module
+}
+
+command_mods_update.sh() {
+	modulefile="${FUNCNAME[0]}"
+	fn_fetch_module
+}
+
+command_mods_remove.sh() {
+	modulefile="${FUNCNAME[0]}"
+	fn_fetch_module
+}
+
+command_fastdl.sh() {
+	modulefile="${FUNCNAME[0]}"
+	fn_fetch_module
+}
+
+command_ts3_server_pass.sh() {
+	modulefile="${FUNCNAME[0]}"
+	fn_fetch_module
+}
+
+command_restart.sh() {
+	modulefile="${FUNCNAME[0]}"
+	fn_fetch_module
+}
+
+command_skeleton.sh() {
+	modulefile="${FUNCNAME[0]}"
+	fn_fetch_module
+}
+
+command_wipe.sh() {
+	modulefile="${FUNCNAME[0]}"
+	fn_fetch_module
+}
+
+command_send.sh() {
+	modulefile="${FUNCNAME[0]}"
+	fn_fetch_module
+}
+
+# Checks
+
+check.sh() {
+	modulefile="${FUNCNAME[0]}"
+	fn_fetch_module
+}
+
+check_config.sh() {
+	modulefile="${FUNCNAME[0]}"
+	fn_fetch_module
+}
+
+check_deps.sh() {
+	modulefile="${FUNCNAME[0]}"
+	fn_fetch_module
+}
+
+check_executable.sh() {
+	modulefile="${FUNCNAME[0]}"
+	fn_fetch_module
+}
+
+check_glibc.sh() {
+	modulefile="${FUNCNAME[0]}"
+	fn_fetch_module
+}
+
+check_ip.sh() {
+	modulefile="${FUNCNAME[0]}"
+	fn_fetch_module
+}
+
+check_last_update.sh() {
+	modulefile="${FUNCNAME[0]}"
+	fn_fetch_module
+}
+
+check_logs.sh() {
+	modulefile="${FUNCNAME[0]}"
+	fn_fetch_module
+}
+
+check_permissions.sh() {
+	modulefile="${FUNCNAME[0]}"
+	fn_fetch_module
+}
+
+check_root.sh() {
+	modulefile="${FUNCNAME[0]}"
+	fn_fetch_module
+}
+
+check_status.sh() {
+	modulefile="${FUNCNAME[0]}"
+	fn_fetch_module
+}
+
+check_steamcmd.sh() {
+	modulefile="${FUNCNAME[0]}"
+	fn_fetch_module
+}
+
+check_system_dir.sh() {
+	modulefile="${FUNCNAME[0]}"
+	fn_fetch_module
+}
+
+check_system_requirements.sh() {
+	modulefile="${FUNCNAME[0]}"
+	fn_fetch_module
+}
+
+check_tmuxception.sh() {
+	modulefile="${FUNCNAME[0]}"
+	fn_fetch_module
+}
+
+check_version.sh() {
+	modulefile="${FUNCNAME[0]}"
+	fn_fetch_module
+}
+
+# Compress
+
+compress_unreal2_maps.sh() {
+	modulefile="${FUNCNAME[0]}"
+	fn_fetch_module
+}
+
+compress_ut99_maps.sh() {
+	modulefile="${FUNCNAME[0]}"
+	fn_fetch_module
+}
+
+# Mods
+
+mods_list.sh() {
+	modulefile="${FUNCNAME[0]}"
+	fn_fetch_module
+}
+
+mods_core.sh() {
+	modulefile="${FUNCNAME[0]}"
+	fn_fetch_module
+}
+
+# Dev
+
+command_dev_clear_modules.sh() {
+	modulefile="${FUNCNAME[0]}"
+	fn_fetch_module
+}
+
+command_dev_debug.sh() {
+	modulefile="${FUNCNAME[0]}"
+	fn_fetch_module
+}
+
+command_dev_detect_deps.sh() {
+	modulefile="${FUNCNAME[0]}"
+	fn_fetch_module
+}
+
+command_dev_detect_glibc.sh() {
+	modulefile="${FUNCNAME[0]}"
+	fn_fetch_module
+}
+
+command_dev_detect_ldd.sh() {
+	modulefile="${FUNCNAME[0]}"
+	fn_fetch_module
+}
+
+command_dev_query_raw.sh() {
+	modulefile="${FUNCNAME[0]}"
+	fn_fetch_module
+}
+
+# Fix
+
+fix.sh() {
+	modulefile="${FUNCNAME[0]}"
+	fn_fetch_module
+}
+
+fix_ark.sh() {
+	modulefile="${FUNCNAME[0]}"
+	fn_fetch_module
+}
+
+fix_av.sh() {
+	modulefile="${FUNCNAME[0]}"
+	fn_fetch_module
+}
+
+fix_arma3.sh() {
+	modulefile="${FUNCNAME[0]}"
+	fn_fetch_module
+}
+
+fix_armar.sh() {
+	modulefile="${FUNCNAME[0]}"
+	fn_fetch_module
+}
+
+fix_bt.sh() {
+	modulefile="${FUNCNAME[0]}"
+	fn_fetch_module
+}
+
+fix_bo.sh() {
+	modulefile="${FUNCNAME[0]}"
+	fn_fetch_module
+}
+
+fix_cmw.sh() {
+	modulefile="${FUNCNAME[0]}"
+	fn_fetch_module
+}
+
+fix_csgo.sh() {
+	modulefile="${FUNCNAME[0]}"
+	fn_fetch_module
+}
+
+fix_dst.sh() {
+	modulefile="${FUNCNAME[0]}"
+	fn_fetch_module
+}
+
+fix_hw.sh() {
+	modulefile="${FUNCNAME[0]}"
+	fn_fetch_module
+}
+
+fix_ins.sh() {
+	modulefile="${FUNCNAME[0]}"
+	fn_fetch_module
+}
+
+fix_kf.sh() {
+	modulefile="${FUNCNAME[0]}"
+	fn_fetch_module
+}
+
+fix_kf2.sh() {
+	modulefile="${FUNCNAME[0]}"
+	fn_fetch_module
+}
+
+fix_lo.sh() {
+	modulefile="${FUNCNAME[0]}"
+	fn_fetch_module
+}
+
+fix_mcb.sh() {
+	modulefile="${FUNCNAME[0]}"
+	fn_fetch_module
+}
+
+fix_mta.sh() {
+	modulefile="${FUNCNAME[0]}"
+	fn_fetch_module
+}
+
+fix_nmrih.sh() {
+	modulefile="${FUNCNAME[0]}"
+	fn_fetch_module
+}
+
+fix_onset.sh() {
+	modulefile="${FUNCNAME[0]}"
+	fn_fetch_module
+}
+
+fix_ro.sh() {
+	modulefile="${FUNCNAME[0]}"
+	fn_fetch_module
+}
+
+fix_rust.sh() {
+	modulefile="${FUNCNAME[0]}"
+	fn_fetch_module
+}
+
+fix_rw.sh() {
+	modulefile="${FUNCNAME[0]}"
+	fn_fetch_module
+}
+
+fix_sfc.sh() {
+	modulefile="${FUNCNAME[0]}"
+	fn_fetch_module
+}
+
+fix_st.sh() {
+	modulefile="${FUNCNAME[0]}"
+	fn_fetch_module
+}
+
+fix_steamcmd.sh() {
+	modulefile="${FUNCNAME[0]}"
+	fn_fetch_module
+}
+
+fix_terraria.sh() {
+	modulefile="${FUNCNAME[0]}"
+	fn_fetch_module
+}
+
+fix_tf2.sh() {
+	modulefile="${FUNCNAME[0]}"
+	fn_fetch_module
+}
+
+fix_ut3.sh() {
+	modulefile="${FUNCNAME[0]}"
+	fn_fetch_module
+}
+
+fix_rust.sh() {
+	modulefile="${FUNCNAME[0]}"
+	fn_fetch_module
+}
+
+fix_samp.sh() {
+	modulefile="${FUNCNAME[0]}"
+	fn_fetch_module
+}
+
+fix_sdtd.sh() {
+	modulefile="${FUNCNAME[0]}"
+	fn_fetch_module
+}
+
+fix_sof2.sh() {
+	modulefile="${FUNCNAME[0]}"
+	fn_fetch_module
+}
+
+fix_squad.sh() {
+	modulefile="${FUNCNAME[0]}"
+	fn_fetch_module
+}
+
+fix_ts3.sh() {
+	modulefile="${FUNCNAME[0]}"
+	fn_fetch_module
+}
+
+fix_ut2k4.sh() {
+	modulefile="${FUNCNAME[0]}"
+	fn_fetch_module
+}
+
+fix_ut.sh() {
+	modulefile="${FUNCNAME[0]}"
+	fn_fetch_module
+}
+
+fix_unt.sh() {
+	modulefile="${FUNCNAME[0]}"
+	fn_fetch_module
+}
+
+fix_vh.sh() {
+	modulefile="${FUNCNAME[0]}"
+	fn_fetch_module
+}
+
+fix_wurm.sh() {
+	modulefile="${FUNCNAME[0]}"
+	fn_fetch_module
+}
+
+fix_zmr.sh() {
+	modulefile="${FUNCNAME[0]}"
+	fn_fetch_module
+}
+
+# Info
+
+info_distro.sh() {
+	modulefile="${FUNCNAME[0]}"
+	fn_fetch_module
+}
+
+info_game.sh() {
+	modulefile="${FUNCNAME[0]}"
+	fn_fetch_module
+}
+
+info_messages.sh() {
+	modulefile="${FUNCNAME[0]}"
+	fn_fetch_module
+}
+
+info_stats.sh() {
+	modulefile="${FUNCNAME[0]}"
+	fn_fetch_module
+}
+
+# Alert
+
+alert.sh() {
+	modulefile="${FUNCNAME[0]}"
+	fn_fetch_module
+}
+
+alert_discord.sh() {
+	modulefile="${FUNCNAME[0]}"
+	fn_fetch_module
+}
+
+alert_email.sh() {
+	modulefile="${FUNCNAME[0]}"
+	fn_fetch_module
+}
+
+alert_ifttt.sh() {
+	modulefile="${FUNCNAME[0]}"
+	fn_fetch_module
+}
+
+alert_mailgun.sh() {
+	modulefile="${FUNCNAME[0]}"
+	fn_fetch_module
+}
+
+alert_pushbullet.sh() {
+	modulefile="${FUNCNAME[0]}"
+	fn_fetch_module
+}
+
+alert_pushover.sh() {
+	modulefile="${FUNCNAME[0]}"
+	fn_fetch_module
+}
+
+alert_gotify.sh() {
+	modulefile="${FUNCNAME[0]}"
+	fn_fetch_module
+}
+
+alert_telegram.sh() {
+	modulefile="${FUNCNAME[0]}"
+	fn_fetch_module
+}
+
+alert_rocketchat.sh() {
+	modulefile="${FUNCNAME[0]}"
+	fn_fetch_module
+}
+
+alert_slack.sh() {
+	modulefile="${FUNCNAME[0]}"
+	fn_fetch_module
+}
+# Logs
+
+core_logs.sh() {
+	modulefile="${FUNCNAME[0]}"
+	fn_fetch_module
+}
+
+# Query
+
+query_gamedig.sh() {
+	modulefile="${FUNCNAME[0]}"
+	fn_fetch_module
+}
+
+# Update
+
+command_update_modules.sh() {
+	modulefile="${FUNCNAME[0]}"
+	fn_fetch_module
+}
+
+command_update_linuxgsm.sh() {
+	modulefile="${FUNCNAME[0]}"
+	fn_fetch_module
+}
+
+command_update.sh() {
+	modulefile="${FUNCNAME[0]}"
+	fn_fetch_module
+}
+
+command_check_update.sh() {
+	modulefile="${FUNCNAME[0]}"
+	fn_fetch_module
+}
+
+update_ts3.sh() {
+	modulefile="${FUNCNAME[0]}"
+	fn_fetch_module
+}
+
+update_minecraft.sh() {
+	modulefile="${FUNCNAME[0]}"
+	fn_fetch_module
+}
+
+update_minecraft_bedrock.sh() {
+	modulefile="${FUNCNAME[0]}"
+	fn_fetch_module
+}
+
+update_papermc.sh() {
+	modulefile="${FUNCNAME[0]}"
+	fn_fetch_module
+}
+
+update_mta.sh() {
+	modulefile="${FUNCNAME[0]}"
+	fn_fetch_module
+}
+
+update_factorio.sh() {
+	modulefile="${FUNCNAME[0]}"
+	fn_fetch_module
+}
+
+update_jediknight2.sh() {
+	modulefile="${FUNCNAME[0]}"
+	fn_fetch_module
+}
+
+update_steamcmd.sh() {
+	modulefile="${FUNCNAME[0]}"
+	fn_fetch_module
+}
+
+update_vintagestory.sh() {
+	modulefile="${FUNCNAME[0]}"
+	fn_fetch_module
+}
+
+update_ut99.sh() {
+	modulefile="${FUNCNAME[0]}"
+	fn_fetch_module
+}
+
+fn_update_modules.sh() {
+	modulefile="${FUNCNAME[0]}"
+	fn_fetch_module
+}
+
+#
+## Installer modules
+#
+
+fn_autoinstall() {
+	autoinstall=1
+	command_install.sh
+}
+
+install_complete.sh() {
+	modulefile="${FUNCNAME[0]}"
+	fn_fetch_module
+}
+
+install_config.sh() {
+	modulefile="${FUNCNAME[0]}"
+	fn_fetch_module
+}
+
+install_factorio_save.sh() {
+	modulefile="${FUNCNAME[0]}"
+	fn_fetch_module
+}
+
+install_dst_token.sh() {
+	modulefile="${FUNCNAME[0]}"
+	fn_fetch_module
+}
+
+install_eula.sh() {
+	modulefile="${FUNCNAME[0]}"
+	fn_fetch_module
+}
+
+install_gsquery.sh() {
+	modulefile="${FUNCNAME[0]}"
+	fn_fetch_module
+}
+
+install_gslt.sh() {
+	modulefile="${FUNCNAME[0]}"
+	fn_fetch_module
+}
+
+install_header.sh() {
+	modulefile="${FUNCNAME[0]}"
+	fn_fetch_module
+}
+
+install_logs.sh() {
+	modulefile="${FUNCNAME[0]}"
+	fn_fetch_module
+}
+
+install_retry.sh() {
+	modulefile="${FUNCNAME[0]}"
+	fn_fetch_module
+}
+
+install_server_dir.sh() {
+	modulefile="${FUNCNAME[0]}"
+	fn_fetch_module
+}
+install_server_files.sh() {
+	modulefile="${FUNCNAME[0]}"
+	fn_fetch_module
+}
+
+install_stats.sh() {
+	modulefile="${FUNCNAME[0]}"
+	fn_fetch_module
+}
+
+install_steamcmd.sh() {
+	modulefile="${FUNCNAME[0]}"
+	fn_fetch_module
+}
+
+install_ts3.sh() {
+	modulefile="${FUNCNAME[0]}"
+	fn_fetch_module
+}
+
+install_ts3db.sh() {
+	modulefile="${FUNCNAME[0]}"
+	fn_fetch_module
+}
+
+install_ut2k4.sh() {
+	modulefile="${FUNCNAME[0]}"
+	fn_fetch_module
+}
+
+install_dl_ut2k4.sh() {
+	modulefile="${FUNCNAME[0]}"
+	fn_fetch_module
+}
+
+install_ut2k4_key.sh() {
+	modulefile="${FUNCNAME[0]}"
+	fn_fetch_module
+}
+
+# Calls code required for legacy servers
+core_legacy.sh
+
+# Creates tmp dir if missing
+if [ ! -d "${tmpdir}" ]; then
+	mkdir -p "${tmpdir}"
+fi
+
+# Creates lock dir if missing
+if [ ! -d "${lockdir}" ]; then
+	mkdir -p "${lockdir}"
+fi
+
+# Calls on-screen messages (bootstrap)
+core_messages.sh
+
+#Calls file downloader (bootstrap)
+core_dl.sh
+
+# Calls the global Ctrl-C trap
+core_trap.sh

+ 4 - 4
lgsm/modules/check_ip.sh

@@ -39,25 +39,25 @@ function fn_is_valid_ip() {
 # If the IP variable has been set by user.
 if fn_is_valid_ip "${ip}"; then
 	queryips=("${ip}")
-	webadminip=("${ip}")
+	httpip=("${ip}")
 	telnetip=("${ip}")
 # If game config does have an IP set.
 elif fn_is_valid_ip "${configip}"; then
 	queryips=("${configip}")
 	ip="${configip}"
-	webadminip=("${configip}")
+	httpip=("${configip}")
 	telnetip=("${configip}")
 # If there is only 1 server IP address.
 # Some IP details can automaticly use the one IP
 elif [ "${#current_ips[@]}" == "1" ]; then
 	queryips=("127.0.0.1" "${current_ips[@]}")
 	ip="0.0.0.0"
-	webadminip=("${current_ips[@]}")
+	httpip=("${current_ips[@]}")
 	telnetip=("${current_ips[@]}")
 # If no ip is set by the user and server has more than one IP.
 else
 	queryips=("127.0.0.1" "${current_ips[@]}")
 	ip="0.0.0.0"
-	webadminip=("${ip}")
+	httpip=("${ip}")
 	telnetip=("${ip}")
 fi

+ 94 - 0
lgsm/modules/command_dev_details.sh

@@ -0,0 +1,94 @@
+#!/bin/bash
+# LinuxGSM command_dev_debug.sh module
+# Author: Daniel Gibbs
+# Contributors: http://linuxgsm.com/contrib
+# Website: https://linuxgsm.com
+# Description: Dev only: Enables debugging log to be saved to dev-debug.log.
+
+if [ -f "config" ]; then
+	servercfgfullpath="config"
+fi
+if [ -f "clusterconfig" ]; then
+	clustercfgfullpath="clusterconfig"
+fi
+
+info_game.sh
+
+carriagereturn=$(file -b "${servercfgfullpath}" | grep -q CRLF && echo "${red}CRLF${default}" || echo "${lightgreen}LF${default}")
+
+echo -e ""
+echo -e "${lightgreen}Server Details${default}"
+echo -e "=================================================================="
+echo -e ""
+
+echo -e "Game: ${gamename}"
+echo -e "Config type: ${configtype}"
+echo -e "Config file: ${servercfgfullpath}"
+if [ -f "${clustercfgfullpath}" ]; then
+	echo -e "Cluster config file: ${clustercfgfullpath}"
+fi
+echo -e "Carriage Return: ${carriagereturn}"
+
+# Create an associative array of the server details.
+declare -A server_details=(
+	['Admin Password']="${adminpassword}"
+	['API Port']="${apiport}"
+	['Cave']="${cave}"
+	['Cluster']="${cluster}"
+	['Config IP']="${configip}"
+	['Default Map']="${defaultmap}"
+	['Game Mode']="${gamemode}"
+	['Game Type']="${gametype}"
+	['HTTP Enabled']="${httpenabled}"
+	['HTTP IP']="${httpip}"
+	['HTTP Password']="${httppassword}"
+	['HTTP Port']="${httpport}"
+	['HTTP User']="${httpuser}"
+	['ip']="${ip}"
+	['LAN Port']="${lanport}"
+	['Master Port']="${masterport}"
+	['Master']="${master}"
+	['Maxplayers']="${maxplayers}"
+	['OldQueryPortNumber']="${oldqueryportnumber}"
+	['Port']="${port}"
+	['Query Port']="${queryport}"
+	['RCON Enabled']="${rconenabled}"
+	['RCON Password']="${rconpassword}"
+	['RCON Port']="${rconport}"
+	['Reserved Slots']="${reservedslots}"
+	['Server Password']="${serverpassword}"
+	['Servername']="${servername}"
+	['Shard']="${shard}"
+	['Sharding']="${sharding}"
+	['Steam Auth Port']="${steamauthport}"
+	['Telnet IP']="${telnetip}"
+	['Tickrate']="${tickrate}"
+	['World Name']="${worldname}"
+	['World Type']="${worldtype}"
+)
+
+# Initialize a variable to keep track of missing server details.
+missing_details=""
+
+# Loop through the server details and output them.
+echo -e ""
+echo -e "${lightgreen}Available Server Details${default}"
+echo -e "================================="
+for key in "${!server_details[@]}"; do
+	value=${server_details[$key]}
+	if [ -z "$value" ]; then
+		missing_details+="\n${key}"
+	else
+		echo -e "$key: $value "
+	fi
+done
+
+# Output the missing server details if there are any.
+if [ -n "$missing_details" ]; then
+	echo -e ""
+	echo -e "${lightgreen}Missing Server Details${default}"
+	echo -e "================================="
+	echo -e "${missing_details}"
+fi
+
+core_exit.sh

+ 33 - 38
lgsm/modules/command_dev_query_raw.sh

@@ -28,169 +28,164 @@ 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 -c ${port}) \t$(ss -tupl | grep ${port} | grep tcp | awk '{ print $2 }') \t$(ss -tupl | grep ${port} | grep udp | awk '{ print $2 }')"
+		echo -e "Game: \t${port} \t$(ss -tupl | grep -c "${port}") \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 -c ${port}) \t$(ss -tupl | grep ${port2} | grep tcp | awk '{ print $2 }') \t$(ss -tupl | grep ${port2} | grep udp | awk '{ print $2 }')"
+			echo -e "Game+1: \t${port2} \t$(ss -tupl | grep -c "${port}") \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 -c ${port}) \t$(ss -tupl | grep ${port3} | grep tcp | awk '{ print $2 }') \t$(ss -tupl | grep ${port3} | grep udp | awk '{ print $2 }')"
+			echo -e "Game+2: \t${port3} \t$(ss -tupl | grep -c "${port}") \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 -c ${port}) \t$(ss -tupl | grep ${port4} | grep tcp | awk '{ print $2 }') \t$(ss -tupl | grep ${port4} | grep udp | awk '{ print $2 }')"
+			echo -e "Game+3: \t${port4} \t$(ss -tupl | grep -c "${port}") \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 -c ${port401}) \t$(ss -tupl | grep ${port401} | grep tcp | awk '{ print $2 }') \t$(ss -tupl | grep ${port401} | grep udp | awk '{ print $2 }')"
+		echo -e "Game+400: \t${port401} \t$(ss -tupl | grep -c "${port401}") \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 -c ${portipv6}) \t$(ss -tupl | grep ${portipv6} | grep tcp | awk '{ print $2 }') \t$(ss -tupl | grep ${portipv6} | grep udp | awk '{ print $2 }')"
+		echo -e "Game ipv6: \t${portipv6} \t$(ss -tupl | grep -c "${portipv6}") \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 -c ${queryport}) \t$(ss -tupl | grep ${queryport} | grep tcp | awk '{ print $2 }') \t$(ss -tupl | grep ${queryport} | grep udp | awk '{ print $2 }')"
+		echo -e "Query: \t${queryport} \t$(ss -tupl | grep -c "${queryport}") \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 -c ${httpport}) \t$(ss -tupl | grep ${httpport} | grep tcp | awk '{ print $2 }') \t$(ss -tupl | grep ${httpport} | grep udp | awk '{ print $2 }')"
+		echo -e "HTTP: \t${httpport} \t$(ss -tupl | grep -c "${httpport}") \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 -c ${httpqueryport}) \t$(ss -tupl | grep ${httpqueryport} | grep tcp | awk '{ print $2 }') \t$(ss -tupl | grep ${httpqueryport} | grep udp | awk '{ print $2 }')"
+		echo -e "HTTP Query: \t${httpqueryport} \t$(ss -tupl | grep -c "${httpqueryport}") \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 -c ${webadminport}) \t$(ss -tupl | grep ${webadminport} | grep tcp | awk '{ print $2 }') \t$(ss -tupl | grep ${webadminport} | grep udp | awk '{ print $2 }')"
+	if [ -v httpport ]; then
+		echo -e "Web Interface: \t${httpport} \t$(ss -tupl | grep -c "${httpport}") \t$(ss -tupl | grep "${httpport}" | grep tcp | awk '{ print $2 }') \t$(ss -tupl | grep "${httpport}" | grep udp | awk '{ print $2 }')"
 	else
-		echo -e "Web Admin:"
+		echo -e "Web Interface:"
 	fi
 
 	if [ -v clientport ]; then
-		echo -e "Client: \t${clientport} \t$(ss -tupl | grep -c ${clientport}) \t$(ss -tupl | grep ${clientport} | grep tcp | awk '{ print $2 }') \t$(ss -tupl | grep ${clientport} | grep udp | awk '{ print $2 }')"
+		echo -e "Client: \t${clientport} \t$(ss -tupl | grep -c "${clientport}") \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 -c ${rconport}) \t$(ss -tupl | grep ${rconport} | grep tcp | awk '{ print $2 }') \t$(ss -tupl | grep ${rconport} | grep udp | awk '{ print $2 }')"
+		echo -e "RCON: \t${rconport} \t$(ss -tupl | grep -c "${rconport}") \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 -c ${rawport}) \t$(ss -tupl | grep ${rawport} | grep tcp | awk '{ print $2 }') \t$(ss -tupl | grep ${rawport} | grep udp | awk '{ print $2 }')"
+		echo -e "RAW UDP Socket: \t${rawport} \t$(ss -tupl | grep -c "${rawport}") \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 -c ${masterport}) \t$(ss -tupl | grep ${masterport} | grep tcp | awk '{ print $2 }') \t$(ss -tupl | grep ${masterport} | grep udp | awk '{ print $2 }')"
+		echo -e "Game: Master: \t${masterport} \t$(ss -tupl | grep -c "${masterport}") \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 -c ${steamport}) \t$(ss -tupl | grep ${steamport} | grep tcp | awk '{ print $2 }') \t$(ss -tupl | grep ${steamport} | grep udp | awk '{ print $2 }')"
+		echo -e "Steam: \t${steamport} \t$(ss -tupl | grep -c "${steamport}") \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 -c ${steamauthport}) \t$(ss -tupl | grep ${steamauthport} | grep tcp | awk '{ print $2 }') \t$(ss -tupl | grep ${steamauthport} | grep udp | awk '{ print $2 }')"
+	if [ -v steamworksport ]; then
+		echo -e "Steamworks P2P: \t${steamworksport} \t$(ss -tupl | grep -c "${steamworksport}") \t$(ss -tupl | grep "${steamworksport}" | grep tcp | awk '{ print $2 }') \t$(ss -tupl | grep "${steamworksport}" | grep udp | awk '{ print $2 }')"
 	else
-		echo -e "Steam: Auth:"
+		echo -e "Steamworks P2P:"
 	fi
 
-	if [ -v steammasterport ]; then
-		echo -e "Steam: Master: \t${steammasterport} \t$(ss -tupl | grep -c ${steammasterport}) \t$(ss -tupl | grep ${steammasterport} | grep tcp | awk '{ print $2 }') \t$(ss -tupl | grep ${steammasterport} | grep udp | awk '{ print $2 }')"
+	if [ -v steamauthport ]; then
+		echo -e "Steam: Auth: \t${steamauthport} \t$(ss -tupl | grep -c "${steamauthport}") \t$(ss -tupl | grep "${steamauthport}" | grep tcp | awk '{ print $2 }') \t$(ss -tupl | grep "${steamauthport}" | grep udp | awk '{ print $2 }')"
 	else
-		echo -e "Steam: Master:"
+		echo -e "Steam: Auth:"
 	fi
 
-	if [ -v steamqueryport ]; then
-		echo -e "Steam: Query: \t${steamqueryport} \t$(ss -tupl | grep -c ${steamqueryport}) \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 -c ${beaconport}) \t$(ss -tupl | grep ${beaconport} | grep tcp | awk '{ print $2 }') \t$(ss -tupl | grep ${beaconport} | grep udp | awk '{ print $2 }')"
+		echo -e "Beacon: \t${beaconport} \t$(ss -tupl | grep -c "${beaconport}") \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 -c ${appport}) \t$(ss -tupl | grep ${appport} | grep tcp | awk '{ print $2 }') \t$(ss -tupl | grep ${appport} | grep udp | awk '{ print $2 }')"
+		echo -e "App: \t${appport} \t$(ss -tupl | grep -c "${appport}") \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 -c ${telnetport}) \t$(ss -tupl | grep ${telnetport} | grep tcp | awk '{ print $2 }') \t$(ss -tupl | grep ${telnetport} | grep udp | awk '{ print $2 }')"
+		echo -e "Telnet: \t${telnetport} \t$(ss -tupl | grep -c "${telnetport}") \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 -c ${sourcetvport}) \t$(ss -tupl | grep ${sourcetvport} | grep tcp | awk '{ print $2 }') \t$(ss -tupl | grep ${sourcetvport} | grep udp | awk '{ print $2 }')"
+		echo -e "SourceTV: \t${sourcetvport} \t$(ss -tupl | grep -c "${sourcetvport}") \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 -c ${fileport}) \t$(ss -tupl | grep ${fileport} | grep tcp | awk '{ print $2 }') \t$(ss -tupl | grep ${fileport} | grep udp | awk '{ print $2 }')"
+		echo -e "File: \t${fileport} \t$(ss -tupl | grep -c "${fileport}") \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 -c ${udplinkport}) \t$(ss -tupl | grep ${udplinkport} | grep tcp | awk '{ print $2 }') \t$(ss -tupl | grep ${udplinkport} | grep udp | awk '{ print $2 }')"
+		echo -e "UDP Link: \t${udplinkport} \t$(ss -tupl | grep -c "${udplinkport}") \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 -c ${voiceport}) \t$(ss -tupl | grep ${voiceport} | grep tcp | awk '{ print $2 }') \t$(ss -tupl | grep ${voiceport} | grep udp | awk '{ print $2 }')"
+		echo -e "Voice: \t${voiceport} \t$(ss -tupl | grep -c "${voiceport}") \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 -c ${voiceunusedport}) \t$(ss -tupl | grep ${voiceunusedport} | grep tcp | awk '{ print $2 }') \t$(ss -tupl | grep ${voiceunusedport} | grep udp | awk '{ print $2 }')"
+		echo -e "Voice (Unused): \t${voiceunusedport} \t$(ss -tupl | grep -c "${voiceunusedport}") \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 -c ${battleeyeport}) \t$(ss -tupl | grep ${battleeyeport} | grep tcp | awk '{ print $2 }') \t$(ss -tupl | grep ${battleeyeport} | grep udp | awk '{ print $2 }')"
+		echo -e "BattleEye: \t${battleeyeport} \t$(ss -tupl | grep -c "${battleeyeport}") \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 -c ${statsport}) \t$(ss -tupl | grep ${statsport} | grep tcp | awk '{ print $2 }') \t$(ss -tupl | grep ${statsport} | grep udp | awk '{ print $2 }')"
+		echo -e "Stats: \t${battleeyeport} \t$(ss -tupl | grep -c "${statsport}") \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

+ 3 - 2
lgsm/modules/command_sponsor.sh

@@ -50,6 +50,7 @@ cmd_install_squad_license=("li;license" "install_squad_license.sh" "Add your Squ
 cmd_fastdl=("fd;fastdl" "command_fastdl.sh" "Build a FastDL directory.")
 # Dev commands.
 cmd_dev_debug=("dev;developer" "command_dev_debug.sh" "Enable developer Mode.")
+cmd_dev_details=("ddt;detect-details" "command_dev_details.sh" "Display parsed details.")
 cmd_dev_detect_deps=("dd;detect-deps" "command_dev_detect_deps.sh" "Detect required dependencies.")
 cmd_dev_detect_glibc=("dg;detect-glibc" "command_dev_detect_glibc.sh" "Detect required glibc.")
 cmd_dev_detect_ldd=("dl;detect-ldd" "command_dev_detect_ldd.sh" "Detect required dynamic dependencies.")
@@ -145,7 +146,7 @@ currentopt+=("${cmd_install[@]}" "${cmd_auto_install[@]}")
 ## Developer commands.
 currentopt+=("${cmd_dev_debug[@]}")
 if [ -f ".dev-debug" ]; then
-	currentopt+=("${cmd_dev_detect_deps[@]}" "${cmd_dev_detect_glibc[@]}" "${cmd_dev_detect_ldd[@]}" "${cmd_dev_query_raw[@]}" "${cmd_dev_clear_modules[@]}")
+	currentopt+=("${cmd_dev_details[@]}" "${cmd_dev_detect_deps[@]}" "${cmd_dev_detect_glibc[@]}" "${cmd_dev_detect_ldd[@]}" "${cmd_dev_query_raw[@]}" "${cmd_dev_clear_modules[@]}")
 fi
 
 ## Sponsor.
@@ -183,7 +184,7 @@ fn_opt_usage() {
 	core_exit.sh
 }
 
-# Check if command existw and run corresponding scripts, or display script usage.
+# Check if command exists and run corresponding scripts, or display script usage.
 if [ -z "${getopt}" ]; then
 	fn_opt_usage
 fi

+ 24 - 0
lgsm/modules/core_legacy.sh

@@ -15,6 +15,30 @@ for legacy_version in "${legacy_versions_array[@]}"; do
 	fi
 done
 
+if [ -n "${webadminuser}" ]; then
+	httpuser="${webadminuser}"
+fi
+
+if [ -n "${webadminpass}" ]; then
+	httppassword="${webadminpass}"
+fi
+
+if [ -n "${webadminport}" ]; then
+	httpport="${webadminport}"
+fi
+
+if [ -n "${webadminip}" ]; then
+	httpip="${webadminip}"
+fi
+
+if [ -n "${gameworld}" ]; then
+	worldname="${gameworld}"
+fi
+
+if [ -n "${autosaveinterval}" ]; then
+	saveinterval="${autosaveinterval}"
+fi
+
 if [ -z "${serverfiles}" ]; then
 	serverfiles="${filesdir}"
 fi

+ 5 - 0
lgsm/modules/core_modules.sh

@@ -299,6 +299,11 @@ command_dev_debug.sh() {
 	fn_fetch_module
 }
 
+command_dev_details.sh() {
+	modulefile="${FUNCNAME[0]}"
+	fn_fetch_module
+}
+
 command_dev_detect_deps.sh() {
 	modulefile="${FUNCNAME[0]}"
 	fn_fetch_module

+ 3 - 1
lgsm/modules/fix_cmw.sh

@@ -17,7 +17,9 @@ fi
 if [ ! -f "${servercfgfullpath}" ]; then
 	fn_fix_msg_start
 	fixname="copy config"
-	mkdir "${servercfgdir}"
+	if [ ! -d "${servercfgdir}" ]; then
+		mkdir -p "${servercfgdir}"
+	fi
 	cp "${systemdir}/UDKGame/Config/"*.ini "${servercfgdir}"
 	fn_fix_msg_end
 fi

+ 2 - 2
lgsm/modules/fix_ro.sh

@@ -7,12 +7,12 @@
 
 moduleselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")"
 
-echo -e "Applying WebAdmin ROOst.css fix."
+echo -e "Applying webinterface ROOst.css fix."
 echo -e "http://forums.tripwireinteractive.com/showpost.php?p=585435&postcount=13"
 sed -i 's/none}/none;/g' "${serverfiles}/Web/ServerAdmin/ROOst.css"
 sed -i 's/underline}/underline;/g' "${serverfiles}/Web/ServerAdmin/ROOst.css"
 fn_sleep_time
-echo -e "Applying WebAdmin CharSet fix."
+echo -e "Applying webinterface CharSet fix."
 echo -e "http://forums.tripwireinteractive.com/showpost.php?p=442340&postcount=1"
 sed -i 's/CharSet="iso-8859-1"/CharSet="utf-8"/g' "${systemdir}/uweb.int"
 fn_sleep_time

A diferenza do arquivo foi suprimida porque é demasiado grande
+ 1989 - 2196
lgsm/modules/info_game.sh


+ 75 - 81
lgsm/modules/info_messages.sh

@@ -35,8 +35,8 @@ fn_info_message_password_strip() {
 			statspassword="********"
 		fi
 
-		if [ "${webadminpass}" ]; then
-			webadminpass="********"
+		if [ "${httppassword}" ]; then
+			httppassword="********"
 		fi
 
 		if [ "${telnetpass}" ]; then
@@ -593,6 +593,12 @@ fn_info_message_script() {
 		if [ -n "${networkcfgfullpath}" ]; then
 			echo -e "${lightblue}Network config file:\t${default}${networkcfgfullpath}"
 		fi
+
+		# Cluster config file location (DST)
+		if [ -n "${clustercfgfullpath}" ]; then
+			echo -e "${lightblue}Cluster config file:\t${default}${clustercfgfullpath}"
+		fi
+
 	} | column -s $'\t' -t
 }
 
@@ -803,7 +809,7 @@ fn_info_message_arma3() {
 		fn_port "Game" port udp
 		fn_port "Voice" voiceport udp
 		fn_port "Query" queryport udp
-		fn_port "Steam Master" steammasterport udp
+		fn_port "Steam" steamport udp
 		fn_port "Voice (unused)" voiceunusedport udp
 		fn_port "BattleEye" battleeyeport udp
 	} | column -s $'\t' -t
@@ -823,8 +829,8 @@ fn_info_message_av() {
 		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 "Steam" steamport udp
+		fn_port "Steamworks P2P" steamworksport udp
 		fn_port "RCON" rconport tcp
 	} | column -s $'\t' -t
 }
@@ -962,7 +968,7 @@ 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 "Steam" steamport udp
 		fn_port "BattleEye" battleeyeport udp
 	} | column -s $'\t' -t
 }
@@ -980,8 +986,8 @@ fn_info_message_dst() {
 		fn_port "header"
 		fn_port "Game: Server" port udp
 		fn_port "Game: Master" masterport udp
+		fn_port "Steam" steamport udp
 		fn_port "Steam: Auth" steamauthport udp
-		fn_port "Steam: Master" steammasterport udp
 	} | column -s $'\t' -t
 }
 
@@ -989,7 +995,7 @@ fn_info_message_eco() {
 	{
 		fn_port "header"
 		fn_port "Game" port udp
-		fn_port "Web Admin" webadminport tcp
+		fn_port "Web Interface" httpport tcp
 	} | column -s $'\t' -t
 }
 
@@ -1076,19 +1082,19 @@ fn_info_message_kf() {
 		fn_port "Game" port udp
 		fn_port "Query" queryport udp
 		fn_port "Query (GameSpy)" queryportgs udp
-		fn_port "Web Admin" webadminport tcp
+		fn_port "Web Interface" httpport tcp
 		fn_port "LAN" lanport udp
+		fn_port "Steamworks P2P" steamworksport 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}"
+	echo -e "${lightgreen}${servername} Web Interface${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 username:\t${default}${webadminuser}"
-		echo -e "${lightblue}Web Admin password:\t${default}${webadminpass}"
+		echo -e "${lightblue}Web Interface enabled:\t${default}${httpenabled}"
+		echo -e "${lightblue}Web Interface url:\t${default}http://${httpip}:${httpport}"
+		echo -e "${lightblue}Web Interface username:\t${default}${httpuser}"
+		echo -e "${lightblue}Web Interface password:\t${default}${httppassword}"
 	} | column -s $'\t' -t
 }
 
@@ -1098,16 +1104,16 @@ fn_info_message_kf2() {
 		fn_port "header"
 		fn_port "Game" port udp
 		fn_port "Query" queryport udp
-		fn_port "Web Admin" webadminport tcp
+		fn_port "Web Interface" httpport tcp
 	} | column -s $'\t' -t
 	echo -e ""
-	echo -e "${lightgreen}${servername} Web Admin${default}"
+	echo -e "${lightgreen}${servername} Web Interface${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 username:\t${default}${webadminuser}"
-		echo -e "${lightblue}Web Admin password:\t${default}${webadminpass}"
+		echo -e "${lightblue}Web Interface enabled:\t${default}${httpenabled}"
+		echo -e "${lightblue}Web Interface url:\t${default}http://${httpip}:${httpport}"
+		echo -e "${lightblue}Web Interface username:\t${default}${httpuser}"
+		echo -e "${lightblue}Web Interface password:\t${default}${httppassword}"
 	} | column -s $'\t' -t
 }
 
@@ -1193,6 +1199,15 @@ fn_info_message_pc() {
 		fn_port "Game" port udp
 		fn_port "Query" queryport udp
 		fn_port "Steam" steamport udp
+		fn_port "HTTP" httpport tcp
+		fn_port "API" apiport tcp
+	} | column -s $'\t' -t
+	echo -e ""
+	echo -e "${lightgreen}${gamename} Web Interface${default}"
+	fn_messages_separator
+	{
+		echo -e "${lightblue}Web Interface enabled:\t${default}${httpenabled}"
+		echo -e "${lightblue}Web Interface url:\t${default}http://${httpip}:${httpport}"
 	} | column -s $'\t' -t
 }
 
@@ -1268,19 +1283,19 @@ 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 "Web Interface" httpport tcp
 		fn_port "LAN" lanport udp
+		fn_port "Steamworks P2P" steamworksport 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}"
+	echo -e "${lightgreen}${servername} Web Interface${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 username:\t${default}${webadminuser}"
-		echo -e "${lightblue}Web Admin password:\t${default}${webadminpass}"
+		echo -e "${lightblue}Web Interface enabled:\t${default}${httpenabled}"
+		echo -e "${lightblue}Web Interface url:\t${default}http://${httpip}:${httpport}"
+		echo -e "${lightblue}Web Interface username:\t${default}${httpuser}"
+		echo -e "${lightblue}Web Interface password:\t${default}${httppassword}"
 	} | column -s $'\t' -t
 }
 
@@ -1356,17 +1371,17 @@ fn_info_message_sdtd() {
 		fn_port "Game" port udp
 		fn_port "Game+2" port3 udp
 		fn_port "Query" queryport tcp
-		fn_port "Web Admin" webadminport tcp
+		fn_port "Web Interface" httpport tcp
 		fn_port "Telnet" telnetport tcp
 	} | column -s $'\t' -t
 	echo -e ""
-	echo -e "${lightgreen}${gamename} Web Admin${default}"
+	echo -e "${lightgreen}${gamename} Web Interface${default}"
 	fn_messages_separator
 	{
-		echo -e "${lightblue}Web Admin enabled:\t${default}${webadminenabled}"
-		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}"
+		echo -e "${lightblue}Web Interface enabled:\t${default}${httpenabled}"
+		echo -e "${lightblue}Web Interface url:\t${default}http://${httpip}:${httpport}/index.html"
+		echo -e "${lightblue}Web Interface username:\t${default}${httpuser}"
+		echo -e "${lightblue}Web Interface password:\t${default}${httppassword}"
 	} | column -s $'\t' -t
 	echo -e ""
 	echo -e "${lightgreen}${gamename} Telnet${default}"
@@ -1433,15 +1448,15 @@ fn_info_message_spark() {
 		fn_port "header"
 		fn_port "Game" port udp
 		fn_port "Query" queryport udp
-		fn_port "Web Admin" webadminport tcp
+		fn_port "Web Interface" httpport tcp
 	} | column -s $'\t' -t
 	echo -e ""
-	echo -e "${lightgreen}${gamename} Web Admin${default}"
+	echo -e "${lightgreen}${gamename} Web Interface${default}"
 	fn_messages_separator
 	{
-		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}"
+		echo -e "${lightblue}Web Interface url:\t${default}http://${httpip}:${httpport}/index.html"
+		echo -e "${lightblue}Web Interface username:\t${default}${httpuser}"
+		echo -e "${lightblue}Web Interface password:\t${default}${httppassword}"
 	} | column -s $'\t' -t
 }
 
@@ -1459,13 +1474,13 @@ fn_info_message_st() {
 		fn_port "header"
 		fn_port "Game" port udp
 		fn_port "Query" queryport udp
-		fn_port "Web Admin" webadminport tcp
+		fn_port "Web Interface" httpport tcp
 	} | column -s $'\t' -t
 	echo -e ""
-	echo -e "${lightgreen}${gamename} Web Admin${default}"
+	echo -e "${lightgreen}${gamename} Web Interface${default}"
 	fn_messages_separator
 	{
-		echo -e "${lightblue}Web Admin url:\t${default}http://${webadminip}:${webadminport}"
+		echo -e "${lightblue}Web Interface url:\t${default}http://${httpip}:${httpport}"
 	} | column -s $'\t' -t
 }
 
@@ -1515,63 +1530,42 @@ fn_info_message_tu() {
 	} | column -s $'\t' -t
 }
 
-fn_info_message_unreal() {
-	fn_info_message_password_strip
-	{
-		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}"
-	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 username:\t${default}${webadminuser}"
-		echo -e "${lightblue}Web Admin password:\t${default}${webadminpass}"
-	} | column -s $'\t' -t
-}
-
 fn_info_message_ut2k4() {
 	{
 		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 "Web Interface" httpport tcp
 		fn_port "LAN" lanport udp
 	} | column -s $'\t' -t
 	echo -e ""
-	echo -e "${lightgreen}${servername} Web Admin${default}"
+	echo -e "${lightgreen}${servername} Web Interface${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 username:\t${default}${webadminuser}"
-		echo -e "${lightblue}Web Admin password:\t${default}${webadminpass}"
+		echo -e "${lightblue}Web Interface enabled:\t${default}${httpenabled}"
+		echo -e "${lightblue}Web Interface url:\t${default}http://${httpip}:${httpport}"
+		echo -e "${lightblue}Web Interface username:\t${default}${httpuser}"
+		echo -e "${lightblue}Web Interface password:\t${default}${httppassword}"
 	} | column -s $'\t' -t
 }
 
 fn_info_message_unreal() {
-	fn_info_message_password_strip
 	{
 		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
+		fn_port "Web Interface" httpport tcp
 	} | column -s $'\t' -t
 	echo -e ""
-	echo -e "${lightgreen}${servername} Web Admin${default}"
+	echo -e "${lightgreen}${servername} Web Interface${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 username:\t${default}${webadminuser}"
-		echo -e "${lightblue}Web Admin password:\t${default}${webadminpass}"
+		echo -e "${lightblue}Web Interface enabled:\t${default}${httpenabled}"
+		echo -e "${lightblue}Web Interface url:\t${default}http://${httpip}:${httpport}"
+		echo -e "${lightblue}Web Interface username:\t${default}${httpuser}"
+		echo -e "${lightblue}Web Interface password:\t${default}${httppassword}"
 	} | column -s $'\t' -t
 }
 
@@ -1598,16 +1592,16 @@ fn_info_message_ut3() {
 		fn_port "header"
 		fn_port "Game" port udp
 		fn_port "Query" queryport udp
-		fn_port "Web Admin" webadminport tcp
+		fn_port "Web Interface" httpport tcp
 	} | column -s $'\t' -t
 	echo -e ""
-	echo -e "${lightgreen}${servername} Web Admin${default}"
+	echo -e "${lightgreen}${servername} Web Interface${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 username:\t${default}${webadminuser}"
-		echo -e "${lightblue}Web Admin password:\t${default}${webadminpass}"
+		echo -e "${lightblue}Web Interface enabled:\t${default}${httpenabled}"
+		echo -e "${lightblue}Web Interface url:\t${default}http://${httpip}:${httpport}"
+		echo -e "${lightblue}Web Interface username:\t${default}${httpuser}"
+		echo -e "${lightblue}Web Interface password:\t${default}${httppassword}"
 	} | column -s $'\t' -t
 }
 

+ 3 - 0
lgsm/modules/install_config.sh

@@ -452,6 +452,9 @@ elif [ "${shortname}" == "eco" ]; then
 	fn_default_config_remote
 	fn_set_config_vars
 	fn_list_config_locations
+elif [ "${shortname}" == "em" ]; then
+	fn_default_config_local
+	fn_list_config_locations
 elif [ "${shortname}" == "etl" ]; then
 	gamedirname="ETLegacy"
 	array_configs+=(server.cfg)

+ 7 - 7
package-lock.json

@@ -7,7 +7,7 @@
       "name": "linuxgsm",
       "license": "MIT",
       "devDependencies": {
-        "prettier": "^2.7.1",
+        "prettier": "^2.8.8",
         "prettier-plugin-sh": "^0.12.8"
       }
     },
@@ -127,9 +127,9 @@
       "dev": true
     },
     "node_modules/open": {
-      "version": "8.4.1",
-      "resolved": "https://registry.npmjs.org/open/-/open-8.4.1.tgz",
-      "integrity": "sha512-/4b7qZNhv6Uhd7jjnREh1NjnPxlTq+XNWPG88Ydkj5AILcA5m3ajvcg57pB24EQjKv0dK62XnDqk9c/hkIG5Kg==",
+      "version": "8.4.2",
+      "resolved": "https://registry.npmjs.org/open/-/open-8.4.2.tgz",
+      "integrity": "sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==",
       "dev": true,
       "dependencies": {
         "define-lazy-prop": "^2.0.0",
@@ -159,9 +159,9 @@
       "dev": true
     },
     "node_modules/prettier": {
-      "version": "2.8.4",
-      "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.4.tgz",
-      "integrity": "sha512-vIS4Rlc2FNh0BySk3Wkd6xmwxB0FpOndW5fisM5H8hsZSxU2VWVB5CWIkIjWvrHjIhxk2g3bfMKM87zNTrZddw==",
+      "version": "2.8.8",
+      "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.8.tgz",
+      "integrity": "sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==",
       "dev": true,
       "bin": {
         "prettier": "bin-prettier.js"

+ 1 - 1
package.json

@@ -5,7 +5,7 @@
     "test": "tests"
   },
   "devDependencies": {
-    "prettier": "^2.7.1",
+    "prettier": "^2.8.8",
     "prettier-plugin-sh": "^0.12.8"
   },
   "scripts": {

Algúns arquivos non se mostraron porque demasiados arquivos cambiaron neste cambio