def printRouteDetailEntry(entry, vlan_aggregate_port_map, vlan_port_map): suffix = "" if entry.isConnected: suffix += " (connected)" print("Network Address: %s/%d %s" % (utils.ip_ntop(entry.dest.ip.addr), entry.dest.prefixLength, suffix)) for clAndNxthops in entry.nextHopMulti: print(" Nexthops from client %d" % clAndNxthops.clientId) if clAndNxthops.nextHopAddrs: for address in clAndNxthops.nextHopAddrs: print(" %s" % utils.nexthop_to_str(NextHopThrift(address=address))) elif clAndNxthops.nextHops: for nextHop in clAndNxthops.nextHops: print(" %s" % utils.nexthop_to_str(nextHop)) print(" Action: %s" % entry.action) if entry.nextHops and len(entry.nextHops) > 0: print(" Forwarding via:") for nextHop in entry.nextHops: print(" {}".format( utils.nexthop_to_str(nextHop, vlan_aggregate_port_map, vlan_port_map))) elif len(entry.fwdInfo) > 0: print(" Forwarding via:") for ifAndIp in entry.fwdInfo: print(" (i/f %d) %s" % (ifAndIp.interfaceID, utils.ip_ntop(ifAndIp.ip.addr))) else: print(" No Forwarding Info") print(" Admin Distance: %s" % entry.adminDistance) print()
def run(self, client_id, ipv4, ipv6, prefixes: t.List[str]): with ExitStack() as stack: agent_client = stack.enter_context(self._create_agent_client()) try: qsfp_client = stack.enter_context(self._create_qsfp_client()) except TTransportException: qsfp_client = None if client_id is None: resp = agent_client.getRouteTable() else: resp = agent_client.getRouteTableByClient(client_id) if not resp: print("No Route Table Entries Found") return # Getting the port/agg to VLAN map in order to display them vlan_port_map = utils.get_vlan_port_map( agent_client, qsfp_client, colors=False, details=False ) vlan_aggregate_port_map = utils.get_vlan_aggregate_port_map(agent_client) for entry in resp: prefix_str = ( f"{utils.ip_ntop(entry.dest.ip.addr)}/{entry.dest.prefixLength}" ) ucmp_active = " (UCMP Active)" if is_ucmp_active(entry.nextHops) else "" # Apply filters if ipv6 and not ipv4 and len(entry.dest.ip.addr) == 4: continue if ipv4 and not ipv6 and len(entry.dest.ip.addr) == 16: continue if prefixes and prefix_str not in prefixes: continue # Print header print(f"Network Address: {prefix_str}{ucmp_active}") # Need to check the nextHopAddresses if entry.nextHops: for nextHop in entry.nextHops: print( "\tvia %s" % ( utils.nexthop_to_str( nextHop, vlan_aggregate_port_map=vlan_aggregate_port_map, vlan_port_map=vlan_port_map, ) ) ) else: for address in entry.nextHopAddrs: print( "\tvia %s" % utils.nexthop_to_str(NextHopThrift(address=address)) )
def run(self, client_id, ipv4, ipv6): with ExitStack() as stack: agent_client = stack.enter_context(self._create_agent_client()) qsfp_client = stack.enter_context(self._create_qsfp_client()) if client_id is None: resp = agent_client.getRouteTable() else: resp = agent_client.getRouteTableByClient(client_id) if not resp: print("No Route Table Entries Found") return # Getting the port/agg to VLAN map in order to display them vlan_port_map = utils.get_vlan_port_map( agent_client, qsfp_client, colors=False, details=False ) vlan_aggregate_port_map = utils.get_vlan_aggregate_port_map(agent_client) for entry in resp: if ipv6 and not ipv4 and len(entry.dest.ip.addr) == 4: continue if ipv4 and not ipv6 and len(entry.dest.ip.addr) == 16: continue prefix = utils.ip_ntop(entry.dest.ip.addr) prefix_mask_len = entry.dest.prefixLength ucmp_active = " (UCMP Active)" if is_ucmp_active(entry.nextHops) else "" print(f"Network Address: {prefix}/{prefix_mask_len}{ucmp_active}") # Need to check the nextHopAddresses if entry.nextHops: for nextHop in entry.nextHops: print( "\tvia %s" % ( utils.nexthop_to_str( nextHop, vlan_aggregate_port_map=vlan_aggregate_port_map, vlan_port_map=vlan_port_map, ucmp_active=ucmp_active, ) ) ) else: for address in entry.nextHopAddrs: print( "\tvia %s" % utils.nexthop_to_str(NextHopThrift(address=address)) )
def parse_nexthops(nexthops): nhts = [] for nh in nexthops: iface = None weight = 0 # Nexthop may have weight. if "x" in nh: addr_iface, _, weight = nh.rpartition("x") weight = int(weight) else: addr_iface = nh # Nexthop may or may not be link-local. Handle it here well if "@" in addr_iface: addr, _, iface = addr_iface.rpartition("@") elif "%" in addr_iface: addr, _, iface = addr_iface.rpartition("%") else: addr = addr_iface binaddr = BinaryAddress(addr=ipaddress.ip_address(addr).packed, ifName=iface) nhts.append(NextHopThrift(address=binaddr, weight=weight)) return nhts