HEX
Server: Apache/2.2.34 (Unix) mod_fastcgi/mod_fastcgi-SNAP-0910052141
System: Linux Kou-Etsu-Dou 4.4.59+ #25556 SMP PREEMPT Thu Mar 4 18:03:46 CST 2021 x86_64
User: hosam (1026)
PHP: 7.2.29
Disabled: NONE
Upload Files
File: //var/packages/MailPlus-Server/scripts/preupgrade
#!/bin/bash
[ -e /var/packages/MailPlus-Server/target/scripts/MailPlusServerLogUtil.sh ] && . /var/packages/MailPlus-Server/target/scripts/MailPlusServerLogUtil.sh

# check upgrade util scripts on old versions
UPGRADE_UTIL_PATH_V1="/var/packages/MailPlus-Server/target/scripts/UpgradeUtil.sh"
UPGRADE_UTIL_PATH="/var/packages/MailPlus-Server/scripts/UpgradeUtil.sh"

UPGRADE_FILE="/tmp/mailplus_server.upgrade"
[ -f "$UPGRADE_UTIL_PATH_V1" ] && . "$UPGRADE_UTIL_PATH_V1"
[ -f "$UPGRADE_UTIL_PATH" ] && . "$UPGRADE_UTIL_PATH"

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

PRIVATE_LOCATION="/var/packages/MailPlus-Server/target"
VOLUME=`/usr/bin/readlink ${PRIVATE_LOCATION} | /usr/bin/cut -d '/' -f2`
MAILLOG_FOLDER="/${VOLUME}/@maillog"
VOLUME_MAILPLUS_SERVER_PATH="/${VOLUME}/@MailPlus-Server"

GenerateMessage()
{
	local string_dir="$PRIVATE_LOCATION/app/texts"

	local section=$1
	local key=$2
	local lang=${SYNOPKG_DSM_LANGUAGE}

	if [ ! -e "${string_dir}/${lang}/strings" ]; then
		lang="enu"
	fi
	echo $(sed -n '/^\['$section'\]/,/^'$key'/s/'$key'.*=.*"\(.*\)"/\1/p' "${string_dir}/${lang}/strings") > "${SYNOPKG_TEMP_LOGFILE}"
}

check_and_move_to_target() # $1: source file/folder ; $2: target path. # move file/folder only if src exists and destination doesn't exists
{
	local src=$1
	local dst=$2
	local ts=0
	local dst_bkp=""

	if [ $# -lt 2 ]; then
		return 1
	fi

	# if the source folder doesn't exist, do nothing
	if [ ! -e "$src" ]; then
		return 0
	fi

	# try to create random folder path for at most 5 times, or skip it
	for i in {1..5} ; do
		# if $dst folder exists, try to make backup path, or skip this step
		[ -e "$dst" ] || break

		# generate backup path with timestamp.random
		ts=`date +%s`
		dst_bkp="$dst.$ts.$RANDOM"

		# if the random path exist, loop again. otherwise, move $dst to $dst_bkp
		[ -e "$dst_bkp" ] || mv "$dst" "$dst_bkp" ; break
	done

	# start moving $src to $dst
	mv "$src" "$dst"

	return 0
}

check_and_create_folder_for_mailplus() # $1: folder path to create. only create it if it's not yet created.
{
	local dst=$1

	[ ! -e "$dst" ] && mkdir "$dst"

	# if we failed to create this folder, return 1
	if [ ! -d "$dst" ] ; then
		return 1
	fi

	# for this newly created folder, change owner to MailPlus-Server
	chown -R MailPlus-Server:MailPlus-Server: "$dst"

	return 0
}

check_v1_less_or_equal_to_v2() # $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/'`
	target_build=$(echo ${target_build} | sed 's/^0*//')
	target_build=$((target_build % 10000))

	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
	base_build=$(echo ${base_build} | sed 's/^0*//')
	base_build=$((base_build % 10000))

	# 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 maintenance version
	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
}

