#!/bin/bash

echo "This is going to do an automatic installation of alien (MODIFIED!!!)"


TMPFILE=/tmp/.alien_installer.$$


PARSEARGUMENTS()
{
  while [ $# -gt 0 ]
  do
    case $1 in 
      -help|--help|-h)
	 echo "$0: makes an automatic isntallation of the services. 

Options
  -restart:           Restart the services after the installation has finished
  -type <type>:       Specify the type of installation (default is vobox)
  -version <version>: Install a specific version (default is the latest)
  -skip_rc:           Do not read the file $HOME/.alien/installer.rc for default values
  -batch:             Run in batch mode (do not wait 10 seconds)"

         exit 0
         ;;
      -restart|--restart)
         ALIEN_RESTART=1
         ;;
      -type|--type)
         shift 1
         ALIEN_TYPE=$1
         ;;
      -version|--version)
         shift 1
         ALIEN_FORCE_VERSION=$1;
         ;;
      -skip_rc|--skip_rc)
         ALIEN_SKIP_RC=1;
         ;;
      -batch|--batch)
	 ALIEN_INSTALLER_BATCH=1
         ;;
      *) echo "Sorry, don't understand '$*'"
         exit -1
    esac
    shift 1
  done
}

FINDCURRENTVERSION()
{
  echo "    Checking the version currently installed"

  wget -q  $ALIEN_BITS_URL/../../../../CompiledReleases -O CompiledReleases 
  if [ $? != 0 ]
  then
    echo "Error getting the file $ALIEN_BITS_URL/../../../../CompiledReleases"
    exit -2
  fi

  ALIEN_MINOR_VERSION=`cat CompiledReleases |grep $ALIEN_VERSION| awk  '{print \$3}'`
  rm CompiledReleases

  VERSION=`$ALIEN_INSTALLER_PREFIX/bin/alien -version 2>&1  |grep "Version:" |awk -F "Version: " '{print $2}'`
#  if [ "$VERSION" = '' ];
#  then
##    echo "Trying with the default location for alien"
#    VERSION=`$HOME/alien/bin/alien -version 2>&1  |grep "Version:" |awk -F "Version: " '{print $2}'`
#  fi
#  if [ "$VERSION" = '' ];
#  then
#    echo "Trying with the default location for alien"
#    VERSION=`$HOME/alien/bin/alien -version 2>&1  |grep "Version:" |awk -F "Version: " '{print $2}'`
#  fi
  if [ "$VERSION" = '' ];
  then
    echo "    At the moment, there is no version installed"
    return 0
  fi
  echo "    Checking the version that we would install (if it is newer than '$VERSION')"

  if [ "$VERSION"  = "$ALIEN_VERSION.$ALIEN_MINOR_VERSION" ];
  then
     echo "You have the latest version installed ($VERSION). We don't install"
     if  [ "$ALIEN_RESTART" = "" ]
     then
       exit 0
     fi
     echo "Exiting with error because we were supposed to restart"
     exit -2
  fi
  echo "   Ready to install $ALIEN_VERSION.$ALIEN_MINOR_VERSION"

}

FINDVERSION()
{
  if [ "$ALIEN_FORCE_VERSION" == "" ];
  then 
    releases="http://alien.cern.ch/Releases"
    wget $releases  -O $TMPFILE 2> /dev/null 
    if  [ $? != 0 ];
    then 
      echo "error getting the file $releases"
      exit -2
    fi
    ALIEN_VERSION=`head -n 2 $TMPFILE |tail -n 1 | awk '{print $5'}`
    rm $TMPFILE
    if [ "$ALIEN_VERSION" = "" ];
    then 
     echo "Error getting the version from $releases"
     exit -2
    fi
  else
    ALIEN_VERSION=$ALIEN_FORCE_VERSION
    echo "    Forcing a specific version"
  fi
  echo "   Installing the version '$ALIEN_VERSION'"
}

