Beispiel #1
0
 def json(self):
     return {
         "origin": self.origin_value,
         "origin_string": BGPTranslation.origin(self.origin_value),
         "type": self.type,
         "type_string": BGPTranslation.path_attribute(self.type),
         "error": self.error,
     }
Beispiel #2
0
    def __str__(self):
        if isinstance(self.global_administrator, int) and isinstance(
                self.local_administrator, int) and isinstance(
                    self.type, int) and isinstance(self.sub_type, int):
            type = self.type
            sub_type = self.sub_type
            global_administrator = self.global_administrator
            local_administrator = self.local_administrator

        elif isinstance(self.global_administrator, bytes) and isinstance(
                self.local_administrator, bytes) and isinstance(
                    self.type, bytes) and isinstance(self.sub_type, bytes):
            type = struct.unpack("!B", self.type)[0]
            sub_type = struct.unpack("!B", self.sub_type)[0]
            global_administrator = struct.unpack("!H",
                                                 self.global_administrator)[0]
            local_administrator = struct.unpack("!I",
                                                self.local_administrator)[0]

        else:
            return ""

        type_string = BGPTranslation.extended_community(type, sub_type)

        return type_string + " (" + str(self.global_administrator) + ":" + str(
            self.local_administrator) + ")"
Beispiel #3
0
 def json(self):
     return {
         "multiple_exit_discriminator": self.multiple_exit_discriminator,
         "type": self.type,
         "type_string": BGPTranslation.path_attribute(self.type),
         "error": self.error,
     }
Beispiel #4
0
 def json(self):
     return {
         "type": self.type,
         "type_string": BGPTranslation.path_attribute(self.type),
         "error": self.error,
         "next_hop": str(BGPRoute.decimal_ip_to_string(self.next_hop))
     }
Beispiel #5
0
    def __str__(self):
        # Return the string identifier of the BGP message
        # Example return: <BGPMessage type=UPDATE length=128>
        message_type_string = BGPTranslation.message_type(self.type)
        message_length_string = self.length
        message_parsed_string = BGPTranslation.boolean(self.parsed)
        message_error_string = BGPTranslation.boolean(self.error)

        # Assemble first part of message
        return_string = "<BGPMessage type="

        # Assemble message type
        if message_type_string is not None:
            return_string += message_type_string
        else:
            return_string += "UNKNOWN"

        # Assemble length
        return_string += " " + "length="

        if message_length_string is not None:
            return_string += str(message_length_string)
        else:
            return_string += "UNKNOWN"

        # Assemble parsed
        return_string += " " + "parsed="

        if message_parsed_string is not None:
            return_string += message_parsed_string
        else:
            return_string += "UNKNOWN"

        # Assemble error
        return_string += " " + "error="

        if message_error_string is not None:
            return_string += message_error_string
        else:
            return_string += "UNKNOWN"

        # Close message
        return_string += ">"

        # Return fully assembled message
        return return_string
Beispiel #6
0
    def json(self):
        r = {
            "type":
            self.type,
            "type_string":
            BGPTranslation.extended_community_type(self.type),
            "sub_type":
            self.sub_type,
            "sub_type_string":
            BGPTranslation.extended_community_subtype(self.type,
                                                      self.sub_type),
            "global_administrator":
            self.global_administrator,
            "local_administrator":
            self.local_administrator
        }

        return r
Beispiel #7
0
    def json(self):
        r = {
            "segment_type": self.segment_type,
            "segment_type_string": BGPTranslation.path_segment_type(self.segment_type),
            "segments": []
        }

        for s in self.segments:
            r["segments"].append(s)

        return r
Beispiel #8
0
    def json(self):
        r = {
            "type": self.type,
            "type_string": BGPTranslation.path_attribute(self.type),
            "error": self.error,
            "extended_communities": []
        }

        for e in self.extended_communities:
            r["extended_communities"].append(e.json())

        return r
Beispiel #9
0
    def json(self):
        r = {
            "asn_byte_length": self.asn_byte_length,
            "type": self.type,
            "type_string": BGPTranslation.path_attribute(self.type),
            "path_segments": [],
            "error": self.error,
        }

        for segment in self.path_segments:
            r["path_segments"].append(segment.json())

        return r
Beispiel #10
0
 def __str__(self):
     return BGPTranslation.origin(self.origin_value)
