Compare commits
No commits in common. "f49928bed138f18cd0a32d559121088cc4d9d05f" and "85844845646340ef81f56f417a303cce509e9fa5" have entirely different histories.
f49928bed1
...
8584484564
13 changed files with 139 additions and 196 deletions
|
@ -43,11 +43,3 @@ files['/etc/gitea/app.ini'] = {
|
||||||
'svc_systemd:gitea:restart',
|
'svc_systemd:gitea:restart',
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
svc_systemd['gitea'] = {
|
|
||||||
'needs': [
|
|
||||||
'action:chmod_gitea',
|
|
||||||
'download:/usr/local/bin/gitea',
|
|
||||||
'file:/etc/gitea/app.ini',
|
|
||||||
],
|
|
||||||
}
|
|
||||||
|
|
|
@ -28,8 +28,9 @@ defaults = {
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
'systemd': {
|
'systemd': {
|
||||||
'units': {
|
'services': {
|
||||||
'gitea.service': {
|
'gitea': {
|
||||||
|
'content': {
|
||||||
'Unit': {
|
'Unit': {
|
||||||
'Description': 'gitea',
|
'Description': 'gitea',
|
||||||
'After': 'syslog.target',
|
'After': 'syslog.target',
|
||||||
|
@ -50,6 +51,13 @@ defaults = {
|
||||||
'WantedBy': 'multi-user.target',
|
'WantedBy': 'multi-user.target',
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
'needs': [
|
||||||
|
'action:chmod_gitea',
|
||||||
|
'download:/usr/local/bin/gitea',
|
||||||
|
'file:/etc/systemd/system/gitea.service',
|
||||||
|
'file:/etc/gitea/app.ini',
|
||||||
|
],
|
||||||
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
'zfs': {
|
'zfs': {
|
||||||
|
|
|
@ -34,7 +34,6 @@ defaults = {
|
||||||
|
|
||||||
@metadata_reactor.provides(
|
@metadata_reactor.provides(
|
||||||
'influxdb/password',
|
'influxdb/password',
|
||||||
'influxdb/admin_token',
|
|
||||||
)
|
)
|
||||||
def admin_password(metadata):
|
def admin_password(metadata):
|
||||||
return {
|
return {
|
||||||
|
|
|
@ -7,13 +7,13 @@ defaults = {
|
||||||
|
|
||||||
|
|
||||||
@metadata_reactor.provides(
|
@metadata_reactor.provides(
|
||||||
'systemd/units',
|
'systemd-networkd/networks',
|
||||||
)
|
)
|
||||||
def units(metadata):
|
def systemd_networkd(metadata):
|
||||||
units = {}
|
units = {}
|
||||||
|
|
||||||
for type, network in metadata.get('network').items():
|
for type, network in metadata.get('network').items():
|
||||||
units[f'{type}.network'] = {
|
units[type] = {
|
||||||
'Match': {
|
'Match': {
|
||||||
'Name': network['interface'],
|
'Name': network['interface'],
|
||||||
},
|
},
|
||||||
|
@ -25,13 +25,13 @@ def units(metadata):
|
||||||
|
|
||||||
for i in [4, 6]:
|
for i in [4, 6]:
|
||||||
if network.get(f'ipv{i}', None):
|
if network.get(f'ipv{i}', None):
|
||||||
units[f'{type}.network'].update({
|
units[type].update({
|
||||||
f'Address#ipv{i}': {
|
f'Address#ipv{i}': {
|
||||||
'Address': network[f'ipv{i}'],
|
'Address': network[f'ipv{i}'],
|
||||||
},
|
},
|
||||||
})
|
})
|
||||||
if f'gateway{i}' in network:
|
if f'gateway{i}' in network:
|
||||||
units[f'{type}.network'].update({
|
units[type].update({
|
||||||
f'Route#ipv{i}': {
|
f'Route#ipv{i}': {
|
||||||
'Gateway': network[f'gateway{i}'],
|
'Gateway': network[f'gateway{i}'],
|
||||||
'GatewayOnlink': 'yes',
|
'GatewayOnlink': 'yes',
|
||||||
|
@ -40,7 +40,7 @@ def units(metadata):
|
||||||
|
|
||||||
|
|
||||||
return {
|
return {
|
||||||
'systemd': {
|
'systemd-networkd': {
|
||||||
'units': units,
|
'networks': units,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -4,9 +4,10 @@ files = {
|
||||||
'/etc/network/interfaces': {
|
'/etc/network/interfaces': {
|
||||||
'delete': True,
|
'delete': True,
|
||||||
},
|
},
|
||||||
'/etc/resolv.conf': {
|
}
|
||||||
|
|
||||||
|
files['/etc/resolv.conf'] = {
|
||||||
'content_type': 'mako',
|
'content_type': 'mako',
|
||||||
},
|
|
||||||
}
|
}
|
||||||
|
|
||||||
directories = {
|
directories = {
|
||||||
|
@ -15,6 +16,21 @@ directories = {
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
|
for type, path in {
|
||||||
|
'networks': '/etc/systemd/network/{}.network',
|
||||||
|
'netdevs': '/etc/systemd/network/{}.netdev',
|
||||||
|
}.items():
|
||||||
|
for name, config in node.metadata.get(f'systemd-networkd/{type}').items():
|
||||||
|
files[path.format(name)] = {
|
||||||
|
'content': repo.libs.systemd.generate_unitfile(config),
|
||||||
|
'needed_by': {
|
||||||
|
'svc_systemd:systemd-networkd',
|
||||||
|
},
|
||||||
|
'triggers': {
|
||||||
|
'svc_systemd:systemd-networkd:restart',
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
svc_systemd = {
|
svc_systemd = {
|
||||||
'systemd-networkd': {},
|
'systemd-networkd': {},
|
||||||
}
|
}
|
||||||
|
|
|
@ -6,4 +6,8 @@ defaults = {
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
'systemd-networkd': {
|
||||||
|
'netdevs': {},
|
||||||
|
'networks': {},
|
||||||
|
},
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,27 +1,26 @@
|
||||||
# # svc_systemd['cron'] = {
|
# svc_systemd['cron'] = {
|
||||||
# # 'enabled': False,
|
# 'enabled': False,
|
||||||
# # }
|
|
||||||
#
|
|
||||||
# for name, config in node.metadata.get('systemd-timers').items():
|
|
||||||
# files[f'/etc/systemd/system/{name}.timer'] = {
|
|
||||||
# 'content': repo.libs.systemd.generate_unitfile({
|
|
||||||
# 'Unit':{
|
|
||||||
# 'Description': f'{name} timer',
|
|
||||||
# },
|
|
||||||
# 'Timer': {
|
|
||||||
# 'OnCalendar': config['when'],
|
|
||||||
# 'Persistent': config.get('persistent', False),
|
|
||||||
# 'Unit': f'{name}.service',
|
|
||||||
# },
|
|
||||||
# 'Install': {
|
|
||||||
# 'WantedBy': 'multi-user.target',
|
|
||||||
# }
|
# }
|
||||||
# }),
|
|
||||||
# 'triggers': [
|
for name, config in node.metadata.get('systemd-timers').items():
|
||||||
# 'action:systemd-reload',
|
files[f'/etc/systemd/system/{name}.timer'] = {
|
||||||
# f'svc_systemd:{name}:restart',
|
'content': repo.libs.systemd.generate_unitfile({
|
||||||
# ],
|
'Unit':{
|
||||||
# }
|
'Description': f'{name} timer',
|
||||||
#
|
},
|
||||||
# svc_systemd[f'{name}.timer'] = {}
|
'Timer': {
|
||||||
# #
|
'OnCalendar': config['when'],
|
||||||
|
'Persistent': config.get('persistent', False),
|
||||||
|
'Unit': f'{name}.service',
|
||||||
|
},
|
||||||
|
'Install': {
|
||||||
|
'WantedBy': 'multi-user.target',
|
||||||
|
}
|
||||||
|
}),
|
||||||
|
'triggers': [
|
||||||
|
'action:systemd-reload',
|
||||||
|
f'svc_systemd:{name}:restart',
|
||||||
|
],
|
||||||
|
}
|
||||||
|
|
||||||
|
svc_systemd[f'{name}.timer'] = {}
|
||||||
|
|
|
@ -4,29 +4,14 @@ defaults = {
|
||||||
|
|
||||||
|
|
||||||
@metadata_reactor.provides(
|
@metadata_reactor.provides(
|
||||||
'systemd/units',
|
|
||||||
'systemd/services',
|
'systemd/services',
|
||||||
)
|
)
|
||||||
def systemd(metadata):
|
def services(metadata):
|
||||||
units = {}
|
return {
|
||||||
services = {}
|
'systemd': {
|
||||||
|
'services': {
|
||||||
for name, config in metadata.get('systemd-timers').items():
|
name: {
|
||||||
units.update({
|
'content': {
|
||||||
f'{name}.timer': {
|
|
||||||
'Unit':{
|
|
||||||
'Description': f'{name} timer',
|
|
||||||
},
|
|
||||||
'Timer': {
|
|
||||||
'OnCalendar': config['when'],
|
|
||||||
'Persistent': config.get('persistent', False),
|
|
||||||
'Unit': f'{name}.service',
|
|
||||||
},
|
|
||||||
'Install': {
|
|
||||||
'WantedBy': 'multi-user.target',
|
|
||||||
},
|
|
||||||
},
|
|
||||||
f'{name}.service': {
|
|
||||||
'Unit':{
|
'Unit':{
|
||||||
'Description': f'{name} timer service',
|
'Description': f'{name} timer service',
|
||||||
},
|
},
|
||||||
|
@ -34,12 +19,9 @@ def systemd(metadata):
|
||||||
'ExecStart': config['command'],
|
'ExecStart': config['command'],
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
})
|
'enabled': False,
|
||||||
services[f'{name}.timer'] = {}
|
'running': False,
|
||||||
|
} for name, config in metadata.get('systemd-timers').items()
|
||||||
return {
|
},
|
||||||
'systemd': {
|
|
||||||
'units': units,
|
|
||||||
'services': services,
|
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,23 +0,0 @@
|
||||||
# SYSTEMD
|
|
||||||
|
|
||||||
## metadata
|
|
||||||
|
|
||||||
```python
|
|
||||||
{
|
|
||||||
'systemd': {
|
|
||||||
'units': {
|
|
||||||
'test.service': {
|
|
||||||
# optional: will be derived from unit extension
|
|
||||||
'path': '/etc/systemd/system/test.service',
|
|
||||||
# content of the unit file
|
|
||||||
'content': {
|
|
||||||
},
|
|
||||||
# bw item data
|
|
||||||
# applies to unitfile and svc_systemd aswell, if present
|
|
||||||
'item': {
|
|
||||||
},
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
}
|
|
||||||
```
|
|
|
@ -1,41 +1,44 @@
|
||||||
from bundlewrap.utils.dicts import merge_dict
|
timezone = node.metadata.get('timezone', 'UTC')
|
||||||
|
keymap = node.metadata.get('keymap', 'de')
|
||||||
|
|
||||||
actions = {
|
actions = {
|
||||||
'systemd-reload': {
|
'systemd-reload': {
|
||||||
'command': 'systemctl daemon-reload',
|
'command': 'systemctl daemon-reload',
|
||||||
'cascade_skip': False,
|
'cascade_skip': False,
|
||||||
'triggered': True,
|
'triggered': True,
|
||||||
|
'needed_by': {
|
||||||
|
'svc_systemd:',
|
||||||
|
},
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
for name, unit in node.metadata.get('systemd/units').items():
|
for name, service in node.metadata.get('systemd/services').items():
|
||||||
extension = name.split('.')[-1]
|
# dont call a service 'service' explicitly
|
||||||
|
if name.endswith('.service'):
|
||||||
|
raise Exception(name)
|
||||||
|
|
||||||
if extension in ['netdev', 'network']:
|
# split unit file content data from item data
|
||||||
path = f'/etc/systemd/network/{name}'
|
content_data = service.pop('content')
|
||||||
dependencies = {
|
|
||||||
|
# default WantedBy=multi-user.target
|
||||||
|
content_data\
|
||||||
|
.setdefault('Install', {})\
|
||||||
|
.setdefault('WantedBy', {'multi-user.target'})
|
||||||
|
|
||||||
|
# create unit file
|
||||||
|
unit_path = f'/etc/systemd/system/{name}.service'
|
||||||
|
files[unit_path] = {
|
||||||
|
'content': repo.libs.systemd.generate_unitfile(content_data),
|
||||||
'triggers': [
|
'triggers': [
|
||||||
'svc_systemd:systemd-networkd:restart',
|
|
||||||
],
|
|
||||||
}
|
|
||||||
elif extension in ['timer', 'service']:
|
|
||||||
path = f'/etc/systemd/system/{name}'
|
|
||||||
dependencies = {
|
|
||||||
'triggers': [
|
|
||||||
"action:systemd-reload",
|
|
||||||
],
|
|
||||||
}
|
|
||||||
else:
|
|
||||||
raise Exception(f'unknown unit extension: "{extension}"')
|
|
||||||
|
|
||||||
files[path] = {
|
|
||||||
'content': repo.libs.systemd.generate_unitfile(unit),
|
|
||||||
**dependencies,
|
|
||||||
}
|
|
||||||
|
|
||||||
for name, config in node.metadata.get('systemd/services').items():
|
|
||||||
svc_systemd[name] = merge_dict(config, {
|
|
||||||
'needs': [
|
|
||||||
'action:systemd-reload',
|
'action:systemd-reload',
|
||||||
|
f'svc_systemd:{name}:restart',
|
||||||
],
|
],
|
||||||
})
|
}
|
||||||
|
|
||||||
|
# service depends on unit file
|
||||||
|
service\
|
||||||
|
.setdefault('needs', [])\
|
||||||
|
.append(f'file:{unit_path}')
|
||||||
|
|
||||||
|
# service
|
||||||
|
svc_systemd[name] = service
|
||||||
|
|
|
@ -1,26 +1,5 @@
|
||||||
defaults = {
|
defaults = {
|
||||||
'systemd': {
|
'systemd': {
|
||||||
'units': {},
|
|
||||||
'services': {},
|
'services': {},
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@metadata_reactor.provides(
|
|
||||||
'systemd/units',
|
|
||||||
)
|
|
||||||
def services(metadata):
|
|
||||||
units = {}
|
|
||||||
|
|
||||||
for name, config in metadata.get('systemd/units').items():
|
|
||||||
if name.split('.')[-1] == 'service' and not config.get('Install/WantedBy'):
|
|
||||||
units[name] = {
|
|
||||||
'Install': {
|
|
||||||
'WantedBy': ['multi-user.target'],
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return {
|
|
||||||
'systemd': {
|
|
||||||
'units': units,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
|
@ -26,7 +26,7 @@ defaults = {
|
||||||
|
|
||||||
|
|
||||||
@metadata_reactor.provides(
|
@metadata_reactor.provides(
|
||||||
'systemd/units',
|
'systemd-networkd/networks',
|
||||||
)
|
)
|
||||||
def systemd_networkd_networks(metadata):
|
def systemd_networkd_networks(metadata):
|
||||||
network = {
|
network = {
|
||||||
|
@ -60,16 +60,16 @@ def systemd_networkd_networks(metadata):
|
||||||
})
|
})
|
||||||
|
|
||||||
return {
|
return {
|
||||||
'systemd': {
|
'systemd-networkd': {
|
||||||
'units': {
|
'networks': {
|
||||||
'wireguard.network': network,
|
'wireguard': network,
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@metadata_reactor.provides(
|
@metadata_reactor.provides(
|
||||||
'systemd/units',
|
'systemd-networkd/netdevs',
|
||||||
)
|
)
|
||||||
def systemd_networkd_netdevs(metadata):
|
def systemd_networkd_netdevs(metadata):
|
||||||
netdev = {
|
netdev = {
|
||||||
|
@ -99,9 +99,9 @@ def systemd_networkd_netdevs(metadata):
|
||||||
})
|
})
|
||||||
|
|
||||||
return {
|
return {
|
||||||
'systemd': {
|
'systemd-networkd': {
|
||||||
'units': {
|
'netdevs': {
|
||||||
'wireguard.netdev': netdev,
|
'wireguard': netdev,
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
|
@ -23,21 +23,5 @@ ${option}=${str(value)}
|
||||||
% endfor
|
% endfor
|
||||||
'''
|
'''
|
||||||
|
|
||||||
order = [
|
|
||||||
'Unit',
|
|
||||||
'Timer',
|
|
||||||
'Service',
|
|
||||||
'Install',
|
|
||||||
]
|
|
||||||
|
|
||||||
def segment_order(segment):
|
|
||||||
return (
|
|
||||||
order.index(segment[0]) if segment[0] in order else float('inf'),
|
|
||||||
segment[0]
|
|
||||||
)
|
|
||||||
|
|
||||||
def generate_unitfile(data):
|
def generate_unitfile(data):
|
||||||
return Template(template).render(
|
return Template(template).render(data=data).lstrip()
|
||||||
data=dict(sorted(data.items(), key=segment_order)),
|
|
||||||
order=order
|
|
||||||
).lstrip()
|
|
||||||
|
|
Loading…
Reference in a new issue