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

PKG_COMMON_SCRIPT="/var/packages/SurveillanceStation/target/scripts/pkg_common.sh"
. ${PKG_COMMON_SCRIPT}

# config migration
PKG_CONFIG_MIGRATE_SH="/usr/syno/bin/package_config_migrate.sh"
MOV_SYNOINFO_KEYS="ss_cms ss_vs ss_cms_slave runvisualstation"
DEL_SYNOINFO_KEYS="runsurveillance supportsurveillance surveillance_license_max ss_sync_event_player customizedsurvstation"

# db related
SS_SYSTEM_SQL_SCRIPT="${SS_SCRIPTS_DIR}/sql/system.sql"
SS_REC_SQL_SCRIPT="${SS_SCRIPTS_DIR}/sql/recording.sql"
SS_REC_CNT_SQL_SCRIPT="${SS_SCRIPTS_DIR}/sql/recording_cnt.sql"
SS_AXISACSCTRL_SQL_SCRIPT="${SS_AXISACSCTRL_DIR}/sql/axisacsctrl.sql"
PGSQL_DUMP_FILE="/tmp/ss_pgsql_db.dump"
PGSQL_DUMP_FILE_TMP="${PGSQL_DUMP_FILE}.tmp"

# ss upgrader
SS_PRE_VERSION_PATH="/tmp/SurveillanceStation.upgrade"
SS_UPGRADER="${SS_TARGET_DIR}/bin/ssupgrader"

# device pack
SS_DP_DIR="${SS_TARGET_DIR}/device_pack"
SS_DP_POSTINST="${SS_DP_DIR}/script/postinst"
SS_DP_DIR_DEFAULT="${SS_DP_DIR}.default"
SS_DP_TMP_BASE_PATH="/tmp/@PreDevicePack"
SS_DP_TMP_PATH="${SS_DP_TMP_BASE_PATH}/device_pack"

# dp rss server path
CONF_DP_RSS_SERVER_KEY="ss_dp_rss_server"
CONF_DP_RSS_SERVER_VALUE="http://update.synology.com/DPautoupdate/genRSS.php"

UnregisterVolumeForEDS14()
{
	# 6.1 & 6.2 would register volume event to stop SurveillanceStation.
	# After 6.3 this event should be unregistered since non-recording mode is ready.
	if [ true == $(IsModelEDS14) ]; then
		${SYNO_SERVICE_TOOL} --unregvol -n SurveillanceStation -t SERVICE_PKG > /dev/null 2>&1
	fi
}

RemoveOldCameraConf()
{
	SSDebugLog "Remove old camera conf."

	# Remove old camera_support.conf
	if [ -f "/usr/syno/etc/camera_support.conf" ]; then
		rm -f "/usr/syno/etc/camera_support.conf"
	fi
	if [ -f "/usr/syno/etc.defaults/camera_support.conf" ]; then
		rm -f "/usr/syno/etc.defaults/camera_support.conf"
	fi

	# Remove old camera_model.conf
	if [ -f "/usr/syno/etc/camera_model.conf" ]; then
		rm -f "/usr/syno/etc/camera_model.conf"
	fi
	if [ -f "/usr/syno/etc.defaults/camera_model.conf" ]; then
		rm -f "/usr/syno/etc.defaults/camera_model.conf"
	fi
}

PrepareSettingsConf()
{
	SSDebugLog "Update settings conf."

	# Install settings.conf
	if [ ! -f "${SS_SETTINGS_CONF}" ]; then
		cp "${PACKAGE_DEST}"/etc/settings.conf "${SS_SETTINGS_CONF}"
	fi
	mv -f "${PACKAGE_DEST}"/etc/settings.conf "${SS_PACKAGE_DIR}"/etc/settings.conf.default

	# Write selected volume path into settings.conf
	local INTALL_SEL_SHARE_VOL_PATH="${vol_path}"
	if [ -n "${INTALL_SEL_SHARE_VOL_PATH}" ]; then
		SSDebugLog "Selected share folder volume path: ${INTALL_SEL_SHARE_VOL_PATH}"
		SetValueToConfFile "${SS_SETTINGS_CONF}" "${CONF_KEY_ACTIVE_VOLUME}" "${INTALL_SEL_SHARE_VOL_PATH}"
	fi

	# Upgrade conf key from CONF_KEY_SYS_DB_BKP_VOLUME to CONF_KEY_SYS_DB_BKP_PATH
	local CONF_KEY_SYS_DB_BKP_VOLUME="system_db_backup_volume"
	local BackupVolume=$(GetValueFromConfFile "${SS_SETTINGS_CONF}" "${CONF_KEY_SYS_DB_BKP_VOLUME}")
	if [ -n "${BackupVolume}" ]; then
		SetValueToConfFile	"${SS_SETTINGS_CONF}" "${CONF_KEY_SYS_DB_BKP_PATH}" "${BackupVolume}/${DEFAULT_SS_SHARE_NAME}"
		RemoveKeyFromConfFile "${SS_SETTINGS_CONF}" "${CONF_KEY_SYS_DB_BKP_VOLUME}"
	fi

	# Always set dp rss server value to default
	SetValueToConfFile "${SS_SETTINGS_CONF}" "${CONF_DP_RSS_SERVER_KEY}" "${CONF_DP_RSS_SERVER_VALUE}"

	# Migrate settings
	${PKG_CONFIG_MIGRATE_SH} move "/etc/synoinfo.conf" "${SS_PACKAGE_DIR}/etc/settings.conf" "$MOV_SYNOINFO_KEYS"
	${PKG_CONFIG_MIGRATE_SH} del "/etc/synoinfo.conf" "$DEL_SYNOINFO_KEYS"
}

