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;
}