def install_available_paths(prefix, config, ip): if config != "EMPTY": asn = ip_bgp_data.ip_to_asn(ip) available_paths_list = [] available_paths = config.split("!") for i, path in enumerate(available_paths): available_paths_list.append(path) available_paths_list.sort() router_paths[prefix][asn][ip]["available_paths"] = "!".join( available_paths_list) else: router_paths[prefix][asn][ip]["available_paths"] = "-"
def install_all_paths(prefix, config, ip): if config != "EMPTY": asn = ip_bgp_data.ip_to_asn(ip) paths = config.split(":") router_paths[prefix][asn][ip]["best_path"] = paths[0] if asn == ip_bgp_data.local_asn: current_path[prefix] = paths[0] available_paths_list = [] available_paths = paths[1].split("!") for i, path in enumerate(available_paths): available_paths_list.append(path) available_paths_list.sort() router_paths[prefix][asn][ip]["available_paths"] = "!".join( available_paths_list) else: router_paths[prefix][asn][ip]["best_path"] = "-" router_paths[prefix][asn][ip]["available_paths"] = "-"
def get_bgp_trace(trace): trace_split = trace.split('\n')[:-2] # remove trailing newlines last_asn = ip_bgp_data.local_asn last_latency = 0.0 bgp_data = [] bgp_trace = [last_asn] latency = 0.0 # parse every line in the trace for trace_line in trace_split: hop = parse_trace_line(trace_line).split("_") if hop[0] == "N/A": continue else: asn = ip_bgp_data.ip_to_asn(hop[0]) bgp_trace.append(asn) if asn != "*": latency = float(hop[1]) if asn != last_asn and last_asn != "*": bgp_data.append([last_asn, asn, latency - last_latency]) last_latency = latency last_asn = asn bgp_trace_filtered = [x[0] for x in itertools.groupby(bgp_trace)] bgp_trace_str = " ".join(bgp_trace_filtered) #if "*" in bgp_trace_str: #print bgp_trace_str + ": " + trace return [bgp_data, bgp_trace_str, latency]
if paths == "-": paths = "" paths += as_path + "!" if paths == "-": return paths else: return paths[:-1] else: return "EMPTY" if __name__ == '__main__': FLAGS = parse_FLAGS() print "forwarder_rcvd.py started" asn = ip_bgp_data.ip_to_asn(FLAGS.src_ip) if asn == "*": print "src_ip does not belong to an AS, exiting..." sys.exit(1) # create socket for sending data to localhost forward_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) # read from file continuously as new data is added process = subprocess.Popen(["tail", "-n", "0", "-F", FLAGS.logfile], stdout=subprocess.PIPE, stderr=subprocess.PIPE) while True: # read logfile line, and get the relevant portion of it. example lines: # Announcement example: 2016/07/04 10:05:34.326 BGP: 20.0.3.2 rcvd UPDATE w/ attr: nexthop 20.0.3.2, origin i, path 900 1000 1100 1200 800 # 2016/07/04 10:05:34.326 BGP: 20.0.3.2 rcvd 10.0.8.0/24 # Withdrawal example: 2016/07/04 10:48:05.088 BGP: 20.0.1.2 rcvd UPDATE about 10.0.3.0/24 -- withdrawn
else: best_path = as_path if paths == "-": return best_path + ":" + paths else: return best_path + ":" + paths[:-1] else: return "EMPTY" if __name__ == '__main__': FLAGS = parse_flags() print "get_paths.py started" asn = ip_bgp_data.ip_to_asn(FLAGS.src_ip) if asn == "*": print "src_ip does not belong to an AS, exiting..." sys.exit(1) # create socket server_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) server_socket.bind((FLAGS.src_ip, FLAGS.src_port)) # receive requests while True: try: data, (ip, port) = server_socket.recvfrom(1024) if data:
} current_path[prefix] = "-" previous_path[prefix] = "-" last_updates[prefix] = {} last_updates_local[prefix] = {} path_decisions[prefix] = {} if prefix not in router_paths: router_paths[prefix] = {} for asn in FLAGS.used_ases: last_updates[prefix][asn] = [] last_updates_local[prefix][asn] = [] for ip in FLAGS.routers: asn = ip_bgp_data.ip_to_asn(ip) if asn not in router_paths[prefix]: router_paths[prefix][asn] = {} router_paths[prefix][asn][ip] = { "best_path": "-", "available_paths": "-" } print "added prefix \"" + prefix + "\"" # initialize sockets upstream_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) upstream_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) upstream_socket.bind((FLAGS.src_ip, FLAGS.forwarder_port))