#!/bin/sh

# 19990402 - removed 'upd redirect' environment variables, added -z
#            added ${PRODUCTS_UPSDB}/xxx ups 'empty database' bug.
# 19990406 -- (mengel) 
#	     * used ':' not '-' in flavor smashing/unsmashing (dashes in versions hurt)
#	     * made +n part of flavor optional, based on uname
#	     * downloading table files separately
#            * "binary" instead of "image" ftp command
# 19990421 -- (mengel)
#		Major redo, added cfg.project file, new user creation, etc.
#
# Installs and configures ups, perl and upd

if [ ! -z "$1" ] ; then project=$1 ; else project=test ; fi

CDROM=/tmp/rhimage/Fermi
export CDROM

if [ -r ${CDROM}/workgroups/${project}/bootups ]
then
    proj_cfg=${CDROM}/workgroups/${project}/bootups/cfg
else
    proj_cfg=./cfg.${project}
fi

cfg=`grep '^set' ${proj_cfg} | sed -e 's/set //'`
eval "$cfg"

export CDROM


#########################
# RedHat boot silliness #
#########################
# try to tell if we have a real fs mounted on /mnt and a CDROM image, if
# so, copy yourself in and run...
if [ -d /mnt/lib/modules -a -d ${CDROM} ]
then
    echo "Copying onto /mnt area"
    cd ${CDROM}
    /mnt/bin/mkdir -p /mnt${CDROM}
    /mnt/usr/bin/find products workgroups/${project}/bootups -print |
	cpio -dump /mnt${CDROM}
    cd /mnt
    chroot /mnt /bin/sh ${CDROM}/products/bootups.sh ${project}
    /mnt/bin/rm -rf /mnt/${CDROM}
    exit 0
fi

echo ' '
echo ' =============================================================== '
echo " Bootstrapping UPS for $project on `hostname` at `date`"
echo ' =============================================================== '
echo ' '


if [ -r ${CDROM}/workgroups/${project}/bootups ]
then
    proj_updconfig=${CDROM}/workgroups/${project}/bootups/updconfig
    proj_dbconfig=${CDROM}/workgroups/${project}/bootups/dbconfig
    proj_boot1=${CDROM}/workgroups/${project}/bootups/boot.sh
    proj_cfg=${CDROM}/workgroups/${project}/bootups/cfg
    BOOTHOST=file://localhost${CDROM}/products/db
    origin="CDROM"
else
    proj_updconfig=./updconfig.${project}
    proj_dbconfig=./dbconfig.${project}
    proj_boot1=./boot.${project}
    proj_cfg=./cfg.${project}
    origin="fnkits.fnal.gov"
fi
export BOOTHOST

if [ -r ${proj_updconfig} -a \
     -r ${proj_dbconfig}      ]
then
    echo " OK - have configuration files  for   ${project}"
else
    echo " OOPS - do not have configuration files for   ${project}"
    echo " "
    echo "            dbconfig.${project}"
    echo "            updconfig.${project}"
    echo " "
    exit 1
fi

###########################################################################
############ Now we run the configuration - do not edit the following #####
###########################################################################

echo " OK - configuring "



DIST_FLVR=`uname -s`                            # base flavor of system
DIST_RLSE=`uname -r | cut -f 1 -d "."`          # release of system

case "$DIST_FLVR" in
IRIX64) 	DIST_FLVR="IRIX+5" ;;
CYGWIN32_NT)	test "$PERL_VER" != v5_004 || PERL_VER=v5_004-cwp;;
*)		DIST_FLVR="${DIST_FLVR}+${DIST_RLSE}";;
esac


echo " "
echo "     Calculated  DIST_FLVR ${DIST_FLVR} "

  PRODUCTS_ROOT=`egrep '^ *PROD_DIR_PREFIX'   ${proj_dbconfig} | \
     head -1 | cut -f2 -d= |  sed 's/ //g' `

 PRODUCTS_UPSDB=`egrep '^# *UPS_DATABASE_DIR' ${proj_dbconfig} | \
     head -1 | cut -f2 -d= |  sed 's/ //g' `

PRODUCTS_SETUPS=`egrep '^ *SETUPS_DIR'        ${proj_dbconfig} | \
     head -1 | cut -f2 -d= |  sed 's/ //g' `

   PRODUCTS_UPD=`egrep '^ *UPD_USERCODE_DIR'  ${proj_dbconfig} | \
     head -1 | cut -f2 -d= |  sed 's/ //g' `

echo " "
echo "     PRODUCTS_ROOT   $PRODUCTS_ROOT   "
echo "     PRODUCTS_UPSDB  $PRODUCTS_UPSDB  "
echo "     PRODUCTS_SETUPS $PRODUCTS_SETUPS "
echo "     PRODUCTS_UPD    $PRODUCTS_UPD    "


