#!/bin/sh

DATADIR="/usr/share/vbuilder"
CACHEDIR="/var/cache/vbuilder"

COMMAND=$1
INSTROOT=$2
VERSION=$3
ARCH=$4
INSTALLSET=$5

case "$COMMAND" in
	install|update)
		;;
	*)
		echo "invalid command." >&2
		exit 1
		;;
esac

if [ "$INSTROOT" = "" ]; then
	echo "destination was not specified." >&2
	exit 1
fi

if [ "$VERSION" = "" ]; then
	echo "version was not specified." >&2
	exit 1
fi

if [ "$ARCH" = "" ]; then
	echo "arch was not specified." >&2
	exit 1
fi

if [ ! -d $DATADIR/defs/$VERSION ]; then
	echo "invalid version was specified." >&2
	exit 1
fi

if [ ! -d $DATADIR/defs/$VERSION/$ARCH ]; then
	echo "invalid arch was specified." >&2
	exit 1
fi

if [ "$INSTALLSET" = "" ]; then
	echo "install set was not specified." >&2
	exit 1
fi

PKGLIST=$DATADIR/defs/$VERSION/$ARCH/packages.$INSTALLSET
if [ ! -f "$PKGLIST" ]; then
	echo "invalid install set was specified." >&2
	exit 1
fi

CACHEDIR="$CACHEDIR/$VERSION/$ARCH"

mkdir -p $CACHEDIR/archives/partial
mkdir -p $INSTROOT/mnt/apt-cache
mount -o bind,_netdev $CACHEDIR $INSTROOT/mnt/apt-cache

case "$COMMAND" in
	install)
		APT_OPTS=$(cat <<EOF
 -o Dir::Main=$INSTROOT/tmp/apt
 -o Dir::Etc::sourcelist=$INSTROOT/tmp/apt/sources.list
 -o Dir::Etc::sourceparts=$INSTROOT/tmp/apt/sources.list.d
 -o Dir::State=$INSTROOT/var/lib/apt
 -o Dir::Cache=$INSTROOT/mnt/apt-cache
 -o RPM::RootDir=$INSTROOT
 -o RPM::PM=\"external\"
 -o RPM::Install-Options::=--force
 -o RPM::Install-Options::=--nosignature
EOF
)

		mkdir -p $INSTROOT/tmp/apt
		cp -rf $DATADIR/defs/$VERSION/$ARCH/apt/* $INSTROOT/tmp/apt

		mkdir -p $INSTROOT/var/lib/apt/lists/partial
		mkdir -p $INSTROOT/var/lib/rpm

		rpm --initdb --root $INSTROOT
		LANG=C apt-get $APT_OPTS update

		while read line; do
			if [ "$line" != "" ]; then
				LANG=C apt-get -y $APT_OPTS install $line < /dev/null
			fi
		done < $PKGLIST

		chroot $INSTROOT rpm --rebuilddb 2>/dev/null || chroot $INSTROOT rpm --rebuilddb
		chroot $INSTROOT apt-get update rpm --rebuilddb 2>/dev/null || chroot $INSTROOT rpm --rebuilddb

		if [ -e $INSTROOT/etc/rc.sysinit ]; then
			grep -v -e 'hwclock' \
				< $INSTROOT/etc/rc.sysinit \
				> $INSTROOT/etc/rc.sysinit.bak
			mv -f $INSTROOT/etc/rc.sysinit.bak $INSTROOT/etc/rc.sysinit
			chmod 755 $INSTROOT/etc/rc.sysinit
		fi
		if [ -e $INSTROOT/etc/init.d/halt ]; then
			grep -v -e 'hwclock' \
				< $INSTROOT/etc/init.d/halt \
				> $INSTROOT/etc/init.d/halt.bak
			mv -f $INSTROOT/etc/init.d/halt.bak $INSTROOT/etc/init.d/halt
			chmod 755 $INSTROOT/etc/init.d/halt

			cat <<EOF > $INSTROOT/etc/init.d/lxc-pre-halt
#!/bin/sh

if [ -e /etc/rc.sysinit ]; then
	grep -v -e 'hwclock' \
		< /etc/rc.sysinit \
		> /etc/rc.sysinit.bak
	mv -f /etc/rc.sysinit.bak /etc/rc.sysinit
	chmod 755 /etc/rc.sysinit
fi
if [ -e /etc/init.d/halt ]; then
	grep -v -e 'hwclock' \
		< /etc/init.d/halt \
		> /etc/init.d/halt.bak
	mv -f /etc/init.d/halt.bak /etc/init.d/halt
	chmod 755 /etc/init.d/halt
fi

EOF
			chmod 755 $INSTROOT/etc/init.d/lxc-pre-halt
			(
				cd $INSTROOT/etc/rc.d/rc0.d
				ln -s ../init.d/lxc-pre-halt S00lxc-pre-halt
				cd $INSTROOT/etc/rc.d/rc6.d
				ln -s ../init.d/lxc-pre-halt S00lxc-pre-reboot
			)
		fi
		;;

	update)
		APT_OPTS="-o Dir::Cache=/mnt/apt-cache"
		chroot $INSTROOT apt-get $APT_OPTS update
		chroot $INSTROOT apt-get -y $APT_OPTS upgrade
		;;

	*)
		;;
esac

umount $INSTROOT/mnt/apt-cache

rm -rf $INSTROOT/tmp/apt
