summaryrefslogtreecommitdiffstats
path: root/rescue/restore-image.sh
diff options
context:
space:
mode:
Diffstat (limited to 'rescue/restore-image.sh')
-rwxr-xr-xrescue/restore-image.sh217
1 files changed, 217 insertions, 0 deletions
diff --git a/rescue/restore-image.sh b/rescue/restore-image.sh
new file mode 100755
index 000000000..5272b18fa
--- /dev/null
+++ b/rescue/restore-image.sh
@@ -0,0 +1,217 @@
+#!/bin/bash
+
+setterm -powersave off
+setterm -blank 0
+
+if [ -r ./restore-image-lib.sh ]; then
+ . ./restore-image-lib.sh
+elif [ -r /usr/lib/restore-image-lib.sh ]; then
+ . /usr/lib/restore-image-lib.sh
+fi
+
+export PATH="/sbin:/bin:/usr/sbin:/usr/bin"
+
+mnt_dir="/tmp/mnt"
+restore_media="/tmp/media"
+images_dir="$restore_media/images"
+images="$images_dir/list"
+images_config="$images_dir/config"
+image=""
+
+function read_config()
+{
+ if [ -r "$images_config" ]; then
+ . $images_config
+ fi
+}
+
+function image_list()
+{
+ list=$(cat $images | awk -F',' \
+ '{ print $1 " " $2 " " $4 }')
+
+ echo $list
+}
+
+function image_file()
+{
+ country="$1"
+
+ file=$(grep ^$country $images | awk -F',' '{ print $3 }')
+
+ echo $file
+}
+
+function welcome()
+{
+ while true; do
+ clear
+ msg="\n Welcome to $TITLE\n\
+\nThe following images were found, select one:\n "
+ opcao=$(dialog --backtitle "$BACKTITLE" --title "$TITLE" \
+ --stdout --radiolist "$msg" 0 0 0 \
+ $(image_list))
+
+ if [ "$?" != "0" ]; then
+ _yesno "\nInterrupt installation?\n "
+ if [ "$?" = "0" ]; then
+ _shutdown
+ fi
+ else
+ if [ -z "$opcao" ]; then
+ continue
+ else
+ image=$(image_file $opcao)
+ break
+ fi
+ fi
+ done
+
+ # disable kernel messages in the console
+ echo "1 4 1 7" > /proc/sys/kernel/printk
+}
+
+function install_warning()
+{
+ clear
+ _yesno "\nWARNING: This process will erase all data in this machine, \
+do you want to continue?\n "
+ if [ "$?" != "0" ]; then
+ _shutdown
+ fi
+}
+
+function detect_root()
+{
+ dev=$(sed '\|'$restore_media'|!d;s/[0-9] .*$//;s/^.*\///' /proc/mounts)
+ devices=$(grep "^ .*[^0-9]$" < /proc/partitions | grep -v ${dev} | awk '$3 > '$MIN_DISKSIZE' { print $4,$3 }')
+
+ devs_found=$(echo $devices | wc -w)
+ if [ "$devs_found" -gt "2" ]; then
+ if [ ! -z ${dev} ]; then
+ opcao=$(dialog --backtitle "$BACKTITLE" --title "$TITLE" --stdout --menu 'Choose one of the detected devices to restore to (check the blocks size column first):' 8 50 0 $devices )
+ if [ "$?" != "0" ]; then
+ _yesno "\nInterrupt installation?\n "
+ if [ "$?" = "0" ]; then
+ _shutdown
+ fi
+ else
+ root=$opcao
+ fi
+ fi
+ else
+ root=$(echo $devices | cut -d ' ' -f 1)
+ fi
+ echo "$root"
+}
+
+function write_image()
+{
+ root=$(detect_root)
+ if [ -z ${root} ]; then
+ _msgbox "\nError writing image: disk device not detected.\n"
+ # so that netbooks using USB sticks as disks can retry (like Gdium)
+ welcome
+ root=$(detect_root)
+ fi
+
+ image=$(cat $images_dir/list | cut -d ',' -f 3)
+ extension=$(echo $image | cut -d '.' -f 3)
+ case $extension in
+ gz) uncomp=zcat ;;
+ bz2) uncomp=bzcat ;;
+ *) uncomp=cat ;;
+ esac
+ $uncomp $images_dir/$image | dd of=/dev/$root bs=4M > /tmp/backup.out 2>&1 &
+
+ sleep 3
+ pid=$(ps ax | grep 'dd of' | grep -v grep | awk '{ print $1 }')
+ total=1000
+
+ while [ true ]; do
+ ps | grep -q $pid
+ if [ $? -eq 0 ]; then
+ /bin/kill -SIGUSR1 $pid
+ unit=$(tail -n 1 /tmp/backup.out | \
+ cut -d'(' -f2 | cut -d')' -f1 |\
+ awk '{ print $2 }')
+
+ complete=$(tail -n 1 /tmp/backup.out | \
+ cut -d'(' -f2 | cut -d')' -f1 | \
+ awk '{ print $1 }' | cut -d'.' -f1)
+ if [ x"$unit" = x"GB" ]; then
+ complete=$((complete*1000))
+ fi
+ echo $((complete*100/total))
+ sleep 1
+ else
+ break
+ fi
+ done | dialog --backtitle "$BACKTITLE" --title "$TITLE" --gauge "\nWriting image..." 8 45
+
+ in=$(tail -n 3 /tmp/backup.out | grep 'in$' | cut -d' ' -f1)
+ out=$(tail -n 3 /tmp/backup.out | grep 'out$' | cut -d' ' -f1)
+
+ if [ x"$in" != x"$out" ]; then
+ _msgbox "\nError writing image!\n"
+ sleep 24h
+ fi
+}
+
+function expand_fs()
+{
+ filesystem_type=$(dumpe2fs -h /dev/${root}1 2>/dev/null| grep "Filesystem OS type" | awk '{ print $4 }')
+ if [ "$filesystem_type" = "Linux" ]; then
+ dialog --backtitle "$BACKTITLE" --title "$TITLE" --infobox "Installing... Finishing Install..." 3 40
+ disk=/dev/$root
+ main_part=/dev/${root}1
+ swap_part=/dev/${root}2
+ main_part_sectors=
+ if [ -n "$SWAP_BLOCKS" ]; then
+ if [ -n "$EXPAND_FS" ]; then
+ total_blocks=$(sfdisk -s $disk)
+ main_part_blocks=$((total_blocks-SWAP_BLOCKS))
+ main_part_sectors=$((main_part_blocks*2))
+ else
+ main_part_sectors=$(sfdisk -d $disk | perl -lne 'm|^'$main_part'\b.*,\s*size\s*=\s*(\d+)\b| and print($1), exit')
+ fi
+ fi
+ if [ -n "$EXPAND_FS" ]; then
+ sfdisk -d $disk | sed -e "\|$main_part| s/size=.*,/size= $main_part_sectors,/" | sfdisk -f $disk
+ e2fsck -fy $main_part
+ resize2fs $main_part
+ fi
+ if [ -n "$SWAP_BLOCKS" ]; then
+ parted $disk -- mkpartfs primary linux-swap ${main_part_sectors}s -1s yes
+ mkswap -L swap $swap_part
+ fi
+ mkdir -p $mnt_dir
+ mount $main_part $mnt_dir
+ grub_dir="$mnt_dir/boot/grub"
+ if [ -d "$grub_dir" ]; then
+ echo "(hd0) $disk" > "$grub_dir/device.map"
+ fi
+ if [ -n "$MKINITRD" ]; then
+ mount -t sysfs none "$mnt_dir/sys"
+ mount -t proc none "$mnt_dir/proc"
+ echo > /proc/sys/kernel/modprobe # rescue's modprobe does not handle modprobe -q and aliases
+ chroot $mnt_dir bootloader-config --action rebuild-initrds
+ umount "$mnt_dir/sys"
+ umount "$mnt_dir/proc"
+ fi
+ umount $mnt_dir
+ fi
+}
+
+# installation steps
+welcome
+read_config
+install_warning
+write_image
+expand_fs
+
+# all done!
+_msgbox "\nInstallation process finished.\nPress ENTER to shutdown.\n "
+
+_shutdown
+