lib/utils.coffee
changeset 5 2db4f3d512bb
--- /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