#!/bin/bash
zenity=/usr/bin/zenity
mkfs_xfs=/sbin/mkfs.xfs
mksquashfs=/usr/bin/mksquashfs
mkisofs=/usr/bin/mkisofs
bootsuite_source=./bootsuite


# ======================================= #
# Helper Functions                        #
# ======================================= #
exit_if_canceled() {
	if [ $? != 0 ];then
		echo "$msg_stop"
		exit 0
	fi
}

exit_if_error() {
	code=$?
	if [ $code != 0 ];then
		if [ -n "$1" ];then
			$zenity --error --title "$msg_failed_title" --text "$msg_failed_text_A$msg_failed_text_B$1$msg_failed_text_C"
		else
			$zenity --error --title "$msg_failed_title" --text "$msg_failed_text_A$msg_failed_text_C"
		fi
		exit $code
	fi
}

check_command() {
	if [ ! -x "$1" ];then
		echo "\"$1\" が見つかりません。 $2 をインストールしてください。"
		return 1;
	else
		return 0;
	fi
}

check_root() {
	if [ "`id -u`" != 0 ];then
		return 1
	else
		return 0
	fi
}




# ======================================= #
# Texts                                   #
# ======================================= #
msg_stop="処理を終了しました。"


msg_start_title="VIVERization Tool version 0.1"
msg_start_text="HDDにインストールされているLinuxシステムをもとに、VIVERで使用できるディスクイメージを作成します。

作成にはroot権限が必要です。このツールはrootで実行してください。

次のダイアログで「対象とするLinuxシステム」と「ディスクイメージの保存先」を指定すると、作成を開始します。

作成には対象とするLinuxシステムの大きさに応じて、とても時間がかかることに注意してください。

ディスクイメージの作成を開始しますか？"


msg_noroot_title="エラー"
msg_noroot_text="作成にはroot権限が必要です。このツールはrootで実行してください"


msg_target_title="対象とするLinuxシステムのマウントポイントを選択してください"
#msg_target_default="/mnt/linux"
msg_target_default="/home/frsyuki/test/zenity/test/dist"


msg_wrongtarget_title="警告"
msg_wrongtarget_text="Linuxシステムにはほとんどの場合、/binや/sbinといったディレクトリが含まれているはずです。
しかし指定されたディレクトリには含まれていません。

それでも続行しますか？"


msg_selftarget_title="警告"
msg_selftarget_text="現在動作中のシステムを対象とすると、作成されたディスクイメージが正常に動作しない可能性があります。

起動中のシステムを対象とする場合は、シングルユーザーモードに移行してからディスクイメージの作成を開始することをお勧めします。

それでも続行しますか？"


msg_workdir_title="ディスクイメージを保存するディレクトリを指定してください"
#msg_workdir_default="$HOME/viver"
msg_workdir_default="/home/frsyuki/test/zenity/test/work"


msg_mkiso_title="CD/DVDイメージの作成"
msg_mkiso_text="ディスクイメージの作成が完了しました。

このディスクイメージを使って、このままCD/DVDイメージ(ISoイメージ)を作成できます。


今作成する場合はCD/DVDイメージに付ける名前を入力してください。

作成しない場合はキャンセルをクリックしてください。"


msg_progress_title="進捗"
msg_progress_entry1="対象システムの容量を測定"
msg_progress_entry2="対象システムをディスクイメージにコピー"
msg_progress_entry3="ディスクイメージを圧縮"


msg_success_title="成功"
msg_success_text="ディスクイメージが作成が完了しました。"


msg_failed_title="失敗"
msg_failed_text_A="ディスクイメージの作成に失敗しました"
msg_failed_text_B="
原因："

msg_failed_text_C=""

msg_nocommand="\n既にインストールされているのにメッセージが表示される場合は、
このスクリプトの先頭付近にあるパスを修正してください。"

msg_fail_target_size="対象システムのサイズの測定に失敗"
msg_fail_calc_size="ディスクイメージのサイズの計算に失敗"
msg_fail_mkworkdir="作業ディレクトリの作成に失敗"
msg_fail_dd_image="ディスクイメージの作成に失敗"
msg_fail_mkxfs="ディスクイメージをXFSでフォーマットできない"
msg_fail_mount="ディスクイメージのマウントに失敗"
msg_fail_copy_target="対象システムをディスクイメージにコピーできない"
msg_fail_squash_target="ディスクイメージの圧縮に失敗"
msg_fail_copy_bootsuite="bootsuiteをコピーできない"
msg_fail_mv_squash="圧縮ディスクイメージをISO作成ディレクトリに移動できない"
msg_fail_mkiso="ISOイメージの作成に失敗"



