def exabgp_format(collector, message): neighbor = message["neighbor"] raw_bgp_messages.labels(collector, str(neighbor["asn"]["peer"])).inc() latency.labels(collector, str(neighbor["asn"]["peer"])).set((datetime.utcnow() - datetime.utcfromtimestamp(message["time"])).seconds) update = neighbor["message"].get("update") if update is not None: announce = update.get("announce") withdraw = update.get("withdraw") attribute = update.get("attribute") if announce is not None and attribute is not None: as_path = attribute.get("as-path", []) if len(as_path) > 0: origin = as_path[-1] for item in announce.get("ipv4 unicast", {}).values(): for prefix in item.keys(): yield InternalMessage("U", float(message["time"]), collector, int(neighbor["asn"]["peer"]), neighbor["ip"], prefix, origin, exabgp_as_path(as_path)) for item in announce.get("ipv6 unicast", {}).values(): for prefix in item.keys(): yield InternalMessage("U", float(message["time"]), collector, int(neighbor["asn"]["peer"]), neighbor["ip"], prefix, origin, exabgp_as_path(as_path)) if withdraw is not None: for item in withdraw.get("ipv4 unicast", {}).values(): for prefix in item.keys(): yield InternalMessage("U", float(message["time"]), collector, int(neighbor["asn"]["peer"]), neighbor["ip"], prefix, None, None) for item in withdraw.get("ipv6 unicast", {}).values(): for prefix in item.keys(): yield InternalMessage("U", float(message["time"]), collector, int(neighbor["asn"]["peer"]), neighbor["ip"], prefix, None, None) else: logger.error("got %s", message)
def bgpreader_format_update(collector, data): """ Transform an bgpreader update message to the internal representation. """ if data[0] == "W": yield InternalMessage("W", data[1], data[3], int(data[4]), data[5], data[6], None, None) elif data[0] == "A": as_path = data[8] if len(as_path) > 0: origin = frozenset(get_as_origin(as_path)) if len(origin) == 1: origin = iter(origin).next() yield InternalMessage("U", data[1], data[3], int(data[4]), data[5], data[6], origin, as_path)
def bgpstream_format(collector, elem): raw_bgp_messages.labels(collector, str(elem.peer_asn)).inc() latency.labels(collector, str(elem.peer_asn)).set( (datetime.utcnow() - datetime.utcfromtimestamp(elem.time)).seconds) if elem.type == "R" or elem.type == "A": as_path = elem.fields["as-path"] if len(as_path) > 0: origins = frozenset(get_as_origin(as_path)) typ = "F" if elem.type == "R" else "U" yield InternalMessage(typ, float(elem.time), collector, int(elem.peer_asn), elem.peer_address, elem.fields["prefix"], origins, as_path) elif elem.type == "W": yield InternalMessage("W", float(elem.time), collector, int(elem.peer_asn), elem.peer_address, elem.fields["prefix"], None, None)
def mabo_format_update(collector, data): """ Transform an mabo update message to the internal representation. """ for entry in data.get("withdraw", []): yield InternalMessage("W", data["timestamp"], collector, int(data["peer_as"]), data["peer_ip"], entry, None, None) as_path = data.get("as_path", "") if len(as_path) != 0: origin = frozenset(get_as_origin(as_path)) if len(origin) == 1: origin = iter(origin).next() for entry in data.get("announce", []): yield InternalMessage("U", data["timestamp"], collector, int(data["peer_as"]), data["peer_ip"], entry, origin, as_path)
def bgpreader_format_bview(collector, data): """ Transform an bgpreader bview line to the internal representation. """ as_path = data[8] if len(as_path) > 0: origin = frozenset(get_as_origin(as_path)) if len(origin) == 1: origin = iter(origin).next() yield InternalMessage("F", data[1], data[3], int(data[4]), data[5], data[6], origin, as_path)
def kafka_format(collector, message): data = json.loads(message) as_path = data.get("as_path", None) if as_path is not None: origins = frozenset(get_as_origin(as_path)) yield InternalMessage(data.get("type", "U"), data["timestamp"], collector, int(data["peer_as"]), data["peer_ip"], data["prefix"], origins, as_path) else: yield InternalMessage("W", data["timestamp"], collector, int(data["peer_as"]), data["peer_ip"], data["prefix"], None, None)
def mabo_format_td2(collector, data): """ Transform an mabo table dump v2 message to the internal representation. """ for entry in data.get("entries", []): as_path = entry["as_path"] if len(as_path) == 0: # skip announces from IGP continue origin = frozenset(get_as_origin(as_path)) if len(origin) == 1: origin = iter(origin).next() yield InternalMessage("F", data["timestamp"], collector, int(entry["peer_as"]), entry["peer_ip"], data["prefix"], origin, as_path)
def bgpreader_format_bview(collector, data): """ Transform an bgpreader bview line to the internal representation. """ as_path = data[8] if len(as_path) > 0: try: origin = frozenset(get_as_origin(as_path)) except: logger.warning("invalid AS_PATH %s", as_path) else: if len(origin) == 1: origin = iter(origin).next() yield InternalMessage("F", data[1], data[3], int(data[4]), data[5], data[6], origin, as_path)