#!/bin/bash
#
# install.sh
#
# Copyright (C) 2011 Cesnet z.s.p.o
# Author(s): 	Tomas PLESNIK 	<plesnik@ics.muni.cz>
#		Jan SOUKAL	<soukal@ics.muni.cz>
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions
# are met:
# 1. Redistributions of source code must retain the above copyright
#    notice, this list of conditions and the following disclaimer.
# 2. Redistributions in binary form must reproduce the above copyright
#    notice, this list of conditions and the following disclaimer in
#    the documentation and/or other materials provided with the
#    distribution.
# 3. Neither the name of the Cesnet z.s.p.o nor the names of its
#    contributors may be used to endorse or promote products derived from
#     this software without specific prior written permission.
#
# This software is provided ``as is'', and any express or implied
# warranties, including, but not limited to, the implied warranties of
# merchantability and fitness for a particular purpose are disclaimed.
# In no event shall the Cesnet z.s.p.o or contributors be liable for
# any direct, indirect, incidental, special, exemplary, or consequential
# damages (including, but not limited to, procurement of substitute
# goods or services; loss of use, data, or profits; or business
# interruption) however caused and on any theory of liability, whether
# in contract, strict liability, or tort (including negligence or
# otherwise) arising in any way out of the use of this software, even
# if advised of the possibility of such damage.

VERSION="1.1.0"

#-------------------------------------------------------------------------------
#				FUNCTIONS
#-------------------------------------------------------------------------------
usage()
{
  echo "Usage: `basename $0` [-d <directory>] [-u <user>] [-k <ssl_key_file>] [-c <ssl_cert_file>] [-a <ssl_ca_file>] [-hV]"
  echo "-d <directory>            installation directory (default: /opt)"
  echo "-u <user>                 owner of warden client package (user for running detection scripts)"
  echo "-k <ssl_key_file>         path to SSL certificate key file"
  echo "-c <ssl_cert_file>        path to SSL certificate file"
  echo "-a <ssl_ca_file>          path to CA certificate file"
  echo "-h                        print this help"
  echo "-V                        print script version number and exit"
  echo
  echo "Example: ./`basename $0` -d /opt -u detector -k /etc/ssl/private/client.key -c /etc/ssl/certs/client.pem -a /etc/ssl/certs/tcs-ca-bundle.pem"
  echo
  echo "Note: You must be root for running this script."
  echo "      For more information about installation process, see README file (section Installation)."
  echo
  exit 0
}


version()
{
  echo "`basename ${0}` - current version is $VERSION"
  exit 0
}


err()
{
  echo "FAILED!"
  cat $err
  rm -rf $err
  echo
  echo "Installation FAILED!!!"
  exit 1
}


err_clean()
{
  echo "FAILED!"
  echo " -> Uninstalling client package ... OK"
  rm -rf $client_path > /dev/null 2>&1
  cat $err
  rm -rf $err
  echo
  echo "Installation FAILED!!!"
  exit 1
}


os_chck()
{
  OS=`uname`
  if [ "$OS" != "Linux" ]; then
    echo "Sorry, unsupported operating system detected - \"$OS\"!"
    exit 1
  fi
}


shell_chck()
{
  SHELL=`echo $SHELL`
  if [ "$SHELL" != "/bin/bash" ]; then
    echo "Sorry, this script is usable in Bourne Again Shell (bash) only!"
    exit 1
  fi
}


root_chck()
{
  if [ $UID -ne 0 ]; then
    echo "You must be root for running this script!"
    exit 1
  fi
}


params_chck()
{
  if [ -z $prefix ]; then
    prefix=/opt
    echo "Warning: parameter -d <directory> is not set - default installation directory is $prefix!"
  fi
  if [ -z $user ]; then
    echo "Parameter -u <user> is not set!"
    exit 1
  fi
  if [ -z $key ]; then
    echo "Parameter -k <ssl_key_file> is not set!"
    exit 1
  fi
  if [ -z $cert ]; then
    echo "Parameter -c <ssl_cert_file> is not set!"
    exit 1
  fi
  if [ -z $ca_file ]; then
    echo "Parameter -a <ssl_ca_file> is not set!"
    exit 1
  fi
}


