svn commit: r222468 - head/usr.sbin/bsdinstall/scripts

Bjoern A. Zeeb bz at FreeBSD.org
Sun May 29 21:24:21 UTC 2011


Author: bz
Date: Sun May 29 21:24:20 2011
New Revision: 222468
URL: http://svn.freebsd.org/changeset/base/222468

Log:
  Split netconfig into three parts:
  - netconfig - what auto will call which in turn will check for
    IPv4 and IPv6 to be available and ask the user to configure it
    by calling
  - netconfig_ipv4 doing DHCP and static IPv4 addresses, and
  - netconfig_ipv6 doing rtsol and static IPv6 addresses,
  and then checking, querying and updating resolv.conf upon return.
  Both DHCP and rtsol (in the future) might update resolv.conf already so
  we seed ourselves from that file if available.
  
  Reviewed by:	nwhitehorn
  Sponsored by:	The FreeBSD Foundation
  Sponsored by:	iXsystems

Added:
  head/usr.sbin/bsdinstall/scripts/netconfig_ipv4   (contents, props changed)
  head/usr.sbin/bsdinstall/scripts/netconfig_ipv6   (contents, props changed)
Modified:
  head/usr.sbin/bsdinstall/scripts/Makefile
  head/usr.sbin/bsdinstall/scripts/netconfig

Modified: head/usr.sbin/bsdinstall/scripts/Makefile
==============================================================================
--- head/usr.sbin/bsdinstall/scripts/Makefile	Sun May 29 21:20:47 2011	(r222467)
+++ head/usr.sbin/bsdinstall/scripts/Makefile	Sun May 29 21:24:20 2011	(r222468)
@@ -1,7 +1,8 @@
 # $FreeBSD$
 
 SCRIPTS= auto adduser checksum config hostname jail keymap mirrorselect \
-	 mount netconfig rootpass services time umount wlanconfig
+	 mount netconfig netconfig_ipv4 netconfig_ipv6 rootpass services \
+	 time umount wlanconfig
 BINDIR= /usr/libexec/bsdinstall
 
 NO_MAN=	true

Modified: head/usr.sbin/bsdinstall/scripts/netconfig
==============================================================================
--- head/usr.sbin/bsdinstall/scripts/netconfig	Sun May 29 21:20:47 2011	(r222467)
+++ head/usr.sbin/bsdinstall/scripts/netconfig	Sun May 29 21:24:20 2011	(r222468)
@@ -2,6 +2,11 @@
 #-
 # Copyright (c) 2011 Nathan Whitehorn
 # All rights reserved.
+# Copyright (c) 2011 The FreeBSD Foundation
+# All rights reserved.
+#
+# Portions of this software were developed by Bjoern Zeeb
+# under sponsorship from the FreeBSD Foundation.
 #
 # Redistribution and use in source and binary forms, with or without
 # modification, are permitted provided that the following conditions
@@ -66,56 +71,124 @@ if ifconfig $INTERFACE | grep -q 'media:
 	INTERFACE="$NEXT_WLAN_IFACE"
 fi
 
