Explorar el Código

Release v23.1.0

Daniel Gibbs hace 3 años
padre
commit
fee4ea385b
Se han modificado 55 ficheros con 1044 adiciones y 298 borrados
  1. 0 61
      .github/workflows/codacy-analysis.yml
  2. 1 1
      .github/workflows/create-release.yml
  3. 1 1
      .github/workflows/labeler.yml
  4. 1 1
      .github/workflows/lock.yml
  5. 0 29
      .github/workflows/super-linter.yml
  6. 27 0
      .github/workflows/trigger-docker-build.yml
  7. 7 0
      .github/workflows/update-copyright-years-in-license-file.yml
  8. 1 0
      .github/workflows/version-check.sh
  9. 1 1
      LICENSE.md
  10. 0 5
      README.md
  11. 20 10
      lgsm/config-default/config-lgsm/csgoserver/_default.cfg
  12. 180 0
      lgsm/config-default/config-lgsm/necserver/_default.cfg
  13. 2 1
      lgsm/config-default/config-lgsm/rustserver/_default.cfg
  14. 9 1
      lgsm/config-default/config-lgsm/vhserver/_default.cfg
  15. 5 4
      lgsm/data/almalinux-8.csv
  16. 129 0
      lgsm/data/almalinux-9.csv
  17. 5 4
      lgsm/data/centos-7.csv
  18. 5 4
      lgsm/data/centos-8.csv
  19. 128 0
      lgsm/data/centos-9.csv
  20. 7 6
      lgsm/data/debian-10.csv
  21. 7 6
      lgsm/data/debian-11.csv
  22. 7 6
      lgsm/data/debian-9.csv
  23. 4 3
      lgsm/data/rhel-7.csv
  24. 4 3
      lgsm/data/rhel-8.csv
  25. 129 0
      lgsm/data/rhel-9.csv
  26. 5 4
      lgsm/data/rocky-8.csv
  27. 129 0
      lgsm/data/rocky-9.csv
  28. 1 0
      lgsm/data/serverlist.csv
  29. 6 5
      lgsm/data/ubuntu-16.04.csv
  30. 7 6
      lgsm/data/ubuntu-18.04.csv
  31. 1 0
      lgsm/data/ubuntu-20.04.csv
  32. 8 7
      lgsm/data/ubuntu-21.04.csv
  33. 7 6
      lgsm/data/ubuntu-21.10.csv
  34. 1 0
      lgsm/data/ubuntu-22.04.csv
  35. 1 1
      lgsm/functions/check_deps.sh
  36. 1 0
      lgsm/functions/check_executable.sh
  37. 2 4
      lgsm/functions/check_permissions.sh
  38. 28 28
      lgsm/functions/command_dev_query_raw.sh
  39. 4 4
      lgsm/functions/command_monitor.sh
  40. 1 1
      lgsm/functions/core_functions.sh
  41. 1 1
      lgsm/functions/core_getopt.sh
  42. 8 0
      lgsm/functions/fix_bt.sh
  43. 5 5
      lgsm/functions/fix_lo.sh
  44. 15 1
      lgsm/functions/fix_vh.sh
  45. 86 53
      lgsm/functions/info_game.sh
  46. 13 4
      lgsm/functions/info_messages.sh
  47. 8 0
      lgsm/functions/install_config.sh
  48. 1 1
      lgsm/functions/install_server_files.sh
  49. 6 1
      lgsm/functions/mods_list.sh
  50. 3 3
      lgsm/functions/update_papermc.sh
  51. 12 12
      linuxgsm.sh
  52. 1 1
      tests/tests_fctrserver.sh
  53. 1 1
      tests/tests_jc2server.sh
  54. 1 1
      tests/tests_mcserver.sh
  55. 1 1
      tests/tests_ts3server.sh

+ 0 - 61
.github/workflows/codacy-analysis.yml

@@ -1,61 +0,0 @@
-# This workflow uses actions that are not certified by GitHub.
-# They are provided by a third-party and are governed by
-# separate terms of service, privacy policy, and support
-# documentation.
-
-# This workflow checks out code, performs a Codacy security scan
-# and integrates the results with the
-# GitHub Advanced Security code scanning feature.  For more information on
-# the Codacy security scan action usage and parameters, see
-# https://github.com/codacy/codacy-analysis-cli-action.
-# For more information on Codacy Analysis CLI in general, see
-# https://github.com/codacy/codacy-analysis-cli.
-
-name: Codacy Security Scan
-
-on:
-  push:
-    branches: ["main","master"]
-  pull_request:
-    # The branches below must be a subset of the branches above
-    branches: ["main","master"]
-  schedule:
-    - cron: "28 22 * * 4"
-
-permissions:
-  contents: read
-
-jobs:
-  codacy-security-scan:
-    permissions:
-      contents: read # for actions/checkout to fetch code
-      security-events: write # for github/codeql-action/upload-sarif to upload SARIF results
-      actions: read # only required for a private repository by github/codeql-action/upload-sarif to get the Action run status
-    name: Codacy Security Scan
-    runs-on: ubuntu-latest
-    steps:
-      # Checkout the repository to the GitHub Actions runner
-      - name: Checkout code
-        uses: actions/checkout@v3
-
-      # Execute Codacy Analysis CLI and generate a SARIF output with the security issues identified during the analysis
-      - name: Run Codacy Analysis CLI
-        uses: codacy/codacy-analysis-cli-action@v4.2.0
-        with:
-          # Check https://github.com/codacy/codacy-analysis-cli#project-token to get your project token from your Codacy repository
-          # You can also omit the token and run the tools that support default configurations
-          project-token: ${{ secrets.CODACY_PROJECT_TOKEN }}
-          verbose: true
-          output: results.sarif
-          format: sarif
-          # Adjust severity of non-security issues
-          gh-code-scanning-compat: true
-          # Force 0 exit code to allow SARIF file generation
-          # This will handover control about PR rejection to the GitHub side
-          max-allowed-issues: 2147483647
-
-      # Upload the SARIF file generated in the previous step
-      - name: Upload SARIF results file
-        uses: github/codeql-action/upload-sarif@v2
-        with:
-          sarif_file: results.sarif

+ 1 - 1
.github/workflows/create-release.yml

@@ -16,7 +16,7 @@ jobs:
     runs-on: ubuntu-latest
     runs-on: ubuntu-latest
     steps:
     steps:
       # Drafts your next Release notes as Pull Requests are merged into "master"
       # Drafts your next Release notes as Pull Requests are merged into "master"
-      - uses: release-drafter/release-drafter@v5.21.1
+      - uses: release-drafter/release-drafter@v5.22.0
         with:
         with:
           config-name: release-drafter.yml
           config-name: release-drafter.yml
         env:
         env:

+ 1 - 1
.github/workflows/labeler.yml

@@ -13,7 +13,7 @@ jobs:
       issues: write # for github/issue-labeler to create or remove labels
       issues: write # for github/issue-labeler to create or remove labels
     runs-on: ubuntu-latest
     runs-on: ubuntu-latest
     steps:
     steps:
-    - uses: github/issue-labeler@v2.5
+    - uses: github/issue-labeler@v2.6
       with:
       with:
         repo-token: "${{ secrets.GITHUB_TOKEN }}"
         repo-token: "${{ secrets.GITHUB_TOKEN }}"
         configuration-path: .github/labeler.yml
         configuration-path: .github/labeler.yml

+ 1 - 1
.github/workflows/lock.yml

@@ -14,7 +14,7 @@ jobs:
       pull-requests: write # for dessant/lock-threads to lock PRs
       pull-requests: write # for dessant/lock-threads to lock PRs
     runs-on: ubuntu-latest
     runs-on: ubuntu-latest
     steps:
     steps:
-      - uses: dessant/lock-threads@v3
+      - uses: dessant/lock-threads@v4
         with:
         with:
           github-token: ${{ secrets.GITHUB_TOKEN }}
           github-token: ${{ secrets.GITHUB_TOKEN }}
           issue-comment: >
           issue-comment: >

+ 0 - 29
.github/workflows/super-linter.yml

@@ -1,29 +0,0 @@
-# This workflow executes several linters on changed files based on languages used in your code base whenever
-# you push a code or open a pull request.
-#
-# You can adjust the behavior by modifying this file.
-# For more information, see:
-# https://github.com/github/super-linter
-name: Lint Code Base
-
-on:
-  push:
-    branches: ["main","master"]
-  pull_request:
-    branches: ["main","master"]
-jobs:
-  run-lint:
-    runs-on: ubuntu-latest
-    steps:
-      - name: Checkout code
-        uses: actions/checkout@v3
-        with:
-          # Full git history is needed to get a proper list of changed files within `super-linter`
-          fetch-depth: 0
-
-      - name: Lint Code Base
-        uses: github/super-linter@v4
-        env:
-          VALIDATE_ALL_CODEBASE: false
-          DEFAULT_BRANCH: "main"
-          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}

+ 27 - 0
.github/workflows/trigger-docker-build.yml

@@ -0,0 +1,27 @@
+name: Trigger Docker Build
+on:
+  push:
+    branches:
+      - master
+jobs:
+  trigger_build_docker-linuxgsm:
+    name: Trigger Build docker-linuxgsm
+    runs-on: ubuntu-latest
+    steps:
+      - uses: convictional/trigger-workflow-and-wait@v1.3.0
+        with:
+          owner: GameServerManagers
+          repo: docker-linuxgsm
+          github_token: ${{ secrets.PERSONAL_ACCESS_TOKEN }}
+          workflow_file_name: docker-publish.yml
+
+  trigger_build_docker-gameserver:
+    name: Trigger Build docker-linuxgsm
+    runs-on: ubuntu-latest
+    steps:
+      - uses: convictional/trigger-workflow-and-wait@v1.3.0
+        with:
+          owner: GameServerManagers
+          repo: docker-gameserver
+          github_token: ${{ secrets.PERSONAL_ACCESS_TOKEN }}
+          workflow_file_name: docker-publish.yml

+ 7 - 0
.github/workflows/update-copyright-years-in-license-file.yml

@@ -2,6 +2,7 @@
 name: Update copyright year(s) in license file
 name: Update copyright year(s) in license file
 
 
 on:
 on:
+  workflow_dispatch:
   schedule:
   schedule:
     - cron: "0 3 1 1 *" # 03:00 AM on January 1
     - cron: "0 3 1 1 *" # 03:00 AM on January 1
 
 
@@ -15,3 +16,9 @@ jobs:
       - uses: FantasticFiasco/action-update-license-year@v2
       - uses: FantasticFiasco/action-update-license-year@v2
         with:
         with:
           token: ${{ secrets.GITHUB_TOKEN }}
           token: ${{ secrets.GITHUB_TOKEN }}
+          path: LICENSE.md
+      - name: Merge pull request
+        env:
+          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
+        run: |
+          gh pr merge --merge --delete-branch

+ 1 - 0
.github/workflows/version-check.sh

@@ -1,3 +1,4 @@
+#!/bin/bash
 version=$(grep "version=" linuxgsm.sh | sed -e 's/version//g' | tr -d '="')
 version=$(grep "version=" linuxgsm.sh | sed -e 's/version//g' | tr -d '="')
 modulesversion=$(grep "modulesversion=" lgsm/functions/core_functions.sh | sed -e 's/modulesversion//g' | tr -d '="')
 modulesversion=$(grep "modulesversion=" lgsm/functions/core_functions.sh | sed -e 's/modulesversion//g' | tr -d '="')
 
 

+ 1 - 1
LICENSE → LICENSE.md

@@ -1,6 +1,6 @@
 # The MIT License (MIT)
 # The MIT License (MIT)
 
 
-Copyright (c) 2012-2022 Daniel Gibbs
+Copyright (c) 2012-2023 Daniel Gibbs
 
 
 Permission is hereby granted, free of charge, to any person obtaining a copy
 Permission is hereby granted, free of charge, to any person obtaining a copy
 of this software and associated documentation files (the "Software"), to deal
 of this software and associated documentation files (the "Software"), to deal

La diferencia del archivo ha sido suprimido porque es demasiado grande
+ 0 - 5
README.md


+ 20 - 10
lgsm/config-default/config-lgsm/csgoserver/_default.cfg

@@ -10,17 +10,27 @@
 
 
 ## Predefined Parameters | https://docs.linuxgsm.com/configuration/start-parameters
 ## Predefined Parameters | https://docs.linuxgsm.com/configuration/start-parameters
 # https://docs.linuxgsm.com/game-servers/counter-strike-global-offensive
 # https://docs.linuxgsm.com/game-servers/counter-strike-global-offensive
-# [Game Modes]			gametype	gamemode	mapgroup (you can mix these across all Game Modes except Danger Zone, but use only one)
-# Arms Race				1			0			mg_armsrace
-# Classic Casual		0			0			mg_casualsigma, mg_casualdelta
-# Classic Competitive	0			1			mg_active, mg_reserves, mg_hostage, mg_de_dust2
-# Custom				3			0
-# Deathmatch			1			2			mg_deathmatch
-# Demolition			1			1			mg_demolition
-# Wingman				0			2
-# Danger Zone			6			0			mg_dz_blacksite (map: dz_blacksite), mg_dz_sirocco (map: dz_sirocco)
+# [Game Modes]						gametype	gamemode	gamemodeflags	skirmishid	mapgroup (you can mix these across all Game Modes except Danger Zone, but use only one)
+# Arms Race							1			0			0				0			mg_armsrace
+# Boom! Headshot!					1			2			0				6			mg_skirmish_headshots
+# Classic Casual					0			0			0				0			mg_casualsigma, mg_casualdelta
+# Classic Competitive (Default)		0			1			0				0			mg_active, mg_reserves, mg_hostage, mg_de_dust2, ...
+# Classic Competitive (Short Match)	0			1			32				0			mg_active, mg_reserves, mg_hostage, mg_de_dust2, ...
+# Danger Zone						6			0			0				0			mg_dz_blacksite (map: dz_blacksite), mg_dz_sirocco (map: dz_sirocco)
+# Deathmatch (Default)				1			2			0				0			mg_deathmatch
+# Deathmatch (Free For All)			1			2			32				0			mg_deathmatch
+# Deathmatch (Team vs Team)			1			2			4				0			mg_deathmatch
+# Demolition						1			1			0				0			mg_demolition
+# Flying Scoutsman					0			0			0				3			mg_skirmish_flyingscoutsman
+# Hunter-Gatherers					1			2			0				7			mg_skirmish_huntergatherers
+# Retakes							0			0			0				12			mg_skirmish_retakes
+# Stab Stab Zap						0			0			0				1			mg_skirmish_stabstabzap
+# Trigger Discipline				0			0			0				4			mg_skirmish_triggerdiscipline
+# Wingman							0			2			0				0			mg_de_prime, mg_de_blagai, mg_de_vertigo, mg_de_inferno, mg_de_overpass, mg_de_cbble, mg_de_train, mg_de_shortnuke,	mg_de_shortdust, mg_de_lake
 gametype="0"
 gametype="0"
 gamemode="0"
 gamemode="0"
+gamemodeflags="0"
+skirmishid="0"
 mapgroup="mg_active"
 mapgroup="mg_active"
 ip="0.0.0.0"
 ip="0.0.0.0"
 port="27015"
 port="27015"
@@ -43,7 +53,7 @@ wscollectionid=""
 wsstartmap=""
 wsstartmap=""
 
 
 ## Server Parameters | https://docs.linuxgsm.com/configuration/start-parameters#additional-parameters
 ## Server Parameters | https://docs.linuxgsm.com/configuration/start-parameters#additional-parameters
-startparameters="-game csgo -usercon -strictportbind -ip ${ip} -port ${port} +clientport ${clientport} +tv_port ${sourcetvport} +sv_setsteamaccount ${gslt} -tickrate ${tickrate} +map ${defaultmap} +servercfgfile ${servercfg} -maxplayers_override ${maxplayers} +mapgroup ${mapgroup} +game_type ${gametype} +game_mode ${gamemode} +host_workshop_collection ${wscollectionid} +workshop_start_map ${wsstartmap} -authkey ${wsapikey} -nobreakpad"
+startparameters="-game csgo -usercon -strictportbind -ip ${ip} -port ${port} +clientport ${clientport} +tv_port ${sourcetvport} +sv_setsteamaccount ${gslt} -tickrate ${tickrate} +map ${defaultmap} +servercfgfile ${servercfg} -maxplayers_override ${maxplayers} +mapgroup ${mapgroup} +game_type ${gametype} +game_mode ${gamemode} +sv_game_mode_flags ${gamemodeflags} +sv_skirmish_id ${skirmishid} +host_workshop_collection ${wscollectionid} +workshop_start_map ${wsstartmap} -authkey ${wsapikey} -nobreakpad"
 
 
 #### LinuxGSM Settings ####
 #### LinuxGSM Settings ####
 
 

+ 180 - 0
lgsm/config-default/config-lgsm/necserver/_default.cfg

