head     1.1;
branch   ;
access   ;
symbols  ;
locks    ; strict;
comment  @# @;


1.1
date     91.05.02.03.15.57;  author kemnitz;  state Exp;
branches ;
next     ;


desc
@Deletes a Postgres user.
@



1.1
log
@Initial revision
@
text
@#!/bin/sh
# set -x
#
# $Header: RCS/deluser,v 1.12 91/03/20 19:10:05 kemnitz Exp $
#
# Note - this should NOT be setuid.
#

#
# let the monitor program parse the arguments...
#

MARGS="-TN $*"

#
# find monitor
# 

if (test ! -z "$POSTGRESHOME")
then
    MONITOR=/usr/postgres/bin/monitor
else
    MONITOR=$POSTGRESHOME/bin/monitor
fi

if (test ! -s "$MONITOR")
then
    echo "$0: $MONITOR does not exist - exiting..."
    exit 1
fi

#
# generate the first part of the actual monitor command
#

MONITOR="$MONITOR $MARGS"

#
# see if user $USER is allowed to create new users.  Only a user who can
# create users can delete them.
#

QUERY='retrieve (pg_user.usesuper) where pg_user.usename = '"\"$USER\""
ADDUSER=`$MONITOR -c "$QUERY" template1`

if (test $? -ne 0)
then
    echo "$0: database access failed."
    exit 1
fi

if (test $ADDUSER != "t")
then
    echo "$0: $USER cannot delete users."
fi

#
# get the user name of the user to delete.  Make sure it exists.
#

echo -n "Enter name of user to delete ---> "
read DELUSER

QUERY='retrieve (pg_user.usesysid) where pg_user.usename = '"\"$DELUSER\""

RES=`$MONITOR -c "$QUERY" template1`

if (test $? -ne 0)
then
    echo "$0: database access failed."
    exit 1
fi

if (test ! -n "$RES")
then
    echo "$0: user "\"$DELUSER\"" does not exist."
    exit 1
fi

SYSID=$RES

#
# destroy the databases owned by the deleted user.  First, use this query
# to find out what they are.
#

QUERY="retrieve (pg_database.datname) where \
	   pg_database.datdba = \"$SYSID\"::oid"

ALLDBS=`$MONITOR -c "$QUERY" template1`

if (test $? -ne 0)
then
	echo "$0: database access failed - exiting..."
	exit 1
fi


#
# don't try to delete template1!
#

for i in $ALLDBS
do
    if (test $i != "template1")
    then
        DBLIST="$DBLIST $i"
    fi
done

if (test -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 (test $yn != y -a $yn != n)
    do
        echo -n "Deleting user $DELUSER will destroy them. Continue (y/n)? "
        read yn
    done

    if (test $yn = n)
    then
        echo "$0: exiting"
        exit 1
    fi

	#
	# now actually destroy the databases
	#

    for i in $DBLIST
	do
		echo "destroying database $i"

		QUERY="destroydb $i"
		$MONITOR -c "$QUERY" template1
		if (test $? -ne 0)
		then
			echo "$0: destroydb on $i failed - exiting"
			exit 1
		fi
	done
fi

QUERY="delete pg_user where pg_user.usename = \"$DELUSER\""

$MONITOR -c "$QUERY" template1
if (test $? -ne 0)
then
	echo "$0: delete of user $DELUSER was UNSUCCESSFUL"
else
	echo "$0: delete of user $DELUSER was successful."
fi

exit 0
@
