#!/bin/sh /etc/rc.common

START=95
STOP=10

PIDFILE=/var/run/privoxy.pid
CFGFILE=/var/etc/privoxy.conf
CFGTEMP=/var/etc/privoxy.conf.tmp

_uci2conf() {
	# redefined callback for options when calling config_load
	config_cb() {
		if [ ."$2" != ."privoxy" ]; then
			option_cb() { return 0; }
		else
			option_cb()
			{
				# $1	name of variable
				# $2	value
				local __OPT="$1"
				local __VAL="$2"
				case $__OPT in
					confdir|templdir|temporary_directory|logdir|logfile)
						# needs to be handled separately because we need to set permissions
						# AND needs to be defined first because of a BUG inside privoxy
						# require directories to be defined first inside config 
						;;
					debug_*)
						[ $__VAL -eq 0 ] && return	# not set ignore
						echo -e "debug\t$(echo $__OPT | sed -e 's#debug_##g')" >> $CFGTEMP ;;
					*)
						# detect list options (LENGTH) and ignore
						echo $__OPT | grep -i "_LENGTH" >/dev/null 2>&1 && return
						# detect list options (ITEM) and ignore
						echo $__OPT | grep -i "_ITEM" >/dev/null 2>&1 && __OPT=$(echo $__OPT | sed -e "s#_ITEM.*##g")
						# uci only accept "_" but we need "-"
						local __OPT=$(echo $__OPT | sed -e "s#_#-#g")
						# write to config
						echo -e "$__OPT\t$__VAL" >> $CFGTEMP
						;;
				esac
			}

			list_cb()
			{
				option_cb "$@"
			}
		fi
	}

	# temporary config file
	# privoxy need read access
	mkdir -m0755 -p /var/etc
	echo "" > $CFGTEMP
	chmod 644 $CFGTEMP
	chgrp privoxy $CFGTEMP

	echo '### AUTO-GENERATED CONFIGURATION'	   >> $CFGTEMP
	echo '### USED BY PRIVOXY'		   >> $CFGTEMP
	echo '### DO NOT EDIT'			   >> $CFGTEMP
	echo '### SEE /etc/config/privoxy INSTEAD' >> $CFGTEMP
	echo ''					   >> $CFGTEMP

	# logdir and logfile
	# privoxy needs read/write access
	_LOGDIR=$(uci -q get privoxy.privoxy.logdir)   || _LOGDIR="/var/log"
	_LOGFILE=$(uci -q get privoxy.privoxy.logfile) || _LOGFILE="privoxy.log"
	mkdir -m0755 -p $_LOGDIR
	touch $_LOGDIR/$_LOGFILE
	chmod 664 $_LOGDIR/$_LOGFILE
	chown privoxy:privoxy $_LOGDIR/$_LOGFILE
	echo -e "logdir\t$_LOGDIR" >> $CFGTEMP
	echo -e "logfile\t$_LOGFILE" >> $CFGTEMP

	# confdir
	# privoxy needs read access (possibly write access)
	_CONFDIR=$(uci -q get privoxy.privoxy.confdir) || _CONFDIR="/etc/privoxy"
	chmod 755 $_CONFDIR
	chmod 664 $_CONFDIR/*
	chgrp privoxy $_CONFDIR $_CONFDIR/*
	echo -e "confdir\t$_CONFDIR" >> $CFGTEMP

	# templdir
	# privoxy need read access
	_TEMPLDIR=$(uci -q get privoxy.privoxy.templdir)	# no default needed
	if [ -z "$_TEMPLDIR" ]; then
		chmod 755 $_CONFDIR/templates
		chmod 644 $_CONFDIR/templates/*
		chgrp privoxy $_CONFDIR/templates $_CONFDIR/templates/*
	else
		chmod 755 $_TEMPLDIR
		chmod 644 $_TEMPLDIR/*
		chgrp privoxy $_TEMPLDIR $_TEMPLDIR/*
		echo -e "templdir\t$_TEMPLDIR" >> $CFGTEMP
	fi

	# temporary-directory
	# privoxy needs read/write access
	_TMP_DIR=$(uci -q get privoxy.privoxy.temporary_directory)	# no default needed
	if [ -n "$_TMP_DIR" ]; then
		mkdir -m0750 -p $_TMP_DIR
		chown privoxy:privoxy $_TMP_DIR
		echo -e "temporary-directory\t$_TMP_DIR" >> $CFGTEMP
	fi

	config_load "privoxy"	# calling above option_cb() and write the rest into $CFGTEMP

	# move temp to final privoxy readable configuration
	mv -f $CFGTEMP $CFGFILE
	return 0
}

boot() {
	# wait a given time (default 10 seconds) before startup
	# to wait for interfaces to come up / not using hotplug events during boot
	_start() {
		[ $1 -gt 0 ] && {
			logger -p daemon.info -t "privoxy[]" "Scheduled startup in $1 seconds"
			sleep $1
		}
		start
	}

	local _DELAY
	_DELAY=$(uci_get "privoxy" "system" "boot_delay" "10")
	_start $_DELAY &
	return 0
}

shutdown() {
	rm -f /tmp/privoxy.hotplug
	stop
}

start() {
	# if already running do nothing
	local _PID=$(cat $PIDFILE 2>/dev/null)
	kill -1 $_PID 2>/dev/null && return 0

	_uci2conf
	/usr/sbin/privoxy --pidfile $PIDFILE --user privoxy.privoxy $CFGFILE
	touch /tmp/privoxy.hotplug

	# verify startup
	_PID=$(cat $PIDFILE 2>/dev/null)
	kill -1 $_PID 2>/dev/null
	local _ERR=$?
	[ $_ERR -eq 0 ] \
		&& logger -p daemon.notice -t "privoxy[$_PID]" "Started successfully"\
		|| logger -p daemon.warn -t "privoxy[]" "Failed to start"
	return $_ERR
}

reload() {
	# reload is also used by luci-app-privoxy
	local _PID=$(cat $PIDFILE 2>/dev/null)
	kill -1 $_PID 2>/dev/null
	if [ $? -eq 0 ]; then
		# only restart if already running
		restart
	else
		# only start if enabled
		enabled && start
	fi
	return 0
}

stop() {
	local _PID=$(cat $PIDFILE 2>/dev/null)
	kill -15 $_PID 2>/dev/null
	sleep 1			# give time to shutdown
	local _tmp=$(pgrep privoxy | tr "\n" " ")
	if [ -z "$_tmp" ]; then
		logger -p daemon.notice -t "privoxy[$_PID]" "Shutdown successfully"
	else
		kill -9 $_tmp	# Normally never come here
		logger -p daemon.warn -t "privoxy[$_tmp]" "Shutdown forced by KILL"
	fi
	return 0
}