#!/bin/sh

# PROVIDE: squid
# REQUIRE: LOGIN
# KEYWORD: shutdown
#
# Note:
# Set "squid_enable=yes" in either /etc/rc.conf, /etc/rc.conf.local or
# /etc/rc.conf.d/squid to activate Squid.
#
# Additional variables you can define in one of these files:
#
# squid_chdir:	the directory into which the rc system moves into before
# 		starting Squid. Default: /var/squid
#
# squid_conf:	The configuration file that Squid should use.
#		Default: %%PREFIX%%/etc/squid/squid.conf
#
# squid_fib:	The alternative routing table id that Squid should use.
#		Default: none
#		See setfib(1) for further details. Note that the setfib(2)
#		system call is not available in FreeBSD versions prior to 7.1.
#
# squid_user:	The user id that should be used to run the Squid master
#		process. Default: squid.
#		Note that you probably need to define "squid_user=root" if
#		you want to run Squid in reverse proxy setups or if you want
#		Squid to listen on a "privileged" port < 1024.
#
# squid_group:	The group id that should be used to run the Squid master
#		process. Default: squid
#		Note that it affects squid pid dir also, where SHM files
#		may be stored on some OS (see r391555)
#
# squid_maxwait:	Seconds to wait for squid PID file
#		Default: 10
#
# squid_pidfile:
#		The name (including the full path) of the Squid
#		master process' PID file.
#		Default: /var/run/squid/squid.pid.
#		You only need to change this if you changed the
#		corresponding entry in your Squid configuration.
#
# squid_flags:	Additional commandline arguments for Squid you might want to
#		use. See squid(8) for further details.
#
# squid_krb5_ktname:
#		Alternative Kerberos 5 Key Table.
#		Default: none
# squid_krb5_config:
#		Alternative Kerberos 5 config file
#		Default: none

. /etc/rc.subr

name=squid
rcvar=squid_enable

# Make sure that we invoke squid with "-f ${squid_conf}"; define this
# variable early so reload_cmd and stop_precmd pick it up:

# Workaround for https://bugs.squid-cache.org/show_bug.cgi?id=5390 until squid-7 is ported
#extra_commands="reload configtest"
#reload_cmd=squid_reload
start_precmd=squid_prestart
start_postcmd=squid_getpid
# Workaround for https://bugs.squid-cache.org/show_bug.cgi?id=5390 until squid-7 is ported
#stop_precmd=squid_prestop
#configtest_cmd=squid_configtest
#reload_precmd=squid_configtest
#restart_precmd=squid_configtest

# squid(8) will not start if ${squid_conf} is not present so try
# to catch that beforehand via ${required_files} rather than make
# squid(8) crash.

squid_load_rc_config()
{
	: ${squid_chdir:=/var/squid}
	: ${squid_conf:=%%PREFIX%%/etc/squid/squid.conf}
	: ${squid_enable:=NO}
	: ${squid_program:=%%PREFIX%%/sbin/squid}
	: ${squid_pidfile:=/var/run/squid/squid.pid}
	: ${squid_maxwait:=10}
	: ${squid_user:=squid}
	: ${squid_group:=squid}

	required_args="-f ${squid_conf}"
	required_dirs=$chdir
	required_files=$squid_conf
	command_args="${required_args} ${squid_flags}"
#	We used to need it in squid3 to match pid and proc name
#	procname="?squid-*"
	pidfile=$squid_pidfile
}

squid_prestart()
{
	# create piddir if it's missing (for example if /var/run is tmpfs)
	squid_piddir=${pidfile%/*}
	if [ ! -d "${squid_piddir}" ]; then
		echo "Creating PID directory ${squid_piddir}"
		mkdir ${squid_piddir} && chown ${squid_user}:${squid_group} ${squid_piddir} && chmod 750 ${squid_piddir}|| return $?
	fi

	# setup KRB5_KTNAME:
	squid_krb5_ktname=${squid_krb5_ktname:-"NONE"}
	if [ "${squid_krb5_ktname}" != "NONE" ]; then
		export KRB5_KTNAME=${squid_krb5_ktname}
	fi

	# setup KRB5_CONFIG:
	squid_krb5_config=${squid_krb5_config:-"NONE"}
	if [ "${squid_krb5_config}" != "NONE" ]; then
		export KRB5_CONFIG=${squid_krb5_config}
	fi

	# setup FIB tables:
	if command -v check_namevarlist > /dev/null 2>&1; then
		check_namevarlist fib && return 0
	fi

	${SYSCTL} net.fibs >/dev/null 2>&1 || return 0

	squid_fib=${squid_fib:-"NONE"}
	if [ "${squid_fib}" != "NONE" ]; then
		command="setfib -F $squid_fib $command"
	else
		return 0
	fi

	# Workaround for https://bugs.squid-cache.org/show_bug.cgi?id=5390 until squid-7 is ported
	#squid_configtest
}

squid_reload()
{
	$command $required_args $squid_flags -k reconfigure
}

squid_configtest()
{
	echo "Performing sanity check on ${name} configuration."
	if $command $required_args $squid_flags -k check; then
		echo "Configuration for ${name} passes."
		return 0
	else
		return $?
	fi
}

squid_getpid()
{
	# retrieve the PID of the Squid master process explicitly here
	# in case rc.subr was unable to determine it:
	if [ -z "$rc_pid" ]; then
		squid_secs=0
		while ! [ -f ${pidfile} ]; do
			if [ ${squid_maxwait} -le ${squid_secs} ]; then
				echo "give up waiting for pidfile"
				break
			fi
			sleep 1
			echo -n "."
			: $(( squid_secs+=1 ))
		done
		read _pid _junk <${pidfile}
		[ -z "${_pid}" ] || pid=${_pid}
	else
		pid=${rc_pid}
	fi
}

squid_prestop()
{
	command_args="$command_args -k shutdown"
	squid_configtest
}

load_rc_config $name
squid_load_rc_config
run_rc_command $1
