#!/bin/bash
# INSTALL SCRIPT TO SET UP A GRIDWAY INSTANCE FROM A SCRATCH UBUNTU LINUX DISTRIBUTION
INSTALL_DIR='/opt'
GLOBUS_PACKAGE_URL='http://www-unix.globus.org/ftppub/gt4/4.2.1/installers/src/gt4.2.1-all-source-installer.tar.bz2'
GLOBUS_PACKAGE='gt4.2.1-all-source-installer'
GLITE_PACKAGE_URL='http://grid-deployment.web.cern.ch/grid-deployment/download/relocatable/glite-UI/SL4_i686/glite-UI-3.1.42-0.tar.gz'
GLITE_PACKAGE='glite-UI-3.1.42-0'
GLITE_EXTERNAL_PACKAGE_URL='http://grid-deployment.web.cern.ch/grid-deployment/download/relocatable/glite-UI/SL4_i686/glite-UI-3.1.42-0-external.tar.gz'
GLITE_EXTERNAL_PACKAGE='glite-UI-3.1.42-0-external'
GRIDWAY_PACKAGE=''
GRIDWAY_PACKAGE_SVN='http://svn.gridway.org/gridway/trunk'

# INSTALLING general purpose tools
apt-get update
apt-get install -y subversion make g++ libssl-dev xinetd libnet-ldap-perl libexpat1-dev ruby ruby-dev default-jdk default-jre ant libdb4.7

# THE GLOBUS TOOLKIT download, installation and set up
if [ ! -d $INSTALL_DIR/globus ]; then mkdir $INSTALL_DIR/globus; fi
cd $INSTALL_DIR/globus
if [ ! -d "$GLOBUS_PACKAGE" ]; then
 wget $GLOBUS_PACKAGE_URL || exit;
 tar --bzip2 -xvf *
fi
cd $GLOBUS_PACKAGE
export JAVA_HOME=${JAVA_HOME:-/usr/lib/jvm/java-6-openjdk}
export ANT_HOME={ANT_HOME:-/usr/share/ant}
./configure --prefix=$INSTALL_DIR/globus/4.2.1
make
make install

# GLITE download, installation and set up
if [ ! -d $INSTALL_DIR/glite ]; then mkdir $INSTALL_DIR/glite; fi
cd $INSTALL_DIR/glite
if [ ! -e "$GLITE_PACKAGE.tar.gz" ]; then wget $GLITE_PACKAGE_URL; fi
if [ ! -e "$GLITE_EXTERNAL_PACKAGE.tar.gz" ]; then wget $GLITE_EXTERNAL_PACKAGE_URL; fi
if [ ! -d glite ]; then tar -xzvf $GLITE_PACKAGE.tar.gz; fi
if [ ! -d external ]; then tar -xzvf $GLITE_EXTERNAL_PACKAGE.tar.gz; fi
if [ ! -e /usr/lib/libexpat.so.0 ]; then ln -s /usr/lib/libexpat.so /usr/lib/libexpat.so.0; fi

# GRIDWAY download, installation and set up
if [ ! -d $INSTALL_DIR/gridway ]; then mkdir $INSTALL_DIR/gridway; fi
cd $INSTALL_DIR/gridway
if [ ! -d gridway_trunk ]; then
 if [ "$GRIDWAY_PACKAGE_URL" != '' ]; then
   wget $GRIDWAY_PACKAGE_URL || exit;
   mv `ls` gridway_trunk
 else
   svn co $GRIDWAY_PACKAGE_SVN gridway_trunk
 fi
fi
cd gridway_trunk
export GLOBUS_LOCATION=${GLOBUS_LOCATION:-$INSTALL_DIR/globus/4.2.1}
echo GLOBUS_LOCATION=$GLOBUS_LOCATION
./configure --prefix=$INSTALL_DIR/gridway/5.5 --enable-ldap --enable-prews --enable-drmaa-ruby --enable-drmaa1 --enable-debug --with-tests
make
make install

# Setting gridftp
if [ `grep gsiftp /etc/services 1>/dev/null 2>&1; echo $?` -ne 0 ]; then
 printf "gsiftp\t2811\n" >> /etc/services
fi
if [ ! -e /etc/xinetd.d/gridftp ]; then
 cat > /etc/xinetd.d/gridftp << _EOF_
service gsiftp
{
instances               = 100
socket_type             = stream
wait                    = no
user                    = root
env                     += GLOBUS_LOCATION=$INSTALL_DIR/globus/4.2.1
env                     += LD_LIBRARY_PATH=$INSTALL_DIR/globus/4.2.1/lib
server                  = $INSTALL_DIR/globus/4.2.1/sbin/globus-gridftp-server
server_args             = -i
log_on_success          += DURATION
disable                 = no
}
_EOF_
fi