@@ -0,0 +1,180 @@
+##################################
+######## Default Settings ########
+##################################
+# DO NOT EDIT, ANY CHANGES WILL BE OVERWRITTEN!
+# Copy settings from here and use them in either:
+# common.cfg - applies settings to every instance.
+# [instance].cfg - applies settings to a specific instance.
+
+#### Game Server Settings ####
+## Pre-defined Paramters | https://docs.linuxgsm.com/configuration/start-parameters#predefined-parameters
+worldname="MyWorld"
+
+## Server Parameters | https://docs.linuxgsm.com/configuration/start-parameters#additional-parameters
+startparameters="-localdir -world ${worldname}"
+
+#### LinuxGSM Settings ####
+
+## LinuxGSM Stats
+# Send useful stats to LinuxGSM developers.
+# https://docs.linuxgsm.com/configuration/linuxgsm-stats
+# (on|off)
+stats="off"
+
+## Notification Alerts
+# (on|off)
+
+# Display IP | https://docs.linuxgsm.com/alerts#display-ip
+displayip=""
+
+# More info | https://docs.linuxgsm.com/alerts#more-info
+postalert="off"
+
+# Discord Alerts | https://docs.linuxgsm.com/alerts/discord
+discordalert="off"
+discordwebhook="webhook"
+
+# Email Alerts | https://docs.linuxgsm.com/alerts/email
+emailalert="off"
+email="email@example.com"
+emailfrom=""
+
+# Gotify Alerts | https://docs.linuxgsm.com/alerts/gotify
+gotifyalert="off"
+gotifytoken="token"
+gotifywebhook="webhook"
+
+# IFTTT Alerts | https://docs.linuxgsm.com/alerts/ifttt
+iftttalert="off"
+ifttttoken="accesstoken"
+iftttevent="linuxgsm_alert"
+
+# Mailgun Email Alerts | https://docs.linuxgsm.com/alerts/mailgun
+mailgunalert="off"
+mailgunapiregion="us"
+mailguntoken="accesstoken"
+mailgundomain="example.com"
+mailgunemailfrom="alert@example.com"
+mailgunemail="email@myemail.com"
+
+# Pushbullet Alerts | https://docs.linuxgsm.com/alerts/pushbullet
+pushbulletalert="off"
+pushbullettoken="accesstoken"
+channeltag=""
+
+# Pushover Alerts | https://docs.linuxgsm.com/alerts/pushover
+pushoveralert="off"
+pushovertoken="accesstoken"
+pushoveruserkey="userkey"
+
+# Rocket.Chat Alerts | https://docs.linuxgsm.com/alerts/rocket.chat
+rocketchatalert="off"
+rocketchatwebhook="webhook"
+rocketchattoken=""
+
+# Slack Alerts | https://docs.linuxgsm.com/alerts/slack
+slackalert="off"
+slackwebhook="webhook"
+
+# Telegram Alerts | https://docs.linuxgsm.com/alerts/telegram
+# You can add a custom cURL string eg proxy (useful in Russia) in "curlcustomstring".
+# For example "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help".
+telegramapi="api.telegram.org"
+telegramalert="off"
+telegramtoken="accesstoken"
+telegramchatid=""
+curlcustomstring=""
+
+## Updating | https://docs.linuxgsm.com/commands/update
+updateonstart="off"
+
+## Backup | https://docs.linuxgsm.com/commands/backup
+maxbackups="4"
+maxbackupdays="30"
+stoponbackup="on"
+
+## Logging | https://docs.linuxgsm.com/features/logging
+consolelogging="on"
+logdays="7"
+
+## Monitor | https://docs.linuxgsm.com/commands/monitor
+# Query delay time
+querydelay="1"
+
+## ANSI Colors | https://docs.linuxgsm.com/features/ansi-colors
+ansi="on"
+
+#### Advanced Settings ####
+
+## Message Display Time | https://docs.linuxgsm.com/features/message-display-time
+sleeptime="0.5"
+
+## SteamCMD Settings | https://docs.linuxgsm.com/steamcmd
+# Server appid
+appid="1169370"
+steamcmdforcewindows="no"
+# SteamCMD Branch | https://docs.linuxgsm.com/steamcmd/branch
+branch=""
+betapassword=""
+# Master Server | https://docs.linuxgsm.com/steamcmd/steam-master-server
+steammaster="false"
+
+## Stop Mode | https://docs.linuxgsm.com/features/stop-mode
+# 1: tmux kill
+# 2: CTRL+c
+# 3: quit
+# 4: quit 120s
+# 5: stop
+# 6: q
+# 7: exit
+# 8: 7 Days to Die
+# 9: GoldSrc
+# 10: Avorion
+# 11: end
+stopmode="2"
+
+## Query mode
+# 1: session only
+# 2: gamedig (gsquery fallback)
+# 3: gamedig
+# 4: gsquery
+# 5: tcp
+querymode="2"
+querytype="protocol-valve"
+
+## Console type
+consoleverbose="yes"
+consoleinteract="no"
+
+## Game Server Details
+# Do not edit
+gamename="Necesse"
+
+#### Directories ####
+# Edit with care
+
+## Game Server Directories
+systemdir="${serverfiles}"
+executabledir="${serverfiles}"
+executable="./StartServer-nogui.sh"
+servercfgdir="${serverfiles}/cfg"
+servercfg="server.cfg"
+servercfgdefault="server.cfg"
+servercfgfullpath="${servercfgdir}/${servercfg}"
+
+## Backup Directory
+backupdir="${lgsmdir}/backup"
+
+## Logging Directories
+logdir="${rootdir}/log"
+gamelogdir="${systemdir}/logs"
+lgsmlogdir="${logdir}/script"
+consolelogdir="${logdir}/console"
+lgsmlog="${lgsmlogdir}/${selfname}-script.log"
+consolelog="${consolelogdir}/${selfname}-console.log"
+alertlog="${lgsmlogdir}/${selfname}-alert.log"
+postdetailslog="${lgsmlogdir}/${selfname}-postdetails.log"
+
+## Logs Naming
+lgsmlogdate="${lgsmlogdir}/${selfname}-script-$(date '+%Y-%m-%d-%H:%M:%S').log"
+consolelogdate="${consolelogdir}/${selfname}-console-$(date '+%Y-%m-%d-%H:%M:%S').log"

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

@@ -13,6 +13,7 @@ ip="0.0.0.0"
 port="28015"
 port="28015"
 rconport="28016"
 rconport="28016"
 appport=28082
 appport=28082
+queryport=28017
 rconpassword="CHANGE_ME"
 rconpassword="CHANGE_ME"
 rconweb="1" # Value is: 1 for the Facepunch web panel, Rustadmin desktop and Rustadmin Online; 0 for RCON tools like Rusty.
 rconweb="1" # Value is: 1 for the Facepunch web panel, Rustadmin desktop and Rustadmin Online; 0 for RCON tools like Rusty.
 servername="Rust"
 servername="Rust"
@@ -27,7 +28,7 @@ saveinterval="300" # Auto-save in seconds.
 tickrate="30" # default: 30, range: 15-100.
 tickrate="30" # default: 30, range: 15-100.
 
 
 ## Server Parameters | https://docs.linuxgsm.com/configuration/start-parameters#additional-parameters
 ## Server Parameters | https://docs.linuxgsm.com/configuration/start-parameters#additional-parameters
-startparameters="-batchmode +app.listenip ${ip} +app.port ${appport} +server.ip ${ip} +server.port ${port} +server.tickrate ${tickrate} +server.hostname \"${servername}\" +server.identity \"${selfname}\" +server.gamemode ${gamemode} +server.level \"${serverlevel}\" +server.seed ${seed} +server.salt ${salt} +server.maxplayers ${maxplayers} +server.worldsize ${worldsize} +server.saveinterval ${saveinterval} +rcon.web ${rconweb} +rcon.ip ${ip} +rcon.port ${rconport} +rcon.password \"${rconpassword}\" -logfile"
+startparameters="-batchmode +app.listenip ${ip} +app.port ${appport} +server.ip ${ip} +server.port ${port} +server.queryport ${queryport} +server.tickrate ${tickrate} +server.hostname \"${servername}\" +server.identity \"${selfname}\" +server.gamemode ${gamemode} +server.level \"${serverlevel}\" +server.seed ${seed} +server.salt ${salt} +server.maxplayers ${maxplayers} +server.worldsize ${worldsize} +server.saveinterval ${saveinterval} +rcon.web ${rconweb} +rcon.ip ${ip} +rcon.port ${rconport} +rcon.password \"${rconpassword}\" -logfile"
 
 
 #### LinuxGSM Settings ####
 #### LinuxGSM Settings ####
 
 

+ 9 - 1
lgsm/config-default/config-lgsm/vhserver/_default.cfg

@@ -16,9 +16,17 @@ port="2456"
 gameworld="${selfname}"
 gameworld="${selfname}"
 public="1"
 public="1"
 savedir="$HOME/.config/unity3d/IronGate/Valheim"
 savedir="$HOME/.config/unity3d/IronGate/Valheim"
+logFile=""
+saveinterval="1800"
+backups="4"
+backupshort="7200"
+backuplong="43200"
+# If crossplay is empty, it's off. Fill with any text to make true
+# Crossplay is currently not working on Linux dedicated servers, so for now the default is false (emtpy)
+crossplay=""
 
 
 ## Server Parameters | https://docs.linuxgsm.com/configuration/start-parameters#additional-parameters
 ## Server Parameters | https://docs.linuxgsm.com/configuration/start-parameters#additional-parameters
-startparameters="-name '${servername}' -password ${serverpassword} -port ${port} -world ${gameworld} -public ${public} -savedir '${savedir}'"
+startparameters="-name '${servername}' -password ${serverpassword} -port ${port} -world ${gameworld} -public ${public} -savedir '${savedir}' -logFile '${logFile}' -saveinterval ${saveinterval} -backups ${backups} -backupshort ${backupshort} -backuplong ${backuplong} ${crossplay:+-crossplay}"
 
 
 #### LinuxGSM Settings ####
 #### LinuxGSM Settings ####
 
 

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

@@ -15,7 +15,7 @@ bfv,compat-libstdc++-33.i686,glibc.i686
 bmdm,ncurses-libs.i686
 bmdm,ncurses-libs.i686
 bo
 bo
 bs
 bs
-bt,libicu
+bt,libicu,dos2unix
 bt1944
 bt1944
 cc
 cc
 cd
 cd
@@ -57,9 +57,9 @@ jc3
 jk2
 jk2
 kf
 kf
 kf2
 kf2
-lo
 l4d
 l4d
 l4d2
 l4d2
+lo
 mc,java-11-openjdk
 mc,java-11-openjdk
 mcb,libnsl
 mcb,libnsl
 mh
 mh
@@ -68,6 +68,7 @@ mom
 mta,ncurses-compat-libs
 mta,ncurses-compat-libs
 mumble
 mumble
 nd
 nd
+nec
 nmrih,ncurses-libs.i686
 nmrih,ncurses-libs.i686
 ns
 ns
 ns2,speex,tbb
 ns2,speex,tbb
@@ -95,8 +96,8 @@ sbots
 scpsl
 scpsl
 scpslsm
 scpslsm
 sdtd,telnet,expect
 sdtd,telnet,expect
-sfc,ncurses-libs.i686
 sf
 sf
+sfc,ncurses-libs.i686
 sof2
 sof2
 sol
 sol
 squad
 squad
@@ -117,9 +118,9 @@ ut2k4
 ut3
 ut3
 ut99
 ut99
 vh,glibc-devel
 vh,glibc-devel
-vs
 vints,mono-complete
 vints,mono-complete
 vpmc,java-11-openjdk
 vpmc,java-11-openjdk
+vs
 wet
 wet
 wf
 wf
 wmc,java-11-openjdk
 wmc,java-11-openjdk

+ 129 - 0
lgsm/data/almalinux-9.csv

@@ -0,0 +1,129 @@
+all,bc,binutils,bzip2,cpio,curl,epel-release,file,glibc.i686,gzip,hostname,jq,libstdc++.i686,nmap-ncat,python36,tar,tmux,unzip,util-linux,wget,xz
+steamcmd,glibc.i686,libstdc++.i686
+ac
+ahl
+ahl2
+ark
+arma3
+armar,libcurl,openssl-libs
+av
+bb
+bb2,libcurl.i686
+bd
+bf1942,ncurses-libs.i686
+bfv,compat-libstdc++-33.i686,glibc.i686
+bmdm,ncurses-libs.i686
+bo
+bs
+bt,libicu,dos2unix
+bt1944
+cc
+cd
+cmw
+cod,compat-libstdc++-33.i686
+cod2,compat-libstdc++-33.i686
+cod4
+coduo,compat-libstdc++-33.i686
+codwaw
+col
+cs
+cscz
+csgo
+css,ncurses-libs.i686
+dab
+dayz
+dmc
+dod
+dodr
+dods
+doi
+dst,libcurl.i686
+dys
+eco,libgdiplus
+em
+etl
+fctr
+fof
+gmod,ncurses-libs.i686
+hl2dm
+hldm
+hldms
+hw,zlib-devel
+ins
+inss
+ios
+jc2
+jc3
+jk2
+kf
+kf2
+l4d
+l4d2
+lo
+mc,java-11-openjdk
+mcb,libnsl
+mh
+mohaa,compat-libstdc++-33.i686
+mom
+mta,ncurses-compat-libs
+mumble
+nd
+nec
+nmrih,ncurses-libs.i686
+ns
+ns2,speex,tbb
+ns2c,speex.i686,tbb.i686
+onset,mariadb-connector-c
+opfor
+pc
+pmc,java-11-openjdk
+pstbs,GConf2
+pvkii
+pvr,libcxx
+pz,java-11-openjdk rng-tools
+q2
+q3
+ql
+qw
+ricochet
+ro
+rtcw
+rust,zlib-devel
+rw,java-11-openjdk
+samp
+sb
+sbots
+scpsl
+scpslsm
+sdtd,telnet,expect
+sf
+sfc,ncurses-libs.i686
+sof2
+sol
+squad
+st
+stn
+sven
+terraria
+tf2,libcurl.i686
+tfc
+ti
+ts
+ts3
+tu
+tw
+unt
+ut
+ut2k4
+ut3
+ut99
+vh,glibc-devel
+vints,mono-complete
+vpmc,java-11-openjdk
+vs
+wet
+wf
+wmc,java-11-openjdk
+wurm,xorg-x11-server-Xvfb
+zmr,ncurses-libs.i686
+zps,ncurses-libs.i686

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

@@ -15,7 +15,7 @@ bfv,compat-libstdc++-33.i686,glibc.i686
 bmdm,ncurses-libs.i686
 bmdm,ncurses-libs.i686
 bo
 bo
 bs
 bs
-bt,libicu
+bt,libicu,dos2unix
 bt1944
 bt1944
 cc
 cc
 cd
 cd
@@ -57,9 +57,9 @@ jc3
 jk2
 jk2
 kf
 kf
 kf2
 kf2
-lo
 l4d
 l4d
 l4d2
 l4d2
+lo
 mc,java-11-openjdk
 mc,java-11-openjdk
 mcb,libnsl
 mcb,libnsl
 mh
 mh
@@ -68,6 +68,7 @@ mom
 mta,ncurses-libs
 mta,ncurses-libs
 mumble
 mumble
 nd
 nd
+nec
 nmrih,ncurses-libs.i686
 nmrih,ncurses-libs.i686
 ns
 ns
 ns2,speex,tbb
 ns2,speex,tbb
@@ -95,8 +96,8 @@ sbots
 scpsl
 scpsl
 scpslsm
 scpslsm
 sdtd,telnet,expect
 sdtd,telnet,expect
-sfc,ncurses-libs.i686
 sf
 sf
+sfc,ncurses-libs.i686
 sof2
 sof2
 sol
 sol
 squad
 squad
@@ -117,8 +118,8 @@ ut2k4
 ut3
 ut3
 ut99
 ut99
 vh,glibc-devel
 vh,glibc-devel
-vs
 vints,mono-complete
 vints,mono-complete
+vs
 wet
 wet
 wf
 wf
 wmc,java-11-openjdk
 wmc,java-11-openjdk

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

@@ -15,7 +15,7 @@ bfv,compat-libstdc++-33.i686,glibc.i686
 bmdm,ncurses-libs.i686
 bmdm,ncurses-libs.i686
 bo
 bo
 bs
 bs
-bt,libicu
+bt,libicu,dos2unix
 bt1944
 bt1944
 cc
 cc
 cd
 cd
@@ -57,9 +57,9 @@ jc3
 jk2
 jk2
 kf
 kf
 kf2
 kf2
-lo
 l4d
 l4d
 l4d2
 l4d2
+lo
 mc,java-11-openjdk
 mc,java-11-openjdk
 mcb,libnsl
 mcb,libnsl
 mh
 mh
@@ -68,6 +68,7 @@ mom
 mta,ncurses-compat-libs
 mta,ncurses-compat-libs
 mumble
 mumble
 nd
 nd
+nec
 nmrih,ncurses-libs.i686
 nmrih,ncurses-libs.i686
 ns
 ns
 ns2,speex,tbb
 ns2,speex,tbb
@@ -95,8 +96,8 @@ sbots
 scpsl
 scpsl
 scpslsm
 scpslsm
 sdtd,telnet,expect
 sdtd,telnet,expect
-sfc,ncurses-libs.i686
 sf
 sf
+sfc,ncurses-libs.i686
 sof2
 sof2
 sol
 sol
 squad
 squad
@@ -116,9 +117,9 @@ ut2k4
 ut3
 ut3
 ut99
 ut99
 vh,glibc-devel
 vh,glibc-devel
-vs
 vints,mono-complete
 vints,mono-complete
 vpmc,java-11-openjdk
 vpmc,java-11-openjdk
+vs
 wet
 wet
 wf
 wf
 wmc,java-11-openjdk
 wmc,java-11-openjdk

+ 128 - 0
lgsm/data/centos-9.csv

@@ -0,0 +1,128 @@
+all,bc,binutils,bzip2,cpio,curl,epel-release,file,glibc.i686,gzip,hostname,jq,libstdc++,libstdc++.i686,nmap-ncat,python36,tar,tmux,unzip,util-linux,wget,xz
+steamcmd,glibc.i686,libstdc++.i686
+ac
+ahl
+ahl2
+ark
+arma3
+armar,libcurl,openssl-libs
+av
+bb
+bb2,libcurl.i686
+bd
+bf1942,ncurses-libs.i686
+bfv,compat-libstdc++-33.i686,glibc.i686
+bmdm,ncurses-libs.i686
+bo
+bs
+bt,libicu,dos2unix
+bt1944
+cc
+cd
+cmw
+cod,compat-libstdc++-33.i686
+cod2,compat-libstdc++-33.i686
+cod4
+coduo,compat-libstdc++-33.i686
+codwaw
+col
+cs
+cscz
+csgo
+css,ncurses-libs.i686
+dab
+dayz
+dmc
+dod
+dodr
+dods
+doi
+dst,libcurl.i686
+dys
+eco,libgdiplus
+em
+etl
+fctr
+fof
+gmod,ncurses-libs.i686
+hl2dm
+hldm
+hldms
+hw,zlib-devel
+ins
+inss
+ios
+jc2
+jc3
+jk2
+kf
+kf2
+l4d
+l4d2
+lo
+mc,java-11-openjdk
+mcb,libnsl
+mh
+mohaa,compat-libstdc++-33.i686
+mom
+mta,ncurses-compat-libs
+mumble
+nd
+nec
+nmrih,ncurses-libs.i686
+ns
+ns2,speex,tbb
+ns2c,speex.i686,tbb.i686
+onset,mariadb-connector-c
+opfor
+pc
+pmc,java-11-openjdk
+pstbs,GConf2
+pvkii
+pvr,libcxx
+pz,java-11-openjdk rng-tools
+q2
+q3
+ql
+qw
+ricochet
+ro
+rtcw
+rust,zlib-devel
+rw,java-11-openjdk
+samp
+sb
+sbots
+scpsl
+scpslsm
+sdtd,telnet,expect
+sf
+sfc,ncurses-libs.i686
+sof2
+sol
+squad
+st
+sven
+terraria
+tf2,libcurl.i686
+tfc
+ti
+ts
+ts3
+tu
+tw
+unt
+ut
+ut2k4
+ut3
+ut99
+vh,glibc-devel
+vints,mono-complete
+vpmc,java-11-openjdk
+vs
+wet
+wf
+wmc,java-11-openjdk
+wurm,xorg-x11-server-Xvfb
+zmr,ncurses-libs.i686
+zps,ncurses-libs.i686

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

