Skip to content

Update from head 11/5/26 - #7

Merged
un-boxing-man merged 174 commits into
un-boxing-hosting:masterfrom
GameServerManagers:master
Nov 5, 2026
Merged

un-boxing-man merged 174 commits into
un-boxing-hosting:masterfrom
GameServerManagers:master

Conversation

@un-boxing-man

Copy link
Copy Markdown
Member

No description provided.

dependabot Bot and others added 30 commits October 2, 2026 22:30
Bumps [actions/add-to-project](https://github.com/actions/add-to-project) from 1.0.2 to 2.0.0.
- [Release notes](https://github.com/actions/add-to-project/releases)
- [Commits](actions/add-to-project@v1.0.2...v2.0.0)

---
updated-dependencies:
- dependency-name: actions/add-to-project
  dependency-version: 2.0.0
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Daniel Gibbs <me@danielgibbs.co.uk>
Bumps [actions/checkout](https://github.com/actions/checkout) from 5 to 7.
- [Release notes](https://github.com/actions/checkout/releases)
- [Changelog](https://github.com/actions/checkout/blob/main/CHANGELOG.md)
- [Commits](actions/checkout@v5...v7)

---
updated-dependencies:
- dependency-name: actions/checkout
  dependency-version: '7'
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: Daniel Gibbs <me@danielgibbs.co.uk>
Co-authored-by: unknown <unknown@example.com>
Co-authored-by: LinuxGSM <dev@linuxgsm.com>
Co-authored-by: Knoxed <1338733+knoxed@users.noreply.github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: WildPenguin <ville.aakko@gmail.com>
Co-authored-by: Copilot <copilot@github.com>
Co-authored-by: Jacob Gerega <22921310+jgerega107@users.noreply.github.com>
Co-authored-by: dgibbs64 <dgibbs64@users.noreply.github.com>
Co-authored-by: Nikolay Asenov <10465782+nasenov@users.noreply.github.com>
Co-authored-by: Fabian Raab <fabian@raab.link>
Co-authored-by: yourfate <2371889-youRFate@users.noreply.gitlab.com>
Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
Co-authored-by: fwillo <37631375+fwillo@users.noreply.github.com>
Co-authored-by: Silas J. Matson <sjmatson01@gmail.com>
Bumps [actions/cache](https://github.com/actions/cache) from 4 to 6.
- [Release notes](https://github.com/actions/cache/releases)
- [Changelog](https://github.com/actions/cache/blob/main/RELEASES.md)
- [Commits](actions/cache@v4...v6)

---
updated-dependencies:
- dependency-name: actions/cache
  dependency-version: '6'
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: Daniel Gibbs <me@danielgibbs.co.uk>
Co-authored-by: unknown <unknown@example.com>
Co-authored-by: LinuxGSM <dev@linuxgsm.com>
Co-authored-by: Knoxed <1338733+knoxed@users.noreply.github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: WildPenguin <ville.aakko@gmail.com>
Co-authored-by: Copilot <copilot@github.com>
Co-authored-by: Jacob Gerega <22921310+jgerega107@users.noreply.github.com>
Co-authored-by: dgibbs64 <dgibbs64@users.noreply.github.com>
Co-authored-by: Nikolay Asenov <10465782+nasenov@users.noreply.github.com>
Co-authored-by: Fabian Raab <fabian@raab.link>
Co-authored-by: yourfate <2371889-youRFate@users.noreply.gitlab.com>
Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
Co-authored-by: fwillo <37631375+fwillo@users.noreply.github.com>
Co-authored-by: Silas J. Matson <sjmatson01@gmail.com>
Bumps [actions/github-script](https://github.com/actions/github-script) from 7 to 9.
- [Release notes](https://github.com/actions/github-script/releases)
- [Commits](actions/github-script@v7...v9)

---
updated-dependencies:
- dependency-name: actions/github-script
  dependency-version: '9'
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: Daniel Gibbs <me@danielgibbs.co.uk>
Co-authored-by: unknown <unknown@example.com>
Co-authored-by: LinuxGSM <dev@linuxgsm.com>
Co-authored-by: Knoxed <1338733+knoxed@users.noreply.github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: WildPenguin <ville.aakko@gmail.com>
Co-authored-by: Copilot <copilot@github.com>
Co-authored-by: Jacob Gerega <22921310+jgerega107@users.noreply.github.com>
Co-authored-by: dgibbs64 <dgibbs64@users.noreply.github.com>
Co-authored-by: Nikolay Asenov <10465782+nasenov@users.noreply.github.com>
Co-authored-by: Fabian Raab <fabian@raab.link>
Co-authored-by: yourfate <2371889-youRFate@users.noreply.gitlab.com>
Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
Co-authored-by: fwillo <37631375+fwillo@users.noreply.github.com>
Co-authored-by: Silas J. Matson <sjmatson01@gmail.com>
Dependabot minor/patch updates were auto-approved by github-actions[bot],
which satisfied master's required review and merged straight to master.
All dependency updates go back to manual review. The workflow has also
been removed from dgibbs64/repo-sync so it is not synced back.

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
* chore(sync): synced local '.github/' with remote 'general/.github/'

Synced from dgibbs64/repo-sync@a9c3090 — Merge pull request #18 from dgibbs64/chore/remove-dependabot-automerge

chore(workflows): remove dependabot auto-merge workflow

* chore(sync): synced local './' with remote 'bash/'

Synced from dgibbs64/repo-sync@a9c3090 — Merge pull request #18 from dgibbs64/chore/remove-dependabot-automerge

chore(workflows): remove dependabot auto-merge workflow

* Add permissions for pull-requests in workflow

Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>

---------

Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
update_bb.sh was the only module committed as 100644; all others are
100755.

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
fn_info_game_sdtd stored TelnetPassword in ${telnetpass}, but
command_stop.sh, info_messages.sh and the localhost check in the same
function all read ${telnetpassword}. The graceful telnet shutdown never
sent the password, and the telnet IP was always forced to 127.0.0.1,
so stop fell back to killing the tmux session without a world save.

Fixes #4957

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
* fix(vh): add crossplay setting to control -crossplay

-crossplay was hard-coded in vhserver's startparameters, so Steam-only
servers could not turn off the PlayFab relay without overriding the
whole startparameters line. Add crossplay="true" (default unchanged)
and only pass -crossplay when it is "true".

Fixes #4930

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* fix(vh): document how to disable crossplay instead of adding a toggle

Drop the crossplay setting and the conditional in startparameters.
Keep -crossplay in the defaults, consistent with arkserver, and explain
how Steam-only servers remove it by overriding startparameters.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
…save (#4960)

* chore(sync): synced local '.github/' with remote 'general/.github/' (#4947)

Synced from dgibbs64/repo-sync@0a4246db6891a1188edd959ccec352e6c4149eb4 — Merge pull request #12 from dgibbs64/dependabot/npm_and_yarn/brace-expansion-5.0.7

chore(deps): bump brace-expansion from 5.0.6 to 5.0.7

* Update startparameters to load the latest server autosave

Swap --start-server ${serverfiles}/save1.zip with --start-server-load-latest

* fix(fctr): create initial save in saves/ so load-latest finds it

--start-server-load-latest only searches the saves directory. The
initial save was created at ${serverfiles}/save1.zip, so a fresh install
had no saves/ directory and failed to host ("cannot open directory").

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

---------

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: Daniel Gibbs <me@danielgibbs.co.uk>
Co-authored-by: unknown <unknown@example.com>
Co-authored-by: LinuxGSM <dev@linuxgsm.com>
Co-authored-by: Knoxed <1338733+knoxed@users.noreply.github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: WildPenguin <ville.aakko@gmail.com>
Co-authored-by: Copilot <copilot@github.com>
Co-authored-by: Jacob Gerega <22921310+jgerega107@users.noreply.github.com>
Co-authored-by: dgibbs64 <dgibbs64@users.noreply.github.com>
Co-authored-by: Nikolay Asenov <10465782+nasenov@users.noreply.github.com>
Co-authored-by: Fabian Raab <fabian@raab.link>
Co-authored-by: yourfate <2371889-youRFate@users.noreply.gitlab.com>
Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
Co-authored-by: fwillo <37631375+fwillo@users.noreply.github.com>
Co-authored-by: Silas J. Matson <sjmatson01@gmail.com>
* fix(deps): support deb822 apt sources on Debian

* fix(deps): ignore commented-out non-free entries in apt sources

The non-free check matched commented lines, so a disabled non-free
entry (more likely now that sources.list.d is searched) made LinuxGSM
try the unavailable steamcmd package instead of the tar fallback.
Only count lines whose first non-space character is not #.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

---------

Co-authored-by: BreezeDelegate <271538431+BreezeDelegate@users.noreply.github.com>
Co-authored-by: Daniel Gibbs <me@danielgibbs.co.uk>
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
Co-authored-by: BreezeDelegate <271538431+BreezeDelegate@users.noreply.github.com>
Co-authored-by: Daniel Gibbs <me@danielgibbs.co.uk>
…pport (#4961)

- Enable mod installation, updates and removal for CS2
- Add Metamod:Source 2.0 dev builds with gameinfo.gi configuration
- Add CounterStrikeSharp using the latest Linux release with runtime
- Require Metamod:Source 2.0 before installing CounterStrikeSharp
- Preserve the shared Metamod directory when removing CounterStrikeSharp

Co-authored-by: Daniel Gibbs <me@danielgibbs.co.uk>
- pr-labeler ran on pull_request, which gets a read-only token for PRs
  from forks, so it failed on every contributor PR ("Could not add
  label(s)"). Run it on pull_request_target with job-scoped write
  permissions; no job checks out or runs PR code on that event.
- details-check failed the whole run when create-matrix produced an
  empty matrix (PR touches no server configs). Skip the job instead.

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
…) with configurable clientappid and the NoLobbyReservation mod (#4963)

* feat(csgoserver): support the standalone CS:GO client (App ID 4465480) with configurable runtimeappid and the NoLobbyReservation mod

* feat(csgoserver): rename runtimeappid to clientappid, pin NoLobbyReservation, prefer spcomp64

- Rename runtimeappid to clientappid and reword the comments: appid is
  the SteamCMD download ID (740), clientappid is the App ID the server
  advertises and players' clients connect with (4465480 or 730).
- Pin NoLobbyReservation to commit 003ab19f. It has no releases and is
  compiled from source on install, so do not follow master.
- Prefer spcomp64 and fall back to spcomp, so compiling does not rely
  on i386 libraries.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

---------

Co-authored-by: Daniel Gibbs <me@danielgibbs.co.uk>
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
* feat(rsdwserver): add RuneScape: Dragonwilds server

* fix(rsdwserver): correct servercfgdir to LinuxServer

* feat(rsdwserver): show world name, owner id, and ini path in details

* fix(rsdwserver): point port edit guidance to start parameters

The rsdw port is set via -Port=${port} in startparameters, not in
DedicatedServer.ini, so move rsdw to the start parameters list.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_012svZAWTbYDdo2WuT2BZxQo

* feat(rsdwserver): add distro dependency entries and OwnerId guidance

- Add rsdw to every distro dependency CSV; without it the Server List
  Validation check fails once merged. No extra packages are needed,
  like other Unreal servers.
- Add Owner ID to dev-parse-game-details, as info_game.sh requires for
  new variables.
- State in _default.cfg that the server does not finish starting until
  OwnerId is set in DedicatedServer.ini, and drop the unused servername
  setting (the server reads its name from DedicatedServer.ini).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* feat(rsdwserver): add game icon

32x32 RGB PNG from the Steam community app icon for RuneScape: Dragonwilds (app 1374490), matching the other game icons. Required by serverlist-validate-game-icons.sh.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

---------

Co-authored-by: Claude <noreply@anthropic.com>
Co-authored-by: Daniel Gibbs <me@danielgibbs.co.uk>
sm-icon.png was JPEG data with a .png extension; every other game icon
is a 32x32 RGB PNG. Re-encoded as PNG with no visual change.

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
#4974)

Separators and centred text used the width from tput cols. Without a
terminal (cron, Docker, post-details), tput prints an error and returns
nothing. bash 5.3 (Ubuntu 26.04) also rejects the empty printf width
("printf: : invalid number"). Hide tput's error and fall back to 80
columns. Terminal widths are still used when available.

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
sudo -v asks for a password with sudo-rs (Ubuntu 25.10+) even with
NOPASSWD, and with classic sudo when the user also matches the default
%sudo rule. Try sudo -n true first and only fall back to the sudo -v
prompt when passwordless sudo is not available.
#4981)

Bootstrap downloads and the Ctrl+C trap called logging, message and core_exit.sh functions before the modules defining them were loaded. This caused spurious "fn_script_log_pass: command not found" errors after the module cache was emptied, and a failed or cancelled early download carried on instead of exiting.

- Guard bootstrap log calls on the logging function existing.
- Add fn_bootstrap_exit: uses core_exit.sh once available, otherwise a plain exit.
- Make the download trap bootstrap-safe (removes the partial file, exits 130).
RuneScape: Dragonwilds had no install_config.sh block, so no DedicatedServer.ini was created on install and the details-check (rsdw) CI job failed downloading the default config.

- Download DedicatedServer.ini from Game-Server-Configs (GameServerManagers/Game-Server-Configs#157), set the server and world name, and generate an admin password.
- Update the rsdwserver _default.cfg comment: the INI is now created during install, so OwnerId can be set before the first start.
Adds the Hytale server (hyt): install, default config from Game-Server-Configs, Java 25 dependency check and first-start server login.
…Simulator 2 (#4990)

The amtrucks_server and eurotrucks2_server binaries link libatomic.so.1,
which is not installed by default, so both servers failed to start.
…ies (#4992)

The runner image's package index goes stale. Ubuntu replaced the
libxml2-utils build it lists, so apt-get install got a 404 and the
details-check job failed before any LinuxGSM code ran.
Project Zomboid prompts for an admin password on first start when none is
given, and the server waits there forever because LinuxGSM runs it in
tmux (and Docker has no terminal at all).
The monitor connects to the query port on each address in queryips.
When voice_ip was set to a specific address, queryips only held that
address and the public IP, so a ServerQuery bound to localhost
(query_ip=127.0.0.1) was never tried and monitor restarted the server.

Read query_ip from ts3server.ini (first address if several) and, when
it is a specific IPv4 address not already listed, query it first.

Fixes #4966
* ci(details-check): run servers in shards from the checkout

- Check servers in 12 shards instead of one job per server, so jobs no
  longer queue behind the concurrency limit.
- Seed lgsm/modules, config-default and data from the checkout, so each
  server takes about 20s instead of about 80s and the PR's own code is
  what gets checked.
- Run bf1942, bfv, btl and onset in an ubuntu:20.04 container. The
  ubuntu-20.04 runner is retired, so btl and onset never started.
- Changes to the details-check workflow or scripts trigger a full run.

* ci(details-check): use the config filename for the Game-Server-Configs URL

servercfgdefault can include a directory variable (xnt uses
${systemdir}/server.cfg). Game-Server-Configs stores files flat per
game, so use only the filename.

* ci(details-check): keep config subdirectories in the Game-Server-Configs URL

Only drop a leading ${variable}/ (xnt). pc2's config lives in
config_sample/ in Game-Server-Configs.

* ci(details-check): fix the Game-Server-Configs path expansion

Strip a leading ${variable}/ with a pattern test instead of a nested
parameter expansion, which bash mangled. Keeps pc2's config_sample/.
…1.0 (#4976)

* fix(sf): drop ServerQueryPort and BeaconPort removed in Satisfactory 1.0

Satisfactory 1.0+ uses port for the game (UDP) and the server API
(TCP), plus ReliablePort (TCP). -ServerQueryPort and -BeaconPort are no
longer used, but LinuxGSM still passed them and listed their ports in
details, so admins opened ports nothing listens on.

- Remove queryport/beaconport from sfserver _default.cfg and
  startparameters.
- details: list Game (UDP), Server API (TCP) and ReliableMessaging (TCP).
- queryport now follows port. Monitoring is session-only (querymode 1),
  so this doesn't change it.

Fixes #4967

* fix(sf): drop code comment
* fix(col): monitor Colony Survival with a TCP query

Colony Survival hosts with SteamOnline networking and doesn't answer
A2S (protocol-valve) queries on its UDP game port. Monitor always
failed the query and restarted a working server every few minutes.
The query port listens on TCP (details already shows it as TCP), so
use query mode 5 (TCP).

* fix(col): keep querytype set for the gamedig query modes

querytype is ignored by the TCP query, but an empty value would break
monitoring if querymode is switched back to a gamedig mode.
dgibbs64 and others added 29 commits October 31, 2026 20:07
monitor, backup and details call pgrep and ps, but no distro dependency
list included procps. Minimal images such as debian:13 do not ship it, so
on those systems pgrep is missing, the "is install running" check in
monitor always reads as true, and monitor exits with "LinuxGSM is
installing" without checking the server.

Add procps to the Debian and Ubuntu lists and procps-ng to the
RHEL-family lists.
The Debian 13 dependency list had libxml2 for bt, mta, sdtd and st, where
every other Debian and Ubuntu list has libxml2-utils. libxml2 is only the
library; xmllint is in libxml2-utils. Without it fn_info_game_xml prints
"xmllint: command not found" on every details and monitor run, and the
ports and names read from the XML config come out empty.

The RHEL-family lists keep libxml2, which ships xmllint there.
Matrix alerts are now sent as m.notice messages with an HTML
formatted_body: section headings are bold and the "Is my Game Server
Online?" and "More info" links are clickable. The plain-text body is
kept as the fallback for clients that do not render HTML.

All values are escaped with jq's @html before being placed in the
HTML, and apostrophes use the numeric &#39; entity.
Adds orarserver for OpenRA: Red Alert using the official stable Linux x86_64 AppImage. LinuxGSM extracts the package so installation does not require FUSE, manages start/stop, checks the TCP game port and updates from the upstream stable GitHub release.

Updates stage and validate the new package before replacing the old one, restoring the previous engine if the swap fails. Instance data is stored outside the replaceable engine directory. orar is added to the shared Update Check matrix.

Related to #2233.
Adds Luanti (formerly Minetest) as luantiserver, with installation, engine updates, details, session monitoring and graceful shutdown. Fresh installs include Minetest Game and a separate instance config; engine updates preserve games, mods, worlds and instance settings.

Uses the portable headless builds from rollerozxa/luantiserver, as recommended by the official Luanti Linux server documentation, selecting x86_64 or aarch64 assets and verifying SHA256 checksums. Adds dependency entries and the upstream game icon, with its attribution in a new Third-party assets section of LICENSE.md.

Fixes #2303
Adds Battlefront Eternal as a new server: bfeserver, shortname bfe. The server runs on Node.js 24, installed into serverfiles/node from nodejs.org and checked for updates on every update run. The retail game data comes from SteamCMD (app 1058020, needs an account that owns the game) and is prepared with the release's own tools.

Fixes #5112
)

npm install now skips its audit request, which was the only thing it waited on with gamedig already installed. npm update also skips it and gives up after one 10 second attempt per request instead of npm's default 5 minutes with 2 retries. It runs on every monitor with its output hidden, so a silent registry stalled monitor with no sign why.

Fixes #5127
* feat(fivemserver): add FiveM server

Adds FiveM (GTA V multiplayer, Cfx.re FXServer) as fivemserver.

- update_fivem.sh installs and updates the "recommended" Linux build from
  the Cfx.re changelog API, and tracks the installed build in a data file
  for check-update and update.
- Install fetches the base resources from citizenfx/cfx-server-data (a
  tarball of the default branch) once. Updates never touch resources.
- FXServer always starts with +exec server.cfg, so the bundled txAdmin web
  panel never starts and LinuxGSM is the only thing managing the server.
- licensekey in the LinuxGSM config is passed as +set sv_licenseKey.
  start and debug stop with a clear message if no key is set here or in
  server.cfg.
- Details parse server.cfg, and querying uses gamedig (gta5f).

* fix(fivemserver): only pass sv_licenseKey when licensekey is set

With licensekey empty, +set sv_licenseKey overrode a key set in server.cfg and would take the first extra parameter as its value. The +set is now only added when licensekey is set. Also adds extraparams and the Matrix alert settings to the default config.

* feat(fivemserver): set the license key in server.cfg only

Drops the licensekey LinuxGSM setting. The key now lives only in server.cfg as sv_licenseKey, so it is no longer on the command line. The start check, install message and default config point to server.cfg.
…5095)

Adds check_update_lock.sh, which stops a second update, force-update, validate or workshop-update from running while one is in progress. The lock is removed in core_exit.sh, and a lock left by a dead or reused PID is treated as stale.

Also fixes the SteamCMD retry loop: a failing base app no longer retries forever without an error, and the SteamCMD log is cleared before each attempt so a successful retry is not reported as failed.

Fixes #5094
Craftopia joins its install folder and the relative savePath from ServerSetting.ini with no separator, so saves went to serverfilesDedicatedServerSave beside serverfiles. A new pre-start fix (fix_ct.sh) moves an existing stray save folder into serverfiles and sets savePath to the absolute path. If saves exist in both places it warns and changes nothing, and an absolute savePath set by the owner is left alone.

Fixes #5130
backup only archived rootdir, so game data kept under the home directory was left out whenever rootdir is not the home directory, as in the Docker images. backup now adds, when outside rootdir and not reached through a symlink in it: savedir and servercfgdir for any game, plus the data folders of Project Zomboid, Don't Starve Together, 7 Days to Die, Craftopia, SCP:SL and Barotrauma. Caches and logs are left out.

The previous-backup exclusion is also matched by its path under rootdir, so a symlinked backup directory is not archived into the next backup, and the exclusion check no longer prints a spurious failure when backup stops a running server.

Fixes #3300
…#5136)

Closed issues are rarely given their sidebar fields: since 2024, 250 of
268 completed issues have no assignee, 258 no outcome label and 100 no
milestone.

Add a workflow that fills only missing values when an issue closes,
after Release Issues completes (its GITHUB_TOKEN closes fire no issues
events), and as a dry-run-by-default backfill:

- assignee dgibbs64
- outcome label from the close reason (completed, duplicate)
- issue type from the type: label
- milestone from the merged closing PR, else the first release whose
  tag contains the merge commit; left unset when none does
…#5136)

Closed issues are rarely given their sidebar fields: since 2024, 250 of
268 completed issues have no assignee, 258 no outcome label and 100 no
milestone.

Add a workflow that fills only missing values when an issue closes,
after Release Issues completes (its GITHUB_TOKEN closes fire no issues
events), and as a dry-run-by-default backfill:

- assignee dgibbs64
- outcome label from the close reason (completed, duplicate)
- issue type from the type: label
- milestone from the merged closing PR, else the first release whose
  tag contains the merge commit; left unset when none does
…s-master

feat(ci): fill assignee, outcome, type and milestone on closed issues (master)
…lopment (#5139)

Closing keywords never create a Development link on pull requests into develop, so the link has to be added by hand and was often missed. The check now compares the issues named after Fixes, Closes or Resolves with the pull request's closingIssuesReferences and fails on any issue that is not linked. Related to and no-issue pull requests still only warn.
The public branch of Source SDK Base 2013 Dedicated Server (244310) is
now the 2025 SDK update, which Zombie Master: Reborn b6.1 does not run
on: the server falls back to LAN mode and never answers queries.

Use the previous2021 branch (build 6982827), the engine ZMR was built
for.
…hip, permissions and names (#5146)

Point install_server_files.sh at rebuilt copies of 18 archives on
linuxgsm.download. Game content and versions are unchanged; the
rebuilds only remove files.

- Owner and group 0/0, numeric. Several archives were owned by uid 1000.
- Directories 0755, files 0644, ELF executables and shebang scripts 0755.
  Twelve archives were 0777 throughout and the MoHAA archive had 0700
  directories and a non-executable mohaa_lnxded.
- Windows and macOS only files removed (exe, dll, bat, url, lnk, reg,
  sys, dylib, Thumbs.db), plus uninstaller leftovers and stray logs.
- Client-only content removed: Quake 2 renderers, UT3 Direct3D shader
  caches, the MoHAA Windows client utilities, the iortcw pb directory,
  the UT2004 Windows GUI and macOS ucc.
- Sorted entries, no ./ prefix, xz -9e.
- Named <shortname>-<gameversion>-linux-<arch>-linuxgsm-YYYYMMDD.tar.xz.
  This also fixes the cod local_filename, which named 1.5 instead of 1.5b.

Repack the libncurses5 i386 library archive used by fix_bf1942 and
fix_bfv with the libraries at 0644, as Ubuntu ships them. The library
files are byte for byte the same.

The original archives stay hosted, so older releases keep working.
…5135)

Game log rotation on start only ran for unreal2, so servers that write a
single fixed game log (rust, ck, hw, ut3, cmw) overwrote the previous
run's log on every start or restart.

Rotate whenever the server config defines gamelogdate and the game log
file exists. Servers without gamelogdate, or whose games write their own
dated logs, are unchanged.

Log cleanup only pruned game logs for unreal2 and source. Other servers
now prune their rotated <selfname>-game-*.log files older than logdays.
The prune is limited to that name pattern at the top level of gamelogdir,
since some servers set gamelogdir to a game directory (stn uses
serverfiles).

Fixes #4751
A 3 second connect timeout is too short for slow or high-latency links:
DNS, TCP and TLS each need a round trip, so a 1 s RTT already fails.
Raise it to 10 seconds in both the bootstrap and core_dl.sh fetchers.

When a module download failed, fn_fetch_file called core_exit.sh, which
is itself fetched on demand. If core_exit.sh was not yet downloaded, its
fetch failed too and called core_exit.sh again, recursing forever
between GitHub and Bitbucket. fn_fetch_trap had the same recursion, so
CTRL+C could not break out. Exit directly when the file that failed is
core_exit.sh itself.

Fixes #4857
…hat supports it (#5148)

Rebuild the Battlefield 1942, Battlefield: Vietnam, Call of Duty 2,
Call of Duty: World at War, Quake 3, Quake 4, Soldier of Fortune 2 and
Wolfenstein: Enemy Territory archives so each has the same PunkBuster
layout, using the last PunkBuster release for that game. World at War
had no PunkBuster files before.

Each pb folder now holds only pbsv.so, the client and agent libraries,
the htm client update files, PB_EULA.txt, and pbns.dat where the game
has one. The empty dll folder, PunkBuster runtime files and leftover
logs, profiles and installers are removed. Every archive is repacked
with root ownership. Directories, server binaries and shell scripts
are 0755, and every other file, including the .so libraries, is 0644.
The Quake 4 and Enemy Territory launcher scripts now change to their
own directory instead of a fixed install path.

The archives use a new naming format,
<shortname>-<gameversion>-linux-i386-linuxgsm-<YYYYMMDD>.tar.xz.
The old names were the upstream package names. Battlefield 1942 is
still the 1.61 server patched to 1.612. The old archives stay on
linuxgsm.download, so older releases keep installing.
… newer (#5140)

* fix(punkbuster): start PunkBuster on CoD2 and WaW with glibc 2.41 and newer

The PunkBuster libraries have no PT_GNU_STACK header, so on i386 they
need an executable stack. The Call of Duty 2 and World at War server
binaries don't have one. Since glibc 2.41 the loader refuses to dlopen
such a library into a process without an executable stack, so
PunkBuster failed to start. Call of Duty 2 quietly reset sv_punkbuster
to 0, and World at War logged "Unable to initialize punkbuster".

Set GLIBC_TUNABLES=glibc.rtld.execstack=2 in fix_cod2.sh and a new
fix_codwaw.sh, which restores the old behaviour for the server process.
Older glibc versions ignore the setting.

* fix(wet): add sv_punkbuster 0 to the default start parameters

Every other Quake 3 engine server with PunkBuster has +set sv_punkbuster 0
in startparameters, so PunkBuster is turned on the same way everywhere.

* fix(core): allow executable stack libraries for sfc, ts, vs and ut on glibc 2.41 and newer

Glibc 2.41 and newer refuses to load a shared library that asks for an
executable stack, so these servers exit at start with "cannot enable
executable stack as shared object requires: Invalid argument".

- sfc: sfclassic/bin/server.so and server_srv.so have an RWE GNU_STACK.
- ts, vs: the GoldSrc mod libraries have no GNU_STACK header.
- ut: four UE4 server libraries have an RWE GNU_STACK.

Set glibc.rtld.execstack=2 in the pre-start fix for each, as for cod2 and
codwaw. ts and vs get new fix modules. ut joins the pre-start fixes, and
its chmod now only runs when the executable is not already executable.

* fix(ut): remove the chmod from the Unreal Tournament fix

The server binary is executable in both the original archive and the
rebuilt one, so the chmod never had anything to do. It also printed a raw
command instead of the usual fix messages. The fix now only sets the
execstack tunable, so ut no longer needs to run it after install.
The OldUnreal 469 patch uses ~/.utpg as a per-user directory on Linux
unless started with -nohomedir. Any ini the engine creates or saves
(mutator configs such as ACE or map vote, User.ini) was written to
~/.utpg/System instead of serverfiles/System, and ucc.log and the
per-match ngLog files went to ~/.utpg, where LinuxGSM never rotated them.

Start UT99 with -nohomedir, as ut2k4 and ut3 already do. A new pre-start
fix_ut99.sh moves any ini left in ~/.utpg/System into the System
directory so existing servers keep their settings. Those files were the
copies the server was reading, since 469 looks in the home directory
first; a stock file they replace is kept as a numbered backup.

Co-authored-by: dgibbs64 <dgibbs64@users.noreply.github.com>
#5132)

fn_check_file only set checkflag when the script log already existed. Running install or auto-install as root before the game user had installed left checkflag empty, so check_deps.sh skipped fetching the distro dependency CSV and reported dependency checking as unavailable.

Set checkflag regardless of the log state; only the log writes remain guarded.

Fixes #3774
Install and update QuakeWorld from dated qwserver-build releases with SHA-256 verification and staged bundle validation. Preserve existing configuration and scripts, track installed releases, and enable update and check-update commands.

Raise the MVDSV glibc requirement to 2.34.

Fixes #5143
Select the generic i386 glibc copy path for hlwon and cswon so the legacy
engine does not corrupt its startup command buffer and skip map loading.

Use corrected server archives that restore the original client DLLs needed
for the engine's client CRC check. Existing archive files are unchanged.

Fixes #5142
@un-boxing-man
un-boxing-man merged commit 0dfd59c into un-boxing-hosting:master Nov 5, 2026
1 check passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.