#!/bin/bash

PREFIX=/srv/devel-chroots
SUITE=$1
shift 1

[ -n $2 ] && CUSTOM_CMD="$@" || CUSTOM_CMD="/bin/bash --login"

if [[ -z "$SUITE" || ! -d "$PREFIX/$SUITE" ]] ; then
        echo "Please supply a suite"
        echo
        echo "The following are available:"
        for dir in `ls -d $PREFIX/*`; do
                        [ -d $dir -a "${dir##*/}" != "buildroot" ] && echo "     - ${dir##*/}"
        done
        exit 1
fi

WORKING_DIR=$PREFIX/$SUITE

if [ "$( mount | grep $WORKING_DIR )" == "" ] ; then

        ESSENTIAL_PACKAGES="autopoint build-essential devscripts quilt yasm language-pack-en vim debhelper"

        # Check for necessary packages
        echo "Checking for 'essential!' packages"
        for package in $( echo $ESSENTIAL_PACKAGES | tr " " "\n" | sort | tr "\n" " " ); do
                echo -n "   o $package"
                [ -f $WORKING_DIR/var/lib/dpkg/info/$package.list ] && echo "." || echo "!"
        done

        DIST=${SUITE%-*}

        echo "Copying/refreshing necessary files"
                echo -n "   - /etc/apt/sources.list"
                cat <<EOF > $WORKING_DIR/etc/apt/sources.list
deb http://de.archive.ubuntu.com/ubuntu/ $DIST main restricted
deb-src http://de.archive.ubuntu.com/ubuntu/ $DIST main restricted
deb http://de.archive.ubuntu.com/ubuntu/ $DIST-updates main restricted
deb-src http://de.archive.ubuntu.com/ubuntu/ $DIST-updates main restricted
deb http://de.archive.ubuntu.com/ubuntu/ $DIST universe
deb-src http://de.archive.ubuntu.com/ubuntu/ $DIST universe
deb http://de.archive.ubuntu.com/ubuntu/ $DIST-updates universe
deb-src http://de.archive.ubuntu.com/ubuntu/ $DIST-updates universe
deb http://de.archive.ubuntu.com/ubuntu/ $DIST multiverse
deb-src http://de.archive.ubuntu.com/ubuntu/ $DIST multiverse
deb http://de.archive.ubuntu.com/ubuntu/ $DIST-updates multiverse
deb-src http://de.archive.ubuntu.com/ubuntu/ $DIST-updates multiverse
deb http://security.ubuntu.com/ubuntu $DIST-security main restricted
deb-src http://security.ubuntu.com/ubuntu $DIST-security main restricted
deb http://security.ubuntu.com/ubuntu $DIST-security universe
deb-src http://security.ubuntu.com/ubuntu $DIST-security universe
deb http://security.ubuntu.com/ubuntu $DIST-security multiverse
deb-src http://security.ubuntu.com/ubuntu $DIST-security multiverse
EOF
        [ $? -eq 0 ] && echo "." || echo "!"

#               echo -n "   - /etc/apt/sources.list.d/xbmc.list"
#               cat <<EOF > $WORKING_DIR/etc/apt/sources.list.d/xbmc.list
#deb http://ppa.launchpad.net/team-xbmc-svn/ppa/ubuntu natty main
#deb-src http://ppa.launchpad.net/team-xbmc-svn/ppa/ubuntu maverick main
#EOF
#        [ $? -eq 0 ] && echo "." || echo "!"

        echo -n "   - /etc/resolv.conf"
        cp -p /etc/resolv.conf $WORKING_DIR/etc/resolv.conf
        [ $? -eq 0 ] && echo "." || echo "!"

        echo -n "   - /etc/hosts"
        cp -p /etc/hosts $WORKING_DIR/etc/hosts
        [ $? -eq 0 ] && echo "." || echo "!"

        echo -n "   - /root/.bash*"
        rsync -aq --exclude=.bash_history /root/.bash* $WORKING_DIR/root/
        [ $? -eq 0 ] && echo "." || echo "!"

        echo -n "   - /root/.quiltrc"
        echo 'QUILT_REFRESH_ARGS="-p ab --diffstat --sort --strip-trailing-whitespace"' > \
                $WORKING_DIR/root/.quiltrc
        [ $? -eq 0 ] && echo "." || echo "!"

        echo -n "   - /root/.bash/environment/CHROOT"
        echo "$SUITE" > $WORKING_DIR/root/.bash/environment/CHROOT
        [ $? -eq 0 ] && echo "." || echo "!"

        echo -n "   - /root/.bash/environment/DCH"
        cat <<EOF > $WORKING_DIR/root/.bash/environment/DCH
