diff options
| author | Viacheslav Hletenko <v.gletenko@vyos.io> | 2026-07-02 17:23:21 +0300 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2026-07-02 17:23:21 +0300 |
| commit | bf64dbd6a2fc006e29814cda59cfac6506978b44 (patch) | |
| tree | d4655b06e0c9976a5ecdeae87205e944e098c7b9 | |
| parent | 063e007a5a8eac3bb9ad101206dc94734eeaa595 (diff) | |
| parent | 0d3ac22b95cef90e7c54ef823c00bb59b935c158 (diff) | |
| download | vyos-1x-bf64dbd6a2fc006e29814cda59cfac6506978b44.tar.gz vyos-1x-bf64dbd6a2fc006e29814cda59cfac6506978b44.zip | |
Merge pull request #5167 from davi2367/zbf-vrf
firewall: T8761: Reintroduce VRF-interface names in generated config
23 files changed, 288 insertions, 28 deletions
diff --git a/data/config-mode-dependencies/vyos-1x.json b/data/config-mode-dependencies/vyos-1x.json index 6b9cc0e42..24118a02b 100644 --- a/data/config-mode-dependencies/vyos-1x.json +++ b/data/config-mode-dependencies/vyos-1x.json @@ -9,41 +9,71 @@ }, "interfaces_bonding": { "ethernet": ["interfaces_ethernet"], + "firewall": ["firewall"], "static_arp": ["protocols_static_arp"] }, "interfaces_bridge": { "vxlan": ["interfaces_vxlan"], "wlan": ["interfaces_wireless"], + "firewall": ["firewall"], "static_arp": ["protocols_static_arp"] }, + "interfaces_dummy": { + "firewall": ["firewall"] + }, "interfaces_ethernet": { + "firewall": ["firewall"], "static_arp": ["protocols_static_arp"] }, "interfaces_geneve": { + "firewall": ["firewall"], "static_arp": ["protocols_static_arp"] }, "interfaces_l2tpv3": { + "firewall": ["firewall"], "static_arp": ["protocols_static_arp"] }, "interfaces_macsec": { + "firewall": ["firewall"], "static_arp": ["protocols_static_arp"] }, + "interfaces_openvpn": { + "firewall": ["firewall"] + }, + "interfaces_pppoe": { + "firewall": ["firewall"] + }, "interfaces_pseudo_ethernet": { + "firewall": ["firewall"], "static_arp": ["protocols_static_arp"] }, + "interfaces_sstpc": { + "firewall": ["firewall"] + }, + "interfaces_tunnel": { + "firewall": ["firewall"] + }, "interfaces_virtual_ethernet": { + "firewall": ["firewall"], "static_arp": ["protocols_static_arp"] }, + "interfaces_vti": { + "firewall": ["firewall"] + }, "interfaces_vxlan": { + "firewall": ["firewall"], "static_arp": ["protocols_static_arp"] }, "interfaces_wireless": { + "firewall": ["firewall"], "static_arp": ["protocols_static_arp"] }, "interfaces_wwan": { + "firewall": ["firewall"], "static_arp": ["protocols_static_arp"] }, "interfaces_wireguard": { + "firewall": ["firewall"], "vxlan": ["interfaces_vxlan"] }, "load_balancing_wan": { diff --git a/data/templates/firewall/nftables-zone.j2 b/data/templates/firewall/nftables-zone.j2 index 7b4128082..45804c9d1 100644 --- a/data/templates/firewall/nftables-zone.j2 +++ b/data/templates/firewall/nftables-zone.j2 @@ -9,9 +9,14 @@ {% for zone_name, zone_conf in zone.items() %} {% if 'local_zone' not in zone_conf %} {% if 'interface' in zone_conf.member %} - oifname { {{ zone_conf.member.interface | quoted_join(',') }} } counter jump VZONE_{{ zone_name }} + oifname { {{ zone_conf.member.interface | quoted_join(",") }} } counter jump VZONE_{{ zone_name }} {% endif %} {% if 'vrf' in zone_conf.member %} +{% for vrf_name in zone_conf.member.vrf %} +{% if zone_conf.vrf_interfaces[vrf_name] | length > 0 %} + oifname { {{ zone_conf.vrf_interfaces[vrf_name] | quoted_join(",") }} } counter jump VZONE_{{ zone_name }} +{% endif %} +{% endfor %} oifname { {{ zone_conf.member.vrf | quoted_join(",") }} } counter jump VZONE_{{ zone_name }} {% endif %} {% endif %} @@ -71,6 +76,12 @@ oifname { {{ zone[from_zone].member.interface | quoted_join(",") }} } counter return {% endif %} {% if 'vrf' in zone[from_zone].member %} +{% for vrf_name in zone[from_zone].member.vrf %} +{% if zone[from_zone]['vrf_interfaces'][vrf_name] | length > 0 %} + oifname { {{ zone[from_zone].vrf_interfaces[vrf_name] | quoted_join(",") }} } counter jump NAME{{ suffix }}_{{ from_conf.firewall[fw_name] }} + oifname { {{ zone[from_zone].vrf_interfaces[vrf_name] | quoted_join(",") }} } counter return +{% endif %} +{% endfor %} oifname { {{ zone[from_zone].member.vrf | quoted_join(",") }} } counter jump NAME{{ suffix }}_{{ from_conf.firewall[fw_name] }} oifname { {{ zone[from_zone].member.vrf | quoted_join(",") }} } counter return {% endif %} @@ -84,9 +95,13 @@ {% endif %} {% if 'vrf' in zone[from_zone].member %} {% for vrf_name in zone[from_zone].member.vrf %} - oifname { "{{ zone[from_zone]['vrf_interfaces'][vrf_name] }}" } counter jump NAME{{ suffix }}_{{ from_conf[fw_name] }} - oifname { "{{ zone[from_zone]['vrf_interfaces'][vrf_name] }}" } counter return +{% if zone[from_zone]['vrf_interfaces'][vrf_name] | length > 0 %} + oifname { {{ zone[from_zone].vrf_interfaces[vrf_name] | quoted_join(",") }} } counter jump NAME{{ suffix }}_{{ from_conf[fw_name] }} + oifname { {{ zone[from_zone].vrf_interfaces[vrf_name] | quoted_join(",") }} } counter return +{% endif %} {% endfor %} + oifname { {{ zone[from_zone].member.vrf | quoted_join(",") }} } counter jump NAME{{ suffix }}_{{ from_conf.firewall[fw_name] }} + oifname { {{ zone[from_zone].member.vrf | quoted_join(",") }} } counter return {% endif %} {% endfor %} {% endif %} diff --git a/python/vyos/configdict.py b/python/vyos/configdict.py index e721942ca..1a3165a8f 100644 --- a/python/vyos/configdict.py +++ b/python/vyos/configdict.py @@ -19,6 +19,7 @@ A library for retrieving value dicts from VyOS configs in a declarative fashion. import os import json +from vyos.config import Config from vyos.utils.dict import dict_search from vyos.utils.process import cmd @@ -300,6 +301,34 @@ def has_vrf_configured(conf, intf): conf.set_level(old_level) return ret +def is_vrf_changed(conf : Config, intf) -> bool: + """ + Checks if interface has a VRF changed. + + Returns True if interface has VRF changed, False if it doesn't. + """ + from vyos.ifconfig import Section + + # set default path for this interface + intfpath = ['interfaces', Section.section(intf), intf] + + # Check top-level interface + if is_node_changed(conf, intfpath + ['vrf']): + return True + + # check sub interfaces + for vif in conf.list_nodes(intfpath + ['vif']): + if is_node_changed(conf, intfpath + ['vif', vif, 'vrf']): + return True + for vif_s in conf.list_nodes(intfpath + ['vif-s']): + if is_node_changed(conf, intfpath + ['vif-s', vif_s, 'vrf']): + return True + for vif_c in conf.list_nodes(intfpath + ['vif-s', vif_s, 'vif-c']): + if is_node_changed(conf, intfpath + ['vif-s', vif_s, 'vif-c', vif_c, 'vrf']): + return True + + return False + def has_vlan_subinterface_configured(conf, intf): """ Checks if interface has an VLAN subinterface configured. diff --git a/smoketest/scripts/cli/test_firewall.py b/smoketest/scripts/cli/test_firewall.py index baafc9d6e..928a4e72b 100755 --- a/smoketest/scripts/cli/test_firewall.py +++ b/smoketest/scripts/cli/test_firewall.py @@ -1150,8 +1150,13 @@ class TestFirewall(VyOSUnitTestSHIM.TestCase): self.cli_set(['vrf', 'name', 'VRF-1', 'table', '101']) self.cli_set(['vrf', 'name', 'VRF-2', 'table', '102']) self.cli_set(['interfaces', 'ethernet', 'eth0', 'vrf', 'VRF-1']) - self.cli_set(['interfaces', 'vti', 'vti1', 'vrf', 'VRF-2']) + self.cli_set(['interfaces', 'ethernet', 'eth0', 'vif', '10', 'vrf', 'VRF-1']) + self.cli_set(['interfaces', 'ethernet', 'eth3', 'vif-s', '10', 'vrf', 'VRF-1']) + self.cli_set(['interfaces', 'ethernet', 'eth3', 'vif-s', '20', 'vif-c', '30', 'vrf', 'VRF-1']) + self.cli_set(['interfaces', 'vti', 'vti1', 'vrf', 'VRF-1']) + self.cli_set(['interfaces', 'vti', 'vti2', 'vrf', 'VRF-2']) + # commit the config self.cli_commit() nftables_search = [ @@ -1162,8 +1167,10 @@ class TestFirewall(VyOSUnitTestSHIM.TestCase): ['chain VYOS_ZONE_FORWARD'], ['type filter hook forward priority filter + 1'], ['oifname { "eth1", "eth2" }', 'counter packets', 'jump VZONE_ZONE1'], + ['oifname { "eth0", "vti1", "eth0.10", "eth3.10", "eth3.20.30" }', 'counter packets', 'jump VZONE_ZONE1'], ['oifname "VRF-1"', 'counter packets', 'jump VZONE_ZONE1'], ['oifname "vtun66"', 'counter packets', 'jump VZONE_ZONE2'], + ['oifname "vti2"', 'counter packets', 'jump VZONE_ZONE2'], ['oifname "VRF-2"', 'counter packets', 'jump VZONE_ZONE2'], ['chain VYOS_ZONE_LOCAL'], ['type filter hook input priority filter + 1'], @@ -1197,8 +1204,10 @@ class TestFirewall(VyOSUnitTestSHIM.TestCase): ['chain VYOS_ZONE_FORWARD'], ['type filter hook forward priority filter + 1'], ['oifname { "eth1", "eth2" }', 'counter packets', 'jump VZONE_ZONE1'], + ['oifname { "eth0", "vti1", "eth0.10", "eth3.10", "eth3.20.30" }', 'counter packets', 'jump VZONE_ZONE1'], ['oifname "VRF-1"', 'counter packets', 'jump VZONE_ZONE1'], ['oifname "vtun66"', 'counter packets', 'jump VZONE_ZONE2'], + ['oifname "vti2"', 'counter packets', 'jump VZONE_ZONE2'], ['oifname "VRF-2"', 'counter packets', 'jump VZONE_ZONE2'], ['chain VYOS_ZONE_LOCAL'], ['type filter hook input priority filter + 1'], @@ -1210,6 +1219,7 @@ class TestFirewall(VyOSUnitTestSHIM.TestCase): ['counter packets', 'drop', 'comment "zone_LOCAL default-action drop"'], ['chain VZONE_LOCAL_OUT'], ['oifname "vtun66"', 'counter packets', 'jump NAME6_LOCAL_to_ZONE2_v6'], + ['oifname "vti2"', 'counter packets', 'jump NAME6_LOCAL_to_ZONE2_v6'], ['oifname "VRF-2"', 'counter packets', 'jump NAME6_LOCAL_to_ZONE2_v6'], ['counter packets', 'drop', 'comment "zone_LOCAL default-action drop"'], ['chain VZONE_ZONE1'], @@ -1225,6 +1235,29 @@ class TestFirewall(VyOSUnitTestSHIM.TestCase): self.verify_nftables(nftables_search, 'ip vyos_filter') self.verify_nftables(nftables_search_v6, 'ip6 vyos_filter') + # change memberships in vrf plus delete and add subifs + self.cli_set(['interfaces', 'vti', 'vti1', 'vrf', 'VRF-2']) + self.cli_delete(['interfaces', 'ethernet', 'eth0', 'vif', '10']) + self.cli_delete(['interfaces', 'ethernet', 'eth3', 'vif-s', '10']) + self.cli_delete(['interfaces', 'ethernet', 'eth3', 'vif-s', '20', 'vif-c', '30']) + self.cli_set(['interfaces', 'ethernet', 'eth0', 'vif', '20', 'vrf', 'VRF-1']) + self.cli_set(['interfaces', 'ethernet', 'eth3', 'vif-s', '20', 'vrf', 'VRF-1']) + self.cli_set(['interfaces', 'ethernet', 'eth3', 'vif-s', '20', 'vif-c', '40', 'vrf', 'VRF-1']) + self.cli_commit() + + # make som verifications to ensure the interface swapped vrf + nftables_search = [ + ['oifname { "eth0", "eth0.20", "eth3.20", "eth3.20.40" }', 'counter packets', 'jump VZONE_ZONE1'], + ['oifname { "vti1", "vti2" }', 'counter packets', 'jump VZONE_ZONE2'], + ] + + nftables_search_v6 = [ + ['oifname { "eth0", "eth0.20", "eth3.20", "eth3.20.40" }', 'counter packets', 'jump VZONE_ZONE1'], + ['oifname { "vti1", "vti2" }', 'counter packets', 'jump VZONE_ZONE2'], + ] + self.verify_nftables(nftables_search, 'ip vyos_filter') + self.verify_nftables(nftables_search_v6, 'ip6 vyos_filter') + def test_zone_without_member(self): self.cli_set(['firewall', 'zone', 'wan', 'default-action', 'drop']) error_message = 'Zone "wan" has no interfaces and is not the local zone' diff --git a/src/conf_mode/firewall.py b/src/conf_mode/firewall.py index 4b6a4d272..29181b4ef 100755 --- a/src/conf_mode/firewall.py +++ b/src/conf_mode/firewall.py @@ -142,7 +142,9 @@ def get_config(config=None): if 'vrf' in local_zone_member: local_zone_conf['vrf_interfaces'] = {} for vrf_name in local_zone_member['vrf']: - local_zone_conf['vrf_interfaces'][vrf_name] = ','.join(get_vrf_members(vrf_name)) + local_zone_conf['vrf_interfaces'][vrf_name] = get_vrf_members( + vrf_name + ) continue local_zone_conf['from_local'] = {} diff --git a/src/conf_mode/interfaces_bonding.py b/src/conf_mode/interfaces_bonding.py index fc3c05d3e..0f5554145 100755 --- a/src/conf_mode/interfaces_bonding.py +++ b/src/conf_mode/interfaces_bonding.py @@ -19,6 +19,7 @@ from sys import exit from vyos.config import Config from vyos.configdict import get_interface_dict from vyos.configdict import is_node_changed +from vyos.configdict import is_vrf_changed from vyos.configdict import leaf_node_changed from vyos.configdict import is_member from vyos.configdict import is_source_interface @@ -171,6 +172,11 @@ def get_config(config=None): if 'static_arp' in bond: set_dependents('static_arp', conf) + # Check vrf membership, to ensure firewall is updated + if is_vrf_changed(conf, ifname): + bond.update({'vrf_changed': {}}) + set_dependents('firewall', conf) + bond['vpp_ifaces'] = cli_ifaces_list(conf) return bond @@ -298,7 +304,11 @@ def apply(bond): else: b.update(bond) - if dict_search('member.interface_remove', bond) or 'static_arp' in bond: + if ( + dict_search('member.interface_remove', bond) + or 'static_arp' in bond + or 'vrf_changed' in bond + ): try: call_dependents() except ConfigError: diff --git a/src/conf_mode/interfaces_bridge.py b/src/conf_mode/interfaces_bridge.py index 6b574639e..5e24b8961 100755 --- a/src/conf_mode/interfaces_bridge.py +++ b/src/conf_mode/interfaces_bridge.py @@ -18,6 +18,7 @@ from sys import exit from vyos.config import Config from vyos.configdict import get_interface_dict +from vyos.configdict import is_vrf_changed from vyos.configdict import node_changed from vyos.configdict import is_member from vyos.configdict import is_source_interface @@ -129,6 +130,11 @@ def get_config(config=None): if 'static_arp' in bridge: set_dependents('static_arp', conf) + # Check vrf membership, to ensure firewall is updated + if is_vrf_changed(conf, ifname): + bridge.update({'vrf_changed': {}}) + set_dependents('firewall', conf) + bridge['vpp_ifaces'] = cli_ifaces_list(conf) return bridge @@ -233,7 +239,7 @@ def apply(bridge): if iface.startswith(('vxlan', 'wlan')) and interface_exists(iface) ] - if interfaces_need_update or 'static_arp' in bridge: + if interfaces_need_update or 'static_arp' in bridge or 'vrf_changed' in bridge: try: call_dependents() except ConfigError: diff --git a/src/conf_mode/interfaces_dummy.py b/src/conf_mode/interfaces_dummy.py index c35511199..adaf1958b 100755 --- a/src/conf_mode/interfaces_dummy.py +++ b/src/conf_mode/interfaces_dummy.py @@ -18,6 +18,9 @@ from sys import exit from vyos.config import Config from vyos.configdict import get_interface_dict +from vyos.configdict import is_vrf_changed +from vyos.configdep import set_dependents +from vyos.configdep import call_dependents from vyos.configverify import verify_vrf from vyos.configverify import verify_address from vyos.configverify import verify_bridge_delete @@ -37,7 +40,12 @@ def get_config(config=None): else: conf = Config() base = ['interfaces', 'dummy'] - _, dummy = get_interface_dict(conf, base) + ifname, dummy = get_interface_dict(conf, base) + + # Check vrf membership, to ensure firewall is updated + if is_vrf_changed(conf, ifname): + set_dependents('firewall', conf) + return dummy def verify(dummy): @@ -63,6 +71,9 @@ def apply(dummy): else: d.update(dummy) + # run the dependents + call_dependents() + return None if __name__ == '__main__': diff --git a/src/conf_mode/interfaces_ethernet.py b/src/conf_mode/interfaces_ethernet.py index 3b8453780..1368f2c6e 100755 --- a/src/conf_mode/interfaces_ethernet.py +++ b/src/conf_mode/interfaces_ethernet.py @@ -24,6 +24,7 @@ from vyos.configdep import set_dependents from vyos.configdep import call_dependents from vyos.configdict import get_interface_dict from vyos.configdict import is_node_changed +from vyos.configdict import is_vrf_changed from vyos.configdict import get_flowtable_interfaces from vyos.configverify import verify_address from vyos.configverify import verify_dhcpv6 @@ -196,6 +197,10 @@ def get_config(config=None): if 'static_arp' in ethernet: set_dependents('static_arp', conf) + # Check vrf membership, to ensure firewall is updated + if is_vrf_changed(conf, ifname): + set_dependents('firewall', conf) + return ethernet def verify_speed_duplex(ethernet: dict, ethtool: Ethtool): @@ -442,8 +447,9 @@ def apply(ethernet): e.remove() else: e.update(ethernet) - if 'static_arp' in ethernet: - call_dependents() + + # run the dependents + call_dependents() vpp_iface_config = dict_search(f'vpp.settings.interface.{ifname}', ethernet) if vpp_iface_config is not None and is_systemd_service_running('vpp.service'): diff --git a/src/conf_mode/interfaces_geneve.py b/src/conf_mode/interfaces_geneve.py index faaa7b848..2fc72568e 100755 --- a/src/conf_mode/interfaces_geneve.py +++ b/src/conf_mode/interfaces_geneve.py @@ -21,6 +21,7 @@ from vyos.configdep import set_dependents from vyos.configdep import call_dependents from vyos.configdict import get_interface_dict from vyos.configdict import is_node_changed +from vyos.configdict import is_vrf_changed from vyos.configverify import verify_address from vyos.configverify import verify_mtu_ipv6 from vyos.configverify import verify_bridge_delete @@ -57,6 +58,10 @@ def get_config(config=None): if 'static_arp' in geneve: set_dependents('static_arp', conf) + # Check vrf membership, to ensure firewall is updated + if is_vrf_changed(conf, ifname): + set_dependents('firewall', conf) + return geneve def verify(geneve): @@ -96,8 +101,8 @@ def apply(geneve): g = GeneveIf(**geneve) g.update(geneve) - if 'static_arp' in geneve: - call_dependents() + # run the dependents + call_dependents() return None diff --git a/src/conf_mode/interfaces_l2tpv3.py b/src/conf_mode/interfaces_l2tpv3.py index 85438b6c5..5a9d34f89 100755 --- a/src/conf_mode/interfaces_l2tpv3.py +++ b/src/conf_mode/interfaces_l2tpv3.py @@ -20,6 +20,7 @@ from vyos.config import Config from vyos.configdep import set_dependents from vyos.configdep import call_dependents from vyos.configdict import get_interface_dict +from vyos.configdict import is_vrf_changed from vyos.configdict import leaf_node_changed from vyos.configverify import verify_address from vyos.configverify import verify_bridge_delete @@ -62,6 +63,10 @@ def get_config(config=None): if 'static_arp' in l2tpv3: set_dependents('static_arp', conf) + # Check vrf membership, to ensure firewall is updated + if is_vrf_changed(conf, ifname): + set_dependents('firewall', conf) + return l2tpv3 def verify(l2tpv3): @@ -106,8 +111,8 @@ def apply(l2tpv3): l = L2TPv3If(**l2tpv3) l.update(l2tpv3) - if 'static_arp' in l2tpv3: - call_dependents() + # run the dependents + call_dependents() return None diff --git a/src/conf_mode/interfaces_macsec.py b/src/conf_mode/interfaces_macsec.py index 3c043e11e..5aae52c02 100755 --- a/src/conf_mode/interfaces_macsec.py +++ b/src/conf_mode/interfaces_macsec.py @@ -23,6 +23,7 @@ from vyos.configdep import set_dependents from vyos.configdep import call_dependents from vyos.configdict import get_interface_dict from vyos.configdict import is_node_changed +from vyos.configdict import is_vrf_changed from vyos.configdict import is_source_interface from vyos.configverify import verify_vrf from vyos.configverify import verify_address @@ -84,6 +85,10 @@ def get_config(config=None): if 'static_arp' in macsec: set_dependents('static_arp', conf) + # Check vrf membership, to ensure firewall is updated + if is_vrf_changed(conf, ifname): + set_dependents('firewall', conf) + return macsec @@ -187,6 +192,9 @@ def apply(macsec): if os.path.isfile(wpa_suppl_conf.format(**macsec)): os.unlink(wpa_suppl_conf.format(**macsec)) + # run the dependents + call_dependents() + return None # It is safe to "re-create" the interface always, there is a sanity @@ -199,8 +207,8 @@ def apply(macsec): if not is_systemd_service_running(systemd_service) or 'shutdown_required' in macsec: call(f'systemctl reload-or-restart {systemd_service}') - if 'static_arp' in macsec: - call_dependents() + # run the dependents + call_dependents() return None diff --git a/src/conf_mode/interfaces_openvpn.py b/src/conf_mode/interfaces_openvpn.py index f2a49327a..ec5840369 100755 --- a/src/conf_mode/interfaces_openvpn.py +++ b/src/conf_mode/interfaces_openvpn.py @@ -32,7 +32,10 @@ from vyos.base import DeprecationWarning from vyos.config import Config from vyos.configdict import get_interface_dict from vyos.configdict import is_node_changed +from vyos.configdict import is_vrf_changed from vyos.configdiff import get_config_diff +from vyos.configdep import set_dependents +from vyos.configdep import call_dependents from vyos.configverify import verify_vrf from vyos.configverify import verify_bridge_delete from vyos.configverify import verify_mirror_redirect @@ -181,6 +184,10 @@ def get_config(config=None): else: openvpn['protocol_modifier'] = '' + # Check vrf membership, to ensure firewall is updated + if is_vrf_changed(conf, ifname): + set_dependents('firewall', conf) + return openvpn def is_ec_private_key(pki, cert_name): @@ -855,6 +862,9 @@ def apply(openvpn): o = VTunIf(**openvpn) o.update(openvpn) + # run the dependents + call_dependents() + return None diff --git a/src/conf_mode/interfaces_pppoe.py b/src/conf_mode/interfaces_pppoe.py index 1a405e6b6..610811ceb 100755 --- a/src/conf_mode/interfaces_pppoe.py +++ b/src/conf_mode/interfaces_pppoe.py @@ -21,6 +21,9 @@ from sys import exit from vyos.config import Config from vyos.configdict import get_interface_dict from vyos.configdict import is_node_changed +from vyos.configdict import is_vrf_changed +from vyos.configdep import set_dependents +from vyos.configdep import call_dependents from vyos.configverify import verify_authentication from vyos.configverify import verify_source_interface from vyos.configverify import verify_vrf @@ -72,6 +75,10 @@ def get_config(config=None): if 'mru' not in pppoe: pppoe['mru'] = pppoe['mtu'] + # Check vrf membership, to ensure firewall is updated + if is_vrf_changed(conf, ifname): + set_dependents('firewall', conf) + return pppoe def verify(pppoe): @@ -119,6 +126,9 @@ def apply(pppoe): p = PPPoEIf(ifname) p.remove() call(f'systemctl stop ppp@{ifname}.service') + + # run the dependents and return + call_dependents() return None # reconnect should only be necessary when certain config options change, @@ -140,6 +150,9 @@ def apply(pppoe): p = PPPoEIf(ifname) p.update(pppoe) + # run the dependents + call_dependents() + return None if __name__ == '__main__': diff --git a/src/conf_mode/interfaces_pseudo-ethernet.py b/src/conf_mode/interfaces_pseudo-ethernet.py index 12019d3e6..cb0f7e7d0 100755 --- a/src/conf_mode/interfaces_pseudo-ethernet.py +++ b/src/conf_mode/interfaces_pseudo-ethernet.py @@ -22,6 +22,7 @@ from vyos.configdep import call_dependents from vyos.configdict import get_interface_dict from vyos.configdict import is_source_interface from vyos.configdict import is_node_changed +from vyos.configdict import is_vrf_changed from vyos.configverify import verify_vrf from vyos.configverify import verify_address from vyos.configverify import verify_bridge_delete @@ -66,6 +67,10 @@ def get_config(config=None): if 'static_arp' in peth: set_dependents('static_arp', conf) + # Check vrf membership, to ensure firewall is updated + if is_vrf_changed(conf, ifname): + set_dependents('firewall', conf) + return peth def _verify_anycast_gateway(peth: dict): @@ -131,8 +136,8 @@ def apply(peth): p = MACVLANIf(**peth) p.update(peth) - if 'static_arp' in peth: - call_dependents() + # run the dependents + call_dependents() return None diff --git a/src/conf_mode/interfaces_sstpc.py b/src/conf_mode/interfaces_sstpc.py index 50d3d1cb3..0231b9952 100755 --- a/src/conf_mode/interfaces_sstpc.py +++ b/src/conf_mode/interfaces_sstpc.py @@ -20,6 +20,9 @@ from sys import exit from vyos.config import Config from vyos.configdict import get_interface_dict from vyos.configdict import is_node_changed +from vyos.configdict import is_vrf_changed +from vyos.configdep import set_dependents +from vyos.configdep import call_dependents from vyos.configverify import verify_authentication from vyos.configverify import verify_vrf from vyos.ifconfig import SSTPCIf @@ -57,6 +60,10 @@ def get_config(config=None): # bail out early - no need to further process other nodes break + # Check vrf membership, to ensure firewall is updated + if is_vrf_changed(conf, ifname): + set_dependents('firewall', conf) + return sstpc def verify(sstpc): @@ -107,6 +114,9 @@ def apply(sstpc): p = SSTPCIf(ifname) p.remove() call(f'systemctl stop ppp@{ifname}.service') + + # run the dependents and return + call_dependents() return None # reconnect should only be necessary when specific options change, @@ -128,6 +138,9 @@ def apply(sstpc): p = SSTPCIf(ifname) p.update(sstpc) + # run the dependents + call_dependents() + return None if __name__ == '__main__': diff --git a/src/conf_mode/interfaces_tunnel.py b/src/conf_mode/interfaces_tunnel.py index 6e50d778a..a86a2fa84 100755 --- a/src/conf_mode/interfaces_tunnel.py +++ b/src/conf_mode/interfaces_tunnel.py @@ -18,6 +18,9 @@ import ipaddress from vyos.config import Config from vyos.configdict import get_interface_dict from vyos.configdict import is_node_changed +from vyos.configdict import is_vrf_changed +from vyos.configdep import set_dependents +from vyos.configdep import call_dependents from vyos.configverify import verify_address from vyos.configverify import verify_bridge_delete from vyos.configverify import verify_source_interface @@ -78,6 +81,10 @@ def get_config(config=None): if 'encapsulation' in tunnel and tunnel['encapsulation'] not in ['erspan', 'ip6erspan']: del tunnel['parameters']['erspan'] + # Check vrf membership, to ensure firewall is updated + if is_vrf_changed(conf, ifname): + set_dependents('firewall', conf) + return tunnel def verify(tunnel): @@ -218,11 +225,16 @@ def apply(tunnel): tmp = Interface(interface) tmp.remove() if 'deleted' in tunnel: + # run the dependents and return + call_dependents() return None tun = TunnelIf(**tunnel) tun.update(tunnel) + # run the dependents + call_dependents() + return None if __name__ == '__main__': diff --git a/src/conf_mode/interfaces_virtual-ethernet.py b/src/conf_mode/interfaces_virtual-ethernet.py index 00fc9cce9..7896ddf07 100755 --- a/src/conf_mode/interfaces_virtual-ethernet.py +++ b/src/conf_mode/interfaces_virtual-ethernet.py @@ -22,6 +22,7 @@ from vyos.config import Config from vyos.configdep import set_dependents from vyos.configdep import call_dependents from vyos.configdict import get_interface_dict +from vyos.configdict import is_vrf_changed from vyos.configverify import verify_address from vyos.configverify import verify_bridge_delete from vyos.configverify import verify_vrf @@ -54,6 +55,10 @@ def get_config(config=None): if 'static_arp' in veth: set_dependents('static_arp', conf) + # Check vrf membership, to ensure firewall is updated + if is_vrf_changed(conf, ifname): + set_dependents('firewall', conf) + return veth @@ -108,8 +113,8 @@ def apply(veth): p = VethIf(**veth) p.update(veth) - if 'static_arp' in veth: - call_dependents() + # run the dependents + call_dependents() return None diff --git a/src/conf_mode/interfaces_vti.py b/src/conf_mode/interfaces_vti.py index b4652d727..916543caf 100755 --- a/src/conf_mode/interfaces_vti.py +++ b/src/conf_mode/interfaces_vti.py @@ -18,6 +18,9 @@ from sys import exit from vyos.config import Config from vyos.configdict import get_interface_dict +from vyos.configdict import is_vrf_changed +from vyos.configdep import set_dependents +from vyos.configdep import call_dependents from vyos.configverify import verify_mirror_redirect from vyos.configverify import verify_vrf from vyos.configverify import verify_mtu_ipv6 @@ -36,7 +39,12 @@ def get_config(config=None): else: conf = Config() base = ['interfaces', 'vti'] - _, vti = get_interface_dict(conf, base) + ifname, vti = get_interface_dict(conf, base) + + # Check vrf membership, to ensure firewall is updated + if is_vrf_changed(conf, ifname): + set_dependents('firewall', conf) + return vti def verify(vti): @@ -52,11 +60,18 @@ def apply(vti): # Remove macsec interface if 'deleted' in vti: VTIIf(**vti).remove() + + # run the dependents + call_dependents() + return None tmp = VTIIf(**vti) tmp.update(vti) + # run the dependents + call_dependents() + return None if __name__ == '__main__': diff --git a/src/conf_mode/interfaces_vxlan.py b/src/conf_mode/interfaces_vxlan.py index 86e885807..1dab47b4a 100755 --- a/src/conf_mode/interfaces_vxlan.py +++ b/src/conf_mode/interfaces_vxlan.py @@ -23,6 +23,7 @@ from vyos.configdep import call_dependents from vyos.configdict import get_interface_dict from vyos.configdict import leaf_node_changed from vyos.configdict import is_node_changed +from vyos.configdict import is_vrf_changed from vyos.configdict import node_changed from vyos.configverify import verify_address from vyos.configverify import verify_bridge_delete @@ -89,6 +90,10 @@ def get_config(config=None): if 'static_arp' in vxlan: set_dependents('static_arp', conf) + # Check vrf membership, to ensure firewall is updated + if is_vrf_changed(conf, ifname): + set_dependents('firewall', conf) + return vxlan def verify(vxlan): @@ -257,8 +262,8 @@ def apply(vxlan): v = VXLANIf(**vxlan) v.update(vxlan) - if 'static_arp' in vxlan: - call_dependents() + # run the dependents + call_dependents() return None diff --git a/src/conf_mode/interfaces_wireguard.py b/src/conf_mode/interfaces_wireguard.py index 4cb544b72..44ee70d27 100755 --- a/src/conf_mode/interfaces_wireguard.py +++ b/src/conf_mode/interfaces_wireguard.py @@ -22,6 +22,7 @@ from sys import exit from vyos.config import Config from vyos.configdict import get_interface_dict from vyos.configdict import is_node_changed +from vyos.configdict import is_vrf_changed from vyos.configdict import is_source_interface from vyos.configdep import set_dependents from vyos.configdep import call_dependents @@ -87,6 +88,10 @@ def get_config(config=None): wireguard['prev_fwmark'] = prev.get('fwmark') wireguard['prev_vrf'] = prev.get('vrf') + # Check vrf membership, to ensure firewall is updated + if is_vrf_changed(conf, ifname): + set_dependents('firewall', conf) + return wireguard @@ -206,6 +211,7 @@ def apply(wireguard): domain_action = 'stop' call(f'systemctl {domain_action} vyos-domain-resolver.service') + # run the dependents call_dependents() return None diff --git a/src/conf_mode/interfaces_wireless.py b/src/conf_mode/interfaces_wireless.py index f7d4cd7c9..1ad16e816 100755 --- a/src/conf_mode/interfaces_wireless.py +++ b/src/conf_mode/interfaces_wireless.py @@ -25,6 +25,7 @@ from vyos.config import Config from vyos.configdep import set_dependents from vyos.configdep import call_dependents from vyos.configdict import get_interface_dict +from vyos.configdict import is_vrf_changed from vyos.configdict import dict_merge from vyos.configverify import verify_address from vyos.configverify import verify_bridge_delete @@ -92,7 +93,7 @@ def get_config(config=None): conf = Config() base = ['interfaces', 'wireless'] - _, wifi = get_interface_dict(conf, base) + ifname, wifi = get_interface_dict(conf, base) # retrieve global Wireless regulatory domain setting if conf.exists(country_code_path): @@ -145,6 +146,10 @@ def get_config(config=None): if 'static_arp' in wifi: set_dependents('static_arp', conf) + # Check vrf membership, to ensure firewall is updated + if is_vrf_changed(conf, ifname): + set_dependents('firewall', conf) + return wifi def verify(wifi): @@ -318,6 +323,9 @@ def apply(wifi): if 'deleted' in wifi: WiFiIf(**wifi).remove() + + # run the dependents and return + call_dependents() return None while (is_systemd_service_running(f'hostapd@{interface}.service') or \ @@ -393,8 +401,8 @@ def apply(wifi): elif wifi['type'] == 'station': call(f'systemctl start wpa_supplicant@{interface}.service') - if 'static_arp' in wifi: - call_dependents() + # run the dependents + call_dependents() return None diff --git a/src/conf_mode/interfaces_wwan.py b/src/conf_mode/interfaces_wwan.py index ad6c806ad..0fe67508a 100755 --- a/src/conf_mode/interfaces_wwan.py +++ b/src/conf_mode/interfaces_wwan.py @@ -24,6 +24,7 @@ from vyos.configdep import set_dependents from vyos.configdep import call_dependents from vyos.configdict import get_interface_dict from vyos.configdict import is_node_changed +from vyos.configdict import is_vrf_changed from vyos.configverify import verify_authentication from vyos.configverify import verify_interface_exists from vyos.configverify import verify_mirror_redirect @@ -93,6 +94,10 @@ def get_config(config=None): if 'static_arp' in wwan: set_dependents('static_arp', conf) + # Check vrf membership, to ensure firewall is updated + if is_vrf_changed(conf, ifname): + set_dependents('firewall', conf) + return wwan def verify(wwan): @@ -170,6 +175,9 @@ def apply(wwan): if os.path.exists(cron_script): os.unlink(cron_script) + # run the dependents + call_dependents() + return None if 'shutdown_required' in wwan or (not is_wwan_connected(wwan['ifname'])): @@ -192,8 +200,8 @@ def apply(wwan): w.update(wwan) - if 'static_arp' in wwan: - call_dependents() + # run the dependents + call_dependents() return None |
