Don't nag users about gpxe.lkrn
[grml2usb.git] / grml2usb
index 8de8b25..8987450 100755 (executable)
--- a/grml2usb
+++ b/grml2usb
@@ -7,7 +7,7 @@ grml2usb
 
 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/
 
@@ -22,7 +22,7 @@ import uuid
 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
@@ -60,7 +60,7 @@ Run %prog --help for usage hints, further information via: man grml2usb"
 # 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")
@@ -324,7 +324,7 @@ if loadfont /boot/grub/ascii.pf2 ; then
    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
@@ -359,17 +359,48 @@ menuentry "Boot FreeDOS" {
     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)
@@ -1071,7 +1102,8 @@ def copy_system_files(grml_flavour, iso_mount, target):
 
     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 + '/'
@@ -1128,22 +1160,30 @@ def update_grml_versions(iso_mount, target):
             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
@@ -1190,16 +1230,18 @@ def copy_grml_files(iso_mount, target):
             exec_rsync(grml_file, grml_webimg_target + myfile)
 
 
-def handle_addon_copy(filename, dst, iso_mount):
+def handle_addon_copy(filename, dst, iso_mount, ignore_errors=False):
     """handle copy of optional addons
 
     @filename: filename of the addon
     @dst: destination directory
     @iso_mount: location of the iso mount
+    @ignore_errors: don't report missing files
     """
     file_location = search_file(filename, iso_mount)
     if file_location is None:
-        logging.warn("Warning: %s not found (that's fine if you don't need it)",  filename)
+        if not ignore_errors:
+            logging.warn("Warning: %s not found (that's fine if you don't need it)",  filename)
     else:
         exec_rsync(file_location, dst)
 
@@ -1239,9 +1281,11 @@ def copy_addons(iso_mount, target):
     # memtest86+ image
     handle_addon_copy('memtest', addons, iso_mount)
 
-    # gpxe.lkrn
-    handle_addon_copy('gpxe.lkrn', addons, iso_mount)
+    # gpxe.lkrn: got replaced by ipxe
+    handle_addon_copy('gpxe.lkrn', addons, iso_mount, ignore_errors=True)
 
+    # 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
@@ -1553,10 +1597,10 @@ def get_bootoptions(grml_flavour):
     @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
 
@@ -1883,6 +1927,8 @@ def install_grml(mountpoint, device):
     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)