- #!/bin/sh
-
- PSQL="/usr/bin/psql"
-
- free_megs() {
- fsdir=$1
- while [ ! -d "$fsdir" ]; do
- fsdir="$(dirname "$fsdir")"
- done
- df -m $fsdir | while read fs bl us av cap mnt; do [ "$av" = "Available" ] || echo $av; done
- }
-
- pg_init_data() {
- # make sure we got at least 50MB of free space
- [ $(free_megs "$1") -lt 50 ] && return 1
- pg_ctl initdb -U postgres -D "$1"
- }
-
- pg_server_ready() {
- t=0
- while [ $t -le 90 ]; do
- psql -h /var/run/postgresql/ -U postgres -c "\q" 1>/dev/null 2>/dev/null && return 0
- t=$((t+1))
- sleep 1
- done
- return 1
- }
-
-
- pg_test_db() {
- echo "SELECT datname FROM pg_catalog.pg_database WHERE datname = '$1';" |
- $PSQL -h /var/run/postgresql -w -U "postgres" -d "template1" -q |
- grep -q "0 rows" && return 1
-
- return 0
- }
-
- pg_include_sql() {
- if [ "$3" ]; then
- env PGPASSWORD="$3" $PSQL -h /var/run/postgresql -U "$2" -d "$1" -e -f "$4"
- return $?
- else
- $PSQL -w -h /var/run/postgresql -U "$2" -d "$1" -e -f "$4"
- return $?
- fi
- }
-
- # $1: dbname, $2: username, $3: password, $4: sql populate script
- pg_require_db() {
- local ret
- local dbname="$1"
- local dbuser="$2"
- local dbpass="$3"
- local exuser
-
- pg_test_db $@ && return 0
-
- shift ; shift ; shift
-
- echo "CREATE DATABASE $dbname;" |
- $PSQL -h /var/run/postgresql -U postgres -d template1 -e || return $?
-
- if [ "$dbuser" ]; then
- echo "SELECT usename FROM pg_catalog.pg_user WHERE usename = '$dbuser';" |
- $PSQL -h /var/run/postgresql -U postgres -d template1 -e | grep -q "0 rows" &&
- ( echo -n "CREATE USER $dbuser"
- [ "$dbpass" ] && echo -n " WITH PASSWORD '$dbpass'"
- echo " NOCREATEDB NOSUPERUSER NOCREATEROLE NOINHERIT;" ) |
- $PSQL -h /var/run/postgresql -U postgres -d template1 -e
-
- echo "GRANT ALL PRIVILEGES ON DATABASE \"$dbname\" TO $dbuser;" |
- $PSQL -h /var/run/postgresql -U postgres -d template1 -e
- fi
-
- while [ "$1" ]; do
- pg_include_sql "$dbname" "$dbuser" "$dbpass" "$1"
- ret=$?
- [ $ret != 0 ] && break
- shift
- done
-
- return $ret
- }
-
- uci_require_db() {
- local dbname dbuser dbpass dbscript
- config_get dbname $1 name
- config_get dbuser $1 user
- config_get dbpass $1 pass
- config_get dbscript $1 script
- pg_require_db "$dbname" "$dbuser" "$dbpass" $dbscript
- }
-
- [ "$1" = "init" ] && {
- . /lib/functions.sh
- pg_server_ready $2 || exit 1
- config_load postgresql
- config_foreach uci_require_db postgres-db
- }
|