#!/bin/sh #------------------------------------------------------------------------- # # destroyuser.sh-- # utility for destroying a user from the POSTGRES database. # # Copyright (c) 1994, Regents of the University of California # # # IDENTIFICATION # $Header: /cvsroot/pgsql/src/bin/destroyuser/Attic/destroyuser.sh,v 1.11 1999/03/14 16:00:55 momjian Exp $ # # Note - this should NOT be setuid. # #------------------------------------------------------------------------- CMDNAME=`basename $0` if [ -z "$USER" ]; then if [ -z "$LOGNAME" ]; then if [ -z "`whoami`" ]; then echo "$CMDNAME: cannot determine user name" exit 1 fi else USER=$LOGNAME export USER fi fi while (test -n "$1") do case $1 in -a) AUTHSYS=$2; shift;; -h) PGHOST=$2; shift;; -p) PGPORT=$2; shift;; *) DELUSER=$1;; esac shift; done if [ -z "$AUTHSYS" ]; then AUTHOPT="" else AUTHOPT="-a $AUTHSYS" fi if [ -z "$PGHOST" ]; then PGHOSTOPT="" else PGHOSTOPT="-h $PGHOST" fi if [ -z "$PGPORT" ]; then PGPORTOPT="" else PGPORTOPT="-p $PGPORT" fi PARGS="-tq $AUTHOPT $PGHOSTOPT $PGPORTOPT" # # generate the first part of the actual monitor command # PSQL="psql $PARGS" # # see if user $USER is allowed to create new users. Only a user who can # create users can delete them. # QUERY="select usesuper from pg_user where usename = '$USER'" ADDUSER=`$PSQL -c "$QUERY" template1` if [ $? -ne 0 ] then echo "$CMDNAME: database access failed." exit 1 fi if [ x$ADDUSER != xt ] then echo "$CMDNAME: $USER cannot delete users." exit 1 fi # # get the user name of the user to delete. Make sure it exists. # if [ -z "$DELUSER" ] then echo PG_OPT_DASH_N_PARAM "Enter name of user to delete ---> PG_OPT_BACKSLASH_C_PARAM" read DELUSER fi QUERY="select usesysid from pg_user where usename = '$DELUSER'" RES=`$PSQL -c "$QUERY" template1` if [ $? -ne 0 ] then echo "$CMDNAME: database access failed." exit 1 fi if [ ! -n "$RES" ] then echo "$CMDNAME: user "\"$DELUSER\"" does not exist." exit 1 fi SYSID=`echo $RES | sed 's/ //g'` # # destroy the databases owned by the deleted user. First, use this query # to find out what they are. # QUERY="select datname from pg_database where datdba = '$SYSID'::oid" ALLDBS=`$PSQL -c "$QUERY" template1` if [ $? -ne 0 ] then echo "$CMDNAME: database access failed - exiting..." exit 1 fi # # don't try to delete template1! # for i in $ALLDBS do if [ $i != "template1" ] then DBLIST="$DBLIST $i" fi done if [ -n "$DBLIST" ] then echo "User $DELUSER owned the following databases:" echo $DBLIST echo # # Now we warn the DBA that deleting this user will destroy a bunch of databases # yn=f while [ "$yn" != y -a "$yn" != n ] do echo PG_OPT_DASH_N_PARAM "Deleting user $DELUSER will destroy them. Continue (y/n)? PG_OPT_BACKSLASH_C_PARAM" read yn done if [ $yn = n ] then echo "$CMDNAME: exiting" exit 1 fi # # now actually destroy the databases # for i in $DBLIST do echo "destroying database $i" QUERY="drop database $i" $PSQL -c "$QUERY" template1 if [ $? -ne 0 ] then echo "$CMDNAME: drop database on $i failed - exiting" exit 1 fi done fi QUERY="delete from pg_shadow where usename = '$DELUSER'" $PSQL -c "$QUERY" template1 if [ $? -ne 0 ] then echo "$CMDNAME: delete of user $DELUSER was UNSUCCESSFUL" else echo "$CMDNAME: delete of user $DELUSER was successful." fi exit 0