From cd81c16afbdeeb7dba8748f1e696f84457575aa7 Mon Sep 17 00:00:00 2001 From: Natalia Serrano Date: Wed, 5 Mar 2025 10:43:12 +0100 Subject: [PATCH] refs #1631 add ogGrubDeleteEntry, fix a bug --- ogclient/functions/ogBootLoaderDeleteEntry | 26 ++++++++++ ogclient/functions/ogGrubDeleteEntry | 25 ++++++++++ ogclient/lib/python3/BootLib.py | 57 +++++++++++++++++++++- 3 files changed, 107 insertions(+), 1 deletion(-) create mode 100755 ogclient/functions/ogBootLoaderDeleteEntry create mode 100755 ogclient/functions/ogGrubDeleteEntry diff --git a/ogclient/functions/ogBootLoaderDeleteEntry b/ogclient/functions/ogBootLoaderDeleteEntry new file mode 100755 index 0000000..1d1c21d --- /dev/null +++ b/ogclient/functions/ogBootLoaderDeleteEntry @@ -0,0 +1,26 @@ +#!/usr/bin/python3 + +import sys +import argparse +import ogGlobals +from SystemLib import ogHelp +from BootLib import ogBootLoaderDeleteEntry + +parser = argparse.ArgumentParser (add_help=False) +parser.add_argument ('disk') +parser.add_argument ('par') +parser.add_argument ('diskdel') +parser.add_argument ('pardel') + +if 2 == len (sys.argv) and 'help' == sys.argv[1]: + #parser.print_help() sale en inglés aunque la locale indique otra cosa + ogHelp ('ogBootLoaderDeleteEntry', ogGlobals.lang.MSG_SEE+' ogGrubDeleteEntry', []) + sys.exit (0) + +args = parser.parse_args() +ret = ogBootLoaderDeleteEntry (args.disk, args.par, args.diskdel, args.pardel) + +if ret is not None: + if ret == True: sys.exit (0) + elif ret == False: sys.exit (1) + else: print (ret) diff --git a/ogclient/functions/ogGrubDeleteEntry b/ogclient/functions/ogGrubDeleteEntry new file mode 100755 index 0000000..d10f764 --- /dev/null +++ b/ogclient/functions/ogGrubDeleteEntry @@ -0,0 +1,25 @@ +#!/usr/bin/python3 + +import sys +import argparse +from SystemLib import ogHelp +from BootLib import ogGrubDeleteEntry + +parser = argparse.ArgumentParser (add_help=False) +parser.add_argument ('disk') +parser.add_argument ('par') +parser.add_argument ('diskdel') +parser.add_argument ('pardel') + +if 2 == len (sys.argv) and 'help' == sys.argv[1]: + #parser.print_help() sale en inglés aunque la locale indique otra cosa + ogHelp ('ogGrubDeleteEntry', 'ogGrubDeleteEntry int_ndisk int_npartition int_disk_delete int_npartition_delete', ['ogGrubDeleteEntry 1 6 2 1']) + sys.exit (0) + +args = parser.parse_args() +ret = ogGrubDeleteEntry (args.disk, args.par, args.diskdel, args.pardel) + +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 03277cc..32955f1 100644 --- a/ogclient/lib/python3/BootLib.py +++ b/ogclient/lib/python3/BootLib.py @@ -886,6 +886,8 @@ def ogBootLoaderHidePartitions (disk, par, datadisk=None, datapar=None): #@brief ver ogBootLoaderDeleteEntry #@see ogBootLoaderDeleteEntry #*/ +def ogGrubDeleteEntry (disk, par, diskdel, pardel): + return ogBootLoaderDeleteEntry (disk, par, diskdel, pardel) #/** # ogBootLoaderDeleteEntry num_disk num_part num_part_delete @@ -901,6 +903,59 @@ def ogBootLoaderHidePartitions (disk, par, datadisk=None, datapar=None): #@exception OG_ERR_NOTFOUND No existe archivo de configuracion del grub. #*/ ## +def ogBootLoaderDeleteEntry (disk, par, diskdel, pardel): + # Nombre de la función que llama a esta. + func = inspect.stack()[1][3] + + # Archivo de configuracion del grub + dirmount = FileSystemLib.ogMount (disk, par) + # La función debe ser llamanda desde ogGrubDeleteEntry, ogBurgDeleteEntry or ogRefindDeleteEntry. + if 'ogGrubDeleteEntry' == func: + cfgfile = f'{dirmount}/boot/grubMBR/boot/grub/grub.cfg' + else: + SystemLib.ogRaiseError ([], ogGlobals.OG_ERR_FORMAT, f'Use ogGrubDeleteEntry') + return None + + # Dispositivo + label = DiskLib.ogDiskToDev (diskdel, pardel) + + # Error si no existe archivo de configuración + if not os.path.exists (cfgfile): + SystemLib.ogRaiseError ([], ogGlobals.OG_ERR_NOTFOUND, cfgfile) + return None + + # Numero de linea de cada entrada. + menuentry = [] + grep_out = subprocess.run (['grep', '-n', '-e', 'menuentry', cfgfile], capture_output=True, text=True).stdout + if grep_out: + for l in grep_out.splitlines(): + lineno, _ = l.split (':', maxsplit=1) + menuentry.append (lineno) + menuentry.reverse() + + # Entradas que hay que borrar. + deleteentry = [] + grep_out = subprocess.run (['grep', '-n', f'menuentry.*{label}', cfgfile], capture_output=True, text=True).stdout + if grep_out: + for l in grep_out.splitlines(): + lineno, _ = l.split (':', maxsplit=1) + deleteentry.append (lineno) + + # Si no hay entradas para borrar me salgo con aviso + if not deleteentry: + SystemLib.ogRaiseError (['log', 'session'], ogGlobals.OG_ERR_NOTFOUND, f'Menuentry {label}') + return None + + # Recorremos el fichero del final hacia el principio. + with open (cfgfile, 'r') as fd: + endentry = len (fd.read().splitlines()) + for entry in menuentry: + # Comprobamos si hay que borrar la entrada. + if entry in deleteentry: + endentry -= 1 + subprocess.run (['sed', '-i', '-e', f'{entry},{endentry}d', cfgfile]) + # Guardamos el número de línea de la entrada, que sera el final de la siguiente. + endentry = entry #/** # ogGrubDefaultEntry int_disk_GRUGCFG int_partition_GRUBCFG int_disk_default_entry int_npartition_default_entry #@brief ver ogBootLoaderDefaultEntry @@ -973,7 +1028,7 @@ def ogBootLoaderOgliveDefaultEntry (disk, par): return None numentry -= 1 - subprocess.run (['sed', '--regexp-extended', '-i', f's/"set default=\"?[0-9]+\"?"/"set default=\"{numentry}\""/g', cfgfile]) + subprocess.run (['sed', '--regexp-extended', '-i', f's/set default="?[0-9]+"?/set default="{numentry}"/g', cfgfile]) MSG = f'ogGlobals.lang.MSG_HELP_{func}' try: MSG = eval (MSG)