#!/bin/sh
# Copyright (c) 2000-2014 Synology Inc. All rights reserved.

PKG_COMMON_SCRIPT="/var/packages/SurveillanceStation/target/scripts/pkg_common.sh"
if [ -f "${PKG_COMMON_SCRIPT}" ]; then
	. ${PKG_COMMON_SCRIPT}
else
	echo "$(date +'%b %e %H:%M:%S') $(basename ${PKG_COMMON_SCRIPT}) not found, remove packages without backups." >> "/var/log/surveillance.log"
	exit 0
fi

# DSM
SS_ETC_FOLDER="/usr/syno/etc/packages/SurveillanceStation"
BTRFS_SNAPSHOT_FOLDER_NAME="#snapshot"
SYNO_INDEX_BIN="/usr/syno/bin/synoindex"

# SS
SS_CAP_INFO_DIR_NAME="@SSCapInfo"
BACKUP_VERSION_COUNT=5
SS_SYSTEM_RELATED_ENTRY_NAMES="${SS_SYSTEM_DB_NAME} \
							   ${SS_EMAP_DIR_NAME} \
							   ${SS_USER_PHOTO_DIR_NAME} \
							   ${SS_DATA_DIR_NAME} \
							   ${SS_AXISACSCTRL_DB_NAME}"
REMOVE_RECORDING_KEEP_FILE_NAME_LIST="${SS_CAP_INFO_DIR_NAME} \
									  ${BTRFS_SNAPSHOT_FOLDER_NAME} \
									  ${SS_SYSTEM_RELATED_ENTRY_NAMES}"
DB_BACKUP_FILE_LIST="${SS_SYSTEM_DB_NAME}\..*\.[0-$((BACKUP_VERSION_COUNT-1))] \
					 ${SS_REC_DB_NAME}\..*\.[0-$((BACKUP_VERSION_COUNT-1))] \
					 ${SS_SNAPSHOT_DB_NAME}\..*\.[0-$((BACKUP_VERSION_COUNT-1))] \
					 ${SS_AXISACSCTRL_DB_NAME}\..*\.[0-$((BACKUP_VERSION_COUNT-1))] \
					 ${SS_AXISACSEVTLOG_DB_NAME}\..*\.[0-$((BACKUP_VERSION_COUNT-1))]"
SS_PKG_VOLUME_BACKUP_DIR_NAME="@ssbackup"

__GetPkgVolumeBackupDir()
{
	local PkgVolumePath="$(readlink ${SS_TARGET_DIR} | sed "s/^\/volume\([^/]*\).*/\/volume\1/g")"

	echo "${PkgVolumePath}/${SS_PKG_VOLUME_BACKUP_DIR_NAME}"
}

GetColumnListValue()
{
	ColumnList=$1
	Idx=$2

	echo "${ColumnList}" | sed -n "${Idx}p"
}

ForceLeaveNonRecMode()
{
	SSDebugLog "Leave non-recording mode."

	SetNonRecordingMode false
}

