#!/usr/bin/python3 #/** # configureOs #@brief Script para realizar la configuracion del sistema operativo restaurado. #@param 1 disco #@param 2 particion #@return #@TODO comprobar que el tipo de particion corresponde con el sistema de archivos. #@exception OG_ERR_FORMAT # 1 formato incorrecto. #*/ ## import sys import os import os.path import subprocess import ogGlobals import SystemLib import DiskLib import FileSystemLib import NetLib import InventoryLib import BootLib import UEFILib import PostConfLib import FileLib ## el código bash original hace: ## [ -f $DEVICECFG ] && source $DEVICECFG ## pero luego no utiliza ninguna de las variables definidas en el archivo... disk = sys.argv[1] par = sys.argv[2] # Si el sistema de archivos no esta extendido, ampliarlo al tamaño de su partición. partsize = DiskLib.ogGetPartitionSize (disk, par) if not partsize: sys.exit (1) fssize = FileSystemLib.ogGetFsSize (disk, par) if fssize < partsize: print ('Extender sistema de archivos.') FileSystemLib.ogExtendFs (disk, par) # Si no existe partición activa, activar este sistema. flagactive = DiskLib.ogGetPartitionActive (disk) if not flagactive: DiskLib.ogSetPartitionActive (disk, par) # Si el sistema de archivos es de solo lectura, no hacer la post-configuración. mntdir = FileSystemLib.ogMount (disk, par) if not FileSystemLib.ogIsWritable (disk, par): print ('AVISO: sistema de archivos de solo lectura, no se ejecuta postconfiguración.') sys.exit (0) # Nombre del cliente. host = NetLib.ogGetHostname() # Post-configuración personalizada para cada tipo de sistema operativo. ostype = InventoryLib.ogGetOsType (disk, par) if 'Windows' == ostype: if not host: host = 'pc' BootLib.ogSetWindowsName (disk, par, host) # Cambiar nombre en sistemas Windows. if InventoryLib.ogIsEfiActive(): # Si es UEFI copio el cargador de arranque a la partición EFI e instalo Grub. UEFILib.ogRestoreEfiBootLoader (disk, par) esp = DiskLib.ogGetEsp() if not esp: SystemLib.ogRaiseError ([], ogGlobals.OG_ERR_NOTFOUND, 'ESP') sys.exit (1) efidisk, efipart = esp.split() BootLib.ogGrubInstallMbr (efidisk, efipart, 'TRUE') else: BootLib.ogFixBootSector (disk, par) # Configurar el boot sector de la partición Windows. BootLib.ogWindowsBootParameters (disk, par) # Configurar el gestor de arranque de Windows XP/Vista/7. BootLib.ogWindowsRegisterPartition (disk, par, 'C', disk, par) # Registrar en Windows que la partición indicada es su nueva unidad C:\ PostConfLib.ogConfigureOgagent (disk, par) # Configurar nuevo agente OGAgent. path1 = FileLib.ogGetPath (file=f'{mntdir}/windows/ogAdmWinClient.exe') path2 = FileLib.ogGetPath (file=f'{mntdir}/winnt/ogAdmWinClient.exe') if path1 or path2: # Eliminar el antiguo cliente de Windows. PostConfLib.ogInstallMiniSetup (disk, par, 'postconf.cmd') PostConfLib.ogUninstallWindowsClient (disk, par, 'postconf.cmd') elif 'Linux' == ostype: BootLib.ogConfigureFstab (disk, par) # Configuro fstab: particion de Swap y si es UEFI además la partición EFI. if InventoryLib.ogIsEfiActive(): # Si es UEFI instalo Grub en la partición EFI esp = DiskLib.ogGetEsp() efidisk, efipart = esp.split() BootLib.ogGrubInstallMbr (efidisk, efipart, 'TRUE') BootLib.ogGrubInstallPartition (disk, par) ## Instala (no configura) el codigo de arranque del Grub en la partición (no lo configura, se mantiene el original de la imagen) find_out = subprocess.run (['find', f'{mntdir}/usr/sbin', f'{mntdir}/sbin', f'{mntdir}/usr/local/sbin', '-name', 'ogAdmLnxClient', '-print'], capture_output=True, text=True).stdout if find_out: PostConfLib.ogUninstallLinuxClient (disk, par) # Eliminar el antiguo cliente de Linux. PostConfLib.ogConfigureOgagent (disk, par) # Configurar nuevo agente OGAgent. ## Modificar el nombre del equipo print (f'Asignar nombre Linux "{host}".') etc = FileLib.ogGetPath (src=f'{disk} {par}', file='/etc') if os.path.isdir (etc): with open (f'{etc}/hostname', 'w') as fd: fd.write (f'{host}\n') elif 'MacOS' == ostype: open (f'{mntdir}/osxpostconf', 'a').close() ## touch, Fichero indicador de activación de postconfiguración. # Crear fichero de configuración del servicio de arranque. with open (f'{mntdir}/Library/LaunchDaemons/es.opengnsys.postconfd.plist', 'w') as fd: fd.write ('\n') fd.write ('\n') fd.write ('\t\n') fd.write ('\t\tLabel\n') fd.write ('\t\tes.opengnsys.postconfd.sh\n') fd.write ('\t\tProgramArguments\n') fd.write ('\t\t\n') fd.write ('\t\t\t/var/root/postconfd.sh\n') fd.write ('\t\t\n') fd.write ('\t\tRunAtLoad\n') fd.write ('\t\t\n') fd.write ('\t\tStandardOutPath\n') fd.write ('\t\t/var/log/postconfd.log\n') fd.write ('\t\tStandardErrorPath\n') fd.write ('\t\t/var/log/postconfd.err\n') fd.write ('\t\tDebug\n') fd.write ('\t\t\n') fd.write ('\t\n') fd.write ('\n') # Programa de inicio que será ejecutado en el arranque de Mac OS X. with open (f'{mntdir}/var/root/postconfd.sh', 'w') as fd: fd.write ('#!/bin/bash\n') fd.write ('# postconfd - ejecución de scripts de inicio.\n') fd.write ('\n') fd.write ('# Ejecutar postconfiguración si existe el fichero indicador.\n') fd.write ('if [ -e /osxpostconf ]; then\n') fd.write ('\t# Tomar nombre del equipo.\n') fd.write (f'\tHOST="{host}"\n') fd.write ('\tif [ -z "$HOST" ]; then\n') fd.write ('\t\t# Si no hay nombre asociado, activar la red para obtener datos del DHCP.\n') fd.write ('\t\tsource /etc/rc.common\n') fd.write ('\t\tCheckForNetwork\n') fd.write ('\t\twhile [ "$NETWORKUP" != "-YES-" ]; do\n') fd.write ('\t\t\tsleep 5\n') fd.write ('\t\t\tNETWORKUP=\n') fd.write ('\t\t\tCheckForNetwork\n') fd.write ('\t\tdone\n') fd.write ('\t\t# Componer nombre del equipo a partir de datos del DHCP.\n') fd.write ('\t\tIP=$(ifconfig en0 inet | awk \'{if ($1=="inet") print $2}\')\n') fd.write ('\t\tHOST="mac-$(echo ${IP//./-} | cut -f3-4 -d-)"\n') fd.write ('\tfi\n') fd.write ('\t# Asignar nombre del equipo.\n') fd.write ('\tscutil --set ComputerName "$HOST"\n') fd.write ('\tscutil --set LocalHostName "$HOST"\n') fd.write ('\tscutil --set HostName "$HOST"\n') fd.write ('\thostname "$HOST"\n') fd.write ('\t# Descromprimir ficheros de versión para obtener inventario de aplicaciones.\n') fd.write ('\tfind /Applications -type d -name "*.app" -prune -exec \\n') fd.write ('\t ditto --nopreserveHFSCompression "{}/Contents/version.plist" "{}/Contents/version.plist.uncompress"\n') fd.write ('\trm -f /osxpostconf # Borrar fichero indicador de psotconfiguración\n') fd.write ('fi\n') os.chmod (f'{mntdir}/var/root/postconfd.sh', 0o700) # Dar permiso de ejecución. PostConfLib.ogConfigureOgagent (disk, par) # Configurar nuevo agente OGAgent de sistema operativo. sys.exit (0)