#!/bin/sh

# Copyright Jean-Philippe Guillemin <jp.guillemin@free.fr>. This program is free software;
# you can redistribute it and/or modify it under the terms of the GNU General Public License
# as published by the Free Software Foundation; either version 2 of the License,
# or (at your option) any later version. Please take a look at http://www.gnu.org/copyleft/gpl.htm
# modified by Paul Sherman for Absolute Linux

TMP=/var/log/setup/tmp
NDIR=/dev/null
REDIR=/dev/tty4
T_PX=/mnt
unset P_TYPE
export MAINSELECT=""

# disk chooser ##########################################
destroy=""
dglist=""
n=1
for dev in $(cat /proc/partitions| grep -v '^$' | grep -v 'name' | grep -v 'loop' | grep -o "sd[a-z]$"|sort -n); do
	x=`echo "${dev}" | cut -d " " -f1 | tr -d ' '`
	a=( $x )
	for i in "${a[@]}"
	do
		y=`ls -l /dev/disk/by-id/usb* | grep "$i"`
		if [ -z "$y" ]; then
		 dglist="${dglist} ${dev} disk ''"
		  n=$(($n+1))
		fi
	done
done


DISK=$(dialog \
--stdout \
--ok-label "Do It" \
--cancel-label "Cancel" \
--title "AUTO PARTITION" \
--radiolist "This is automatic partition mode. Press <SPACE> to select the target disk \
where Absolute will be installed. \
All data will be erased from the target disk. Only run this mode if the entire \
disk will be dedicated to Absolute." \
$(( $n+11 )) 75 $(( $n+1 )) ${dglist} )


if [ -n "${DISK}" ] ; then

# destroy ? #########################################

destroy=$(dialog \
--stdout \
--title "AUTO PARTITION" \
--menu "\nAre you sure you want to erase all existing data from ${DISK}?\n " \
11 75 2 \
"No" "Go back to the main setup menu" \
"Yes" "${DISK} is dedicated to Absolute"  )

else
	dialog --title "AUTO PARTITION" --msgbox "No target disk selected, going back to main menu" 6 75
fi

# if user does not chose to partition the drive, we go home
[ "$destroy" != "Yes" ] && exit 0

#decide between making GPT or MBR on hard drive - (booting to EFI is kind of a giveaway...)
if [ -d /sys/firmware/efi ]; then
	P_TYPE="GPT"
else
	P_TYPE="MBR"
fi

TOTAL=`parted -s /dev/${DISK} unit mb print free | grep /dev/${DISK} | awk '{print $3}' | cut -d "M" -f1`
let SWAP_START=$TOTAL-2048


if [ $TOTAL -lt 10000 ] ; then ##### partition by size ##########################################
	dialog --title "AUTO PARTITION" --msgbox "${DISK} is only $DisksizeInKB KB , you need at least 10000000 KB to install Absolute" 4 75

