#!/bin/bash
rootdisk=$1

clean(){

	umount /tmp/pxvdi-2/ -l
	umount /tmp/pxvdi-3/ -l
	umount /tmp/pxvdi-4/ -l
	umount  /tmp/pxvdi-iso -l

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

check(){
	echo "check pxvdi img ..."
	if [ ! -f "/pxvdi-iso/pxvdi.img" ];then
		log_exit "no pxvdi img found"
	fi
	echo "check pxvdi img success"
}

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

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

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

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

	echo "create squashfs parttion 1"
	sgdisk -a1 -n3:1025M:+2048M  $rootdisk >/dev/null 2>&1

	echo "create squashfs parttion 2"
	sgdisk -a1 -n4:3074M:+2048M  $rootdisk >/dev/null 2>&1

	echo "create userdata parttion"
	sgdisk -a1 -n5:5123M:-512M  $rootdisk >/dev/null 2>&1

	diskcheck=`echo $rootdisk |grep  -E "nvme|nbd|pmem0|mmc"`
	if [ -n "$diskcheck" ];then
		echo "special detected"
		mkfs.ext4 -F "$rootdisk"p3 || log_exit "format "$rootdisk"p3 failed"
		mkfs.ext4 -F "$rootdisk"p4 || log_exit "format "$rootdisk"p4 failed"
		mkfs.ext4 -F "$rootdisk"p5 || log_exit "format "$rootdisk"p5 failed"
		mkfs.vfat -F 32 "$rootdisk"p2 || log_exit "format "$rootdisk"p2 failed"

		e2label "$rootdisk"p3 PXVDIBASE-1
		e2label "$rootdisk"p4 PXVDIBASE-2
		e2label "$rootdisk"p5 PXVDIUSERDATA
		dosfslabel "$rootdisk"2 PXVDIBOOT

		mkdir /tmp/pxvdi-{2,3,4,5} -p
	
		mount "$rootdisk"p2 /tmp/pxvdi-2
		mount "$rootdisk"p3 /tmp/pxvdi-3
		mount "$rootdisk"p4 /tmp/pxvdi-4
		

	else
		mkfs.ext4 -F "$rootdisk"3  || log_exit "format "$rootdisk"3 failed"
		mkfs.ext4 -F "$rootdisk"4  || log_exit "format "$rootdisk"4 failed"
		mkfs.ext4 -F "$rootdisk"5  || log_exit "format "$rootdisk"5 failed"
		mkfs.vfat -F 32 "$rootdisk"2   || log_exit "format "$rootdisk"2 failed"
		e2label "$rootdisk"3 PXVDIBASE-1
		e2label "$rootdisk"4 PXVDIBASE-2
		e2label "$rootdisk"5 PXVDIUSERDATA
		dosfslabel "$rootdisk"2 PXVDIBOOT
		mkdir /tmp/pxvdi-{2,3,4,5} -p

        mount "$rootdisk"2 /tmp/pxvdi-2
		mount "$rootdisk"3 /tmp/pxvdi-3
		mount "$rootdisk"4 /tmp/pxvdi-4
		
	fi
}

