Refactor part of image module

Shuffle some functions around and reduce size of _is_bootloader_loaded
moving logic out to a new function.

Change-Id: I9c10bf05186dcebb37f175d61bf4ac9ff86b6510
(cherry picked from commit 9d9a6bce5c)
(cherry picked from commit d0f69e9948)
This commit is contained in:
Riccardo Pittau 2020-07-03 17:04:27 +02:00 committed by Steve Baker
parent 045bcfef32
commit 83932952c1
1 changed files with 32 additions and 27 deletions

View File

@ -144,6 +144,37 @@ def _has_dracut(root):
return True return True
def _has_boot_sector(device):
"""Checks the device for a boot sector indicator."""
stdout, stderr = utils.execute('file', '-s', device)
if 'boot sector' not in stdout:
return False
else:
# Now lets check the signature
ddout, dderr = utils.execute(
'dd', 'if=%s' % device, 'bs=218', 'count=1', binary=True)
stdout, stderr = utils.execute('file', '-', process_input=ddout)
# The bytes recovered by dd show as a "dos executable" when
# examined with file. In other words, the bootloader is present.
if 'executable' in stdout:
return True
return False
def _find_bootable_device(partitions, dev):
"""Checks the base device and partition for bootloader contents."""
LOG.debug('Looking for a bootable device in %s', dev)
for line in partitions.splitlines():
partition = line.split(':')
try:
if 'boot' in partition[6]:
if _has_boot_sector(dev) or _has_boot_sector(partition[0]):
return True
except IndexError:
continue
return False
def _is_bootloader_loaded(dev): def _is_bootloader_loaded(dev):
"""Checks the device to see if a MBR bootloader is present. """Checks the device to see if a MBR bootloader is present.
@ -153,20 +184,6 @@ def _is_bootloader_loaded(dev):
loader, otherwise False. loader, otherwise False.
""" """
def _has_boot_sector(device):
"""Check the device for a boot sector indiator."""
stdout, stderr = utils.execute('file', '-s', device)
if 'boot sector' in stdout:
# Now lets check the signature
ddout, dderr = utils.execute(
'dd', 'if=%s' % device, 'bs=218', 'count=1', binary=True)
stdout, stderr = utils.execute('file', '-', process_input=ddout)
# The bytes recovered by dd show as a "dos executable" when
# examined with file. In other words, the bootloader is present.
if 'executable' in stdout:
return True
return False
boot = hardware.dispatch_to_managers('get_boot_info') boot = hardware.dispatch_to_managers('get_boot_info')
if boot.current_boot_mode != 'bios': if boot.current_boot_mode != 'bios':
@ -182,19 +199,7 @@ def _is_bootloader_loaded(dev):
except processutils.ProcessExecutionError: except processutils.ProcessExecutionError:
return False return False
lines = stdout.splitlines() return _find_bootable_device(stdout, dev)
for line in lines:
partition = line.split(':')
try:
# Find the bootable device, and check the base
# device and partition for bootloader contents.
if 'boot' in partition[6]:
if (_has_boot_sector(dev)
or _has_boot_sector(partition[0])):
return True
except IndexError:
continue
return False
def _get_efi_bootloaders(location): def _get_efi_bootloaders(location):