X-Git-Url: https://git.grml.org/?p=grml2usb.git;a=blobdiff_plain;f=grml2usb;h=751d8cc8c2ee38889667b9cf76791092cd5bd8e7;hp=24207b632603697e2bb1310fe5409fff9daea75b;hb=09149d774d47e757ca6df1e9363fa8cb75d41740;hpb=6b93ccd0cbbbae5ac1f86762d89a681a3243d7fa diff --git a/grml2usb b/grml2usb index 24207b6..751d8cc 100755 --- a/grml2usb +++ b/grml2usb @@ -376,7 +376,7 @@ menu begin grml %(grml_flavour)s include %(grml_flavour)s_grml.cfg menu hide menu end -""" % {'grml_flavour': grml_flavour, 'display_name' : grml_flavour.replace('_', '-') } ) +""" % {'grml_flavour': grml_flavour, 'display_name' : get_flavour_filename(grml_flavour) } ) def install_grub(device): @@ -546,7 +546,7 @@ def install_mbr(mbrtemplate, device, partition, ismirbsdmbr=True): mbrcode[463:478] + actives[2] + \ mbrcode[479:494] + actives[3] + \ mbrcode[495:510] + "\x55\xAA" - + tmpf.file.seek(0) tmpf.file.truncate() tmpf.file.write(mbrcode) @@ -740,6 +740,11 @@ def get_uuid(target): execute(mkdir, conf_target) return write_uuid(uuid_file_name) +def get_shortname(grml_flavour): + """Get shortname based from grml_flavour name. The rules applied are the same as in grml-live + @grml_flavour: flavour name which shold be translated to shortname""" + + return re.sub(r'[,._-]', '', grml_flavour) def copy_system_files(grml_flavour, iso_mount, target): """copy grml's main files (like squashfs, kernel and initrd) to a given target @@ -768,19 +773,24 @@ def copy_system_files(grml_flavour, iso_mount, target): else: exec_rsync(filesystem_module, squashfs_target + 'filesystem.module') - kernel = search_file('vmlinuz', iso_mount) - if kernel is None: - # compat for releases < 2011.12 - kernel = search_file('linux26', iso_mount) - if kernel is None: - logging.critical("Fatal: kernel not found") - raise CriticalException("error locating kernel file") + shortname = get_shortname(grml_flavour) + if os.path.isdir(iso_mount + '/boot/' + shortname): + exec_rsync(iso_mount + '/boot/' + shortname, target + '/boot') + else: + kernel = search_file('vmlinuz', iso_mount) + if kernel is None: + # compat for releases < 2011.12 + kernel = search_file('linux26', iso_mount) + + if kernel is None: + logging.critical("Fatal: kernel not found") + raise CriticalException("error locating kernel file") - source = os.path.dirname(kernel) + '/' - dest = target + '/' + os.path.dirname(kernel).replace(iso_mount,'') + '/' - execute(mkdir, dest) - exec_rsync(source, dest) + source = os.path.dirname(kernel) + '/' + dest = target + '/' + os.path.dirname(kernel).replace(iso_mount,'') + '/' + execute(mkdir, dest) + exec_rsync(source, dest) def update_grml_versions(iso_mount, target): @@ -827,46 +837,24 @@ def update_grml_versions(iso_mount, target): else: return False -def copy_grml_files(iso_mount, target): +def copy_grml_files(grml_flavour, iso_mount, target): """copy some minor grml files to a given target + @grml_flavour: the current grml_flavour @iso_mount: path where a grml ISO is mounted on @target: path where grml's main files should be copied to""" grml_target = target + '/grml/' execute(mkdir, grml_target) - copy_files = [ 'grml-cheatcodes.txt', 'LICENSE.txt', 'md5sums', 'README.txt' ] - # handle grml-version - if not update_grml_versions(iso_mount, target): - copy_files.append('grml-version') - - for myfile in copy_files: - grml_file = search_file(myfile, iso_mount) - if grml_file is None: - logging.warn("Warning: file %s could not be found - can not install it", myfile) - else: - exec_rsync(grml_file, grml_target + myfile) - - grml_web_target = grml_target + '/web/' - execute(mkdir, grml_web_target) - - for myfile in 'index.html', 'style.css': - grml_file = search_file(myfile, iso_mount) - if grml_file is None: - logging.warn("Warning: file %s could not be found - can not install it", myfile) - else: - exec_rsync(grml_file, grml_web_target + myfile) - - grml_webimg_target = grml_web_target + '/images/' - execute(mkdir, grml_webimg_target) - - for myfile in 'button.png', 'favicon.png', 'linux.jpg', 'logo.png': - grml_file = search_file(myfile, iso_mount) - if grml_file is None: - logging.warn("Warning: file %s could not be found - can not install it", myfile) - else: - exec_rsync(grml_file, grml_webimg_target + myfile) + grml_prefixe = ["GRML", "grml"] + for prefix in grml_prefixe: + filename = "{0}/{1}/{2}".format(iso_mount, prefix, grml_flavour) + if os.path.exists(filename): + exec_rsync(filename, grml_target) + break + else: + logging.warn("Warning: could not find flavour directory for %s ", grml_flavour) def handle_addon_copy(filename, dst, iso_mount, ignore_errors=False): @@ -926,6 +914,36 @@ def copy_addons(iso_mount, target): # ipxe.lkrn handle_addon_copy('ipxe.lkrn', addons, iso_mount) + +def build_loopbackcfg(target): + """Generate GRUB's loopback.cfg based on existing config files. + + @target: target directory + """ + + grub_dir='/boot/grub/' + mkdir(os.path.join(target, grub_dir)) + + f = open(target + grub_dir + 'loopback.cfg','w') + + f.write("# grml2usb generated grub2 configuration file\n") + f.write("source /boot/grub/header.cfg\n") + + for defaults in glob.glob(target + os.path.sep + grub_dir + os.path.sep + "*_default.cfg"): + sourcefile = defaults.split(target + os.path.sep)[1] + logging.debug("Found source file" + sourcefile) + os.path.isfile(defaults) and f.write("source " + sourcefile + "\n") + + for ops in glob.glob(target + os.path.sep + grub_dir + os.path.sep + "*_options.cfg"): + sourcefile = ops.split(target + os.path.sep)[1] + 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/footer.cfg\n") + f.close() + + def glob_and_copy(filepattern, dst): """Glob on specified filepattern and copy the result to dst @@ -984,13 +1002,6 @@ def copy_bootloader_files(iso_mount, target, grml_flavour): for ffile in ['f%d' % number for number in range(1, 11) ]: search_and_copy(ffile, iso_mount, syslinux_target + ffile) - loopback_cfg = search_file("loopback.cfg", iso_mount) - if loopback_cfg: - directory = os.path.dirname(loopback_cfg) - directory = directory.replace(iso_mount, "") - mkdir(os.path.join(target, directory)) - exec_rsync(loopback_cfg, target + os.path.sep + directory) - # avoid the "file is read only, overwrite anyway (y/n) ?" question # of mtools by syslinux ("mmove -D o -D O s:/ldlinux.sys $target_file") if os.path.isfile(syslinux_target + 'ldlinux.sys'): @@ -1026,6 +1037,10 @@ def copy_bootloader_files(iso_mount, target, grml_flavour): # copy all grub files from ISO glob_and_copy(iso_mount + '/boot/grub/*', grub_target) + # finally (after all GRUB files have been been installed) build static loopback.cfg + build_loopbackcfg(target) + + def install_iso_files(grml_flavour, iso_mount, device, target): """Copy files from ISO to given target @@ -1042,7 +1057,7 @@ def install_iso_files(grml_flavour, iso_mount, device, target): logging.info("Copying files. This might take a while....") try: copy_system_files(grml_flavour, iso_mount, target) - copy_grml_files(iso_mount, target) + copy_grml_files(grml_flavour, iso_mount, target) except CriticalException, error: logging.critical("Execution failed: %s", error) sys.exit(1) @@ -1138,13 +1153,16 @@ def handle_grub_config(grml_flavour, device, target): for regex in options.removeoption: remove_regexes.append(re.compile(regex)) + shortname = get_shortname(grml_flavour) for filename in glob.glob(grub_target + '*.cfg'): for line in fileinput.input(filename, inplace=1): line = line.rstrip("\r\n") if option_re.search(line): line = bootid_re.sub('', line) - line = live_media_path_re.sub('', line) - line = line.rstrip() + r' live-media-path=/live/%s/ bootid=%s %s ' % (grml_flavour, UUID, bootopt) + if shortname in filename: + line = live_media_path_re.sub('', line) + line = line.rstrip() + ' live-media-path=/live/%s/ ' % (grml_flavour) + line = line.rstrip() + r' bootid=%s %s ' % (UUID, bootopt) for regex in remove_regexes: line = regex.sub(' ', line) print line @@ -1264,7 +1282,7 @@ def modify_filenames(grml_flavour, target, filenames): @target: directory where the files are located @filenames: list of filenames to alter """ - grml_filename = grml_flavour.replace('-', '_') + grml_filename = get_flavour_filename(grml_flavour) for filename in filenames: old_filename = "%s/%s" % (target, filename) new_filename = "%s/%s_%s" % (target, grml_filename, filename) @@ -1308,7 +1326,7 @@ def handle_syslinux_config(grml_flavour, target): prompt_name.close() initial_syslinux_config(syslinux_target) - flavour_filename = grml_flavour.replace('-', '_') + flavour_filename = get_flavour_filename(grml_flavour) if search_file('default.cfg', syslinux_target): modify_filenames(grml_flavour, syslinux_target, ['grml.cfg', 'default.cfg']) @@ -1657,7 +1675,7 @@ def main(): check_programs() # specified arguments - device = args[len(args) - 1] + device = os.path.realpath(args[len(args) - 1]) isos = args[0:len(args) - 1] if not os.path.isdir(device):