From: Michael Prokop Date: Wed, 25 Sep 2013 12:54:06 +0000 (+0200) Subject: Use pyparted to check for bootflag [Closes: issue1248] X-Git-Url: https://git.grml.org/?p=grml2usb.git;a=commitdiff_plain;h=360632e096cbcd38d025d610cd64ce3fbb45c131 Use pyparted to check for bootflag [Closes: issue1248] The approach to check the 7th field in the MBR for the bootable flag being set isn't enough. This fails to detect bootable partitions if they aren't the first primary ones. pyparted provides a way to check whether the specified partition really has the boot flag set, so let's use this approach, iff pyparted is available. Took the get_partition_for_path function from Evgeni Golov's https://github.com/evgeni/grml2usb/tree/pyparted with his permission. --- diff --git a/debian/control b/debian/control index 958c0a8..165abdc 100644 --- a/debian/control +++ b/debian/control @@ -11,7 +11,7 @@ Vcs-Browser: http://git.grml.org/?p=grml2usb.git Package: grml2usb Architecture: i386 amd64 -Depends: ${shlibs:Depends}, ${misc:Depends}, syslinux | grub-pc, python, rsync, mtools, realpath +Depends: ${shlibs:Depends}, ${misc:Depends}, syslinux | grub-pc, python, python-parted, rsync, mtools, realpath Recommends: syslinux, isolinux, xorriso | genisoimage Description: install Grml system / ISO to usb device This script installs a Grml ISO to an USB device to be able diff --git a/grml2usb b/grml2usb index 4e958b5..2f58d01 100755 --- a/grml2usb +++ b/grml2usb @@ -317,9 +317,29 @@ def check_uid_root(): raise CriticalException("please run this script with uid 0 (root).") +# for usage inside check_boot_flag +def get_partition_for_path(path): + import parted + + boot_dev, x = get_device_from_partition(path) + + d = parted.getDevice(boot_dev) + disk = parted.Disk(d) + return disk.getPartitionByPath(path) + + def check_boot_flag(device): boot_dev, x = get_device_from_partition(device) + try: + import parted + part = get_partition_for_path(device) + if part.getFlag(parted.PARTITION_BOOT): + logging.debug("bootflag is enabled on %s" % device) + return + except ImportError, e: + pass + with open(boot_dev, 'r') as image: data = image.read(520) bootcode = data[440:] @@ -332,7 +352,7 @@ def check_boot_flag(device): else: logging.debug("bootflag is NOT enabled") raise VerifyException("Device %s does not have the bootflag set. " - "Please enable it to be able to boot." % boot_dev) + "Please enable it to be able to boot." % device) def mkfs_fat16(device):