#!/bin/sh -eu # SYNTAX: $database_pattern -- $snapshot_eval # DESCRIPTION: crée un instantané pour chaque base de données PostgreSQL $database donnée # DESCRIPTION: dans ~backup/snapshot/postgresql/"$database", # DESCRIPTION: puis évalue $snapshot_eval, # DESCRIPTION: puis efface l'instantané. ${TRACE:+set -x} test "$(id -u)" = "$(id -u backup)" database_pattern=$1; shift test ! "${1-}" = -- || shift test ! $# = 0 || set -- : install -d -m 770 -o backup -g backup \ ~backup/snapshot/postgresql errno=0 while IFS=' \r' read -r database do { test "${database:+set}" if test -e ~backup/snapshot/postgresql/$database then cat >&2 <<-EOF ERROR: soit une sauvegarde est déjà en cours, soit une précédente a échoué. EOF false fi install -d -m 770 -o backup -g backup \ ~backup/snapshot/postgresql/"$database" psql --quiet "$database" -c "VACUUM (ANALYSE);" pg_dump --blobs --compress 0 --format custom ${TRACE:+--verbose} \ --file ~backup/snapshot/postgresql/"$database"/dump.sql \ "$database" eval "$@" rm -rf \ ~backup/snapshot/postgresql/"$database" } || { errno=$? cat >&2 <<-EOF ERROR: $0 "$database" "$@" EOF if test "${database:+set}" then rm -rf ~backup/snapshot/postgresql/"$database" fi } done <<-EOF $(psql --quiet --tuples-only postgres <<-EOF || exit 1 \set ON_ERROR_STOP on SELECT datname FROM pg_catalog.pg_database WHERE datallowconn AND datname LIKE '$database_pattern'; EOF ) EOF exit $errno