#!/bin/sh
[ -e /var/packages/MailPlus-Server/target/scripts/MailPlusServerLogUtil.sh ] && . /var/packages/MailPlus-Server/target/scripts/MailPlusServerLogUtil.sh

# customized info for different package
PACKAGE_NAME=$SYNOPKG_PKGNAME
PACKAGE_VER=$SYNOPKG_PKGVER
PACKAGE_ERR_MSG=$SYNOPKG_TEMP_LOGFILE
UPGRADE_FILE="/tmp/mailplus_server.upgrade"
MAILPLUS_SERVER_BACKEND_BINARY="/var/packages/MailPlus-Server/target/bin/syno_mailserver_backend"
LICENSE_START_VERSION="1.0.0-0164"
LICENSE_ACTIVE_DB="/var/packages/MailPlus-Server/etc/active_list.db"
ACTIVE_DB_UPDATE_VERSION="1.1.0-0200"

# general routine
NEW_PACKAGE_VER=`get_key_value "${SYNOPKG_PKGINST_TEMP_DIR}/../INFO" "version"`
OLD_PACKAGE_VER=$PACKAGE_VER

PRIVATE_LOCATION="/var/packages/MailPlus-Server/target"
VOLUME=`/usr/bin/readlink ${PRIVATE_LOCATION} | /usr/bin/cut -d '/' -f2`
LOG_FOLDER="/var/packages/MailPlus-Server/target/var/aggr_log"
MAIL_MIGRATION_FOLDER="/var/packages/MailPlus-Server/target/var/migration_data"
ALIAS_BKP_FOLDER="/var/packages/MailPlus-Server/target/etc/alias_bkp"
SPAMASSASSIN_FOLDER="/var/packages/MailPlus-Server/target/etc/spamassassin"
SA_UPDATE_DB_FOLDER="/var/packages/MailPlus-Server/target/var/spamassassin"
SA_UPDATE_DB_FOLDER_BACKUP_NAME="spamassassin_update_db"
BACKUP_DIR="/${VOLUME}/@tmp/mailplus_server"
UIStringDir="$PRIVATE_LOCATION/app/texts"

# license
UPGRADE_LICENSE_FLAG="/tmp/mailplus_server.upgrade_to_license_version"
LICENSE_TOOL="/var/packages/MailPlus-Server/target/bin/syno_license_tool"

# mcp
MCP_RULE_UPGRADE_VERSION="1.3.0-348"
MCP_RULE_UPGRADE_FLAG="/tmp/mailplus_server.upgrade_mcp_rule"

# dkim sign
DKIM_SIGN_UPGRADE_VERSION="1.3.0-350"
DKIM_SIGN_UPGRADE_FLAG="/tmp/mailplus_server.upgrade_dkim_sign"

# user/group/policy
USERGROUPPOLICY_UPDATE_VERSION="1.3.0-0338"
UPGRADE_USERGROUPPOLICY_FLAG="/tmp/mailplus_server.upgrade_to_usergrouppolicy_version"

# smtp: separate hostname and domain name
DOMAIN_NAME_UPGRADE_VERSION="1.3.0-329"
DOMAIN_NAME_UPGRADE_FLAG="/tmp/mailplus_server.upgrade_domain_name"

# upgrade mcp quarantine
MCP_QUARANTINE_UPGRADE_VERSION="2.0.0-0452"
MCP_QUARANTINE_UPGRADE_FLAG="/var/packages/MailPlus-Server/etc/upgrade_mcp_quarantine"

# upgrade virus quarantine
VIRUS_QUARANTINE_UPGRADE_VERSION="2.0.0-0452"
VIRUS_QUARANTINE_UPGRADE_FLAG="/var/packages/MailPlus-Server/etc/upgrade_virus_quarantine"

# upgrade mimedefang runkey setting
MIMEDEFANG_RUNKEY_UPGRADE_VERSION="2.0.0-0452"
MIMEDEFANG_RUNKEY_UPGRADE_FLAG="/tmp/mailplus_server.upgrade_mimedefang_runkey"