BackupDBToShareFolder()
{
	SSDebugLog "Backup system, recording and axisacsctrl DB."

	if [ false == "${pkgwizard_keep_recording}" -a
		 false == "${pkgwizard_keep_system}" ]; then
		return
	fi
	if [ ! -f "${SS_SYSTEM_DB}" -o \
		 ! -d "${SS_SHARE_FOLDER_LINK}" ]; then
		return
	fi
	local ShareFolderPath="$(readlink "${SS_SHARE_FOLDER_LINK}")"

	# Backup previous versions of system and recording DB
	local SystemDB=$(ls ${ShareFolderPath} | grep "${SS_SYSTEM_DB_NAME}\..*\.$((BACKUP_VERSION_COUNT-1))")
	local RecordingDB=$(ls ${ShareFolderPath} | grep "${SS_REC_DB_NAME}\..*\.$((BACKUP_VERSION_COUNT-1))")
	local SnapshotDB=$(ls ${ShareFolderPath} | grep "${SS_SNAPSHOT_DB_NAME}\..*\.$((BACKUP_VERSION_COUNT-1))")
	local AxisAcsCtrlDB=$(ls ${ShareFolderPath} | grep "${SS_AXISACSCTRL_DB_NAME}\..*\.$((BACKUP_VERSION_COUNT-1))")
	local AxisAcsEvtLogDB=$(ls ${ShareFolderPath} | grep "${SS_AXISACSEVTLOG_DB_NAME}\..*\.$((BACKUP_VERSION_COUNT-1))")

	# Step1: Delete the oldest backup
	if [ -f "${ShareFolderPath}/${SystemDB}" ]; then
		rm -f "${ShareFolderPath}/${SystemDB}"
	fi

	if [ -f "${ShareFolderPath}/${RecordingDB}" ]; then
		rm -f "${ShareFolderPath}/${RecordingDB}"
	fi

	if [ -f "${ShareFolderPath}/${SnapshotDB}" ]; then
		rm -f "${ShareFolderPath}/${SnapshotDB}"
	fi

	if [ -f "${ShareFolderPath}/${AxisAcsCtrlDB}" ]; then
		rm -f "${ShareFolderPath}/${AxisAcsCtrlDB}"
	fi

	if [ -f "${ShareFolderPath}/${AxisAcsEvtLogDB}" ]; then
		rm -f "${ShareFolderPath}/${AxisAcsEvtLogDB}"
	fi

	# Step2: Shift backups version number
	local i=$((BACKUP_VERSION_COUNT-2))
	while [ 0 -le $i ]
	do
		SystemDB=$(ls ${ShareFolderPath} | grep "${SS_SYSTEM_DB_NAME}\..*\.${i}")
		if [ -f "${ShareFolderPath}/${SystemDB}" ]; then
			local Version=`echo ${SystemDB} | cut -d '.' -f 3`
			mv -f "${ShareFolderPath}/${SystemDB}" "${ShareFolderPath}/${SS_SYSTEM_DB_NAME}.${Version}.$((i+1))"
		fi

		RecordingDB=$(ls ${ShareFolderPath} | grep "${SS_REC_DB_NAME}\..*\.${i}")
		if [ -f "${ShareFolderPath}/${RecordingDB}" ]; then
			local Version=`echo ${RecordingDB} | cut -d '.' -f 3`
			mv -f "${ShareFolderPath}/${RecordingDB}" "${ShareFolderPath}/${SS_REC_DB_NAME}.${Version}.$((i+1))"
		fi

		SnapshotDB=$(ls ${ShareFolderPath} | grep "${SS_SNAPSHOT_DB_NAME}\..*\.${i}")
		if [ -f "${ShareFolderPath}/${SnapshotDB}" ]; then
			local Version=`echo ${SnapshotDB} | cut -d '.' -f 3`
			mv -f "${ShareFolderPath}/${SnapshotDB}" "${ShareFolderPath}/${SS_SNAPSHOT_DB_NAME}.${Version}.$((i+1))"
		fi

		AxisAcsCtrlDB=$(ls ${ShareFolderPath} | grep "${SS_AXISACSCTRL_DB_NAME}\..*\.${i}")
		if [ -f "${ShareFolderPath}/${AxisAcsCtrlDB}" ]; then
			local Version=`echo ${AxisAcsCtrlDB} | cut -d '.' -f 3`
			mv -f "${ShareFolderPath}/${AxisAcsCtrlDB}" "${ShareFolderPath}/${SS_AXISACSCTRL_DB_NAME}.${Version}.$((i+1))"
		fi

		AxisAcsEvtLogDB=$(ls ${ShareFolderPath} | grep "${SS_AXISACSEVTLOG_DB_NAME}\..*\.${i}")
		if [ -f "${ShareFolderPath}/${AxisAcsEvtLogDB}" ]; then
			local Version=`echo ${AxisAcsEvtLogDB} | cut -d '.' -f 3`
			mv -f "${ShareFolderPath}/${AxisAcsEvtLogDB}" "${ShareFolderPath}/${SS_AXISACSEVTLOG_DB_NAME}.${Version}.$((i+1))"
		fi

		i=$((i-1))
	done

	# Step3: Copy the newest version of db
	local Version=$(echo ${SURVEILLANCE_PKG_VERSION} | cut -d '-' -f 2)
	cp "${SS_SYSTEM_DB}" "${ShareFolderPath}/${SS_SYSTEM_DB_NAME}.${Version}.0"
	cp "${SS_REC_DB}" "${SS_REC_DB}.${Version}.0"
	cp "${SS_SNAPSHOT_DB}" "${SS_SNAPSHOT_DB}.${Version}.0"
	cp "${SS_AXISACSCTRL_DB}" "${ShareFolderPath}/${SS_AXISACSCTRL_DB_NAME}.${Version}.0"
	cp "${SS_AXISACSEVTLOG_DB}" "${SS_AXISACSEVTLOG_DB}.${Version}.0"
}

BackupSystemDBToPkgVolume()
{
	SSDebugLog "Backup system DB to package volume."

	local PkgVolumeBackupDir="$(__GetPkgVolumeBackupDir)"

	if [ false == "${pkgwizard_keep_system}" ]; then
		if [ -n "PkgVolumeBackupDir" -a "\/" != "PkgVolumeBackupDir" ]; then
			/bin/rm -rf "${PkgVolumeBackupDir}"
		fi
	else
		if [ ! -d "${PkgVolumeBackupDir}" ]; then
			/bin/mkdir "${PkgVolumeBackupDir}"
		fi

		SetValueToConfFile "${SS_SETTINGS_CONF}" "${CONF_KEY_SYS_DB_BKP_PATH}" "${PkgVolumeBackupDir}"
		SetValueToConfFile "${SS_SETTINGS_CONF}" "${CONF_KEY_AXISACSCTRL_DB_BKP_PATH}" "${PkgVolumeBackupDir}"

		mv -f "${SS_SYSTEM_DB}" "${PkgVolumeBackupDir}/"
		mv -f "${SS_EMAP_DIR}" "${PkgVolumeBackupDir}/"
		mv -f "${SS_USER_PHOTO_DIR}" "${PkgVolumeBackupDir}/"
		mv -f "${SS_DATA_DIR}" "${PkgVolumeBackupDir}/"
		mv -f "${SS_AXISACSCTRL_DB}" "${PkgVolumeBackupDir}/"
	fi
}

