#!/bin/sh

# customized items of package
PACKAGE_NAME=$SYNOPKG_PKGNAME
PACKAGE_VER=$SYNOPKG_PKGVER
PRIVATE_LOCATION="/var/packages/MailServer/target"

PKG_APP_PATH="${PRIVATE_LOCATION}/app"
PKG_INDEXDB_PATH="${PRIVATE_LOCATION}/indexdb"
APP_PATH="/usr/syno/synoman/webman/3rdparty/MailServer"

# links
SENDMAIL_SRC="${PRIVATE_LOCATION}/sbin/sendmail"
SENDMAIL_LINK="/usr/sbin/sendmail"
PAM_SMTP_LINK="/etc/pam.d/smtp"
PAM_DOVECOT_LINK="/etc/pam.d/dovecot"

# general routines
DSM_CONFIG="/etc.defaults/synoinfo.conf"
DSM_INDEX_ADD="/usr/syno/bin/pkgindexer_add"
DSM_INDEX_DEL="/usr/syno/bin/pkgindexer_del"
PACKAGE_ENABLED="/var/packages/${PACKAGE_NAME}/enabled"

#
VOLUME=`/usr/bin/readlink ${PRIVATE_LOCATION} | /usr/bin/cut -d'/' -f2`

MAILCONF="/var/packages/MailServer/etc/mailserver.conf"
SPOOL_POSTFIX=/var/spool/postfix
SPOOL_MAILSCANNER=/var/spool/MailScanner
MAILSERVER_POSTFIX=/${VOLUME}/@postfix
VOLUME_MAILSCANNER=/${VOLUME}/@MailScanner
PERL5_SITE_DIR="/lib/perl5/site_perl/5.8.6"
PERL5_SITE_MODS="Mail/SpamAssassin Mail/SpamAssassin.pm"
VOLUME_CLAMAV=/${VOLUME}/@clamav
SHARE_CLAMAV="/var/packages/MailServer/target/share/clamav"

#alias import
ALIAS_DB="/var/packages/MailServer/etc/alias.db"
ORG_ALIAS_CONFIG="/usr/syno/etc/packages/MailServer/OldConf/aliases"

# syno_mailserverd
MSDaemon=/var/packages/MailServer/target/sbin/syno_mailserverd
MSDaemonPID=/var/run/syno_mailserverd.pid

MAILLOG_CONF="/usr/local/etc/syslog-ng/patterndb.d/mailserver_log.conf"
MAILLOG_ROTATE_CONF="/usr/local/etc/logrotate.d/mailserver_rotate.conf"

SetCrontab()
{
	if ! grep -q "/var/packages/MailServer/target/bin/syno_clean_junk --clean" "/etc/crontab"; then
		cat "/etc/crontab" > "/etc/crontab.$$"
		echo "0	0	*	*	*	root	/var/packages/MailServer/target/bin/syno_clean_junk --clean" >> "/etc/crontab.$$"
		mv "/etc/crontab.$$" "/etc/crontab"
		/bin/kill -HUP `/bin/cat "/var/run/crond.pid"`
	fi


	if ! grep -q "/var/packages/MailServer/target/bin/MailScanner/clean.quarantine" "/etc/crontab"; then
		cat "/etc/crontab" > "/etc/crontab.$$"
		echo "0	1	*	*	*	root	/var/packages/MailServer/target/bin/MailScanner/clean.quarantine" >> "/etc/crontab.$$"
		mv "/etc/crontab.$$" "/etc/crontab"
		/bin/kill -HUP `/bin/cat "/var/run/crond.pid"`
	fi
}

UnSetCrontab()
{
	if grep -q "/var/packages/MailServer/target/bin/syno_clean_junk --clean" "/etc/crontab"; then
		grep -v "syno_clean_junk --clean" "/etc/crontab" > "/etc/crontab.$$"
		mv "/etc/crontab.$$" "/etc/crontab"
		/bin/kill -HUP `/bin/cat "/var/run/crond.pid"`
	fi

	if grep -q "/var/packages/MailServer/target/bin/MailScanner/clean.quarantine" "/etc/crontab"; then
		grep -v "clean.quarantine" "/etc/crontab" > "/etc/crontab.$$"
		mv "/etc/crontab.$$" "/etc/crontab"
		/bin/kill -HUP `/bin/cat "/var/run/crond.pid"`
	fi
}

