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

# description: ambari-agent daemon
# processname: ambari-agent

# /etc/init.d/ambari-agent

export PATH=/usr/lib/ambari-server/*:$PATH
export AMBARI_CONF_DIR=/etc/ambari-server/conf:$PATH

AMBARI_AGENT=ambari-agent
PIDFILE=/var/run/ambari-agent/$AMBARI_AGENT.pid
OUTFILE=/var/log/ambari-agent/ambari-agent.out
LOGFILE=/var/log/ambari-agent/ambari-agent.log
AGENT_SCRIPT=/usr/lib/python2.6/site-packages/ambari_agent/main.py
OK=1
NOTOK=0


if [ -a /usr/bin/python2.6 ]; then
  PYTHON=/usr/bin/python2.6
fi

if [ "x$PYTHON" == "x" ]; then
  PYTHON=/usr/bin/python
fi

# Trying to read the passphrase from an environment
if [ ! -z $AMBARI_PASSPHRASE ]; then
  RESOLVED_AMBARI_PASSPHRASE=$AMBARI_PASSPHRASE
fi

# Reading the environment file
if [ -a /var/lib/ambari-agent/ambari-env.sh ]; then
  . /var/lib/ambari-agent/ambari-env.sh
fi

if [ ! -z $AMBARI_LOG_DIR ]; then
  LOGFILE=$AMBARI_LOG_DIR/ambari-agent.log
fi

if [ -z $RESOLVED_AMBARI_PASSPHRASE ] &&  [ ! -z $AMBARI_PASSPHRASE ]; then
  RESOLVED_AMBARI_PASSPHRASE=$AMBARI_PASSPHRASE
  # If the passphrase is not defined yet, use the value from the env file
elif [ -z $RESOLVED_AMBARI_PASSPHRASE ]; then
  # Passphrase is not defined anywhere, set the default value
  RESOLVED_AMBARI_PASSPHRASE="DEV"
fi

export AMBARI_PASSPHRASE=$RESOLVED_AMBARI_PASSPHRASE

#echo $AMBARI_PASSPHRASE

# check for version
check_python_version ()
{
  echo "Verifying Python version compatibility..."
  majversion=`$PYTHON -V 2>&1 | awk '{print $2}' | cut -d'.' -f1`
  minversion=`$PYTHON -V 2>&1 | awk '{print $2}' | cut -d'.' -f2`
  numversion=$(( 10 * $majversion + $minversion))
  if (( $numversion < 26 )); then
    echo "ERROR: Found Python version $majversion.$minversion. Ambari Agent requires Python version > 2.6"
    return $NOTOK
  fi
  echo "Using python " $PYTHON
  return $OK
}

case "$1" in
  start)
        check_python_version
        if [ "$?" -eq "$NOTOK" ]; then
          exit -1
        fi
        echo "Checking for previously running Ambari Agent..."
        if [ -f $PIDFILE ]; then
          PID=`cat $PIDFILE`
          if [ -z "`ps ax -o pid | grep $PID`" ]; then
            echo "$PIDFILE found with no process. Removing $PID..."
            rm -f $PIDFILE
          else
            tput bold
            echo "ERROR: $AMBARI_AGENT already running"
            tput sgr0
            echo "Check $PIDFILE for PID."
            exit -1
          fi
        fi
        echo "Starting ambari-agent"
        nohup $PYTHON $AGENT_SCRIPT > $OUTFILE 2>&1 &
        sleep 2
        PID=$!
        echo "Verifying $AMBARI_AGENT process status..."
        if [ -z "`ps ax -o pid | grep $PID`" ]; then
          echo "ERROR: $AMBARI_AGENT start failed for unknown reason"
          exit -1
        fi
        tput bold
        echo "Ambari Agent successfully started"
        tput sgr0
        echo "Agent PID at: $PIDFILE"
        echo "Agent outout at: $OUTFILE"
        echo "Agent log at: $LOGFILE"
        ;;
  status)
        if [ -f $PIDFILE ]; then
          PID=`cat $PIDFILE`
          echo "Found $AMBARI_AGENT PID: $PID"
          if [ -z "`ps ax -o pid | grep $PID`" ]; then
            echo "$AMBARI_AGENT not running. Stale PID File at: $PIDFILE"
          else
            tput bold
            echo "$AMBARI_AGENT running."
            tput sgr0
            echo "Agent PID at: $PIDFILE"
            echo "Agent outout at: $OUTFILE"
            echo "Agent log at: $LOGFILE"
          fi
        else
          tput bold
          echo "$AMBARI_AGENT currently not running"
          tput sgr0
          echo "Usage: /usr/sbin/ambari-agent {start|stop|restart|status}"
        fi
        ;;
  stop)
        check_python_version
        if [ "$?" -eq "$NOTOK" ]; then
          exit -1
        fi
        if [ -f $PIDFILE ]; then
          PID=`cat $PIDFILE`
          echo "Found $AMBARI_AGENT PID: $PID"
          if [ -z "`ps ax -o pid | grep $PID`" ]; then
            tput bold
            echo "ERROR: $AMBARI_AGENT not running. Stale PID File at: $PIDFILE"
            tput sgr0
          else
            echo "Stopping $AMBARI_AGENT"
            $PYTHON $AGENT_SCRIPT stop
          fi
          echo "Removing PID file at $PIDFILE"
          rm -f $PIDFILE
          tput bold
          echo "$AMBARI_AGENT successfully stopped"
          tput sgr0
        else
          tput bold
          echo "$AMBARI_AGENT is not running. No PID found at $PIDFILE"
          tput sgr0
        fi
        ;;
  restart)
        echo -e "Restarting $AMBARI_AGENT"
        $0 stop
        $0 start
        ;;     
  *)
        tput bold
        echo "Usage: /usr/sbin/ambari-agent {start|stop|restart|status}"
        tput sgr0
        exit 1
esac

exit 0
