#!/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 @@@
#

source /etc/trafodion/trafodion_config
TRAF_CONFIG=/etc/trafodion/trafodion_config


if [[ $HADOOP_TYPE == "cloudera" ]]; then
   if [ -d /opt/cloudera/parcels/CDH ]; then
      export HADOOP_PATH="/opt/cloudera/parcels/CDH/lib/hbase/lib"
      export HADOOP_BIN_PATH="/opt/cloudera/parcels/CDH/bin"
   else
      export HADOOP_PATH="/usr/lib/hbase/lib"
      export HADOOP_BIN_PATH="/usr/bin"
   fi

   echo "***INFO: HADOOP_PATH=$HADOOP_PATH"
   echo "***INFO: HADOOP_BIN_PATH=$HADOOP_BIN_PATH"
fi

MY_HBASE_NODES=""
MY_HDFS_NODES=""

if [[ -z $HBASE_NODES ]]; then
   echo "***ERROR: List of $HADOOP_TYPE HBase nodes not found."
   exit -1
fi

for node in $HBASE_NODES
do
   MY_HBASE_NODES="$MY_HBASE_NODES -w $node"
done

if [[ -z $HDFS_NODES ]]; then
   echo "***ERROR: List of $HADOOP_TYPE HBase nodes not found."
   exit -1
fi
   
for node in $HDFS_NODES
do
   MY_HDFS_NODES="$MY_HDFS_NODES -w $node"
done

   
MY_HADOOP_NODES=""

if [[ -z $HADOOP_NODES ]]; then
   echo "***ERROR: List of $HADOOP_TYPE nodes not found."
   exit -1
fi


for node in $HADOOP_NODES
do
   MY_HADOOP_NODES="$MY_HADOOP_NODES -w $node"
done


echo "***INFO: $HADOOP_TYPE list of nodes: $HADOOP_NODES"
echo "***INFO: $HADOOP_TYPE list of HDFS nodes: $HDFS_NODES"
echo "***INFO: $HADOOP_TYPE list of HBASE nodes: $HBASE_NODES"



hadoop_node_count=$(echo $HADOOP_NODES | wc -w)

sudo chmod 777 $TRAF_CONFIG
sed -i '/HADOOP_NODES\=/d' $TRAF_CONFIG
echo "export HADOOP_NODES=\"$HADOOP_NODES\"" >> $TRAF_CONFIG
sudo chmod 777 $TRAF_CONFIG
sed -i '/MY_HADOOP_NODES\=/d' $TRAF_CONFIG
echo "export MY_HADOOP_NODES=\"$MY_HADOOP_NODES\"" >> $TRAF_CONFIG
sudo chmod 777 $TRAF_CONFIG
sed -i '/HDFS_NODES\=/d' $TRAF_CONFIG
echo "export HDFS_NODES=\"$HDFS_NODES\"" >> $TRAF_CONFIG
sudo chmod 777 $TRAF_CONFIG
sed -i '/MY_HDFS_NODES\=/d' $TRAF_CONFIG
echo "export MY_HDFS_NODES=\"$MY_HDFS_NODES\"" >> $TRAF_CONFIG
sudo chmod 777 $TRAF_CONFIG
sed -i '/HBASE_NODES\=/d' $TRAF_CONFIG
echo "export HBASE_NODES=\"$HBASE_NODES\"" >> $TRAF_CONFIG
sudo chmod 777 $TRAF_CONFIG
sed -i '/MY_HBASE_NODES\=/d' $TRAF_CONFIG
echo "export MY_HBASE_NODES=\"$MY_HBASE_NODES\"" >> $TRAF_CONFIG
sudo chmod 777 $TRAF_CONFIG
sed -i '/HADOOP_PATH\=/d' $TRAF_CONFIG
echo "export HADOOP_PATH=\"$HADOOP_PATH\"" >> $TRAF_CONFIG
sudo chmod 777 $TRAF_CONFIG
sed -i '/HADOOP_BIN_PATH\=/d' $TRAF_CONFIG
echo "export HADOOP_BIN_PATH=\"$HADOOP_BIN_PATH\"" >> $TRAF_CONFIG
sudo chmod 777 $TRAF_CONFIG
sed -i '/hadoop_node_count\=/d' $TRAF_CONFIG
echo "export hadoop_node_count=\"$hadoop_node_count\"" >> $TRAF_CONFIG

for node in $HADOOP_NODES
do
   ssh -q -n $node echo "***INFO: Testing ssh on $node"
   if [[ $? -ne "0" ]]; then
      errorFound=1
      ERROR_NODES="$ERROR_NODES $node"
   fi
done

if [[ $errorFound == "1" ]]; then
   echo "***ERROR: Could not ssh to $ERROR_NODES."
   echo "***ERROR: Check permissions and known hosts files."
   exit -1
fi

for node in $HADOOP_NODES
do
   ssh -q -n $node sudo echo "***INFO: Testing sudo access on $node"
   if [ $? -ne "0" ]; then
      error=1
      ERROR_NODES="$ERROR_NODES $newNode"
   fi
done

if [[ $error == "1" ]]; then
   echo "***ERROR: $ERROR_NODES does not have sudo access."
   echo "***ERROR: Must have sudo access on all nodes."
   exit -1
fi


