From 092fea186dee158c9b6545e8d1ee69945d998e8d Mon Sep 17 00:00:00 2001 From: Bob Gilligan Date: Mon, 25 Jan 2010 17:10:04 -0800 Subject: Bugfix 5240: Prevent re-installation of same version on running systems Previously, it was possible in some cases to "add" a system image that would over-write the running image. This change fixes that by getting the version string of the running system from the kernel command line instead of the Vyatta version file. This string represents the actual directory name that holds the image, so is more reliable. Also previously, an attempt to "add" a system image that had the same version string as another image installed on the system (but was not the running image) would always succeed. This would completely over-write that image. Because of this destructive behavior, it deserves a confirmation question. This change prompts the user to see if they really want to do that before proceeding. --- scripts/install/install-image-existing | 32 +++++++++++++++++++++++++++----- 1 file changed, 27 insertions(+), 5 deletions(-) (limited to 'scripts/install/install-image-existing') diff --git a/scripts/install/install-image-existing b/scripts/install/install-image-existing index 214fd2c8..b566c1e9 100755 --- a/scripts/install/install-image-existing +++ b/scripts/install/install-image-existing @@ -19,8 +19,14 @@ if [ `whoami` != 'root' ] ; then failure_exit 'This script must be run with root privileges.' fi -CURVER=$(sed -n 's/^Version \+: \+\([^ ]\+\)$/\1/p' \ - ${vyatta_sysconfdir}/version 2>/dev/null) +# On image-installed systems, the image name can be found as the +# directory under "/boot" on the path to the running kernel on the +# boot line. On non-image-installed systems, this yelds the +# name of the kernel image file. +CURVER=`awk '{print $1}' /proc/cmdline` +CURVER=${CURVER#BOOT_IMAGE=/boot/} +CURVER=${CURVER%/vmlinuz*} + if [ -z "$CURVER" ]; then failure_exit 'Cannot find current version.' fi @@ -32,11 +38,11 @@ if [ -z "$NEWVER" ]; then failure_exit 'Cannot find new release version.' fi if [ "$CURVER" == "$NEWVER" ]; then - failure_exit "Cannot install the same release version \"$NEWVER\"." + echo "Image version $NEWVER is the same as the running system." + echo "Cannot install the same release version as the running system." + exit 1 fi -# start the install -echo "Installing \"$NEWVER\" release." # this is the default if current install is union BOOT_DIR=/live/image/boot @@ -47,6 +53,22 @@ elif [ "$CUR_INSTALL" != 'union' ]; then exit 1 fi +if [ -d $BOOT_DIR/$NEWVER ]; then + echo "Version $NEWVER is already installed on this system." + echo "Proceeding with this installation will delete this copy of" + echo "$NEWVER and replace it with a new copy." + echo -n "Do you want to replace it? (Yes/No) [No]: " + resp=$(get_response "No" "Yes No Y N") + if [ "$resp" != 'yes' ] && [ "$resp" != 'y' ]; then + echo "OK. Will not replace $NEWVER" + echo "Exiting..." + exit 1 + fi +fi + +# start the install +echo "Installing \"$NEWVER\" release." + # create the new release directories REL_ROOT=$BOOT_DIR/$NEWVER RW_DIR="$REL_ROOT/live-rw" -- cgit v1.2.3