* feat(etl): add downloader and update support for ET: Legacy
Refactors ET: Legacy to use a dedicated update module instead of hardcoded installation files. The new update_etl.sh module leverages the GitHub API to check for, download, and apply the latest builds from GameServerManagers/etlserver-build.
* feat(etl): add update_etl module to core modules
Registers the update_etl.sh module within the core modules to enable the fetching and execution of ET: Legacy updates.
* feat(etl): add update commands to core_getopt
Ensures that the update and check-update commands are available for ET: Legacy by including the etl shortname in the getopt command registration logic.
* feat(etl): improve local build detection
Updates the game log directory to the "legacy" folder and enhances local build detection by parsing etconsole.log for version information, falling back to build.txt if necessary.
* feat(etl): update glibc requirement and log path detection
Updates the minimum glibc requirement to 2.17 and switches the local build detection to use the gamelogdir variable instead of a hardcoded path.
* feat(etl): improve MD5 hash extraction
Updates the MD5 hash parsing to use a specific regex for 32-character hexadecimal strings, providing a more robust extraction from the release body than relying on the last field of the line.
* feat(xnt): add SHA512 hash extraction for remote builds
Updates the Xonotic update module to fetch the SHA512 hash from the remote download server, allowing for build verification and identification.
* fix(xnt): derive sha512 URL from remotebuildfilename not remotebuildtag
Tag format is xonotic-v0.8.6 but the sha512 file is named xonotic-0.8.6.sha512
(without the v). Using remotebuildtag directly produced a 404. Deriving from
remotebuildfilename (which already has the v stripped by tr -d v) gives the
correct URL.
* fix(core_dl): fix zip extraction with extractsrc across devices and non-empty dirs
Using mv to move extracted directories fails in two cases:
- Cross-device moves (e.g. tmp and serverfiles on different Docker volumes)
- Target directory already exists and is non-empty (update scenario)
Replace find+mv with cp -a which handles both cases by copying recursively
and merging into the destination. Also replace the hardcoded 'Xonotic'
temp_extractdir with ${extractsrc} to be generic.
* fix(core_dl): remove duplicate ellipsis in hash verification message