import datetime, logging, os, re, subprocess, sys, tempfile, time
# global variables
-PROG_VERSION = "0.9.3"
+PROG_VERSION = "0.9.7"
MOUNTED = set() # register mountpoints
TMPFILES = set() # register tmpfiles
DATESTAMP = time.mktime(datetime.datetime.now().timetuple()) # unique identifier for syslinux.cfg
initrd /boot/addons/balder10.imz
}
-menuentry "MirBSD" {
+menuentry "MirOS BSD" {
set root=(hd0,%(install_partition)s)
- linux /boot/addons/bsd4grml/ldbsd.com
+ multiboot /boot/addons/bsd4grml/ldbsd.com
}
menuentry "Boot OS of first partition on first disk" {
}
## flavour specific configuration for %(grml_flavour)s [grml2usb for %(grml_flavour)s: %(local_datestamp)s]
+menuentry "%(grml_flavour)s-persistent" {
+ set root=(hd0,%(install_partition)s)
+ linux /boot/release/%(grml_flavour)s/linux26 apm=power-off boot=live nomce vga=791 quiet persistent live-media-path=/live/%(grml_flavour)s/ %(bootoptions)s
+ initrd /boot/release/%(grml_flavour)s/initrd.gz
+}
+
+## flavour specific configuration for %(grml_flavour)s [grml2usb for %(grml_flavour)s: %(local_datestamp)s]
menuentry "%(grml_flavour)s2ram" {
set root=(hd0,%(install_partition)s)
linux /boot/release/%(grml_flavour)s/linux26 apm=power-off boot=live nomce vga=791 quiet live-media-path=/live/%(grml_flavour)s/ toram=%(grml_flavour)s %(bootoptions)s
## flavour specific configuration for %(grml_flavour)s [grml2usb for %(grml_flavour)s: %(local_datestamp)s]
menuentry "%(grml_flavour)s-debug" {
set root=(hd0,%(install_partition)s)
- linux /boot/release/%(grml_flavour)s/linux26
- initrd /boot/release/%(grml_flavour)s/initrd.gz apm=power-off boot=live nomce vga=791 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 vga=791 quiet live-media-path=/live/%(grml_flavour)s/ debug boot=live initcall_debug%(bootoptions)s
+ initrd /boot/release/%(grml_flavour)s/initrd.gz
}
## flavour specific configuration for %(grml_flavour)s [grml2usb for %(grml_flavour)s: %(local_datestamp)s]
menuentry "%(grml_flavour)s-x" {
set root=(hd0,%(install_partition)s)
- linux /boot/release/%(grml_flavour)s/linux26
- initrd /boot/release/%(grml_flavour)s/initrd.gz apm=power-off boot=live nomce vga=791 quiet live-media-path=/live/%(grml_flavour)s/ startx=wm-ng %(bootoptions)s
+ linux /boot/release/%(grml_flavour)s/linux26 apm=power-off boot=live nomce vga=791 quiet live-media-path=/live/%(grml_flavour)s/ startx=wm-ng %(bootoptions)s
+ initrd /boot/release/%(grml_flavour)s/initrd.gz
}
## flavour specific configuration for %(grml_flavour)s [grml2usb for %(grml_flavour)s: %(local_datestamp)s]
menuentry "%(grml_flavour)s-nofb" {
set root=(hd0,%(install_partition)s)
- linux /boot/release/%(grml_flavour)s/linux26
- initrd /boot/release/%(grml_flavour)s/initrd.gz apm=power-off boot=live nomce quiet live-media-path=/live/%(grml_flavour)s/ vga=normal video=ofonly %(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 video=ofonly %(bootoptions)s
+ initrd /boot/release/%(grml_flavour)s/initrd.gz
}
## flavour specific configuration for %(grml_flavour)s [grml2usb for %(grml_flavour)s: %(local_datestamp)s]
menuentry "%(grml_flavour)s-failsafe" {
set root=(hd0,%(install_partition)s)
- linux /boot/release/%(grml_flavour)s/linux26
- initrd /boot/release/%(grml_flavour)s/initrd.gz 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 %(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 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 %(bootoptions)s
+ initrd /boot/release/%(grml_flavour)s/initrd.gz
}
## flavour specific configuration for %(grml_flavour)s [grml2usb for %(grml_flavour)s: %(local_datestamp)s]
menuentry "%(grml_flavour)s-forensic" {
set root=(hd0,%(install_partition)s)
- linux /boot/release/%(grml_flavour)s/linux26
- initrd /boot/release/%(grml_flavour)s/initrd.gz apm=power-off boot=live nomce vga=791 quiet live-media-path=/live/%(grml_flavour)s/ nofstab noraid nolvm noautoconfig noswap raid=noautodetect %(bootoptions)s
+ linux /boot/release/%(grml_flavour)s/linux26 apm=power-off boot=live nomce vga=791 quiet live-media-path=/live/%(grml_flavour)s/ nofstab noraid nolvm noautoconfig noswap raid=noautodetect %(bootoptions)s
+ initrd /boot/release/%(grml_flavour)s/initrd.gz
}
## flavour specific configuration for %(grml_flavour)s [grml2usb for %(grml_flavour)s: %(local_datestamp)s]
menuentry "%(grml_flavour)s-serial" {
set root=(hd0,%(install_partition)s)
- linux /boot/release/%(grml_flavour)s/linux26
- initrd /boot/release/%(grml_flavour)s/initrd.gz apm=power-off boot=live nomce quiet live-media-path=/live/%(grml_flavour)s/ vga=normal video=vesafb:off console=tty1 console=ttyS0,9600n8 %(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 video=vesafb:off console=tty1 console=ttyS0,9600n8 %(bootoptions)s
+ initrd /boot/release/%(grml_flavour)s/initrd.gz
}
""" % {'grml_flavour': grml_flavour, 'local_datestamp': local_datestamp,
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-persistent
+kernel (hd0,%(install_partition)s)/boot/release/%(grml_flavour)s/linux26 apm=power-off boot=live nomce vga=791 quiet persistent live-media-path=/live/%(grml_flavour)s/ %(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]
title %(grml_flavour)s2ram
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/ toram=%(grml_flavour)s %(bootoptions)s
initrd (hd0,%(install_partition)s)/boot/release/%(grml_flavour)s/initrd.gz
# define entries:
title %(grml_flavour)s - Default boot (using 1024x768 framebuffer)
-kernel (hd0,%(install_partition)s)/boot/release/%(grml_flavour)s/linux26 apm=power-off vga=791 quiet boot=live nomce live-media-path=/live/%(grml_flavour)s/
+kernel (hd0,%(install_partition)s)/boot/release/%(grml_flavour)s/linux26 apm=power-off vga=791 quiet boot=live nomce live-media-path=/live/%(grml_flavour)s/ %(bootoptions)s
initrd (hd0,%(install_partition)s)/boot/release/%(grml_flavour)s/initrd.gz
title Memory test (memtest86+)
kernel (hd0,%(install_partition)s)/boot/addons/memdisk
initrd (hd0,%(install_partition)s)/boot/addons/balder10.imz
-title MirBSD
+title MirOS BSD
kernel (hd0,%(install_partition)s)/boot/addons/bsd4grml/ldbsd.com
""" % {'grml_flavour': grml_flavour, 'local_datestamp': local_datestamp,
MENU LABEL bsd
KERNEL /boot/addons/bsd4grml/ldbsd.com
+# hardware detection tool
+MENU LABEL hdt
+KERNEL /boot/addons/hdt.c32
+APPEND pciids=/boot/addons/pci.ids
+
## end of global configuration
""" % {'grml_flavour': grml_flavour, 'local_datestamp': local_datestamp, 'bootoptions': bootoptions} )
APPEND initrd=/boot/release/%(grml_flavour)s/initrd.gz apm=power-off boot=live nomce vga=791 quiet live-media-path=/live/%(grml_flavour)s/ %(bootoptions)s
# flavour specific configuration for %(grml_flavour)s [grml2usb for %(grml_flavour)s: %(local_datestamp)s]
+LABEL %(grml_flavour)s-persistent
+KERNEL /boot/release/%(grml_flavour)s/linux26
+APPEND initrd=/boot/release/%(grml_flavour)s/initrd.gz apm=power-off boot=live nomce vga=791 quiet persistent live-media-path=/live/%(grml_flavour)s/ %(bootoptions)s
+
+# flavour specific configuration for %(grml_flavour)s [grml2usb for %(grml_flavour)s: %(local_datestamp)s]
LABEL %(grml_flavour)s2ram
KERNEL /boot/release/%(grml_flavour)s/linux26
APPEND initrd=/boot/release/%(grml_flavour)s/initrd.gz apm=power-off boot=live nomce vga=791 quiet live-media-path=/live/%(grml_flavour)s/ toram=%(grml_flavour)s %(bootoptions)s
"--root-directory=%s" % device_mountpoint, device], stdout=file(os.devnull, "r+"))
proc.wait()
if proc.returncode != 0:
- raise Exception("error executing grub-install")
+ # raise Exception("error executing grub-install")
+ logging.critical("Fatal: error executing grub-install (please check the grml2usb FAQ)" % error)
+ cleanup()
+ sys.exit(1)
except CriticalException, error:
logging.critical("Fatal: %s" % error)
cleanup()
# make sure we unmount only already mounted targets
target_unmount = False
mounts = open('/proc/mounts').readlines()
- mountstring = re.compile(".*%s.*" % re.escape(target))
+ mountstring = re.compile(".*%s.*" % re.escape(os.path.realpath(target)))
for line in mounts:
if re.match(mountstring, line):
target_unmount = True
squashfs = search_file(grml_flavour + '.squashfs', iso_mount)
if squashfs is None:
logging.critical("Fatal: squashfs file not found")
+ raise CriticalException("error locating squashfs file")
else:
squashfs_target = target + '/live/' + grml_flavour + '/'
execute(mkdir, squashfs_target)
# grub all-in-one image
allinoneimg = search_file('allinone.img', iso_mount)
if allinoneimg is None:
- logging.warn("Warning: allinone.img not found (that's fine if you don't need it")
+ logging.warn("Warning: allinone.img not found (that's fine if you don't need it)")
else:
logging.debug("cp %s %s" % (allinoneimg, addons + '/allinone.img'))
proc = subprocess.Popen(["cp", allinoneimg, addons + 'allinone.img'])
# bsd imag
bsdimg = search_file('bsd4grml', iso_mount)
if bsdimg is None:
- logging.warn("Warning: bsd4grml not found (that's fine if you don't need it")
+ logging.warn("Warning: bsd4grml not found (that's fine if you don't need it)")
else:
logging.debug("cp -a %s %s" % (bsdimg, addons + '/'))
proc = subprocess.Popen(["cp", "-a", bsdimg, addons + '/'])
# freedos image
balderimg = search_file('balder10.imz', iso_mount)
if balderimg is None:
- logging.warn("Warning: balder10.imz not found (that's fine if you don't need it")
+ logging.warn("Warning: balder10.imz not found (that's fine if you don't need it)")
else:
logging.debug("cp %s %s" % (balderimg, addons + '/balder10.imz'))
proc = subprocess.Popen(["cp", balderimg, addons + 'balder10.imz'])
proc.wait()
+ # install hdt and pci.ids only when using syslinux (grub doesn't support it)
+ if options.syslinux:
+ # hdt (hardware detection tool) image
+ hdtimg = search_file('hdt.c32', iso_mount)
+ if hdtimg:
+ logging.debug("cp %s %s" % (hdtimg, addons + '/hdt.c32'))
+ proc = subprocess.Popen(["cp", hdtimg, addons + '/hdt.c32'])
+ proc.wait()
+
+ # pci.ids file
+ picids = search_file('pci.ids', iso_mount)
+ if picids:
+ logging.debug("cp %s %s" % (picids, addons + '/pci.ids'))
+ proc = subprocess.Popen(["cp", picids, addons + '/pci.ids'])
+ proc.wait()
+
# memdisk image
memdiskimg = search_file('memdisk', iso_mount)
if memdiskimg is None:
- logging.warn("Warning: memdisk not found (that's fine if you don't need it")
+ logging.warn("Warning: memdisk not found (that's fine if you don't need it)")
else:
logging.debug("cp %s %s" % (memdiskimg, addons + '/memdisk'))
proc = subprocess.Popen(["cp", memdiskimg, addons + 'memdisk'])
# memtest86+ image
memtestimg = search_file('memtest', iso_mount)
if memtestimg is None:
- logging.warn("Warning: memtest not found (that's fine if you don't need it")
+ logging.warn("Warning: memtest not found (that's fine if you don't need it)")
else:
logging.debug("cp %s %s" % (memtestimg, addons + '/memtest'))
proc = subprocess.Popen(["cp", memtestimg, addons + 'memtest'])
return 0
elif not options.bootloaderonly:
logging.info("Copying files. This might take a while....")
- copy_system_files(grml_flavour, iso_mount, target)
- copy_grml_files(iso_mount, target)
+ try:
+ copy_system_files(grml_flavour, iso_mount, target)
+ copy_grml_files(iso_mount, target)
+ except CriticalException, error:
+ logging.critical("Execution failed: %s", error)
+ sys.exit(1)
if not options.skipaddons:
if grml_flavour.endswith('-small'):
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.
+
+ @live_image: directory where currently running live system resides (usually /live/image)
+ @device: partition where the specified ISO should be installed to"""
+
+ logging.info("Using %s as install base" % live_image)
+
+ if os.path.isdir(device):
+ logging.info("Specified target is a directory, not mounting therefor.")
+ device_mountpoint = device
+ remove_device_mountpoint = False
+ else:
+ device_mountpoint = tempfile.mkdtemp(prefix="grml2usb")
+ register_tmpfile(device_mountpoint)
+ remove_device_mountpoint = True
+ try:
+ mount(device, device_mountpoint, "")
+ except CriticalException, error:
+ logging.critical("Fatal: %s" % error)
+ cleanup()
+ sys.exit(1)
+
+ try:
+ grml_flavour = identify_grml_flavour(live_image)
+ logging.info("Identified grml flavour \"%s\"." % grml_flavour)
+ install_iso_files(grml_flavour, live_image, device, device_mountpoint)
+ except TypeError:
+ logging.critical("Fatal: a critical error happend during execution (not a grml ISO?), giving up")
+ sys.exit(1)
+ finally:
+ if remove_device_mountpoint:
+ try:
+ unmount(device_mountpoint, "")
+ if os.path.isdir(device_mountpoint):
+ os.rmdir(device_mountpoint)
+ unregister_tmpfile(device_mountpoint)
+ except CriticalException, error:
+ logging.critical("Fatal: %s" % error)
+ cleanup()
+
def handle_iso(iso, device):
"""Main logic for mounting ISOs and copying files.
logging.info("Using ISO %s" % iso)
- if os.path.isdir(iso):
- logging.critical("TODO: /live/image handling not yet implemented - sorry")
- sys.exit(1)
-
iso_mountpoint = tempfile.mkdtemp(prefix="grml2usb")
register_tmpfile(iso_mountpoint)
remove_iso_mountpoint = True
def handle_logging():
"""Log handling and configuration"""
+ if options.verbose and options.quiet:
+ parser.error("please use either verbose (--verbose) or quiet (--quiet) option")
+
if options.verbose:
FORMAT = "Debug: %(asctime)-15s %(message)s"
logging.basicConfig(level=logging.DEBUG, format=FORMAT)
# make sure we have the appropriate permissions
check_uid_root()
+ logging.info("Executing grml2usb version %s", PROG_VERSION)
+
if options.dryrun:
logging.info("Running in simulation mode as requested via option dry-run.")
# main operation (like installing files)
for iso in isos:
- handle_iso(iso, device)
+ if os.path.isdir(iso):
+ handle_dir(iso, device)
+ else:
+ handle_iso(iso, device)
# install mbr
if not os.path.isdir(device):