Files
da-postgresql/scripts/restore_job.sh
T
2026-07-04 16:00:04 +02:00

579 lines
19 KiB
Bash

#!/bin/bash
set -Eeuo pipefail
ERROR_MSG=""
RESTORE_OK=0
DA_USER=""
DB_NAME=""
JOB_ID=""
LOG_FILE=""
RESTORE_MODE=""
SOURCE_DB_NAME=""
USE_OWNER_RESTORE=0
USE_SANITIZE=0
PRE_CLEAN=0
TARGET_DB_EMPTY=0
TMP_DB_USER=""
TMP_DB_PASS=""
TMP_DB_ACTIVE=0
ORIG_DB_OWNER=""
DB_OWNER_SWITCHED=0
JOB_FILE="${1:-}"
if [ -z "$JOB_FILE" ] || [ ! -f "$JOB_FILE" ]; then
echo "da-postgresql: missing job file" >&2
exit 1
fi
PLUGIN_DIR="$(cd "$(dirname "$0")/.." && pwd)"
CONFIG_FILE="${PLUGIN_DIR}/plugin-settings.conf"
LOG_DIR="${PLUGIN_DIR}/data/logs"
mkdir -p "$LOG_DIR"
urlencode() {
local s="$1"
local out=""
local i c
for ((i=0; i<${#s}; i++)); do
c="${s:i:1}"
case "$c" in
[a-zA-Z0-9.~_-]) out+="$c" ;;
' ') out+='%20' ;;
*) printf -v c '%%%02X' "'$c"; out+="$c" ;;
esac
done
printf '%s' "$out"
}
notify_user() {
local code="$1"
if [ -z "${DA_USER:-}" ]; then
return 0
fi
local subject message
if [ "$code" -eq 0 ] && [ "$RESTORE_OK" -eq 1 ]; then
subject="Przywracanie bazy PostgreSQL zakończone pomyślnie"
message="Przywracanie bazy ${DB_NAME} z pliku ${SOURCE_FILE:-nieznany} zakończone."
else
subject="Błąd przywracania bazy PostgreSQL"
if [ -n "$ERROR_MSG" ]; then
message="Przywracanie bazy ${DB_NAME} nie powiodło się: ${ERROR_MSG}"
else
message="Przywracanie bazy ${DB_NAME} nie powiodło się. Sprawdź log zadania."
fi
fi
local task_queue="/usr/local/directadmin/data/task.queue"
local users="select1%3D$(urlencode "$DA_USER")"
local line="action=notify&value=users&subject=$(urlencode "$subject")&message=$(urlencode "$message")&users=${users}"
printf "%s\n" "$line" >> "$task_queue"
}
fail() {
local msg="$1"
ERROR_MSG="$msg"
if [ -n "${LOG_FILE:-}" ]; then
echo "[$(date '+%Y-%m-%d %H:%M:%S')] ERROR: ${msg}" >> "$LOG_FILE"
fi
}
log_unexpected_error() {
local line_no="$1"
local command="$2"
local code="$3"
if [ -z "${LOG_FILE:-}" ]; then
return 0
fi
if [ -n "${ERROR_MSG:-}" ]; then
return 0
fi
ERROR_MSG="Nieoczekiwany błąd wykonywania przywracania (kod ${code}, linia ${line_no})."
echo "[$(date '+%Y-%m-%d %H:%M:%S')] ERROR: ${ERROR_MSG} CMD: ${command}" >> "$LOG_FILE"
}
load_plugin_settings() {
if [ ! -f "$CONFIG_FILE" ]; then
fail "Brak pliku konfiguracyjnego pluginu: $CONFIG_FILE"
exit 1
fi
# shellcheck disable=SC1090
source "$CONFIG_FILE"
}
load_pg_credentials() {
local creds_file="/usr/local/directadmin/conf/postgresql.conf"
PGHOST_VAL=""
PGPORT_VAL=""
PGUSER_VAL=""
PGPASSWORD_VAL=""
if [ ! -r "$creds_file" ]; then
fail "Brak pliku poświadczeń PostgreSQL: $creds_file"
exit 1
fi
local line
line="$(grep -Ev '^[[:space:]]*($|#)' "$creds_file" | head -n1 || true)"
if [ -z "$line" ]; then
fail "Pusty plik poświadczeń PostgreSQL: $creds_file"
exit 1
fi
if [[ "$line" == *=* ]]; then
while IFS='=' read -r key value; do
key="$(echo "$key" | tr -d '[:space:]' | tr '[:lower:]' '[:upper:]')"
value="$(echo "$value" | sed -E 's/[[:space:]]+#.*$//' | sed -E 's/^[[:space:]]+|[[:space:]]+$//g')"
case "$key" in
PG_HOST) PGHOST_VAL="$value" ;;
PG_PORT) PGPORT_VAL="$value" ;;
PG_USER) PGUSER_VAL="$value" ;;
PG_PASSWORD) PGPASSWORD_VAL="$value" ;;
esac
done < <(grep -Ev '^[[:space:]]*($|#)' "$creds_file")
else
local rest
PGHOST_VAL="${line%%:*}"
rest="${line#*:}"
PGPORT_VAL="${rest%%:*}"
rest="${rest#*:}"
rest="${rest#*:}"
PGUSER_VAL="${rest%%:*}"
PGPASSWORD_VAL="${rest#*:}"
fi
[ -n "$PGHOST_VAL" ] || PGHOST_VAL="localhost"
[ -n "$PGPORT_VAL" ] || PGPORT_VAL="5432"
[ -n "$PGUSER_VAL" ] || PGUSER_VAL="postgres"
if [ -z "$PGPASSWORD_VAL" ]; then
fail "Brak hasła PostgreSQL w /usr/local/directadmin/conf/postgresql.conf"
exit 1
fi
}
resolve_bins() {
PSQL_BIN="$(command -v psql 2>/dev/null || true)"
if [ -z "$PSQL_BIN" ]; then
fail "Brak binarium psql."
exit 1
fi
}
sql_escape_literal() {
printf '%s' "$1" | sed "s/'/''/g"
}
psql_admin() {
local database="$1"
shift
PGPASSWORD="$PGPASSWORD_VAL" "$PSQL_BIN" -h "$PGHOST_VAL" -p "$PGPORT_VAL" -U "$PGUSER_VAL" -d "$database" -v ON_ERROR_STOP=1 "$@"
}
role_exists() {
local role="$1"
if [ -z "$role" ]; then
return 1
fi
local esc
esc="$(sql_escape_literal "$role")"
local ok
ok="$(psql_admin postgres -At -c "SELECT 1 FROM pg_roles WHERE rolname='${esc}'" 2>/dev/null || true)"
[ -n "$ok" ]
}
resolve_db_owner() {
local owner
owner="$(psql_admin postgres -At -c "SELECT pg_get_userbyid(datdba) FROM pg_database WHERE datname='${DB_ESC}'" 2>/dev/null | head -n1 | tr -d '\r' || true)"
if role_exists "$owner"; then
printf '%s' "$owner"
return 0
fi
if role_exists "$DA_USER"; then
printf '%s' "$DA_USER"
return 0
fi
if role_exists "$PGUSER_VAL"; then
printf '%s' "$PGUSER_VAL"
return 0
fi
printf '%s' ""
return 0
}
database_is_empty() {
local db_name="$1"
local has_objects
has_objects="$(
psql_admin "$db_name" -At -c "
SELECT 1
FROM pg_class c
JOIN pg_namespace n ON n.oid = c.relnamespace
WHERE n.nspname NOT LIKE 'pg_%'
AND n.nspname <> 'information_schema'
LIMIT 1;
" 2>/dev/null || true
)"
[ -z "$has_objects" ]
}
run_restore_as_owner() {
local owner="$1"
if [ -z "$owner" ]; then
fail "Nie można ustalić właściciela bazy ${DB_NAME}."
return 1
fi
echo "[$(date '+%Y-%m-%d %H:%M:%S')] Przywracanie jako właściciel ${owner}" >> "$LOG_FILE"
if [[ "$SOURCE_FILE" == *.gz ]]; then
set +e
{ printf 'SET ROLE "%s";\n' "$owner"; gunzip -c "$SOURCE_FILE" | sanitize_restore_compat; } | psql_admin "$DB_NAME" >> "$LOG_FILE" 2>&1
RC=$?
set -e
else
set +e
{ printf 'SET ROLE "%s";\n' "$owner"; sanitize_restore_compat < "$SOURCE_FILE"; } | psql_admin "$DB_NAME" >> "$LOG_FILE" 2>&1
RC=$?
set -e
fi
return "$RC"
}
sanitize_pg_dump() {
local src_db="$1"
local dst_db="$2"
awk -v src="$src_db" -v dst="$dst_db" '
function lower(s) { return tolower(s) }
{
line = $0
l = lower(line)
if (l ~ /^[[:space:]]*\\connect/ || l ~ /^[[:space:]]*\\c[[:space:]]/) { next }
if (l ~ /^[[:space:]]*create[[:space:]]+database[[:space:]]+/) { next }
if (l ~ /^[[:space:]]*drop[[:space:]]+database[[:space:]]+/) { next }
if (l ~ /^[[:space:]]*alter[[:space:]]+database[[:space:]]+/) { next }
if (l ~ /^[[:space:]]*comment[[:space:]]+on[[:space:]]+database[[:space:]]+/) { next }
if (l ~ /^[[:space:]]*revoke[[:space:]].*[[:space:]]on[[:space:]]+database[[:space:]]+/) { next }
if (l ~ /^[[:space:]]*grant[[:space:]].*[[:space:]]on[[:space:]]+database[[:space:]]+/) { next }
if (l ~ /^[[:space:]]*set[[:space:]]+role[[:space:]]+/) { next }
if (l ~ /^[[:space:]]*set[[:space:]]+session[[:space:]]+authorization/) { next }
if (l ~ /^[[:space:]]*reset[[:space:]]+role/) { next }
if (l ~ /^[[:space:]]*reset[[:space:]]+session[[:space:]]+authorization/) { next }
if (l ~ /^[[:space:]]*alter[[:space:]].*[[:space:]]owner[[:space:]]+to[[:space:]]+/) { next }
if (l ~ /^[[:space:]]*comment[[:space:]]+on[[:space:]]+schema[[:space:]]+public[[:space:]]+is[[:space:]]+/) { next }
if (l ~ /^[[:space:]]*owner[[:space:]]+to[[:space:]]+/) { next }
if (l ~ /^[[:space:]]*alter[[:space:]]+default[[:space:]]+privileges/) { next }
if (l ~ /^[[:space:]]*reassign[[:space:]]+owned/) { next }
if (l ~ /^[[:space:]]*drop[[:space:]]+owned/) { next }
print line
}
'
}
sanitize_restore_compat() {
awk '
function lower(s) { return tolower(s) }
{
line = $0
l = lower(line)
# PostgreSQL < 17: parameter transaction_timeout does not exist.
if (l ~ /^[[:space:]]*set[[:space:]]+"?transaction_timeout"?[[:space:]]*=/) { next }
if (l ~ /^[[:space:]]*reset[[:space:]]+"?transaction_timeout"?[[:space:]]*;/) { next }
print line
}
'
}
preclean_database() {
local owner="$1"
echo "[$(date '+%Y-%m-%d %H:%M:%S')] Czyszczenie bazy ${DB_NAME} przed przywróceniem" >> "$LOG_FILE"
local schemas
schemas="$(psql_admin "$DB_NAME" -At -c "SELECT nspname FROM pg_namespace WHERE nspname NOT LIKE 'pg_%' AND nspname <> 'information_schema'" 2>>"$LOG_FILE" || true)"
if [ -n "$schemas" ]; then
while IFS= read -r schema; do
schema="$(printf '%s' "$schema" | tr -d '\r')"
[ -z "$schema" ] && continue
psql_admin "$DB_NAME" -c "DROP SCHEMA IF EXISTS \"$schema\" CASCADE;" >> "$LOG_FILE" 2>&1 || true
done <<< "$schemas"
fi
if [ -n "$owner" ]; then
psql_admin "$DB_NAME" -c "CREATE SCHEMA IF NOT EXISTS public AUTHORIZATION \"$owner\";" >> "$LOG_FILE" 2>&1 || true
psql_admin "$DB_NAME" -c "GRANT ALL ON SCHEMA public TO \"$owner\";" >> "$LOG_FILE" 2>&1 || true
fi
}
restore_db_owner() {
if [ "$DB_OWNER_SWITCHED" -ne 1 ] || [ -z "$ORIG_DB_OWNER" ] || [ -z "${TMP_DB_USER:-}" ]; then
return 0
fi
if ! role_exists "$ORIG_DB_OWNER"; then
echo "[$(date '+%Y-%m-%d %H:%M:%S')] Oryginalny właściciel bazy ${ORIG_DB_OWNER} nie istnieje, pomijam przywrócenie właściciela." >> "$LOG_FILE"
DB_OWNER_SWITCHED=0
return 0
fi
echo "[$(date '+%Y-%m-%d %H:%M:%S')] Przywracanie właściciela bazy ${DB_NAME} na ${ORIG_DB_OWNER}" >> "$LOG_FILE"
set +e
psql_admin "$DB_NAME" -c "REASSIGN OWNED BY \"$TMP_DB_USER\" TO \"$ORIG_DB_OWNER\";" >> "$LOG_FILE" 2>&1
local rc1=$?
psql_admin "$DB_NAME" -c "DROP OWNED BY \"$TMP_DB_USER\";" >> "$LOG_FILE" 2>&1
local rc2=$?
psql_admin postgres -c "ALTER DATABASE \"$DB_NAME\" OWNER TO \"$ORIG_DB_OWNER\";" >> "$LOG_FILE" 2>&1
local rc3=$?
set -e
if [ "$rc1" -ne 0 ] || [ "$rc3" -ne 0 ]; then
echo "[$(date '+%Y-%m-%d %H:%M:%S')] ERROR: Nie udało się w pełni przywrócić właściciela bazy ${DB_NAME}." >> "$LOG_FILE"
return 1
fi
DB_OWNER_SWITCHED=0
return 0
}
cleanup_tmp_user() {
if [ "$TMP_DB_ACTIVE" -ne 1 ] || [ -z "${TMP_DB_USER:-}" ]; then
return 0
fi
psql_admin postgres -c "DROP ROLE IF EXISTS \"$TMP_DB_USER\";" >/dev/null 2>&1 || true
TMP_DB_ACTIVE=0
}
on_exit() {
local code="$1"
if [ "$code" -ne 0 ] && [ -z "${ERROR_MSG:-}" ] && [ -n "${LOG_FILE:-}" ]; then
ERROR_MSG="Zadanie przywracania zakończyło się błędem (kod ${code}) bez zarejestrowanego szczegółu."
echo "[$(date '+%Y-%m-%d %H:%M:%S')] ERROR: ${ERROR_MSG}" >> "$LOG_FILE"
fi
restore_db_owner || true
cleanup_tmp_user
notify_user "$code"
}
trap 'log_unexpected_error "$LINENO" "$BASH_COMMAND" "$?"' ERR
trap 'on_exit $?' EXIT
random_tmp_password() {
local value
value="$(od -An -N48 -tx1 /dev/urandom 2>/dev/null | tr -d '[:space:]')"
if [ -z "$value" ]; then
value="$(date +%s%N)${RANDOM}${RANDOM}"
fi
printf '%s' "${value:0:32}"
}
path_in_dir() {
local path="$1"
local dir="$2"
local real_path real_dir
real_path="$(realpath "$path" 2>/dev/null || true)"
real_dir="$(realpath "$dir" 2>/dev/null || true)"
if [ -z "$real_path" ] || [ -z "$real_dir" ]; then
return 1
fi
if [ "$real_path" = "$real_dir" ]; then
return 0
fi
case "$real_path" in
"$real_dir"/*) return 0 ;;
esac
return 1
}
# shellcheck disable=SC1090
source "$JOB_FILE"
JOB_ID="${JOB_ID:-$(basename "$JOB_FILE" .env)}"
DA_USER="${DA_USER:-}"
DB_NAME="${DB_NAME:-}"
SOURCE_FILE="${SOURCE_FILE:-}"
SOURCE_KIND="${SOURCE_KIND:-local}"
RESTORE_MODE="${RESTORE_MODE:-overwrite}"
SOURCE_DB_NAME="${SOURCE_DB_NAME:-}"
RESTORE_MODE="$(printf '%s' "$RESTORE_MODE" | tr '[:upper:]' '[:lower:]')"
if [ "$RESTORE_MODE" != "new_db" ]; then
RESTORE_MODE="overwrite"
fi
LOG_FILE="${LOG_DIR}/${JOB_ID}.log"
echo "[$(date '+%Y-%m-%d %H:%M:%S')] Start restore job ${JOB_ID}" > "$LOG_FILE"
if [ -z "$DA_USER" ] || [ -z "$DB_NAME" ] || [ -z "$SOURCE_FILE" ]; then
fail "Brak DA_USER, DB_NAME lub SOURCE_FILE w pliku zadania."
exit 1
fi
if [[ "$DB_NAME" != "${DA_USER}_"* ]]; then
fail "Baza ${DB_NAME} nie należy do użytkownika ${DA_USER}."
exit 1
fi
load_plugin_settings
load_pg_credentials
resolve_bins
if [ ! -f "$SOURCE_FILE" ] || [ ! -r "$SOURCE_FILE" ]; then
fail "Nie można odczytać pliku backupu: ${SOURCE_FILE}"
exit 1
fi
case "$SOURCE_FILE" in
*.sql|*.sql.gz|*.gz) ;;
*)
fail "Dozwolone są wyłącznie pliki .sql, .gz i .sql.gz."
exit 1
;;
esac
USER_BACKUP_ROOT="${HITME_BACKUP_LOCATION:-/home/admin/postgres_backup}"
UPLOAD_ROOT="${PLUGIN_DIR}/data/uploads/${DA_USER}"
if [ "$SOURCE_KIND" = "local" ]; then
if ! path_in_dir "$SOURCE_FILE" "$USER_BACKUP_ROOT"; then
fail "Plik backupu lokalnego znajduje się poza dozwolonym katalogiem użytkownika."
exit 1
fi
else
if ! path_in_dir "$SOURCE_FILE" "$UPLOAD_ROOT"; then
fail "Plik do przywrócenia znajduje się poza katalogiem upload."
exit 1
fi
fi
DB_ESC="$(sql_escape_literal "$DB_NAME")"
DB_EXISTS="$(psql_admin postgres -At -c "SELECT 1 FROM pg_database WHERE datname='${DB_ESC}'" 2>/dev/null || true)"
if [ -z "$DB_EXISTS" ]; then
fail "Docelowa baza danych ${DB_NAME} nie istnieje."
exit 1
fi
if [ "$RESTORE_MODE" = "overwrite" ] && [ -n "$SOURCE_DB_NAME" ] && [ "$SOURCE_DB_NAME" = "$DB_NAME" ]; then
USE_OWNER_RESTORE=1
PRE_CLEAN=1
fi
if [ "$RESTORE_MODE" = "new_db" ]; then
PRE_CLEAN=1
fi
if [ "$SOURCE_KIND" = "local" ]; then
USE_SANITIZE=1
fi
if [ "$SOURCE_KIND" = "file" ]; then
SOURCE_DB_NAME=""
USE_SANITIZE=1
fi
if [ "$RESTORE_MODE" = "new_db" ] && [ -n "$SOURCE_DB_NAME" ] && [ "$SOURCE_DB_NAME" != "$DB_NAME" ]; then
USE_SANITIZE=1
fi
ORIG_DB_OWNER="$(resolve_db_owner)"
if [ -z "$ORIG_DB_OWNER" ]; then
fail "Nie można ustalić właściciela bazy ${DB_NAME}."
exit 1
fi
if [ "$RESTORE_MODE" = "new_db" ]; then
echo "[$(date '+%Y-%m-%d %H:%M:%S')] Typ przywracania: Przywracanie do nowej bazy" >> "$LOG_FILE"
else
echo "[$(date '+%Y-%m-%d %H:%M:%S')] Typ przywracania: Przywracanie z nadpisaniem" >> "$LOG_FILE"
fi
if [ -n "$SOURCE_DB_NAME" ]; then
echo "[$(date '+%Y-%m-%d %H:%M:%S')] Baza źródłowa: ${SOURCE_DB_NAME}" >> "$LOG_FILE"
fi
echo "[$(date '+%Y-%m-%d %H:%M:%S')] Baza docelowa: ${DB_NAME}" >> "$LOG_FILE"
if [ "$PRE_CLEAN" -eq 1 ]; then
preclean_database "$ORIG_DB_OWNER"
fi
# Jeżeli restore pochodzi z zewnętrznego pliku i baza docelowa jest pusta,
# użyj użytkownika przypisanego do bazy (właściciela), bez użytkownika tymczasowego.
if database_is_empty "$DB_NAME"; then
TARGET_DB_EMPTY=1
fi
if [ "$SOURCE_KIND" = "file" ] && [ "$TARGET_DB_EMPTY" -eq 1 ] && [ "$USE_OWNER_RESTORE" -eq 0 ]; then
USE_OWNER_RESTORE=1
echo "[$(date '+%Y-%m-%d %H:%M:%S')] Wykryto pustą bazę docelową i restore z pliku: używam użytkownika przypisanego do bazy (${ORIG_DB_OWNER})." >> "$LOG_FILE"
fi
if [ "$USE_OWNER_RESTORE" -eq 0 ]; then
TMP_DB_USER="pgtmp_rst_$(printf '%s' "$JOB_ID" | tr -cd 'A-Za-z0-9' | tr '[:upper:]' '[:lower:]' | head -c 18)"
[ -n "$TMP_DB_USER" ] || TMP_DB_USER="pgtmp_rst_$(date +%s)"
TMP_DB_PASS="$(random_tmp_password)"
PASS_ESC="$(sql_escape_literal "$TMP_DB_PASS")"
echo "[$(date '+%Y-%m-%d %H:%M:%S')] Tworzenie tymczasowego użytkownika restore ${TMP_DB_USER}" >> "$LOG_FILE"
psql_admin postgres -c "SET password_encryption='scram-sha-256'; DROP ROLE IF EXISTS \"$TMP_DB_USER\"; CREATE ROLE \"$TMP_DB_USER\" LOGIN NOSUPERUSER NOCREATEDB NOCREATEROLE INHERIT NOREPLICATION PASSWORD '${PASS_ESC}';" >> "$LOG_FILE" 2>&1
TMP_DB_ACTIVE=1
psql_admin postgres -c "GRANT CONNECT, CREATE, TEMPORARY ON DATABASE \"$DB_NAME\" TO \"$TMP_DB_USER\";" >> "$LOG_FILE" 2>&1
psql_admin "$DB_NAME" -c "GRANT USAGE, CREATE ON SCHEMA public TO \"$TMP_DB_USER\"; GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA public TO \"$TMP_DB_USER\"; GRANT ALL PRIVILEGES ON ALL SEQUENCES IN SCHEMA public TO \"$TMP_DB_USER\"; GRANT ALL PRIVILEGES ON ALL FUNCTIONS IN SCHEMA public TO \"$TMP_DB_USER\";" >> "$LOG_FILE" 2>&1
if [ -n "$ORIG_DB_OWNER" ] && [ "$ORIG_DB_OWNER" != "$TMP_DB_USER" ]; then
echo "[$(date '+%Y-%m-%d %H:%M:%S')] Tymczasowe przejęcie właściciela bazy ${DB_NAME} przez ${TMP_DB_USER}" >> "$LOG_FILE"
psql_admin postgres -c "ALTER DATABASE \"$DB_NAME\" OWNER TO \"$TMP_DB_USER\";" >> "$LOG_FILE" 2>&1
DB_OWNER_SWITCHED=1
fi
# Restore z plików dump może zawierać operacje wymagające bycia właścicielem
# schematu public (np. COMMENT ON SCHEMA public). Ustaw właściciela na użytkownika
# tymczasowego, a po restore owner wróci przez restore_db_owner().
psql_admin "$DB_NAME" -c "ALTER SCHEMA public OWNER TO \"$TMP_DB_USER\";" >> "$LOG_FILE" 2>&1 || true
fi
echo "[$(date '+%Y-%m-%d %H:%M:%S')] Przywracanie bazy ${DB_NAME} z pliku ${SOURCE_FILE}" >> "$LOG_FILE"
if [ "$USE_OWNER_RESTORE" -eq 1 ]; then
set +e
if [ "$USE_SANITIZE" -eq 1 ]; then
echo "[$(date '+%Y-%m-%d %H:%M:%S')] Sanityzacja dumpa: ${SOURCE_DB_NAME} -> ${DB_NAME}" >> "$LOG_FILE"
if [[ "$SOURCE_FILE" == *.gz ]]; then
{ printf 'SET ROLE "%s";\n' "$ORIG_DB_OWNER"; gunzip -c "$SOURCE_FILE" | sanitize_pg_dump "$SOURCE_DB_NAME" "$DB_NAME" | sanitize_restore_compat; } | psql_admin "$DB_NAME" >> "$LOG_FILE" 2>&1
RC=$?
else
{ printf 'SET ROLE "%s";\n' "$ORIG_DB_OWNER"; sanitize_pg_dump "$SOURCE_DB_NAME" "$DB_NAME" < "$SOURCE_FILE" | sanitize_restore_compat; } | psql_admin "$DB_NAME" >> "$LOG_FILE" 2>&1
RC=$?
fi
else
run_restore_as_owner "$ORIG_DB_OWNER"
RC=$?
fi
set -e
else
if [[ "$SOURCE_FILE" == *.gz ]]; then
set +e
if [ "$USE_SANITIZE" -eq 1 ]; then
echo "[$(date '+%Y-%m-%d %H:%M:%S')] Sanityzacja dumpa: ${SOURCE_DB_NAME} -> ${DB_NAME}" >> "$LOG_FILE"
gunzip -c "$SOURCE_FILE" | sanitize_pg_dump "$SOURCE_DB_NAME" "$DB_NAME" | sanitize_restore_compat | PGPASSWORD="$TMP_DB_PASS" "$PSQL_BIN" -h "$PGHOST_VAL" -p "$PGPORT_VAL" -U "$TMP_DB_USER" -d "$DB_NAME" -v ON_ERROR_STOP=1 >> "$LOG_FILE" 2>&1
RC=$?
else
gunzip -c "$SOURCE_FILE" | sanitize_restore_compat | PGPASSWORD="$TMP_DB_PASS" "$PSQL_BIN" -h "$PGHOST_VAL" -p "$PGPORT_VAL" -U "$TMP_DB_USER" -d "$DB_NAME" -v ON_ERROR_STOP=1 >> "$LOG_FILE" 2>&1
RC=$?
fi
set -e
else
set +e
if [ "$USE_SANITIZE" -eq 1 ]; then
echo "[$(date '+%Y-%m-%d %H:%M:%S')] Sanityzacja dumpa: ${SOURCE_DB_NAME} -> ${DB_NAME}" >> "$LOG_FILE"
sanitize_pg_dump "$SOURCE_DB_NAME" "$DB_NAME" < "$SOURCE_FILE" | sanitize_restore_compat | PGPASSWORD="$TMP_DB_PASS" "$PSQL_BIN" -h "$PGHOST_VAL" -p "$PGPORT_VAL" -U "$TMP_DB_USER" -d "$DB_NAME" -v ON_ERROR_STOP=1 >> "$LOG_FILE" 2>&1
RC=$?
else
sanitize_restore_compat < "$SOURCE_FILE" | PGPASSWORD="$TMP_DB_PASS" "$PSQL_BIN" -h "$PGHOST_VAL" -p "$PGPORT_VAL" -U "$TMP_DB_USER" -d "$DB_NAME" -v ON_ERROR_STOP=1 >> "$LOG_FILE" 2>&1
RC=$?
fi
set -e
fi
fi
if [ "$RC" -ne 0 ]; then
fail "Nie udało się przywrócić bazy ${DB_NAME}."
exit 1
fi
if [ "$USE_OWNER_RESTORE" -eq 0 ]; then
if ! restore_db_owner; then
fail "Nie udało się przywrócić właściciela bazy ${DB_NAME}."
exit 1
fi
fi
echo "[$(date '+%Y-%m-%d %H:%M:%S')] Przywracanie zakończone powodzeniem" >> "$LOG_FILE"
RESTORE_OK=1
exit 0