New Case Study:See how Anthropic automated 95% of dependency reviews with Socket.Learn More
Socket
Sign inDemoInstall
Socket

ping

Package Overview
Dependencies
Maintainers
1
Versions
20
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

ping - npm Package Compare versions

Comparing version 0.2.2 to 0.2.3

examples/example_win_de_v6.js

16

CONTRIBUTING.md

@@ -41,5 +41,12 @@ # Contributing

"time": 5.371,
"times": [
5.371,
4.269,
4.97,
5.228
],
"min": 4.269,
"max": 4.96,
"avg": 5.371,
"packageLoss": 0.0
"stddev": 0.424

@@ -51,3 +58,3 @@ }

We trust tesed codes. Please run below command for testing before sending
We trust tested codes. Please run below command for testing before sending
a pull request

@@ -59,2 +66,7 @@

[1]: http://www.jsoneditoronline.org/
## Running ipv6 test cases
As #67 introduces ipv6 mechanism, fixture file names with `v6` will enable v6.
Please refer to window/de/v6_sample.txt for an example
[1]: https://jsoneditoronline.org

25

examples/example.js

@@ -1,10 +0,13 @@

//-------- example -----------------------
// -------- example -----------------------
'use strict';
var ping = require('../index');
var hosts = ['192.168.1.1', 'google.com', 'yahoo.com'];
hosts.forEach(function(host){
hosts.forEach(function (host) {
// Running with default config
ping.sys.probe(host, function(isAlive){
var msg = isAlive ? 'host ' + host + ' is alive' : 'host ' + host + ' is dead';
ping.sys.probe(host, function (isAlive) {
var msg = isAlive ?
'host ' + host + ' is alive' : 'host ' + host + ' is dead';
console.log(msg);

@@ -14,13 +17,15 @@ });

// Running with custom config
ping.sys.probe(host, function(isAlive){
var msg = isAlive ? 'host ' + host + ' is alive' : 'host ' + host + ' is dead';
ping.sys.probe(host, function (isAlive) {
var msg = isAlive ?
'host ' + host + ' is alive' : 'host ' + host + ' is dead';
console.log(msg);
}, {extra: ["-i 2"]});
}, {extra: ['-i', '2']});
// Running ping with some default argument gone
ping.sys.probe(host, function(isAlive){
var msg = isAlive ? 'host ' + host + ' is alive' : 'host ' + host + ' is dead';
ping.sys.probe(host, function (isAlive) {
var msg = isAlive ?
'host ' + host + ' is alive' : 'host ' + host + ' is dead';
console.log(msg);
}, {extra: ["-i 2"], timeout: false});
}, {extra: ['-i', '2'], timeout: false});
});

@@ -1,3 +0,5 @@

var ping = require("../index");
'use strict';
var ping = require('../index');
var hosts = ['192.168.1.1', 'google.com', 'yahoo.com'];

@@ -19,3 +21,3 @@

timeout: 10,
extra: ["-i", "2"],
extra: ['-i', '2'],
})

@@ -34,3 +36,3 @@ .then(function (res) {

// Below extra arguments may not work in platforms other than linux
extra: ["-i", "2"],
extra: ['-i', '2'],
})

@@ -37,0 +39,0 @@ .then(function (res) {

@@ -23,2 +23,3 @@ 'use strict';

'aix',
'android',
'linux',

@@ -65,6 +66,7 @@ ];

* @param {string} platform - Name of the platform
* @return {object} - Argument builder
* @param {bool} v6 - Ping via ipv6 or not
* @return {string} - Executable path for system command ping
* @throw if given platform is not supported
*/
factory.getExecutablePath = function (platform) {
factory.getExecutablePath = function (platform, v6) {
if (!this.isPlatformSupport(platform)) {

@@ -79,7 +81,7 @@ throw new Error(util.format('Platform |%s| is not support', platform));

} else if (factory.isLinux(platform)) {
ret = '/bin/ping';
ret = v6 ? 'ping6' : 'ping';
} else if (factory.isWindow(platform)) {
ret = process.env.SystemRoot + '/system32/ping.exe';
} else if (factory.isMacOS(platform)) {
ret = '/sbin/ping';
ret = v6 ? '/sbin/ping6' : '/sbin/ping';
}

@@ -86,0 +88,0 @@

@@ -15,4 +15,17 @@ 'use strict';

* @property {boolean} numeric - Map IP address to hostname or not
* @property {number} timeout - Time duration for ping command to exit
* @property {number} timeout - Time to wait for a response, in seconds.
* The option affects only timeout in absence of any responses,
* otherwise ping waits for two RTTs.
* @property {number} deadline - Specify a timeout, in seconds,
* before ping exits regardless of how many packets have been sent or received.
* In this case ping does not stop after count packet are sent,
* it waits either for deadline expire or until count probes are answered
* or for some error notification from network.
* This option is only available on linux and mac.
* @property {number} min_reply - Exit after sending number of ECHO_REQUEST
* @property {boolean} v6 - Use IPv4 (default) or IPv6
* @property {string} sourceAddr - source address for sending the ping
* @property {number} packetSize - Specifies the number of data bytes to be sent
* Default: Linux / MAC: 56 Bytes,
* Window: 32 Bytes
* @property {string[]} extra - Optional options does not provided

@@ -24,3 +37,7 @@ */

timeout: 2,
deadline: false,
min_reply: 1,
v6: false,
sourceAddr: '',
packetSize: 56,
extra: [],

@@ -35,3 +52,3 @@ };

*/
builder.getResult = function (target, config) {
builder.getCommandArguments = function (target, config) {
var _config = config || {};

@@ -43,5 +60,6 @@

// Make every key in config has been setup properly
var keys = ['numeric', 'timeout', 'min_reply', 'extra'];
var keys = ['numeric', 'timeout', 'deadline', 'min_reply', 'v6',
'sourceAddr', 'extra', 'packetSize'];
keys.forEach(function (k) {
// Falsy value will be overrided without below checking
// Falsy value will be overridden without below checking
if (typeof(_config[k]) !== 'boolean') {

@@ -58,3 +76,3 @@ _config[k] = _config[k] || defaultConfig[k];

ret = ret.concat([
'-w',
'-W',
util.format('%d', _config.timeout),

@@ -64,2 +82,9 @@ ]);

if (_config.deadline) {
ret = ret.concat([
'-w',
util.format('%d', _config.deadline),
]);
}
if (_config.min_reply) {

@@ -72,2 +97,16 @@ ret = ret.concat([

if (_config.sourceAddr) {
ret = ret.concat([
'-I',
util.format('%s', _config.sourceAddr),
]);
}
if (_config.packetSize) {
ret = ret.concat([
'-s',
util.format('%d', _config.packetSize),
]);
}
if (_config.extra) {

@@ -82,2 +121,12 @@ ret = ret.concat(_config.extra);

/**
* Compute an option object for child_process.spawn
* @return {object} - Refer to document of child_process.spawn
*/
builder.getSpawnOptions = function () {
return {
shell: true,
};
};
module.exports = builder;

@@ -15,4 +15,17 @@ 'use strict';

* @property {boolean} numeric - Map IP address to hostname or not
* @property {number} timeout - Time duration for ping command to exit
* @property {number} timeout - Time to wait for a response, in seconds.
* The option affects only timeout in absence of any responses,
* otherwise ping waits for two RTTs.
* @property {number} deadline - Specify a timeout, in seconds,
* before ping exits regardless of how many packets have been sent or received.
* In this case ping does not stop after count packet are sent,
* it waits either for deadline expire or until count probes are answered
* or for some error notification from network.
* This option is only available on linux and mac.
* @property {number} min_reply - Exit after sending number of ECHO_REQUEST
* @property {boolean} v6 - Use IPv4 (default) or IPv6
* @property {string} sourceAddr - source address for sending the ping
* @property {number} packetSize - Specifies the number of data bytes to be sent
* Default: Linux / MAC: 56 Bytes,
* Window: 32 Bytes
* @property {string[]} extra - Optional options does not provided

@@ -24,3 +37,7 @@ */

timeout: 2,
deadline: false,
min_reply: 1,
v6: false,
sourceAddr: '',
packetSize: 56,
extra: [],

@@ -34,4 +51,5 @@ };

* @return {string[]} - Command line argument according to the configuration
* @throws If there are errors on building arguments with given inputs
*/
builder.getResult = function (target, config) {
builder.getCommandArguments = function (target, config) {
var _config = config || {};

@@ -43,5 +61,6 @@

// Make every key in config has been setup properly
var keys = ['numeric', 'timeout', 'min_reply', 'extra'];
var keys = ['numeric', 'timeout', 'deadline', 'min_reply', 'v6',
'sourceAddr', 'extra', 'packetSize'];
keys.forEach(function (k) {
// Falsy value will be overrided without below checking
// Falsy value will be overridden without below checking
if (typeof(_config[k]) !== 'boolean') {

@@ -57,5 +76,17 @@ _config[k] = _config[k] || defaultConfig[k];

if (_config.timeout) {
// XXX: There is no timeout option on mac's ping6
if (config.v6) {
throw new Error('There is no timeout option on ping6');
}
ret = ret.concat([
'-W',
util.format('%d', _config.timeout * 1000),
]);
}
if (_config.deadline) {
ret = ret.concat([
'-t',
util.format('%d', _config.timeout),
util.format('%d', _config.deadline),
]);

@@ -71,2 +102,16 @@ }

if (_config.sourceAddr) {
ret = ret.concat([
'-S',
util.format('%s', _config.sourceAddr),
]);
}
if (_config.packetSize) {
ret = ret.concat([
'-s',
util.format('%d', _config.packetSize),
]);
}
if (_config.extra) {

@@ -81,2 +126,11 @@ ret = ret.concat(_config.extra);

/**
* Compute an option object for child_process.spawn
* @return {object} - Refer to document of child_process.spawn
*/
builder.getSpawnOptions = function () {
return {};
};
module.exports = builder;

@@ -15,4 +15,9 @@ 'use strict';

* @property {boolean} numeric - Map IP address to hostname or not
* @property {number} timeout - Time duration for ping command to exit
* @property {number} timeout - Timeout in seconds for each ping request
* @property {number} min_reply - Exit after sending number of ECHO_REQUEST
* @property {boolean} v6 - Use IPv4 (default) or IPv6
* @property {string} sourceAddr - source address for sending the ping
* @property {number} packetSize - Specifies the number of data bytes to be sent
* Default: Linux / MAC: 56 Bytes,
* Window: 32 Bytes
* @property {string[]} extra - Optional options does not provided

@@ -25,2 +30,5 @@ */

min_reply: 1,
v6: false,
sourceAddr: '',
packetSize: 32,
extra: [],

@@ -35,3 +43,3 @@ };

*/
builder.getResult = function (target, config) {
builder.getCommandArguments = function (target, config) {
var _config = config || {};

@@ -43,3 +51,6 @@

// Make every key in config has been setup properly
var keys = ['numeric', 'timeout', 'min_reply', 'extra'];
var keys = [
'numeric', 'timeout', 'min_reply', 'v6', 'sourceAddr', 'extra',
'packetSize',
];
keys.forEach(function (k) {

@@ -52,2 +63,4 @@ // Falsy value will be overrided without below checking

ret.push(_config.v6 ? '-6' : '-4');
if (!_config.numeric) {

@@ -67,2 +80,6 @@ ret.push('-a');

if (_config.deadline) {
throw new Error('There is no deadline option on windows');
}
if (_config.min_reply) {

@@ -75,2 +92,16 @@ ret = ret.concat([

if (_config.sourceAddr) {
ret = ret.concat([
'-S',
util.format('%s', _config.sourceAddr),
]);
}
if (_config.packetSize) {
ret = ret.concat([
'-l',
util.format('%d', _config.packetSize),
]);
}
if (_config.extra) {

@@ -85,2 +116,10 @@ ret = ret.concat(_config.extra);

/**
* Compute an option object for child_process.spawn
* @return {object} - Refer to document of child_process.spawn
*/
builder.getSpawnOptions = function () {
return {};
};
module.exports = builder;

@@ -18,2 +18,3 @@ 'use strict';

* @param {string} avg - Average time for collection records
* @param {number} packetLoss - Packet Losses in percent (number)
* @param {string} stddev - Standard deviation time for collected records

@@ -24,4 +25,6 @@ */

* @constructor
*
* @param {PingConfig} config - Config object in probe()
*/
function parser() {
function parser(config) {
// Initial state is 0

@@ -36,2 +39,3 @@ this._state = 0;

time: 'unknown',
times: [],
min: 'unknown',

@@ -41,2 +45,3 @@ max: 'unknown',

stddev: 'unknown',
packetLoss: 'unknown',
};

@@ -52,2 +57,5 @@

this._stripRegex = /[ ]*\r?\n?$/g;
// Ping Config
this._pingConfig = config || {};
}

@@ -158,2 +166,3 @@

ret.time = this._response.time = this._times[0];
ret.times = this._response.times = this._times;
}

@@ -177,3 +186,3 @@

// Fix min, avg, max, stddev up to 3 decimal points
__.each(['min', 'avg', 'max', 'stddev'], function (key) {
__.each(['min', 'avg', 'max', 'stddev', 'packetLoss'], function (key) {
var v = ret[key];

@@ -180,0 +189,0 @@ if (__.isNumber(v)) {

@@ -19,6 +19,10 @@ 'use strict';

* @param {string} platform - Name of the platform
* @param {PingConfig} [config] - Config object in probe()
* @return {object} - Parser
* @throw if given platform is not supported
*/
factory.createParser = function (platform) {
factory.createParser = function (platform, config) {
// Avoid function reassignment
var _config = config || {};
if (!builderFactory.isPlatformSupport(platform)) {

@@ -30,7 +34,7 @@ throw new Error(util.format('Platform |%s| is not support', platform));

if (builderFactory.isWindow(platform)) {
ret = new WinParser();
ret = new WinParser(_config);
} else if (builderFactory.isMacOS(platform)) {
ret = new MacParser();
ret = new MacParser(_config);
} else if (builderFactory.isLinux(platform)) {
ret = new LinuxParser();
ret = new LinuxParser(_config);
}

@@ -37,0 +41,0 @@

@@ -9,5 +9,6 @@ 'use strict';

* @constructor
* @param {PingConfig} config - Config object in probe()
*/
function LinuxParser() {
base.call(this);
function LinuxParser(config) {
base.call(this, config);
}

@@ -24,5 +25,13 @@

var tokens = line.split(' ');
var isProbablyIPv4 = tokens[1].indexOf('(') === -1;
this._response.host = tokens[1];
this._response.numeric_host = tokens[2].slice(1, -1);
if (isProbablyIPv4) {
this._response.host = tokens[1];
this._response.numeric_host = tokens[2].slice(1, -1);
} else {
// Normalise into either a 2 or 3 element array
var foundAddresses = tokens.slice(1, -3).join('').match(/([^\s()]+)/g);
this._response.host = foundAddresses.shift();
this._response.numeric_host = foundAddresses.pop();
}

@@ -29,0 +38,0 @@ this._changeState(this.STATES.BODY);

@@ -10,5 +10,6 @@ 'use strict';

* @constructor
* @param {PingConfig} config - Config object in probe()
*/
function MacParser() {
base.call(this);
function MacParser(config) {
base.call(this, config);
}

@@ -40,3 +41,3 @@

if (count >= 3) {
var regExp = /([0-9\.]+)[ ]*ms/;
var regExp = /([0-9.]+)[ ]*ms/;
var match = regExp.exec(line);

@@ -57,6 +58,11 @@ this._times.push(parseFloat(match[1], 10));

MacParser.prototype._processFooter = function (line) {
var packetLoss = line.match(/ ([\d.]+)%/);
if (packetLoss) {
this._response.packetLoss = parseFloat(packetLoss[1], 10);
}
// XXX: Assume number of keywords '/' more than 3
var count = (line.match(/[\/]/g) || []).length;
var count = (line.match(/[/]/g) || []).length;
if (count >= 3) {
var regExp = /([0-9\.]+)/g;
var regExp = /([0-9.]+)/g;
// XXX: Assume min avg max stddev

@@ -63,0 +69,0 @@ var m1 = regExp.exec(line);

@@ -10,5 +10,6 @@ 'use strict';

* @constructor
* @param {PingConfig} config - Config object in probe()
*/
function WinParser() {
base.call(this);
function WinParser(config) {
base.call(this, config);
this._ipv4Regex = /^([0-9]{1,3}\.){3}[0-9]{1,3}$/;

@@ -24,10 +25,31 @@ }

WinParser.prototype._processHeader = function (line) {
// XXX: Expect to find [****] when pinging domain like google.com
// Read fixture/win/**/* for the detail
var isPingNumeric = line.indexOf('[') === -1;
// Get host and numeric_host
var tokens = line.split(' ');
this._response.host = tokens[1];
if (this._ipv4Regex.test(this._response.host)) {
this._response.numeric_host = tokens[1];
if (isPingNumeric) {
// For those missing [***], get the first token which match IPV4 regex
this._response.host = __.find(tokens, function (t) {
return this._ipv4Regex.test(t);
}, this);
this._response.numeric_host = this._response.host;
} else {
this._response.numeric_host = tokens[2].slice(1, -1);
// For those has [***], anchor with such token
var numericHost = __.find(tokens, function (t) {
return t.indexOf('[') !== -1;
}, this);
var numericHostIndex = tokens.indexOf(numericHost);
var match = /\[(.*)\]/.exec(numericHost);
if (match) {
// Capture IP inside [] only. refs #71
this._response.numeric_host = match[1];
} else {
// Otherwise, just mark as NA to indicate an error
this._response.numeric_host = 'NA';
}
this._response.host = tokens[numericHostIndex - 1];
}

@@ -39,19 +61,35 @@

/**
* Process output's body
* Process ipv6 output's body
* @param {string} line - A line from system ping
*/
WinParser.prototype._processBody = function (line) {
WinParser.prototype._processIPV6Body = function (line) {
var tokens = line.split(' ');
var kvps = __.filter(tokens, function (token) {
// Sometime it shows <1ms
return token.indexOf('=') >= 0 || token.indexOf('<') >= 0;
var dataFields = __.filter(tokens, function (token) {
var isDataField = token.indexOf('=') >= 0 || token.indexOf('<') >= 0;
return isDataField;
});
// kvps.length >= 3 means target is pingable
if (kvps.length >= 3) {
// refs #65: Support system like french which has an extra space
dataFields = __.map(dataFields, function (dataField) {
var ret = dataField;
var dataFieldIndex = tokens.indexOf(dataField);
var nextIndex = dataFieldIndex + 1;
// Append the missing *ms*
if (nextIndex < tokens.length) {
if (tokens[nextIndex] === 'ms') {
ret += 'ms';
}
}
return ret;
});
var expectDataFieldInReplyLine = 1;
if (dataFields.length >= expectDataFieldInReplyLine) {
// XXX: Assume time will alaways get keyword ms for all language
var timeKVP = __.find(kvps, function (kvp) {
return kvp.indexOf('ms') >= 0;
var timeKVP = __.find(dataFields, function (dataField) {
return dataField.search(/(ms|мс)/i) >= 0;
});
var regExp = /([0-9\.]+)/;
var regExp = /([0-9.]+)/;
var match = regExp.exec(timeKVP);

@@ -61,7 +99,54 @@

}
};
// Change state if it see a ':' at the end
if (line.slice(-1) === ':') {
/**
* Process ipv4 output's body
* @param {string} line - A line from system ping
*/
WinParser.prototype._processIPV4Body = function (line) {
var tokens = line.split(' ');
var byteTimeTTLFields = __.filter(tokens, function (token) {
var isDataField = token.indexOf('=') >= 0 || token.indexOf('<') >= 0;
return isDataField;
});
var expectDataFieldInReplyLine = 3;
var isReplyLine = byteTimeTTLFields.length >= expectDataFieldInReplyLine;
if (isReplyLine) {
var packetSize = this._pingConfig.packetSize;
var byteField = __.find(byteTimeTTLFields, function (dataField) {
var packetSizeToken = util.format('=%d', packetSize);
var isByteField = dataField.indexOf(packetSizeToken) >= 0;
return isByteField;
});
// XXX: Assume time field will always be next of byte field
var byteFieldIndex = byteTimeTTLFields.indexOf(byteField);
var timeFieldIndex = byteFieldIndex + 1;
var timeKVP = byteTimeTTLFields[timeFieldIndex];
var regExp = /([0-9.]+)/;
var match = regExp.exec(timeKVP);
this._times.push(parseFloat(match[1], 10));
}
};
/**
* Process output's body
* @param {string} line - A line from system ping
*/
WinParser.prototype._processBody = function (line) {
var isPingSummaryLineShown = line.slice(-1) === ':';
if (isPingSummaryLineShown) {
this._changeState(this.STATES.FOOTER);
return;
}
var isIPV6 = this._pingConfig.v6;
if (isIPV6) {
this._processIPV6Body(line);
} else {
this._processIPV4Body(line);
}
};

@@ -74,6 +159,11 @@

WinParser.prototype._processFooter = function (line) {
var packetLoss = line.match(/([\d.]+)%/);
if (packetLoss) {
this._response.packetLoss = parseFloat(packetLoss[1], 10);
}
// XXX: Assume there is a keyword ms
if (line.indexOf('ms') >= 0) {
if (line.search(/(ms|мсек)/i) >= 0) {
// XXX: Assume the ordering is Min Max Avg
var regExp = /([0-9\.]+)/g;
var regExp = /([0-9.]+)/g;
var m1 = regExp.exec(line);

@@ -80,0 +170,0 @@ var m2 = regExp.exec(line);

@@ -43,10 +43,17 @@ 'use strict';

var platform = os.platform();
var argumentBuilder = builderFactory.createBuilder(platform);
ping = cp.spawn(
builderFactory.getExecutablePath(platform),
argumentBuilder.getResult(addr, _config)
);
try {
var argumentBuilder = builderFactory.createBuilder(platform);
var pingExecutablePath = builderFactory.getExecutablePath(
platform, _config.v6
);
var pingArgs = argumentBuilder.getCommandArguments(addr, _config);
var spawnOptions = argumentBuilder.getSpawnOptions();
ping = cp.spawn(pingExecutablePath, pingArgs, spawnOptions);
} catch (err) {
deferred.reject(err);
return deferred.promise;
}
// Initial parser
var parser = parserFactory.createParser(platform);
var parser = parserFactory.createParser(platform, _config);

@@ -53,0 +60,0 @@ // Register events from system ping

@@ -25,3 +25,3 @@ {

"description": "a simple wrapper for ping",
"version": "0.2.2",
"version": "0.2.3",
"homepage": "http://github.com/danielzzz/node-ping",

@@ -43,3 +43,3 @@ "license": "MIT",

"chai": "2.3.0",
"eslint": "^3.8.1",
"eslint": "^4.18.2",
"eslint-config-airbnb": "^12.0.0",

@@ -51,6 +51,6 @@ "eslint-config-eslint": "^3.0.0",

"glob": "^7.1.1",
"grunt": "^1.0.1",
"grunt": "^1.0.3",
"grunt-mocha-test": "^0.13.2",
"gruntify-eslint": "^3.1.0",
"mocha": "2.5.3",
"mocha": "^5.2.0",
"sinon": "1.17.6"

@@ -57,0 +57,0 @@ },

@@ -1,8 +0,8 @@

#NODE-PING
# NODE-PING
a ping wrapper for nodejs
@last-modified: 2016-10-21 12:43
@last-modified: 2020-04-04
#LICENSE MIT
# LICENSE MIT

@@ -13,15 +13,15 @@ (C) Daniel Zelisko

#DESCRIPTION
# DESCRIPTION
node-ping is a simple wrapper for the system ping utility
#INSTALLATION
# INSTALLATION
npm install ping
#USAGE
# USAGE
Below are examples extracted from `examples`
##Tradition calls
## Tradition calls

@@ -40,3 +40,3 @@ ```js

##Tradition calls with configuration
## Tradition calls with configuration

@@ -47,3 +47,3 @@ ```js

// WARNING: -i 2 may not work in other platform like window
extra: ["-i 2"],
extra: ['-i', '2'],
};

@@ -59,3 +59,3 @@

##Promise wrapper
## Promise wrapper

@@ -75,3 +75,3 @@ ```js

##Promise Wrapper with configable ping options
## Promise Wrapper with configurable ping options

@@ -83,3 +83,3 @@ ```js

timeout: 10,
extra: ["-i 2"],
extra: ['-i', '2'],
}).then(function (res) {

@@ -91,2 +91,34 @@ console.log(res);

## Async-Await
```js
var ping = require('ping');
var hosts = ['192.168.1.1', 'google.com', 'yahoo.com'];
for(let host of hosts){
let res = await ping.promise.probe(host);
console.log(res);
}
});
```
## Async-Await with configurable ping options
```js
var ping = require('ping');
var hosts = ['192.168.1.1', 'google.com', 'yahoo.com'];
for(let host of hosts){
// WARNING: -i 2 argument may not work in other platform like window
let res = await ping.promise.probe(host, {
timeout: 10,
extra: ['-i', '2'],
});
console.log(res);
}
});
```
### Support configuration

@@ -101,4 +133,14 @@

* @property {boolean} numeric - Map IP address to hostname or not
* @property {number} timeout - Time duration for ping command to exit
* @property {number} timeout - Timeout in seconds for each ping request.
* Behaviour varies between platforms. Check platform ping documentation for more information.
* @property {number} deadline - Specify a timeout, in seconds, before ping exits regardless of
how many packets have been sent or received. In this case ping
does not stop after count packet are sent, it waits either for
deadline expire or until count probes are answered or for some
error notification from network. This option is only available on linux and mac.
* @property {number} min_reply - Exit after sending number of ECHO_REQUEST
* @property {boolean} v6 - Ping via ipv6 or not. Default is false
* @property {string} sourceAddr - source address for sending the ping
* @property {number} packetSize - Specifies the number of data bytes to be sent
Default: Linux / MAC: 56 Bytes, Window: 32 Bytes
* @property {string[]} extra - Optional options does not provided

@@ -110,3 +152,3 @@ */

* For callback based implementaiton:
* For callback based implementation:

@@ -133,5 +175,7 @@ ```js

* @param {number} time - Time (float) in ms for first successful ping response
* @param {Array} times - Array of Time (float) in ms for each ping response
* @param {string} min - Minimum time for collection records
* @param {string} max - Maximum time for collection records
* @param {string} avg - Average time for collection records
* @param {string} packetLoss - Packet Losses in percent (100% -> "100.000")
* @param {string} stddev - Standard deviation time for collected records

@@ -153,2 +197,16 @@ */

* For LINUX users, since we have enable `shell` option in child_process.spawn,
make sure arguments you are passing in into this library are sanitized.
Otherwise, any input containing shell metacharacters may be used to trigger
arbitrary command
# FAQ
* It does not work with busybox's ping implemetation [#89](https://github.com/danielzzz/node-ping/issues/89)
Try to install package `iputils`. For example, running `apk add iputils`
* For questions regarding to the implementation of `timeout`, and `deadline`, please checkout discussions in
[#101](https://github.com/danielzzz/node-ping/issues/101)
# Contributing

@@ -155,0 +213,0 @@

@@ -8,5 +8,12 @@ {

"time": 5.371,
"times": [
5.371,
4.269,
4.97,
5.228
],
"min": "4.269",
"max": "5.371",
"avg": "4.960",
"packetLoss": "0.000",
"stddev": "0.424"

@@ -20,7 +27,84 @@ },

"time": 0.022,
"times": [
0.022,
0.027,
0.029,
0.03
],
"min": "0.022",
"max": "0.030",
"avg": "0.027",
"stddev": "0.003"
"stddev": "0.003",
"packetLoss": "0.000"
},
"linux_en_sample2": {
"host": "10.48.249.8",
"numeric_host": "10.48.249.8",
"alive": true,
"output": "PING 10.48.249.8 (10.48.249.8) 56(84) bytes of data.\n64 bytes from 10.48.249.8: icmp_seq=1 ttl=64 time=2.98 ms\n64 bytes from 10.48.249.8: icmp_seq=2 ttl=64 time=0.890 ms\n64 bytes from 10.48.249.8: icmp_seq=3 ttl=64 time=0.711 ms\n64 bytes from 10.48.249.8: icmp_seq=4 ttl=64 time=0.863 ms\n64 bytes from 10.48.249.8: icmp_seq=5 ttl=64 time=1.20 ms\nping: sendmsg: Network is unreachable\nping: sendmsg: Network is unreachable\nping: sendmsg: Network is unreachable\n64 bytes from 10.48.249.8: icmp_seq=14 ttl=64 time=797 ms\n64 bytes from 10.48.249.8: icmp_seq=15 ttl=64 time=3.86 ms\n64 bytes from 10.48.249.8: icmp_seq=16 ttl=64 time=1.62 ms\n64 bytes from 10.48.249.8: icmp_seq=17 ttl=64 time=0.702 ms\n64 bytes from 10.48.249.8: icmp_seq=18 ttl=64 time=0.783 ms\n64 bytes from 10.48.249.8: icmp_seq=19 ttl=64 time=0.646 ms\n\n--- 10.48.249.8 ping statistics ---\n19 packets transmitted, 11 received, 42% packet loss, time 18195ms\nrtt min/avg/max/mdev = 0.646/73.819/797.744/228.927 ms\n",
"time": 2.98,
"times": [
2.98,
0.89,
0.711,
0.863,
1.2,
797,
3.86,
1.62,
0.702,
0.783,
0.646
],
"min": "0.646",
"max": "797.744",
"avg": "73.819",
"packetLoss": "42.000",
"stddev": "228.927"
},
"linux_en_sample3": {
"host": "10.48.249.150",
"numeric_host": "10.48.249.150",
"alive": false,
"output": "PING 10.48.249.150 (10.48.249.150) 56(84) bytes of data.\nFrom 10.48.249.95 icmp_seq=1 Destination Host Unreachable\nFrom 10.48.249.95 icmp_seq=2 Destination Host Unreachable\nFrom 10.48.249.95 icmp_seq=3 Destination Host Unreachable\n\n--- 10.48.249.150 ping statistics ---\n5 packets transmitted, 0 received, +3 errors, 100% packet loss, time 4079ms\n",
"time": "unknown",
"times": [],
"min": "unknown",
"max": "unknown",
"avg": "unknown",
"packetLoss": "100.000",
"stddev": "unknown"
},
"linux_en_v6_sample1": {
"host": "2606:4700:4700::1111",
"numeric_host": "2606:4700:4700::1111",
"alive": true,
"output": "PING 2606:4700:4700::1111(2606:4700:4700::1111) 56 data bytes\n64 bytes from 2606:4700:4700::1111: icmp_seq=1 ttl=57 time=0.672 ms\n64 bytes from 2606:4700:4700::1111: icmp_seq=2 ttl=57 time=1.00 ms\n\n--- 2606:4700:4700::1111 ping statistics ---\n2 packets transmitted, 2 received, 0% packet loss, time 1000ms\nrtt min/avg/max/mdev = 0.672/0.840/1.009/0.170 ms\n",
"time": 0.672,
"times": [
0.672,
1.00
],
"min": "0.672",
"max": "1.009",
"avg": "0.840",
"packetLoss": "0.000",
"stddev": "0.170"
},
"linux_en_v6_sample2": {
"host": "one.one.one.one",
"numeric_host": "2606:4700:4700::1111",
"alive": true,
"output": "PING one.one.one.one(one.one.one.one (2606:4700:4700::1111)) 56 data bytes\n64 bytes from one.one.one.one (2606:4700:4700::1111): icmp_seq=1 ttl=60 time=1.66 ms\n64 bytes from one.one.one.one (2606:4700:4700::1111): icmp_seq=2 ttl=60 time=1.42 ms\n\n--- one.one.one.one ping statistics ---\n2 packets transmitted, 2 received, 0% packet loss, time 1001ms\nrtt min/avg/max/mdev = 1.429/1.546/1.663/0.117 ms\n",
"time": 1.66,
"times": [
1.66,
1.42
],
"min": "1.429",
"max": "1.663",
"avg": "1.546",
"packetLoss": "0.000",
"stddev": "0.117"
},
"window_en_sample1": {

@@ -32,7 +116,87 @@ "host": "www.some-domain.com",

"time": 564,
"times": [
564,
555,
554,
548
],
"min": "548.000",
"max": "564.000",
"avg": "555.000",
"stddev": "5.723",
"packetLoss": "0.000",
"stddev": "5.723"
},
"window_fr_sample1": {
"host": "127.0.0.1",
"numeric_host": "127.0.0.1",
"alive": true,
"output": "Envoi d’une requete 'Ping' 127.0.0.1 avec 32 octets de donnees :\nReponse de 127.0.0.1 : octets=32 temps<1ms TTL=128\nReponse de 127.0.0.1 : octets=32 temps<1ms TTL=128\nReponse de 127.0.0.1 : octets=32 temps<1ms TTL=128\nReponse de 127.0.0.1 : octets=32 temps<1ms TTL=128\n\nStatistiques Ping pour 127.0.0.1:\nPaquets : envoyes = 4, recus = 4, perdus = 0 (perte 0%),\nDuree approximative des boucles en millisecondes :\nMinimum = 0ms, Maximum = 0ms, Moyenne = 0ms\n",
"time": 1,
"times": [
1,
1,
1,
1
],
"min": "0.000",
"max": "0.000",
"avg": "0.000",
"stddev": "1.000",
"packetLoss": "0.000"
},
"window_fr_sample2": {
"host": "8.8.8.8",
"numeric_host": "8.8.8.8",
"alive": true,
"output": "Envoi d’une requete 'Ping' 8.8.8.8 avec 32 octets de donnees :\nReponse de 8.8.8.8 : octets=32 temps=6 ms TTL=58\nReponse de 8.8.8.8 : octets=32 temps=6 ms TTL=58\nReponse de 8.8.8.8 : octets=32 temps=6 ms TTL=58\nReponse de 8.8.8.8 : octets=32 temps=6 ms TTL=58\n\nStatistiques Ping pour 8.8.8.8:\nPaquets : envoyes = 4, recus = 4, perdus = 0 (perte 0%),\nDuree approximative des boucles en millisecondes :\nMinimum = 6ms, Maximum = 6ms, Moyenne = 6ms\n",
"time": 6,
"times": [
6,
6,
6,
6
],
"min": "6.000",
"max": "6.000",
"avg": "6.000",
"stddev": "0.000",
"packetLoss": "0.000"
},
"window_ja_sample1": {
"host": "google.com",
"numeric_host": "216.58.197.142",
"alive": true,
"output": "google.com [216.58.197.142]に ping を送信しています 32 バイトのデータ:\n216.58.197.142 からの応答: バイト数 =32 時間 =7ms TTL=55\n216.58.197.142 からの応答: バイト数 =32 時間 =5ms TTL=55\n216.58.197.142 からの応答: バイト数 =32 時間 =4ms TTL=55\n216.58.197.142 からの応答: バイト数 =32 時間 =4ms TTL=55\n\n216.58.197.142 の ping 統計:\n パケット数: 送信 = 4、受信 = 4、損失 = 0 (0% の損失)、\nラウンド トリップの概算時間 (ミリ秒):\n 最小 = 4ms、最大 = 7ms、平均 = 5ms\n",
"time": 7,
"times": [
7,
5,
4,
4
],
"min": "4.000",
"max": "7.000",
"avg": "5.000",
"stddev": "1.225",
"packetLoss": "0.000"
},
"window_ja_sample2": {
"host": "8.8.8.8",
"numeric_host": "8.8.8.8",
"alive": true,
"output": "8.8.8.8 に ping を送信しています 32 バイトのデータ:\n8.8.8.8 からの応答: バイト数 =32 時間 =4ms TTL=58\n8.8.8.8 からの応答: バイト数 =32 時間 =4ms TTL=58\n8.8.8.8 からの応答: バイト数 =32 時間 =5ms TTL=58\n8.8.8.8 からの応答: バイト数 =32 時間 =6ms TTL=58\n\n8.8.8.8 の ping 統計:\n パケット数: 送信 = 4、受信 = 4、損失 = 0 (0% の損失)、\nラウンド トリップの概算時間 (ミリ秒):\n 最小 = 4ms、最大 = 6ms、平均 = 4ms\n",
"time": 4,
"times": [
4,
4,
5,
6
],
"min": "4.000",
"max": "6.000",
"avg": "4.000",
"stddev": "1.118",
"packetLoss": "0.000"
},
"window_zh_sample1": {

@@ -44,6 +208,13 @@ "host": "google.com",

"time": 2,
"times": [
2,
2,
3,
3
],
"min": "2.000",
"max": "3.000",
"avg": "2.000",
"stddev": "0.707"
"stddev": "0.707",
"packetLoss": "0.000"
},

@@ -56,6 +227,13 @@ "window_zh_sample2": {

"time": 2,
"times": [
2,
2,
3,
3
],
"min": "2.000",
"max": "3.000",
"avg": "2.000",
"stddev": "0.707"
"stddev": "0.707",
"packetLoss": "0.000"
},

@@ -68,7 +246,48 @@ "window_zh_sample3": {

"time": 1,
"times": [
1,
1,
1,
1
],
"min": "0.000",
"max": "0.000",
"avg": "0.000",
"stddev": "1.000"
}
}
"stddev": "1.000",
"packetLoss": "0.000"
},
"window_ru_sample1": {
"host": "8.8.8.8",
"numeric_host": "8.8.8.8",
"alive": true,
"output": "Обмен пакетами с 8.8.8.8 по с 32 байтами данных:\nОтвет от 8.8.8.8: число байт=32 время=37мс TTL=55\nОтвет от 8.8.8.8: число байт=32 время=33мс TTL=55\nОтвет от 8.8.8.8: число байт=32 время=38мс TTL=55\nОтвет от 8.8.8.8: число байт=32 время=34мс TTL=55\n\nСтатистика Ping для 8.8.8.8:\n Пакетов: отправлено = 4, получено = 4, потеряно = 0\n (0% потерь)\nПриблизительное время приема-передачи в мс:\n Минимальное = 33мсек, Максимальное = 38 мсек, Среднее = 35 мсек",
"time": 37,
"times": [
37,
33,
38,
34
],
"min": "33.000",
"max": "38.000",
"avg": "35.000",
"stddev": "2.121",
"packetLoss": "0.000"
},
"window_de_v6_sample": { "host": "google.de",
"alive": true,
"output": "Ping wird ausgeführt für google.de [2a00:1450:4001:810::2003] von 3001:4cb0:0:f282:ddf1:bec9:1e0:bfa9 mit 32 Bytes Daten:\nAntwort von 2a00:1450:4001:810::2003: Zeit=11ms\nAntwort von 2a00:1450:4001:810::2003: Zeit=11ms\nAntwort von 2a00:1450:4001:810::2003: Zeit=18ms\nAntwort von 2a00:1450:4001:810::2003: Zeit=11ms\n\nPing-Statistik für 2a00:1450:4001:810::2003:\n Pakete: Gesendet = 4, Empfangen = 4, Verloren = 0\n (0% Verlust),\nCa. Zeitangaben in Millisek.:\n Minimum = 11ms, Maximum = 18ms, Mittelwert = 12ms\n",
"time": 11,
"times": [
11,
11,
18,
11
],
"min": "11.000",
"max": "18.000",
"avg": "12.000",
"packetLoss": "0.000",
"stddev": "3.122",
"numeric_host": "2a00:1450:4001:810::2003" }
}

@@ -12,2 +12,3 @@ 'use strict';

'aix',
'android',
'linux',

@@ -59,5 +60,5 @@ ];

]);
targetDirectory = path.posix.join.apply(path.posix, targetDirectory);
targetDirectory = path.posix.join.apply(path.posix, targetDirectory);
return glob.sync(targetDirectory);
};
'use strict';
/* global describe it before after*/

@@ -20,2 +21,3 @@ /* eslint no-unused-expressions: 0 */

var ANSWER = require('./fixture/answer');
var PLATFORMS = [

@@ -26,2 +28,3 @@ 'window',

// 'aix',
'android',
'linux',

@@ -33,2 +36,3 @@ ];

freebsd: ['-c', '2'],
android: ['-c', '2'],
linux: ['-c', '2'],

@@ -123,2 +127,82 @@ };

describe('ping timeout and deadline options', function () {
describe('on linux platform', function () {
beforeEach(function () {
this.platformStub = sinon.stub(os, 'platform',
function () { return 'linux'; });
const fixturePath = path.join(__dirname, 'fixture',
'linux', 'en', 'sample1.txt');
this.spawnStub = sinon.stub(cp, 'spawn', mockOutSpawn(fixturePath));
});
afterEach(function () {
this.platformStub.restore();
this.spawnStub.restore();
});
it('are forwarded to the ping binary', function () {
return ping.promise.probe('whatever', {
timeout: 47,
deadline: 83,
}).then(function () {
const spawnArgs = this.spawnStub.getCalls()[0].args;
const pingArgs = spawnArgs[1];
expect(pingArgs[pingArgs.indexOf('-W') + 1]).to.equal('47');
expect(pingArgs[pingArgs.indexOf('-w') + 1]).to.equal('83');
}.bind(this));
});
});
describe('on windows platform', function () {
beforeEach(function () {
this.platformStub = sinon.stub(os, 'platform',
function () { return 'window'; });
const fixturePath = path.join(__dirname, 'fixture',
'window', 'en', 'sample1.txt');
this.spawnStub = sinon.stub(cp, 'spawn', mockOutSpawn(fixturePath));
});
afterEach(function () {
this.platformStub.restore();
this.spawnStub.restore();
});
it('results in an error as deadline is not supported', function () {
return ping.promise.probe('whatever', {
timeout: 47,
deadline: 83,
}).then(function () {
throw new Error('deadline should result in an error');
}).catch(function () {});
});
});
describe('on mac platform', function () {
beforeEach(function () {
this.platformStub = sinon.stub(os, 'platform',
function () { return 'freebsd'; });
const fixturePath = path.join(__dirname, 'fixture',
'macos', 'en', 'sample1.txt');
this.spawnStub = sinon.stub(cp, 'spawn', mockOutSpawn(fixturePath));
});
afterEach(function () {
this.platformStub.restore();
this.spawnStub.restore();
});
it('are forwarded to the ping binary', function () {
return ping.promise.probe('whatever', {
timeout: 47,
deadline: 83,
}).then(function () {
const spawnArgs = this.spawnStub.getCalls()[0].args;
const pingArgs = spawnArgs[1];
expect(pingArgs[pingArgs.indexOf('-W') + 1]).to.equal('47000');
expect(pingArgs[pingArgs.indexOf('-t') + 1]).to.equal('83');
}.bind(this));
});
});
});
describe('Ping in callback mode', function () {

@@ -142,8 +226,10 @@ var pingExecution = function (fp, args) {

if (args) {
ping.sys.probe('whatever', cb, args);
} else {
ping.sys.probe('whatever', cb);
var _args = args;
if (fp.includes('v6')) {
_args = _args || {};
_args.v6 = true;
}
ping.sys.probe('whatever', cb, _args);
stub.restore();

@@ -173,7 +259,8 @@

var ret = null;
if (args) {
ret = ping.promise.probe('whatever', args);
} else {
ret = ping.promise.probe('whatever');
var _args = args;
if (fp.includes('v6')) {
_args = _args || {};
_args.v6 = true;
}
ret = ping.promise.probe('whatever', _args);

@@ -194,1 +281,47 @@ stub.restore();

});
describe('Ping ipv6 on MAC OS', function () {
var platform = 'darwin';
var stubs = [];
before(function () {
stubs.push(
sinon.stub(os, 'platform', function () { return platform; })
);
});
after(function () {
stubs.forEach(function (stub) {
stub.restore();
});
});
describe('With timeout setting', function () {
var fixturePaths = loadFixturePath(platform);
fixturePaths.forEach(function (fp) {
it('Should raise an error', function (done) {
var stub = sinon.stub(
cp,
'spawn',
mockOutSpawn(fp)
);
var ret = ping.promise.probe(
'whatever',
{v6: true, timeout: 10}
);
stub.restore();
ret.then(function () {
done(new Error('It should not be success'));
}).catch(function (err) {
expect(err.message).to.be.a('string');
expect(err.message).to.include('no timeout option');
done();
});
});
});
});
});
SocketSocket SOC 2 Logo

Product

  • Package Alerts
  • Integrations
  • Docs
  • Pricing
  • FAQ
  • Roadmap
  • Changelog

Packages

npm

Stay in touch

Get open source security insights delivered straight into your inbox.


  • Terms
  • Privacy
  • Security

Made with ⚡️ by Socket Inc