virtinst: Move initrdinject handling to its own file

This commit is contained in:
Cole Robinson 2016-06-16 17:22:35 -04:00
parent 9f297eda5b
commit dbb057d095
3 changed files with 132 additions and 111 deletions

View File

@ -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)

View File

@ -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,

126
virtinst/initrdinject.py Normal file
View File

@ -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)