#!/bin/sh
# Copyright (c) 2000-2015 Synology Inc. All rights reserved.
PACKAGE_NAME="ThreatPrevention"
PACKAGE_TARGET_DIR="/var/packages/${PACKAGE_NAME}/target"
PACKAGE_USR_CONF_DIR="/var/packages/${PACKAGE_NAME}/etc"
PACKAGE_UPSTART_DIR="${PACKAGE_TARGET_DIR}/upstart"
PACKAGE_STRING_FILE="${PACKAGE_TARGET_DIR}/ui/texts/${SYNOPKG_DSM_LANGUAGE}/strings"
DB_SCHEMA="${PACKAGE_TARGET_DIR}/schema/syno_create_postgresql"
CREATE_DB="/usr/bin/createdb"
PSQL="/usr/bin/psql"
SENSOR_CONF="${PACKAGE_USR_CONF_DIR}/sensor.conf"
SYNOTPSTOOL="${PACKAGE_TARGET_DIR}/tool/synotpstool"
UPSTART_DIR="/etc/init"
UPSTART_FILES=`/bin/ls ${PACKAGE_UPSTART_DIR}`

SYNOGETKV="/usr/syno/bin/synogetkeyvalue"

PACKAGE_DIR="/var/packages/${PACKAGE_NAME}"
DSM_INDEX_ADD="/usr/syno/bin/pkgindexer_add"
DSM_INDEX_DEL="/usr/syno/bin/pkgindexer_del"
PKG_INDEXDB_PATH="${PACKAGE_DIR}/target/indexdb"
PKG_APP_PATH="${PACKAGE_DIR}/target/ui"

NET_EVENT_DIR="/usr/local/libexec/net"
NET_RESTART_SENSOR_EVENTS="ipv4_change gateway_change topology_change"

SYSLOGNG_DIR="/usr/local/etc/syslog-ng/patterndb.d"
LOGROATAE_DIR="/usr/local/etc/logrotate.d"
UDC_DIR="/usr/syno/etc/user.data.conf"
UDEV_RULES_DIR="/lib/udev/rules.d"

PROC_TPS_NETFILTER="/proc/sys/net/bridge/syno-bridge-nf-cond-call-netfilter-threat-prevention"

IsTPSDBExisted()
{
	if [ `${PSQL} -U postgres -lqt | awk '{ print $1 }' | grep -e "^synotps$" | wc -l` -gt 0 ]; then
		return 0
	fi
	return 1
}

PrintMessage()
{
	local section=$1
	local key=$2

	local string=`/usr/syno/bin/get_section_key_value ${PACKAGE_STRING_FILE} $section $key`

	if [ 0 == $? ]; then
		echo $string > $SYNOPKG_TEMP_LOGFILE
	fi
}

CreateHelpAndString()
{
	if [ -n "$SYNOPKG_PKG_STATUS" ]; then
		${DSM_INDEX_ADD} ${PKG_APP_PATH}/index.conf ${PKG_INDEXDB_PATH}/appindexdb
		${DSM_INDEX_ADD} ${PKG_APP_PATH}/helptoc.conf ${PKG_INDEXDB_PATH}/helpindexdb
	fi
}

RemoveHelpAndString()
{
	if [ -n "$SYNOPKG_PKG_STATUS" ]; then
		${DSM_INDEX_DEL} ${PKG_APP_PATH}/index.conf ${PKG_INDEXDB_PATH}/appindexdb
		${DSM_INDEX_DEL} ${PKG_APP_PATH}/helptoc.conf ${PKG_INDEXDB_PATH}/helpindexdb
	fi
}

RemoveCronTask()
{
	sed -i '/ThreatPrevention/d' /etc/crontab
	sed -i '/api=SYNO\.TPS\./d' /etc/crontab
	reload crond
}

AddCronTask()
{
	RemoveCronTask

	cat ${PACKAGE_TARGET_DIR}/etc/crontab/crontab >> /etc/crontab
	reload crond

	${SYNOTPSTOOL} --patch-scheduler
}

