#!/bin/sh

if [ "$1" = "--help" ]; then
	cat <<EOF
usage: vbuilder create <options>

options:
  --help                   show this text
  -n, --name <container>   name of environment (required)
  -v, --version <version>  version of environment
  -a, --arch <arch>        architecture of environment
  -o, --overlay            use overlayfs

EOF
	exit 0
fi

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

CONTAINER=""
INSTROOT=""
OVERLAY=0

if grep -q VineSeed /etc/vine-release; then
	VERSION="VineSeed"
else
	VERSION=$(/etc/vine-release | awk '{print $3;}' | sed -e 's/\..*$//')
fi
ARCH=$(uname -m)
if [ "$ARCH" != "x86_64" ]; then
	ARCH="i386"
fi
HOST_ARCH=$ARCH

while [ $# -gt 0 ]; do
	case $1 in
		-n|--name)
			shift
			CONTAINER=$1
			;;
		-v|--version)
			shift
			VERSION=$1
			;;
		-a|--arch)
			shift
			ARCH=$1
			;;
		-o|--overlay)
			OVERLAY=1
			;;
	esac

	shift
done

if [ "$CONTAINER" = "" ]; then
	echo "no container name 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 [ "$HOST_ARCH" != "x86_64" -a "$ARCH" != "$HOST_ARCH" ]; then
	echo "cannot create with $ARCH on $HOST_ARCH." >&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 architecture was specified." >&2
	exit 1
fi

CONTAINER_PATH="/var/lib/lxc/$CONTAINER"
OVERLAYFS="$CONTAINER_PATH/overlay"

if [ -d $CONTAINER_PATH ]; then
	echo "$CONTAINER already exists." >&2
	exit 1
fi

if ! lxc-create -n $CONTAINER -t none; then
	echo "lxc-create was failed." >&2
	exit 1
fi

if [ $OVERLAY -ne 0 ]; then
	INSTROOT="$CONTAINER_PATH/rootfs.lower"
	mkdir -p $OVERLAYFS
else
	INSTROOT="$CONTAINER_PATH/rootfs"
fi

if [ ! -d $INSTROOT/usr ]; then
	$LIBEXECDIR/install-env install $INSTROOT $VERSION $ARCH vbuilder
	touch $INSTROOT/lxcroot

	if [ -f /etc/sysconfig/clock ]; then
		cp -f /etc/sysconfig/clock $INSTROOT/etc/sysconfig/
	fi

	chroot $INSTROOT chkconfig network on
	chroot $INSTROOT chkconfig rsyslog off
	cp -f "$DATADIR/defs/$VERSION/$ARCH/network" $INSTROOT/etc/sysconfig/
	cp -f "$DATADIR/defs/$VERSION/$ARCH/ifcfg-eth0" $INSTROOT/etc/sysconfig/network-scripts/

	chroot $INSTROOT useradd -u 1000 -g 10 -d /home/vbuilder -m -s /bin/bash vbuilder
fi
mkdir -p $CONTAINER_PATH/rootfs

LXCARCH="x86_64"
if [ "$ARCH" != "x86_64" ]; then
	LXCARCH="x86"
fi

mv -f $CONTAINER_PATH/config $CONTAINER_PATH/config.orig
cat <<EOF > $CONTAINER_PATH/config
lxc.utsname = $CONTAINER
lxc.arch = $LXCARCH
lxc.rootfs = $CONTAINER_PATH/rootfs
lxc.mount.auto = cgroup:mixed sys:mixed
lxc.tty = 1
lxc.pts = 1024
EOF

if [ $OVERLAY -ne 0 ]; then
	cat <<EOF > $CONTAINER_PATH/vbuilder.pre-start
#!/bin/sh

mount -t overlay -o lowerdir=$CONTAINER_PATH/rootfs.lower,upperdir=$OVERLAYFS/upper,workdir=$OVERLAYFS/work overlay $CONTAINER_PATH/rootfs
mount -o bind,_netdev $CACHEDIR/$VERSION/$ARCH $CONTAINER_PATH/rootfs/var/cache/apt

if [ -d $CONTAINER_PATH/tmp ]; then
	mkdir -p $CONTAINER_PATH/rootfs/tmp/jobs
	mount -o bind,_netdev $CONTAINER_PATH/tmp $CONTAINER_PATH/rootfs/tmp/jobs
fi

EOF
	chmod +x $CONTAINER_PATH/vbuilder.pre-start

	cat <<EOF > $CONTAINER_PATH/vbuilder.post-stop
#!/bin/sh

if [ -d $CONTAINER_PATH/tmp ]; then
	umount $CONTAINER_PATH/rootfs/tmp/jobs
fi

umount $CONTAINER_PATH/rootfs/var/cache/apt
umount $CONTAINER_PATH/rootfs

EOF
	chmod +x $CONTAINER_PATH/vbuilder.post-stop

else

	cat <<EOF > $CONTAINER_PATH/vbuilder.pre-start
#!/bin/sh

mount -o bind,_netdev $CACHEDIR/$VERSION/$ARCH $CONTAINER_PATH/rootfs/var/cache/apt

if [ -d $CONTAINER_PATH/tmp ]; then
	mkdir -p $CONTAINER_PATH/rootfs/tmp/jobs
	mount -o bind,_netdev $CONTAINER_PATH/tmp $CONTAINER_PATH/rootfs/tmp/jobs
fi

EOF
	chmod +x $CONTAINER_PATH/vbuilder.pre-start

	cat <<EOF > $CONTAINER_PATH/vbuilder.post-stop
#!/bin/sh

if [ -d $CONTAINER_PATH/tmp ]; then
	umount $CONTAINER_PATH/rootfs/tmp/jobs
fi

umount $CONTAINER_PATH/rootfs/var/cache/apt

EOF
	chmod +x $CONTAINER_PATH/vbuilder.post-stop
fi

cat <<EOF >> $CONTAINER_PATH/config
lxc.hook.pre-start = $CONTAINER_PATH/vbuilder.pre-start
lxc.hook.post-stop = $CONTAINER_PATH/vbuilder.post-stop
EOF

cat $CONTAINER_PATH/config.orig >> $CONTAINER_PATH/config
rm -f $CONTAINER_PATH/config.orig
