added cpu() virtualization, flags
This commit is contained in:
parent
ea46cdd2d1
commit
d895c23881
@ -508,7 +508,7 @@ Function Changes
|
||||
- `fs_size`/`fsSize`: use-values now in % (0 - 100% instead of 0 - 1)
|
||||
- `fs_speed`/`fsStats`: now also full support for OS X
|
||||
- `checksite`/`inetChecksite`: new result structure - see command reference
|
||||
- `checksite`/`inetChecksite`: ms (former `response_ms`): -1 if not ok
|
||||
- `checksite`/`inetChecksite`: ms (former `response_ms`): null if not ok
|
||||
|
||||
Other changes
|
||||
|
||||
|
||||
@ -259,13 +259,13 @@ si.diskLayout().then(data => console.log(data));</code></pre class="example">
|
||||
name: 'SAMSUNG xxxxxxxxxxxx-xxxx',
|
||||
vendor: 'Samsung',
|
||||
size: 1024209543168,
|
||||
bytesPerSector: -1,
|
||||
totalCylinders: -1,
|
||||
totalHeads: -1,
|
||||
totalSectors: -1,
|
||||
totalTracks: -1,
|
||||
tracksPerCylinder: -1,
|
||||
sectorsPerTrack: -1,
|
||||
bytesPerSector: null,
|
||||
totalCylinders: null,
|
||||
totalHeads: null,
|
||||
totalSectors: null,
|
||||
totalTracks: null,
|
||||
tracksPerCylinder: null,
|
||||
sectorsPerTrack: null,
|
||||
firmwareRevision: '',
|
||||
serialNum: '...serial....',
|
||||
interfaceType: 'PCIe',
|
||||
@ -537,9 +537,9 @@ setInterval(function() {
|
||||
rIO: 899825,
|
||||
wIO: 932331,
|
||||
tIO: 1832156,
|
||||
rIO_sec: -1,
|
||||
wIO_sec: -1,
|
||||
tIO_sec: -1,
|
||||
rIO_sec: null,
|
||||
wIO_sec: null,
|
||||
tIO_sec: null,
|
||||
ms: 0
|
||||
}
|
||||
{ // second call
|
||||
@ -808,9 +808,9 @@ setInterval(function() {
|
||||
rx: 14015849472,
|
||||
wx: 15316003328,
|
||||
tx: 29331852800,
|
||||
rx_sec: -1,
|
||||
wx_sec: -1,
|
||||
tx_sec: -1,
|
||||
rx_sec: null,
|
||||
wx_sec: null,
|
||||
tx_sec: null,
|
||||
ms: 0
|
||||
}
|
||||
{ // second call
|
||||
@ -890,4 +890,4 @@ setInterval(function() {
|
||||
</script>
|
||||
</body>
|
||||
|
||||
</html>
|
||||
</html>
|
||||
@ -489,8 +489,8 @@ si.graphics().then(data => console.log(data));</code></pre class="example">
|
||||
main: true,
|
||||
builtin: false,
|
||||
connection: 'Internal',
|
||||
sizex: -1,
|
||||
sizey: -1,
|
||||
sizex: null,
|
||||
sizey: null,
|
||||
pixeldepth: 24,
|
||||
resolutionx: 2560,
|
||||
resolutiony: 1600,
|
||||
@ -498,7 +498,7 @@ si.graphics().then(data => console.log(data));</code></pre class="example">
|
||||
currentResY: 1600,
|
||||
positionX: 0,
|
||||
positionY: 0,
|
||||
currentRefreshRate: -1
|
||||
currentRefreshRate: null
|
||||
}
|
||||
]
|
||||
}</pre>
|
||||
@ -551,4 +551,4 @@ si.graphics().then(data => console.log(data));</code></pre class="example">
|
||||
</script>
|
||||
</body>
|
||||
|
||||
</html>
|
||||
</html>
|
||||
@ -287,7 +287,7 @@ si.networkInterfaces().then(data => console.log(data));</code></pre class="examp
|
||||
type: 'wired',
|
||||
duplex: 'full',
|
||||
mtu: 16384,
|
||||
speed: -1,
|
||||
speed: null,
|
||||
dhcp: false,
|
||||
dnsSuffix: '',
|
||||
ieee8021xAuth: '',
|
||||
@ -496,8 +496,8 @@ setInterval(function() {
|
||||
tx_bytes: 180934681,
|
||||
tx_dropped: 0,
|
||||
tx_errors: 0,
|
||||
rx_sec: -1,
|
||||
tx_sec: -1,
|
||||
rx_sec: null,
|
||||
tx_sec: null,
|
||||
ms: 0
|
||||
}
|
||||
]
|
||||
@ -810,4 +810,4 @@ setInterval(function() {
|
||||
</script>
|
||||
</body>
|
||||
|
||||
</html>
|
||||
</html>
|
||||
@ -41,7 +41,7 @@ module.exports = function (callback) {
|
||||
voltage: 0,
|
||||
capacityUnit: '',
|
||||
percent: 0,
|
||||
timeremaining: -1,
|
||||
timeremaining: null,
|
||||
acconnected: true,
|
||||
type: '',
|
||||
model: '',
|
||||
@ -116,13 +116,13 @@ module.exports = function (callback) {
|
||||
const batteries = parseInt('0' + util.getValue(lines, 'hw.acpi.battery.units'), 10);
|
||||
const percent = parseInt('0' + util.getValue(lines, 'hw.acpi.battery.life'), 10);
|
||||
result.hasbattery = (batteries > 0);
|
||||
result.cyclecount = -1;
|
||||
result.cyclecount = null;
|
||||
result.ischarging = util.getValue(lines, 'hw.acpi.acline') !== '1';
|
||||
result.acconnected = result.ischarging;
|
||||
result.maxcapacity = -1;
|
||||
result.currentcapacity = -1;
|
||||
result.maxcapacity = null;
|
||||
result.currentcapacity = null;
|
||||
result.capacityUnit = 'unknown';
|
||||
result.percent = batteries ? percent : -1;
|
||||
result.percent = batteries ? percent : null;
|
||||
if (callback) { callback(result); }
|
||||
resolve(result);
|
||||
});
|
||||
@ -140,7 +140,7 @@ module.exports = function (callback) {
|
||||
result.designedcapacity = Math.round(parseInt('0' + util.getValue(lines, 'DesignCapacity', '='), 10) * (result.voltage || 1));
|
||||
result.manufacturer = 'Apple';
|
||||
result.serial = util.getValue(lines, 'BatterySerialNumber', '=');
|
||||
let percent = -1;
|
||||
let percent = null;
|
||||
const line = util.getValue(lines, 'internal', 'Battery');
|
||||
let parts = line.split(';');
|
||||
if (parts && parts[0]) {
|
||||
@ -159,7 +159,7 @@ module.exports = function (callback) {
|
||||
if (result.maxcapacity && result.currentcapacity) {
|
||||
result.hasbattery = true;
|
||||
result.type = 'Li-ion';
|
||||
result.percent = percent !== -1 ? percent : Math.round(100.0 * result.currentcapacity / result.maxcapacity);
|
||||
result.percent = percent !== null ? percent : Math.round(100.0 * result.currentcapacity / result.maxcapacity);
|
||||
if (!result.ischarging) {
|
||||
result.timeremaining = parseInt('0' + util.getValue(lines, 'TimeRemaining', '='), 10);
|
||||
}
|
||||
|
||||
574
lib/cpu.js
574
lib/cpu.js
@ -543,290 +543,296 @@ function getCpu() {
|
||||
physicalCores: util.cores(),
|
||||
processors: 1,
|
||||
socket: '',
|
||||
flags: '',
|
||||
virtualization: false,
|
||||
cache: {}
|
||||
};
|
||||
if (_darwin) {
|
||||
exec('sysctl machdep.cpu hw.cpufrequency_max hw.cpufrequency_min hw.packages hw.physicalcpu_max hw.ncpu hw.tbfrequency hw.cpufamily hw.cpusubfamily', function (error, stdout) {
|
||||
let lines = stdout.toString().split('\n');
|
||||
const modelline = util.getValue(lines, 'machdep.cpu.brand_string');
|
||||
const modellineParts = modelline.split('@');
|
||||
result.brand = modellineParts[0].trim();
|
||||
result.speed = modellineParts[1] ? modellineParts[1].trim() : '0';
|
||||
result.speed = parseFloat(result.speed.replace(/GHz+/g, '')).toFixed(2);
|
||||
let tbFrequency = util.getValue(lines, 'hw.tbfrequency') / 1000000000.0;
|
||||
tbFrequency = tbFrequency < 0.1 ? tbFrequency * 100 : tbFrequency;
|
||||
result.speed = result.speed === '0.00' ? tbFrequency.toFixed(2) : result.speed;
|
||||
cpuFlags().then(flags => {
|
||||
result.flags = flags;
|
||||
result.virtualization = flags.indexOf('vmx') > -1 || flags.indexOf('svm') > -1;
|
||||
if (_darwin) {
|
||||
exec('sysctl machdep.cpu hw.cpufrequency_max hw.cpufrequency_min hw.packages hw.physicalcpu_max hw.ncpu hw.tbfrequency hw.cpufamily hw.cpusubfamily', function (error, stdout) {
|
||||
let lines = stdout.toString().split('\n');
|
||||
const modelline = util.getValue(lines, 'machdep.cpu.brand_string');
|
||||
const modellineParts = modelline.split('@');
|
||||
result.brand = modellineParts[0].trim();
|
||||
result.speed = modellineParts[1] ? modellineParts[1].trim() : '0';
|
||||
result.speed = parseFloat(result.speed.replace(/GHz+/g, '')).toFixed(2);
|
||||
let tbFrequency = util.getValue(lines, 'hw.tbfrequency') / 1000000000.0;
|
||||
tbFrequency = tbFrequency < 0.1 ? tbFrequency * 100 : tbFrequency;
|
||||
result.speed = result.speed === '0.00' ? tbFrequency.toFixed(2) : result.speed;
|
||||
|
||||
_cpu_speed = result.speed;
|
||||
result = cpuBrandManufacturer(result);
|
||||
result.speedmin = util.getValue(lines, 'hw.cpufrequency_min') ? (util.getValue(lines, 'hw.cpufrequency_min') / 1000000000.0).toFixed(2) : result.speed;
|
||||
result.speedmax = util.getValue(lines, 'hw.cpufrequency_max') ? (util.getValue(lines, 'hw.cpufrequency_max') / 1000000000.0).toFixed(2) : result.speed;
|
||||
result.vendor = util.getValue(lines, 'machdep.cpu.vendor') || 'Apple';
|
||||
result.family = util.getValue(lines, 'machdep.cpu.family') || util.getValue(lines, 'hw.cpufamily');
|
||||
result.model = util.getValue(lines, 'machdep.cpu.model');
|
||||
result.stepping = util.getValue(lines, 'machdep.cpu.stepping') || util.getValue(lines, 'hw.cpusubfamily');
|
||||
const countProcessors = util.getValue(lines, 'hw.packages');
|
||||
const countCores = util.getValue(lines, 'hw.physicalcpu_max');
|
||||
const countThreads = util.getValue(lines, 'hw.ncpu');
|
||||
if (os.arch() === 'arm64') {
|
||||
const clusters = execSync('ioreg -c IOPlatformDevice -d 3 -r | grep cluster-type').toString().split('\n');
|
||||
const efficiencyCores = clusters.filter(line => line.indexOf('"E"') >= 0).length;
|
||||
const performanceCores = clusters.filter(line => line.indexOf('"P"') >= 0).length;
|
||||
result.socket = 'SOC';
|
||||
result.efficiencyCores = efficiencyCores;
|
||||
result.performanceCores = performanceCores;
|
||||
}
|
||||
if (countProcessors) {
|
||||
result.processors = parseInt(countProcessors) || 1;
|
||||
}
|
||||
if (countCores && countThreads) {
|
||||
result.cores = parseInt(countThreads) || util.cores();
|
||||
result.physicalCores = parseInt(countCores) || util.cores();
|
||||
}
|
||||
cpuCache().then(res => {
|
||||
result.cache = res;
|
||||
resolve(result);
|
||||
});
|
||||
});
|
||||
}
|
||||
if (_linux) {
|
||||
let modelline = '';
|
||||
let lines = [];
|
||||
if (os.cpus()[0] && os.cpus()[0].model) modelline = os.cpus()[0].model;
|
||||
exec('export LC_ALL=C; lscpu; echo -n "Governor: "; cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor 2>/dev/null; echo; unset LC_ALL', function (error, stdout) {
|
||||
if (!error) {
|
||||
lines = stdout.toString().split('\n');
|
||||
}
|
||||
modelline = util.getValue(lines, 'model name') || modelline;
|
||||
const modellineParts = modelline.split('@');
|
||||
result.brand = modellineParts[0].trim();
|
||||
result.speed = modellineParts[1] ? parseFloat(modellineParts[1].trim()).toFixed(2) : '0.00';
|
||||
if (result.speed === '0.00' && (result.brand.indexOf('AMD') > -1 || result.brand.toLowerCase().indexOf('ryzen') > -1)) {
|
||||
result.speed = getAMDSpeed(result.brand);
|
||||
}
|
||||
if (result.speed === '0.00') {
|
||||
let current = getCpuCurrentSpeedSync();
|
||||
if (current.avg !== 0) result.speed = current.avg.toFixed(2);
|
||||
}
|
||||
_cpu_speed = result.speed;
|
||||
result.speedmin = Math.round(parseFloat(util.getValue(lines, 'cpu min mhz').replace(/,/g, '.')) / 10.0) / 100;
|
||||
result.speedmin = result.speedmin ? parseFloat(result.speedmin).toFixed(2) : '';
|
||||
result.speedmax = Math.round(parseFloat(util.getValue(lines, 'cpu max mhz').replace(/,/g, '.')) / 10.0) / 100;
|
||||
result.speedmax = result.speedmax ? parseFloat(result.speedmax).toFixed(2) : '';
|
||||
|
||||
result = cpuBrandManufacturer(result);
|
||||
result.vendor = util.getValue(lines, 'vendor id');
|
||||
// if (!result.vendor) { result.vendor = util.getValue(lines, 'anbieterkennung'); }
|
||||
|
||||
result.family = util.getValue(lines, 'cpu family');
|
||||
// if (!result.family) { result.family = util.getValue(lines, 'prozessorfamilie'); }
|
||||
result.model = util.getValue(lines, 'model:');
|
||||
// if (!result.model) { result.model = util.getValue(lines, 'modell:'); }
|
||||
result.stepping = util.getValue(lines, 'stepping');
|
||||
result.revision = util.getValue(lines, 'cpu revision');
|
||||
result.cache.l1d = util.getValue(lines, 'l1d cache');
|
||||
if (result.cache.l1d) { result.cache.l1d = parseInt(result.cache.l1d) * (result.cache.l1d.indexOf('K') !== -1 ? 1024 : 1); }
|
||||
result.cache.l1i = util.getValue(lines, 'l1i cache');
|
||||
if (result.cache.l1i) { result.cache.l1i = parseInt(result.cache.l1i) * (result.cache.l1i.indexOf('K') !== -1 ? 1024 : 1); }
|
||||
result.cache.l2 = util.getValue(lines, 'l2 cache');
|
||||
if (result.cache.l2) { result.cache.l2 = parseInt(result.cache.l2) * (result.cache.l2.indexOf('K') !== -1 ? 1024 : 1); }
|
||||
result.cache.l3 = util.getValue(lines, 'l3 cache');
|
||||
if (result.cache.l3) { result.cache.l3 = parseInt(result.cache.l3) * (result.cache.l3.indexOf('K') !== -1 ? 1024 : 1); }
|
||||
|
||||
const threadsPerCore = util.getValue(lines, 'thread(s) per core') || '1';
|
||||
// const coresPerSocketInt = parseInt(util.getValue(lines, 'cores(s) per socket') || '1', 10);
|
||||
const processors = util.getValue(lines, 'socket(s)') || '1';
|
||||
let threadsPerCoreInt = parseInt(threadsPerCore, 10);
|
||||
let processorsInt = parseInt(processors, 10);
|
||||
result.physicalCores = result.cores / threadsPerCoreInt;
|
||||
result.processors = processorsInt;
|
||||
result.governor = util.getValue(lines, 'governor') || '';
|
||||
|
||||
// Test Raspberry
|
||||
if (result.vendor === 'ARM') {
|
||||
const linesRpi = fs.readFileSync('/proc/cpuinfo').toString().split('\n');
|
||||
const rPIRevision = util.decodePiCpuinfo(linesRpi);
|
||||
if (rPIRevision.model.toLowerCase().indexOf('raspberry') >= 0) {
|
||||
result.family = result.manufacturer;
|
||||
result.manufacturer = rPIRevision.manufacturer;
|
||||
result.brand = rPIRevision.processor;
|
||||
result.revision = rPIRevision.revisionCode;
|
||||
_cpu_speed = result.speed;
|
||||
result = cpuBrandManufacturer(result);
|
||||
result.speedmin = util.getValue(lines, 'hw.cpufrequency_min') ? (util.getValue(lines, 'hw.cpufrequency_min') / 1000000000.0).toFixed(2) : result.speed;
|
||||
result.speedmax = util.getValue(lines, 'hw.cpufrequency_max') ? (util.getValue(lines, 'hw.cpufrequency_max') / 1000000000.0).toFixed(2) : result.speed;
|
||||
result.vendor = util.getValue(lines, 'machdep.cpu.vendor') || 'Apple';
|
||||
result.family = util.getValue(lines, 'machdep.cpu.family') || util.getValue(lines, 'hw.cpufamily');
|
||||
result.model = util.getValue(lines, 'machdep.cpu.model');
|
||||
result.stepping = util.getValue(lines, 'machdep.cpu.stepping') || util.getValue(lines, 'hw.cpusubfamily');
|
||||
const countProcessors = util.getValue(lines, 'hw.packages');
|
||||
const countCores = util.getValue(lines, 'hw.physicalcpu_max');
|
||||
const countThreads = util.getValue(lines, 'hw.ncpu');
|
||||
if (os.arch() === 'arm64') {
|
||||
const clusters = execSync('ioreg -c IOPlatformDevice -d 3 -r | grep cluster-type').toString().split('\n');
|
||||
const efficiencyCores = clusters.filter(line => line.indexOf('"E"') >= 0).length;
|
||||
const performanceCores = clusters.filter(line => line.indexOf('"P"') >= 0).length;
|
||||
result.socket = 'SOC';
|
||||
result.efficiencyCores = efficiencyCores;
|
||||
result.performanceCores = performanceCores;
|
||||
}
|
||||
}
|
||||
|
||||
// socket type
|
||||
let lines2 = [];
|
||||
exec('export LC_ALL=C; dmidecode –t 4 2>/dev/null | grep "Upgrade: Socket"; unset LC_ALL', function (error2, stdout2) {
|
||||
lines2 = stdout2.toString().split('\n');
|
||||
if (lines2 && lines2.length) {
|
||||
result.socket = util.getValue(lines2, 'Upgrade').replace('Socket', '').trim() || result.socket;
|
||||
if (countProcessors) {
|
||||
result.processors = parseInt(countProcessors) || 1;
|
||||
}
|
||||
resolve(result);
|
||||
if (countCores && countThreads) {
|
||||
result.cores = parseInt(countThreads) || util.cores();
|
||||
result.physicalCores = parseInt(countCores) || util.cores();
|
||||
}
|
||||
cpuCache().then(res => {
|
||||
result.cache = res;
|
||||
resolve(result);
|
||||
});
|
||||
});
|
||||
});
|
||||
}
|
||||
if (_freebsd || _openbsd || _netbsd) {
|
||||
let modelline = '';
|
||||
let lines = [];
|
||||
if (os.cpus()[0] && os.cpus()[0].model) modelline = os.cpus()[0].model;
|
||||
exec('export LC_ALL=C; dmidecode -t 4; dmidecode -t 7 unset LC_ALL', function (error, stdout) {
|
||||
let cache = [];
|
||||
if (!error) {
|
||||
const data = stdout.toString().split('# dmidecode');
|
||||
const processor = data.length > 1 ? data[1] : '';
|
||||
cache = data.length > 2 ? data[2].split('Cache Information') : [];
|
||||
|
||||
lines = processor.split('\n');
|
||||
}
|
||||
result.brand = modelline.split('@')[0].trim();
|
||||
result.speed = modelline.split('@')[1] ? parseFloat(modelline.split('@')[1].trim()).toFixed(2) : '0.00';
|
||||
if (result.speed === '0.00' && (result.brand.indexOf('AMD') > -1 || result.brand.toLowerCase().indexOf('ryzen') > -1)) {
|
||||
result.speed = getAMDSpeed(result.brand);
|
||||
}
|
||||
if (result.speed === '0.00') {
|
||||
let current = getCpuCurrentSpeedSync();
|
||||
if (current.avg !== 0) result.speed = current.avg.toFixed(2);
|
||||
}
|
||||
_cpu_speed = result.speed;
|
||||
result.speedmin = '';
|
||||
result.speedmax = Math.round(parseFloat(util.getValue(lines, 'max speed').replace(/Mhz/g, '')) / 10.0) / 100;
|
||||
result.speedmax = result.speedmax ? parseFloat(result.speedmax).toFixed(2) : '';
|
||||
|
||||
result = cpuBrandManufacturer(result);
|
||||
result.vendor = util.getValue(lines, 'manufacturer');
|
||||
let sig = util.getValue(lines, 'signature');
|
||||
sig = sig.split(',');
|
||||
for (var i = 0; i < sig.length; i++) {
|
||||
sig[i] = sig[i].trim();
|
||||
}
|
||||
result.family = util.getValue(sig, 'Family', ' ', true);
|
||||
result.model = util.getValue(sig, 'Model', ' ', true);
|
||||
result.stepping = util.getValue(sig, 'Stepping', ' ', true);
|
||||
result.revision = '';
|
||||
const voltage = parseFloat(util.getValue(lines, 'voltage'));
|
||||
result.voltage = isNaN(voltage) ? '' : voltage.toFixed(2);
|
||||
for (let i = 0; i < cache.length; i++) {
|
||||
lines = cache[i].split('\n');
|
||||
let cacheType = util.getValue(lines, 'Socket Designation').toLowerCase().replace(' ', '-').split('-');
|
||||
cacheType = cacheType.length ? cacheType[0] : '';
|
||||
const sizeParts = util.getValue(lines, 'Installed Size').split(' ');
|
||||
let size = parseInt(sizeParts[0], 10);
|
||||
const unit = sizeParts.length > 1 ? sizeParts[1] : 'kb';
|
||||
size = size * (unit === 'kb' ? 1024 : (unit === 'mb' ? 1024 * 1024 : (unit === 'gb' ? 1024 * 1024 * 1024 : 1)));
|
||||
if (cacheType) {
|
||||
if (cacheType === 'l1') {
|
||||
result.cache[cacheType + 'd'] = size / 2;
|
||||
result.cache[cacheType + 'i'] = size / 2;
|
||||
} else {
|
||||
result.cache[cacheType] = size;
|
||||
}
|
||||
}
|
||||
}
|
||||
// socket type
|
||||
result.socket = util.getValue(lines, 'Upgrade').replace('Socket', '').trim();
|
||||
// # threads / # cores
|
||||
const threadCount = util.getValue(lines, 'thread count').trim();
|
||||
const coreCount = util.getValue(lines, 'core count').trim();
|
||||
if (coreCount && threadCount) {
|
||||
result.cores = threadCount;
|
||||
result.physicalCores = coreCount;
|
||||
}
|
||||
resolve(result);
|
||||
});
|
||||
}
|
||||
if (_sunos) {
|
||||
resolve(result);
|
||||
}
|
||||
if (_windows) {
|
||||
try {
|
||||
util.wmic('cpu get /value').then((stdout, error) => {
|
||||
}
|
||||
if (_linux) {
|
||||
let modelline = '';
|
||||
let lines = [];
|
||||
if (os.cpus()[0] && os.cpus()[0].model) modelline = os.cpus()[0].model;
|
||||
exec('export LC_ALL=C; lscpu; echo -n "Governor: "; cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor 2>/dev/null; echo; unset LC_ALL', function (error, stdout) {
|
||||
if (!error) {
|
||||
let lines = stdout.split('\r\n');
|
||||
let name = util.getValue(lines, 'name', '=') || '';
|
||||
if (name.indexOf('@') >= 0) {
|
||||
result.brand = name.split('@')[0].trim();
|
||||
result.speed = name.split('@')[1] ? parseFloat(name.split('@')[1].trim()).toFixed(2) : '0.00';
|
||||
_cpu_speed = result.speed;
|
||||
} else {
|
||||
result.brand = name.trim();
|
||||
result.speed = '0.00';
|
||||
}
|
||||
result = cpuBrandManufacturer(result);
|
||||
result.revision = util.getValue(lines, 'revision', '=');
|
||||
result.cache.l1d = 0;
|
||||
result.cache.l1i = 0;
|
||||
result.cache.l2 = util.getValue(lines, 'l2cachesize', '=');
|
||||
result.cache.l3 = util.getValue(lines, 'l3cachesize', '=');
|
||||
if (result.cache.l2) { result.cache.l2 = parseInt(result.cache.l2, 10) * 1024; }
|
||||
if (result.cache.l3) { result.cache.l3 = parseInt(result.cache.l3, 10) * 1024; }
|
||||
result.vendor = util.getValue(lines, 'manufacturer', '=');
|
||||
result.speedmax = Math.round(parseFloat(util.getValue(lines, 'maxclockspeed', '=').replace(/,/g, '.')) / 10.0) / 100;
|
||||
result.speedmax = result.speedmax ? parseFloat(result.speedmax).toFixed(2) : '';
|
||||
if (result.speed === '0.00' && (result.brand.indexOf('AMD') > -1 || result.brand.toLowerCase().indexOf('ryzen') > -1)) {
|
||||
result.speed = getAMDSpeed(result.brand);
|
||||
}
|
||||
if (result.speed === '0.00') {
|
||||
result.speed = result.speedmax;
|
||||
}
|
||||
lines = stdout.toString().split('\n');
|
||||
}
|
||||
modelline = util.getValue(lines, 'model name') || modelline;
|
||||
const modellineParts = modelline.split('@');
|
||||
result.brand = modellineParts[0].trim();
|
||||
result.speed = modellineParts[1] ? parseFloat(modellineParts[1].trim()).toFixed(2) : '0.00';
|
||||
if (result.speed === '0.00' && (result.brand.indexOf('AMD') > -1 || result.brand.toLowerCase().indexOf('ryzen') > -1)) {
|
||||
result.speed = getAMDSpeed(result.brand);
|
||||
}
|
||||
if (result.speed === '0.00') {
|
||||
let current = getCpuCurrentSpeedSync();
|
||||
if (current.avg !== 0) result.speed = current.avg.toFixed(2);
|
||||
}
|
||||
_cpu_speed = result.speed;
|
||||
result.speedmin = Math.round(parseFloat(util.getValue(lines, 'cpu min mhz').replace(/,/g, '.')) / 10.0) / 100;
|
||||
result.speedmin = result.speedmin ? parseFloat(result.speedmin).toFixed(2) : '';
|
||||
result.speedmax = Math.round(parseFloat(util.getValue(lines, 'cpu max mhz').replace(/,/g, '.')) / 10.0) / 100;
|
||||
result.speedmax = result.speedmax ? parseFloat(result.speedmax).toFixed(2) : '';
|
||||
|
||||
let description = util.getValue(lines, 'description', '=').split(' ');
|
||||
for (let i = 0; i < description.length; i++) {
|
||||
if (description[i].toLowerCase().startsWith('family') && (i + 1) < description.length && description[i + 1]) {
|
||||
result.family = description[i + 1];
|
||||
}
|
||||
if (description[i].toLowerCase().startsWith('model') && (i + 1) < description.length && description[i + 1]) {
|
||||
result.model = description[i + 1];
|
||||
}
|
||||
if (description[i].toLowerCase().startsWith('stepping') && (i + 1) < description.length && description[i + 1]) {
|
||||
result.stepping = description[i + 1];
|
||||
}
|
||||
}
|
||||
// socket type
|
||||
const socketId = util.getValue(lines, 'UpgradeMethod', '=');
|
||||
if (socketTypes[socketId]) {
|
||||
result.socket = socketTypes[socketId];
|
||||
}
|
||||
// # threads / # cores
|
||||
const countProcessors = util.countLines(lines, 'Caption');
|
||||
const countThreads = util.getValue(lines, 'NumberOfLogicalProcessors', '=');
|
||||
const countCores = util.getValue(lines, 'NumberOfCores', '=');
|
||||
if (countProcessors) {
|
||||
result.processors = parseInt(countProcessors) || 1;
|
||||
}
|
||||
if (countCores && countThreads) {
|
||||
result.cores = parseInt(countThreads) || util.cores();
|
||||
result.physicalCores = parseInt(countCores) || util.cores();
|
||||
}
|
||||
if (countProcessors > 1) {
|
||||
result.cores = result.cores * countProcessors;
|
||||
result.physicalCores = result.physicalCores * countProcessors;
|
||||
result = cpuBrandManufacturer(result);
|
||||
result.vendor = util.getValue(lines, 'vendor id');
|
||||
// if (!result.vendor) { result.vendor = util.getValue(lines, 'anbieterkennung'); }
|
||||
|
||||
result.family = util.getValue(lines, 'cpu family');
|
||||
// if (!result.family) { result.family = util.getValue(lines, 'prozessorfamilie'); }
|
||||
result.model = util.getValue(lines, 'model:');
|
||||
// if (!result.model) { result.model = util.getValue(lines, 'modell:'); }
|
||||
result.stepping = util.getValue(lines, 'stepping');
|
||||
result.revision = util.getValue(lines, 'cpu revision');
|
||||
result.cache.l1d = util.getValue(lines, 'l1d cache');
|
||||
if (result.cache.l1d) { result.cache.l1d = parseInt(result.cache.l1d) * (result.cache.l1d.indexOf('K') !== -1 ? 1024 : 1); }
|
||||
result.cache.l1i = util.getValue(lines, 'l1i cache');
|
||||
if (result.cache.l1i) { result.cache.l1i = parseInt(result.cache.l1i) * (result.cache.l1i.indexOf('K') !== -1 ? 1024 : 1); }
|
||||
result.cache.l2 = util.getValue(lines, 'l2 cache');
|
||||
if (result.cache.l2) { result.cache.l2 = parseInt(result.cache.l2) * (result.cache.l2.indexOf('K') !== -1 ? 1024 : 1); }
|
||||
result.cache.l3 = util.getValue(lines, 'l3 cache');
|
||||
if (result.cache.l3) { result.cache.l3 = parseInt(result.cache.l3) * (result.cache.l3.indexOf('K') !== -1 ? 1024 : 1); }
|
||||
|
||||
const threadsPerCore = util.getValue(lines, 'thread(s) per core') || '1';
|
||||
// const coresPerSocketInt = parseInt(util.getValue(lines, 'cores(s) per socket') || '1', 10);
|
||||
const processors = util.getValue(lines, 'socket(s)') || '1';
|
||||
let threadsPerCoreInt = parseInt(threadsPerCore, 10);
|
||||
let processorsInt = parseInt(processors, 10);
|
||||
result.physicalCores = result.cores / threadsPerCoreInt;
|
||||
result.processors = processorsInt;
|
||||
result.governor = util.getValue(lines, 'governor') || '';
|
||||
|
||||
// Test Raspberry
|
||||
if (result.vendor === 'ARM') {
|
||||
const linesRpi = fs.readFileSync('/proc/cpuinfo').toString().split('\n');
|
||||
const rPIRevision = util.decodePiCpuinfo(linesRpi);
|
||||
if (rPIRevision.model.toLowerCase().indexOf('raspberry') >= 0) {
|
||||
result.family = result.manufacturer;
|
||||
result.manufacturer = rPIRevision.manufacturer;
|
||||
result.brand = rPIRevision.processor;
|
||||
result.revision = rPIRevision.revisionCode;
|
||||
result.socket = 'SOC';
|
||||
}
|
||||
}
|
||||
util.wmic('path Win32_CacheMemory get CacheType,InstalledSize,Purpose').then((stdout, error) => {
|
||||
if (!error) {
|
||||
let lines = stdout.split('\r\n').filter(line => line.trim() !== '').filter((line, idx) => idx > 0);
|
||||
lines.forEach(function (line) {
|
||||
if (line !== '') {
|
||||
line = line.trim().split(/\s\s+/);
|
||||
// L1 Instructions
|
||||
if (line[2] === 'L1 Cache' && line[0] === '3') {
|
||||
result.cache.l1i = parseInt(line[1], 10);
|
||||
}
|
||||
// L1 Data
|
||||
if (line[2] === 'L1 Cache' && line[0] === '4') {
|
||||
result.cache.l1d = parseInt(line[1], 10);
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
// socket type
|
||||
let lines2 = [];
|
||||
exec('export LC_ALL=C; dmidecode –t 4 2>/dev/null | grep "Upgrade: Socket"; unset LC_ALL', function (error2, stdout2) {
|
||||
lines2 = stdout2.toString().split('\n');
|
||||
if (lines2 && lines2.length) {
|
||||
result.socket = util.getValue(lines2, 'Upgrade').replace('Socket', '').trim() || result.socket;
|
||||
}
|
||||
resolve(result);
|
||||
});
|
||||
});
|
||||
} catch (e) {
|
||||
}
|
||||
if (_freebsd || _openbsd || _netbsd) {
|
||||
let modelline = '';
|
||||
let lines = [];
|
||||
if (os.cpus()[0] && os.cpus()[0].model) modelline = os.cpus()[0].model;
|
||||
exec('export LC_ALL=C; dmidecode -t 4; dmidecode -t 7 unset LC_ALL', function (error, stdout) {
|
||||
let cache = [];
|
||||
if (!error) {
|
||||
const data = stdout.toString().split('# dmidecode');
|
||||
const processor = data.length > 1 ? data[1] : '';
|
||||
cache = data.length > 2 ? data[2].split('Cache Information') : [];
|
||||
|
||||
lines = processor.split('\n');
|
||||
}
|
||||
result.brand = modelline.split('@')[0].trim();
|
||||
result.speed = modelline.split('@')[1] ? parseFloat(modelline.split('@')[1].trim()).toFixed(2) : '0.00';
|
||||
if (result.speed === '0.00' && (result.brand.indexOf('AMD') > -1 || result.brand.toLowerCase().indexOf('ryzen') > -1)) {
|
||||
result.speed = getAMDSpeed(result.brand);
|
||||
}
|
||||
if (result.speed === '0.00') {
|
||||
let current = getCpuCurrentSpeedSync();
|
||||
if (current.avg !== 0) result.speed = current.avg.toFixed(2);
|
||||
}
|
||||
_cpu_speed = result.speed;
|
||||
result.speedmin = '';
|
||||
result.speedmax = Math.round(parseFloat(util.getValue(lines, 'max speed').replace(/Mhz/g, '')) / 10.0) / 100;
|
||||
result.speedmax = result.speedmax ? parseFloat(result.speedmax).toFixed(2) : '';
|
||||
|
||||
result = cpuBrandManufacturer(result);
|
||||
result.vendor = util.getValue(lines, 'manufacturer');
|
||||
let sig = util.getValue(lines, 'signature');
|
||||
sig = sig.split(',');
|
||||
for (var i = 0; i < sig.length; i++) {
|
||||
sig[i] = sig[i].trim();
|
||||
}
|
||||
result.family = util.getValue(sig, 'Family', ' ', true);
|
||||
result.model = util.getValue(sig, 'Model', ' ', true);
|
||||
result.stepping = util.getValue(sig, 'Stepping', ' ', true);
|
||||
result.revision = '';
|
||||
const voltage = parseFloat(util.getValue(lines, 'voltage'));
|
||||
result.voltage = isNaN(voltage) ? '' : voltage.toFixed(2);
|
||||
for (let i = 0; i < cache.length; i++) {
|
||||
lines = cache[i].split('\n');
|
||||
let cacheType = util.getValue(lines, 'Socket Designation').toLowerCase().replace(' ', '-').split('-');
|
||||
cacheType = cacheType.length ? cacheType[0] : '';
|
||||
const sizeParts = util.getValue(lines, 'Installed Size').split(' ');
|
||||
let size = parseInt(sizeParts[0], 10);
|
||||
const unit = sizeParts.length > 1 ? sizeParts[1] : 'kb';
|
||||
size = size * (unit === 'kb' ? 1024 : (unit === 'mb' ? 1024 * 1024 : (unit === 'gb' ? 1024 * 1024 * 1024 : 1)));
|
||||
if (cacheType) {
|
||||
if (cacheType === 'l1') {
|
||||
result.cache[cacheType + 'd'] = size / 2;
|
||||
result.cache[cacheType + 'i'] = size / 2;
|
||||
} else {
|
||||
result.cache[cacheType] = size;
|
||||
}
|
||||
}
|
||||
}
|
||||
// socket type
|
||||
result.socket = util.getValue(lines, 'Upgrade').replace('Socket', '').trim();
|
||||
// # threads / # cores
|
||||
const threadCount = util.getValue(lines, 'thread count').trim();
|
||||
const coreCount = util.getValue(lines, 'core count').trim();
|
||||
if (coreCount && threadCount) {
|
||||
result.cores = threadCount;
|
||||
result.physicalCores = coreCount;
|
||||
}
|
||||
resolve(result);
|
||||
});
|
||||
}
|
||||
if (_sunos) {
|
||||
resolve(result);
|
||||
}
|
||||
}
|
||||
if (_windows) {
|
||||
try {
|
||||
util.wmic('cpu get /value').then((stdout, error) => {
|
||||
if (!error) {
|
||||
let lines = stdout.split('\r\n');
|
||||
let name = util.getValue(lines, 'name', '=') || '';
|
||||
if (name.indexOf('@') >= 0) {
|
||||
result.brand = name.split('@')[0].trim();
|
||||
result.speed = name.split('@')[1] ? parseFloat(name.split('@')[1].trim()).toFixed(2) : '0.00';
|
||||
_cpu_speed = result.speed;
|
||||
} else {
|
||||
result.brand = name.trim();
|
||||
result.speed = '0.00';
|
||||
}
|
||||
result = cpuBrandManufacturer(result);
|
||||
result.revision = util.getValue(lines, 'revision', '=');
|
||||
result.cache.l1d = 0;
|
||||
result.cache.l1i = 0;
|
||||
result.cache.l2 = util.getValue(lines, 'l2cachesize', '=');
|
||||
result.cache.l3 = util.getValue(lines, 'l3cachesize', '=');
|
||||
if (result.cache.l2) { result.cache.l2 = parseInt(result.cache.l2, 10) * 1024; }
|
||||
if (result.cache.l3) { result.cache.l3 = parseInt(result.cache.l3, 10) * 1024; }
|
||||
result.vendor = util.getValue(lines, 'manufacturer', '=');
|
||||
result.speedmax = Math.round(parseFloat(util.getValue(lines, 'maxclockspeed', '=').replace(/,/g, '.')) / 10.0) / 100;
|
||||
result.speedmax = result.speedmax ? parseFloat(result.speedmax).toFixed(2) : '';
|
||||
if (result.speed === '0.00' && (result.brand.indexOf('AMD') > -1 || result.brand.toLowerCase().indexOf('ryzen') > -1)) {
|
||||
result.speed = getAMDSpeed(result.brand);
|
||||
}
|
||||
if (result.speed === '0.00') {
|
||||
result.speed = result.speedmax;
|
||||
}
|
||||
|
||||
let description = util.getValue(lines, 'description', '=').split(' ');
|
||||
for (let i = 0; i < description.length; i++) {
|
||||
if (description[i].toLowerCase().startsWith('family') && (i + 1) < description.length && description[i + 1]) {
|
||||
result.family = description[i + 1];
|
||||
}
|
||||
if (description[i].toLowerCase().startsWith('model') && (i + 1) < description.length && description[i + 1]) {
|
||||
result.model = description[i + 1];
|
||||
}
|
||||
if (description[i].toLowerCase().startsWith('stepping') && (i + 1) < description.length && description[i + 1]) {
|
||||
result.stepping = description[i + 1];
|
||||
}
|
||||
}
|
||||
// socket type
|
||||
const socketId = util.getValue(lines, 'UpgradeMethod', '=');
|
||||
if (socketTypes[socketId]) {
|
||||
result.socket = socketTypes[socketId];
|
||||
}
|
||||
// # threads / # cores
|
||||
const countProcessors = util.countLines(lines, 'Caption');
|
||||
const countThreads = util.getValue(lines, 'NumberOfLogicalProcessors', '=');
|
||||
const countCores = util.getValue(lines, 'NumberOfCores', '=');
|
||||
if (countProcessors) {
|
||||
result.processors = parseInt(countProcessors) || 1;
|
||||
}
|
||||
if (countCores && countThreads) {
|
||||
result.cores = parseInt(countThreads) || util.cores();
|
||||
result.physicalCores = parseInt(countCores) || util.cores();
|
||||
}
|
||||
if (countProcessors > 1) {
|
||||
result.cores = result.cores * countProcessors;
|
||||
result.physicalCores = result.physicalCores * countProcessors;
|
||||
}
|
||||
}
|
||||
util.wmic('path Win32_CacheMemory get CacheType,InstalledSize,Purpose').then((stdout, error) => {
|
||||
if (!error) {
|
||||
let lines = stdout.split('\r\n').filter(line => line.trim() !== '').filter((line, idx) => idx > 0);
|
||||
lines.forEach(function (line) {
|
||||
if (line !== '') {
|
||||
line = line.trim().split(/\s\s+/);
|
||||
// L1 Instructions
|
||||
if (line[2] === 'L1 Cache' && line[0] === '3') {
|
||||
result.cache.l1i = parseInt(line[1], 10);
|
||||
}
|
||||
// L1 Data
|
||||
if (line[2] === 'L1 Cache' && line[0] === '4') {
|
||||
result.cache.l1d = parseInt(line[1], 10);
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
resolve(result);
|
||||
});
|
||||
});
|
||||
} catch (e) {
|
||||
resolve(result);
|
||||
}
|
||||
}
|
||||
})
|
||||
});
|
||||
});
|
||||
}
|
||||
@ -917,9 +923,9 @@ function cpuTemperature(callback) {
|
||||
return new Promise((resolve) => {
|
||||
process.nextTick(() => {
|
||||
let result = {
|
||||
main: -1.0,
|
||||
main: null,
|
||||
cores: [],
|
||||
max: -1.0
|
||||
max: null
|
||||
};
|
||||
if (_linux) {
|
||||
const cmd = 'for mon in /sys/class/hwmon/hwmon*; do for label in "$mon"/temp*_label; do if [ -f $label ]; then value=$(echo $label | rev | cut -c 7- | rev)_input; if [ -f "$value" ]; then echo $(cat "$label")___$(cat "$value"); fi; fi; done; done;';
|
||||
@ -932,20 +938,20 @@ function cpuTemperature(callback) {
|
||||
const value = parts.length > 1 && parts[1] ? parts[1] : '0';
|
||||
if (value && (label === undefined || (label && label.toLowerCase().startsWith('core')))) {
|
||||
result.cores.push(Math.round(parseInt(value, 10) / 100) / 10);
|
||||
} else if (value && label && result.main === -1) {
|
||||
} else if (value && label && result.main === null) {
|
||||
result.main = Math.round(parseInt(value, 10) / 100) / 10;
|
||||
}
|
||||
});
|
||||
|
||||
if (result.cores.length > 0) {
|
||||
if (result.main === -1) {
|
||||
if (result.main === null) {
|
||||
result.main = Math.round(result.cores.reduce((a, b) => a + b, 0) / result.cores.length);
|
||||
}
|
||||
let maxtmp = Math.max.apply(Math, result.cores);
|
||||
result.max = (maxtmp > result.main) ? maxtmp : result.main;
|
||||
}
|
||||
if (result.main !== -1) {
|
||||
if (result.max === -1) {
|
||||
if (result.main !== null) {
|
||||
if (result.max === null) {
|
||||
result.max = result.main;
|
||||
}
|
||||
if (callback) { callback(result); }
|
||||
@ -956,7 +962,7 @@ function cpuTemperature(callback) {
|
||||
exec('sensors', function (error, stdout) {
|
||||
if (!error) {
|
||||
let lines = stdout.toString().split('\n');
|
||||
let tdieTemp = -1;
|
||||
let tdieTemp = null;
|
||||
lines.forEach(function (line) {
|
||||
let regex = /[+-]([^°]*)/g;
|
||||
let temps = line.match(regex);
|
||||
@ -967,23 +973,23 @@ function cpuTemperature(callback) {
|
||||
if (firstPart.indexOf('CORE ') !== -1) {
|
||||
result.cores.push(parseFloat(temps));
|
||||
}
|
||||
if (firstPart.indexOf('TDIE') !== -1 && tdieTemp === -1) {
|
||||
if (firstPart.indexOf('TDIE') !== -1 && tdieTemp === null) {
|
||||
tdieTemp = parseFloat(temps);
|
||||
}
|
||||
});
|
||||
if (result.cores.length > 0) {
|
||||
if (result.main === -1) {
|
||||
if (result.main === null) {
|
||||
result.main = Math.round(result.cores.reduce((a, b) => a + b, 0) / result.cores.length);
|
||||
}
|
||||
let maxtmp = Math.max.apply(Math, result.cores);
|
||||
result.max = (maxtmp > result.main) ? maxtmp : result.main;
|
||||
} else {
|
||||
if (result.main === -1 && tdieTemp !== -1) {
|
||||
if (result.main === null && tdieTemp !== null) {
|
||||
result.main = tdieTemp;
|
||||
result.max = tdieTemp;
|
||||
}
|
||||
}
|
||||
if (result.main !== -1.0 || result.max !== -1.0) {
|
||||
if (result.main !== null || result.max !== null) {
|
||||
if (callback) { callback(result); }
|
||||
resolve(result);
|
||||
return;
|
||||
@ -1121,7 +1127,7 @@ function cpuFlags(callback) {
|
||||
result += ' ' + all_flags[f];
|
||||
}
|
||||
}
|
||||
result = result.trim();
|
||||
result = result.trim().toLowerCase();
|
||||
}
|
||||
if (callback) { callback(result); }
|
||||
resolve(result);
|
||||
@ -1175,7 +1181,7 @@ function cpuFlags(callback) {
|
||||
}
|
||||
});
|
||||
}
|
||||
result = flags.join(' ').trim();
|
||||
result = flags.join(' ').trim().toLowerCase();
|
||||
if (callback) { callback(result); }
|
||||
resolve(result);
|
||||
});
|
||||
@ -1211,10 +1217,10 @@ function cpuCache(callback) {
|
||||
process.nextTick(() => {
|
||||
|
||||
let result = {
|
||||
l1d: -1,
|
||||
l1i: -1,
|
||||
l2: -1,
|
||||
l3: -1,
|
||||
l1d: null,
|
||||
l1i: null,
|
||||
l2: null,
|
||||
l3: null,
|
||||
};
|
||||
if (_linux) {
|
||||
try {
|
||||
|
||||
@ -163,9 +163,9 @@ function fsOpenFiles(callback) {
|
||||
return new Promise((resolve) => {
|
||||
process.nextTick(() => {
|
||||
const result = {
|
||||
max: -1,
|
||||
allocated: -1,
|
||||
available: -1
|
||||
max: null,
|
||||
allocated: null,
|
||||
available: null
|
||||
};
|
||||
if (_freebsd || _openbsd || _netbsd || _darwin) {
|
||||
let cmd = 'sysctl -a | grep \'kern.*files\'';
|
||||
@ -423,9 +423,9 @@ function calcFsSpeed(rx, wx) {
|
||||
rx: 0,
|
||||
wx: 0,
|
||||
tx: 0,
|
||||
rx_sec: -1,
|
||||
wx_sec: -1,
|
||||
tx_sec: -1,
|
||||
rx_sec: null,
|
||||
wx_sec: null,
|
||||
tx_sec: null,
|
||||
ms: 0
|
||||
};
|
||||
|
||||
@ -449,9 +449,9 @@ function calcFsSpeed(rx, wx) {
|
||||
result.rx = rx;
|
||||
result.wx = wx;
|
||||
result.tx = result.rx + result.wx;
|
||||
_fs_speed.rx_sec = -1;
|
||||
_fs_speed.wx_sec = -1;
|
||||
_fs_speed.tx_sec = -1;
|
||||
_fs_speed.rx_sec = null;
|
||||
_fs_speed.wx_sec = null;
|
||||
_fs_speed.tx_sec = null;
|
||||
_fs_speed.bytes_read = result.rx;
|
||||
_fs_speed.bytes_write = result.wx;
|
||||
_fs_speed.bytes_overall = result.rx + result.wx;
|
||||
@ -477,9 +477,9 @@ function fsStats(callback) {
|
||||
rx: 0,
|
||||
wx: 0,
|
||||
tx: 0,
|
||||
rx_sec: -1,
|
||||
wx_sec: -1,
|
||||
tx_sec: -1,
|
||||
rx_sec: null,
|
||||
wx_sec: null,
|
||||
tx_sec: null,
|
||||
ms: 0
|
||||
};
|
||||
|
||||
@ -572,9 +572,9 @@ function calcDiskIO(rIO, wIO) {
|
||||
rIO: 0,
|
||||
wIO: 0,
|
||||
tIO: 0,
|
||||
rIO_sec: -1,
|
||||
wIO_sec: -1,
|
||||
tIO_sec: -1,
|
||||
rIO_sec: null,
|
||||
wIO_sec: null,
|
||||
tIO_sec: null,
|
||||
ms: 0
|
||||
};
|
||||
if (_disk_io && _disk_io.ms) {
|
||||
@ -598,9 +598,9 @@ function calcDiskIO(rIO, wIO) {
|
||||
result.tIO = rIO + wIO;
|
||||
_disk_io.rIO = rIO;
|
||||
_disk_io.wIO = wIO;
|
||||
_disk_io.rIO_sec = -1;
|
||||
_disk_io.wIO_sec = -1;
|
||||
_disk_io.tIO_sec = -1;
|
||||
_disk_io.rIO_sec = null;
|
||||
_disk_io.wIO_sec = null;
|
||||
_disk_io.tIO_sec = null;
|
||||
_disk_io.last_ms = 0;
|
||||
_disk_io.ms = Date.now();
|
||||
}
|
||||
@ -630,9 +630,9 @@ function disksIO(callback) {
|
||||
rIO: 0,
|
||||
wIO: 0,
|
||||
tIO: 0,
|
||||
rIO_sec: -1,
|
||||
wIO_sec: -1,
|
||||
tIO_sec: -1,
|
||||
rIO_sec: null,
|
||||
wIO_sec: null,
|
||||
tIO_sec: null,
|
||||
ms: 0
|
||||
};
|
||||
let rIO = 0;
|
||||
@ -813,13 +813,13 @@ function diskLayout(callback) {
|
||||
name: device.model || '',
|
||||
vendor: getVendorFromModel(device.model) || (device.vendor ? device.vendor.trim() : ''),
|
||||
size: device.size || 0,
|
||||
bytesPerSector: -1,
|
||||
totalCylinders: -1,
|
||||
totalHeads: -1,
|
||||
totalSectors: -1,
|
||||
totalTracks: -1,
|
||||
tracksPerCylinder: -1,
|
||||
sectorsPerTrack: -1,
|
||||
bytesPerSector: null,
|
||||
totalCylinders: null,
|
||||
totalHeads: null,
|
||||
totalSectors: null,
|
||||
totalTracks: null,
|
||||
tracksPerCylinder: null,
|
||||
sectorsPerTrack: null,
|
||||
firmwareRevision: device.rev ? device.rev.trim() : '',
|
||||
serialNum: device.serial ? device.serial.trim() : '',
|
||||
interfaceType: interfaceType,
|
||||
@ -921,13 +921,13 @@ function diskLayout(callback) {
|
||||
name: util.getValue(lines, 'Model', ':', true).trim(),
|
||||
vendor: getVendorFromModel(util.getValue(lines, 'Model', ':', true).trim()),
|
||||
size: sizeValue,
|
||||
bytesPerSector: -1,
|
||||
totalCylinders: -1,
|
||||
totalHeads: -1,
|
||||
totalSectors: -1,
|
||||
totalTracks: -1,
|
||||
tracksPerCylinder: -1,
|
||||
sectorsPerTrack: -1,
|
||||
bytesPerSector: null,
|
||||
totalCylinders: null,
|
||||
totalHeads: null,
|
||||
totalSectors: null,
|
||||
totalTracks: null,
|
||||
tracksPerCylinder: null,
|
||||
sectorsPerTrack: null,
|
||||
firmwareRevision: util.getValue(lines, 'Revision', ':', true).trim(),
|
||||
serialNum: util.getValue(lines, 'Serial Number', ':', true).trim(),
|
||||
interfaceType: util.getValue(lines, 'InterfaceType', ':', true).trim(),
|
||||
@ -962,13 +962,13 @@ function diskLayout(callback) {
|
||||
name: util.getValue(lines, 'Model', ':', true).trim(),
|
||||
vendor: getVendorFromModel(util.getValue(lines, 'Model', ':', true).trim()),
|
||||
size: sizeValue,
|
||||
bytesPerSector: -1,
|
||||
totalCylinders: -1,
|
||||
totalHeads: -1,
|
||||
totalSectors: -1,
|
||||
totalTracks: -1,
|
||||
tracksPerCylinder: -1,
|
||||
sectorsPerTrack: -1,
|
||||
bytesPerSector: null,
|
||||
totalCylinders: null,
|
||||
totalHeads: null,
|
||||
totalSectors: null,
|
||||
totalTracks: null,
|
||||
tracksPerCylinder: null,
|
||||
sectorsPerTrack: null,
|
||||
firmwareRevision: util.getValue(lines, 'Revision', ':', true).trim(),
|
||||
serialNum: util.getValue(lines, 'Serial Number', ':', true).trim(),
|
||||
interfaceType: ('PCIe ' + linkWidth).trim(),
|
||||
|
||||
126
lib/graphics.js
126
lib/graphics.js
@ -68,7 +68,7 @@ function graphics(callback) {
|
||||
vendor: '',
|
||||
model: '',
|
||||
bus: '',
|
||||
vram: -1,
|
||||
vram: null,
|
||||
vramDynamic: false
|
||||
};
|
||||
let currentDisplay = {
|
||||
@ -78,16 +78,16 @@ function graphics(callback) {
|
||||
main: false,
|
||||
builtin: false,
|
||||
connection: '',
|
||||
sizex: -1,
|
||||
sizey: -1,
|
||||
pixeldepth: -1,
|
||||
resolutionx: -1,
|
||||
resolutiony: -1,
|
||||
currentResX: -1,
|
||||
currentResY: -1,
|
||||
sizex: null,
|
||||
sizey: null,
|
||||
pixeldepth: null,
|
||||
resolutionx: null,
|
||||
resolutiony: null,
|
||||
currentResX: null,
|
||||
currentResY: null,
|
||||
positionX: 0,
|
||||
positionY: 0,
|
||||
currentRefreshRate: -1
|
||||
currentRefreshRate: null
|
||||
};
|
||||
for (let i = 0; i < lines.length; i++) {
|
||||
if ('' !== lines[i].trim()) {
|
||||
@ -103,7 +103,7 @@ function graphics(callback) {
|
||||
vendor: '',
|
||||
model: '',
|
||||
bus: '',
|
||||
vram: -1,
|
||||
vram: null,
|
||||
vramDynamic: false
|
||||
};
|
||||
}
|
||||
@ -116,16 +116,16 @@ function graphics(callback) {
|
||||
main: false,
|
||||
builtin: false,
|
||||
connection: '',
|
||||
sizex: -1,
|
||||
sizey: -1,
|
||||
pixeldepth: -1,
|
||||
resolutionx: -1,
|
||||
resolutiony: -1,
|
||||
currentResX: -1,
|
||||
currentResY: -1,
|
||||
sizex: null,
|
||||
sizey: null,
|
||||
pixeldepth: null,
|
||||
resolutionx: null,
|
||||
resolutiony: null,
|
||||
currentResX: null,
|
||||
currentResY: null,
|
||||
positionX: 0,
|
||||
positionY: 0,
|
||||
currentRefreshRate: -1
|
||||
currentRefreshRate: null
|
||||
};
|
||||
}
|
||||
}
|
||||
@ -162,11 +162,11 @@ function graphics(callback) {
|
||||
currentDisplay.main = false;
|
||||
currentDisplay.builtin = false;
|
||||
currentDisplay.connection = '';
|
||||
currentDisplay.sizex = -1;
|
||||
currentDisplay.sizey = -1;
|
||||
currentDisplay.sizex = null;
|
||||
currentDisplay.sizey = null;
|
||||
currentDisplay.positionX = 0;
|
||||
currentDisplay.positionY = 0;
|
||||
currentDisplay.pixeldepth = -1;
|
||||
currentDisplay.pixeldepth = null;
|
||||
}
|
||||
}
|
||||
if (4 === level) { // display controller details level
|
||||
@ -210,7 +210,7 @@ function graphics(callback) {
|
||||
model: '',
|
||||
bus: '',
|
||||
busAddress: '',
|
||||
vram: -1,
|
||||
vram: null,
|
||||
vramDynamic: false,
|
||||
pciID: ''
|
||||
};
|
||||
@ -238,14 +238,14 @@ function graphics(callback) {
|
||||
if (_3dcontrollerpos !== -1 && vgapos === -1) {
|
||||
vgapos = _3dcontrollerpos;
|
||||
}
|
||||
if (currentController.vendor || currentController.model || currentController.bus || currentController.vram !== -1 || currentController.vramDynamic) { // already a controller found
|
||||
if (currentController.vendor || currentController.model || currentController.bus || currentController.vram !== null || currentController.vramDynamic) { // already a controller found
|
||||
controllers.push(currentController);
|
||||
currentController = {
|
||||
vendor: '',
|
||||
model: '',
|
||||
bus: '',
|
||||
busAddress: '',
|
||||
vram: -1,
|
||||
vram: null,
|
||||
vramDynamic: false,
|
||||
};
|
||||
}
|
||||
@ -264,7 +264,7 @@ function graphics(callback) {
|
||||
currentController.vendor = parts[1].substr(0, parts[1].toLowerCase().indexOf('corporation') + 11).trim();
|
||||
currentController.model = parts[1].substr(parts[1].toLowerCase().indexOf('corporation') + 11, 200).trim().split('(')[0];
|
||||
currentController.bus = (pciIDs.length > 0 && isExternal) ? 'PCIe' : 'Onboard';
|
||||
currentController.vram = -1;
|
||||
currentController.vram = null;
|
||||
currentController.vramDynamic = false;
|
||||
} else if (parts[1].toLowerCase().indexOf(' inc.') >= 0) {
|
||||
if ((parts[1].match(new RegExp(']', 'g')) || []).length > 1) {
|
||||
@ -275,7 +275,7 @@ function graphics(callback) {
|
||||
currentController.model = parts[1].substr(parts[1].toLowerCase().indexOf(' inc.') + 5, 200).trim().split('(')[0].trim();
|
||||
}
|
||||
currentController.bus = (pciIDs.length > 0 && isExternal) ? 'PCIe' : 'Onboard';
|
||||
currentController.vram = -1;
|
||||
currentController.vram = null;
|
||||
currentController.vramDynamic = false;
|
||||
} else if (parts[1].toLowerCase().indexOf(' ltd.') >= 0) {
|
||||
if ((parts[1].match(new RegExp(']', 'g')) || []).length > 1) {
|
||||
@ -304,7 +304,7 @@ function graphics(callback) {
|
||||
}
|
||||
}
|
||||
}
|
||||
if (currentController.vendor || currentController.model || currentController.bus || currentController.busAddress || currentController.vram !== -1 || currentController.vramDynamic) { // already a controller found
|
||||
if (currentController.vendor || currentController.model || currentController.bus || currentController.busAddress || currentController.vram !== null || currentController.vramDynamic) { // already a controller found
|
||||
controllers.push(currentController);
|
||||
}
|
||||
return (controllers);
|
||||
@ -349,7 +349,7 @@ function graphics(callback) {
|
||||
model: '',
|
||||
bus: '',
|
||||
busAddress,
|
||||
vram: -1,
|
||||
vram: null,
|
||||
vramDynamic: false
|
||||
};
|
||||
controllers.push(controller);
|
||||
@ -500,16 +500,16 @@ function graphics(callback) {
|
||||
main: false,
|
||||
builtin: false,
|
||||
connection: '',
|
||||
sizex: -1,
|
||||
sizey: -1,
|
||||
pixeldepth: -1,
|
||||
resolutionx: -1,
|
||||
resolutiony: -1,
|
||||
currentResX: -1,
|
||||
currentResY: -1,
|
||||
sizex: null,
|
||||
sizey: null,
|
||||
pixeldepth: null,
|
||||
resolutionx: null,
|
||||
resolutiony: null,
|
||||
currentResX: null,
|
||||
currentResY: null,
|
||||
positionX: 0,
|
||||
positionY: 0,
|
||||
currentRefreshRate: -1
|
||||
currentRefreshRate: null
|
||||
};
|
||||
// find first "Detailed Timing Description"
|
||||
let start = 108;
|
||||
@ -560,16 +560,16 @@ function graphics(callback) {
|
||||
main: false,
|
||||
builtin: false,
|
||||
connection: '',
|
||||
sizex: -1,
|
||||
sizey: -1,
|
||||
pixeldepth: -1,
|
||||
resolutionx: -1,
|
||||
resolutiony: -1,
|
||||
currentResX: -1,
|
||||
currentResY: -1,
|
||||
sizex: null,
|
||||
sizey: null,
|
||||
pixeldepth: null,
|
||||
resolutionx: null,
|
||||
resolutiony: null,
|
||||
currentResX: null,
|
||||
currentResY: null,
|
||||
positionX: 0,
|
||||
positionY: 0,
|
||||
currentRefreshRate: -1
|
||||
currentRefreshRate: null
|
||||
};
|
||||
let is_edid = false;
|
||||
let is_current = false;
|
||||
@ -586,16 +586,16 @@ function graphics(callback) {
|
||||
main: false,
|
||||
builtin: false,
|
||||
connection: '',
|
||||
sizex: -1,
|
||||
sizey: -1,
|
||||
pixeldepth: -1,
|
||||
resolutionx: -1,
|
||||
resolutiony: -1,
|
||||
currentResX: -1,
|
||||
currentResY: -1,
|
||||
sizex: null,
|
||||
sizey: null,
|
||||
pixeldepth: null,
|
||||
resolutionx: null,
|
||||
resolutiony: null,
|
||||
currentResX: null,
|
||||
currentResY: null,
|
||||
positionX: 0,
|
||||
positionY: 0,
|
||||
currentRefreshRate: -1
|
||||
currentRefreshRate: null
|
||||
};
|
||||
}
|
||||
let parts = lines[i].split(' ');
|
||||
@ -686,16 +686,16 @@ function graphics(callback) {
|
||||
main: true,
|
||||
builtin: false,
|
||||
connection: 'HDMI',
|
||||
sizex: -1,
|
||||
sizey: -1,
|
||||
pixeldepth: -1,
|
||||
sizex: null,
|
||||
sizey: null,
|
||||
pixeldepth: null,
|
||||
resolutionx: parseInt(parts[0], 10),
|
||||
resolutiony: parseInt(parts[1], 10),
|
||||
currentResX: -1,
|
||||
currentResY: -1,
|
||||
currentResX: null,
|
||||
currentResY: null,
|
||||
positionX: 0,
|
||||
positionY: 0,
|
||||
currentRefreshRate: -1
|
||||
currentRefreshRate: null
|
||||
});
|
||||
}
|
||||
}
|
||||
@ -967,8 +967,8 @@ function graphics(callback) {
|
||||
connection: videoOutputTechnology && videoTypes[videoOutputTechnology] ? videoTypes[videoOutputTechnology] : '',
|
||||
resolutionx: util.toInt(util.getValue(bounds, 'Width', '=')),
|
||||
resolutiony: util.toInt(util.getValue(bounds, 'Height', '=')),
|
||||
sizex: sizex ? parseInt(sizex, 10) : -1,
|
||||
sizey: sizey ? parseInt(sizey, 10) : -1,
|
||||
sizex: sizex ? parseInt(sizex, 10) : null,
|
||||
sizey: sizey ? parseInt(sizey, 10) : null,
|
||||
pixeldepth: bitsPerPixel,
|
||||
currentResX: util.toInt(util.getValue(bounds, 'Width', '=')),
|
||||
currentResY: util.toInt(util.getValue(bounds, 'Height', '=')),
|
||||
@ -984,9 +984,9 @@ function graphics(callback) {
|
||||
main: true,
|
||||
resolutionx,
|
||||
resolutiony,
|
||||
sizex: -1,
|
||||
sizey: -1,
|
||||
pixeldepth: -1,
|
||||
sizex: null,
|
||||
sizey: null,
|
||||
pixeldepth: null,
|
||||
currentResX: resolutionx,
|
||||
currentResY: resolutiony,
|
||||
positionX: 0,
|
||||
|
||||
8
lib/index.d.ts
vendored
8
lib/index.d.ts
vendored
@ -79,11 +79,9 @@ export namespace Systeminformation {
|
||||
performanceCores?: number;
|
||||
processors: number;
|
||||
socket: string;
|
||||
cache: CpuCacheData;
|
||||
}
|
||||
|
||||
interface CpuWithFlagsData extends CpuData {
|
||||
flags: string;
|
||||
virtualization: boolean;
|
||||
cache: CpuCacheData;
|
||||
}
|
||||
|
||||
interface CpuCacheData {
|
||||
@ -717,7 +715,7 @@ export namespace Systeminformation {
|
||||
os: OsData;
|
||||
uuid: UuidData;
|
||||
versions: VersionData;
|
||||
cpu: CpuWithFlagsData;
|
||||
cpu: CpuData;
|
||||
graphics: GraphicsData;
|
||||
net: NetworkInterfacesData[];
|
||||
memLayout: MemLayoutData[];
|
||||
|
||||
@ -51,7 +51,7 @@ function inetChecksite(url, callback) {
|
||||
url: urlSanitized,
|
||||
ok: false,
|
||||
status: 404,
|
||||
ms: -1
|
||||
ms: null
|
||||
};
|
||||
try {
|
||||
if (urlSanitized && !util.isPrototypePolluted()) {
|
||||
@ -63,7 +63,7 @@ function inetChecksite(url, callback) {
|
||||
let statusCode = parseInt(stdout.toString());
|
||||
result.status = statusCode || 404;
|
||||
result.ok = !error && (statusCode === 200 || statusCode === 301 || statusCode === 302 || statusCode === 304);
|
||||
result.ms = (result.ok ? Date.now() - t : -1);
|
||||
result.ms = (result.ok ? Date.now() - t : null);
|
||||
if (callback) { callback(result); }
|
||||
resolve(result);
|
||||
});
|
||||
@ -79,13 +79,13 @@ function inetChecksite(url, callback) {
|
||||
|
||||
if (statusCode !== 200) {
|
||||
res.resume();
|
||||
result.ms = (result.ok ? Date.now() - t : -1);
|
||||
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 : -1);
|
||||
result.ms = (result.ok ? Date.now() - t : null);
|
||||
if (callback) { callback(result); }
|
||||
resolve(result);
|
||||
});
|
||||
@ -142,7 +142,7 @@ function inetLatency(host, callback) {
|
||||
}
|
||||
|
||||
exec(cmd, function (error, stdout) {
|
||||
let result = -1;
|
||||
let result = null;
|
||||
if (!error) {
|
||||
const line = stdout.toString().split('=');
|
||||
if (line.length > 1) {
|
||||
@ -158,7 +158,7 @@ function inetLatency(host, callback) {
|
||||
}
|
||||
if (_sunos) {
|
||||
exec('ping -s -a ' + hostSanitized + ' 56 2 | grep avg', { timeout: 3000 }, function (error, stdout) {
|
||||
let result = -1;
|
||||
let result = null;
|
||||
if (!error) {
|
||||
const line = stdout.toString().split('=');
|
||||
if (line.length > 1) {
|
||||
@ -173,7 +173,7 @@ function inetLatency(host, callback) {
|
||||
});
|
||||
}
|
||||
if (_windows) {
|
||||
let result = -1;
|
||||
let result = null;
|
||||
try {
|
||||
exec('ping ' + hostSanitized + ' -n 1', util.execOptsWin, function (error, stdout) {
|
||||
if (!error) {
|
||||
|
||||
@ -291,14 +291,14 @@ function memLayout(callback) {
|
||||
size,
|
||||
bank: util.getValue(lines, 'Bank Locator'),
|
||||
type: util.getValue(lines, 'Type:'),
|
||||
clockSpeed: (util.getValue(lines, 'Configured Clock Speed:') ? parseInt(util.getValue(lines, 'Configured Clock Speed:'), 10) : (util.getValue(lines, 'Speed:') ? parseInt(util.getValue(lines, 'Speed:'), 10) : -1)),
|
||||
clockSpeed: (util.getValue(lines, 'Configured Clock Speed:') ? parseInt(util.getValue(lines, 'Configured Clock Speed:'), 10) : (util.getValue(lines, 'Speed:') ? parseInt(util.getValue(lines, 'Speed:'), 10) : null)),
|
||||
formFactor: util.getValue(lines, 'Form Factor:'),
|
||||
manufacturer: util.getValue(lines, 'Manufacturer:'),
|
||||
partNum: util.getValue(lines, 'Part Number:'),
|
||||
serialNum: util.getValue(lines, 'Serial Number:'),
|
||||
voltageConfigured: parseFloat(util.getValue(lines, 'Configured Voltage:') || -1),
|
||||
voltageMin: parseFloat(util.getValue(lines, 'Minimum Voltage:') || -1),
|
||||
voltageMax: parseFloat(util.getValue(lines, 'Maximum Voltage:') || -1),
|
||||
voltageConfigured: parseFloat(util.getValue(lines, 'Configured Voltage:') || null),
|
||||
voltageMin: parseFloat(util.getValue(lines, 'Minimum Voltage:') || null),
|
||||
voltageMax: parseFloat(util.getValue(lines, 'Maximum Voltage:') || null),
|
||||
});
|
||||
} else {
|
||||
result.push({
|
||||
@ -309,9 +309,9 @@ function memLayout(callback) {
|
||||
formFactor: util.getValue(lines, 'Form Factor:'),
|
||||
partNum: '',
|
||||
serialNum: '',
|
||||
voltageConfigured: -1,
|
||||
voltageMin: -1,
|
||||
voltageMax: -1,
|
||||
voltageConfigured: null,
|
||||
voltageMin: null,
|
||||
voltageMax: null,
|
||||
});
|
||||
}
|
||||
});
|
||||
@ -325,9 +325,9 @@ function memLayout(callback) {
|
||||
formFactor: '',
|
||||
partNum: '',
|
||||
serialNum: '',
|
||||
voltageConfigured: -1,
|
||||
voltageMin: -1,
|
||||
voltageMax: -1,
|
||||
voltageConfigured: null,
|
||||
voltageMin: null,
|
||||
voltageMax: null,
|
||||
});
|
||||
|
||||
// Try Raspberry PI
|
||||
@ -401,9 +401,9 @@ function memLayout(callback) {
|
||||
manufacturer: getManufacturer(util.getValue(lines, ' Manufacturer:')),
|
||||
partNum: util.getValue(lines, ' Part Number:'),
|
||||
serialNum: util.getValue(lines, ' Serial Number:'),
|
||||
voltageConfigured: -1,
|
||||
voltageMin: -1,
|
||||
voltageMax: -1,
|
||||
voltageConfigured: null,
|
||||
voltageMin: null,
|
||||
voltageMax: null,
|
||||
});
|
||||
} else {
|
||||
result.push({
|
||||
@ -415,9 +415,9 @@ function memLayout(callback) {
|
||||
manufacturer: '',
|
||||
partNum: '',
|
||||
serialNum: '',
|
||||
voltageConfigured: -1,
|
||||
voltageMin: -1,
|
||||
voltageMax: -1,
|
||||
voltageConfigured: null,
|
||||
voltageMin: null,
|
||||
voltageMax: null,
|
||||
});
|
||||
}
|
||||
});
|
||||
@ -436,9 +436,9 @@ function memLayout(callback) {
|
||||
manufacturer: 'Apple',
|
||||
partNum: '',
|
||||
serialNum: '',
|
||||
voltageConfigured: -1,
|
||||
voltageMin: -1,
|
||||
voltageMax: -1,
|
||||
voltageConfigured: null,
|
||||
voltageMin: null,
|
||||
voltageMax: null,
|
||||
});
|
||||
|
||||
}
|
||||
|
||||
489
lib/network.js
489
lib/network.js
@ -105,9 +105,9 @@ function getDefaultNetworkInterface() {
|
||||
}
|
||||
if (_darwin || _freebsd || _openbsd || _netbsd || _sunos) {
|
||||
let cmd = '';
|
||||
if (_linux) cmd = 'ip route 2> /dev/null | grep default | awk \'{print $5}\'';
|
||||
if (_darwin) cmd = 'route -n get default 2>/dev/null | grep interface: | awk \'{print $2}\'';
|
||||
if (_freebsd || _openbsd || _netbsd || _sunos) cmd = 'route get 0.0.0.0 | grep interface:';
|
||||
if (_linux) { cmd = 'ip route 2> /dev/null | grep default | awk \'{print $5}\''; }
|
||||
if (_darwin) { cmd = 'route -n get default 2>/dev/null | grep interface: | awk \'{print $2}\''; }
|
||||
if (_freebsd || _openbsd || _netbsd || _sunos) { cmd = 'route get 0.0.0.0 | grep interface:'; }
|
||||
let result = execSync(cmd);
|
||||
ifacename = result.toString().split('\n')[0];
|
||||
if (ifacename.indexOf(':') > -1) {
|
||||
@ -117,7 +117,7 @@ function getDefaultNetworkInterface() {
|
||||
} catch (e) {
|
||||
util.noop();
|
||||
}
|
||||
if (ifacename) _default_iface = ifacename;
|
||||
if (ifacename) { _default_iface = ifacename; }
|
||||
return _default_iface;
|
||||
}
|
||||
|
||||
@ -227,7 +227,7 @@ function parseLinesWindowsNics(sections, nconfigsections) {
|
||||
dhcp: util.getValue(linesNicConfig, 'dhcpEnabled', '=').toLowerCase(),
|
||||
name: util.getValue(lines, 'Name', '=').replace(/\]/g, ')').replace(/\[/g, '('),
|
||||
netEnabled: netEnabled === 'TRUE',
|
||||
speed: isNaN(speed) ? -1 : speed,
|
||||
speed: isNaN(speed) ? null : speed,
|
||||
operstate: util.getValue(lines, 'NetConnectionStatus', '=') === '2' ? 'up' : 'down',
|
||||
type: util.getValue(lines, 'AdapterTypeID', '=') === '9' ? 'wireless' : 'wired'
|
||||
});
|
||||
@ -272,7 +272,7 @@ function getWindowsDNSsuffixes() {
|
||||
});
|
||||
const primaryDNS = longPrimaryDNS[0].substring(longPrimaryDNS[0].lastIndexOf(':') + 1);
|
||||
dnsSuffixes.primaryDNS = primaryDNS.trim();
|
||||
if (!dnsSuffixes.primaryDNS) dnsSuffixes.primaryDNS = 'Not defined';
|
||||
if (!dnsSuffixes.primaryDNS) { dnsSuffixes.primaryDNS = 'Not defined'; }
|
||||
}
|
||||
if (index > 1) {
|
||||
if (index % 2 == 0) {
|
||||
@ -312,7 +312,7 @@ function getWindowsIfaceDNSsuffix(ifaces, ifacename) {
|
||||
if (connectionDnsSuffix[0]) {
|
||||
dnsSuffix = connectionDnsSuffix[0];
|
||||
}
|
||||
if (!dnsSuffix) dnsSuffix = '';
|
||||
if (!dnsSuffix) { dnsSuffix = ''; }
|
||||
return dnsSuffix;
|
||||
} catch (error) {
|
||||
// console.log('Error getting Connection-specific DNS suffix: ', error.message);
|
||||
@ -434,11 +434,11 @@ function parseLinesDarwinNics(sections) {
|
||||
sections.forEach(section => {
|
||||
let nic = {
|
||||
iface: '',
|
||||
mtu: -1,
|
||||
mtu: null,
|
||||
mac: '',
|
||||
ip6: '',
|
||||
ip4: '',
|
||||
speed: -1,
|
||||
speed: null,
|
||||
type: '',
|
||||
operstate: '',
|
||||
duplex: '',
|
||||
@ -447,9 +447,9 @@ function parseLinesDarwinNics(sections) {
|
||||
const first = section[0];
|
||||
nic.iface = first.split(':')[0].trim();
|
||||
let parts = first.split('> mtu');
|
||||
nic.mtu = parts.length > 1 ? parseInt(parts[1], 10) : -1;
|
||||
nic.mtu = parts.length > 1 ? parseInt(parts[1], 10) : null;
|
||||
if (isNaN(nic.mtu)) {
|
||||
nic.mtu = -1;
|
||||
nic.mtu = null;
|
||||
}
|
||||
nic.internal = parts[0].toLowerCase().indexOf('loopback') > -1;
|
||||
section.forEach(line => {
|
||||
@ -464,11 +464,11 @@ function parseLinesDarwinNics(sections) {
|
||||
}
|
||||
});
|
||||
let speed = util.getValue(section, 'link rate');
|
||||
nic.speed = speed ? parseFloat(speed) : -1;
|
||||
if (nic.speed === -1) {
|
||||
nic.speed = speed ? parseFloat(speed) : null;
|
||||
if (nic.speed === null) {
|
||||
speed = util.getValue(section, 'uplink rate');
|
||||
nic.speed = speed ? parseFloat(speed) : -1;
|
||||
if (nic.speed > -1 && speed.toLowerCase().indexOf('gbps') >= 0) {
|
||||
nic.speed = speed ? parseFloat(speed) : null;
|
||||
if (nic.speed > null && speed.toLowerCase().indexOf('gbps') >= 0) {
|
||||
nic.speed = nic.speed * 1000;
|
||||
}
|
||||
} else {
|
||||
@ -579,7 +579,7 @@ function parseLinuxDHCPNics(sections) {
|
||||
function getLinuxIfaceDHCPstatus(iface, connectionName, DHCPNics) {
|
||||
let result = false;
|
||||
if (connectionName) {
|
||||
const cmd = `nmcli connection show "${connectionName}" 2>/dev/null \| grep ipv4.method;`;
|
||||
const cmd = `nmcli connection show "${connectionName}" 2>/dev/null | grep ipv4.method;`;
|
||||
try {
|
||||
const lines = execSync(cmd).toString();
|
||||
const resultFormat = lines.replace(/\s+/g, ' ').trim();
|
||||
@ -605,7 +605,7 @@ function getLinuxIfaceDHCPstatus(iface, connectionName, DHCPNics) {
|
||||
|
||||
function getDarwinIfaceDHCPstatus(iface) {
|
||||
let result = false;
|
||||
const cmd = `ipconfig getpacket "${iface}" 2>/dev/null \| grep lease_time;`;
|
||||
const cmd = `ipconfig getpacket "${iface}" 2>/dev/null | grep lease_time;`;
|
||||
try {
|
||||
const lines = execSync(cmd).toString().split('\n');
|
||||
if (lines.length && lines[0].startsWith('lease_time')) {
|
||||
@ -619,7 +619,7 @@ function getDarwinIfaceDHCPstatus(iface) {
|
||||
|
||||
function getLinuxIfaceDNSsuffix(connectionName) {
|
||||
if (connectionName) {
|
||||
const cmd = `nmcli connection show "${connectionName}" 2>/dev/null \| grep ipv4.dns-search;`;
|
||||
const cmd = `nmcli connection show "${connectionName}" 2>/dev/null | grep ipv4.dns-search;`;
|
||||
try {
|
||||
const result = execSync(cmd).toString();
|
||||
const resultFormat = result.replace(/\s+/g, ' ').trim();
|
||||
@ -635,7 +635,7 @@ function getLinuxIfaceDNSsuffix(connectionName) {
|
||||
|
||||
function getLinuxIfaceIEEE8021xAuth(connectionName) {
|
||||
if (connectionName) {
|
||||
const cmd = `nmcli connection show "${connectionName}" 2>/dev/null \| grep 802-1x.eap;`;
|
||||
const cmd = `nmcli connection show "${connectionName}" 2>/dev/null | grep 802-1x.eap;`;
|
||||
try {
|
||||
const result = execSync(cmd).toString();
|
||||
const resultFormat = result.replace(/\s+/g, ' ').trim();
|
||||
@ -674,7 +674,7 @@ function testVirtualNic(iface, ifaceName, mac) {
|
||||
ifaceName.toLowerCase().startsWith('veth') ||
|
||||
iface.toLowerCase().startsWith('vboxnet') ||
|
||||
ifaceName.toLowerCase().startsWith('vboxnet');
|
||||
} else return false;
|
||||
} else { return false; }
|
||||
}
|
||||
|
||||
function networkInterfaces(callback, rescan = true) {
|
||||
@ -685,133 +685,132 @@ function networkInterfaces(callback, rescan = true) {
|
||||
}
|
||||
return new Promise((resolve) => {
|
||||
process.nextTick(() => {
|
||||
let ifaces = os.networkInterfaces();
|
||||
|
||||
let result = [];
|
||||
let nics = [];
|
||||
let dnsSuffixes = [];
|
||||
let nics8021xInfo = [];
|
||||
try {
|
||||
let ifaces = os.networkInterfaces();
|
||||
|
||||
// seperate handling in OSX
|
||||
if (_darwin || _freebsd || _openbsd || _netbsd) {
|
||||
nics = getDarwinNics();
|
||||
// seperate handling in OSX
|
||||
if (_darwin || _freebsd || _openbsd || _netbsd) {
|
||||
nics = getDarwinNics();
|
||||
|
||||
|
||||
nics.forEach(nic => {
|
||||
nics.forEach(nic => {
|
||||
|
||||
if ({}.hasOwnProperty.call(ifaces, nic.iface)) {
|
||||
ifaces[nic.iface].forEach(function (details) {
|
||||
if (details.family === 'IPv4') {
|
||||
nic.ip4subnet = details.netmask;
|
||||
}
|
||||
if (details.family === 'IPv6') {
|
||||
nic.ip6subnet = details.netmask;
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
result.push({
|
||||
iface: nic.iface,
|
||||
ifaceName: nic.iface,
|
||||
ip4: nic.ip4,
|
||||
ip4subnet: nic.ip4subnet || '',
|
||||
ip6: nic.ip6,
|
||||
ip6subnet: nic.ip6subnet || '',
|
||||
mac: nic.mac,
|
||||
internal: nic.internal,
|
||||
virtual: nic.internal ? false : testVirtualNic(nic.iface, nic.iface, nic.mac),
|
||||
operstate: nic.operstate,
|
||||
type: nic.type,
|
||||
duplex: nic.duplex,
|
||||
mtu: nic.mtu,
|
||||
speed: nic.speed,
|
||||
dhcp: getDarwinIfaceDHCPstatus(nic.iface),
|
||||
dnsSuffix: '',
|
||||
ieee8021xAuth: '',
|
||||
ieee8021xState: '',
|
||||
carrierChanges: 0
|
||||
if ({}.hasOwnProperty.call(ifaces, nic.iface)) {
|
||||
ifaces[nic.iface].forEach(function (details) {
|
||||
if (details.family === 'IPv4') {
|
||||
nic.ip4subnet = details.netmask;
|
||||
}
|
||||
if (details.family === 'IPv6') {
|
||||
nic.ip6subnet = details.netmask;
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
result.push({
|
||||
iface: nic.iface,
|
||||
ifaceName: nic.iface,
|
||||
ip4: nic.ip4,
|
||||
ip4subnet: nic.ip4subnet || '',
|
||||
ip6: nic.ip6,
|
||||
ip6subnet: nic.ip6subnet || '',
|
||||
mac: nic.mac,
|
||||
internal: nic.internal,
|
||||
virtual: nic.internal ? false : testVirtualNic(nic.iface, nic.iface, nic.mac),
|
||||
operstate: nic.operstate,
|
||||
type: nic.type,
|
||||
duplex: nic.duplex,
|
||||
mtu: nic.mtu,
|
||||
speed: nic.speed,
|
||||
dhcp: getDarwinIfaceDHCPstatus(nic.iface),
|
||||
dnsSuffix: '',
|
||||
ieee8021xAuth: '',
|
||||
ieee8021xState: '',
|
||||
carrierChanges: 0
|
||||
});
|
||||
_networkInterfaces = result;
|
||||
});
|
||||
_networkInterfaces = result;
|
||||
if (callback) { callback(result); }
|
||||
resolve(result);
|
||||
} else {
|
||||
if ((JSON.stringify(ifaces) === JSON.stringify(_ifaces)) && !rescan) {
|
||||
// no changes - just return object
|
||||
result = _networkInterfaces;
|
||||
|
||||
if (callback) { callback(result); }
|
||||
resolve(result);
|
||||
} else {
|
||||
if ((JSON.stringify(ifaces) === JSON.stringify(_ifaces)) && !rescan) {
|
||||
// no changes - just return object
|
||||
result = _networkInterfaces;
|
||||
|
||||
if (callback) { callback(result); }
|
||||
resolve(result);
|
||||
} else {
|
||||
_ifaces = Object.assign({}, ifaces);
|
||||
|
||||
if (_windows) {
|
||||
nics = getWindowsNics();
|
||||
nics.forEach(nic => {
|
||||
let found = false;
|
||||
Object.keys(ifaces).forEach(key => {
|
||||
if (!found) {
|
||||
ifaces[key].forEach(value => {
|
||||
if (Object.keys(value).indexOf('mac') >= 0) {
|
||||
found = value['mac'] === nic.mac;
|
||||
}
|
||||
});
|
||||
}
|
||||
});
|
||||
_ifaces = Object.assign({}, ifaces);
|
||||
|
||||
if (_windows) {
|
||||
nics = getWindowsNics();
|
||||
nics.forEach(nic => {
|
||||
let found = false;
|
||||
Object.keys(ifaces).forEach(key => {
|
||||
if (!found) {
|
||||
ifaces[nic.name] = [{ mac: nic.mac }];
|
||||
ifaces[key].forEach(value => {
|
||||
if (Object.keys(value).indexOf('mac') >= 0) {
|
||||
found = value['mac'] === nic.mac;
|
||||
}
|
||||
});
|
||||
}
|
||||
});
|
||||
|
||||
nics8021xInfo = getWindowsWiredProfilesInformation();
|
||||
dnsSuffixes = getWindowsDNSsuffixes();
|
||||
}
|
||||
if (_linux) {
|
||||
_dhcpNics = getLinuxDHCPNics();
|
||||
}
|
||||
for (let dev in ifaces) {
|
||||
let ip4 = '';
|
||||
let ip4subnet = '';
|
||||
let ip6 = '';
|
||||
let ip6subnet = '';
|
||||
let mac = '';
|
||||
let duplex = '';
|
||||
let mtu = '';
|
||||
let speed = -1;
|
||||
let carrierChanges = 0;
|
||||
let operstate = 'down';
|
||||
let dhcp = false;
|
||||
let dnsSuffix = '';
|
||||
let ieee8021xAuth = '';
|
||||
let ieee8021xState = '';
|
||||
let type = '';
|
||||
if (!found) {
|
||||
ifaces[nic.name] = [{ mac: nic.mac }];
|
||||
}
|
||||
});
|
||||
|
||||
if ({}.hasOwnProperty.call(ifaces, dev)) {
|
||||
let ifaceName = dev;
|
||||
ifaces[dev].forEach(function (details) {
|
||||
if (details.family === 'IPv4') {
|
||||
ip4 = details.address;
|
||||
ip4subnet = details.netmask;
|
||||
nics8021xInfo = getWindowsWiredProfilesInformation();
|
||||
dnsSuffixes = getWindowsDNSsuffixes();
|
||||
}
|
||||
if (_linux) {
|
||||
_dhcpNics = getLinuxDHCPNics();
|
||||
}
|
||||
for (let dev in ifaces) {
|
||||
let ip4 = '';
|
||||
let ip4subnet = '';
|
||||
let ip6 = '';
|
||||
let ip6subnet = '';
|
||||
let mac = '';
|
||||
let duplex = '';
|
||||
let mtu = '';
|
||||
let speed = null;
|
||||
let carrierChanges = 0;
|
||||
let operstate = 'down';
|
||||
let dhcp = false;
|
||||
let dnsSuffix = '';
|
||||
let ieee8021xAuth = '';
|
||||
let ieee8021xState = '';
|
||||
let type = '';
|
||||
|
||||
if ({}.hasOwnProperty.call(ifaces, dev)) {
|
||||
let ifaceName = dev;
|
||||
ifaces[dev].forEach(function (details) {
|
||||
if (details.family === 'IPv4') {
|
||||
ip4 = details.address;
|
||||
ip4subnet = details.netmask;
|
||||
}
|
||||
if (details.family === 'IPv6') {
|
||||
if (!ip6 || ip6.match(/^fe80::/i)) {
|
||||
ip6 = details.address;
|
||||
ip6subnet = details.netmask;
|
||||
}
|
||||
if (details.family === 'IPv6') {
|
||||
if (!ip6 || ip6.match(/^fe80::/i)) {
|
||||
ip6 = details.address;
|
||||
ip6subnet = details.netmask;
|
||||
}
|
||||
}
|
||||
mac = details.mac;
|
||||
// fallback due to https://github.com/nodejs/node/issues/13581 (node 8.1 - node 8.2)
|
||||
if (mac.indexOf('00:00:0') > -1 && (_linux || _darwin) && parseInt(process.versions.node.split('.'), 10) === 8) {
|
||||
if (Object.keys(_mac).length === 0) {
|
||||
_mac = getMacAddresses();
|
||||
}
|
||||
mac = details.mac;
|
||||
// fallback due to https://github.com/nodejs/node/issues/13581 (node 8.1 - node 8.2)
|
||||
if (mac.indexOf('00:00:0') > -1 && (_linux || _darwin) && parseInt(process.versions.node.split('.'), 10) === 8) {
|
||||
if (Object.keys(_mac).length === 0) {
|
||||
_mac = getMacAddresses();
|
||||
}
|
||||
mac = _mac[dev] || '';
|
||||
}
|
||||
});
|
||||
if (_linux) {
|
||||
let iface = dev.split(':')[0].trim().toLowerCase();
|
||||
const cmd = `echo -n "addr_assign_type: "; cat /sys/class/net/${iface}/addr_assign_type 2>/dev/null; echo;
|
||||
mac = _mac[dev] || '';
|
||||
}
|
||||
});
|
||||
if (_linux) {
|
||||
let iface = dev.split(':')[0].trim().toLowerCase();
|
||||
const cmd = `echo -n "addr_assign_type: "; cat /sys/class/net/${iface}/addr_assign_type 2>/dev/null; echo;
|
||||
echo -n "address: "; cat /sys/class/net/${iface}/address 2>/dev/null; echo;
|
||||
echo -n "addr_len: "; cat /sys/class/net/${iface}/addr_len 2>/dev/null; echo;
|
||||
echo -n "broadcast: "; cat /sys/class/net/${iface}/broadcast 2>/dev/null; echo;
|
||||
@ -834,93 +833,89 @@ function networkInterfaces(callback, rescan = true) {
|
||||
echo -n "speed: "; cat /sys/class/net/${iface}/speed 2>/dev/null; echo;
|
||||
echo -n "tx_queue_len: "; cat /sys/class/net/${iface}/tx_queue_len 2>/dev/null; echo;
|
||||
echo -n "type: "; cat /sys/class/net/${iface}/type 2>/dev/null; echo;
|
||||
echo -n "wireless: "; cat /proc/net/wireless 2>/dev/null \| grep ${iface}; echo;
|
||||
echo -n "wirelessspeed: "; iw dev ${iface} link 2>&1 \| grep bitrate; echo;`;
|
||||
echo -n "wireless: "; cat /proc/net/wireless 2>/dev/null | grep ${iface}; echo;
|
||||
echo -n "wirelessspeed: "; iw dev ${iface} link 2>&1 | grep bitrate; echo;`;
|
||||
|
||||
let lines = [];
|
||||
try {
|
||||
lines = execSync(cmd).toString().split('\n');
|
||||
const connectionName = getLinuxIfaceConnectionName(iface);
|
||||
dhcp = getLinuxIfaceDHCPstatus(iface, connectionName, _dhcpNics);
|
||||
dnsSuffix = getLinuxIfaceDNSsuffix(connectionName);
|
||||
ieee8021xAuth = getLinuxIfaceIEEE8021xAuth(connectionName);
|
||||
ieee8021xState = getLinuxIfaceIEEE8021xState(ieee8021xAuth);
|
||||
} catch (e) {
|
||||
util.noop();
|
||||
}
|
||||
duplex = util.getValue(lines, 'duplex');
|
||||
duplex = duplex.startsWith('cat') ? '' : duplex;
|
||||
mtu = parseInt(util.getValue(lines, 'mtu'), 10);
|
||||
let myspeed = parseInt(util.getValue(lines, 'speed'), 10);
|
||||
speed = isNaN(myspeed) ? -1 : myspeed;
|
||||
let wirelessspeed = util.getValue(lines, 'wirelessspeed').split('tx bitrate: ');
|
||||
if (speed === -1 && wirelessspeed.length === 2) {
|
||||
myspeed = parseFloat(wirelessspeed[1]);
|
||||
speed = isNaN(myspeed) ? -1 : myspeed;
|
||||
}
|
||||
carrierChanges = parseInt(util.getValue(lines, 'carrier_changes'), 10);
|
||||
operstate = util.getValue(lines, 'operstate');
|
||||
type = operstate === 'up' ? (util.getValue(lines, 'wireless').trim() ? 'wireless' : 'wired') : 'unknown';
|
||||
if (iface === 'lo' || iface.startsWith('bond')) { type = 'virtual'; }
|
||||
let lines = [];
|
||||
try {
|
||||
lines = execSync(cmd).toString().split('\n');
|
||||
const connectionName = getLinuxIfaceConnectionName(iface);
|
||||
dhcp = getLinuxIfaceDHCPstatus(iface, connectionName, _dhcpNics);
|
||||
dnsSuffix = getLinuxIfaceDNSsuffix(connectionName);
|
||||
ieee8021xAuth = getLinuxIfaceIEEE8021xAuth(connectionName);
|
||||
ieee8021xState = getLinuxIfaceIEEE8021xState(ieee8021xAuth);
|
||||
} catch (e) {
|
||||
util.noop();
|
||||
}
|
||||
if (_windows) {
|
||||
|
||||
|
||||
dnsSuffix = getWindowsIfaceDNSsuffix(dnsSuffixes.ifaces, dev);
|
||||
nics.forEach(detail => {
|
||||
if (detail.mac === mac) {
|
||||
ifaceName = detail.name;
|
||||
dhcp = detail.dhcp;
|
||||
operstate = detail.operstate;
|
||||
speed = detail.speed;
|
||||
type = detail.type;
|
||||
}
|
||||
});
|
||||
|
||||
if (dev.toLowerCase().indexOf('wlan') >= 0 || ifaceName.toLowerCase().indexOf('wlan') >= 0 || ifaceName.toLowerCase().indexOf('802.11n') >= 0 || ifaceName.toLowerCase().indexOf('wireless') >= 0 || ifaceName.toLowerCase().indexOf('wi-fi') >= 0 || ifaceName.toLowerCase().indexOf('wifi') >= 0) {
|
||||
type = 'wireless';
|
||||
}
|
||||
|
||||
const IEEE8021x = getWindowsIEEE8021x(type, dev, nics8021xInfo);
|
||||
ieee8021xAuth = IEEE8021x.protocol;
|
||||
ieee8021xState = IEEE8021x.state;
|
||||
duplex = util.getValue(lines, 'duplex');
|
||||
duplex = duplex.startsWith('cat') ? '' : duplex;
|
||||
mtu = parseInt(util.getValue(lines, 'mtu'), 10);
|
||||
let myspeed = parseInt(util.getValue(lines, 'speed'), 10);
|
||||
speed = isNaN(myspeed) ? null : myspeed;
|
||||
let wirelessspeed = util.getValue(lines, 'wirelessspeed').split('tx bitrate: ');
|
||||
if (speed === null && wirelessspeed.length === 2) {
|
||||
myspeed = parseFloat(wirelessspeed[1]);
|
||||
speed = isNaN(myspeed) ? null : myspeed;
|
||||
}
|
||||
let internal = (ifaces[dev] && ifaces[dev][0]) ? ifaces[dev][0].internal : false;
|
||||
if (dev.toLowerCase().indexOf('loopback') > -1 || ifaceName.toLowerCase().indexOf('loopback') > -1) {
|
||||
internal = true;
|
||||
}
|
||||
const virtual = internal ? false : testVirtualNic(dev, ifaceName, mac);
|
||||
result.push({
|
||||
iface: dev,
|
||||
ifaceName,
|
||||
ip4,
|
||||
ip4subnet,
|
||||
ip6,
|
||||
ip6subnet,
|
||||
mac,
|
||||
internal,
|
||||
virtual,
|
||||
operstate,
|
||||
type,
|
||||
duplex,
|
||||
mtu,
|
||||
speed,
|
||||
dhcp,
|
||||
dnsSuffix,
|
||||
ieee8021xAuth,
|
||||
ieee8021xState,
|
||||
carrierChanges,
|
||||
});
|
||||
carrierChanges = parseInt(util.getValue(lines, 'carrier_changes'), 10);
|
||||
operstate = util.getValue(lines, 'operstate');
|
||||
type = operstate === 'up' ? (util.getValue(lines, 'wireless').trim() ? 'wireless' : 'wired') : 'unknown';
|
||||
if (iface === 'lo' || iface.startsWith('bond')) { type = 'virtual'; }
|
||||
}
|
||||
if (_windows) {
|
||||
|
||||
|
||||
dnsSuffix = getWindowsIfaceDNSsuffix(dnsSuffixes.ifaces, dev);
|
||||
nics.forEach(detail => {
|
||||
if (detail.mac === mac) {
|
||||
ifaceName = detail.name;
|
||||
dhcp = detail.dhcp;
|
||||
operstate = detail.operstate;
|
||||
speed = detail.speed;
|
||||
type = detail.type;
|
||||
}
|
||||
});
|
||||
|
||||
if (dev.toLowerCase().indexOf('wlan') >= 0 || ifaceName.toLowerCase().indexOf('wlan') >= 0 || ifaceName.toLowerCase().indexOf('802.11n') >= 0 || ifaceName.toLowerCase().indexOf('wireless') >= 0 || ifaceName.toLowerCase().indexOf('wi-fi') >= 0 || ifaceName.toLowerCase().indexOf('wifi') >= 0) {
|
||||
type = 'wireless';
|
||||
}
|
||||
|
||||
const IEEE8021x = getWindowsIEEE8021x(type, dev, nics8021xInfo);
|
||||
ieee8021xAuth = IEEE8021x.protocol;
|
||||
ieee8021xState = IEEE8021x.state;
|
||||
}
|
||||
let internal = (ifaces[dev] && ifaces[dev][0]) ? ifaces[dev][0].internal : false;
|
||||
if (dev.toLowerCase().indexOf('loopback') > -1 || ifaceName.toLowerCase().indexOf('loopback') > -1) {
|
||||
internal = true;
|
||||
}
|
||||
const virtual = internal ? false : testVirtualNic(dev, ifaceName, mac);
|
||||
result.push({
|
||||
iface: dev,
|
||||
ifaceName,
|
||||
ip4,
|
||||
ip4subnet,
|
||||
ip6,
|
||||
ip6subnet,
|
||||
mac,
|
||||
internal,
|
||||
virtual,
|
||||
operstate,
|
||||
type,
|
||||
duplex,
|
||||
mtu,
|
||||
speed,
|
||||
dhcp,
|
||||
dnsSuffix,
|
||||
ieee8021xAuth,
|
||||
ieee8021xState,
|
||||
carrierChanges,
|
||||
});
|
||||
}
|
||||
_networkInterfaces = result;
|
||||
if (callback) { callback(result); }
|
||||
resolve(result);
|
||||
}
|
||||
_networkInterfaces = result;
|
||||
if (callback) { callback(result); }
|
||||
resolve(result);
|
||||
}
|
||||
} catch (e) {
|
||||
if (callback) { callback(result); }
|
||||
resolve(result);
|
||||
}
|
||||
});
|
||||
});
|
||||
@ -941,8 +936,8 @@ function calcNetworkSpeed(iface, rx_bytes, tx_bytes, operstate, rx_dropped, rx_e
|
||||
tx_bytes,
|
||||
tx_dropped,
|
||||
tx_errors,
|
||||
rx_sec: -1,
|
||||
tx_sec: -1,
|
||||
rx_sec: null,
|
||||
tx_sec: null,
|
||||
ms: 0
|
||||
};
|
||||
|
||||
@ -958,11 +953,11 @@ function calcNetworkSpeed(iface, rx_bytes, tx_bytes, operstate, rx_dropped, rx_e
|
||||
_network[iface].last_ms = result.ms;
|
||||
_network[iface].operstate = operstate;
|
||||
} else {
|
||||
if (!_network[iface]) _network[iface] = {};
|
||||
if (!_network[iface]) { _network[iface] = {}; }
|
||||
_network[iface].rx_bytes = rx_bytes;
|
||||
_network[iface].tx_bytes = tx_bytes;
|
||||
_network[iface].rx_sec = -1;
|
||||
_network[iface].tx_sec = -1;
|
||||
_network[iface].rx_sec = null;
|
||||
_network[iface].tx_sec = null;
|
||||
_network[iface].ms = Date.now();
|
||||
_network[iface].last_ms = 0;
|
||||
_network[iface].operstate = operstate;
|
||||
@ -1029,7 +1024,7 @@ function networkStatsSingle(iface) {
|
||||
if (sections[i].trim() !== '') {
|
||||
let lines = sections[i].trim().split('\r\n');
|
||||
perfData.push({
|
||||
name: util.getValue(lines, 'Name', '=').replace(/[()\[\] ]+/g, '').replace('#', '_').toLowerCase(),
|
||||
name: util.getValue(lines, 'Name', '=').replace(/[()[\] ]+/g, '').replace('#', '_').toLowerCase(),
|
||||
rx_bytes: parseInt(util.getValue(lines, 'BytesReceivedPersec', '='), 10),
|
||||
rx_errors: parseInt(util.getValue(lines, 'PacketsReceivedErrors', '='), 10),
|
||||
rx_dropped: parseInt(util.getValue(lines, 'PacketsReceivedDiscarded', '='), 10),
|
||||
@ -1062,8 +1057,8 @@ function networkStatsSingle(iface) {
|
||||
tx_bytes: 0,
|
||||
tx_dropped: 0,
|
||||
tx_errors: 0,
|
||||
rx_sec: -1,
|
||||
tx_sec: -1,
|
||||
rx_sec: null,
|
||||
tx_sec: null,
|
||||
ms: 0
|
||||
};
|
||||
|
||||
@ -1180,8 +1175,8 @@ function networkStatsSingle(iface) {
|
||||
det.mac.toLowerCase() === ifaceSanitized.toLowerCase() ||
|
||||
det.ip4.toLowerCase() === ifaceSanitized.toLowerCase() ||
|
||||
det.ip6.toLowerCase() === ifaceSanitized.toLowerCase() ||
|
||||
det.ifaceName.replace(/[()\[\] ]+/g, '').replace('#', '_').toLowerCase() === ifaceSanitized.replace(/[()\[\] ]+/g, '').replace('#', '_').toLowerCase()) &&
|
||||
(det.ifaceName.replace(/[()\[\] ]+/g, '').replace('#', '_').toLowerCase() === detail.name)) {
|
||||
det.ifaceName.replace(/[()[\] ]+/g, '').replace('#', '_').toLowerCase() === ifaceSanitized.replace(/[()[\] ]+/g, '').replace('#', '_').toLowerCase()) &&
|
||||
(det.ifaceName.replace(/[()[\] ]+/g, '').replace('#', '_').toLowerCase() === detail.name)) {
|
||||
ifaceName = det.iface;
|
||||
rx_bytes = detail.rx_bytes;
|
||||
rx_dropped = detail.rx_dropped;
|
||||
@ -1225,7 +1220,7 @@ function networkConnections(callback) {
|
||||
let result = [];
|
||||
if (_linux || _freebsd || _openbsd || _netbsd) {
|
||||
let cmd = 'export LC_ALL=C; netstat -tunap | grep "ESTABLISHED\\|SYN_SENT\\|SYN_RECV\\|FIN_WAIT1\\|FIN_WAIT2\\|TIME_WAIT\\|CLOSE\\|CLOSE_WAIT\\|LAST_ACK\\|LISTEN\\|CLOSING\\|UNKNOWN"; unset LC_ALL';
|
||||
if (_freebsd || _openbsd || _netbsd) cmd = 'export LC_ALL=C; netstat -na | grep "ESTABLISHED\\|SYN_SENT\\|SYN_RECV\\|FIN_WAIT1\\|FIN_WAIT2\\|TIME_WAIT\\|CLOSE\\|CLOSE_WAIT\\|LAST_ACK\\|LISTEN\\|CLOSING\\|UNKNOWN"; unset LC_ALL';
|
||||
if (_freebsd || _openbsd || _netbsd) { cmd = 'export LC_ALL=C; netstat -na | grep "ESTABLISHED\\|SYN_SENT\\|SYN_RECV\\|FIN_WAIT1\\|FIN_WAIT2\\|TIME_WAIT\\|CLOSE\\|CLOSE_WAIT\\|LAST_ACK\\|LISTEN\\|CLOSING\\|UNKNOWN"; unset LC_ALL'; }
|
||||
exec(cmd, { maxBuffer: 1024 * 20000 }, function (error, stdout) {
|
||||
let lines = stdout.toString().split('\n');
|
||||
if (!error && (lines.length > 1 || lines[0] != '')) {
|
||||
@ -1255,12 +1250,12 @@ function networkConnections(callback) {
|
||||
if (connstate) {
|
||||
result.push({
|
||||
protocol: line[0],
|
||||
localaddress: localip,
|
||||
localport: localport,
|
||||
peeraddress: peerip,
|
||||
peerport: peerport,
|
||||
localAddress: localip,
|
||||
localPort: localport,
|
||||
peerAddress: peerip,
|
||||
peerPort: peerport,
|
||||
state: connstate,
|
||||
pid: proc[0] && proc[0] !== '-' ? parseInt(proc[0], 10) : -1,
|
||||
pid: proc[0] && proc[0] !== '-' ? parseInt(proc[0], 10) : null,
|
||||
process: proc[1] ? proc[1].split(' ')[0] : ''
|
||||
});
|
||||
}
|
||||
@ -1296,9 +1291,9 @@ function networkConnections(callback) {
|
||||
peerip = peeraddress.join(':');
|
||||
}
|
||||
let connstate = line[1];
|
||||
if (connstate === 'ESTAB') connstate = 'ESTABLISHED';
|
||||
if (connstate === 'TIME-WAIT') connstate = 'TIME_WAIT';
|
||||
let pid = -1;
|
||||
if (connstate === 'ESTAB') { connstate = 'ESTABLISHED'; }
|
||||
if (connstate === 'TIME-WAIT') { connstate = 'TIME_WAIT'; }
|
||||
let pid = null;
|
||||
let process = '';
|
||||
if (line.length >= 7 && line[6].indexOf('users:') > -1) {
|
||||
let proc = line[6].replace('users:(("', '').replace(/"/g, '').split(',');
|
||||
@ -1310,10 +1305,10 @@ function networkConnections(callback) {
|
||||
if (connstate) {
|
||||
result.push({
|
||||
protocol: line[0],
|
||||
localaddress: localip,
|
||||
localport: localport,
|
||||
peeraddress: peerip,
|
||||
peerport: peerport,
|
||||
localAddress: localip,
|
||||
localPort: localport,
|
||||
peerAddress: peerip,
|
||||
peerPort: peerport,
|
||||
state: connstate,
|
||||
pid,
|
||||
process
|
||||
@ -1361,10 +1356,10 @@ function networkConnections(callback) {
|
||||
if (connstate) {
|
||||
result.push({
|
||||
protocol: line[0],
|
||||
localaddress: localip,
|
||||
localport: localport,
|
||||
peeraddress: peerip,
|
||||
peerport: peerport,
|
||||
localAddress: localip,
|
||||
localPort: localport,
|
||||
peerAddress: peerip,
|
||||
peerPort: peerport,
|
||||
state: connstate,
|
||||
pid: pid,
|
||||
process: ''
|
||||
@ -1408,23 +1403,23 @@ function networkConnections(callback) {
|
||||
}
|
||||
let pid = line[4];
|
||||
let connstate = line[3];
|
||||
if (connstate === 'HERGESTELLT') connstate = 'ESTABLISHED';
|
||||
if (connstate.startsWith('ABH')) connstate = 'LISTEN';
|
||||
if (connstate === 'SCHLIESSEN_WARTEN') connstate = 'CLOSE_WAIT';
|
||||
if (connstate === 'WARTEND') connstate = 'TIME_WAIT';
|
||||
if (connstate === 'SYN_GESENDET') connstate = 'SYN_SENT';
|
||||
if (connstate === 'HERGESTELLT') { connstate = 'ESTABLISHED'; }
|
||||
if (connstate.startsWith('ABH')) { connstate = 'LISTEN'; }
|
||||
if (connstate === 'SCHLIESSEN_WARTEN') { connstate = 'CLOSE_WAIT'; }
|
||||
if (connstate === 'WARTEND') { connstate = 'TIME_WAIT'; }
|
||||
if (connstate === 'SYN_GESENDET') { connstate = 'SYN_SENT'; }
|
||||
|
||||
if (connstate === 'LISTENING') connstate = 'LISTEN';
|
||||
if (connstate === 'SYN_RECEIVED') connstate = 'SYN_RECV';
|
||||
if (connstate === 'FIN_WAIT_1') connstate = 'FIN_WAIT1';
|
||||
if (connstate === 'FIN_WAIT_2') connstate = 'FIN_WAIT2';
|
||||
if (connstate === 'LISTENING') { connstate = 'LISTEN'; }
|
||||
if (connstate === 'SYN_RECEIVED') { connstate = 'SYN_RECV'; }
|
||||
if (connstate === 'FIN_WAIT_1') { connstate = 'FIN_WAIT1'; }
|
||||
if (connstate === 'FIN_WAIT_2') { connstate = 'FIN_WAIT2'; }
|
||||
if (connstate) {
|
||||
result.push({
|
||||
protocol: line[0].toLowerCase(),
|
||||
localaddress: localip,
|
||||
localport: localport,
|
||||
peeraddress: peerip,
|
||||
peerport: peerport,
|
||||
localAddress: localip,
|
||||
localPort: localport,
|
||||
peerAddress: peerip,
|
||||
peerPort: peerport,
|
||||
state: connstate,
|
||||
pid,
|
||||
process: ''
|
||||
|
||||
@ -299,6 +299,7 @@ function osInfo(callback) {
|
||||
result.codename = (result.release.indexOf('10.13') > -1 ? 'macOS High Sierra' : result.codename);
|
||||
result.codename = (result.release.indexOf('10.14') > -1 ? 'macOS Mojave' : result.codename);
|
||||
result.codename = (result.release.indexOf('10.15') > -1 ? 'macOS Catalina' : result.codename);
|
||||
result.codename = (result.release.startsWith('11.') ? 'macOS Big Sur' : result.codename);
|
||||
result.uefi = true;
|
||||
result.codepage = util.getCodepage();
|
||||
if (callback) {
|
||||
@ -961,10 +962,20 @@ function uuid(callback) {
|
||||
let parts;
|
||||
|
||||
if (_darwin) {
|
||||
exec('ioreg -rd1 -c IOPlatformExpertDevice | grep IOPlatformUUID', function (error, stdout) {
|
||||
exec('system_profiler SPHardwareDataType -json', function (error, stdout) {
|
||||
if (!error) {
|
||||
parts = stdout.toString().split('\n')[0].replace(/"/g, '').split('=');
|
||||
result.os = parts.length > 1 ? parts[1].trim().toLowerCase() : '';
|
||||
try {
|
||||
const jsonObj = JSON.parse(stdout.toString());
|
||||
if (jsonObj.SPHardwareDataType && jsonObj.SPHardwareDataType.length > 0) {
|
||||
const spHardware = jsonObj.SPHardwareDataType[0];
|
||||
console.log(spHardware);
|
||||
// result.os = parts.length > 1 ? parts[1].trim().toLowerCase() : '';
|
||||
result.os = spHardware.platform_UUID;
|
||||
result.hardware = spHardware.serial_number;
|
||||
}
|
||||
} catch (e) {
|
||||
util.noop();
|
||||
}
|
||||
}
|
||||
if (callback) {
|
||||
callback(result);
|
||||
|
||||
@ -882,7 +882,7 @@ function processLoad(proc, callback) {
|
||||
|
||||
let result = {
|
||||
'proc': procSanitized,
|
||||
'pid': -1,
|
||||
'pid': null,
|
||||
'cpu': 0,
|
||||
'mem': 0
|
||||
};
|
||||
@ -917,7 +917,7 @@ function processLoad(proc, callback) {
|
||||
pcpus: 0,
|
||||
});
|
||||
if (name.toLowerCase().indexOf(procSanitized.toLowerCase()) >= 0) {
|
||||
if (result.pid === -1) {
|
||||
if (result.pid === null) {
|
||||
result = {
|
||||
proc: name,
|
||||
pid: pid,
|
||||
|
||||
14
lib/wifi.js
14
lib/wifi.js
@ -108,7 +108,7 @@ function wifiFrequencyFromChannel(channel) {
|
||||
192: 4960,
|
||||
196: 4980
|
||||
};
|
||||
return {}.hasOwnProperty.call(frequencies, channel) ? frequencies[channel] : -1;
|
||||
return {}.hasOwnProperty.call(frequencies, channel) ? frequencies[channel] : null;
|
||||
}
|
||||
|
||||
function wifiNetworks(callback) {
|
||||
@ -134,8 +134,8 @@ function wifiNetworks(callback) {
|
||||
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,
|
||||
channel: channel ? parseInt(channel, 10) : null,
|
||||
frequency: frequency ? parseInt(frequency, 10) : null,
|
||||
signalLevel: wifiDBFromQuality(util.getValue(lines, 'SIGNAL')),
|
||||
quality: parseFloat(util.getValue(lines, 'SIGNAL')),
|
||||
security: security && security !== 'none' ? security.split(' ') : [],
|
||||
@ -160,7 +160,7 @@ function wifiNetworks(callback) {
|
||||
lines.forEach(line => {
|
||||
if (line.trim()) {
|
||||
const channelStr = line.substring(parsedhead[3].from, parsedhead[3].to).trim();
|
||||
const channel = channelStr ? parseInt(channelStr, 10) : -1;
|
||||
const channel = channelStr ? parseInt(channelStr, 10) : null;
|
||||
const signalLevel = line.substring(parsedhead[2].from, parsedhead[2].to).trim();
|
||||
const securityAll = line.substring(parsedhead[6].from, 1000).trim().split(' ');
|
||||
let security = [];
|
||||
@ -179,7 +179,7 @@ function wifiNetworks(callback) {
|
||||
mode: '',
|
||||
channel,
|
||||
frequency: wifiFrequencyFromChannel(channel),
|
||||
signalLevel: signalLevel ? parseInt(signalLevel, 10) : -1,
|
||||
signalLevel: signalLevel ? parseInt(signalLevel, 10) : null,
|
||||
quality: wifiQualityFromDB(signalLevel),
|
||||
security,
|
||||
wpaFlags,
|
||||
@ -213,10 +213,10 @@ function wifiNetworks(callback) {
|
||||
ssid: lines[0].split(':').pop().trim(),
|
||||
bssid,
|
||||
mode: '',
|
||||
channel: channel ? parseInt(channel, 10) : -1,
|
||||
channel: channel ? parseInt(channel, 10) : null,
|
||||
frequency: wifiFrequencyFromChannel(channel),
|
||||
signalLevel: wifiDBFromQuality(quality),
|
||||
quality: quality ? parseInt(quality, 10) : -1,
|
||||
quality: quality ? parseInt(quality, 10) : null,
|
||||
security: [lines[2].split(':').pop().trim()],
|
||||
wpaFlags: [lines[3].split(':').pop().trim()],
|
||||
rsnFlags: []
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user