#! /bin/sh
#
#   makeiso.sh -- ハードディスク消去用ブートCDの作成
#
#   revision history:
#	0.0: Oct. 26, 2001 by Dai ISHIJIMA
#	0.1: Oct. 22, 2002 (add diskinfo)
#	0.2: May   1, 2004 (4.8R, disklabel, random data)
#	0.3: May   1, 2004 (makefd.sh -> makeiso.sh)
#	0.4: Jun. 15, 2004 (dialog, cd9660)
#	0.5: Jun. 19, 2004 (フルサイズ版、小さい版)
#	0.6: Jun. 27, 2004 (念入り消去, fine-erase.sh)
#	0.7: Oct. 18, 2004 (全部入りISOイメージ作成)
#	0.8: Jun. 19, 2005 (CDアンマウント版, PXE用カーネル)
#	0.9: Jul.  8, 2005 (消去チェック版)
#
#   usage:
#	# sh makeiso.sh [-t|-p|-f|-a]
#		-t: 小さい版 (tiny)
#		-p: PXE入り版 (pxe-boot)
#		-f: フルサイズ版 (full)
#		-a: 全部入り (all)
#

#
# どっちを作る??
#
####size=full	# CD-ROMにイロイロ詰めこんだバージョン
size=tiny	# サイズの小さいバージョン
pxe=no
suffix=t
case x"$1" in
	x-a*)
		size=all
		pxe=yes
		suffix=a
		;;
	x-[fm]*)
		size=full
		pxe=yes
		suffix=m
		;;
	x-p*)
		size=tiny
		pxe=yes
		suffix=p
		;;
	x-[st]*) size=tiny
		pxe=no
		suffix=t
		;;
esac

# バージョン
version='06'
minor='000'

# このファイルその他を置いた場所
srcdir=/home/dai/src/wipe-out/v$version/menu

rc=rc
binaries="diskinfo stuff tinydate tinydump check"
scripts="startup.sh mainmenu.sh seldisk.sh erase.sh fine-erase.sh sel-fine.sh verify.sh dump.sh"
misc="info.txt"
termcap="termcap"

ident=WIPEOUT

kernel=/sys/compile/$ident/kernel
sbins="init mount_cd9660 dmesg ldconfig"
devs="all"
basebins="dd echo sh test expr"
bins="$basebins cat sleep"
bins_in_cd="cp csh df hostname kill ln ls mkdir mv ps rcp rm sync"
sbins_in_cd="mount mount_ext2fs mount_msdos mount_nfs mount_ntfs umount"
ubins="/tmp/sed/sed /tmp/dialog/dialog"
output="/tmp/wpout${version}${suffix}.iso"
basename=`echo $output | sed 's/\.[^.]*$//' | sed 's+^.*/++'`

# 日本語表示 (あらかじめ static link で kon を用意しておく)
fontdir=/usr/local/share/fonts/bdf
font=pawfont
#font=k14
konbin="/usr/local/bin/kon /usr/local/bin/fld"
koncfg="/usr/local/etc/kon-$font.cfg"
fonts="$fontdir/paw16a.bdf $fontdir/paw16k.bdf"
case "$font" in
	k14) fonts="$fontdir/7x14rk.bdf $fontdir/k14.bdf" ;;
esac

#
# 必要なファイルは揃っているか
#

# write_mfs_in_kernel
if [ ! -f /usr/src/release/write_mfs_in_kernel.c ] ; then
	echo 'unable to compile "write_mfs_in_kernel"'
	exit 1
fi

# kernel
if [ ! -f $kernel ] ; then
	echo 'no kernel found'
	exit 1
fi

# diskinfo
if [ ! -x $srcdir/diskinfo ]; then
	echo 'No diskinfo binary'
	exit 1
fi

#
# static link なバイナリを用意
#
if [ ! -x /tmp/sed/sed ]; then
	if [ ! -x /usr/src/usr.bin/sed ]; then
		echo 'no source of sed'
		exit 1
	fi
	echo "Making static-linked 'sed'..."
	cd /tmp
	(cd /usr/src/usr.bin; tar cf - sed) | tar xvf -
	cd sed
	patch -p1 < $srcdir/sed.patch
	make
