#!/bin/sh -e

SCRIPTDIR=/usr/bin

if [ "${0:0:2}" = "./" ]; then
    . ../data/functions
    SCRIPTDIR=./
else
    . /usr/share/separator/functions
fi


PROG="${0##*/}"

print_usage()
{
    [ "$1" = 0 ] || exec >&2
    echo "
Usage: $PROG [options] <workdir>

$PROG install and setup livecd root <workdir>

Valid options are:
 -h, --help           display help screen
 -v, --version        display version information
 -d, --debug          show debug output
 -p, --prepare        prepare for install and exit
 -u, --update-images  skip install and copy steps, only recreate compressed images
   -r, --root           assume we have capabilities to real chroot (w/o fakeroot)

   Report bugs to <rider@altlinux.org>
   "
    [ -n "$1" ] && exit "$1" || exit
}

#parse command line options
TEMP=`getopt -n $PROG  -o a:,b:,v,d,h,p,u,r:: -l aptconf:,box:,version,debug,help,prepare,update-images,root:: -- "$@"` || exit 1
eval set -- "$TEMP"
workdir=
deps_file=
langs=
SKIPROOT=
PREPARE=
ONLYBOX=
while :; do
    case "$1" in
	-h|--help) print_usage 0
	    ;;
	-w|--workdir)
	    shift
	    workdir="$1"
	    ;;
	-b|--box)
	    shift
	    ONLYBOX="$1"
	    ;;
	-u|--update-images)
	    SKIPROOT=1
	    ;;
	-p|--prepare)
	    PREPARE=1
	    ;;
	-d|--debug)
	    DEBUG=1
	    ;;
	-r|--root)
	    shift
	    REALROOT=1
	    ROOTDIR="$1"
	    ;;
	-v|--version) print_version;exit 0
	    ;;
	--) shift; break
	;;
	*) "unrecognized option: $1"
	exit 1
	;;
    esac
    shift
done

WORKDIR=$@

[ -z "$WORKDIR" ] && print_usage 0
WORKDIR=`realpath $WORKDIR`
APTBOX="$WORKDIR/aptbox"
PROFILE="$WORKDIR/profile"
LISTDIR="$PROFILE/packages"
TMPDIR="$WORKDIR/tmp"
OUTDIR="$WORKDIR/out"

[ `id -u` == "0" ] && REALROOT=1

. "$PROFILE/config"

[ -d $OUTDIR ] && rm -Rf $OUTDIR

mkdir -p $OUTDIR

[ -n "$ONLYBOX" ] && BOXES="$ONLYBOX"

if [ -z "$BOXES" ];then
    Info "BOXES not found, proccesing default box..."    
    BOXES="__FALSEGHRBDNSK"
fi