LinkResource()
{
	SSDebugLog "Start to link resource."

	chmod 777 "${SS_PACKAGE_DIR}"/target/ui/config
	rm -rf "${SS_PACKAGE_DIR}"/target/ui/scripts
	ln -sf "/usr/syno/synoman/scripts" "${SS_PACKAGE_DIR}"/target/ui/scripts
}

UpgradeDB()
{
	SSDebugLog "Start to upgrade DB."

	${PGSQL_BIN_PSQL} -c "select 1 from camera" > /dev/null 2>&1
	Ret=$?

	if [ ${USE_SQLITE} == false ]; then
		if [ ${Ret} == 2 ]; then
			SSDebugLog "Create surveillance database."
			${PGSQL_BIN_CREATEDB}
			if [ $? != 0 ]; then
				SSDebugLog "Failed to create db."
				exit 1
			fi
	
			${PGSQL_BIN_PSQL} < ${SS_SYSTEM_SQL_SCRIPT} > /dev/null 2>&1
			if [ $? != 0 ]; then
				SSDebugLog "Failed to create system db."
				exit 2
			fi
			${PGSQL_BIN_PSQL} < ${SS_REC_SQL_SCRIPT} > /dev/null 2>&1
			if [ $? != 0 ]; then
				SSDebugLog "Failed to create recording db."
				exit 2
			fi
		fi
	else
		local SystemSqlPath="${SS_SYSTEM_SQL_SCRIPT}"
		local RecordingSqlPath="${SS_REC_SQL_SCRIPT}"
		local blDropUnnecessaryTables=false

		PrepareShareFolder false
		if [ 0 -ne "$?" ]; then
			SSDebugLog "Failed to prepare share folder while installation. Enter non-recording mode."
			SetNonRecordingMode true
                else
                        SSDebugLog "Remove non-recording mode file ${SS_NON_RECORDING_FILE}."
                        rm -f ${SS_NON_RECORDING_FILE}
		fi

		# Dump pgsql db if exists
		if [ ${Ret} == 0 ]; then
			${PGSQL_BIN_PG_DUMP} > "${PGSQL_DUMP_FILE_TMP}"
			${SS_UTILS_SCRIPT} --replace-sql-symbol-for-sqlite "${PGSQL_DUMP_FILE_TMP}" "${PGSQL_DUMP_FILE}"

			SystemSqlPath="${PGSQL_DUMP_FILE}"
			RecordingSqlPath="${PGSQL_DUMP_FILE}"
			blDropUnnecessaryTables=true

			# Backup pgsql dump file
			mv -f "${PGSQL_DUMP_FILE_TMP}" "${SS_SHARE_FOLDER_LINK}/"
			Ret=$?
			if [ ${Ret} != 0 ]; then
				SSDebugLog "Failed to backup pgsql"
			fi
		fi

		# Prepare system db
		if [ ! -f "${SS_SYSTEM_DB}" ]; then
			local BackupPath=$(GetValueFromConfFile "${SS_SETTINGS_CONF}" "${CONF_KEY_SYS_DB_BKP_PATH}")
			local SystemDBBackup="${BackupPath}/${SS_SYSTEM_DB_NAME}"
			local blBackupExist=true

			if [ ! -f "${SystemDBBackup}" ]; then
				local SystemDBInShareFolder="${SS_SHARE_FOLDER_LINK}/${SS_SYSTEM_DB_NAME}"
				if [ ! -f "${SystemDBInShareFolder}" ]; then
					blBackupExist=false
				else
					BackupPath="${SS_SHARE_FOLDER_LINK}"
					SystemDBBackup="${SystemDBInShareFolder}"
				fi
			fi

			if [ true == ${blBackupExist} ]; then
				SSDebugLog "System db backup already exist."
				mv -f "${SystemDBBackup}" "${SS_TARGET_DIR}" > /dev/null 2>&1

				local EmapDirBackup="${BackupPath}/${SS_EMAP_DIR_NAME}"
				if [ -d "${EmapDirBackup}" ]; then
					rm -rf "${SS_EMAP_DIR}" > /dev/null 2>&1
					mv -f "${EmapDirBackup}" "${SS_EMAP_DIR}" > /dev/null 2>&1
				fi

				local UserPhotoDirBackup="${BackupPath}/${SS_USER_PHOTO_DIR_NAME}"
				if [ -d "${UserPhotoDirBackup}" ]; then
					rm -rf "${SS_USER_PHOTO_DIR}" > /dev/null 2>&1
					mv -f "${UserPhotoDirBackup}" "${SS_USER_PHOTO_DIR}" > /dev/null 2>&1
				fi

				local DataDirBackup="${BackupPath}/${SS_DATA_DIR_NAME}"
				if [ -d "${DataDirBackup}" ]; then
					rm -rf "${SS_DATA_DIR}" > /dev/null 2>&1
					mv -f "${DataDirBackup}" "${SS_DATA_DIR}" > /dev/null 2>&1
				fi
			else
				SSDebugLog "Create system db from ${SystemSqlPath}."
				${SQLITE3} "${SS_SYSTEM_DB}" < "${SystemSqlPath}" > /dev/null 2>&1
				if [ true == ${blDropUnnecessaryTables} ]; then
					${SS_UTILS_SCRIPT} --drop-sqlite-unnecessary-tables "${SS_SYSTEM_DB}" true
				fi
			fi

			RemoveKeyFromConfFile "${SS_SETTINGS_CONF}" "${CONF_KEY_SYS_DB_BKP_PATH}"
		fi

		# Prepare recording db
		if [ false == $(IsNonRecordingMode) -a ! -f "${SS_REC_DB}" ]; then
			SSDebugLog "Create recording db from ${RecordingSqlPath}."
			${SQLITE3} "${SS_REC_DB}" < "${RecordingSqlPath}" > /dev/null 2>&1
			if [ true == ${blDropUnnecessaryTables} ]; then
				${SS_UTILS_SCRIPT} --drop-sqlite-unnecessary-tables "${SS_REC_DB}" false
			fi
                else
                        local IsRecDbExist=false
                        if [ -f "${SS_REC_DB}" ]; then
                            IsRecDbExist=true
                        fi
                        SSDebugLog "Dont create recording db since non-rec mode = $(IsNonRecordingMode), ${SS_REC_DB} exists = ${IsRecDbExist}."
		fi

		# Prepare recording_cnt db
		if [ false == $(IsNonRecordingMode) -a ! -f "${SS_REC_CNT_DB}" ]; then
			${SQLITE3} "${SS_REC_CNT_DB}" < "${SS_REC_CNT_SQL_SCRIPT}" > /dev/null 2>&1
                else
                        local IsRecCntDbExist=false
                        if [ -f "${SS_REC_CNT_DB}" ]; then
                            IsRecCntDbExist=true
                        fi
                        SSDebugLog "Dont create recording cnt db since non-rec mode = $(IsNonRecordingMode), ${SS_REC_CNT_DB} exists = ${IsRecCntDbExist}."

		fi

		# Prepare axisacsctrl db
		if [ ! -f "${SS_AXISACSCTRL_DB}" ]; then
			local BackupDB="$(PrepareBackupDB "${SS_SETTINGS_CONF}" \
						   "${CONF_KEY_AXISACSCTRL_DB_BKP_PATH}" "${SS_AXISACSCTRL_DB_NAME}")"

			if [ -n "${BackupDB}" ]; then
				SSDebugLog "axisacsctrl db backup already exist."
				mv -f "${BackupDB}" "${SS_TARGET_DIR}" > /dev/null 2>&1
			else
				SSDebugLog "Create axisacsctrl db from ${SS_AXISACSCTRL_SQL_SCRIPT}."
				${SQLITE3} "${SS_AXISACSCTRL_DB}" < "${SS_AXISACSCTRL_SQL_SCRIPT}" > /dev/null 2>&1
			fi

			RemoveKeyFromConfFile "${SS_SETTINGS_CONF}" "${CONF_KEY_AXISACSCTRL_DB_BKP_PATH}"
		fi

		# Prepare axisacsevtlog db
		if [ false == $(IsNonRecordingMode) -a ! -f "${SS_AXISACSEVTLOG_DB}" ]; then
			SSDebugLog "Create axisacsevtlog db from ${SS_AXISACSEVTLOG_SQL_SCRIPT}."
			${SQLITE3} "${SS_AXISACSEVTLOG_DB}" < "${SS_AXISACSEVTLOG_SQL_SCRIPT}" > /dev/null 2>&1
		fi

		# Prepare snapshot db
		if [ false == $(IsNonRecordingMode) -a ! -f "${SS_SNAPSHOT_DB}" ]; then
			SSDebugLog "Create snapshot db from ${SS_SNAPSHOT_SQL_SCRIPT}."
			${SQLITE3} "${SS_SNAPSHOT_DB}" < "${SS_SNAPSHOT_SQL_SCRIPT}" > /dev/null 2>&1
		fi

		# Drop pgsql data
		if [ ${Ret} == 0 ]; then
			${PGSQL_BIN_DROPDB}
			if [ $? != 0 ]; then
				SSDebugLog "Failed to drop pgsql surveillance db."
			fi
		fi
	fi

	${SS_SCRIPTS_DIR}/sql/sql.sh
	${SS_AXISACSCTRL_DIR}/sql/sql.sh
}

