bgp/examples/pybgpstream-aspath.py

44 lines
1.5 KiB
Python

import pybgpstream
import networkx as nx
from collections import defaultdict
from itertools import groupby
# Create an instance of a simple undirected graph
as_graph = nx.Graph()
bgp_lens = defaultdict(lambda: defaultdict(lambda: None))
stream = pybgpstream.BGPStream(
# Consider this time interval:
# Sat, 01 Aug 2015 7:50:00 GMT - 08:10:00 GMT
from_time="2015-08-01 07:50:00", until_time="2015-08-01 08:10:00",
collectors=["rrc00"],
record_type="ribs",
)
for rec in stream.records():
for elem in rec:
# Get the peer ASn
peer = str(elem.peer_asn)
# Get the array of ASns in the AS path and remove repeatedly prepended ASns
hops = [k for k, g in groupby(elem.fields['as-path'].split(" "))]
if len(hops) > 1 and hops[0] == peer:
# Get the origin ASn
origin = hops[-1]
# Add new edges to the NetworkX graph
for i in range(0,len(hops)-1):
as_graph.add_edge(hops[i],hops[i+1])
# Update the AS path length between 'peer' and 'origin'
bgp_lens[peer][origin] = \
min(list(filter(bool,[bgp_lens[peer][origin],len(hops)])))
# For each 'peer' and 'origin' pair
for peer in bgp_lens:
for origin in bgp_lens[peer]:
# compute the shortest path in the NetworkX graph
nxlen = len(nx.shortest_path(as_graph, peer, origin))
# and compare it to the BGP hop length
print((peer, origin, bgp_lens[peer][origin], nxlen))