diff --git a/contrib/pg_dumpaccounts/Makefile b/contrib/pg_dumpaccounts/Makefile new file mode 100644 index 0000000000..edaebff38e --- /dev/null +++ b/contrib/pg_dumpaccounts/Makefile @@ -0,0 +1,37 @@ +#------------------------------------------------------------------------- +# +# Makefile for contrib/pg_dumpaccounts +# +# Copyright (c) 1994, Regents of the University of California +# +# $Header: /cvsroot/pgsql/contrib/pg_dumpaccounts/Attic/Makefile,v 1.2 2000/11/02 18:20:12 wieck Exp $ +# +#------------------------------------------------------------------------- + +subdir = contrib/pg_dumpaccounts +top_builddir = ../.. +include $(top_builddir)/src/Makefile.global + +all: pg_dumpaccounts + +pg_dumpaccounts: pg_dumpaccounts.sh + sed -e 's,@VERSION@,$(VERSION),g' \ + -e 's,@MULTIBYTE@,$(MULTIBYTE),g' \ + -e 's,@bindir@,$(bindir),g' \ + $< >$@ + chmod a+x $@ + +install: all installdirs + $(INSTALL_SCRIPT) pg_dumpaccounts $(DESTDIR)$(bindir)/pg_dumpaccounts + +installdirs: + $(mkinstalldirs) $(DESTDIR)$(bindir) + +uninstall: + rm -f $(addprefix $(DESTDIR)$(bindir)/, pg_dumpaccounts) + +depend dep: + +clean distclean maintainer-clean: + rm -f pg_dumpaccounts + diff --git a/contrib/pg_dumpaccounts/README b/contrib/pg_dumpaccounts/README new file mode 100644 index 0000000000..348129934f --- /dev/null +++ b/contrib/pg_dumpaccounts/README @@ -0,0 +1,9 @@ +pg_dumpaccounts + +This is a little utility script derived from pg_dumpall. It just +dumps the global pg_shadow and pg_group as pg_dumpall does without +dumping any of the databases. This is useful for installations +that have many databases with different backup schedules, where +pg_dumpall will never be run and thus, the users and groups will +never be backed up. + diff --git a/contrib/pg_dumpaccounts/pg_dumpaccounts.sh b/contrib/pg_dumpaccounts/pg_dumpaccounts.sh new file mode 100644 index 0000000000..61fe189930 --- /dev/null +++ b/contrib/pg_dumpaccounts/pg_dumpaccounts.sh @@ -0,0 +1,174 @@ +#! /bin/sh + +# pg_dumpaccounts +# +# Dumps the "pg_shadow" and "pg_group" tables, which belong to the +# whole installation rather than any one individual database. +# +# $Header: /cvsroot/pgsql/contrib/pg_dumpaccounts/Attic/pg_dumpaccounts.sh,v 1.1 2000/11/02 18:20:12 wieck Exp $ + +CMDNAME=`basename $0` + +# substituted at build +VERSION='@VERSION@' +MULTIBYTE='@MULTIBYTE@' +bindir='@bindir@' + +# +# Find out where we're located +# +PGPATH= +if echo "$0" | grep '/' > /dev/null 2>&1 ; then + # explicit dir name given + PGPATH=`echo $0 | sed 's,/[^/]*$,,'` # (dirname command is not portable) +else + # look for it in PATH ('which' command is not portable) + for dir in `echo "$PATH" | sed 's/:/ /g'` ; do + # empty entry in path means current dir + [ x"$dir" = x ] && dir='.' + if [ -f "$dir/$CMDNAME" ] ; then + PGPATH="$dir" + break + fi + done +fi + +# As last resort use the installation directory. We don't want to use +# this as first resort because depending on how users do release upgrades +# they might temporarily move the installation tree elsewhere, so we'd +# accidentally invoke the newly installed versions of pg_dump and psql. +if [ x"$PGPATH" = x"" ]; then + PGPATH=$bindir +fi + +# +# Look for needed programs +# +for prog in psql ; do + if [ ! -x "$PGPATH/$prog" ] ; then + echo "The program $prog needed by $CMDNAME could not be found. It was" + echo "expected at:" + echo " $PGPATH/$prog" + echo "If this is not the correct directory, please start $CMDNAME" + echo "with a full search path. Otherwise make sure that the program" + echo "was installed successfully." + exit 1 + fi +done + +# +# to adapt to System V vs. BSD 'echo' +# +if echo '\\' | grep '\\\\' >/dev/null 2>&1 +then + BS='\' dummy='\' # BSD +else + BS='\\' # System V +fi +# The dummy assignment is necessary to prevent Emacs' font-lock +# mode from going ballistic when editing this file. + + +usage= + +# +# Scan options. We're interested in the -h (host) and -p (port) options. +# +while [ $# -gt 0 ] ; do + case $1 in + --help) + usage=t + break + ;; + --version) + echo "pg_dumpaccounts (PostgreSQL) $VERSION" + exit 0 + ;; + --host|-h) + connectopts="$connectopts -h $2" + shift + ;; + -h*) + connectopts="$connectopts $1" + ;; + --host=*) + connectopts="$connectopts -h "`echo $1 | sed 's/^--host=//'` + ;; + --port|-p) + connectopts="$connectopts -p $2" + shift + ;; + -p*) + connectopts="$connectopts $1" + ;; + --port=*) + connectopts="$connectopts -p "`echo $1 | sed 's/^--port=//'` + ;; + *) + echo "unknown option '$1'" + usage=t + ;; + esac + shift +done + + +if [ "$usage" ] ; then + echo "$CMDNAME dumps users and groups of a PostgreSQL database cluster." + echo + echo "Usage:" + echo " $CMDNAME [ -c ] [ -h host ] [ -p port ]" + echo + echo "Options:" + echo " -h, --host server host name" + echo " -p, --port server port number" + echo + echo "Report bugs to ." + exit 0 +fi + + +PSQL="${PGPATH}/psql $connectopts" + + +echo "--" +echo "-- pg_dumpaccounts ($VERSION) $connectopts" +echo "--" +echo "${BS}connect template1" + +# +# Dump users (but not the user created by initdb) +# +echo "DELETE FROM pg_shadow WHERE usesysid NOT IN (SELECT datdba FROM pg_database WHERE datname = 'template1');" +echo + +$PSQL -d template1 -At <<__END__ +SELECT + 'CREATE USER "' || usename || '" WITH SYSID ' || usesysid + || CASE WHEN passwd IS NOT NULL THEN ' PASSWORD ''' || passwd || '''' else '' end + || CASE WHEN usecreatedb THEN ' CREATEDB'::text ELSE ' NOCREATEDB' END + || CASE WHEN usesuper THEN ' CREATEUSER'::text ELSE ' NOCREATEUSER' END + || CASE WHEN valuntil IS NOT NULL THEN ' VALID UNTIL '''::text + || CAST(valuntil AS TIMESTAMP) || '''' ELSE '' END || ';' +FROM pg_shadow +WHERE usesysid <> (SELECT datdba FROM pg_database WHERE datname = 'template1'); +__END__ +echo + +# +# Dump groups +# +echo "DELETE FROM pg_group;" +echo + +$PSQL -d template1 -At -F ' ' -c 'SELECT * FROM pg_group;' | \ +while read GRONAME GROSYSID GROLIST ; do + echo "CREATE GROUP \"$GRONAME\" WITH SYSID ${GROSYSID};" + raw_grolist=`echo "$GROLIST" | sed 's/^{\(.*\)}$/\1/' | tr ',' ' '` + for userid in $raw_grolist ; do + username=`$PSQL -d template1 -At -c "SELECT usename FROM pg_shadow WHERE usesysid = ${userid};"` + echo " ALTER GROUP \"$GRONAME\" ADD USER \"$username\";" + done +done + +exit 0