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