Как определить таблицу для GET

Я пишу агент для одного из наших приложений на C#, который предоставляет различные свойства приложения через SNMP GET с использованием SharpSnmpLib, который я успешно отправлял ловушки и получал GET в прошлом. Я могу выставить отдельные свойства, но мне сложно понять, как определить таблицу в моем приложении.

Эта таблица должна предоставлять набор параметров GET один раз для каждого экземпляра концепции потока в моем приложении (количество потоков фиксируется при запуске), каждый поток должен быть представлен в виде строки в таблице.

Это достаточно просто определить в MIB, и я ранее успешно определял и реализовывал такие таблицы с помощью библиотек C++, поэтому я знаю, что это возможно.

Вот как я определяю простой GET версии приложения в MIB:

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 для таблицы, которую я пытаюсь создать:

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 это выглядит так:

Screengrab

Я дошел до определения того, что я считаю "строкой", как классом, полученным из TableObject:

    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 для таблицы или записи?

Я пытался добавить несколько StreamEntry объекты в ObjectStore:

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

При этом я могу получить данные только для первого (используя отдельные GET или WALK для dtStreamEntry в браузере MIB).

1 ответ

Решение

Хорошо, я понял это. Все ScalarObjects должны быть добавлены к ObjectStore в порядке OID - иначе все ломается.

Поэтому мне нужно было создать несколько StreamEntry объекты (больше не имеющие TableObject в качестве базового класса) в пределах StreamTable объект, который был получен из TableObjectи мне нужно было извлечь ScalarObjects с каждого StreamEntry и отсортировать их все по OID перед возвратом в качестве переопределения коллекции объектов.

Теперь у меня есть рабочая таблица SNMP.:)

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