import shutil
# The line following this line is patched by debian/rules and tarball.sh.
-PROG_VERSION = '***UNRELEASED***'
+PROG_VERSION = '***UNKNOWN***'
+
+# when running from inside git, try to report version information via git-describe
+try:
+ git_dir = os.path.abspath(os.path.dirname(sys.argv[0]))
+ with open(os.devnull, 'w') as devnull:
+ PROG_VERSION = subprocess.check_output(["git",
+ "-C",
+ git_dir,
+ "describe",
+ "--always",
+ "--dirty"],
+ stderr=devnull).strip().decode('utf-8', errors='replace') + \
+ " (git)"
+except Exception:
+ pass
# global variables
MOUNTED = set() # register mountpoints
GRML_FLAVOURS = set() # which flavours are being installed?
GRML_DEFAULT = None
UUID = None
-SYSLINUX_LIBS = "/usr/lib/syslinux/"
+SYSLINUX_LIBS = [
+ "/usr/lib/syslinux/modules/bios/", # Debian
+ "/usr/lib/syslinux/bios/", # Arch Linux
+]
GPT_HEADER = b"\x55\xaa\x45\x46\x49\x20\x50\x41\x52\x54" # original GPT header
GRUB_INSTALL = None
help="install syslinux bootloader (deprecated as it's the default)")
parser.add_option("--syslinux-mbr", dest="syslinuxmbr", action="store_true",
help="install syslinux master boot record (MBR) instead of default")
+parser.add_option("--syslinux-libs", dest="syslinuxlibs", action="append", default=[],
+ help="syslinux modules directory path")
parser.add_option("--tmpdir", dest="tmpdir", default="/tmp",
help="directory to be used for temporary files")
parser.add_option("--verbose", dest="verbose", action="store_true",
return
except HodorException as e:
logging.info("%s, falling back to old bootflag detection", e)
- except ImportError as e:
+ except ImportError:
logging.debug("could not import parted, falling back to old bootflag detection")
- with open(boot_dev, 'r') as image:
+ with open(boot_dev, 'rb') as image:
data = image.read(520)
bootcode = data[440:]
gpt_data = bootcode[70:80]
if proc.returncode != 0:
# raise Exception("error executing grub-install")
- logging.critical("Fatal: error executing grub-install " +
+ logging.critical("Fatal: error executing grub-install "
"(please check the grml2usb FAQ or drop the --grub option)")
- logging.critical("Note: if using grub2 consider using " +
+ logging.critical("Note: if using grub2 consider using "
"the --grub-mbr option as grub considers PBR problematic.")
cleanup()
sys.exit(1)
for x in open('/proc/mounts', 'r').readlines():
if x.startswith(source):
- raise CriticalException("Error executing mount: %s already mounted - " % source +
- "please unmount before invoking grml2usb")
+ raise CriticalException(("Error executing mount: %s already mounted - "
+ "please unmount before invoking grml2usb").format(source))
if os.path.isdir(source):
logging.debug("Source %s is not a device, therefore not mounting.", source)
" (wrong UID/permissions or device/directory not present?)" % partition)
try:
- udev_info = subprocess.Popen(["/sbin/blkid", "-s", "TYPE", "-o", "value", partition],
- stdout=subprocess.PIPE, stderr=subprocess.PIPE)
- filesystem = udev_info.communicate()[0].rstrip()
+ filesystem = subprocess.check_output(["/sbin/blkid", "-s", "TYPE", "-o", "value", partition]).decode().rstrip()
if filesystem != "vfat":
raise CriticalException(
"(Use --fat16 or run mkfs.vfat %s)" % (partition, partition))
except OSError:
- raise CriticalException("Sorry, /sbin/blkid not available (install e2fsprogs?)")
+ raise CriticalException("Sorry, /sbin/blkid not available (install util-linux?)")
def mkdir(directory):
logging.warn("Warning: could not find flavour directory for %s ", grml_flavour)
-def handle_addon_copy(filename, dst, iso_mount, ignore_errors=False):
- """handle copy of optional addons
-
- @filename: filename of the addon
- @dst: destination directory
- @iso_mount: location of the iso mount
- @ignore_errors: don't report missing files
- """
- file_location = search_file(filename, iso_mount)
- if file_location is None:
- if not ignore_errors:
- logging.warn("Warning: %s not found (that's fine if you don't need it)", filename)
- else:
- exec_rsync(file_location, dst)
-
-
def copy_addons(iso_mount, target):
"""copy grml's addons files (like allinoneimg, bsd4grml,..) to a given target
addons = target + '/boot/addons/'
execute(mkdir, addons)
- # grub all-in-one image
- handle_addon_copy('allinone.img', addons, iso_mount)
-
- # bsd image
- handle_addon_copy('bsd4grml', addons, iso_mount)
-
- # DOS image
- handle_addon_copy('balder10.imz', addons, iso_mount)
-
- # syslinux + pci.ids for hdt
- for expr in '*.c32', 'pci.ids':
- glob_and_copy(iso_mount + '/boot/addons/' + expr, addons)
-
- # memdisk image
- handle_addon_copy('memdisk', addons, iso_mount)
-
- # memtest86+ image
- handle_addon_copy('memtest', addons, iso_mount)
-
- # gpxe.lkrn: got replaced by ipxe
- handle_addon_copy('gpxe.lkrn', addons, iso_mount, ignore_errors=True)
-
- # ipxe.lkrn
- handle_addon_copy('ipxe.lkrn', addons, iso_mount)
-
- # netboot.xyz
- handle_addon_copy('netboot.xyz.lkrn', addons, iso_mount)
+ for addon_file in glob.glob(iso_mount + '/boot/addons/*'):
+ filename = os.path.basename(addon_file)
+ src_file = iso_mount + "/boot/addons/" + os.path.basename(addon_file)
+ logging.debug("Copying addon file %s" % filename)
+ exec_rsync(src_file, addons)
def build_loopbackcfg(target):
'prompt.cfg', 'vesamenu.cfg', 'grml.png', '*.c32':
glob_and_copy(iso_mount + source_dir + expr, syslinux_target)
- for filename in glob.glob1(syslinux_target, "*.c32"):
- copy_if_exist(os.path.join(SYSLINUX_LIBS, filename), syslinux_target)
+ for modules_dir in options.syslinuxlibs + SYSLINUX_LIBS:
+ if os.path.isdir(modules_dir):
+ for filename in glob.glob1(syslinux_target, "*.c32"):
+ copy_if_exist(os.path.join(modules_dir, filename), syslinux_target)
+ break
# copy the addons_*.cfg file to the new syslinux directory
glob_and_copy(iso_mount + source_dir + 'addon*.cfg', syslinux_target)
grub_target = target + '/boot/grub/'
secureboot_target = target + '/EFI/ubuntu/'
- bootid_re = re.compile("bootid=[\w_-]+")
- live_media_path_re = re.compile("live-media-path=[\w_/-]+")
+ bootid_re = re.compile(r'bootid=[\w_-]+')
+ live_media_path_re = re.compile(r'live-media-path=[\w_/-]+')
bootopt = get_bootoptions(grml_flavour)
@entry: data to write to the file
"""
data = open(filename, "a+")
+ data.seek(0)
for line in data:
if line == entry:
break
@flavour: grml flavour
"""
- append_re = re.compile("^(\s*append.*/boot/.*)$", re.I)
+ append_re = re.compile(r'^(\s*append.*/boot/.*)$', re.I)
# flavour_re = re.compile("(label.*)(grml\w+)")
- default_re = re.compile("(default.cfg)")
- bootid_re = re.compile("bootid=[\w_-]+")
- live_media_path_re = re.compile("live-media-path=[\w_/-]+")
+ default_re = re.compile(r'(default.cfg)')
+ bootid_re = re.compile(r'bootid=[\w_-]+')
+ live_media_path_re = re.compile(r'live-media-path=[\w_/-]+')
bootopt = get_bootoptions(flavour)
"""Adjust the specified labels in the syslinux config file src with
specified replacement
"""
- label_re = re.compile("^(\s*label\s*) ([a-zA-Z0-9_-]+)", re.I)
+ label_re = re.compile(r'^(\s*label\s*) ([a-zA-Z0-9_-]+)', re.I)
for line in fileinput.input(src, inplace=1):
line = label_re.sub(replacement, line)
sys.stdout.write(line)
@filename: syslinux config file
"""
- default_re = re.compile("^(\s*menu\s*default\s*)$", re.I)
+ default_re = re.compile(r'^(\s*menu\s*default\s*)$', re.I)
for line in fileinput.input(filename, inplace=1):
if default_re.match(line):
continue
if remove_image_mountpoint:
try:
remove_mountpoint(iso_mountpoint)
- except CriticalException as error:
+ except CriticalException:
cleanup()
raise
set_rw(device)
mount(device, device_mountpoint, ['-o', 'utf8,iocharset=iso8859-1'])
- except CriticalException as error:
+ except CriticalException:
mount(device, device_mountpoint, "")
try:
grml_flavours = identify_grml_flavour(mountpoint)
if os.path.isdir(mountpoint):
os.rmdir(mountpoint)
unregister_tmpfile(mountpoint)
- except CriticalException as error:
+ except CriticalException:
cleanup()
raise
mbrcode = mbrpath
break
- if mbrcode is "":
+ if not mbrcode:
str_locations = " or ".join(['"%s"' % l for l in mbr_locations])
logging.error('Cannot find syslinux MBR, install it at %s)',
str_locations)
global GRUB_INSTALL
GRUB_INSTALL = which("grub-install") or which("grub2-install")
if not GRUB_INSTALL:
- logging.critical("Fatal: grub-install not available (please install the " +
+ logging.critical("Fatal: grub-install not available (please install the "
"grub package or drop the --grub option)")
sys.exit(1)
if options.syslinux:
if not which("syslinux"):
- logging.critical("Fatal: syslinux not available (please install the " +
+ logging.critical("Fatal: syslinux not available (please install the "
"syslinux package or use the --grub option)")
sys.exit(1)