@@ -5,7 +5,7 @@ ahl
 ahl2
 ahl2
 ark
 ark
 arma3
 arma3
-armar,libcurl4,libssl1.1
+armar,libcurl4
 av
 av
 bb
 bb
 bb2,libcurl4-gnutls-dev:i386
 bb2,libcurl4-gnutls-dev:i386
@@ -15,7 +15,7 @@ bfv,libncurses5:i386,libstdc++5:i386
 bmdm,libncurses5:i386
 bmdm,libncurses5:i386
 bo
 bo
 bs
 bs
-bt,libicu-dev
+bt,libicu-dev,dos2unix
 bt1944
 bt1944
 cc
 cc
 cd
 cd
@@ -57,9 +57,9 @@ jc3
 jk2
 jk2
 kf
 kf
 kf2
 kf2
-lo
 l4d
 l4d
 l4d2
 l4d2
+lo
 mc,openjdk-11-jre
 mc,openjdk-11-jre
 mcb
 mcb
 mh
 mh
@@ -68,11 +68,12 @@ mom
 mta,libncursesw5
 mta,libncursesw5
 mumble
 mumble
 nd
 nd
+nec
 nmrih,libtinfo5:i386
 nmrih,libtinfo5:i386
 ns
 ns
 ns2,speex,libtbb2
 ns2,speex,libtbb2
 ns2c,speex:i386,libtbb2
 ns2c,speex:i386,libtbb2
-onset,libmariadbclient-dev
+onset,libmariadb-dev
 opfor
 opfor
 pc
 pc
 pmc,openjdk-11-jre
 pmc,openjdk-11-jre
@@ -95,8 +96,8 @@ sbots
 scpsl,mono-complete
 scpsl,mono-complete
 scpslsm,mono-complete
 scpslsm,mono-complete
 sdtd,telnet,expect
 sdtd,telnet,expect
-sfc,libtinfo5:i386
 sf
 sf
+sfc,libtinfo5:i386
 sof2
 sof2
 sol
 sol
 squad
 squad
@@ -117,9 +118,9 @@ ut2k4
 ut3
 ut3
 ut99
 ut99
 vh,libc6-dev
 vh,libc6-dev
-vs
 vints,mono-complete
 vints,mono-complete
 vpmc,openjdk-11-jre
 vpmc,openjdk-11-jre
+vs
 wet
 wet
 wf
 wf
 wmc,openjdk-11-jre
 wmc,openjdk-11-jre

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

@@ -5,7 +5,7 @@ ahl
 ahl2
 ahl2
 ark
 ark
 arma3
 arma3
-armar,libcurl4,libssl1.1
+armar,libcurl4
 av
 av
 bb
 bb
 bb2,libcurl4-gnutls-dev:i386
 bb2,libcurl4-gnutls-dev:i386
@@ -15,7 +15,7 @@ bfv,libncurses5:i386,libstdc++5:i386
 bmdm,libncurses5:i386
 bmdm,libncurses5:i386
 bo
 bo
 bs
 bs
-bt,libicu-dev
+bt,libicu-dev,dos2unix
 bt1944
 bt1944
 cc
 cc
 cd
 cd
@@ -57,9 +57,9 @@ jc3
 jk2
 jk2
 kf
 kf
 kf2
 kf2
-lo
 l4d
 l4d
 l4d2
 l4d2
+lo
 mc,openjdk-17-jre
 mc,openjdk-17-jre
 mcb
 mcb
 mh
 mh
@@ -68,11 +68,12 @@ mom
 mta,libncursesw5
 mta,libncursesw5
 mumble
 mumble
 nd
 nd
+nec
 nmrih,libtinfo5:i386
 nmrih,libtinfo5:i386
 ns
 ns
 ns2,speex,libtbb2
 ns2,speex,libtbb2
 ns2c,speex:i386,libtbb2
 ns2c,speex:i386,libtbb2
-onset,libmariadbclient-dev
+onset,libmariadb-dev
 opfor
 opfor
 pc
 pc
 pmc,openjdk-17-jre
 pmc,openjdk-17-jre
@@ -95,8 +96,8 @@ sbots
 scpsl,mono-complete
 scpsl,mono-complete
 scpslsm,mono-complete
 scpslsm,mono-complete
 sdtd,telnet,expect
 sdtd,telnet,expect
-sfc,libtinfo5:i386
 sf
 sf
+sfc,libtinfo5:i386
 sof2
 sof2
 sol
 sol
 squad
 squad
@@ -117,9 +118,9 @@ ut2k4
 ut3
 ut3
 ut99
 ut99
 vh,libc6-dev
 vh,libc6-dev
-vs
 vints,mono-complete
 vints,mono-complete
 vpmc,openjdk-11-jre
 vpmc,openjdk-11-jre
+vs
 wet
 wet
 wf
 wf
 wmc,openjdk-17-jre
 wmc,openjdk-17-jre

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

@@ -5,7 +5,7 @@ ahl
 ahl2
 ahl2
 ark
 ark
 arma3
 arma3
-armar,libcurl4,libssl1.1
+armar,libcurl4
 av
 av
 bb
 bb
 bb2,libcurl4-gnutls-dev:i386
 bb2,libcurl4-gnutls-dev:i386
@@ -15,7 +15,7 @@ bfv,libncurses5:i386,libstdc++5:i386
 bmdm,libncurses5:i386
 bmdm,libncurses5:i386
 bo
 bo
 bs
 bs
-bt,libicu-dev
+bt,libicu-dev,dos2unix
 bt1944
 bt1944
 cc
 cc
 cd
 cd
@@ -57,9 +57,9 @@ jc3
 jk2
 jk2
 kf
 kf
 kf2
 kf2
-lo
 l4d
 l4d
 l4d2
 l4d2
+lo
 mc,openjdk-8-jre
 mc,openjdk-8-jre
 mcb
 mcb
 mh
 mh
@@ -68,11 +68,12 @@ mom
 mta,libncursesw5
 mta,libncursesw5
 mumble
 mumble
 nd
 nd
+nec
 nmrih,libtinfo5:i386
 nmrih,libtinfo5:i386
 ns
 ns
 ns2,speex,libtbb2
 ns2,speex,libtbb2
 ns2c,speex:i386,libtbb2
 ns2c,speex:i386,libtbb2
-onset,libmariadbclient-dev
+onset,libmariadb-dev
 opfor
 opfor
 pc
 pc
 pmc,openjdk-8-jre
 pmc,openjdk-8-jre
@@ -95,8 +96,8 @@ sbots
 scpsl,mono-complete
 scpsl,mono-complete
 scpslsm,mono-complete
 scpslsm,mono-complete
 sdtd,telnet,expect
 sdtd,telnet,expect
-sfc,libtinfo5:i386
 sf
 sf
+sfc,libtinfo5:i386
 sof2
 sof2
 sol
 sol
 squad
 squad
@@ -117,8 +118,8 @@ ut2k4
 ut3
 ut3
 ut99
 ut99
 vh,libc6-dev
 vh,libc6-dev
-vs
 vints,mono-complete
 vints,mono-complete
+vs
 wet
 wet
 wf
 wf
 wmc,openjdk-8-jre
 wmc,openjdk-8-jre

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

@@ -57,9 +57,9 @@ jc3
 jk2
 jk2
 kf
 kf
 kf2
 kf2
-lo
 l4d
 l4d
 l4d2
 l4d2
+lo
 mc,java-11-openjdk
 mc,java-11-openjdk
 mcb,libnsl
 mcb,libnsl
 mh
 mh
@@ -68,6 +68,7 @@ mom
 mta
 mta
 mumble
 mumble
 nd
 nd
+nec
 nmrih,ncurses-libs.i686
 nmrih,ncurses-libs.i686
 ns
 ns
 ns2,speex,tbb
 ns2,speex,tbb
@@ -95,8 +96,8 @@ sbots
 scpsl
 scpsl
 scpslsm
 scpslsm
 sdtd,telnet,expect
 sdtd,telnet,expect
-sfc,ncurses-libs.i686
 sf
 sf
+sfc,ncurses-libs.i686
 sof2
 sof2
 sol
 sol
 squad
 squad
@@ -117,9 +118,9 @@ ut2k4
 ut3
 ut3
 ut99
 ut99
 vh,glibc-devel
 vh,glibc-devel
-vs
 vints,mono-complete
 vints,mono-complete
 vpmc,java-11-openjdk
 vpmc,java-11-openjdk
+vs
 wet
 wet
 wf
 wf
 wmc,java-11-openjdk
 wmc,java-11-openjdk

+ 4 - 3
lgsm/data/rhel-8.csv

@@ -57,9 +57,9 @@ jc3
 jk2
 jk2
 kf
 kf
 kf2
 kf2
-lo
 l4d
 l4d
 l4d2
 l4d2
+lo
 mc,java-11-openjdk
 mc,java-11-openjdk
 mcb,libnsl
 mcb,libnsl
 mh
 mh
@@ -68,6 +68,7 @@ mom
 mta
 mta
 mumble
 mumble
 nd
 nd
+nec
 nmrih,ncurses-libs.i686
 nmrih,ncurses-libs.i686
 ns
 ns
 ns2,speex,tbb
 ns2,speex,tbb
@@ -95,8 +96,8 @@ sbots
 scpsl
 scpsl
 scpslsm
 scpslsm
 sdtd,telnet,expect
 sdtd,telnet,expect
-sfc,ncurses-libs.i686
 sf
 sf
+sfc,ncurses-libs.i686
 sof2
 sof2
 sol
 sol
 squad
 squad
@@ -117,9 +118,9 @@ ut2k4
 ut3
 ut3
 ut99
 ut99
 vh,glibc-devel
 vh,glibc-devel
-vs
 vints,mono-complete
 vints,mono-complete
 vpmc,java-11-openjdk
 vpmc,java-11-openjdk
+vs
 wet
 wet
 wf
 wf
 wmc,java-11-openjdk
 wmc,java-11-openjdk

+ 129 - 0
lgsm/data/rhel-9.csv

@@ -0,0 +1,129 @@
+all,bc,binutils,bzip2,cpio,curl,epel-release,file,glibc.i686,gzip,hostname,jq,libstdc++.i686,nmap-ncat,python36,tar,tmux,unzip,util-linux,wget,xz
+steamcmd,glibc.i686,libstdc++.i686
+ac
+ahl
+ahl2
+ark
+arma3
+armar,libcurl,openssl-libs
+av
+bb
+bb2,libcurl.i686
+bd
+bf1942,ncurses-libs.i686
+bfv,compat-libstdc++-33.i686,glibc.i686
+bmdm,ncurses-libs.i686
+bo
+bs
+bt,libicu
+bt1944
+cc
+cd
+cmw
+cod,compat-libstdc++-33.i686
+cod2,compat-libstdc++-33.i686
+cod4
+coduo,compat-libstdc++-33.i686
+codwaw
+col
+cs
+cscz
+csgo
+css,ncurses-libs.i686
+dab
+dayz
+dmc
+dod
+dodr
+dods
+doi
+dst,libcurl.i686
+dys
+eco,libgdiplus
+em
+etl
+fctr
+fof
+gmod,ncurses-libs.i686
+hl2dm
+hldm
+hldms
+hw,zlib-devel
+ins
+inss
+ios
+jc2
+jc3
+jk2
+kf
+kf2
+l4d
+l4d2
+lo
+mc,java-11-openjdk
+mcb,libnsl
+mh
+mohaa,compat-libstdc++-33.i686
+mom
+mta
+mumble
+nd
+nec
+nmrih,ncurses-libs.i686
+ns
+ns2,speex,tbb
+ns2c,speex.i686,tbb.i686
+onset,mariadb-connector-c
+opfor
+pc
+pmc,java-11-openjdk
+pstbs,GConf2
+pvkii
+pvr,libcxx
+pz,java-11-openjdk rng-tools
+q2
+q3
+ql
+qw
+ricochet
+ro
+rtcw
+rust,zlib-devel
+rw,java-11-openjdk
+samp
+sb
+sbots
+scpsl
+scpslsm
+sdtd,telnet,expect
+sf
+sfc,ncurses-libs.i686
+sof2
+sol
+squad
+st
+stn
+sven
+terraria
+tf2,libcurl.i686
+tfc
+ti
+ts
+ts3
+tu
+tw
+unt
+ut
+ut2k4
+ut3
+ut99
+vh,glibc-devel
+vints,mono-complete
+vpmc,java-11-openjdk
+vs
+wet
+wf
+wmc,java-11-openjdk
+wurm,xorg-x11-server-Xvfb
+zmr,ncurses-libs.i686
+zps,ncurses-libs.i686

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

@@ -15,7 +15,7 @@ bfv,compat-libstdc++-33.i686,glibc.i686
 bmdm,ncurses-libs.i686
 bmdm,ncurses-libs.i686
 bo
 bo
 bs
 bs
-bt,libicu
+bt,libicu,dos2unix
 bt1944
 bt1944
 cc
 cc
 cd
 cd
@@ -57,9 +57,9 @@ jc3
 jk2
 jk2
 kf
 kf
 kf2
 kf2
-lo
 l4d
 l4d
 l4d2
 l4d2
+lo
 mc,java-11-openjdk
 mc,java-11-openjdk
 mcb,libnsl
 mcb,libnsl
 mh
 mh
@@ -68,6 +68,7 @@ mom
 mta,ncurses-compat-libs
 mta,ncurses-compat-libs
 mumble
 mumble
 nd
 nd
+nec
 nmrih,ncurses-libs.i686
 nmrih,ncurses-libs.i686
 ns
 ns
 ns2,speex,tbb
 ns2,speex,tbb
@@ -95,8 +96,8 @@ sbots
 scpsl
 scpsl
 scpslsm
 scpslsm
 sdtd,telnet,expect
 sdtd,telnet,expect
-sfc,ncurses-libs.i686
 sf
 sf
+sfc,ncurses-libs.i686
 sof2
 sof2
 sol
 sol
 squad
 squad
@@ -117,9 +118,9 @@ ut2k4
 ut3
 ut3
 ut99
 ut99
 vh,glibc-devel
 vh,glibc-devel
-vs
 vints,mono-complete
 vints,mono-complete
 vpmc,java-11-openjdk
 vpmc,java-11-openjdk
+vs
 wet
 wet
 wf
 wf
 wmc,java-11-openjdk
 wmc,java-11-openjdk

+ 129 - 0
lgsm/data/rocky-9.csv

@@ -0,0 +1,129 @@
+all,bc,binutils,bzip2,cpio,curl,epel-release,file,glibc.i686,gzip,hostname,jq,libstdc++.i686,nmap-ncat,python36,tar,tmux,unzip,util-linux,wget,xz
+steamcmd,glibc.i686,libstdc++.i686
+ac
+ahl
+ahl2
+ark
+arma3
+armar,libcurl,openssl-libs
+av
+bb
+bb2,libcurl.i686
+bd
+bf1942,ncurses-libs.i686
+bfv,compat-libstdc++-33.i686,glibc.i686
+bmdm,ncurses-libs.i686
+bo
+bs
+bt,libicu,dos2unix
+bt1944
+cc
+cd
+cmw
+cod,compat-libstdc++-33.i686
+cod2,compat-libstdc++-33.i686
+cod4
+coduo,compat-libstdc++-33.i686
+codwaw
+col
+cs
+cscz
+csgo
+css,ncurses-libs.i686
+dab
+dayz
+dmc
+dod
+dodr
+dods
+doi
+dst,libcurl.i686
+dys
+eco,libgdiplus
+em
+etl
+fctr
+fof
+gmod,ncurses-libs.i686
+hl2dm
+hldm
+hldms
+hw,zlib-devel
+ins
+inss
+ios
+jc2
+jc3
+jk2
+kf
+kf2
+l4d
+l4d2
+lo
+mc,java-11-openjdk
+mcb,libnsl
+mh
+mohaa,compat-libstdc++-33.i686
+mom
+mta,ncurses-compat-libs
+mumble
+nd
+nec
+nmrih,ncurses-libs.i686
+ns
+ns2,speex,tbb
+ns2c,speex.i686,tbb.i686
+onset,mariadb-connector-c
+opfor
+pc
+pmc,java-11-openjdk
+pstbs,GConf2
+pvkii
+pvr,libcxx
+pz,java-11-openjdk rng-tools
+q2
+q3
+ql
+qw
+ricochet
+ro
+rtcw
+rust,zlib-devel
+rw,java-11-openjdk
+samp
+sb
+sbots
+scpsl
+scpslsm
+sdtd,telnet,expect
+sf
+sfc,ncurses-libs.i686
+sof2
+sol
+squad
+st
+stn
+sven
+terraria
+tf2,libcurl.i686
+tfc
+ti
+ts
+ts3
+tu
+tw
+unt
+ut
+ut2k4
+ut3
+ut99
+vh,glibc-devel
+vints,mono-complete
+vpmc,java-11-openjdk
+vs
+wet
+wf
+wmc,java-11-openjdk
+wurm,xorg-x11-server-Xvfb
+zmr,ncurses-libs.i686
+zps,ncurses-libs.i686

+ 1 - 0
lgsm/data/serverlist.csv

@@ -66,6 +66,7 @@ mom,momserver,Memories of Mars,ubuntu-22.04
 mta,mtaserver,Multi Theft Auto,ubuntu-22.04
 mta,mtaserver,Multi Theft Auto,ubuntu-22.04
 mumble,mumbleserver,Mumble,ubuntu-22.04
 mumble,mumbleserver,Mumble,ubuntu-22.04
 nd,ndserver,Nuclear Dawn,ubuntu-22.04
 nd,ndserver,Nuclear Dawn,ubuntu-22.04
+nec,necserver,Necesse,ubuntu-22.04
 nmrih,nmrihserver,No More Room in Hell,ubuntu-22.04
 nmrih,nmrihserver,No More Room in Hell,ubuntu-22.04
 ns,nsserver,Natural Selection,ubuntu-22.04
 ns,nsserver,Natural Selection,ubuntu-22.04
 ns2,ns2server,Natural Selection 2,ubuntu-22.04
 ns2,ns2server,Natural Selection 2,ubuntu-22.04

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

