#!/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 pg_ctl status -U postgres -D $1 2>/dev/null >/dev/null && return 0 t=$((t+1)) sleep 1 done return 1 } pg_test_db() { if [ "$3" ]; then echo "SHOW ALL;" | env PGPASSWORD="$3" $PSQL -U "$2" -d "$1" -q 2>/dev/null >/dev/null return $? else echo "SHOW ALL;" | $PSQL -w -U "$2" -d "$1" -q 2>/dev/null >/dev/null return $? fi } pg_include_sql() { if [ "$3" ]; then env PGPASSWORD="$3" $PSQL -U "$2" -d "$1" -e -f "$4" return $? else $PSQL -w -U "$2" -d "$1" -e -f "$4" return $? fi } # $1: dbname, $2: username, $3: password, $4: sql populate script pg_require_db() { local ret pg_test_db $@ && return 0 ( echo "CREATE DATABASE $1;" echo -n "CREATE USER $2" [ "$3" ] && echo -n " WITH PASSWORD '$3'" echo " NOCREATEDB NOSUPERUSER NOCREATEROLE NOINHERIT;" echo "GRANT ALL PRIVILEGES ON DATABASE \"$1\" TO $2;" ) | $PSQL -U postgres -d template1 -e ret=$? [ "$ret" = "0" ] || return $ret if [ "$4" ]; then pg_include_sql "$@" ret=$? fi 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 }