fi
if [ ! -x /tmp/dialog/dialog ]; then
	if [ ! -x /usr/src/gnu/usr.bin/dialog ]; then
		echo 'no source of dialog'
		exit 1
	fi
	echo "Making static-linked 'dialog'..."
	cd /tmp
	(cd /usr/src/gnu/usr.bin; tar cf - dialog) | tar xvf -
	cd dialog
	patch -p1 < $srcdir/dialog.patch
	make
fi


#
# write_mfs_in_kernel を作る
#
if [ ! -x /tmp/write_mfs_in_kernel/write_mfs_in_kernel ]; then
	echo "Making write_mfs_in_kernel..."
	mkdir /tmp/write_mfs_in_kernel
	cd /tmp/write_mfs_in_kernel
	cp /usr/src/release/write_mfs_in_kernel.c .
	cc -o write_mfs_in_kernel write_mfs_in_kernel.c
fi


#
# MFSに入れるファイルシステムを作る
#
echo "Making file system onto MFS..."
cd /tmp
### 18セクタ, 240シリンダ -> 9kバイト/トラック, 480トラック (1.4M FD三枚分)
##dd of=mfs-image if=/dev/zero count=480 bs=9216
# 18セクタ, 320シリンダ -> 9kバイト/トラック, 640トラック (1.4M FD4枚分)
dd of=mfs-image if=/dev/zero count=640 bs=9216
vnconfig -s labels -c /dev/vn0 mfs-image
# ディスクラベル
####disklabel -w -B -b /boot/boot1 -s /boot/boot2 /dev/rvn0c minimum3
disklabel -w -B -b /boot/boot1 -s /boot/boot2 vn0 auto
newfs -t 2 -u 18 -l 1 -c 80 -i 4096 -m 5 -o space /dev/rvn0c

# -t [track/cylinder]
# -u [sectors/track]
# -l [interleave factor]
# -i [bytes/inode]
# -m [MINFREE]
# -o [optimize]

#
# MFSをマウントする
#
echo "Mounting MFS..."
mount /dev/vn0c /mnt

#
# デバイスファイルを作る
#
echo "Making device files..."
mkdir /mnt/dev
cd /mnt/dev
cp /dev/MAKEDEV .
for i in $devs; do
	./MAKEDEV $i
done

#
# /tmp ディレクトリを作る
#
echo "Making tmp..."
mkdir /mnt/tmp
chmod 777 /mnt/tmp

# マウントポイント
mkdir /mnt/a
mkdir /mnt/mnt
mkdir /mnt/cdrom

#
# /etc ディレクトリを作る
#
echo "Making etc..."
mkdir /mnt/etc
cd /mnt/etc
echo 'root:*:0:0:Charlie &:/:/bin/sh' > /mnt/etc/passwd
echo 'root:*:0:0::0:0:Charlie &:/:/bin/sh' > /mnt/etc/master.passwd
pwd_mkdb -d /mnt/etc /mnt/etc/master.passwd

cp /usr/src/etc/login.conf /mnt/etc
cap_mkdb /mnt/etc/login.conf

cp /usr/src/etc/etc.i386/ttys /mnt/etc
cp /usr/src/etc/group /mnt/etc
cp /usr/src/etc/services /mnt/etc
cp /usr/src/etc/protocols /mnt/etc

#
cd $srcdir
cp $rc /mnt/etc/rc
chmod +x /mnt/etc/rc
cp $termcap /mnt/etc

#
# /bin
#
echo "Copying binaries..."
mkdir /mnt/bin
cd /mnt/bin
for i in $bins; do
	cp /bin/$i /mnt/bin/$i
done
cd /mnt/bin
ln 'test' '['