Beispiel #11
0
    def apply(self, message):
        # Example return:
        #
        # [BGPMessage UPDATE] - [123.123.123.123 -> 123.123.123.123]
        # |- IP: 123.123.123.123 -> 123.123.123.123
        # |- MAC: 11:11:11:11:11:11 -> 11:11:11:11:11
        # |- Unix Time: 1412416346.123245123
        # |
        # |- Withdrawn Routes Length: 0
        # |- Total Path Attribute Length: 55
        # |- Path Attributes
        # |--- ORIGIN: IGP
        # |--- AS_PATH: (9498 9430)
        # |--- NEXT_HOP: 80.81.194.250
        # |--- COMMUNITIES: 9498:1 9498:11 9498:91
        # |- NLRI
        # |--- 203.190.42.0/24
        ##

        # Initialize basic return string and PCAP information
        string = "[BGPMessage " + BGPTranslation.message_type(message.type) + "] - " + str(message.length) + " Bytes\n"
        string += self.prefix(0) + "MAC: " + message.pcap_information.get_mac().get_source_string(separated=True) + " -> " + message.pcap_information.get_mac().get_destination_string(separated=True) + "\n"
        string += self.prefix(0) + "IP: " + message.pcap_information.get_ip().get_source_string() + ":" + message.pcap_information.get_ports().get_source_string() + " -> " + message.pcap_information.get_ip().get_destination_string() + ":" + message.pcap_information.get_ports().get_destination_string() + "\n"
        string += self.prefix(0) + "Timestamp: " + message.pcap_information.get_timestmap_utc() + " (" + str(message.pcap_information.get_timestamp()[0]) + "." + str(message.pcap_information.get_timestamp()[1]) + ")\n"

        # Display additional information
        if BGPStatics.MESSAGE_TYPE_KEEPALIVE == message.type:
            pass

        if BGPStatics.MESSAGE_TYPE_OPEN == message.type:
            # --- Divider for PCAP information
            string += self.prefix(-1) + "\n"

            string += self.prefix(0) + "Version: " + str(message.version) + "\n"
            string += self.prefix(0) + "My ASN: " + str(message.asn) + "\n"
            string += self.prefix(0) + "Hold Time: " + str(message.hold_time) + "\n"
            string += self.prefix(0) + "BGP Identifier: " + str(BGPRoute.decimal_ip_to_string(message.identifier)) + "\n"

            # --- Optional Parameters
            string += self.prefix(0) + "Optional Parameters Length: " + str(message.optional_parameter_length) + " Bytes" + "\n"

            # Process optional parameters
            if message.optional_parameter_length > 0:
                string += self.prefix(0) + "Optional Parameters:" + "\n"

                for parameter in message.optional_parameter:
                    if parameter.type == BGPStatics.OPEN_CAPABILITY:
                        string += self.prefix(1) + "Parameter: Capability" + "\n"

                        # Process capabilities
                        for capability in parameter.capability_list:
                            string += self.prefix(2) + BGPTranslation.capability(capability.type) + "\n"

                    elif parameter.type == BGPStatics.OPEN_AUTHENTICATION:
                        string += self.prefix(1) + "Parameter: Authentication" + "\n"
                    elif parameter.type == BGPStatics.OPEN_RESERVED:
                        string += self.prefix(1) + "Parameter: Reserved" + "\n"

        if BGPStatics.MESSAGE_TYPE_UPDATE == message.type:
            # --- Divider for PCAP information
            string += self.prefix(-1) + "\n"

            # --- Update Message Sub-Type
            string += self.prefix(0) + "Update Message Sub-Type: " + BGPTranslation.update_subtype(message.subtype) + "\n"

            # --- Lengths
            string += self.prefix(0) + "Withdrawn Routes Length: " + str(message.withdrawn_routes_length) + " Bytes\n"
            string += self.prefix(0) + "Total Path Attribute Length: " + str(message.path_attributes_length) + " Bytes\n"


            # --- NLRI
            if len(message.nlri) > 0:
                string += self.prefix(0) + "Prefix (NLRI):" + "\n"

                # Process NLRI
                for route in message.nlri:
                    string += self.prefix(1) + str(route) + "\n"

            # --- Path Attributes
            if message.path_attributes_length > 0:

                # Process path attributes
                for attribute in message.path_attributes:
                    string += self.prefix(0) + "Path Attributes:" + "\n"

                    if attribute.type == BGPStatics.UPDATE_ATTRIBUTE_EXTENDED_COMMUNITIES:
                        # Extended Communities must be displayed in another way than other attributes
                        string += self.prefix(1) + BGPTranslation.path_attribute(attribute.type) + ":\n"

                        for community in attribute.extended_communities:
                            string += self.prefix(2) + str(community) + "\n"
                    else:
                        # We got a "normal" path attribute
                        string += self.prefix(1) + BGPTranslation.path_attribute(attribute.type) + ": " + str(attribute) + "\n"

            # --- Withdrawn Routes
            if message.withdrawn_routes_length > 0:
                string += self.prefix(0) + "Withdrawn Routes:" + "\n"

                # Process withdrawn routes
                for route in message.withdrawn_routes:
                    string += self.prefix(1) + str(route) + "\n"

        if BGPStatics.MESSAGE_TYPE_NOTIFICATION == message.type:
            pass

        if BGPStatics.MESSAGE_TYPE_ROUTE_REFRESH == message.type:
            pass

        if BGPStatics.MESSAGE_TYPE_RESERVED == message.type:
            pass

        # Return assembled string plus final line break
        return string + "\n"
