--- /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
--- /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
--- /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))