#############################
# Checking ${BOOTDIR}  #
#############################

mkdir -p ${BOOTDIR}

if touch ${BOOTDIR}/writettest
then 
    rm -f ${BOOTDIR}/writettest
    echo " OK - you can write into ${BOOTDIR} "
else
    echo " "
    echo " * * * * * * * * * * * * * * * * * * * * * * * * * * * * * "
    echo " * *  Sorry, your account cannot write into ${BOOTDIR}   * * "
    echo " * * * * * * * * * * * * * * * * * * * * * * * * * * * * * "
    echo " "
    exit 1
fi

############################
# BOOTDIR directories #
############################

for PRODUCTS_MKDIR in    \
  ${BOOTDIR}                  \
  ${BOOTDIR}/upsdb            \
  ${BOOTDIR}/upsdb/.upsfiles  \
  ${BOOTDIR}/upsdb/.updfiles  \
  ${BOOTDIR}/setups
do 
    if [ -d ${PRODUCTS_MKDIR} ]
    then
        echo " OK - already have  ${PRODUCTS_MKDIR} "
    else
        if mkdir  ${PRODUCTS_MKDIR}
        then
            echo " OK - created  ${PRODUCTS_MKDIR} "
        else
            echo " OOPS - could not create  ${PRODUCTS_MKDIR} "
	    exit 1
        fi
    fi
done

#########################
# UPS/UPD/PERL tarballs #
#########################

echo " "
echo " OK - copying ups tarfiles from ${origin} "
echo " "

for PRODVERSFLVR in \
    ups:${UPS_VER}:${DIST_FLVR}    \
    perl:${PERL_VER}:${DIST_FLVR}  \
    upd:${UPD_VER}:NULL
do 

   prod=`echo ${PRODVERSFLVR} | cut -d: -f1`
   vers=`echo ${PRODVERSFLVR} | cut -d: -f2`
   flvr=`echo ${PRODVERSFLVR} | cut -d: -f3`

   if [     -d ${BOOTDIR}/${prod} ]
    then
        echo " ${BOOTDIR}/${prod} already exists "
    else
            cdtar="${CDROM}/products/${prod}/${vers}/${prod}_${vers}_${flvr}.tar"
            cdtbl="${CDROM}/products/${prod}/${vers}/${prod}_${vers}_${flvr}.table"
            if [ -r ${cdtar} ]
	    then
		ln -s ${cdtar} ${BOOTDIR}/${prod}.tar
		cp $cdtbl      ${BOOTDIR}/${prod}.table
	    fi
            if [ -r ${cdtar}.gz ]
	    then
		gunzip < ${cdtar}.gz > ${BOOTDIR}/${prod}.tar
		cp $cdtbl      ${BOOTDIR}/${prod}.table
                BOOTHOST=file://localhost${CDROM}/products/db
            fi
            if [ ! -r ${BOOTDIR}/${prod}.tar ]    # for testing
	    then
		echo "products/${prod}/${vers}/${flvr}/${prod}_${vers}_${flvr}.tar"
		/bin/echo  "user ftp ${USER:-$USERNAME}@`hostname`\n \
		    binary \n \
		    get products/${prod}/${vers}/${flvr}/${prod}_${vers}_${flvr}.tar \
			 ${BOOTDIR}/${prod}.tar \n \
		    get products/${prod}/${vers}/${flvr}/${prod}_${vers}_${flvr}.table \
			 ${BOOTDIR}/${prod}.table \n \
		    quit" \
        	|  ftp -n ftp.fnal.gov
            fi
        du   -sk ${BOOTDIR}/${prod}.tar
        mkdir -p ${BOOTDIR}/${prod}
        ( cd     ${BOOTDIR}/${prod} ; tar xf ${BOOTDIR}/${prod}.tar ) 
#        rm      ${BOOTDIR}/${prod}.tar
        du -sk   ${BOOTDIR}/${prod}
    fi
done

##################
# configurations #
##################

echo " "
echo " OK - creating tmp upsdb_list   file "

echo   ${BOOTDIR}/upsdb  >  ${BOOTDIR}/setups/upsdb_list

echo " OK - creating tmp ups  dbconfig file "

echo "FILE             = dbconfig"                        >  ${BOOTDIR}/upsdb/.upsfiles/dbconfig
echo "AUTHORIZED_NODES = *"                               >> ${BOOTDIR}/upsdb/.upsfiles/dbconfig
echo "PROD_DIR_PREFIX  = ${BOOTDIR}"                 >> ${BOOTDIR}/upsdb/.upsfiles/dbconfig
echo "SETUPS_DIR       = ${BOOTDIR}/setups"          >> ${BOOTDIR}/upsdb/.upsfiles/dbconfig
echo "UPD_USERCODE_DIR = ${BOOTDIR}/upsdb/.updfiles" >> ${BOOTDIR}/upsdb/.upsfiles/dbconfig


