tazpanel view installer.cgi @ rev 254

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