-dialog --backtitle 'FreeBSD Installer' --title 'Network Configuration' --yesno 'Would you like to use DHCP to configure this interface?' 0 0
-if [ $? -eq $DIALOG_OK ]; then
-	echo ifconfig_$INTERFACE=\"${IFCONFIG_PREFIX}DHCP\" >> $BSDINSTALL_TMPETC/rc.conf.net
-
-	if [ ! -z $BSDINSTALL_CONFIGCURRENT ]; then
-		dialog --backtitle 'FreeBSD Installer' --infobox "Acquiring DHCP lease..." 0 0
-		dhclient $INTERFACE 2>> $BSDINSTALL_LOG
-		if [ $? -ne 0 ]; then
-			dialog --backtitle 'FreeBSD Installer' --msgbox "DHCP lease acquisition failed." 0 0
-			exec $0
-		fi
+IPV6_AVAIL=0
+IPV4_AVAIL=0
+sysctl -N kern.features.inet6 > /dev/null 2>&1
+case $? in
+0)	IPV6_AVAIL=1 ;;
+esac
+sysctl -N kern.features.inet > /dev/null 2>&1
+case $? in
+0)	IPV4_AVAIL=1 ;;
+esac
+
+if [ ${IPV4_AVAIL} -eq 1 ]; then
+	dialog --backtitle 'FreeBSD Installer' --title 'Network Configuration' \
+	    --yesno 'Would you like to configure IPv4 for this interface?' 0 0
+	if [ $? -eq $DIALOG_OK ]; then
+		bsdinstall netconfig_ipv4 ${INTERFACE} "${IFCONFIG_PREFIX}" || \
+		exec $0
+	else
+		IPV4_AVAIL=0
+	fi
+fi
+# In case wlanconfig left an option and we do not support IPv4 we need to write
+# it out on its own.  We cannot write it out with IPv6 as that suffix.
+if [ ${IPV4_AVAIL} -eq 0 -a -n ${IFCONFIG_PREFIX} ]; then
+	echo ifconfig_${INTERFACE}=\"${IFCONFIG_PREFIX}\" >> $BSDINSTALL_TMPETC/rc.conf.net
+fi
+if [ ${IPV6_AVAIL} -eq 1 ]; then
+	dialog --backtitle 'FreeBSD Installer' --title 'Network Configuration' \
+	    --yesno 'Would you like to configure IPv6 for this interface?' 0 0
+	if [ $? -eq $DIALOG_OK ]; then
+		bsdinstall netconfig_ipv6 ${INTERFACE} || exec $0
+	else
+		IPV6_AVAIL=0
 	fi
-	exit 0
 fi
 
-IP_ADDRESS=`ifconfig $INTERFACE inet | awk '/inet/ {printf("%s\n", $2); }'`
-NETMASK=`ifconfig $INTERFACE inet | awk '/inet/ {printf("%s\n", $4); }'`
-ROUTER=`netstat -rn -f inet | awk '/default/ {printf("%s\n", $2);}'`
+SEARCH=""
+IP4_1=""
+IP4_2=""
+IP6_1=""
+IP6_2=""
+while read key value; do
+	case "${key}" in
+	search)		SEARCH="${value}" ;;
+	nameserver)	# is more trick as we have to distinguish v4 and v6
+		case "${value}" in
+		[0-9]*\.[0-9]*\.[0-9]*\.[0-9]*)
+			if [ -z "${IP4_1}" ] ; then
+				IP4_1="${value}"
+			elif [ -z "${IP4_2}" ]; then
+				IP4_2="${value}"
+			fi
+			;;
+		[0-9A-Fa-f:]*:*)
+			if [ -z "${IP6_1}" ] ; then
+				IP6_1="${value}"
+			elif [ -z "${IP6_2}" ]; then
+				IP6_2="${value}"
+			fi
+			;;
+		esac
+		;;
+	# ignore others
+	esac
+done < ${BSDINSTALL_TMPETC}/resolv.conf
+
+RESOLV=""
+if [ ${IPV6_AVAIL} -eq 1 -a ${IPV4_AVAIL} -eq 1 ];  then
+	RESOLV="
+	    'Search' 1 0 \"${SEARCH}\" 1 16 50 0 0
+	    'Nameserver' 2 0 \"Nameserver\" 2 16 50 0 2
+	    'IPv6 DNS #1' 2 0 \"${IP6_1}\" 2 16 50 0 0
+	    'IPv6 DNS #2' 3 0 \"${IP6_2}\" 3 16 50 0 0
+	    'IPv4 DNS #1' 4 0 \"${IP4_1}\" 4 16 16 0 0
+	    'IPv4 DNS #2' 5 0 \"${IP4_2}\" 5 16 16 0 0"
+elif [ ${IPV6_AVAIL} -eq 1 ]; then
+	RESOLV="
+	    'Search' 1 0 \"${SEARCH}\" 1 16 50 0 0
+	    'Nameserver' 2 0 \"Nameserver\" 2 16 50 0 2
+	    'IPv6 DNS #1' 2 0 \"${IP6_1}\" 2 16 50 0 0
+	    'IPv6 DNS #2' 3 0 \"${IP6_2}\" 3 16 50 0 0"
+elif [ ${IPV4_AVAIL} -eq 1 ]; then
+	RESOLV="
+	    'Search' 1 0 \"${SEARCH}\" 1 16 50 0 0
+	    'Nameserver' 2 0 \"Nameserver\" 2 16 50 0 2
+	    'IPv4 DNS #1' 2 0 \"${IP4_1}\" 2 16 16 0 0
+	    'IPv4 DNS #2' 3 0 \"${IP4_2}\" 3 16 16 0 0"
+else
+	exit 0
+fi
 
 exec 3>&1
