# HG changeset patch # User Tomas Zeman # Date 1364504107 -3600 # Node ID 2db4f3d512bb05f41a34eeeca87284c8880827ef # Parent df7be338df739e5960a4c78f0b3f8925ca340414 Server prototype diff -r df7be338df73 -r 2db4f3d512bb lib/snmp-types.coffee --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/lib/snmp-types.coffee Thu Mar 28 21:55:07 2013 +0100 @@ -0,0 +1,22 @@ +snmpTypes = require('snmp-native/lib/asn1ber').types + +typeStr = {} +typeStr[snmpTypes.Integer] = 'Integer' +typeStr[snmpTypes.OctetString] = 'OctetString' +typeStr[snmpTypes.Null] = 'Null' +typeStr[snmpTypes.ObjectIdentifier] = 'ObjectIdentifier' +typeStr[snmpTypes.Sequence] = 'Sequence' +typeStr[snmpTypes.IpAddress] = 'IpAddress' +typeStr[snmpTypes.Counter] = 'Counter' +typeStr[snmpTypes.Gauge] = 'Gauge' +typeStr[snmpTypes.TimeTicks] = 'TimeTicks' +typeStr[snmpTypes.Opaque] = 'Opaque' +typeStr[snmpTypes.NsapAddress] = 'NsapAddress' +typeStr[snmpTypes.Counter64] = 'Counter64' +typeStr[snmpTypes.NoSuchObject] = 'NoSuchObject' +typeStr[snmpTypes.NoSuchInstance] = 'NoSuchInstance' +typeStr[snmpTypes.EndOfMibView] = 'EndOfMibView' +typeStr[snmpTypes.PDUBase] = 'PDUBase' + +exports.snmpTypes = snmpTypes +exports.typeStr = typeStr diff -r df7be338df73 -r 2db4f3d512bb lib/utils.coffee --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/lib/utils.coffee Thu Mar 28 21:55:07 2013 +0100 @@ -0,0 +1,63 @@ +snmp = require('snmp-native') +snmpTypes = require('./snmp-types').snmpTypes +typeStr = require('./snmp-types').typeStr + + +### +Converts TimeTicks value to easy-to-use structure. +### +convertTimeTicks = (v) -> + intDiv = (a, b) -> Math.floor(a / b) + msec = v % 100 + v = intDiv(v, 100) + secs = v % 60 + v = intDiv(v, 60) + mins = v % 60 + v = intDiv(v, 60) + hours = v % 24 + days = intDiv(v, 24) + + days: days + hours: hours + mins: mins + secs: secs + msecs: msec + +### +Processes SNMP result value. +### +processVarBind = (vb) -> + rv = + oid: "." + vb.oid.reduce (x,y) -> x+"."+y + value: vb.value + type: vb.type + typeStr: typeStr[vb.type] ? 'Unknown' + ts: Date.now() / 1000 + if (rv.type == snmpTypes.TimeTicks) + rv.timeTicks = convertTimeTicks(vb.value) + rv + +### +Creates SNMP session and retrieves values for the supplied OIDs. +### +snmpget = (opts, cb) -> + sess = new snmp.Session(opts) + res = [] + snmpgetOne = (i) -> + if (i < opts.oids.length) + oid = opts.oids[i] + sess.get({oid: oid}, (err, vbs) -> + if (err) + res.push { error: err, oid: oid } + if (opts.abortOnError) + i = opts.oids.length + else + res.push vbs.map(processVarBind)... + snmpgetOne ++i + ) + else + sess.close() + cb(res) + snmpgetOne 0 + +exports.snmpget = snmpget diff -r df7be338df73 -r 2db4f3d512bb server.coffee --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/server.coffee Thu Mar 28 21:55:07 2013 +0100 @@ -0,0 +1,29 @@ +snmpget = require('./lib/utils').snmpget +restify = require('restify') + +server = restify.createServer({name: 'snmp2json', version: '1.0.0'}) + +server.use(restify.acceptParser(server.acceptable)) +server.use(restify.queryParser()) +server.use(restify.bodyParser()) + +server.get('/snmpget/:host/:oid', (req, res, next) -> + opts = + host: req.params.host + oids: [ req.params.oid ] + opts.community = req.params.community ? "public" + utils.snmpget(opts, (r) -> res.send r) + return next() +) + +server.post('/snmpget/:host', (req, res, next) -> + opts = + host: req.params.host + oids: req.params.oids + opts.community = req.params.community ? "public" + snmpget(opts, (r) -> res.send r) + return next() +) + +server.listen(8080, () -> + console.log('%s listening at %s', server.name, server.url))