# Setting up GridWay administrator account
if [ `grep gwusers /etc/group 1>/dev/null 2>&1; echo $?` -ne 0 ]; then
 groupadd gwusers
fi
if [ `id gwadmin 1>/dev/null 2>&1; echo $?` -eq 0 ]; then
 usermod -aG gwusers gwadmin
elif [ `groups gwadmin | grep gwusers 1>/dev/null 2>&1; echo $?` -ne 0 ]; then
 useradd -g gwusers -b $INSTALL_DIR/gridway gwadmin
fi

# Setting login environment for gwusers
if [ ! -e /etc/profile.d/gridway.sh ]; then
 cat > /etc/profile.d/gridway.sh << _EOF_
#!/bin/bash
for i in \`groups\`; do
 if [ "\$i" = 'gwusers' ]; then
# Globus env
  GLOBUS_LOCATION=$INSTALL_DIR/globus/4.2.1
  GLOBUS_LD_LIBRARY_PATH=\${GLOBUS_LOCATION}/lib
# gLite env
  GLITE_LOCATION=$INSTALL_DIR/glite
  GLITE_LD_LIBRARY_PATH=\${GLITE_LOCATION}/glite/lib:\${GLITE_LOCATION}/globus/lib/:\${GLITE_LOCATION}/external/usr/lib:\${GLITE_LOCATION}/classads/lib:\${GLITE_LOCATION}/lcg/lib
# GridWay env
  GW_LOCATION=$INSTALL_DIR/gridway/5.5
  GW_LD_LIBRARY_PATH=\${GW_LOCATION}/lib
# Generic
  JAVA_HOME=$JAVA_HOME
  ANT_HOME=/usr/share/ant
# Joining all together
  PATH=\${GW_LOCATION}/bin:\${GLOBUS_LOCATION}/bin:\${PATH}:\${GLITE_LOCATION}/glite/bin:\${GLITE_LOCATION}/lcg/bin:\${PATH}
  LD_LIBRARY_PATH=\${GW_LD_LIBRARY_PATH}:\${GLITE_LD_LIBRARY_PATH}:\${GLOBUS_LD_LIBRARY_PATH}:\${LD_LIBRARY_PATH}
  export PATH LD_LIBRARY_PATH GLOBUS_LOCATION GW_LOCATION JAVA_HOME ANT_HOME
 fi
done
_EOF_
fi
# Setting ownerships
chown -R gwadmin:gwusers $INSTALL_DIR/gridway $INSTALL_DIR/globus $INSTALL_DIR/glite
chown gwadmin:root /etc/xinetd.d/gridftp /etc/profile.d/gridway.sh

# Modifying /etc/sudoers for letting gwadmin run jobs as normal gwusers users
if [ `grep GWUSERS /etc/sudoers 1>/dev/null 2>&1;echo $?` -ne 0 ]; then
 cat /etc/sudoers > /etc/sudoers.new
 cat >> /etc/sudoers.new << _EOF_
# Modifying /etc/sudoers for letting gwadmin run jobs as normal gwusers users
# Extra GridWay User alias specification
Runas_Alias GWUSERS = %gwusers
# Extra GridWay Defaults
Defaults>GWUSERS env_keep="GW_LOCATION GLOBUS_LOCATION X509_USER_PROXY"
# Extra Gridway MADs execution
gwadmin ALL=(GWUSERS) NOPASSWD: $INSTALL_DIR/gridway/5.5/bin/gw_em_mad_ws *
gwadmin ALL=(GWUSERS) NOPASSWD: $INSTALL_DIR/gridway/5.5/bin/gw_tm_mad_ftp *
gwadmin ALL=(GWUSERS) NOPASSWD: $INSTALL_DIR/gridway/5.5/bin/gw_em_mad_prews *
gwadmin ALL=(GWUSERS) NOPASSWD: $INSTALL_DIR/gridway/5.5/bin/gw_tm_mad_dummy *
gwadmin ALL=(GWUSERS) NOPASSWD: $INSTALL_DIR/globus/4.2.1/bin/grid-proxy-info *
_EOF_
fi

if [ `visudo -c -f /etc/sudoers.new 1>/dev/null 2>&1; echo $?` -eq 0 ]; then
 mv /etc/sudoers /etc/sudoers.old
 chmod 0440 /etc/sudoers.new
 mv /etc/sudoers.new /etc/sudoers
else
 mv /etc/sudoers.new /tmp/sudoers.new
 printf "ERROR: /etc/sudoers could not be created, please check the candidate /tmp/sudoers.new and the documentation\n"
fi

# Final touch, inserting the daemon into the rc.local script and launching it
if [ `grep gwadmin /etc/rc.local 1>/dev/null 2>&1; echo $?` -ne 0 ]; then
 printf "su - gwadmin sh -lc \'gwd -m\'\n" >> /etc/rc.local
fi
su - gwadmin sh -lc 'gwd -m'

