@oaklean/profiler-core
Version:
Part of the @oaklean suite. It provides all basic functions to work with the `.oak` file format. It allows parsing the `.oak` file format as well as tools for analyzing the measurement values. It also provides all necessary capabilities required for prec
344 lines • 28.5 kB
JavaScript
"use strict";
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
return new (P || (P = Promise))(function (resolve, reject) {
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
step((generator = generator.apply(thisArg, _arguments || [])).next());
});
};
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.SystemInformation = void 0;
const systeminformation_1 = __importDefault(require("systeminformation"));
const BaseModel_1 = require("./BaseModel");
const LoggerHelper_1 = require("../helper/LoggerHelper");
class SystemInformation extends BaseModel_1.BaseModel {
constructor(system, baseBoard, chassis, cpu, memory, memoryLayout, battery, os) {
super();
this.system = system;
this.baseBoard = baseBoard;
this.chassis = chassis;
this.cpu = cpu;
this.memory = memory;
this.memoryLayout = memoryLayout;
this.battery = battery;
this.os = os;
}
static sameSystem(...args) {
if (args.length === 0) {
throw new Error('SystemInformation.merge: no SystemInformation were given');
}
const firstSystemInformation = args[0];
const firstSystem = firstSystemInformation.system;
const firstBaseBoard = firstSystemInformation.baseBoard;
const firstChassi = firstSystemInformation.chassis;
const firstCpu = firstSystemInformation.cpu;
const firstMemory = firstSystemInformation.memory;
const firstMemoryLayout = firstSystemInformation.memoryLayout;
const firstBattery = firstSystemInformation.battery;
const firstOs = firstSystemInformation.os;
for (const currentSystemInformation of args) {
const currentSystem = currentSystemInformation.system;
const systemIsTheSame = firstSystem.manufacturer === currentSystem.manufacturer &&
firstSystem.model === currentSystem.model &&
firstSystem.version === currentSystem.version &&
firstSystem.virtual === currentSystem.virtual;
if (!systemIsTheSame) {
LoggerHelper_1.LoggerHelper.error('SystemInformation.isSame: detected different systems');
return false;
}
const currentBaseBoard = currentSystemInformation.baseBoard;
const baseBoardIsTheSame = firstBaseBoard.manufacturer === currentBaseBoard.manufacturer &&
firstBaseBoard.model === currentBaseBoard.model &&
firstBaseBoard.version === currentBaseBoard.version &&
firstBaseBoard.memMax === currentBaseBoard.memMax &&
firstBaseBoard.memSlots === currentBaseBoard.memSlots;
if (!baseBoardIsTheSame) {
LoggerHelper_1.LoggerHelper.error('SystemInformation.isSame: detected different baseboards');
return false;
}
const currentChassis = currentSystemInformation.chassis;
const chassisIsTheSame = firstChassi.manufacturer === currentChassis.manufacturer &&
firstChassi.model === currentChassis.model &&
firstChassi.type === currentChassis.type &&
firstChassi.version === currentChassis.version &&
firstChassi.assetTag === currentChassis.assetTag &&
firstChassi.sku === currentChassis.sku;
if (!chassisIsTheSame) {
LoggerHelper_1.LoggerHelper.error('SystemInformation.isSame: detected different chassis');
return false;
}
const currentCpu = currentSystemInformation.cpu;
const cpuIsTheSame = firstCpu.manufacturer === currentCpu.manufacturer &&
firstCpu.brand === currentCpu.brand &&
firstCpu.vendor === currentCpu.vendor &&
firstCpu.family === currentCpu.family &&
firstCpu.model === currentCpu.model &&
firstCpu.stepping === currentCpu.stepping &&
firstCpu.revision === currentCpu.revision &&
firstCpu.speedMin === currentCpu.speedMin &&
firstCpu.speedMax === currentCpu.speedMax &&
firstCpu.cores === currentCpu.cores &&
firstCpu.physicalCores === currentCpu.physicalCores &&
firstCpu.efficiencyCores === currentCpu.efficiencyCores &&
firstCpu.performanceCores === currentCpu.performanceCores &&
firstCpu.processors === currentCpu.processors &&
firstCpu.virtualization === currentCpu.virtualization &&
firstCpu.cache.l1d === currentCpu.cache.l1d &&
firstCpu.cache.l1i === currentCpu.cache.l1i &&
firstCpu.cache.l2 === currentCpu.cache.l2 &&
firstCpu.cache.l3 === currentCpu.cache.l3;
if (!cpuIsTheSame) {
LoggerHelper_1.LoggerHelper.error('SystemInformation.isSame: detected different cpus');
return false;
}
const currentMemory = currentSystemInformation.memory;
const memoryIsTheSame = firstMemory.total === currentMemory.total;
if (!memoryIsTheSame) {
LoggerHelper_1.LoggerHelper.error('SystemInformation.isSame: detected different memory');
return false;
}
const currentMemoryLayout = currentSystemInformation.memoryLayout;
if (firstMemoryLayout.length !== currentMemoryLayout.length) {
LoggerHelper_1.LoggerHelper.error('SystemInformation.isSame: detected different memoryLayout');
return false;
}
for (let i = 0; i < firstMemoryLayout.length; i++) {
const memoryLayoutIsTheSame = firstMemoryLayout[i].size === currentMemoryLayout[i].size &&
firstMemoryLayout[i].type === currentMemoryLayout[i].type &&
firstMemoryLayout[i].manufacturer === currentMemoryLayout[i].manufacturer &&
firstMemoryLayout[i].voltageMin === currentMemoryLayout[i].voltageMin &&
firstMemoryLayout[i].voltageMax === currentMemoryLayout[i].voltageMax;
if (!memoryLayoutIsTheSame) {
LoggerHelper_1.LoggerHelper.error('SystemInformation.isSame: detected different memoryLayout');
return false;
}
}
const currentBattery = currentSystemInformation.battery;
const batteryIsTheSame = firstBattery.type === currentBattery.type &&
firstBattery.model === currentBattery.model &&
firstBattery.manufacturer === currentBattery.manufacturer;
if (!batteryIsTheSame) {
LoggerHelper_1.LoggerHelper.error('SystemInformation.isSame: detected different battery');
return false;
}
const currentOs = currentSystemInformation.os;
const osIsTheSame = firstOs.platform === currentOs.platform &&
firstOs.distro === currentOs.distro &&
firstOs.release === currentOs.release &&
firstOs.codename === currentOs.codename &&
firstOs.kernel === currentOs.kernel &&
firstOs.arch === currentOs.arch &&
firstOs.codepage === currentOs.codepage &&
firstOs.logofile === currentOs.logofile &&
firstOs.build === currentOs.build &&
firstOs.servicepack === currentOs.servicepack &&
firstOs.uefi === currentOs.uefi;
if (!osIsTheSame) {
LoggerHelper_1.LoggerHelper.error('SystemInformation.isSame: detected different os');
return false;
}
}
return true;
}
static collect() {
return __awaiter(this, void 0, void 0, function* () {
return new SystemInformation(yield this.systemInfo(), yield this.baseBoardInfo(), yield this.chassisInfo(), yield this.cpuInfo(), yield this.memoryInfo(), yield this.memoryLayoutInfo(), yield this.batteryInfo(), yield this.osInfo());
});
}
static systemInfo() {
return __awaiter(this, void 0, void 0, function* () {
const { manufacturer, model, version, sku, virtual, virtualHost, raspberry } = yield systeminformation_1.default.system();
let raspberryInfo = undefined;
if (raspberry) {
raspberryInfo = {
manufacturer: raspberry.manufacturer,
processor: raspberry.processor,
type: raspberry.type,
revision: raspberry.revision
};
}
return {
manufacturer,
model,
version,
sku,
virtual,
virtualHost,
raspberry: raspberryInfo
};
});
}
static baseBoardInfo() {
return __awaiter(this, void 0, void 0, function* () {
const { manufacturer, model, version, assetTag, memMax, memSlots, } = yield systeminformation_1.default.baseboard();
return {
manufacturer,
model,
version,
assetTag,
memMax,
memSlots,
};
});
}
static chassisInfo() {
return __awaiter(this, void 0, void 0, function* () {
const { manufacturer, model, type, version, assetTag, sku } = yield systeminformation_1.default.chassis();
return {
manufacturer,
model,
type,
version,
assetTag,
sku
};
});
}
static cpuInfo() {
return __awaiter(this, void 0, void 0, function* () {
const { manufacturer, brand, vendor, family, model, stepping, revision, voltage, speed, speedMin, speedMax, governor, cores, physicalCores, efficiencyCores, performanceCores, processors, socket, flags, virtualization, cache: { l1d, l1i, l2, l3, } } = yield systeminformation_1.default.cpu();
return {
manufacturer,
brand,
vendor,
family,
model,
stepping,
revision,
voltage,
speed,
speedMin,
speedMax,
governor,
cores,
physicalCores,
efficiencyCores,
performanceCores,
processors,
socket,
flags,
virtualization,
cache: {
l1d,
l1i,
l2,
l3,
}
};
});
}
static memoryInfo() {
return __awaiter(this, void 0, void 0, function* () {
const { total, free, used, active, available, buffcache, buffers, cached, slab, swaptotal, swapused, swapfree, writeback, dirty } = yield systeminformation_1.default.mem();
return {
total,
free,
used,
active,
available,
buffcache,
buffers,
cached,
slab,
swaptotal,
swapused,
swapfree,
writeback,
dirty
};
});
}
static memoryLayoutInfo() {
return __awaiter(this, void 0, void 0, function* () {
return (yield systeminformation_1.default.memLayout()).map(({ size, bank, type, ecc, clockSpeed, formFactor, manufacturer, partNum, voltageConfigured, voltageMin, voltageMax }) => {
return {
size,
bank,
type,
ecc,
clockSpeed,
formFactor,
manufacturer,
partNum,
voltageConfigured,
voltageMin,
voltageMax
};
});
});
}
static batteryInfo() {
return __awaiter(this, void 0, void 0, function* () {
function convert(data) {
const { hasBattery, cycleCount, isCharging, voltage, designedCapacity, maxCapacity, currentCapacity, capacityUnit, percent, timeRemaining, acConnected, type, model, manufacturer, additionalBatteries } = data;
return {
hasBattery,
cycleCount,
isCharging,
voltage,
designedCapacity,
maxCapacity,
currentCapacity,
capacityUnit,
percent,
timeRemaining,
acConnected,
type,
model,
manufacturer,
additionalBatteries: additionalBatteries === null || additionalBatteries === void 0 ? void 0 : additionalBatteries.map((x) => convert(x))
};
}
return convert(yield systeminformation_1.default.battery());
});
}
static osInfo() {
return __awaiter(this, void 0, void 0, function* () {
const { platform, distro, release, codename, kernel, arch, codepage, logofile, build, servicepack, uefi, hypervizor, remoteSession } = yield systeminformation_1.default.osInfo();
return {
platform,
distro,
release,
codename,
kernel,
arch,
codepage,
logofile,
build,
servicepack,
uefi,
hypervizor,
remoteSession
};
});
}
toJSON() {
return {
system: this.system,
baseBoard: this.baseBoard,
chassis: this.chassis,
cpu: this.cpu,
memory: this.memory,
memoryLayout: this.memoryLayout,
battery: this.battery,
os: this.os
};
}
static fromJSON(json) {
let data;
if (typeof json === 'string') {
data = JSON.parse(json);
}
else {
data = json;
}
return new SystemInformation(data.system, data.baseBoard, data.chassis, data.cpu, data.memory, data.memoryLayout, data.battery, data.os);
}
}
exports.SystemInformation = SystemInformation;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU3lzdGVtSW5mb3JtYXRpb24uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbW9kZWwvU3lzdGVtSW5mb3JtYXRpb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsMEVBQXlEO0FBRXpELDJDQUF1QztBQWN2Qyx5REFBcUQ7QUFFckQsTUFBYSxpQkFBa0IsU0FBUSxxQkFBUztJQVUvQyxZQUNDLE1BQWlDLEVBQ2pDLFNBQXVDLEVBQ3ZDLE9BQW1DLEVBQ25DLEdBQTJCLEVBQzNCLE1BQWlDLEVBQ2pDLFlBQStDLEVBQy9DLE9BQW1DLEVBQ25DLEVBQXlCO1FBRXpCLEtBQUssRUFBRSxDQUFBO1FBQ1AsSUFBSSxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUE7UUFDcEIsSUFBSSxDQUFDLFNBQVMsR0FBRyxTQUFTLENBQUE7UUFDMUIsSUFBSSxDQUFDLE9BQU8sR0FBRyxPQUFPLENBQUE7UUFDdEIsSUFBSSxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUE7UUFDZCxJQUFJLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQTtRQUNwQixJQUFJLENBQUMsWUFBWSxHQUFHLFlBQVksQ0FBQTtRQUNoQyxJQUFJLENBQUMsT0FBTyxHQUFHLE9BQU8sQ0FBQTtRQUN0QixJQUFJLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQTtJQUNiLENBQUM7SUFFRCxNQUFNLENBQUMsVUFBVSxDQUFDLEdBQUcsSUFBMEI7UUFDOUMsSUFBSSxJQUFJLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRSxDQUFDO1lBQ3ZCLE1BQU0sSUFBSSxLQUFLLENBQUMsMERBQTBELENBQUMsQ0FBQTtRQUM1RSxDQUFDO1FBQ0QsTUFBTSxzQkFBc0IsR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUE7UUFDdEMsTUFBTSxXQUFXLEdBQUcsc0JBQXNCLENBQUMsTUFBTSxDQUFBO1FBQ2pELE1BQU0sY0FBYyxHQUFHLHNCQUFzQixDQUFDLFNBQVMs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