WizardKit/scripts/wk/obj.py
2019-10-22 18:49:44 -07:00

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.")