#!/sbin/openrc-run
# Copyright 1999-2019 Gentoo Authors
# Distributed under the terms of the GNU General Public License v2

SQUID_SVCNAME=$( echo "${RC_SVCNAME}" | tr -cd '[a-zA-Z0-9]' )

extra_started_commands="reload rotate"

depend() {
	use dns net
}

checkconfig() {
	local CONFFILES="/etc/squid/${RC_SVCNAME}.conf /etc/squid/${RC_SVCNAME}.include /etc/squid/${RC_SVCNAME}.include.*"
	if [ ! -f /etc/squid/${RC_SVCNAME}.conf ]; then
		eerror "You need to create /etc/squid/${RC_SVCNAME}.conf first."
		eerror "The main configuration file and all included file names should have the following format:"
		eerror "${CONFFILES}"
		eerror "An example can be found in /etc/squid/squid.conf.default"
		return 1
	fi

	local PIDFILE=$(cat ${CONFFILES} 2>/dev/null 3>/dev/null | awk '/^[ \t]*pid_filename[ \t]+/ { print $2 }')
	[ -z ${PIDFILE} ] && PIDFILE=/run/squid.pid
	if [ /run/${RC_SVCNAME}.pid != ${PIDFILE} ]; then
		eerror "/etc/squid/${RC_SVCNAME}.conf must set pid_filename to"
		eerror "   /run/${RC_SVCNAME}.pid"
		eerror "CAUTION: http_port, cache_dir and *_log parameters must be different than"
		eerror "         in any other instance of squid."
		eerror "Make sure the main configuration file and all included file names have the following format:"
		eerror "${CONFFILES}"
		return 1
	fi

	# Maximum file descriptors squid can open is determined by:
	# a basic default of N=1024
	#  ... altered by ./configure --with-filedescriptors=N
	#  ... overridden on production by squid.conf max_filedescriptors (if,
	#  and only if, setrlimit() RLIMIT_NOFILE is able to be built+used).
	# Since we do not configure hard coded # of filedescriptors anymore,
	# there is no need for ulimit calls in the init script.
	# Use max_filedescriptors in squid.conf instead.

	local CACHE_SWAP=$(cat ${CONFFILES} 2>/dev/null 3>/dev/null | awk '/^[ \t]*cache_dir[ \t]+/ { if ( $2 == "rock" ) printf "%s/rock ", $3; else if ( $2 == "coss" ) printf "%s/stripe ", $3; else printf "%s/00 ", $3; }')
	[ -z "$CACHE_SWAP" ] && CACHE_SWAP="/var/cache/squid/00"
	
	local x
	for x in $CACHE_SWAP ; do
		if [ ! -e $x ] ; then
			ebegin "Initializing cache directory ${x%/*}"
			local ORIG_UMASK=$(umask)
			umask 027

			if ! (mkdir -p ${x%/*} && chown squid ${x%/*}) ; then
				eend 1
				return 1
			fi

			local INIT_CACHE_RESPONSE="$(/usr/sbin/squid -z -N -f /etc/squid/${RC_SVCNAME}.conf -n ${SQUID_SVCNAME} 2>&1)"
			if [ $? != 0 ] || echo "$INIT_CACHE_RESPONSE" | grep -q "erminated abnormally" ; then
				umask $ORIG_UMASK
				eend 1
				echo "$INIT_CACHE_RESPONSE"
				return 1
			fi

			umask $ORIG_UMASK
			eend 0
			break
		fi
	done
	
	return 0
}

start() {
	checkconfig || return 1
	checkpath -d -q -m 0750 -o squid:squid /run/${RC_SVCNAME}

	# see https://wiki.squid-cache.org/MultipleInstances
	ebegin "Starting ${RC_SVCNAME} (service name ${SQUID_SVCNAME}) with KRB5_KTNAME=\"${SQUID_KEYTAB}\" /usr/sbin/squid ${SQUID_OPTS} -f /etc/squid/${RC_SVCNAME}.conf -n ${SQUID_SVCNAME}"
	KRB5_KTNAME="${SQUID_KEYTAB}" /usr/sbin/squid ${SQUID_OPTS} -f /etc/squid/${RC_SVCNAME}.conf -n ${SQUID_SVCNAME}
	eend $? && sleep 1
}

stop() {
	ebegin "Stopping ${RC_SVCNAME} with /usr/sbin/squid -k shutdown -f /etc/squid/${RC_SVCNAME}.conf -n ${SQUID_SVCNAME}"
	if /usr/sbin/squid -k shutdown -f /etc/squid/${RC_SVCNAME}.conf -n ${SQUID_SVCNAME} ; then
		# Now we have to wait until squid has _really_ stopped.
		sleep 1
		if [ -f /run/${RC_SVCNAME}.pid ] ; then
			einfon "Waiting for squid to shutdown ."
			cnt=0
			while [ -f /run/${RC_SVCNAME}.pid ] ; do
				cnt=$(expr $cnt + 1)
				if [ $cnt -gt 60 ] ; then
					# Waited 120 seconds now. Fail.
					echo
					eend 1 "Failed."
					break
				fi
				sleep 2
				printf "."
			done
			echo
		fi
	else
		eerror "Squid shutdown failed, probably service is already down."
	fi
	eend 0
}

reload() {
	checkconfig || return 1
	ebegin "Reloading ${RC_SVCNAME} with /usr/sbin/squid -k reconfigure -f /etc/squid/${RC_SVCNAME}.conf -n ${SQUID_SVCNAME}"
	/usr/sbin/squid -k reconfigure -f /etc/squid/${RC_SVCNAME}.conf -n ${SQUID_SVCNAME}
	eend $?
}

rotate() {
	service_started ${RC_SVCNAME} || return 1
	ebegin "Rotating ${RC_SVCNAME} logs with /usr/sbin/squid -k rotate -f /etc/squid/${RC_SVCNAME}.conf -n ${SQUID_SVCNAME}"
	/usr/sbin/squid -k rotate -f /etc/squid/${RC_SVCNAME}.conf -n ${SQUID_SVCNAME}
	eend $?
}
