#! /bin/sh
#
#   mainmenu.sh -- CD-ROM版メインメニュー
#
#	0.0: Jun. 20, 2004 by Dai ISHIJIMA (for wpout03)
#	0.1: Jul. 11  2004 (for wpout04)
#	0.2: Jun. 23  2005 (for wpout05)
#	0.3: Jul.  8  2005 (for wpout06)
#	0.4: Aug.  5, 2006 (for wpout07)
#	0.5: Dec. 21, 2006 (erase MBR)
#	0.6: Feb. 10, 2007 (ログ記録 for wpout08)
#	0.7: Feb. 15, 2007 (エンターキー長押し対策)
#	0.8: Feb. 18, 2007 (メニューの順番を変更)
#	0.9: Sep. 12, 2007 (wpout09, FreeBSD 6.2R)
#	1.0: Sep. 17, 2007 (shutdown時の画面復帰)
#	1.1: Oct.  6, 2007 (expr(1) のPOSIX準拠対応)
#	1.2: Feb. 10, 2008 (ヘルプメッセージの表示、動作ログの表示)
#	1.3: Apr. 19, 2009 (高速ディスクコピー, wpout10)
#	1.4: Sep. 30, 2009 (IBM ServeRAID, ips(4), /dev/ipsd%d)
#	1.5: Dec. 22, 2012 (smartctl)
#	1.6: Feb.  1, 2014 (先頭に戻る)
#

# 
dmesg="${DMESG:-/var/run/dmesg.boot}"
devices="${DEVICES:-da|ad|ar|aacd|amrd|idad|ipsd|mfid|mlxd|twed}"
#
export LOGFIL="${LOGFIL:-/tmp/wpoutlog.txt}"
export ERRORLOG="${ERRORLOG:-/tmp/wperrlog.txt}"
export DISPUPD="${DISPUPD:-2}"

cbs="${CBS:-512}"
obs="${OBS:-1048576}"

resultfil=/tmp/result
nsec=/tmp/sector
stuffs='10'
sed -n -E "/^(${devices})[0-9][0-9]*:.*</p" $dmesg |
	sed 's/^\([a-z][a-z]*[0-9][0-9]*\).*/\1/' > $resultfil
disk=`sed -n '1p' $resultfil`
export TITLE='ハードディスク消去ツール『wipe-out』'
dumpskip=0

echo '# ---------------------------- #' >> $LOGFIL
echo -n "script mainmenu.sh started on " >> $LOGFIL
date >> $LOGFIL

echo '# ---------------------------- #' >> $ERRORLOG
echo -n "script mainmenu.sh started on " >> $ERRORLOG
date >> $ERRORLOG

