summaryrefslogtreecommitdiff
path: root/distrib/miniroot/install.sub
diff options
context:
space:
mode:
Diffstat (limited to 'distrib/miniroot/install.sub')
-rw-r--r--distrib/miniroot/install.sub253
1 files changed, 111 insertions, 142 deletions
diff --git a/distrib/miniroot/install.sub b/distrib/miniroot/install.sub
index bb976428b60..f66eb32c328 100644
--- a/distrib/miniroot/install.sub
+++ b/distrib/miniroot/install.sub
@@ -1,7 +1,7 @@
-# $OpenBSD: install.sub,v 1.286 2003/01/25 15:46:52 krw Exp $
+# $OpenBSD: install.sub,v 1.287 2003/01/26 15:53:13 krw Exp $
# $NetBSD: install.sub,v 1.5.2.8 1996/09/02 23:25:02 pk Exp $
#
-# Copyright (c) 1997-2002 Todd Miller, Theo de Raadt, Ken Westerback
+# Copyright (c) 1997-2003 Todd Miller, Theo de Raadt, Ken Westerback
# All rights reserved.
#
# Redistribution and use in source and binary forms, with or without
@@ -97,13 +97,13 @@ set_term() {
welcome() {
cat << __EOT
-Welcome to the OpenBSD/${ARCH} ${VERSION_MAJOR}.${VERSION_MINOR} ${MODE} program.
+Welcome to the $OBSD $MODE program.
-This program will help you ${MODE} OpenBSD in a simple and rational way. At
+This program will help you $MODE OpenBSD in a simple and rational way. At
any prompt except password prompts you can run a shell command by typing
'!foo', or escape to a shell by typing '!'. Default answers are shown in []'s
and are selected by pressing RETURN. At any time you can exit this program by
-pressing Control-C and then RETURN, but quitting during an ${MODE} can leave
+pressing Control-C and then RETURN, but quitting during an $MODE can leave
your system in an inconsistent state.
__EOT
@@ -482,27 +482,61 @@ addhostent() {
echo "$1 $2" >> /tmp/hosts
}
-# Show selection list and get user response to give question
-# in global _resp.
+# Show list of available sets and let the user select which sets to install.
#
-# $1 = full list to display
-# $2 = list of already selected elements
-# $3 = question to ask user
-do_selection_list() {
- local _next _elem
-
- for _elem in $1; do
- if isin $_elem $2; then
- echo -n " [X] "
- else
- echo -n " [ ] "
- : ${_next:=$_elem}
- fi
- echo $_elem
+# $1 = available sets
+# $2 = already selected sets
+#
+# Set $resp to list of selected sets.
+select_sets() {
+ local _avail=$1 _selected=$2 _next _f _action
+
+ while : ; do
+ cat << __EOT
+
+The following sets are available. Enter a filename, 'all' to select
+all the sets, or 'done'. You may de-select a set by prepending a '-'
+to its name.
+
+__EOT
+ _next=
+ for _f in $_avail; do
+ if isin $_f $_selected; then
+ echo " [X] $_f"
+ else
+ echo " [ ] $_f"
+ : ${_next:=$_f}
+ fi
+ done
+ : ${_next:=done}
+
+ ask "\nFile name? (or 'done')" "$_next"
+
+ case $resp in
+ ""|+|-) continue
+ ;;
+ done) break
+ ;;
+ -*) _action=rmel
+ ;;
+ *) _action=addel
+ ;;
+ esac
+
+ resp=${resp#+|-}
+ [[ $resp == all ]] && resp=*
+
+ for _f in $_avail; do
+ eval "case $_f in
+ $resp)
+ _selected=\`$_action $_f \$_selected\`
+ ;;
+ esac"
+ done
+
done
- : ${_next:=done}
- ask "\n$3 (or 'done')" "$_next"
+ resp=$_selected
}
configure_all_interfaces() {
@@ -804,111 +838,56 @@ enable_network() {
return 0
}
-# Do globbing on the selection and parse +/-. Update the global
-# GET_FILES appropriately.
-#
-# $1 = user's selection (e.g. 'x*', or '-games*')
-# $2 = list of sets available from current source
-glob_selection() {
- local _selection=$1 _sets=$2 _action _f
-
- # Change +/- into add/remove, but ignore bare '+' or '-'
- _action=addel
- case $_selection in
- ""|+|-) return
- ;;
- +*) _selection=${_selection#?}
- ;;
- -*) _selection=${_selection#?}
- _action=rmel
- ;;
- esac
-
- [ "$_selection" = "all" ] && _selection=*
-
- set -o noglob
- for _f in $_sets; do
- eval "case $_f in
- $_selection)
- GET_FILES=\`$_action $_f \$GET_FILES\`
- ;;
- esac"
- done
- set +o noglob
-}
-
-# Set GET_FILES to the list of sets requested by the user.
-# $1 = list of files available in source directory or url.
-# $2 = source directory or url
-get_get_files () {
- local _files=$1 _src=$2 _sets _f
-
- GET_FILES=
-
- for _f in $THESETS ; do
- if isin $_f $_files ; then
- _sets="$_sets $_f"
- isin $_f $DEFAULTSETS && GET_FILES="$GET_FILES $_f"
- fi
+# Install a user-selected subset of the files in $2 from the source
+# named in $1. Display an error message for failed installs so the
+# user will know to try again.
+install_files () {
+ local _src=$1 _files=$2 _f _sets _get_sets
+
+ # Initialize _sets to the list of sets found in _src, and initialize
+ # _get_sets to the intersection of _sets and DEFAULTSETS.
+ #
+ # Sets will be installed in the order given in THESETS to ensure proper
+ # installation. So, to minimize user confusion display the sets in the
+ # order in which they will be installed.
+ for _f in $THESETS; do
+ isin $_f $_files || continue;
+ _sets=$(addel $_f $_sets)
+ isin $_f $DEFAULTSETS && _get_sets=$(addel $_f $_get_sets)
done
- if [ -z "$_sets" ]; then
+ if [[ -z $_sets ]]; then
cat << __EOT
-No OpenBSD ${VERSION_MAJOR}.${VERSION_MINOR} ${MODE} sets were found in
+No $OBSD sets were found at
- '${_src}'
+ '$_src'
-Valid set names would be:
+Set names are: $THESETS
__EOT
- for _f in $THESETS ; do
- echo " $_f"
- done
return
fi
- # Allow the user to select/de-select additional sets
- while : ; do
- cat << __EOT
-
-The following sets are available. Enter a filename, 'all' to select
-all the sets, or 'done'. You may de-select a set by prepending a '-'
-to its name.
-
-__EOT
- do_selection_list "$_sets" "$GET_FILES" "File Name?"
-
- [ "$resp" = "done" ] && break
-
- glob_selection "$resp" "$_sets"
- done
-}
-
-# Install the list of files in the global GET_FILES from the source
-# named in $1. Display an error message for failed installs so the
-# user will know to try again.
-install_get_files () {
- local _f _src=$1
+ select_sets "$_sets" "$_get_sets"
- # User may have selected no files
- [[ -n $GET_FILES ]] || return
+ [[ -n $resp ]] || return
+ _get_sets=$resp
- ask "Ready to ${MODE} sets?" y
+ ask "Ready to $MODE sets?" y
case $resp in
n*|N*) return ;;
esac
- echo
for _f in $THESETS ; do
- isin $_f $GET_FILES || continue
- echo "Getting ${_f} ..."
+ isin $_f $_get_sets || continue
+ echo "Getting $_f ..."
case $_f in
- *.tgz) ftp ${_ftp_active} -o - -V -m "${_src}/${_f}" | tar zxpf - -C /mnt
+ *.tgz) ftp $_ftp_active -o - -V -m "$_src/$_f" | tar zxpf - -C /mnt
;;
- *) ftp ${_ftp_active} -o "/mnt/${_f}" -V -m "${_src}/${_f}"
+ *) ftp $_ftp_active -o "/mnt/$_f" -V -m "$_src/$_f"
;;
esac
if [ $? -ne 0 ]; then
- echo "'${_f}' did not install correctly."
+ echo "'$_f' did not install correctly."
else
DEFAULTSETS=$(rmel $_f $DEFAULTSETS)
fi
@@ -955,18 +934,18 @@ install_url() {
: ${_proxy_host:=none}
ask "HTTP/FTP proxy URL? (e.g. 'http://proxy:8080', or 'none')" "$_proxy_host"
- if [ "$resp" = "none" ]; then
+ if [[ $resp == none ]]; then
unset _proxy_host ftp_proxy http_proxy
else
_proxy_host=$resp
- export ftp_proxy=${_proxy_host}
- export http_proxy=${_proxy_host}
+ export ftp_proxy=$_proxy_host
+ export http_proxy=$_proxy_host
fi
# Provide a list of possible servers
: ${_ftp_getlist:=y}
- ask "Do you want to see a list of potential ${_url_type} servers?" "$_ftp_getlist"
+ ask "Do you want to see a list of potential $_url_type servers?" "$_ftp_getlist"
case $resp in
n*|N*) _ftp_getlist=n
;;
@@ -974,14 +953,16 @@ install_url() {
_ftp_getlist=y
# ftp.openbsd.org == 129.128.5.191 and will remain at
# that address for the forseeable future.
- ftp ${_ftp_active} -V -a -o /tmp/ftplist ftp://129.128.5.191/pub/OpenBSD/${VERSION_MAJOR}.${VERSION_MINOR}/ftplist > /dev/null
+ ftp ${_ftp_active} -V -a -o /tmp/ftplist ftp://129.128.5.191/$FTPDIR/ftplist > /dev/null
grep "^${_url_type}:" /tmp/ftplist | cat -n | less -XE
;;
esac
+ : ${_ftp_server_dir:=pub/OpenBSD/$SETDIR}
+
# Get server IP address or hostname
resp=
- while [ -z "$resp" ] ; do
+ while [[ -z $resp ]] ; do
if [ ! -f /tmp/ftplist ]; then
eval ask \"Server IP address, or hostname?\" \"\$_${_url_type}_server_ip\"
continue;
@@ -1001,14 +982,12 @@ install_url() {
echo "There is no ${resp}th line in the list."
else
tline=`grep "^${_url_type}:" /tmp/ftplist | sed -ne "${resp}p"`
+ echo "Using $tline"
url=`echo $tline | sed -e "s/^${_url_type}:\/\///" |
cutword -t' ' 1 | cutword -t' ' 1`
host=`echo $url | cutword -t/ 1`
- path=`echo $url | sed -e "s/^${host}\///"`
- path=${path}/${VERSION_MAJOR}.${VERSION_MINOR}/${ARCH}
eval _${_url_type}_server_ip=$host
- eval _${_url_type}_server_dir=$path
- echo "Using $tline"
+ eval _${_url_type}_server_dir=$(echo $url | sed -e "s/^${host}\///")/$SETDIR
fi
# Always do it again, just to double check
@@ -1024,7 +1003,7 @@ install_url() {
# Some older servers lie about their support for passive mode ftp, so
# ask the user if it worth trying passive mode to the chosen server.
# Irrelevant if using a proxy.
- if [ "$_url_type" = "ftp" -a -z "$ftp_proxy" ]; then
+ if [[ $_url_type == ftp && -z $ftp_proxy ]]; then
case $_ftp_active in
-A) resp=n ;;
*) resp=y ;;
@@ -1038,15 +1017,10 @@ install_url() {
fi
# Get server directory
- if [ "$_url_type" = "ftp" -a -z "$_ftp_server_dir" ] ; then
- # Default ftp dir
- _ftp_server_dir=pub/OpenBSD/${VERSION_MAJOR}.${VERSION_MINOR}/${ARCH}
- fi
-
eval ask_until \"Server directory?\" \"\$_${_url_type}_server_dir\"
eval _${_url_type}_server_dir=$resp
- if [ "$_url_type" = "ftp" ]; then
+ if [[ $_url_type == ftp ]]; then
# Get login name, setting IFS to nothing so trailing or
# embedded blanks are preserved!
_oifs=$IFS
@@ -1056,9 +1030,9 @@ install_url() {
# Get password unless anonymous
_ftp_server_password=root@`hostname`
- if [ "$_ftp_server_login" != "anonymous" ]; then
+ if [[ $_ftp_server_login != anonymous ]]; then
resp=
- while [ -z "$resp" ] ; do
+ while [[ -z $resp ]] ; do
askpass "Password? (will not echo)"
done
_ftp_server_password=$resp
@@ -1067,7 +1041,7 @@ install_url() {
fi
# Build up the base url since it is so nasty...
- if [ "$_url_type" = "ftp" -a "$_ftp_server_login" != "anonymous" ]; then
+ if [[ $_url_type == ftp && $_ftp_server_login != anonymous ]]; then
_url_login=`encode_for_url "$_ftp_server_login"`
_url_pass=`encode_for_url "$_ftp_server_password"`
_url_base=ftp://${_url_login}:${_url_pass}@${_ftp_server_ip}/${_ftp_server_dir}
@@ -1076,8 +1050,7 @@ install_url() {
fi
# Get list of files from the server.
- # XXX - check for nil $_file_list and deal
- if [ "$_url_type" = "ftp" -a -z "$ftp_proxy" ] ; then
+ if [[ $_url_type == ftp && -z $ftp_proxy ]] ; then
_file_list=`ftp_list_files "$_ftp_server_ip" "$_ftp_server_login" "$_ftp_server_password" "$_ftp_server_dir"`
ftp_error "Login failed." "$_file_list" && return
ftp_error "No such file or directory." "$_file_list" && return
@@ -1087,9 +1060,7 @@ install_url() {
_file_list=`ftp -o - -V "${_url_base}/index.txt" | sed 's/ //'`
fi
- get_get_files "$_file_list" "`eval echo \\$_${_url_type}_server_dir`"
-
- install_get_files "$_url_base"
+ install_files "$_url_base" "$_file_list"
}
# $1 - mount point directory is relative to
@@ -1113,9 +1084,7 @@ install_mounted_fs() {
esac
done
- get_get_files "`ls -l $_dir`" "$_dir"
-
- install_get_files "file:$_dir"
+ install_files "file://$_dir" "`ls -l $_dir`"
}
install_cdrom() {
@@ -1195,7 +1164,7 @@ __EOT
return
fi
- install_mounted_fs /mnt2 "${VERSION_MAJOR}.${VERSION_MINOR}/${ARCH}"
+ install_mounted_fs /mnt2 "$SETDIR"
umount -f /mnt2 > /dev/null 2>&1
}
@@ -1796,10 +1765,13 @@ __EOT
ROOTDISK=
ROOTDEV=
+
VERSION=32
-VERSION_MAJOR=$(( $VERSION / 10 ))
-VERSION_MINOR=$(( $VERSION % 10 ))
-export VERSION VERSION_MAJOR VERSION_MINOR
+
+VNAME="$(( $VERSION / 10 )).$(( $VERSION % 10 ))"
+SETDIR="$VNAME/$ARCH"
+FTPDIR="pub/OpenBSD/$VNAME"
+OBSD="OpenBSD/$ARCH $VNAME"
# Extract and save one boot's worth of dmesg
dmesg | sed -ne '/^OpenBSD /h;/^OpenBSD /!H;${g;p;}' > /var/run/dmesg.boot
@@ -1824,9 +1796,6 @@ for _set in base etc misc comp man game xbase xshare xfont xserv site ; do
DEFAULTSETS="$DEFAULTSETS ${_set}${VERSION}.tgz"
done
-# Global variable using during sets installation
-GET_FILES=
-
# decide upon an editor
if [ -z "$EDITOR" ] ; then
EDITOR=ed