2022-02-25 09:26:58 +00:00
#!/bin/bash
# Exit codes:
# 1 :
# 2 :
# 3 :
# 4 :
########################################################################
# INIT
########################################################################
DEBUGME = " ${ 1 : 2 } "
if [ [ " ${ DEBUGME ,, } " = "debug" ] ] ; then
DEBUG = 0
else
DEBUG = 1
fi
CONFIGFILE = " $( dirname $( readlink -f $0 ) ) / $( basename $( readlink -f $0 ) .sh) .config "
########################################################################
#/INIT
########################################################################
########################################################################
#
# CONSTANTS
#
########################################################################
# colors
BOLD = "\e[1m"
GREEN = "\e[32m"
LIGHTGREEN = " ${ BOLD } ${ GREEN } "
RED = "\033[1;31m"
LIGHTRED = "\033[1;31m"
BLUE = "\e[34m"
LIGHTBLUE = " ${ BOLD } ${ BLUE } "
YELLOW = "\e[33m"
LIGHTYELLOW = " ${ BOLD } ${ YELLOW } "
WHITE = "\033[0;37m"
RESET = "\033[0;00m"
########################################################################
#
# / CONSTANTS
#
########################################################################
########################################################################
#
# VARIABLES
#
########################################################################
########################################################################
#
# / VARIABLES
#
########################################################################
########################################################################
#
# FUNCTIONS
#
########################################################################
debug_me( )
{
if [ [ ${ DEBUG } -eq 0 ] ] ; then
[ [ " $* " ] ] && echo -e " $* "
echo -e " ${ BLUE } DEBUGMODE ${ RESET } Press enter to continue "
read -t ${ WAITSEC }
fi
}
usage( )
{
printf " %s ${ LIGHTRED } USAGE: ${ RESET }
$0 VAR1 VAR2
Where VAR1 allowed: ${ LIGHTGREEN } BLA${ RESET }
And VAR2 allowed: ${ LIGHTGREEN } $BLA ${ RESET } \n "
# VERY INITIAL CHECKS
}
get_dbname( )
{
DATABASES = " $( echo "select datname from pg_database where datname not in ('postgres', 'template0', 'template1');" | ${ PSQL } -q | egrep -v " ^( $|\(.*\) $|\-{1,} $)|datname " | awk '{print $1}' ) "
}
generate_full_metadata( )
{
${ PGDUMP } -s ${ DBNAME } > ${ FULLMETADATA }
}
generate_split_metadata( )
{
local OBJECT = ""
local SCHEMA = ""
local TYPE = ""
local OUTPUTDIR = ""
local OUTPUTFILE = ""
# reading from &3 to allow debug mode to stop the loop
while IFS = '' read LINE <& 3 ; do
if [ [ " ${ LINE } " = ~ ^--\ Name:\ ( .*) \; \ Type:\ ( .*) \; \ Schema:\ ( .*) \; \ Owner:\ ( .*) ] ] ; then
OBJECT = " ${ BASH_REMATCH [1] } "
SCHEMA = " ${ BASH_REMATCH [3] } "
TYPE = " ${ BASH_REMATCH [2] } "
#debug_me "${LINE}"
if [ [ " ${ OBJECT } " && " ${ SCHEMA } " ] ] ; then
if [ [ " ${ SCHEMA } " = "-" ] ] ; then
SCHEMA = "postgres"
fi
OUTPUTDIR = " ${ BACKUPDIR } / ${ DBNAME } / ${ SCHEMA // /_ } / ${ TYPE // /_ } "
2022-07-22 16:56:02 +00:00
# PATCH for very long file names
OUTPUTFILE = " ${ OBJECT : : 240 } "
OUTPUTFILE = " ${ OUTPUTFILE // /_ } "
if [ [ -f ${ OUTPUTDIR } /${ OUTPUTFILE } .sql ] ] ; then
for ( ( x = 1; x<1000 ; x++) ) ; do
if [ [ ! -f ${ OUTPUTDIR } /${ OUTPUTFILE } _${ x } .sql ] ] ; then
OUTPUTFILE = " ${ OUTPUTFILE } _ ${ x } "
fi
done
fi
OUTPUTFILE = " ${ OUTPUTFILE } .sql "
2022-02-25 09:26:58 +00:00
mkdir -p " ${ OUTPUTDIR } "
echo -e " ${ OUTPUTDIR } / ${ OUTPUTFILE } "
echo -e " ${ LINE } " > " ${ OUTPUTDIR } / ${ OUTPUTFILE } "
fi
fi
if [ [ -f " ${ OUTPUTDIR } / ${ OUTPUTFILE } " ] ] ; then
if [ [ ! " ${ LINE } " = ~ ^--.*$ ] ] ; then
# echo "Skipping line comment"
# else
echo -e " ${ LINE } " >> " ${ OUTPUTDIR } / ${ OUTPUTFILE } "
fi
fi
done 3< ${ FULLMETADATA }
}
init_staff( )
{
[ [ ! -d ${ BACKUPDIR } ] ] && mkdir -p ${ BACKUPDIR }
cd ${ BACKUPDIR }
}
upload_to_git( )
{
[ [ ${ DEBUG } -eq 0 ] ] && set -x
local let RES = 0
debug_me
cd ${ BACKUPDIR }
GITVERSION = $( git --version | awk '{print $3}' )
if [ [ ${ GITVERSION } = ~ ^1.*$ ] ] ; then
NOEDIT = ""
else
NOEDIT = "--no-edit"
fi
# git version patch
git pull ${ NOEDIT } -q -f
git add *
git commit -a -m " $( date) release "
RES = $?
# Updating repo
[ [ ${ RES } -eq 0 ] ] && git push && RES = $?
debug_me
return ${ RES }
}
########################################################################
#
# / FUNCTIONS
#
########################################################################
########################################################################
#
# MAIN
#
########################################################################
[ [ ! -f ${ CONFIGFILE } ] ] && echo -e " ${ LIGHTRED } CONFIGFILE ${ CONFIGFILE } NOT FOUND ${ RESET } " && exit 1
. ${ CONFIGFILE }
# DETECTING if the script is run by cron
if [ [ " $( tty) " = "not a tty" ] ] ; then
[ [ ${ DEBUG } -eq 0 ] ] && set -x
exec > ${ SCRIPTLOG }
exec 2> ${ SCRIPTLOGERR }
elif [ [ ${ DEBUG } -eq 0 ] ] ; then
echo -e " ${ BLUE } DEBUGMODE ${ RESET } is on "
echo -e " \t SCRIPTLOG will be ${ SCRIPTLOG } "
echo -e " \t SCRIPTLOGERR will be ${ SCRIPTLOGERR } "
set -x
exec > ${ SCRIPTLOG }
exec 2> ${ SCRIPTLOGERR }
fi
[ [ ${ DEBUG } -eq 0 ] ] && DEBUGME = "bash -x"
init_staff
debug_me
get_dbname
debug_me
# multi-database support (auto mode)
for DBNAME in ${ DATABASES } ; do
FULLMETADATA = " ${ BACKUPDIR } /FULL_ ${ DBNAME } _METADATA.sql "
generate_full_metadata
debug_me
generate_split_metadata
debug_me
done
if [ [ ${ ISGITREPO } -eq 0 ] ] ; then
upload_to_git
fi
exit ${ EXITCODE }
########################################################################
#
# / MAIN
#
########################################################################