#! /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 (消去チェック版)
#	1.0: Jun. 29, 2006 (v07pre-1, 4.11R)
#	1.1: Aug.  6, 2006 (v07pre-2, 4.11R, CDブートしない現象に対処)
#	1.2: Sep. 18, 2006 (v07pre-3, 4.11R, PXEブートの /var がない現象に対処)
#	1.3: Dec. 21, 2006 (v07pre-4, SJISドキュメント)
#	1.4: Feb. 10, 2007 (v08pre-1, 外部メディアへのログ記録)
#	1.5: Feb. 15, 2007 (nkfオプションミス訂正)
#	1.6: Feb. 16, 2007 (カーネルとファイルシステム分離)
#	1.7: Sep. 12, 2007 (v09pre-1)
#
#   usage:
#	# sh makeiso.sh [-t|-p|-f|-a]
#		-t: 小さい版 (tiny)
#		-p: PXE入り版 (pxe-boot)
#		-f: フルサイズ版 (full)
#		-a: 全部入り (all)
#

# とりあえず移動
cd /tmp

#
# どっちを作る??
#
##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='09'
#minor='999'	# 2007-09-12
#minor='000'	# official release: 000, 001, 002,...
minor='999'	# 2007-09-12

# 出力先
output="/tmp/wpout${version}${suffix}.iso"
basename=`echo $output | sed 's/\.[^.]*$//' | sed 's+^.*/++'`

#
# ボリュームラベル
#      filename-maj-min
#      0123456789abcdef
#      WIPE-OUT-04M_001
#
volsuffix=`echo $suffix | tr a-z A-Z`
volid="WIPE-OUT-${version}${volsuffix}_${minor}"

# タイムスタンプ
timestamp=`date '+%Y-%m-%d'`
echo "$volid ($timestamp)" > /tmp/version.txt

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

#
# wipe-outのファイル群
#
rc=rc
binaries="disksize stuff tinydate tinydump check makembr wpout-mbr.boot"
scripts="startup.sh mainmenu.sh seldisk.sh erase.sh fine-erase.sh sel-fine.sh verify.sh dump.sh writelog.sh copy.sh embr.sh crlf.sh floppylog.sh dummyread.sh"
misc="info.txt readme.txt"
termcap="termcap"
textfiles="$rc $scripts $misc $termcap"

ident=GENERIC
kerndir=/boot/kernel.$ident

#
# FreeBSDのシステムファイル
#

# MFSに作成するディレクトリ
dirs="bin sbin lib libexec etc dev tmp var/run var/tmp wipeout"
dirs="$dirs usr/bin usr/sbin usr/lib usr/local/bin usr/local/etc"
dirs="$dirs usr/local/share/fonts/bdf"
dirs="$dirs a mnt cdrom floppy"

# MFSにコピーするファイル
bins="sh echo dd test expr cat sleep"
bins="$bins cp date mkdir sync"
bins="$bins csh df hostname kill ln ls mv ps rm"

sbins="init ldconfig mount dmesg mount_cd9660"
sbins="$sbins umount shutdown"
sbins="$sbins mount_msdosfs mount_nfs mount_ntfs mount_ext2fs"

libs="libc.so.6 libcrypt.so.3 libedit.so.5 libncurses.so.6 libutil.so.5"
libs="$libs libkvm.so.3 libkiconv.so.2 libm.so.4"

libexecs="ld-elf.so.1"

ubins="sed dialog hd"
usbins="kbdcontrol"
ulibs="libdialog.so.5"

ulbins="kon fld"
uletcs="kon.cfg"
fonts="paw16k.bdf paw16a.bdf"

#
# mfsroot.gz の作成
#

# イメージファイル作成
dd if=/dev/zero bs=1m of=/tmp/mfsroot count=8

# 初期化
mdconfig -a -t vnode -f /tmp/mfsroot -u 0
bsdlabel -w md0 auto
newfs md0c

# マウント
mount /dev/md0c /mnt
cd /mnt

# バージョンを記録
cp /tmp/version.txt /mnt

# 必要なディレクトリを作成
cd /mnt
for d in $dirs ; do
	mkdir -p $d
done
chmod 777 /tmp

# /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 -p /usr/src/etc/login.conf /mnt/etc
cap_mkdb /mnt/etc/login.conf

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

