diff options
author | Indrajit Raychaudhuri <irc@indrajit.com> | 2024-12-17 08:29:22 -0600 |
---|---|---|
committer | Indrajit Raychaudhuri <irc@indrajit.com> | 2025-02-17 13:48:28 -0600 |
commit | d1bb249b96cc03a2bd223326cefe2bc4a0dbad4a (patch) | |
tree | aaaaee1b47df4daf5cbb731a3b3265487d0fc49c /python | |
parent | fa2df64a25e57b2eb9fe6698c39f6cfbfd02fe5f (diff) | |
download | vyos-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.py | 66 |
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 ) |