get_all_pgmetadata/get_all_pgmetadata.sh
2022-07-26 16:59:28 +02:00

272 lines
6.3 KiB
Bash
Executable File

#!/bin/bash
# Exit codes:
# 1 :
# 2 :
# 3 :
# 4 :
########################################################################
# INIT
########################################################################
# moved to config
#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// /_}"
# 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"
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}
}
dump_all_roles()
{
debug_me
if [[ ${DUMP_ROLE_PASSWORDS} -eq 0 ]] ; then
${PGDUMPALL} --roles-only > ${OUTPUTDIR}/dump_roles.sql
else
${PGDUMPALL} --roles-only --no-role-passwords > ${OUTPUTDIR}/dump_roles.sql
fi
}
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"
debug_me "generate_full_metadata"
generate_full_metadata
if [[ ${SPLIPT_METADATA} -eq 0 ]] ; then
debug_me "generate_split_metadata"
generate_split_metadata
fi
debug_me "dump_all_roles"
dump_all_roles
done
if [[ ${ISGITREPO} -eq 0 ]] ; then
debug_me "upload_to_git"
upload_to_git
fi
exit ${EXITCODE}
########################################################################
#
# / MAIN
#
########################################################################