Search code examples
javasnmp4j

How to register a listener on a OID / Managed Object using SNMP4J to act on set or get requests the agent receives?


I need to implement a basic snmp agent into my application. This agent should be able to answer get and set requests from snmp browsers on my own OID's. Since most examples for snmp4j are quite old and use the "extend the org.snmp4j.agent.BaseAgent.classapproach" there are of little use.

Therefore tried to understand and strip down the org.snmp4j.agent.example.SampleAgentincluded inside the snmp4j-agent-3.2.1.jar. I managed to get an example working with just the mandatory MIB's ( i at least think they are required because the source of the AgentConfigManager states in a comment they are mandatory snmpv2MIB, snmpMpdMib, targetMIB, communityMIB, notificationMIB, frameworkMIB, usmMIB, vacmMIB, tlsTmMib ) provided by the sample config file.

I than added a custom OID to query to the agend using the following code


    MOServer server = new DefaultMOServer();
    MOServer[] moServers = new MOServer[]{server};
    ...
    AgentConfigManager agent = new AgentConfigManager(new OctetString(MPv3.createLocalEngineID()),
                    messageDispatcher,
                    null,
                    moServers,
                    ThreadPool.create("SampleAgent", 3),
                    configurationFactory, 
                    new DefaultMOPersistenceProvider(moServers, configFile),
                    new EngineBootsCounterFile(bootCounterFile), null, dhKickstartParameters);
    ...
    agent.initialize();
    ...

    server.register(new MOScalar(new OID("1.someIODshere.0"), MOAccessImpl.ACCESS_READ_ONLY, new OctetString("object 1")), null);

Now i'm missing a way to intercept get or set requests from snmp managers / browsers to return a dynamic value or change the program behavior according to the request.

I kind of expect to be able to bind a kind of event listener to this OID to get notified on requests / changes.

How to watch an OID?


Solution

  • I found it. I was looking at the wrong place. I thought a had to add a listener to the agent, but instead i have to add the listener to the server.

    server.addLookupListener(new MOServerLookupListener() {
        @Override
        public void lookupEvent(MOServerLookupEvent event) {
            System.out.println();
            ((MOScalar)event.getLookupResult()).setValue(new OctetString(new Date().toString()));
        }
        @Override
        public void queryEvent(MOServerLookupEvent event) {
            System.out.println();
        }
    },moScalar);
    

    I can now react to the requests. YAY!