SECURITY_AUTH_UPGRADE_VERSION="1.4.0-0404"
SECURITY_AUTH_UPGRADE_FLAG="/tmp/mailplus_server.security_auth"

# upgrade relay to multiple source
RELAY_TO_MULTI_SOURCE_VERSION="2.0.1-0528"
RELAY_TO_MULTI_SOURCE_FLAG="/tmp/mailplus_server.relay_to_multi_source"

# upgrade related setting for multiple domains
MULTIPLE_DOMAINS_UPGRADE_VERSION="2.0.0-0457"
UPGRADE_RELATED_SETTINGS_FOR_MULTIPLE_DOMAINS_FLAG="/tmp/mailplus_server.upgrade_related_settings_for_multiple_domain"

# upgrade disclaimer setting
UPGRADE_DISCALIMER_VERSION="2.0.2-0534"
UPGRADE_DISCLAIMER_FLAG="/tmp/mailplus_server.upgrade_disclaimer_flag"

# upgrade sharedmailbox acl setting
UPGRADE_SHAREDMAILBOX_ACL_VERSION="2.0.4-0540"
UPGRADE_SHAREDMAILBOX_ACL_FLAG="/tmp/mailplus_server.upgrade_sharedmailbox_acl_flag"

# upgrade disclaimer setting
UPGRADE_DISCALIMER_VERSION_V2="2.0.4-0543"
UPGRADE_DISCLAIMER_FLAG_V2="/tmp/mailplus_server.upgrade_disclaimer_flag_v2"

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 $(sed -n '/^\['$section'\]/,/^'$key'/s/'$key'.*=.*"\(.*\)"/\1/p' $UIStringDir/enu/strings) > $SYNOPKG_TEMP_LOGFILE
			;;
	esac
}

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

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

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

	local BASE_VER_NUM=`echo "$BASE_VER" | awk 'BEGIN {FS="."} {print NF}'`
	if [ ${BASE_VER_NUM} -eq 2 ]; then
		local base_major=`echo ${BASE_VER} | sed 's/^\([0-9]*\)[.-]\([0-9]*\)[.-]\([0-9]*\).*/\1/'`
		local base_minor=`echo ${BASE_VER} | sed 's/^\([0-9]*\)[.-]\([0-9]*\)[.-]\([0-9]*\).*/\2/'`
		local base_build=`echo ${BASE_VER} | sed 's/^\([0-9]*\)[.-]\([0-9]*\)[.-]\([0-9]*\).*/\3/'`
	else
		local base_major=`echo ${BASE_VER} | sed 's/^\([0-9]*\)[.-]\([0-9]*\)[.-]\([0-9]*\)[.-]\([0-9]*\).*/\1/'`
		local base_minor=`echo ${BASE_VER} | sed 's/^\([0-9]*\)[.-]\([0-9]*\)[.-]\([0-9]*\)[.-]\([0-9]*\).*/\2/'`
		local base_maintenance=`echo ${BASE_VER} | sed 's/^\([0-9]*\)[.-]\([0-9]*\)[.-]\([0-9]*\)[.-]\([0-9]*\).*/\3/'`
		local base_build=`echo ${BASE_VER} | sed 's/^\([0-9]*\)[.-]\([0-9]*\)[.-]\([0-9]*\)[.-]\([0-9]*\).*/\4/'`
	fi

	# 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 mminor
	if [ ${BASE_VER_NUM} -ne 2 ]; then
		if [ $target_maintenance -lt $base_maintenance ]; then
			return 1;
		elif [ $target_maintenance -gt $base_maintenance ]; then
			return 0;
		fi
	fi
	# compare build
	if [ $target_build -lt $base_build ]; then
		return 1;
	else
		return 0;
	fi
}

