slitaz-tools view installer/slitaz-installer @ rev 473

slitaz-installer: add meta flavor support
author Pascal Bellard <pascal.bellard@slitaz.org>
date Sun Mar 28 15:29:38 2010 +0200 (2010-03-28)
parents 24e03edc5970
children 860fa153524a
line source
1 #!/bin/sh
2 # slitaz-installer - SliTaz GNU/Linux installer.
3 #
4 # So this is SliTaz installer using dialog boxes. All the comments are in
5 # English but displayed messages are in French. The script starts with a
6 # few main variables, then all the functions and then a sequence of functions.
7 #
8 # (C) 2007-2009 SliTaz - GNU General Public License v3.
9 #
10 # Author : Christophe Lincoln <pankso@slitaz.org>
11 #
12 VERSION=2.0
14 : ${DIALOG=dialog}
16 # We need to know cdrom device and kernel version string to copy files.
17 DRIVE_NAME=`cat /proc/sys/dev/cdrom/info | grep "drive name" | cut -f 3`
18 CDROM=/dev/$DRIVE_NAME
19 KERNEL=vmlinuz-`uname -r`
20 TARGET_ROOT=/mnt/target
21 LOG=/var/log/slitaz-installer.log
22 BACKLIST="SliTaz GNU/Linux installer"
23 ACTION=$1
25 #######################
26 # Installer functions #
27 #######################
29 # Messages language setting.
30 set_messages()
31 {
32 case $LANG in
33 de*)
34 . /usr/share/slitaz/messages/de/installer.msg ;;
35 fr*)
36 . /usr/share/slitaz/messages/fr/installer.msg ;;
37 hu*)
38 . /usr/share/slitaz/messages/hu/installer.msg ;;
39 pt*)
40 . /usr/share/slitaz/messages/pt/installer.msg ;;
41 *)
42 . /usr/share/slitaz/messages/en/installer.msg ;;
43 esac
44 }
46 # Display error message.
47 error_message()
48 {
49 $DIALOG --title " Error " \
50 --colors --backtitle "$BACKLIST" \
51 --clear --msgbox "\n$ERROR_MSG" 18 70
52 }
54 # Exit install if user is not root.
55 check_root()
56 {
57 if test $(id -u) != 0 ; then
58 ERROR_MSG="\
59 [\Z6en\Zn] You must be root administrator to start SliTaz installer, please \
60 use 'su' to get a root SHell and restart installation.\n\n
61 [\Z6fr\Zn] Vous devez ĂȘtre root pour installer SLiTaz GNU/Linux. Vous pouvez \
62 utiliser 'su' suivi du mot de passe administrateur pour devenir root \
63 et relancer l'installation."
64 error_message
65 exit 0
66 fi
67 }
69 # This function is used after each screen to contine or abort install.
70 check_retval()
71 {
72 case $retval in
73 0)
74 continue ;;
75 1)
76 echo -e "\nVoluntary exit.\n" && exit 0 ;;
77 3)
78 continue ;;
79 255)
80 echo -e "ESC pressed.\n" && exit 0 ;;
81 esac
82 }
84 # Start install with basic information.
85 start_installer()
86 {
87 $DIALOG --title " Install or Upgrade " \
88 --backtitle "$BACKLIST" \
89 --extra-button --extra-label "Upgrade" \
90 --ok-label "Install" \
91 --clear --colors --yesno "$START_INSTALL_MSG" 18 70
92 retval=$?
93 case $retval in
94 0)
95 ACTION=install ;;
96 1)
97 echo -e "\nVoluntary exit.\n" && exit 0 ;;
98 3)
99 ACTION=upgrade ;;
100 255)
101 echo -e "ESC pressed.\n" && exit 0 ;;
102 esac
103 echo "start_installer: `date`" > $LOG
104 }
106 # Mount cdrom and verify if it's really SliTaz CD.
107 mount_cdrom()
108 {
109 ERROR_MSG=""
110 (
111 echo "XXX" && echo 30
112 echo -e "\nCreating mount point (/media/cdrom)..."
113 echo "XXX"
114 mkdir -p /media/cdrom
115 sleep 1
116 # First try to mount a cdrom
117 if mount -t iso9660 $CDROM /media/cdrom 2>>$LOG; then
118 echo "XXX" && echo 60
119 echo -e "\nUsing files from cdrom ($CDROM)..."
120 echo "XXX"
121 sleep 2
122 else
123 # We may be in LiveUSB mode
124 if [ -d /home/boot ]; then
125 echo "XXX" && echo 60
126 echo -e "\nUsing files from USB device..."
127 echo "XXX"
128 rm /media/cdrom/boot 2>/dev/null
129 ln -s /home/boot /media/cdrom/boot
130 sleep 2
131 fi
132 fi
134 echo "XXX" && echo 90
135 echo -e "\nChecking installation media..."
136 echo "XXX"
137 sleep 2
138 ) |
139 $DIALOG --title " Mounting cdrom " \
140 --backtitle "$BACKLIST" \
141 --gauge "Preparing the installation media..." 18 70 0
142 # Exit with error msg if no rootfs.gz found.
143 if [ ! -f /media/cdrom/boot/rootfs.gz -a \
144 ! -f /media/cdrom/boot/rootfs1.gz ]; then
145 ERROR_MSG="$MOUNT_CDROM_ERROR_MSG"
146 error_message
147 echo "missing: /media/cdrom/boot/rootfs.gz" >>$LOG
148 exit 1
149 fi
150 }
152 # Display a list of available partitions.
153 fdisk_list()
154 {
155 LIST_PARTITIONS=`fdisk -l | grep ^/dev | sed s/'e Win95'/'e'/g`
156 $DIALOG --title " Partition tables " \
157 --backtitle "$BACKLIST" \
158 --clear --msgbox "\n
159 Available partitions :\n\n
160 $LIST_PARTITIONS" 18 70
161 }
163 # We need a partition to install to (inputbox).
164 ask_for_target_dev()
165 {
166 exec 3>&1
167 TARGET_DEV=`$DIALOG --title " Root Partition " \
168 --backtitle "$BACKLIST" --clear \
169 --extra-label "List" --extra-button \
170 --colors --inputbox "$ASK_FOR_TARGET_DEV_MSG" 18 70 2>&1 1>&3`
171 retval=$?
172 exec 3>&-
173 check_retval
174 # Display list and come back.
175 if [ "$retval" = "3" ]; then
176 fdisk_list
177 ask_for_target_dev
178 fi
179 # Empty value.
180 if [ -z $TARGET_DEV ]; then
181 ask_for_target_dev
182 fi
183 set_messages
184 # Check if specified device exists in /proc/partitions.
185 DEV_NAME=${TARGET_DEV#/dev/}
186 if cat /proc/partitions | grep -q $DEV_NAME; then
187 if [ "$DEV_NAME" = "$TARGET_DEV" ]; then
188 TARGET_DEV="/dev/$DEV_NAME"
189 fi
190 echo "ask_for_target_dev: $TARGET_DEV" >>$LOG
191 else
192 ERROR_MSG="Partition \Z2$TARGET_DEV\Zn doesn't exist."
193 error_message
194 ask_for_target_dev
195 fi
196 }
198 # Mkfs if needed/wanted on /.
199 ask_for_mkfs_target_dev()
200 {
201 $DIALOG --title " Format " \
202 --backtitle "$BACKLIST" \
203 --clear --colors --yesno "$ASK_FOR_MKFS_TARGET_DEV_MSG" 18 70
204 retval=$?
205 case $retval in
206 0)
207 MKFS_TARGET_DEV="ext3"
208 echo "mkfs_target_dev: ext3" >>$LOG ;;
209 1)
210 CLEAN="clean"
211 echo "mkfs_target_dev: clean" >>$LOG ;;
212 255)
213 echo -e "ESC pressed.\n" && exit 0 ;;
214 esac
216 }
218 # We can have a separate partition for /home.
219 ask_for_home()
220 {
221 exec 3>&1
222 HOME_DEV=`$DIALOG --title " Home Partition " \
223 --backtitle "$BACKLIST" --clear \
224 --extra-label "List" --extra-button \
225 --colors --inputbox "
226 On most GNU/Linux systems users personal files are stored in the directory \
227 /home. Home can be on a separate partition or another hard disk.
229 \Z2Home partition to use (Optional):\Zn" 18 70 2>&1 1>&3`
230 retval=$?
231 exec 3>&-
232 check_retval
233 # Display list and come back.
234 if [ "$retval" = "3" ]; then
235 fdisk_list
236 ask_for_home
237 fi
238 if [ -n "$HOME_DEV" ]; then
239 # Check if specified device exists in /proc/partitions.
240 DEV_NAME=${HOME_DEV#/dev/}
241 if cat /proc/partitions | grep -q $DEV_NAME; then
242 if [ "$DEV_NAME" = "$HOME_DEV" ]; then
243 HOME_DEV="/dev/$DEV_NAME"
244 fi
245 echo "ask_for_home: $HOME_DEV" >>$LOG
246 else
247 ERROR_MSG="Partition \Z2$HOME_DEV\Zn doesn't exist."
248 error_message
249 ask_for_home
250 fi
251 fi
252 }
254 # Mkfs if needed/wanted on /.
255 ask_for_mkfs_home()
256 {
257 $DIALOG --title " Format " \
258 --backtitle "$BACKLIST" \
259 --clear --colors --yesno "
260 Here you can format the /home partition: $HOME_DEV
262 SliTaz uses ext3 by default but another filesystem can be used if wanted, \
263 for this please adjust /etc/fstab after installation.
265 \Z2Do you want to format (Option): $HOME_DEV\Zn" 18 70
266 retval=$?
267 case $retval in
268 0)
269 MKFS_HOME="ext3"
270 echo "mkfs_home: ext3" >>$LOG ;;
271 1)
272 MKFS_HOME=""
273 echo "mkfs_home: no" >>$LOG ;;
274 255)
275 echo -e "ESC pressed.\n" && exit 0 ;;
276 esac
278 }
280 # Ask for hostname before installing files.
281 ask_for_hostname()
282 {
283 exec 3>&1
284 HOSTNAME=`$DIALOG --title " Hostname " \
285 --backtitle "$BACKLIST" --clear \
286 --colors --inputbox "$ASK_FOR_HOSTNAME_MSG" 18 70 "slitaz" 2>&1 1>&3`
287 retval=$?
288 exec 3>&-
289 check_retval
290 # Empty value.
291 if [ -z $HOSTNAME ]; then
292 HOSTNAME="slitaz"
293 fi
294 }
296 # Ask for root password and default user settings.
297 ask_for_users_settings()
298 {
299 # Root passwd
300 exec 3>&1
301 ROOT_PASSWD=`$DIALOG --title " Root password " \
302 --backtitle "$BACKLIST" --clear \
303 --colors --nocancel --inputbox "
304 The root administrator privilege lets you manage and configure the full \
305 system. A root user can damage your system so you should always setup a \
306 strong password with special characters and/or numbers.
308 \Z2Please specify the Root password for your new system:\Zn" 18 70 "root" 2>&1 1>&3`
309 retval=$?
310 exec 3>&-
311 check_retval
312 # Prevent empty value.
313 if [ -z $ROOT_PASSWD ]; then
314 ROOT_PASSWD="root"
315 fi
316 # Default user
317 exec 3>&1
318 USER=`$DIALOG --title " User name " \
319 --backtitle "$BACKLIST" --clear \
320 --colors --nocancel --inputbox "
321 The default user for the system will have their personal files stored \
322 in /home/*user* (and will be automatically added to the audio group).
324 \Z2Default user name login:\Zn" 18 70 "tux" 2>&1 1>&3`
325 retval=$?
326 exec 3>&-
327 check_retval
328 # Prevent empty value.
329 if [ -z $USER ]; then
330 USER="tux"
331 fi
332 # User passwd
333 exec 3>&1
334 USER_PASSWD=`$DIALOG --title " User password " \
335 --backtitle "$BACKLIST" --clear \
336 --colors --nocancel --inputbox "
337 The password for default user $USER. It may be a security risk if too \
338 weak and should always be strong if you use a SSH connection through the web.
340 \Z2Please specify $USER password:\Zn" 18 70 "tux" 2>&1 1>&3`
341 retval=$?
342 exec 3>&-
343 check_retval
344 # Prevent empty value.
345 if [ -z $USER_PASSWD ]; then
346 USER_PASSWD="tux"
347 fi
348 }
350 # Tiny summary and last chance to cancel or restart for user.
351 summary()
352 {
353 $DIALOG --title " Summary " \
354 --backtitle "$BACKLIST" \
355 --clear --colors --yesno "
356 Installation settings summary and last chance to cancel or restart all \
357 installation steps.
359 Root partition: $TARGET_DEV
360 Home partition: $HOME_DEV
361 Hostname: $HOSTNAME
362 Default user: $USER
364 \Z2Go and install SliTaz or cancel?\Zn" 18 70
365 retval=$?
366 check_retval
367 }
369 # Mount and mkfs with progress.
370 prepare_partitions()
371 {
372 (
373 echo "XXX" && echo 30
374 echo -e "\nPreparing target partition..."
375 echo "XXX"
376 # Mount point can be already used.
377 if mount | grep -q $TARGET_ROOT; then
378 umount $TARGET_ROOT 2>$LOG
379 fi
380 sleep 2
382 if [ "$MKFS_TARGET_DEV" == "ext3" ]; then
383 echo "XXX" && echo 50
384 echo -e "\nExecuting mkfs.ext3 on $TARGET_DEV"
385 echo "XXX"
386 mkfs.ext3 $TARGET_DEV >>$LOG 2>>$LOG
387 else
388 echo "XXX" && echo 50
389 echo -e "\nThe partition ($TARGET_DEV) will be cleaned..."
390 echo "XXX"
391 sleep 2
392 fi
394 if [ "$MKFS_HOME" == "ext3" ]; then
395 echo "XXX" && echo 70
396 echo -e "\nExecuting mkfs.ext3 on $HOME_DEV"
397 echo "XXX"
398 mkfs.ext3 -L "Home" $HOME_DEV >>$LOG 2>>$LOG
399 else
400 echo "XXX" && echo 70
401 echo -e "\nThe partition ($HOME_DEV) will be kept..."
402 echo "XXX"
403 sleep 2
404 fi
406 echo "XXX" && echo 90
407 echo -e "\nCreating mount point: $TARGET_ROOT"
408 echo "XXX"
409 mkdir -p $TARGET_ROOT
410 sleep 2
412 ) |
413 $DIALOG --title " Prepare the target " \
414 --backtitle "$BACKLIST" \
415 --gauge "Target in preparation..." 18 70 0
416 # Mount target.
417 mount $TARGET_DEV $TARGET_ROOT >>$LOG 2>>$LOG
418 }
420 # Get a clean target device (15%).
421 clean_target()
422 {
423 if [ "$CLEAN" == "clean" ]; then
424 echo "XXX" && echo 15
425 echo -e "\nCleaning the root partition ($TARGET_DEV)..."
426 echo "XXX"
427 # Keep /home in case of reinstall.
428 cd $TARGET_ROOT
429 for dir in *
430 do
431 case "$dir" in
432 home)
433 mv $TARGET_ROOT/home $TARGET_ROOT/home.bak
434 echo "keeping /home found on: $TARGET_DEV" >>$LOG ;;
435 lost+found)
436 continue ;;
437 *)
438 echo "removing target: $dir" >>$LOG
439 rm -rf $dir 2>>$LOG ;;
440 esac
441 done
442 if [ -d $TARGET_ROOT/mklost+found ]; then
443 mklost+found 2>>$LOG
444 fi
445 fi
446 sleep 2
447 }
449 # Kernel is renamed to standard vmlinuz-$VERSION.
450 install_kernel()
451 {
452 mkdir -p $TARGET_ROOT/boot
453 cp /media/cdrom/boot/bzImage $TARGET_ROOT/boot/$KERNEL
454 echo "install_kernel: $KERNEL" >> $LOG
455 sleep 2
456 }
458 # Copy isolinux r/w files (not syslinux, some files are read only).
459 copy_bootloaders()
460 {
461 if [ -d "/media/cdrom/boot/isolinux" ]; then
462 mkdir -p $TARGET_ROOT/boot/isolinux
463 cp -a /media/cdrom/boot/isolinux/*.cfg $TARGET_ROOT/boot/isolinux
464 cp -a /media/cdrom/boot/isolinux/*.kbd $TARGET_ROOT/boot/isolinux
465 cp -a /media/cdrom/boot/isolinux/*.txt $TARGET_ROOT/boot/isolinux
466 cp -a /media/cdrom/boot/isolinux/*.bin $TARGET_ROOT/boot/isolinux
467 cp -a /media/cdrom/boot/isolinux/*.msg $TARGET_ROOT/boot/isolinux
468 cp -a /media/cdrom/boot/isolinux/*.lss $TARGET_ROOT/boot/isolinux
469 cp -a /media/cdrom/boot/isolinux/*.c32 $TARGET_ROOT/boot/isolinux
470 fi
471 }
473 # Extract lzma'ed or gziped rootfs.
474 extract_rootfs()
475 {
476 cd $TARGET_ROOT
477 for i in $(ls $1/rootfs* | sort -r); do
478 ( zcat $i 2>/dev/null || lzma d $i -so || \
479 cat $i ) 2>>$LOG | cpio -id
480 done 2>>$LOG > /dev/null
481 # unpack /usr (double check...)
482 if ls etc/tazlito | grep -q ".extract"; then
483 for i in etc/tazlito/*.extract; do
484 [ -f "$i" ] && . $i /media/cdrom
485 done
486 fi
487 }
489 # Pre configure freshly installed system (60 - 80%).
490 pre_config_system()
491 {
492 cd $TARGET_ROOT
493 # Restore backup of existing /home if exists.
494 # (created by prepare_target_dev)
495 if [ -d home.bak ]; then
496 echo "XXX" && echo 65
497 echo -e "\nRestoring directory: /home..."
498 echo "XXX"
499 rm -rf home
500 mv home.bak home
501 sleep 1
502 fi
503 # Add root device to CHECK_FS in rcS.conf to check filesystem
504 # on each boot.
505 echo "XXX" && echo 70
506 echo -e "\nAdding $TARGET_DEV and CHECK_FS to file /etc/rcS.conf..."
507 echo "XXX"
508 sed -i s#'CHECK_FS=\"\"'#"CHECK_FS=\"$TARGET_DEV\""# etc/rcS.conf
509 sleep 2
510 # Set hostname.
511 echo "XXX" && echo 80
512 echo -e "\nConfiguring host name: $HOSTNAME"
513 echo "XXX"
514 echo $HOSTNAME > etc/hostname
515 }
517 # Set root passwd and create user after rootfs extraction.
518 users_settings()
519 {
520 cat > $TARGET_ROOT/users.sh << _EOF_
521 #!/bin/sh
522 echo "root:$ROOT_PASSWD" | chpasswd
523 adduser -D -H $USER
524 addgroup $USER audio
525 echo "$USER:$USER_PASSWD" | chpasswd
526 if [ ! -d /home/$USER ]; then
527 cp -a /etc/skel /home/$USER
528 chown -R $USER.$USER /home/$USER
529 # Path for user desktop files.
530 for i in /home/$USER/.local/share/applications/*.desktop
531 do
532 sed -i s/"user_name"/"$USER"/g \$i
533 done
534 fi
535 # Slim default user.
536 if [ -f /etc/slim.conf ]; then
537 sed -i s/"default_user .*"/"default_user $USER"/ \
538 /etc/slim.conf
539 fi
540 _EOF_
541 chmod +x $TARGET_ROOT/users.sh
542 chroot $TARGET_ROOT ./users.sh
543 rm $TARGET_ROOT/users.sh
544 }
546 # /home can be on a separate partition. If default user exist in /home
547 # we remove default file crated by users_settings().
548 home_config()
549 {
550 echo "home_config: $HOME_DEV" >> $LOG
551 cd $TARGET_ROOT
552 mv home/$USER tmp
553 mount $HOME_DEV home
554 if [ -d $TARGET_ROOT/home/$USER ]; then
555 rm -rf tmp/$USER
556 else
557 mv tmp/$USER home
558 fi
559 echo "$HOME_DEV /home ext3 defaults 0 2" \
560 >> etc/fstab
561 umount home
562 }
564 # Determine GRUB partition number and GRUB disk number.
565 grub_config()
566 {
567 DISK_LETTER=${TARGET_DEV#/dev/[h-s]d}
568 DISK_LETTER=${DISK_LETTER%[0-9]}
569 GRUB_PARTITION=$((${TARGET_DEV#/dev/[h-s]d[a-z]}-1))
570 for disk in a b c d e f g h
571 do
572 nb=$(($nb+1))
573 if [ "$disk" = "$DISK_LETTER" ]; then
574 GRUB_DISK=$(($nb-1))
575 break
576 fi
577 done
578 GRUB_ROOT="(hd${GRUB_DISK},${GRUB_PARTITION})"
579 # Create the target GRUB configuration.
580 mkdir -p $TARGET_ROOT/boot/grub
581 cat > $TARGET_ROOT/boot/grub/menu.lst << _EOF_
582 # /boot/grub/menu.lst: GRUB boot loader configuration.
583 #
585 # By default, boot the first entry.
586 default 0
588 # Boot automatically after 8 secs.
589 timeout 8
591 # Change the colors.
592 color yellow/brown light-green/black
594 # For booting SliTaz from : $TARGET_DEV
595 #
596 title SliTaz GNU/Linux (cooking) (Kernel $KERNEL)
597 root $GRUB_ROOT
598 kernel /boot/$KERNEL root=$TARGET_DEV
600 _EOF_
601 # log
602 echo "grub_config: $TARGET_ROOT/boot/grub/menu.lst" >>$LOG
603 sleep 2
604 }
606 # Files install with gauge, calling for functions or with cmds.
607 install_files()
608 {
609 (
611 echo "XXX" && echo 10
612 echo -e "\nCleaning the root partition if necessary..."
613 echo "XXX"
614 clean_target
616 echo "XXX" && echo 20
617 echo -e "\nInstalling the kernel ($KERNEL)..."
618 echo "XXX"
619 install_kernel
621 echo "XXX" && echo 30
622 echo -e "\nCopying the bootloader syslinux/isolinux..."
623 echo "XXX"
624 copy_bootloaders
626 echo "XXX" && echo 50
627 echo -e "\nExtracting the root system..."
628 echo "XXX"
629 extract_rootfs /media/cdrom/boot
631 echo "XXX" && echo 60
632 echo -e "\nPreconfiguring the system..."
633 echo "XXX"
634 pre_config_system
636 echo "XXX" && echo 70
637 echo -e "\nConfiguring root and default $USER account..."
638 echo "XXX"
639 users_settings
640 sleep 2
642 if [ "$HOME_DEV" != "" ]; then
643 echo "XXX" && echo 80
644 echo -e "\nConfiguring $HOME_DEV to be used as /home..."
645 echo "XXX"
646 home_config
647 sleep 2
648 fi
650 echo "XXX" && echo 90
651 echo -e "\nCreating the configuration file for GRUB (menu.lst)..."
652 echo "XXX"
653 grub_config
655 echo "XXX" && echo 100
656 echo -e "\nFinishing the files installation..."
657 echo "XXX"
658 echo "install_files: OK" >>$LOG
659 sleep 2
661 ) |
662 $DIALOG --title " Install files " \
663 --backtitle "$BACKLIST" \
664 --gauge "Starting to install files..." 18 70 0
665 }
667 # GRUB info with disk name used for grub-install.
668 grub_install()
669 {
670 TARGET_DISK=`echo $TARGET_DEV | sed s/"[0-9]"/''/`
671 set_messages
672 $DIALOG --title " GRUB install " \
673 --backtitle "$BACKLIST" \
674 --clear --colors --yesno "$GRUB_INSTALL_MSG" 18 70
675 retval=$?
676 case $retval in
677 0)
678 (
679 echo "XXX" && echo 50
680 echo -e "\nRunning grub-install on : $TARGET_DISK"
681 echo "XXX"
682 grub-install --no-floppy \
683 --root-directory=$TARGET_ROOT $TARGET_DISK 2>>$LOG
684 echo "XXX" && echo 100
685 echo -e "\nFinished installation..."
686 echo "XXX"
687 sleep 2
688 ) |
689 $DIALOG --title " GRUB install " \
690 --backtitle "$BACKLIST" \
691 --gauge "Installing GRUB..." 18 70 0 ;;
692 1)
693 echo "grub_install: NO" >>$LOG ;;
694 255)
695 echo -e "ESC pressed.\n" && exit 0 ;;
696 esac
697 }
699 # Copy log file, umount target and eject cdrom.
700 umount_devices()
701 {
702 (
703 echo "XXX" && echo 25
704 echo -e "\nCopying the log files ($LOG)..."
705 echo "XXX"
706 cp -a $LOG $TARGET_ROOT/var/log
707 sleep 2
708 echo "XXX" && echo 50
709 echo -e "\nUnmounting the target ($TARGET_DEV)..."
710 echo "XXX"
711 if mount | grep -q $TARGET_ROOT; then
712 umount $TARGET_ROOT 2>/dev/null
713 fi
714 echo "XXX" && echo 75
715 echo -e "\nUnmounting and ejecting the cdrom..."
716 echo "XXX"
717 if mount | grep -q /media/cdrom; then
718 umount /media/cdrom
719 grep -q slitaz-loram-cdrom /etc/init.d/rcS || eject
720 fi
721 sleep 2
722 echo "XXX" && echo 100
723 echo -e "\n$TITLE..."
724 echo "XXX"
725 sleep 2
726 ) |
727 $DIALOG --title " $TITLE " \
728 --backtitle "$BACKLIST" \
729 --gauge "$TITLE starting..." 18 70 0
730 }
732 # End of installation.
733 end_of_install()
734 {
735 echo "end_of_install: `date`" >>$LOG
736 $DIALOG --title " Installation complete " \
737 --backtitle "$BACKLIST" \
738 --yes-label "Exit" \
739 --no-label "Reboot" \
740 --clear --colors --yesno "$END_OF_INSTALL_MSG" 18 70
741 retval=$?
742 case $retval in
743 0)
744 TITLE="Exiting"
745 umount_devices ;;
746 1)
747 TITLE="Rebooting"
748 umount_devices
749 reboot || reboot -f ;;
750 255)
751 echo -e "ESC pressed.\n" && exit 0 ;;
752 esac
753 }
755 #####################
756 # Upgrade functions #
757 #####################
759 # We need a partition to upgrade SliTaz.
760 ask_for_upgrade_dev()
761 {
762 exec 3>&1
763 UPGRADE_DEV=`$DIALOG --title " Target to upgrade " \
764 --backtitle "$BACKLIST" --clear \
765 --extra-label "List" --extra-button \
766 --colors --inputbox "\n
767 The installer will upgrade the target by saving all configuration files and \
768 the list of installed packages. Then, it will clean the partition and install the \
769 version of SliTaz contained on the cdrom, restore the configuration files and \
770 reinstall any packages which are not present on the cdrom. You will need an active \
771 internet connection before upgrading.\n\n
772 \Z2Partition containing the system upgrade:\Zn" 18 70 2>&1 1>&3`
773 retval=$?
774 exec 3>&-
775 check_retval
776 # Display list and come back.
777 if [ "$retval" = "3" ]; then
778 fdisk_list
779 ask_for_upgrade_dev
780 fi
781 # Empty value.
782 if [ -z $UPGRADE_DEV ]; then
783 ask_for_upgrade_dev
784 fi
785 # Check if specified device exists in /proc/partitions.
786 DEV_NAME=${UPGRADE_DEV#/dev/}
787 if cat /proc/partitions | grep -q $DEV_NAME; then
788 echo "ask_for_target_dev: $TARGET_DEV" >>$LOG
789 else
790 ERROR_MSG="The partition \Z2$UPGRADE_DEV\Zn doesn't seem to exist."
791 error_message
792 ask_for_upgrade_dev
793 fi
794 echo "partition to upgrade: $UPGRADE_DEV" >>$LOG
795 }
797 # Prepare the partition to upgrade, backup, install, restore configs
798 # and reinstall pkgs.
799 upgrade_process()
800 {
801 (
802 echo "XXX" && echo 5
803 echo -e "\nPreparing the target partition..."
804 echo "XXX"
805 # Mount point can be already used.
806 if mount | grep -q $TARGET_ROOT; then
807 umount $TARGET_ROOT 2>$LOG
808 fi
809 mkdir -p $TARGET_ROOT && sleep 2
810 # Mount target.
811 mount $UPGRADE_DEV $TARGET_ROOT >>$LOG 2>>$LOG
812 cd $TARGET_ROOT
813 TARGET_DEV=$UPGRADE_DEV
814 set_messages
816 echo "XXX" && echo 10
817 echo -e "\nSearch for /etc/slitaz-release"
818 echo "XXX"
819 if [ -f etc/slitaz-release ]; then
820 release=`cat etc/slitaz-release`
821 echo "XXX" && echo 15
822 echo -e "\nSliTaz release: $release"
823 echo "XXX"
824 else
825 ERROR_MSG="The partition \Z2$UPGRADE_DEV\Zn doesn't appear to contain \
826 a SliTaz system, the file: /etc/slitaz-release doesn't exist."
827 error_message
828 exit 0
829 fi && sleep 2
831 echo "XXX" && echo 20
832 echo -e "\nBackup /etc, /home and the packages list..."
833 echo "XXX"
834 # Backup target packages list.
835 ls -1 var/lib/tazpkg/installed > home/packages-selection.list
836 for dir in *
837 do
838 case "$dir" in
839 boot)
840 # Upgrade doesn't prompt for grub install, so backup and
841 # create a new grub menu.lst.
842 rm -rf $TARGET_ROOT/boot/vmlinuz-*
843 mv $TARGET_ROOT/boot/grub/menu.lst \
844 $TARGET_ROOT/boot/grub/menu.lst.bak 2>/dev/null
845 grub_config ;;
846 home)
847 mv $TARGET_ROOT/home $TARGET_ROOT/home.bak
848 echo "keeping /home found on: $UPGRADE_DEV" >>$LOG ;;
849 etc)
850 tar czf $TARGET_ROOT/etc.tar.gz etc
851 mv $TARGET_ROOT/etc $TARGET_ROOT/etc.bak
852 echo "keeping /etc found on: $UPGRADE_DEV" >>$LOG ;;
853 var)
854 if [ -d $TARGET_ROOT/var/www ]; then
855 mv $TARGET_ROOT/var/www $TARGET_ROOT/www.bak
856 fi
857 rm -rf $TARGET_ROOT/var ;;
858 lost+found)
859 continue ;;
860 *)
861 echo "removing target: $dir" >>$LOG
862 rm -rf $TARGET_ROOT/$dir 2>>$LOG ;;
863 esac
864 done
865 if [ -d $TARGET_ROOT/mklost+found ]; then
866 mklost+found 2>>$LOG
867 fi
868 sleep 2
870 echo "XXX" && echo 25
871 echo -e "\nInstalling the kernel ($KERNEL)..."
872 echo "XXX"
873 install_kernel
875 echo "XXX" && echo 30
876 echo -e "\nCopying the bootloader syslinux/isolinux..."
877 echo "XXX"
878 copy_bootloaders
880 echo "XXX" && echo 40
881 echo -e "\nExtracting the root system..."
882 echo "XXX"
883 extract_rootfs /media/cdrom/boot
885 # Restore backups.
886 echo "XXX" && echo 42
887 echo -e "\nRestoring configuration files..."
888 echo "XXX"
889 rm -rf $TARGET_ROOT/home
890 mv $TARGET_ROOT/home.bak $TARGET_ROOT/home
891 rm -rf $TARGET_ROOT/etc
892 mv $TARGET_ROOT/etc.bak $TARGET_ROOT/etc
893 if [ -d $TARGET_ROOT/www.bak ]; then
894 rm -rf $TARGET_ROOT/var/www
895 mv $TARGET_ROOT/www.bak $TARGET_ROOT/var/www
896 fi
897 echo "backups restored: `date`" >> $LOG
899 # /var/lib/slitaz-installer
900 mkdir $TARGET_ROOT/var/lib/slitaz-installer
901 mv $TARGET_ROOT/etc.tar.gz $TARGET_ROOT/var/lib/slitaz-installer
902 mv $TARGET_ROOT/home/packages-selection.list $TARGET_ROOT/var/lib/slitaz-installer
903 cd $TARGET_ROOT/var/lib/slitaz-installer
905 # LiveCD packages list.
906 echo "XXX" && echo 46
907 echo -e "\nCreating package lists..."
908 echo "XXX"
909 ls -1 $TARGET_ROOT/var/lib/tazpkg/installed > packages-cdrom.list || exit 1
910 echo "packages-cdrom.list: done" >> $LOG
911 # Diff
912 diff packages-cdrom.list packages-selection.list | \
913 grep ^+[a-z] | sed s/^+// > packages-selection.diff
914 echo "packages-selection.diff: done" >> $LOG
915 # Get mirror list.
916 tazpkg recharge >>$LOG 2>>$LOG
917 if [ ! -f /var/lib/tazpkg/packages.list ]; then
918 ERROR_MSG="The list of available packages on the mirror could not be \
919 downloaded. No missing packages will be reinstalled now, but \
920 you can do so later by looking at the following list: \n\n
922 /var/lib/slitaz-installer/packages-selection.diff"
923 error_message
924 fi
925 sleep 2
927 # Check if the pkg is on the mirror.
928 echo "XXX" && echo 48
929 echo -e "\nChecking the availability of packages..."
930 echo "XXX"
931 touch packages-to-install.list
932 packages=0
933 diff=`cat packages-selection.diff | sort`
934 for pkg in $diff
935 do
936 if grep -q ^$pkg-[0-9] /var/lib/tazpkg/packages.list; then
937 packages=$(($packages+1))
938 echo "$pkg" >> packages-to-install.list
939 fi
940 done
942 # Calculate the percent for one package and install.
943 echo "XXX" && echo 50
944 echo -e "\nInstalling any packages..."
945 echo "XXX"
946 sleep 2
947 if [ "$packages" == "0" ]; then
948 echo "packages to install: 0" >> $LOG
949 else
950 onepkg=$((48/$packages))
951 pct=50
952 # Get-install all missing pkgs.
953 for pkg in `cat packages-to-install.list`
954 do
955 pct=$(($pct+$onepkg))
956 echo "XXX" && echo $pct
957 echo -e "\nInstallation of: $pkg..."
958 echo "XXX"
959 # Log please.
960 echo "get-install: $pkg" >>$LOG
961 # Get install package and answer yes in case of dependencies.
962 pkgname=`grep ^$pkg /var/lib/tazpkg/packages.list`
963 tazpkg get $pkg >/dev/null 2>/dev/null
964 yes "" | tazpkg install $pkgname.tazpkg --root=$TARGET_ROOT >/dev/null 2>/dev/null
965 rm -f $pkgname.tazpkg
966 done
967 fi
968 echo "XXX" && echo 100
969 echo -e "\nInstallation of packages complete..."
970 echo "XXX"
971 sleep 2
972 ) |
973 $DIALOG --title " Processing system upgrade " \
974 --backtitle "$BACKLIST" \
975 --gauge "Target in preparation..." 18 70 0
976 }
978 # End of system upgrade.
979 end_of_upgrade()
980 {
981 TARGET_DEV=$UPGRADE_DEV
982 set_messages
983 pkgscd=`cat $TARGET_ROOT/var/lib/slitaz-installer/packages-cdrom.list | wc -l`
984 pkginst=`cat $TARGET_ROOT/var/lib/slitaz-installer/packages-to-install.list | wc -l`
985 echo "end_of_upgrade: `date`" >>$LOG
986 $DIALOG --title " Upgrade completed " \
987 --backtitle "$BACKLIST" \
988 --yes-label "Exit" \
989 --no-label "Reboot" \
990 --clear --colors --yesno "\n
991 Upgrade finished. You can now restart (reboot) \
992 from your SliTaz GNU/Linux system.\n\n
993 Packages on the cdrom : $pkgscd\n
994 Packages installed from the mirror : $pkginst\n" 18 70
995 retval=$?
996 case $retval in
997 0)
998 TITLE="Exiting"
999 umount_devices ;;
1000 1)
1001 TITLE="Rebooting"
1002 umount_devices
1003 reboot || reboot -f ;;
1004 255)
1005 echo -e "ESC pressed.\n" && exit 0 ;;
1006 esac
1009 ######################
1010 # Installer sequence #
1011 ######################
1013 set_messages
1014 check_root
1015 start_installer
1017 case $ACTION in
1018 upgrade)
1019 BACKLIST="$BACKLIST (Upgrade)"
1020 mount_cdrom
1021 ask_for_upgrade_dev
1022 upgrade_process
1023 end_of_upgrade ;;
1024 install|*)
1025 mount_cdrom
1026 ask_for_target_dev
1027 ask_for_mkfs_target_dev
1028 ask_for_home
1029 if [ -n "$HOME_DEV" ]; then
1030 ask_for_mkfs_home
1031 fi
1032 ask_for_hostname
1033 ask_for_users_settings
1034 summary
1035 prepare_partitions
1036 install_files
1037 grub_install
1038 end_of_install ;;
1039 esac
1041 exit 0