diff --git a/client/lib/engine/bin/InventoryLib.py b/client/lib/engine/bin/InventoryLib.py index 7101b5f..2269af3 100755 --- a/client/lib/engine/bin/InventoryLib.py +++ b/client/lib/engine/bin/InventoryLib.py @@ -103,41 +103,6 @@ def ogGetSerialNumber(): def ogIsEfiActive(): return os.path.isdir("/sys/firmware/efi") -def parse_lshw_output(): - try: - # Ejecutar lshw en formato JSON para un fácil procesamiento - lshw_output = subprocess.check_output(["lshw", "-json"], text=True) - lshw_data = json.loads(lshw_output) # Convertir la salida JSON a un diccionario - - # Extraer información relevante en el formato clave=valor - parsed_output = [] - - # Ejemplo de datos clave que podríamos extraer - if "product" in lshw_data: - parsed_output.append(f"product={lshw_data['product']}") - - if "vendor" in lshw_data: - parsed_output.append(f"vendor={lshw_data['vendor']}") - - if "configuration" in lshw_data and "memory" in lshw_data["configuration"]: - parsed_output.append(f"memory={lshw_data['configuration']['memory']}") - - # Recorrer los dispositivos para obtener información de CPU, almacenamiento, etc. - for item in lshw_data.get("children", []): - if item["class"] == "processor": - parsed_output.append(f"cpu={item.get('product', 'Unknown')}") - elif item["class"] == "memory" and "size" in item: - parsed_output.append(f"total_memory={item['size']}") - elif item["class"] == "disk": - parsed_output.append(f"disk={item.get('product', 'Unknown')}") - - # Devolver los datos combinados - return "\n".join(parsed_output) - - except subprocess.CalledProcessError as e: - print(f"Error al ejecutar lshw: {e}") - return "Error al obtener información de hardware" - #/** # ogListHardwareInfo @@ -148,21 +113,68 @@ def parse_lshw_output(): #@note Requisitos: dmidecode, lshw, awk #*/ ## def ogListHardwareInfo(): + ret = '' + + SystemLib.ogEcho ([], 'info', ogGlobals.lang.MSG_HARDWAREINVENTORY) # Ejecutar dmidecode y obtener tipo de chasis - try: - output = subprocess.check_output('echo "cha=$(dmidecode -s chassis-type)" | grep -v "Other"', shell=True).decode().strip() - except subprocess.CalledProcessError: - output = "cha=Unknown" + dmi_out = subprocess.run (['dmidecode', '-s', 'chassis-type'], capture_output=True, text=True).stdout + dmi_out = '\n'.join ([ x for x in dmi_out.splitlines() if 'Other' not in x ]) + ret += f'cha={dmi_out}\n' - # Detectar BIOS o UEFI - firmware = "boo=UEFI" if os.path.isdir("/sys/firmware/efi") else "boo=BIOS" - print(firmware) + if os.path.exists ('/sys/firmware/efi'): + ret += f'boo=UEFI\n' + else: + ret += f'boo=BIOS\n' - # Ejecutar y analizar lshw - lshw_output = parse_lshw_output() + awk_script = r''' + BEGIN {type="mod";} + /product:/ {sub(/ *product: */,""); prod=$0;} + /vendor:/ {sub(/ *vendor: */,""); vend=$0;} + /version:/ {sub(/ *version: */,"v.");vers=$0;} + /size:/ {size=$2;} + /clock:/ {clock=$2;} + /slot:/ {sub(/ *slot: */,""); slot=$0;} + /\*-/ {if (type=="mem"){ + if (size!=""){ + numbank++; + print type"="vend,prod,size,clock" ("slot")";} + }else{ + if (type=="totalmem"){ + if (size!=""){ + totalmemory="mem="size;} + }else{ + if (type!="" && prod!=""){ + if (prod=="v."vers) + vers=""; + print type"="vend,prod,size,vers;} } + } + type=prod=vend=vers=size=clock=slot="";} + $1~/-core/ {type="boa";} + $1~/-firmware/ {type="bio";} + $1~/-cpu/ {type="cpu";} + $1~/-bank/ {type="mem";} + $1~/-memory/ {type="totalmem";} + $1~/-ide/ {type="ide";} + $1~/-storage/ {type="sto";} + $1~/-disk/ {type="dis";} + $1~/-cdrom/ {type="cdr";} + $1~/-display/ {type="vga";} + $1~/-network/ {type="net";} + $1~/-multimedia/ {type="mul";} + $1~/-usb/ {type="usb";} + $1~/-firewire/ {type="fir";} + $1~/-serial/ {type="bus";} + END {if (type!="" && prod!="") + print type"="vend,prod,size,vers; + if (length(numbank)==0 && length(totalmemory)>=4) + print totalmemory; } + ''' + lshw_out = subprocess.run (['lshw'], capture_output=True, text=True).stdout + awk_out = subprocess.run (['awk', awk_script], input=lshw_out, capture_output=True, text=True).stdout - # Combina y devuelve los resultados - return f"{output}\n{firmware}\n{lshw_output}" + ret += awk_out + + return ret #/** diff --git a/client/shared/functions/ogListHardwareInfo b/client/shared/functions/ogListHardwareInfo new file mode 100755 index 0000000..2eaa493 --- /dev/null +++ b/client/shared/functions/ogListHardwareInfo @@ -0,0 +1,17 @@ +#!/usr/bin/python3 + +import sys +from SystemLib import ogHelp +from InventoryLib import ogListHardwareInfo + +if 2 == len (sys.argv) and 'help' == sys.argv[1]: + #parser.print_help() sale en inglés aunque la locale indique otra cosa + ogHelp ('ogListHardwareInfo', 'ogListHardwareInfo', ['ogListHardwareInfo']) + sys.exit (0) + +ret = ogListHardwareInfo() + +if ret is not None: + if ret == True: sys.exit (0) + elif ret == False: sys.exit (1) + else: print (ret)