#!/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 # ######################################################################## printmsg() { echo -e "$*" } abort_message() { local ABORTCODE=1 [[ ${EXITCODE} -ne 0 ]] && ABORTCODE=${EXITCODE} printmsg "${LIGHTRED}ERROR${RESET}: $*" exit ${ABORTCODE} } # debug_me uses variable ${DEBUG} debug_me() { if [[ "${DEBUG}" && ${DEBUG} -eq 0 ]] ; then printmsg "${LIGHTBLUE}[DEBUG]${RESET}: $*" fi } warning_message() { printmsg "${LIGHTYELLOW}[WARNING]${RESET}: $*" } ok_message() { printmsg "${LIGHTGREEN}[OK]${RESET}: $*" } 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 } nice_countdown() { local WAIT_TIME=$1 local DEFAULT_WAIT_TIME=10 if [[ ! ${WAIT_TIME} ]] ; then WAIT_TIME=${DEFAULT_WAIT_TIME} fi local WARNING=$((WAIT_TIME*2/3)) local CRITICAL=$((WAIT_TIME/3)) for ((x=WAIT_TIME; x>0; x--)) ; do if [[ ${x} -gt ${WARNING} ]] ; then MSG_COLOR=${LIGHTGREEN} elif [[ ${x} -gt ${CRITICAL} ]] ; then MSG_COLOR=${LIGHTYELLOW} else MSG_COLOR=${LIGHTRED} fi printf "\r${MSG_COLOR}%s${RESET} .." "${x}" #sleep 1 read -r -t1 done echo } get_dbname() { DATABASES="$(echo "select datname from pg_database where datname not in ('postgres', 'template0', 'template1', 'rdsadmin');" | ${PSQL} -q | grep -Ev "^($|\(.*\)$|-{1,}$)|datname"| awk '{print $1}')" #echo "select datname from pg_database where datname not in ('postgres', 'template0', 'template1');" | ${PSQL} -q | grep -Ev "^($|\(.*\)$|-{1,}$)|datname"| awk '{print $1}' debug_me "DATABASES=${DATABASES}" } generate_full_metadata() { #debug_me "${PGDUMP} -s ${DBNAME} > ${FULLMETADATA}" ${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// /_}" #debug_me "OUTPUTDIR=${OUTPUTDIR}" # PATCH for very long file names OUTPUTFILE="${OBJECT::240}" OUTPUTFILE="${OUTPUTFILE// /_}" if [[ -f ${OUTPUTDIR}/${OUTPUTFILE}.sql ]] ; then for ((x=1; x<20 ;x++)) ; do if [[ ! -f ${OUTPUTDIR}/${OUTPUTFILE}_${x}.sql ]] ; then OUTPUTFILE="${OUTPUTFILE}_${x}" fi done fi OUTPUTFILE="${OUTPUTFILE}.sql" #debug_me "OUTPUTFILE=${OUTPUTFILE}" 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() { if [[ ${DUMP_ROLE_PASSWORDS} -eq 0 ]] ; then ${PGDUMPALL} --roles-only > ${BACKUPDIR}/dump_roles.sql else ${PGDUMPALL} --roles-only --no-role-passwords > ${BACKUPDIR}/dump_roles.sql fi } init_staff() { [[ ! -d ${BACKUPDIR} ]] && mkdir -p ${BACKUPDIR} cd ${BACKUPDIR} } upload_to_git() { #[[ ${DEBUG} -eq 0 ]] && set -x local RES RES=0 debug_me "upload_to_git()" cd ${BACKUPDIR} # 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=$? 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" debug_me "init_staff" init_staff debug_me "get_dbname" get_dbname debug_me "main loop over dbs" # multi-database support (auto mode) for DBNAME in ${DATABASES} ; do FULLMETADATA="${BACKUPDIR}/FULL_${DBNAME}_METADATA.sql" debug_me "Database=${YELLOW}${DBNAME}${RESET}" generate_full_metadata if [[ ${SPLIPT_METADATA} -eq 0 ]] ; then generate_split_metadata fi #nice_countdown 6 done #debug_me "dump_all_roles" #dump_all_roles if [[ ${ISGITREPO} -eq 0 ]] ; then debug_me "upload_to_git" upload_to_git fi exit ${EXITCODE} ######################################################################## # # / MAIN # ########################################################################