blob: 37f5b00fba212f61cefe9f55344e0ab75799d52c [file] [log] [blame]
#!/bin/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.
if [ "$LOGFEEDER_JAVA_MEM" = "" ]; then
LOGFEEDER_JAVA_MEM="-Xmx512m"
fi
readlinkf(){
# get real path on mac OSX
perl -MCwd -e 'print Cwd::abs_path shift' "$1";
}
if [ "$(uname -s)" = 'Linux' ]; then
SCRIPT_DIR="`dirname "$(readlink -f "$0")"`"
else
SCRIPT_DIR="`dirname "$(readlinkf "$0")"`"
fi
LOGFEEDER_ROOT_DIR="`dirname \"$SCRIPT_DIR\"`"
LOGFEEDER_LIBS_DIR="$LOGFEEDER_ROOT_DIR/libs"
if [ "$LOGFEEDER_CONF_DIR" = "" ]; then
LOGFEEDER_CONF_DIR="/usr/lib/ambari-logsearch-logfeeder/conf"
if [ ! -d $LOGFEEDER_CONF_DIR ]; then
if [ -d "$LOGFEEDER_ROOT_DIR/conf" ]; then
LOGFEEDER_CONF_DIR="$LOGFEEDER_ROOT_DIR/conf"
fi
fi
fi
if [ -f "$LOGFEEDER_CONF_DIR/logfeeder-env.sh" ]; then
source $LOGFEEDER_CONF_DIR/logfeeder-env.sh
fi
JVM="java"
if [ -x $JAVA_HOME/bin/java ]; then
JVM=$JAVA_HOME/bin/java
fi
if [ ! -z "$LOGSEARCH_SOLR_CLIENT_SSL_INCLUDE" ]; then
source $LOGSEARCH_SOLR_CLIENT_SSL_INCLUDE
fi
if [ -z "$LOGFEEDER_PID_FILE" ]; then
LOGFEEDER_DEFAULT_PID_DIR="/var/run/ambari-logsearch-logfeeder"
if [ -d "$LOGFEEDER_DEFAULT_PID_DIR" ]; then
LOGFEEDER_PID_DIR=$LOGFEEDER_DEFAULT_PID_DIR
else
LOGFEEDER_PID_DIR=$HOME
fi
export LOGFEEDER_PID_FILE=$LOGFEEDER_PID_DIR/logfeeder.pid
fi
if [ -z "$LOG_FILE" ]; then
export LOG_FILE="logfeeder.log"
fi
LOGFEEDER_GC_LOGFILE="logfeeder_gc.log"
if [ -z "$LOG_PATH" ]; then
LOG_FILE="$HOME/$LOG_FILE"
LOGFEEDER_GC_LOGFILE="$HOME/$LOGFEEDER_GC_LOGFILE"
else
LOG_PATH_WITHOUT_SLASH=${LOG_PATH%/}
LOG_FILE="$LOG_PATH_WITHOUT_SLASH/$LOG_FILE"
LOGFEEDER_GC_LOGFILE="$LOG_PATH_WITHOUT_SLASH/$LOGFEEDER_GC_LOGFILE"
fi
java_version=$($JVM -version 2>&1 | grep 'java version' | cut -d'"' -f2 | cut -d'.' -f2)
if [ $java_version == "8" ]; then
LOGFEEDER_GC_OPTS="-XX:+PrintGCDetails -XX:+PrintGCDateStamps -Xloggc:$LOGFEEDER_GC_LOGFILE"
else
LOGFEEDER_GC_OPTS="-Xlog:gc*:file=$LOGFEEDER_GC_LOGFILE:time"
fi
function print_usage() {
cat << EOF
Usage: [<command>] [<arguments with flags>]
commands:
start Start Log Feeder
stop Stop Log Feeder
status Check Log Feeder status (pid file)
checkpoints Checkpoint operations
test Test Log Feeder shipper configs
help Print usage
start command arguments:
-d, --debug Start java process in debug mode
-f, --foreground Start java process in foreground
test command arguments:
-h, --help Print usage
-tle, --test-log-entry Log entry to test if it's parseable (required)
-tsc, --test-shipper-config Shipper configuration file for testing if log entry is parseable (required)
-tgc, --test-global-config Global configuration files (comma separated list) for testing if log entry is parseable
-tli, --test-log-id The id of the log to test
checkpoints command arguments:
-l, --list Print checkpoints
-cf, --checkpoints-folder Checkpoints folder location
-c, --clean Remove a checkpoint file (by key/log type or use on all)
-k, --file-key Filter on file key (for list and clean)
-lt, --log-type Filter on log type (for list and clean)
-a, --all Flag all checkpoints to be deleted by clean command
EOF
}
function spinner() {
local pid=$1
local delay=0.5
local spinstr='|/-\'
while [ "$(ps aux | awk '{print $2}' | grep -w $pid)" ]; do
local temp=${spinstr#?}
printf " [%c] " "$spinstr"
local spinstr=$temp${spinstr%"$temp"}
sleep $delay
printf "\b\b\b\b\b\b"
done
printf " \b\b\b\b"
}
function status() {
echo "Checking Log Feeder status ..." >&2
if [ -f "$LOGFEEDER_PID_FILE" ]; then
LOGFEEDER_PID=`cat "$LOGFEEDER_PID_FILE"`
else
echo "Log Feeder pid not exists. (probably the process is not running)" >&2
return 1
fi
if ps -p $LOGFEEDER_PID > /dev/null
then
echo "Log Feeder process is running. (pid: $LOGFEEDER_PID)" >&2
return 0
else
echo "Log Feeder process is not running." >&2
return 1
fi
}
function start() {
exit_status=$(status; echo $?)
if [ "$exit_status" = "0" ]; then
echo "Skipping start process."
exit 0
fi
FG="false"
LOGFEEDER_DEBUG_SUSPEND=${LOGFEEDER_DEBUG_SUSPEND:-n}
LOGFEEDER_DEBUG_PORT=${LOGFEEDER_DEBUG_PORT:-"5006"}
if [ "$LOGFEEDER_DEBUG" = "true" ]; then
LOGFEEDER_JAVA_OPTS="$LOGFEEDER_JAVA_OPTS -Xdebug -Xrunjdwp:transport=dt_socket,address=$LOGFEEDER_DEBUG_PORT,server=y,suspend=$LOGFEEDER_DEBUG_SUSPEND "
fi
if [ "$LOGFEEDER_SSL" = "true" ]; then
LOGFEEDER_JAVA_OPTS="$LOGFEEDER_JAVA_OPTS -Djavax.net.ssl.keyStore=$LOGFEEDER_KEYSTORE_LOCATION -Djavax.net.ssl.keyStoreType=$LOGFEEDER_KEYSTORE_TYPE -Djavax.net.ssl.trustStore=$LOGFEEDER_TRUSTSTORE_LOCATION -Djavax.net.ssl.trustStoreType=$LOGFEEDER_TRUSTSTORE_TYPE"
fi
if [ "$LOGFEEDER_JMX" = "true" ]; then
LOGFEEDER_JAVA_OPTS="$LOGFEEDER_JAVA_OPTS -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.port=2098"
fi
if [ $# -gt 0 ]; then
while true; do
case "$1" in
-f|--foreground)
FG="true"
shift
;;
-d|--debug)
if [ "$LOGFEEDER_DEBUG" != "true" ]; then
LOGFEEDER_JAVA_OPTS="$LOGFEEDER_JAVA_OPTS -Xdebug -Xrunjdwp:transport=dt_socket,address=$LOGFEEDER_DEBUG_PORT,server=y,suspend=$LOGFEEDER_DEBUG_SUSPEND "
fi
shift
;;
*)
if [ "${1:0:2}" == "-D" ]; then
# pass thru any opts that begin with -D (java system props)
LOGFEEDER_JAVA_OPTS+=("$1")
echo "$LOGFEEDER_JAVA_OPTS"
shift
else
if [ "$1" != "" ]; then
print_usage
exit 1
else
break
fi
fi
;;
esac
done
fi
if [ $FG == "true" ]; then
echo "Starting logfeeder... (foreground) pid_file=$LOGFEEDER_PID_FILE"
echo "Run command $JVM -cp '$LOGFEEDER_CONF_DIR:$LOGFEEDER_LIBS_DIR/*' $LOGFEEDER_GC_OPTS $LOGFEEDER_JAVA_OPTS $LOGFEEDER_JAVA_MEM org.apache.ambari.logfeeder.LogFeeder"
$JVM -cp "$LOGFEEDER_CONF_DIR:$LOGFEEDER_LIBS_DIR/*" $LOGFEEDER_GC_OPTS $LOGFEEDER_JAVA_OPTS $LOGFEEDER_JAVA_MEM org.apache.ambari.logfeeder.LogFeeder
else
echo "Starting logfeeder... Output file=$LOG_FILE pid_file=$LOGFEEDER_PID_FILE"
echo "Run command nohup $JVM -cp '$LOGFEEDER_CONF_DIR:$LOGFEEDER_LIBS_DIR/*' $LOGFEEDER_GC_OPTS $LOGFEEDER_JAVA_OPTS $LOGFEEDER_JAVA_MEM org.apache.ambari.logfeeder.LogFeeder"
nohup $JVM -cp "$LOGFEEDER_CONF_DIR:$LOGFEEDER_LIBS_DIR/*" $LOGFEEDER_GC_OPTS $LOGFEEDER_JAVA_OPTS $LOGFEEDER_JAVA_MEM org.apache.ambari.logfeeder.LogFeeder > $LOG_FILE 2>&1 &
fi
}
function stop() {
LOGFEEDER_STOP_WAIT=3
if [ -f "$LOGFEEDER_PID_FILE" ]; then
LOGFEEDER_PID=`cat "$LOGFEEDER_PID_FILE"`
fi
if [ "$LOGFEEDER_PID" != "" ]; then
echo -e "Sending stop command to Log Feeder... Checking PID: $LOGFEEDER_PID."
kill $LOGFEEDER_PID
(loops=0
while true
do
CHECK_PID=`ps auxww | awk '{print $2}' | grep -w $LOGFEEDER_PID | sort -r | tr -d ' '`
if [ "$CHECK_PID" != "" ]; then
slept=$((loops * 2))
if [ $slept -lt $LOGFEEDER_STOP_WAIT ]; then
sleep 2
loops=$[$loops+1]
else
exit # subshell!
fi
else
exit # subshell!
fi
done) &
spinner $!
rm -f "$LOGFEEDER_PID_FILE"
else
echo -e "No LogFeeder process found to stop."
exit 0
fi
CHECK_PID=`ps auxww | awk '{print $2}' | grep -w $LOGFEEDER_PID | sort -r | tr -d ' '`
if [ "$CHECK_PID" != "" ]; then
echo -e "Log Feeder process $LOGFEEDER_PID is still running; forcefully killing it now."
kill -9 $LOGFEEDER_PID
echo "Killed process $LOGFEEDER_PID"
rm -f "$LOGFEEDER_PID_FILE"
sleep 1
else
echo "Log Feeder is stopped."
fi
CHECK_PID=`ps auxww | awk '{print $2}' | grep -w $LOGFEEDER_PID | sort -r | tr -d ' '`
if [ "$CHECK_PID" != "" ]; then
echo "ERROR: Failed to kill Log Feeder Java process $LOGFEEDER_PID ... script fails."
exit 1
fi
}
function test() {
echo "Running command: $JVM -cp "$LOGFEEDER_CONF_DIR:$LOGFEEDER_LIBS_DIR/*" org.apache.ambari.logfeeder.LogFeederCommandLine --test ${@}"
$JVM -cp "$LOGFEEDER_CONF_DIR:$LOGFEEDER_LIBS_DIR/*" $LOGFEEDER_JAVA_OPTS org.apache.ambari.logfeeder.LogFeederCommandLine --test ${@}
}
function checkpoints() {
echo "Running command: $JVM -cp "$LOGFEEDER_CONF_DIR:$LOGFEEDER_LIBS_DIR/*" org.apache.ambari.logfeeder.LogFeederCommandLine --checkpoints ${@}"
$JVM -cp "$LOGFEEDER_CONF_DIR:$LOGFEEDER_LIBS_DIR/*" $LOGFEEDER_JAVA_OPTS org.apache.ambari.logfeeder.LogFeederCommandLine --checkpoints ${@}
}
if [ $# -gt 0 ]; then
SCRIPT_CMD="$1"
shift
else
print_usage
exit 1
fi
case $SCRIPT_CMD in
start)
start ${1+"$@"}
;;
stop)
stop
;;
status)
status
;;
test)
test ${1+"$@"}
;;
checkpoints)
checkpoints ${1+"$@"}
;;
help)
print_usage
exit 0
;;
*)
print_usage
exit 1
;;
esac