#!/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// /_}" OUTPUTFILE="${OBJECT}.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} } 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 # ########################################################################