106 lines
2.9 KiB
JavaScript
106 lines
2.9 KiB
JavaScript
'use strict';
|
|
|
|
/**
|
|
* LICENSE MIT
|
|
* (C) Daniel Zelisko
|
|
* http://github.com/danielzzz/node-ping
|
|
*
|
|
* a simple wrapper for ping
|
|
* Now with support of not only english Windows.
|
|
*
|
|
*/
|
|
|
|
// System library
|
|
var util = require('util');
|
|
var net = require('net');
|
|
var cp = require('child_process');
|
|
var os = require('os');
|
|
|
|
// Our library
|
|
var builderFactory = require('./builder/factory');
|
|
var parserFactory = require('./parser/factory');
|
|
|
|
/**
|
|
* Refer to probe()
|
|
*/
|
|
function _probe(addr, config) {
|
|
// Do not reassign function argument
|
|
var _config = config || {};
|
|
if (_config.v6 === undefined) {
|
|
_config.v6 = net.isIPv6(addr);
|
|
}
|
|
|
|
// Convert callback base system command to promise base
|
|
return new Promise(function (resolve, reject) {
|
|
// Spawn a ping process
|
|
var ping = null;
|
|
var platform = os.platform();
|
|
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) {
|
|
reject(err);
|
|
return;
|
|
}
|
|
|
|
// Initial parser
|
|
var parser = parserFactory.createParser(addr, platform, _config);
|
|
|
|
// Register events from system ping
|
|
ping.once('error', function () {
|
|
var err = new Error(
|
|
util.format(
|
|
'ping.probe: %s. %s',
|
|
'there was an error while executing the ping program. ',
|
|
'Check the path or permissions...'
|
|
)
|
|
);
|
|
reject(err);
|
|
});
|
|
|
|
// Cache all lines from the system ping
|
|
var outstring = [];
|
|
ping.stdout.on('data', function (data) {
|
|
outstring.push(String(data));
|
|
});
|
|
ping.stderr.on('data', function (data) {
|
|
outstring.push(String(data));
|
|
});
|
|
|
|
// Parse lines we have on closing system ping
|
|
ping.once('close', function () {
|
|
// Merge lines we have and split it by \n
|
|
var lines = outstring.join('').split('\n');
|
|
|
|
// Parse line one by one
|
|
lines.forEach(parser.eat, parser);
|
|
|
|
// Get result
|
|
var ret = parser.getResult();
|
|
|
|
resolve(ret);
|
|
});
|
|
});
|
|
}
|
|
|
|
/**
|
|
* Class::PromisePing
|
|
* @param {string} addr - Hostname or ip addres
|
|
* @param {PingConfig} config - Configuration for command ping
|
|
* @return {Promise}
|
|
*/
|
|
function probe(addr, config) {
|
|
try {
|
|
var probePromise = _probe(addr, config);
|
|
return probePromise;
|
|
} catch (error) {
|
|
var errorPromise = Promise.reject(error);
|
|
return errorPromise;
|
|
}
|
|
}
|
|
|
|
exports.probe = probe;
|