-IF_CONFIG=$(dialog --backtitle 'FreeBSD Installer' --title 'Network Configuration' --form 'Static Network Interface Configuration' 0 0 0 \
-	'IP Address' 1 0 "$IP_ADDRESS" 1 20 16 0 \
-	'Subnet Mask' 2 0 "$NETMASK" 2 20 16 0 \
-	'Default Router' 3 0 "$ROUTER" 3 20 16 0 \
-	\
-	'Nameserver' 5 0 "" 5 20 16 0 \
-	'Search Domain' 6 0 "" 6 20 20 0 \
+RESOLV=$(echo "${RESOLV}" | xargs dialog --backtitle 'FreeBSD Installer' \
+	--title 'Network Configuration' \
+	--mixedform 'Resovler Configuration' 0 0 0 \
 2>&1 1>&3)
 if [ $? -eq $DIALOG_CANCEL ]; then exec $0; fi
 exec 3>&-
 
-echo $INTERFACE $IF_CONFIG | 
-    awk -v prefix="$IFCONFIG_PREFIX" '{
-	printf("ifconfig_%s=\"%s%s netmask %s\"\n", $1, prefix, $2, $3);
-	printf("defaultrouter=\"%s\"\n", $4);
-    }' >> $BSDINSTALL_TMPETC/rc.conf.net
-
-if [ ! -z $BSDINSTALL_CONFIGCURRENT ]; then
-	. $BSDINSTALL_TMPETC/rc.conf.net
-	ifconfig $INTERFACE `eval echo \\\$ifconfig_$INTERFACE`
-	route delete default
-	route add default $defaultrouter
-fi
-
-
-echo $IF_CONFIG | 
-    awk '{
-	if ($4 != "")
-		printf("nameserver %s\n", $4);
-	if ($5 != "")
-		printf("search %s\n", $5);
-    }' > $BSDINSTALL_TMPETC/resolv.conf
+echo ${RESOLV} | tr ' ' '\n' | \
+awk '
+BEGIN {
+	search=1
+	printf "search ";
+}
+{
+	if (/^[[:space:]]+$/) {
+		next;
+	}
+	if (/^Nameserver$/) {
+		printf "\n";
+		search=0;
+		next;
+	}
+	if (search > 0) {
+		printf "%s%s", (search > 1) ? "," : "", $1;
+		next;
+	}
+	printf "nameserver %s\n", $1;
+}' > ${BSDINSTALL_TMPETC}/resolv.conf
 

