use sys.stdout.write instead of print to prevent additional newlines
[grml2usb.git] / grml2usb
index b597602..6ecc0aa 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"
@@ -533,6 +534,18 @@ include additional.cfg
 
 include options.cfg
 include addons.cfg
+
+label help
+  include promptname.cfg
+  config prompt.cfg
+  text help
+                                        Jump to old style isolinux prompt
+                                        featuring further information
+                                        regarding available boot options.
+  endtext
+
+
+include hiddens.cfg
 """)
 
 
@@ -1106,7 +1119,7 @@ def copy_bootloader_files(iso_mount, target):
     logo = search_file('logo.16', iso_mount)
     exec_rsync(logo, syslinux_target + 'logo.16')
 
-    for ffile in 'f2', 'f3', 'f4', 'f5', 'f6', 'f7', 'f8', 'f9', 'f10':
+    for ffile in ['f%d' % number for number in range(1,11) ]:
         bootsplash = search_file(ffile, iso_mount)
         exec_rsync(bootsplash, syslinux_target + ffile)
 
@@ -1121,12 +1134,16 @@ def copy_bootloader_files(iso_mount, target):
         logging.critical("       ... either use grml releases >=2009.10 or switch to an older grml2usb version.")
         raise
 
-    for filename in 'addons.cfg', 'default.cfg', 'distri.cfg', 'hidden.cfg', \
+    for filename in 'addons.cfg', 'default.cfg', 'distri.cfg', \
                     'grml.cfg', 'grml.png', 'hd.cfg', 'isoprompt.cfg', 'options.cfg', \
-                    'vesamenu.c32', 'vesamenu.cfg', 'grml.png':
+                    'prompt.cfg', 'vesamenu.c32', 'vesamenu.cfg', 'grml.png':
         path = search_file(filename, iso_mount + '/boot/isolinux/')
         exec_rsync(path, syslinux_target + filename)
 
+    path = search_file('hidden.cfg', iso_mount + '/boot/isolinux/')
+    exec_rsync(path, syslinux_target + "new-" + 'hidden.cfg')
+
+
     grub_target = target + '/boot/grub/'
     execute(mkdir, grub_target)
 
@@ -1362,14 +1379,28 @@ def initial_syslinux_config(target):
     data.write(generate_main_syslinux_config())
     data.close
 
+    filename = target + "hiddens.cfg"
+    data = open(filename, "w")
+    data.write("include hidden.cfg\n")
+    data.close()
+
+def add_entry_if_not_present(filename, entry):
+    data = open(filename, "a+")
+    for line in data:
+        if line == entry:
+            break
+    else:
+        data.write(entry)
+
+    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+)")
+    flavour_re = re.compile("(label.*)(grml\w+)")
     default_re = re.compile("(default.cfg)")
-    src = open(src_name, "r")
-    dst = open(dst_name, "w")
 
     # do NOT write "None" in kernel cmdline
     if options.bootoptions is None:
@@ -1377,33 +1408,49 @@ def adjust_syslinux_bootoptions(src_name, dst_name, flavour):
     else:
         bootopt = options.bootoptions
 
-    for line in src:
+    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 = 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)
         line = append_re.sub(r'\1 boot=live %s ' % bootopt, line)
-        dst.write(line)
-    src.close()
-    dst.close()
+        sys.stdout.write(line)
+    fileinput.close()
+
+def adjust_labels(src, flavour):
+    label_re = re.compile("^(\s*label\s*) ([a-zA-Z0-9_-]+)", re.I)
+    for line in fileinput.input(src, inplace=1):
+        line = label_re.sub(r'\1 %s-\2' % flavour, line)
+        sys.stdout.write(line)
+    fileinput.close()
 
 
 def add_syslinux_entry(filename, grml_flavour):
-    data = open(filename, "a+")
     entry_filename = "option-%s.cfg" % grml_flavour
     entry = "include %s\n" % entry_filename
+
+    add_entry_if_not_present(filename, entry)
     path = os.path.dirname(filename)
-    for line in data:
-        if line == entry:
-            break
-    else:
-        data.write(entry)
 
-    data.close()
     data = open(path + "/" + entry_filename, "w")
     data.write(generate_flavour_specific_syslinux_config(grml_flavour))
     data.close()
 
+def modify_filenames(grml_flavour, target, filenames):
+    for filename in filenames:
+        old_filename = "%s/%s" % (target, filename)
+        new_filename = "%s/%s-%s" % (target, grml_flavour, filename)
+        os.rename(old_filename, new_filename)
+        adjust_syslinux_bootoptions(new_filename, grml_flavour)
+
+
+def remove_default_entry(filename):
+    default_re = re.compile("^(\s*menu\s*default\s*)$", re.I)
+    for line in fileinput.input(filename, inplace=1):
+        if default_re.match(line): continue
+        sys.stdout.write(line)
+    fileinput.close()
+
 
 def handle_syslinux_config(grml_flavour, target):
     """Main handler for generating syslinux configuration
@@ -1428,27 +1475,43 @@ def handle_syslinux_config(grml_flavour, target):
     # install main configuration only *once*, no matter how many ISOs we have:
     syslinux_flavour_is_default = False
     syslinux_config_file = open(syslinux_cfg, 'w')
-    syslinux_config_file.write("include vesamenu.cfg")
+    syslinux_config_file.write("TIMEOUT 300\n")
+    syslinux_config_file.write("include vesamenu.cfg\n")
     syslinux_config_file.close()
 
+    prompt_name = open(syslinux_target + 'promptname.cfg', 'w')
+    prompt_name.write('menu label S^yslinux prompt\n')
+    prompt_name.close()
+
     initial_syslinux_config(syslinux_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)
+    modify_filenames(grml_flavour, syslinux_target, ['grml.cfg', 'default.cfg'])
+
+    filename = search_file("new-hidden.cfg", syslinux_target)
+    # process hidden file
+    if not search_file("hidden.cfg", syslinux_target):
+        new_hidden = syslinux_target + "hidden.cfg"
+        os.rename(filename, new_hidden)
+        adjust_syslinux_bootoptions(new_hidden, grml_flavour)
+    else:
+        new_hidden =  "%s-hidden.cfg" % (grml_flavour)
+        new_hidden_file =  "%s/%s" % (syslinux_target, new_hidden)
+        os.rename(filename, new_hidden_file)
+        adjust_labels(new_hidden_file, grml_flavour)
+        adjust_syslinux_bootoptions(new_hidden_file, grml_flavour)
+        entry = 'include %s\n' % new_hidden
+        add_entry_if_not_present("%s/hiddens.cfg" % syslinux_target, entry)
+
+
 
-    new_hidden =  "%s-hidden.cfg" % (grml_flavour)
     new_default = "%s-default.cfg" % (grml_flavour)
-    default_file = open("%s/defaults.cfg" % syslinux_target, "a+")
-    entry = "include %s\n" % new_default
-    for line in default_file:
-        if line == entry:
-            break
-    else:
-        default_file.write("include %s\n" % new_default)
+    entry = 'include %s\n' % new_default
+    defaults_file = '%s/defaults.cfg' % syslinux_target
+
+    if os.path.isfile(defaults_file):
+        remove_default_entry('%s/%s-default.cfg' % (syslinux_target, grml_flavour))
+
+    add_entry_if_not_present("%s/defaults.cfg" % syslinux_target, entry)
 
-    default_file.close()
     add_syslinux_entry("%s/additional.cfg" % syslinux_target, grml_flavour)