StopSynoipsProcesses()
{
	killall synotpstool > /dev/null 2>&1
	killall synoipsuserdatacollector > /dev/null 2>&1
	killall synotps_rotate > /dev/null 2>&1

	# kill all postgres query process for synotps table
	local pids=`ps www | grep -v grep | grep 'postgres: postgres synotps' | awk '{print $1}'`
	for pid in ${pids}; do
		kill -INT ${pid} > /dev/null 2>&1
	done

	if pidof Syno-Suricata-Main ; then
		stop synosuricata
	fi
	if pidof synotpsd ; then
		stop synotpsd
	fi

	if [ -e ${PROC_TPS_NETFILTER} ]; then
		echo "off" > ${PROC_TPS_NETFILTER}
	fi
}

start()
{
	if ! pidof postgres ; then
		# postgres is not running, abort.
		return -1;
	fi

	if ! IsTPSDBExisted; then
		${CREATE_DB} -U postgres synotps
		${PSQL} -U postgres synotps < ${DB_SCHEMA}
		/bin/rm -f ${PACKAGE_USR_CONF_DIR}/build_signature_database.conf
	fi

	# Add net events
	for event in ${NET_RESTART_SENSOR_EVENTS}; do
		/bin/mkdir -p ${NET_EVENT_DIR}/${event}
		ln -sf "${PACKAGE_TARGET_DIR}/scripts/tps_restart_sensor.sh" "${NET_EVENT_DIR}/${event}/tps_${event}.sh"
	done

	# Add udev rules
	ln -sf "${PACKAGE_TARGET_DIR}/udev/50-tps-reload.rules" "${UDEV_RULES_DIR}/50-tps-reload.rules"
	reload udevd

	AddCronTask

	# Install syslog-ng config
	ln -sf "${PACKAGE_TARGET_DIR}/etc/syslog-ng/synotps.conf" "${SYSLOGNG_DIR}/synotps.conf"
	reload syslog-ng

	# Install logrotate.d config
	ln -sf "${PACKAGE_TARGET_DIR}/etc/logrotate.d/synotps" "${LOGROATAE_DIR}/synotps"
	reload synologrotated

	# Install user data collection config
	ln -sf "${PACKAGE_TARGET_DIR}/etc/user.data.conf/ThreatPrevention.config" "${UDC_DIR}/ThreatPrevention.config"

	ln -sf "${PACKAGE_TARGET_DIR}/webapi/SYNO.TPS.lib" /usr/syno/synoman/webapi/SYNO.TPS.lib
	CreateHelpAndString

	for f in ${UPSTART_FILES}; do
		/bin/cp -f ${PACKAGE_UPSTART_DIR}/$f ${UPSTART_DIR}/$f
	done

	${SYNOTPSTOOL} --sensor -e

	PrintMessage common warning_dont_remove_usb_storage_desc
}

stop()
{
	${SYNOTPSTOOL} --sensor -d
	StopSynoipsProcesses

	for f in ${UPSTART_FILES}; do
		/bin/rm -f ${UPSTART_DIR}/$f
	done

	rm -f /usr/syno/synoman/webapi/SYNO.TPS.lib
	RemoveHelpAndString

	# remove net events
	for event in ${NET_RESTART_SENSOR_EVENTS}; do
		/bin/rm "${NET_EVENT_DIR}/${event}/tps_${event}.sh"
	done

	#clear status files
	/bin/rm -f /tmp/.synotps_running_status
	/bin/rm -f /tmp/.synoips_updating

	RemoveCronTask

	# remove syslog-ng config
	rm "${SYSLOGNG_DIR}/synotps.conf"
	reload syslog-ng

	# remove logrotatd config
	rm "${LOGROATAE_DIR}/synotps"
	reload synologrotated

	# remove user data collecton config
	rm "${UDC_DIR}/ThreatPrevention.config"

	# remove udev rules
	rm "${UDEV_RULES_DIR}/50-tps-reload.rules"
	reload udevd
}

case $1 in
	start)
		start
	;;
	stop)
		stop
	;;
	status)
	;;
esac

exit 0
