GRML_DEFAULT = None
UUID = None
SYSLINUX_LIBS = "/usr/lib/syslinux/"
+GPT_HEADER = "\x55\xaa\x45\x46\x49\x20\x50\x41\x52\x54" # original GPT header
RE_PARTITION = re.compile(r'([a-z/]*?)(\d+)$')
RE_P_PARTITION = re.compile(r'(.*?\d+)p(\d+)$')
RE_LOOP_DEVICE = re.compile(r'/dev/loop\d+$')
+
def syslinux_warning(option, opt, value, opt_parser):
"""A helper function for printing a warning about deprecated option
"""
@Exception: message"""
pass
+
class VerifyException(Exception):
"""Throw critical exception if there is an fatal error when verifying something.
@cwd: current working directory
"""
- return os.path.exists(os.path.join(cwd, filename))
+ return os.path.exists(os.path.join(cwd, filename))
for path in paths:
current_dir = path
def check_uid_root():
"""Check for root permissions"""
if not os.geteuid() == 0:
- sys.exit("Error: please run this script with uid 0 (root).")
+ raise CriticalException("please run this script with uid 0 (root).")
def check_boot_flag(device):
boot_dev, x = get_device_from_partition(device)
with open(boot_dev, 'r') as image:
- data = image.read(512)
+ data = image.read(520)
bootcode = data[440:]
- if bootcode[6] == '\x80':
+ gpt_data = bootcode[70:80]
+
+ if gpt_data == GPT_HEADER:
+ logging.info("GPT detected, skipping bootflag check")
+ elif bootcode[6] == '\x80':
logging.debug("bootflag is enabled")
else:
logging.debug("bootflag is NOT enabled")
if not os.path.isfile(mbrtemplate):
logging.error('Error installing MBR (either try --syslinux-mbr or '
'install missing file "%s"?)', mbrtemplate)
- raise CriticalException("Error: %s can not be read.", mbrtemplate)
+ raise CriticalException("%s can not be read." % mbrtemplate)
if partition is not None and ((partition < 0) or (partition > 3)):
logging.warn("Cannot activate partition %d", partition)
squashfs = search_file(grml_flavour + '.squashfs', iso_mount)
if squashfs is None:
logging.error("error locating squashfs file")
- raise CriticalException("Fatal: squashfs file not found"
- ", please check that your iso is not corrupt")
+ raise CriticalException("squashfs file not found, please check that your iso is not corrupt")
else:
squashfs_target = target + '/live/' + grml_flavour + '/'
execute(mkdir, squashfs_target)
logging.debug("Found source file" + sourcefile)
os.path.isfile(ops) and f.write("source " + sourcefile + "\n")
- f.write("source /boot/grub/adddons.cfg\n")
+ f.write("source /boot/grub/addons.cfg\n")
f.write("source /boot/grub/footer.cfg\n")
f.close()
if not source_dir:
raise CriticalException(
- "Fatal: file default.cfg could not be found." \
- "Note: this grml2usb version requires an ISO generated by grml-live >=0.9.24 ..." \
+ "file default.cfg could not be found.\n"
+ "Note: this grml2usb version requires an ISO generated by grml-live >=0.9.24 ...\n"
" ... either use grml releases >=2009.10 or switch to an older grml2usb version.")
if not os.path.exists(iso_mount + '/boot/grub/footer.cfg'):
# install main configuration only *once*, no matter how many ISOs we have:
syslinux_config_file = open(syslinux_cfg, 'w')
- syslinux_config_file.write("TIMEOUT 300\n")
+ syslinux_config_file.write("timeout 300\n")
syslinux_config_file.write("include vesamenu.cfg\n")
syslinux_config_file.close()
iso_mountpoint = image
remove_image_mountpoint = False
if os.path.isdir(image):
- logging.info("Using %s as install base", image)
+ if options.force or os.path.exists(os.path.join(image, 'live')):
+ logging.info("Using %s as install base", image)
+ else:
+ q = raw_input("%s does not look like a grml system. "
+ "Do you really want to use this image? y/N " % image)
+ if q.lower() == 'y':
+ logging.info("Using %s as install base", image)
+ else:
+ logging.info("Skipping install base %s", image)
else:
logging.info("Using ISO %s", image)
iso_mountpoint = tempfile.mkdtemp(prefix="grml2usb", dir=os.path.abspath(options.tmpdir))
try:
remove_mountpoint(iso_mountpoint)
except CriticalException, error:
- logging.critical("Fatal: %s", error)
cleanup()
+ raise
def install_grml(mountpoint, device):
check_boot_flag(device)
mount(device, device_mountpoint, ['-o', 'utf8,iocharset=iso8859-1'])
except VerifyException, error:
- logging.critical("Fatal: %s", error)
raise
except CriticalException, error:
mount(device, device_mountpoint, "")
os.rmdir(mountpoint)
unregister_tmpfile(mountpoint)
except CriticalException, error:
- logging.critical("Fatal: %s", error)
cleanup()
+ raise
def handle_mbr(device):
mbrcode = GRML2USB_BASE + '/mbr/mbrldr'
if options.syslinuxmbr:
- mbrcode = '/usr/lib/syslinux/mbr.bin'
+ mbrcode = ""
+ mbr_locations = ('/usr/lib/syslinux/mbr.bin',
+ '/usr/share/syslinux/mbr.bin')
+ for mbrpath in mbr_locations:
+ if os.path.isfile(mbrpath):
+ mbrcode = mbrpath
+ break
+
+ if mbrcode is "":
+ str_locations = " or ".join(['"%s"' % l for l in mbr_locations])
+ logging.error('Cannot find syslinux MBR, install it at %s)',
+ str_locations)
+ raise CriticalException("syslinux MBR can not be found at %s."
+ % str_locations)
elif options.mbrmenu:
mbrcode = GRML2USB_BASE + '/mbr/mbrldr'
if options.verbose and options.quiet:
parser.error("please use either verbose (--verbose) or quiet (--quiet) option")
+ FORMAT = "%(message)s"
if options.verbose:
- FORMAT = "Debug: %(asctime)-15s %(message)s"
+ FORMAT = "%(asctime)-15s %(message)s"
logging.basicConfig(level=logging.DEBUG, format=FORMAT)
elif options.quiet:
- FORMAT = "Critical: %(message)s"
logging.basicConfig(level=logging.CRITICAL, format=FORMAT)
else:
- FORMAT = "%(message)s"
logging.basicConfig(level=logging.INFO, format=FORMAT)
@opts option dict from OptionParser
"""
if opts.grubmbr and not opts.grub:
- logging.critical("Error: --grub-mbr requires --grub option.")
- sys.exit(1)
+ raise CriticalException("--grub-mbr requires --grub option.")
def check_programs():