#!/bin/sh
#
# $FreeBSD$
#
# PROVIDE: uwsginl
# REQUIRE: DAEMON
# KEYWORD: shutdown
#
# Add the following lines to /etc/rc.conf to enable uwsgi:
#
# uwsginl_enable (bool):	Set it to "YES" to enable uwsgi
#				Default is "NO".
# uwsginl_socket (path/str):	Set the path to the uwsgi unix socket
#				Default is /tmp/uwsginl.sock.
# uwsginl_socket_mode (int):	Set the mode of the socket.
#				Default is 660.
# uwsginl_socket_owner (str):	Set the owner of the socket.
#				Default is uwsgi:www.
# uwsginl_emperor (bool):	Set it to "YES" to run uwsgi in emperor mode
#				Default is "NO".
# uwsginl_configfile (path):	Set the path to the config file
#				Default is %%PREFIX%%/etc/uwsginl/uwsginl.ini.
# uwsginl_vassals_dir (path):	Set the path to the vassals directory
#				Default is %%PREFIX%%/etc/uwsginl/vassals.
# uwsginl_logfile (path):	Set the path to the uwsgi log file
#				Default is /var/log/uwsginl.log.
# uwsginl_pidfile (path):	Set the path to the uwsgi pid file
#				Default is /var/run/uwsginl.pid.
# uwsginl_uid (int):		Set the UID of the process to run with
#				Default is uwsgi.
# uwsginl_gid (int):		Set the GID of the process to run with
#				Default is uwsgi.
# uwsginl_flags (str):		Set the uwsgi command line arguments
#				Default is "-L".
# uwsginl_procname (str):	Define to "uWSGI" if you start uwsgi with
#				--auto-procname option.
#
# If you would like to have multiple uWSGI instances running, you can
# define multiple profiles:
#
# uwsginl_profiles (str):	Set the list of uwsgi profiles
#				Default is "".
#
# For each profile you can then define different options (except for
# uwsginl_enable) using the syntax uwsginl_<profile>_<option>

. /etc/rc.subr

name="uwsginl"
rcvar=uwsginl_enable

load_rc_config $name

command=%%PREFIX%%/bin/uwsginl

: ${uwsginl_enable="NO"}
: ${uwsginl_socket="/tmp/${name}.sock"}
: ${uwsginl_socket_mode="660"}
: ${uwsginl_socket_owner="uwsgi:www"}
: ${uwsginl_configfile="%%PREFIX%%/etc/uwsginl/uwsginl.ini"}
: ${uwsginl_profiles=""}
: ${uwsginl_logfile="/var/log/${name}.log"}
: ${uwsginl_pidfile="/var/run/${name}.pid"}
: ${uwsginl_uid="uwsgi"}
: ${uwsginl_gid="uwsgi"}
: ${uwsginl_flags="-L"}
: ${uwsginl_emperor="NO"}
: ${uwsginl_vassals_dir="%%PREFIX%%/etc/uwsginl/vassals"}

is_uwsginl_profile() {
	local profile

	for profile in $uwsginl_profiles; do
		if [ "$profile" = "$1" ]; then
			return 0
		fi
	done

	return 1
}

if [ -n "${uwsginl_profiles}" ]; then
	if [ -n "$2" ]; then
		profile="$2"
		if ! is_uwsginl_profile $profile; then
			echo "$0: no such profile defined in uwsginl_profiles."
		        exit 1
		fi
		eval uwsginl_socket=\${uwsginl_${profile}_socket:-"/tmp/${name}-${profile}.sock"}
		eval uwsginl_socket_mode=\${uwsginl_${profile}_socket_mode:-${uwsginl_socket_mode}}
		eval uwsginl_socket_owner=\${uwsginl_${profile}_socket_owner:-${uwsginl_socket_owner}}
		eval uwsginl_logfile=\${uwsginl_${profile}_logfile:-"/var/log/${name}-${profile}.log"}
		eval uwsginl_pidfile=\${uwsginl_${profile}_pidfile:-"/var/run/${name}-${profile}.pid"}
		eval uwsginl_uid=\${uwsginl_${profile}_uid:-"${uwsginl_uid}"}
		eval uwsginl_gid=\${uwsginl_${profile}_gid:-"${uwsginl_gid}"}
		eval uwsginl_flags=\${uwsginl_${profile}_flags:-"${uwsginl_flags}"}
		eval uwsginl_procname=\${uwsginl_${profile}_procname:-"${uwsginl_procname}"}
		eval uwsginl_emperor=\${uwsginl_${profile}_emperor:-"${uwsginl_emperor}"}
		eval uwsginl_vassals_dir=\${uwsginl_${profile}_vassals_dir:-"${uwsginl_vassals_dir}"}
		eval uwsginl_configfile=\${uwsginl_${profile}_configfile:-"${uwsginl_configfile}"}
	elif [ -n "$1" ]; then
		for profile in ${uwsginl_profiles}; do
			echo "Processing ${name} profile: ${profile}"
			%%PREFIX%%/etc/rc.d/uwsginl $1 ${profile}
		done
		exit 0
	fi
fi

pidfile=${uwsginl_pidfile}
start_precmd=start_precmd
stop_postcmd=stop_postcmd
reload_precmd=reload_precmd
brutalreload_cmd=brutalreload_cmd
sig_stop="INT"
extra_commands="reload brutalreload"
procname=${uwsginl_procname}

start_precmd()
{
	rc_flags=""
	if [ -e ${uwsginl_configfile} ]; then
		rc_flags="--ini ${uwsginl_configfile} "
	fi

	if checkyesno uwsginl_emperor; then
		echo "Running uWSGI as Emperor. Vassals loaded from "$uwsginl_vassals_dir
		required_dirs=${uwsginl_vassals_dir}
		rc_flags=${rc_flags}"--emperor-pidfile ${uwsginl_pidfile} -d ${uwsginl_logfile} --emperor ${uwsginl_vassals_dir}"
		rc_flags=${rc_flags}" --vassals-set uid=${uwsginl_uid} --vassals-set gid=${uwsginl_gid}"
		rc_flags=${rc_flags}" --vassals-set chmod-socket=${uwsginl_socket_mode} --vassals-set chown-socket=${uwsginl_socket_owner}"
	else
		rc_flags=${rc_flags}"--master  --uid ${uwsginl_uid} --gid ${uwsginl_gid} --pidfile ${uwsginl_pidfile} -d ${uwsginl_logfile}"
		rc_flags=${rc_flags}" -s ${uwsginl_socket} --chmod-socket=${uwsginl_socket_mode} --chown-socket=${uwsginl_socket_owner}"
	fi

	rc_flags=${rc_flags}" ${uwsginl_flags}"
}

stop_postcmd()
{
	rm -f ${uwsginl_pidfile} ${uwsginl_socket}
}

reload_precmd()
{
	echo "Gracefully reloading ${name} without closing the main sockets."
}

brutalreload_cmd()
{
	echo "Reloading ${name} without closing the main sockets."

	reload_precmd=""
	sig_reload="TERM"
	run_rc_command ${rc_prefix}reload $rc_extra_args || return 1
}

run_rc_command "$1"
