refs #1623 add ogGrubAddOgLive, fix a bug

pull/5/head
Natalia Serrano 2025-03-04 12:55:05 +01:00
parent 3639dc1931
commit c4f786d170
2 changed files with 103 additions and 1 deletions

View File

@ -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)

View File

@ -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