var mikrotik = require('mikronode-ng2'); module.exports = function(RED) { function NodeMikrotikDevice(n) { RED.nodes.createNode(this, n); this.host = n.host; this.port = n.port; this.username = n.username; this.password = n.password; } RED.nodes.registerType("mikrotik-device-custom", NodeMikrotikDevice); function NodeMikrotik(config) { RED.nodes.createNode(this,config); this.device = RED.nodes.getNode(config.device); this.action = config.action; var node = this; var host = this.device.host; var port = this.device.port; var username = this.device.username; var password = this.device.password; var command; var connection = mikrotik.getConnection(host, username, password, {closeOnDone : false, port: port}); var connpromise = null; var connected = false; node.status({fill:"grey",shape:"dot",text:"unconfigured"}); switch (parseInt(node.action)) { case 0: command = '/log/print'; break; case 1: command = '/system/resource/print'; break; case 2: command = '/interface/wireless/registration-table/print'; break; case 3: command = '/system/reboot'; break; case 9: command = ''; break; } function on_connect(){ node.status({fill:"green",shape:"dot",text:"connected"}); connected = true; } connpromise = connection.connect(on_connect); connpromise.on('close', function(err){ node.status({fill:"yellow",shape:"dot",text:"disconnected:"+err}); connected = false; }); connpromise.on('trap', function(err){ node.status({fill:"red",shape:"ring",text:"FAILED:"+err}); connected = false; }); connpromise.on('error', function(err){ node.status({fill:"red",shape:"dop",text:"ERROR:"+err}); connected = false; }); this.on('input', function(msg) { if (command == '') command = msg.payload; if (command == '') return false; if (!connected) { connection.connect(on_connect); } else { connpromise.getCommandPromise(command).then( function resolved(values) { //promise resolved var parsed = mikrotik.parseItems(values); var pl = []; parsed.forEach(function(item) { pl.push(item); }); msg.payload = values; node.send(msg); }, function notresolved(reason) { //promise rejected node.error('Error executing cmd['+command+']: ' + JSON.stringify(reason)); } ); } command = ''; //reset command string }); this.on('close', function() { connection.close(true); }); } RED.nodes.registerType("mikrotik-custom", NodeMikrotik); };