summaryrefslogtreecommitdiff
path: root/src/conf_mode
diff options
context:
space:
mode:
authorDavid Vølker <david@voelker.dk>2025-08-15 09:31:49 +0200
committerDavid Vølker <david@voelker.dk>2025-08-15 09:31:49 +0200
commit974f9a5d5e13241e2b4ea54152bf835db6b7feff (patch)
treeb816d2c6c6bea3e670f44e880f32b10d311d353e /src/conf_mode
parent862817a7207c5b5d17c67451bac602d296b88230 (diff)
downloadvyos-1x-974f9a5d5e13241e2b4ea54152bf835db6b7feff.tar.gz
vyos-1x-974f9a5d5e13241e2b4ea54152bf835db6b7feff.zip
kea: T6211: add VRF support for KEA dhcp server
Diffstat (limited to 'src/conf_mode')
-rwxr-xr-xsrc/conf_mode/service_dhcp-server.py84
-rwxr-xr-xsrc/conf_mode/service_dhcpv6-server.py73
2 files changed, 135 insertions, 22 deletions
diff --git a/src/conf_mode/service_dhcp-server.py b/src/conf_mode/service_dhcp-server.py
index 99c7e6a1f..ef95d5d80 100755
--- a/src/conf_mode/service_dhcp-server.py
+++ b/src/conf_mode/service_dhcp-server.py
@@ -16,11 +16,13 @@
import os
+from sys import exit
+from sys import argv
+
from glob import glob
from ipaddress import ip_address
from ipaddress import ip_network
from netaddr import IPRange
-from sys import exit
from vyos.config import Config
from vyos.pki import wrap_certificate
@@ -41,16 +43,53 @@ from vyos import airbag
airbag.enable()
-ctrl_socket = '/run/kea/dhcp4-ctrl-socket'
-config_file = '/run/kea/kea-dhcp4.conf'
-config_file_d2 = '/run/kea/kea-dhcp-ddns.conf'
-lease_file = '/config/dhcp/dhcp4-leases.csv'
-lease_file_glob = '/config/dhcp/dhcp4-leases*'
+ctrl_socket = ''
+config_file = ''
+config_file_d2 = ''
+lease_file = ''
+lease_file_glob = ''
+
+ca_cert_file = ''
+cert_file = ''
+cert_key_file = ''
+
user_group = '_kea'
-ca_cert_file = '/run/kea/kea-failover-ca.pem'
-cert_file = '/run/kea/kea-failover.pem'
-cert_key_file = '/run/kea/kea-failover-key.pem'
+
+def _override_for_vrf(vrf_name):
+ """
+ This function is intended to override global vars when vrf is enabled
+ """
+ global ctrl_socket, config_file, config_file_d2, lease_file, lease_file_glob
+ global ca_cert_file, cert_file, cert_key_file
+
+ ctrl_socket = f'/run/kea/dhcp4-{vrf_name}-ctrl-socket'
+ config_file = f'/run/kea/kea-{vrf_name}-dhcp4.conf'
+ config_file_d2 = f'/run/kea/kea-{vrf_name}-dhcp-ddns.conf'
+ lease_file = f'/config/dhcp/dhcp4-{vrf_name}-leases.csv'
+ lease_file_glob = f'/config/dhcp/dhcp4-{vrf_name}-leases*'
+
+ ca_cert_file = f'/run/kea/kea-{vrf_name}-failover-ca.pem'
+ cert_file = f'/run/kea/kea-{vrf_name}-failover.pem'
+ cert_key_file = f'/run/kea/kea-{vrf_name}-failover-key.pem'
+
+
+def _reset_vars():
+ """
+ This function is intended to reset global vars when vrf is not enabled
+ """
+ global ctrl_socket, config_file, config_file_d2, lease_file, lease_file_glob
+ global ca_cert_file, cert_file, cert_key_file
+
+ ctrl_socket = '/run/kea/dhcp4-ctrl-socket'
+ config_file = '/run/kea/kea-dhcp4.conf'
+ config_file_d2 = '/run/kea/kea-dhcp-ddns.conf'
+ lease_file = '/config/dhcp/dhcp4-leases.csv'
+ lease_file_glob = '/config/dhcp/dhcp4-leases*'
+
+ ca_cert_file = '/run/kea/kea-failover-ca.pem'
+ cert_file = '/run/kea/kea-failover.pem'
+ cert_key_file = '/run/kea/kea-failover-key.pem'
def dhcp_slice_range(exclude_list, range_dict):
@@ -125,7 +164,19 @@ def get_config(config=None):
conf = config
else:
conf = Config()
- base = ['service', 'dhcp-server']
+
+ # if running in vrf, set base diffrently
+ if argv and len(argv) > 1:
+ vrf_name = argv[1]
+ base = ['vrf', 'name', vrf_name, 'service', 'dhcp-server']
+
+ # vrf is defined, override other vars aswell
+ _override_for_vrf(vrf_name)
+ else:
+ base = ['service', 'dhcp-server']
+
+ # vrf is not defined reset vars
+ _reset_vars()
if not conf.exists(base):
return None
@@ -137,6 +188,10 @@ def get_config(config=None):
with_recursive_defaults=True,
)
+ # add vrf context if present
+ if argv and len(argv) > 1:
+ dhcp['vrf_context'] = argv[1]
+
if 'shared_network_name' in dhcp:
for network, network_config in dhcp['shared_network_name'].items():
if 'subnet' in network_config:
@@ -524,7 +579,12 @@ def generate(dhcp):
def apply(dhcp):
- services = ['kea-dhcp4-server', 'kea-dhcp-ddns-server']
+ # if running in vrf, set base diffrently
+ if argv and len(argv) > 1:
+ vrf_name = argv[1]
+ services = [f'kea-dhcp4-server@{vrf_name}', f'kea-dhcp-ddns-server@{vrf_name}']
+ else:
+ services = ['kea-dhcp4-server', 'kea-dhcp-ddns-server']
if not dhcp or 'disable' in dhcp:
for service in services:
@@ -538,7 +598,7 @@ def apply(dhcp):
for service in services:
action = 'restart'
- if service == 'kea-dhcp-ddns-server' and 'dynamic_dns_update' not in dhcp:
+ if 'kea-dhcp-ddns-server' in service and 'dynamic_dns_update' not in dhcp:
action = 'stop'
call(f'systemctl {action} {service}.service')
diff --git a/src/conf_mode/service_dhcpv6-server.py b/src/conf_mode/service_dhcpv6-server.py
index 7af88007c..01f3abfe9 100755
--- a/src/conf_mode/service_dhcpv6-server.py
+++ b/src/conf_mode/service_dhcpv6-server.py
@@ -16,10 +16,12 @@
import os
+from sys import exit
+from sys import argv
+
from glob import glob
from ipaddress import ip_address
from ipaddress import ip_network
-from sys import exit
from vyos.config import Config
from vyos.template import render
@@ -32,26 +34,71 @@ from vyos.utils.dict import dict_search
from vyos.utils.network import is_subnet_connected
from vyos import ConfigError
from vyos import airbag
+
airbag.enable()
-config_file = '/run/kea/kea-dhcp6.conf'
-ctrl_socket = '/run/kea/dhcp6-ctrl-socket'
-lease_file = '/config/dhcp/dhcp6-leases.csv'
-lease_file_glob = '/config/dhcp/dhcp6-leases*'
+
+config_file = ''
+ctrl_socket = ''
+lease_file = ''
+lease_file_glob = ''
+
user_group = '_kea'
+
+def _override_for_vrf(vrf_name):
+ """
+ This function is intended to override some of the global vars
+ """
+ global ctrl_socket, config_file, lease_file, lease_file_glob
+
+ config_file = f'/run/kea/kea-{vrf_name}-dhcp6.conf'
+ ctrl_socket = f'/run/kea/dhcp6-{vrf_name}-ctrl-socket'
+ lease_file = f'/config/dhcp/dhcp6-{vrf_name}-leases.csv'
+ lease_file_glob = f'/config/dhcp/dhcp6-{vrf_name}-leases*'
+
+
+def _reset_vars():
+ """
+ This function is intended to reset global vars when vrf is not enabled
+ """
+ global ctrl_socket, config_file, lease_file, lease_file_glob
+
+ config_file = '/run/kea/kea-dhcp6.conf'
+ ctrl_socket = '/run/kea/dhcp6-ctrl-socket'
+ lease_file = '/config/dhcp/dhcp6-leases.csv'
+ lease_file_glob = '/config/dhcp/dhcp6-leases*'
+
+
def get_config(config=None):
if config:
conf = config
else:
conf = Config()
- base = ['service', 'dhcpv6-server']
+
+ # if running in vrf, set base diffrently
+ if argv and len(argv) > 1:
+ vrf_name = argv[1]
+ base = ['vrf', 'name', vrf_name, 'service', 'dhcpv6-server']
+
+ # vrf is defined, override other vars aswell
+ _override_for_vrf(vrf_name)
+ else:
+ base = ['service', 'dhcpv6-server']
+
+ # vrf is not defined reset vars
+ _reset_vars()
if not conf.exists(base):
return None
- dhcpv6 = conf.get_config_dict(base, key_mangling=('-', '_'),
- get_first_key=True,
- no_tag_node_value_mangle=True)
+ dhcpv6 = conf.get_config_dict(
+ base, key_mangling=('-', '_'), get_first_key=True, no_tag_node_value_mangle=True
+ )
+
+ # add vrf context if present
+ if argv and len(argv) > 1:
+ dhcpv6['vrf_context'] = argv[1]
+
return dhcpv6
def verify(dhcpv6):
@@ -239,8 +286,14 @@ def generate(dhcpv6):
return None
def apply(dhcpv6):
+ # if running in vrf, set base diffrently
+ if argv and len(argv) > 1:
+ vrf_name = argv[1]
+ service_name = f'kea-dhcp6-server@{vrf_name}.service'
+ else:
+ service_name = 'kea-dhcp6-server.service'
+
# bail out early - looks like removal from running config
- service_name = 'kea-dhcp6-server.service'
if not dhcpv6 or 'disable' in dhcpv6:
# DHCP server is removed in the commit
call(f'systemctl stop {service_name}')