diff options
| author | Christian Breunig <christian@breunig.cc> | 2024-01-13 20:12:33 +0100 | 
|---|---|---|
| committer | GitHub <noreply@github.com> | 2024-01-13 20:12:33 +0100 | 
| commit | 9753fafbfed02a3b6ebe7b6ddf51783c5dcbcf62 (patch) | |
| tree | 929c8b42867462edad25b8028bac07b78c89b6fb /src | |
| parent | fef091bd6dc5c3cdfae47e9adb86f610a75a8a4d (diff) | |
| parent | 2d4db25386fcefd301868a4daa39d5578cbac779 (diff) | |
| download | vyos-1x-9753fafbfed02a3b6ebe7b6ddf51783c5dcbcf62.tar.gz vyos-1x-9753fafbfed02a3b6ebe7b6ddf51783c5dcbcf62.zip | |
Merge pull request #2817 from sarthurdev/kea6-options
dhcpv6: T3316: Extend scope of DHCP options, bugfixes
Diffstat (limited to 'src')
| -rwxr-xr-x | src/conf_mode/service_dhcpv6-server.py | 44 | ||||
| -rwxr-xr-x | src/migration-scripts/dhcpv6-server/3-to-4 | 35 | ||||
| -rwxr-xr-x | src/op_mode/dhcp.py | 9 | 
3 files changed, 64 insertions, 24 deletions
| diff --git a/src/conf_mode/service_dhcpv6-server.py b/src/conf_mode/service_dhcpv6-server.py index 7cd801cdd..214531904 100755 --- a/src/conf_mode/service_dhcpv6-server.py +++ b/src/conf_mode/service_dhcpv6-server.py @@ -81,26 +81,29 @@ def verify(dhcpv6):              subnet_ids.append(subnet_config['subnet_id']) -            if 'address_range' in subnet_config: -                if 'start' in subnet_config['address_range']: -                    range6_start = [] -                    range6_stop = [] -                    for start, start_config in subnet_config['address_range']['start'].items(): -                        if 'stop' not in start_config: -                            raise ConfigError(f'address-range stop address for start "{start}" is not defined!') -                        stop = start_config['stop'] +            if 'range' in subnet_config: +                range6_start = [] +                range6_stop = [] + +                for num, range_config in subnet_config['range'].items(): +                    if 'start' in range_config: +                        start = range_config['start'] + +                        if 'stop' not in range_config: +                            raise ConfigError(f'Range stop address for start "{start}" is not defined!') +                        stop = range_config['stop']                          # Start address must be inside network                          if not ip_address(start) in ip_network(subnet): -                            raise ConfigError(f'address-range start address "{start}" is not in subnet "{subnet}"!') +                            raise ConfigError(f'Range start address "{start}" is not in subnet "{subnet}"!')                          # Stop address must be inside network                          if not ip_address(stop) in ip_network(subnet): -                             raise ConfigError(f'address-range stop address "{stop}" is not in subnet "{subnet}"!') +                             raise ConfigError(f'Range stop address "{stop}" is not in subnet "{subnet}"!')                          # Stop address must be greater or equal to start address                          if not ip_address(stop) >= ip_address(start): -                            raise ConfigError(f'address-range stop address "{stop}" must be greater then or equal ' \ +                            raise ConfigError(f'Range stop address "{stop}" must be greater then or equal ' \                                                f'to the range start address "{start}"!')                          # DHCPv6 range start address must be unique - two ranges can't @@ -108,6 +111,7 @@ def verify(dhcpv6):                          if start in range6_start:                              raise ConfigError(f'Conflicting DHCPv6 lease range: '\                                                f'Pool start address "{start}" defined multipe times!') +                          range6_start.append(start)                          # DHCPv6 range stop address must be unique - two ranges can't @@ -115,12 +119,14 @@ def verify(dhcpv6):                          if stop in range6_stop:                              raise ConfigError(f'Conflicting DHCPv6 lease range: '\                                                f'Pool stop address "{stop}" defined multipe times!') +                          range6_stop.append(stop) -                if 'prefix' in subnet_config: -                    for prefix in subnet_config['prefix']: -                        if ip_network(prefix) not in ip_network(subnet): -                            raise ConfigError(f'address-range prefix "{prefix}" is not in subnet "{subnet}""') +                    if 'prefix' in range_config: +                        prefix = range_config['prefix'] + +                        if not ip_network(prefix).subnet_of(ip_network(subnet)): +                            raise ConfigError(f'Range prefix "{prefix}" is not in subnet "{subnet}"')              # Prefix delegation sanity checks              if 'prefix_delegation' in subnet_config: @@ -151,13 +157,15 @@ def verify(dhcpv6):                              raise ConfigError(f'Either MAC address or Client identifier (DUID) is required for '                                                f'static mapping "{mapping}" within shared-network "{network}, {subnet}"!') -            if 'vendor_option' in subnet_config: -                if len(dict_search('vendor_option.cisco.tftp_server', subnet_config)) > 2: -                    raise ConfigError(f'No more then two Cisco tftp-servers should be defined for subnet "{subnet}"!') +            if 'option' in subnet_config: +                if 'vendor_option' in subnet_config['option']: +                    if len(dict_search('option.vendor_option.cisco.tftp_server', subnet_config)) > 2: +                        raise ConfigError(f'No more then two Cisco tftp-servers should be defined for subnet "{subnet}"!')              # Subnets must be unique              if subnet in subnets:                  raise ConfigError(f'DHCPv6 subnets must be unique! Subnet {subnet} defined multiple times!') +              subnets.append(subnet)          # DHCPv6 requires at least one configured address range or one static mapping diff --git a/src/migration-scripts/dhcpv6-server/3-to-4 b/src/migration-scripts/dhcpv6-server/3-to-4 index c065e3d43..4747ebd60 100755 --- a/src/migration-scripts/dhcpv6-server/3-to-4 +++ b/src/migration-scripts/dhcpv6-server/3-to-4 @@ -16,6 +16,8 @@  # T3316:  # - Add subnet IDs to existing subnets +# - Move options to option node +# - Migrate address-range to range tagNode  import sys  import re @@ -37,6 +39,10 @@ if not config.exists(base):      # Nothing to do      sys.exit(0) +option_nodes = ['captive-portal', 'domain-search', 'name-server', +                'nis-domain', 'nis-server', 'nisplus-domain', 'nisplus-server', +                'sip-server', 'sntp-server', 'vendor-option'] +  subnet_id = 1  for network in config.list_nodes(base): @@ -44,6 +50,35 @@ for network in config.list_nodes(base):          for subnet in config.list_nodes(base + [network, 'subnet']):              base_subnet = base + [network, 'subnet', subnet] +            if config.exists(base_subnet + ['address-range']): +                config.set(base_subnet + ['range']) +                config.set_tag(base_subnet + ['range']) + +                range_id = 1 + +                if config.exists(base_subnet + ['address-range', 'prefix']): +                    for prefix in config.return_values(base_subnet + ['address-range', 'prefix']): +                        config.set(base_subnet + ['range', range_id, 'prefix'], value=prefix) + +                        range_id += 1 + +                if config.exists(base_subnet + ['address-range', 'start']): +                    for start in config.list_nodes(base_subnet + ['address-range', 'start']): +                        stop = config.return_value(base_subnet + ['address-range', 'start', start, 'stop']) + +                        config.set(base_subnet + ['range', range_id, 'start'], value=start) +                        config.set(base_subnet + ['range', range_id, 'stop'], value=stop) + +                        range_id += 1 + +                config.delete(base_subnet + ['address-range']) + +            for option in option_nodes: +                if config.exists(base_subnet + [option]): +                    config.set(base_subnet + ['option']) +                    config.copy(base_subnet + [option], base_subnet + ['option', option]) +                    config.delete(base_subnet + [option]) +              config.set(base_subnet + ['subnet-id'], value=subnet_id)              subnet_id += 1 diff --git a/src/op_mode/dhcp.py b/src/op_mode/dhcp.py index 02f4d5bbb..a64acec31 100755 --- a/src/op_mode/dhcp.py +++ b/src/op_mode/dhcp.py @@ -194,14 +194,11 @@ def _get_pool_size(pool, family='inet'):      size = 0      subnets = config.list_nodes(f'{base} subnet')      for subnet in subnets: -        if family == 'inet6': -            ranges = config.list_nodes(f'{base} subnet {subnet} address-range start') -        else: -            ranges = config.list_nodes(f'{base} subnet {subnet} range') +        ranges = config.list_nodes(f'{base} subnet {subnet} range')          for range in ranges:              if family == 'inet6': -                start = config.list_nodes(f'{base} subnet {subnet} address-range start')[0] -                stop = config.value(f'{base} subnet {subnet} address-range start {start} stop') +                start = config.value(f'{base} subnet {subnet} range {range} start') +                stop = config.value(f'{base} subnet {subnet} range {range} stop')              else:                  start = config.value(f'{base} subnet {subnet} range {range} start')                  stop = config.value(f'{base} subnet {subnet} range {range} stop') | 
