summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRichard Jones <rjones@redhat.com>2010-01-26 10:45:14 +0000
committerRichard Jones <rjones@redhat.com>2010-01-27 16:22:19 +0000
commit214babb060d9e85e72bad4633310a9b4a5fcb9dd (patch)
tree40a0f470ea9708aaa2cb8386c15221aeda2b01bf
parent7de6391695120cb1cfc3b77a497d6cf235a453a7 (diff)
downloadlibguestfs-214babb060d9e85e72bad4633310a9b4a5fcb9dd.tar.gz
libguestfs-214babb060d9e85e72bad4633310a9b4a5fcb9dd.tar.xz
libguestfs-214babb060d9e85e72bad4633310a9b4a5fcb9dd.zip
supermin: Prevent multilib corruption (RHBZ#558593).
On some combination of installing, upgrading and removing the base libguestfs package on x86_64, multilib can corrupt libguestfs by leaving a copy of /usr/bin/libguestfs-supermin-helper around which references the wrong architecture (usually, contains links to the i386-based appliance, when the x86_64 appliance should be constructed). This commit changes libguestfs-supermin-helper so that the script is the same on all architectures. Instead, the library passes the differences to the script (eg. $host_cpu). Because the i386 and x86_64 libraries should be at different locations (/usr/lib vs /usr/lib64) this should prevent multilib from screwing things up. Related links: https://bugzilla.redhat.com/show_bug.cgi?id=558593 http://rwmj.wordpress.com/2009/11/16/please-someone-shoot-multilib/#content https://bugzilla.redhat.com/show_bug.cgi?id=235752
-rw-r--r--.gitignore1
-rwxr-xr-xappliance/libguestfs-supermin-helper (renamed from appliance/libguestfs-supermin-helper.in)44
-rw-r--r--configure.ac2
-rw-r--r--src/guestfs.c6
4 files changed, 40 insertions, 13 deletions
diff --git a/.gitignore b/.gitignore
index ee33343b..829f8072 100644
--- a/.gitignore
+++ b/.gitignore
@@ -11,7 +11,6 @@ appliance/debian/debirf.conf
appliance/initramfs.*.img
appliance/initramfs.*.supermin.hostfiles
appliance/kmod.whitelist
-appliance/libguestfs-supermin-helper
appliance/make.sh
appliance/packagelist
appliance/stamp-debirf-modules
diff --git a/appliance/libguestfs-supermin-helper.in b/appliance/libguestfs-supermin-helper
index ab3aad53..0970776b 100755
--- a/appliance/libguestfs-supermin-helper.in
+++ b/appliance/libguestfs-supermin-helper
@@ -1,6 +1,5 @@
#!/bin/bash -
-# @configure_input@
-# Copyright (C) 2009 Red Hat Inc.
+# Copyright (C) 2009-2010 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
@@ -22,12 +21,41 @@ unset CDPATH
set -e
+if [ $# -ne 5 ]; then
+ p=`basename $0`
+ echo
+ echo "$p: Create supermin appliance."
+ echo
+ echo "Usage:"
+ echo "$p sourcedir host_cpu repo kernel initrd"
+ echo
+ echo "This script is used by libguestfs to build the supermin appliance"
+ echo "(kernel and initrd output files). You should NOT need to run this"
+ echo "program directly except if you are debugging tricky supermin"
+ echo "appliance problems."
+ echo
+ echo "NB: The kernel and initrd parameters are OUTPUT parameters. If"
+ echo "those files exist, they are overwritten by the output."
+ echo
+ echo "Typical usage when debugging supermin appliance problems:"
+ echo " $p /usr/lib64/guestfs x86_64 fedora-12 /tmp/kernel /tmp/initrd"
+ echo "Note: This will OVERWRITE any existing files called /tmp/kernel"
+ echo "and /tmp/initrd."
+ echo
+ exit 1
+fi
+
# Source directory containing the supermin input files.
sourcedir=$(cd "$1" > /dev/null; pwd)
+# Host CPU and repo constants passed from the library (see:
+# https://bugzilla.redhat.com/show_bug.cgi?id=558593).
+host_cpu=$2
+repo=$3
+
# Output files.
-kernel="$2"
-initrd="$3"
+kernel="$4"
+initrd="$5"
# Kernel:
# Look for the most recent kernel named vmlinuz-*.<arch>* which has a
@@ -37,7 +65,7 @@ initrd="$3"
# RHEL 5 didn't append the arch to the kernel name, so look for kernels
# without arch second.
-arch=$(echo "@host_cpu@" | sed 's/^i.86$/i?86/')
+arch=$(echo $host_cpu | sed 's/^i.86$/i?86/')
kernels=$(
ls -1dvr /boot/vmlinuz-*.$arch* 2>/dev/null | grep -v xen ||: ;
ls -1dvr /boot/vmlinuz-* 2>/dev/null | grep -v xen
@@ -66,14 +94,14 @@ fi
# The initrd consists of these components:
# (1) The base skeleton appliance that we constructed at build time.
-# name = initramfs.@REPO@.@host_cpu@.supermin.img
+# name = initramfs.$repo.$host_cpu.supermin.img
# format = compressed cpio
# (2) The modules from modpath which are on the module whitelist.
# format = plain cpio
# (3) The host files which match wildcards in *.supermin.hostfiles.
# format = plain cpio
-cp "$sourcedir"/initramfs.@REPO@.@host_cpu@.supermin.img "$initrd"
+cp "$sourcedir"/initramfs.$repo.$host_cpu.supermin.img "$initrd"
# Kernel modules (2).
exec 5<"$sourcedir"/kmod.whitelist
@@ -90,6 +118,6 @@ find "$modpath" \( -not -name '*.ko' $whitelist \) -a -print0 |
(cd / && \
ls -1df $(
- cat "$sourcedir"/initramfs.@REPO@.@host_cpu@.supermin.hostfiles
+ cat "$sourcedir"/initramfs.$repo.$host_cpu.supermin.hostfiles
) 2>/dev/null |
cpio -C 65536 --quiet -o -H newc ) >> "$initrd"
diff --git a/configure.ac b/configure.ac
index 7d71a7da..2edafff6 100644
--- a/configure.ac
+++ b/configure.ac
@@ -717,8 +717,6 @@ AC_CONFIG_FILES([appliance/supermin-split.sh],
[chmod +x appliance/supermin-split.sh])
AC_CONFIG_FILES([appliance/supermin-make.sh],
[chmod +x appliance/supermin-make.sh])
-AC_CONFIG_FILES([appliance/libguestfs-supermin-helper],
- [chmod +x appliance/libguestfs-supermin-helper])
AC_CONFIG_FILES([Makefile
src/Makefile fish/Makefile po/Makefile.in examples/Makefile
appliance/Makefile
diff --git a/src/guestfs.c b/src/guestfs.c
index a3d27620..1d6d40bf 100644
--- a/src/guestfs.c
+++ b/src/guestfs.c
@@ -1,5 +1,5 @@
/* libguestfs
- * Copyright (C) 2009 Red Hat Inc.
+ * Copyright (C) 2009-2010 Red Hat Inc.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -1506,9 +1506,11 @@ build_supermin_appliance (guestfs_h *g, const char *path,
snprintf (cmd, sizeof cmd,
"PATH='%s':$PATH "
- "libguestfs-supermin-helper '%s' %s %s",
+ "libguestfs-supermin-helper '%s' " host_cpu " " REPO " %s %s",
path,
path, *kernel, *initrd);
+ if (g->verbose)
+ print_timestamped_message (g, "%s", cmd);
r = system (cmd);
if (r == -1 || WEXITSTATUS(r) != 0) {