ogclone-engine/client/interfaceAdm/GetConfiguration.py

122 lines
4.2 KiB
Python

#!/usr/bin/env python3
import os
import subprocess
import sys
import FileSystemLib
import DiskLib
os.environ["DEBUG"] = "no"
# Obtener el número de serie y configuración inicial
ser = subprocess.getoutput("ogGetSerialNumber")
cfg = ""
# Obtener el número de discos
disks = len(subprocess.getoutput("ogDiskToDev").split())
for dsk in disk_list:
# Número de particiones
particiones = FileSystemLib.ogGetPartitionsNumber(dsk) or "0"
particiones = int(particiones)
# Tipo de tabla de particiones
ptt = DiskLib.ogGetPartitionTableType(dsk)
ptt_mapping = {"MSDOS": 1, "GPT": 2, "LVM": 3, "ZPOOL": 4}
ptt = ptt_mapping.get(ptt, 0)
# Información de disco (partición 0)
disk_size = DiskLib.ogGetDiskSize(dsk)
cfg += f"{dsk}:0:{ptt}:::{disk_size}:0;"
# Recorrer particiones
for par in range(1, particiones + 1):
# Código del identificador de tipo de partición
cod = DiskLib.ogGetPartitionId(dsk, par)
# Tipo del sistema de ficheros
fsi = FileSystemLib.getFsType(dsk, par) or "EMPTY"
# Tamaño de la partición
tam = DiskLib.ogGetPartitionSize(dsk, par) or "0"
# Sistema operativo instalado
soi = ""
uso = 0
if fsi not in ["", "EMPTY", "LINUX-SWAP", "LINUX-LVM", "ZVOL"]:
mount_point = DiskLib.ogMount(dsk, par)
if mount_point:
# Obtener la versión del sistema operativo instalado
try:
# Asumiendo que getOsVersion es una función disponible
import OsLib # Debes tener OsLib.py disponible con la función getOsVersion
soi_output = OsLib.getOsVersion(dsk, par)
except ImportError:
# Si no está disponible, usar subprocess como alternativa
soi_output = subprocess.getoutput(f"getOsVersion {dsk} {par} 2>/dev/null")
soi = soi_output.split(':')[1] if ':' in soi_output else ''
# Hacer un segundo intento para algunos casos especiales
if not soi:
soi_output = subprocess.getoutput(f"getOsVersion {dsk} {par} 2>/dev/null")
soi = soi_output.split(':')[1] if ':' in soi_output else ''
# Sistema de archivos para datos (sistema operativo "DATA")
if not soi and fsi not in ["EMPTY", "CACHE"]:
soi = "DATA"
# Obtener porcentaje de uso
mount_point = DiskLib.ogGetMountPoint(dsk, par)
df_output = subprocess.getoutput(f"df {mount_point}")
lines = df_output.splitlines()
if len(lines) >= 2:
uso_str = lines[1].split()[4] # Esta debería ser la quinta columna
if uso_str.endswith('%'):
uso = int(uso_str.rstrip('%'))
else:
uso = int(uso_str)
else:
uso = 0
else:
soi = ""
uso = 0
else:
soi = ""
uso = 0
cfg += f"{dsk}:{par}:{cod}:{fsi}:{soi}:{tam}:{uso};"
# 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:
f.write(f"{ser + ';' if ser else ''}{cfg}")
# Crear el menú por defecto desde el archivo generado
subprocess.run(["generateMenuDefault"], stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL)
# Componer salida formateada
formatted_output = []
with open(cfgfile, 'r') as f:
content = f.read().strip().split(";")
for item in content:
fields = item.split(":")
if len(fields) == 1:
formatted_output.append(f"ser={fields[0]}")
else:
formatted_output.append(
f"disk={fields[0]}\tpar={fields[1]}\tcpt={fields[2]}\tfsi={fields[3]}\tsoi={fields[4]}\ttam={fields[5]}\tuso={fields[6]}"
)
# Mostrar la salida formateada
print("\n".join(formatted_output))
# Borrar marcas de arranque de Windows
subprocess.run(["rm", "-f", "/mnt/*/ogboot.*", "/mnt/*/*/ogboot.*"])
# Volver a registrar los errores
os.environ.pop("DEBUG", None)