echo " OK - creating tmp upd updconfig file "

cat > ${BOOTDIR}/upsdb/.updfiles/updconfig <<\endfile
File       = updconfig
group:
       product    = ANY
       flavor     = ANY
       qualifiers = ANY
       options    = ANY
common:
     UPS_THIS_DB  = "${UPD_USERCODE_DB}"
     UPS_PROD_DIR = "${UPS_PROD_NAME}"
  UNWIND_PROD_DIR = "${PROD_DIR_PREFIX}/${UPS_PROD_DIR}"
      UPS_UPS_DIR = "ups"
   UNWIND_UPS_DIR = "${UNWIND_PROD_DIR}/${UPS_UPS_DIR}"
   UPS_TABLE_FILE = "${UPS_PROD_NAME}.table"
 UNWIND_TABLE_DIR = "${UNWIND_UPS_DIR}"
    UPS_TABLE_DIR = "${UNWIND_TABLE_DIR}"
end:
endfile

cp  ${BOOTDIR}/upd/ups/updusr.pm.template \
    ${BOOTDIR}/upsdb/.updfiles/updusr.pm

###################
# preparing ups   #
###################

echo " "
echo " OK - removing any previous UPS environment "

unset PRODUCTS
unset SETUP_UPS
unset SETUPS_DIR
unset UPS_DIR
unset UPS_SHELL

export UPS_SHELL
       UPS_SHELL=/bin/sh

export PRODUCTS
       PRODUCTS=${BOOTDIR}/upsdb
       
###############################
# declaring cygwin32 (if present) ups, upd, perl   #
###############################

if [ -d ${BOOTDIR}/cygwin32 ]
then
if [ -d upsdb/cygwin32 ]
then
    echo " OK - cygwin32 exists "
else
    echo " "
    echo " OK - declaring cygwin32 "
    ${BOOTDIR}/ups/bin/ups declare -z ${BOOTDIR}/upsdb \
		  -r ${BOOTDIR}/cygwin32 \
		  -f ${DIST_FLVR} \
		  -m cygwin32.table \
		  -M ${BOOTDIR} \
		     cygwin32 ${CYGWIN32_VER}
    ${BOOTDIR}/ups/bin/ups declare -z ${BOOTDIR}/upsdb \
		  -C -c	    \
		     cygwin32 ${CYGWIN32_VER}
fi
fi


if [ -d upsdb/ups ]
then
    echo " "
    echo " OK - ups exists "
else
    echo " "
    echo " OK - declaring ups "
    ${BOOTDIR}/ups/bin/ups declare -z ${BOOTDIR}/upsdb \
		  -r ${BOOTDIR}/ups \
		  -f ${DIST_FLVR} \
		  -m ups.table \
		  -M ${BOOTDIR} \
		     ups ${UPS_VER}
    ${BOOTDIR}/ups/bin/ups declare -z ${BOOTDIR}/upsdb \
		  -c	    \
	             ups ${UPS_VER}
fi

if [ -d upsdb/perl ]
then
    echo " OK - perl exists "
else
    echo " "
    echo " OK - declaring perl "
    ${BOOTDIR}/ups/bin/ups declare -z ${BOOTDIR}/upsdb \
		  -r ${BOOTDIR}/perl \
		  -f ${DIST_FLVR} \
		  -m perl.table \
		  -M ${BOOTDIR} \
		     perl ${PERL_VER}
    ${BOOTDIR}/ups/bin/ups declare -z ${BOOTDIR}/upsdb \
		  -C            \
		  -c	    \
		     perl ${PERL_VER}
fi


if [ -d upsdb/upd ]
then
    echo " OK - upd exists "
else
    echo " "
    echo " OK - declaring upd "
    ${BOOTDIR}/ups/bin/ups declare -z ${BOOTDIR}/upsdb \
		  -r ${BOOTDIR}/upd \
		  -f NULL \
		  -m upd.table \
		  -M ${BOOTDIR}  \
		  -c \
		     upd ${UPD_VER}
fi

echo " "
echo " OK - setting up ups "

. ${BOOTDIR}/setups/setups.sh

echo " "
echo " OK - bootstrap products are "
ups list -aK+

echo " "
echo " OK - setting up upd "

setup upd ${UPD_VER}

###############
# directories #
###############

