refs #1735 collect firmware type

pull/9/head
Natalia Serrano 2025-03-21 13:59:17 +01:00
parent c5eeccde1f
commit 21770526e5
1 changed files with 56 additions and 84 deletions

View File

@ -1,105 +1,77 @@
#!/usr/bin/python3 #!/usr/bin/python3
#_______________________________________________________________________________________________________________________________
#
# Formato de salida:
# disk=Número de disco\tpar=Número de particion\tcod=Código de partición\tsfi=Sistema de ficheros\tsoi=Sistema instalado\ttam=Tamaño de la partición\n
#_______________________________________________________________________________________________________________________________
import os import os
import glob import glob
import subprocess import subprocess
from InventoryLib import ogGetSerialNumber, ogGetOsVersion from InventoryLib import ogGetSerialNumber, ogGetOsVersion, ogIsEfiActive
from DiskLib import ogDiskToDev, ogGetPartitionsNumber, ogGetPartitionTableType, ogGetDiskSize, ogGetPartitionId, ogGetPartitionSize from DiskLib import ogDiskToDev, ogGetPartitionsNumber, ogGetPartitionTableType, ogGetDiskSize, ogGetPartitionId, ogGetPartitionSize
from FileSystemLib import ogMount, ogGetMountPoint, ogGetFsType from FileSystemLib import ogMount, ogGetMountPoint, ogGetFsType
# No registrar los errores.
#os.environ['DEBUG'] = 'no'
ser = ogGetSerialNumber() ser = ogGetSerialNumber()
cfg = '' fwt = 'UEFI' if ogIsEfiActive() else 'BIOS'
print (f'ser={ser}\nfwt={fwt}')
disks = len (ogDiskToDev()) disks = len (ogDiskToDev())
if disks:
for dsk in range (1, disks+1):
# Tipo de tabla de particiones: 1=MSDOS, 2=GPT
ptt = ogGetPartitionTableType (dsk)
ptt_map = {
'MSDOS': 1,
'GPT': 2,
'LVM': 3,
'ZPOOL': 4,
}
ptt = ptt_map.get (ptt, 0)
for dsk in range (1, disks+1): # Información de disco (partición 0)
particiones = ogGetPartitionsNumber (dsk) s = ogGetDiskSize (dsk)
particiones = int (particiones) if particiones else 0 print (f'disk={dsk}\tpar=0\tcpt={ptt}\tfsi=\tsoi=\ttam={s}\tuso=0')
# Tipo de tabla de particiones: 1=MSDOS, 2=GPT
ptt = ogGetPartitionTableType (dsk) particiones = ogGetPartitionsNumber (dsk)
ptt_map = { particiones = int (particiones) if particiones else 0
'MSDOS': 1, for par in range (1, particiones+1):
'GPT': 2, # Código del identificador de tipo de partición
'LVM': 3, cod = ogGetPartitionId (dsk, par)
'ZPOOL': 4,
} # Tipo del sistema de ficheros
ptt = ptt_map.get (ptt, 0) fsi = ogGetFsType (dsk, par)
# Información de disco (partición 0) if not fsi: fsi = 'EMPTY'
s = ogGetDiskSize (dsk)
cfg += f'{dsk}:0:{ptt}:::{s}:0;' # Tamaño de la particón
for par in range (1, particiones+1): tam = ogGetPartitionSize (dsk, par)
# Código del identificador de tipo de partición if not tam: tam = '0'
cod = ogGetPartitionId (dsk, par)
# Tipo del sistema de ficheros # Sistema operativo instalado y porcentaje de uso
fsi = ogGetFsType (dsk, par) soi = ''
if not fsi: fsi = 'EMPTY' uso = '0'
# Tamaño de la particón if fsi not in ['', 'EMPTY', 'LINUX-SWAP', 'LINUX-LVM', 'ZVOL']:
tam = ogGetPartitionSize (dsk, par) if ogMount (dsk, par):
if not tam: tam = '0'
# Sistema operativo instalado
soi = ''
uso = '0'
if fsi not in ['', 'EMPTY', 'LINUX-SWAP', 'LINUX-LVM', 'ZVOL']:
if ogMount (dsk, par):
soi = ogGetOsVersion (dsk, par)
# Hacer un 2º intento para algunos casos especiales.
if not soi:
soi = ogGetOsVersion (dsk, par) soi = ogGetOsVersion (dsk, par)
if not soi: soi = '' # Hacer un 2º intento para algunos casos especiales.
if soi: soi = soi.split (':')[1] if not soi:
# Sistema de archivos para datos (sistema operativo "DATA") soi = ogGetOsVersion (dsk, par)
if not soi and fsi not in ['EMPTY', 'CACHE']: if not soi: soi = ''
soi = 'DATA' if soi: soi = soi.split (':')[1]
# Obtener porcentaje de uso. # Sistema de archivos para datos (sistema operativo "DATA")
mntpt = ogGetMountPoint (dsk, par) if not soi and fsi not in ['EMPTY', 'CACHE']:
uso = subprocess.run (['df', mntpt], capture_output=True, text=True).stdout.splitlines()[-1].split()[4].replace ('%', '') soi = 'DATA'
if not uso: uso = '0' mntpt = ogGetMountPoint (dsk, par)
else: uso = subprocess.run (['df', mntpt], capture_output=True, text=True).stdout.splitlines()[-1].split()[4].replace ('%', '')
soi = '' if not uso: uso = '0'
uso = '0' else:
soi = ''
uso = '0'
cfg += f'{dsk}:{par}:{cod}:{fsi}:{soi}:{tam}:{uso};' print (f'disk={dsk}\tpar={par}\tcpt={cod}\tfsi={fsi}\tsoi={soi}\ttam={tam}\tuso={uso}')
else:
# Crear configuración por defecto para cliente sin disco. print ('disk=1\tpar=0\tcpt=0\tfsi=\tsoi=\ttam=0\tuso=0')
if not cfg:
cfg = '1:0:0:::0;'
# Guardar salida en fichero temporal.
cfgfile = '/tmp/getconfig'
with open (cfgfile, 'w') as f:
if ser: f.write (f'{ser};\n')
f.write (cfg + '\n')
# Crear el menú por defecto a partir del fichero generado (no dar ninguna salida). # Crear el menú por defecto a partir del fichero generado (no dar ninguna salida).
# requiere /tmp/getconfig pero este script ya no lo crea
#subprocess.run ([f'{ogGlobals.OGSCRIPTS}/generateMenuDefault']) #subprocess.run ([f'{ogGlobals.OGSCRIPTS}/generateMenuDefault'])
# Componer salida formateada.
awk_script = r'''{ n=split($0,sep,";");
for (i=1; i<n; i++){
c=split (sep[i],dua,":");
if (i==1 && c==1)
printf ("ser=%s\n", dua[1]);
else
printf ("disk=%s\tpar=%s\tcpt=%s\tfsi=%s\tsoi=%s\ttam=%s\tuso=%s\n",
dua[1],dua[2],dua[3],dua[4],dua[5],dua[6],dua[7]);
}
}
'''
subprocess.run (['awk', awk_script, cfgfile])
# Borramos marcas de arranque de Windows # Borramos marcas de arranque de Windows
for f in glob.glob ('/mnt/*/ogboot.*') + glob.glob ('/mnt/*/*/ogboot.*'): for f in glob.glob ('/mnt/*/ogboot.*') + glob.glob ('/mnt/*/*/ogboot.*'):
os.unlink (f) os.unlink (f)
# Volver a registrar los errores.
#os.environ.pop('DEBUG', None)