#!/bin/sh
#
# This script sets up the run environment for the CSN system
#
# Copyright (C) 2007 NewStep Networks Inc. All Rights Reserved
#

ME=`basename $0`
RUNDIR=$(dirname $(readlink -f $0))

VERSION=R3_6-40

TARBALL=CSN1_${VERSION}.tar.gz
TOMCATTARBALL=tomcatConf35.tar

# use csn as the default destination user
: ${DESTUSER:=csn}
TOPDIR=/home/$DESTUSER
BINDIR=$TOPDIR/bin

# these are potential file source directories
SRCDIRS="/media/cdrom /media/cdrecorder"
#SRCDIR=
THIRD=3rdparty

# set default values for db access, unless they are set already
: ${CSN_DBUSER:=csn} ${CSN_DBPASS:=csn} ${CSN_DBSERVICE:=csn} ${CSN_DBHOST:=localhost}
export CSN_DBUSER
export CSN_DBPASS
export CSN_DBSERVICE

###############################################################
# various functions
#
function verifyOS () {
echo $"Verifying your OS installation..."
echo $"-n Detecting RHEL..."
if ! grep -q "release 4" /etc/redhat-release; then
  echo $"Did not detect RedHat Enterprise Linux Release 4"
  exit 1
fi
echo $"RHEL4 detected."

echo $"Verifying installed packages:"
#myver=`rpm -q --queryformat='%{VERSION}' mysql`
myver=`rpm -q --queryformat='%{VERSION}' MySQL-server-enterprise`

ERRORS=
for p in openssh-server unixODBC
do
  if ! rpm -q --quiet $p; then
    echo $"Package $p not installed"
    ERRORS="$ERRORS $p"
  fi
done
if [ "$ERRORS" != "" ]; then
  echo $"FATAL: Required packages ($ERRORS) missing".
  exit 2
fi
}

# try to find where the source files are
function mountSrcDir () {
# first check if the dir was set by the calling process
if [ "$SRCDIR" != "" -a -d $SRCDIR/$THIRD ]; then return; fi

# check /root, directory where this script runs from and one above it
for d in /root $RUNDIR $(dirname $RUNDIR); do
  if [ -d $d/${THIRD} ]; then
    SRCDIR=$d
    return
  fi
done

# then look under standard RHEL CD mount points
for d in /media/cdrom /media/cdrecorder; do
  # if the device exists
  if grep -q $d /etc/fstab; then
    # mount it
    if ! grep -q $d /proc/mounts; then
      mount $d || continue
    fi
    if [ -d $d/${THIRD} ]; then
      SRCDIR=$d
      return
    else
      umount $d
    fi
  fi
done

echo $"WARNING: Could not locate the source directory"
echo $"installation may fail!"
SRCDIR=$RUNDIR
}

