فهرست منبع

Merge branch 'release/v23.5.0'

Daniel Gibbs 2 سال پیش
والد
کامیت
d6775ce178
100فایلهای تغییر یافته به همراه607 افزوده شده و 573 حذف شده
  1. 1 1
      .github/workflows/details-check.yml
  2. 48 0
      .github/workflows/update-check.yml
  3. 6 6
      README.md
  4. 1 1
      lgsm/config-default/config-lgsm/arkserver/_default.cfg
  5. 1 1
      lgsm/config-default/config-lgsm/btlserver/_default.cfg
  6. 7 2
      lgsm/config-default/config-lgsm/inssserver/_default.cfg
  7. 1 1
      lgsm/config-default/config-lgsm/pstbsserver/_default.cfg
  8. 4 2
      lgsm/config-default/config-lgsm/pvrserver/_default.cfg
  9. 1 2
      lgsm/config-default/config-lgsm/pzserver/_default.cfg
  10. 4 1
      lgsm/config-default/config-lgsm/untserver/_default.cfg
  11. 3 3
      lgsm/config-default/config-lgsm/vintsserver/_default.cfg
  12. 2 2
      lgsm/data/almalinux-8.csv
  13. 2 2
      lgsm/data/almalinux-9.csv
  14. 2 2
      lgsm/data/centos-7.csv
  15. 2 2
      lgsm/data/centos-8.csv
  16. 2 2
      lgsm/data/centos-9.csv
  17. 2 2
      lgsm/data/debian-10.csv
  18. 2 2
      lgsm/data/debian-11.csv
  19. 2 2
      lgsm/data/debian-12.csv
  20. 2 2
      lgsm/data/debian-9.csv
  21. 2 2
      lgsm/data/rhel-7.csv
  22. 2 2
      lgsm/data/rhel-8.csv
  23. 2 2
      lgsm/data/rhel-9.csv
  24. 2 2
      lgsm/data/rocky-8.csv
  25. 2 2
      lgsm/data/rocky-9.csv
  26. 1 1
      lgsm/data/serverlist.csv
  27. 2 2
      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. 0 135
      lgsm/data/ubuntu-21.04.csv
  31. 0 135
      lgsm/data/ubuntu-21.10.csv
  32. 2 2
      lgsm/data/ubuntu-22.04.csv
  33. 2 2
      lgsm/data/ubuntu-23.04.csv
  34. 11 0
      lgsm/modules/alert.sh
  35. 52 19
      lgsm/modules/check_deps.sh
  36. 7 7
      lgsm/modules/check_last_update.sh
  37. 5 0
      lgsm/modules/check_logs.sh
  38. 1 1
      lgsm/modules/check_status.sh
  39. 1 1
      lgsm/modules/check_system_requirements.sh
  40. 20 8
      lgsm/modules/command_backup.sh
  41. 6 6
      lgsm/modules/command_check_update.sh
  42. 1 1
      lgsm/modules/command_console.sh
  43. 9 9
      lgsm/modules/command_debug.sh
  44. 1 1
      lgsm/modules/command_dev_details.sh
  45. 1 1
      lgsm/modules/command_dev_detect_glibc.sh
  46. 1 1
      lgsm/modules/command_mods_remove.sh
  47. 164 49
      lgsm/modules/command_monitor.sh
  48. 1 1
      lgsm/modules/command_restart.sh
  49. 1 1
      lgsm/modules/command_send.sh
  50. 3 0
      lgsm/modules/command_skeleton.sh
  51. 51 51
      lgsm/modules/command_start.sh
  52. 26 15
      lgsm/modules/command_stop.sh
  53. 2 2
      lgsm/modules/command_ts3_server_pass.sh
  54. 9 6
      lgsm/modules/command_update.sh
  55. 4 1
      lgsm/modules/command_validate.sh
  56. 9 1
      lgsm/modules/core_dl.sh
  57. 3 1
      lgsm/modules/core_exit.sh
  58. 7 7
      lgsm/modules/core_functions.sh
  59. 1 1
      lgsm/modules/core_getopt.sh
  60. 4 0
      lgsm/modules/core_legacy.sh
  61. 12 7
      lgsm/modules/core_modules.sh
  62. 13 8
      lgsm/modules/core_steamcmd.sh
  63. 1 1
      lgsm/modules/fix.sh
  64. 1 1
      lgsm/modules/fix_ark.sh
  65. 1 1
      lgsm/modules/fix_arma3.sh
  66. 1 1
      lgsm/modules/fix_armar.sh
  67. 1 1
      lgsm/modules/fix_av.sh
  68. 1 1
      lgsm/modules/fix_bo.sh
  69. 1 1
      lgsm/modules/fix_bt.sh
  70. 1 1
      lgsm/modules/fix_cmw.sh
  71. 2 2
      lgsm/modules/fix_csgo.sh
  72. 1 1
      lgsm/modules/fix_dst.sh
  73. 1 1
      lgsm/modules/fix_hw.sh
  74. 1 1
      lgsm/modules/fix_ins.sh
  75. 1 1
      lgsm/modules/fix_kf.sh
  76. 1 1
      lgsm/modules/fix_kf2.sh
  77. 1 1
      lgsm/modules/fix_lo.sh
  78. 1 1
      lgsm/modules/fix_mcb.sh
  79. 1 1
      lgsm/modules/fix_mta.sh
  80. 14 0
      lgsm/modules/fix_pvr.sh
  81. 1 1
      lgsm/modules/fix_ro.sh
  82. 1 1
      lgsm/modules/fix_rust.sh
  83. 1 1
      lgsm/modules/fix_rw.sh
  84. 1 1
      lgsm/modules/fix_samp.sh
  85. 1 1
      lgsm/modules/fix_sdtd.sh
  86. 1 1
      lgsm/modules/fix_sfc.sh
  87. 1 1
      lgsm/modules/fix_sof2.sh
  88. 1 1
      lgsm/modules/fix_squad.sh
  89. 1 1
      lgsm/modules/fix_st.sh
  90. 1 1
      lgsm/modules/fix_steamcmd.sh
  91. 1 1
      lgsm/modules/fix_terraria.sh
  92. 1 1
      lgsm/modules/fix_tf2.sh
  93. 14 1
      lgsm/modules/fix_ts3.sh
  94. 1 1
      lgsm/modules/fix_unt.sh
  95. 1 1
      lgsm/modules/fix_ut.sh
  96. 1 1
      lgsm/modules/fix_ut2k4.sh
  97. 1 1
      lgsm/modules/fix_ut3.sh
  98. 1 1
      lgsm/modules/fix_vh.sh
  99. 1 1
      lgsm/modules/fix_wurm.sh
  100. 1 1
      lgsm/modules/fix_zmr.sh

+ 1 - 1
.github/workflows/details-check.yml

@@ -5,7 +5,7 @@ on:
   push:
   push:
 
 
 concurrency:
 concurrency:
-  group: ${{ github.ref_name }}
+  group: details-check-${{ github.ref_name }}
   cancel-in-progress: true
   cancel-in-progress: true
 
 
 jobs:
 jobs:

+ 48 - 0
.github/workflows/update-check.yml

