From 7bd5f41bc91ccae8716c2a9235fc0bee5e2338c5 Mon Sep 17 00:00:00 2001 From: cronekorkn Date: Mon, 23 Sep 2024 20:32:12 +0200 Subject: [PATCH] dhcp from interface --- bundles/kea-dhcpd/metadata.py | 45 ++++++++++++++++++++- bundles/network/metadata.py | 27 +++++++++++++ nodes/home.router.py | 73 ++++++++++++++++++----------------- 3 files changed, 108 insertions(+), 37 deletions(-) diff --git a/bundles/kea-dhcpd/metadata.py b/bundles/kea-dhcpd/metadata.py index 860c04e..73065e7 100644 --- a/bundles/kea-dhcpd/metadata.py +++ b/bundles/kea-dhcpd/metadata.py @@ -1,3 +1,8 @@ +from ipaddress import ip_interface + +hashable = repo.libs.hashable.hashable + + defaults = { 'apt': { 'packages': { @@ -31,7 +36,43 @@ defaults = { @metadata_reactor.provides( - + 'kea', ) def subnets(metadata): - pass + subnet4 = set() + interfaces = set() + + for network_name, network_conf in metadata.get('network').items(): + dhcp_server_config = network_conf.get('dhcp_server_config', None) + + if dhcp_server_config: + subnet4.add(hashable({ + 'subnet': dhcp_server_config['subnet'], + 'pools': [ + { + 'pool': f'{dhcp_server_config['pool_from']} - {dhcp_server_config['pool_to']}', + }, + ], + 'option-data': [ + { + 'name': 'routers', + 'data': dhcp_server_config['router'], + }, + { + 'name': 'domain-name-servers', + 'data': '10.0.10.2', + }, + ], + })) + interfaces.add(network_conf.get('interface', network_name)) + + return { + 'kea': { + 'Dhcp4': { + 'interfaces-config': { + 'interfaces': interfaces, + }, + 'subnet4': subnet4, + }, + }, + } diff --git a/bundles/network/metadata.py b/bundles/network/metadata.py index d9b51e6..8e8adbd 100644 --- a/bundles/network/metadata.py +++ b/bundles/network/metadata.py @@ -5,6 +5,33 @@ defaults = { } +@metadata_reactor.provides( + 'network', +) +def dhcp(metadata): + networks = {} + + for network_name, network_conf in metadata.get('network').items(): + _interface = ip_interface(network_conf['ipv4']) + _ip = _interface.ip + _network = _interface.network + _hosts = list(_network.hosts()) + + if network_conf.get('dhcp_server', False): + networks[network_name] = { + 'dhcp_server_config': { + 'subnet': str(_network), + 'pool_from': str(_hosts[len(_hosts)//2]), + 'pool_to': str(_hosts[-3]), + 'router': str(_ip), + 'domain-name-servers': str(_ip), + } + } + return { + 'network': networks, + } + + @metadata_reactor.provides( 'systemd/units', ) diff --git a/nodes/home.router.py b/nodes/home.router.py index 8dbc32d..c97f7e9 100644 --- a/nodes/home.router.py +++ b/nodes/home.router.py @@ -18,6 +18,7 @@ 'interface': 'eno1', 'ipv4': '10.0.0.1/24', 'vlans': {'iot', 'internet', 'guest'}, + 'dhcp_server': True, }, 'temp': { 'interface': 'enx00e04c220682', @@ -28,6 +29,7 @@ 'type': 'vlan', 'id': 2, 'ipv4': '10.0.2.1/24', + 'dhcp_server': True, }, 'internet': { 'type': 'vlan', @@ -38,45 +40,46 @@ 'type': 'vlan', 'id': 9, 'ipv4': '10.0.9.1/24', + 'dhcp_server': True, }, }, 'kea': { 'Dhcp4': { - 'interfaces-config': { - 'interfaces': ['eno1', 'iot', 'guest'], - }, - 'subnet4': [ - { - 'subnet': '10.0.0.0/24', - 'pools': [ - { 'pool': '10.0.0.100 - 10.0.0.200' }, - ], - 'option-data': [ - { 'name': 'routers', 'data': '10.0.0.1' }, - { 'name': 'domain-name-servers', 'data': '10.0.10.2' }, - ], - }, - { - 'subnet': '10.0.2.0/24', - 'pools': [ - { 'pool': '10.0.2.100 - 10.0.2.200' }, - ], - 'option-data': [ - { 'name': 'routers', 'data': '10.0.2.1' }, - { 'name': 'domain-name-servers', 'data': '10.0.10.2' }, - ], - }, - { - 'subnet': '10.0.9.0/24', - 'pools': [ - { 'pool': '10.0.9.100 - 10.0.9.200' }, - ], - 'option-data': [ - { 'name': 'routers', 'data': '10.0.9.1' }, - { 'name': 'domain-name-servers', 'data': '10.0.10.2' }, - ], - }, - ], + #'interfaces-config': { + # 'interfaces': {'eno1', 'iot', 'guest'}, + #}, + # 'subnet4': [ + # { + # 'subnet': '10.0.0.0/24', + # 'pools': [ + # { 'pool': '10.0.0.100 - 10.0.0.200' }, + # ], + # 'option-data': [ + # { 'name': 'routers', 'data': '10.0.0.1' }, + # { 'name': 'domain-name-servers', 'data': '10.0.10.2' }, + # ], + # }, + # { + # 'subnet': '10.0.2.0/24', + # 'pools': [ + # { 'pool': '10.0.2.100 - 10.0.2.200' }, + # ], + # 'option-data': [ + # { 'name': 'routers', 'data': '10.0.2.1' }, + # { 'name': 'domain-name-servers', 'data': '10.0.10.2' }, + # ], + # }, + # { + # 'subnet': '10.0.9.0/24', + # 'pools': [ + # { 'pool': '10.0.9.100 - 10.0.9.200' }, + # ], + # 'option-data': [ + # { 'name': 'routers', 'data': '10.0.9.1' }, + # { 'name': 'domain-name-servers', 'data': '10.0.10.2' }, + # ], + # }, + # ], }, }, 'nftables': {