Beispiel #12
0
    def apply(self, message):
        r = ""

        for f in self.fields:
            if f == self.FIELD_MESSAGE_TIMESTAMP:
                r += self.separator + str(
                    message.pcap_information.get_timestamp()[0]) + "." + str(
                        message.pcap_information.get_timestamp()[1])
            elif f == self.FIELD_MESSAGE_IP_SOURCE:
                r += self.separator + message.pcap_information.get_ip(
                ).get_source_string()
            elif f == self.FIELD_MESSAGE_IP_DESTINATION:
                r += self.separator + message.pcap_information.get_ip(
                ).get_destination_string()
            elif f == self.FIELD_MESSAGE_MAC_SOURCE:
                r += self.separator + message.pcap_information.get_mac(
                ).get_source_string()
            elif f == self.FIELD_MESSAGE_MAC_DESTINATION:
                r += self.separator + message.pcap_information.get_mac(
                ).get_destination_string()
            elif f == self.FIELD_MESSAGE_LENGTH:
                r += self.separator + str(message.length)
            elif f == self.FIELD_MESSAGE_TYPE:
                r += self.separator + BGPTranslation.message_type(message.type)
            elif f == self.FIELD_UPDATE_SUBTYPE:
                # We can only display this information if we are handling an UPDATE message
                if message.type == BGPStatics.MESSAGE_TYPE_UPDATE:
                    r += self.separator + BGPTranslation.update_subtype(
                        message.subtype)
                else:
                    r += self.separator
            elif f == self.FIELD_UPDATE_PATH_ATTRIBUTES_LENGTH:
                # We can only display this information if we are handling an UPDATE message
                if message.type == BGPStatics.MESSAGE_TYPE_UPDATE:
                    r += self.separator + str(message.path_attributes_length)
                else:
                    r += self.separator
            elif f == self.FIELD_UPDATE_WITHDRAWN_ROUTES_LENGTH:
                # We can only display this information if we are handling an UPDATE message
                if message.type == BGPStatics.MESSAGE_TYPE_UPDATE:
                    r += self.separator + str(message.withdrawn_routes_length)
                else:
                    r += self.separator
            elif f == self.FIELD_UPDATE_WITHDRAWN_ROUTES:
                # We can only display this information if we are handling an UPDATE message
                if message.type == BGPStatics.MESSAGE_TYPE_UPDATE:
                    if len(message.withdrawn_routes) > 0:
                        add = ""

                        for route in message.withdrawn_routes:
                            add += ";" + str(route)

                        # Skip first separator character
                        r += self.separator + add[1:]
                    else:
                        r += self.separator
                else:
                    r += self.separator
            elif f == self.FIELD_UPDATE_NLRI:
                # We can only display this information if we are handling an UPDATE message
                if message.type == BGPStatics.MESSAGE_TYPE_UPDATE:
                    if len(message.nlri) > 0:
                        add = ""

                        for route in message.nlri:
                            add += ";" + str(route)

                        # Skip first separator character
                        r += self.separator + add[1:]
                    else:
                        r += self.separator
                else:
                    r += self.separator
            elif f == self.FIELD_UPDATE_ATTRIBUTE_ORIGIN:
                # We can only display this information if we are handling an UPDATE message
                if message.type == BGPStatics.MESSAGE_TYPE_UPDATE:
                    if len(message.path_attributes) > 0:
                        for attribute in message.path_attributes:
                            # We found the correct path attribute
                            if isinstance(attribute, PathAttributeOrigin):
                                r += self.separator + str(attribute)
                                break
                    else:
                        r += self.separator
                else:
                    r += self.separator
            elif f == self.FIELD_UPDATE_ATTRIBUTE_AS_PATH:
                # We can only display this information if we are handling an UPDATE message
                if message.type == BGPStatics.MESSAGE_TYPE_UPDATE:
                    if len(message.path_attributes) > 0:
                        for attribute in message.path_attributes:
                            # We found the correct path attribute
                            if isinstance(attribute, PathAttributeASPath):
                                if len(attribute.path_segments) > 0:
                                    add = ""

                                    for segment in attribute.path_segments:
                                        add += ";" + str(segment)

                                    # Skip first separator
                                    r += self.separator + add[1:]
                                    break
                                else:
                                    r += self.separator
                                    break

                    else:
                        r += self.separator
                else:
                    r += self.separator
            elif f == self.FIELD_UPDATE_ATTRIBUTE_NEXT_HOP:
                # We can only display this information if we are handling an UPDATE message
                if message.type == BGPStatics.MESSAGE_TYPE_UPDATE:
                    if len(message.path_attributes) > 0:
                        for attribute in message.path_attributes:
                            # We found the correct path attribute
                            if isinstance(attribute, PathAttributeNextHop):
                                r += self.separator + str(attribute)
                                break
                    else:
                        r += self.separator
                else:
                    r += self.separator
            elif f == self.FIELD_UPDATE_ATTRIBUTE_COMMUNITIES:
                # We can only display this information if we are handling an UPDATE message
                if message.type == BGPStatics.MESSAGE_TYPE_UPDATE:
                    if len(message.path_attributes) > 0:
                        for attribute in message.path_attributes:
                            # We found the correct path attribute
                            if isinstance(attribute, PathAttributeCommunities):
                                if len(attribute.communities) > 0:
                                    add = ""
                                    for community in attribute.communities:
                                        add += ";" + str(community)

                                    r += self.separator + add[1:]
                                    break
                                else:
                                    r += self.separator
                    else:
                        r += self.separator
                else:
                    r += self.separator
            elif f == self.FIELD_UPDATE_ATTRIBUTE_EXTENDED_COMMUNITIES:
                # @todo Find a good way to display extended communities in just one line
                r += self.separator
            else:
                # No field match
                pass

        # Delete first tab
        return r[1:]
