Skip to main content

Dos agentes snmp4j independientes en la misma jvm

Posted in

 Si queremos hacer dos agentes snmp4j independientes en la misma maquina virtual, con usuarios independientes, no podemos. La clase SecurityModels que es la que contiene la lista de usuarios, es un singleton. De hecho, si heredamos de BaseAgent, el modelo comenzará de cero cada vez que creemos un agente nuevo.

Para evitar esto, debemos sobreescribir el método initMessageDispatcher(), añadiendo el mismo código que el de la clase padre, pero no creando un nuevo USM cada vez, sino viendo si ya está o no creado dentro del SecurityModel para añadirle o no más usuarios. Algo como esto

@Override
protected void initMessageDispatcher() {
   dispatcher = new MessageDispatcherImpl();
   mpv3 = new MPv3(agent.getContextEngineID().getValue());

   if (null == SecurityModels.getInstance().getSecurityModel(
      new Integer32(SecurityModel.SECURITY_MODEL_USM))) {
              // No hay usuarios creados.
           usm = new USM(SecurityProtocols.getInstance(),       // SINGLETON !!
              agent.getContextEngineID(), updateEngineBoots());
   } else {
         // Ya habia usuarios creados
         usm = (USM) SecurityModels.getInstance().getSecurityModel(
         new Integer32(SecurityModel.SECURITY_MODEL_USM));
         for (UsmUserEntry userEntry : usm.getUserTable().getUserEntries()) {
            logger.info("user = " + userEntry.toString());
         }
    }
   SecurityModels.getInstance().addSecurityModel(usm);
   SecurityProtocols.getInstance().addDefaultProtocols();
   dispatcher.addMessageProcessingModel(new MPv1());
   dispatcher.addMessageProcessingModel(new MPv2c());
   dispatcher.addMessageProcessingModel(mpv3);
   initSnmpSession();
}