1#!/bin/sh
2
3# installer - start installer frontend and backend as per pfi config.
4# $Id: installer,v 1.20 2005/04/13 03:32:16 cpressey Exp $
5
6### SUBS ###
7
8background_backend()
9{
10	RENDEZVOUS=$1
11	TRANSPORT=$2
12	$pfi_backend \
13	    -o $SOURCE_DIR \
14	    -r $RENDEZVOUS \
15	    -t $TRANSPORT \
16	    >/dev/null 2>&1
17	RESULT=$?
18	case "$RESULT" in
19	0)
20		;;
21	5)
22		$pfi_shutdown_command
23		;;
24	*)
25		;;
26	esac
27}
28
29installer_start()
30{
31	# Console start sequence:
32	# - Backend (and all other logging) goes to console (ttyv0)
33	# - curses frontend starts on ttyv1.
34	# - Uses vidcontrol -s 2 to switch to ttyv1 once the frontend is up.
35
36	echo -n "Starting installer.  "
37
38	if [ -r /etc/defaults/pfi.conf ]; then
39		. /etc/defaults/pfi.conf
40	fi
41
42	if [ -r /etc/pfi.conf ]; then
43		echo "Reading /etc/pfi.conf ..."
44		. /etc/pfi.conf
45	else
46		echo "/etc/pfi.conf not found, starting interactive install."
47	fi
48
49	# We can set up any install variables and such
50	# here by examining pfi_* variables.
51
52	if [ "X$pfi_run" != "X" ]; then
53		pfi_frontend=none
54		$pfi_run
55	fi
56
57	case "X$pfi_dfui_transport" in
58	Xnpipe)
59		RENDEZVOUS="installer"
60		;;
61	Xtcp)
62		RENDEZVOUS="9999"
63		;;
64	*)
65		echo "Unsupported DFUI transport '$pfi_dfui_transport'."
66		return
67		;;
68	esac
69
70	if [ "X$pfi_frontend" = "Xauto" ]; then
71		if [ "X$TTY_INST" = "X" ]; then
72		    if $(is_installmedia); then
73				TTY=/dev/ttyv1
74				pfi_frontend="cursesvty"
75			else
76				TTY=$(tty)
77				pfi_frontend="curseslog"
78			fi
79		else
80			pfi_frontend="cursesx11"
81		fi
82	fi
83
84	case "X$pfi_frontend" in
85	Xqt)
86		$pfi_backend \
87		    -o $SOURCE_DIR \
88		    -r $RENDEZVOUS \
89		    -t $pfi_dfui_transport
90		RESULT=$?
91		;;
92	Xcgi)
93		$pfi_backend \
94		    -o $SOURCE_DIR \
95		    -r $RENDEZVOUS \
96		    -t $pfi_dfui_transport
97		RESULT=$?
98		;;
99	Xcursesvty)
100		ps auwwwxxx > /tmp/ps.txt
101		if grep -q dfuife_curses /tmp/ps.txt; then
102			# Frontend is already running.
103		else
104			ESCDELAY=$pfi_curses_escdelay \
105			    /usr/sbin/dfuife_curses \
106				-r $RENDEZVOUS \
107				-t $pfi_dfui_transport \
108				-b /usr/share/installer/fred.txt \
109			    2>/dev/ttyv0 <$TTY >$TTY &
110		fi
111		rm -f /tmp/ps.txt
112		sleep 1
113		vidcontrol -s 2 </dev/ttyv0
114		$pfi_backend \
115		    -o $SOURCE_DIR \
116		    -r $RENDEZVOUS \
117		    -t $pfi_dfui_transport
118		RESULT=$?
119		sleep 1
120		killall dfuife_curses
121		vidcontrol -s 1 </dev/ttyv0
122		;;
123	Xcurseslog)
124		ps auwwwxxx > /tmp/ps.txt
125		if grep -q dfuife_curses /tmp/ps.txt; then
126			# Frontend is already running.
127		else
128			ESCDELAY=$pfi_curses_escdelay \
129			    /usr/sbin/dfuife_curses \
130				-r $RENDEZVOUS \
131				-t $pfi_dfui_transport \
132				-b /usr/share/installer/fred.txt \
133			    2>/tmp/dfuife_curses.log <$TTY >$TTY &
134		fi
135		rm -f /tmp/ps.txt
136		sleep 1
137		$pfi_backend \
138		    -o $SOURCE_DIR \
139		    -r $RENDEZVOUS \
140		    -t $pfi_dfui_transport \
141		    >/dev/null 2>&1
142		RESULT=$?
143		sleep 1
144		killall -q dfuife_curses
145		;;
146	Xcursesx11)
147		ps auwwwxxx > /tmp/ps.txt
148		if grep -q dfuife_curses /tmp/ps.txt; then
149			echo "Frontend is already running"
150		else
151			ESCDELAY=$pfi_curses_escdelay \
152			/usr/sbin/dfuife_curses \
153			-r $RENDEZVOUS \
154			-t $pfi_dfui_transport \
155			-b /usr/share/installer/fred.txt \
156			>$TTY_INST <$TTY_INST 2>&1 &
157		fi
158		rm -f /tmp/ps.txt
159		sleep 1
160		$pfi_backend \
161		    -o $SOURCE_DIR \
162		    -r $RENDEZVOUS \
163		    -t $pfi_dfui_transport
164		RESULT=$?
165		sleep 1
166		killall dfuife_curses
167		;;
168	Xnone)
169		RESULT=0
170		;;
171	*)
172		echo "Unknown installer frontend '$pfi_frontend'."
173		return
174		;;
175	esac
176
177	case "$RESULT" in
178	0)
179		;;
180	5)
181		$pfi_shutdown_command
182		;;
183	*)
184		;;
185	esac
186}
187
188is_installmedia()
189{
190    local _ttyv1=$(grep -w "^ttyv1" /etc/ttys)
191    local guest=$(sysctl -n kern.vmm_guest)
192
193    #
194    # ttyv1 isn't configured for the install media so use
195    # that as a clue for now. Vkernels will be forced
196    # to use 'curseslog' to avoid polluting its only
197    # terminal.
198    #
199    [ "${guest}" = "vkernel" ] && return 1;
200
201    if [ -z "${_ttyv1}" ]; then
202	return 0	# Return success, it's a USB image, ISO etc.
203    else
204	return 1
205    fi
206}
207
208### MAIN ###
209
210if [ $# -gt 1 ]; then
211	echo "usage: installer [source_directory]"
212	exit 1
213elif [ $# = 1 -a ! -d $1 ]; then
214	echo "source_directory does not exist or is no directory"
215	exit 1
216fi
217
218#
219# Source directory for the installation
220#
221if [ $# = 1 ]; then
222	SOURCE_DIR=$1
223else
224	SOURCE_DIR=/
225fi
226
227ps auwwwxxx > /tmp/ps.txt
228if grep -q dfuibe_installer /tmp/ps.txt; then
229	# Installer is already running. Log in normally.
230	rm -f /tmp/ps.txt
231else
232	rm -f /tmp/ps.txt
233	installer_start
234fi
235
236### END of installer ###
237