Compare commits
9 commits
master
...
htz.mails_
| Author | SHA1 | Date | |
|---|---|---|---|
| 057271c26a | |||
| 27171bcd4c | |||
| cc7a0f1c76 | |||
| 94a51b0a8b | |||
| 85bcc5bf5b | |||
| 54bb300f17 | |||
| 26b14d3ebc | |||
| c5178b1c74 | |||
| cc8d975188 |
39 changed files with 346 additions and 1408 deletions
1
.gitignore
vendored
1
.gitignore
vendored
|
|
@ -2,4 +2,3 @@
|
||||||
.venv
|
.venv
|
||||||
.cache
|
.cache
|
||||||
*.pyc
|
*.pyc
|
||||||
.bw_debug_history
|
|
||||||
|
|
@ -112,11 +112,6 @@ def process_recording(filename):
|
||||||
|
|
||||||
sample_num += samples_per_block - overlapping_samples
|
sample_num += samples_per_block - overlapping_samples
|
||||||
|
|
||||||
# move to PROCESSED_RECORDINGS_DIR
|
|
||||||
|
|
||||||
os.makedirs(PROCESSED_RECORDINGS_DIR, exist_ok=True)
|
|
||||||
shutil.move(os.path.join(RECORDINGS_DIR, filename), os.path.join(PROCESSED_RECORDINGS_DIR, filename))
|
|
||||||
|
|
||||||
|
|
||||||
# write a spectrogram using the sound from start to end of the event
|
# write a spectrogram using the sound from start to end of the event
|
||||||
def write_event(current_event, soundfile, samplerate):
|
def write_event(current_event, soundfile, samplerate):
|
||||||
|
|
|
||||||
|
|
@ -19,7 +19,5 @@ do
|
||||||
-t "3600" \
|
-t "3600" \
|
||||||
-c:a flac \
|
-c:a flac \
|
||||||
-compression_level 12 \
|
-compression_level 12 \
|
||||||
"recordings/current/$DATE.flac"
|
"recordings/$DATE.flac"
|
||||||
|
|
||||||
mv "recordings/current/$DATE.flac" "recordings/$DATE.flac"
|
|
||||||
done
|
done
|
||||||
|
|
|
||||||
|
|
@ -8,7 +8,7 @@ urllib3.disable_warnings()
|
||||||
import os
|
import os
|
||||||
|
|
||||||
|
|
||||||
HUE_IP = "${hue_ip}" # replace with your bridge IP
|
HUE_IP = "10.0.0.134" # replace with your bridge IP
|
||||||
HUE_APP_KEY = "${hue_app_key}" # local only
|
HUE_APP_KEY = "${hue_app_key}" # local only
|
||||||
HUE_DEVICE_ID = "31f58786-3242-4e88-b9ce-23f44ba27bbe"
|
HUE_DEVICE_ID = "31f58786-3242-4e88-b9ce-23f44ba27bbe"
|
||||||
TEMPERATURE_LOG_DIR = "/opt/bootshorn/temperatures"
|
TEMPERATURE_LOG_DIR = "/opt/bootshorn/temperatures"
|
||||||
|
|
|
||||||
|
|
@ -7,15 +7,11 @@ directories = {
|
||||||
'owner': 'ckn',
|
'owner': 'ckn',
|
||||||
'group': 'ckn',
|
'group': 'ckn',
|
||||||
},
|
},
|
||||||
'/opt/bootshorn/temperatures': {
|
|
||||||
'owner': 'ckn',
|
|
||||||
'group': 'ckn',
|
|
||||||
},
|
|
||||||
'/opt/bootshorn/recordings': {
|
'/opt/bootshorn/recordings': {
|
||||||
'owner': 'ckn',
|
'owner': 'ckn',
|
||||||
'group': 'ckn',
|
'group': 'ckn',
|
||||||
},
|
},
|
||||||
'/opt/bootshorn/recordings/current': {
|
'/opt/bootshorn/temperatures': {
|
||||||
'owner': 'ckn',
|
'owner': 'ckn',
|
||||||
'group': 'ckn',
|
'group': 'ckn',
|
||||||
},
|
},
|
||||||
|
|
@ -38,7 +34,6 @@ files = {
|
||||||
'/opt/bootshorn/temperature': {
|
'/opt/bootshorn/temperature': {
|
||||||
'content_type': 'mako',
|
'content_type': 'mako',
|
||||||
'context': {
|
'context': {
|
||||||
'hue_ip': repo.get_node('home.hue').hostname,
|
|
||||||
'hue_app_key': repo.vault.decrypt('encrypt$gAAAAABoc2WxZCLbxl-Z4IrSC97CdOeFgBplr9Fp5ujpd0WCCCPNBUY_WquHN86z8hKLq5Y04dwq8TdJW0PMSOSgTFbGgdp_P1q0jOBLEKaW9IIT1YM88h-JYwLf9QGDV_5oEfvnBCtO'),
|
'hue_app_key': repo.vault.decrypt('encrypt$gAAAAABoc2WxZCLbxl-Z4IrSC97CdOeFgBplr9Fp5ujpd0WCCCPNBUY_WquHN86z8hKLq5Y04dwq8TdJW0PMSOSgTFbGgdp_P1q0jOBLEKaW9IIT1YM88h-JYwLf9QGDV_5oEfvnBCtO'),
|
||||||
},
|
},
|
||||||
'owner': 'ckn',
|
'owner': 'ckn',
|
||||||
|
|
|
||||||
|
|
@ -1 +1,58 @@
|
||||||
https://github.com/SirPlease/L4D2-Competitive-Rework/blob/master/Dedicated%20Server%20Install%20Guide/README.md
|
https://developer.valvesoftware.com/wiki/List_of_L4D2_Cvars
|
||||||
|
|
||||||
|
Dead Center c1m1_hotel
|
||||||
|
Dead Center c1m2_streets
|
||||||
|
Dead Center c1m3_mall
|
||||||
|
Dead Center c1m4_atrium
|
||||||
|
Dark Carnival c2m1_highway
|
||||||
|
Dark Carnival c2m2_fairgrounds
|
||||||
|
Dark Carnival c2m3_coaster
|
||||||
|
Dark Carnival c2m4_barns
|
||||||
|
Dark Carnival c2m5_concert
|
||||||
|
Swamp Fever c3m1_plankcountry
|
||||||
|
Swamp Fever c3m2_swamp
|
||||||
|
Swamp Fever c3m3_shantytown
|
||||||
|
Swamp Fever c3m4_plantation
|
||||||
|
Hard Rain c4m1_milltown_a
|
||||||
|
Hard Rain c4m2_sugarmill_a
|
||||||
|
Hard Rain c4m3_sugarmill_b
|
||||||
|
Hard Rain c4m4_milltown_b
|
||||||
|
Hard Rain c4m5_milltown_escape
|
||||||
|
The Parish c5m1_waterfront_sndscape
|
||||||
|
The Parish c5m1_waterfront
|
||||||
|
The Parish c5m2_park
|
||||||
|
The Parish c5m3_cemetery
|
||||||
|
The Parish c5m4_quarter
|
||||||
|
The Parish c5m5_bridge
|
||||||
|
The Passing c6m1_riverbank
|
||||||
|
The Passing c6m2_bedlam
|
||||||
|
The Passing c6m3_port
|
||||||
|
The Sacrifice c7m1_docks
|
||||||
|
The Sacrifice c7m2_barge
|
||||||
|
The Sacrifice c7m3_port
|
||||||
|
No Mercy c8m1_apartment
|
||||||
|
No Mercy c8m2_subway
|
||||||
|
No Mercy c8m3_sewers
|
||||||
|
No Mercy c8m4_interior
|
||||||
|
No Mercy c8m5_rooftop
|
||||||
|
Crash Course c9m1_alleys
|
||||||
|
Crash Course c9m2_lots
|
||||||
|
Death Toll c10m1_caves
|
||||||
|
Death Toll c10m2_drainage
|
||||||
|
Death Toll c10m3_ranchhouse
|
||||||
|
Death Toll c10m4_mainstreet
|
||||||
|
Death Toll c10m5_houseboat
|
||||||
|
Dead Air c11m1_greenhouse
|
||||||
|
Dead Air c11m2_offices
|
||||||
|
Dead Air c11m3_garage
|
||||||
|
Dead Air c11m4_terminal
|
||||||
|
Dead Air c11m5_runway
|
||||||
|
Blood Harvest c12m1_hilltop
|
||||||
|
Blood Harvest c12m2_traintunnel
|
||||||
|
Blood Harvest c12m3_bridge
|
||||||
|
Blood Harvest c12m4_barn
|
||||||
|
Blood Harvest c12m5_cornfield
|
||||||
|
Cold Stream c13m1_alpinecreek
|
||||||
|
Cold Stream c13m2_southpinestream
|
||||||
|
Cold Stream c13m3_memorialbridge
|
||||||
|
Cold Stream c13m4_cutthroatcreek
|
||||||
|
|
|
||||||
|
|
@ -1,13 +0,0 @@
|
||||||
#!/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
|
|
||||||
}
|
|
||||||
|
|
||||||
function workshop() {
|
|
||||||
steam mkdir -p "/opt/l4d2/overlays/${overlay}/left4dead2/addons"
|
|
||||||
steam /opt/l4d2/scripts/steam-workshop-download --out "/opt/l4d2/overlays/${overlay}/left4dead2/addons" "$@"
|
|
||||||
}
|
|
||||||
|
|
@ -1,10 +0,0 @@
|
||||||
#!/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/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
|
|
||||||
|
|
@ -1,128 +0,0 @@
|
||||||
#!/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."
|
|
||||||
|
|
@ -1,25 +0,0 @@
|
||||||
#!/bin/bash
|
|
||||||
set -xeuo pipefail
|
|
||||||
source /opt/l4d2/scripts/helpers
|
|
||||||
overlay=$(basename "$0")
|
|
||||||
|
|
||||||
# server config
|
|
||||||
# https://github.com/SirPlease/L4D2-Competitive-Rework/blob/7ecc3a32a5e2180d6607a40119ff2f3c072502a9/cfg/server.cfg#L58-L69
|
|
||||||
# https://www.programmersought.com/article/513810199514/
|
|
||||||
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
|
|
||||||
|
|
||||||
# install tickrate enabler
|
|
||||||
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
|
|
||||||
|
|
@ -1,12 +0,0 @@
|
||||||
#!/bin/bash
|
|
||||||
set -xeuo pipefail
|
|
||||||
source /opt/l4d2/scripts/helpers
|
|
||||||
overlay=$(basename "$0")
|
|
||||||
|
|
||||||
# Ions Vocalizer
|
|
||||||
workshop -i 698857882
|
|
||||||
|
|
||||||
# admin system
|
|
||||||
workshop --item 2524204971
|
|
||||||
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"
|
|
||||||
|
|
@ -1,6 +0,0 @@
|
||||||
#!/bin/bash
|
|
||||||
set -xeuo pipefail
|
|
||||||
source /opt/l4d2/scripts/helpers
|
|
||||||
overlay=$(basename "$0")
|
|
||||||
|
|
||||||
workshop --collection 121115793 # Back To School
|
|
||||||
|
|
@ -1,13 +1,40 @@
|
||||||
// defaults
|
hostname "CroneKorkN : ${name}"
|
||||||
hostname ${server_name}
|
sv_contact "admin@sublimity.de"
|
||||||
|
|
||||||
|
|
||||||
|
sv_steamgroup "${','.join(steamgroups)}"
|
||||||
|
|
||||||
|
rcon_password "${rcon_password}"
|
||||||
|
|
||||||
|
|
||||||
motd_enabled 0
|
motd_enabled 0
|
||||||
rcon_password ${rcon_password}
|
|
||||||
sv_steamgroup "38347879"
|
|
||||||
|
|
||||||
mp_autoteambalance 0
|
|
||||||
sv_forcepreload 1
|
|
||||||
|
|
||||||
// server specific
|
sv_cheats 1
|
||||||
% for line in config:
|
|
||||||
${line}
|
|
||||||
% endfor
|
sv_consistency 0
|
||||||
|
|
||||||
|
|
||||||
|
sv_lan 0
|
||||||
|
|
||||||
|
|
||||||
|
sv_allow_lobby_connect_only 0
|
||||||
|
|
||||||
|
|
||||||
|
sv_gametypes "coop,realism,survival,versus,teamversus,scavenge,teamscavenge"
|
||||||
|
|
||||||
|
|
||||||
|
sv_minrate 30000
|
||||||
|
sv_maxrate 60000
|
||||||
|
sv_mincmdrate 66
|
||||||
|
sv_maxcmdrate 101
|
||||||
|
|
||||||
|
|
||||||
|
sv_logsdir "logs-${name}" //Folder in the game directory where server logs will be stored.
|
||||||
|
log on //Creates a logfile (on | off)
|
||||||
|
sv_logecho 0 //default 0; Echo log information to the console.
|
||||||
|
sv_logfile 1 //default 1; Log server information in the log file.
|
||||||
|
sv_log_onefile 0 //default 0; Log server information to only one file.
|
||||||
|
sv_logbans 1 //default 0;Log server bans in the server logs.
|
||||||
|
sv_logflush 0 //default 0; Flush the log files to disk on each write (slow).
|
||||||
|
|
|
||||||
|
|
@ -1,72 +0,0 @@
|
||||||
#!/bin/bash
|
|
||||||
|
|
||||||
set -xeuo pipefail
|
|
||||||
|
|
||||||
# -- DEFINE FUNCTIONS AND VARIABLES -- #
|
|
||||||
|
|
||||||
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
|
|
||||||
}
|
|
||||||
|
|
||||||
# -- PREPARE SYSTEM -- #
|
|
||||||
|
|
||||||
getent passwd steam >/dev/null || useradd -M -d /opt/l4d2 -s /bin/bash steam
|
|
||||||
mkdir -p /opt/l4d2 /tmp/dumps
|
|
||||||
chown steam:steam /opt/l4d2 /tmp/dumps
|
|
||||||
dpkg --add-architecture i386
|
|
||||||
apt update
|
|
||||||
DEBIAN_FRONTEND=noninteractive apt install -y libc6:i386 lib32z1
|
|
||||||
|
|
||||||
# workshop downloader
|
|
||||||
test -f /opt/l4d2/scripts/steam-workshop-download || \
|
|
||||||
steam wget -4 https://git.sublimity.de/cronekorkn/steam-workshop-downloader/raw/branch/master/steam-workshop-download -P /opt/l4d2/scripts
|
|
||||||
steam chmod +x /opt/l4d2/scripts/steam-workshop-download
|
|
||||||
|
|
||||||
# -- STEAM -- #
|
|
||||||
|
|
||||||
steam mkdir -p /opt/l4d2/steam
|
|
||||||
test -f /opt/l4d2/steam/steamcmd_linux.tar.gz || \
|
|
||||||
steam wget http://media.steampowered.com/installer/steamcmd_linux.tar.gz -P /opt/l4d2/steam
|
|
||||||
test -f /opt/l4d2/steam/steamcmd.sh || \
|
|
||||||
steam tar -xvzf /opt/l4d2/steam/steamcmd_linux.tar.gz -C /opt/l4d2/steam
|
|
||||||
|
|
||||||
# fix for: /opt/l4d2/.steam/sdk32/steamclient.so: cannot open shared object file: No such file or directory
|
|
||||||
steam mkdir -p /opt/l4d2/steam/.steam # needs to be in steam users home dir
|
|
||||||
readlink /opt/l4d2/steam/.steam/sdk32 | grep -q ^/opt/l4d2/steam/linux32$ || \
|
|
||||||
steam ln -sf /opt/l4d2/steam/linux32 /opt/l4d2/steam/.steam/sdk32
|
|
||||||
readlink /opt/l4d2/steam/.steam/sdk64 | grep -q ^/opt/l4d2/steam/linux64$ || \
|
|
||||||
steam ln -sf /opt/l4d2/steam/linux64 /opt/l4d2/steam/.steam/sdk64
|
|
||||||
|
|
||||||
# -- INSTALL -- #
|
|
||||||
|
|
||||||
# erst die windows deps zu installieren scheint ein workaround für x64 zu sein?
|
|
||||||
steam mkdir -p /opt/l4d2/installation
|
|
||||||
steam /opt/l4d2/steam/steamcmd.sh \
|
|
||||||
+force_install_dir /opt/l4d2/installation \
|
|
||||||
+login anonymous \
|
|
||||||
+@sSteamCmdForcePlatformType windows \
|
|
||||||
+app_update 222860 validate \
|
|
||||||
+quit
|
|
||||||
steam /opt/l4d2/steam/steamcmd.sh \
|
|
||||||
+force_install_dir /opt/l4d2/installation \
|
|
||||||
+login anonymous \
|
|
||||||
+@sSteamCmdForcePlatformType linux \
|
|
||||||
+app_update 222860 validate \
|
|
||||||
+quit
|
|
||||||
|
|
||||||
# -- OVERLAYS -- #
|
|
||||||
|
|
||||||
for overlay_path in /opt/l4d2/scripts/overlays/*; do
|
|
||||||
overlay=$(basename "$overlay_path")
|
|
||||||
steam mkdir -p /opt/l4d2/overlays/$overlay
|
|
||||||
bash -xeuo pipefail "$overlay_path"
|
|
||||||
test -f /opt/l4d2/overlays/$overlay/left4dead2/cfg/server.cfg && \
|
|
||||||
steam cp /opt/l4d2/overlays/$overlay/left4dead2/cfg/server.cfg /opt/l4d2/overlays/$overlay/left4dead2/cfg/server_$overlay.cfg
|
|
||||||
done
|
|
||||||
|
|
||||||
# -- SERVERS -- #
|
|
||||||
|
|
||||||
#steam rm -rf /opt/l4d2/servers
|
|
||||||
steam mkdir -p /opt/l4d2/servers
|
|
||||||
|
|
@ -1,75 +0,0 @@
|
||||||
#!/bin/bash
|
|
||||||
|
|
||||||
set -xeuo pipefail
|
|
||||||
|
|
||||||
name=""
|
|
||||||
port=""
|
|
||||||
configfile=""
|
|
||||||
overlays=""
|
|
||||||
arguments=""
|
|
||||||
|
|
||||||
while [[ $# -gt 0 ]]; do
|
|
||||||
case "$1" in
|
|
||||||
-n|--name)
|
|
||||||
name="$2"; shift 2
|
|
||||||
;;
|
|
||||||
-p|--port)
|
|
||||||
port="$2"; shift 2
|
|
||||||
;;
|
|
||||||
-c|--config)
|
|
||||||
configfile="$2"; shift 2
|
|
||||||
;;
|
|
||||||
-o|--overlay)
|
|
||||||
overlays="/opt/l4d2/overlays/$2:$overlays"; shift 2
|
|
||||||
;;
|
|
||||||
--)
|
|
||||||
shift
|
|
||||||
arguments+="$@"
|
|
||||||
break
|
|
||||||
;;
|
|
||||||
*)
|
|
||||||
echo "ERROR: unknown argument $1"; exit 1
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
done
|
|
||||||
|
|
||||||
[[ -n "${name}" ]] || { echo "ERROR: -n/--name missing"; exit 1; }
|
|
||||||
[[ -n "${port}" ]] || { echo "ERROR: -p/--port missing"; exit 1; }
|
|
||||||
|
|
||||||
# -- HELPER FUNCTIONS -- #
|
|
||||||
|
|
||||||
function steam() {
|
|
||||||
# für systemd, damit es den prozess beenden kann
|
|
||||||
setpriv --reuid=steam --regid=steam --init-groups "$@"
|
|
||||||
export HOME=/opt/l4d2/steam
|
|
||||||
}
|
|
||||||
|
|
||||||
# -- TIDY UP -- #
|
|
||||||
|
|
||||||
mountpoint -q "/opt/l4d2/servers/$name/merged" && umount "/opt/l4d2/servers/$name/merged"
|
|
||||||
steam rm -rf "/opt/l4d2/servers/$name"
|
|
||||||
|
|
||||||
# -- CREATE DIRECTORIES -- #
|
|
||||||
|
|
||||||
steam mkdir -p \
|
|
||||||
"/opt/l4d2/servers/$name" \
|
|
||||||
"/opt/l4d2/servers/$name/work" \
|
|
||||||
"/opt/l4d2/servers/$name/upper" \
|
|
||||||
"/opt/l4d2/servers/$name/merged"
|
|
||||||
|
|
||||||
# -- MOUNT OVERLAYFS -- #
|
|
||||||
|
|
||||||
mount -t overlay overlay \
|
|
||||||
-o "lowerdir=$overlays/opt/l4d2/installation,upperdir=/opt/l4d2/servers/$name/upper,workdir=/opt/l4d2/servers/$name/work" \
|
|
||||||
"/opt/l4d2/servers/$name/merged"
|
|
||||||
|
|
||||||
# -- REPLACE SERVER.CFG -- #
|
|
||||||
|
|
||||||
if [[ -n "$configfile" ]]; then
|
|
||||||
cp "$configfile" "/opt/l4d2/servers/$name/merged/left4dead2/cfg/server.cfg"
|
|
||||||
chown steam:steam "/opt/l4d2/servers/$name/merged/left4dead2/cfg/server.cfg"
|
|
||||||
fi
|
|
||||||
|
|
||||||
# -- RUN L4D2 -- #
|
|
||||||
|
|
||||||
steam "/opt/l4d2/servers/$name/merged/srcds_run" -norestart -pidfile "/opt/l4d2/servers/$name/pid" -game left4dead2 -ip 0.0.0.0 -port "$port" +hostname "Crone_$name" +map c1m1_hotel $arguments
|
|
||||||
|
|
@ -1,19 +0,0 @@
|
||||||
#!/bin/bash
|
|
||||||
|
|
||||||
set -xeuo pipefail
|
|
||||||
|
|
||||||
name=""
|
|
||||||
|
|
||||||
while [[ $# -gt 0 ]]; do
|
|
||||||
case "$1" in
|
|
||||||
-n|--name)
|
|
||||||
name="$2"; shift 2
|
|
||||||
;;
|
|
||||||
*)
|
|
||||||
echo "ERROR: unknown argument $1"; exit 1
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
done
|
|
||||||
|
|
||||||
mountpoint -q "/opt/l4d2/servers/$name/merged" && umount "/opt/l4d2/servers/$name/merged"
|
|
||||||
steam rm -rf "/opt/l4d2/servers/$name"
|
|
||||||
|
|
@ -1,104 +1,122 @@
|
||||||
users = {
|
assert node.has_bundle('steam') and node.has_bundle('steam-workshop-download')
|
||||||
'steam': {
|
|
||||||
'home': '/opt/l4d2/steam',
|
|
||||||
'shell': '/bin/bash',
|
|
||||||
},
|
|
||||||
}
|
|
||||||
|
|
||||||
directories = {
|
directories = {
|
||||||
'/opt/l4d2': {
|
'/opt/steam/left4dead2-servers': {
|
||||||
'owner': 'steam', 'group': 'steam',
|
'owner': 'steam',
|
||||||
},
|
'group': 'steam',
|
||||||
'/opt/l4d2/steam': {
|
'mode': '0755',
|
||||||
'owner': 'steam', 'group': 'steam',
|
|
||||||
},
|
|
||||||
'/opt/l4d2/configs': {
|
|
||||||
'owner': 'steam', 'group': 'steam',
|
|
||||||
'purge': True,
|
'purge': True,
|
||||||
},
|
},
|
||||||
'/opt/l4d2/scripts': {
|
# Current zfs doesnt support zfs upperdir. The support was added in October 2022. Move upperdir - unused anyway -
|
||||||
'owner': 'steam', 'group': 'steam',
|
# to another dir. Also move workdir alongside it, as it has to be on same fs.
|
||||||
},
|
'/opt/steam-zfs-overlay-workarounds': {
|
||||||
'/opt/l4d2/scripts/overlays': {
|
'owner': 'steam',
|
||||||
'owner': 'steam', 'group': 'steam',
|
'group': 'steam',
|
||||||
|
'mode': '0755',
|
||||||
'purge': True,
|
'purge': True,
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
files = {
|
# /opt/steam/steam/.steam/sdk32/steamclient.so: cannot open shared object file: No such file or directory
|
||||||
'/opt/l4d2/setup': {
|
symlinks = {
|
||||||
'mode': '755',
|
'/opt/steam/steam/.steam/sdk32': {
|
||||||
'triggers': {
|
'target': '/opt/steam/steam/linux32',
|
||||||
'svc_systemd:left4dead2-initialize.service:restart',
|
'owner': 'steam',
|
||||||
},
|
'group': 'steam',
|
||||||
},
|
}
|
||||||
'/opt/l4d2/start': {
|
|
||||||
'mode': '755',
|
|
||||||
'triggers': {
|
|
||||||
f'svc_systemd:left4dead2-{server_name}.service:restart'
|
|
||||||
for server_name in node.metadata.get('left4dead2/servers').keys()
|
|
||||||
},
|
|
||||||
},
|
|
||||||
'/opt/l4d2/stop': {
|
|
||||||
'mode': '755',
|
|
||||||
'triggers': {
|
|
||||||
f'svc_systemd:left4dead2-{server_name}.service:restart'
|
|
||||||
for server_name in node.metadata.get('left4dead2/servers').keys()
|
|
||||||
},
|
|
||||||
},
|
|
||||||
'/opt/l4d2/scripts/helpers': {
|
|
||||||
'source': 'scripts/helpers',
|
|
||||||
'mode': '755',
|
|
||||||
'triggers': {
|
|
||||||
'svc_systemd:left4dead2-initialize.service:restart',
|
|
||||||
},
|
|
||||||
},
|
|
||||||
}
|
}
|
||||||
|
|
||||||
for overlay in node.metadata.get('left4dead2/overlays'):
|
#
|
||||||
files[f'/opt/l4d2/scripts/overlays/{overlay}'] = {
|
# SERVERS
|
||||||
'source': f'scripts/overlays/{overlay}',
|
#
|
||||||
'mode': '755',
|
|
||||||
'triggers': {
|
for name, config in node.metadata.get('left4dead2/servers').items():
|
||||||
'svc_systemd:left4dead2-initialize.service:restart',
|
|
||||||
},
|
#overlay
|
||||||
|
directories[f'/opt/steam/left4dead2-servers/{name}'] = {
|
||||||
|
'owner': 'steam',
|
||||||
|
'group': 'steam',
|
||||||
|
}
|
||||||
|
directories[f'/opt/steam-zfs-overlay-workarounds/{name}/upper'] = {
|
||||||
|
'owner': 'steam',
|
||||||
|
'group': 'steam',
|
||||||
|
}
|
||||||
|
directories[f'/opt/steam-zfs-overlay-workarounds/{name}/workdir'] = {
|
||||||
|
'owner': 'steam',
|
||||||
|
'group': 'steam',
|
||||||
}
|
}
|
||||||
|
|
||||||
svc_systemd = {
|
# conf
|
||||||
'left4dead2-initialize.service': {
|
files[f'/opt/steam/left4dead2-servers/{name}/left4dead2/cfg/server.cfg'] = {
|
||||||
'enabled': True,
|
|
||||||
'running': None,
|
|
||||||
'needs': {
|
|
||||||
'file:/opt/l4d2/setup',
|
|
||||||
'file:/usr/local/lib/systemd/system/left4dead2-initialize.service',
|
|
||||||
},
|
|
||||||
},
|
|
||||||
}
|
|
||||||
|
|
||||||
for server_name, config in node.metadata.get('left4dead2/servers').items():
|
|
||||||
files[f'/opt/l4d2/configs/{server_name}.cfg'] = {
|
|
||||||
'source': 'server.cfg',
|
|
||||||
'content_type': 'mako',
|
'content_type': 'mako',
|
||||||
|
'source': 'server.cfg',
|
||||||
'context': {
|
'context': {
|
||||||
'server_name': server_name,
|
'name': name,
|
||||||
'rcon_password': repo.vault.decrypt('encrypt$gAAAAABpAdZhxwJ47I1AXotuZmBvyZP1ecVTt9IXFkLI28JiVS74LKs9QdgIBz-FC-iXtIHHh_GVGxxKQZprn4UrXZcvZ57kCKxfHBs3cE2JiGnbWE8_mfs=').value,
|
'steamgroups': node.metadata.get('left4dead2/steamgroups'),
|
||||||
'config': config.get('config', []),
|
'rcon_password': config['rcon_password'],
|
||||||
},
|
},
|
||||||
'owner': 'steam',
|
'owner': 'steam',
|
||||||
'mode': '644',
|
'group': 'steam',
|
||||||
'triggers': {
|
'triggers': [
|
||||||
f'svc_systemd:left4dead2-{server_name}.service:restart',
|
f'svc_systemd:left4dead2-{name}.service:restart',
|
||||||
},
|
],
|
||||||
}
|
}
|
||||||
|
|
||||||
svc_systemd[f'left4dead2-{server_name}.service'] = {
|
# service
|
||||||
'enabled': True,
|
svc_systemd[f'left4dead2-{name}.service'] = {
|
||||||
'running': True,
|
'needs': [
|
||||||
'tags': {
|
f'file:/opt/steam/left4dead2-servers/{name}/left4dead2/cfg/server.cfg',
|
||||||
'left4dead2-servers',
|
f'file:/usr/local/lib/systemd/system/left4dead2-{name}.service',
|
||||||
},
|
],
|
||||||
'needs': {
|
}
|
||||||
'svc_systemd:left4dead2-initialize.service',
|
|
||||||
f'file:/usr/local/lib/systemd/system/left4dead2-{server_name}.service',
|
#
|
||||||
},
|
# ADDONS
|
||||||
|
#
|
||||||
|
|
||||||
|
# base
|
||||||
|
files[f'/opt/steam/left4dead2-servers/{name}/left4dead2/addons/readme.txt'] = {
|
||||||
|
'content_type': 'any',
|
||||||
|
'owner': 'steam',
|
||||||
|
'group': 'steam',
|
||||||
|
}
|
||||||
|
directories[f'/opt/steam/left4dead2-servers/{name}/left4dead2/addons'] = {
|
||||||
|
'owner': 'steam',
|
||||||
|
'group': 'steam',
|
||||||
|
'purge': True,
|
||||||
|
'triggers': [
|
||||||
|
f'svc_systemd:left4dead2-{name}.service:restart',
|
||||||
|
],
|
||||||
|
}
|
||||||
|
for id in [
|
||||||
|
*config.get('workshop', []),
|
||||||
|
*node.metadata.get('left4dead2/workshop'),
|
||||||
|
]:
|
||||||
|
files[f'/opt/steam/left4dead2-servers/{name}/left4dead2/addons/{id}.vpk'] = {
|
||||||
|
'content_type': 'any',
|
||||||
|
'owner': 'steam',
|
||||||
|
'group': 'steam',
|
||||||
|
'triggers': [
|
||||||
|
f'svc_systemd:left4dead2-{name}.service:restart',
|
||||||
|
],
|
||||||
|
}
|
||||||
|
|
||||||
|
# admin system
|
||||||
|
|
||||||
|
directories[f'/opt/steam/left4dead2-servers/{name}/left4dead2/ems/admin system'] = {
|
||||||
|
'owner': 'steam',
|
||||||
|
'group': 'steam',
|
||||||
|
'mode': '0755',
|
||||||
|
'triggers': [
|
||||||
|
f'svc_systemd:left4dead2-{name}.service:restart',
|
||||||
|
],
|
||||||
|
}
|
||||||
|
files[f'/opt/steam/left4dead2-servers/{name}/left4dead2/ems/admin system/admins.txt'] = {
|
||||||
|
'owner': 'steam',
|
||||||
|
'group': 'steam',
|
||||||
|
'mode': '0755',
|
||||||
|
'content': '\n'.join(sorted(node.metadata.get('left4dead2/admins'))),
|
||||||
|
'triggers': [
|
||||||
|
f'svc_systemd:left4dead2-{name}.service:restart',
|
||||||
|
],
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,104 +1,110 @@
|
||||||
from re import match
|
assert node.has_bundle('steam')
|
||||||
from os import path, listdir
|
|
||||||
|
|
||||||
|
from shlex import quote
|
||||||
|
|
||||||
defaults = {
|
defaults = {
|
||||||
'apt': {
|
'steam': {
|
||||||
'packages': {
|
'games': {
|
||||||
'libc6_i386': {}, # installs libc6:i386
|
'left4dead2': 222860,
|
||||||
'lib32z1': {},
|
|
||||||
'unzip': {},
|
|
||||||
'p7zip-full': {}, # l4d2center_maps_sync.sh
|
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
'left4dead2': {
|
'left4dead2': {
|
||||||
'overlays': set(listdir(path.join(repo.path, 'bundles/left4dead2/files/scripts/overlays'))),
|
'servers': {},
|
||||||
'servers': {
|
'admins': set(),
|
||||||
# 'port': 27017,
|
'workshop': set(),
|
||||||
# 'overlays': ['competitive_rework'],
|
|
||||||
# 'arguments': ['-tickrate 60'],
|
|
||||||
# 'config': [
|
|
||||||
# 'exec server_original.cfg',
|
|
||||||
# 'sm_forcematch zonemod',
|
|
||||||
# ],
|
|
||||||
},
|
|
||||||
},
|
|
||||||
'nftables': {
|
|
||||||
'input': {
|
|
||||||
'udp dport { 27005, 27020 } accept',
|
|
||||||
},
|
|
||||||
},
|
|
||||||
'systemd': {
|
|
||||||
'units': {
|
|
||||||
'left4dead2-initialize.service': {
|
|
||||||
'Unit': {
|
|
||||||
'Description': 'initialize left4dead2',
|
|
||||||
'After': 'network-online.target',
|
|
||||||
},
|
|
||||||
'Service': {
|
|
||||||
'Type': 'oneshot',
|
|
||||||
'RemainAfterExit': 'yes',
|
|
||||||
'ExecStart': '/opt/l4d2/setup',
|
|
||||||
'StandardOutput': 'journal',
|
|
||||||
'StandardError': 'journal',
|
|
||||||
},
|
|
||||||
'Install': {
|
|
||||||
'WantedBy': {'multi-user.target'},
|
|
||||||
},
|
|
||||||
},
|
|
||||||
},
|
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@metadata_reactor.provides(
|
@metadata_reactor.provides(
|
||||||
|
'left4dead2/servers',
|
||||||
|
)
|
||||||
|
def rconn_password(metadata):
|
||||||
|
# only works from localhost!
|
||||||
|
return {
|
||||||
|
'left4dead2': {
|
||||||
|
'servers': {
|
||||||
|
server: {
|
||||||
|
'rcon_password': repo.vault.password_for(f'{node.name} left4dead2 {server} rcon', length=24),
|
||||||
|
}
|
||||||
|
for server in metadata.get('left4dead2/servers')
|
||||||
|
},
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@metadata_reactor.provides(
|
||||||
|
'steam-workshop-download',
|
||||||
'systemd/units',
|
'systemd/units',
|
||||||
)
|
)
|
||||||
def server_units(metadata):
|
def server_units(metadata):
|
||||||
units = {}
|
units = {}
|
||||||
|
workshop = {}
|
||||||
|
|
||||||
for name, config in metadata.get('left4dead2/servers').items():
|
for name, config in metadata.get('left4dead2/servers').items():
|
||||||
assert match(r'^[A-z0-9-_-]+$', name)
|
# mount overlay
|
||||||
assert 27000 <= config["port"] <= 27100
|
mountpoint = f'/opt/steam/left4dead2-servers/{name}'
|
||||||
for overlay in config.get('overlays', []):
|
mount_unit_name = mountpoint[1:].replace('-', '\\x2d').replace('/', '-') + '.mount'
|
||||||
assert overlay in metadata.get('left4dead2/overlays'), f"unknown overlay {overlay}, known: {metadata.get('left4dead2/overlays')}"
|
units[mount_unit_name] = {
|
||||||
|
'Unit': {
|
||||||
|
'Description': f"Mount left4dead2 server {name} overlay",
|
||||||
|
'Conflicts': {'umount.target'},
|
||||||
|
'Before': {'umount.target'},
|
||||||
|
},
|
||||||
|
'Mount': {
|
||||||
|
'What': 'overlay',
|
||||||
|
'Where': mountpoint,
|
||||||
|
'Type': 'overlay',
|
||||||
|
'Options': ','.join([
|
||||||
|
'auto',
|
||||||
|
'lowerdir=/opt/steam/left4dead2',
|
||||||
|
f'upperdir=/opt/steam-zfs-overlay-workarounds/{name}/upper',
|
||||||
|
f'workdir=/opt/steam-zfs-overlay-workarounds/{name}/workdir',
|
||||||
|
]),
|
||||||
|
},
|
||||||
|
'Install': {
|
||||||
|
'RequiredBy': {
|
||||||
|
f'left4dead2-{name}.service',
|
||||||
|
},
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
cmd = f'/opt/l4d2/start -n {name} -p {config["port"]}'
|
# individual workshop
|
||||||
|
workshop_ids = config.get('workshop', set()) | metadata.get('left4dead2/workshop', set())
|
||||||
if 'config' in config:
|
if workshop_ids:
|
||||||
cmd += f' -c /opt/l4d2/configs/{name}.cfg'
|
workshop[f'left4dead2-{name}'] = {
|
||||||
|
'ids': workshop_ids,
|
||||||
for overlay in config.get('overlays', []):
|
'path': f'/opt/steam/left4dead2-servers/{name}/left4dead2/addons',
|
||||||
cmd += f' -o {overlay}'
|
'user': 'steam',
|
||||||
|
'requires': {
|
||||||
if 'arguments' in config:
|
mount_unit_name,
|
||||||
cmd += ' -- ' + ' '.join(config['arguments'])
|
},
|
||||||
|
'required_by': {
|
||||||
|
f'left4dead2-{name}.service',
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
# left4dead2 server unit
|
||||||
units[f'left4dead2-{name}.service'] = {
|
units[f'left4dead2-{name}.service'] = {
|
||||||
'Unit': {
|
'Unit': {
|
||||||
'Description': f'left4dead2 server {name}',
|
'Description': f'left4dead2 server {name}',
|
||||||
'After': {'left4dead2-initialize.service'},
|
'After': {'steam-update.service'},
|
||||||
'Requires': {'left4dead2-initialize.service'},
|
'Requires': {'steam-update.service'},
|
||||||
},
|
},
|
||||||
'Service': {
|
'Service': {
|
||||||
'Type': 'simple',
|
'User': 'steam',
|
||||||
'ExecStart': cmd,
|
'Group': 'steam',
|
||||||
'ExecStopPost': f'/opt/l4d2/stop -n {name}',
|
'WorkingDirectory': f'/opt/steam/left4dead2-servers/{name}',
|
||||||
|
'ExecStart': f'/opt/steam/left4dead2-servers/{name}/srcds_run -port {config["port"]} +exec server.cfg',
|
||||||
'Restart': 'on-failure',
|
'Restart': 'on-failure',
|
||||||
'Nice': -10,
|
|
||||||
'CPUWeight': 200,
|
|
||||||
'IOSchedulingClass': 'best-effort',
|
|
||||||
'IOSchedulingPriority': 0,
|
|
||||||
},
|
},
|
||||||
'Install': {
|
'Install': {
|
||||||
'WantedBy': {'multi-user.target'},
|
'WantedBy': {'multi-user.target'},
|
||||||
},
|
},
|
||||||
'triggers': {
|
|
||||||
f'svc_systemd:left4dead2-{name}.service:restart',
|
|
||||||
},
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return {
|
return {
|
||||||
|
'steam-workshop-download': workshop,
|
||||||
'systemd': {
|
'systemd': {
|
||||||
'units': units,
|
'units': units,
|
||||||
},
|
},
|
||||||
|
|
@ -108,13 +114,14 @@ def server_units(metadata):
|
||||||
@metadata_reactor.provides(
|
@metadata_reactor.provides(
|
||||||
'nftables/input',
|
'nftables/input',
|
||||||
)
|
)
|
||||||
def nftables(metadata):
|
def firewall(metadata):
|
||||||
ports = sorted(str(config["port"]) for config in metadata.get('left4dead2/servers').values())
|
ports = set(str(server['port']) for server in metadata.get('left4dead2/servers').values())
|
||||||
|
|
||||||
return {
|
return {
|
||||||
'nftables': {
|
'nftables': {
|
||||||
'input': {
|
'input': {
|
||||||
f'ip protocol {{ tcp, udp }} th dport {{ {", ".join(ports)} }} accept'
|
f"tcp dport {{ {', '.join(sorted(ports))} }} accept",
|
||||||
|
f"udp dport {{ {', '.join(sorted(ports))} }} accept",
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,58 +0,0 @@
|
||||||
https://developer.valvesoftware.com/wiki/List_of_L4D2_Cvars
|
|
||||||
|
|
||||||
Dead Center c1m1_hotel
|
|
||||||
Dead Center c1m2_streets
|
|
||||||
Dead Center c1m3_mall
|
|
||||||
Dead Center c1m4_atrium
|
|
||||||
Dark Carnival c2m1_highway
|
|
||||||
Dark Carnival c2m2_fairgrounds
|
|
||||||
Dark Carnival c2m3_coaster
|
|
||||||
Dark Carnival c2m4_barns
|
|
||||||
Dark Carnival c2m5_concert
|
|
||||||
Swamp Fever c3m1_plankcountry
|
|
||||||
Swamp Fever c3m2_swamp
|
|
||||||
Swamp Fever c3m3_shantytown
|
|
||||||
Swamp Fever c3m4_plantation
|
|
||||||
Hard Rain c4m1_milltown_a
|
|
||||||
Hard Rain c4m2_sugarmill_a
|
|
||||||
Hard Rain c4m3_sugarmill_b
|
|
||||||
Hard Rain c4m4_milltown_b
|
|
||||||
Hard Rain c4m5_milltown_escape
|
|
||||||
The Parish c5m1_waterfront_sndscape
|
|
||||||
The Parish c5m1_waterfront
|
|
||||||
The Parish c5m2_park
|
|
||||||
The Parish c5m3_cemetery
|
|
||||||
The Parish c5m4_quarter
|
|
||||||
The Parish c5m5_bridge
|
|
||||||
The Passing c6m1_riverbank
|
|
||||||
The Passing c6m2_bedlam
|
|
||||||
The Passing c6m3_port
|
|
||||||
The Sacrifice c7m1_docks
|
|
||||||
The Sacrifice c7m2_barge
|
|
||||||
The Sacrifice c7m3_port
|
|
||||||
No Mercy c8m1_apartment
|
|
||||||
No Mercy c8m2_subway
|
|
||||||
No Mercy c8m3_sewers
|
|
||||||
No Mercy c8m4_interior
|
|
||||||
No Mercy c8m5_rooftop
|
|
||||||
Crash Course c9m1_alleys
|
|
||||||
Crash Course c9m2_lots
|
|
||||||
Death Toll c10m1_caves
|
|
||||||
Death Toll c10m2_drainage
|
|
||||||
Death Toll c10m3_ranchhouse
|
|
||||||
Death Toll c10m4_mainstreet
|
|
||||||
Death Toll c10m5_houseboat
|
|
||||||
Dead Air c11m1_greenhouse
|
|
||||||
Dead Air c11m2_offices
|
|
||||||
Dead Air c11m3_garage
|
|
||||||
Dead Air c11m4_terminal
|
|
||||||
Dead Air c11m5_runway
|
|
||||||
Blood Harvest c12m1_hilltop
|
|
||||||
Blood Harvest c12m2_traintunnel
|
|
||||||
Blood Harvest c12m3_bridge
|
|
||||||
Blood Harvest c12m4_barn
|
|
||||||
Blood Harvest c12m5_cornfield
|
|
||||||
Cold Stream c13m1_alpinecreek
|
|
||||||
Cold Stream c13m2_southpinestream
|
|
||||||
Cold Stream c13m3_memorialbridge
|
|
||||||
Cold Stream c13m4_cutthroatcreek
|
|
||||||
|
|
@ -1,40 +0,0 @@
|
||||||
hostname "CroneKorkN : ${name}"
|
|
||||||
sv_contact "admin@sublimity.de"
|
|
||||||
|
|
||||||
|
|
||||||
sv_steamgroup "${','.join(steamgroups)}"
|
|
||||||
|
|
||||||
rcon_password "${rcon_password}"
|
|
||||||
|
|
||||||
|
|
||||||
motd_enabled 0
|
|
||||||
|
|
||||||
|
|
||||||
sv_cheats 1
|
|
||||||
|
|
||||||
|
|
||||||
sv_consistency 0
|
|
||||||
|
|
||||||
|
|
||||||
sv_lan 0
|
|
||||||
|
|
||||||
|
|
||||||
sv_allow_lobby_connect_only 0
|
|
||||||
|
|
||||||
|
|
||||||
sv_gametypes "coop,realism,survival,versus,teamversus,scavenge,teamscavenge"
|
|
||||||
|
|
||||||
|
|
||||||
sv_minrate 30000
|
|
||||||
sv_maxrate 60000
|
|
||||||
sv_mincmdrate 66
|
|
||||||
sv_maxcmdrate 101
|
|
||||||
|
|
||||||
|
|
||||||
sv_logsdir "logs-${name}" //Folder in the game directory where server logs will be stored.
|
|
||||||
log on //Creates a logfile (on | off)
|
|
||||||
sv_logecho 0 //default 0; Echo log information to the console.
|
|
||||||
sv_logfile 1 //default 1; Log server information in the log file.
|
|
||||||
sv_log_onefile 0 //default 0; Log server information to only one file.
|
|
||||||
sv_logbans 1 //default 0;Log server bans in the server logs.
|
|
||||||
sv_logflush 0 //default 0; Flush the log files to disk on each write (slow).
|
|
||||||
|
|
@ -1,122 +0,0 @@
|
||||||
assert node.has_bundle('steam') and node.has_bundle('steam-workshop-download')
|
|
||||||
|
|
||||||
directories = {
|
|
||||||
'/opt/steam/left4dead2-servers': {
|
|
||||||
'owner': 'steam',
|
|
||||||
'group': 'steam',
|
|
||||||
'mode': '0755',
|
|
||||||
'purge': True,
|
|
||||||
},
|
|
||||||
# Current zfs doesnt support zfs upperdir. The support was added in October 2022. Move upperdir - unused anyway -
|
|
||||||
# to another dir. Also move workdir alongside it, as it has to be on same fs.
|
|
||||||
'/opt/steam-zfs-overlay-workarounds': {
|
|
||||||
'owner': 'steam',
|
|
||||||
'group': 'steam',
|
|
||||||
'mode': '0755',
|
|
||||||
'purge': True,
|
|
||||||
},
|
|
||||||
}
|
|
||||||
|
|
||||||
# /opt/steam/steam/.steam/sdk32/steamclient.so: cannot open shared object file: No such file or directory
|
|
||||||
symlinks = {
|
|
||||||
'/opt/steam/steam/.steam/sdk32': {
|
|
||||||
'target': '/opt/steam/steam/linux32',
|
|
||||||
'owner': 'steam',
|
|
||||||
'group': 'steam',
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
#
|
|
||||||
# SERVERS
|
|
||||||
#
|
|
||||||
|
|
||||||
for name, config in node.metadata.get('left4dead2/servers').items():
|
|
||||||
|
|
||||||
#overlay
|
|
||||||
directories[f'/opt/steam/left4dead2-servers/{name}'] = {
|
|
||||||
'owner': 'steam',
|
|
||||||
'group': 'steam',
|
|
||||||
}
|
|
||||||
directories[f'/opt/steam-zfs-overlay-workarounds/{name}/upper'] = {
|
|
||||||
'owner': 'steam',
|
|
||||||
'group': 'steam',
|
|
||||||
}
|
|
||||||
directories[f'/opt/steam-zfs-overlay-workarounds/{name}/workdir'] = {
|
|
||||||
'owner': 'steam',
|
|
||||||
'group': 'steam',
|
|
||||||
}
|
|
||||||
|
|
||||||
# conf
|
|
||||||
files[f'/opt/steam/left4dead2-servers/{name}/left4dead2/cfg/server.cfg'] = {
|
|
||||||
'content_type': 'mako',
|
|
||||||
'source': 'server.cfg',
|
|
||||||
'context': {
|
|
||||||
'name': name,
|
|
||||||
'steamgroups': node.metadata.get('left4dead2/steamgroups'),
|
|
||||||
'rcon_password': config['rcon_password'],
|
|
||||||
},
|
|
||||||
'owner': 'steam',
|
|
||||||
'group': 'steam',
|
|
||||||
'triggers': [
|
|
||||||
f'svc_systemd:left4dead2-{name}.service:restart',
|
|
||||||
],
|
|
||||||
}
|
|
||||||
|
|
||||||
# service
|
|
||||||
svc_systemd[f'left4dead2-{name}.service'] = {
|
|
||||||
'needs': [
|
|
||||||
f'file:/opt/steam/left4dead2-servers/{name}/left4dead2/cfg/server.cfg',
|
|
||||||
f'file:/usr/local/lib/systemd/system/left4dead2-{name}.service',
|
|
||||||
],
|
|
||||||
}
|
|
||||||
|
|
||||||
#
|
|
||||||
# ADDONS
|
|
||||||
#
|
|
||||||
|
|
||||||
# base
|
|
||||||
files[f'/opt/steam/left4dead2-servers/{name}/left4dead2/addons/readme.txt'] = {
|
|
||||||
'content_type': 'any',
|
|
||||||
'owner': 'steam',
|
|
||||||
'group': 'steam',
|
|
||||||
}
|
|
||||||
directories[f'/opt/steam/left4dead2-servers/{name}/left4dead2/addons'] = {
|
|
||||||
'owner': 'steam',
|
|
||||||
'group': 'steam',
|
|
||||||
'purge': True,
|
|
||||||
'triggers': [
|
|
||||||
f'svc_systemd:left4dead2-{name}.service:restart',
|
|
||||||
],
|
|
||||||
}
|
|
||||||
for id in [
|
|
||||||
*config.get('workshop', []),
|
|
||||||
*node.metadata.get('left4dead2/workshop'),
|
|
||||||
]:
|
|
||||||
files[f'/opt/steam/left4dead2-servers/{name}/left4dead2/addons/{id}.vpk'] = {
|
|
||||||
'content_type': 'any',
|
|
||||||
'owner': 'steam',
|
|
||||||
'group': 'steam',
|
|
||||||
'triggers': [
|
|
||||||
f'svc_systemd:left4dead2-{name}.service:restart',
|
|
||||||
],
|
|
||||||
}
|
|
||||||
|
|
||||||
# admin system
|
|
||||||
|
|
||||||
directories[f'/opt/steam/left4dead2-servers/{name}/left4dead2/ems/admin system'] = {
|
|
||||||
'owner': 'steam',
|
|
||||||
'group': 'steam',
|
|
||||||
'mode': '0755',
|
|
||||||
'triggers': [
|
|
||||||
f'svc_systemd:left4dead2-{name}.service:restart',
|
|
||||||
],
|
|
||||||
}
|
|
||||||
files[f'/opt/steam/left4dead2-servers/{name}/left4dead2/ems/admin system/admins.txt'] = {
|
|
||||||
'owner': 'steam',
|
|
||||||
'group': 'steam',
|
|
||||||
'mode': '0755',
|
|
||||||
'content': '\n'.join(sorted(node.metadata.get('left4dead2/admins'))),
|
|
||||||
'triggers': [
|
|
||||||
f'svc_systemd:left4dead2-{name}.service:restart',
|
|
||||||
],
|
|
||||||
}
|
|
||||||
|
|
@ -1,127 +0,0 @@
|
||||||
assert node.has_bundle('steam')
|
|
||||||
|
|
||||||
from shlex import quote
|
|
||||||
|
|
||||||
defaults = {
|
|
||||||
'steam': {
|
|
||||||
'games': {
|
|
||||||
'left4dead2': 222860,
|
|
||||||
},
|
|
||||||
},
|
|
||||||
'left4dead2': {
|
|
||||||
'servers': {},
|
|
||||||
'admins': set(),
|
|
||||||
'workshop': set(),
|
|
||||||
},
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
@metadata_reactor.provides(
|
|
||||||
'left4dead2/servers',
|
|
||||||
)
|
|
||||||
def rconn_password(metadata):
|
|
||||||
# only works from localhost!
|
|
||||||
return {
|
|
||||||
'left4dead2': {
|
|
||||||
'servers': {
|
|
||||||
server: {
|
|
||||||
'rcon_password': repo.vault.password_for(f'{node.name} left4dead2 {server} rcon', length=24),
|
|
||||||
}
|
|
||||||
for server in metadata.get('left4dead2/servers')
|
|
||||||
},
|
|
||||||
},
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
@metadata_reactor.provides(
|
|
||||||
'steam-workshop-download',
|
|
||||||
'systemd/units',
|
|
||||||
)
|
|
||||||
def server_units(metadata):
|
|
||||||
units = {}
|
|
||||||
workshop = {}
|
|
||||||
|
|
||||||
for name, config in metadata.get('left4dead2/servers').items():
|
|
||||||
# mount overlay
|
|
||||||
mountpoint = f'/opt/steam/left4dead2-servers/{name}'
|
|
||||||
mount_unit_name = mountpoint[1:].replace('-', '\\x2d').replace('/', '-') + '.mount'
|
|
||||||
units[mount_unit_name] = {
|
|
||||||
'Unit': {
|
|
||||||
'Description': f"Mount left4dead2 server {name} overlay",
|
|
||||||
'Conflicts': {'umount.target'},
|
|
||||||
'Before': {'umount.target'},
|
|
||||||
},
|
|
||||||
'Mount': {
|
|
||||||
'What': 'overlay',
|
|
||||||
'Where': mountpoint,
|
|
||||||
'Type': 'overlay',
|
|
||||||
'Options': ','.join([
|
|
||||||
'auto',
|
|
||||||
'lowerdir=/opt/steam/left4dead2',
|
|
||||||
f'upperdir=/opt/steam-zfs-overlay-workarounds/{name}/upper',
|
|
||||||
f'workdir=/opt/steam-zfs-overlay-workarounds/{name}/workdir',
|
|
||||||
]),
|
|
||||||
},
|
|
||||||
'Install': {
|
|
||||||
'RequiredBy': {
|
|
||||||
f'left4dead2-{name}.service',
|
|
||||||
},
|
|
||||||
},
|
|
||||||
}
|
|
||||||
|
|
||||||
# individual workshop
|
|
||||||
workshop_ids = config.get('workshop', set()) | metadata.get('left4dead2/workshop', set())
|
|
||||||
if workshop_ids:
|
|
||||||
workshop[f'left4dead2-{name}'] = {
|
|
||||||
'ids': workshop_ids,
|
|
||||||
'path': f'/opt/steam/left4dead2-servers/{name}/left4dead2/addons',
|
|
||||||
'user': 'steam',
|
|
||||||
'requires': {
|
|
||||||
mount_unit_name,
|
|
||||||
},
|
|
||||||
'required_by': {
|
|
||||||
f'left4dead2-{name}.service',
|
|
||||||
},
|
|
||||||
}
|
|
||||||
|
|
||||||
# left4dead2 server unit
|
|
||||||
units[f'left4dead2-{name}.service'] = {
|
|
||||||
'Unit': {
|
|
||||||
'Description': f'left4dead2 server {name}',
|
|
||||||
'After': {'steam-update.service'},
|
|
||||||
'Requires': {'steam-update.service'},
|
|
||||||
},
|
|
||||||
'Service': {
|
|
||||||
'User': 'steam',
|
|
||||||
'Group': 'steam',
|
|
||||||
'WorkingDirectory': f'/opt/steam/left4dead2-servers/{name}',
|
|
||||||
'ExecStart': f'/opt/steam/left4dead2-servers/{name}/srcds_run -port {config["port"]} +exec server.cfg',
|
|
||||||
'Restart': 'on-failure',
|
|
||||||
},
|
|
||||||
'Install': {
|
|
||||||
'WantedBy': {'multi-user.target'},
|
|
||||||
},
|
|
||||||
}
|
|
||||||
|
|
||||||
return {
|
|
||||||
'steam-workshop-download': workshop,
|
|
||||||
'systemd': {
|
|
||||||
'units': units,
|
|
||||||
},
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
@metadata_reactor.provides(
|
|
||||||
'nftables/input',
|
|
||||||
)
|
|
||||||
def firewall(metadata):
|
|
||||||
ports = set(str(server['port']) for server in metadata.get('left4dead2/servers').values())
|
|
||||||
|
|
||||||
return {
|
|
||||||
'nftables': {
|
|
||||||
'input': {
|
|
||||||
f"tcp dport {{ {', '.join(sorted(ports))} }} accept",
|
|
||||||
f"udp dport {{ {', '.join(sorted(ports))} }} accept",
|
|
||||||
},
|
|
||||||
},
|
|
||||||
}
|
|
||||||
|
|
@ -1,97 +0,0 @@
|
||||||
# https://github.com/SirPlease/L4D2-Competitive-Rework/blob/master/Dedicated%20Server%20Install%20Guide/README.md
|
|
||||||
|
|
||||||
getent passwd steam >/dev/null || useradd -M -d /opt/l4d2 -s /bin/bash steam
|
|
||||||
mkdir -p /opt/l4d2 /tmp/dumps
|
|
||||||
chown steam:steam /opt/l4d2 /tmp/dumps
|
|
||||||
dpkg --add-architecture i386
|
|
||||||
apt update
|
|
||||||
DEBIAN_FRONTEND=noninteractive apt install -y libc6:i386 lib32z1
|
|
||||||
|
|
||||||
function steam() { sudo -Hiu steam $* }
|
|
||||||
|
|
||||||
# -- STEAM -- #
|
|
||||||
|
|
||||||
steam mkdir -p /opt/l4d2/steam
|
|
||||||
test -f /opt/l4d2/steam/steamcmd_linux.tar.gz || \
|
|
||||||
steam wget http://media.steampowered.com/installer/steamcmd_linux.tar.gz -P /opt/l4d2/steam
|
|
||||||
test -f /opt/l4d2/steam/steamcmd.sh || \
|
|
||||||
steam tar -xvzf /opt/l4d2/steam/steamcmd_linux.tar.gz -C /opt/l4d2/steam
|
|
||||||
|
|
||||||
# fix: /opt/l4d2/.steam/sdk32/steamclient.so: cannot open shared object file: No such file or directory
|
|
||||||
steam mkdir -p /opt/l4d2/steam/.steam
|
|
||||||
test -f /opt/l4d2/steam/.steam/sdk32/steamclient.so || \
|
|
||||||
steam ln -s /opt/l4d2/steam/linux32 /opt/l4d2/steam/.steam/sdk32
|
|
||||||
|
|
||||||
# -- INSTALL -- #
|
|
||||||
|
|
||||||
# erst die windows deps zu installieren scheint ein workaround für x64 zu sein?
|
|
||||||
steam mkdir -p /opt/l4d2/installation
|
|
||||||
steam /opt/l4d2/steam/steamcmd.sh \
|
|
||||||
+force_install_dir /opt/l4d2/installation \
|
|
||||||
+login anonymous \
|
|
||||||
+@sSteamCmdForcePlatformType windows \
|
|
||||||
+app_update 222860 validate \
|
|
||||||
+quit
|
|
||||||
steam /opt/l4d2/steam/steamcmd.sh \
|
|
||||||
+force_install_dir /opt/l4d2/installation \
|
|
||||||
+login anonymous \
|
|
||||||
+@sSteamCmdForcePlatformType linux \
|
|
||||||
+app_update 222860 validate \
|
|
||||||
+quit
|
|
||||||
|
|
||||||
# -- OVERLAYS -- #
|
|
||||||
|
|
||||||
steam mkdir -p /opt/l4d2/overlays
|
|
||||||
|
|
||||||
# workshop downloader
|
|
||||||
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 PVE -- #
|
|
||||||
|
|
||||||
steam mkdir -p /opt/l4d2/overlays/pve
|
|
||||||
|
|
||||||
# admin system
|
|
||||||
steam mkdir -p /opt/l4d2/overlays/pve/left4dead2/addons
|
|
||||||
steam /opt/l4d2/steam-workshop-download 2524204971 --out /opt/l4d2/overlays/pve/left4dead2/addons
|
|
||||||
steam mkdir -p "/opt/l4d2/overlays/pve/left4dead2/ems/admin system"
|
|
||||||
echo "STEAM_1:0:12376499" | steam tee "/opt/l4d2/overlays/pve/left4dead2/ems/admin system/admins.txt"
|
|
||||||
|
|
||||||
# ions vocalizer
|
|
||||||
steam /opt/l4d2/steam-workshop-download 698857882 --out /opt/l4d2/overlays/pve/left4dead2/addons
|
|
||||||
|
|
||||||
# -- OVERLAY ZONEMOD -- #
|
|
||||||
|
|
||||||
true
|
|
||||||
|
|
||||||
# -- SERVERS -- #
|
|
||||||
|
|
||||||
steam mkdir -p /opt/l4d2/servers
|
|
||||||
|
|
||||||
# -- SERVER PVE1 -- #
|
|
||||||
|
|
||||||
steam mkdir -p \
|
|
||||||
/opt/l4d2/servers/pve1 \
|
|
||||||
/opt/l4d2/servers/pve1/work \
|
|
||||||
/opt/l4d2/servers/pve1/upper \
|
|
||||||
/opt/l4d2/servers/pve1/merged
|
|
||||||
|
|
||||||
mount -t overlay overlay \
|
|
||||||
-o lowerdir=/opt/l4d2/overlays/pve:/opt/l4d2/installation,upperdir=/opt/l4d2/servers/pve1/upper,workdir=/opt/l4d2/servers/pve1/work \
|
|
||||||
/opt/l4d2/servers/pve1/merged
|
|
||||||
|
|
||||||
# run server
|
|
||||||
steam cat <<'EOF' > /opt/l4d2/servers/pve1/merged/left4dead2/cfg/server.cfg
|
|
||||||
hostname "CKNs Server"
|
|
||||||
motd_enabled 0
|
|
||||||
|
|
||||||
sv_steamgroup "38347879"
|
|
||||||
#sv_steamgroup_exclusive 0
|
|
||||||
|
|
||||||
sv_minrate 60000
|
|
||||||
sv_maxrate 0
|
|
||||||
net_splitpacket_maxrate 60000
|
|
||||||
|
|
||||||
sv_hibernate_when_empty 0
|
|
||||||
EOF
|
|
||||||
steam /opt/l4d2/servers/pve1/merged/srcds_run -game left4dead2 -ip 0.0.0.0 -port 27015 +map c1m1_hotel
|
|
||||||
|
|
@ -1,183 +0,0 @@
|
||||||
from shlex import quote
|
|
||||||
|
|
||||||
|
|
||||||
def steam_run(cmd):
|
|
||||||
return f'su - steam -c {quote(cmd)}'
|
|
||||||
|
|
||||||
|
|
||||||
users = {
|
|
||||||
'steam': {
|
|
||||||
'home': '/opt/steam',
|
|
||||||
},
|
|
||||||
}
|
|
||||||
|
|
||||||
directories = {
|
|
||||||
'/opt/steam': {
|
|
||||||
'owner': 'steam',
|
|
||||||
'group': 'steam',
|
|
||||||
},
|
|
||||||
'/opt/steam/.steam': {
|
|
||||||
'owner': 'steam',
|
|
||||||
'group': 'steam',
|
|
||||||
},
|
|
||||||
'/opt/left4dead2': {
|
|
||||||
'owner': 'steam',
|
|
||||||
'group': 'steam',
|
|
||||||
},
|
|
||||||
'/opt/left4dead2/left4dead2/ems/admin system': {
|
|
||||||
'owner': 'steam',
|
|
||||||
'group': 'steam',
|
|
||||||
},
|
|
||||||
'/opt/left4dead2/left4dead2/addons': {
|
|
||||||
'owner': 'steam',
|
|
||||||
'group': 'steam',
|
|
||||||
},
|
|
||||||
'/tmp/dumps': {
|
|
||||||
'owner': 'steam',
|
|
||||||
'group': 'steam',
|
|
||||||
'mode': '1770',
|
|
||||||
},
|
|
||||||
}
|
|
||||||
|
|
||||||
symlinks = {
|
|
||||||
'/opt/steam/.steam/sdk32': {
|
|
||||||
'target': '/opt/steam/linux32',
|
|
||||||
'owner': 'steam',
|
|
||||||
'group': 'steam',
|
|
||||||
},
|
|
||||||
}
|
|
||||||
|
|
||||||
files = {
|
|
||||||
'/opt/steam-workshop-download': {
|
|
||||||
'content_type': 'download',
|
|
||||||
'source': 'https://git.sublimity.de/cronekorkn/steam-workshop-downloader/raw/branch/master/steam-workshop-download',
|
|
||||||
'mode': '755',
|
|
||||||
},
|
|
||||||
'/opt/left4dead2/left4dead2/ems/admin system/admins.txt': {
|
|
||||||
'unless': 'test -f /opt/left4dead2/left4dead2/ems/admin system/admins.txt',
|
|
||||||
'content': 'STEAM_1:0:12376499',
|
|
||||||
'owner': 'steam',
|
|
||||||
'group': 'steam',
|
|
||||||
},
|
|
||||||
}
|
|
||||||
|
|
||||||
actions = {
|
|
||||||
'dpkg_add_architecture': {
|
|
||||||
'command': 'dpkg --add-architecture i386',
|
|
||||||
'unless': 'dpkg --print-foreign-architectures | grep -q i386',
|
|
||||||
'triggers': [
|
|
||||||
'action:apt_update',
|
|
||||||
],
|
|
||||||
'needed_by': [
|
|
||||||
'pkg_apt:libc6_i386',
|
|
||||||
],
|
|
||||||
},
|
|
||||||
'download_steam': {
|
|
||||||
'command': steam_run('wget http://media.steampowered.com/installer/steamcmd_linux.tar.gz -P /opt/steam'),
|
|
||||||
'unless': steam_run('test -f /opt/steam/steamcmd_linux.tar.gz'),
|
|
||||||
'needs': {
|
|
||||||
'pkg_apt:libc6_i386',
|
|
||||||
'directory:/opt/steam',
|
|
||||||
}
|
|
||||||
},
|
|
||||||
'extract_steamcmd': {
|
|
||||||
'command': steam_run('tar -xvzf /opt/steam/steamcmd_linux.tar.gz -C /opt/steam'),
|
|
||||||
'unless': steam_run('test -f /opt/steam/steamcmd.sh'),
|
|
||||||
'needs': {
|
|
||||||
'action:download_steam',
|
|
||||||
}
|
|
||||||
},
|
|
||||||
}
|
|
||||||
|
|
||||||
for addon_id in [2524204971]:
|
|
||||||
actions[f'download-left4dead2-addon-{addon_id}'] = {
|
|
||||||
'command': steam_run(f'/opt/steam-workshop-download {addon_id} --out /opt/left4dead2/left4dead2/addons'),
|
|
||||||
'unless': steam_run(f'test -f /opt/left4dead2/left4dead2/addons/{addon_id}.vpk'),
|
|
||||||
'needs': {
|
|
||||||
'directory:/opt/left4dead2/left4dead2/addons',
|
|
||||||
},
|
|
||||||
'needed_by': {
|
|
||||||
'tag:left4dead2-servers',
|
|
||||||
},
|
|
||||||
}
|
|
||||||
|
|
||||||
svc_systemd = {
|
|
||||||
'left4dead2-install.service': {
|
|
||||||
'enabled': True,
|
|
||||||
'running': False,
|
|
||||||
'needs': {
|
|
||||||
'file:/usr/local/lib/systemd/system/left4dead2-install.service',
|
|
||||||
},
|
|
||||||
},
|
|
||||||
}
|
|
||||||
|
|
||||||
for server_name, server_config in node.metadata.get('left4dead2/servers', {}).items():
|
|
||||||
svc_systemd[f'left4dead2-{server_name}.service'] = {
|
|
||||||
'enabled': True,
|
|
||||||
'running': True,
|
|
||||||
'tags': {
|
|
||||||
'left4dead2-servers',
|
|
||||||
},
|
|
||||||
'needs': {
|
|
||||||
'svc_systemd:left4dead2-install.service',
|
|
||||||
f'file:/usr/local/lib/systemd/system/left4dead2-{server_name}.service',
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
# # https://github.com/SirPlease/L4D2-Competitive-Rework/blob/master/Dedicated%20Server%20Install%20Guide/README.md
|
|
||||||
|
|
||||||
# mkdir /opt/steam /tmp/dumps
|
|
||||||
# useradd -M -d /opt/steam -s /bin/bash steam
|
|
||||||
# chown steam:steam /opt/steam /tmp/dumps
|
|
||||||
# dpkg --add-architecture i386
|
|
||||||
# apt update
|
|
||||||
# apt install libc6:i386 lib32z1
|
|
||||||
# sudo su - steam -s /bin/bash
|
|
||||||
|
|
||||||
# #--------
|
|
||||||
|
|
||||||
# wget http://media.steampowered.com/installer/steamcmd_linux.tar.gz
|
|
||||||
# tar -xvzf steamcmd_linux.tar.gz
|
|
||||||
|
|
||||||
# # fix: /opt/steam/.steam/sdk32/steamclient.so: cannot open shared object file: No such file or directory
|
|
||||||
# mkdir /opt/steam/.steam && ln -s /opt/steam/linux32 /opt/steam/.steam/sdk32
|
|
||||||
|
|
||||||
# # erst die windows deps zu installieren scheint ein workaround für x64 zu sein?
|
|
||||||
# ./steamcmd.sh \
|
|
||||||
# +force_install_dir /opt/steam/left4dead2 \
|
|
||||||
# +login anonymous \
|
|
||||||
# +@sSteamCmdForcePlatformType windows \
|
|
||||||
# +app_update 222860 validate \
|
|
||||||
# +quit
|
|
||||||
# ./steamcmd.sh \
|
|
||||||
# +force_install_dir /opt/steam/left4dead2 \
|
|
||||||
# +login anonymous \
|
|
||||||
# +@sSteamCmdForcePlatformType linux \
|
|
||||||
# +app_update 222860 validate \
|
|
||||||
# +quit
|
|
||||||
|
|
||||||
# # download admin system
|
|
||||||
# wget -4 https://git.sublimity.de/cronekorkn/steam-workshop-downloader/raw/branch/master/steam-workshop-download
|
|
||||||
# chmod +x steam-workshop-download
|
|
||||||
# ./steam-workshop-download 2524204971 --out /opt/steam/left4dead2/left4dead2/addons
|
|
||||||
# mkdir -p "/opt/steam/left4dead2/left4dead2/ems/admin system"
|
|
||||||
# echo "STEAM_1:0:12376499" > "/opt/steam/left4dead2/left4dead2/ems/admin system/admins.txt"
|
|
||||||
|
|
||||||
# /opt/steam/left4dead2/srcds_run -game left4dead2 -ip 0.0.0.0 -port 27015 +map c1m1_hotel
|
|
||||||
|
|
||||||
|
|
||||||
# cat <<'EOF' > /opt/steam/left4dead2/left4dead2/cfg/server.cfg
|
|
||||||
# hostname "CKNs Server"
|
|
||||||
# motd_enabled 0
|
|
||||||
|
|
||||||
# sv_steamgroup "38347879"
|
|
||||||
# #sv_steamgroup_exclusive 0
|
|
||||||
|
|
||||||
# sv_minrate 60000
|
|
||||||
# sv_maxrate 0
|
|
||||||
# net_splitpacket_maxrate 60000
|
|
||||||
|
|
||||||
# sv_hibernate_when_empty 0
|
|
||||||
# EOF
|
|
||||||
|
|
@ -1,107 +0,0 @@
|
||||||
from re import match
|
|
||||||
|
|
||||||
defaults = {
|
|
||||||
'apt': {
|
|
||||||
'packages': {
|
|
||||||
'libc6_i386': {}, # installs libc6:i386
|
|
||||||
'lib32z1': {},
|
|
||||||
'unzip': {},
|
|
||||||
},
|
|
||||||
},
|
|
||||||
'left4dead2': {
|
|
||||||
'servers': {},
|
|
||||||
},
|
|
||||||
'nftables': {
|
|
||||||
'input': {
|
|
||||||
'udp dport { 27005, 27020 } accept',
|
|
||||||
},
|
|
||||||
},
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
@metadata_reactor.provides(
|
|
||||||
'nftables/input',
|
|
||||||
)
|
|
||||||
def nftables(metadata):
|
|
||||||
ports = sorted(str(config["port"]) for config in metadata.get('left4dead2/servers', {}).values())
|
|
||||||
|
|
||||||
return {
|
|
||||||
'nftables': {
|
|
||||||
'input': {
|
|
||||||
f'ip protocol {{ tcp, udp }} th dport {{ {", ".join(ports)} }} accept'
|
|
||||||
},
|
|
||||||
},
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
@metadata_reactor.provides(
|
|
||||||
'systemd/units',
|
|
||||||
)
|
|
||||||
def initial_unit(metadata):
|
|
||||||
install_command = (
|
|
||||||
'/opt/steam/steamcmd.sh '
|
|
||||||
'+force_install_dir /opt/left4dead2 '
|
|
||||||
'+login anonymous '
|
|
||||||
'+@sSteamCmdForcePlatformType {platform} '
|
|
||||||
'+app_update 222860 validate '
|
|
||||||
'+quit '
|
|
||||||
)
|
|
||||||
|
|
||||||
return {
|
|
||||||
'systemd': {
|
|
||||||
'units': {
|
|
||||||
'left4dead2-install.service': {
|
|
||||||
'Unit': {
|
|
||||||
'Description': 'install or update left4dead2',
|
|
||||||
'After': 'network-online.target',
|
|
||||||
},
|
|
||||||
'Service': {
|
|
||||||
'Type': 'oneshot',
|
|
||||||
'RemainAfterExit': 'yes',
|
|
||||||
'User': 'steam',
|
|
||||||
'Group': 'steam',
|
|
||||||
'WorkingDirectory': '/opt/steam',
|
|
||||||
'ExecStartPre': install_command.format(platform='windows'),
|
|
||||||
'ExecStart': install_command.format(platform='linux'),
|
|
||||||
},
|
|
||||||
'Install': {
|
|
||||||
'WantedBy': {'multi-user.target'},
|
|
||||||
},
|
|
||||||
},
|
|
||||||
},
|
|
||||||
},
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
@metadata_reactor.provides(
|
|
||||||
'systemd/units',
|
|
||||||
)
|
|
||||||
def server_units(metadata):
|
|
||||||
units = {}
|
|
||||||
|
|
||||||
for name, config in metadata.get('left4dead2/servers').items():
|
|
||||||
assert match(r'^[A-z0-9-_-]+$', name)
|
|
||||||
|
|
||||||
units[f'left4dead2-{name}.service'] = {
|
|
||||||
'Unit': {
|
|
||||||
'Description': f'left4dead2 server {name}',
|
|
||||||
'After': {'left4dead2-install.service'},
|
|
||||||
'Requires': {'left4dead2-install.service'},
|
|
||||||
},
|
|
||||||
'Service': {
|
|
||||||
'User': 'steam',
|
|
||||||
'Group': 'steam',
|
|
||||||
'WorkingDirectory': '/opt/left4dead2',
|
|
||||||
'ExecStart': f'/opt/left4dead2/srcds_run -port {config["port"]} +exec server_{name}.cfg',
|
|
||||||
'Restart': 'on-failure',
|
|
||||||
},
|
|
||||||
'Install': {
|
|
||||||
'WantedBy': {'multi-user.target'},
|
|
||||||
},
|
|
||||||
}
|
|
||||||
|
|
||||||
return {
|
|
||||||
'systemd': {
|
|
||||||
'units': units,
|
|
||||||
},
|
|
||||||
}
|
|
||||||
|
|
@ -32,14 +32,10 @@ defaults = {
|
||||||
'tank/vmail': {
|
'tank/vmail': {
|
||||||
'mountpoint': '/var/vmail',
|
'mountpoint': '/var/vmail',
|
||||||
'compression': 'on',
|
'compression': 'on',
|
||||||
'atime': 'off',
|
|
||||||
'recordsize': '16384',
|
|
||||||
},
|
},
|
||||||
'tank/vmail/index': {
|
'tank/vmail/index': {
|
||||||
'mountpoint': '/var/vmail/index',
|
'mountpoint': '/var/vmail/index',
|
||||||
'compression': 'on',
|
'compression': 'on',
|
||||||
'atime': 'off',
|
|
||||||
'recordsize': '4096',
|
|
||||||
'com.sun:auto-snapshot': 'false',
|
'com.sun:auto-snapshot': 'false',
|
||||||
'backup': False,
|
'backup': False,
|
||||||
},
|
},
|
||||||
|
|
|
||||||
55
bundles/steam/README.md
Normal file
55
bundles/steam/README.md
Normal file
|
|
@ -0,0 +1,55 @@
|
||||||
|
# https://github.com/SirPlease/L4D2-Competitive-Rework/blob/master/Dedicated%20Server%20Install%20Guide/README.md
|
||||||
|
|
||||||
|
mkdir /opt/steam /tmp/dumps
|
||||||
|
useradd -M -d /opt/steam -s /bin/bash steam
|
||||||
|
chown steam:steam /opt/steam /tmp/dumps
|
||||||
|
dpkg --add-architecture i386
|
||||||
|
apt update
|
||||||
|
apt install libc6:i386 lib32z1
|
||||||
|
sudo su - steam -s /bin/bash
|
||||||
|
|
||||||
|
#--------
|
||||||
|
|
||||||
|
wget http://media.steampowered.com/installer/steamcmd_linux.tar.gz
|
||||||
|
tar -xvzf steamcmd_linux.tar.gz
|
||||||
|
|
||||||
|
# fix: /opt/steam/.steam/sdk32/steamclient.so: cannot open shared object file: No such file or directory
|
||||||
|
mkdir /opt/steam/.steam && ln -s /opt/steam/linux32 /opt/steam/.steam/sdk32
|
||||||
|
|
||||||
|
# erst die windows deps zu installieren scheint ein workaround für x64 zu sein?
|
||||||
|
./steamcmd.sh \
|
||||||
|
+force_install_dir /opt/steam/left4dead2 \
|
||||||
|
+login anonymous \
|
||||||
|
+@sSteamCmdForcePlatformType windows \
|
||||||
|
+app_update 222860 validate \
|
||||||
|
+quit
|
||||||
|
./steamcmd.sh \
|
||||||
|
+force_install_dir /opt/steam/left4dead2 \
|
||||||
|
+login anonymous \
|
||||||
|
+@sSteamCmdForcePlatformType linux \
|
||||||
|
+app_update 222860 validate \
|
||||||
|
+quit
|
||||||
|
|
||||||
|
# download admin system
|
||||||
|
wget -4 https://git.sublimity.de/cronekorkn/steam-workshop-downloader/raw/branch/master/steam-workshop-download
|
||||||
|
chmod +x steam-workshop-download
|
||||||
|
./steam-workshop-download 2524204971 --out /opt/steam/left4dead2/left4dead2/addons
|
||||||
|
mkdir -p "/opt/steam/left4dead2/left4dead2/ems/admin system"
|
||||||
|
echo "STEAM_1:0:12376499" > "/opt/steam/left4dead2/left4dead2/ems/admin system/admins.txt"
|
||||||
|
|
||||||
|
/opt/steam/left4dead2/srcds_run -game left4dead2 -ip 0.0.0.0 -port 27015 +map c1m1_hotel
|
||||||
|
|
||||||
|
|
||||||
|
cat <<'EOF' > /opt/steam/left4dead2/left4dead2/cfg/server.cfg
|
||||||
|
hostname "CKNs Server"
|
||||||
|
motd_enabled 0
|
||||||
|
|
||||||
|
sv_steamgroup "38347879"
|
||||||
|
#sv_steamgroup_exclusive 0
|
||||||
|
|
||||||
|
sv_minrate 60000
|
||||||
|
sv_maxrate 0
|
||||||
|
net_splitpacket_maxrate 60000
|
||||||
|
|
||||||
|
sv_hibernate_when_empty 0
|
||||||
|
EOF
|
||||||
|
|
@ -1,8 +1,5 @@
|
||||||
from bundlewrap.utils.dicts import merge_dict
|
from bundlewrap.utils.dicts import merge_dict
|
||||||
|
|
||||||
files = {}
|
|
||||||
svc_systemd = {}
|
|
||||||
|
|
||||||
directories = {
|
directories = {
|
||||||
'/usr/local/lib/systemd/system': {
|
'/usr/local/lib/systemd/system': {
|
||||||
'purge': True,
|
'purge': True,
|
||||||
|
|
@ -45,9 +42,6 @@ for name, unit in node.metadata.get('systemd/units').items():
|
||||||
else:
|
else:
|
||||||
raise Exception(f'unknown type {extension}')
|
raise Exception(f'unknown type {extension}')
|
||||||
|
|
||||||
for attribute in ['needs', 'needed_by', 'triggers', 'triggered_by']:
|
|
||||||
if attribute in unit:
|
|
||||||
dependencies.setdefault(attribute, []).extend(unit.pop(attribute))
|
|
||||||
|
|
||||||
files[path] = {
|
files[path] = {
|
||||||
'content': repo.libs.systemd.generate_unitfile(unit),
|
'content': repo.libs.systemd.generate_unitfile(unit),
|
||||||
|
|
|
||||||
|
|
@ -1,30 +0,0 @@
|
||||||
#! /usr/bin/env python3
|
|
||||||
|
|
||||||
import requests
|
|
||||||
from datetime import datetime, timedelta, timezone
|
|
||||||
|
|
||||||
BASE = "https://homeassistant.ckn.li"
|
|
||||||
TOKEN = "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiI1YjY0ZWE5N2FiMzM0NTQ0OGMyNjhmZTIxYzAxZTE1MSIsImlhdCI6MTc1NjAzOTAxNCwiZXhwIjoyMDcxMzk5MDE0fQ.X-sQli-NTpCjeXpn19zf-maPRDldkSeTuhKZua1k8uM"
|
|
||||||
ENTITY = "sensor.hue_outdoor_motion_sensor_2_temperature"
|
|
||||||
|
|
||||||
HEADERS = {
|
|
||||||
"Authorization": f"Bearer {TOKEN}",
|
|
||||||
"Content-Type": "application/json",
|
|
||||||
}
|
|
||||||
|
|
||||||
begin = datetime(2025, 7, 1, 0, 0, 0, tzinfo=timezone.utc)
|
|
||||||
current = begin
|
|
||||||
now = datetime.now(timezone.utc)
|
|
||||||
|
|
||||||
while current < now:
|
|
||||||
current += timedelta(hours=1)
|
|
||||||
resp = requests.get(
|
|
||||||
f"{BASE}/api/history/period/{current.isoformat()}",
|
|
||||||
params={
|
|
||||||
"end_time": current.isoformat(),
|
|
||||||
"filter_entity_id": ENTITY
|
|
||||||
},
|
|
||||||
headers=HEADERS,
|
|
||||||
timeout=15,
|
|
||||||
)
|
|
||||||
print(current, resp.json())
|
|
||||||
|
|
@ -1,5 +1,5 @@
|
||||||
{
|
{
|
||||||
'hostname': '10.0.0.150',
|
'hostname': '10.0.0.162',
|
||||||
'bundles': [
|
'bundles': [
|
||||||
'bootshorn',
|
'bootshorn',
|
||||||
'systemd',
|
'systemd',
|
||||||
|
|
@ -7,14 +7,5 @@
|
||||||
],
|
],
|
||||||
'metadata': {
|
'metadata': {
|
||||||
'id': '25c6f3fd-0d32-42c3-aeb3-0147bc3937c7',
|
'id': '25c6f3fd-0d32-42c3-aeb3-0147bc3937c7',
|
||||||
'network': {
|
|
||||||
'internal': {
|
|
||||||
'ipv4': '10.0.0.150/24',
|
|
||||||
'mac': 'd6:d8:61:33:f2:05',
|
|
||||||
},
|
|
||||||
},
|
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
# rsync -avh --progress -e 'ssh -o "StrictHostKeyChecking no"' 10.0.0.150:/opt/bootshorn/recordings /hdd/bootshorn
|
|
||||||
# rsync -avh --progress -e 'ssh -o "StrictHostKeyChecking no"' 10.0.0.196:/opt/bootshorn/events ~/Downloads/bootshorn-events
|
|
||||||
|
|
|
||||||
|
|
@ -33,9 +33,6 @@
|
||||||
# ssh-ed25519
|
# ssh-ed25519
|
||||||
# AAAAC3NzaC1lZDI1NTE5AAAAIJT9Spe+BYue7iiutl3rSf6PlU6dthHizyK+ZWnLodrA
|
# AAAAC3NzaC1lZDI1NTE5AAAAIJT9Spe+BYue7iiutl3rSf6PlU6dthHizyK+ZWnLodrA
|
||||||
# root@home.server
|
# root@home.server
|
||||||
# - >-
|
|
||||||
# ssh-ed25519
|
|
||||||
# AAAAC3NzaC1lZDI1NTE5AAAAILMVroYmswD4tLk6iH+2tvQiyaMe42yfONDsPDIdFv6I ckn
|
|
||||||
# sftp: true
|
# sftp: true
|
||||||
# compatibility_mode: false
|
# compatibility_mode: false
|
||||||
# allow_agent_forwarding: false
|
# allow_agent_forwarding: false
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,6 @@
|
||||||
{
|
{
|
||||||
'dummy': True,
|
'dummy': True,
|
||||||
'hostname': '10.0.0.143',
|
'hostname': '10.0.2.100',
|
||||||
'groups': [
|
'groups': [
|
||||||
'home',
|
'home',
|
||||||
],
|
],
|
||||||
|
|
@ -8,13 +8,13 @@
|
||||||
'id': '87879bc1-130f-4fca-a8d2-e1d93a794df4',
|
'id': '87879bc1-130f-4fca-a8d2-e1d93a794df4',
|
||||||
'network': {
|
'network': {
|
||||||
'internal': {
|
'internal': {
|
||||||
'ipv4': '10.0.0.143/24',
|
'ipv4': '10.0.2.100/24',
|
||||||
'mac': '00:17:88:67:e7:f2',
|
'mac': '00:17:88:67:e7:f2',
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
'dns': {
|
'dns': {
|
||||||
'hue.ckn.li': {
|
'hue.ckn.li': {
|
||||||
'A': {'10.0.0.143'},
|
'A': {'10.0.2.100'},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
|
|
||||||
|
|
@ -207,10 +207,6 @@
|
||||||
'hdd/nextcloud/ckn-privat': {
|
'hdd/nextcloud/ckn-privat': {
|
||||||
'mountpoint': '/var/lib/nextcloud/ckn-privat/files',
|
'mountpoint': '/var/lib/nextcloud/ckn-privat/files',
|
||||||
},
|
},
|
||||||
'hdd/bootshorn': {
|
|
||||||
'mountpoint': '/hdd/bootshorn',
|
|
||||||
'dedup': 'on',
|
|
||||||
},
|
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
|
|
||||||
|
|
@ -171,28 +171,6 @@
|
||||||
'version': '1.6.11',
|
'version': '1.6.11',
|
||||||
'installer': False,
|
'installer': False,
|
||||||
},
|
},
|
||||||
'sysctl': {
|
|
||||||
'net': {
|
|
||||||
'ipv4': {
|
|
||||||
'ip_forward': 1,
|
|
||||||
'conf': {
|
|
||||||
'default': {
|
|
||||||
'forwarding': 1,
|
|
||||||
},
|
|
||||||
},
|
|
||||||
},
|
|
||||||
'ipv6': {
|
|
||||||
'conf': {
|
|
||||||
'all': {
|
|
||||||
'forwarding': 1,
|
|
||||||
},
|
|
||||||
'default': {
|
|
||||||
'forwarding': 1,
|
|
||||||
},
|
|
||||||
},
|
|
||||||
},
|
|
||||||
},
|
|
||||||
},
|
|
||||||
'vm': {
|
'vm': {
|
||||||
'cores': 2,
|
'cores': 2,
|
||||||
'ram': 4096,
|
'ram': 4096,
|
||||||
|
|
|
||||||
|
|
@ -7,7 +7,6 @@
|
||||||
],
|
],
|
||||||
'bundles': [
|
'bundles': [
|
||||||
'wireguard',
|
'wireguard',
|
||||||
'left4dead2',
|
|
||||||
],
|
],
|
||||||
'metadata': {
|
'metadata': {
|
||||||
'id': 'd5080b1a-b310-48be-bd5a-02cfcecf0c90',
|
'id': 'd5080b1a-b310-48be-bd5a-02cfcecf0c90',
|
||||||
|
|
@ -26,52 +25,6 @@
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
'left4dead2': {
|
|
||||||
'servers': {
|
|
||||||
'vanilla': {
|
|
||||||
'port': 27015,
|
|
||||||
'overlays': ['vanilla'],
|
|
||||||
'config': [
|
|
||||||
'sv_consistency 0',
|
|
||||||
],
|
|
||||||
},
|
|
||||||
'tick100': {
|
|
||||||
'port': 27016,
|
|
||||||
'arguments': ['-tickrate 100'],
|
|
||||||
'overlays': ['tickrate', 'vanilla'],
|
|
||||||
'config': [
|
|
||||||
'exec server_tickrate.cfg',
|
|
||||||
'sv_minupdaterate 101',
|
|
||||||
'sv_maxupdaterate 101',
|
|
||||||
'sv_mincmdrate 101',
|
|
||||||
'sv_maxcmdrate 101',
|
|
||||||
'sv_consistency 0',
|
|
||||||
],
|
|
||||||
},
|
|
||||||
'tick100_maps': {
|
|
||||||
'port': 27017,
|
|
||||||
'arguments': ['-tickrate 100'],
|
|
||||||
'overlays': ['tickrate', 'vanilla', 'workshop_maps'],
|
|
||||||
'config': [
|
|
||||||
'exec server_tickrate.cfg',
|
|
||||||
'sv_minupdaterate 101',
|
|
||||||
'sv_maxupdaterate 101',
|
|
||||||
'sv_mincmdrate 101',
|
|
||||||
'sv_maxcmdrate 101',
|
|
||||||
'sv_consistency 0',
|
|
||||||
],
|
|
||||||
},
|
|
||||||
'zonemod': {
|
|
||||||
'port': 27020,
|
|
||||||
'arguments': ['-tickrate 60'],
|
|
||||||
'overlays': ['competitive_rework'],
|
|
||||||
'config': [
|
|
||||||
'exec server_competitive_rework.cfg',
|
|
||||||
'sm_forcematch zonemod',
|
|
||||||
],
|
|
||||||
},
|
|
||||||
},
|
|
||||||
},
|
|
||||||
'bind': {
|
'bind': {
|
||||||
'master_node': 'htz.mails',
|
'master_node': 'htz.mails',
|
||||||
'hostname': 'secondary.resolver.name',
|
'hostname': 'secondary.resolver.name',
|
||||||
|
|
@ -93,5 +46,11 @@
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
'nftables': {
|
||||||
|
'input': {
|
||||||
|
'tcp dport 27015 accept',
|
||||||
|
'udp dport { 27005, 27015, 27020 } accept',
|
||||||
|
},
|
||||||
|
},
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,4 @@
|
||||||
bundlewrap ~=4.0, >=4.23.1
|
bundlewrap ~=4.0, >=4.17.2
|
||||||
pycryptodome
|
pycryptodome
|
||||||
PyNaCl
|
PyNaCl
|
||||||
PyYAML
|
PyYAML
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue