#!/bin/sh

# PROVIDE: uwsgi
# REQUIRE: DAEMON
# KEYWORD: shutdown
#
# Add the following lines to /etc/rc.conf to enable uwsgi:
#
# uwsgi_enable (bool):		Set it to "YES" to enable uwsgi
#				Default is "NO".
# uwsgi_socket (path/str):	Set the path to the uwsgi unix socket
#				Default is /tmp/uwsgi.sock.
# uwsgi_socket_mode (int):	Set the mode of the socket.
#				Default is 660.
# uwsgi_socket_owner (str):	Set the owner of the socket.
#				Default is uwsgi:www.
# uwsgi_emperor (bool):		Set it to "YES" to run uwsgi in emperor mode
#				Default is "NO".
# uwsgi_configfile (path):	Set the path to the config file
#				Default is %%PREFIX%%/etc/uwsgi/uwsgi.ini.
# uwsgi_vassals_dir (path):	Set the path to the vassals directory
#				Default is %%PREFIX%%/etc/uwsgi/vassals.
# uwsgi_logfile (path):		Set the path to the uwsgi log file
#				Default is /var/log/uwsgi.log.
# uwsgi_pidfile (path):		Set the path to the uwsgi pid file
#				Default is /var/run/uwsgi.pid.
# uwsgi_uid (int):		Set the UID of the process to run with
#				Default is uwsgi.
# uwsgi_gid (int):		Set the GID of the process to run with
#				Default is uwsgi.
# uwsgi_flags (str):		Set the uwsgi command line arguments
#				Default is "-L".
# uwsgi_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:
#
# uwsgi_profiles (str):		Set the list of uwsgi profiles
#				Default is "".
#
# For each profile you can then define different options (except for
# uwsgi_enable) using the syntax uwsgi_<profile>_<option>

. /etc/rc.subr

name="uwsgi"
rcvar=uwsgi_enable

load_rc_config $name

command=%%PREFIX%%/bin/uwsgi-%%PYTHON_VER%%

: ${uwsgi_enable="NO"}
: ${uwsgi_socket="/tmp/${name}.sock"}
: ${uwsgi_socket_mode="660"}
: ${uwsgi_socket_owner="uwsgi:www"}
: ${uwsgi_configfile="%%PREFIX%%/etc/uwsgi/uwsgi.ini"}
: ${uwsgi_profiles=""}
: ${uwsgi_logfile="/var/log/${name}.log"}
: ${uwsgi_pidfile="/var/run/${name}.pid"}
: ${uwsgi_uid="uwsgi"}
: ${uwsgi_gid="uwsgi"}
: ${uwsgi_flags="-L"}
: ${uwsgi_emperor="NO"}
: ${uwsgi_vassals_dir="%%PREFIX%%/etc/uwsgi/vassals"}

is_uwsgi_profile() {
	local profile

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

	return 1
}

if [ -n "${uwsgi_profiles}" ]; then
	if [ -n "$2" ]; then
		profile="$2"
		if ! is_uwsgi_profile $profile; then
			echo "$0: no such profile defined in uwsgi_profiles."
		        exit 1
		fi
		eval uwsgi_socket=\${uwsgi_${profile}_socket:-"/tmp/${name}-${profile}.sock"}
		eval uwsgi_socket_mode=\${uwsgi_${profile}_socket_mode:-${uwsgi_socket_mode}}
		eval uwsgi_socket_owner=\${uwsgi_${profile}_socket_owner:-${uwsgi_socket_owner}}
		eval uwsgi_logfile=\${uwsgi_${profile}_logfile:-"/var/log/${name}-${profile}.log"}
		eval uwsgi_pidfile=\${uwsgi_${profile}_pidfile:-"/var/run/${name}-${profile}.pid"}
		eval uwsgi_uid=\${uwsgi_${profile}_uid:-"${uwsgi_uid}"}
		eval uwsgi_gid=\${uwsgi_${profile}_gid:-"${uwsgi_gid}"}
		eval uwsgi_flags=\${uwsgi_${profile}_flags:-"${uwsgi_flags}"}
		eval uwsgi_procname=\${uwsgi_${profile}_procname:-"${uwsgi_procname}"}
		eval uwsgi_emperor=\${uwsgi_${profile}_emperor:-"${uwsgi_emperor}"}
		eval uwsgi_vassals_dir=\${uwsgi_${profile}_vassals_dir:-"${uwsgi_vassals_dir}"}
		eval uwsgi_configfile=\${uwsgi_${profile}_configfile:-"${uwsgi_configfile}"}
	elif [ -n "$1" ]; then
		for profile in ${uwsgi_profiles}; do
			echo "Processing ${name} profile: ${profile}"
			%%PREFIX%%/etc/rc.d/uwsgi $1 ${profile}
		done
		exit 0
	fi
fi

pidfile=${uwsgi_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=${uwsgi_procname}

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

	if checkyesno uwsgi_emperor; then
		echo "Running uWSGI as Emperor. Vassals loaded from "$uwsgi_vassals_dir
		required_dirs=${uwsgi_vassals_dir}
		rc_flags=${rc_flags}"--emperor-pidfile ${uwsgi_pidfile} -d ${uwsgi_logfile} --emperor ${uwsgi_vassals_dir}"
		rc_flags=${rc_flags}" --vassals-set uid=${uwsgi_uid} --vassals-set gid=${uwsgi_gid}"
		rc_flags=${rc_flags}" --vassals-set chmod-socket=${uwsgi_socket_mode} --vassals-set chown-socket=${uwsgi_socket_owner}"
	else
		rc_flags=${rc_flags}"--master  --uid ${uwsgi_uid} --gid ${uwsgi_gid} --pidfile ${uwsgi_pidfile} -d ${uwsgi_logfile}"
		rc_flags=${rc_flags}" -s ${uwsgi_socket} --chmod-socket=${uwsgi_socket_mode} --chown-socket=${uwsgi_socket_owner}"
	fi

	rc_flags=${rc_flags}" ${uwsgi_flags}"
}

stop_postcmd()
{
	rm -f ${uwsgi_pidfile} ${uwsgi_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"
