from re import match defaults = { 'apt': { 'packages': { 'libc6_i386': {}, # installs libc6:i386 'lib32z1': {}, 'unzip': {}, }, }, 'left4dead2': {}, '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( 'systemd/units', ) def server_units(metadata): units = {} for name, config in metadata.get('left4dead2').items(): assert match(r'^[A-z0-9-_-]+$', name) assert config["overlay"] in {'pve'} assert 27000 <= config["port"] <= 27100 units[f'left4dead2-{name}.service'] = { 'Unit': { 'Description': f'left4dead2 server {name}', 'After': {'left4dead2-initialize.service'}, 'Requires': {'left4dead2-initialize.service'}, }, 'Service': { 'Type': 'simple', 'ExecStart': f'/opt/l4d2/start {name} {config["overlay"]} {config["port"]}', 'Restart': 'on-failure', 'StandardOutput': 'journal', 'StandardError': 'journal', 'KillMode': 'control-group', 'KillSignal': 'SIGINT', 'TimeoutStopSec': '10s', 'Environment': 'HOME=/opt/l4d2/steam', }, 'Install': { 'WantedBy': {'multi-user.target'}, }, } return { 'systemd': { 'units': units, }, } @metadata_reactor.provides( 'nftables/input', ) def nftables(metadata): ports = sorted(str(config["port"]) for config in metadata.get('left4dead2', {}).values()) return { 'nftables': { 'input': { f'ip protocol {{ tcp, udp }} th dport {{ {", ".join(ports)} }} accept' }, }, }