#!/usr/bin/env bash
# Hostfera: custom-format dump of one local PostgreSQL database.
set -Eeuo pipefail
umask 077
[[ $EUID -eq 0 ]] || { echo 'Запустите через sudo bash.' >&2; exit 1; }
[[ $# -eq 1 && $1 =~ ^[a-z][a-z0-9_]{0,62}$ ]] || {
  echo 'Использование: sudo bash hostfera-pg-backup-1.0.0.sh имя_базы' >&2; exit 1;
}
DB=$1
BASE=/var/backups/hostfera-postgresql
[[ ! -L $BASE ]] || { echo 'Каталог копий не должен быть символической ссылкой.' >&2; exit 1; }
if [[ -e $BASE ]]; then
  [[ -d $BASE && $(stat -c %u "$BASE") == 0 ]] || { echo 'Проверьте владельца каталога копий.' >&2; exit 1; }
fi
command -v pg_dump >/dev/null
command -v pg_restore >/dev/null
id postgres >/dev/null
install -d -m 0700 -o root -g root "$BASE"
DIR=$(mktemp -d "$BASE/${DB}_$(date -u +%Y%m%dT%H%M%SZ)_XXXXXXXX")
trap 'rm -f -- "$DIR/database.dump.partial"' EXIT
runuser -u postgres -- pg_dump --host=/var/run/postgresql --port=5432 \
  --format=custom --dbname="$DB" > "$DIR/database.dump.partial"
pg_restore --list < "$DIR/database.dump.partial" > "$DIR/contents.txt"
mv -- "$DIR/database.dump.partial" "$DIR/database.dump"
(cd "$DIR" && sha256sum database.dump > SHA256SUMS && sha256sum --check SHA256SUMS)
{
  printf 'database=%s\ncreated_utc=%s\n' "$DB" "$(date -u +%FT%TZ)"
  pg_dump --version
  stat -c 'dump_bytes=%s' "$DIR/database.dump"
} > "$DIR/metadata.txt"
printf 'Резервная копия: %s\n' "$DIR"
printf 'Оглавление: %s/contents.txt\nПроверка SHA-256: успешно\n' "$DIR"
printf 'Теперь проверьте восстановление в отдельную пустую базу.\n'