create_db() {
    db=$1
    dbconfig=$2
    updconfig=$3
    eval `grep SETUPS_DIR $dbconfig | sed -e 's/ *= */=/'`
    
    mkdir -p $db/.upsfiles/startup
    mkdir -p $db/.upsfiles/shutdown
    mkdir -p $db/.upsfiles/statistics
    mkdir -p $db/.updfiles
    mkdir -p $SETUPS_DIR
    cp $dbconfig  $db/.upsfiles/dbconfig
    cp $updconfig  $db/.updfiles/updconfig
    cp ${BOOTDIR}/upsdb/.updfiles/updusr.pm  ${db}/.updfiles/updusr.pm

    echo ${db} >> ${PRODUCTS_SETUPS}/upsdb_list

    #empty database bug workaround
    mkdir -p $db/xxx
}

# create_db ${PRODUCTS_ROOT} ${proj_dbconfig} ${proj_updconfig}

creates="`grep create_db ${proj_cfg}`"
if [ "" != "$creates" ]
then
     eval "$creates"
fi


#############
# accounts  #
#############

create_user() {
  for f in "$@"
  do
    (echo 1; echo 1; echo 1; echo /bin/sh; echo y; echo ---) | cmd adduser $1
  done
}

usercfg="`grep create_user ${proj_cfg} 2>/dev/null`"

if [ "" != "$usercfg" ]
then
    upd install -h ${BOOTHOST} systools ${SYSTOOLS_VER} -G -c

    setup systools ${SYSTOOLS_VER}

    cat > ${CMDSCRIPTS_DIR}/library/adduser.work/disks <<EOF
${PRODUCTS_ROOT},u=1342,full,
/tmp,u=8444,full,
/home,misc,
EOF

    cat > ${CMDSCRIPTS_DIR}/library/adduser.work/unix.uid.list <<EOF
1342:4525:Generic Products Account:products
8444:1525:Obtain Admin Acct:obtain
EOF

    cat > ${CMDSCRIPTS_DIR}/library/adduser.work/unix.gid_id.list <<EOF
4525:products:Computing Div. - Access/Products
1525:g020:Computing Div. - World Wide Web Group
EOF


    # now do the usercfg line
    eval "$usercfg"
fi



############
# installs #
############
chowncfg="`grep chall_dir ${proj_cfg} 2>/dev/null`"
chall_dir() {
    test -d $3 || mkdir -p $3
    chown -R $1 $3
    chmod -R $2 $3
}

if [ "" != "$chowncfg" ]
then
    eval "$chowncfg"
fi

tmpenv=`ups setup -V ups, upd 2>/dev/null`
booturl=file://localhost${BOOTDIR}/upsdb 

PRODUCTS=${PRODUCTS_UPSDB}
export PRODUCTS
installcfg="`grep install_as ${proj_cfg} 2>/dev/null`"

install_as() {
    user=$1
    shift
    echo "====================================================="
    echo "installing $* as $user"
    echo "====================================================="
    if [ "${user}" = "." ] || id | grep 'uid=[0-9]*('${user} > /dev/null
    then
        /bin/sh -c ". $tmpenv; upd install -z ${PRODUCTS_UPSDB} -G -c $*"
    else
        su $user -c "/bin/sh -c '. $tmpenv; upd install -z ${PRODUCTS_UPSDB} -G -c $* '"
    fi
    echo "====================================================="
    echo "done installing $* as $user"
    echo "====================================================="
}

if [ "" != "$installcfg" ]
then
    eval "$installcfg"
fi

# removing ups v4_4a empty-database bug workaround
rmdir ${PRODUCTS_UPSDB}/xxx

##################
# courtesy links #
##################

if [ "/usr/local/etc" != "${PRODUCTS_SETUPS}" ] && touch /usr/local/etc/writetest 
then
     rm -f /usr/local/etc/writetest
     rm -f /usr/local/etc/setups.csh 
     rm -f /usr/local/etc/setups.sh 
     ln -s ${PRODUCTS_SETUPS}/setups.csh /usr/local/etc/setups.csh
     ln -s ${PRODUCTS_SETUPS}/setups.sh /usr/local/etc/setups.sh
fi

########
# done #
########

echo ' '
echo ' ===================================================================== '
echo "  Bootstrapping UPS complete `date`"
echo ' ===================================================================== '
echo ' '

#####################
# project bootstrap #
#####################

if [ -x ${proj_boot1} ]
then

echo ' '
echo ' ===================================================================== '
echo "  Running  boot.${project} at `date`"
echo ' ===================================================================== '
echo ' '

${proj_boot1}

echo ' '
echo ' ===================================================================== '
echo "  Finished boot.${project} at `date`"
echo ' ===================================================================== '
echo ' '

fi

############
# clean up #
############

echo ' '
echo ' ===================================================================== '
echo "  cleaning ${BOOTDIR} "
echo ' ===================================================================== '
echo ' '

rm -rf ${BOOTDIR} &

exit