# wipe-out関連のファイルを/etcにコピー
cd $srcdir
cp $rc /mnt/etc/rc
chmod +x /mnt/etc/rc
cp $termcap /mnt/etc

# /wipeout に必要なファイルをコピー
cd $srcdir
cp $binaries /mnt/wipeout
cp $scripts /mnt/wipeout
cp $misc /mnt/wipeout
cd /mnt/wipeout
chmod +x $scripts

# /bin
cd /mnt/bin
for f in $bins ; do
	cp -p /bin/$f .
done
# link
ln 'test' '['
# symlink
#for i in `/bin/ls /bin`; do
#	if [ ! -f $i ]; then
#		ln -s /cdrom/bin/$i $i
#	fi
#done

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

# /lib
cd /mnt/lib
for f in $libs ; do
	cp -p /lib/$f .
done

# /libexec
cd /mnt/libexec
for f in $libexecs ; do
	cp -p /libexec/$f .
done

# /usr/bin
cd /mnt/usr/bin
for f in $ubins ; do
	cp -p /usr/bin/$f .
done

# /usr/sbin
cd /mnt/usr/sbin
for f in $usbins ; do
	cp -p /usr/sbin/$f .
done

# /usr/lib
cd /mnt/usr/lib
for f in $ulibs ; do
	cp -p /usr/lib/$f .
done

# /usr/local/bin
cd /mnt/usr/local/bin
for f in $ulbins ; do
	cp -p /usr/local/bin/$f .
done

# /usr/local/etc
cd /mnt/usr/local/etc
for f in $uletcs ; do
	cp -p /usr/local/etc/$f .
done

# /usr/local/share/fonts/bdf
mkdir -p /mnt/usr/local/share/fonts/bdf
for f in $fonts ; do
	cp -p /usr/local/share/fonts/bdf/$f /mnt/usr/local/share/fonts/bdf
done

# アンマウントして圧縮
cd /tmp
umount /mnt
mdconfig -d -u 0
gzip --best < /tmp/mfsroot > /tmp/mfsroot.gz

# 
# ブートイメージの作成
#
rm -rf /tmp/cdfs

mkdir -p /tmp/cdfs/boot/kernel
mkdir -p /tmp/cdfs/boot/modules
mkdir -p /tmp/cdfs/boot/defaults

bootfils="boot boot0 boot0sio boot1 boot2 cdboot loader mbr pxeboot"
bootfils="$bootfils beastie.4th frames.4th loader.4th screen.4th support.4th"
bootfils="$bootfils device.hints loader.conf loader.help loader.rc"

for f in $bootfils ; do
	cp -p /boot/$f /tmp/cdfs/boot
done

cp -p /boot/defaults/loader.conf /tmp/cdfs/boot/defaults

echo 'mfsroot_load="YES"' >> /tmp/cdfs/boot/loader.conf
echo 'mfsroot_type="mfs_root"' >> /tmp/cdfs/boot/loader.conf
echo 'mfsroot_name="/boot/mfsroot"' >> /tmp/cdfs/boot/loader.conf
echo 'mfsroot_before="echo -n '"'"'mfsroot '"'"'"' \
	>> /tmp/cdfs/boot/loader.conf
echo 'vfs.root.mountfrom="ufs:/dev/md0c"' >> /tmp/cdfs/boot/loader.conf

cp -p $kerndir/kernel /tmp/cdfs/boot/kernel
cp -p $kerndir/linker.hints /tmp/cdfs/boot/kernel
cp /tmp/mfsroot.gz /tmp/cdfs/boot/mfsroot.gz

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

# Windowsユーザ向けにシフトJISのファイルを用意
for i in $misc ; do
	nkf -s -c $i > /tmp/cdfs/$i
done
nkf -s -c /tmp/version.txt > /tmp/cdfs/version.txt

mkdir -p /tmp/cdfs/sjis
for i in $textfiles ; do
	nkf -s -c $i > /tmp/cdfs/sjis/$i
done

# ISOイメージ作成
cd /tmp
mkisofs -b boot/cdboot -no-emul-boot -c boot.catalog \
	-r -J -V $volid -o /tmp/$basename.iso /tmp/cdfs

# アーカイブ
/bin/rm $basename.lzh $basename.tgz
lha ao5 $basename.lzh $basename.iso
tar czvf $basename.tgz $basename.iso

#
# おしまい
#
