diff options
author | Cole Robinson <crobinso@redhat.com> | 2016-06-16 17:22:35 -0400 |
---|---|---|
committer | Cole Robinson <crobinso@redhat.com> | 2016-06-17 07:52:42 -0400 |
commit | dbb057d09537a5a475bf9040c642cfa4ea3edc56 (patch) | |
tree | 83ae0abdff1e9fd843a1f4e6dd50f3b214ea020d | |
parent | 9f297eda5b5e7bc941a14f72d5a40284572fc6af (diff) | |
download | virt-manager-dbb057d09537a5a475bf9040c642cfa4ea3edc56.tar.gz |
virtinst: Move initrdinject handling to its own file
-rwxr-xr-x | tests/test_inject.py | 4 | ||||
-rw-r--r-- | virtinst/distroinstaller.py | 113 | ||||
-rw-r--r-- | virtinst/initrdinject.py | 126 |
3 files changed, 132 insertions, 111 deletions
diff --git a/tests/test_inject.py b/tests/test_inject.py index d1a1d6b0..508a8240 100755 --- a/tests/test_inject.py +++ b/tests/test_inject.py @@ -12,7 +12,7 @@ from tests import utils from virtinst import Guest from virtinst import urlfetcher from virtinst import util -from virtinst.distroinstaller import _perform_initrd_injections +from virtinst.initrdinject import perform_initrd_injections cleanup = [] _alldistros = {} @@ -120,7 +120,7 @@ def _test_distro(distro): os.system("cp -f %s %s" % (originitrd, newinitrd)) cleanup.append(newinitrd) - _perform_initrd_injections(newinitrd, [injectfile], ".") + perform_initrd_injections(newinitrd, [injectfile], ".") nic = distro.virtio and "virtio" or "rtl8139" append = "-append \"ks=file:/%s\"" % os.path.basename(injectfile) diff --git a/virtinst/distroinstaller.py b/virtinst/distroinstaller.py index d35ac153..96dcd76a 100644 --- a/virtinst/distroinstaller.py +++ b/virtinst/distroinstaller.py @@ -19,13 +19,11 @@ import logging import os -import shutil -import subprocess -import tempfile from . import urlfetcher from . import util from .devicedisk import VirtualDisk +from .initrdinject import perform_initrd_injections from .installer import Installer from .osdict import OSDB from .storage import StoragePool, StorageVolume @@ -152,109 +150,6 @@ def _upload_file(conn, meter, destpool, src): return vol -def _rhel4_initrd_inject(initrd, injections): - try: - file_proc = subprocess.Popen(["file", "-z", initrd], - stdout=subprocess.PIPE, - stderr=subprocess.PIPE) - if "ext2 filesystem" not in file_proc.communicate()[0]: - return False - except: - logging.exception("Failed to file command for rhel4 initrd detection") - return False - - logging.debug("Is RHEL4 initrd") - - # Uncompress the initrd - newinitrd = file(initrd + ".new", "wb") - gzip_proc = subprocess.Popen(["gzip", "-d", "-f", "-c", initrd], - stdout=newinitrd, - stderr=subprocess.PIPE) - gzip_proc.wait() - newinitrd.close() - - debugfserr = "" - for filename in injections: - # We have an ext2 filesystem, use debugfs to inject files - cmd = ["debugfs", "-w", "-R", - "write %s %s" % (filename, os.path.basename(filename)), - newinitrd.name] - logging.debug("Copying %s to the initrd with cmd=%s", filename, cmd) - - debugfs_proc = subprocess.Popen(cmd, - stdout=subprocess.PIPE, - stderr=subprocess.PIPE) - debugfs_proc.wait() - debugfserr += debugfs_proc.stderr.read() or "" - - gziperr = gzip_proc.stderr.read() - if gziperr: - logging.debug("gzip stderr=%s", gziperr) - if debugfserr: - logging.debug("debugfs stderr=%s", debugfserr) - - # Recompress the initrd - gzip_proc = subprocess.Popen(["gzip"], - stdin=file(newinitrd.name, "rb"), - stdout=file(initrd, "wb"), - stderr=subprocess.PIPE) - gzip_proc.wait() - gziperr = gzip_proc.stderr.read() - if gziperr: - logging.debug("gzip stderr=%s", gziperr) - os.unlink(newinitrd.name) - - return True - - -def _perform_initrd_injections(initrd, injections, scratchdir): - """ - Insert files into the root directory of the initial ram disk - """ - if not injections: - return - - if _rhel4_initrd_inject(initrd, injections): - return - - tempdir = tempfile.mkdtemp(dir=scratchdir) - os.chmod(tempdir, 0775) - - for filename in injections: - logging.debug("Copying %s to the initrd.", filename) - shutil.copy(filename, tempdir) - - logging.debug("Appending to the initrd.") - find_proc = subprocess.Popen(['find', '.', '-print0'], - stdout=subprocess.PIPE, - stderr=subprocess.PIPE, - cwd=tempdir) - cpio_proc = subprocess.Popen(['cpio', '-o', '--null', '-Hnewc', '--quiet'], - stdin=find_proc.stdout, - stdout=subprocess.PIPE, - stderr=subprocess.PIPE, - cwd=tempdir) - f = open(initrd, 'ab') - gzip_proc = subprocess.Popen(['gzip'], stdin=cpio_proc.stdout, - stdout=f, stderr=subprocess.PIPE) - cpio_proc.wait() - find_proc.wait() - gzip_proc.wait() - f.close() - shutil.rmtree(tempdir) - - finderr = find_proc.stderr.read() - cpioerr = cpio_proc.stderr.read() - gziperr = gzip_proc.stderr.read() - if finderr: - logging.debug("find stderr=%s", finderr) - if cpioerr: - logging.debug("cpio stderr=%s", cpioerr) - if gziperr: - logging.debug("gzip stderr=%s", gziperr) - - - def _upload_media(conn, scratchdir, system_scratchdir, meter, kernel, initrd): """ @@ -359,9 +254,9 @@ class DistroInstaller(Installer): if initrd: self._tmpfiles.append(initrd) - _perform_initrd_injections(initrd, - self.initrd_injections, - fetcher.scratchdir) + perform_initrd_injections(initrd, + self.initrd_injections, + fetcher.scratchdir) kernel, initrd, tmpvols = _upload_media( guest.conn, fetcher.scratchdir, diff --git a/virtinst/initrdinject.py b/virtinst/initrdinject.py new file mode 100644 index 00000000..eb5f4196 --- /dev/null +++ b/virtinst/initrdinject.py @@ -0,0 +1,126 @@ +# +# Copyright 2006-2009, 2013, 2014 Red Hat, Inc. +# Daniel P. Berrange <berrange@redhat.com> +# +# 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, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, +# MA 02110-1301 USA. + +import logging +import os +import shutil +import subprocess +import tempfile + + +def _rhel4_initrd_inject(initrd, injections): + try: + file_proc = subprocess.Popen(["file", "-z", initrd], + stdout=subprocess.PIPE, + stderr=subprocess.PIPE) + if "ext2 filesystem" not in file_proc.communicate()[0]: + return False + except: + logging.exception("Failed to file command for rhel4 initrd detection") + return False + + logging.debug("Is RHEL4 initrd") + + # Uncompress the initrd + newinitrd = file(initrd + ".new", "wb") + gzip_proc = subprocess.Popen(["gzip", "-d", "-f", "-c", initrd], + stdout=newinitrd, + stderr=subprocess.PIPE) + gzip_proc.wait() + newinitrd.close() + + debugfserr = "" + for filename in injections: + # We have an ext2 filesystem, use debugfs to inject files + cmd = ["debugfs", "-w", "-R", + "write %s %s" % (filename, os.path.basename(filename)), + newinitrd.name] + logging.debug("Copying %s to the initrd with cmd=%s", filename, cmd) + + debugfs_proc = subprocess.Popen(cmd, + stdout=subprocess.PIPE, + stderr=subprocess.PIPE) + debugfs_proc.wait() + debugfserr += debugfs_proc.stderr.read() or "" + + gziperr = gzip_proc.stderr.read() + if gziperr: + logging.debug("gzip stderr=%s", gziperr) + if debugfserr: + logging.debug("debugfs stderr=%s", debugfserr) + + # Recompress the initrd + gzip_proc = subprocess.Popen(["gzip"], + stdin=file(newinitrd.name, "rb"), + stdout=file(initrd, "wb"), + stderr=subprocess.PIPE) + gzip_proc.wait() + gziperr = gzip_proc.stderr.read() + if gziperr: + logging.debug("gzip stderr=%s", gziperr) + os.unlink(newinitrd.name) + + return True + + +def perform_initrd_injections(initrd, injections, scratchdir): + """ + Insert files into the root directory of the initial ram disk + """ + if not injections: + return + + if _rhel4_initrd_inject(initrd, injections): + return + + tempdir = tempfile.mkdtemp(dir=scratchdir) + os.chmod(tempdir, 0775) + + for filename in injections: + logging.debug("Copying %s to the initrd.", filename) + shutil.copy(filename, tempdir) + + logging.debug("Appending to the initrd.") + find_proc = subprocess.Popen(['find', '.', '-print0'], + stdout=subprocess.PIPE, + stderr=subprocess.PIPE, + cwd=tempdir) + cpio_proc = subprocess.Popen(['cpio', '-o', '--null', '-Hnewc', '--quiet'], + stdin=find_proc.stdout, + stdout=subprocess.PIPE, + stderr=subprocess.PIPE, + cwd=tempdir) + f = open(initrd, 'ab') + gzip_proc = subprocess.Popen(['gzip'], stdin=cpio_proc.stdout, + stdout=f, stderr=subprocess.PIPE) + cpio_proc.wait() + find_proc.wait() + gzip_proc.wait() + f.close() + shutil.rmtree(tempdir) + + finderr = find_proc.stderr.read() + cpioerr = cpio_proc.stderr.read() + gziperr = gzip_proc.stderr.read() + if finderr: + logging.debug("find stderr=%s", finderr) + if cpioerr: + logging.debug("cpio stderr=%s", cpioerr) + if gziperr: + logging.debug("gzip stderr=%s", gziperr) |