def bulkwalk(self, host, oids, callback, errback): """Gathers all rows for the given objects in a table. A single SNMP GETBULK is not guaranteed to get all the objects referred to by the OID in a table. `bulkwalk` implements a simple mechanism for gathering all rows for the given OIDs using GETBULK messages multiple times if necessary.""" try: session = self.sessions[host] except KeyError: raise PollerError("no session defined for %s" % host) oids = [o for o in oids] # make a copy of the oids list oid = oids.pop(0) #print "oid >%s<" % (oid) noid = str_to_oid(oid) # avoid the noid! if noid is None: # XXX tell someone: raise exception? self.log.error("unable to resolve OID: %s" % oid) return noid = tuple(noid) pollreq = PollRequest('bulkwalk', callback, errback, walk_oid=noid, additional_oids=oids) reqid = self.sessions[host].async_getbulk( 0, self.maxrepetitions, [oid]) self.reqmap[reqid] = pollreq
def bulkwalk(self, host, oids, callback, errback): """Gathers all rows for the given objects in a table. A single SNMP GETBULK is not guaranteed to get all the objects referred to by the OID in a table. `bulkwalk` implements a simple mechanism for gathering all rows for the given OIDs using GETBULK messages multiple times if necessary.""" try: session = self.sessions[host] except KeyError: raise PollerError("no session defined for %s" % host) oids = [o for o in oids] # make a copy of the oids list oid = oids.pop(0) #print "oid >%s<" % (oid) noid = str_to_oid(oid) # avoid the noid! if noid is None: # XXX tell someone: raise exception? self.log.error("unable to resolve OID: %s" % oid) return noid = tuple(noid) pollreq = PollRequest('bulkwalk', callback, errback, walk_oid=noid, additional_oids=oids) reqid = self.sessions[host].async_getbulk(0, self.maxrepetitions, [oid]) self.reqmap[reqid] = pollreq
def _callback(self, manager, slot, session, reqid, r): """_callback manages reponses, performing coalescing for bulkwalks.""" pollreq = self.reqmap[reqid] #print "_callback yo!", pollreq.type, len(r), type(r) #for d in r: # print " %s %s" % (oid_to_str(d[0]), str(d[1])) if len(r) == 0: #print "_callback NO DATA!!!?!?!?! WTF?!?!?!?!" return if pollreq.type != 'bulkwalk': pollreq.callback(r) #print "_callback wtf!" else: last = '' done = False for last, v in r: if last[:len(pollreq.walk_oid)] != pollreq.walk_oid: done = True break soid = oid_to_str(last).split('::')[-1] pollreq.results.append((soid, v)) if done: #print '_callback bulkwalk done', last if pollreq.additional_oids: #print "MORE", pollreq.additional_oids oid = pollreq.additional_oids.pop(0) #print "2>%s<" % oid pollreq.walk_oid = tuple(str_to_oid(oid)) new_reqid = self.sessions[session].async_getbulk(0, self.maxrepetitions, [oid]) self.reqmap[new_reqid] = pollreq else: pollreq.callback(pollreq.results) else: #print '_callback bulkwalk not done', last, oid_to_str(last) # get more data new_reqid = self.sessions[session].async_getbulk(0, self.maxrepetitions, [last]) self.reqmap[new_reqid] = pollreq del self.reqmap[reqid]
def _callback(self, manager, slot, session, reqid, r): """_callback manages reponses, performing coalescing for bulkwalks.""" pollreq = self.reqmap[reqid] #print "_callback yo!", pollreq.type, len(r), type(r) #for d in r: # print " %s %s" % (oid_to_str(d[0]), str(d[1])) if len(r) == 0: #print "_callback NO DATA!!!?!?!?! WTF?!?!?!?!" return if pollreq.type != 'bulkwalk': pollreq.callback(r) #print "_callback wtf!" else: last = '' done = False for last, v in r: if last[:len(pollreq.walk_oid)] != pollreq.walk_oid: done = True break soid = oid_to_str(last).split('::')[-1] pollreq.results.append((soid, v)) if done: #print '_callback bulkwalk done', last if pollreq.additional_oids: #print "MORE", pollreq.additional_oids oid = pollreq.additional_oids.pop(0) #print "2>%s<" % oid pollreq.walk_oid = tuple(str_to_oid(oid)) new_reqid = self.sessions[session].async_getbulk( 0, self.maxrepetitions, [oid]) self.reqmap[new_reqid] = pollreq else: pollreq.callback(pollreq.results) else: #print '_callback bulkwalk not done', last, oid_to_str(last) # get more data new_reqid = self.sessions[session].async_getbulk( 0, self.maxrepetitions, [last]) self.reqmap[new_reqid] = pollreq del self.reqmap[reqid]