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