Mon, 28 Jan 2013 17:37:18 +0100
Correct socket error reporting improvement with IPv6 portable code,
after helpful recommendation by Saúl Ibarra Corretgé on OSips devlist.
michael@300 | 1 | #!/bin/sh |
michael@300 | 2 | ## |
michael@300 | 3 | ## pg_migrate -- PostgreSQL Database Migration Utility |
michael@300 | 4 | ## Copyright (c) 2000-2007 OpenPKG Foundation e.V. <http://openpkg.net/> |
michael@300 | 5 | ## Copyright (c) 2000-2007 Ralf S. Engelschall <http://engelschall.com/> |
michael@300 | 6 | ## |
michael@300 | 7 | ## Permission to use, copy, modify, and distribute this software for |
michael@300 | 8 | ## any purpose with or without fee is hereby granted, provided that |
michael@300 | 9 | ## the above copyright notice and this permission notice appear in all |
michael@300 | 10 | ## copies. |
michael@300 | 11 | ## |
michael@300 | 12 | ## THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED |
michael@300 | 13 | ## WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF |
michael@300 | 14 | ## MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
michael@300 | 15 | ## IN NO EVENT SHALL THE AUTHORS AND COPYRIGHT HOLDERS AND THEIR |
michael@300 | 16 | ## CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, |
michael@300 | 17 | ## SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT |
michael@300 | 18 | ## LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF |
michael@300 | 19 | ## USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND |
michael@300 | 20 | ## ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, |
michael@300 | 21 | ## OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT |
michael@300 | 22 | ## OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF |
michael@300 | 23 | ## SUCH DAMAGE. |
michael@300 | 24 | ## |
michael@300 | 25 | |
michael@300 | 26 | # configuration |
michael@300 | 27 | l_prefix="@l_prefix@" |
michael@300 | 28 | l_rusr="@l_rusr@" |
michael@300 | 29 | l_rgrp="@l_rgrp@" |
michael@300 | 30 | |
michael@300 | 31 | # load superuser information |
michael@300 | 32 | l_pgdata="" |
michael@300 | 33 | l_pguser="" |
michael@300 | 34 | l_pgpass="" |
michael@300 | 35 | if [ ! -r $l_prefix/var/postgresql/db/pg_superuser.conf ]; then |
michael@300 | 36 | echo "$0:ERROR: unable to read file \"$l_prefix/var/postgresql/db/pg_superuser.conf\" (use pg_passwd(1) to create)" 1>&2 |
michael@300 | 37 | exit 1 |
michael@300 | 38 | fi |
michael@300 | 39 | eval `. $l_prefix/var/postgresql/db/pg_superuser.conf; \ |
michael@300 | 40 | echo l_pgdata=\"$superuser_database\"; \ |
michael@300 | 41 | echo l_pguser=\"$superuser_username\"; \ |
michael@300 | 42 | echo l_pgpass=\"$superuser_password\"` |
michael@300 | 43 | |
michael@300 | 44 | # establish sane environment |
michael@300 | 45 | LC_CTYPE=C |
michael@300 | 46 | export LC_CTYPE |
michael@300 | 47 | umask 022 |
michael@300 | 48 | |
michael@300 | 49 | # check command line |
michael@300 | 50 | if [ $# -ne 1 -a $# -ne 2 ]; then |
michael@300 | 51 | echo "$0:ERROR: invalid command line" 1>&2 |
michael@300 | 52 | echo "$0:USAGE: $0 dump|restore [<password>]" 1>&2 |
michael@300 | 53 | exit 1 |
michael@300 | 54 | fi |
michael@300 | 55 | cmd="$1"; shift |
michael@300 | 56 | if [ $# -eq 1 ]; then |
michael@300 | 57 | l_pgpass="$1"; shift |
michael@300 | 58 | fi |
michael@300 | 59 | |
michael@300 | 60 | # dispatch into commands |
michael@300 | 61 | case $cmd in |
michael@300 | 62 | dump ) |
michael@300 | 63 | echo "++ enforcing full-superuser access policy" |
michael@300 | 64 | cp -p $l_prefix/var/postgresql/db/pg_hba.conf \ |
michael@300 | 65 | $l_prefix/var/postgresql/db/pg_hba.conf.orig |
michael@300 | 66 | ( echo "local all all trust" |
michael@300 | 67 | echo "host all all 127.0.0.1/32 trust" |
michael@300 | 68 | ) >$l_prefix/var/postgresql/db/pg_hba.conf |
michael@300 | 69 | |
michael@300 | 70 | ( eval `${l_prefix}/bin/openpkg rc postgresql status 2>/dev/null` |
michael@300 | 71 | echo "postgresql_active=\"$postgresql_active\"" |
michael@300 | 72 | ) 2>/dev/null |
michael@300 | 73 | if [ ".$postgresql_active" = .yes ]; then |
michael@300 | 74 | echo "++ reloading already running database engine" |
michael@300 | 75 | $l_prefix/bin/openpkg rc postgresql reload |
michael@300 | 76 | sleep 2 |
michael@300 | 77 | epilog=reload |
michael@300 | 78 | else |
michael@300 | 79 | echo "++ temporarily starting database engine" |
michael@300 | 80 | $l_prefix/bin/openpkg rc postgresql start |
michael@300 | 81 | sleep 4 |
michael@300 | 82 | epilog=stop |
michael@300 | 83 | fi |
michael@300 | 84 | |
michael@300 | 85 | echo "++ rotating dump files $l_prefix/var/postgresql/db.dump*.sql.bz2" |
michael@300 | 86 | i=9 |
michael@300 | 87 | rm -f $l_prefix/var/postgresql/db.dump.$i.sql.bz2 >/dev/null 2>&1 || true |
michael@300 | 88 | while [ $i -gt 0 ]; do |
michael@300 | 89 | j=$i |
michael@300 | 90 | i=`expr $i - 1` |
michael@300 | 91 | if [ $i -eq 0 ]; then |
michael@300 | 92 | prev="$l_prefix/var/postgresql/db.dump.sql.bz2" |
michael@300 | 93 | next="$l_prefix/var/postgresql/db.dump.$j.sql.bz2" |
michael@300 | 94 | else |
michael@300 | 95 | prev="$l_prefix/var/postgresql/db.dump.$i.sql.bz2" |
michael@300 | 96 | next="$l_prefix/var/postgresql/db.dump.$j.sql.bz2" |
michael@300 | 97 | fi |
michael@300 | 98 | if [ -f $prev ]; then |
michael@300 | 99 | mv $prev $next |
michael@300 | 100 | fi |
michael@300 | 101 | done |
michael@300 | 102 | |
michael@300 | 103 | echo "++ dumping all databases into $l_prefix/var/postgresql/db.dump.sql.bz2" |
michael@300 | 104 | PGPASSWORD="$l_pgpass" \ |
michael@300 | 105 | $l_prefix/bin/pg_dumpall \ |
michael@300 | 106 | -U "$l_pguser" -o |\ |
michael@300 | 107 | $l_prefix/lib/openpkg/bzip2 -9 \ |
michael@300 | 108 | >$l_prefix/var/postgresql/db.dump.sql.bz2 |
michael@300 | 109 | chown ${l_rusr}:${l_rgrp} $l_prefix/var/postgresql/db.dump.sql.bz2 |
michael@300 | 110 | chmod 700 $l_prefix/var/postgresql/db.dump.sql.bz2 |
michael@300 | 111 | |
michael@300 | 112 | echo "++ restoring original access policy" |
michael@300 | 113 | cp -p $l_prefix/var/postgresql/db/pg_hba.conf.orig \ |
michael@300 | 114 | $l_prefix/var/postgresql/db/pg_hba.conf |
michael@300 | 115 | rm -f $l_prefix/var/postgresql/db/pg_hba.conf.orig |
michael@300 | 116 | |
michael@300 | 117 | if [ ".$epilog" = .reload ]; then |
michael@300 | 118 | echo "++ reloading already running database engine (again)" |
michael@300 | 119 | $l_prefix/bin/openpkg rc postgresql reload |
michael@300 | 120 | sleep 2 |
michael@300 | 121 | else |
michael@300 | 122 | echo "++ stopping temporarily started database engine" |
michael@300 | 123 | $l_prefix/bin/openpkg rc postgresql stop |
michael@300 | 124 | sleep 4 |
michael@300 | 125 | fi |
michael@300 | 126 | ;; |
michael@300 | 127 | |
michael@300 | 128 | restore ) |
michael@300 | 129 | if [ ".`$l_prefix/bin/openpkg rc postgresql status 2>&1 | grep 'is running'`" != . ]; then |
michael@300 | 130 | echo "++ stopping already running database engine" |
michael@300 | 131 | $l_prefix/bin/openpkg rc postgresql stop |
michael@300 | 132 | sleep 2 |
michael@300 | 133 | epilog=start |
michael@300 | 134 | else |
michael@300 | 135 | epilog=none |
michael@300 | 136 | fi |
michael@300 | 137 | |
michael@300 | 138 | echo "++ rotating database directories $l_prefix/var/postgresql/db.old*/" |
michael@300 | 139 | i=9 |
michael@300 | 140 | rm -rf $l_prefix/var/postgresql/db.old.$i >/dev/null 2>&1 || true |
michael@300 | 141 | while [ $i -gt 0 ]; do |
michael@300 | 142 | j=$i |
michael@300 | 143 | i=`expr $i - 1` |
michael@300 | 144 | if [ $i -eq 0 ]; then |
michael@300 | 145 | prev="$l_prefix/var/postgresql/db" |
michael@300 | 146 | next="$l_prefix/var/postgresql/db.old.$j" |
michael@300 | 147 | else |
michael@300 | 148 | prev="$l_prefix/var/postgresql/db.old.$i" |
michael@300 | 149 | next="$l_prefix/var/postgresql/db.old.$j" |
michael@300 | 150 | fi |
michael@300 | 151 | if [ -d $prev ]; then |
michael@300 | 152 | mv $prev $next |
michael@300 | 153 | fi |
michael@300 | 154 | done |
michael@300 | 155 | |
michael@300 | 156 | echo "++ creating new database directory $l_prefix/var/postgresql/db/" |
michael@300 | 157 | mkdir $l_prefix/var/postgresql/db |
michael@300 | 158 | chown ${l_rusr}:${l_rgrp} $l_prefix/var/postgresql/db |
michael@300 | 159 | chmod 700 $l_prefix/var/postgresql/db |
michael@300 | 160 | |
michael@300 | 161 | su - ${l_rusr} -c \ |
michael@300 | 162 | "LC_CTYPE=C; export LC_CTYPE; umask 022; \ |
michael@300 | 163 | echo $l_pgpass >$l_prefix/var/postgresql/run/pw; \ |
michael@300 | 164 | $l_prefix/bin/pg_initdb \ |
michael@300 | 165 | -U $l_pguser --pwfile=$l_prefix/var/postgresql/run/pw \ |
michael@300 | 166 | -D $l_prefix/var/postgresql/db; \ |
michael@300 | 167 | rm -f $l_prefix/var/postgresql/run/pw" 2>&1 |\ |
michael@300 | 168 | $l_prefix/lib/openpkg/shtool prop \ |
michael@300 | 169 | -p "++ creating new database data" |
michael@300 | 170 | |
michael@300 | 171 | echo "++ restoring database configurations" |
michael@300 | 172 | for conf in pg_hba.conf pg_ident.conf postgresql.conf; do |
michael@300 | 173 | cp -p $l_prefix/var/postgresql/db.old.1/$conf \ |
michael@300 | 174 | $l_prefix/var/postgresql/db/ |
michael@300 | 175 | done |
michael@300 | 176 | |
michael@300 | 177 | echo "++ enforcing full-superuser access policy" |
michael@300 | 178 | cp -p $l_prefix/var/postgresql/db/pg_hba.conf \ |
michael@300 | 179 | $l_prefix/var/postgresql/db/pg_hba.conf.orig |
michael@300 | 180 | ( echo "local all all trust" |
michael@300 | 181 | echo "host all all 127.0.0.1/32 trust" |
michael@300 | 182 | ) >$l_prefix/var/postgresql/db/pg_hba.conf |
michael@300 | 183 | |
michael@300 | 184 | if [ ".$epilog" = .start ]; then |
michael@300 | 185 | echo "++ starting database engine" |
michael@300 | 186 | else |
michael@300 | 187 | echo "++ temporarily starting database engine" |
michael@300 | 188 | fi |
michael@300 | 189 | $l_prefix/bin/openpkg rc postgresql start |
michael@300 | 190 | sleep 4 |
michael@300 | 191 | |
michael@300 | 192 | echo "++ restoring all databases from $l_prefix/var/postgresql/db.dump.sql.bz2" |
michael@300 | 193 | $l_prefix/lib/openpkg/bzip2 -c -d \ |
michael@300 | 194 | $l_prefix/var/postgresql/db.dump.sql.bz2 |\ |
michael@300 | 195 | $l_prefix/bin/psql -U "$l_pguser" -d "$l_pgdata" 2>&1 |\ |
michael@300 | 196 | tee $l_prefix/var/postgresql/db.log |\ |
michael@300 | 197 | $l_prefix/lib/openpkg/shtool prop \ |
michael@300 | 198 | -p "++ restoring data (see $l_prefix/var/postgresql/db.log)" |
michael@300 | 199 | |
michael@300 | 200 | echo "++ restoring original access policy" |
michael@300 | 201 | cp -p $l_prefix/var/postgresql/db/pg_hba.conf.orig \ |
michael@300 | 202 | $l_prefix/var/postgresql/db/pg_hba.conf |
michael@300 | 203 | rm -f $l_prefix/var/postgresql/db/pg_hba.conf.orig |
michael@300 | 204 | |
michael@300 | 205 | if [ ".$epilog" = .start ]; then |
michael@300 | 206 | echo "++ reloading already running database engine" |
michael@300 | 207 | $l_prefix/bin/openpkg rc postgresql reload |
michael@300 | 208 | sleep 2 |
michael@300 | 209 | else |
michael@300 | 210 | echo "++ stopping temporarily started database engine" |
michael@300 | 211 | $l_prefix/bin/openpkg rc postgresql stop |
michael@300 | 212 | sleep 4 |
michael@300 | 213 | fi |
michael@300 | 214 | ;; |
michael@300 | 215 | * ) |
michael@300 | 216 | echo "$0:ERROR: unknown command \"$cmd\"" 1>&2 |
michael@300 | 217 | exit 1 |
michael@300 | 218 | ;; |
michael@300 | 219 | esac |
michael@300 | 220 |