refs #1337 add UEFI commands and a couple of fixes elsewhere

pull/1/head
Natalia Serrano 2025-01-24 15:41:23 +01:00
parent a346ba386e
commit d54925252f
18 changed files with 346 additions and 11 deletions

View File

@ -375,6 +375,7 @@ def ogGetOsVersion(disk, part):
'lsval DisplayVersion', 'lsval DisplayVersion',
]) ])
version = subprocess.run (['hivexsh'], input=i, capture_output=True, text=True).stdout 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 # Recoge el valor del número de compilación para ver si es Windows 10/11
i = '\n'.join ([ i = '\n'.join ([
f'load {file}', f'load {file}',
@ -398,13 +399,15 @@ def ogGetOsVersion(disk, part):
if not version: if not version:
type = 'WinLoader' type = 'WinLoader'
file = FileLib.ogGetPath (file=f'{mntdir}/boot/bcd') file = FileLib.ogGetPath (file=f'{mntdir}/boot/bcd')
if not file:
file = FileLib.ogGetPath (file=f'{mntdir}/EFI/Microsoft/boot/bcd')
if file: if file:
for distrib in 'Windows Recovery', 'Windows Boot': for distrib in 'Windows Recovery', 'Windows Boot':
with open (file, 'rb') as fd: with open (file, 'rb') as fd:
contents = fd.read() contents = fd.read()
distrib_utf16_regex = re.sub (r'(.)', '\\1.', distrib) distrib_utf16_regex = re.sub (r'(.)', '\\1.', distrib)
distrib_utf16_regex = bytes (distrib_utf16_regex, 'ascii') 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' version = f'{distrib} loader'
# Para macOS: detectar kernel y completar con fichero plist de información del sistema. # Para macOS: detectar kernel y completar con fichero plist de información del sistema.
if not version: if not version:

View File

@ -1,4 +1,6 @@
import os.path import os.path
import re
import subprocess
import shutil import shutil
import ogGlobals import ogGlobals
@ -357,7 +359,7 @@ def ogNvramPxeFirstEntry():
return True return True
# Si la entrada ya existe la borramos. # 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) ogNvramSetOrder (order)
return True return True
@ -395,7 +397,7 @@ def ogRestoreEfiBootLoader (disk, par):
osversion = InventoryLib.ogGetOsVersion (disk, par) osversion = InventoryLib.ogGetOsVersion (disk, par)
if 'Windows 1' in osversion: if 'Windows 1' in osversion:
bootlabel = f'Part-{int(disk):02d}-{int(par):02d}' 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: if not loader:
SystemLib.ogRaiseError ([], ogGlobals.OG_ERR_NOTOS, f'{disk} {par} ({osversion}, EFI)') SystemLib.ogRaiseError ([], ogGlobals.OG_ERR_NOTOS, f'{disk} {par} ({osversion}, EFI)')
return return
@ -405,7 +407,7 @@ def ogRestoreEfiBootLoader (disk, par):
os.makedirs (efi_bl, exist_ok=True) os.makedirs (efi_bl, exist_ok=True)
shutil.copytree (os.path.dirname (loader), f'{efi_bl}/Boot', symlinks=True) shutil.copytree (os.path.dirname (loader), f'{efi_bl}/Boot', symlinks=True)
shutil.copy (loader, f'{efi_bl}/Boot/ogloader.efi') 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') os.rename (f'{efidir}/EFI/Microsoft', f'{efidir}/EFI/Microsoft.backup.og')
return return
@ -478,9 +480,8 @@ def ogNvramSetNext (entry):
#*/ ## #*/ ##
#ogNvramSetOrder (['1', '3']) #ogNvramSetOrder (['1', '3'])
def ogNvramSetOrder (order): def ogNvramSetOrder (order):
mntdir = FileSystemLib.ogMount (disk, par) if not InventoryLib.ogIsEfiActive():
if not mntdir: SystemLib.ogRaiseError ([], ogGlobals.OG_ERR_NOTUEFI, '')
SystemLib.ogRaiseError ([], ogGlobals.OG_ERR_PARTITION, f'{disk} {par}')
return return
try: try:
@ -501,7 +502,7 @@ def ogNvramSetOrder (order):
new_order = [] new_order = []
for o in order: for o in order:
h = f'{int(o):04x}'.upper() h = f'{int(o,16):05x}'.upper()
if h not in numentries: if h not in numentries:
SystemLib.ogRaiseError ([], ogGlobals.OG_ERR_NOTFOUND, f'NVRAM entry order "{h}"') SystemLib.ogRaiseError ([], ogGlobals.OG_ERR_NOTFOUND, f'NVRAM entry order "{h}"')
return return

View File

@ -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)

View File

@ -11,7 +11,9 @@ if 2 == len (sys.argv) and 'help' == sys.argv[1]:
sys.exit (0) sys.exit (0)
parser = argparse.ArgumentParser (add_help=False) 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 ('src', nargs='?', default=None)
parser.add_argument ('file', nargs='?', default=None) parser.add_argument ('file', nargs='?', default=None)
elif 4 == len (sys.argv): elif 4 == len (sys.argv):
@ -21,7 +23,9 @@ elif 4 == len (sys.argv):
args = parser.parse_args() 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) ret = ogGetPath (src=args.src, file=args.file)
elif 4 == len (sys.argv): elif 4 == len (sys.argv):
ret = ogGetPath (src=f'{args.disk} {args.par}', file=args.file) ret = ogGetPath (src=f'{args.disk} {args.par}', file=args.file)

View File

@ -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)

View File

@ -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)

View File

@ -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)

View File

@ -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)

View File

@ -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)

View File

@ -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))

View File

@ -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)

View File

@ -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)

View File

@ -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)

View File

@ -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)

View File

@ -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)

View File

@ -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)

View File

@ -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)

View File

@ -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)