#!/bin/sh

RELEASE=6.0
PKGOSVER=6.0
#PKGRELEASE=2012Q3
WORKDIR=/usr/work/makexva/work
ROOTSIZE=$((9*1024))
SWAPSIZE=$((1*1024))
INODES=1000000

for ARCH in i386 amd64
do
PKGURL=http://ftp.netbsd.org/pub/pkgsrc/packages/NetBSD/$ARCH/${PKGOSVER}${PKGRELEASE+_$PKGRELEASE}
SETSDIR=/usr/netbsd/6.0/6.0_RELEASE/$ARCH/binary/sets
SCRATCH=$WORKDIR/scratch.$ARCH
FS=$WORKDIR/xvaimg.fs
XVA=$WORKDIR/NetBSD-$RELEASE-$ARCH.xva
ZIP=$WORKDIR/NetBSD-$RELEASE-$ARCH.zip
PACKAGES="sysutils/xenstoretools-4.1.3.tgz
	sysutils/xe-guest-utilities-6.0.2nb3.tgz"
FSSECTORS=$(($ROOTSIZE+$SWAPSIZE))
FSSECTORS=$(($FSSECTORS*2048))
STARTSEC=0
case $ARCH in
i386)
	KERNTYPE=XEN3PAE_DOMU
	PKGARCH=i386
	;;
amd64)
	KERNTYPE=XEN3_DOMU
	PKGARCH=x86_64
	;;
*)
	echo "Unknown ARCH"
	exit 1
	;;
esac

SETS="base comp etc games kern-$KERNTYPE man misc tests text xbase xcomp xetc xfont xserver"

pkgv="0"
for dir in /usr/pkg/sbin /usr/sbin
do
	[ ! -x $dir/pkg_add ] && continue
	ver=`$dir/pkg_add -V`
	[ -z "$ver" ] && continue
	if [ $ver -gt $pkgv ]; then
		PKGADD=$dir/pkg_add
		pkgv=$ver
	fi
done
if [ -z "$PKGADD" ]; then
	echo "Could not locate pkg_add"
	exit 1
fi
if [ "$pkgv" -lt 20120000 ]; then
	echo "pkg_add too old, please update"
	exit 1
fi

mkdir -p $WORKDIR

echo "Fetch packages"
for pkg in $PACKAGES
do
	ftp -o $WORKDIR/${pkg#*/} $PKGURL/$pkg
done

mkdir -p $SCRATCH || exit 1
for s in $SETS
do
	echo "Extracting $s"
	tar -xpzf $SETSDIR/$s.tgz -C $SCRATCH || exit 1
done

echo "Make devices"
(cd $SCRATCH/dev ; sh MAKEDEV all)

echo "Create fstab"
mkdir -p $SCRATCH/kern $SCRATCH/proc

cat << EOF > $SCRATCH/etc/fstab
/dev/xbd0a	/	ffs rw,log 1 1
/dev/xbd0b	none	swap sw,dp
kernfs		/kern	kernfs rw
procfs		/proc	procfs rw
EOF

echo "Configure rc.conf"
sed 's/rc_configured=NO/rc_configured=YES/' \
    $SCRATCH/etc/rc.conf > $SCRATCH/etc/rc.conf.tmp && \
    mv $SCRATCH/etc/rc.conf.tmp $SCRATCH/etc/rc.conf

echo "xenguest=YES" >> $SCRATCH/etc/rc.conf
echo "xendomname=NO" >> $SCRATCH/etc/rc.conf

echo "Install packages"
for pkg in $PACKAGES
do
	echo "-> $pkg"
	$PKGADD -m $PKGARCH -K $SCRATCH/var/db/pkg -P $SCRATCH $WORKDIR/${pkg#*/}
done

cp $SCRATCH/usr/pkg/share/examples/rc.d/* $SCRATCH/etc/rc.d

offset_a=$STARTSEC
size_a=$(($ROOTSIZE*2048-$offset_a))
size_b=$(($SWAPSIZE*2048))
offset_b=$(($offset_a+$size_a))

echo "Make image"
makefs -t ffs -s $(($size_a*512)) -f $INODES ${FS} $SCRATCH || exit 1

echo "Create swap space"
dd if=/dev/zero bs=1m count=${SWAPSIZE} >> $FS

cat << EOF > $WORKDIR/disklabel
type: unknown
disk: XenServer
label: 
flags:
bytes/sector: 512
sectors/track: 63
tracks/cylinder: 16
sectors/cylinder: 1008
cylinders: $(($FSSECTORS/1008))
total sectors: $FSSECTORS
rpm: 3600
interleave: 1
trackskew: 0
cylinderskew: 0
headswitch: 0		# microseconds
track-to-track seek: 0	# microseconds
drivedata: 0 

16 partitions:
#        size    offset     fstype [fsize bsize cpg/sgs]
 a:  $size_a $offset_a  4.2BSD   2048 16384     0
 b:  $size_b $offset_b       swap
 c: $(($FSSECTORS-$STARTSEC)) $STARTSEC     unused      0     0
 d: $FSSECTORS         0     unused      0     0
EOF
echo "Create disklabel"
disklabel -v -R -F $FS $WORKDIR/disklabel || exit 1

rm -f $WORKDIR/disklabel

echo "Convert to .xva"
python2.6 xva.py -n "NetBSD/$ARCH $RELEASE" --is-pv \
    --disk $FS \
    --bootloaderargs="--kernel=/netbsd" \
    --filename=$XVA

echo "Create zip"
rm -f $ZIP
zip -D -v $ZIP $XVA

echo "Cleaning up"
rm -rf $FS $SCRATCH
done