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

# Script structure inspired from Apache Karaf and other Apache projects with similar startup approaches

SCRIPT_DIR=$(dirname "$0")
SCRIPT_NAME=$(basename "$0")
PROGNAME=$(basename "$0")
SCRIPTPATH="$( cd "$(dirname "$0")" ; pwd -P )"
export MINIFI_HOME="$(dirname ${SCRIPTPATH})"
bin_dir=${MINIFI_HOME}/bin
minifi_executable=${bin_dir}/minifi
pid_file=${bin_dir}/.minifi.pid

warn() {
    echo "${PROGNAME}: $*"
}

die() {
    warn "$*"
    exit 1
}

detectOS() {
    # OS specific support (must be 'true' or 'false').
    cygwin=false;
    aix=false;
    os400=false;
    darwin=false;
    case "$(uname)" in
        CYGWIN*)
            cygwin=true
            ;;
        AIX*)
            aix=true
            ;;
        OS400*)
            os400=true
            ;;
        Darwin)
            darwin=true
            ;;
    esac
    # For AIX, set an environment variable
    if ${aix}; then
         export LDR_CNTRL=MAXDATA=0xB0000000@DSA
         echo ${LDR_CNTRL}
    fi
}

init() {
    # Determine if there is special OS handling we must perform
    detectOS
}

# determines the pid
get_pid() {
  # Default to a -1 for pid
  pid=-1
  # Check to see if we have a pid file
  if [ -f ${pid_file} ]; then
    pid=$(cat ${pid_file})
  fi
  echo ${pid}
}

# Performs a check to see if the provided pid is one that currently exists
active_pid() {
  pid=${1}
  if [ ${pid} -eq -1 ]; then
    echo 1
  else
    kill -s 0 ${pid} > /dev/null 2>&1
    echo $?
  fi
}

endnow() {
   echo "Killing MiNiFi..."
   kill -9 ${saved_pid} > /dev/null 2>&1
   
}

