107 lines
		
	
	
	
		
			2.8 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			107 lines
		
	
	
	
		
			2.8 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
from re import match
 | 
						|
 | 
						|
defaults = {
 | 
						|
    'apt': {
 | 
						|
        'packages': {
 | 
						|
            'libc6_i386': {}, # installs libc6:i386
 | 
						|
            'lib32z1': {},
 | 
						|
            'unzip': {},
 | 
						|
        },
 | 
						|
    },
 | 
						|
    'left4dead2': {
 | 
						|
        'servers': {},
 | 
						|
    },
 | 
						|
    'nftables': {
 | 
						|
        'input': {
 | 
						|
            'udp dport { 27005, 27020 } accept',
 | 
						|
        },
 | 
						|
    },
 | 
						|
}
 | 
						|
 | 
						|
 | 
						|
@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'
 | 
						|
            },
 | 
						|
        },
 | 
						|
    }
 | 
						|
 | 
						|
 | 
						|
@metadata_reactor.provides(
 | 
						|
    'systemd/units',
 | 
						|
)
 | 
						|
def initial_unit(metadata):
 | 
						|
    install_command = (
 | 
						|
        '/opt/steam/steamcmd.sh '
 | 
						|
        '+force_install_dir /opt/left4dead2 '
 | 
						|
        '+login anonymous '
 | 
						|
        '+@sSteamCmdForcePlatformType {platform} '
 | 
						|
        '+app_update 222860 validate '
 | 
						|
        '+quit '
 | 
						|
    )
 | 
						|
 | 
						|
    return {
 | 
						|
        'systemd': {
 | 
						|
            'units': {
 | 
						|
                'left4dead2-install.service': {
 | 
						|
                    'Unit': {
 | 
						|
                        'Description': 'install or update left4dead2',
 | 
						|
                        'After': 'network-online.target',
 | 
						|
                    },
 | 
						|
                    'Service': {
 | 
						|
                        'Type': 'oneshot',
 | 
						|
                        'RemainAfterExit': 'yes',
 | 
						|
                        'User': 'steam',
 | 
						|
                        'Group': 'steam',
 | 
						|
                        'WorkingDirectory': '/opt/steam',
 | 
						|
                        'ExecStartPre': install_command.format(platform='windows'),
 | 
						|
                        'ExecStart': install_command.format(platform='linux'),
 | 
						|
                    },
 | 
						|
                    '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)
 | 
						|
 | 
						|
        units[f'left4dead2-{name}.service'] = {
 | 
						|
            'Unit': {
 | 
						|
                'Description': f'left4dead2 server {name}',
 | 
						|
                'After': {'left4dead2-install.service'},
 | 
						|
                'Requires': {'left4dead2-install.service'},
 | 
						|
            },
 | 
						|
            'Service': {
 | 
						|
                'User': 'steam',
 | 
						|
                'Group': 'steam',
 | 
						|
                'WorkingDirectory': '/opt/left4dead2',
 | 
						|
                'ExecStart': f'/opt/left4dead2/srcds_run -port {config["port"]} +exec server_{name}.cfg',
 | 
						|
                'Restart': 'on-failure',
 | 
						|
            },
 | 
						|
            'Install': {
 | 
						|
                'WantedBy': {'multi-user.target'},
 | 
						|
            },
 | 
						|
        }
 | 
						|
 | 
						|
    return {
 | 
						|
        'systemd': {
 | 
						|
            'units': units,
 | 
						|
        },
 | 
						|
    }
 |