is_old_package_version_before()	# $1: version to compare with recent package
{
	# if recent package version (OLD_PACKAGE_VER) <= input version, return 0.
	# that means we need to execute the upgrade script/function. 
	# otherwise, do nothing
	check_v1_less_or_equal_to_v2 ${OLD_PACKAGE_VER} $1
	return $?
}

upgradeMcpQuarantine()
{
	err_log "upgrade mcp quarantine, generate mcp quarantine upgrade flag"
	touch "/var/packages/MailPlus-Server/etc/upgrade_mcp_quarantine"
}

upgradeVirusQuarantine()
{
	err_log "upgrade virus quarantine, generate virus quarantine upgrade flag"
	touch "/var/packages/MailPlus-Server/etc/upgrade_virus_quarantine"
}

upgradeMimedefangRunkey()
{
	err_log "upgrade mimedefang runkey, generate mimedefang runkey upgrade flag"
	touch "/tmp/mailplus_server.upgrade_mimedefang_runkey"
}

upgradeMultipleDomain()
{
	err_log "upgrade related settings for multiple domain, generate multiple domains upgrade flag"
	touch "/tmp/mailplus_server.upgrade_related_settings_for_multiple_domain"
}

upgradeRelayMultiSource()
{
	err_log "upgrade relay to multi source, generate relay upgrade flag"
	touch "/tmp/mailplus_server.relay_to_multi_source"
}

upgradeDisClaimer()
{
	err_log "upgrade related settings for disclaimer, generate upgrade disclaimer flag"
	touch "/tmp/mailplus_server.upgrade_disclaimer_flag"
}

upgradeSharedMailboxACL()
{
	err_log "upgrade related settings for sharedmailbox acl, generate upgrade sharedmailbox acl flag"
	touch "/tmp/mailplus_server.upgrade_sharedmailbox_acl_flag"
}

upgradeDisClaimer_v2()
{
	err_log "upgrade related settings for disclaimer, generate upgrade disclaimer flag"
	touch "/tmp/mailplus_server.upgrade_disclaimer_flag_v2"
}

moveHyperscanCompiledPatterns()
{
	local old_hyperscan_dir="${PRIVATE_LOCATION}/var/lib/rspamd"
	local new_hyperscan_dir="/${VOLUME}/@MailPlus-Server/rspamd/hs_cache"

	check_and_create_folder_for_mailplus ${new_hyperscan_dir}

	local hs_compiled_patterns="${old_hyperscan_dir}/*.hs"
	local hs_multiple_compiled_patterns="${old_hyperscan_dir}/*.hsmp"

	cp -a ${hs_compiled_patterns} ${new_hyperscan_dir}
	cp -a ${hs_multiple_compiled_patterns} ${new_hyperscan_dir}
}

removeOldAntivirusInfoCache()
{
	rm -f "/${VOLUME}/@MailPlus-Server/clamav/antivirus_info.cache"
}

moveRspamdRedisLog()
{
	local rspamd_redis_log_dir="${PRIVATE_LOCATION}/var/log/rspamd"

	if [[ -f "${rspamd_redis_log_dir}/redis.log" ]]; then
		for redis_log in "${rspamd_redis_log_dir}/redis.log"*; do
			local new_redis_log_basename="rspamd_$(basename "${redis_log}")"

			mv "${redis_log}" "${MAILLOG_FOLDER}/${new_redis_log_basename}"
		done
	fi
}