Added: head/usr.sbin/bsdinstall/scripts/netconfig_ipv4
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ head/usr.sbin/bsdinstall/scripts/netconfig_ipv4	Sun May 29 21:24:20 2011	(r222468)
@@ -0,0 +1,85 @@
+#!/bin/sh
+#-
+# Copyright (c) 2011 Nathan Whitehorn
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+# 1. Redistributions of source code must retain the above copyright
+#    notice, this list of conditions and the following disclaimer.
+# 2. Redistributions in binary form must reproduce the above copyright
+#    notice, this list of conditions and the following disclaimer in the
+#    documentation and/or other materials provided with the distribution.
+#
+# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+# ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+# SUCH DAMAGE.
+#
+# $FreeBSD$
+
+: ${DIALOG_OK=0}
+: ${DIALOG_CANCEL=1}
+: ${DIALOG_HELP=2}
+: ${DIALOG_EXTRA=3}
+: ${DIALOG_ITEM_HELP=4}
+: ${DIALOG_ESC=255}
+
+INTERFACE=$1
+IFCONFIG_PREFIX="$2"
+case "${INTERFACE}" in
+"")	dialog --backtitle 'FreeBSD Installer' --title 'Network Configuration' \
+	    --msgbox 'No interface specified for IPv4 configuration.' 0 0
+	exit 1
+	;;
+esac
+
+dialog --backtitle 'FreeBSD Installer' --title 'Network Configuration' --yesno 'Would you like to use DHCP to configure this interface?' 0 0
+if [ $? -eq $DIALOG_OK ]; then
+	echo ifconfig_$INTERFACE=\"${IFCONFIG_PREFIX}DHCP\" >> $BSDINSTALL_TMPETC/rc.conf.net
+
+	if [ ! -z $BSDINSTALL_CONFIGCURRENT ]; then
+		dialog --backtitle 'FreeBSD Installer' --infobox "Acquiring DHCP lease..." 0 0
+		dhclient $INTERFACE 2>> $BSDINSTALL_LOG
+		if [ $? -ne 0 ]; then
+			dialog --backtitle 'FreeBSD Installer' --msgbox "DHCP lease acquisition failed." 0 0
+			exec $0 ${INTERFACE} "${IFCONFIG_PREFIX}"
+		fi
+	fi
+	exit 0
+fi
+
+IP_ADDRESS=`ifconfig $INTERFACE inet | awk '/inet/ {printf("%s\n", $2); }'`
+NETMASK=`ifconfig $INTERFACE inet | awk '/inet/ {printf("%s\n", $4); }'`
+ROUTER=`netstat -rn -f inet | awk '/default/ {printf("%s\n", $2);}'`
+
+exec 3>&1
+IF_CONFIG=$(dialog --backtitle 'FreeBSD Installer' --title 'Network Configuration' --form 'Static Network Interface Configuration' 0 0 0 \
+	'IP Address' 1 0 "$IP_ADDRESS" 1 20 16 0 \
+	'Subnet Mask' 2 0 "$NETMASK" 2 20 16 0 \
+	'Default Router' 3 0 "$ROUTER" 3 20 16 0 \
+2>&1 1>&3)
+if [ $? -eq $DIALOG_CANCEL ]; then exit 1; fi
+exec 3>&-
+
+echo $INTERFACE $IF_CONFIG | 
+    awk -v prefix="$IFCONFIG_PREFIX" '{
+	printf("ifconfig_%s=\"%s inet %s netmask %s\"\n", $1, prefix, $2, $3);
+	printf("defaultrouter=\"%s\"\n", $4);
+    }' >> $BSDINSTALL_TMPETC/rc.conf.net
+
+if [ ! -z $BSDINSTALL_CONFIGCURRENT ]; then
+	. $BSDINSTALL_TMPETC/rc.conf.net
+	ifconfig $INTERFACE inet `eval echo \\\$ifconfig_$INTERFACE`
+	route delete -inet default
+	route add -inet default $defaultrouter
+fi
+

