#!/bin/bash
rootdisk=$1
pxvdi_target="/tmp/target"

log_exit(){
    echo "$1"
    clean_chroot
    exit 1;
}


disk_setup(){
	for rootdisks in $rootdisk; do
	dd if=/dev/zero of=$rootdisks bs=1M count=24 || log_exit "clean disk failed"
	echo "create gpt"

	sgdisk -GZ $rootdisks >/dev/null 2>&1
	echo "create bios parttion"

	sgdisk -a1 -n1:34:2047  -t1:EF02  $rootdisks >/dev/null 2>&1
	echo "create efi parttion"

	sgdisk -a1 -n2:1M:+512M -t2:EF00 $rootdisks >/dev/null 2>&1

	echo "create root parttion"
	sgdisk -a1 -n3:513M:-1G  $rootdisks >/dev/null 2>&1
	diskcheck=`echo $rootdisk |grep  -E "nvme|nbd|pmem0|mmc"`
	if [ -n "$diskcheck" ];then
		echo "special detected"
		mkfs.ext4 -F "$rootdisks"p3
        mount "$rootdisks"p3 $pxvdi_target
		mkfs.vfat -F 32 "$rootdisks"p2
	else
		mkfs.ext4 -F "$rootdisks"3  || log_exit "format rootfs failed"
        mount "$rootdisks"3 $pxvdi_target  || log_exit "mount target failed"
		mkfs.vfat -F 32 "$rootdisks"2  || log_exit "format efi partition failed"
	fi
	done
}

grub_install(){
	echo "create grub"
	chroot $pxvdi_target /usr/sbin/update-initramfs -c -k all  >/dev/null 2>&1
	chroot $pxvdi_target /usr/sbin/update-initramfs -u -k all  >/dev/null 2>&1
	echo "create efi boot"
	mkdir $pxvdi_target/boot/efi
	if [ -n "$diskcheck" ];then
		echo "special detected"
		chroot $pxvdi_target mount "$rootdisk"p2 /boot/efi || log_exit "mount boot partition failed !"
	else
		chroot $pxvdi_target mount "$rootdisk"2 /boot/efi || log_exit "mount boot partition failed !"
	fi
	chroot $pxvdi_target update-grub || log_exit "create grub failed"
	mkdir $pxvdi_target/boot/efi/EFI/boot/ -p
	chroot $pxvdi_target grub-install --target x86_64-efi --uefi-secure-boot --no-floppy --bootloader-id='pxvdi' $rootdisk || log_exit "install grub failed"
	cp $pxvdi_target/boot/efi/EFI/pxvdi/* $pxvdi_target/boot/efi/EFI/boot/
	mv $pxvdi_target/boot/efi/EFI/boot/grubx64.efi $pxvdi_target/boot/efi/EFI/boot/bootx64.efi
	echo "create bios boot"
	chroot $pxvdi_target grub-install --target=i386-pc --recheck --debug $rootdisk >/dev/null 2>&1
}

prepare_chroot(){
	#挂载roofs之前准备
	echo "prepare chroot"
	mount -n -t tmpfs tmpfs $pxvdi_target/tmp
	mount -n -t proc /proc  $pxvdi_target/proc
	mount -n -o bind /dev  $pxvdi_target/dev
	mount -n -o bind /dev/pts  $pxvdi_target/dev/pts
	mount -n -t sysfs sysfs $pxvdi_target/sys 
	mkdir $pxvdi_target/mnt/hostrun
	mount --bind /run $pxvdi_target/mnt/hostrun
	chroot $pxvdi_target mount --bind /mnt/hostrun /run
}

clean_chroot(){
	echo "clean chroot"
	echo clean
	umount -l $pxvdi_target/proc
	umount -l $pxvdi_target/sys
	umount -l $pxvdi_target/dev/pts
	umount -l $pxvdi_target/dev
	umount -l $pxvdi_target/boot/efi/
	umount -l $pxvdi_target
    umount -l /dev/loop0
}

mount_fstab(){
	#fstab
	echo "create fstab"
	if [ -n "$diskcheck" ];then
		echo "special detected"
		efiboot=$(blkid "$rootdisk"p2|awk  '{print $2}'|sed "s/\"//g")
		echo "proc /proc proc defaults 0 0" > $pxvdi_target/etc/fstab 
		echo "$efiboot /boot/efi vfat defaults 0 0" >> $pxvdi_target/etc/fstab
		rootboot=$(blkid "$rootdisk"p3|awk  '{print $2}'|sed "s/\"//g")
		echo "$rootboot / ext4 errors=remount-ro 0 1" >> $pxvdi_target/etc/fstab
	else
		efiboot=$(blkid "$rootdisk"2|awk  '{print $2}'|sed "s/\"//g")
		echo "proc /proc proc defaults 0 0" > $pxvdi_target/etc/fstab
		echo "$efiboot /boot/efi vfat defaults 0 0" >> $pxvdi_target/etc/fstab
		rootboot=$(blkid "$rootdisk"3|awk  '{print $2}'|sed "s/\"//g")
		echo "$rootboot / ext4 errors=remount-ro 0 1" >> $pxvdi_target/etc/fstab
	fi
}

install_kernel(){
    chroot   $pxvdi_target dpkg -i /livetools/*.deb  || log_exit "install kernel failed"
}

if [ -z $1 ];then
echo "安装磁盘不存在，无法继续"
exit 0;
fi

echo "create pxvdi base target"
mkdir -p /tmp/target
echo "format disk"
disk_setup
echo "mount disk and squashfs"
mount /dev/loop0 /opt ||  log_exit "mount loop failed"
echo "copy rootfs"
rsync -ra /opt/*  /tmp/target 
prepare_chroot

# create boot fstab
mount_fstab
# create kernel 
#install_kernel
# create grub
grub_install
clean_chroot

echo "success"
