sbin/fsck_hammer2: Fix destination FILE* in print_media()
[dragonfly.git] / usr.sbin / installer / installer / installer.sh
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 cleanup()
8 {
9         killall -q dfuife_curses dfuibe_installer
10 }
11
12 background_backend()
13 {
14         RENDEZVOUS=$1
15         TRANSPORT=$2
16         $pfi_backend \
17             -o $SOURCE_DIR \
18             -r $RENDEZVOUS \
19             -t $TRANSPORT \
20             >/dev/null 2>&1
21         RESULT=$?
22         case "$RESULT" in
23         0)
24                 ;;
25         5)
26                 $pfi_shutdown_command
27                 ;;
28         *)
29                 ;;
30         esac
31 }
32
33 is_serial()
34 {
35         # Detect if we are currently connected via a serial console
36         if [ "X`/usr/bin/kenv -q console`" == "Xcomconsole" ]; then
37                 return 0 # return success
38         fi
39         return 1
40 }
41
42 setup_term()
43 {
44         # If TERM has not been set manually (ie: still 'dialup' or from /etc/ttyd), we ask the user what they want to use
45         if [ "X`tty |cut -c6-9`" == "Xttyd" ]; then
46                 newterm=${TERM}
47                 if [ "X`/usr/bin/kenv smbios.bios.vendor`" == "XSeaBIOS" ]; then
48                         # installation on a virtial machine uses this type of simulated bios often, so we can do better than vt100 (eg:vt220-co, vt320-co, cons50-w)
49                         newterm="xterm"
50                 elif [ "X${TERM}" == "Xdialup" ]; then
51                         newterm="vt100"
52                 fi
53                 echo ""
54                 echo -n "What is your terminal type (provide value termcap name)? [${newterm}]: "
55                 read input
56                 [ "${input}" = '' ] && input=$newterm
57                 export TERM="${input}"
58                 echo "set new TERM=$TERM"
59         fi
60         TTY_BAUD=`stty speed`
61         if [ $TTY_BAUD -lt 38400 ]; then
62                 echo -n "Your serial connection is quite slow ($TTY_BAUD), causing installer slow down. Continue Anyway ? [Y/n]: "
63                 read input
64                 [ "${input}" == "N" ] || [ "${input}" == "n" ] && exit 0
65         fi
66 }
67
68 installer_start()
69 {
70         # Console start sequence:
71         # - Backend (and all other logging) goes to console (ttyv0)
72         # - curses frontend starts on ttyv1.
73         # - Uses vidcontrol -s 2 to switch to ttyv1 once the frontend is up.
74
75         echo -n "Starting installer.  "
76
77         if [ -r /etc/defaults/pfi.conf ]; then
78                 . /etc/defaults/pfi.conf
79         fi
80
81         if [ -r /etc/pfi.conf ]; then
82                 echo "Reading /etc/pfi.conf ..."
83                 . /etc/pfi.conf
84         else
85                 echo "/etc/pfi.conf not found, starting interactive install."
86         fi
87
88         # We can set up any install variables and such
89         # here by examining pfi_* variables.
90
91         if [ "X$pfi_run" != "X" ]; then
92                 pfi_frontend=none
93                 $pfi_run
94         fi
95
96         case "X$pfi_dfui_transport" in
97         Xnpipe)
98                 RENDEZVOUS="installer"
99                 ;;
100         Xtcp)
101                 RENDEZVOUS="9999"
102                 ;;
103         *)
104                 echo "Unsupported DFUI transport '$pfi_dfui_transport'."
105                 return
106                 ;;
107         esac
108
109         if [ "X$pfi_frontend" = "Xauto" ]; then
110                 if [ "X$TTY_INST" = "X" ]; then
111                         if $(is_serial); then
112                                 setup_term
113                                 RENDEZVOUS="installer"
114                                 pfi_dfui_transport="npipe"
115                                 TTY=$(tty)
116                                 pfi_frontend="curseslog"
117                         else
118                                 if $(is_installmedia); then
119                                         TTY=/dev/ttyv1
120                                         pfi_frontend="cursesvty"
121                                 else
122                                         TTY=$(tty)
123                                         pfi_frontend="curseslog"
124                                 fi
125                         fi
126                 else
127                         pfi_frontend="cursesx11"
128                 fi
129         fi
130
131         case "X$pfi_frontend" in
132         Xqt)
133                 $pfi_backend \
134                     -o $SOURCE_DIR \
135                     -r $RENDEZVOUS \
136                     -t $pfi_dfui_transport
137                 RESULT=$?
138                 ;;
139         Xcgi)
140                 $pfi_backend \
141                     -o $SOURCE_DIR \
142                     -r $RENDEZVOUS \
143                     -t $pfi_dfui_transport
144                 RESULT=$?
145                 ;;
146         Xcursesvty)
147                 ps auwwwxxx > /tmp/ps.txt
148                 if grep -q dfuife_curses /tmp/ps.txt; then
149                         # 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                             2>/dev/ttyv0 <$TTY >$TTY &
157                 fi
158                 rm -f /tmp/ps.txt
159                 sleep 1
160                 vidcontrol -s 2 </dev/ttyv0
161                 $pfi_backend \
162                     -o $SOURCE_DIR \
163                     -r $RENDEZVOUS \
164                     -t $pfi_dfui_transport
165                 RESULT=$?
166                 sleep 1
167                 killall dfuife_curses
168                 vidcontrol -s 1 </dev/ttyv0
169                 ;;
170         Xcurseslog)
171                 ps auwwwxxx > /tmp/ps.txt
172                 if grep -q dfuife_curses /tmp/ps.txt; then
173                         # Frontend is already running.
174                 else
175                         ESCDELAY=$pfi_curses_escdelay \
176                             /usr/sbin/dfuife_curses \
177                                 -r $RENDEZVOUS \
178                                 -t $pfi_dfui_transport \
179                                 -b /usr/share/installer/fred.txt \
180                             2>/tmp/dfuife_curses.log <$TTY >$TTY &
181                 fi
182                 rm -f /tmp/ps.txt
183                 sleep 1
184                 $pfi_backend \
185                     -o $SOURCE_DIR \
186                     -r $RENDEZVOUS \
187                     -t $pfi_dfui_transport \
188                     >/dev/null 2>&1
189                 RESULT=$?
190                 sleep 1
191                 killall -q dfuife_curses
192                 ;;
193         Xcursesx11)
194                 ps auwwwxxx > /tmp/ps.txt
195                 if grep -q dfuife_curses /tmp/ps.txt; then
196                         echo "Frontend is already running"
197                 else
198                         ESCDELAY=$pfi_curses_escdelay \
199                         /usr/sbin/dfuife_curses \
200                         -r $RENDEZVOUS \
201                         -t $pfi_dfui_transport \
202                         -b /usr/share/installer/fred.txt \
203                         >$TTY_INST <$TTY_INST 2>&1 &
204                 fi
205                 rm -f /tmp/ps.txt
206                 sleep 1
207                 $pfi_backend \
208                     -o $SOURCE_DIR \
209                     -r $RENDEZVOUS \
210                     -t $pfi_dfui_transport
211                 RESULT=$?
212                 sleep 1
213                 killall dfuife_curses
214                 ;;
215         Xnone)
216                 RESULT=0
217                 ;;
218         *)
219                 echo "Unknown installer frontend '$pfi_frontend'."
220                 return
221                 ;;
222         esac
223
224         case "$RESULT" in
225         0)
226                 ;;
227         5)
228                 $pfi_shutdown_command
229                 ;;
230         *)
231                 ;;
232         esac
233 }
234
235 is_installmedia()
236 {
237     local _ttyv1=$(grep -w "^ttyv1" /etc/ttys)
238     local guest=$(sysctl -n kern.vmm_guest)
239
240     #
241     # ttyv1 isn't configured for the install media so use
242     # that as a clue for now. Vkernels will be forced
243     # to use 'curseslog' to avoid polluting its only
244     # terminal.
245     #
246     [ "${guest}" = "vkernel" ] && return 1;
247
248     if [ -z "${_ttyv1}" ]; then
249         return 0        # Return success, it's a USB image, ISO etc.
250     else
251         return 1
252     fi
253 }
254
255 ### MAIN ###
256
257 if [ $# -gt 1 ]; then
258         echo "usage: installer [source_directory]"
259         exit 1
260 elif [ $# = 1 -a ! -d $1 ]; then
261         echo "source_directory does not exist or is no directory"
262         exit 1
263 fi
264
265 trap cleanup EXIT SIGTERM SIGINT
266
267 #
268 # Source directory for the installation
269 #
270 if [ $# = 1 ]; then
271         SOURCE_DIR=$1
272 else
273         SOURCE_DIR=/
274 fi
275
276 ps auwwwxxx > /tmp/ps.txt
277 if grep -q dfuibe_installer /tmp/ps.txt; then
278         # Installer is already running. Log in normally.
279         rm -f /tmp/ps.txt
280 else
281         rm -f /tmp/ps.txt
282         installer_start
283 fi
284
285 ### END of installer ###