#!/bin/sh

# Copyright Jean-Philippe Guillemin <jp.guillemin@free.fr>. 
# Copyright Gerge Vlahavas <vlahavas~at~gmail~dot~com>
# 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 3 of the License,
# or (at your option) any later version. Please take a look at http://www.gnu.org/copyleft/gpl.htm

TMP=/var/log/setup/tmp
NDIR=/dev/null
REDIR=/dev/tty4
T_PX=/mnt
unset MULTIPARTITION

export MAINSELECT=""

# multipartition (rootfs_size) - Partition with a varying / partition
#                                size
# Parameters : rootfs_size     size of / partition in kB.
#
multipartition () {
	dialog --title "AUTO PARTITION" --infobox "Please wait while ${DISK} is being prepared for Salix" 0 0

cat <<EOF2 >  $TMP/layout.sfdisk
/dev/${DISK}1 : start=        , size=          $1, Id= 83, bootable
/dev/${DISK}2 : start=        , size=        1000, Id= 82
/dev/${DISK}3 : start=        , size=            , Id= 83
/dev/${DISK}4 : start=       0, size=           0, Id= 0
EOF2

	sfdisk --no-reread -f -q -D -uM /dev/${DISK} < $TMP/layout.sfdisk | grep -v "Re-read" > $TMP/sfdisk.report 2> /dev/null 
	/dev/makedevs.sh
	sfdisk -R /dev/${DISK} 1> /dev/null 2> /dev/null 
	
	# formating ##########################################	
	# root
	RootFS='xfs'
	make_xfs /dev/${DISK}1
	printf "%-16s %-16s %-11s %-16s %-3s %s\n" "/dev/${DISK}1" "/" "xfs" "defaults" "1" "1" > $TMP/SeTnative

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

	# home
	make_xfs /dev/${DISK}3
	printf "%-16s %-16s %-11s %-16s %-3s %s\n" "/dev/${DISK}3" "/home" "xfs" "defaults" "1" "2" >> $TMP/SeTnative
}

# make_xfs( dev ) - Create a new xfs filesystem on the named dev
# Parameters:  dev     Device node to format.
make_xfs() {
   # get the size of the named partition
   SIZE=`get_part_size $1`
   # output a nice status message
   dialog --title "FORMATTING" \
   --backtitle "Formatting $1 with filesystem xfs." \
   --infobox "Formatting $1  \n\
Size in 1K blocks: $SIZE \n\
Filesystem type: xfs " 0 0
   # do the format
   if mount | grep "$1 " 1> $NDIR 2> $NDIR ; then
      umount $1 2> $NDIR
   fi
   mkfs.xfs -f $1 1> $REDIR 2> $REDIR
}

# get_part_size( dev ) - Return the size in KB of the named partition.
get_part_size() {
   Size=`probe -l 2> /dev/null | grep "$1 " | tr -d "*" | tr -d "+" | crunch | cut -f 4 -d ' '`
   echo $Size
}

# disk chooser ##########################################

dglist=""
n=1
for dev in "$(cat /proc/partitions \
| grep -v '^$' \
| grep -v 'name' \
| grep -v 'ram' \
| grep -v 'loop' \
| grep -v 'sr[0-9]' \
| sed -e 's/^[ \t]*[0-9]*[ \t]*[0-9]*[ \t]*[0-9]*[ \t]*\(\([a-z]*\)[0-9]*[^0-9]*\|\([a-z\/]*[0-9]*[a-z]*[0-9]*\).*\)$/\2\3 disk \"\"/' | sort -u )" ; do

  dglist="${dglist} ${dev}"
  n=$(($n+1))
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 Salix will be installed. \
All data will be erased from the target disk. Only run this mode if the entire \
disk will be dedicated to Salix." \
$(( $n+11 )) 75 $(( $n+1 )) ${dglist} )


destroy=""

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

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

