SNMP Agent SNMP - Representing Complex Types in MIB
I am writing my first SNMP agent in C # and I want to provide information on system events via SNMP GET requests.
On the C # side, all system events are represented by a simple class:
public class MySystemEvent
{
public int Id { get;set; }
public string Message { get; set; }
public DateTime Occurred { get; set; }
}
I would like to expose each of these specific events (identified by the event ID) as a separate node in the MIB, but I'm not really sure how to create a custom ASN.1 type that would match the class above. I know I can use SEQUENCE to represent them, but not sure if I am using them correctly.
What I have done so far:
enterprise OBJECT IDENTIFIER ::= { private 1 }
penNode OBJECT IDENTIFIER ::= { enterprise <PEN> }
customSystemNode OBJECT IDENTIFIER ::= { penNode 1 }
events OBJECT IDENTIFIER ::= { customSystemNode 1 }
Event ::= SEQUENCE {
id Integer32,
message DisplayString,
occurred DateAndTime
}
firstSpecificEvent OBJECT-TYPE
SYNTAX Event
MAX-ACCESS read-only
STATUS current
DESCRIPTION
"First specific event."
INDEX { eventId }
::= { events 1 }
eventId OBJECT-TYPE
SYNTAX Integer32
MAX-ACCESS read-only
STATUS current
DESCRIPTION
"Event Id."
::= { firstSpecificEvent 1 }
eventMessage OBJECT-TYPE
SYNTAX DisplayString
MAX-ACCESS read-only
STATUS current
DESCRIPTION
"Event message."
::= { firstSpecificEvent 2 }
eventOccurred OBJECT-TYPE
SYNTAX DateAndTime
MAX-ACCESS read-only
STATUS current
DESCRIPTION
"Event occurred."
::= { firstSpecificEvent 3 }
The above MIB defines the following tree:
- private
- enterprises
- penNode
- customSystemNode
- events
- firstSpecificEvent
- EVENTID
- EventMessage
- eventOccurred
- firstSpecificEvent
I want to add several other events with the same structure to the "events" node for example. right after firstSpecificEvent, I want to have:
- secondSpecificEvent
- EVENTID
- EventMessage
- eventOccurred
How can I do this without adding separate eventId, eventMessage and eventOccured OBECT-TYPE definitions for each specific event? Is it possible to define a CustomEventComplexType that will allow the following?
firstSpecificEvent OBJECT-TYPE
SYNTAX CustomEventComplexType
MAX-ACCESS read-only
STATUS current
DESCRIPTION
"First specific event."
::= { events 1 }
secondSpecificEvent OBJECT-TYPE
SYNTAX CustomEventComplexType
MAX-ACCESS read-only
STATUS current
DESCRIPTION
"Second specific event."
::= { events 2 }
thirdSpecificEvent OBJECT-TYPE
SYNTAX CustomEventComplexType
MAX-ACCESS read-only
STATUS current
DESCRIPTION
"Third specific event."
::= { events 3 }
etc.
source to share
I ended up solving it exactly as @LexLi suggested by creating an event table. Thus, OBJECT-TYPE definitions are needed only once to define a row record.
enterprise OBJECT IDENTIFIER ::= { private 1 }
penNode OBJECT IDENTIFIER ::= { enterprise <PEN> }
customSystemNode OBJECT IDENTIFIER ::= { penNode 1 }
Event ::= SEQUENCE {
id Integer32,
message DisplayString,
occurred DateAndTime
}
eventTable OBJECT-TYPE
SYNTAX SEQUENCE OF Event
MAX-ACCESS read-only
STATUS current
DESCRIPTION
"Table containing event information."
::= { customSystemNode 1 }
eventTableRowEntry OBJECT-TYPE
SYNTAX Event
MAX-ACCESS read-only
STATUS current
DESCRIPTION
"A row entry in the event table."
INDEX { eventId }
::= { eventTable 1 }
eventId OBJECT-TYPE
SYNTAX Integer32
MAX-ACCESS read-only
STATUS current
DESCRIPTION
"Event id."
::= { eventTableRowEntry 1 }
eventMessage OBJECT-TYPE
SYNTAX DisplayString
MAX-ACCESS read-only
STATUS current
DESCRIPTION
"Event message."
::= { eventTableRowEntry 2 }
eventOccurred OBJECT-TYPE
SYNTAX DateAndTime
MAX-ACCESS read-only
STATUS current
DESCRIPTION
"Event occurred timestamp."
::= { eventTableRowEntry 3 }
source to share