#!/usr/bin/env bash
#
#/**
# * 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.
# */
#
# cleans hbase related data from zookeeper and hdfs if no hbase process is alive.
#
# Environment Variables
#
#   HBASE_REGIONSERVERS    File naming remote hosts.
#     Default is ${HADOOP_CONF_DIR}/regionservers
#   HADOOP_CONF_DIR  Alternate conf dir. Default is ${HADOOP_HOME}/conf.
#   HBASE_CONF_DIR  Alternate hbase conf dir. Default is ${HBASE_HOME}/conf.
#   HBASE_SLAVE_SLEEP Seconds to sleep between spawning remote commands.
#   HBASE_SLAVE_TIMEOUT Seconds to wait for timing out a remote command.
#   HBASE_SSH_OPTS Options passed to ssh when running remote commands.
#

usage="Usage: hbase-cleanup.sh (--cleanZk|--cleanHdfs|--cleanAll|--cleanAcls)"

bin=`dirname "$0"`
bin=`cd "$bin">/dev/null; pwd`

# This will set HBASE_HOME, etc.
. "$bin"/hbase-config.sh

case $1 in
  --cleanZk|--cleanHdfs|--cleanAll|--cleanAcls)
    matches="yes" ;;
  *) ;;
esac
if [ $# -ne 1 -o "$matches" = "" ]; then
  echo $usage
  exit 1;
fi

format_option=$1;

zparent=`$bin/hbase org.apache.hadoop.hbase.util.HBaseConfTool zookeeper.znode.parent`
if [ "$zparent" == "null" ]; then zparent="/hbase"; fi

hrootdir=`$bin/hbase org.apache.hadoop.hbase.util.HBaseConfTool hbase.rootdir`
if [ "$hrootdir" == "null" ]; then hrootdir="file:///tmp/hbase-${USER}/hbase"; fi

hbasewaldir=`$bin/hbase org.apache.hadoop.hbase.util.HBaseConfTool hbase.wal.dir`

check_for_znodes() {
  command=$1;
  case $command in
    regionservers)
      zchild=`$bin/hbase org.apache.hadoop.hbase.util.HBaseConfTool zookeeper.znode.rs`
      if [ "$zchild" == "null" ]; then zchild="rs"; fi
      ;;
    backupmasters)
      zchild=`$bin/hbase org.apache.hadoop.hbase.util.HBaseConfTool zookeeper.znode.backup.masters`
      if [ "$zchild" == "null" ]; then zchild="backup-masters"; fi
      ;;
  esac
  znodes=`"$bin"/hbase zkcli ls $zparent/$zchild 2>&1 | tail -1 | sed "s/\[//" | sed "s/\]//"`
  if [ "$znodes" != "" ]; then
    echo -n "ZNode(s) [${znodes}] of $command are not expired. Exiting without cleaning hbase data."
    echo #force a newline
    exit 1;
  else
    echo -n "All ZNode(s) of $command are expired."
  fi
  echo #force a newline
}

execute_zk_command() {
  command=$1;
  "$bin"/hbase zkcli $command 2>&1
}

execute_hdfs_command() {
  command=$1;
  "$bin"/hbase org.apache.hadoop.fs.FsShell $command 2>&1
}

execute_clean_acls() {
  command=$1;
  "$bin"/hbase org.apache.hadoop.hbase.zookeeper.ZkAclReset $command 2>&1
}

clean_up() {
  case $1 in
  --cleanZk)
    execute_zk_command "rmr ${zparent}";
    ;;
  --cleanHdfs)
    execute_hdfs_command "-rm -R ${hrootdir}"
    if [ "${hbasewaldir}" != "null" ]; then
      execute_hdfs_command "-rm -R ${hbasewaldir}"
    fi
    ;;
  --cleanAll)
    execute_zk_command "rmr ${zparent}";
    execute_hdfs_command "-rm -R ${hrootdir}"
    if [ "${hbasewaldir}" != "null" ]; then
      execute_hdfs_command "-rm -R ${hbasewaldir}"
    fi
    ;;
  --cleanAcls)
    execute_clean_acls;
    ;;
  *)
    ;;
  esac
}

check_znode_exists() {
  command=$1
  "$bin"/hbase zkcli stat $command 2>&1 | grep "Node does not exist\|Connection refused"
}

check_znode_exists $zparent
if [ $? -ne 0 ]; then
  # make sure the online region server(s) znode(s) have been deleted before continuing
  check_for_znodes regionservers
  # make sure the backup master(s) znode(s) has been deleted before continuing
  check_for_znodes backupmasters
  # make sure the master znode has been deleted before continuing
  zmaster=`$bin/hbase org.apache.hadoop.hbase.util.HBaseConfTool zookeeper.znode.master`
  if [ "$zmaster" == "null" ]; then zmaster="master"; fi
    zmaster=$zparent/$zmaster
    check_znode_exists $zmaster
  if [ $? -ne 0 ]; then
    echo -n "Master ZNode is not expired. Exiting without cleaning hbase data."
    echo #force a new line
    exit 1
  else
    echo "Active Master ZNode also expired."
  fi
  echo #force a newline
else
  echo "HBase parent znode ${zparent} does not exist."
fi

# cleans zookeeper and/or hdfs data.
clean_up $format_option
