summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCole Robinson <crobinso@redhat.com>2016-06-16 17:22:35 -0400
committerCole Robinson <crobinso@redhat.com>2016-06-17 07:52:42 -0400
commitdbb057d09537a5a475bf9040c642cfa4ea3edc56 (patch)
tree83ae0abdff1e9fd843a1f4e6dd50f3b214ea020d
parent9f297eda5b5e7bc941a14f72d5a40284572fc6af (diff)
downloadvirt-manager-dbb057d09537a5a475bf9040c642cfa4ea3edc56.tar.gz
virtinst: Move initrdinject handling to its own file
-rwxr-xr-xtests/test_inject.py4
-rw-r--r--virtinst/distroinstaller.py113
-rw-r--r--virtinst/initrdinject.py126
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)