1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 1.2 +++ b/postgresql/pg_migrate Mon Nov 22 16:54:26 2010 +0100 1.3 @@ -0,0 +1,220 @@ 1.4 +#!/bin/sh 1.5 +## 1.6 +## pg_migrate -- PostgreSQL Database Migration Utility 1.7 +## Copyright (c) 2000-2007 OpenPKG Foundation e.V. <http://openpkg.net/> 1.8 +## Copyright (c) 2000-2007 Ralf S. Engelschall <http://engelschall.com/> 1.9 +## 1.10 +## Permission to use, copy, modify, and distribute this software for 1.11 +## any purpose with or without fee is hereby granted, provided that 1.12 +## the above copyright notice and this permission notice appear in all 1.13 +## copies. 1.14 +## 1.15 +## THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED 1.16 +## WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF 1.17 +## MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 1.18 +## IN NO EVENT SHALL THE AUTHORS AND COPYRIGHT HOLDERS AND THEIR 1.19 +## CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 1.20 +## SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 1.21 +## LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF 1.22 +## USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND 1.23 +## ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, 1.24 +## OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT 1.25 +## OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 1.26 +## SUCH DAMAGE. 1.27 +## 1.28 + 1.29 +# configuration 1.30 +l_prefix="@l_prefix@" 1.31 +l_rusr="@l_rusr@" 1.32 +l_rgrp="@l_rgrp@" 1.33 + 1.34 +# load superuser information 1.35 +l_pgdata="" 1.36 +l_pguser="" 1.37 +l_pgpass="" 1.38 +if [ ! -r $l_prefix/var/postgresql/db/pg_superuser.conf ]; then 1.39 + echo "$0:ERROR: unable to read file \"$l_prefix/var/postgresql/db/pg_superuser.conf\" (use pg_passwd(1) to create)" 1>&2 1.40 + exit 1 1.41 +fi 1.42 +eval `. $l_prefix/var/postgresql/db/pg_superuser.conf; \ 1.43 + echo l_pgdata=\"$superuser_database\"; \ 1.44 + echo l_pguser=\"$superuser_username\"; \ 1.45 + echo l_pgpass=\"$superuser_password\"` 1.46 + 1.47 +# establish sane environment 1.48 +LC_CTYPE=C 1.49 +export LC_CTYPE 1.50 +umask 022 1.51 + 1.52 +# check command line 1.53 +if [ $# -ne 1 -a $# -ne 2 ]; then 1.54 + echo "$0:ERROR: invalid command line" 1>&2 1.55 + echo "$0:USAGE: $0 dump|restore [<password>]" 1>&2 1.56 + exit 1 1.57 +fi 1.58 +cmd="$1"; shift 1.59 +if [ $# -eq 1 ]; then 1.60 + l_pgpass="$1"; shift 1.61 +fi 1.62 + 1.63 +# dispatch into commands 1.64 +case $cmd in 1.65 + dump ) 1.66 + echo "++ enforcing full-superuser access policy" 1.67 + cp -p $l_prefix/var/postgresql/db/pg_hba.conf \ 1.68 + $l_prefix/var/postgresql/db/pg_hba.conf.orig 1.69 + ( echo "local all all trust" 1.70 + echo "host all all 127.0.0.1/32 trust" 1.71 + ) >$l_prefix/var/postgresql/db/pg_hba.conf 1.72 + 1.73 + ( eval `${l_prefix}/bin/openpkg rc postgresql status 2>/dev/null` 1.74 + echo "postgresql_active=\"$postgresql_active\"" 1.75 + ) 2>/dev/null 1.76 + if [ ".$postgresql_active" = .yes ]; then 1.77 + echo "++ reloading already running database engine" 1.78 + $l_prefix/bin/openpkg rc postgresql reload 1.79 + sleep 2 1.80 + epilog=reload 1.81 + else 1.82 + echo "++ temporarily starting database engine" 1.83 + $l_prefix/bin/openpkg rc postgresql start 1.84 + sleep 4 1.85 + epilog=stop 1.86 + fi 1.87 + 1.88 + echo "++ rotating dump files $l_prefix/var/postgresql/db.dump*.sql.bz2" 1.89 + i=9 1.90 + rm -f $l_prefix/var/postgresql/db.dump.$i.sql.bz2 >/dev/null 2>&1 || true 1.91 + while [ $i -gt 0 ]; do 1.92 + j=$i 1.93 + i=`expr $i - 1` 1.94 + if [ $i -eq 0 ]; then 1.95 + prev="$l_prefix/var/postgresql/db.dump.sql.bz2" 1.96 + next="$l_prefix/var/postgresql/db.dump.$j.sql.bz2" 1.97 + else 1.98 + prev="$l_prefix/var/postgresql/db.dump.$i.sql.bz2" 1.99 + next="$l_prefix/var/postgresql/db.dump.$j.sql.bz2" 1.100 + fi 1.101 + if [ -f $prev ]; then 1.102 + mv $prev $next 1.103 + fi 1.104 + done 1.105 + 1.106 + echo "++ dumping all databases into $l_prefix/var/postgresql/db.dump.sql.bz2" 1.107 + PGPASSWORD="$l_pgpass" \ 1.108 + $l_prefix/bin/pg_dumpall \ 1.109 + -U "$l_pguser" -o |\ 1.110 + $l_prefix/lib/openpkg/bzip2 -9 \ 1.111 + >$l_prefix/var/postgresql/db.dump.sql.bz2 1.112 + chown ${l_rusr}:${l_rgrp} $l_prefix/var/postgresql/db.dump.sql.bz2 1.113 + chmod 700 $l_prefix/var/postgresql/db.dump.sql.bz2 1.114 + 1.115 + echo "++ restoring original access policy" 1.116 + cp -p $l_prefix/var/postgresql/db/pg_hba.conf.orig \ 1.117 + $l_prefix/var/postgresql/db/pg_hba.conf 1.118 + rm -f $l_prefix/var/postgresql/db/pg_hba.conf.orig 1.119 + 1.120 + if [ ".$epilog" = .reload ]; then 1.121 + echo "++ reloading already running database engine (again)" 1.122 + $l_prefix/bin/openpkg rc postgresql reload 1.123 + sleep 2 1.124 + else 1.125 + echo "++ stopping temporarily started database engine" 1.126 + $l_prefix/bin/openpkg rc postgresql stop 1.127 + sleep 4 1.128 + fi 1.129 + ;; 1.130 + 1.131 + restore ) 1.132 + if [ ".`$l_prefix/bin/openpkg rc postgresql status 2>&1 | grep 'is running'`" != . ]; then 1.133 + echo "++ stopping already running database engine" 1.134 + $l_prefix/bin/openpkg rc postgresql stop 1.135 + sleep 2 1.136 + epilog=start 1.137 + else 1.138 + epilog=none 1.139 + fi 1.140 + 1.141 + echo "++ rotating database directories $l_prefix/var/postgresql/db.old*/" 1.142 + i=9 1.143 + rm -rf $l_prefix/var/postgresql/db.old.$i >/dev/null 2>&1 || true 1.144 + while [ $i -gt 0 ]; do 1.145 + j=$i 1.146 + i=`expr $i - 1` 1.147 + if [ $i -eq 0 ]; then 1.148 + prev="$l_prefix/var/postgresql/db" 1.149 + next="$l_prefix/var/postgresql/db.old.$j" 1.150 + else 1.151 + prev="$l_prefix/var/postgresql/db.old.$i" 1.152 + next="$l_prefix/var/postgresql/db.old.$j" 1.153 + fi 1.154 + if [ -d $prev ]; then 1.155 + mv $prev $next 1.156 + fi 1.157 + done 1.158 + 1.159 + echo "++ creating new database directory $l_prefix/var/postgresql/db/" 1.160 + mkdir $l_prefix/var/postgresql/db 1.161 + chown ${l_rusr}:${l_rgrp} $l_prefix/var/postgresql/db 1.162 + chmod 700 $l_prefix/var/postgresql/db 1.163 + 1.164 + su - ${l_rusr} -c \ 1.165 + "LC_CTYPE=C; export LC_CTYPE; umask 022; \ 1.166 + echo $l_pgpass >$l_prefix/var/postgresql/run/pw; \ 1.167 + $l_prefix/bin/pg_initdb \ 1.168 + -U $l_pguser --pwfile=$l_prefix/var/postgresql/run/pw \ 1.169 + -D $l_prefix/var/postgresql/db; \ 1.170 + rm -f $l_prefix/var/postgresql/run/pw" 2>&1 |\ 1.171 + $l_prefix/lib/openpkg/shtool prop \ 1.172 + -p "++ creating new database data" 1.173 + 1.174 + echo "++ restoring database configurations" 1.175 + for conf in pg_hba.conf pg_ident.conf postgresql.conf; do 1.176 + cp -p $l_prefix/var/postgresql/db.old.1/$conf \ 1.177 + $l_prefix/var/postgresql/db/ 1.178 + done 1.179 + 1.180 + echo "++ enforcing full-superuser access policy" 1.181 + cp -p $l_prefix/var/postgresql/db/pg_hba.conf \ 1.182 + $l_prefix/var/postgresql/db/pg_hba.conf.orig 1.183 + ( echo "local all all trust" 1.184 + echo "host all all 127.0.0.1/32 trust" 1.185 + ) >$l_prefix/var/postgresql/db/pg_hba.conf 1.186 + 1.187 + if [ ".$epilog" = .start ]; then 1.188 + echo "++ starting database engine" 1.189 + else 1.190 + echo "++ temporarily starting database engine" 1.191 + fi 1.192 + $l_prefix/bin/openpkg rc postgresql start 1.193 + sleep 4 1.194 + 1.195 + echo "++ restoring all databases from $l_prefix/var/postgresql/db.dump.sql.bz2" 1.196 + $l_prefix/lib/openpkg/bzip2 -c -d \ 1.197 + $l_prefix/var/postgresql/db.dump.sql.bz2 |\ 1.198 + $l_prefix/bin/psql -U "$l_pguser" -d "$l_pgdata" 2>&1 |\ 1.199 + tee $l_prefix/var/postgresql/db.log |\ 1.200 + $l_prefix/lib/openpkg/shtool prop \ 1.201 + -p "++ restoring data (see $l_prefix/var/postgresql/db.log)" 1.202 + 1.203 + echo "++ restoring original access policy" 1.204 + cp -p $l_prefix/var/postgresql/db/pg_hba.conf.orig \ 1.205 + $l_prefix/var/postgresql/db/pg_hba.conf 1.206 + rm -f $l_prefix/var/postgresql/db/pg_hba.conf.orig 1.207 + 1.208 + if [ ".$epilog" = .start ]; then 1.209 + echo "++ reloading already running database engine" 1.210 + $l_prefix/bin/openpkg rc postgresql reload 1.211 + sleep 2 1.212 + else 1.213 + echo "++ stopping temporarily started database engine" 1.214 + $l_prefix/bin/openpkg rc postgresql stop 1.215 + sleep 4 1.216 + fi 1.217 + ;; 1.218 + * ) 1.219 + echo "$0:ERROR: unknown command \"$cmd\"" 1>&2 1.220 + exit 1 1.221 + ;; 1.222 +esac 1.223 +