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
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)
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]])
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)
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)
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]])
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
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)
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)
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)
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)
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)
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
def callback(self, pdu): results = netsnmp.getResult(pdu) for oid, value in results: print(oid, repr(value)) reactor.stop()