#!/usr/bin/env python3 # # Copyright (C) 2021 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/>. # - T2450: drop interface-route and interface-route6 from "protocols vrf" from sys import argv from sys import exit from vyos.configtree import ConfigTree if len(argv) < 2: print("Must specify file name!") exit(1) file_name = argv[1] with open(file_name, 'r') as f: config_file = f.read() base = ['protocols', 'vrf'] config = ConfigTree(config_file) if not config.exists(base): # Nothing to do exit(0) for vrf in config.list_nodes(base): static_base = base + [vrf, 'static'] if not config.exists(static_base): continue # # Migrate interface-route into route # interface_route_path = static_base + ['interface-route'] if config.exists(interface_route_path): for route in config.list_nodes(interface_route_path): interface = config.list_nodes(interface_route_path + [route, 'next-hop-interface']) tmp = interface_route_path + [route, 'next-hop-interface'] for interface in config.list_nodes(tmp): new_base = static_base + ['route', route, 'interface'] config.set(new_base) config.set_tag(new_base) config.copy(tmp + [interface], new_base + [interface]) config.delete(interface_route_path) # # Migrate interface-route6 into route6 # interface_route_path = static_base + ['interface-route6'] if config.exists(interface_route_path): for route in config.list_nodes(interface_route_path): interface = config.list_nodes(interface_route_path + [route, 'next-hop-interface']) tmp = interface_route_path + [route, 'next-hop-interface'] for interface in config.list_nodes(tmp): new_base = static_base + ['route6', route, 'interface'] config.set(new_base) config.set_tag(new_base) config.copy(tmp + [interface], new_base + [interface]) config.delete(interface_route_path) # # Cleanup nodes inside route # route_path = static_base + ['route'] if config.exists(route_path): for route in config.list_nodes(route_path): next_hop = route_path + [route, 'next-hop'] if config.exists(next_hop): for gateway in config.list_nodes(next_hop): interface_path = next_hop + [gateway, 'next-hop-interface'] if config.exists(interface_path): config.rename(interface_path, 'interface') vrf_path = next_hop + [gateway, 'next-hop-vrf'] if config.exists(vrf_path): config.rename(vrf_path, 'vrf') next_hop = route_path + [route, 'interface'] if config.exists(next_hop): for interface in config.list_nodes(next_hop): interface_path = next_hop + [interface, 'next-hop-interface'] if config.exists(interface_path): config.rename(interface_path, 'interface') vrf_path = next_hop + [interface, 'next-hop-vrf'] if config.exists(vrf_path): config.rename(vrf_path, 'vrf') # # Cleanup nodes inside route6 # route_path = static_base + ['route6'] if config.exists(route_path): for route in config.list_nodes(route_path): next_hop = route_path + [route, 'next-hop'] if config.exists(next_hop): for gateway in config.list_nodes(next_hop): vrf_path = next_hop + [gateway, 'next-hop-vrf'] if config.exists(vrf_path): config.rename(vrf_path, 'vrf') next_hop = route_path + [route, 'interface'] if config.exists(next_hop): for interface in config.list_nodes(next_hop): interface_path = next_hop + [interface, 'next-hop-interface'] if config.exists(interface_path): config.rename(interface_path, 'interface') vrf_path = next_hop + [interface, 'next-hop-vrf'] if config.exists(vrf_path): config.rename(vrf_path, 'vrf') 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)