#!/bin/bash
# 
# from docker container $1, dumps postgres DB specified as $2 efficiently to file.
# filename can be given as $2, defaults to $1.sql.gz
# .gz and .bz2 are respected by filtering the output through gzip/bzip2

DOCKERCT="$1"
if [ -z "$DOCKERCT" ] ; then
  echo "$(date +%Y-%m-%d\ %H:%M:%S): FATAL: No docker container given as \$1"
  exit 1
fi

DOCKERPS=$(docker ps --filter "status=running" --filter "name=${DOCKERCT}$" --quiet 2>/dev/null)
if [ -z "$DOCKERPS" ] ; then
  echo "$(date +%Y-%m-%d\ %H:%M:%S): FATAL: Cannot ps docker container ${DOCKERCT}, not running?"
  exit 2
fi

shift

DBNAME="$1"
shift
if [ -z "$DBNAME" ] ; then
  echo "$(date +%Y-%m-%d\ %H:%M:%S): FATAL: No Databasename specified as \$1."
  echo "Syntax: $0 databaseName [ fileName [POSTGRESdump options] ]"
  exit 5
fi

DUMPFILE="$1"
shift
if [ -z "$DUMPFILE" ] ; then
  echo "$(date +%Y-%m-%d\ %H:%M:%S): INFO: No file name given as \$2, defaulting to ${DBNAME}.sql.gz"
  DUMPFILE="${DBNAME}.sql.gz"
fi

POSTGRESOPTS=""
POSTGRESOPTS="$POSTGRESOPTS -O" # --no-owner
POSTGRESOPTS="$POSTGRESOPTS $*"


echo "$(date +%Y-%m-%d\ %H:%M:%S): INFO: Saving DB $DBNAME to $DUMPFILE"

FILTER=""
echo "$DUMPFILE" |egrep '\.gz' >/dev/null && FILTER="gzip"
echo "$DUMPFILE" |egrep '\.bz2' >/dev/null && FILTER="bzip2"

#echo "Executing ..."
if [ -z "$FILTER" ] ; then
  #echo "sudo -u postgres pg_dump $POSTGRESOPTS -d $DBNAME \>$DUMPFILE"
  docker exec -u postgres ${DOCKERCT} pg_dump $POSTGRESOPTS -d $DBNAME >$DUMPFILE || exit 11
else 
  #echo "sudo -u postgres pg_dump $POSTGRESOPTS -d $DBNAME \|$FILTER \>$DUMPFILE"
  docker exec -u postgres ${DOCKERCT} pg_dump $POSTGRESOPTS -d $DBNAME |$FILTER >$DUMPFILE || exit 12
fi

chmod go-rwx $DUMPFILE
ls -ld $DUMPFILE

echo "$(date +%Y-%m-%d\ %H:%M:%S): GOOD: Saved dockerized DB ${DOCKERCT}.$DBNAME to $DUMPFILE"

