From 825ce9a205a984e670a3d455b6a92e2b29e96b05 Mon Sep 17 00:00:00 2001 From: Carlos Ruiz Date: Sun, 16 Dec 2018 02:47:17 +0100 Subject: [PATCH] IDEMPIERE-3849 RUN_MonitoredSyncDB.sh --- .../utils.unix/RUN_MonitoredSyncDB.sh | 10 + .../utils.unix/oracle/MonitoredSyncDB.sh | 303 ++++++++++++++++++ .../utils.unix/postgresql/MonitoredSyncDB.sh | 290 +++++++++++++++++ .../utils.windows/RUN_MonitoredSyncDB.bat | 4 + .../utils.windows/oracle/MonitoredSyncDB.bat | 28 ++ .../postgresql/MonitoredSyncDB.bat | 29 ++ 6 files changed, 664 insertions(+) create mode 100755 org.adempiere.server-feature/utils.unix/RUN_MonitoredSyncDB.sh create mode 100755 org.adempiere.server-feature/utils.unix/oracle/MonitoredSyncDB.sh create mode 100755 org.adempiere.server-feature/utils.unix/postgresql/MonitoredSyncDB.sh create mode 100644 org.adempiere.server-feature/utils.windows/RUN_MonitoredSyncDB.bat create mode 100644 org.adempiere.server-feature/utils.windows/oracle/MonitoredSyncDB.bat create mode 100644 org.adempiere.server-feature/utils.windows/postgresql/MonitoredSyncDB.bat diff --git a/org.adempiere.server-feature/utils.unix/RUN_MonitoredSyncDB.sh b/org.adempiere.server-feature/utils.unix/RUN_MonitoredSyncDB.sh new file mode 100755 index 0000000000..80aed34f68 --- /dev/null +++ b/org.adempiere.server-feature/utils.unix/RUN_MonitoredSyncDB.sh @@ -0,0 +1,10 @@ +#!/bin/sh + +# Author Carlos Ruiz +if [ $IDEMPIERE_HOME ]; then + cd $IDEMPIERE_HOME/utils +fi +. ./myEnvironment.sh Server +echo Synchronize iDempiere Database - $IDEMPIERE_HOME \($ADEMPIERE_DB_NAME\) + +sh $ADEMPIERE_DB_PATH/MonitoredSyncDB.sh "$ADEMPIERE_DB_USER" "$ADEMPIERE_DB_PASSWORD" "$ADEMPIERE_DB_PATH" $* diff --git a/org.adempiere.server-feature/utils.unix/oracle/MonitoredSyncDB.sh b/org.adempiere.server-feature/utils.unix/oracle/MonitoredSyncDB.sh new file mode 100755 index 0000000000..96635a2b01 --- /dev/null +++ b/org.adempiere.server-feature/utils.unix/oracle/MonitoredSyncDB.sh @@ -0,0 +1,303 @@ +#!/bin/sh +# +# Author: Carlos Ruiz - globalqss +# Script to synchronize the database with latest migration scripts allowing a remote monitored way +# +# Intended process: +# 1. Customer executes bash RUN_MonitoredSyncDB.sh (folder can be specified as an optional parameter) +# 2. The program executes all pending scripts UNTIL an error is found +# When an error is found it register the output of the script in AD_Migration_Script.Script column +# The program stop the process informing the error +# 3. Vendor send a fix to the customer to integrate in the same folder +# Conditions: +# The script must have the same name as the script changing the suffix .sql by .001.fix - then .002.fix and so on +# for example if 201811121420_IDEMPIERE-2648.sql fails, then Vendor must provide a file +# 201811121420_IDEMPIERE-2648.001.fix and send it to customer to integrate in the same folder as the sql failed +# if the 001.fix fails then it can provide a 002.fix and keep going until the error is solved +# It is expected that the script 001.fix always end registering calling register_migration_script +# and also cleaning the Error status from the script that is fixing via update, for example: +# script 201811121420_IDEMPIERE-2648.001.fix is expected to end with these two lines: +# UPDATE AD_MigrationScript SET Status='IP' WHERE Name='201811121420_IDEMPIERE-2648.sql'); +# SELECT register_migration_script('201811121420_IDEMPIERE-2648.001.fix') FROM dual; +# and similar the script 201811121420_IDEMPIERE-2648.002.fix is expected to end with these two lines: +# UPDATE AD_MigrationScript SET Status='IP' WHERE Name='201811121420_IDEMPIERE-2648.001.fix'); +# SELECT register_migration_script('201811121420_IDEMPIERE-2648.002.fix') FROM dual; +# and so on +# 4. If there is an email registered in AD_System.SupportEMail and there is an accessible sendmail program then +# this script tries to send an email to that support informing the error +# 5. All the above steps are intended to be executed initially in a test or stage environment +# When executed again on a clean environment, or applied in production, the script automatically applies the fixes and continue +# + +echo Synchronize iDempiere Database + +echo Upgrading database "$1@$ADEMPIERE_DB_NAME" + +if [ $# -eq 0 ] + then + echo "Usage: $0 " + echo "Example: $0 adempiere adempiere" + exit 1 +fi +if [ "$IDEMPIERE_HOME" = "" ] || [ "$ADEMPIERE_DB_NAME" = "" ] || [ "$ADEMPIERE_DB_SERVER" = "" ] || [ "$ADEMPIERE_DB_PORT" = "" ] + then + echo "Please make sure that the environment variables are set correctly:" + echo " IDEMPIERE_HOME e.g. /idempiere" + echo " ADEMPIERE_DB_NAME e.g. adempiere or xe" + echo " ADEMPIERE_DB_SERVER e.g. dbserver.adempiere.org" + echo " ADEMPIERE_DB_PORT e.g. 5432 or 1521" + exit 1 +fi + +TMPFOLDER=/tmp +ADEMPIERE_DB_USER=$1 +ADEMPIERE_DB_PASSWORD=$2 +ADEMPIERE_DB_PATH=$3 +CMD="sqlplus $ADEMPIERE_DB_USER/$ADEMPIERE_DB_PASSWORD@$ADEMPIERE_DB_SERVER:$ADEMPIERE_DB_PORT/$ADEMPIERE_DB_NAME" +SILENTCMD="sqlplus -S $ADEMPIERE_DB_USER/$ADEMPIERE_DB_PASSWORD@$ADEMPIERE_DB_SERVER:$ADEMPIERE_DB_PORT/$ADEMPIERE_DB_NAME" +ERROR_STRINGS="\b(ORA-[0-9]+:|TNS-|PLS-|SP2-)" +DIR_POST=$IDEMPIERE_HOME/migration +if [ "x$4" = "x" ] +then + DIR_SCRIPTS=$IDEMPIERE_HOME/migration +else + if [ "${4#/}" = "${4}" ] + then + DIR_SCRIPTS="$IDEMPIERE_HOME/$4" + else + DIR_SCRIPTS="$4" + fi +fi + +cd "$DIR_SCRIPTS" || exit 1 + +mkdir $TMPFOLDER/SyncDB_out_$$ + +apply_script() +{ + SCRIPT="$1" + OUTFILE="$2" + FILE="$3" + echo "Applying $SCRIPT" + $CMD > "$OUTFILE" 2>&1 < "$SCRIPT" + APPLIED=Y + if grep -E "$ERROR_STRINGS" "$OUTFILE" > /dev/null 2>&1 + then + echo "Found error in $SCRIPT" + # record error in ad_migrationscript + echo "update ad_migrationscript set status='ER' where name='$FILE';" | $CMD >> "$OUTFILE" 2>&1 + return 1 + else + return 0 + fi +} + +process_fix() +{ + FAILEDSCRIPT=$1 + SUFFIX="${FAILEDSCRIPT##*.}" + if [ "sql" = "$SUFFIX" ] + then + TMPBASE="${FAILEDSCRIPT##*/}" + BASE="${TMPBASE%.sql}" + elif [ "fix" = "$SUFFIX" ] + then + TMPBASE="${FAILEDSCRIPT##*/}" + BASE="${TMPBASE%.[0-9][0-9][0-9].fix}" + fi + if [ -z "$BASE" ] + then + MSGERROR="$MSGERROR\n**** CANNOT FIND BASENAME FOR $FAILEDSCRIPT - Please contact administrator ****" + return 1 + fi + FIXFOUND=N + find . -type f -path "*/$ADEMPIERE_DB_PATH/$BASE.[0-9][0-9][0-9].fix" > /tmp/lsfix$$ + CNTFIXES=$(wc -l < /tmp/lsfix$$) + IDX=0 + while read -r FIX + do + IDX=$((IDX + 1)) + BASEFIX="$(basename "$FIX")" + BASE=$(expr "$FIX" : '.*/\(.*\)\.fix') + CNT=$(echo "set heading off +set feedback off +set pagesize 0 +set term off +set echo off +select count(*) from ad_migrationscript where name='$BASEFIX';" | $SILENTCMD | sed -e 's:^ ::' | grep -v '^$' | sed -e 's/[ \t]//g') + if [ "$CNT" != "0" ] + then + echo "$BASEFIX already applied, search for next fix" + continue + fi + OUTFILE=$TMPFOLDER/SyncDB_out_$$/$BASE.out + if ! apply_script "$FIX" "$OUTFILE" "$BASEFIX" + then + if [ "$IDX" -lt "$CNTFIXES" ] + then + # there are more fixes to process + continue + else + MSGERROR="$MSGERROR\n**** ERROR ON FILE $OUTFILE - Please verify ****" + # Stop processing, problem must be fixed + return 2 + fi + else + FIXFOUND=Y + return 0 + fi + done < /tmp/lsfix$$ + if [ $FIXFOUND = N ] + then + MSGERROR="$MSGERROR\n**** NO FIXES FOUND FOR $FAILEDSCRIPT ****" + return 1 + fi + MSGERROR="$MSGERROR\n**** WRONG CONDITION FOR $FAILEDSCRIPT - Please verify ****" + return 1 +} + +notify_error() +{ + echo -e "$MSGERROR" + printf '\n%s\n' "Errors were found during the process (see message above) - please inform and integrate a fix to restart this process again" + SUPPORTEMAIL=$(echo "set heading off +set feedback off +set pagesize 0 +set term off +set echo off +select supportemail from ad_system;" | $SILENTCMD | sed -e 's:^ ::' | grep -v '^$' | sed -e 's/[ \t]//g') + SENDMAIL=$(command -v sendmail) + FROM="$(whoami)@$(hostname)" + ATTACH=$(expr "$MSGERROR" : ".* ERROR ON FILE \(.*\) - Please verify.*") + if [ -n "$SUPPORTEMAIL" ] && [ -n "$SENDMAIL" ] && [ -n "$ATTACH" ] + then + ( + echo "From: $FROM" + echo "To: $SUPPORTEMAIL" + echo "Subject: RUN_MonitoredSyncDB.sh - $(hostname) - fix script required $(date +'%Y-%m-%d %H:%M:%S')" + echo "Mime-Version: 1.0" + echo "Content-Type: multipart/mixed; boundary=\"ZZ_/afg6432dfgkl.94531q\"" + echo "--ZZ_/afg6432dfgkl.94531q" + echo "Content-Type: text/plain; charset=\"UTF-8\"" + echo "Content-Transfer-Encoding: 7bit" + echo "Content-Disposition: inline" + echo -e "$MSGERROR" + echo "=================================" + cat "$ATTACH" + echo + echo "--ZZ_/afg6432dfgkl.94531q" + ) > /tmp/mail$$ 2>&1 + $SENDMAIL -t -oi < /tmp/mail$$ & + fi + exit 1 +} + +APPLIED=N +# Create list of files with error - registered in ad_migrationscript table +echo "set heading off +set feedback off +set pagesize 0 +set term off +set echo off +select name from ad_migrationscript where status='ER' order by name;" | $SILENTCMD | sed -e 's:^ ::' | grep -v '^$' | sort > $TMPFOLDER/lisERR_$$.txt +while read -r FILE +do + echo "Error registered in script $FILE, checking for fixes" + if process_fix "$FILE" + then + # fix worked continue with next file + continue + else + # no fix or fix failed - inform and stop + notify_error + fi +done < $TMPFOLDER/lisERR_$$.txt + +# Create list of files already applied - registered in AD_MigrationScript table +echo "set heading off +set feedback off +set pagesize 0 +set term off +set echo off +select name from ad_migrationscript;" | $SILENTCMD | sed -e 's:^ ::' | grep -v '^$' | sort > $TMPFOLDER/lisDB_$$.txt + +# Create list of files in the migration folder +: > $TMPFOLDER/lisFS_$$.txt +find . -type d -name "$ADEMPIERE_DB_PATH" | grep -v "./processes_post_migration/$ADEMPIERE_DB_PATH" | while read -r FOLDER +do + cd "${FOLDER}" || exit 1 + ls -- *.sql 2>/dev/null >> $TMPFOLDER/lisFS_$$.txt + cd "$DIR_SCRIPTS" || exit 1 +done +sort -o $TMPFOLDER/lisFS_$$.txt $TMPFOLDER/lisFS_$$.txt +sort -o $TMPFOLDER/lisDB_$$.txt $TMPFOLDER/lisDB_$$.txt +MSGERROR="" +# extract and process the list of pending files +comm -13 $TMPFOLDER/lisDB_$$.txt $TMPFOLDER/lisFS_$$.txt > $TMPFOLDER/lisPENDING_$$.txt +if [ -s $TMPFOLDER/lisPENDING_$$.txt ] +then + while read -r FILE + do + SCRIPT=$(find . -name "$FILE" | grep "/$ADEMPIERE_DB_PATH/") + OUTFILE=$TMPFOLDER/SyncDB_out_$$/$(basename "$FILE" .sql).out + if ! apply_script "$SCRIPT" "$OUTFILE" "$FILE" + then + TMPMSGERROR="\n**** ERROR ON FILE $OUTFILE - Please verify ****" + process_fix "$FILE" + FIXSTATUS=$? + if [ "$FIXSTATUS" -eq 0 ] + then + # fix worked continue with next file + continue + elif [ "$FIXSTATUS" -eq 1 ] + then + MSGERROR="$MSGERROR$TMPMSGERROR" + fi + # Stop processing, problem must be fixed + break + fi + done < $TMPFOLDER/lisPENDING_$$.txt +else + if [ -s $TMPFOLDER/lisFS_$$.txt ] + then + echo "Database is already in sync - no scripts pending to apply" + else + echo "No scripts were found to apply" + fi +fi + +if [ -z "$MSGERROR" ] +then + # Last verification - are there still ERRORS? + echo "set heading off +set feedback off +set pagesize 0 +set term off +set echo off +select name from ad_migrationscript where status='ER' order by name;" | $SILENTCMD | sed -e 's:^ ::' | grep -v '^$' | sort > $TMPFOLDER/lisERR_$$.txt + while read -r FILE + do + MSGERROR="$MSGERROR\n**** Error on file $FILE still not resolved - Please verify ****" + done < $TMPFOLDER/lisERR_$$.txt +fi + +if [ x$APPLIED = xY ] && [ -z "$MSGERROR" ] +then + cd "$DIR_POST" || exit 1 + for FILE in processes_post_migration/"$ADEMPIERE_DB_PATH"/*.sql + do + OUTFILE=$TMPFOLDER/SyncDB_out_$$/$(basename "$FILE" .sql).out + echo "Applying $FILE" + $CMD > "$OUTFILE" 2>&1 < "$FILE" + if grep -E "$ERROR_STRINGS" "$OUTFILE" > /dev/null 2>&1 + then + echo "Found error in $SCRIPT" + MSGERROR="$MSGERROR\n**** ERROR ON FILE $OUTFILE - Please verify ****" + fi + done +fi +if [ -n "$MSGERROR" ] +then + notify_error +fi +exit 0 diff --git a/org.adempiere.server-feature/utils.unix/postgresql/MonitoredSyncDB.sh b/org.adempiere.server-feature/utils.unix/postgresql/MonitoredSyncDB.sh new file mode 100755 index 0000000000..33d3b9566a --- /dev/null +++ b/org.adempiere.server-feature/utils.unix/postgresql/MonitoredSyncDB.sh @@ -0,0 +1,290 @@ +#!/bin/sh +# +# Author: Carlos Ruiz - globalqss +# Script to synchronize the database with latest migration scripts allowing a remote monitored way +# +# Intended process: +# 1. Customer executes bash RUN_MonitoredSyncDB.sh (folder can be specified as an optional parameter) +# 2. The program executes all pending scripts UNTIL an error is found +# When an error is found it register the output of the script in AD_Migration_Script.Script column +# The program stop the process informing the error +# 3. Vendor send a fix to the customer to integrate in the same folder +# Conditions: +# The script must have the same name as the script changing the suffix .sql by .001.fix - then .002.fix and so on +# for example if 201811121420_IDEMPIERE-2648.sql fails, then Vendor must provide a file +# 201811121420_IDEMPIERE-2648.001.fix and send it to customer to integrate in the same folder as the sql failed +# if the 001.fix fails then it can provide a 002.fix and keep going until the error is solved +# It is expected that the script 001.fix always end registering calling register_migration_script +# and also cleaning the Error status from the script that is fixing via update, for example: +# script 201811121420_IDEMPIERE-2648.001.fix is expected to end with these two lines: +# UPDATE AD_MigrationScript SET Status='IP' WHERE Name='201811121420_IDEMPIERE-2648.sql'); +# SELECT register_migration_script('201811121420_IDEMPIERE-2648.001.fix') FROM dual; +# and similar the script 201811121420_IDEMPIERE-2648.002.fix is expected to end with these two lines: +# UPDATE AD_MigrationScript SET Status='IP' WHERE Name='201811121420_IDEMPIERE-2648.001.fix'); +# SELECT register_migration_script('201811121420_IDEMPIERE-2648.002.fix') FROM dual; +# and so on +# 4. If there is an email registered in AD_System.SupportEMail and there is an accessible sendmail program then +# this script tries to send an email to that support informing the error +# 5. All the above steps are intended to be executed initially in a test or stage environment +# When executed again on a clean environment, or applied in production, the script automatically applies the fixes and continue +# + +echo Synchronize iDempiere Database + +echo Upgrading database "$1@$ADEMPIERE_DB_NAME" + +if [ $# -eq 0 ] + then + echo "Usage: $0 " + echo "Example: $0 adempiere adempiere" + exit 1 +fi +if [ "$IDEMPIERE_HOME" = "" ] || [ "$ADEMPIERE_DB_NAME" = "" ] || [ "$ADEMPIERE_DB_SERVER" = "" ] || [ "$ADEMPIERE_DB_PORT" = "" ] + then + echo "Please make sure that the environment variables are set correctly:" + echo " IDEMPIERE_HOME e.g. /idempiere" + echo " ADEMPIERE_DB_NAME e.g. adempiere or xe" + echo " ADEMPIERE_DB_SERVER e.g. dbserver.adempiere.org" + echo " ADEMPIERE_DB_PORT e.g. 5432 or 1521" + exit 1 +fi + +PGPASSWORD=$2 +export PGPASSWORD + +TMPFOLDER=/tmp +ADEMPIERE_DB_USER=$1 +ADEMPIERE_DB_PATH=$3 +CMDLANG="SET lc_messages TO 'C';" +CMD="psql -b -h $ADEMPIERE_DB_SERVER -p $ADEMPIERE_DB_PORT -d $ADEMPIERE_DB_NAME -U $ADEMPIERE_DB_USER" +SILENTCMD="$CMD -q -t" +ERROR_STRINGS="^(ERROR:|FATAL:)" +DIR_POST=$IDEMPIERE_HOME/migration +if [ "x$4" = "x" ] +then + DIR_SCRIPTS=$IDEMPIERE_HOME/migration +else + if [ "${4#/}" = "${4}" ] + then + DIR_SCRIPTS="$IDEMPIERE_HOME/$4" + else + DIR_SCRIPTS="$4" + fi +fi + +cd "$DIR_SCRIPTS" || exit 1 + +mkdir $TMPFOLDER/SyncDB_out_$$ + +apply_script() +{ + SCRIPT="$1" + OUTFILE="$2" + FILE="$3" + echo "Applying $SCRIPT" + ( printf '%s' "$CMDLANG" ; cat "$SCRIPT" ) | $CMD > "$OUTFILE" 2>&1 + APPLIED=Y + if grep -E "$ERROR_STRINGS" "$OUTFILE" > /dev/null 2>&1 + then + echo "Found error in $SCRIPT" + # record error in ad_migrationscript + echo " +update ad_migrationscript set status='ER' where name='$FILE'; +\lo_import '$OUTFILE' '$OUTFILE' +\set oid_output :LASTOID +\lo_list +update ad_migrationscript set script=lo_get(:oid_output) where name='$FILE'; +\lo_unlink :oid_output +" | $CMD >> "$OUTFILE" 2>&1 + return 1 + else + return 0 + fi +} + +process_fix() +{ + FAILEDSCRIPT=$1 + SUFFIX="${FAILEDSCRIPT##*.}" + if [ "sql" = "$SUFFIX" ] + then + TMPBASE="${FAILEDSCRIPT##*/}" + BASE="${TMPBASE%.sql}" + elif [ "fix" = "$SUFFIX" ] + then + TMPBASE="${FAILEDSCRIPT##*/}" + BASE="${TMPBASE%.[0-9][0-9][0-9].fix}" + fi + if [ -z "$BASE" ] + then + MSGERROR="$MSGERROR\n**** CANNOT FIND BASENAME FOR $FAILEDSCRIPT - Please contact administrator ****" + return 1 + fi + FIXFOUND=N + find . -type f -path "*/$ADEMPIERE_DB_PATH/$BASE.[0-9][0-9][0-9].fix" > /tmp/lsfix$$ + CNTFIXES=$(wc -l < /tmp/lsfix$$) + IDX=0 + while read -r FIX + do + IDX=$((IDX + 1)) + BASEFIX="$(basename "$FIX")" + BASE=$(expr "$FIX" : '.*/\(.*\)\.fix') + CNT=$($SILENTCMD -c "select count(*) from ad_migrationscript where name='$BASEFIX'" | sed -e 's/ //g') + if [ "$CNT" != "0" ] + then + echo "$BASEFIX already applied, search for next fix" + continue + fi + OUTFILE=$TMPFOLDER/SyncDB_out_$$/$BASE.out + if ! apply_script "$FIX" "$OUTFILE" "$BASEFIX" + then + if [ "$IDX" -lt "$CNTFIXES" ] + then + # there are more fixes to process + continue + else + MSGERROR="$MSGERROR\n**** ERROR ON FILE $OUTFILE - Please verify ****" + # Stop processing, problem must be fixed + return 2 + fi + else + FIXFOUND=Y + return 0 + fi + done < /tmp/lsfix$$ + if [ $FIXFOUND = N ] + then + MSGERROR="$MSGERROR\n**** NO FIXES FOUND FOR $FAILEDSCRIPT ****" + return 1 + fi + MSGERROR="$MSGERROR\n**** WRONG CONDITION FOR $FAILEDSCRIPT - Please verify ****" + return 1 +} + +notify_error() +{ + echo -e "$MSGERROR" + printf '\n%s\n' "Errors were found during the process (see message above) - please inform and integrate a fix to restart this process again" + SUPPORTEMAIL=$($SILENTCMD -c "select supportemail from ad_system" | sed -e 's/ //g') + SENDMAIL=$(command -v sendmail) + FROM="$(whoami)@$(hostname)" + ATTACH=$(expr "$MSGERROR" : ".* ERROR ON FILE \(.*\) - Please verify.*") + if [ -n "$SUPPORTEMAIL" ] && [ -n "$SENDMAIL" ] && [ -n "$ATTACH" ] + then + ( + echo "From: $FROM" + echo "To: $SUPPORTEMAIL" + echo "Subject: RUN_MonitoredSyncDB.sh - $(hostname) - fix script required $(date +'%Y-%m-%d %H:%M:%S')" + echo "Mime-Version: 1.0" + echo "Content-Type: multipart/mixed; boundary=\"ZZ_/afg6432dfgkl.94531q\"" + echo "--ZZ_/afg6432dfgkl.94531q" + echo "Content-Type: text/plain; charset=\"UTF-8\"" + echo "Content-Transfer-Encoding: 7bit" + echo "Content-Disposition: inline" + echo -e "$MSGERROR" + echo "=================================" + cat "$ATTACH" + echo + echo "--ZZ_/afg6432dfgkl.94531q" + ) > /tmp/mail$$ 2>&1 + $SENDMAIL -t -oi < /tmp/mail$$ & + fi + exit 1 +} + +APPLIED=N +# Create list of files with error - registered in ad_migrationscript table +echo "select name from ad_migrationscript where status='ER' order by name" | $SILENTCMD | sed -e 's:^ ::' | grep -v '^$' | sort > $TMPFOLDER/lisERR_$$.txt +while read -r FILE +do + echo "Error registered in script $FILE, checking for fixes" + if process_fix "$FILE" + then + # fix worked continue with next file + continue + else + # no fix or fix failed - inform and stop + notify_error + fi +done < $TMPFOLDER/lisERR_$$.txt + +# Create list of files already applied - registered in ad_migrationscript table +echo "select name from ad_migrationscript" | $SILENTCMD | sed -e 's:^ ::' | grep -v '^$' | sort > $TMPFOLDER/lisDB_$$.txt + +# Create list of files in the migration folder +: > $TMPFOLDER/lisFS_$$.txt +find . -type d -name "$ADEMPIERE_DB_PATH" | grep -v "./processes_post_migration/$ADEMPIERE_DB_PATH" | while read -r FOLDER +do + cd "${FOLDER}" || exit 1 + ls -- *.sql 2>/dev/null >> $TMPFOLDER/lisFS_$$.txt + cd "$DIR_SCRIPTS" || exit 1 +done +sort -o $TMPFOLDER/lisFS_$$.txt $TMPFOLDER/lisFS_$$.txt +sort -o $TMPFOLDER/lisDB_$$.txt $TMPFOLDER/lisDB_$$.txt +MSGERROR="" +# extract and process the list of pending files +comm -13 $TMPFOLDER/lisDB_$$.txt $TMPFOLDER/lisFS_$$.txt > $TMPFOLDER/lisPENDING_$$.txt +if [ -s $TMPFOLDER/lisPENDING_$$.txt ] +then + while read -r FILE + do + SCRIPT=$(find . -name "$FILE" | grep "/$ADEMPIERE_DB_PATH/") + OUTFILE=$TMPFOLDER/SyncDB_out_$$/$(basename "$FILE" .sql).out + if ! apply_script "$SCRIPT" "$OUTFILE" "$FILE" + then + TMPMSGERROR="\n**** ERROR ON FILE $OUTFILE - Please verify ****" + process_fix "$FILE" + FIXSTATUS=$? + if [ "$FIXSTATUS" -eq 0 ] + then + # fix worked continue with next file + continue + elif [ "$FIXSTATUS" -eq 1 ] + then + MSGERROR="$MSGERROR$TMPMSGERROR" + fi + # Stop processing, problem must be fixed + break + fi + done < $TMPFOLDER/lisPENDING_$$.txt +else + if [ -s $TMPFOLDER/lisFS_$$.txt ] + then + echo "Database is already in sync - no scripts pending to apply" + else + echo "No scripts were found to apply" + fi +fi + +if [ -z "$MSGERROR" ] +then + # Last verification - are there still ERRORS? + echo "select name from ad_migrationscript where status='ER' order by name" | $SILENTCMD | sed -e 's:^ ::' | grep -v '^$' | sort > $TMPFOLDER/lisERR_$$.txt + while read -r FILE + do + MSGERROR="$MSGERROR\n**** Error on file $FILE still not resolved - Please verify ****" + done < $TMPFOLDER/lisERR_$$.txt +fi + +if [ x$APPLIED = xY ] && [ -z "$MSGERROR" ] +then + cd "$DIR_POST" || exit 1 + for FILE in processes_post_migration/"$ADEMPIERE_DB_PATH"/*.sql + do + OUTFILE=$TMPFOLDER/SyncDB_out_$$/$(basename "$FILE" .sql).out + echo "Applying $FILE" + ( printf '%s' "$CMDLANG" ; cat "$FILE" ) | $CMD > "$OUTFILE" 2>&1 + if grep -E "$ERROR_STRINGS" "$OUTFILE" > /dev/null 2>&1 + then + echo "Found error in $SCRIPT" + MSGERROR="$MSGERROR\n**** ERROR ON FILE $OUTFILE - Please verify ****" + fi + done +fi +PGPASSWORD= +export PGPASSWORD +if [ -n "$MSGERROR" ] +then + notify_error +fi +exit 0 diff --git a/org.adempiere.server-feature/utils.windows/RUN_MonitoredSyncDB.bat b/org.adempiere.server-feature/utils.windows/RUN_MonitoredSyncDB.bat new file mode 100644 index 0000000000..6c4d7680eb --- /dev/null +++ b/org.adempiere.server-feature/utils.windows/RUN_MonitoredSyncDB.bat @@ -0,0 +1,4 @@ +@if (%IDEMPIERE_HOME%) == () (CALL myEnvironment.bat Server) else (CALL %IDEMPIERE_HOME%\utils\myEnvironment.bat Server) +@Title Synchronize iDempiere Database - %IDEMPIERE_HOME% (%ADEMPIERE_DB_NAME%) + +@call %ADEMPIERE_DB_PATH%\SyncDB %ADEMPIERE_DB_USER% %ADEMPIERE_DB_PASSWORD% %ADEMPIERE_DB_PATH% diff --git a/org.adempiere.server-feature/utils.windows/oracle/MonitoredSyncDB.bat b/org.adempiere.server-feature/utils.windows/oracle/MonitoredSyncDB.bat new file mode 100644 index 0000000000..5754205cc1 --- /dev/null +++ b/org.adempiere.server-feature/utils.windows/oracle/MonitoredSyncDB.bat @@ -0,0 +1,28 @@ +@Echo Synchronize iDempiere Database + +@Rem +@Echo Upgrading database %1@%ADEMPIERE_DB_NAME% + +@if (%IDEMPIERE_HOME%) == () goto environment +@if (%ADEMPIERE_DB_NAME%) == () goto environment +@if (%ADEMPIERE_DB_SERVER%) == () goto environment +@if (%ADEMPIERE_DB_PORT%) == () goto environment +@Rem Must have parameter: userAccount +@if (%1) == () goto usage + +@Echo WARNING: THIS PROGRAM IS NOT DEVELOPED FOR WINDOWS YET - YOU NEED TO APPLY MANUALLY THE PENDING MIGRATION SCRIPTS + +@Rem TODO: port oracle/SyncDB.sh to windows syntax + +@goto end + +:environment +@Echo Please make sure that the enviroment variables are set correctly: +@Echo IDEMPIERE_HOME e.g. D:\Adempiere +@Echo ADEMPIERE_DB_NAME e.g. adempiere.adempiere.org + +:usage +@echo Usage: %0 +@echo Examples: %0 adempiere adempiere + +:end diff --git a/org.adempiere.server-feature/utils.windows/postgresql/MonitoredSyncDB.bat b/org.adempiere.server-feature/utils.windows/postgresql/MonitoredSyncDB.bat new file mode 100644 index 0000000000..71569cf88c --- /dev/null +++ b/org.adempiere.server-feature/utils.windows/postgresql/MonitoredSyncDB.bat @@ -0,0 +1,29 @@ +@Echo Synchronize iDempiere Database + +@Echo Upgrading database %1@%ADEMPIERE_DB_NAME% + +@if (%IDEMPIERE_HOME%) == () goto environment +@if (%ADEMPIERE_DB_NAME%) == () goto environment +@if (%ADEMPIERE_DB_SERVER%) == () goto environment +@if (%ADEMPIERE_DB_PORT%) == () goto environment +@Rem Must have parameter: userAccount +@if (%1) == () goto usage + +@Echo WARNING: THIS PROGRAM IS NOT DEVELOPED FOR WINDOWS YET - YOU NEED TO APPLY MANUALLY THE PENDING MIGRATION SCRIPTS + +@Rem TODO: port postgresql/SyncDB.sh to windows syntax + +@goto end + +:environment +@Echo Please make sure that the enviroment variables are set correctly: +@Echo IDEMPIERE_HOME e.g. D:\ADEMPIERE2 +@Echo ADEMPIERE_DB_NAME e.g. adempiere or xe +@Echo ADEMPIERE_DB_SERVER e.g. dbserver.adempiere.org +@Echo ADEMPIERE_DB_PORT e.g. 5432 or 1521 + +:usage +@echo Usage: %0 +@echo Examples: %0 ADEMPIERE/ADEMPIERE + +:end