@@ -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