Пример #1
0
    def convertPacketToPython(self, addr, pdu):
        """
        Store the raw packet for later examination and troubleshooting.

        @param addr: packet-sending host's IP address and port
        @type addr: (string, number)
        @param pdu: raw packet
        @type pdu: binary
        @return: Python FakePacket object
        @rtype: Python FakePacket object
        """
        packet = FakePacket()
        packet.version = pdu.version
        packet.host = addr[0]
        packet.port = addr[1]
        packet.variables = netsnmp.getResult(pdu)
        packet.community = ''
        packet.enterprise_length = pdu.enterprise_length

        # Here's where we start to encounter differences between packet types
        if pdu.version == SNMPv1:
            # SNMPv1 can't be received via IPv6
            packet.agent_addr =  [pdu.agent_addr[i] for i in range(4)]
            packet.trap_type = pdu.trap_type
            packet.specific_type = pdu.specific_type
            packet.enterprise = self.getEnterpriseString(pdu)
            packet.community = self.getCommunity(pdu)

        return packet
Пример #2
0
    def convertPacketToPython(self, addr, pdu):
        """
        Store the raw packet for later examination and troubleshooting.

        @param addr: packet-sending host's IP address and port
        @type addr: (string, number)
        @param pdu: raw packet
        @type pdu: binary
        @return: Python FakePacket object
        @rtype: Python FakePacket object
        """
        packet = FakePacket()
        packet.version = pdu.version
        packet.host = addr[0]
        packet.port = addr[1]
        packet.variables = netsnmp.getResult(pdu)
        packet.community = ''
        packet.enterprise_length = pdu.enterprise_length

        # Here's where we start to encounter differences between packet types
        if pdu.version == SNMPv1:
            # SNMPv1 can't be received via IPv6
            packet.agent_addr = [pdu.agent_addr[i] for i in range(4)]
            packet.trap_type = pdu.trap_type
            packet.specific_type = pdu.specific_type
            packet.enterprise = self.getEnterpriseString(pdu)
            packet.community = self.getCommunity(pdu)

        return packet
Пример #3
0
 def callback(self, pdu):
     results = netsnmp.getResult(pdu)
     oid, value = results[0]
     if self.lastOid != None and oid <= self.lastOid:
         self.stop()
     else:
         self.results.append((oid, value))
         self.lastOid = oid
         self.walk(oid)
Пример #4
0
 def callback(self, pdu):
     results = netsnmp.getResult(pdu)
     for oid, value in results:
         if oid[:len(self.root)] != self.root:
             self.stop("table end")
             return
         print('.'.join(map(str, oid)), ':', repr(value))
     print()
     if not results:
         self.stop("empty result")
     else:
         self.getbulk(0, self.max, [results[-1][0]])
Пример #5
0
    def getResult(self, pdu):
        """
        Get the values from the PDU or replayed packet

        @param pdu: raw packet
        @type pdu: binary
        @return: variables from the PDU or Fake packet
        @rtype: dictionary
        """
        if hasattr(pdu, "fake"):  # Replaying a packet
            return pdu.variables
        return netsnmp.getResult(pdu)
Пример #6
0
    def sgetnext(self, root):
        req = self._create_request(SNMP_MSG_GETNEXT)
        oid = mkoid(root)
        lib.snmp_add_null_var(req, oid, len(oid))

        response = netsnmp_pdu_p()
        if lib.snmp_synch_response(self.sess, req, byref(response)) == 0:
            _raise_on_protocol_error(response)
            result = dict(getResult(response.contents))
            lib.snmp_free_pdu(response)
            return result
        else:
            _raise_on_error(self.sess.contents.s_snmp_errno)
Пример #7
0
    def callback(self, pdu):
        results = netsnmp.getResult(pdu)
        for oid, result in results:
            if oid in self._currentTarget:
                self._currentTarget.insert(oid, result)
            else:
                self.next_target()
                return

        if not results:
            self.next_target()
        else:
            self.getbulk(0, self.max_bulk, [results[-1][0]])
Пример #8
0
    def getResult(self, pdu):
        """
        Get the values from the PDU or replayed packet

        @param pdu: raw packet
        @type pdu: binary
        @return: variables from the PDU or Fake packet
        @rtype: dictionary
        """
        if hasattr(pdu, "fake"): # Replaying a packet
            variables = pdu.variables
        else:
            variables = netsnmp.getResult(pdu)
        return variables
Пример #9
0
    def sset(self, oid, data_type, value):
        req = self._create_request(SNMP_MSG_SET)
        oid = mkoid(oid)

        converter = CONVERTER_MAP[data_type]
        data, size = converter(value)
        lib.snmp_pdu_add_variable(req, oid, len(oid), data_type, data, size)

        response = netsnmp_pdu_p()
        if lib.snmp_synch_response(self.sess, req, byref(response)) == 0:
            _raise_on_protocol_error(response)
            result = dict(getResult(response.contents))
            lib.snmp_free_pdu(response)
            return result
        else:
            _raise_on_error(self.sess.contents.s_snmp_errno)
Пример #10
0
    def sgetbulk(self, nonrepeaters, maxrepetitions, oids):
        req = self._create_request(SNMP_MSG_GETBULK)
        req = cast(req, POINTER(netsnmp_pdu))
        req.contents.errstat = nonrepeaters
        req.contents.errindex = maxrepetitions
        for oid in oids:
            oid = mkoid(oid)
            lib.snmp_add_null_var(req, oid, len(oid))

        response = netsnmp_pdu_p()
        if lib.snmp_synch_response(self.sess, req, byref(response)) == 0:
            _raise_on_protocol_error(response)
            result = getResult(response.contents)
            lib.snmp_free_pdu(response)
            return result
        else:
            _raise_on_error(self.sess.contents.s_snmp_errno)
