UNPKG

prisme-flow

Version:

prisme platform flow engine

199 lines (185 loc) 6.47 kB
/** * Created by prisme.io on 09/06/2017. */ module.exports = function (RED) { 'use strict' var snmp = require('net-snmp') var sessions = {} function getSession (host, community, version) { var sessionKey = host + ':' + community + ':' + version if (!(sessionKey in sessions)) { sessions[sessionKey] = snmp.createSession(host, community, {version: version}) } return sessions[sessionKey] } function SnmpNode (n) { RED.nodes.createNode(this, n) this.community = n.community this.host = n.host this.version = (n.version === '2c') ? snmp.Version2c : snmp.Version1 this.oids = n.oids.replace(/\s/g, '') var node = this this.on('input', function (msg) { var host = node.host || msg.host var community = node.community || msg.community var oids = node.oids || msg.oid if (oids) { getSession(host, community, node.version).get(oids.split(','), function (error, varbinds) { if (error) { node.error(error.toString(), msg) } else { for (var i = 0; i < varbinds.length; i++) { if (snmp.isVarbindError(varbinds[i])) { node.error(snmp.varbindError(varbinds[i]), msg) } else { if (varbinds[i].type == 4) { varbinds[i].value = varbinds[i].value.toString() } varbinds[i].tstr = snmp.ObjectType[varbinds[i].type] // node.log(varbinds[i].oid + "|" + varbinds[i].tstr + "|" + varbinds[i].value); } } msg.oid = oids msg.payload = varbinds node.send(msg) } }) } else { node.warn('No oid(s) to search for') } }) } RED.nodes.registerType('snmp', SnmpNode) function SnmpTNode (n) { RED.nodes.createNode(this, n) this.community = n.community this.host = n.host this.version = (n.version === '2c') ? snmp.Version2c : snmp.Version1 this.oids = n.oids.replace(/\s/g, '') var node = this var maxRepetitions = 20 function sortInt (a, b) { if (a > b) { return 1 } else if (b > a) { return -1 } else { return 0 } } this.on('input', function (msg) { var host = node.host || msg.host var community = node.community || msg.community var oids = node.oids || msg.oid if (oids) { msg.oid = oids getSession(host, community, node.version).table(oids, maxRepetitions, function (error, table) { if (error) { node.error(error.toString(), msg) } else { var indexes = [] for (var index in table) { if (table.hasOwnProperty(index)) { indexes.push(parseInt(index)) } } indexes.sort(sortInt) for (var i = 0; i < indexes.length; i++) { var columns = [] for (var column in table[indexes[i]]) { if (table[indexes[i]].hasOwnProperty(column)) { columns.push(parseInt(column)) } } columns.sort(sortInt) // console.log("row index = " + indexes[i]); // for (var j = 0; j < columns.length; j++) { // console.log(" column " + columns[j] + " = " + table[indexes[i]][columns[j]]); // } } msg.payload = table node.send(msg) } }) } else { node.warn('No oid to search for') } }) } RED.nodes.registerType('snmp table', SnmpTNode) function SnmpSubtreeNode (n) { RED.nodes.createNode(this, n) this.community = n.community this.host = n.host this.version = (n.version === '2c') ? snmp.Version2c : snmp.Version1 this.oids = n.oids.replace(/\s/g, '') var node = this var maxRepetitions = 20 var response = [] function feedCb (varbinds) { for (var i = 0; i < varbinds.length; i++) { if (snmp.isVarbindError(varbinds[i])) { node.error(snmp.varbindError(varbinds[i]), msg) } else { // console.log(varbinds[i].oid + "|" + varbinds[i].value); response.push({oid: varbinds[i].oid, value: varbinds[i].value}) } } } this.on('input', function (msg) { var host = node.host || msg.host var community = node.community || msg.community var oids = node.oids || msg.oid if (oids) { msg.oid = oids getSession(host, community, node.version).subtree(msg.oid, maxRepetitions, feedCb, function (error) { if (error) { node.error(error.toString(), msg) } else { msg.payload = response node.send(msg) // Clears response response.length = 0 } }) } else { node.warn('No oid to search for') } }) } RED.nodes.registerType('snmp subtree', SnmpSubtreeNode) function SnmpWalkerNode (n) { RED.nodes.createNode(this, n) this.community = n.community this.host = n.host this.version = (n.version === '2c') ? snmp.Version2c : snmp.Version1 this.oids = n.oids.replace(/\s/g, '') var node = this var maxRepetitions = 20 var response = [] function feedCb (varbinds) { for (var i = 0; i < varbinds.length; i++) { if (snmp.isVarbindError(varbinds[i])) { node.error(snmp.varbindError(varbinds[i]), msg) } else { // console.log(varbinds[i].oid + "|" + varbinds[i].value); response.push({oid: varbinds[i].oid, value: varbinds[i].value}) } } } this.on('input', function (msg) { node.msg = msg var oids = node.oids || msg.oid var host = node.host || msg.host var community = node.community || msg.community if (oids) { msg.oid = oids getSession(host, community, node.version).walk(msg.oid, maxRepetitions, feedCb, function (error) { if (error) { node.error(error.toString(), msg) } else { msg.payload = response node.send(msg) // Clears response response.length = 0 } }) } else { node.warn('No oid to search for') } }) } RED.nodes.registerType('snmp walker', SnmpWalkerNode) }