#!/bin/sh -e

uris()
{
    $APTBOX/apt-get -y --print-uris install "$@" |sed -ne "s/^'\\([^']\\+\\)' .*/\\1/pg"
}


init_fakeroot()
{
    local TMPDIR
    init_packages="setup filesystem rpm"
    pushd $ROOT >/dev/null 2>&1
    mkdir -p $ROOT/.in/
    mkdir -p $ROOT/tmp/
    packages=$(uris $init_packages)
    echo -n "Installing basesystem "
    for i in $packages; do
        curl $i -q -s -o $ROOT/.in/`basename $i`
        rpm2cpio $ROOT/.in/`basename $i`| /bin/cpio --extract --make-directories --sparse --quiet
        echo -n "."
    done
    echo ""
    $in_chroot rm -f /etc/rpm/macros.db1
    $in_chroot rpm --initdb -v
    $in_chroot touch /etc/mtab
    $in_chroot chown 0.0 -R /
    echo -n "Creating rpm database "
    for i in $packages;do
        $in_chroot rpm -i --ignoresize --noorder --noscripts --nodeps --notriggers --justdb /.in/`basename $i`
        echo -n "."
    done
    echo "";
    popd >/dev/null 2>&1
}

install_packages()
{
    packagesfile=$1
    echo -n "Getting packages  "
    for i in `cat $packagesfile`;do
        curl $i -qs -o $ROOT/.in/`basename $i`
        echo -n "."
    done
    echo ""
    TMPDIR=/tmp
    RPMTMP=/tmp
    HOME=/.in/
    export DURING_INSTALL=1
    echo "#!/bin/sh
    cd /
    export TMPDIR=/tmp
    export RPMTMP=/tmp
    export HOME=/.in/
    rpm -Uvh --replacepkgs /.in/*.rpm ||:" >> $ROOT/.in/install
    echo "%_install_langs ru_RU en_US" >$ROOT/etc/rpm/macros
    echo "Installing..."
    chmod 555 $ROOT/.in/install
    $in_chroot /.in/install
    /sbin/ldconfig -X -r $ROOT
    echo "Done. Cleaning up..."
    rm -Rf $ROOT/.in
}

setup_vserver()
{
    echo "First-time actions and vserver-specific customizations..."
     
    echo "#!/bin/sh -e
    umask 0
    PATH=/sbin:/usr/sbin:/usr/local/sbin:/bin:/usr/bin:/usr/local/bin
    
    # Devices
    rm -rf /dev
    mkdir -p /dev/pts 
    cd /dev
    touch hdv1
    mknod -m 666 null c 1 3
    mknod -m 666 zero c 1 5
    mknod -m 666 full c 1 7
    mknod -m 644 random c 1 8
    mknod -m 644 urandom c 1 9
    mknod -m 666 tty c 5 0
    mknod -m 666 ptmx c 5 2
    ln -s ../proc/self/fd/2 stderr
    ln -s ../proc/self/fd/1 stdout
    ln -s ../proc/self/fd/0 stdin
    ln -s null tty0
    ln -s null tty12
    ln -s tty0 systty

    # fstab && mtab
    echo /dev/hdv1 / ext2 defaults 1 1 >/etc/fstab
    echo /dev/hdv1 / ext2 rw 0 0 >/etc/mtab
        
    # First-time actions
    cd /
    unset DURING_INSTALL
    test -x /usr/bin/update-menus && /usr/bin/update-menus --nofork -v
    rm -f /etc/firsttime.d/menu
    find /etc/firsttime.d -type f -print -exec {} \\;
    
    # Services
    # All off
    cd /etc/init.d
    for service in *; do
        case \$service in
        *.bak|*~|functions*|killall|halt|single|template|clock|local|outformat)
            ;;
        *)
            chkconfig --level 0123456 \$service off ||:
            ;;
        esac
    done
    cd /
    rm -f /etc/rc.d/rc0.d/S01halt
    rm -f /etc/rc.d/rc6.d/S01reboot
    
    # Some on
    for service in syslogd crond anacron; do
        chkconfig --level 2345 \$service on
    done
    
    # Turn off tty12 logging
    cp /etc/syslog.conf /t
    cat /t | grep -v tty12 | grep -v '^# Log all' >/etc/syslog.conf
    rm -f /t
    
    # Cleanups
    [ -x /etc/rc.d/scripts/cleanup ] && /etc/rc.d/scripts/cleanup
    " >$ROOT/makevserver
    chmod 755 $ROOT/makevserver
    $in_chroot /makevserver
    rm -f $ROOT/makevserver

cat <<E_O_F >> $ROOT/etc/sysconfig/network
NETWORKING=yes
FORWARD_IPV4=false
HOSTNAME=$HOSTNAME
E_O_F

cat <<E_O_F >> $ROOT/etc/HOSTNAME
$HOSTNAME
E_O_F
}

WORKDIR=$@
[ -z "$WORKDIR" -o "`id -u`" != "0" ] && exit 1
WORKDIR=`realpath $WORKDIR`
APTBOX="$WORKDIR/aptbox"
TMPDIR=$WORKDIR/tmp

HOSTNAME=vserver

ROOT="${WORKDIR}/root"
in_chroot="/usr/sbin/chroot $ROOT"

[ ! -d $ROOT ] || rm -Rf $ROOT
echo "Initializing root..."
mkdir -p $ROOT
init_fakeroot $ROOT
install_packages $TMPDIR/packages
setup_vserver
