summaryrefslogtreecommitdiff
path: root/scripts/install/install-image
diff options
context:
space:
mode:
Diffstat (limited to 'scripts/install/install-image')
-rwxr-xr-xscripts/install/install-image170
1 files changed, 170 insertions, 0 deletions
diff --git a/scripts/install/install-image b/scripts/install/install-image
new file mode 100755
index 00000000..0bf31a00
--- /dev/null
+++ b/scripts/install/install-image
@@ -0,0 +1,170 @@
+#!/bin/bash
+
+# source in the functions
+source /opt/vyatta/sbin/install-functions
+
+# export INSTALL_LOG for the scripts invoked
+export INSTALL_LOG=/tmp/install-$$.log
+
+# file for get-partition output
+PART_FILE=''
+
+fail_exit ()
+{
+ echo "$*"
+ echo 'Exiting...'
+ exit 1
+}
+
+clean_up ()
+{
+ if [ -n "$PART_FILE" ]; then
+ rm -f $PART_FILE >&/dev/null
+ fi
+ umount $CD_SQUASH_ROOT >&/dev/null || true
+ umount $CD_ROOT >&/dev/null || true
+ umount $INST_ROOT >&/dev/null || true
+ umount $READ_ROOT >&/dev/null || true
+ umount $WRITE_ROOT >&/dev/null || true
+}
+
+sig_handler () {
+ echo "ERROR: Signal received. Exiting..."
+ clean_up
+ echo "Done"
+ trap - EXIT
+ exit 1
+}
+
+exit_handler () {
+ clean_up
+}
+
+# set up the specified ISO image for install
+set_up_new_iso ()
+{
+ if [ ! -f "$NEW_ISO" ] || ! (file $NEW_ISO | grep -q 9660); then
+ fail_exit "\"$NEW_ISO\" is not a valid ISO image file."
+ fi
+
+ # make sure mount points exist
+ mkdir -p $INST_ROOT $WRITE_ROOT $READ_ROOT $CD_ROOT $CD_SQUASH_ROOT
+
+ # mount ISO
+ margs="-o loop,ro $NEW_ISO $CD_ROOT"
+ if ! try_mount "$margs"; then
+ fail_exit 'Failed to mount the new image.'
+ fi
+
+ # check squash image
+ local squash_file=$CD_ROOT/live/filesystem.squashfs
+ if [ ! -f "$squash_file" ] || ! (file $squash_file | grep -q Squashfs) \
+ || ! grep -q '^ii vyatta-version ' $CD_ROOT/live/packages.txt; then
+ fail_exit "\"$NEW_ISO\" is not a Vyatta ISO image file."
+ fi
+
+ # mount squash image
+ margs="-o loop,ro $squash_file $CD_SQUASH_ROOT"
+ if ! try_mount "$margs"; then
+ fail_exit 'Failed to mount the squashfs image.'
+ fi
+}
+
+# install new image into a newly-formatted partition.
+# will exit with error if installation fails.
+install_new ()
+{
+ local root_part=$1
+ local inst_drv=$2
+
+ if [ ! -e "/dev/$root_part" ] || [ ! -e "/dev/$inst_drv" ]; then
+ fail_exit "Invalid drive/partition ($inst_drv and $root_part)."
+ fi
+
+ # install new image
+ if ! /opt/vyatta/sbin/install-image-new "$root_part"; then
+ exit 1
+ fi
+
+ # postinst operations
+ if ! /opt/vyatta/sbin/install-postinst-new \
+ "$inst_drv" "$root_part" union; then
+ exit 1
+ fi
+}
+
+# install new image into the current boot partition.
+# will exit with error if installation fails.
+install_existing ()
+{
+ local ctype=$1
+ if ! /opt/vyatta/sbin/install-image-existing "$ctype"; then
+ exit 1
+ fi
+}
+
+# the image to be installed. only used if installing from an installed,
+# running system.
+NEW_ISO=$1
+
+if [ `whoami` != 'root' ] ; then
+ fail_exit 'This script must be run with root privileges.'
+fi
+
+trap sig_handler INT KILL
+trap exit_handler EXIT
+
+if is_live_cd_boot; then
+ if [ -n "$NEW_ISO" ]; then
+ fail_exit 'Do not specify an image when installing from a live CD.'
+ fi
+elif [ -z "$NEW_ISO" ]; then
+ fail_exit 'Must specify an image to install.'
+else
+ # installing on an installed system. set up the new image.
+ set_up_new_iso
+fi
+
+# check versions
+if is_live_cd_boot; then
+ CURVER=LIVECD
+else
+ CURVER=$(get_cur_version)
+fi
+NEWVER=$(get_new_version)
+if [ -z "$CURVER" ] || [ -z "$NEWVER" ]; then
+ fail_exit 'Cannot find release version.'
+fi
+if [ "$CURVER" == "$NEWVER" ]; then
+ fail_exit "Version \"$NEWVER\" is already installed."
+fi
+
+# get install partition
+PART_FILE=$(mktemp /tmp/inst-get-part.XXXXXX) \
+ || fail_exit 'Failed to create temporary file'
+if ! /opt/vyatta/sbin/install-get-partition $PART_FILE; then
+ exit 1
+fi
+
+# get the partition params
+root_part_type=''
+root_part=''
+inst_drv=''
+eval "read root_part_type root_part inst_drv <$PART_FILE" >&/dev/null
+rm -f $PART_FILE >&/dev/null
+
+# handle different types
+case "$root_part_type" in
+ new)
+ install_new "$root_part" "$inst_drv"
+ exit 0
+ ;;
+ union|old)
+ install_existing "$root_part_type"
+ exit 0
+ ;;
+ *)
+ fail_exit "Unknown partition type \"$root_part_type\"."
+ ;;
+esac
+