2016-07-09 7 views
0

snmp4j를 사용하여 SNMP 에이전트를 구현했으며 SNMPv3 트랩/알림을 SNMP 관리자에게 올바르게보고하는 방법과 관련하여 약간의 문제가 있습니다. 구현은 instanceId에 의해 인덱싱 된 값의 테이블을 관리하도록 설정됩니다. 에이전트를 조회 할 때 OID 값과 연관된 특정 링크 인스턴스에 따라 ".1", ".2", ".3"등으로 접미어가 붙은 다양한 필드의 OID를받습니다. 따라서 쿼리 결과는 다음과 같습니다.SNMP 트랩에서 테이블 인덱스 보내기

----------------------------------------- 
| 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와 각 링크를 정의 할 수 있도록 링크가 동적으로 구성 할 수 있습니다; MIB에서 기본 OID를 정의하고 인덱스를 동적으로 추가해야합니다.

답변

0

해결책을 발견했습니다. 간단히 말해서 나는 그래서 같은 VARBIND의 값으로 NULLOBJ을 OID에 인스턴스 인덱스를 추가하고 보내려고 :

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

그러나 관리자 거부 ​​ 메시지를. 그래서 OID 에 인스턴스 지수뿐만 아니라 그래서 같은 VARBIND 값 추가 :

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

을 그리고 관리자는 SNMP 테이블 등 링크 1, Link2부터, 일관성 실체를보고합니다.