Beispiel #13
0
    def apply(self, message):

        # Basic data for every message type
        data = {
            "timestamp":
            str(message.pcap_information.get_timestamp()[0]) + "." +
            str(message.pcap_information.get_timestamp()[1]),
            "message_type":
            message.type,
            "message_type_string":
            BGPTranslation.message_type(message.type),
            "length":
            message.length,
            "source_mac":
            message.pcap_information.get_mac().get_source_string(),
            "destination_mac":
            message.pcap_information.get_mac().get_destination_string(),
            "source_ip":
            message.pcap_information.get_ip().get_source_string(),
            "destination_ip":
            message.pcap_information.get_ip().get_destination_string(),
            "message_data":
            None
        }

        # Handle specific message types that contain more information than added above
        # Currently we just need to add information to OPEN- and UPDATE-messages
        if message.type == BGPStatics.MESSAGE_TYPE_OPEN:
            message_data = {}
        elif message.type == BGPStatics.MESSAGE_TYPE_UPDATE:
            message_data = {
                "sub_type_string":
                BGPTranslation.update_subtype(message.subtype),
                "withdrawn_routes_length": message.withdrawn_routes_length,
                "path_attributes_length": message.path_attributes_length,
                "path_attributes": None,
                "withdrawn_routes": None,
                "nlri": None
            }

            path_attributes = []
            withdrawn_routes = []
            nlri = []

            # Add path attributes
            if len(message.path_attributes) > 0:
                for a in message.path_attributes:
                    path_attributes.append(a.json())

            # Add withdrawn routes
            if len(message.withdrawn_routes) > 0:
                for w in message.withdrawn_routes:
                    withdrawn_routes.append(str(w))

            # Add NLRI
            if len(message.nlri) > 0:
                for n in message.nlri:
                    nlri.append(str(n))

            # Assign to message data
            message_data["path_attributes"] = path_attributes
            message_data["withdrawn_routes"] = withdrawn_routes
            message_data["nlri"] = nlri

            # Assign message data to return data
            data["message_data"] = message_data

        return json.dumps(data)
Beispiel #14
0
 def json(self):
     return {
         "type": self.type,
         "type_string": BGPTranslation.path_attribute(self.type),
         "error": self.error,
     }