build_boot(){
	echo "create boot"
	mkdir /tmp/pxvdi-2/boot
	cp  -r /pxvdi-iso/boot/grub /tmp/pxvdi-2/boot
	cp  -r /pxvdi-iso/EFI /tmp/pxvdi-2/
	echo "pxvdios" > /tmp/pxvdi-2//boot/pxvdi.info
	grub_cfg
	echo "create initramfs"
	if [ -f "/usr/sbin/update-initramfs" ];then
		update-initramfs -c -k `uname -r` -b /tmp/pxvdi-2/boot/
		echo "copy initramfs"
		cp /tmp/pxvdi-2/boot/initrd.img-`uname -r` /tmp/pxvdi-2/boot/pxvdi-initrd.img-recuse   || log_exit "copy initrd-recuse failed"
		cp /tmp/pxvdi-2/boot/initrd.img-`uname -r` /tmp/pxvdi-2/boot/pxvdi-initrd.img  || log_exit "initrd-recuse failed"
		echo "copy kernel"
		cp /boot/vmlinuz-`uname -r` /tmp/pxvdi-2/boot/pxvdi-kernel || log_exit "copy kernel failed"
		cp /tmp/pxvdi-2/boot/pxvdi-kernel /tmp/pxvdi-2/boot/pxvdi-kernel-recuse || log_exit "copy recuse kernel  failed"
		echo "clean boot"
		rm /tmp/pxvdi-2/boot/initrd.img-`uname -r` 
	else
		echo "copy initramfs"
		cp /pxvdi-iso/boot/pxvdi-initrd.img /tmp/pxvdi-2/boot/pxvdi-initrd.img-recuse   || log_exit "copy initrd-recuse failed"
		cp /pxvdi-iso/boot/pxvdi-initrd.img /tmp/pxvdi-2/boot/pxvdi-initrd.img  || log_exit "initrd-recuse failed"
		echo "copy kernel"
		cp /pxvdi-iso/boot/pxvdi-kernel /tmp/pxvdi-2/boot/pxvdi-kernel || log_exit "copy kernel failed"
		cp /pxvdi-iso/boot/pxvdi-kernel /tmp/pxvdi-2/boot/pxvdi-kernel-recuse || log_exit "copy recuse kernel  failed"
		echo "clean boot"
	fi
	
	sync
	if [ -f "/usr/sbin/grub-install" ];then
		grub-install --force --no-floppy  --boot-directory=/tmp/pxvdi-2/boot/ --target=i386-pc --recheck --debug  $rootdisk >/dev/null  2>&1 
	else
		grub2-install --force --no-floppy  --boot-directory=/tmp/pxvdi-2/boot/ --target=i386-pc --recheck --debug  $rootdisk >/dev/null  2>&1 
	fi
	umount /tmp/pxvdi-2 -l
}

copy_img(){
	echo "copy img"
	cp /pxvdi-iso/pxvdi.img /tmp/pxvdi-3/ || log_exit "copy images 1 failed"
	cp /pxvdi-iso/pxvdi.img /tmp/pxvdi-4/ || log_exit "copy images 2 failed"
	sync
	umount /tmp/pxvdi-3/ -l
	umount /tmp/pxvdi-4/ -l 
}

grub_cfg(){
cat >  /tmp/pxvdi-2/boot/grub/grub.cfg  << 'EOF'
insmod gzio
insmod iso9660
insmod png
insmod part_acorn
insmod part_amiga
insmod part_apple
insmod part_bsd
insmod part_dfly
insmod part_dvh
insmod part_gpt
insmod part_msdos
insmod part_plan
insmod part_sun
insmod part_sunpc

loadfont /boot/grub/unicode.pf2

set timeout=1
set gfxmode=auto
set gfxpayload=keep
insmod all_video
insmod gfxterm
terminal_output gfxterm

insmod gzio
insmod iso9660
insmod png

loadfont /boot/grub/unicode.pf2

set timeout=1
set gfxmode=auto
set gfxpayload=keep
insmod all_video
insmod gfxterm

terminal_output gfxterm

menuentry 'Pxvdi 主系统' --class debian --class gnu-linux --class gnu --class os {
        linux   /boot/pxvdi-kernel pxvdi=1
        initrd  /boot/pxvdi-initrd.img
}

menuentry 'Pxvdi 备用系统' --class debian --class gnu-linux --class gnu --class os {
        linux   /boot/pxvdi-kernel pxvdi=2
        initrd  /boot/pxvdi-initrd.img
}

menuentry 'Pxvdi 还原模式' --class debian --class gnu-linux --class gnu --class os {
        linux   /boot/pxvdi-kernel rd.break
        initrd  /boot/pxvdi-initrd.img
}

EOF
}


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

disk_setup
build_boot
copy_img

clean
echo "success"
