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