SNMP侦听器无法从作为表中条目的OID读取陷阱

问题描述 投票:0回答:1

我使用TNM4J库在Java中编写了一个SNMP监听器,该库使用SNMP4J库。

侦听器能够读取已接收的陷阱,但似乎在表中编入索引的陷阱除外。

侦听器正在侦听来自Ericsson对象的陷阱,这意味着我正在使用ERICSSON-ALARM-MIB并且需要MIB导入。我收到的陷阱是带有OID .1.3.6.1.4.1.193.183.4.1.3.5.1.5的eriAlarmActiveManagedObject,但我也在本地使用表中的其他陷阱进行了测试,发生了同样的错误

如果看一下https://mibs.observium.org/mib/ERICSSON-ALARM-MIB/

enter image description here

所有来自这样的表的陷阱都不能被侦听器读取。它从TNM4J库中的MibbleIndexExtractor.java中的extractIndexes方法中提供了一个索引超出范围的异常。

@Override
public IndexDescriptor[] extractIndexes(String instanceOid) {
    String oid = symbol.getValue().toString();
    String suboid = instanceOid.substring(oid.length() + 1);
    int[] components = oidToArray(suboid);
    int offset = 0;
    IndexDescriptor[] descriptors = new IndexDescriptor[indexes.length];
    for (int i = 0; i < indexes.length; i++) {
        SnmpIndex index = indexes[i];
        MibValueSymbol indexSymbol = symbol.getMib().getSymbolByOid(index.getValue().toString());
        MibType indexType = ((SnmpObjectType) indexSymbol.getType()).getSyntax();
        int length = fixedLength(indexType);
        boolean implied = length != -1 || index.isImplied();
        if (length == -1) {
            length = variableLength(indexType, components, offset, index.isImplied());
        }
        int[] encoded = new int[length];
        System.arraycopy(components, offset, encoded, 0, length);

        descriptors[i] = new MibbleIndexDescriptor(indexSymbol, encoded, implied);
        offset += length;
    }
    return descriptors;
}

我调试了它,这是因为oid String和instanceOid String是相同的,当然会导致创建子类String的异常。

但是在所有其他陷阱上它从不调用此extractIndexes方法,但只是正常工作并正确打印出陷阱和oid名称。

有关如何解决此问题的任何建议?

java snmp snmp4j
1个回答
0
投票

在与TNM4J的开发人员联系后,他对他的图书馆进行了一些修复。

之后,爱立信的oids被正确翻译。 oid有一些缺失的翻译,这是因为MIB的加载顺序。

重新调整这些使它工作。

对于任何感兴趣的人,与开发人员的故障排除过程可以在这里查看:https://github.com/soulwing/tnm4j/issues/9

© www.soinside.com 2019 - 2024. All rights reserved.