120 lines
		
	
	
	
		
			3.4 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			120 lines
		
	
	
	
		
			3.4 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
from re import match
 | 
						|
from os import path, listdir
 | 
						|
 | 
						|
 | 
						|
defaults = {
 | 
						|
    'apt': {
 | 
						|
        'packages': {
 | 
						|
            'libc6_i386': {}, # installs libc6:i386
 | 
						|
            'lib32z1': {},
 | 
						|
            'unzip': {},
 | 
						|
            'p7zip-full': {}, # l4d2center_maps_sync.sh
 | 
						|
        },
 | 
						|
    },
 | 
						|
    'left4dead2': {
 | 
						|
        'overlays': set(listdir(path.join(repo.path, 'bundles/left4dead2/files/scripts/overlays'))),
 | 
						|
        'servers': {
 | 
						|
            # 'port': 27017,
 | 
						|
            # 'overlays': ['competitive_rework'],
 | 
						|
            # 'arguments': ['-tickrate 60'],
 | 
						|
            # 'config': [
 | 
						|
            #     'exec server_original.cfg',
 | 
						|
            #     'sm_forcematch zonemod',
 | 
						|
            # ],
 | 
						|
        },
 | 
						|
    },
 | 
						|
    '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/servers').items():
 | 
						|
        assert match(r'^[A-z0-9-_-]+$', name)
 | 
						|
        assert 27000 <= config["port"] <= 27100
 | 
						|
        for overlay in config.get('overlays', []):
 | 
						|
            assert overlay in metadata.get('left4dead2/overlays'), f"unknown overlay {overlay}, known: {metadata.get('left4dead2/overlays')}"
 | 
						|
 | 
						|
        cmd = f'/opt/l4d2/start -n {name} -p {config["port"]}'
 | 
						|
 | 
						|
        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'] = {
 | 
						|
            'Unit': {
 | 
						|
                'Description': f'left4dead2 server {name}',
 | 
						|
                'After': {'left4dead2-initialize.service'},
 | 
						|
                'Requires': {'left4dead2-initialize.service'},
 | 
						|
            },
 | 
						|
            'Service': {
 | 
						|
                'Type': 'simple',
 | 
						|
                'ExecStart': cmd,
 | 
						|
                'ExecStop': f'/opt/l4d2/stop -n {name}',
 | 
						|
                'Restart': 'on-failure',
 | 
						|
                'Nice': -10,
 | 
						|
                'CPUWeight': 200,
 | 
						|
                'IOSchedulingClass': 'best-effort',
 | 
						|
                'IOSchedulingPriority': 0,
 | 
						|
            },
 | 
						|
            'Install': {
 | 
						|
                'WantedBy': {'multi-user.target'},
 | 
						|
            },
 | 
						|
            'triggers': {
 | 
						|
                f'svc_systemd:left4dead2-{name}.service:restart',
 | 
						|
            },
 | 
						|
        }
 | 
						|
 | 
						|
    return {
 | 
						|
        'systemd': {
 | 
						|
            'units': units,
 | 
						|
        },
 | 
						|
    }
 | 
						|
 | 
						|
 | 
						|
@metadata_reactor.provides(
 | 
						|
    'nftables/input',
 | 
						|
)
 | 
						|
def nftables(metadata):
 | 
						|
    ports = sorted(str(config["port"]) for config in metadata.get('left4dead2/servers').values())
 | 
						|
 | 
						|
    return {
 | 
						|
        'nftables': {
 | 
						|
            'input': {
 | 
						|
                f'ip protocol {{ tcp, udp }} th dport {{ {", ".join(ports)} }} accept'
 | 
						|
            },
 | 
						|
        },
 | 
						|
    }
 |