RunSSUpgrader()
{
	SSDebugLog "Start to run ssupgrader."

	local PreVersion=0;

	if [ -f "${SS_PRE_VERSION_PATH}" ]; then
		# Get pre-upgrade version
		eval $(grep "^PreVer=" "${SS_PRE_VERSION_PATH}")

		if [ -n "${PreVer}" ]; then
			PreVersion=$(echo ${PreVer} | cut -d'-' -f2)
		fi

		rm -f "${SS_PRE_VERSION_PATH}"
	fi

	${SS_UPGRADER} ${PreVersion}
}

InstallDPForSSUpgrade()
{
	# If previous device pack version is newer, use it. Else, do Upgrader with previous version
	local PreDPVer=$(GetValueFromConfFile "${SS_DP_TMP_PATH}"/conf "version")
	local PreDPBuildNum=$(echo "${PreDPVer}" | cut -d'-' -f2)

	local DPVer=$(GetValueFromConfFile "${SS_DP_DIR}"/conf "version")
	local DPBuildNum=$(echo "${DPVer}" | cut -d'-' -f2)

	if [[ $PreDPBuildNum -gt $DPBuildNum ]]; then
		rm -rf "${SS_DP_DIR}"
		mv -f "${SS_DP_TMP_PATH}" "${SS_TARGET_DIR}"
	fi
	
	rm -rf "${SS_DP_TMP_BASE_PATH}"
}

