l4d2: tickrate enabler
This commit is contained in:
		
							parent
							
								
									b4cba98564
								
							
						
					
					
						commit
						084cf958a0
					
				
					 6 changed files with 102 additions and 24 deletions
				
			
		|  | @ -2,6 +2,46 @@ | ||||||
| 
 | 
 | ||||||
| set -xeuo pipefail | 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 "$@" | ||||||
|  |     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 | getent passwd steam >/dev/null || useradd -M -d /opt/l4d2 -s /bin/bash steam | ||||||
| mkdir -p /opt/l4d2 /tmp/dumps | mkdir -p /opt/l4d2 /tmp/dumps | ||||||
| chown steam:steam /opt/l4d2 /tmp/dumps | chown steam:steam /opt/l4d2 /tmp/dumps | ||||||
|  | @ -9,12 +49,6 @@ dpkg --add-architecture i386 | ||||||
| apt update | apt update | ||||||
| DEBIAN_FRONTEND=noninteractive apt install -y libc6:i386 lib32z1 | DEBIAN_FRONTEND=noninteractive apt install -y libc6:i386 lib32z1 | ||||||
| 
 | 
 | ||||||
| function steam() { |  | ||||||
|     # für systemd, damit es den prozess beenden kann |  | ||||||
|     setpriv --reuid=steam --regid=steam --init-groups "$@" |  | ||||||
|     export HOME=/opt/l4d2/steam |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| # -- STEAM -- # | # -- STEAM -- # | ||||||
| 
 | 
 | ||||||
| steam mkdir -p /opt/l4d2/steam | steam mkdir -p /opt/l4d2/steam | ||||||
|  | @ -77,18 +111,47 @@ net_splitpacket_maxrate 60000 | ||||||
| EOF | EOF | ||||||
| 
 | 
 | ||||||
| # admin system | # admin system | ||||||
| steam mkdir -p /opt/l4d2/overlays/pve/left4dead2/addons | install_addon pve Ions_Vocalizer | ||||||
| test -f /opt/l4d2/overlays/pve/left4dead2/addons/2524204971.vpk || \ | install_admin_system pve | ||||||
|     steam /opt/l4d2/steam-workshop-download 2524204971 --out /opt/l4d2/overlays/pve/left4dead2/addons | install_tickrate_enabler pve | ||||||
| steam mkdir -p "/opt/l4d2/overlays/pve/left4dead2/ems/admin system" |  | ||||||
| steam echo "STEAM_1:0:12376499" > "/opt/l4d2/overlays/pve/left4dead2/ems/admin system/admins.txt" |  | ||||||
| 
 | 
 | ||||||
| # ions vocalizer | # -- OVERLAY 100TICK -- # | ||||||
| test -f /opt/l4d2/overlays/pve/left4dead2/addons/698857882.vpk || \ |  | ||||||
|     steam /opt/l4d2/steam-workshop-download 698857882 --out /opt/l4d2/overlays/pve/left4dead2/addons |  | ||||||
| 
 | 
 | ||||||
| test -f /opt/l4d2/overlays/pve/left4dead2/addons/1575673903.vpk || \ | # steam mkdir -p /opt/l4d2/overlays/100tick | ||||||
|     steam /opt/l4d2/steam-workshop-download 1575673903 --out /opt/l4d2/overlays/pve/left4dead2/addons | 
 | ||||||
|  | # install_tickrate_enabler 100tick | ||||||
|  | 
 | ||||||
|  | # # server config | ||||||
|  | # steam mkdir -p /opt/l4d2/overlays/100tick/left4dead2/cfg | ||||||
|  | # steam cat <<'EOF' > /opt/l4d2/overlays/100tick/left4dead2/cfg/server.cfg | ||||||
|  | # motd_enabled 0 | ||||||
|  | # sv_steamgroup "38347879" | ||||||
|  | # sv_minrate 60000 | ||||||
|  | # sv_maxrate 0 | ||||||
|  | # EOF | ||||||
|  | 
 | ||||||
|  | # -- 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/README.md || \ | ||||||
|  | #     curl -L https://github.com/SirPlease/L4D2-Competitive-Rework/archive/refs/heads/master.zip | steam unzip -d /opt/l4d2/overlays/competitive_rework/left4dead2 | ||||||
|  | 
 | ||||||
|  | # # admin system | ||||||
|  | # steam mkdir -p /opt/l4d2/overlays/pve/left4dead2/addons | ||||||
|  | # test -f /opt/l4d2/overlays/pve/left4dead2/addons/2524204971.vpk || \ | ||||||
|  | #     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" | ||||||
|  | # steam echo "STEAM_1:0:12376499" > "/opt/l4d2/overlays/pve/left4dead2/ems/admin system/admins.txt" | ||||||
|  | 
 | ||||||
|  | # # ions vocalizer | ||||||
|  | # test -f /opt/l4d2/overlays/pve/left4dead2/addons/698857882.vpk || \ | ||||||
|  | #     steam /opt/l4d2/steam-workshop-download 698857882 --out /opt/l4d2/overlays/pve/left4dead2/addons | ||||||
|  | 
 | ||||||
|  | # test -f /opt/l4d2/overlays/pve/left4dead2/addons/1575673903.vpk || \ | ||||||
|  | #     steam /opt/l4d2/steam-workshop-download 1575673903 --out /opt/l4d2/overlays/pve/left4dead2/addons | ||||||
| 
 | 
 | ||||||
| # -- SERVERS -- # | # -- SERVERS -- # | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -5,6 +5,7 @@ set -xeuo pipefail | ||||||
| name=$1 | name=$1 | ||||||
| overlay=$2 | overlay=$2 | ||||||
| port=$3 | port=$3 | ||||||
|  | params=$4 | ||||||
| 
 | 
 | ||||||
| function steam() { | function steam() { | ||||||
|     # für systemd, damit es den prozess beenden kann |     # für systemd, damit es den prozess beenden kann | ||||||
|  | @ -25,4 +26,4 @@ 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=/opt/l4d2/overlays/$overlay:/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" | ||||||
| 
 | 
 | ||||||
| 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 | steam "/opt/l4d2/servers/$name/merged/srcds_run" -norestart -pidfile "/opt/l4d2/servers/$name/pid" -game left4dead2 -ip 0.0.0.0 -port "$port" $params +hostname "Crone_$name" +map c1m1_hotel | ||||||
|  | @ -1,6 +1,9 @@ | ||||||
| files = { | files = { | ||||||
|     '/opt/l4d2/setup': { |     '/opt/l4d2/setup': { | ||||||
|         'mode': '755', |         'mode': '755', | ||||||
|  |         'triggers': { | ||||||
|  |             'svc_systemd:left4dead2-initialize.service:restart', | ||||||
|  |         }, | ||||||
|     }, |     }, | ||||||
|     '/opt/l4d2/start': { |     '/opt/l4d2/start': { | ||||||
|         'mode': '755', |         'mode': '755', | ||||||
|  | @ -12,6 +15,7 @@ svc_systemd = { | ||||||
|         'enabled': True, |         'enabled': True, | ||||||
|         'running': None, |         'running': None, | ||||||
|         'needs': { |         'needs': { | ||||||
|  |             'file:/opt/l4d2/setup', | ||||||
|             'file:/usr/local/lib/systemd/system/left4dead2-initialize.service', |             'file:/usr/local/lib/systemd/system/left4dead2-initialize.service', | ||||||
|         }, |         }, | ||||||
|     }, |     }, | ||||||
|  | @ -27,5 +31,5 @@ for server_name in node.metadata.get('left4dead2').keys(): | ||||||
|         'needs': { |         'needs': { | ||||||
|             'svc_systemd:left4dead2-initialize.service', |             'svc_systemd:left4dead2-initialize.service', | ||||||
|             f'file:/usr/local/lib/systemd/system/left4dead2-{server_name}.service', |             f'file:/usr/local/lib/systemd/system/left4dead2-{server_name}.service', | ||||||
|         } |         }, | ||||||
|     } |     } | ||||||
|  |  | ||||||
|  | @ -46,9 +46,13 @@ 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'} |         assert config["overlay"] in {'pve', '100tick'} | ||||||
|         assert 27000 <= config["port"] <= 27100 |         assert 27000 <= config["port"] <= 27100 | ||||||
| 
 | 
 | ||||||
|  |         params = config.get("params", "") | ||||||
|  |         if config.get("tickrate"): | ||||||
|  |             params += f" -tickrate {config['tickrate']}" | ||||||
|  | 
 | ||||||
|         units[f'left4dead2-{name}.service'] = { |         units[f'left4dead2-{name}.service'] = { | ||||||
|             'Unit': { |             'Unit': { | ||||||
|                 'Description': f'left4dead2 server {name}', |                 'Description': f'left4dead2 server {name}', | ||||||
|  | @ -57,7 +61,7 @@ def server_units(metadata): | ||||||
|             }, |             }, | ||||||
|             'Service': { |             'Service': { | ||||||
|                 'Type': 'simple', |                 'Type': 'simple', | ||||||
|                 'ExecStart': f'/opt/l4d2/start {name} {config["overlay"]} {config["port"]}', |                 'ExecStart': f'/opt/l4d2/start "{name}" "{config["overlay"]}" "{config["port"]}" "{params}"', | ||||||
|                 'Restart': 'on-failure', |                 'Restart': 'on-failure', | ||||||
|                 'Nice': -10, |                 'Nice': -10, | ||||||
|                 'CPUWeight': 200, |                 'CPUWeight': 200, | ||||||
|  | @ -67,6 +71,9 @@ def server_units(metadata): | ||||||
|             'Install': { |             'Install': { | ||||||
|                 'WantedBy': {'multi-user.target'}, |                 'WantedBy': {'multi-user.target'}, | ||||||
|             }, |             }, | ||||||
|  |             'triggers': { | ||||||
|  |                 f'svc_systemd:left4dead2-{name}.service:restart', | ||||||
|  |             }, | ||||||
|         } |         } | ||||||
| 
 | 
 | ||||||
|     return { |     return { | ||||||
|  |  | ||||||
|  | @ -1,5 +1,8 @@ | ||||||
| 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, | ||||||
|  | @ -42,6 +45,9 @@ 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[attribute] = unit.pop(attribute) | ||||||
| 
 | 
 | ||||||
|     files[path] = { |     files[path] = { | ||||||
|         'content': repo.libs.systemd.generate_unitfile(unit), |         'content': repo.libs.systemd.generate_unitfile(unit), | ||||||
|  |  | ||||||
|  | @ -34,10 +34,7 @@ | ||||||
|             'server2': { |             'server2': { | ||||||
|                 'overlay': 'pve', |                 'overlay': 'pve', | ||||||
|                 'port': 27016, |                 'port': 27016, | ||||||
|             }, |                 'tickrate': '100', | ||||||
|             'server3': { |  | ||||||
|                 'overlay': 'pve', |  | ||||||
|                 'port': 27017, |  | ||||||
|             }, |             }, | ||||||
|         }, |         }, | ||||||
|         'bind': { |         'bind': { | ||||||
|  |  | ||||||
		Loading…
	
		Reference in a new issue