]> CyberLeo.Net >> Repos - FreeBSD/releng/9.2.git/blob - usr.sbin/bsdinstall/scripts/netconfig_ipv6
- Copy stable/9 to releng/9.2 as part of the 9.2-RELEASE cycle.
[FreeBSD/releng/9.2.git] / usr.sbin / bsdinstall / scripts / netconfig_ipv6
1 #!/bin/sh
2 #-
3 # Copyright (c) 2011 Nathan Whitehorn
4 # All rights reserved.
5 # Copyright (c) 2011 The FreeBSD Foundation
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 #
35 # TODO: 
36 # - Add DHCPv6 support once FreeBSD ships with it.
37
38
39 : ${DIALOG_OK=0}
40 : ${DIALOG_CANCEL=1}
41 : ${DIALOG_HELP=2}
42 : ${DIALOG_EXTRA=3}
43 : ${DIALOG_ITEM_HELP=4}
44 : ${DIALOG_ESC=255}
45
46 INTERFACE=$1
47 case "${INTERFACE}" in
48 "")     dialog --backtitle 'FreeBSD Installer' --title 'Network Configuration' \
49             --msgbox 'No interface specified for IPv6 configuration.' 0 0
50         exit 1
51         ;;
52 esac
53
54 AGAIN=""
55 while : ; do
56         MSG="Would you like to try stateless address autoconfiguration (SLAAC)${AGAIN}?"
57         dialog --backtitle 'FreeBSD Installer' --title 'Network Configuration' \
58             --yesno "${MSG}" 0 0
59         if [ $? -eq $DIALOG_OK ]; then
60                 if [ ! -z $BSDINSTALL_CONFIGCURRENT ]; then
61                         dialog --backtitle 'FreeBSD Installer' \
62                             --infobox "Sending Router Solicitation ..." 0 0
63                         ifconfig ${INTERFACE} inet6 -ifdisabled accept_rtadv up
64                         rtsol -F $INTERFACE 2>> $BSDINSTALL_LOG
65                         if [ $? -ne 0 ]; then
66                                 dialog --backtitle 'FreeBSD Installer' --msgbox "SLAAC failed." 0 0
67                                 AGAIN=" again"
68                                 continue
69                         fi
70                 fi
71                 echo ifconfig_${INTERFACE}_ipv6=\"inet6 accept_rtadv\" >> $BSDINSTALL_TMPETC/._rc.conf.net
72                 exit 0
73         else
74                 break
75         fi
76 done
77
78 ROUTER6=`netstat -Wrn -f inet6 | awk '/default/ {printf("%s\n", $2);}'`
79 ADDRS=`ifconfig ${INTERFACE} inet6 | \
80 awk  -v dfr="${ROUTER6}" '
81 BEGIN {
82         n=0;
83 }
84 {
85         if (/inet6/) {
86                 if (match($2, "^fe80:")) { next; };
87                 # For the moment ignore all but the first address; it might confuse the user.
88                 if (n > 0) { next; };
89                 n++;
90                 printf "\"IPv6 Address\" %d 0 \"%s/%s\" %d 16 50 0 0 ", n, $2, $4, n;
91         }
92 }
93 END {
94         if (n == 0) {
95                 n++;
96                 printf "\"IPv6 Address\" %d 0 \"\" %d 16 50 0 0 ", n, n;
97         }
98         n++;
99         # Nasty trick adding a (hidden, same y) read-only field as a marker
100         # to separate interface address(es) from the default router.
101         printf "\"Default Router\" %d 0 \"%s\" %d 16 50 0 2 ", n, "DefaultRouter", n;
102         printf "\"Default Router\" %d 0 \"%s\" %d 16 50 0 0 ", n, dfr, n;
103 }'`
104
105 exec 3>&1
106 IF_CONFIG=$(echo ${ADDRS} | xargs dialog --backtitle 'FreeBSD Installer' \
107         --title 'Network Configuration' \
108         --mixedform 'Static IPv6 Network Interface Configuration' 0 0 0 \
109 2>&1 1>&3)
110 if [ $? -eq $DIALOG_CANCEL ]; then exit 1; fi
111 exec 3>&-
112
113 echo ${IF_CONFIG} | tr ' ' '\n' | \
114 awk -v iface="${INTERFACE}" '
115 BEGIN {
116         dfr=0;
117         count=0;
118 }
119 {
120         if (/^[[:space:]]+$/) {
121                 next;
122         }
123         if (/DefaultRouter/) {
124                 dfr=1;
125                 next;
126         }
127         if (dfr == 1) {
128                 printf("ipv6_defaultrouter=\"%s\"\n", $1);
129                 next;
130         }
131         if (count > 0) {
132                 # Ignore all but the first IP address for now.
133                 next;
134         }
135         count++;
136         if (!match($1, "/")) {
137                 sub("$", "/64", $1);
138         }
139         printf("ifconfig_%s_ipv6=\"inet6 %s\"\n", iface, $1);
140 }' >> $BSDINSTALL_TMPETC/._rc.conf.net
141
142 if [ ! -z $BSDINSTALL_CONFIGCURRENT ]; then
143         . $BSDINSTALL_TMPETC/._rc.conf.net
144         ifconfig ${INTERFACE} `eval echo \\\$ifconfig_${INTERFACE}_ipv6`
145         if [ -n "${ipv6_defaultrouter}" ]; then
146                 route delete -inet6 default
147                 route add -inet6 default ${ipv6_defaultrouter}
148         fi
149 fi
150