UNPKG

6.51 kBJavaScriptView Raw
1'use strict';
2// @ts-check
3// ==================================================================================
4// internet.js
5// ----------------------------------------------------------------------------------
6// Description: System Information - library
7// for Node.js
8// Copyright: (c) 2014 - 2020
9// Author: Sebastian Hildebrandt
10// ----------------------------------------------------------------------------------
11// License: MIT
12// ==================================================================================
13// 12. Internet
14// ----------------------------------------------------------------------------------
15
16const exec = require('child_process').exec;
17const util = require('./util');
18
19let _platform = process.platform;
20
21const _linux = (_platform === 'linux');
22const _darwin = (_platform === 'darwin');
23const _windows = (_platform === 'win32');
24const _freebsd = (_platform === 'freebsd');
25const _openbsd = (_platform === 'openbsd');
26const _netbsd = (_platform === 'netbsd');
27const _sunos = (_platform === 'sunos');
28
29// --------------------------
30// check if external site is available
31
32function 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) { // if this is stable, this can be used for all OS types
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
103exports.inetChecksite = inetChecksite;
104
105// --------------------------
106// check inet latency
107
108function inetLatency(host, callback) {
109
110 // fallback - if only callback is given
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
192exports.inetLatency = inetLatency;