function installThirdParty () {

if [ ! -d $SRCDIR/$THIRD ]; then
  echo $"Warning: no third party directory found"
  return 1
fi

JAVA_HOME=/usr/java/jdk
JAXWS_ROOT=/opt
JAXWS_DIR=jaxws-ri
JAXWS_TARBALL=$JAXWS_DIR.tgz
JAXWS_HOME=$JAXWS_ROOT/$JAXWS_DIR

#if ! rpm -q --quiet jdk; then
  echo $"Installing JDK"
  cd $SRCDIR/$THIRD || exit 1
  rpm -Uvh jdk-6u2-linux-i586.rpm
  ln -sf /usr/java/jdk1.6.0_02 /usr/java/jdk
#else
  #echo $"JDK already installed"
#fi

if [ ! -f /etc/profile.d/jdk.sh ]; then
  echo $"Setting up JDK environment"
  cat >/etc/profile.d/jdk.sh <<EOF
PATH=\$PATH:${JAVA_HOME}/bin
JAVA_HOME=${JAVA_HOME}
JAXWS_HOME=${JAXWS_HOME}
export PATH JAVA_HOME JAXWS_HOME
EOF
  cat >/etc/profile.d/jdk.csh <<EOF
set path = ( \$path ${JAVA_HOME}/bin )
setenv JAVA_HOME ${JAVA_HOME}
setenv JAXWS_HOME ${JAXWS_HOME}
EOF
  chmod +x /etc/profile.d/jdk*

  # set the path for the current shell too
  PATH=$PATH:${JAVA_HOME}/bin
  export PATH JAVA_HOME
fi

echo $"installing jax-ws"
cd $JAXWS_ROOT
tar zxf $SRCDIR/$THIRD/$JAXWS_TARBALL

mkdir -p $JAVA_HOME/jre/lib/endorsed
for f in jaxb-api.jar jaxws-api.jar jsr173_api.jar saaj-api.jar jsr181-api.jar jsr250-api.jar
do
  ln -s $JAXWS_HOME/lib/$f $JAVA_HOME/jre/lib/endorsed
done

for f in wsgen wsimport
do
  # backup only if bkup not already there
  [ -e $JAVA_HOME/bin/$f.old ] || mv $JAVA_HOME/bin/$f $JAVA_HOME/bin/$f.old
  ln -s $JAXWS_HOME/bin/$f.sh $JAVA_HOME/bin/$f
done

#MY_SERVER=mysql-server
#MY_PACKAGES="mysql-5* mysqlclient* mysql-server*"
MY_SERVER=MySQL-server-enterprise
MY_PACKAGES="MySQL-s* MySQL-client*"
#if ! rpm -q --quiet $MY_SERVER; then
  echo $"installing mysql..."
  cd $SRCDIR/$THIRD || exit 1
  # first import mysql gpg key if needed
  rpm -q --quiet gpg-pubkey-5072e1f5 || rpm --import mysql.asc
  rpm -Uvh --aid $MY_PACKAGES

#else
  #echo $"mysql already installed"
#fi

[ -e /etc/my.cnf ] || echo "[mysqld]" >/etc/my.cnf
if ! grep lower_case_table_names /etc/my.cnf; then
  ed -s /etc/my.cnf <<EOF
/\[mysqld\]
a
lower_case_table_names=1
default-storage-engine=innodb
socket=/var/lib/mysql/mysql.sock
old_passwords=1
.
w
q
EOF
MYSQL_RESTART=Y
fi
# Enable and start mysql server
#mysvcname=mysqld
mysvcname=mysql
/sbin/chkconfig $mysvcname on
if pgrep mysqld >/dev/null; then
  /sbin/service $mysvcname restart
else
  /sbin/service $mysvcname start
fi

echo $"Checking for mysql timezone data..."
if [ $(mysql -Bse 'select count(*) from mysql.time_zone_name') -eq 0 ]; then
  mysql_tzinfo_to_sql /usr/share/zoneinfo/ 2>/dev/null | mysql -u root mysql
else
  echo $"Already populated."
fi

JAR_HOME=/usr/share/java
#myodbc=mysql-connector-odbc
myodbc=mysql-connector-odbc-commercial
#myjava=mysql-connector-java-5.0.4-bin.jar
myjava=mysql-connector-java-commercial-5.0.7-bin.jar
myjavalink=mysql-connector-java.jar
#if ! rpm -q --quiet $myodbc; then
  echo $"installing odbc and jdbc drivers..."
  cd $SRCDIR/$THIRD || exit 1
  rpm -Uvh $myodbc*.rpm
  cp $myjava $JAR_HOME
  ln -s $myjava $JAR_HOME/$myjavalink
  [ -e odbc.ini ] && cp odbc.ini /etc/odbc.ini
#else
  #echo $"mysql connector already installed"
#fi

# install 3rd party jars
cd $JAR_HOME
for jar in asn1rt.jar  jtapi.jar
do
  echo $"installing $jar"
  if [ ! -e $jar ]; then
    cp $SRCDIR/$THIRD/$jar .
  else
    echo $"$jar already installed"
  fi
done

cd /opt
if [ ! -L apache-tomcat ]; then
  echo $"installing tomcat..."
  tar zxf $SRCDIR/$THIRD/apache-tomcat-5.5.20.tar.gz
  ln -s apache-tomcat-5.5.20 apache-tomcat
  chown -R csn:csn apache-tomcat/logs
  chmod -R og+rx apache-tomcat-5.5.20/conf
  ln -s $JAR_HOME/$myjavalink apache-tomcat/common/lib

  # jaxws links in tomcat
  CATALINA_HOME=/opt/apache-tomcat-5.5.20
  mkdir -p $CATALINA_HOME/common/endorsed
  ln -s $JAXWS_HOME/lib/jaxb-api.jar   $CATALINA_HOME/common/endorsed
  ln -s $JAXWS_HOME/lib/jaxws-api.jar  $CATALINA_HOME/common/endorsed
  ln -s $JAXWS_HOME/lib/jsr173_api.jar $CATALINA_HOME/common/endorsed
  ln -s $JAXWS_HOME/lib/jsr181-api.jar $CATALINA_HOME/common/endorsed
  ln -s $JAXWS_HOME/lib/jsr250-api.jar $CATALINA_HOME/common/endorsed
  ln -s $JAXWS_HOME/lib/saaj-api.jar   $CATALINA_HOME/common/endorsed
else
  echo $"apache tomcat already installed"
fi

if [ ! -d xalan-j_2_7_0 ]; then
  echo $"installing xalan-j..."
  tar zxf $SRCDIR/$THIRD/xalan-j_2_7_0-bin.tar.gz
  ln -s /opt/xalan-j_2_7_0/xalan.jar apache-tomcat/common/lib
else
  echo $"xalan already installed"
fi

if [ ! -d xerces-2_9_0 ]; then
  echo $"installing xerces..."
  tar zxf $SRCDIR/$THIRD/Xerces-J-bin.2.9.0.tar.gz
  ln -s /opt/xerces-2_9_0/xercesImpl.jar apache-tomcat/common/lib/xerces.jar
else
  echo $"xerces already installed"
fi

if [ ! -d jdmk ]; then
  echo $"installing jdmk..."
  tar zxf $SRCDIR/$THIRD/jdmk.tgz
fi

if [ ! -d apache-commons ]; then
  echo $"installing apache commons..."
  tar zxf $SRCDIR/$THIRD/apache-commons.tgz
fi
}

function copyFiles () {
echo $"Copying CSN installation files.."
SCRIPTS="
csn_install_linux.sh
"
for f in $SCRIPTS $TARBALL $TOMCATTARBALL; do
  # RUNDIR is a better place to use than SRCDIR when installing from tarball
  # (media may be in the drive and SRCDIR will point to the media, while
  #  we are trying to install a tarball from a local directory)
  # and when installing from cdrom it makes no difference
  cp $RUNDIR/$f $TOPDIR
done
}

function Main () {

# pre installation tasks
verifyOS
mountSrcDir
installThirdParty

UPGRADE=N
echo $"Checking for previous installations"
CONF=$(mysql -Bse 'SELECT schema_name FROM information_schema.schemata WHERE schema_name="csn"')
if [ ! -z $CONF ]; then
  echo $"Previous installation detected - performing an upgrade"
  UPGRADE=Y
  $TOPDIR/bin/csn_uninstall.sh -k
fi

cd $TOPDIR
[ -e $TARBALL ] || copyFiles

# unpack the tarball, ensure ownership
echo $"Unpacking the tarball.."
tar zxf $TARBALL

# update /etc/services if needed
grep -q csnJtapi /etc/services || cat $TOPDIR/services >>/etc/services

for f in csn_functions.sh csn_setup_network; do
  cp $BINDIR/$f /usr/sbin
done

# install console
echo $"setting up the console..."
export CATALINA_BASE=$TOPDIR/tomcat-conf
tar xf $TOMCATTARBALL && rm $TOMCATTARBALL

for webApp in console-sp console-config csnprovisioning
do
  rm -rf $CATALINA_BASE/webapps/$webApp
  mkdir -p $CATALINA_BASE/webapps/$webApp
  cd $CATALINA_BASE/webapps/$webApp
  jar xf $TOPDIR/lib/$webApp.war
done
# remove old, unpacked csnprovisioning-docs if it exists
rm -rf $CATALINA_BASE/webapps/csnprovisioning-docs
cp $TOPDIR/lib/csnprovisioning-docs.war $CATALINA_BASE/webapps
# wipe out cache
rm -fr $CATALINA_BASE/work/Catalina/localhost


for webApp in console-config
do
  cd $CATALINA_BASE/webapps/$webApp/WEB-INF/classes
  cp mseconsole.properties mseconsole.properties.saved
  cp csn1console.properties mseconsole.properties
done

mkdir -p $CATALINA_BASE/logs
mkdir -p $CATALINA_BASE/shared/lib


ln -s $JAXWS_HOME/lib/FastInfoset.jar   $CATALINA_BASE/shared/lib
ln -s $JAXWS_HOME/lib/http.jar          $CATALINA_BASE/shared/lib
ln -s $JAXWS_HOME/lib/jaxb-xjc.jar      $CATALINA_BASE/shared/lib
ln -s $JAXWS_HOME/lib/resolver.jar      $CATALINA_BASE/shared/lib
ln -s $JAXWS_HOME/lib/sjsxp.jar         $CATALINA_BASE/shared/lib
ln -s $JAXWS_HOME/lib/streambuffer.jar  $CATALINA_BASE/shared/lib
ln -s $JAXWS_HOME/lib/activation.jar    $CATALINA_BASE/shared/lib
ln -s $JAXWS_HOME/lib/jaxb-impl.jar     $CATALINA_BASE/shared/lib
ln -s $JAXWS_HOME/lib/jaxws-rt.jar      $CATALINA_BASE/shared/lib
ln -s $JAXWS_HOME/lib/saaj-impl.jar     $CATALINA_BASE/shared/lib
ln -s $JAXWS_HOME/lib/stax-ex.jar       $CATALINA_BASE/shared/lib

if [ -e $TOPDIR/bin/odbc.ini ]; then
  echo $"Setting up odbc configuration..."
  cp $TOPDIR/bin/odbc.ini /etc
fi

# setup the database
echo $"Initializing the database..."
if [ $UPGRADE = N ]; then
  (cd $TOPDIR/db/mysql/admin/ && ./create_all_dbs.sh)
else
  (cd $TOPDIR/db/mysql/csn/delta && ./apply_deltas.sh -D)
fi

for f in csn_dbbackup csn_dbrestore csn_dbfunc getcdr.sh
do
  cp $TOPDIR/db/mysql/$f $BINDIR
done

# make var dir in case it does not exist
mkdir -p $TOPDIR/var

# ensure proper ownership
chown -R ${DESTUSER}:${DESTUSER} $TOPDIR
grep -q run_env $TOPDIR/.bash_profile || echo "source $TOPDIR/run_env" >>$TOPDIR/.bash_profile

# setting up automatic startup
echo $"setting up automatic startup..."
cp $BINDIR/csn.init /etc/init.d/csn
/sbin/chkconfig --add csn

# setting up automatic CDR cleanup and log rotation
chmod +x $BINDIR/cdr_expunge.sh $BINDIR/csn_log_rotate.sh $TOPDIR/db/mysql/dailycdr-wrapper.sh
$BINDIR/csn_setup_cron.sh ${DESTUSER}
}

#####################################################################
#
# SCRIPT STARTS HERE
#

if [ `id -un` != root ]; then
  echo $"You must run this installation program as root."
  exit 2
fi

if ! grep -q "^${DESTUSER}:" /etc/passwd; then
  echo $"Destination user $DESTUSER does not exist."
  echo $"Adding user $DESTUSER - default password: csn"
  /usr/sbin/adduser -p '$1$G0Gc8i2e$.O/wRBNY160Jfg8QQtbQu1' -c "CSN User" $DESTUSER
fi

if [ ! -d $TOPDIR ]; then
  echo $"Destination directory $TOPDIR does not exist; making it..."
  mkdir -p $TOPDIR
  chown -R $DESTUSER:$DESTUSER $TOPDIR
fi

LOGFILE="$TOPDIR/install-`date +%Y%m%d-%H%M%S`"
touch "$LOGFILE"
echo $"operation log is going into $LOGFILE"
sleep 1

Main 2>&1 | tee "$LOGFILE"


# vim:sw=2
