#!/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"

UIStringDir="$PRIVATE_LOCATION/app/texts"

GenerateMessage()
{
	local section=$1
	local key=$2
	case $SYNOPKG_DSM_LANGUAGE in
		chs | cht |csy | dan | enu | fre | ger | hun | ita | jpn | krn | nld | nor | plk| ptb | ptg | rus | spn | sve | trk)
			echo $(sed -n '/^\['$section'\]/,/^'$key'/s/'$key'.*=.*"\(.*\)"/\1/p' $UIStringDir/$SYNOPKG_DSM_LANGUAGE/strings) > $SYNOPKG_TEMP_LOGFILE
			;;
		* )
			echo "Please restart Perl package." > $SYNOPKG_TEMP_LOGFILE
			;;
	esac
}

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
}

# TODO: remove it in DSM 6.0, it just a workaround for dsm 5.0
app_privilege()
{
	local config="/var/packages/MailServer/target/app/config"
	local dsm_major=`get_key_value /etc.defaults/VERSION majorversion`
	local dsm_minor=`get_key_value /etc.defaults/VERSION minorversion`
	if [ x"${dsm_major}" = x"5" -a x"${dsm_minor}" = x"0" ]; then
		if [ -e "${config}.5.0" ]; then
			ln -sf ${config}.5.0 ${config}
		fi
	else
		if [ -e "${config}.5.x" ]; then
			ln -sf ${config}.5.x ${config}
		fi
	fi
}

MailQueueChown()
{	
	chown -R postfix:root /var/packages/MailServer/target/var/spool/postfix
	chown -R postfix:maildrop /var/packages/MailServer/target/var/spool/postfix/maildrop
	chown -R postfix:maildrop /var/packages/MailServer/target/var/spool/postfix/public
	chown root:root /var/packages/MailServer/target/var/spool/postfix/pid
}

CheckEnv()
{
	MailQueueChown
	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/

	app_privilege

	${PRIVATE_LOCATION}/bin/syno_scanner_process_num
}

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

	if [ ! -e /usr/lib/libmagic.so -a ! -e /usr/lib/libmagic.so.1 ]; then
		ln -s ${PRIVATE_LOCATION}/usr/lib/libmagic.so /usr/lib/libmagic.so
		ln -s /usr/lib/libmagic.so /usr/lib/libmagic.so.1
	fi

	if [ ! -e /usr/share/file ]; then
		ln -s ${PRIVATE_LOCATION}/usr/share/file /usr/share/file
	fi
	# create dovecot link for pam.d login
	# ==> move to 'DaemonConfSet.sh smtp'

}

LogInit()
{
	local size=`/bin/get_key_value $MAILCONF postfix_log_rotate_size`
	: ${size:="30"}

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

		echo -e "destination d_maillog { file(\"/${VOLUME}/@maillog/maillog\"); };
			filter f_mail_loglevel { level(info..emerg); };
			log { source(src); filter(f_mail); filter(f_mail_loglevel); destination(d_maillog); };" > ${MAILLOG_CONF}
			
		echo -e "/${VOLUME}/@maillog/maillog
			{
        		size ${size}M
	        	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}

	if [ -L /usr/lib/libmagic.so -a -L /usr/lib/libmagic.so.1 ]; then
		rm /usr/lib/libmagic.so
		rm /usr/lib/libmagic.so.1
	fi

	if [ -L /usr/share/file ]; then
		rm /usr/share/file
	fi
}

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()
{
	# check "/lib/perl5"
	if [ ! -e "/lib/perl5" ]; then
		GenerateMessage "error" "restart_perl"
		exit 1;
	fi;

	# to fix MailServer #498
	# "/lib/perl5" should be a symoblic link
	if [ ! -L "/lib/perl5" ]; then
		GenerateMessage "error" "restart_perl"
		rm -rf "/lib/perl5"
		exit 1;
	fi

	# TODO: this should be remove in dsm6.0, only left regen cert
	local dsm_major_ver=`/bin/get_key_value /etc.defaults/VERSION majorversion`
	local dsm_minor_ver=`/bin/get_key_value /etc.defaults/VERSION minorversion`
	rm -rf ${PRIVATE_LOCATION}/etc/ssl/mailserver_ssl.pem
	if [ x"${dsm_major_ver}" == x"5" -a x"${dsm_minor_ver}" == x"0" ]; then
		mkdir -p "${PRIVATE_LOCATION}/etc/ssl/"
		ln -sf /usr/syno/etc/ssl/ssl.crt/server.crt ${PRIVATE_LOCATION}/etc/ssl/mailserver_ssl.pem
	else
		# re-generate ssl cert chain
		${PRIVATE_LOCATION}/hook/MailServerCertChange.sh --regen
	fi

	# 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

	# install default main.cf and master.cf, for postmap and postalias
	cp ${PRIVATE_LOCATION}/etc/template/main.template ${PRIVATE_LOCATION}/etc/main.cf
	cp ${PRIVATE_LOCATION}/etc/template/master.template ${PRIVATE_LOCATION}/etc/master.cf

	${PRIVATE_LOCATION}/bin/syno_db_util update mailserver
	${PRIVATE_LOCATION}/bin/syno_db_util update alias

	# generate default config and import old setting
	`${PRIVATE_LOCATION}/scripts/DefaultConfGen.sh`
	${PRIVATE_LOCATION}/bin/syno_set_config smtp
	${PRIVATE_LOCATION}/bin/syno_set_config mailscanner
	${PRIVATE_LOCATION}/bin/syno_set_config dovecot
	${PRIVATE_LOCATION}/bin/syno_set_config alias

	${PRIVATE_LOCATION}/bin/syno_set_config sender_quota_map
	${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
		# start postfix server in background
		# postfix will check if all the queue files are in right place before mail server can run.
		# when there are huge mount of mails stuck in queue, it will take a long time to check.
		# It might cost too much time to boot.
		${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`
	local enable_content_scan=`/bin/get_key_value $MAILCONF enable_dangerous_content_scan`
	if [ x"${SpamEnable}" = x"yes" -o x"${AntiVirusEnable}" = x"yes" -o x"${enable_content_scan}" = x"yes" ]; then
		${PRIVATE_LOCATION}/scripts/MailScanner.sh start
	fi

	local enable_dkim=`/bin/get_key_value $MAILCONF enable_dkim`
	if [ x"${enable_dkim}" = x"yes" ]; then
		${PRIVATE_LOCATION}/scripts/opendkim.sh start
	fi

	local enable_dmarc=`/bin/get_key_value $MAILCONF enable_dmarc`
	if [ x"${enable_dmarc}" = x"yes" ]; then
		${PRIVATE_LOCATION}/scripts/opendmarc.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

	${PRIVATE_LOCATION}/scripts/opendkim.sh stop
	${PRIVATE_LOCATION}/scripts/opendmarc.sh stop

	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

