130 lines
		
	
	
		
			3.6 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
		
		
			
		
	
	
			130 lines
		
	
	
		
			3.6 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| 
								 | 
							
								'use strict';
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/**
							 | 
						||
| 
								 | 
							
								 * A builder builds command line arguments for ping in mac environment
							 | 
						||
| 
								 | 
							
								 * @module lib/builder/mac
							 | 
						||
| 
								 | 
							
								 */
							 | 
						||
| 
								 | 
							
								var util = require('util');
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								var builder = {};
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/**
							 | 
						||
| 
								 | 
							
								 * Cross platform config representation
							 | 
						||
| 
								 | 
							
								 * @typedef {Object} PingConfig
							 | 
						||
| 
								 | 
							
								 * @property {boolean} numeric - Map IP address to hostname or not
							 | 
						||
| 
								 | 
							
								 * @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
							 | 
						||
| 
								 | 
							
								 */
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								var defaultConfig = {
							 | 
						||
| 
								 | 
							
								    numeric: true,
							 | 
						||
| 
								 | 
							
								    timeout: 2,
							 | 
						||
| 
								 | 
							
								    deadline: false,
							 | 
						||
| 
								 | 
							
								    min_reply: 1,
							 | 
						||
| 
								 | 
							
								    v6: false,
							 | 
						||
| 
								 | 
							
								    sourceAddr: '',
							 | 
						||
| 
								 | 
							
								    packetSize: 56,
							 | 
						||
| 
								 | 
							
								    extra: [],
							 | 
						||
| 
								 | 
							
								};
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/**
							 | 
						||
| 
								 | 
							
								 * Get the finalized array of command line arguments
							 | 
						||
| 
								 | 
							
								 * @param {string} target - hostname or ip address
							 | 
						||
| 
								 | 
							
								 * @param {PingConfig} [config] - Configuration object for cmd line argument
							 | 
						||
| 
								 | 
							
								 * @return {string[]} - Command line argument according to the configuration
							 | 
						||
| 
								 | 
							
								 * @throws If there are errors on building arguments with given inputs
							 | 
						||
| 
								 | 
							
								 */
							 | 
						||
| 
								 | 
							
								builder.getCommandArguments = function (target, config) {
							 | 
						||
| 
								 | 
							
								    var _config = config || {};
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    // Empty argument
							 | 
						||
| 
								 | 
							
								    var ret = [];
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    // Make every key in config has been setup properly
							 | 
						||
| 
								 | 
							
								    var keys = ['numeric', 'timeout', 'deadline', 'min_reply', 'v6',
							 | 
						||
| 
								 | 
							
								        'sourceAddr', 'extra', 'packetSize'];
							 | 
						||
| 
								 | 
							
								    keys.forEach(function (k) {
							 | 
						||
| 
								 | 
							
								        // Falsy value will be overridden without below checking
							 | 
						||
| 
								 | 
							
								        if (typeof(_config[k]) !== 'boolean') {
							 | 
						||
| 
								 | 
							
								            _config[k] = _config[k] || defaultConfig[k];
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								    });
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    if (_config.numeric) {
							 | 
						||
| 
								 | 
							
								        ret.push('-n');
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    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.deadline),
							 | 
						||
| 
								 | 
							
								        ]);
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    if (_config.min_reply) {
							 | 
						||
| 
								 | 
							
								        ret = ret.concat([
							 | 
						||
| 
								 | 
							
								            '-c',
							 | 
						||
| 
								 | 
							
								            util.format('%d', _config.min_reply),
							 | 
						||
| 
								 | 
							
								        ]);
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    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) {
							 | 
						||
| 
								 | 
							
								        ret = ret.concat(_config.extra);
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    ret.push(target);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    return ret;
							 | 
						||
| 
								 | 
							
								};
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/**
							 | 
						||
| 
								 | 
							
								 * Compute an option object for child_process.spawn
							 | 
						||
| 
								 | 
							
								 * @return {object} - Refer to document of child_process.spawn
							 | 
						||
| 
								 | 
							
								 */
							 | 
						||
| 
								 | 
							
								builder.getSpawnOptions = function () {
							 | 
						||
| 
								 | 
							
								    return {};
							 | 
						||
| 
								 | 
							
								};
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								module.exports = builder;
							 |