1*5a4dffacSNathan Whitehorn#!/bin/sh
2*5a4dffacSNathan Whitehorn#-
3*5a4dffacSNathan Whitehorn# Copyright (c) 2011 Nathan Whitehorn
4*5a4dffacSNathan Whitehorn# Copyright (c) 2013-2018 Devin Teske
5*5a4dffacSNathan Whitehorn# All rights reserved.
6*5a4dffacSNathan Whitehorn#
7*5a4dffacSNathan Whitehorn# Redistribution and use in source and binary forms, with or without
8*5a4dffacSNathan Whitehorn# modification, are permitted provided that the following conditions
9*5a4dffacSNathan Whitehorn# are met:
10*5a4dffacSNathan Whitehorn# 1. Redistributions of source code must retain the above copyright
11*5a4dffacSNathan Whitehorn#    notice, this list of conditions and the following disclaimer.
12*5a4dffacSNathan Whitehorn# 2. Redistributions in binary form must reproduce the above copyright
13*5a4dffacSNathan Whitehorn#    notice, this list of conditions and the following disclaimer in the
14*5a4dffacSNathan Whitehorn#    documentation and/or other materials provided with the distribution.
15*5a4dffacSNathan Whitehorn#
16*5a4dffacSNathan Whitehorn# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
17*5a4dffacSNathan Whitehorn# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
18*5a4dffacSNathan Whitehorn# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
19*5a4dffacSNathan Whitehorn# ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
20*5a4dffacSNathan Whitehorn# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
21*5a4dffacSNathan Whitehorn# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
22*5a4dffacSNathan Whitehorn# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
23*5a4dffacSNathan Whitehorn# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
24*5a4dffacSNathan Whitehorn# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
25*5a4dffacSNathan Whitehorn# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
26*5a4dffacSNathan Whitehorn# SUCH DAMAGE.
27*5a4dffacSNathan Whitehorn#
28*5a4dffacSNathan Whitehorn# $FreeBSD$
29*5a4dffacSNathan Whitehorn#
30*5a4dffacSNathan Whitehorn
31*5a4dffacSNathan Whitehornerror()
32*5a4dffacSNathan Whitehorn{
33*5a4dffacSNathan Whitehorn	dialog --backtitle "FreeBSD Installer" --title "Error" --msgbox $1 0 0
34*5a4dffacSNathan Whitehorn	exit 1
35*5a4dffacSNathan Whitehorn}
36*5a4dffacSNathan Whitehorn
37*5a4dffacSNathan WhitehornFETCH_DISTRIBUTIONS=""
38*5a4dffacSNathan WhitehornLOCAL_DISTRIBUTIONS=""
39*5a4dffacSNathan Whitehornfor dist in $DISTRIBUTIONS; do
40*5a4dffacSNathan Whitehorn	if [ ! -f $BSDINSTALL_DISTDIR/$dist ]; then
41*5a4dffacSNathan Whitehorn		FETCH_DISTRIBUTIONS="$FETCH_DISTRIBUTIONS $dist"
42*5a4dffacSNathan Whitehorn	else
43*5a4dffacSNathan Whitehorn		LOCAL_DISTRIBUTIONS="$LOCAL_DISTRIBUTIONS $dist"
44*5a4dffacSNathan Whitehorn	fi
45*5a4dffacSNathan Whitehorndone
46*5a4dffacSNathan WhitehornLOCAL_DISTRIBUTIONS=`echo $LOCAL_DISTRIBUTIONS`	# Trim white space
47*5a4dffacSNathan WhitehornFETCH_DISTRIBUTIONS=`echo $FETCH_DISTRIBUTIONS`	# Trim white space
48*5a4dffacSNathan Whitehorn
49*5a4dffacSNathan Whitehornif [ -z "$FETCH_DISTRIBUTIONS" ]; then
50*5a4dffacSNathan Whitehorn	echo $BSDINSTALL_DISTDIR >&2
51*5a4dffacSNathan Whitehorn	exit 0
52*5a4dffacSNathan Whitehornfi
53*5a4dffacSNathan Whitehorn
54*5a4dffacSNathan WhitehornALL_DISTRIBUTIONS="$DISTRIBUTIONS"
55*5a4dffacSNathan WhitehornWANT_DEBUG=
56*5a4dffacSNathan Whitehorn
57*5a4dffacSNathan Whitehorn# Download to a directory in the new system as scratch space
58*5a4dffacSNathan WhitehornBSDINSTALL_FETCHDEST="$BSDINSTALL_CHROOT/usr/freebsd-dist"
59*5a4dffacSNathan Whitehornmkdir -p "$BSDINSTALL_FETCHDEST" || error "Could not create directory $BSDINSTALL_FETCHDEST"
60*5a4dffacSNathan Whitehorn
61*5a4dffacSNathan Whitehornif [ -z "$BSDINSTALL_DISTSITE" ]; then
62*5a4dffacSNathan Whitehorn	exec 3>&1
63*5a4dffacSNathan Whitehorn	BSDINSTALL_DISTSITE=$(`dirname $0`/mirrorselect 2>&1 1>&3)
64*5a4dffacSNathan Whitehorn	MIRROR_BUTTON=$?
65*5a4dffacSNathan Whitehorn	exec 3>&-
66*5a4dffacSNathan Whitehorn	test $MIRROR_BUTTON -eq 0 || error "No mirror selected"
67*5a4dffacSNathan Whitehorn	export BSDINSTALL_DISTSITE
68*5a4dffacSNathan Whitehornfi
69*5a4dffacSNathan Whitehorn
70*5a4dffacSNathan WhitehornBSDINSTALL_DISTDIR_ORIG="$BSDINSTALL_DISTDIR"
71*5a4dffacSNathan Whitehornexport BSDINSTALL_DISTDIR="$BSDINSTALL_FETCHDEST"
72*5a4dffacSNathan Whitehornexport FTP_PASSIVE_MODE=YES
73*5a4dffacSNathan Whitehorn
74*5a4dffacSNathan Whitehornif [ -f "$BSDINSTALL_DISTDIR_ORIG/MANIFEST" ]; then
75*5a4dffacSNathan Whitehorn	cp "$BSDINSTALL_DISTDIR_ORIG/MANIFEST" "$BSDINSTALL_DISTDIR/MANIFEST"
76*5a4dffacSNathan Whitehorn	VERIFY_MANIFEST_SIG=0
77*5a4dffacSNathan Whitehornelse
78*5a4dffacSNathan Whitehorn	FETCH_DISTRIBUTIONS="MANIFEST $FETCH_DISTRIBUTIONS"
79*5a4dffacSNathan Whitehorn	VERIFY_MANIFEST_SIG=1
80*5a4dffacSNathan Whitehorn
81*5a4dffacSNathan Whitehorn	# XXX actually verify signature on manifest
82*5a4dffacSNathan Whitehorn	dialog --backtitle "FreeBSD Installer" --title "Warning" --msgbox "Manifest not found on local disk and will be fetched from an unverified source. This is a potential security risk. If you do not wish to proceed, press control-C now." 0 0
83*5a4dffacSNathan Whitehornfi
84*5a4dffacSNathan Whitehorn
85*5a4dffacSNathan Whitehornif [ ! -z "$LOCAL_DISTRIBUTIONS" ]; then
86*5a4dffacSNathan Whitehorn	# Copy local stuff first
87*5a4dffacSNathan Whitehorn	env DISTRIBUTIONS="$LOCAL_DISTRIBUTIONS" \
88*5a4dffacSNathan Whitehorn		BSDINSTALL_DISTSITE="file://$BSDINSTALL_DISTDIR" \
89*5a4dffacSNathan Whitehorn		bsdinstall distfetch || \
90*5a4dffacSNathan Whitehorn		error "Failed to fetch distribution from local media"
91*5a4dffacSNathan Whitehornfi
92*5a4dffacSNathan Whitehorn
93*5a4dffacSNathan Whitehornexport DISTRIBUTIONS="$FETCH_DISTRIBUTIONS"
94*5a4dffacSNathan Whitehorn
95*5a4dffacSNathan Whitehorn# Iterate through the distribution list and set a flag if debugging
96*5a4dffacSNathan Whitehorn# distributions have been selected.
97*5a4dffacSNathan Whitehornfor _DISTRIBUTION in $DISTRIBUTIONS; do
98*5a4dffacSNathan Whitehorn	case $_DISTRIBUTION in
99*5a4dffacSNathan Whitehorn		*-dbg.*)
100*5a4dffacSNathan Whitehorn			[ -e $BSDINSTALL_DISTDIR/$_DISTRIBUTION ] \
101*5a4dffacSNathan Whitehorn				&& continue
102*5a4dffacSNathan Whitehorn			WANT_DEBUG=1
103*5a4dffacSNathan Whitehorn			DEBUG_LIST="\n$DEBUG_LIST\n$_DISTRIBUTION"
104*5a4dffacSNathan Whitehorn			;;
105*5a4dffacSNathan Whitehorn		*)
106*5a4dffacSNathan Whitehorn			;;
107*5a4dffacSNathan Whitehorn	esac
108*5a4dffacSNathan Whitehorndone
109*5a4dffacSNathan Whitehorn
110*5a4dffacSNathan Whitehorn# Fetch the distributions.
111*5a4dffacSNathan Whitehornbsdinstall distfetch
112*5a4dffacSNathan Whitehornrc=$?
113*5a4dffacSNathan Whitehorn
114*5a4dffacSNathan Whitehornif [ $rc -ne 0 ]; then
115*5a4dffacSNathan Whitehorn	# If unable to fetch the remote distributions, recommend
116*5a4dffacSNathan Whitehorn	# deselecting the debugging distributions, and retrying the
117*5a4dffacSNathan Whitehorn	# installation, since failure to fetch *-dbg.txz should not
118*5a4dffacSNathan Whitehorn	# be considered a fatal installation error.
119*5a4dffacSNathan Whitehorn	msg="Failed to fetch remote distribution"
120*5a4dffacSNathan Whitehorn	if [ ! -z "$WANT_DEBUG" ]; then
121*5a4dffacSNathan Whitehorn		# Trim leading and trailing newlines.
122*5a4dffacSNathan Whitehorn		DEBUG_LIST="${DEBUG_LIST%%\n}"
123*5a4dffacSNathan Whitehorn		DEBUG_LIST="${DEBUG_LIST##\n}"
124*5a4dffacSNathan Whitehorn		msg="$msg\n\nPlease deselect the following distributions"
125*5a4dffacSNathan Whitehorn		msg="$msg and retry the installation:"
126*5a4dffacSNathan Whitehorn		msg="$msg\n$DEBUG_LIST"
127*5a4dffacSNathan Whitehorn	fi
128*5a4dffacSNathan Whitehorn	error "$msg"
129*5a4dffacSNathan Whitehornfi
130*5a4dffacSNathan Whitehorn
131*5a4dffacSNathan Whitehornecho $BSDINSTALL_DISTDIR >&2
132*5a4dffacSNathan Whitehorn
133