Server prototype
authorTomas Zeman <tzeman@volny.cz>
Thu, 28 Mar 2013 21:55:07 +0100
changeset 5 2db4f3d512bb
parent 4 df7be338df73
child 6 cefe9d604286
Server prototype
lib/snmp-types.coffee
lib/utils.coffee
server.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
--- /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))