l4d start script refactor

This commit is contained in:
CroneKorkN 2025-10-29 12:25:05 +01:00
parent 776654970e
commit e6312a2318
Signed by: cronekorkn
SSH key fingerprint: SHA256:v0410ZKfuO1QHdgKBsdQNF64xmTxOF8osF1LIqwTcVw
5 changed files with 111 additions and 35 deletions

View file

@ -90,17 +90,31 @@ 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 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 steam chmod +x /opt/l4d2/steam-workshop-download
# -- OVERLAY PVE -- # # -- OVERLAY VANILLA -- #
steam mkdir -p /opt/l4d2/overlays/pve steam mkdir -p /opt/l4d2/overlays/vanilla
# server config # server config
steam mkdir -p /opt/l4d2/overlays/pve/left4dead2/cfg steam mkdir -p /opt/l4d2/overlays/vanilla/left4dead2/cfg
steam cat <<'EOF' > /opt/l4d2/overlays/pve/left4dead2/cfg/server.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
motd_enabled 0 motd_enabled 0
sv_steamgroup "38347879" sv_steamgroup "38347879"
#sv_steamgroup_exclusive 0
# https://github.com/SirPlease/L4D2-Competitive-Rework/blob/7ecc3a32a5e2180d6607a40119ff2f3c072502a9/cfg/server.cfg#L58-L69 # https://github.com/SirPlease/L4D2-Competitive-Rework/blob/7ecc3a32a5e2180d6607a40119ff2f3c072502a9/cfg/server.cfg#L58-L69
sv_minrate 100000 sv_minrate 100000
@ -113,15 +127,10 @@ nb_update_frequency 0.014
net_splitpacket_maxrate 50000 net_splitpacket_maxrate 50000
net_maxcleartime 0.0001 net_maxcleartime 0.0001
fps_max 0 fps_max 0
#sv_cheats 1
#sb_all_bot_game 1
EOF EOF
# admin system # admin system
install_addon pve Ions_Vocalizer install_tickrate_enabler tickrate
install_admin_system pve
install_tickrate_enabler pve
# -- OVERLAY COMPETITIVE REWORK WIP -- # # -- OVERLAY COMPETITIVE REWORK WIP -- #

View file

