#!/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=${INSTALLIMAGE}Fermi
echo $INSTALLIMAGE > /dev/tty5
echo $CHROOT > /dev/tty5
echo $CDROM > /dev/tty5
PATH=$PATH:$CHROOT/bin:$CHROOT/usr/bin:$CHROOT/usr/sbin:/bin:/usr/bin

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

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

cfg=`grep '^set' ${ver_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 /$CHROOT/lib/modules -a -d ${CDROM} ]
then
    echo "Copying onto /mnt area"
    cd ${CDROM}
    /$CHROOT/bin/mkdir -p /${CHROOT}/${CDROM}
    /$CHROOT/usr/bin/find products workgroups/${project}/bootups -print |
	/$CHROOT/bin/cpio -dump /${CHROOT}/${CDROM}
    cd /$CHROOT
    /$CHROOT/usr/sbin/chroot $CHROOT /bin/sh -x ${CDROM}/products/bootups.sh ${project} 2> /tmp/cjs
#    $CHROOT/bin/rm -rf /${CHROOT}/${CDROM}
    exit 0
fi


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

PATH=/bin:/usr/bin:/usr/sbin:/sbin
echo "cdrom is $CDROM" > /dev/tty5
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=`echo ./updconfig.*`
    proj_dbconfig=`echo ./dbconfig.*`
    proj_boot1=./boot.${project}
    proj_cfg=./cfg.${project}
    BOOTHOST="fnkits.fnal.gov"
    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+${DIST_RLSE}" ;;
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}  #
#############################

# note that check_space is also used later...

check_space() {
    dir=$1
    need=$2
    heading="`df -k $1 | head -1`"
    body="`df -k $1 | sed -e 1d`"
    set : $heading
    avcol=0
    mtcol=0
    col=1
    for f in $*
    do
	case $f in
	[Aa]vail*) avcol=$col;;
	[Mm]ount*) mtcol=$col;;
	esac
	col=`expr $col + 1`
    done
    set : $body
    eval avail=\$$avcol
    eval mount=\$$mtcol
    mountvar="mv`echo $mount | sed -e 's/[^a-z]/_/g'`"
    eval "need=\`expr $need + \${$mountvar:-0}\`"
    eval "$mountvar=$need"
    if [ $avail -lt $need ]
    then
	echo "Insufficient space in $mountvar partition."
	echo "$mountvar has ${avail}k free, but ${need}k needed"
	return 1
    else
	return 0
    fi
}


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

if check_space ${BOOTDIR} 30000
then
    echo "Sufficient space found in ${BOOTDIR}"
else
    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 --parents ${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

       UPS_SHELL=/bin/sh
export UPS_SHELL

       PRODUCTS=${BOOTDIR}/upsdb
export PRODUCTS
       
###############################
# 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 --parents $db/.upsfiles/startup
    mkdir --parents $db/.upsfiles/shutdown
    mkdir --parents $db/.upsfiles/statistics
    mkdir --parents $db/.updfiles
    mkdir --parents $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 --parents $db/xxx
}

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

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

#######################
# space requirements  #
#######################


checks="`grep check_space ${proj_cfg}`"
spaceok=true
echo "$checks" | 
    while read line
    do
	eval "$line" || spaceok=false
    done

if $spaceok
then
    echo "Sufficient disk space to proceed"
else
    echo "Insufficient disk space to proceed"
    cd /
    /bin/sh -c "/bin/rm -rf ${BOOTDIR} &"
    exit
fi

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

create_user() {
  # create the user with adduser
  # then remove the password
  for f in "$@"
  do
    (echo 1; echo 1; echo 1; echo /bin/sh; echo y; echo ---) | cmd adduser $f
    if [ -f /etc/shadow ]
    then 
	perl -pi -e "s/\A^$f:[^:]*:/$f:NP:/;" /etc/shadow 
    else
	perl -pi -e "s/\A$f:[^:]*:/$f:NP:/;" /etc/passwd 
    fi
  done
}

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

# don't trip over old stuff in /usr/local/bin 
PATH=`$UPS_DIR/bin/dropit /usr/local/bin`
export PATH

if [ "" != "$usercfg" -a "$DIST_FLVR" != "CYGWIN32_NT" ]
then
    ups list -a
    upd install -z ${BOOTDIR}/upsdb -h ${BOOTHOST} systools ${SYSTOOLS_VER} -H $DIST_FLVR -G -c

    ups InstallAsRoot systools v6_1
    setup systools -z ${BOOTDIR}/upsdb ${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 --parents $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}" = "." -o "$DIST_FLVR" = "CYGWIN32_NT" ] || 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 ' '

/bin/sh -c "/bin/rm -rf ${BOOTDIR} &"

exit

