1 | 'use strict';
|
2 |
|
3 |
|
4 |
|
5 |
|
6 |
|
7 |
|
8 |
|
9 |
|
10 |
|
11 |
|
12 |
|
13 |
|
14 |
|
15 |
|
16 | const exec = require('child_process').exec;
|
17 | const util = require('./util');
|
18 |
|
19 | let _platform = process.platform;
|
20 |
|
21 | const _linux = (_platform === 'linux');
|
22 | const _darwin = (_platform === 'darwin');
|
23 | const _windows = (_platform === 'win32');
|
24 | const _freebsd = (_platform === 'freebsd');
|
25 | const _openbsd = (_platform === 'openbsd');
|
26 | const _netbsd = (_platform === 'netbsd');
|
27 | const _sunos = (_platform === 'sunos');
|
28 |
|
29 |
|
30 |
|
31 |
|
32 | function inetChecksite(url, callback) {
|
33 |
|
34 | return new Promise((resolve) => {
|
35 | process.nextTick(() => {
|
36 |
|
37 | let urlSanitized = util.sanitizeShellString(url).toLowerCase();
|
38 | urlSanitized = urlSanitized.replace(/ /g, '');
|
39 | urlSanitized = urlSanitized.replace(/\$/g, '');
|
40 | urlSanitized = urlSanitized.replace(/\(/g, '');
|
41 | urlSanitized = urlSanitized.replace(/\)/g, '');
|
42 | urlSanitized = urlSanitized.replace(/{/g, '');
|
43 | urlSanitized = urlSanitized.replace(/}/g, '');
|
44 | let result = {
|
45 | url: urlSanitized,
|
46 | ok: false,
|
47 | status: 404,
|
48 | ms: -1
|
49 | };
|
50 | if (urlSanitized) {
|
51 | let t = Date.now();
|
52 | if (_linux || _freebsd || _openbsd || _netbsd || _darwin || _sunos) {
|
53 | let args = ' -I --connect-timeout 5 -m 5 ' + urlSanitized + ' 2>/dev/null | head -n 1 | cut -d " " -f2';
|
54 | let cmd = 'curl';
|
55 | exec(cmd + args, function (error, stdout) {
|
56 | let statusCode = parseInt(stdout.toString());
|
57 | result.status = statusCode || 404;
|
58 | result.ok = !error && (statusCode === 200 || statusCode === 301 || statusCode === 302 || statusCode === 304);
|
59 | result.ms = (result.ok ? Date.now() - t : -1);
|
60 | if (callback) { callback(result); }
|
61 | resolve(result);
|
62 | });
|
63 | }
|
64 | if (_windows) {
|
65 | const http = (urlSanitized.startsWith('https:') ? require('https') : require('http'));
|
66 | try {
|
67 | http.get(urlSanitized, (res) => {
|
68 | const statusCode = res.statusCode;
|
69 |
|
70 | result.status = statusCode || 404;
|
71 | result.ok = (statusCode === 200 || statusCode === 301 || statusCode === 302 || statusCode === 304);
|
72 |
|
73 | if (statusCode !== 200) {
|
74 | res.resume();
|
75 | result.ms = (result.ok ? Date.now() - t : -1);
|
76 | if (callback) { callback(result); }
|
77 | resolve(result);
|
78 | } else {
|
79 | res.on('data', () => { });
|
80 | res.on('end', () => {
|
81 | result.ms = (result.ok ? Date.now() - t : -1);
|
82 | if (callback) { callback(result); }
|
83 | resolve(result);
|
84 | });
|
85 | }
|
86 | }).on('error', () => {
|
87 | if (callback) { callback(result); }
|
88 | resolve(result);
|
89 | });
|
90 | } catch (err) {
|
91 | if (callback) { callback(result); }
|
92 | resolve(result);
|
93 | }
|
94 | }
|
95 | } else {
|
96 | if (callback) { callback(result); }
|
97 | resolve(result);
|
98 | }
|
99 | });
|
100 | });
|
101 | }
|
102 |
|
103 | exports.inetChecksite = inetChecksite;
|
104 |
|
105 |
|
106 |
|
107 |
|
108 | function inetLatency(host, callback) {
|
109 |
|
110 |
|
111 | if (util.isFunction(host) && !callback) {
|
112 | callback = host;
|
113 | host = '';
|
114 | }
|
115 |
|
116 | host = host || '8.8.8.8';
|
117 | const hostSanitized = util.sanitizeShellString(host);
|
118 |
|
119 | return new Promise((resolve) => {
|
120 | process.nextTick(() => {
|
121 | let cmd;
|
122 | if (_linux || _freebsd || _openbsd || _netbsd || _darwin) {
|
123 | if (_linux) {
|
124 | cmd = 'ping -c 2 -w 3 ' + hostSanitized + ' | grep rtt';
|
125 | }
|
126 | if (_freebsd || _openbsd || _netbsd) {
|
127 | cmd = 'ping -c 2 -t 3 ' + hostSanitized + ' | grep round-trip';
|
128 | }
|
129 | if (_darwin) {
|
130 | cmd = 'ping -c 2 -t 3 ' + hostSanitized + ' | grep avg';
|
131 | }
|
132 |
|
133 | exec(cmd, function (error, stdout) {
|
134 | let result = -1;
|
135 | if (!error) {
|
136 | const line = stdout.toString().split('=');
|
137 | if (line.length > 1) {
|
138 | const parts = line[1].split('/');
|
139 | if (parts.length > 1) {
|
140 | result = parseFloat(parts[1]);
|
141 | }
|
142 | }
|
143 | }
|
144 | if (callback) { callback(result); }
|
145 | resolve(result);
|
146 | });
|
147 | }
|
148 | if (_sunos) {
|
149 | exec('ping -s -a ' + hostSanitized + ' 56 2 | grep avg', { timeout: 3000 }, function (error, stdout) {
|
150 | let result = -1;
|
151 | if (!error) {
|
152 | const line = stdout.toString().split('=');
|
153 | if (line.length > 1) {
|
154 | const parts = line[1].split('/');
|
155 | if (parts.length > 1) {
|
156 | result = parseFloat(parts[1].replace(',', '.'));
|
157 | }
|
158 | }
|
159 | }
|
160 | if (callback) { callback(result); }
|
161 | resolve(result);
|
162 | });
|
163 | }
|
164 | if (_windows) {
|
165 | let result = -1;
|
166 | try {
|
167 | exec('ping ' + hostSanitized + ' -n 1', util.execOptsWin, function (error, stdout) {
|
168 | if (!error) {
|
169 | let lines = stdout.toString().split('\r\n');
|
170 | lines.shift();
|
171 | lines.forEach(function (line) {
|
172 | if ((line.toLowerCase().match(/ms/g) || []).length === 3) {
|
173 | let l = line.replace(/ +/g, ' ').split(' ');
|
174 | if (l.length > 6) {
|
175 | result = parseFloat(l[l.length - 1]);
|
176 | }
|
177 | }
|
178 | });
|
179 | }
|
180 | if (callback) { callback(result); }
|
181 | resolve(result);
|
182 | });
|
183 | } catch (e) {
|
184 | if (callback) { callback(result); }
|
185 | resolve(result);
|
186 | }
|
187 | }
|
188 | });
|
189 | });
|
190 | }
|
191 |
|
192 | exports.inetLatency = inetLatency;
|