From 3639dc1931fa616307d1bdbb04bd87b1e5e5c40d Mon Sep 17 00:00:00 2001 From: Natalia Serrano Date: Mon, 3 Mar 2025 14:24:19 +0100 Subject: [PATCH] refs #1630 add ogGrubHidePartitions, fix bugs --- ogclient/functions/ogBootLoaderHidePartitions | 33 ++++++++ ogclient/functions/ogGrubHidePartitions | 33 ++++++++ ogclient/lib/python3/BootLib.py | 81 ++++++++++++++++++- ogclient/lib/python3/CacheLib.py | 6 +- ogclient/lib/python3/FileSystemLib.py | 1 - ogclient/lib/python3/SystemLib.py | 1 - ogclient/scripts/updateBootCache.py | 22 +++-- 7 files changed, 161 insertions(+), 16 deletions(-) create mode 100755 ogclient/functions/ogBootLoaderHidePartitions create mode 100755 ogclient/functions/ogGrubHidePartitions diff --git a/ogclient/functions/ogBootLoaderHidePartitions b/ogclient/functions/ogBootLoaderHidePartitions new file mode 100755 index 0000000..57a4fda --- /dev/null +++ b/ogclient/functions/ogBootLoaderHidePartitions @@ -0,0 +1,33 @@ +#!/usr/bin/python3 + +import sys +import argparse +import ogGlobals +from SystemLib import ogHelp +from BootLib import ogBootLoaderHidePartitions + +if 2 == len (sys.argv) and 'help' == sys.argv[1]: + #parser.print_help() sale en inglés aunque la locale indique otra cosa + ogHelp ('ogBootLoaderHidePartitions', ogGlobals.lang.MSG_SEE+' ogGrubHidePartitions', []) + sys.exit (0) + +parser = argparse.ArgumentParser (add_help=False) +if 3 == len (sys.argv): + parser.add_argument ('disk') + parser.add_argument ('par') +elif 5 == len (sys.argv): + parser.add_argument ('disk') + parser.add_argument ('par') + parser.add_argument ('datadisk') + parser.add_argument ('datapar') + +args = parser.parse_args() +if 3 == len (sys.argv): + ret = ogBootLoaderHidePartitions (args.disk, args.par) +elif 5 == len (sys.argv): + ret = ogBootLoaderHidePartitions (args.disk, args.par, args.datadisk, args.datapar) + +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/ogGrubHidePartitions b/ogclient/functions/ogGrubHidePartitions new file mode 100755 index 0000000..6fa7202 --- /dev/null +++ b/ogclient/functions/ogGrubHidePartitions @@ -0,0 +1,33 @@ +#!/usr/bin/python3 + +import sys +import argparse +import ogGlobals +from SystemLib import ogHelp +from BootLib import ogGrubHidePartitions + +if 2 == len (sys.argv) and 'help' == sys.argv[1]: + #parser.print_help() sale en inglés aunque la locale indique otra cosa + ogHelp ('ogGrubHidePartitions', 'ogGrubHidePartitions int_ndisk int_npartition [ num_disk_partdata num_partdata ]', ['ogGrubHidePartitions 1 2', 'ogGrubHidePartitions 1 2 1 3']) + sys.exit (0) + +parser = argparse.ArgumentParser (add_help=False) +if 3 == len (sys.argv): + parser.add_argument ('disk') + parser.add_argument ('par') +elif 5 == len (sys.argv): + parser.add_argument ('disk') + parser.add_argument ('par') + parser.add_argument ('datadisk') + parser.add_argument ('datapar') + +args = parser.parse_args() +if 3 == len (sys.argv): + ret = ogGrubHidePartitions (args.disk, args.par) +elif 5 == len (sys.argv): + ret = ogGrubHidePartitions (args.disk, args.par, args.datadisk, args.datapar) + +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 1a8577a..9f2e7f0 100644 --- a/ogclient/lib/python3/BootLib.py +++ b/ogclient/lib/python3/BootLib.py @@ -440,7 +440,7 @@ def ogGrubInstallMbr (disk, par, checkos='FALSE', kernelparam=''): prefixsecondstage = '' # Reactivamos el grub con el grub.cfg original. else: # SI Reconfigurar segunda etapa (grub.cfg) == TRUE #llamada a updateBootCache para que aloje la primera fase del ogLive - subprocess.run ([f'{ogGlobals.OGSCRIPTS}/updateBootCache.py'], check=True) ## TODO: check that this works + subprocess.run ([f'{ogGlobals.OGSCRIPTS}/updateBootCache.py'], check=True) if InventoryLib.ogIsEfiActive(): # UEFI: grubSintax necesita grub.cfg para detectar los kernels: si no existe recupero backup. @@ -713,6 +713,8 @@ def ogCleanLinuxDevices (disk, par): #@brief ver ogBootLoaderHidePartitions #@see ogBootLoaderHidePartitions #*/ ## +def ogGrubHidePartitions (disk, par, datadisk=None, datapar=None): + return ogBootLoaderHidePartitions (disk, par, datadisk, datapar) #/** # ogBootLoaderHidePartitions num_disk num_part @@ -726,6 +728,82 @@ def ogCleanLinuxDevices (disk, par): #@exception No existe archivo de configuracion del grub/burg. #*/ +def ogBootLoaderHidePartitions (disk, par, datadisk=None, datapar=None): + # Nombre de la función que llama a esta. + func = inspect.stack()[1][3] + + # Si no existe $4 pongo un valor imposible para la partición de datos + if datapar: + partdata = DiskLib.ogDiskToDev (datadisk, datapar) + else: + partdata = '0' + + # Archivo de configuracion del grub + DIRMOUNT = FileSystemLib.ogMount (disk, par) + # La función debe ser llamanda desde ogGrubHidePartitions or ogBurgHidePartitions. + if 'ogGrubHidePartitions' == func: + cfgfile = f'{DIRMOUNT}/boot/grubMBR/boot/grub/grub.cfg' + else: + SystemLib.ogRaiseError ([], ogGlobals.OG_ERR_FORMAT, f'Use ogGrubHidePartitions') + return None + + # Error si no existe archivo del grub + if not os.path.exists (cfgfile): + SystemLib.ogRaiseError ([], ogGlobals.OG_ERR_NOTFOUND, cfgfile) + return None + + # Si solo hay una particion de Windows me salgo + num_ntfs = 0 + disks = DiskLib.ogDiskToDev() + fdisk_out = subprocess.run (['fdisk', '-l']+disks, capture_output=True, text=True).stdout + for l in fdisk_out.splitlines(): + if 'NTFS' in l: num_ntfs += 1 + if 1 == num_ntfs: return True + + # Elimino llamadas a parttool, se han incluido en otras ejecuciones de esta funcion. + subprocess.run (['sed', '-i', '/parttool/d', cfgfile]) + + parttabletype = DiskLib.ogGetPartitionTableType (disk) + parttabletype = parttabletype.lower() + + # Entradas de Windows: numero de linea y particion. De mayor a menor. + #1:/dev/sda2 + #2:/dev/sda3 + awk_out = subprocess.run (f''' + awk '/menuentry.*Windows/ {{gsub(/\\)"/, ""); gsub(/^.*dev/,""); print NR":/dev"$1}} ' {cfgfile} + ''', shell=True, text=True).stdout + if awk_out: + winentry = awk_out.splitlines() + winentry.reverse() + else: + winentry = [] + + # Particiones de Windows, pueden no estar en el grub. + winpart = [] + for l in fdisk_out.splitlines(): ## aprovechamos la variable fdisk_out de antes + if 'NTFS' not in l: continue + items = l.split (' ') + winpart.append (items[0]) + winpart.reverse() + + # Modifico todas las entradas de Windows. + for entry in winentry: + line, part = entry.split (':') + # En cada entrada, oculto o muestro cada particion. + TEXT = '' + for parthidden in winpart: + # Muestro la particion de la entrada actual y la de datos. + if parthidden == part or parthidden == partdata: + HIDDEN = '-' + else: + HIDDEN = '+' + numdisk, numpart = DiskLib.ogDevToDisk (parthidden).split() + numdisk = int (numdisk) + numpart = int (numpart) + TEXT = f'\tparttool (hd{numdisk-1},{parttabletype}{numpart}) hidden{hidden} \n{text}' + subprocess.run (['sed', '-i', f'{line}a\\ {text}', cfgfile]) + # Activamos la particion que se inicia en todas las entradas de windows. + subprocess.run (['sed', '-i', '/chainloader/i\\\tparttool ${root} boot+', cfgfile]) #/** # ogGrubDeleteEntry num_disk num_part num_disk_delete num_part_delete #@brief ver ogBootLoaderDeleteEntry @@ -788,7 +866,6 @@ def ogGrubOgliveDefaultEntry (disk, par): #*/ ## def ogBootLoaderOgliveDefaultEntry (disk, par): func = inspect.stack()[1][3] - print (f'nati func ({func})') PART = FileSystemLib.ogMount (disk, par) if not PART: return None diff --git a/ogclient/lib/python3/CacheLib.py b/ogclient/lib/python3/CacheLib.py index 1c4357c..bb4a3ce 100644 --- a/ogclient/lib/python3/CacheLib.py +++ b/ogclient/lib/python3/CacheLib.py @@ -9,7 +9,6 @@ import ogGlobals import SystemLib import DiskLib import FileSystemLib -import CacheLib #/** # ogCreateCache [int_ndisk] int_partsize @@ -240,8 +239,7 @@ def ogFormatCache(): os.makedirs (j, exist_ok=True) # Incluir kernel e Initrd del ogLive - ## como lo llamo sin especificar el path entero? - #subprocess.run (['scripts/updateBootCache.py']) ## TODO + subprocess.run ([f'{ogGlobals.OGSCRIPTS}/updateBootCache.py']) #/** @@ -365,5 +363,5 @@ def ogUnmountCache(): #@return lo mismo que devuelve initCache #*/ ## def initCache (*args): - p = subprocess.run (['/opt/opengnsys/images/nati/client/shared/scripts/initCache.py'] + list(args)) + p = subprocess.run ([f'{ogGlobals.OGSCRIPTS}/initCache.py'] + list(args)) return p.returncode diff --git a/ogclient/lib/python3/FileSystemLib.py b/ogclient/lib/python3/FileSystemLib.py index 15139f3..1d8e954 100644 --- a/ogclient/lib/python3/FileSystemLib.py +++ b/ogclient/lib/python3/FileSystemLib.py @@ -14,7 +14,6 @@ import ogGlobals import SystemLib import DiskLib import CacheLib -import FileSystemLib #/** diff --git a/ogclient/lib/python3/SystemLib.py b/ogclient/lib/python3/SystemLib.py index 86491a3..dca5232 100644 --- a/ogclient/lib/python3/SystemLib.py +++ b/ogclient/lib/python3/SystemLib.py @@ -13,7 +13,6 @@ from contextlib import redirect_stdout, redirect_stderr import ogGlobals import StringLib -import SystemLib #NODEBUGFUNCTIONS, OGIMG, OG_ERR_CACHESIZE, OG_ERR_NOTCACHE, OG_ERR_NOTWRITE, OG_ERR_FILESYS #OG_ERR_REPO, OG_ERR_NOTOS, OG_ERR_NOGPT, OG_ERR_OUTOFLIMIT, OG_ERR_IMAGE, OG_ERR_CACHE diff --git a/ogclient/scripts/updateBootCache.py b/ogclient/scripts/updateBootCache.py index 854b9c9..e698b90 100755 --- a/ogclient/scripts/updateBootCache.py +++ b/ogclient/scripts/updateBootCache.py @@ -1,6 +1,7 @@ #!/usr/bin/python3 import os +import sys import shutil import ogGlobals @@ -34,29 +35,34 @@ if not CacheLib.ogMountCache(): os.makedirs (ogbcache, exist_ok=True) +servervmlinuz = serverinitrd = cachevmlinuz = cacheinitrd = '' # comparamos los del server -with open (f'{ogbtftp}/ogvmlinuz.sum', 'rb') as fd: servervmlinuz = fd.read() -with open (f'{ogbtftp}/oginitrd.img.sum', 'rb') as fd: serverinitrd = fd.read() +if os.path.exists (f'{ogbtftp}/ogvmlinuz.sum'): + with open (f'{ogbtftp}/ogvmlinuz.sum', 'r') as fd: servervmlinuz = fd.read().strip() +if os.path.exists (f'{ogbtftp}/oginitrd.img.sum'): + with open (f'{ogbtftp}/oginitrd.img.sum', 'r') as fd: serverinitrd = fd.read().strip() #comparamos los de la cache -with open (f'{ogbcache}/ogvmlinuz.sum', 'rb') as fd: cachevmlinuz = fd.read() -with open (f'{ogbcache}/oginitrd.img.sum', 'rb') as fd: cacheinitrd = fd.read() +if os.path.exists (f'{ogbcache}/ogvmlinuz.sum'): + with open (f'{ogbcache}/ogvmlinuz.sum', 'r') as fd: cachevmlinuz = fd.read().strip() +if os.path.exists (f'{ogbcache}/oginitrd.img.sum'): + with open (f'{ogbcache}/oginitrd.img.sum', 'r') as fd: cacheinitrd = fd.read().strip() print (f'MD5 on SERVER: {servervmlinuz} {serverinitrd}') print (f'MD5 on CACHE: {cachevmlinuz} {cacheinitrd}') -do_reboot = '0' +do_reboot = '' if cachevmlinuz != servervmlinuz: print ('ogvmlinuz updating') shutil.copy2 (f'{ogbtftp}/ogvmlinuz', f'{ogbcache}/ogvmlinuz') shutil.copy2 (f'{ogbtftp}/ogvmlinuz.sum', f'{ogbcache}/ogvmlinuz.sum') - do_reboot = '1' + do_reboot = 'true' if cacheinitrd != serverinitrd: print ('oginitrd updating') shutil.copy2 (f'{ogbtftp}/oginitrd.img', f'{ogbcache}/oginitrd.img') shutil.copy2 (f'{ogbtftp}/oginitrd.img.sum', f'{ogbcache}/oginitrd.img.sum') - do_reboot = '1' + do_reboot = 'true' print (do_reboot) -os.exit (0) +sys.exit (0)