#!/bin/bash
#
# Manages a Trino node service
#
# chkconfig: 345 85 15
# description: Trino node
#
### BEGIN INIT INFO
# Provides:          trino
# Short-Description: trino node
# Default-Start:     3 4 5
# Default-Stop:      0 1 2 6
# Required-Start:    $syslog $remote_fs
# Required-Stop:     $syslog $remote_fs
# Should-Start:
# Should-Stop:
### END INIT INFO

SCRIPT_NAME=$0
ACTION_NAME=$1
SERVICE_NAME='trino'
SERVICE_USER='trino'

# Launcher Config.
# Use data-dir from node.properties file (assumes it to be at /etc/trino). For other args use defaults from rpm install
NODE_PROPERTIES=/etc/trino/node.properties
DATA_DIR=$(grep -Po "(?<=^node.data-dir=).*" $NODE_PROPERTIES | tail -n 1)
SERVER_LOG_FILE=$(grep -Po "(?<=^node.server-log-file=).*" $NODE_PROPERTIES | tail -n 1)
LAUNCHER_LOG_FILE=$(grep -Po "(?<=^node.launcher-log-file=).*" $NODE_PROPERTIES | tail -n 1)
CONFIGURATION=(
    --launcher-config /usr/lib/trino/bin/launcher.properties
    --data-dir "$DATA_DIR"
    --node-config "$NODE_PROPERTIES"
    --jvm-config /etc/trino/jvm.config
    --config /etc/trino/config.properties
    --launcher-log-file "${LAUNCHER_LOG_FILE:-/var/log/trino/launcher.log}"
    --server-log-file "${SERVER_LOG_FILE:-/var/log/trino/server.log}"
)

# As defined in the requirements: https://trino.io/docs/current/installation/deployment.html#requirements
files_limit=131072
if current_limit=$(ulimit -Hn) && [ "${files_limit}" -lt "${current_limit}" ]; then
    files_limit="${current_limit}"
fi
if max_limit=$(cat /proc/sys/fs/nr_open) && [ "${files_limit}" -gt "${max_limit}" ]; then
    files_limit="${max_limit}"
fi
ulimit -n "${files_limit}"

declare -A CONFIG_ENV
# Don't need shellcheck to follow env.sh
# shellcheck disable=1091
source /etc/trino/env.sh

sudo_options=(-u "$SERVICE_USER")
if [ -z "${JAVA_HOME}" ]; then
    # Don't expand JAVA_HOME in the error message
    # shellcheck disable=2016
    echo 'Warning: No value found for $JAVA_HOME. Default Java will be used.' >&2
else
    sudo_options+=("PATH=${JAVA_HOME}/bin:$PATH")
fi
for key in "${!CONFIG_ENV[@]}"; do
    sudo_options+=("$key=${CONFIG_ENV[$key]}")
done

start() {
    echo "Starting ${SERVICE_NAME} "
    sudo "${sudo_options[@]}" /usr/lib/trino/bin/launcher start "${CONFIGURATION[@]}"
    return $?
}

stop() {
    echo "Stopping ${SERVICE_NAME} "
    sudo "${sudo_options[@]}" /usr/lib/trino/bin/launcher stop "${CONFIGURATION[@]}"
    return $?
}

status() {
    echo "Getting status for ${SERVICE_NAME} "
    sudo "${sudo_options[@]}" /usr/lib/trino/bin/launcher status "${CONFIGURATION[@]}"
    return $?
}

restart() {
    sudo "${sudo_options[@]}" /usr/lib/trino/bin/launcher restart "${CONFIGURATION[@]}"
    return $?
}

# TODO: Add kill

usage() {
    echo $"Usage: ${SCRIPT_NAME} {start|stop|restart|status}"
    return 3
}

case "${ACTION_NAME}" in
    start)
        start
        ;;
    stop)
        stop
        ;;
    restart)
        restart
        ;;
    status)
        status
        ;;
    *)
        echo $"Usage: $0 {start|stop|restart|status}"
        exit 3
        ;;
esac