licenseCheckHook()
{
	# if (old_ver < license_ver)
	# it represent: upgrade to the license_ver
	# add license default configs
	# not need to do the license check

	# if (old_ver >= license_ver)
	# then the config is already setted
	# just doing check

	# if cluster not inited, don't need to check license and don't need hook
	${MAILPLUS_SERVER_BACKEND_BINARY} "--isClusterInit"
	if [ 0 -ne $? ]; then
		return
	fi

	check_version_older ${OLD_PACKAGE_VER} ${LICENSE_START_VERSION}
	if [ 0 -eq $? ]; then
		err_log "upgrade to license version, generate license upgrade flag"
		rm -rf ${LICENSE_ACTIVE_DB}
		touch ${UPGRADE_LICENSE_FLAG}
		return
	else
#		${LICENSE_TOOL} "offline_check"
#		if [ 0 -ne $? ]; then
#			err_log "License check fail, forbid upgrade"
#			GenerateMessage "license" "invalid_license_upgrade"
#			exit 1
#		fi
		return
	fi

}

userGroupPolicyCheckHook()
{
	# if cluster not inited, don't need to check user group policy and don't need hook
	${MAILPLUS_SERVER_BACKEND_BINARY} "--isClusterInit"
	if [ 0 -ne $? ]; then
		return
	fi

	check_version_older ${OLD_PACKAGE_VER} ${USERGROUPPOLICY_UPDATE_VERSION}
	if [ 0 -eq $? ]; then
		 err_log "upgrade to user group policy version, generate usergrouppolicy upgrade flag"
		touch ${UPGRADE_USERGROUPPOLICY_FLAG}
		return
	else
		return
	fi

}

mcpRuleUpgradeCheckHook()
{
	check_version_older ${OLD_PACKAGE_VER} ${MCP_RULE_UPGRADE_VERSION}
	if [ 0 -eq $? ]; then
		err_log "upgrade mcp rules, generate mcp rule upgrade flag"
		touch ${MCP_RULE_UPGRADE_FLAG}
		return
	fi
}

dkimSignUpgradeCheckHook()
{
	check_version_older ${OLD_PACKAGE_VER} ${DKIM_SIGN_UPGRADE_VERSION}
	if [ 0 -eq $? ]; then
		err_log "upgrade dkim sign option, generate dkim sign upgrade flag"
		touch ${DKIM_SIGN_UPGRADE_FLAG}
		return
	fi
}

domainNameUpgradeCheckHook()
{
	check_version_older ${OLD_PACKAGE_VER} ${DOMAIN_NAME_UPGRADE_VERSION}
	if [ 0 -eq $? ]; then
		err_log "upgrade domain name, generate domain name upgrade flag"
		touch ${DOMAIN_NAME_UPGRADE_FLAG}
		return
	fi
}

mcpQuarantineUpgradeCheckHook()
{
	check_version_older ${OLD_PACKAGE_VER} ${MCP_QUARANTINE_UPGRADE_VERSION}
	if [ 0 -eq $? ]; then
		err_log "upgrade mcp quarantine, generate mcp quarantine upgrade flag"
		touch ${MCP_QUARANTINE_UPGRADE_FLAG}
		return
	fi
}

virusQuarantineUpgradeCheckHook()
{
	check_version_older ${OLD_PACKAGE_VER} ${VIRUS_QUARANTINE_UPGRADE_VERSION}
	if [ 0 -eq $? ]; then
		err_log "upgrade virus quarantine, generate virus quarantine upgrade flag"
		touch ${VIRUS_QUARANTINE_UPGRADE_FLAG}
		return
	fi
}

mimedefangRunkeyUpgradeCheckHook()
{
	check_version_older ${OLD_PACKAGE_VER} ${MIMEDEFANG_RUNKEY_UPGRADE_VERSION}
	if [ 0 -eq $? ]; then
		err_log "upgrade mimedefang runkey, generate mimedefang runkey upgrade flag"
		touch ${MIMEDEFANG_RUNKEY_UPGRADE_FLAG}
		return
	fi
}

SecurityAuthSettingUpgradeHook()
{
	check_version_older ${OLD_PACKAGE_VER} ${SECURITY_AUTH_UPGRADE_VERSION}
	if [ 0 -eq $? ]; then
		err_log "upgrade security auth, generate security auth upgrade flag"
		touch ${SECURITY_AUTH_UPGRADE_FLAG}
		return
	fi
}

