diff --git a/ereuse_devicehub/resources/action/parser.py b/ereuse_devicehub/resources/action/parser.py index 16c7dccf..a07dcab0 100644 --- a/ereuse_devicehub/resources/action/parser.py +++ b/ereuse_devicehub/resources/action/parser.py @@ -1,3 +1,5 @@ +import json + from dmidecode import DMIParse @@ -26,26 +28,110 @@ class Demidecode: def set_components(self): self.get_cpu() + self.get_ram() + self.get_mother_board() def get_cpu(self): - cpu = self.dmi.get('Processor')[0] - - self.components.append( - { - "actions": [], - "type": "Processor", - "speed": cpu.get('Max Speed'), - "cores": int(cpu.get('Core Count', 1)), - "model": cpu.get('Version'), - "threads": int(cpu.get('Thread Count', 1)), - "manufacturer": cpu.get('Manufacturer'), - "serialNumber": cpu.get('Serial Number'), - "generation": cpu.get('Generation'), - "brand": cpu.get('Brand'), - "address": cpu.get('Address'), - } - ) # TODO @cayop generation, brand and address not exist in dmidecode + for cpu in self.dmi.get('Processor'): + self.components.append( + { + "actions": [], + "type": "Processor", + "speed": cpu.get('Max Speed'), + "cores": int(cpu.get('Core Count', 1)), + "model": cpu.get('Version'), + "threads": int(cpu.get('Thread Count', 1)), + "manufacturer": cpu.get('Manufacturer'), + "serialNumber": cpu.get('Serial Number'), + "generation": cpu.get('Generation'), + "brand": cpu.get('Brand'), + "address": cpu.get('Address'), + } + ) + + def get_ram(self): + # TODO @cayop format and model not exist in dmidecode + for ram in self.dmi.get("Memory Device"): + self.components.append( + { + "actions": [], + "type": "RamModule", + "size": self.get_ram_size(ram), + "speed": self.get_ram_speed(ram), + "manufacturer": ram.get("Manufacturer", self.default), + "serialNumber": ram.get("Serial Number", self.default), + "interface": ram.get("Type", self.default), + "format": ram.get("Format", self.default), # "DIMM", + "model": ram.get( + "Model", self.default + ), # "48594D503131325336344350362D53362020", + } + ) + + def get_mother_board(self): + # TODO @cayop model, not exist in dmidecode + for moder_board in self.dmi.get("Baseboard"): + self.components.append( + { + "actions": [], + "type": "Motherboard", + "version": moder_board.get("Version"), + "serialNumber": moder_board.get("Serial Number"), + "manufacturer": moder_board.get("Manufacturer"), + "ramSlots": self.get_ram_slots(), + "ramMaxSize": self.get_max_ram_size(), + "slots": len(self.dmi.get("Number Of Devices")), + "biosDate": self.get_bios_date(), + "firewire": self.get_firmware(), + "model": moder_board.get("Product Name"), # ?? + "pcmcia": self.get_pcmcia_num(), # ?? + "serial": self.get_serial_num(), # ?? + "usb": self.get_usb_num(), + } + ) + + def get_usb_num(self): + return len( + [u for u in self.get("Port Connector") if u.get("Port Type") == "USB"] + ) + + def get_serial_num(self): + return len( + [u for u in self.get("Port Connector") if u.get("Port Type") == "SERIAL"] + ) + + def get_pcmcia_num(self): + return len( + [u for u in self.get("Port Connector") if u.get("Port Type") == "PCMCIA"] + ) + + def get_bios_date(self): + return self.get("BIOS")[0].get("Release Date", self.default) + + def get_firmware(self): + return self.get("BIOS")[0].get("Firmware Revision", self.default) + + def get_max_ram_size(self): + size = self.dmi.get("Physical Memory Array") + if size: + size = size.get("Maximum Capacity") + + return size.split(" GB")[0] if size else self.default + + def get_ram_slots(self): + slots = self.dmi.get("Physical Memory Array") + if slots: + slots = slots.get("Number Of Devices") + return int(slots) if slots else self.default + + def get_ram_size(self, ram): + size = ram.get("Size") + return size.split(" MB")[0] if size else self.default + + def get_ram_speed(self, ram): + size = ram.get("Speed") + return size.split(" MT/s")[0] if size else self.default def get_sku(self): return self.get("System")[0].get("SKU Number", self.default) @@ -96,3 +182,46 @@ class Demidecode: if lower_type in v: return k return self.default + + +class LsHw: + def __init__(self, dmi, jshw, default="n/a"): + self.default = default + self.hw = self.loads(jshw) + self.childrens = self.hw.get('children', []) + self.dmi = dmi + self.components = dmi.components + self.add_components() + + def add_components(self): + self.get_cpu_addr() + self.get_networks() + + def get_cpu_addr(self): + for cpu in self.components: + if not cpu['type'] == "Processor": + continue + + cpu["address"] = self.hw.get("width") + + def get_networks(self): + for x in self.childrens: + if not x['id'] == 'network': + continue + self.components.append( + { + "actions": [], + "type": "NetworkAdapter", + "serialNumber": x.get('serial'), + "speed": x.get('capacity', 10000000) / 1000**2, + "model": x.get("product"), + "manufacturer": x.get('vendor'), + "variant": x.get("version"), + "wireless": bool(x.get('configuration', {}).get('wireless', False)), + } + ) + + def loads(jshw): + if isinstance(jshw, dict): + return jshw + return json.loads(jshw)