net-snmp 3.12.0 → 3.13.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/.travis.yml +3 -0
- package/README.md +8 -0
- package/eslint.config.js +95 -0
- package/example/snmp-agent.js +2 -2
- package/index.js +5 -0
- package/lib/mib.js +48 -8
- package/package.json +2 -2
- package/.eslintrc +0 -76
package/.travis.yml
CHANGED
package/README.md
CHANGED
@@ -3381,6 +3381,14 @@ Example programs are included under the module's `example` directory.
|
|
3381
3381
|
|
3382
3382
|
* Add multiple socket listener support for agent and receiver
|
3383
3383
|
|
3384
|
+
## Version 3.12.1 - 21/08/2024
|
3385
|
+
|
3386
|
+
* Fix SNMPv1 session walk infinite loop condition
|
3387
|
+
|
3388
|
+
## Version 3.13.0 - 03/09/2024
|
3389
|
+
|
3390
|
+
* Add support for out-of-order MIB dependencies
|
3391
|
+
|
3384
3392
|
# License
|
3385
3393
|
|
3386
3394
|
Copyright (c) 2020 Mark Abrahams <mark@abrahams.co.nz>
|
package/eslint.config.js
ADDED
@@ -0,0 +1,95 @@
|
|
1
|
+
module.exports = [
|
2
|
+
{
|
3
|
+
files: ['**/*.js'],
|
4
|
+
languageOptions: {
|
5
|
+
ecmaVersion: 2020,
|
6
|
+
sourceType: 'module',
|
7
|
+
globals: {
|
8
|
+
// Browser globals
|
9
|
+
window: 'readonly',
|
10
|
+
document: 'readonly',
|
11
|
+
navigator: 'readonly',
|
12
|
+
|
13
|
+
// Node.js globals
|
14
|
+
require: 'readonly',
|
15
|
+
module: 'readonly',
|
16
|
+
process: 'readonly',
|
17
|
+
__dirname: 'readonly',
|
18
|
+
__filename: 'readonly',
|
19
|
+
console: 'readonly',
|
20
|
+
exports: 'readonly',
|
21
|
+
Buffer: 'readonly',
|
22
|
+
setInterval: 'readonly',
|
23
|
+
setTimeout: 'readonly',
|
24
|
+
clearInterval: 'readonly',
|
25
|
+
clearTimeout: 'readonly',
|
26
|
+
|
27
|
+
// Mocha globals
|
28
|
+
describe: 'readonly',
|
29
|
+
it: 'readonly',
|
30
|
+
before: 'readonly',
|
31
|
+
after: 'readonly',
|
32
|
+
beforeEach: 'readonly',
|
33
|
+
afterEach: 'readonly',
|
34
|
+
|
35
|
+
// ES6 globals
|
36
|
+
Promise: 'readonly',
|
37
|
+
Set: 'readonly',
|
38
|
+
Map: 'readonly',
|
39
|
+
|
40
|
+
// User-defined globals
|
41
|
+
$: 'readonly',
|
42
|
+
System: 'readonly',
|
43
|
+
expect: 'readonly',
|
44
|
+
},
|
45
|
+
},
|
46
|
+
linterOptions: {
|
47
|
+
reportUnusedDisableDirectives: true,
|
48
|
+
},
|
49
|
+
rules: {
|
50
|
+
'accessor-pairs': 'error',
|
51
|
+
'arrow-spacing': 'error',
|
52
|
+
'brace-style': ['error', '1tbs', { allowSingleLine: true }],
|
53
|
+
camelcase: ['error', { properties: 'never' }],
|
54
|
+
'comma-spacing': ['error', { before: false, after: true }],
|
55
|
+
'eol-last': ['error', 'always'],
|
56
|
+
'key-spacing': ['error', { beforeColon: false, afterColon: true, mode: 'minimum' }],
|
57
|
+
'keyword-spacing': ['error', {}],
|
58
|
+
'no-cond-assign': 'error',
|
59
|
+
'no-console': ['off', { allow: ['warn', 'error'] }],
|
60
|
+
'no-constant-condition': ['error', { checkLoops: false }],
|
61
|
+
'no-eval': 'error',
|
62
|
+
'no-fallthrough': 'off',
|
63
|
+
'no-mixed-spaces-and-tabs': 'error',
|
64
|
+
'no-restricted-globals': ['error', 'event'],
|
65
|
+
'no-restricted-syntax': [
|
66
|
+
'error',
|
67
|
+
{
|
68
|
+
selector:
|
69
|
+
"*:not(ExpressionStatement) > CallExpression[callee.property.name='sort']:not([callee.object.type='CallExpression']):not([callee.object.type='ArrayExpression']):not([callee.object.name='mongoUtil'])",
|
70
|
+
message:
|
71
|
+
'Restricted Array Mutation: Use `array.slice().sort(...)` if mutation was not intended, otherwise place on own line.',
|
72
|
+
},
|
73
|
+
{
|
74
|
+
selector:
|
75
|
+
"*:not(ExpressionStatement) > CallExpression[callee.property.name='reverse']:not([callee.object.type='CallExpression']):not([callee.object.type='ArrayExpression'])",
|
76
|
+
message:
|
77
|
+
'Restricted Array Mutation: Use `array.slice().reverse(...)` if mutation was not intended, otherwise place on own line.',
|
78
|
+
},
|
79
|
+
{
|
80
|
+
selector: "*:not(ExpressionStatement) > CallExpression[callee.property.name='push']",
|
81
|
+
message:
|
82
|
+
'Restricted Array Mutation: `array.push(...)` returns push count, not array reference, place statement on own line.',
|
83
|
+
},
|
84
|
+
],
|
85
|
+
'no-undef': 'error',
|
86
|
+
'no-unused-expressions': 'error',
|
87
|
+
'no-unused-vars': ['error', { vars: 'all', args: 'none' }],
|
88
|
+
'no-useless-escape': 'off',
|
89
|
+
'no-with': 'error',
|
90
|
+
'padding-line-between-statements': ['error', { blankLine: 'always', prev: '*', next: 'function' }],
|
91
|
+
semi: ['error', 'always'],
|
92
|
+
'space-before-blocks': ['error', 'always'],
|
93
|
+
},
|
94
|
+
},
|
95
|
+
];
|
package/example/snmp-agent.js
CHANGED
package/index.js
CHANGED
@@ -2617,6 +2617,9 @@ function walkCb (req, error, varbinds) {
|
|
2617
2617
|
if (! done)
|
2618
2618
|
oid = varbinds[0][varbinds[0].length - 1].oid;
|
2619
2619
|
} else {
|
2620
|
+
if (varbinds[0].type == ObjectType.EndOfMibView) {
|
2621
|
+
done = 1;
|
2622
|
+
}
|
2620
2623
|
if (! done) {
|
2621
2624
|
if (req.feedCb (varbinds)) {
|
2622
2625
|
done = 1;
|
@@ -5254,6 +5257,7 @@ Agent.prototype.addGetNextVarbind = function (targetVarbinds, startOid) {
|
|
5254
5257
|
|
5255
5258
|
try {
|
5256
5259
|
startNode = this.mib.lookup (startOid);
|
5260
|
+
// eslint-disable-next-line no-unused-vars
|
5257
5261
|
} catch ( error ) {
|
5258
5262
|
startOid = '1.3.6.1';
|
5259
5263
|
startNode = this.mib.lookup (startOid);
|
@@ -6196,6 +6200,7 @@ Subagent.prototype.addGetNextVarbind = function (targetVarbinds, startOid) {
|
|
6196
6200
|
|
6197
6201
|
try {
|
6198
6202
|
startNode = this.mib.lookup (startOid);
|
6203
|
+
// eslint-disable-next-line no-unused-vars
|
6199
6204
|
} catch ( error ) {
|
6200
6205
|
startOid = '1.3.6.1';
|
6201
6206
|
startNode = this.mib.lookup (startOid);
|
package/lib/mib.js
CHANGED
@@ -346,6 +346,7 @@ var MIB = function (dir) {
|
|
346
346
|
var Symbols = this.SymbolBuffer[ModuleName];
|
347
347
|
var Object = Module;
|
348
348
|
var MACROName = '';
|
349
|
+
let unresolvedObjects = [];
|
349
350
|
for (var i = 0; i < Symbols.length; i++) {
|
350
351
|
switch (Symbols[i]) {
|
351
352
|
case '::=': //new OBJECT to define
|
@@ -372,9 +373,14 @@ var MIB = function (dir) {
|
|
372
373
|
Object[Symbols[i - 2]]['OID'] = '0.0';
|
373
374
|
Object[Symbols[i - 2]]['NameSpace'] = 'null';
|
374
375
|
} else {
|
375
|
-
const { oidString, nameString } = this.getOidAndNamePaths(Object[Symbols[i - 2]]['OBJECT IDENTIFIER'], Symbols[i - 2], ModuleName);
|
376
|
+
const { oidString, nameString, unresolvedObject } = this.getOidAndNamePaths(Object[Symbols[i - 2]]['OBJECT IDENTIFIER'], Symbols[i - 2], ModuleName);
|
376
377
|
Object[Symbols[i - 2]]['OID'] = oidString;
|
377
378
|
Object[Symbols[i - 2]]['NameSpace'] = nameString;
|
379
|
+
if (unresolvedObject) {
|
380
|
+
if ( ! unresolvedObjects.includes(unresolvedObject) ) {
|
381
|
+
unresolvedObjects.push(unresolvedObject);
|
382
|
+
}
|
383
|
+
}
|
378
384
|
// Object[Symbols[i - 2]]['ModuleName'] = ModuleName;
|
379
385
|
// Object[Symbols[i - 2]]['ObjectName'] = Symbols[i - 2];
|
380
386
|
}
|
@@ -531,11 +537,14 @@ var MIB = function (dir) {
|
|
531
537
|
Object[Symbols[r - 1]]['OID'] = '0.0';
|
532
538
|
Object[Symbols[r - 1]]['NameSpace'] = 'null';
|
533
539
|
} else {
|
534
|
-
const { oidString, nameString } = this.getOidAndNamePaths(Object[Symbols[r - 1]]['OBJECT IDENTIFIER'], Symbols[r - 1], ModuleName);
|
540
|
+
const { oidString, nameString, unresolvedObject } = this.getOidAndNamePaths(Object[Symbols[r - 1]]['OBJECT IDENTIFIER'], Symbols[r - 1], ModuleName);
|
535
541
|
Object[Symbols[r - 1]]['OID'] = oidString;
|
536
542
|
Object[Symbols[r - 1]]['NameSpace'] = nameString;
|
537
|
-
|
538
|
-
|
543
|
+
if (unresolvedObject) {
|
544
|
+
if ( ! unresolvedObjects.includes(unresolvedObject) ) {
|
545
|
+
unresolvedObjects.push(unresolvedObject);
|
546
|
+
}
|
547
|
+
}
|
539
548
|
}
|
540
549
|
if ( Object[Symbols[r - 1]]['REVISIONS-DESCRIPTIONS'] &&
|
541
550
|
Object[Symbols[r - 1]]['REVISIONS-DESCRIPTIONS'].length == 1 &&
|
@@ -643,6 +652,29 @@ var MIB = function (dir) {
|
|
643
652
|
|
644
653
|
|
645
654
|
}
|
655
|
+
// attempt OID/namespace reconstruction for unresolved objects, as parsing has finished
|
656
|
+
if (unresolvedObjects.length > 0) {
|
657
|
+
for (const unresolved of unresolvedObjects) {
|
658
|
+
const obj = this.Modules[ModuleName][unresolved];
|
659
|
+
|
660
|
+
const { oidString, nameString, unresolvedObject } = this.getOidAndNamePaths(obj['OBJECT IDENTIFIER'], unresolved, ModuleName);
|
661
|
+
this.Modules[ModuleName][unresolved].NameSpace = nameString;
|
662
|
+
this.Modules[ModuleName][unresolved].OID = oidString;
|
663
|
+
|
664
|
+
// unresolvedObject is only returned if still unable to resolve (likely due to error in MIB)
|
665
|
+
// unresolved OID will propagate to all children as well
|
666
|
+
if (unresolvedObject) {
|
667
|
+
if (obj.NameSpace) {
|
668
|
+
const unresolvedParent = obj.NameSpace.split('.')[1];
|
669
|
+
if (unresolvedParent !== obj.ObjectName) {
|
670
|
+
console.warn(`Unable to mount node '${obj.ObjectName}', cannot resolve parent object '${unresolvedParent}'.`);
|
671
|
+
continue;
|
672
|
+
}
|
673
|
+
}
|
674
|
+
console.warn(`Unable to mount node '${obj.ObjectName}', cannot resolve object identifier '${obj['OBJECT IDENTIFIER']}'.`);
|
675
|
+
}
|
676
|
+
}
|
677
|
+
}
|
646
678
|
}
|
647
679
|
}
|
648
680
|
},
|
@@ -761,6 +793,7 @@ var MIB = function (dir) {
|
|
761
793
|
nameEntries.push(ObjectName);
|
762
794
|
let parentOidPrefix;
|
763
795
|
let parentNamePrefix;
|
796
|
+
let unresolvedObject;
|
764
797
|
if ( parent == 'iso' ) {
|
765
798
|
parentOidPrefix = '1';
|
766
799
|
parentNamePrefix = 'iso';
|
@@ -780,18 +813,25 @@ var MIB = function (dir) {
|
|
780
813
|
}
|
781
814
|
if ( ! parentObject ) {
|
782
815
|
// occurs for out-of-order dependencies in a module
|
783
|
-
//
|
816
|
+
// return partial OID/namespace and name of unresolved object
|
817
|
+
unresolvedObject = ObjectName;
|
784
818
|
return {
|
785
|
-
oidString: '',
|
786
|
-
nameString: ''
|
819
|
+
oidString: '.' + oidEntries.join('.'),
|
820
|
+
nameString: '.' + nameEntries.join('.'),
|
821
|
+
unresolvedObject
|
787
822
|
};
|
788
823
|
}
|
824
|
+
// occurs for all children of an unresolved node
|
825
|
+
if ( parentObject.OID.startsWith('.') ) {
|
826
|
+
unresolvedObject = ObjectName;
|
827
|
+
}
|
789
828
|
parentOidPrefix = parentObject['OID'];
|
790
829
|
parentNamePrefix = parentObject['NameSpace'];
|
791
830
|
}
|
792
831
|
return {
|
793
832
|
oidString: parentOidPrefix + '.' + oidEntries.join('.'),
|
794
|
-
nameString: parentNamePrefix + '.' + nameEntries.join('.')
|
833
|
+
nameString: parentNamePrefix + '.' + nameEntries.join('.'),
|
834
|
+
unresolvedObject: unresolvedObject || undefined
|
795
835
|
};
|
796
836
|
}
|
797
837
|
});
|
package/package.json
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
{
|
2
2
|
"name": "net-snmp",
|
3
|
-
"version": "3.
|
3
|
+
"version": "3.13.0",
|
4
4
|
"description": "JavaScript implementation of the Simple Network Management Protocol (SNMP)",
|
5
5
|
"main": "index.js",
|
6
6
|
"directories": {
|
@@ -11,7 +11,7 @@
|
|
11
11
|
"smart-buffer": "^4.1.0"
|
12
12
|
},
|
13
13
|
"devDependencies": {
|
14
|
-
"eslint": "^
|
14
|
+
"eslint": "^9.9.1",
|
15
15
|
"getopts": "*"
|
16
16
|
},
|
17
17
|
"contributors": [
|
package/.eslintrc
DELETED
@@ -1,76 +0,0 @@
|
|
1
|
-
{
|
2
|
-
"extends": "eslint:recommended",
|
3
|
-
"env": {
|
4
|
-
"es6": true,
|
5
|
-
"node": true,
|
6
|
-
"browser": true,
|
7
|
-
"mocha": true
|
8
|
-
},
|
9
|
-
"parserOptions": {
|
10
|
-
"ecmaVersion": 2016
|
11
|
-
},
|
12
|
-
"globals": {
|
13
|
-
"window": false,
|
14
|
-
"document": false,
|
15
|
-
"$": false,
|
16
|
-
"System": false,
|
17
|
-
"expect": false
|
18
|
-
},
|
19
|
-
"rules": {
|
20
|
-
"accessor-pairs": "error",
|
21
|
-
"arrow-spacing": "error",
|
22
|
-
"brace-style": [ "error", "1tbs", { "allowSingleLine": true } ],
|
23
|
-
"camelcase": [ "error", { "properties": "never" } ],
|
24
|
-
"comma-spacing": ["error", { "before": false, "after": true }],
|
25
|
-
// "curly": [ "error", "all" ],
|
26
|
-
// "dot-notation": "error",
|
27
|
-
"eol-last": ["error", "always"],
|
28
|
-
// "eqeqeq": ["error", "always"],
|
29
|
-
// "indent": ["error", "tab", { "MemberExpression": "off", "SwitchCase": 1, "ObjectExpression": "first" } ],
|
30
|
-
"key-spacing": [ "error", { "beforeColon": false, "afterColon": true, "mode": "minimum" } ],
|
31
|
-
"keyword-spacing": [ "error", {} ],
|
32
|
-
"no-cond-assign": "error",
|
33
|
-
"no-console": ["off", { "allow": ["warn", "error"] }],
|
34
|
-
"no-constant-condition": ["error", { "checkLoops": false }],
|
35
|
-
"no-eval": "error",
|
36
|
-
"no-fallthrough": "off",
|
37
|
-
"no-mixed-spaces-and-tabs": "error",
|
38
|
-
// "no-multiple-empty-lines": "error",
|
39
|
-
"no-restricted-globals": ["error", "event"],
|
40
|
-
"no-restricted-syntax": [
|
41
|
-
"error",
|
42
|
-
{
|
43
|
-
"selector": "*:not(ExpressionStatement) > CallExpression[callee.property.name='sort']:not([callee.object.type='CallExpression']):not([callee.object.type='ArrayExpression']):not([callee.object.name='mongoUtil'])",
|
44
|
-
"message": "Restricted Array Mutation: Use `array.slice().sort(...)` if mutation was not intended, otherwise place on own line."
|
45
|
-
},
|
46
|
-
{
|
47
|
-
"selector": "*:not(ExpressionStatement) > CallExpression[callee.property.name='reverse']:not([callee.object.type='CallExpression']):not([callee.object.type='ArrayExpression'])",
|
48
|
-
"message": "Restricted Array Mutation: Use `array.slice().reverse(...)` if mutation was not intended, otherwise place on own line."
|
49
|
-
},
|
50
|
-
{
|
51
|
-
"selector": "*:not(ExpressionStatement) > CallExpression[callee.property.name='push']",
|
52
|
-
"message": "Restricted Array Mutation: `array.push(...)` returns push count, not array reference, place statement on own line."
|
53
|
-
}
|
54
|
-
],
|
55
|
-
// "no-return-assign": "error",
|
56
|
-
// "no-trailing-spaces": "error",
|
57
|
-
"no-undef": "error",
|
58
|
-
"no-unused-expressions": "error",
|
59
|
-
"no-unused-vars": ["error", { "vars": "all", "args": "none" }],
|
60
|
-
// "no-use-before-define": [ "error", { "functions": false } ],
|
61
|
-
"no-useless-escape": "off",
|
62
|
-
"no-with": "error",
|
63
|
-
"padding-line-between-statements": [
|
64
|
-
"error",
|
65
|
-
{ "blankLine": "always", "prev": "*", "next": "function" }
|
66
|
-
],
|
67
|
-
// "quotes": [ "error", "double", { "allowTemplateLiterals": true, "avoidEscape": true } ],
|
68
|
-
"semi": [ "error", "always" ],
|
69
|
-
"space-before-blocks": [ "error", "always" ],
|
70
|
-
// "space-before-function-paren": [ "error", { "anonymous": "always", "named": "always", "asyncArrow": "always" } ],
|
71
|
-
// "space-in-parens": [ "error", "never" ],
|
72
|
-
// "space-infix-ops": "error",
|
73
|
-
// "space-unary-ops": [ "error", { "nonwords": true, "overrides": {} } ],
|
74
|
-
// "spaced-comment": [ "error", "always", {"block": {"exceptions": ["*", "!"], "balanced": true}} ]
|
75
|
-
}
|
76
|
-
}
|