# link
cd /mnt/bin
for i in `/bin/ls /bin`; do
	if [ ! -f $i ]; then
		ln -s /cdrom/bin/$i $i
	fi
done

mkdir /mnt/wipeout
cd $srcdir
cp $binaries /mnt/wipeout
cp $scripts /mnt/wipeout
cp $misc /mnt/wipeout
cd /mnt/wipeout
chmod +x $scripts
cd /tmp

#
# /sbin
#
mkdir /mnt/sbin
cd /mnt/sbin
for i in $sbins; do
	cp /sbin/$i /mnt/sbin/$i
done

# link
cd /mnt/sbin
for i in `/bin/ls /sbin`; do
	if [ ! -f $i ]; then
		ln -s /cdrom/sbin/$i $i
	fi
done

#
# /usr
#
mkdir -p /mnt/usr
cd /mnt/usr
ln -s /cdrom/usr/bin bin
ln -s /cdrom/usr/lib lib
ln -s /cdrom/usr/sbin sbin
ln -s /cdrom/usr/libexec libexec

#
# kon
#
mkdir -p /mnt/usr/local/bin
cp $konbin /mnt/usr/local/bin
mkdir -p /mnt/usr/local/etc
cp $koncfg /mnt/usr/local/etc/kon.cfg
mkdir -p /mnt/usr/local/share/fonts/bdf
cp $fonts /mnt/usr/local/share/fonts/bdf

mkdir -p /mnt/var/run
mkdir -p /mnt/var/tmp

#
# MFSをアンマウント
#
cd /tmp
umount /mnt
vnconfig -u /dev/vn0


#
#
#
echo "Writing file system into kernel..."
cp $kernel /tmp
/tmp/write_mfs_in_kernel/write_mfs_in_kernel /tmp/kernel /tmp/mfs-image

#
# カーネルを圧縮
#
echo "Compressing kernel..."
cd /tmp
gzip --best < /tmp/kernel > /tmp/kernel.gz
chmod +x kernel.gz

#exit 0

#
# フロッピーイメージの作成
#
echo "Making boot floppy image..."

# 18セクタ, 80シリンダ -> 9kバイト/トラック, 320トラック (2.8M FD)
dd of=floppy-image if=/dev/zero count=320 bs=9216
vnconfig -s labels -c /dev/vn0 floppy-image

# ディスクラベル
disklabel -w -B -b /boot/boot1 -s /boot/boot2 /dev/rvn0c minimum2
newfs -t 2 -u 18 -l 1 -c 80 -i 65536 -m 0 -o space /dev/rvn0c

#
# フロッピーイメージをマウント
#
mount /dev/vn0a /mnt

#
# 圧縮したカーネルをブートフロッピーイメージにコピー
#
mkdir /mnt/boot
cp /boot/boot1 /mnt/boot
cp /boot/boot2 /mnt/boot
cp /boot/loader /mnt/boot

cp -f /tmp/kernel.gz /mnt/kernel.gz

cd /tmp
umount /mnt
vnconfig -u /dev/vn0

#
# CD-ROMに格納するファイルを用意する
#
rm -rf /tmp/cdfs
mkdir /tmp/cdfs

# MFSでマウントされるファイルシステムをコピー
case "$size" in
	[af]*)
		mkdir -p /tmp/cdfs/floppy-fs
		vnconfig -c /dev/vn0 mfs-image
		mount /dev/vn0c /mnt
		(cd /mnt; tar cf - . ) | (cd /tmp/cdfs/floppy-fs; tar xvpf -)
		umount /mnt
		vnconfig -u /dev/vn0
		;;
esac

# ブートフロッピーイメージをコピー。mkisofsでこのイメージを指定する
cp /tmp/floppy-image /tmp/cdfs

# ソース一式をコピー
mkdir -p /tmp/cdfs/src
cd $srcdir
cp -p * /tmp/cdfs/src

