tazpanel view installer.cgi @ rev 258

installer.cgi: setup file created later, first partitionnot set as default anymore and other bugs fixes
author Dominique Corbex <domcox@slitaz.org>
date Thu Mar 01 21:48:22 2012 +0100 (2012-03-01)
parents 96bca72731bb
children 287584977263
line source
1 #!/bin/sh
2 #
3 # Main CGI interface for Tazinst, the SliTaz installer.
4 #
5 # Copyright (C) 2012 SliTaz GNU/Linux - BSD License
6 #
7 # Authors : Dominique Corbex <domcox@slitaz.org>
8 #
10 VERSION=0.25
12 # Common functions from libtazpanel
13 . lib/libtazpanel
14 header
15 get_config
17 # Include gettext helper script.
18 . /usr/bin/gettext.sh
20 # Export package name for gettext.
21 TEXTDOMAIN='installer'
22 export TEXTDOMAIN
24 TITLE="- Installer"
26 # Tazinst required version
27 TAZINST_REQUIRED_VERSION="3.3"
29 # Tazinst setup file
30 INSTFILE=/var/lib/tazinst.conf
33 write_setup()
34 {
35 if [ -e "$INSTFILE" ]; then
36 # Install type
37 INST_TYPE=$(GET INST_TYPE)
38 # Source File
39 case "$INST_TYPE" in
40 usb)
41 SRC_FILE=$(GET SRC_USB) ;;
42 iso)
43 SRC_FILE=$(GET SRC_ISO) ;;
44 web)
45 SRC_FILE=$(GET SRC_WEB) ;;
46 esac
47 SRC_FILE=$(echo "$SRC_FILE" | sed 's/\//\\\//'g)
48 [ -n $(GET URL) ] && SRC_WEB=$(GET URL)
49 # Main Partition
50 TGT_PARTITION=$(echo "$(GET TGT_PARTITION)" | sed 's/\//\\\//'g)
51 [ -n "$(GET MAIN_FMT)" ] && TGT_FS=$(GET MAIN_FS) || TGT_FS=""
52 # Home Partition
53 if [ -n "$(GET HOME_SELECT)" ] ; then
54 TGT_HOME=$(echo "$(GET TGT_HOME)" | sed 's/\//\\\//'g)
55 [ -n "$(GET HOME_FS)" ] && TGT_HOME_FS=$(GET HOME_FS)
56 else
57 TGT_HOME=""
58 TGT_HOME_FS=""
59 fi
60 # Hostname
61 TGT_HOSTNAME=$(GET TGT_HOSTNAME)
62 # Root pwd
63 TGT_ROOT_PWD=$(GET TGT_ROOT_PWD)
64 # User Login
65 TGT_USER=$(GET TGT_USER)
66 # User Pwd
67 TGT_USER_PWD=$(GET TGT_USER_PWD)
68 # Grub
69 TGT_GRUB=$(GET TGT_GRUB)
70 [ "$TGT_GRUB" == "yes" ] || TGT_GRUB=no
71 # Win Dual-Boot
72 TGT_WINBOOT=$(GET TGT_WINBOOT)
74 # Save changes to INSTFILE
75 sed -i s/"^INST_TYPE=.*"/"INST_TYPE=\"$INST_TYPE\"/" $INSTFILE
76 sed -i s/"^SRC_FILE=.*"/"SRC_FILE=\"$SRC_FILE\"/" $INSTFILE
77 sed -i s/"^TGT_PARTITION=.*"/"TGT_PARTITION=\"$TGT_PARTITION\"/" $INSTFILE
78 sed -i s/"^TGT_FS=.*"/"TGT_FS=\"$TGT_FS\"/" $INSTFILE
79 sed -i s/"^TGT_HOME=.*"/"TGT_HOME=\"$TGT_HOME\"/" $INSTFILE
80 sed -i s/"^TGT_HOME_FS=.*"/"TGT_HOME_FS=\"$TGT_HOME_FS\"/" $INSTFILE
81 sed -i s/"^TGT_HOSTNAME=.*"/"TGT_HOSTNAME=\"$TGT_HOSTNAME\"/" $INSTFILE
82 sed -i s/"^TGT_ROOT_PWD=.*"/"TGT_ROOT_PWD=\"$TGT_ROOT_PWD\"/" $INSTFILE
83 sed -i s/"^TGT_USER=.*"/"TGT_USER=\"$TGT_USER\"/" $INSTFILE
84 sed -i s/"^TGT_USER_PWD=.*"/"TGT_USER_PWD=\"$TGT_USER_PWD\"/" $INSTFILE
85 sed -i s/"^TGT_GRUB=.*"/"TGT_GRUB=\"$TGT_GRUB\"/" $INSTFILE
86 sed -i s/"^TGT_WINBOOT=.*"/"TGT_WINBOOT=\"$TGT_WINBOOT\"/" $INSTFILE
87 fi
88 }
90 read_setup()
91 {
92 # various checks on setup file
93 if [ -e "$INSTFILE" ]; then
94 # validity check + reformat output
95 IFS=$'\n'
96 for line in $(tazinst check $INSTFILE)
97 do
98 line=$(echo $line | sed 's/\[1m//g')
99 line=$(echo $line | sed 's/\[0m//g')
100 line=$(echo $line | sed 's/\s/\&nbsp;/g')
101 line=$(echo $line | sed 's/</\&lt;/g')
102 line=$(echo $line | sed 's/>/\&gt;/g')
103 echo "<font color=\"red\">$line<br /></font>"
104 done
105 unset IFS
106 else
107 # no setup file found: creating
108 gettext "Creating setup file $INSTFILE."
109 tazinst new $INSTFILE
110 if [ ! -e "$INSTFILE" ]; then
111 cat <<EOT
112 <font color="red">$(gettext "Setup File Error")<br />
113 $(gettext "The setup file <strong>$INSTFILE</strong> doesn't exist.")</font><br />
114 EOT
115 else
116 if [ ! -r $INSTFILE ]; then
117 cat <<EOT
118 <font color="red">$(gettext "Setup File Error")<br />
119 $(gettext "The setup file <strong>$INSTFILE</strong> is not readable.
120 Check permissions and ownership.")</font><br />
121 EOT
122 fi
123 fi
124 fi
125 # read setup file
126 . $INSTFILE
127 }
129 select_action()
130 {
131 cat <<EOT
132 <div id="wrapper">
133 <h2>$(gettext "SliTaz Installer")</h2>
134 <p>$(gettext "The SliTaz Installer installs or upgrades SliTaz to a hard disk
135 drive from a device like a Live-CD or LiveUSB key, from a SliTaz ISO file, or
136 from the web by downloading an ISO file.")<p>
137 </div>
138 EOT
139 }
141 select_gparted()
142 {
143 cat <<EOT
144 <div class="box">
145 <h4>$(gettext "About")</h4>
146 <p>
147 $(gettext "Before installation, you may need to resize partitions
148 on your hard disk drive in order to make space for SliTaz GNU/Linux.
149 You can graphically manage your partitions with Gparted")
150 </p>
151 </div>
152 <a class="button" href="$SCRIPT_NAME?page=gparted">$(gettext "Execute Gparted")</a>
153 EOT
154 }
156 select_install()
157 {
158 cat <<EOT
159 <div class="box">
160 <h4>$(gettext "Install")</h4>
161 <p>
162 $(gettext "Install SliTaz on a partition of your hard disk drive. If
163 you decide to format your HDD, all data will be lost. If you do not
164 format, all data except for any existing /home directory will be removed,
165 the home directory will be kept as is.")
166 </p>
167 </div>
168 <p>
169 <a class="button" href="$SCRIPT_NAME?page=install">$(gettext "Install SliTaz")</a>
170 EOT
171 }
173 select_upgrade()
174 {
175 cat <<EOT
176 <div class="box">
177 <h4>$(gettext "Upgrade")</h4>
178 <p>
179 $(gettext "Upgrade an already installed SliTaz system on your hard disk
180 drive. Your /home /etc /var/www directories will be kept, all other directories
181 will be removed. Any additional packages added to your old Slitaz system
182 will be updated as long you have an active internet connection.")
183 </p>
184 </div>
185 <p>
186 <a class="button" href="$SCRIPT_NAME?page=upgrade">$(gettext "Upgrade SliTaz")</a>
187 </p>
188 EOT
189 }
191 display_action()
192 {
193 case $1 in
194 install)
195 cat << EOT
196 <div id="wrapper">
197 <h3>$(gettext "Install SliTaz")</h3>
198 <p>$(gettext "You're going to install SliTaz on a partition of your hard disk drive. If
199 you decide to format your HDD, all data will be lost. If you do not
200 format, all data except for any existing /home directory will be removed,
201 the home directory will be kept as is.")<p>
202 </div>
203 <input type="hidden" name="INST_ACTION" value="$1">
204 EOT
205 ;;
206 upgrade)
207 cat << EOT
208 <div id="wrapper">
209 <h2>$(gettext "Upgrade SliTaz")</h2>
210 <p>$(gettext "You're going to upgrade an already installed SliTaz system on your hard disk
211 drive. Your /home /etc /var/www directories will be kept, all other directories
212 will be removed. Any additional packages added to your old Slitaz system
213 will be updated as long you have an active internet connection.")<p>
214 </div>
215 <input type="hidden" name="INST_ACTION" value="$1">
216 EOT
217 ;;
218 esac
219 }
221 select_source()
222 {
223 cat <<EOT
224 <a name="source"></a>
225 <h4>$(gettext "Source")</h4>
226 <table>
227 <tr>
228 <td><input type="radio" name="INST_TYPE" value="cdrom" $([ "$INST_TYPE" == "cdrom" ] && echo "checked") id="cdrom" />
229 <label for="cdrom">$(gettext "LiveCD")</td></label>
230 </tr>
231 <tr>
232 <td><input type="radio" name="INST_TYPE" value="usb" $([ "$INST_TYPE" == "usb" ] && echo "checked") id="usb" />
233 <label for="usb">$(gettext "LiveUSB"):
234 <select name="SRC_USB">
235 EOT
236 # List disks if plugged USB device
237 usb=0
238 if [ -d /proc/scsi/usb-storage ]; then
239 for DEV in /sys/block/sd* ; do
240 if readlink $DEV | grep -q usb; then
241 DEV=$(basename $DEV)
242 if [ -d /sys/block/${DEV}/${DEV}1 ]; then
243 for i in $(fdisk -l /dev/$DEV | awk '/^\/dev/ {printf "%s ", $1}') ; do
244 echo "<option value='$i' $([ "$i" == "$SRC_FILE" ] && echo "selected") >$i</option>"
245 usb=$usb+1
246 done
247 fi
248 fi
249 done
250 fi
251 if [ $usb -lt 1 ]; then
252 echo "<option value="">$(gettext "Not found")</option>"
253 fi
254 cat << EOT
255 </select></label>
256 </td>
257 </tr>
258 <tr>
259 <td><input type="radio" name="INST_TYPE" value="iso" $([ "$INST_TYPE" == "iso" ] && echo "checked") id="iso" />
260 <label for="iso">$(gettext "ISO file"):</label>
261 <input type="url" size="50" name="SRC_ISO" $([ "$INST_TYPE" == "iso" ] && echo -e "value=\"$SRC_FILE\"") placeholder="$(gettext "Full path to the ISO image file")" />
262 </td>
263 </tr>
264 <tr>
265 <td><input type="radio" name="INST_TYPE" value="web" $([ "$INST_TYPE" == "web" ] && echo "checked") id="web" />
266 <label for="web">$(gettext "Web"):
267 <a class="button" onclick="document.forms['ConfigForm'].url.value = '$(tazinst showurl stable)'; return true;">$(gettext "Stable")</a>
268 <a class="button" onclick="document.forms['ConfigForm'].url.value = '$(tazinst showurl cooking)'; return true;">$(gettext "Cooking")</a>
269 $(gettext "URL:")
270 <input id="url" type="url" size="55" name="SRC_WEB" value="$get_SRC_WEB" placeholder="$(gettext "Full url to an ISO image file")" /></td>
271 </label>
272 </tr>
273 </table>
274 EOT
275 }
277 select_partition()
278 {
279 cat <<EOT
280 <a name="partition"></a>
281 <h4></span>$(gettext "Main Partition")</h4>
282 <table>
283 <tr><td>
284 $(gettext "Partition to use:")
285 <select name="TGT_PARTITION">
286 EOT
287 # List partitions
288 if fdisk -l | grep -q ^/dev/ ; then
289 echo "<option value="">$(gettext "None")</option>"
290 for i in $(fdisk -l | awk '/^\/dev/ {printf "%s " $1}'); do
291 echo "<option value='$i' $([ "$i" == "$TGT_PARTITION" ] && echo "selected")>$i</option>"
292 done
293 else
294 echo "<option value="">$(gettext "Not found")</option>"
295 fi
296 cat << EOT
297 </select>
298 <br />
299 <input type="checkbox" name="MAIN_FMT" value="yes" $([ -n "$TGT_FS" ] && echo "checked") id="mainfs" />
300 <label for="mainfs">$(gettext "Format partition as"):</label>
301 <select name="MAIN_FS">
302 EOT
303 scan_mkfs
304 for i in $FS
305 do
306 echo "<option value='$i' $([ "$i" == "$TGT_FS" ] && echo "selected")>$i</option>"
307 done
308 cat <<EOT
309 </select>
310 </td></tr>
311 </table>
312 EOT
313 }
315 select_old_slitaz()
316 {
317 cat <<EOT
318 <a name="partition"></a>
319 <h4></span>$(gettext "Existing SliTaz Partition")</h4>
320 <table>
321 <tr><td>
322 $(gettext "Partition in use:")
323 <select name="TGT_PARTITION">
324 EOT
325 # List partitions
326 if fdisk -l | grep -q ^/dev/ ; then
327 echo "<option value="">$(gettext "None")</option>"
328 for i in `blkid | cut -d ":" -f 1`; do
329 echo "<option value='$i' $([ "$i" == "$TGT_PARTITION" ] && echo "selected")>$i</option>"
330 done
331 else
332 echo "<option value="">$(gettext "Not found")</option>"
333 fi
334 cat <<EOT
335 </select>
336 </td></tr>
337 </table>
338 EOT
339 }
341 select_home()
342 {
343 cat <<EOT
344 <a name="home"></a>
345 <h4>$(gettext "Home partition")</h4>
346 <input type="checkbox" name="HOME_SELECT" value="yes" $([ -n "$TGT_HOME" ] && echo "checked") id="homepart" />
347 <label for="homepart">$(gettext "Use a separate partition for /home:")</label>
348 <select name="TGT_HOME">
349 EOT
350 # List disk if plugged USB device
351 if fdisk -l | grep -q ^/dev/ ; then
352 echo "<option value="">$(gettext "None")</option>"
353 for i in $(fdisk -l | awk '/^\/dev/ {printf "%s " $1}'); do
354 echo "<option value='$i' $([ "$i" == "$TGT_HOME" ] && echo "selected")>$i</option>"
355 done
356 else
357 echo "<option value="">$(gettext "Not found")</option>"
358 fi
359 cat <<EOT
360 </select>
362 <input type="checkbox" name="HOME_FMT" value="yes" $([ -n "$TGT_HOME_FS" ] && echo "checked") id="homefs" />
363 <label for="homefs">$(gettext "Format partition as:")</label>
364 <select name="HOME_FS">"
365 EOT
366 for i in $FS
367 do
368 echo "<option value='$i' $([ "$i" == "$TGT_HOME_FS" ] && echo "selected")>$i</option>"
369 done
370 echo "</select>"
371 }
373 select_hostname()
374 {
375 cat << EOT
376 <a name="hostname"></a>
377 <h4>$(gettext "Host")</h4>
378 $(gettext "Hostname:")
379 <input type="text" name="TGT_HOSTNAME" value="$TGT_HOSTNAME" placeholder="$(gettext "Name of your system")" />
380 EOT
381 }
383 select_root()
384 {
385 cat << EOT
386 <a name="root"></a>
387 <h4>$(gettext "Root")</h4>
388 $(gettext "Root passwd:")
389 <input type="text" name="TGT_ROOT_PWD" value="$TGT_ROOT_PWD" placeholder="$(gettext "Password of root")" />
390 EOT
391 }
393 select_user()
394 {
395 cat << EOT
396 <a name="user"></a>
397 <h4>$(gettext "User")</h4>
398 $(gettext "User login:")
399 <input type="text" name="TGT_USER" value="$TGT_USER" placeholder="$(gettext "Name of the first user")" />
400 $(gettext "User passwd:")
401 <input type="text" name="TGT_USER_PWD" value="$TGT_USER_PWD" placeholder="$(gettext "Password of the first user")" />
402 EOT
403 }
405 select_grub()
406 {
407 cat << EOT
408 <a name="grub"></a>
409 <h4>$(gettext "Grub")</h4>
410 <input type="checkbox" name="TGT_GRUB" value="yes" $([ "$TGT_GRUB" == "yes" ] && echo "checked") id="grub" />
411 <label for="grub">$(gettext "Install Grub bootloader")<br /></label>
412 <input type="checkbox" name="TGT_WINBOOT" value="auto" $([ -n "$TGT_WINBOOT" ] && echo "checked") id="dualboot" />
413 <label for="dualboot">$(gettext "Enable Windows Dual-Boot")</label>
414 EOT
415 }
417 moveto_page()
418 {
419 case $1 in
420 *)
421 page=home
422 title1=$(gettext "Back to Installer Start Page") ;;
423 esac
424 case $2 in
425 write|run)
426 title2=$(gettext "Proceed to SliTaz installation") ;;
427 reboot)
428 title2=$(gettext "Installation complete. You can now restart (reboot)") ;;
429 failed)
430 title2=$(gettext "Installation failed. See log") ;;
431 *)
432 page=home
433 title2=$(gettext "Back to Installer Start Page") ;;
434 esac
435 cat <<EOT
436 <script type="text/javascript">
437 function SubmitForm() {
438 var r=confirm("$(gettext "Do you really want to continue?")");
439 if (r==true)
440 {
441 document.ConfigForm.submit();
442 }
443 }
444 </script>
445 <hr />
446 <input type="hidden" name="page" value="$2" />
447 <a class="button" value="$1" href="$SCRIPT_NAME?page=$1" >$title1</a>
448 <a class="button" value="$2" onclick="SubmitForm()">$title2</a>
449 EOT
450 }
452 page_redirection()
453 {
454 cat <<EOT
455 <html>
456 <head>
457 <title>$(gettext "A web page that points a browser to a different page after 2 seconds")</title>
458 <meta http-equiv="refresh" content="0; URL=$SCRIPT_NAME?page=$1">
459 <meta name="keywords" content="automatic redirection">
460 </head>
461 <body>
462 $(gettext "If your browser doesn't automatically redirect within a few seconds,
463 you may want to go there manually")
464 <a href="$SCRIPT_NAME?page=$1">$1</a>
465 </body>
466 </html>
467 EOT
468 }
470 check_ressources()
471 {
472 local code
473 code=0
474 # Check tazinst
475 if ! tazinst usage | grep -q Usage: ; then
476 cat <<EOT
477 <h3>$(gettext "Tazinst Error")</h3>
478 <p><strong>tazinst</strong>, $(gettext "the lightweight SliTaz HDD installer
479 is missing. Any installation can not be done without tazinst.")</p>
480 <p>$(gettext "Check tazinst' permissions, or reinstall the slitaz-tools package:")</p>
481 <code># tazpkg get-install slitaz-tools --forced</code>
482 EOT
483 code=1
484 else
485 # Check tazinst required version
486 v=$(tazinst version | tr -d '[:alpha:]')
487 r=$TAZINST_REQUIRED_VERSION
488 if ! (echo "$v" | awk -v r=$r '{v=$v+0}{ if (v < r) exit 1}') ; then
489 cat <<EOT
490 <h3>$(gettext "Tazinst Error")</h3>
491 <p><strong>tazinst</strong> ($v) $(gettext "is not at the required version ($r),
492 use tazinst in a xterm or reinstall the slitaz-tools package:")</p>
493 <code># tazpkg get-install slitaz-tools --forced</code>
494 EOT
495 code=1
496 fi
497 fi
498 return $code
499 }
501 run_tazinst()
502 {
503 echo "<h4>$(gettext "Proceeding: ()")</h4>"
504 gettext "Please wait until processing is complete"
505 table_start
506 tazinst $(GET INST_ACTION) $INSTFILE | \
507 awk '{print "<tr><td><tt>" $0 "</tt></td></tr>"}'
508 table_end
509 return $(grep -c "cancelled on error" $INSTFILE)
510 }
512 tazinst_log()
513 {
514 echo "<pre>"
515 tazinst log
516 echo "</pre>"
517 }
519 scan_mkfs()
520 {
521 for path in /bin /sbin /usr/bin /usr/sbin
522 do
523 [ -e $path/mkfs.btrfs ] && FS=btrfs
524 [ -e $path/mkfs.cramfs ] && FS="$FS cramfs"
525 [ -e $path/mkfs.ext2 ] && FS="$FS ext2"
526 [ -e $path/mkfs.ext3 ] && FS="$FS ext3"
527 [ -e $path/mkfs.ext4 ] && FS="$FS ext4"
528 [ -e $path/mkfs.jfs ] && FS="$FS jfs"
529 [ -e $path/mkfs.minix ] && FS="$FS minix"
530 [ -e $path/mkfs.reiserfs ] && FS="$FS reiserfs"
531 [ -e $path/mkfs.xfs ] && FS="$FS xfs"
532 done
533 }
535 form_start()
536 {
537 cat <<EOT
538 <form name="ConfigForm" method="get" action="$SCRIPT_NAME">
539 EOT
540 }
542 form_end()
543 {
544 echo "</form>"
545 }
547 #
548 # Main
549 #
551 case "$(GET page)" in
552 gparted)
553 /usr/sbin/gparted
554 xhtml_header
555 page_redirection home
556 ;;
557 install)
558 xhtml_header
559 form_start
560 display_action install
561 read_setup
562 select_source
563 select_partition
564 select_home
565 select_hostname
566 select_root
567 select_user
568 select_grub
569 moveto_page home write
570 form_end
571 ;;
572 upgrade)
573 xhtml_header
574 form_start
575 display_action upgrade
576 read_setup
577 select_source
578 select_old_slitaz
579 select_grub
580 moveto_page home write
581 form_end
582 ;;
583 write)
584 write_setup
585 xhtml_header
586 if ! (tazinst check $INSTFILE); then
587 page_redirection $(GET INST_ACTION)
588 else
589 read_setup
590 form_start
591 display_action $(GET INST_ACTION)
592 if run_tazinst; then
593 moveto_page home reboot
594 else
595 moveto_page home failed
596 fi
597 form_end
598 fi
599 ;;
600 reboot)
601 reboot ;;
602 home)
603 xhtml_header
604 select_action
605 select_gparted
606 select_install
607 select_upgrade
608 ;;
609 failed)
610 xhtml_header
611 display_log
612 ;;
613 menu_install)
614 xhtml_header
615 if check_ressources; then
616 page_redirection install
617 fi
618 ;;
619 menu_upgrade)
620 xhtml_header
621 if check_ressources; then
622 page_redirection upgrade
623 fi
624 ;;
625 *)
626 xhtml_header
627 if check_ressources; then
628 page_redirection home
629 fi
630 ;;
631 esac
633 xhtml_footer
635 exit 0