summaryrefslogtreecommitdiff
path: root/python
diff options
context:
space:
mode:
authorIndrajit Raychaudhuri <irc@indrajit.com>2024-12-17 08:29:22 -0600
committerIndrajit Raychaudhuri <irc@indrajit.com>2025-02-17 13:48:28 -0600
commitd1bb249b96cc03a2bd223326cefe2bc4a0dbad4a (patch)
treeaaaaee1b47df4daf5cbb731a3b3265487d0fc49c /python
parentfa2df64a25e57b2eb9fe6698c39f6cfbfd02fe5f (diff)
downloadvyos-1x-d1bb249b96cc03a2bd223326cefe2bc4a0dbad4a.tar.gz
vyos-1x-d1bb249b96cc03a2bd223326cefe2bc4a0dbad4a.zip
dhcp: T6948: kea: Add kea helpers and enrich leases with domain name
Add helpers: - `kea_add_lease` to add a lease to the running kea server - `kea_get_domain_from_subnet_id` to get the domain name from subnet id Also, enrich leases with domain name from subnet id
Diffstat (limited to 'python')
-rw-r--r--python/vyos/kea.py66
1 files changed, 66 insertions, 0 deletions
diff --git a/python/vyos/kea.py b/python/vyos/kea.py
index 65e2d99b4..c7947af3e 100644
--- a/python/vyos/kea.py
+++ b/python/vyos/kea.py
@@ -384,6 +384,41 @@ def kea_get_leases(inet):
return leases['arguments']['leases']
+def kea_add_lease(
+ inet,
+ ip_address,
+ host_name=None,
+ mac_address=None,
+ iaid=None,
+ duid=None,
+ subnet_id=None,
+):
+ args = {'ip-address': ip_address}
+
+ if host_name:
+ args['hostname'] = host_name
+
+ if subnet_id:
+ args['subnet-id'] = subnet_id
+
+ # IPv4 requires MAC address, IPv6 requires either MAC address or DUID
+ if mac_address:
+ args['hw-address'] = mac_address
+ if duid:
+ args['duid'] = duid
+
+ # IPv6 requires IAID
+ if inet == '6' and iaid:
+ args['iaid'] = iaid
+
+ result = _ctrl_socket_command(inet, f'lease{inet}-add', args)
+
+ if result and 'result' in result:
+ return result['result'] == 0
+
+ return False
+
+
def kea_delete_lease(inet, ip_address):
args = {'ip-address': ip_address}
@@ -430,6 +465,32 @@ def kea_get_pool_from_subnet_id(config, inet, subnet_id):
return None
+def kea_get_domain_from_subnet_id(config, inet, subnet_id):
+ shared_networks = dict_search_args(
+ config, 'arguments', f'Dhcp{inet}', 'shared-networks'
+ )
+
+ if not shared_networks:
+ return None
+
+ for network in shared_networks:
+ if f'subnet{inet}' not in network:
+ continue
+
+ for subnet in network[f'subnet{inet}']:
+ if 'id' in subnet and int(subnet['id']) == int(subnet_id):
+ for option in subnet['option-data']:
+ if option['name'] == 'domain-name':
+ return option['data']
+
+ # domain-name is not found in subnet, fallback to shared-network pool option
+ for option in network['option-data']:
+ if option['name'] == 'domain-name':
+ return option['data']
+
+ return None
+
+
def kea_get_static_mappings(config, inet, pools=[]) -> list:
"""
Get DHCP static mapping from active Kea DHCPv4 or DHCPv6 configuration
@@ -491,6 +552,11 @@ def kea_get_server_leases(config, inet, pools=[], state=[], origin=None) -> list
if config
else '-'
)
+ data_lease['domain'] = (
+ kea_get_domain_from_subnet_id(config, inet, lease['subnet-id'])
+ if config
+ else ''
+ )
data_lease['end'] = (
lease['expire_time'].timestamp() if lease['expire_time'] else None
)