1#
2# This file is part of pyasn1-modules software.
3#
4# Copyright (c) 2005-2017, Ilya Etingof <etingof@gmail.com>
5# License: http://pyasn1.sf.net/license.html
6#
7# SNMPv2c PDU syntax
8#
9# ASN.1 source from:
10# http://www.ietf.org/rfc/rfc1905.txt
11#
12from pyasn1.type import univ, namedtype, namedval, tag, constraint
13from pyasn1_modules import rfc1902
14
15max_bindings = rfc1902.Integer(2147483647)
16
17
18class _BindValue(univ.Choice):
19    componentType = namedtype.NamedTypes(
20        namedtype.NamedType('value', rfc1902.ObjectSyntax()),
21        namedtype.NamedType('unSpecified', univ.Null()),
22        namedtype.NamedType('noSuchObject',
23                            univ.Null().subtype(implicitTag=tag.Tag(tag.tagClassContext, tag.tagFormatSimple, 0))),
24        namedtype.NamedType('noSuchInstance',
25                            univ.Null().subtype(implicitTag=tag.Tag(tag.tagClassContext, tag.tagFormatSimple, 1))),
26        namedtype.NamedType('endOfMibView',
27                            univ.Null().subtype(implicitTag=tag.Tag(tag.tagClassContext, tag.tagFormatSimple, 2)))
28    )
29
30
31class VarBind(univ.Sequence):
32    componentType = namedtype.NamedTypes(
33        namedtype.NamedType('name', rfc1902.ObjectName()),
34        namedtype.NamedType('', _BindValue())
35    )
36
37
38class VarBindList(univ.SequenceOf):
39    componentType = VarBind()
40    subtypeSpec = univ.SequenceOf.subtypeSpec + constraint.ValueSizeConstraint(
41        0, max_bindings
42    )
43
44
45class PDU(univ.Sequence):
46    componentType = namedtype.NamedTypes(
47        namedtype.NamedType('request-id', rfc1902.Integer32()),
48        namedtype.NamedType('error-status', univ.Integer(
49            namedValues=namedval.NamedValues(('noError', 0), ('tooBig', 1), ('noSuchName', 2), ('badValue', 3),
50                                             ('readOnly', 4), ('genErr', 5), ('noAccess', 6), ('wrongType', 7),
51                                             ('wrongLength', 8), ('wrongEncoding', 9), ('wrongValue', 10),
52                                             ('noCreation', 11), ('inconsistentValue', 12), ('resourceUnavailable', 13),
53                                             ('commitFailed', 14), ('undoFailed', 15), ('authorizationError', 16),
54                                             ('notWritable', 17), ('inconsistentName', 18)))),
55        namedtype.NamedType('error-index',
56                            univ.Integer().subtype(subtypeSpec=constraint.ValueRangeConstraint(0, max_bindings))),
57        namedtype.NamedType('variable-bindings', VarBindList())
58    )
59
60
61class BulkPDU(univ.Sequence):
62    componentType = namedtype.NamedTypes(
63        namedtype.NamedType('request-id', rfc1902.Integer32()),
64        namedtype.NamedType('non-repeaters',
65                            univ.Integer().subtype(subtypeSpec=constraint.ValueRangeConstraint(0, max_bindings))),
66        namedtype.NamedType('max-repetitions',
67                            univ.Integer().subtype(subtypeSpec=constraint.ValueRangeConstraint(0, max_bindings))),
68        namedtype.NamedType('variable-bindings', VarBindList())
69    )
70
71
72class GetRequestPDU(PDU):
73    tagSet = PDU.tagSet.tagImplicitly(
74        tag.Tag(tag.tagClassContext, tag.tagFormatConstructed, 0)
75    )
76
77
78class GetNextRequestPDU(PDU):
79    tagSet = PDU.tagSet.tagImplicitly(
80        tag.Tag(tag.tagClassContext, tag.tagFormatConstructed, 1)
81    )
82
83
84class ResponsePDU(PDU):
85    tagSet = PDU.tagSet.tagImplicitly(
86        tag.Tag(tag.tagClassContext, tag.tagFormatConstructed, 2)
87    )
88
89
90class SetRequestPDU(PDU):
91    tagSet = PDU.tagSet.tagImplicitly(
92        tag.Tag(tag.tagClassContext, tag.tagFormatConstructed, 3)
93    )
94
95
96class GetBulkRequestPDU(BulkPDU):
97    tagSet = PDU.tagSet.tagImplicitly(
98        tag.Tag(tag.tagClassContext, tag.tagFormatConstructed, 5)
99    )
100
101
102class InformRequestPDU(PDU):
103    tagSet = PDU.tagSet.tagImplicitly(
104        tag.Tag(tag.tagClassContext, tag.tagFormatConstructed, 6)
105    )
106
107
108class SNMPv2TrapPDU(PDU):
109    tagSet = PDU.tagSet.tagImplicitly(
110        tag.Tag(tag.tagClassContext, tag.tagFormatConstructed, 7)
111    )
112
113
114class ReportPDU(PDU):
115    tagSet = PDU.tagSet.tagImplicitly(
116        tag.Tag(tag.tagClassContext, tag.tagFormatConstructed, 8)
117    )
118
119
120class PDUs(univ.Choice):
121    componentType = namedtype.NamedTypes(
122        namedtype.NamedType('get-request', GetRequestPDU()),
123        namedtype.NamedType('get-next-request', GetNextRequestPDU()),
124        namedtype.NamedType('get-bulk-request', GetBulkRequestPDU()),
125        namedtype.NamedType('response', ResponsePDU()),
126        namedtype.NamedType('set-request', SetRequestPDU()),
127        namedtype.NamedType('inform-request', InformRequestPDU()),
128        namedtype.NamedType('snmpV2-trap', SNMPv2TrapPDU()),
129        namedtype.NamedType('report', ReportPDU())
130    )
131