install() {
    detectOS

    if [ "${darwin}" = "true"  ] || [ "${cygwin}" = "true" ]; then
        echo 'Installing Apache MiNiFi as a service is not supported on OS X or Cygwin.'
        exit 1
    fi

    SVC_NAME=minifi
    if [ "x$2" != "x" ] ; then
        SVC_NAME=$2
    fi

    initd_dir='/etc/init.d'
    SVC_FILE="${initd_dir}/${SVC_NAME}"

    if [ ! -w  "${initd_dir}" ]; then
        echo "Current user does not have write permissions to ${initd_dir}. Cannot install MiNiFi as a service."
        exit 1
    fi

# Create the init script, overwriting anything currently present
cat <<SERVICEDESCRIPTOR > ${SVC_FILE}
#!/bin/sh
#
#    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.
#
# chkconfig: 2345 20 80
# description: Apache NiFi MiNiFi is a subproject of Apache nifi to collect data where it originates.
#
# Make use of the configured MINIFI_HOME directory and pass service requests to the minifi executable
export MINIFI_HOME=${MINIFI_HOME}
bin_dir=\${MINIFI_HOME}/bin
minifi_executable=\${bin_dir}/minifi
pid_file=${bin_dir}/.minifi.pid

# determines the pid
get_pid() {
  # Default to a -1 for pid
  pid=-1
  # Check to see if we have a pid file
  if [ -f \${pid_file} ]; then
    pid=\$(cat ${pid_file})
  fi
  echo \${pid}
}

# Performs a check to see if the provided pid is one that currently exists
active_pid() {
  pid=\${1}
  if [ \${pid} -eq -1 ]; then
    echo 1
  else
    kill -s 0 \${pid} > /dev/null 2>&1
    echo \$?
  fi
}

saved_pid=\$(get_pid)

case "\$1" in
    start)
      if [ "\${saved_pid}" -gt 0 ]; then
        if [ \$(active_pid \${saved_pid}) -ne 0 ]; then
            echo "PID \${saved_pid} is stale, removing pid file at \${pid_file}";
            if ! rm -f \${pid_file}; then
              echo "Could not remove \${pid_file}. File will need to be manually removed."
              exit 1;
            fi
        else
            echo "MINIFI is currently running (PID: \${saved_pid}) with pid file \${pid_file}."
            exit 0;
        fi
      fi
      \${minifi_executable} &
      pid=\$!
      echo \${pid} > \${pid_file}
      echo Starting MiNiFi with PID \${pid} and pid file \${pid_file}
      ;;
    stop)
      if [ \$(active_pid \${saved_pid}) -ne 0 ]; then
        echo "MiNiFi is not currently running."
      else
        echo "Stopping MiNiFi (PID: \${saved_pid})."
        # Send a SIGINT to MiNiFi so that the handler begins shutdown.
        kill -2 \${saved_pid} > /dev/null 2>&1
        if [ \$? -ne 0 ]; then
          echo "Could not successfully send termination signal to MiNiFi (PID: \${saved_pid})"
          exit 1;
        else
          # Clean up our pid file
          rm -f \${pid_file}
        fi
      fi
      ;;
    run)
      if [ "\${saved_pid}" -gt 0 ]; then
        if ! active_pid \${saved_pid}; then
            echo "PID \${saved_pid} is stale, removing pid file at \${pid_file}";
            if ! rm -f \${pid_file}; then
              echo "Could not remove \${pid_file}. File will need to be manually removed."
              exit 1;
            fi
        else
            echo "MINIFI is currently running (PID: \${saved_pid}) with pid file \${pid_file}."
            exit 0;
        fi
      fi
      echo running
      \${minifi_executable}
      ;;
    status)
        # interpret status as per LSB specifications
        # see:  http://refspecs.linuxbase.org/LSB_3.1.0/LSB-Core-generic/LSB-Core-generic/iniscrptact.html

        if [ "\${saved_pid}" -gt 0 ]; then
          if [ \$(active_pid \${saved_pid}) -ne 0 ]; then
            # program is dead and pid file exists
            echo "Program is not currently running but stale pid file (\${pid_file}) exists.";
            exit 1
          else
            # pid is correct, program is running
            echo "MINIFI is currently running (PID: \${saved_pid}) with pid file \${pid_file}."
            exit 0;
          fi
        else
          # program is not running
          echo "MiNiFi is not currently running."
          exit 3;
        fi
        ;;
     update) 
        if [  -f \${bin_dir}/minifi.update ]; then
        	 \${bin_dir}/minifi.sh stop
        	 cp \${bin_dir}/minifi \${bin_dir}/minifi.bak
             cp \${bin_dir}/minifi.update \${bin_dir}/minifi
             # ensure that the command is now running
             \${bin_dir}/minifi.sh start
             saved_pid=\$(get_pid)
             if [ "\${saved_pid}" -gt 0 ]; then
        	    if [ \$(active_pid \${saved_pid}) -ne 0 ]; then
        	        cp \${bin_dir}/minifi.bak \${bin_dir}/minifi
        	 		\${bin_dir}/minifi.sh start       
        	    fi
        	 fi
		fi
        ;;
    restart)
      echo "Restarting the MiNiFi service. Hit CTRL+C at any time to forcibly terminate MiNiFi"
      ${bin_dir}/minifi.sh stop
      ticks=1
      printf "Waiting for process to terminate."
      trap endnow INT
      if [ "${saved_pid}" -gt 0 ]; then
        while [ $(active_pid ${saved_pid}) -eq 0 ]; do
                sleep 1
                ticks=$((ticks+1))
                numticks=$(($ticks % 5))
                if [ "${numticks}"  -eq 0 ]; then
                        printf "."
                fi
        done
      fi
      ${bin_dir}/minifi.sh start
	;;
    *)
        echo "Usage: service minifi {start|stop|restart|status}"
        ;;
esac

SERVICEDESCRIPTOR

    if [ ! -f "${SVC_FILE}" ]; then
        echo "Could not create service file ${SVC_FILE}"
        exit 1
    fi

    # Provide the user execute access on the file
    chmod u+x ${SVC_FILE}

    rm -f "/etc/rc2.d/S65${SVC_NAME}"
    ln -s "/etc/init.d/${SVC_NAME}" "/etc/rc2.d/S65${SVC_NAME}" || { echo "Could not create link /etc/rc2.d/S65${SVC_NAME}"; exit 1; }
    rm -f "/etc/rc2.d/K65${SVC_NAME}"
    ln -s "/etc/init.d/${SVC_NAME}" "/etc/rc2.d/K65${SVC_NAME}" || { echo "Could not create link /etc/rc2.d/K65${SVC_NAME}"; exit 1; }
    echo "Service ${SVC_NAME} installed"
}

