#!/bin/bash

if [ ${0:0:2} != "./" ];then
    tordir=/usr/share/separator
else
    tordir=../data
fi
classdir=$tordir/classes

VERSION=`cat $tordir/VERSION`

print_version()
{
    printf %s\\n "${0##*/} $VERSION" >&2
}

Info()
{
    printf %s\\n "${0##*/}: $*" >&2
}
	
Fatal()
{
    printf %s\\n "${0##*/}: $*" >&2
    exit 1
}
			
quiet=
verbose=
Verbose()
{
    [ -n "$verbose" ] || return 0
    printf %s\\n "${0##*/}: $*" >&2
}
					

uris()
{
    local rec FIFO
    rec=0
    FIFO=`mktemp -u`
    mkfifo $FIFO
    sed -ne "s/^'\\([^']\\+\\)' .*/\\1/pg" < $FIFO &
    { $APTBOX/apt-get -y --print-uris install "$@" || rec=$?; } >$FIFO
    rm -f $FIFO
    return $rec
}

update_repo()
{
    local TOPDIR
    TOPDIR=$1
        genbasedir --topdir=$TOPDIR --no-oldhashfile --bz2only --mapi i586 hasher &&
                Verbose "updated hasher repository indices." ||
                Fatal "failed to update hasher repository indices."
}