RelayMultiSourceUpgradeCheckHook()
{

	check_version_older ${OLD_PACKAGE_VER} ${RELAY_TO_MULTI_SOURCE_VERSION}
	if [ 0 -eq $? ]; then
		err_log "upgrade relay to multi source, generate relay upgrade flag"
		touch ${RELAY_TO_MULTI_SOURCE_FLAG}
		return
	fi
}

MultipleDomainUpgradeHook()
{
	check_version_older ${OLD_PACKAGE_VER} ${MULTIPLE_DOMAINS_UPGRADE_VERSION}
	if [ 0 -eq $? ]; then
		err_log "upgrade related settings for multiple domain, generate multiple domains upgrade flag"
		touch "${UPGRADE_RELATED_SETTINGS_FOR_MULTIPLE_DOMAINS_FLAG}"
	fi
}

DisClaimerUpgradeHook()
{
	check_version_older ${OLD_PACKAGE_VER} ${UPGRADE_DISCALIMER_VERSION}
	if [ 0 -eq $? ]; then
		err_log "upgrade related settings for disclaimer, generate upgrade disclaimer flag"
		touch "${UPGRADE_DISCLAIMER_FLAG}"
	fi
}

SharedMailboxACLUpgradeHook()
{
	check_version_older ${OLD_PACKAGE_VER} ${UPGRADE_SHAREDMAILBOX_ACL_VERSION}
	if [ 0 -eq $? ]; then
		err_log "upgrade related settings for sharedmailbox acl, generate upgrade sharedmailbox acl flag"
		touch "${UPGRADE_SHAREDMAILBOX_ACL_FLAG}"
	fi
}

DisClaimerUpgradeHook_v2()
{
	check_version_older ${OLD_PACKAGE_VER} ${UPGRADE_DISCALIMER_VERSION_V2}
	if [ 0 -eq $? ]; then
		err_log "upgrade related settings for disclaimer, generate upgrade disclaimer flag"
		touch "${UPGRADE_DISCLAIMER_FLAG_V2}"
	fi
}

check_version_older ${OLD_PACKAGE_VER} ${NEW_PACKAGE_VER}
if [ $? -eq "1" ]; then
	echo "Target version [${NEW_PACKAGE_VER}] is older than current [${OLD_PACKAGE_VER}], abort"
	echo "Package version (${NEW_PACKAGE_VER}) is older then installed (${OLD_PACKAGE_VER})." > $PACKAGE_ERR_MSG
	exit 1;
fi

#check license is ok before upgrade
licenseCheckHook
userGroupPolicyCheckHook

mcpRuleUpgradeCheckHook

dkimSignUpgradeCheckHook

domainNameUpgradeCheckHook

mcpQuarantineUpgradeCheckHook

virusQuarantineUpgradeCheckHook

mimedefangRunkeyUpgradeCheckHook

SecurityAuthSettingUpgradeHook

RelayMultiSourceUpgradeCheckHook

MultipleDomainUpgradeHook

DisClaimerUpgradeHook

SharedMailboxACLUpgradeHook

DisClaimerUpgradeHook_v2

## Create backup dir
rm -fr ${BACKUP_DIR}
mkdir -p ${BACKUP_DIR}

#backup data
mv ${LOG_FOLDER} "${BACKUP_DIR}"
mv ${MAIL_MIGRATION_FOLDER} "${BACKUP_DIR}"
mv ${ALIAS_BKP_FOLDER} "${BACKUP_DIR}"
# backup spamassassin folder except local.cf
rm ${SPAMASSASSIN_FOLDER}/local.cf
mv ${SPAMASSASSIN_FOLDER} "${BACKUP_DIR}"

if [ -e ${MCP_QUARANTINE_UPGRADE_FLAG} ]; then
	mv ${MCP_QUARANTINE_UPGRADE_FLAG} "${BACKUP_DIR}"
