#!/bin/sh

# customized items of package
PACKAGE_NAME=$SYNOPKG_PKGNAME
DSM_VERSION_NUMBER=$SYNOPKG_DSM_VERSION_BUILD
DSM_VERSION_MAJOR=$SYNOPKG_DSM_VERSION_MAJOR
PKG_STATUS=$SYNOPKG_PKG_STATUS

PRIVATE_LOCATION="/var/packages/ProxyServer/target"
PROXY_TOOL_PATH="${PRIVATE_LOCATION}/tools"
SQUID_PID=$PRIVATE_LOCATION"/squid/var/run/squid.pid"

# general routines
PACKAGE_ENABLED="/var/packages/${PACKAGE_NAME}/enabled"

BinDir="/var/packages/ProxyServer/target/bin"

cache_directory_ready()
{
	local CACHE_DIR="$1"
	local CACHE_VOLUME="`/usr/bin/readlink -f ${CACHE_DIR} | /usr/bin/cut -d '/' -f2`"
	[ -z "${CACHE_DIR}" ] || [ -z "${CACHE_VOLUME}" ] && return 1
	[ -e "${CACHE_DIR}" ] && [ ! -d "${CACHE_DIR}" ] && return 1
	# check cache directory is on volume
	[ "`/usr/bin/awk '{print $2}' /proc/mounts | /usr/bin/grep "^/${CACHE_VOLUME}$" | /usr/bin/wc -l`" = "0" ] && return 1
	[ -d "${CACHE_DIR}" ] && return 0
	/bin/mkdir -p "${CACHE_DIR}" \
		&& /bin/chown -R "nobody:nobody" "${CACHE_DIR}" \
		&& /bin/chmod -R 755 "${CACHE_DIR}"
	# check any fail
	[ "$?" != "0" ] && return 1
	return 0
}

check_cache_directory()
{
	local CACHE_CONF="${PRIVATE_LOCATION}/squid/etc/cache_setting_syno.conf"
	local SYNO_CONF="${PRIVATE_LOCATION}/squid/etc/squid.syno"
	local JSON_CONF="${PRIVATE_LOCATION}/squid/etc/setting_syno.json"
	local DEFAULT_VOLUME="`/usr/bin/readlink -f ${PRIVATE_LOCATION} | /usr/bin/cut -d '/' -f2`"

	# check current setting
	[ ! -f "${CACHE_CONF}" ] && return 1
	local CACHE_DIR="`/usr/bin/awk 'match($0, /cache_dir ufs (.*?) [0-9]* [0-9]* [0-9]*/, m) {print m[1]}' "${CACHE_CONF}"`"
	cache_directory_ready "${CACHE_DIR}"
	[ "$?" = "0" ] && return 0

	# recover to default volume
	local CACHE_DIR="/${DEFAULT_VOLUME}/@squid"
	cache_directory_ready "${CACHE_DIR}"
	if [ "$?" = "0" ]; then
		# overwrite setting
		/usr/bin/sed -i "s/cache_dir ufs .* \([0-9]* [0-9]* [0-9]*\)/cache_dir ufs ${CACHE_DIR//\//\\/} \1/g" "${CACHE_CONF}"
		/usr/bin/sed -i "s/\"cache_dir_path\".*:.*\".*\"/\"cache_dir_path\" : \"${CACHE_DIR//\//\\/}\"/g" "${JSON_CONF}"
		echo "cachedir_path=${CACHE_DIR}" > "${SYNO_CONF}"
		return 0
	fi

	return 1
}

start_package()
{
        if synowireless --get-bridge-list | grep nat | grep true > /dev/null; then
			if synowireless --get-bridge-list | grep status | grep enable > /dev/null; then
				${PROXY_TOOL_PATH}/synoproxy_restore_transparent.sh
			fi
        else
				${PROXY_TOOL_PATH}/synoproxy_remove_transparent.sh
        fi
        if [ 1 -eq `grep wpad_enable ${PRIVATE_LOCATION}/squid/etc/setting_syno.json | grep true -c` ]; then
                WPAD_IFNAME=`cat ${PRIVATE_LOCATION}/squid/etc/setting_syno.json  | grep wpad_interface | cut -d":" -f2 | tr -d ' ",'`
                WPAD_IP_ADDR=`ip addr | grep $WPAD_IFNAME | grep inet | awk -F" " '{print $2}' | cut -d"/" -f1`
                ${PROXY_TOOL_PATH}/synoproxywpad.sh --install $WPAD_IP_ADDR
        fi

	#kill squid if pid exist
	if [ -f ${SQUID_PID} ]; then
                killall squid
	fi

	chown -R nobody:nobody ${PRIVATE_LOCATION}/squid/var/logs

	# check before squid -z
	check_cache_directory
	[ "$?" != "0" ] && exit 1

	${BinDir}/squid -z
	# waiting refresh swap directories
	local CACHE_REBUILD_RETRY="30"
	while [ "0" -lt "`/usr/bin/ps -ef | /usr/bin/grep -v grep | /usr/bin/grep "squid.*-z" | /usr/bin/wc -l`" ]; do
		if [ "0" -gt "$CACHE_REBUILD_RETRY" ]; then
			# Rebuild cache timeout, continue...
			break
		fi
		sleep 1
		CACHE_REBUILD_RETRY="$(($CACHE_REBUILD_RETRY - 1))"
	done
	/sbin/initctl start pkg-ProxyServer
	if [ 0 -ne $? ]; then
		/bin/echo "Proxy Server start failed" > ${SYNOPKG_TEMP_LOGFILE}
	fi
}

stop_package()
{
	/sbin/initctl stop pkg-ProxyServer
	local COUNT=10
	while [ "0" -lt "`/usr/bin/ps -ef | /usr/bin/grep -v grep | /usr/bin/grep -c squid`" ]; do
		if [ "0" -gt "$COUNT" ]; then
			break
		fi
		sleep 1
		COUNT=$(($COUNT-1))
	done

	#remove transparent settings
	${PROXY_TOOL_PATH}/synoproxy_remove_transparent.sh
	#remove wpad
	if [ 1 -eq `grep wpad_enable /var/packages/ProxyServer/target/squid/etc/setting_syno.json | grep true -c` ]; then
		${PROXY_TOOL_PATH}/synoproxywpad.sh --uninstall
	fi
}

case $1 in
	start)
		start_package
                exit 0
                ;;
        stop)
                stop_package
                exit 0
                ;;
        status)
                COUNT_SQUID=`ps -aux | grep -c squid`
                if [ -f ${SQUID_PID} ] || [ 1 -lt ${COUNT_SQUID} ]; then
                        exit 0
                else
                        exit 1
                fi
                ;;
        killall)
                ;;
        log)
                exit 0
                ;;
esac

