wip
This commit is contained in:
parent
46e180ee96
commit
40a2353bed
7 changed files with 150 additions and 137 deletions
41
bundles/left4dead2/files/server.cfg
Normal file
41
bundles/left4dead2/files/server.cfg
Normal file
|
@ -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.
|
|
@ -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$'"
|
||||
),
|
||||
}
|
||||
|
|
|
@ -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",
|
||||
},
|
||||
},
|
||||
}
|
||||
|
|
7
bundles/steam-workshop-download/items.py
Normal file
7
bundles/steam-workshop-download/items.py
Normal file
|
@ -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',
|
||||
},
|
||||
}
|
35
bundles/steam-workshop-download/metadata.py
Normal file
35
bundles/steam-workshop-download/metadata.py
Normal file
|
@ -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,
|
||||
},
|
||||
}
|
|
@ -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': {
|
||||
|
|
|
@ -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': {},
|
||||
|
|
Loading…
Reference in a new issue