supermin: Prevent multilib corruption (RHBZ#558593).
authorRichard Jones <rjones@redhat.com>
Tue, 26 Jan 2010 10:45:14 +0000 (10:45 +0000)
committerRichard Jones <rjones@redhat.com>
Wed, 27 Jan 2010 16:22:19 +0000 (16:22 +0000)
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

.gitignore
appliance/libguestfs-supermin-helper [moved from appliance/libguestfs-supermin-helper.in with 65% similarity]
configure.ac
src/guestfs.c

index ee33343..829f807 100644 (file)
@@ -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
similarity index 65%
rename from appliance/libguestfs-supermin-helper.in
rename to appliance/libguestfs-supermin-helper
index ab3aad5..0970776 100755 (executable)
@@ -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"
index 7d71a7d..2edafff 100644 (file)
@@ -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
index a3d2762..1d6d40b 100644 (file)
@@ -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) {