def walk(self, host, starting_oid=None, port=161, timeout=10, max_initial_failures=1, max_consequtive_failures=3): """Walks the MIB from the given starting oid, returns a list of (oid, object) tuples""" # TODO: perhaps an OrderedDict is more appropriate? responses = [] attempts_remaining = max_initial_failures datagram = SNMPDatagram(pdu=GetNextRequest.from_oid(starting_oid)) while attempts_remaining: future = self.sendto(datagram, host, port) try: response = yield from asyncio.wait_for(future, timeout=timeout) except asyncio.TimeoutError: logging.debug("Timeout for GetNextRequest(%s, %s)", host, datagram.pdu.oid) if isinstance(attempts_remaining, int): attempts_remaining -= 1 else: assert isinstance(response.pdu, GetResponse) attempts_remaining = max_consequtive_failures logging.debug("Response from host %s: %s=%s", host, response.pdu.oid, response.pdu.response) if datagram.pdu.oid == response.pdu.oid: # end of mib condition break else: responses.append((response.pdu.oid, response.pdu.response)) pdu = GetNextRequest.from_oid(response.pdu.oid) datagram = SNMPDatagram(pdu=pdu) # else: # raise ExceededRetries('Maximum retries exceeded') return responses
def get_next(self, host, oid=system, port=161): """Creates GetNextResponse PDU / datagram and returns a Future""" pdu = GetNextRequest.from_oid(oid) datagram = SNMPDatagram(pdu=pdu) return self.sendto(datagram, host, port)