Added: head/usr.sbin/bsdinstall/scripts/netconfig_ipv6
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ head/usr.sbin/bsdinstall/scripts/netconfig_ipv6	Sun May 29 21:24:20 2011	(r222468)
@@ -0,0 +1,149 @@
+#!/bin/sh
+#-
+# Copyright (c) 2011 Nathan Whitehorn
+# All rights reserved.
+# Copyright (c) 2011 The FreeBSD Foundation
+# All rights reserved.
+#
+# Portions of this software were developed by Bjoern Zeeb
+# under sponsorship from the FreeBSD Foundation.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+# 1. Redistributions of source code must retain the above copyright
+#    notice, this list of conditions and the following disclaimer.
+# 2. Redistributions in binary form must reproduce the above copyright
+#    notice, this list of conditions and the following disclaimer in the
+#    documentation and/or other materials provided with the distribution.
+#
+# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+# ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+# SUCH DAMAGE.
+#
+# $FreeBSD$
+
+#
+# TODO: 
+# - Add -R /sbin/resolvconf to rtsol once support is in tree.
+# - Add DHCPv6 support once FreeBSD ships with it.
+# 
+
+: ${DIALOG_OK=0}
+: ${DIALOG_CANCEL=1}
+: ${DIALOG_HELP=2}
+: ${DIALOG_EXTRA=3}
+: ${DIALOG_ITEM_HELP=4}
+: ${DIALOG_ESC=255}
+
+INTERFACE=$1
+case "${INTERFACE}" in
+"")	dialog --backtitle 'FreeBSD Installer' --title 'Network Configuration' \
+	    --msgbox 'No interface specified for IPv6 configuration.' 0 0
+	exit 1
+	;;
+esac
+
+AGAIN=""
+while : ; do
+	MSG="Would you like to try stateless address autoconfiguration (SLAAC)${AGAIN}?"
+	dialog --backtitle 'FreeBSD Installer' --title 'Network Configuration' \
+	    --yesno "${MSG}" 0 0
+	if [ $? -eq $DIALOG_OK ]; then
+		if [ ! -z $BSDINSTALL_CONFIGCURRENT ]; then
+			dialog --backtitle 'FreeBSD Installer' \
+			    --infobox "Sending Router Solicitation ..." 0 0
+			ifconfig ${INTERFACE} inet6 accept_rtadv up
+			rtsol -F $INTERFACE 2>> $BSDINSTALL_LOG
+			if [ $? -ne 0 ]; then
+				dialog --backtitle 'FreeBSD Installer' --msgbox "SLAAC failed." 0 0
+				AGAIN=" again"
+				continue
+			fi
+		fi
+		echo ifconfig_${INTERFACE}_ipv6=\"accept_rtadv\" >> $BSDINSTALL_TMPETC/rc.conf.net
+		exit 0
+	else
+		break
+	fi
+done
+
+ROUTER6=`netstat -Wrn -f inet6 | awk '/default/ {printf("%s\n", $2);}'`
+ADDRS=`ifconfig ${INTERFACE} inet6 | \
+awk  -v dfr="${ROUTER6}" '
+BEGIN {
+	n=0;
+}
+{
+	if (/inet6/) {
+		if (match($2, "^fe80:")) { next; };
+		# For the moment ignore all but the first address; it might confuse the user.
+		if (n > 0) { next; };
+		n++;
+		printf "\"IPv6 Address\" %d 0 \"%s/%s\" %d 16 50 0 0 ", n, $2, $4, n;
+	}
+}
+END {
+	if (n == 0) {
+		n++;
+		printf "\"IPv6 Address\" %d 0 \"\" %d 16 50 0 0 ", n, n;
+	}
+	n++;
+	# Nasty trick adding a (hidden, same y) read-only field as a marker
+	# to separate interface address(es) from the default router.
+	printf "\"Default Router\" %d 0 \"%s\" %d 16 50 0 2 ", n, "DefaultRouter", n;
+	printf "\"Default Router\" %d 0 \"%s\" %d 16 50 0 0 ", n, dfr, n;
+}'`
+
+exec 3>&1
+IF_CONFIG=$(echo ${ADDRS} | xargs dialog --backtitle 'FreeBSD Installer' \
+	--title 'Network Configuration' \
+	--mixedform 'Static IPv6 Network Interface Configuration' 0 0 0 \
+2>&1 1>&3)
+if [ $? -eq $DIALOG_CANCEL ]; then exit 1; fi
+exec 3>&-
+
+echo ${IF_CONFIG} | tr ' ' '\n' | \
+awk -v iface="${INTERFACE}" '
+BEGIN {
+	dfr=0;
+	count=0;
+}
+{
+	if (/^[[:space:]]+$/) {
+		next;
+	}
+	if (/DefaultRouter/) {
+		dfr=1;
+		next;
+	}
+	if (dfr == 1) {
+		printf("ipv6_defaultrouter=\"%s\"\n", $1);
+		next;
+	}
+	if (count > 0) {
+		# Ignore all but the first IP address for now.
+		next;
+	}
+	count++;
+	if (!match($1, "/")) {
+		sub("$", "/64", $1);
+	}
+	printf("ifconfig_%s_ipv6=\"inet6 %s\"\n", iface, $1);
+}' >> $BSDINSTALL_TMPETC/rc.conf.net
+
+if [ ! -z $BSDINSTALL_CONFIGCURRENT ]; then
+	. $BSDINSTALL_TMPETC/rc.conf.net
+	ifconfig ${INTERFACE} `eval echo \\\$ifconfig_${INTERFACE}_ipv6`
+	route delete default
+	route add default ${ipv6_defaultrouter}
+fi
+


More information about the svn-src-head mailing list