destroy=$(dialog \
--stdout \
--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 Salix"  )

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

[ "$destroy" != "Yes" ] && DISK=""

# partioning and formating ##########################################	

if [ "$destroy" = "Yes" ] ; then

# Creating nodes
case "$DISK" in
	'sda')  
		MAJOR=8
		MINOR=0	
      ;;
	'sdb')  
		MAJOR=8
		MINOR=16	
      ;;  
	'sdc')  
		MAJOR=8
		MINOR=32	
      ;;     
	'sdd')  
		MAJOR=8
		MINOR=48	
      ;; 
	'sde')  
		MAJOR=8
		MINOR=64	
      ;;    
	'sdf')  
		MAJOR=8
		MINOR=80	
      ;;    
	'sdg')  
		MAJOR=8
		MINOR=96	
      ;; 
	'sdh')  
		MAJOR=8
		MINOR=112	
      ;; 
	'sdi')  
		MAJOR=8
		MINOR=128	
      ;; 
	'sdj')  
		MAJOR=8
		MINOR=144	
      ;; 
	'hda')  
		MAJOR=3
		MINOR=0	
      ;;
	'hdb')  
		MAJOR=3
		MINOR=64	
      ;;
	'hdc')  
		MAJOR=22
		MINOR=0	
      ;;	
	'hdd')  
		MAJOR=22
		MINOR=64	
      ;;	
esac

mknod /dev/${DISK}1 b $MAJOR $(( $MINOR + 1 )) 1> /dev/null 2> /dev/null
mknod /dev/${DISK}2 b $MAJOR $(( $MINOR + 2 )) 1> /dev/null 2> /dev/null
mknod /dev/${DISK}3 b $MAJOR $(( $MINOR + 3 )) 1> /dev/null 2> /dev/null


DisksizeInKB=$(sfdisk --no-reread -s /dev/${DISK} 2> /dev/null)
DisksizeInMB=$(( $DisksizeInKB / 1024 )) 
clear

if [ $DisksizeInMB -lt 3000 ] ; then
	dialog --title "AUTO PARTITION" --msgbox "${DISK} is only $DisksizeInKB KB , you need at least 3000000 KB to install Salix" 4 75

elif [ $DisksizeInMB -lt 14000 ] ; then
	dialog --title "AUTO PARTITION" --infobox "Please wait while ${DISK} is being prepared for Salix" 0 0
	rootsize=$(($DisksizeInMB - 1000))

cat <<EOF1 >  $TMP/layout.sfdisk
/dev/${DISK}1 : start=        , size=  $rootsize, Id= 83, bootable
/dev/${DISK}2 : start=        , size=           , Id= 82
/dev/${DISK}3 : start=       0, size=         0, Id= 0
/dev/${DISK}4 : start=       0, size=         0, Id= 0
EOF1

	sfdisk --no-reread -f -q -uM /dev/${DISK} < $TMP/layout.sfdisk | grep -v "Re-read" > $TMP/sfdisk.report 2> /dev/null  
	/dev/makedevs.sh
	sfdisk -R /dev/${DISK} 1> /dev/null 2> /dev/null 
		
	# formating ##########################################	
	# root
	RootFS='xfs'
	make_xfs /dev/${DISK}1
	printf "%-16s %-16s %-11s %-16s %-3s %s\n" "/dev/${DISK}1" "/" "xfs" "defaults" "1" "1" > $TMP/SeTnative

	# swap
	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
		
elif [ $DisksizeInMB -lt 40000 ] ; then
	MULTIPARTITION=1
	multipartition 10000
else
	MULTIPARTITION=1
	multipartition 15000
fi

echo "/dev/${DISK}1" > $TMP/SeTrootdev
mount -t $RootFS /dev/${DISK}1 $T_PX 1> /dev/null 2> /dev/null
if [ $MULTIPARTITION -eq 1 ];then
	mkdir $T_PX/home
	mount -t $RootFS /dev/${DISK}3 $T_PX/home 1> /dev/null 2> /dev/null
fi

# Done, report to the user:

#dialog --title "AUTO PARTITION" --msgbox "$(cat $TMP/sfdisk.report)" 0 0

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

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

fi


