Darryl L. Pierce
2009-Jul-10 13:33 UTC
[Ovirt-devel] [PATCH node] This is a follow-on patch for bz#507455.
It fixes how removable media are detected and removes any device which has no storage space available. Signed-off-by: Darryl L. Pierce <dpierce at redhat.com> --- scripts/ovirt-config-storage | 168 +++++++++++++++++++++++++++++++----------- 1 files changed, 125 insertions(+), 43 deletions(-) diff --git a/scripts/ovirt-config-storage b/scripts/ovirt-config-storage index 5560b5f..f6a30c9 100755 --- a/scripts/ovirt-config-storage +++ b/scripts/ovirt-config-storage @@ -11,6 +11,7 @@ ME=$(basename "$0") warn() { printf '%s: %s\n' "$ME" "$*" >&2; } die() { warn "$*"; exit 1; } +debug() { if $debugging; then printf "[DEBUG] %s\n" "$*"; fi } trap '__st=$?; stop_log; exit $__st' 0 trap 'exit $?' 1 2 13 15 @@ -36,8 +37,12 @@ logging_min_size=5 data_min_size=5 swap_min_size=5 +# Gets the drive's size and sets the supplied variable. +# $1 - the drive +# $2 - the variable get_drive_size() { + debug "get_drive_size: start" local drive=$1 local space_var=$2 @@ -70,11 +75,36 @@ get_drive_size() fi size=$(echo "scale=0; $size / (1024 * 1024)" | bc -l) - echo "$drive ($size MB)" + eval $space_var=$size + + debug "::size=$size" + + debug "get_drive_size: exit" +} + +print_drive_size () +{ + debug "print_drive_size: start" + local drive=$1 + local udi=${2-} + + if [ -z "$udi" ]; then + for this_udi in $(hal-find-by-capability --capability storage); do + if [[ "$(hal-get-property --udi $this_udi --key block.device)" = "$drive" ]]; then + udi=$this_udi + fi + done + fi + get_drive_size $drive SIZE + debug "::drive=$drive" + debug "::SIZE=$SIZE" + echo "$drive ($SIZE MB)" echo "Disk Identifier: $(basename "$udi")" if [ -n "$space_var" ]; then eval $space_var=$size fi + + debug "print_drive_size: end" } check_partition_sizes() @@ -130,73 +160,112 @@ check_partition_sizes() return $rc } -# Find a usable/selected storage device. -# If there are none, give a diagnostic and return nonzero. -# If there is just one, e.g., /dev/sda, treat it as selected (see below). -# and return 0. If there are two or more, make the user select one -# or decline. Upon decline, return nonzero. Otherwise, print the -# selected name, then return 0. -# Sample output: /dev/sda -get_dev_name() +# Ensures the device is acceptable +# $1 - the device +check_if_device_is_good () +{ + debug "check_if_device_is_good: start" + local device=$1 + local result=1 + + # Must start with a '/'. + case $device in + *' '*) + # we use space as separator + warn "block device name '$device' contains space; skipping"; + continue;; + /*) + local SIZE + get_drive_size $device SIZE + debug "::SIZE=$SIZE" + if [ $SIZE -gt 0 ]; then result=0; fi + ;; + *) warn "block device name $device doesn't start with '/';" \ + " skipping"; continue;; + esac + + debug "check_if_device_is_good: end (result=$result)" + return $result +} + +get_drive_list () { + debug "get_drive_list: start" + local list_var=$1 + local udi_list=$(hal-find-by-capability --capability storage) + debug "list_var=$list_var" + if test -z "$udi_list"; then warn "ERROR: no usable storage devices detected" return 1 fi local d devices sizes + for d in $udi_list; do + debug "Examining $d" local drive_type=$(hal-get-property --udi "$d" --key storage.drive_type) + debug "::drive_type=$drive_type" test "X$drive_type" = Xdisk || continue local block_dev=$(hal-get-property --udi "$d" --key block.device) - # Must start with a '/'. - case $block_dev in - *' '*) - # we use space as separator - warn "block device name '$block_dev' contains space; skipping"; - continue;; - /*) ;; - *) warn "block device name $block_dev doesn't start with '/';" \ - " skipping"; continue;; - esac - test -z "$devices" \ - && devices="$block_dev" \ - || devices="$devices $block_dev" + debug "::block_dev=$block_dev" + check_if_device_is_good $block_dev + rc=$? + if [ $rc = 0 ]; then + debug "::Acceptable device: $block_dev" + test -z "$devices" \ + && devices="$block_dev" \ + || devices="$devices $block_dev" + fi done # FIXME: workaround for detecting virtio block devices devices="$devices $(ls /dev/vd? 2> /dev/null | xargs)" devices=$(echo $devices | tr ' ' '\n' | sort -u | xargs) - local num_devices=$(echo "$devices" | wc -w) - # If there's only one device, use it. - case $num_devices in - 0) warn "ERROR: found no usable block device"; return 1;; - 1) echo "$devices"; return 0;; - *) ;; # found more than one + if [ -n "$devices" ]; then + eval $list_var='"$devices"' + fi + + debug "get_drive_list: end" +} + +select_a_drive () +{ + local DRIVE_VAR=$1 + local choices + + get_drive_list choices + case $(echo "$choices" | wc -w) in + 0) die "ERROR: there are no usable block devices" ;; + 1) echo "$choices"; return 0;; + *) ;; # continue to selection esac - # There are two or more; make the user choose. - # display description for each disk - for d in $devices; do - get_drive_size $d >&2 + for choice in $choices; do + print_drive_size $choice done - local choices="$devices Abort" - select device in $choices - do - test "$device" = Abort && return 1 - test -z "$device" && continue - echo "$device" - return 0 + + while true; do + select device in $choices Abort + do + case $device in + "Abort") return 1;; + *) eval $DRIVE_VAR=$device; return 0;; + esac + done done } do_configure() { local name_and_size - DRIVE=$(get_dev_name) || return 0 - get_drive_size $DRIVE SPACE + select_a_drive DRIVE + debug "DRIVE=$DRIVE" + test -z "$DRIVE" && return 0 + + print_drive_size $DRIVE SPACE printf "\n\nPlease configure storage partitions.\n\n" printf "* Enter partition sizes in MB.\n" @@ -286,7 +355,7 @@ do_review() The local disk will be repartitioned as follows: ===============================================- Physical Hard Disk: $(get_drive_size $DRIVE) + Physical Hard Disk: $(print_drive_size $DRIVE) Boot partition size: $BOOT_SIZE MB Swap partition size: $SWAP_SIZE MB Installation partition size: $ROOT_SIZE * 2 MB @@ -519,7 +588,7 @@ DATA_SIZE=${OVIRT_VOL_DATA_SIZE:-$default_data_size} if [ -n "$OVIRT_INIT" ]; then # if present, use the drive selected with 'ovirt_init' boot parameter DRIVE=$OVIRT_INIT - get_drive_size $DRIVE SPACE + print_drive_size $DRIVE SPACE fi # if the node is Fedora then use GPT, otherwise use MBR @@ -548,6 +617,19 @@ if [ "$1" == "AUTO" ]; then log "Missing device parameter: unable to partition any disk" fi else + # check commandline options + debugging=false + + while getopts dv c; do + case $c in + d) debugging=true;; + v) set -v;; + '?') die "invalid option \`-$OPTARG'";; + :) die "missing argument to \`-$OPTARG' option";; + *) die "internal error";; + esac + done + OPTIONS="\"Configure\" \"Review\" \"Commit Changes And Quit\" \"Return To Menu\"" eval set $OPTIONS PS3="Choose an option: " -- 1.6.2.5