#!/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="`cat $TMP/SeTT_PX`"
unset P_TYPE
export MAINSELECT=""

if [ ! -d $TMP ]; then
  mkdir -p $TMP
fi

# disk chooser ##########################################
DISK=""
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"`
		#y=`readlink $i/device | grep -q usb`
		y=`udevadm info --query=all --name=$i | grep ID_BUS | grep usb`
		if [ -z "$y" ]; then
		  dglist="${dglist} ${dev} disk ''"
		  n=$(($n+1))
		fi
	done
done

dialog \
--clear \
--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} 2> $TMP/disktemp

destroy=""

if [[ -s $TMP/disktemp ]] ; then
DISK="`cat $TMP/disktemp`"
rm -f $TMP/disktemp
else
	dialog --title "AUTO PARTITION FAILED" --msgbox "No target drive found, type \"setup\" to try again" 6 75
	exit 0
fi

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

dialog \
--clear --title "AUTO PARTITION" \
--menu "\nAre you sure you want to globally erase existing data from ${DISK}?\n " \
11 75 2 \
"No" "Go back to the main setup menu" \
"Yes" "${DISK} is dedicated to Absolute" 2> $TMP/yn

destroy="`cat $TMP/yn`"
rm -f $TMP/yn

# 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`

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} 1> /dev/null
		umount /dev/${DISK}1 2> /dev/null
		parted -s /dev/${DISK} mklabel msdos
		umount /dev/${DISK} 2> /dev/null
		TOTAL=`parted -s /dev/${DISK} unit mb print free | grep /dev/${DISK} | awk '{print $3}' | cut -d "M" -f1`
		let SWAP_START=$TOTAL-8192
		parted -s /dev/${DISK} mkpart primary ext4 1MiB $SWAP_START
		umount /dev/${DISK}1
		parted -s /dev/${DISK} set 1 boot on
		umount /dev/${DISK}1
		parted -s /dev/${DISK} mkpart primary linux-swap $SWAP_START $TOTAL
		mkfs.ext4 -F -F /dev/${DISK}1
		echo "format ext4"
		sleep 3
		tune2fs -i 0 -c 96 /dev/${DISK}1

		#########################################

		printf "%-16s %-16s %-11s %-16s %-3s %s\n" "/dev/${DISK}1" "/" "ext4" "defaults,noatime" "1" "1" > $TMP/SeTnative
		mkswap -v1 /dev/${DISK}2 1> /dev/null 2> /dev/null
		swapon /dev/${DISK}2 1> /dev/null 2> /dev/null	
		
		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 ##########################################
		# zap away all partition information
		/sbin/sgdisk -Z /dev/${DISK}  1> /dev/null
		umount /dev/${DISK}1 2> /dev/null
		# make GPT partition table
		parted -s /dev/${DISK} mklabel gpt
		umount /dev/${DISK} 2> /dev/null
		TOTAL=`parted -s /dev/${DISK} unit mb print free | grep /dev/${DISK} | awk '{print $3}' | cut -d "M" -f1`
		let SWAP_START=$TOTAL-9216
		parted -s /dev/${DISK} mkpart ESP fat32 1MiB 513MiB
		umount /dev/${DISK}1 2> /dev/null
		parted -s /dev/${DISK} set 1 boot on
		umount /dev/${DISK}1 2> /dev/null
		parted -s /dev/${DISK} mkpart primary ext4 513MiB $SWAP_START
		umount /dev/${DISK}1 2> /dev/null
		parted -s /dev/${DISK} mkpart primary linux-swap $SWAP_START 100%	

		# EFI ###############
		umount /dev/${DISK}1 2> /dev/null
		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  ${T_PX}/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 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 --timeout 3 \
--textbox $TMP/tempmsg 15 75

clear
# Only USB
INSUSB

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

fi # end of check if drive is big enough
