From: Richard Jones Date: Tue, 26 Jan 2010 10:45:14 +0000 (+0000) Subject: supermin: Prevent multilib corruption (RHBZ#558593). X-Git-Tag: 1.0.82~18 X-Git-Url: http://git.annexia.org/?p=libguestfs.git;a=commitdiff_plain;h=214babb060d9e85e72bad4633310a9b4a5fcb9dd 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 --- diff --git a/.gitignore b/.gitignore index ee33343..829f807 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 similarity index 65% rename from appliance/libguestfs-supermin-helper.in rename to appliance/libguestfs-supermin-helper index ab3aad5..0970776 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-*.* 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 7d71a7d..2edafff 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 a3d2762..1d6d40b 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) {