perl_chck()
{
  echo -n "Checking Perl interpreter ... "
  which perl 1>/dev/null; ret_val=`echo $?`
  if [ $ret_val -eq 0 ]; then
    echo "OK"
  else
    echo "FAILED!"
    echo "Error: Perl interpreter is not installed!"
    exit 1
  fi
}


modules_chck()
{
  for module in ${modules[@]};
  do
    echo -n "Checking $module module ... "
    perl -e "use $module" 2> $err; ret_val=`echo $?`
    if [ $ret_val -eq 0 ]; then
      echo "OK"
    else
      err
    fi
  done
}


installation_dir_chck()
{
  echo -n "Checking installation directory ... "
  if [ ! -d $prefix ]; then
    echo "FAILED!"
    ls $prefix
    exit 1
  else
    echo "OK"
  fi
}


make_warden_dir()
{
  echo -n "Making warden client directory ... "
  cp -R ./warden-client $prefix 2> $err; ret_val=`echo $?`
  if [ $ret_val -eq 0 ]; then
    echo "OK"
  else
    err_clean
  fi
  cp -u CHANGELOG INSTALL LICENSE README "$client_path/doc"
}


copy_key()
{
  echo -n "Copying certificate key file ... "
  cp $key $etc 2> $err; ret_val=`echo $?`
  if [ $ret_val -eq 0 ]; then
    echo "OK"
  else
    err_clean
  fi
}


copy_cert()
{
  echo -n "Copying certificate file ... "
  cp $cert $etc 2> $err; ret_val=`echo $?`
  if [ $ret_val -eq 0 ]; then
    echo "OK"
  else
    err_clean
  fi
}


make_conf_file()
{
  echo -n "Creating configuration file ... "
echo "#
# warden-client.conf - configuration file for the warden sender/receiver client
#

#-------------------------------------------------------------------------------
# URI - URI address of Warden server
#-------------------------------------------------------------------------------
\$URI = \"https://warden.cesnet.cz:443/Warden\";

#-------------------------------------------------------------------------------
# SSL_KEY_FILE - path to client SSL certificate key file
#-------------------------------------------------------------------------------
\$SSL_KEY_FILE = \"$etc/$key_file\";

#-------------------------------------------------------------------------------
# SSL_CERT_FILE - path to client SSL certificate file
#-------------------------------------------------------------------------------
\$SSL_CERT_FILE = \"$etc/$cert_file\";

#-------------------------------------------------------------------------------
# SSL_CA_FILE - path to CA certificate file
#-------------------------------------------------------------------------------
\$SSL_CA_FILE = \"$ca_file\";
" > $conf_file 2> $err; ret_val=`echo $?`
  if [ $ret_val -eq 0 ]; then
    echo "OK"
  else
    err_clean
  fi
}


change_permissions()
{
  echo -n "Changing permissions to installed package ... "
  chown -R $user: $client_path 2>$err; ret_val=`echo $?`
  if [ $ret_val -eq 0 ]; then
    echo "OK"
  else
    err_clean
  fi
}



#-------------------------------------------------------------------------------
#				MAIN
#-------------------------------------------------------------------------------

# list of used Perl modules
modules=(SOAP::Lite IO::Socket::SSL SOAP::Transport::TCP FindBin)

# OS test
os_chck

# Shell test
shell_chck

# read input
while getopts "d:u:k:c:a:Vh" options; do
  case $options in
    d ) prefix=$OPTARG;;
    u ) user=$OPTARG;;
    k ) key=$OPTARG;;
    c ) cert=$OPTARG;;
    a ) ca_file=$OPTARG;;
    h ) usage;;
    V ) version;;
    * ) usage;;
  esac
done

# root test
root_chck

# params test
params_chck

# create variables
key_file=`basename $key`
cert_file=`basename $cert`
client_path="$prefix/warden-client"
etc="$client_path/etc"
conf_file="$etc/warden-client.conf"
err="/tmp/warden-err"

echo
echo "------------------------- Dependencies check-in -------------------------"

# Perl interpreter test
perl_chck

# Perl modules test
modules_chck


echo
echo "------------------------- Installation process --------------------------"

# check installation directory
installation_dir_chck

# make warden client directory
make_warden_dir

# copy cert key file 
copy_key

# copy cert file
copy_cert

# create conf file
make_conf_file

# change permissions
change_permissions

echo
echo "Please check configuration file in $conf_file!"
echo
echo "Installation was SUCCESSFUL!!!"

# cleanup section
rm -rf $err

exit 0