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

extra_started_commands="reload rotate"

depend() {
	use dns net
}

checkconfig() {
	if [ ! -f /etc/squid/${SVCNAME}.conf ]; then
		eerror "You need to create /etc/squid/${SVCNAME}.conf first."
		eerror "An example can be found in /etc/squid/squid.conf.default"
		return 1
	fi

	local PIDFILE=$(awk '/^[ \t]*pid_filename[ \t]+/ { print $2 }' < /etc/squid/${SVCNAME}.conf)
	[ -z ${PIDFILE} ] && PIDFILE=/run/squid.pid
	if [ /run/${SVCNAME}.pid != ${PIDFILE} ]; then
		eerror "/etc/squid/${SVCNAME}.conf must set pid_filename to"
		eerror "   /run/${SVCNAME}.pid"
		eerror "CAUTION: http_port, cache_dir and *_log parameters must be different than"
		eerror "         in any other instance of squid."
		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=$(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; }' < /etc/squid/${SVCNAME}.conf)
	[ -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/${SVCNAME}.conf 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/${SVCNAME}

	ebegin "Starting ${SVCNAME}"
	KRB5_KTNAME="${SQUID_KEYTAB}" /usr/sbin/squid ${SQUID_OPTS} -f /etc/squid/${SVCNAME}.conf
	eend $? && sleep 1
}

stop() {
	ebegin "Stopping ${SVCNAME}"
	if /usr/sbin/squid -k shutdown -f /etc/squid/${SVCNAME}.conf ; then
		# Now we have to wait until squid has _really_ stopped.
		sleep 1
		if [ -f /run/${SVCNAME}.pid ] ; then
			einfon "Waiting for squid to shutdown ."
			cnt=0
			while [ -f /run/${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
				echo -n "."
			done
			echo
		fi
	else
		eerror "Squid shutdown failed, probably service is already down."
	fi
	eend 0
}

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

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