#!/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
LOGFILE=/var/log/ambari-agent/ambari-agent.out
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 $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 > $LOGFILE 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 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 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
