aboutsummaryrefslogtreecommitdiff
path: root/node_modules/systeminformation/lib/internet.js
diff options
context:
space:
mode:
Diffstat (limited to 'node_modules/systeminformation/lib/internet.js')
-rw-r--r--node_modules/systeminformation/lib/internet.js240
1 files changed, 240 insertions, 0 deletions
diff --git a/node_modules/systeminformation/lib/internet.js b/node_modules/systeminformation/lib/internet.js
new file mode 100644
index 0000000..71f0878
--- /dev/null
+++ b/node_modules/systeminformation/lib/internet.js
@@ -0,0 +1,240 @@
+'use strict';
+// @ts-check
+// ==================================================================================
+// internet.js
+// ----------------------------------------------------------------------------------
+// Description: System Information - library
+// for Node.js
+// Copyright: (c) 2014 - 2022
+// Author: Sebastian Hildebrandt
+// ----------------------------------------------------------------------------------
+// License: MIT
+// ==================================================================================
+// 12. Internet
+// ----------------------------------------------------------------------------------
+
+// const exec = require('child_process').exec;
+const util = require('./util');
+
+let _platform = process.platform;
+
+const _linux = (_platform === 'linux' || _platform === 'android');
+const _darwin = (_platform === 'darwin');
+const _windows = (_platform === 'win32');
+const _freebsd = (_platform === 'freebsd');
+const _openbsd = (_platform === 'openbsd');
+const _netbsd = (_platform === 'netbsd');
+const _sunos = (_platform === 'sunos');
+
+// --------------------------
+// check if external site is available
+
+function inetChecksite(url, callback) {
+
+ return new Promise((resolve) => {
+ process.nextTick(() => {
+ let result = {
+ url: url,
+ ok: false,
+ status: 404,
+ ms: null
+ };
+ if (typeof url !== 'string') {
+ if (callback) { callback(result); }
+ return resolve(result);
+ }
+ let urlSanitized = '';
+ const s = util.sanitizeShellString(url, true);
+ for (let i = 0; i <= util.mathMin(s.length, 2000); i++) {
+ if (!(s[i] === undefined)) {
+ s[i].__proto__.toLowerCase = util.stringToLower;
+ const sl = s[i].toLowerCase();
+ if (sl && sl[0] && !sl[1] && sl[0].length === 1) {
+ urlSanitized = urlSanitized + sl[0];
+ }
+ }
+ }
+ result.url = urlSanitized;
+ try {
+ if (urlSanitized && !util.isPrototypePolluted()) {
+ urlSanitized.__proto__.startsWith = util.stringStartWith;
+ if (urlSanitized.startsWith('file:') || urlSanitized.startsWith('gopher:') || urlSanitized.startsWith('telnet:') || urlSanitized.startsWith('mailto:') || urlSanitized.startsWith('news:') || urlSanitized.startsWith('nntp:')) {
+ if (callback) { callback(result); }
+ return resolve(result);
+ }
+ let t = Date.now();
+ if (_linux || _freebsd || _openbsd || _netbsd || _darwin || _sunos) {
+ let args = ['-I', '--connect-timeout', '5', '-m', '5'];
+ args.push(urlSanitized);
+ let cmd = 'curl';
+ util.execSafe(cmd, args).then((stdout) => {
+ const lines = stdout.split('\n');
+ let statusCode = lines[0] && lines[0].indexOf(' ') >= 0 ? parseInt(lines[0].split(' ')[1], 10) : 404;
+ result.status = statusCode || 404;
+ result.ok = (statusCode === 200 || statusCode === 301 || statusCode === 302 || statusCode === 304);
+ result.ms = (result.ok ? Date.now() - t : null);
+ if (callback) { callback(result); }
+ resolve(result);
+ });
+ }
+ if (_windows) { // if this is stable, this can be used for all OS types
+ const http = (urlSanitized.startsWith('https:') ? require('https') : require('http'));
+ try {
+ http.get(urlSanitized, (res) => {
+ const statusCode = res.statusCode;
+
+ result.status = statusCode || 404;
+ result.ok = (statusCode === 200 || statusCode === 301 || statusCode === 302 || statusCode === 304);
+
+ if (statusCode !== 200) {
+ res.resume();
+ result.ms = (result.ok ? Date.now() - t : null);
+ if (callback) { callback(result); }
+ resolve(result);
+ } else {
+ res.on('data', () => { });
+ res.on('end', () => {
+ result.ms = (result.ok ? Date.now() - t : null);
+ if (callback) { callback(result); }
+ resolve(result);
+ });
+ }
+ }).on('error', () => {
+ if (callback) { callback(result); }
+ resolve(result);
+ });
+ } catch (err) {
+ if (callback) { callback(result); }
+ resolve(result);
+ }
+ }
+ } else {
+ if (callback) { callback(result); }
+ resolve(result);
+ }
+ } catch (err) {
+ if (callback) { callback(result); }
+ resolve(result);
+ }
+ });
+ });
+}
+
+exports.inetChecksite = inetChecksite;
+
+// --------------------------
+// check inet latency
+
+function inetLatency(host, callback) {
+
+ // fallback - if only callback is given
+ if (util.isFunction(host) && !callback) {
+ callback = host;
+ host = '';
+ }
+
+ host = host || '8.8.8.8';
+
+ return new Promise((resolve) => {
+ process.nextTick(() => {
+ if (typeof host !== 'string') {
+ if (callback) { callback(null); }
+ return resolve(null);
+ }
+ let hostSanitized = '';
+ const s = (util.isPrototypePolluted() ? '8.8.8.8' : util.sanitizeShellString(host, true)).trim();
+ for (let i = 0; i <= util.mathMin(s.length, 2000); i++) {
+ if (!(s[i] === undefined)) {
+ s[i].__proto__.toLowerCase = util.stringToLower;
+ const sl = s[i].toLowerCase();
+ if (sl && sl[0] && !sl[1]) {
+ hostSanitized = hostSanitized + sl[0];
+ }
+ }
+ }
+ hostSanitized.__proto__.startsWith = util.stringStartWith;
+ if (hostSanitized.startsWith('file:') || hostSanitized.startsWith('gopher:') || hostSanitized.startsWith('telnet:') || hostSanitized.startsWith('mailto:') || hostSanitized.startsWith('news:') || hostSanitized.startsWith('nntp:')) {
+ if (callback) { callback(null); }
+ return resolve(null);
+ }
+ let params;
+ let filt;
+ if (_linux || _freebsd || _openbsd || _netbsd || _darwin) {
+ if (_linux) {
+ params = ['-c', '2', '-w', '3', hostSanitized];
+ filt = 'rtt';
+ }
+ if (_freebsd || _openbsd || _netbsd) {
+ params = ['-c', '2', '-t', '3', hostSanitized];
+ filt = 'round-trip';
+ }
+ if (_darwin) {
+ params = ['-c2', '-t3', hostSanitized];
+ filt = 'avg';
+ }
+ util.execSafe('ping', params).then((stdout) => {
+ let result = null;
+ if (stdout) {
+ const lines = stdout.split('\n').filter(line => line.indexOf(filt) >= 0).join('\n');
+
+ const line = lines.split('=');
+ if (line.length > 1) {
+ const parts = line[1].split('/');
+ if (parts.length > 1) {
+ result = parseFloat(parts[1]);
+ }
+ }
+ }
+ if (callback) { callback(result); }
+ resolve(result);
+ });
+ }
+ if (_sunos) {
+ const params = ['-s', '-a', hostSanitized, '56', '2'];
+ const filt = 'avg';
+ util.execSafe('ping', params, { timeout: 3000 }).then((stdout) => {
+ let result = null;
+ if (stdout) {
+ const lines = stdout.split('\n').filter(line => line.indexOf(filt) >= 0).join('\n');
+ const line = lines.split('=');
+ if (line.length > 1) {
+ const parts = line[1].split('/');
+ if (parts.length > 1) {
+ result = parseFloat(parts[1].replace(',', '.'));
+ }
+ }
+ }
+ if (callback) { callback(result); }
+ resolve(result);
+ });
+ }
+ if (_windows) {
+ let result = null;
+ try {
+ const params = [hostSanitized, '-n', '1'];
+ util.execSafe('ping', params, util.execOptsWin).then((stdout) => {
+ if (stdout) {
+ let lines = stdout.split('\r\n');
+ lines.shift();
+ lines.forEach(function (line) {
+ if ((line.toLowerCase().match(/ms/g) || []).length === 3) {
+ let l = line.replace(/ +/g, ' ').split(' ');
+ if (l.length > 6) {
+ result = parseFloat(l[l.length - 1]);
+ }
+ }
+ });
+ }
+ if (callback) { callback(result); }
+ resolve(result);
+ });
+ } catch (e) {
+ if (callback) { callback(result); }
+ resolve(result);
+ }
+ }
+ });
+ });
+}
+
+exports.inetLatency = inetLatency;