Skip to content

Commit a843ca1

Browse files
Improved exceptions
1 parent 22c6447 commit a843ca1

File tree

1 file changed

+38
-27
lines changed

1 file changed

+38
-27
lines changed

scripts/ipintutil

Lines changed: 38 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -49,15 +49,15 @@ def get_bgp_peer():
4949
config_db.connect()
5050
data = config_db.get_table('BGP_NEIGHBOR')
5151

52-
for neighbor_ip in data.keys():
53-
# The data collected here will only work for manually defined neighbors
54-
# so we need to ignore errors when using BGP Unnumbered.
55-
try:
56-
local_addr = data[neighbor_ip]['local_addr']
57-
neighbor_name = data[neighbor_ip]['name']
52+
for neighbor_ip, attrs in data.items():
53+
# Works for manually defined neighbors; ignore errors for unnumbered
54+
if not isinstance(attrs, dict):
55+
sys.stderr.write(f"Error: BGP_NEIGHBOR entry {neighbor_ip} has invalid type {type(attrs).__name__}, expected dict\n")
56+
continue
57+
local_addr = attrs.get('local_addr')
58+
neighbor_name = attrs.get('name', 'N/A')
59+
if local_addr:
5860
bgp_peer.setdefault(local_addr, [neighbor_name, neighbor_ip])
59-
except KeyError:
60-
pass
6161
return bgp_peer
6262

6363

@@ -164,25 +164,34 @@ def _addr_show(namespace, af, display):
164164
addrs = {}
165165
for line in out.splitlines():
166166
# Example: "12: Po101.1645@PortChannel101 inet 30.2.135.1/24 scope global Po101.1645"
167-
colon = line.find(":")
168-
if colon < 0:
169-
continue
170-
ifname = line[colon + 1:].lstrip().split()[0]
167+
try:
168+
colon = line.find(":")
169+
if colon < 0:
170+
continue
171171

172-
if namespace != constants.DEFAULT_NAMESPACE and skip_ip_intf_display(ifname, display):
173-
continue
172+
parts = line[colon + 1:].lstrip().split()
173+
if not parts:
174+
continue
175+
ifname = parts[0]
174176

175-
toks = line.split()
176-
cidr = None
177-
for i, t in enumerate(toks):
178-
if t == "inet" or t == "inet6":
179-
if i + 1 < len(toks):
180-
cidr = toks[i + 1]
181-
break
182-
if not cidr:
183-
continue
177+
if namespace != constants.DEFAULT_NAMESPACE and skip_ip_intf_display(ifname, display):
178+
continue
184179

185-
addrs.setdefault(ifname, []).append(["", cidr])
180+
toks = line.split()
181+
cidr = None
182+
for i, t in enumerate(toks):
183+
if t == "inet" or t == "inet6":
184+
if i + 1 < len(toks):
185+
cidr = toks[i + 1]
186+
break
187+
if not cidr:
188+
continue
189+
190+
addrs.setdefault(ifname, []).append(["", cidr])
191+
except (IndexError, ValueError) as e:
192+
# Log parsing errors - may indicate kernel/network issues
193+
sys.stderr.write(f"Error: Failed to parse ip addr output line: {e}\n")
194+
continue
186195

187196
return addrs
188197

@@ -256,10 +265,12 @@ def get_ip_intfs_in_namespace(af, namespace, display):
256265

257266
bgp_neighs = {}
258267
for _, cidr in ifaddresses:
259-
local_ip = cidr.split('/', 1)[0]
260268
try:
261-
neighbor_name, neighbor_ip = bgp_peer[local_ip]
262-
except (KeyError, TypeError):
269+
local_ip = cidr.split('/', 1)[0]
270+
neighbor_name, neighbor_ip = bgp_peer.get(local_ip, ('N/A', 'N/A'))
271+
except (IndexError, ValueError) as e:
272+
# Log CIDR parsing errors - indicates data corruption
273+
sys.stderr.write(f"Error: Malformed CIDR '{cidr}': {e}\n")
263274
neighbor_name, neighbor_ip = 'N/A', 'N/A'
264275
bgp_neighs[cidr] = [neighbor_name, neighbor_ip]
265276

0 commit comments

Comments
 (0)