FINDLOCK()
{
  LOCK="$ALIEN_INSTALLER_PREFIX.lockfile"
  echo "Checking the lock $LOCK"
  if [ -f $LOCK ]; then
    RECENT=`find $LOCK -cmin -180 | wc -l`

    if [ "$RECENT" -gt 0 ]; then
        exit -1
    fi
  fi

  touch $LOCK 
}
FINDPLATFORM()
{
  if [ "$ALIEN_INSTALLER_PLATFORM" != "" ];
  then 
     echo "The variable ALIEN_INSTALLER_PLATFORM is defined ($ALIEN_INSTALLER_PLATFORM)"
  else 
    case `uname -s ` in 
      Darwin)  ALIEN_INSTALLER_PLATFORM=i686-apple-darwin8.6.1 ;; 
           *)
              case `uname -m` in 
	           i686) ALIEN_INSTALLER_PLATFORM=i686-pc-linux-gnu ;; 
	           ia64) ALIEN_INSTALLER_PLATFORM=ia64-unknown-linux-gnu ;; 
	           x86_64) ALIEN_INSTALLER_PLATFORM=x86_64-unknown-linux-gnu ;; 
	           i686) ALIEN_INSTALLER_PLATFORM=i686-apple-darwin8.6.1 ;; 
              esac 
    esac
     echo "   Taking the current platform ($ALIEN_INSTALLER_PLATFORM) (use ALIEN_INSTALLER_PLATFORM if you want another one)";

  fi

  if [ "$ALIEN_INSTALLER_PLATFORM" = "" ];
  then
     echo "Error getting the platform"
     exit -2
  fi

  releases="http://alien.cern.ch/BitServers"
  wget $releases  -O $TMPFILE 2> /dev/null 
  if  [ $? != 0 ];
  then 
    echo "error getting the file $releases"
    exit -2
  fi
  ALIEN_BITS_URL=`grep $ALIEN_INSTALLER_PLATFORM  $TMPFILE | awk '{print $3'}`

  ALIEN_BITS_URL="$ALIEN_BITS_URL/$ALIEN_INSTALLER_PLATFORM/$ALIEN_VERSION/download/"
  if [ "$ALIEN_BITS_URL" = "" ];
  then 
     echo "Error getting the bits url $releases"
     cat $TMPFILE
     rm $TMPFILE
     exit -2
  fi
  rm $TMPFILE

}
FINDTYPE()
{
  ALIEN_INSTALLER_TYPE=${ALIEN_INSTALLER_TYPE=gshell+site+lcg+monitor}
  if [ "$ALIEN_TYPE" = "" ];
  then 
    case $ALIEN_INSTALLER_TYPE in
       wn)
           ALIEN_TYPE='workernode'
           ;;
       *site*)
           ALIEN_TYPE='vobox'
           ;;
       gshell+client|client+gshell)
           ALIEN_TYPE='user'
          ;;
       *) ALIEN_TYPE='all'
           ;;
    esac
  fi
  echo "   Installing the components $ALIEN_INSTALLER_TYPE (use ALIEN_INSTALLER_TYPE to change it)"
  echo "      This corresponds to $ALIEN_TYPE"
}

#################################################################################################
#################################################################################################
PARSEARGUMENTS $*
if  [ "$ALIEN_SKIP_RC" = "" ];
then
  [ -f   $HOME/.alien/installer.rc ] &&   source $HOME/.alien/installer.rc
fi

ALIEN_INSTALLER_HOME=${ALIEN_INSTALLER_HOME=$HOME/.alien/cache}
ALIEN_INSTALLER_PREFIX=${ALIEN_INSTALLER_PREFIX=$HOME/alien}

echo "   Installing in $ALIEN_INSTALLER_PREFIX (use ALIEN_INSTALLER_PREFIX to change it)"
FINDVERSION
FINDPLATFORM
FINDCURRENTVERSION
FINDTYPE

