]> CyberLeo.Net >> Repos - FreeBSD/releng/10.2.git/blob - usr.sbin/bsdinstall/scripts/netconfig_ipv6
- Copy stable/10@285827 to releng/10.2 in preparation for 10.2-RC1
[FreeBSD/releng/10.2.git] / usr.sbin / bsdinstall / scripts / netconfig_ipv6
1 #!/bin/sh
2 #-
3 # Copyright (c) 2011 Nathan Whitehorn
4 # Copyright (c) 2011 The FreeBSD Foundation
5 # Copyright (c) 2013 Devin Teske
6 # All rights reserved.
7 #
8 # Portions of this software were developed by Bjoern Zeeb
9 # under sponsorship from the FreeBSD Foundation.
10 #
11 # Redistribution and use in source and binary forms, with or without
12 # modification, are permitted provided that the following conditions
13 # are met:
14 # 1. Redistributions of source code must retain the above copyright
15 #    notice, this list of conditions and the following disclaimer.
16 # 2. Redistributions in binary form must reproduce the above copyright
17 #    notice, this list of conditions and the following disclaimer in the
18 #    documentation and/or other materials provided with the distribution.
19 #
20 # THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
21 # ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
22 # IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
23 # ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
24 # FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
25 # DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
26 # OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
27 # HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
28 # LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
29 # OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
30 # SUCH DAMAGE.
31 #
32 # $FreeBSD$
33 #
34 ############################################################ INCLUDES
35
36 BSDCFG_SHARE="/usr/share/bsdconfig"
37 . $BSDCFG_SHARE/common.subr || exit 1
38 f_dprintf "%s: loading includes..." "$0"
39 f_include $BSDCFG_SHARE/dialog.subr
40
41 ############################################################ MAIN
42
43 #
44 # TODO: 
45 # - Add DHCPv6 support once FreeBSD ships with it.
46
47
48 INTERFACE=$1
49 case "${INTERFACE}" in
50 "")     dialog --backtitle 'FreeBSD Installer' --title 'Network Configuration' \
51             --msgbox 'No interface specified for IPv6 configuration.' 0 0
52         exit 1
53         ;;
54 esac
55
56 AGAIN=""
57 while : ; do
58         MSG="Would you like to try stateless address autoconfiguration (SLAAC)${AGAIN}?"
59         dialog --backtitle 'FreeBSD Installer' --title 'Network Configuration' \
60             --yesno "${MSG}" 0 0
61         if [ $? -eq $DIALOG_OK ]; then
62                 if [ ! -z $BSDINSTALL_CONFIGCURRENT ]; then
63                         dialog --backtitle 'FreeBSD Installer' \
64                             --infobox "Sending Router Solicitation ..." 0 0
65                         ifconfig ${INTERFACE} inet6 -ifdisabled accept_rtadv up
66                         err=$( rtsol -F $INTERFACE 2>&1 )
67                         if [ $? -ne 0 ]; then
68                                 f_dprintf "%s" "$err"
69                                 dialog --backtitle 'FreeBSD Installer' --msgbox "SLAAC failed." 0 0
70                                 AGAIN=" again"
71                                 continue
72                         fi
73                 fi
74                 echo ifconfig_${INTERFACE}_ipv6=\"inet6 accept_rtadv\" >> $BSDINSTALL_TMPETC/._rc.conf.net
75                 exit 0
76         else
77                 break
78         fi
79 done
80
81 ROUTER6=`netstat -Wrn -f inet6 | awk '/default/ {printf("%s\n", $2);}'`
82 ADDRS=`ifconfig ${INTERFACE} inet6 | \
83 awk  -v dfr="${ROUTER6}" '
84 BEGIN {
85         n=0;
86 }
87 {
88         if (/inet6/) {
89                 if (match($2, "^fe80:")) { next; };
90                 # For the moment ignore all but the first address; it might confuse the user.
91                 if (n > 0) { next; };
92                 n++;
93                 printf "\"IPv6 Address\" %d 0 \"%s/%s\" %d 16 50 0 0 ", n, $2, $4, n;
94         }
95 }
96 END {
97         if (n == 0) {
98                 n++;
99                 printf "\"IPv6 Address\" %d 0 \"\" %d 16 50 0 0 ", n, n;
100         }
101         n++;
102         # Nasty trick adding a (hidden, same y) read-only field as a marker
103         # to separate interface address(es) from the default router.
104         printf "\"Default Router\" %d 0 \"%s\" %d 16 50 0 2 ", n, "DefaultRouter", n;
105         printf "\"Default Router\" %d 0 \"%s\" %d 16 50 0 0 ", n, dfr, n;
106 }'`
107
108 exec 3>&1
109 IF_CONFIG=$(echo ${ADDRS} | xargs dialog --backtitle 'FreeBSD Installer' \
110         --title 'Network Configuration' \
111         --mixedform 'Static IPv6 Network Interface Configuration' 0 0 0 \
112 2>&1 1>&3)
113 if [ $? -eq $DIALOG_CANCEL ]; then exit 1; fi
114 exec 3>&-
115
116 echo ${IF_CONFIG} | tr ' ' '\n' | \
117 awk -v iface="${INTERFACE}" '
118 BEGIN {
119         dfr=0;
120         count=0;
121 }
122 {
123         if (/^[[:space:]]+$/) {
124                 next;
125         }
126         if (/DefaultRouter/) {
127                 dfr=1;
128                 next;
129         }
130         if (dfr == 1) {
131                 printf("ipv6_defaultrouter=\"%s\"\n", $1);
132                 next;
133         }
134         if (count > 0) {
135                 # Ignore all but the first IP address for now.
136                 next;
137         }
138         count++;
139         if (!match($1, "/")) {
140                 sub("$", "/64", $1);
141         }
142         printf("ifconfig_%s_ipv6=\"inet6 %s\"\n", iface, $1);
143 }' >> $BSDINSTALL_TMPETC/._rc.conf.net
144
145 if [ ! -z $BSDINSTALL_CONFIGCURRENT ]; then
146         . $BSDINSTALL_TMPETC/._rc.conf.net
147         ifconfig ${INTERFACE} `eval echo \\\$ifconfig_${INTERFACE}_ipv6`
148         if [ -n "${ipv6_defaultrouter}" ]; then
149                 route delete -inet6 default
150                 route add -inet6 default ${ipv6_defaultrouter}
151         fi
152 fi
153
154 ################################################################################
155 # END
156 ################################################################################