Индекс отправки таблицы в ловушке SNMP

Я реализовал SNMP-агент, используя snmp4j, и столкнулся с небольшим затруднением с тем, как правильно сообщать о прерываниях / уведомлениях SNMPv3 менеджеру SNMP. Реализация настроена на управление таблицей значений, проиндексированных 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, могут быть очищены при изменении статуса ссылки. Я попытался просто добавить instanceId в качестве varbind, как показано ниже в моем блоке кода, но объект всегда отображается как универсальная "ссылка". Кто-нибудь сталкивался с этим, что могло бы помочь мне решить это? Все ценится очень высоко.

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; Я определяю базовый OID в MIB и должен динамически добавлять индекс.

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)));

И менеджер сообщает об объекте как Link1, Link2 и т. Д. В соответствии с таблицей SNMP.

Другие вопросы по тегам