diff --git a/client/lib/engine/bin/UEFILib.py b/client/lib/engine/bin/UEFILib.py index 4c54401..a70b5a7 100644 --- a/client/lib/engine/bin/UEFILib.py +++ b/client/lib/engine/bin/UEFILib.py @@ -117,6 +117,39 @@ def ogNvramAddEntry (bootlbl, bootldr, nvram_set=False): #@exception OG_ERR_NOTFOUND fichero o dispositivo no encontrado. #@note Si existe el cargador en la partición de sistema no es válido #*/ ## +def ogCopyEfiBootLoader (disk, par): + mntdir = FileSystemLib.ogMount (disk, par) + if not mntdir: + SystemLib.ogRaiseError ([], ogGlobals.OG_ERR_PARTITION, f'{disk} {par}') + return None + + esp = DiskLib.ogGetEsp() + if not esp: + SystemLib.ogRaiseError ([], ogGlobals.OG_ERR_NOTFOUND, 'EFI partition') + return + esp_disk, esp_par = esp.split() + efidir = FileSystemLib.ogMount (esp_disk, esp_par) + if not efidir: + SystemLib.ogRaiseError ([], ogGlobals.OG_ERR_PARTITION, 'ESP') + return + + bootlabel = f'Part-{int(disk):02d}-{int(par):02d}' + osversion = InventoryLib.ogGetOsVersion (disk, par) + print (f'bootlabel ({bootlabel})') + print (f'osversion ({osversion})') + if 'Windows 1' in osversion: + loader = None + for i in f'{efidir}/EFI/Microsoft/Boot/bootmgfw.efi', f'{efidir}/EFI/{bootlabel}/Boot/bootmgfw.efi': + if os.path.exists (i): + loader = i + if not loader: + SystemLib.ogRaiseError ([], ogGlobals.OG_ERR_NOTOS, f'{disk} {par} ({osversion}, EFI)') + return None + + if (os.path.isdir (f'{mntdir}/ogBoot')): + shutil.rmtree (f'{mntdir}/ogBoot') + dirloader = os.path.realpath (os.path.dirname (loader) + '/..') + shutil.copytree (f'{dirloader}/Boot', f'{mntdir}/ogBoot') #/** diff --git a/client/shared/functions/ogCopyEfiBootLoader b/client/shared/functions/ogCopyEfiBootLoader new file mode 100755 index 0000000..41d5d9b --- /dev/null +++ b/client/shared/functions/ogCopyEfiBootLoader @@ -0,0 +1,23 @@ +#!/usr/bin/python3 + +import sys +import argparse +from SystemLib import ogHelp +from UEFILib import ogCopyEfiBootLoader + +parser = argparse.ArgumentParser (add_help=False) +parser.add_argument ('disk') +parser.add_argument ('par') + +if 2 == len (sys.argv) and 'help' == sys.argv[1]: + #parser.print_help() sale en inglés aunque la locale indique otra cosa + ogHelp ('ogCopyEfiBootLoader', 'ogCopyEfiBootLoader int_ndisk int_part', ['ogCopyEfiBootLoader 1 2']) + sys.exit (0) + +args = parser.parse_args() +ret = ogCopyEfiBootLoader (args.disk, args.par) + +if ret is not None: + if ret == True: sys.exit (0) + elif ret == False: sys.exit (1) + else: print (ret)