diff --git a/src/lib/handlers/sources/pg_dump.sh b/src/lib/handlers/sources/pg_dump.sh new file mode 100644 index 0000000..22d6278 --- /dev/null +++ b/src/lib/handlers/sources/pg_dump.sh @@ -0,0 +1,80 @@ +#!/usr/bin/env bash + +# pg_dump.sh - create SQL dump of PostgreSQL database. +# Copyright (c) 2022 ge +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + +src_pg_dump() { + # Create SQL-dump at location __main_target_path via pg_dump(1) + # Compression is optional. + # Handle 'postgres' URI scheme. + # + # Usage: src_pg_dump URI + + log "Run handler ${FUNCNAME[0]}()" + + local uri + local dst_path + + # shellcheck disable=SC2154 + dst_path="$__main_target_path" + uri="$1" + + parse_uri "$uri" + + # shellcheck disable=SC2154 + if [[ ! "$scheme" =~ ^postgres$ ]]; then + log -p "Error: Wrong URI scheme: $scheme" >&2; exit 1 + fi + + [ -z "$port" ] && port=5432 # Set default PostgreSQL port. + + # shellcheck disable=SC2154 + log "Dumping database '${path##*/}' owned by ${username}@${hostname} ..." + + sqldump="${dst_path}/$(gen_backup_name ".psql")" # Set dump name + pg_dump_options="${pg_dump_options:-}" + + # See https://www.postgresql.org/docs/current/libpq-envars.html + # shellcheck disable=SC2154 + export PGPASSWORD="$password" + + # Set command to execute + # NOTE! `pg_dump_options` variable must be unquoted! + # shellcheck disable=SC2086,SC2154 + set -- pg_dump $pg_dump_options \ + --host="$hostname" \ + --port="$port" \ + --dbname="${path##*/}" \ + --username="$username" \ + --no-password + + log "Run command: $*" + + # shellcheck disable=SC2154 + if "$@" 2>> "$__log_file" > "$sqldump"; then + # Compress dump + sqldump="$(compress_file "$sqldump")" + # Append path to 'backups' array + backups+=("$sqldump") + log "Dump file: $sqldump" + else + remove_if_empty "$sqldump" + handle_error \ + "Error: Something went wrong when executing command:\n\t$*" + fi + + unset PGPASSWORD +} diff --git a/src/lib/lib.sh b/src/lib/lib.sh index f2291e1..e8e3ed2 100644 --- a/src/lib/lib.sh +++ b/src/lib/lib.sh @@ -25,4 +25,9 @@ LIBRARY="${LIBRARY:-./lib}" . "$LIBRARY/uri.sh" . "$LIBRARY/handlers/sources/tar.sh" . "$LIBRARY/handlers/sources/mysqldump.sh" +. "$LIBRARY/handlers/sources/pg_dump.sh" . "$LIBRARY/handlers/targets/cp.sh" + +if [ -f "$LIBRARY/extra.sh" ]; then + . "$LIBRARY/extra.sh" +fi