@@ -14,7 +14,7 @@ bfv,libncurses5:i386,libstdc++5:i386
 bmdm,libncurses5:i386
 bmdm,libncurses5:i386
 bo
 bo
 bs
 bs
-bt,libicu-dev
+bt,libicu-dev,dos2unix
 bt1944
 bt1944
 cc
 cc
 cd
 cd
@@ -56,9 +56,9 @@ jc3
 jk2
 jk2
 kf
 kf
 kf2
 kf2
-lo
 l4d
 l4d
 l4d2
 l4d2
+lo
 mc,openjdk-8-jre
 mc,openjdk-8-jre
 mcb
 mcb
 mh
 mh
@@ -67,11 +67,12 @@ mom
 mta
 mta
 mumble
 mumble
 nd
 nd
+nec
 nmrih,libtinfo5:i386
 nmrih,libtinfo5:i386
 ns
 ns
 ns2,speex,libtbb2
 ns2,speex,libtbb2
 ns2c,speex:i386,libtbb2
 ns2c,speex:i386,libtbb2
-onset,libmariadbclient-dev
+onset,libmariadb-dev
 opfor
 opfor
 pc
 pc
 pmc,openjdk-8-jre
 pmc,openjdk-8-jre
@@ -94,8 +95,8 @@ sbots
 scpsl,mono-complete
 scpsl,mono-complete
 scpslsm,mono-complete
 scpslsm,mono-complete
 sdtd,telnet,expect
 sdtd,telnet,expect
-sfc,libtinfo5:i386
 sf
 sf
+sfc,libtinfo5:i386
 sof2
 sof2
 sol
 sol
 squad
 squad
@@ -116,8 +117,8 @@ ut2k4
 ut3
 ut3
 ut99
 ut99
 vh,libc6-dev
 vh,libc6-dev
-vs
 vints,mono-complete
 vints,mono-complete
+vs
 wet
 wet
 wf
 wf
 wmc,openjdk-8-jre
 wmc,openjdk-8-jre

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

@@ -5,7 +5,7 @@ ahl
 ahl2
 ahl2
 ark
 ark
 arma3
 arma3
-armar,libcurl4,libssl1.1
+armar,libcurl4
 av
 av
 bb
 bb
 bb2,libcurl4-gnutls-dev:i386
 bb2,libcurl4-gnutls-dev:i386
@@ -15,7 +15,7 @@ bfv,libncurses5:i386,libstdc++5:i386
 bmdm,libncurses5:i386
 bmdm,libncurses5:i386
 bo
 bo
 bs
 bs
-bt,libicu-dev
+bt,libicu-dev,dos2unix
 bt1944
 bt1944
 cc
 cc
 cd
 cd
@@ -57,9 +57,9 @@ jc3
 jk2
 jk2
 kf
 kf
 kf2
 kf2
-lo
 l4d
 l4d
 l4d2
 l4d2
+lo
 mc,openjdk-11-jre
 mc,openjdk-11-jre
 mcb
 mcb
 mh
 mh
@@ -68,11 +68,12 @@ mom
 mta,libncursesw5
 mta,libncursesw5
 mumble
 mumble
 nd
 nd
+nec
 nmrih,libtinfo5:i386
 nmrih,libtinfo5:i386
 ns
 ns
 ns2,speex,libtbb2
 ns2,speex,libtbb2
 ns2c,speex:i386,libtbb2
 ns2c,speex:i386,libtbb2
-onset,libmariadbclient-dev
+onset,libmariadb-dev
 opfor
 opfor
 pc
 pc
 pmc,openjdk-11-jre
 pmc,openjdk-11-jre
@@ -95,8 +96,8 @@ sbots
 scpsl,mono-complete
 scpsl,mono-complete
 scpslsm,mono-complete
 scpslsm,mono-complete
 sdtd,telnet,expect
 sdtd,telnet,expect
-sfc,libtinfo5:i386
 sf
 sf
+sfc,libtinfo5:i386
 sof2
 sof2
 sol
 sol
 squad
 squad
@@ -117,9 +118,9 @@ ut2k4
 ut3
 ut3
 ut99
 ut99
 vh,libc6-dev
 vh,libc6-dev
-vs
 vints,mono-complete
 vints,mono-complete
 vpmc,openjdk-11-jre
 vpmc,openjdk-11-jre
+vs
 wet
 wet
 wf
 wf
 wmc,openjdk-11-jre
 wmc,openjdk-11-jre

+ 1 - 0
lgsm/data/ubuntu-20.04.csv

@@ -68,6 +68,7 @@ mom
 mta,libncursesw5
 mta,libncursesw5
 mumble
 mumble
 nd
 nd
+nec
 nmrih,libtinfo5:i386
 nmrih,libtinfo5:i386
 ns
 ns
 ns2,speex,libtbb2
 ns2,speex,libtbb2

+ 8 - 7
lgsm/data/ubuntu-21.04.csv

@@ -5,7 +5,7 @@ ahl
 ahl2
 ahl2
 ark
 ark
 arma3
 arma3
-armar,libcurl4,libssl1.1
+armar,libcurl4
 av
 av
 bb
 bb
 bb2,libcurl4-gnutls-dev:i386
 bb2,libcurl4-gnutls-dev:i386
@@ -15,7 +15,7 @@ bfv,libncurses5:i386,libstdc++5:i386
 bmdm,libncurses5:i386
 bmdm,libncurses5:i386
 bo
 bo
 bs
 bs
-bt,libicu-dev
+bt,libicu-dev,dos2unix
 bt1944
 bt1944
 cc
 cc
 cd
 cd
@@ -57,9 +57,9 @@ jc3
 jk2
 jk2
 kf
 kf
 kf2
 kf2
-lo
 l4d
 l4d
 l4d2
 l4d2
+lo
 mc,openjdk-17-jre
 mc,openjdk-17-jre
 mcb
 mcb
 mh
 mh
@@ -68,11 +68,12 @@ mom
 mta,libncursesw5
 mta,libncursesw5
 mumble
 mumble
 nd
 nd
+nec
 nmrih,libtinfo5:i386
 nmrih,libtinfo5:i386
 ns
 ns
 ns2,speex,libtbb2
 ns2,speex,libtbb2
 ns2c,speex:i386,libtbb2
 ns2c,speex:i386,libtbb2
-onset,libmariadbclient-dev
+onset,libmariadb-dev
 opfor
 opfor
 pc
 pc
 pmc,openjdk-17-jre
 pmc,openjdk-17-jre
@@ -95,15 +96,15 @@ sbots
 scpsl,mono-complete
 scpsl,mono-complete
 scpslsm,mono-complete
 scpslsm,mono-complete
 sdtd,telnet,expect
 sdtd,telnet,expect
-sfc,libtinfo5:i386
 sf
 sf
+sfc,libtinfo5:i386
 sof2
 sof2
 sol
 sol
 squad
 squad
 st
 st
 stn
 stn
 sven,libssl1.1:i386,zlib1g:i386
 sven,libssl1.1:i386,zlib1g:i386
-terraria,libsdl
+terraria
 tf2,libcurl4-gnutls-dev:i386
 tf2,libcurl4-gnutls-dev:i386
 tfc
 tfc
 ti
 ti
@@ -117,9 +118,9 @@ ut2k4
 ut3
 ut3
 ut99
 ut99
 vh,libc6-dev
 vh,libc6-dev
-vs
 vints,mono-complete
 vints,mono-complete
 vpmc,openjdk-11-jre
 vpmc,openjdk-11-jre
+vs
 wet
 wet
 wf
 wf
 wmc,openjdk-17-jre
 wmc,openjdk-17-jre

+ 7 - 6
lgsm/data/ubuntu-21.10.csv

@@ -5,7 +5,7 @@ ahl
 ahl2
 ahl2
 ark
 ark
 arma3
 arma3
-armar,libcurl4,libssl1.1
+armar,libcurl4
 av
 av
 bb
 bb
 bb2,libcurl4-gnutls-dev:i386
 bb2,libcurl4-gnutls-dev:i386
@@ -55,9 +55,9 @@ jc3
 jk2
 jk2
 kf
 kf
 kf2
 kf2
-lo
 l4d
 l4d
 l4d2
 l4d2
+lo
 mc,openjdk-17-jre
 mc,openjdk-17-jre
 mcb
 mcb
 mh
 mh
@@ -66,11 +66,12 @@ mom
 mta,libncursesw5
 mta,libncursesw5
 mumble
 mumble
 nd
 nd
+nec
 nmrih,libtinfo5:i386
 nmrih,libtinfo5:i386
 ns
 ns
 ns2,speex,libtbb2
 ns2,speex,libtbb2
 ns2c,speex:i386,libtbb2
 ns2c,speex:i386,libtbb2
-onset,libmariadbclient-dev
+onset,libmariadb-dev
 opfor
 opfor
 pc
 pc
 pmc,openjdk-17-jre
 pmc,openjdk-17-jre
@@ -93,15 +94,15 @@ sbots
 scpsl,mono-complete
 scpsl,mono-complete
 scpslsm,mono-complete
 scpslsm,mono-complete
 sdtd,telnet,expect
 sdtd,telnet,expect
-sfc,libtinfo5:i386
 sf
 sf
+sfc,libtinfo5:i386
 sof2
 sof2
 sol
 sol
 squad
 squad
 st
 st
 stn
 stn
 sven,libssl1.1:i386,zlib1g:i386
 sven,libssl1.1:i386,zlib1g:i386
-terraria,libsdl
+terraria
 tf2,libcurl4-gnutls-dev:i386
 tf2,libcurl4-gnutls-dev:i386
 tfc
 tfc
 ti
 ti
@@ -115,9 +116,9 @@ ut2k4
 ut3
 ut3
 ut99
 ut99
 vh,libc6-dev
 vh,libc6-dev
-vs
 vints,mono-complete
 vints,mono-complete
 vpmc,openjdk-11-jre
 vpmc,openjdk-11-jre
+vs
 wet
 wet
 wf
 wf
 wmc,openjdk-17-jre
 wmc,openjdk-17-jre

+ 1 - 0
lgsm/data/ubuntu-22.04.csv

@@ -66,6 +66,7 @@ mom
 mta,libncursesw5
 mta,libncursesw5
 mumble
 mumble
 nd
 nd
+nec
 nmrih,libtinfo5:i386
 nmrih,libtinfo5:i386
 ns
 ns
 ns2,speex,libtbb2
 ns2,speex,libtbb2

+ 1 - 1
lgsm/functions/check_deps.sh

@@ -337,7 +337,7 @@ fi
 if [ -f "${datadir}/${distroid}-${distroversioncsv}.csv" ]; then
 if [ -f "${datadir}/${distroid}-${distroversioncsv}.csv" ]; then
 	depall=$(awk -F, '$1=="all" {$1=""; print $0}' "${datadir}/${distroid}-${distroversioncsv}.csv")
 	depall=$(awk -F, '$1=="all" {$1=""; print $0}' "${datadir}/${distroid}-${distroversioncsv}.csv")
 	depsteamcmd=$(awk -F, '$1=="steamcmd" {$1=""; print $0}' "${datadir}/${distroid}-${distroversioncsv}.csv")
 	depsteamcmd=$(awk -F, '$1=="steamcmd" {$1=""; print $0}' "${datadir}/${distroid}-${distroversioncsv}.csv")
-	depshortname=$(awk -v shortname="$shortname" -F, '$1==shortname {$1=""; print $0}' "${datadir}/${distroid}-${distroversioncsv}.csv")
+	depshortname=$(awk -v shortname="${shortname}" -F, '$1==shortname {$1=""; print $0}' "${datadir}/${distroid}-${distroversioncsv}.csv")
 
 
 	# Generate array of missing deps.
 	# Generate array of missing deps.
 	array_deps_missing=()
 	array_deps_missing=()

+ 1 - 0
lgsm/functions/check_executable.sh

@@ -8,6 +8,7 @@
 functionselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")"
 functionselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")"
 
 
 # Check if executable exists
 # Check if executable exists
+execname=$(basename "${executable}")
 if [ ! -f "${executabledir}/${execname}" ]; then
 if [ ! -f "${executabledir}/${execname}" ]; then
 	fn_print_fail_nl "executable was not found"
 	fn_print_fail_nl "executable was not found"
 	echo -e "* ${executabledir}/${execname}"
 	echo -e "* ${executabledir}/${execname}"

+ 2 - 4
lgsm/functions/check_permissions.sh

@@ -223,10 +223,8 @@ fn_sys_perm_error_process() {
 	fi
 	fi
 }
 }
 
 
-# Run perm error detect & fix/alert functions on /sys directories.
-
-## Run checks.
-if [ "$(whoami)" != "root" ] || [ -f /.dockerenv ]; then
+## Run permisions checks when not root or docker.
+if [ "$(whoami)" != "root" ] && [ ! -f /.dockerenv ]; then
 	fn_check_ownership
 	fn_check_ownership
 	fn_check_permissions
 	fn_check_permissions
 	if [ "${commandname}" == "START" ]; then
 	if [ "${commandname}" == "START" ]; then

+ 28 - 28
lgsm/functions/command_dev_query_raw.sh

