summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rwxr-xr-xsrc/conf_mode/service_dhcp-server.py84
-rwxr-xr-xsrc/conf_mode/service_dhcpv6-server.py73
-rw-r--r--src/etc/sudoers.d/vyos3
-rw-r--r--src/etc/systemd/system/kea-dhcp-ddns-server@.service22
-rw-r--r--src/etc/systemd/system/kea-dhcp4-server@.service22
-rw-r--r--src/etc/systemd/system/kea-dhcp6-server@.service22
-rwxr-xr-xsrc/op_mode/dhcp.py119
-rwxr-xr-xsrc/system/on-dhcp-event.sh2
-rwxr-xr-xsrc/system/sync-dhcp-lease-to-hosts.py6
9 files changed, 299 insertions, 54 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}')
diff --git a/src/etc/sudoers.d/vyos b/src/etc/sudoers.d/vyos
index 198b9b9aa..2dd8850c4 100644
--- a/src/etc/sudoers.d/vyos
+++ b/src/etc/sudoers.d/vyos
@@ -47,6 +47,8 @@ Cmnd_Alias DIAGNOSTICS = /bin/ip vrf exec * /bin/ping *, \
/usr/libexec/vyos/op_mode/*
Cmnd_Alias KEA_IP6_ROUTES = /sbin/ip -6 route replace *,\
/sbin/ip -6 route del *
+Cmnd_Alias KEA_DHCP = /bin/ip vrf exec * /usr/sbin/kea-dhcp*,\
+ /usr/bin/chown * /run/kea/*
%operator ALL=NOPASSWD: DATE, IPTABLES, ETHTOOL, IPFLUSH, HWINFO, \
PPPOE_CMDS, PCAPTURE, /usr/sbin/wanpipemon, \
DMIDECODE, DISK, CONNTRACK, IP6TABLES, \
@@ -62,3 +64,4 @@ Cmnd_Alias KEA_IP6_ROUTES = /sbin/ip -6 route replace *,\
%sudo ALL=NOPASSWD: /usr/bin/mokutil
_kea ALL=NOPASSWD: KEA_IP6_ROUTES
+_kea ALL=NOPASSWD: KEA_DHCP
diff --git a/src/etc/systemd/system/kea-dhcp-ddns-server@.service b/src/etc/systemd/system/kea-dhcp-ddns-server@.service
new file mode 100644
index 000000000..b6360e573
--- /dev/null
+++ b/src/etc/systemd/system/kea-dhcp-ddns-server@.service
@@ -0,0 +1,22 @@
+[Unit]
+Description=Kea DDNS Service
+Documentation=man:kea-dhcp-ddns(8)
+Wants=network-online.target
+After=vyos-router.service
+
+[Service]
+User=_kea
+AmbientCapabilities=CAP_NET_BIND_SERVICE
+Environment="KEA_LOCKFILE_DIR=/run/lock/kea"
+ConfigurationDirectory=kea
+RuntimeDirectory=kea lock/kea
+RuntimeDirectoryPreserve=yes
+LogsDirectory=kea
+LogsDirectoryMode=0750
+StateDirectory=kea
+ExecStart=sudo /bin/ip vrf exec %i /usr/sbin/kea-dhcp-ddns -c /run/kea/kea-%i-dhcp-ddns.conf
+ExecStartPost=/bin/sh -c 'sleep 10 && sudo /usr/bin/chown _kea:_kea /run/kea/kea-%i-dhcp-ddns* && sudo /usr/bin/chown _kea:_kea /run/kea/logger_lockfile'
+Restart=on-failure
+
+[Install]
+WantedBy=multi-user.target
diff --git a/src/etc/systemd/system/kea-dhcp4-server@.service b/src/etc/systemd/system/kea-dhcp4-server@.service
new file mode 100644
index 000000000..f63364275
--- /dev/null
+++ b/src/etc/systemd/system/kea-dhcp4-server@.service
@@ -0,0 +1,22 @@
+[Unit]
+Description=Kea IPv4 DHCP daemon
+Documentation=man:kea-dhcp4(8)
+Wants=network-online.target
+After=vyos-router.service
+
+[Service]
+User=_kea
+AmbientCapabilities=CAP_NET_BIND_SERVICE CAP_NET_RAW
+Environment="KEA_LOCKFILE_DIR=/run/lock/kea"
+ConfigurationDirectory=kea
+RuntimeDirectory=kea lock/kea
+RuntimeDirectoryPreserve=yes
+LogsDirectory=kea
+LogsDirectoryMode=0750
+StateDirectory=kea
+ExecStart=sudo /bin/ip vrf exec %i /usr/sbin/kea-dhcp4 -c /run/kea/kea-%i-dhcp4.conf
+ExecStartPost=/bin/sh -c 'sleep 10 && sudo /usr/bin/chown _kea:_kea /run/kea/dhcp4-%i-ctrl* && sudo /usr/bin/chown _kea:_kea /run/kea/kea-%i-dhcp4* && sudo /usr/bin/chown _kea:_kea /run/kea/logger_lockfile'
+Restart=on-failure
+
+[Install]
+WantedBy=multi-user.target
diff --git a/src/etc/systemd/system/kea-dhcp6-server@.service b/src/etc/systemd/system/kea-dhcp6-server@.service
new file mode 100644
index 000000000..1d2330f74
--- /dev/null
+++ b/src/etc/systemd/system/kea-dhcp6-server@.service
@@ -0,0 +1,22 @@
+[Unit]
+Description=Kea IPv6 DHCP daemon
+Documentation=man:kea-dhcp6(8)
+Wants=network-online.target
+After=vyos-router.service
+
+[Service]
+User=_kea
+AmbientCapabilities=CAP_NET_BIND_SERVICE
+Environment="KEA_LOCKFILE_DIR=/run/lock/kea"
+ConfigurationDirectory=kea
+RuntimeDirectory=kea lock/kea
+RuntimeDirectoryPreserve=yes
+LogsDirectory=kea
+LogsDirectoryMode=0750
+StateDirectory=kea
+ExecStart=sudo /bin/ip vrf exec %i /usr/sbin/kea-dhcp6 -c /run/kea/kea-%i-dhcp6.conf
+ExecStartPost=/bin/sh -c 'sleep 10 && sudo /usr/bin/chown _kea:_kea /run/kea/dhcp6-%i-ctrl* && sudo /usr/bin/chown _kea:_kea /run/kea/kea-%i-dhcp6* && sudo /usr/bin/chown _kea:_kea /run/kea/logger_lockfile'
+Restart=on-failure
+
+[Install]
+WantedBy=multi-user.target
diff --git a/src/op_mode/dhcp.py b/src/op_mode/dhcp.py
index 725bfc75b..f4b7ac582 100755
--- a/src/op_mode/dhcp.py
+++ b/src/op_mode/dhcp.py
@@ -83,12 +83,12 @@ ArgOrigin = typing.Literal['local', 'remote']
def _get_raw_server_leases(
- config, family='inet', pool=None, sorted=None, state=[], origin=None
+ config, family='inet', vrf='', pool=None, sorted=None, state=[], origin=None
) -> list:
inet_suffix = '6' if family == 'inet6' else '4'
pools = [pool] if pool else kea_get_dhcp_pools(config, inet_suffix)
- mappings = kea_get_server_leases(config, inet_suffix, pools, state, origin)
+ mappings = kea_get_server_leases(config, inet_suffix, vrf, pools, state, origin)
if sorted:
if sorted == 'ip':
@@ -166,9 +166,13 @@ def _get_formatted_server_leases(raw_data, family='inet'):
return output
-def _get_pool_size(pool, family='inet'):
+def _get_pool_size(pool, family='inet', vrf=''):
v = 'v6' if family == 'inet6' else ''
- base = f'service dhcp{v}-server shared-network-name {pool}'
+ # if vrf is set get the correct base for config
+ if vrf:
+ base = f'vrf name {vrf} service dhcp{v}-server shared-network-name {pool}'
+ else:
+ base = f'service dhcp{v}-server shared-network-name {pool}'
size = 0
subnets = config.list_nodes(f'{base} subnet')
for subnet in subnets:
@@ -185,14 +189,14 @@ def _get_pool_size(pool, family='inet'):
return size
-def _get_raw_server_pool_statistics(config, family='inet', pool=None):
+def _get_raw_server_pool_statistics(config, family='inet', vrf='', pool=None):
inet_suffix = '6' if family == 'inet6' else '4'
pools = [pool] if pool else kea_get_dhcp_pools(config, inet_suffix)
stats = []
for p in pools:
- size = _get_pool_size(family=family, pool=p)
- leases = len(_get_raw_server_leases(config, family=family, pool=p))
+ size = _get_pool_size(family=family, vrf=vrf, pool=p)
+ leases = len(_get_raw_server_leases(config, family=family, vrf=vrf, pool=p))
use_percentage = round(leases / size * 100) if size != 0 else 0
pool_stats = {
'pool': p,
@@ -269,11 +273,20 @@ def _verify_server(func):
def _wrapper(*args, **kwargs):
config = ConfigTreeQuery()
family = kwargs.get('family')
+ vrf = kwargs.get('vrf')
v = 'v6' if family == 'inet6' else ''
- unconf_message = f'DHCP{v} server is not configured'
+
# Check if config does not exist
- if not config.exists(f'service dhcp{v}-server'):
- raise vyos.opmode.UnconfiguredSubsystem(unconf_message)
+ if vrf:
+ unconf_message = f'DHCP{v} server is not configured for VRF {vrf}'
+ if not config.exists(f'vrf name {vrf} service dhcp{v}-server'):
+ raise vyos.opmode.UnconfiguredSubsystem(unconf_message)
+ else:
+ unconf_message = f'DHCP{v} server is not configured'
+ if not config.exists(f'service dhcp{v}-server'):
+ raise vyos.opmode.UnconfiguredSubsystem(unconf_message)
+
+ # return
return func(*args, **kwargs)
return _wrapper
@@ -303,25 +316,42 @@ def _verify_client(func):
@_verify_server
def show_server_pool_statistics(
- raw: bool, family: ArgFamily, pool: typing.Optional[str]
+ raw: bool, family: ArgFamily, vrf: str, pool: typing.Optional[str]
):
v = 'v6' if family == 'inet6' else ''
inet_suffix = '6' if family == 'inet6' else '4'
- if not is_systemd_service_running(f'kea-dhcp{inet_suffix}-server.service'):
+ if vrf:
+ service = f'kea-dhcp{inet_suffix}-server@{vrf}.service'
+ else:
+ service = f'kea-dhcp{inet_suffix}-server.service'
+
+ if not is_systemd_service_running(service):
Warning(stale_warn_msg)
try:
- active_config = kea_get_active_config(inet_suffix)
+ active_config = kea_get_active_config(inet_suffix, vrf)
except Exception:
- raise vyos.opmode.DataUnavailable('Cannot fetch DHCP server configuration')
+ if vrf:
+ raise vyos.opmode.DataUnavailable(
+ f'Cannot fetch DHCP server configuration for VRF {vrf}'
+ )
+ else:
+ raise vyos.opmode.DataUnavailable('Cannot fetch DHCP server configuration')
active_pools = kea_get_dhcp_pools(active_config, inet_suffix)
if pool and active_pools and pool not in active_pools:
- raise vyos.opmode.IncorrectValue(f'DHCP{v} pool "{pool}" does not exist!')
+ if vrf:
+ raise vyos.opmode.IncorrectValue(
+ f'DHCP{v} pool "{pool}" does not exist for VRF {vrf}!'
+ )
+ else:
+ raise vyos.opmode.IncorrectValue(f'DHCP{v} pool "{pool}" does not exist!')
- pool_data = _get_raw_server_pool_statistics(active_config, family=family, pool=pool)
+ pool_data = _get_raw_server_pool_statistics(
+ active_config, family=family, vrf=vrf, pool=pool
+ )
if raw:
return pool_data
else:
@@ -332,6 +362,7 @@ def show_server_pool_statistics(
def show_server_leases(
raw: bool,
family: ArgFamily,
+ vrf: str,
pool: typing.Optional[str],
sorted: typing.Optional[str],
state: typing.Optional[ArgState],
@@ -340,18 +371,33 @@ def show_server_leases(
v = 'v6' if family == 'inet6' else ''
inet_suffix = '6' if family == 'inet6' else '4'
- if not is_systemd_service_running(f'kea-dhcp{inet_suffix}-server.service'):
+ if vrf:
+ service = f'kea-dhcp{inet_suffix}-server@{vrf}.service'
+ else:
+ service = f'kea-dhcp{inet_suffix}-server.service'
+
+ if not is_systemd_service_running(service):
Warning(stale_warn_msg)
try:
- active_config = kea_get_active_config(inet_suffix)
+ active_config = kea_get_active_config(inet_suffix, vrf)
except Exception:
- raise vyos.opmode.DataUnavailable('Cannot fetch DHCP server configuration')
+ if vrf:
+ raise vyos.opmode.DataUnavailable(
+ f'Cannot fetch DHCP server configuration for VRF {vrf}'
+ )
+ else:
+ raise vyos.opmode.DataUnavailable('Cannot fetch DHCP server configuration')
active_pools = kea_get_dhcp_pools(active_config, inet_suffix)
if pool and active_pools and pool not in active_pools:
- raise vyos.opmode.IncorrectValue(f'DHCP{v} pool "{pool}" does not exist!')
+ if vrf:
+ raise vyos.opmode.IncorrectValue(
+ f'DHCP{v} pool "{pool}" does not exist for VRF {vrf}!'
+ )
+ else:
+ raise vyos.opmode.IncorrectValue(f'DHCP{v} pool "{pool}" does not exist!')
sort_valid = sort_valid_inet6 if family == 'inet6' else sort_valid_inet
if sorted and sorted not in sort_valid:
@@ -363,6 +409,7 @@ def show_server_leases(
lease_data = _get_raw_server_leases(
config=active_config,
family=family,
+ vrf=vrf,
pool=pool,
sorted=sorted,
state=state,
@@ -378,24 +425,40 @@ def show_server_leases(
def show_server_static_mappings(
raw: bool,
family: ArgFamily,
+ vrf: str,
pool: typing.Optional[str],
sorted: typing.Optional[str],
):
v = 'v6' if family == 'inet6' else ''
inet_suffix = '6' if family == 'inet6' else '4'
- if not is_systemd_service_running(f'kea-dhcp{inet_suffix}-server.service'):
+ if vrf:
+ service = f'kea-dhcp{inet_suffix}-server@{vrf}.service'
+ else:
+ service = f'kea-dhcp{inet_suffix}-server.service'
+
+ if not is_systemd_service_running(service):
Warning(stale_warn_msg)
try:
- active_config = kea_get_active_config(inet_suffix)
+ active_config = kea_get_active_config(inet_suffix, vrf)
except Exception:
- raise vyos.opmode.DataUnavailable('Cannot fetch DHCP server configuration')
+ if vrf:
+ raise vyos.opmode.DataUnavailable(
+ f'Cannot fetch DHCP server configuration for VRF {vrf}'
+ )
+ else:
+ raise vyos.opmode.DataUnavailable('Cannot fetch DHCP server configuration')
active_pools = kea_get_dhcp_pools(active_config, inet_suffix)
if pool and active_pools and pool not in active_pools:
- raise vyos.opmode.IncorrectValue(f'DHCP{v} pool "{pool}" does not exist!')
+ if vrf:
+ raise vyos.opmode.IncorrectValue(
+ f'DHCP{v} pool "{pool}" does not exist for VRF {vrf}!'
+ )
+ else:
+ raise vyos.opmode.IncorrectValue(f'DHCP{v} pool "{pool}" does not exist!')
if sorted and sorted not in mapping_sort_valid:
raise vyos.opmode.IncorrectValue(f'DHCP{v} sort "{sorted}" is invalid!')
@@ -409,13 +472,13 @@ def show_server_static_mappings(
return _get_formatted_server_static_mappings(static_mappings)
-def _lease_valid(inet, address):
- leases = kea_get_leases(inet)
+def _lease_valid(inet, vrf, address):
+ leases = kea_get_leases(inet, vrf)
return any(lease['ip-address'] == address for lease in leases)
@_verify_server
-def clear_dhcp_server_lease(family: ArgFamily, address: str):
+def clear_dhcp_server_lease(family: ArgFamily, vrf: str, address: str):
v = 'v6' if family == 'inet6' else ''
inet = '6' if family == 'inet6' else '4'
@@ -423,7 +486,7 @@ def clear_dhcp_server_lease(family: ArgFamily, address: str):
print(f'Lease not found on DHCP{v} server')
return None
- if not kea_delete_lease(inet, address):
+ if not kea_delete_lease(inet, vrf, address):
print(f'Failed to clear lease for "{address}"')
return None
diff --git a/src/system/on-dhcp-event.sh b/src/system/on-dhcp-event.sh
index 47c276270..556d7dbcb 100755
--- a/src/system/on-dhcp-event.sh
+++ b/src/system/on-dhcp-event.sh
@@ -30,7 +30,7 @@ get_subnet_domain_name () {
from vyos.kea import kea_get_active_config
from vyos.utils.dict import dict_search_args
-config = kea_get_active_config('4')
+config = kea_get_active_config('4', '')
shared_networks = dict_search_args(config, 'arguments', f'Dhcp4', 'shared-networks')
found = False
diff --git a/src/system/sync-dhcp-lease-to-hosts.py b/src/system/sync-dhcp-lease-to-hosts.py
index 5c8b18faf..8baa6992a 100755
--- a/src/system/sync-dhcp-lease-to-hosts.py
+++ b/src/system/sync-dhcp-lease-to-hosts.py
@@ -33,17 +33,17 @@ logs_handler = logging.StreamHandler()
logger.addHandler(logs_handler)
-def _get_all_server_leases(inet_suffix='4') -> list:
+def _get_all_server_leases(inet_suffix='4', vrf='') -> list:
mappings = []
try:
- active_config = kea_get_active_config(inet_suffix)
+ active_config = kea_get_active_config(inet_suffix, vrf)
except Exception:
raise vyos.opmode.DataUnavailable('Cannot fetch DHCP server configuration')
try:
pools = kea_get_dhcp_pools(active_config, inet_suffix)
mappings = kea_get_server_leases(
- active_config, inet_suffix, pools, state=[], origin=None
+ active_config, inet_suffix, vrf, pools, state=[], origin=None
)
except Exception:
raise vyos.opmode.DataUnavailable('Cannot fetch DHCP server leases')