#!/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 language governing permissions and
# limitations under the License.
#
# =========
#
# Startup script for Fuseki under *nix systems (works with cygwin too)
#
# Configuration
# -------------
# Default values are loaded from /etc/default/fuseki, if it exists.
#
# JAVA
#   Command to invoke Java. If not set, java (from the PATH) will be used.
#
# JAVA_OPTIONS
#   Extra options to pass to the JVM.
#
# FUSEKI_HOME
#   Where Fuseki is installed.  If not set, the script will try
#   to guess it based on the script invokation path.
#
# FUSEKI_RUN
#   Where the fuseki.pid file should be stored.  It defaults
#   first available of /var/run, /usr/var/run, and /tmp if not set.
#
# FUSEKI_PID
#   The FUSEKI PID file, defaults to $FUSEKI_RUN/fuseki.pid
#
# FUSEKI_ARGS
#   The arguments to pass to the Fuseki server on the command line. Defaults to:
#    --update --loc=$FUSKEI_DATA_DIR /ds    # if FUSEKI_CONF is not set
#    --config=$FUSEKI_CONF                  # if FUSEKI_CONF is set
#
# FUSEKI_CONF
#   The Fuseki configuration file, usually in RDF Turtle notation.
#
# FUSEKI_USER
#   If set, the server will be run as this user
#
# FUSEKI_DATA_DIR
#   The location of the data directory Fuseki will use (i.e. the value of --loc).
#   Defaults to $FUSEKI_HOME/DB
#
# FUSEKI_LOGS
#   Directory where logs will be generated. Defaults to $FUSEKI_HOME/log
#
# FUSEKI_LOGS_STDERROUT
#   Log file with stderr and stdout log output from Fuseki. Defaults to
#   $FUSEKI_LOGS/stderrout.log

### BEGIN INIT INFO
# Provides:          fuseki
# Required-Start:    $remote_fs $network
# Required-Stop:     $remote_fs $network
# Default-Start:     3 4 5
# Default-Stop:      0 1 2 6
# Short-Description: Start Jena Fuseki at boot time
# Description:       Jena Fuseki is a service that provides a SPARQL API over HTTP to one more RDF triple stores
### END INIT INFO

usage()
{
  echo "Usage: ${0##*/} {start|stop|restart|status}"
  exit 1
}

[ $# -gt 0 ] || usage

# Utility functions:
findDirectory()
{
  local L OP=$1
  shift
  for L in "$@"; do
    [ "$OP" "$L" ] || continue
    printf %s "$L"
    break
  done
}

running()
{
  local PID=$(cat "$1" 2>/dev/null) || return 1
  kill -0 "$PID" 2>/dev/null
}

# Are we running in cygwin?
cygwin=false
case "`uname`" in
    CYGWIN*) cygwin=true;;
esac


NAME=fuseki
[ -f "/etc/default/$NAME" ] && . /etc/default/$NAME

