diff --git a/ereuse_devicehub/parser/computer.py b/ereuse_devicehub/parser/computer.py index cdfe7a8b..bf417dac 100644 --- a/ereuse_devicehub/parser/computer.py +++ b/ereuse_devicehub/parser/computer.py @@ -1,3 +1,4 @@ +import logging import re from contextlib import suppress from datetime import datetime @@ -13,7 +14,11 @@ from ereuse_utils.nested_lookup import ( ) from ereuse_devicehub.parser import base2, unit, utils +from ereuse_devicehub.parser.models import SnapshotErrors from ereuse_devicehub.parser.utils import Dumpeable +from ereuse_devicehub.resources.enums import Severity + +logger = logging.getLogger(__name__) class Device(Dumpeable): @@ -417,7 +422,7 @@ class Computer(Device): self._ram = None @classmethod - def run(cls, lshw, hwinfo_raw): + def run(cls, lshw, hwinfo_raw, uuid=None, sid=None): """ Gets hardware information from the computer and its components, like serial numbers or model names, and benchmarks them. @@ -428,17 +433,35 @@ class Computer(Device): hwinfo = hwinfo_raw.splitlines() computer = cls(lshw) components = [] - for Component in cls.COMPONENTS: - if Component == Display and computer.type != 'Laptop': - continue # Only get display info when computer is laptop - components.extend(Component.new(lshw=lshw, hwinfo=hwinfo)) - components.append(Motherboard.new(lshw, hwinfo)) + try: + for Component in cls.COMPONENTS: + if Component == Display and computer.type != 'Laptop': + continue # Only get display info when computer is laptop + components.extend(Component.new(lshw=lshw, hwinfo=hwinfo)) + components.append(Motherboard.new(lshw, hwinfo)) + computer._ram = sum( + ram.size for ram in components if isinstance(ram, RamModule) + ) + except Exception as err: + # if there are any problem with components, save the problem and continue + txt = "Error: Snapshot: {uuid}, sid: {sid}, type_error: {type}, error: {error}".format( + uuid=uuid, sid=sid, type=err.__class__, error=err + ) + cls.errors(txt, uuid=uuid, sid=sid) - computer._ram = sum( - ram.size for ram in components if isinstance(ram, RamModule) - ) return computer, components + @classmethod + def errors(cls, txt=None, uuid=None, sid=None, severity=Severity.Error): + if not txt: + return + + logger.error(txt) + error = SnapshotErrors( + description=txt, snapshot_uuid=uuid, severity=severity, sid=sid + ) + error.save() + def __str__(self) -> str: specs = super().__str__() return '{} with {} MB of RAM.'.format(specs, self._ram)