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,
 | |
|         },
 | |
|     }
 |