export DEBFULLNAME="Christian Heim"
export DEBEMAIL="christian.heim@barfoo.org"
EOF
        [ $? -eq 0 ] && echo "." || echo "!"

        echo
        echo "Mounting virtual filesystems"

        echo -n "   - /dev"
        mount --bind /dev $WORKING_DIR/dev
        [ $? -eq 0 ] && echo "." || echo "!"

        echo -n "   - /dev/pts"
        mount --bind /dev/pts $WORKING_DIR/dev/pts
        [ $? -eq 0 ] && echo "." || echo "!"

        echo -n "   - /proc"
        mount --bind /proc $WORKING_DIR/proc
        [ $? -eq 0 ] && echo "." || echo "!"

        echo -n "   - /sys"
        mount --bind /sys $WORKING_DIR/sys
        [ $? -eq 0 ] && echo "." || echo "!"

        echo

        if [ -f $WORKING_DIR/usr/local/sbin/prep-chroot-custom-mount.sh ] ; then
                echo "o Executing custom mount script in $WORKING_DIR/usr/local/sbin/prep-chroot-custom-mount.sh"
                $WORKING_DIR/usr/local/sbin/prep-chroot-custom-mount.sh mount $WORKING_DIR
        else
                echo "WARNING: /usr/local/sbin/prep-chroot-custom-mount.sh is missing!"
        fi

        [ ${SUITE##*-} == "i386" ] && chroot_cmd="linux32 chroot" || chroot_cmd="chroot"
        HOSTNAME=`hostname -f` HOME=/root USER=root LANG=C LC_ALL=C \
                $chroot_cmd $WORKING_DIR $CUSTOM_CMD

        echo "o Determing stale process(es)"
        PROCESS_LIST=`lsof -n | grep $WORKING_DIR | cut -d\  -f7 | sort -u`
        for process in $PROCESS_LIST; do
                [ "$process" != "" ] && kill -9 $process
        done

        echo "o Unmounting virtual filesystem(s)"

        if [ -x $WORKING_DIR/usr/local/sbin/prep-chroot-custom-mount.sh ] ; then
          echo "o Executing custom mount script in $WORKING_DIR/usr/local/sbin/prep-chroot-custom-mount.sh"
          $WORKING_DIR/usr/local/sbin/prep-chroot-custom-mount.sh umount
        fi

        echo -n "   - /dev/pts"
        umount $WORKING_DIR/dev/pts
        [ $? -eq 0 ] && echo "." || echo "!"

        echo -n "   - /dev"
        umount $WORKING_DIR/dev
        [ $? -eq 0 ] && echo "." || echo "!"

        echo -n "   - /proc"
        umount $WORKING_DIR/proc
        [ $? -eq 0 ] && echo "." || echo "!"

        echo -n "   - /sys"
        umount $WORKING_DIR/sys
        [ $? -eq 0 ] && echo "." || echo "!"

        echo "o Cleansing chroot"
        echo -n "   - /var/cache/apt/archives"
        rm -f $WORKING_DIR/var/cache/apt/archives/*.deb
        [ $? -eq 0 ] && echo "." || echo "!"

        echo -n "   - /tmp"
        rm -rf $WORKING_DIR/tmp/*
        [ $? -eq 0 ] && echo "." || echo "!"
fi

