#!/bin/sh

BOOTSTRAP_VERSION='$Id: bootstrap.sh,v 1.21 2002/06/18 18:05:48 chrisjs Exp $'
CWD=`pwd`

LOGFILE="/var/log/rpm-bootstrap-log"

LD_LIBRARY_PATH="$CWD/melty-perl/lib/perl5/5.00502/sun4-solaris-thread/CORE"
export LD_LIBRARY_PATH

MELTY_PERL_FILE="melty-perl.cpio.Z"
MELTY_PERL_BIN="$CWD/melty-perl/bin/perl -I$CWD/melty-perl/lib/perl5/5.00502/ -I$CWD/melty-perl/lib/perl5/site_perl/5.005/ -I$CWD/melty-perl/lib/perl5/site_perl/5.005/sun4-solaris-thread"
INSTALLED_PERLS="/usr/perl5/bin/perl /usr/bin/perl /bin/perl /usr/local/bin/perl"
#RPM2CPIO_BIN="perl $CWD/rpm2cpio.pl"
CPIO_BIN="/bin/cpio"
RPM_BIN="/usr/local/bin/rpm"

REDHAT_ROOT="/usr/local/src/rpm-packages"
LOCAL_SPECS="$REDHAT_ROOT/VPKG-SPECS"

RPMS="db-3.1.17-5 zlib-1.1.4-3 bzip2-1.0.2-1 popt-1.6.2-3 rpm-4.0.2-3"

log_echo () {
    echo $*
    echo $* >> $LOGFILE
}

if [ `uname -r` = "5.9" ]; then
        log_echo "Hello Solaris 9!"
        RPMS="db-3.1.17-5 popt-1.6.2.rpm4.0.2-6ru rpm-4.0.2-6ru"
fi

usage () {
    cat <<EOF
Usage: sh bootstrap.sh [-m] [-t] [-h] [-r repository]

    -m: Use melty-perl
    -h: Print this usage message
    -r: Specify the repository to use
    -t: Build virtual packages for tint packages
EOF
    exit 0
}

umask 022

if [ `uname -r` = "5.5" ]; then
    log_echo "You need to upgrade Solaris before you bootstrap rpm."
    exit 1
fi

# sanity check
touch $LOGFILE
if [ ! -w $LOGFILE ] ; then
    echo "Cannot write to log $LOGFILE."
    exit 1
fi

TINT=0
USE_MELTY_PERL=0
REPOSITORY="///"
while getopts "thmr:" opt ; do
    case $opt in
	\?) usage  ;;
	h)  usage  ;;
	t)  TINT=1 ;;
	m)  USE_MELTY_PERL=1 ;;
	r)  REPOSITORY=$OPTARG ;;
    esac
done

# What perl to use?  On Solaris 8 we can be nearly guaranteed the presence
# of perl 5.00503 in /usr/perl5, but on 6 and 7 we must use melty-perl.
# On either system we must retain the Net::FTP module.
for PERL_BIN in $INSTALLED_PERLS ; do
    if [ -x $PERL_BIN ] ; then
        break
    fi
done
if [ ! -x $PERL_BIN -o $USE_MELTY_PERL = "1" ] ; then
    log_echo "Downloading melty-perl ..."
    cat <<EOF | ftp
open rpm.rutgers.edu
anonymous

binary
get $MELTY_PERL_FILE
EOF
    if [ $? != "0" -o ! -r melty-perl.cpio.Z ] ; then
        log_echo "Download failed."
        exit 1
    fi
    uncompress -c $MELTY_PERL_FILE | (cd .. && cpio -ivd)
    PERL_BIN=$MELTY_PERL_BIN
fi
log_echo "Using perl: $PERL_BIN"


RPM2CPIO_BIN="$PERL_BIN $CWD/rpm2cpio.pl"

if [ $REPOSITORY = "///" ] ; then
    REPOSITORY=`$PERL_BIN $CWD/repository-data.pl`
fi
LOCAL_RPMS=`$PERL_BIN $CWD/repository-data.pl $REPOSITORY LOCAL_RPMS`
RPMBUILD_BIN=`$PERL_BIN $CWD/repository-data.pl $REPOSITORY RPMBUILD`
EXTENSION=`$PERL_BIN $CWD/repository-data.pl $REPOSITORY EXTENSION`

log_echo $BOOTSTRAP_VERSION
uname -a | tee -a $LOGFILE
date | tee -a $LOGFILE
log_echo

log_echo "Making RPM directories ..."
mkdir -p /var/local/lib/rpm /var/local/tmp $LOCAL_SPECS $LOCAL_RPMS

log_echo "Downloading and extracting RPM boot images ..."
$PERL_BIN grab_rpm.pl -r $REPOSITORY $RPMS
for i in $RPMS ; do
    j="$LOCAL_RPMS/$i$EXTENSION"
    if [ ! -r $j ] ; then
        log_echo "Cannot find $j!"
	exit 1
    fi
    log_echo "Installing $j ..."
    rm -f /tmp/bootstraptemp.cpio
    $RPM2CPIO_BIN $j > /tmp/bootstraptemp.cpio
    cat /tmp/bootstraptemp.cpio | (cd / && $CPIO_BIN -idc) 2>>$LOGFILE
done

log_echo "Making virtual RPM package representing current Solaris packages ..."
$PERL_BIN solaris-contents.pl -v -r $REPOSITORY 2>>$LOGFILE

#log_echo "Making virtual RPM package representing known shells ..."
#$PERL_BIN shells.pl -v -r $REPOSITORY 2>>$LOGFILE

if [ $TINT = 1 ] ; then
    log_echo "Making virtual RPM package representing TINT packages ..."
    $PERL_BIN tint.pl -v -r $REPOSITORY 
fi

log_echo "Building virtual RPM packages ..."
$RPMBUILD_BIN -bb $LOCAL_SPECS/* >>$LOGFILE 2>&1

$PERL_BIN missing.pl $LOCAL_RPMS/vpkg*rpm 2>>$LOGFILE
$RPMBUILD_BIN -bb $LOCAL_SPECS/vpkg-missing* >>$LOGFILE 2>&1

log_echo "Installing virtual RPM packages ..."

for i in $LOCAL_RPMS/vpkg*rpm ; do
    log_echo "Installing " `basename $i`
    $RPM_BIN -i --force --nodeps $i
done

log_echo "Installing first RPM packages using boot image ..."
for i in $RPMS; do
    log_echo "Installing " `basename $i$EXTENSION`
    $RPM_BIN -i "$LOCAL_RPMS/$i$EXTENSION"
done

log_echo "Done."
