import struct
# global variables
-PROG_VERSION = "0.9.25"
+PROG_VERSION = "0.9.28~git"
MOUNTED = set() # register mountpoints
TMPFILES = set() # register tmpfiles
DATESTAMP = time.mktime(datetime.datetime.now().timetuple()) # unique identifier for syslinux.cfg
"""A helper function for printing a warning about deprecated option
"""
# pylint: disable-msg=W0613
- sys.stderr.write("Note: the --syslinux option is deprecated as syslinux " +
+ sys.stderr.write("Note: the --syslinux option is deprecated as syslinux "
"is grml2usb's default. Continuing anyway.\n")
setattr(opt_parser.values, option.dest, True)
grub_device = device
logging.info("Installing grub as bootloader")
- logging.debug("grub-install --recheck --no-floppy --root-directory=%s %s",
+ logging.debug("grub-install --recheck --force --no-floppy --root-directory=%s %s",
device_mountpoint, grub_device)
proc = subprocess.Popen(["grub-install", "--recheck", "--force", "--no-floppy",
"--root-directory=%s" % device_mountpoint, grub_device],
# by default we use grub, so install syslinux only on request
if options.grub:
- if not which("grub-install"):
- logging.critical("Fatal: grub-install not available (please install the "
- + "grub package or use the --syslinux option)")
+ try:
+ install_grub(device)
+ except CriticalException, error:
+ logging.critical("Fatal: %s", error)
cleanup()
sys.exit(1)
- else:
- try:
- install_grub(device)
- except CriticalException, error:
- logging.critical("Fatal: %s", error)
- cleanup()
- sys.exit(1)
else:
try:
install_syslinux(device)
for x in file('/proc/mounts').readlines():
if x.startswith(source):
- raise CriticalException("Error executing mount: %s already mounted - "
- + "please unmount before invoking grml2usb" % source)
+ raise CriticalException("Error executing mount: %s already mounted - " % source
+ + "please unmount before invoking grml2usb")
if os.path.isdir(source):
logging.debug("Source %s is not a device, therefore not mounting.", source)
@partition: device name of partition"""
+ if not os.access(partition, os.R_OK):
+ raise CriticalException("Failed to read device %s"
+ " (wrong UID/permissions or device/directory not present?)" % partition)
+
try:
udev_info = subprocess.Popen(["/sbin/blkid", "-s", "TYPE", "-o", "value", partition],
stdout=subprocess.PIPE, stderr=subprocess.PIPE)
filesystem = udev_info.communicate()[0].rstrip()
- if udev_info.returncode == 2:
- raise CriticalException("Failed to read device %s"
- " (wrong UID/permissions or device/directory not present?)" % partition)
-
if filesystem != "vfat":
- raise CriticalException("Partition %s does not contain a FAT16 filesystem. "
- + "(Use --fat16 or run mkfs.vfat %s)" % (partition, partition))
+ raise CriticalException(
+ "Partition %s does not contain a FAT16 filesystem. "
+ "(Use --fat16 or run mkfs.vfat %s)" % (partition, partition))
except OSError:
raise CriticalException("Sorry, /sbin/blkid not available (install e2fsprogs?)")
if filename and (os.path.isfile(filename) or os.path.isdir(filename)):
exec_rsync(filename, dst)
-def copy_bootloader_files(iso_mount, target):
+def copy_bootloader_files(iso_mount, target, grml_flavour):
"""Copy grml's bootloader files to a given target
@iso_mount: path where a grml ISO is mounted on
- @target: path where grml's main files should be copied to"""
+ @target: path where grml's main files should be copied to
+ @grml_flavour: name of the current processed grml_flavour
+ """
syslinux_target = target + '/boot/syslinux/'
execute(mkdir, syslinux_target)
if os.path.isfile(syslinux_target + 'ldlinux.sys'):
os.unlink(syslinux_target + 'ldlinux.sys')
- (source_dir, name) = get_defaults_file(iso_mount, GRML_DEFAULT, "default.cfg")
- (source_dir, defaults_file) = get_defaults_file(iso_mount, GRML_DEFAULT, "grml.cfg")
+ (source_dir, name) = get_defaults_file(iso_mount, grml_flavour, "default.cfg")
+ (source_dir, defaults_file) = get_defaults_file(iso_mount, grml_flavour, "grml.cfg")
if not source_dir:
logging.critical("Fatal: file default.cfg could not be found.")
@target: path where grml's main files should be copied to"""
global GRML_DEFAULT
- GRML_DEFAULT = grml_flavour
+ GRML_DEFAULT = GRML_DEFAULT or grml_flavour
if options.dryrun:
return 0
elif not options.bootloaderonly:
copy_addons(iso_mount, target)
if not options.copyonly:
- copy_bootloader_files(iso_mount, target)
+ copy_bootloader_files(iso_mount, target, grml_flavour)
if not options.dryrun:
handle_bootloader_config(grml_flavour, device, target)
modify_grub_config(grub2_cfg)
+def get_bootoptions(grml_flavour):
+ """Returns bootoptions for specific flavour
+
+ @grml_flavour: name of the grml_flavour
+ """
+ # do NOT write "None" in kernel cmdline
+ if options.bootoptions is None:
+ bootopt = ""
+ else:
+ bootopt = options.bootoptions
+ bootopt = bootopt.replace("%flavour", grml_flavour)
+ return bootopt
+
+
def handle_grub_config(grml_flavour, device, target):
"""Main handler for generating grub (v1 and v2) configuration
else:
raise CriticalException("error validating partition schema (raw device?)")
- # do NOT write "None" in kernel cmdline
- if options.bootoptions is None:
- bootopt = ""
- else:
- bootopt = options.bootoptions
+
+ bootopt = get_bootoptions(grml_flavour)
# write menu.lst
handle_grub1_config(grml_flavour, install_grub1_partition, grub_target, bootopt)
bootid_re = re.compile("bootid=[\w_-]+")
live_media_path_re = re.compile("live-media-path=[\w_/-]+")
- # do NOT write "None" in kernel cmdline
- if options.bootoptions is None:
- bootopt = ""
- else:
- bootopt = options.bootoptions
+ bootopt = get_bootoptions(flavour)
regexe = []
option_re = None
except CriticalException, error:
logging.critical("Fatal: %s", error)
raise
+ global GRML_FLAVOURS
try:
grml_flavours = identify_grml_flavour(mountpoint)
for flavour in set(grml_flavours):
logging.info("Identified grml flavour \"%s\".", flavour)
install_iso_files(flavour, mountpoint, device, device_mountpoint)
+ GRML_FLAVOURS.add(flavour)
finally:
if remove_device_mountpoint:
remove_mountpoint(device_mountpoint)
if options.dryrun:
logging.info("Running in simulation mode as requested via option dry-run.")
-
# specified arguments
device = args[len(args) - 1]
isos = args[0:len(args) - 1]
logging.critical("Fatal: installation on raw device not supported. (BIOS won't support it.)")
sys.exit(1)
+ if options.grub:
+ if not which("grub-install"):
+ logging.critical("Fatal: grub-install not available (please install the "
+ + "grub package or drop the --grub option)")
+ sys.exit(1)
+
+ if options.syslinux:
+ if not which("syslinux"):
+ logging.critical("Fatal: syslinux not available (please install the "
+ + "syslinux package or use the --grub option)")
+ sys.exit(1)
+
if not which("rsync"):
logging.critical("Fatal: rsync not available, can not continue - sorry.")
sys.exit(1)