#!/bin/sh

# Configuration settings for an alignak-daemon instance in /etc/rc.conf:
# $FreeBSD$
#
# PROVIDE: alignak-daemon
# REQUIRE: LOGIN
# KEYWORD: shutdown
#
# alignak_daemon_debug (bool):
#   Default value: "NO"
#   Flag to add some information during the script execution. Useful to check behavior;)
#
# alignak_daemon_enable (bool):
#   Default value: "NO"
#   Flag that determines whether Alignak is enabled.
#
# alignak_daemon_prefix (string):
#   Default value: "/usr/local"
#   Alignak default installation prefix
#
# alignak_daemon_user (string):
#   Default value: "alignak"
#   Alignak default user
#
# alignak_daemon_group (string):
#   Default value: "alignak"
#   Alignak default user group
#
# alignak_daemon_configuration (string):
#   Default value: "/usr/local/etc/alignak/alignak.ini"
#   Alignak configuration file name
#
# alignak_daemon_daemonize (bool):
#   Default value: "YES"
#   Start in daemon mode
#
# alignak_daemon_replace (bool):
#   Default value: "YES"
#   Start in replace mode - replaces an existing daemon if a stale pid file exists
#
# alignak_daemon_pid_file (string):
#   Default value: "${alignak_daemon_prefix}/var/run/alignak/${name}.pid"
#   PID file name.
#
# alignak_daemon_flags (string):
#   Default value: ""
#   Extra parameters to be provided to the started script
#
# alignak_daemon_alignak_name (string):
#   Default value: ""
#   Alignak instance name
#   Default is empty to get this parameter in the configuration file
#
# alignak_daemon_host (string):
#   Default value: ""
#   Interface listened to by the Alignak arbiter.
#   Default is empty to get this parameter in the configuration file
#
# alignak_daemon_port (integer):
#   Default value:
#   Port listened to by the Alignak arbiter.
#   Default is empty to get this parameter in the configuration file
#
# -------------------------------------------------------------------------------------------------
# alignak_daemon rc.d script is able to operate on several alignak daemons instances
# Defining which daemons are to be started is made thanks to these configuration variables:
#
# alignak_daemon_types (string list):
#   Defines the daemons types to be started
#   Default is all the daemon types: arbiter scheduler poller broker receiver reactionner
#
# alignak_daemon_arbiter_instances (string list):
#   Defines the daemon instances to be started
#   Default is all only one master instance: arbiter-master
#
# alignak_daemon_scheduler_instances (string list):
#   Defines the daemon instances to be started
#   Default is all only one master instance: scheduler-master
#
# alignak_daemon_broker_instances (string list):
#   Defines the daemon instances to be started
#
# alignak_daemon_poller_instances (string list):
#   Defines the daemon instances to be started
#   Default is all only one master instance: poller-master
#
# alignak_daemon_reactionner_instances (string list):
#   Defines the daemon instances to be started
#   Default is all only one master instance: reactionner-master
#
# alignak_daemon_receiver_instances (string list):
#   Defines the daemon instances to be started
#   Default is all only one master instance: receiver-master
#
# -------------------------------------------------------------------------------------------------
# Defining a specific instances list is quite easy:
# alignak_daemon_types="scheduler broker receiver"
# alignak_daemon_scheduler_instances="scheduler-realm-1 scheduler-realm-2 scheduler-realm-3"
# alignak_daemon_broker_instances="broker-realm-1"
# alignak_daemon_receiver_instances="receiver-realm-1 receiver-realm-2"
# alignak_daemon_arbiter_instances="arbiter-master"
# alignak_daemon_scheduler_instances="master1 master2"
# alignak_daemon_scheduler_realm_1_flags="-n scheduler-master1"
# alignak_daemon_scheduler_realm_2_flags="-n scheduler-master2"

alignak_daemon_types="broker poller reactionner receiver scheduler arbiter"
alignak_daemon_arbiter_instances="arbiter-master"
alignak_daemon_scheduler_instances="scheduler-master scheduler-fdj scheduler-fd2"
alignak_daemon_broker_instances="broker-master broker-fdj broker-fdj2"
alignak_daemon_poller_instances="poller-master"
alignak_daemon_reactionner_instances="reactionner-master"
alignak_daemon_receiver_instances="receiver-master"

alignak_daemon_arbiter_arbiter_master_port="7770"
alignak_daemon_scheduler_scheduler_master_port="7768"
alignak_daemon_scheduler_scheduler_ipm_port="27768"
alignak_daemon_scheduler_scheduler_fdj_port="10001"
alignak_daemon_scheduler_scheduler_fdj2_port="10002"
alignak_daemon_broker_broker_master_port="7772"
alignak_daemon_broker_broker_fdj_port="17772"
alignak_daemon_broker_broker_ipm_port="27772"
alignak_daemon_poller_poller_master_port="7771"
alignak_daemon_reactionner_reactionner_master_port="7769"
alignak_daemon_receiver_receiver_master_port="7773"

