bsdinstall: restore the environment when restarting

It is possible to restart the installation process upon errors, when
installing normally through the `auto` script, or when installing a jail
with the `jail` script. However, some values obtained interactively from
the user or guessed by some scripts were kept in the environment when
restarting the process; this made it impossible to re-run some steps as
expected after the restart.

For instance, if a bad choice of mirror was made in the `mirrorselect`
phase, restarting the installer remembered the choice made, and would
never prompt for a different one again. Rebooting was then the only easy
way out of this situation.

This change restores a pre-defined list of environment variables when
restarting the installation process.

PR:		266987
Reviewed by:	emaste
Approved by:	philip (mentor)
Sponsored by:	The FreeBSD Foundation
Differential revision:	https://reviews.freebsd.org/D42281
This commit is contained in:
Pierre Pronchery 2025-05-23 17:50:42 +02:00
parent 66c2e68076
commit 9de72af2cc
2 changed files with 79 additions and 4 deletions

View file

@ -34,6 +34,13 @@ f_include $BSDCFG_SHARE/dialog.subr
############################################################ GLOBALS
#
# List of environment variables that may be defined by the user, but modified
# during the installation process. They are then restored when restarting this
# script.
#
user_env_vars="BSDINSTALL_DISTSITE DISTRIBUTIONS WORKAROUND_GPTACTIVE WORKAROUND_LENOVO ZFSBOOT_PARTITION_SCHEME"
#
# Strings that should be moved to an i18n file and loaded with f_include_lang()
#
@ -90,6 +97,7 @@ error()
--yes-label "$msg_restart" \
--yesno "$prompt" $height $width
then
environment_restore
exec $0
# NOTREACHED
fi
@ -138,10 +146,35 @@ dialog_workaround()
--yesno "$prompt" $height $width
}
# environment_restore
#
# Restore a list of environment variables when this script is restarted.
#
environment_restore()
{
for var in $user_env_vars; do
eval "if [ -n \"\${ORIG_$var}\" -o -z \"\${ORIG_$var-z}\" ]; then $var=\${ORIG_$var}; else unset $var; fi"
done
}
# environment_save
#
# Save any user-defined environment variable that may be modified during the
# installation process. They are then restored when restarting this script.
#
environment_save()
{
for var in $user_env_vars; do
eval "if [ -n \"\${$var}\" -o -z \"\${$var-z}\" ]; then ORIG_$var=\${$var}; else unset ORIG_$var; fi"
done
}
############################################################ MAIN
f_dprintf "Began Installation at %s" "$( date )"
environment_save
rm -rf $BSDINSTALL_TMPETC
mkdir $BSDINSTALL_TMPETC

View file

@ -31,12 +31,23 @@
BSDCFG_SHARE="/usr/share/bsdconfig"
. $BSDCFG_SHARE/common.subr || exit 1
############################################################ MAIN
############################################################ GLOBALS
: ${BSDDIALOG_OK=0}
#
# List of environment variables that may be defined by the user, but modified
# during the installation process. They are then restored when restarting this
# script.
#
user_env_vars="BSDINSTALL_DISTSITE DISTRIBUTIONS"
f_dprintf "Began Installation at %s" "$( date )"
############################################################ FUNCTIONS
# error [$msg]
#
# Display generic error message when a script fails. An optional message
# argument can preceed the generic message. User is given the choice of
# restarting the installer or exiting.
#
error() {
local msg
if [ -n "$1" ]; then
@ -48,7 +59,7 @@ error() {
if [ $? -ne $BSDDIALOG_OK ]; then
exit
else
[ -z "$MIRROR_BUTTON" ] || unset BSDINSTALL_DISTSITE
environment_restore
exec $0 $BSDINSTALL_CHROOT
fi
}
@ -111,11 +122,42 @@ distbase() {
bsdinstall distextract || error "Distribution extract failed"
}
# environment_restore
#
# Restore a list of environment variables when this script is restarted.
#
environment_restore()
{
for var in $user_env_vars; do
eval "if [ -n \"\${ORIG_$var}\" -o -z \"\${ORIG_$var-z}\" ]; then $var=\${ORIG_$var}; else unset $var; fi"
done
}
# environment_save
#
# Save any user-defined environment variable that may be modified during the
# installation process. They are then restored when restarting this script.
#
environment_save()
{
for var in $user_env_vars; do
eval "if [ -n \"\${$var}\" -o -z \"\${$var-z}\" ]; then ORIG_$var=\${$var}; else unset ORIG_$var; fi"
done
}
############################################################ MAIN
: ${BSDDIALOG_OK=0}
f_dprintf "Began Installation at %s" "$( date )"
if [ -z "$1" ]; then
error "Directory can not be empty\n\nUsage:\nbsdinstall jail directory"
fi
export BSDINSTALL_CHROOT=$1
environment_save
rm -rf $BSDINSTALL_TMPETC
mkdir $BSDINSTALL_TMPETC
mkdir -p $1 || error "mkdir failed for $1"