lib/utils.coffee
changeset 5 2db4f3d512bb
equal deleted inserted replaced
4:df7be338df73 5:2db4f3d512bb
       
     1 snmp = require('snmp-native')
       
     2 snmpTypes = require('./snmp-types').snmpTypes
       
     3 typeStr = require('./snmp-types').typeStr
       
     4 
       
     5 
       
     6 ###
       
     7 Converts TimeTicks value to easy-to-use structure.
       
     8 ###
       
     9 convertTimeTicks = (v) ->
       
    10   intDiv = (a, b) -> Math.floor(a / b)
       
    11   msec = v % 100
       
    12   v = intDiv(v, 100)
       
    13   secs = v % 60
       
    14   v = intDiv(v, 60)
       
    15   mins = v % 60
       
    16   v = intDiv(v, 60)
       
    17   hours = v % 24
       
    18   days = intDiv(v, 24)
       
    19   
       
    20   days: days
       
    21   hours: hours
       
    22   mins: mins
       
    23   secs: secs
       
    24   msecs: msec
       
    25 
       
    26 ###
       
    27 Processes SNMP result value.
       
    28 ###
       
    29 processVarBind = (vb) ->
       
    30   rv =
       
    31     oid: "." + vb.oid.reduce (x,y) -> x+"."+y
       
    32     value: vb.value
       
    33     type: vb.type
       
    34     typeStr: typeStr[vb.type] ? 'Unknown'
       
    35     ts: Date.now() / 1000
       
    36   if (rv.type == snmpTypes.TimeTicks)
       
    37     rv.timeTicks = convertTimeTicks(vb.value)
       
    38   rv
       
    39 
       
    40 ###
       
    41 Creates SNMP session and retrieves values for the supplied OIDs.
       
    42 ###
       
    43 snmpget = (opts, cb) ->
       
    44   sess = new snmp.Session(opts)
       
    45   res = []
       
    46   snmpgetOne = (i) ->
       
    47     if (i < opts.oids.length)
       
    48       oid = opts.oids[i]
       
    49       sess.get({oid: oid}, (err, vbs) ->
       
    50         if (err)
       
    51           res.push { error: err, oid: oid }
       
    52           if (opts.abortOnError)
       
    53             i = opts.oids.length
       
    54         else
       
    55           res.push vbs.map(processVarBind)...
       
    56         snmpgetOne ++i
       
    57       )
       
    58     else
       
    59       sess.close()
       
    60       cb(res)
       
    61   snmpgetOne 0
       
    62 
       
    63 exports.snmpget = snmpget