X-Git-Url: http://git.grml.org/?p=grml2usb.git;a=blobdiff_plain;f=grml2usb;h=8de8b255cb1b754dbe5f9097afa4e0d5d6155734;hp=414b9c5af49f4484f6f22c7a68861a2273a7957a;hb=601cc842b9755408681e0bf866c9e2d79340b600;hpb=779a8334c32bb2389e2cffb32a3fefeb9b3f415c diff --git a/grml2usb b/grml2usb index 414b9c5..8de8b25 100755 --- a/grml2usb +++ b/grml2usb @@ -22,19 +22,20 @@ import uuid import struct # global variables -PROG_VERSION = "0.9.26" +PROG_VERSION = "0.9.28" MOUNTED = set() # register mountpoints TMPFILES = set() # register tmpfiles DATESTAMP = time.mktime(datetime.datetime.now().timetuple()) # unique identifier for syslinux.cfg GRML_FLAVOURS = set() # which flavours are being installed? GRML_DEFAULT = None UUID = None +SYSLINUX_LIBS = "/usr/lib/syslinux/" def syslinux_warning(option, opt, value, opt_parser): """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) @@ -649,12 +650,16 @@ def install_grub(device): grub_device = device logging.info("Installing grub as bootloader") - logging.debug("grub-install --recheck --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], - stdout=file(os.devnull, "r+")) - proc.wait() + for opt in ["", "--force" ]: + logging.debug("grub-install --recheck %s --no-floppy --root-directory=%s %s", + opt, device_mountpoint, grub_device) + proc = subprocess.Popen(["grub-install", "--recheck", opt, "--no-floppy", + "--root-directory=%s" % device_mountpoint, grub_device], + stdout=file(os.devnull, "r+")) + proc.wait() + if proc.returncode == 0: + break + if proc.returncode != 0: # raise Exception("error executing grub-install") logging.critical("Fatal: error executing grub-install " @@ -699,18 +704,12 @@ def install_bootloader(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) @@ -980,19 +979,19 @@ def check_for_fat(partition): @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." % (partition) \ - + "(Use --fat16 or run mkfs.vfat %s)" % (partition)) + "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?)") @@ -1122,26 +1121,29 @@ def update_grml_versions(iso_mount, target): @target: path of the target mount point """ grml_target = target + '/grml/' - new_grml_version = search_file('grml-version', grml_target) - if new_grml_version: - orig_grml_version = search_file('grml-version', iso_mount) - if not orig_grml_version: - logging.warn("Warning: %s could not be found - can not install it", orig_grml_version) + target_grml_version_file = search_file('grml-version', grml_target) + if target_grml_version_file: + iso_grml_version_file = search_file('grml-version', iso_mount) + if not iso_grml_version_file: + logging.warn("Warning: %s could not be found - can not install it", iso_grml_version_file) return False try: - new_file = open(new_grml_version, 'a+') - new_flavours = [ get_flavour(l) for l in new_file.readlines() ] - - old_file = open(orig_grml_version, 'r') - old_lines = old_file.readlines() - for line in old_lines: - if not get_flavour(line) in new_flavours: - new_file.write(line) + iso_versions = {} + iso_file = open(iso_grml_version_file, 'r') + for line in iso_file: + iso_versions[get_flavour(line)] = line.strip() + + for line in fileinput.input([target_grml_version_file], inplace=1): + flavour = get_flavour(line) + if flavour in iso_versions.keys(): + print iso_versions[flavour] + else: + print line.strip() except IOError: logging.warn("Warning: Could not write file") finally: - new_file.close() - old_file.close() + iso_file.close() + fileinput.close() return True else: return False @@ -1199,7 +1201,7 @@ def handle_addon_copy(filename, dst, iso_mount): if file_location is None: logging.warn("Warning: %s not found (that's fine if you don't need it)", filename) else: - exec_rsync(file_location, dst + filename) + exec_rsync(file_location, dst) def copy_addons(iso_mount, target): @@ -1269,11 +1271,13 @@ def copy_if_exist(filename, dst): 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) @@ -1301,8 +1305,8 @@ def copy_bootloader_files(iso_mount, 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.") @@ -1314,9 +1318,13 @@ def copy_bootloader_files(iso_mount, target): for expr in name, 'distri.cfg', \ defaults_file, 'grml.png', 'hd.cfg', 'isolinux.cfg', 'isolinux.bin', \ 'isoprompt.cfg', 'options.cfg', \ - 'prompt.cfg', 'vesamenu.c32', 'vesamenu.cfg', 'grml.png', '*.c32': + 'prompt.cfg', 'vesamenu.cfg', 'grml.png', '*.c32': glob_and_copy(iso_mount + source_dir + expr, syslinux_target) + for filename in glob.glob1(syslinux_target, "*.c32"): + copy_if_exist(os.path.join(SYSLINUX_LIBS, filename), syslinux_target) + + # copy the addons_*.cfg file to the new syslinux directory glob_and_copy(iso_mount + source_dir + 'addon*.cfg', syslinux_target) @@ -1354,7 +1362,7 @@ def install_iso_files(grml_flavour, iso_mount, device, target): @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: @@ -1373,7 +1381,7 @@ def install_iso_files(grml_flavour, iso_mount, device, target): 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) @@ -1497,7 +1505,7 @@ def handle_grub2_config(grml_flavour, grub_target, bootopt): # grub2 config grub2_cfg = grub_target + 'grub.cfg' - logging.debug("Creating grub2 configuration file (grub.lst)") + logging.debug("Creating grub2 configuration file (grub.cfg)") global GRML_DEFAULT @@ -1877,6 +1885,7 @@ def install_grml(mountpoint, device): 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) @@ -2034,6 +2043,24 @@ def check_options(opts): sys.exit(1) +def check_programs(): + """check if all needed programs are installed""" + 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) + def main(): """Main function [make pylint happy :)]""" @@ -2057,6 +2084,7 @@ def main(): if options.dryrun: logging.info("Running in simulation mode as requested via option dry-run.") + check_programs() # specified arguments device = args[len(args) - 1] @@ -2071,9 +2099,6 @@ def main(): logging.critical("Fatal: installation on raw device not supported. (BIOS won't support it.)") sys.exit(1) - if not which("rsync"): - logging.critical("Fatal: rsync not available, can not continue - sorry.") - sys.exit(1) # provide upgrade path handle_compat_warning(device)