Browse Source
* feat(tf2c): add Team Fortress 2 Classified server (#4898)
* Release v26.1.0
* fix(alert_slack): add missing closing brace on section object
The 'section' block containing 'fields' and 'accessory' was missing its
closing '}' before EOF, producing malformed JSON and breaking all Slack
alerts silently (jq -c . would fail on the payload).
Also add missing ntfy alert settings to tf2cserver _default.cfg for
consistency with other server configs.
* fix: address review feedback
- core_dl.sh: use array assignment for steamcmdcommand instead of
read -r -a to avoid word-splitting on paths
- fix_st.sh: correct module header typo (fix_ts.sh -> fix_st.sh)
- command_skeleton.sh: fix grammar 'Creates an copy' -> 'Creates a copy'
- serverlist-validate-game-icons.sh: anchor grep to start-of-line and
require trailing comma to prevent false positives (e.g. 'tf' matching
'tf2' entries)
- cs2server/_default.cfg: remove duplicate ntfy alert settings block
* fix(vints): assign remotebuild instead of unused remotebuildversion
The API version lookup was setting remotebuildversion but all subsequent
jq queries used ${remotebuild}, which was never populated. This caused
'Unable to get remote build' on every install/update.
* fix(xnt): unset exitbypass after command_stop.sh in fn_update_localbuild
* fix(ci): resolve super-linter failures
- Set DEFAULT_BRANCH to current branch to fix 'master not found' error
- Use fetch-depth: 0 so GITHUB_BEFORE_SHA can be resolved
- Set update_etl.sh executable bit (BASH_EXEC)
- Fix .codespellrc tab indentation (EDITORCONFIG)
- Add .gitleaks.toml allowlist for GA4 Measurement Protocol API secret (GITLEAKS)
- Fix .markdown-lint.yml: disable MD030/MD013/MD033/MD041/MD051 to match
existing repo style (MARKDOWN)
* chore(ci): upgrade webfactory/ssh-agent from v0.9.0 to v0.10.0
v0.10.0 upgrades from Node.js 20 to Node.js 24, resolving the
deprecation warning ahead of the June 2026 forced migration.
* fix(steamcmd): add libtinfo.so.5 symlink fix for readline warning (#4899)
* fix(steamcmd): add libtinfo.so.5 symlink fix for readline warning
On distros shipping libtinfo.so.6 but not libtinfo.so.5 (Ubuntu 22.04+,
Debian 12+), SteamCMD prints:
WARNING: Failed to load 32-bit libtinfo.so.5 or libncurses.so.5.
Please install (lib32tinfo5 / ncurses-libs.i686 / equivalent) to
enable readline.
lib32tinfo5 does not exist on Ubuntu 24.04. Creating a user-space
symlink inside the steamcmd directory resolves the warning without
requiring root or a missing package.
* fix(steamcmd): address Copilot review feedback on libtinfo symlink fix
- Iterate over all candidate steamcmd dirs (HOME/.steam/steamcmd,
steamcmddir, HOME/.local/share/Steam/steamcmd) matching the pattern
used for steamclient.so fixes elsewhere in the module
- Replace '! -f && ! -L' guard with '! -e' so broken/dangling symlinks
are also repaired rather than silently skipped
- Add mkdir -p before ln in case the directory does not exist yet
- Capture exitcode=$? after ln so fn_fix_msg_end reports failures
---------
Co-authored-by: LinuxGSM <[email protected]>
* feat(newserver): Military Conflict: Vietnam
Add support for the Military Conflict: Vietnam dedicated game server.
Supersedes #4594 (original WIP PR from @knoxed — completing the implementation).
Changes:
- Added mcvserver default configuration
- Added mcv to serverlist and all distro CSV files
- Added install_config handler for mcvserver
- Added dependency info for all distros
- Added game icons
- Fixed CI workflow issues
Co-authored-by: Knoxed <[email protected]>
* fix: support legacy game servers on older Ubuntu/Debian runners (#4903)
* fix(workflows): support legacy game servers on older Ubuntu/Debian runners
Multiple game servers have glibc compatibility requirements that prevent
them from running on Ubuntu 24.04:
- bfv, bf1942: Require Ubuntu <= 22.04 or Debian <= 12 (glibc 2.31)
- btl, onset: Require Ubuntu <= 20.04 or Debian <= 11 (glibc 2.31)
Changes:
- Add runner field to details-check matrix generation
- Map legacy servers to appropriate ubuntu-XX.04 LTS runners
- Modern servers continue on ubuntu-latest (24.04)
- Update details-check.yml to use dynamic runner from matrix
This ensures all server tests pass in CI without breaking modern server
testing on current GitHub Actions runners.
* fix(workflows): run details-check on PRs and normalize ref resolution
Details Check was not running for PR #4903 because the workflow only
triggered on push to develop/workflow_dispatch. Also, pull_request refs
(refs/pull/*) are not valid raw-content refs for GitHub downloads.
Changes:
- Trigger Details Check on pull_request to develop
- Add LGSM_REF env resolved to PR head SHA or branch ref name
- Use LGSM_REF for linuxgsm.sh download and LGSM_GITHUBBRANCH usage
- Use LGSM_REF in matrix generation when fetching serverlist.csv
This ensures legacy server jobs (bfv, bf1942, btl, onset) are included
and executed during PR validation.
* fix(workflows): run update-check on PRs and normalize ref resolution
Apply the same PR-safe workflow behavior used in details-check:
- Trigger update-check on pull_request to develop
- Resolve LGSM_REF to PR head SHA or branch ref name
- Use LGSM_REF for linuxgsm.sh download and LGSM_GITHUBBRANCH calls
This ensures update-check validates PR changes instead of only running on
develop pushes.
* fix(check_deps): avoid false Debian version check on Ubuntu
Ubuntu reports ID_LIKE=debian, which caused Debian upper-version checks to
run on Ubuntu and incorrectly fail legacy titles on Ubuntu 22.04.x.
Use distroid==debian for Debian limits in legacy compatibility guards so:
- bf1942/bfv pass on Ubuntu 22.04.x as intended
- btl/onset limits still apply correctly
- Debian limits still apply on Debian only
* fix(workflows): add PR trigger to version-check; replace archived action in docker trigger
version-check.yml:
- Add pull_request trigger targeting develop so version format is
validated on PRs before merge
trigger-docker-build.yml:
- Replace archived convictional/[email protected] with
native gh CLI approach (trigger + watch run ID)
- Uses GH_TOKEN env var with PERSONAL_ACCESS_TOKEN secret
- gh workflow run dispatches the workflow; gh run watch polls for
completion and exits non-zero on failure, preserving job dependencies
* fix(workflows): use timestamp filter to reliably identify triggered run ID
Using --limit 1 to find the run ID is a race condition if another run
of the same workflow starts concurrently. Capture a timestamp before
dispatching and pass --created >=${before} to gh run list so we
always select the run we just triggered.
* remove pr check
* chore(deps): bump dessant/lock-threads from 5 to 6 (#4864)
Bumps [dessant/lock-threads](https://github.com/dessant/lock-threads) from 5 to 6.
- [Release notes](https://github.com/dessant/lock-threads/releases)
- [Changelog](https://github.com/dessant/lock-threads/blob/main/CHANGELOG.md)
- [Commits](https://github.com/dessant/lock-threads/compare/v5...v6)
---
updated-dependencies:
- dependency-name: dessant/lock-threads
dependency-version: '6'
dependency-type: direct:production
update-type: version-update:semver-major
...
Signed-off-by: dependabot[bot] <[email protected]>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Daniel Gibbs <[email protected]>
* papermc: add OpenJDK-25 (headless) dependency
Dev builds of papermc will not work on older jre, albeit it's still in alpha/beta, some time in the future it will be the stable build. I have not noticed any issues running the stable build with jre-25.
* fix(pmc): use openjdk-25-jre instead of headless variant, update vpmc to java 25
* feat(deps): update Java deps to openjdk-25-jre and add Ubuntu 26.04 support (#4908)
- ubuntu-24.04: update pz, rw, wmc to openjdk-25-jre
- debian-13: update vpmc to openjdk-25-jre, fix wmc typo (openjdk21-jre -> openjdk-25-jre)
- add ubuntu-26.04.csv with all Java deps on openjdk-25-jre
* chore: synced file(s) with dgibbs64/repo-sync (#4904)
* chore: synced local '.github/' with remote 'general/.github/'
* chore: synced local './' with remote 'bash/'
---------
Co-authored-by: unknown <[email protected]>
* fix(jbep3): add distro deps entries and game icon
* feat(bb): add BrainBread server update functionality (#4912)
* feat(bb): add BrainBread server update functionality
* Implemented `update_bb.sh` to handle updates for BrainBread servers.
* Integrated new update checks in `command_check_update.sh` and `command_update.sh`.
* Updated `install_server_files.sh` to include BrainBread server installation logic.
Co-authored-by: Copilot <[email protected]>
* feat(bb): enhance BrainBread update process
* Updated `fn_update_dl` to use `remotebuildhash` for file integrity.
* Added handling for missing `remotebuildhash` to default to "nohash".
* Included `update_steamcmd.sh` call to ensure both Steam app and GitHub package updates are performed.
Co-authored-by: Copilot <[email protected]>
* fix(steamcmd): ensure core HL1 files are present after appid 90 update
* Added checks to verify the presence of core HL1 files after updating appid 90.
* If files are missing, an update is forced and errors are logged.
* Exits the script if files are still missing after the retry.
* fix(steamcmd): update error messages for GoldSrc engine
* Changed appid 90 references to GoldSrc for clarity.
* Updated error messages to reflect the correct engine context.
* Ensures users are informed about missing core HL1 files after GoldSrc updates.
Co-authored-by: Copilot <[email protected]>
* feat(serverlist): add Military Conflict: Vietnam server entry
* Introduced new server entry for `Military Conflict: Vietnam` in `serverlist.csv`.
* Enhances the variety of game servers available for users.
---------
Co-authored-by: Copilot <[email protected]>
* fix(deps): update .NET runtime version for Vintage Story (#4913)
* Changed `dotnet-runtime-8.0` to `dotnet-runtime-10.0` in dependency lists for Ubuntu and Debian.
* Enhanced the `check_deps.sh` script to dynamically check for the required .NET runtime version.
* Added a warning for users on older distributions regarding potential missing .NET runtimes.
* feat(newserver): Jabroni Brawl: Episode 3 (#4702)
* Added jbep3server
* fix(jbep3): add distro deps entries and game icon
* fix(jbep3): bootstrap config from server.sample.cfg
* chore(prettier): format code
---------
Co-authored-by: Daniel Gibbs <[email protected]>
Co-authored-by: dgibbs64 <[email protected]>
* chore: add AI issue triage workflow and structured-field label rules (#4915)
- Add AI triage workflow that flags low-quality issues and requests missing info
- Add sync-game-labels script and workflow to maintain game labels from serverlist
- Add structured label rules for severity, reproducibility, priority, and scope
- Update labeler workflow to support both issues and PRs with dedicated config
- Add PR review guidance instructions for maintainers
* chore: update issue templates, PR template, and CoC (#4914)
- bug_report: add expected/actual behavior fields, script name,
pre-check checkbox, required steps to reproduce, and AI triage
metadata (severity, reproducibility, regression, affects-latest)
- feature_request: add priority field, problem statement, scope/impact,
alternatives considered; make command optional; remove irrelevant
bug-specific triage fields
- server_request: add dedicated server checkbox, official docs and
Linux binary proof fields; fix CoC placeholder URL; remove
irrelevant bug/feature triage fields
- config.yml: add private security reporting contact link
- pull_request_template: add testing, risk/rollback, breaking changes,
and documentation impact sections
- CODE_OF_CONDUCT: upgrade from Contributor Covenant v2.1 to v3.0;
fill reporting placeholders with GitHub advisory and Discord links
* fix: use is-sponsor-label-action v2 (v3 does not exist)
The v3 release does not exist for JasonEtco/is-sponsor-label-action.
Use v2 which is the latest stable release. The Node.js 24 compatibility
is handled by the FORCE_JAVASCRIPT_ACTIONS_TO_NODE24 environment variable.
* fix: remove AI triage workflow
The GitHub Models API requires specialized authentication that is not available
through secrets.GITHUB_TOKEN. The workflow consistently fails with 401 Unauthorized.
The rule-based label automation (labeler.yml) continues to function correctly
and provides automated labeling based on structured template fields.
* Revert "fix: remove AI triage workflow"
This reverts commit a183369e55.
* docs: clarify GitHub Models availability in AI triage workflow
Add comments explaining that GitHub Models access may not be available in all
environments and that 401 (Unauthorized) errors are expected and handled
gracefully. The workflow will skip AI triage silently but continue processing
the issue through other automation.
* fix(ai-triage): grant models permission to GITHUB_TOKEN
* fix(ai-triage): use GitHub Models REST inference endpoint
* chore(actions): tidy workflows and script layout
* chore(actions): tidy workflows and script layout
* fix: Update Debian 13 dependencies and add to issue templates (#4916)
- Replace libncursesw5 with libncursesw6 (removed from Debian 13)
- Replace libxml2-utils with libxml2 (removed from Debian 13)
- Add Debian 13 to bug report and feature request distro options
Fixes #4847: libncursesw5 and libxml2-utils do not exist on Debian 13
* fix: Correct CSV file path in update-lgsm command (#4917)
The distro CSV file was being fetched with an absolute path
instead of a repository-relative path, causing malformed URLs
like /master//home/user/lgsm/data/debian-12.csv
Changed fn_fetch_file_github first parameter from "${datadir}"
to "lgsm/data" to match the correct repository path structure.
Fixes #4856: ERROR: Downloading debian-12.csv on update-lgsm
* chore(actions): Optimize details-check workflow for PRs
Enhances the `details-check` workflow to run more efficiently on pull requests.
This commit introduces logic to:
- Trigger the workflow on pull requests to the `develop` branch.
- Analyze changed files to determine the scope of the checks required:
- Run a full matrix if core `details`-related scripts are modified.
- Run a targeted matrix only for servers whose `config-lgsm` files are changed.
- Skip the check entirely if no relevant files are touched.
- Provide a concise summary of the `details`, `parse-game-details`, and `query-raw` outcomes directly in the GitHub Actions job summary.
This optimization significantly reduces CI/CD run times and resource consumption for pull requests by avoiding unnecessary checks across all game servers, improving developer efficiency.
* fix(mods_list): update AMX Mod X version to latest release (#4932)
* feat(check_deps.sh): Add “nullmailer” als allowed MTA for email notifications (#4871)
Co-authored-by: Daniel Gibbs <[email protected]>
* fix(mods): BepInEx Valheim install fix (rebased from #4938) (#4939)
* fix: exclude Wine prefix from serverfiles ownership check
SteamCMD creates a Wine prefix at serverfiles/steamapps/compatdata/
containing a z: symlink pointing to /. Without excluding this path,
`find "${serverfiles}"` traverses the entire filesystem, causing
check_permissions.sh to hang indefinitely.
Co-Authored-By: Claude Sonnet 4.6 <[email protected]>
* fix(vh): correct BepInEx mod extraction and env vars
- mods_list: set modsubdirs="BepInExPack_Valheim" so only the pack
contents (not loose Thunderstore metadata) are installed to serverfiles
- mods_core: implement modsubdirs subfolder isolation in fn_mod_install_files;
when modsubdirs is not "0", the named subfolder becomes the extract root
- fix_vh: update BepInEx env vars to match current start_server_bepinex.sh
(DOORSTOP_ENABLED/DOORSTOP_TARGET_ASSEMBLY replacing old names,
remove defunct DOORSTOP_CORLIB_OVERRIDE_PATH)
- mods_list: update modsubdirs field comment to reflect its actual semantics
Co-Authored-By: Claude Sonnet 4.6 <[email protected]>
---------
Co-authored-by: yourfate <[email protected]>
Co-authored-by: Claude Sonnet 4.6 <[email protected]>
* fix(mods): BepInEx_Valheim prevents startup on systems with newer glibc (#4788)
* fix(mods): BepInEx_Valheim prevents startup on systems with newer glibc
Load the libdoorstop_x64.so solely for the dedicated server executable
and not for the whole startup routine, which causes errors in startup or
not loading the mods at all. (see #4149 and #4491)
* chore(prettier): format code
---------
Co-authored-by: Daniel Gibbs <[email protected]>
Co-authored-by: dgibbs64 <[email protected]>
* fix(ci): fetch full history in details-check so base ref diff works (#4940)
The create-matrix job runs 'git diff origin/${base_ref}...HEAD' to
detect which servers a PR touches, but actions/checkout defaults to a
shallow single-branch fetch, so origin/develop does not exist in the
runner and the diff fails with 'ambiguous argument' on every PR that
reaches this job. Set fetch-depth: 0 so the base ref is available.
* feat(alerts): add Matrix alert provider (#4901)
* feat(alerts): add Matrix alert provider
* fix(alerts): use PUT instead of POST for Matrix send-event endpoint
The Matrix Client-Server API requires PUT for
/_matrix/client/v3/rooms/{roomId}/send/{eventType}/{txnId}; sending
POST would be rejected by any spec-compliant homeserver (405), so
alerts would never actually send. Also documents that matrixroom
must be the internal room ID, not the human-readable room alias.
* fix: restore executable bit on alert_matrix.sh
* fix(alerts): register alert_matrix module and harden dispatch
Addresses review feedback on the Matrix alert provider:
- Register alert_matrix.sh in core_modules.sh so the module actually
resolves when alert.sh calls it (without this the call fails as an
unknown command and no alert is ever sent).
- Use curl -sSL to follow redirects, matching the other alert modules
(some homeservers/reverse proxies redirect the client API).
- Require matrixhomeserver to be set in the dispatch condition,
consistent with the TEST-ALERT checks, to avoid building a broken
URL when it is empty.
* fix(ci): make Prettier workflow pass on develop (#4941)
* style(alerts): prettier-format alert_matrix.sh
Add the space in '2> /dev/null' that prettier-plugin-sh expects. This
was in the original #4901 code and tripped the Prettier workflow on
develop after merge (the workflow auto-formats and then can't push to
the protected branch, so the run fails).
* ci(prettier): ignore package-lock.json
package-lock.json is machine-generated by npm; Prettier reformatting it
conflicts with npm's own output and causes the Prettier auto-commit
workflow to try (and fail) to push lockfile churn to protected develop.
Ignoring it lets the workflow find nothing to change and pass.
* fix(jbep3): correct servercfgdefault to server.cfg (#4942)
The jbep3server details-check CI job fails because servercfgdefault was
set to "server.sample.cfg", but the Game-Server-Configs repo only ships
jbep3/server.cfg. The download step (curl -f) 404s and the job exits 22.
jbep3 was the only server using "server.sample.cfg"; all other
Source-engine servers (and 69 servers overall) use "server.cfg", which is
the file that actually exists in the configs repo.
* fix: Set TERM=screen for all non-interactive tmux calls (#4860)
When connected to a server via ssh, and the server doesn't have the
proper terminfo, tmux will fail with 'unsupported terminal' errors.
These errors are not surfaced by the scripts, e.g. details, start,
stop, so they result in either silent failures or don't work at all.
e.g. `./mcserver details` on my server showed 0% CPU, 0% Memory,
and STOPPED for the server status when the server was
actually running. This was because the tmux calls to get
this info failed.
The root cause of this was that I was connected to my server
via kitty, a terminal emulator that my server did not have
terminfo for.
This can be resolved via running `infocmp -x xterm-kitty | ssh
YOUR-SERVER -- tic -x -` and replacing `xterm-kitty` with whatever
is appropriate, or by setting TERM=xterm-256color in the ssh config,
but that is not obvious to do when presented with silent failures.
This commit sets TERM=screen for all non-interactive tmux calls,
which resolves the issue. Note that the `console` command does not
set this, as that is an interactive shell, and the user's terminfo
should be passed.
Co-authored-by: Daniel Gibbs <[email protected]>
* feat(stop): add option to only stop server if no players (#4595)
* add no stop if players online
* remove dev message
* monitor will now restart the server if requested earlier
* changed var name
* add npm check to install gamedig
* new line
* add var
* remove from non supported servers
* typo
* word
* move restart request
* change lock file name
* restart and monitor
* refactor(stop): share player-online check + add stoponlyifnoplayersallcommands
- Extract the duplicated gamedig player-count query (previously copy-pasted
in command_stop, command_restart and command_monitor) into a new shared
check_players_online.sh module that sets ${playersonline}; registered in
core_modules.sh.
- Add stoponlyifnoplayersallcommands (default on) so the stoponlyifnoplayers
protection applies to every command that stops the server (e.g. update).
Set to off to limit it to explicit stop/restart, allowing update to stop
the server even while players are online.
- Add the new setting to all game server _default.cfg files.
- Resolve merge with develop (check_gamedig now keeps develop's npm-update
branch plus the 'install Node.js' hint).
* fix(stop): clear stale restart-request lock + warn on failed player query
Addresses Copilot review feedback on #4595:
- command_restart.sh: clear the *-restart-request.lock once a restart
actually proceeds. Previously the lock was only written when postponing
and never removed, so every subsequent monitor run would see the stale
lock and trigger a repeat restart indefinitely. Fixed and verified against
a live server: postponed restart -> monitor executes it and clears the
lock -> a second monitor run no longer restarts.
- check_players_online.sh: if the gamedig query fails for every configured
IP (e.g. gamedig/jq missing), playersonline now still fails open (so a
broken query can't permanently block stop/restart) but prints a clear
warning that the safety check could not run, instead of silently
behaving as if the server were empty.
* Release v26.2.0
---------
Signed-off-by: dependabot[bot] <[email protected]>
Co-authored-by: unknown <[email protected]>
Co-authored-by: LinuxGSM <[email protected]>
Co-authored-by: Knoxed <[email protected]>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: WildPenguin <[email protected]>
Co-authored-by: Copilot <[email protected]>
Co-authored-by: Jacob Gerega <[email protected]>
Co-authored-by: dgibbs64 <[email protected]>
Co-authored-by: Nikolay Asenov <[email protected]>
Co-authored-by: Fabian Raab <[email protected]>
Co-authored-by: yourfate <[email protected]>
Co-authored-by: Claude Sonnet 4.6 <[email protected]>
Co-authored-by: fwillo <[email protected]>
Co-authored-by: Silas J. Matson <[email protected]>
master
v26.2.0
committed by
GitHub
211 changed files with 2966 additions and 150 deletions
@ -15,12 +15,22 @@ jobs: |
|||
runs-on: ubuntu-latest |
|||
steps: |
|||
- name: Trigger Workflow and Wait (linuxgsm) |
|||
uses: convictional/[email protected] |
|||
with: |
|||
owner: GameServerManagers |
|||
repo: docker-linuxgsm |
|||
github_token: ${{ secrets.PERSONAL_ACCESS_TOKEN }} |
|||
workflow_file_name: action-docker-publish.yml |
|||
env: |
|||
GH_TOKEN: ${{ secrets.PERSONAL_ACCESS_TOKEN }} |
|||
run: | |
|||
before=$(date -u +%Y-%m-%dT%H:%M:%SZ) |
|||
gh workflow run action-docker-publish.yml --repo GameServerManagers/docker-linuxgsm |
|||
sleep 10 |
|||
run_id=$(gh run list \ |
|||
--workflow action-docker-publish.yml \ |
|||
--repo GameServerManagers/docker-linuxgsm \ |
|||
--created ">=${before}" \ |
|||
--limit 1 \ |
|||
--json databaseId \ |
|||
--jq '.[0].databaseId') |
|||
gh run watch "${run_id}" \ |
|||
--repo GameServerManagers/docker-linuxgsm \ |
|||
--exit-status |
|||
|
|||
trigger_build_docker-gameserver: |
|||
if: github.repository_owner == 'GameServerManagers' |
|||
@ -29,9 +39,19 @@ jobs: |
|||
runs-on: ubuntu-latest |
|||
steps: |
|||
- name: Trigger Workflow and Wait (gameserver) |
|||
uses: convictional/[email protected] |
|||
with: |
|||
owner: GameServerManagers |
|||
repo: docker-gameserver |
|||
github_token: ${{ secrets.PERSONAL_ACCESS_TOKEN }} |
|||
workflow_file_name: action-docker-publish.yml |
|||
env: |
|||
GH_TOKEN: ${{ secrets.PERSONAL_ACCESS_TOKEN }} |
|||
run: | |
|||
before=$(date -u +%Y-%m-%dT%H:%M:%SZ) |
|||
gh workflow run action-docker-publish.yml --repo GameServerManagers/docker-gameserver |
|||
sleep 10 |
|||
run_id=$(gh run list \ |
|||
--workflow action-docker-publish.yml \ |
|||
--repo GameServerManagers/docker-gameserver \ |
|||
--created ">=${before}" \ |
|||
--limit 1 \ |
|||
--json databaseId \ |
|||
--jq '.[0].databaseId') |
|||
gh run watch "${run_id}" \ |
|||
--repo GameServerManagers/docker-gameserver \ |
|||
--exit-status |
|||
|
|||
@ -1,29 +0,0 @@ |
|||
name: Update copyright year(s) in license file |
|||
|
|||
on: |
|||
workflow_dispatch: |
|||
schedule: |
|||
- cron: "0 3 1 1 *" # 03:00 AM on January 1 |
|||
|
|||
permissions: |
|||
contents: write |
|||
|
|||
jobs: |
|||
update-license-year: |
|||
runs-on: ubuntu-latest |
|||
steps: |
|||
- name: Checkout |
|||
uses: actions/checkout@v6 |
|||
with: |
|||
fetch-depth: 0 |
|||
persist-credentials: false |
|||
- name: Action Update License Year |
|||
uses: FantasticFiasco/action-update-license-year@v3 |
|||
with: |
|||
token: ${{ secrets.GITHUB_TOKEN }} |
|||
path: LICENSE.md |
|||
- name: Merge pull request |
|||
env: |
|||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} |
|||
run: | |
|||
gh pr merge --merge --delete-branch |
|||
@ -0,0 +1,243 @@ |
|||
name: AI Issue Triage |
|||
on: |
|||
issues: |
|||
types: |
|||
- opened |
|||
- edited |
|||
|
|||
# Note: This workflow uses GitHub Models which may not be available |
|||
# in all environments. If GitHub Models API returns 401 or is unavailable, |
|||
# the workflow will skip gracefully and the issue will still be processed |
|||
# by other automation (labeler, etc.) |
|||
|
|||
permissions: |
|||
issues: write |
|||
contents: read |
|||
models: read |
|||
|
|||
jobs: |
|||
ai-triage: |
|||
if: github.repository_owner == 'GameServerManagers' |
|||
runs-on: ubuntu-latest |
|||
steps: |
|||
- name: Triage issue with GitHub Models |
|||
uses: actions/github-script@v7 |
|||
env: |
|||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} |
|||
with: |
|||
script: | |
|||
const title = context.payload.issue.title || ''; |
|||
const body = context.payload.issue.body || ''; |
|||
const number = context.payload.issue.number; |
|||
const owner = context.repo.owner; |
|||
const repo = context.repo.repo; |
|||
const AI_MARKER = '<!-- ai-triage -->'; |
|||
|
|||
function parseTriageResponse(raw) { |
|||
const input = (raw || '').trim(); |
|||
if (!input) return {}; |
|||
|
|||
const candidates = [input]; |
|||
const fenced = input.match(/```(?:json)?\s*([\s\S]*?)```/i); |
|||
if (fenced?.[1]) candidates.push(fenced[1].trim()); |
|||
|
|||
const firstBrace = input.indexOf('{'); |
|||
const lastBrace = input.lastIndexOf('}'); |
|||
if (firstBrace !== -1 && lastBrace > firstBrace) { |
|||
candidates.push(input.slice(firstBrace, lastBrace + 1)); |
|||
} |
|||
|
|||
for (const candidate of candidates) { |
|||
try { |
|||
return JSON.parse(candidate); |
|||
} catch (_err) { |
|||
// Continue trying fallbacks. |
|||
} |
|||
} |
|||
|
|||
return {}; |
|||
} |
|||
|
|||
// For short bodies, apply "needs: more info" label directly. |
|||
// Skip the AI call but still label the issue. |
|||
const isShortBody = body.trim().length < 80; |
|||
if (isShortBody) { |
|||
try { |
|||
await github.rest.issues.addLabels({ |
|||
owner, repo, issue_number: number, |
|||
labels: ['needs: more info'], |
|||
}); |
|||
} catch (err) { |
|||
console.log('Could not apply label for short body:', err.message); |
|||
} |
|||
return; |
|||
} |
|||
|
|||
// ── Call GitHub Models ──────────────────────────────────────── |
|||
// Note: GitHub Models access may not be available in all environments. |
|||
// If the API returns 401 (Unauthorized), it means GitHub Models is not |
|||
// enabled for this repository or the current token lacks access. |
|||
// The workflow will gracefully skip AI triage and continue. |
|||
let triage; |
|||
try { |
|||
const res = await fetch( |
|||
`https://models.github.ai/orgs/${owner}/inference/chat/completions`, |
|||
{ |
|||
method: 'POST', |
|||
headers: { |
|||
'Accept': 'application/vnd.github+json', |
|||
'Authorization': `Bearer ${process.env.GITHUB_TOKEN}`, |
|||
'X-GitHub-Api-Version': '2026-03-10', |
|||
'Content-Type': 'application/json', |
|||
}, |
|||
body: JSON.stringify({ |
|||
model: 'openai/gpt-4.1-mini', |
|||
temperature: 0.1, |
|||
max_tokens: 400, |
|||
messages: [ |
|||
{ |
|||
role: 'system', |
|||
content: |
|||
'You are a triage assistant for LinuxGSM, an open-source ' + |
|||
'Linux game server manager. Your role is to:\n' + |
|||
'1. Analyze issue quality (completeness, clarity)\n' + |
|||
'2. Extract game names mentioned in the issue, even if misspelled or abbreviated\n' + |
|||
'3. Suggest corrections for likely typos using fuzzy matching\n' + |
|||
'4. Respond ONLY with a valid JSON object — no markdown fences.\n\n' + |
|||
'Common game name variations and typos you should recognize:\n' + |
|||
'- "Valhiem" → "Valheim"\n' + |
|||
'- "Rrust" → "Rust"\n' + |
|||
'- "Conterstrike" / "CS" / "CSGO" → "Counter-Strike: Global Offensive"\n' + |
|||
'- "Garrys" / "GMod" → "Garrys Mod"\n' + |
|||
'- "ARK" / "Ark" → "ARK: Survival Evolved"\n' + |
|||
'- "DayZ" / "Dayz" → "DayZ"\n' + |
|||
'- "Insurgency Sandstorm" / "Insurgency 2" → "Insurgency: Sandstorm"', |
|||
}, |
|||
{ |
|||
role: 'user', |
|||
content: |
|||
`Title: ${title}\n\nBody:\n${body.slice(0, 3000)}\n\n` + |
|||
'Respond with this JSON schema:\n' + |
|||
'{\n' + |
|||
' "quality": "good" | "ok" | "poor",\n' + |
|||
' "missing_info": ["list of specific missing fields"],\n' + |
|||
' "detected_game": "canonical game name if one is mentioned, or null",\n' + |
|||
' "game_confidence": "high" | "medium" | "low" | null,\n' + |
|||
' "game_note": "correction suggestion if the user misspelled a game name, or empty string",\n' + |
|||
' "comment": "one or two sentence note to the reporter, or empty string"\n' + |
|||
'}', |
|||
}, |
|||
], |
|||
}), |
|||
} |
|||
); |
|||
|
|||
// GitHub Models may return 401 if not available for this repository. |
|||
// This is expected and not an error — the workflow simply skips AI triage. |
|||
if (!res.ok) { |
|||
console.log(`GitHub Models returned ${res.status} — skipping AI triage.`); |
|||
return; |
|||
} |
|||
|
|||
const data = await res.json(); |
|||
const raw = data.choices?.[0]?.message?.content || '{}'; |
|||
triage = parseTriageResponse(raw); |
|||
} catch (err) { |
|||
// Never fail the workflow if the AI call errors — it's advisory only. |
|||
console.log('AI triage skipped:', err.message); |
|||
return; |
|||
} |
|||
|
|||
if (!triage || typeof triage !== 'object') { |
|||
triage = {}; |
|||
} |
|||
|
|||
// ── Act on the result ──────────────────────────────────────── |
|||
const isPoor = triage.quality === 'poor'; |
|||
const missing = Array.isArray(triage.missing_info) ? triage.missing_info : []; |
|||
const hasIssues = isPoor || missing.length > 0; |
|||
|
|||
// Prepare labels to apply |
|||
const labelsToApply = []; |
|||
|
|||
// Check if a game was detected with high confidence |
|||
const detectedGame = triage.detected_game; |
|||
const gameConfidence = triage.game_confidence; |
|||
|
|||
if (detectedGame && gameConfidence === 'high') { |
|||
labelsToApply.push(`game: ${detectedGame}`); |
|||
} |
|||
|
|||
// Apply "needs: more info" label if quality issues detected |
|||
if (hasIssues) { |
|||
labelsToApply.push('needs: more info'); |
|||
} |
|||
|
|||
// Apply labels one-by-one so a single failure does not block all labels. |
|||
const uniqueLabels = [...new Set(labelsToApply)]; |
|||
for (const label of uniqueLabels) { |
|||
try { |
|||
await github.rest.issues.addLabels({ |
|||
owner, |
|||
repo, |
|||
issue_number: number, |
|||
labels: [label], |
|||
}); |
|||
} catch (err) { |
|||
console.log(`Could not apply label "${label}":`, err.message); |
|||
} |
|||
} |
|||
|
|||
// Post a comment only when there is something specific to say |
|||
const gameNote = triage.game_note || ''; |
|||
const reporterComment = triage.comment || ''; |
|||
|
|||
if (!hasIssues && !gameNote) return; |
|||
|
|||
const missingBlock = missing.length > 0 |
|||
? `\n\n**Missing information:**\n${missing.map(m => `- ${m}`).join('\n')}` |
|||
: ''; |
|||
|
|||
const gameBlock = gameNote |
|||
? `\n\n**Game name note:** ${gameNote}` |
|||
: ''; |
|||
|
|||
const triageCommentBody = |
|||
`${AI_MARKER}\n` + |
|||
`Thanks for opening this issue! 👋\n\n` + |
|||
`${reporterComment}` + |
|||
`${missingBlock}` + |
|||
`${gameBlock}\n\n` + |
|||
`_This note was generated automatically by AI triage and may not be perfect. ` + |
|||
`A maintainer will review shortly._`; |
|||
|
|||
try { |
|||
const comments = await github.rest.issues.listComments({ |
|||
owner, |
|||
repo, |
|||
issue_number: number, |
|||
per_page: 100, |
|||
}); |
|||
|
|||
const existingAiComment = comments.data.find( |
|||
(comment) => comment.user?.type === 'Bot' && comment.body?.includes(AI_MARKER) |
|||
); |
|||
|
|||
if (existingAiComment) { |
|||
await github.rest.issues.updateComment({ |
|||
owner, |
|||
repo, |
|||
comment_id: existingAiComment.id, |
|||
body: triageCommentBody, |
|||
}); |
|||
} else { |
|||
await github.rest.issues.createComment({ |
|||
owner, |
|||
repo, |
|||
issue_number: number, |
|||
body: triageCommentBody, |
|||
}); |
|||
} |
|||
} catch (err) { |
|||
console.log('Could not post comment:', err.message); |
|||
} |
|||
@ -0,0 +1,28 @@ |
|||
name: Sync Game Labels |
|||
on: |
|||
push: |
|||
branches: |
|||
- master |
|||
- develop |
|||
paths: |
|||
- "lgsm/data/serverlist.csv" |
|||
workflow_dispatch: {} |
|||
|
|||
permissions: |
|||
issues: write |
|||
contents: read |
|||
|
|||
jobs: |
|||
sync-game-labels: |
|||
if: github.repository_owner == 'GameServerManagers' |
|||
runs-on: ubuntu-latest |
|||
steps: |
|||
- name: Checkout |
|||
uses: actions/checkout@v5 |
|||
|
|||
- name: Sync game labels from serverlist |
|||
env: |
|||
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} |
|||
run: | |
|||
chmod +x .github/scripts/sync-game-labels.sh |
|||
.github/scripts/sync-game-labels.sh |
|||
@ -0,0 +1,7 @@ |
|||
# Prettier auto-commit runs with GITHUB_TOKEN (GitHub App). |
|||
# GitHub blocks that token from creating/updating anything under .github/workflows. |
|||
.github/workflows/** |
|||
|
|||
# Machine-generated by npm; its format is owned by npm, not Prettier. |
|||
# Prettier reformatting it fights npm and makes the auto-commit run fail. |
|||
package-lock.json |
|||
@ -0,0 +1,198 @@ |
|||
################################## |
|||
######## Default Settings ######## |
|||
################################## |
|||
# DO NOT EDIT, ANY CHANGES WILL BE OVERWRITTEN! |
|||
# Copy settings from here and use them in either: |
|||
# common.cfg - applies settings to every instance. |
|||
# [instance].cfg - applies settings to a specific instance. |
|||
|
|||
#### Game Server Settings #### |
|||
|
|||
## Predefined Parameters | https://docs.linuxgsm.com/configuration/start-parameters |
|||
ip="0.0.0.0" |
|||
port="27015" |
|||
clientport="27005" |
|||
sourcetvport="27020" |
|||
defaultmap="crossfire" |
|||
maxplayers="24" |
|||
|
|||
## Server Parameters | https://docs.linuxgsm.com/configuration/start-parameters#additional-parameters |
|||
startparameters="-game jbep3 -strictportbind -ip ${ip} -port ${port} +clientport ${clientport} +tv_port ${sourcetvport} +map ${defaultmap} +servercfgfile ${servercfg} -maxplayers ${maxplayers}" |
|||
|
|||
#### LinuxGSM Settings #### |
|||
|
|||
## LinuxGSM Stats |
|||
# Send useful stats to LinuxGSM developers. |
|||
# https://docs.linuxgsm.com/configuration/linuxgsm-stats |
|||
# (on|off) |
|||
stats="off" |
|||
|
|||
## Notification Alerts |
|||
# (on|off) |
|||
|
|||
# Display IP | https://docs.linuxgsm.com/alerts#display-ip |
|||
displayip="" |
|||
|
|||
# More info | https://docs.linuxgsm.com/alerts#more-info |
|||
postalert="off" |
|||
|
|||
# Alert on Start/Stop/Restart |
|||
statusalert="off" |
|||
|
|||
# Discord Alerts | https://docs.linuxgsm.com/alerts/discord |
|||
discordalert="off" |
|||
discordwebhook="webhook" |
|||
|
|||
# Email Alerts | https://docs.linuxgsm.com/alerts/email |
|||
emailalert="off" |
|||
email="[email protected]" |
|||
emailfrom="" |
|||
|
|||
# Gotify Alerts | https://docs.linuxgsm.com/alerts/gotify |
|||
gotifyalert="off" |
|||
gotifytoken="token" |
|||
gotifywebhook="webhook" |
|||
|
|||
# IFTTT Alerts | https://docs.linuxgsm.com/alerts/ifttt |
|||
iftttalert="off" |
|||
ifttttoken="accesstoken" |
|||
iftttevent="linuxgsm_alert" |
|||
|
|||
# ntfy Alerts | https://docs.linuxgsm.com/alerts/ntfy |
|||
ntfyalert="off" |
|||
ntfytopic="LinuxGSM" |
|||
ntfyserver="https://ntfy.sh" |
|||
ntfytoken="" |
|||
ntfyusername="" |
|||
ntfypassword="" |
|||
ntfypriority="" |
|||
ntfytags="" |
|||
|
|||
# Pushbullet Alerts | https://docs.linuxgsm.com/alerts/pushbullet |
|||
pushbulletalert="off" |
|||
pushbullettoken="accesstoken" |
|||
channeltag="" |
|||
|
|||
# Pushover Alerts | https://docs.linuxgsm.com/alerts/pushover |
|||
pushoveralert="off" |
|||
pushovertoken="accesstoken" |
|||
pushoveruserkey="userkey" |
|||
|
|||
# Rocket.Chat Alerts | https://docs.linuxgsm.com/alerts/rocket.chat |
|||
rocketchatalert="off" |
|||
rocketchatwebhook="webhook" |
|||
|
|||
# Slack Alerts | https://docs.linuxgsm.com/alerts/slack |
|||
slackalert="off" |
|||
slackwebhook="webhook" |
|||
|
|||
# Telegram Alerts | https://docs.linuxgsm.com/alerts/telegram |
|||
# You can add a custom cURL string eg proxy (useful in Russia) in "curlcustomstring". |
|||
# For example "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help all". |
|||
telegramapi="api.telegram.org" |
|||
telegramalert="off" |
|||
telegramtoken="accesstoken" |
|||
telegramchatid="" |
|||
telegramthreadid="" |
|||
telegramsilentnotification="false" |
|||
curlcustomstring="" |
|||
|
|||
## 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="869800" |
|||
steamcmdforcewindows="no" |
|||
# SteamCMD Branch | https://docs.linuxgsm.com/steamcmd/branch |
|||
branch="" |
|||
betapassword="" |
|||
# Master Server | https://docs.linuxgsm.com/steamcmd/steam-master-server |
|||
steammaster="true" |
|||
|
|||
## Stop Mode | https://docs.linuxgsm.com/features/stop-mode |
|||
# 1: tmux kill |
|||
# 2: CTRL+c |
|||
# 3: quit |
|||
# 4: quit 120s |
|||
# 5: stop |
|||
# 6: q |
|||
# 7: exit |
|||
# 8: 7 Days to Die |
|||
# 9: GoldSrc |
|||
# 10: Avorion |
|||
# 11: end |
|||
stopmode="3" |
|||
|
|||
## 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="yes" |
|||
|
|||
## Game Server Details |
|||
# Do not edit |
|||
gamename="Jabroni Brawl: Episode 3" |
|||
engine="source" |
|||
glibc="2.3.6" |
|||
|
|||
#### Directories #### |
|||
# Edit with care |
|||
|
|||
## Game Server Directories |
|||
systemdir="${serverfiles}/jbep3" |
|||
executabledir="${serverfiles}" |
|||
executable="./srcds_run.sh" |
|||
servercfgdir="${systemdir}/cfg" |
|||
servercfg="${selfname}.cfg" |
|||
servercfgdefault="server.cfg" |
|||
servercfgfullpath="${servercfgdir}/${servercfg}" |
|||
|
|||
## Backup Directory |
|||
backupdir="${lgsmdir}/backup" |
|||
|
|||
## Logging Directories |
|||
[ -n "${LGSM_LOGDIR}" ] && logdir="${LGSM_LOGDIR}" || logdir="${rootdir}/log" |
|||
gamelogdir="${systemdir}/logs" |
|||
lgsmlogdir="${logdir}/script" |
|||
consolelogdir="${logdir}/console" |
|||
lgsmlog="${lgsmlogdir}/${selfname}-script.log" |
|||
consolelog="${consolelogdir}/${selfname}-console.log" |
|||
alertlog="${lgsmlogdir}/${selfname}-alert.log" |
|||
postdetailslog="${lgsmlogdir}/${selfname}-postdetails.log" |
|||
|
|||
## Logs Naming |
|||
lgsmlogdate="${lgsmlogdir}/${selfname}-script-$(date '+%Y-%m-%d-%H:%M:%S').log" |
|||
consolelogdate="${consolelogdir}/${selfname}-console-$(date '+%Y-%m-%d-%H:%M:%S').log" |
|||
|
|||
## Log Parameters |
|||
logtimestamp="off" |
|||
logtimestampformat="%Y-%m-%d %H:%M:%S" |
|||
@ -0,0 +1,189 @@ |
|||
################################## |
|||
######## Default Settings ######## |
|||
################################## |
|||
# DO NOT EDIT, ANY CHANGES WILL BE OVERWRITTEN! |
|||
# Copy settings from here and use them in either: |
|||
# common.cfg - applies settings to every instance. |
|||
# [instance].cfg - applies settings to a specific instance. |
|||
|
|||
#### Game Server Settings #### |
|||
|
|||
game_type="0" |
|||
game_mode="0" |
|||
ip="0.0.0.0" |
|||
port="27015" |
|||
clientport="27005" |
|||
sourcetvport="27020" |
|||
steamport="26901" |
|||
defaultmap="mcv_siege" |
|||
maxplayers="32" |
|||
tickrate="64" |
|||
|
|||
## Server Parameters | https://docs.linuxgsm.com/configuration/start-parameters#additional-parameters |
|||
startparameters="-game vietnam -usercon -strictportbind -ip ${ip} -port ${port} +clientport ${clientport} +tv_port ${sourcetvport} -tickrate ${tickrate} +map ${defaultmap} +servercfgfile ${servercfg} -maxplayers_override ${maxplayers} +game_type ${game_type} +game_mode ${game_mode} -nobreakpad" |
|||
|
|||
#### LinuxGSM Settings #### |
|||
|
|||
## LinuxGSM Stats |
|||
# Send useful stats to LinuxGSM developers. |
|||
# https://docs.linuxgsm.com/configuration/linuxgsm-stats |
|||
# (on|off) |
|||
stats="off" |
|||
|
|||
## Notification Alerts |
|||
# (on|off) |
|||
|
|||
# Display IP | https://docs.linuxgsm.com/alerts#display-ip |
|||
displayip="" |
|||
|
|||
# More info | https://docs.linuxgsm.com/alerts#more-info |
|||
postalert="off" |
|||
|
|||
# Alert on Start/Stop/Restart |
|||
statusalert="off" |
|||
|
|||
# Discord Alerts | https://docs.linuxgsm.com/alerts/discord |
|||
discordalert="off" |
|||
discordwebhook="webhook" |
|||
|
|||
# Email Alerts | https://docs.linuxgsm.com/alerts/email |
|||
emailalert="off" |
|||
email="[email protected]" |
|||
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" |
|||
|
|||
# Pushbullet Alerts | https://docs.linuxgsm.com/alerts/pushbullet |
|||
pushbulletalert="off" |
|||
pushbullettoken="accesstoken" |
|||
channeltag="" |
|||
|
|||
# Pushover Alerts | https://docs.linuxgsm.com/alerts/pushover |
|||
pushoveralert="off" |
|||
pushovertoken="accesstoken" |
|||
pushoveruserkey="userkey" |
|||
|
|||
# Rocket.Chat Alerts | https://docs.linuxgsm.com/alerts/rocket.chat |
|||
rocketchatalert="off" |
|||
rocketchatwebhook="webhook" |
|||
|
|||
# Slack Alerts | https://docs.linuxgsm.com/alerts/slack |
|||
slackalert="off" |
|||
slackwebhook="webhook" |
|||
|
|||
# Telegram Alerts | https://docs.linuxgsm.com/alerts/telegram |
|||
# You can add a custom cURL string eg proxy (useful in Russia) in "curlcustomstring". |
|||
# For example "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help". |
|||
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="1136190" |
|||
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="3" |
|||
|
|||
## 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="yes" |
|||
|
|||
## Game Server Details |
|||
# Do not edit |
|||
gamename="Military Conflict: Vietnam" |
|||
engine="source" |
|||
glibc="2.15" |
|||
|
|||
#### Directories #### |
|||
# Edit with care |
|||
|
|||
## Game Server Directories |
|||
systemdir="${serverfiles}/vietnam" |
|||
executabledir="${serverfiles}" |
|||
executable="./srcds_run_x64" |
|||
servercfgdir="${systemdir}/cfg" |
|||
servercfg="${selfname}.cfg" |
|||
servercfgdefault="server.cfg" |
|||
servercfgfullpath="${servercfgdir}/${servercfg}" |
|||
|
|||
## Backup Directory |
|||
backupdir="${lgsmdir}/backup" |
|||
|
|||
## Logging Directories |
|||
[ -n "${LGSM_LOGDIR}" ] && logdir="${LGSM_LOGDIR}" || logdir="${rootdir}/log" |
|||
gamelogdir="${systemdir}/logs" |
|||
lgsmlogdir="${logdir}/script" |
|||
consolelogdir="${logdir}/console" |
|||
lgsmlog="${lgsmlogdir}/${selfname}-script.log" |
|||
consolelog="${consolelogdir}/${selfname}-console.log" |
|||
alertlog="${lgsmlogdir}/${selfname}-alert.log" |
|||
postdetailslog="${lgsmlogdir}/${selfname}-postdetails.log" |
|||
|
|||
## Logs Naming |
|||
lgsmlogdate="${lgsmlogdir}/${selfname}-script-$(date '+%Y-%m-%d-%H:%M:%S').log" |
|||
consolelogdate="${consolelogdir}/${selfname}-console-$(date '+%Y-%m-%d-%H:%M:%S').log" |
|||
|
|||
## Log Parameters |
|||
logtimestamp="off" |
|||
logtimestampformat="%Y-%m-%d %H:%M:%S" |
|||
Some files were not shown because too many files changed in this diff
Loading…
Reference in new issue