2014-10-14 3 views
1

SharpSnmpLib를 사용하여 SNMP GET을 통해 다양한 응용 프로그램 속성을 노출하는 C# 응용 프로그램 중 하나의 에이전트를 작성하고 있습니다.이 도구는 과거에는 트랩을 성공적으로 보내고 GET을 가져 왔습니다. 단일 속성을 노출 할 수 있지만 응용 프로그램에서 테이블을 정의하는 방법을 파악하는 데 문제가 있습니다.GET을위한 테이블 정의 방법

이 테이블은 내 응용 프로그램 내에서 스트림 개념의 각 인스턴스에 대해 한 번씩 GET 매개 변수 세트를 표시해야합니다 (시작시 스트림 수가 고정됨). 각 스트림은 테이블의 행으로 표시되어야합니다.

MIB에서이를 정의하기는 쉽지만 과거에는 C++ 라이브러리를 사용하여 이러한 테이블을 성공적으로 정의하고 구현 했으므로 가능하다는 것을 알고 있습니다.

dtStream  OBJECT IDENTIFIER ::= {dtApps 3} 

dtVersion OBJECT-TYPE 
    SYNTAX  DisplayString 
    MAX-ACCESS read-only 
    STATUS  current 
    DESCRIPTION 
     "The version number of the application" 
    ::= {dtStream 1} 

그리고 코드 : 여기

public class StringVar : ScalarObject 
{ 
    private ISnmpData _data; 
    private string _value; 
    public StringVar(ObjectIdentifier oid, string value) : base(oid) 
    { 
     Value = value; 
    } 
    public override ISnmpData Data 
    { 
     get { return _data; } 
     set { throw new AccessFailureException(); } 
    } 
    public string Value 
    { 
     set { _data = new OctetString(_value = value); } 
     get { return _value; } 
    } 
} 
... 
ObjectStore os = new ObjectStore(); 
os.Add(Version = new StringVar(OID_STREAM_VERSION, System.Reflection.Assembly.GetExecutingAssembly().GetName().Version.ToString())); 

난에 노력하고있어 테이블에 대한 예를 MIB 정의의 다음

내가 MIB의 응용 프로그램 버전의 간단한 GET을 정의하는 방법 작성 :

dtStreamTable OBJECT-TYPE 
    SYNTAX  SEQUENCE OF DtStreamEntry 
    MAX-ACCESS not-accessible 
    STATUS  current 
    DESCRIPTION 
     "Statistics on the status and performance of the streams" 
    ::= {dtStream 5} 

DtStreamEntry OBJECT-TYPE 
    SYNTAX  DtStreamEntry 
    MAX-ACCESS not-accessible 
    STATUS  current 
    DESCRIPTION 
     "Status of a particular stream." 
    INDEX  {dtStreamID} 
    ::= {dtStreamTable 1} 

DtStreamEntry ::= SEQUENCE { 
    dtmStreamID   Integer32, 
    dtStreamName   DisplayString 
    dtStreamHost   DisplayString 
    dtStreamType   Integer32 
} 

dtStreamID OBJECT-TYPE 
    SYNTAX  Integer32 (0..255) 
    MAX-ACCESS not-accessible 
    STATUS  current 
    DESCRIPTION 
     "Index of the stream entry in the table." 
    ::= {DtStreamEntry 1} 

dtStreamName OBJECT-TYPE 
    SYNTAX  DisplayString 
    MAX-ACCESS read-only 
    STATUS  current 
    DESCRIPTION 
     "Name of the stream." 
    ::= {DtStreamEntry 2} 

dtStreamHost OBJECT-TYPE 
    SYNTAX  DisplayString 
    MAX-ACCESS read-only 
    STATUS  current 
    DESCRIPTION 
     "Hostname that the stream is connected to." 
    ::= {DtStreamEntry 3} 

dtStreamType OBJECT-TYPE 
    SYNTAX  Integer32(1..2) 
    MAX-ACCESS read-only 
    STATUS  current 
    DESCRIPTION 
     "Type of stream" 
    ::= {DtStreamEntry 4} 

이 iReasoning MIB 브라우저에서 다음과 같습니다

나는 클래스가 TableObject에서 파생로 내가는 "행"이라고 생각했던 것과 정의로까지있어

Screengrab

:

class StreamEntry : TableObject 
    { 
     private readonly IList<ScalarObject> _elements = new List<ScalarObject>(); 

     public StreamEntry(int id, string name, string host, int type) 
      : base() 
     { 
      _elements.Add(StreamId = new IntVar(OID_STREAM_ID, id)); 
      _elements.Add(Name = new StringVar(OID_STREAM_NAME, name)); 
      _elements.Add(Host = new StringVar(OID_STREAM_HOST, host)); 
      _elements.Add(Type = new IntVar(OID_STREAM_TYPE, type)); 
     } 

     public IntVar StreamId { get; private set; } 
     public StringVar Name { get; private set; } 
     public StringVar Host { get; private set; } 
     public IntVar Type { get; private set; } 

     protected override IEnumerable<ScalarObject> Objects 
     { 
      get { return _elements; } 
     } 
    } 

모든 그 후, 나는 내 질문을 추측 내가 테이블이나 항목에 대한 OID와 함께 반환되는 테이블에 이들을 어떻게 연관 시키는가?

나는 ObjectStore에 여러 StreamEntry 개체를 추가하려고했습니다 :이

foreach(Stream s in Streams) 
{ 
    os.Add(new StreamEntry(s.ID, s.Name, s.HostName, s.Type)); 
} 

이 난 단지 (개별 가져 사용하거나 MIB 브라우저에 dtStreamEntry에서 도보로) 첫 번째에 대한 데이터를 검색 할 수 있습니다 .

답변

1

좋아, 알아 냈어. ScalarObjects을 OID 순서로 ObjectStore에 추가해야합니다. 그렇지 않으면 모든 것이 손상됩니다.

그래서 나는 TableObject에서 파생 된 둘러싸 StreamTable 객체 내에 (더 이상 기본 클래스로 TableObject을 가진) 여러 StreamEntry 개체를 만드는 데 필요한, 내가 전에 OID가 모두 각 StreamEntry에서 ScalarObjects를 추출하고 정렬 할 필요 Object 컬렉션 오버라이드로 반환합니다.

이제는 작동하는 SNMP 테이블이 있습니다. :)

+0

당신이 혼자서 그것을 발견했기 때문에 기쁩니다. 또한 https://blog.lextudio.com/2013/03/tritonmate-words-iftable-implementation/이 샘플 프로젝트에서 구체적인 예를 찾는 위치를 알 수 있습니다. –

+0

링크를 제공해 주셔서 감사합니다. 나는 실제로 SysORTable 예제를 찾은 후에 그것을 알아 냈다. ObjectStore가 자체적으로 OID를 정렬 할 수없는 이유가 있습니까? – Chris

+0

snmpd 에이전트는 샘플로 설계되었으므로 많은 기능이 취소되었습니다. 코드베이스가 MIT에 있기 때문에 자유롭게 수정할 수 있습니다. –