#!/bin/sh /etc/rc.common
# Copyright (C) 2008-2011 OpenWrt.org

START=99

CFGFILE=/var/etc/polipo.conf

start() {
	config_load 'polipo'

	config_get_bool enabled "general" 'enabled' '0'
	[ $enabled -gt 0 ] || return 1

	mkdir -m 0755 -p /var/etc/
	echo '### AUTOGENERATED CONFIGURATION' > $CFGFILE
	echo '### DO NOT EDIT' >> $CFGFILE
	echo '### SEE /etc/config/polipo INSTEAD' >> $CFGFILE
	echo '' >> $CFGFILE

	config_foreach polipo_config 'polipo'

	# handle values that are disabled when not defined or empty
	echo "### VALUES THAT ARE DISABLED WHEN EMPTY" >> $CFGFILE
	polipo_atom "cache" "diskCacheRoot" '"' "1" >> $CFGFILE
	polipo_atom "general" "logFile" '"' "1" >> $CFGFILE
	polipo_atom "general" "localDocumentRoot" '"' "1" >> $CFGFILE

	service_start /usr/sbin/polipo -c "$CFGFILE"
}

stop() {
	service_stop /usr/sbin/polipo -c "$CFGFILE"
}

polipo_config() {
	echo "### SECTION $1" >> $CFGFILE

	string_options='authCredentials authRealm dnsNameServer forbiddenFile
		forbiddenUrl logFacility pidFile parentAuthCredentials parentProxy
		proxyAddress proxyName redirector socksParentProxy socksProxyType
		socksUserName uncachableFile'

	number_options='bigBufferSize chunkCriticalMark chunkHighMark chunkLowMark
		diskCacheDirectoryPermissions diskCacheFilePermissions
		diskCacheTruncateSize diskCacheWriteoutOnClose forbiddenRedirectCode
		logFilePermissions logLevel maxDiskCacheEntrySize maxDiskEntries
		maxObjectsWhenIdle maxPipelineTrain maxSideBuffering maxWriteoutWhenIdle
		objectHashTableSize objectHighMark pmmFirstSize pmmSize proxyPort
		publicObjectLowMark redirectorRedirectCode replyUnpipelineSize
		serverMaxSlots serverSlots serverSlots1 maxAgeFraction'

	time_options='clientTimeout diskCacheTruncateTime diskCacheUnlinkTime
		dnsGethostbynameTtl dnsMaxTimeout dnsNegativeTtl idleTime maxAge
		maxConnectionAge maxConnectionRequests maxExpiresAge maxNoModifiedAge
		replyUnpipelineTime serverExpireTime serverIdleTimeout serverTimeout
		smallRequestTime'

	multistate_options='censorReferer dnsQueryIPv6 dnsUseGethostbyname
		dontTrustVaryETag expectContinue pipelineAdditionalRequests
		useTemporarySourceAddress relaxTransparency'

	boolean_options='cacheIsShared daemonise disableConfiguration disableIndexing
		disableLocalInterface disableProxy disableServersList disableVia
		dontCacheCookies dontCacheRedirects logSyslog mindlesslyCacheVary
		preciseExpiry proxyOffline scrubLogs laxHttpParser'

	string_list_options='allowedClients censoredHeaders'

	number_list_options='allowedPorts tunnelAllowedPorts'

	for option in $string_options; do
		polipo_atom "$1" "$option" '"' >> $CFGFILE
	done

	for option in $number_options; do
		polipo_atom "$1" "$option" >> $CFGFILE
	done

	for option in $time_options; do
		polipo_atom "$1" "$option" >> $CFGFILE
	done
	
	for option in $multistate_options; do
		polipo_atom "$1" "$option" >> $CFGFILE
	done

	for option in $boolean_options; do
		polipo_boolean "$1" "$option" >> $CFGFILE
	done

	for option in $string_list_options; do
		polipo_list "$1" "$option" '"' >> $CFGFILE
	done
	
	for option in $number_list_options; do
		polipo_list "$1" "$option" >> $CFGFILE
	done
}

polipo_atom() {
	local SECTION=$1
	local OPTION=$2
	local QUOTE=$3
	local EMPTY_DISABLED=${4:-0}

	config_get _value "$SECTION" "$OPTION"
	[ -n "$_value" -o "$EMPTY_DISABLED" -eq "1" ] && {
		echo "$OPTION = ${QUOTE}${_value}${QUOTE}"
	}
}

polipo_boolean() {
	local SECTION=$1
	local OPTION=$2

	config_get_bool _value "$SECTION" "$OPTION"
	[ -n "$_value" ] && {
		[ "$_value" -eq "1" ] && _value="true" || _value="false"
		echo "$OPTION = $_value"
	}
}

polipo_list() {
	local SECTION=$1
	local OPTION=$2
	local QUOTE=$3

	config_get _value "$SECTION" "$OPTION"
	
	[ "$SECTION" = general ] && [ "$OPTION" = allowedClients ] && {
		case "$_value" in
			*127.0.0.1*) : ;;
			*) _value="127.0.0.1 $_value" ;;
		esac
	}
	
	[ -n "$_value" ] && {
		echo -n "$OPTION = "
		
		local FIRST=1
		for entry in $_value; do
			[ "$FIRST" -ne "1" ] && echo -n ", " || FIRST=0
			
			echo -n "${QUOTE}${entry}${QUOTE}"
		done
		
		echo ''
	}
}