init_root()
{
    local TMPDIR ROOT LANGS
    ROOT=$1
    LANGS=$2
    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 "Setup basesystem "
    mkdir -p $ROOT/var/lib/rpm
    rpm --initdb -v --root $ROOT/
    export DURING_INSTALL=1
    export LC_ALL=POSIX LANG=POSIX LANGUAGE=POSIX
    
    for i in $packages;do
	if ! curl $i -q -s -o $ROOT/.in/`basename $i`;then 
	    echo "Copy package `basename $i` failed !!!"
	    exit 1
	fi
	echo -n "."
    done
    HOME=$ROOT/.in/ TMPDIR=$ROOT/tmp rpm -Uvh --root $ROOT/ --define "_install_langs $LANGS" $ROOT/.in/*.rpm
    [ -z "$LANGS" ] || echo "%_install_langs $LANGS" >>$ROOT/etc/rpm/macros.d/langs
    popd >/dev/null 2>&1
}

install_packages()
{
    local ROOT
    packagesfile=$1
    ROOT=$2
    echo -n "getting packages for install "
    for i in `cat $packagesfile`;do
	    if ! curl $i -qs -o $ROOT/.in/`basename $i`;then
		echo "Copy package `basename $i` failed !!!"
		exit 1
	    fi
	    echo -n "."
    done
    echo ""
    TMPDIR=/tmp
    RPMTMP=/tmp
    HOME=/.in/
    export DURING_INSTALL=1
    echo "#!/bin/sh
    cd /
    export TMPDIR=/tmp
    export TMP=/tmp
    export RPMTMP=/tmp
    export HOME=/.in/
    rpm -Uvh --replacepkgs /.in/*.rpm ||:" >> $ROOT/.in/install
    Info "Install system !!!"
    chmod 555 $ROOT/.in/install
    /usr/sbin/chroot $ROOT /.in/install
    /sbin/ldconfig -X -r $ROOT
    Info "Install done. Cleanup"
    /bin/rm -Rf $ROOT/.in
}

postinstall()
{
    local ROOT_ type_ setupdir
    type_=$1
    ROOT_=$2
    setupdir=$3
    [ -z "$setupdir" ] && setupdir=$classdir/$type_/setup.d
    if [ ! -d "$setupdir" ];then
      Info "Directory with post-install scripts not found: $setupdir"
      return
    fi
    in_chroot="eval TMPDIR=/tmp TMP=/tmp /usr/sbin/chroot $ROOT_"
    for i in $setupdir/*;do
	Info "exec $i"
	[ ! -f "$i" ] || . $i
    done
}

postcomponent()
{
    local type_ setupdir ROOT
    type_=$1
    ROOT=$2
    setupdir=$3
    [ -z "$setupdir" ] && setupdir=$classdir/$type_/component.d
    if [ ! -d "$setupdir" ];then
      Info "Directory with post-component scripts not found: $setupdir"
      return
    fi
    for i in $setupdir/*;do
	Info "exec $i"
	[ ! -f "$i" ] || . $i
    done
}

postinstall_root()
{
    local ROOT_ type_ setupdir
    type_=$1
    ROOT_=$2
    setupdir=$3
    [ -z "$setupdir" ] && setupdir=$classdir/$type_/setup_postroot.d
    if [ ! -d "$setupdir" ];then
      Info "Directory with post-install scripts not found: $setupdir"
      return
    fi
    in_chroot="eval TMPDIR=/tmp TMP=/tmp /usr/sbin/chroot $ROOT_"
    for i in $setupdir/*;do
	Info "exec $i"
	[ ! -f "$i" ] || . $i
    done
}

postinstall_local()
{
    local WORKDIR ROOT
    WORKDIR=$1
    ROOT=$2
    setupdir=$WORKDIR/profile/postinstall/setup.d
    if [ ! -d "$setupdir" ];then 
	Info "Profile directory with post-install scripts not found: $setupdir"
	return
    fi
    postinstall local $ROOT $setupdir
}

postcomponent_local()
{
    local WORKDIR  ROOT
    WORKDIR=$1
    ROOT=$2
    setupdir=$WORKDIR/profile/postinstall/component.d
    if [ ! -d "$setupdir" ];then 
	Info "Profile directory with post-component scripts not found: $setupdir"
	return
    fi
    postcomponent local $ROOT $setupdir
}

postinstall_local_root()
{
    local WORKDIR ROOT
    WORKDIR=$1
    ROOT=$2
    setupdir=$WORKDIR/profile/postinstall/setup_postroot.d
    if [ ! -d "$setupdir" ];then 
	Info "Profile directory with post-install scripts not found: $setupdir"
	return
    fi
    postinstall local $ROOT $setupdir
}

uristofile()
{
    local LISTDIR FILE FIFO rc
    LISTDIR=$1
    FILE=$2
    FIFO=`mktemp -u`
    rc=0
    mkfifo $FIFO
    uniq -u >$FILE <$FIFO &
    uris `grep -h '^[^#]' $LISTS` >$FIFO || rc=$?
    rm -f $FIFO
    return $rc
}

updatepackages()
{
    local WORKDIR APTBOX LISTS IDENT DEBUG
    WORKDIR=$1
    DEBUG=$2
    LISTS=$3
    IDENT=$4
    APTBOX="$WORKDIR/aptbox"
    PROFILE="$WORKDIR/profile"
    [ -z "$LISTDIR" ] && LISTDIR="$PROFILE/packages"
    [ -z "$IDENT" ] && IDENT="packages"
    TMPDIR="$WORKDIR/tmp"
    [ -d "$APTBOX" ] || Fatal "Please, create $APTBOX first"
    update_repo $WORKDIR/repo
    $APTBOX/apt-get update
    [ -z "$DEBUG" ] || $APTBOX/apt-get install --print-uris -y `grep -h '^[^#]' $LISTS 2>/dev/null`
    uristofile "$LISTS" "$TMPDIR/$IDENT.packages" || $APTBOX/apt-get install --print-uris -y `grep -h '^[^#]' $LISTS 2>/dev/null`
}

packagestatus()
{
    local DIRS PACKAGE OUTDIR i
    DIRS=$1
    PACKAGE=$2
    OUTDIR=$3
    [ -z "$DIRS" ] || [ -z "$PACKAGE" ] && return 0
    for i in $DIRS;do
	[ -f $OUTDIR/$i/$PACKAGE ] && return 1
    done
    return 0
}

copypackages()
{
    local WORKDIR APTBOX IDENT INSTALLDIR APTBOX TMPDIR INSTALLDIRS i OUTDIR
    WORKDIR=$1
    IDENT=$2
    INSTALLDIR=$3
    INSTALLDIRS=$4
    OUTDIR=$5
    APTBOX="$WORKDIR/aptbox"
    TMPDIR="$WORKDIR/tmp"
    [ -z "$IDENT" ] && IDENT="packages"
    [ -d "$APTBOX" ] || Fatal "Please, create $APTBOX first"
    [ -d "$INSTALLDIR" ] || mkdir -p "$INSTALLDIR"
    Info "removing old packages ($IDENT) ..."
    rm -f $INSTALLDIR/*
    Info "copying new packages ($IDENT) ..."
    while read i
    do
	packagestatus "$INSTALLDIRS" `basename $i` $OUTDIR || continue
	if ! curl $i -qs -o $INSTALLDIR/`basename $i`; then 
	    echo "Copy package $i to  $INSTALLDIR/`basename $i` failed !!!"
	    exit 1
        fi

	echo -n "."
    done < $TMPDIR/$IDENT.packages
    echo ""
}

makehashes()
{
    local ORIGIN VERSION LABEL OUTDIR COMPONENTS ARCH
    ORIGIN=$1
    VERSION=$2
    LABEL=$3
    OUTDIR=$4
    COMPONENTS=$5
    ARCH=$6
    LANG=C LC_ALL=C LANGUAGE=C genbasedir --no-oldhashfile   --architecture=$ARCH --origin="$ORIGIN" --label=$LABEL --description="$VERSION" --architectures=$ARCH --topdir=$OUTDIR ALTLinux $COMPONENTS --progress
}

add4hashes()
{
    local OUTDIR NAME IDENT ORIGIN VERSION LABEL ARCH DIR release
    OUTDIR=$1
    NAME=$2
    IDENT=$3
    ORIGIN=$4
    VERSION=$5
    LABEL=$6
    ARCH=$7
    DIR=$8

    release=$OUTDIR/ALTLinux/base/release.$IDENT
    [ ! -d "$OUTDIR/ALTLinux/base" ] && mkdir -p "$OUTDIR/ALTLinux/base"
    echo "Archive: $NAME" >$release
    echo "Component: $IDENT" >>$release
    echo "Version: $VERSION" >>$release
    echo "Origin: $ORIGIN" >>$release
    echo "Label: $LABEL" >>$release
    echo "Architecture: $ARCH" >>$release
    echo "NotAutomatic: false" >>$release
}

zergmakehashes()
{
    local FILE WORKDIR APTBOX IDENT INSTALLDIR APTBOX TMPDIR OUTDIR i p_package p_filename p_version p_filesize p_size 
    WORKDIR=$1
    IDENT=$2
    INSTALLDIR=$3
    OUTDIR=$4
    FILE=$OUTDIR/ALTLinux/base/base_pkginfo_x11.list
    APTBOX="$WORKDIR/aptbox"
    TMPDIR="$WORKDIR/tmp"
    rm -f $FILE
    initlist=$(cat $TMPDIR/$IDENT.packages)
    initlist="$(echo "$initlist" |fgrep /setup-)
    $(echo "$initlist" |fgrep /glibc-core-)
    $(echo "$initlist" |fgrep /filesystem-)
    $(echo "$initlist" |egrep -v '/(setup|filesystem|glibc-core)-')"

    for i in $initlist 
    do
	p_filename=`basename $i`
	p_filesize=`stat -L -c %s  $INSTALLDIR/$p_filename`
	LC_ALL=C LANG=C rpm -qp --qf="Package: %{NAME}\nFilename: $p_filename\nVersion: %{VERSION}\nFileSize: $p_filesize\nSize: %{SIZE}\nSummary:%{SUMMARY}\n"  $INSTALLDIR/$p_filename >>$FILE
    done
}

getroot()
{
    local OUT TMPDIR
    TMPDIR=$1
    OUT=$2
    echo "${TMPDIR}/$OUT.root"
}
