diff options
| author | l0crian1 <ryan.claridge13@gmail.com> | 2026-08-10 22:53:51 -0400 |
|---|---|---|
| committer | sarthurdev <965089+sarthurdev@users.noreply.github.com> | 2026-09-24 17:22:59 +0200 |
| commit | d15fb0e60f8f61fe8b965df571c74bf1c9e09fad (patch) | |
| tree | be2e0fd6cf6d6c6b181a7ea27e87cdb326823c51 /python | |
| parent | da354b88d916f4e7ba1e888a0e3501a5307ec3b5 (diff) | |
| download | vyos-1x-d15fb0e60f8f61fe8b965df571c74bf1c9e09fad.tar.gz vyos-1x-d15fb0e60f8f61fe8b965df571c74bf1c9e09fad.zip | |
T9152: Refactor source-validation to use vmaps
- Reduced rule processing of source-validation rules through hashable objects
Diffstat (limited to 'python')
| -rw-r--r-- | python/vyos/ifconfig/interface.py | 42 |
1 files changed, 23 insertions, 19 deletions
diff --git a/python/vyos/ifconfig/interface.py b/python/vyos/ifconfig/interface.py index b567f4ca9..9d04e6a27 100644 --- a/python/vyos/ifconfig/interface.py +++ b/python/vyos/ifconfig/interface.py @@ -892,32 +892,36 @@ class Interface(Control): def _get_nft_set_elements(self, family, table, set_name): """Return elements of an nftables set, or [] if none are present.""" tmp = json.loads(self._cmdl(['nft', '-j', 'list', 'set', family, table, set_name])) - return dict_search('set.elem', tmp['nftables'][1], []) - - def _get_nft_rule_handle(self, family, table, chain, match): - """Return handle of first rule matching match, or None if not found.""" - results = self._cmdl(['nft', '-a', 'list', 'chain', family, table, chain]).split('\n') - for line in results: - if match in line: - handle_search = re.search(r'handle (\d+)', line) - if handle_search: - return handle_search[1] - return None + elems = dict_search('set.elem', tmp['nftables'][1], []) or [] + # nft may return a bare value for a single element instead of a list + if not isinstance(elems, list): + elems = [elems] + return elems + + def _get_nft_rule_handles(self, family, table, chain, set_name): + """Return handles of all rules referencing set_name.""" + handles = [] + tmp = json.loads(self._cmdl(['nft', '-j', 'list', 'chain', family, table, chain])) + for entry in tmp.get('nftables', []): + rule = entry.get('rule') + if not rule: + continue + if set_name in json.dumps(rule.get('expr', [])): + handles.append(str(rule['handle'])) + return handles def _get_rpf_interface_rules(self, family): return self._get_nft_set_elements(family, 'raw', 'rpfilter_strict_ifaces'), self._get_nft_set_elements(family, 'raw', 'rpfilter_loose_ifaces') def _set_rpf_rule_deletes(self, family, rpf_dict, strict_needs_rule, loose_needs_rule): if strict_needs_rule: - handle = self._get_nft_rule_handle(family, 'raw', 'vyos_rpfilter', '@rpfilter_strict_ifaces') - if handle: - rpf_dict['strict_delete'] = True - rpf_dict['strict_handle'] = handle + handles = self._get_nft_rule_handles(family, 'raw', 'vyos_rpfilter', 'rpfilter_strict_ifaces') + if handles: + rpf_dict['strict_handles'] = handles if loose_needs_rule: - handle = self._get_nft_rule_handle(family, 'raw', 'vyos_rpfilter', '@rpfilter_loose_ifaces') - if handle: - rpf_dict['loose_delete'] = True - rpf_dict['loose_handle'] = handle + handles = self._get_nft_rule_handles(family, 'raw', 'vyos_rpfilter', 'rpfilter_loose_ifaces') + if handles: + rpf_dict['loose_handles'] = handles def _apply_rpf_nft_config(self, rpf_dict): from subprocess import STDOUT |
