mirror of
				https://github.com/postgres/postgres.git
				synced 2025-10-31 00:03:57 -04:00 
			
		
		
		
	Added utility script pg_dumpaccounts to contrib.
Derived from pg_dumpall it just dumps users and groups. Jan
This commit is contained in:
		
							parent
							
								
									1173809333
								
							
						
					
					
						commit
						94b8640cd9
					
				
							
								
								
									
										37
									
								
								contrib/pg_dumpaccounts/Makefile
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										37
									
								
								contrib/pg_dumpaccounts/Makefile
									
									
									
									
									
										Normal file
									
								
							| @ -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 | ||||
| 
 | ||||
							
								
								
									
										9
									
								
								contrib/pg_dumpaccounts/README
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										9
									
								
								contrib/pg_dumpaccounts/README
									
									
									
									
									
										Normal file
									
								
							| @ -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. | ||||
| 
 | ||||
							
								
								
									
										174
									
								
								contrib/pg_dumpaccounts/pg_dumpaccounts.sh
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										174
									
								
								contrib/pg_dumpaccounts/pg_dumpaccounts.sh
									
									
									
									
									
										Normal file
									
								
							| @ -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 <hostname>    server host name" | ||||
|     echo "  -p, --port <port>        server port number" | ||||
|     echo | ||||
|     echo "Report bugs to <pgsql-bugs@postgresql.org>." | ||||
|     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 | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user