From d54925252fdda28a8958c36258e44d41b5193e66 Mon Sep 17 00:00:00 2001 From: Natalia Serrano Date: Fri, 24 Jan 2025 15:41:23 +0100 Subject: [PATCH] refs #1337 add UEFI commands and a couple of fixes elsewhere --- client/lib/engine/bin/InventoryLib.py | 7 ++++-- client/lib/engine/bin/UEFILib.py | 15 ++++++------ client/shared/functions/ogGetEsp | 22 +++++++++++++++++ client/shared/functions/ogGetPath | 8 +++++-- client/shared/functions/ogNvramActiveEntry | 22 +++++++++++++++++ client/shared/functions/ogNvramAddEntry | 24 +++++++++++++++++++ client/shared/functions/ogNvramDeleteEntry | 22 +++++++++++++++++ client/shared/functions/ogNvramGetCurrent | 22 +++++++++++++++++ client/shared/functions/ogNvramGetNext | 22 +++++++++++++++++ client/shared/functions/ogNvramGetOrder | 22 +++++++++++++++++ client/shared/functions/ogNvramGetTimeout | 22 +++++++++++++++++ client/shared/functions/ogNvramInactiveEntry | 22 +++++++++++++++++ client/shared/functions/ogNvramList | 22 +++++++++++++++++ client/shared/functions/ogNvramPxeFirstEntry | 22 +++++++++++++++++ client/shared/functions/ogNvramSetNext | 22 +++++++++++++++++ client/shared/functions/ogNvramSetOrder | 16 +++++++++++++ client/shared/functions/ogNvramSetTimeout | 22 +++++++++++++++++ .../shared/functions/ogRestoreEfiBootLoader | 23 ++++++++++++++++++ 18 files changed, 346 insertions(+), 11 deletions(-) create mode 100755 client/shared/functions/ogGetEsp create mode 100755 client/shared/functions/ogNvramActiveEntry create mode 100755 client/shared/functions/ogNvramAddEntry create mode 100755 client/shared/functions/ogNvramDeleteEntry create mode 100755 client/shared/functions/ogNvramGetCurrent create mode 100755 client/shared/functions/ogNvramGetNext create mode 100755 client/shared/functions/ogNvramGetOrder create mode 100755 client/shared/functions/ogNvramGetTimeout create mode 100755 client/shared/functions/ogNvramInactiveEntry create mode 100755 client/shared/functions/ogNvramList create mode 100755 client/shared/functions/ogNvramPxeFirstEntry create mode 100755 client/shared/functions/ogNvramSetNext create mode 100755 client/shared/functions/ogNvramSetOrder create mode 100755 client/shared/functions/ogNvramSetTimeout create mode 100755 client/shared/functions/ogRestoreEfiBootLoader diff --git a/client/lib/engine/bin/InventoryLib.py b/client/lib/engine/bin/InventoryLib.py index 0788032..ac58d9e 100755 --- a/client/lib/engine/bin/InventoryLib.py +++ b/client/lib/engine/bin/InventoryLib.py @@ -375,6 +375,7 @@ def ogGetOsVersion(disk, part): 'lsval DisplayVersion', ]) version = subprocess.run (['hivexsh'], input=i, capture_output=True, text=True).stdout + version = version.replace ('\n', ' ') # Recoge el valor del número de compilación para ver si es Windows 10/11 i = '\n'.join ([ f'load {file}', @@ -398,13 +399,15 @@ def ogGetOsVersion(disk, part): if not version: type = 'WinLoader' file = FileLib.ogGetPath (file=f'{mntdir}/boot/bcd') + if not file: + file = FileLib.ogGetPath (file=f'{mntdir}/EFI/Microsoft/boot/bcd') if file: for distrib in 'Windows Recovery', 'Windows Boot': with open (file, 'rb') as fd: contents = fd.read() distrib_utf16_regex = re.sub (r'(.)', '\\1.', distrib) distrib_utf16_regex = bytes (distrib_utf16_regex, 'ascii') - if re.search (distrib_utf16, contents): + if re.search (distrib_utf16_regex, contents): version = f'{distrib} loader' # Para macOS: detectar kernel y completar con fichero plist de información del sistema. if not version: @@ -467,5 +470,5 @@ def ogGetOsVersion(disk, part): # Mostrar resultado y salir sin errores. - if version: return f"{type}: {version} {is64bit}" + if version: return f"{type}:{version} {is64bit}" return None diff --git a/client/lib/engine/bin/UEFILib.py b/client/lib/engine/bin/UEFILib.py index ecab87a..4c54401 100644 --- a/client/lib/engine/bin/UEFILib.py +++ b/client/lib/engine/bin/UEFILib.py @@ -1,4 +1,6 @@ import os.path +import re +import subprocess import shutil import ogGlobals @@ -357,7 +359,7 @@ def ogNvramPxeFirstEntry(): return True # Si la entrada ya existe la borramos. - order = [numentry] + list (filter (lambda x: x if x!=numentry else [], order)) + order = [numentry] + list (filter (lambda x: x if x!=numentry else [], o)) ogNvramSetOrder (order) return True @@ -395,7 +397,7 @@ def ogRestoreEfiBootLoader (disk, par): osversion = InventoryLib.ogGetOsVersion (disk, par) if 'Windows 1' in osversion: bootlabel = f'Part-{int(disk):02d}-{int(par):02d}' - loader = FileLib.ogGetPath (f'{mntdir}/ogBoot/bootmgfw.efi') + loader = FileLib.ogGetPath (file=f'{mntdir}/ogBoot/bootmgfw.efi') if not loader: SystemLib.ogRaiseError ([], ogGlobals.OG_ERR_NOTOS, f'{disk} {par} ({osversion}, EFI)') return @@ -405,7 +407,7 @@ def ogRestoreEfiBootLoader (disk, par): os.makedirs (efi_bl, exist_ok=True) shutil.copytree (os.path.dirname (loader), f'{efi_bl}/Boot', symlinks=True) shutil.copy (loader, f'{efi_bl}/Boot/ogloader.efi') - if '' != FileLib.ogGetPath (f'{efidir}/EFI/Microsoft'): + if '' != FileLib.ogGetPath (file=f'{efidir}/EFI/Microsoft'): os.rename (f'{efidir}/EFI/Microsoft', f'{efidir}/EFI/Microsoft.backup.og') return @@ -478,9 +480,8 @@ def ogNvramSetNext (entry): #*/ ## #ogNvramSetOrder (['1', '3']) def ogNvramSetOrder (order): - mntdir = FileSystemLib.ogMount (disk, par) - if not mntdir: - SystemLib.ogRaiseError ([], ogGlobals.OG_ERR_PARTITION, f'{disk} {par}') + if not InventoryLib.ogIsEfiActive(): + SystemLib.ogRaiseError ([], ogGlobals.OG_ERR_NOTUEFI, '') return try: @@ -501,7 +502,7 @@ def ogNvramSetOrder (order): new_order = [] for o in order: - h = f'{int(o):04x}'.upper() + h = f'{int(o,16):05x}'.upper() if h not in numentries: SystemLib.ogRaiseError ([], ogGlobals.OG_ERR_NOTFOUND, f'NVRAM entry order "{h}"') return diff --git a/client/shared/functions/ogGetEsp b/client/shared/functions/ogGetEsp new file mode 100755 index 0000000..3431956 --- /dev/null +++ b/client/shared/functions/ogGetEsp @@ -0,0 +1,22 @@ +#!/usr/bin/python3 + +import sys +import argparse +from SystemLib import ogHelp +from DiskLib import ogGetEsp + +parser = argparse.ArgumentParser (add_help=False) + + +if 2 == len (sys.argv) and 'help' == sys.argv[1]: + #parser.print_help() sale en inglés aunque la locale indique otra cosa + ogHelp ('ogGetEsp') + sys.exit (0) + +args = parser.parse_args() + +ret = ogGetEsp () +if ret is not None: + if ret == True: sys.exit (0) + elif ret == False: sys.exit (1) + else: print (ret) diff --git a/client/shared/functions/ogGetPath b/client/shared/functions/ogGetPath index 457b448..d40cc5e 100755 --- a/client/shared/functions/ogGetPath +++ b/client/shared/functions/ogGetPath @@ -11,7 +11,9 @@ if 2 == len (sys.argv) and 'help' == sys.argv[1]: sys.exit (0) parser = argparse.ArgumentParser (add_help=False) -if 3 == len (sys.argv): +if 2 == len (sys.argv): + parser.add_argument ('file', nargs='?', default=None) +elif 3 == len (sys.argv): parser.add_argument ('src', nargs='?', default=None) parser.add_argument ('file', nargs='?', default=None) elif 4 == len (sys.argv): @@ -21,7 +23,9 @@ elif 4 == len (sys.argv): args = parser.parse_args() -if 3 == len (sys.argv): +if 2 == len (sys.argv): + ret = ogGetPath (file=args.file) +elif 3 == len (sys.argv): ret = ogGetPath (src=args.src, file=args.file) elif 4 == len (sys.argv): ret = ogGetPath (src=f'{args.disk} {args.par}', file=args.file) diff --git a/client/shared/functions/ogNvramActiveEntry b/client/shared/functions/ogNvramActiveEntry new file mode 100755 index 0000000..9eee20a --- /dev/null +++ b/client/shared/functions/ogNvramActiveEntry @@ -0,0 +1,22 @@ +#!/usr/bin/python3 + +import sys +import argparse +from SystemLib import ogHelp +from UEFILib import ogNvramActiveEntry + +parser = argparse.ArgumentParser (add_help=False) +parser.add_argument ('entry') + +if 2 == len (sys.argv) and 'help' == sys.argv[1]: + #parser.print_help() sale en inglés aunque la locale indique otra cosa + ogHelp ('ogNvramActiveEntry', 'ogNvramActiveEntry [ Num_order_entry | Label_entry ]', ['ogNvramActiveEntry 2', 'ogNvramActiveEntry "Windows Boot Manager"']) + sys.exit (0) + +args = parser.parse_args() + +ret = ogNvramActiveEntry (args.entry) +if ret is not None: + if ret == True: sys.exit (0) + elif ret == False: sys.exit (1) + else: print (ret) diff --git a/client/shared/functions/ogNvramAddEntry b/client/shared/functions/ogNvramAddEntry new file mode 100755 index 0000000..1cffa53 --- /dev/null +++ b/client/shared/functions/ogNvramAddEntry @@ -0,0 +1,24 @@ +#!/usr/bin/python3 + +import sys +import argparse +from SystemLib import ogHelp +from UEFILib import ogNvramAddEntry + +parser = argparse.ArgumentParser (add_help=False) +parser.add_argument ('bootlbl') +parser.add_argument ('bootldr') +parser.add_argument ('nvram_set', nargs='?', default=False) + +if 2 == len (sys.argv) and 'help' == sys.argv[1]: + #parser.print_help() sale en inglés aunque la locale indique otra cosa + ogHelp ('ogNvramAddEntry', 'ogNvramAddEntry Str_label_entry Str_boot_loader [ Bool_add_bootorder ]', ['ogNvramAddEntry 1 2 TRUE', 'ogNvramAddEntry grub /EFI/grub/grubx64.efi TRUE', 'ogNvramAddEntry Windows /EFI/Microsoft/Boot/bootmgfw.efi']) + sys.exit (0) + +args = parser.parse_args() + +ret = ogNvramAddEntry (args.bootlbl, args.bootldr, args.nvram_set) +if ret is not None: + if ret == True: sys.exit (0) + elif ret == False: sys.exit (1) + else: print (ret) diff --git a/client/shared/functions/ogNvramDeleteEntry b/client/shared/functions/ogNvramDeleteEntry new file mode 100755 index 0000000..d8f7912 --- /dev/null +++ b/client/shared/functions/ogNvramDeleteEntry @@ -0,0 +1,22 @@ +#!/usr/bin/python3 + +import sys +import argparse +from SystemLib import ogHelp +from UEFILib import ogNvramDeleteEntry + +parser = argparse.ArgumentParser (add_help=False) +parser.add_argument ('entry') + +if 2 == len (sys.argv) and 'help' == sys.argv[1]: + #parser.print_help() sale en inglés aunque la locale indique otra cosa + ogHelp ('ogNvramDeleteEntry', 'ogNvramDeleteEntry [ Num_order_entry | Label_entry ]', ['ogNvramDeleteEntry 2', 'ogNvramAddEntry "Windows Boot Manager"']) + sys.exit (0) + +args = parser.parse_args() + +ret = ogNvramDeleteEntry (args.entry) +if ret is not None: + if ret == True: sys.exit (0) + elif ret == False: sys.exit (1) + else: print (ret) diff --git a/client/shared/functions/ogNvramGetCurrent b/client/shared/functions/ogNvramGetCurrent new file mode 100755 index 0000000..c2a393d --- /dev/null +++ b/client/shared/functions/ogNvramGetCurrent @@ -0,0 +1,22 @@ +#!/usr/bin/python3 + +import sys +import argparse +from SystemLib import ogHelp +from UEFILib import ogNvramGetCurrent + +parser = argparse.ArgumentParser (add_help=False) + + +if 2 == len (sys.argv) and 'help' == sys.argv[1]: + #parser.print_help() sale en inglés aunque la locale indique otra cosa + ogHelp ('ogNvramGetCurrent') + sys.exit (0) + +args = parser.parse_args() + +ret = ogNvramGetCurrent () +if ret is not None: + if ret == True: sys.exit (0) + elif ret == False: sys.exit (1) + else: print (ret) diff --git a/client/shared/functions/ogNvramGetNext b/client/shared/functions/ogNvramGetNext new file mode 100755 index 0000000..4cacb1d --- /dev/null +++ b/client/shared/functions/ogNvramGetNext @@ -0,0 +1,22 @@ +#!/usr/bin/python3 + +import sys +import argparse +from SystemLib import ogHelp +from UEFILib import ogNvramGetNext + +parser = argparse.ArgumentParser (add_help=False) + + +if 2 == len (sys.argv) and 'help' == sys.argv[1]: + #parser.print_help() sale en inglés aunque la locale indique otra cosa + ogHelp ('ogNvramGetNext') + sys.exit (0) + +args = parser.parse_args() + +ret = ogNvramGetNext () +if ret is not None: + if ret == True: sys.exit (0) + elif ret == False: sys.exit (1) + else: print (ret) diff --git a/client/shared/functions/ogNvramGetOrder b/client/shared/functions/ogNvramGetOrder new file mode 100755 index 0000000..ef80387 --- /dev/null +++ b/client/shared/functions/ogNvramGetOrder @@ -0,0 +1,22 @@ +#!/usr/bin/python3 + +import sys +import argparse +from SystemLib import ogHelp +from UEFILib import ogNvramGetOrder + +parser = argparse.ArgumentParser (add_help=False) + + +if 2 == len (sys.argv) and 'help' == sys.argv[1]: + #parser.print_help() sale en inglés aunque la locale indique otra cosa + ogHelp ('ogNvramGetOrder') + sys.exit (0) + +args = parser.parse_args() + +ret = ogNvramGetOrder () +if ret is not None: + if ret == True: sys.exit (0) + elif ret == False: sys.exit (1) + else: print (','.join (ret)) diff --git a/client/shared/functions/ogNvramGetTimeout b/client/shared/functions/ogNvramGetTimeout new file mode 100755 index 0000000..15d1e8d --- /dev/null +++ b/client/shared/functions/ogNvramGetTimeout @@ -0,0 +1,22 @@ +#!/usr/bin/python3 + +import sys +import argparse +from SystemLib import ogHelp +from UEFILib import ogNvramGetTimeout + +parser = argparse.ArgumentParser (add_help=False) + + +if 2 == len (sys.argv) and 'help' == sys.argv[1]: + #parser.print_help() sale en inglés aunque la locale indique otra cosa + ogHelp ('ogNvramGetTimeout') + sys.exit (0) + +args = parser.parse_args() + +ret = ogNvramGetTimeout () +if ret is not None: + if ret == True: sys.exit (0) + elif ret == False: sys.exit (1) + else: print (ret) diff --git a/client/shared/functions/ogNvramInactiveEntry b/client/shared/functions/ogNvramInactiveEntry new file mode 100755 index 0000000..780213c --- /dev/null +++ b/client/shared/functions/ogNvramInactiveEntry @@ -0,0 +1,22 @@ +#!/usr/bin/python3 + +import sys +import argparse +from SystemLib import ogHelp +from UEFILib import ogNvramInactiveEntry + +parser = argparse.ArgumentParser (add_help=False) +parser.add_argument ('entry') + +if 2 == len (sys.argv) and 'help' == sys.argv[1]: + #parser.print_help() sale en inglés aunque la locale indique otra cosa + ogHelp ('ogNvramInactiveEntry', 'ogNvramInactiveEntry [ Num_order_entry | Label_entry ]', ['ogNvramInactiveEntry 2', 'ogNvramInactiveEntry "Windows Boot Manager"']) + sys.exit (0) + +args = parser.parse_args() + +ret = ogNvramInactiveEntry (args.entry) +if ret is not None: + if ret == True: sys.exit (0) + elif ret == False: sys.exit (1) + else: print (ret) diff --git a/client/shared/functions/ogNvramList b/client/shared/functions/ogNvramList new file mode 100755 index 0000000..d44c974 --- /dev/null +++ b/client/shared/functions/ogNvramList @@ -0,0 +1,22 @@ +#!/usr/bin/python3 + +import sys +import argparse +from SystemLib import ogHelp +from UEFILib import ogNvramList + +parser = argparse.ArgumentParser (add_help=False) + + +if 2 == len (sys.argv) and 'help' == sys.argv[1]: + #parser.print_help() sale en inglés aunque la locale indique otra cosa + ogHelp ('ogNvramList') + sys.exit (0) + +args = parser.parse_args() + +ret = ogNvramList () +if ret is not None: + if ret == True: sys.exit (0) + elif ret == False: sys.exit (1) + else: print (ret) diff --git a/client/shared/functions/ogNvramPxeFirstEntry b/client/shared/functions/ogNvramPxeFirstEntry new file mode 100755 index 0000000..208328e --- /dev/null +++ b/client/shared/functions/ogNvramPxeFirstEntry @@ -0,0 +1,22 @@ +#!/usr/bin/python3 + +import sys +import argparse +from SystemLib import ogHelp +from UEFILib import ogNvramPxeFirstEntry + +parser = argparse.ArgumentParser (add_help=False) + + +if 2 == len (sys.argv) and 'help' == sys.argv[1]: + #parser.print_help() sale en inglés aunque la locale indique otra cosa + ogHelp ('ogNvramPxeFirstEntry') + sys.exit (0) + +args = parser.parse_args() + +ret = ogNvramPxeFirstEntry () +if ret is not None: + if ret == True: sys.exit (0) + elif ret == False: sys.exit (1) + else: print (ret) diff --git a/client/shared/functions/ogNvramSetNext b/client/shared/functions/ogNvramSetNext new file mode 100755 index 0000000..7c8ee3d --- /dev/null +++ b/client/shared/functions/ogNvramSetNext @@ -0,0 +1,22 @@ +#!/usr/bin/python3 + +import sys +import argparse +from SystemLib import ogHelp +from UEFILib import ogNvramSetNext + +parser = argparse.ArgumentParser (add_help=False) +parser.add_argument ('entry') + +if 2 == len (sys.argv) and 'help' == sys.argv[1]: + #parser.print_help() sale en inglés aunque la locale indique otra cosa + ogHelp ('ogNvramSetNext', 'ogNvramSetNext [ Num_order_entry | Label_entry ]', ['ogNvramSetNext 2', 'ogNvramSetNext "Windows Boot Manager"']) + sys.exit (0) + +args = parser.parse_args() + +ret = ogNvramSetNext (args.entry) +if ret is not None: + if ret == True: sys.exit (0) + elif ret == False: sys.exit (1) + else: print (ret) diff --git a/client/shared/functions/ogNvramSetOrder b/client/shared/functions/ogNvramSetOrder new file mode 100755 index 0000000..13c22b4 --- /dev/null +++ b/client/shared/functions/ogNvramSetOrder @@ -0,0 +1,16 @@ +#!/usr/bin/python3 + +import sys +from SystemLib import ogHelp +from UEFILib import ogNvramSetOrder + +if 2 == len (sys.argv) and 'help' == sys.argv[1]: + #parser.print_help() sale en inglés aunque la locale indique otra cosa + ogHelp ('ogNvramSetOrder', 'ogNvramSetOrder Num_order1 [ Num_order2 ] ...', ['ogNvramSetOrder 1 3']) + sys.exit (0) + +ret = ogNvramSetOrder (sys.argv[1:]) +if ret is not None: + if ret == True: sys.exit (0) + elif ret == False: sys.exit (1) + else: print (ret) diff --git a/client/shared/functions/ogNvramSetTimeout b/client/shared/functions/ogNvramSetTimeout new file mode 100755 index 0000000..d54f89a --- /dev/null +++ b/client/shared/functions/ogNvramSetTimeout @@ -0,0 +1,22 @@ +#!/usr/bin/python3 + +import sys +import argparse +from SystemLib import ogHelp +from UEFILib import ogNvramSetTimeout + +parser = argparse.ArgumentParser (add_help=False) +parser.add_argument ('t') + +if 2 == len (sys.argv) and 'help' == sys.argv[1]: + #parser.print_help() sale en inglés aunque la locale indique otra cosa + ogHelp ('ogNvramSetTimeout', 'ogNvramSetTimeout int_Timeout (seg)', ['ogNvramSetTimeout 2']) + sys.exit (0) + +args = parser.parse_args() + +ret = ogNvramSetTimeout (args.t) +if ret is not None: + if ret == True: sys.exit (0) + elif ret == False: sys.exit (1) + else: print (ret) diff --git a/client/shared/functions/ogRestoreEfiBootLoader b/client/shared/functions/ogRestoreEfiBootLoader new file mode 100755 index 0000000..7e72e37 --- /dev/null +++ b/client/shared/functions/ogRestoreEfiBootLoader @@ -0,0 +1,23 @@ +#!/usr/bin/python3 + +import sys +import argparse +from SystemLib import ogHelp +from UEFILib import ogRestoreEfiBootLoader + +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 ('ogRestoreEfiBootLoader', 'ogRestoreEfiBootLoader int_ndisk int_part', ['ogRestoreEfiBootLoader 1 2']) + sys.exit (0) + +args = parser.parse_args() + +ret = ogRestoreEfiBootLoader (args.disk, args.par) +if ret is not None: + if ret == True: sys.exit (0) + elif ret == False: sys.exit (1) + else: print (ret)