saved_pid=$(get_pid)

case "$1" in
    start)
      if [ "${saved_pid}" -gt 0 ]; then
        if [ $(active_pid ${saved_pid}) -ne 0 ]; then
            echo "PID ${saved_pid} is stale, removing pid file at ${pid_file}";
            if ! rm -f ${pid_file}; then
              echo "Could not remove ${pid_file}. File will need to be manually removed."
              exit 1;
            fi
        else
            echo "MINIFI is currently running (PID: ${saved_pid}) with pid file ${pid_file}."
            exit 0;
        fi
      fi
      ${minifi_executable} &
      pid=$!
      echo ${pid} > ${pid_file}
      echo Starting MiNiFi with PID ${pid} and pid file ${pid_file}
      ;;
    stop)
      if [ $(active_pid ${saved_pid}) -ne 0 ]; then
        echo "MiNiFi is not currently running."
      else
        echo "Stopping MiNiFi (PID: ${saved_pid})."
        # Send a SIGINT to MiNiFi so that the handler begins shutdown.
        kill -2 ${saved_pid} > /dev/null 2>&1
        if [ $? -ne 0 ]; then
          echo "Could not successfully send termination signal to MiNiFi (PID: ${saved_pid})"
          exit 1;
        else
          # Clean up our pid file
          rm -f ${pid_file}
        fi
      fi
      ;;
    run)
      if [ "${saved_pid}" -gt 0 ]; then
        if [ $(active_pid ${saved_pid}) -ne 0 ]; then
            echo "PID ${saved_pid} is stale, removing pid file at ${pid_file}";
            if ! rm -f ${pid_file}; then
              echo "Could not remove ${pid_file}. File will need to be manually removed."
              exit 1;
            fi
        else
            echo "MINIFI is currently running (PID: ${saved_pid}) with pid file ${pid_file}."
            exit 0;
        fi
      fi
      ${minifi_executable}
      ;;
    status)
      if [ "${saved_pid}" -gt 0 ]; then
        if [ $(active_pid ${saved_pid}) -ne 0 ]; then
          # program is dead and pid file exists
          echo "Program is not currently running but stale pid file (${pid_file}) exists.";
          exit 1
        else
          # pid is correct, program is running
          echo "MINIFI is currently running (PID: ${saved_pid}) with pid file ${pid_file}."
          exit 0;
        fi
      else
        # program is not running
        echo "MiNiFi is not currently running."
        exit 0;
      fi
      ;;
    update) 
        if [  -f ${bin_dir}/minifi.update ]; then
        	 ${bin_dir}/minifi.sh stop
        	 cp ${bin_dir}/minifi ${bin_dir}/minifi.bak
             cp ${bin_dir}/minifi.update ${bin_dir}/minifi
             # ensure that the command is now running
             ${bin_dir}/minifi.sh start
             saved_pid=$(get_pid)
             if [ "${saved_pid}" -gt 0 ]; then
        	    if [ $(active_pid ${saved_pid}) -ne 0 ]; then
        	        cp ${bin_dir}/minifi.bak ${bin_dir}/minifi
        	 		${bin_dir}/minifi.sh start       
        	    fi
        	 fi
		fi
        ;;
    restart)
      echo "Restarting MiNiFi. Hit CTRL+C at any time to forcibly terminate MiNiFi"
      ${bin_dir}/minifi.sh stop
      ticks=1
      printf "Waiting for process to terminate."
      trap endnow INT
      if [ "${saved_pid}" -gt 0 ]; then
      	while [ $(active_pid ${saved_pid}) -eq 0 ]; do
  		sleep 1
		ticks=$((ticks+1))
		numticks=$(($ticks % 5))
		if [ "${numticks}"  -eq 0 ]; then
			printf "."
		fi
        done
      fi
      ${bin_dir}/minifi.sh start
      ;;
    install)
      install "$@"
      ;;
    *)
      echo "Usage: minifi.sh {start|stop|run|restart|status|install}"
      ;;
esac