@@ -28,169 +28,169 @@ echo -e "=================================================================="
 {
 {
 	echo -e "${lightblue}Port Name \tPort Number \tStatus \tTCP \tUDP${default}"
 	echo -e "${lightblue}Port Name \tPort Number \tStatus \tTCP \tUDP${default}"
 	if [ -v port ]; then
 	if [ -v port ]; then
-		echo -e "Game: \t${port} \t$(ss -tupl | grep ${port} | wc -l) \t$(ss -tupl | grep ${port} | grep tcp | awk '{ print $2 }') \t$(ss -tupl | grep ${port} | grep udp | awk '{ print $2 }')"
+		echo -e "Game: \t${port} \t$(ss -tupl | grep -c ${port}) \t$(ss -tupl | grep ${port} | grep tcp | awk '{ print $2 }') \t$(ss -tupl | grep ${port} | grep udp | awk '{ print $2 }')"
 	else
 	else
 		echo -e "Game:"
 		echo -e "Game:"
 	fi
 	fi
 	if [ "${shortname}" == "rw" ]; then
 	if [ "${shortname}" == "rw" ]; then
 		if [ -v port2 ]; then
 		if [ -v port2 ]; then
-			echo -e "Game+1: \t${port2} \t$(ss -tupl | grep ${port} | wc -l) \t$(ss -tupl | grep ${port2} | grep tcp | awk '{ print $2 }') \t$(ss -tupl | grep ${port2} | grep udp | awk '{ print $2 }')"
+			echo -e "Game+1: \t${port2} \t$(ss -tupl | grep -c ${port}) \t$(ss -tupl | grep ${port2} | grep tcp | awk '{ print $2 }') \t$(ss -tupl | grep ${port2} | grep udp | awk '{ print $2 }')"
 		else
 		else
 			echo -e "Game+1:"
 			echo -e "Game+1:"
 		fi
 		fi
 
 
 		if [ -v port3 ]; then
 		if [ -v port3 ]; then
-			echo -e "Game+2: \t${port3} \t$(ss -tupl | grep ${port} | wc -l) \t$(ss -tupl | grep ${port3} | grep tcp | awk '{ print $2 }') \t$(ss -tupl | grep ${port3} | grep udp | awk '{ print $2 }')"
+			echo -e "Game+2: \t${port3} \t$(ss -tupl | grep -c ${port}) \t$(ss -tupl | grep ${port3} | grep tcp | awk '{ print $2 }') \t$(ss -tupl | grep ${port3} | grep udp | awk '{ print $2 }')"
 		else
 		else
 			echo -e "Game+2:"
 			echo -e "Game+2:"
 		fi
 		fi
 
 
 		if [ -v port4 ]; then
 		if [ -v port4 ]; then
-			echo -e "Game+3: \t${port4} \t$(ss -tupl | grep ${port} | wc -l) \t$(ss -tupl | grep ${port4} | grep tcp | awk '{ print $2 }') \t$(ss -tupl | grep ${port4} | grep udp | awk '{ print $2 }')"
+			echo -e "Game+3: \t${port4} \t$(ss -tupl | grep -c ${port}) \t$(ss -tupl | grep ${port4} | grep tcp | awk '{ print $2 }') \t$(ss -tupl | grep ${port4} | grep udp | awk '{ print $2 }')"
 		else
 		else
 			echo -e "Game+3:"
 			echo -e "Game+3:"
 		fi
 		fi
 	fi
 	fi
 
 
 	if [ -v port401 ]; then
 	if [ -v port401 ]; then
-		echo -e "Game+400: \t${port401} \t$(ss -tupl | grep ${port401} | wc -l) \t$(ss -tupl | grep ${port401} | grep tcp | awk '{ print $2 }') \t$(ss -tupl | grep ${port401} | grep udp | awk '{ print $2 }')"
+		echo -e "Game+400: \t${port401} \t$(ss -tupl | grep -c ${port401}) \t$(ss -tupl | grep ${port401} | grep tcp | awk '{ print $2 }') \t$(ss -tupl | grep ${port401} | grep udp | awk '{ print $2 }')"
 	else
 	else
 		echo -e "Game+400:"
 		echo -e "Game+400:"
 	fi
 	fi
 
 
 	if [ -v portipv6 ]; then
 	if [ -v portipv6 ]; then
-		echo -e "Game ipv6: \t${portipv6} \t$(ss -tupl | grep ${portipv6} | wc -l) \t$(ss -tupl | grep ${portipv6} | grep tcp | awk '{ print $2 }') \t$(ss -tupl | grep ${portipv6} | grep udp | awk '{ print $2 }')"
+		echo -e "Game ipv6: \t${portipv6} \t$(ss -tupl | grep -c ${portipv6}) \t$(ss -tupl | grep ${portipv6} | grep tcp | awk '{ print $2 }') \t$(ss -tupl | grep ${portipv6} | grep udp | awk '{ print $2 }')"
 	else
 	else
 		echo -e "Game ipv6:"
 		echo -e "Game ipv6:"
 	fi
 	fi
 
 
 	if [ -v queryport ]; then
 	if [ -v queryport ]; then
-		echo -e "Query: \t${queryport} \t$(ss -tupl | grep ${queryport} | wc -l) \t$(ss -tupl | grep ${queryport} | grep tcp | awk '{ print $2 }') \t$(ss -tupl | grep ${queryport} | grep udp | awk '{ print $2 }')"
+		echo -e "Query: \t${queryport} \t$(ss -tupl | grep -c ${queryport}) \t$(ss -tupl | grep ${queryport} | grep tcp | awk '{ print $2 }') \t$(ss -tupl | grep ${queryport} | grep udp | awk '{ print $2 }')"
 	else
 	else
 		echo -e "Query:"
 		echo -e "Query:"
 	fi
 	fi
 
 
 	if [ -v httpport ]; then
 	if [ -v httpport ]; then
-		echo -e "HTTP: \t${httpport} \t$(ss -tupl | grep ${httpport} | wc -l) \t$(ss -tupl | grep ${httpport} | grep tcp | awk '{ print $2 }') \t$(ss -tupl | grep ${httpport} | grep udp | awk '{ print $2 }')"
+		echo -e "HTTP: \t${httpport} \t$(ss -tupl | grep -c ${httpport}) \t$(ss -tupl | grep ${httpport} | grep tcp | awk '{ print $2 }') \t$(ss -tupl | grep ${httpport} | grep udp | awk '{ print $2 }')"
 	else
 	else
 		echo -e "HTTP:"
 		echo -e "HTTP:"
 	fi
 	fi
 
 
 	if [ -v httpqueryport ]; then
 	if [ -v httpqueryport ]; then
-		echo -e "HTTP Query: \t${httpqueryport} \t$(ss -tupl | grep ${httpqueryport} | wc -l) \t$(ss -tupl | grep ${httpqueryport} | grep tcp | awk '{ print $2 }') \t$(ss -tupl | grep ${httpqueryport} | grep udp | awk '{ print $2 }')"
+		echo -e "HTTP Query: \t${httpqueryport} \t$(ss -tupl | grep -c ${httpqueryport}) \t$(ss -tupl | grep ${httpqueryport} | grep tcp | awk '{ print $2 }') \t$(ss -tupl | grep ${httpqueryport} | grep udp | awk '{ print $2 }')"
 	else
 	else
 		echo -e "HTTP Query:"
 		echo -e "HTTP Query:"
 	fi
 	fi
 
 
 	if [ -v webadminport ]; then
 	if [ -v webadminport ]; then
-		echo -e "Web Admin: \t${webadminport} \t$(ss -tupl | grep ${webadminport} | wc -l) \t$(ss -tupl | grep ${webadminport} | grep tcp | awk '{ print $2 }') \t$(ss -tupl | grep ${webadminport} | grep udp | awk '{ print $2 }')"
+		echo -e "Web Admin: \t${webadminport} \t$(ss -tupl | grep -c ${webadminport}) \t$(ss -tupl | grep ${webadminport} | grep tcp | awk '{ print $2 }') \t$(ss -tupl | grep ${webadminport} | grep udp | awk '{ print $2 }')"
 	else
 	else
 		echo -e "Web Admin:"
 		echo -e "Web Admin:"
 	fi
 	fi
 
 
 	if [ -v clientport ]; then
 	if [ -v clientport ]; then
-		echo -e "Client: \t${clientport} \t$(ss -tupl | grep ${clientport} | wc -l) \t$(ss -tupl | grep ${clientport} | grep tcp | awk '{ print $2 }') \t$(ss -tupl | grep ${clientport} | grep udp | awk '{ print $2 }')"
+		echo -e "Client: \t${clientport} \t$(ss -tupl | grep -c ${clientport}) \t$(ss -tupl | grep ${clientport} | grep tcp | awk '{ print $2 }') \t$(ss -tupl | grep ${clientport} | grep udp | awk '{ print $2 }')"
 	else
 	else
 		echo -e "Client:"
 		echo -e "Client:"
 	fi
 	fi
 
 
 	if [ -v rconport ]; then
 	if [ -v rconport ]; then
-		echo -e "RCON: \t${rconport} \t$(ss -tupl | grep ${rconport} | wc -l) \t$(ss -tupl | grep ${rconport} | grep tcp | awk '{ print $2 }') \t$(ss -tupl | grep ${rconport} | grep udp | awk '{ print $2 }')"
+		echo -e "RCON: \t${rconport} \t$(ss -tupl | grep -c ${rconport}) \t$(ss -tupl | grep ${rconport} | grep tcp | awk '{ print $2 }') \t$(ss -tupl | grep ${rconport} | grep udp | awk '{ print $2 }')"
 	else
 	else
 		echo -e "RCON:"
 		echo -e "RCON:"
 	fi
 	fi
 
 
 	if [ -v rawport ]; then
 	if [ -v rawport ]; then
-		echo -e "RAW UDP Socket: \t${rawport} \t$(ss -tupl | grep ${rawport} | wc -l) \t$(ss -tupl | grep ${rawport} | grep tcp | awk '{ print $2 }') \t$(ss -tupl | grep ${rawport} | grep udp | awk '{ print $2 }')"
+		echo -e "RAW UDP Socket: \t${rawport} \t$(ss -tupl | grep -c ${rawport}) \t$(ss -tupl | grep ${rawport} | grep tcp | awk '{ print $2 }') \t$(ss -tupl | grep ${rawport} | grep udp | awk '{ print $2 }')"
 	else
 	else
 		echo -e "RAW UDP Socket:"
 		echo -e "RAW UDP Socket:"
 	fi
 	fi
 
 
 	if [ -v masterport ]; then
 	if [ -v masterport ]; then
-		echo -e "Game: Master: \t${masterport} \t$(ss -tupl | grep ${masterport} | wc -l) \t$(ss -tupl | grep ${masterport} | grep tcp | awk '{ print $2 }') \t$(ss -tupl | grep ${masterport} | grep udp | awk '{ print $2 }')"
+		echo -e "Game: Master: \t${masterport} \t$(ss -tupl | grep -c ${masterport}) \t$(ss -tupl | grep ${masterport} | grep tcp | awk '{ print $2 }') \t$(ss -tupl | grep ${masterport} | grep udp | awk '{ print $2 }')"
 	else
 	else
 		echo -e "Game: Master:"
 		echo -e "Game: Master:"
 	fi
 	fi
 
 
 	if [ -v steamport ]; then
 	if [ -v steamport ]; then
-		echo -e "Steam: \t${steamport} \t$(ss -tupl | grep ${steamport} | wc -l) \t$(ss -tupl | grep ${steamport} | grep tcp | awk '{ print $2 }') \t$(ss -tupl | grep ${steamport} | grep udp | awk '{ print $2 }')"
+		echo -e "Steam: \t${steamport} \t$(ss -tupl | grep -c ${steamport}) \t$(ss -tupl | grep ${steamport} | grep tcp | awk '{ print $2 }') \t$(ss -tupl | grep ${steamport} | grep udp | awk '{ print $2 }')"
 	else
 	else
 		echo -e "Steam:"
 		echo -e "Steam:"
 	fi
 	fi
 
 
 	if [ -v steamauthport ]; then
 	if [ -v steamauthport ]; then
-		echo -e "Steam: Auth: \t${steamauthport} \t$(ss -tupl | grep ${steamauthport} | wc -l) \t$(ss -tupl | grep ${steamauthport} | grep tcp | awk '{ print $2 }') \t$(ss -tupl | grep ${steamauthport} | grep udp | awk '{ print $2 }')"
+		echo -e "Steam: Auth: \t${steamauthport} \t$(ss -tupl | grep -c ${steamauthport}) \t$(ss -tupl | grep ${steamauthport} | grep tcp | awk '{ print $2 }') \t$(ss -tupl | grep ${steamauthport} | grep udp | awk '{ print $2 }')"
 	else
 	else
 		echo -e "Steam: Auth:"
 		echo -e "Steam: Auth:"
 	fi
 	fi
 
 
 	if [ -v steammasterport ]; then
 	if [ -v steammasterport ]; then
-		echo -e "Steam: Master: \t${steammasterport} \t$(ss -tupl | grep ${steammasterport} | wc -l) \t$(ss -tupl | grep ${steammasterport} | grep tcp | awk '{ print $2 }') \t$(ss -tupl | grep ${steammasterport} | grep udp | awk '{ print $2 }')"
+		echo -e "Steam: Master: \t${steammasterport} \t$(ss -tupl | grep -c ${steammasterport}) \t$(ss -tupl | grep ${steammasterport} | grep tcp | awk '{ print $2 }') \t$(ss -tupl | grep ${steammasterport} | grep udp | awk '{ print $2 }')"
 	else
 	else
 		echo -e "Steam: Master:"
 		echo -e "Steam: Master:"
 	fi
 	fi
 
 
 	if [ -v steamqueryport ]; then
 	if [ -v steamqueryport ]; then
-		echo -e "Steam: Query: \t${steamqueryport} \t$(ss -tupl | grep ${steamqueryport} | wc -l) \t$(ss -tupl | grep ${steamqueryport} | grep tcp | awk '{ print $2 }') \t$(ss -tupl | grep ${steamqueryport} | grep udp | awk '{ print $2 }')"
+		echo -e "Steam: Query: \t${steamqueryport} \t$(ss -tupl | grep -c ${steamqueryport}) \t$(ss -tupl | grep ${steamqueryport} | grep tcp | awk '{ print $2 }') \t$(ss -tupl | grep ${steamqueryport} | grep udp | awk '{ print $2 }')"
 	else
 	else
 		echo -e "Steam: Query:"
 		echo -e "Steam: Query:"
 	fi
 	fi
 	if [ -v beaconport ]; then
 	if [ -v beaconport ]; then
-		echo -e "Beacon: \t${beaconport} \t$(ss -tupl | grep ${beaconport} | wc -l) \t$(ss -tupl | grep ${beaconport} | grep tcp | awk '{ print $2 }') \t$(ss -tupl | grep ${beaconport} | grep udp | awk '{ print $2 }')"
+		echo -e "Beacon: \t${beaconport} \t$(ss -tupl | grep -c ${beaconport}) \t$(ss -tupl | grep ${beaconport} | grep tcp | awk '{ print $2 }') \t$(ss -tupl | grep ${beaconport} | grep udp | awk '{ print $2 }')"
 	else
 	else
 		echo -e "Beacon:"
 		echo -e "Beacon:"
 	fi
 	fi
 
 
 	if [ -v appport ]; then
 	if [ -v appport ]; then
-		echo -e "App: \t${appport} \t$(ss -tupl | grep ${appport} | wc -l) \t$(ss -tupl | grep ${appport} | grep tcp | awk '{ print $2 }') \t$(ss -tupl | grep ${appport} | grep udp | awk '{ print $2 }')"
+		echo -e "App: \t${appport} \t$(ss -tupl | grep -c ${appport}) \t$(ss -tupl | grep ${appport} | grep tcp | awk '{ print $2 }') \t$(ss -tupl | grep ${appport} | grep udp | awk '{ print $2 }')"
 	else
 	else
 		echo -e "App:"
 		echo -e "App:"
 	fi
 	fi
 
 
 	if [ -v telnetport ]; then
 	if [ -v telnetport ]; then
-		echo -e "Telnet: \t${telnetport} \t$(ss -tupl | grep ${telnetport} | wc -l) \t$(ss -tupl | grep ${telnetport} | grep tcp | awk '{ print $2 }') \t$(ss -tupl | grep ${telnetport} | grep udp | awk '{ print $2 }')"
+		echo -e "Telnet: \t${telnetport} \t$(ss -tupl | grep -c ${telnetport}) \t$(ss -tupl | grep ${telnetport} | grep tcp | awk '{ print $2 }') \t$(ss -tupl | grep ${telnetport} | grep udp | awk '{ print $2 }')"
 	else
 	else
 		echo -e "Telnet:"
 		echo -e "Telnet:"
 	fi
 	fi
 
 
 	if [ -v sourcetvport ]; then
 	if [ -v sourcetvport ]; then
-		echo -e "SourceTV: \t${sourcetvport} \t$(ss -tupl | grep ${sourcetvport} | wc -l) \t$(ss -tupl | grep ${sourcetvport} | grep tcp | awk '{ print $2 }') \t$(ss -tupl | grep ${sourcetvport} | grep udp | awk '{ print $2 }')"
+		echo -e "SourceTV: \t${sourcetvport} \t$(ss -tupl | grep -c ${sourcetvport}) \t$(ss -tupl | grep ${sourcetvport} | grep tcp | awk '{ print $2 }') \t$(ss -tupl | grep ${sourcetvport} | grep udp | awk '{ print $2 }')"
 	else
 	else
 		echo -e "SourceTV:"
 		echo -e "SourceTV:"
 	fi
 	fi
 
 
 	if [ -v fileport ]; then
 	if [ -v fileport ]; then
-		echo -e "File: \t${fileport} \t$(ss -tupl | grep ${fileport} | wc -l) \t$(ss -tupl | grep ${fileport} | grep tcp | awk '{ print $2 }') \t$(ss -tupl | grep ${fileport} | grep udp | awk '{ print $2 }')"
+		echo -e "File: \t${fileport} \t$(ss -tupl | grep -c ${fileport}) \t$(ss -tupl | grep ${fileport} | grep tcp | awk '{ print $2 }') \t$(ss -tupl | grep ${fileport} | grep udp | awk '{ print $2 }')"
 	else
 	else
 		echo -e "File:"
 		echo -e "File:"
 	fi
 	fi
 
 
 	if [ -v udplinkport ]; then
 	if [ -v udplinkport ]; then
-		echo -e "UDP Link: \t${udplinkport} \t$(ss -tupl | grep ${udplinkport} | wc -l) \t$(ss -tupl | grep ${udplinkport} | grep tcp | awk '{ print $2 }') \t$(ss -tupl | grep ${udplinkport} | grep udp | awk '{ print $2 }')"
+		echo -e "UDP Link: \t${udplinkport} \t$(ss -tupl | grep -c ${udplinkport}) \t$(ss -tupl | grep ${udplinkport} | grep tcp | awk '{ print $2 }') \t$(ss -tupl | grep ${udplinkport} | grep udp | awk '{ print $2 }')"
 	else
 	else
 		echo -e "UDP Link:"
 		echo -e "UDP Link:"
 	fi
 	fi
 
 
 	if [ -v voiceport ]; then
 	if [ -v voiceport ]; then
-		echo -e "Voice: \t${voiceport} \t$(ss -tupl | grep ${voiceport} | wc -l) \t$(ss -tupl | grep ${voiceport} | grep tcp | awk '{ print $2 }') \t$(ss -tupl | grep ${voiceport} | grep udp | awk '{ print $2 }')"
+		echo -e "Voice: \t${voiceport} \t$(ss -tupl | grep -c ${voiceport}) \t$(ss -tupl | grep ${voiceport} | grep tcp | awk '{ print $2 }') \t$(ss -tupl | grep ${voiceport} | grep udp | awk '{ print $2 }')"
 	else
 	else
 		echo -e "Voice:"
 		echo -e "Voice:"
 	fi
 	fi
 
 
 	if [ -v voiceunusedport ]; then
 	if [ -v voiceunusedport ]; then
-		echo -e "Voice (Unused): \t${voiceunusedport} \t$(ss -tupl | grep ${voiceunusedport} | wc -l) \t$(ss -tupl | grep ${voiceunusedport} | grep tcp | awk '{ print $2 }') \t$(ss -tupl | grep ${voiceunusedport} | grep udp | awk '{ print $2 }')"
+		echo -e "Voice (Unused): \t${voiceunusedport} \t$(ss -tupl | grep -c ${voiceunusedport}) \t$(ss -tupl | grep ${voiceunusedport} | grep tcp | awk '{ print $2 }') \t$(ss -tupl | grep ${voiceunusedport} | grep udp | awk '{ print $2 }')"
 	else
 	else
 		echo -e "Voice (Unused):"
 		echo -e "Voice (Unused):"
 	fi
 	fi
 
 
 	if [ -v battleeyeport ]; then
 	if [ -v battleeyeport ]; then
-		echo -e "BattleEye: \t${battleeyeport} \t$(ss -tupl | grep ${battleeyeport} | wc -l) \t$(ss -tupl | grep ${battleeyeport} | grep tcp | awk '{ print $2 }') \t$(ss -tupl | grep ${battleeyeport} | grep udp | awk '{ print $2 }')"
+		echo -e "BattleEye: \t${battleeyeport} \t$(ss -tupl | grep -c ${battleeyeport}) \t$(ss -tupl | grep ${battleeyeport} | grep tcp | awk '{ print $2 }') \t$(ss -tupl | grep ${battleeyeport} | grep udp | awk '{ print $2 }')"
 	else
 	else
 		echo -e "BattleEye:"
 		echo -e "BattleEye:"
 	fi
 	fi
 
 
 	if [ -v statsport ]; then
 	if [ -v statsport ]; then
-		echo -e "Stats: \t${battleeyeport} \t$(ss -tupl | grep ${statsport} | wc -l) \t$(ss -tupl | grep ${statsport} | grep tcp | awk '{ print $2 }') \t$(ss -tupl | grep ${statsport} | grep udp | awk '{ print $2 }')"
+		echo -e "Stats: \t${battleeyeport} \t$(ss -tupl | grep -c ${statsport}) \t$(ss -tupl | grep ${statsport} | grep tcp | awk '{ print $2 }') \t$(ss -tupl | grep ${statsport} | grep udp | awk '{ print $2 }')"
 	else
 	else
 		echo -e "Stats:"
 		echo -e "Stats:"
 	fi
 	fi

+ 4 - 4
lgsm/functions/command_monitor.sh

@@ -131,7 +131,7 @@ fn_monitor_query() {
 				# Server query OK.
 				# Server query OK.
 				fn_print_ok "Querying port: ${querymethod}: ${queryip}:${queryport} : ${totalseconds}/${queryattempt}: "
 				fn_print_ok "Querying port: ${querymethod}: ${queryip}:${queryport} : ${totalseconds}/${queryattempt}: "
 				fn_print_ok_eol_nl
 				fn_print_ok_eol_nl
-				fn_script_log_pass "Querying port: ${querymethod}: ${queryip}:${queryport} : ${queryattempt}: OK"
+				fn_script_log_pass "Querying port: ${querymethod}: ${queryip}:${queryport} : ${queryattempt} : OK"
 				monitorpass=1
 				monitorpass=1
 				if [ "${querystatus}" == "0" ]; then
 				if [ "${querystatus}" == "0" ]; then
 					# Add query data to log.
 					# Add query data to log.
@@ -161,14 +161,14 @@ fn_monitor_query() {
 				# Server query FAIL.
 				# Server query FAIL.
 				fn_print_fail "Querying port: ${querymethod}: ${queryip}:${queryport} : ${totalseconds}/${queryattempt}: "
 				fn_print_fail "Querying port: ${querymethod}: ${queryip}:${queryport} : ${totalseconds}/${queryattempt}: "
 				fn_print_fail_eol
 				fn_print_fail_eol
-				fn_script_log_warn "Querying port: ${querymethod}: ${queryip}:${queryport} : ${queryattempt}: FAIL"
+				fn_script_log_warn "Querying port: ${querymethod}: ${queryip}:${queryport} : ${queryattempt} : FAIL"
 				# Monitor will try gamedig (if supported) for first 30s then gsquery before restarting.
 				# Monitor will try gamedig (if supported) for first 30s then gsquery before restarting.
 				# gsquery will fail if longer than 60s
 				# gsquery will fail if longer than 60s
 				if [ "${totalseconds}" -ge "59" ]; then
 				if [ "${totalseconds}" -ge "59" ]; then
 					# Monitor will FAIL if over 60s and trigger gane server reboot.
 					# Monitor will FAIL if over 60s and trigger gane server reboot.
 					fn_print_fail "Querying port: ${querymethod}: ${queryip}:${queryport} : ${totalseconds}/${queryattempt}: "
 					fn_print_fail "Querying port: ${querymethod}: ${queryip}:${queryport} : ${totalseconds}/${queryattempt}: "
 					fn_print_fail_eol_nl
 					fn_print_fail_eol_nl
-					fn_script_log_warn "Querying port: ${querymethod}: ${queryip}:${queryport} : ${queryattempt}: FAIL"
+					fn_script_log_warn "Querying port: ${querymethod}: ${queryip}:${queryport} : ${queryattempt} : FAIL"
 					# Send alert if enabled.
 					# Send alert if enabled.
 					alert="restartquery"
 					alert="restartquery"
 					alert.sh
 					alert.sh
@@ -180,7 +180,7 @@ fn_monitor_query() {
 		done
 		done
 		# Second counter will wait for 15s before breaking loop.
 		# Second counter will wait for 15s before breaking loop.
 		for seconds in {1..15}; do
 		for seconds in {1..15}; do
-			fn_print_fail "Querying port: ${querymethod}: ${ip}:${queryport} : ${totalseconds}/${queryattempt}: ${cyan}WAIT${default}"
+			fn_print_fail "Querying port: ${querymethod}: ${ip}:${queryport} : ${totalseconds}/${queryattempt} : ${cyan}WAIT${default}"
 			sleep 0.5
 			sleep 0.5
 			totalseconds=$((totalseconds + 1))
 			totalseconds=$((totalseconds + 1))
 			if [ "${seconds}" == "15" ]; then
 			if [ "${seconds}" == "15" ]; then

+ 1 - 1
lgsm/functions/core_functions.sh

@@ -8,7 +8,7 @@
 
 
 functionselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")"
 functionselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")"
 
 
-modulesversion="v22.2.1"
+modulesversion="v23.1.0"
 
 
 # Core
 # Core
 
 

+ 1 - 1
lgsm/functions/core_getopt.sh

@@ -75,7 +75,7 @@ if [ "${shortname}" == "jk2" ] || [ "${engine}" != "idtech3" ]; then
 fi
 fi
 
 
 # Validate and check-update command.
 # Validate and check-update command.
-if [ "${appid}" ]||[ "${shortname}" == "ts3" ]; then
+if [ "${appid}" ] || [ "${shortname}" == "ts3" ]; then
 	currentopt+=("${cmd_validate[@]}" "${cmd_check_update[@]}")
 	currentopt+=("${cmd_validate[@]}" "${cmd_check_update[@]}")
 fi
 fi
 
 

+ 8 - 0
lgsm/functions/fix_bt.sh

@@ -14,3 +14,11 @@ if [ ! -d "${XDG_DATA_HOME:="${HOME}/.local/share"}/Daedalic Entertainment GmbH/
 	mkdir -p "${XDG_DATA_HOME:="${HOME}/.local/share"}/Daedalic Entertainment GmbH/Barotrauma"
 	mkdir -p "${XDG_DATA_HOME:="${HOME}/.local/share"}/Daedalic Entertainment GmbH/Barotrauma"
 	fn_fix_msg_end
 	fn_fix_msg_end
 fi
 fi
+
+# check if startscript is with windows line endings and reformat it
+if file -b "${serverfiles}${executable:1}" | grep -q CRLF; then
+	fixname="Convert ${executable:2} to unix file format"
+	fn_fix_msg_start
+	dos2unix -q "${serverfiles}${executable:1}"
+	fn_fix_msg_end
+fi

+ 5 - 5
lgsm/functions/fix_lo.sh

@@ -6,12 +6,12 @@
 
 
 functionselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")"
 functionselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")"
 
 
-local APPID_FILE=${executabledir}/steam_appid.txt
-if [ ! -f "${APPID_FILE}" ]; then
-	fn_print_information "adding ${APPID_FILE} to ${gamename} server."
+appidfile=${executabledir}/steam_appid.txt
+if [ ! -f "${appidfile}" ]; then
+	fn_print_information "adding ${appidfile} to ${gamename} server."
 	fn_sleep_time
 	fn_sleep_time
-	echo "903950" > "${APPID_FILE}"
+	echo "903950" > "${appidfile}"
 else
 else
-	fn_print_information "${APPID_FILE} already exists. No action to be taken."
+	fn_print_information "${appidfile} already exists. No action to be taken."
 	fn_sleep_time
 	fn_sleep_time
 fi
 fi

+ 15 - 1
lgsm/functions/fix_vh.sh

@@ -8,14 +8,28 @@ functionselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")"
 
 
 export LD_LIBRARY_PATH=./linux64:$LD_LIBRARY_PATH
 export LD_LIBRARY_PATH=./linux64:$LD_LIBRARY_PATH
 
 
-# special check if Valheim Plus is installed
 modsdir="${lgsmdir}/mods"
 modsdir="${lgsmdir}/mods"
 modsinstalledlistfullpath="${modsdir}/installed-mods.txt"
 modsinstalledlistfullpath="${modsdir}/installed-mods.txt"
 if [ -f "${modsinstalledlistfullpath}" ]; then
 if [ -f "${modsinstalledlistfullpath}" ]; then
+	# special check if Valheim Plus is installed
 	if grep -qE "^valheimplus" "${modsinstalledlistfullpath}"; then
 	if grep -qE "^valheimplus" "${modsinstalledlistfullpath}"; then
 		if ! grep -qE "^executable=\"./start_server_bepinex.sh\"" "${configdirserver}/${selfname}.cfg"; then
 		if ! grep -qE "^executable=\"./start_server_bepinex.sh\"" "${configdirserver}/${selfname}.cfg"; then
 			echo 'executable="./start_server_bepinex.sh"' >> "${configdirserver}/${selfname}.cfg"
 			echo 'executable="./start_server_bepinex.sh"' >> "${configdirserver}/${selfname}.cfg"
 			executable="./start_server_bepinex.sh"
 			executable="./start_server_bepinex.sh"
 		fi
 		fi
 	fi
 	fi
+	# special exports for BepInEx if installed
+	if grep -qE "^bepinexvh" "${modsinstalledlistfullpath}"; then
+		fn_print_info_nl "BepInEx install detected, applying start exports"
+		fn_script_log_info "BepInEx install detected, applying start exports"
+		# exports for BepInEx framework from script start_server_bepinex.sh
+		export DOORSTOP_ENABLE=TRUE
+		export DOORSTOP_INVOKE_DLL_PATH=./BepInEx/core/BepInEx.Preloader.dll
+		export DOORSTOP_CORLIB_OVERRIDE_PATH=./unstripped_corlib
+
+		export LD_LIBRARY_PATH="./doorstop_libs:${LD_LIBRARY_PATH}"
+		export LD_PRELOAD="libdoorstop_x64.so:${LD_PRELOAD}"
+
+		export SteamAppId=892970
+	fi
 fi
 fi

+ 86 - 53
lgsm/functions/info_game.sh

@@ -17,24 +17,24 @@ functionselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")"
 fn_info_game_ac() {
 fn_info_game_ac() {
 	# Config
 	# Config
 	if [ ! -f "${servercfgfullpath}" ]; then
 	if [ ! -f "${servercfgfullpath}" ]; then
+		adminpassword="${unavailable}"
 		httpport="${zero}"
 		httpport="${zero}"
 		port="${zero}"
 		port="${zero}"
 		queryport="${zero}"
 		queryport="${zero}"
 		servername="${unavailable}"
 		servername="${unavailable}"
-		adminpassword="${unavailable}"
 	else
 	else
+		adminpassword=$(grep "ADMIN_PASSWORD" "${servercfgfullpath}" | sed -e 's/^[ \t]*//g' -e '/^\//d' -e 's/ADMIN_PASSWORD//g' | tr -d '=\";,:' | sed -e 's/^[ \t]*//' -e 's/[ \t]*$//')
 		httpport=$(grep "HTTP_PORT" "${servercfgfullpath}" | tr -cd '[:digit:]')
 		httpport=$(grep "HTTP_PORT" "${servercfgfullpath}" | tr -cd '[:digit:]')
 		port=$(grep "TCP_PORT" "${servercfgfullpath}" | tr -cd '[:digit:]')
 		port=$(grep "TCP_PORT" "${servercfgfullpath}" | tr -cd '[:digit:]')
 		queryport="${httpport}"
 		queryport="${httpport}"
 		servername=$(grep "NAME" "${servercfgfullpath}" | sed -e 's/^[ \t]*//g' -e '/^\//d' -e 's/NAME//g' | tr -d '=\";,:' | sed -e 's/^[ \t]*//' -e 's/[ \t]*$//' | head -n 1)
 		servername=$(grep "NAME" "${servercfgfullpath}" | sed -e 's/^[ \t]*//g' -e '/^\//d' -e 's/NAME//g' | tr -d '=\";,:' | sed -e 's/^[ \t]*//' -e 's/[ \t]*$//' | head -n 1)
-		adminpassword=$(grep "ADMIN_PASSWORD" "${servercfgfullpath}" | sed -e 's/^[ \t]*//g' -e '/^\//d' -e 's/ADMIN_PASSWORD//g' | tr -d '=\";,:' | sed -e 's/^[ \t]*//' -e 's/[ \t]*$//')
 
 
 		# Not set
 		# Not set
+		adminpassword=${adminpassword:-"NOT SET"}
 		httpport=${httpport:-"0"}
 		httpport=${httpport:-"0"}
 		port=${port:-"0"}
 		port=${port:-"0"}
 		queryport=${queryport:-"0"}
 		queryport=${queryport:-"0"}
 		servername=${servername:-"NOT SET"}
 		servername=${servername:-"NOT SET"}
-		adminpassword=${adminpassword:-"NOT SET"}
 
 
 	fi
 	fi
 }
 }
@@ -42,67 +42,74 @@ fn_info_game_ac() {
 fn_info_game_ark() {
 fn_info_game_ark() {
 	# Config
 	# Config
 	if [ ! -f "${servercfgfullpath}" ]; then
 	if [ ! -f "${servercfgfullpath}" ]; then
-		servername="${unavailable}"
 		adminpassword="${unavailable}"
 		adminpassword="${unavailable}"
+		servername="${unavailable}"
 		serverpassword="${unavailable}"
 		serverpassword="${unavailable}"
 	else
 	else
-		servername=$(sed -nr 's/^SessionName=(.*)/\1/p' "${servercfgfullpath}")
 		adminpassword=$(sed -nr 's/^ServerAdminPassword=(.*)/\1/p' "${servercfgfullpath}")
 		adminpassword=$(sed -nr 's/^ServerAdminPassword=(.*)/\1/p' "${servercfgfullpath}")
+		servername=$(sed -nr 's/^SessionName=(.*)/\1/p' "${servercfgfullpath}")
 		serverpassword=$(sed -nr 's/^ServerPassword=(.*)/\1/p' "${servercfgfullpath}")
 		serverpassword=$(sed -nr 's/^ServerPassword=(.*)/\1/p' "${servercfgfullpath}")
 
 
 		# Not set
 		# Not set
-		servername=${servername:-"NOT SET"}
 		adminpassword=${adminpassword:-"NOT SET"}
 		adminpassword=${adminpassword:-"NOT SET"}
+		servername=${servername:-"NOT SET"}
 		serverpassword=${serverpassword:-"NOT SET"}
 		serverpassword=${serverpassword:-"NOT SET"}
 	fi
 	fi
 
 
 	# Parameters
 	# Parameters
+	maxplayers=${maxplayers:-"0"}
 	port=${port:-"0"}
 	port=${port:-"0"}
 	queryport=${queryport:-"0"}
 	queryport=${queryport:-"0"}
-	rconport=${rconport:-"0"}
 	rawport=$((port + 1))
 	rawport=$((port + 1))
-	maxplayers=${maxplayers:-"0"}
+	rconport=${rconport:-"0"}
 }
 }
 
 
 fn_info_game_arma3() {
 fn_info_game_arma3() {
 	# Config
 	# Config
 	if [ ! -f "${servercfgfullpath}" ]; then
 	if [ ! -f "${servercfgfullpath}" ]; then
-		servername="${unavailable}"
 		adminpassword="${unavailable}"
 		adminpassword="${unavailable}"
-		serverpassword="${unavailable}"
 		maxplayers="${zero}"
 		maxplayers="${zero}"
+		servername="${unavailable}"
+		serverpassword="${unavailable}"
 	else
 	else
-		servername=$(sed -nr 's/^hostname\s*=\s*"(.*)"\s*;/\1/p' "${servercfgfullpath}")
 		adminpassword=$(sed -nr 's/^passwordAdmin\s*=\s*"(.*)"\s*;/\1/p' "${servercfgfullpath}")
 		adminpassword=$(sed -nr 's/^passwordAdmin\s*=\s*"(.*)"\s*;/\1/p' "${servercfgfullpath}")
-		serverpassword=$(sed -nr 's/^password\s*=\s*"(.*)"\s*;/\1/p' "${servercfgfullpath}")
 		maxplayers=$(sed -nr 's/^maxPlayers\s*=\s*([0-9]+)\s*;/\1/p' "${servercfgfullpath}")
 		maxplayers=$(sed -nr 's/^maxPlayers\s*=\s*([0-9]+)\s*;/\1/p' "${servercfgfullpath}")
+		servername=$(sed -nr 's/^hostname\s*=\s*"(.*)"\s*;/\1/p' "${servercfgfullpath}")
+		serverpassword=$(sed -nr 's/^password\s*=\s*"(.*)"\s*;/\1/p' "${servercfgfullpath}")
 
 
 		# Not set
 		# Not set
-		servername=${servername:-"NOT SET"}
 		adminpassword=${adminpassword:-"NOT SET"}
 		adminpassword=${adminpassword:-"NOT SET"}
-		serverpassword=${serverpassword:-"NOT SET"}
 		maxplayers=${maxplayers:-"0"}
 		maxplayers=${maxplayers:-"0"}
+		servername=${servername:-"NOT SET"}
+		serverpassword=${serverpassword:-"NOT SET"}
 	fi
 	fi
 
 
 	# Parameters
 	# Parameters
+	battleeyeport=$((port + 4))
 	port=${port:-"2302"}
 	port=${port:-"2302"}
-	voiceport=${port:-"2302"}
 	queryport=$((port + 1))
 	queryport=$((port + 1))
 	steammasterport=$((port + 2))
 	steammasterport=$((port + 2))
+	voiceport=${port:-"2302"}
 	voiceunusedport=$((port + 3))
 	voiceunusedport=$((port + 3))
-	battleeyeport=$((port + 4))
 }
 }
 
 
 fn_info_game_armar() {
 fn_info_game_armar() {
-	if [ -f "${servercfgfullpath}" ]; then
+	if [ ! -f "${servercfgfullpath}" ]; then
+		adminpassword="${unavailable}"
+		maxplayers="${zero}"
+		port=${port:-"0"}
+		queryport=
+		servername="${unavailable}"
+		serverpassword="${unavailable}"
+	else
 		adminpassword=$(jq -r '.adminPassword' "${servercfgfullpath}")
 		adminpassword=$(jq -r '.adminPassword' "${servercfgfullpath}")
+		battleeyeport=1376
 		configip=$(jq -r '.gameHostBindAddress' "${servercfgfullpath}")
 		configip=$(jq -r '.gameHostBindAddress' "${servercfgfullpath}")
 		maxplayers=$(jq -r '.game.playerCountLimit' "${servercfgfullpath}")
 		maxplayers=$(jq -r '.game.playerCountLimit' "${servercfgfullpath}")
 		port=$(jq -r '.gameHostBindPort' "${servercfgfullpath}")
 		port=$(jq -r '.gameHostBindPort' "${servercfgfullpath}")
 		queryport=$(jq -r '.steamQueryPort' "${servercfgfullpath}")
 		queryport=$(jq -r '.steamQueryPort' "${servercfgfullpath}")
 		servername=$(jq -r '.game.name' "${servercfgfullpath}")
 		servername=$(jq -r '.game.name' "${servercfgfullpath}")
 		serverpassword=$(jq -r '.game.password' "${servercfgfullpath}")
 		serverpassword=$(jq -r '.game.password' "${servercfgfullpath}")
-		battleeyeport=1376
 
 
 		# Not set
 		# Not set
 		adminpassword=${adminpassword:-"NOT SET"}
 		adminpassword=${adminpassword:-"NOT SET"}
@@ -112,10 +119,6 @@ fn_info_game_armar() {
 		queryport=${queryport:-"0"}
 		queryport=${queryport:-"0"}
 		servername=${servername:-"NOT SET"}
 		servername=${servername:-"NOT SET"}
 		serverpassword=${serverpassword:-"NOT SET"}
 		serverpassword=${serverpassword:-"NOT SET"}
-	else
-		port=${port:-"0"}
-		servername="${unavailable}"
-		serverpassword="${unavailable}"
 	fi
 	fi
 }
 }
 
 
@@ -148,7 +151,7 @@ fn_info_game_av() {
 		fi
 		fi
 
 
 		# Not set
 		# Not set
-		maxplayers=${maxplayers:-"NOT SET"}
+		maxplayers=${maxplayers:-"0"}
 		servername=${servername:-"NOT SET"}
 		servername=${servername:-"NOT SET"}
 		serverpassword=${serverpassword:-"NOT SET"}
 		serverpassword=${serverpassword:-"NOT SET"}
 		port=${port:-"0"}
 		port=${port:-"0"}
@@ -233,7 +236,7 @@ fn_info_game_bo() {
 		serverpassword=${serverpassword:-"NOT SET"}
 		serverpassword=${serverpassword:-"NOT SET"}
 		port=${port:-"0"}
 		port=${port:-"0"}
 		queryport=${queryport:-"0"}
 		queryport=${queryport:-"0"}
-		maxplayers=${maxplayers:-"NOT SET"}
+		maxplayers=${maxplayers:-"0"}
 	fi
 	fi
 }
 }
 
 
@@ -477,7 +480,7 @@ fn_info_game_dodr() {
 		maxplayers=$(sed -nr 's/^iServerMaxPlayers=(.*)$/\1/p' "${servercfgfullpath}")
 		maxplayers=$(sed -nr 's/^iServerMaxPlayers=(.*)$/\1/p' "${servercfgfullpath}")
 
 
 		# Not set
 		# Not set
-		maxplayers=${maxplayers:-"NOT SET"}
+		maxplayers=${maxplayers:-"0"}
 	fi
 	fi
 
 
 	# Parameters
 	# Parameters
@@ -907,7 +910,7 @@ fn_info_game_mc() {
 		servername=${servername:-"NOT SET"}
 		servername=${servername:-"NOT SET"}
 		rconpassword=${rconpassword:-"NOT SET"}
 		rconpassword=${rconpassword:-"NOT SET"}
 		rconport=${rconport:-"NOT SET"}
 		rconport=${rconport:-"NOT SET"}
-		maxplayers=${maxplayers:-"NOT SET"}
+		maxplayers=${maxplayers:-"0"}
 		port=${port:-"NOT SET"}
 		port=${port:-"NOT SET"}
 		queryport=${queryport:-"NOT SET"}
 		queryport=${queryport:-"NOT SET"}
 		queryenabled="${queryenabled:-"NOT SET"}"
 		queryenabled="${queryenabled:-"NOT SET"}"
@@ -938,7 +941,7 @@ fn_info_game_mcb() {
 
 
 		# Not set
 		# Not set
 		servername=${servername:-"NOT SET"}
 		servername=${servername:-"NOT SET"}
-		maxplayers=${maxplayers:-"NOT SET"}
+		maxplayers=${maxplayers:-"0"}
 		port=${port:-"NOT SET"}
 		port=${port:-"NOT SET"}
 		portipv6=${portipv6:-"NOT SET"}
 		portipv6=${portipv6:-"NOT SET"}
 		queryport=${queryport:-"NOT SET"}
 		queryport=${queryport:-"NOT SET"}
@@ -1004,7 +1007,7 @@ fn_info_game_mom() {
 	if [ ! -f "${servercfgfullpath}" ]; then
 	if [ ! -f "${servercfgfullpath}" ]; then
 		servername="${unavailable}"
 		servername="${unavailable}"
 		serverpassword="${unavailable}"
 		serverpassword="${unavailable}"
-		maxplayer="${zero}"
+		maxplayers="${zero}"
 		defaultmap="${unavailable}"
 		defaultmap="${unavailable}"
 	else
 	else
 		servername=$(grep "ServerName" "${servercfgfullpath}" | sed -e 's/^[ \t]*//g' -e '/^--/d' -e 's/ServerName//g' | tr -d '=\";,:' | sed -e 's/^[ \t]*//' -e 's/[ \t]*$//')
 		servername=$(grep "ServerName" "${servercfgfullpath}" | sed -e 's/^[ \t]*//g' -e '/^--/d' -e 's/ServerName//g' | tr -d '=\";,:' | sed -e 's/^[ \t]*//' -e 's/[ \t]*$//')
@@ -1015,7 +1018,7 @@ fn_info_game_mom() {
 		# Not set
 		# Not set
 		servername=${servername:-"NOT SET"}
 		servername=${servername:-"NOT SET"}
 		serverpassword=${serverpassword:-"NOT SET"}
 		serverpassword=${serverpassword:-"NOT SET"}
-		maxplayer=${maxplayers:-"NOT SET"}
+		maxplayers=${maxplayers:-"0"}
 		defaultmap=${defaultmap:-"NOT SET"}
 		defaultmap=${defaultmap:-"NOT SET"}
 	fi
 	fi
 
 
@@ -1079,6 +1082,26 @@ fn_info_game_mumble() {
 	fi
 	fi
 }
 }
 
 
+fn_info_game_nec() {
+	# Config
+	if [ ! -f "${servercfgfullpath}" ]; then
+		maxplayers=${maxplayers:-"0"}
+		port=${port:-"0"}
+		servername="Necesse"
+		serverpassword="${unavailable}"
+	else
+		maxplayers=$(grep "slots" "${servercfgfullpath}" | cut -f1 -d "/" | tr -cd '[:digit:]')
+		port=$(grep "port" "${servercfgfullpath}" | cut -f1 -d "/" | tr -cd '[:digit:]')
+		serverpassword=$(grep "password" "${servercfgfullpath}" | cut -f1 -d "/" | tr -cd '[:digit:]')
+
+		# Not set
+		maxplayers=${maxplayers:-"0"}
+		port=${port:-"0"}
+		servername="Necesse Port ${port}"
+		serverpassword=${serverpassword:-"NOT SET"}
+	fi
+}
+
 fn_info_game_onset() {
 fn_info_game_onset() {
 	# Config
 	# Config
 	if [ ! -f "${servercfgfullpath}" ]; then
 	if [ ! -f "${servercfgfullpath}" ]; then
@@ -1096,7 +1119,7 @@ fn_info_game_onset() {
 
 
 		# Not set
 		# Not set
 		servername=${servername:-"NOT SET"}
 		servername=${servername:-"NOT SET"}
-		maxplayers=${maxplayers:-"NOT SET"}
+		maxplayers=${maxplayers:-"0"}
 		port=${port:-"NOT SET"}
 		port=${port:-"NOT SET"}
 		httpport=${httpport:-"NOT SET"}
 		httpport=${httpport:-"NOT SET"}
 		queryport=${queryport:-"NOT SET"}
 		queryport=${queryport:-"NOT SET"}
@@ -1123,7 +1146,7 @@ fn_info_game_pc() {
 		# Not set
 		# Not set
 		servername=${servername:-"NOT SET"}
 		servername=${servername:-"NOT SET"}
 		serverpassword=${serverpassword:-"NOT SET"}
 		serverpassword=${serverpassword:-"NOT SET"}
-		maxplayers=${maxplayers:-"NOT SET"}
+		maxplayers=${maxplayers:-"0"}
 		port=${port:-"NOT SET"}
 		port=${port:-"NOT SET"}
 		queryport=${queryport:-"NOT SET"}
 		queryport=${queryport:-"NOT SET"}
 		steamport=${steamport:-"NOT SET"}
 		steamport=${steamport:-"NOT SET"}
@@ -1150,7 +1173,7 @@ fn_info_game_pc2() {
 		# Not set
 		# Not set
 		servername=${servername:-"NOT SET"}
 		servername=${servername:-"NOT SET"}
 		serverpassword=${serverpassword:-"NOT SET"}
 		serverpassword=${serverpassword:-"NOT SET"}
-		maxplayers=${maxplayers:-"NOT SET"}
+		maxplayers=${maxplayers:-"0"}
 		port=${port:-"NOT SET"}
 		port=${port:-"NOT SET"}
 		queryport=${queryport:-"NOT SET"}
 		queryport=${queryport:-"NOT SET"}
 		steamport=${steamport:-"NOT SET"}
 		steamport=${steamport:-"NOT SET"}
@@ -1439,7 +1462,7 @@ fn_info_game_rust() {
 	# Parameters
 	# Parameters
 	servername=${servername:-"NOT SET"}
 	servername=${servername:-"NOT SET"}
 	port=${port:-"0"}
 	port=${port:-"0"}
-	queryport=${port:-"0"}
+	queryport=${queryport:-"0"}
 	appport=${appport:-"0"}
 	appport=${appport:-"0"}
 	rconport=${rconport:-"0"}
 	rconport=${rconport:-"0"}
 	gamemode=${gamemode:-"NOT SET"}
 	gamemode=${gamemode:-"NOT SET"}
@@ -1491,7 +1514,7 @@ fn_info_game_rw() {
 		serverpassword=${serverpassword:-"NOT SET"}
 		serverpassword=${serverpassword:-"NOT SET"}
 		rconpassword=${rconpassword:-"NOT SET"}
 		rconpassword=${rconpassword:-"NOT SET"}
 		rconport=${rconport:-"NOT SET"}
 		rconport=${rconport:-"NOT SET"}
-		maxplayers=${maxplayers:-"NOT SET"}
+		maxplayers=${maxplayers:-"0"}
 		port=${port:-"0"}
 		port=${port:-"0"}
 		port2=${port2:-"0"}
 		port2=${port2:-"0"}
 		port3=${port3:-"0"}
 		port3=${port3:-"0"}
@@ -1588,18 +1611,18 @@ fn_info_game_sbots() {
 
 
 fn_info_game_scpsl() {
 fn_info_game_scpsl() {
 	# Config
 	# Config
-	if [ -f "${servercfgfullpath}" ]; then
-		servername=$(sed -nr 's/^server_name: (.*)$/\1/p' "${servercfgfullpath}")
-		maxplayers=$(sed -nr 's/^max_players: (.*)$/\1/p' "${servercfgfullpath}")
-		configip=$(sed -nr 's/^ipv4_bind_ip: (.*)$/\1/p' "${servercfgfullpath}")
-		tickrate=$(sed -nr 's/^server_tickrate: (.*)$/\1/p' "${servercfgfullpath}")
-		adminpassword=$(sed -nr 's/^administrator_query_password: (.*)$/\1/p' "${servercfgfullpath}")
-	else
+	if [ ! -f "${servercfgfullpath}" ]; then
 		servername=${servername:-"NOT SET"}
 		servername=${servername:-"NOT SET"}
 		maxplayers=${maxplayers:-"0"}
 		maxplayers=${maxplayers:-"0"}
 		configip=${configip:-"0.0.0.0"}
 		configip=${configip:-"0.0.0.0"}
 		tickrate=${tickrate:-"NOT SET"}
 		tickrate=${tickrate:-"NOT SET"}
 		adminpassword=${adminpassword:-"NOT SET"}
 		adminpassword=${adminpassword:-"NOT SET"}
+	else
+		servername=$(sed -nr 's/^server_name: (.*)$/\1/p' "${servercfgfullpath}")
+		maxplayers=$(sed -nr 's/^max_players: (.*)$/\1/p' "${servercfgfullpath}")
+		configip=$(sed -nr 's/^ipv4_bind_ip: (.*)$/\1/p' "${servercfgfullpath}")
+		tickrate=$(sed -nr 's/^server_tickrate: (.*)$/\1/p' "${servercfgfullpath}")
+		adminpassword=$(sed -nr 's/^administrator_query_password: (.*)$/\1/p' "${servercfgfullpath}")
 	fi
 	fi
 
 
 	# Parameters
 	# Parameters
@@ -1657,7 +1680,7 @@ fn_info_game_sdtd() {
 		telnetenabled=${telnetenabled:-"NOT SET"}
 		telnetenabled=${telnetenabled:-"NOT SET"}
 		telnetport=${telnetport:-"0"}
 		telnetport=${telnetport:-"0"}
 		telnetpass=${telnetpass:-"NOT SET"}
 		telnetpass=${telnetpass:-"NOT SET"}
-		maxplayers=${maxplayers:-"NOT SET"}
+		maxplayers=${maxplayers:-"0"}
 		gamemode=${gamemode:-"NOT SET"}
 		gamemode=${gamemode:-"NOT SET"}
 		gameworld=${gameworld:-"NOT SET"}
 		gameworld=${gameworld:-"NOT SET"}
 	fi
 	fi
@@ -1858,7 +1881,13 @@ fn_info_game_terraria() {
 
 
 fn_info_game_stn() {
 fn_info_game_stn() {
 	# Config
 	# Config
-	if [ -f "${servercfgfullpath}" ]; then
+	if [ ! -f "${servercfgfullpath}" ]; then
+		servername="${unavailable}"
+		configip=${configip:-"0.0.0.0"}
+		port="${zero}"
+		queryport="${zero}"
+		serverpassword=${serverpassword:-"NOT SET"}
+	else
 		servername=$(sed -nr 's/^ServerName="(.*)"/\1/p' "${servercfgfullpath}")
 		servername=$(sed -nr 's/^ServerName="(.*)"/\1/p' "${servercfgfullpath}")
 		configip=$(sed -nr 's/^ServerIP=([0-9]+)/\1/p' "${servercfgfullpath}")
 		configip=$(sed -nr 's/^ServerIP=([0-9]+)/\1/p' "${servercfgfullpath}")
 		port=$(sed -nr 's/^ServerPort=([0-9]+)/\1/p' "${servercfgfullpath}")
 		port=$(sed -nr 's/^ServerPort=([0-9]+)/\1/p' "${servercfgfullpath}")
@@ -1867,23 +1896,25 @@ fn_info_game_stn() {
 
 
 		# Not set
 		# Not set
 		serverpassword=${serverpassword:-"NOT SET"}
 		serverpassword=${serverpassword:-"NOT SET"}
-	else
-		servername="${unavailable}"
-		configip=${configip:-"0.0.0.0"}
-		port="${zero}"
-		queryport="${zero}"
+		port=${port:-"0"}
 		serverpassword=${serverpassword:-"NOT SET"}
 		serverpassword=${serverpassword:-"NOT SET"}
+		queryport=${queryport:-"0"}
 	fi
 	fi
 }
 }
 
 
 fn_info_game_ti() {
 fn_info_game_ti() {
-	if [ -f "${servercfgfullpath}" ]; then
-		servername=$(sed -nr 's/^ServerName="(.*)"/\1/p' "${servercfgfullpath}")
-		maxplayers=$(sed -nr 's/^MaxPlayerCount=([0-9]+)/\1/' "${servercfgfullpath}")
-	else
+	if [ ! -f "${servercfgfullpath}" ]; then
 		servername="${unavailable}"
 		servername="${unavailable}"
 		maxplayers="${zero}"
 		maxplayers="${zero}"
+	else
+		servername=$(sed -nr 's/^ServerName="(.*)"/\1/p' "${servercfgfullpath}")
+		maxplayers=$(sed -nr 's/^MaxPlayerCount=([0-9]+)/\1/' "${servercfgfullpath}")
+
+		# Not set
+		servername=${servername:-"NOT SET"}
+		maxplayers=${maxplayers:-"0"}
 	fi
 	fi
+
 }
 }
 
 
 fn_info_game_ts3() {
 fn_info_game_ts3() {
@@ -2145,7 +2176,7 @@ fn_info_game_ut3() {
 		servername=${servername:-"NOT SET"}
 		servername=${servername:-"NOT SET"}
 		serverpassword=${serverpassword:-"NOT SET"}
 		serverpassword=${serverpassword:-"NOT SET"}
 		adminpassword=${adminpassword:-"NOT SET"}
 		adminpassword=${adminpassword:-"NOT SET"}
-		maxplayers=${maxplayers:-"NOT SET"}
+		maxplayers=${maxplayers:-"0"}
 		webadminenabled=${webadminenabled:-"NOT SET"}
 		webadminenabled=${webadminenabled:-"NOT SET"}
 		webadminport=${webadminport:-"0"}
 		webadminport=${webadminport:-"0"}
 		webadminuser=${webadminuser:-"NOT SET"}
 		webadminuser=${webadminuser:-"NOT SET"}
@@ -2396,6 +2427,8 @@ elif [ "${shortname}" == "mta" ]; then
 	fn_info_game_mta
 	fn_info_game_mta
 elif [ "${shortname}" == "mumble" ]; then
 elif [ "${shortname}" == "mumble" ]; then
 	fn_info_game_mumble
 	fn_info_game_mumble
+elif [ "${shortname}" == "nec" ]; then
+	fn_info_game_nec
 elif [ "${shortname}" == "onset" ]; then
 elif [ "${shortname}" == "onset" ]; then
 	fn_info_game_onset
 	fn_info_game_onset
 elif [ "${shortname}" == "pc" ]; then
 elif [ "${shortname}" == "pc" ]; then

+ 13 - 4
lgsm/functions/info_messages.sh

@@ -658,7 +658,7 @@ fn_info_message_ports_edit() {
 
 
 	startparameterslocation="${red}UNKNOWN${default}"
 	startparameterslocation="${red}UNKNOWN${default}"
 	# engines/games that require editing in the config file.
 	# engines/games that require editing in the config file.
-	local ports_edit_array=("ac" "arma3" "armar" "bo" "bt" "cd" "dst" "eco" "idtech2" "idtech3" "idtech3_ql" "jc2" "jc3" "lwjgl2" "mcb" "mumble" "pc" "pc2" "pz" "qw" "refractor" "renderware" "rw" "sb" "sdtd" "st" "stn" "ts3" "tw" "terraria" "unreal" "unreal2" "unreal3" "vints" "wurm")
+	local ports_edit_array=("ac" "arma3" "armar" "bo" "bt" "cd" "dst" "eco" "idtech2" "idtech3" "idtech3_ql" "jc2" "jc3" "lwjgl2" "mcb" "mumble" "nec" "pc" "pc2" "pz" "qw" "refractor" "renderware" "rw" "sb" "sdtd" "st" "stn" "ts3" "tw" "terraria" "unreal" "unreal2" "unreal3" "vints" "wurm")
 	for port_edit in "${ports_edit_array[@]}"; do
 	for port_edit in "${ports_edit_array[@]}"; do
 		if [ "${shortname}" == "ut3" ]; then
 		if [ "${shortname}" == "ut3" ]; then
 			startparameterslocation="${servercfgdir}/UTWeb.ini"
 			startparameterslocation="${servercfgdir}/UTWeb.ini"
@@ -687,7 +687,7 @@ fn_info_message_ports() {
 		echo -e "ss -tuplwn | grep AvorionServer"
 		echo -e "ss -tuplwn | grep AvorionServer"
 	elif [ "${shortname}" == "bf1942" ]; then
 	elif [ "${shortname}" == "bf1942" ]; then
 		echo -e "ss -tuplwn | grep bf1942_lnxded"
 		echo -e "ss -tuplwn | grep bf1942_lnxded"
-	elif [ "${shortname}" == "mc" ] || [ "${shortname}" == "pmc" ] || [ "${shortname}" == "rw" ] || [ "${shortname}" == "vpmc" ] || [ "${shortname}" == "wmc" ]; then
+	elif [ "${shortname}" == "mc" ] || [ "${shortname}" == "nec" ] || [ "${shortname}" == "pmc" ] || [ "${shortname}" == "rw" ] || [ "${shortname}" == "vpmc" ] || [ "${shortname}" == "wmc" ]; then
 		echo -e "ss -tuplwn | grep java"
 		echo -e "ss -tuplwn | grep java"
 	elif [ "${shortname}" == "terraria" ]; then
 	elif [ "${shortname}" == "terraria" ]; then
 		echo -e "ss -tuplwn | grep Main"
 		echo -e "ss -tuplwn | grep Main"
@@ -1171,6 +1171,13 @@ fn_info_message_mumble() {
 	} | column -s $'\t' -t
 	} | column -s $'\t' -t
 }
 }
 
 
+fn_info_message_nec() {
+	{
+		fn_port "header"
+		fn_port "Game" port udp
+	} | column -s $'\t' -t
+}
+
 fn_info_message_onset() {
 fn_info_message_onset() {
 	{
 	{
 		fn_port "header"
 		fn_port "header"
@@ -1727,12 +1734,14 @@ fn_info_message_select_engine() {
 		fn_info_message_mh
 		fn_info_message_mh
 	elif [ "${shortname}" == "mohaa" ]; then
 	elif [ "${shortname}" == "mohaa" ]; then
 		fn_info_message_mohaa
 		fn_info_message_mohaa
+	elif [ "${shortname}" == "mom" ]; then
+		fn_info_message_mom
 	elif [ "${shortname}" == "mta" ]; then
 	elif [ "${shortname}" == "mta" ]; then
 		fn_info_message_mta
 		fn_info_message_mta
 	elif [ "${shortname}" == "mumble" ]; then
 	elif [ "${shortname}" == "mumble" ]; then
 		fn_info_message_mumble
 		fn_info_message_mumble
-	elif [ "${shortname}" == "mom" ]; then
-		fn_info_message_mom
+	elif [ "${shortname}" == "nec" ]; then
+		fn_info_message_nec
 	elif [ "${shortname}" == "onset" ]; then
 	elif [ "${shortname}" == "onset" ]; then
 		fn_info_message_onset
 		fn_info_message_onset
 	elif [ "${shortname}" == "pc" ]; then
 	elif [ "${shortname}" == "pc" ]; then

+ 8 - 0
lgsm/functions/install_config.sh

@@ -634,6 +634,14 @@ elif [ "${shortname}" == "pz" ]; then
 	fn_default_config_remote
 	fn_default_config_remote
 	fn_set_config_vars
 	fn_set_config_vars
 	fn_list_config_locations
 	fn_list_config_locations
+elif [ "${shortname}" == "nec" ]; then
+	gamedirname="Necesse"
+	fn_check_cfgdir
+	array_configs+=(server.cfg)
+	fn_fetch_default_config
+	fn_default_config_remote
+	fn_set_config_vars
+	fn_list_config_locations
 elif [ "${shortname}" == "pc" ]; then
 elif [ "${shortname}" == "pc" ]; then
 	gamedirname="ProjectCars"
 	gamedirname="ProjectCars"
 	array_configs+=(server.cfg)
 	array_configs+=(server.cfg)

+ 1 - 1
lgsm/functions/install_server_files.sh

@@ -222,7 +222,7 @@ elif [ "${shortname}" == "mcb" ]; then
 elif [ "${shortname}" == "pmc" ]; then
 elif [ "${shortname}" == "pmc" ]; then
 	install_eula.sh
 	install_eula.sh
 	update_papermc.sh
 	update_papermc.sh
-elif [ "${shortname}" == "wmc" ]||[ "${shortname}" == "vpmc" ]; then
+elif [ "${shortname}" == "wmc" ] || [ "${shortname}" == "vpmc" ]; then
 	update_papermc.sh
 	update_papermc.sh
 elif [ "${shortname}" == "mumble" ]; then
 elif [ "${shortname}" == "mumble" ]; then
 	update_mumble.sh
 	update_mumble.sh

+ 6 - 1
lgsm/functions/mods_list.sh

@@ -95,6 +95,8 @@ oxidehurtworldlatestlink=$(curl --connect-timeout 10 -sL https://api.github.com/
 oxidesdtdlatestlink=$(curl --connect-timeout 10 -sL https://api.github.com/repos/OxideMod/Oxide.SevenDaysToDie/releases/latest | jq -r '.assets[]|select(.browser_download_url | contains("linux")) | .browser_download_url')
 oxidesdtdlatestlink=$(curl --connect-timeout 10 -sL https://api.github.com/repos/OxideMod/Oxide.SevenDaysToDie/releases/latest | jq -r '.assets[]|select(.browser_download_url | contains("linux")) | .browser_download_url')
 # Valheim Plus
 # Valheim Plus
 valeimpluslatestlink=$(curl --connect-timeout 10 -sL https://api.github.com/repos/valheimPlus/ValheimPlus/releases/latest | jq -r '.assets[]|select(.browser_download_url | contains("UnixServer.tar.gz")) | .browser_download_url')
 valeimpluslatestlink=$(curl --connect-timeout 10 -sL https://api.github.com/repos/valheimPlus/ValheimPlus/releases/latest | jq -r '.assets[]|select(.browser_download_url | contains("UnixServer.tar.gz")) | .browser_download_url')
+# Valheim BepInEx
+bepinexvhlatestlink=$(curl --connect-timeout 10 -sL "https://valheim.thunderstore.io/api/experimental/package/denikson/BepInExPack_Valheim/" -H "accept: application/json" | jq -r '.latest.download_url')
 
 
 # Define mods information (required)
 # Define mods information (required)
 
 
@@ -194,5 +196,8 @@ mod_info_sdtdoxide=(MOD "sdtdoxide" "Oxide for 7 Days To Die" "${oxidesdtdlatest
 # ValheimPlus
 # ValheimPlus
 mod_info_valheimplus=(MOD "valheimplus" "Valheim PLUS" "${valeimpluslatestlink}" "ValheimPlus.tar.gz" "0" "LowercaseOff" "${systemdir}" "OVERWRITE" "ENGINES" "Valheim;" "NOTGAMES" "https://github.com/valheimPlus/ValheimPlus" "Mod to improve Valheim gameplay")
 mod_info_valheimplus=(MOD "valheimplus" "Valheim PLUS" "${valeimpluslatestlink}" "ValheimPlus.tar.gz" "0" "LowercaseOff" "${systemdir}" "OVERWRITE" "ENGINES" "Valheim;" "NOTGAMES" "https://github.com/valheimPlus/ValheimPlus" "Mod to improve Valheim gameplay")
 
 
+# BepInEx Valheim
+mod_info_bepinexvh=(MOD "bepinexvh" "BepInEx Valheim" "${bepinexvhlatestlink}" "denikson-BepInExPack_Valheim.zip" "0" "LowercaseOff" "${systemdir}" "OVERWRITE" "ENGINES" "Valheim;" "NOTGAMES" "https://valheim.thunderstore.io/package/denikson/BepInExPack_Valheim/" "Unity / XNA game patcher and plugin framework")
+
 # REQUIRED: Set all mods info into the global array
 # REQUIRED: Set all mods info into the global array
-mods_global_array=("${mod_info_metamod[@]}" "${mod_info_base_amxx[@]}" "${mod_info_cs_amxx[@]}" "${mod_info_dod_amxx[@]}" "${mod_info_tfc_amxx[@]}" "${mod_info_ns_amxx[@]}" "${mod_info_ts_amxx[@]}" "${mod_info_metamodsource[@]}" "${mod_info_sourcemod[@]}" "${mod_info_steamworks[@]}" "${mod_info_gokz[@]}" "${mod_info_ttt[@]}" "${mod_info_get5[@]}" "${mod_info_prac[@]}" "${mod_info_pug[@]}" "${mod_info_dhook[@]}" "${mod_info_movement[@]}" "${mod_info_cleaner[@]}" "${mod_info_ulib[@]}" "${mod_info_ulx[@]}" "${mod_info_utime[@]}" "${mod_info_uclip[@]}" "${mod_info_acf[@]}" "${mod_info_acf_missiles[@]}" "${mod_info_acf_sweps[@]}" "${mod_info_advdupe2[@]}" "${mod_info_pac3[@]}" "${mod_info_wiremod[@]}" "${mod_info_wiremodextras[@]}" "${mod_info_darkrp[@]}" "${mod_info_darkrpmodification[@]}" "${mod_info_rustoxide[@]}" "${mod_info_hwoxide[@]}" "${mod_info_sdtdoxide[@]}" "${mod_info_advduplicator[@]}" "${mod_info_trackassemblytool[@]}" "${mod_info_physpropertiesadv[@]}" "${mod_info_controlsystemse2[@]}" "${mod_info_e2pistontiming[@]}" "${mod_info_propcannontool[@]}" "${mod_info_gearassemblytool[@]}" "${mod_info_spinnertool[@]}" "${mod_info_surfacefrictiontool[@]}" "${mod_info_magneticdipole[@]}" "${mod_info_environmentorganizer[@]}" "${mod_info_precision_alignment[@]}" "${mod_info_improved_stacker[@]}" "${mod_info_improved_weight[@]}" "${mod_info_improved_antinoclip[@]}" "${mod_info_laserstool[@]}" "${mod_info_valheimplus[@]}")
+mods_global_array=("${mod_info_metamod[@]}" "${mod_info_base_amxx[@]}" "${mod_info_cs_amxx[@]}" "${mod_info_dod_amxx[@]}" "${mod_info_tfc_amxx[@]}" "${mod_info_ns_amxx[@]}" "${mod_info_ts_amxx[@]}" "${mod_info_metamodsource[@]}" "${mod_info_sourcemod[@]}" "${mod_info_steamworks[@]}" "${mod_info_gokz[@]}" "${mod_info_ttt[@]}" "${mod_info_get5[@]}" "${mod_info_prac[@]}" "${mod_info_pug[@]}" "${mod_info_dhook[@]}" "${mod_info_movement[@]}" "${mod_info_cleaner[@]}" "${mod_info_ulib[@]}" "${mod_info_ulx[@]}" "${mod_info_utime[@]}" "${mod_info_uclip[@]}" "${mod_info_acf[@]}" "${mod_info_acf_missiles[@]}" "${mod_info_acf_sweps[@]}" "${mod_info_advdupe2[@]}" "${mod_info_pac3[@]}" "${mod_info_wiremod[@]}" "${mod_info_wiremodextras[@]}" "${mod_info_darkrp[@]}" "${mod_info_darkrpmodification[@]}" "${mod_info_rustoxide[@]}" "${mod_info_hwoxide[@]}" "${mod_info_sdtdoxide[@]}" "${mod_info_advduplicator[@]}" "${mod_info_trackassemblytool[@]}" "${mod_info_physpropertiesadv[@]}" "${mod_info_controlsystemse2[@]}" "${mod_info_e2pistontiming[@]}" "${mod_info_propcannontool[@]}" "${mod_info_gearassemblytool[@]}" "${mod_info_spinnertool[@]}" "${mod_info_surfacefrictiontool[@]}" "${mod_info_magneticdipole[@]}" "${mod_info_environmentorganizer[@]}" "${mod_info_precision_alignment[@]}" "${mod_info_improved_stacker[@]}" "${mod_info_improved_weight[@]}" "${mod_info_improved_antinoclip[@]}" "${mod_info_laserstool[@]}" "${mod_info_valheimplus[@]}" "${mod_info_bepinexvh[@]}")

+ 3 - 3
lgsm/functions/update_papermc.sh

@@ -5,9 +5,9 @@
 # Website: https://linuxgsm.com
 # Website: https://linuxgsm.com
 # Description: Handles updating of PaperMC and Waterfall servers.
 # Description: Handles updating of PaperMC and Waterfall servers.
 
 
-local commandname="UPDATE"
-local commandaction="Update"
-local function_selfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")"
+commandname="UPDATE"
+commandaction="Update"
+function_selfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")"
 
 
 fn_update_papermc_dl() {
 fn_update_papermc_dl() {
 	# get build info
 	# get build info

+ 12 - 12
linuxgsm.sh

@@ -15,12 +15,12 @@
 
 
 # Debugging
 # Debugging
 if [ -f ".dev-debug" ]; then
 if [ -f ".dev-debug" ]; then
-	exec 5>dev-debug.log
+	exec 5> dev-debug.log
 	BASH_XTRACEFD="5"
 	BASH_XTRACEFD="5"
 	set -x
 	set -x
 fi
 fi
 
 
-version="v22.2.1"
+version="v23.1.0"
 shortname="core"
 shortname="core"
 gameservername="core"
 gameservername="core"
 commandname="CORE"
 commandname="CORE"
@@ -52,7 +52,7 @@ userinput2="${2}"
 [ -n "${LGSM_GITHUBBRANCH}" ] && githubbranch="${LGSM_GITHUBBRANCH}" || githubbranch="master"
 [ -n "${LGSM_GITHUBBRANCH}" ] && githubbranch="${LGSM_GITHUBBRANCH}" || githubbranch="master"
 
 
 # Check that curl is installed before doing anything
 # Check that curl is installed before doing anything
-if [ ! "$(command -v curl 2>/dev/null)" ]; then
+if [ ! "$(command -v curl 2> /dev/null)" ]; then
 	echo -e "[ FAIL ] Curl is not installed"
 	echo -e "[ FAIL ] Curl is not installed"
 	exit 1
 	exit 1
 fi
 fi
@@ -213,7 +213,7 @@ fn_install_menu_bash() {
 	while read -r line || [[ -n "${line}" ]]; do
 	while read -r line || [[ -n "${line}" ]]; do
 		var=$(echo -e "${line}" | awk -F "," '{print $2 " - " $3}')
 		var=$(echo -e "${line}" | awk -F "," '{print $2 " - " $3}')
 		menu_options+=("${var}")
 		menu_options+=("${var}")
-	done <"${options}"
+	done < "${options}"
 	menu_options+=("Cancel")
 	menu_options+=("Cancel")
 	select option in "${menu_options[@]}"; do
 	select option in "${menu_options[@]}"; do
 		if [ "${option}" ] && [ "${option}" != "Cancel" ]; then
 		if [ "${option}" ] && [ "${option}" != "Cancel" ]; then
@@ -239,7 +239,7 @@ fn_install_menu_whiptail() {
 		key=$(echo -e "${line}" | awk -F "," '{print $3}')
 		key=$(echo -e "${line}" | awk -F "," '{print $3}')
 		val=$(echo -e "${line}" | awk -F "," '{print $2}')
 		val=$(echo -e "${line}" | awk -F "," '{print $2}')
 		menu_options+=("${val//\"/}" "${key//\"/}")
 		menu_options+=("${val//\"/}" "${key//\"/}")
-	done <"${options}"
+	done < "${options}"
 	OPTION=$(${menucmd} --title "${title}" --menu "${caption}" "${height}" "${width}" "${menuheight}" "${menu_options[@]}" 3>&1 1>&2 2>&3)
 	OPTION=$(${menucmd} --title "${title}" --menu "${caption}" "${height}" "${width}" "${menuheight}" "${menu_options[@]}" 3>&1 1>&2 2>&3)
 	if [ $? == 0 ]; then
 	if [ $? == 0 ]; then
 		eval "$resultvar=\"${OPTION}\""
 		eval "$resultvar=\"${OPTION}\""
@@ -263,12 +263,12 @@ fn_install_menu() {
 		fi
 		fi
 	done
 	done
 	case "$(basename "${menucmd}")" in
 	case "$(basename "${menucmd}")" in
-	whiptail | dialog)
-		fn_install_menu_whiptail "${menucmd}" selection "${title}" "${caption}" "${options}" 40 80 30
-		;;
-	*)
-		fn_install_menu_bash selection "${title}" "${caption}" "${options}"
-		;;
+		whiptail | dialog)
+			fn_install_menu_whiptail "${menucmd}" selection "${title}" "${caption}" "${options}" 40 80 30
+			;;
+		*)
+			fn_install_menu_bash selection "${title}" "${caption}" "${options}"
+			;;
 	esac
 	esac
 	eval "$resultvar=\"${selection}\""
 	eval "$resultvar=\"${selection}\""
 }
 }
@@ -351,7 +351,7 @@ if [ "${shortname}" == "core" ]; then
 		} | column -s $'\t' -t | more
 		} | column -s $'\t' -t | more
 		exit
 		exit
 	elif [ "${userinput}" == "install" ] || [ "${userinput}" == "i" ]; then
 	elif [ "${userinput}" == "install" ] || [ "${userinput}" == "i" ]; then
-		tail -n +1 "${serverlist}" | awk -F "," '{print $1 "," $2 "," $3}' >"${serverlistmenu}"
+		tail -n +1 "${serverlist}" | awk -F "," '{print $1 "," $2 "," $3}' > "${serverlistmenu}"
 		fn_install_menu result "LinuxGSM" "Select game server to install." "${serverlistmenu}"
 		fn_install_menu result "LinuxGSM" "Select game server to install." "${serverlistmenu}"
 		userinput="${result}"
 		userinput="${result}"
 		fn_server_info
 		fn_server_info

+ 1 - 1
tests/tests_fctrserver.sh

@@ -20,7 +20,7 @@ if [ -f ".dev-debug" ]; then
 	set -x
 	set -x
 fi
 fi
 
 
-version="v22.2.1"
+version="v23.1.0"
 shortname="fctr"
 shortname="fctr"
 gameservername="fctrserver"
 gameservername="fctrserver"
 commandname="CORE"
 commandname="CORE"

+ 1 - 1
tests/tests_jc2server.sh

@@ -20,7 +20,7 @@ if [ -f ".dev-debug" ]; then
 	set -x
 	set -x
 fi
 fi
 
 
-version="v22.2.1"
+version="v23.1.0"
 shortname="jc2"
 shortname="jc2"
 gameservername="jc2server"
 gameservername="jc2server"
 commandname="CORE"
 commandname="CORE"

+ 1 - 1
tests/tests_mcserver.sh

@@ -20,7 +20,7 @@ if [ -f ".dev-debug" ]; then
 	set -x
 	set -x
 fi
 fi
 
 
-version="v22.2.1"
+version="v23.1.0"
 shortname="mc"
 shortname="mc"
 gameservername="mcserver"
 gameservername="mcserver"
 commandname="CORE"
 commandname="CORE"

+ 1 - 1
tests/tests_ts3server.sh

@@ -20,7 +20,7 @@ if [ -f ".dev-debug" ]; then
 	set -x
 	set -x
 fi
 fi
 
 
-version="v22.2.1"
+version="v23.1.0"
 shortname="ts3"
 shortname="ts3"
 gameservername="ts3server"
 gameservername="ts3server"
 commandname="CORE"
 commandname="CORE"

Algunos archivos no se mostraron porque demasiados archivos cambiaron en este cambio