CheckEnv()
{
	if [ ! -d ${MAILSERVER_POSTFIX} ]; then
		/bin/rm -rf ${MAILSERVER_POSTFIX} 2>/dev/null
		cp -a /var/packages/MailServer/target/var/spool/postfix ${MAILSERVER_POSTFIX}
	fi

	/bin/rm -rf ${SPOOL_POSTFIX} 2>/dev/null
	ln -sf ${MAILSERVER_POSTFIX} ${SPOOL_POSTFIX}
	chmod +x ${MAILSERVER_POSTFIX}/public

	# mailscanner
	mkdir -p ${VOLUME_MAILSCANNER}/incoming
	mkdir -p ${VOLUME_MAILSCANNER}/quarantine
	mkdir -p ${VOLUME_MAILSCANNER}/spamassassin
	chown -R postfix ${VOLUME_MAILSCANNER}/incoming
	chown -R postfix ${VOLUME_MAILSCANNER}/quarantine
	chown -R postfix ${VOLUME_MAILSCANNER}/spamassassin
	ln -sf ${VOLUME_MAILSCANNER} ${SPOOL_MAILSCANNER}

	# clamav
	if [ ! -d ${VOLUME_CLAMAV} ]; then
		mkdir -p ${VOLUME_CLAMAV}
	fi
	#chown clamav:clamav ${VOLUME_CLAMAV}
	ln -sf ${VOLUME_CLAMAV} ${SHARE_CLAMAV}

	# generate magic file
	${PRIVATE_LOCATION}/bin/file -C ${PRIVATE_LOCATION}/share/misc/magic/
}

CreateLinks()
{
	# create sendmail link for vacation binary
	ln -sf ${SENDMAIL_SRC} ${SENDMAIL_LINK}

	# create dovecot link for pam.d login
	# ==> move to 'DaemonConfSet.sh smtp'

	for mod in ${PERL5_SITE_MODS}; do
		mkdir -p ${PERL5_SITE_DIR}/`dirname $mod`
		ln -s ${PRIVATE_LOCATION}/${PERL5_SITE_DIR}/$mod ${PERL5_SITE_DIR}/$mod
	done
	
}

LogInit()
{
	
	if [ -d "/usr/local/etc/syslog-ng/patterndb.d/" ]; then
		mkdir -p /${VOLUME}/@maillog

		echo -e "destination d_maillog { file(\"/${VOLUME}/@maillog/maillog\"); };
			filter f_mail_loglevel { level(info..emerg); };
			filter f_mail { facility(mail) and not match (imap) and not match(MailScanner); };
			log { source(src); filter(f_mail); filter(f_mail_loglevel); destination(d_maillog); };" > ${MAILLOG_CONF}
			
		echo -e "/${VOLUME}/@maillog/maillog
			{
        		size 10M
	        	missingok
		        postrotate
				/sbin/initctl reload syslog-ng || true
			endscript
			}" > ${MAILLOG_ROTATE_CONF}

		initctl reload syslog-ng
		fi
}

LogStop()
{
	if [ -d "/usr/local/etc/syslog-ng/patterndb.d/" ]; then
		rm -rf ${MAILLOG_CONF}
		rm -rf ${MAILLOG_ROTATE_CONF}
		initctl reload syslog-ng
	fi
}

ClearLinks()
{
	# remove links
        rm -rf ${PAM_SMTP_LINK}
	rm -rf ${PAM_DOVECOT_LINK}
	rm -rf ${SENDMAIL_LINK}
	rm -rf ${SPOOL_MAILSCANNER}

	for mod in ${PERL5_SITE_MODS}; do
		rm -f ${PERL5_SITE_DIR}/$mod
	done
}

UpdateConf()
{
	#import origin alias setting, only in alias db doesn't exist and origin aliases exist
	if [ ! -e $ALIAS_DB ]; then
		`${PRIVATE_LOCATION}/bin/syno_alias_import $ORG_ALIAS_CONFIG`
	fi
}