# Set FUSKEI_HOME to the script invocation directory if it is not specified
if [ -z "$FUSEKI_HOME" ]
then
  SCRIPT="$0"
  # Catch common issue: script has been symlinked
  if [ -L "$SCRIPT" ]
  then
    SCRIPT="$(readlink "$0")"
    # If link is relative
    case "$SCRIPT" in
      /*) ;; # fine
      *) SCRIPT=$( dirname "$0" )/$SCRIPT;; # fix
    esac
  fi

  # Work out root from script location
  FUSEKI_HOME="$( cd "$( dirname "$SCRIPT" )" && pwd )"

fi

# Deal with more Cygwin path issues
if [ "$cygwin" == "true" ]
then
  FUSEKI_HOME=`cygpath -w "$FUSEKI_HOME"`
 fi

#echo "DEBUG: FUSEKI_HOME=$FUSEKI_HOME"

if [ ! -e "$FUSEKI_HOME" ]
then
  echo "$FUSEKI_HOME does not exist" 1>&2
  exit 1
fi


# Find a location for the pid file
if [ -z "$FUSEKI_RUN" ]
then
  FUSEKI_RUN=$(findDirectory -w /var/run /usr/var/run $FUSEKI_HOME /tmp)
fi

# Get PID file name
if [ -z "$FUSEKI_PID" ]
then
  FUSEKI_PID="$FUSEKI_RUN/fuseki.pid"
fi

# Log directory
if [ -z "$FUSEKI_LOGS" ]
then
  FUSEKI_LOGS="$FUSEKI_HOME/log"
fi

# Std Err and Out log
if [ -z "$FUSEKI_LOGS_STDERROUT" ]
then
  FUSEKI_LOGS_STDERROUT="$FUSEKI_LOGS/stderrout.log"
fi

# Data directory
if [ -z "$FUSEKI_DATA_DIR" ]
then
  FUSEKI_DATA_DIR="$FUSEKI_HOME/DB"
fi

# Set up JAVA if not set
if [ -z "$JAVA" ]
then
  JAVA=$(which java)
fi
if [ -z "$JAVA" ]
then
  echo "Cannot find a Java JDK. Please set either set JAVA or put java (>=1.7) in your PATH." 2>&2
  exit 1
fi

# The location of the start up JAR
FUSEKI_START=$FUSEKI_HOME/fuseki-server.jar

# Deal with Cygwin path issues
if [ "$cygwin" == "true" ]
then
  DATA_DIR=`cygpath -w "$FUSEKI_DATA_DIR"`
  FUSEKI_START=`cygpath -w "$FUSEKI_START"`
else
  DATA_DIR="$FUSEKI_DATA_DIR"
fi

#######################################
#
# TODO - Read these items from a Config file!
#

# Some JVM settings
if [ -z "$JAVA_OPTIONS" ]
then
  JAVA_OPTIONS="-Xmx1200M"
fi


# Default Fuseki Arguments
if [ -z "$FUSEKI_ARGS" ]
then
  if [ -z "$FUSEKI_CONF" ]
  then
    FUSEKI_ARGS="--update --loc=$DATA_DIR /ds"
  else
    FUSEKI_ARGS="--config=$FUSEKI_CONF"
  fi
fi

if [ ! -z "$FUSEKI_HOME" ]
then
    FUSEKI_ADDITIONAL_ARGS=(--home "$FUSEKI_HOME")
fi

# Run command

RUN_ARGS=(${JAVA_OPTIONS[@]} -jar "$FUSEKI_START" "${FUSEKI_ADDITIONAL_ARGS[@]}" $FUSEKI_ARGS)
RUN_CMD=("$JAVA" "${RUN_ARGS[@]}")


#######################################

#####################################################
# Comment these out after you're happy with what
# the script is doing.
#####################################################
if (( DEBUG ))
then
  echo "FUSEKI_HOME    =  $FUSEKI_HOME"
  echo "FUSEKI_CONF    =  $FUSEKI_CONF"
  echo "FUSEKI_RUN     =  $FUSEKI_RUN"
  echo "FUSEKI_PID     =  $FUSEKI_PID"
  echo "FUSEKI_ARGS    =  $FUSEKI_ARGS"
  echo "FUSEKI_START   =  $FUSEKI_START"
  echo "CONFIGS        =  ${CONFIGS[*]}"
  echo "JAVA           =  $JAVA"
  echo "JAVA_OPTIONS   =  ${JAVA_OPTIONS[*]}"
  echo "RUN_ARGS       =  ${RUN_ARGS[@]}"
  echo "RUN_CMD        =  ${RUN_CMD[@]}"
fi

NO_START=0

# Life cycle functions
start() {

  if (( NO_START )); then
    echo "Not starting Fuseki - NO_START=1";
    exit
  fi

  # Make sure the data and log directories exist
  mkdir -p "$FUSEKI_DATA_DIR"
  mkdir -p "$FUSEKI_LOGS"
  if [ ! -z "$FUSEKI_USER" ]
  then
    chown "$FUSEKI_USER" "$FUSEKI_DATA_DIR" "$FUSEKI_LOGS"
  fi

  echo -n "Starting Fuseki: "
  if type start-stop-daemon > /dev/null 2>&1
  then
    unset CH_USER
    if [ -n "$FUSEKI_USER" ]
    then
      CH_USER="--chuid $FUSEKI_USER"
    fi
    if start-stop-daemon --start $CH_USER --chdir "$FUSEKI_HOME" --background --make-pidfile --pidfile "$FUSEKI_PID" --startas /bin/bash -- -c "exec $JAVA ${RUN_ARGS[*]} > $FUSEKI_LOGS_STDERROUT 2>&1"
    then
      sleep 1
      if running "$FUSEKI_PID"
      then
        print_started
      else
        print_failed
      fi
    fi
  else
    if running $FUSEKI_PID
    then
        echo "Already Running!"
        exit 1
      else
        # dead pid file - remove
        rm -f "$FUSEKI_PID"
    fi
    if [ "$FUSEKI_USER" ]
    then
      touch "$FUSEKI_PID"
      chown "$FUSEKI_USER" "$FUSEKI_PID"
      su - "$FUSEKI_USER" -c "
        echo 'Redirecting Fuseki stderr/stdout to $FUSEKI_LOGS_STDERROUT'
        exec ${RUN_CMD[*]} &> '$FUSEKI_LOGS_STDERROUT' &
        disown \$!
        echo \$! > '$FUSEKI_PID'"
    else
      echo "Redirecting Fuseki stderr/stdout to $FUSEKI_LOGS_STDERROUT"
      exec "${RUN_CMD[@]}" &> "$FUSEKI_LOGS_STDERROUT" &
      disown $!
      echo $! > "$FUSEKI_PID"
    fi

    print_started
  fi
}

print_started() {
  echo "STARTED Fuseki `date`"
  echo "PID=$(cat "$FUSEKI_PID" 2>/dev/null)"
}

print_failed() {
  echo "FAILED to start Fuseki `date`"
}

delete_fuseki_pid_file() {
  rm -f "$FUSEKI_PID"
}

stop() {
  echo -n "Stopping Fuseki: "

  if ! running "$FUSEKI_PID"
    then
    echo "Fuseki is not running"
    exit 1
  fi

  ###############################################################
  # !!!! This code needs to be improved, too many repeats !!!!  #
  ###############################################################
  if type start-stop-daemon > /dev/null 2>&1; then
    start-stop-daemon --stop --pidfile "$FUSEKI_PID" --chdir "$FUSEKI_HOME" --startas "$JAVA" --signal HUP

    ## Die after a 30 second timeout
    TIMEOUT=30
    while running "$FUSEKI_PID"; do
      if (( TIMEOUT-- == 0 )); then
        start-stop-daemon --stop --pidfile "$FUSEKI_PID" --chdir "$FUSEKI_HOME" --startas "$JAVA" --signal KILL
      fi
        sleep 1
    done
    delete_fuseki_pid_file
    echo OK
  else
    PID=$(cat "$FUSEKI_PID" 2>/dev/null)
    kill "$PID" 2>/dev/null

    TIMEOUT=30
    while running $FUSEKI_PID; do
      if (( TIMEOUT-- == 0 )); then
        kill -KILL "$PID" 2>/dev/null
      fi
      sleep 1
    done
    delete_fuseki_pid_file
    echo "OK"
  fi
}

case $1 in
  start)
    start
  ;;
  stop)
    stop
  ;;
  restart)
    stop
    start
  ;;
  status)
    if running $FUSEKI_PID
    then
      echo -n "Fuseki is running with pid: "
      echo `cat "$FUSEKI_PID"`
    else
      echo "Fuseki is not running"
    fi
  ;;
  *)
    usage
  ;;
esac

exit 0
