# mode: fresh | reinstall | upgrade | downgrade
unset MODE
+rm -f "${INSTALL_MODE_CONF}"
detect_prior_installation()
{
case "${MODE}" in
fresh)
+ echo "INSTALL_MODE='${MODE}'">"${INSTALL_MODE_CONF}"
exit ${Install}
;;
reinstall|upgrade|downgrade)
+ echo "INSTALL_MODE='${MODE}'">"${INSTALL_MODE_CONF}"
exit ${Upgrade}
;;
*)
dialog --yes-label Upgrade --no-label Install --yesno "An existing installation has been detected.\n\nPlease choose whether to perform an upgrade\nor to erase and perform a fresh installation." 8 50
OPT=$?
- [ ${OPT} != 0 ] || exit ${Upgrade}
- [ ${OPT} != 1 ] || exit ${Install}
+ if [ ${OPT} = 0 ] ; then
+ echo "INSTALL_MODE='upgrade'">"${INSTALL_MODE_CONF}"
+ exit ${Upgrade}
+ fi
+ if [ ${OPT} = 1 ] ; then
+ echo "INSTALL_MODE='fresh'">"${INSTALL_MODE_CONF}"
+ exit ${Install}
+ fi
[ ${OPT} != 255 ] || exit ${Previous}
exit ${Abort}
fi
+ echo "INSTALL_MODE='fresh'">"${INSTALL_MODE_CONF}"
exit ${Install}
fi
. ${SCRIPT_DIR}/functions
+. "${INSTALL_MODE_CONF}"
+# ^^^ defines INSTALL_MODE
+
MOUNT_DIR=$(mktemp -d)
mount /dev/xenclient/config "${MOUNT_DIR}" || exit ${Abort}
-mkdir -p "$(dirname ${MOUNT_DIR}/${PRESERVED_INSTALL_DATA})" || exit ${Abort}
-rm -rf "${MOUNT_DIR}/${PRESERVED_INSTALL_DATA}" >/dev/null 2>/dev/null
-[ ! -e "${MOUNT_DIR}/${PRESERVED_INSTALL_DATA}" ] || exit ${Abort}
+unwind_abort()
+{
+ umount "${MOUNT_DIR}"
+ sync
+ rmdir "${MOUNT_DIR}"
+ exit ${Abort}
+}
+
+# The install and upgrade cases preserve data to different locations:
+case "${INSTALL_MODE}" in
+ fresh)
+ DATA_DIR="${MOUNT_DIR}/${PRESERVED_INSTALL_DATA}"
+ LOG_DIR="${MOUNT_DIR}/${PRESERVED_INSTALL_LOG_DIR}"
+ ;;
+ reinstall|upgrade|downgrade)
+ DATA_DIR="${MOUNT_DIR}/${PRESERVED_UPGRADE_DATA}"
+ LOG_DIR="${MOUNT_DIR}/${PRESERVED_UPGRADE_LOG_DIR}"
+ ;;
+ *)
+ echo "Unknown install type: aborting.">&2
+ unwind_abort
+ ;;
+esac
+
+for PLACE in "${DATA_DIR}" "${LOG_DIR}" ; do
+ mkdir -p "$(dirname ${PLACE)" || unwind_abort
+ rm -rf "${PLACE}" >/dev/null 2>/dev/null
+ [ ! -e "${PLACE}" ] || unwind_abort
+done
# Write the success indicator here, so that it persists on the target
# filesystem.
echo "INSTALL='Success'" >"${INSTALL_STATUS_CONF}"
-cp -a "${INSTALL_DATA}" "${MOUNT_DIR}/${PRESERVED_INSTALL_DATA}" || exit ${Abort}
+cp -a "${INSTALL_DATA}" "${DATA_DIR}/" || unwind_abort
+
+# Preserve the installation/upgrade log:
+cp -a "${INSTALLER_LOG}" "${LOG_DIR}/" || unwind_abort
umount "${MOUNT_DIR}"
sync
# Directory to write configuration data in the installer environment:
INSTALL_DATA="/install/data"
-# Directory to archive install data to in the target system filesystem:
-PRESERVED_INSTALL_DATA="/install/data"
#-----------------------------------------------------------
# Define the set of config files written by the install sequence.
INSTALL_STATUS_CONF="${INSTALL_DATA}/install-status.conf"
OPTICAL_CONF="${INSTALL_DATA}/optical.conf"
NETWORK_REPO_CONF="${INSTALL_DATA}/network-repo.conf"
+INSTALL_MODE_CONF="${INSTALL_DATA}/install-mode.conf"
ALL_CONFIGS="${FULL_ANSWERFILE} ${ANSWERFILE} ${AUTOMATED_CONF} ${DISK_CONF}"
ALL_CONFIGS="${ALL_CONFIGS} ${HOST_CAPABILITY_CONF} ${NETWORK_NIC_CONF}"
ALL_CONFIGS="${ALL_CONFIGS} ${PASSWORD_CONF} ${LICENSE_KEY_CONF} ${BACKEND_CONF}"
ALL_CONFIGS="${ALL_CONFIGS} ${INSTALL_STATUS_CONF} ${OPTICAL_CONF} ${NETWORK_REPO_CONF}"
+ALL_CONFIGS="${ALL_CONFIGS} ${INSTALL_MODE_CONF}"
#-----------------------------------------------------------
# Filesystem paths
+# Directory to archive install data to in the target system filesystem:
+PRESERVED_INSTALL_DATA="/install/data"
+PRESERVED_UPGRADE_DATA="/install/upgrade/data"
+# Log file
+INSTALLER_LOG="/var/log/installer"
+# Directory to archive install log to in the target system filesystem:
+PRESERVED_INSTALL_LOG_DIR="/install/log"
+PRESERVED_UPGRADE_LOG_DIR="/install/upgrade/log"
+
LICENSE_FILE="/install/license"
DEFAULT_OPTICAL_DEVICE="sr0"