start()
{
	# create links
	CreateLinks

	# index help and add help to dsm
	${DSM_INDEX_ADD} ${PKG_APP_PATH}/index.conf ${PKG_INDEXDB_PATH}/appindexdb
	${DSM_INDEX_ADD} ${PKG_APP_PATH}/helptoc.conf ${PKG_INDEXDB_PATH}/helpindexdb

	# move postfix queue folder to volume
	CheckEnv

	# update configs
	UpdateConf

	LogInit

	# generate default config and import old setting
	`${PRIVATE_LOCATION}/scripts/DefaultConfGen.sh`
	`${PRIVATE_LOCATION}/scripts/DaemonConfSet.sh smtp`
	`${PRIVATE_LOCATION}/scripts/DaemonConfSet.sh spam`
	`${PRIVATE_LOCATION}/scripts/DaemonConfSet.sh protocol`
	`${PRIVATE_LOCATION}/scripts/DaemonConfSet.sh alias`

	${PRIVATE_LOCATION}/bin/syno_gen_login_map
	${PRIVATE_LOCATION}/bin/syno_access_map
	${PRIVATE_LOCATION}/bin/syno_bcc_map
	${PRIVATE_LOCATION}/bin/syno_spam_blackwhite

	# start mail server
	# if service is enable, start daemon
	SmtpEnable=`/bin/get_key_value $MAILCONF smtp_enabled`
	if [ "$SmtpEnable" = "yes" ]; then
		`${PRIVATE_LOCATION}/scripts/PostfixDaemon.sh start`
	fi

	# always start dovecot
	`${PRIVATE_LOCATION}/scripts/DovecotDaemon.sh start`

	local AntiVirusEnable=`/bin/get_key_value $MAILCONF anti_virus_enable`
	if [ x"${AntiVirusEnable}" = x"yes" ]; then
		${PRIVATE_LOCATION}/bin/syno_anti-virus start
	fi

	local SpamEnable=`/bin/get_key_value $MAILCONF spam_enable`
	if [ x"${SpamEnable}" = x"yes" -o x"${AntiVirusEnable}" = x"yes" ]; then
		${PRIVATE_LOCATION}/scripts/MailScanner.sh start
	fi

	echo "Starting MailServer Daemon..."
	${MSDaemon}

	SetCrontab
}

stop()
{
	echo "Stop MailServer Daemon..."
	kill `cat ${MSDaemonPID}`

	# stop mail server
	`${PRIVATE_LOCATION}/scripts/PostfixDaemon.sh stop`
	`${PRIVATE_LOCATION}/scripts/DovecotDaemon.sh stop`
	${PRIVATE_LOCATION}/bin/syno_anti-virus stop
	${PRIVATE_LOCATION}/scripts/MailScanner.sh stop

	# remove index and help entry
	${DSM_INDEX_DEL} ${PKG_APP_PATH}/index.conf ${PKG_INDEXDB_PATH}/appindexdb
	${DSM_INDEX_DEL} ${PKG_APP_PATH}/helptoc.conf ${PKG_INDEXDB_PATH}/helpindexdb

	UnSetCrontab
	# clear links
	ClearLinks

	LogStop
}

check_version_older() # $1 base version $2 target version
{
	BASE_VER=$1
	TARGET_VER=$2

	# if no base ver, always reture false
	if [ -z "${BASE_VER}" ]; then
		return 0;
	fi

	# getting major, minor, build
	base_major=`echo ${BASE_VER} | sed 's/^\([0-9]*\)[.-]\([0-9]*\)[.-]\([0-9]*\).*/\1/'`
	base_minor=`echo ${BASE_VER} | sed 's/^\([0-9]*\)[.-]\([0-9]*\)[.-]\([0-9]*\).*/\2/'`
	base_build=`echo ${BASE_VER} | sed 's/^\([0-9]*\)[.-]\([0-9]*\)[.-]\([0-9]*\).*/\3/'`
	target_major=`echo ${TARGET_VER} | sed 's/^\([0-9]*\)[.-]\([0-9]*\)[.-]\([0-9]*\).*/\1/'`
	target_minor=`echo ${TARGET_VER} | sed 's/^\([0-9]*\)[.-]\([0-9]*\)[.-]\([0-9]*\).*/\2/'`
	target_build=`echo ${TARGET_VER} | sed 's/^\([0-9]*\)[.-]\([0-9]*\)[.-]\([0-9]*\).*/\3/'`

	# compare major, version must equal or above limitation
	if [ $target_major -lt $base_major ]; then
		return 1;
	elif [ $target_major -gt $base_major ]; then
		return 0;
	fi
	# compare minor
	if [ $target_minor -lt $base_minor ]; then
		return 1;
	elif [ $target_minor -gt $base_minor ]; then
		return 0;
	fi
	# compare build
	if [ $target_build -lt $base_build ]; then
		return 1;
	else
		return 0;
	fi
}

case $1 in
	start)
		# check enabled
		if [ ! -f $PACKAGE_ENABLED ]; then
			exit 0;
		fi

		# start routine
		start

		exit 0
	;;
	stop)
		stop
		exit 0
	;;
	status)
		if [ -e ${APP_PATH} ]; then
			exit 0
		else
			exit 1
		fi
	;;
	killall)
        ;;
	log)
		exit 0
	;;
esac

