git: 9de72af2cceb - main - bsdinstall: restore the environment when restarting
- Go to: [ bottom of page ] [ top of archives ] [ this month ]
Date: Sun, 01 Jun 2025 13:07:20 UTC
The branch main has been updated by khorben:
URL: https://cgit.FreeBSD.org/src/commit/?id=9de72af2cceb6fc4aead0990cccdf565531bc248
commit 9de72af2cceb6fc4aead0990cccdf565531bc248
Author: Pierre Pronchery <khorben@FreeBSD.org>
AuthorDate: 2025-05-23 15:50:42 +0000
Commit: Pierre Pronchery <khorben@FreeBSD.org>
CommitDate: 2025-06-01 12:53:16 +0000
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
---
usr.sbin/bsdinstall/scripts/auto | 33 ++++++++++++++++++++++++++
usr.sbin/bsdinstall/scripts/jail | 50 ++++++++++++++++++++++++++++++++++++----
2 files changed, 79 insertions(+), 4 deletions(-)
diff --git a/usr.sbin/bsdinstall/scripts/auto b/usr.sbin/bsdinstall/scripts/auto
index fa67dbf671cc..d5ac14864d6b 100755
--- a/usr.sbin/bsdinstall/scripts/auto
+++ b/usr.sbin/bsdinstall/scripts/auto
@@ -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
diff --git a/usr.sbin/bsdinstall/scripts/jail b/usr.sbin/bsdinstall/scripts/jail
index 641c9f8a22bc..4b2882dad477 100755
--- a/usr.sbin/bsdinstall/scripts/jail
+++ b/usr.sbin/bsdinstall/scripts/jail
@@ -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"