80 lines
2 KiB
Python
80 lines
2 KiB
Python
from ipaddress import ip_interface
|
|
|
|
defaults = {
|
|
'network': {},
|
|
}
|
|
|
|
|
|
@metadata_reactor.provides(
|
|
'network/internal_interface',
|
|
)
|
|
def internal_interface(metadata):
|
|
if (
|
|
metadata.get('network/interfaces/internal', None)
|
|
and not metadata.get('network/internal_interface', None)
|
|
):
|
|
return {
|
|
'network': {
|
|
'internal_interface': 'internal',
|
|
}
|
|
}
|
|
else:
|
|
return {}
|
|
|
|
|
|
@metadata_reactor.provides(
|
|
'network/internal_ipv4',
|
|
)
|
|
def internal_ipv4(metadata):
|
|
if (
|
|
metadata.get('network/internal_interface', None)
|
|
and not metadata.get('network/internal_ipv4', None)
|
|
):
|
|
internal_interface = metadata.get('network/internal_interface', None)
|
|
return {
|
|
'network': {
|
|
'internal_ipv4': metadata.get(f'network/interfaces/{internal_interface}/ipv4'),
|
|
}
|
|
}
|
|
else:
|
|
return {}
|
|
|
|
|
|
@metadata_reactor.provides(
|
|
'systemd/units',
|
|
)
|
|
def units(metadata):
|
|
units = {}
|
|
|
|
for name, conf in metadata.get('network/interfaces').items():
|
|
units[f'{name}.network'] = {
|
|
'Match': {
|
|
'Name': conf['match'],
|
|
},
|
|
'Network': {
|
|
'DHCP': conf.get('dhcp', 'no'),
|
|
'IPv6AcceptRA': conf.get('dhcp', 'no'),
|
|
}
|
|
}
|
|
|
|
for i in [4, 6]:
|
|
if conf.get(f'ipv{i}', None):
|
|
units[f'{name}.network'].update({
|
|
f'Address#ipv{i}': {
|
|
'Address': conf[f'ipv{i}'],
|
|
},
|
|
})
|
|
if f'gateway{i}' in conf:
|
|
units[f'{name}.network'].update({
|
|
f'Route#ipv{i}': {
|
|
'Gateway': conf[f'gateway{i}'],
|
|
'GatewayOnlink': 'yes',
|
|
}
|
|
})
|
|
|
|
|
|
return {
|
|
'systemd': {
|
|
'units': units,
|
|
}
|
|
}
|