diff --git a/smoketest/configs/basic-vyos b/smoketest/configs/basic-vyos index c42f14841..76aa52039 100644 --- a/smoketest/configs/basic-vyos +++ b/smoketest/configs/basic-vyos @@ -1,205 +1,224 @@ interfaces { ethernet eth0 { address 192.168.0.1/24 address fe88::1/56 duplex auto smp-affinity auto speed auto } ethernet eth1 { duplex auto smp-affinity auto speed auto } ethernet eth2 { duplex auto smp-affinity auto speed auto vif 100 { address 100.100.0.1/24 } vif-s 200 { address 100.64.200.254/24 vif-c 201 { address 100.64.201.254/24 + address fe89::1/56 } vif-c 202 { address 100.64.202.254/24 } } } loopback lo { } } protocols { static { arp 192.168.0.20 { hwaddr 00:50:00:00:00:20 } arp 192.168.0.30 { hwaddr 00:50:00:00:00:30 } arp 192.168.0.40 { hwaddr 00:50:00:00:00:40 } arp 100.100.0.2 { hwaddr 00:50:00:00:02:02 } arp 100.100.0.3 { hwaddr 00:50:00:00:02:03 } arp 100.100.0.4 { hwaddr 00:50:00:00:02:04 } arp 100.64.200.1 { hwaddr 00:50:00:00:00:01 } arp 100.64.200.2 { hwaddr 00:50:00:00:00:02 } arp 100.64.201.10 { hwaddr 00:50:00:00:00:10 } arp 100.64.201.20 { hwaddr 00:50:00:00:00:20 } arp 100.64.202.30 { hwaddr 00:50:00:00:00:30 } arp 100.64.202.40 { hwaddr 00:50:00:00:00:40 } route 0.0.0.0/0 { next-hop 100.64.0.1 { } } } } service { dhcp-server { shared-network-name LAN { authoritative subnet 192.168.0.0/24 { default-router 192.168.0.1 dns-server 192.168.0.1 domain-name vyos.net domain-search vyos.net range LANDynamic { start 192.168.0.20 stop 192.168.0.240 } } } } dhcpv6-server { shared-network-name LAN6 { subnet fe88::/56 { address-range { prefix fe88::/60 { temporary } start fe88:0000:0000:fe:: { stop fe88:0000:0000:ff:: } } domain-search vyos.net name-server fe88::1 prefix-delegation { start fe88:0000:0000:0001:: { prefix-length 64 stop fe88:0000:0000:0010:: } } } + subnet fe89::/56 { + address-range { + prefix fe89::/60 { + temporary + } + start fe89:0000:0000:fe:: { + stop fe89:0000:0000:ff:: + } + } + domain-search vyos.net + name-server fe89::1 + prefix-delegation { + start fe89:0000:0000:0001:: { + prefix-length 64 + stop fe89:0000:0000:0010:: + } + } + } } } dns { forwarding { allow-from 192.168.0.0/16 cache-size 10000 dnssec off listen-address 192.168.0.1 } } ssh { ciphers aes128-ctr,aes192-ctr,aes256-ctr ciphers chacha20-poly1305@openssh.com,rijndael-cbc@lysator.liu.se listen-address 192.168.0.1 key-exchange curve25519-sha256@libssh.org key-exchange diffie-hellman-group1-sha1,diffie-hellman-group-exchange-sha1,diffie-hellman-group-exchange-sha256 port 22 } } system { config-management { commit-revisions 100 } console { device ttyS0 { speed 115200 } } conntrack { ignore { rule 1 { destination { address 192.0.2.2 } source { address 192.0.2.1 } } } } host-name vyos login { user vyos { authentication { encrypted-password $6$O5gJRlDYQpj$MtrCV9lxMnZPMbcxlU7.FI793MImNHznxGoMFgm3Q6QP3vfKJyOSRCt3Ka/GzFQyW1yZS4NS616NLHaIPPFHc0 plaintext-password "" } } } name-server 192.168.0.1 syslog { console { facility all { level emerg } facility mail { level info } } global { facility all { level info } facility protocols { level debug } facility security { level info } preserve-fqdn } host syslog.vyos.net { facility local7 { level notice } facility protocols { level alert } facility security { level warning } format { octet-counted } port 8000 } } time-zone Europe/Berlin } /* Warning: Do not remove the following line. */ /* === vyatta-config-version: "broadcast-relay@1:cluster@1:config-management@1:conntrack-sync@1:conntrack@1:dhcp-relay@2:dhcp-server@5:dns-forwarding@1:firewall@5:ipsec@5:l2tp@1:mdns@1:nat@4:ntp@1:pptp@1:qos@1:quagga@6:snmp@1:ssh@1:system@9:vrrp@2:wanloadbalance@3:webgui@1:webproxy@1:webproxy@2:zone-policy@1" === */ /* Release version: 1.2.6 */ diff --git a/src/migration-scripts/dhcpv6-server/4-to-5 b/src/migration-scripts/dhcpv6-server/4-to-5 index e808edbe0..ae506b9c5 100755 --- a/src/migration-scripts/dhcpv6-server/4-to-5 +++ b/src/migration-scripts/dhcpv6-server/4-to-5 @@ -1,68 +1,88 @@ #!/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/>. # T5993: Check if subnet is locally accessible and assign interface to subnet import sys from ipaddress import ip_network 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() base = ['service', 'dhcpv6-server', 'shared-network-name'] config = ConfigTree(config_file) if not config.exists(base): # Nothing to do exit(0) def find_subnet_interface(subnet): subnet_net = ip_network(subnet) + def check_addr(if_path): + if config.exists(if_path + ['address']): + for addr in config.return_values(if_path + ['address']): + if ip_network(addr, strict=False) == subnet_net: + return True + return None + for iftype in config.list_nodes(['interfaces']): for ifname in config.list_nodes(['interfaces', iftype]): if_base = ['interfaces', iftype, ifname] - if config.exists(if_base + ['address']): - for addr in config.return_values(if_base + ['address']): - if ip_network(addr, strict=False) == subnet_net: - return ifname + if check_addr(if_base): + return ifname + + if config.exists(if_base + ['vif']): + for vif in config.list_nodes(if_base + ['vif']): + if check_addr(if_base + ['vif', vif]): + return f'{ifname}.{vif}' + + if config.exists(if_base + ['vif-s']): + for vifs in config.list_nodes(if_base + ['vif-s']): + if check_addr(if_base + ['vif-s', vifs]): + return f'{ifname}.{vifs}' + + if config.exists(if_base + ['vif-s', vifs, 'vif-c']): + for vifc in config.list_nodes(if_base + ['vif-s', vifs, 'vif-c']): + if check_addr(if_base + ['vif-s', vifs, 'vif-c', vifc]): + return f'{ifname}.{vifs}.{vifc}' return False for network in config.list_nodes(base): if not config.exists(base + [network, 'subnet']): continue for subnet in config.list_nodes(base + [network, 'subnet']): subnet_interface = find_subnet_interface(subnet) if subnet_interface: config.set(base + [network, 'subnet', subnet, 'interface'], value=subnet_interface) 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)