summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--distrib/miniroot/install.sub237
1 files changed, 168 insertions, 69 deletions
diff --git a/distrib/miniroot/install.sub b/distrib/miniroot/install.sub
index 41be3a59222..efcd3d97011 100644
--- a/distrib/miniroot/install.sub
+++ b/distrib/miniroot/install.sub
@@ -1,5 +1,5 @@
#!/bin/sh
-# $OpenBSD: install.sub,v 1.169 2001/09/19 00:04:02 krw Exp $
+# $OpenBSD: install.sub,v 1.170 2001/10/15 22:58:59 krw Exp $
# $NetBSD: install.sub,v 1.5.2.8 1996/09/02 23:25:02 pk Exp $
#
# Copyright (c) 1997,1998 Todd Miller, Theo de Raadt
@@ -540,7 +540,6 @@ __EOT
}
configure_ifs() {
-
local _up _if_name=$1 _if_ip _if_mask
local _if_symname _if_extra _hostname
local _dhcp_prompt
@@ -692,89 +691,172 @@ __EOT
return 1
}
+# Returns true if $1 contains only alphanumerics
+isalphanumeric() {
+ local _n
+ _n=$1
+ while [ ${#_n} != 0 ]; do
+ case $_n in
+ [A-Za-z0-9]*) ;;
+ *) return 1;;
+ esac
+ _n=${_n#?}
+ done
+ return 0
+}
+
# Much of this is gratuitously stolen from /etc/netstart.
enable_network() {
- # Set up the hostname.
- if [ ! -f /mnt/etc/myname ]; then
- echo "ERROR: no /etc/myname!"
- return 1
- fi
- hostname=`cat /mnt/etc/myname`
- hostname $hostname
-
- _didnet=1
+ # Check for required network related files
+ for _netfile in hosts myname; do
+ if [ ! -f /mnt/etc/${_netfile} ]; then
+ echo "ERROR: no /mnt/etc/${_netfile}!"
+ return 1
+ fi
+ done
- # configure all the interfaces which we know about.
-(
- tmp="$IFS"
- IFS="$IFS."
- set -- `echo /mnt/etc/hostname*`
- IFS=$tmp
- unset tmp
-
- while [ $# -ge 2 ] ; do
- shift # get rid of "hostname"
- (
- read af name mask bcaddr extras
- read dt dtaddr
-
- if [ ! -n "$name" ]; then
- echo "/etc/hostname.$1: invalid network configuration file"
- exit
- fi
+ # Copy any required or optional files found
+ for _netfile in hosts myname dhclient.conf resolv.conf resolv.conf.tail; do
+ if [ -f /mnt/etc/${_netfile} ]; then
+ cp /mnt/etc/${_netfile} /etc/${_netfile}
+ fi
+ done
- cmd="ifconfig $1 $af $name "
- if [ "${dt}" = "dest" ]; then cmd="$cmd $dtaddr"; fi
- if [ -n "$mask" ]; then cmd="$cmd netmask $mask"; fi
- if [ -n "$bcaddr" -a "X$bcaddr" != "XNONE" ]; then
- cmd="$cmd broadcast $bcaddr";
- fi
- cmd="$cmd $extras"
+ hostname=`cat /etc/myname`
+ hostname $hostname
- $cmd
- ) < /mnt/etc/hostname.$1
- shift
- done
-)
+ _didnet=1
# set the address for the loopback interface
ifconfig lo0 inet localhost
# use loopback, not the wire
- route add $hostname localhost
+ route -n add -host $hostname localhost > /dev/null
+ route -n add -net 127 127.0.0.1 -reject > /dev/null
+
+ # configure all of the non-loopback interfaces which we know about.
+ # refer to hostname.if(5)
+ for hn in /mnt/etc/hostname.*; do
+ # Strip off /mnt/etc/hostname. prefix
+ if=${hn#/mnt/etc/hostname.}
+
+ # Interface names must be alphanumeric only. We check to avoid
+ # configuring backup or temp files, and to catch the "*" case.
+ if ! isalphanumeric "$if"; then
+ continue
+ fi
+ ifconfig $if > /dev/null 2>&1
+ if [ "$?" != "0" ]; then
+ continue
+ fi
+
+ # Now parse the hostname.* file
+ while :; do
+ if [ "$cmd2" ]; then
+ # we are carrying over from the 'read dt dtaddr' last time
+ set -- $cmd2
+ af="$1" name="$2" mask="$3" bcaddr="$4" ext1="$5" cmd2=
+ # make sure and get any remaining args in ext2, like the read below
+ i=1; while [ i -lt 6 -a -n "$1" ]; do shift; let i=i+1; done
+ ext2="$@"
+ else
+ # read the next line or exit the while loop
+ read af name mask bcaddr ext1 ext2 || break
+ fi
+ # $af can be "dhcp", "up", "rtsol", an address family, commands, or
+ # a comment.
+ case "$af" in
+ "#"*|"!"*|"bridge"|""|"rtsol")
+ # skip comments, user commands, bridges,
+ # IPv6 rtsol and empty lines
+ continue
+ ;;
+ "dhcp")
+ [ "$name" = "NONE" ] && name=
+ [ "$mask" = "NONE" ] && mask=
+ [ "$bcaddr" = "NONE" ] && bcaddr=
+ ifconfig $if $name $mask $bcaddr $ext1 $ext2 down
+ cmd="dhclient $if"
+ ;;
+ "up")
+ # The only one of these guaranteed to be set is $if
+ # the remaining ones exist so that media controls work
+ cmd="ifconfig $if $name $mask $bcaddr $ext1 $ext2 up"
+ ;;
+ *)
+ read dt dtaddr
+ if [ "$name" = "alias" ]; then
+ # perform a 'shift' of sorts
+ alias=$name
+ name=$mask
+ mask=$bcaddr
+ bcaddr=$ext1
+ ext1=$ext2
+ ext2=
+ else
+ alias=
+ fi
+ cmd="ifconfig $if $af $alias $name "
+ case "$dt" in
+ dest)
+ cmd="$cmd $dtaddr"
+ ;;
+ [a-z!]*)
+ cmd2="$dt $dtaddr"
+ ;;
+ esac
+ if [ ! -n "$name" ]; then
+ echo "/mnt/etc/hostname.$if: invalid network configuration file"
+ return
+ fi
+ case $af in
+ inet)
+ [ "$mask" ] && cmd="$cmd netmask $mask"
+ if [ "$bcaddr" -a "X$bcaddr" != "XNONE" ]; then
+ cmd="$cmd broadcast $bcaddr"
+ fi
+ [ "$alias" ] && rtcmd="; route -n add -host $name 127.0.0.1"
+ ;;
+ inet6)
+ # Ignore IPv6 setup
+ continue
+ ;;
+ *) cmd="$cmd $mask $bcaddr"
+ esac
+ cmd="$cmd $ext1 $ext2$rtcmd" rtcmd=
+ ;;
+ esac
+ eval "$cmd"
+ done < /mnt/etc/hostname.$if
+ done
- # /etc/mygate, if it exists, contains the name of my gateway host
+ # /mnt/etc/mygate, if it exists, contains the name of my gateway host
# that name must be in /etc/hosts.
if [ -f /mnt/etc/mygate ]; then
route delete default > /dev/null 2>&1
- route add default `cat /mnt/etc/mygate`
+ route -n add -host default `cat /mnt/etc/mygate`
fi
- # enable the resolver, if appropriate.
- if [ -f /mnt/etc/resolv.conf ]; then
- _resolver_enabled="TRUE"
- cp /mnt/etc/resolv.conf /tmp/resolv.conf.shadow
- fi
+ # Get FQDN after any DHCP manipulation of resolv.conf is done
+ get_fqdn /etc/resolv.conf
# Display results...
- echo "Network interface configuration:"
+ echo "Network interface configuration:"
ifconfig -am
-
- echo
-
- if [ "X${_resolver_enabled}" = X"TRUE" ]; then
+
+ # enable the resolver if resolv.conf is available
+ if [ -f /etc/resolv.conf ]; then
route show
- echo
- echo "Resolver enabled."
+ echo "\nResolver enabled."
else
route -n show
- echo
- echo "Resolver not enabled."
+ echo "\nResolver not enabled."
fi
return 0
}
+
# Print the selector and get a response
# The list of sets is passed in as $1, sets $resp
get_selection() {
@@ -2126,6 +2208,26 @@ local _fstab=$1
) < $_fstab
}
+get_fqdn() {
+ # Find LAST instance of DOMAIN or SEARCH and extract first domain name
+ # on that line as FQDN. Then ask user, just to be sure.
+
+ if [ -f "$1" ]; then
+ FQDN=`sed -n \
+ -e '/^domain[[:space:]][[:space:]]*/{s///;s/\([^[:space:]]*\).*$/\1/;h;}' \
+ -e '/^search[[:space:]][[:space:]]*/{s///;s/\([^[:space:]]*\).*$/\1/;h;}' \
+ -e '${g;p;}' $1`
+ fi
+
+ resp= # force at least one iteration
+ while [ "X${resp}" = X"" ]; do
+ echo -n "Enter DNS domain name (e.g. \"bar.com\"): [$FQDN] "
+ getresp "$FQDN"
+ done
+
+ FQDN=$resp
+}
+
donetconfig() {
_didnet=1
resp= # force at least one iteration
@@ -2140,17 +2242,6 @@ donetconfig() {
hostname $resp
echo $resp > /tmp/myname
- resp= # force at least one iteration
- if [ -f /tmp/resolv.conf ]; then
- FQDN=`grep '^domain ' /tmp/resolv.conf | \
- sed -e 's/^domain //'`
- fi
- while [ "X${resp}" = X"" ]; do
- echo -n "Enter DNS domain name (e.g. \"bar.com\"): [$FQDN] "
- getresp "$FQDN"
- done
- FQDN=$resp
-
echo
echo "If you have any devices being configured by a DHCP server"
echo "it is recommended that you do not enter a default route or"
@@ -2159,6 +2250,14 @@ donetconfig() {
configurenetwork
+ # Get FQDN after possible DHCP invocation
+ if [ -f /tmp/resolv.conf.shadow ]; then
+ get_fqdn /tmp/resolv.conf.shadow
+ else
+ # If install is being re-run, save a few keystrokes
+ get_fqdn /tmp/resolv.conf
+ fi
+
resp=`route -n show |
grep '^default' |
sed -e 's/^default //' -e 's/ .*//'`