diff --git a/lib/index.js b/lib/index.js index 10c2810..15795e6 100644 --- a/lib/index.js +++ b/lib/index.js @@ -31,6 +31,7 @@ const battery = require('./battery'); const graphics = require('./graphics'); const filesystem = require('./filesystem'); const network = require('./network'); +const wifi = require('./wifi'); const processes = require('./processes'); const users = require('./users'); const internet = require('./internet'); @@ -350,6 +351,8 @@ exports.networkInterfaces = network.networkInterfaces; exports.networkStats = network.networkStats; exports.networkConnections = network.networkConnections; +exports.wifi = wifi.wifi; + exports.services = processes.services; exports.processes = processes.processes; exports.processLoad = processes.processLoad; diff --git a/lib/wifi.js b/lib/wifi.js new file mode 100644 index 0000000..44c792e --- /dev/null +++ b/lib/wifi.js @@ -0,0 +1,96 @@ +'use strict'; +// @ts-check +// ================================================================================== +// wifi.js +// ---------------------------------------------------------------------------------- +// Description: System Information - library +// for Node.js +// Copyright: (c) 2014 - 2019 +// Author: Sebastian Hildebrandt +// ---------------------------------------------------------------------------------- +// License: MIT +// ================================================================================== +// 9. wifi +// ---------------------------------------------------------------------------------- + +const os = require('os'); +const exec = require('child_process').exec; +const execSync = require('child_process').execSync; +const fs = require('fs'); +const util = require('./util'); + +let _platform = process.platform; + +const _linux = (_platform === 'linux'); +const _darwin = (_platform === 'darwin'); +const _windows = (_platform === 'win32'); +const _freebsd = (_platform === 'freebsd'); +const _openbsd = (_platform === 'openbsd'); +const _netbsd = (_platform === 'netbsd'); +const _sunos = (_platform === 'sunos'); + +function wifiDBFromQuality(quality) { + return (parseFloat(quality) / 2 - 100); +} + +function wifiQualityFromDB(db) { + return 2 * (parseFloat(db) + 100); +} + +function wifi(callback) { + + return new Promise((resolve) => { + process.nextTick(() => { + let result = []; + if (_linux) { + let cmd = 'nmcli --terse --fields active,ssid,bssid,mode,chan,freq,signal,security,wpa-flags,rsn-flags device wifi list'; + exec(cmd, { maxBuffer: 1024 * 2000 }, function (error, stdout) { + + const parts = stdout.toString().split('ACTIVE:'); + parts.shift(); + parts.forEach(part => { + part = 'ACTIVE:' + part; + const lines = part.split(os.EOL); + const channel = util.getValue(lines, 'CHAN'); + const frequency = util.getValue(lines, 'FREQ').toLowerCase().replace('mhz', '').trim() + const security = util.getValue(lines, 'SECURITY').replace('(', '').replace(')', '') + const wpaFlags = util.getValue(lines, 'WPA-FLAGS').replace('(', '').replace(')', '') + const rsnFlags = util.getValue(lines, 'RSN-FLAGS').replace('(', '').replace(')', '') + result.push({ + ssid: util.getValue(lines, 'SSID'), + bssid: util.getValue(lines, 'BSSID'), + mode: util.getValue(lines, 'MODE'), + channel: channel ? parseInt(channel, 10) : -1, + frequency: frequency ? parseInt(frequency, 10) : -1, + signalLevel: wifiDBFromQuality(util.getValue(lines, 'SIGNAL')), + quality: parseFloat(util.getValue(lines, 'SIGNAL')), + security: security && security !== 'none' ? security.split(' ') : [], + wpaFlags: wpaFlags && wpaFlags !== 'none' ? wpaFlags.split(' ') : [], + rsnFlags: rsnFlags && rsnFlags !== 'none' ? rsnFlags.split(' ') : [] + }) + }) + + if (callback) { + callback(result); + } + resolve(result); + }); + } else if (_darwinx) { + let cmd = ''; + exec(cmd, { maxBuffer: 1024 * 2000 }, function (error, stdout) { + if (callback) { + callback(result); + } + resolve(result); + }); + } else { + if (callback) { + callback(result); + } + resolve(result); + } + }); + }); +} + +exports.wifi = wifi;