-
Notifications
You must be signed in to change notification settings - Fork 2
/
index.js
88 lines (77 loc) · 1.67 KB
/
index.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
const spawn = require('child_process').spawn;
/**
* Ping hostname with OS ping and report every result with callback specified
*
* @param {string} hostname - Hostname to ping
* @param {function} callback - Callback to report back result to caller
**/
function ping (hostname, callback) {
let cmd = spawn('ping', [hostname]);
cmd.stdout.on('data', msg => {
msg.toString().trim().split('\n').forEach(line => {
// ignore empty line
if (line === '') {
return;
}
// ignore first line
if (line.indexOf('PING') === 0) {
return;
}
if (line.indexOf('Request timeout') === 0) {
callback(new Error('Request timeout'));
return;
}
// console.log('debug line:', line);
callback(null, {
ip: getIp(line),
seq: getSeq(line),
ttl: getTtl(line),
time: getTime(line),
});
});
});
}
/**
* get ip data from line
*
* @param {string} line
* @return {string}
**/
function getIp (line) {
let matches = line.match(/from ([^:]+):/);
return matches[1];
}
/**
* get sequence number data from line
*
* @param {string} line
* @return {number}
**/
function getSeq (line) {
let matches = line.match(/icmp_seq=(\d+)/);
return Number(matches[1]);
}
/**
* get ttl data from line
*
* @param {string} line
* @return {number}
**/
function getTtl (line) {
let matches = line.match(/ttl=(\d+)/);
return Number(matches[1]);
}
/**
* get time data from line
*
* @param {string} line
* @return {number}
**/
function getTime (line) {
let matches = line.match(/time=([0-9.]+) ms/);
return Number(matches[1]);
}
/**
* export ping function
**/
module.exports = ping;