Compare commits

..

No commits in common. "f49928bed138f18cd0a32d559121088cc4d9d05f" and "85844845646340ef81f56f417a303cce509e9fa5" have entirely different histories.

13 changed files with 139 additions and 196 deletions

View file

@ -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',
],
}

View file

@ -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': {

View file

@ -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 {

View file

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

View file

@ -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': {},
} }

View file

@ -6,4 +6,8 @@ defaults = {
}, },
}, },
}, },
'systemd-networkd': {
'netdevs': {},
'networks': {},
},
} }

View file

@ -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'] = {}

View file

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

View file

@ -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': {
},
}
}
},
}
```

View file

@ -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

View file

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

View file

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

View file

@ -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()