diff options
| author | Christian Breunig <christian@breunig.cc> | 2024-03-01 13:22:54 +0100 | 
|---|---|---|
| committer | GitHub <noreply@github.com> | 2024-03-01 13:22:54 +0100 | 
| commit | beb0576b1cb5e09ceb398e465c81cb8c06960391 (patch) | |
| tree | 19efa4228b3a9207f57cf2a88ed55bf724ef2759 /src/migration-scripts | |
| parent | c095867d873a9a7dde038bb751ba26edc66b99f7 (diff) | |
| parent | 867dc9fac1fe5374e0f38a9d30a9f0d9828fc71d (diff) | |
| download | vyos-1x-beb0576b1cb5e09ceb398e465c81cb8c06960391.tar.gz vyos-1x-beb0576b1cb5e09ceb398e465c81cb8c06960391.zip | |
Merge pull request #3061 from sarthurdev/T6079_current
 dhcp-server: T6079: Disable duplicate static-mappings on migration
Diffstat (limited to 'src/migration-scripts')
| -rwxr-xr-x | src/migration-scripts/dhcp-server/6-to-7 | 69 | ||||
| -rwxr-xr-x | src/migration-scripts/dhcp-server/7-to-8 | 66 | ||||
| -rwxr-xr-x | src/migration-scripts/dhcp-server/8-to-9 | 42 | ||||
| -rwxr-xr-x | src/migration-scripts/dhcp-server/9-to-10 | 75 | 
4 files changed, 164 insertions, 88 deletions
| diff --git a/src/migration-scripts/dhcp-server/6-to-7 b/src/migration-scripts/dhcp-server/6-to-7 index ccf385a30..e6c298a60 100755 --- a/src/migration-scripts/dhcp-server/6-to-7 +++ b/src/migration-scripts/dhcp-server/6-to-7 @@ -1,6 +1,6 @@  #!/usr/bin/env python3  # -# Copyright (C) 2023 VyOS maintainers and contributors +# Copyright (C) 2024 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 @@ -14,19 +14,12 @@  # You should have received a copy of the GNU General Public License  # along with this program.  If not, see <http://www.gnu.org/licenses/>. -# T3316: Migrate to Kea -#        - global-parameters will not function -#        - shared-network-parameters will not function -#        - subnet-parameters will not function -#        - static-mapping-parameters will not function -#        - host-decl-name is on by default, option removed -#        - ping-check no longer supported -#        - failover is default enabled on all subnets that exist on failover servers +# T6079: Disable duplicate static mappings  import sys  from vyos.configtree import ConfigTree -if (len(sys.argv) < 2): +if len(sys.argv) < 2:      print("Must specify file name!")      sys.exit(1) @@ -38,46 +31,42 @@ with open(file_name, 'r') as f:  base = ['service', 'dhcp-server']  config = ConfigTree(config_file) -if not config.exists(base): +if not config.exists(base + ['shared-network-name']):      # Nothing to do -    sys.exit(0) +    exit(0) -if config.exists(base + ['host-decl-name']): -    config.delete(base + ['host-decl-name']) +# Run this for every instance if 'shared-network-name' +for network in config.list_nodes(base + ['shared-network-name']): +    base_network = base + ['shared-network-name', network] -if config.exists(base + ['global-parameters']): -    config.delete(base + ['global-parameters']) +    if not config.exists(base_network + ['subnet']): +        continue -if config.exists(base + ['shared-network-name']): -    for network in config.list_nodes(base + ['shared-network-name']): -        base_network = base + ['shared-network-name', network] +    for subnet in config.list_nodes(base_network + ['subnet']): +        base_subnet = base_network + ['subnet', subnet] -        if config.exists(base_network + ['ping-check']): -            config.delete(base_network + ['ping-check']) +        if config.exists(base_subnet + ['static-mapping']): +            used_mac = [] +            used_ip = [] -        if config.exists(base_network + ['shared-network-parameters']): -            config.delete(base_network +['shared-network-parameters']) +            for mapping in config.list_nodes(base_subnet + ['static-mapping']): +                base_mapping = base_subnet + ['static-mapping', mapping] -        if not config.exists(base_network + ['subnet']): -            continue +                if config.exists(base_mapping + ['mac-address']): +                    mac = config.return_value(base_mapping + ['mac-address']) -        # Run this for every specified 'subnet' -        for subnet in config.list_nodes(base_network + ['subnet']): -            base_subnet = base_network + ['subnet', subnet] +                    if mac in used_mac: +                        config.set(base_mapping + ['disable']) +                    else: +                        used_mac.append(mac) -            if config.exists(base_subnet + ['enable-failover']): -                config.delete(base_subnet + ['enable-failover']) +                if config.exists(base_mapping + ['ip-address']): +                    ip = config.return_value(base_mapping + ['ip-address']) -            if config.exists(base_subnet + ['ping-check']): -                config.delete(base_subnet + ['ping-check']) - -            if config.exists(base_subnet + ['subnet-parameters']): -                config.delete(base_subnet + ['subnet-parameters']) - -            if config.exists(base_subnet + ['static-mapping']): -                for mapping in config.list_nodes(base_subnet + ['static-mapping']): -                    if config.exists(base_subnet + ['static-mapping', mapping, 'static-mapping-parameters']): -                        config.delete(base_subnet + ['static-mapping', mapping, 'static-mapping-parameters']) +                    if ip in used_ip: +                        config.set(base_subnet + ['static-mapping', mapping, 'disable']) +                    else: +                        used_ip.append(ip)  try:      with open(file_name, 'w') as f: diff --git a/src/migration-scripts/dhcp-server/7-to-8 b/src/migration-scripts/dhcp-server/7-to-8 index 151aa6d7b..ccf385a30 100755 --- a/src/migration-scripts/dhcp-server/7-to-8 +++ b/src/migration-scripts/dhcp-server/7-to-8 @@ -14,16 +14,19 @@  # You should have received a copy of the GNU General Public License  # along with this program.  If not, see <http://www.gnu.org/licenses/>. -# T3316: -# - Adjust hostname to have valid FQDN characters only (underscores aren't allowed anymore) -# - Rename "service dhcp-server shared-network-name ... static-mapping <hostname> mac-address ..." -#       to "service dhcp-server shared-network-name ... static-mapping <hostname> mac ..." +# T3316: Migrate to Kea +#        - global-parameters will not function +#        - shared-network-parameters will not function +#        - subnet-parameters will not function +#        - static-mapping-parameters will not function +#        - host-decl-name is on by default, option removed +#        - ping-check no longer supported +#        - failover is default enabled on all subnets that exist on failover servers  import sys -import re  from vyos.configtree import ConfigTree -if len(sys.argv) < 2: +if (len(sys.argv) < 2):      print("Must specify file name!")      sys.exit(1) @@ -32,30 +35,49 @@ file_name = sys.argv[1]  with open(file_name, 'r') as f:      config_file = f.read() -base = ['service', 'dhcp-server', 'shared-network-name'] +base = ['service', 'dhcp-server']  config = ConfigTree(config_file)  if not config.exists(base):      # Nothing to do      sys.exit(0) -for network in config.list_nodes(base): -    # Run this for every specified 'subnet' -    if config.exists(base + [network, 'subnet']): -        for subnet in config.list_nodes(base + [network, 'subnet']): -            base_subnet = base + [network, 'subnet', subnet] -            if config.exists(base_subnet + ['static-mapping']): -                for hostname in config.list_nodes(base_subnet + ['static-mapping']): -                    base_mapping = base_subnet + ['static-mapping', hostname] +if config.exists(base + ['host-decl-name']): +    config.delete(base + ['host-decl-name']) + +if config.exists(base + ['global-parameters']): +    config.delete(base + ['global-parameters']) + +if config.exists(base + ['shared-network-name']): +    for network in config.list_nodes(base + ['shared-network-name']): +        base_network = base + ['shared-network-name', network] + +        if config.exists(base_network + ['ping-check']): +            config.delete(base_network + ['ping-check']) + +        if config.exists(base_network + ['shared-network-parameters']): +            config.delete(base_network +['shared-network-parameters']) -                    # Rename the 'mac-address' node to 'mac' -                    if config.exists(base_mapping + ['mac-address']): -                        config.rename(base_mapping + ['mac-address'], 'mac') +        if not config.exists(base_network + ['subnet']): +            continue -                    # Adjust hostname to have valid FQDN characters only -                    new_hostname = re.sub(r'[^a-zA-Z0-9-.]', '-', hostname) -                    if new_hostname != hostname: -                        config.rename(base_mapping, new_hostname) +        # Run this for every specified 'subnet' +        for subnet in config.list_nodes(base_network + ['subnet']): +            base_subnet = base_network + ['subnet', subnet] + +            if config.exists(base_subnet + ['enable-failover']): +                config.delete(base_subnet + ['enable-failover']) + +            if config.exists(base_subnet + ['ping-check']): +                config.delete(base_subnet + ['ping-check']) + +            if config.exists(base_subnet + ['subnet-parameters']): +                config.delete(base_subnet + ['subnet-parameters']) + +            if config.exists(base_subnet + ['static-mapping']): +                for mapping in config.list_nodes(base_subnet + ['static-mapping']): +                    if config.exists(base_subnet + ['static-mapping', mapping, 'static-mapping-parameters']): +                        config.delete(base_subnet + ['static-mapping', mapping, 'static-mapping-parameters'])  try:      with open(file_name, 'w') as f: diff --git a/src/migration-scripts/dhcp-server/8-to-9 b/src/migration-scripts/dhcp-server/8-to-9 index 810e403a6..151aa6d7b 100755 --- a/src/migration-scripts/dhcp-server/8-to-9 +++ b/src/migration-scripts/dhcp-server/8-to-9 @@ -1,6 +1,6 @@  #!/usr/bin/env python3  # -# Copyright (C) 2024 VyOS maintainers and contributors +# 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 @@ -15,8 +15,9 @@  # along with this program.  If not, see <http://www.gnu.org/licenses/>.  # T3316: -# - Migrate dhcp options under new option node -# - Add subnet IDs to existing subnets +# - Adjust hostname to have valid FQDN characters only (underscores aren't allowed anymore) +# - Rename "service dhcp-server shared-network-name ... static-mapping <hostname> mac-address ..." +#       to "service dhcp-server shared-network-name ... static-mapping <hostname> mac ..."  import sys  import re @@ -38,34 +39,23 @@ if not config.exists(base):      # Nothing to do      sys.exit(0) -option_nodes = ['bootfile-name', 'bootfile-server', 'bootfile-size', 'captive-portal', -                'client-prefix-length', 'default-router', 'domain-name', 'domain-search', -                'name-server', 'ip-forwarding', 'ipv6-only-preferred', 'ntp-server', -                'pop-server', 'server-identifier', 'smtp-server', 'static-route', -                'tftp-server-name', 'time-offset', 'time-server', 'time-zone', -                'vendor-option', 'wins-server', 'wpad-url'] - -subnet_id = 1 -  for network in config.list_nodes(base): -    for option in option_nodes: -        if config.exists(base + [network, option]): -            config.set(base + [network, 'option']) -            config.copy(base + [network, option], base + [network, 'option', option]) -            config.delete(base + [network, option]) - +    # Run this for every specified 'subnet'      if config.exists(base + [network, 'subnet']):          for subnet in config.list_nodes(base + [network, 'subnet']):              base_subnet = base + [network, 'subnet', subnet] -             -            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]) +            if config.exists(base_subnet + ['static-mapping']): +                for hostname in config.list_nodes(base_subnet + ['static-mapping']): +                    base_mapping = base_subnet + ['static-mapping', hostname] + +                    # Rename the 'mac-address' node to 'mac' +                    if config.exists(base_mapping + ['mac-address']): +                        config.rename(base_mapping + ['mac-address'], 'mac') -            config.set(base_subnet + ['subnet-id'], value=subnet_id) -            subnet_id += 1 +                    # Adjust hostname to have valid FQDN characters only +                    new_hostname = re.sub(r'[^a-zA-Z0-9-.]', '-', hostname) +                    if new_hostname != hostname: +                        config.rename(base_mapping, new_hostname)  try:      with open(file_name, 'w') as f: diff --git a/src/migration-scripts/dhcp-server/9-to-10 b/src/migration-scripts/dhcp-server/9-to-10 new file mode 100755 index 000000000..810e403a6 --- /dev/null +++ b/src/migration-scripts/dhcp-server/9-to-10 @@ -0,0 +1,75 @@ +#!/usr/bin/env python3 +# +# Copyright (C) 2024 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/>. + +# T3316: +# - Migrate dhcp options under new option node +# - Add subnet IDs to existing subnets + +import sys +import re +from vyos.configtree import ConfigTree + +if len(sys.argv) < 2: +    print("Must specify file name!") +    sys.exit(1) + +file_name = sys.argv[1] + +with open(file_name, 'r') as f: +    config_file = f.read() + +base = ['service', 'dhcp-server', 'shared-network-name'] +config = ConfigTree(config_file) + +if not config.exists(base): +    # Nothing to do +    sys.exit(0) + +option_nodes = ['bootfile-name', 'bootfile-server', 'bootfile-size', 'captive-portal', +                'client-prefix-length', 'default-router', 'domain-name', 'domain-search', +                'name-server', 'ip-forwarding', 'ipv6-only-preferred', 'ntp-server', +                'pop-server', 'server-identifier', 'smtp-server', 'static-route', +                'tftp-server-name', 'time-offset', 'time-server', 'time-zone', +                'vendor-option', 'wins-server', 'wpad-url'] + +subnet_id = 1 + +for network in config.list_nodes(base): +    for option in option_nodes: +        if config.exists(base + [network, option]): +            config.set(base + [network, 'option']) +            config.copy(base + [network, option], base + [network, 'option', option]) +            config.delete(base + [network, option]) + +    if config.exists(base + [network, 'subnet']): +        for subnet in config.list_nodes(base + [network, 'subnet']): +            base_subnet = base + [network, 'subnet', subnet] +             +            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 + +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)) +    exit(1) | 
