Skip to content

Commit c9822d1

Browse files
authored
Merge pull request #5375 from ruben-herold/T9162-nat-show-interface-keyerror
nat: T9162: fix KeyError when show nat rules has no inbound-interface
2 parents d2b54b9 + 345a7bb commit c9822d1

1 file changed

Lines changed: 14 additions & 8 deletions

File tree

src/op_mode/nat.py

Lines changed: 14 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -99,6 +99,18 @@ def _get_raw_translation(direction, family, address=None):
9999
return _xml_to_dict(xml)
100100

101101

102+
def _get_interface(rule):
103+
interface = 'any'
104+
for expr in rule.get('rule', {}).get('expr', []):
105+
match = expr.get('match')
106+
if match and jmespath.search('left.meta.key', match) in ('iifname', 'oifname'):
107+
interface = match.get('right')
108+
break
109+
if isinstance(interface, str) and interface.startswith('@'):
110+
interface = interface[3:]
111+
return interface
112+
113+
102114
def _get_formatted_output_rules(data, direction, family):
103115

104116

@@ -142,10 +154,7 @@ def _get_ports_for_output(rules):
142154
rule_number = comment.split('-')[-1]
143155
rule_number = rule_number.split(' ')[0]
144156
if 'expr' in rule['rule']:
145-
interface = rule.get('rule').get('expr')[0].get('match').get('right') \
146-
if jmespath.search('rule.expr[*].match.left.meta', rule) else 'any'
147-
if interface[0] == '@':
148-
interface = interface[3:]
157+
interface = _get_interface(rule)
149158
for index, match in enumerate(jmespath.search('rule.expr[*].match', rule)):
150159
if 'payload' in match['left']:
151160
# Handle NAT rule containing comma-separated list of ports
@@ -257,8 +266,7 @@ def _get_formatted_output_statistics(data, direction):
257266
rule_number = comment.split('-')[-1]
258267
rule_number = rule_number.split(' ')[0]
259268
if 'expr' in rule['rule']:
260-
interface = rule.get('rule').get('expr')[0].get('match').get('right') \
261-
if jmespath.search('rule.expr[*].match.left.meta', rule) else 'any'
269+
interface = _get_interface(rule)
262270
packets = jmespath.search('rule.expr[*].counter.packets | [0]', rule)
263271
_bytes = jmespath.search('rule.expr[*].counter.bytes | [0]', rule)
264272
data_entries.append([rule_number, packets, _bytes, interface])
@@ -298,13 +306,11 @@ def _get_formatted_translation(dict_data, nat_direction, family, verbose):
298306
reply_dport = meta['layer4']['dport']
299307
proto = meta['layer4']['protoname']
300308
if direction == 'independent':
301-
conn_id = meta['id']
302309
timeout = meta.get('timeout', 'n/a')
303310
orig_src = f'{orig_src}:{orig_sport}' if orig_sport else orig_src
304311
orig_dst = f'{orig_dst}:{orig_dport}' if orig_dport else orig_dst
305312
reply_src = f'{reply_src}:{reply_sport}' if reply_sport else reply_src
306313
reply_dst = f'{reply_dst}:{reply_dport}' if reply_dport else reply_dst
307-
state = meta['state'] if 'state' in meta else ''
308314
mark = meta.get('mark', '')
309315
zone = meta['zone'] if 'zone' in meta else ''
310316
if nat_direction == 'source':

0 commit comments

Comments
 (0)