SNMP for node.js
JavaScript
Latest commit 39846b3 Jan 8, 2012 @dgwynne consume error events on the dgram. errors from sending (eg, dns
lookup failure) dont get "handled" otherwise and kill node.

also, cope with short varBindLists back from bulkget requests. some
ciscos return short lists rather than fragment udp packets.

README

snmp for node.js

i hate writing doco. the code below shows how it works though. it
queries all the devices on 192.168.1.0/24 for their interface info. in
my environment it was about to find 26 devices which had 3500 interfaces
in just under 15 seconds.

var snmp = require('snmp');
var mgr = snmp.createManager( { community: 'public', version: 2, retries: 10 } );

var agents = { };
process.on('exit', function() {
        console.log(agents);
        console.log(Object.keys(agents).length);
});

var oid2mib = {
        '1.3.6.1.2.1.2.2.1.2': 'ifDescr',
        '1.3.6.1.2.1.2.2.1.7': 'ifAdminStatus',
        '1.3.6.1.2.1.2.2.1.8': 'ifOperStatus',
        '1.3.6.1.2.1.31.1.1.1.1': 'ifName',
        '1.3.6.1.2.1.31.1.1.1.15': 'ifHighSpeed',
        '1.3.6.1.2.1.31.1.1.1.18': 'ifAlias',

        '1.3.6.1.2.1.31.1.1.1.6': 'ifHCInOctets',
        '1.3.6.1.2.1.31.1.1.1.10': 'ifHCOutOctets',

        '1.3.6.1.2.1.31.1.1.1.7': 'ifHCInUcastPkts',
        '1.3.6.1.2.1.31.1.1.1.11': 'ifHCOutUcastPkts',

        '1.3.6.1.2.1.31.1.1.1.8': 'ifHCInMulticastPkts',
        '1.3.6.1.2.1.31.1.1.1.12': 'ifHCOutMulticastPkts',

        '1.3.6.1.2.1.31.1.1.1.9': 'ifHCInBroadcastPkts',
        '1.3.6.1.2.1.31.1.1.1.13': 'ifHCOutBroadcastPkts',

        '1.3.6.1.2.1.2.2.1.13': 'ifInDiscards',
        '1.3.6.1.2.1.2.2.1.19': 'ifOutDiscards',

        '1.3.6.1.2.1.2.2.1.14': 'ifInErrors',
        '1.3.6.1.2.1.2.2.1.20': 'ifOutErrors'
};

function ml(err, res, agent) {
        if (err)
                return;

        if (typeof(agents[agent]) === 'undefined')
                agents[agent] = { };

        for (var i = 0; i < res.length; i++) {
                var o = res[i].oid.split('.');
                var idx = o.pop();
                var oid = o.join('.');

                if (typeof(agents[agent][idx]) === 'undefined')
                        agents[agent][idx] = { };

                agents[agent][idx][oid2mib[oid]] = res[i].value.toString();
        }
}

function m(agent) {
        mgr.get(agent, '1.3.6.1.2.1.1.3.0', function(e, r) {
                if (e)
                        return;

                for (var k in oid2mib) {
                        mgr.bulkGet(agent, k, function (e, r) { ml(e,r,agent); });
                }
        }, { retries: 3 });
}

for (i = 1; i < 255; i++)
        m('192.168.1.' + i);