@vostro/net-snmp
Version:
JavaScript implementation of the Simple Network Management Protocol (SNMP)
1,009 lines (928 loc) • 55.2 kB
JavaScript
var fs = require('fs');
var MIB = function (dir) {
return ({
directory: dir ? dir : '',
ASN1BER: {
2: 'Integer',
4: 'OctetString',
5: 'Null',
6: 'ObjectIdentifier',
48: 'Sequence',
64: 'IpAddress',
65: 'Counter',
66: 'Gauge',
67: 'TimeTicks',
68: 'Opaque',
69: 'NsapAddress',
70: 'Counter64',
128: 'NoSuchObject',
129: 'NoSuchInstance',
130: 'EndOfMibView',
160: 'PDUBase',
Integer: 2,
OctetString: 4,
Null: 5,
ObjectIdentifier: 6,
Sequence: 48,
IpAddress: 64,
Counter: 65,
Gauge: 66,
TimeTicks: 67,
Opaque: 68,
NsapAddress: 69,
Counter64: 70,
NoSuchObject: 128,
NoSuchInstance: 129,
EndOfMibView: 130,
PDUBase: 160
},
SymbolBuffer: {},
StringBuffer: '',
Modules: {},
Objects: {},
MACROS: [],
CurrentObject: null,
TempObject: {},
CurrentClause: '',
WaitFor: '',
CharBuffer: {
logit: false,
lastChar: '',
state: '',
open: false,
CurrentSymbol: '',
nested: 0,
isComment: false,
isEqual: false,
isOID: false,
isList: false,
isString: false,
inComment: false,
inGroup: 0,
builder: '',
Table: {},
ColumnIndex: 0,
RowIndex: 0,
ModuleName: {},
PreviousRow: 0,
Append: function (char) {
this.builder += char;
},
Fill: function (FileName, row, column) {
if (this.builder.length == 0) {
return;
}
column = (column - this.builder.length);
var symbol = this.builder.toString().trim();
this.builder = "";
this.builder.length = 0;
if (!this.Table[FileName]) {
this.Table[FileName] = [];
}
if (row == 0) {
this.RowIndex = 0;
this.PreviousRow = 0;
}
if (this.PreviousRow < row) {
this.RowIndex++;
this.ColumnIndex = 0;
this.PreviousRow = row;
}
var R = this.RowIndex;
var C = this.ColumnIndex;
if (!this.Table[FileName][R]) {
this.Table[FileName][R] = [];
}
this.isEqual = false;
switch (symbol) {
case ')':
this.Table[FileName][R][C] = symbol;
this.ColumnIndex++;
this.logit = false;
break;
case '(':
this.Table[FileName][R][C] = symbol;
this.ColumnIndex++;
this.logit = true;
break;
case 'DEFINITIONS':
this.ModuleName[FileName] = this.Table[FileName][R][C - 1];
this.Table[FileName][R][C] = symbol;
this.ColumnIndex++;
break;
case '::=':
this.Table[FileName][R][C] = symbol;
this.ColumnIndex++;
this.isEqual = true;
break;
case '{':
if (this.Table[FileName][R][C - 1] != '::=') {
this.isList = true;
}
this.Table[FileName][R][C] = symbol;
this.ColumnIndex++;
break;
case 'NOTATION':
if (this.Table[FileName][R][C - 1] == 'TYPE' || this.Table[FileName][R][C - 1] == 'VALUE') {
this.Table[FileName][R][C - 1] += ' NOTATION';
}
break;
case 'OF':
if (this.Table[FileName][R][C - 1] == 'SEQUENCE') {
this.Table[FileName][R][C - 1] = 'SEQUENCE OF';
}
break;
case 'IDENTIFIER':
if (this.Table[FileName][R][C - 1] == 'OBJECT') {
this.Table[FileName][R][C - 1] = 'OBJECT IDENTIFIER';
}
break;
case 'STRING':
if (this.Table[FileName][R][C - 1] == 'OCTET') {
this.Table[FileName][R][C - 1] = 'OCTET STRING';
}
break;
default:
this.Table[FileName][R][C] = symbol;
this.ColumnIndex++;
break;
}
}
},
Import: function (FileName) {
var filePath;
if ( FileName.startsWith('/') || /^[a-zA-Z]:\\/.test(FileName) ) {
filePath = FileName;
} else {
filePath = __dirname + '/' + FileName;
}
this.ParseModule(FileName.split('/')[FileName.split('/').length - 1].split('.')[0], fs.readFileSync(filePath).toString());
},
ParseModule: function (FileName, Contents) {
this.CharBuffer.RowIndex = 0;
this.CharBuffer.ColumnIndex = 0;
var lines = Contents.split('\n');
var line = '';
var i = 0;
while ((line = lines[i]) != null && i <= lines.length) {
this.ParseLine(FileName, line, i);
i++;
}
this.CharBuffer.Table[FileName]
},
ParseLine: function (FileName, line, row) {
line = line + "\n";
for (var i = 0; i < line.length; i++) {
var char = line.charAt(i);
this.ParseChar(FileName, char, row, i);
}
},
ParseChar: function (FileName, char, row, column) {
switch (char) {
case '\r':
case '\n':
if (!this.CharBuffer.isString) {
this.CharBuffer.Fill(FileName, row, column);
this.CharBuffer.isComment = false;
this.CharBuffer.inGroup = 0; //IGNORE GROUPINGS ACROSS COMMENTS
} else if (this.CharBuffer.isString && this.CharBuffer.isComment) {
this.CharBuffer.Append(char);
}
break;
case '{':
if (this.CharBuffer.isEqual) { this.CharBuffer.isOID = true; }
case '[':
case '(':
this.CharBuffer.nested++;
if (char == '(') {
this.CharBuffer.inGroup++;
}
if (this.CharBuffer.isComment || ((this.CharBuffer.isOID || this.CharBuffer.nested > 0) && (!this.CharBuffer.isList || this.CharBuffer.inGroup > 0))) {
this.CharBuffer.Append(char);
} else {
this.CharBuffer.Fill(FileName, row, column);
this.CharBuffer.Append(char);
this.CharBuffer.Fill(FileName, row, column);
}
break;
case '}':
case ']':
case ')':
this.CharBuffer.nested--;
if (this.CharBuffer.nested <= 0) {
this.CharBuffer.nested = 0;
}
if (char == ')') {
this.CharBuffer.inGroup--;
if (this.CharBuffer.inGroup < 0) {
this.CharBuffer.inGroup = 0; //IGNORE GROUPINGS ACROSS COMMENTS
}
}
if (this.CharBuffer.isComment || ((this.CharBuffer.isOID || this.CharBuffer.nested >= 0) && (!this.CharBuffer.isList || this.CharBuffer.inGroup >= 0))) {
this.CharBuffer.Append(char);
} else {
this.CharBuffer.Fill(FileName, row, column);
this.CharBuffer.Append(char);
this.CharBuffer.Fill(FileName, row, column);
}
if (char == '}') { this.CharBuffer.isOID = false; this.CharBuffer.isList = false; };
break;
case ',':
if (this.CharBuffer.isComment) {
this.CharBuffer.Append(char);
} else {
this.CharBuffer.Fill(FileName, row, column);
this.CharBuffer.Append(char);
this.CharBuffer.Fill(FileName, row, column);
}
break;
case ';':
if (this.CharBuffer.isComment) {
this.CharBuffer.Append(char);
} else {
this.CharBuffer.Fill(FileName, row, column);
this.CharBuffer.Append(char);
this.CharBuffer.Fill(FileName, row, column);
}
break;
case " ":
if (this.CharBuffer.isComment || ((this.CharBuffer.isOID || this.CharBuffer.nested > 0) && (!this.CharBuffer.isList || this.CharBuffer.inGroup > 0))) {
this.CharBuffer.Append(char);
} else {
this.CharBuffer.Fill(FileName, row, column);
}
break;
case "-":
this.CharBuffer.Append(char);
if (this.CharBuffer.lastChar == '-') {
this.CharBuffer.isComment = true;
this.CharBuffer.builder = this.CharBuffer.builder.split('--')[0];
this.CharBuffer.Fill(FileName, row, column);
this.CharBuffer.builder = '--';
}
break;
case '"':
if (this.CharBuffer.isComment && !this.CharBuffer.isString && !this.CharBuffer.inComment) {
//011 = COMMENT
//IF 011 SET 101
this.CharBuffer.isComment = true;
this.CharBuffer.isString = false;
this.CharBuffer.inComment = true;
} else if (!this.CharBuffer.isComment && !this.CharBuffer.isString && !this.CharBuffer.inComment) {
//000 = STRING
//IF 000 SET 110
this.CharBuffer.isComment = true;
this.CharBuffer.isString = true;
this.CharBuffer.inComment = false;
this.CharBuffer.Fill(FileName, row, column); //new string
} else if (this.CharBuffer.isComment && this.CharBuffer.isString && !this.CharBuffer.inComment) {
//110 = END STRING
//IF 110 SET 000
this.CharBuffer.isComment = false;
this.CharBuffer.isString = false;
this.CharBuffer.inComment = false;
} else if (this.CharBuffer.isComment && !this.CharBuffer.isString && this.CharBuffer.inComment) {
//101 = END COMMENT
//IF 101 SET 000
this.CharBuffer.isComment = true;
this.CharBuffer.isString = false;
this.CharBuffer.inComment = false;
}
if (this.CharBuffer.isComment) {
this.CharBuffer.Append(char);
} else {
this.CharBuffer.Append(char);
this.CharBuffer.Fill(FileName, row, column);
}
break;
default:
this.CharBuffer.Append(char);
break;
}
this.CharBuffer.lastChar = char;
},
Serialize: function () {
var Table = this.CharBuffer.Table;
var ModuleName = '';
for (var FileName in Table) {
ModuleName = this.CharBuffer.ModuleName[FileName];
this.SymbolBuffer[ModuleName] = [];
for (var r = 0; r < Table[FileName].length; r++) {
for (var c = 0; c < Table[FileName][r].length; c++) {
var symbol = Table[FileName][r][c];
switch (symbol) {
default:
if (symbol.indexOf('--') != 0) {//REMOVE COMMENTS
//console.log(ModuleName, symbol);
this.SymbolBuffer[ModuleName].push(symbol);
}
}
}
}
};
this.Compile();
},
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;
}
}
}
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 = [];
keychain.push('DESCRIPTION');
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);
}
while (c1 < (i - 1)) {
c1++;
var key = Symbols[c1]; //Parse TYPE NOTATION. ex: SYNTAX, ACCESS, STATUS, DESCRIPTION.....
//key == 'DESCRIPTION' ? console.log(keychain.indexOf(key), key, Symbols[c1 + 1]) : false;
var regExp = /\(([^)]+)\)/; //in parentheses ex: "ethernet-csmacd (6)"
if (keychain.indexOf(key) > -1) {
var val = Symbols[c1 + 1].replace(/"/g, "");
//if value array.
if (val.indexOf("{") == 0) {
c1++;
while (Symbols[c1].indexOf("}") == -1) {
c1++;
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);
}
}
}
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];
});
}
}
} 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++;
}
// Workaround for lack of INDEX and AUGMENTS in OBJECT-TYPE MACRO "TYPE NOTATION"
if ( ModuleName == "SNMPv2-SMI" ) {
Object["TYPE NOTATION"].INDEX = "Index";
Object["TYPE NOTATION"].AUGMENTS = "Augments"
} else if ( ModuleName == "RFC-1212" ) {
Object["TYPE NOTATION"].INDEX = "Index";
}
// End INDEX/AUGMENTS workaround
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;
}
}
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 + ': Can not import ', IMPORTS);
}
Module['IMPORTS'][ImportModule] = IMPORTS;
tmp++;
IMPORTS = [];
} else if (Symbols[tmp] != ',') {
IMPORTS.push(Symbols[tmp]);
}
tmp++;
}
//console.log(ModuleName, 'IMPORTS', Module['IMPORTS']);
break;
case 'EXPORTS':
//console.log(ModuleName, 'EXPORTS');
break;
default:
break;
}
}
}
}
},
BuildObject: function (Object, ObjectName, macro, i, Symbols) {
var r = i;
var found = false;
var m = Symbols.indexOf('SYNTAX', r) - r;
var SYNTAX = Symbols[Symbols.indexOf('SYNTAX', r) + 1];
var val = Symbols[Symbols.indexOf('SYNTAX', r) + 2];
var c1 = Symbols.indexOf('SYNTAX', r) + 1;
if (this.MACROS.indexOf(macro) > -1 && m < 10) {
switch (SYNTAX) {
case "INTEGER":
if (val.indexOf("{") == 0) {
c1++;
while (Symbols[c1].indexOf("}") == -1) {
c1++;
val += Symbols[c1].trim();
}
val = val.replace("{", "").replace("}", "").split(",");
Object[ObjectName]['SYNTAX'] = {};
Object[ObjectName]['SYNTAX'][SYNTAX] = {};
for (var TC = 0; TC < val.length; TC++) {
Object[ObjectName]['SYNTAX'][SYNTAX][val[TC].split("(")[1].replace(")", "")] = val[TC].split("(")[0]
}
}
break;
default:
Object[ObjectName]['SYNTAX'] = SYNTAX;
break;
}
}
},
GetSummary: function (callback) {
var summary = '';
for (var ModuleName in this.Modules) {
if (this.Modules.hasOwnProperty(ModuleName)) {
for (var ObjectName in this.Modules[ModuleName]) {
if (this.Modules[ModuleName].hasOwnProperty(ObjectName)) {
if (this.Modules[ModuleName][ObjectName]['OID']) {
//OID
summary += this.Modules[ModuleName][ObjectName]['OID'] + " : " + ObjectName + '\r\n';
//callback(this.Modules[ModuleName][ObjectName]);
//break;
}
}
}
}
}
callback(summary);
},
GetObject__: function (string, callback) {
var found = false;
var MatchLength = 0;
var MatchObject = {};
if (typeof string == 'string' && string.indexOf(".") > -1) {
var stringtype = 'NameSpace';
if (parseInt(string.split(".")[1]) || string == '0.0') {
stringtype = 'OID';
}
for (var ModuleName in this.Modules) {
if (this.Modules.hasOwnProperty(ModuleName) && !found) {
for (var ObjectName in this.Modules[ModuleName]) {
if (this.Modules[ModuleName].hasOwnProperty(ObjectName) && !found) {
if (this.Modules[ModuleName][ObjectName][stringtype] == string && !found) {
found = true;
callback(this.Modules[ModuleName][ObjectName]);
break;
}
if (string.indexOf(this.Modules[ModuleName][ObjectName][stringtype]) > -1 && !found) {
var length = this.Modules[ModuleName][ObjectName][stringtype].split(".").length;
if (length >= MatchLength) {
MatchLength = length;
MatchObject = this.Modules[ModuleName][ObjectName];
}
}
}
}
}
}
} else {
for (var ModuleName in this.Modules) {
if (this.Modules.hasOwnProperty(ModuleName)) {
if (this.Modules[ModuleName][string]) {
found = true;
callback(this.Modules[ModuleName][string]);
//string == ObjectName
break;
}
}
}
}
if (!found) {
callback(MatchObject);
}
},
GetObject: function (string, callback) {
try {
var found = false;
var MatchLength = 0;
var MatchObject = {};
if (typeof string == 'string' && string.indexOf(".") > -1) {
var stringtype = 'NameSpace';
if (parseInt(string.split(".")[1]) || string == '0.0') {
stringtype = 'OID';
}
var Modules = Object.keys(this.Modules), M_len = Modules.length;
for (m = M_len - 1; m >= 0; m--) {// search newset moduels first
var MIB_MODs = this.Modules[Modules[m]];
var Objects = Object.keys(MIB_MODs), O_len = Objects.length;
for (o = 0; o < O_len; o++) {
var MOD_Object = this.Modules[Modules[m]][Objects[o]]
if (MOD_Object[stringtype] == string && !found) {
found = true;
callback(null, MOD_Object);
return;
break;
}
if (string.indexOf(MOD_Object[stringtype]) > -1 && !found) {
var length = MOD_Object[stringtype].split(".").length;
if (length >= MatchLength) {
MatchLength = length;
MatchObject = MOD_Object;
}
}
}
}
} else {
var Modules = Object.keys(this.Modules), M_len = Modules.length;
for (m = M_len - 1; m >= 0; m--) {// search newset moduels first
if (this.Modules[Modules[m]][string]) {
found = true;
callback(null, this.Modules[Modules[m]][string]);
return;
break;
}
}
}
if (!found) {
callback(null, MatchObject);
return;
}
} catch(err) {
callback(err);
}
},
OID: function (OBJECT_IDENTIFIER, ID, ObjectName, OD, callback) {
let members = OBJECT_IDENTIFIER.split(" ");
let parent = members.shift();
let oid = members.pop();
if (parent == 'iso') {
let midID = ['1'];
let midOD = ['iso'];
for (let entry of members) {
let match = entry.match(/(.*)\((.+)\)$/);
midID.push(match[2]);
midOD.push(match[1]);
}
midID.push(oid);
midID.push(ID);
midOD.push(OD);
midOD.push(ObjectName);
callback(midID.join('.'), midOD.join('.'));
return;
}
ID = ID == '' ? oid : [oid, ID].join('.');
OD = OD == '' ? parent : [parent, OD].join('.');
for (var ModuleName in this.Modules) {
if (this.Modules.hasOwnProperty(ModuleName)) {
if (this.Modules[ModuleName][parent]) {
this.OID(this.Modules[ModuleName][parent]["OBJECT IDENTIFIER"], ID, ObjectName, OD, callback);
break;
}
}
}
},
LoadMIBs: function () {
console.log("Loading modules...");
this.Import("./RFC_BASE_MINIMUM//RFC1155-SMI.MIB");
this.Import("./RFC_BASE_MINIMUM//RFC1158-MIB.MIB");
this.Import("./RFC_BASE_MINIMUM//RFC-1212.mib");
this.Import("./RFC_BASE_MINIMUM//RFC1213-MIB-II.MIB");
this.Import("./RFC_BASE_MINIMUM//SNMPv2-SMI.mib");
this.Import("./RFC_BASE_MINIMUM//SNMPv2-CONF.mib");
this.Import("./RFC_BASE_MINIMUM//SNMPv2-TC.mib");
this.Import("./RFC_BASE_MINIMUM//SNMPv2-MIB.mib");
this.Import("./RFC_BASE_MINIMUM//ianaiftype-mib.MIB");
this.Import("./RFC_BASE_MINIMUM//IF-MIB.MIB");
this.Import("./RFC_BASE_MINIMUM//IP-FORWARD-MIB.MIB");
//trap types
this.Import("./RFC_BASE_MINIMUM//RFC-1215.MIB");
//vlan port assingment
this.Import("./RFC_BASE_MINIMUM//BRIDGE-MIB.MIB");
this.Import("./RFC_BASE_MINIMUM//BGP4-MIB.MIB");
this.Import("./RFC_BASE_MINIMUM//HOST-RESOURCES-MIB.MIB");
this.Import("./RFC_BASE_MINIMUM//CISCO-SMI.MIB");
this.Import("./RFC_BASE_MINIMUM//CISCO-TC.MIB");
this.Import("./RFC_BASE_MINIMUM//CISCO-PRODUCTS-MIB.MIB");
this.Import("./RFC_BASE_MINIMUM//OLD-CISCO-TCP-MIB.MIB");
this.Import("./RFC_BASE_MINIMUM//OLD-CISCO-TS-MIB.MIB");
this.Import("./RFC_BASE_MINIMUM//RMON-MIB.MIB");
this.Import("./RFC_BASE_MINIMUM//INET-ADDRESS-MIB.mib");
this.Import("./RFC_BASE_MINIMUM//IP-MIB.MIB");
this.Import("./RFC_BASE_MINIMUM//SNMP-FRAMEWORK-MIB.mib");
this.Import("./RFC_BASE_MINIMUM//ENTITY-MIB.MIB");
this.Import("./RFC_BASE_MINIMUM//CISCO-VTP-MIB.MIB");
this.Import("./RFC_BASE_MINIMUM//CISCO-CDP-MIB.MIB");
this.Import("./RFC_BASE_MINIMUM//CISCO-VLAN-MEMBERSHIP-MIB.MIB");
this.Import("./RFC_BASE_MINIMUM//CISCO-METRO-PHY-MIB.MIB");
//TRAPS
this.Import("./RFC_BASE_MINIMUM//CISCO-CONFIG-MAN-MIB.MIB");
this.Import("./RFC_BASE_MINIMUM//CISCO-SYSLOG-MIB.MIB");
this.Import("./RFC_BASE_MINIMUM//CISCO-IPSEC-FLOW-MONITOR-MIB.mib");
this.Import("./RFC_BASE_MINIMUM//CISCO-IPSEC-MIB.MIB");
this.Import("./RFC_BASE_MINIMUM//CISCO-EIGRP-MIB.MIB");
this.Import("./RFC_BASE_MINIMUM//CISCO-ENTITY-SENSOR-MIB.MIB");
console.log("Compiling modules...");
this.Serialize();
},
WriteToFile: function () {
fs.writeFile(__dirname + "/mib.JSON", JSON.stringify(this.Modules, null, 4), function (err) {
if (err) {
console.log(err);
} else {
console.log("The file was saved!");
}
});
},
ReadFromFile: function () {
var self = this;
fs.readFile(__dirname + "/mib.JSON", 'utf8', function (err, data) {
if (err) {
console.log(err);
} else {
self.Modules = JSON.parse(data);
console.log("The file was read!");
}
});
},
ParseVarBind__: function (varbind, callback) {
var self = this;
var snmpjsVarBind =
{ oid: '1.3.6.1.2.1.1.3.0',
typename: 'TimeTicks',
value: 208265883,
string_value: '208265883'
};
var snmpnativeVarBind =
{ oid: [1, 3, 6, 1, 2, 1, 1, 3, 0],
//typename: 'TimeTicks',
type: 67,
value: 208265883,
valueRaw: '<Buffer 53 50 36 35 30 30 2d 31 2e 53 48 49 >',
valueHex: '5350363530302d312e534849'
};
this.GetObject(varbind.oid, function (err, Object) {
if (Object.SYNTAX) {
var response = { Object: Object, syntaxValue: varbind.value, OIDresidue: varbind.oid.replace(Object.OID + '.', "") }
switch (varbind.typename) {
case 'Integer':
if (Object.SYNTAX && Object.SYNTAX.INTEGER) {
response.syntaxValue = Object.SYNTAX.INTEGER[varbind.value]
} else {
self.GetObject(Object.SYNTAX, function (err, Object1) {
if (Object1.SYNTAX && Object1.SYNTAX.INTEGER) {
response.syntaxValue = Object1.SYNTAX.INTEGER[varbind.value];
} else {
response.syntaxValue = varbind.value;
}
});
}
break;
case 'ObjectIdentifier':
self.GetObject(varbind.value, function (err, Object1) {
response.syntaxValue = Object1.ObjectName;
});
break;
case 'OctetString':
if (Object.SYNTAX == "OCTET STRING" || Object.SYNTAX.indexOf('ddr') > -1) {
var buffstring = "";
var delimiter = "."
var buf = varbind.value;
for (ii = 0; ii < buf.length; ii++) {
if (ii == buf.length - 1) { delimiter = ''; }
buffstring += buf.readUInt8(ii) + delimiter;
}
response.syntaxValue = buffstring;
} else {
response.syntaxValue = varbind.string_value
}
break;
default:
break;
}
callback(response);
}
});
},
DecodeVarBinds: function (varbinds, callback) {
var self = this;
var VarBinds = [];
if (!varbinds || !varbinds[0]) { callback(VarBinds); return };
var lib = Array.isArray(varbinds[0].oid) ? 'snmp-native' : 'snmpjs';
var cached = {};
cached['OID'] = '';
cached['oid'] = '';
cached['Object'] = {};
cached['Object1'] = {};
var Vs = Object.keys(varbinds), V_len = Vs.length;
for (v = 0; v < V_len; v++) {
vb = varbinds[Vs[v]];
vb.OID = vb.oid.toString().replace(/,/g, '.');
vb.typename = (lib == 'snmp-native') ? self.ASN1BER[vb.type] : vb.typename;
var IsCache = vb.OID.replace(cached.OID + '.', "").split(".").length == cached.oid.split(".").length;
var varbind = { NameSpace: '', OID: '', oid: '', ObjectName: '', TYPE: '', SYNTAX: '', Value: '' };
if (IsCache) {
varbind.NameSpace = cached.Object.NameSpace;
varbind.OID = cached.Object.OID;
varbind.oid = vb.OID.replace(cached.Object.OID + '.', "");
cached.OID = varbind.OID;
cached.oid = varbind.oid;
varbind.ObjectName = cached.Object.ObjectName;
varbind.TYPE = vb.typename;
varbind.SYNTAX = cached.Object.SYNTAX;
varbind.Value = vb.value;
self.GetVarBindVal(vb, varbind, cached.Object, cached.Object1, lib);
VarBinds.push(varbind);
} else {
self.GetObject(vb.OID, function (err, Object) {
varbind.NameSpace = Object.NameSpace;
varbind.OID = Object.OID;
varbind.oid = vb.OID.replace(Object.OID + '.', "");
cached.OID = varbind.OID;
cached.oid = varbind.oid;
varbind.ObjectName = Object.ObjectName;
varbind.TYPE = vb.typename;
varbind.SYNTAX = Object.SYNTAX;
varbind.Value = vb.value;
self.GetObject(Object.SYNTAX, function (err, Object1) {
cached.Object = Object;
cached.Object1 = Object1;
self.GetVarBindVal(vb, varbind, Object, Object1, lib);
VarBinds.push(varbind);
});
});
}
}
callback(VarBinds);
},
GetVarBindVal: function (vb, varbind, Object, Object1, lib) {
var self = this;
if (!vb.valu