Compare commits
No commits in common. "55c993b1fea0ae7bf0307dac292f06359dbd3b19" and "7302811418604c5030d058b34af1389ec561af09" have entirely different histories.
55c993b1fe
...
7302811418
13 changed files with 46 additions and 403 deletions
13
bundles/l4d2/files/l4d2.service
Normal file
13
bundles/l4d2/files/l4d2.service
Normal file
|
@ -0,0 +1,13 @@
|
||||||
|
GNU nano 4.8 /etc/systemd/system/l4d2-server-a.service
|
||||||
|
[Unit]
|
||||||
|
Description=l4d2 Server A
|
||||||
|
After=network.target steam-update.service
|
||||||
|
|
||||||
|
[Service]
|
||||||
|
User=steam
|
||||||
|
WorkingDirectory=/home/steam/steam/l4d2
|
||||||
|
ExecStart=/home/steam/steam/l4d2/srcds_run -port 27001 -secure +exec server_a.cfg
|
||||||
|
Restart=on-failure
|
||||||
|
|
||||||
|
[Install]
|
||||||
|
WantedBy=multi-user.target
|
4
bundles/l4d2/files/update_addons
Normal file
4
bundles/l4d2/files/update_addons
Normal file
|
@ -0,0 +1,4 @@
|
||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
/home/steam/steam_workshop_downloader/workshop.py -o /home/steam/steam/l4d2/left4dead2/addons 2283884609
|
||||||
|
chown -R steam:steam /home/steam/steam/l4d2/left4dead2/addons
|
7
bundles/l4d2/metadata.py
Normal file
7
bundles/l4d2/metadata.py
Normal file
|
@ -0,0 +1,7 @@
|
||||||
|
@metadata_reactor.provides()
|
||||||
|
def steam(metadata):
|
||||||
|
return {
|
||||||
|
'steam': {
|
||||||
|
'222860': 'l4d2',
|
||||||
|
},
|
||||||
|
}
|
|
@ -1,58 +0,0 @@
|
||||||
https://developer.valvesoftware.com/wiki/List_of_L4D2_Cvars
|
|
||||||
|
|
||||||
Dead Center c1m1_hotel
|
|
||||||
Dead Center c1m2_streets
|
|
||||||
Dead Center c1m3_mall
|
|
||||||
Dead Center c1m4_atrium
|
|
||||||
Dark Carnival c2m1_highway
|
|
||||||
Dark Carnival c2m2_fairgrounds
|
|
||||||
Dark Carnival c2m3_coaster
|
|
||||||
Dark Carnival c2m4_barns
|
|
||||||
Dark Carnival c2m5_concert
|
|
||||||
Swamp Fever c3m1_plankcountry
|
|
||||||
Swamp Fever c3m2_swamp
|
|
||||||
Swamp Fever c3m3_shantytown
|
|
||||||
Swamp Fever c3m4_plantation
|
|
||||||
Hard Rain c4m1_milltown_a
|
|
||||||
Hard Rain c4m2_sugarmill_a
|
|
||||||
Hard Rain c4m3_sugarmill_b
|
|
||||||
Hard Rain c4m4_milltown_b
|
|
||||||
Hard Rain c4m5_milltown_escape
|
|
||||||
The Parish c5m1_waterfront_sndscape
|
|
||||||
The Parish c5m1_waterfront
|
|
||||||
The Parish c5m2_park
|
|
||||||
The Parish c5m3_cemetery
|
|
||||||
The Parish c5m4_quarter
|
|
||||||
The Parish c5m5_bridge
|
|
||||||
The Passing c6m1_riverbank
|
|
||||||
The Passing c6m2_bedlam
|
|
||||||
The Passing c6m3_port
|
|
||||||
The Sacrifice c7m1_docks
|
|
||||||
The Sacrifice c7m2_barge
|
|
||||||
The Sacrifice c7m3_port
|
|
||||||
No Mercy c8m1_apartment
|
|
||||||
No Mercy c8m2_subway
|
|
||||||
No Mercy c8m3_sewers
|
|
||||||
No Mercy c8m4_interior
|
|
||||||
No Mercy c8m5_rooftop
|
|
||||||
Crash Course c9m1_alleys
|
|
||||||
Crash Course c9m2_lots
|
|
||||||
Death Toll c10m1_caves
|
|
||||||
Death Toll c10m2_drainage
|
|
||||||
Death Toll c10m3_ranchhouse
|
|
||||||
Death Toll c10m4_mainstreet
|
|
||||||
Death Toll c10m5_houseboat
|
|
||||||
Dead Air c11m1_greenhouse
|
|
||||||
Dead Air c11m2_offices
|
|
||||||
Dead Air c11m3_garage
|
|
||||||
Dead Air c11m4_terminal
|
|
||||||
Dead Air c11m5_runway
|
|
||||||
Blood Harvest c12m1_hilltop
|
|
||||||
Blood Harvest c12m2_traintunnel
|
|
||||||
Blood Harvest c12m3_bridge
|
|
||||||
Blood Harvest c12m4_barn
|
|
||||||
Blood Harvest c12m5_cornfield
|
|
||||||
Cold Stream c13m1_alpinecreek
|
|
||||||
Cold Stream c13m2_southpinestream
|
|
||||||
Cold Stream c13m3_memorialbridge
|
|
||||||
Cold Stream c13m4_cutthroatcreek
|
|
|
@ -1,106 +0,0 @@
|
||||||
directories = {
|
|
||||||
'/opt/left4dead2': {
|
|
||||||
'owner': 'steam',
|
|
||||||
},
|
|
||||||
'/opt/left4dead2/ems/admin system': {
|
|
||||||
'owner': 'steam',
|
|
||||||
},
|
|
||||||
'/opt/left4dead2/left4dead2/cfg': {
|
|
||||||
'owner': 'steam',
|
|
||||||
},
|
|
||||||
'/opt/left4dead2/left4dead2/addons': {
|
|
||||||
'owner': 'steam',
|
|
||||||
'purge': True,
|
|
||||||
},
|
|
||||||
}
|
|
||||||
|
|
||||||
files = {
|
|
||||||
'/opt/left4dead2/ems/admin system/admins.txt': {
|
|
||||||
'owner': 'steam',
|
|
||||||
'content': '\n'.join(node.metadata.get('left4dead2/admins')),
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
svc_systemd = {
|
|
||||||
'left4dead2-workshop': {
|
|
||||||
'running': False,
|
|
||||||
'needs': [
|
|
||||||
'svc_systemd:steam-update',
|
|
||||||
],
|
|
||||||
},
|
|
||||||
}
|
|
||||||
|
|
||||||
for id in node.metadata.get('left4dead2/workshop'):
|
|
||||||
directories[f'/opt/left4dead2/left4dead2/addons/{id}'] = {
|
|
||||||
'owner': 'steam',
|
|
||||||
'triggers': [
|
|
||||||
'svc_systemd:left4dead2-workshop:restart',
|
|
||||||
],
|
|
||||||
}
|
|
||||||
|
|
||||||
server_units = set()
|
|
||||||
for name, config in node.metadata.get('left4dead2/servers').items():
|
|
||||||
config.pop('port')
|
|
||||||
config = {
|
|
||||||
'hostname': name,
|
|
||||||
'sv_steamgroup': ','.join(
|
|
||||||
str(gid) for gid in node.metadata.get('left4dead2/steamgroups')
|
|
||||||
),
|
|
||||||
'z_difficulty': 'Impossible',
|
|
||||||
'sv_gametypes': 'realism',
|
|
||||||
'sv_region': 3, # europe
|
|
||||||
'log': 'on',
|
|
||||||
'sv_logecho': 1,
|
|
||||||
'sv_logfile': 1,
|
|
||||||
'sv_log_onefile': 0,
|
|
||||||
'sv_logbans': 1,
|
|
||||||
'sv_logflush': 0,
|
|
||||||
'sv_logsdir': 'logs', # /opt/left4dead2/left4dead2/logs
|
|
||||||
**config,
|
|
||||||
}
|
|
||||||
|
|
||||||
files[f'/opt/left4dead2/left4dead2/cfg/server-{name}.cfg'] = {
|
|
||||||
'content': '\n'.join(
|
|
||||||
f'{key} "{value}"' for key, value in sorted(config.items())
|
|
||||||
) + '\n',
|
|
||||||
'owner': 'steam',
|
|
||||||
'triggers': [
|
|
||||||
f'svc_systemd:left4dead2-server-{name}:restart',
|
|
||||||
],
|
|
||||||
}
|
|
||||||
svc_systemd[f'left4dead2-server-{name}'] = {
|
|
||||||
'needs': [
|
|
||||||
f'file:/etc/systemd/system/left4dead2-server-{name}.service',
|
|
||||||
],
|
|
||||||
}
|
|
||||||
server_units.add(f'left4dead2-server-{name}')
|
|
||||||
|
|
||||||
|
|
||||||
for id in node.metadata.get('left4dead2/workshop'):
|
|
||||||
directories[f'/opt/left4dead2/addons/{id}'] = {
|
|
||||||
'owner': 'steam',
|
|
||||||
'triggers': [
|
|
||||||
'svc_systemd:left4dead2-workshop:restart',
|
|
||||||
],
|
|
||||||
}
|
|
||||||
|
|
||||||
# TIDYUP
|
|
||||||
|
|
||||||
find_obsolete_units = (
|
|
||||||
'find /etc/systemd/system -type f -name "left4dead2-server-*.service" ' +
|
|
||||||
' '.join(f"! -name '{name}.service'" for name in server_units)
|
|
||||||
)
|
|
||||||
actions['remove_obsolete_left4dead2_units'] = {
|
|
||||||
'command': (
|
|
||||||
f'for unitfile in $({find_obsolete_units}); '
|
|
||||||
f'do '
|
|
||||||
f'systemctl stop $(basename "$unitfile"); '
|
|
||||||
f'systemctl disable $(basename "$unitfile"); '
|
|
||||||
f'rm "$unitfile"; '
|
|
||||||
f'systemctl daemon-reload; '
|
|
||||||
f'done'
|
|
||||||
),
|
|
||||||
'unless': (
|
|
||||||
find_obsolete_units + " | wc -l | grep -q '^0$'"
|
|
||||||
),
|
|
||||||
}
|
|
|
@ -1,89 +0,0 @@
|
||||||
assert node.has_bundle('steam')
|
|
||||||
|
|
||||||
from shlex import quote
|
|
||||||
|
|
||||||
defaults = {
|
|
||||||
'steam': {
|
|
||||||
'games': {
|
|
||||||
'left4dead2': '222860',
|
|
||||||
},
|
|
||||||
},
|
|
||||||
'left4dead2': {
|
|
||||||
'servers': {},
|
|
||||||
'admins': set(),
|
|
||||||
'workshop': set(),
|
|
||||||
},
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
@metadata_reactor.provides(
|
|
||||||
'systemd/units',
|
|
||||||
)
|
|
||||||
def workshop(metadata):
|
|
||||||
command = (
|
|
||||||
'set -x; '
|
|
||||||
'for ID in ' + ' '.join(metadata.get('left4dead2/workshop')) + '; '
|
|
||||||
'do '
|
|
||||||
'if ! ls /opt/left4dead2/left4dead2/addons/$ID/*.vpk; '
|
|
||||||
'then '
|
|
||||||
'cd /opt/left4dead2/left4dead2/addons/$ID; '
|
|
||||||
'/opt/steam-workshop-downloader https://steamcommunity.com/sharedfiles/filedetails\?id\=$ID; '
|
|
||||||
'unzip $ID.zip; '
|
|
||||||
'fi; '
|
|
||||||
'done'
|
|
||||||
)
|
|
||||||
|
|
||||||
return {
|
|
||||||
'systemd': {
|
|
||||||
'units': {
|
|
||||||
'left4dead2-workshop.service': {
|
|
||||||
'Unit': {
|
|
||||||
'Description': 'install workshop items',
|
|
||||||
'After': 'network.target',
|
|
||||||
'Requires': 'steam-update.service',
|
|
||||||
'PartOf': 'steam-update.service'
|
|
||||||
},
|
|
||||||
'Service': {
|
|
||||||
'Type': 'oneshot',
|
|
||||||
'User': 'steam',
|
|
||||||
'ExecStart': f'/bin/bash -c {quote(command)}',
|
|
||||||
},
|
|
||||||
'Install': {
|
|
||||||
'WantedBy': ['multi-user.target'],
|
|
||||||
},
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
@metadata_reactor.provides(
|
|
||||||
'systemd/units',
|
|
||||||
)
|
|
||||||
def server_units(metadata):
|
|
||||||
units = {}
|
|
||||||
|
|
||||||
for name, config in metadata.get('left4dead2/servers').items():
|
|
||||||
units[f'left4dead2-server-{name}.service'] = {
|
|
||||||
'Unit': {
|
|
||||||
'Description': f'left4dead2 server {name}',
|
|
||||||
'After': 'network.target',
|
|
||||||
'Requires': 'steam-update.service',
|
|
||||||
},
|
|
||||||
'Service': {
|
|
||||||
'User': 'steam',
|
|
||||||
'Group': 'steam',
|
|
||||||
'WorkingDirectory': '/opt/left4dead2',
|
|
||||||
'ExecStart': f'/opt/left4dead2/srcds_run -port {config["port"]} -insecure +map {config["map"]} +exec server-{name}.cfg',
|
|
||||||
'Restart': 'on-failure',
|
|
||||||
},
|
|
||||||
'Install': {
|
|
||||||
'WantedBy': ['multi-user.target'],
|
|
||||||
},
|
|
||||||
}
|
|
||||||
|
|
||||||
return {
|
|
||||||
'systemd': {
|
|
||||||
'units': units,
|
|
||||||
},
|
|
||||||
}
|
|
15
bundles/steam/files/steam-update.service
Normal file
15
bundles/steam/files/steam-update.service
Normal file
|
@ -0,0 +1,15 @@
|
||||||
|
GNU nano 4.8 /etc/systemd/system/l4d2-update.service
|
||||||
|
[Unit]
|
||||||
|
Description=l4d2 update
|
||||||
|
After=network.target
|
||||||
|
|
||||||
|
[Service]
|
||||||
|
Type=oneshot
|
||||||
|
User=steam
|
||||||
|
Group=steam
|
||||||
|
WorkingDirectory=/home/steam/steam
|
||||||
|
ExecStart=/home/steam/steam_workshop_downloader/workshop.py -o /home/steam/steam/l4d2/left4dead2/addons/workshop 2283884609
|
||||||
|
ExecStart=/home/steam/steam/steamcmd.sh +login anonymous +force_install_dir ./l4d2/ +app_update 222860 validate +quit
|
||||||
|
|
||||||
|
[Install]
|
||||||
|
WantedBy=multi-user.target
|
|
@ -1,59 +1,4 @@
|
||||||
users = {
|
for id, name in node.metadata.get('steam'):
|
||||||
'steam': {
|
pass
|
||||||
'home': '/opt/steam',
|
|
||||||
},
|
|
||||||
}
|
|
||||||
|
|
||||||
directories = {
|
# sudo -Hiu steam bash -c '~/steam/steamcmd.sh +login anonymous +force_install_dir ./l4d2/ +app_update 222860 validate +quit'
|
||||||
'/opt/steam': {
|
|
||||||
'owner': 'steam',
|
|
||||||
},
|
|
||||||
'/opt/steam/.steam': {
|
|
||||||
'owner': 'steam',
|
|
||||||
},
|
|
||||||
}
|
|
||||||
|
|
||||||
files = {
|
|
||||||
'/opt/steam/steamcmd_linux.tar.gz': {
|
|
||||||
'content_type': 'download',
|
|
||||||
'source': 'https://steamcdn-a.akamaihd.net/client/installer/steamcmd_linux.tar.gz',
|
|
||||||
'owner': 'steam',
|
|
||||||
},
|
|
||||||
'/opt/steam-workshop-downloader': {
|
|
||||||
'content_type': 'download',
|
|
||||||
'source': 'https://github.com/SegoCode/swd/releases/download/1.1/swd-linux-amd64',
|
|
||||||
'owner': 'steam',
|
|
||||||
'mode': '750',
|
|
||||||
},
|
|
||||||
}
|
|
||||||
|
|
||||||
symlinks = {
|
|
||||||
# /opt/steam/.steam/sdk32/steamclient.so: cannot open shared object file: No such file or directory
|
|
||||||
'/opt/steam/.steam/sdk32': {
|
|
||||||
'target': '/opt/steam/linux32',
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
actions = {
|
|
||||||
'extract_steamcmd': {
|
|
||||||
'command': 'tar xfvz /opt/steam/steamcmd_linux.tar.gz --directory /opt/steam',
|
|
||||||
'unless': 'test -f /opt/steam/steamcmd.sh',
|
|
||||||
'needs': [
|
|
||||||
'file:/opt/steam/steamcmd_linux.tar.gz',
|
|
||||||
],
|
|
||||||
},
|
|
||||||
'chown_steamcmd': {
|
|
||||||
'command': 'chown -R steam /opt/steam',
|
|
||||||
'triggered': True,
|
|
||||||
'triggered_by': [
|
|
||||||
'action:extract_steamcmd',
|
|
||||||
],
|
|
||||||
},
|
|
||||||
}
|
|
||||||
|
|
||||||
svc_systemd['steam-update'] = {
|
|
||||||
'running': False,
|
|
||||||
'needs': {
|
|
||||||
'file:/etc/systemd/system/steam-update.service',
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
|
@ -1,42 +0,0 @@
|
||||||
defaults = {
|
|
||||||
'apt': {
|
|
||||||
'packages': {
|
|
||||||
'lib32gcc-s1': {},
|
|
||||||
},
|
|
||||||
},
|
|
||||||
'steam': {
|
|
||||||
'games': {},
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@metadata_reactor.provides(
|
|
||||||
'systemd/units',
|
|
||||||
)
|
|
||||||
def initial_unit(metadata):
|
|
||||||
install_games = ' '.join(
|
|
||||||
f'+force_install_dir /opt/{name} +app_update {id}'
|
|
||||||
for name, id in metadata.get('steam/games').items()
|
|
||||||
)
|
|
||||||
|
|
||||||
return {
|
|
||||||
'systemd': {
|
|
||||||
'units': {
|
|
||||||
'steam-update.service': {
|
|
||||||
'Unit': {
|
|
||||||
'Description': 'steam: install and update games',
|
|
||||||
'After': 'network.target',
|
|
||||||
},
|
|
||||||
'Service': {
|
|
||||||
'Type': 'oneshot',
|
|
||||||
'User': 'steam',
|
|
||||||
'Group': 'steam',
|
|
||||||
'WorkingDirectory': '/opt/steam',
|
|
||||||
'ExecStart': f'/opt/steam/steamcmd.sh +login anonymous {install_games} validate +quit',
|
|
||||||
},
|
|
||||||
'Install': {
|
|
||||||
'WantedBy': 'multi-user.target',
|
|
||||||
},
|
|
||||||
},
|
|
||||||
},
|
|
||||||
},
|
|
||||||
}
|
|
|
@ -48,7 +48,7 @@ def services(metadata):
|
||||||
extension = name.split('.')[-1]
|
extension = name.split('.')[-1]
|
||||||
|
|
||||||
if extension not in ['timer', 'service']:
|
if extension not in ['timer', 'service']:
|
||||||
raise Exception(f'unknown extension: {extension}')
|
raise Exception(f'unknown extension {extension}')
|
||||||
|
|
||||||
return {
|
return {
|
||||||
'systemd': {
|
'systemd': {
|
||||||
|
|
|
@ -8,7 +8,7 @@
|
||||||
'metadata': {
|
'metadata': {
|
||||||
'apt': {
|
'apt': {
|
||||||
'sources': {
|
'sources': {
|
||||||
'deb http://deb.debian.org/debian {release} main contrib non-free',
|
'deb http://deb.debian.org/debian {release} main non-free contrib',
|
||||||
'deb http://deb.debian.org/debian {release}-updates main contrib non-free',
|
'deb http://deb.debian.org/debian {release}-updates main contrib non-free',
|
||||||
'deb http://deb.debian.org/debian {release}-backports main contrib non-free',
|
'deb http://deb.debian.org/debian {release}-backports main contrib non-free',
|
||||||
},
|
},
|
||||||
|
|
|
@ -1,46 +0,0 @@
|
||||||
{
|
|
||||||
'hostname': '23.88.121.141',
|
|
||||||
'groups': [
|
|
||||||
'backup',
|
|
||||||
'debian-11',
|
|
||||||
'hetzner-cloud',
|
|
||||||
],
|
|
||||||
'bundles': [
|
|
||||||
'steam',
|
|
||||||
'left4dead2',
|
|
||||||
# 'java',
|
|
||||||
# 'minecraft',
|
|
||||||
],
|
|
||||||
'metadata': {
|
|
||||||
'id': '3915f236-dd0a-4c6c-8fb3-1584c81038c6',
|
|
||||||
'left4dead2': {
|
|
||||||
'steamgroups': [38347879],
|
|
||||||
'workshop': {
|
|
||||||
'2524204971', # admin system inkl admin menu
|
|
||||||
},
|
|
||||||
'admins': {
|
|
||||||
'STEAM_1:0:12376499', # CroneKorkN
|
|
||||||
},
|
|
||||||
'servers': {
|
|
||||||
'realism-expert': {
|
|
||||||
'port': 27001,
|
|
||||||
'sv_steamgroup_exclusive': 1,
|
|
||||||
'map': 'c2m1_highway',
|
|
||||||
},
|
|
||||||
}
|
|
||||||
},
|
|
||||||
'network': {
|
|
||||||
'internal': {
|
|
||||||
'interface': 'ens10',
|
|
||||||
'ipv4': '10.0.10.4/32',
|
|
||||||
},
|
|
||||||
'external': {
|
|
||||||
'interface': 'eth0',
|
|
||||||
'ipv4': '23.88.121.141/32',
|
|
||||||
'ipv6': '2a01:4f8:c17:e0b4::2/64',
|
|
||||||
'gateway4': '172.31.1.1',
|
|
||||||
'gateway6': 'fe80::1',
|
|
||||||
}
|
|
||||||
},
|
|
||||||
},
|
|
||||||
}
|
|
|
@ -7,9 +7,9 @@
|
||||||
],
|
],
|
||||||
'bundles': [
|
'bundles': [
|
||||||
# 'steam',
|
# 'steam',
|
||||||
# 'left4dead2',
|
# 'l4d2',
|
||||||
'java',
|
'java',
|
||||||
# 'minecraft',
|
'minecraft',
|
||||||
],
|
],
|
||||||
'metadata': {
|
'metadata': {
|
||||||
# TEMP
|
# TEMP
|
||||||
|
|
Loading…
Reference in a new issue