From c4f786d1709afa066e3d393dcbc4bd6343bb032d Mon Sep 17 00:00:00 2001 From: Natalia Serrano Date: Tue, 4 Mar 2025 12:55:05 +0100 Subject: [PATCH] refs #1623 add ogGrubAddOgLive, fix a bug --- ogclient/functions/ogGrubAddOgLive | 25 ++++++++++ ogclient/lib/python3/BootLib.py | 79 +++++++++++++++++++++++++++++- 2 files changed, 103 insertions(+), 1 deletion(-) create mode 100755 ogclient/functions/ogGrubAddOgLive diff --git a/ogclient/functions/ogGrubAddOgLive b/ogclient/functions/ogGrubAddOgLive new file mode 100755 index 0000000..7b50aa7 --- /dev/null +++ b/ogclient/functions/ogGrubAddOgLive @@ -0,0 +1,25 @@ +#!/usr/bin/python3 + +import sys +import argparse +from SystemLib import ogHelp +from BootLib import ogGrubAddOgLive + +parser = argparse.ArgumentParser (add_help=False) +parser.add_argument ('disk') +parser.add_argument ('par') +parser.add_argument ('timeout', nargs='?') +parser.add_argument ('offline', nargs='?') + +if 2 == len (sys.argv) and 'help' == sys.argv[1]: + #parser.print_help() sale en inglés aunque la locale indique otra cosa + ogHelp ('ogGrubAddOgLive', 'ogGrubAddOgLive int_ndisk int_npartition [ time_out ] [ offline|online ]', ['ogGrubAddOgLive 1 1', 'ogGrubAddOgLive 1 6 15 offline']) + sys.exit (0) + +args = parser.parse_args() +ret = ogGrubAddOgLive (args.disk, args.par, args.timeout, args.offline) + +if ret is not None: + if ret == True: sys.exit (0) + elif ret == False: sys.exit (1) + else: print (ret) diff --git a/ogclient/lib/python3/BootLib.py b/ogclient/lib/python3/BootLib.py index 9f2e7f0..03277cc 100644 --- a/ogclient/lib/python3/BootLib.py +++ b/ogclient/lib/python3/BootLib.py @@ -22,6 +22,7 @@ import DiskLib import InventoryLib import FileLib import UEFILib +import CacheLib #/** # ogBoot int_ndisk int_nfilesys [ NVRAMPERM ] [str_kernel str_initrd str_krnlparams] @@ -454,7 +455,7 @@ def ogGrubInstallMbr (disk, par, checkos='FALSE', kernelparam=''): fd.write ('GRUB_DISABLE_RECOVERY="true"\n') fd.write ('GRUB_DISABLE_LINUX_UUID="true"\n') - os.makedirs (f'{secondstage}{prefixsecondstage}/boot/grub/') #Preparar configuración segunda etapa: crear ubicacion + os.makedirs (f'{secondstage}{prefixsecondstage}/boot/grub/', exist_ok=True) #Preparar configuración segunda etapa: crear ubicacion subprocess.run (['sed', '-i', 's/^set -e/#set -e/', '/etc/grub.d/00_header']) #Preparar configuración segunda etapa: crear cabecera del fichero (ingnorar errores) # (ogLive 5.0) Si 'pkgdatadir' está vacía ponemos valor de otros ogLive subprocess.run (['sed', '-i', r'/grub-mkconfig_lib/i\pkgdatadir=${pkgdatadir:-"${datarootdir}/grub"}', '/etc/grub.d/00_header']) @@ -708,6 +709,82 @@ def ogCleanLinuxDevices (disk, par): # /// FIXME: Solo para el grub instalado en MBR por Opengnsys, ampliar para más casos. #*/ ## + +def ogGrubAddOgLive (disk, par, timeout=None, offline=''): + oglivedir = os.environ.get ('oglivedir', 'ogLive') + # Error si no existe el kernel y el initrd en la cache. + # Falta crear nuevo codigo de error. + if not os.path.exists (f'{ogGlobals.OGCAC}/boot/{oglivedir}/ogvmlinuz') or not os.path.exists (f'{ogGlobals.OGCAC}/boot/{oglivedir}/oginitrd.img'): + SystemLib.ogRaiseError (['log', 'session'], ogGlobals.OG_ERR_NOTFOUND, 'CACHE: ogvmlinuz, oginitrd.img') + return None + + # Archivo de configuracion del grub + dirmount = FileSystemLib.ogMount (disk, par) + grubcfg = f'{dirmount}/boot/grubMBR/boot/grub/grub.cfg' + + # Error si no existe archivo del grub + if not os.path.exists (grubcfg): + SystemLib.ogRaiseError (['log', 'session'], ogGlobals.OG_ERR_NOTFOUND, grubcfg) + return None + + # Si existe la entrada de opengnsys, se borra + grubcfg_contents = '' + with open (grubcfg, 'r') as fd: + grubcfg_contents = fd.read() + if 'menuentry Opengnsys' in grubcfg_contents: + subprocess.run (['sed', '-ie', '/menuentry Opengnsys/,+6d', grubcfg]) + + # Tipo de tabla de particiones + parttabletype = DiskLib.ogGetPartitionTableType (disk) + parttabletype = parttabletype.lower() + + # Localizacion de la cache + cachepart = CacheLib.ogFindCache() + if not cachepart: + SystemLib.ogRaiseError (['log', 'session'], ogGlobals.OG_ERR_NOTCACHE, '') + return None + numdisk, numpart = cachepart.split() + numdisk = int (numdisk) - 1 + # kernel y sus opciones. Pasamos a modo usuario + proc_cmdline = '' + with open ('/proc/cmdline', 'r') as fd: + proc_cmdline = fd.read().strip() + proc_cmdline = re.sub ('^.*linuz', '', proc_cmdline) + proc_cmdline = re.sub ('ogactiveadmin=[a-z]*', '', proc_cmdline) + kernel = f'/boot/{oglivedir}/ogvmlinuz {proc_cmdline}' + + # Configuracion offline si existe parametro + STATUS = '' + if not offline: offline = '' + if 'offline' in offline: STATUS = 'offline' + if 'online' in offline: STATUS = 'online' + if STATUS: + kernel = re.sub ('ogprotocol=[a-z]* ', 'ogprotocol=local ', kernel) + kernel += f' ogstatus={STATUS}' + + # Numero de línea de la primera entrada del grub. + grep_out = subprocess.run (['grep', '--line-number', '--max-count', '1', '^menuentry', grubcfg], capture_output=True, text=True).stdout + numline, _ = grep_out.split (':', maxsplit=1) + # Texto de la entrada de opengnsys + menuentry = f'''menuentry "OpenGnsys" --class opengnsys --class gnu --class os {{ \\ +\tinsmod part_{parttabletype} \\ +\tinsmod ext2 \\ +\tset root='(hd{numdisk},{parttabletype}{numpart})' \\ +\tlinux {kernel} \\ +\tinitrd /boot/{oglivedir}/oginitrd.img \\ +}}''' + + + # Insertamos la entrada de opengnsys antes de la primera entrada existente. + subprocess.run (['sed', '-i', f'{numline}i\\ {menuentry}', grubcfg]) + + # Ponemos que la entrada por defecto sea la primera. + subprocess.run (['sed', '-i', f's/set.*default.*$/set default="0"/g', grubcfg]) + + # Si me dan valor para timeout lo cambio en el grub. + if timeout: + subprocess.run (['sed', '-i', f's/timeout=.*$/timeout={timeout}/g', grubcfg]) + #/** # ogGrubHidePartitions num_disk num_part #@brief ver ogBootLoaderHidePartitions