postgis/extras/template_gis/postgres_lib.sh.in
2006-05-31 06:43:12 +00:00

126 lines
4.5 KiB
Bash

#!/bin/sh
SUDO_OTHERUSER="su $DBAUSER"
SUDO_SAMEUSER="$SHELL"
function sudo_dba()
{
if [ "$USER" != "$DBAUSER" ]; then
ISDBASYSUSER=`cat /etc/passwd | awk -F : '{print $1}' | grep ^$DBAUSER$`
if [ ! "$ISDBASYSUSER" = "$DBAUSER" ]; then
echo "$DBAUSER is not a system user on `hostname`."
echo "support for remote servers not implemented yet."
exit 1
fi
SUDO=$SUDO_OTHERUSER
if [ ! "$USER" = "root" ]; then
echo "you will be prompted for the system password for $DBAUSER,"
echo "even more than once."
fi
else
SUDO=$SUDO_SAMEUSER
fi
}
function wrong_cluster()
{
if [ -n "`dpkg-query -W postgresql-common`" ]; then
echo "in case you meant another cluster, please specify it explicitly."
echo "see pwrapper(1)."
fi
}
#for the following functions, $USER is expected to be $DBAUSER, as set before
function check_dba()
{
DBAUSER=$1
if [ ! "$DBAUSER" = "$USER" ]; then
echo "you are not working as $DBAUSER".
echo "you may be not allowed to do so (maybe wrong password)."
exit 1
fi
ISDBAPGUSER=`psql -At -d template1 -c "select usename from pg_user where usesuper = true and usename = '$DBAUSER';" 2>&1`
if [ ! "$ISDBAPGUSER" = "$DBAUSER" ]; then
MAYPOSTGRES=`psql -l`
if [ -z "$MAYPOSTGRES" ]; then
echo "either postgresql $PGCLUSTER is not running,"
echo "or $DBAUSER doesn't have privileges on cluster $PGCLUSTER."
wrong_cluster
exit 1
fi
echo "dba or cluster $PGCLUSTER owner privileges are needed for this operation."
echo "$DBAUSER doesn't have dba or cluster $PGCLUSTER owner privileges."
echo "you may specify a dba that you are allowed to use his/her name (try --help)."
wrong_cluster
exit 1
fi
}
function template_rm()
{
TDB=$1
db_update=`psql -d template1 -c "UPDATE pg_database SET datistemplate = FALSE WHERE datname = '$TDB';" 2>&1`
if [ "$db_update" = "UPDATE 1" ]; then
dropdb $TDB 2>&1 | cat > /dev/null
else
echo "$TDB could not be accessed. it may not exist"
fi
}
#environment variables used:
#$SCRIPTS=spaces separated list of sql scripts to load into new template db
#$GRTABLES=spaces separated list of tables to be granted access to $GRUSER
function template_mk()
{
TDB=$1
GRUSER=$2
#of course it could be better to create as the $GRUSER where system user
db_create=`createdb $TDB 2>&1`
if [ "$db_create" = "CREATE DATABASE" ]; then
GRID=`psql -d template1 -At -c "select usesysid from pg_user where usename='$GRUSER';"`
if [ -n "$GRID" ]; then
psql -d $TDB -c "UPDATE pg_database SET datdba = $GRID WHERE datname = '$TDB';" 2>&1 | cat > /dev/null
fi
if [ -x @bindir@/createlang ]; then
@bindir@/createlang plpgsql $TDB 2>&1 | cat > /dev/null
fi
for script in $SCRIPTS ; do
psql -d $TDB -f $script 2>&1 | cat > /dev/null
done
#pseudo tables for postgresql 7.2 and 7.4. feel free to add more, for other postgresql versions
PSEUDO_TABLES="'pg_xactlock', 'sql_features', 'sql_implementation_info', 'sql_languages',
'sql_packages', 'sql_sizing', 'sql_sizing_profiles'"
TABLES=`psql -d $TDB -At -c "select tablename from pg_tables where tablename not in ($PSEUDO_TABLES);"`
if [ -n "$GRID" ]; then
for table in $TABLES ; do
psql -d $TDB -c "alter table $table owner to $GRUSER;" 2>&1 | cat > /dev/null
done
psql -d $TDB -c "update pg_class set relowner=$GRID where relkind = 'S';" 2>&1 | cat > /dev/null
else #maybe public, or group
for grtable in $GRTABLES ; do
psql -d $TDB -c "grant all privileges on table $grtable to $GRUSER;" 2>&1 | cat > /dev/null
done
fi
for grschema in $GRSCHEMAS ; do
psql -d $TDB -c "alter schema $grschema owner to $GRUSER;" 2>&1 | cat > /dev/null
psql -d $TDB -c "grant all privileges on schema $grschema to $GRUSER;" 2>&1 | cat > /dev/null
STABLES=`psql -d $TDB -At -c "select tablename from pg_tables where schemaname = '$grschema';"`
if [ -n "$GRID" ]; then
for table in $STABLES ; do
psql -d $TDB -c "alter table $grschema.$table owner to $GRUSER;" 2>&1 | cat > /dev/null
done
else #maybe public, or group
for grtable in $GRTABLES ; do #contain specific schema
psql -d $TDB -c "grant all privileges on table $grtable to $GRUSER;" 2>&1 | cat > /dev/null
done
fi
done
psql -d $TDB -c "VACUUM FULL;" 2>&1 | cat > /dev/null
psql -d $TDB -c "VACUUM FREEZE;" 2>&1 | cat > /dev/null
psql -d $TDB -c "UPDATE pg_database SET datistemplate = TRUE WHERE datname = '$TDB';" 2>&1 | cat > /dev/null
psql -d $TDB -c "UPDATE pg_database SET datallowconn = FALSE WHERE datname = '$TDB';" 2>&1 | cat > /dev/null
else
echo "$db_create"
fi
}