InstallDevicePack()
{
	SSDebugLog "Start to install device pack."

	if [ -d "${SS_DP_DIR_DEFAULT}" ]; then
		rm -rf "${SS_DP_DIR_DEFAULT}"
	fi
	cp -rf "${SS_DP_DIR}" "${SS_DP_DIR_DEFAULT}"

	if [ -d "${SS_DP_TMP_PATH}" ]; then
		InstallDPForSSUpgrade
	fi
	${SS_DP_POSTINST}
}

ReplaceHelpFile()
{
	SSDebugLog "Start to replace help file."

	local help_dir=${SS_TARGET_DIR}/ui/help/
	local help_ori_str="\\\$_DSPRODUCTNAME_\\\$"
	local help_rep_str=$(sed -n 's,upnpmodelname="\([^"]*\)",\1,p' /etc.defaults/synoinfo.conf)

	find "$help_dir" -name "*.html" -exec sed -i "s,$help_ori_str,$help_rep_str,g" {} \;
	return $?
}

main ()
{
	SSDebugLog "Start post-install."

	UnregisterVolumeForEDS14
	RemoveOldCameraConf
	PrepareSettingsConf
	ReplaceHelpFile

	LinkResource
	UpgradeDB
	RunSSUpgrader
	InstallDevicePack

	InstallFirewallConf
	InstallSynosdkPlugin
	InstallUserDataCollector

	SSDebugLog "Finish post-install."

	exit 0
}

main "$@"
