Как определить таблицу для 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 это выглядит так:
Я дошел до определения того, что я считаю "строкой", как классом, полученным из 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.:)