refs #1623 add ogGrubAddOgLive, fix a bug
parent
3639dc1931
commit
c4f786d170
|
@ -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)
|
|
@ -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
|
||||
|
|
Loading…
Reference in New Issue