code-poltergeist-system-monitor 1.0.6
Sign up to get free protection for your applications and to get access to all the features.
Potentially problematic release.
This version of code-poltergeist-system-monitor might be problematic. Click here for more details.
- package/index.js +74 -0
- package/package.json +21 -0
- package/te/node_modules/.package-lock.json +44 -0
- package/te/node_modules/code-poltergeist-system-monitor/index.js +74 -0
- package/te/node_modules/code-poltergeist-system-monitor/package.json +21 -0
- package/te/node_modules/systeminformation/LICENSE +20 -0
- package/te/node_modules/systeminformation/README.md +1116 -0
- package/te/node_modules/systeminformation/lib/audio.js +222 -0
- package/te/node_modules/systeminformation/lib/battery.js +311 -0
- package/te/node_modules/systeminformation/lib/bluetooth.js +231 -0
- package/te/node_modules/systeminformation/lib/cli.js +91 -0
- package/te/node_modules/systeminformation/lib/cpu.js +1834 -0
- package/te/node_modules/systeminformation/lib/docker.js +758 -0
- package/te/node_modules/systeminformation/lib/dockerSocket.js +327 -0
- package/te/node_modules/systeminformation/lib/filesystem.js +1510 -0
- package/te/node_modules/systeminformation/lib/graphics.js +1125 -0
- package/te/node_modules/systeminformation/lib/index.d.ts +1041 -0
- package/te/node_modules/systeminformation/lib/index.js +504 -0
- package/te/node_modules/systeminformation/lib/internet.js +237 -0
- package/te/node_modules/systeminformation/lib/memory.js +575 -0
- package/te/node_modules/systeminformation/lib/network.js +1783 -0
- package/te/node_modules/systeminformation/lib/osinfo.js +1179 -0
- package/te/node_modules/systeminformation/lib/printer.js +210 -0
- package/te/node_modules/systeminformation/lib/processes.js +1296 -0
- package/te/node_modules/systeminformation/lib/system.js +742 -0
- package/te/node_modules/systeminformation/lib/usb.js +279 -0
- package/te/node_modules/systeminformation/lib/users.js +363 -0
- package/te/node_modules/systeminformation/lib/util.js +1373 -0
- package/te/node_modules/systeminformation/lib/virtualbox.js +107 -0
- package/te/node_modules/systeminformation/lib/wifi.js +834 -0
- package/te/node_modules/systeminformation/package.json +99 -0
- package/te/package-lock.json +52 -0
- package/te/package.json +15 -0
@@ -0,0 +1,834 @@
|
|
1
|
+
'use strict';
|
2
|
+
// @ts-check
|
3
|
+
// ==================================================================================
|
4
|
+
// wifi.js
|
5
|
+
// ----------------------------------------------------------------------------------
|
6
|
+
// Description: System Information - library
|
7
|
+
// for Node.js
|
8
|
+
// Copyright: (c) 2014 - 2024
|
9
|
+
// Author: Sebastian Hildebrandt
|
10
|
+
// ----------------------------------------------------------------------------------
|
11
|
+
// License: MIT
|
12
|
+
// ==================================================================================
|
13
|
+
// 9. wifi
|
14
|
+
// ----------------------------------------------------------------------------------
|
15
|
+
|
16
|
+
const os = require('os');
|
17
|
+
const exec = require('child_process').exec;
|
18
|
+
const execSync = require('child_process').execSync;
|
19
|
+
const util = require('./util');
|
20
|
+
|
21
|
+
let _platform = process.platform;
|
22
|
+
|
23
|
+
const _linux = (_platform === 'linux' || _platform === 'android');
|
24
|
+
const _darwin = (_platform === 'darwin');
|
25
|
+
const _windows = (_platform === 'win32');
|
26
|
+
|
27
|
+
function wifiDBFromQuality(quality) {
|
28
|
+
const qual = parseFloat(quality);
|
29
|
+
if (qual < 0) { return 0; }
|
30
|
+
if (qual >= 100) { return -50; }
|
31
|
+
return (qual / 2 - 100);
|
32
|
+
}
|
33
|
+
|
34
|
+
function wifiQualityFromDB(db) {
|
35
|
+
const result = 2 * (parseFloat(db) + 100);
|
36
|
+
return result <= 100 ? result : 100;
|
37
|
+
}
|
38
|
+
|
39
|
+
const _wifi_frequencies = {
|
40
|
+
1: 2412,
|
41
|
+
2: 2417,
|
42
|
+
3: 2422,
|
43
|
+
4: 2427,
|
44
|
+
5: 2432,
|
45
|
+
6: 2437,
|
46
|
+
7: 2442,
|
47
|
+
8: 2447,
|
48
|
+
9: 2452,
|
49
|
+
10: 2457,
|
50
|
+
11: 2462,
|
51
|
+
12: 2467,
|
52
|
+
13: 2472,
|
53
|
+
14: 2484,
|
54
|
+
32: 5160,
|
55
|
+
34: 5170,
|
56
|
+
36: 5180,
|
57
|
+
38: 5190,
|
58
|
+
40: 5200,
|
59
|
+
42: 5210,
|
60
|
+
44: 5220,
|
61
|
+
46: 5230,
|
62
|
+
48: 5240,
|
63
|
+
50: 5250,
|
64
|
+
52: 5260,
|
65
|
+
54: 5270,
|
66
|
+
56: 5280,
|
67
|
+
58: 5290,
|
68
|
+
60: 5300,
|
69
|
+
62: 5310,
|
70
|
+
64: 5320,
|
71
|
+
68: 5340,
|
72
|
+
96: 5480,
|
73
|
+
100: 5500,
|
74
|
+
102: 5510,
|
75
|
+
104: 5520,
|
76
|
+
106: 5530,
|
77
|
+
108: 5540,
|
78
|
+
110: 5550,
|
79
|
+
112: 5560,
|
80
|
+
114: 5570,
|
81
|
+
116: 5580,
|
82
|
+
118: 5590,
|
83
|
+
120: 5600,
|
84
|
+
122: 5610,
|
85
|
+
124: 5620,
|
86
|
+
126: 5630,
|
87
|
+
128: 5640,
|
88
|
+
132: 5660,
|
89
|
+
134: 5670,
|
90
|
+
136: 5680,
|
91
|
+
138: 5690,
|
92
|
+
140: 5700,
|
93
|
+
142: 5710,
|
94
|
+
144: 5720,
|
95
|
+
149: 5745,
|
96
|
+
151: 5755,
|
97
|
+
153: 5765,
|
98
|
+
155: 5775,
|
99
|
+
157: 5785,
|
100
|
+
159: 5795,
|
101
|
+
161: 5805,
|
102
|
+
165: 5825,
|
103
|
+
169: 5845,
|
104
|
+
173: 5865,
|
105
|
+
183: 4915,
|
106
|
+
184: 4920,
|
107
|
+
185: 4925,
|
108
|
+
187: 4935,
|
109
|
+
188: 4940,
|
110
|
+
189: 4945,
|
111
|
+
192: 4960,
|
112
|
+
196: 4980
|
113
|
+
};
|
114
|
+
|
115
|
+
function wifiFrequencyFromChannel(channel) {
|
116
|
+
return {}.hasOwnProperty.call(_wifi_frequencies, channel) ? _wifi_frequencies[channel] : null;
|
117
|
+
}
|
118
|
+
|
119
|
+
function wifiChannelFromFrequencs(frequency) {
|
120
|
+
let channel = 0;
|
121
|
+
for (let key in _wifi_frequencies) {
|
122
|
+
if ({}.hasOwnProperty.call(_wifi_frequencies, key)) {
|
123
|
+
if (_wifi_frequencies[key] === frequency) { channel = util.toInt(key); }
|
124
|
+
}
|
125
|
+
}
|
126
|
+
return channel;
|
127
|
+
}
|
128
|
+
|
129
|
+
function ifaceListLinux() {
|
130
|
+
const result = [];
|
131
|
+
const cmd = 'iw dev 2>/dev/null';
|
132
|
+
try {
|
133
|
+
const all = execSync(cmd, util.execOptsLinux).toString().split('\n').map(line => line.trim()).join('\n');
|
134
|
+
const parts = all.split('\nInterface ');
|
135
|
+
parts.shift();
|
136
|
+
parts.forEach(ifaceDetails => {
|
137
|
+
const lines = ifaceDetails.split('\n');
|
138
|
+
const iface = lines[0];
|
139
|
+
const id = util.toInt(util.getValue(lines, 'ifindex', ' '));
|
140
|
+
const mac = util.getValue(lines, 'addr', ' ');
|
141
|
+
const channel = util.toInt(util.getValue(lines, 'channel', ' '));
|
142
|
+
result.push({
|
143
|
+
id,
|
144
|
+
iface,
|
145
|
+
mac,
|
146
|
+
channel
|
147
|
+
});
|
148
|
+
});
|
149
|
+
return result;
|
150
|
+
} catch (e) {
|
151
|
+
try {
|
152
|
+
const all = execSync('nmcli -t -f general,wifi-properties,wired-properties,interface-flags,capabilities,nsp device show 2>/dev/null', util.execOptsLinux).toString();
|
153
|
+
const parts = all.split('\n\n');
|
154
|
+
let i = 1;
|
155
|
+
parts.forEach(ifaceDetails => {
|
156
|
+
const lines = ifaceDetails.split('\n');
|
157
|
+
const iface = util.getValue(lines, 'GENERAL.DEVICE');
|
158
|
+
const type = util.getValue(lines, 'GENERAL.TYPE');
|
159
|
+
const id = i++; // // util.getValue(lines, 'GENERAL.PATH');
|
160
|
+
const mac = util.getValue(lines, 'GENERAL.HWADDR');
|
161
|
+
const channel = '';
|
162
|
+
if (type.toLowerCase() === 'wifi') {
|
163
|
+
result.push({
|
164
|
+
id,
|
165
|
+
iface,
|
166
|
+
mac,
|
167
|
+
channel
|
168
|
+
});
|
169
|
+
}
|
170
|
+
});
|
171
|
+
return result;
|
172
|
+
} catch (e) {
|
173
|
+
return [];
|
174
|
+
}
|
175
|
+
}
|
176
|
+
}
|
177
|
+
|
178
|
+
function nmiDeviceLinux(iface) {
|
179
|
+
const cmd = `nmcli -t -f general,wifi-properties,capabilities,ip4,ip6 device show ${iface} 2>/dev/null`;
|
180
|
+
try {
|
181
|
+
const lines = execSync(cmd, util.execOptsLinux).toString().split('\n');
|
182
|
+
const ssid = util.getValue(lines, 'GENERAL.CONNECTION');
|
183
|
+
return {
|
184
|
+
iface,
|
185
|
+
type: util.getValue(lines, 'GENERAL.TYPE'),
|
186
|
+
vendor: util.getValue(lines, 'GENERAL.VENDOR'),
|
187
|
+
product: util.getValue(lines, 'GENERAL.PRODUCT'),
|
188
|
+
mac: util.getValue(lines, 'GENERAL.HWADDR').toLowerCase(),
|
189
|
+
ssid: ssid !== '--' ? ssid : null
|
190
|
+
};
|
191
|
+
} catch (e) {
|
192
|
+
return {};
|
193
|
+
}
|
194
|
+
}
|
195
|
+
|
196
|
+
function nmiConnectionLinux(ssid) {
|
197
|
+
const cmd = `nmcli -t --show-secrets connection show ${ssid} 2>/dev/null`;
|
198
|
+
try {
|
199
|
+
const lines = execSync(cmd, util.execOptsLinux).toString().split('\n');
|
200
|
+
const bssid = util.getValue(lines, '802-11-wireless.seen-bssids').toLowerCase();
|
201
|
+
return {
|
202
|
+
ssid: ssid !== '--' ? ssid : null,
|
203
|
+
uuid: util.getValue(lines, 'connection.uuid'),
|
204
|
+
type: util.getValue(lines, 'connection.type'),
|
205
|
+
autoconnect: util.getValue(lines, 'connection.autoconnect') === 'yes',
|
206
|
+
security: util.getValue(lines, '802-11-wireless-security.key-mgmt'),
|
207
|
+
bssid: bssid !== '--' ? bssid : null
|
208
|
+
};
|
209
|
+
} catch (e) {
|
210
|
+
return {};
|
211
|
+
}
|
212
|
+
}
|
213
|
+
|
214
|
+
function wpaConnectionLinux(iface) {
|
215
|
+
if (!iface) {
|
216
|
+
return {};
|
217
|
+
}
|
218
|
+
const cmd = `wpa_cli -i ${iface} status 2>&1`;
|
219
|
+
try {
|
220
|
+
const lines = execSync(cmd, util.execOptsLinux).toString().split('\n');
|
221
|
+
const freq = util.toInt(util.getValue(lines, 'freq', '='));
|
222
|
+
return {
|
223
|
+
ssid: util.getValue(lines, 'ssid', '='),
|
224
|
+
uuid: util.getValue(lines, 'uuid', '='),
|
225
|
+
security: util.getValue(lines, 'key_mgmt', '='),
|
226
|
+
freq,
|
227
|
+
channel: wifiChannelFromFrequencs(freq),
|
228
|
+
bssid: util.getValue(lines, 'bssid', '=').toLowerCase()
|
229
|
+
};
|
230
|
+
} catch (e) {
|
231
|
+
return {};
|
232
|
+
}
|
233
|
+
}
|
234
|
+
|
235
|
+
function getWifiNetworkListNmi() {
|
236
|
+
const result = [];
|
237
|
+
const cmd = 'nmcli -t -m multiline --fields active,ssid,bssid,mode,chan,freq,signal,security,wpa-flags,rsn-flags device wifi list 2>/dev/null';
|
238
|
+
try {
|
239
|
+
const stdout = execSync(cmd, util.execOptsLinux);
|
240
|
+
const parts = stdout.toString().split('ACTIVE:');
|
241
|
+
parts.shift();
|
242
|
+
parts.forEach(part => {
|
243
|
+
part = 'ACTIVE:' + part;
|
244
|
+
const lines = part.split(os.EOL);
|
245
|
+
const channel = util.getValue(lines, 'CHAN');
|
246
|
+
const frequency = util.getValue(lines, 'FREQ').toLowerCase().replace('mhz', '').trim();
|
247
|
+
const security = util.getValue(lines, 'SECURITY').replace('(', '').replace(')', '');
|
248
|
+
const wpaFlags = util.getValue(lines, 'WPA-FLAGS').replace('(', '').replace(')', '');
|
249
|
+
const rsnFlags = util.getValue(lines, 'RSN-FLAGS').replace('(', '').replace(')', '');
|
250
|
+
const quality = util.getValue(lines, 'SIGNAL');
|
251
|
+
result.push({
|
252
|
+
ssid: util.getValue(lines, 'SSID'),
|
253
|
+
bssid: util.getValue(lines, 'BSSID').toLowerCase(),
|
254
|
+
mode: util.getValue(lines, 'MODE'),
|
255
|
+
channel: channel ? parseInt(channel, 10) : null,
|
256
|
+
frequency: frequency ? parseInt(frequency, 10) : null,
|
257
|
+
signalLevel: wifiDBFromQuality(quality),
|
258
|
+
quality: quality ? parseInt(quality, 10) : null,
|
259
|
+
security: security && security !== 'none' ? security.split(' ') : [],
|
260
|
+
wpaFlags: wpaFlags && wpaFlags !== 'none' ? wpaFlags.split(' ') : [],
|
261
|
+
rsnFlags: rsnFlags && rsnFlags !== 'none' ? rsnFlags.split(' ') : []
|
262
|
+
});
|
263
|
+
});
|
264
|
+
return result;
|
265
|
+
} catch (e) {
|
266
|
+
return [];
|
267
|
+
}
|
268
|
+
}
|
269
|
+
|
270
|
+
function getWifiNetworkListIw(iface) {
|
271
|
+
const result = [];
|
272
|
+
try {
|
273
|
+
let iwlistParts = execSync(`export LC_ALL=C; iwlist ${iface} scan 2>&1; unset LC_ALL`, util.execOptsLinux).toString().split(' Cell ');
|
274
|
+
if (iwlistParts[0].indexOf('resource busy') >= 0) { return -1; }
|
275
|
+
if (iwlistParts.length > 1) {
|
276
|
+
iwlistParts.shift();
|
277
|
+
iwlistParts.forEach(element => {
|
278
|
+
const lines = element.split('\n');
|
279
|
+
const channel = util.getValue(lines, 'channel', ':', true);
|
280
|
+
const address = (lines && lines.length && lines[0].indexOf('Address:') >= 0 ? lines[0].split('Address:')[1].trim().toLowerCase() : '');
|
281
|
+
const mode = util.getValue(lines, 'mode', ':', true);
|
282
|
+
const frequency = util.getValue(lines, 'frequency', ':', true);
|
283
|
+
const qualityString = util.getValue(lines, 'Quality', '=', true);
|
284
|
+
const dbParts = qualityString.toLowerCase().split('signal level=');
|
285
|
+
const db = dbParts.length > 1 ? util.toInt(dbParts[1]) : 0;
|
286
|
+
const quality = db ? wifiQualityFromDB(db) : 0;
|
287
|
+
const ssid = util.getValue(lines, 'essid', ':', true);
|
288
|
+
|
289
|
+
// security and wpa-flags
|
290
|
+
const isWpa = element.indexOf(' WPA ') >= 0;
|
291
|
+
const isWpa2 = element.indexOf('WPA2 ') >= 0;
|
292
|
+
const security = [];
|
293
|
+
if (isWpa) { security.push('WPA'); }
|
294
|
+
if (isWpa2) { security.push('WPA2'); }
|
295
|
+
const wpaFlags = [];
|
296
|
+
let wpaFlag = '';
|
297
|
+
lines.forEach(function (line) {
|
298
|
+
const l = line.trim().toLowerCase();
|
299
|
+
if (l.indexOf('group cipher') >= 0) {
|
300
|
+
if (wpaFlag) {
|
301
|
+
wpaFlags.push(wpaFlag);
|
302
|
+
}
|
303
|
+
const parts = l.split(':');
|
304
|
+
if (parts.length > 1) {
|
305
|
+
wpaFlag = parts[1].trim().toUpperCase();
|
306
|
+
}
|
307
|
+
}
|
308
|
+
if (l.indexOf('pairwise cipher') >= 0) {
|
309
|
+
const parts = l.split(':');
|
310
|
+
if (parts.length > 1) {
|
311
|
+
if (parts[1].indexOf('tkip')) { wpaFlag = (wpaFlag ? 'TKIP/' + wpaFlag : 'TKIP'); }
|
312
|
+
else if (parts[1].indexOf('ccmp')) { wpaFlag = (wpaFlag ? 'CCMP/' + wpaFlag : 'CCMP'); }
|
313
|
+
else if (parts[1].indexOf('proprietary')) { wpaFlag = (wpaFlag ? 'PROP/' + wpaFlag : 'PROP'); }
|
314
|
+
}
|
315
|
+
}
|
316
|
+
if (l.indexOf('authentication suites') >= 0) {
|
317
|
+
const parts = l.split(':');
|
318
|
+
if (parts.length > 1) {
|
319
|
+
if (parts[1].indexOf('802.1x')) { wpaFlag = (wpaFlag ? '802.1x/' + wpaFlag : '802.1x'); }
|
320
|
+
else if (parts[1].indexOf('psk')) { wpaFlag = (wpaFlag ? 'PSK/' + wpaFlag : 'PSK'); }
|
321
|
+
}
|
322
|
+
}
|
323
|
+
});
|
324
|
+
if (wpaFlag) {
|
325
|
+
wpaFlags.push(wpaFlag);
|
326
|
+
}
|
327
|
+
|
328
|
+
result.push({
|
329
|
+
ssid,
|
330
|
+
bssid: address,
|
331
|
+
mode,
|
332
|
+
channel: channel ? util.toInt(channel) : null,
|
333
|
+
frequency: frequency ? util.toInt(frequency.replace('.', '')) : null,
|
334
|
+
signalLevel: db,
|
335
|
+
quality,
|
336
|
+
security,
|
337
|
+
wpaFlags,
|
338
|
+
rsnFlags: []
|
339
|
+
});
|
340
|
+
});
|
341
|
+
}
|
342
|
+
return result;
|
343
|
+
} catch (e) {
|
344
|
+
return -1;
|
345
|
+
}
|
346
|
+
}
|
347
|
+
|
348
|
+
function parseWifiDarwin(wifiObj) {
|
349
|
+
const result = [];
|
350
|
+
if (wifiObj) {
|
351
|
+
wifiObj.forEach(function (wifiItem) {
|
352
|
+
const signalLevel = wifiItem.RSSI;
|
353
|
+
let security = [];
|
354
|
+
let wpaFlags = [];
|
355
|
+
let ssid = wifiItem.SSID_STR || '';
|
356
|
+
if (wifiItem.WPA_IE) {
|
357
|
+
security.push('WPA');
|
358
|
+
if (wifiItem.WPA_IE.IE_KEY_WPA_UCIPHERS) {
|
359
|
+
wifiItem.WPA_IE.IE_KEY_WPA_UCIPHERS.forEach(function (ciphers) {
|
360
|
+
if (ciphers === 0 && wpaFlags.indexOf('unknown/TKIP') === -1) { wpaFlags.push('unknown/TKIP'); }
|
361
|
+
if (ciphers === 2 && wpaFlags.indexOf('PSK/TKIP') === -1) { wpaFlags.push('PSK/TKIP'); }
|
362
|
+
if (ciphers === 4 && wpaFlags.indexOf('PSK/AES') === -1) { wpaFlags.push('PSK/AES'); }
|
363
|
+
});
|
364
|
+
}
|
365
|
+
}
|
366
|
+
if (wifiItem.RSN_IE) {
|
367
|
+
security.push('WPA2');
|
368
|
+
if (wifiItem.RSN_IE.IE_KEY_RSN_UCIPHERS) {
|
369
|
+
wifiItem.RSN_IE.IE_KEY_RSN_UCIPHERS.forEach(function (ciphers) {
|
370
|
+
if (ciphers === 0 && wpaFlags.indexOf('unknown/TKIP') === -1) { wpaFlags.push('unknown/TKIP'); }
|
371
|
+
if (ciphers === 2 && wpaFlags.indexOf('TKIP/TKIP') === -1) { wpaFlags.push('TKIP/TKIP'); }
|
372
|
+
if (ciphers === 4 && wpaFlags.indexOf('PSK/AES') === -1) { wpaFlags.push('PSK/AES'); }
|
373
|
+
});
|
374
|
+
}
|
375
|
+
}
|
376
|
+
if (wifiItem.SSID && ssid === '') {
|
377
|
+
try {
|
378
|
+
ssid = Buffer.from(wifiItem.SSID, 'base64').toString('utf8');
|
379
|
+
} catch (err) {
|
380
|
+
util.noop();
|
381
|
+
}
|
382
|
+
}
|
383
|
+
result.push({
|
384
|
+
ssid,
|
385
|
+
bssid: wifiItem.BSSID || '',
|
386
|
+
mode: '',
|
387
|
+
channel: wifiItem.CHANNEL,
|
388
|
+
frequency: wifiFrequencyFromChannel(wifiItem.CHANNEL),
|
389
|
+
signalLevel: signalLevel ? parseInt(signalLevel, 10) : null,
|
390
|
+
quality: wifiQualityFromDB(signalLevel),
|
391
|
+
security,
|
392
|
+
wpaFlags,
|
393
|
+
rsnFlags: []
|
394
|
+
});
|
395
|
+
});
|
396
|
+
}
|
397
|
+
return result;
|
398
|
+
}
|
399
|
+
function wifiNetworks(callback) {
|
400
|
+
return new Promise((resolve) => {
|
401
|
+
process.nextTick(() => {
|
402
|
+
let result = [];
|
403
|
+
if (_linux) {
|
404
|
+
result = getWifiNetworkListNmi();
|
405
|
+
if (result.length === 0) {
|
406
|
+
try {
|
407
|
+
const iwconfigParts = execSync('export LC_ALL=C; iwconfig 2>/dev/null; unset LC_ALL', util.execOptsLinux).toString().split('\n\n');
|
408
|
+
let iface = '';
|
409
|
+
iwconfigParts.forEach(element => {
|
410
|
+
if (element.indexOf('no wireless') === -1 && element.trim() !== '') {
|
411
|
+
iface = element.split(' ')[0];
|
412
|
+
}
|
413
|
+
});
|
414
|
+
if (iface) {
|
415
|
+
let ifaceSanitized = '';
|
416
|
+
const s = util.isPrototypePolluted() ? '---' : util.sanitizeShellString(iface, true);
|
417
|
+
const l = util.mathMin(s.length, 2000);
|
418
|
+
|
419
|
+
for (let i = 0; i <= l; i++) {
|
420
|
+
if (s[i] !== undefined) {
|
421
|
+
ifaceSanitized = ifaceSanitized + s[i];
|
422
|
+
}
|
423
|
+
}
|
424
|
+
|
425
|
+
const res = getWifiNetworkListIw(ifaceSanitized);
|
426
|
+
if (res === -1) {
|
427
|
+
// try again after 4 secs
|
428
|
+
setTimeout(function (iface) {
|
429
|
+
const res = getWifiNetworkListIw(iface);
|
430
|
+
if (res != -1) { result = res; }
|
431
|
+
if (callback) {
|
432
|
+
callback(result);
|
433
|
+
}
|
434
|
+
resolve(result);
|
435
|
+
}, 4000);
|
436
|
+
} else {
|
437
|
+
result = res;
|
438
|
+
if (callback) {
|
439
|
+
callback(result);
|
440
|
+
}
|
441
|
+
resolve(result);
|
442
|
+
}
|
443
|
+
} else {
|
444
|
+
if (callback) {
|
445
|
+
callback(result);
|
446
|
+
}
|
447
|
+
resolve(result);
|
448
|
+
}
|
449
|
+
} catch (e) {
|
450
|
+
if (callback) {
|
451
|
+
callback(result);
|
452
|
+
}
|
453
|
+
resolve(result);
|
454
|
+
}
|
455
|
+
} else {
|
456
|
+
if (callback) {
|
457
|
+
callback(result);
|
458
|
+
}
|
459
|
+
resolve(result);
|
460
|
+
}
|
461
|
+
} else if (_darwin) {
|
462
|
+
let cmd = '/System/Library/PrivateFrameworks/Apple80211.framework/Versions/Current/Resources/airport -s -x';
|
463
|
+
exec(cmd, { maxBuffer: 1024 * 40000 }, function (error, stdout) {
|
464
|
+
const output = stdout.toString();
|
465
|
+
result = parseWifiDarwin(util.plistParser(output));
|
466
|
+
if (callback) {
|
467
|
+
callback(result);
|
468
|
+
}
|
469
|
+
resolve(result);
|
470
|
+
});
|
471
|
+
} else if (_windows) {
|
472
|
+
let cmd = 'netsh wlan show networks mode=Bssid';
|
473
|
+
util.powerShell(cmd).then((stdout) => {
|
474
|
+
const ssidParts = stdout.toString('utf8').split(os.EOL + os.EOL + 'SSID ');
|
475
|
+
ssidParts.shift();
|
476
|
+
|
477
|
+
ssidParts.forEach(ssidPart => {
|
478
|
+
const ssidLines = ssidPart.split(os.EOL);
|
479
|
+
if (ssidLines && ssidLines.length >= 8 && ssidLines[0].indexOf(':') >= 0) {
|
480
|
+
const bssidsParts = ssidPart.split(' BSSID');
|
481
|
+
bssidsParts.shift();
|
482
|
+
|
483
|
+
bssidsParts.forEach((bssidPart) => {
|
484
|
+
const bssidLines = bssidPart.split(os.EOL);
|
485
|
+
const bssidLine = bssidLines[0].split(':');
|
486
|
+
bssidLine.shift();
|
487
|
+
const bssid = bssidLine.join(':').trim().toLowerCase();
|
488
|
+
const channel = bssidLines[3].split(':').pop().trim();
|
489
|
+
const quality = bssidLines[1].split(':').pop().trim();
|
490
|
+
|
491
|
+
result.push({
|
492
|
+
ssid: ssidLines[0].split(':').pop().trim(),
|
493
|
+
bssid,
|
494
|
+
mode: '',
|
495
|
+
channel: channel ? parseInt(channel, 10) : null,
|
496
|
+
frequency: wifiFrequencyFromChannel(channel),
|
497
|
+
signalLevel: wifiDBFromQuality(quality),
|
498
|
+
quality: quality ? parseInt(quality, 10) : null,
|
499
|
+
security: [ssidLines[2].split(':').pop().trim()],
|
500
|
+
wpaFlags: [ssidLines[3].split(':').pop().trim()],
|
501
|
+
rsnFlags: []
|
502
|
+
});
|
503
|
+
});
|
504
|
+
}
|
505
|
+
});
|
506
|
+
|
507
|
+
if (callback) {
|
508
|
+
callback(result);
|
509
|
+
}
|
510
|
+
resolve(result);
|
511
|
+
});
|
512
|
+
} else {
|
513
|
+
if (callback) {
|
514
|
+
callback(result);
|
515
|
+
}
|
516
|
+
resolve(result);
|
517
|
+
}
|
518
|
+
});
|
519
|
+
});
|
520
|
+
}
|
521
|
+
|
522
|
+
exports.wifiNetworks = wifiNetworks;
|
523
|
+
|
524
|
+
function getVendor(model) {
|
525
|
+
model = model.toLowerCase();
|
526
|
+
let result = '';
|
527
|
+
if (model.indexOf('intel') >= 0) { result = 'Intel'; }
|
528
|
+
else if (model.indexOf('realtek') >= 0) { result = 'Realtek'; }
|
529
|
+
else if (model.indexOf('qualcom') >= 0) { result = 'Qualcom'; }
|
530
|
+
else if (model.indexOf('broadcom') >= 0) { result = 'Broadcom'; }
|
531
|
+
else if (model.indexOf('cavium') >= 0) { result = 'Cavium'; }
|
532
|
+
else if (model.indexOf('cisco') >= 0) { result = 'Cisco'; }
|
533
|
+
else if (model.indexOf('marvel') >= 0) { result = 'Marvel'; }
|
534
|
+
else if (model.indexOf('zyxel') >= 0) { result = 'Zyxel'; }
|
535
|
+
else if (model.indexOf('melanox') >= 0) { result = 'Melanox'; }
|
536
|
+
else if (model.indexOf('d-link') >= 0) { result = 'D-Link'; }
|
537
|
+
else if (model.indexOf('tp-link') >= 0) { result = 'TP-Link'; }
|
538
|
+
else if (model.indexOf('asus') >= 0) { result = 'Asus'; }
|
539
|
+
else if (model.indexOf('linksys') >= 0) { result = 'Linksys'; }
|
540
|
+
return result;
|
541
|
+
}
|
542
|
+
|
543
|
+
function formatBssid(s) {
|
544
|
+
s = s.replace(/</g, '').replace(/>/g, '').match(/.{1,2}/g) || [];
|
545
|
+
return s.join(':');
|
546
|
+
}
|
547
|
+
|
548
|
+
function wifiConnections(callback) {
|
549
|
+
|
550
|
+
return new Promise((resolve) => {
|
551
|
+
process.nextTick(() => {
|
552
|
+
const result = [];
|
553
|
+
|
554
|
+
if (_linux) {
|
555
|
+
const ifaces = ifaceListLinux();
|
556
|
+
const networkList = getWifiNetworkListNmi();
|
557
|
+
ifaces.forEach(ifaceDetail => {
|
558
|
+
let ifaceSanitized = '';
|
559
|
+
const s = util.isPrototypePolluted() ? '---' : util.sanitizeShellString(ifaceDetail.iface, true);
|
560
|
+
const ll = util.mathMin(s.length, 2000);
|
561
|
+
|
562
|
+
for (let i = 0; i <= ll; i++) {
|
563
|
+
if (s[i] !== undefined) {
|
564
|
+
ifaceSanitized = ifaceSanitized + s[i];
|
565
|
+
}
|
566
|
+
}
|
567
|
+
|
568
|
+
const nmiDetails = nmiDeviceLinux(ifaceSanitized);
|
569
|
+
const wpaDetails = wpaConnectionLinux(ifaceSanitized);
|
570
|
+
const ssid = nmiDetails.ssid || wpaDetails.ssid;
|
571
|
+
const network = networkList.filter(nw => nw.ssid === ssid);
|
572
|
+
let ssidSanitized = '';
|
573
|
+
const t = util.isPrototypePolluted() ? '---' : util.sanitizeShellString(ssid, true);
|
574
|
+
const l = util.mathMin(t.length, 2000);
|
575
|
+
for (let i = 0; i <= l; i++) {
|
576
|
+
if (t[i] !== undefined) {
|
577
|
+
ssidSanitized = ssidSanitized + t[i];
|
578
|
+
}
|
579
|
+
}
|
580
|
+
|
581
|
+
const nmiConnection = nmiConnectionLinux(ssidSanitized);
|
582
|
+
const channel = network && network.length && network[0].channel ? network[0].channel : (wpaDetails.channel ? wpaDetails.channel : null);
|
583
|
+
const bssid = network && network.length && network[0].bssid ? network[0].bssid : (wpaDetails.bssid ? wpaDetails.bssid : null);
|
584
|
+
const signalLevel = network && network.length && network[0].signalLevel ? network[0].signalLevel : null;
|
585
|
+
if (ssid && bssid) {
|
586
|
+
result.push({
|
587
|
+
id: ifaceDetail.id,
|
588
|
+
iface: ifaceDetail.iface,
|
589
|
+
model: nmiDetails.product,
|
590
|
+
ssid,
|
591
|
+
bssid: network && network.length && network[0].bssid ? network[0].bssid : (wpaDetails.bssid ? wpaDetails.bssid : null),
|
592
|
+
channel,
|
593
|
+
frequency: channel ? wifiFrequencyFromChannel(channel) : null,
|
594
|
+
type: nmiConnection.type ? nmiConnection.type : '802.11',
|
595
|
+
security: nmiConnection.security ? nmiConnection.security : (wpaDetails.security ? wpaDetails.security : null),
|
596
|
+
signalLevel,
|
597
|
+
quality: wifiQualityFromDB(signalLevel),
|
598
|
+
txRate: null
|
599
|
+
});
|
600
|
+
}
|
601
|
+
});
|
602
|
+
if (callback) {
|
603
|
+
callback(result);
|
604
|
+
}
|
605
|
+
resolve(result);
|
606
|
+
} else if (_darwin) {
|
607
|
+
let cmd = 'system_profiler SPNetworkDataType';
|
608
|
+
exec(cmd, function (error, stdout) {
|
609
|
+
const parts1 = stdout.toString().split('\n\n Wi-Fi:\n\n');
|
610
|
+
if (parts1.length > 1) {
|
611
|
+
const lines = parts1[1].split('\n\n')[0].split('\n');
|
612
|
+
const iface = util.getValue(lines, 'BSD Device Name', ':', true);
|
613
|
+
const model = util.getValue(lines, 'hardware', ':', true);
|
614
|
+
cmd = '/System/Library/PrivateFrameworks/Apple80211.framework/Versions/Current/Resources/airport -I 2>/dev/null; echo "######" ; ioreg -n AppleBCMWLANSkywalkInterface -r 2>/dev/null';
|
615
|
+
exec(cmd, function (error, stdout) {
|
616
|
+
const parts = stdout.toString().split('######');
|
617
|
+
const lines2 = parts[0].split('\n');
|
618
|
+
let lines3 = [];
|
619
|
+
if (parts[1].indexOf(' | {') > 0 && parts[1].indexOf(' | }') > parts[1].indexOf(' | {')) {
|
620
|
+
lines3 = parts[1].split(' | {')[1].split(' | }')[0].replace(/ \| /g, '').replace(/"/g, '').split('\n');
|
621
|
+
}
|
622
|
+
if (lines2.length > 10) {
|
623
|
+
const ssid = util.getValue(lines2, 'ssid', ':', true);
|
624
|
+
const bssid = util.getValue(lines2, 'bssid', ':', true) || formatBssid(util.getValue(lines3, 'IO80211BSSID', '=', true));
|
625
|
+
const security = util.getValue(lines2, 'link auth', ':', true);
|
626
|
+
const txRate = util.getValue(lines2, 'lastTxRate', ':', true);
|
627
|
+
const channel = util.getValue(lines2, 'channel', ':', true).split(',')[0];
|
628
|
+
const type = '802.11';
|
629
|
+
const rssi = util.toInt(util.getValue(lines2, 'agrCtlRSSI', ':', true));
|
630
|
+
/// const noise = util.toInt(util.getValue(lines2, 'agrCtlNoise', ':', true));
|
631
|
+
const signalLevel = rssi;
|
632
|
+
if (ssid || bssid) {
|
633
|
+
result.push({
|
634
|
+
id: 'Wi-Fi',
|
635
|
+
iface,
|
636
|
+
model,
|
637
|
+
ssid,
|
638
|
+
bssid,
|
639
|
+
channel: util.toInt(channel),
|
640
|
+
frequency: channel ? wifiFrequencyFromChannel(channel) : null,
|
641
|
+
type,
|
642
|
+
security,
|
643
|
+
signalLevel,
|
644
|
+
quality: wifiQualityFromDB(signalLevel),
|
645
|
+
txRate
|
646
|
+
});
|
647
|
+
}
|
648
|
+
}
|
649
|
+
if (lines3.length > 10) {
|
650
|
+
const ssid = util.getValue(lines3, 'IO80211SSID', '=', true);
|
651
|
+
const bssid = formatBssid(util.getValue(lines3, 'IO80211BSSID', '=', true));
|
652
|
+
const security = '';
|
653
|
+
const txRate = -1;
|
654
|
+
const signalLevel = -1;
|
655
|
+
const quality = -1;
|
656
|
+
const channel = util.getValue(lines3, 'IO80211Channel', '=', true);
|
657
|
+
const type = '802.11';
|
658
|
+
if ((ssid || bssid) && !result.length) {
|
659
|
+
result.push({
|
660
|
+
id: 'Wi-Fi',
|
661
|
+
iface,
|
662
|
+
model,
|
663
|
+
ssid,
|
664
|
+
bssid,
|
665
|
+
channel: util.toInt(channel),
|
666
|
+
frequency: channel ? wifiFrequencyFromChannel(channel) : null,
|
667
|
+
type,
|
668
|
+
security,
|
669
|
+
signalLevel,
|
670
|
+
quality,
|
671
|
+
txRate
|
672
|
+
});
|
673
|
+
}
|
674
|
+
}
|
675
|
+
if (callback) {
|
676
|
+
callback(result);
|
677
|
+
}
|
678
|
+
resolve(result);
|
679
|
+
});
|
680
|
+
} else {
|
681
|
+
if (callback) {
|
682
|
+
callback(result);
|
683
|
+
}
|
684
|
+
resolve(result);
|
685
|
+
}
|
686
|
+
});
|
687
|
+
} else if (_windows) {
|
688
|
+
let cmd = 'netsh wlan show interfaces';
|
689
|
+
util.powerShell(cmd).then(function (stdout) {
|
690
|
+
const allLines = stdout.toString().split('\r\n');
|
691
|
+
for (let i = 0; i < allLines.length; i++) {
|
692
|
+
allLines[i] = allLines[i].trim();
|
693
|
+
}
|
694
|
+
const parts = allLines.join('\r\n').split(':\r\n\r\n');
|
695
|
+
parts.shift();
|
696
|
+
parts.forEach(part => {
|
697
|
+
const lines = part.split('\r\n');
|
698
|
+
if (lines.length >= 5) {
|
699
|
+
const iface = lines[0].indexOf(':') >= 0 ? lines[0].split(':')[1].trim() : '';
|
700
|
+
const model = lines[1].indexOf(':') >= 0 ? lines[1].split(':')[1].trim() : '';
|
701
|
+
const id = lines[2].indexOf(':') >= 0 ? lines[2].split(':')[1].trim() : '';
|
702
|
+
const ssid = util.getValue(lines, 'SSID', ':', true);
|
703
|
+
const bssid = util.getValue(lines, 'BSSID', ':', true);
|
704
|
+
const quality = util.getValue(lines, 'Signal', ':', true);
|
705
|
+
const signalLevel = wifiDBFromQuality(quality);
|
706
|
+
const type = util.getValue(lines, 'Radio type', ':', true) || util.getValue(lines, 'Type de radio', ':', true) || util.getValue(lines, 'Funktyp', ':', true) || null;
|
707
|
+
const security = util.getValue(lines, 'authentication', ':', true) || util.getValue(lines, 'Authentification', ':', true) || util.getValue(lines, 'Authentifizierung', ':', true) || null;
|
708
|
+
const channel = util.getValue(lines, 'Channel', ':', true) || util.getValue(lines, 'Canal', ':', true) || util.getValue(lines, 'Kanal', ':', true) || null;
|
709
|
+
const txRate = util.getValue(lines, 'Transmit rate (mbps)', ':', true) || util.getValue(lines, 'Transmission (mbit/s)', ':', true) || util.getValue(lines, 'Empfangsrate (MBit/s)', ':', true) || null;
|
710
|
+
if (model && id && ssid && bssid) {
|
711
|
+
result.push({
|
712
|
+
id,
|
713
|
+
iface,
|
714
|
+
model,
|
715
|
+
ssid,
|
716
|
+
bssid,
|
717
|
+
channel: util.toInt(channel),
|
718
|
+
frequency: channel ? wifiFrequencyFromChannel(channel) : null,
|
719
|
+
type,
|
720
|
+
security,
|
721
|
+
signalLevel,
|
722
|
+
quality: quality ? parseInt(quality, 10) : null,
|
723
|
+
txRate: util.toInt(txRate) || null
|
724
|
+
});
|
725
|
+
}
|
726
|
+
}
|
727
|
+
});
|
728
|
+
if (callback) {
|
729
|
+
callback(result);
|
730
|
+
}
|
731
|
+
resolve(result);
|
732
|
+
});
|
733
|
+
} else {
|
734
|
+
if (callback) {
|
735
|
+
callback(result);
|
736
|
+
}
|
737
|
+
resolve(result);
|
738
|
+
}
|
739
|
+
});
|
740
|
+
});
|
741
|
+
}
|
742
|
+
|
743
|
+
exports.wifiConnections = wifiConnections;
|
744
|
+
|
745
|
+
function wifiInterfaces(callback) {
|
746
|
+
|
747
|
+
return new Promise((resolve) => {
|
748
|
+
process.nextTick(() => {
|
749
|
+
const result = [];
|
750
|
+
|
751
|
+
if (_linux) {
|
752
|
+
const ifaces = ifaceListLinux();
|
753
|
+
ifaces.forEach(ifaceDetail => {
|
754
|
+
const nmiDetails = nmiDeviceLinux(ifaceDetail.iface);
|
755
|
+
result.push({
|
756
|
+
id: ifaceDetail.id,
|
757
|
+
iface: ifaceDetail.iface,
|
758
|
+
model: nmiDetails.product ? nmiDetails.product : null,
|
759
|
+
vendor: nmiDetails.vendor ? nmiDetails.vendor : null,
|
760
|
+
mac: ifaceDetail.mac,
|
761
|
+
});
|
762
|
+
});
|
763
|
+
if (callback) {
|
764
|
+
callback(result);
|
765
|
+
}
|
766
|
+
resolve(result);
|
767
|
+
} else if (_darwin) {
|
768
|
+
let cmd = 'system_profiler SPNetworkDataType';
|
769
|
+
exec(cmd, function (error, stdout) {
|
770
|
+
const parts1 = stdout.toString().split('\n\n Wi-Fi:\n\n');
|
771
|
+
if (parts1.length > 1) {
|
772
|
+
const lines = parts1[1].split('\n\n')[0].split('\n');
|
773
|
+
const iface = util.getValue(lines, 'BSD Device Name', ':', true);
|
774
|
+
const mac = util.getValue(lines, 'MAC Address', ':', true);
|
775
|
+
const model = util.getValue(lines, 'hardware', ':', true);
|
776
|
+
result.push({
|
777
|
+
id: 'Wi-Fi',
|
778
|
+
iface,
|
779
|
+
model,
|
780
|
+
vendor: '',
|
781
|
+
mac
|
782
|
+
});
|
783
|
+
}
|
784
|
+
if (callback) {
|
785
|
+
callback(result);
|
786
|
+
}
|
787
|
+
resolve(result);
|
788
|
+
});
|
789
|
+
} else if (_windows) {
|
790
|
+
let cmd = 'netsh wlan show interfaces';
|
791
|
+
util.powerShell(cmd).then(function (stdout) {
|
792
|
+
const allLines = stdout.toString().split('\r\n');
|
793
|
+
for (let i = 0; i < allLines.length; i++) {
|
794
|
+
allLines[i] = allLines[i].trim();
|
795
|
+
}
|
796
|
+
const parts = allLines.join('\r\n').split(':\r\n\r\n');
|
797
|
+
parts.shift();
|
798
|
+
parts.forEach(part => {
|
799
|
+
const lines = part.split('\r\n');
|
800
|
+
if (lines.length >= 5) {
|
801
|
+
const iface = lines[0].indexOf(':') >= 0 ? lines[0].split(':')[1].trim() : '';
|
802
|
+
const model = lines[1].indexOf(':') >= 0 ? lines[1].split(':')[1].trim() : '';
|
803
|
+
const id = lines[2].indexOf(':') >= 0 ? lines[2].split(':')[1].trim() : '';
|
804
|
+
const macParts = lines[3].indexOf(':') >= 0 ? lines[3].split(':') : [];
|
805
|
+
macParts.shift();
|
806
|
+
const mac = macParts.join(':').trim();
|
807
|
+
const vendor = getVendor(model);
|
808
|
+
if (iface && model && id && mac) {
|
809
|
+
result.push({
|
810
|
+
id,
|
811
|
+
iface,
|
812
|
+
model,
|
813
|
+
vendor,
|
814
|
+
mac,
|
815
|
+
});
|
816
|
+
}
|
817
|
+
}
|
818
|
+
});
|
819
|
+
if (callback) {
|
820
|
+
callback(result);
|
821
|
+
}
|
822
|
+
resolve(result);
|
823
|
+
});
|
824
|
+
} else {
|
825
|
+
if (callback) {
|
826
|
+
callback(result);
|
827
|
+
}
|
828
|
+
resolve(result);
|
829
|
+
}
|
830
|
+
});
|
831
|
+
});
|
832
|
+
}
|
833
|
+
|
834
|
+
exports.wifiInterfaces = wifiInterfaces;
|