91 lines
2.5 KiB
Python
91 lines
2.5 KiB
Python
"""WizardKit: Objects."""
|
|
# vim: sts=2 sw=2 ts=2
|
|
|
|
import pathlib
|
|
|
|
from collections import OrderedDict
|
|
|
|
from wk.exe import get_json_from_command, run_program
|
|
from wk.std import bytes_to_string, color_string, string_to_bytes
|
|
|
|
# Classes
|
|
class CpuRam():
|
|
"""Object for tracking CPU & RAM specific data."""
|
|
def __init__(self):
|
|
self.lscpu = {}
|
|
self.tests = OrderedDict()
|
|
self.get_cpu_details()
|
|
self.get_ram_details()
|
|
self.name = self.lscpu.get('Model name', 'Unknown CPU')
|
|
self.description = self.name
|
|
|
|
def get_cpu_details(self):
|
|
"""Get CPU details from lscpu."""
|
|
cmd = ['lscpu', '--json']
|
|
json_data = get_json_from_command(cmd)
|
|
for line in json_data.get('lscpu', [{}]):
|
|
_field = line.get('field', '').replace(':', '')
|
|
_data = line.get('data', '')
|
|
if not (_field or _data):
|
|
# Skip
|
|
continue
|
|
self.lscpu[_field] = _data
|
|
|
|
def get_ram_details(self):
|
|
"""Get RAM details from dmidecode."""
|
|
cmd = ['sudo', 'dmidecode', '--type', 'memory']
|
|
manufacturer = 'UNKNOWN'
|
|
details = {'Total': 0}
|
|
size = 0
|
|
|
|
# Get DMI data
|
|
proc = run_program(cmd)
|
|
dmi_data = proc.stdout.splitlines()
|
|
|
|
# Parse data
|
|
for line in dmi_data:
|
|
line = line.strip()
|
|
if line == 'Memory Device':
|
|
# Reset vars
|
|
manufacturer = 'UNKNOWN'
|
|
size = 0
|
|
elif line.startswith('Size:'):
|
|
size = line.replace('Size: ', '')
|
|
size = string_to_bytes(size, assume_binary=True)
|
|
elif line.startswith('Manufacturer:'):
|
|
manufacturer = line.replace('Manufacturer: ', '')
|
|
if size <= 0:
|
|
# Skip non-populated slots
|
|
continue
|
|
description = f'{bytes_to_string(size)} {manufacturer}'
|
|
details['Total'] += size
|
|
if description in details:
|
|
details[description] += 1
|
|
else:
|
|
details[description] = 1
|
|
|
|
# Save details
|
|
self.ram_total = bytes_to_string(details.pop('Total', 0))
|
|
self.ram_dimms = [
|
|
f'{count}x {desc}' for desc, count in sorted(details.items())
|
|
]
|
|
|
|
def generate_cpu_report(self):
|
|
"""Generate CPU report with data from all tests."""
|
|
report = []
|
|
report.append(color_string('Device', 'BLUE'))
|
|
report.append(f' {self.name}')
|
|
|
|
# Include RAM details
|
|
report.append(color_string('RAM', 'BLUE'))
|
|
report.append(f' {self.ram_total} ({", ".join(self.ram_dimms)})')
|
|
|
|
# Tests
|
|
for test in self.tests.values():
|
|
report.extend(test.report)
|
|
|
|
return report
|
|
|
|
|
|
if __name__ == '__main__':
|
|
print("This file is not meant to be called directly.")
|