@ -2,10 +2,41 @@
set -xeuo pipefail set -xeuo pipefail
name=$1 name=""
overlay=$2 port=""
port=$3 configfile=""
params=$4 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() { function steam() {
# für systemd, damit es den prozess beenden kann # für systemd, damit es den prozess beenden kann
@ -13,23 +44,33 @@ function steam() {
export HOME=/opt/l4d2/steam export HOME=/opt/l4d2/steam
} }
# -- TIDY UP -- #
mountpoint -q "/opt/l4d2/servers/$name/merged" && umount "/opt/l4d2/servers/$name/merged" mountpoint -q "/opt/l4d2/servers/$name/merged" && umount "/opt/l4d2/servers/$name/merged"
steam rm -rf "/opt/l4d2/servers/$name" steam rm -rf "/opt/l4d2/servers/$name"
# -- CREATE DIRECTORIES -- #
steam mkdir -p \ steam mkdir -p \
"/opt/l4d2/servers/$name" \ "/opt/l4d2/servers/$name" \
"/opt/l4d2/servers/$name/work" \ "/opt/l4d2/servers/$name/work" \
"/opt/l4d2/servers/$name/upper" \ "/opt/l4d2/servers/$name/upper" \
"/opt/l4d2/servers/$name/merged" "/opt/l4d2/servers/$name/merged"
# -- MOUNT OVERLAYFS -- #
mount -t overlay overlay \ mount -t overlay overlay \
-o "lowerdir=/opt/l4d2/overlays/$overlay:/opt/l4d2/installation,upperdir=/opt/l4d2/servers/$name/upper,workdir=/opt/l4d2/servers/$name/work" \ -o "lowerdir=$overlays/opt/l4d2/installation,upperdir=/opt/l4d2/servers/$name/upper,workdir=/opt/l4d2/servers/$name/work" \
"/opt/l4d2/servers/$name/merged" "/opt/l4d2/servers/$name/merged"
# TODO: pass config file paht instead of expecting it here # -- REPLACE SERVER.CFG -- #
steam mv "/opt/l4d2/servers/$name/merged/left4dead2/cfg/server.cfg" "/opt/l4d2/servers/$name/merged/left4dead2/cfg/server_original.cfg"
steam touch "/opt/l4d2/servers/$name/merged/left4dead2/cfg/server.cfg"
echo "exec server_original.cfg" > "/opt/l4d2/servers/$name/merged/left4dead2/cfg/server.cfg"
cat "/opt/l4d2/configs/$name.cfg" >> "/opt/l4d2/servers/$name/merged/left4dead2/cfg/server.cfg"
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" $params +map c1m1_hotel if [[ -n "$configfile" ]]; then
cp "/opt/l4d2/servers/$name/merged/left4dead2/cfg/server.cfg" "/opt/l4d2/servers/$name/merged/left4dead2/cfg/server_original.cfg"
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

View file

@ -0,0 +1,19 @@
#!/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"

View file

@ -46,12 +46,18 @@ def server_units(metadata):
for name, config in metadata.get('left4dead2').items(): for name, config in metadata.get('left4dead2').items():
assert match(r'^[A-z0-9-_-]+$', name) assert match(r'^[A-z0-9-_-]+$', name)
assert config["overlay"] in {'pve', 'competitive_rework'}
assert 27000 <= config["port"] <= 27100 assert 27000 <= config["port"] <= 27100
params = config.get("params", "") cmd = f'/opt/l4d2/start -n {name} -p {config["port"]}'
if config.get("tickrate"):
params = f"-tickrate {config['tickrate']} " + params if 'config' in config:
cmd += f' -c /opt/l4d2/configs/{name}.cfg'
for overlay in config.get('overlays', []):
cmd += f' -o {overlay}'
if 'arguments' in config:
cmd += ' -- ' + ' '.join(config['arguments'])
units[f'left4dead2-{name}.service'] = { units[f'left4dead2-{name}.service'] = {
'Unit': { 'Unit': {
@ -61,7 +67,8 @@ def server_units(metadata):
}, },
'Service': { 'Service': {
'Type': 'simple', 'Type': 'simple',
'ExecStart': f'/opt/l4d2/start "{name}" "{config["overlay"]}" "{config["port"]}" "{params}"', 'ExecStart': cmd,
'ExecStop': f'/opt/l4d2/stop -n {name}',
'Restart': 'on-failure', 'Restart': 'on-failure',
'Nice': -10, 'Nice': -10,
'CPUWeight': 200, 'CPUWeight': 200,

View file

@ -27,21 +27,21 @@
}, },
}, },
'left4dead2': { 'left4dead2': {
'server1': { 'vanilla': {
'overlay': 'pve',
'port': 27015, 'port': 27015,
'tickrate': '100', 'overlays': ['vanilla'],
}, },
'server2': { 'tick100': {
'overlay': 'pve',
'port': 27016, 'port': 27016,
'tickrate': '100', 'overlays': ['vanilla', 'tickrate'],
'arguments': ['-tickrate 100'],
}, },
'server3_comp1': { 'server3_comp1': {
'overlay': 'competitive_rework',
'port': 27017, 'port': 27017,
'tickrate': '100', 'overlays': ['competitive_rework'],
'arguments': ['-tickrate 60'],
'config': [ 'config': [
'exec server_original.cfg',
'sm_forcematch zonemod', 'sm_forcematch zonemod',
'hostname server3_comp1_test', 'hostname server3_comp1_test',
'motd_enabled 0', 'motd_enabled 0',