123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274 |
- 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 ());
|