From 97cf7e0181e22cfd0b4f9797a534191b62faf6ef Mon Sep 17 00:00:00 2001 From: pdlove Date: Fri, 16 Nov 2018 22:52:49 -0600 Subject: [PATCH 1/4] Clear file processing variables before parsing This allows you to load multiple files in a row even when those files aren't 100% clean. --- lib/mib.js | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/lib/mib.js b/lib/mib.js index 3b8d589..aff1027 100644 --- a/lib/mib.js +++ b/lib/mib.js @@ -157,7 +157,12 @@ var MIB = function () { ParseModule: function (FileName, Contents) { this.CharBuffer.RowIndex = 0; this.CharBuffer.ColumnIndex = 0; - + this.CharBuffer.isComment=false; + this.CharBuffer.isOID=false; + this.CharBuffer.nested=0; + this.CharBuffer.isList=false; + this.CharBuffer.inGroup=false; + var lines = Contents.split('\n'); var line = ''; var i = 0; From 101d33760720c8807d1ee1b7c4aede12ed3ebed6 Mon Sep 17 00:00:00 2001 From: pdlove Date: Fri, 16 Nov 2018 22:55:06 -0600 Subject: [PATCH 2/4] Compile Required Modules As Needed Allows modules to be loaded out of order. --- lib/mib.js | 462 +++++++++++++++++++++++++++-------------------------- 1 file changed, 235 insertions(+), 227 deletions(-) diff --git a/lib/mib.js b/lib/mib.js index aff1027..190cd76 100644 --- a/lib/mib.js +++ b/lib/mib.js @@ -333,258 +333,266 @@ var MIB = function () { }, Compile: function () { for (var ModuleName in this.SymbolBuffer) { - if (this.SymbolBuffer.hasOwnProperty(ModuleName)) { - if (!this.Modules[ModuleName]) { - this.Modules[ModuleName] = {}; - } - var Module = this.Modules[ModuleName]; - var Symbols = this.SymbolBuffer[ModuleName]; - var Object = Module; - var MACROName = ''; - for (var i = 0; i < Symbols.length; i++) { - switch (Symbols[i]) { - case '::=': //new OBJECT to define - //if OBJECT IDENTIFIER tag IS NEXT, FIND MARCO TO CALL... - if (Symbols[i + 1].indexOf('{') == 0) { - var r = i - 1; - var found = false; - //Go back and find the MACRO to call - while (!found && r > 0) { - r--; - for (var m = 0; m < this.MACROS.length; m++) { - if (Symbols[r] == this.MACROS[m]) { - found = true; - break; - } + this.CompileModule(ModuleName); + } + }, + CompileModule: function(ModuleName) { + if (this.SymbolBuffer.hasOwnProperty(ModuleName)) { + if (!this.Modules[ModuleName]) { + this.Modules[ModuleName] = {}; + } + var Module = this.Modules[ModuleName]; + var Symbols = this.SymbolBuffer[ModuleName]; + var Object = Module; + var MACROName = ''; + for (var i = 0; i < Symbols.length; i++) { + switch (Symbols[i]) { + case '::=': //new OBJECT to define + //if OBJECT IDENTIFIER tag IS NEXT, FIND MARCO TO CALL... + if (Symbols[i + 1].indexOf('{') == 0) { + var r = i - 1; + var found = false; + //Go back and find the MACRO to call + while (!found && r > 0) { + r--; + for (var m = 0; m < this.MACROS.length; m++) { + if (Symbols[r] == this.MACROS[m]) { + found = true; + break; } } - if (Symbols[i - 1] == 'OBJECT IDENTIFIER') { - Object[Symbols[i - 2]] = {}; - Object[Symbols[i - 2]]['ObjectName'] = Symbols[i - 2]; - Object[Symbols[i - 2]]['ModuleName'] = ModuleName; - Object[Symbols[i - 2]]['OBJECT IDENTIFIER'] = Symbols[i + 1].replace("{", "").replace("}", "").trim(); - if (Object[Symbols[i - 2]]['OBJECT IDENTIFIER'] == '0 0') { - Object[Symbols[i - 2]]['OID'] = '0.0'; - Object[Symbols[i - 2]]['NameSpace'] = 'null'; - } - else { - this.OID(Object[Symbols[i - 2]]['OBJECT IDENTIFIER'], '', Symbols[i - 2], '', function (ID, OD) { - - Object[Symbols[i - 2]]['OID'] = ID; - Object[Symbols[i - 2]]['NameSpace'] = OD; - //Object[Symbols[i - 2]]['ModuleName'] = ModuleName; - // Object[Symbols[i - 2]]['ObjectName'] = Symbols[i - 2]; - }); - } + } + if (Symbols[i - 1] == 'OBJECT IDENTIFIER') { + Object[Symbols[i - 2]] = {}; + Object[Symbols[i - 2]]['ObjectName'] = Symbols[i - 2]; + Object[Symbols[i - 2]]['ModuleName'] = ModuleName; + Object[Symbols[i - 2]]['OBJECT IDENTIFIER'] = Symbols[i + 1].replace("{", "").replace("}", "").trim(); + if (Object[Symbols[i - 2]]['OBJECT IDENTIFIER'] == '0 0') { + Object[Symbols[i - 2]]['OID'] = '0.0'; + Object[Symbols[i - 2]]['NameSpace'] = 'null'; + } + else { + this.OID(Object[Symbols[i - 2]]['OBJECT IDENTIFIER'], '', Symbols[i - 2], '', function (ID, OD) { + + Object[Symbols[i - 2]]['OID'] = ID; + Object[Symbols[i - 2]]['NameSpace'] = OD; + //Object[Symbols[i - 2]]['ModuleName'] = ModuleName; + // Object[Symbols[i - 2]]['ObjectName'] = Symbols[i - 2]; + }); + } - } else { - var ObjectName = Symbols[r - 1]; - Object[ObjectName] = {}; - Object[ObjectName]['ObjectName'] = ObjectName - Object[ObjectName]['ModuleName'] = ModuleName; - Object[ObjectName]['MACRO'] = Symbols[r]; - //BUILD OBJECT FROM MACRO TYPE NOTATION - var MARCO = this[Symbols[r]]; - if (!MARCO) { - //HACK IF MARCO IS NOT FOUND - //MARCO = {}; - //return; - } - var c1 = r; - var keychain = []; - for (var notation in MARCO['TYPE NOTATION']) { - var key = notation; - //if TYPE NOTATION does not have a value - if (MARCO['TYPE NOTATION'][notation] == null) { - //then look up the value from the MACRO Root - key = MARCO[notation] - } - keychain.push(key); + } else { + var ObjectName = Symbols[r - 1]; + Object[ObjectName] = {}; + Object[ObjectName]['ObjectName'] = ObjectName + Object[ObjectName]['ModuleName'] = ModuleName; + Object[ObjectName]['MACRO'] = Symbols[r]; + //BUILD OBJECT FROM MACRO TYPE NOTATION + var MARCO = this[Symbols[r]]; + if (!MARCO) { + //HACK IF MARCO IS NOT FOUND + //MARCO = {}; + //return; + } + var c1 = r; + var keychain = []; + for (var notation in MARCO['TYPE NOTATION']) { + var key = notation; + //if TYPE NOTATION does not have a value + if (MARCO['TYPE NOTATION'][notation] == null) { + //then look up the value from the MACRO Root + key = MARCO[notation] } - while (c1 < (i - 1)) { - c1++; - var key = Symbols[c1]; //Parse TYPE NOTATION. ex: SYNTAX, ACCESS, STATUS, DESCRIPTION..... + keychain.push(key); + } + while (c1 < (i - 1)) { + c1++; + var key = Symbols[c1]; //Parse TYPE NOTATION. ex: SYNTAX, ACCESS, STATUS, DESCRIPTION..... - var regExp = /\(([^)]+)\)/; //in parentheses ex: "ethernet-csmacd (6)" + var regExp = /\(([^)]+)\)/; //in parentheses ex: "ethernet-csmacd (6)" - if (keychain.indexOf(key) > -1) { - var val = Symbols[c1 + 1].replace(/"/g, ""); + if (keychain.indexOf(key) > -1) { + var val = Symbols[c1 + 1].replace(/"/g, ""); - //if value array. - if (val.indexOf("{") == 0) { + //if value array. + if (val.indexOf("{") == 0) { + c1++; + while (Symbols[c1].indexOf("}") == -1) { c1++; - while (Symbols[c1].indexOf("}") == -1) { - c1++; - val += Symbols[c1]; - } - //build value array. - val = val.replace("{", "").replace("}", "").split(","); + val += Symbols[c1]; } + //build value array. + val = val.replace("{", "").replace("}", "").split(","); + } - switch (key) { - case 'SYNTAX': - switch (val) { - case 'BITS': - case 'INTEGER': - //integer value array ex: INTEGER {...rfc877-x25 (5), ethernet-csmacd (6)...} - if (Symbols[c1 + 2].indexOf("{") == 0) { - var valObj = val; - val = {}; - val[valObj] = {}; - c1 = c1 + 1; - var integer; - var syntax; - //console.log(ModuleName, ObjectName); - while (Symbols[c1].indexOf("}") == -1) { - c1++; - var ok = false; - if (Symbols[c1].indexOf("(") == 0 && Symbols[c1].length > 1) { - integer = regExp.exec(Symbols[c1]); - syntax = Symbols[c1 - 1]; - ok = true; - } else if (Symbols[c1].indexOf("(") > 0) { - integer = regExp.exec(Symbols[c1]); - syntax = Symbols[c1].split("(")[0]; - ok = true; - } - if (syntax && syntax.indexOf("{") == 0) { - syntax = syntax.split("{")[1].trim(); - } - if (ok) { - val[valObj][integer[1]] = syntax; - //console.log(ModuleName, ObjectName, integer[1], syntax); - } + switch (key) { + case 'SYNTAX': + switch (val) { + case 'BITS': + case 'INTEGER': + //integer value array ex: INTEGER {...rfc877-x25 (5), ethernet-csmacd (6)...} + if (Symbols[c1 + 2].indexOf("{") == 0) { + var valObj = val; + val = {}; + val[valObj] = {}; + c1 = c1 + 1; + var integer; + var syntax; + //console.log(ModuleName, ObjectName); + while (Symbols[c1].indexOf("}") == -1) { + c1++; + var ok = false; + if (Symbols[c1].indexOf("(") == 0 && Symbols[c1].length > 1) { + integer = regExp.exec(Symbols[c1]); + syntax = Symbols[c1 - 1]; + ok = true; + } else if (Symbols[c1].indexOf("(") > 0) { + integer = regExp.exec(Symbols[c1]); + syntax = Symbols[c1].split("(")[0]; + ok = true; + } + if (syntax && syntax.indexOf("{") == 0) { + syntax = syntax.split("{")[1].trim(); + } + if (ok) { + val[valObj][integer[1]] = syntax; + //console.log(ModuleName, ObjectName, integer[1], syntax); } - } - break; - case 'SEQUENCE OF': - val += ' ' + Symbols[c1 + 2]; - c1 = c1 + 2; - break; - default: - break; - } - //SYNTAX value - Object[ObjectName][key] = val; - break; - //case 'DESCRIPTION': - //remove description - // break; - default: - Object[ObjectName][key] = val; - break; - } - } - } - Object[Symbols[r - 1]]['ObjectName'] = Symbols[r - 1]; - Object[Symbols[r - 1]]['ModuleName'] = ModuleName; - Object[Symbols[r - 1]]['OBJECT IDENTIFIER'] = Symbols[i + 1].replace("{", "").replace("}", "").trim(); - if (Object[Symbols[r - 1]]['OBJECT IDENTIFIER'] == '0 0') { - Object[Symbols[r - 1]]['OID'] = '0.0'; - Object[Symbols[r - 1]]['NameSpace'] = 'null'; - } - else { - this.OID(Object[Symbols[r - 1]]['OBJECT IDENTIFIER'], '', Symbols[r - 1], '', function (ID, OD) { - - Object[Symbols[r - 1]]['OID'] = ID; - Object[Symbols[r - 1]]['NameSpace'] = OD; - //Object[Symbols[r - 1]]['ModuleName'] = ModuleName; - //Object[Symbols[r - 1]]['ObjectName'] = Symbols[r - 1]; - }); + } + break; + case 'SEQUENCE OF': + val += ' ' + Symbols[c1 + 2]; + c1 = c1 + 2; + break; + default: + break; + } + //SYNTAX value + Object[ObjectName][key] = val; + break; + //case 'DESCRIPTION': + //remove description + // break; + default: + Object[ObjectName][key] = val; + break; + } } + } + Object[Symbols[r - 1]]['ObjectName'] = Symbols[r - 1]; + Object[Symbols[r - 1]]['ModuleName'] = ModuleName; + Object[Symbols[r - 1]]['OBJECT IDENTIFIER'] = Symbols[i + 1].replace("{", "").replace("}", "").trim(); + if (Object[Symbols[r - 1]]['OBJECT IDENTIFIER'] == '0 0') { + Object[Symbols[r - 1]]['OID'] = '0.0'; + Object[Symbols[r - 1]]['NameSpace'] = 'null'; } - } else { - //if OBJECT IDENTIFIER tag is NOT NEXT, check prior symbol for processing instructions / MARCO creation. - switch (Symbols[i - 1]) { - case 'DEFINITIONS': - break; - case 'OBJECT IDENTIFIER': - break; - case 'MACRO': - Object = Object[Symbols[i - 2]] = {}; - MACROName = Symbols[i - 2]; - break; - case 'VALUE NOTATION': - case 'TYPE NOTATION': - Object[Symbols[i - 1]] = {}; - var r = i + 1; - while (Symbols[r + 1] != '::=' && Symbols[r + 1] != 'END') { - if (Symbols[r].indexOf('"') == 0) { - var val = Symbols[r + 1]; - var t = r + 1; - if (Symbols[r + 2].indexOf('(') == 0) { - val = Symbols[r + 2]; - t = r + 2; - } - Object[Symbols[i - 1]][Symbols[r].replace(/"/g, "")] = val; - r = t; - } else { - Object[Symbols[i - 1]][Symbols[r]] = null; - if (Symbols[r + 1].indexOf('(') == 0) { - Object[Symbols[i - 1]][Symbols[r]] = Symbols[r + 1]; - r++; - } - } - r++; - } - break; - default: - //new object - Object[Symbols[i - 1]] = {}; - Object[Symbols[i - 1]]['ObjectName'] = Symbols[i - 1]; - Object[Symbols[i - 1]]['ModuleName'] = ModuleName; - Object[Symbols[i - 1]]['MACRO'] = Symbols[i + 1]; - this.BuildObject(Object, Symbols[i - 1], Symbols[i + 1], i, Symbols); - break; + else { + this.OID(Object[Symbols[r - 1]]['OBJECT IDENTIFIER'], '', Symbols[r - 1], '', function (ID, OD) { + + Object[Symbols[r - 1]]['OID'] = ID; + Object[Symbols[r - 1]]['NameSpace'] = OD; + //Object[Symbols[r - 1]]['ModuleName'] = ModuleName; + //Object[Symbols[r - 1]]['ObjectName'] = Symbols[r - 1]; + }); } + } - break; - case 'END': - if (MACROName != '') { - //ADD macros to root for easier processing - //Still need Import feature - this[MACROName] = Object; - this.MACROS.push(MACROName); + } else { + //if OBJECT IDENTIFIER tag is NOT NEXT, check prior symbol for processing instructions / MARCO creation. + switch (Symbols[i - 1]) { + case 'DEFINITIONS': + break; + case 'OBJECT IDENTIFIER': + break; + case 'MACRO': + Object = Object[Symbols[i - 2]] = {}; + MACROName = Symbols[i - 2]; + break; + case 'VALUE NOTATION': + case 'TYPE NOTATION': + Object[Symbols[i - 1]] = {}; + var r = i + 1; + while (Symbols[r + 1] != '::=' && Symbols[r + 1] != 'END') { + if (Symbols[r].indexOf('"') == 0) { + var val = Symbols[r + 1]; + var t = r + 1; + if (Symbols[r + 2].indexOf('(') == 0) { + val = Symbols[r + 2]; + t = r + 2; + } + Object[Symbols[i - 1]][Symbols[r].replace(/"/g, "")] = val; + r = t; + } else { + Object[Symbols[i - 1]][Symbols[r]] = null; + if (Symbols[r + 1].indexOf('(') == 0) { + Object[Symbols[i - 1]][Symbols[r]] = Symbols[r + 1]; + r++; + } + } + r++; + } + break; + default: + //new object + Object[Symbols[i - 1]] = {}; + Object[Symbols[i - 1]]['ObjectName'] = Symbols[i - 1]; + Object[Symbols[i - 1]]['ModuleName'] = ModuleName; + Object[Symbols[i - 1]]['MACRO'] = Symbols[i + 1]; + this.BuildObject(Object, Symbols[i - 1], Symbols[i + 1], i, Symbols); + break; } - //reset Object to Module root; - Object = Module; - MACROName = ''; - break; - case 'IMPORTS': - //console.log(ModuleName, 'IMPORTS'); - //i++; - Module['IMPORTS'] = {}; - var tmp = i + 1 - var IMPORTS = []; - while (Symbols[tmp] != ';') { - if (Symbols[tmp] == 'FROM') { - var ImportModule = Symbols[tmp + 1]; - if (!this.Modules[ImportModule]) { + } + break; + case 'END': + if (MACROName != '') { + //ADD macros to root for easier processing + //Still need Import feature + this[MACROName] = Object; + this.MACROS.push(MACROName); + } + //reset Object to Module root; + Object = Module; + MACROName = ''; + break; + case 'IMPORTS': + //console.log(ModuleName, 'IMPORTS'); + //i++; + Module['IMPORTS'] = {}; + var tmp = i + 1 + var IMPORTS = []; + while (Symbols[tmp] != ';') { + if (Symbols[tmp] == 'FROM') { + var ImportModule = Symbols[tmp + 1]; + if (!this.Modules[ImportModule]) { + //console.log(ModuleName + ': Can not find ' + ImportModule + '!!!!!!!!!!!!!!!!!!!!!'); + console.log(ModuleName+': Attempting to load '+ImportModule); + this.CompileFile(ImportModule); + if (!this.Modules[ImportModule]) console.log(ModuleName + ': Can not find ' + ImportModule + '!!!!!!!!!!!!!!!!!!!!!'); - console.log(ModuleName + ': Can not import ', IMPORTS); - } - Module['IMPORTS'][ImportModule] = IMPORTS; - tmp++; - IMPORTS = []; - } else if (Symbols[tmp] != ',') { - IMPORTS.push(Symbols[tmp]); + + //console.log(ModuleName + ': Can not import ', IMPORTS); } + Module['IMPORTS'][ImportModule] = IMPORTS; tmp++; + IMPORTS = []; + } else if (Symbols[tmp] != ',') { + IMPORTS.push(Symbols[tmp]); } - //console.log(ModuleName, 'IMPORTS', Module['IMPORTS']); - break; - case 'EXPORTS': - //console.log(ModuleName, 'EXPORTS'); - break; - default: - break; - } + tmp++; + } + //console.log(ModuleName, 'IMPORTS', Module['IMPORTS']); + break; + case 'EXPORTS': + //console.log(ModuleName, 'EXPORTS'); + break; + default: + break; + } - } } } }, From 9127ad573ad2e9909f67776ed3052f245f15dbb5 Mon Sep 17 00:00:00 2001 From: pdlove Date: Fri, 16 Nov 2018 23:09:19 -0600 Subject: [PATCH 3/4] Added LoadMibPath for processing all files. --- lib/mib.js | 28 +++++++++++++--------------- 1 file changed, 13 insertions(+), 15 deletions(-) diff --git a/lib/mib.js b/lib/mib.js index 190cd76..269d012 100644 --- a/lib/mib.js +++ b/lib/mib.js @@ -1,4 +1,6 @@ -var fs = require('fs'); +const fs = require('fs'); +const path = require('path'); + var MIB = function () { return ({ ASN1BER: { @@ -152,7 +154,9 @@ var MIB = function () { } }, Import: function (FileName) { - this.ParseModule(FileName.split('//')[1].split('.')[0], fs.readFileSync(FileName).toString()); + var fname = path.basename(FileName); + fname = fname.split(".")[0].toUpperCase(); + this.ParseModule(fname, fs.readFileSync(FileName).toString()); }, ParseModule: function (FileName, Contents) { this.CharBuffer.RowIndex = 0; @@ -569,7 +573,7 @@ var MIB = function () { if (!this.Modules[ImportModule]) { //console.log(ModuleName + ': Can not find ' + ImportModule + '!!!!!!!!!!!!!!!!!!!!!'); console.log(ModuleName+': Attempting to load '+ImportModule); - this.CompileFile(ImportModule); + this.CompileModule(ImportModule); if (!this.Modules[ImportModule]) console.log(ModuleName + ': Can not find ' + ImportModule + '!!!!!!!!!!!!!!!!!!!!!'); @@ -775,6 +779,12 @@ var MIB = function () { } + }, + LoadMIBpath: function(mibPath) { + fs.readdirSync(mibPath).forEach(file => { + this.Import(path.join(mibPath,file)); + }) + this.Serialize(); }, LoadMIBs: function () { console.log("Loading modules..."); @@ -1142,15 +1152,3 @@ var MIB = function () { module.exports = exports = MIB; exports.MIB = MIB; exports.native = undefined; - - - - - - - - - - - - From c91d5fb549fc6c5fad0649113797afa58c6cb2fd Mon Sep 17 00:00:00 2001 From: Caleb Bartholomew Date: Wed, 8 Feb 2017 10:15:25 -0700 Subject: [PATCH 4/4] Added package json and index file. --- index.js | 3 +++ package.json | 19 +++++++++++++++++++ 2 files changed, 22 insertions(+) create mode 100644 index.js create mode 100644 package.json diff --git a/index.js b/index.js new file mode 100644 index 0000000..54994a4 --- /dev/null +++ b/index.js @@ -0,0 +1,3 @@ +'use strict'; + +module.exports = exports = require('./lib/mib.js'); diff --git a/package.json b/package.json new file mode 100644 index 0000000..e423753 --- /dev/null +++ b/package.json @@ -0,0 +1,19 @@ +{ + "name": "mib.js", + "version": "1.0.0", + "description": "Mib parser", + "main": "index.js", + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/Rojuinex/mib.js.git" + }, + "author": "Caleb 'Rojuinex' Bartholomew (http://calebbartholomew.com)", + "license": "MIT", + "bugs": { + "url": "https://github.com/Rojuinex/mib.js/issues" + }, + "homepage": "https://github.com/Rojuinex/mib.js#readme" +}