⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 commandprocessor.java

📁 用snmp4j实现的agent,代码比较多,但是很值得一看,尤其是对于要用SNMP监控信息的编程者,可以仔细研究一下里面的代码.
💻 JAVA
📖 第 1 页 / 共 3 页
字号:

  protected void finalizeRequest(CommandResponderEvent command, Request req,
                                 MOServer server) {
    if (req.isComplete()) {
      requestList.remove(req);
      // send response
      sendResponse(command, (PDU)req.getResponse());
      if (server != null) {
        release(server, req);
      }
    }
  }

  protected void release(MOServer server, Request req) {
    for (Iterator it = req.iterator(); it.hasNext();) {
      SubRequest sreq = (SubRequest)it.next();
      if (sreq.getTargetMO() != null) {
        server.unlock(req, sreq.getTargetMO());
      }
    }
  }

  protected void sendResponse(CommandResponderEvent requestEvent,
                              PDU response) {
    MessageDispatcher disp = requestEvent.getMessageDispatcher();
    try {
      if (response.getBERLength() > requestEvent.getMaxSizeResponsePDU()) {
        // response is tooBig
        if (response.getType() != PDU.REPORT) {
          if (requestEvent.getPDU().getType() == PDU.GETBULK) {
            while ((response.size() > 0) &&
                   (response.getBERLength() >
                    requestEvent.getMaxSizeResponsePDU())) {
              response.trim();
            }
          }
          else {
            response.clear();
            response.setRequestID(requestEvent.getPDU().getRequestID());
            response.setErrorStatus(PDU.tooBig);
          }
        }
        if (response.getBERLength() > requestEvent.getMaxSizeResponsePDU()) {
          fireIncrementCounter(new CounterEvent(this,
                                                SnmpConstants.snmpSilentDrops));
          return;
        }
      }
      StatusInformation status = new StatusInformation();
      requestEvent.getStateReference().
          setTransportMapping(requestEvent.getTransportMapping());
      disp.returnResponsePdu(requestEvent.getMessageProcessingModel(),
                             requestEvent.getSecurityModel(),
                             requestEvent.getSecurityName(),
                             requestEvent.getSecurityLevel(),
                             response,
                             requestEvent.getMaxSizeResponsePDU(),
                             requestEvent.getStateReference(),
                             status);
    }
    catch (MessageException ex) {
      logger.error("Failed to send response to request "+requestEvent, ex);
    }
  }

  protected void setAuthorizationError(Request req, int vacmStatus) {
    if (req.size() > 0) {
      SubRequest sreq = (SubRequest) req.iterator().next();
      sreq.getStatus().setErrorStatus(PDU.authorizationError);
    }
    else {
      req.setErrorStatus(PDU.authorizationError);
    }
  }

  public void addPduHandler(RequestHandler handler) {
    pduHandler.add(handler);
  }

  public void removePduHandler(RequestHandler handler) {
    pduHandler.remove(handler);
  }

  public void addMOServer(MOServer server) {
    moServers.add(server);
  }

  public void removeMOServer(MOServer server) {
    moServers.remove(server);
  }

  public MOServer getServer(OctetString context) {
    for (int i=0; i<moServers.size(); i++) {
      MOServer s = (MOServer)moServers.get(i);
      if (s.isContextSupported(context)) {
        return s;
      }
    }
    return null;
  }

  public TemporaryList getRequestList() {
    return requestList;
  }

  public NotificationOriginator getNotificationOriginator() {
    return notificationOriginator;
  }

  public ProxyMap getProxyForwarder() {
    return proxyForwarder;
  }

  public CoexistenceInfoProvider getCoexistenceProvider() {
    return coexistenceProvider;
  }


  class Command implements WorkerTask {

    private CommandResponderEvent request;
    private CoexistenceInfo cinfo;

    public Command(CommandResponderEvent event, CoexistenceInfo cinfo) {
      this.request = event;
      this.cinfo = cinfo;
    }

    public void run() {
      dispatchCommand(request, cinfo);
    }

    public void terminate() {
    }

    public void join() throws InterruptedException {
    }

    public void interrupt() {
    }
  }

  class ProxyCommand implements WorkerTask {

    private ProxyForwardRequest request;
    private ProxyForwarder forwarder;

    public ProxyCommand(ProxyForwarder forwarder, ProxyForwardRequest event) {
      this.forwarder = forwarder;
      this.request = event;
    }

    public void run() {
      if (forwarder.forward(request)) {
        PDU response = request.getResponsePDU();
        if (response != null) {
          sendResponse(request.getCommandEvent(), response);
        }
      }
      else if (request.getProxyType() != ProxyForwarder.PROXY_TYPE_NOTIFY) {
        // proxy drop
        CounterEvent cevent = new CounterEvent(this,
                                               SnmpConstants.snmpProxyDrops);
        fireIncrementCounter(cevent);
        if (request.getCommandEvent().getMessageProcessingModel() == MPv3.ID) {
          ScopedPDU reportPDU = new ScopedPDU();
          reportPDU.setType(PDU.REPORT);
          reportPDU.setContextEngineID(request.getContextEngineID());
          reportPDU.setContextName(request.getContext());
          reportPDU.add(new VariableBinding(SnmpConstants.snmpProxyDrops,
                                            cevent.getCurrentValue()));
          sendResponse(request.getCommandEvent(), reportPDU);
        }
      }
    }

    public void terminate() {
      // we cannot terminate (gracefully) this task while it is being executed
    }

    public void join() throws InterruptedException {
    }

    public void interrupt() {
    }
  }

  protected OctetString getViewName(CommandResponderEvent req,
                                    CoexistenceInfo cinfo,
                                    int viewType) {
    OctetString viewName =
        vacm.getViewName(cinfo.getContextName(),
                         cinfo.getSecurityName(),
                         req.getSecurityModel(),
                         req.getSecurityLevel(),
                         viewType);
    return viewName;
  }

  protected void processNextSubRequest(Request request, MOServer server,
                                       OctetString context,
                                       SubRequest sreq)
      throws NoSuchElementException
  {
    // We can be sure to have a default context scope here because
    // the inner class SnmpSubRequest creates it!
    DefaultMOContextScope scope = (DefaultMOContextScope) sreq.getScope();
    MOQuery query = sreq.getQuery();
    if (query == null) {
      query = new VACMQuery(context,
                            scope.getLowerBound(),
                            scope.isLowerIncluded(),
                            scope.getUpperBound(),
                            scope.isUpperIncluded(),
                            request.getViewName());
      sreq.setQuery(query);
    }
    while (!sreq.getStatus().isProcessed()) {
      ManagedObject mo = server.lookup(query);
      if (mo == null) {
        if (logger.isDebugEnabled()) {
          logger.debug("EndOfMibView at scope="+scope+" and query "+query);
        }
        sreq.getVariableBinding().setVariable(Null.endOfMibView);
        sreq.getStatus().setPhaseComplete(true);
        continue;
      }
      try {
        if (logger.isDebugEnabled()) {
          logger.debug("Processing NEXT query "+query+" with "+mo+
                       " sub-request with index "+sreq.getIndex());
        }
        if ((!mo.next(sreq)) ||
             ((request.getMessageProcessingModel() == MPv1.ID) &&
              (sreq.getVariableBinding().getSyntax() ==
               SMIConstants.SYNTAX_COUNTER64))) {
          sreq.getVariableBinding().setVariable(Null.instance);
          scope.substractScope(mo.getScope());
          // don't forget to update VACM query:
          query.substractScope(mo.getScope());
        }
      }
      catch (Exception moex) {
        if (logger.isDebugEnabled()) {
          moex.printStackTrace();
        }
        logger.error("Exception occurred while executing NEXT query: "+
                     moex.getMessage(), moex);
        if (sreq.getStatus().getErrorStatus() == PDU.noError) {
          sreq.getStatus().setErrorStatus(PDU.genErr);
        }
        if (SNMP4JSettings.isFowardRuntimeExceptions()) {
          throw new RuntimeException(moex);
        }
      }
    }
  }

  public synchronized void addCounterListener(CounterListener l) {
    if (counterListeners == null) {
      counterListeners = new Vector(2);
    }
    counterListeners.add(l);
  }

  public synchronized void removeCounterListener(CounterListener l) {
    if (counterListeners != null) {
      counterListeners.remove(l);
    }
  }

  protected void fireIncrementCounter(CounterEvent event) {
    if (counterListeners != null) {
      Vector listeners = counterListeners;
      int count = listeners.size();
      for (int i = 0; i < count; i++) {
        ((CounterListener) listeners.elementAt(i)).incrementCounter(event);
      }
    }
  }

  private static void initRequestPhase(Request request) {
    if (request.getPhase() == Request.PHASE_INIT) {
      request.nextPhase();
    }
  }

  class GetNextHandler implements RequestHandler {

    public void processPdu(Request request, MOServer server) {
      initRequestPhase(request);
      OctetString context = request.getContext();
      try {
        SubRequestIterator it = (SubRequestIterator) request.iterator();
        while (it.hasNext()) {
          SubRequest sreq =  it.nextSubRequest();
          processNextSubRequest(request, server, context, sreq);
        }
      }
      catch (NoSuchElementException nsex) {
        if (logger.isDebugEnabled()) {
          nsex.printStackTrace();
        }
        logger.error("SubRequest not found");
        request.setErrorStatus(PDU.genErr);
      }
    }


    public boolean isSupported(int pduType) {
      return (pduType == PDU.GETNEXT);
    }

  }

  class SetHandler implements RequestHandler {

    public void prepare(OctetString context,
                        Request request, MOServer server) {
      try {
        SubRequestIterator it = (SubRequestIterator) request.iterator();
        while ((!request.isPhaseComplete()) && (it.hasNext())) {
          SubRequest sreq =  it.nextSubRequest();
          if (sreq.isComplete()) {
            continue;
          }
          MOScope scope = sreq.getScope();
          MOQuery query = sreq.getQuery();
          if (query == null) {
            // create a query for write access
            query = new VACMQuery(context,
                                  scope.getLowerBound(),
                                  scope.isLowerIncluded(),
                                  scope.getUpperBound(),
                                  scope.isUpperIncluded(),
                                  request.getViewName());
            sreq.setQuery(query);
          }
          if (!query.getScope().isCovered(
              new DefaultMOContextScope(context, scope))) {
            sreq.getStatus().setErrorStatus(PDU.noAccess);
          }
          else {
            ManagedObject mo = server.lookup(query);
            if (mo == null) {
              if ((query instanceof VACMQuery) &&
                  (!((VACMQuery)query).isAccessAllowed(scope.getLowerBound()))){
                sreq.getStatus().setErrorStatus(PDU.noAccess);
              }
              else {
                sreq.getStatus().setErrorStatus(PDU.notWritable);
              }
              break;
            }
            sreq.setTargetMO(mo);
            server.lock(sreq.getRequest(), mo);
            try {
              mo.prepare(sreq);
            }
            catch (Exception moex) {
              logger.error("Set request "+request+" failed with exception",
                           moex);
              if (sreq.getStatus().getErrorStatus() == PDU.noError) {
                sreq.getStatus().setErrorStatus(PDU.genErr);
              }
              if (SNMP4JSettings.isFowardRuntimeExceptions()) {
                throw new RuntimeException(moex);
              }
            }
          }
        }
      }
      catch (NoSuchElementException nsex) {
        if (logger.isDebugEnabled()) {
          nsex.printStackTrace();
        }
        logger.error("Cannot find sub-request: ", nsex);
        request.setErrorStatus(PDU.genErr);
      }
    }

    public void processPdu(Request request, MOServer server) {
      OctetString context = request.getContext();
      try {
        while (request.getPhase() < Request.PHASE_2PC_CLEANUP) {
          int phase = request.nextPhase();
          switch (phase) {
            case Request.PHASE_2PC_PREPARE: {
              prepare(context, request, server);
              break;
            }

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -