#!/bin/bash

# @@@ START COPYRIGHT @@@
#
# Licensed to the Apache Software Foundation (ASF) under one
# or more contributor license agreements.  See the NOTICE file
# distributed with this work for additional information
# regarding copyright ownership.  The ASF licenses this file
# to you under the Apache License, Version 2.0 (the
# "License"); you may not use this file except in compliance
# with the License.  You may obtain a copy of the License at
#
#   http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing,
# software distributed under the License is distributed on an
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
# KIND, either express or implied.  See the License for the
# specific language governing permissions and limitations
# under the License.
#
# @@@ END COPYRIGHT @@@

#==========================================
#  Install DCS on a Trafodion cluster
#==========================================

export TRAF_CONFIG="/etc/trafodion/trafodion_config"

function print_usage {
cat << EOF
This script will install/configure the specified DCS build.
While this script can be run manually, it is normally
executed from the Trafodion installer.

Usage: $(basename $0) [options]

Options:
    --help                    Print this message and exit.
    --dcs_build <file>        Path to the DCS build tar file.
    --dcs_install_path <dir>  Path to the install directory. (defaults to $TRAF_HOME)
    --dcs_servers <count>     Total number of DCS servers to start.  These
                              will be allocated in a round-robin fashion on
                              all nodes. (default, 1 per node)
EOF
}

# check that required options have values
function checkOpts {
    PARAMCHECK=0
    MESSAGE=""
    for PARAM in $REQUIRED_OPTIONS; do
        VALUE=$(eval echo \$$PARAM)
        if [[ -z "$VALUE" ]]; then
            MESSAGE="***ERROR: Parameter $PARAM has no value. $MESSAGE"
            PARAMCHECK=1
        fi
    done
    if [[ $PARAMCHECK -ne 0 ]]; then
        echo "$MESSAGE"
        exit -1
    fi
}


# Default parameters
typeset DCS_BUILD_FILE=""
typeset DCS_INSTALL_PATH="$TRAF_HOME"
typeset DCS_SERVER_COUNT=""

# Parse input parameters
while [[ $# -gt 0 ]]; do
    case "$1" in
        --dcs_build)
            if [[ -z "$2" ]]; then
                echo "***ERROR: No value passed to param $1."
                print_usage
                exit -1
            fi
            DCS_BUILD_FILE=$2
            shift
            ;;
        --dcs_install_path)
            if [[ -z "$2" ]]; then
                echo "***ERROR: No value passed to param $1."
                print_usage
                exit -1
            fi
            DCS_INSTALL_PATH=$2
            shift
            ;;
        --dcs_servers)
            if [[ -z "$2" ]]; then
                echo "***ERROR: No value passed to param $1."
                print_usage
                exit -1
            fi
            DCS_SERVER_COUNT=$2
            shift
            ;;
        --help)
            print_usage
            ;;
        *)
            print_usage
            exit -1
  esac
  shift
done

checkOpts
source $TRAF_CONFIG
echo "***INFO: Start of DCS install"

# Make sure required env vars have been set first
if [[ -z "$TRAF_HOME" ]]; then
    echo "***ERROR: environment variable TRAF_HOME has no value."
    exit -1
fi
if [[ -z "$NODE_LIST" ]]; then
    echo "***ERROR: environment variable NODE_LIST has no value."
    exit -1
fi

if [ -z $DCS_SERVER_COUNT ]; then
    DCS_SERVER_COUNT=$node_count
fi

# create install directory
mkdir -p $DCS_INSTALL_PATH
cd $DCS_INSTALL_PATH

DCS_DIR=$(ls $TRAF_HOME | grep dcs)
DCS_DIR=$TRAF_HOME/$DCS_DIR
echo "***INFO: DCS Install Directory: $DCS_DIR"

cd $DCS_DIR/conf


echo "***INFO: modifying $DCS_DIR/conf/dcs-site.xml"

# add zookeeper quorum property to end of configuration
rm dcs-site.temp 2>/dev/null
cat dcs-site.xml | sed -e "s@</configuration>@  <property>\n    <name>dcs.zookeeper.property.clientPort</name>\n    <value>$ZOOKEEPER_PORT</value>\n  </property>\n </configuration>@" > dcs-site.temp
cp dcs-site.temp dcs-site.xml
rm dcs-site.temp 2>/dev/null

cat dcs-site.xml | sed -e "s@</configuration>@  <property>\n    <name>dcs.zookeeper.quorum</name>\n    <value>$ZOOKEEPER_NODES</value>\n  </property>\n </configuration>@" > dcs-site.temp
cp dcs-site.temp dcs-site.xml
rm dcs-site.temp 2>/dev/null

# get external network interface
EXTERNAL_NETWORK=$(netstat -rn | grep "^0.0.0.0" | awk '{print $8}')
if [ -z "$EXTERNAL_NETWORK" ]; then
   echo "***ERROR: Unable to determine external network interface"
   exit -1;
fi

# add network interface property to end of configuration
rm dcs-site.temp 2>/dev/null
cat dcs-site.xml | sed -e "s@</configuration>@  <property>\n    <name>dcs.dns.interface</name>\n    <value>$EXTERNAL_NETWORK</value>\n  </property>\n</configuration>@" > dcs-site.temp
cp dcs-site.temp dcs-site.xml
rm dcs-site.temp 2>/dev/null

#Configure the dcs primary node
echo $DCS_PRIMARY_MASTER_NODE > $DCS_DIR/conf/master


if [[ "$ENABLE_HA" == "true" ]]; then
   ######Configure dcs-site.xml file
   rm dcs-site.temp 2>/dev/null
   cat dcs-site.xml | sed -e "s@</configuration>@  <property>\n    <name>dcs.master.floating.ip</name>\n    <value>true</value>\n  </property>\n</configuration>@" > dcs-site.temp
   cp dcs-site.temp dcs-site.xml
   rm dcs-site.temp 2>/dev/null

   rm dcs-site.temp 2>/dev/null
   cat dcs-site.xml | sed -e "s@</configuration>@  <property>\n    <name>dcs.master.floating.ip.external.interface</name>\n    <value>$INTERFACE</value>\n  </property>\n</configuration>@" > dcs-site.temp
   cp dcs-site.temp dcs-site.xml
   rm dcs-site.temp 2>/dev/null

   rm dcs-site.temp 2>/dev/null
   cat dcs-site.xml | sed -e "s@</configuration>@  <property>\n    <name>dcs.master.floating.ip.external.ip.address</name>\n    <value>$FLOATING_IP</value>\n  </property>\n</configuration>@" > dcs-site.temp
   cp dcs-site.temp dcs-site.xml
   rm dcs-site.temp 2>/dev/null
   
   ######Configure the backup masters file
   echo "***INFO: modifying $DCS_DIR/conf/backup-masters file"
   
   for node in $BACKUP_DCS_NODES
   do
       echo $node >> $DCS_DIR/conf/backup-masters
   done
  
   ######Configure dcs-env.sh
   sed -i -e "s@DCS_MASTER_FLOATING_IP=.*\$@DCS_MASTER_FLOATING_IP=$FLOATING_IP@" dcs-env.sh

fi


echo "***INFO: creating $DCS_DIR/conf/servers file"
rm servers 2>/dev/null
let per_node=$DCS_SERVER_COUNT/$node_count
let extras=$DCS_SERVER_COUNT%$node_count
count=1
for node_name in $NODE_LIST
do
    if [ $count -le $extras ]; then
       let node_servers=$per_node+1
    else
       node_servers=$per_node
    fi
    echo $node_name $node_servers >> servers
    (( count++ ))
done



echo "***INFO: End of DCS install."