UpdateEventIndex()
{
	SSDebugLog "UpdateEventIndex."

	local SSShareFolderDir=$(/usr/syno/sbin/synoshare --get "${DEFAULT_SS_SHARE_NAME}" | grep "Path ......" | sed -e 's/^.*\[\(.*\)\]/\1/g')

	if [ ! -d "${SSShareFolderDir}" ]; then
		return
	fi

	if [ false == "${pkgwizard_keep_recording}" ]; then
		# Reindex shared folder
		$SYNO_INDEX_BIN -R $SSShareFolderDir
	fi
}

RemoveShareFolder()
{
	SSDebugLog "Remove share folder."

	# Remove shared folder only when pkg uninstall
	# ${pkgwizard_keep_recording} will be empty value when upgrade pkg
	if [ -z "${pkgwizard_keep_recording}" ]; then
		return
	fi

	local SSShareFolderDir=$(/usr/syno/sbin/synoshare --get "${DEFAULT_SS_SHARE_NAME}" | grep "Path ......" | sed -e 's/^.*\[\(.*\)\]/\1/g')

	if [ ! -d "${SSShareFolderDir}" ]; then
		return
	fi

	if [ false == "${pkgwizard_keep_recording}" ]; then
		if [ false == "${pkgwizard_keep_system}" ]; then
			${SYNO_SHARE_TOOL} --del TRUE "${DEFAULT_SS_SHARE_NAME}"
			if [ -d "${SS_SHARE_FOLDER_LINK}" ]; then
				/bin/rm -rf "${SS_SHARE_FOLDER_LINK}"
			fi
			return
		fi

		local DelFileList=$(ls -1A "${SSShareFolderDir}")

		for KeepFileName in ${REMOVE_RECORDING_KEEP_FILE_NAME_LIST}; do
			DelFileList=$(echo "${DelFileList}" | grep -v "^${KeepFileName}$")
		done

		for DBBackupFile in ${DB_BACKUP_FILE_LIST}; do
			DelFileList=$(echo "${DelFileList}" | grep -v "${DBBackupFile}")
		done

		local ListCnt=1
		local DelFile=$(GetColumnListValue "${DelFileList}" ${ListCnt})
		while [ "" != "${DelFile}" ]; do
			SSDebugLog "Remove ${SSShareFolderDir}/${DelFile}"
			/bin/rm -rf "${SSShareFolderDir}/${DelFile}"
			ListCnt=$(expr ${ListCnt} + 1)
			DelFile=$(GetColumnListValue "${DelFileList}" ${ListCnt})
		done
	fi

	local CapInfoDir="${SSShareFolderDir}/${SS_CAP_INFO_DIR_NAME}"
	if [ -d "${CapInfoDir}" ] && [ -z "$(ls -A "${CapInfoDir}")" ]; then
		rmdir "${CapInfoDir}"
	fi

	if [ -z "$(ls -A "${SSShareFolderDir}")" ]; then
		${SYNO_SHARE_TOOL} --del TRUE "${DEFAULT_SS_SHARE_NAME}"
	fi
}

RemovePgsqlDB()
{
	SSDebugLog "Remove pgsql DB."

	if [ ${USE_SQLITE} == true ]; then
		return
	fi

	if [ false == "${pkgwizard_keep_recording}" ]; then
		local PidList=$(${PGSQL_BIN_PSQL} -t -c "select procpid from pg_stat_activity where datname='${PGSQL_DB_NAME}'")
		for Pid in ${PidList}; do
			kill ${Pid}
		done

		echo "Drop surveillance database"
		${PGSQL_BIN_DROPDB}
		if [ $? != 0 ]; then
			SSDebugLog "Failed to dropdb"
			exit 1
		fi
	fi
}

RemoveSSConfig()
{
	SSDebugLog "Remove ssconfig."

	if [ false == "${pkgwizard_keep_system}" ]; then
		rm -rf "${SS_ETC_FOLDER}"
	fi
}

main()
{
	PackageInfoGet

	SSDebugLog "Start pre-uninstall."

	RemoveFirewallConfig
	RemoveSynosdkPlugin
	RemoveUserDataCollector

	ForceLeaveNonRecMode
	BackupDBToShareFolder
	BackupSystemDBToPkgVolume

	RemoveShareFolder
	RemovePgsqlDB
	RemoveSSConfig

	UpdateEventIndex

	SSDebugLog "Finish pre-uninstall."

	exit 0
}

main "$@"