initialEnvCheck()
{
	# check 1: new package version should be larger than old package
	if ! is_old_package_version_before ${NEW_PACKAGE_VER} ; 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})." >> $SYNOPKG_TEMP_LOGFILE
		exit 1;
	fi

	# check 2: package earlier than 2.0, have to upgrade to 2.0 first
	if is_old_package_version_before "2.0.0-0450" ; then
		echo "Old package version [${OLD_PACKAGE_VER}] is less than 2.0.0-0450, abort"
		echo "For package version earlier than 2.0, please upgrade to 2.0 first. " >> $SYNOPKG_TEMP_LOGFILE
		exit 1;
	fi

	# for subsequent procedure, create /volumeX/@MailPlus-Server at the beginning
	if ! check_and_create_folder_for_mailplus ${VOLUME_MAILPLUS_SERVER_PATH}; then
		echo "failed to prepare on volume MailPlus Server folder, exit" >> $SYNOPKG_TEMP_LOGFILE
		exit 1
	fi
	
	# create rspamd/sa_rules folder first
	check_and_create_folder_for_mailplus "${VOLUME_MAILPLUS_SERVER_PATH}/rspamd"
	check_and_create_folder_for_mailplus "${VOLUME_MAILPLUS_SERVER_PATH}/rspamd/sa_rules"
	check_and_create_folder_for_mailplus "${VOLUME_MAILPLUS_SERVER_PATH}/rspamd/sa_rules/conf"
	check_and_create_folder_for_mailplus "${VOLUME_MAILPLUS_SERVER_PATH}/rspamd/sa_rules/conf/mcp"
}

moveSettingsFromPackageFolder()
{
	local log_folder="${PRIVATE_LOCATION}/var/aggr_log"
	local mail_migration_folder="${PRIVATE_LOCATION}/var/migration_data"
	local alias_backup_folder="${PRIVATE_LOCATION}/etc/alias_bkp"
	local spamassassin_conf_folder="${PRIVATE_LOCATION}t/etc/spamassassin"
	local sa_update_db_folder="${PRIVATE_LOCATION}/var/spamassassin"

	# move aggr log, migration data, and alias backup
	check_and_move_to_target ${log_folder} "${VOLUME_MAILPLUS_SERVER_PATH}/aggr_log"
	check_and_move_to_target ${mail_migration_folder} "${VOLUME_MAILPLUS_SERVER_PATH}/migration_data"
	check_and_move_to_target ${alias_backup_folder} "${VOLUME_MAILPLUS_SERVER_PATH}/alias_bkp"

	# remove spamassassin rules/conf
	rm -f ${spamassassin_conf_folder}/local.cf

	# move user configuration, including MCP settings
	check_and_move_to_target ${spamassassin_conf_folder} "${VOLUME_MAILPLUS_SERVER_PATH}/rspamd/sa_rules/conf"

	# move runtime update database
	check_and_move_to_target ${sa_update_db_folder} "${VOLUME_MAILPLUS_SERVER_PATH}/rspamd/sa_rules/update_db"

	# move antispam status file from /tmp to /run
	check_and_move_to_target "/tmp/mailplus_server/antispam_update_status.json" "/run/mailplus_server/antispam_update_status.json"
}

# defensive check: check if package version is supported, or exit
initialEnvCheck

#check run upgrade scripts with right version accordingly
is_old_package_version_before "2.0.0-0452" && upgradeMcpQuarantine
is_old_package_version_before "2.0.0-0452" && upgradeVirusQuarantine
is_old_package_version_before "2.0.0-0452" && upgradeMimedefangRunkey
is_old_package_version_before "2.0.0-0457" && upgradeMultipleDomain
is_old_package_version_before "2.0.1-0528" && upgradeRelayMultiSource
is_old_package_version_before "2.0.2-0534" && upgradeDisClaimer
is_old_package_version_before "2.0.4-0540" && upgradeSharedMailboxACL
is_old_package_version_before "2.0.4-0543" && upgradeDisClaimer_v2
is_old_package_version_before "2.1.0-0695" && moveHyperscanCompiledPatterns
is_old_package_version_before "2.2.0-0813" && removeOldAntivirusInfoCache
is_old_package_version_before "2.3.0-1012" && moveRspamdRedisLog
is_old_package_version_before "2.3.0-1020" && moveSettingsFromPackageFolder

# final step: create upgrade flag
touch ${UPGRADE_FILE}
OLD_VER_STR="old_version="${OLD_PACKAGE_VER}
echo ${OLD_VER_STR} >> ${UPGRADE_FILE}
chmod 666 ${UPGRADE_FILE}

exit 0