while true ; do
	dname=`sed -n -E "/^${disk}:.*<.*>/p" $dmesg | sed 's/.*\(<.*>\).*/\1/'`
	bytes=`disksize -B /dev/$disk`
	cap=`disksize -p /dev/$disk`

	msg="                      ★メインメニュー★\n"
	msg="${msg}現在選択中のディスクは /dev/${disk} ${dname} です。\n"
	msg="${msg}ディスクの容量は $bytes バイト ($cap) です。\n"
	msg="${msg}以下のメニューから処理を選択してください。\n"

	sh dummyread.sh
	dialog 	2>$resultfil \
		--title "$TITLE" \
		--menu "$msg" \
		20 74 8 \
		z '0を上書きして、このディスクのデータを消す' \
		h '操作方法の概要を表示する' \
		n '複数回上書きして、このディスクのデータを念入りに消す' \
		m '念入り消去の上書き方法を選択する' \
		v 'データが消去されたか確認する (高速／一部をチェック)' \
		V 'データが消去されたか確認する (通常／全部をチェック)' \
		w '消去ログをディスクに書き込む' \
		L '動作記録をフロッピーに書き出す' \
		s '別のディスクを選択する' \
		d 'ディスクのデータを表示する' \
		S 'データを表示するセクタの指定' \
		a '「『wipe-out』について」を見る' \
		D '起動時のシステムメッセージを確認する' \
		Y 'ディスクをコピーする（高速／バックアップ向け）' \
		y 'ディスクをコピーする（低速／データサルベージ向け）' \
		f '1を上書きして、このディスクのデータを消す' \
		p 'ランダムパターンを上書きして、このディスクのデータを消す' \
		q 'パターンの補数を上書きして、このディスクのデータを消す' \
		r 'ランダムデータを上書きして、このディスクのデータを消す' \
		P '動作記録を表示する' \
		T 'ディスクの自己診断情報 (SMART情報) を表示する' \
		b 'シェル (sh) を起動する' \
		t 'シェル (csh) を起動する' \
		M 'CD-ROMをmountする' \
		U 'CD-ROMをumountする' \
		B 'MBR *のみ* を消去する' \
		x 'シャットダウンする' \
		R '再起動する' \
		N 'メニューの先頭に戻る' \
		# end of menu
	case x"$?" in
		x1)
			break
			;;
	esac

	result=`cat $resultfil`

	case x"${result}" in
		x[zfrpq])
			sh erase.sh -$result $disk
			;;
		xh)
			dialog	--title '操作方法の概要' \
				--textbox help.txt 22 76
			;;
		xs)
			. seldisk.sh
			;;
		xn)
			sh fine-erase.sh $stuffs $disk
			;;
		xm)
			. sel-fine.sh
			;;
		xv)
			sh verify.sh 90 $disk
			;;
		xV)
			sh verify.sh 0 $disk
			;;
		xw)
			sh writelog.sh $disk
			;;
		xL)
			sh floppylog.sh
			;;
		xd)
			sh dump.sh $dumpskip $disk
			dumpskip=`expr $dumpskip + 1`
			;;
		xS)
			msg="セクタを指定してください ($dumpskip)"
			dialog	2>/tmp/sector \
				--title "$TITLE" \
				--inputbox "$msg" 8 64
			case x"$?" in
			    x0)
				echo '' >> $nsec
				echo "$dumpskip" >> $nsec
				dumpskip=`sed -n '/^[0-9]/p' $nsec | sed -n 1p`
				;;
			esac
			;;
		xa)
			dialog	--title '『wipe-out』について' \
				--textbox info.txt 22 76
			;;
		xD)
			dialog	--title '起動時のシステムメッセージ' \
				--textbox /var/run/dmesg.boot 22 76
			;;
		xy)
			srcdisk=$disk
			. seldisk.sh
			dstdisk=$disk
			sh copy.sh $srcdisk $dstdisk $cbs
			disk=$srcdisk
			;;
		xY)
			srcdisk=$disk
			. seldisk.sh
			dstdisk=$disk
			sh copy.sh $srcdisk $dstdisk $obs
			disk=$srcdisk
			;;
		xP)
			echo "::: $LOGFIL :::" > /tmp/loglog.txt
			cat $LOGFIL >> /tmp/loglog.txt
			echo '' >> /tmp/loglog.txt
			for f in /tmp/erase-log.* ; do
				if [ -f "$f" ]; then
					echo "::: $f :::" >> /tmp/loglog.txt
					cat $f >> /tmp/loglog.txt
					echo '' >> /tmp/loglog.txt
				fi
			done
			for f in /tmp/verify-log.* ; do
				if [ -f "$f" ]; then
					echo "::: $f :::" >> /tmp/loglog.txt
					cat $f >> /tmp/loglog.txt
					echo '' >> /tmp/loglog.txt
				fi
			done
			echo '::: shell variables :::' >> /tmp/loglog.txt
			set >> /tmp/loglog.txt
			echo '' >> /tmp/loglog.txt
			dialog	--title '動作ログ' \
				--textbox /tmp/loglog.txt 22 76
			;;
		xT)
			/usr/local/sbin/smartctl -s on /dev/$disk \
				> /tmp/smart.txt 2>&1
			/usr/local/sbin/smartctl -a /dev/$disk \
				> /tmp/smart.txt 2>&1
			echo '' >> $LOGFIL
			echo '::: SMART (smartctl output) :::' >> $LOGFIL
			cat /tmp/smart.txt >> $LOGFIL
			dialog	--title 'SMARTログ' \
				--textbox /tmp/smart.txt 22 76
			;;
		xb)
			/bin/sh -i
			;;
		xt)
			if [ -x /bin/csh ]; then
				/bin/csh -i
			else
				msg='cshの入ったCD-ROMをマウントしてください'
				dialog	--title "$TITLE" \
					--msgbox "$msg" 5 64
			fi
			;;
		xM)
			if [ -x /cdrom/usr.bin/dialog ]; then
				msg='CD-ROMはすでにマウントされています'
			elif mount_cd9660 $CDROM /cdrom > /dev/null 2>&1; then
				msg='CD-ROMをマウントしました'
			else
				msg='CD-ROMをマウントできませんでした'
			fi
			dialog	--title "$TITLE" \
				--msgbox "$msg" 5 64
			;;
		xU)
			msg=''
			if [ ! -x /cdrom/usr.bin/dialog ]; then
				msg='CD-ROMはすでにアンマウントされています'
			fi
			if umount /cdrom > /dev/null 2>&1; then
				msg='CD-ROMをアンマウントしました'
			elif [ -z "$msg" ]; then
				msg='CD-ROMアンマウントできませんでした'
			fi
			dialog	--title "$TITLE" \
				--msgbox "$msg" 5 64
			;;
		xB)
			sh embr.sh $disk
			;;
		xx)
			echo "halt" > /var/run/nologin
			exit 1
			;;
		xR)
			echo "reboot" > /var/run/nologin
			exit 1
			;;
		#xN)
		#	NOP
		#	;;
	esac
done

dialog	--title "$TITLE" \
	--infobox '終了します' 3 48

echo '「/bin/sh /wipeout/mainmenu.sh」でメニュー画面を呼び出せます。'
echo ''

exit 0

# EOF