# CD-ROMに格納するファイルシステム
case "$size" in
	# フルサイズ版はイロイロとコピーしておく
	[af]*)
		# CD-ROMの /bin /sbin ファイルシステム
		for i in bin sbin ; do
			mkdir -p /tmp/cdfs/$i
			cd /tmp/cdfs/$i
			(cd /$i; tar cf - .) | tar xvpf -
		done
		
		# CD-ROMの /etc ファイルシステム
		mkdir -p /tmp/cdfs/etc
		cd /tmp/cdfs/etc
		(cd /usr/src/etc; tar cf - .) | tar xvpf -
		
		# CD-ROMの /usr/* ファイルシステム
		for i in bin lib sbin libexec ; do
			mkdir -p /tmp/cdfs/usr/$i
			cd /tmp/cdfs/usr/$i
			(cd /usr/$i; tar cf - .) | tar xvpf -
		done
		
		# ちょっと節約
		cd /tmp/cdfs/usr/lib
		/bin/rm -rf aout compat lib*.a
		cd /tmp/cdfs/usr/libexec
		/bin/rm -rf cc1 cc1obj f771 cc1plus lpr sendmail sm.bin uucp
		cd /tmp/cdfs/usr/sbin
		/bin/rm -rf named
		;;
	# 普通バージョンはだいぶ節約
	t*)
		mkdir /tmp/cdfs/bin
		cd /tmp/cdfs/bin
		(cd /bin; tar cf - $bins_in_cd) | tar xvpf -
		mkdir /tmp/cdfs/sbin
		cd /tmp/cdfs/sbin
		(cd /sbin; tar cf - $sbins_in_cd) | tar xvpf -
		;;		
esac

#
# static link binaries
#
mkdir -p /tmp/cdfs/usr.bin
cp $ubins /tmp/cdfs/usr.bin


#
# PXEブート用カーネルの作成
#
case "x$pxe" in
	xyes)
		# イメージファイルに /usr.bin を追加
		cd /tmp
		vnconfig -c /dev/vn0 mfs-image
		mount /dev/vn0c /mnt
		mkdir /mnt/usr.bin
		cp $ubins /mnt/usr.bin
		umount /mnt
		vnconfig -u /dev/vn0

		# カーネルをCD-ROMイメージへ
		cp $kernel /tmp
		/tmp/write_mfs_in_kernel/write_mfs_in_kernel \
			/tmp/kernel /tmp/mfs-image
		cp /tmp/kernel /tmp/cdfs

		# pxeboot他のブートコードも
		mkdir /tmp/cdfs/boot
		(cd /boot; tar cf - .) | (cd /tmp/cdfs/boot; tar xvf -)
		;;
esac

#
# 全部入りのファイルを用意する
#
case "$size" in
	a*)
		mkdir -p /tmp/cdfs/images
		cp /tmp/wpout${version}f.flp /tmp/cdfs/images
		cp /tmp/wpout${version}t.iso /tmp/cdfs/images
		cp /tmp/wpout${version}m.lzh /tmp/cdfs/images
		cp /tmp/wpout${version}s.lzh /tmp/cdfs/images
		cd /tmp/cdfs/images
		md5 wpout* > md5sums.txt
		;;
esac

cd /tmp

#      filename-maj-min
#      0123456789abcdef
#      WIPE-OUT-04M_001
#
volsuffix=`echo $suffix | tr a-z A-Z`
volid="WIPE-OUT-${version}${volsuffix}_${minor}"

mkisofs -d -D -V $volid -J -r -b floppy-image -o $output /tmp/cdfs
# -d 「.」なしのファイル名, -D 深いディレクトリ階層を再配置しない
# -V ボリュームID, -f シンボリックリンクをたどる, -J Windows向けJoliet拡張
# -r ファイルモード設定, -b ブートイメージ(ターゲット相対), -o 出力先
####mkisofs -d -D -V ERASEHDJ -f -J -r -b floppy-image -o $output /tmp/cdfs
#

/bin/rm $basename.lzh $basename.tgz
lha ao5 $basename.lzh $basename.iso
tar czvf $basename.tgz $basename.iso
#
# おしまい
#
