ogclone-engine/ogclient/interfaceAdm/getConfiguration.py

107 lines
3.6 KiB
Python

#!/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 glob
import subprocess
from InventoryLib import ogGetSerialNumber, ogGetOsVersion
from DiskLib import ogDiskToDev, ogGetPartitionsNumber, ogGetPartitionTableType, ogGetDiskSize, ogGetPartitionId, ogGetPartitionSize
from FileSystemLib import ogMount, ogGetMountPoint, ogGetFsType
# No registrar los errores.
#os.environ['DEBUG'] = 'no'
ser = ogGetSerialNumber()
cfg = ''
disks = len (ogDiskToDev())
for dsk in range (1, disks+1):
particiones = ogGetPartitionsNumber (dsk)
particiones = int (particiones) if particiones else 0
# 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)
# Información de disco (partición 0)
s = ogGetDiskSize (dsk)
cfg += f'{dsk}:0:{ptt}:::{s}:0;'
for par in range (1, particiones+1):
# Código del identificador de tipo de partición
cod = ogGetPartitionId (dsk, par)
# Tipo del sistema de ficheros
fsi = ogGetFsType (dsk, par)
if not fsi: fsi = 'EMPTY'
# Tamaño de la particón
tam = ogGetPartitionSize (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)
if not soi: soi = ''
if soi: soi = soi.split (':')[1]
# Sistema de archivos para datos (sistema operativo "DATA")
if not soi and fsi not in ['EMPTY', 'CACHE']:
soi = 'DATA'
# Obtener porcentaje de uso.
mntpt = ogGetMountPoint (dsk, par)
uso = subprocess.run (['df', mntpt], capture_output=True, text=True).stdout.splitlines()[-1].split()[4].replace ('%', '')
if not uso: uso = '0'
else:
soi = ''
uso = '0'
cfg += f'{dsk}:{par}:{cod}:{fsi}:{soi}:{tam}:{uso};'
# Crear configuración por defecto para cliente sin disco.
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).
#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]);
}
}
'''
print (f'nati awk_script ({awk_script})')
subprocess.run (['awk', awk_script, cfgfile])
# Borramos marcas de arranque de Windows
for f in glob.glob ('/mnt/*/ogboot.*') + glob.glob ('/mnt/*/*/ogboot.*'):
os.unlink (f)
# Volver a registrar los errores.
#os.environ.pop('DEBUG', None)