aboutsummaryrefslogtreecommitdiff
path: root/usr.sbin/bsdinstall/scripts/netconfig
diff options
context:
space:
mode:
Diffstat (limited to 'usr.sbin/bsdinstall/scripts/netconfig')
-rwxr-xr-xusr.sbin/bsdinstall/scripts/netconfig261
1 files changed, 261 insertions, 0 deletions
diff --git a/usr.sbin/bsdinstall/scripts/netconfig b/usr.sbin/bsdinstall/scripts/netconfig
new file mode 100755
index 000000000000..0f23ae134cb6
--- /dev/null
+++ b/usr.sbin/bsdinstall/scripts/netconfig
@@ -0,0 +1,261 @@
+#!/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.
+#
+
+BSDCFG_SHARE="/usr/share/bsdconfig"
+. $BSDCFG_SHARE/common.subr || exit 1
+
+INTERFACES=""
+BSDDIALOG_ITEMS=""
+
+: ${BSDDIALOG_OK=0}
+: ${BSDDIALOG_CANCEL=1}
+: ${BSDDIALOG_HELP=2}
+: ${BSDDIALOG_EXTRA=3}
+: ${BSDDIALOG_ESC=5}
+: ${BSDDIALOG_ERROR=255}
+
+for IF in `ifconfig -l`; do
+ test "$IF" = "lo0" && continue
+ (ifconfig -g wlan | egrep -wq $IF) && continue
+ INTERFACES="$INTERFACES $IF"
+done
+
+WIRELESS_INTERFACES="$(sysctl -in net.wlan.devices)"
+INTERFACES="$INTERFACES${WIRELESS_INTERFACES:+ }$WIRELESS_INTERFACES"
+is_wireless_if() {
+ for IF in $(sysctl -in net.wlan.devices); do
+ if [ $IF = $1 ]; then
+ return 0
+ fi
+ done
+ return 1
+}
+
+for IF in $INTERFACES; do
+ DESC=`sysctl -n dev.$(echo $IF | sed -E 's/([[:alpha:]]*)([[:digit:]]*)/\1.\2/g').%desc`
+ BSDDIALOG_ITEMS="$BSDDIALOG_ITEMS $IF \"$DESC\""
+done
+
+if [ -z "$INTERFACES" ]; then
+ bsddialog --backtitle "$OSNAME Installer" \
+ --title 'Network Configuration' \
+ --msgbox 'No network interfaces present to configure.' 0 0
+ exit 1
+fi
+
+exec 5>&1
+INTERFACE=$(echo $BSDDIALOG_ITEMS | xargs -o bsddialog \
+ --backtitle "$OSNAME Installer" --title 'Network Configuration' \
+ --ok-label 'Auto' --extra-button --extra-label 'Manual' \
+ --menu 'Please select a network interface and configuration mode:' 0 0 0 2>&1 1>&5)
+# xargs collapses exit codes to 0/1 (ignoring signals and 255), so exploit
+# bsddialog output being empty when cancelling to distinguish Manual (Extra)
+# from Cancel.
+if [ $? -eq $BSDDIALOG_OK ]; then
+ AUTO=auto
+else
+ if [ -z "$INTERFACE" ]; then
+ exit 1
+ fi
+ AUTO=
+fi
+exec 5>&-
+
+: > $BSDINSTALL_TMPETC/._rc.conf.net
+
+IFCONFIG_PREFIX=""
+if is_wireless_if $INTERFACE; then
+ NEXT_WLAN_IFACE=wlan0 # XXX
+ sysrc -f $BSDINSTALL_TMPETC/._rc.conf.net wlans_$INTERFACE="$NEXT_WLAN_IFACE"
+ IFCONFIG_PREFIX="WPA "
+ if [ ! -z $BSDINSTALL_CONFIGCURRENT ]; then
+ ifconfig $NEXT_WLAN_IFACE create wlandev $INTERFACE
+ ifconfig $NEXT_WLAN_IFACE up
+ fi
+ bsdinstall wlanconfig $NEXT_WLAN_IFACE || exec $0
+ INTERFACE="$NEXT_WLAN_IFACE"
+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
+
+AUTO_FAIL=
+if [ ${IPV4_AVAIL} -eq 1 -a -z "$AUTO" ]; then
+ bsddialog --backtitle "$OSNAME Installer" --title 'Network Configuration' \
+ --yesno 'Would you like to configure IPv4 for this interface?' 0 0
+ if [ $? -ne $BSDDIALOG_OK ]; then
+ IPV4_AVAIL=0
+ fi
+fi
+if [ ${IPV4_AVAIL} -eq 1 ]; then
+ bsdinstall netconfig_ipv4 ${INTERFACE} "${IFCONFIG_PREFIX}" $AUTO
+ if [ $? -ne $BSDDIALOG_OK ]; then
+ if [ -z "$AUTO" ]; then
+ exec $0
+ fi
+ IPV4_AVAIL=0
+ AUTO_FAIL="$AUTO_FAIL${AUTO_FAIL:+, }IPv4"
+ 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
+ sysrc -f $BSDINSTALL_TMPETC/._rc.conf.net ifconfig_$INTERFACE="${IFCONFIG_PREFIX}"
+fi
+if [ ${IPV6_AVAIL} -eq 1 -a -z "$AUTO" ]; then
+ bsddialog --backtitle "$OSNAME Installer" --title 'Network Configuration' \
+ --yesno 'Would you like to configure IPv6 for this interface?' 0 0
+ if [ $? -ne $BSDDIALOG_OK ]; then
+ IPV6_AVAIL=0
+ fi
+fi
+if [ ${IPV6_AVAIL} -eq 1 ]; then
+ bsdinstall netconfig_ipv6 ${INTERFACE} $AUTO
+ if [ $? -ne $BSDDIALOG_OK ]; then
+ if [ -z "$AUTO" ]; then
+ exec $0
+ fi
+ IPV6_AVAIL=0
+ AUTO_FAIL="$AUTO_FAIL${AUTO_FAIL:+, }IPv6"
+ fi
+fi
+
+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 1 \"${SEARCH}\" 1 16 50 50 0
+ 'Nameserver' 2 1 \"Nameserver\" 2 1 11 11 2
+ 'IPv6 DNS #1' 2 1 \"${IP6_1}\" 2 16 50 50 0
+ 'IPv6 DNS #2' 3 1 \"${IP6_2}\" 3 16 50 50 0
+ 'IPv4 DNS #1' 4 1 \"${IP4_1}\" 4 16 16 16 0
+ 'IPv4 DNS #2' 5 1 \"${IP4_2}\" 5 16 16 16 0"
+elif [ ${IPV6_AVAIL} -eq 1 ]; then
+ RESOLV="
+ 'Search' 1 1 \"${SEARCH}\" 1 16 50 50 0
+ 'Nameserver' 2 1 \"Nameserver\" 2 1 11 11 2
+ 'IPv6 DNS #1' 2 1 \"${IP6_1}\" 2 16 50 50 0
+ 'IPv6 DNS #2' 3 1 \"${IP6_2}\" 3 16 50 50 0"
+elif [ ${IPV4_AVAIL} -eq 1 ]; then
+ RESOLV="
+ 'Search' 1 1 \"${SEARCH}\" 1 16 50 50 0
+ 'Nameserver' 2 1 \"Nameserver\" 2 1 11 11 2
+ 'IPv4 DNS #1' 2 1 \"${IP4_1}\" 2 16 16 16 0
+ 'IPv4 DNS #2' 3 1 \"${IP4_2}\" 3 16 16 16 0"
+else
+ if [ -n "$AUTO_FAIL" ]; then
+ bsddialog --backtitle "$OSNAME Installer" \
+ --msgbox "Failed to automatically configure interface (tried $AUTO_FAIL)." 0 0
+ exec $0
+ fi
+ exit 0
+fi
+
+# Auto only guaranteed to have IPv4 and/or IPv6 address; may not have
+# nameserver available
+if [ -n "$AUTO" ] && [ -n "${IP4_1}" -o -n "${IP6_1}" ]; then
+ # Convert from bsddialog arguments to default output
+ RESOLV=$(echo "${RESOLV}" | xargs -n9 sh -c 'echo "$4"' '')
+else
+ exec 5>&1
+ RESOLV=$(echo "${RESOLV}" | xargs -o bsddialog --backtitle "$OSNAME Installer" \
+ --title 'Network Configuration' \
+ --mixedform 'Resolver Configuration' 0 0 0 \
+ 2>&1 1>&5)
+ if [ $? -eq $BSDDIALOG_CANCEL ]; then exec $0; fi
+ exec 5>&-
+fi
+
+echo ${RESOLV} | tr ' ' '\n' | \
+awk '
+BEGIN {
+ search=-1;
+}
+{
+ if (/^[[:space:]]+$/) {
+ next;
+ }
+ if (/^Nameserver$/) {
+ printf "\n";
+ search=0;
+ next;
+ }
+ if (search == -1) {
+ printf "search ";
+ search=1;
+ }
+ if (search > 0) {
+ printf "%s%s", (search > 1) ? " " : "", $1;
+ search++;
+ next;
+ }
+ printf "nameserver %s\n", $1;
+}' > ${BSDINSTALL_TMPETC}/resolv.conf
+
+mv $BSDINSTALL_TMPETC/._rc.conf.net $BSDINSTALL_TMPETC/rc.conf.net