Ajout : sauvegardes automatiques des bases postgresql.
[lhc/ateliers.git] / local / backup / postgresql-snapshot
diff --git a/local/backup/postgresql-snapshot b/local/backup/postgresql-snapshot
new file mode 100755 (executable)
index 0000000..da34ee0
--- /dev/null
@@ -0,0 +1,54 @@
+#!/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