From a59d33ec0305a7cb8bdaed9a456a54146b437153 Mon Sep 17 00:00:00 2001 From: CroneKorkN Date: Wed, 29 Oct 2025 13:36:33 +0100 Subject: [PATCH] l4d overlay split scripts --- bundles/left4dead2/files/scripts/helpers | 38 ++++++ .../files/scripts/overlays/competitive_rework | 12 ++ .../files/scripts/overlays/l4d2center_maps | 128 ++++++++++++++++++ .../files/scripts/overlays/tickrate | 21 +++ .../left4dead2/files/scripts/overlays/vanilla | 16 +++ bundles/left4dead2/files/setup | 88 +----------- bundles/left4dead2/items.py | 27 +++- bundles/left4dead2/metadata.py | 1 + 8 files changed, 243 insertions(+), 88 deletions(-) create mode 100644 bundles/left4dead2/files/scripts/helpers create mode 100644 bundles/left4dead2/files/scripts/overlays/competitive_rework create mode 100644 bundles/left4dead2/files/scripts/overlays/l4d2center_maps create mode 100644 bundles/left4dead2/files/scripts/overlays/tickrate create mode 100644 bundles/left4dead2/files/scripts/overlays/vanilla diff --git a/bundles/left4dead2/files/scripts/helpers b/bundles/left4dead2/files/scripts/helpers new file mode 100644 index 0000000..429273d --- /dev/null +++ b/bundles/left4dead2/files/scripts/helpers @@ -0,0 +1,38 @@ +#!/bin/bash +set -xeuo pipefail + +function steam() { + # for systemd, so it can terminate the process (for other things sudo would have been enough) + setpriv --reuid=steam --regid=steam --init-groups "$@" <&0 + export HOME=/opt/l4d2/steam +} + +declare -A addons=( + [Ions_Vocalizer]=698857882 + [EMS_Admin_System]=1376314661 +) + +function install_addon() { + local overlay="$1" + local addon_name="$2" + local addon_id="${addons[${addon_name}]}" + steam mkdir -p "/opt/l4d2/overlays/${overlay}/left4dead2/addons" + test -f "/opt/l4d2/overlays/${overlay}/left4dead2/addons/${addon_id}.vpk" || \ + steam /opt/l4d2/steam-workshop-download "${addon_id}" --out "/opt/l4d2/overlays/${overlay}/left4dead2/addons" +} + +function install_admin_system() { + local overlay="$1" + install_addon "${overlay}" EMS_Admin_System + steam mkdir -p "/opt/l4d2/overlays/${overlay}/left4dead2/ems/admin system" + steam echo "STEAM_1:0:12376499" > "/opt/l4d2/overlays/${overlay}/left4dead2/ems/admin system/admins.txt" +} + +function install_tickrate_enabler() { + local overlay="$1" + steam mkdir -p "/opt/l4d2/overlays/${overlay}/left4dead2/addons" + for file in tickrate_enabler.dll tickrate_enabler.so tickrate_enabler.vdf + do + curl -L "https://github.com/SirPlease/L4D2-Competitive-Rework/raw/refs/heads/master/addons/${file}" -o "/opt/l4d2/overlays/${overlay}/left4dead2/addons/${file}" + done +} diff --git a/bundles/left4dead2/files/scripts/overlays/competitive_rework b/bundles/left4dead2/files/scripts/overlays/competitive_rework new file mode 100644 index 0000000..40ca676 --- /dev/null +++ b/bundles/left4dead2/files/scripts/overlays/competitive_rework @@ -0,0 +1,12 @@ +#!/bin/bash +set -xeuo pipefail +source /opt/l4d2/scripts/helpers +overlay=$(basename "$0") + +# https://github.com/SirPlease/L4D2-Competitive-Rework + +steam mkdir -p /opt/l4d2/overlays/$overlay + +steam mkdir -p /opt/l4d2/overlays/$overlay/left4dead2 +test -d /opt/l4d2/overlays/$overlay/left4dead2/cfg/cfgogl || \ + curl -L https://github.com/SirPlease/L4D2-Competitive-Rework/archive/refs/heads/master.tar.gz | steam tar -xz --strip-components=1 -C /opt/l4d2/overlays/$overlay/left4dead2 diff --git a/bundles/left4dead2/files/scripts/overlays/l4d2center_maps b/bundles/left4dead2/files/scripts/overlays/l4d2center_maps new file mode 100644 index 0000000..379328b --- /dev/null +++ b/bundles/left4dead2/files/scripts/overlays/l4d2center_maps @@ -0,0 +1,128 @@ +#!/bin/bash +set -xeuo pipefail +source /opt/l4d2/scripts/helpers +overlay=$(basename "$0") + +steam mkdir -p /opt/l4d2/overlays/$overlay/left4dead2/addons +cd /opt/l4d2/overlays/$overlay/left4dead2/addons + +# https://l4d2center.com/maps/servers/l4d2center_maps_sync.sh.txt -> + +# Exit immediately if a command exits with a non-zero status. +set -e + +# Function to print error messages +error_exit() { + echo "Error: $1" >&2 + exit 1 +} + +# Check if the current directory ends with /left4dead2/addons +current_dir=$(pwd) +expected_dir="/left4dead2/addons" + +if [[ ! "$current_dir" == *"$expected_dir" ]]; then + error_exit "Script must be run from your L4D2 \"addons\" folder. Current directory: $current_dir" +fi + +# Check for required commands +for cmd in curl md5sum 7z; do + if ! command -v "$cmd" >/dev/null 2>&1; then + error_exit "Required command '$cmd' is not installed. Please install it and retry." + fi +done + +# URL of the CSV file +CSV_URL="https://l4d2center.com/maps/servers/index.csv" + +# Temporary file to store CSV +TEMP_CSV=$(mktemp) + +# Ensure temporary file is removed on exit +trap 'rm -f "$TEMP_CSV"' EXIT + +echo "Downloading CSV from $CSV_URL..." +curl -sSL -o "$TEMP_CSV" "$CSV_URL" || error_exit "Failed to download CSV." + +declare -A map_md5 +declare -A map_links + +# Read CSV and populate associative arrays +{ + # Skip the first line (header) + IFS= read -r header + + while IFS=';' read -r Name Size MD5 DownloadLink || [[ $Name ]]; do + # Trim whitespace + Name=$(echo "$Name" | xargs) + MD5=$(echo "$MD5" | xargs) + DownloadLink=$(echo "$DownloadLink" | xargs) + + # Populate associative arrays + map_md5["$Name"]="$MD5" + map_links["$Name"]="$DownloadLink" + done +} < "$TEMP_CSV" + +# Get list of expected VPK files +expected_vpk=("${!map_md5[@]}") + +# Remove VPK files not in expected list or with mismatched MD5 +echo "Cleaning up existing VPK files..." +for file in *.vpk; do + # Check if it's a regular file + if [[ -f "$file" ]]; then + if [[ -z "${map_md5["$file"]}" ]]; then + echo "Removing unexpected file: $file" + rm -f "$file" + else + # Calculate MD5 + echo "Calculating MD5 for existing file: $file..." + current_md5=$(md5sum "$file" | awk '{print $1}') + expected_md5="${map_md5["$file"]}" + + if [[ "$current_md5" != "$expected_md5" ]]; then + echo "MD5 mismatch for $file. Removing." + rm -f "$file" + fi + fi + fi +done + +# Download and extract missing or updated VPK files +echo "Processing required VPK files..." +for vpk in "${expected_vpk[@]}"; do + if [[ ! -f "$vpk" ]]; then + echo "Downloading and extracting $vpk..." + download_url="${map_links["$vpk"]}" + + if [[ -z "$download_url" ]]; then + echo "No download link found for $vpk. Skipping." + continue + fi + + encoded_url=$(echo "$download_url" | sed 's/ /%20/g') + + # Download the .7z file to a temporary location + TEMP_7Z=$(mktemp --suffix=.7z) + curl -# -L -o "$TEMP_7Z" "$encoded_url" + + # Check if the download was successful + if [[ $? -ne 0 ]]; then + echo "Failed to download $download_url. Skipping." + rm -f "$TEMP_7Z" + continue + fi + + # Extract the .7z file + 7z x -y "$TEMP_7Z" || { echo "Failed to extract $TEMP_7Z. Skipping."; rm -f "$TEMP_7Z"; continue; } + + # Remove the temporary .7z file + rm -f "$TEMP_7Z" + + else + echo "$vpk is already up to date." + fi +done + +echo "Synchronization complete." diff --git a/bundles/left4dead2/files/scripts/overlays/tickrate b/bundles/left4dead2/files/scripts/overlays/tickrate new file mode 100644 index 0000000..9f253a3 --- /dev/null +++ b/bundles/left4dead2/files/scripts/overlays/tickrate @@ -0,0 +1,21 @@ +#!/bin/bash +set -xeuo pipefail +source /opt/l4d2/scripts/helpers +overlay=$(basename "$0") + +steam mkdir -p /opt/l4d2/overlays/$overlay + +# server config +steam mkdir -p /opt/l4d2/overlays/$overlay/left4dead2/cfg +steam cat <<'EOF' > /opt/l4d2/overlays/$overlay/left4dead2/cfg/server.cfg +# https://github.com/SirPlease/L4D2-Competitive-Rework/blob/7ecc3a32a5e2180d6607a40119ff2f3c072502a9/cfg/server.cfg#L58-L69 +sv_minrate 100000 +sv_maxrate 100000 +nb_update_frequency 0.014 +net_splitpacket_maxrate 50000 +net_maxcleartime 0.0001 +fps_max 0 +EOF + +# admin system +install_tickrate_enabler $overlay diff --git a/bundles/left4dead2/files/scripts/overlays/vanilla b/bundles/left4dead2/files/scripts/overlays/vanilla new file mode 100644 index 0000000..5dd1929 --- /dev/null +++ b/bundles/left4dead2/files/scripts/overlays/vanilla @@ -0,0 +1,16 @@ +#!/bin/bash +set -xeuo pipefail +source /opt/l4d2/scripts/helpers +overlay=$(basename "$0") + +steam mkdir -p /opt/l4d2/overlays/$overlay + +# server config +steam mkdir -p /opt/l4d2/overlays/$overlay/left4dead2/cfg +steam cat <<'EOF' > /opt/l4d2/overlays/$overlay/left4dead2/cfg/server.cfg +motd_enabled 0 +EOF + +# admin system +install_addon $overlay Ions_Vocalizer +install_admin_system $overlay \ No newline at end of file diff --git a/bundles/left4dead2/files/setup b/bundles/left4dead2/files/setup index d8d9d07..bd88380 100644 --- a/bundles/left4dead2/files/setup +++ b/bundles/left4dead2/files/setup @@ -10,36 +10,6 @@ function steam() { export HOME=/opt/l4d2/steam } -declare -A addons=( - [Ions_Vocalizer]=698857882 - [EMS_Admin_System]=1376314661 -) - -function install_addon() { - local overlay="$1" - local addon_name="$2" - local addon_id="${addons[${addon_name}]}" - steam mkdir -p "/opt/l4d2/overlays/${overlay}/left4dead2/addons" - test -f "/opt/l4d2/overlays/${overlay}/left4dead2/addons/${addon_id}.vpk" || \ - steam /opt/l4d2/steam-workshop-download "${addon_id}" --out "/opt/l4d2/overlays/${overlay}/left4dead2/addons" -} - -function install_admin_system() { - local overlay="$1" - install_addon "${overlay}" EMS_Admin_System - steam mkdir -p "/opt/l4d2/overlays/${overlay}/left4dead2/ems/admin system" - steam echo "STEAM_1:0:12376499" > "/opt/l4d2/overlays/${overlay}/left4dead2/ems/admin system/admins.txt" -} - -function install_tickrate_enabler() { - local overlay="$1" - steam mkdir -p "/opt/l4d2/overlays/${overlay}/left4dead2/addons" - for file in tickrate_enabler.dll tickrate_enabler.so tickrate_enabler.vdf - do - curl -L "https://github.com/SirPlease/L4D2-Competitive-Rework/raw/refs/heads/master/addons/${file}" -o "/opt/l4d2/overlays/${overlay}/left4dead2/addons/${file}" - done -} - # -- PREPARE SYSTEM -- # getent passwd steam >/dev/null || useradd -M -d /opt/l4d2 -s /bin/bash steam @@ -83,61 +53,9 @@ steam /opt/l4d2/steam/steamcmd.sh \ # -- OVERLAYS -- # -steam mkdir -p /opt/l4d2/overlays - -# workshop downloader -test -f /opt/l4d2/steam-workshop-download || \ - steam wget -4 https://git.sublimity.de/cronekorkn/steam-workshop-downloader/raw/branch/master/steam-workshop-download -P /opt/l4d2 -steam chmod +x /opt/l4d2/steam-workshop-download - -# -- OVERLAY VANILLA -- # - -steam mkdir -p /opt/l4d2/overlays/vanilla - -# server config -steam mkdir -p /opt/l4d2/overlays/vanilla/left4dead2/cfg -steam cat <<'EOF' > /opt/l4d2/overlays/vanilla/left4dead2/cfg/server.cfg -motd_enabled 0 - -EOF - -# admin system -install_addon vanilla Ions_Vocalizer -install_admin_system vanilla - -# -- OVERLAY TICKRATE -- # - -steam mkdir -p /opt/l4d2/overlays/tickrate - -# server config -steam mkdir -p /opt/l4d2/overlays/tickrate/left4dead2/cfg -steam cat <<'EOF' > /opt/l4d2/overlays/tickrate/left4dead2/cfg/server.cfg -# https://github.com/SirPlease/L4D2-Competitive-Rework/blob/7ecc3a32a5e2180d6607a40119ff2f3c072502a9/cfg/server.cfg#L58-L69 -sv_minrate 100000 -sv_maxrate 100000 -nb_update_frequency 0.014 -net_splitpacket_maxrate 50000 -net_maxcleartime 0.0001 -fps_max 0 -EOF - -# admin system -install_tickrate_enabler tickrate - -# -- OVERLAY COMPETITIVE REWORK WIP -- # - -# https://github.com/SirPlease/L4D2-Competitive-Rework - -steam mkdir -p /opt/l4d2/overlays/competitive_rework -steam mkdir -p /opt/l4d2/overlays/competitive_rework/left4dead2 -test -d /opt/l4d2/overlays/competitive_rework/left4dead2/cfg/cfgogl || \ - curl -L https://github.com/SirPlease/L4D2-Competitive-Rework/archive/refs/heads/master.tar.gz | steam tar -xz --strip-components=1 -C /opt/l4d2/overlays/competitive_rework/left4dead2 - -# if ! test -f /opt/l4d2/overlays/competitive_rework/left4dead2/cfg/server_original.cfg -# then -# steam mv /opt/l4d2/overlays/competitive_rework/left4dead2/cfg/server.cfg /opt/l4d2/overlays/competitive_rework/left4dead2/cfg/server_original.cfg -# steam echo -e "exec server_original.cfg\nsm_forcematch zonemod" > /opt/l4d2/overlays/competitive_rework/left4dead2/cfg/server.cfg -# fi +for overlay in /opt/l4d2/scripts/overlays/*; do + bash -xeuo pipefail "$overlay" +done # -- SERVERS -- # diff --git a/bundles/left4dead2/items.py b/bundles/left4dead2/items.py index 620baf6..29c55da 100644 --- a/bundles/left4dead2/items.py +++ b/bundles/left4dead2/items.py @@ -7,11 +7,16 @@ users = { directories = { '/opt/l4d2': { - 'owner': 'steam', - 'group': 'steam', + 'owner': 'steam', 'group': 'steam', }, '/opt/l4d2/configs': { - 'owner': 'steam', + 'owner': 'steam', 'group': 'steam', + }, + '/opt/l4d2/scripts': { + 'owner': 'steam', 'group': 'steam', + }, + '/opt/l4d2/scripts/overlays': { + 'owner': 'steam', 'group': 'steam', }, } @@ -29,8 +34,24 @@ files = { for server_name in node.metadata.get('left4dead2').keys() }, }, + '/opt/l4d2/scripts/helpers': { + 'source': 'scripts/helpers', + 'mode': '755', + 'triggers': { + 'svc_systemd:left4dead2-initialize.service:restart', + }, + }, } +for overlay in ['vanilla', 'tickrate', 'competitive_rework', 'l4d2center_maps']: + files[f'/opt/l4d2/scripts/overlays/{overlay}'] = { + 'source': f'scripts/overlays/{overlay}', + 'mode': '755', + 'triggers': { + 'svc_systemd:left4dead2-initialize.service:restart', + }, + } + svc_systemd = { 'left4dead2-initialize.service': { 'enabled': True, diff --git a/bundles/left4dead2/metadata.py b/bundles/left4dead2/metadata.py index 09698b8..c6a9a44 100644 --- a/bundles/left4dead2/metadata.py +++ b/bundles/left4dead2/metadata.py @@ -7,6 +7,7 @@ defaults = { 'libc6_i386': {}, # installs libc6:i386 'lib32z1': {}, 'unzip': {}, + 'p7zip-full': {}, # l4d2center_maps_sync.sh }, }, 'left4dead2': {},