【问题标题】:Sending table index in SNMP trap在 SNMP 陷阱中发送表索引
【发布时间】:2016-07-09 04:32:34
【问题描述】:

我已经使用 snmp4j 实现了一个 SNMP 代理,但在如何正确向 SNMP 管理器报告 SNMPv3 陷阱/通知方面遇到了一些问题。该实现被设置为管理由 instanceId 索引的值表。当您查询代理时,您会根据与 OID 值关联的特定链接实例收到以“.1”、“.2”、“.3”等为后缀的各种字段的 OID。所以查询结果:

-----------------------------------------
| Entity  | OID          | Value        |
-----------------------------------------
| Link1   | linkAlias.1  | Link 1       |
| Link2   | linkAlias.2  | Link 2       |
| Link1   | linkState.1  | 1            |
| Link2   | linkState.2  | 3            |
| Link1   | linkText.1   | UP           |
| Link2   | linkText.2   | INITIALIZING |
-----------------------------------------

效果很好。但是,我需要能够以类似的方式发送陷阱,以便表的索引与陷阱一起发送。这样,当链接状态发生变化时,可以清除从 SNMP 查询触发的警报有没有人遇到过可以帮助我解决这个问题的?任何事情都非常感谢。

public static void updateLinkStatus(int instanceId, LinkState status) 
{   
    boolean varChanged = false;

    Variable[] currentManagedObject = currentManagedObjects.get(instanceId);
    if(currentManagedObject != null)
    {
        // If we are managing this object
        if(((Integer32)currentManagedObject[1]).toInt() != status.value)
            varChanged = true;

        // Update the managed object Status Integer and Status Text
        currentManagedObject[1] = new Integer32(status.value);
        currentManagedObject[2] = new OctetString(status.getLinkStateText());
    }
    else 
    {
        varChanged = true; // No previous record to check against
    }

    // Send trap now if not equal to previous value
    if(varChanged)
    {
        OID trapOid = null;
        int linkState = LinkState.UNKNOWN.value; // Will be overridden
        String linkStateText = null;

        if(status == LinkState.DOWN)
        {
            trapOid = oidLinkDown;
            linkState = LinkState.DOWN.value;
            linkStateText = LnkState.DOWN.getLinkStateText();
        }
        else if(status == LinkState.MISCONFIGURED)
        {
            trapOid = oidLinkMisconfigured;
            linkState = LinkState.MISCONFIGURED.value;
            linkStateText = LinkState.MISCONFIGURED.getLinkStateText();
        }
        else if(status == LinkState.UP)
        {
            trapOid = oidLinkUp;
            linkState = LinkState.UP.value;
            linkStateText = LinkState.UP.getLinkStateText();
        }
        else if(status == LinkState.INITIALIZING)
        {
            trapOid = oidLinkInitializing;
            linkState = LinkState.INITIALIZING.value;
            linkStateText = LinkState.INITIALIZING.getLinkStateText();
        }
        else
        {
            // Theoretically, should never change to LinkState.UNKNOWN - no trap available for it
            linkState = LinkState.UNKNOWN.value;
            linkStateText = LinkState.UNKNOWN.getLinkStateText();
        }

        // Create variable bindings for V3 trap
        if(trapOid != null)
        {
            List<VariableBinding> variableBindings = new ArrayList<VariableBinding>();
            variableBindings.add(new VariableBinding(oidLinkState, new Integer32(linkState)));
            variableBindings.add(new VariableBinding(oidLinkText, new OctetString(linkStateText)));
            variableBindings.add(new VariableBinding(oidLinkInstanceID, new Integer32(instanceId)));
            //I've tried the below varbind too and it also doesn't work
            //variableBindings.add(new VariableBinding(new OID(oidLinkInstanceID.toIntArray(), instanceId)));
            agent.sendTrap_Version3(trapOid, variableBindings);
        }
    }
}

编辑:

注意:链接是动态可配置的,所以我不能简单地用单独的 OID 定义每个链接;我在 MIB 中定义了基本 OID,需要动态添加索引。

【问题讨论】:

    标签: java snmp snmp4j


    【解决方案1】:

    我发现了解决方案。我试图简单地将实例索引添加到 OID 并发送一个 NULLOBJ 作为 varbind 中的值,如下所示:

    variableBindings.add(new VariableBinding(new OID(oidLinkInstanceID.toIntArray(), instanceId)));
    

    但经理拒绝该消息。所以我将实例索引添加到 OID 以及 varbind 值,如下所示:

    variableBindings.add(new VariableBinding(new OID(oidLinkInstanceID.toIntArray(), instanceId), new Integer32(instanceId)));
    

    并且管理器将实体上报为Link1Link2等与SNMP表一致。

    【讨论】:

      猜你喜欢
      • 2019-08-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多