From ffa25dd609b0c7ad522359ee14ca3e751ebf900a Mon Sep 17 00:00:00 2001 From: Chris Lumens Date: Wed, 27 May 2015 13:48:11 -0400 Subject: [PATCH] Move IsoMountpoint into its own module. --- src/pylorax/mount.py | 96 ++++++++++++++++++++++++++++++++++++++ src/sbin/livemedia-creator | 74 +---------------------------- 2 files changed, 98 insertions(+), 72 deletions(-) create mode 100644 src/pylorax/mount.py diff --git a/src/pylorax/mount.py b/src/pylorax/mount.py new file mode 100644 index 00000000..901ae3ed --- /dev/null +++ b/src/pylorax/mount.py @@ -0,0 +1,96 @@ +# mount.py +# +# Copyright (C) 2011-2015 Red Hat, Inc. +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . +# +# Author(s): Brian C. Lane +# +import logging +log = logging.getLogger("livemedia-creator") + +import os + +from pylorax.imgutils import mount, umount +from pylorax.executils import execWithCapture + +class IsoMountpoint(object): + """ + Mount the iso and check to make sure the vmlinuz and initrd.img files exist + + Also check the iso for a a stage2 image and set a flag and extract the + iso's label. + + stage2 can be either LiveOS/squashfs.img or images/install.img + """ + def __init__(self, iso_path, initrd_path=None): + """ + Mount the iso + + :param str iso_path: Path to the iso to mount + :param str initrd_path: Optional path to initrd + + initrd_path can be used to point to a tree with a newer + initrd.img than the iso has. The iso is still used for stage2. + + self.kernel and self.initrd point to the kernel and initrd. + self.stage2 is set to True if there is a stage2 image. + self.repo is the path to the mounted iso if there is a /repodata dir. + """ + self.label = None + self.iso_path = iso_path + self.initrd_path = initrd_path + + if not self.initrd_path: + self.mount_dir = mount(self.iso_path, opts="loop") + else: + self.mount_dir = self.initrd_path + + self.kernel = self.mount_dir+"/isolinux/vmlinuz" + self.initrd = self.mount_dir+"/isolinux/initrd.img" + + if os.path.isdir(self.mount_dir+"/repodata"): + self.repo = self.mount_dir + else: + self.repo = None + self.stage2 = os.path.exists(self.mount_dir+"/LiveOS/squashfs.img") or \ + os.path.exists(self.mount_dir+"/images/install.img") + + try: + for f in [self.kernel, self.initrd]: + if not os.path.isfile(f): + raise Exception("Missing file on iso: {0}".format(f)) + except: + self.umount() + raise + + self.get_iso_label() + + def umount( self ): + """Unmount the iso""" + if not self.initrd_path: + umount(self.mount_dir) + + def get_iso_label(self): + """ + Get the iso's label using isoinfo + + Sets self.label if one is found + """ + isoinfo_output = execWithCapture("isoinfo", ["-d", "-i", self.iso_path]) + log.debug(isoinfo_output) + for line in isoinfo_output.splitlines(): + if line.startswith("Volume id: "): + self.label = line[11:] + return diff --git a/src/sbin/livemedia-creator b/src/sbin/livemedia-creator index 83aa5555..26e606dd 100755 --- a/src/sbin/livemedia-creator +++ b/src/sbin/livemedia-creator @@ -51,8 +51,9 @@ from pylorax.imgutils import PartitionMount, mksparse, mkext4img, loop_detach from pylorax.imgutils import get_loop_name, dm_detach, mount, umount, Mount from pylorax.imgutils import mksquashfs, mkqcow2, mktar, mkrootfsimg from pylorax.imgutils import copytree -from pylorax.executils import execWithRedirect, execWithCapture, runcmd +from pylorax.executils import execWithRedirect, runcmd from pylorax.monitor import LogMonitor +from pylorax.mount import IsoMountpoint # no-virt mode doesn't need libvirt, so make it optional try: @@ -71,77 +72,6 @@ class InstallError(Exception): pass -class IsoMountpoint(object): - """ - Mount the iso and check to make sure the vmlinuz and initrd.img files exist - - Also check the iso for a a stage2 image and set a flag and extract the - iso's label. - - stage2 can be either LiveOS/squashfs.img or images/install.img - """ - def __init__(self, iso_path, initrd_path=None): - """ - Mount the iso - - :param str iso_path: Path to the iso to mount - :param str initrd_path: Optional path to initrd - - initrd_path can be used to point to a tree with a newer - initrd.img than the iso has. The iso is still used for stage2. - - self.kernel and self.initrd point to the kernel and initrd. - self.stage2 is set to True if there is a stage2 image. - self.repo is the path to the mounted iso if there is a /repodata dir. - """ - self.label = None - self.iso_path = iso_path - self.initrd_path = initrd_path - - if not self.initrd_path: - self.mount_dir = mount(self.iso_path, opts="loop") - else: - self.mount_dir = self.initrd_path - - self.kernel = self.mount_dir+"/isolinux/vmlinuz" - self.initrd = self.mount_dir+"/isolinux/initrd.img" - - if os.path.isdir(self.mount_dir+"/repodata"): - self.repo = self.mount_dir - else: - self.repo = None - self.stage2 = os.path.exists(self.mount_dir+"/LiveOS/squashfs.img") or \ - os.path.exists(self.mount_dir+"/images/install.img") - - try: - for f in [self.kernel, self.initrd]: - if not os.path.isfile(f): - raise Exception("Missing file on iso: {0}".format(f)) - except: - self.umount() - raise - - self.get_iso_label() - - def umount( self ): - """Unmount the iso""" - if not self.initrd_path: - umount(self.mount_dir) - - def get_iso_label(self): - """ - Get the iso's label using isoinfo - - Sets self.label if one is found - """ - isoinfo_output = execWithCapture("isoinfo", ["-d", "-i", self.iso_path]) - log.debug(isoinfo_output) - for line in isoinfo_output.splitlines(): - if line.startswith("Volume id: "): - self.label = line[11:] - return - - class FakeDNF(object): """ A minimal DNF object suitable for passing to RuntimeBuilder