fi
if [ -e ${VIRUS_QUARANTINE_UPGRADE_FLAG} ]; then
	mv ${VIRUS_QUARANTINE_UPGRADE_FLAG} "${BACKUP_DIR}"
fi

# backup sa-update db
if [ -d "${SA_UPDATE_DB_FOLDER}" ]; then
	mv "${SA_UPDATE_DB_FOLDER}" "${BACKUP_DIR}/${SA_UPDATE_DB_FOLDER_BACKUP_NAME}"
fi

check_version_older ${OLD_PACKAGE_VER} ${ACTIVE_DB_UPDATE_VERSION}
if [ 0 -eq $? ]; then
	if [ -e ${LICENSE_ACTIVE_DB} ]; then
		err_log "upgrade to active_db new version, generate active_db dump file"
		/bin/sqlite3 ${LICENSE_ACTIVE_DB} "SELECT * FROM active_member_table" >  "${BACKUP_DIR}/mailplus_server.active_list.dump"
		mv ${LICENSE_ACTIVE_DB} "${LICENSE_ACTIVE_DB}.bkp"
	fi
fi

touch ${UPGRADE_FILE}
OLD_VER_STR="old_version="${OLD_PACKAGE_VER}
echo ${OLD_VER_STR} >> ${UPGRADE_FILE}
chmod 666 ${UPGRADE_FILE}


# Avoid old package unregister certificate when upgrade
/bin/sed -i '/^synocrtunregister MailPlus-Server$/d' /var/packages/MailPlus-Server/scripts/preuninst
/bin/sed -i '/^rm -f \/usr\/local\/libexec\/certificate.d\/MailPlus-Server$/d' /var/packages/MailPlus-Server/scripts/preuninst

etcdTreeDump()
{
	local etcdctl_binary="$1"
	local treeName="$2"
	local outputList="$3"
	local key=""

	# -p :: append slash (/) to directories
	local keyList=$(${etcdctl_binary} ls --recursive -p ${treeName} 2>&1 | grep "Key not found")
	if [ ! -z "${keyList}" ]; then
		return
	fi

	for key in `${etcdctl_binary} ls --recursive -p ${treeName}`; do
		local last_char_pos=$((${#key} - 1))
		local value=
		if [ "/" == "${key:$last_char_pos:1}" ]; then
			continue
		fi

		value="`${etcdctl_binary} get $key`"
		value=$(echo $value | sed 's|"|\\"|g')
		echo "\"${key}\":\"${value}\"," >> ${outputList}
	done
}
etcdFileBackup()
{
	if check_version_older "${OLD_PACKAGE_VER}" "1.0.0-0057"; then
		## Activate etcd
		if ! /var/packages/MailPlus-Server/target/scripts/ClusterDaemon.sh etcd_start; then
			err_log "MailPlus Server: Failed to start etcd so abort update file sync list"
			return
		fi

		## Dump all file type
		local outputList="/tmp/etcdFileSyncList"
		local etcdCtl="/var/packages/MailPlus-Server/target/usr/bin/etcdctl"
		local fileTypeTree="aliasdb attachment_filter_db bccdb mailserverdb dailyquota_db blackwhitelist_db dkim_key filter_db personal ruledb custom_file"
		local treeName=""

		echo "{" > ${outputList}
		for treeName in ${fileTypeTree}; do
			etcdTreeDump ${etcdCtl} ${treeName} ${outputList}
		done
		sed -i '$! { P; D; }; s/,$//' ${outputList}
		echo "}" >> ${outputList}

		/var/packages/MailPlus-Server/target/scripts/ClusterDaemon.sh etcd_stop
	fi
}

etcdFileBackup

removeTlsProfileConf()
{
	local postfixConf="/usr/local/libexec/security-profile/tls-profile/postfix.conf"
	local dovecotConf="/usr/local/libexec/security-profile/tls-profile/dovecot.conf"

	if [ -f "$postfixConf" ]; then
		rm "${postfixConf}"
	fi

	if [ -f "$dovecotConf" ]; then
		rm "${dovecotConf}"
	fi
}

removeTlsProfileConf

exit 0
