#! /bin/bash

### BEGIN INIT INFO
# Provides:          hsqldb-server
# Required-Start:    $syslog
# Required-Stop:     $syslog
# Should-Start:      $remote_fs
# Should-Stop:       $remote_fs
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Short-Description: start HSQLDB database server
# Description: HSQLDB is an SQL relational database engine written in Java.
### END INIT INFO


PATH=/sbin:/bin:/usr/sbin:/usr/bin

test -f /usr/share/java/hsqldb.jar || exit 5

. /lib/lsb/init-functions


pidfile_name()
{
	local servertype=$1
	echo /var/run/hsqldb/${servertype}.pid
}


is_running()
{
	local servertype=$1
	local pidfile=$(pidfile_name $servertype)

	if [ ! -f "$pidfile" ]; then
		return 1
	fi

	local pid=$(cat "$pidfile")

	if ! kill -0 "$pid" 2>/dev/null; then
		return 1
	fi

	if [ ! -e /proc/"$pid"/exe ]; then
		return 1
	fi

        return 0
}


is_configured()
{
	local servertype=$1
	if grep -E -q '^[[:blank:]]*server\.database' /etc/hsqldb/${servertype}.properties; then
		return 0
	else
		return 1
	fi
}


run_shutdown()
{
	local servertype=$1

	hsqldb-sqltool --rcfile /etc/hsqldb/sqltool.rc --sql "SHUTDOWN;" localhost-${servertype}-sa /dev/null
}


d_start()
{
	local servertype=$1
	local pidfile=$(pidfile_name $servertype)

	local class
	if [ $servertype = server ]; then
		class=Server
	else
		class=WebServer
	fi

	mkdir -p $(dirname $pidfile) || return 1
	chown hsqldb:hsqldb $(dirname $pidfile) || return 1

	su - hsqldb -c "
cd /var/lib/hsqldb
umask 077
java -classpath /usr/share/java/hsqldb.jar org.hsqldb.${class} </dev/null > >(logger -t hsqldb -p local0.info >/dev/null 2>&1) 2>&1 &
umask 022
echo \$! >${pidfile}"
}


d_stop()
{
	local servertype=$1
	local pidfile=$(pidfile_name $servertype)

	if is_running $servertype; then
		run_shutdown $servertype
		sleep 2
		is_running $servertype && \
			start-stop-daemon --stop --quiet --oknodo --pidfile $pidfile
	fi
	rm -f $pidfile
}


case "$1" in
    start)
	status=0
	log_daemon_msg "Starting HSQLDB database server"
	for type in server webserver; do
		if is_running $type; then
			log_progress_msg "$type"
		elif is_configured $type; then
			d_start $type && log_progress_msg "$type"
			status=$(($status || $?))
		fi
	done
	log_end_msg $status
	;;
    stop)
	status=0
	log_daemon_msg "Stopping HSQLDB database server"
	for type in server webserver; do
		d_stop $type && log_progress_msg "$type"
		status=$(($status || $?))
	done
	log_end_msg $status
	;;
    status)
	status=0
	for type in server webserver; do
		is_running
		typestatus=$?
		if [ $typestatus -eq 0 ]; then
			log_success_msg "HSQLDB $type is running."
		else
			log_failure_msg "HSQLDB $type is not running."
		fi
		status=$(($status || $typestatus))
	done
	exit $((3 * $status))
	;;
    restart|force-reload)
	status=0
	log_daemon_msg "Restarting HSQLDB database server"
	for type in server webserver; do
		d_stop $type && sleep 1 && d_start $type
		status=$(($status || $?))
		log_progress_msg $type
	done
	log_end_msg $status
	;;
    try-restart)
	if $0 status >/dev/null; then
		$0 restart
	else
		exit 0
	fi
	;;
    reload)
	exit 3
	;;
    *)
	log_failure_msg "Usage: $0 {start|stop|status|restart|try-restart|reload|force-reload}"
	exit 2
	;;
esac
