You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
48 lines
1.3 KiB
48 lines
1.3 KiB
10 months ago
|
import os
|
||
|
from re import compile as regexp
|
||
|
|
||
|
from leapp.libraries.stdlib import run
|
||
|
|
||
|
_current_boot_matcher = regexp(r'BootCurrent: (?P<boot_current>([0-9A-F]*))')
|
||
|
_next_boot_matcher = regexp(r'BootNext: (?P<boot_next>([0-9A-F]*))')
|
||
|
|
||
|
|
||
|
def get_current_boot_match(string):
|
||
|
match = _current_boot_matcher.match(string)
|
||
|
if not match:
|
||
|
return None
|
||
|
captured_groups = match.groupdict()
|
||
|
return captured_groups['boot_current']
|
||
|
|
||
|
|
||
|
def get_next_boot_match(string):
|
||
|
match = _next_boot_matcher.match(string)
|
||
|
if not match:
|
||
|
return None
|
||
|
captured_groups = match.groupdict()
|
||
|
return captured_groups['boot_next']
|
||
|
|
||
|
|
||
|
def maybe_emit_updated_boot_entry():
|
||
|
if not os.path.exists('/sbin/efibootmgr'):
|
||
|
return
|
||
|
|
||
|
efi_info = run(['/sbin/efibootmgr'], checked=False, split=True)
|
||
|
if efi_info['exit_code'] != 0:
|
||
|
# Not an efi system
|
||
|
return
|
||
|
|
||
|
current_boot, next_boot = None, None
|
||
|
for line in efi_info['stdout']:
|
||
|
current_match = get_current_boot_match(line)
|
||
|
if current_match:
|
||
|
current_boot = current_match
|
||
|
|
||
|
next_match = get_next_boot_match(line)
|
||
|
if next_match:
|
||
|
next_boot = next_match
|
||
|
|
||
|
if current_boot and not next_boot:
|
||
|
# We set BootNext to CurrentBoot only if BootNext wasn't previously set
|
||
|
run(['/sbin/efibootmgr', '-n', current_boot])
|