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


# The Chukwa command script
#
# Environment Variables
#
#   JAVA_HOME        The java implementation to use.  Overrides JAVA_HOME.
#   CHUKWA_CONF_DIR  Alternate conf dir.  Default is ${CHUKWA_HOME}/conf.
#

bin=`dirname "$0"`
bin=`cd "$bin"; pwd`

. "$bin"/../libexec/chukwa-config.sh

# if no args specified, show usage
if [ $# = 0 ]; then
  echo "Usage: chukwa [--config confdir] COMMAND"
  echo "where COMMAND is one of:"
  echo "  agent         run a Chukwa Agent"
  echo "  archive       run the Archive Manager"
  echo "  collector     run a Chukwa Collector"
  echo "  demux         run the Demux Manager"
  echo "  dp            run the Post Demux data processors"
  echo "  hicc          run a HICC Webserver"
  echo "  droll         run a daily rolling job (deprecated)"
  echo "  hroll         run a hourly rolling job (deprecated)"
  # Daily rolling and hourly rolling will be deprecated by retention processor
  # echo "  retention     run the Retention Processor"
  echo "  version       print the version"
  echo "Utilities:"
  echo "  backfill      run a back fill data loader utility"
  echo "  dumpArchive   view an archive file"
  echo "  dumpRecord    view a record file"
  echo "  tail          start tailing a file"
  echo "Most command print help when invoked w/o parameters."
  exit 1
fi

# get arguments
COMMAND=$1
shift

if [ -f "${CHUKWA_CONF_DIR}/chukwa-env.sh" ]; then
  . "${CHUKWA_CONF_DIR}/chukwa-env.sh"
fi

# Java parameters
if [ "$JAVA_HOME" != "" ]; then
  JAVA_HOME=$JAVA_HOME
fi

if [ "$JAVA_HOME" = "" ]; then
  echo "Error: JAVA_HOME is not set."
  exit 1
fi

if [ "$HADOOP_CONF_DIR" != "" ]; then
  CLASSPATH=${HADOOP_CONF_DIR}:${CLASSPATH}
fi

if [ "$CHUKWA_HICC_PORT" != "" ]; then
  CHUKWA_HICC_PORT=$CHUKWA_HICC_PORT
fi

if [ "$CHUKWA_HICC_PORT" = "" ]; then
  CHUKWA_HICC_PORT=4080
fi

BACKGROUND="true"

# configure command parameters
if [ "$COMMAND" = "agent" ]; then
  APP='agent'
  CLASS='org.apache.hadoop.chukwa.datacollection.agent.ChukwaAgent'
  PID="Agent"
elif [ "$COMMAND" = "archive" ]; then
  APP='archive'
  CLASS='org.apache.hadoop.chukwa.extraction.archive.ChukwaArchiveManager'
  PID='ArchiveManager'
elif [ "$COMMAND" = "collector" ]; then
  APP='collector'
  CLASS='org.apache.hadoop.chukwa.datacollection.collector.CollectorStub'
  PID="Collector"
elif [ "$COMMAND" = "dp" ]; then
  APP='postprocess'
  CLASS='org.apache.hadoop.chukwa.extraction.demux.PostProcessorManager'
  PID='PostProcessorManager'
elif [ "$COMMAND" = "demux" ]; then
  APP='Demux'
  CLASS='org.apache.hadoop.chukwa.extraction.demux.DemuxManager'
  PID='DemuxManager'
elif [ "$COMMAND" = "hicc" ]; then
  WEB_SERVICE_COMMON=`ls ${CHUKWA_HOME}/share/chukwa/webapps/hicc.war`
  APP='hicc'
  CLASS='org.apache.hadoop.chukwa.hicc.HiccWebServer'
  CLASSPATH=${CLASSPATH}:${WEB_SERVICE_COMMON}:${HICC_JAR}
  PID="hicc"
  HOST=`hostname`
  JAVA_OPT="${JAVA_OPT} -Djetty.host=${HOST} -Djetty.port=${CHUKWA_HICC_PORT} -Djava.net.preferIPv4Stack=true"
elif [ "$COMMAND" = "hroll" ]; then
  APP='hroll'
  CLASS='org.apache.hadoop.chukwa.extraction.demux.HourlyChukwaRecordRolling'
  OPTS='rollInSequence true deleteRawdata true'
  PID='HourlyChukwaRecordRolling'
elif [ "$COMMAND" = "droll" ]; then
  APP='droll'
  CLASS='org.apache.hadoop.chukwa.extraction.demux.DailyChukwaRecordRolling'
  OPTS='rollInSequence true deleteRawdata true'
  PID='DailyChukwaRecordRolling'
elif [ "$COMMAND" = "version" ]; then
  echo `cat ${CHUKWA_HOME}/bin/VERSION`
  exit 0
elif [ "$COMMAND" = "backfill" ]; then
  APP='backfill'
  CLASS='org.apache.hadoop.chukwa.tools.backfilling.BackfillingLoader'
elif [ "$COMMAND" = "dumpArchive" ]; then
  APP='DumpArchive'
  CLASS='org.apache.hadoop.chukwa.util.DumpArchive'
  BACKGROUND="false"
elif [ "$COMMAND" = "dumpRecord" ]; then
  APP='DumpRecord'
  CLASS='org.apache.hadoop.chukwa.util.DumpRecord'
  BACKGROUND="false"
elif [ "$COMMAND" = "dumpChunk" ]; then
  APP='DumpChunk'
  CLASS='org.apache.hadoop.chukwa.util.DumpChunks'
  BACKGROUND="false"
elif [ "$COMMAND" = "tail" ]; then
  if [ $# = 0 -o $# -gt 2 ]; then
    echo "usage: startWatchingFile <filename> [datatype]"
    exit 1
  fi

  filename=$1

  if [ $# -ge 2 ]; then
    datatype=$2
  else
    datatype=raw
  fi
  echo "tailing $datatype: $filename"
  echo "add org.apache.hadoop.chukwa.datacollection.adaptor.filetailer.CharFileTailingAdaptorUTF8  $datatype 0  $filename  0" | nc localhost 9093
  exit 0
fi

if [ "$1" = "stop" ]; then
  kill -TERM `cat ${CHUKWA_PID_DIR}/$PID.pid`
else 
  # run command
  if [ "$BACKGROUND" = "false" ]; then
    ${JAVA_HOME}/bin/java ${JAVA_OPT} -Djava.library.path=${JAVA_LIBRARY_PATH} -DCHUKWA_HOME=${CHUKWA_HOME} -DCHUKWA_CONF_DIR=${CHUKWA_CONF_DIR} -DCHUKWA_LOG_DIR=${CHUKWA_LOG_DIR} -DCHUKWA_DATA_DIR=${CHUKWA_DATA_DIR} -DAPP=${APP} -Dlog4j.configuration=chukwa-log4j.properties -classpath ${CHUKWA_CONF_DIR}:${CLASSPATH}:${CHUKWA_CLASSPATH}:${tools} ${CLASS} $OPTS $@
  else
    exec ${JAVA_HOME}/bin/java ${JAVA_OPT} -Djava.library.path=${JAVA_LIBRARY_PATH} -DCHUKWA_HOME=${CHUKWA_HOME} -DCHUKWA_CONF_DIR=${CHUKWA_CONF_DIR} -DCHUKWA_LOG_DIR=${CHUKWA_LOG_DIR} -DCHUKWA_DATA_DIR=${CHUKWA_DATA_DIR} -DAPP=${APP} -Dlog4j.configuration=chukwa-log4j.properties -classpath ${CHUKWA_CONF_DIR}:${CLASSPATH}:${CHUKWA_CLASSPATH}:${tools} ${CLASS} $OPTS $@ &
  fi
fi

