#!/sbin/runscript
# Copyright 1999-2013 Gentoo Foundation
# Distributed under the terms of the GNU General Public License v2
# $Id$

daemon_clamd="/usr/sbin/clamd"
daemon_freshclam="/usr/bin/freshclam"
daemon_milter="/usr/sbin/clamav-milter"

extra_commands="logfix"

depend() {
	use net
	provide antivirus
}

get_config() {
	clamconf | sed 's/["=]//g' | \
	awk "{
	if(\$0==\"Config file: $1.conf\") S=1
	if(S==1&&\$0==\"\") {
		print \"$3\"
		exit
	}
	if(S==1&&\$1~\"^$2\$\") {
		print \$2!=\"disabled\"?\$2:\"$3\"
		exit
	}
	}"
}

start() {
	# populate variables and fix log file permissions
	logfix

	if [ "${START_CLAMD}" = "yes" ]; then
		checkpath --quiet --mode 755 \
			--owner "${clamd_user}":"${clamd_user}" \
			--directory `dirname ${clamd_socket}`
		if [ -S "${clamd_socket}" ]; then
			rm -f ${clamd_socket}
		fi
		ebegin "Starting clamd"
		start-stop-daemon --start --quiet \
			--nicelevel ${CLAMD_NICELEVEL:-0} \
			--exec ${daemon_clamd}
		eend $? "Failed to start clamd"
	fi

	if [ "${START_FRESHCLAM}" = "yes" ]; then
		checkpath --quiet --mode 755 \
			--owner "${clamd_user}":"${clamd_user}" \
			--directory `dirname ${clamd_socket}`
		ebegin "Starting freshclam"
		start-stop-daemon --start --quiet \
			--nicelevel ${FRESHCLAM_NICELEVEL:-0} \
			--exec ${daemon_freshclam} -- -d
		retcode=$?
		if [ ${retcode} = 1 ]; then
			eend 0
			einfo "Virus databases are already up to date."
		else
			eend ${retcode} "Failed to start freshclam"
		fi
	fi

	if [ "${START_MILTER}" = "yes" ]; then
		if [ -z "${MILTER_CONF_FILE}" ]; then
			MILTER_CONF_FILE="/etc/clamav-milter.conf"
		fi

		ebegin "Starting clamav-milter"
		start-stop-daemon --start --quiet \
			--nicelevel ${MILTER_NICELEVEL:-0} \
			--exec ${daemon_milter} -- -c ${MILTER_CONF_FILE}
		eend $? "Failed to start clamav-milter"
	fi
}

stop() {
	if [ "${START_CLAMD}" = "yes" ]; then
		ebegin "Stopping clamd"
		start-stop-daemon --stop --quiet --name clamd
		eend $? "Failed to stop clamd"
	fi
	if [ "${START_FRESHCLAM}" = "yes" ]; then
		ebegin "Stopping freshclam"
		start-stop-daemon --stop --quiet --name freshclam
		eend $? "Failed to stop freshclam"
	fi
	if [ "${START_MILTER}" = "yes" ]; then
		ebegin "Stopping clamav-milter"
		start-stop-daemon --stop --quiet --name clamav-milter
		eend $? "Failed to stop clamav-milter"
	fi
}

logfix() {
	clamd_socket=$(get_config clamd LocalSocket /run/clamav/clamd.sock)
	clamd_user=$(get_config clamd User clamav)
	freshclam_user=$(get_config freshclam DatabaseOwner clamav)

	if [ "${START_CLAMD}" = "yes" ]; then
		# fix clamd log permissions
		# (might be clobbered by logrotate or something)
		local logfile=$(get_config clamd LogFile)
		if [ -n "${logfile}" ]; then
			checkpath --quiet \
				--owner "${clamd_user}":"${clamd_user}" \
				--mode 640 \
				--file ${logfile}
		fi
	fi

	if [ "${START_FRESHCLAM}" = "yes" ]; then
		# fix freshclam log permissions
		# (might be clobbered by logrotate or something)
		local logfile=$(get_config freshclam UpdateLogFile)
		if [ -n "${logfile}" ]; then
			checkpath --quiet \
				--owner "${freshclam_user}":"${freshclam_user}" \
				--mode 640 \
				--file ${logfile}
		fi
	fi
}
