import sys import os import SystemLib import DiskLib import FileSystemLib import NetLib import FileLib #!/usr/bin/env python3 """ bootOsCustom @brief Plantilla para script de configuración personalizada de sistema operativo restaurado. @param $1 nº de disco @param $2 nº de partición @warning Renombrar este fichero como "bootOsCustom" para personalizar el script estándar "bootOs". @note La partición a inicializar debe estar montada @version 1.1.1 Soporta varios discos """ # CONFIGURAR: Partición de datos de Windows que no queremos ocultar (valor por defecto '0' no oculta nada) DISKDATA = 0 PARTDATA = 0 PROG = os.path.basename(__file__) # Control de errores if len(sys.argv) < 3: SystemLib.ogRaiseError(OG_ERR_FORMAT, f"Formato: {PROG} ndisco nparticion") sys.exit(1) # Parámetros obligatorios. DISK = sys.argv[1] # Nº de disco. PART = sys.argv[2] # Nº de partición. # Paso 0: Añadir código para realizar control de errores de los parámetros de entrada (recomendado). DEVICE = DiskLib.ogDiskToDev(DISK, PART) if not DEVICE: sys.exit(1) # Paso 1: Adaptar el código de ejemplo para arranque personalizado. # Nota: el script "bootOs" llama al script "bootOsCustom" después de realizar la operaciones de inicio estándar y antes de desmontar las particiones e iniciar el sistema operativo. MNTDIR = FileSystemLib.ogMount(DISK, PART) if not MNTDIR: sys.exit(1) NAME = NetLib.ogGetHostname() NAME = NAME if NAME else "pc" OSTYPE = Inventory.ogGetOsType(DISK, PART) if OSTYPE == "Windows": # Mostrar las particiones NTFS de sistema (dos opciones) # Opción 1: SIN ocultar las demás. # SystemLib.ogEcho log session "[40] Mostrar y activar particion de Windows {PART}." # if DiskLib.ogGetPartitionType(DISK, PART) in ["HNTFS", "WIN-RESERV"]: # DiskLib.ogUnhidePartition(DISK, PART) # Recorremos los distintos discos # for DEVICE in DiskLib.ogDiskToDev(): # d = DiskLib.ogDevToDisk(DEVICE) # # Mostrar las particiones NTFS de sistema (dos opciones) # # Opción 2: Ocultamos las demás. # SystemLib.ogEcho log session "[40] Activar particion de Windows {PART} y ocultar las demás." # for i in range(1, DiskLib.ogGetPartitionsNumber(d) + 1): # if (d == DISK and i == PART) or (d == DISKDATA and i == PARTDATA): # if DiskLib.ogGetPartitionType(d, i) in ["HNTFS", "WIN-RESERV"]: # DiskLib.ogUnhidePartition(d, i) # else: # if DiskLib.ogGetPartitionType(d, i) in ["NTFS", "WINDOWS"]: # DiskLib.ogHidePartition(d, i) # # Borrar marcas de arrranque de todos los Windows instalados en el disco. # SystemLib.ogEcho log session "[30] Borrar marcas de arrranque de todos los Windows instalados en el disco." # for i in range(1, DiskLib.ogGetPartitionsNumber(d) + 1): # if Inventory.ogGetOsType(d, i) == "Windows": # FileSystemLib.ogMount(d, i) # os.system("rm -f /mnt/*/ogboot.*") elif OSTYPE == "Linux": # Modificar el nombre del equipo # SystemLib.ogEcho log session "[30] Asignar nombre Linux \"{NAME}\"." # ETC = FileLib.ogGetPath(DISK, PART, "/etc") # if os.path.isdir(ETC): # with open(os.path.join(ETC, "hostname"), "w") as f: # f.write(NAME) # Sustituir UUID o LABEL por su dispositivo en definición de sistema de archivo raíz. # if os.path.isfile(os.path.join(ETC, "fstab")): # SystemLib.ogEcho log session "[40] Actualizar fstab con particion raíz \"{PART}\"." # with open(os.path.join(ETC, "fstab"), "r") as f: # lines = f.readlines() # with open("/tmp/fstab", "w") as f: # for line in lines: # if line.split()[1] == "/" and not line.startswith("#"): # line = line.replace(line.split()[0], PART) # f.write(line) # os.replace("/tmp/fstab", os.path.join(ETC, "fstab")) # Cambiar claves usuarios, copiando fichero /etc/passwd # En el servidor el nuevo fichero debe situarse en el directorio del grupo: # /opt/opengnsys/images/groups/nombre_aula # if os.path.isfile(os.path.join(ogGetGroupDir(), "passwd")): # SystemLib.ogEcho log session "[65] Cambiar claves de usuarios." # os.system(f"cp {os.path.join(ogGetGroupDir(), 'passwd')} {os.path.join(MNTDIR, 'etc')}")