else
	dialog --title "AUTO PARTITION" --infobox "Please wait while ${DISK} is prepared for Absolute" 6 75
	
	if [ "$P_TYPE" = "MBR" ] ; then 
		#########  MBR ###################################################
	
		#/sbin/sgdisk -Z /dev/${DISK}
		/sbin/parted -s /dev/${DISK} mklabel msdos
		/sbin/parted -s /dev/${DISK} mkpart primary ext4 1MiB $SWAP_START
		/sbin/parted -s /dev/${DISK} set 1 boot on
		/sbin/parted -s /dev/${DISK} mkpart primary linux-swap $SWAP_START 100%
		# output a nice status message
		dialog --title "FORMATTING" --infobox "Formatting /dev/${DISK}1  \n Size: $SWAP_START MB \n Filesystem type: ext4 \n (Hang on... this will take a minute or two)" 0 0
		# do the format
		# root
		if mount | grep "/dev/${DISK}1" 1> /dev/null 2> /dev/null ; then
		  umount /dev/${DISK}1 2> /dev/null
		fi
		mkfs.ext4 -F -F /dev/${DISK}1 1> /dev/null 2> /dev/null
		tune2fs -i 0 -c 96 /dev/${DISK}1 1> /dev/null 2> /dev/null		
		printf "%-16s %-16s %-11s %-16s %-3s %s\n" "/dev/${DISK}1" "/" "ext4" "defaults,noatime" "1" "1" > $TMP/SeTnative
		if ! grep -w /dev/${DISK}2 /proc/swaps 1> /dev/null 2> /dev/null ; then
			mkswap -v1 /dev/${DISK}2 1> /dev/null 2> /dev/null
			swapon /dev/${DISK}2 1> /dev/null 2> /dev/null
		fi
		printf "%-16s %-16s %-11s %-16s %-3s %s\n" "/dev/${DISK}2" "swap" "swap" "defaults" "0" "0" > $TMP/SeTswap
	
		# send root device info for later configuration
		echo "/dev/${DISK}1" > $TMP/SeTrootdev
		sleep 1
		# Mounting
		mount -t ext4 /dev/${DISK}1 $T_PX 1> /dev/null 2> /dev/null
		sync
		
	else 
		################# GPT ##########################################
		#/sbin/sgdisk -Z /dev/${DISK} 
		/sbin/parted -s /dev/${DISK} mklabel gpt
		/sbin/parted -s /dev/${DISK} mkpart ESP fat32 1MiB 513MiB
		/sbin/parted -s /dev/${DISK} set 1 boot on
		/sbin/parted -s /dev/${DISK} mkpart primary ext4 513MiB $SWAP_START
		/sbin/parted -s /dev/${DISK} mkpart primary linux-swap $SWAP_START 100%	

		# EFI ###############
		if mount | grep "/dev/${DISK}1" 1> /dev/null 2> /dev/null ; then
		  umount /dev/${DISK}1 2> /dev/null
		fi
		mkfs.vfat -F32 -s 2 /dev/${DISK}1 1> /dev/null 2> /dev/null
		sleep 1
		EFITMPMOUNT=$(mktemp -d)
		mount /dev/${DISK}1 $EFITMPMOUNT 1> /dev/null 2> /dev/null
		mkdir -p $EFITMPMOUNT/EFI/boot 1> /dev/null 2> /dev/null
		umount /dev/${DISK}1 1> /dev/null 2> /dev/null
		rmdir $EFITMPMOUNT
		mount /dev/${DISK}1  /mnt/EFI/boot 1> /dev/null 2> /dev/null
		
		# Add the EFI System Partition to /etc/fstab:
		printf "%-16s %-16s %-11s %-16s %-3s %s\n" "/dev/${DISK}1" "/EFI/boot" "vfat" "defaults" "0" "1" > $TMP/SeTEFI
		cat $TMP/SeTEFI > $TMP/SeTnative
		
		###################
		# Format the main linux partition
		dialog --title "FORMATTING LINUX PARTITION" --infobox "Formatting  /dev/${DISK}2 \n Size: $SWAP_START MB \n Filesystem type: ext4 \n (Hang on... this will take a minute or two)" 0 0
		# do the format
		mkfs.ext4 -F -F /dev/${DISK}2 1> /dev/null 2> /dev/null	
		tune2fs -i 0 -c 96 /dev/${DISK}2 1> /dev/null 2> /dev/null
		printf "%-16s %-16s %-11s %-16s %-3s %s\n" "/dev/${DISK}2" "/" "ext4" "defaults,noatime" "1" "1" >> $TMP/SeTnative

		# swap ##############
		if ! grep -w /dev/${DISK}3 /proc/swaps 1> /dev/null 2> /dev/null ; then
			mkswap -v1 /dev/${DISK}3 1> /dev/null 2> /dev/null
			swapon /dev/${DISK}3 1> /dev/null 2> /dev/null
		fi
		printf "%-16s %-16s %-11s %-16s %-3s %s\n" "/dev/${DISK}3" "swap" "swap" "defaults" "0" "0" > $TMP/SeTswap
		
		# send root device info for later configuration
		echo "/dev/${DISK}2" > $TMP/SeTrootdev
		sleep 1	
		# Mounting root
		mount -t ext4 /dev/${DISK}2 $T_PX 1> /dev/null 2> /dev/null
		sync		
	fi # end of partition type


mnts=$( grep -c $T_PX /proc/mounts )
if [ "$mnts" -eq "1" ]; then
	echo "OK" >$TMP/DoInstall
fi
 
# Done, report to the user:
cat << EOF3 > $TMP/tempmsg

Partitioning completed,
Adding this information to your /etc/fstab:

EOF3
cat $TMP/SeTnative >> $TMP/tempmsg
cat $TMP/SeTswap >> $TMP/tempmsg
dialog --title "AUTO PARTITION" \
--exit-label OK \
--textbox $TMP/tempmsg 15 75

dialog --backtitle "Select Absolute installation source." \
--title "SOURCE MEDIA SELECTION" --menu \
"Please select the media from which to install Absolute Linux:" \
12 70 5 \
"1" "Install from a Absolute USB stick" \
"2" "Install from an Absolute CD or DVD" \
2> $TMP/media
if [ ! $? = 0 ]; then
 rm $TMP/media
 exit
fi

SOURCE_MEDIA="`cat $TMP/media`"
rm -f $TMP/media
if [ "$SOURCE_MEDIA" = "1" ]; then
 INSUSB
elif [ "$SOURCE_MEDIA" = "2" ]; then
 INSCD
fi

echo "YES" > $TMP/isAuto
export MAINSELECT="INSTALL"

fi # end of check if drive is big enough
