From: Iustin Pop Date: Wed, 18 Feb 2009 11:15:13 +0000 (+0000) Subject: Rework the blockdev handling X-Git-Tag: v0.7~2 X-Git-Url: http://git.equinoxoli.org/?p=ext%2Finstance-debootstrap.git;a=commitdiff_plain;h=eb23d042c2e63e26d9b69edbd137494778cf40e5 Rework the blockdev handling This (big) patch changes the block device handling to be the same in all the commands. The create script is no longer generated, but instead common.sh is. The patch also comments out the PARTITION_STYLE entry in defaults, otherwise we'll always use that. Reviewed-by: ultrotter,imsnah --- diff --git a/.gitignore b/.gitignore index ee576da..86141c4 100644 --- a/.gitignore +++ b/.gitignore @@ -10,7 +10,7 @@ /configure # built scripts -/create +/common.sh # archives /ganeti-instance-debootstrap-*.tar.gz diff --git a/Makefile.am b/Makefile.am index 36b278f..de9dcf9 100644 --- a/Makefile.am +++ b/Makefile.am @@ -2,20 +2,20 @@ osname=$(subst ganeti-instance-,,$(PACKAGE)) osdir=$(OS_DIR)/$(osname) -os_SCRIPTS = create -dist_os_SCRIPTS = import export rename -dist_os_DATA = ganeti_api_version common.sh +dist_os_SCRIPTS = create import export rename +dist_os_DATA = ganeti_api_version +os_DATA = common.sh dist_doc_DATA = COPYING NEWS README -EXTRA_DIST = create.in defaults +EXTRA_DIST = common.sh.in defaults do_subst = sed \ -e 's,[@]sysconfdir[@],$(sysconfdir),g' \ -e 's,[@]localstatedir[@],$(localstatedir),g' -create: create.in Makefile +common.sh: common.sh.in Makefile $(do_subst) < $< > $@ chmod +x $@ -CLEANFILES = create +CLEANFILES = common.sh diff --git a/common.sh b/common.sh deleted file mode 100644 index 78787d6..0000000 --- a/common.sh +++ /dev/null @@ -1,92 +0,0 @@ - -log_error() { - echo "$@" >&2 -} - -SCRIPT_NAME=$(basename $0) - -for dir in /lib/udev /sbin; do - if [ -f $dir/vol_id -a -x $dir/vol_id ]; then - VOL_ID=$dir/vol_id - fi -done - -if [ -z "$VOL_ID" ]; then - log_error "vol_id not found, please install udev" - exit 1 -fi - -get_api5_arguments() { - GETOPT_RESULT=$* - # Note the quotes around `$TEMP': they are essential! - eval set -- "$GETOPT_RESULT" - while true; do - case "$1" in - -i|-n) instance=$2; shift 2;; - - -o) old_name=$2; shift 2;; - - -b) blockdev=$2; shift 2;; - - -s) swapdev=$2; shift 2;; - - --) shift; break;; - - *) log_error "Internal error!" >&2; exit 1;; - esac - done - if [ -z "$instance" -o -z "$blockdev" ]; then - log_error "Missing OS API Argument (-i, -n, or -b)" - exit 1 - fi - if [ "$SCRIPT_NAME" != "export" -a -z "$swapdev" ]; then - log_error "Missing OS API Argument -s (swapdev)" - exit 1 - fi - if [ "$SCRIPT_NAME" = "rename" -a -z "$old_name" ]; then - log_error "Missing OS API Argument -o (old_name)" - exit 1 - fi -} - -get_api10_arguments() { - if [ -z "$INSTANCE_NAME" -o -z "$HYPERVISOR" -o -z "$DISK_COUNT" ]; then - log_error "Missing OS API Variable:" - log_error "(INSTANCE_NAME HYPERVISOR or DISK_COUNT)" - exit 1 - fi - instance=$INSTANCE_NAME - if [ $DISK_COUNT -lt 1 -o -z "$DISK_0_PATH" ]; then - log_error "At least one disk is needed" - exit 1 - fi - if [ "$SCRIPT_NAME" = "export" ]; then - if [ -z "$EXPORT_DEVICE" ]; then - log_error "Missing OS API Variable EXPORT_DEVICE" - fi - blockdev=$EXPORT_DEVICE - elif [ "$SCRIPT_NAME" = "import" ]; then - if [ -z "$IMPORT_DEVICE" ]; then - log_error "Missing OS API Variable IMPORT_DEVICE" - fi - blockdev=$IMPORT_DEVICE - else - blockdev=$DISK_0_PATH - fi - if [ "$SCRIPT_NAME" = "rename" -a -z "$OLD_INSTANCE_NAME" ]; then - log_error "Missing OS API Variable OLD_INSTANCE_NAME" - fi - old_name=$OLD_INSTANCE_NAME -} - -if [ -z "$OS_API_VERSION" -o "$OS_API_VERSION" = "5" ]; then - OS_API_VERSION=5 - GETOPT_RESULT=`getopt -o o:n:i:b:s: -n '$0' -- "$@"` - if [ $? != 0 ] ; then log_error "Terminating..."; exit 1 ; fi - get_api5_arguments $GETOPT_RESULT -elif [ "$OS_API_VERSION" = "10" ]; then - get_api10_arguments -else - log_error "Unknown OS API VERSION $OS_API_VERSION" - exit 1 -fi diff --git a/common.sh.in b/common.sh.in new file mode 100644 index 0000000..d0a7593 --- /dev/null +++ b/common.sh.in @@ -0,0 +1,172 @@ +# + +# Copyright (C) 2007, 2008, 2009 Google 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 +# 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. + + +log_error() { + echo "$@" >&2 +} + +get_api5_arguments() { + GETOPT_RESULT=$* + # Note the quotes around `$TEMP': they are essential! + eval set -- "$GETOPT_RESULT" + while true; do + case "$1" in + -i|-n) instance=$2; shift 2;; + + -o) old_name=$2; shift 2;; + + -b) blockdev=$2; shift 2;; + + -s) swapdev=$2; shift 2;; + + --) shift; break;; + + *) log_error "Internal error!" >&2; exit 1;; + esac + done + if [ -z "$instance" -o -z "$blockdev" ]; then + log_error "Missing OS API Argument (-i, -n, or -b)" + exit 1 + fi + if [ "$SCRIPT_NAME" != "export" -a -z "$swapdev" ]; then + log_error "Missing OS API Argument -s (swapdev)" + exit 1 + fi + if [ "$SCRIPT_NAME" = "rename" -a -z "$old_name" ]; then + log_error "Missing OS API Argument -o (old_name)" + exit 1 + fi +} + +get_api10_arguments() { + if [ -z "$INSTANCE_NAME" -o -z "$HYPERVISOR" -o -z "$DISK_COUNT" ]; then + log_error "Missing OS API Variable:" + log_error "(INSTANCE_NAME HYPERVISOR or DISK_COUNT)" + exit 1 + fi + instance=$INSTANCE_NAME + if [ $DISK_COUNT -lt 1 -o -z "$DISK_0_PATH" ]; then + log_error "At least one disk is needed" + exit 1 + fi + if [ "$SCRIPT_NAME" = "export" ]; then + if [ -z "$EXPORT_DEVICE" ]; then + log_error "Missing OS API Variable EXPORT_DEVICE" + fi + blockdev=$EXPORT_DEVICE + elif [ "$SCRIPT_NAME" = "import" ]; then + if [ -z "$IMPORT_DEVICE" ]; then + log_error "Missing OS API Variable IMPORT_DEVICE" + fi + blockdev=$IMPORT_DEVICE + else + blockdev=$DISK_0_PATH + fi + if [ "$SCRIPT_NAME" = "rename" -a -z "$OLD_INSTANCE_NAME" ]; then + log_error "Missing OS API Variable OLD_INSTANCE_NAME" + fi + old_name=$OLD_INSTANCE_NAME +} + +format_disk0() { + # Create one big partition, and make it bootable + # some versions of sfdisk need manual specification of + # head/sectors for devices such as drbd which don't + # report geometry + sfdisk -H 255 -S 63 --quiet --Linux "$1" < $TMPDIR/etc/fstab.new else cat $TMPDIR/etc/fstab | \ @@ -59,6 +79,8 @@ if [ -e $TMPDIR/etc/fstab ]; then mv $TMPDIR/etc/fstab.new $TMPDIR/etc/fstab fi -umount $TMPDIR -rmdir $TMPDIR +# execute cleanups +cleanup trap - EXIT + +exit 0 diff --git a/rename b/rename index 331e691..a49d2fa 100755 --- a/rename +++ b/rename @@ -1,6 +1,6 @@ #!/bin/bash -# Copyright (C) 2007 Google Inc. +# Copyright (C) 2007, 2008, 2009 Google 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 @@ -21,16 +21,33 @@ set -e . common.sh +CLEANUP=( ) + +trap cleanup EXIT + TMPDIR=`mktemp -d` || exit 1 -trap "umount $TMPDIR; rmdir $TMPDIR" EXIT +CLEANUP+=("rmdir $TMPDIR") -# If it's not a block device try to mount it via loopback device. +# If the target device is not a real block device we'll first losetup it. # This is needed for file disks. -MOUNT_OPTIONS="" if [ ! -b $blockdev ]; then - MOUNT_OPTIONS="$MOUNT_OPTIONS -o loop" + ORIGINAL_BLOCKDEV=$blockdev + blockdev=$(losetup -sf $blockdev) + CLEANUP+=("losetup -d $blockdev") +fi + +if [ "$PARTITION_STYLE" = "none" ]; then + filesystem_dev=$blockdev +elif [ "$PARTITION_STYLE" = "msdos" ]; then + filesystem_dev=$(map_disk0 $blockdev) + CLEANUP+=("unmap_disk0 $blockdev") +else + echo "Unknown partition style $PARTITION_STYLE" + exit 1 fi -mount $MOUNT_OPTIONS $blockdev $TMPDIR + +mount $filesystem_dev $TMPDIR +CLEANUP+=("umount $TMPDIR") HNAME="$TMPDIR/etc/hostname" MNAME="$TMPDIR/etc/mailname" @@ -52,8 +69,8 @@ if [ "`cat $MNAME`" = "$old_name" ]; then echo $instance > $MNAME fi -umount $TMPDIR -rmdir $TMPDIR +# execute cleanups +cleanup trap - EXIT exit 0