lib/utils.coffee
author Tomas Zeman <tzeman@volny.cz>
Thu, 28 Mar 2013 21:55:07 +0100
changeset 5 2db4f3d512bb
permissions -rw-r--r--
Server prototype

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