diff options
Diffstat (limited to 'src')
| -rwxr-xr-x | src/conf_mode/dns_forwarding.py | 25 | ||||
| -rwxr-xr-x | src/migration-scripts/dns-forwarding/3-to-4 | 49 | ||||
| -rwxr-xr-x | src/services/vyos-hostsd | 2 | 
3 files changed, 71 insertions, 5 deletions
diff --git a/src/conf_mode/dns_forwarding.py b/src/conf_mode/dns_forwarding.py index 4d6b85d92..36c1098fe 100755 --- a/src/conf_mode/dns_forwarding.py +++ b/src/conf_mode/dns_forwarding.py @@ -59,6 +59,7 @@ def get_config(config=None):      # T2665 due to how defaults under tag nodes work, we must clear these out before we merge      del default_values['authoritative_domain']      del default_values['name_server'] +    del default_values['domain']['name_server']      dns = dict_merge(default_values, dns)      # T2665: we cleared default values for tag node 'name_server' above. @@ -68,6 +69,15 @@ def get_config(config=None):          for server in dns['name_server']:              dns['name_server'][server] = dict_merge(default_values, dns['name_server'][server]) +    # T2665: we cleared default values for tag node 'domain' above. +    # We now need to add them back back in a granular way. +    if 'domain' in dns: +        default_values = defaults(base + ['domain', 'name-server']) +        for domain in dns['domain'].keys(): +            for server in dns['domain'][domain]['name_server']: +                dns['domain'][domain]['name_server'][server] = dict_merge( +                    default_values, dns['domain'][domain]['name_server'][server]) +      # some additions to the default dictionary      if 'system' in dns:          base_nameservers = ['system', 'name-server'] @@ -271,7 +281,7 @@ def verify(dns):      # as a domain will contains dot's which is out dictionary delimiter.      if 'domain' in dns:          for domain in dns['domain']: -            if 'server' not in dns['domain'][domain]: +            if 'name_server' not in dns['domain'][domain]:                  raise ConfigError(f'No server configured for domain {domain}!')      if 'dns64_prefix' in dns: @@ -337,9 +347,9 @@ def apply(dns):          # sources          hc.delete_name_servers([hostsd_tag])          if 'name_server' in dns: -            # 'name_server' is a dict of the form +            # 'name_server' is of the form              # {'192.0.2.1': {'port': 53}, '2001:db8::1': {'port': 853}, ...} -            # canonicalize them as ['192.0.2.1:53', '[2001:db8::1]:853', ...] with IPv6 hosts bracketized +            # canonicalize them as ['192.0.2.1:53', '[2001:db8::1]:853', ...]              nslist = [(lambda h, p: f"{bracketize_ipv6(h)}:{p['port']}")(h, p)                        for (h, p) in dns['name_server'].items()]              hc.add_name_servers({hostsd_tag: nslist}) @@ -371,7 +381,14 @@ def apply(dns):          # the list and keys() are required as get returns a dict, not list          hc.delete_forward_zones(list(hc.get_forward_zones().keys()))          if 'domain' in dns: -            hc.add_forward_zones(dns['domain']) +            zones = dns['domain'] +            for domain in zones.keys(): +                # 'name_server' is of the form +                # {'192.0.2.1': {'port': 53}, '2001:db8::1': {'port': 853}, ...} +                # canonicalize them as ['192.0.2.1:53', '[2001:db8::1]:853', ...] +                zones[domain]['name_server'] = [(lambda h, p: f"{bracketize_ipv6(h)}:{p['port']}")(h, p) +                                                for (h, p) in zones[domain]['name_server'].items()] +            hc.add_forward_zones(zones)          # hostsd generates NTAs for the authoritative zones          # the list and keys() are required as get returns a dict, not list diff --git a/src/migration-scripts/dns-forwarding/3-to-4 b/src/migration-scripts/dns-forwarding/3-to-4 new file mode 100755 index 000000000..55165c2c5 --- /dev/null +++ b/src/migration-scripts/dns-forwarding/3-to-4 @@ -0,0 +1,49 @@ +#!/usr/bin/env python3 + +# Copyright (C) 2023 VyOS maintainers and contributors +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License version 2 or later as +# published by the Free Software Foundation. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program.  If not, see <http://www.gnu.org/licenses/>. + +# T5115: migrate "service dns forwarding domain example.com server" to +#                "service dns forwarding domain example.com name-server" + +import sys +from vyos.configtree import ConfigTree + +if (len(sys.argv) < 1): +    print("Must specify file name!") +    sys.exit(1) + +file_name = sys.argv[1] + +with open(file_name, 'r') as f: +    config_file = f.read() + +config = ConfigTree(config_file) + +base = ['service', 'dns', 'forwarding', 'domain'] +if not config.exists(base): +    # Nothing to do +    sys.exit(0) + +for domain in config.list_nodes(base): +    if config.exists(base + [domain, 'server']): +        config.copy(base + [domain, 'server'], base + [domain, 'name-server']) +        config.delete(base + [domain, 'server']) + +try: +    with open(file_name, 'w') as f: +        f.write(config.to_string()) +except OSError as e: +    print("Failed to save the modified config: {}".format(e)) +    sys.exit(1) diff --git a/src/services/vyos-hostsd b/src/services/vyos-hostsd index a380f2e66..894f9e24d 100755 --- a/src/services/vyos-hostsd +++ b/src/services/vyos-hostsd @@ -329,7 +329,7 @@ tag_regex_schema = op_type_schema.extend({  forward_zone_add_schema = op_type_schema.extend({      'data': {          str: { -            'server': [str], +            'name_server': [str],              'addnta': Any({}, None),              'recursion_desired': Any({}, None),              }  | 
