net-snmp 3.16.1 → 3.18.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/index.js CHANGED
@@ -587,81 +587,127 @@ function writeVarbinds (buffer, varbinds) {
587
587
 
588
588
  const ObjectTypeUtil = {};
589
589
 
590
- ObjectTypeUtil.castSetValue = function (type, value) {
590
+ ObjectTypeUtil.castSetValue = function (type, value, constraints) {
591
591
 
592
592
  switch (type) {
593
- case ObjectType.Boolean:
593
+
594
+ case ObjectType.Boolean: {
594
595
  return !! value;
596
+ }
595
597
 
596
598
  case ObjectType.Integer:
599
+ case ObjectType.Integer32: {
597
600
  if ( typeof value != "number" && typeof value != "string" ) {
598
601
  throw new Error("Invalid Integer", value);
599
602
  }
600
- return typeof value == "number" ? value : parseInt(value, 10);
603
+ const parsedValue = typeof value == "number" ? value : parseInt(value, 10);
604
+ if ( isNaN(parsedValue) ) {
605
+ throw new Error("Invalid Integer", value);
606
+ }
607
+ if ( constraints && ObjectTypeUtil.doesIntegerMeetConstraints (parsedValue, constraints) ) {
608
+ throw new Error("Integer does not meet constraints", value);
609
+ }
610
+ return parsedValue;
611
+ }
601
612
 
602
- case ObjectType.OctetString:
603
- if ( value instanceof Buffer) {
604
- return value.toString();
605
- } else if ( typeof value != "string" ) {
613
+ case ObjectType.OctetString: {
614
+ if ( ! value instanceof Buffer && typeof value != "string" ) {
606
615
  throw new Error("Invalid OctetString", value);
616
+ }
617
+ if ( constraints && ObjectTypeUtil.doesStringMeetConstraints (value, constraints) ) {
618
+ throw new Error("OctetString does not meet constraints", value);
619
+ }
620
+ if ( value instanceof Buffer ) {
621
+ return value.toString();
607
622
  } else {
608
623
  return value;
609
624
  }
625
+ }
610
626
 
611
- case ObjectType.OID:
627
+ case ObjectType.OID: {
612
628
  if ( typeof value != "string" || ! value.match(/^([0-9]+)(\.[0-9]+)+$/) ) {
613
629
  throw new Error("Invalid OID", value);
614
630
  }
615
631
  return value;
632
+ }
616
633
 
617
634
  case ObjectType.Counter:
618
- case ObjectType.Counter64:
635
+ case ObjectType.Counter32:
636
+ case ObjectType.Gauge:
637
+ case ObjectType.Gauge32:
638
+ case ObjectType.Unsigned32:
639
+ case ObjectType.Counter64: {
619
640
  // Counters should be initialized to 0 (RFC2578, end of section 7.9)
620
641
  // We'll do so.
621
642
  return 0;
643
+ }
622
644
 
623
- case ObjectType.IpAddress:
645
+ case ObjectType.IpAddress: {
624
646
  // A 32-bit internet address represented as OCTET STRING of length 4
625
647
  var bytes = value.split(".");
626
648
  if ( typeof value != "string" || bytes.length != 4 ) {
627
649
  throw new Error("Invalid IpAddress", value);
628
650
  }
629
651
  return value;
652
+ }
630
653
 
631
- default :
654
+ default: {
632
655
  // Assume the caller knows what he's doing
633
656
  return value;
657
+ }
634
658
  }
635
659
 
636
660
  };
637
661
 
638
- ObjectTypeUtil.isValid = function (type, value) {
662
+ ObjectTypeUtil.isValid = function (type, value, constraints) {
639
663
 
640
664
  switch (type) {
641
665
  case ObjectType.Boolean: {
642
666
  return typeof value == "boolean";
643
667
  }
644
- case ObjectType.Integer: {
668
+ case ObjectType.Integer:
669
+ case ObjectType.Integer32: {
645
670
  // Allow strings that can be parsed as integers
646
- const parsed = Number(value);
647
- return ! isNaN (parsed) && Number.isInteger (parsed) && parsed >= MIN_SIGNED_INT32 && parsed <= MAX_SIGNED_INT32;
671
+ const parsedValue = Number(value);
672
+ if ( isNaN(parsedValue) || ! Number.isInteger(parsedValue) || parsedValue < MIN_SIGNED_INT32 || parsedValue > MAX_SIGNED_INT32 ) {
673
+ return false;
674
+ }
675
+ if ( constraints && ObjectTypeUtil.doesIntegerMeetConstraints (parsedValue, constraints) ) {
676
+ return false;
677
+ }
678
+ return true;
648
679
  }
649
680
  case ObjectType.OctetString: {
650
681
  // Allow string or buffer
651
- return typeof value == "string" || value instanceof Buffer;
682
+ if ( typeof value != "string" && ! (value instanceof Buffer) ) {
683
+ return false;
684
+ }
685
+ if ( constraints && ObjectTypeUtil.doesStringMeetConstraints (value, constraints) ) {
686
+ return false;
687
+ }
688
+ return true;
652
689
  }
653
690
  case ObjectType.OID: {
654
691
  return typeof value == "string" && value.match (/^([0-9]+)(\.[0-9]+)+$/);
655
692
  }
656
- case ObjectType.Counter: {
693
+ case ObjectType.Counter:
694
+ case ObjectType.Counter32:
695
+ case ObjectType.Gauge:
696
+ case ObjectType.Gauge32:
697
+ case ObjectType.Unsigned32: {
657
698
  // Allow strings that can be parsed as integers
658
699
  const parsed = Number(value);
659
700
  return ! isNaN (parsed) && Number.isInteger (parsed) && parsed >= 0 && parsed <= MAX_UNSIGNED_INT32;
660
701
  }
661
702
  case ObjectType.Counter64: {
662
- // Allow strings that can be parsed as integers
663
- const parsed = Number(value);
664
- return ! isNaN (parsed) && Number.isInteger (parsed) && parsed >= 0;
703
+ if ( value instanceof Buffer ) {
704
+ // Allow buffers of 8 bytes - should do further check to see if it translates to a valid integer
705
+ return value.length == 8;
706
+ } else {
707
+ // Allow strings that can be parsed as integers
708
+ const parsed = Number(value);
709
+ return ! isNaN (parsed) && Number.isInteger (parsed) && parsed >= 0;
710
+ }
665
711
  }
666
712
  case ObjectType.IpAddress: {
667
713
  const octets = value.split(".");
@@ -686,6 +732,57 @@ ObjectTypeUtil.isValid = function (type, value) {
686
732
 
687
733
  };
688
734
 
735
+ ObjectTypeUtil.doesIntegerMeetConstraints = function (value, constraints) {
736
+
737
+ if ( ! constraints ) {
738
+ return true;
739
+ }
740
+
741
+ if ( constraints.enumeration ) {
742
+ if ( constraints.enumeration[value] ) {
743
+ return true;
744
+ } else {
745
+ return false;
746
+ }
747
+ } else if ( constraints.ranges ) {
748
+ for ( const range of constraints.ranges ) {
749
+ const min = "min" in range ? range.min : Number.MIN_SAFE_INTEGER;
750
+ const max = "max" in range ? range.max : Number.MAX_SAFE_INTEGER;
751
+ if ( value >= min && value <= max ) {
752
+ return true;
753
+ }
754
+ }
755
+ return false;
756
+ }
757
+
758
+ return true;
759
+ };
760
+
761
+ ObjectTypeUtil.doesStringMeetConstraints = function (value, constraints) {
762
+
763
+ if ( ! constraints ) {
764
+ return true;
765
+ }
766
+
767
+ if ( constraints.sizes ) {
768
+ // if size is constrained, value must have a length property
769
+ if ( value.length === undefined ) {
770
+ return false;
771
+ }
772
+ const len = value.length;
773
+ for ( const range of constraints.sizes ) {
774
+ const min = "min" in range ? range.min : Number.MIN_SAFE_INTEGER;
775
+ const max = "max" in range ? range.max : Number.MAX_SAFE_INTEGER;
776
+ if ( len >= min && len <= max ) {
777
+ return true;
778
+ }
779
+ }
780
+ return false;
781
+ }
782
+
783
+ return true;
784
+ };
785
+
689
786
  /*****************************************************************************
690
787
  ** PDU class definitions
691
788
  **/
@@ -3760,53 +3857,17 @@ MibNode.prototype.getConstraintsFromProvider = function () {
3760
3857
  }
3761
3858
  };
3762
3859
 
3763
- MibNode.prototype.setValue = function (newValue) {
3764
- var len;
3765
- var min;
3766
- var max;
3767
- var range;
3768
- var found = false;
3769
- var constraints = this.getConstraintsFromProvider ();
3770
- if ( ! constraints ) {
3771
- this.value = newValue;
3860
+ MibNode.prototype.setValue = function (typeFromSet, valueFromSet) {
3861
+ const constraints = this.getConstraintsFromProvider ();
3862
+ try {
3863
+ const castValue = ObjectTypeUtil.castSetValue (typeFromSet, valueFromSet, constraints);
3864
+ this.value = castValue;
3772
3865
  return true;
3866
+ } catch (error) {
3867
+ console.error ("Error setting value: " + error.message);
3868
+ return false;
3773
3869
  }
3774
- if ( constraints.enumeration ) {
3775
- if ( ! constraints.enumeration[newValue] ) {
3776
- return false;
3777
- }
3778
- } else if ( constraints.ranges ) {
3779
- for ( range of constraints.ranges ) {
3780
- min = "min" in range ? range.min : Number.MIN_SAFE_INTEGER;
3781
- max = "max" in range ? range.max : Number.MAX_SAFE_INTEGER;
3782
- if ( newValue >= min && newValue <= max ) {
3783
- found = true;
3784
- break;
3785
- }
3786
- }
3787
- if ( ! found ) {
3788
- return false;
3789
- }
3790
- } else if ( constraints.sizes ) {
3791
- // if size is constrained, value must have a length property
3792
- if ( newValue.length === undefined ) {
3793
- return false;
3794
- }
3795
- len = newValue.length;
3796
- for ( range of constraints.sizes ) {
3797
- min = "min" in range ? range.min : Number.MIN_SAFE_INTEGER;
3798
- max = "max" in range ? range.max : Number.MAX_SAFE_INTEGER;
3799
- if ( len >= min && len <= max ) {
3800
- found = true;
3801
- break;
3802
- }
3803
- }
3804
- if ( ! found ) {
3805
- return false;
3806
- }
3807
- }
3808
- this.value = newValue;
3809
- return true;
3870
+
3810
3871
  };
3811
3872
 
3812
3873
  MibNode.prototype.getInstanceNodeForTableRow = function () {
@@ -3964,10 +4025,11 @@ MibNode.oidIsDescended = function (oid, ancestor) {
3964
4025
  return isAncestor;
3965
4026
  };
3966
4027
 
3967
- var Mib = function () {
4028
+ var Mib = function (options) {
3968
4029
  var providersByOid;
3969
4030
  this.root = new MibNode ([], null);
3970
4031
  this.providerNodes = {};
4032
+ this.options = options;
3971
4033
 
3972
4034
  // this.providers will be modified throughout this code.
3973
4035
  // Keep this.providersByOid in sync with it
@@ -4073,8 +4135,13 @@ Mib.prototype.addProviderToNode = function (provider) {
4073
4135
  return node;
4074
4136
  };
4075
4137
 
4076
- Mib.prototype.getColumnFromProvider = function (provider, indexEntry) {
4077
- var column = null;
4138
+ Mib.prototype.getColumnForColumnNumberFromTableProvider = function (provider, columnNumber) {
4139
+ const column = provider.tableColumns.find (column => column.number == columnNumber );
4140
+ return column;
4141
+ };
4142
+
4143
+ Mib.prototype.getColumnForIndexEntryFromTableProvider = function (provider, indexEntry) {
4144
+ let column = null;
4078
4145
  if ( indexEntry.columnName ) {
4079
4146
  column = provider.tableColumns.filter (column => column.name == indexEntry.columnName )[0];
4080
4147
  } else if ( indexEntry.columnNumber !== undefined && indexEntry.columnNumber !== null ) {
@@ -4091,16 +4158,16 @@ Mib.prototype.populateIndexEntryFromColumn = function (localProvider, indexEntry
4091
4158
  }
4092
4159
  if ( indexEntry.foreign ) {
4093
4160
  // Explicit foreign table is first to search
4094
- column = this.getColumnFromProvider (this.providers[indexEntry.foreign], indexEntry);
4161
+ column = this.getColumnForIndexEntryFromTableProvider (this.providers[indexEntry.foreign], indexEntry);
4095
4162
  } else {
4096
4163
  // If foreign table isn't given, search the local table next
4097
- column = this.getColumnFromProvider (localProvider, indexEntry);
4164
+ column = this.getColumnForIndexEntryFromTableProvider (localProvider, indexEntry);
4098
4165
  if ( ! column ) {
4099
4166
  // as a last resort, try to find the column in a foreign table
4100
4167
  tableProviders = Object.values(this.providers).
4101
4168
  filter ( prov => prov.type == MibProviderType.Table );
4102
4169
  for ( var provider of tableProviders ) {
4103
- column = this.getColumnFromProvider (provider, indexEntry);
4170
+ column = this.getColumnForIndexEntryFromTableProvider (provider, indexEntry);
4104
4171
  if ( column ) {
4105
4172
  indexEntry.foreign = provider.name;
4106
4173
  break;
@@ -4131,7 +4198,13 @@ Mib.prototype.populateIndexEntryFromColumn = function (localProvider, indexEntry
4131
4198
 
4132
4199
  Mib.prototype.registerProvider = function (provider) {
4133
4200
  this.providers[provider.name] = provider;
4134
- if ( provider.type == MibProviderType.Table ) {
4201
+ if ( provider.type == MibProviderType.Scalar ) {
4202
+ if ( this.options?.addScalarDefaultsOnRegistration ) {
4203
+ if ( provider.defVal ) {
4204
+ this.setScalarValue (provider.name, provider.defVal);
4205
+ }
4206
+ }
4207
+ } else if ( provider.type == MibProviderType.Table ) {
4135
4208
  if ( provider.tableAugments ) {
4136
4209
  if ( provider.tableAugments == provider.name ) {
4137
4210
  throw new Error ("Table " + provider.name + " cannot augment itself");
@@ -4278,7 +4351,7 @@ Mib.prototype.setScalarValue = function (scalarName, newValue) {
4278
4351
  instanceNode = this.lookup (instanceAddress);
4279
4352
  instanceNode.valueType = provider.scalarType;
4280
4353
  }
4281
- const isValidValue = ObjectTypeUtil.isValid(instanceNode.valueType, newValue);
4354
+ const isValidValue = ObjectTypeUtil.isValid(instanceNode.valueType, newValue, provider.constraints);
4282
4355
  if ( ! isValidValue ) {
4283
4356
  throw new TypeError(`Invalid value for ${scalarName} of type ${instanceNode.valueType}: ${newValue}`);
4284
4357
  }
@@ -4415,13 +4488,13 @@ Mib.prototype.validateTableRow = function (table, row) {
4415
4488
  const tableIndex = provider.tableIndex;
4416
4489
  const foreignIndexOffset = tableIndex.filter ( indexPart => indexPart.foreign ).length;
4417
4490
  for ( let i = 0; i < provider.tableColumns.length ; i++ ) {
4418
- const column = provider.tableColumns[i];
4419
- const isColumnIndex = tableIndex.some ( indexPart => indexPart.columnNumber == column.number );
4420
- if ( ! isColumnIndex || ! (column.maxAccess === MaxAccess['not-accessible'] || column.maxAccess === MaxAccess['accessible-for-notify']) ) {
4491
+ const providerColumn = provider.tableColumns[i];
4492
+ const isColumnIndex = tableIndex.some ( indexPart => indexPart.columnNumber == providerColumn.number );
4493
+ if ( ! isColumnIndex || ! (providerColumn.maxAccess === MaxAccess['not-accessible'] || providerColumn.maxAccess === MaxAccess['accessible-for-notify']) ) {
4421
4494
  const rowValueIndex = foreignIndexOffset + i;
4422
- const isValidValue = ObjectTypeUtil.isValid(column.type, row[rowValueIndex]);
4495
+ const isValidValue = ObjectTypeUtil.isValid(providerColumn.type, row[rowValueIndex], providerColumn.constraints);
4423
4496
  if ( ! isValidValue ) {
4424
- throw new TypeError(`Invalid value for ${table} column ${column.name} (index ${rowValueIndex}): ${row[rowValueIndex]} (in row [${row}])`);
4497
+ throw new TypeError(`Invalid value for ${table} column ${providerColumn.name} (index ${rowValueIndex}): ${row[rowValueIndex]} (in row [${row}])`);
4425
4498
  }
4426
4499
  }
4427
4500
  }
@@ -4461,11 +4534,7 @@ Mib.prototype.addTableRow = function (table, row) {
4461
4534
  };
4462
4535
 
4463
4536
  Mib.prototype.getTableColumnDefinitions = function (table) {
4464
- var providerNode;
4465
- var provider;
4466
-
4467
- providerNode = this.getProviderNodeForTable (table);
4468
- provider = providerNode.provider;
4537
+ const provider = this.providers[table];
4469
4538
  return provider.tableColumns;
4470
4539
  };
4471
4540
 
@@ -4574,7 +4643,8 @@ Mib.prototype.setTableSingleCell = function (table, columnNumber, rowIndex, valu
4574
4643
  const instanceAddress = this.getTableRowInstanceFromRowIndex (provider, rowIndex);
4575
4644
  const columnNode = providerNode.children[columnNumber];
4576
4645
  const instanceNode = columnNode.getInstanceNodeForTableRowIndex (instanceAddress);
4577
- const isValidValue = ObjectTypeUtil.isValid(instanceNode.valueType, value);
4646
+ const providerColumn = this.getColumnForColumnNumberFromTableProvider (provider, columnNumber);
4647
+ const isValidValue = ObjectTypeUtil.isValid(instanceNode.valueType, value, providerColumn?.constraints);
4578
4648
  if ( ! isValidValue ) {
4579
4649
  throw new TypeError(`Invalid value for ${table} column ${columnNumber} of type ${instanceNode.valueType}: ${value}`);
4580
4650
  }
@@ -4699,8 +4769,8 @@ Mib.getSubOidFromBaseOid = function (oid, base) {
4699
4769
  return oid.substring (base.length + 1);
4700
4770
  };
4701
4771
 
4702
- Mib.create = function () {
4703
- return new Mib ();
4772
+ Mib.create = function (options) {
4773
+ return new Mib (options);
4704
4774
  };
4705
4775
 
4706
4776
  var MibRequest = function (requestDefinition) {
@@ -5287,10 +5357,10 @@ Agent.prototype.request = function (socket, requestMessage, rinfo) {
5287
5357
 
5288
5358
  } else {
5289
5359
  // No special handling required. Just save the new value.
5290
- let setResult = mibRequests[savedIndex].instanceNode.setValue (ObjectTypeUtil.castSetValue (
5360
+ const setResult = mibRequests[savedIndex].instanceNode.setValue (
5291
5361
  requestPdu.varbinds[savedIndex].type,
5292
5362
  requestPdu.varbinds[savedIndex].value
5293
- ));
5363
+ );
5294
5364
  if ( ! setResult ) {
5295
5365
  if ( typeof responsePdu.errorStatus == "undefined" || responsePdu.errorStatus == ErrorStatus.NoError ) {
5296
5366
  responsePdu.errorStatus = ErrorStatus.WrongValue;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "net-snmp",
3
- "version": "3.16.1",
3
+ "version": "3.18.0",
4
4
  "description": "JavaScript implementation of the Simple Network Management Protocol (SNMP)",
5
5
  "main": "index.js",
6
6
  "directories": {
@@ -0,0 +1,210 @@
1
+ TEST-MIB DEFINITIONS ::= BEGIN
2
+
3
+ IMPORTS
4
+ MODULE-IDENTITY, OBJECT-TYPE, Integer32, IpAddress, TimeTicks
5
+ FROM SNMPv2-SMI
6
+ DisplayString, TEXTUAL-CONVENTION
7
+ FROM SNMPv2-TC;
8
+
9
+ testMIB MODULE-IDENTITY
10
+ LAST-UPDATED "202501060000Z"
11
+ ORGANIZATION "Example Organization"
12
+ CONTACT-INFO "support@example.org"
13
+ DESCRIPTION "A test MIB for node-net-snmp library"
14
+ REVISION "202501060000Z"
15
+ DESCRIPTION "Initial version of the test MIB"
16
+ ::= { enterprises 99999 }
17
+
18
+ -- Scalars
19
+ testScalarInteger OBJECT-TYPE
20
+ SYNTAX Integer32
21
+ MAX-ACCESS read-write
22
+ STATUS current
23
+ DESCRIPTION "An integer scalar"
24
+ ::= { testMIB 1 }
25
+
26
+ testScalarEnum OBJECT-TYPE
27
+ SYNTAX INTEGER { up(1), down(2), unknown(3) }
28
+ MAX-ACCESS read-write
29
+ STATUS current
30
+ DESCRIPTION "An integer scalar with enumerated type"
31
+ ::= { testMIB 2 }
32
+
33
+ testScalarRange OBJECT-TYPE
34
+ SYNTAX Integer32 (1..100)
35
+ MAX-ACCESS read-write
36
+ STATUS current
37
+ DESCRIPTION "An integer scalar with a range constraint"
38
+ ::= { testMIB 3 }
39
+
40
+ testScalarString OBJECT-TYPE
41
+ SYNTAX DisplayString
42
+ MAX-ACCESS read-write
43
+ STATUS current
44
+ DESCRIPTION "A string scalar"
45
+ ::= { testMIB 4 }
46
+
47
+ testScalarStringSize OBJECT-TYPE
48
+ SYNTAX OCTET STRING (SIZE(1..32))
49
+ MAX-ACCESS read-write
50
+ STATUS current
51
+ DESCRIPTION "A string scalar with a size constraint"
52
+ ::= { testMIB 5 }
53
+
54
+ testScalarIntegerDefval OBJECT-TYPE
55
+ SYNTAX Integer32
56
+ MAX-ACCESS read-write
57
+ STATUS current
58
+ DESCRIPTION "An integer scalar"
59
+ DEFVAL { 49 }
60
+ ::= { testMIB 6 }
61
+
62
+
63
+ -- Tables
64
+ testTable1 OBJECT-TYPE
65
+ SYNTAX SEQUENCE OF TestEntry1
66
+ MAX-ACCESS not-accessible
67
+ STATUS current
68
+ DESCRIPTION "A table with a single integer index"
69
+ ::= { testMIB 10 }
70
+
71
+ testEntry1 OBJECT-TYPE
72
+ SYNTAX TestEntry1
73
+ MAX-ACCESS not-accessible
74
+ STATUS current
75
+ DESCRIPTION "An entry in testTable1"
76
+ INDEX { testTable1Index }
77
+ ::= { testTable1 1 }
78
+
79
+ TestEntry1 ::= SEQUENCE {
80
+ testTable1Index Integer32,
81
+ testTable1Value DisplayString
82
+ }
83
+
84
+ testTable1Index OBJECT-TYPE
85
+ SYNTAX Integer32
86
+ MAX-ACCESS not-accessible
87
+ STATUS current
88
+ DESCRIPTION "Index for testTable1"
89
+ ::= { testEntry1 1 }
90
+
91
+ testTable1Value OBJECT-TYPE
92
+ SYNTAX DisplayString
93
+ MAX-ACCESS read-write
94
+ STATUS current
95
+ DESCRIPTION "Value in testTable1"
96
+ ::= { testEntry1 2 }
97
+
98
+ testTable2 OBJECT-TYPE
99
+ SYNTAX SEQUENCE OF TestEntry2
100
+ MAX-ACCESS not-accessible
101
+ STATUS current
102
+ DESCRIPTION "A table with a string index"
103
+ ::= { testMIB 11 }
104
+
105
+ testEntry2 OBJECT-TYPE
106
+ SYNTAX TestEntry2
107
+ MAX-ACCESS not-accessible
108
+ STATUS current
109
+ DESCRIPTION "An entry in testTable2"
110
+ INDEX { testTable2Index }
111
+ ::= { testTable2 1 }
112
+
113
+ TestEntry2 ::= SEQUENCE {
114
+ testTable2Index DisplayString,
115
+ testTable2Value Integer32
116
+ }
117
+
118
+ testTable2Index OBJECT-TYPE
119
+ SYNTAX DisplayString
120
+ MAX-ACCESS not-accessible
121
+ STATUS current
122
+ DESCRIPTION "String index for testTable2"
123
+ ::= { testEntry2 1 }
124
+
125
+ testTable2Value OBJECT-TYPE
126
+ SYNTAX Integer32
127
+ MAX-ACCESS read-write
128
+ STATUS current
129
+ DESCRIPTION "Value in testTable2"
130
+ ::= { testEntry2 2 }
131
+
132
+ testTableForeignKey OBJECT-TYPE
133
+ SYNTAX SEQUENCE OF TestEntryForeignKey
134
+ MAX-ACCESS not-accessible
135
+ STATUS current
136
+ DESCRIPTION "A table with a foreign key"
137
+ ::= { testMIB 12 }
138
+
139
+ testEntryForeignKey OBJECT-TYPE
140
+ SYNTAX TestEntryForeignKey
141
+ MAX-ACCESS not-accessible
142
+ STATUS current
143
+ DESCRIPTION "An entry with a foreign key"
144
+ INDEX { testTable1Index }
145
+ ::= { testTableForeignKey 1 }
146
+
147
+ TestEntryForeignKey ::= SEQUENCE {
148
+ testForeignKeyValue DisplayString
149
+ }
150
+
151
+ testForeignKeyValue OBJECT-TYPE
152
+ SYNTAX DisplayString
153
+ MAX-ACCESS read-write
154
+ STATUS current
155
+ DESCRIPTION "Foreign key value"
156
+ ::= { testEntryForeignKey 2 }
157
+
158
+ testTableComposite OBJECT-TYPE
159
+ SYNTAX SEQUENCE OF TestEntryComposite
160
+ MAX-ACCESS not-accessible
161
+ STATUS current
162
+ DESCRIPTION "A table with a composite key"
163
+ ::= { testMIB 13 }
164
+
165
+ testEntryComposite OBJECT-TYPE
166
+ SYNTAX TestEntryComposite
167
+ MAX-ACCESS not-accessible
168
+ STATUS current
169
+ DESCRIPTION "An entry in the composite key table"
170
+ INDEX { testTable1Index, testTable2Index }
171
+ ::= { testTableComposite 1 }
172
+
173
+ TestEntryComposite ::= SEQUENCE {
174
+ testCompositeValue Integer32
175
+ }
176
+
177
+ testCompositeValue OBJECT-TYPE
178
+ SYNTAX Integer32
179
+ MAX-ACCESS read-write
180
+ STATUS current
181
+ DESCRIPTION "Composite key value"
182
+ ::= { testEntryComposite 2 }
183
+
184
+ testTableAugment OBJECT-TYPE
185
+ SYNTAX SEQUENCE OF TestEntryAugment
186
+ MAX-ACCESS not-accessible
187
+ STATUS current
188
+ DESCRIPTION "A table that augments testTable1"
189
+ ::= { testMIB 14 }
190
+
191
+ testEntryAugment OBJECT-TYPE
192
+ SYNTAX TestEntryAugment
193
+ MAX-ACCESS not-accessible
194
+ STATUS current
195
+ DESCRIPTION "An augmented entry"
196
+ AUGMENTS { testEntry1 }
197
+ ::= { testTableAugment 1 }
198
+
199
+ TestEntryAugment ::= SEQUENCE {
200
+ testAugmentValue TimeTicks
201
+ }
202
+
203
+ testAugmentValue OBJECT-TYPE
204
+ SYNTAX TimeTicks
205
+ MAX-ACCESS read-write
206
+ STATUS current
207
+ DESCRIPTION "Augmented value"
208
+ ::= { testEntryAugment 2 }
209
+
210
+ END