@Override public void setMaxRepetitions(int maxRepititions) { for (CollectionTracker child : m_children) { child.setMaxRepetitions(maxRepititions); } }
@Override public boolean isFinished() { for (CollectionTracker child : m_children) { if (!child.isFinished()) { return false; } } return true; }
protected void reportGenErr(String msg) { if (m_parent != null) { m_parent.reportGenErr(msg); } }
protected SnmpWalker(InetAddress address, String name, int maxVarsPerPdu, int maxRepetitions, int maxRetries, CollectionTracker tracker) { m_address = address; m_signal = new CountDownLatch(1); m_name = name; m_tracker = tracker; m_tracker.setMaxRepetitions(maxRepetitions); m_tracker.setMaxRetries(maxRetries); m_maxVarsPerPdu = maxVarsPerPdu; }
protected void buildAndSendNextPdu() throws SnmpException { if (m_tracker.isFinished()) { handleDone(); } else { m_pduBuilder.reset(); m_responseProcessor = m_tracker.buildNextPdu(m_pduBuilder); sendNextPdu(m_pduBuilder); } }
@Override public List<WalkRequest> getWalkRequests() { final List<WalkRequest> walkRequests = new ArrayList<>(); for (int k = 0; k < m_children.length; k++) { for (WalkRequest walkRequest : m_children[k].getWalkRequests()) { // Add the index to the correlation id, so we know which child the responses // should be associated with CorrelationIdUtils.pushIndexToCorrelationId(walkRequest, k); walkRequests.add(walkRequest); } } return walkRequests; }
@Override public void handleWalkResponses(List<WalkResponse> responses) { // Group the responses by index Map<Integer, List<WalkResponse>> responsesByCorrelationId = new HashMap<>(); for (int i = 0; i < m_children.length; i++) { // Add an empty list to every index to make sure we call handleWalkResponses() on every child responsesByCorrelationId.put(i, new ArrayList<>()); } responses.stream().forEach(r -> CorrelationIdUtils.popIndexFromCollerationId(r, responsesByCorrelationId)); // Store the results in the appropriate child trackers responsesByCorrelationId.entrySet().stream() .forEach(entry -> { int index = entry.getKey(); if (index < 0 || index > (m_children.length -1)) { // This shouldn't happen, but just in case... LOG.warn("Invalid index on response: {}, {}, {}", index, entry.getValue(), m_children.length); } else { m_children[index].handleWalkResponses(entry.getValue()); } }); } }
@Override public boolean processErrors(int errorStatus, int errorIndex) throws SnmpException { //LOG.trace("processErrors: errorStatus={}, errorIndex={}", errorStatus, errorIndex); final ErrorStatus status = ErrorStatus.fromStatus(errorStatus); // handle special cases first if (status == ErrorStatus.TOO_BIG) { int maxVarsPerPdu = m_pduBuilder.getMaxVarsPerPdu(); if (maxVarsPerPdu <= 1) { throw new SnmpException("Unable to handle tooBigError when maxVarsPerPdu = "+maxVarsPerPdu); } m_pduBuilder.setMaxVarsPerPdu(maxVarsPerPdu/2); m_tracker.reportTooBigErr("Reducing maxVarsPerPDU for this request."); return true; } else if (status.isFatal()) { final ErrorStatusException ex = new ErrorStatusException(status); m_tracker.reportFatalErr(ex); throw ex; } else { return processChildError(errorStatus, errorIndex); } } }
protected void reportNoSuchNameErr(String msg) { if (m_parent != null) { m_parent.reportNoSuchNameErr(msg); } }
public AggregateTracker(Collectable[] children, CollectionTracker parent) { super(parent); m_children = new CollectionTracker[children.length]; for (int i = 0; i < m_children.length; i++) { m_children[i] = children[i].getCollectionTracker(); m_children[i].setParent(this); } }
protected void reportTooBigErr(String msg) { if (m_parent != null) { m_parent.reportTooBigErr(msg); } }
protected void buildAndSendNextPdu() throws IOException { if (m_tracker.isFinished()) { handleDone(); } else { m_pduBuilder.reset(); m_responseProcessor = m_tracker.buildNextPdu(m_pduBuilder); sendNextPdu(m_pduBuilder); } }
private static List<SnmpWalkRequestDTO> buildWalkRequests(CollectionTracker tracker) { return tracker.getWalkRequests().stream() .map(req -> { SnmpWalkRequestDTO walkRequest = new SnmpWalkRequestDTO(); walkRequest.setCorrelationId(req.getCorrelationId()); walkRequest.setOids(Collections.singletonList(req.getBaseOid())); walkRequest.setMaxRepetitions(req.getMaxRepetitions()); walkRequest.setInstance(req.getInstance()); return walkRequest; }).collect(Collectors.toList()); }
@Override protected CollectionTracker processResponse(SnmpMultiResponseDTO response) { final List<WalkResponse> responses = response.getResponses().stream() .map(res -> new WalkResponse(res.getResults(), res.getCorrelationId())) .collect(Collectors.toList()); m_tracker.handleWalkResponses(responses); return m_tracker; } }
protected void reportNoSuchNameErr(String msg) { if (m_parent != null) { m_parent.reportNoSuchNameErr(msg); } }
public AggregateTracker(Collectable[] children, CollectionTracker parent) { super(parent); m_children = new CollectionTracker[children.length]; for (int i = 0; i < m_children.length; i++) { m_children[i] = children[i].getCollectionTracker(); m_children[i].setParent(this); } }
protected void reportTooBigErr(String msg) { if (m_parent != null) { m_parent.reportTooBigErr(msg); } }
for (int i = 0; i < m_children.length && count < maxVars; i++) { CollectionTracker childTracker = m_children[i]; if (!childTracker.isFinished()) { ChildTrackerPduBuilder childBuilder = new ChildTrackerPduBuilder(maxVars-count); ResponseProcessor rp = childTracker.buildNextPdu(childBuilder); childBuilder.setResponseProcessor(rp); builders.add(childBuilder);