# ======================================= #
# Main                                    #
# ======================================= #

nofunc=0
check_command $bootsuite_source	bootsuite	|| nofunc=1
check_command $mkfs_xfs		xfsprgs		|| nofunc=1
check_command $mksquashfs	squashfs-tools	|| nofunc=1
check_command $mkisofs		mkisofs		|| nofunc=1
check_command $zenity		zenity		|| nofunc=1
if [ $nofunc -eq 1 ];then
	echo -e $msg_nocommand
	exit 1
fi



$zenity --question --title "$msg_start_title" --text "$msg_start_text"
exit_if_canceled


check_root
if [ $? -ne 0 ];then
	$zenity --error --title "$msg_noroot_title" --text "$msg_noroot_text"
	exit 1
fi


target="$($zenity --file-selection --directory --title "$msg_target_title" --filename "$msg_target_default")"
exit_if_canceled


if [ ! -d "$target/bin" -o ! -d "$target/etc" ];then
	$zenity --warning --title "$msg_wrongtarget_title" --text "$msg_wrongtarget_text"
	exit_if_canceled
fi
if [ "$target" == "/" ];then
	$zenity --warning --title "$msg_selftarget_title" --text "$msg_selftarget_text"
	exit_if_canceled
fi



workdir="$($zenity --file-selection --directory --title "$msg_workdir_title" --filename "$msg_workdir_default")"
exit_if_canceled



echo "target:  $target"
echo "workdir: $workdir"


# 対象システムのサイズを測定
target_size=$(du -s -m $target 2>/dev/null | cut -f 1 2>/dev/null)
test -n "$taret_size"


# 対象システムのサイズ × 1.02 + 20 MB のディスクイメージを作成
echo "$msg_progress_title:  1/3 $msg_progress_entry1"
image_size=$(echo "$target_size * 1.02 + 20" | bc 2>/dev/null | cut -d '.' -f 1 2>/dev/null)
test -n "$image_size"
exit_if_error "$msg_fail_calc_size"
#if [ $image_size -lt 

mkdir $workdir/fixed
exit_if_error "$msg_fail_mkworkdir"

dd if=/dev/zero of=$workdir/fixed/fixed.img bs=1M count=1 seek=$image_size
exit_if_error "$msg_fail_dd_image"


# ディスクイメージをXFSでフォーマット
$mkfs_xfs $workdir/fixed/fixed.img
exit_if_error "$msg_fail_mkxfs"


# ディスクイメージをマウント
mkdir $workdir/mount
mount $workdir/fixed/fixed.img $workdir/mount -o loop -t xfs
exit_if_error "$msg_fail_mount"


# 対象システムをディスクイメージにコピー
echo "$msg_progress_title:  2/3 $msg_progress_entry2"
(cd $target && tar cf - .) | (cd $workdir/mount && tar xf -)
exit_if_error "$msg_fail_copy_target"


# ディスクイメージをアンマウント
umount $workdir/mount
exit_if_error "$msg_fail_unmount"

# ディスクイメージを圧縮
echo "$msg_progress_title:  3/3 $msg_progress_entry3"
$mksquashfs $workdir/fixed $workdir/fixed.squash
exit_if_error "$msg_fail_squash_target"


isoname="$($zenity --entry --title "$msg_mkiso_title" --text "$msg_mkiso_text")"
exit_if_canceled


# bootsuiteをコピー
mkdir $workdir/iso
cp -a $bootsuite_source/* $workdir/iso/
exit_if_error "$msg_fail_copy_bootsuite"


# ISOイメージを作成
mv $workdir/fixed.squash $workdir/iso
exit_if_error "$msg_fail_mv_squash"
mkisofs -U -D -J -R \
	-V "$isoname" \
	-o "$workdir/$isoname.iso" \
	-b boot/grub/stage2_eltorito \
	-c boot/grub/boot.cat \
	-no-emul-boot \
	-boot-load-size 4 \
	-boot-info-table \
	-gid 0 \
	-uid 0 \
	$workdir/iso
exit_if_error "$msg_fail_mkiso"


$zenity --info --title "$msg_success_title" --text "$msg_success_text

$workdir/$isoname.iso"

