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/.vscode/launch.json +111 -156
- package/README.md +15 -1
- package/example/mib-parser.js +9 -9
- package/index.js +158 -88
- package/package.json +1 -1
- package/test/TEST-MIB.mib +210 -0
- package/test/mib.test.js +129 -0
- package/test/object-types.test.js +242 -0
- package/test/varbinds.test.js +53 -0
- package/test/objects.js +0 -238
- package/test/varbinds.js +0 -49
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
|
-
|
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
|
-
|
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.
|
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
|
647
|
-
|
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
|
-
|
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
|
-
|
663
|
-
|
664
|
-
|
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 (
|
3764
|
-
|
3765
|
-
|
3766
|
-
|
3767
|
-
|
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
|
-
|
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.
|
4077
|
-
|
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.
|
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.
|
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.
|
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.
|
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
|
4419
|
-
const isColumnIndex = tableIndex.some ( indexPart => indexPart.columnNumber ==
|
4420
|
-
if ( ! isColumnIndex || ! (
|
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(
|
4495
|
+
const isValidValue = ObjectTypeUtil.isValid(providerColumn.type, row[rowValueIndex], providerColumn.constraints);
|
4423
4496
|
if ( ! isValidValue ) {
|
4424
|
-
throw new TypeError(`Invalid value for ${table} column ${
|
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
|
-
|
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
|
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
|
-
|
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
@@ -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
|