ALIEN_INSTALLER_PREFIX=${ALIEN_INSTALLER_PREFIX%/}

LINK=$ALIEN_INSTALLER_PREFIX

#shopt -s extglob
#ALIEN_INSTALLER_PREFIX=${ALIEN_INSTALLER_PREFIX/%alien*([^\/])/alien}
#shopt -u extglob


ALIEN_INSTALLER_PREFIX="$ALIEN_INSTALLER_PREFIX.$ALIEN_VERSION.$ALIEN_MINOR_VERSION"

FINDLOCK

if [ "$ALIEN_INSTALLER_BATCH" = "" ];
then 
  echo 
  echo "   I am sleeping for 10 seconds to give you time to cancel..."

  sleep 10
fi
echo "Let's go!!"


while [ -d $ALIEN_INSTALLER_PREFIX ] ;
do
   echo "$ALIEN_INSTALLER_PREFIX exists"
   ALIEN_INSTALLER_PREFIX=${ALIEN_INSTALLER_PREFIX}_new
done


mkdir $ALIEN_INSTALLER_PREFIX 

if [ ! -d $ALIEN_INSTALLER_PREFIX ] ;
then
    echo "Error creating the directory $ALIEN_INSTALLER_PREFIX!!"
    exit -2
fi


rm -rf $ALIEN_INSTALLER_HOME

echo "Ready to download the file"
RELOCATE()
{
prefix=$ALIEN_INSTALLER_PREFIX

build_prefix=/opt/alien
if [ "$prefix" != "$build_prefix" ] 
then

   echo Relocating perl
   config=`find $prefix/lib/perl5 -name Config.pm -exec grep -l "This file was created by configpm" {} \;`
   if [ "$config" = "" ] ; then
	echo "Couldn't find Config.pm in $prefix/lib/perl5!"
        exit -2
   fi     
   perl -pi -e "s%$build_prefix/%$prefix/%sg; s%$build_prefix'%$prefix'%sg; s%$build_prefix %$prefix %sg " $config
   config=`find $prefix/lib/perl5 -path "*/CORE/config.h"`
   if [ "$config" = "" ] ; then
	echo "Couldn't find CORE/config.h in $prefix/lib/perl5!"
	exit -2
   fi
   perl -pi -e "s%$build_prefix/%$prefix/%sg; s%$build_prefix'%$prefix'%sg; s%$build_prefix %$prefix %sg; s%\"$build_prefix\"%\"$prefix\"%sg; " $config
   for file in `find $prefix/lib/perl5 -name .packlist`
   do
        perl -pi -e "s%$build_prefix/%$prefix/%g" $file
   done

   echo Relocating globus
   if [ -f $prefix/globus/setup/globus/setup-globus-common ]
   then
     env GLOBUS_LOCATION=$prefix/globus GPT_LOCATION=$prefix/globus PERL5LIB="$prefix/globus/lib/perl5:$prefix/lib/perl5" $prefix/bin/perl $prefix/globus/setup/globus/setup-globus-common.pl
   fi 

   echo Relocating api
     (cd $prefix/api/bin; ./alien_apiservice-bootstrap)

   echo Relocating alien-perl
     if [ -f $prefix/bin/alien-perl ]
     then
       $prefix/bin/alien-perl --bootstrap --prefix $prefix
     fi


   for p in curl-config gpg-error-config libgcrypt-config libgnutls-config libgnutls-extra-config uuid-config xml2-config freetype-config pkg-config
   do
     if [ -f $prefix/bin/$p ] ;
     then
       echo Relocating $p
       perl -pi -e "s%$build_prefix/%$prefix/%sg; s%$build_prefix'%$prefix'%sg; s%$build_prefix %$prefix %sg " $prefix/bin/$p
     fi
   done

fi

}


