This script installs a grml system (either a running system or ISO[s]) to a USB device
-:copyright: (c) 2009 by Michael Prokop <mika@grml.org>
+:copyright: (c) 2009, 2010, 2011 by Michael Prokop <mika@grml.org>
:license: GPL v2 or any later version
:bugreports: http://grml.org/bugs/
import struct
# global variables
-PROG_VERSION = "0.9.28"
+PROG_VERSION = "0.9.31"
MOUNTED = set() # register mountpoints
TMPFILES = set() # register tmpfiles
DATESTAMP = time.mktime(datetime.datetime.now().timetuple()) # unique identifier for syslinux.cfg
# pylint: disable-msg=W0603
parser = OptionParser(usage=USAGE)
parser.add_option("--bootoptions", dest="bootoptions",
- action="store", type="string",
+ action="append", type="string",
help="use specified bootoptions as default")
parser.add_option("--bootloader-only", dest="bootloaderonly", action="store_true",
help="do not copy files but just install a bootloader")
set gfxmode=640x480
insmod gfxterm
insmod vbe
- if terminal_output.gfxterm ; then true ; else
+ if terminal_output gfxterm ; then true ; else
# For backward compatibility with versions of terminal.mod that don't
# understand terminal_output
terminal gfxterm
initrd /boot/addons/balder10.imz
}
-menuentry "Boot MirOS bsd4grml" {
- multiboot /boot/addons/bsd4grml/ldbsd.com
- module /boot/addons/bsd4grml/bsd.rd
- module /boot/addons/bsd4grml/boot.1
- module /boot/addons/bsd4grml/boot.2
- module /boot/addons/bsd4grml/boot.3
- module /boot/addons/bsd4grml/boot.4
- module /boot/addons/bsd4grml/boot.5
- module /boot/addons/bsd4grml/boot.6
- module /boot/addons/bsd4grml/boot.cfg
-}
+if [ ${iso_path} ] ; then
+ # assume loopback.cfg boot
+ if [ -e /boot/addons/bsd4grml/loopback.0 ] ; then
+ # bsd4grml 20100815 and later
+ menuentry "Boot MirOS bsd4grml" {
+ multiboot /boot/addons/bsd4grml/ldbsd.com
+ module /boot/addons/bsd4grml/bsd.rd bsd
+ module /boot/addons/bsd4grml/loopback.0 boot.cfg
+ module /boot/addons/bsd4grml/loopback.1 boot.1
+ module /boot/addons/bsd4grml/loopback.2 boot.2
+ module /boot/addons/bsd4grml/loopback.3 boot.3
+ module /boot/addons/bsd4grml/loopback.4 boot.4
+ module /boot/addons/bsd4grml/loopback.5 boot.5
+ module /boot/addons/bsd4grml/loopback.6 boot.6
+ }
+ else
+ # old bsd4grml
+ menuentry "Boot MirOS bsd4grml" {
+ multiboot /boot/addons/bsd4grml/ldbsd.com
+ module /boot/addons/bsd4grml/bsd.rd bsd.rd
+ module /boot/addons/bsd4grml/boot.cfg boot.cfg
+ module /boot/addons/bsd4grml/boot.1 boot.1
+ module /boot/addons/bsd4grml/boot.2 boot.2
+ module /boot/addons/bsd4grml/boot.3 boot.3
+ module /boot/addons/bsd4grml/boot.4 boot.4
+ module /boot/addons/bsd4grml/boot.5 boot.5
+ }
+ fi
+else
+ # assume grub.cfg boot
+ menuentry "Boot MirOS bsd4grml" {
+ multiboot /boot/addons/bsd4grml/ldbsd.com
+ module /boot/addons/bsd4grml/bsd.rd bsd.rd
+ module /boot/addons/bsd4grml/boot.cfg boot.cfg
+ module /boot/addons/bsd4grml/boot.1 boot.1
+ module /boot/addons/bsd4grml/boot.2 boot.2
+ module /boot/addons/bsd4grml/boot.3 boot.3
+ module /boot/addons/bsd4grml/boot.4 boot.4
+ module /boot/addons/bsd4grml/boot.5 boot.5
+ module /boot/addons/bsd4grml/boot.6 boot.6
+ }
+fi
menuentry "Boot OS of first partition on first disk" {
set root=(hd0,1)
squashfs = search_file(grml_flavour + '.squashfs', iso_mount)
if squashfs is None:
- logging.critical("Fatal: squashfs file not found")
+ logging.critical("Fatal: squashfs file not found"
+ ", please check that your iso is not corrupt")
raise CriticalException("error locating squashfs file")
else:
squashfs_target = target + '/live/' + grml_flavour + '/'
logging.warn("Warning: %s could not be found - can not install it", iso_grml_version_file)
return False
try:
+ # read the flavours from the iso image
iso_versions = {}
iso_file = open(iso_grml_version_file, 'r')
for line in iso_file:
iso_versions[get_flavour(line)] = line.strip()
+ # update the existing flavours on the target
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]
+ print iso_versions.pop(flavour)
else:
print line.strip()
+ fileinput.close()
+
+ target_file = open(target_grml_version_file, 'a')
+ # add the new flavours from the current iso
+ for flavour in iso_versions:
+ target_file.write("%s\n" % iso_versions[flavour])
except IOError:
logging.warn("Warning: Could not write file")
finally:
iso_file.close()
- fileinput.close()
+ target_file.close()
return True
else:
return False
# memtest86+ image
handle_addon_copy('memtest', addons, iso_mount)
- # gpxe.lkrn
+ # gpxe.lkrn: got replaced by ipxe
handle_addon_copy('gpxe.lkrn', addons, iso_mount)
+ # ipxe.lkrn
+ handle_addon_copy('ipxe.lkrn', addons, iso_mount)
def glob_and_copy(filepattern, dst):
"""Glob on specified filepattern and copy the result to dst
# 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
@grml_flavour: name of the grml_flavour
"""
# do NOT write "None" in kernel cmdline
- if options.bootoptions is None:
+ if not options.bootoptions:
bootopt = ""
else:
- bootopt = options.bootoptions
+ bootopt = " ".join(options.bootoptions)
bootopt = bootopt.replace("%flavour", grml_flavour)
return bootopt
try:
grml_flavours = identify_grml_flavour(mountpoint)
for flavour in set(grml_flavours):
+ if not flavour:
+ logging.warning("No valid flavour found, please check your iso")
logging.info("Identified grml flavour \"%s\".", flavour)
install_iso_files(flavour, mountpoint, device, device_mountpoint)
GRML_FLAVOURS.add(flavour)