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/SynologyApplicationService/scripts/db_functions
#!/bin/sh

#TODO: move lib to /lib4
#bin related
MKDIR_BIN="/bin/mkdir"
RM_BIN="/bin/rm"
CUT_BIN="/bin/cut"
GREP_BIN="/bin/grep"
FIND_BIN="/bin/find"
SUDO="/bin/sudo"
WC_BIN="/bin/wc"
KILLALL_BIN="/usr/bin/killall"
CHOWN_BIN="/bin/chown"
SH_BIN="/bin/sh"
STAT_BIN="/bin/stat"
CHMOD_BIN="/bin/chmod"

SYNOGETKEYVALUE="/usr/syno/bin/synogetkeyvalue"
SYNOSETKEYVALUE="/usr/syno/bin/synosetkeyvalue"

# pgsql related
PSQL="/usr/bin/psql"
CREATEDB="/usr/bin/createdb"
DROPDB="/usr/bin/dropdb"
DUMPDB="/usr/bin/pg_dump"
DB_NAME="ong"
DB_USER="SynologyApplicationService"
DB_DIR="/var/packages/SynologyApplicationService/target/share/synoscim/db"

SQLITE="/bin/sqlite3"
NOTIFY_DB_DIR="/var/packages/SynologyApplicationService/target/share/personalnotify/db"
NOTIFY_DB_FILE="/usr/syno/etc/notification/notification_db_daemon.sqlite"
NOTIFY_DB_VOLUME_FILE="/usr/local/SynologyApplicationService/notification/notification_db_daemon.sqlite"

PGSQL_ERROR_PREFIX="ERROR"
SQLITE_ERROR_PREFIX="Error"

SETTINGS_PATH="/var/packages/SynologyApplicationService/etc/settings.conf";
DEFAULT_SETTINGS_PATH="/var/packages/SynologyApplicationService/target/etc/settings.conf";


IsSCIMSchemaExist()
{
	if $SUDO -u $DB_USER $PSQL -lqt | $CUT_BIN -d \| -f 1 | $GREP_BIN -w $DB_NAME > /dev/null ; then
		return 0
	else
		return 1
	fi
}

UpdateSCIMSchemaByVersion()
{
	version=$1
	local files=`$FIND_BIN $DB_DIR -name "${version}__*.sql" | sort`
	for file in $files;
	do
		if [ -f $file ]; then
			result=$({
				$SUDO -u $DB_USER $PSQL -d $DB_NAME < $file;
			} 2>&1)
			if [[ $result == *"$PGSQL_ERROR_PREFIX"* ]]; then
				echo $result > $SYNOPKG_TEMP_LOGFILE
				return 1
			fi
		else
			return 1
		fi
	done
	return 0
}

UpdateNotifySchemaByVersion()
{
	version=$1
	local files=`$FIND_BIN $NOTIFY_DB_DIR -name "${version}__*.sql" | sort`
	for file in $files;
	do
		if [ -f $file ]; then
			result=$({
				$SQLITE $NOTIFY_DB_VOLUME_FILE < $file
			} 2>&1)
			if [[ $result == "$SQLITE_ERROR_PREFIX"* ]]; then
				echo $result > $SYNOPKG_TEMP_LOGFILE
				return 1
			fi
		else
			return 1
		fi
	done
	return 0
}

UpdateSchema()
{
	local now=1
	local max=$($FIND_BIN $DB_DIR -type f | $WC_BIN -l)
	local result=$({
		$SUDO -u $DB_USER $PSQL -t -d $DB_NAME -c "select version from sql_version order by version desc limit 1;"
	} 2>&1)
	if [[ $result != *"$PGSQL_ERROR_PREFIX"* ]]; then
		now=`expr $result + 1`
	fi

	for i in $(seq $now $max)
	do
		if ! UpdateSCIMSchemaByVersion $i; then
			return 1
		fi
	done
	local now=`expr $($SQLITE $NOTIFY_DB_FILE "select version from sql_version order by version desc limit 1;") + 1`
	local max=$($FIND_BIN $NOTIFY_DB_DIR -type f | $WC_BIN -l)
	for i in $(seq $now $max)
	do
		if ! UpdateNotifySchemaByVersion $i; then
			return 1
		fi
	done
	return 0
}