echo "Let's get the file"
FILE=${ALIEN_BITS_URL}alien-$ALIEN_VERSION-$ALIEN_TYPE.tar.bz2
mkdir -p $ALIEN_INSTALLER_PREFIX
cd $ALIEN_INSTALLER_PREFIX
echo "Getting $FILE"
#wget -nv "$FILE" -O alien.tar.gz 

ARCH=`uname -m`

TCLIENT="torrent_client_$ARCH.tar.bz2"
WWWROOT="http://alitorrent.cern.ch"

wget "$WWWROOT/torrent_client/$TCLIENT" -O "$TCLIENT" || exit 1

bzip2 -c -d "$TCLIENT" | tar -x || exit 2
echo "Getting the torrent"

FULLNAME="alien-$ALIEN_VERSION-$ALIEN_TYPE-$ARCH.tar.bz2"
TFILE="$WWWROOT/torrents/$FULLNAME.torrent"

torrent_client_$ARCH/download "$TFILE" -d torrent_source || exit 2
echo "Seeding the torrent"
torrent_client_$ARCH/seed "$TFILE" -d torrent_source



if [ "$?" != 0 ];
then
  echo "Error getting $FILE!"
  rm -rf  $ALIEN_INSTALLER_PREFIX
  exit -2
fi
echo "Extracting the files"
tar jxf torrent_source/*/*.tar.bz2
echo "Relocating the installation"
RELOCATE  > relocate.out 2>&1
#rm -rf alien.tar.gz


echo "The installation finished"


SIZE=`du -sk $ALIEN_INSTALLER_PREFIX |awk '{print $1}'`
SMALL=`expr 0$SIZE \< 100000` 

if [ "$SMALL" != 0  ] ;
then
    echo "The installation is too small... something went wrong??"
    rm -rf  $ALIEN_INSTALLER_PREFIX.failed
    mv $ALIEN_INSTALLER_PREFIX $ALIEN_INSTALLER_PREFIX.failed
    exit -2
fi

if [ ! -f $ALIEN_INSTALLER_PREFIX/share/alien/ALIEN_VERSION ]
then
    echo "The version file doesn't exist"
    rm -rf  $ALIEN_INSTALLER_PREFIX.failed
    mv $ALIEN_INSTALLER_PREFIX $ALIEN_INSTALLER_PREFIX.failed
    exit -2
fi


rm -rf $ALIEN_INSTALLER_HOME

cat >> $ALIEN_INSTALLER_PREFIX/.Environment <<EOF
ALIEN_PATH=\$ALIEN_ROOT/api/bin:\$ALIEN_ROOT/globus/bin
ALIEN_LD_LIBRARY_PATH=\$ALIEN_ROOT/api/lib:\$ALIEN_ROOT/globus/lib:\$ALIEN_ROOT/lib:\$ALIEN_ROOT/lib64:\$ALIEN_ROOT/lib/mysql
GLOBUS_LOCATION=\$ALIEN_ROOT/globus
X509_CERT_DIR=\$ALIEN_ROOT/globus/share/certificates
GAPI_LOCATION=\$ALIEN_ROOT/api
MYPROXY_LOCATION=\$ALIEN_ROOT/globus

EOF

if [ -L $LINK ];
then
  echo "Updating the link $LINK"
  rm $LINK
else
  echo "MOVING $LINK to $LINK.old"
  mv  $LINK $LINK.old
fi

ln -s  $ALIEN_INSTALLER_PREFIX $LINK


if [ "$ALIEN_RESTART" = 1 ];
then
    NOHUP=`which nohup 2> /dev/null`
    echo "Let's restart the services (with $NOHUP)"
    echo "This very first time, we have to kill everything"
    (cd; sleep 15; kill ` ps -ef |grep alien |grep -v grep |grep -v $$ |awk '{print \$2}'`;kill -9 ` ps -ef |grep alien |grep -v grep |grep -v $$ |awk '{print \$2}'`; $NOHUP $ALIEN_INSTALLER_PREFIX/etc/rc.d/init.d/aliend restart) &
fi