#
# -------------------------------------------------------------------------------------------------
# When types and instaces are specified, the non-type specific parameters become defined
# previously (upper) become the default values for the type/instance specific parameters.
#
# Example:
# If no specific "alignak_daemon_arbiter_arbiter_master_host" variable is defined then the default
# "alignak_daemon_host" variable value will be used the the arbiter arbiter-master daemon host
# variable.

. /etc/rc.subr

name="alignak_daemon"
rcvar="alignak_daemon_enable"

load_rc_config "${name}"

# Script debug - add echo outputs
: ${alignak_daemon_rc_debug="NO"}

# Script daemonize - use FreeBSD daemon utility
: ${alignak_daemon_daemon="NO"}

# Daemons default parameters
: ${alignak_daemon_enable="NO"}
: ${alignak_daemon_user="alignak"}
: ${alignak_daemon_group="alignak"}
: ${alignak_daemon_prefix="/usr/local"}
: ${alignak_daemon_configuration="${alignak_daemon_prefix}/etc/alignak/alignak.ini"}
: ${alignak_daemon_daemonize="YES"}
: ${alignak_daemon_replace="YES"}
: ${alignak_daemon_alignak_name=""}
: ${alignak_daemon_host=""}
: ${alignak_daemon_port=""}
: ${alignak_daemon_flags=""}

# Daemons types and instances
# Default is to create one instance of each type
# Instance names may not contain any specific character:
# The script will remove space characters and replace non alphanumeric character with an underscore
: ${alignak_daemon_types="broker poller reactionner receiver scheduler arbiter"}
: ${alignak_daemon_arbiter_instances="arbiter-master"}
: ${alignak_daemon_scheduler_instances="scheduler-master"}
: ${alignak_daemon_broker_instances="broker-master"}
: ${alignak_daemon_poller_instances="poller-master"}
: ${alignak_daemon_reactionner_instances="reactionner-master"}
: ${alignak_daemon_receiver_instances="receiver-master"}

# Specific daemons instances configuration
# Listening port
: ${alignak_daemon_arbiter_arbiter_master_port="7770"}
: ${alignak_daemon_scheduler_scheduler_master_port="7768"}
: ${alignak_daemon_broker_broker_master_port="7772"}
: ${alignak_daemon_poller_poller_master_port="7771"}
: ${alignak_daemon_reactionner_reactionner_master_port="7769"}
: ${alignak_daemon_receiver_receiver_master_port="7773"}


# This handles daemons type/instance specific vars.
if [ -n "$3" ]; then
   type="$2"
   # Remove space characters and replace non alphanumeric with an underscore
   instance=`echo "$3" | tr -d "[:space:]" | tr -c "[:alnum:]" "_"`
   if checkyesno alignak_daemon_rc_debug; then
      echo " configuring alignak_daemon for '$1' of: ${type} - ${instance}"
   fi
   if [ -n "${alignak_daemon_types}" ]; then
      alignak_daemon_name="$3"

      pid_file="${alignak_daemon_prefix}/var/run/alignak/${type}-${instance}.pid"
      eval tmp="alignak_daemon_${type}_${instance}_pid_file"
      eval alignak_daemon_pid_file="\${$tmp:-${pid_file}}"

      eval tmp="alignak_daemon_${type}_${instance}_enable"
      eval alignak_daemon_enable="\${$tmp:-${alignak_daemon_enable}}"

      eval tmp="alignak_daemon_${type}_${instance}_prefix"
      eval alignak_daemon_prefix="\${$tmp:-${alignak_daemon_prefix}}"

      eval tmp="alignak_daemon_${type}_${instance}_daemonize"
      eval alignak_daemon_daemonize="\${$tmp:-${alignak_daemon_daemonize}}"

      eval tmp="alignak_daemon_${type}_${instance}_replace"
      eval alignak_daemon_replace="\${$tmp:-${alignak_daemon_replace}}"

      eval tmp="alignak_daemon_${type}_${instance}_flags"
      eval alignak_daemon_flags="\${$tmp:-${alignak_daemon_flags}}"

      eval tmp="alignak_daemon_${type}_${instance}_host"
      eval alignak_daemon_host="\${$tmp:-${alignak_daemon_host}}"

      eval tmp="alignak_daemon_${type}_${instance}_port"
      eval alignak_daemon_port="\${$tmp:-${alignak_daemon_port}}"
   else
      echo "$0: extra argument ignored"
   fi
elif [ -n "$2" ]; then
   # $1 is the command and $2 is the daemon name
   echo "Single instance command: $1 - $2"
   if [ -n "${alignak_daemon_types}" -a -n "$1" ]; then
      for type in ${alignak_daemon_types}; do
         eval type_instances="\${alignak_daemon_${type}_instances:""}"
         for instance in ${type_instances}; do
            if [ "$instance" = "$2" ]; then
               /usr/local/etc/rc.d/alignak_daemon $1 ${type} ${instance}
               retcode="$?"
               if [ "0${retcode}" -ne 0 ]; then
                  failed="${type} - ${instance} (${retcode}) ${failed:-}"
               else
                  success="${type} - ${instance} ${success:-}"
               fi
            fi
         done
      done
      # It exits so that non-instance rc.d is not started when there are instances.
      exit 0
   fi
