# from __future__ import with_statement
from optparse import OptionParser
from inspect import isroutine, isclass
-import datetime, logging, os, re, subprocess, sys, tempfile, time
+import datetime, logging, os, re, subprocess, sys, tempfile, time, os.path
# global variables
-PROG_VERSION = "0.9.9"
+PROG_VERSION = "0.9.10"
MOUNTED = set() # register mountpoints
TMPFILES = set() # register tmpfiles
DATESTAMP = time.mktime(datetime.datetime.now().timetuple()) # unique identifier for syslinux.cfg
help="display version and exit")
(options, args) = parser.parse_args()
+GRML2USB_BASE = '/usr/share/grml2usb'
+if not os.path.isdir(GRML2USB_BASE):
+ GRML2USB_BASE = os.path.dirname(os.path.realpath(__file__))
+
class CriticalException(Exception):
"""Throw critical exception if the exact error is not known but fatal."
# otherwise fall back to our static version
from platform import architecture
if architecture()[0] == '64bit':
- lilo = '/usr/share/grml2usb/lilo/lilo.static.amd64'
+ lilo = GRML2USB_BASE + '/lilo/lilo.static.amd64'
else:
- lilo = '/usr/share/grml2usb/lilo/lilo.static.i386'
+ lilo = GRML2USB_BASE + '/lilo/lilo.static.i386'
# finally prefer a specified lilo executable
if options.lilobin:
lilo = options.lilobin
grub_target = target + '/boot/grub/'
execute(mkdir, grub_target)
- if not os.path.isfile("/usr/share/grml2usb/grub/splash.xpm.gz"):
- logging.critical("Error: /usr/share/grml2usb/grub/splash.xpm.gz can not be read.")
+ if not os.path.isfile(GRML2USB_BASE + "/grub/splash.xpm.gz"):
+ logging.critical("Error: %s/grub/splash.xpm.gz can not be read." % (GRML2USB_BASE, ))
logging.critical("Please make sure you've the grml2usb Debian package installed!")
raise
else:
- logging.debug("rsync -rlptDH --inplace /usr/share/grml2usb/grub/splash.xpm.gz %s" % grub_target + 'splash.xpm.gz')
- proc = subprocess.Popen(["rsync", "-rlptDH", "--inplace", '/usr/share/grml2usb/grub/splash.xpm.gz',
+ logging.debug("rsync -rlptDH --inplace %s/grub/splash.xpm.gz %s%s" % (GRML2USB_BASE, grub_target, 'splash.xpm.gz'))
+ proc = subprocess.Popen(["rsync", "-rlptDH", "--inplace", GRML2USB_BASE + '/grub/splash.xpm.gz',
grub_target + 'splash.xpm.gz'])
proc.wait()
# grml splash in grub
- if os.path.isfile("/usr/share/grml2usb/grub/grml.png"):
- logging.debug("rsync -rlptDH --inplace /usr/share/grml2usb/grub/grml.png to %s" % grub_target + 'grml.png')
- proc = subprocess.Popen(["rsync", "-rlptDH", "--inplace", '/usr/share/grml2usb/grub/grml.png',
+ if os.path.isfile(GRML2USB_BASE + "/grub/grml.png"):
+ logging.debug("rsync -rlptDH --inplace %s/grub/grml.png to %s%s" % (GRML2USB_BASE, grub_target, 'grml.png'))
+ proc = subprocess.Popen(["rsync", "-rlptDH", "--inplace", GRML2USB_BASE + '/grub/grml.png',
grub_target + 'grml.png'])
proc.wait()
grub1_config_file.write(generate_flavour_specific_grub1_config(grml_flavour, install_partition, bootopt))
grub1_config_file.close()
+ # make sure grub.conf isn't a symlink but a plain file instead,
+ # otherwise it will break on FAT16 filesystems
+ # this works around grub-install of (at least) Fedora 10
+ if os.path.isfile(grub1_cfg):
+ grubconf = grub_target + 'grub.conf'
+ if not os.path.islink(grubconf):
+ import shutil
+ shutil.copyfile(grub1_cfg, grub_target + 'grub.conf')
def handle_grub2_config(grml_flavour, grub_target, bootopt):
"""Main handler for generating grub2 configuration
handle_syslinux_mbr(mbr_device)
elif not skip_install_mir_mbr:
if options.mbrmenu:
- install_mir_mbr('/usr/share/grml2usb/mbr/mbrmgr', mbr_device, partition_number, True)
+ install_mir_mbr(GRML2USB_BASE + '/mbr/mbrmgr', mbr_device, partition_number, True)
else:
- install_mir_mbr('/usr/share/grml2usb/mbr/mbrldr', mbr_device, partition_number, False)
+ install_mir_mbr(GRML2USB_BASE + '/mbr/mbrldr', mbr_device, partition_number, False)
except IOError, error:
logging.critical("Execution failed: %s", error)
sys.exit(1)