Exemple #1
0
    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
Exemple #2
0
    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
Exemple #3
0
    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]
Exemple #4
0
    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]