Compare commits
No commits in common. "73c24e93012b35a34348fc562ad92a479b70c3ee" and "800206d4d966aae73c31dd3af2a0d513f231194d" have entirely different histories.
73c24e9301
...
800206d4d9
1
.gitignore
vendored
Normal file
1
.gitignore
vendored
Normal file
@ -0,0 +1 @@
|
||||
*config
|
@ -1,3 +1,3 @@
|
||||
# get_all_pgmetadata
|
||||
|
||||
get_all_pgmetadata
|
||||
Get all metadata from a postgresql database
|
70
get_all_pgmetadata.config.tmpl
Normal file
70
get_all_pgmetadata.config.tmpl
Normal file
@ -0,0 +1,70 @@
|
||||
#!/bin/bash
|
||||
|
||||
####################################
|
||||
# cron vars
|
||||
####################################
|
||||
PGDATA=/var/lib/pgsql/12/data
|
||||
PGDUMP="$(which pg_dump)"
|
||||
PGDUMPALL="$(which pg_dumpall)"
|
||||
PGDUMP="${PGDUMP} -h 127.0.0.1"
|
||||
PGDUMPALL="${PGDUMPALL} -h 127.0.0.1"
|
||||
|
||||
PSQL="$(which psql) -h 127.0.0.1"
|
||||
|
||||
|
||||
TODAY="$(date +%Y%m%d)"
|
||||
NOW="$(date +%Y%m%d%H%M%S)"
|
||||
|
||||
####################################
|
||||
# output folders
|
||||
####################################
|
||||
|
||||
BACKUPDIR="/var/lib/postgres/scripts/get_all_pgmetadata/${HOSTNAME,,}"
|
||||
LOGDIR="${BACKUPDIR}/logs/"
|
||||
|
||||
# multi-db support, this is auto
|
||||
#FULLMETADATA="${BACKUPDIR}/FULL_${DBNAME}_METADATA.sql"
|
||||
# multi-db support, this is auto
|
||||
#DIFFILE="${BACKUPDIR}/FULL_${DBNAME}_METADATA.sql"
|
||||
|
||||
LOGFILE=${LOGDIR}/$(basename $0 .sh)_${NOW}.log
|
||||
SCRIPTLOG="${LOGFILE}"
|
||||
ERRFILE=${LOGDIR}/$(basename $0 .sh)_${NOW}.err
|
||||
SCRIPTLOGERR="${ERRFILE}"
|
||||
|
||||
####################################
|
||||
# output options
|
||||
####################################
|
||||
|
||||
# set to 0 to split full metadata into files (DEFAULT behavior)
|
||||
SPLIT_METADATA=0
|
||||
|
||||
# dump user passwords
|
||||
DUMP_ROLE_PASSWORDS=0
|
||||
|
||||
|
||||
|
||||
####################################
|
||||
# DEBUG
|
||||
####################################
|
||||
|
||||
# set to 0 to debug
|
||||
DEBUG=0
|
||||
DEBUG=1
|
||||
|
||||
|
||||
# For debugging
|
||||
WAITSEC=10
|
||||
|
||||
####################################
|
||||
# git usage
|
||||
####################################
|
||||
# for git usage you'll have to create a git repo on the git server
|
||||
# then import it into the ${BACKUPDIR} so authentication & config is done
|
||||
# then this script will make `git push` automatically if ISGITREPO=0
|
||||
|
||||
# set to 0 if git is in place
|
||||
ISGITREPO=0
|
||||
ISGITREPO=1
|
||||
|
||||
|
271
get_all_pgmetadata.sh
Executable file
271
get_all_pgmetadata.sh
Executable file
@ -0,0 +1,271 @@
|
||||
#!/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
|
||||
#
|
||||
########################################################################
|
||||
|
Loading…
Reference in New Issue
Block a user