127 lines
		
	
	
	
		
			3.7 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			127 lines
		
	
	
	
		
			3.7 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
assert node.has_bundle('steam')
 | 
						|
 | 
						|
from shlex import quote
 | 
						|
 | 
						|
defaults = {
 | 
						|
    'steam': {
 | 
						|
        'games': {
 | 
						|
            'left4dead2': 222860,
 | 
						|
        },
 | 
						|
    },
 | 
						|
    'left4dead2': {
 | 
						|
        'servers': {},
 | 
						|
        'admins': set(),
 | 
						|
        'workshop': set(),
 | 
						|
    },
 | 
						|
}
 | 
						|
 | 
						|
 | 
						|
@metadata_reactor.provides(
 | 
						|
    'left4dead2/servers',
 | 
						|
)
 | 
						|
def rconn_password(metadata):
 | 
						|
    # only works from localhost!
 | 
						|
    return {
 | 
						|
        'left4dead2': {
 | 
						|
            'servers': {
 | 
						|
                server: {
 | 
						|
                    'rcon_password': repo.vault.password_for(f'{node.name} left4dead2 {server} rcon', length=24),
 | 
						|
                }
 | 
						|
                    for server in metadata.get('left4dead2/servers')
 | 
						|
            },
 | 
						|
        },
 | 
						|
    }
 | 
						|
 | 
						|
 | 
						|
@metadata_reactor.provides(
 | 
						|
    'steam-workshop-download',
 | 
						|
    'systemd/units',
 | 
						|
)
 | 
						|
def server_units(metadata):
 | 
						|
    units = {}
 | 
						|
    workshop = {}
 | 
						|
 | 
						|
    for name, config in metadata.get('left4dead2/servers').items():
 | 
						|
        # mount overlay
 | 
						|
        mountpoint = f'/opt/steam/left4dead2-servers/{name}'
 | 
						|
        mount_unit_name = mountpoint[1:].replace('-', '\\x2d').replace('/', '-') + '.mount'
 | 
						|
        units[mount_unit_name] = {
 | 
						|
            'Unit': {
 | 
						|
                'Description': f"Mount left4dead2 server {name} overlay",
 | 
						|
                'Conflicts': {'umount.target'},
 | 
						|
                'Before': {'umount.target'},
 | 
						|
            },
 | 
						|
            'Mount': {
 | 
						|
                'What': 'overlay',
 | 
						|
                'Where': mountpoint,
 | 
						|
                'Type': 'overlay',
 | 
						|
                'Options': ','.join([
 | 
						|
                    'auto',
 | 
						|
                    'lowerdir=/opt/steam/left4dead2',
 | 
						|
                    f'upperdir=/opt/steam-zfs-overlay-workarounds/{name}/upper',
 | 
						|
                    f'workdir=/opt/steam-zfs-overlay-workarounds/{name}/workdir',
 | 
						|
                ]),
 | 
						|
            },
 | 
						|
            'Install': {
 | 
						|
                'RequiredBy': {
 | 
						|
                    f'left4dead2-{name}.service',
 | 
						|
                },
 | 
						|
            },
 | 
						|
        }
 | 
						|
 | 
						|
        # individual workshop
 | 
						|
        workshop_ids = config.get('workshop', set()) | metadata.get('left4dead2/workshop', set())
 | 
						|
        if  workshop_ids:
 | 
						|
            workshop[f'left4dead2-{name}'] = {
 | 
						|
                'ids': workshop_ids,
 | 
						|
                'path': f'/opt/steam/left4dead2-servers/{name}/left4dead2/addons',
 | 
						|
                'user': 'steam',
 | 
						|
                'requires': {
 | 
						|
                    mount_unit_name,
 | 
						|
                },
 | 
						|
                'required_by': {
 | 
						|
                    f'left4dead2-{name}.service',
 | 
						|
                },
 | 
						|
            }
 | 
						|
 | 
						|
        # left4dead2 server unit
 | 
						|
        units[f'left4dead2-{name}.service'] = {
 | 
						|
            'Unit': {
 | 
						|
                'Description': f'left4dead2 server {name}',
 | 
						|
                'After': {'steam-update.service'},
 | 
						|
                'Requires': {'steam-update.service'},
 | 
						|
            },
 | 
						|
            'Service': {
 | 
						|
                'User': 'steam',
 | 
						|
                'Group': 'steam',
 | 
						|
                'WorkingDirectory': f'/opt/steam/left4dead2-servers/{name}',
 | 
						|
                'ExecStart': f'/opt/steam/left4dead2-servers/{name}/srcds_run -port {config["port"]} +exec server.cfg',
 | 
						|
                'Restart': 'on-failure',
 | 
						|
            },
 | 
						|
            'Install': {
 | 
						|
                'WantedBy': {'multi-user.target'},
 | 
						|
            },
 | 
						|
        }
 | 
						|
 | 
						|
    return {
 | 
						|
        'steam-workshop-download': workshop,
 | 
						|
        'systemd': {
 | 
						|
            '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(sorted(ports))} }} accept",
 | 
						|
                f"udp dport {{ {', '.join(sorted(ports))} }} accept",
 | 
						|
            },
 | 
						|
        },
 | 
						|
    }
 |