CreateSchema()
{
	if ! IsSCIMSchemaExist; then
		$SUDO -u $DB_USER $CREATEDB $DB_NAME
		if ! UpdateSCIMSchemaByVersion 1; then
			return 1
		fi
	fi
	if [ ! -f $NOTIFY_DB_FILE ]; then
		if [ -f "/usr/syno/etc/notification/notification_db.sqlite" ]; then
			/bin/mv /usr/syno/etc/notification/notification_db.sqlite $NOTIFY_DB_VOLUME_FILE
		fi
		if [ ! -f $NOTIFY_DB_VOLUME_FILE ]; then
			$MKDIR_BIN -p "/usr/syno/etc/notification"
			$MKDIR_BIN "/usr/local/SynologyApplicationService/notification"
			if ! UpdateNotifySchemaByVersion 1; then
				return 1
			fi
		fi
		ln -s ${NOTIFY_DB_VOLUME_FILE} ${NOTIFY_DB_FILE}
	fi
	if [[ ! -L $NOTIFY_DB_FILE && ! -f $NOTIFY_DB_VOLUME_FILE ]]; then
		$MKDIR_BIN "/usr/local/SynologyApplicationService/notification"
		/bin/mv ${NOTIFY_DB_FILE} ${NOTIFY_DB_VOLUME_FILE}
		ln -s ${NOTIFY_DB_VOLUME_FILE} ${NOTIFY_DB_FILE}
	fi
	if [[ -L $NOTIFY_DB_FILE && ! -f $NOTIFY_DB_VOLUME_FILE ]]; then
		$MKDIR_BIN "/usr/local/SynologyApplicationService/notification"
		if ! UpdateNotifySchemaByVersion 1; then
			return 1
		fi
	fi
	return 0
}

BackupSCIMDB()
{
	local outfile=$1
	if [ ! -f $outfile ]; then
		exit 1;
	fi
	$SUDO -u $DB_USER $DUMPDB $DB_NAME > $outfile
	if [ 0 != $? ]; then
		exit 1;
	else
		exit 0;
	fi
}

RestoreSCIMDB()
{
	local infile=$1
	if [ ! -f $infile ]; then
		exit 1;
	fi
	$SUDO -u postgres $PSQL -c "ALTER DATABASE $DB_NAME RENAME TO ong_bak;"
	if [ 0 != $? ]; then
		$SUDO -u $DB_USER $DROPDB ong_bak
		exit 1
	fi
	$SUDO -u $DB_USER $CREATEDB $DB_NAME
	if [ 0 != $? ]; then
		$SUDO -u $DB_USER $DROPDB $DB_NAME
		$SUDO -u postgres $PSQL -c "ALTER DATABASE ong_bak RENAME TO $DB_NAME;"
		exit 1
	fi
	$SUDO -u $DB_USER $PSQL $DB_NAME < $infile
	if [ 0 != $? ]; then
		$SUDO -u $DB_USER $DROPDB $DB_NAME
		$SUDO -u postgres $PSQL -c "ALTER DATABASE ong_bak RENAME TO $DB_NAME;"
		exit 1
	fi
	$SUDO -u $DB_USER $DROPDB ong_bak
	UpdateSchema
	exit 0
}

DropSCIMSchema()
{
	if IsSCIMSchemaExist; then
		$SUDO -u $DB_USER $DROPDB $DB_NAME
	fi
}

DropNOTIFYSchema()
{
	if [  -f $NOTIFY_DB_FILE ]; then
		$RM_BIN $NOTIFY_DB_FILE
	fi

	if [  -f $NOTIFY_DB_VOLUME_FILE ]; then
		$RM_BIN $NOTIFY_DB_VOLUME_FILE
	fi
}

MigrateSettings()
{
	local result=""
	if [ ! -f $SETTINGS_PATH ]; then
		cp $DEFAULT_SETTINGS_PATH $SETTINGS_PATH
	fi
	if IsSCIMSchemaExist; then
		result=$({
			$SUDO -u $DB_USER $PSQL -t -d ong -c "SELECT pg_catalog.pg_get_userbyid(d.datdba) FROM pg_catalog.pg_database d WHERE d.datname = 'ong' ORDER BY 1;"
		} 2>&1)
		if [[ $result != *"$DB_USER"* ]]; then
			result=$({
				$SUDO -u postgres $PSQL -c "ALTER DATABASE ong OWNER TO \"$DB_USER\""
			} 2>&1)
			if [[ $result == *"$PGSQL_ERROR_PREFIX"* ]]; then
				echo $result > $SYNOPKG_TEMP_LOGFILE
				return 1
			fi
			result=$({
				$SUDO -u postgres $PSQL ong -c "GRANT postgres TO \"$DB_USER\""
			} 2>&1)
			if [[ $result == *"$PGSQL_ERROR_PREFIX"* ]]; then
				echo $result > $SYNOPKG_TEMP_LOGFILE
				return 1
			fi
		fi
	fi
	return 0;
}