#!/bin/sh
##
##  pg_migrate -- PostgreSQL Database Migration Utility
##  Copyright (c) 2000-2003 Cable & Wireless Deutschland GmbH
##  Copyright (c) 2000-2003 The OpenPKG Project <http://www.openpkg.org/>
##  Copyright (c) 2000-2003 Ralf S. Engelschall <rse@engelschall.com>
##
##  Permission to use, copy, modify, and distribute this software for
##  any purpose with or without fee is hereby granted, provided that
##  the above copyright notice and this permission notice appear in all
##  copies.
##
##  THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
##  WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
##  MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
##  IN NO EVENT SHALL THE AUTHORS AND COPYRIGHT HOLDERS AND THEIR
##  CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
##  SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
##  LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
##  USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
##  ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
##  OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
##  OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
##  SUCH DAMAGE.
##

#   configuration
l_prefix="@l_prefix@"
l_rusr="@l_rusr@"
l_rgrp="@l_rgrp@"

#   establish sane environment
LC_CTYPE=C
export LC_CTYPE
umask 022

cmd="$1"
shift
case $cmd in
    dump )
        echo "++ enforcing full-superuser access policy"
        cp -p $l_prefix/var/postgresql/db/pg_hba.conf \
              $l_prefix/var/postgresql/db/pg_hba.conf.orig
        ( echo "local all trust"
          echo "host all 127.0.0.1 255.255.255.255 trust"
        ) >$l_prefix/var/postgresql/db/pg_hba.conf

        if [ ".`$l_prefix/etc/rc postgresql status 2>&1 | grep 'is running'`" != . ]; then
            echo "++ reloading already running database engine"
            $l_prefix/etc/rc postgresql reload
            sleep 2
            epilog=reload
        else
            echo "++ temporarily starting database engine"
            $l_prefix/etc/rc postgresql start 
            sleep 4
            epilog=stop
        fi

        echo "++ rotating dump files $l_prefix/var/postgresql/db.dump*.sql.bz2"
        i=9
        rm -f $l_prefix/var/postgresql/db.dump.$i.sql.bz2 >/dev/null 2>&1 || true
        while [ $i -gt 0 ]; do
            j=$i
            i=`expr $i - 1`
            if [ $i -eq 0 ]; then
                prev="$l_prefix/var/postgresql/db.dump.sql.bz2"
                next="$l_prefix/var/postgresql/db.dump.$j.sql.bz2"
            else
                prev="$l_prefix/var/postgresql/db.dump.$i.sql.bz2"
                next="$l_prefix/var/postgresql/db.dump.$j.sql.bz2"
            fi
            if [ -f $prev ]; then
                mv $prev $next
            fi
        done

        echo "++ dumping all databases into $l_prefix/var/postgresql/db.dump.sql.bz2"
        $l_prefix/bin/pg_dumpall \
            -U postgresql -Spostgresql -o -Xuse-set-session-authorization |\
            $l_prefix/lib/openpkg/bzip2 -9 \
                >$l_prefix/var/postgresql/db.dump.sql.bz2
        chown ${l_rusr}:${l_rgrp} $l_prefix/var/postgresql/db.dump.sql.bz2
        chmod 700 $l_prefix/var/postgresql/db.dump.sql.bz2

        echo "++ restoring original access policy"
        cp -p $l_prefix/var/postgresql/db/pg_hba.conf.orig \
              $l_prefix/var/postgresql/db/pg_hba.conf
        rm -f $l_prefix/var/postgresql/db/pg_hba.conf.orig

        if [ ".$epilog" = .reload ]; then
            echo "++ reloading already running database engine (again)"
            $l_prefix/etc/rc postgresql reload
            sleep 2
        else
            echo "++ stopping temporarily started database engine"
            $l_prefix/etc/rc postgresql stop 
            sleep 4
        fi
        ;;

    restore )
        if [ ".`$l_prefix/etc/rc postgresql status 2>&1 | grep 'is running'`" != . ]; then
            echo "++ stopping already running database engine"
            $l_prefix/etc/rc postgresql stop
            sleep 2
            epilog=start
        else
            epilog=none
        fi

        echo "++ rotating database directories $l_prefix/var/postgresql/db.old*/"
        i=9
        rm -rf $l_prefix/var/postgresql/db.old.$i >/dev/null 2>&1 || true
        while [ $i -gt 0 ]; do
            j=$i
            i=`expr $i - 1`
            if [ $i -eq 0 ]; then
                prev="$l_prefix/var/postgresql/db"
                next="$l_prefix/var/postgresql/db.old.$j"
            else
                prev="$l_prefix/var/postgresql/db.old.$i"
                next="$l_prefix/var/postgresql/db.old.$j"
            fi
            if [ -d $prev ]; then
                mv $prev $next
            fi
        done

        echo "++ creating new database directory $l_prefix/var/postgresql/db/"
        mkdir $l_prefix/var/postgresql/db
        chown ${l_rusr}:${l_rgrp} $l_prefix/var/postgresql/db
        chmod 700 $l_prefix/var/postgresql/db

        su - ${l_rusr} -c \
            "LC_CTYPE=C; export LC_CTYPE; umask 022; \
            (echo 'postgresql'; echo 'postgresql') |\
            $l_prefix/bin/pg_initdb -U postgresql -W -D $l_prefix/var/postgresql/db" 2>&1 |\
                $l_prefix/lib/openpkg/shtool prop \
                    -p "++ creating new database data"

        echo "++ restoring database configurations"
        for conf in pg_hba.conf pg_ident.conf postgresql.conf; do
            cp -p $l_prefix/var/postgresql/db.old.1/$conf \
                  $l_prefix/var/postgresql/db/
        done

        echo "++ enforcing full-superuser access policy"
        cp -p $l_prefix/var/postgresql/db/pg_hba.conf \
              $l_prefix/var/postgresql/db/pg_hba.conf.orig
        ( echo "local all trust"
          echo "host all 127.0.0.1 255.255.255.255 trust"
        ) >$l_prefix/var/postgresql/db/pg_hba.conf

        if [ ".$epilog" = .start ]; then
            echo "++ starting database engine"
        else
            echo "++ temporarily starting database engine"
        fi
        $l_prefix/etc/rc postgresql start
        sleep 4

        echo "++ restoring all databases from $l_prefix/var/postgresql/db.dump.sql.bz2"
        $l_prefix/lib/openpkg/bzip2 -c -d \
            $l_prefix/var/postgresql/db.dump.sql.bz2 |\
                $l_prefix/bin/psql -U postgresql -d template1 2>&1 |\
                    tee $l_prefix/var/postgresql/db.log |\
                        $l_prefix/lib/openpkg/shtool prop \
                            -p "++ restoring data (see $l_prefix/var/postgresql/db.log)"

        echo "++ restoring original access policy"
        cp -p $l_prefix/var/postgresql/db/pg_hba.conf.orig \
              $l_prefix/var/postgresql/db/pg_hba.conf
        rm -f $l_prefix/var/postgresql/db/pg_hba.conf.orig

        if [ ".$epilog" = .start ]; then
            echo "++ reloading already running database engine"
            $l_prefix/etc/rc postgresql reload
            sleep 2
        else
            echo "++ stopping temporarily started database engine"
            $l_prefix/etc/rc postgresql stop 
            sleep 4
        fi
        ;;
esac

