DuplicateRegistrationException в агенте SNMP4j - PullRequest
0 голосов
/ 09 октября 2018

Я пытаюсь зарегистрировать набор MO на агенте SNMP с помощью агента SNMP4j.

public class MyAgent extends BaseAgent {

    public MyAgent() {
        super(new File("bootCounterFileTmpSNMP.txt"), new File("configFileTmpSNMP.txt"),
                new CommandProcessor(new OctetString(MPv3.createLocalEngineID())));
    }

    @Override
    protected void initTransportMappings() throws IOException {
        transportMappings = new TransportMapping<?>[1];
        Address addr = GenericAddress.parse("0.0.0.0/8551"); // not 161 so we dont have to run sudo
        TransportMapping<? extends Address> tm = TransportMappings.getInstance().createTransportMapping(addr);
        transportMappings[0] = tm;
    }

    public void start() throws IOException {
        init();
        addShutdownHook();
        getServer().addContext(new OctetString("public"));
        finishInit();
        run();
        sendColdStartNotification();
    }

    @Override
    protected void registerManagedObjects() {

        getSnmpv2MIB().unregisterMOs(server, getContext(getSnmpv2MIB())); 
        registerManagedObject(new MOScalar(new OID("1.3.6.1.4.1.32437.1.5.1.4.2"), MOAccessImpl.ACCESS_READ_ONLY, new OctetString("object 1")));
        registerManagedObject(new MOScalar(new OID("1.3.6.1.4.1.32437.1.5.1.2.20"), MOAccessImpl.ACCESS_READ_ONLY, new OctetString("object 2")));
        registerManagedObject(new MOScalar(new OID("1.3.6.1.4.1.32437.1.5.1.2.23"), MOAccessImpl.ACCESS_READ_ONLY, new OctetString("object 3")));
        registerManagedObject(new MOScalar(new OID("1.3.6.1.4.1.32437.1.5.1.1.21"), MOAccessImpl.ACCESS_READ_ONLY, new OctetString("object 4")));
        registerManagedObject(new MOScalar(new OID("1.3.6.1.4.1.32437.1.5.1.4.2.1.2"), MOAccessImpl.ACCESS_READ_ONLY, new OctetString("object 5")));

    }
    private void registerManagedObject(MOScalar mo) {
        try {
            server.register(mo, null);
            System.out.print("Successfully registered ");
            System.out.println(mo.getID());
        } catch (DuplicateRegistrationException e) {
            System.out.print("Failed to register ");
            System.out.println(mo.getID());
        }
    }

    @Override
    protected void unregisterManagedObjects() {
        // do nothing
    }

    @Override
    protected void addUsmUser(USM usm) {
        // do nothing
    }

    @Override
    protected void addNotificationTargets(SnmpTargetMIB targetMIB, SnmpNotificationMIB notificationMIB) {
        // do nothing
    }

    @Override
    protected void addViews(VacmMIB vacmMIB) {
        vacmMIB.addGroup(SecurityModel.SECURITY_MODEL_SNMPv2c, new OctetString("cpublic"), new OctetString("v1v2group"),
                StorageType.nonVolatile);

        vacmMIB.addAccess(new OctetString("v1v2group"), new OctetString("public"), SecurityModel.SECURITY_MODEL_ANY,
                SecurityLevel.NOAUTH_NOPRIV, MutableVACM.VACM_MATCH_EXACT, new OctetString("fullReadView"),
                new OctetString("fullWriteView"), new OctetString("fullNotifyView"), StorageType.nonVolatile);

        vacmMIB.addViewTreeFamily(new OctetString("fullReadView"), new OID(".1.3"), new OctetString(),
                VacmMIB.vacmViewIncluded, StorageType.nonVolatile);
    }

    @Override
    protected void addCommunities(SnmpCommunityMIB communityMIB) {
        Variable[] com2sec = new Variable[] {
                new OctetString("public"),              // community name
                new OctetString("cpublic"),             // security name
                getAgent().getContextEngineID(),        // local engine ID
                new OctetString("public"),              // default context name
                new OctetString(),                      // transport tag
                new Integer32(StorageType.nonVolatile), // storage type
                new Integer32(RowStatus.active)         // row status
            };
        SnmpCommunityMIB.SnmpCommunityEntryRow row = communityMIB.getSnmpCommunityEntry().createRow(
              new OctetString("public2public").toSubIndex(true), com2sec);
        communityMIB.getSnmpCommunityEntry().addRow(row);
    }
}

И затем запустить его:

agent = new MyAgent();
agent.start();

Вывод здесь:

Successfully registered 1.3.6.1.4.1.32473.1.5.1.4.2
Successfully registered 1.3.6.1.4.1.32473.1.5.1.2.20
Failed to register 1.3.6.1.4.1.32473.1.5.1.2.23
Successfully registered 1.3.6.1.4.1.32473.1.5.1.1.21
Failed to register 1.3.6.1.4.1.32473.1.5.1.4.2.1.2

Причина, по которой я получаю исключение DuplicateRegistrationException, связанное со структурой адресаили упорядочение?

Каждый объект представляет собой org.snmp4j.agent.mo.MOScalar с уникальным значением OctetString.

Связанный: регистрация OID с помощью агента snmp

1 Ответ

0 голосов
/ 31 октября 2018

Для тех, кто следует по моему пути, ключом здесь является добавление .0 в конец каждого из адресов.

Этот дополнительный ноль идентифицирует переменную по этому OID и означает, что адреса не конфликтуют друг с другом.Без него это просто путь к местоположению без создания места для самой переменной.

Итак, исправленный код:

registerManagedObject(new MOScalar(new OID("1.3.6.1.4.1.32437.1.5.1.4.2.0"), MOAccessImpl.ACCESS_READ_ONLY, new OctetString("object 1")));
registerManagedObject(new MOScalar(new OID("1.3.6.1.4.1.32437.1.5.1.2.20.0"), MOAccessImpl.ACCESS_READ_ONLY, new OctetString("object 2")));
registerManagedObject(new MOScalar(new OID("1.3.6.1.4.1.32437.1.5.1.2.23.0"), MOAccessImpl.ACCESS_READ_ONLY, new OctetString("object 3")));
registerManagedObject(new MOScalar(new OID("1.3.6.1.4.1.32437.1.5.1.1.21.0"), MOAccessImpl.ACCESS_READ_ONLY, new OctetString("object 4")));
registerManagedObject(new MOScalar(new OID("1.3.6.1.4.1.32437.1.5.1.4.2.1.2.0"), MOAccessImpl.ACCESS_READ_ONLY, new OctetString("object 5")));
...