@@ -0,0 +1,48 @@
+name: Update Check
+# This action will check that LinuxGSM is picking up game server config and parameter variables.
+on:
+  workflow_dispatch:
+  push:
+
+concurrency:
+  group: update-check-${{ github.ref_name }}
+  cancel-in-progress: true
+
+jobs:
+  update-check:
+    continue-on-error: true
+    runs-on: ubuntu-latest
+
+    strategy:
+      matrix:
+        shortname: [css, fctr, jk2, mc, mcb, mta, pmc, ts3, ut99, vints]
+
+    steps:
+      - name: Download linuxgsm.sh
+        run: wget https://raw.githubusercontent.com/GameServerManagers/LinuxGSM/${GITHUB_REF#refs/heads/}/linuxgsm.sh; chmod +x linuxgsm.sh
+
+      - name: Install dependencies
+        run: sudo dpkg --add-architecture i386; sudo apt-get update;
+
+      - name: Grab server
+        run: LGSM_GITHUBBRANCH="${GITHUB_REF#refs/heads/}" ./linuxgsm.sh ${{ matrix.shortname }}server
+
+      - name: Enable developer mode
+        run: LGSM_GITHUBBRANCH="${GITHUB_REF#refs/heads/}" ./${{ 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
+
+      - name: Install server
+        run: LGSM_GITHUBBRANCH="${GITHUB_REF#refs/heads/}" ./${{ matrix.shortname }}server auto-install
+
+      - name: Check Update server
+        run: LGSM_GITHUBBRANCH="${GITHUB_REF#refs/heads/}" ./${{ matrix.shortname }}server check-update
+
+      - name: Update server
+        run: LGSM_GITHUBBRANCH="${GITHUB_REF#refs/heads/}" ./${{ matrix.shortname }}server update
+
+      - name: Force Update server
+        if: matrix.shortname == 'css'
+        run: LGSM_GITHUBBRANCH="${GITHUB_REF#refs/heads/}" ./${{ matrix.shortname }}server force-update

+ 6 - 6
README.md

@@ -1,7 +1,7 @@
 <p align="center">
 <p align="center">
 	<a href="https://linuxgsm.com"><img src="https://i.imgur.com/Eoh1jsi.jpg" alt="LinuxGSM">
 	<a href="https://linuxgsm.com"><img src="https://i.imgur.com/Eoh1jsi.jpg" alt="LinuxGSM">
 	<a href="https://www.codacy.com/gh/GameServerManagers/LinuxGSM/dashboard"><img src="https://img.shields.io/codacy/grade/d19c5234dc3743d8a8a14093711ca52d?style=flat-square&logo=codacy&logoColor=white" alt="Codacy grade"></a>
 	<a href="https://www.codacy.com/gh/GameServerManagers/LinuxGSM/dashboard"><img src="https://img.shields.io/codacy/grade/d19c5234dc3743d8a8a14093711ca52d?style=flat-square&logo=codacy&logoColor=white" alt="Codacy grade"></a>
-	<img alt="GitHub Workflow Status" src="https://img.shields.io/github/actions/workflow/status/GameServerManagers/LinuxGSM/git-sync.yml?color=0052CC&logo=bitbucket&style=flat-square">
+	<a href="https://bitbucket.org/GameServerManagers/linuxgsm"><img alt="GitHub Workflow Status" src="https://img.shields.io/github/actions/workflow/status/GameServerManagers/LinuxGSM/git-sync.yml?color=0052CC&logo=bitbucket&style=flat-square"></a>
 	<a href="https://linuxgsm.com/discord"><img alt="Discord" src="https://img.shields.io/discord/127498813903601664?color=5865F2&label=%20&logo=discord&logoColor=ffffff&style=flat-square"></a>
 	<a href="https://linuxgsm.com/discord"><img alt="Discord" src="https://img.shields.io/discord/127498813903601664?color=5865F2&label=%20&logo=discord&logoColor=ffffff&style=flat-square"></a>
 	<a href="https://developer.valvesoftware.com/wiki/SteamCMD"><img src="https://img.shields.io/badge/SteamCMD-000000?style=flat-square&amp;logo=Steam&amp;logoColor=white" alt="SteamCMD"></a>
 	<a href="https://developer.valvesoftware.com/wiki/SteamCMD"><img src="https://img.shields.io/badge/SteamCMD-000000?style=flat-square&amp;logo=Steam&amp;logoColor=white" alt="SteamCMD"></a>
 	<a href="https://github.com/GameServerManagers/LinuxGSM/blob/main/LICENSE"><img src="https://img.shields.io/github/license/gameservermanagers/LinuxGSM?style=flat-square" alt="MIT License"></a>
 	<a href="https://github.com/GameServerManagers/LinuxGSM/blob/main/LICENSE"><img src="https://img.shields.io/github/license/gameservermanagers/LinuxGSM?style=flat-square" alt="MIT License"></a>
@@ -11,7 +11,7 @@
 
 
 ## Hassle-Free Dedicated Game Servers
 ## Hassle-Free Dedicated Game Servers
 
 
-Traditionally game servers are not easy to manage yourself. Admins often have to spend hours messing around trying to get their server working. LinuxGSM is a command-line tool designed to be as simple as possible, allowing admins to spend less time on management and more time gaming.
+Traditionally game servers are not easy to manage yourself. Admins often have to spend hours messing around trying to get their servers working. LinuxGSM is a command-line tool designed to be as simple as possible, allowing admins to spend less time on management and more time gaming.
 
 
 ## Main features
 ## Main features
 
 
@@ -45,12 +45,12 @@ Documentation is found at [linuxgsm.com](https://linuxgsm.com) and [docs.linuxgs
 
 
 ## :question: Support
 ## :question: Support
 
 
-There are various ways to get support, check out the [support](https://linuxgsm.com/support/) page to the right support.
+There are various ways to get support, check out the [support](https://linuxgsm.com/support/) page for the right support.
 
 
 ## :heart: Sponsor
 ## :heart: Sponsor
 
 
-If you would like to [sponsor](https://linuxgsm.com/sponsor) to the project there are several ways you can, via [GitHub Sponsors](https://github.com/sponsors/dgibbs64) and [PayPal](https://www.paypal.me/dgibbs64). I would like to thank everyone who sponsors me. Since 2012 LinuxGSM has been steadily growing with new servers, features and improvements added regularly.
+If you would like to [sponsor](https://linuxgsm.com/sponsor) to the project there are several ways you can, via [GitHub Sponsors](https://github.com/sponsors/dgibbs64) and [PayPal](https://www.paypal.me/dgibbs64). I would like to thank everyone who sponsors me. Since 2012 LinuxGSM has been steadily growing with new servers, features, and improvements added regularly.
 
 
-## Contributors
+## 🧙‍♂️ Contributors
 
 
-A big thank you goes to all the wonderful people who contribute ideas, code, docs and support to this project.
+A big thank you goes to all the wonderful people who contribute ideas, code, docs, and support to this project.

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

@@ -19,7 +19,7 @@ altsavedirectoryname="${defaultmap}"
 maxplayers="70"
 maxplayers="70"
 
 
 ## Server Parameters | https://docs.linuxgsm.com/configuration/start-parameters#additional-parameters
 ## Server Parameters | https://docs.linuxgsm.com/configuration/start-parameters#additional-parameters
-startparameters="${defaultmap}?AltSaveDirectoryName=${altsavedirectoryname}?listen?MultiHome=${ip}?MaxPlayers=${maxplayers}?QueryPort=${queryport}?RCONPort=${rconport}?Port=${port} -automanagedmods -crossplay -PublicIPForEpic=${ip}"
+startparameters="${defaultmap}?AltSaveDirectoryName=${altsavedirectoryname}?listen?MultiHome=${ip}?MaxPlayers=${maxplayers}?QueryPort=${queryport}?RCONPort=${rconport}?Port=${port} -automanagedmods -crossplay -PublicIPForEpic=${publicip}"
 
 
 #### LinuxGSM Settings ####
 #### LinuxGSM Settings ####
 
 

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

@@ -14,7 +14,7 @@ port="7777"
 queryport="7780"
 queryport="7780"
 
 
 ## Server Parameters | https://docs.linuxgsm.com/configuration/start-parameters#additional-parameters
 ## Server Parameters | https://docs.linuxgsm.com/configuration/start-parameters#additional-parameters
-startparameters="/Game/Maps/Final_Maps/Derailed?Game=/Script/ShooterGame.WartideGameMode?listen -log -broadcastip=\"${extip}\" -PORT=${port} -QueryPort=${queryport} -defgameini=\"${servercfgfullpath}\""
+startparameters="/Game/Maps/Final_Maps/Derailed?Game=/Script/ShooterGame.WartideGameMode?listen -log -broadcastip=\"${publicip}\" -PORT=${port} -QueryPort=${queryport} -defgameini=\"${servercfgfullpath}\""
 
 
 #### LinuxGSM Settings ####
 #### LinuxGSM Settings ####
 
 

+ 7 - 2
lgsm/config-default/config-lgsm/inssserver/_default.cfg

@@ -19,9 +19,14 @@ defaultmap="Canyon"
 defaultscenario="Scenario_Crossing_Push_Security"
 defaultscenario="Scenario_Crossing_Push_Security"
 maxplayers="28"
 maxplayers="28"
 
 
+## Game Server Login Token (GSLT): Optional
+# GSLT can be used for running a public server.
+# More info: https://docs.linuxgsm.com/steamcmd/gslt
+gslt=""
+
 ## Server Parameters | https://docs.linuxgsm.com/configuration/start-parameters#additional-parameters
 ## Server Parameters | https://docs.linuxgsm.com/configuration/start-parameters#additional-parameters
 ## Parameter Docs | https://mod.io/g/insurgencysandstorm/r/server-admin-guide
 ## Parameter Docs | https://mod.io/g/insurgencysandstorm/r/server-admin-guide
-startparameters="${defaultmap}?Scenario=${defaultscenario}?MaxPlayers=${maxplayers} -Port=${port} -QueryPort=${queryport} -hostname='${servername}' -Rcon -RconPassword=${rconpassword} -RconListenPort=${rconport} -log"
+startparameters="${defaultmap}?Scenario=${defaultscenario}?MaxPlayers=${maxplayers} -Port=${port} -QueryPort=${queryport} -hostname='${servername}' -Rcon -RconPassword=${rconpassword} -RconListenPort=${rconport} -GSLTToken=${gslt} -log"
 
 
 #### LinuxGSM Settings ####
 #### LinuxGSM Settings ####
 
 
@@ -127,7 +132,7 @@ steamcmdforcewindows="no"
 branch=""
 branch=""
 betapassword=""
 betapassword=""
 # Master Server | https://docs.linuxgsm.com/steamcmd/steam-master-server
 # Master Server | https://docs.linuxgsm.com/steamcmd/steam-master-server
-steammaster="false"
+steammaster="true"
 
 
 ## Stop Mode | https://docs.linuxgsm.com/features/stop-mode
 ## Stop Mode | https://docs.linuxgsm.com/features/stop-mode
 # 1: tmux kill
 # 1: tmux kill

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

@@ -155,7 +155,7 @@ consoleinteract="no"
 
 
 ## Game Server Details
 ## Game Server Details
 # Do not edit
 # Do not edit
-gamename="pstbsserver"
+gamename="Post Scriptum"
 engine="unreal4"
 engine="unreal4"
 glibc="2.17"
 glibc="2.17"
 
 

+ 4 - 2
lgsm/config-default/config-lgsm/pvrserver/_default.cfg

@@ -14,9 +14,11 @@ port="7777"
 
 
 # Maps: bridge, datacenter, sand
 # Maps: bridge, datacenter, sand
 defaultmap="datacenter"
 defaultmap="datacenter"
+# Get an API key from https://pavlov-ms.vankrupt.com/servers/v1/key
+apikey=""
 
 
 ## Server Parameters | https://docs.linuxgsm.com/configuration/start-parameters#additional-parameters
 ## Server Parameters | https://docs.linuxgsm.com/configuration/start-parameters#additional-parameters
-startparameters="${defaultmap} -log -MultiHome=${ip} -Port=${port}"
+startparameters="Pavlov ${defaultmap} -log -MultiHome=${ip} -Port=${port} ApiKey=${apikey}"
 
 
 #### LinuxGSM Settings ####
 #### LinuxGSM Settings ####
 
 
@@ -163,7 +165,7 @@ glibc="2.17"
 ## Game Server Directories
 ## Game Server Directories
 systemdir="${serverfiles}/Pavlov"
 systemdir="${serverfiles}/Pavlov"
 executabledir="${systemdir}/Binaries/Linux"
 executabledir="${systemdir}/Binaries/Linux"
-executable="./PavlovServer"
+executable="./PavlovServer-Linux-Shipping"
 servercfgdir="${systemdir}/Saved/Config/LinuxServer"
 servercfgdir="${systemdir}/Saved/Config/LinuxServer"
 servercfg="Game.ini"
 servercfg="Game.ini"
 servercfgdefault="Game.ini"
 servercfgdefault="Game.ini"

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

@@ -10,11 +10,10 @@
 
 
 ## Predefined Parameters | https://docs.linuxgsm.com/configuration/start-parameters
 ## Predefined Parameters | https://docs.linuxgsm.com/configuration/start-parameters
 ip="0.0.0.0"
 ip="0.0.0.0"
-javaram="8192" # -Xmx$8192M
 adminpassword="CHANGE_ME"
 adminpassword="CHANGE_ME"
 
 
 ## Server Parameters | https://docs.linuxgsm.com/configuration/start-parameters#additional-parameters
 ## Server Parameters | https://docs.linuxgsm.com/configuration/start-parameters#additional-parameters
-startparameters="--ip ${ip} -adminpassword \"${adminpassword}\" -servername ${selfname} -Xmx${javaram}M"
+startparameters="-servername ${selfname}"
 
 
 #### LinuxGSM Settings ####
 #### LinuxGSM Settings ####
 
 

+ 4 - 1
lgsm/config-default/config-lgsm/untserver/_default.cfg

@@ -13,6 +13,9 @@ ip="0.0.0.0"
 port="27015"
 port="27015"
 maxplayers="20"
 maxplayers="20"
 defaultmap="PEI"
 defaultmap="PEI"
+servername="LinuxGSM"
+perspective="first" # Values: first, third, vehicle, Both.
+gamemode="normal" # Values: normal, easy, gold.
 
 
 ## Game Server Login Token (GSLT): Required
 ## Game Server Login Token (GSLT): Required
 # GSLT is required for running a public server.
 # GSLT is required for running a public server.
@@ -20,7 +23,7 @@ defaultmap="PEI"
 gslt=""
 gslt=""
 
 
 ## Server Parameters | https://docs.linuxgsm.com/configuration/start-parameters#additional-parameters
 ## Server Parameters | https://docs.linuxgsm.com/configuration/start-parameters#additional-parameters
-startparameters="-nographics -batchmode -bind ${ip} -port ${port} -maxplayers ${maxplayers} -map ${defaultmap} -gslt ${gslt} +InternetServer/${selfname}"
+startparameters="-nographics -batchmode -bind ${ip} -port ${port} -maxplayers ${maxplayers} -perspective ${perspective} -mode ${gamemode} -name ${servername} -map ${defaultmap} -gslt ${gslt} +InternetServer/${selfname}"
 
 
 #### LinuxGSM Settings ####
 #### LinuxGSM Settings ####
 
 

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

@@ -9,7 +9,7 @@
 #### Game Server Settings ####
 #### Game Server Settings ####
 
 
 ## Server Parameters | https://docs.linuxgsm.com/configuration/start-parameters#additional-parameters
 ## Server Parameters | https://docs.linuxgsm.com/configuration/start-parameters#additional-parameters
-startparameters="--datapath ${servercfgdir}"
+startparameters="--dataPath ${servercfgdir}"
 
 
 ## Release Settings | https://docs.linuxgsm.com/game-servers/vintagestory#release-settings
 ## Release Settings | https://docs.linuxgsm.com/game-servers/vintagestory#release-settings
 # Branch (stable|unstable)
 # Branch (stable|unstable)
@@ -150,8 +150,8 @@ glibc="2.17"
 ## Game Server Directories
 ## Game Server Directories
 systemdir="${serverfiles}"
 systemdir="${serverfiles}"
 executabledir="${systemdir}"
 executabledir="${systemdir}"
-preexecutable="mono"
-executable="./VintagestoryServer.exe"
+preexecutable=""
+executable="./VintagestoryServer"
 servercfgdir="${serverfiles}/data/${selfname}"
 servercfgdir="${serverfiles}/data/${selfname}"
 servercfg="serverconfig.json"
 servercfg="serverconfig.json"
 servercfgdefault="serverconfig.json"
 servercfgdefault="serverconfig.json"

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

@@ -83,7 +83,7 @@ opfor
 pc
 pc
 pc2
 pc2
 pmc,java-17-openjdk
 pmc,java-17-openjdk
-pstbs,GConf2
+ps,GConf2
 pvkii
 pvkii
 pvr,libcxx
 pvr,libcxx
 pz,java-11-openjdk rng-tools
 pz,java-11-openjdk rng-tools
@@ -124,7 +124,7 @@ ut2k4
 ut3
 ut3
 ut99
 ut99
 vh,glibc-devel
 vh,glibc-devel
-vints,mono-complete
+vints,aspnetcore-runtime-7.0
 vpmc,java-17-openjdk
 vpmc,java-17-openjdk
 vs
 vs
 wet
 wet

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

@@ -83,7 +83,7 @@ opfor
 pc
 pc
 pc2
 pc2
 pmc,java-17-openjdk
 pmc,java-17-openjdk
-pstbs,GConf2
+ps,GConf2
 pvkii
 pvkii
 pvr,libcxx
 pvr,libcxx
 pz,java-11-openjdk rng-tools
 pz,java-11-openjdk rng-tools
@@ -124,7 +124,7 @@ ut2k4
 ut3
 ut3
 ut99
 ut99
 vh,glibc-devel
 vh,glibc-devel
-vints,mono-complete
+vints,aspnetcore-runtime-7.0
 vpmc,java-17-openjdk
 vpmc,java-17-openjdk
 vs
 vs
 wet
 wet

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

@@ -83,7 +83,7 @@ opfor
 pc
 pc
 pc2
 pc2
 pmc,java-11-openjdk
 pmc,java-11-openjdk
-pstbs,GConf2
+ps,GConf2
 pvkii
 pvkii
 pvr,libcxx
 pvr,libcxx
 pz,java-11-openjdk rng-tools
 pz,java-11-openjdk rng-tools
@@ -124,7 +124,7 @@ ut2k4
 ut3
 ut3
 ut99
 ut99
 vh,glibc-devel
 vh,glibc-devel
-vints,mono-complete
+vints,aspnetcore-runtime-7.0
 vpmc,java-11-openjdk
 vpmc,java-11-openjdk
 vs
 vs
 wet
 wet

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

@@ -83,7 +83,7 @@ opfor
 pc
 pc
 pc2
 pc2
 pmc,java-17-openjdk
 pmc,java-17-openjdk
-pstbs,GConf2
+ps,GConf2
 pvkii
 pvkii
 pvr,libcxx
 pvr,libcxx
 pz,java-11-openjdk rng-tools
 pz,java-11-openjdk rng-tools
@@ -124,7 +124,7 @@ ut2k4
 ut3
 ut3
 ut99
 ut99
 vh,glibc-devel
 vh,glibc-devel
-vints,mono-complete
+vints,aspnetcore-runtime-7.0
 vpmc,java-17-openjdk
 vpmc,java-17-openjdk
 vs
 vs
 wet
 wet

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

@@ -83,7 +83,7 @@ opfor
 pc
 pc
 pc2
 pc2
 pmc,java-17-openjdk
 pmc,java-17-openjdk
-pstbs,GConf2
+ps,GConf2
 pvkii
 pvkii
 pvr,libcxx
 pvr,libcxx
 pz,java-11-openjdk rng-tools
 pz,java-11-openjdk rng-tools
@@ -124,7 +124,7 @@ ut2k4
 ut3
 ut3
 ut99
 ut99
 vh,glibc-devel
 vh,glibc-devel
-vints,mono-complete
+vints,aspnetcore-runtime-7.0
 vpmc,java-17-openjdk
 vpmc,java-17-openjdk
 vs
 vs
 wet
 wet

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

@@ -83,7 +83,7 @@ opfor
 pc
 pc
 pc2
 pc2
 pmc,openjdk-11-jre
 pmc,openjdk-11-jre
-pstbs,libgconf-2-4
+ps,libgconf-2-4
 pvkii
 pvkii
 pvr,libc++1
 pvr,libc++1
 pz,openjdk-11-jre,rng-tools
 pz,openjdk-11-jre,rng-tools
@@ -124,7 +124,7 @@ ut2k4
 ut3
 ut3
 ut99
 ut99
 vh,libc6-dev
 vh,libc6-dev
-vints,mono-complete
+vints,aspnetcore-runtime-7.0
 vpmc,openjdk-11-jre
 vpmc,openjdk-11-jre
 vs
 vs
 wet
 wet

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

@@ -83,7 +83,7 @@ opfor
 pc
 pc
 pc2
 pc2
 pmc,openjdk-17-jre
 pmc,openjdk-17-jre
-pstbs,libgconf-2-4
+ps,libgconf-2-4
 pvkii
 pvkii
 pvr,libc++1
 pvr,libc++1
 pz,openjdk-17-jre,rng-tools
 pz,openjdk-17-jre,rng-tools
@@ -124,7 +124,7 @@ ut2k4
 ut3
 ut3
 ut99
 ut99
 vh,libc6-dev
 vh,libc6-dev
-vints,mono-complete
+vints,aspnetcore-runtime-7.0
 vpmc,openjdk-11-jre
 vpmc,openjdk-11-jre
 vs
 vs
 wet
 wet

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

@@ -83,7 +83,7 @@ opfor
 pc
 pc
 pc2
 pc2
 pmc,openjdk-17-jre
 pmc,openjdk-17-jre
-pstbs,libgconf-2-4
+ps,libgconf-2-4
 pvkii
 pvkii
 pvr,libc++1
 pvr,libc++1
 pz,openjdk-17-jre,rng-tools5
 pz,openjdk-17-jre,rng-tools5
@@ -124,7 +124,7 @@ ut2k4
 ut3
 ut3
 ut99
 ut99
 vh,libc6-dev
 vh,libc6-dev
-vints,mono-complete
+vints,aspnetcore-runtime-7.0
 vpmc,openjdk-17-jre
 vpmc,openjdk-17-jre
 vs
 vs
 wet
 wet

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

@@ -83,7 +83,7 @@ opfor
 pc
 pc
 pc2
 pc2
 pmc,openjdk-8-jre
 pmc,openjdk-8-jre
-pstbs,libgconf-2-4
+ps,libgconf-2-4
 pvkii
 pvkii
 pvr,libc++1
 pvr,libc++1
 pz,openjdk-8-jre,rng-tools
 pz,openjdk-8-jre,rng-tools
@@ -124,7 +124,7 @@ ut2k4
 ut3
 ut3
 ut99
 ut99
 vh,libc6-dev
 vh,libc6-dev
-vints,mono-complete
+vints,aspnetcore-runtime-7.0
 vpmc,openjdk-8-jre
 vpmc,openjdk-8-jre
 vs
 vs
 wet
 wet

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

@@ -83,7 +83,7 @@ opfor
 pc
 pc
 pc2
 pc2
 pmc,java-11-openjdk
 pmc,java-11-openjdk
-pstbs,GConf2
+ps,GConf2
 pvkii
 pvkii
 pvr,libcxx
 pvr,libcxx
 pz,java-11-openjdk rng-tools
 pz,java-11-openjdk rng-tools
@@ -124,7 +124,7 @@ ut2k4
 ut3
 ut3
 ut99
 ut99
 vh,glibc-devel
 vh,glibc-devel
-vints,mono-complete
+vints,aspnetcore-runtime-7.0
 vpmc,java-11-openjdk
 vpmc,java-11-openjdk
 vs
 vs
 wet
 wet

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

@@ -83,7 +83,7 @@ opfor
 pc
 pc
 pc2
 pc2
 pmc,java-17-openjdk
 pmc,java-17-openjdk
-pstbs,GConf2
+ps,GConf2
 pvkii
 pvkii
 pvr,libcxx
 pvr,libcxx
 pz,java-11-openjdk rng-tools
 pz,java-11-openjdk rng-tools
@@ -124,7 +124,7 @@ ut2k4
 ut3
 ut3
 ut99
 ut99
 vh,glibc-devel
 vh,glibc-devel
-vints,mono-complete
+vints,aspnetcore-runtime-7.0
 vpmc,java-17-openjdk
 vpmc,java-17-openjdk
 vs
 vs
 wet
 wet

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

@@ -83,7 +83,7 @@ opfor
 pc
 pc
 pc2
 pc2
 pmc,java-17-openjdk
 pmc,java-17-openjdk
-pstbs,GConf2
+ps,GConf2
 pvkii
 pvkii
 pvr,libcxx
 pvr,libcxx
 pz,java-11-openjdk rng-tools
 pz,java-11-openjdk rng-tools
@@ -124,7 +124,7 @@ ut2k4
 ut3
 ut3
 ut99
 ut99
 vh,glibc-devel
 vh,glibc-devel
-vints,mono-complete
+vints,aspnetcore-runtime-7.0
 vpmc,java-17-openjdk
 vpmc,java-17-openjdk
 vs
 vs
 wet
 wet

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

@@ -83,7 +83,7 @@ opfor
 pc
 pc
 pc2
 pc2
 pmc,java-17-openjdk
 pmc,java-17-openjdk
-pstbs,GConf2
+ps,GConf2
 pvkii
 pvkii
 pvr,libcxx
 pvr,libcxx
 pz,java-11-openjdk rng-tools
 pz,java-11-openjdk rng-tools
@@ -124,7 +124,7 @@ ut2k4
 ut3
 ut3
 ut99
 ut99
 vh,glibc-devel
 vh,glibc-devel
-vints,mono-complete
+vints,aspnetcore-runtime-7.0
 vpmc,java-17-openjdk
 vpmc,java-17-openjdk
 vs
 vs
 wet
 wet

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

@@ -83,7 +83,7 @@ opfor
 pc
 pc
 pc2
 pc2
 pmc,java-17-openjdk
 pmc,java-17-openjdk
-pstbs,GConf2
+ps,GConf2
 pvkii
 pvkii
 pvr,libcxx
 pvr,libcxx
 pz,java-11-openjdk rng-tools
 pz,java-11-openjdk rng-tools
@@ -124,7 +124,7 @@ ut2k4
 ut3
 ut3
 ut99
 ut99
 vh,glibc-devel
 vh,glibc-devel
-vints,mono-complete
+vints,aspnetcore-runtime-7.0
 vpmc,java-17-openjdk
 vpmc,java-17-openjdk
 vs
 vs
 wet
 wet

+ 1 - 1
lgsm/data/serverlist.csv

@@ -82,7 +82,7 @@ opfor,opforserver,Opposing Force,ubuntu-22.04
 pc,pcserver,Project Cars,ubuntu-22.04
 pc,pcserver,Project Cars,ubuntu-22.04
 pc2,pc2server,Project Cars 2,ubuntu-22.04
 pc2,pc2server,Project Cars 2,ubuntu-22.04
 pmc,pmcserver,PaperMC,ubuntu-22.04
 pmc,pmcserver,PaperMC,ubuntu-22.04
-pstbs,pstbsserver,Post Scriptum: The Bloody Seventh,ubuntu-22.04
+ps,psserver,Post Scriptum,ubuntu-22.04
 pvkii,pvkiiserver,Pirates Vikings & Knights II,ubuntu-22.04
 pvkii,pvkiiserver,Pirates Vikings & Knights II,ubuntu-22.04
 pvr,pvrserver,Pavlov VR,ubuntu-22.04
 pvr,pvrserver,Pavlov VR,ubuntu-22.04
 pz,pzserver,Project Zomboid,ubuntu-22.04
 pz,pzserver,Project Zomboid,ubuntu-22.04

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

@@ -83,7 +83,7 @@ opfor
 pc
 pc
 pc2
 pc2
 pmc,openjdk-8-jre
 pmc,openjdk-8-jre
-pstbs,libgconf-2-4
+ps,libgconf-2-4
 pvkii
 pvkii
 pvr,libc++1
 pvr,libc++1
 pz,openjdk-8-jre,rng-tools
 pz,openjdk-8-jre,rng-tools
@@ -124,7 +124,7 @@ ut2k4
 ut3
 ut3
 ut99
 ut99
 vh,libc6-dev
 vh,libc6-dev
-vints,mono-complete
+vints,aspnetcore-runtime-7.0
 vpmc,openjdk-8-jre
 vpmc,openjdk-8-jre
 vs
 vs
 wet
 wet

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

@@ -83,7 +83,7 @@ opfor
 pc
 pc
 pc2
 pc2
 pmc,openjdk-11-jre
 pmc,openjdk-11-jre
-pstbs,libgconf-2-4
+ps,libgconf-2-4
 pvkii
 pvkii
 pvr,libc++1
 pvr,libc++1
 pz,openjdk-11-jre,rng-tools
 pz,openjdk-11-jre,rng-tools
@@ -124,7 +124,7 @@ ut2k4
 ut3
 ut3
 ut99
 ut99
 vh,libc6-dev
 vh,libc6-dev
-vints,mono-complete
+vints,aspnetcore-runtime-7.0
 vpmc,openjdk-11-jre
 vpmc,openjdk-11-jre
 vs
 vs
 wet
 wet

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

@@ -83,7 +83,7 @@ opfor
 pc
 pc
 pc2
 pc2
 pmc,openjdk-17-jre
 pmc,openjdk-17-jre
-pstbs,libgconf-2-4
+ps,libgconf-2-4
 pvkii
 pvkii
 pvr,libc++1
 pvr,libc++1
 pz,openjdk-17-jre,rng-tools
 pz,openjdk-17-jre,rng-tools
@@ -124,7 +124,7 @@ ut2k4
 ut3
 ut3
 ut99
 ut99
 vh,libc6-dev
 vh,libc6-dev
-vints,mono-complete
+vints,aspnetcore-runtime-7.0
 vpmc,openjdk-11-jre
 vpmc,openjdk-11-jre
 vs
 vs
 wet
 wet

+ 0 - 135
lgsm/data/ubuntu-21.04.csv

@@ -1,135 +0,0 @@
-all,bc,binutils,bsdmainutils,bzip2,ca-certificates,cpio,curl,distro-info,file,gzip,hostname,jq,lib32gcc-s1,lib32stdc++6,netcat,python3,tar,tmux,unzip,util-linux,wget,xz-utils
-steamcmd,lib32gcc-s1,lib32stdc++6,libsdl2-2.0-0:i386,steamcmd
-ac
-ahl
-ahl2
-ark
-arma3
-armar,libcurl4
-ats
-av
-bb
-bb2,libcurl4-gnutls-dev:i386
-bd
-bf1942,libncurses5:i386,libtinfo5:i386
-bfv,libncurses5:i386,libstdc++5:i386
-bmdm,libncurses5:i386
-bo
-bs
-bt,libicu-dev,dos2unix,libxml2-utils
-btl
-cc
-cd
-ck,xvfb,libxi6
-cmw
-cod,libstdc++5:i386
-cod2,libstdc++5:i386
-cod4
-coduo,libstdc++5:i386
-codwaw
-col
-cs
-cscz
-csgo
-css,libtinfo5:i386
-ct
-dab
-dayz
-dmc
-dod
-dodr
-dods
-doi
-dst,libcurl4-gnutls-dev:i386
-dys
-eco,libgdiplus
-em
-etl
-ets2
-fctr
-fof
-gmod,libtinfo5:i386
-hcu
-hl2dm
-hldm
-hldms
-hw,lib32z1
-ins
-inss
-ios
-jc2
-jc3
-jk2
-kf
-kf2
-l4d
-l4d2
-lo
-mc,openjdk-17-jre
-mcb
-mh
-mohaa,libstdc++5:i386
-mom
-mta,libncursesw5,libxml2-utils
-nd
-nec
-nmrih,libtinfo5:i386
-ns
-ns2,speex,libtbb2
-ns2c,speex:i386,libtbb2
-ohd
-onset,libmariadb-dev
-opfor
-pc
-pc2
-pmc,openjdk-17-jre
-pstbs,libgconf-2-4
-pvkii
-pvr,libc++1
-pz,openjdk-17-jre,rng-tools
-q2
-q3
-ql
-qw
-ricochet
-ro
-rtcw
-rust,lib32z1
-rw,openjdk-17-jre
-samp
-sb
-sbots
-scpsl,mono-complete
-scpslsm,mono-complete
-sdtd,telnet,expect,libxml2-utils
-sf
-sfc,libtinfo5:i386
-sof2
-sol
-squad
-st,libxml2-utils
-stn
-sven,libssl1.1:i386,zlib1g:i386
-terraria
-tf2,libcurl4-gnutls-dev:i386
-tfc
-ti
-ts
-ts3
-tu
-tw
-unt
-ut
-ut2k4
-ut3
-ut99
-vh,libc6-dev
-vints,mono-complete
-vpmc,openjdk-11-jre
-vs
-wet
-wf
-wmc,openjdk-17-jre
-wurm,xvfb
-zmr,libtinfo5:i386
-zps,libtinfo5:i386

+ 0 - 135
lgsm/data/ubuntu-21.10.csv

@@ -1,135 +0,0 @@
-all,bc,binutils,bsdmainutils,bzip2,ca-certificates,cpio,curl,distro-info,file,gzip,hostname,jq,lib32gcc-s1,lib32stdc++6,netcat,python3,tar,tmux,unzip,util-linux,wget,xz-utils
-steamcmd,lib32gcc-s1,lib32stdc++6,libsdl2-2.0-0:i386,steamcmd
-ac
-ahl
-ahl2
-ark
-arma3
-armar,libcurl4
-ats
-av
-bb
-bb2,libcurl4-gnutls-dev:i386
-bd
-bf1942,libncurses5:i386,libtinfo5:i386
-bfv,libncurses5:i386,libstdc++5:i386
-bmdm,libncurses5:i386
-bo
-bs
-bt,libicu-dev,dos2unix,libxml2-utils
-btl
-cc
-cd
-ck,xvfb,libxi6
-cmw
-cod,libstdc++5:i386
-cod2,libstdc++5:i386
-cod4
-coduo,libstdc++5:i386
-codwaw
-col
-cs
-cscz
-csgo
-css,libtinfo5:i386
-ct
-dab
-dayz
-dmc
-dod
-dodr
-dods
-doi
-dst,libcurl4-gnutls-dev:i386
-dys
-eco,libgdiplus
-em
-etl
-ets2
-fctr
-fof
-gmod,libtinfo5:i386
-hcu
-hl2dm
-hldm
-hldms
-hw,lib32z1
-ins
-inss
-ios
-jc2
-jc3
-jk2
-kf
-kf2
-l4d
-l4d2
-lo
-mc,openjdk-17-jre
-mcb
-mh
-mohaa,libstdc++5:i386
-mom
-mta,libncursesw5,libxml2-utils
-nd
-nec
-nmrih,libtinfo5:i386
-ns
-ns2,speex,libtbb2
-ns2c,speex:i386,libtbb2
-ohd
-onset,libmariadb-dev
-opfor
-pc
-pc2
-pmc,openjdk-17-jre
-pstbs,libgconf-2-4
-pvkii
-pvr,libc++1
-pz,openjdk-17-jre,rng-tools
-q2
-q3
-ql
-qw
-ricochet
-ro
-rtcw
-rust,lib32z1
-rw,openjdk-17-jre
-samp
-sb
-sbots
-scpsl,mono-complete
-scpslsm,mono-complete
-sdtd,telnet,expect,libxml2-utils
-sf
-sfc,libtinfo5:i386
-sof2
-sol
-squad
-st,libxml2-utils
-stn
-sven,libssl1.1:i386,zlib1g:i386
-terraria
-tf2,libcurl4-gnutls-dev:i386
-tfc
-ti
-ts
-ts3
-tu
-tw
-unt
-ut
-ut2k4
-ut3
-ut99
-vh,libc6-dev
-vints,mono-complete
-vpmc,openjdk-11-jre
-vs
-wet
-wf
-wmc,openjdk-17-jre
-wurm,xvfb
-zmr,libtinfo5:i386
-zps,libtinfo5:i386

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

@@ -83,7 +83,7 @@ opfor
 pc
 pc
 pc2
 pc2
 pmc,openjdk-17-jre
 pmc,openjdk-17-jre
-pstbs,libgconf-2-4
+ps,libgconf-2-4
 pvkii
 pvkii
 pvr,libc++1
 pvr,libc++1
 pz,openjdk-17-jre,rng-tools5
 pz,openjdk-17-jre,rng-tools5
@@ -124,7 +124,7 @@ ut2k4
 ut3
 ut3
 ut99
 ut99
 vh,libc6-dev
 vh,libc6-dev
-vints,mono-complete
+vints,aspnetcore-runtime-7.0
 vpmc,openjdk-17-jre
 vpmc,openjdk-17-jre
 vs
 vs
 wet
 wet

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

@@ -83,7 +83,7 @@ opfor
 pc
 pc
 pc2
 pc2
 pmc,openjdk-17-jre
 pmc,openjdk-17-jre
-pstbs,libgconf-2-4
+ps,libgconf-2-4
 pvkii
 pvkii
 pvr,libc++1
 pvr,libc++1
 pz,openjdk-17-jre,rng-tools5
 pz,openjdk-17-jre,rng-tools5
@@ -124,7 +124,7 @@ ut2k4
 ut3
 ut3
 ut99
 ut99
 vh,libc6-dev
 vh,libc6-dev
-vints,mono-complete
+vints,aspnetcore-runtime-7.0
 vpmc,openjdk-17-jre
 vpmc,openjdk-17-jre
 vs
 vs
 wet
 wet

+ 11 - 0
lgsm/modules/alert.sh

@@ -72,6 +72,15 @@ fn_alert_check_update() {
 	alertbody="${gamename} update available: ${remotebuildversion}"
 	alertbody="${gamename} update available: ${remotebuildversion}"
 }
 }
 
 
+fn_alert_update_restart() {
+	fn_script_log_info "Sending alert: Restarted"
+	alertsubject="Alert - ${selfname} - Restarted"
+	alertemoji="🎮"
+	alertsound="1"
+	alerturl="not enabled"
+	alertbody="${gamename} received update: ${remotebuildversion} and required restarting"
+}
+
 fn_alert_permissions() {
 fn_alert_permissions() {
 	fn_script_log_info "Sending alert: Permissions error"
 	fn_script_log_info "Sending alert: Permissions error"
 	alertsubject="Alert - ${selfname}: Permissions error"
 	alertsubject="Alert - ${selfname}: Permissions error"
@@ -102,6 +111,8 @@ elif [ "${alert}" == "update" ]; then
 	fn_alert_update
 	fn_alert_update
 elif [ "${alert}" == "check-update" ]; then
 elif [ "${alert}" == "check-update" ]; then
 	fn_alert_check_update
 	fn_alert_check_update
+elif [ "${alert}" == "update-restart" ]; then
+	fn_alert_update_restart
 elif [ "${alert}" == "config" ]; then
 elif [ "${alert}" == "config" ]; then
 	fn_alert_config
 	fn_alert_config
 fi
 fi

+ 52 - 19
lgsm/modules/check_deps.sh

@@ -7,6 +7,19 @@
 
 
 moduleselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")"
 moduleselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")"
 
 
+fn_install_dotnet_repo() {
+	if [ "${distroid}" == "ubuntu" ]; then
+		# if package aspnetcore-runtime-7.0 is unavailable in ubuntu repos, add the microsoft repo.
+		if ! apt-cache show aspnetcore-runtime-7.0 > /dev/null 2>&1; then
+			fn_fetch_file "https://packages.microsoft.com/config/ubuntu/${distroversion}/packages-microsoft-prod.deb" "" "" "" "/tmp" "packages-microsoft-prod.deb" "" "" "" ""
+			sudo dpkg -i /tmp/packages-microsoft-prod.deb
+		fi
+	elif [ "${distroid}" == "debian" ]; then
+		fn_fetch_file "https://packages.microsoft.com/config/debian/${distroversion}/packages-microsoft-prod.deb" "" "" "" "/tmp" "packages-microsoft-prod.deb" "" "" "" ""
+		sudo dpkg -i /tmp/packages-microsoft-prod.deb
+	fi
+}
+
 fn_install_mono_repo() {
 fn_install_mono_repo() {
 	if [ "${autodepinstall}" == "0" ]; then
 	if [ "${autodepinstall}" == "0" ]; then
 		fn_print_information_nl "Automatically adding Mono repository."
 		fn_print_information_nl "Automatically adding Mono repository."
@@ -19,20 +32,26 @@ fn_install_mono_repo() {
 		sleep 1
 		sleep 1
 		echo -en "   \r"
 		echo -en "   \r"
 		if [ "${distroid}" == "ubuntu" ]; then
 		if [ "${distroid}" == "ubuntu" ]; then
-			if [ "${distroversion}" == "20.04" ]; then
-				cmd="sudo apt install gnupg ca-certificates;sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys 3FA7E0328081BFF6A14DA29AA6A19B38D3D831EF;echo 'deb https://download.mono-project.com/repo/ubuntu stable-focal main' | sudo tee /etc/apt/sources.list.d/mono-official-stable.list;sudo apt update"
+			if [ "${distroversion}" == "22.04" ]; then
+				cmd="sudo apt-get install gnupg ca-certificates;sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys 3FA7E0328081BFF6A14DA29AA6A19B38D3D831EF;echo 'deb https://download.mono-project.com/repo/ubuntu stable-jammy main' | sudo tee /etc/apt/sources.list.d/mono-official-stable.list;sudo apt update"
+			elif [ "${distroversion}" == "20.04" ]; then
+				cmd="sudo apt-get install gnupg ca-certificates;sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys 3FA7E0328081BFF6A14DA29AA6A19B38D3D831EF;echo 'deb https://download.mono-project.com/repo/ubuntu stable-focal main' | sudo tee /etc/apt/sources.list.d/mono-official-stable.list;sudo apt update"
 			elif [ "${distroversion}" == "18.04" ]; then
 			elif [ "${distroversion}" == "18.04" ]; then
-				cmd="sudo apt install gnupg ca-certificates;sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys 3FA7E0328081BFF6A14DA29AA6A19B38D3D831EF;echo 'deb https://download.mono-project.com/repo/ubuntu stable-bionic main' | sudo tee /etc/apt/sources.list.d/mono-official-stable.list;sudo apt update"
+				cmd="sudo apt-get install gnupg ca-certificates;sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys 3FA7E0328081BFF6A14DA29AA6A19B38D3D831EF;echo 'deb https://download.mono-project.com/repo/ubuntu stable-bionic main' | sudo tee /etc/apt/sources.list.d/mono-official-stable.list;sudo apt update"
 			elif [ "${distroversion}" == "16.04" ]; then
 			elif [ "${distroversion}" == "16.04" ]; then
 				cmd="sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys 3FA7E0328081BFF6A14DA29AA6A19B38D3D831EF;sudo apt install apt-transport-https ca-certificates;echo 'deb https://download.mono-project.com/repo/ubuntu stable-xenial main' | sudo tee /etc/apt/sources.list.d/mono-official-stable.list;sudo apt update"
 				cmd="sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys 3FA7E0328081BFF6A14DA29AA6A19B38D3D831EF;sudo apt install apt-transport-https ca-certificates;echo 'deb https://download.mono-project.com/repo/ubuntu stable-xenial main' | sudo tee /etc/apt/sources.list.d/mono-official-stable.list;sudo apt update"
 			else
 			else
 				monoautoinstall="1"
 				monoautoinstall="1"
 			fi
 			fi
 		elif [ "${distroid}" == "debian" ]; then
 		elif [ "${distroid}" == "debian" ]; then
-			if [ "${distroversion}" == "10" ]; then
-				cmd="sudo apt install apt-transport-https dirmngr gnupg ca-certificates;sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys 3FA7E0328081BFF6A14DA29AA6A19B38D3D831EF;echo 'deb https://download.mono-project.com/repo/debian stable-buster main' | sudo tee /etc/apt/sources.list.d/mono-official-stable.list;sudo apt update"
+			if [ "${distroversion}" == "12" ]; then
+				cmd="sudo apt-get install apt-transport-https dirmngr gnupg ca-certificates;sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys 3FA7E0328081BFF6A14DA29AA6A19B38D3D831EF;echo 'deb https://download.mono-project.com/repo/debian stable-bookworm main' | sudo tee /etc/apt/sources.list.d/mono-official-stable.list;sudo apt update"
+			elif [ "${distroversion}" == "11" ]; then
+				cmd="sudo apt-get install apt-transport-https dirmngr gnupg ca-certificates;sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys 3FA7E0328081BFF6A14DA29AA6A19B38D3D831EF;echo 'deb https://download.mono-project.com/repo/debian stable-bullseye main' | sudo tee /etc/apt/sources.list.d/mono-official-stable.list;sudo apt update"
+			elif [ "${distroversion}" == "10" ]; then
+				cmd="sudo apt-get install apt-transport-https dirmngr gnupg ca-certificates;sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys 3FA7E0328081BFF6A14DA29AA6A19B38D3D831EF;echo 'deb https://download.mono-project.com/repo/debian stable-buster main' | sudo tee /etc/apt/sources.list.d/mono-official-stable.list;sudo apt update"
 			elif [ "${distroversion}" == "9" ]; then
 			elif [ "${distroversion}" == "9" ]; then
-				cmd="sudo apt install apt-transport-https dirmngr gnupg ca-certificates;sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys 3FA7E0328081BFF6A14DA29AA6A19B38D3D831EF;echo 'deb https://download.mono-project.com/repo/debian stable-stretch main' | sudo tee /etc/apt/sources.list.d/mono-official-stable.list;sudo apt update"
+				cmd="sudo apt-get install apt-transport-https dirmngr gnupg ca-certificates;sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys 3FA7E0328081BFF6A14DA29AA6A19B38D3D831EF;echo 'deb https://download.mono-project.com/repo/debian stable-stretch main' | sudo tee /etc/apt/sources.list.d/mono-official-stable.list;sudo apt update"
 			else
 			else
 				monoautoinstall="1"
 				monoautoinstall="1"
 			fi
 			fi
@@ -93,16 +112,16 @@ fn_deps_email() {
 				array_deps_required+=(exim4)
 				array_deps_required+=(exim4)
 			elif [ -d /etc/sendmail ]; then
 			elif [ -d /etc/sendmail ]; then
 				array_deps_required+=(sendmail)
 				array_deps_required+=(sendmail)
-			elif [ "$(command -v dpkg-query 2> /dev/null)" ]; then
-				array_deps_required+=(mailutils postfix)
-			elif [ "$(command -v rpm 2> /dev/null)" ]; then
+			elif [ "$(command -v yum 2> /dev/null)" ] || [ "$(command -v dnf 2> /dev/null)" ]; then
 				array_deps_required+=(mailx postfix)
 				array_deps_required+=(mailx postfix)
+			elif [ "$(command -v apt 2> /dev/null)" ]; then
+				array_deps_required+=(mailutils postfix)
 			fi
 			fi
 		else
 		else
-			if [ "$(command -v dpkg-query 2> /dev/null)" ]; then
-				array_deps_required+=(mailutils postfix)
-			elif [ "$(command -v rpm 2> /dev/null)" ]; then
+			if [ "$(command -v yum 2> /dev/null)" ] || [ "$(command -v dnf 2> /dev/null)" ]; then
 				array_deps_required+=(mailx postfix)
 				array_deps_required+=(mailx postfix)
+			elif [ "$(command -v apt 2> /dev/null)" ]; then
+				array_deps_required+=(mailutils postfix)
 			fi
 			fi
 		fi
 		fi
 	fi
 	fi
@@ -129,10 +148,14 @@ fn_install_missing_deps() {
 		fi
 		fi
 		autodepinstall="$?"
 		autodepinstall="$?"
 
 
-		if [ "${monostatus}" == "1" ]; then
+		if [ "${monoinstalled}" == "false" ]; then
 			fn_install_mono_repo
 			fn_install_mono_repo
 		fi
 		fi
 
 
+		if [ "${dotnetinstalled}" == "false" ]; then
+			fn_install_dotnet_repo
+		fi
+
 		if [ "${commandname}" == "INSTALL" ]; then
 		if [ "${commandname}" == "INSTALL" ]; then
 			if [ "${autodepinstall}" == "0" ]; then
 			if [ "${autodepinstall}" == "0" ]; then
 				fn_print_information_nl "$(whoami) has sudo access."
 				fn_print_information_nl "$(whoami) has sudo access."
@@ -144,7 +167,7 @@ fn_install_missing_deps() {
 		fi
 		fi
 
 
 		# Add sudo dpkg --add-architecture i386 if using i386 packages.
 		# Add sudo dpkg --add-architecture i386 if using i386 packages.
-		if [ "$(command -v dpkg-query 2> /dev/null)" ]; then
+		if [ "$(command -v apt 2> /dev/null)" ]; then
 			if printf '%s\n' "${array_deps_required[@]}" | grep -q -P 'i386'; then
 			if printf '%s\n' "${array_deps_required[@]}" | grep -q -P 'i386'; then
 				i386installcommand="sudo dpkg --add-architecture i386; "
 				i386installcommand="sudo dpkg --add-architecture i386; "
 			fi
 			fi
@@ -161,7 +184,7 @@ fn_install_missing_deps() {
 			echo -en "...\r"
 			echo -en "...\r"
 			sleep 1
 			sleep 1
 			echo -en "   \r"
 			echo -en "   \r"
-			if [ "$(command -v dpkg-query 2> /dev/null)" ]; then
+			if [ "$(command -v apt 2> /dev/null)" ]; then
 				cmd="echo steamcmd steam/question select \"I AGREE\" | sudo debconf-set-selections; echo steamcmd steam/license note '' | sudo debconf-set-selections; ${i386installcommand}sudo apt-get update; sudo apt-get -y install ${array_deps_missing[*]}"
 				cmd="echo steamcmd steam/question select \"I AGREE\" | sudo debconf-set-selections; echo steamcmd steam/license note '' | sudo debconf-set-selections; ${i386installcommand}sudo apt-get update; sudo apt-get -y install ${array_deps_missing[*]}"
 				eval "${cmd}"
 				eval "${cmd}"
 			elif [ "$(command -v dnf 2> /dev/null)" ]; then
 			elif [ "$(command -v dnf 2> /dev/null)" ]; then
@@ -181,7 +204,7 @@ fn_install_missing_deps() {
 
 
 		# If automatic dependency install is unavailable.
 		# If automatic dependency install is unavailable.
 		if [ "${autodepinstall}" != "0" ]; then
 		if [ "${autodepinstall}" != "0" ]; then
-			if [ "$(command -v dpkg-query 2> /dev/null)" ]; then
+			if [ "$(command -v apt 2> /dev/null)" ]; then
 				echo -e "${i386installcommand}sudo apt update; sudo apt install ${array_deps_missing[*]}"
 				echo -e "${i386installcommand}sudo apt update; sudo apt install ${array_deps_missing[*]}"
 			elif [ "$(command -v dnf 2> /dev/null)" ]; then
 			elif [ "$(command -v dnf 2> /dev/null)" ]; then
 				echo -e "sudo dnf install ${array_deps_missing[*]}"
 				echo -e "sudo dnf install ${array_deps_missing[*]}"
@@ -248,13 +271,23 @@ fn_deps_detector() {
 		if [ -n "${monoversion}" ] && [ "${monoversion}" -ge "5" ]; then
 		if [ -n "${monoversion}" ] && [ "${monoversion}" -ge "5" ]; then
 			# Mono >= 5.0.0 already installed.
 			# Mono >= 5.0.0 already installed.
 			depstatus=0
 			depstatus=0
-			monostatus=0
+			monoinstalled=true
 		else
 		else
 			# Mono not installed or installed Mono < 5.0.0.
 			# Mono not installed or installed Mono < 5.0.0.
 			depstatus=1
 			depstatus=1
-			monostatus=1
+			monoinstalled=false
+		fi
+	# .NET Core: A .NET Core repo needs to be installed.
+	elif [ "${deptocheck}" == "aspnetcore-runtime-7.0" ]; then
+		# .NET is not installed.
+		if [ -n "${dotnetversion}" ]; then
+			depstatus=0
+			dotnetinstalled=true
+		else
+			depstatus=1
+			dotnetinstalled=false
 		fi
 		fi
-	elif [ "$(command -v dpkg-query 2> /dev/null)" ]; then
+	elif [ "$(command -v apt 2> /dev/null)" ]; then
 		dpkg-query -W -f='${Status}' "${deptocheck}" 2> /dev/null | grep -q -P '^install ok installed'
 		dpkg-query -W -f='${Status}' "${deptocheck}" 2> /dev/null | grep -q -P '^install ok installed'
 		depstatus=$?
 		depstatus=$?
 	elif [ "$(command -v dnf 2> /dev/null)" ]; then
 	elif [ "$(command -v dnf 2> /dev/null)" ]; then

+ 7 - 7
lgsm/modules/check_last_update.sh

@@ -3,21 +3,21 @@
 # Author: Daniel Gibbs
 # Author: Daniel Gibbs
 # Contributors: http://linuxgsm.com/contrib
 # Contributors: http://linuxgsm.com/contrib
 # Website: https://linuxgsm.com
 # Website: https://linuxgsm.com
-# Description: Checks lock file to see when last update happened.
+# Description: Checks Lockfile to see when last update happened.
 # Will reboot server if instance not rebooted since update.
 # Will reboot server if instance not rebooted since update.
 
 
 moduleselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")"
 moduleselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")"
 
 
-if [ -f "${lockdir}/${selfname}-laststart.lock" ]; then
-	laststart=$(cat "${lockdir}/${selfname}-laststart.lock")
+if [ -f "${lockdir}/${selfname}-last-started.lock" ]; then
+	laststart=$(cat "${lockdir}/${selfname}-last-started.lock")
 fi
 fi
-if [ -f "${lockdir}/lastupdate.lock" ]; then
-	lastupdate=$(cat "${lockdir}/lastupdate.lock")
+if [ -f "${lockdir}/last-updated.lock" ]; then
+	lastupdate=$(cat "${lockdir}/last-updated.lock")
 fi
 fi
 
 
 check_status.sh
 check_status.sh
-if [ -f "${lockdir}/lastupdate.lock" ] && [ "${status}" != "0" ]; then
-	if [ ! -f "${lockdir}/${selfname}-laststart.lock" ] || [ "${laststart}" -lt "${lastupdate}" ]; then
+if [ -f "${lockdir}/last-updated.lock" ] && [ "${status}" != "0" ]; then
+	if [ ! -f "${lockdir}/${selfname}-last-started.lock" ] || [ "${laststart}" -lt "${lastupdate}" ]; then
 		fn_print_info "${selfname} has not been restarted since last update"
 		fn_print_info "${selfname} has not been restarted since last update"
 		fn_script_log_info "${selfname} has not been restarted since last update"
 		fn_script_log_info "${selfname} has not been restarted since last update"
 		command_restart.sh
 		command_restart.sh

+ 5 - 0
lgsm/modules/check_logs.sh

@@ -24,3 +24,8 @@ fi
 if [ "${gamelogdir}" ] && [ -d "${gamelogdir}" ] && [ ! -d "${logdir}/server" ]; then
 if [ "${gamelogdir}" ] && [ -d "${gamelogdir}" ] && [ ! -d "${logdir}/server" ]; then
 	fn_check_logs
 	fn_check_logs
 fi
 fi
+
+# Create Steam log symlink if missing
+if [ ! -d "${logdir}/steam" ] && [ -n "${appid}" ]; then
+	fn_check_logs
+fi

+ 1 - 1
lgsm/modules/check_status.sh

@@ -7,4 +7,4 @@
 
 
 moduleselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")"
 moduleselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")"
 
 
-status=$(tmux -L "${sessionname}" list-sessions -F "#{session_name}" 2> /dev/null | grep -Ecx "^${sessionname}")
+status=$(tmux -L "${socketname}" list-sessions -F "#{session_name}" 2> /dev/null | grep -Ecx "^${sessionname}")

+ 1 - 1
lgsm/modules/check_system_requirements.sh

@@ -29,7 +29,7 @@ elif [ "${shortname}" == "rust" ]; then
 elif [ "${shortname}" == "mc" ] || [ "${shortname}" == "pmc" ] || [ "${shortname}" == "wmc" ]; then
 elif [ "${shortname}" == "mc" ] || [ "${shortname}" == "pmc" ] || [ "${shortname}" == "wmc" ]; then
 	ramrequirementmb="1000"
 	ramrequirementmb="1000"
 	ramrequirementgb="1"
 	ramrequirementgb="1"
-elif [ "${shortname}" == "pstbs" ]; then
+elif [ "${shortname}" == "ps" ]; then
 	ramrequirementmb="2000"
 	ramrequirementmb="2000"
 	ramrequirementgb="2"
 	ramrequirementgb="2"
 elif [ "${shortname}" == "ns2" ] || [ "${shortname}" == "ns2c" ]; then
 elif [ "${shortname}" == "ns2" ] || [ "${shortname}" == "ns2c" ]; then

+ 20 - 8
lgsm/modules/command_backup.sh

@@ -22,7 +22,7 @@ fn_backup_trap() {
 	echo -en "backup ${backupname}.tar.gz..."
 	echo -en "backup ${backupname}.tar.gz..."
 	fn_print_removed_eol_nl
 	fn_print_removed_eol_nl
 	fn_script_log_info "Backup ${backupname}.tar.gz: REMOVED"
 	fn_script_log_info "Backup ${backupname}.tar.gz: REMOVED"
-	# Remove lock file.
+	# Remove backup lockfile.
 	rm -f "${lockdir:?}/backup.lock"
 	rm -f "${lockdir:?}/backup.lock"
 	fn_backup_start_server
 	fn_backup_start_server
 	unset exitbypass
 	unset exitbypass
@@ -31,9 +31,21 @@ fn_backup_trap() {
 
 
 # Check if a backup is pending or has been aborted using backup.lock.
 # Check if a backup is pending or has been aborted using backup.lock.
 fn_backup_check_lockfile() {
 fn_backup_check_lockfile() {
+	# Remove stale lockfile.
 	if [ -f "${lockdir}/backup.lock" ]; then
 	if [ -f "${lockdir}/backup.lock" ]; then
-		fn_print_info_nl "Lock file found: Backup is currently running"
-		fn_script_log_error "Lock file found: Backup is currently running: ${lockdir}/backup.lock"
+		if [ "$(find "${lockdir}/backup.lock" -mmin +60)" ]; then
+			fn_print_dots "Lockfile found: "
+			fn_print_checking_eol
+			fn_print_warn "Lockfile found: Removing stale lockfile: "
+			fn_print_warn_eol
+			fn_script_log_warn "Lockfile found: Removing stale lockfile"
+			rm -f "${lockdir:?}/backup.lock"
+		fi
+	fi
+
+	if [ -f "${lockdir}/backup.lock" ]; then
+		fn_print_info_nl "Lockfile found: Backup is currently running"
+		fn_script_log_error "Lockfile found: Backup is currently running: ${lockdir}/backup.lock"
 		core_exit.sh
 		core_exit.sh
 	fi
 	fi
 }
 }
@@ -117,8 +129,8 @@ fn_backup_migrate_olddir() {
 
 
 fn_backup_create_lockfile() {
 fn_backup_create_lockfile() {
 	# Create lockfile.
 	# Create lockfile.
-	date '+%s' > "${lockdir}/backup.lock"
-	fn_script_log_info "Lockfile generated"
+	date '+%s' > "${lockdir:?}/backup.lock"
+	fn_script_log_info "Backup lockfile generated"
 	fn_script_log_info "${lockdir}/backup.lock"
 	fn_script_log_info "${lockdir}/backup.lock"
 	# trap to remove lockfile on quit.
 	# trap to remove lockfile on quit.
 	trap fn_backup_trap INT
 	trap fn_backup_trap INT
@@ -140,7 +152,7 @@ fn_backup_compression() {
 		core_exit.sh
 		core_exit.sh
 	fi
 	fi
 
 
-	tar -czf "${backupdir}/${backupname}.tar.gz" -C "${rootdir}" --exclude "${excludedir}" --exclude "${lockdir}/backup.lock" ./.
+	tar -czf "${backupdir}/${backupname}.tar.gz" -C "${rootdir}" --exclude "${excludedir}" --exclude "${lockdir}" ./.
 	local exitcode=$?
 	local exitcode=$?
 	if [ "${exitcode}" != 0 ]; then
 	if [ "${exitcode}" != 0 ]; then
 		fn_print_fail_eol
 		fn_print_fail_eol
@@ -153,8 +165,6 @@ fn_backup_compression() {
 		fn_print_ok_nl "Completed: ${backupname}.tar.gz, total size $(du -sh "${backupdir}/${backupname}.tar.gz" | awk '{print $1}')"
 		fn_print_ok_nl "Completed: ${backupname}.tar.gz, total size $(du -sh "${backupdir}/${backupname}.tar.gz" | awk '{print $1}')"
 		fn_script_log_pass "Backup created: ${backupname}.tar.gz, total size $(du -sh "${backupdir}/${backupname}.tar.gz" | awk '{print $1}')"
 		fn_script_log_pass "Backup created: ${backupname}.tar.gz, total size $(du -sh "${backupdir}/${backupname}.tar.gz" | awk '{print $1}')"
 	fi
 	fi
-	# Remove lock file
-	rm -f "${lockdir:?}/backup.lock"
 }
 }
 
 
 # Clear old backups according to maxbackups and maxbackupdays variables.
 # Clear old backups according to maxbackups and maxbackupdays variables.
@@ -265,4 +275,6 @@ fn_backup_compression
 fn_backup_prune
 fn_backup_prune
 fn_backup_start_server
 fn_backup_start_server
 
 
+# Remove backup lockfile.
+rm -f "${lockdir:?}/backup.lock"
 core_exit.sh
 core_exit.sh

+ 6 - 6
lgsm/modules/command_check_update.sh

@@ -17,19 +17,19 @@ core_logs.sh
 if [ "${shortname}" == "ts3" ]; then
 if [ "${shortname}" == "ts3" ]; then
 	update_ts3.sh
 	update_ts3.sh
 elif [ "${shortname}" == "mc" ]; then
 elif [ "${shortname}" == "mc" ]; then
-	update_minecraft.sh
+	update_mc.sh
 elif [ "${shortname}" == "mcb" ]; then
 elif [ "${shortname}" == "mcb" ]; then
-	update_minecraft_bedrock.sh
+	update_mcb.sh
 elif [ "${shortname}" == "pmc" ] || [ "${shortname}" == "vpmc" ] || [ "${shortname}" == "wmc" ]; then
 elif [ "${shortname}" == "pmc" ] || [ "${shortname}" == "vpmc" ] || [ "${shortname}" == "wmc" ]; then
-	update_papermc.sh
+	update_pmc.sh
 elif [ "${shortname}" == "fctr" ]; then
 elif [ "${shortname}" == "fctr" ]; then
-	update_factorio.sh
+	update_fctr.sh
 elif [ "${shortname}" == "mta" ]; then
 elif [ "${shortname}" == "mta" ]; then
 	update_mta.sh
 	update_mta.sh
 elif [ "${shortname}" == "jk2" ]; then
 elif [ "${shortname}" == "jk2" ]; then
-	update_jediknight2.sh
+	update_jk2.sh
 elif [ "${shortname}" == "vints" ]; then
 elif [ "${shortname}" == "vints" ]; then
-	update_vintagestory.sh
+	update_vints.sh
 elif [ "${shortname}" == "ut99" ]; then
 elif [ "${shortname}" == "ut99" ]; then
 	update_ut99.sh
 	update_ut99.sh
 else
 else

+ 1 - 1
lgsm/modules/command_console.sh

@@ -42,7 +42,7 @@ check_status.sh
 if [ "${status}" != "0" ]; then
 if [ "${status}" != "0" ]; then
 	fn_print_ok_nl "Accessing console"
 	fn_print_ok_nl "Accessing console"
 	fn_script_log_pass "Console accessed"
 	fn_script_log_pass "Console accessed"
-	tmux -L "${sessionname}" attach-session -t "${sessionname}"
+	tmux -L "${socketname}" attach-session -t "${sessionname}"
 	fn_print_ok_nl "Closing console"
 	fn_print_ok_nl "Closing console"
 	fn_script_log_pass "Console closed"
 	fn_script_log_pass "Console closed"
 else
 else

+ 9 - 9
lgsm/modules/command_debug.sh

@@ -13,7 +13,7 @@ fn_firstcommand_set
 # Trap to remove lockfile on quit.
 # Trap to remove lockfile on quit.
 fn_lockfile_trap() {
 fn_lockfile_trap() {
 	# Remove lockfile.
 	# Remove lockfile.
-	rm -f "${lockdir:?}/${selfname}.lock"
+	rm -f "${lockdir:?}/${selfname}-started.lock"
 	# resets terminal. Servers can sometimes mess up the terminal on exit.
 	# resets terminal. Servers can sometimes mess up the terminal on exit.
 	reset
 	reset
 	fn_print_dots "Stopping debug"
 	fn_print_dots "Stopping debug"
@@ -58,9 +58,9 @@ fi
 echo -e "${lightblue}Game Server IP:\t${default}${ip}:${port}"
 echo -e "${lightblue}Game Server IP:\t${default}${ip}:${port}"
 
 
 # External server IP.
 # External server IP.
-if [ "${extip}" ]; then
-	if [ "${ip}" != "${extip}" ]; then
-		echo -e "${lightblue}Internet IP:\t${default}${extip}:${port}"
+if [ "${publicip}" ]; then
+	if [ "${ip}" != "${publicip}" ]; then
+		echo -e "${lightblue}Internet IP:\t${default}${publicip}:${port}"
 	fi
 	fi
 fi
 fi
 
 
@@ -98,12 +98,12 @@ fn_print_dots "Starting debug"
 fn_script_log_info "Starting debug"
 fn_script_log_info "Starting debug"
 fn_print_ok_nl "Starting debug"
 fn_print_ok_nl "Starting debug"
 
 
-# Create lockfile.
-date '+%s' > "${lockdir}/${selfname}.lock"
-echo "${version}" >> "${lockdir}/${selfname}.lock"
-echo "${port}" >> "${lockdir}/${selfname}.lock"
+# Create started lockfile.
+date '+%s' > "${lockdir:?}/${selfname}-started.lock"
+echo "${version}" >> "${lockdir}/${selfname}-started.lock"
+echo "${port}" >> "${lockdir}/${selfname}-started.lock"
 fn_script_log_info "Lockfile generated"
 fn_script_log_info "Lockfile generated"
-fn_script_log_info "${lockdir}/${selfname}.lock"
+fn_script_log_info "${lockdir}/${selfname}-started.lock"
 
 
 if [ "${shortname}" == "av" ]; then
 if [ "${shortname}" == "av" ]; then
 	cd "${systemdir}" || exit
 	cd "${systemdir}" || exit

+ 1 - 1
lgsm/modules/command_dev_details.sh

@@ -44,7 +44,7 @@ declare -A server_details=(
 	['HTTP Password']="${httppassword}"
 	['HTTP Password']="${httppassword}"
 	['HTTP Port']="${httpport}"
 	['HTTP Port']="${httpport}"
 	['HTTP User']="${httpuser}"
 	['HTTP User']="${httpuser}"
-	['Internet IP']="${extip}"
+	['Internet IP']="${publicip}"
 	['LAN Port']="${lanport}"
 	['LAN Port']="${lanport}"
 	['Master Port']="${masterport}"
 	['Master Port']="${masterport}"
 	['Master']="${master}"
 	['Master']="${master}"

+ 1 - 1
lgsm/modules/command_dev_detect_glibc.sh

@@ -15,7 +15,7 @@ echo -e "================================="
 echo -e "glibc Requirements Checker"
 echo -e "glibc Requirements Checker"
 echo -e "================================="
 echo -e "================================="
 
 
-if [ ! "$(command -v objdump)" ]; then
+if [ ! "$(command -v objdump 2> /dev/null)" ]; then
 	fn_print_failure_nl "objdump is missing"
 	fn_print_failure_nl "objdump is missing"
 	fn_script_log_fatal "objdump is missing"
 	fn_script_log_fatal "objdump is missing"
 	core_exit.sh
 	core_exit.sh

+ 1 - 1
lgsm/modules/command_mods_remove.sh

@@ -131,7 +131,7 @@ fi
 if [ "${engine}" == "unity3d" ] && [[ "${modprettyname}" == *"Oxide"* ]]; then
 if [ "${engine}" == "unity3d" ] && [[ "${modprettyname}" == *"Oxide"* ]]; then
 	fn_print_information_nl "Validating to restore original ${gamename} files replaced by Oxide"
 	fn_print_information_nl "Validating to restore original ${gamename} files replaced by Oxide"
 	fn_script_log "Validating to restore original ${gamename} files replaced by Oxide"
 	fn_script_log "Validating to restore original ${gamename} files replaced by Oxide"
-	exitbypass="1"
+	exitbypass=1
 	command_validate.sh
 	command_validate.sh
 	fn_firstcommand_reset
 	fn_firstcommand_reset
 	unset exitbypass
 	unset exitbypass

+ 164 - 49
lgsm/modules/command_monitor.sh

@@ -11,76 +11,152 @@ commandaction="Monitoring"
 moduleselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")"
 moduleselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")"
 fn_firstcommand_set
 fn_firstcommand_set
 
 
-fn_monitor_check_lockfile() {
-	# Monitor does not run if lockfile is not found.
-	if [ ! -f "${lockdir}/${selfname}.lock" ]; then
+fn_monitor_check_monitoring() {
+	if [ -f "${lockdir}/${selfname}.lock" ]; then
+		# Part of migration to v23.5.0. #4296
+		rm -f "${lockdir:?}/${selfname}.lock"
+		date '+%s' > "${lockdir:?}/${selfname}-monitoring.lock"
+	elif [ ! -f "${lockdir}/${selfname}-monitoring.lock" ]; then
+		# Monitor does not run if lockfile is not found.
 		fn_print_dots "Checking lockfile: "
 		fn_print_dots "Checking lockfile: "
 		fn_print_checking_eol
 		fn_print_checking_eol
 		fn_script_log_info "Checking lockfile: CHECKING"
 		fn_script_log_info "Checking lockfile: CHECKING"
-		fn_monitor_check_update
-		fn_monitor_check_backup
-		fn_monitor_check_debug
 		fn_print_error "Checking lockfile: No lockfile found: "
 		fn_print_error "Checking lockfile: No lockfile found: "
 		fn_print_error_eol_nl
 		fn_print_error_eol_nl
 		fn_script_log_error "Checking lockfile: No lockfile found: ERROR"
 		fn_script_log_error "Checking lockfile: No lockfile found: ERROR"
 		echo -e "* Start ${selfname} to run monitor."
 		echo -e "* Start ${selfname} to run monitor."
 		core_exit.sh
 		core_exit.sh
 	fi
 	fi
+}
 
 
-	# Fix if lockfile is not unix time or contains letters
-	if [ -f "${lockdir}/${selfname}.lock" ] && [[ "$(head -n 1 "${lockdir}/${selfname}.lock")" =~ [A-Za-z] ]]; then
-		date '+%s' > "${lockdir}/${selfname}.lock"
-		echo "${version}" >> "${lockdir}/${selfname}.lock"
-		echo "${port}" >> "${lockdir}/${selfname}.lock"
+fn_monitor_check_install() {
+	if [ "$(pgrep -fc -u "${USER}" "/bin/bash ./${selfname} install")" != "0" ] || [ "$(pgrep -fcx -u "${USER}" "/bin/bash ./${selfname} i")" != "0" ] || [ "$(pgrep -fcx -u "${USER}" "/bin/bash ./${selfname} auto-install")" != "0" ] || [ "$(pgrep -fcx -u "${USER}" "/bin/bash ./${selfname} ai")" != "0" ]; then
+		fn_print_dots "Checking installer: "
+		fn_print_checking_eol
+		fn_script_log_info "Checking installer: CHECKING"
+		fn_print_info "Checking installer: LinuxGSM is installing: "
+		fn_print_info_eol_nl
+		fn_script_log_pass "Checking installer: LinuxGSM is installing"
+		core_exit.sh
 	fi
 	fi
 }
 }
 
 
-fn_monitor_check_backup() {
-	# Monitor will check if backup is running.
-	if [ "$(pgrep "${selfname} backup" | wc -l)" != "0" ] || [ "$(pgrep "${selfname} b" | wc -l)" != "0" ]; then
-		fn_print_info "Checking lockfile: LinuxGSM is currently running a backup: "
-		fn_print_info_eol
-		fn_script_log_info "Checking lockfile: LinuxGSM is currently running a backup"
+fn_monitor_check_debug() {
+	if [ "$(pgrep -fcx -u "${USER}" "/bin/bash ./${selfname} debug")" != "0" ] || [ "$(pgrep -fcx -u "${USER}" "/bin/bash ./${selfname} d")" != "0" ]; then
+		fn_print_dots "Checking debug: "
+		fn_print_checking_eol
+		fn_print_info "Checking debug: Debug is running: "
+		fn_print_info_eol_nl
+		fn_script_log_pass "Checking debug: Debug is running"
 		core_exit.sh
 		core_exit.sh
 	fi
 	fi
 }
 }
 
 
-fn_monitor_check_debug() {
-	# Monitor will check if backup is running.
-	if [ "$(pgrep -fc "${selfname} backup")" != "0" ] || [ "$(pgrep -fc "${selfname} b")" != "0" ]; then
-		fn_print_info "Checking lockfile: LinuxGSM is currently in debug mode: "
-		fn_print_info_eol
-		fn_script_log_pass "Checking lockfile: LinuxGSM is currently in debug mode"
+fn_monitor_check_starting() {
+	# Remove stale lockfile.
+	if [ -f "${lockdir}/${selfname}-starting.lock" ]; then
+		if [ "$(find "${lockdir}/${selfname}-starting.lock" -mmin +5)" ]; then
+			fn_print_dots "Checking start: "
+			fn_print_checking_eol
+			fn_print_warn "Checking start: Removing stale lockfile: "
+			fn_print_warn_eol_nl
+			fn_script_log_warn "Checking start: Removing stale lockfile"
+			rm -f "${lockdir:?}/${selfname}-starting.lock"
+		fi
+	fi
+
+	if [ -f "${lockdir}/${selfname}-starting.lock" ] && [[ "$(pgrep -fcx -u "${USER}" "/bin/bash ./${selfname} start")" != "0" || "$(pgrep -fcx -u "${USER}" "/bin/bash ./${selfname} s")" != "0" ]]; then
+		fn_print_dots "Checking start: "
+		fn_print_checking_eol
+		fn_print_info "Checking start: LinuxGSM is starting: "
+		fn_print_info_eol_nl
+		fn_script_log_info "Checking backup: LinuxGSM is starting"
 		core_exit.sh
 		core_exit.sh
 	fi
 	fi
 }
 }
 
 
-fn_monitor_check_install() {
-	# Monitor will check if update is running.
-	if [ "$(pgrep -fc "${selfname} install")" != "0" ] || [ "$(pgrep -fc "${selfname} i")" != "0" ] || [ "$(pgrep -fc "${selfname} auto-install")" != "0" ] || [ "$(pgrep -fc "${selfname} ai")" != "0" ]; then
-		fn_print_dots "Checking for installer: "
+fn_monitor_check_stopping() {
+	# Remove stale lockfile.
+	if [ -f "${lockdir}/${selfname}-stopping.lock" ]; then
+		if [ "$(find "${lockdir}/${selfname}-stopping.lock" -mmin +5)" ]; then
+			fn_print_dots "Checking stop: "
+			fn_print_checking_eol
+			fn_print_warn "Checking stop: Removing stale lockfile: "
+			fn_print_warn_eol_nl
+			fn_script_log_warn "Checking stop: Removing stale lockfile"
+			rm -f "${lockdir:?}/${selfname}-stopping.lock"
+		fi
+	fi
+
+	if [ -f "${lockdir}/${selfname}-stopping.lock" ] && [[ "$(pgrep -fcx -u "${USER}" "/bin/bash ./${selfname} stop")" != "0" || "$(pgrep -fcx -u "${USER}" "/bin/bash ./${selfname} s")" != "0" ]]; then
+		fn_print_dots "Checking stop: "
+		fn_print_checking_eol
+		fn_print_info "Checking stop: LinuxGSM is stopping: "
+		fn_print_info_eol_nl
+		fn_script_log_info "Checking backup: LinuxGSM is stopping"
+		core_exit.sh
+	fi
+}
+
+fn_monitor_check_backup() {
+	# Remove stale lockfile.
+	if [ -f "${lockdir}/backup.lock" ]; then
+		if [ "$(find "${lockdir}/backup.lock" -mmin +60)" ]; then
+			fn_print_dots "Checking backup: "
+			fn_print_checking_eol
+			fn_print_warn "Checking backup: Removing stale lockfile: "
+			fn_print_warn_eol
+			fn_script_log_warn "Checking backup: Removing stale lockfile"
+			rm -f "${lockdir:?}/backup.lock"
+		fi
+	fi
+
+	if [ -f "${lockdir}/backup.lock" ] && [[ "$(pgrep -fcx -u "${USER}" "/bin/bash ./${selfname} backup")" != "0" || "$(pgrep -fcx -u "${USER}" "/bin/bash ./${selfname} b")" != "0" ]]; then
+		fn_print_dots "Checking backup: "
 		fn_print_checking_eol
 		fn_print_checking_eol
-		fn_script_log_info "Checking for installer: CHECKING"
-		fn_print_info "Checking for installer: LinuxGSM is currently installing: "
-		fn_print_info_eol
-		fn_script_log_pass "Checking for installer: LinuxGSM is currently installing"
+		fn_print_info "Checking backup: Backup is running: "
+		fn_print_info_eol_nl
+		fn_script_log_info "Checking backup: Backup is running"
 		core_exit.sh
 		core_exit.sh
 	fi
 	fi
 }
 }
 
 
 fn_monitor_check_update() {
 fn_monitor_check_update() {
-	# Specific check for docker. Will ignore the command watch -n 1800 ./csgoserver update
-	monitorps=0
-	if [ "$(pgrep -fc "n*${selfname} update")" != "0" ]; then
-		monitorps="$((monitorps - 1))"
+	# Remove stale lockfile.
+	if [ -f "${lockdir}/update.lock" ]; then
+		if [ "$(find "${lockdir}/update.lock" -mmin +15)" ]; then
+			fn_print_dots "Checking update: "
+			fn_print_checking_eol
+			fn_print_warn "Checking update: Removing stale lockfile: "
+			fn_print_warn_eol_nl
+			fn_script_log_warn "Checking update: Removing stale lockfile"
+			rm -f "${lockdir:?}/update.lock"
+		fi
 	fi
 	fi
-	# Monitor will check if an update is running.
-	if [ "$(pgrep -fc "${selfname} update")" != "0" ] || [ "$(pgrep -fc "${selfname} u")" != "0" ] || [ "$(pgrep -fc "${selfname} validate")" != "0" ] || [ "$(pgrep -fc "${selfname} v")" != "0" ]; then
-		monitorps="$((monitorps + 2))"
-		if [ "${monitorps}" != "0" ]; then
-			fn_print_info_nl "Checking lockfile: LinuxGSM is currently updating: "
-			fn_print_info_eol
-			fn_script_log_pass "Checking lockfile: LinuxGSM is currently updating"
+
+	if [ -f "${lockdir}/update.lock" ] && [[ "$(pgrep -fcx -u "${USER}" "/bin/bash ./${selfname} update")" != "0" || "$(pgrep -fcx -u "${USER}" "/bin/bash ./${selfname} validate")" != "0" || "$(pgrep -fcx -u "${USER}" "/bin/bash ./${selfname} v")" != "0" || "$(pgrep -fc force-update "${USER}" "/bin/bash ./${selfname} fu")" != "0" ]]; then
+		fn_print_dots "Checking update: "
+		fn_print_checking_eol
+		fn_print_info "Checking update: LinuxGSM is updating the game server: "
+		fn_print_info_eol_nl
+		fn_script_log_pass "Checking update: LinuxGSM is updating the game server"
+		core_exit.sh
+	fi
+}
+
+# Source engine games may display a messages to indicate the server needs restarting.
+fn_monitor_check_update_source() {
+	if [ -f "${consolelogdir}/${selfname}-console.log" ] && [ "${engine}" == "source" ]; then
+		if grep -q "Your server needs to be restarted in order to receive the latest update." "${consolelogdir}/${selfname}-console.log"; then
+			fn_print_dots "Checking update: "
+			fn_print_checking_eol
+			fn_script_log_info "Checking update: CHECKING"
+			fn_print_ok "Checking update: "
+			fn_print_ok_eol_nl
+			fn_script_log_info "Checking update: Monitor is restarting ${selfname} to apply update"
+			alert="update-restart"
+			alert.sh
+			command_restart.sh
 			core_exit.sh
 			core_exit.sh
 		fi
 		fi
 	fi
 	fi
@@ -90,8 +166,40 @@ fn_monitor_check_session() {
 	fn_print_dots "Checking session: "
 	fn_print_dots "Checking session: "
 	fn_print_checking_eol
 	fn_print_checking_eol
 	fn_script_log_info "Checking session: CHECKING"
 	fn_script_log_info "Checking session: CHECKING"
-	# uses status var from check_status.sh
-	if [ "${status}" != "0" ]; then
+	# Tmux session width and height needs to be reviewed as may no longer be required.
+	sessionwidth="80"
+	sessionheight="23"
+	# Check for PIDS with identical tmux sessions running.
+	if [ "$(pgrep -fcx "tmux -L ${socketname} new-session -d -x ${sessionwidth} -y ${sessionheight} -s ${sessionname}")" -ge "2" ]; then
+		fn_print_error "Checking session: There are PIDS with identical tmux sessions running: "
+		fn_print_error_eol_nl
+		fn_script_log_error "Checking session: ERROR"
+		fn_script_log_error "Checking session: There are PIDS with identical tmux sessions running"
+		fn_script_log_error "Checking session: Killing all tmux sessions with the socketname name ${socketname} and session name ${sessionname}"
+		pkill -f "tmux -L ${socketname} new-session -d -x ${sessionwidth} -y ${sessionheight} -s ${sessionname}"
+		command_restart.sh
+		core_exit.sh
+	# Check for tmux pids with the same tmux session and socket names. This will reduce issues with migration to release v23.5.0. #4296
+	elif [ "$(pgrep -fc -u "${USER}" "tmux -L ${sessionname} new-session -d -x ${sessionwidth} -y ${sessionheight} -s ${sessionname}")" != "0" ]; then
+		fn_print_error "Checking session: PIDS with the same tmux session and socket names are running: "
+		fn_print_error_eol_nl
+		fn_script_log_error "Checking session: ERROR"
+		fn_script_log_error "Checking session: PIDS with the same tmux session and socket names are running"
+		fn_script_log_error "Checking session: Killing session with the socketname name ${sessionname} and session name ${sessionname}"
+		pkill -f "tmux -L ${sessionname} new-session -d -x ${sessionwidth} -y ${sessionheight} -s ${sessionname}"
+		command_restart.sh
+		core_exit.sh
+	# Check for tmux pids that are using the old type of tmux session. This will reduce issues with migration to release v23.5.0. #4296
+	elif [ "$(pgrep -fc -u "${USER}" "tmux new-session -d -x ${sessionwidth} -y ${sessionheight} -s ${sessionname}")" != "0" ]; then
+		fn_print_error "Checking session: PIDS with old type tmux session are running: "
+		fn_print_error_eol_nl
+		fn_script_log_error "Checking session: ERROR"
+		fn_script_log_error "Checking session: PIDS with old type tmux session are running"
+		fn_script_log_error "Checking session: Killing session with the session name ${sessionname}"
+		pkill -f "tmux new-session -d -x ${sessionwidth} -y ${sessionheight} -s ${sessionname}"
+		command_restart.sh
+		core_exit.sh
+	elif [ "${status}" != "0" ]; then
 		fn_print_ok "Checking session: "
 		fn_print_ok "Checking session: "
 		fn_print_ok_eol_nl
 		fn_print_ok_eol_nl
 		fn_script_log_pass "Checking session: OK"
 		fn_script_log_pass "Checking session: OK"
@@ -107,8 +215,8 @@ fn_monitor_check_session() {
 	fi
 	fi
 }
 }
 
 
+# Monitor will check queryport is set before continuing.
 fn_monitor_check_queryport() {
 fn_monitor_check_queryport() {
-	# Monitor will check queryport is set before continuing.
 	if [ -z "${queryport}" ] || [ "${queryport}" == "0" ]; then
 	if [ -z "${queryport}" ] || [ "${queryport}" == "0" ]; then
 		fn_print_dots "Checking port: "
 		fn_print_dots "Checking port: "
 		fn_print_checking_eol
 		fn_print_checking_eol
@@ -133,7 +241,7 @@ fn_query_gsquery() {
 }
 }
 
 
 fn_query_tcp() {
 fn_query_tcp() {
-	bash -c 'exec 3<> /dev/tcp/'${queryip}'/'${queryport}'' > /dev/null 2>&1
+	bash -c "exec 3<> /dev/tcp/'${queryip}'/'${queryport}'" > /dev/null 2>&1
 	querystatus="$?"
 	querystatus="$?"
 }
 }
 
 
@@ -147,12 +255,12 @@ fn_monitor_query() {
 			fn_print_querying_eol
 			fn_print_querying_eol
 			fn_script_log_info "Querying port: ${querymethod}: ${queryip}:${queryport} : ${queryattempt} : QUERYING"
 			fn_script_log_info "Querying port: ${querymethod}: ${queryip}:${queryport} : ${queryattempt} : QUERYING"
 			# querydelay
 			# querydelay
-			if [ "$(head -n 1 "${lockdir}/${selfname}.lock")" -gt "$(date "+%s" -d "${querydelay} mins ago")" ]; then
+			if [ "$(head -n 1 "${lockdir}/${selfname}-started.lock")" -gt "$(date "+%s" -d "${querydelay} mins ago")" ]; then
 				fn_print_ok "Querying port: ${querymethod}: ${ip}:${queryport} : ${totalseconds}/${queryattempt}: "
 				fn_print_ok "Querying port: ${querymethod}: ${ip}:${queryport} : ${totalseconds}/${queryattempt}: "
 				fn_print_delay_eol_nl
 				fn_print_delay_eol_nl
 				fn_script_log_info "Querying port: ${querymethod}: ${ip}:${queryport} : ${queryattempt} : DELAY"
 				fn_script_log_info "Querying port: ${querymethod}: ${ip}:${queryport} : ${queryattempt} : DELAY"
 				fn_script_log_info "Query bypassed: ${gameservername} started less than ${querydelay} minutes ago"
 				fn_script_log_info "Query bypassed: ${gameservername} started less than ${querydelay} minutes ago"
-				fn_script_log_info "Server started: $(date -d @$(head -n 1 "${lockdir}/${selfname}.lock"))"
+				fn_script_log_info "Server started: $(date -d "@$(head -n 1 "${lockdir}/${selfname}-started.lock")")"
 				fn_script_log_info "Current time: $(date)"
 				fn_script_log_info "Current time: $(date)"
 				monitorpass=1
 				monitorpass=1
 				core_exit.sh
 				core_exit.sh
@@ -271,8 +379,15 @@ core_logs.sh
 info_game.sh
 info_game.sh
 
 
 # query pre-checks
 # query pre-checks
-fn_monitor_check_lockfile
+fn_monitor_check_update_source
+fn_monitor_check_update
+fn_monitor_check_backup
+fn_monitor_check_debug
+fn_monitor_check_monitoring
+fn_monitor_check_starting
+fn_monitor_check_stopping
 fn_monitor_check_session
 fn_monitor_check_session
+
 # Monitor will not continue if session only check.
 # Monitor will not continue if session only check.
 if [ "${querymode}" != "1" ]; then
 if [ "${querymode}" != "1" ]; then
 	fn_monitor_check_queryport
 	fn_monitor_check_queryport

+ 1 - 1
lgsm/modules/command_restart.sh

@@ -5,7 +5,7 @@
 # Website: https://linuxgsm.com
 # Website: https://linuxgsm.com
 # Description: Restarts the server.
 # Description: Restarts the server.
 
 
-commandname="MODS-INSTALL"
+commandname="RESTART"
 commandaction="Restarting"
 commandaction="Restarting"
 moduleselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")"
 moduleselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")"
 fn_firstcommand_set
 fn_firstcommand_set

+ 1 - 1
lgsm/modules/command_send.sh

@@ -26,7 +26,7 @@ if [ "${status}" != "0" ]; then
 	fi
 	fi
 	echo ""
 	echo ""
 	fn_print_dots "Sending command to console: \"${commandtosend}\""
 	fn_print_dots "Sending command to console: \"${commandtosend}\""
-	tmux -L "${sessionname}" send-keys -t "${servicename}" "${commandtosend}" ENTER
+	tmux -L "${socketname}" send-keys -t "${servicename}" "${commandtosend}" ENTER
 	fn_print_ok_nl "Sending command to console: \"${commandtosend}\""
 	fn_print_ok_nl "Sending command to console: \"${commandtosend}\""
 	fn_script_log_pass "Command \"${commandtosend}\" sent to console"
 	fn_script_log_pass "Command \"${commandtosend}\" sent to console"
 else
 else

+ 3 - 0
lgsm/modules/command_skeleton.sh

@@ -5,7 +5,10 @@
 # Website: https://linuxgsm.com
 # Website: https://linuxgsm.com
 # Description: Creates an copy of a game servers directorys.
 # Description: Creates an copy of a game servers directorys.
 
 
+commandname="SKELETON"
+commandaction="Skeleton"
 moduleselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")"
 moduleselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")"
+fn_firstcommand_set
 
 
 fn_print_dots "Creating skeleton directory"
 fn_print_dots "Creating skeleton directory"
 check.sh
 check.sh

+ 51 - 51
lgsm/modules/command_start.sh

@@ -11,39 +11,14 @@ moduleselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")"
 addtimestamp="gawk '{ print strftime(\\\"[$logtimestampformat]\\\"), \\\$0 }'"
 addtimestamp="gawk '{ print strftime(\\\"[$logtimestampformat]\\\"), \\\$0 }'"
 fn_firstcommand_set
 fn_firstcommand_set
 
 
-fn_start_teamspeak3() {
-	if [ ! -f "${servercfgfullpath}" ]; then
-		fn_print_warn_nl "${servercfgfullpath} is missing"
-		fn_script_log_warn "${servercfgfullpath} is missing"
-		echo "	* Creating blank ${servercfg}"
-		fn_script_log_info "Creating blank ${servercfg}"
-		fn_sleep_time
-		echo "	* ${servercfg} can remain blank by default."
-		fn_script_log_info "${servercfgfullpath} can remain blank by default."
-		fn_sleep_time
-		echo "	* ${servercfg} is located in ${servercfgfullpath}."
-		fn_script_log_info "${servercfg} is located in ${servercfgfullpath}."
-		sleep 5
-		touch "${servercfgfullpath}"
-	fi
-	# Accept license.
-	if [ ! -f "${executabledir}/.ts3server_license_accepted" ]; then
-		install_eula.sh
-	fi
-	fn_start_tmux
-}
-
 # This will allow the Jedi Knight 2 version to be printed in console on start.
 # This will allow the Jedi Knight 2 version to be printed in console on start.
 # Used to allow update to detect JK2MV server version.
 # Used to allow update to detect JK2MV server version.
 fn_start_jk2() {
 fn_start_jk2() {
 	fn_start_tmux
 	fn_start_tmux
-	tmux -L "${sessionname}" end -t "${sessionname}" version ENTER > /dev/null 2>&1
+	tmux -L "${socketname}" end -t "${sessionname}" version ENTER > /dev/null 2>&1
 }
 }
 
 
 fn_start_tmux() {
 fn_start_tmux() {
-	if [ "${parmsbypass}" ]; then
-		startparameters=""
-	fi
 	# check for tmux size variables.
 	# check for tmux size variables.
 	if [[ "${servercfgtmuxwidth}" =~ ^[0-9]+$ ]]; then
 	if [[ "${servercfgtmuxwidth}" =~ ^[0-9]+$ ]]; then
 		sessionwidth="${servercfgtmuxwidth}"
 		sessionwidth="${servercfgtmuxwidth}"
@@ -68,35 +43,44 @@ fn_start_tmux() {
 		mv "${consolelog}" "${consolelogdate}"
 		mv "${consolelog}" "${consolelogdate}"
 	fi
 	fi
 
 
-	# Create lockfile
-	date '+%s' > "${lockdir}/${selfname}.lock"
-	echo "${version}" >> "${lockdir}/${selfname}.lock"
-	echo "${port}" >> "${lockdir}/${selfname}.lock"
+	# Create a starting lockfile that only exists while the start command is running.
+	date '+%s' > "${lockdir:?}/${selfname}-starting.lock"
+
 	fn_reload_startparameters
 	fn_reload_startparameters
 
 
+	# Create uid to ensure unique tmux socket name.
+	if [ ! -f "${datadir}/${selfname}.uid" ]; then
+		check_status.sh
+		if [ "${status}" != "0" ]; then
+			# stop running server (if running) to prevent lingering tmux sessions.
+			exitbypass=1
+			command_stop.sh
+		fi
+		uid=$(date '+%s' | sha1sum | head -c 8)
+		echo "${uid}" > "${datadir}/${selfname}.uid"
+		socketname="${sessionname}-$(cat "${datadir}/${selfname}.uid")"
+	fi
+
 	if [ "${shortname}" == "av" ]; then
 	if [ "${shortname}" == "av" ]; then
 		cd "${systemdir}" || exit
 		cd "${systemdir}" || exit
 	else
 	else
 		cd "${executabledir}" || exit
 		cd "${executabledir}" || exit
 	fi
 	fi
 
 
-	tmux -L "${sessionname}" new-session -d -x "${sessionwidth}" -y "${sessionheight}" -s "${sessionname}" "${preexecutable} ${executable} ${startparameters}" 2> "${lgsmlogdir}/.${selfname}-tmux-error.tmp"
+	tmux -L "${socketname}" new-session -d -x "${sessionwidth}" -y "${sessionheight}" -s "${sessionname}" "${preexecutable} ${executable} ${startparameters}" 2> "${lgsmlogdir}/.${selfname}-tmux-error.tmp"
 
 
 	# Create logfile.
 	# Create logfile.
 	touch "${consolelog}"
 	touch "${consolelog}"
 
 
-	# Create last start lock file
-	date +%s > "${lockdir}/${selfname}-laststart.lock"
-
 	# tmux compiled from source will return "master", therefore ignore it.
 	# tmux compiled from source will return "master", therefore ignore it.
 	if [ "${tmuxv}" == "master" ]; then
 	if [ "${tmuxv}" == "master" ]; then
 		fn_script_log "tmux version: master (user compiled)"
 		fn_script_log "tmux version: master (user compiled)"
 		echo -e "tmux version: master (user compiled)" >> "${consolelog}"
 		echo -e "tmux version: master (user compiled)" >> "${consolelog}"
 		if [ "${consolelogging}" == "on" ] || [ -z "${consolelogging}" ]; then
 		if [ "${consolelogging}" == "on" ] || [ -z "${consolelogging}" ]; then
-			if [ "$logtimestamp" == "on" ]; then
-				tmux -L "${sessionname}" pipe-pane -o -t "${sessionname}" "exec bash -c \"cat | $addtimestamp\" >> '${consolelog}'"
+			if [ "${logtimestamp}" == "on" ]; then
+				tmux -L "${socketname}" pipe-pane -o -t "${sessionname}" "exec bash -c \"cat | $addtimestamp\" >> '${consolelog}'"
 			else
 			else
-				tmux -L "${sessionname}" pipe-pane -o -t "${sessionname}" "exec cat >> '${consolelog}'"
+				tmux -L "${socketname}" pipe-pane -o -t "${sessionname}" "exec cat >> '${consolelog}'"
 			fi
 			fi
 		fi
 		fi
 
 
@@ -114,10 +98,10 @@ fn_start_tmux() {
 			Currently installed: $(tmux -V)" > "${consolelog}"
 			Currently installed: $(tmux -V)" > "${consolelog}"
 		# Console logging enable or not set.
 		# Console logging enable or not set.
 		elif [ "${consolelogging}" == "on" ] || [ -z "${consolelogging}" ]; then
 		elif [ "${consolelogging}" == "on" ] || [ -z "${consolelogging}" ]; then
-			if [ "$logtimestamp" == "on" ]; then
-				tmux -L "${sessionname}" pipe-pane -o -t "${sessionname}" "exec bash -c \"cat | $addtimestamp\" >> '${consolelog}'"
+			if [ "${logtimestamp}" == "on" ]; then
+				tmux -L "${socketname}" pipe-pane -o -t "${sessionname}" "exec bash -c \"cat | $addtimestamp\" >> '${consolelog}'"
 			else
 			else
-				tmux -L "${sessionname}" pipe-pane -o -t "${sessionname}" "exec cat >> '${consolelog}'"
+				tmux -L "${socketname}" pipe-pane -o -t "${sessionname}" "exec cat >> '${consolelog}'"
 			fi
 			fi
 		fi
 		fi
 	else
 	else
@@ -127,7 +111,7 @@ fn_start_tmux() {
 
 
 	# Console logging disabled.
 	# Console logging disabled.
 	if [ "${consolelogging}" == "off" ]; then
 	if [ "${consolelogging}" == "off" ]; then
-		echo -e "Console logging disabled by user" >> "${consolelog}"
+		echo -e "Console logging disabled in settings" >> "${consolelog}"
 		fn_script_log_info "Console logging disabled by user"
 		fn_script_log_info "Console logging disabled by user"
 	fi
 	fi
 	fn_sleep_time
 	fn_sleep_time
@@ -176,8 +160,20 @@ fn_start_tmux() {
 				fi
 				fi
 			fi
 			fi
 		fi
 		fi
+		# Remove starting lockfile when command ends.
+		rm -f "${lockdir:?}/${selfname}-starting.lock"
 		core_exit.sh
 		core_exit.sh
 	else
 	else
+		# Create start lockfile that exists only when the server is running.
+		date '+%s' > "${lockdir:?}/${selfname}-started.lock"
+		echo "${version}" >> "${lockdir}/${selfname}-started.lock"
+		echo "${port}" >> "${lockdir}/${selfname}-started.lock"
+		fn_print_ok "${servername}"
+		fn_script_log_pass "Started ${servername}"
+
+		# Create last started Lockfile.
+		date +%s > "${lockdir}/${selfname}-last-started.lock"
+
 		fn_print_ok "${servername}"
 		fn_print_ok "${servername}"
 		fn_script_log_pass "Started ${servername}"
 		fn_script_log_pass "Started ${servername}"
 	fi
 	fi
@@ -185,25 +181,30 @@ fn_start_tmux() {
 	echo -en "\n"
 	echo -en "\n"
 }
 }
 
 
+# If user ran the start command monitor will become enabled.
+if [ "${firstcommandname}" == "START" ] || [ "${firstcommandname}" == "RESTART" ]; then
+	date '+%s' > "${lockdir:?}/${selfname}-monitoring.lock"
+fi
+
 check.sh
 check.sh
 
 
-# Is the server already started.
-# $status comes from check_status.sh, which is run by check.sh for this command
+# If the server already started dont start again.
 if [ "${status}" != "0" ]; then
 if [ "${status}" != "0" ]; then
 	fn_print_dots "${servername}"
 	fn_print_dots "${servername}"
 	fn_print_info_nl "${servername} is already running"
 	fn_print_info_nl "${servername} is already running"
 	fn_script_log_error "${servername} is already running"
 	fn_script_log_error "${servername} is already running"
 	if [ -z "${exitbypass}" ]; then
 	if [ -z "${exitbypass}" ]; then
+		# Remove starting lockfile when command ends.
+		rm -f "${lockdir:?}/${selfname}-starting.lock"
 		core_exit.sh
 		core_exit.sh
 	fi
 	fi
 fi
 fi
-if [ -z "${fixbypass}" ]; then
-	fix.sh
-fi
+
+fix.sh
 info_game.sh
 info_game.sh
 core_logs.sh
 core_logs.sh
 
 
-# Will check for updates is updateonstart is yes.
+# Will check for updates if updateonstart is yes.
 if [ "${updateonstart}" == "yes" ] || [ "${updateonstart}" == "1" ] || [ "${updateonstart}" == "on" ]; then
 if [ "${updateonstart}" == "yes" ] || [ "${updateonstart}" == "1" ] || [ "${updateonstart}" == "on" ]; then
 	exitbypass=1
 	exitbypass=1
 	unset updateonstart
 	unset updateonstart
@@ -212,13 +213,12 @@ if [ "${updateonstart}" == "yes" ] || [ "${updateonstart}" == "1" ] || [ "${upda
 fi
 fi
 
 
 fn_print_dots "${servername}"
 fn_print_dots "${servername}"
-
-if [ "${shortname}" == "ts3" ]; then
-	fn_start_teamspeak3
-elif [ "${shortname}" == "jk2" ]; then
+if [ "${shortname}" == "jk2" ]; then
 	fn_start_jk2
 	fn_start_jk2
 else
 else
 	fn_start_tmux
 	fn_start_tmux
 fi
 fi
 
 
+# Remove starting lockfile when command ends.
+rm -f "${lockdir:?}/${selfname}-starting.lock"
 core_exit.sh
 core_exit.sh

+ 26 - 15
lgsm/modules/command_stop.sh

@@ -15,7 +15,7 @@ fn_stop_graceful_ctrlc() {
 	fn_print_dots "Graceful: CTRL+c"
 	fn_print_dots "Graceful: CTRL+c"
 	fn_script_log_info "Graceful: CTRL+c"
 	fn_script_log_info "Graceful: CTRL+c"
 	# Sends quit.
 	# Sends quit.
-	tmux -L "${sessionname}" send-keys -t "${sessionname}" C-c > /dev/null 2>&1
+	tmux -L "${socketname}" send-keys -t "${sessionname}" C-c > /dev/null 2>&1
 	# Waits up to 30 seconds giving the server time to shutdown gracefuly.
 	# Waits up to 30 seconds giving the server time to shutdown gracefuly.
 	for seconds in {1..30}; do
 	for seconds in {1..30}; do
 		check_status.sh
 		check_status.sh
@@ -43,7 +43,7 @@ fn_stop_graceful_cmd() {
 	fn_print_dots "Graceful: sending \"${1}\""
 	fn_print_dots "Graceful: sending \"${1}\""
 	fn_script_log_info "Graceful: sending \"${1}\""
 	fn_script_log_info "Graceful: sending \"${1}\""
 	# Sends specific stop command.
 	# Sends specific stop command.
-	tmux -L "${sessionname}" send -t "${sessionname}" ENTER "${1}" ENTER > /dev/null 2>&1
+	tmux -L "${socketname}" send -t "${sessionname}" ENTER "${1}" ENTER > /dev/null 2>&1
 	# Waits up to ${seconds} seconds giving the server time to shutdown gracefully.
 	# Waits up to ${seconds} seconds giving the server time to shutdown gracefully.
 	for ((seconds = 1; seconds <= ${2}; seconds++)); do
 	for ((seconds = 1; seconds <= ${2}; seconds++)); do
 		check_status.sh
 		check_status.sh
@@ -71,7 +71,7 @@ fn_stop_graceful_goldsrc() {
 	fn_print_dots "Graceful: sending \"quit\""
 	fn_print_dots "Graceful: sending \"quit\""
 	fn_script_log_info "Graceful: sending \"quit\""
 	fn_script_log_info "Graceful: sending \"quit\""
 	# sends quit
 	# sends quit
-	tmux -L "${sessionname}" send -t "${sessionname}" quit ENTER > /dev/null 2>&1
+	tmux -L "${socketname}" send -t "${sessionname}" quit ENTER > /dev/null 2>&1
 	# Waits 3 seconds as goldsrc servers restart with the quit command.
 	# Waits 3 seconds as goldsrc servers restart with the quit command.
 	for seconds in {1..3}; do
 	for seconds in {1..3}; do
 		sleep 1
 		sleep 1
@@ -184,10 +184,10 @@ fn_stop_graceful_avorion() {
 	fn_print_dots "Graceful: /save /stop"
 	fn_print_dots "Graceful: /save /stop"
 	fn_script_log_info "Graceful: /save /stop"
 	fn_script_log_info "Graceful: /save /stop"
 	# Sends /save.
 	# Sends /save.
-	tmux -L "${sessionname}" send-keys -t "${sessionname}" /save ENTER > /dev/null 2>&1
+	tmux -L "${socketname}" send-keys -t "${sessionname}" /save ENTER > /dev/null 2>&1
 	sleep 5
 	sleep 5
 	# Sends /quit.
 	# Sends /quit.
-	tmux -L "${sessionname}" send-keys -t "${sessionname}" /stop ENTER > /dev/null 2>&1
+	tmux -L "${socketname}" send-keys -t "${sessionname}" /stop ENTER > /dev/null 2>&1
 	# Waits up to 30 seconds giving the server time to shutdown gracefuly.
 	# Waits up to 30 seconds giving the server time to shutdown gracefuly.
 	for seconds in {1..30}; do
 	for seconds in {1..30}; do
 		check_status.sh
 		check_status.sh
@@ -240,7 +240,7 @@ fn_stop_tmux() {
 	fn_print_dots "${servername}"
 	fn_print_dots "${servername}"
 	fn_script_log_info "tmux kill-session: ${sessionname}: ${servername}"
 	fn_script_log_info "tmux kill-session: ${sessionname}: ${servername}"
 	# Kill tmux session.
 	# Kill tmux session.
-	tmux -L "${sessionname}" kill-session -t "${sessionname}" > /dev/null 2>&1
+	tmux -L "${socketname}" kill-session -t "${sessionname}" > /dev/null 2>&1
 	sleep 0.5
 	sleep 0.5
 	check_status.sh
 	check_status.sh
 	if [ "${status}" == "0" ]; then
 	if [ "${status}" == "0" ]; then
@@ -256,28 +256,39 @@ fn_stop_tmux() {
 fn_stop_pre_check() {
 fn_stop_pre_check() {
 	if [ "${status}" == "0" ]; then
 	if [ "${status}" == "0" ]; then
 		fn_print_info_nl "${servername} is already stopped"
 		fn_print_info_nl "${servername} is already stopped"
-		fn_script_log_error "${servername} is already stopped"
+		fn_script_log_info "${servername} is already stopped"
 	else
 	else
 		# Select graceful shutdown.
 		# Select graceful shutdown.
 		fn_stop_graceful_select
 		fn_stop_graceful_select
-	fi
-	# Check status again, a kill tmux session if graceful shutdown failed.
-	check_status.sh
-	if [ "${status}" != "0" ]; then
-		fn_stop_tmux
+		# Check status again, a kill tmux session if graceful shutdown failed.
+		check_status.sh
+		if [ "${status}" != "0" ]; then
+			fn_stop_tmux
+		fi
 	fi
 	fi
 }
 }
 
 
 check.sh
 check.sh
+
+# Create a stopping lockfile that only exists while the stop command is running.
+date '+%s' > "${lockdir:?}/${selfname}-stopping.lock"
+
 fn_print_dots "${servername}"
 fn_print_dots "${servername}"
 
 
 info_game.sh
 info_game.sh
 fn_stop_pre_check
 fn_stop_pre_check
-# Remove lockfile.
-if [ -f "${lockdir}/${selfname}.lock" ]; then
-	rm -f "${lockdir:?}/${selfname}.lock"
+
+# Remove started lockfile.
+rm -f "${lockdir:?}/${selfname}-started.lock"
+
+# If user ran the stop command monitor will become disabled.
+if [ "${firstcommandname}" == "STOP" ]; then
+	rm -f "${lockdir:?}/${selfname}-monitoring.lock"
 fi
 fi
 
 
+# Remove stopping lockfile.
+rm -f "${lockdir:?}/${selfname}-stopping.lock"
+
 if [ -z "${exitbypass}" ]; then
 if [ -z "${exitbypass}" ]; then
 	core_exit.sh
 	core_exit.sh
 fi
 fi

+ 2 - 2
lgsm/modules/command_ts3_server_pass.sh

@@ -28,7 +28,7 @@ fn_serveradmin_password_prompt() {
 fn_serveradmin_password_set() {
 fn_serveradmin_password_set() {
 	# Start server in "new password mode".
 	# Start server in "new password mode".
 	ts3serverpass="1"
 	ts3serverpass="1"
-	exitbypass="1"
+	exitbypass=1
 	command_start.sh
 	command_start.sh
 	fn_firstcommand_reset
 	fn_firstcommand_reset
 	fn_print_ok_nl "New password applied"
 	fn_print_ok_nl "New password applied"
@@ -40,7 +40,7 @@ check.sh
 fn_serveradmin_password_prompt
 fn_serveradmin_password_prompt
 if [ "${status}" != "0" ]; then
 if [ "${status}" != "0" ]; then
 	# Stop any running server.
 	# Stop any running server.
-	exitbypass="1"
+	exitbypass=1
 	command_stop.sh
 	command_stop.sh
 	fn_firstcommand_reset
 	fn_firstcommand_reset
 	fn_serveradmin_password_set
 	fn_serveradmin_password_set

+ 9 - 6
lgsm/modules/command_update.sh

@@ -18,23 +18,26 @@ check_last_update.sh
 if [ "${shortname}" == "ts3" ]; then
 if [ "${shortname}" == "ts3" ]; then
 	update_ts3.sh
 	update_ts3.sh
 elif [ "${shortname}" == "mc" ]; then
 elif [ "${shortname}" == "mc" ]; then
-	update_minecraft.sh
+	update_mc.sh
 elif [ "${shortname}" == "mcb" ]; then
 elif [ "${shortname}" == "mcb" ]; then
-	update_minecraft_bedrock.sh
+	update_mcb.sh
 elif [ "${shortname}" == "pmc" ] || [ "${shortname}" == "vpmc" ] || [ "${shortname}" == "wmc" ]; then
 elif [ "${shortname}" == "pmc" ] || [ "${shortname}" == "vpmc" ] || [ "${shortname}" == "wmc" ]; then
-	update_papermc.sh
+	update_pmc.sh
 elif [ "${shortname}" == "fctr" ]; then
 elif [ "${shortname}" == "fctr" ]; then
-	update_factorio.sh
+	update_fctr.sh
 elif [ "${shortname}" == "mta" ]; then
 elif [ "${shortname}" == "mta" ]; then
 	update_mta.sh
 	update_mta.sh
 elif [ "${shortname}" == "jk2" ]; then
 elif [ "${shortname}" == "jk2" ]; then
-	update_jediknight2.sh
+	update_jk2.sh
 elif [ "${shortname}" == "vints" ]; then
 elif [ "${shortname}" == "vints" ]; then
-	update_vintagestory.sh
+	update_vints.sh
 elif [ "${shortname}" == "ut99" ]; then
 elif [ "${shortname}" == "ut99" ]; then
 	update_ut99.sh
 	update_ut99.sh
 else
 else
 	update_steamcmd.sh
 	update_steamcmd.sh
 fi
 fi
 
 
+# remove update lockfile.
+rm -f "${lockdir:?}/update.lock"
+
 core_exit.sh
 core_exit.sh

+ 4 - 1
lgsm/modules/command_validate.sh

@@ -23,7 +23,7 @@ fn_validate() {
 		fi
 		fi
 	done
 	done
 	fn_print_warn_nl "Validate might overwrite some customised files"
 	fn_print_warn_nl "Validate might overwrite some customised files"
-
+	date '+%s' > "${lockdir:?}/update.lock"
 	fn_dl_steamcmd
 	fn_dl_steamcmd
 }
 }
 
 
@@ -46,4 +46,7 @@ else
 	fn_validate
 	fn_validate
 fi
 fi
 
 
+# remove update lockfile
+rm -f "${lockdir:?}/update.lock"
+
 core_exit.sh
 core_exit.sh

+ 9 - 1
lgsm/modules/core_dl.sh

@@ -36,7 +36,7 @@ fn_dl_steamcmd() {
 
 
 	# Unbuffer will allow the output of steamcmd not buffer allowing a smooth output.
 	# Unbuffer will allow the output of steamcmd not buffer allowing a smooth output.
 	# unbuffer us part of the expect package.
 	# unbuffer us part of the expect package.
-	if [ "$(command -v unbuffer)" ]; then
+	if [ "$(command -v unbuffer 2> /dev/null)" ]; then
 		unbuffer="unbuffer"
 		unbuffer="unbuffer"
 	fi
 	fi
 
 
@@ -119,6 +119,14 @@ fn_dl_steamcmd() {
 			elif [ -n "$(grep "0x402" "${steamcmdlog}" | tail -1)" ] || [ -n "$(grep "0x602" "${steamcmdlog}" | tail -1)" ]; then
 			elif [ -n "$(grep "0x402" "${steamcmdlog}" | tail -1)" ] || [ -n "$(grep "0x602" "${steamcmdlog}" | tail -1)" ]; then
 				fn_print_error2_nl "${commandaction} ${selfname}: ${remotelocation}: Update required but not completed - check network"
 				fn_print_error2_nl "${commandaction} ${selfname}: ${remotelocation}: Update required but not completed - check network"
 				fn_script_log_error "${commandaction} ${selfname}: ${remotelocation}: Update required but not completed - check network"
 				fn_script_log_error "${commandaction} ${selfname}: ${remotelocation}: Update required but not completed - check network"
+			# Disk write failure.
+			elif [ -n "$(grep "0x606" "${steamcmdlog}" | tail -1)" ] || [ -n "$(grep "0x602" "${steamcmdlog}" | tail -1)" ]; then
+				fn_print_error2_nl "${commandaction} ${selfname}: ${remotelocation}: Disk write failure"
+				fn_script_log_error "${commandaction} ${selfname}: ${remotelocation}: Disk write failure"
+			# Missing update files.
+			elif [ -n "$(grep "0x626" "${steamcmdlog}" | tail -1)" ] || [ -n "$(grep "0x626" "${steamcmdlog}" | tail -1)" ]; then
+				fn_print_error2_nl "${commandaction} ${selfname}: ${remotelocation}: Missing update files"
+				fn_script_log_error "${commandaction} ${selfname}: ${remotelocation}: Missing update files"
 			else
 			else
 				fn_print_error2_nl "${commandaction} ${selfname}: ${remotelocation}: Unknown error occured"
 				fn_print_error2_nl "${commandaction} ${selfname}: ${remotelocation}: Unknown error occured"
 				echo -en "Please provide content log to LinuxGSM developers https://linuxgsm.com/steamcmd-error"
 				echo -en "Please provide content log to LinuxGSM developers https://linuxgsm.com/steamcmd-error"

+ 3 - 1
lgsm/modules/core_exit.sh

@@ -12,7 +12,7 @@ fn_exit_dev_debug() {
 		echo -e ""
 		echo -e ""
 		echo -e "${moduleselfname} exiting with code: ${exitcode}"
 		echo -e "${moduleselfname} exiting with code: ${exitcode}"
 		if [ -f "${rootdir}/dev-debug.log" ]; then
 		if [ -f "${rootdir}/dev-debug.log" ]; then
-			grep "modulefile=" "${rootdir}/dev-debug.log" | sed 's/modulefile=//g' > "${rootdir}/dev-debug-module-order.log"
+			grep -a "modulefile=" "${rootdir}/dev-debug.log" | sed 's/modulefile=//g' > "${rootdir}/dev-debug-module-order.log"
 		fi
 		fi
 	fi
 	fi
 }
 }
@@ -35,7 +35,9 @@ elif [ "${exitcode}" != "0" ]; then
 	elif [ "${exitcode}" == "3" ]; then
 	elif [ "${exitcode}" == "3" ]; then
 		fn_script_log_warn "${moduleselfname} exiting with code: ${exitcode}"
 		fn_script_log_warn "${moduleselfname} exiting with code: ${exitcode}"
 	else
 	else
+		# if exit code is not set assume error.
 		fn_script_log_warn "${moduleselfname} exiting with code: ${exitcode}"
 		fn_script_log_warn "${moduleselfname} exiting with code: ${exitcode}"
+		exitcode=4
 	fi
 	fi
 	fn_exit_dev_debug
 	fn_exit_dev_debug
 	# remove trap.
 	# remove trap.

+ 7 - 7
lgsm/modules/core_functions.sh

@@ -8,7 +8,7 @@
 
 
 module_selfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")"
 module_selfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")"
 
 
-modulesversion="v23.4.0"
+modulesversion="v23.5.0"
 
 
 # Core
 # Core
 
 
@@ -640,17 +640,17 @@ update_ts3.sh() {
 	fn_fetch_function
 	fn_fetch_function
 }
 }
 
 
-update_minecraft.sh() {
+update_mc.sh() {
 	functionfile="${FUNCNAME[0]}"
 	functionfile="${FUNCNAME[0]}"
 	fn_fetch_function
 	fn_fetch_function
 }
 }
 
 
-update_minecraft_bedrock.sh() {
+update_mcb.sh() {
 	functionfile="${FUNCNAME[0]}"
 	functionfile="${FUNCNAME[0]}"
 	fn_fetch_function
 	fn_fetch_function
 }
 }
 
 
-update_papermc.sh() {
+update_pmc.sh() {
 	functionfile="${FUNCNAME[0]}"
 	functionfile="${FUNCNAME[0]}"
 	fn_fetch_function
 	fn_fetch_function
 }
 }
@@ -660,12 +660,12 @@ update_mta.sh() {
 	fn_fetch_function
 	fn_fetch_function
 }
 }
 
 
-update_factorio.sh() {
+update_fctr.sh() {
 	functionfile="${FUNCNAME[0]}"
 	functionfile="${FUNCNAME[0]}"
 	fn_fetch_function
 	fn_fetch_function
 }
 }
 
 
-update_jediknight2.sh() {
+update_jk2.sh() {
 	functionfile="${FUNCNAME[0]}"
 	functionfile="${FUNCNAME[0]}"
 	fn_fetch_function
 	fn_fetch_function
 }
 }
@@ -675,7 +675,7 @@ update_steamcmd.sh() {
 	fn_fetch_function
 	fn_fetch_function
 }
 }
 
 
-update_vintagestory.sh() {
+update_vints.sh() {
 	functionfile="${FUNCNAME[0]}"
 	functionfile="${FUNCNAME[0]}"
 	fn_fetch_function
 	fn_fetch_function
 }
 }

+ 1 - 1
lgsm/modules/core_getopt.sh

@@ -55,7 +55,7 @@ cmd_dev_detect_deps=("dd;detect-deps" "command_dev_detect_deps.sh" "Detect requi
 cmd_dev_detect_glibc=("dg;detect-glibc" "command_dev_detect_glibc.sh" "Detect required glibc.")
 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.")
 cmd_dev_detect_ldd=("dl;detect-ldd" "command_dev_detect_ldd.sh" "Detect required dynamic dependencies.")
 cmd_dev_query_raw=("qr;query-raw" "command_dev_query_raw.sh" "The raw output of gamedig and gsquery.")
 cmd_dev_query_raw=("qr;query-raw" "command_dev_query_raw.sh" "The raw output of gamedig and gsquery.")
-cmd_dev_clear_modules=("cf;clear-modules" "command_dev_clear_modules.sh" "Delete the contents of the modules dir.")
+cmd_dev_clear_modules=("cm;clear-modules" "command_dev_clear_modules.sh" "Delete the contents of the modules dir.")
 
 
 ### Set specific opt here.
 ### Set specific opt here.
 
 

+ 4 - 0
lgsm/modules/core_legacy.sh

@@ -15,6 +15,10 @@ for legacy_version in "${legacy_versions_array[@]}"; do
 	fi
 	fi
 done
 done
 
 
+if [ -z "${socketname}" ]; then
+	socketname="${sessionname}"
+fi
+
 if [ -n "${webadminuser}" ]; then
 if [ -n "${webadminuser}" ]; then
 	httpuser="${webadminuser}"
 	httpuser="${webadminuser}"
 fi
 fi

+ 12 - 7
lgsm/modules/core_modules.sh

@@ -8,7 +8,7 @@
 
 
 moduleselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")"
 moduleselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")"
 
 
-modulesversion="v23.4.0"
+modulesversion="v23.5.0"
 
 
 # Core
 # Core
 
 
@@ -421,6 +421,11 @@ fix_onset.sh() {
 	fn_fetch_module
 	fn_fetch_module
 }
 }
 
 
+fix_pvr.sh() {
+	modulefile="${FUNCNAME[0]}"
+	fn_fetch_module
+}
+
 fix_ro.sh() {
 fix_ro.sh() {
 	modulefile="${FUNCNAME[0]}"
 	modulefile="${FUNCNAME[0]}"
 	fn_fetch_module
 	fn_fetch_module
@@ -645,17 +650,17 @@ update_ts3.sh() {
 	fn_fetch_module
 	fn_fetch_module
 }
 }
 
 
-update_minecraft.sh() {
+update_mc.sh() {
 	modulefile="${FUNCNAME[0]}"
 	modulefile="${FUNCNAME[0]}"
 	fn_fetch_module
 	fn_fetch_module
 }
 }
 
 
-update_minecraft_bedrock.sh() {
+update_mcb.sh() {
 	modulefile="${FUNCNAME[0]}"
 	modulefile="${FUNCNAME[0]}"
 	fn_fetch_module
 	fn_fetch_module
 }
 }
 
 
-update_papermc.sh() {
+update_pmc.sh() {
 	modulefile="${FUNCNAME[0]}"
 	modulefile="${FUNCNAME[0]}"
 	fn_fetch_module
 	fn_fetch_module
 }
 }
@@ -665,12 +670,12 @@ update_mta.sh() {
 	fn_fetch_module
 	fn_fetch_module
 }
 }
 
 
-update_factorio.sh() {
+update_fctr.sh() {
 	modulefile="${FUNCNAME[0]}"
 	modulefile="${FUNCNAME[0]}"
 	fn_fetch_module
 	fn_fetch_module
 }
 }
 
 
-update_jediknight2.sh() {
+update_jk2.sh() {
 	modulefile="${FUNCNAME[0]}"
 	modulefile="${FUNCNAME[0]}"
 	fn_fetch_module
 	fn_fetch_module
 }
 }
@@ -680,7 +685,7 @@ update_steamcmd.sh() {
 	fn_fetch_module
 	fn_fetch_module
 }
 }
 
 
-update_vintagestory.sh() {
+update_vints.sh() {
 	modulefile="${FUNCNAME[0]}"
 	modulefile="${FUNCNAME[0]}"
 	fn_fetch_module
 	fn_fetch_module
 }
 }

+ 13 - 8
lgsm/modules/core_steamcmd.sh

@@ -151,11 +151,6 @@ fn_update_steamcmd_localbuild() {
 	# Uses appmanifest to find local build.
 	# Uses appmanifest to find local build.
 	localbuild=$(grep buildid "${appmanifestfile}" | tr '[:blank:]"' ' ' | tr -s ' ' | cut -d\  -f3)
 	localbuild=$(grep buildid "${appmanifestfile}" | tr '[:blank:]"' ' ' | tr -s ' ' | cut -d\  -f3)
 
 
-	# Set branch to public if no custom branch.
-	if [ -z "${branch}" ]; then
-		branch="public"
-	fi
-
 	# Checks if localbuild variable has been set.
 	# Checks if localbuild variable has been set.
 	if [ -z "${localbuild}" ]; then
 	if [ -z "${localbuild}" ]; then
 		fn_print_fail "Checking local build: ${remotelocation}: missing local build info"
 		fn_print_fail "Checking local build: ${remotelocation}: missing local build info"
@@ -178,6 +173,13 @@ fn_update_steamcmd_remotebuild() {
 		find "${HOME}" -type f -name "appinfo.vdf" -exec rm -f {} \; 2> /dev/null
 		find "${HOME}" -type f -name "appinfo.vdf" -exec rm -f {} \; 2> /dev/null
 	fi
 	fi
 
 
+	# Set branch to public if no custom branch.
+	if [ -z "${branch}" ]; then
+		branch="public"
+	fi
+
+	# added as was failing GitHub Actions test. Running SteamCMD twice seems to fix it.
+	${steamcmdcommand} +login "${steamuser}" "${steampass}" +app_info_update 1 +quit 2> /dev/null
 	# password for branch not needed to check the buildid
 	# password for branch not needed to check the buildid
 	remotebuildversion=$(${steamcmdcommand} +login "${steamuser}" "${steampass}" +app_info_update 1 +app_info_print "${appid}" +quit | sed -e '/"branches"/,/^}/!d' | sed -n "/\"${branch}\"/,/}/p" | grep -m 1 buildid | tr -cd '[:digit:]')
 	remotebuildversion=$(${steamcmdcommand} +login "${steamuser}" "${steampass}" +app_info_update 1 +app_info_print "${appid}" +quit | sed -e '/"branches"/,/^}/!d' | sed -n "/\"${branch}\"/,/}/p" | grep -m 1 buildid | tr -cd '[:digit:]')
 
 
@@ -204,7 +206,10 @@ fn_update_steamcmd_remotebuild() {
 
 
 fn_update_steamcmd_compare() {
 fn_update_steamcmd_compare() {
 	fn_print_dots "Checking for update: ${remotelocation}"
 	fn_print_dots "Checking for update: ${remotelocation}"
+	# Update has been found or force update.
 	if [ "${localbuild}" != "${remotebuildversion}" ] || [ "${forceupdate}" == "1" ]; then
 	if [ "${localbuild}" != "${remotebuildversion}" ] || [ "${forceupdate}" == "1" ]; then
+		# Create update lockfile.
+		date '+%s' > "${lockdir:?}/update.lock"
 		fn_print_ok_nl "Checking for update: ${remotelocation}"
 		fn_print_ok_nl "Checking for update: ${remotelocation}"
 		echo -en "\n"
 		echo -en "\n"
 		echo -e "Update available"
 		echo -e "Update available"
@@ -248,7 +253,7 @@ fn_update_steamcmd_compare() {
 				fn_firstcommand_reset
 				fn_firstcommand_reset
 			fi
 			fi
 			unset exitbypass
 			unset exitbypass
-			date +%s > "${lockdir}/lastupdate.lock"
+			date +%s > "${lockdir:?}/last-updated.lock"
 			alert="update"
 			alert="update"
 		elif [ "${commandname}" == "CHECK-UPDATE" ]; then
 		elif [ "${commandname}" == "CHECK-UPDATE" ]; then
 			alert="check-update"
 			alert="check-update"
@@ -352,8 +357,8 @@ fn_check_steamcmd_appmanifest() {
 	if [ "${engine}" == "goldsrc" ]; then
 	if [ "${engine}" == "goldsrc" ]; then
 		shareddepotsexists=$(grep -c SharedDepots "${serverfiles}/steamapps/appmanifest_90.acf")
 		shareddepotsexists=$(grep -c SharedDepots "${serverfiles}/steamapps/appmanifest_90.acf")
 		if [ ! -f "${serverfiles}/steamapps/appmanifest_90.acf" ] || [ "${shareddepotsexists}" == "0" ]; then
 		if [ ! -f "${serverfiles}/steamapps/appmanifest_90.acf" ] || [ "${shareddepotsexists}" == "0" ]; then
-			fn_print_error_nl "SharedDepots missing from appmanifest_${appid}.acf"
-			fn_script_log_error "SharedDepots missing from appmanifest_${appid}.acf"
+			fn_print_error_nl "SharedDepots missing from appmanifest_90.acf"
+			fn_script_log_error "SharedDepots missing from appmanifest_90.acf"
 			fn_print_info_nl "Forcing update to correct issue"
 			fn_print_info_nl "Forcing update to correct issue"
 			fn_script_log_info "Forcing update to correct issue"
 			fn_script_log_info "Forcing update to correct issue"
 			if [ "${shortname}" == "ahl" ]; then
 			if [ "${shortname}" == "ahl" ]; then

+ 1 - 1
lgsm/modules/fix.sh

@@ -52,7 +52,7 @@ fn_apply_fix() {
 	fi
 	fi
 }
 }
 
 
-apply_pre_start_fix=(arma3 armar ark av bt bo csgo cmw dst hw ins nmrih onset rust rw sdtd sfc sof2 squad st tf2 terraria ts3 mcb mta unt vh wurm zmr)
+apply_pre_start_fix=(arma3 armar ark av bt bo csgo cmw dst hw ins nmrih onset pvr rust rw sdtd sfc sof2 squad st tf2 terraria ts3 mcb mta unt vh wurm zmr)
 apply_post_install_fix=(av kf kf2 lo ro samp ut2k4 ut ut3)
 apply_post_install_fix=(av kf kf2 lo ro samp ut2k4 ut ut3)
 
 
 # validate registered fixes for safe development
 # validate registered fixes for safe development

+ 1 - 1
lgsm/modules/fix_ark.sh

@@ -3,7 +3,7 @@
 # Author: Daniel Gibbs
 # Author: Daniel Gibbs
 # Contributors: http://linuxgsm.com/contrib
 # Contributors: http://linuxgsm.com/contrib
 # Website: https://linuxgsm.com
 # Website: https://linuxgsm.com
-# Description: Resolves various issues with ARK: Survival Evolved.
+# Description: Resolves issues with ARK: Survival Evolved.
 
 
 moduleselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")"
 moduleselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")"
 
 

+ 1 - 1
lgsm/modules/fix_arma3.sh

@@ -3,7 +3,7 @@
 # Author: Daniel Gibbs
 # Author: Daniel Gibbs
 # Contributors: http://linuxgsm.com/contrib
 # Contributors: http://linuxgsm.com/contrib
 # Website: https://linuxgsm.com
 # Website: https://linuxgsm.com
-# Description: Resolves an issue with ARMA3.
+# Description: Resolves issues with ARMA3.
 
 
 moduleselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")"
 moduleselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")"
 
 

+ 1 - 1
lgsm/modules/fix_armar.sh

@@ -3,7 +3,7 @@
 # Author: Daniel Gibbs
 # Author: Daniel Gibbs
 # Contributors: http://linuxgsm.com/contrib
 # Contributors: http://linuxgsm.com/contrib
 # Website: https://linuxgsm.com
 # Website: https://linuxgsm.com
-# Description: Resolves an issue with Arma Reforger.
+# Description: Resolves issues with Arma Reforger.
 
 
 module_selfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")"
 module_selfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")"
 
 

+ 1 - 1
lgsm/modules/fix_av.sh

@@ -3,7 +3,7 @@
 # Author: Daniel Gibbs
 # Author: Daniel Gibbs
 # Contributors: http://linuxgsm.com/contrib
 # Contributors: http://linuxgsm.com/contrib
 # Website: https://linuxgsm.com
 # Website: https://linuxgsm.com
-# Description: Resolves startup issue with Avorion
+# Description: Resolves issues with Avorion.
 
 
 moduleselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")"
 moduleselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")"
 
 

+ 1 - 1
lgsm/modules/fix_bo.sh

@@ -3,7 +3,7 @@
 # Author: Daniel Gibbs
 # Author: Daniel Gibbs
 # Contributors: http://linuxgsm.com/contrib
 # Contributors: http://linuxgsm.com/contrib
 # Website: https://linuxgsm.com
 # Website: https://linuxgsm.com
-# Description: Resolves various issues with Ballistic Overkill.
+# Description: Resolves issues with Ballistic Overkill.
 
 
 moduleselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")"
 moduleselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")"
 
 

+ 1 - 1
lgsm/modules/fix_bt.sh

@@ -3,7 +3,7 @@
 # Author: Daniel Gibbs
 # Author: Daniel Gibbs
 # Contributors: http://linuxgsm.com/contrib
 # Contributors: http://linuxgsm.com/contrib
 # Website: https://linuxgsm.com
 # Website: https://linuxgsm.com
-# Description: Resolves an issue with Barotrauma.
+# Description: Resolves issues with Barotrauma.
 
 
 module_selfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")"
 module_selfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")"
 
 

+ 1 - 1
lgsm/modules/fix_cmw.sh

@@ -3,7 +3,7 @@
 # Author: Daniel Gibbs
 # Author: Daniel Gibbs
 # Contributors: http://linuxgsm.com/contrib
 # Contributors: http://linuxgsm.com/contrib
 # Website: https://linuxgsm.com
 # Website: https://linuxgsm.com
-# Description: Resolves the issue of the not starting server on linux
+# Description: Resolves issues with Chivalry: Medieval Warfare.
 
 
 moduleselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")"
 moduleselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")"
 
 

+ 2 - 2
lgsm/modules/fix_csgo.sh

@@ -3,7 +3,7 @@
 # Author: Daniel Gibbs
 # Author: Daniel Gibbs
 # Contributors: http://linuxgsm.com/contrib
 # Contributors: http://linuxgsm.com/contrib
 # Website: https://linuxgsm.com
 # Website: https://linuxgsm.com
-# Description: Resolves various issues with CS:GO.
+# Description: Resolves issues with Counter-Strike: Global Offensive.
 
 
 moduleselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")"
 moduleselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")"
 
 
@@ -37,6 +37,6 @@ libgccc_so="${serverfiles}/bin/libgcc_s.so.1"
 if [ -f "${libgccc_so}" ]; then
 if [ -f "${libgccc_so}" ]; then
 	fixname="libgcc_s.so.1 move away"
 	fixname="libgcc_s.so.1 move away"
 	fn_fix_msg_start
 	fn_fix_msg_start
-	mv -v "${libgccc_so}" "${libgccc_so}.bck"
+	mv "${libgccc_so}" "${libgccc_so}.bak"
 	fn_fix_msg_end
 	fn_fix_msg_end
 fi
 fi

+ 1 - 1
lgsm/modules/fix_dst.sh

@@ -3,7 +3,7 @@
 # Author: Daniel Gibbs
 # Author: Daniel Gibbs
 # Contributors: http://linuxgsm.com/contrib
 # Contributors: http://linuxgsm.com/contrib
 # Website: https://linuxgsm.com
 # Website: https://linuxgsm.com
-# Description: Resolves various issues with Don't Starve Together.
+# Description: Resolves issues with Don't Starve Together.
 
 
 moduleselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")"
 moduleselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")"
 
 

+ 1 - 1
lgsm/modules/fix_hw.sh

@@ -3,7 +3,7 @@
 # Author: Daniel Gibbs
 # Author: Daniel Gibbs
 # Contributors: http://linuxgsm.com/contrib
 # Contributors: http://linuxgsm.com/contrib
 # Website: https://linuxgsm.com
 # Website: https://linuxgsm.com
-# Description: Resolves various issues with Hurtworld.
+# Description: Resolves issues with Hurtworld.
 
 
 moduleselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")"
 moduleselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")"
 
 

+ 1 - 1
lgsm/modules/fix_ins.sh

@@ -3,7 +3,7 @@
 # Author: Daniel Gibbs
 # Author: Daniel Gibbs
 # Contributors: http://linuxgsm.com/contrib
 # Contributors: http://linuxgsm.com/contrib
 # Website: https://linuxgsm.com
 # Website: https://linuxgsm.com
-# Description: Resolves various issues with Insurgency.
+# Description: Resolves issues with Insurgency.
 
 
 moduleselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")"
 moduleselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")"
 
 

+ 1 - 1
lgsm/modules/fix_kf.sh

@@ -3,7 +3,7 @@
 # Author: Daniel Gibbs
 # Author: Daniel Gibbs
 # Contributors: http://linuxgsm.com/contrib
 # Contributors: http://linuxgsm.com/contrib
 # Website: https://linuxgsm.com
 # Website: https://linuxgsm.com
-# Description: Resolves various issues with Killing Floor.
+# Description: Resolves issues with Killing Floor.
 
 
 moduleselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")"
 moduleselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")"
 
 

+ 1 - 1
lgsm/modules/fix_kf2.sh

@@ -3,7 +3,7 @@
 # Author: Daniel Gibbs
 # Author: Daniel Gibbs
 # Contributors: http://linuxgsm.com/contrib
 # Contributors: http://linuxgsm.com/contrib
 # Website: https://linuxgsm.com
 # Website: https://linuxgsm.com
-# Description: Resolves various issues with Killing Floor 2.
+# Description: Resolves issues with Killing Floor 2.
 
 
 moduleselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")"
 moduleselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")"
 
 

+ 1 - 1
lgsm/modules/fix_lo.sh

@@ -2,7 +2,7 @@
 # LinuxGSM fix_lo.sh module
 # LinuxGSM fix_lo.sh module
 # Author: Daniel Gibbs
 # Author: Daniel Gibbs
 # Website: https://linuxgsm.com
 # Website: https://linuxgsm.com
-# Description: Resolves installation issue with Last Oasis
+# Description: Resolves various issues with Last Oasis.
 
 
 moduleselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")"
 moduleselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")"
 
 

+ 1 - 1
lgsm/modules/fix_mcb.sh

@@ -3,7 +3,7 @@
 # Author: Daniel Gibbs
 # Author: Daniel Gibbs
 # Contributors: http://linuxgsm.com/contrib
 # Contributors: http://linuxgsm.com/contrib
 # Website: https://linuxgsm.com
 # Website: https://linuxgsm.com
-# Description: Resolves possible startup issue with Minecraft Bedrock.
+# Description: Resolves various issues with Minecraft Bedrock.
 
 
 moduleselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")"
 moduleselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")"
 
 

+ 1 - 1
lgsm/modules/fix_mta.sh

@@ -3,7 +3,7 @@
 # Author: Daniel Gibbs
 # Author: Daniel Gibbs
 # Contributors: http://linuxgsm.com/contrib
 # Contributors: http://linuxgsm.com/contrib
 # Website: https://linuxgsm.com
 # Website: https://linuxgsm.com
-# Description: Installs the libmysqlclient for database functions on the server.
+# Description: Resolves various issues with Multi Theft Auto.
 
 
 moduleselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")"
 moduleselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")"
 
 

+ 14 - 0
lgsm/modules/fix_pvr.sh

@@ -0,0 +1,14 @@
+#!/bin/bash
+# LinuxGSM fix_pvr.sh module
+# Author: Daniel Gibbs
+# Contributors: http://linuxgsm.com/contrib
+# Website: https://linuxgsm.com
+# Description: Resolves various issues with Pavlov VR.
+
+moduleselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")"
+
+if [ ! -f "${serverfiles}/linux64/libc++.so" ] && [ -f "/usr/lib/x86_64-linux-gnu/libc++.so.1" ]; then
+	cp "/usr/lib/x86_64-linux-gnu/libc++.so.1" "${serverfiles}/linux64/libc++.so"
+fi
+
+export LD_LIBRARY_PATH="$LD_LIBRARY_PATH:${serverfiles}:${serverfiles}/linux64"

+ 1 - 1
lgsm/modules/fix_ro.sh

@@ -3,7 +3,7 @@
 # Author: Daniel Gibbs
 # Author: Daniel Gibbs
 # Contributors: http://linuxgsm.com/contrib
 # Contributors: http://linuxgsm.com/contrib
 # Website: https://linuxgsm.com
 # Website: https://linuxgsm.com
-# Description: Resolves various issues with Red Orchestra.
+# Description: Resolves issues with Red Orchestra.
 
 
 moduleselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")"
 moduleselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")"
 
 

+ 1 - 1
lgsm/modules/fix_rust.sh

@@ -3,7 +3,7 @@
 # Author: Daniel Gibbs
 # Author: Daniel Gibbs
 # Contributors: http://linuxgsm.com/contrib
 # Contributors: http://linuxgsm.com/contrib
 # Website: https://linuxgsm.com
 # Website: https://linuxgsm.com
-# Description: Resolves startup issue with Rust.
+# Description: Resolves issues with Rust.
 
 
 moduleselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")"
 moduleselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")"
 
 

+ 1 - 1
lgsm/modules/fix_rw.sh

@@ -3,7 +3,7 @@
 # Author: Daniel Gibbs
 # Author: Daniel Gibbs
 # Contributors: http://linuxgsm.com/contrib
 # Contributors: http://linuxgsm.com/contrib
 # Website: https://linuxgsm.com
 # Website: https://linuxgsm.com
-# Description: Resolves various issues with Rising World.
+# Description: Resolves issues with Rising World.
 
 
 moduleselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")"
 moduleselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")"
 
 

+ 1 - 1
lgsm/modules/fix_samp.sh

@@ -3,7 +3,7 @@
 # Author: Daniel Gibbs
 # Author: Daniel Gibbs
 # Contributors: http://linuxgsm.com/contrib
 # Contributors: http://linuxgsm.com/contrib
 # Website: https://linuxgsm.com
 # Website: https://linuxgsm.com
-# Description: Resolves issue that the default rcon password is not changed
+# Description: Resolves issue that the default rcon password is not changed.
 
 
 moduleselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")"
 moduleselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")"
 
 

+ 1 - 1
lgsm/modules/fix_sdtd.sh

@@ -3,7 +3,7 @@
 # Author: Daniel Gibbs
 # Author: Daniel Gibbs
 # Contributors: http://linuxgsm.com/contrib
 # Contributors: http://linuxgsm.com/contrib
 # Website: https://linuxgsm.com
 # Website: https://linuxgsm.com
-# Description: Resolves various issues with 7 Days to Die.
+# Description: Resolves issues with 7 Days to Die.
 
 
 moduleselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")"
 moduleselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")"
 
 

+ 1 - 1
lgsm/modules/fix_sfc.sh

@@ -3,7 +3,7 @@
 # Author: Daniel Gibbs
 # Author: Daniel Gibbs
 # Contributors: http://linuxgsm.com/contrib
 # Contributors: http://linuxgsm.com/contrib
 # Website: https://linuxgsm.com
 # Website: https://linuxgsm.com
-# Description: Resolves various issues with Source Forts Classic.
+# Description: Resolves issues with Source Forts Classic.
 
 
 moduleselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")"
 moduleselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")"
 
 

+ 1 - 1
lgsm/modules/fix_sof2.sh

@@ -3,7 +3,7 @@
 # Author: Daniel Gibbs
 # Author: Daniel Gibbs
 # Contributors: http://linuxgsm.com/contrib
 # Contributors: http://linuxgsm.com/contrib
 # Website: https://linuxgsm.com
 # Website: https://linuxgsm.com
-# Description: Resolves various issues with Soldier of Fortune 2.
+# Description: Resolves issues with Soldier of Fortune 2.
 
 
 moduleselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")"
 moduleselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")"
 
 

+ 1 - 1
lgsm/modules/fix_squad.sh

@@ -3,7 +3,7 @@
 # Author: Daniel Gibbs
 # Author: Daniel Gibbs
 # Contributors: http://linuxgsm.com/contrib
 # Contributors: http://linuxgsm.com/contrib
 # Website: https://linuxgsm.com
 # Website: https://linuxgsm.com
-# Description: Resolves various issues with Squad.
+# Description: Resolves issues with Squad.
 
 
 moduleselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")"
 moduleselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")"
 
 

+ 1 - 1
lgsm/modules/fix_st.sh

@@ -3,7 +3,7 @@
 # Author: Daniel Gibbs
 # Author: Daniel Gibbs
 # Contributors: http://linuxgsm.com/contrib
 # Contributors: http://linuxgsm.com/contrib
 # Website: https://linuxgsm.com
 # Website: https://linuxgsm.com
-# Description: Resolves startup issue with Stationeers.
+# Description: Resolves issues with Stationeers.
 
 
 moduleselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")"
 moduleselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")"
 
 

+ 1 - 1
lgsm/modules/fix_steamcmd.sh

@@ -3,7 +3,7 @@
 # Author: Daniel Gibbs
 # Author: Daniel Gibbs
 # Contributors: http://linuxgsm.com/contrib
 # Contributors: http://linuxgsm.com/contrib
 # Website: https://linuxgsm.com
 # Website: https://linuxgsm.com
-# Description: Resolves various issues related to SteamCMD.
+# Description: Resolves issues with SteamCMD.
 
 
 moduleselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")"
 moduleselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")"
 
 

+ 1 - 1
lgsm/modules/fix_terraria.sh

@@ -3,7 +3,7 @@
 # Author: Daniel Gibbs
 # Author: Daniel Gibbs
 # Contributors: http://linuxgsm.com/contrib
 # Contributors: http://linuxgsm.com/contrib
 # Website: https://linuxgsm.com
 # Website: https://linuxgsm.com
-# Description: Resolves an issue with Terraria.
+# Description: Resolves issues with Terraria.
 
 
 moduleselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")"
 moduleselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")"
 
 

+ 1 - 1
lgsm/modules/fix_tf2.sh

@@ -3,7 +3,7 @@
 # Author: Daniel Gibbs
 # Author: Daniel Gibbs
 # Contributors: http://linuxgsm.com/contrib
 # Contributors: http://linuxgsm.com/contrib
 # Website: https://linuxgsm.com
 # Website: https://linuxgsm.com
-# Description: Resolves various issues with Team Fortress 2.
+# Description: Resolves issues with Team Fortress 2.
 
 
 moduleselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")"
 moduleselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")"
 
 

+ 14 - 1
lgsm/modules/fix_ts3.sh

@@ -3,10 +3,23 @@
 # Author: Daniel Gibbs
 # Author: Daniel Gibbs
 # Contributors: http://linuxgsm.com/contrib
 # Contributors: http://linuxgsm.com/contrib
 # Website: https://linuxgsm.com
 # Website: https://linuxgsm.com
-# Description: Resolves various issues with Teamspeak 3.
+# Description: Resolves issues with Teamspeak 3.
 
 
 moduleselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")"
 moduleselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")"
 
 
+# Creates a blank ts3server.ini if it does not exist.
+if [ ! -f "${servercfgfullpath}" ]; then
+	fixname="create blank ${servercfg}"
+	fn_fix_msg_start
+	touch "${servercfgfullpath}"
+	fn_fix_msg_end
+fi
+
+# Accept license.
+if [ ! -f "${executabledir}/.ts3server_license_accepted" ]; then
+	install_eula.sh
+fi
+
 # Fixes: makes libmariadb2 available #1924.
 # Fixes: makes libmariadb2 available #1924.
 if [ ! -f "${serverfiles}/libmariadb.so.2" ]; then
 if [ ! -f "${serverfiles}/libmariadb.so.2" ]; then
 	fixname="libmariadb.so.2"
 	fixname="libmariadb.so.2"

+ 1 - 1
lgsm/modules/fix_unt.sh

@@ -3,7 +3,7 @@
 # Author: Daniel Gibbs
 # Author: Daniel Gibbs
 # Contributors: http://linuxgsm.com/contrib
 # Contributors: http://linuxgsm.com/contrib
 # Website: https://linuxgsm.com
 # Website: https://linuxgsm.com
-# Description: Resolves startup issue with Unturned.
+# Description: Resolves issues with Unturned.
 
 
 moduleselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")"
 moduleselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")"
 
 

+ 1 - 1
lgsm/modules/fix_ut.sh

@@ -3,7 +3,7 @@
 # Author: Daniel Gibbs
 # Author: Daniel Gibbs
 # Contributors: http://linuxgsm.com/contrib
 # Contributors: http://linuxgsm.com/contrib
 # Website: https://linuxgsm.com
 # Website: https://linuxgsm.com
-# Description: Resolves various issues with Unreal Tournament.
+# Description: Resolves issues with Unreal Tournament.
 
 
 moduleselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")"
 moduleselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")"
 
 

+ 1 - 1
lgsm/modules/fix_ut2k4.sh

@@ -3,7 +3,7 @@
 # Author: Daniel Gibbs
 # Author: Daniel Gibbs
 # Contributors: http://linuxgsm.com/contrib
 # Contributors: http://linuxgsm.com/contrib
 # Website: https://linuxgsm.com
 # Website: https://linuxgsm.com
-# Description: Resolves various issues with Unreal Tournament 2004.
+# Description: Resolves issues with Unreal Tournament 2004.
 
 
 moduleselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")"
 moduleselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")"
 
 

+ 1 - 1
lgsm/modules/fix_ut3.sh

@@ -3,7 +3,7 @@
 # Author: Daniel Gibbs
 # Author: Daniel Gibbs
 # Contributors: http://linuxgsm.com/contrib
 # Contributors: http://linuxgsm.com/contrib
 # Website: https://linuxgsm.com
 # Website: https://linuxgsm.com
-# Description: Resolves various issues with Unreal Tournament 3.
+# Description: Resolves issues with Unreal Tournament 3.
 
 
 moduleselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")"
 moduleselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")"
 
 

+ 1 - 1
lgsm/modules/fix_vh.sh

@@ -2,7 +2,7 @@
 # LinuxGSM fix_rust.sh module
 # LinuxGSM fix_rust.sh module
 # Author: Alasdair Haig
 # Author: Alasdair Haig
 # Website: https://linuxgsm.com
 # Website: https://linuxgsm.com
-# Description: Resolves startup issue with Valheim
+# Description: Resolves issues with Valheim.
 
 
 moduleselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")"
 moduleselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")"
 
 

+ 1 - 1
lgsm/modules/fix_wurm.sh

@@ -3,7 +3,7 @@
 # Author: Daniel Gibbs
 # Author: Daniel Gibbs
 # Contributors: http://linuxgsm.com/contrib
 # Contributors: http://linuxgsm.com/contrib
 # Website: https://linuxgsm.com
 # Website: https://linuxgsm.com
-# Description: Resolves various issues with Wurm Unlimited.
+# Description: Resolves issues with Wurm Unlimited.
 
 
 moduleselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")"
 moduleselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")"
 
 

+ 1 - 1
lgsm/modules/fix_zmr.sh

@@ -3,7 +3,7 @@
 # Author: Daniel Gibbs
 # Author: Daniel Gibbs
 # Contributors: http://linuxgsm.com/contrib
 # Contributors: http://linuxgsm.com/contrib
 # Website: https://linuxgsm.com
 # Website: https://linuxgsm.com
-# Description: Resolves various issues with Zombie Master: Reborn.
+# Description: Resolves issues with Zombie Master: Reborn.
 
 
 moduleselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")"
 moduleselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")"
 
 

برخی فایل ها در این مقایسه diff نمایش داده نمی شوند زیرا تعداد فایل ها بسیار زیاد است