From 40a2353bed732555dd05787052655a8369f04b3e Mon Sep 17 00:00:00 2001 From: cronekorkn Date: Sun, 25 Sep 2022 16:24:10 +0200 Subject: [PATCH] wip --- bundles/left4dead2/files/server.cfg | 41 +++++++++ bundles/left4dead2/items.py | 98 ++++----------------- bundles/left4dead2/metadata.py | 71 +++++++-------- bundles/steam-workshop-download/items.py | 7 ++ bundles/steam-workshop-download/metadata.py | 35 ++++++++ bundles/steam/items.py | 18 +--- nodes/netcup.mails.py | 17 ++++ 7 files changed, 150 insertions(+), 137 deletions(-) create mode 100644 bundles/left4dead2/files/server.cfg create mode 100644 bundles/steam-workshop-download/items.py create mode 100644 bundles/steam-workshop-download/metadata.py diff --git a/bundles/left4dead2/files/server.cfg b/bundles/left4dead2/files/server.cfg new file mode 100644 index 0000000..d73a3bc --- /dev/null +++ b/bundles/left4dead2/files/server.cfg @@ -0,0 +1,41 @@ +hostname "CKN TEST" +sv_contact "admin@sublimity.de" + +// STEAM GROUP +sv_steamgroup 103582791467869287 + +// CHEAT/CONFIG +sv_lan 0 +sv_cheats 1 +sv_consistency 0 +sv_maxcmdrate 101 +sv_maxrate 30000 + +// ADVERTRISMENTS +sm_advertisements_enabled 0 +sm_advertisements_interval 480 + +// MOTD +motd_enabled 0 + +// GAME MODE +sv_gametypes "coop,realism,survival,versus,teamversus,scavenge,teamscavenge" +sm_cvar mp_gamemode realism + +// DIFFICULTY +z_difficulty Impossible + +// LOBBY CONNECT +sv_allow_lobby_connect_only 0 + +// COMMUNICATION +sv_voiceenable 1 //default 1; enable/disable voice comm + +// LOGGING +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). +sv_logsdir "logs-${name}" //Folder in the game directory where server logs will be stored. diff --git a/bundles/left4dead2/items.py b/bundles/left4dead2/items.py index bf7208e..27ad5e8 100644 --- a/bundles/left4dead2/items.py +++ b/bundles/left4dead2/items.py @@ -1,106 +1,40 @@ +assert node.has_bundle('steam') and node.has_bundle('steam-workshop-download') + directories = { - '/opt/left4dead2': { + '/opt/steam/left4dead2/ems/admin system': { 'owner': 'steam', }, - '/opt/left4dead2/ems/admin system': { + '/opt/steam/left4dead2/left4dead2/cfg/server': { 'owner': 'steam', + 'purge': True, }, - '/opt/left4dead2/left4dead2/cfg': { - 'owner': 'steam', - }, - '/opt/left4dead2/left4dead2/addons': { + '/opt/steam/left4dead2/left4dead2/addons': { 'owner': 'steam', 'purge': True, }, } files = { - '/opt/left4dead2/ems/admin system/admins.txt': { + '/opt/steam/left4dead2/ems/admin system/admins.txt': { 'owner': 'steam', 'content': '\n'.join(node.metadata.get('left4dead2/admins')), } } -svc_systemd = { - 'left4dead2-workshop': { - 'running': False, - 'needs': [ - 'svc_systemd:steam-update', - ], - }, -} - -for id in node.metadata.get('left4dead2/workshop'): - directories[f'/opt/left4dead2/left4dead2/addons/{id}'] = { - 'owner': 'steam', - 'triggers': [ - 'svc_systemd:left4dead2-workshop:restart', - ], - } - -server_units = set() for name, config in node.metadata.get('left4dead2/servers').items(): - config.pop('port') - config = { - 'hostname': name, - 'sv_steamgroup': ','.join( - str(gid) for gid in node.metadata.get('left4dead2/steamgroups') - ), - 'z_difficulty': 'Impossible', - 'sv_gametypes': 'realism', - 'sv_region': 3, # europe - 'log': 'on', - 'sv_logecho': 1, - 'sv_logfile': 1, - 'sv_log_onefile': 0, - 'sv_logbans': 1, - 'sv_logflush': 0, - 'sv_logsdir': 'logs', # /opt/left4dead2/left4dead2/logs - **config, - } - - files[f'/opt/left4dead2/left4dead2/cfg/server-{name}.cfg'] = { - 'content': '\n'.join( - f'{key} "{value}"' for key, value in sorted(config.items()) - ) + '\n', + files[f'/opt/steam/left4dead2/left4dead2/cfg/server/{name}.cfg'] = { + 'content_type': 'mako', + 'source': 'server.cfg', + 'context': { + 'name': name, + }, 'owner': 'steam', 'triggers': [ - f'svc_systemd:left4dead2-server-{name}:restart', + f'svc_systemd:left4dead2-{name}.service:restart', ], } - svc_systemd[f'left4dead2-server-{name}'] = { + svc_systemd[f'left4dead2-{name}.service'] = { 'needs': [ - f'file:/usr/local/lib/systemd/system/left4dead2-server-{name}.service', + f'file:/usr/local/lib/systemd/system/left4dead2-{name}.service', ], } - server_units.add(f'left4dead2-server-{name}') - - -for id in node.metadata.get('left4dead2/workshop'): - directories[f'/opt/left4dead2/addons/{id}'] = { - 'owner': 'steam', - 'triggers': [ - 'svc_systemd:left4dead2-workshop:restart', - ], - } - -# TIDYUP - -find_obsolete_units = ( - 'find /usr/local/lib/systemd/system -type f -name "left4dead2-server-*.service" ' + - ' '.join(f"! -name '{name}.service'" for name in server_units) -) -actions['remove_obsolete_left4dead2_units'] = { - 'command': ( - f'for unitfile in $({find_obsolete_units}); ' - f'do ' - f'systemctl stop $(basename "$unitfile"); ' - f'systemctl disable $(basename "$unitfile"); ' - f'rm "$unitfile"; ' - f'systemctl daemon-reload; ' - f'done' - ), - 'unless': ( - find_obsolete_units + " | wc -l | grep -q '^0$'" - ), -} diff --git a/bundles/left4dead2/metadata.py b/bundles/left4dead2/metadata.py index 89ffbf1..b21bf36 100644 --- a/bundles/left4dead2/metadata.py +++ b/bundles/left4dead2/metadata.py @@ -17,43 +17,20 @@ defaults = { @metadata_reactor.provides( - 'systemd/units', + 'steam-workshop-download/left4dead', ) -def workshop(metadata): - command = ( - 'set -x; ' - 'for ID in ' + ' '.join(metadata.get('left4dead2/workshop')) + '; ' - 'do ' - 'if ! ls /opt/left4dead2/left4dead2/addons/$ID/*.vpk; ' - 'then ' - 'cd /opt/left4dead2/left4dead2/addons/$ID; ' - '/opt/steam-workshop-downloader https://steamcommunity.com/sharedfiles/filedetails\?id\=$ID; ' - 'unzip $ID.zip; ' - 'fi; ' - 'done' - ) - +def workshop_download(metadata): + if not metadata.get('left4dead2/workshop'): + return {} + return { - 'systemd': { - 'units': { - 'left4dead2-workshop.service': { - 'Unit': { - 'Description': 'install workshop items', - 'After': 'network.target', - 'Requires': 'steam-update.service', - 'PartOf': 'steam-update.service' - }, - 'Service': { - 'Type': 'oneshot', - 'User': 'steam', - 'ExecStart': f'/bin/bash -c {quote(command)}', - }, - 'Install': { - 'WantedBy': {'multi-user.target'}, - }, - } - } - } + 'steam-workshop-download': { + 'left4dead': { + 'ids': metadata.get('left4dead2/workshop'), + 'path': '/opt/steam/left4dead2/left4dead2/addons', + 'user': 'steam', + }, + }, } @@ -62,9 +39,9 @@ def workshop(metadata): ) def server_units(metadata): units = {} - + for name, config in metadata.get('left4dead2/servers').items(): - units[f'left4dead2-server-{name}.service'] = { + units[f'left4dead2-{name}.service'] = { 'Unit': { 'Description': f'left4dead2 server {name}', 'After': 'network.target', @@ -73,8 +50,8 @@ def server_units(metadata): 'Service': { 'User': 'steam', 'Group': 'steam', - 'WorkingDirectory': '/opt/left4dead2', - 'ExecStart': f'/opt/left4dead2/srcds_run -port {config["port"]} -insecure +map {config["map"]} +exec server-{name}.cfg', + 'WorkingDirectory': '/opt/steam/left4dead2', + 'ExecStart': f'/opt/steam/left4dead2/srcds_run -port {config["port"]} -insecure +exec config/{name}.cfg', 'Restart': 'on-failure', }, 'Install': { @@ -87,3 +64,19 @@ def server_units(metadata): '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(ports)} }} accept", + f"udp dport {{ {', '.join(ports)} }} accept", + }, + }, + } diff --git a/bundles/steam-workshop-download/items.py b/bundles/steam-workshop-download/items.py new file mode 100644 index 0000000..8a690b6 --- /dev/null +++ b/bundles/steam-workshop-download/items.py @@ -0,0 +1,7 @@ +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', + }, +} diff --git a/bundles/steam-workshop-download/metadata.py b/bundles/steam-workshop-download/metadata.py new file mode 100644 index 0000000..5470593 --- /dev/null +++ b/bundles/steam-workshop-download/metadata.py @@ -0,0 +1,35 @@ +from shlex import quote + + +defaults = { + 'steam-workshop-download': {}, +} + + +@metadata_reactor.provides( + 'systemd/units', +) +def workshop(metadata): + units = {} + + for name, conf in metadata.get('steam-workshop-download').items(): + units[f'steam-workshop-download-{name}.service'] = { + 'Unit': { + 'Description': 'install workshop items', + 'After': 'network-online.target', + }, + 'Service': { + 'Type': 'oneshot', + 'User': conf['user'], + 'ExecStart': f"/opt/steam-workshop-download {' '.join(quote(str(id)) for id in conf['ids'])} --out {quote(conf['path'])}", + }, + 'Install': { + 'WantedBy': {'multi-user.target'}, + }, + } + + return { + 'systemd': { + 'units': units, + }, + } diff --git a/bundles/steam/items.py b/bundles/steam/items.py index 9a196ee..451d702 100644 --- a/bundles/steam/items.py +++ b/bundles/steam/items.py @@ -22,7 +22,7 @@ for game in node.metadata.get('steam/games'): 'owner': 'steam', 'group': 'steam', 'needed_by': [ - 'svc_systemd:steam-update', + 'svc_systemd:steam-update.service', ], } @@ -33,22 +33,8 @@ files = { 'owner': 'steam', 'group': 'steam', }, - '/opt/steam/steam/workshop-downloader': { - 'content_type': 'download', - 'source': 'https://github.com/SegoCode/swd/releases/download/1.1/swd-linux-amd64', - 'owner': 'steam', - 'group': 'steam', - 'mode': '750', - }, } -# symlinks = { -# # /opt/steam/.steam/sdk32/steamclient.so: cannot open shared object file: No such file or directory -# '/opt/steam/.steam/sdk32': { -# 'target': '/opt/steam/linux32', -# } -# } - actions = { 'extract_steamcmd': { 'command': """su - steam -c 'tar xfvz /opt/steam/steam/steamcmd_linux.tar.gz --directory /opt/steam/steam'""", @@ -59,7 +45,7 @@ actions = { }, } -svc_systemd['steam-update'] = { +svc_systemd['steam-update.service'] = { 'running': False, 'enabled': False, 'needs': { diff --git a/nodes/netcup.mails.py b/nodes/netcup.mails.py index 4e75990..a2da91d 100644 --- a/nodes/netcup.mails.py +++ b/nodes/netcup.mails.py @@ -17,6 +17,8 @@ 'lonercrew', 'build-ci', 'steam', + 'steam-workshop-download', + 'left4dead2', ], 'metadata': { 'id': 'ea29bdf0-0b47-4bf4-8346-67d60c9dc4ae', @@ -68,6 +70,21 @@ 'download-server': { 'hostname': 'dl.sublimity.de', }, + 'left4dead2': { + 'servers': { + 'standard': { + 'port': 27020, + }, + }, + 'admins': { + 'STEAM_0:0:12376499', # CroneKorkN + }, + 'workshop': { + 214630948, + 1229957234, + 698857882, + }, + }, 'letsencrypt': { 'domains': { 'ckn.li': {},