Пример #11
0
    def sset(self, varbinds):
        """:type varbinds: list[PDUVarbinds]"""
        req = self._create_request(SNMP_MSG_SET)
        for varbind in varbinds:
            oid = mkoid(varbind.oid)
            converter = CONVERTER_MAP[varbind.type]
            data, size = converter(varbind.value)
            lib.snmp_pdu_add_variable(req, oid, len(oid), varbind.type, data, size)

        response = netsnmp_pdu_p()
        if lib.snmp_synch_response(self.sess, req, byref(response)) == 0:
            _raise_on_protocol_error(response)
            result = dict(getResult(response.contents, self._log))
            lib.snmp_free_pdu(response)
            return result
        else:
            _raise_on_error(self.sess.contents.s_snmp_errno)
Пример #12
0
    def callback(self, src, pdu):
        """Handles trap callbacks from a TrapSession"""
        if not self._client_callback:
            return

        agent_addr = None
        generic_type = None
        community = pdu.community[:pdu.community_len]

        varbinds = netsnmp.getResult(pdu, _logger)

        if pdu.version == netsnmp.SNMP_VERSION_1:
            version = 1
            agent_addr = ".".join(str(d) for d in pdu.agent_addr)
            snmp_trap_oid, generic_type = transform_trap_type(pdu)
            uptime = pdu.time
        elif pdu.version == netsnmp.SNMP_VERSION_2c:
            version = 2
            _time_oid, time_val = varbinds.pop(0)
            _trap_oid_oid, trap_oid = varbinds.pop(0)

            uptime = time_val
            snmp_trap_oid = OID(trap_oid)
        else:
            raise UnsupportedSnmpVersionError(pdu.version)

        # Dump varbinds to debug log
        _logger.debug("varbinds: %r", varbinds)
        # Add remaining varbinds to dict
        varbind_dict = dict(
            (str(OID(oid)), value_to_str(value)) for oid, value in varbinds)

        trap = SNMPTrap(
            str(src),
            agent_addr or str(src),
            None,
            generic_type,
            str(snmp_trap_oid),
            uptime,
            community,
            version,
            varbind_dict,
        )
        self._client_callback(trap)
Пример #13
0
    def callback(self, src, pdu):
        """Handles trap callbacks from a TrapSession"""
        if not self._client_callback:
            return

        agent_addr = None
        generic_type = None
        community = pdu.community[:pdu.community_len]

        varbinds = netsnmp.getResult(pdu)

        if pdu.version == netsnmp.SNMP_VERSION_1:
            version = 1
            agent_addr = ".".join(str(d) for d in pdu.agent_addr)
            snmp_trap_oid, generic_type = transform_trap_type(pdu)
            uptime = pdu.time
        elif pdu.version == netsnmp.SNMP_VERSION_2c:
            version = 2
            _time_oid, time_val = varbinds.pop(0)
            _trap_oid_oid, trap_oid = varbinds.pop(0)

            uptime = time_val
            snmp_trap_oid = OID(trap_oid)
        else:
            raise UnsupportedSnmpVersionError(pdu.version)

        # Dump varbinds to debug log
        _logger.debug("varbinds: %r", varbinds)
        # Add remaining varbinds to dict
        varbind_dict = dict((str(OID(oid)), value_to_str(value))
                            for oid, value in varbinds)

        trap = SNMPTrap(str(src), agent_addr or str(src), None, generic_type,
                        str(snmp_trap_oid), uptime, community, version,
                        varbind_dict)
        self._client_callback(trap)
Пример #14
0
    def callback(self, pdu):
        ts = time.time()

        # Is it a trap?
        if pdu.sessid != 0: 
            print 'pdu.sessid != 0'
            return


        if pdu.version not in [ 0, 1 ]:
            print "Unable to handle trap version:", pdu.version
            return

        # What address did it come from?
        #   for now, we'll make the scary assumption this data is a
        #   sockaddr_in
        transport = cast(pdu.transport_data, POINTER(sockaddr_in))
        if not transport: 
            print 'transport not defined'
            return
        transport = transport.contents

        #   Just to make sure, check to see that it is type AF_INET
        if transport.family != socket.AF_INET: 
            print 'transport.family != socket.AF_INET'
            return

        # get the address out as ( host-ip, port)
        addr = [bp2ip(transport.addr),
                transport.port[0] << 8 | transport.port[1]]

        print "Received packet from %s at port %s" % (addr[0], addr[1])

        source = {\
            'type': 'snmp-trap', \
            'protocol': 'snmp', \
            'ip_host': addr[0], \
            'ip_port': addr[1] \
        }

        result = netsnmp.getResult(pdu)        

        #for oid, value in result:
        #    oid = '.'.join(map(str, oid))
        #    print translateOid(oid), value
        msg_content = {}
        for oid, value in result:
            oid = '.'.join(map(str, oid))
            msg_content[oid] = value
            print oid, value

        msg_type = str(pdu.command)
        if pdu.command == SNMP_MSG_TRAP:
            msg_type = 'SNMP_MSG_TRAP'
        elif pdu.command == SNMP_MSG_TRAP2:
            msg_type = 'SNMP_MSG_TRAP2'
        elif pdu.command == SNMP_MSG_INFORM:
            msg_type = 'SNMP_MSG_INFORM'

        # Create Message
        msg = message.Message(MQ_SNMP_TRAP_ROUTING_KEY, msg_content, ts, source, msg_type)
        # Send Message to Message Broker
        msg.send(mq_transport, MQ_FM_INPUT)
        print 'Sent to Message Broker.'
        print
Пример #15
0
 def callback(self, pdu):
     results = netsnmp.getResult(pdu)
     for oid, value in results:
         print(oid, repr(value))
     reactor.stop()