@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
347 lines • 28.6 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, reclaimable, swaptotal, swapused, swapfree, writeback, dirty } = yield systeminformation_1.default.mem();
return {
total,
free,
used,
active,
available,
buffcache,
buffers,
cached,
slab,
reclaimable,
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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU3lzdGVtSW5mb3JtYXRpb24uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbW9kZWwvU3lzdGVtSW5mb3JtYXRpb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsMEVBQXlEO0FBRXpELDJDQUF1QztBQWN2Qyx5REFBcUQ7QUFFckQsTUFBYSxpQkFBa0IsU0FBUSxxQkFBUztJQVUvQyxZQUNDLE1BQWlDLEVBQ2pDLFNBQXVDLEVBQ3ZDLE9BQW1DLEVBQ25DLEdBQTJCLEVBQzNCLE1BQWlDLEVBQ2pDLFlBQStDLEVBQy9DLE9BQW1DLEVBQ25DLEVBQXlCO1FBRXpCLEtBQUssRUFBRSxDQUFBO1FBQ1AsSUFBSSxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUE7UUFDcEIsSUFBSSxDQUFDLFNBQVMsR0FBRyxTQUFTLENBQUE7UUFDMUIsSUFBSSxDQUFDLE9BQU8sR0FBRyxPQUFPLENBQUE7UUFDdEIsSUFBSSxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUE7UUFDZCxJQUFJLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQTtRQUNwQixJQUFJLENBQUMsWUFBWSxHQUFHLFlBQVksQ0FBQTtRQUNoQyxJQUFJLENBQUMsT0FBTyxHQUFHLE9BQU8sQ0FBQTtRQUN0QixJQUFJLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQTtJQUNiLENBQUM7SUFFRCxNQUFNLENBQUMsVUFBVSxDQUFDLEdBQUcsSUFBMEI7UUFDOUMsSUFBSSxJQUFJLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRSxDQUFDO1lBQ3ZCLE1BQU0sSUFBSSxLQUFLLENBQ2QsMERBQTBELENBQzFELENBQUE7UUFDRixDQUFDO1FBQ0QsTUFBTSxzQkFBc0IsR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUE7UUFDdEMsTUFBTSxXQUFXLEdBQUcsc0JBQXNCLENBQUMsTUFBTSxDQUFBO1FBQ2pELE1BQU0sY0FBYyxHQUFHLHNCQUFzQixDQUFDLFNBQVMs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