diff options
| -rw-r--r-- | data/templates/accel-ppp/config_ip_pool.j2 | 12 | ||||
| -rw-r--r-- | data/templates/accel-ppp/pppoe.config.j2 | 13 | ||||
| -rw-r--r-- | interface-definitions/include/accel-ppp/client-ip-pool-name.xml.i | 18 | ||||
| -rw-r--r-- | interface-definitions/service-ipoe-server.xml.in | 17 | ||||
| -rw-r--r-- | interface-definitions/service-pppoe-server.xml.in | 1 | ||||
| -rw-r--r-- | python/vyos/configverify.py | 15 | ||||
| -rwxr-xr-x | smoketest/scripts/cli/test_service_pppoe-server.py | 29 | 
7 files changed, 86 insertions, 19 deletions
| diff --git a/data/templates/accel-ppp/config_ip_pool.j2 b/data/templates/accel-ppp/config_ip_pool.j2 index 0bef4ad69..f7511e445 100644 --- a/data/templates/accel-ppp/config_ip_pool.j2 +++ b/data/templates/accel-ppp/config_ip_pool.j2 @@ -11,4 +11,14 @@ gw-ip-address={{ gateway_address }}  {{ subnet }}  {%         endfor %}  {%     endif %} -{% endif %} +{%     if client_ip_pool.name is vyos_defined %} +{%         for pool, pool_config in client_ip_pool.name.items() %} +{%             if pool_config.subnet is vyos_defined %} +{{ pool_config.subnet }},name={{ pool }} +{%             endif %} +{%             if pool_config.gateway_address is vyos_defined %} +gw-ip-address={{ pool_config.gateway_address }} +{%             endif %} +{%         endfor %} +{%     endif %} +{% endif %}
\ No newline at end of file diff --git a/data/templates/accel-ppp/pppoe.config.j2 b/data/templates/accel-ppp/pppoe.config.j2 index c536bafa5..811c4ccc0 100644 --- a/data/templates/accel-ppp/pppoe.config.j2 +++ b/data/templates/accel-ppp/pppoe.config.j2 @@ -133,6 +133,19 @@ pado-delay={{ pado_delay_param.value }}  called-sid={{ authentication.radius.called_sid_format }}  {% endif %} +{% if authentication.mode is vyos_defined("local") %} +{%     if client_ip_pool.name is vyos_defined %} +{%         for pool, pool_config in client_ip_pool.name.items() %} +{%             if pool_config.subnet is vyos_defined %} +ip-pool={{ pool }} +{%             endif %} +{%             if pool_config.gateway_address is vyos_defined %} +gw-ip-address={{ pool_config.gateway_address }}/{{ pool_config.subnet.split('/')[1] }} +{%             endif %} +{%         endfor %} +{%     endif %} +{% endif %} +  {% if limits is vyos_defined %}  [connlimit]  {%     if limits.connection_limit is vyos_defined %} diff --git a/interface-definitions/include/accel-ppp/client-ip-pool-name.xml.i b/interface-definitions/include/accel-ppp/client-ip-pool-name.xml.i new file mode 100644 index 000000000..654b6727e --- /dev/null +++ b/interface-definitions/include/accel-ppp/client-ip-pool-name.xml.i @@ -0,0 +1,18 @@ +<!-- include start from accel-ppp/client-ip-pool-name.xml.i --> +<tagNode name="name"> +  <properties> +    <help>Pool name</help> +    <valueHelp> +      <format>txt</format> +      <description>Name of IP pool</description> +    </valueHelp> +    <constraint> +      <regex>[-_a-zA-Z0-9.]+</regex> +    </constraint> +  </properties> +  <children> +    #include <include/accel-ppp/gateway-address.xml.i> +    #include <include/accel-ppp/client-ip-pool-subnet-single.xml.i> +  </children> +</tagNode> +<!-- include end --> diff --git a/interface-definitions/service-ipoe-server.xml.in b/interface-definitions/service-ipoe-server.xml.in index d778f9de0..ca4929249 100644 --- a/interface-definitions/service-ipoe-server.xml.in +++ b/interface-definitions/service-ipoe-server.xml.in @@ -108,22 +108,7 @@                <help>Client IP pools and gateway setting</help>              </properties>              <children> -              <tagNode name="name"> -                <properties> -                  <help>Pool name</help> -                  <valueHelp> -                    <format>txt</format> -                    <description>Name of IP pool</description> -                  </valueHelp> -                  <constraint> -                    <regex>[-_a-zA-Z0-9.]+</regex> -                  </constraint> -                </properties> -                <children> -                  #include <include/accel-ppp/gateway-address.xml.i> -                  #include <include/accel-ppp/client-ip-pool-subnet-single.xml.i> -                </children> -              </tagNode> +              #include <include/accel-ppp/client-ip-pool-name.xml.i>              </children>            </node>            #include <include/accel-ppp/client-ipv6-pool.xml.i> diff --git a/interface-definitions/service-pppoe-server.xml.in b/interface-definitions/service-pppoe-server.xml.in index db8522287..47f60d27d 100644 --- a/interface-definitions/service-pppoe-server.xml.in +++ b/interface-definitions/service-pppoe-server.xml.in @@ -56,6 +56,7 @@              <children>                #include <include/accel-ppp/client-ip-pool-start-stop.xml.i>                #include <include/accel-ppp/client-ip-pool-subnet.xml.i> +              #include <include/accel-ppp/client-ip-pool-name.xml.i>              </children>            </node>            #include <include/accel-ppp/client-ipv6-pool.xml.i> diff --git a/python/vyos/configverify.py b/python/vyos/configverify.py index 8e0ce701e..63edacc81 100644 --- a/python/vyos/configverify.py +++ b/python/vyos/configverify.py @@ -1,4 +1,4 @@ -# Copyright 2020-2022 VyOS maintainers and contributors <maintainers@vyos.io> +# Copyright 2020-2023 VyOS maintainers and contributors <maintainers@vyos.io>  #  # This library is free software; you can redistribute it and/or  # modify it under the terms of the GNU Lesser General Public @@ -23,6 +23,7 @@  from vyos import ConfigError  from vyos.util import dict_search +from vyos.util import dict_search_recursive  def verify_mtu(config):      """ @@ -414,7 +415,17 @@ def verify_accel_ppp_base_service(config, local_users=True):              if 'key' not in radius_config:                  raise ConfigError(f'Missing RADIUS secret key for server "{server}"') -    if 'gateway_address' not in config: +    # Check global gateway or gateway in named pool +    gateway = False +    if 'gateway_address' in config: +        gateway = True +    else: +        if dict_search_recursive(config, 'gateway_address', ['client_ip_pool', 'name']): +            for _, v in config['client_ip_pool']['name'].items(): +                if 'gateway_address' in v: +                    gateway = True +                    break +    if not gateway:          raise ConfigError('Server requires gateway-address to be configured!')      if 'name_server_ipv4' in config: diff --git a/smoketest/scripts/cli/test_service_pppoe-server.py b/smoketest/scripts/cli/test_service_pppoe-server.py index 7546c2e3d..53c14c5b0 100755 --- a/smoketest/scripts/cli/test_service_pppoe-server.py +++ b/smoketest/scripts/cli/test_service_pppoe-server.py @@ -165,6 +165,35 @@ class TestServicePPPoEServer(BasicAccelPPPTest.TestCase):          self.assertEqual(conf['ip-pool']['gw-ip-address'], self._gateway) +    def test_pppoe_server_client_ip_pool_name(self): +        # Test configuration of named client pools +        self.basic_config() + +        subnet = '192.0.2.0/24' +        gateway = '192.0.2.1' +        pool = 'VYOS' + +        subnet_name = f'{subnet},name' +        gw_ip_prefix = f'{gateway}/24' + +        self.set(['client-ip-pool', 'name', pool, 'subnet', subnet]) +        self.set(['client-ip-pool', 'name', pool, 'gateway-address', gateway]) +        self.cli_delete(self._base_path + ['gateway-address']) + +        # commit changes +        self.cli_commit() + +        # Validate configuration values +        conf = ConfigParser(allow_no_value=True, delimiters='=') +        conf.read(self._config_file) + +        # Validate configuration +        self.assertEqual(conf['ip-pool'][subnet_name], pool) +        self.assertEqual(conf['ip-pool']['gw-ip-address'], gateway) +        self.assertEqual(conf['pppoe']['ip-pool'], pool) +        self.assertEqual(conf['pppoe']['gw-ip-address'], gw_ip_prefix) + +      def test_pppoe_server_client_ipv6_pool(self):          # Test configuration of IPv6 client pools          self.basic_config() | 
