diff --git a/io/ping/88-ping.js b/io/ping/88-ping.js index 7990fa6f..b692d846 100644 --- a/io/ping/88-ping.js +++ b/io/ping/88-ping.js @@ -1,5 +1,5 @@ /** - * Copyright 2013,2016 IBM Corp. + * Copyright 2013 IBM Corp. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -16,35 +16,46 @@ module.exports = function(RED) { "use strict"; - var dns = require("dns") - var ping = require ("net-ping"); + var spawn = require('child_process').spawn; + var plat = require('os').platform(); function PingNode(n) { RED.nodes.createNode(this,n); this.host = n.host; this.timer = n.timer * 1000; - this.session = ping.createSession(); var node = this; node.tout = setInterval(function() { - dns.lookup(node.host, function(err, address, family) { - if (typeof address === 'undefined') { address = node.host; } - node.session.pingHost(address, function(error, target, sent, rcvd) { - var msg = { payload:false, topic:target }; - if (error) { - msg.error = error.toString(); - } else { - msg.payload = rcvd - sent; - } - node.send(msg); - node.session.close(); - }); + var ex; + if (plat == "linux") { ex = spawn('ping', ['-n', '-w', '5', '-c', '1', node.host]); } + else if (plat.match(/^win/)) { ex = spawn('ping', ['-n', '1', '-w', '5000', node.host]); } + else if (plat == "darwin") { ex = spawn('ping', ['-n', '-t', '5', '-c', '1', node.host]); } + else { node.error("Sorry - your platform - "+plat+" - is not recognised."); } + var res = false; + var line = ""; + //var regex = /from.*time.(.*)ms/; + var regex = /=.*[<|=]([0-9]*).*TTL|ttl..*=([0-9\.]*)/; + ex.stdout.on('data', function (data) { + line += data.toString(); + }); + //ex.stderr.on('data', function (data) { + //console.log('[ping] stderr: ' + data); + //}); + ex.on('close', function (code) { + var m = regex.exec(line)||""; + if (m !== '') { + if (m[1]) { res = Number(m[1]); } + if (m[2]) { res = Number(m[2]); } + } + var msg = { payload:false, topic:node.host }; + if (code === 0) { msg = { payload:res, topic:node.host }; } + try { node.send(msg); } + catch(e) {} }); }, node.timer); this.on("close", function() { - if (node.tout) { clearInterval(this.tout); } - if (node.session) { node.session.close(); } + if (this.tout) { clearInterval(this.tout); } }); } RED.nodes.registerType("ping",PingNode); diff --git a/io/ping/README.md b/io/ping/README.md index 536b59d5..f4d38860 100644 --- a/io/ping/README.md +++ b/io/ping/README.md @@ -22,11 +22,11 @@ The fix is to allow it as follows Usage ----- -Pings a machine and returns the trip time in mS as **msg.payload**. +Pings a machine and returns the trip time in mS as `msg.payload`. Returns boolean `false` if no response received, or if the host is unresolveable. -**msg.wrror** will contain any error message if necessary. +`msg.error` will contain any error message if necessary. -**msg.topic** contains the ip address of the target host. +`msg.topic` contains the ip address of the target host. Default ping is every 20 seconds but can be configured. diff --git a/io/ping/package.json b/io/ping/package.json index 8518d1c7..0b95da92 100644 --- a/io/ping/package.json +++ b/io/ping/package.json @@ -1,6 +1,6 @@ { "name" : "node-red-node-ping", - "version" : "0.0.9", + "version" : "0.0.10", "description" : "A Node-RED node to ping a remote server, for use as a keep-alive check.", "dependencies" : { "net-ping":"1.1.*"