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

# This script will uninstall Cloudera and all its pieces

#==============================================
#Default Values
typeset TRAF_WORKDIR="$( cd "$( dirname "$0" )" && pwd )"
typeset TRAF_DIR="$( cd "$( dirname "$0" )" && pwd )/.."
typeset MY_NODES=""
export  PDSH="pdsh -R exec"
export  PDSH_SSH_CMD="ssh -q -n %h"
export  PDCP="pdcp -R ssh"
typeset timestamp=$(date +%F-%H-%M-%S)
typeset LOG="/var/log/trafodion/uninstall_cloudera_$timestamp.log"
sudo mkdir -p /var/log/trafodion
sudo chmod 777 /var/log/trafodion
#==============================================

function print_usage {
cat << EOF
This script will uninstall Cloudera.

Usage: $(basename $0) [options]

Options:
    --help                 Print this message and exit.
    --nodes "<node_list>"  Space separated list of nodes (within quotes)

EOF
}

#==============================================
# Parse input parameters
while [[ $# -gt 0 ]]; do
    case "$1" in
         --nodes)
             if [[ -z "$2" ]]; then
                echo "***ERROR: No value passed to param $1."
                print_usage
                exit -1
             fi
             MY_NODES=$2
             shift
             ;;
         --help)
             print_usage
             exit -1
             ;;
         *)
             echo "***ERROR: unknown parameter '$1'"
             print_usage
             exit -1
    esac
    shift
done

if [[ $MY_NODES == "" ]]; then
   echo
   echo "***ERROR: Please use --nodes option to include node list"
   echo "***ERROR: Exiting..."
   echo
   exit -1
fi


#==============================================
#Check with user if they want to preform the uninstall
echo -n "Do you want to uninstall Cloudera? (Y/N) "
read v

if [[ $v != "Y" ]] && [[ $v != "y" ]]; then
  echo "***INFO: Exiting..."
  exit
fi

node_count=$(echo $MY_NODES | wc -w)
linuxInstalled=$(grep -cr SUSE /proc/version)
#============================================

#Info for log file
echo "***INFO: Log file located at: /var/log/trafodion"

echo "***Log File: trafodion_cloudera_uninstall script***" >> $LOG
echo >> $LOG

#============================================
echo "***INFO: Uninstalling on nodes: $MY_NODES" | tee -a $LOG

#==============================================
#Run Cloudera uninstall script and stop all services

sudo /usr/share/cmf/uninstall-cloudera-manager.sh

#==============================================
#Run Cloudera uninstall script on all nodes. 

for node in $MY_NODES
do
   echo "***INFO: Uninstalling on node: $node" | tee -a $LOG
   if [ $node == $HOSTNAME ]; then
      if [[ "$linuxInstalled" == "1" ]]; then
         ./traf_cloudera_uninstall_suse | tee -a $LOG
      else
         ./traf_cloudera_uninstall | tee -a $LOG
      fi 

      if [ ${PIPESTATUS[0]} != "0" ]; then
         echo "***ERROR: Cloudera may not be completely uninstalled on $node" | tee -a $LOG
         echo "***ERROR: Review log files." | tee -a $LOG
      fi
   else
      if [[ "$linuxInstalled" -eq "1" ]]; then
  
         $PDCP -w $node -x $HOSTNAME traf_cloudera_uninstall_suse $HOME | tee -a $LOG
      else
         $PDCP -w $node -x $HOSTNAME traf_cloudera_uninstall $HOME | tee -a $LOG
      fi
      if [ ${PIPESTATUS[0]} != "0" ]; then
         echo "***ERROR: Error copying script to $node" | tee -a $LOG
         echo "***ERROR: Exiting..." | tee -a $LOG
      fi
      if [[ $linuxInstalled -eq "1" ]]; then
          $PDSH -w $node $PDSH_SSH_CMD $HOME/traf_cloudera_uninstall_suse | tee -a $LOG
      else
          $PDSH -w $node $PDSH_SSH_CMD $HOME/traf_cloudera_uninstall | tee -a $LOG
      fi

      if [ ${PIPESTATUS[0]} != "0" ]; then
         echo "***ERROR: Cloudera may not be completely uninstalled on $node" | tee -a $LOG
         echo "***ERROR: Review log files." | tee -a $LOG
      fi
   fi
done

echo "***INFO: Cloudera Manager uninstalled." | tee -a $LOG
