1#
2# SNMPv1 message syntax
3#
4# ASN.1 source from:
5# http://www.ietf.org/rfc/rfc1157.txt
6#
7# Sample captures from:
8# http://wiki.wireshark.org/SampleCaptures/
9#
10from pyasn1.type import univ, namedtype, namedval, tag, constraint
11from pyasn1_modules import rfc1155
12
13class Version(univ.Integer):
14    namedValues = namedval.NamedValues(
15        ('version-1', 0)
16        )
17    defaultValue = 0
18
19class Community(univ.OctetString): pass
20
21class RequestID(univ.Integer): pass
22class ErrorStatus(univ.Integer):
23    namedValues = namedval.NamedValues(
24        ('noError', 0),
25        ('tooBig', 1),
26        ('noSuchName', 2),
27        ('badValue', 3),
28        ('readOnly', 4),
29        ('genErr', 5)
30        )
31class ErrorIndex(univ.Integer): pass
32
33class VarBind(univ.Sequence):
34    componentType = namedtype.NamedTypes(
35        namedtype.NamedType('name', rfc1155.ObjectName()),
36        namedtype.NamedType('value', rfc1155.ObjectSyntax())
37        )
38class VarBindList(univ.SequenceOf):
39    componentType = VarBind()
40
41class _RequestBase(univ.Sequence):
42    componentType = namedtype.NamedTypes(
43        namedtype.NamedType('request-id', RequestID()),
44        namedtype.NamedType('error-status', ErrorStatus()),
45        namedtype.NamedType('error-index', ErrorIndex()),
46        namedtype.NamedType('variable-bindings', VarBindList())
47        )
48
49class GetRequestPDU(_RequestBase):
50    tagSet = _RequestBase.tagSet.tagImplicitly(
51        tag.Tag(tag.tagClassContext, tag.tagFormatConstructed, 0)
52        )
53class GetNextRequestPDU(_RequestBase):
54    tagSet = _RequestBase.tagSet.tagImplicitly(
55        tag.Tag(tag.tagClassContext, tag.tagFormatConstructed, 1)
56        )
57class GetResponsePDU(_RequestBase):
58    tagSet = _RequestBase.tagSet.tagImplicitly(
59        tag.Tag(tag.tagClassContext, tag.tagFormatConstructed, 2)
60        )
61class SetRequestPDU(_RequestBase):
62    tagSet = _RequestBase.tagSet.tagImplicitly(
63        tag.Tag(tag.tagClassContext, tag.tagFormatConstructed, 3)
64        )
65
66class TrapPDU(univ.Sequence):
67    componentType = namedtype.NamedTypes(
68        namedtype.NamedType('enterprise', univ.ObjectIdentifier()),
69        namedtype.NamedType('agent-addr', rfc1155.NetworkAddress()),
70        namedtype.NamedType('generic-trap', univ.Integer().clone(namedValues=namedval.NamedValues(('coldStart', 0), ('warmStart', 1), ('linkDown', 2), ('linkUp', 3), ('authenticationFailure', 4), ('egpNeighborLoss', 5), ('enterpriseSpecific', 6)))),
71        namedtype.NamedType('specific-trap', univ.Integer()),
72        namedtype.NamedType('time-stamp', rfc1155.TimeTicks()),
73        namedtype.NamedType('variable-bindings', VarBindList())
74        )
75
76class Pdus(univ.Choice):
77    componentType = namedtype.NamedTypes(
78        namedtype.NamedType('get-request', GetRequestPDU()),
79        namedtype.NamedType('get-next-request', GetNextRequestPDU()),
80        namedtype.NamedType('get-response', GetResponsePDU()),
81        namedtype.NamedType('set-request', SetRequestPDU()),
82        namedtype.NamedType('trap', TrapPDU())
83        )
84
85class Message(univ.Sequence):
86    componentType = namedtype.NamedTypes(
87        namedtype.NamedType('version', Version()),
88        namedtype.NamedType('community', Community()),
89        namedtype.NamedType('data', Pdus())
90        )
91