UNPKG

@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
"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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