diff --git a/sbin/dm_backup.sh b/sbin/dm_backup.sh new file mode 100755 index 0000000000000000000000000000000000000000..b73ffc6f3fd41c0ada37df649f8e1d5fcfc42a7b --- /dev/null +++ b/sbin/dm_backup.sh @@ -0,0 +1,117 @@ +#!/bin/sh + +# +# Script used for backing up DM database + web app +# Deployment configuration can be set in etc/$DM_DM_DB_NAME.deploy.conf file +# +# Usage: +# +# $0 [DM_DB_NAME [DM_BACKUP_DIR]] +# + +DM_DB_NAME=dm +DM_DB_HOST=127.0.0.1 +DM_DB_PORT=11136 +DM_DB_ADMIN_USER=postgres +DM_DB_ADMIN_PASSWORD= + +CURRENT_DIR=`pwd` +MY_DIR=`dirname $0` && cd $MY_DIR && MY_DIR=`pwd` +cd $CURRENT_DIR +if [ -z "${DM_ROOT_DIR}" ]; then + DM_ROOT_DIR=$MY_DIR/.. +fi +DM_SQL_DIR=$DM_ROOT_DIR/db/sql/dm +DM_ENV_FILE=${DM_ROOT_DIR}/setup.sh +if [ ! -f ${DM_ENV_FILE} ]; then + echo "Environment file ${DM_ENV_FILE} does not exist." + exit 2 +fi +. ${DM_ENV_FILE} > /dev/null + +# Use first argument as db name, if provided +if [ ! -z "$1" ]; then + DM_DB_NAME=$1 +fi +echo "Backing up $DM_DB_NAME" + +# Look for deployment file in etc directory, and use it to override +# default entries +deployConfigFile=$DM_ROOT_DIR/etc/${DM_DB_NAME}.deploy.conf +if [ -f $deployConfigFile ]; then + echo "Using deployment config file: $deployConfigFile" + . $deployConfigFile +else + echo "Deployment config file $deployConfigFile not found, using defaults" +fi + +# Determine run directory +if [ -z "${DM_INSTALL_DIR}" ]; then + DM_INSTALL_DIR=$DM_ROOT_DIR/.. +fi + +# Second argument overrides directory with db population scripts +#timestamp=`date +%Y%m%d.%H%M%S` +timestamp=`date +%Y%m%d` +DM_BACKUP_DIR=$2 +if [ -z $DM_BACKUP_DIR ]; then + DM_BACKUP_DIR=$DM_INSTALL_DIR/backup/$DM_DB_NAME/$timestamp +fi +backupFile=${DM_DB_NAME}.backup.$timestamp.sql +fullBackupFilePath=$DM_BACKUP_DIR/$backupFile + +# Read password +sttyOrig=`stty -g` +stty -echo +read -p "Enter $DM_DB_NAME user password: " DM_DB_USER_PASSWORD +stty $sttyOrig +echo + +DM_DB_USER_PASSWORD_FILE=/tmp/${DM_DB_NAME}.${DM_DB_USER}.passwd +echo $DM_DB_HOST:$DM_DB_PORT:$DM_DB_NAME:$DM_DB_USER:$DM_DB_USER_PASSWORD > $DM_DB_USER_PASSWORD_FILE && chmod 600 $DM_DB_USER_PASSWORD_FILE || exit 1 + +pgDumpCmd="PGPASSFILE=$DM_DB_USER_PASSWORD_FILE pg_dump -C -c -w --column-inserts -p $DM_DB_PORT -h $DM_DB_HOST -U $DM_DB_USER -d $DM_DB_NAME" + +cleanup() { + rm -f $DM_DB_USER_PASSWORD +} + +execute() { + eval "$@" +} + +echo +echo "Using DB backup directory: $DM_BACKUP_DIR" + +mkdir -p $DM_BACKUP_DIR +eval $pgDumpCmd > $fullBackupFilePath || ( cleanup && exit 1 ) + +nTables=`grep -n "Data for Name" $fullBackupFilePath | grep TABLE | wc -l` +echo "Processing $nTables tables" + +tableCnt=0 +processingFile=$DM_BACKUP_DIR/process.txt +while [ $tableCnt -lt $nTables ]; do + tableCnt=`expr $tableCnt + 1` + headLine=$tableCnt + tailLine=2 + echo "Working on table #: $tableCnt" + grep -n "TABLE DATA" $fullBackupFilePath | head -$headLine | tail -$tailLine > $processingFile + dbTable=`cat $processingFile | head -1 | awk '{print $5}' | sed 's?;??g'` + echo "Creating sql script for $dbTable" + targetFile=$DM_BACKUP_DIR/populate_$dbTable.sql + pgDumpCmd="PGPASSFILE=$DM_DB_USER_PASSWORD_FILE pg_dump -C -a -t $dbTable -w --column-inserts -p $DM_DB_PORT -h $DM_DB_HOST -U $DM_DB_USER -d $DM_DB_NAME" + eval $pgDumpCmd > $targetFile || ( cleanup && exit 1 ) +done +rm -f $processingFile + +# Backup web app +echo "Backing up $DM_DB_NAME web app" +rsync -arlvP $DM_SUPPORT_DIR/glassfish/linux-x86_64/glassfish/domains/domain1/autodeploy/$DM_DB_NAME.war $DM_BACKUP_DIR + +cleanup +echo "Backup of $DM_DB_NAME is done." + + + +