Files
Down-Detector/node_modules/ping/lib/ping-promise.js
2018-05-27 16:11:50 +01:00

88 lines
2.1 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 cp = require('child_process');
var os = require('os');
// 3rd-party library
var Q = require('q');
var __ = require('underscore');
// Our library
var builderFactory = require('./builder/factory');
var parserFactory = require('./parser/factory');
/**
* Class::PromisePing
*
* @param {string} addr - Hostname or ip addres
* @param {PingConfig} config - Configuration for command ping
* @return {Promise}
*/
function probe(addr, config) {
// Do not reassign function argument
var _config = config || {};
// Convert callback base system command to promise base
var deferred = Q.defer();
// Spawn a ping process
var ping = null;
var platform = os.platform();
var argumentBuilder = builderFactory.createBuilder(platform);
ping = cp.spawn(
builderFactory.getExecutablePath(platform),
argumentBuilder.getResult(addr, _config)
);
// Initial parser
var parser = parserFactory.createParser(platform);
// 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...'
)
);
deferred.reject(err);
});
// Cache all lines from the system ping
var outstring = [];
ping.stdout.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
__.each(lines, parser.eat, parser);
// Get result
var ret = parser.getResult();
deferred.resolve(ret);
});
return deferred.promise;
}
exports.probe = probe;