275 righe
7.9 KiB
JavaScript
275 righe
7.9 KiB
JavaScript
var snmp = require ("../");
|
|
var fs = require("fs");
|
|
var getopts = require ("getopts");
|
|
|
|
var options = getopts(process.argv.slice(2));
|
|
|
|
var snmpOptions = {
|
|
disableAuthorization: options.n,
|
|
port: options.p,
|
|
engineID: options.e,
|
|
debug: options.d,
|
|
address: null,
|
|
accessControlModelType: snmp.AccessControlModelType.Simple
|
|
};
|
|
|
|
if (options.s) {
|
|
var changes;
|
|
|
|
// If there's a persistent store, make its specified changes
|
|
try {
|
|
changes = JSON.parse(fs.readFileSync("persistent.json"));
|
|
|
|
for (var providerName in changes) {
|
|
var change = changes[providerName];
|
|
if (typeof change == "object") {
|
|
// table row
|
|
for (var rowIndex in change) {
|
|
mib.addTableRow(providerName, change[rowIndex]);
|
|
}
|
|
} else {
|
|
mib.setScalarValue(providerName, change);
|
|
}
|
|
}
|
|
} catch (e) {
|
|
console.log("Could not parse persistent storage");
|
|
changes = {};
|
|
}
|
|
}
|
|
|
|
var callback = function (error, data) {
|
|
var needSave;
|
|
|
|
if ( error ) {
|
|
console.error (error);
|
|
return;
|
|
}
|
|
|
|
console.log (JSON.stringify(data.pdu.varbinds, null, 2));
|
|
|
|
// If the user didn't request testing persistent storage, we're done here
|
|
if (! options.s) {
|
|
return;
|
|
}
|
|
|
|
// Keep note of whether we need to save
|
|
needSave = false;
|
|
|
|
data.pdu.varbinds.forEach(
|
|
(varbind) => {
|
|
let index;
|
|
let value;
|
|
|
|
// If there was a request error, we don't need to do anything
|
|
if ("errorStatus" in varbind || ! ("providerName" in varbind) ) {
|
|
return;
|
|
}
|
|
|
|
if (varbind.autoCreated && "rowIndex" in varbind) {
|
|
// Auto-create table row
|
|
index = JSON.stringify(varbind.rowIndex);
|
|
if ( ! changes[varbind.providerName] ) {
|
|
changes[varbind.providerName] = {};
|
|
}
|
|
value = varbind.row;
|
|
value = value.map((v) => v instanceof Buffer ? v.toString() : v);
|
|
changes[varbind.providerName][index] = value;
|
|
needSave = true;
|
|
} else if (varbind.autoCreated) {
|
|
// Auto-created scalar
|
|
value = varbind.value;
|
|
value = value instanceof Buffer ? value.toString() : value;
|
|
changes[varbind.providerName] = value;
|
|
needSave = true;
|
|
} else if (varbind.deleted && "rowIndex" in varbind) {
|
|
// Delete table row
|
|
index = JSON.stringify(varbind.rowIndex);
|
|
if (changes && changes[varbind.providerName] && changes[varbind.providerName][index]) {
|
|
delete changes[varbind.providerName][index];
|
|
if (Object.keys(changes[varbind.providerName]).length === 0) {
|
|
delete changes[varbind.providerName];
|
|
}
|
|
}
|
|
needSave = true;
|
|
} else if ("requestValue" in varbind && "rowIndex" in varbind && "column" in varbind) {
|
|
// Set a column value
|
|
value = varbind.value;
|
|
index = JSON.stringify(varbind.rowIndex);
|
|
changes[varbind.providerName][index][varbind.columnPosition] =
|
|
value instanceof Buffer ? value.toString() : value;
|
|
needSave = true;
|
|
} else if ("requestValue" in varbind) {
|
|
// Set a scalar
|
|
value = varbind.value;
|
|
changes[varbind.providerName] =
|
|
value instanceof Buffer ? value.toString() : value;
|
|
needSave = true;
|
|
} else {
|
|
console.log("Ignoring varbind:" + JSON.stringify(varbind, null, " "));
|
|
}
|
|
});
|
|
|
|
// Did we make any changes?
|
|
if (needSave) {
|
|
// Yup. Save 'em.
|
|
fs.writeFileSync("persistent.json", JSON.stringify(changes, null, " "));
|
|
}
|
|
};
|
|
|
|
var agent = snmp.createAgent(snmpOptions, callback);
|
|
var authorizer = agent.getAuthorizer ();
|
|
authorizer.addCommunity ("denied");
|
|
authorizer.addCommunity ("public");
|
|
authorizer.addCommunity ("private");
|
|
authorizer.addUser ({
|
|
name: "fred",
|
|
level: snmp.SecurityLevel.noAuthNoPriv
|
|
});
|
|
authorizer.addUser ({
|
|
name: "betty",
|
|
level: snmp.SecurityLevel.authNoPriv,
|
|
authProtocol: snmp.AuthProtocols.sha,
|
|
authKey: "illhavesomeauth"
|
|
});
|
|
authorizer.addUser ({
|
|
name: "wilma",
|
|
level: snmp.SecurityLevel.authPriv,
|
|
authProtocol: snmp.AuthProtocols.sha,
|
|
authKey: "illhavesomeauth",
|
|
privProtocol: snmp.PrivProtocols.des,
|
|
privKey: "andsomepriv"
|
|
});
|
|
// console.log(JSON.stringify(agent.getAuthorizer().getUsers(), null, 2));
|
|
|
|
var scalarProvider = {
|
|
name: "sysDescr",
|
|
type: snmp.MibProviderType.Scalar,
|
|
oid: "1.3.6.1.2.1.1.1",
|
|
scalarType: snmp.ObjectType.OctetString,
|
|
maxAccess: snmp.MaxAccess['read-write'],
|
|
constraints: {
|
|
sizes: [
|
|
{ min: 1, max: 3 },
|
|
{ min: 5 }
|
|
]
|
|
}
|
|
};
|
|
agent.registerProvider (scalarProvider);
|
|
|
|
scalarProvider = {
|
|
name: "snmpEnableAuthenTraps",
|
|
type: snmp.MibProviderType.Scalar,
|
|
oid: "1.3.6.1.2.1.11.30",
|
|
scalarType: snmp.ObjectType.Integer,
|
|
// createHandler: (provider) => 42,
|
|
maxAccess: snmp.MaxAccess['read-create'],
|
|
constraints: {
|
|
ranges: [
|
|
{ min: 1, max: 3 },
|
|
{ min: 5 }
|
|
]
|
|
},
|
|
defVal: 1
|
|
};
|
|
agent.registerProvider (scalarProvider);
|
|
|
|
var tableProvider = {
|
|
name: "ifTable",
|
|
type: snmp.MibProviderType.Table,
|
|
oid: "1.3.6.1.2.1.2.2.1",
|
|
// createHandler: (provider, action, row) => [ row[0], "Locally-created", 24, snmp.RowStatus[action] ],
|
|
maxAccess: snmp.MaxAccess['not-accessible'],
|
|
tableColumns: [
|
|
{
|
|
number: 1,
|
|
name: "ifIndex",
|
|
type: snmp.ObjectType.Integer,
|
|
maxAccess: snmp.MaxAccess['read-only']
|
|
},
|
|
{
|
|
number: 2,
|
|
name: "ifDescr",
|
|
type: snmp.ObjectType.OctetString,
|
|
maxAccess: snmp.MaxAccess['read-write'],
|
|
defVal: "Hello world!"
|
|
},
|
|
{
|
|
number: 3,
|
|
name: "ifType",
|
|
type: snmp.ObjectType.Integer,
|
|
maxAccess: snmp.MaxAccess['read-only'],
|
|
constraints: {
|
|
enumeration: {
|
|
"1": "goodif",
|
|
"2": "badif",
|
|
"6": "someif",
|
|
"24": "anotherif"
|
|
}
|
|
},
|
|
defVal: 6
|
|
},
|
|
{
|
|
number: 99,
|
|
name: "ifStatus",
|
|
type: snmp.ObjectType.Integer,
|
|
maxAccess: snmp.MaxAccess['read-write'],
|
|
rowStatus: true
|
|
}
|
|
],
|
|
tableIndex: [
|
|
{
|
|
columnName: "ifIndex"
|
|
}
|
|
],
|
|
handler: function ifTable (mibRequest) {
|
|
// e.g. can update the table before responding to the request here
|
|
mibRequest.done ();
|
|
}
|
|
};
|
|
agent.registerProvider (tableProvider);
|
|
|
|
var mib = agent.getMib ();
|
|
|
|
// Modify defaults
|
|
mib.setScalarDefaultValue ("snmpEnableAuthenTraps", 3);
|
|
mib.setTableRowDefaultValues( "ifTable", [ undefined, "Hello world, amended!", 2, undefined ] );
|
|
|
|
mib.setScalarValue ("sysDescr", "Rage inside the machine!");
|
|
mib.addTableRow ("ifTable", [1, "lo", 24, 1]);
|
|
mib.addTableRow ("ifTable", [2, "eth0", 6, 2]);
|
|
// mib.deleteTableRow ("ifTable", [2]);
|
|
// mib.unregisterProvider ("ifTable");
|
|
// mib.unregisterProvider ("sysDescr");
|
|
|
|
// var store = snmp.createModuleStore ();
|
|
// var providers = store.getProviders ("IF-MIB");
|
|
// mib.registerProviders (providers);
|
|
|
|
//console.log (JSON.stringify (providers, null, 2));
|
|
|
|
mib.dump ({
|
|
leavesOnly: true,
|
|
showProviders: true,
|
|
showValues: true,
|
|
showTypes: true
|
|
});
|
|
|
|
// var data = mib.getTableColumnDefinitions ("ifTable");
|
|
// var data = mib.getTableCells ("ifTable", true);
|
|
// var data = mib.getTableColumnCells ("ifTable", 2);
|
|
// var data = mib.getTableRowCells ("ifTable", [1]);
|
|
// mib.setTableSingleCell ("ifTable", 2, [2], "changed!");
|
|
mib.setTableSingleCell ("ifTable", 3, [2], 99);
|
|
var data = mib.getTableSingleCell ("ifTable", 3, [2]);
|
|
// var data = mib.getScalarValue ("sysDescr");
|
|
|
|
console.log(JSON.stringify (data, null, 2));
|
|
|
|
var acm = authorizer.getAccessControlModel ();
|
|
acm.setCommunityAccess ("denied", snmp.AccessLevel.None);
|
|
acm.setCommunityAccess ("public", snmp.AccessLevel.ReadOnly);
|
|
acm.setCommunityAccess ("private", snmp.AccessLevel.ReadWrite);
|
|
acm.setUserAccess ("fred", snmp.AccessLevel.ReadWrite);
|
|
console.log ("private = ", acm.getCommunityAccess ("private"));
|
|
console.log (acm.getCommunitiesAccess ());
|