else
   # $1 is the command
   echo "All instances command: $1 - $2"
   if [ -n "${alignak_daemon_types}" -a -n "$1" ]; then
      for type in ${alignak_daemon_types}; do
         eval type_instances="\${alignak_daemon_${type}_instances:""}"
         for instance in ${type_instances}; do
            if checkyesno alignak_daemon_rc_debug; then
               echo "=> instance: ${type} - ${instance}"
            fi
            /usr/local/etc/rc.d/alignak_daemon $1 ${type} ${instance}
            retcode="$?"
            if [ "0${retcode}" -ne 0 ]; then
               failed="${type} - ${instance} (${retcode}) ${failed:-}"
            else
               success="${type} - ${instance} ${success:-}"
            fi
         done
      done
      # It exits so that non-instance rc.d is not started when there are instances.
      exit 0
   fi
fi

command="${alignak_daemon_prefix}/bin/alignak-${type}"
alignak_daemon_flags="--name ${alignak_daemon_name}"

# Create daemon start parameters
if checkyesno alignak_daemon_daemonize; then
   alignak_daemon_flags="${alignak_daemon_flags} --daemon"
fi

if checkyesno alignak_daemon_replace; then
   alignak_daemon_flags="${alignak_daemon_flags} --replace"
fi

if [ ! -z "$alignak_daemon_alignak_name" ]; then
   if [ "$type" = "arbiter" ]; then
      alignak_daemon_flags="${alignak_daemon_flags} --alignak-name \"${alignak_daemon_alignak_name}\""
   fi
fi

if [ ! -z "$alignak_daemon_host" ]; then
   alignak_daemon_flags="${alignak_daemon_flags} --host ${alignak_daemon_host}"
fi

if [ ! -z "$alignak_daemon_port" ]; then
   alignak_daemon_flags="${alignak_daemon_flags} --port ${alignak_daemon_port}"
fi

command_args="--environment ${alignak_daemon_configuration} ${alignak_daemon_flags}"

if checkyesno alignak_daemon_rc_debug; then
   echo " - enable: ${alignak_daemon_enable}"
   echo " - name: ${alignak_daemon_name}"
   echo " - prefix: ${alignak_daemon_prefix}"
   echo " - pid file: ${alignak_daemon_pid_file}"
   echo " - alignak name: ${alignak_daemon_alignak_name}"
   echo " - daemonize: ${alignak_daemon_daemonize}"
   echo " - replace: ${alignak_daemon_replace}"
   echo " - flags: ${alignak_daemon_flags}"
   echo " - host: ${alignak_daemon_host}"
   echo " - port: ${alignak_daemon_port}"
   echo " ---"
   echo " - daemon arguments: $command_args"
fi

stop_cmd="${name}_stop"
start_cmd="${name}_start"
status_cmd="${name}_status"
start_precmd="${name}_precmd"

required_files="${alignak_daemon_wsgi}"

alignak_daemon_precmd()
{
    /usr/bin/install -d -o ${alignak_daemon_user} -g ${alignak_daemon_group} -m 755 ${alignak_daemon_prefix}/var/log/align
ak
    /usr/bin/install -d -o ${alignak_daemon_user} -g ${alignak_daemon_group} -m 755 ${alignak_daemon_prefix}/var/log/align
ak/monitoring-log
    /usr/bin/install -d -o ${alignak_daemon_user} -g ${alignak_daemon_group} -m 755 ${alignak_daemon_prefix}/var/run/align
ak
}

alignak_daemon_start()
{
   info "Starting ${name} - ${type} ${instance}..."
   if checkyesno alignak_daemon_daemon; then
      # daemon:
      # -c change to / working dir
      # -f redirect standard i/o to /dev/null
      echo "/usr/sbin/daemon -c -f -P ${alignak_daemon_pid_file} -r -u ${alignak_daemon_user} ${command} ${command_args}"
      /usr/sbin/daemon -c -f -P ${alignak_daemon_pid_file} -r -u ${alignak_daemon_user} ${command} ${command_args}
   else
      echo "${command} ${command_args} -i ${alignak_daemon_pid_file}"
      ${command} ${command_args} "-i ${alignak_daemon_pid_file}"
   fi
   ### ${command} ${command_args}
   info "Started"
}

alignak_daemon_stop()
{
   if [ -e "${alignak_daemon_pid_file}" ]; then
      echo "Stopping ${name} - ${type} ${instance}..."
      kill -s TERM `cat ${alignak_daemon_pid_file}`
      echo "Stopped"
   else
      echo "${name} - ${type} ${instance} is not running"
   fi
}

alignak_daemon_status() {
   if [ -e "${alignak_daemon_pid_file}" ]; then
      echo "${name} - ${type} ${instance} is running as pid `cat ${alignak_daemon_pid_file}`"
   else
      echo "${name} - ${type} ${instance} is not running"
   fi
}

[ -z "${alignak_daemon_enable}" ] && alignak_daemon_enable="NO"

run_rc_command "$1"
