image_to_usb.sh: disallow --yes/-y without an explicit target (--to)

This should prevent situations where a wrongfully detected target device
(e.g. a hard drive) is being written to without any prompt. With this
change, the semantics of --yes changes to "don't ask me if I'm sure,
just write to the target device in --to". The help line was changed to
reflect this semantics.

Minor changes:

- Replaced die calls with die_notrace.

- Changed the default value for --to into an empty string (why should it
  be /dev/sdX anyway?).

- Fixed an unmount warning message so it's more descriptive (and fits in
  80 columns).

- Check that --install is only used inside the chroot earlier in the
  script.

BUG=None
TEST=Ran the script with different combinations of -y and --to.

Change-Id: I7a4d6eac9697f25d7e1eddb6c34f3c1725a83ef4
Reviewed-on: https://gerrit.chromium.org/gerrit/25404
Reviewed-by: Brian Harring <ferringb@chromium.org>
Commit-Ready: Gilad Arnold <garnold@chromium.org>
Tested-by: Gilad Arnold <garnold@chromium.org>
This commit is contained in:
Gilad Arnold 2012-06-15 12:20:55 -07:00 committed by Gerrit
parent 2443fdd62e
commit 20d65a5c90

View File

@ -26,13 +26,13 @@ get_default_board
DEFINE_string board "${DEFAULT_BOARD}" \
"board for which the image was built"
DEFINE_string from "" \
"directory containing the image, or image full pathname"
DEFINE_string to "/dev/sdX" \
"write to a specific disk or image file"
"directory containing the image, or image full pathname (empty: latest found)"
DEFINE_string to "" \
"write to a specific disk or image file (empty: auto-detect)"
DEFINE_string to_product "" \
"find target device with product name matching a string (accepts wildcards)"
DEFINE_boolean yes ${FLAGS_FALSE} \
"answer yes to all prompts" \
"don't ask questions, just write to the target device specified by --to" \
y
DEFINE_boolean force_copy ${FLAGS_FALSE} \
"always rebuild test image"
@ -47,7 +47,7 @@ DEFINE_boolean copy_kernel ${FLAGS_FALSE} \
DEFINE_boolean test_image "${FLAGS_FALSE}" \
"copy normal image to ${CHROMEOS_TEST_IMAGE_NAME} and modify it for test"
DEFINE_string image_name "" \
"image base name (auto-select if empty)" \
"image base name (empty: auto-detect)" \
i
DEFINE_boolean install ${FLAGS_FALSE} \
"install to the USB/MMC device"
@ -131,6 +131,11 @@ if [ -z "${FLAGS_board}" ] && [ ${FLAGS_install} -eq ${FLAGS_TRUE} ]; then
exit 1
fi
# Install can only be done from inside the chroot.
if [ ${FLAGS_install} -eq ${FLAGS_TRUE} ] && [ ${INSIDE_CHROOT} -ne 1 ]; then
die_notrace "--install can only be used inside the chroot"
fi
# We have a board name but no image set. Use image at default location
if [ -z "${FLAGS_from}" ]; then
FLAGS_from="$($SCRIPT_ROOT/get_latest_image.sh --board=${FLAGS_board})"
@ -141,7 +146,11 @@ if [ ! -d "${FLAGS_from}" ] ; then
fi
# No target provided, attempt autodetection.
if [ "${FLAGS_to}" == "/dev/sdX" ]; then
if [ -z "${FLAGS_to}" ]; then
if [ ${FLAGS_yes} -eq ${FLAGS_TRUE} ]; then
die_notrace "For your own safety, --yes can only be used with --to"
fi
if [ -z "${FLAGS_to_product}" ]; then
echo "No target device specified, autodetecting..."
else
@ -170,9 +179,9 @@ if [ "${FLAGS_to}" == "/dev/sdX" ]; then
# If no (matching) devices found, quit.
if (( ! ${#disk_string_list[*]} )); then
if [ -z "${FLAGS_to_product}" ]; then
die "No USB/MMC devices could be detected"
die_notrace "No USB/MMC devices could be detected"
else
die "No matching USB/MMC devices could be detected"
die_notrace "No matching USB/MMC devices could be detected"
fi
fi
@ -181,7 +190,7 @@ if [ "${FLAGS_to}" == "/dev/sdX" ]; then
PS3="Select a target device: "
select disk_string in "${disk_string_list[@]}"; do
if [ -z "${disk_string}" ]; then
die "Invalid selection"
die_notrace "Invalid selection"
fi
break
done
@ -272,7 +281,7 @@ else
# Figure out what to do with the resulting list of images.
declare -i num_images=${#image_list[*]}
if (( num_images == 0 )); then
die "No candidate images could be detected"
die_notrace "No candidate images could be detected"
elif (( num_images == 1 )) && [ ${is_got_default} == 1 ]; then
# Found a single image that is the default image, just select it.
image="${image_list[0]}"
@ -282,7 +291,7 @@ else
PS3="Select an image [1]: "
choose image "${image_list[0]}" "ERROR" "${image_list[@]}"
if [ "${image}" == "ERROR" ]; then
die "Invalid selection"
die_notrace "Invalid selection"
fi
fi
@ -315,7 +324,7 @@ if [ -b "${FLAGS_to}" ]; then
fi
fi
# Make sure this is really what the user wants, before nuking the device
# Make sure this is really what the user wants, before nuking the device.
if [ ${FLAGS_yes} -ne ${FLAGS_TRUE} ]; then
warning_str="this will erase all data on ${FLAGS_to}"
if [ -n "${disk_string}" ]; then
@ -332,7 +341,7 @@ if [ -b "${FLAGS_to}" ]; then
echo "Attempting to unmount any mounts on the target device..."
for i in ${mount_list}; do
if sudo umount "$i" 2>&1 >/dev/null | grep "not found"; then
die "Device ${FLAGS_to} needs to be unmounted outside the chroot"
die_notrace "$i needs to be unmounted outside the chroot"
fi
done
sleep 3
@ -343,10 +352,6 @@ if [ -b "${FLAGS_to}" ]; then
sudo dd of="${FLAGS_to}" bs=4M oflag=sync status=noxfer
sync
else
if [ ${INSIDE_CHROOT} -ne 1 ]; then
die "Installation must be done from inside the chroot"
fi
"/build/${FLAGS_board}/usr/sbin/chromeos-install" \
--yes \
--skip_src_removable \
@ -357,7 +362,7 @@ if [ -b "${FLAGS_to}" ]; then
fi
elif [[ "${FLAGS_to}" == /dev/* ]]; then
# Did the user attempt to write to a non-existent block device?
die "Target device ${FLAGS_to} does not exist"
die_notrace "Target device ${FLAGS_to} does not exist"
else
# Output to a file, so just make a copy.
if [ "${SRC_IMAGE}" != "${FLAGS_to}" ]; then