#! /bin/sh
#
#   copy.sh -- エラーを無視してデータをコピー
#
#	使い方: /bin/sh copy.sh コピー元ディスク コピー先ディスク
#		ディスク: デバイスファイルで指定、先頭の「/dev/」は省く
#		例: /bin/sh copy.sh ad0 ad1
#
#	0.0: Aug.  5, 2006 by Dai ISHIJIMA (for wpout07)
#	0.1: Feb. 10, 2007 (ログ記録 for wpout08)
#	0.2: Feb. 15, 2007 (エンターキー長押し対策)
#	0.3: Sep. 12, 2007 (wpout09)
#

srcdisk="${1:-ad0}"
dstdisk="${2:-ad1}"
dmesg="${DMESG:-/var/run/dmesg.boot}"
# 一度に32Mバイトずつ
blklen="${BLKLEN:-33554432}"
# ブロックサイズは512バイト
cbs="${CBS:-512}"
ccnt=`expr $blklen / $cbs`

if [ ! -w /dev/$dstdisk ]; then
	echo "$0: disk '$dstdisk' does not exist or is not writable"
	echo "Usage: $0 srcdisk dstdist"
	exit 1
fi

title="${TITLE:-ハードディスク消去ツール『wipe-out』}"

sname=`sed -n -E "/^${srcdisk}:.*<.*>/p" $dmesg | sed 's/.*\(<.*>\).*/\1/'`
sbytes=`disksize -B /dev/$srcdisk`
dname=`sed -n -E "/^${dstdisk}:.*<.*>/p" $dmesg | sed 's/.*\(<.*>\).*/\1/'`
dbytes=`disksize -B /dev/$dstdisk`

msg="ディスク ${srcdisk} ${sname} の\n"
msg="${msg}全データ ${sbytes}バイトを、\n"
msg="${msg}ディスク ${dstdisk} ${dname}\n"
msg="${msg}(${dbytes}バイト) にコピーします。"
msg="${msg}\n                      よろしいですか?"

sh dummyread.sh
dialog --title "$title" --yesno "$msg" 9 64

case x"$?" in
	x1)
		dialog	--title "$title" \
			--infobox 'ディスクのコピーをキャンセルしました' 3 64
		sleep 2
		exit 1
		;;
esac


msg="本当に${srcdisk}のデータを${dstdisk}にコピーしていいですか?"

sh dummyread.sh
dialog	--title "$title" \
	--hline "$dname" \
	--yesno "$msg" \
	5 72

case x"$?" in
	x1)
		dialog	--title "$title" \
			--infobox 'ディスクのコピーをキャンセルしました' 3 64
		sleep 2
		exit 1
		;;
esac

# コピーのパラメータ
bytes=`disksize -b /dev/$srcdisk`
max=`expr '(' $bytes + $cbs - 1 ')' / $cbs`

startsec=`tinydate '+%s'`
rems=''

#
echo -n "copy started: $srcdisk ($sname) -> $dstdisk ($dname) " >> $LOGFIL
echo -n "$bytes bytes with $method on " >> $LOGFIL
date >> $LOGFIL

nerrs=0
skip=0
while [ $skip -le $max ]; do
	# 計時
	cursec=`tinydate '+%s'`
	# バーグラフ
	p=`expr 100 '*' $skip / $max`
	m=`expr 1000 '*' $skip / $max`
	q=`expr $p / 2`
	i=0
	bar=''
	while [ $i -lt $q ]; do
		bar="$bar"'#'
		i=`expr $i + 1`
	done
	while [ $i -lt 50 ]; do
		bar="$bar"'_'
		i=`expr $i + 1`
	done
	# 残り時間
	elapsed=`expr $cursec - $startsec`
	if [ $m -gt 0 ]; then
		remain=`expr '(' 1000 - $m ')' '*' $elapsed / $m + 1`
		if [ $remain -gt 120 ]; then
			rems=`expr '(' $remain + 59 ')' / 60`
			rems="残り およそ${rems}分"
		else
			rems="残り およそ${remain}秒"
		fi
	fi
	if [ $elapsed -gt 120 ]; then
		elas=`expr '(' $elapsed + 30 ')' / 60`
		elas="${elas}分"
	else
		elas="${elapsed}秒"
	fi
	#
	text="ディスク ${srcdisk} のデータを ${dstdisk}にコピーしています。"
	text="${text} ${p}% 終了\n"
	text="${text}${elas} 経過  ${rems}  \n\n"
	text="${text}        0%|${bar}|100%"
	text="${text}\n${errormsg}"
	dialog --title "$title" --infobox "$text" 7 72
	echo -n "$status2"
	case x$DEBUG in
		x[Yy]*)
			status2='now in debug mode...'
			errormsg=''
			sleep 1
			;;
		*)
			status=`dd if=/dev/$srcdisk ibs=$cbs skip=$skip conv=noerror,sync obs=$cbs seek=$skip count=$ccnt of=/dev/$dstdisk 2>&1`
			status2=`echo "$status" | sed -n '/transfer/p'`
			errormsg=`echo "$status" | sed -n -E '/records (in|out)$/!p' | sed -n '/transferred in/!p'`
			;;
	esac
	# 記録
	case x"$skip" in
		x0)
			echo "skip: $skip, $status2" >> $LOGFIL
			;;
	esac
	case x"${nerrs}"x"${errormsg}" in
		x[0-8]x?*)
			echo "$errormsg" >> $LOGFIL
			nerrs=`expr $nerrs + 1`
			;;
		x9x?*)
			echo "$errormsg" >> $LOGFIL
			echo "Too many errors encounterd..." >> $LOGFIL
			nerrs=`expr $nerrs + 1`
			;;
	esac
	# 次ループ
	skip=`expr $skip + $ccnt`
done

sleep 2

#
echo "skip: $skip, $status2" >> $LOGFIL
echo -n "copy finished: $srcdisk ($sname) -> $dstdisk ($dname) " >> $LOGFIL
echo -n "$bytes bytes with $method on " >> $LOGFIL
date >> $LOGFIL

cursec=`tinydate '+%s'`
elapsed=`expr $cursec - $startsec`
if [ $elapsed -gt 120 ]; then
	min=`expr $elapsed / 60`
	sec=`expr $elapsed - $min '*' 60`
	elas="${min}分${sec}秒"
else
	elas="${elapsed}秒"
fi

sh dummyread.sh
dialog	--title "$title" \
	--msgbox "ディスクのコピーが終了しました (${elas})" 5 72

exit 0

# EOF
