--- /dev/null
+#!/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
+
+snapshot () {
+ local database="$1" && shift &&
+ test ! -e ~backup/snapshot/postgresql/"$database" &&
+ # NOTE: soit une sauvegarde est déjà en cours,
+ # soit une précédente a échoué.
+ 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" &&
+ :
+ }
+
+exit=0
+while IFS=' \r' read -r database
+ do if ! snapshot "$database" "$@"
+ then
+ exit=1
+ cat >&2 <<-EOF
+ ERROR: snapshot "$database" "$@"
+ EOF
+ 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 $exit