Add support for syslinux prompt
[grml2usb.git] / grml2usb
index b597602..2fb7ed5 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
 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"
 
 # global variables
 PROG_VERSION = "0.9.13-pre1"
@@ -533,6 +534,18 @@ include additional.cfg
 
 include options.cfg
 include addons.cfg
 
 include options.cfg
 include addons.cfg
+
+label help
+  menu label S^yslinux prompt
+  config prompt.cfg
+  text help
+                                        Jump to old style isolinux prompt
+                                        featuring further information
+                                        regarding available boot options.
+  endtext
+
+
+include hiddens.cfg
 """)
 
 
 """)
 
 
@@ -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
 
         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', \
                     '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(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)
 
     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
 
     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._]+)")
     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)")
     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:
 
     # do NOT write "None" in kernel cmdline
     if options.bootoptions is None:
@@ -1377,33 +1408,41 @@ def adjust_syslinux_bootoptions(src_name, dst_name, flavour):
     else:
         bootopt = options.bootoptions
 
     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 = 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)
         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):
 
 
 def add_syslinux_entry(filename, grml_flavour):
-    data = open(filename, "a+")
     entry_filename = "option-%s.cfg" % grml_flavour
     entry = "include %s\n" % entry_filename
     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)
     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()
 
     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 handle_syslinux_config(grml_flavour, target):
     """Main handler for generating syslinux configuration
 
 def handle_syslinux_config(grml_flavour, target):
     """Main handler for generating syslinux configuration
@@ -1432,23 +1471,29 @@ def handle_syslinux_config(grml_flavour, target):
     syslinux_config_file.close()
 
     initial_syslinux_config(syslinux_target)
     syslinux_config_file.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)
     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
+    add_entry_if_not_present("%s/defaults.cfg" % syslinux_target, entry)
 
 
-    default_file.close()
     add_syslinux_entry("%s/additional.cfg" % syslinux_target, grml_flavour)
 
 
     add_syslinux_entry("%s/additional.cfg" % syslinux_target, grml_flavour)