You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

219 lines
8.0 KiB

#!/bin/sh
##
## pg_migrate -- PostgreSQL Database Migration Utility
## Copyright (c) 2007-2018 Ralf S. Engelschall <http://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@"
# load superuser information
l_pgdata=""
l_pguser=""
l_pgpass=""
if [ ! -r $l_prefix/var/postgresql/db/pg_superuser.conf ]; then
echo "$0:ERROR: unable to read file \"$l_prefix/var/postgresql/db/pg_superuser.conf\" (use pg_passwd(1) to create)" 1>&2
exit 1
fi
eval `. $l_prefix/var/postgresql/db/pg_superuser.conf; \
echo l_pgdata=\"$superuser_database\"; \
echo l_pguser=\"$superuser_username\"; \
echo l_pgpass=\"$superuser_password\"`
# establish sane environment
LC_CTYPE=C
export LC_CTYPE
umask 022
# check command line
if [ $# -ne 1 -a $# -ne 2 ]; then
echo "$0:ERROR: invalid command line" 1>&2
echo "$0:USAGE: $0 dump|restore [<password>]" 1>&2
exit 1
fi
cmd="$1"; shift
if [ $# -eq 1 ]; then
l_pgpass="$1"; shift
fi
# dispatch into commands
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 all trust"
echo "host all all 127.0.0.1/32 trust"
) >$l_prefix/var/postgresql/db/pg_hba.conf
( eval `${l_prefix}/bin/openpkg rc postgresql status 2>/dev/null`
echo "postgresql_active=\"$postgresql_active\""
) 2>/dev/null
if [ ".$postgresql_active" = .yes ]; then
echo "++ reloading already running database engine"
$l_prefix/bin/openpkg rc postgresql reload
sleep 2
epilog=reload
else
echo "++ temporarily starting database engine"
$l_prefix/bin/openpkg 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"
PGPASSWORD="$l_pgpass" \
$l_prefix/bin/pg_dumpall \
-U "$l_pguser" -o |\
$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/bin/openpkg rc postgresql reload
sleep 2
else
echo "++ stopping temporarily started database engine"
$l_prefix/bin/openpkg rc postgresql stop
sleep 4
fi
;;
restore )
if [ ".`$l_prefix/bin/openpkg rc postgresql status 2>&1 | grep 'is running'`" != . ]; then
echo "++ stopping already running database engine"
$l_prefix/bin/openpkg 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 $l_pgpass >$l_prefix/var/postgresql/run/pw; \
$l_prefix/bin/pg_initdb \
-U $l_pguser --pwfile=$l_prefix/var/postgresql/run/pw \
-D $l_prefix/var/postgresql/db; \
rm -f $l_prefix/var/postgresql/run/pw" 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 all trust"
echo "host all all 127.0.0.1/32 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/bin/openpkg 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 "$l_pguser" -d "$l_pgdata" 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/bin/openpkg rc postgresql reload
sleep 2
else
echo "++ stopping temporarily started database engine"
$l_prefix/bin/openpkg rc postgresql stop
sleep 4
fi
;;
* )
echo "$0:ERROR: unknown command \"$cmd\"" 1>&2
exit 1
;;
esac