#!/bin/bash

DIRNAME=$(dirname "$(readlink -e "$0")")
DIR=$(cd "$DIRNAME" || exit 112; pwd)

OUTDIR="/var/www/hiawatha/files/";
OUTCMD="chown hiawatha:hiawatha /var/www/hiawatha/files/*"
TMPDIR="$( mktemp -d )"
TEMP_OUTDIR="$( mktemp -d )"

BUILDDIR="${DIR}/chroot"

function build_disk_image(){
   OUTFILE="$1"
   SIZE="$2"
   MOUNTDIR="$( mktemp -d)"
   LODEV="$( losetup -f )"

   echo "Creating disk image."
   cp $DIR/partitions $OUTFILE
   dd if=/dev/zero bs=1M count=$SIZE status=progress >> $OUTFILE
   losetup --partscan $LODEV $OUTFILE
   parted $LODEV resizepart 2 600M Yes

   #copy boot files
   /bin/busybox mkfs.vfat -F 32 ${LODEV}p1
   mount ${LODEV}p1 $MOUNTDIR
   cp -r $BUILDDIR/boot/* $MOUNTDIR/
   umount $MOUNTDIR

   #create home folders
   mkfs.f2fs -f ${LODEV}p2
   mount ${LODEV}p2 $MOUNTDIR
   mkdir $MOUNTDIR/work $MOUNTDIR/writes $MOUNTDIR/home $MOUNTDIR/home/gentoo
   chown -R admin:users $MOUNTDIR/home/gentoo
   umount -l $MOUNTDIR
   sync
   losetup -d ${LODEV}
   rm -rf $MOUNTDIR
}

function force_unmount(){
  for i in $( seq 1 5 ); do
    umount -l $@ 2>/dev/null
  done
}

if [[ $EUID -ne 0 ]]; then
   echo "This script must be run as root" 1>&2
   exit 1
fi


#The important bits, our output files
NEW_IMAGE="$( mktemp )"
NEW_USB_IMAGE="$( mktemp )"

NEW_SQUASHFS="${TEMP_OUTDIR}/gentoo_current.img"
NEW_VDI="${TEMP_OUTDIR}/gentoo_current.vdi"
NEW_VHD="${TEMP_OUTDIR}/gentoo_current.vhd"
NEW_USB="${TEMP_OUTDIR}/gentoo_usb.img.gz"

force_unmount  $BUILDDIR/proc $BUILDDIR/dev $BUILDDIR/sys 2>/dev/null
mount -o bind /proc $BUILDDIR/proc
mount -o bind /dev $BUILDDIR/dev
mount -o bind /sys $BUILDDIR/sys

chroot $BUILDDIR /bin/bash -c "su - -c /bin/update-boot" 2>&1
chroot $BUILDDIR /bin/bash -c "su - -c /bin/update" 2>&1
force_unmount  $BUILDDIR/proc $BUILDDIR/dev $BUILDDIR/sys 2>/dev/null

#build our disk images
build_disk_image $NEW_IMAGE 30722
build_disk_image $NEW_USB_IMAGE 610

# and our VM images from that
dd if=$NEW_USB_IMAGE status=progress bs=1M | gzip -9 > $NEW_USB
VBoxManage convertfromraw --format VDI $NEW_IMAGE $NEW_VDI
VBoxManage convertfromraw --format VHD $NEW_IMAGE $NEW_VHD
rm -rf $NEW_IMAGE $NEW_USB_IMAGE

# build the new squashfs image
# first clean all temporary files
rm -rf $BUILDDIR/tmp/* $BUILDDIR/var/tmp/* $BUILDDIR/var/log/* $BUILDDIR/var/lock/* $BUILDDIR/usr/portage/distfiles/* 2>/dev/null
( cd $BUILDDIR/usr/src/linux ; make clean )
( cd $BUILDDIR ; mksquashfs * $NEW_SQUASHFS -no-recovery -noappend -b 1M -comp xz )


( cd $TEMP_OUTDIR; /bin/calculate_hashes );
cp -r $TEMP_OUTDIR/* $OUTDIR/
$OUTCMD

rm -rf $TEMP_OUTDIR
sync