for BOX in $BOXES;do
    # cleanup all variables from next loop
	DIRS=
	IDENT=
	COPYONLY=
	CLASS=
	INSTALLDIR=
	INSTALL2HASH=
	NOIMAGE=
	PROFILE_STAGE3=
	OUT=
    # use config for boxes, if exists
    if [ -f $PROFILE/$BOX ];then 
	Info "Creating box with $BOX configuration file"
	. $PROFILE/$BOX
	OUTDIR="$WORKDIR/out/$BOXID"
	mkdir -p "$WORKDIR/out/$BOXID"
    else
	if [ "$BOX" != "__FALSEGHRBDNSK" ];then
	   Info "configuration file $BOX not found"
	   exit 1
	fi
    fi
    [ -z "$COMPONENTS" ] && Fatal "please, add COMPONENTS to configuration file"
    COMPONENTS_ID=
    INSTALLDIRS=

    for COMPONENT in $COMPONENTS;do
	DIRS=
	IDENT=
	COPYONLY=
	CLASS=
	INSTALLDIR=
	INSTALL2HASH=
	NOIMAGE=
	OUT=
	. $PROFILE/$COMPONENT || Fatal "file $PROFILE/$COMPONENT not found"
	Info "Processing $COMPONENT component"
	    # prepare packages lists
	DIRS=`for i in $DIRS;do echo -n "$PROFILE/$i ";done`
	[ -z "$SKIPROOT" ] && updatepackages $WORKDIR "$DEBUG" "$DIRS" $IDENT
	[ -n "$PREPARE" ] && continue
	
	if [ -z "$SKIPROOT" ] && [ -n "$COPYONLY" ];then
	    # copy packages to box tree	    
	    copypackages $WORKDIR $IDENT "$OUTDIR/$INSTALLDIR" "$INSTALLDIRS" "$OUTDIR"

	    # add this component for genbasedir
	    add4hashes "$OUTDIR" "$NAME" "$IDENT" "$ORIGIN" "$VERSION" "$LABEL" "$ARCH" "$INSTALLDIR"

	    # create hashes for installer stage 2
	    [ -z "$INSTALL2HASH" ] || zergmakehashes $WORKDIR $IDENT "$OUTDIR/$INSTALLDIR" "$OUTDIR"
	    COMPONENTS_ID="$COMPONENTS_ID $IDENT"
	    INSTALLDIRS="$INSTALLDIRS $INSTALLDIR"
	    # copy files to cd

	    [ -z "$FILES" ] || rsync -vaPC $PROFILE/$FILES $OUTDIR
	fi

	
	[ -n "$COPYONLY" ] && continue;
	#install system for compressed image
	if [ -z "$SKIPROOT" ];then
	    rm -f $TMPDIR/permiss.$IDENT
	    touch $TMPDIR/permiss.$IDENT
	    
	    # run install under faked environment
	    if [ -z "$REALROOT" ];then
		LD_LIBRARY_PATH=$WORKDIR/root.$IDENT/lib/:$WORKDIR/root.$IDENT/usr/lib/ fakeroot -s $TMPDIR/permiss.$IDENT \
		    -i $TMPDIR/permiss.$IDENT -l /usr/lib/libfakechroot/libfakechroot.so.0.0.1 \
		    $SCRIPTDIR/tor --class=$CLASS --component=$COMPONENT $WORKDIR || exit 1
	    else
	    # run install under really root
		[ -z "$ROOTDIR" ] || TOROPT="-r $ROOTDIR"
		$SCRIPTDIR/tor --class=$CLASS --component=$COMPONENT $TOROPT $WORKDIR  || exit 1
		TOROPT=
	    fi
	    # create symlink to last root (need for mklive-boot)
	    rm -f $TMPDIR/root
	    ln -sf `getroot $TMPDIR $OUT` $TMPDIR/root
	fi

    # create compressed image

	if [ -z "$NOIMAGE" ];then
	    # copy existent (created from previos box) compressed image to box tree
	    if [ -f $WORKDIR/out/$OUT ];then 
		 cp -f $WORKDIR/out/$OUT $OUTDIR/
		 continue;
	    fi
	    # run mklive-image under faked root
	     LD_LIBRARY_PATH=$WORKDIR/root.$IDENT/lib/:$WORKDIR/root.$IDENT/usr/lib/ fakeroot -s $TMPDIR/permiss.$IDENT \
	    -i $TMPDIR/permiss.$IDENT -l /usr/lib/libfakechroot/libfakechroot.so.0.0.1 \
	    $SCRIPTDIR/mklive-image -s --component=$COMPONENT $WORKDIR

	    # copy created compressed image to box tree
	    [ -f $WORKDIR/out/$OUT ] && [  $OUTDIR !=  $WORKDIR/out ] && cp -f $WORKDIR/out/$OUT $OUTDIR/
	fi

    # run post components scripts
    [ -z "$CLASS" ] || postcomponent $CLASS `getroot $TMPDIR $OUT`
    postcomponent_local $WORKDIR `getroot $TMPDIR $OUT`

    done

    # create hashes for apt-get
    if [ ! -z "$COMPONENTS_ID" ];then
	makehashes "$ORIGIN" "$VERSION" "$LABEL" "$OUTDIR" "$COMPONENTS_ID" "$ARCH"
    fi
    [ -z "$PROFILE_STAGE3" ] && PROFILE_STAGE3="profile"
    # create profile with packages list for installer stage 3
    if [ -f $WORKDIR/profile/$PROFILE_STAGE3 ] && [ -d $OUTDIR/ALTLinux/base ];then 
	$SCRIPTDIR/mkprofile $WORKDIR/profile/$PROFILE_STAGE3 >$OUTDIR/ALTLinux/base/packages-profile.scm
    fi
done
