use fileinput instead of manual processing the files
[grml2usb.git] / grml2usb
index 7af8f44..eb13a07 100755 (executable)
--- a/grml2usb
+++ b/grml2usb
@@ -16,6 +16,7 @@ This script installs a grml system (either a running system or ISO[s]) to a USB
 from optparse import OptionParser
 from inspect import isroutine, isclass
 import datetime, logging, os, re, subprocess, sys, tempfile, time, os.path
+import fileinput
 
 # global variables
 PROG_VERSION = "0.9.13-pre1"
@@ -96,10 +97,12 @@ class CriticalException(Exception):
 # with manipulation of files on the octet level, like shell
 # arrays, e.g. in MBR creation.
 
+
 def array2string(a):
     """Convert a list of integers [0;255] to a string."""
     return struct.pack("%sB" % len(a), *a)
 
+
 def string2array(s):
     """Convert a (bytes) string into a list of integers."""
     return struct.unpack("%sB" % len(s), s)
@@ -358,7 +361,7 @@ menuentry "%(grml_flavour)s2ram        - copy compressed grml file to RAM" {
 ## flavour specific configuration for %(grml_flavour)s [grml2usb for %(grml_flavour)s: %(local_datestamp)s]
 menuentry "%(grml_flavour)s-debug      - enable debugging options" {
     set gfxpayload=1024x768x16,1024x768
-    linux /boot/release/%(grml_flavour)s/linux26 apm=power-off boot=live nomce quiet live-media-path=/live/%(grml_flavour)s/ debug boot=live initcall_debug%(bootoptions)s
+    linux /boot/release/%(grml_flavour)s/linux26 apm=power-off boot=live nomce quiet live-media-path=/live/%(grml_flavour)s/ debug initcall_debug%(bootoptions)s
     initrd /boot/release/%(grml_flavour)s/initrd.gz
 }
 
@@ -377,7 +380,7 @@ menuentry "%(grml_flavour)s-nofb       - disable framebuffer" {
 
 ## flavour specific configuration for %(grml_flavour)s [grml2usb for %(grml_flavour)s: %(local_datestamp)s]
 menuentry "%(grml_flavour)s-failsafe   - disable hardware detection" {
-    linux /boot/release/%(grml_flavour)s/linux26 apm=power-off boot=live nomce quiet live-media-path=/live/%(grml_flavour)s/ vga=normal boot=live noautoconfig atapicd noapic noacpi acpi=off nomodules nofirewire noudev nousb nohotplug noapm nopcmcia nosmp maxcpus=0 noscsi noagp nodma ide=nodma noswap nofstab nosound nogpm nosyslog nodhcp nocpu nodisc nomodem xmodule=vesa noraid nolvm noresume selinux=0 edd=off pci=nomsi %(bootoptions)s
+    linux /boot/release/%(grml_flavour)s/linux26 apm=power-off boot=live nomce quiet live-media-path=/live/%(grml_flavour)s/ vga=normal noautoconfig atapicd noapic noacpi acpi=off nomodules nofirewire noudev nousb nohotplug noapm nopcmcia nosmp maxcpus=0 noscsi noagp nodma ide=nodma noswap nofstab nosound nogpm nosyslog nodhcp nocpu nodisc nomodem xmodule=vesa noraid nolvm noresume selinux=0 edd=off pci=nomsi %(bootoptions)s
     initrd /boot/release/%(grml_flavour)s/initrd.gz
 }
 
@@ -419,7 +422,7 @@ initrd (hd0,%(install_partition)s)/boot/release/%(grml_flavour)s/initrd.gz
 
 ## flavour specific configuration for %(grml_flavour)s [grml2usb for %(grml_flavour)s: %(local_datestamp)s]
 title %(grml_flavour)s-debug
-kernel (hd0,%(install_partition)s)/boot/release/%(grml_flavour)s/linux26 apm=power-off boot=live nomce vga=791 quiet live-media-path=/live/%(grml_flavour)s/ debug boot=live initcall_debug%(bootoptions)s
+kernel (hd0,%(install_partition)s)/boot/release/%(grml_flavour)s/linux26 apm=power-off boot=live nomce vga=791 quiet live-media-path=/live/%(grml_flavour)s/ debug initcall_debug%(bootoptions)s
 initrd (hd0,%(install_partition)s)/boot/release/%(grml_flavour)s/initrd.gz
 
 ## flavour specific configuration for %(grml_flavour)s [grml2usb for %(grml_flavour)s: %(local_datestamp)s]
@@ -434,7 +437,7 @@ initrd (hd0,%(install_partition)s)/boot/release/%(grml_flavour)s/initrd.gz
 
 ## flavour specific configuration for %(grml_flavour)s [grml2usb for %(grml_flavour)s: %(local_datestamp)s]
 title %(grml_flavour)s-failsafe
-kernel (hd0,%(install_partition)s)/boot/release/%(grml_flavour)s/linux26 apm=power-off boot=live nomce quiet live-media-path=/live/%(grml_flavour)s/ vga=normal boot=live noautoconfig atapicd noapic noacpi acpi=off nomodules nofirewire noudev nousb nohotplug noapm nopcmcia nosmp maxcpus=0 noscsi noagp nodma ide=nodma noswap nofstab nosound nogpm nosyslog nodhcp nocpu nodisc nomodem xmodule=vesa noraid nolvm noresume selinux=0 edd=off pci=nomsi %(bootoptions)s
+kernel (hd0,%(install_partition)s)/boot/release/%(grml_flavour)s/linux26 apm=power-off boot=live nomce quiet live-media-path=/live/%(grml_flavour)s/ vga=normal noautoconfig atapicd noapic noacpi acpi=off nomodules nofirewire noudev nousb nohotplug noapm nopcmcia nosmp maxcpus=0 noscsi noagp nodma ide=nodma noswap nofstab nosound nogpm nosyslog nodhcp nocpu nodisc nomodem xmodule=vesa noraid nolvm noresume selinux=0 edd=off pci=nomsi %(bootoptions)s
 initrd (hd0,%(install_partition)s)/boot/release/%(grml_flavour)s/initrd.gz
 
 ## flavour specific configuration for %(grml_flavour)s [grml2usb for %(grml_flavour)s: %(local_datestamp)s]
@@ -580,6 +583,7 @@ def install_grub(device):
                 else:
                     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", "--no-floppy",
@@ -1107,6 +1111,11 @@ def copy_bootloader_files(iso_mount, target):
         bootsplash = search_file(ffile, iso_mount)
         exec_rsync(bootsplash, syslinux_target + ffile)
 
+    # 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'):
+        os.unlink(syslinux_target + 'ldlinux.sys')
+
     if not search_file('default.cfg', iso_mount + '/boot/isolinux/'):
         logging.critical("Fatal: file default.cfg could not be found.")
         logging.critical("Note:  this grml2usb version requires an ISO generated by grml-live >=0.9.24 ...")
@@ -1137,6 +1146,7 @@ def copy_bootloader_files(iso_mount, target):
     if os.path.isfile("/usr/share/grub/ascii.pf2"):
         exec_rsync('/usr/share/grub/ascii.pf2', grub_target + 'ascii.pf2')
 
+
 def install_iso_files(grml_flavour, iso_mount, device, target):
     """Copy files from ISO to given target
 
@@ -1353,22 +1363,27 @@ def initial_syslinux_config(target):
     data.write(generate_main_syslinux_config())
     data.close
 
-def adjust_syslinux_bootoptions(src_name, dst_name, flavour):
+
+def adjust_syslinux_bootoptions(src, flavour):
     append_re = re.compile("^(\s*append.*)$", re.I)
     boot_re = re.compile("/boot/([a-zA-Z0-9_]+/)+([a-zA-Z0-9._]+)")
     flavour_re = re.compile("(label.*)(grml\w+)")
     default_re = re.compile("(default.cfg)")
-    src = open(src_name, "r")
-    dst = open(dst_name, "w")
 
-    for line in src:
-        line = boot_re.sub(r'/boot/release/%s/\2 ' % flavour, line) 
-        line = flavour_re.sub(r'\1 %s-\2' % flavour, line) 
+    # do NOT write "None" in kernel cmdline
+    if options.bootoptions is None:
+        bootopt = ""
+    else:
+        bootopt = options.bootoptions
+
+    for line in fileinput.input(src, inplace=1):
+        line = boot_re.sub(r'/boot/release/%s/\2 ' % flavour, line)
+        line = flavour_re.sub(r'\1 %s-\2' % flavour, line)
         line = default_re.sub(r'%s-\1' % flavour, line)
         line = append_re.sub(r'\1 live-media-path=/live/%s/ ' % flavour, line)
-        dst.write(line)
-    src.close()
-    dst.close()
+        line = append_re.sub(r'\1 boot=live %s ' % bootopt, line)
+        print line
+    fileinput.close()
 
 
 def add_syslinux_entry(filename, grml_flavour):
@@ -1388,8 +1403,6 @@ def add_syslinux_entry(filename, grml_flavour):
     data.close()
 
 
-
-
 def handle_syslinux_config(grml_flavour, target):
     """Main handler for generating syslinux configuration
 
@@ -1420,8 +1433,8 @@ def handle_syslinux_config(grml_flavour, target):
     for filename in 'grml.cfg', 'default.cfg', 'hidden.cfg':
         old_filename = "%s/%s" % (syslinux_target, filename)
         new_filename = "%s/%s-%s" % (syslinux_target, grml_flavour, filename)
-        adjust_syslinux_bootoptions(old_filename, new_filename, grml_flavour)
-        os.unlink(old_filename)
+        os.rename(old_filename, new_filename)
+        adjust_syslinux_bootoptions(new_filename, grml_flavour)
 
     new_hidden =  "%s-hidden.cfg" % (grml_flavour)
     new_default = "%s-default.cfg" % (grml_flavour)
@@ -1437,9 +1450,6 @@ def handle_syslinux_config(grml_flavour, target):
     add_syslinux_entry("%s/additional.cfg" % syslinux_target, grml_flavour)
 
 
-
-
-
 def handle_bootloader_config(grml_flavour, device, target):
     """Main handler for generating bootloader's configuration
 
@@ -1465,6 +1475,7 @@ def handle_bootloader_config(grml_flavour, device, target):
             logging.critical("Fatal: %s", error)
             sys.exit(1)
 
+
 def handle_dir(live_image, device):
     """Main logic for copying files of the currently running grml system.
 
@@ -1773,7 +1784,6 @@ def main():
     # finally be politely :)
     logging.info("Finished execution of grml2usb (%s). Have fun with your grml system.", PROG_VERSION)
 
-
 if __name__ == "__main__":
     try:
         main()